diff --git a/.github/workflows/build_android.yml b/.github/workflows/build_android.yml index 2c99ad118..568b4f35e 100644 --- a/.github/workflows/build_android.yml +++ b/.github/workflows/build_android.yml @@ -1,21 +1,36 @@ name: Build Android on: [push, pull_request] +env: + DOTNET_NOLOGO: true + DOTNET_CLI_TELEMETRY_OPTOUT: false + jobs: # Game game-windows: name: Game (Android, Release ARM64) - runs-on: "windows-2019" + runs-on: "windows-2022" steps: - name: Checkout repo uses: actions/checkout@v3 - name: Setup Vulkan uses: ./.github/actions/vulkan + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Setup .NET Workload + run: | + dotnet workload install android + - name: Print .NET info + run: | + dotnet --info + dotnet workload --info - name: Checkout LFS run: | git lfs version git lfs pull - name: Build run: | - .\Development\Scripts\Windows\CallBuildTool.bat -build -log -arch=ARM64 -platform=Android -configuration=Release -buildtargets=FlaxGame + .\Development\Scripts\Windows\CallBuildTool.bat -build -log -printSDKs -arch=ARM64 -platform=Android -configuration=Release -buildtargets=FlaxGame diff --git a/.github/workflows/build_ios.yml b/.github/workflows/build_ios.yml new file mode 100644 index 000000000..f4b5d8147 --- /dev/null +++ b/.github/workflows/build_ios.yml @@ -0,0 +1,36 @@ +name: Build iOS +on: [push, pull_request] + +env: + DOTNET_NOLOGO: true + DOTNET_CLI_TELEMETRY_OPTOUT: false + +jobs: + + # Game + game-windows: + name: Game (iOS, Release ARM64) + runs-on: "macos-latest" + steps: + - name: Checkout repo + uses: actions/checkout@v3 + - name: Setup Vulkan + uses: ./.github/actions/vulkan + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Setup .NET Workload + run: | + dotnet workload install ios + - name: Print .NET info + run: | + dotnet --info + dotnet workload --info + - name: Checkout LFS + run: | + git lfs version + git lfs pull + - name: Build + run: | + ./Development/Scripts/Mac/CallBuildTool.sh -build -log -arch=ARM64 -platform=iOS -configuration=Release -buildtargets=FlaxGame diff --git a/.github/workflows/build_linux.yml b/.github/workflows/build_linux.yml index a860010fd..bd1726737 100644 --- a/.github/workflows/build_linux.yml +++ b/.github/workflows/build_linux.yml @@ -1,6 +1,10 @@ name: Build Linux on: [push, pull_request] +env: + DOTNET_NOLOGO: true + DOTNET_CLI_TELEMETRY_OPTOUT: false + jobs: # Editor @@ -18,13 +22,21 @@ jobs: sudo apt-get install libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev - name: Setup Vulkan uses: ./.github/actions/vulkan + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Print .NET info + run: | + dotnet --info + dotnet workload --info - name: Checkout LFS run: | git lfs version git lfs pull - name: Build run: | - ./Development/Scripts/Linux/CallBuildTool.sh -build -log -arch=x64 -platform=Linux -configuration=Development -buildtargets=FlaxEditor + ./Development/Scripts/Linux/CallBuildTool.sh -build -log -printSDKs -arch=x64 -platform=Linux -configuration=Development -buildtargets=FlaxEditor # Game game-linux: @@ -38,10 +50,18 @@ jobs: sudo apt-get install libx11-dev libxcursor-dev libxinerama-dev - name: Setup Vulkan uses: ./.github/actions/vulkan + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Print .NET info + run: | + dotnet --info + dotnet workload --info - name: Checkout LFS run: | git lfs version git lfs pull - name: Build run: | - ./Development/Scripts/Linux/CallBuildTool.sh -build -log -arch=x64 -platform=Linux -configuration=Release -buildtargets=FlaxGame + ./Development/Scripts/Linux/CallBuildTool.sh -build -log -printSDKs -arch=x64 -platform=Linux -configuration=Release -buildtargets=FlaxGame diff --git a/.github/workflows/build_mac.yml b/.github/workflows/build_mac.yml index 33e2668ae..88cb9b7a8 100644 --- a/.github/workflows/build_mac.yml +++ b/.github/workflows/build_mac.yml @@ -1,6 +1,10 @@ name: Build macOS on: [push, pull_request] +env: + DOTNET_NOLOGO: true + DOTNET_CLI_TELEMETRY_OPTOUT: false + jobs: # Editor @@ -12,13 +16,21 @@ jobs: uses: actions/checkout@v3 - name: Setup Vulkan uses: ./.github/actions/vulkan + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Print .NET info + run: | + dotnet --info + dotnet workload --info - name: Checkout LFS run: | git lfs version git lfs pull - name: Build run: | - ./Development/Scripts/Mac/CallBuildTool.sh -build -log -arch=x64 -platform=Mac -configuration=Development -buildtargets=FlaxEditor + ./Development/Scripts/Mac/CallBuildTool.sh -build -log -printSDKs -arch=x64 -platform=Mac -configuration=Development -buildtargets=FlaxEditor # Game game-mac: @@ -29,10 +41,18 @@ jobs: uses: actions/checkout@v3 - name: Setup Vulkan uses: ./.github/actions/vulkan + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Print .NET info + run: | + dotnet --info + dotnet workload --info - name: Checkout LFS run: | git lfs version git lfs pull - name: Build run: | - ./Development/Scripts/Mac/CallBuildTool.sh -build -log -arch=x64 -platform=Mac -configuration=Release -buildtargets=FlaxGame + ./Development/Scripts/Mac/CallBuildTool.sh -build -log -printSDKs -arch=x64 -platform=Mac -configuration=Release -buildtargets=FlaxGame diff --git a/.github/workflows/build_windows.yml b/.github/workflows/build_windows.yml index ac88b30f4..513cbfd08 100644 --- a/.github/workflows/build_windows.yml +++ b/.github/workflows/build_windows.yml @@ -1,38 +1,58 @@ name: Build Windows on: [push, pull_request] +env: + DOTNET_NOLOGO: true + DOTNET_CLI_TELEMETRY_OPTOUT: false + jobs: # Editor editor-windows: name: Editor (Windows, Development x64) - runs-on: "windows-2019" + runs-on: "windows-2022" steps: - name: Checkout repo uses: actions/checkout@v3 - name: Setup Vulkan uses: ./.github/actions/vulkan + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Print .NET info + run: | + dotnet --info + dotnet workload --info - name: Checkout LFS run: | git lfs version git lfs pull - name: Build run: | - .\Development\Scripts\Windows\CallBuildTool.bat -build -log -arch=x64 -platform=Windows -configuration=Development -buildtargets=FlaxEditor + .\Development\Scripts\Windows\CallBuildTool.bat -build -log -printSDKs -arch=x64 -platform=Windows -configuration=Development -buildtargets=FlaxEditor # Game game-windows: name: Game (Windows, Release x64) - runs-on: "windows-2019" + runs-on: "windows-2022" steps: - name: Checkout repo uses: actions/checkout@v3 - name: Setup Vulkan uses: ./.github/actions/vulkan + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Print .NET info + run: | + dotnet --info + dotnet workload --info - name: Checkout LFS run: | git lfs version git lfs pull - name: Build run: | - .\Development\Scripts\Windows\CallBuildTool.bat -build -log -arch=x64 -platform=Windows -configuration=Release -buildtargets=FlaxGame + .\Development\Scripts\Windows\CallBuildTool.bat -build -log -printSDKs -arch=x64 -platform=Windows -configuration=Release -buildtargets=FlaxGame diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index d5149a652..a5d8bc043 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -4,12 +4,16 @@ on: - cron: '15 4 * * *' workflow_dispatch: +env: + DOTNET_NOLOGO: true + DOTNET_CLI_TELEMETRY_OPTOUT: false + jobs: # Windows package-windows-editor: name: Editor (Windows) - runs-on: "windows-2019" + runs-on: "windows-2022" steps: - name: Checkout repo uses: actions/checkout@v3 @@ -19,6 +23,14 @@ jobs: git lfs pull - name: Setup Vulkan uses: ./.github/actions/vulkan + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Print .NET info + run: | + dotnet --info + dotnet workload --info - name: Build run: | .\PackageEditor.bat -arch=x64 -platform=Windows -deployOutput=Output @@ -34,7 +46,7 @@ jobs: path: Output/EditorDebugSymbols.zip package-windows-game: name: Game (Windows) - runs-on: "windows-2019" + runs-on: "windows-2022" steps: - name: Checkout repo uses: actions/checkout@v3 @@ -44,6 +56,14 @@ jobs: git lfs pull - name: Setup Vulkan uses: ./.github/actions/vulkan + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Print .NET info + run: | + dotnet --info + dotnet workload --info - name: Build run: | .\PackagePlatforms.bat -arch=x64 -platform=Windows -deployOutput=Output @@ -72,6 +92,14 @@ jobs: sudo apt-get install libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev - name: Setup Vulkan uses: ./.github/actions/vulkan + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Print .NET info + run: | + dotnet --info + dotnet workload --info - name: Build run: | ./PackageEditor.sh -arch=x64 -platform=Linux -deployOutput=Output @@ -98,6 +126,14 @@ jobs: sudo apt-get install libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev - name: Setup Vulkan uses: ./.github/actions/vulkan + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Print .NET info + run: | + dotnet --info + dotnet workload --info - name: Build run: | ./PackagePlatforms.sh -arch=x64 -platform=Linux -deployOutput=Output @@ -120,6 +156,14 @@ jobs: git lfs pull - name: Setup Vulkan uses: ./.github/actions/vulkan + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Print .NET info + run: | + dotnet --info + dotnet workload --info - name: Build run: | ./PackageEditor.command -arch=x64 -platform=Mac -deployOutput=Output @@ -140,6 +184,14 @@ jobs: git lfs pull - name: Setup Vulkan uses: ./.github/actions/vulkan + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Print .NET info + run: | + dotnet --info + dotnet workload --info - name: Build run: | ./PackagePlatforms.command -arch=x64 -platform=Mac -deployOutput=Output diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 6cbe46bfe..f9d18bcfc 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -1,6 +1,10 @@ name: Tests on: [push, pull_request] +env: + DOTNET_NOLOGO: true + DOTNET_CLI_TELEMETRY_OPTOUT: false + jobs: # Tests on Linux @@ -10,6 +14,14 @@ jobs: steps: - name: Checkout repo uses: actions/checkout@v3 + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Print .NET info + run: | + dotnet --info + dotnet workload --info - name: Checkout LFS run: | git lfs version @@ -22,39 +34,52 @@ jobs: sudo apt-get install libx11-dev libxcursor-dev libxinerama-dev build-essential gettext libtool libtool-bin libpulse-dev libasound2-dev libjack-dev portaudio19-dev - name: Build run: | - ./GenerateProjectFiles.sh -vs2019 + ./GenerateProjectFiles.sh -vs2022 -log -verbose -printSDKs ./Development/Scripts/Linux/CallBuildTool.sh -build -log -arch=x64 -platform=Linux -configuration=Development -buildtargets=FlaxTestsTarget - ./Development/Scripts/Linux/CallBuildTool.sh -build -log -arch=x64 -platform=Linux -configuration=Debug -buildtargets=FlaxEditor -BuildBindingsOnly - ./Development/Scripts/Linux/CallBuildTool.sh -build -log -arch=x64 -platform=Linux -configuration=Debug -buildtargets="Flax.Build.Tests" + dotnet msbuild Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj /m /t:Restore,Build /p:Configuration=Debug /p:Platform=AnyCPU /nologo + dotnet msbuild Source/Tools/Flax.Build.Tests/Flax.Build.Tests.csproj /m /t:Restore,Build /p:Configuration=Debug /p:Platform=AnyCPU /nologo - name: Test run: | - Binaries/Editor/Linux/Development/FlaxTests - mono Source/Platforms/DotNet/NUnit/nunit3-console.exe Binaries/Tools/Flax.Build.Tests.dll --framework=mono-4.0 + ${GITHUB_WORKSPACE}/Binaries/Editor/Linux/Development/FlaxTests + dotnet test -f net7.0 Binaries/Tests/Flax.Build.Tests.dll + cp Binaries/Editor/Linux/Development/FlaxEngine.CSharp.dll Binaries/Tests + cp Binaries/Editor/Linux/Development/FlaxEngine.CSharp.runtimeconfig.json Binaries/Tests + cp Binaries/Editor/Linux/Development/Newtonsoft.Json.dll Binaries/Tests + dotnet test -f net7.0 Binaries/Tests/FlaxEngine.CSharp.dll - name: Test UseLargeWorlds run: | ./Development/Scripts/Linux/CallBuildTool.sh -build -log -arch=x64 -platform=Linux -configuration=Development -buildtargets=FlaxTestsTarget -UseLargeWorlds=true - Binaries/Editor/Linux/Development/FlaxTests + ${GITHUB_WORKSPACE}/Binaries/Editor/Linux/Development/FlaxTests # Tests on Windows tests-windows: name: Tests (Windows) - runs-on: "windows-2019" + runs-on: "windows-2022" steps: - name: Checkout repo uses: actions/checkout@v3 + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Print .NET info + run: | + dotnet --info + dotnet workload --info - name: Checkout LFS run: | git lfs version git lfs pull - name: Build run: | - .\GenerateProjectFiles.bat -vs2019 + .\GenerateProjectFiles.bat -vs2022 -log -verbose -printSDKs .\Development\Scripts\Windows\CallBuildTool.bat -build -log -arch=x64 -platform=Windows -configuration=Development -buildtargets=FlaxTestsTarget - .\Development\Scripts\Windows\CallBuildTool.bat -build -log -arch=x64 -platform=Windows -configuration=Debug -buildtargets=FlaxEditor -BuildBindingsOnly - .\Development\Scripts\Windows\CallBuildTool.bat -build -log -arch=x64 -platform=Windows -configuration=Debug -buildtargets="FlaxEngine.Tests" - .\Development\Scripts\Windows\CallBuildTool.bat -build -log -arch=x64 -platform=Windows -configuration=Debug -buildtargets="Flax.Build.Tests" + dotnet msbuild Source\Tools\Flax.Build.Tests\Flax.Build.Tests.csproj /m /t:Restore,Build /p:Configuration=Debug /p:Platform=AnyCPU /nologo - name: Test run: | - Binaries\Editor\Win64\Development\FlaxTests.exe - Source\Platforms\DotNet\NUnit\nunit3-console.exe Binaries\Tools\FlaxEngine.Tests.dll --framework=net-4.5.2 - Source\Platforms\DotNet\NUnit\nunit3-console.exe Binaries\Tools\Flax.Build.Tests.dll --framework=net-4.5.2 + .\Binaries\Editor\Win64\Development\FlaxTests.exe + dotnet test -f net7.0 Binaries\Tests\Flax.Build.Tests.dll + xcopy /y Binaries\Editor\Win64\Development\FlaxEngine.CSharp.dll Binaries\Tests + xcopy /y Binaries\Editor\Win64\Development\FlaxEngine.CSharp.runtimeconfig.json Binaries\Tests + xcopy /y Binaries\Editor\Win64\Development\Newtonsoft.Json.dll Binaries\Tests + dotnet test -f net7.0 Binaries\Tests\FlaxEngine.CSharp.dll diff --git a/.gitignore b/.gitignore index 1e9aef426..54907892f 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ PackagePlatforms_Cert.bat *.opendb *.DS_Store *.xcodeproj +launchSettings.json # NUNIT *.VisualState.xml diff --git a/Content/Editor/IconsAtlas.flax b/Content/Editor/IconsAtlas.flax index 8fa3e3ee9..3318b811b 100644 --- a/Content/Editor/IconsAtlas.flax +++ b/Content/Editor/IconsAtlas.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ff5774c1073e5d4e5de362f7f8a0a74822cacb0b074272d4bba341be0c92d4ed -size 5611572 +oid sha256:d867a994701f09964335ddf51cd4060a54728b9de4420ad3f0bfbd8847bc7602 +size 5611659 diff --git a/Content/Editor/MaterialTemplates/Features/DeferredShading.hlsl b/Content/Editor/MaterialTemplates/Features/DeferredShading.hlsl index fd0023a91..97c71c26f 100644 --- a/Content/Editor/MaterialTemplates/Features/DeferredShading.hlsl +++ b/Content/Editor/MaterialTemplates/Features/DeferredShading.hlsl @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. @0// Deferred Shading: Defines @1// Deferred Shading: Includes diff --git a/Content/Editor/MaterialTemplates/Features/Distortion.hlsl b/Content/Editor/MaterialTemplates/Features/Distortion.hlsl index c74014cca..97faee8fb 100644 --- a/Content/Editor/MaterialTemplates/Features/Distortion.hlsl +++ b/Content/Editor/MaterialTemplates/Features/Distortion.hlsl @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. @0// Distortion: Defines @1// Distortion: Includes diff --git a/Content/Editor/MaterialTemplates/Features/ForwardShading.hlsl b/Content/Editor/MaterialTemplates/Features/ForwardShading.hlsl index cf596bb30..066815dfe 100644 --- a/Content/Editor/MaterialTemplates/Features/ForwardShading.hlsl +++ b/Content/Editor/MaterialTemplates/Features/ForwardShading.hlsl @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. @0// Forward Shading: Defines #define MAX_LOCAL_LIGHTS 4 diff --git a/Content/Editor/MaterialTemplates/Features/GlobalIllumination.hlsl b/Content/Editor/MaterialTemplates/Features/GlobalIllumination.hlsl index 7159f1423..b660b7288 100644 --- a/Content/Editor/MaterialTemplates/Features/GlobalIllumination.hlsl +++ b/Content/Editor/MaterialTemplates/Features/GlobalIllumination.hlsl @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. @0// Global Illumination: Defines #define USE_GI 1 diff --git a/Content/Editor/MaterialTemplates/Features/Lightmap.hlsl b/Content/Editor/MaterialTemplates/Features/Lightmap.hlsl index f4583fa7f..d0edf8f30 100644 --- a/Content/Editor/MaterialTemplates/Features/Lightmap.hlsl +++ b/Content/Editor/MaterialTemplates/Features/Lightmap.hlsl @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. @0// Lightmap: Defines #define CAN_USE_LIGHTMAP 1 diff --git a/Content/Editor/MaterialTemplates/Features/MotionVectors.hlsl b/Content/Editor/MaterialTemplates/Features/MotionVectors.hlsl index 992eb6805..592d6c2b8 100644 --- a/Content/Editor/MaterialTemplates/Features/MotionVectors.hlsl +++ b/Content/Editor/MaterialTemplates/Features/MotionVectors.hlsl @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. @0// Motion Vectors: Defines @1// Motion Vectors: Includes diff --git a/Content/Editor/MaterialTemplates/Features/Tessellation.hlsl b/Content/Editor/MaterialTemplates/Features/Tessellation.hlsl index e2e0b54ea..40314a4c2 100644 --- a/Content/Editor/MaterialTemplates/Features/Tessellation.hlsl +++ b/Content/Editor/MaterialTemplates/Features/Tessellation.hlsl @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. @0// Tessellation: Defines #define TessalationProjectOntoPlane(planeNormal, planePosition, pointToProject) pointToProject - dot(pointToProject - planePosition, planeNormal) * planeNormal diff --git a/Content/Shaders/Lights.flax b/Content/Shaders/Lights.flax index 34e8c9a8c..ea30cd9f7 100644 --- a/Content/Shaders/Lights.flax +++ b/Content/Shaders/Lights.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b405f5698304e87e6f510c49a0cea3817c9a1a00d7ba63ef4027ac49ba7cc7a4 -size 5299 +oid sha256:83cb261770aba2813f85063f987032f9914387f4011474b0fe347c42522116b4 +size 5122 diff --git a/Content/Shaders/VolumetricFog.flax b/Content/Shaders/VolumetricFog.flax index 18eddae16..eb3ca9f2c 100644 --- a/Content/Shaders/VolumetricFog.flax +++ b/Content/Shaders/VolumetricFog.flax @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:72415ba69a685e9a739d1a08d08c6eb9efd3cab31d8cc0c949cb187a9bad19a5 -size 13841 +oid sha256:4ab2c2551ce9cce0355c92f4f6499858e04e4bf764900b305273a7d57b887596 +size 13633 diff --git a/Development/Scripts/Linux/CallBuildTool.sh b/Development/Scripts/Linux/CallBuildTool.sh index aa33bd65e..3a394c74b 100755 --- a/Development/Scripts/Linux/CallBuildTool.sh +++ b/Development/Scripts/Linux/CallBuildTool.sh @@ -10,8 +10,7 @@ if [ $testfilesize -le 1000 ]; then fi # Compile the build tool. -xbuild /nologo /verbosity:quiet "Source/Tools/Flax.Build/Flax.Build.csproj" /property:Configuration=Release /property:Platform=AnyCPU /target:Build +dotnet msbuild /nologo /verbosity:quiet "Source/Tools/Flax.Build/Flax.Build.csproj" /property:Configuration=Release /target:Restore,Build /property:RestorePackagesConfig=True /p:RuntimeIdentifiers=linux-x64 # Run the build tool using the provided arguments. -#mono --debug --debugger-agent=transport=dt_socket,server=y,address=127.0.0.1:55555 Binaries/Tools/Flax.Build.exe "$@" -mono Binaries/Tools/Flax.Build.exe "$@" +Binaries/Tools/Flax.Build "$@" diff --git a/Development/Scripts/Mac/CallBuildTool.sh b/Development/Scripts/Mac/CallBuildTool.sh index 2096a5c57..27f78759a 100755 --- a/Development/Scripts/Mac/CallBuildTool.sh +++ b/Development/Scripts/Mac/CallBuildTool.sh @@ -10,8 +10,7 @@ if [ $testfilesize -le 1000 ]; then fi # Compile the build tool. -xbuild /nologo /verbosity:quiet "Source/Tools/Flax.Build/Flax.Build.csproj" /property:Configuration=Release /property:Platform=AnyCPU /target:Build +dotnet msbuild /nologo /verbosity:quiet "Source/Tools/Flax.Build/Flax.Build.csproj" /property:Configuration=Release /target:Restore,Build /property:RestorePackagesConfig=True /p:RuntimeIdentifiers=osx-x64 # Run the build tool using the provided arguments. -#mono --debug --debugger-agent=transport=dt_socket,server=y,address=127.0.0.1:55555 Binaries/Tools/Flax.Build.exe "$@" -mono Binaries/Tools/Flax.Build.exe "$@" +Binaries/Tools/Flax.Build "$@" diff --git a/Development/Scripts/Mac/XCodeBuild.sh b/Development/Scripts/Mac/XCodeBuild.sh index 6b22e6e3f..3db9ff3ef 100755 --- a/Development/Scripts/Mac/XCodeBuild.sh +++ b/Development/Scripts/Mac/XCodeBuild.sh @@ -2,7 +2,7 @@ # Copyright (c) 2012-2023 Wojciech Figat. All rights reserved # Fix mono bin to be in a path -export PATH=/Library/Frameworks/Mono.framework/Versions/Current/Commands:$PATH +#export PATH=/Library/Frameworks/Mono.framework/Versions/Current/Commands:$PATH echo "Running Flax.Build $*" -mono Binaries/Tools/Flax.Build.exe "$@" +Binaries/Tools/Flax.Build "$@" diff --git a/Development/Scripts/Windows/CallBuildTool.bat b/Development/Scripts/Windows/CallBuildTool.bat index bfe0e01d0..9f60368c5 100644 --- a/Development/Scripts/Windows/CallBuildTool.bat +++ b/Development/Scripts/Windows/CallBuildTool.bat @@ -28,9 +28,9 @@ fc /b Cache\Intermediate\Build\Flax.Build.Files.txt Cache\Intermediate\Build\Fla if not errorlevel 1 goto SkipClean copy /y Cache\Intermediate\Build\Flax.Build.Files.txt Cache\Intermediate\Build\Flax.Build.PrevFiles.txt >nul -%MSBUILD_PATH% /nologo /verbosity:quiet Source\Tools\Flax.Build\Flax.Build.csproj /property:Configuration=Release /property:Platform=AnyCPU /target:Clean +%MSBUILD_PATH% /nologo /verbosity:quiet Source\Tools\Flax.Build\Flax.Build.csproj /property:Configuration=Release /target:Restore,Clean /property:RestorePackagesConfig=True /p:RuntimeIdentifiers=win-x64 :SkipClean -%MSBUILD_PATH% /nologo /verbosity:quiet Source\Tools\Flax.Build\Flax.Build.csproj /property:Configuration=Release /property:Platform=AnyCPU /target:Build +%MSBUILD_PATH% /nologo /verbosity:quiet Source\Tools\Flax.Build\Flax.Build.csproj /property:Configuration=Release /target:Build /property:SelfContained=False /property:RuntimeIdentifiers=win-x64 if errorlevel 1 goto Error_CompilationFailed Binaries\Tools\Flax.Build.exe %* diff --git a/Flax.flaxproj b/Flax.flaxproj index 432045578..d8e86b1ed 100644 --- a/Flax.flaxproj +++ b/Flax.flaxproj @@ -2,8 +2,8 @@ "Name": "Flax", "Version": { "Major": 1, - "Minor": 5, - "Build": 6341 + "Minor": 6, + "Build": 6342 }, "Company": "Flax", "Copyright": "Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.", @@ -11,6 +11,7 @@ "EditorTarget": "FlaxEditor", "Configuration": { "UseCSharp": true, - "UseLargeWorlds": false + "UseLargeWorlds": false, + "UseDotNet": true } } \ No newline at end of file diff --git a/Flax.sln.DotSettings b/Flax.sln.DotSettings index a270ffa47..e71c2da2d 100644 --- a/Flax.sln.DotSettings +++ b/Flax.sln.DotSettings @@ -321,6 +321,9 @@ True True True + True + True + True True True True diff --git a/README.md b/README.md index 3cbcfb6fe..dc5abb84f 100644 --- a/README.md +++ b/README.md @@ -26,16 +26,12 @@ This repository contains full source code of the Flax Engine (excluding NDA-prot Follow the instructions below to compile and run the engine from source. -## Flax plugin for Visual Studio - -Flax Visual Studio extension provides better programming workflow, C# scripts debugging functionality and allows to attach to running engine instance to debug C# source. This extension is available to download [here](https://marketplace.visualstudio.com/items?itemName=Flax.FlaxVS). - ## Windows -* Install Visual Studio 2015 or newer +* Install Visual Studio 2022 or newer * Install Windows 8.1 SDK or newer (via Visual Studio Installer) * Install Microsoft Visual C++ 2015 v140 toolset or newer (via Visual Studio Installer) -* Install .Net Framework 4.5.2 SDK/Targeting Pack (via Visual Studio Installer) +* Install .Net 7 SDK (via Visual Studio Installer or [from web](https://dotnet.microsoft.com/en-us/download/dotnet/7.0)) * Install Git with LFS * Clone repo (with LFS) * Run **GenerateProjectFiles.bat** @@ -44,16 +40,13 @@ Flax Visual Studio extension provides better programming workflow, C# scripts de * Compile Flax project (hit F7 or CTRL+Shift+B) * Run Flax (hit F5 key) -> When building on Windows to support Vulkan rendering, first install the Vulkan SDK then set an environment variable to provide the path to the SDK prior to running GenerateProjectFiles.bat: `set VULKAN_SDK=%sdk_path%` - ## Linux * Install Visual Studio Code -* Install Mono - * Ubuntu: see the instructions here: ([https://www.mono-project.com/download/stable](https://www.mono-project.com/download/stable)) - * Arch: `sudo pacman -S mono` -* Install Vulkan SDK - * Ubuntu: see the instructions here: ([https://vulkan.lunarg.com/](https://vulkan.lunarg.com/)) +* Install .Net 7 SDK ([https://dotnet.microsoft.com/en-us/download/dotnet/7.0](https://dotnet.microsoft.com/en-us/download/dotnet/7.0)) + * Ubuntu: `sudo apt install dotnet-sdk-7.0` +* Install Vulkan SDK ([https://vulkan.lunarg.com/](https://vulkan.lunarg.com/)) + * Ubuntu: `sudo apt install vulkan-sdk` * Arch: `sudo pacman -S spirv-tools vulkan-headers vulkan-tools vulkan-validation-layers` * Install Git with LFS * Ubuntu: `sudo apt-get install git git-lfs` @@ -73,13 +66,31 @@ Flax Visual Studio extension provides better programming workflow, C# scripts de ## Mac * Install XCode -* Install Mono ([https://www.mono-project.com/download/stable](https://www.mono-project.com/download/stable)) +* Install .Net 7 SDK ([https://dotnet.microsoft.com/en-us/download/dotnet/7.0](https://dotnet.microsoft.com/en-us/download/dotnet/7.0)) * Install Vulkan SDK ([https://vulkan.lunarg.com/](https://vulkan.lunarg.com/)) * Clone repo (with LFS) * Run `GenerateProjectFiles.command` * Open workspace with XCode or Visual Studio Code * Build and run (configuration `Editor.Mac.Development`) +#### Troubleshooting + +* `Could not execute because the specified command or file was not found.` + +Restart PC - ensure DotNet is added to PATH for command line tools execution. + +* `Microsoft.NET.TargetFrameworkInference.targets(141,5): error NETSDK1045: The current .NET SDK does not support targeting .NET 7.0. Either target .NET 5.0 or lower, or use a version of the .NET SDK that supports .NET 7.0` + +Use Visual Studio 2022, older versions are not supported by .NET SDK 7. + +* `Building for Windows without Vulkan rendering backend (Vulkan SDK is missing)` + +Install the Vulkan SDK then set an environment variable to provide the path to the SDK prior to running GenerateProjectFiles.bat: `set VULKAN_SDK=%sdk_path%`. + +* `The NuGetSdkResolver did not resolve this SDK` + +Install `.NET SDK`, `NuGet package manager` and `NuGet targets and build tasks` in Visual Studio components. + ## Workspace directory - **Binaries/** - executable files @@ -93,7 +104,6 @@ Flax Visual Studio extension provides better programming workflow, C# scripts de - **Content/** - assets and binary files used by the engine and editor - **Development/** - engine development files - **Scripts/** - utility scripts -- **packages/** - NuGet packages cache location - **Source/** - source code location - **Editor/** - Flax Editor source code - **Engine/** - Flax Engine source code @@ -103,7 +113,6 @@ Flax Visual Studio extension provides better programming workflow, C# scripts de - ***PlatformName*/** - per-platform files - **Binaries/** - per-platform binaries - **Game/** - Flax Game binaries - - **Mono/** - Mono runtime files and data - **ThirdParty/** - prebuilt 3rd Party binaries - **Shaders/** - shaders source code - **ThirdParty/** - 3rd Party source code diff --git a/Source/Editor/Analytics/EditorAnalytics.cpp b/Source/Editor/Analytics/EditorAnalytics.cpp index 8e5ac4126..913efd91c 100644 --- a/Source/Editor/Analytics/EditorAnalytics.cpp +++ b/Source/Editor/Analytics/EditorAnalytics.cpp @@ -1,49 +1,103 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #include "EditorAnalytics.h" -#include "EditorAnalyticsController.h" +#include "Editor/Editor.h" +#include "Editor/ProjectInfo.h" +#include "Editor/Cooker/GameCooker.h" +#include "Engine/Threading/Task.h" #include "Engine/Threading/Threading.h" #include "Engine/Platform/FileSystem.h" +#include "Engine/Platform/MemoryStats.h" #include "Engine/Core/Log.h" #include "Engine/Core/Math/Vector2.h" #include "Engine/Core/Types/DateTime.h" #include "Engine/Core/Types/TimeSpan.h" -#include "Editor/Editor.h" -#include "Editor/ProjectInfo.h" #include "Engine/Engine/EngineService.h" #include "Engine/Engine/Globals.h" #include "Engine/Graphics/GPUDevice.h" #include "Engine/Utilities/StringConverter.h" +#include "Engine/Utilities/TextWriter.h" +#include "Engine/ShadowsOfMordor/Builder.h" +#include "Engine/Profiler/ProfilerCPU.h" #include "FlaxEngine.Gen.h" -#include +#include -#define FLAX_EDITOR_GOOGLE_ID "UA-88357703-3" +// Docs: +// https://developers.google.com/analytics/devguides/collection/ga4 +// https://developers.google.com/analytics/devguides/collection/protocol/ga4 -// Helper doc: https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters +// [GA4] Flax Editor +#define GA_MEASUREMENT_ID "G-2SNY6RW6VX" +#define GA_API_SECRET "wFlau4khTPGFRnx-AIZ1zg" +#define GA_DEBUG 0 +#if GA_DEBUG +#define GA_URL "https://www.google-analytics.com/debug/mp/collect" +#else +#define GA_URL "https://www.google-analytics.com/mp/collect" +#endif -namespace EditorAnalyticsImpl +namespace { - UATracker Tracker = nullptr; - + StringAnsi Url; StringAnsi ClientId; - StringAnsi ProjectName; - StringAnsi ScreenResolution; - StringAnsi UserLanguage; - StringAnsi GPU; DateTime SessionStartTime; - CriticalSection Locker; bool IsSessionActive = false; - EditorAnalyticsController Controller; - Array TmpBuffer; + TextWriterANSI JsonBuffer; + curl_slist* CurlHttpHeadersList = nullptr; } -using namespace EditorAnalyticsImpl; +size_t curl_null_data_handler(char* ptr, size_t size, size_t nmemb, void* userdata) +{ + return nmemb * size; +} + +void RegisterGameCookingStart(GameCooker::EventType type) +{ + if (type == GameCooker::EventType::BuildStarted) + { + auto& data = *GameCooker::GetCurrentData(); + StringAnsi name = "Build " + StringAnsi(ToString(data.Platform)); + const Pair params[1] = { { "GameCooker", name.Get() } }; + EditorAnalytics::SendEvent("Actions", ToSpan(params, ARRAY_COUNT(params))); + } +} + +void RegisterLightmapsBuildingStart() +{ + const Pair params[1] = { { "ShadowsOfMordor", "Build" }, }; + EditorAnalytics::SendEvent("Actions", ToSpan(params, ARRAY_COUNT(params))); +} + +void RegisterError(LogType type, const StringView& msg) +{ + if (type == LogType::Error && false) + { + StringAnsi value(msg); + const int32 MaxLength = 300; + if (msg.Length() > MaxLength) + value = value.Substring(0, MaxLength); + value.Replace('\n', ' '); + value.Replace('\r', ' '); + const Pair params[1] = { { "Error", value.Get() }, }; + EditorAnalytics::SendEvent("Errors", ToSpan(params, ARRAY_COUNT(params))); + } + else if (type == LogType::Fatal) + { + StringAnsi value(msg); + const int32 MaxLength = 300; + if (msg.Length() > MaxLength) + value = value.Substring(0, MaxLength); + value.Replace('\n', ' '); + value.Replace('\r', ' '); + const Pair params[1] = { { "Fatal", value.Get() }, }; + EditorAnalytics::SendEvent("Errors", ToSpan(params, ARRAY_COUNT(params))); + } +} class EditorAnalyticsService : public EngineService { public: - EditorAnalyticsService() : EngineService(TEXT("Editor Analytics")) { @@ -57,192 +111,141 @@ EditorAnalyticsService EditorAnalyticsServiceInstance; bool EditorAnalytics::IsSessionActive() { - return EditorAnalyticsImpl::IsSessionActive; + return ::IsSessionActive; } void EditorAnalytics::StartSession() { ScopeLock lock(Locker); - - if (EditorAnalyticsImpl::IsSessionActive) + if (::IsSessionActive) return; + PROFILE_CPU(); // Prepare client metadata - if (ClientId.IsEmpty()) - { - ClientId = Platform::GetUniqueDeviceId().ToString(Guid::FormatType::N).ToStringAnsi(); - } - if (ScreenResolution.IsEmpty()) - { - const auto desktopSize = Platform::GetDesktopSize(); - ScreenResolution = StringAnsi(StringUtils::ToString((int32)desktopSize.X)) + "x" + StringAnsi(StringUtils::ToString((int32)desktopSize.Y)); - } - if (UserLanguage.IsEmpty()) - { - UserLanguage = Platform::GetUserLocaleName().ToStringAnsi(); - } - if (GPU.IsEmpty()) - { - const auto gpu = GPUDevice::Instance; - if (gpu && gpu->GetState() == GPUDevice::DeviceState::Ready) - GPU = StringAsANSI<>(gpu->GetAdapter()->GetDescription().GetText()).Get(); - } - if (ProjectName.IsEmpty()) - { - ProjectName = Editor::Project->Name.ToStringAnsi(); - } + ClientId = Platform::GetUniqueDeviceId().ToString(Guid::FormatType::N).ToStringAnsi(); + StringAnsi ProjectName = Editor::Project->Name.ToStringAnsi(); + const auto desktopSize = Platform::GetDesktopSize(); + StringAnsi ScreenResolution = StringAnsi::Format("{0}x{1}", (int32)desktopSize.X, (int32)desktopSize.Y); + const auto memoryStats = Platform::GetMemoryStats(); + StringAnsi Memory = StringAnsi::Format("{0} GB", (int32)(memoryStats.TotalPhysicalMemory / 1024 / 1024 / 1000)); + StringAnsi UserLocale = Platform::GetUserLocaleName().ToStringAnsi(); + StringAnsi GPU; + if (GPUDevice::Instance && GPUDevice::Instance->GetState() == GPUDevice::DeviceState::Ready) + GPU = StringAsANSI<>(GPUDevice::Instance->GetAdapter()->GetDescription().GetText()).Get(); SessionStartTime = DateTime::Now(); - - // Initialize the analytics tracker - Tracker = createTracker(FLAX_EDITOR_GOOGLE_ID, ClientId.Get(), nullptr); - Tracker->user_agent = "Flax Editor"; - - // Store these options permanently (for the lifetime of the tracker) - setTrackerOption(Tracker, UA_OPTION_QUEUE, 1); - UASettings GlobalSettings = - { - { - { UA_DOCUMENT_PATH, 0, "Flax Editor" }, - { UA_DOCUMENT_TITLE, 0, "Flax Editor" }, + StringAnsiView EngineVersion = FLAXENGINE_VERSION_TEXT; #if PLATFORM_WINDOWS - { UA_USER_AGENT, 0, "Windows " FLAXENGINE_VERSION_TEXT }, + StringAnsiView PlatformName = "Windows"; #elif PLATFORM_LINUX - { UA_USER_AGENT, 0, "Linux " FLAXENGINE_VERSION_TEXT }, + StringAnsiView PlatformName = "Linux"; #elif PLATFORM_MAC - { UA_USER_AGENT, 0, "Mac " FLAXENGINE_VERSION_TEXT }, + StringAnsiView PlatformName = "Mac"; #else #error "Unknown platform" #endif - { UA_ANONYMIZE_IP, 0, "0" }, - { UA_APP_ID, 0, "Flax Editor " FLAXENGINE_VERSION_TEXT }, - { UA_APP_INSTALLER_ID, 0, "Flax Editor" }, - { UA_APP_NAME, 0, "Flax Editor" }, - { UA_APP_VERSION, 0, FLAXENGINE_VERSION_TEXT }, - { UA_SCREEN_NAME, 0, "Flax Editor " FLAXENGINE_VERSION_TEXT }, - { UA_SCREEN_RESOLUTION, 0, ScreenResolution.Get() }, - { UA_USER_LANGUAGE, 0, UserLanguage.Get() }, - } - }; - setParameters(Tracker, &GlobalSettings); - // Send the initial session event - UAOptions sessionViewOptions = + // Initialize HTTP + Url = StringAnsi::Format("{0}?measurement_id={1}&api_secret={2}", GA_URL, GA_MEASUREMENT_ID, GA_API_SECRET); + curl_global_init(CURL_GLOBAL_ALL); + CurlHttpHeadersList = curl_slist_append(nullptr, "Content-Type: application/json"); + ::IsSessionActive = true; + + // Start session { - { - { UA_EVENT_CATEGORY, 0, "Session" }, - { UA_EVENT_ACTION, 0, "Start Editor" }, - { UA_EVENT_LABEL, 0, "Start Editor" }, - { UA_SESSION_CONTROL, 0, "start" }, - { UA_DOCUMENT_TITLE, 0, ProjectName.Get() }, - } - }; - sendTracking(Tracker, UA_SCREENVIEW, &sessionViewOptions); - - EditorAnalyticsImpl::IsSessionActive = true; - - Controller.Init(); - - // Report GPU model - if (GPU.HasChars()) - { - SendEvent("Telemetry", "GPU.Model", GPU.Get()); + const Pair params[1] = { { "Project", ProjectName.Get() }, }; + SendEvent("Session", ToSpan(params, ARRAY_COUNT(params))); } + + // Report telemetry stats +#define SEND_TELEMETRY(name, value) \ + if (value.HasChars()) \ + { \ + const Pair params[1] = { { name, value.Get() } }; \ + SendEvent("Telemetry", ToSpan(params, ARRAY_COUNT(params))); \ + } + SEND_TELEMETRY("Platform", PlatformName); + SEND_TELEMETRY("GPU", GPU); + SEND_TELEMETRY("Memory", Memory); + SEND_TELEMETRY("Locale", UserLocale); + SEND_TELEMETRY("Screen", ScreenResolution); + SEND_TELEMETRY("Version", EngineVersion); +#undef SEND_TELEMETRY + + // Bind events + GameCooker::OnEvent.Bind(); + ShadowsOfMordor::Builder::Instance()->OnBuildStarted.Bind(); + Log::Logger::OnError.Bind(); } void EditorAnalytics::EndSession() { ScopeLock lock(Locker); - - if (!EditorAnalyticsImpl::IsSessionActive) + if (!::IsSessionActive) return; + PROFILE_CPU(); - Controller.Cleanup(); + // Unbind events + GameCooker::OnEvent.Unbind(); + ShadowsOfMordor::Builder::Instance()->OnBuildStarted.Unbind(); + Log::Logger::OnError.Unbind(); - StringAnsi sessionLength = StringAnsi::Format("{0}", (int32)(DateTime::Now() - SessionStartTime).GetTotalSeconds()); - - // Send the end session event - UAOptions sessionEventOptions = + // End session { + StringAnsi sessionLength = StringAnsi::Format("{}", (int32)(DateTime::Now() - SessionStartTime).GetTotalSeconds()); + const Pair params[1] = { - { UA_EVENT_CATEGORY, 0, "Session" }, - { UA_EVENT_ACTION, 0, "Session Length" }, - { UA_EVENT_LABEL, 0, "Session Length" }, - { UA_EVENT_VALUE, 0, sessionLength.Get() }, - { UA_CUSTOM_DIMENSION, 1, "Session Length" }, - { UA_CUSTOM_METRIC, 1, sessionLength.Get() }, - } - }; - sendTracking(Tracker, UA_EVENT, &sessionEventOptions); - - // Send the end session event - UAOptions sessionViewOptions = - { - { - { UA_EVENT_CATEGORY, 0, "Session" }, - { UA_EVENT_ACTION, 0, "End Editor" }, - { UA_EVENT_LABEL, 0, "End Editor" }, - { UA_EVENT_VALUE, 0, sessionLength.Get() }, - { UA_SESSION_CONTROL, 0, "end" }, - } - }; - sendTracking(Tracker, UA_SCREENVIEW, &sessionViewOptions); + { "Duration", sessionLength.Get() }, + }; + SendEvent("Session", ToSpan(params, ARRAY_COUNT(params))); + } // Cleanup - removeTracker(Tracker); - Tracker = nullptr; - - EditorAnalyticsImpl::IsSessionActive = false; + curl_slist_free_all(CurlHttpHeadersList); + CurlHttpHeadersList = nullptr; + curl_global_cleanup(); + ::IsSessionActive = false; } -void EditorAnalytics::SendEvent(const char* category, const char* name, const char* label) +void EditorAnalytics::SendEvent(const char* name, Span> parameters) { ScopeLock lock(Locker); - - if (!EditorAnalyticsImpl::IsSessionActive) + if (!::IsSessionActive) return; + PROFILE_CPU(); - UAOptions opts = + // Create Json request contents + JsonBuffer.Clear(); + JsonBuffer.Write("{ \"client_id\": \""); + JsonBuffer.Write(ClientId); + JsonBuffer.Write("\", \"events\": [ { \"name\": \""); + JsonBuffer.Write(name); + JsonBuffer.Write("\", \"params\": {"); + for (int32 i = 0; i < parameters.Length(); i++) { - { - { UA_EVENT_CATEGORY, 0, (char*)category }, - { UA_EVENT_ACTION, 0, (char*)name }, - { UA_EVENT_LABEL, 0, (char*)label }, - } - }; + if (i != 0) + JsonBuffer.Write(","); + const auto& e = parameters[i]; + JsonBuffer.Write("\""); + JsonBuffer.Write(e.First); + JsonBuffer.Write("\":\""); + JsonBuffer.Write(e.Second); + JsonBuffer.Write("\""); + } + JsonBuffer.Write("}}]}"); + const StringAnsiView json((const char*)JsonBuffer.GetBuffer()->GetHandle(), (int32)JsonBuffer.GetBuffer()->GetPosition()); - sendTracking(Tracker, UA_EVENT, &opts); -} - -void EditorAnalytics::SendEvent(const char* category, const char* name, const StringView& label) -{ - SendEvent(category, name, label.Get()); -} - -void EditorAnalytics::SendEvent(const char* category, const char* name, const Char* label) -{ - ScopeLock lock(Locker); - - if (!EditorAnalyticsImpl::IsSessionActive) - return; - - ASSERT(category && name && label); - - const int32 labelLength = StringUtils::Length(label); - TmpBuffer.Clear(); - TmpBuffer.Resize(labelLength + 1); - StringUtils::ConvertUTF162ANSI(label, TmpBuffer.Get(), labelLength); - TmpBuffer[labelLength] = 0; - - UAOptions opts = - { - { - { UA_EVENT_CATEGORY, 0, (char*)category }, - { UA_EVENT_ACTION, 0, (char*)name }, - { UA_EVENT_LABEL, 0, (char*)TmpBuffer.Get() }, - } - }; - - sendTracking(Tracker, UA_EVENT, &opts); + // Send HTTP request + CURL* curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_POST, 1); + curl_easy_setopt(curl, CURLOPT_URL, Url.Get()); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, CurlHttpHeadersList); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json.Get()); + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, json.Length()); + curl_easy_setopt(curl, CURLOPT_USERAGENT, "Flax Editor"); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, curl); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_null_data_handler); + CURLcode res = curl_easy_perform(curl); + curl_easy_cleanup(curl); } bool EditorAnalyticsService::Init() @@ -265,8 +268,7 @@ bool EditorAnalyticsService::Init() } LOG(Info, "Editor analytics service is enabled. Curl version: {0}", TEXT(LIBCURL_VERSION)); - - EditorAnalytics::StartSession(); + Task::StartNew(EditorAnalytics::StartSession); return false; } diff --git a/Source/Editor/Analytics/EditorAnalytics.h b/Source/Editor/Analytics/EditorAnalytics.h index 6a16020f2..2df4bbcc9 100644 --- a/Source/Editor/Analytics/EditorAnalytics.h +++ b/Source/Editor/Analytics/EditorAnalytics.h @@ -10,11 +10,9 @@ class EditorAnalytics { public: - /// /// Determines whether analytics session is active. /// - /// true if there is active analytics session running; otherwise, false. static bool IsSessionActive(); /// @@ -30,24 +28,7 @@ public: /// /// Sends the custom event. /// - /// The event category name. /// The event name. - /// The event label. - static void SendEvent(const char* category, const char* name, const char* label = nullptr); - - /// - /// Sends the custom event. - /// - /// The event category name. - /// The event name. - /// The event label. - static void SendEvent(const char* category, const char* name, const StringView& label); - - /// - /// Sends the custom event. - /// - /// The event category name. - /// The event name. - /// The event label. - static void SendEvent(const char* category, const char* name, const Char* label); + /// The event parameters (key and value pairs). + static void SendEvent(const char* name, Span> parameters); }; diff --git a/Source/Editor/Analytics/EditorAnalyticsController.cpp b/Source/Editor/Analytics/EditorAnalyticsController.cpp deleted file mode 100644 index 0e1e461cf..000000000 --- a/Source/Editor/Analytics/EditorAnalyticsController.cpp +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. - -#include "EditorAnalyticsController.h" -#include "Editor/Cooker/GameCooker.h" -#include "EditorAnalytics.h" -#include "Engine/ShadowsOfMordor/Builder.h" - -void RegisterGameCookingStart(GameCooker::EventType type) -{ - auto& data = *GameCooker::GetCurrentData(); - auto platform = ToString(data.Platform); - if (type == GameCooker::EventType::BuildStarted) - { - EditorAnalytics::SendEvent("Actions", "GameCooker.Start", platform); - } - else if (type == GameCooker::EventType::BuildFailed) - { - EditorAnalytics::SendEvent("Actions", "GameCooker.Failed", platform); - } - else if (type == GameCooker::EventType::BuildDone) - { - EditorAnalytics::SendEvent("Actions", "GameCooker.End", platform); - } -} - -void RegisterLightmapsBuildingStart() -{ - EditorAnalytics::SendEvent("Actions", "ShadowsOfMordor.Build", "ShadowsOfMordor.Build"); -} - -void RegisterError(LogType type, const StringView& msg) -{ - if (type == LogType::Error && false) - { - String value = msg.ToString(); - const int32 MaxLength = 300; - if (msg.Length() > MaxLength) - value = value.Substring(0, MaxLength); - value.Replace('\n', ' '); - value.Replace('\r', ' '); - - EditorAnalytics::SendEvent("Errors", "Log.Error", value); - } - else if (type == LogType::Fatal) - { - String value = msg.ToString(); - const int32 MaxLength = 300; - if (msg.Length() > MaxLength) - value = value.Substring(0, MaxLength); - value.Replace('\n', ' '); - value.Replace('\r', ' '); - - EditorAnalytics::SendEvent("Errors", "Log.Fatal", value); - } -} - -void EditorAnalyticsController::Init() -{ - GameCooker::OnEvent.Bind(); - ShadowsOfMordor::Builder::Instance()->OnBuildStarted.Bind(); - Log::Logger::OnError.Bind(); -} - -void EditorAnalyticsController::Cleanup() -{ - GameCooker::OnEvent.Unbind(); - ShadowsOfMordor::Builder::Instance()->OnBuildStarted.Unbind(); - Log::Logger::OnError.Unbind(); -} diff --git a/Source/Editor/Analytics/EditorAnalyticsController.h b/Source/Editor/Analytics/EditorAnalyticsController.h deleted file mode 100644 index 71656caee..000000000 --- a/Source/Editor/Analytics/EditorAnalyticsController.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. - -#pragma once - -/// -/// The controller object for the tracking events for the editor analytics. -/// -class EditorAnalyticsController -{ -public: - - /// - /// Starts the service (registers to event handlers). - /// - void Init(); - - /// - /// Ends the service (unregisters to event handlers). - /// - void Cleanup(); -}; diff --git a/Source/Editor/Content/Import/AudioImportSettings.cs b/Source/Editor/Content/Import/AudioImportSettings.cs index d71dbd114..2fc0a1795 100644 --- a/Source/Editor/Content/Import/AudioImportSettings.cs +++ b/Source/Editor/Content/Import/AudioImportSettings.cs @@ -2,9 +2,9 @@ using System.ComponentModel; using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using FlaxEngine; +using FlaxEngine.Interop; namespace FlaxEditor.Content.Import { @@ -93,6 +93,7 @@ namespace FlaxEditor.Content.Import [StructLayout(LayoutKind.Sequential)] internal struct InternalOptions { + [MarshalAs(UnmanagedType.I1)] public AudioFormat Format; public byte DisableStreaming; public byte Is3D; @@ -144,7 +145,7 @@ namespace FlaxEditor.Content.Import /// Audio asset import entry. /// /// - public class AudioImportEntry : AssetImportEntry + public partial class AudioImportEntry : AssetImportEntry { private AudioImportSettings _settings = new AudioImportSettings(); @@ -182,8 +183,9 @@ namespace FlaxEditor.Content.Import #region Internal Calls - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_GetAudioImportOptions(string path, out AudioImportSettings.InternalOptions result); + [LibraryImport("FlaxEngine", EntryPoint = "AudioImportEntryInternal_GetAudioImportOptions", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalAs(UnmanagedType.U1)] + internal static partial bool Internal_GetAudioImportOptions(string path, out AudioImportSettings.InternalOptions result); #endregion } diff --git a/Source/Editor/Content/Import/ModelImportEntry.cs b/Source/Editor/Content/Import/ModelImportEntry.cs index b17c8314d..bbb384562 100644 --- a/Source/Editor/Content/Import/ModelImportEntry.cs +++ b/Source/Editor/Content/Import/ModelImportEntry.cs @@ -1,88 +1,47 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. -using System.ComponentModel; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; +using System.Collections.Generic; +using FlaxEditor.CustomEditors.Editors; +using FlaxEditor.Scripting; using FlaxEngine; +using FlaxEngine.Tools; + +namespace FlaxEngine.Tools +{ + partial class ModelTool + { + partial struct Options + { + private bool ShowGeometry => Type == ModelTool.ModelType.Model || Type == ModelTool.ModelType.SkinnedModel; + private bool ShowModel => Type == ModelTool.ModelType.Model; + private bool ShowSkinnedModel => Type == ModelTool.ModelType.SkinnedModel; + private bool ShowAnimation => Type == ModelTool.ModelType.Animation; + private bool ShowSmoothingNormalsAngle => ShowGeometry && CalculateNormals; + private bool ShowSmoothingTangentsAngle => ShowGeometry && CalculateTangents; + private bool ShowFramesRange => ShowAnimation && Duration == ModelTool.AnimationDuration.Custom; + } + } +} + +namespace FlaxEditor.CustomEditors.Dedicated +{ + /// + /// Custom editor for . + /// + [CustomEditor(typeof(FlaxEngine.Tools.ModelTool.Options)), DefaultEditor] + public class ModelToolOptionsEditor : GenericEditor + { + /// + protected override List GetItemsForType(ScriptType type) + { + // Show both fields and properties + return GetItemsForType(type, true, true); + } + } +} namespace FlaxEditor.Content.Import { - /// - /// Importing model lightmap UVs source - /// - [HideInEditor] - public enum ModelLightmapUVsSource : int - { - /// - /// No lightmap UVs. - /// - Disable = 0, - - /// - /// Generate lightmap UVs from model geometry. - /// - Generate = 1, - - /// - /// The texcoords channel 0. - /// - Channel0 = 2, - - /// - /// The texcoords channel 1. - /// - Channel1 = 3, - - /// - /// The texcoords channel 2. - /// - Channel2 = 4, - - /// - /// The texcoords channel 3. - /// - Channel3 = 5 - } - - /// - /// Declares the imported data type. - /// - [HideInEditor] - public enum ModelType : int - { - /// - /// The model asset. - /// - Model = 0, - - /// - /// The skinned model asset. - /// - SkinnedModel = 1, - - /// - /// The animation asset. - /// - Animation = 2, - } - - /// - /// Declares the imported animation clip duration. - /// - [HideInEditor] - public enum AnimationDuration : int - { - /// - /// The imported duration. - /// - Imported = 0, - - /// - /// The custom duration specified via keyframes range. - /// - Custom = 1, - } - /// /// Proxy object to present model import settings in . /// @@ -90,431 +49,10 @@ namespace FlaxEditor.Content.Import public class ModelImportSettings { /// - /// Type of the imported asset. + /// The settings data. /// - [EditorOrder(0)] - public ModelType Type { get; set; } = ModelType.Model; - - /// - /// Enable model normal vectors recalculating. - /// - [EditorDisplay("Geometry"), VisibleIf(nameof(ShowGeometry))] - [EditorOrder(20), DefaultValue(false)] - public bool CalculateNormals { get; set; } = false; - - /// - /// Specifies the maximum angle (in degrees) that may be between two face normals at the same vertex position that their are smoothed together. The default value is 175. - /// - [EditorDisplay("Geometry"), VisibleIf(nameof(ShowSmoothingNormalsAngle))] - [EditorOrder(30), DefaultValue(175.0f), Limit(0, 175, 0.1f)] - public float SmoothingNormalsAngle { get; set; } = 175.0f; - - private bool ShowSmoothingNormalsAngle => ShowGeometry && CalculateNormals; - - /// - /// If checked, the imported normal vectors of the mesh will be flipped (scaled by -1). - /// - [EditorDisplay("Geometry"), VisibleIf(nameof(ShowGeometry))] - [EditorOrder(35), DefaultValue(false)] - public bool FlipNormals { get; set; } = false; - - /// - /// Enable model tangent vectors recalculating. - /// - [EditorDisplay("Geometry"), VisibleIf(nameof(ShowGeometry))] - [EditorOrder(40), DefaultValue(false)] - public bool CalculateTangents { get; set; } = false; - - /// - /// Specifies the maximum angle (in degrees) that may be between two vertex tangents that their tangents and bi-tangents are smoothed. The default value is 45. - /// - [EditorDisplay("Geometry"), VisibleIf(nameof(ShowSmoothingTangentsAngle))] - [EditorOrder(45), DefaultValue(45.0f), Limit(0, 45, 0.1f)] - public float SmoothingTangentsAngle { get; set; } = 45.0f; - - private bool ShowSmoothingTangentsAngle => ShowGeometry && CalculateTangents; - - /// - /// Enable/disable meshes geometry optimization. - /// - [EditorDisplay("Geometry"), VisibleIf(nameof(ShowGeometry))] - [EditorOrder(50), DefaultValue(true)] - public bool OptimizeMeshes { get; set; } = true; - - /// - /// Enable/disable geometry merge for meshes with the same materials. - /// - [EditorDisplay("Geometry"), VisibleIf(nameof(ShowGeometry))] - [EditorOrder(60), DefaultValue(true)] - public bool MergeMeshes { get; set; } = true; - - /// - /// Enable/disable importing meshes Level of Details. - /// - [EditorDisplay("Geometry", "Import LODs"), VisibleIf(nameof(ShowGeometry))] - [EditorOrder(70), DefaultValue(true)] - public bool ImportLODs { get; set; } = true; - - /// - /// Enable/disable importing vertex colors (channel 0 only). - /// - [EditorDisplay("Geometry"), VisibleIf(nameof(ShowModel))] - [EditorOrder(80), DefaultValue(true)] - public bool ImportVertexColors { get; set; } = true; - - /// - /// Enable/disable importing blend shapes (morph targets). - /// - [EditorDisplay("Geometry"), VisibleIf(nameof(ShowSkinnedModel))] - [EditorOrder(85), DefaultValue(false)] - public bool ImportBlendShapes { get; set; } = false; - - /// - /// The lightmap UVs source. - /// - [EditorDisplay("Geometry", "Lightmap UVs Source"), VisibleIf(nameof(ShowModel))] - [EditorOrder(90), DefaultValue(ModelLightmapUVsSource.Disable)] - public ModelLightmapUVsSource LightmapUVsSource { get; set; } = ModelLightmapUVsSource.Disable; - - /// - /// If specified, all meshes which name starts with this prefix will be imported as a separate collision data (excluded used for rendering). - /// - [EditorDisplay("Geometry"), VisibleIf(nameof(ShowGeometry))] - [EditorOrder(100), DefaultValue("")] - public string CollisionMeshesPrefix { get; set; } - - /// - /// Custom uniform import scale. - /// - [EditorOrder(500), DefaultValue(1.0f), EditorDisplay("Transform")] - public float Scale { get; set; } = 1.0f; - - /// - /// Custom import geometry rotation. - /// - [DefaultValue(typeof(Quaternion), "0,0,0,1")] - [EditorOrder(510), EditorDisplay("Transform")] - public Quaternion Rotation { get; set; } = Quaternion.Identity; - - /// - /// Custom import geometry offset. - /// - [DefaultValue(typeof(Float3), "0,0,0")] - [EditorOrder(520), EditorDisplay("Transform")] - public Float3 Translation { get; set; } = Float3.Zero; - - /// - /// If checked, the imported geometry will be shifted to the center of mass. - /// - [EditorOrder(530), DefaultValue(false), EditorDisplay("Transform")] - public bool CenterGeometry { get; set; } = false; - - /// - /// Imported animation duration mode. Can use the original value or overriden by settings. - /// - [EditorDisplay("Animation"), VisibleIf(nameof(ShowAnimation))] - [EditorOrder(1000), DefaultValue(AnimationDuration.Imported)] - public AnimationDuration Duration { get; set; } = AnimationDuration.Imported; - - /// - /// Imported animation first frame index. Used only if Duration mode is set to Custom. - /// - [EditorDisplay("Animation"), VisibleIf(nameof(ShowFramesRange))] - [EditorOrder(1010), DefaultValue(0.0f), Limit(0)] - public float FramesRangeStart { get; set; } = 0; - - /// - /// Imported animation last frame index. Used only if Duration mode is set to Custom. - /// - [EditorDisplay("Animation"), VisibleIf(nameof(ShowFramesRange))] - [EditorOrder(1020), DefaultValue(0.0f), Limit(0)] - public float FramesRangeEnd { get; set; } = 0; - - private bool ShowFramesRange => ShowAnimation && Duration == AnimationDuration.Custom; - - /// - /// The imported animation default frame rate. Can specify the default frames per second amount for imported animation. If value is 0 then the original animation frame rate will be used. - /// - [EditorDisplay("Animation"), VisibleIf(nameof(ShowAnimation))] - [EditorOrder(1025), DefaultValue(0.0f), Limit(0, 1000, 0.01f)] - public float DefaultFrameRate { get; set; } = 0.0f; - - /// - /// The imported animation sampling rate. If value is 0 then the original animation speed will be used. - /// - [EditorDisplay("Animation"), VisibleIf(nameof(ShowAnimation))] - [EditorOrder(1030), DefaultValue(0.0f), Limit(0, 1000, 0.01f)] - public float SamplingRate { get; set; } = 0.0f; - - /// - /// The imported animation will have removed tracks with no keyframes or unspecified data. - /// - [EditorDisplay("Animation"), VisibleIf(nameof(ShowAnimation))] - [EditorOrder(1040), DefaultValue(true)] - public bool SkipEmptyCurves { get; set; } = true; - - /// - /// The imported animation channels will be optimized to remove redundant keyframes. - /// - [EditorDisplay("Animation"), VisibleIf(nameof(ShowAnimation))] - [EditorOrder(1050), DefaultValue(true)] - public bool OptimizeKeyframes { get; set; } = true; - - /// - /// If checked, the importer will import scale animation tracks (otherwise scale animation will be ignored). - /// - [EditorDisplay("Animation"), VisibleIf(nameof(ShowAnimation))] - [EditorOrder(1055), DefaultValue(false)] - public bool ImportScaleTracks { get; set; } = false; - - /// - /// Enables root motion extraction support from this animation. - /// - [EditorDisplay("Animation"), VisibleIf(nameof(ShowAnimation))] - [EditorOrder(1060), DefaultValue(false)] - public bool EnableRootMotion { get; set; } = false; - - /// - /// The custom node name to be used as a root motion source. If not specified the actual root node will be used. - /// - [EditorDisplay("Animation"), VisibleIf(nameof(ShowAnimation))] - [EditorOrder(1070), DefaultValue(typeof(string), "")] - public string RootNodeName { get; set; } - - /// - /// If checked, the importer will generate a sequence of LODs based on the base LOD index. - /// - [EditorDisplay("Level Of Detail", "Generate LODs"), VisibleIf(nameof(ShowGeometry))] - [EditorOrder(1100), DefaultValue(false)] - public bool GenerateLODs { get; set; } = false; - - /// - /// The index of the LOD from the source model data to use as a reference for following LODs generation. - /// - [EditorDisplay("Level Of Detail", "Base LOD"), VisibleIf(nameof(ShowGeometry))] - [EditorOrder(1110), DefaultValue(0), Limit(0, Model.MaxLODs - 1)] - public int BaseLOD { get; set; } = 0; - - /// - /// The amount of LODs to include in the model (all remaining ones starting from Base LOD will be generated). - /// - [EditorDisplay("Level Of Detail", "LOD Count"), VisibleIf(nameof(ShowGeometry))] - [EditorOrder(1120), DefaultValue(4), Limit(1, Model.MaxLODs)] - public int LODCount { get; set; } = 4; - - /// - /// The target amount of triangles for the generated LOD (based on the higher LOD). Normalized to range 0-1. For instance 0.4 cuts the triangle count to 40%. - /// - [EditorDisplay("Level Of Detail"), VisibleIf(nameof(ShowGeometry))] - [EditorOrder(1130), DefaultValue(0.5f), Limit(0, 1, 0.001f)] - public float TriangleReduction { get; set; } = 0.5f; - - /// - /// If checked, the importer will create materials for model meshes as specified in the file. - /// - [EditorDisplay("Materials"), VisibleIf(nameof(ShowGeometry))] - [EditorOrder(400), DefaultValue(true)] - public bool ImportMaterials { get; set; } = true; - - /// - /// If checked, the importer will import texture files used by the model and any embedded texture resources. - /// - [EditorDisplay("Materials"), VisibleIf(nameof(ShowGeometry))] - [EditorOrder(410), DefaultValue(true)] - public bool ImportTextures { get; set; } = true; - - /// - /// If checked, the importer will try to restore the model material slots. - /// - [EditorDisplay("Materials", "Restore Materials On Reimport"), VisibleIf(nameof(ShowGeometry))] - [EditorOrder(420), DefaultValue(true)] - public bool RestoreMaterialsOnReimport { get; set; } = true; - - /// - /// If checked, enables generation of Signed Distance Field (SDF). - /// - [EditorDisplay("SDF"), VisibleIf(nameof(ShowModel))] - [EditorOrder(1500), DefaultValue(false)] - public bool GenerateSDF { get; set; } = false; - - /// - /// Resolution scale for generated Signed Distance Field (SDF) texture. Higher values improve accuracy but increase memory usage and reduce performance. - /// - [EditorDisplay("SDF"), VisibleIf(nameof(ShowModel))] - [EditorOrder(1510), DefaultValue(1.0f), Limit(0.0001f, 100.0f)] - public float SDFResolution { get; set; } = 1.0f; - - /// - /// If checked, the imported mesh/animations are splitted into separate assets. Used if ObjectIndex is set to -1. - /// - [EditorOrder(2000), DefaultValue(false), EditorDisplay("Splitting")] - public bool SplitObjects { get; set; } = false; - - /// - /// The zero-based index for the mesh/animation clip to import. If the source file has more than one mesh/animation it can be used to pick a desire object. Default -1 imports all objects. - /// - [EditorOrder(2010), DefaultValue(-1), EditorDisplay("Splitting")] - public int ObjectIndex { get; set; } = -1; - - private bool ShowGeometry => Type == ModelType.Model || Type == ModelType.SkinnedModel; - private bool ShowModel => Type == ModelType.Model; - private bool ShowSkinnedModel => Type == ModelType.SkinnedModel; - private bool ShowAnimation => Type == ModelType.Animation; - - [StructLayout(LayoutKind.Sequential)] - internal struct InternalOptions - { - public ModelType Type; - - // Geometry - public byte CalculateNormals; - public float SmoothingNormalsAngle; - public byte FlipNormals; - public float SmoothingTangentsAngle; - public byte CalculateTangents; - public byte OptimizeMeshes; - public byte MergeMeshes; - public byte ImportLODs; - public byte ImportVertexColors; - public byte ImportBlendShapes; - public ModelLightmapUVsSource LightmapUVsSource; - public string CollisionMeshesPrefix; - - // Transform - public float Scale; - public Quaternion Rotation; - public Float3 Translation; - public byte CenterGeometry; - - // Animation - public AnimationDuration Duration; - public float FramesRangeStart; - public float FramesRangeEnd; - public float DefaultFrameRate; - public float SamplingRate; - public byte SkipEmptyCurves; - public byte OptimizeKeyframes; - public byte ImportScaleTracks; - public byte EnableRootMotion; - public string RootNodeName; - - // Level Of Detail - public byte GenerateLODs; - public int BaseLOD; - public int LODCount; - public float TriangleReduction; - - // Misc - public byte ImportMaterials; - public byte ImportTextures; - public byte RestoreMaterialsOnReimport; - - // SDF - public byte GenerateSDF; - public float SDFResolution; - - // Splitting - public byte SplitObjects; - public int ObjectIndex; - } - - internal void ToInternal(out InternalOptions options) - { - options = new InternalOptions - { - Type = Type, - CalculateNormals = (byte)(CalculateNormals ? 1 : 0), - SmoothingNormalsAngle = SmoothingNormalsAngle, - FlipNormals = (byte)(FlipNormals ? 1 : 0), - SmoothingTangentsAngle = SmoothingTangentsAngle, - CalculateTangents = (byte)(CalculateTangents ? 1 : 0), - OptimizeMeshes = (byte)(OptimizeMeshes ? 1 : 0), - MergeMeshes = (byte)(MergeMeshes ? 1 : 0), - ImportLODs = (byte)(ImportLODs ? 1 : 0), - ImportVertexColors = (byte)(ImportVertexColors ? 1 : 0), - ImportBlendShapes = (byte)(ImportBlendShapes ? 1 : 0), - LightmapUVsSource = LightmapUVsSource, - CollisionMeshesPrefix = CollisionMeshesPrefix, - Scale = Scale, - Rotation = Rotation, - Translation = Translation, - CenterGeometry = (byte)(CenterGeometry ? 1 : 0), - Duration = Duration, - FramesRangeStart = FramesRangeStart, - FramesRangeEnd = FramesRangeEnd, - DefaultFrameRate = DefaultFrameRate, - SamplingRate = SamplingRate, - SkipEmptyCurves = (byte)(SkipEmptyCurves ? 1 : 0), - OptimizeKeyframes = (byte)(OptimizeKeyframes ? 1 : 0), - ImportScaleTracks = (byte)(ImportScaleTracks ? 1 : 0), - EnableRootMotion = (byte)(EnableRootMotion ? 1 : 0), - RootNodeName = RootNodeName, - GenerateLODs = (byte)(GenerateLODs ? 1 : 0), - BaseLOD = BaseLOD, - LODCount = LODCount, - TriangleReduction = TriangleReduction, - ImportMaterials = (byte)(ImportMaterials ? 1 : 0), - ImportTextures = (byte)(ImportTextures ? 1 : 0), - RestoreMaterialsOnReimport = (byte)(RestoreMaterialsOnReimport ? 1 : 0), - GenerateSDF = (byte)(GenerateSDF ? 1 : 0), - SDFResolution = SDFResolution, - SplitObjects = (byte)(SplitObjects ? 1 : 0), - ObjectIndex = ObjectIndex, - }; - } - - internal void FromInternal(ref InternalOptions options) - { - Type = options.Type; - CalculateNormals = options.CalculateNormals != 0; - SmoothingNormalsAngle = options.SmoothingNormalsAngle; - FlipNormals = options.FlipNormals != 0; - SmoothingTangentsAngle = options.SmoothingTangentsAngle; - CalculateTangents = options.CalculateTangents != 0; - OptimizeMeshes = options.OptimizeMeshes != 0; - MergeMeshes = options.MergeMeshes != 0; - ImportLODs = options.ImportLODs != 0; - ImportVertexColors = options.ImportVertexColors != 0; - ImportBlendShapes = options.ImportBlendShapes != 0; - LightmapUVsSource = options.LightmapUVsSource; - CollisionMeshesPrefix = options.CollisionMeshesPrefix; - Scale = options.Scale; - Rotation = options.Rotation; - Translation = options.Translation; - CenterGeometry = options.CenterGeometry != 0; - FramesRangeStart = options.FramesRangeStart; - FramesRangeEnd = options.FramesRangeEnd; - DefaultFrameRate = options.DefaultFrameRate; - SamplingRate = options.SamplingRate; - SkipEmptyCurves = options.SkipEmptyCurves != 0; - OptimizeKeyframes = options.OptimizeKeyframes != 0; - ImportScaleTracks = options.ImportScaleTracks != 0; - EnableRootMotion = options.EnableRootMotion != 0; - RootNodeName = options.RootNodeName; - GenerateLODs = options.GenerateLODs != 0; - BaseLOD = options.BaseLOD; - LODCount = options.LODCount; - TriangleReduction = options.TriangleReduction; - ImportMaterials = options.ImportMaterials != 0; - ImportTextures = options.ImportTextures != 0; - RestoreMaterialsOnReimport = options.RestoreMaterialsOnReimport != 0; - GenerateSDF = options.GenerateSDF != 0; - SDFResolution = options.SDFResolution; - SplitObjects = options.SplitObjects != 0; - ObjectIndex = options.ObjectIndex; - } - - /// - /// Tries the restore the asset import options from the target resource file. Applies the project default options too. - /// - /// The options. - /// The asset path. - /// True settings has been restored, otherwise false. - public static void TryRestore(ref ModelImportSettings options, string assetPath) - { - ModelImportEntry.Internal_GetModelImportOptions(assetPath, out var internalOptions); - options.FromInternal(ref internalOptions); - } + [EditorDisplay(null, EditorDisplayAttribute.InlineStyle)] + public ModelTool.Options Settings = ModelTool.Options.Default; } /// @@ -523,7 +61,7 @@ namespace FlaxEditor.Content.Import /// public class ModelImportEntry : AssetImportEntry { - private ModelImportSettings _settings = new ModelImportSettings(); + private ModelImportSettings _settings = new(); /// /// Initializes a new instance of the class. @@ -533,7 +71,7 @@ namespace FlaxEditor.Content.Import : base(ref request) { // Try to restore target asset model import options (useful for fast reimport) - ModelImportSettings.TryRestore(ref _settings, ResultUrl); + Editor.TryRestoreImportOptions(ref _settings.Settings, ResultUrl); } /// @@ -542,9 +80,14 @@ namespace FlaxEditor.Content.Import /// public override bool TryOverrideSettings(object settings) { - if (settings is ModelImportSettings o) + if (settings is ModelImportSettings s) { - _settings = o; + _settings.Settings = s.Settings; + return true; + } + if (settings is ModelTool.Options o) + { + _settings.Settings = o; return true; } return false; @@ -553,14 +96,7 @@ namespace FlaxEditor.Content.Import /// public override bool Import() { - return Editor.Import(SourceUrl, ResultUrl, _settings); + return Editor.Import(SourceUrl, ResultUrl, _settings.Settings); } - - #region Internal Calls - - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_GetModelImportOptions(string path, out ModelImportSettings.InternalOptions result); - - #endregion } } diff --git a/Source/Editor/Content/Import/TextureImportEntry.cs b/Source/Editor/Content/Import/TextureImportEntry.cs index 33baf6c69..00cd56d24 100644 --- a/Source/Editor/Content/Import/TextureImportEntry.cs +++ b/Source/Editor/Content/Import/TextureImportEntry.cs @@ -3,56 +3,94 @@ using System.Collections.Generic; using System.ComponentModel; using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; +using FlaxEditor.CustomEditors.Editors; +using FlaxEditor.Scripting; using FlaxEngine; +using FlaxEngine.Tools; -// ReSharper disable InconsistentNaming +namespace FlaxEngine.Tools +{ + partial class TextureTool + { + partial struct Options + { +#pragma warning disable CS1591 + public enum CustomMaxSizes + { + _32 = 32, + _64 = 64, + _128 = 128, + _256 = 256, + _512 = 512, + _1024 = 1024, + _2048 = 2048, + _4096 = 4096, + _8192 = 8192, + _16384 = 16384, + } +#pragma warning restore CS1591 + + /// + /// The size of the imported texture. If Resize property is set to true then texture will be resized during the import to this value. Otherwise it will be ignored. + /// + [EditorOrder(110), VisibleIf(nameof(Resize)), DefaultValue(typeof(Int2), "1024,1024")] + public Int2 Size + { + get => new Int2(SizeX, SizeY); + set + { + SizeX = value.X; + SizeY = value.Y; + } + } + + /// + /// Maximum size of the texture (for both width and height). Higher resolution textures will be resized during importing process. + /// + [EditorOrder(90), DefaultValue(CustomMaxSizes._8192), EditorDisplay(null, "Max Size")] + public CustomMaxSizes CustomMaxSize + { + get + { + var value = MaxSize; + if (!Mathf.IsPowerOfTwo(value)) + value = Mathf.NextPowerOfTwo(value); + FieldInfo[] fields = typeof(CustomMaxSizes).GetFields(); + for (int i = 0; i < fields.Length; i++) + { + var field = fields[i]; + if (field.Name.Equals("value__")) + continue; + if (value == (int)field.GetRawConstantValue()) + return (CustomMaxSizes)value; + } + return CustomMaxSizes._8192; + } + set => MaxSize = (int)value; + } + } + } +} + +namespace FlaxEditor.CustomEditors.Dedicated +{ + /// + /// Custom editor for . + /// + [CustomEditor(typeof(FlaxEngine.Tools.TextureTool.Options)), DefaultEditor] + public class TextureToolOptionsEditor : GenericEditor + { + /// + protected override List GetItemsForType(ScriptType type) + { + // Show both fields and properties + return GetItemsForType(type, true, true); + } + } +} namespace FlaxEditor.Content.Import { - /// - /// Texture format types. - /// - [HideInEditor] - public enum TextureFormatType : byte - { - /// - /// The unknown. - /// - Unknown = 0, - - /// - /// The color with RGB channels. - /// - ColorRGB = 1, - - /// - /// The color with RGBA channels. - /// - ColorRGBA = 2, - - /// - /// The normal map (packed and compressed). - /// - NormalMap = 3, - - /// - /// The gray scale (R channel). - /// - GrayScale = 4, - - /// - /// The HDR color (RGBA channels). - /// - HdrRGBA = 5, - - /// - /// The HDR color (RGB channels). - /// - HdrRGB = 6 - } - /// /// Proxy object to present texture import settings in . /// @@ -60,346 +98,10 @@ namespace FlaxEditor.Content.Import public class TextureImportSettings { /// - /// A custom version of for GUI. + /// The settings data. /// - public enum CustomTextureFormatType - { - /// - /// The color with RGB channels. - /// - ColorRGB = 1, - - /// - /// The color with RGBA channels. - /// - ColorRGBA = 2, - - /// - /// The normal map (packed and compressed). - /// - NormalMap = 3, - - /// - /// The gray scale (R channel). - /// - GrayScale = 4, - - /// - /// The HDR color (RGBA channels). - /// - HdrRGBA = 5, - - /// - /// The HDR color (RGB channels). - /// - HdrRGB = 6 - } - - /// - /// A custom set of max texture import sizes. - /// - public enum CustomMaxSizeType - { - /// - /// The 32. - /// - _32 = 32, - - /// - /// The 64. - /// - _64 = 64, - - /// - /// The 128. - /// - _128 = 128, - - /// - /// The 256. - /// - _256 = 256, - - /// - /// The 512. - /// - _512 = 512, - - /// - /// The 1024. - /// - _1024 = 1024, - - /// - /// The 2048. - /// - _2048 = 2048, - - /// - /// The 4096. - /// - _4096 = 4096, - - /// - /// The 8192. - /// - _8192 = 8192, - } - - /// - /// Converts the maximum size to enum. - /// - /// The max size. - /// The converted enum. - public static CustomMaxSizeType ConvertMaxSize(int f) - { - if (!Mathf.IsPowerOfTwo(f)) - f = Mathf.NextPowerOfTwo(f); - - FieldInfo[] fields = typeof(CustomMaxSizeType).GetFields(); - for (int i = 0; i < fields.Length; i++) - { - var field = fields[i]; - if (field.Name.Equals("value__")) - continue; - - if (f == (int)field.GetRawConstantValue()) - return (CustomMaxSizeType)f; - } - - return CustomMaxSizeType._8192; - } - - /// - /// The sprite info. - /// - [StructLayout(LayoutKind.Sequential)] - public struct SpriteInfo - { - /// - /// The sprite area. - /// - public Rectangle Area; - - /// - /// The sprite name. - /// - public string Name; - - /// - /// Initializes a new instance of the struct. - /// - /// The area. - /// The name. - public SpriteInfo(Rectangle area, string name) - { - Area = area; - Name = name; - } - } - - /// - /// Texture format type - /// - [EditorOrder(0), DefaultValue(CustomTextureFormatType.ColorRGB), Tooltip("Texture import format type")] - public CustomTextureFormatType Type { get; set; } = CustomTextureFormatType.ColorRGB; - - /// - /// True if texture should be imported as a texture atlas resource - /// - [EditorOrder(10), DefaultValue(false), Tooltip("True if texture should be imported as a texture atlas (with sprites)")] - public bool IsAtlas { get; set; } - - /// - /// True if disable dynamic texture streaming - /// - [EditorOrder(20), DefaultValue(false), Tooltip("True if disable dynamic texture streaming")] - public bool NeverStream { get; set; } - - /// - /// Enables/disables texture data compression. - /// - [EditorOrder(30), DefaultValue(true), Tooltip("True if compress texture data")] - public bool Compress { get; set; } = true; - - /// - /// True if texture channels have independent data - /// - [EditorOrder(40), DefaultValue(false), Tooltip("True if texture channels have independent data (for compression methods)")] - public bool IndependentChannels { get; set; } - - /// - /// True if use sRGB format for texture data. Recommended for color maps and diffuse color textures. - /// - [EditorOrder(50), DefaultValue(false), EditorDisplay(null, "sRGB"), Tooltip("True if use sRGB format for texture data. Recommended for color maps and diffuse color textures.")] - public bool sRGB { get; set; } - - /// - /// True if generate mip maps chain for the texture. - /// - [EditorOrder(60), DefaultValue(true), Tooltip("True if generate mip maps chain for the texture")] - public bool GenerateMipMaps { get; set; } = true; - - /// - /// True if flip Y coordinate of the texture. - /// - [EditorOrder(65), DefaultValue(false), EditorDisplay(null, "Flip Y"), Tooltip("True if flip Y coordinate of the texture.")] - public bool FlipY { get; set; } = false; - - /// - /// The import texture scale. - /// - [EditorOrder(70), DefaultValue(1.0f), Tooltip("Texture scale. Default is 1.")] - public float Scale { get; set; } = 1.0f; - - /// - /// Maximum size of the texture (for both width and height). - /// Higher resolution textures will be resized during importing process. - /// - [EditorOrder(80), DefaultValue(CustomMaxSizeType._8192), Tooltip("Maximum texture size (will be resized if need to)")] - public CustomMaxSizeType MaxSize { get; set; } = CustomMaxSizeType._8192; - - /// - /// True if resize texture on import. Use Size property to define texture width and height. Texture scale property will be ignored. - /// - [EditorOrder(90), DefaultValue(false), Tooltip("True if resize texture on import. Use Size property to define texture width and height. Texture scale property will be ignored.")] - public bool Resize { get; set; } = false; - - /// - /// Gets or sets the size of the imported texture. If Resize property is set to true then texture will be resized during the import to this value. Otherwise it will be ignored. - /// - [EditorOrder(100), VisibleIf("Resize"), DefaultValue(typeof(Int2), "1024,1024"), Tooltip("The size of the imported texture. If Resize property is set to true then texture will be resized during the import to this value. Otherwise it will be ignored.")] - public Int2 Size { get; set; } = new Int2(1024, 1024); - - /// - /// True if preserve alpha coverage in generated mips for alpha test reference. Scales mipmap alpha values to preserve alpha coverage based on an alpha test reference value. - /// - [EditorOrder(240), DefaultValue(false), Tooltip("Check to preserve alpha coverage in generated mips for alpha test reference. Scales mipmap alpha values to preserve alpha coverage based on an alpha test reference value.")] - public bool PreserveAlphaCoverage { get; set; } = false; - - /// - /// The reference value for the alpha coverage preserving. - /// - [EditorOrder(250), VisibleIf("PreserveAlphaCoverage"), DefaultValue(0.5f), Tooltip("The reference value for the alpha coverage preserving.")] - public float PreserveAlphaCoverageReference { get; set; } = 0.5f; - - /// - /// Texture group for streaming (negative if unused). See Streaming Settings. - /// - [CustomEditor(typeof(CustomEditors.Dedicated.TextureGroupEditor))] - [EditorOrder(300), Tooltip("Texture group for streaming (negative if unused). See Streaming Settings.")] - public int TextureGroup = -1; - - /// - /// The sprites. Used to keep created sprites on sprite atlas reimport. - /// - [HideInEditor] - public List Sprites = new List(); - - [StructLayout(LayoutKind.Sequential)] - internal struct InternalOptions - { - public TextureFormatType Type; - public byte IsAtlas; - public byte NeverStream; - public byte Compress; - public byte IndependentChannels; - public byte sRGB; - public byte GenerateMipMaps; - public byte FlipY; - public byte Resize; - public byte PreserveAlphaCoverage; - public float PreserveAlphaCoverageReference; - public float Scale; - public int MaxSize; - public int TextureGroup; - public Int2 Size; - public Rectangle[] SpriteAreas; - public string[] SpriteNames; - } - - internal void ToInternal(out InternalOptions options) - { - options = new InternalOptions - { - Type = (TextureFormatType)(int)Type, - IsAtlas = (byte)(IsAtlas ? 1 : 0), - NeverStream = (byte)(NeverStream ? 1 : 0), - Compress = (byte)(Compress ? 1 : 0), - IndependentChannels = (byte)(IndependentChannels ? 1 : 0), - sRGB = (byte)(sRGB ? 1 : 0), - GenerateMipMaps = (byte)(GenerateMipMaps ? 1 : 0), - FlipY = (byte)(FlipY ? 1 : 0), - Resize = (byte)(Resize ? 1 : 0), - PreserveAlphaCoverage = (byte)(PreserveAlphaCoverage ? 1 : 0), - PreserveAlphaCoverageReference = PreserveAlphaCoverageReference, - Scale = Scale, - Size = Size, - MaxSize = (int)MaxSize, - TextureGroup = TextureGroup, - }; - if (Sprites != null && Sprites.Count > 0) - { - int count = Sprites.Count; - options.SpriteAreas = new Rectangle[count]; - options.SpriteNames = new string[count]; - for (int i = 0; i < count; i++) - { - options.SpriteAreas[i] = Sprites[i].Area; - options.SpriteNames[i] = Sprites[i].Name; - } - } - else - { - options.SpriteAreas = null; - options.SpriteNames = null; - } - } - - internal void FromInternal(ref InternalOptions options) - { - Type = (CustomTextureFormatType)(int)options.Type; - IsAtlas = options.IsAtlas != 0; - NeverStream = options.NeverStream != 0; - Compress = options.Compress != 0; - IndependentChannels = options.IndependentChannels != 0; - sRGB = options.sRGB != 0; - GenerateMipMaps = options.GenerateMipMaps != 0; - FlipY = options.FlipY != 0; - Resize = options.Resize != 0; - PreserveAlphaCoverage = options.PreserveAlphaCoverage != 0; - PreserveAlphaCoverageReference = options.PreserveAlphaCoverageReference; - Scale = options.Scale; - MaxSize = ConvertMaxSize(options.MaxSize); - TextureGroup = options.TextureGroup; - Size = options.Size; - if (options.SpriteAreas != null) - { - int spritesCount = options.SpriteAreas.Length; - Sprites.Capacity = spritesCount; - for (int i = 0; i < spritesCount; i++) - { - Sprites.Add(new SpriteInfo(options.SpriteAreas[i], options.SpriteNames[i])); - } - } - } - - /// - /// Tries the restore the asset import options from the target resource file. - /// - /// The options. - /// The asset path. - /// True settings has been restored, otherwise false. - public static bool TryRestore(ref TextureImportSettings options, string assetPath) - { - if (TextureImportEntry.Internal_GetTextureImportOptions(assetPath, out var internalOptions)) - { - // Restore settings - options.FromInternal(ref internalOptions); - return true; - } - return false; - } + [EditorDisplay(null, EditorDisplayAttribute.InlineStyle)] + public TextureTool.Options Settings = TextureTool.Options.Default; } /// @@ -408,7 +110,7 @@ namespace FlaxEditor.Content.Import /// public class TextureImportEntry : AssetImportEntry { - private TextureImportSettings _settings = new TextureImportSettings(); + private TextureImportSettings _settings = new(); /// /// Initializes a new instance of the class. @@ -423,15 +125,15 @@ namespace FlaxEditor.Content.Import if (extension == ".raw") { // Raw image data in 16bit gray-scale, preserve the quality - _settings.Type = TextureImportSettings.CustomTextureFormatType.HdrRGBA; - _settings.Compress = false; + _settings.Settings.Type = TextureFormatType.HdrRGBA; + _settings.Settings.Compress = false; } else if (extension == ".hdr") { // HDR sky texture - _settings.Type = TextureImportSettings.CustomTextureFormatType.HdrRGB; + _settings.Settings.Type = TextureFormatType.HdrRGB; } - else if (_settings.Type != TextureImportSettings.CustomTextureFormatType.ColorRGB) + else if (_settings.Settings.Type != TextureFormatType.ColorRGB) { // Skip checking } @@ -443,7 +145,7 @@ namespace FlaxEditor.Content.Import || snl.EndsWith("normals")) { // Normal map - _settings.Type = TextureImportSettings.CustomTextureFormatType.NormalMap; + _settings.Settings.Type = TextureFormatType.NormalMap; } else if (snl.EndsWith("_d") || snl.Contains("diffuse") @@ -454,8 +156,8 @@ namespace FlaxEditor.Content.Import || snl.Contains("albedo")) { // Albedo or diffuse map - _settings.Type = TextureImportSettings.CustomTextureFormatType.ColorRGB; - _settings.sRGB = true; + _settings.Settings.Type = TextureFormatType.ColorRGB; + _settings.Settings.sRGB = true; } else if (snl.EndsWith("ao") || snl.EndsWith("ambientocclusion") @@ -478,11 +180,11 @@ namespace FlaxEditor.Content.Import || snl.EndsWith("metallic")) { // Glossiness, metalness, ambient occlusion, displacement, height, cavity or specular - _settings.Type = TextureImportSettings.CustomTextureFormatType.GrayScale; + _settings.Settings.Type = TextureFormatType.GrayScale; } // Try to restore target asset texture import options (useful for fast reimport) - TextureImportSettings.TryRestore(ref _settings, ResultUrl); + Editor.TryRestoreImportOptions(ref _settings.Settings, ResultUrl); } /// @@ -491,11 +193,18 @@ namespace FlaxEditor.Content.Import /// public override bool TryOverrideSettings(object settings) { - if (settings is TextureImportSettings o) + if (settings is TextureImportSettings s) { - var sprites = o.Sprites ?? _settings.Sprites; // Preserve sprites if not specified to override - _settings = o; - _settings.Sprites = sprites; + var sprites = s.Settings.Sprites ?? _settings.Settings.Sprites; // Preserve sprites if not specified to override + _settings.Settings = s.Settings; + _settings.Settings.Sprites = sprites; + return true; + } + if (settings is TextureTool.Options o) + { + var sprites = o.Sprites ?? _settings.Settings.Sprites; // Preserve sprites if not specified to override + _settings.Settings = o; + _settings.Settings.Sprites = sprites; return true; } return false; @@ -504,14 +213,7 @@ namespace FlaxEditor.Content.Import /// public override bool Import() { - return Editor.Import(SourceUrl, ResultUrl, _settings); + return Editor.Import(SourceUrl, ResultUrl, _settings.Settings); } - - #region Internal Calls - - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_GetTextureImportOptions(string path, out TextureImportSettings.InternalOptions result); - - #endregion } } diff --git a/Source/Editor/Content/Items/AssetItem.cs b/Source/Editor/Content/Items/AssetItem.cs index c85a2c557..bbff4cb0c 100644 --- a/Source/Editor/Content/Items/AssetItem.cs +++ b/Source/Editor/Content/Items/AssetItem.cs @@ -88,6 +88,15 @@ namespace FlaxEditor.Content } } + /// + /// Loads the asset. + /// + /// The asset object. + public Asset LoadAsync() + { + return FlaxEngine.Content.LoadAsync(ID); + } + /// /// Reloads the asset (if it's loaded). /// diff --git a/Source/Editor/Content/Items/VisualScriptItem.cs b/Source/Editor/Content/Items/VisualScriptItem.cs index 6638c2c67..4ae4d06ba 100644 --- a/Source/Editor/Content/Items/VisualScriptItem.cs +++ b/Source/Editor/Content/Items/VisualScriptItem.cs @@ -8,6 +8,7 @@ using System.Reflection; using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.Json; +using FlaxEngine.Utilities; using Object = FlaxEngine.Object; namespace FlaxEditor.Content @@ -134,7 +135,7 @@ namespace FlaxEditor.Content _index = index; type.Asset.GetMethodSignature(index, out _name, out _flags, out var returnTypeName, out var paramNames, out var paramTypeNames, out var paramOuts); _returnType = TypeUtils.GetType(returnTypeName); - if (paramNames.Length != 0) + if (paramNames != null && paramNames.Length != 0) { _parameters = new ScriptMemberInfo.Parameter[paramNames.Length]; for (int i = 0; i < _parameters.Length; i++) @@ -310,7 +311,10 @@ namespace FlaxEditor.Content internal void Dispose() { - OnAssetReloading(_asset); + if (_parameters != null) + { + OnAssetReloading(_asset); + } _asset = null; } diff --git a/Source/Editor/Content/Proxy/BinaryAssetProxy.cs b/Source/Editor/Content/Proxy/BinaryAssetProxy.cs index dcd8fd68a..9924ff19f 100644 --- a/Source/Editor/Content/Proxy/BinaryAssetProxy.cs +++ b/Source/Editor/Content/Proxy/BinaryAssetProxy.cs @@ -2,6 +2,7 @@ using System; using FlaxEngine; +using FlaxEngine.Utilities; namespace FlaxEditor.Content { @@ -42,7 +43,7 @@ namespace FlaxEditor.Content /// public override AssetItem ConstructItem(string path, string typeName, ref Guid id) { - var type = Scripting.TypeUtils.GetType(typeName).Type; + var type = TypeUtils.GetType(typeName).Type; if (typeof(TextureBase).IsAssignableFrom(type)) return new TextureAssetItem(path, ref id, typeName, type); diff --git a/Source/Editor/Content/Proxy/SkinnedModelProxy.cs b/Source/Editor/Content/Proxy/SkinnedModelProxy.cs index a500bc48e..f0193d0d0 100644 --- a/Source/Editor/Content/Proxy/SkinnedModelProxy.cs +++ b/Source/Editor/Content/Proxy/SkinnedModelProxy.cs @@ -59,7 +59,10 @@ namespace FlaxEditor.Content // Check if asset is streamed enough var asset = (SkinnedModel)request.Asset; - return asset.LoadedLODs >= Mathf.Max(1, (int)(asset.LODs.Length * ThumbnailsModule.MinimumRequiredResourcesQuality)); + var lods = asset.LODs.Length; + if (asset.IsLoaded && lods == 0) + return true; // Skeleton-only model + return asset.LoadedLODs >= Mathf.Max(1, (int)(lods * ThumbnailsModule.MinimumRequiredResourcesQuality)); } /// diff --git a/Source/Editor/Content/Proxy/VisualScriptProxy.cs b/Source/Editor/Content/Proxy/VisualScriptProxy.cs index ff2d8df65..c4fc804ae 100644 --- a/Source/Editor/Content/Proxy/VisualScriptProxy.cs +++ b/Source/Editor/Content/Proxy/VisualScriptProxy.cs @@ -8,6 +8,7 @@ using FlaxEditor.Windows; using FlaxEditor.Windows.Assets; using FlaxEngine; using FlaxEngine.Json; +using FlaxEngine.Utilities; namespace FlaxEditor.Content { diff --git a/Source/Editor/Cooker/CookingData.h b/Source/Editor/Cooker/CookingData.h index bf6b0123a..51a3fcd79 100644 --- a/Source/Editor/Cooker/CookingData.h +++ b/Source/Editor/Cooker/CookingData.h @@ -115,9 +115,19 @@ API_ENUM() enum class BuildPlatform /// API_ENUM(Attributes="EditorDisplay(null, \"Mac x64\")") MacOSx64 = 12, -}; -extern FLAXENGINE_API const Char* ToString(const BuildPlatform platform); + /// + /// MacOS (ARM64 Apple Silicon) + /// + API_ENUM(Attributes="EditorDisplay(null, \"Mac ARM64\")") + MacOSARM64 = 13, + + /// + /// iOS (ARM64) + /// + API_ENUM(Attributes="EditorDisplay(null, \"iOS ARM64\")") + iOSARM64 = 14, +}; /// /// Game build configuration modes. @@ -140,7 +150,35 @@ API_ENUM() enum class BuildConfiguration Release = 2, }; +/// +/// .NET Ahead of Time Compilation (AOT) modes. +/// +enum class DotNetAOTModes +{ + /// + /// AOT is not used. + /// + None, + + /// + /// Use .NET Native IL Compiler (shorten as ILC) to convert all C# assemblies in native platform executable binary. + /// + ILC, + + /// + /// Use Mono AOT to cross-compile all used C# assemblies into native platform shared libraries. + /// + MonoAOTDynamic, + + /// + /// Use Mono AOT to cross-compile all used C# assemblies into native platform static libraries which can be linked into a single shared library. + /// + MonoAOTStatic, +}; + +extern FLAXENGINE_API const Char* ToString(const BuildPlatform platform); extern FLAXENGINE_API const Char* ToString(const BuildConfiguration configuration); +extern FLAXENGINE_API const Char* ToString(const DotNetAOTModes mode); #define BUILD_STEP_CANCEL_CHECK if (GameCooker::IsCancelRequested()) return true @@ -188,7 +226,7 @@ public: API_FIELD(ReadOnly) String OriginalOutputPath; /// - /// The output path for data files (Content, Mono, etc.). + /// The output path for data files (Content, Dotnet, Mono, etc.). /// API_FIELD(ReadOnly) String DataOutputPath; @@ -300,15 +338,18 @@ public: /// /// Gets the absolute path to the Platform Data folder that contains the binary files used by the current build configuration. /// - /// The platform data folder path. String GetGameBinariesPath() const; /// /// Gets the absolute path to the platform folder that contains the dependency files used by the current build configuration. /// - /// The platform deps folder path. String GetPlatformBinariesRoot() const; + /// + /// Gets the name of the platform and architecture for the current BuildPlatform. + /// + void GetBuildPlatformName(const Char*& platform, const Char*& architecture) const; + public: /// @@ -368,17 +409,15 @@ public: public: - void Error(const String& msg); + void Error(const StringView& msg); + + void Error(const String& msg) + { + Error(StringView(msg)); + } void Error(const Char* msg) { - Error(String(msg)); - } - - template - void Error(const Char* format, const Args& ... args) - { - const String msg = String::Format(format, args...); - Error(msg); + Error(StringView(msg)); } }; diff --git a/Source/Editor/Cooker/GameCooker.cpp b/Source/Editor/Cooker/GameCooker.cpp index 15ea13153..52550128e 100644 --- a/Source/Editor/Cooker/GameCooker.cpp +++ b/Source/Editor/Cooker/GameCooker.cpp @@ -3,9 +3,10 @@ #include "GameCooker.h" #include "PlatformTools.h" #include "FlaxEngine.Gen.h" -#include "Engine/Scripting/MainThreadManagedInvokeAction.h" #include "Engine/Scripting/ManagedCLR/MTypes.h" #include "Engine/Scripting/ManagedCLR/MClass.h" +#include "Engine/Scripting/ManagedCLR/MException.h" +#include "Engine/Scripting/Internal/MainThreadManagedInvokeAction.h" #include "Engine/Scripting/Scripting.h" #include "Engine/Scripting/ScriptingType.h" #include "Engine/Scripting/BinaryModule.h" @@ -23,12 +24,12 @@ #include "Steps/CookAssetsStep.h" #include "Steps/PostProcessStep.h" #include "Engine/Platform/ConditionVariable.h" +#include "Engine/Platform/CreateProcessSettings.h" #include "Engine/Scripting/ManagedCLR/MDomain.h" #include "Engine/Scripting/ManagedCLR/MCore.h" #include "Engine/Scripting/ManagedCLR/MAssembly.h" #include "Engine/Content/JsonAsset.h" #include "Engine/Content/AssetReference.h" -#include "Engine/Scripting/MException.h" #if PLATFORM_TOOLS_WINDOWS #include "Platform/Windows/WindowsPlatformTools.h" #include "Engine/Platform/Windows/WindowsPlatformSettings.h" @@ -63,6 +64,10 @@ #include "Platform/Mac/MacPlatformTools.h" #include "Engine/Platform/Mac/MacPlatformSettings.h" #endif +#if PLATFORM_TOOLS_IOS +#include "Platform/iOS/iOSPlatformTools.h" +#include "Engine/Platform/iOS/iOSPlatformSettings.h" +#endif namespace GameCookerImpl { @@ -139,8 +144,12 @@ const Char* ToString(const BuildPlatform platform) return TEXT("PlayStation 5"); case BuildPlatform::MacOSx64: return TEXT("Mac x64"); + case BuildPlatform::MacOSARM64: + return TEXT("Mac ARM64"); + case BuildPlatform::iOSARM64: + return TEXT("iOS ARM64"); default: - return TEXT("?"); + return TEXT(""); } } @@ -155,10 +164,37 @@ const Char* ToString(const BuildConfiguration configuration) case BuildConfiguration::Release: return TEXT("Release"); default: - return TEXT("?"); + return TEXT(""); } } +const Char* ToString(const DotNetAOTModes mode) +{ + switch (mode) + { + case DotNetAOTModes::None: + return TEXT("None"); + case DotNetAOTModes::ILC: + return TEXT("ILC"); + case DotNetAOTModes::MonoAOTDynamic: + return TEXT("MonoAOTDynamic"); + case DotNetAOTModes::MonoAOTStatic: + return TEXT("MonoAOTStatic"); + default: + return TEXT(""); + } +} + +bool PlatformTools::IsNativeCodeFile(CookingData& data, const String& file) +{ + const String filename = StringUtils::GetFileName(file); + if (filename.Contains(TEXT(".CSharp")) || + filename.Contains(TEXT("Newtonsoft.Json"))) + return false; + // TODO: maybe use Mono.Cecil via Flax.Build to read assembly image metadata and check if it contains C#? + return true; +} + bool CookingData::AssetTypeStatistics::operator<(const AssetTypeStatistics& other) const { if (ContentSize != other.ContentSize) @@ -211,6 +247,71 @@ String CookingData::GetPlatformBinariesRoot() const return Globals::StartupFolder / TEXT("Source/Platforms") / Tools->GetName() / TEXT("Binaries"); } +void CookingData::GetBuildPlatformName(const Char*& platform, const Char*& architecture) const +{ + switch (Platform) + { + case BuildPlatform::Windows32: + platform = TEXT("Windows"); + architecture = TEXT("x86"); + break; + case BuildPlatform::Windows64: + platform = TEXT("Windows"); + architecture = TEXT("x64"); + break; + case BuildPlatform::UWPx86: + platform = TEXT("UWP"); + architecture = TEXT("x86"); + break; + case BuildPlatform::UWPx64: + platform = TEXT("UWP"); + architecture = TEXT("x64"); + break; + case BuildPlatform::XboxOne: + platform = TEXT("XboxOne"); + architecture = TEXT("x64"); + break; + case BuildPlatform::LinuxX64: + platform = TEXT("Linux"); + architecture = TEXT("x64"); + break; + case BuildPlatform::PS4: + platform = TEXT("PS4"); + architecture = TEXT("x64"); + break; + case BuildPlatform::XboxScarlett: + platform = TEXT("XboxScarlett"); + architecture = TEXT("x64"); + break; + case BuildPlatform::AndroidARM64: + platform = TEXT("Android"); + architecture = TEXT("ARM64"); + break; + case BuildPlatform::Switch: + platform = TEXT("Switch"); + architecture = TEXT("ARM64"); + break; + case BuildPlatform::PS5: + platform = TEXT("PS5"); + architecture = TEXT("x64"); + break; + case BuildPlatform::MacOSx64: + platform = TEXT("Mac"); + architecture = TEXT("x64"); + break; + case BuildPlatform::MacOSARM64: + platform = TEXT("Mac"); + architecture = TEXT("ARM64"); + break; + case BuildPlatform::iOSARM64: + platform = TEXT("iOS"); + architecture = TEXT("ARM64"); + break; + default: + LOG(Fatal, "Unknown or unsupported build platform."); + } +} + void CookingData::StepProgress(const String& info, const float stepProgress) const { const float singleStepProgress = 1.0f / (StepsCount + 1); @@ -242,7 +343,7 @@ void CookingData::AddRootEngineAsset(const String& internalPath) } } -void CookingData::Error(const String& msg) +void CookingData::Error(const StringView& msg) { LOG_STR(Error, msg); } @@ -340,6 +441,14 @@ PlatformTools* GameCooker::GetTools(BuildPlatform platform) case BuildPlatform::MacOSx64: result = New(ArchitectureType::x64); break; + case BuildPlatform::MacOSARM64: + result = New(ArchitectureType::ARM64); + break; +#endif +#if PLATFORM_TOOLS_IOS + case BuildPlatform::iOSARM64: + result = New(); + break; #endif } Tools.Add(platform, result); @@ -470,7 +579,10 @@ void GameCooker::GetCurrentPlatform(PlatformType& platform, BuildPlatform& build buildPlatform = BuildPlatform::PS5; break; case PlatformType::Mac: - buildPlatform = BuildPlatform::MacOSx64; + buildPlatform = PLATFORM_ARCH_ARM || PLATFORM_ARCH_ARM64 ? BuildPlatform::MacOSARM64 : BuildPlatform::MacOSx64; + break; + case PlatformType::iOS: + buildPlatform = BuildPlatform::iOSARM64; break; default: ; } @@ -511,9 +623,9 @@ void GameCookerImpl::OnCollectAssets(HashSet& assets) ASSERT(GameCookerImpl::Internal_OnCollectAssets); } - MCore::AttachThread(); + MCore::Thread::Attach(); MObject* exception = nullptr; - auto list = (MonoArray*)Internal_OnCollectAssets->Invoke(nullptr, nullptr, &exception); + auto list = (MArray*)Internal_OnCollectAssets->Invoke(nullptr, nullptr, &exception); if (exception) { MException ex(exception); @@ -547,13 +659,13 @@ bool GameCookerImpl::Build() Steps.Add(New()); } - MCore::AttachThread(); + MCore::Thread::Attach(); // Build Started CallEvent(GameCooker::EventType::BuildStarted); + data.Tools->OnBuildStarted(data); for (int32 stepIndex = 0; stepIndex < Steps.Count(); stepIndex++) Steps[stepIndex]->OnBuildStarted(data); - data.Tools->OnBuildStarted(data); data.InitProgress(Steps.Count()); // Execute all steps in a sequence @@ -602,7 +714,15 @@ bool GameCookerImpl::Build() const String commandLine = commandLineFormat.HasChars() ? String::Format(*commandLineFormat, gameArgs) : gameArgs; if (workingDir.IsEmpty()) workingDir = data.NativeCodeOutputPath; - Platform::StartProcess(executableFile, commandLine, workingDir); + CreateProcessSettings procSettings; + procSettings.FileName = executableFile; + procSettings.Arguments = commandLine; + procSettings.WorkingDirectory = workingDir; + procSettings.HiddenWindow = false; + procSettings.WaitForEnd = false; + procSettings.LogOutput = false; + procSettings.ShellExecute = true; + Platform::CreateProcess(procSettings); } else { @@ -612,9 +732,9 @@ bool GameCookerImpl::Build() } IsRunning = false; CancelFlag = 0; - data.Tools->OnBuildEnded(data, failed); for (int32 stepIndex = 0; stepIndex < Steps.Count(); stepIndex++) Steps[stepIndex]->OnBuildEnded(data, failed); + data.Tools->OnBuildEnded(data, failed); CallEvent(failed ? GameCooker::EventType::BuildFailed : GameCooker::EventType::BuildDone); Delete(Data); Data = nullptr; @@ -667,7 +787,7 @@ void GameCookerService::Update() } MainThreadManagedInvokeAction::ParamsBuilder params; - params.AddParam(ProgressMsg, Scripting::GetScriptsDomain()->GetNative()); + params.AddParam(ProgressMsg, Scripting::GetScriptsDomain()); params.AddParam(ProgressValue); MainThreadManagedInvokeAction::Invoke(Internal_OnProgress, params); GameCooker::OnProgress(ProgressMsg, ProgressValue); diff --git a/Source/Editor/Cooker/GameCooker.cs b/Source/Editor/Cooker/GameCooker.cs index 5ffa5fd25..9a7500d1d 100644 --- a/Source/Editor/Cooker/GameCooker.cs +++ b/Source/Editor/Cooker/GameCooker.cs @@ -103,7 +103,9 @@ namespace FlaxEditor case BuildPlatform.AndroidARM64: return PlatformType.Android; case BuildPlatform.XboxScarlett: return PlatformType.XboxScarlett; case BuildPlatform.Switch: return PlatformType.Switch; + case BuildPlatform.MacOSARM64: case BuildPlatform.MacOSx64: return PlatformType.Mac; + case BuildPlatform.iOSARM64: return PlatformType.iOS; default: throw new ArgumentOutOfRangeException(nameof(buildPlatform), buildPlatform, null); } } diff --git a/Source/Editor/Cooker/Platform/Android/AndroidPlatformTools.cpp b/Source/Editor/Cooker/Platform/Android/AndroidPlatformTools.cpp index 8e3e91b51..7d05409e5 100644 --- a/Source/Editor/Cooker/Platform/Android/AndroidPlatformTools.cpp +++ b/Source/Editor/Cooker/Platform/Android/AndroidPlatformTools.cpp @@ -9,6 +9,7 @@ #include "Editor/Utilities/EditorUtilities.h" #include "Engine/Platform/File.h" #include "Engine/Platform/FileSystem.h" +#include "Engine/Platform/CreateProcessSettings.h" #include "Engine/Platform/Android/AndroidPlatformSettings.h" #include "Engine/Graphics/PixelFormatExtensions.h" #include "Engine/Graphics/Textures/TextureData.h" @@ -115,8 +116,6 @@ void AndroidPlatformTools::OnBuildStarted(CookingData& data) data.DataOutputPath /= TEXT("app/assets"); data.NativeCodeOutputPath /= TEXT("app/assets"); data.ManagedCodeOutputPath /= TEXT("app/assets"); - - PlatformTools::OnBuildStarted(data); } bool AndroidPlatformTools::OnPostProcess(CookingData& data) @@ -140,33 +139,8 @@ bool AndroidPlatformTools::OnPostProcess(CookingData& data) // Setup package name (eg. com.company.project) String packageName = platformSettings->PackageName; - { - String productName = gameSettings->ProductName; - productName.Replace(TEXT(" "), TEXT("")); - productName.Replace(TEXT("."), TEXT("")); - productName.Replace(TEXT("-"), TEXT("")); - String companyName = gameSettings->CompanyName; - companyName.Replace(TEXT(" "), TEXT("")); - companyName.Replace(TEXT("."), TEXT("")); - companyName.Replace(TEXT("-"), TEXT("")); - packageName.Replace(TEXT("${PROJECT_NAME}"), *productName, StringSearchCase::IgnoreCase); - packageName.Replace(TEXT("${COMPANY_NAME}"), *companyName, StringSearchCase::IgnoreCase); - packageName = packageName.ToLower(); - for (int32 i = 0; i < packageName.Length(); i++) - { - const auto c = packageName[i]; - if (c != '_' && c != '.' && !StringUtils::IsAlnum(c)) - { - LOG(Error, "Android Package Name \'{0}\' contains invalid character. Only letters, numbers, dots and underscore characters are allowed.", packageName); - return true; - } - } - if (packageName.IsEmpty()) - { - LOG(Error, "Android Package Name is empty.", packageName); - return true; - } - } + if (EditorUtilities::FormatAppPackageName(packageName)) + return true; // Setup Android application permissions HashSet permissionsList; @@ -267,7 +241,7 @@ bool AndroidPlatformTools::OnPostProcess(CookingData& data) } } - // Generate Mono files hash id used to skip deploying Mono files if already extracted on device (Mono cannot access files packed into .apk via unix file access) + // Generate Dotnet files hash id used to skip deploying Dotnet files if already extracted on device (Dotnet cannot access files packed into .apk via unix file access) File::WriteAllText(assetsPath / TEXT("hash.txt"), Guid::New().ToString(), Encoding::ANSI); // TODO: expose event to inject custom gradle and manifest options or custom binaries into app @@ -309,11 +283,13 @@ bool AndroidPlatformTools::OnPostProcess(CookingData& data) Platform::RunProcess(String::Format(TEXT("chmod +x \"{0}/gradlew\""), data.OriginalOutputPath), data.OriginalOutputPath, Dictionary(), true); #endif const bool distributionPackage = buildSettings->ForDistribution; - const String gradleCommand = String::Format(TEXT("\"{0}\" {1}"), data.OriginalOutputPath / gradlew, distributionPackage ? TEXT("assemble") : TEXT("assembleDebug")); - const int32 result = Platform::RunProcess(gradleCommand, data.OriginalOutputPath, Dictionary(), true); + CreateProcessSettings procSettings; + procSettings.FileName = String::Format(TEXT("\"{0}\" {1}"), data.OriginalOutputPath / gradlew, distributionPackage ? TEXT("assemble") : TEXT("assembleDebug")); + procSettings.WorkingDirectory = data.OriginalOutputPath; + const int32 result = Platform::CreateProcess(procSettings); if (result != 0) { - data.Error(TEXT("Failed to build Gradle project into package (result code: {0}). See log for more info."), result); + data.Error(String::Format(TEXT("Failed to build Gradle project into package (result code: {0}). See log for more info."), result)); return true; } diff --git a/Source/Editor/Cooker/Platform/Android/AndroidPlatformTools.h b/Source/Editor/Cooker/Platform/Android/AndroidPlatformTools.h index 527c95769..59697e758 100644 --- a/Source/Editor/Cooker/Platform/Android/AndroidPlatformTools.h +++ b/Source/Editor/Cooker/Platform/Android/AndroidPlatformTools.h @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2019 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #pragma once diff --git a/Source/Editor/Cooker/Platform/GDK/GDKPlatformTools.cpp b/Source/Editor/Cooker/Platform/GDK/GDKPlatformTools.cpp index e791b3264..d9a052419 100644 --- a/Source/Editor/Cooker/Platform/GDK/GDKPlatformTools.cpp +++ b/Source/Editor/Cooker/Platform/GDK/GDKPlatformTools.cpp @@ -5,6 +5,7 @@ #include "GDKPlatformTools.h" #include "Engine/Platform/File.h" #include "Engine/Platform/FileSystem.h" +#include "Engine/Platform/CreateProcessSettings.h" #include "Engine/Platform/GDK/GDKPlatformSettings.h" #include "Engine/Core/Types/StringBuilder.h" #include "Engine/Core/Collections/Sorting.h" @@ -36,24 +37,9 @@ GDKPlatformTools::GDKPlatformTools() } } -bool GDKPlatformTools::UseAOT() const +DotNetAOTModes GDKPlatformTools::UseAOT() const { - return true; -} - -bool GDKPlatformTools::OnScriptsStepDone(CookingData& data) -{ - // Override Newtonsoft.Json.dll for some platforms (that don't support runtime code generation) - const String customBinPath = data.GetPlatformBinariesRoot() / TEXT("Newtonsoft.Json.dll"); - const String assembliesPath = data.ManagedCodeOutputPath; - if (FileSystem::CopyFile(assembliesPath / TEXT("Newtonsoft.Json.dll"), customBinPath)) - { - data.Error(TEXT("Failed to copy deloy custom assembly.")); - return true; - } - FileSystem::DeleteFile(assembliesPath / TEXT("Newtonsoft.Json.pdb")); - - return false; + return DotNetAOTModes::MonoAOTDynamic; } bool GDKPlatformTools::OnDeployBinaries(CookingData& data) @@ -66,7 +52,7 @@ bool GDKPlatformTools::OnDeployBinaries(CookingData& data) files.Add(binPath / executableFilename); if (!FileSystem::FileExists(files[0])) { - data.Error(TEXT("Missing executable file ({0})."), files[0]); + data.Error(String::Format(TEXT("Missing executable file ({0})."), files[0])); return true; } FileSystem::DirectoryGetFiles(files, binPath, TEXT("*.dll"), DirectorySearchOption::TopDirectoryOnly); @@ -74,7 +60,7 @@ bool GDKPlatformTools::OnDeployBinaries(CookingData& data) { if (FileSystem::CopyFile(data.NativeCodeOutputPath / StringUtils::GetFileName(files[i]), files[i])) { - data.Error(TEXT("Failed to setup output directory (file {0})."), files[i]); + data.Error(String::Format(TEXT("Failed to setup output directory (file {0})."), files[i])); return true; } } @@ -82,85 +68,6 @@ bool GDKPlatformTools::OnDeployBinaries(CookingData& data) return false; } -void GDKPlatformTools::OnConfigureAOT(CookingData& data, AotConfig& config) -{ - const auto platformDataPath = data.GetPlatformBinariesRoot(); - const bool useInterpreter = true; // TODO: use Full AOT on GDK - const bool enableDebug = data.Configuration != BuildConfiguration::Release; - const Char* aotMode = useInterpreter ? TEXT("full,interp") : TEXT("full"); - const Char* debugMode = enableDebug ? TEXT("soft-debug") : TEXT("nodebug"); - config.AotCompilerArgs = String::Format(TEXT("--aot={0},verbose,stats,print-skipped,{1} -O=all"), aotMode, debugMode); - if (enableDebug) - config.AotCompilerArgs = TEXT("--debug ") + config.AotCompilerArgs; - config.AotCompilerPath = platformDataPath / TEXT("Tools/mono.exe"); -} - -bool GDKPlatformTools::OnPerformAOT(CookingData& data, AotConfig& config, const String& assemblyPath) -{ - // Skip .dll.dll which could be a false result from the previous AOT which could fail - if (assemblyPath.EndsWith(TEXT(".dll.dll"))) - { - LOG(Warning, "Skip AOT for file '{0}' as it can be a result from the previous task", assemblyPath); - return false; - } - - // Check if skip this assembly (could be already processed) - const String filename = StringUtils::GetFileName(assemblyPath); - const String outputPath = config.AotCachePath / filename + TEXT(".dll"); - if (FileSystem::FileExists(outputPath) && FileSystem::GetFileLastEditTime(assemblyPath) < FileSystem::GetFileLastEditTime(outputPath)) - return false; - LOG(Info, "Calling AOT tool for \"{0}\"", assemblyPath); - - // Cleanup temporary results (fromm the previous AT that fail or sth) - const String resultPath = assemblyPath + TEXT(".dll"); - const String resultPathExp = resultPath + TEXT(".exp"); - const String resultPathLib = resultPath + TEXT(".lib"); - const String resultPathPdb = resultPath + TEXT(".pdb"); - if (FileSystem::FileExists(resultPath)) - FileSystem::DeleteFile(resultPath); - if (FileSystem::FileExists(resultPathExp)) - FileSystem::DeleteFile(resultPathExp); - if (FileSystem::FileExists(resultPathLib)) - FileSystem::DeleteFile(resultPathLib); - if (FileSystem::FileExists(resultPathPdb)) - FileSystem::DeleteFile(resultPathPdb); - - // Call tool - const String workingDir = StringUtils::GetDirectoryName(config.AotCompilerPath); - const String command = String::Format(TEXT("\"{0}\" {1} \"{2}\""), config.AotCompilerPath, config.AotCompilerArgs, assemblyPath); - const int32 result = Platform::RunProcess(command, workingDir, config.EnvVars); - if (result != 0) - { - data.Error(TEXT("AOT tool execution failed with result code {1} for assembly \"{0}\". See log for more info."), assemblyPath, result); - return true; - } - - // Copy result - if (FileSystem::CopyFile(outputPath, resultPath)) - { - data.Error(TEXT("Failed to copy the AOT tool result file. It can be missing.")); - return true; - } - - // Copy pdb file if exists - if (data.Configuration != BuildConfiguration::Release && FileSystem::FileExists(resultPathPdb)) - { - FileSystem::CopyFile(config.AotCachePath / StringUtils::GetFileName(resultPathPdb), resultPathPdb); - } - - // Clean intermediate results - if (FileSystem::DeleteFile(resultPath) - || (FileSystem::FileExists(resultPathExp) && FileSystem::DeleteFile(resultPathExp)) - || (FileSystem::FileExists(resultPathLib) && FileSystem::DeleteFile(resultPathLib)) - || (FileSystem::FileExists(resultPathPdb) && FileSystem::DeleteFile(resultPathPdb)) - ) - { - LOG(Warning, "Failed to remove the AOT tool result file(s)."); - } - - return false; -} - bool GDKPlatformTools::OnPostProcess(CookingData& data, GDKPlatformSettings* platformSettings) { // Configuration @@ -275,8 +182,10 @@ bool GDKPlatformTools::OnPostProcess(CookingData& data, GDKPlatformSettings* pla data.StepProgress(TEXT("Generating package layout"), 0.3f); const String gdkBinPath = _gdkPath / TEXT("../bin"); const String makePkgPath = gdkBinPath / TEXT("MakePkg.exe"); - const String command = String::Format(TEXT("\"{0}\" genmap /f layout.xml /d \"{1}\""), makePkgPath, data.DataOutputPath); - const int32 result = Platform::RunProcess(command, data.DataOutputPath); + CreateProcessSettings procSettings; + procSettings.FileName = String::Format(TEXT("\"{0}\" genmap /f layout.xml /d \"{1}\""), makePkgPath, data.DataOutputPath); + procSettings.WorkingDirectory = data.DataOutputPath; + const int32 result = Platform::CreateProcess(procSettings); if (result != 0) { data.Error(TEXT("Failed to generate package layout.")); diff --git a/Source/Editor/Cooker/Platform/GDK/GDKPlatformTools.h b/Source/Editor/Cooker/Platform/GDK/GDKPlatformTools.h index 350d95257..284098ec9 100644 --- a/Source/Editor/Cooker/Platform/GDK/GDKPlatformTools.h +++ b/Source/Editor/Cooker/Platform/GDK/GDKPlatformTools.h @@ -26,11 +26,8 @@ public: public: // [PlatformTools] - bool UseAOT() const override; - bool OnScriptsStepDone(CookingData& data) override; + DotNetAOTModes UseAOT() const override; bool OnDeployBinaries(CookingData& data) override; - void OnConfigureAOT(CookingData& data, AotConfig& config) override; - bool OnPerformAOT(CookingData& data, AotConfig& config, const String& assemblyPath) override; }; #endif diff --git a/Source/Editor/Cooker/Platform/Linux/LinuxPlatformTools.cpp b/Source/Editor/Cooker/Platform/Linux/LinuxPlatformTools.cpp index f9c024071..ec7b8e7e1 100644 --- a/Source/Editor/Cooker/Platform/Linux/LinuxPlatformTools.cpp +++ b/Source/Editor/Cooker/Platform/Linux/LinuxPlatformTools.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2019 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #if PLATFORM_TOOLS_LINUX @@ -34,6 +34,11 @@ ArchitectureType LinuxPlatformTools::GetArchitecture() const return ArchitectureType::x64; } +bool LinuxPlatformTools::UseSystemDotnet() const +{ + return true; +} + bool LinuxPlatformTools::OnDeployBinaries(CookingData& data) { const auto gameSettings = GameSettings::Get(); diff --git a/Source/Editor/Cooker/Platform/Linux/LinuxPlatformTools.h b/Source/Editor/Cooker/Platform/Linux/LinuxPlatformTools.h index 9b6dcb9b8..562b38962 100644 --- a/Source/Editor/Cooker/Platform/Linux/LinuxPlatformTools.h +++ b/Source/Editor/Cooker/Platform/Linux/LinuxPlatformTools.h @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2019 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #pragma once @@ -18,6 +18,7 @@ public: const Char* GetName() const override; PlatformType GetPlatform() const override; ArchitectureType GetArchitecture() const override; + bool UseSystemDotnet() const override; bool OnDeployBinaries(CookingData& data) override; }; diff --git a/Source/Editor/Cooker/Platform/Mac/MacPlatformTools.cpp b/Source/Editor/Cooker/Platform/Mac/MacPlatformTools.cpp index 56b1c8a4d..c059acba9 100644 --- a/Source/Editor/Cooker/Platform/Mac/MacPlatformTools.cpp +++ b/Source/Editor/Cooker/Platform/Mac/MacPlatformTools.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2019 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #if PLATFORM_TOOLS_MAC @@ -59,6 +59,11 @@ ArchitectureType MacPlatformTools::GetArchitecture() const return _arch; } +bool MacPlatformTools::UseSystemDotnet() const +{ + return true; +} + bool MacPlatformTools::IsNativeCodeFile(CookingData& data, const String& file) { String extension = FileSystem::GetExtension(file); @@ -87,33 +92,8 @@ bool MacPlatformTools::OnPostProcess(CookingData& data) // Setup package name (eg. com.company.project) String appIdentifier = platformSettings->AppIdentifier; - { - String productName = gameSettings->ProductName; - productName.Replace(TEXT(" "), TEXT("")); - productName.Replace(TEXT("."), TEXT("")); - productName.Replace(TEXT("-"), TEXT("")); - String companyName = gameSettings->CompanyName; - companyName.Replace(TEXT(" "), TEXT("")); - companyName.Replace(TEXT("."), TEXT("")); - companyName.Replace(TEXT("-"), TEXT("")); - appIdentifier.Replace(TEXT("${PROJECT_NAME}"), *productName, StringSearchCase::IgnoreCase); - appIdentifier.Replace(TEXT("${COMPANY_NAME}"), *companyName, StringSearchCase::IgnoreCase); - appIdentifier = appIdentifier.ToLower(); - for (int32 i = 0; i < appIdentifier.Length(); i++) - { - const auto c = appIdentifier[i]; - if (c != '_' && c != '.' && !StringUtils::IsAlnum(c)) - { - LOG(Error, "Apple app identifier \'{0}\' contains invalid character. Only letters, numbers, dots and underscore characters are allowed.", appIdentifier); - return true; - } - } - if (appIdentifier.IsEmpty()) - { - LOG(Error, "Apple app identifier is empty.", appIdentifier); - return true; - } - } + if (EditorUtilities::FormatAppPackageName(appIdentifier)) + return true; // Find executable String executableName; @@ -187,7 +167,7 @@ bool MacPlatformTools::OnPostProcess(CookingData& data) ADD_ENTRY("CFBundlePackageType", "APPL"); ADD_ENTRY("NSPrincipalClass", "NSApplication"); ADD_ENTRY("LSApplicationCategoryType", "public.app-category.games"); - ADD_ENTRY("LSMinimumSystemVersion", "10.14"); + ADD_ENTRY("LSMinimumSystemVersion", "10.15"); ADD_ENTRY("CFBundleIconFile", "icon.icns"); ADD_ENTRY_STR("CFBundleExecutable", executableName); ADD_ENTRY_STR("CFBundleIdentifier", appIdentifier); @@ -201,10 +181,19 @@ bool MacPlatformTools::OnPostProcess(CookingData& data) dict.append_child(PUGIXML_TEXT("key")).set_child_value(PUGIXML_TEXT("LSMinimumSystemVersionByArchitecture")); xml_node LSMinimumSystemVersionByArchitecture = dict.append_child(PUGIXML_TEXT("dict")); - LSMinimumSystemVersionByArchitecture.append_child(PUGIXML_TEXT("key")).set_child_value(PUGIXML_TEXT("x86_64")); - LSMinimumSystemVersionByArchitecture.append_child(PUGIXML_TEXT("string")).set_child_value(PUGIXML_TEXT("10.14")); + switch (_arch) + { + case ArchitectureType::x64: + LSMinimumSystemVersionByArchitecture.append_child(PUGIXML_TEXT("key")).set_child_value(PUGIXML_TEXT("x86_64")); + break; + case ArchitectureType::ARM64: + LSMinimumSystemVersionByArchitecture.append_child(PUGIXML_TEXT("key")).set_child_value(PUGIXML_TEXT("arm64")); + break; + } + LSMinimumSystemVersionByArchitecture.append_child(PUGIXML_TEXT("string")).set_child_value(PUGIXML_TEXT("10.15")); #undef ADD_ENTRY +#undef ADD_ENTRY_STR if (!doc.save_file(*StringAnsi(plistPath))) { @@ -215,8 +204,6 @@ bool MacPlatformTools::OnPostProcess(CookingData& data) // TODO: sign binaries - // TODO: expose event to inject custom post-processing before app packaging (eg. third-party plugins) - // Package application const auto buildSettings = BuildSettings::Get(); if (buildSettings->SkipPackaging) @@ -228,7 +215,7 @@ bool MacPlatformTools::OnPostProcess(CookingData& data) const int32 result = Platform::RunProcess(dmgCommand, data.OriginalOutputPath); if (result != 0) { - data.Error(TEXT("Failed to package app (result code: {0}). See log for more info."), result); + data.Error(String::Format(TEXT("Failed to package app (result code: {0}). See log for more info."), result)); return true; } // TODO: sign dmg diff --git a/Source/Editor/Cooker/Platform/Mac/MacPlatformTools.h b/Source/Editor/Cooker/Platform/Mac/MacPlatformTools.h index e50caae0f..21d9141e3 100644 --- a/Source/Editor/Cooker/Platform/Mac/MacPlatformTools.h +++ b/Source/Editor/Cooker/Platform/Mac/MacPlatformTools.h @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2019 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #pragma once @@ -23,6 +23,7 @@ public: const Char* GetName() const override; PlatformType GetPlatform() const override; ArchitectureType GetArchitecture() const override; + bool UseSystemDotnet() const override; bool IsNativeCodeFile(CookingData& data, const String& file) override; void OnBuildStarted(CookingData& data) override; bool OnPostProcess(CookingData& data) override; diff --git a/Source/Editor/Cooker/Platform/UWP/UWPPlatformTools.cpp b/Source/Editor/Cooker/Platform/UWP/UWPPlatformTools.cpp index 01f8a1a83..f6af5bb5a 100644 --- a/Source/Editor/Cooker/Platform/UWP/UWPPlatformTools.cpp +++ b/Source/Editor/Cooker/Platform/UWP/UWPPlatformTools.cpp @@ -1,10 +1,11 @@ -// Copyright (c) 2012-2019 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #if PLATFORM_TOOLS_UWP #include "UWPPlatformTools.h" #include "Engine/Platform/FileSystem.h" #include "Engine/Platform/File.h" +#include "Engine/Platform/CreateProcessSettings.h" #include "Engine/Platform/UWP/UWPPlatformSettings.h" #include "Engine/Core/Config/GameSettings.h" #include "Engine/Core/Types/StringBuilder.h" @@ -36,24 +37,9 @@ ArchitectureType UWPPlatformTools::GetArchitecture() const return _arch; } -bool UWPPlatformTools::UseAOT() const +DotNetAOTModes UWPPlatformTools::UseAOT() const { - return true; -} - -bool UWPPlatformTools::OnScriptsStepDone(CookingData& data) -{ - // Override Newtonsoft.Json.dll for some platforms (that don't support runtime code generation) - const String customBinPath = data.GetPlatformBinariesRoot() / TEXT("Newtonsoft.Json.dll"); - const String assembliesPath = data.ManagedCodeOutputPath; - if (FileSystem::CopyFile(assembliesPath / TEXT("Newtonsoft.Json.dll"), customBinPath)) - { - data.Error(TEXT("Failed to copy deploy custom assembly.")); - return true; - } - FileSystem::DeleteFile(assembliesPath / TEXT("Newtonsoft.Json.pdb")); - - return false; + return DotNetAOTModes::MonoAOTDynamic; } bool UWPPlatformTools::OnDeployBinaries(CookingData& data) @@ -79,7 +65,7 @@ bool UWPPlatformTools::OnDeployBinaries(CookingData& data) { if (!FileSystem::FileExists(files[i])) { - data.Error(TEXT("Missing source file {0}."), files[i]); + data.Error(String::Format(TEXT("Missing source file {0}."), files[i])); return true; } @@ -414,90 +400,9 @@ bool UWPPlatformTools::OnDeployBinaries(CookingData& data) return false; } -void UWPPlatformTools::OnConfigureAOT(CookingData& data, AotConfig& config) -{ - const auto platformDataPath = data.GetPlatformBinariesRoot(); - const bool useInterpreter = true; // TODO: support using Full AOT instead of interpreter - const bool enableDebug = data.Configuration != BuildConfiguration::Release; - const Char* aotMode = useInterpreter ? TEXT("full,interp") : TEXT("full"); - const Char* debugMode = enableDebug ? TEXT("soft-debug") : TEXT("nodebug"); - config.AotCompilerArgs = String::Format(TEXT("--aot={0},verbose,stats,print-skipped,{1} -O=all"), - aotMode, - debugMode); - if (enableDebug) - config.AotCompilerArgs = TEXT("--debug ") + config.AotCompilerArgs; - config.AotCompilerPath = platformDataPath / TEXT("Tools/mono.exe"); -} - -bool UWPPlatformTools::OnPerformAOT(CookingData& data, AotConfig& config, const String& assemblyPath) -{ - // Skip .dll.dll which could be a false result from the previous AOT which could fail - if (assemblyPath.EndsWith(TEXT(".dll.dll"))) - { - LOG(Warning, "Skip AOT for file '{0}' as it can be a result from the previous task", assemblyPath); - return false; - } - - // Check if skip this assembly (could be already processed) - const String filename = StringUtils::GetFileName(assemblyPath); - const String outputPath = config.AotCachePath / filename + TEXT(".dll"); - if (FileSystem::FileExists(outputPath) && FileSystem::GetFileLastEditTime(assemblyPath) < FileSystem::GetFileLastEditTime(outputPath)) - return false; - LOG(Info, "Calling AOT tool for \"{0}\"", assemblyPath); - - // Cleanup temporary results (fromm the previous AT that fail or sth) - const String resultPath = assemblyPath + TEXT(".dll"); - const String resultPathExp = resultPath + TEXT(".exp"); - const String resultPathLib = resultPath + TEXT(".lib"); - const String resultPathPdb = resultPath + TEXT(".pdb"); - if (FileSystem::FileExists(resultPath)) - FileSystem::DeleteFile(resultPath); - if (FileSystem::FileExists(resultPathExp)) - FileSystem::DeleteFile(resultPathExp); - if (FileSystem::FileExists(resultPathLib)) - FileSystem::DeleteFile(resultPathLib); - if (FileSystem::FileExists(resultPathPdb)) - FileSystem::DeleteFile(resultPathPdb); - - // Call tool - String workingDir = StringUtils::GetDirectoryName(config.AotCompilerPath); - String command = String::Format(TEXT("\"{0}\" {1} \"{2}\""), config.AotCompilerPath, config.AotCompilerArgs, assemblyPath); - const int32 result = Platform::RunProcess(command, workingDir, config.EnvVars); - if (result != 0) - { - data.Error(TEXT("AOT tool execution failed with result code {1} for assembly \"{0}\". See log for more info."), assemblyPath, result); - return true; - } - - // Copy result - if (FileSystem::CopyFile(outputPath, resultPath)) - { - data.Error(TEXT("Failed to copy the AOT tool result file. It can be missing.")); - return true; - } - - // Copy pdb file if exists - if (data.Configuration != BuildConfiguration::Release && FileSystem::FileExists(resultPathPdb)) - { - FileSystem::CopyFile(config.AotCachePath / StringUtils::GetFileName(resultPathPdb), resultPathPdb); - } - - // Clean intermediate results - if (FileSystem::DeleteFile(resultPath) - || (FileSystem::FileExists(resultPathExp) && FileSystem::DeleteFile(resultPathExp)) - || (FileSystem::FileExists(resultPathLib) && FileSystem::DeleteFile(resultPathLib)) - || (FileSystem::FileExists(resultPathPdb) && FileSystem::DeleteFile(resultPathPdb)) - ) - { - LOG(Warning, "Failed to remove the AOT tool result file(s)."); - } - - return false; -} - bool UWPPlatformTools::OnPostProcess(CookingData& data) { - LOG(Error, "UWP (Windows Store) platform has been deprecated and soon will be removed!"); + LOG(Error, "UWP (Windows Store) platform has been deprecated and is no longer supported"); // Special case for UWP // FlaxEngine.dll cannot be added to the solution as `Content` item (due to conflicts with C++ /CX FlaxEngine.dll) diff --git a/Source/Editor/Cooker/Platform/UWP/UWPPlatformTools.h b/Source/Editor/Cooker/Platform/UWP/UWPPlatformTools.h index 4e27f2238..d9b6673d6 100644 --- a/Source/Editor/Cooker/Platform/UWP/UWPPlatformTools.h +++ b/Source/Editor/Cooker/Platform/UWP/UWPPlatformTools.h @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2019 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #pragma once @@ -29,11 +29,8 @@ public: const Char* GetName() const override; PlatformType GetPlatform() const override; ArchitectureType GetArchitecture() const override; - bool UseAOT() const override; - bool OnScriptsStepDone(CookingData& data) override; + DotNetAOTModes UseAOT() const override; bool OnDeployBinaries(CookingData& data) override; - void OnConfigureAOT(CookingData& data, AotConfig& config) override; - bool OnPerformAOT(CookingData& data, AotConfig& config, const String& assemblyPath) override; bool OnPostProcess(CookingData& data) override; }; diff --git a/Source/Editor/Cooker/Platform/Windows/WindowsPlatformTools.cpp b/Source/Editor/Cooker/Platform/Windows/WindowsPlatformTools.cpp index 457c068c9..feca5c0a0 100644 --- a/Source/Editor/Cooker/Platform/Windows/WindowsPlatformTools.cpp +++ b/Source/Editor/Cooker/Platform/Windows/WindowsPlatformTools.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2019 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #if PLATFORM_TOOLS_WINDOWS @@ -33,6 +33,11 @@ ArchitectureType WindowsPlatformTools::GetArchitecture() const return _arch; } +bool WindowsPlatformTools::UseSystemDotnet() const +{ + return true; +} + bool WindowsPlatformTools::OnDeployBinaries(CookingData& data) { const auto platformSettings = WindowsPlatformSettings::Get(); diff --git a/Source/Editor/Cooker/Platform/Windows/WindowsPlatformTools.h b/Source/Editor/Cooker/Platform/Windows/WindowsPlatformTools.h index 404a9f9d6..5f03c9575 100644 --- a/Source/Editor/Cooker/Platform/Windows/WindowsPlatformTools.h +++ b/Source/Editor/Cooker/Platform/Windows/WindowsPlatformTools.h @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2019 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #pragma once @@ -29,6 +29,7 @@ public: const Char* GetName() const override; PlatformType GetPlatform() const override; ArchitectureType GetArchitecture() const override; + bool UseSystemDotnet() const override; bool OnDeployBinaries(CookingData& data) override; void OnRun(CookingData& data, String& executableFile, String& commandLineFormat, String& workingDir) override; }; diff --git a/Source/Editor/Cooker/Platform/iOS/iOSPlatformTools.cpp b/Source/Editor/Cooker/Platform/iOS/iOSPlatformTools.cpp new file mode 100644 index 000000000..8b0cf06a8 --- /dev/null +++ b/Source/Editor/Cooker/Platform/iOS/iOSPlatformTools.cpp @@ -0,0 +1,284 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#if PLATFORM_TOOLS_IOS + +#include "iOSPlatformTools.h" +#include "Engine/Platform/File.h" +#include "Engine/Platform/FileSystem.h" +#include "Engine/Platform/CreateProcessSettings.h" +#include "Engine/Platform/iOS/iOSPlatformSettings.h" +#include "Engine/Core/Config/GameSettings.h" +#include "Engine/Core/Config/BuildSettings.h" +#include "Engine/Core/Collections/Dictionary.h" +#include "Engine/Graphics/Textures/TextureData.h" +#include "Engine/Graphics/PixelFormatExtensions.h" +#include "Engine/Content/Content.h" +#include "Engine/Content/JsonAsset.h" +#include "Engine/Engine/Globals.h" +#include "Editor/Editor.h" +#include "Editor/ProjectInfo.h" +#include "Editor/Cooker/GameCooker.h" +#include "Editor/Utilities/EditorUtilities.h" + +IMPLEMENT_SETTINGS_GETTER(iOSPlatformSettings, iOSPlatform); + +namespace +{ + String GetAppName() + { + const auto gameSettings = GameSettings::Get(); + String productName = gameSettings->ProductName; + productName.Replace(TEXT(" "), TEXT("")); + productName.Replace(TEXT("."), TEXT("")); + productName.Replace(TEXT("-"), TEXT("")); + return productName; + } + + const Char* GetExportMethod(iOSPlatformSettings::ExportMethods method) + { + switch (method) + { + case iOSPlatformSettings::ExportMethods::AppStore: return TEXT("app-store"); + case iOSPlatformSettings::ExportMethods::Development: return TEXT("development"); + case iOSPlatformSettings::ExportMethods::AdHoc: return TEXT("ad-hoc"); + case iOSPlatformSettings::ExportMethods::Enterprise: return TEXT("enterprise"); + default: return TEXT(""); + } + } + + String GetUIInterfaceOrientation(iOSPlatformSettings::UIInterfaceOrientations orientations) + { + String result; + if (EnumHasAnyFlags(orientations, iOSPlatformSettings::UIInterfaceOrientations::Portrait)) + result += TEXT("UIInterfaceOrientationPortrait "); + if (EnumHasAnyFlags(orientations, iOSPlatformSettings::UIInterfaceOrientations::PortraitUpsideDown)) + result += TEXT("UIInterfaceOrientationPortraitUpsideDown "); + if (EnumHasAnyFlags(orientations, iOSPlatformSettings::UIInterfaceOrientations::LandscapeLeft)) + result += TEXT("UIInterfaceOrientationLandscapeLeft "); + if (EnumHasAnyFlags(orientations, iOSPlatformSettings::UIInterfaceOrientations::LandscapeRight)) + result += TEXT("UIInterfaceOrientationLandscapeRight "); + result = result.TrimTrailing(); + return result; + } +} + +const Char* iOSPlatformTools::GetDisplayName() const +{ + return TEXT("iOS"); +} + +const Char* iOSPlatformTools::GetName() const +{ + return TEXT("iOS"); +} + +PlatformType iOSPlatformTools::GetPlatform() const +{ + return PlatformType::iOS; +} + +ArchitectureType iOSPlatformTools::GetArchitecture() const +{ + return ArchitectureType::ARM64; +} + +DotNetAOTModes iOSPlatformTools::UseAOT() const +{ + return DotNetAOTModes::MonoAOTDynamic; +} + +PixelFormat iOSPlatformTools::GetTextureFormat(CookingData& data, TextureBase* texture, PixelFormat format) +{ + // TODO: add ETC compression support for iOS + // TODO: add ASTC compression support for iOS + + if (PixelFormatExtensions::IsCompressedBC(format)) + { + switch (format) + { + case PixelFormat::BC1_Typeless: + case PixelFormat::BC2_Typeless: + case PixelFormat::BC3_Typeless: + return PixelFormat::R8G8B8A8_Typeless; + case PixelFormat::BC1_UNorm: + case PixelFormat::BC2_UNorm: + case PixelFormat::BC3_UNorm: + return PixelFormat::R8G8B8A8_UNorm; + case PixelFormat::BC1_UNorm_sRGB: + case PixelFormat::BC2_UNorm_sRGB: + case PixelFormat::BC3_UNorm_sRGB: + return PixelFormat::R8G8B8A8_UNorm_sRGB; + case PixelFormat::BC4_Typeless: + return PixelFormat::R8_Typeless; + case PixelFormat::BC4_UNorm: + return PixelFormat::R8_UNorm; + case PixelFormat::BC4_SNorm: + return PixelFormat::R8_SNorm; + case PixelFormat::BC5_Typeless: + return PixelFormat::R16G16_Typeless; + case PixelFormat::BC5_UNorm: + return PixelFormat::R16G16_UNorm; + case PixelFormat::BC5_SNorm: + return PixelFormat::R16G16_SNorm; + case PixelFormat::BC7_Typeless: + case PixelFormat::BC6H_Typeless: + return PixelFormat::R16G16B16A16_Typeless; + case PixelFormat::BC7_UNorm: + case PixelFormat::BC6H_Uf16: + case PixelFormat::BC6H_Sf16: + return PixelFormat::R16G16B16A16_Float; + case PixelFormat::BC7_UNorm_sRGB: + return PixelFormat::R16G16B16A16_UNorm; + default: + return format; + } + } + + return format; +} + +bool iOSPlatformTools::IsNativeCodeFile(CookingData& data, const String& file) +{ + String extension = FileSystem::GetExtension(file); + return extension.IsEmpty() || extension == TEXT("dylib"); +} + +void iOSPlatformTools::OnBuildStarted(CookingData& data) +{ + // Adjust the cooking output folders for packaging app + const Char* subDir = TEXT("FlaxGame/Data"); + data.DataOutputPath /= subDir; + data.NativeCodeOutputPath /= subDir; + data.ManagedCodeOutputPath /= subDir; + + PlatformTools::OnBuildStarted(data); +} + +bool iOSPlatformTools::OnPostProcess(CookingData& data) +{ + const auto gameSettings = GameSettings::Get(); + const auto platformSettings = iOSPlatformSettings::Get(); + const auto platformDataPath = data.GetPlatformBinariesRoot(); + const auto projectVersion = Editor::Project->Version.ToString(); + const auto appName = GetAppName(); + + // Setup package name (eg. com.company.project) + String appIdentifier = platformSettings->AppIdentifier; + if (EditorUtilities::FormatAppPackageName(appIdentifier)) + return true; + + // Copy fresh Gradle project template + if (FileSystem::CopyDirectory(data.OriginalOutputPath, platformDataPath / TEXT("Project"), true)) + { + LOG(Error, "Failed to deploy XCode project to {0} from {1}", data.OriginalOutputPath, platformDataPath); + return true; + } + + // Format project template files + Dictionary configReplaceMap; + configReplaceMap[TEXT("${AppName}")] = appName; + configReplaceMap[TEXT("${AppIdentifier}")] = appIdentifier; + configReplaceMap[TEXT("${AppTeamId}")] = platformSettings->AppTeamId; + configReplaceMap[TEXT("${AppVersion}")] = platformSettings->AppVersion; + configReplaceMap[TEXT("${ProjectName}")] = gameSettings->ProductName; + configReplaceMap[TEXT("${ProjectVersion}")] = projectVersion; + configReplaceMap[TEXT("${HeaderSearchPaths}")] = Globals::StartupFolder; + configReplaceMap[TEXT("${ExportMethod}")] = GetExportMethod(platformSettings->ExportMethod); + configReplaceMap[TEXT("${UISupportedInterfaceOrientations_iPhone}")] = GetUIInterfaceOrientation(platformSettings->SupportedInterfaceOrientationsiPhone); + configReplaceMap[TEXT("${UISupportedInterfaceOrientations_iPad}")] = GetUIInterfaceOrientation(platformSettings->SupportedInterfaceOrientationsiPad); + { + // Initialize auto-generated areas as empty + configReplaceMap[TEXT("${PBXBuildFile}")] = String::Empty; + configReplaceMap[TEXT("${PBXCopyFilesBuildPhaseFiles}")] = String::Empty; + configReplaceMap[TEXT("${PBXFileReference}")] = String::Empty; + configReplaceMap[TEXT("${PBXFrameworksBuildPhase}")] = String::Empty; + configReplaceMap[TEXT("${PBXFrameworksGroup}")] = String::Empty; + configReplaceMap[TEXT("${PBXFilesGroup}")] = String::Empty; + configReplaceMap[TEXT("${PBXResourcesGroup}")] = String::Empty; + } + { + // Rename dotnet license files to not mislead the actual game licensing + FileSystem::MoveFile(data.DataOutputPath / TEXT("Dotnet/DOTNET-LICENSE.TXT"), data.DataOutputPath / TEXT("Dotnet/LICENSE.TXT"), true); + FileSystem::MoveFile(data.DataOutputPath / TEXT("Dotnet/DOTNET-THIRD-PARTY-NOTICES.TXT"), data.DataOutputPath / TEXT("Dotnet/THIRD-PARTY-NOTICES.TXT"), true); + } + Array files; + FileSystem::DirectoryGetFiles(files, data.DataOutputPath, TEXT("*"), DirectorySearchOption::AllDirectories); + for (const String& file : files) + { + String name = StringUtils::GetFileName(file); + if (name == TEXT(".DS_Store") || name == TEXT("FlaxGame")) + continue; + String fileId = Guid::New().ToString(Guid::FormatType::N).Left(24); + String projectPath = FileSystem::ConvertAbsolutePathToRelative(data.DataOutputPath, file); + if (name.EndsWith(TEXT(".dylib"))) + { + String frameworkId = Guid::New().ToString(Guid::FormatType::N).Left(24); + String frameworkEmbedId = Guid::New().ToString(Guid::FormatType::N).Left(24); + configReplaceMap[TEXT("${PBXBuildFile}")] += String::Format(TEXT("\t\t{0} /* {1} in Frameworks */ = {{isa = PBXBuildFile; fileRef = {2} /* {1} */; }};\n"), frameworkId, name, fileId); + configReplaceMap[TEXT("${PBXBuildFile}")] += String::Format(TEXT("\t\t{0} /* {1} in Embed Frameworks */ = {{isa = PBXBuildFile; fileRef = {2} /* {1} */; settings = {{ATTRIBUTES = (CodeSignOnCopy, ); }}; }};\n"), frameworkEmbedId, name, fileId); + configReplaceMap[TEXT("${PBXCopyFilesBuildPhaseFiles}")] += String::Format(TEXT("\t\t\t\t{0} /* {1} in Embed Frameworks */,\n"), frameworkEmbedId, name); + configReplaceMap[TEXT("${PBXFileReference}")] += String::Format(TEXT("\t\t{0} /* {1} */ = {{isa = PBXFileReference; lastKnownFileType = \"compiled.mach-o.dylib\"; name = \"{1}\"; path = \"FlaxGame/Data/{2}\"; sourceTree = \"\"; }};\n"), fileId, name, projectPath); + configReplaceMap[TEXT("${PBXFrameworksBuildPhase}")] += String::Format(TEXT("\t\t\t\t{0} /* {1} in Frameworks */,\n"), frameworkId, name); + configReplaceMap[TEXT("${PBXFrameworksGroup}")] += String::Format(TEXT("\t\t\t\t{0} /* {1} */,\n"), fileId, name); + } + else + { + String fileRefId = Guid::New().ToString(Guid::FormatType::N).Left(24); + configReplaceMap[TEXT("${PBXBuildFile}")] += String::Format(TEXT("\t\t{0} /* {1} in Resources */ = {{isa = PBXBuildFile; fileRef = {2} /* {1} */; }};\n"), fileRefId, name, fileId); + configReplaceMap[TEXT("${PBXFileReference}")] += String::Format(TEXT("\t\t{0} /* {1} */ = {{isa = PBXFileReference; lastKnownFileType = file; name = \"{1}\"; path = \"Data/{2}\"; sourceTree = \"\"; }};\n"), fileId, name, projectPath); + configReplaceMap[TEXT("${PBXFilesGroup}")] += String::Format(TEXT("\t\t\t\t{0} /* {1} */,\n"), fileId, name); + configReplaceMap[TEXT("${PBXResourcesGroup}")] += String::Format(TEXT("\t\t\t\t{0} /* {1} in Resources */,\n"), fileRefId, name); + } + } + bool failed = false; + failed |= EditorUtilities::ReplaceInFile(data.OriginalOutputPath / TEXT("FlaxGame.xcodeproj/project.pbxproj"), configReplaceMap); + failed |= EditorUtilities::ReplaceInFile(data.OriginalOutputPath / TEXT("ExportOptions.plist"), configReplaceMap); + if (failed) + { + LOG(Error, "Failed to format XCode project"); + return true; + } + + // Export images + // TODO: provide per-device icons (eg. iPad 1x, iPad 2x) instead of a single icon size + TextureData iconData; + if (!EditorUtilities::GetApplicationImage(platformSettings->OverrideIcon, iconData)) + { + String outputPath = data.OriginalOutputPath / TEXT("FlaxGame/Assets.xcassets/AppIcon.appiconset/ios_store_icon.png"); + if (EditorUtilities::ExportApplicationImage(iconData, 1024, 1024, PixelFormat::R8G8B8A8_UNorm, outputPath)) + { + LOG(Error, "Failed to export application icon."); + return true; + } + } + + // Package application + const auto buildSettings = BuildSettings::Get(); + if (buildSettings->SkipPackaging) + return false; + GameCooker::PackageFiles(); + { + LOG(Info, "Building app package..."); + const Char* configuration = data.Configuration == BuildConfiguration::Release ? TEXT("Release") : TEXT("Debug"); + String command = String::Format(TEXT("xcodebuild -project FlaxGame.xcodeproj -configuration {} -scheme FlaxGame -archivePath FlaxGame.xcarchive archive"), configuration); + int32 result = Platform::RunProcess(command, data.OriginalOutputPath); + if (result != 0) + { + data.Error(String::Format(TEXT("Failed to package app (result code: {0}). See log for more info."), result)); + return true; + } + command = TEXT("xcodebuild -exportArchive -archivePath FlaxGame.xcarchive -allowProvisioningUpdates -exportPath . -exportOptionsPlist ExportOptions.plist"); + result = Platform::RunProcess(command, data.OriginalOutputPath); + if (result != 0) + { + data.Error(String::Format(TEXT("Failed to package app (result code: {0}). See log for more info."), result)); + return true; + } + const String ipaPath = data.OriginalOutputPath / TEXT("FlaxGame.ipa"); + LOG(Info, "Output application package: {0} (size: {1} MB)", ipaPath, FileSystem::GetFileSize(ipaPath) / 1024 / 1024); + } + + return false; +} + +#endif diff --git a/Source/Editor/Cooker/Platform/iOS/iOSPlatformTools.h b/Source/Editor/Cooker/Platform/iOS/iOSPlatformTools.h new file mode 100644 index 000000000..854961923 --- /dev/null +++ b/Source/Editor/Cooker/Platform/iOS/iOSPlatformTools.h @@ -0,0 +1,27 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#pragma once + +#if PLATFORM_TOOLS_IOS + +#include "../../PlatformTools.h" + +/// +/// The iOS platform support tools. +/// +class iOSPlatformTools : public PlatformTools +{ +public: + // [PlatformTools] + const Char* GetDisplayName() const override; + const Char* GetName() const override; + PlatformType GetPlatform() const override; + ArchitectureType GetArchitecture() const override; + DotNetAOTModes UseAOT() const override; + PixelFormat GetTextureFormat(CookingData& data, TextureBase* texture, PixelFormat format) override; + bool IsNativeCodeFile(CookingData& data, const String& file) override; + void OnBuildStarted(CookingData& data) override; + bool OnPostProcess(CookingData& data) override; +}; + +#endif diff --git a/Source/Editor/Cooker/PlatformTools.h b/Source/Editor/Cooker/PlatformTools.h index 58888964f..533dad805 100644 --- a/Source/Editor/Cooker/PlatformTools.h +++ b/Source/Editor/Cooker/PlatformTools.h @@ -1,9 +1,8 @@ -// Copyright (c) 2012-2019 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #pragma once #include "CookingData.h" -#include "Engine/Core/Collections/Dictionary.h" #include "Editor/Scripting/ScriptsBuilder.h" #include "Engine/Graphics/PixelFormat.h" @@ -15,7 +14,6 @@ class TextureBase; class FLAXENGINE_API PlatformTools { public: - /// /// Finalizes an instance of the class. /// @@ -24,32 +22,35 @@ public: /// /// Gets the name of the platform for UI and logging. /// - /// The name. virtual const Char* GetDisplayName() const = 0; /// /// Gets the name of the platform for filesystem cache directories, deps folder. /// - /// The name. virtual const Char* GetName() const = 0; /// /// Gets the type of the platform. /// - /// The platform type. virtual PlatformType GetPlatform() const = 0; /// /// Gets the architecture of the platform. /// - /// The architecture type. virtual ArchitectureType GetArchitecture() const = 0; /// - /// Gets the value indicating whenever platform requires AOT. + /// Gets the value indicating whenever platform requires AOT (needs C# assemblies to be precompiled). /// - /// True if platform uses AOT and needs C# assemblies to be precompiled, otherwise false. - virtual bool UseAOT() const + virtual DotNetAOTModes UseAOT() const + { + return DotNetAOTModes::None; + } + + /// + /// Gets the value indicating whenever platform supports using system-installed .Net Runtime. + /// + virtual bool UseSystemDotnet() const { return false; } @@ -72,13 +73,9 @@ public: /// The cooking data. /// The file path. /// True if it's a native file, otherwise false. - virtual bool IsNativeCodeFile(CookingData& data, const String& file) - { - return false; - } + virtual bool IsNativeCodeFile(CookingData& data, const String& file); public: - /// /// Called when game building starts. /// @@ -136,64 +133,6 @@ public: return false; } - /// - /// The C# scripts AOT configuration options. - /// - struct AotConfig - { - String AotCompilerPath; - String AotCompilerArgs; - String AssemblerPath; - String AssemblerArgs; - String ArchiverPath; - String ArchiverArgs; - String AuxToolPath; - String AuxToolArgs; - String AotCachePath; - Dictionary EnvVars; - Array AssembliesSearchDirs; - Array Assemblies; - - AotConfig(CookingData& data) - { - Platform::GetEnvironmentVariables(EnvVars); - EnvVars[TEXT("MONO_PATH")] = data.DataOutputPath / TEXT("Mono/lib/mono/4.5"); - AssembliesSearchDirs.Add(data.DataOutputPath / TEXT("Mono/lib/mono/4.5")); - } - }; - - /// - /// Called to configure AOT options. - /// - /// The cooking data. - /// The configuration. - virtual void OnConfigureAOT(CookingData& data, AotConfig& config) - { - } - - /// - /// Called to execute AOT for the given assembly. - /// - /// The cooking data. - /// The configuration. - /// The input managed library file path. - /// True if failed, otherwise false. - virtual bool OnPerformAOT(CookingData& data, AotConfig& config, const String& assemblyPath) - { - return false; - } - - /// - /// Called after AOT execution for the assemblies. - /// - /// The cooking data. - /// The configuration. - /// True if failed, otherwise false. - virtual bool OnPostProcessAOT(CookingData& data, AotConfig& config) - { - return false; - } - /// /// Called during staged build post-processing. /// diff --git a/Source/Editor/Cooker/Steps/CompileScriptsStep.cpp b/Source/Editor/Cooker/Steps/CompileScriptsStep.cpp index ae865e14a..361e5f937 100644 --- a/Source/Editor/Cooker/Steps/CompileScriptsStep.cpp +++ b/Source/Editor/Cooker/Steps/CompileScriptsStep.cpp @@ -95,8 +95,8 @@ bool CompileScriptsStep::DeployBinaries(CookingData& data, const String& path, c Scripting::ProcessBuildInfoPath(e.NativePath, projectFolderPath); Scripting::ProcessBuildInfoPath(e.ManagedPath, projectFolderPath); - e.NativePath = StringUtils::GetFileName(e.NativePath); - e.ManagedPath = StringUtils::GetFileName(e.ManagedPath); + e.NativePath = String(StringUtils::GetFileName(e.NativePath)); + e.ManagedPath = String(StringUtils::GetFileName(e.ManagedPath)); LOG(Info, "Collecting binary module {0}", e.Name); } @@ -129,7 +129,7 @@ bool CompileScriptsStep::DeployBinaries(CookingData& data, const String& path, c continue; if (FileSystem::CopyFile(dst, file)) { - data.Error(TEXT("Failed to copy file from {0} to {1}."), file, dst); + data.Error(String::Format(TEXT("Failed to copy file from {0} to {1}."), file, dst)); return true; } @@ -154,60 +154,7 @@ bool CompileScriptsStep::Perform(CookingData& data) String target = project->GameTarget; StringView workingDir; const Char *platform, *architecture, *configuration = ::ToString(data.Configuration); - switch (data.Platform) - { - case BuildPlatform::Windows32: - platform = TEXT("Windows"); - architecture = TEXT("x86"); - break; - case BuildPlatform::Windows64: - platform = TEXT("Windows"); - architecture = TEXT("x64"); - break; - case BuildPlatform::UWPx86: - platform = TEXT("UWP"); - architecture = TEXT("x86"); - break; - case BuildPlatform::UWPx64: - platform = TEXT("UWP"); - architecture = TEXT("x64"); - break; - case BuildPlatform::XboxOne: - platform = TEXT("XboxOne"); - architecture = TEXT("x64"); - break; - case BuildPlatform::LinuxX64: - platform = TEXT("Linux"); - architecture = TEXT("x64"); - break; - case BuildPlatform::PS4: - platform = TEXT("PS4"); - architecture = TEXT("x64"); - break; - case BuildPlatform::XboxScarlett: - platform = TEXT("XboxScarlett"); - architecture = TEXT("x64"); - break; - case BuildPlatform::AndroidARM64: - platform = TEXT("Android"); - architecture = TEXT("ARM64"); - break; - case BuildPlatform::Switch: - platform = TEXT("Switch"); - architecture = TEXT("ARM64"); - break; - case BuildPlatform::PS5: - platform = TEXT("PS5"); - architecture = TEXT("x64"); - break; - case BuildPlatform::MacOSx64: - platform = TEXT("Mac"); - architecture = TEXT("x64"); - break; - default: - LOG(Error, "Unknown or unsupported build platform."); - return true; - } + data.GetBuildPlatformName(platform, architecture); String targetBuildInfo = project->ProjectFolderPath / TEXT("Binaries") / target / platform / architecture / configuration / target + TEXT(".Build.json"); if (target.IsEmpty()) { @@ -241,8 +188,8 @@ bool CompileScriptsStep::Perform(CookingData& data) LOG(Info, "Starting scripts compilation for game..."); const String logFile = data.CacheDirectory / TEXT("CompileLog.txt"); auto args = String::Format( - TEXT("-log -logfile=\"{4}\" -build -mutex -buildtargets={0} -platform={1} -arch={2} -configuration={3}"), - target, platform, architecture, configuration, logFile); + TEXT("-log -logfile=\"{4}\" -build -mutex -buildtargets={0} -platform={1} -arch={2} -configuration={3} -aotMode={5}"), + target, platform, architecture, configuration, logFile, ToString(data.Tools->UseAOT())); #if PLATFORM_WINDOWS if (data.Platform == BuildPlatform::LinuxX64) #elif PLATFORM_LINUX @@ -257,7 +204,7 @@ bool CompileScriptsStep::Perform(CookingData& data) // Assume FlaxGame was prebuilt for target platform args += TEXT(" -SkipTargets=FlaxGame"); } - for (auto& define : data.CustomDefines) + for (const String& define : data.CustomDefines) { args += TEXT(" -D"); args += define; diff --git a/Source/Editor/Cooker/Steps/CookAssetsStep.cpp b/Source/Editor/Cooker/Steps/CookAssetsStep.cpp index 16df276f7..4d4ea5e07 100644 --- a/Source/Editor/Cooker/Steps/CookAssetsStep.cpp +++ b/Source/Editor/Cooker/Steps/CookAssetsStep.cpp @@ -410,7 +410,7 @@ bool ProcessShaderBase(CookAssetsStep::AssetCookData& data, ShaderAssetBase* ass assetBase->InitCompilationOptions(options); \ if (ShadersCompilation::Compile(options)) \ { \ - data.Data.Error(TEXT("Failed to compile shader '{0}' (profile: {1})."), asset->ToString(), ::ToString(options.Profile)); \ + data.Data.Error(String::Format(TEXT("Failed to compile shader '{0}' (profile: {1})."), asset->ToString(), ::ToString(options.Profile))); \ return true; \ } \ includes.Clear(); \ @@ -529,11 +529,20 @@ bool ProcessShaderBase(CookAssetsStep::AssetCookData& data, ShaderAssetBase* ass #endif #if PLATFORM_TOOLS_MAC case BuildPlatform::MacOSx64: + case BuildPlatform::MacOSARM64: { const char* platformDefineName = "PLATFORM_MAC"; COMPILE_PROFILE(Vulkan_SM5, SHADER_FILE_CHUNK_INTERNAL_VULKAN_SM5_CACHE); break; } +#endif +#if PLATFORM_TOOLS_IOS + case BuildPlatform::iOSARM64: + { + const char* platformDefineName = "PLATFORM_IOS"; + COMPILE_PROFILE(Vulkan_SM5, SHADER_FILE_CHUNK_INTERNAL_VULKAN_SM5_CACHE); + break; + } #endif default: { diff --git a/Source/Editor/Cooker/Steps/DeployDataStep.cpp b/Source/Editor/Cooker/Steps/DeployDataStep.cpp index 49d71f09f..c9bbc016e 100644 --- a/Source/Editor/Cooker/Steps/DeployDataStep.cpp +++ b/Source/Editor/Cooker/Steps/DeployDataStep.cpp @@ -1,19 +1,23 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #include "DeployDataStep.h" +#include "Engine/Platform/File.h" #include "Engine/Platform/FileSystem.h" -#include "Editor/Cooker/PlatformTools.h" +#include "Engine/Core/Collections/Sorting.h" #include "Engine/Core/Config/BuildSettings.h" #include "Engine/Core/Config/GameSettings.h" #include "Engine/Renderer/ReflectionsPass.h" #include "Engine/Renderer/AntiAliasing/SMAA.h" #include "Engine/Engine/Globals.h" +#include "Editor/Cooker/PlatformTools.h" +#include "Editor/Utilities/EditorUtilities.h" bool DeployDataStep::Perform(CookingData& data) { data.StepProgress(TEXT("Deploying engine data"), 0); const String depsRoot = data.GetPlatformBinariesRoot(); - const auto gameSettings = GameSettings::Get(); + const auto& gameSettings = *GameSettings::Get(); + const auto& buildSettings = *BuildSettings::Get(); // Setup output folders and copy required data const auto contentDir = data.DataOutputPath / TEXT("Content"); @@ -26,22 +30,275 @@ bool DeployDataStep::Perform(CookingData& data) Platform::Sleep(10); } FileSystem::CreateDirectory(contentDir); - const auto srcMono = depsRoot / TEXT("Mono"); - const auto dstMono = data.DataOutputPath / TEXT("Mono"); + const String dstMono = data.DataOutputPath / TEXT("Mono"); +#if USE_NETCORE + { + // Remove old Mono files + FileSystem::DeleteDirectory(dstMono); + FileSystem::DeleteFile(data.DataOutputPath / TEXT("MonoPosixHelper.dll")); + } + String dstDotnet = data.DataOutputPath / TEXT("Dotnet"); + const DotNetAOTModes aotMode = data.Tools->UseAOT(); + const bool usAOT = aotMode != DotNetAOTModes::None; + if (usAOT) + { + // Deploy Dotnet files into intermediate cooking directory for AOT + FileSystem::DeleteDirectory(dstDotnet); + dstDotnet = data.ManagedCodeOutputPath; + } + if (buildSettings.SkipDotnetPackaging && data.Tools->UseSystemDotnet()) + { + // Use system-installed .Net Runtime + FileSystem::DeleteDirectory(dstDotnet); + } + else + { + // Deploy .Net Runtime files + FileSystem::CreateDirectory(dstDotnet); + String srcDotnet = depsRoot / TEXT("Dotnet"); + if (FileSystem::DirectoryExists(srcDotnet)) + { + // Use prebuilt .Net installation for that platform + LOG(Info, "Using .Net Runtime {} at {}", data.Tools->GetName(), srcDotnet); + if (EditorUtilities::CopyDirectoryIfNewer(dstDotnet, srcDotnet, true)) + { + data.Error(TEXT("Failed to copy .Net runtime data files.")); + return true; + } + } + else + { + bool canUseSystemDotnet = false; + switch (data.Platform) + { + case BuildPlatform::Windows32: + case BuildPlatform::Windows64: + canUseSystemDotnet = PLATFORM_TYPE == PlatformType::Windows; + break; + case BuildPlatform::LinuxX64: + canUseSystemDotnet = PLATFORM_TYPE == PlatformType::Linux; + break; + case BuildPlatform::MacOSx64: + case BuildPlatform::MacOSARM64: + canUseSystemDotnet = PLATFORM_TYPE == PlatformType::Mac; + break; + } + if (canUseSystemDotnet && (aotMode == DotNetAOTModes::None || aotMode == DotNetAOTModes::ILC)) + { + // Ask Flax.Build to provide .Net SDK location for the current platform + String sdks; + bool failed = ScriptsBuilder::RunBuildTool(TEXT("-log -logMessagesOnly -logFileWithConsole -logfile=SDKs.txt -printSDKs"), data.CacheDirectory); + failed |= File::ReadAllText(data.CacheDirectory / TEXT("SDKs.txt"), sdks); + int32 idx = sdks.Find(TEXT("DotNetSdk, "), StringSearchCase::CaseSensitive); + if (idx != -1) + { + idx = sdks.Find(TEXT(", "), StringSearchCase::CaseSensitive, idx + 12); + idx += 2; + int32 end = sdks.Find(TEXT("\n"), StringSearchCase::CaseSensitive, idx); + if (sdks[end] == '\r') + end--; + srcDotnet = String(sdks.Get() + idx, end - idx).TrimTrailing(); + } + if (failed || !FileSystem::DirectoryExists(srcDotnet)) + { + data.Error(TEXT("Failed to get .Net SDK location for a current platform.")); + return true; + } + + // Select version to use + Array versions; + FileSystem::GetChildDirectories(versions, srcDotnet / TEXT("host/fxr")); + if (versions.Count() == 0) + { + data.Error(TEXT("Failed to get .Net SDK location for a current platform.")); + return true; + } + for (String& version : versions) + { + version = String(StringUtils::GetFileName(version)); + if (!version.StartsWith(TEXT("7."))) + version.Clear(); + } + Sorting::QuickSort(versions.Get(), versions.Count()); + const String version = versions.Last(); + FileSystem::NormalizePath(srcDotnet); + LOG(Info, "Using .Net Runtime {} at {}", version, srcDotnet); + + // Check if previously deployed files are valid (eg. system-installed .NET was updated from version 7.0.3 to 7.0.5) + { + const String dotnetCacheFilePath = data.CacheDirectory / TEXT("SystemDotnetInfo.txt"); + String dotnetCachedValue = String::Format(TEXT("{};{}"), version, srcDotnet); + if (FileSystem::DirectoryExists(dstDotnet)) + { + String cachedData; + File::ReadAllText(dotnetCacheFilePath, cachedData); + if (cachedData != dotnetCachedValue) + { + FileSystem::DeleteDirectory(dstDotnet); + FileSystem::CreateDirectory(dstDotnet); + } + } + File::WriteAllText(dotnetCacheFilePath, dotnetCachedValue, Encoding::ANSI); + } + + // Deploy runtime files + FileSystem::CopyFile(dstDotnet / TEXT("LICENSE.TXT"), srcDotnet / TEXT("LICENSE.txt")); + FileSystem::CopyFile(dstDotnet / TEXT("LICENSE.TXT"), srcDotnet / TEXT("LICENSE.TXT")); + FileSystem::CopyFile(dstDotnet / TEXT("THIRD-PARTY-NOTICES.TXT"), srcDotnet / TEXT("ThirdPartyNotices.txt")); + FileSystem::CopyFile(dstDotnet / TEXT("THIRD-PARTY-NOTICES.TXT"), srcDotnet / TEXT("THIRD-PARTY-NOTICES.TXT")); + if (usAOT) + { + failed |= EditorUtilities::CopyDirectoryIfNewer(dstDotnet, srcDotnet / TEXT("shared/Microsoft.NETCore.App") / version, true); + } + else + { + failed |= EditorUtilities::CopyDirectoryIfNewer(dstDotnet / TEXT("host/fxr") / version, srcDotnet / TEXT("host/fxr") / version, true); + failed |= EditorUtilities::CopyDirectoryIfNewer(dstDotnet / TEXT("shared/Microsoft.NETCore.App") / version, srcDotnet / TEXT("shared/Microsoft.NETCore.App") / version, true); + } + if (failed) + { + data.Error(TEXT("Failed to copy .Net runtime data files.")); + return true; + } + } + else + { + // Ask Flax.Build to provide .Net Host Runtime location for the target platform + String sdks; + const Char *platformName, *archName; + data.GetBuildPlatformName(platformName, archName); + String args = String::Format(TEXT("-log -logMessagesOnly -logFileWithConsole -logfile=SDKs.txt -printDotNetRuntime -platform={} -arch={}"), platformName, archName); + bool failed = ScriptsBuilder::RunBuildTool(args, data.CacheDirectory); + failed |= File::ReadAllText(data.CacheDirectory / TEXT("SDKs.txt"), sdks); + Array parts; + sdks.Split(',', parts); + failed |= parts.Count() != 3; + if (!failed) + { + srcDotnet = parts[2].TrimTrailing(); + } + if (failed || !FileSystem::DirectoryExists(srcDotnet)) + { + data.Error(TEXT("Failed to get .Net SDK location for a current platform.")); + return true; + } + FileSystem::NormalizePath(srcDotnet); + LOG(Info, "Using .Net Runtime {} at {}", TEXT("Host"), srcDotnet); + + // Deploy runtime files + const Char* corlibPrivateName = TEXT("System.Private.CoreLib.dll"); + const bool srcDotnetFromEngine = srcDotnet.Contains(TEXT("Source/Platforms")); + String packFolder = srcDotnet / TEXT("../../../"); + String dstDotnetLibs = dstDotnet, srcDotnetLibs = srcDotnet; + StringUtils::PathRemoveRelativeParts(packFolder); + if (usAOT) + { + if (srcDotnetFromEngine) + { + // AOT runtime files inside Engine Platform folder + packFolder /= TEXT("Dotnet"); + dstDotnetLibs /= TEXT("lib/net7.0"); + srcDotnetLibs = packFolder / TEXT("lib/net7.0"); + } + else + { + // Runtime files inside Dotnet SDK folder but placed for AOT + dstDotnetLibs /= TEXT("lib/net7.0"); + srcDotnetLibs /= TEXT("../lib/net7.0"); + } + } + else + { + if (srcDotnetFromEngine) + { + // Runtime files inside Engine Platform folder + dstDotnetLibs /= TEXT("lib/net7.0"); + srcDotnetLibs /= TEXT("lib/net7.0"); + } + else + { + // Runtime files inside Dotnet SDK folder + dstDotnetLibs /= TEXT("shared/Microsoft.NETCore.App"); + srcDotnetLibs /= TEXT("../lib/net7.0"); + } + } + FileSystem::CopyFile(dstDotnet / TEXT("LICENSE.TXT"), packFolder / TEXT("LICENSE.txt")); + FileSystem::CopyFile(dstDotnet / TEXT("LICENSE.TXT"), packFolder / TEXT("LICENSE.TXT")); + FileSystem::CopyFile(dstDotnet / TEXT("THIRD-PARTY-NOTICES.TXT"), packFolder / TEXT("ThirdPartyNotices.txt")); + FileSystem::CopyFile(dstDotnet / TEXT("THIRD-PARTY-NOTICES.TXT"), packFolder / TEXT("THIRD-PARTY-NOTICES.TXT")); + failed |= EditorUtilities::CopyDirectoryIfNewer(dstDotnetLibs, srcDotnetLibs, true); + if (FileSystem::FileExists(srcDotnet / corlibPrivateName)) + failed |= EditorUtilities::CopyFileIfNewer(dstDotnetLibs / corlibPrivateName, srcDotnet / corlibPrivateName); + switch (data.Platform) + { +#define DEPLOY_NATIVE_FILE(filename) failed |= FileSystem::CopyFile(data.NativeCodeOutputPath / TEXT(filename), srcDotnet / TEXT(filename)); + case BuildPlatform::AndroidARM64: + if (data.Configuration != BuildConfiguration::Release) + { + DEPLOY_NATIVE_FILE("libmono-component-debugger.so"); + DEPLOY_NATIVE_FILE("libmono-component-diagnostics_tracing.so"); + DEPLOY_NATIVE_FILE("libmono-component-hot_reload.so"); + } + DEPLOY_NATIVE_FILE("libmonosgen-2.0.so"); + DEPLOY_NATIVE_FILE("libSystem.IO.Compression.Native.so"); + DEPLOY_NATIVE_FILE("libSystem.Native.so"); + DEPLOY_NATIVE_FILE("libSystem.Security.Cryptography.Native.Android.so"); + break; + case BuildPlatform::iOSARM64: + DEPLOY_NATIVE_FILE("libmonosgen-2.0.dylib"); + DEPLOY_NATIVE_FILE("libSystem.IO.Compression.Native.dylib"); + DEPLOY_NATIVE_FILE("libSystem.Native.dylib"); + DEPLOY_NATIVE_FILE("libSystem.Net.Security.Native.dylib"); + DEPLOY_NATIVE_FILE("libSystem.Security.Cryptography.Native.Apple.dylib"); + break; +#undef DEPLOY_NATIVE_FILE + default: ; + } + if (failed) + { + data.Error(TEXT("Failed to copy .Net runtime data files.")); + return true; + } + } + } + + // Optimize deployed C# class library (remove DLLs unused by scripts) + if (aotMode == DotNetAOTModes::None && buildSettings.SkipUnusedDotnetLibsPackaging) + { + LOG(Info, "Optimizing .NET class library size to include only used assemblies"); + const String logFile = data.CacheDirectory / TEXT("StripDotnetLibs.txt"); + String args = String::Format( + TEXT("-log -logfile=\"{}\" -runDotNetClassLibStripping -mutex -binaries=\"{}\""), + logFile, data.DataOutputPath); + for (const String& define : data.CustomDefines) + { + args += TEXT(" -D"); + args += define; + } + if (ScriptsBuilder::RunBuildTool(args)) + { + data.Error(TEXT("Failed to optimize .Net class library.")); + return true; + } + } + } +#else if (!FileSystem::DirectoryExists(dstMono)) { + // Deploy Mono files (from platform data folder) + const String srcMono = depsRoot / TEXT("Mono"); if (!FileSystem::DirectoryExists(srcMono)) { data.Error(TEXT("Missing Mono runtime data files.")); return true; } - if (FileSystem::CopyDirectory(dstMono, srcMono, true)) { data.Error(TEXT("Failed to copy Mono runtime data files.")); return true; } } +#endif // Deploy engine data for the target platform if (data.Tools->OnDeployBinaries(data)) @@ -82,7 +339,7 @@ bool DeployDataStep::Perform(CookingData& data) data.AddRootEngineAsset(TEXT("Engine/DefaultMaterial")); data.AddRootEngineAsset(TEXT("Engine/DefaultDeformableMaterial")); data.AddRootEngineAsset(TEXT("Engine/DefaultTerrainMaterial")); - if (!gameSettings->NoSplashScreen && !gameSettings->SplashScreen.IsValid()) + if (!gameSettings.NoSplashScreen && !gameSettings.SplashScreen.IsValid()) data.AddRootEngineAsset(TEXT("Engine/Textures/Logo")); data.AddRootEngineAsset(TEXT("Engine/Textures/NormalTexture")); data.AddRootEngineAsset(TEXT("Engine/Textures/BlackTexture")); @@ -112,7 +369,6 @@ bool DeployDataStep::Perform(CookingData& data) // Register game assets data.StepProgress(TEXT("Deploying game data"), 50); - auto& buildSettings = *BuildSettings::Get(); for (auto& e : buildSettings.AdditionalAssets) data.AddRootAsset(e.GetID()); for (auto& e : buildSettings.AdditionalScenes) diff --git a/Source/Editor/Cooker/Steps/PostProcessStep.cpp b/Source/Editor/Cooker/Steps/PostProcessStep.cpp index b79eed03d..dce8c5d2f 100644 --- a/Source/Editor/Cooker/Steps/PostProcessStep.cpp +++ b/Source/Editor/Cooker/Steps/PostProcessStep.cpp @@ -2,9 +2,20 @@ #include "PostProcessStep.h" #include "Editor/Cooker/PlatformTools.h" +#include "Engine/Platform/FileSystem.h" bool PostProcessStep::Perform(CookingData& data) { + // Print .NET stats + const DotNetAOTModes aotMode = data.Tools->UseAOT(); + uint64 outputSize = FileSystem::GetDirectorySize(data.DataOutputPath / TEXT("Dotnet")); + if (aotMode == DotNetAOTModes::None) + { + for (auto& binaryModule : data.BinaryModules) + outputSize += FileSystem::GetFileSize(data.DataOutputPath / binaryModule.ManagedPath); + } + LOG(Info, "Output .NET files size: {0} MB", (uint32)(outputSize / (1024ull * 1024))); + GameCooker::PostProcessFiles(); return data.Tools->OnPostProcess(data); } diff --git a/Source/Editor/Cooker/Steps/PrecompileAssembliesStep.cpp b/Source/Editor/Cooker/Steps/PrecompileAssembliesStep.cpp index 54bd4111d..deb8f5022 100644 --- a/Source/Editor/Cooker/Steps/PrecompileAssembliesStep.cpp +++ b/Source/Editor/Cooker/Steps/PrecompileAssembliesStep.cpp @@ -1,78 +1,86 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #include "PrecompileAssembliesStep.h" -#include "Editor/Scripting/ScriptsBuilder.h" #include "Engine/Platform/FileSystem.h" +#include "Engine/Platform/File.h" +#include "Engine/Core/Config/BuildSettings.h" +#include "Engine/Engine/Globals.h" +#include "Editor/Scripting/ScriptsBuilder.h" #include "Editor/Cooker/PlatformTools.h" +#include "Editor/Utilities/EditorUtilities.h" + +void PrecompileAssembliesStep::OnBuildStarted(CookingData& data) +{ + const DotNetAOTModes aotMode = data.Tools->UseAOT(); + if (aotMode == DotNetAOTModes::None) + return; + const auto& buildSettings = *BuildSettings::Get(); + + // Redirect C# assemblies to intermediate cooking directory (processed by ILC) + data.ManagedCodeOutputPath = data.CacheDirectory / TEXT("AOTAssemblies"); + + // Reset any AOT cache from previous run if the AOT mode has changed (eg. Mono AOT -> ILC on Desktop) + const String aotModeCacheFilePath = data.ManagedCodeOutputPath / TEXT("AOTMode.txt"); + String aotModeCacheValue = String::Format(TEXT("{};{};{};{}"), + (int32)aotMode, + (int32)data.Configuration, + (int32)buildSettings.SkipUnusedDotnetLibsPackaging, + FileSystem::GetFileLastEditTime(ScriptsBuilder::GetBuildToolPath()).Ticks); + for (const String& define : data.CustomDefines) + aotModeCacheValue += define; + if (FileSystem::DirectoryExists(data.ManagedCodeOutputPath)) + { + String cachedData; + File::ReadAllText(aotModeCacheFilePath, cachedData); + if (cachedData != aotModeCacheValue) + { + LOG(Info, "AOT cache invalidation"); + FileSystem::DeleteDirectory(data.ManagedCodeOutputPath); + } + } + if (!FileSystem::DirectoryExists(data.ManagedCodeOutputPath)) + { + FileSystem::CreateDirectory(data.ManagedCodeOutputPath); + File::WriteAllText(aotModeCacheFilePath, aotModeCacheValue, Encoding::ANSI); + } +} bool PrecompileAssembliesStep::Perform(CookingData& data) { - // Skip for some platforms - if (!data.Tools->UseAOT()) + const DotNetAOTModes aotMode = data.Tools->UseAOT(); + if (aotMode == DotNetAOTModes::None) + return false; + const auto& buildSettings = *BuildSettings::Get(); + if (buildSettings.SkipDotnetPackaging && data.Tools->UseSystemDotnet()) return false; LOG(Info, "Using AOT..."); - - // Useful references about AOT: - // http://www.mono-project.com/docs/advanced/runtime/docs/aot/ - // http://www.mono-project.com/docs/advanced/aot/ - const String infoMsg = TEXT("Running AOT"); data.StepProgress(infoMsg, 0); - // Setup - PlatformTools::AotConfig config(data); - data.Tools->OnConfigureAOT(data, config); + // Override Newtonsoft.Json with AOT-version (one that doesn't use System.Reflection.Emit) + EditorUtilities::CopyFileIfNewer(data.ManagedCodeOutputPath / TEXT("Newtonsoft.Json.dll"), Globals::StartupFolder / TEXT("Source/Platforms/DotNet/AOT/Newtonsoft.Json.dll")); + FileSystem::DeleteFile(data.ManagedCodeOutputPath / TEXT("Newtonsoft.Json.xml")); + FileSystem::DeleteFile(data.ManagedCodeOutputPath / TEXT("Newtonsoft.Json.pdb")); - // Prepare output directory - config.AotCachePath = data.DataOutputPath / TEXT("Mono/lib/mono/aot-cache"); - switch (data.Tools->GetArchitecture()) + // Run AOT by Flax.Build (see DotNetAOT) + const Char *platform, *architecture, *configuration = ::ToString(data.Configuration); + data.GetBuildPlatformName(platform, architecture); + const String logFile = data.CacheDirectory / TEXT("AOTLog.txt"); + String args = String::Format( + TEXT("-log -logfile=\"{}\" -runDotNetAOT -mutex -platform={} -arch={} -configuration={} -aotMode={} -binaries=\"{}\" -intermediate=\"{}\""), + logFile, platform, architecture, configuration, ToString(aotMode), data.DataOutputPath, data.ManagedCodeOutputPath); + if (!buildSettings.SkipUnusedDotnetLibsPackaging) + args += TEXT(" -skipUnusedDotnetLibs=false"); // Run AOT on whole class library (not just used libs) + for (const String& define : data.CustomDefines) { - case ArchitectureType::x86: - config.AotCachePath /= TEXT("x86"); - break; - case ArchitectureType::x64: - config.AotCachePath /= TEXT("amd64"); - break; - default: - data.Error(TEXT("Not supported AOT architecture")); + args += TEXT(" -D"); + args += define; + } + if (ScriptsBuilder::RunBuildTool(args)) + { + data.Error(TEXT("Failed to precompile game scripts.")); return true; } - if (!FileSystem::DirectoryExists(config.AotCachePath)) - { - if (FileSystem::CreateDirectory(config.AotCachePath)) - { - data.Error(TEXT("Failed to setup AOT output directory.")); - return true; - } - } - - // Collect assemblies for AOT - // TODO: don't perform AOT on all assemblies but only ones used by the game and engine assemblies - for (auto& dir : config.AssembliesSearchDirs) - FileSystem::DirectoryGetFiles(config.Assemblies, dir, TEXT("*.dll"), DirectorySearchOption::TopDirectoryOnly); - for (auto& binaryModule : data.BinaryModules) - if (binaryModule.ManagedPath.HasChars()) - config.Assemblies.Add(data.ManagedCodeOutputPath / binaryModule.ManagedPath); - // TODO: move AOT to Flax.Build and perform it on all C# assemblies used in target build - config.Assemblies.Add(data.ManagedCodeOutputPath / TEXT("Newtonsoft.Json.dll")); - - // Perform AOT for the assemblies - for (int32 i = 0; i < config.Assemblies.Count(); i++) - { - BUILD_STEP_CANCEL_CHECK; - - if (data.Tools->OnPerformAOT(data, config, config.Assemblies[i])) - return true; - - data.StepProgress(infoMsg, static_cast(i) / config.Assemblies.Count()); - } - - BUILD_STEP_CANCEL_CHECK; - - if (data.Tools->OnPostProcessAOT(data, config)) - return true; - - // TODO: maybe remove GAC/assemblies? aot-cache could be only used in the build game return false; } diff --git a/Source/Editor/Cooker/Steps/PrecompileAssembliesStep.h b/Source/Editor/Cooker/Steps/PrecompileAssembliesStep.h index d7c89e7ed..dcfe2fc5d 100644 --- a/Source/Editor/Cooker/Steps/PrecompileAssembliesStep.h +++ b/Source/Editor/Cooker/Steps/PrecompileAssembliesStep.h @@ -5,8 +5,7 @@ #include "Editor/Cooker/GameCooker.h" /// -/// Optional step used only on selected platform that precompiles C# script assemblies. -/// Uses Mono Ahead of Time Compilation (AOT) feature. +/// Optional step used only on selected platform that precompiles C# script assemblies. Uses Ahead of Time Compilation (AOT) feature. /// /// class PrecompileAssembliesStep : public GameCooker::BuildStep @@ -14,5 +13,6 @@ class PrecompileAssembliesStep : public GameCooker::BuildStep public: // [BuildStep] + void OnBuildStarted(CookingData& data) override; bool Perform(CookingData& data) override; }; diff --git a/Source/Editor/CustomEditors/CustomEditor.cs b/Source/Editor/CustomEditors/CustomEditor.cs index 1330616d1..03b21e12b 100644 --- a/Source/Editor/CustomEditors/CustomEditor.cs +++ b/Source/Editor/CustomEditors/CustomEditor.cs @@ -7,6 +7,7 @@ using FlaxEditor.CustomEditors.GUI; using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; using Newtonsoft.Json; using JsonSerializer = FlaxEngine.Json.JsonSerializer; @@ -625,9 +626,7 @@ namespace FlaxEditor.CustomEditors JsonSerializer.Deserialize(obj, text); } } -#pragma warning disable 618 - else if (Newtonsoft.Json.Schema.JsonSchema.Parse(text) == null) -#pragma warning restore 618 + else if (!text.StartsWith("{") || !text.EndsWith("}")) { return false; } @@ -650,7 +649,14 @@ namespace FlaxEditor.CustomEditors else { // Default - obj = JsonConvert.DeserializeObject(text, TypeUtils.GetType(Values.Type), JsonSerializer.Settings); + try + { + obj = JsonConvert.DeserializeObject(text, TypeUtils.GetType(Values.Type), JsonSerializer.Settings); + } + catch + { + obj = null; + } } if (obj == null || Values.Type.IsInstanceOfType(obj)) @@ -817,6 +823,8 @@ namespace FlaxEditor.CustomEditors /// True if allow to handle this event, otherwise false. protected virtual bool OnDirty(CustomEditor editor, object value, object token = null) { + if (ParentEditor == null) + return false; return ParentEditor.OnDirty(editor, value, token); } diff --git a/Source/Editor/CustomEditors/CustomEditorPresenter.cs b/Source/Editor/CustomEditors/CustomEditorPresenter.cs index a04070a06..73e2ede0f 100644 --- a/Source/Editor/CustomEditors/CustomEditorPresenter.cs +++ b/Source/Editor/CustomEditors/CustomEditorPresenter.cs @@ -6,6 +6,7 @@ using System.Linq; using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; namespace FlaxEditor.CustomEditors { diff --git a/Source/Editor/CustomEditors/CustomEditorsUtil.cpp b/Source/Editor/CustomEditors/CustomEditorsUtil.cpp index bfb7a93a5..d0c10c13d 100644 --- a/Source/Editor/CustomEditors/CustomEditorsUtil.cpp +++ b/Source/Editor/CustomEditors/CustomEditorsUtil.cpp @@ -13,7 +13,6 @@ #include "Engine/Scripting/ManagedCLR/MClass.h" #include "Engine/Scripting/ManagedCLR/MUtils.h" #include "FlaxEngine.Gen.h" -#include #define TRACK_ASSEMBLY(assembly) \ if (assembly->IsLoaded()) \ @@ -49,24 +48,24 @@ struct Entry } }; -Dictionary Cache(512); +Dictionary Cache(512); void OnAssemblyLoaded(MAssembly* assembly); void OnAssemblyUnloading(MAssembly* assembly); void OnBinaryModuleLoaded(BinaryModule* module); -MonoReflectionType* CustomEditorsUtil::GetCustomEditor(MonoReflectionType* refType) +MTypeObject* CustomEditorsUtil::GetCustomEditor(MTypeObject* refType) { if (!refType) return nullptr; - MonoType* type = mono_reflection_type_get_type(refType); + MType* type = INTERNAL_TYPE_OBJECT_GET(refType); Entry result; if (Cache.TryGet(type, result)) { - const auto editor = result.CustomEditor ? result.CustomEditor : result.DefaultEditor; + MClass* editor = result.CustomEditor ? result.CustomEditor : result.DefaultEditor; if (editor) { - return MUtils::GetType(editor->GetNative()); + return MUtils::GetType(editor); } } return nullptr; @@ -123,19 +122,19 @@ void OnAssemblyLoaded(MAssembly* assembly) continue; const auto attribute = mclass->GetAttribute(customEditorAttribute); - if (attribute == nullptr || mono_object_get_class(attribute) != customEditorAttribute->GetNative()) + if (attribute == nullptr || MCore::Object::GetClass(attribute) != customEditorAttribute) continue; // Check if attribute references a valid class - MonoReflectionType* refType = nullptr; + MTypeObject* refType = nullptr; customEditorTypeField->GetValue(attribute, &refType); if (refType == nullptr) continue; - MonoType* type = mono_reflection_type_get_type(refType); + MType* type = INTERNAL_TYPE_OBJECT_GET(refType); if (type == nullptr) continue; - MonoClass* typeClass = mono_type_get_class(type); + MClass* typeClass = MCore::Type::GetClass(type); // Check if it's a custom editor class if (mclass->IsSubClassOf(customEditor)) @@ -152,18 +151,14 @@ void OnAssemblyLoaded(MAssembly* assembly) entry.CustomEditor = mclass; } - //LOG(Info, "Custom Editor {0} for type {1} (default: {2})", String(mclass->GetFullName()), String(mono_type_get_name(type)), isDefault); + //LOG(Info, "Custom Editor {0} for type {1} (default: {2})", String(mclass->GetFullName()), MCore::Type::ToString(type), isDefault); } else if (typeClass) { - MClass* referencedClass = Scripting::FindClass(typeClass); - if (referencedClass) - { - auto& entry = Cache[mono_class_get_type(mclass->GetNative())]; - entry.CustomEditor = referencedClass; + auto& entry = Cache[mclass->GetType()]; + entry.CustomEditor = typeClass; - //LOG(Info, "Custom Editor {0} for type {1}", String(referencedClass->GetFullName()), String(mclass->GetFullName())); - } + //LOG(Info, "Custom Editor {0} for type {1}", String(typeClass->GetFullName()), String(mclass->GetFullName())); } } @@ -183,17 +178,16 @@ void OnAssemblyUnloading(MAssembly* assembly) // Remove entries with user classes for (auto i = Cache.Begin(); i.IsNotEnd(); ++i) { - MonoClass* monoClass = (MonoClass*)(void*)i->Key; - - if (assembly->GetClass(monoClass)) + MClass* mClass = MCore::Type::GetClass(i->Key); + if (mClass && mClass->GetAssembly() == assembly) { Cache.Remove(i); } else { - if (i->Value.DefaultEditor && assembly->GetClass(i->Value.DefaultEditor->GetNative())) + if (i->Value.DefaultEditor && i->Value.DefaultEditor->GetAssembly() == assembly) i->Value.DefaultEditor = nullptr; - if (i->Value.CustomEditor && assembly->GetClass(i->Value.CustomEditor->GetNative())) + if (i->Value.CustomEditor && i->Value.CustomEditor->GetAssembly() == assembly) i->Value.CustomEditor = nullptr; } } diff --git a/Source/Editor/CustomEditors/CustomEditorsUtil.cs b/Source/Editor/CustomEditors/CustomEditorsUtil.cs index 7f653376b..5f76b07e2 100644 --- a/Source/Editor/CustomEditors/CustomEditorsUtil.cs +++ b/Source/Editor/CustomEditors/CustomEditorsUtil.cs @@ -3,15 +3,18 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.Marshalling; using FlaxEditor.CustomEditors.Dedicated; using FlaxEditor.CustomEditors.Editors; using FlaxEditor.Scripting; using FlaxEngine; +using FlaxEngine.Interop; +using FlaxEngine.Utilities; namespace FlaxEditor.CustomEditors { - internal static class CustomEditorsUtil + internal static partial class CustomEditorsUtil { internal static readonly Dictionary InBuildTypeNames = new Dictionary() { @@ -126,7 +129,8 @@ namespace FlaxEditor.CustomEditors return new GenericEditor(); } - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern Type Internal_GetCustomEditor(Type targetType); + [LibraryImport("FlaxEngine", EntryPoint = "CustomEditorsUtilInternal_GetCustomEditor", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalUsing(typeof(SystemTypeMarshaller))] + internal static partial Type Internal_GetCustomEditor([MarshalUsing(typeof(SystemTypeMarshaller))] Type targetType); } } diff --git a/Source/Editor/CustomEditors/CustomEditorsUtil.h b/Source/Editor/CustomEditors/CustomEditorsUtil.h index 287602369..aea45729e 100644 --- a/Source/Editor/CustomEditors/CustomEditorsUtil.h +++ b/Source/Editor/CustomEditors/CustomEditorsUtil.h @@ -11,7 +11,7 @@ class CustomEditorsUtil { public: -#if USE_MONO - static MonoReflectionType* GetCustomEditor(MonoReflectionType* refType); +#if USE_CSHARP + static MTypeObject* GetCustomEditor(MTypeObject* refType); #endif }; diff --git a/Source/Editor/CustomEditors/Dedicated/ActorEditor.cs b/Source/Editor/CustomEditors/Dedicated/ActorEditor.cs index efa13d48a..db863b186 100644 --- a/Source/Editor/CustomEditors/Dedicated/ActorEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/ActorEditor.cs @@ -12,6 +12,7 @@ using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; using FlaxEngine.Json; +using FlaxEngine.Utilities; namespace FlaxEditor.CustomEditors.Dedicated { @@ -94,19 +95,7 @@ namespace FlaxEditor.CustomEditors.Dedicated { if (actor != null) group.Panel.TooltipText = Surface.SurfaceUtils.GetVisualScriptTypeDescription(TypeUtils.GetObjectType(actor)); - float settingsButtonSize = group.Panel.HeaderHeight; - var settingsButton = new Image - { - TooltipText = "Settings", - AutoFocus = true, - AnchorPreset = AnchorPresets.TopRight, - Parent = group.Panel, - Bounds = new Rectangle(group.Panel.Width - settingsButtonSize, 0, settingsButtonSize, settingsButtonSize), - IsScrollable = false, - Color = FlaxEngine.GUI.Style.Current.ForegroundGrey, - Margin = new Margin(1), - Brush = new SpriteBrush(FlaxEngine.GUI.Style.Current.Settings), - }; + var settingsButton = group.AddSettingsButton(); settingsButton.Clicked += OnSettingsButtonClicked; break; } diff --git a/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs b/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs index 613f5d3b4..bf82e19da 100644 --- a/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/ScriptsEditor.cs @@ -11,6 +11,7 @@ using FlaxEditor.GUI.Drag; using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; using Object = FlaxEngine.Object; namespace FlaxEditor.CustomEditors.Dedicated @@ -461,20 +462,8 @@ namespace FlaxEditor.CustomEditors.Dedicated var group = layout.Group("Missing script"); // Add settings button to the group - const float settingsButtonSize = 14; - var settingsButton = new Image - { - TooltipText = "Settings", - AutoFocus = true, - AnchorPreset = AnchorPresets.TopRight, - Parent = group.Panel, - Bounds = new Rectangle(group.Panel.Width - settingsButtonSize, 0, settingsButtonSize, settingsButtonSize), - IsScrollable = false, - Color = FlaxEngine.GUI.Style.Current.ForegroundGrey, - Margin = new Margin(1), - Brush = new SpriteBrush(FlaxEngine.GUI.Style.Current.Settings), - Tag = index, - }; + var settingsButton = group.AddSettingsButton(); + settingsButton.Tag = index; settingsButton.Clicked += MissingSettingsButtonOnClicked; } @@ -664,19 +653,8 @@ namespace FlaxEditor.CustomEditors.Dedicated }; // Add settings button to the group - var settingsButton = new Image - { - TooltipText = "Settings", - AutoFocus = true, - AnchorPreset = AnchorPresets.TopRight, - Parent = group.Panel, - Bounds = new Rectangle(group.Panel.Width - headerHeight, 0, headerHeight, headerHeight), - IsScrollable = false, - Color = FlaxEngine.GUI.Style.Current.ForegroundGrey, - Margin = new Margin(1), - Brush = new SpriteBrush(FlaxEngine.GUI.Style.Current.Settings), - Tag = script, - }; + var settingsButton = group.AddSettingsButton(); + settingsButton.Tag = script; settingsButton.Clicked += OnSettingsButtonClicked; group.Panel.HeaderTextMargin = new Margin(scriptDrag.Right - 12, 15, 2, 2); diff --git a/Source/Editor/CustomEditors/Dedicated/UIControlEditor.cs b/Source/Editor/CustomEditors/Dedicated/UIControlEditor.cs index 6cbaa0ca0..fde4967e8 100644 --- a/Source/Editor/CustomEditors/Dedicated/UIControlEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/UIControlEditor.cs @@ -698,7 +698,7 @@ namespace FlaxEditor.CustomEditors.Dedicated { string newName = controlType.Name + uiControl.Name.Substring(previousName.Length); if (uiControl.Parent != null) - newName = StringUtils.IncrementNameNumber(newName, x => uiControl.Parent.GetChild(x) == null); + newName = Utilities.Utils.IncrementNameNumber(newName, x => uiControl.Parent.GetChild(x) == null); uiControl.Name = newName; } } diff --git a/Source/Editor/CustomEditors/Editors/ArrayEditor.cs b/Source/Editor/CustomEditors/Editors/ArrayEditor.cs index de8491bcf..4d7beadda 100644 --- a/Source/Editor/CustomEditors/Editors/ArrayEditor.cs +++ b/Source/Editor/CustomEditors/Editors/ArrayEditor.cs @@ -4,6 +4,7 @@ using System; using System.Collections; using FlaxEditor.Scripting; using FlaxEngine; +using FlaxEngine.Utilities; namespace FlaxEditor.CustomEditors.Editors { diff --git a/Source/Editor/CustomEditors/Editors/AssetRefEditor.cs b/Source/Editor/CustomEditors/Editors/AssetRefEditor.cs index ddfe54897..17999d772 100644 --- a/Source/Editor/CustomEditors/Editors/AssetRefEditor.cs +++ b/Source/Editor/CustomEditors/Editors/AssetRefEditor.cs @@ -6,6 +6,7 @@ using FlaxEditor.Content; using FlaxEditor.GUI; using FlaxEditor.Scripting; using FlaxEngine; +using FlaxEngine.Utilities; namespace FlaxEditor.CustomEditors.Editors { diff --git a/Source/Editor/CustomEditors/Editors/CollectionEditor.cs b/Source/Editor/CustomEditors/Editors/CollectionEditor.cs index 8fe5fd5f2..8922e2d25 100644 --- a/Source/Editor/CustomEditors/Editors/CollectionEditor.cs +++ b/Source/Editor/CustomEditors/Editors/CollectionEditor.cs @@ -9,6 +9,7 @@ using FlaxEditor.GUI.ContextMenu; using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; namespace FlaxEditor.CustomEditors.Editors { diff --git a/Source/Editor/CustomEditors/Editors/DictionaryEditor.cs b/Source/Editor/CustomEditors/Editors/DictionaryEditor.cs index 18500fc08..73089ff04 100644 --- a/Source/Editor/CustomEditors/Editors/DictionaryEditor.cs +++ b/Source/Editor/CustomEditors/Editors/DictionaryEditor.cs @@ -11,6 +11,7 @@ using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; using FlaxEngine.Json; +using FlaxEngine.Utilities; namespace FlaxEditor.CustomEditors.Editors { diff --git a/Source/Editor/CustomEditors/Editors/EnumEditor.cs b/Source/Editor/CustomEditors/Editors/EnumEditor.cs index 8f1da88db..3e305b09b 100644 --- a/Source/Editor/CustomEditors/Editors/EnumEditor.cs +++ b/Source/Editor/CustomEditors/Editors/EnumEditor.cs @@ -5,6 +5,7 @@ using System.Linq; using FlaxEditor.CustomEditors.Elements; using FlaxEditor.Scripting; using FlaxEngine; +using FlaxEngine.Utilities; namespace FlaxEditor.CustomEditors.Editors { diff --git a/Source/Editor/CustomEditors/Editors/FlaxObjectRefEditor.cs b/Source/Editor/CustomEditors/Editors/FlaxObjectRefEditor.cs index c9c49e7cb..731da3817 100644 --- a/Source/Editor/CustomEditors/Editors/FlaxObjectRefEditor.cs +++ b/Source/Editor/CustomEditors/Editors/FlaxObjectRefEditor.cs @@ -10,6 +10,7 @@ using FlaxEditor.SceneGraph; using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; using Object = FlaxEngine.Object; namespace FlaxEditor.CustomEditors.Editors diff --git a/Source/Editor/CustomEditors/Editors/GenericEditor.cs b/Source/Editor/CustomEditors/Editors/GenericEditor.cs index 7c021613e..cba2b5a5a 100644 --- a/Source/Editor/CustomEditors/Editors/GenericEditor.cs +++ b/Source/Editor/CustomEditors/Editors/GenericEditor.cs @@ -12,6 +12,7 @@ using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; using FlaxEngine.Json; +using FlaxEngine.Utilities; namespace FlaxEditor.CustomEditors.Editors { diff --git a/Source/Editor/CustomEditors/Editors/ListEditor.cs b/Source/Editor/CustomEditors/Editors/ListEditor.cs index 866adf56d..12bacfcd5 100644 --- a/Source/Editor/CustomEditors/Editors/ListEditor.cs +++ b/Source/Editor/CustomEditors/Editors/ListEditor.cs @@ -3,6 +3,7 @@ using System.Collections; using System.Collections.Generic; using FlaxEngine; +using FlaxEngine.Utilities; namespace FlaxEditor.CustomEditors.Editors { @@ -20,7 +21,7 @@ namespace FlaxEditor.CustomEditors.Editors { var listType = Values.Type; var list = (IList)listType.CreateInstance(); - var defaultValue = Scripting.TypeUtils.GetDefaultValue(ElementType); + var defaultValue = TypeUtils.GetDefaultValue(ElementType); for (int i = 0; i < size; i++) list.Add(defaultValue); return list; @@ -55,7 +56,7 @@ namespace FlaxEditor.CustomEditors.Editors else { // Initialize new entries with default values - var defaultValue = Scripting.TypeUtils.GetDefaultValue(elementType); + var defaultValue = TypeUtils.GetDefaultValue(elementType); for (int i = oldSize; i < newSize; i++) newValues.Add(defaultValue); } @@ -63,7 +64,7 @@ namespace FlaxEditor.CustomEditors.Editors else if (newSize > 0) { // Fill new entries with default value - var defaultValue = Scripting.TypeUtils.GetDefaultValue(elementType); + var defaultValue = TypeUtils.GetDefaultValue(elementType); for (int i = oldSize; i < newSize; i++) newValues.Add(defaultValue); } diff --git a/Source/Editor/CustomEditors/Editors/ObjectSwitcherEditor.cs b/Source/Editor/CustomEditors/Editors/ObjectSwitcherEditor.cs index 7e86df06f..25a058d86 100644 --- a/Source/Editor/CustomEditors/Editors/ObjectSwitcherEditor.cs +++ b/Source/Editor/CustomEditors/Editors/ObjectSwitcherEditor.cs @@ -3,6 +3,7 @@ using System; using FlaxEditor.GUI; using FlaxEditor.Scripting; +using FlaxEngine.Utilities; namespace FlaxEditor.CustomEditors.Editors { diff --git a/Source/Editor/CustomEditors/Editors/TypeEditor.cs b/Source/Editor/CustomEditors/Editors/TypeEditor.cs index 9ee2c37a4..ab17c4ae1 100644 --- a/Source/Editor/CustomEditors/Editors/TypeEditor.cs +++ b/Source/Editor/CustomEditors/Editors/TypeEditor.cs @@ -9,6 +9,7 @@ using FlaxEditor.GUI.Drag; using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; namespace FlaxEditor.CustomEditors.Editors { diff --git a/Source/Editor/CustomEditors/Elements/Container/GroupElement.cs b/Source/Editor/CustomEditors/Elements/Container/GroupElement.cs index e0ae259ec..2b9940cac 100644 --- a/Source/Editor/CustomEditors/Elements/Container/GroupElement.cs +++ b/Source/Editor/CustomEditors/Elements/Container/GroupElement.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +using FlaxEngine; using FlaxEngine.GUI; namespace FlaxEditor.CustomEditors.Elements @@ -25,5 +26,27 @@ namespace FlaxEditor.CustomEditors.Elements /// public override ContainerControl ContainerControl => Panel; + + /// + /// Adds utility settings button to the group header. + /// + /// The created control. + public Image AddSettingsButton() + { + var style = Style.Current; + var settingsButtonSize = Panel.HeaderHeight; + return new Image + { + TooltipText = "Settings", + AutoFocus = true, + AnchorPreset = AnchorPresets.TopRight, + Parent = Panel, + Bounds = new Rectangle(Panel.Width - settingsButtonSize, 0, settingsButtonSize, settingsButtonSize), + IsScrollable = false, + Color = style.ForegroundGrey, + Margin = new Margin(1), + Brush = new SpriteBrush(style.Settings), + }; + } } } diff --git a/Source/Editor/CustomEditors/Values/ValueContainer.cs b/Source/Editor/CustomEditors/Values/ValueContainer.cs index 53af4387f..574e73564 100644 --- a/Source/Editor/CustomEditors/Values/ValueContainer.cs +++ b/Source/Editor/CustomEditors/Values/ValueContainer.cs @@ -6,6 +6,7 @@ using System.ComponentModel; using System.Linq; using FlaxEditor.Scripting; using FlaxEngine; +using FlaxEngine.Utilities; namespace FlaxEditor.CustomEditors { @@ -242,7 +243,7 @@ namespace FlaxEditor.CustomEditors if (objA == null && objB is string objBStr && objBStr.Length == 0) return true; - return Newtonsoft.Json.Utilities.MiscellaneousUtils.DefaultValueEquals(objA, objB); + return Newtonsoft.Json.Utilities.MiscellaneousUtils.ValueEquals(objA, objB); } /// diff --git a/Source/Editor/Editor.Build.cs b/Source/Editor/Editor.Build.cs index 91785036e..64578570c 100644 --- a/Source/Editor/Editor.Build.cs +++ b/Source/Editor/Editor.Build.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +using System; using System.Collections.Generic; using System.IO; using Flax.Build; @@ -36,9 +37,13 @@ public class Editor : EditorModule { base.Setup(options); + options.ScriptingAPI.SystemReferences.Add("System.Private.Xml"); + options.ScriptingAPI.SystemReferences.Add("System.Text.RegularExpressions"); + options.ScriptingAPI.SystemReferences.Add("System.ComponentModel.TypeConverter"); + options.PublicDependencies.Add("Engine"); options.PrivateDependencies.Add("pugixml"); - options.PrivateDependencies.Add("UniversalAnalytics"); + options.PrivateDependencies.Add("curl"); options.PrivateDependencies.Add("ContentImporters"); options.PrivateDependencies.Add("ContentExporters"); options.PrivateDependencies.Add("ShadowsOfMordor"); @@ -72,12 +77,15 @@ public class Editor : EditorModule { AddPlatformTools(options, platformToolsRoot, platformToolsRootExternal, "Mac", "PLATFORM_TOOLS_MAC"); AddPlatformTools(options, platformToolsRoot, platformToolsRootExternal, "Android", "PLATFORM_TOOLS_ANDROID"); + AddPlatformTools(options, platformToolsRoot, platformToolsRootExternal, "iOS", "PLATFORM_TOOLS_IOS"); } // Visual Studio integration if (options.Platform.Target == TargetPlatform.Windows && Flax.Build.Platform.BuildTargetPlatform == TargetPlatform.Windows) { +#pragma warning disable CA1416 var path = Registry.GetValue("HKEY_CLASSES_ROOT\\TypeLib\\{80CC9F66-E7D8-4DDD-85B6-D9E6CD0E93E2}\\8.0\\0\\win32", null, null) as string; +#pragma warning restore CA1416 if (path != null && File.Exists(path)) options.PrivateDefinitions.Add("USE_VISUAL_STUDIO_DTE"); } diff --git a/Source/Editor/Editor.cpp b/Source/Editor/Editor.cpp index 0456e28a4..8a92d11f4 100644 --- a/Source/Editor/Editor.cpp +++ b/Source/Editor/Editor.cpp @@ -259,13 +259,13 @@ bool Editor::CheckProjectUpgrade() LOG(Warning, "Project layout upgraded!"); } - // Check if last version was the same + // Check if last version was the same else if (lastMajor == FLAXENGINE_VERSION_MAJOR && lastMinor == FLAXENGINE_VERSION_MINOR) { // Do nothing IsOldProjectOpened = false; } - // Check if last version was older + // Check if last version was older else if (lastMajor < FLAXENGINE_VERSION_MAJOR || (lastMajor == FLAXENGINE_VERSION_MAJOR && lastMinor < FLAXENGINE_VERSION_MINOR)) { LOG(Warning, "The project was opened with the older editor version last time"); @@ -288,7 +288,7 @@ bool Editor::CheckProjectUpgrade() return true; } } - // Check if last version was newer + // Check if last version was newer else if (lastMajor > FLAXENGINE_VERSION_MAJOR || (lastMajor == FLAXENGINE_VERSION_MAJOR && lastMinor > FLAXENGINE_VERSION_MINOR)) { LOG(Warning, "The project was opened with the newer editor version last time"); @@ -312,6 +312,14 @@ bool Editor::CheckProjectUpgrade() } } + // When changing between major/minor version clear some caches to prevent possible issues + if (lastMajor != FLAXENGINE_VERSION_MAJOR || lastMinor != FLAXENGINE_VERSION_MINOR) + { + LOG(Info, "Cleaning cache files from different engine version"); + FileSystem::DeleteDirectory(Globals::ProjectFolder / TEXT("Cache/Cooker")); + FileSystem::DeleteDirectory(Globals::ProjectFolder / TEXT("Cache/Intermediate")); + } + // Upgrade old 0.7 projects // [Deprecated: 01.11.2020, expires 01.11.2021] if (lastMajor == 0 && lastMinor == 7 && lastBuild <= 6197) @@ -330,12 +338,11 @@ bool Editor::CheckProjectUpgrade() file->WriteInt32(FLAXENGINE_VERSION_MAJOR); file->WriteInt32(FLAXENGINE_VERSION_MINOR); file->WriteInt32(FLAXENGINE_VERSION_BUILD); - Delete(file); } else { - LOG(Warning, "Failed to create version cache file"); + LOG(Error, "Failed to create version cache file"); } } @@ -664,9 +671,7 @@ bool Editor::Init() void Editor::BeforeRun() { - // If during last lightmaps baking engine crashed we could try to restore the progress - if (ShadowsOfMordor::Builder::Instance()->RestoreState()) - Managed->GetClass()->GetMethod("Internal_StartLightingBake")->Invoke(Managed->GetOrCreateManagedInstance(), nullptr, nullptr); + Managed->BeforeRun(); } void Editor::BeforeExit() @@ -696,12 +701,6 @@ void EditorImpl::OnUpdate() // Boost our priority back to normal Platform::SetThreadPriority(ThreadPriority::Normal); } - if (!hasFocus) - { - // Sleep for a bit to not eat up all CPU time - PROFILE_CPU_NAMED("Sleep"); - Platform::Sleep(5); - } HasFocus = hasFocus; } diff --git a/Source/Editor/Editor.cs b/Source/Editor/Editor.cs index e4e945f31..1a1fd3b2d 100644 --- a/Source/Editor/Editor.cs +++ b/Source/Editor/Editor.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.IO; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Runtime.InteropServices.Marshalling; using FlaxEditor.Content; using FlaxEditor.Content.Import; using FlaxEditor.Content.Settings; @@ -18,8 +19,11 @@ using FlaxEditor.Windows.Assets; using FlaxEngine; using FlaxEngine.Assertions; using FlaxEngine.GUI; +using FlaxEngine.Interop; using FlaxEngine.Json; +#pragma warning disable CS1591 + namespace FlaxEditor { /// @@ -62,17 +66,20 @@ namespace FlaxEditor /// /// Gets a value indicating whether this Editor is running a dev instance of the engine. /// - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool IsDevInstance(); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_IsDevInstance", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalAs(UnmanagedType.U1)] + internal static partial bool IsDevInstance(); /// /// Gets a value indicating whether this Editor is running as official build (distributed via Flax services). /// - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool IsOfficialBuild(); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_IsOfficialBuild", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalAs(UnmanagedType.U1)] + internal static partial bool IsOfficialBuild(); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_IsPlayMode(); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_IsPlayMode", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalAs(UnmanagedType.U1)] + internal static partial bool Internal_IsPlayMode(); /// /// True if the editor is running now in a play mode. Assigned by the managed editor instance. @@ -724,9 +731,16 @@ namespace FlaxEditor // Invoke new instance if need to open a project if (!string.IsNullOrEmpty(_projectToOpen)) { - string args = string.Format("-project \"{0}\"", _projectToOpen); + var procSettings = new CreateProcessSettings + { + FileName = Platform.ExecutableFilePath, + Arguments = string.Format("-project \"{0}\"", _projectToOpen), + ShellExecute = true, + WaitForEnd = false, + HiddenWindow = false, + }; _projectToOpen = null; - Platform.StartProcess(Platform.ExecutableFilePath, args, null); + Platform.CreateProcess(ref procSettings); } } @@ -919,47 +933,6 @@ namespace FlaxEditor Animation = 11, } - /// - /// Imports the asset file to the target location. - /// - /// The source file path. - /// The result asset file path. - /// True if importing failed, otherwise false. - public static bool Import(string inputPath, string outputPath) - { - return Internal_Import(inputPath, outputPath, IntPtr.Zero); - } - - /// - /// Imports the texture asset file to the target location. - /// - /// The source file path. - /// The result asset file path. - /// The settings. - /// True if importing failed, otherwise false. - public static bool Import(string inputPath, string outputPath, TextureImportSettings settings) - { - if (settings == null) - throw new ArgumentNullException(); - settings.ToInternal(out var internalOptions); - return Internal_ImportTexture(inputPath, outputPath, ref internalOptions); - } - - /// - /// Imports the model asset file to the target location. - /// - /// The source file path. - /// The result asset file path. - /// The settings. - /// True if importing failed, otherwise false. - public static bool Import(string inputPath, string outputPath, ModelImportSettings settings) - { - if (settings == null) - throw new ArgumentNullException(); - settings.ToInternal(out var internalOptions); - return Internal_ImportModel(inputPath, outputPath, ref internalOptions); - } - /// /// Imports the audio asset file to the target location. /// @@ -1318,6 +1291,7 @@ namespace FlaxEditor } [StructLayout(LayoutKind.Sequential)] + [NativeMarshalling(typeof(VisualScriptLocalMarshaller))] internal struct VisualScriptLocal { public string Value; @@ -1326,7 +1300,52 @@ namespace FlaxEditor public int BoxId; } + [CustomMarshaller(typeof(VisualScriptLocal), MarshalMode.Default, typeof(VisualScriptLocalMarshaller))] + internal static class VisualScriptLocalMarshaller + { + [StructLayout(LayoutKind.Sequential)] + internal struct VisualScriptLocalNative + { + public IntPtr Value; + public IntPtr ValueTypeName; + public uint NodeId; + public int BoxId; + } + + internal static VisualScriptLocal ConvertToManaged(VisualScriptLocalNative unmanaged) => ToManaged(unmanaged); + internal static VisualScriptLocalNative ConvertToUnmanaged(VisualScriptLocal managed) => ToNative(managed); + + internal static VisualScriptLocal ToManaged(VisualScriptLocalNative managed) + { + return new VisualScriptLocal() + { + Value = ManagedString.ToManaged(managed.Value), + ValueTypeName = ManagedString.ToManaged(managed.ValueTypeName), + NodeId = managed.NodeId, + BoxId = managed.BoxId, + }; + } + + internal static VisualScriptLocalNative ToNative(VisualScriptLocal managed) + { + return new VisualScriptLocalNative() + { + Value = ManagedString.ToNative(managed.Value), + ValueTypeName = ManagedString.ToNative(managed.ValueTypeName), + NodeId = managed.NodeId, + BoxId = managed.BoxId, + }; + } + + internal static void Free(VisualScriptLocalNative unmanaged) + { + ManagedString.Free(unmanaged.Value); + ManagedString.Free(unmanaged.ValueTypeName); + } + } + [StructLayout(LayoutKind.Sequential)] + [NativeMarshalling(typeof(VisualScriptStackFrameMarshaller))] internal struct VisualScriptStackFrame { public VisualScript Script; @@ -1334,6 +1353,45 @@ namespace FlaxEditor public int BoxId; } + [CustomMarshaller(typeof(VisualScriptStackFrame), MarshalMode.Default, typeof(VisualScriptStackFrameMarshaller))] + internal static class VisualScriptStackFrameMarshaller + { + [StructLayout(LayoutKind.Sequential)] + internal struct VisualScriptStackFrameNative + { + public IntPtr Script; + public uint NodeId; + public int BoxId; + } + + internal static VisualScriptStackFrame ConvertToManaged(VisualScriptStackFrameNative unmanaged) => ToManaged(unmanaged); + internal static VisualScriptStackFrameNative ConvertToUnmanaged(VisualScriptStackFrame managed) => ToNative(managed); + + internal static VisualScriptStackFrame ToManaged(VisualScriptStackFrameNative managed) + { + return new VisualScriptStackFrame() + { + Script = VisualScriptMarshaller.ConvertToManaged(managed.Script), + NodeId = managed.NodeId, + BoxId = managed.BoxId, + }; + } + + internal static VisualScriptStackFrameNative ToNative(VisualScriptStackFrame managed) + { + return new VisualScriptStackFrameNative() + { + Script = VisualScriptMarshaller.ConvertToUnmanaged(managed.Script), + NodeId = managed.NodeId, + BoxId = managed.BoxId, + }; + } + + internal static void Free(VisualScriptStackFrameNative unmanaged) + { + } + } + internal void BuildCommand(string arg) { if (TryBuildCommand(arg)) @@ -1531,116 +1589,121 @@ namespace FlaxEditor Instance.StateMachine.StateChanged += RequestStartPlayOnEditMode; } - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern int Internal_ReadOutputLogs(string[] outMessages, byte[] outLogTypes, long[] outLogTimes); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_ReadOutputLogs", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.Interop.StringMarshaller))] + internal static partial int Internal_ReadOutputLogs([MarshalUsing(typeof(FlaxEngine.Interop.ArrayMarshaller<,>), CountElementName = "outCapacity")] ref string[] outMessages, [MarshalUsing(typeof(FlaxEngine.Interop.ArrayMarshaller<,>), CountElementName = "outCapacity")] ref byte[] outLogTypes, [MarshalUsing(typeof(FlaxEngine.Interop.ArrayMarshaller<,>), CountElementName = "outCapacity")] ref long[] outLogTimes, int outCapacity); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_SetPlayMode(bool value); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_SetPlayMode", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.Interop.StringMarshaller))] + internal static partial void Internal_SetPlayMode([MarshalAs(UnmanagedType.U1)] bool value); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern string Internal_GetProjectPath(); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetProjectPath", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + internal static partial string Internal_GetProjectPath(); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_CloneAssetFile(string dstPath, string srcPath, ref Guid dstId); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CloneAssetFile", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalAs(UnmanagedType.U1)] + internal static partial bool Internal_CloneAssetFile(string dstPath, string srcPath, ref Guid dstId); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_Import(string inputPath, string outputPath, IntPtr arg); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_ImportAudio", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalAs(UnmanagedType.U1)] + internal static partial bool Internal_ImportAudio(string inputPath, string outputPath, ref AudioImportSettings.InternalOptions options); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_ImportTexture(string inputPath, string outputPath, ref TextureImportSettings.InternalOptions options); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetAudioClipMetadata", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + internal static partial void Internal_GetAudioClipMetadata(IntPtr obj, out int originalSize, out int importedSize); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_ImportModel(string inputPath, string outputPath, ref ModelImportSettings.InternalOptions options); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_SaveJsonAsset", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalAs(UnmanagedType.U1)] + internal static partial bool Internal_SaveJsonAsset(string outputPath, string data, string typename); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_ImportAudio(string inputPath, string outputPath, ref AudioImportSettings.InternalOptions options); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CopyCache", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + internal static partial void Internal_CopyCache(ref Guid dstId, ref Guid srcId); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_GetAudioClipMetadata(IntPtr obj, out int originalSize, out int importedSize); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_BakeLightmaps", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + internal static partial void Internal_BakeLightmaps([MarshalAs(UnmanagedType.U1)] bool cancel); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_SaveJsonAsset(string outputPath, string data, string typename); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetShaderAssetSourceCode", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + internal static partial string Internal_GetShaderAssetSourceCode(IntPtr obj); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_CopyCache(ref Guid dstId, ref Guid srcId); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CookMeshCollision", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalAs(UnmanagedType.U1)] + internal static partial bool Internal_CookMeshCollision(string path, CollisionDataType type, IntPtr model, int modelLodIndex, uint materialSlotsMask, ConvexMeshGenerationFlags convexFlags, int convexVertexLimit); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_BakeLightmaps(bool cancel); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetCollisionWires", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + internal static partial void Internal_GetCollisionWires(IntPtr collisionData, [MarshalUsing(typeof(FlaxEngine.Interop.ArrayMarshaller<,>), CountElementName = "trianglesCount")] out Float3[] triangles, [MarshalUsing(typeof(FlaxEngine.Interop.ArrayMarshaller<,>), CountElementName = "indicesCount")] out int[] indices, out int trianglesCount, out int indicesCount); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern string Internal_GetShaderAssetSourceCode(IntPtr obj); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetEditorBoxWithChildren", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + internal static partial void Internal_GetEditorBoxWithChildren(IntPtr obj, out BoundingBox resultAsRef); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_CookMeshCollision(string path, CollisionDataType type, IntPtr model, int modelLodIndex, uint materialSlotsMask, ConvexMeshGenerationFlags convexFlags, int convexVertexLimit); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_SetOptions", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + internal static partial void Internal_SetOptions(ref InternalOptions options); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_GetCollisionWires(IntPtr collisionData, out Float3[] triangles, out int[] indices); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_DrawNavMesh", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + internal static partial void Internal_DrawNavMesh(); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_GetEditorBoxWithChildren(IntPtr obj, out BoundingBox resultAsRef); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CloseSplashScreen", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + internal static partial void Internal_CloseSplashScreen(); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_SetOptions(ref InternalOptions options); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CreateAsset", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalAs(UnmanagedType.U1)] + internal static partial bool Internal_CreateAsset(NewAssetType type, string outputPath); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_DrawNavMesh(); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CreateVisualScript", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalAs(UnmanagedType.U1)] + internal static partial bool Internal_CreateVisualScript(string outputPath, string baseTypename); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_CloseSplashScreen(); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CanImport", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + internal static partial string Internal_CanImport(string extension); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_CreateAsset(NewAssetType type, string outputPath); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CanExport", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalAs(UnmanagedType.U1)] + internal static partial bool Internal_CanExport(string path); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_CreateVisualScript(string outputPath, string baseTypename); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_Export", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalAs(UnmanagedType.U1)] + internal static partial bool Internal_Export(string inputPath, string outputFolder); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern string Internal_CanImport(string extension); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetIsEveryAssemblyLoaded", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalAs(UnmanagedType.U1)] + internal static partial bool Internal_GetIsEveryAssemblyLoaded(); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_CanExport(string path); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetLastProjectOpenedEngineBuild", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + internal static partial int Internal_GetLastProjectOpenedEngineBuild(); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_Export(string inputPath, string outputFolder); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetIsCSGActive", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalAs(UnmanagedType.U1)] + internal static partial bool Internal_GetIsCSGActive(); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_GetIsEveryAssemblyLoaded(); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_RunVisualScriptBreakpointLoopTick", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + internal static partial void Internal_RunVisualScriptBreakpointLoopTick(float deltaTime); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern int Internal_GetLastProjectOpenedEngineBuild(); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetVisualScriptLocals", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalUsing(typeof(FlaxEngine.Interop.ArrayMarshaller<,>), CountElementName = "localsCount")] + internal static partial VisualScriptLocal[] Internal_GetVisualScriptLocals(out int localsCount); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_GetIsCSGActive(); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetVisualScriptStackFrames", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalUsing(typeof(FlaxEngine.Interop.ArrayMarshaller<,>), CountElementName = "stackFrameCount")] + internal static partial VisualScriptStackFrame[] Internal_GetVisualScriptStackFrames(out int stackFrameCount); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_RunVisualScriptBreakpointLoopTick(float deltaTime); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetVisualScriptPreviousScopeFrame", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + internal static partial VisualScriptStackFrame Internal_GetVisualScriptPreviousScopeFrame(); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern VisualScriptLocal[] Internal_GetVisualScriptLocals(); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_EvaluateVisualScriptLocal", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalAs(UnmanagedType.U1)] + internal static partial bool Internal_EvaluateVisualScriptLocal(IntPtr script, ref VisualScriptLocal local); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern VisualScriptStackFrame[] Internal_GetVisualScriptStackFrames(); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_DeserializeSceneObject", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + internal static partial void Internal_DeserializeSceneObject(IntPtr sceneObject, string json); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern VisualScriptStackFrame Internal_GetVisualScriptPreviousScopeFrame(); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_LoadAsset", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + internal static partial void Internal_LoadAsset(ref Guid id); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_EvaluateVisualScriptLocal(IntPtr script, ref VisualScriptLocal local); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_CanSetToRoot", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalAs(UnmanagedType.U1)] + internal static partial bool Internal_CanSetToRoot(IntPtr prefab, IntPtr newRoot); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_DeserializeSceneObject(IntPtr sceneObject, string json); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_GetAnimationTime", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + internal static partial float Internal_GetAnimationTime(IntPtr animatedModel); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_LoadAsset(ref Guid id); - - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_CanSetToRoot(IntPtr prefab, IntPtr newRoot); - - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern float Internal_GetAnimationTime(IntPtr animatedModel); - - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_SetAnimationTime(IntPtr animatedModel, float time); + [LibraryImport("FlaxEngine", EntryPoint = "EditorInternal_SetAnimationTime", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + internal static partial void Internal_SetAnimationTime(IntPtr animatedModel, float time); #endregion } diff --git a/Source/Editor/EditorIcons.cs b/Source/Editor/EditorIcons.cs index 2de1ff763..127ba3f6f 100644 --- a/Source/Editor/EditorIcons.cs +++ b/Source/Editor/EditorIcons.cs @@ -137,11 +137,13 @@ namespace FlaxEditor public SpriteHandle PS4Icon128; public SpriteHandle PS5Icon128; public SpriteHandle MacOSIcon128; + public SpriteHandle IOSIcon128; public SpriteHandle FlaxLogo128; public SpriteHandle SwitchIcon128; public SpriteHandle SwitchSettings128; public SpriteHandle LocalizationSettings128; public SpriteHandle Json128; + public SpriteHandle AppleSettings128; internal void LoadIcons() { diff --git a/Source/Editor/GUI/AssetPicker.cs b/Source/Editor/GUI/AssetPicker.cs index a359c288c..bfded5380 100644 --- a/Source/Editor/GUI/AssetPicker.cs +++ b/Source/Editor/GUI/AssetPicker.cs @@ -7,6 +7,7 @@ using FlaxEditor.GUI.Drag; using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; namespace FlaxEditor.GUI { @@ -205,6 +206,11 @@ namespace FlaxEditor.GUI /// public event Action SelectedItemChanged; + /// + /// The custom callback for assets validation. Cane be used to implement a rule for assets to pick. + /// + public Func CheckValid; + /// /// False if changing selected item is disabled. /// @@ -214,6 +220,8 @@ namespace FlaxEditor.GUI { if (_fileExtension != null && !item.Path.EndsWith(_fileExtension)) return false; + if (CheckValid != null && !CheckValid(item)) + return false; if (_type == ScriptType.Null) return true; diff --git a/Source/Editor/GUI/CurveEditor.Contents.cs b/Source/Editor/GUI/CurveEditor.Contents.cs index dca6d0450..2d3c2d606 100644 --- a/Source/Editor/GUI/CurveEditor.Contents.cs +++ b/Source/Editor/GUI/CurveEditor.Contents.cs @@ -8,6 +8,7 @@ using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; using FlaxEngine.Json; +using FlaxEngine.Utilities; namespace FlaxEditor.GUI { diff --git a/Source/Editor/GUI/Docking/DockWindow.cs b/Source/Editor/GUI/Docking/DockWindow.cs index 5eb650898..dd4e39ce2 100644 --- a/Source/Editor/GUI/Docking/DockWindow.cs +++ b/Source/Editor/GUI/Docking/DockWindow.cs @@ -1,6 +1,7 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using System.Xml; +using System.Globalization; using FlaxEngine; using FlaxEngine.Assertions; using FlaxEngine.GUI; @@ -423,6 +424,29 @@ namespace FlaxEditor.GUI.Docking { } + /// + /// Serializes splitter panel value into the saved layout. + /// + /// The Xml writer. + /// The Xml attribute name to use for value. + /// The splitter panel. + protected void LayoutSerializeSplitter(XmlWriter writer, string name, SplitPanel splitter) + { + writer.WriteAttributeString(name, splitter.SplitterValue.ToString(CultureInfo.InvariantCulture)); + } + + /// + /// Deserializes splitter panel value from the saved layout. + /// + /// The Xml document node. + /// The Xml attribute name to use for value. + /// The splitter panel. + protected void LayoutDeserializeSplitter(XmlElement node, string name, SplitPanel splitter) + { + if (float.TryParse(node.GetAttribute(name), CultureInfo.InvariantCulture, out float value) && value > 0.01f && value < 0.99f) + splitter.SplitterValue = value; + } + /// public override void OnDestroy() { diff --git a/Source/Editor/GUI/Drag/DragActorType.cs b/Source/Editor/GUI/Drag/DragActorType.cs index 40b66bbdf..ac62a045b 100644 --- a/Source/Editor/GUI/Drag/DragActorType.cs +++ b/Source/Editor/GUI/Drag/DragActorType.cs @@ -6,6 +6,7 @@ using FlaxEditor.SceneGraph; using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; namespace FlaxEditor.GUI.Drag { diff --git a/Source/Editor/GUI/EnumComboBox.cs b/Source/Editor/GUI/EnumComboBox.cs index fc0d45d2b..110693af8 100644 --- a/Source/Editor/GUI/EnumComboBox.cs +++ b/Source/Editor/GUI/EnumComboBox.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Runtime.InteropServices; using FlaxEditor.CustomEditors; using FlaxEditor.CustomEditors.Elements; using FlaxEditor.Scripting; @@ -170,7 +171,7 @@ namespace FlaxEditor.GUI BuildEntriesDefault(type, _entries, formatMode); var hasTooltips = false; - var entries = Utils.ExtractArrayFromList(_entries); + var entries = CollectionsMarshal.AsSpan(_entries); for (int i = 0; i < _entries.Count; i++) { ref var e = ref entries[i]; diff --git a/Source/Editor/GUI/PlatformSelector.cs b/Source/Editor/GUI/PlatformSelector.cs index 0b57551e9..1e03a9677 100644 --- a/Source/Editor/GUI/PlatformSelector.cs +++ b/Source/Editor/GUI/PlatformSelector.cs @@ -92,6 +92,7 @@ namespace FlaxEditor.GUI new PlatformData(PlatformType.Switch, icons.SwitchIcon128, "Switch"), new PlatformData(PlatformType.PS5, icons.PS5Icon128, "PlayStation 5"), new PlatformData(PlatformType.Mac, icons.MacOSIcon128, "macOS"), + new PlatformData(PlatformType.iOS, icons.IOSIcon128, "iOS"), }; const float IconSize = 64.0f; diff --git a/Source/Editor/GUI/Popups/ScriptSearchPopup.cs b/Source/Editor/GUI/Popups/ScriptSearchPopup.cs index 839346b5a..b771adff6 100644 --- a/Source/Editor/GUI/Popups/ScriptSearchPopup.cs +++ b/Source/Editor/GUI/Popups/ScriptSearchPopup.cs @@ -4,6 +4,7 @@ using System; using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; namespace FlaxEditor.GUI { diff --git a/Source/Editor/GUI/Timeline/GUI/KeyframesEditor.cs b/Source/Editor/GUI/Timeline/GUI/KeyframesEditor.cs index afc0768d9..cb781229f 100644 --- a/Source/Editor/GUI/Timeline/GUI/KeyframesEditor.cs +++ b/Source/Editor/GUI/Timeline/GUI/KeyframesEditor.cs @@ -11,6 +11,7 @@ using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; using FlaxEngine.Json; +using FlaxEngine.Utilities; namespace FlaxEditor.GUI { diff --git a/Source/Editor/GUI/Timeline/ParticleSystemTimeline.cs b/Source/Editor/GUI/Timeline/ParticleSystemTimeline.cs index fa9ecae70..5febb2eaa 100644 --- a/Source/Editor/GUI/Timeline/ParticleSystemTimeline.cs +++ b/Source/Editor/GUI/Timeline/ParticleSystemTimeline.cs @@ -10,6 +10,7 @@ using FlaxEditor.GUI.Timeline.Tracks; using FlaxEditor.Utilities; using FlaxEditor.Viewport.Previews; using FlaxEngine; +using FlaxEngine.Utilities; namespace FlaxEditor.GUI.Timeline { diff --git a/Source/Editor/GUI/Timeline/Tracks/AnimationEventTrack.cs b/Source/Editor/GUI/Timeline/Tracks/AnimationEventTrack.cs index 5b7ecddef..4e78ca8ae 100644 --- a/Source/Editor/GUI/Timeline/Tracks/AnimationEventTrack.cs +++ b/Source/Editor/GUI/Timeline/Tracks/AnimationEventTrack.cs @@ -10,6 +10,7 @@ using FlaxEditor.Scripting; using FlaxEditor.Utilities; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; using Object = FlaxEngine.Object; namespace FlaxEditor.GUI.Timeline.Tracks diff --git a/Source/Editor/GUI/Timeline/Tracks/CurvePropertyTrack.cs b/Source/Editor/GUI/Timeline/Tracks/CurvePropertyTrack.cs index e74fd0273..65caf4f3d 100644 --- a/Source/Editor/GUI/Timeline/Tracks/CurvePropertyTrack.cs +++ b/Source/Editor/GUI/Timeline/Tracks/CurvePropertyTrack.cs @@ -9,6 +9,7 @@ using System.Text; using FlaxEditor.GUI.Timeline.Undo; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; namespace FlaxEditor.GUI.Timeline.Tracks { @@ -539,7 +540,7 @@ namespace FlaxEditor.GUI.Timeline.Tracks throw new Exception("Invalid track data."); var keyframes = new object[keyframesCount]; - var propertyType = Scripting.TypeUtils.GetType(e.MemberTypeName).Type; + var propertyType = TypeUtils.GetType(e.MemberTypeName).Type; if (propertyType == null) { stream.ReadBytes(keyframesCount * (sizeof(float) + valueSize * 3)); diff --git a/Source/Editor/GUI/Timeline/Tracks/EventTrack.cs b/Source/Editor/GUI/Timeline/Tracks/EventTrack.cs index e7e34fdda..f13bfe811 100644 --- a/Source/Editor/GUI/Timeline/Tracks/EventTrack.cs +++ b/Source/Editor/GUI/Timeline/Tracks/EventTrack.cs @@ -10,6 +10,7 @@ using System.Text; using FlaxEditor.GUI.Timeline.Undo; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; namespace FlaxEditor.GUI.Timeline.Tracks { @@ -51,7 +52,7 @@ namespace FlaxEditor.GUI.Timeline.Tracks { e.EventParamsSizes[i] = stream.ReadInt32(); var paramTypeName = LoadName(stream); - e.EventParamsTypes[i] = Scripting.TypeUtils.GetManagedType(paramTypeName); + e.EventParamsTypes[i] = TypeUtils.GetManagedType(paramTypeName); if (e.EventParamsTypes[i] == null) isInvalid = true; } diff --git a/Source/Editor/GUI/Timeline/Tracks/KeyframesPropertyTrack.cs b/Source/Editor/GUI/Timeline/Tracks/KeyframesPropertyTrack.cs index f2ac84a4d..fa80912f9 100644 --- a/Source/Editor/GUI/Timeline/Tracks/KeyframesPropertyTrack.cs +++ b/Source/Editor/GUI/Timeline/Tracks/KeyframesPropertyTrack.cs @@ -9,6 +9,7 @@ using System.Text; using FlaxEditor.GUI.Timeline.Undo; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; namespace FlaxEditor.GUI.Timeline.Tracks { @@ -56,7 +57,7 @@ namespace FlaxEditor.GUI.Timeline.Tracks var keyframes = new KeyframesEditor.Keyframe[keyframesCount]; var dataBuffer = new byte[e.ValueSize]; - var propertyType = Scripting.TypeUtils.GetManagedType(e.MemberTypeName); + var propertyType = TypeUtils.GetManagedType(e.MemberTypeName); if (propertyType == null) { e.Keyframes.ResetKeyframes(); diff --git a/Source/Editor/GUI/Timeline/Tracks/ObjectPropertyTrack.cs b/Source/Editor/GUI/Timeline/Tracks/ObjectPropertyTrack.cs index c753c98ed..fde00ecaf 100644 --- a/Source/Editor/GUI/Timeline/Tracks/ObjectPropertyTrack.cs +++ b/Source/Editor/GUI/Timeline/Tracks/ObjectPropertyTrack.cs @@ -4,6 +4,7 @@ using System; using System.IO; using System.Text; using FlaxEngine.GUI; +using FlaxEngine.Utilities; namespace FlaxEditor.GUI.Timeline.Tracks { @@ -48,7 +49,7 @@ namespace FlaxEditor.GUI.Timeline.Tracks if (stream.ReadChar() != 0) throw new Exception("Invalid track data."); - var propertyType = Scripting.TypeUtils.GetType(e.MemberTypeName); + var propertyType = TypeUtils.GetType(e.MemberTypeName); if (!propertyType) { if (!string.IsNullOrEmpty(e.MemberTypeName)) diff --git a/Source/Editor/GUI/Timeline/Tracks/ObjectReferencePropertyTrack.cs b/Source/Editor/GUI/Timeline/Tracks/ObjectReferencePropertyTrack.cs index da1502b71..371d65082 100644 --- a/Source/Editor/GUI/Timeline/Tracks/ObjectReferencePropertyTrack.cs +++ b/Source/Editor/GUI/Timeline/Tracks/ObjectReferencePropertyTrack.cs @@ -4,6 +4,7 @@ using System; using System.IO; using System.Reflection; using System.Text; +using FlaxEngine.Utilities; namespace FlaxEditor.GUI.Timeline.Tracks { @@ -51,7 +52,7 @@ namespace FlaxEditor.GUI.Timeline.Tracks throw new Exception("Invalid track data."); var keyframes = new KeyframesEditor.Keyframe[keyframesCount]; - var propertyType = Scripting.TypeUtils.GetType(e.MemberTypeName); + var propertyType = TypeUtils.GetType(e.MemberTypeName); if (!propertyType) { e.Keyframes.ResetKeyframes(); diff --git a/Source/Editor/GUI/Timeline/Tracks/StringPropertyTrack.cs b/Source/Editor/GUI/Timeline/Tracks/StringPropertyTrack.cs index ffbf64a99..6e733f47d 100644 --- a/Source/Editor/GUI/Timeline/Tracks/StringPropertyTrack.cs +++ b/Source/Editor/GUI/Timeline/Tracks/StringPropertyTrack.cs @@ -3,6 +3,7 @@ using System; using System.IO; using System.Text; +using FlaxEngine.Utilities; namespace FlaxEditor.GUI.Timeline.Tracks { @@ -50,7 +51,7 @@ namespace FlaxEditor.GUI.Timeline.Tracks throw new Exception("Invalid track data."); var keyframes = new KeyframesEditor.Keyframe[keyframesCount]; - var propertyType = Scripting.TypeUtils.GetType(e.MemberTypeName); + var propertyType = TypeUtils.GetType(e.MemberTypeName); if (!propertyType) { e.Keyframes.ResetKeyframes(); diff --git a/Source/Editor/GUI/Timeline/Tracks/StructPropertyTrack.cs b/Source/Editor/GUI/Timeline/Tracks/StructPropertyTrack.cs index 6cce0d738..26f9d2ad9 100644 --- a/Source/Editor/GUI/Timeline/Tracks/StructPropertyTrack.cs +++ b/Source/Editor/GUI/Timeline/Tracks/StructPropertyTrack.cs @@ -5,6 +5,7 @@ using System.IO; using System.Reflection; using System.Text; using FlaxEngine.GUI; +using FlaxEngine.Utilities; namespace FlaxEditor.GUI.Timeline.Tracks { @@ -49,7 +50,7 @@ namespace FlaxEditor.GUI.Timeline.Tracks if (stream.ReadChar() != 0) throw new Exception("Invalid track data."); - var propertyType = Scripting.TypeUtils.GetType(e.MemberTypeName); + var propertyType = TypeUtils.GetType(e.MemberTypeName); if (!propertyType) { if (!string.IsNullOrEmpty(e.MemberTypeName)) diff --git a/Source/Editor/Managed/ManagedEditor.Internal.cpp b/Source/Editor/Managed/ManagedEditor.Internal.cpp index dcaa25e6c..bed9cfb5c 100644 --- a/Source/Editor/Managed/ManagedEditor.Internal.cpp +++ b/Source/Editor/Managed/ManagedEditor.Internal.cpp @@ -9,11 +9,11 @@ #include "Engine/ContentExporters/AssetsExportingManager.h" #include "Editor/CustomEditors/CustomEditorsUtil.h" #include "Engine/Scripting/Scripting.h" -#include "Engine/Scripting/InternalCalls.h" #include "Engine/Scripting/ManagedCLR/MUtils.h" #include "Engine/Scripting/ManagedCLR/MClass.h" #include "Engine/Scripting/ManagedCLR/MAssembly.h" -#include "Engine/Scripting/StdTypesContainer.h" +#include "Engine/Scripting/Internal/InternalCalls.h" +#include "Engine/Scripting/Internal/StdTypesContainer.h" #include "Engine/Graphics/Shaders/Cache/ShaderCacheManager.h" #include "Engine/ShadowsOfMordor/Builder.h" #include "Engine/Physics/CollisionData.h" @@ -47,7 +47,6 @@ #include "FlaxEngine.Gen.h" #include "Engine/Level/Actors/AnimatedModel.h" #include "Engine/Serialization/JsonTools.h" -#include Guid ManagedEditor::ObjectID(0x91970b4e, 0x99634f61, 0x84723632, 0x54c776af); @@ -57,240 +56,6 @@ Guid ManagedEditor::ObjectID(0x91970b4e, 0x99634f61, 0x84723632, 0x54c776af); #pragma warning( disable : 4800) #endif -struct InternalTextureOptions -{ - TextureFormatType Type; - byte IsAtlas; - byte NeverStream; - byte Compress; - byte IndependentChannels; - byte sRGB; - byte GenerateMipMaps; - byte FlipY; - byte Resize; - byte PreserveAlphaCoverage; - float PreserveAlphaCoverageReference; - float Scale; - int32 MaxSize; - int32 TextureGroup; - int32 SizeX; - int32 SizeY; - MonoArray* SpriteAreas; - MonoArray* SpriteNames; - - static void Convert(InternalTextureOptions* from, ImportTexture::Options* to) - { - to->Type = from->Type; - to->IsAtlas = from->IsAtlas; - to->NeverStream = from->NeverStream; - to->Compress = from->Compress; - to->IndependentChannels = from->IndependentChannels; - to->sRGB = from->sRGB; - to->GenerateMipMaps = from->GenerateMipMaps; - to->FlipY = from->FlipY; - to->Scale = from->Scale; - to->Resize = from->Resize; - to->PreserveAlphaCoverage = from->PreserveAlphaCoverage; - to->PreserveAlphaCoverageReference = from->PreserveAlphaCoverageReference; - to->MaxSize = from->MaxSize; - to->TextureGroup = from->TextureGroup; - to->SizeX = from->SizeX; - to->SizeY = from->SizeY; - to->Sprites.Clear(); - if (from->SpriteNames != nullptr) - { - int32 count = (int32)mono_array_length(from->SpriteNames); - ASSERT(count == (int32)mono_array_length(from->SpriteAreas)); - to->Sprites.EnsureCapacity(count); - for (int32 i = 0; i < count; i++) - { - Sprite& sprite = to->Sprites.AddOne(); - sprite.Area = mono_array_get(from->SpriteAreas, Rectangle, i); - sprite.Name = MUtils::ToString(mono_array_get(from->SpriteNames, MonoString*, i)); - } - } - } - - static void Convert(ImportTexture::Options* from, InternalTextureOptions* to) - { - to->Type = from->Type; - to->IsAtlas = from->IsAtlas; - to->NeverStream = from->NeverStream; - to->Compress = from->Compress; - to->IndependentChannels = from->IndependentChannels; - to->sRGB = from->sRGB; - to->GenerateMipMaps = from->GenerateMipMaps; - to->FlipY = from->FlipY; - to->Resize = from->Resize; - to->PreserveAlphaCoverage = from->PreserveAlphaCoverage; - to->PreserveAlphaCoverageReference = from->PreserveAlphaCoverageReference; - to->Scale = from->Scale; - to->MaxSize = from->MaxSize; - to->TextureGroup = from->TextureGroup; - to->SizeX = from->SizeX; - to->SizeY = from->SizeY; - if (from->Sprites.HasItems()) - { - const auto domain = mono_domain_get(); - int32 count = from->Sprites.Count(); - auto rectClass = Rectangle::TypeInitializer.GetType().ManagedClass; - ASSERT(rectClass != nullptr); - to->SpriteAreas = mono_array_new(domain, rectClass->GetNative(), count); - to->SpriteNames = mono_array_new(domain, mono_get_string_class(), count); - for (int32 i = 0; i < count; i++) - { - mono_array_set(to->SpriteAreas, Rectangle, i, from->Sprites[i].Area); - mono_array_setref(to->SpriteNames, i, MUtils::ToString(from->Sprites[i].Name, domain)); - } - } - else - { - to->SpriteAreas = nullptr; - to->SpriteNames = nullptr; - } - } -}; - -struct InternalModelOptions -{ - ModelTool::ModelType Type; - - // Geometry - byte CalculateNormals; - float SmoothingNormalsAngle; - byte FlipNormals; - float SmoothingTangentsAngle; - byte CalculateTangents; - byte OptimizeMeshes; - byte MergeMeshes; - byte ImportLODs; - byte ImportVertexColors; - byte ImportBlendShapes; - ModelLightmapUVsSource LightmapUVsSource; - MonoString* CollisionMeshesPrefix; - - // Transform - float Scale; - Quaternion Rotation; - Float3 Translation; - byte CenterGeometry; - - // Animation - ModelTool::AnimationDuration Duration; - float FramesRangeStart; - float FramesRangeEnd; - float DefaultFrameRate; - float SamplingRate; - byte SkipEmptyCurves; - byte OptimizeKeyframes; - byte ImportScaleTracks; - byte EnableRootMotion; - MonoString* RootNodeName; - - // Level Of Detail - byte GenerateLODs; - int32 BaseLOD; - int32 LODCount; - float TriangleReduction; - - // Misc - byte ImportMaterials; - byte ImportTextures; - byte RestoreMaterialsOnReimport; - - // SDF - byte GenerateSDF; - float SDFResolution; - - // Splitting - byte SplitObjects; - int32 ObjectIndex; - - static void Convert(InternalModelOptions* from, ImportModelFile::Options* to) - { - to->Type = from->Type; - to->CalculateNormals = from->CalculateNormals; - to->SmoothingNormalsAngle = from->SmoothingNormalsAngle; - to->FlipNormals = from->FlipNormals; - to->SmoothingTangentsAngle = from->SmoothingTangentsAngle; - to->CalculateTangents = from->CalculateTangents; - to->OptimizeMeshes = from->OptimizeMeshes; - to->MergeMeshes = from->MergeMeshes; - to->ImportLODs = from->ImportLODs; - to->ImportVertexColors = from->ImportVertexColors; - to->ImportBlendShapes = from->ImportBlendShapes; - to->LightmapUVsSource = from->LightmapUVsSource; - to->CollisionMeshesPrefix = MUtils::ToString(from->CollisionMeshesPrefix); - to->Scale = from->Scale; - to->Rotation = from->Rotation; - to->Translation = from->Translation; - to->CenterGeometry = from->CenterGeometry; - to->Duration = from->Duration; - to->FramesRange.X = from->FramesRangeStart; - to->FramesRange.Y = from->FramesRangeEnd; - to->DefaultFrameRate = from->DefaultFrameRate; - to->SamplingRate = from->SamplingRate; - to->SkipEmptyCurves = from->SkipEmptyCurves; - to->OptimizeKeyframes = from->OptimizeKeyframes; - to->ImportScaleTracks = from->ImportScaleTracks; - to->EnableRootMotion = from->EnableRootMotion; - to->RootNodeName = MUtils::ToString(from->RootNodeName); - to->GenerateLODs = from->GenerateLODs; - to->BaseLOD = from->BaseLOD; - to->LODCount = from->LODCount; - to->TriangleReduction = from->TriangleReduction; - to->ImportMaterials = from->ImportMaterials; - to->ImportTextures = from->ImportTextures; - to->RestoreMaterialsOnReimport = from->RestoreMaterialsOnReimport; - to->GenerateSDF = from->GenerateSDF; - to->SDFResolution = from->SDFResolution; - to->SplitObjects = from->SplitObjects; - to->ObjectIndex = from->ObjectIndex; - } - - static void Convert(ImportModelFile::Options* from, InternalModelOptions* to) - { - to->Type = from->Type; - to->CalculateNormals = from->CalculateNormals; - to->SmoothingNormalsAngle = from->SmoothingNormalsAngle; - to->FlipNormals = from->FlipNormals; - to->SmoothingTangentsAngle = from->SmoothingTangentsAngle; - to->CalculateTangents = from->CalculateTangents; - to->OptimizeMeshes = from->OptimizeMeshes; - to->MergeMeshes = from->MergeMeshes; - to->ImportLODs = from->ImportLODs; - to->ImportVertexColors = from->ImportVertexColors; - to->ImportBlendShapes = from->ImportBlendShapes; - to->LightmapUVsSource = from->LightmapUVsSource; - to->CollisionMeshesPrefix = MUtils::ToString(from->CollisionMeshesPrefix); - to->Scale = from->Scale; - to->Rotation = from->Rotation; - to->Translation = from->Translation; - to->CenterGeometry = from->CenterGeometry; - to->Duration = from->Duration; - to->FramesRangeStart = from->FramesRange.X; - to->FramesRangeEnd = from->FramesRange.Y; - to->DefaultFrameRate = from->DefaultFrameRate; - to->SamplingRate = from->SamplingRate; - to->SkipEmptyCurves = from->SkipEmptyCurves; - to->OptimizeKeyframes = from->OptimizeKeyframes; - to->ImportScaleTracks = from->ImportScaleTracks; - to->EnableRootMotion = from->EnableRootMotion; - to->RootNodeName = MUtils::ToString(from->RootNodeName); - to->GenerateLODs = from->GenerateLODs; - to->BaseLOD = from->BaseLOD; - to->LODCount = from->LODCount; - to->TriangleReduction = from->TriangleReduction; - to->ImportMaterials = from->ImportMaterials; - to->ImportTextures = from->ImportTextures; - to->RestoreMaterialsOnReimport = from->RestoreMaterialsOnReimport; - to->GenerateSDF = from->GenerateSDF; - to->SDFResolution = from->SDFResolution; - to->SplitObjects = from->SplitObjects; - to->ObjectIndex = from->ObjectIndex; - } -}; - struct InternalAudioOptions { AudioFormat Format; @@ -322,31 +87,6 @@ struct InternalAudioOptions #pragma warning( pop ) #endif -namespace CustomEditorsUtilInternal -{ - MonoReflectionType* GetCustomEditor(MonoReflectionType* targetType) - { - return CustomEditorsUtil::GetCustomEditor(targetType); - } -} - -namespace LayersAndTagsSettingsInternal -{ - MonoArray* GetCurrentLayers() - { - return MUtils::ToArray(Span(Level::Layers, Math::Max(1, Level::GetNonEmptyLayerNamesCount()))); - } -} - -namespace GameSettingsInternal1 -{ - void Apply() - { - LOG(Info, "Apply game settings"); - GameSettings::Load(); - } -} - // Pack log messages into a single scratch buffer to reduce dynamic memory allocations CriticalSection CachedLogDataLocker; Array CachedLogData; @@ -373,781 +113,720 @@ void OnLogMessage(LogType type, const StringView& msg) CachedLogData.Add((byte*)msg.Get(), msg.Length() * 2); } -class ManagedEditorInternal +DEFINE_INTERNAL_CALL(bool) EditorInternal_IsDevInstance() { -public: - static bool IsDevInstance() - { #if COMPILE_WITH_DEV_ENV - return true; + return true; #else - return false; + return false; #endif - } +} - static bool IsOfficialBuild() - { +DEFINE_INTERNAL_CALL(bool) EditorInternal_IsOfficialBuild() +{ #if OFFICIAL_BUILD + return true; +#else + return false; +#endif +} + +DEFINE_INTERNAL_CALL(bool) EditorInternal_IsPlayMode() +{ + return Editor::IsPlayMode; +} + +DEFINE_INTERNAL_CALL(int32) EditorInternal_ReadOutputLogs(MArray** outMessages, MArray** outLogTypes, MArray** outLogTimes, int outArraySize) +{ + ScopeLock lock(CachedLogDataLocker); + if (CachedLogData.IsEmpty() || CachedLogData.Get() == nullptr) + return 0; + + int32 count = 0; + const int32 maxCount = outArraySize; + + byte* ptr = CachedLogData.Get(); + byte* end = ptr + CachedLogData.Count(); + byte* outLogTypesPtr = MCore::Array::GetAddress(*outLogTypes); + int64* outLogTimesPtr = MCore::Array::GetAddress(*outLogTimes); + while (count < maxCount && ptr != end) + { + auto type = (byte)*(int32*)ptr; + ptr += 4; + + auto time = *(int64*)ptr; + ptr += 8; + + auto length = *(int32*)ptr; + ptr += 4; + + auto msg = (Char*)ptr; + ptr += length * 2; + + auto msgObj = MUtils::ToString(StringView(msg, length)); + + MCore::GC::WriteArrayRef(*outMessages, (MObject*)msgObj, count); + outLogTypesPtr[count] = type; + outLogTimesPtr[count] = time; + + count++; + } + + const int32 dataLeft = (int32)(end - ptr); + Platform::MemoryCopy(CachedLogData.Get(), ptr, dataLeft); + CachedLogData.Resize(dataLeft); + + return count; +} + +DEFINE_INTERNAL_CALL(void) EditorInternal_SetPlayMode(bool value) +{ + Editor::IsPlayMode = value; +} + +DEFINE_INTERNAL_CALL(MString*) EditorInternal_GetProjectPath() +{ + return MUtils::ToString(Editor::Project->ProjectPath); +} + +DEFINE_INTERNAL_CALL(void) EditorInternal_CloseSplashScreen() +{ + Editor::CloseSplashScreen(); +} + +DEFINE_INTERNAL_CALL(bool) EditorInternal_CloneAssetFile(MString* dstPathObj, MString* srcPathObj, Guid* dstId) +{ + // Get normalized paths + String dstPath, srcPath; + MUtils::ToString(dstPathObj, dstPath); + MUtils::ToString(srcPathObj, srcPath); + FileSystem::NormalizePath(dstPath); + FileSystem::NormalizePath(srcPath); + + // Call util function + return Content::CloneAssetFile(dstPath, srcPath, *dstId); +} + +enum class NewAssetType +{ + Material = 0, + MaterialInstance = 1, + CollisionData = 2, + AnimationGraph = 3, + SkeletonMask = 4, + ParticleEmitter = 5, + ParticleSystem = 6, + SceneAnimation = 7, + MaterialFunction = 8, + ParticleEmitterFunction = 9, + AnimationGraphFunction = 10, + Animation = 11, +}; + +DEFINE_INTERNAL_CALL(bool) EditorInternal_CreateAsset(NewAssetType type, MString* outputPathObj) +{ + String tag; + switch (type) + { + case NewAssetType::Material: + tag = AssetsImportingManager::CreateMaterialTag; + break; + case NewAssetType::MaterialInstance: + tag = AssetsImportingManager::CreateMaterialInstanceTag; + break; + case NewAssetType::CollisionData: + tag = AssetsImportingManager::CreateCollisionDataTag; + break; + case NewAssetType::AnimationGraph: + tag = AssetsImportingManager::CreateAnimationGraphTag; + break; + case NewAssetType::SkeletonMask: + tag = AssetsImportingManager::CreateSkeletonMaskTag; + break; + case NewAssetType::ParticleEmitter: + tag = AssetsImportingManager::CreateParticleEmitterTag; + break; + case NewAssetType::ParticleSystem: + tag = AssetsImportingManager::CreateParticleSystemTag; + break; + case NewAssetType::SceneAnimation: + tag = AssetsImportingManager::CreateSceneAnimationTag; + break; + case NewAssetType::MaterialFunction: + tag = AssetsImportingManager::CreateMaterialFunctionTag; + break; + case NewAssetType::ParticleEmitterFunction: + tag = AssetsImportingManager::CreateParticleEmitterFunctionTag; + break; + case NewAssetType::AnimationGraphFunction: + tag = AssetsImportingManager::CreateAnimationGraphFunctionTag; + break; + case NewAssetType::Animation: + tag = AssetsImportingManager::CreateAnimationTag; + break; + default: return true; -#else - return false; -#endif } - static bool IsPlayMode() - { - return Editor::IsPlayMode; - } + String outputPath; + MUtils::ToString(outputPathObj, outputPath); + FileSystem::NormalizePath(outputPath); - static int32 ReadOutputLogs(MonoArray* outMessages, MonoArray* outLogTypes, MonoArray* outLogTimes) - { - ScopeLock lock(CachedLogDataLocker); + return AssetsImportingManager::Create(tag, outputPath); +} - if (CachedLogData.IsEmpty() || CachedLogData.Get() == nullptr) - return 0; +DEFINE_INTERNAL_CALL(bool) EditorInternal_CreateVisualScript(MString* outputPathObj, MString* baseTypenameObj) +{ + String outputPath; + MUtils::ToString(outputPathObj, outputPath); + FileSystem::NormalizePath(outputPath); + String baseTypename; + MUtils::ToString(baseTypenameObj, baseTypename); + return AssetsImportingManager::Create(AssetsImportingManager::CreateVisualScriptTag, outputPath, &baseTypename); +} - int32 count = 0; - const int32 maxCount = (int32)mono_array_length(outMessages); +DEFINE_INTERNAL_CALL(MString*) EditorInternal_CanImport(MString* extensionObj) +{ + String extension; + MUtils::ToString(extensionObj, extension); + if (extension.Length() > 0 && extension[0] == '.') + extension.Remove(0, 1); + const AssetImporter* importer = AssetsImportingManager::GetImporter(extension); + return importer ? MUtils::ToString(importer->ResultExtension) : nullptr; +} - byte* ptr = CachedLogData.Get(); - byte* end = ptr + CachedLogData.Count(); - while (count < maxCount && ptr != end) - { - auto type = (byte)*(int32*)ptr; - ptr += 4; +DEFINE_INTERNAL_CALL(bool) EditorInternal_ImportAudio(MString* inputPathObj, MString* outputPathObj, InternalAudioOptions* optionsObj) +{ + ImportAudio::Options options; + InternalAudioOptions::Convert(optionsObj, &options); + String inputPath, outputPath; + MUtils::ToString(inputPathObj, inputPath); + MUtils::ToString(outputPathObj, outputPath); + return ManagedEditor::Import(inputPath, outputPath, &options); +} - auto time = *(int64*)ptr; - ptr += 8; +DEFINE_INTERNAL_CALL(void) EditorInternal_GetAudioClipMetadata(AudioClip* clip, int32* originalSize, int32* importedSize) +{ + INTERNAL_CALL_CHECK(clip); + *originalSize = clip->AudioHeader.OriginalSize; + *importedSize = clip->AudioHeader.ImportedSize; +} - auto length = *(int32*)ptr; - ptr += 4; +DEFINE_INTERNAL_CALL(bool) EditorInternal_SaveJsonAsset(MString* outputPathObj, MString* dataObj, MString* dataTypeNameObj) +{ + String outputPath; + MUtils::ToString(outputPathObj, outputPath); + FileSystem::NormalizePath(outputPath); - auto msg = (Char*)ptr; - ptr += length * 2; + const StringView dataObjChars = MCore::String::GetChars(dataObj); + const StringAsANSI<> data(dataObjChars.Get(), dataObjChars.Length()); + const StringAnsiView dataAnsi(data.Get(), data.Length()); + + const StringView dataTypeNameObjChars = MCore::String::GetChars(dataTypeNameObj); + const StringAsANSI<> dataTypeName(dataTypeNameObjChars.Get(), dataTypeNameObjChars.Length()); + const StringAnsiView dataTypeNameAnsi(dataTypeName.Get(), dataTypeName.Length()); - auto msgObj = MUtils::ToString(StringView(msg, length)); + return CreateJson::Create(outputPath, dataAnsi, dataTypeNameAnsi); +} - mono_array_setref(outMessages, count, msgObj); - mono_array_set(outLogTypes, byte, count, type); - mono_array_set(outLogTimes, int64, count, time); - - count++; - } - - const int32 dataLeft = (int32)(end - ptr); - Platform::MemoryCopy(CachedLogData.Get(), ptr, dataLeft); - CachedLogData.Resize(dataLeft); - - return count; - } - - static void SetPlayMode(bool value) - { - Editor::IsPlayMode = value; - } - - static MonoString* GetProjectPath() - { - return MUtils::ToString(Editor::Project->ProjectPath); - } - - static void CloseSplashScreen() - { - Editor::CloseSplashScreen(); - } - - static bool CloneAssetFile(MonoString* dstPathObj, MonoString* srcPathObj, Guid* dstId) - { - // Get normalized paths - String dstPath, srcPath; - MUtils::ToString(dstPathObj, dstPath); - MUtils::ToString(srcPathObj, srcPath); - FileSystem::NormalizePath(dstPath); - FileSystem::NormalizePath(srcPath); - - // Call util function - return Content::CloneAssetFile(dstPath, srcPath, *dstId); - } - - enum class NewAssetType - { - Material = 0, - MaterialInstance = 1, - CollisionData = 2, - AnimationGraph = 3, - SkeletonMask = 4, - ParticleEmitter = 5, - ParticleSystem = 6, - SceneAnimation = 7, - MaterialFunction = 8, - ParticleEmitterFunction = 9, - AnimationGraphFunction = 10, - Animation = 11, - }; - - static bool CreateAsset(NewAssetType type, MonoString* outputPathObj) - { - String tag; - switch (type) - { - case NewAssetType::Material: - tag = AssetsImportingManager::CreateMaterialTag; - break; - case NewAssetType::MaterialInstance: - tag = AssetsImportingManager::CreateMaterialInstanceTag; - break; - case NewAssetType::CollisionData: - tag = AssetsImportingManager::CreateCollisionDataTag; - break; - case NewAssetType::AnimationGraph: - tag = AssetsImportingManager::CreateAnimationGraphTag; - break; - case NewAssetType::SkeletonMask: - tag = AssetsImportingManager::CreateSkeletonMaskTag; - break; - case NewAssetType::ParticleEmitter: - tag = AssetsImportingManager::CreateParticleEmitterTag; - break; - case NewAssetType::ParticleSystem: - tag = AssetsImportingManager::CreateParticleSystemTag; - break; - case NewAssetType::SceneAnimation: - tag = AssetsImportingManager::CreateSceneAnimationTag; - break; - case NewAssetType::MaterialFunction: - tag = AssetsImportingManager::CreateMaterialFunctionTag; - break; - case NewAssetType::ParticleEmitterFunction: - tag = AssetsImportingManager::CreateParticleEmitterFunctionTag; - break; - case NewAssetType::AnimationGraphFunction: - tag = AssetsImportingManager::CreateAnimationGraphFunctionTag; - break; - case NewAssetType::Animation: - tag = AssetsImportingManager::CreateAnimationTag; - break; - default: - return true; - } - - String outputPath; - MUtils::ToString(outputPathObj, outputPath); - FileSystem::NormalizePath(outputPath); - - return AssetsImportingManager::Create(tag, outputPath); - } - - static bool CreateVisualScript(MonoString* outputPathObj, MonoString* baseTypenameObj) - { - String outputPath; - MUtils::ToString(outputPathObj, outputPath); - FileSystem::NormalizePath(outputPath); - String baseTypename; - MUtils::ToString(baseTypenameObj, baseTypename); - return AssetsImportingManager::Create(AssetsImportingManager::CreateVisualScriptTag, outputPath, &baseTypename); - } - - static MonoString* CanImport(MonoString* extensionObj) - { - String extension; - MUtils::ToString(extensionObj, extension); - if (extension.Length() > 0 && extension[0] == '.') - extension.Remove(0, 1); - const AssetImporter* importer = AssetsImportingManager::GetImporter(extension); - return importer ? MUtils::ToString(importer->ResultExtension) : nullptr; - } - - static bool Import(MonoString* inputPathObj, MonoString* outputPathObj, void* arg) - { - String inputPath, outputPath; - MUtils::ToString(inputPathObj, inputPath); - MUtils::ToString(outputPathObj, outputPath); - FileSystem::NormalizePath(inputPath); - FileSystem::NormalizePath(outputPath); - - return AssetsImportingManager::Import(inputPath, outputPath, arg); - } - - static bool ImportTexture(MonoString* inputPathObj, MonoString* outputPathObj, InternalTextureOptions* optionsObj) - { - ImportTexture::Options options; - InternalTextureOptions::Convert(optionsObj, &options); - - return Import(inputPathObj, outputPathObj, &options); - } - - static bool ImportModel(MonoString* inputPathObj, MonoString* outputPathObj, InternalModelOptions* optionsObj) - { - ImportModelFile::Options options; - InternalModelOptions::Convert(optionsObj, &options); - - return Import(inputPathObj, outputPathObj, &options); - } - - static bool ImportAudio(MonoString* inputPathObj, MonoString* outputPathObj, InternalAudioOptions* optionsObj) - { - ImportAudio::Options options; - InternalAudioOptions::Convert(optionsObj, &options); - - return Import(inputPathObj, outputPathObj, &options); - } - - static void GetAudioClipMetadata(AudioClip* clip, int32* originalSize, int32* importedSize) - { - INTERNAL_CALL_CHECK(clip); - *originalSize = clip->AudioHeader.OriginalSize; - *importedSize = clip->AudioHeader.ImportedSize; - } - - static bool SaveJsonAsset(MonoString* outputPathObj, MonoString* dataObj, MonoString* dataTypeNameObj) - { - String outputPath; - MUtils::ToString(outputPathObj, outputPath); - FileSystem::NormalizePath(outputPath); - - const auto dataObjPtr = mono_string_to_utf8(dataObj); - StringAnsiView data(dataObjPtr); - - const auto dataTypeNameObjPtr = mono_string_to_utf8(dataTypeNameObj); - StringAnsiView dataTypeName(dataTypeNameObjPtr); - - const bool result = CreateJson::Create(outputPath, data, dataTypeName); - - mono_free(dataObjPtr); - mono_free(dataTypeNameObjPtr); - - return result; - } - - static bool GetTextureImportOptions(MonoString* pathObj, InternalTextureOptions* result) - { - String path; - MUtils::ToString(pathObj, path); - FileSystem::NormalizePath(path); - - ImportTexture::Options options; - if (ImportTexture::TryGetImportOptions(path, options)) - { - // Convert into managed storage - InternalTextureOptions::Convert(&options, result); - - return true; - } - - return false; - } - - static void GetModelImportOptions(MonoString* pathObj, InternalModelOptions* result) - { - // Initialize defaults - ImportModelFile::Options options; - if (const auto* graphicsSettings = GraphicsSettings::Get()) - { - options.GenerateSDF = graphicsSettings->GenerateSDFOnModelImport; - } - - // Get options from model - String path; - MUtils::ToString(pathObj, path); - FileSystem::NormalizePath(path); - ImportModelFile::TryGetImportOptions(path, options); - - // Convert into managed storage - InternalModelOptions::Convert(&options, result); - } - - static bool GetAudioImportOptions(MonoString* pathObj, InternalAudioOptions* result) - { - String path; - MUtils::ToString(pathObj, path); - FileSystem::NormalizePath(path); - - ImportAudio::Options options; - if (ImportAudio::TryGetImportOptions(path, options)) - { - // Convert into managed storage - InternalAudioOptions::Convert(&options, result); - - return true; - } - - return false; - } - - static bool CanExport(MonoString* pathObj) - { +DEFINE_INTERNAL_CALL(bool) EditorInternal_CanExport(MString* pathObj) +{ #if COMPILE_WITH_ASSETS_EXPORTER - String path; - MUtils::ToString(pathObj, path); - FileSystem::NormalizePath(path); + String path; + MUtils::ToString(pathObj, path); + FileSystem::NormalizePath(path); - return AssetsExportingManager::CanExport(path); + return AssetsExportingManager::CanExport(path); #else - return false; + return false; #endif - } +} - static bool Export(MonoString* inputPathObj, MonoString* outputFolderObj) - { +DEFINE_INTERNAL_CALL(bool) EditorInternal_Export(MString* inputPathObj, MString* outputFolderObj) +{ #if COMPILE_WITH_ASSETS_EXPORTER - String inputPath; - MUtils::ToString(inputPathObj, inputPath); - FileSystem::NormalizePath(inputPath); + String inputPath; + MUtils::ToString(inputPathObj, inputPath); + FileSystem::NormalizePath(inputPath); - String outputFolder; - MUtils::ToString(outputFolderObj, outputFolder); - FileSystem::NormalizePath(outputFolder); + String outputFolder; + MUtils::ToString(outputFolderObj, outputFolder); + FileSystem::NormalizePath(outputFolder); - return AssetsExportingManager::Export(inputPath, outputFolder); + return AssetsExportingManager::Export(inputPath, outputFolder); #else - return false; + return false; #endif - } +} - static void CopyCache(Guid* dstId, Guid* srcId) - { - ShaderCacheManager::CopyCache(*dstId, *srcId); - } +DEFINE_INTERNAL_CALL(void) EditorInternal_CopyCache(Guid* dstId, Guid* srcId) +{ + ShaderCacheManager::CopyCache(*dstId, *srcId); +} - static void BakeLightmaps(bool cancel) - { - auto builder = ShadowsOfMordor::Builder::Instance(); - if (cancel) - builder->CancelBuild(); - else - builder->Build(); - } +DEFINE_INTERNAL_CALL(void) EditorInternal_BakeLightmaps(bool cancel) +{ + auto builder = ShadowsOfMordor::Builder::Instance(); + if (cancel) + builder->CancelBuild(); + else + builder->Build(); +} - static MonoString* GetShaderAssetSourceCode(BinaryAsset* obj) - { - INTERNAL_CALL_CHECK_RETURN(obj, nullptr); - if (obj->WaitForLoaded()) - DebugLog::ThrowNullReference(); +DEFINE_INTERNAL_CALL(MString*) EditorInternal_GetShaderAssetSourceCode(BinaryAsset* obj) +{ + INTERNAL_CALL_CHECK_RETURN(obj, nullptr); + if (obj->WaitForLoaded()) + DebugLog::ThrowNullReference(); - auto lock = obj->Storage->Lock(); + auto lock = obj->Storage->Lock(); - if (obj->LoadChunk(SHADER_FILE_CHUNK_SOURCE)) - return nullptr; + if (obj->LoadChunk(SHADER_FILE_CHUNK_SOURCE)) + return nullptr; - BytesContainer data; - obj->GetChunkData(SHADER_FILE_CHUNK_SOURCE, data); + BytesContainer data; + obj->GetChunkData(SHADER_FILE_CHUNK_SOURCE, data); - Encryption::DecryptBytes((byte*)data.Get(), data.Length()); + Encryption::DecryptBytes((byte*)data.Get(), data.Length()); - const StringAnsiView srcData((const char*)data.Get(), data.Length()); - const String source(srcData); - const auto str = MUtils::ToString(source); + const StringAnsiView srcData((const char*)data.Get(), data.Length()); + const String source(srcData); + const auto str = MUtils::ToString(source); - Encryption::EncryptBytes((byte*)data.Get(), data.Length()); + Encryption::EncryptBytes((byte*)data.Get(), data.Length()); - return str; - } + return str; +} - static bool CookMeshCollision(MonoString* pathObj, CollisionDataType type, ModelBase* modelObj, int32 modelLodIndex, uint32 materialSlotsMask, ConvexMeshGenerationFlags convexFlags, int32 convexVertexLimit) - { +DEFINE_INTERNAL_CALL(bool) EditorInternal_CookMeshCollision(MString* pathObj, CollisionDataType type, ModelBase* modelObj, int32 modelLodIndex, uint32 materialSlotsMask, ConvexMeshGenerationFlags convexFlags, int32 convexVertexLimit) +{ #if COMPILE_WITH_PHYSICS_COOKING - CollisionCooking::Argument arg; - String path; - MUtils::ToString(pathObj, path); - FileSystem::NormalizePath(path); - arg.Type = type; - arg.Model = modelObj; - arg.ModelLodIndex = modelLodIndex; - arg.MaterialSlotsMask = materialSlotsMask; - arg.ConvexFlags = convexFlags; - arg.ConvexVertexLimit = convexVertexLimit; - return CreateCollisionData::CookMeshCollision(path, arg); + CollisionCooking::Argument arg; + String path; + MUtils::ToString(pathObj, path); + FileSystem::NormalizePath(path); + arg.Type = type; + arg.Model = modelObj; + arg.ModelLodIndex = modelLodIndex; + arg.MaterialSlotsMask = materialSlotsMask; + arg.ConvexFlags = convexFlags; + arg.ConvexVertexLimit = convexVertexLimit; + return CreateCollisionData::CookMeshCollision(path, arg); #else - LOG(Warning, "Collision cooking is disabled."); - return true; + LOG(Warning, "Collision cooking is disabled."); + return true; #endif - } +} - static void GetCollisionWires(CollisionData* collisionData, MonoArray** triangles, MonoArray** indices) +DEFINE_INTERNAL_CALL(void) EditorInternal_GetCollisionWires(CollisionData* collisionData, MArray** triangles, MArray** indices, int* trianglesCount, int* indicesCount) +{ + if (!collisionData || collisionData->WaitForLoaded() || collisionData->GetOptions().Type == CollisionDataType::None) + return; + + const auto& debugLines = collisionData->GetDebugLines(); + + const int32 linesCount = debugLines.Count() / 2; + MCore::GC::WriteRef(triangles, (MObject*)MCore::Array::New(Float3::TypeInitializer.GetClass(), debugLines.Count())); + MCore::GC::WriteRef(indices, (MObject*)MCore::Array::New( MCore::TypeCache::Int32, linesCount * 3)); + + // Use one triangle per debug line + Platform::MemoryCopy(MCore::Array::GetAddress(*triangles), debugLines.Get(), debugLines.Count() * sizeof(Float3)); + int32 iI = 0; + int32* indicesPtr = MCore::Array::GetAddress(*indices); + for (int32 i = 0; i < debugLines.Count(); i += 2) { - if (!collisionData || collisionData->WaitForLoaded() || collisionData->GetOptions().Type == CollisionDataType::None) - return; - - const auto& debugLines = collisionData->GetDebugLines(); - - const int32 linesCount = debugLines.Count() / 2; - mono_gc_wbarrier_generic_store(triangles, (MonoObject*)mono_array_new(mono_domain_get(), Float3::TypeInitializer.GetMonoClass(), debugLines.Count())); - mono_gc_wbarrier_generic_store(indices, (MonoObject*)mono_array_new(mono_domain_get(), mono_get_int32_class(), linesCount * 3)); - - // Use one triangle per debug line - for (int32 i = 0; i < debugLines.Count(); i++) - { - mono_array_set(*triangles, Float3, i, debugLines[i]); - } - int32 iI = 0; - for (int32 i = 0; i < debugLines.Count(); i += 2) - { - mono_array_set(*indices, int32, iI++, i); - mono_array_set(*indices, int32, iI++, i + 1); - mono_array_set(*indices, int32, iI++, i); - } + indicesPtr[iI++] = i; + indicesPtr[iI++] = i + 1; + indicesPtr[iI++] = i; } + *trianglesCount = debugLines.Count(); + *indicesCount = linesCount * 3; +} - static void GetEditorBoxWithChildren(Actor* obj, BoundingBox* result) - { - INTERNAL_CALL_CHECK(obj); - *result = obj->GetEditorBoxChildren(); - } +DEFINE_INTERNAL_CALL(void) EditorInternal_GetEditorBoxWithChildren(Actor* obj, BoundingBox* result) +{ + INTERNAL_CALL_CHECK(obj); + *result = obj->GetEditorBoxChildren(); +} - static void SetOptions(ManagedEditor::InternalOptions* options) - { - ManagedEditor::ManagedEditorOptions = *options; +DEFINE_INTERNAL_CALL(void) EditorInternal_SetOptions(ManagedEditor::InternalOptions* options) +{ + ManagedEditor::ManagedEditorOptions = *options; - // Apply options - AssetsImportingManager::UseImportPathRelative = ManagedEditor::ManagedEditorOptions.UseAssetImportPathRelative != 0; - } + // Apply options + AssetsImportingManager::UseImportPathRelative = ManagedEditor::ManagedEditorOptions.UseAssetImportPathRelative != 0; +} - static void DrawNavMesh() - { - Navigation::DrawNavMesh(); - } +DEFINE_INTERNAL_CALL(void) EditorInternal_DrawNavMesh() +{ + Navigation::DrawNavMesh(); +} - static bool GetIsEveryAssemblyLoaded() - { - return Scripting::IsEveryAssemblyLoaded(); - } +DEFINE_INTERNAL_CALL(bool) EditorInternal_GetIsEveryAssemblyLoaded() +{ + return Scripting::IsEveryAssemblyLoaded(); +} - static int32 GetLastProjectOpenedEngineBuild() - { - return Editor::LastProjectOpenedEngineBuild; - } +DEFINE_INTERNAL_CALL(int32) EditorInternal_GetLastProjectOpenedEngineBuild() +{ + return Editor::LastProjectOpenedEngineBuild; +} - static bool GetIsCSGActive() - { +DEFINE_INTERNAL_CALL(bool) EditorInternal_GetIsCSGActive() +{ #if COMPILE_WITH_CSG_BUILDER - return CSG::Builder::IsActive(); + return CSG::Builder::IsActive(); #else - return false; + return false; #endif - } +} - static void RunVisualScriptBreakpointLoopTick(float deltaTime) +DEFINE_INTERNAL_CALL(void) EditorInternal_RunVisualScriptBreakpointLoopTick(float deltaTime) +{ + // Update + Platform::Tick(); + Engine::HasFocus = (Engine::MainWindow && Engine::MainWindow->IsFocused()) || Platform::GetHasFocus(); + if (Engine::HasFocus) { - // Update - Platform::Tick(); - Engine::HasFocus = (Engine::MainWindow && Engine::MainWindow->IsFocused()) || Platform::GetHasFocus(); - if (Engine::HasFocus) + InputDevice::EventQueue inputEvents; + if (Input::Mouse) { - InputDevice::EventQueue inputEvents; - if (Input::Mouse) + if (Input::Mouse->Update(inputEvents)) { - if (Input::Mouse->Update(inputEvents)) - { - Input::Mouse->DeleteObject(); - Input::Mouse = nullptr; - } + Input::Mouse->DeleteObject(); + Input::Mouse = nullptr; } - if (Input::Keyboard) + } + if (Input::Keyboard) + { + if (Input::Keyboard->Update(inputEvents)) { - if (Input::Keyboard->Update(inputEvents)) - { - Input::Keyboard->DeleteObject(); - Input::Keyboard = nullptr; - } + Input::Keyboard->DeleteObject(); + Input::Keyboard = nullptr; } - WindowsManager::WindowsLocker.Lock(); - Window* defaultWindow = nullptr; - for (auto window : WindowsManager::Windows) - { - if (window->IsFocused() && window->GetSettings().AllowInput) - { - defaultWindow = window; - break; - } - } - for (const auto& e : inputEvents) - { - auto window = e.Target ? e.Target : defaultWindow; - if (!window) - continue; - switch (e.Type) - { - // Keyboard events - case InputDevice::EventType::Char: - window->OnCharInput(e.CharData.Char); - break; - case InputDevice::EventType::KeyDown: - window->OnKeyDown(e.KeyData.Key); - break; - case InputDevice::EventType::KeyUp: - window->OnKeyUp(e.KeyData.Key); - break; - // Mouse events - case InputDevice::EventType::MouseDown: - window->OnMouseDown(window->ScreenToClient(e.MouseData.Position), e.MouseData.Button); - break; - case InputDevice::EventType::MouseUp: - window->OnMouseUp(window->ScreenToClient(e.MouseData.Position), e.MouseData.Button); - break; - case InputDevice::EventType::MouseDoubleClick: - window->OnMouseDoubleClick(window->ScreenToClient(e.MouseData.Position), e.MouseData.Button); - break; - case InputDevice::EventType::MouseWheel: - window->OnMouseWheel(window->ScreenToClient(e.MouseWheelData.Position), e.MouseWheelData.WheelDelta); - break; - case InputDevice::EventType::MouseMove: - window->OnMouseMove(window->ScreenToClient(e.MouseData.Position)); - break; - case InputDevice::EventType::MouseLeave: - window->OnMouseLeave(); - break; - } - } - WindowsManager::WindowsLocker.Unlock(); } WindowsManager::WindowsLocker.Lock(); - for (auto& win : WindowsManager::Windows) + Window* defaultWindow = nullptr; + for (auto window : WindowsManager::Windows) { - if (win->IsVisible()) - win->OnUpdate(deltaTime); + if (window->IsFocused() && window->GetSettings().AllowInput) + { + defaultWindow = window; + break; + } + } + for (const auto& e : inputEvents) + { + auto window = e.Target ? e.Target : defaultWindow; + if (!window) + continue; + switch (e.Type) + { + // Keyboard events + case InputDevice::EventType::Char: + window->OnCharInput(e.CharData.Char); + break; + case InputDevice::EventType::KeyDown: + window->OnKeyDown(e.KeyData.Key); + break; + case InputDevice::EventType::KeyUp: + window->OnKeyUp(e.KeyData.Key); + break; + // Mouse events + case InputDevice::EventType::MouseDown: + window->OnMouseDown(window->ScreenToClient(e.MouseData.Position), e.MouseData.Button); + break; + case InputDevice::EventType::MouseUp: + window->OnMouseUp(window->ScreenToClient(e.MouseData.Position), e.MouseData.Button); + break; + case InputDevice::EventType::MouseDoubleClick: + window->OnMouseDoubleClick(window->ScreenToClient(e.MouseData.Position), e.MouseData.Button); + break; + case InputDevice::EventType::MouseWheel: + window->OnMouseWheel(window->ScreenToClient(e.MouseWheelData.Position), e.MouseWheelData.WheelDelta); + break; + case InputDevice::EventType::MouseMove: + window->OnMouseMove(window->ScreenToClient(e.MouseData.Position)); + break; + case InputDevice::EventType::MouseLeave: + window->OnMouseLeave(); + break; + } } WindowsManager::WindowsLocker.Unlock(); - - // Draw - Engine::OnDraw(); } - - struct VisualScriptLocalManaged + WindowsManager::WindowsLocker.Lock(); + for (auto& win : WindowsManager::Windows) { - MonoString* Value; - MonoString* ValueTypeName; - uint32 NodeId; - int32 BoxId; - }; - - static MonoArray* GetVisualScriptLocals() - { - MonoArray* result = nullptr; - const auto stack = VisualScripting::GetThreadStackTop(); - if (stack && stack->Scope) - { - const int32 count = stack->Scope->Parameters.Length() + stack->Scope->ReturnedValues.Count(); - const auto mclass = ((NativeBinaryModule*)GetBinaryModuleFlaxEngine())->Assembly->GetClass("FlaxEditor.Editor+VisualScriptLocal"); - ASSERT(mclass); - result = mono_array_new(mono_domain_get(), mclass->GetNative(), count); - VisualScriptLocalManaged local; - local.NodeId = MAX_uint32; - if (stack->Scope->Parameters.Length() != 0) - { - auto s = stack; - while (s->PreviousFrame && s->PreviousFrame->Scope == stack->Scope) - s = s->PreviousFrame; - if (s) - local.NodeId = s->Node->ID; - } - for (int32 i = 0; i < stack->Scope->Parameters.Length(); i++) - { - auto& v = stack->Scope->Parameters[i]; - local.BoxId = i + 1; - local.Value = MUtils::ToString(v.ToString()); - local.ValueTypeName = MUtils::ToString(v.Type.GetTypeName()); - mono_array_set(result, VisualScriptLocalManaged, i, local); - } - for (int32 i = 0; i < stack->Scope->ReturnedValues.Count(); i++) - { - auto& v = stack->Scope->ReturnedValues[i]; - local.NodeId = v.NodeId; - local.BoxId = v.BoxId; - local.Value = MUtils::ToString(v.Value.ToString()); - local.ValueTypeName = MUtils::ToString(v.Value.Type.GetTypeName()); - mono_array_set(result, VisualScriptLocalManaged, stack->Scope->Parameters.Length() + i, local); - } - } - return result; + if (win->IsVisible()) + win->OnUpdate(deltaTime); } + WindowsManager::WindowsLocker.Unlock(); - struct VisualScriptStackFrameManaged - { - MonoObject* Script; - uint32 NodeId; - int32 BoxId; - }; + // Draw + Engine::OnDraw(); +} - static MonoArray* GetVisualScriptStackFrames() - { - MonoArray* result = nullptr; - const auto stack = VisualScripting::GetThreadStackTop(); - if (stack) - { - int32 count = 0; - auto s = stack; - while (s) - { - s = s->PreviousFrame; - count++; - } - const auto mclass = ((NativeBinaryModule*)GetBinaryModuleFlaxEngine())->Assembly->GetClass("FlaxEditor.Editor+VisualScriptStackFrame"); - ASSERT(mclass); - result = mono_array_new(mono_domain_get(), mclass->GetNative(), count); - s = stack; - count = 0; - while (s) - { - VisualScriptStackFrameManaged frame; - frame.Script = s->Script->GetOrCreateManagedInstance(); - frame.NodeId = s->Node->ID; - frame.BoxId = s->Box ? s->Box->ID : MAX_uint32; - mono_array_set(result, VisualScriptStackFrameManaged, count, frame); - s = s->PreviousFrame; - count++; - } - } - return result; - } +struct VisualScriptLocalManaged +{ + MString* Value; + MString* ValueTypeName; + uint32 NodeId; + int32 BoxId; +}; - static VisualScriptStackFrameManaged GetVisualScriptPreviousScopeFrame() +DEFINE_INTERNAL_CALL(MArray*) EditorInternal_GetVisualScriptLocals(int* localsCount) +{ + MArray* result = nullptr; + *localsCount = 0; + const auto stack = VisualScripting::GetThreadStackTop(); + if (stack && stack->Scope) { - VisualScriptStackFrameManaged frame; - Platform::MemoryClear(&frame, sizeof(frame)); - const auto stack = VisualScripting::GetThreadStackTop(); - if (stack) + const int32 count = stack->Scope->Parameters.Length() + stack->Scope->ReturnedValues.Count(); + const MClass* mclass = ((NativeBinaryModule*)GetBinaryModuleFlaxEngine())->Assembly->GetClass("FlaxEditor.Editor+VisualScriptLocal"); + ASSERT(mclass); + result = MCore::Array::New( mclass, count); + VisualScriptLocalManaged local; + local.NodeId = MAX_uint32; + if (stack->Scope->Parameters.Length() != 0) { auto s = stack; while (s->PreviousFrame && s->PreviousFrame->Scope == stack->Scope) s = s->PreviousFrame; - if (s && s->PreviousFrame) - { - s = s->PreviousFrame; - frame.Script = s->Script->GetOrCreateManagedInstance(); - frame.NodeId = s->Node->ID; - frame.BoxId = s->Box ? s->Box->ID : MAX_uint32; - } + if (s) + local.NodeId = s->Node->ID; } - return frame; + VisualScriptLocalManaged* resultPtr = MCore::Array::GetAddress(result); + for (int32 i = 0; i < stack->Scope->Parameters.Length(); i++) + { + auto& v = stack->Scope->Parameters[i]; + local.BoxId = i + 1; + local.Value = MUtils::ToString(v.ToString()); + local.ValueTypeName = MUtils::ToString(v.Type.GetTypeName()); + resultPtr[i] = local; + } + for (int32 i = 0; i < stack->Scope->ReturnedValues.Count(); i++) + { + auto& v = stack->Scope->ReturnedValues[i]; + local.NodeId = v.NodeId; + local.BoxId = v.BoxId; + local.Value = MUtils::ToString(v.Value.ToString()); + local.ValueTypeName = MUtils::ToString(v.Value.Type.GetTypeName()); + resultPtr[stack->Scope->Parameters.Length() + i] = local; + } + *localsCount = count; + } + return result; +} + +struct VisualScriptStackFrameManaged +{ + MObject* Script; + uint32 NodeId; + int32 BoxId; +}; + +DEFINE_INTERNAL_CALL(MArray*) EditorInternal_GetVisualScriptStackFrames(int* stackFramesCount) +{ + MArray* result = nullptr; + *stackFramesCount = 0; + const auto stack = VisualScripting::GetThreadStackTop(); + if (stack) + { + int32 count = 0; + auto s = stack; + while (s) + { + s = s->PreviousFrame; + count++; + } + const MClass* mclass = ((NativeBinaryModule*)GetBinaryModuleFlaxEngine())->Assembly->GetClass("FlaxEditor.Editor+VisualScriptStackFrame"); + ASSERT(mclass); + result = MCore::Array::New( mclass, count); + VisualScriptStackFrameManaged* resultPtr = MCore::Array::GetAddress(result); + s = stack; + count = 0; + while (s) + { + VisualScriptStackFrameManaged frame; + frame.Script = s->Script->GetOrCreateManagedInstance(); + frame.NodeId = s->Node->ID; + frame.BoxId = s->Box ? s->Box->ID : MAX_uint32; + resultPtr[count] = frame; + s = s->PreviousFrame; + count++; + } + *stackFramesCount = count; + } + return result; +} + +DEFINE_INTERNAL_CALL(VisualScriptStackFrameManaged) EditorInternal_GetVisualScriptPreviousScopeFrame() +{ + VisualScriptStackFrameManaged frame; + Platform::MemoryClear(&frame, sizeof(frame)); + const auto stack = VisualScripting::GetThreadStackTop(); + if (stack) + { + auto s = stack; + while (s->PreviousFrame && s->PreviousFrame->Scope == stack->Scope) + s = s->PreviousFrame; + if (s && s->PreviousFrame) + { + s = s->PreviousFrame; + frame.Script = s->Script->GetOrCreateManagedInstance(); + frame.NodeId = s->Node->ID; + frame.BoxId = s->Box ? s->Box->ID : MAX_uint32; + } + } + return frame; +} + +DEFINE_INTERNAL_CALL(bool) EditorInternal_EvaluateVisualScriptLocal(VisualScript* script, VisualScriptLocalManaged* local) +{ + Variant v; + if (VisualScripting::Evaluate(script, VisualScripting::GetThreadStackTop()->Instance, local->NodeId, local->BoxId, v)) + { + local->Value = MUtils::ToString(v.ToString()); + local->ValueTypeName = MUtils::ToString(v.Type.GetTypeName()); + return true; + } + return false; +} + +DEFINE_INTERNAL_CALL(void) EditorInternal_DeserializeSceneObject(SceneObject* sceneObject, MString* jsonObj) +{ + PROFILE_CPU_NAMED("DeserializeSceneObject"); + + StringAnsi json; + MUtils::ToString(jsonObj, json); + + rapidjson_flax::Document document; + { + PROFILE_CPU_NAMED("Json.Parse"); + document.Parse(json.Get(), json.Length()); + } + if (document.HasParseError()) + { + Log::JsonParseException(document.GetParseError(), document.GetErrorOffset()); + DebugLog::ThrowException("Failed to parse Json."); } - static bool EvaluateVisualScriptLocal(VisualScript* script, VisualScriptLocalManaged* local) + auto modifier = Cache::ISerializeModifier.Get(); + modifier->EngineBuild = FLAXENGINE_VERSION_BUILD; + Scripting::ObjectsLookupIdMapping.Set(&modifier.Value->IdsMapping); + { - Variant v; - if (VisualScripting::Evaluate(script, VisualScripting::GetThreadStackTop()->Instance, local->NodeId, local->BoxId, v)) - { - local->Value = MUtils::ToString(v.ToString()); - local->ValueTypeName = MUtils::ToString(v.Type.GetTypeName()); - return true; - } + PROFILE_CPU_NAMED("Deserialize"); + sceneObject->Deserialize(document, modifier.Value); + } +} + +DEFINE_INTERNAL_CALL(void) EditorInternal_LoadAsset(Guid* id) +{ + Content::LoadAsync(*id); +} + +DEFINE_INTERNAL_CALL(bool) EditorInternal_CanSetToRoot(Prefab* prefab, Actor* targetActor) +{ + // Reference: Prefab::ApplyAll(Actor* targetActor) + if (targetActor->GetPrefabID() != prefab->GetID()) return false; - } - - static void DeserializeSceneObject(SceneObject* sceneObject, MonoString* jsonObj) + if (targetActor->GetPrefabObjectID() != prefab->GetRootObjectId()) { - PROFILE_CPU_NAMED("DeserializeSceneObject"); - - StringAnsi json; - MUtils::ToString(jsonObj, json); - - rapidjson_flax::Document document; - { - PROFILE_CPU_NAMED("Json.Parse"); - document.Parse(json.Get(), json.Length()); - } - if (document.HasParseError()) - { - Log::JsonParseException(document.GetParseError(), document.GetErrorOffset()); - DebugLog::ThrowException("Failed to parse Json."); - } - - auto modifier = Cache::ISerializeModifier.Get(); - modifier->EngineBuild = FLAXENGINE_VERSION_BUILD; - Scripting::ObjectsLookupIdMapping.Set(&modifier.Value->IdsMapping); - - { - PROFILE_CPU_NAMED("Deserialize"); - sceneObject->Deserialize(document, modifier.Value); - } - } - - static void LoadAsset(Guid* id) - { - Content::LoadAsync(*id); - } - - static bool CanSetToRoot(Prefab* prefab, Actor* targetActor) - { - // Reference: Prefab::ApplyAll(Actor* targetActor) - if (targetActor->GetPrefabID() != prefab->GetID()) + const ISerializable::DeserializeStream** newRootDataPtr = prefab->ObjectsDataCache.TryGet(targetActor->GetPrefabObjectID()); + if (!newRootDataPtr || !*newRootDataPtr) return false; - if (targetActor->GetPrefabObjectID() != prefab->GetRootObjectId()) + const ISerializable::DeserializeStream& newRootData = **newRootDataPtr; + Guid prefabId, prefabObjectID; + if (JsonTools::GetGuidIfValid(prefabId, newRootData, "PrefabID") && JsonTools::GetGuidIfValid(prefabObjectID, newRootData, "PrefabObjectID")) { - const ISerializable::DeserializeStream** newRootDataPtr = prefab->ObjectsDataCache.TryGet(targetActor->GetPrefabObjectID()); - if (!newRootDataPtr || !*newRootDataPtr) + const auto nestedPrefab = Content::Load(prefabId); + if (nestedPrefab && nestedPrefab->GetRootObjectId() != prefabObjectID) return false; - const ISerializable::DeserializeStream& newRootData = **newRootDataPtr; - Guid prefabId, prefabObjectID; - if (JsonTools::GetGuidIfValid(prefabId, newRootData, "PrefabID") && JsonTools::GetGuidIfValid(prefabObjectID, newRootData, "PrefabObjectID")) - { - const auto nestedPrefab = Content::Load(prefabId); - if (nestedPrefab && nestedPrefab->GetRootObjectId() != prefabObjectID) - return false; - } } + } + return true; +} + +DEFINE_INTERNAL_CALL(float) EditorInternal_GetAnimationTime(AnimatedModel* animatedModel) +{ + return animatedModel && animatedModel->GraphInstance.State.Count() == 1 ? animatedModel->GraphInstance.State[0].Animation.TimePosition : 0.0f; +} + +DEFINE_INTERNAL_CALL(void) EditorInternal_SetAnimationTime(AnimatedModel* animatedModel, float time) +{ + if (animatedModel && animatedModel->GraphInstance.State.Count() == 1) + animatedModel->GraphInstance.State[0].Animation.TimePosition = time; +} + +DEFINE_INTERNAL_CALL(MTypeObject*) CustomEditorsUtilInternal_GetCustomEditor(MTypeObject* targetType) +{ + return CustomEditorsUtil::GetCustomEditor(targetType); +} + +DEFINE_INTERNAL_CALL(bool) AudioImportEntryInternal_GetAudioImportOptions(MString* pathObj, InternalAudioOptions* result) +{ + String path; + MUtils::ToString(pathObj, path); + FileSystem::NormalizePath(path); + + ImportAudio::Options options; + if (ImportAudio::TryGetImportOptions(path, options)) + { + // Convert into managed storage + InternalAudioOptions::Convert(&options, result); + return true; } - static float GetAnimationTime(AnimatedModel* animatedModel) + return false; +} + +DEFINE_INTERNAL_CALL(MArray*) LayersAndTagsSettingsInternal_GetCurrentLayers(int* layersCount) +{ + *layersCount = Math::Max(1, Level::GetNonEmptyLayerNamesCount()); + return MUtils::ToArray(Span(Level::Layers, *layersCount)); +} + +DEFINE_INTERNAL_CALL(void) GameSettingsInternal_Apply() +{ + LOG(Info, "Apply game settings"); + GameSettings::Load(); +} + +bool ManagedEditor::Import(String inputPath, String outputPath, void* arg) +{ + FileSystem::NormalizePath(inputPath); + FileSystem::NormalizePath(outputPath); + return AssetsImportingManager::Import(inputPath, outputPath, arg); +} + +bool ManagedEditor::Import(const String& inputPath, const String& outputPath, const TextureTool::Options& options) +{ + return Import(inputPath, outputPath, (void*)&options); +} + +bool ManagedEditor::TryRestoreImportOptions(TextureTool::Options& options, String assetPath) +{ + FileSystem::NormalizePath(assetPath); + return ImportTexture::TryGetImportOptions(assetPath, options); +} + +bool ManagedEditor::Import(const String& inputPath, const String& outputPath, const ModelTool::Options& options) +{ + return Import(inputPath, outputPath, (void*)&options); +} + +bool ManagedEditor::TryRestoreImportOptions(ModelTool::Options& options, String assetPath) +{ + // Initialize defaults + if (const auto* graphicsSettings = GraphicsSettings::Get()) { - return animatedModel && animatedModel->GraphInstance.State.Count() == 1 ? animatedModel->GraphInstance.State[0].Animation.TimePosition : 0.0f; + options.GenerateSDF = graphicsSettings->GenerateSDFOnModelImport; } - static void SetAnimationTime(AnimatedModel* animatedModel, float time) - { - if (animatedModel && animatedModel->GraphInstance.State.Count() == 1) - animatedModel->GraphInstance.State[0].Animation.TimePosition = time; - } - - static void InitRuntime() - { - ADD_INTERNAL_CALL("FlaxEditor.Editor::IsDevInstance", &IsDevInstance); - ADD_INTERNAL_CALL("FlaxEditor.Editor::IsOfficialBuild", &IsOfficialBuild); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_IsPlayMode", &IsPlayMode); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_ReadOutputLogs", &ReadOutputLogs); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_SetPlayMode", &SetPlayMode); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_GetProjectPath", &GetProjectPath); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_Import", &Import); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_ImportTexture", &ImportTexture); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_ImportModel", &ImportModel); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_ImportAudio", &ImportAudio); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_GetAudioClipMetadata", &GetAudioClipMetadata); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_SaveJsonAsset", &SaveJsonAsset); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_CopyCache", &CopyCache); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_CloneAssetFile", &CloneAssetFile); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_BakeLightmaps", &BakeLightmaps); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_GetShaderAssetSourceCode", &GetShaderAssetSourceCode); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_CookMeshCollision", &CookMeshCollision); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_GetCollisionWires", &GetCollisionWires); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_GetEditorBoxWithChildren", &GetEditorBoxWithChildren); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_SetOptions", &SetOptions); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_DrawNavMesh", &DrawNavMesh); - ADD_INTERNAL_CALL("FlaxEditor.CustomEditors.CustomEditorsUtil::Internal_GetCustomEditor", &CustomEditorsUtilInternal::GetCustomEditor); - ADD_INTERNAL_CALL("FlaxEditor.Content.Import.TextureImportEntry::Internal_GetTextureImportOptions", &GetTextureImportOptions); - ADD_INTERNAL_CALL("FlaxEditor.Content.Import.ModelImportEntry::Internal_GetModelImportOptions", &GetModelImportOptions); - ADD_INTERNAL_CALL("FlaxEditor.Content.Import.AudioImportEntry::Internal_GetAudioImportOptions", &GetAudioImportOptions); - ADD_INTERNAL_CALL("FlaxEditor.Content.Settings.LayersAndTagsSettings::GetCurrentLayers", &LayersAndTagsSettingsInternal::GetCurrentLayers); - ADD_INTERNAL_CALL("FlaxEditor.Content.Settings.GameSettings::Apply", &GameSettingsInternal1::Apply); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_CloseSplashScreen", &CloseSplashScreen); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_CreateAsset", &CreateAsset); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_CreateVisualScript", &CreateVisualScript); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_CanImport", &CanImport); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_CanExport", &CanExport); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_Export", &Export); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_GetIsEveryAssemblyLoaded", &GetIsEveryAssemblyLoaded); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_GetLastProjectOpenedEngineBuild", &GetLastProjectOpenedEngineBuild); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_GetIsCSGActive", &GetIsCSGActive); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_RunVisualScriptBreakpointLoopTick", &RunVisualScriptBreakpointLoopTick); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_GetVisualScriptLocals", &GetVisualScriptLocals); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_GetVisualScriptStackFrames", &GetVisualScriptStackFrames); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_GetVisualScriptPreviousScopeFrame", &GetVisualScriptPreviousScopeFrame); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_EvaluateVisualScriptLocal", &EvaluateVisualScriptLocal); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_DeserializeSceneObject", &DeserializeSceneObject); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_LoadAsset", &LoadAsset); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_CanSetToRoot", &CanSetToRoot); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_GetAnimationTime", &GetAnimationTime); - ADD_INTERNAL_CALL("FlaxEditor.Editor::Internal_SetAnimationTime", &SetAnimationTime); - } -}; - -IMPLEMENT_SCRIPTING_TYPE_NO_SPAWN_WITH_BASE(ManagedEditor, ScriptingObject, FlaxEngine, "FlaxEditor.Editor", nullptr, nullptr); + // Get options from model + FileSystem::NormalizePath(assetPath); + return ImportModelFile::TryGetImportOptions(assetPath, options); +} diff --git a/Source/Editor/Managed/ManagedEditor.cpp b/Source/Editor/Managed/ManagedEditor.cpp index fdabf9056..fd9219d35 100644 --- a/Source/Editor/Managed/ManagedEditor.cpp +++ b/Source/Editor/Managed/ManagedEditor.cpp @@ -3,20 +3,19 @@ #include "ManagedEditor.h" #include "Editor/Editor.h" #include "FlaxEngine.Gen.h" -#include "Engine/Scripting/MException.h" -#include "Engine/Scripting/Scripting.h" -#include "Engine/Scripting/MainThreadManagedInvokeAction.h" #include "Engine/ShadowsOfMordor/Builder.h" +#include "Engine/Scripting/Scripting.h" #include "Engine/Scripting/ScriptingType.h" #include "Engine/Scripting/BinaryModule.h" #include "Engine/Scripting/ManagedCLR/MAssembly.h" #include "Engine/Scripting/ManagedCLR/MClass.h" +#include "Engine/Scripting/ManagedCLR/MException.h" +#include "Engine/Scripting/Internal/MainThreadManagedInvokeAction.h" #include "Engine/Content/Assets/VisualScript.h" #include "Engine/CSG/CSGBuilder.h" #include "Engine/Engine/CommandLine.h" #include "Engine/Renderer/ProbesRenderer.h" #include "Engine/Animations/Graph/AnimGraph.h" -#include ManagedEditor::InternalOptions ManagedEditor::ManagedEditorOptions; @@ -79,7 +78,7 @@ void OnBakeEvent(bool started, const ProbesRenderer::Entry& e) ASSERT(Internal_EnvProbeBake); } - MonoObject* probeObj = e.Actor ? e.Actor->GetManagedInstance() : nullptr; + MObject* probeObj = e.Actor ? e.Actor->GetManagedInstance() : nullptr; MainThreadManagedInvokeAction::ParamsBuilder params; params.AddParam(started); @@ -107,8 +106,8 @@ void OnBrushModified(CSG::Brush* brush) struct VisualScriptingDebugFlowInfo { - MonoObject* Script; - MonoObject* ScriptInstance; + MObject* Script; + MObject* ScriptInstance; uint32 NodeId; int32 BoxId; }; @@ -187,7 +186,7 @@ void ManagedEditor::Init() { LOG(Fatal, "Invalid Editor assembly! Missing initialization method."); } - MonoObject* instance = GetOrCreateManagedInstance(); + MObject* instance = GetOrCreateManagedInstance(); if (instance == nullptr) { LOG(Fatal, "Failed to create editor instance."); @@ -242,6 +241,13 @@ void ManagedEditor::Init() } } +void ManagedEditor::BeforeRun() +{ + // If during last lightmaps baking engine crashed we could try to restore the progress + if (ShadowsOfMordor::Builder::Instance()->RestoreState()) + GetClass()->GetMethod("Internal_StartLightingBake")->Invoke(GetOrCreateManagedInstance(), nullptr, nullptr); +} + void ManagedEditor::Update() { // Skip if managed object is missing @@ -325,7 +331,7 @@ bool ManagedEditor::CanReloadScripts() bool ManagedEditor::CanAutoBuildCSG() { // Skip calls from non-managed thread (eg. physics worker) - if (!mono_domain_get() || !mono_thread_current()) + if (!MCore::Thread::IsAttached()) return false; if (!HasManagedInstance()) @@ -343,7 +349,7 @@ bool ManagedEditor::CanAutoBuildCSG() bool ManagedEditor::CanAutoBuildNavMesh() { // Skip calls from non-managed thread (eg. physics worker) - if (!mono_domain_get() || !mono_thread_current()) + if (!MCore::Thread::IsAttached()) return false; if (!HasManagedInstance()) diff --git a/Source/Editor/Managed/ManagedEditor.h b/Source/Editor/Managed/ManagedEditor.h index 36fc0c234..ddd94b47e 100644 --- a/Source/Editor/Managed/ManagedEditor.h +++ b/Source/Editor/Managed/ManagedEditor.h @@ -5,6 +5,8 @@ #include "Engine/Scripting/ScriptingObject.h" #include "Engine/Platform/Window.h" #include "Engine/ShadowsOfMordor/Types.h" +#include "Engine/Tools/TextureTool/TextureTool.h" +#include "Engine/Tools/ModelTool/ModelTool.h" namespace CSG { @@ -12,14 +14,11 @@ namespace CSG } /// -/// Managed Editor root object +/// The main managed editor class. Editor root object. /// -class ManagedEditor : public ScriptingObject +API_CLASS(Namespace="FlaxEditor", Name="Editor", NoSpawn, NoConstructor) class ManagedEditor : private ScriptingObject { -DECLARE_SCRIPTING_TYPE_NO_SPAWN(ManagedEditor); - -public: - + DECLARE_SCRIPTING_TYPE_NO_SPAWN(ManagedEditor); static Guid ObjectID; struct InternalOptions @@ -36,7 +35,6 @@ public: static InternalOptions ManagedEditorOptions; public: - /// /// Initializes a new instance of the class. /// @@ -48,12 +46,13 @@ public: ~ManagedEditor(); public: - /// /// Initializes managed editor. /// void Init(); + void BeforeRun(); + /// /// Updates managed editor. /// @@ -94,7 +93,6 @@ public: bool CanAutoBuildNavMesh(); public: - /// /// Checks whenever the game viewport is focused by the user (eg. can receive input). /// @@ -144,12 +142,58 @@ public: /// void RequestStartPlayOnEditMode(); -private: +public: + /// + /// Imports the asset file to the target location. + /// + /// The source file path. + /// The result asset file path. + /// The custom argument 9native data). + /// True if importing failed, otherwise false. + API_FUNCTION() static bool Import(String inputPath, String outputPath, void* arg = nullptr); +#if COMPILE_WITH_TEXTURE_TOOL + /// + /// Imports the texture asset file to the target location. + /// + /// The source file path. + /// The result asset file path. + /// The import settings. + /// True if importing failed, otherwise false. + API_FUNCTION() static bool Import(const String& inputPath, const String& outputPath, const TextureTool::Options& options); + + /// + /// Tries the restore the asset import options from the target resource file. + /// + /// The options. + /// The asset path. + /// True settings has been restored, otherwise false. + API_FUNCTION() static bool TryRestoreImportOptions(API_PARAM(Ref) TextureTool::Options& options, String assetPath); +#endif + +#if COMPILE_WITH_MODEL_TOOL + /// + /// Imports the model asset file to the target location. + /// + /// The source file path. + /// The result asset file path. + /// The import settings. + /// True if importing failed, otherwise false. + API_FUNCTION() static bool Import(const String& inputPath, const String& outputPath, const ModelTool::Options& options); + + /// + /// Tries the restore the asset import options from the target resource file. + /// + /// The options. + /// The asset path. + /// True settings has been restored, otherwise false. + API_FUNCTION() static bool TryRestoreImportOptions(API_PARAM(Ref) ModelTool::Options& options, String assetPath); +#endif + +private: void OnEditorAssemblyLoaded(MAssembly* assembly); public: - // [ScriptingObject] void DestroyManaged() override; }; diff --git a/Source/Editor/Modules/ContentDatabaseModule.cs b/Source/Editor/Modules/ContentDatabaseModule.cs index 5e3b722b9..04e630381 100644 --- a/Source/Editor/Modules/ContentDatabaseModule.cs +++ b/Source/Editor/Modules/ContentDatabaseModule.cs @@ -8,6 +8,7 @@ using FlaxEditor.Content; using FlaxEditor.Content.Settings; using FlaxEditor.Scripting; using FlaxEngine; +using FlaxEngine.Utilities; namespace FlaxEditor.Modules { @@ -19,6 +20,7 @@ namespace FlaxEditor.Modules { private bool _enableEvents; private bool _isDuringFastSetup; + private bool _rebuildFlag; private int _itemsCreated; private int _itemsDeleted; private readonly HashSet _dirtyNodes = new HashSet(); @@ -39,9 +41,9 @@ namespace FlaxEditor.Modules public readonly List Projects = new List(); /// - /// The list with all content items proxy objects. + /// The list with all content items proxy objects. Use and to modify this or to refresh database when adding new item proxy types. /// - public readonly List Proxy = new List(64); + public readonly List Proxy = new List(128); /// /// Occurs when new items is added to the workspace content database. @@ -58,6 +60,16 @@ namespace FlaxEditor.Modules /// public event Action WorkspaceModified; + /// + /// Occurs when workspace has will be rebuilt. + /// + public event Action WorkspaceRebuilding; + + /// + /// Occurs when workspace has been rebuilt. + /// + public event Action WorkspaceRebuilt; + /// /// Gets the amount of created items. /// @@ -707,6 +719,100 @@ namespace FlaxEditor.Modules WorkspaceModified?.Invoke(); } + /// + /// Adds the proxy. + /// + /// The proxy type. + public void AddProxy(ContentProxy proxy) + { + Proxy.Insert(0, proxy); + Rebuild(); + } + + /// + /// Removes the proxy. + /// + /// The proxy type. + public void RemoveProxy(ContentProxy proxy) + { + Proxy.Remove(proxy); + Rebuild(); + } + + /// + /// Rebuilds the whole database (eg. when adding custom item types from plugin). + /// + /// True if rebuild num, otherwise will be scheduled for the next editor update (eg. to batch multiple rebuilds within a frame). + public void Rebuild(bool immediate = false) + { + _rebuildFlag = true; + if (immediate) + RebuildInternal(); + } + + private void RebuildInternal() + { + var enableEvents = _enableEvents; + if (enableEvents) + { + WorkspaceRebuilding?.Invoke(); + } + + Profiler.BeginEvent("ContentDatabase.Rebuild"); + var startTime = Platform.TimeSeconds; + _rebuildFlag = false; + _enableEvents = false; + + // Load all folders + // TODO: we should create async task for gathering content and whole workspace contents if it takes too long + // TODO: create progress bar in content window and after end we should enable events and update it + _isDuringFastSetup = true; + var startItems = _itemsCreated; + foreach (var project in Projects) + { + if (project.Content != null) + LoadFolder(project.Content, true); + if (project.Source != null) + LoadFolder(project.Source, true); + } + _isDuringFastSetup = false; + + _enableEvents = enableEvents; + var endTime = Platform.TimeSeconds; + Editor.Log(string.Format("Project database created in {0} ms. Items count: {1}", (int)((endTime - startTime) * 1000.0), _itemsCreated - startItems)); + Profiler.EndEvent(); + + if (enableEvents) + { + WorkspaceModified?.Invoke(); + WorkspaceRebuilt?.Invoke(); + } + } + + private void Dispose(ContentItem item) + { + if (_enableEvents) + ItemRemoved?.Invoke(item); + + if (item is ContentFolder folder) + { + if (folder.Children.Count > 0) + { + var children = folder.Children.ToArray(); + for (int i = 0; i < children.Length; i++) + Dispose(children[i]); + } + + item.ParentFolder = null; + folder.Node.Dispose(); + } + else + { + item.ParentFolder = null; + item.Dispose(); + } + } + private void LoadFolder(ContentTreeNode node, bool checkSubDirs) { if (node == null) @@ -716,9 +822,18 @@ namespace FlaxEditor.Modules var folder = node.Folder; var path = folder.Path; - // Check for missing files/folders (skip it during fast tree setup) - if (!_isDuringFastSetup) + if (_isDuringFastSetup) { + // Remove any spawned children + for (int i = 0; i < folder.Children.Count; i++) + { + Dispose(folder.Children[i]); + i--; + } + } + else + { + // Check for missing files/folders (skip it during fast tree setup) for (int i = 0; i < folder.Children.Count; i++) { var child = folder.Children[i]; @@ -946,7 +1061,8 @@ namespace FlaxEditor.Modules Proxy.Add(new SettingsProxy(typeof(UWPPlatformSettings), Editor.Instance.Icons.UWPSettings128)); Proxy.Add(new SettingsProxy(typeof(LinuxPlatformSettings), Editor.Instance.Icons.LinuxSettings128)); Proxy.Add(new SettingsProxy(typeof(AndroidPlatformSettings), Editor.Instance.Icons.AndroidSettings128)); - Proxy.Add(new SettingsProxy(typeof(MacPlatformSettings), Editor.Instance.Icons.Document128)); + Proxy.Add(new SettingsProxy(typeof(MacPlatformSettings), Editor.Instance.Icons.AppleSettings128)); + Proxy.Add(new SettingsProxy(typeof(iOSPlatformSettings), Editor.Instance.Icons.AppleSettings128)); var typePS4PlatformSettings = TypeUtils.GetManagedType(GameSettings.PS4PlatformSettingsTypename); if (typePS4PlatformSettings != null) @@ -972,7 +1088,6 @@ namespace FlaxEditor.Modules Proxy.Add(new GenericJsonAssetProxy()); // Create content folders nodes - var startTime = Platform.TimeSeconds; Engine = new ProjectTreeNode(Editor.EngineProject) { Content = new MainContentTreeNode(Engine, ContentFolderType.Content, Globals.EngineContentFolder), @@ -996,25 +1111,10 @@ namespace FlaxEditor.Modules LoadProjects(Game.Project); } - // Load all folders - // TODO: we should create async task for gathering content and whole workspace contents if it takes too long - // TODO: create progress bar in content window and after end we should enable events and update it - _isDuringFastSetup = true; - foreach (var project in Projects) - { - if (project.Content != null) - LoadFolder(project.Content, true); - if (project.Source != null) - LoadFolder(project.Source, true); - } - _isDuringFastSetup = false; + RebuildInternal(); - // Enable events - _enableEvents = true; Editor.ContentImporting.ImportFileEnd += ContentImporting_ImportFileDone; - var endTime = Platform.TimeSeconds; - - Editor.Log(string.Format("Project database created in {0} ms. Items count: {1}", (int)((endTime - startTime) * 1000.0), _itemsCreated)); + _enableEvents = true; } private void ContentImporting_ImportFileDone(IFileEntryAction obj, bool failed) @@ -1100,6 +1200,10 @@ namespace FlaxEditor.Modules } _dirtyNodes.Clear(); } + + // Lazy-rebuilds + if (_rebuildFlag) + RebuildInternal(); } /// diff --git a/Source/Editor/Modules/ContentFindingModule.cs b/Source/Editor/Modules/ContentFindingModule.cs index e8fb40f73..ccf1cb3e4 100644 --- a/Source/Editor/Modules/ContentFindingModule.cs +++ b/Source/Editor/Modules/ContentFindingModule.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Text.RegularExpressions; using FlaxEditor.Content; using FlaxEditor.GUI.Docking; diff --git a/Source/Editor/Modules/ContentImportingModule.cs b/Source/Editor/Modules/ContentImportingModule.cs index 9de3c10e0..c94ba650e 100644 --- a/Source/Editor/Modules/ContentImportingModule.cs +++ b/Source/Editor/Modules/ContentImportingModule.cs @@ -375,7 +375,9 @@ namespace FlaxEditor.Modules Thread.Sleep(0); _workerThread.Join(1000); - _workerThread.Abort(); +#if !USE_NETCORE + _workerThread.Abort(); // Deprecated in .NET 7 +#endif _workerThread = null; } diff --git a/Source/Editor/Modules/SourceCodeEditing/CachedCustomAnimGraphNodesCollection.cs b/Source/Editor/Modules/SourceCodeEditing/CachedCustomAnimGraphNodesCollection.cs index 113a701c6..499a472d6 100644 --- a/Source/Editor/Modules/SourceCodeEditing/CachedCustomAnimGraphNodesCollection.cs +++ b/Source/Editor/Modules/SourceCodeEditing/CachedCustomAnimGraphNodesCollection.cs @@ -6,6 +6,7 @@ using System.Reflection; using FlaxEditor.Scripting; using FlaxEditor.Surface; using FlaxEngine; +using FlaxEngine.Utilities; using MethodInfo = System.Reflection.MethodInfo; namespace FlaxEditor.Modules.SourceCodeEditing @@ -106,7 +107,7 @@ namespace FlaxEditor.Modules.SourceCodeEditing // Validate node type var typeName = Surface.Archetypes.Custom.GetNodeTypeName(arch); - var type = Scripting.TypeUtils.GetType(typeName).Type; + var type = TypeUtils.GetType(typeName).Type; if (type == null) { Debug.LogWarning(string.Format("Method {0} from {1} returned invalid node archetype. Failed to find node logic defined in type {2}.", method, method.DeclaringType, typeName)); diff --git a/Source/Editor/Modules/SourceCodeEditing/CachedTypesCollection.cs b/Source/Editor/Modules/SourceCodeEditing/CachedTypesCollection.cs index 6e0517175..a73c3d2ee 100644 --- a/Source/Editor/Modules/SourceCodeEditing/CachedTypesCollection.cs +++ b/Source/Editor/Modules/SourceCodeEditing/CachedTypesCollection.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Reflection; using FlaxEditor.Scripting; using FlaxEngine; +using FlaxEngine.Utilities; namespace FlaxEditor.Modules.SourceCodeEditing { diff --git a/Source/Editor/Modules/SourceCodeEditing/CodeDocsModule.cs b/Source/Editor/Modules/SourceCodeEditing/CodeDocsModule.cs index 8b93f8ea4..225bad082 100644 --- a/Source/Editor/Modules/SourceCodeEditing/CodeDocsModule.cs +++ b/Source/Editor/Modules/SourceCodeEditing/CodeDocsModule.cs @@ -257,13 +257,18 @@ namespace FlaxEditor.Modules.SourceCodeEditing { Profiler.BeginEvent("GetXmlDocs"); - var uri = new UriBuilder(assembly.CodeBase); - var path = Uri.UnescapeDataString(uri.Path); - var name = assembly.GetName().Name; - var xmlFilePath = Path.Combine(Path.GetDirectoryName(path), name + ".xml"); + var assemblyPath = Utils.GetAssemblyLocation(assembly); + var assemblyName = assembly.GetName().Name; + var xmlFilePath = Path.ChangeExtension(assemblyPath, ".xml"); + if (!File.Exists(assemblyPath)) + { + var uri = new UriBuilder(assemblyPath); + var path = Uri.UnescapeDataString(uri.Path); + xmlFilePath = Path.Combine(Path.GetDirectoryName(path), assemblyName + ".xml"); + } if (File.Exists(xmlFilePath)) { - Profiler.BeginEvent(name); + Profiler.BeginEvent(assemblyName); try { // Parse xml documentation diff --git a/Source/Editor/Modules/SourceCodeEditing/CodeEditingModule.cs b/Source/Editor/Modules/SourceCodeEditing/CodeEditingModule.cs index a06e0f658..c61fad713 100644 --- a/Source/Editor/Modules/SourceCodeEditing/CodeEditingModule.cs +++ b/Source/Editor/Modules/SourceCodeEditing/CodeEditingModule.cs @@ -8,6 +8,7 @@ using FlaxEditor.Options; using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; namespace FlaxEditor.Modules.SourceCodeEditing { @@ -26,7 +27,11 @@ namespace FlaxEditor.Modules.SourceCodeEditing private static bool CheckFunc(ScriptType scriptType) { - if (scriptType.IsStatic || scriptType.IsGenericType || !scriptType.IsPublic || scriptType.HasAttribute(typeof(HideInEditorAttribute), true)) + if (scriptType.IsStatic || + scriptType.IsGenericType || + !scriptType.IsPublic || + scriptType.HasAttribute(typeof(HideInEditorAttribute), true) || + scriptType.HasAttribute(typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute), false)) return false; var managedType = TypeUtils.GetType(scriptType); return !TypeUtils.IsDelegate(managedType); @@ -399,9 +404,27 @@ namespace FlaxEditor.Modules.SourceCodeEditing private static bool HasAssemblyValidAnyTypes(Assembly assembly) { + var codeBase = Utils.GetAssemblyLocation(assembly); +#if USE_NETCORE + if (assembly.ManifestModule.FullyQualifiedName == "") + return false; + + if (string.IsNullOrEmpty(codeBase)) + return true; + + // Skip runtime related assemblies + string repositoryUrl = assembly.GetCustomAttributes().FirstOrDefault(x => x.Key == "RepositoryUrl")?.Value ?? ""; + if (repositoryUrl != "https://github.com/dotnet/runtime") + return true; +#else + if (string.IsNullOrEmpty(codeBase)) + return true; + // Skip assemblies from in-build Mono directory - var codeBase = assembly.CodeBase; - return string.IsNullOrEmpty(codeBase) || !codeBase.Contains("/Mono/lib/mono/"); + if (!codeBase.Contains("/Mono/lib/mono/")) + return true; +#endif + return false; } private static bool HasAssemblyValidScriptingTypes(Assembly a) diff --git a/Source/Editor/Modules/SourceCodeEditing/InBuildSourceCodeEditor.cs b/Source/Editor/Modules/SourceCodeEditing/InBuildSourceCodeEditor.cs index e00ea1b61..ff59cbe84 100644 --- a/Source/Editor/Modules/SourceCodeEditing/InBuildSourceCodeEditor.cs +++ b/Source/Editor/Modules/SourceCodeEditing/InBuildSourceCodeEditor.cs @@ -78,8 +78,8 @@ namespace FlaxEditor.Modules.SourceCodeEditing switch (Type) { case CodeEditorTypes.VSCodeInsiders: - case CodeEditorTypes.VSCode: return "-vscode -vs2019"; - case CodeEditorTypes.Rider: return "-vs2019"; + case CodeEditorTypes.VSCode: return "-vscode -vs2022"; + case CodeEditorTypes.Rider: return "-vs2022"; default: return null; } } diff --git a/Source/Editor/Options/InputBinding.cs b/Source/Editor/Options/InputBinding.cs index 83789338a..2e18dab9e 100644 --- a/Source/Editor/Options/InputBinding.cs +++ b/Source/Editor/Options/InputBinding.cs @@ -218,6 +218,16 @@ namespace FlaxEditor.Options return base.CanConvertFrom(context, sourceType); } + /// + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + if (destinationType == typeof(string)) + { + return false; + } + return base.CanConvertTo(context, destinationType); + } + /// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { diff --git a/Source/Editor/Options/OptionsModule.cs b/Source/Editor/Options/OptionsModule.cs index b82ad38cc..68aa11626 100644 --- a/Source/Editor/Options/OptionsModule.cs +++ b/Source/Editor/Options/OptionsModule.cs @@ -125,9 +125,12 @@ namespace FlaxEditor.Options options.CustomSettings.Add(e.Key, JsonSerializer.Serialize(e.Value())); } + float prevInterfaceScale = Options.Interface.InterfaceScale; Options = options; OnOptionsChanged(); - Platform.CustomDpiScale = Options.Interface.InterfaceScale; + + // Scale interface relative to the current value (eg. when using system-provided Dpi Scale) + Platform.CustomDpiScale *= Options.Interface.InterfaceScale / prevInterfaceScale; } else { diff --git a/Source/Editor/Plugins/PluginUtils.cs b/Source/Editor/Plugins/PluginUtils.cs index a3d535c87..755c57d7e 100644 --- a/Source/Editor/Plugins/PluginUtils.cs +++ b/Source/Editor/Plugins/PluginUtils.cs @@ -24,7 +24,7 @@ namespace FlaxEditor var type = plugin.GetType(); var assembly = type.Assembly; - var assemblyPath = assembly.Location; + var assemblyPath = Utils.GetAssemblyLocation(assembly); var assemblyName = assembly.GetName().Name; var dotEditorPos = assemblyName.LastIndexOf(".Editor", StringComparison.OrdinalIgnoreCase); if (dotEditorPos != -1) @@ -84,7 +84,7 @@ namespace FlaxEditor editorPlugin = null; // Cache data - var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + var allAssemblies = Utils.GetAssemblies(); var gameAssembly = Utils.GetAssemblyByName("Game", allAssemblies); var gameEditorAssembly = Utils.GetAssemblyByName("Game.Editor", allAssemblies); var gameAssemblyTypes = gameAssembly.GetTypes(); diff --git a/Source/Editor/Progress/Handlers/CompileScriptsProgress.cs b/Source/Editor/Progress/Handlers/CompileScriptsProgress.cs index 59d40463e..310612a73 100644 --- a/Source/Editor/Progress/Handlers/CompileScriptsProgress.cs +++ b/Source/Editor/Progress/Handlers/CompileScriptsProgress.cs @@ -40,8 +40,10 @@ namespace FlaxEditor.Progress.Handlers private void OnScriptsReload() { +#if !USE_NETCORE // Clear types cache Newtonsoft.Json.JsonSerializer.ClearCache(); +#endif } private void OnCompilationFailed() diff --git a/Source/Editor/ProjectInfo.cs b/Source/Editor/ProjectInfo.cs index bc55a9c05..ed9470c35 100644 --- a/Source/Editor/ProjectInfo.cs +++ b/Source/Editor/ProjectInfo.cs @@ -8,6 +8,110 @@ using Newtonsoft.Json; namespace FlaxEditor { + /// + /// + /// + public class FlaxVersionConverter : JsonConverter + { + // Original implementation is based on Newtonsoft.Json VersionConverter + /// + /// Writes the JSON representation of the object. + /// + /// The to write to. + /// The value. + /// The calling serializer. + public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) + { + if (value == null) + { + writer.WriteNull(); + } + else if (value is Version) + { + writer.WriteValue(value.ToString()); + } + else + { + throw new JsonSerializationException("Expected Version object value"); + } + } + + /// + /// Reads the JSON representation of the object. + /// + /// The to read from. + /// Type of the object. + /// The existing property value of the JSON that is being converted. + /// The calling serializer. + /// The object value. + public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) + { + if (reader.TokenType == JsonToken.Null) + { + return null; + } + else + { + if (reader.TokenType == JsonToken.StartObject) + { + try + { + reader.Read(); + Dictionary values = new Dictionary(); + while (reader.TokenType == JsonToken.PropertyName) + { + var key = reader.Value as string; + reader.Read(); + var val = (long)reader.Value; + reader.Read(); + values.Add(key, (int)val); + } + + int major = 0, minor = 0, build = 0; + values.TryGetValue("Major", out major); + values.TryGetValue("Minor", out minor); + values.TryGetValue("Build", out build); + + Version v = new Version(major, minor, build); + return v; + } + catch (Exception ex) + { + throw new Exception(String.Format("Error parsing version string: {0}", reader.Value), ex); + } + } + else if (reader.TokenType == JsonToken.String) + { + try + { + Version v = new Version((string)reader.Value!); + return v; + } + catch (Exception ex) + { + throw new Exception(String.Format("Error parsing version string: {0}", reader.Value), ex); + } + } + else + { + throw new Exception(String.Format("Unexpected token or value when parsing version. Token: {0}, Value: {1}", reader.TokenType, reader.Value)); + } + } + } + + /// + /// Determines whether this instance can convert the specified object type. + /// + /// Type of the object. + /// + /// true if this instance can convert the specified object type; otherwise, false. + /// + public override bool CanConvert(Type objectType) + { + return objectType == typeof(Version); + } + } + /// /// Contains information about Flax project. /// @@ -154,7 +258,7 @@ namespace FlaxEditor { // Load var contents = File.ReadAllText(path); - var project = JsonConvert.DeserializeObject(contents); + var project = JsonConvert.DeserializeObject(contents, new JsonSerializerSettings() { Converters = new[] { new FlaxVersionConverter() } }); project.ProjectPath = path; project.ProjectFolderPath = StringUtils.NormalizePath(Path.GetDirectoryName(path)); diff --git a/Source/Editor/SceneGraph/Actors/CameraNode.cs b/Source/Editor/SceneGraph/Actors/CameraNode.cs index ac6edd149..400a2e06f 100644 --- a/Source/Editor/SceneGraph/Actors/CameraNode.cs +++ b/Source/Editor/SceneGraph/Actors/CameraNode.cs @@ -35,7 +35,7 @@ namespace FlaxEditor.SceneGraph.Actors return false; } - return Camera.Internal_IntersectsItselfEditor(Object.GetUnmanagedPtr(_actor), ref ray.Ray, out distance); + return Camera.Internal_IntersectsItselfEditor(FlaxEngine.Object.GetUnmanagedPtr(_actor), ref ray.Ray, out distance); } } } diff --git a/Source/Editor/SceneGraph/Actors/SplineNode.cs b/Source/Editor/SceneGraph/Actors/SplineNode.cs index ee03caa94..eebee0cd9 100644 --- a/Source/Editor/SceneGraph/Actors/SplineNode.cs +++ b/Source/Editor/SceneGraph/Actors/SplineNode.cs @@ -361,7 +361,7 @@ namespace FlaxEditor.SceneGraph.Actors StaticFlags = Actor.StaticFlags, Transform = Actor.Transform, }; - Editor.Instance.SceneEditing.Spawn(actor, Actor); + Root.Spawn(actor, Actor); } private void OnAddSplineCollider() @@ -372,7 +372,7 @@ namespace FlaxEditor.SceneGraph.Actors Transform = Actor.Transform, }; // TODO: auto pick the collision data if already using spline model - Editor.Instance.SceneEditing.Spawn(actor, Actor); + Root.Spawn(actor, Actor); } private void OnAddSplineRopeBody() @@ -382,7 +382,7 @@ namespace FlaxEditor.SceneGraph.Actors StaticFlags = StaticFlags.None, Transform = Actor.Transform, }; - Editor.Instance.SceneEditing.Spawn(actor, Actor); + Root.Spawn(actor, Actor); } internal static void OnSplineEdited(Spline spline) diff --git a/Source/Editor/SceneGraph/Actors/StaticModelNode.cs b/Source/Editor/SceneGraph/Actors/StaticModelNode.cs index faded9025..52176ab8b 100644 --- a/Source/Editor/SceneGraph/Actors/StaticModelNode.cs +++ b/Source/Editor/SceneGraph/Actors/StaticModelNode.cs @@ -43,7 +43,7 @@ namespace FlaxEditor.SceneGraph.Actors StaticFlags = Actor.StaticFlags, Transform = Actor.Transform, }; - Editor.Instance.SceneEditing.Spawn(actor, Actor); + Root.Spawn(actor, Actor); return; } if (modelPath.EndsWith("/Primitives/Sphere.flax", StringComparison.Ordinal)) @@ -53,7 +53,7 @@ namespace FlaxEditor.SceneGraph.Actors StaticFlags = Actor.StaticFlags, Transform = Actor.Transform, }; - Editor.Instance.SceneEditing.Spawn(actor, Actor); + Root.Spawn(actor, Actor); return; } if (modelPath.EndsWith("/Primitives/Plane.flax", StringComparison.Ordinal)) @@ -64,7 +64,7 @@ namespace FlaxEditor.SceneGraph.Actors Transform = Actor.Transform, Size = new Float3(100.0f, 100.0f, 1.0f), }; - Editor.Instance.SceneEditing.Spawn(actor, Actor); + Root.Spawn(actor, Actor); return; } if (modelPath.EndsWith("/Primitives/Capsule.flax", StringComparison.Ordinal)) @@ -91,7 +91,7 @@ namespace FlaxEditor.SceneGraph.Actors Transform = Actor.Transform, CollisionData = collisionData, }; - Editor.Instance.SceneEditing.Spawn(actor, Actor); + Root.Spawn(actor, Actor); }; var collisionDataProxy = (CollisionDataProxy)Editor.Instance.ContentDatabase.GetProxy(); collisionDataProxy.CreateCollisionDataFromModel(model, created); diff --git a/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs b/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs index d00bfa10a..83ea666d9 100644 --- a/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs +++ b/Source/Editor/SceneGraph/GUI/ActorTreeNode.cs @@ -13,6 +13,7 @@ using FlaxEditor.Windows; using FlaxEditor.Windows.Assets; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; using Object = FlaxEngine.Object; namespace FlaxEditor.SceneGraph.GUI @@ -637,7 +638,7 @@ namespace FlaxEditor.SceneGraph.GUI } actor.Name = item.ShortName; actor.Transform = spawnParent.Transform; - Editor.Instance.SceneEditing.Spawn(actor, spawnParent, false); + ActorNode.Root.Spawn(actor, spawnParent); actor.OrderInParent = newOrder; } result = DragDropEffect.Move; @@ -648,8 +649,6 @@ namespace FlaxEditor.SceneGraph.GUI for (int i = 0; i < _dragActorType.Objects.Count; i++) { var item = _dragActorType.Objects[i]; - - // Create actor var actor = item.CreateInstance() as Actor; if (actor == null) { @@ -659,8 +658,6 @@ namespace FlaxEditor.SceneGraph.GUI actor.StaticFlags = Actor.StaticFlags; actor.Name = item.Name; actor.Transform = Actor.Transform; - - // Spawn ActorNode.Root.Spawn(actor, Actor); } diff --git a/Source/Editor/Scripting/CodeEditors/RiderCodeEditor.cpp b/Source/Editor/Scripting/CodeEditors/RiderCodeEditor.cpp index 438331e11..e28d1e381 100644 --- a/Source/Editor/Scripting/CodeEditors/RiderCodeEditor.cpp +++ b/Source/Editor/Scripting/CodeEditors/RiderCodeEditor.cpp @@ -9,6 +9,7 @@ #include "Engine/Engine/Globals.h" #include "Engine/Core/Collections/Sorting.h" #include "Engine/Platform/File.h" +#include "Engine/Platform/CreateProcessSettings.h" #include "Engine/Serialization/Json.h" #if PLATFORM_WINDOWS @@ -237,13 +238,19 @@ void RiderCodeEditor::OpenFile(const String& path, int32 line) // Generate project files if solution is missing if (!FileSystem::FileExists(_solutionPath)) { - ScriptsBuilder::GenerateProject(TEXT("-vs2019")); + ScriptsBuilder::GenerateProject(TEXT("-vs2022")); } // Open file line = line > 0 ? line : 1; - const String args = String::Format(TEXT("\"{0}\" --line {2} \"{1}\""), _solutionPath, path, line); - Platform::StartProcess(_execPath, args, StringView::Empty); + CreateProcessSettings procSettings; + procSettings.FileName = _execPath; + procSettings.Arguments = String::Format(TEXT("\"{0}\" --line {2} \"{1}\""), _solutionPath, path, line); + procSettings.HiddenWindow = false; + procSettings.WaitForEnd = false; + procSettings.LogOutput = false; + procSettings.ShellExecute = true; + Platform::CreateProcess(procSettings); } void RiderCodeEditor::OpenSolution() @@ -251,12 +258,18 @@ void RiderCodeEditor::OpenSolution() // Generate project files if solution is missing if (!FileSystem::FileExists(_solutionPath)) { - ScriptsBuilder::GenerateProject(TEXT("-vs2019")); + ScriptsBuilder::GenerateProject(TEXT("-vs2022")); } // Open solution - const String args = String::Format(TEXT("\"{0}\""), _solutionPath); - Platform::StartProcess(_execPath, args, StringView::Empty); + CreateProcessSettings procSettings; + procSettings.FileName = _execPath; + procSettings.Arguments = String::Format(TEXT("\"{0}\""), _solutionPath); + procSettings.HiddenWindow = false; + procSettings.WaitForEnd = false; + procSettings.LogOutput = false; + procSettings.ShellExecute = true; + Platform::CreateProcess(procSettings); } void RiderCodeEditor::OnFileAdded(const String& path) diff --git a/Source/Editor/Scripting/CodeEditors/SystemDefaultCodeEditor.cpp b/Source/Editor/Scripting/CodeEditors/SystemDefaultCodeEditor.cpp index b78a4310b..42386c731 100644 --- a/Source/Editor/Scripting/CodeEditors/SystemDefaultCodeEditor.cpp +++ b/Source/Editor/Scripting/CodeEditors/SystemDefaultCodeEditor.cpp @@ -1,7 +1,7 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #include "SystemDefaultCodeEditor.h" -#include "Engine/Core/Types/StringView.h" +#include "Engine/Platform/CreateProcessSettings.h" CodeEditorTypes SystemDefaultCodeEditor::GetType() const { @@ -15,7 +15,13 @@ String SystemDefaultCodeEditor::GetName() const void SystemDefaultCodeEditor::OpenFile(const String& path, int32 line) { - Platform::StartProcess(path, StringView::Empty, StringView::Empty); + CreateProcessSettings procSettings; + procSettings.FileName = path; + procSettings.HiddenWindow = false; + procSettings.WaitForEnd = false; + procSettings.LogOutput = false; + procSettings.ShellExecute = true; + Platform::CreateProcess(procSettings); } void SystemDefaultCodeEditor::OpenSolution() diff --git a/Source/Editor/Scripting/CodeEditors/VisualStudioCodeEditor.cpp b/Source/Editor/Scripting/CodeEditors/VisualStudioCodeEditor.cpp index 0ae9bd1c8..adccbba54 100644 --- a/Source/Editor/Scripting/CodeEditors/VisualStudioCodeEditor.cpp +++ b/Source/Editor/Scripting/CodeEditors/VisualStudioCodeEditor.cpp @@ -2,14 +2,19 @@ #include "VisualStudioCodeEditor.h" #include "Engine/Platform/FileSystem.h" +#include "Engine/Platform/CreateProcessSettings.h" #include "Engine/Core/Log.h" #include "Editor/Editor.h" #include "Editor/ProjectInfo.h" #include "Editor/Scripting/ScriptsBuilder.h" #include "Engine/Engine/Globals.h" -#include "Engine/Platform/Win32/IncludeWindowsHeaders.h" #if PLATFORM_LINUX #include +#elif PLATFORM_WINDOWS +#include "Engine/Platform/Win32/IncludeWindowsHeaders.h" +#elif PLATFORM_MAC +#include "Engine/Platform/Apple/AppleUtils.h" +#include #endif VisualStudioCodeEditor::VisualStudioCodeEditor(const String& execPath, const bool isInsiders) @@ -80,6 +85,33 @@ void VisualStudioCodeEditor::FindEditors(Array* output) return; } } +#elif PLATFORM_MAC + // System installed app + NSURL* AppURL = [[NSWorkspace sharedWorkspace] URLForApplicationWithBundleIdentifier:@"com.microsoft.VSCode"]; + if (AppURL != nullptr) + { + const String path = AppleUtils::ToString((CFStringRef)[AppURL path]); + output->Add(New(path, false)); + return; + } + + // Predefined locations + String userFolder; + FileSystem::GetSpecialFolderPath(SpecialFolder::Documents, userFolder); + String paths[3] = + { + TEXT("/Applications/Visual Studio Code.app"), + userFolder + TEXT("/../Visual Studio Code.app"), + userFolder + TEXT("/../Downloads/Visual Studio Code.app"), + }; + for (const String& path : paths) + { + if (FileSystem::DirectoryExists(path)) + { + output->Add(New(path, false)); + break; + } + } #endif } @@ -98,7 +130,7 @@ void VisualStudioCodeEditor::OpenFile(const String& path, int32 line) // Generate VS solution files for intellisense if (!FileSystem::FileExists(Globals::ProjectFolder / Editor::Project->Name + TEXT(".sln"))) { - ScriptsBuilder::GenerateProject(TEXT("-vs2019")); + ScriptsBuilder::GenerateProject(TEXT("-vs2022")); } // Generate project files if missing @@ -110,8 +142,14 @@ void VisualStudioCodeEditor::OpenFile(const String& path, int32 line) // Open file line = line > 0 ? line : 1; - const String args = String::Format(TEXT("\"{0}\" -g \"{1}:{2}\""), _workspacePath, path, line); - Platform::StartProcess(_execPath, args, StringView::Empty); + CreateProcessSettings procSettings; + procSettings.FileName = _execPath; + procSettings.Arguments = String::Format(TEXT("\"{0}\" -g \"{1}:{2}\""), _workspacePath, path, line); + procSettings.HiddenWindow = false; + procSettings.WaitForEnd = false; + procSettings.LogOutput = false; + procSettings.ShellExecute = true; + Platform::CreateProcess(procSettings); } void VisualStudioCodeEditor::OpenSolution() @@ -119,7 +157,7 @@ void VisualStudioCodeEditor::OpenSolution() // Generate VS solution files for intellisense if (!FileSystem::FileExists(Globals::ProjectFolder / Editor::Project->Name + TEXT(".sln"))) { - ScriptsBuilder::GenerateProject(TEXT("-vs2019")); + ScriptsBuilder::GenerateProject(TEXT("-vs2022")); } // Generate project files if solution is missing @@ -130,8 +168,14 @@ void VisualStudioCodeEditor::OpenSolution() } // Open solution - const String args = String::Format(TEXT("\"{0}\""), _workspacePath); - Platform::StartProcess(_execPath, args, StringView::Empty); + CreateProcessSettings procSettings; + procSettings.FileName = _execPath; + procSettings.Arguments = String::Format(TEXT("\"{0}\""), _workspacePath); + procSettings.HiddenWindow = false; + procSettings.WaitForEnd = false; + procSettings.LogOutput = false; + procSettings.ShellExecute = true; + Platform::CreateProcess(procSettings); } bool VisualStudioCodeEditor::UseAsyncForOpen() const diff --git a/Source/Editor/Scripting/ScriptType.Interfaces.cs b/Source/Editor/Scripting/ScriptType.Interfaces.cs index fb4230256..3b3b28ccb 100644 --- a/Source/Editor/Scripting/ScriptType.Interfaces.cs +++ b/Source/Editor/Scripting/ScriptType.Interfaces.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Reflection; using FlaxEditor.Content; +using FlaxEngine.Utilities; namespace FlaxEditor.Scripting { diff --git a/Source/Editor/Scripting/ScriptType.cs b/Source/Editor/Scripting/ScriptType.cs index d6b4fa271..d174b7dff 100644 --- a/Source/Editor/Scripting/ScriptType.cs +++ b/Source/Editor/Scripting/ScriptType.cs @@ -8,6 +8,7 @@ using System.Runtime.CompilerServices; using System.Text; using FlaxEditor.Content; using FlaxEngine; +using FlaxEngine.Utilities; namespace FlaxEditor.Scripting { @@ -831,7 +832,7 @@ namespace FlaxEditor.Scripting get { if (_managed != null) - return _managed.GetConstructor(Type.EmptyTypes) != null; + return _managed.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null) != null; return _custom?.CanCreateInstance ?? false; } } @@ -891,7 +892,12 @@ namespace FlaxEditor.Scripting public object CreateInstance() { if (_managed != null) - return Activator.CreateInstance(_managed); + { + var ctor = _managed.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null); + object value = RuntimeHelpers.GetUninitializedObject(_managed); + ctor.Invoke(value, null); + return value; + } return _custom.CreateInstance(); } diff --git a/Source/Editor/Scripting/ScriptsBuilder.cpp b/Source/Editor/Scripting/ScriptsBuilder.cpp index 1284d2df9..eaffe5691 100644 --- a/Source/Editor/Scripting/ScriptsBuilder.cpp +++ b/Source/Editor/Scripting/ScriptsBuilder.cpp @@ -10,18 +10,18 @@ #include "Engine/Debug/Exceptions/FileNotFoundException.h" #include "Engine/Engine/Engine.h" #include "Engine/Engine/Globals.h" +#include "Engine/Engine/EngineService.h" #include "Engine/Platform/FileSystem.h" #include "Engine/Platform/FileSystemWatcher.h" -#include "Engine/Threading/ThreadPool.h" +#include "Engine/Platform/CreateProcessSettings.h" #include "Engine/Threading/Threading.h" -#include "Engine/Scripting/MainThreadManagedInvokeAction.h" +#include "Engine/Scripting/Internal/MainThreadManagedInvokeAction.h" #include "Engine/Scripting/ScriptingType.h" #include "Engine/Scripting/BinaryModule.h" #include "Engine/Scripting/ManagedCLR/MAssembly.h" #include "Engine/Scripting/ManagedCLR/MClass.h" #include "Engine/Scripting/Scripting.h" #include "Engine/Scripting/Script.h" -#include "Engine/Engine/EngineService.h" #include "Engine/Profiler/ProfilerCPU.h" #include "Engine/Level/Level.h" #include "FlaxEngine.Gen.h" @@ -77,7 +77,7 @@ namespace ScriptsBuilderImpl void onScriptsReloadEnd(); void onScriptsLoaded(); - void GetClassName(const MString& fullname, MString& className); + void GetClassName(const StringAnsi& fullname, StringAnsi& className); void onCodeEditorAsyncOpenBegin() { @@ -134,6 +134,15 @@ int32 ScriptsBuilder::GetCompilationsCount() return _compilationsCount; } +String ScriptsBuilder::GetBuildToolPath() +{ +#if USE_NETCORE && (PLATFORM_LINUX || PLATFORM_MAC) + return Globals::StartupFolder / TEXT("Binaries/Tools/Flax.Build"); +#else + return Globals::StartupFolder / TEXT("Binaries/Tools/Flax.Build.exe"); +#endif +} + bool ScriptsBuilder::LastCompilationFailed() { return _lastCompilationFailed; @@ -221,7 +230,7 @@ void ScriptsBuilder::Compile() bool ScriptsBuilder::RunBuildTool(const StringView& args, const StringView& workingDir) { PROFILE_CPU(); - const String buildToolPath = Globals::StartupFolder / TEXT("Binaries/Tools/Flax.Build.exe"); + const String buildToolPath = GetBuildToolPath(); if (!FileSystem::FileExists(buildToolPath)) { Log::FileNotFoundException(buildToolPath).SetLevel(LogType::Fatal); @@ -230,7 +239,7 @@ bool ScriptsBuilder::RunBuildTool(const StringView& args, const StringView& work // Prepare build options StringBuilder cmdLine(args.Length() + buildToolPath.Length() + 200); -#if PLATFORM_LINUX || PLATFORM_MAC +#if !USE_NETCORE && (PLATFORM_LINUX || PLATFORM_MAC) const String monoPath = Globals::MonoPath / TEXT("bin/mono"); if (!FileSystem::FileExists(monoPath)) { @@ -241,15 +250,20 @@ bool ScriptsBuilder::RunBuildTool(const StringView& args, const StringView& work cmdLine.Append(TEXT("\"")); cmdLine.Append(monoPath); cmdLine.Append(TEXT("\" ")); + // TODO: Set env var for the mono MONO_GC_PARAMS=nursery-size64m to boost build performance -> profile it #endif cmdLine.Append(TEXT("\"")); cmdLine.Append(buildToolPath); cmdLine.Append(TEXT("\" ")); cmdLine.Append(args.Get(), args.Length()); - // TODO: Set env var for the mono MONO_GC_PARAMS=nursery-size64m to boost build performance -> profile it // Call build tool - const int32 result = Platform::RunProcess(StringView(*cmdLine, cmdLine.Length()), workingDir); + CreateProcessSettings procSettings; + procSettings.FileName = StringView(*cmdLine, cmdLine.Length()); + procSettings.WorkingDirectory = workingDir; + const int32 result = Platform::CreateProcess(procSettings); + if (result != 0) + LOG(Error, "Failed to run build tool, result: {0:x}", (uint32)result); return result != 0; } @@ -261,7 +275,7 @@ bool ScriptsBuilder::GenerateProject(const StringView& customArgs) return RunBuildTool(args); } -void ScriptsBuilderImpl::GetClassName(const MString& fullname, MString& className) +void ScriptsBuilderImpl::GetClassName(const StringAnsi& fullname, StringAnsi& className) { const auto lastDotIndex = fullname.FindLast('.'); if (lastDotIndex != -1) @@ -278,7 +292,7 @@ void ScriptsBuilderImpl::GetClassName(const MString& fullname, MString& classNam MClass* ScriptsBuilder::FindScript(const StringView& scriptName) { PROFILE_CPU(); - const MString scriptNameStd = scriptName.ToStringAnsi(); + const StringAnsi scriptNameStd = scriptName.ToStringAnsi(); const ScriptingTypeHandle scriptingType = Scripting::FindScriptingType(scriptNameStd); if (scriptingType) @@ -292,7 +306,7 @@ MClass* ScriptsBuilder::FindScript(const StringView& scriptName) // Check all assemblies (ignoring the typename namespace) auto& modules = BinaryModule::GetModules(); - MString className; + StringAnsi className; GetClassName(scriptNameStd, className); MClass* scriptClass = Script::GetStaticClass(); for (int32 j = 0; j < modules.Count(); j++) @@ -309,7 +323,7 @@ MClass* ScriptsBuilder::FindScript(const StringView& scriptName) // Managed scripts if (mclass->IsSubClassOf(scriptClass) && !mclass->IsStatic() && !mclass->IsAbstract() && !mclass->IsInterface()) { - MString mclassName; + StringAnsi mclassName; GetClassName(mclass->GetFullName(), mclassName); if (className == mclassName) { @@ -381,6 +395,10 @@ void ScriptsBuilder::GetBinariesConfiguration(const Char*& target, const Char*& architecture = TEXT("x64"); #elif PLATFORM_ARCH_X86 architecture = TEXT("x86"); +#elif PLATFORM_ARCH_ARM + architecture = TEXT("arm"); +#elif PLATFORM_ARCH_ARM64 + architecture = TEXT("arm64"); #else #error "Unknown architecture" #endif diff --git a/Source/Editor/Scripting/ScriptsBuilder.h b/Source/Editor/Scripting/ScriptsBuilder.h index cf0019df5..f954b0fd0 100644 --- a/Source/Editor/Scripting/ScriptsBuilder.h +++ b/Source/Editor/Scripting/ScriptsBuilder.h @@ -40,6 +40,11 @@ public: /// API_PROPERTY() static int32 GetCompilationsCount(); + /// + /// Gets the full path to the Flax.Build app. + /// + API_PROPERTY() static String GetBuildToolPath(); + /// /// Checks if last scripting building failed due to errors. /// diff --git a/Source/Editor/Scripting/TypeUtils.cs b/Source/Editor/Scripting/TypeUtils.cs index ec8b2274e..4f66d6320 100644 --- a/Source/Editor/Scripting/TypeUtils.cs +++ b/Source/Editor/Scripting/TypeUtils.cs @@ -5,14 +5,12 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; -using FlaxEngine; +using FlaxEditor; +using FlaxEditor.Scripting; -namespace FlaxEditor.Scripting +namespace FlaxEngine.Utilities { - /// - /// Editor scripting utilities and helper functions. - /// - public static class TypeUtils + partial class TypeUtils { /// /// Custom list of scripting types containers. Can be used by custom scripting languages to provide types info for the editor. @@ -35,34 +33,6 @@ namespace FlaxEditor.Scripting return o != null ? new ScriptType(o.GetType()) : ScriptType.Null; } - /// - /// Gets the typename full name. - /// - /// The type. - /// The full typename of the type. - public static string GetTypeName(this Type type) - { - if (type.IsGenericType) - { - // For generic types (eg. Dictionary) FullName returns generic parameter types with fully qualified name so simplify it manually - var sb = new StringBuilder(); - sb.Append(type.Namespace); - sb.Append('.'); - sb.Append(type.Name); - sb.Append('['); - var genericArgs = type.GetGenericArguments(); - for (var i = 0; i < genericArgs.Length; i++) - { - if (i != 0) - sb.Append(','); - sb.Append(genericArgs[i].GetTypeName()); - } - sb.Append(']'); - return sb.ToString(); - } - return type.FullName; - } - /// /// Gets the typename name for UI. /// @@ -131,7 +101,7 @@ namespace FlaxEditor.Scripting if (type.IsValueType) { var value = type.CreateInstance(); - Utilities.Utils.InitDefaultValues(value); + FlaxEditor.Utilities.Utils.InitDefaultValues(value); return value; } if (ScriptType.Object.IsAssignableFrom(type)) @@ -139,7 +109,7 @@ namespace FlaxEditor.Scripting if (type.CanCreateInstance) { var value = type.CreateInstance(); - Utilities.Utils.InitDefaultValues(value); + FlaxEditor.Utilities.Utils.InitDefaultValues(value); return value; } return null; @@ -192,7 +162,7 @@ namespace FlaxEditor.Scripting /// Additional callback used to check if the given type is valid. Returns true if add type, otherwise false. public static void GetDerivedTypes(ScriptType baseType, List result, Func checkFunc) { - var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + var assemblies = Utils.GetAssemblies(); for (int i = 0; i < assemblies.Length; i++) { GetDerivedTypes(assemblies[i], baseType, result, checkFunc); @@ -209,7 +179,7 @@ namespace FlaxEditor.Scripting public static void GetDerivedTypes(ScriptType baseType, List result, Func checkFunc, Func checkAssembly) { // C#/C++ types - var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + var assemblies = Utils.GetAssemblies(); for (int i = 0; i < assemblies.Length; i++) { if (checkAssembly(assemblies[i])) @@ -247,7 +217,7 @@ namespace FlaxEditor.Scripting public static void GetTypes(List result, Func checkFunc, Func checkAssembly) { // C#/C++ types - var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + var assemblies = Utils.GetAssemblies(); for (int i = 0; i < assemblies.Length; i++) { if (checkAssembly(assemblies[i])) @@ -286,7 +256,7 @@ namespace FlaxEditor.Scripting /// Additional callback used to check if the given assembly is valid. Returns true if search for types in the given assembly, otherwise false. public static void GetTypesWithAttributeDefined(Type attributeType, List result, Func checkFunc, Func checkAssembly) { - var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + var assemblies = Utils.GetAssemblies(); for (int i = 0; i < assemblies.Length; i++) { if (checkAssembly(assemblies[i])) @@ -303,7 +273,7 @@ namespace FlaxEditor.Scripting { if (string.IsNullOrEmpty(typeName)) return null; - var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + var assemblies = Utils.GetAssemblies(); for (int i = 0; i < assemblies.Length; i++) { var assembly = assemblies[i]; @@ -333,7 +303,7 @@ namespace FlaxEditor.Scripting if (type != null) return new ScriptType(type); } - var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + var assemblies = Utils.GetAssemblies(); for (int i = 0; i < assemblies.Length; i++) { var assembly = assemblies[i]; @@ -366,7 +336,7 @@ namespace FlaxEditor.Scripting } } - if (!Content.Settings.GameSettings.OptionalPlatformSettings.Contains(typeName)) + if (!FlaxEditor.Content.Settings.GameSettings.OptionalPlatformSettings.Contains(typeName)) Editor.LogWarning($"Failed to find type '{typeName}'."); return ScriptType.Null; } diff --git a/Source/Editor/States/BuildingScenesState.cs b/Source/Editor/States/BuildingScenesState.cs index 28783e8b2..f889550c8 100644 --- a/Source/Editor/States/BuildingScenesState.cs +++ b/Source/Editor/States/BuildingScenesState.cs @@ -6,7 +6,9 @@ using System.Linq; using FlaxEditor.Options; using FlaxEditor.SceneGraph.Actors; using FlaxEngine; +using FlaxEditor.Utilities; using FlaxEngine.Utilities; +using Utils = FlaxEngine.Utils; namespace FlaxEditor.States { diff --git a/Source/Editor/States/EditingSceneState.cs b/Source/Editor/States/EditingSceneState.cs index 1e5cce41f..ded9bef30 100644 --- a/Source/Editor/States/EditingSceneState.cs +++ b/Source/Editor/States/EditingSceneState.cs @@ -1,6 +1,7 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using FlaxEngine; +using FlaxEditor.Utilities; using FlaxEngine.Utilities; namespace FlaxEditor.States diff --git a/Source/Editor/States/ReloadingScriptsState.cs b/Source/Editor/States/ReloadingScriptsState.cs index d9024d5c8..4b8866202 100644 --- a/Source/Editor/States/ReloadingScriptsState.cs +++ b/Source/Editor/States/ReloadingScriptsState.cs @@ -1,6 +1,7 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using FlaxEngine; +using FlaxEditor.Utilities; using FlaxEngine.Utilities; namespace FlaxEditor.States diff --git a/Source/Editor/Surface/AnimGraphSurface.cs b/Source/Editor/Surface/AnimGraphSurface.cs index 7d9c7b381..162b82270 100644 --- a/Source/Editor/Surface/AnimGraphSurface.cs +++ b/Source/Editor/Surface/AnimGraphSurface.cs @@ -46,6 +46,19 @@ namespace FlaxEditor.Surface }, Size = new Float2(100, 0), }, + new NodeArchetype + { + TypeID = 34, + Create = (id, context, arch, groupArch) => new Animation.StateMachineAny(id, context, arch, groupArch), + Title = "Any", + Description = "The generic animation states machine state with source transitions from any other state", + Flags = NodeFlags.AnimGraph, + Size = new Float2(100, 0), + DefaultValues = new object[] + { + Utils.GetEmptyArray(), + }, + }, } } }); diff --git a/Source/Editor/Surface/Archetypes/Animation.StateMachine.cs b/Source/Editor/Surface/Archetypes/Animation.StateMachine.cs index 3859f842f..7e547c326 100644 --- a/Source/Editor/Surface/Archetypes/Animation.StateMachine.cs +++ b/Source/Editor/Surface/Archetypes/Animation.StateMachine.cs @@ -528,12 +528,12 @@ namespace FlaxEditor.Surface.Archetypes } /// - /// Customized for the state machine state node. + /// Base class for state machine state node. /// /// /// /// - internal class StateMachineState : SurfaceNode, ISurfaceContext, IConnectionInstigator + internal abstract class StateMachineStateBase : SurfaceNode, IConnectionInstigator { internal class AddRemoveTransitionAction : IUndoAction { @@ -543,6 +543,7 @@ namespace FlaxEditor.Surface.Archetypes private readonly uint _srcStateId; private readonly uint _dstStateId; private StateMachineTransition.Data _data; + private byte[] _ruleGraph; public AddRemoveTransitionAction(StateMachineTransition transition) { @@ -552,6 +553,7 @@ namespace FlaxEditor.Surface.Archetypes _dstStateId = transition.DestinationState.ID; _isAdd = false; transition.GetData(out _data); + _ruleGraph = (byte[])transition.RuleGraph.Clone(); } public AddRemoveTransitionAction(SurfaceNode src, SurfaceNode dst) @@ -595,32 +597,32 @@ namespace FlaxEditor.Surface.Archetypes { var context = _context.Get(_surface); - var src = context.FindNode(_srcStateId) as StateMachineState; + var src = context.FindNode(_srcStateId) as StateMachineStateBase; if (src == null) throw new Exception("Missing source state."); - var dst = context.FindNode(_dstStateId) as StateMachineState; + var dst = context.FindNode(_dstStateId) as StateMachineStateBase; if (dst == null) throw new Exception("Missing destination state."); - var transition = new StateMachineTransition(src, dst, ref _data); + var transition = new StateMachineTransition(src, dst, ref _data, _ruleGraph); src.Transitions.Add(transition); src.UpdateTransitionsOrder(); src.UpdateTransitions(); src.UpdateTransitionsColors(); - src.SaveData(); + src.SaveTransitions(); } private void Remove() { var context = _context.Get(_surface); - if (!(context.FindNode(_srcStateId) is StateMachineState src)) + if (!(context.FindNode(_srcStateId) is StateMachineStateBase src)) throw new Exception("Missing source state."); - if (!(context.FindNode(_dstStateId) is StateMachineState dst)) + if (!(context.FindNode(_dstStateId) is StateMachineStateBase dst)) throw new Exception("Missing destination state."); var transition = src.Transitions.Find(x => x.DestinationState == dst); @@ -634,21 +636,23 @@ namespace FlaxEditor.Surface.Archetypes src.UpdateTransitions(); src.UpdateTransitionsColors(); - src.SaveData(); + src.SaveTransitions(); } /// public void Dispose() { _surface = null; + _context = new ContextHandle(); + _ruleGraph = null; } } private bool _isSavingData; private bool _isMouseDown; - private Rectangle _textRect; - private Rectangle _dragAreaRect; - private Rectangle _renameButtonRect; + protected Rectangle _textRect; + protected Rectangle _dragAreaRect; + protected Rectangle _renameButtonRect; private bool _cursorChanged = false; private bool _textRectHovered = false; @@ -657,40 +661,20 @@ namespace FlaxEditor.Surface.Archetypes /// public readonly List Transitions = new List(); - /// - /// Gets or sets the node title text. - /// - public string StateTitle - { - get => (string)Values[0]; - set - { - if (!string.Equals(value, (string)Values[0], StringComparison.Ordinal)) - { - SetValue(0, value); - } - } - } - - /// - /// Gets or sets the state data (transitions list with rules graph and other options). - /// - public byte[] StateData - { - get => (byte[])Values[2]; - set => Values[2] = value; - } - /// /// The transitions rectangle (in surface-space). /// - public Rectangle TransitionsRectangle; + public Rectangle TransitionsRectangle = Rectangle.Empty; + + /// + /// State transitions data value index (from node values). + /// + public abstract int TransitionsDataIndex { get; } /// - public StateMachineState(uint id, VisjectSurfaceContext context, NodeArchetype nodeArch, GroupArchetype groupArch) + protected StateMachineStateBase(uint id, VisjectSurfaceContext context, NodeArchetype nodeArch, GroupArchetype groupArch) : base(id, context, nodeArch, groupArch) { - TransitionsRectangle = Rectangle.Empty; } /// @@ -744,20 +728,7 @@ namespace FlaxEditor.Surface.Archetypes base.OnValuesChanged(); if (!_isSavingData) - LoadData(); - UpdateTitle(); - } - - private void UpdateTitle() - { - Title = StateTitle; - var style = Style.Current; - var titleSize = style.FontLarge.MeasureText(Title); - var width = Mathf.Max(100, titleSize.X + 50); - Resize(width, 0); - titleSize.X += 8.0f; - var padding = new Float2(8, 8); - _dragAreaRect = new Rectangle(padding, Size - padding * 2); + LoadTransitions(); } /// @@ -765,11 +736,9 @@ namespace FlaxEditor.Surface.Archetypes { base.UpdateRectangles(); - const float buttonMargin = FlaxEditor.Surface.Constants.NodeCloseButtonMargin; - const float buttonSize = FlaxEditor.Surface.Constants.NodeCloseButtonSize; - _renameButtonRect = new Rectangle(_closeButtonRect.Left - buttonSize - buttonMargin, buttonMargin, buttonSize, buttonSize); _textRect = new Rectangle(Float2.Zero, Size); - _dragAreaRect = _headerRect; + var padding = new Float2(8, 8); + _dragAreaRect = new Rectangle(padding, _textRect.Size - padding * 2); } /// @@ -777,8 +746,7 @@ namespace FlaxEditor.Surface.Archetypes { base.OnSurfaceLoaded(); - UpdateTitle(); - LoadData(); + LoadTransitions(); // Register for surface mouse events to handle transition arrows interactions Surface.CustomMouseUp += OnSurfaceMouseUp; @@ -857,34 +825,14 @@ namespace FlaxEditor.Surface.Archetypes } } - /// - public override void OnSpawned() - { - base.OnSpawned(); - - // Ensure to have unique name - var title = StateTitle; - var value = title; - int count = 1; - while (!OnRenameValidate(null, value)) - { - value = title + " " + count++; - } - Values[0] = value; - Title = value; - - // Let user pick a name - StartRenaming(); - } - /// /// Loads the state data from the node value (reads transitions and related information). /// - public void LoadData() + public void LoadTransitions() { - ClearData(); + ClearTransitions(); - var bytes = StateData; + var bytes = (byte[])Values[TransitionsDataIndex]; if (bytes == null || bytes.Length == 0) { // Empty state @@ -923,7 +871,7 @@ namespace FlaxEditor.Surface.Archetypes if (ruleSize != 0) rule = reader.ReadBytes(ruleSize); - var destination = Context.FindNode(data.Destination) as StateMachineState; + var destination = Context.FindNode(data.Destination) as StateMachineStateBase; if (destination == null) { Editor.LogWarning("Missing state machine state destination node."); @@ -944,10 +892,10 @@ namespace FlaxEditor.Surface.Archetypes } /// - /// Saves the state data to the node value (writes transitions and related information). + /// Saves the state transitions data to the node value. /// /// True if save data via node parameter editing via undo or without undo action. - public void SaveData(bool withUndo = false) + public void SaveTransitions(bool withUndo = false) { try { @@ -998,9 +946,9 @@ namespace FlaxEditor.Surface.Archetypes } if (withUndo) - SetValue(2, value); + SetValue(TransitionsDataIndex, value); else - Values[2] = value; + Values[TransitionsDataIndex] = value; } finally { @@ -1009,29 +957,21 @@ namespace FlaxEditor.Surface.Archetypes } /// - /// Clears the state data (removes transitions and related information). + /// Clears the state transitions. /// - public void ClearData() + public void ClearTransitions() { Transitions.Clear(); TransitionsRectangle = Rectangle.Empty; } - /// - /// Opens the state editing UI. - /// - public void Edit() - { - Surface.OpenContext(this); - } - private bool IsSoloAndEnabled(StateMachineTransition t) { return t.Solo && t.Enabled; } /// - /// Updates the transitions order in the list vy using the property. + /// Updates the transitions order in the list by using the property. /// public void UpdateTransitionsOrder() { @@ -1138,32 +1078,6 @@ namespace FlaxEditor.Surface.Archetypes } } - /// - /// Starts the state renaming by showing a rename popup to the user. - /// - public void StartRenaming() - { - Surface.Select(this); - var dialog = RenamePopup.Show(this, _textRect, Title, false); - dialog.Validate += OnRenameValidate; - dialog.Renamed += OnRenamed; - } - - private bool OnRenameValidate(RenamePopup popup, string value) - { - return Context.Nodes.All(node => - { - if (node != this && node is StateMachineState state) - return state.StateTitle != value; - return true; - }); - } - - private void OnRenamed(RenamePopup renamePopup) - { - StateTitle = renamePopup.Text; - } - private void StartCreatingTransition() { Surface.ConnectingStart(this); @@ -1216,9 +1130,6 @@ namespace FlaxEditor.Surface.Archetypes // Close button Render2D.DrawSprite(style.Cross, _closeButtonRect, _closeButtonRect.Contains(_mousePosition) ? style.Foreground : style.ForegroundGrey); - - // Rename button - Render2D.DrawSprite(style.Settings, _renameButtonRect, _renameButtonRect.Contains(_mousePosition) ? style.Foreground : style.ForegroundGrey); } /// @@ -1236,8 +1147,7 @@ namespace FlaxEditor.Surface.Archetypes if (_renameButtonRect.Contains(ref location) || _closeButtonRect.Contains(ref location)) return true; - Edit(); - return true; + return false; } /// @@ -1269,17 +1179,7 @@ namespace FlaxEditor.Surface.Archetypes Surface.ConnectingEnd(this); } - if (base.OnMouseUp(location, button)) - return true; - - // Rename - if (_renameButtonRect.Contains(ref location)) - { - StartRenaming(); - return true; - } - - return false; + return base.OnMouseUp(location, button); } /// @@ -1305,7 +1205,7 @@ namespace FlaxEditor.Surface.Archetypes { _textRectHovered = false; } - + base.OnMouseMove(location); } @@ -1341,7 +1241,7 @@ namespace FlaxEditor.Surface.Archetypes { Transitions.Clear(); UpdateTransitions(); - SaveData(true); + SaveTransitions(true); } for (int i = 0; i < Surface.Nodes.Count; i++) @@ -1351,7 +1251,7 @@ namespace FlaxEditor.Surface.Archetypes // Break link entry.FirstState = null; } - else if (Surface.Nodes[i] is StateMachineState state) + else if (Surface.Nodes[i] is StateMachineStateBase state) { bool modified = false; for (int j = 0; j < state.Transitions.Count && state.Transitions.Count > 0; j++) @@ -1366,7 +1266,7 @@ namespace FlaxEditor.Surface.Archetypes if (modified) { state.UpdateTransitions(); - state.SaveData(true); + state.SaveTransitions(true); } } } @@ -1375,56 +1275,11 @@ namespace FlaxEditor.Surface.Archetypes /// public override void OnDestroy() { - Surface.RemoveContext(this); - - ClearData(); + ClearTransitions(); base.OnDestroy(); } - /// - public Asset SurfaceAsset => null; - - /// - public string SurfaceName => StateTitle; - - /// - public byte[] SurfaceData - { - get => (byte[])Values[1]; - set => Values[1] = value; - } - - /// - public VisjectSurfaceContext ParentContext => Context; - - /// - public void OnContextCreated(VisjectSurfaceContext context) - { - context.Loaded += OnSurfaceLoaded; - } - - private void OnSurfaceLoaded(VisjectSurfaceContext context) - { - // Ensure that loaded surface has output node for state - if (context.FindNode(9, 21) == null) - { - var wasEnabled = true; - if (Surface.Undo != null) - { - wasEnabled = Surface.Undo.Enabled; - Surface.Undo.Enabled = false; - } - - context.SpawnNode(9, 21, new Float2(100.0f)); - - if (Surface.Undo != null) - { - Surface.Undo.Enabled = wasEnabled; - } - } - } - /// public override void DrawConnections(ref Float2 mousePosition) { @@ -1448,7 +1303,7 @@ namespace FlaxEditor.Surface.Archetypes /// public bool AreConnected(IConnectionInstigator other) { - if (other is StateMachineState otherState) + if (other is StateMachineStateBase otherState) return Transitions.Any(x => x.DestinationState == otherState); return false; } @@ -1473,8 +1328,7 @@ namespace FlaxEditor.Surface.Archetypes /// public void Connect(IConnectionInstigator other) { - var state = (StateMachineState)other; - + var state = (StateMachineStateBase)other; var action = new AddRemoveTransitionAction(this, state); Surface?.AddBatchedUndoAction(action); action.Do(); @@ -1482,15 +1336,263 @@ namespace FlaxEditor.Surface.Archetypes } } + /// + /// Customized for the state machine state node. + /// + internal class StateMachineState : StateMachineStateBase, ISurfaceContext + { + /// + public StateMachineState(uint id, VisjectSurfaceContext context, NodeArchetype nodeArch, GroupArchetype groupArch) + : base(id, context, nodeArch, groupArch) + { + } + + /// + /// Gets or sets the node title text. + /// + public string StateTitle + { + get => (string)Values[0]; + set + { + if (!string.Equals(value, (string)Values[0], StringComparison.Ordinal)) + { + SetValue(0, value); + } + } + } + + /// + /// Opens the state editing UI. + /// + public void Edit() + { + Surface.OpenContext(this); + } + + /// + /// Starts the state renaming by showing a rename popup to the user. + /// + public void StartRenaming() + { + Surface.Select(this); + var dialog = RenamePopup.Show(this, _textRect, Title, false); + dialog.Validate += OnRenameValidate; + dialog.Renamed += OnRenamed; + } + + private bool OnRenameValidate(RenamePopup popup, string value) + { + return Context.Nodes.All(node => + { + if (node != this && node is StateMachineState state) + return state.StateTitle != value; + return true; + }); + } + + private void OnRenamed(RenamePopup renamePopup) + { + StateTitle = renamePopup.Text; + } + + private void UpdateTitle() + { + Title = StateTitle; + var style = Style.Current; + var titleSize = style.FontLarge.MeasureText(Title); + var width = Mathf.Max(100, titleSize.X + 50); + Resize(width, 0); + titleSize.X += 8.0f; + var padding = new Float2(8, 8); + _dragAreaRect = new Rectangle(padding, Size - padding * 2); + } + + private void OnSurfaceLoaded(VisjectSurfaceContext context) + { + // Ensure that loaded surface has output node for state + if (context.FindNode(9, 21) == null) + { + var wasEnabled = true; + if (Surface.Undo != null) + { + wasEnabled = Surface.Undo.Enabled; + Surface.Undo.Enabled = false; + } + + context.SpawnNode(9, 21, new Float2(100.0f)); + + if (Surface.Undo != null) + { + Surface.Undo.Enabled = wasEnabled; + } + } + } + + /// + public override int TransitionsDataIndex => 2; + + /// + public override void OnSpawned() + { + base.OnSpawned(); + + // Ensure to have unique name + var title = StateTitle; + var value = title; + int count = 1; + while (!OnRenameValidate(null, value)) + { + value = title + " " + count++; + } + Values[0] = value; + Title = value; + + // Let user pick a name + StartRenaming(); + } + + /// + public override void OnSurfaceLoaded() + { + base.OnSurfaceLoaded(); + + UpdateTitle(); + } + + /// + public override void OnValuesChanged() + { + base.OnValuesChanged(); + + UpdateTitle(); + } + + /// + public override void Draw() + { + base.Draw(); + + var style = Style.Current; + + // Rename button + Render2D.DrawSprite(style.Settings, _renameButtonRect, _renameButtonRect.Contains(_mousePosition) ? style.Foreground : style.ForegroundGrey); + } + + /// + public override bool OnMouseUp(Float2 location, MouseButton button) + { + if (base.OnMouseUp(location, button)) + return true; + + // Rename + if (_renameButtonRect.Contains(ref location)) + { + StartRenaming(); + return true; + } + + return false; + } + + /// + public override bool OnMouseDoubleClick(Float2 location, MouseButton button) + { + if (base.OnMouseDoubleClick(location, button)) + return true; + + Edit(); + return true; + } + + /// + public override void OnDestroy() + { + Surface.RemoveContext(this); + + base.OnDestroy(); + } + + /// + protected override void UpdateRectangles() + { + base.UpdateRectangles(); + + const float buttonMargin = FlaxEditor.Surface.Constants.NodeCloseButtonMargin; + const float buttonSize = FlaxEditor.Surface.Constants.NodeCloseButtonSize; + _renameButtonRect = new Rectangle(_closeButtonRect.Left - buttonSize - buttonMargin, buttonMargin, buttonSize, buttonSize); + } + + /// + public Asset SurfaceAsset => null; + + /// + public string SurfaceName => StateTitle; + + /// + public byte[] SurfaceData + { + get => (byte[])Values[1]; + set => Values[1] = value; + } + + /// + public VisjectSurfaceContext ParentContext => Context; + + /// + public void OnContextCreated(VisjectSurfaceContext context) + { + context.Loaded += OnSurfaceLoaded; + } + } + + /// + /// Customized for the state machine Any state node. + /// + internal class StateMachineAny : StateMachineStateBase + { + /// + public StateMachineAny(uint id, VisjectSurfaceContext context, NodeArchetype nodeArch, GroupArchetype groupArch) + : base(id, context, nodeArch, groupArch) + { + } + + /// + public override int TransitionsDataIndex => 0; + } + /// /// State machine transition data container object. /// - /// + /// /// internal class StateMachineTransition : ISurfaceContext { + /// + /// State transition interruption flags. + /// + [Flags] + public enum InterruptionFlags + { + /// + /// Nothing. + /// + None = 0, + + /// + /// Transition rule will be rechecked during active transition with option to interrupt transition. + /// + RuleRechecking = 1, + + /// + /// Interrupted transition is immediately stopped without blending out. + /// + Instant = 2, + } + /// /// The packed data container for the transition data storage. Helps with serialization and versioning the data. + /// Must match AnimGraphBase::LoadStateTransition in C++ /// /// /// It does not store GC objects references to make it more lightweight. Transition rule bytes data is stores in a separate way. @@ -1498,31 +1600,16 @@ namespace FlaxEditor.Surface.Archetypes [StructLayout(LayoutKind.Sequential, Pack = 1, Size = 32)] internal struct Data { - /// - /// The transition flag types. - /// + // Must match AnimGraphStateTransition::FlagTypes [Flags] public enum FlagTypes { - /// - /// The none. - /// None = 0, - - /// - /// The enabled flag. - /// Enabled = 1, - - /// - /// The solo flag. - /// Solo = 2, - - /// - /// The use default rule flag. - /// UseDefaultRule = 4, + InterruptionRuleRechecking = 8, + InterruptionInstant = 16, } /// @@ -1565,21 +1652,11 @@ namespace FlaxEditor.Surface.Archetypes /// public int Unused2; - /// - /// Determines whether the data has a given flag set. - /// - /// The flag. - /// true if the specified flag is set; otherwise, false. public bool HasFlag(FlagTypes flag) { return (Flags & flag) == flag; } - /// - /// Sets the flag to the given value. - /// - /// The flag. - /// If set to true the flag will be set, otherwise it will be cleared. public void SetFlag(FlagTypes flag, bool value) { if (value) @@ -1596,18 +1673,18 @@ namespace FlaxEditor.Surface.Archetypes /// The transition start state. /// [HideInEditor] - public readonly StateMachineState SourceState; + public readonly StateMachineStateBase SourceState; /// /// The transition end state. /// [HideInEditor] - public readonly StateMachineState DestinationState; + public readonly StateMachineStateBase DestinationState; /// /// If checked, the transition can be triggered, otherwise it will be ignored. /// - [EditorOrder(10), DefaultValue(true), Tooltip("If checked, the transition can be triggered, otherwise it will be ignored.")] + [EditorOrder(10), DefaultValue(true)] public bool Enabled { get => _data.HasFlag(Data.FlagTypes.Enabled); @@ -1615,14 +1692,14 @@ namespace FlaxEditor.Surface.Archetypes { _data.SetFlag(Data.FlagTypes.Enabled, value); SourceState.UpdateTransitionsColors(); - SourceState.SaveData(true); + SourceState.SaveTransitions(true); } } /// /// If checked, animation graph will ignore other transitions from the source state and use only this transition. /// - [EditorOrder(20), DefaultValue(false), Tooltip("If checked, animation graph will ignore other transitions from the source state and use only this transition.")] + [EditorOrder(20), DefaultValue(false)] public bool Solo { get => _data.HasFlag(Data.FlagTypes.Solo); @@ -1630,28 +1707,28 @@ namespace FlaxEditor.Surface.Archetypes { _data.SetFlag(Data.FlagTypes.Solo, value); SourceState.UpdateTransitionsColors(); - SourceState.SaveData(true); + SourceState.SaveTransitions(true); } } /// /// If checked, animation graph will perform automatic transition based on the state animation pose (single shot animation play). /// - [EditorOrder(30), DefaultValue(false), Tooltip("If checked, animation graph will perform automatic transition based on the state animation pose (single shot animation play).")] + [EditorOrder(30), DefaultValue(false)] public bool UseDefaultRule { get => _data.HasFlag(Data.FlagTypes.UseDefaultRule); set { _data.SetFlag(Data.FlagTypes.UseDefaultRule, value); - SourceState.SaveData(true); + SourceState.SaveTransitions(true); } } /// - /// The transition order (higher first). + /// The transition order. Transitions with the higher order are handled before the ones with the lower order. /// - [EditorOrder(40), DefaultValue(0), Tooltip("The transition order. Transitions with the higher order are handled before the ones with the lower order.")] + [EditorOrder(40), DefaultValue(0)] public int Order { get => _data.Order; @@ -1660,35 +1737,58 @@ namespace FlaxEditor.Surface.Archetypes _data.Order = value; SourceState.UpdateTransitionsOrder(); SourceState.UpdateTransitionsColors(); - SourceState.SaveData(true); + SourceState.SaveTransitions(true); } } /// /// The blend duration (in seconds). /// - [EditorOrder(50), DefaultValue(0.1f), Limit(0, 20.0f, 0.1f), Tooltip("Transition blend duration (in seconds).")] + [EditorOrder(50), DefaultValue(0.1f), Limit(0, 20.0f, 0.1f)] public float BlendDuration { get => _data.BlendDuration; set { _data.BlendDuration = value; - SourceState.SaveData(true); + SourceState.SaveTransitions(true); } } /// - /// The blend mode. + /// Transition blending mode for blend alpha. /// - [EditorOrder(60), DefaultValue(AlphaBlendMode.HermiteCubic), Tooltip("Transition blending mode for blend alpha.")] + [EditorOrder(60), DefaultValue(AlphaBlendMode.HermiteCubic)] public AlphaBlendMode BlendMode { get => _data.BlendMode; set { _data.BlendMode = value; - SourceState.SaveData(true); + SourceState.SaveTransitions(true); + } + } + + /// + /// Transition interruption options. + /// + [EditorOrder(70), DefaultValue(InterruptionFlags.None)] + public InterruptionFlags Interruption + { + get + { + var flags = InterruptionFlags.None; + if (_data.HasFlag(Data.FlagTypes.InterruptionRuleRechecking)) + flags |= InterruptionFlags.RuleRechecking; + if (_data.HasFlag(Data.FlagTypes.InterruptionInstant)) + flags |= InterruptionFlags.Instant; + return flags; + } + set + { + _data.SetFlag(Data.FlagTypes.InterruptionRuleRechecking, value.HasFlag(InterruptionFlags.RuleRechecking)); + _data.SetFlag(Data.FlagTypes.InterruptionInstant, value.HasFlag(InterruptionFlags.Instant)); + SourceState.SaveTransitions(true); } } @@ -1702,7 +1802,7 @@ namespace FlaxEditor.Surface.Archetypes set { _ruleGraph = value ?? Utils.GetEmptyArray(); - SourceState.SaveData(); + SourceState.SaveTransitions(); } } @@ -1737,7 +1837,7 @@ namespace FlaxEditor.Surface.Archetypes /// The destination. /// The transition data container. /// The transition rule graph. Can be null. - public StateMachineTransition(StateMachineState source, StateMachineState destination, ref Data data, byte[] ruleGraph = null) + public StateMachineTransition(StateMachineStateBase source, StateMachineStateBase destination, ref Data data, byte[] ruleGraph = null) { SourceState = source; DestinationState = destination; @@ -1759,7 +1859,7 @@ namespace FlaxEditor.Surface.Archetypes public Asset SurfaceAsset => null; /// - public string SurfaceName => string.Format("{0} to {1}", SourceState.StateTitle, DestinationState.StateTitle); + public string SurfaceName => string.Format("{0} to {1}", SourceState.Title, DestinationState.Title); /// [HideInEditor] @@ -1807,7 +1907,7 @@ namespace FlaxEditor.Surface.Archetypes /// public void Delete() { - var action = new StateMachineState.AddRemoveTransitionAction(this); + var action = new StateMachineStateBase.AddRemoveTransitionAction(this); SourceState.Surface?.AddBatchedUndoAction(action); action.Do(); } diff --git a/Source/Editor/Surface/Archetypes/Animation.cs b/Source/Editor/Surface/Archetypes/Animation.cs index a83e60deb..6364106e4 100644 --- a/Source/Editor/Surface/Archetypes/Animation.cs +++ b/Source/Editor/Surface/Archetypes/Animation.cs @@ -986,6 +986,19 @@ namespace FlaxEditor.Surface.Archetypes NodeElementArchetype.Factory.Input(0, "Init", true, typeof(Float4), 1), } }, + new NodeArchetype + { + TypeID = 34, + Create = (id, context, arch, groupArch) => new StateMachineAny(id, context, arch, groupArch), + Title = "Any", + Description = "The generic animation states machine state with source transitions from any other state", + Flags = NodeFlags.AnimGraph | NodeFlags.NoSpawnViaGUI | NodeFlags.NoSpawnViaPaste, + Size = new Float2(100, 0), + DefaultValues = new object[] + { + Utils.GetEmptyArray(), + }, + }, }; } } diff --git a/Source/Editor/Surface/Archetypes/Constants.cs b/Source/Editor/Surface/Archetypes/Constants.cs index 122093cbb..72a77ea4d 100644 --- a/Source/Editor/Surface/Archetypes/Constants.cs +++ b/Source/Editor/Surface/Archetypes/Constants.cs @@ -14,6 +14,7 @@ using FlaxEditor.Scripting; using FlaxEditor.Surface.Elements; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; namespace FlaxEditor.Surface.Archetypes { diff --git a/Source/Editor/Surface/Archetypes/Function.cs b/Source/Editor/Surface/Archetypes/Function.cs index d68a1378f..cffb2ad6f 100644 --- a/Source/Editor/Surface/Archetypes/Function.cs +++ b/Source/Editor/Surface/Archetypes/Function.cs @@ -12,6 +12,7 @@ using FlaxEditor.GUI.ContextMenu; using FlaxEditor.Scripting; using FlaxEditor.Surface.Elements; using FlaxEditor.Windows.Assets; +using FlaxEngine.Utilities; using FlaxEngine; using FlaxEngine.GUI; @@ -587,7 +588,7 @@ namespace FlaxEditor.Surface.Archetypes for (int i = 0; i < _parameters.Length; i++) { writer.Write(_parameters[i].Name); // Parameter name - Utilities.VariantUtils.WriteVariantType(writer, TypeUtils.GetType(_parameters[i].Type)); // Box type + VariantUtils.WriteVariantType(writer, TypeUtils.GetType(_parameters[i].Type)); // Box type } SetValue(2, stream.ToArray()); } @@ -605,7 +606,7 @@ namespace FlaxEditor.Surface.Archetypes for (int i = 0; i < parametersCount; i++) { var parameterName = reader.ReadString(); // Parameter name - var boxType = Utilities.VariantUtils.ReadVariantType(reader); // Box type + var boxType = VariantUtils.ReadVariantType(reader); // Box type MakeBox(i + 1, parameterName, boxType); } } @@ -788,14 +789,14 @@ namespace FlaxEditor.Surface.Archetypes { reader.ReadByte(); // Version signature.IsStatic = reader.ReadBoolean(); // Is Static - signature.ReturnType = Utilities.VariantUtils.ReadVariantScriptType(reader); // Return type + signature.ReturnType = VariantUtils.ReadVariantScriptType(reader); // Return type var parametersCount = reader.ReadInt32(); // Parameters count signature.Params = parametersCount != 0 ? new SignatureParamInfo[parametersCount] : Utils.GetEmptyArray(); for (int i = 0; i < parametersCount; i++) { ref var param = ref signature.Params[i]; param.Name = Utilities.Utils.ReadStr(reader, 11); // Parameter name - param.Type = Utilities.VariantUtils.ReadVariantScriptType(reader); // Parameter type + param.Type = VariantUtils.ReadVariantScriptType(reader); // Parameter type param.IsOut = reader.ReadByte() != 0; // Is parameter out } } @@ -809,14 +810,14 @@ namespace FlaxEditor.Surface.Archetypes { reader.ReadByte(); // Version signature.IsStatic = reader.ReadBoolean(); // Is Static - signature.ReturnType = Utilities.VariantUtils.ReadVariantScriptType(reader); // Return type + signature.ReturnType = VariantUtils.ReadVariantScriptType(reader); // Return type var parametersCount = reader.ReadInt32(); // Parameters count signature.Params = parametersCount != 0 ? new SignatureParamInfo[parametersCount] : Utils.GetEmptyArray(); for (int i = 0; i < parametersCount; i++) { ref var param = ref signature.Params[i]; param.Name = reader.ReadString(); // Parameter name - param.Type = Utilities.VariantUtils.ReadVariantScriptType(reader); // Parameter type + param.Type = VariantUtils.ReadVariantScriptType(reader); // Parameter type param.IsOut = reader.ReadByte() != 0; // Is parameter out } } @@ -833,13 +834,13 @@ namespace FlaxEditor.Surface.Archetypes { writer.Write((byte)4); // Version writer.Write(methodInfo.IsStatic); // Is Static - Utilities.VariantUtils.WriteVariantType(writer, methodInfo.ValueType); // Return type + VariantUtils.WriteVariantType(writer, methodInfo.ValueType); // Return type writer.Write(parameters.Length); // Parameters count for (int i = 0; i < parameters.Length; i++) { ref var param = ref parameters[i]; Utilities.Utils.WriteStr(writer, param.Name, 11); // Parameter name - Utilities.VariantUtils.WriteVariantType(writer, param.Type); // Parameter type + VariantUtils.WriteVariantType(writer, param.Type); // Parameter type writer.Write((byte)(param.IsOut ? 1 : 0)); // Is parameter out } return stream.ToArray(); @@ -1461,14 +1462,14 @@ namespace FlaxEditor.Surface.Archetypes if (_signature.IsVirtual) flags |= Flags.Virtual; writer.Write((byte)flags); // Flags - Utilities.VariantUtils.WriteVariantType(writer, _signature.ReturnType); // Return Type + VariantUtils.WriteVariantType(writer, _signature.ReturnType); // Return Type var parametersCount = _signature.Parameters?.Length ?? 0; writer.Write(parametersCount); // Parameters count for (int i = 0; i < parametersCount; i++) { ref var param = ref _signature.Parameters[i]; Utilities.Utils.WriteStrAnsi(writer, param.Name, 13); // Parameter name - Utilities.VariantUtils.WriteVariantType(writer, param.Type); // Parameter type + VariantUtils.WriteVariantType(writer, param.Type); // Parameter type writer.Write((byte)0); // Is parameter out writer.Write((byte)0); // Has default value } @@ -1497,13 +1498,13 @@ namespace FlaxEditor.Surface.Archetypes var flags = (Flags)reader.ReadByte(); // Flags _signature.IsStatic = (flags & Flags.Static) == Flags.Static; _signature.IsVirtual = (flags & Flags.Virtual) == Flags.Virtual; - _signature.ReturnType = Utilities.VariantUtils.ReadVariantScriptType(reader); // Return Type + _signature.ReturnType = VariantUtils.ReadVariantScriptType(reader); // Return Type var parametersCount = reader.ReadInt32(); // Parameters count _signature.Parameters = new Parameter[parametersCount]; for (int i = 0; i < parametersCount; i++) { var paramName = Utilities.Utils.ReadStrAnsi(reader, 13); // Parameter name - var paramType = Utilities.VariantUtils.ReadVariantScriptType(reader); // Parameter type + var paramType = VariantUtils.ReadVariantScriptType(reader); // Parameter type var isOut = reader.ReadByte() != 0; // Is parameter out var hasDefaultValue = reader.ReadByte() != 0; // Has default value _signature.Parameters[i] = new Parameter diff --git a/Source/Editor/Surface/Archetypes/Packing.cs b/Source/Editor/Surface/Archetypes/Packing.cs index 54b578133..5a5e9cd5b 100644 --- a/Source/Editor/Surface/Archetypes/Packing.cs +++ b/Source/Editor/Surface/Archetypes/Packing.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Reflection; using FlaxEditor.Scripting; using FlaxEditor.Surface.Elements; +using FlaxEngine.Utilities; using FlaxEngine; namespace FlaxEditor.Surface.Archetypes @@ -167,7 +168,7 @@ namespace FlaxEditor.Surface.Archetypes for (int i = 0; i < fieldsLength; i++) { Utilities.Utils.WriteStr(writer, fields[i].Name, 11); // Field type - Utilities.VariantUtils.WriteVariantType(writer, fields[i].ValueType); // Field type + VariantUtils.WriteVariantType(writer, fields[i].ValueType); // Field type } Values[1] = stream.ToArray(); } @@ -184,7 +185,7 @@ namespace FlaxEditor.Surface.Archetypes for (int i = 0; i < fieldsLength; i++) { var fieldName = Utilities.Utils.ReadStr(reader, 11); // Field name - var fieldType = Utilities.VariantUtils.ReadVariantType(reader); // Field type + var fieldType = VariantUtils.ReadVariantType(reader); // Field type MakeBox(i + 1, fieldName, new ScriptType(fieldType)); } } diff --git a/Source/Editor/Surface/Archetypes/Parameters.cs b/Source/Editor/Surface/Archetypes/Parameters.cs index 179ff8d84..c7f343cfb 100644 --- a/Source/Editor/Surface/Archetypes/Parameters.cs +++ b/Source/Editor/Surface/Archetypes/Parameters.cs @@ -12,6 +12,7 @@ using FlaxEditor.GUI; using FlaxEditor.Scripting; using FlaxEditor.Surface.Elements; using FlaxEngine; +using FlaxEngine.Utilities; namespace FlaxEditor.Surface.Archetypes { diff --git a/Source/Editor/Surface/Archetypes/Tools.cs b/Source/Editor/Surface/Archetypes/Tools.cs index 082cbc88f..9f6db7ea4 100644 --- a/Source/Editor/Surface/Archetypes/Tools.cs +++ b/Source/Editor/Surface/Archetypes/Tools.cs @@ -10,6 +10,7 @@ using FlaxEditor.Scripting; using FlaxEditor.Surface.Elements; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; namespace FlaxEditor.Surface.Archetypes { @@ -1523,9 +1524,9 @@ namespace FlaxEditor.Surface.Archetypes Title = "Platform Switch", Description = "Gets the input value based on the runtime-platform type", Flags = NodeFlags.AllGraphs, - Size = new Float2(220, 220), + Size = new Float2(220, 240), ConnectionsHints = ConnectionsHint.Value, - IndependentBoxes = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }, + IndependentBoxes = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }, DependentBoxes = new[] { 0 }, Elements = new[] { @@ -1541,6 +1542,7 @@ namespace FlaxEditor.Surface.Archetypes NodeElementArchetype.Factory.Input(8, "Switch", true, null, 9), NodeElementArchetype.Factory.Input(9, "PlayStation 5", true, null, 10), NodeElementArchetype.Factory.Input(10, "Mac", true, null, 11), + NodeElementArchetype.Factory.Input(11, "iOS", true, null, 12), } }, new NodeArchetype diff --git a/Source/Editor/Surface/AttributesEditor.cs b/Source/Editor/Surface/AttributesEditor.cs index 830c7b6be..81b11bb68 100644 --- a/Source/Editor/Surface/AttributesEditor.cs +++ b/Source/Editor/Surface/AttributesEditor.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; +using System.Runtime.Loader; using System.Runtime.Serialization.Formatters.Binary; using FlaxEditor.CustomEditors; using FlaxEditor.CustomEditors.Editors; @@ -118,8 +119,13 @@ namespace FlaxEditor.Surface using (var stream = new MemoryStream()) { + // Ensure we are in the correct load context (https://github.com/dotnet/runtime/issues/42041) + using var ctx = AssemblyLoadContext.EnterContextualReflection(typeof(Editor).Assembly); + var formatter = new BinaryFormatter(); +#pragma warning disable SYSLIB0011 formatter.Serialize(stream, attributes); +#pragma warning restore SYSLIB0011 _oldData = stream.ToArray(); } editor.Select(new Proxy @@ -141,8 +147,13 @@ namespace FlaxEditor.Surface } using (var stream = new MemoryStream()) { + // Ensure we are in the correct load context (https://github.com/dotnet/runtime/issues/42041) + using var ctx = AssemblyLoadContext.EnterContextualReflection(typeof(Editor).Assembly); + var formatter = new BinaryFormatter(); +#pragma warning disable SYSLIB0011 formatter.Serialize(stream, newValue); +#pragma warning restore SYSLIB0011 var newData = stream.ToArray(); if (!_oldData.SequenceEqual(newData)) { diff --git a/Source/Editor/Surface/ContextMenu/VisjectCM.cs b/Source/Editor/Surface/ContextMenu/VisjectCM.cs index 102fe88e2..3f74e4c07 100644 --- a/Source/Editor/Surface/ContextMenu/VisjectCM.cs +++ b/Source/Editor/Surface/ContextMenu/VisjectCM.cs @@ -8,6 +8,7 @@ using FlaxEditor.GUI.Input; using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; namespace FlaxEditor.Surface.ContextMenu { @@ -135,7 +136,6 @@ namespace FlaxEditor.Surface.ContextMenu Width = Width - 4, X = 2, Y = 1, - BackgroundColor = Style.Current.BackgroundNormal, }; // Title bar diff --git a/Source/Editor/Surface/Elements/ActorSelect.cs b/Source/Editor/Surface/Elements/ActorSelect.cs index 6da454ccf..3be493db7 100644 --- a/Source/Editor/Surface/Elements/ActorSelect.cs +++ b/Source/Editor/Surface/Elements/ActorSelect.cs @@ -3,6 +3,7 @@ using System; using FlaxEditor.CustomEditors.Editors; using FlaxEngine; +using FlaxEngine.Utilities; namespace FlaxEditor.Surface.Elements { @@ -30,7 +31,7 @@ namespace FlaxEditor.Surface.Elements ParentNode = parentNode; Archetype = archetype; Bounds = new Rectangle(Archetype.ActualPosition, archetype.Size); - Type = Scripting.TypeUtils.GetType(archetype.Text); + Type = TypeUtils.GetType(archetype.Text); ParentNode.ValuesChanged += OnNodeValuesChanged; OnNodeValuesChanged(); diff --git a/Source/Editor/Surface/Elements/AssetSelect.cs b/Source/Editor/Surface/Elements/AssetSelect.cs index 933451259..e38989e08 100644 --- a/Source/Editor/Surface/Elements/AssetSelect.cs +++ b/Source/Editor/Surface/Elements/AssetSelect.cs @@ -3,6 +3,7 @@ using System; using FlaxEditor.GUI; using FlaxEngine; +using FlaxEngine.Utilities; namespace FlaxEditor.Surface.Elements { @@ -26,7 +27,7 @@ namespace FlaxEditor.Surface.Elements /// The parent node. /// The archetype. public AssetSelect(SurfaceNode parentNode, NodeElementArchetype archetype) - : base(Scripting.TypeUtils.GetType(archetype.Text), archetype.ActualPosition) + : base(TypeUtils.GetType(archetype.Text), archetype.ActualPosition) { ParentNode = parentNode; Archetype = archetype; diff --git a/Source/Editor/Surface/Elements/EnumValue.cs b/Source/Editor/Surface/Elements/EnumValue.cs index 09591e55a..065646a53 100644 --- a/Source/Editor/Surface/Elements/EnumValue.cs +++ b/Source/Editor/Surface/Elements/EnumValue.cs @@ -2,6 +2,7 @@ using System; using FlaxEditor.GUI; +using FlaxEngine.Utilities; namespace FlaxEditor.Surface.Elements { @@ -26,7 +27,7 @@ namespace FlaxEditor.Surface.Elements /// public EnumValue(SurfaceNode parentNode, NodeElementArchetype archetype) - : base(Scripting.TypeUtils.GetType(archetype.Text).Type) + : base(TypeUtils.GetType(archetype.Text).Type) { X = archetype.ActualPositionX; Y = archetype.ActualPositionY; diff --git a/Source/Editor/Surface/Elements/InputBox.cs b/Source/Editor/Surface/Elements/InputBox.cs index a8954b797..4eac03105 100644 --- a/Source/Editor/Surface/Elements/InputBox.cs +++ b/Source/Editor/Surface/Elements/InputBox.cs @@ -17,6 +17,7 @@ using FlaxEditor.GUI.Input; using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; using Newtonsoft.Json; using JsonSerializer = FlaxEngine.Json.JsonSerializer; diff --git a/Source/Editor/Surface/SurfaceMeta.cs b/Source/Editor/Surface/SurfaceMeta.cs index 9cc7d51b4..460dcb302 100644 --- a/Source/Editor/Surface/SurfaceMeta.cs +++ b/Source/Editor/Surface/SurfaceMeta.cs @@ -4,6 +4,8 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Reflection; +using System.Runtime.Loader; using System.Runtime.Serialization.Formatters.Binary; using FlaxEngine; @@ -54,8 +56,13 @@ namespace FlaxEditor.Surface { try { + // Ensure we are in the correct load context (https://github.com/dotnet/runtime/issues/42041) + using var ctx = AssemblyLoadContext.EnterContextualReflection(typeof(Editor).Assembly); + var formatter = new BinaryFormatter(); +#pragma warning disable SYSLIB0011 return (Attribute[])formatter.Deserialize(stream); +#pragma warning restore SYSLIB0011 } catch (Exception ex) { @@ -122,8 +129,13 @@ namespace FlaxEditor.Surface } using (var stream = new MemoryStream()) { + // Ensure we are in the correct load context (https://github.com/dotnet/runtime/issues/42041) + using var ctx = AssemblyLoadContext.EnterContextualReflection(typeof(Editor).Assembly); + var formatter = new BinaryFormatter(); +#pragma warning disable SYSLIB0011 formatter.Serialize(stream, attributes); +#pragma warning restore SYSLIB0011 AddEntry(AttributeMetaTypeID, stream.ToArray()); } } diff --git a/Source/Editor/Surface/SurfaceParameter.cs b/Source/Editor/Surface/SurfaceParameter.cs index cfec4104a..6eafdc2aa 100644 --- a/Source/Editor/Surface/SurfaceParameter.cs +++ b/Source/Editor/Surface/SurfaceParameter.cs @@ -3,6 +3,7 @@ using System; using FlaxEditor.Scripting; using FlaxEngine; +using FlaxEngine.Utilities; namespace FlaxEditor.Surface { diff --git a/Source/Editor/Surface/SurfaceStyle.cs b/Source/Editor/Surface/SurfaceStyle.cs index f3c2c6f18..18fa70e4e 100644 --- a/Source/Editor/Surface/SurfaceStyle.cs +++ b/Source/Editor/Surface/SurfaceStyle.cs @@ -3,6 +3,7 @@ using System; using FlaxEditor.Scripting; using FlaxEngine; +using FlaxEngine.Utilities; namespace FlaxEditor.Surface { diff --git a/Source/Editor/Surface/SurfaceUtils.cs b/Source/Editor/Surface/SurfaceUtils.cs index be3066178..08b9c6d63 100644 --- a/Source/Editor/Surface/SurfaceUtils.cs +++ b/Source/Editor/Surface/SurfaceUtils.cs @@ -10,6 +10,7 @@ using FlaxEditor.CustomEditors; using FlaxEditor.CustomEditors.Elements; using FlaxEditor.Scripting; using FlaxEditor.Utilities; +using FlaxEngine.Utilities; using FlaxEngine; namespace FlaxEditor.Surface @@ -405,7 +406,9 @@ namespace FlaxEditor.Surface internal static bool IsValidVisualScriptType(ScriptType scriptType) { - if (!scriptType.IsPublic || scriptType.HasAttribute(typeof(HideInEditorAttribute), true)) + if (!scriptType.IsPublic || + scriptType.HasAttribute(typeof(HideInEditorAttribute), true) || + scriptType.HasAttribute(typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute), false)) return false; if (scriptType.IsGenericType) { diff --git a/Source/Editor/Surface/VisjectSurface.CopyPaste.cs b/Source/Editor/Surface/VisjectSurface.CopyPaste.cs index ba7684127..3a5be4857 100644 --- a/Source/Editor/Surface/VisjectSurface.CopyPaste.cs +++ b/Source/Editor/Surface/VisjectSurface.CopyPaste.cs @@ -6,6 +6,7 @@ using FlaxEditor.Scripting; using FlaxEditor.Surface.Elements; using FlaxEditor.Surface.Undo; using FlaxEngine; +using FlaxEngine.Utilities; using Newtonsoft.Json; using Newtonsoft.Json.Linq; diff --git a/Source/Editor/Surface/VisjectSurfaceContext.Serialization.cs b/Source/Editor/Surface/VisjectSurfaceContext.Serialization.cs index b20d849a2..f2059c581 100644 --- a/Source/Editor/Surface/VisjectSurfaceContext.Serialization.cs +++ b/Source/Editor/Surface/VisjectSurfaceContext.Serialization.cs @@ -8,6 +8,7 @@ using FlaxEditor.Scripting; using FlaxEditor.Surface.Elements; using FlaxEditor.Utilities; using FlaxEngine; +using FlaxEngine.Utilities; using Utils = FlaxEditor.Utilities.Utils; namespace FlaxEditor.Surface diff --git a/Source/Editor/Surface/VisjectSurfaceWindow.cs b/Source/Editor/Surface/VisjectSurfaceWindow.cs index 0b3bc8130..305121e11 100644 --- a/Source/Editor/Surface/VisjectSurfaceWindow.cs +++ b/Source/Editor/Surface/VisjectSurfaceWindow.cs @@ -368,7 +368,7 @@ namespace FlaxEditor.Surface } if (!asset.IsLoaded) { - layout.Label("Loading..."); + layout.Label("Loading...", TextAlignment.Center); return; } var parameters = window.VisjectSurface.Parameters; @@ -472,7 +472,7 @@ namespace FlaxEditor.Surface { Window = window, IsAdd = true, - Name = StringUtils.IncrementNameNumber("New parameter", x => OnParameterRenameValidate(null, x)), + Name = Utilities.Utils.IncrementNameNumber("New parameter", x => OnParameterRenameValidate(null, x)), Type = type, Index = window.VisjectSurface.Parameters.Count, }; @@ -1003,18 +1003,15 @@ namespace FlaxEditor.Surface /// public override void OnLayoutSerialize(XmlWriter writer) { - writer.WriteAttributeString("Split1", _split1.SplitterValue.ToString()); - writer.WriteAttributeString("Split2", _split2.SplitterValue.ToString()); + LayoutSerializeSplitter(writer, "Split1", _split1); + LayoutSerializeSplitter(writer, "Split2", _split2); } /// public override void OnLayoutDeserialize(XmlElement node) { - if (float.TryParse(node.GetAttribute("Split1"), out float value1)) - _split1.SplitterValue = value1; - - if (float.TryParse(node.GetAttribute("Split2"), out value1)) - _split2.SplitterValue = value1; + LayoutDeserializeSplitter(node, "Split1", _split1); + LayoutDeserializeSplitter(node, "Split2", _split2); } /// diff --git a/Source/Editor/Surface/VisualScriptSurface.cs b/Source/Editor/Surface/VisualScriptSurface.cs index b40fb1603..e961f686d 100644 --- a/Source/Editor/Surface/VisualScriptSurface.cs +++ b/Source/Editor/Surface/VisualScriptSurface.cs @@ -21,6 +21,7 @@ using FlaxEditor.Surface.ContextMenu; using FlaxEditor.Surface.Elements; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; using Object = FlaxEngine.Object; namespace FlaxEditor.Surface diff --git a/Source/Editor/Tools/Terrain/Sculpt/NoiseMode.cs b/Source/Editor/Tools/Terrain/Sculpt/NoiseMode.cs index fb52adb0e..32d02bb3f 100644 --- a/Source/Editor/Tools/Terrain/Sculpt/NoiseMode.cs +++ b/Source/Editor/Tools/Terrain/Sculpt/NoiseMode.cs @@ -1,6 +1,7 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using FlaxEngine; +using FlaxEditor.Utilities; using FlaxEngine.Utilities; namespace FlaxEditor.Tools.Terrain.Sculpt diff --git a/Source/Editor/Undo/Actions/AddRemoveScriptAction.cs b/Source/Editor/Undo/Actions/AddRemoveScriptAction.cs index 567bd39e9..69a790b39 100644 --- a/Source/Editor/Undo/Actions/AddRemoveScriptAction.cs +++ b/Source/Editor/Undo/Actions/AddRemoveScriptAction.cs @@ -3,6 +3,7 @@ using System; using FlaxEditor.Scripting; using FlaxEngine; +using FlaxEngine.Utilities; using Object = FlaxEngine.Object; namespace FlaxEditor.Actions diff --git a/Source/Editor/Undo/Actions/DeleteActorsAction.cs b/Source/Editor/Undo/Actions/DeleteActorsAction.cs index 740f41306..292497a4c 100644 --- a/Source/Editor/Undo/Actions/DeleteActorsAction.cs +++ b/Source/Editor/Undo/Actions/DeleteActorsAction.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using FlaxEditor.SceneGraph; using FlaxEditor.Scripting; using FlaxEngine; +using FlaxEngine.Utilities; namespace FlaxEditor.Actions { diff --git a/Source/Editor/Undo/Actions/PasteActorsAction.cs b/Source/Editor/Undo/Actions/PasteActorsAction.cs index 2a70c06cf..c90e94189 100644 --- a/Source/Editor/Undo/Actions/PasteActorsAction.cs +++ b/Source/Editor/Undo/Actions/PasteActorsAction.cs @@ -153,7 +153,7 @@ namespace FlaxEditor.Actions if (child != actor && child.Name == actor.Name) { var children = parent.Children; - actor.Name = StringUtils.IncrementNameNumber(name, x => children.All(y => y.Name != x)); + actor.Name = Utilities.Utils.IncrementNameNumber(name, x => children.All(y => y.Name != x)); } } } diff --git a/Source/Editor/Utilities/EditorScene.cpp b/Source/Editor/Utilities/EditorScene.cpp index 764b79184..7060baac5 100644 --- a/Source/Editor/Utilities/EditorScene.cpp +++ b/Source/Editor/Utilities/EditorScene.cpp @@ -20,4 +20,6 @@ void EditorScene::Update() e.Call(); for (auto& e : Ticking.FixedUpdate.Ticks) e.Call(); + for (auto& e : Ticking.LateFixedUpdate.Ticks) + e.Call(); } diff --git a/Source/Editor/Utilities/EditorUtilities.cpp b/Source/Editor/Utilities/EditorUtilities.cpp index 3fba14859..8e3fc0e4a 100644 --- a/Source/Editor/Utilities/EditorUtilities.cpp +++ b/Source/Editor/Utilities/EditorUtilities.cpp @@ -4,6 +4,7 @@ #include "Engine/Engine/Globals.h" #include "Engine/Platform/File.h" #include "Engine/Platform/FileSystem.h" +#include "Engine/Platform/CreateProcessSettings.h" #include "Engine/Core/Log.h" #include "Engine/Graphics/Textures/TextureData.h" #include "Engine/Graphics/PixelFormatExtensions.h" @@ -14,6 +15,9 @@ #include "Engine/Content/AssetReference.h" #include "Engine/Content/Assets/Texture.h" #include "Engine/Utilities/StringConverter.h" +#if PLATFORM_MAC +#include "Engine/Platform/Apple/ApplePlatformSettings.h" +#endif #include #define MSDOS_SIGNATURE 0x5A4D @@ -503,6 +507,37 @@ bool EditorUtilities::UpdateExeIcon(const String& path, const TextureData& icon) return false; } +bool EditorUtilities::FormatAppPackageName(String& packageName) +{ + const auto gameSettings = GameSettings::Get(); + String productName = gameSettings->ProductName; + productName.Replace(TEXT(" "), TEXT("")); + productName.Replace(TEXT("."), TEXT("")); + productName.Replace(TEXT("-"), TEXT("")); + String companyName = gameSettings->CompanyName; + companyName.Replace(TEXT(" "), TEXT("")); + companyName.Replace(TEXT("."), TEXT("")); + companyName.Replace(TEXT("-"), TEXT("")); + packageName.Replace(TEXT("${PROJECT_NAME}"), *productName, StringSearchCase::IgnoreCase); + packageName.Replace(TEXT("${COMPANY_NAME}"), *companyName, StringSearchCase::IgnoreCase); + packageName = packageName.ToLower(); + for (int32 i = 0; i < packageName.Length(); i++) + { + const auto c = packageName[i]; + if (c != '_' && c != '.' && !StringUtils::IsAlnum(c)) + { + LOG(Error, "App identifier \'{0}\' contains invalid character. Only letters, numbers, dots and underscore characters are allowed.", packageName); + return true; + } + } + if (packageName.IsEmpty()) + { + LOG(Error, "App identifier is empty.", packageName); + return true; + } + return false; +} + bool EditorUtilities::GetApplicationImage(const Guid& imageId, TextureData& imageData, ApplicationImageType type) { AssetReference icon = Content::LoadAsync(imageId); @@ -726,8 +761,9 @@ bool EditorUtilities::GenerateCertificate(const String& name, const String& outp // MakeCert auto path = wdkPath / TEXT("makecert.exe"); - auto args = String::Format(TEXT("\"{0}\" /r /h 0 /eku \"1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13\" /m 12 /len 2048 /n \"CN={1}\" -sv \"{2}\" \"{3}\""), path, name, outputPvkFilePath, outputCerFilePath); - int32 result = Platform::RunProcess(args, String::Empty); + CreateProcessSettings procSettings; + procSettings.FileName = String::Format(TEXT("\"{0}\" /r /h 0 /eku \"1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13\" /m 12 /len 2048 /n \"CN={1}\" -sv \"{2}\" \"{3}\""), path, name, outputPvkFilePath, outputCerFilePath); + int32 result = Platform::CreateProcess(procSettings); if (result != 0) { LOG(Warning, "MakeCert failed with result {0}.", result); @@ -736,8 +772,8 @@ bool EditorUtilities::GenerateCertificate(const String& name, const String& outp // Pvk2Pfx path = wdkPath / TEXT("pvk2pfx.exe"); - args = String::Format(TEXT("\"{0}\" -pvk \"{1}\" -spc \"{2}\" -pfx \"{3}\""), path, outputPvkFilePath, outputCerFilePath, outputPfxFilePath); - result = Platform::RunProcess(args, String::Empty); + procSettings.FileName = String::Format(TEXT("\"{0}\" -pvk \"{1}\" -spc \"{2}\" -pfx \"{3}\""), path, outputPvkFilePath, outputCerFilePath, outputPfxFilePath); + result = Platform::CreateProcess(procSettings); if (result != 0) { LOG(Warning, "MakeCert failed with result {0}.", result); @@ -818,3 +854,59 @@ bool EditorUtilities::ReplaceInFile(const StringView& file, const StringView& fi text.Replace(findWhat.Get(), findWhat.Length(), replaceWith.Get(), replaceWith.Length()); return File::WriteAllText(file, text, Encoding::ANSI); } + +bool EditorUtilities::ReplaceInFile(const StringView& file, const Dictionary& replaceMap) +{ + String text; + if (File::ReadAllText(file, text)) + return true; + for (const auto& e : replaceMap) + text.Replace(e.Key.Get(), e.Key.Length(), e.Value.Get(), e.Value.Length()); + return File::WriteAllText(file, text, Encoding::ANSI); +} + +bool EditorUtilities::CopyFileIfNewer(const StringView& dst, const StringView& src) +{ + if (FileSystem::FileExists(dst) && + FileSystem::GetFileLastEditTime(src) <= FileSystem::GetFileLastEditTime(dst) && + FileSystem::GetFileSize(dst) == FileSystem::GetFileSize(src)) + return false; + return FileSystem::CopyFile(dst, src); +} + +bool EditorUtilities::CopyDirectoryIfNewer(const StringView& dst, const StringView& src, bool withSubDirectories) +{ + if (FileSystem::DirectoryExists(dst)) + { + // Copy all files + Array cache(32); + if (FileSystem::DirectoryGetFiles(cache, *src, TEXT("*"), DirectorySearchOption::TopDirectoryOnly)) + return true; + for (int32 i = 0; i < cache.Count(); i++) + { + String dstFile = String(dst) / StringUtils::GetFileName(cache[i]); + if (CopyFileIfNewer(*dstFile, *cache[i])) + return true; + } + + // Copy all subdirectories (if need to) + if (withSubDirectories) + { + cache.Clear(); + if (FileSystem::GetChildDirectories(cache, src)) + return true; + for (int32 i = 0; i < cache.Count(); i++) + { + String dstDir = String(dst) / StringUtils::GetFileName(cache[i]); + if (CopyDirectoryIfNewer(dstDir, cache[i], true)) + return true; + } + } + + return false; + } + else + { + return FileSystem::CopyDirectory(dst, src, withSubDirectories); + } +} diff --git a/Source/Editor/Utilities/EditorUtilities.h b/Source/Editor/Utilities/EditorUtilities.h index 37fb28a2a..881bfe3b8 100644 --- a/Source/Editor/Utilities/EditorUtilities.h +++ b/Source/Editor/Utilities/EditorUtilities.h @@ -30,6 +30,7 @@ public: /// True if fails, otherwise false. static bool UpdateExeIcon(const String& path, const TextureData& icon); + static bool FormatAppPackageName(String& packageName); static bool GetApplicationImage(const Guid& imageId, TextureData& imageData, ApplicationImageType type = ApplicationImageType::Icon); static bool GetTexture(const Guid& textureId, TextureData& textureData); static bool ExportApplicationImage(const Guid& iconId, int32 width, int32 height, PixelFormat format, const String& path, ApplicationImageType type = ApplicationImageType::Icon); @@ -82,4 +83,8 @@ public: /// The value to replace to. /// True if failed, otherwise false. static bool ReplaceInFile(const StringView& file, const StringView& findWhat, const StringView& replaceWith); + static bool ReplaceInFile(const StringView& file, const Dictionary& replaceMap); + + static bool CopyFileIfNewer(const StringView& dst, const StringView& src); + static bool CopyDirectoryIfNewer(const StringView& dst, const StringView& src, bool withSubDirectories); }; diff --git a/Source/Editor/Utilities/ObjectSnapshot.cs b/Source/Editor/Utilities/ObjectSnapshot.cs index 2a1c320f3..a0e5e2c97 100644 --- a/Source/Editor/Utilities/ObjectSnapshot.cs +++ b/Source/Editor/Utilities/ObjectSnapshot.cs @@ -10,6 +10,7 @@ using System.Reflection; using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.Json; +using FlaxEngine.Utilities; namespace FlaxEditor.Utilities { diff --git a/Source/Editor/Utilities/Utils.cs b/Source/Editor/Utilities/Utils.cs index 7397b743e..d980b0c4a 100644 --- a/Source/Editor/Utilities/Utils.cs +++ b/Source/Editor/Utilities/Utils.cs @@ -13,6 +13,7 @@ using System.IO; using System.Reflection; using System.Runtime.InteropServices; using System.Text; +using System.Text.RegularExpressions; using FlaxEditor.GUI.ContextMenu; using FlaxEditor.GUI.Input; using FlaxEditor.GUI.Tree; @@ -20,6 +21,7 @@ using FlaxEditor.SceneGraph; using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; namespace FlaxEngine { @@ -37,6 +39,8 @@ namespace FlaxEditor.Utilities public static class Utils { private static readonly StringBuilder CachedSb = new StringBuilder(256); + private static readonly Regex IncNameRegex1 = new Regex("(\\d+)$"); + private static readonly Regex IncNameRegex2 = new Regex("\\((\\d+)\\)$"); private static readonly string[] MemorySizePostfixes = { @@ -53,6 +57,92 @@ namespace FlaxEditor.Utilities /// public static readonly string FlaxEngineAssemblyName = "FlaxEngine.CSharp"; + /// + /// Tries to parse number in the name brackets at the end of the value and then increment it to create a new name. + /// Supports numbers at the end without brackets. + /// + /// The input name. + /// Custom function to validate the created name. + /// The new name. + public static string IncrementNameNumber(string name, Func isValid) + { + // Validate input name + if (isValid == null || isValid(name)) + return name; + + // Temporary data + int index; + int MaxChecks = 10000; + string result; + + // Find '' case + var match = IncNameRegex1.Match(name); + if (match.Success && match.Groups.Count == 2) + { + // Get result + string num = match.Groups[0].Value; + + // Parse value + if (int.TryParse(num, out index)) + { + // Get prefix + string prefix = name.Substring(0, name.Length - num.Length); + + // Generate name + do + { + result = string.Format("{0}{1}", prefix, ++index); + + if (MaxChecks-- < 0) + return name + Guid.NewGuid(); + } while (!isValid(result)); + + if (result.Length > 0) + return result; + } + } + + // Find ' ()' case + match = IncNameRegex2.Match(name); + if (match.Success && match.Groups.Count == 2) + { + // Get result + string num = match.Groups[0].Value; + num = num.Substring(1, num.Length - 2); + + // Parse value + if (int.TryParse(num, out index)) + { + // Get prefix + string prefix = name.Substring(0, name.Length - num.Length - 2); + + // Generate name + do + { + result = string.Format("{0}({1})", prefix, ++index); + + if (MaxChecks-- < 0) + return name + Guid.NewGuid(); + } while (!isValid(result)); + + if (result.Length > 0) + return result; + } + } + + // Generate name + index = 0; + do + { + result = string.Format("{0} {1}", name, index++); + + if (MaxChecks-- < 0) + return name + Guid.NewGuid(); + } while (!isValid(result)); + + return result; + } + /// /// Formats the amount of bytes to get a human-readable data size in bytes with abbreviation. Eg. 32 kB /// @@ -1084,7 +1174,7 @@ namespace FlaxEditor.Utilities internal static string FormatFloat(string str, bool isNegative) { // Reference: https://stackoverflow.com/questions/1546113/double-to-string-conversion-without-scientific-notation - int x = str.IndexOf('E'); + int x = str.IndexOf('E', StringComparison.OrdinalIgnoreCase); if (x < 0) return str; int x1 = x + 1; diff --git a/Source/Editor/Viewport/MainEditorGizmoViewport.cs b/Source/Editor/Viewport/MainEditorGizmoViewport.cs index 43f5cb63c..48cd4fd98 100644 --- a/Source/Editor/Viewport/MainEditorGizmoViewport.cs +++ b/Source/Editor/Viewport/MainEditorGizmoViewport.cs @@ -422,7 +422,7 @@ namespace FlaxEditor.Viewport var actor = new Camera { StaticFlags = StaticFlags.None, - Name = StringUtils.IncrementNameNumber("Camera", x => parent.GetChild(x) == null), + Name = Utilities.Utils.IncrementNameNumber("Camera", x => parent.GetChild(x) == null), Transform = ViewTransform, NearPlane = NearPlane, FarPlane = FarPlane, @@ -998,7 +998,7 @@ namespace FlaxEditor.Viewport { actor.Position = PostProcessSpawnedActorLocation(actor, ref hitLocation); var parent = actor.Parent ?? Level.GetScene(0); - actor.Name = StringUtils.IncrementNameNumber(actor.Name, x => parent.GetChild(x) == null); + actor.Name = Utilities.Utils.IncrementNameNumber(actor.Name, x => parent.GetChild(x) == null); Editor.Instance.SceneEditing.Spawn(actor); Focus(); } diff --git a/Source/Editor/Viewport/Previews/AnimatedModelPreview.cs b/Source/Editor/Viewport/Previews/AnimatedModelPreview.cs index 268295405..2310668b6 100644 --- a/Source/Editor/Viewport/Previews/AnimatedModelPreview.cs +++ b/Source/Editor/Viewport/Previews/AnimatedModelPreview.cs @@ -15,8 +15,8 @@ namespace FlaxEditor.Viewport.Previews /// public class AnimatedModelPreview : AssetPreview { - private ContextMenuButton _showNodesButton, _showBoundsButton, _showFloorButton; - private bool _showNodes, _showBounds, _showFloor, _showCurrentLOD; + private ContextMenuButton _showNodesButton, _showBoundsButton, _showFloorButton, _showNodesNamesButton; + private bool _showNodes, _showBounds, _showFloor, _showCurrentLOD, _showNodesNames; private AnimatedModel _previewModel; private StaticModel _floorModel; private ContextMenuButton _showCurrentLODButton; @@ -98,6 +98,24 @@ namespace FlaxEditor.Viewport.Previews } } + /// + /// Gets or sets a value indicating whether show animated model skeleton nodes names debug view. + /// + public bool ShowNodesNames + { + get => _showNodesNames; + set + { + if (_showNodesNames == value) + return; + _showNodesNames = value; + if (value) + ShowDebugDraw = true; + if (_showNodesNamesButton != null) + _showNodesNamesButton.Checked = value; + } + } + /// /// Gets or sets a value indicating whether show animated model bounding box debug view. /// @@ -183,6 +201,9 @@ namespace FlaxEditor.Viewport.Previews // Show Skeleton _showNodesButton = ViewWidgetShowMenu.AddButton("Skeleton", () => ShowNodes = !ShowNodes); + // Show Skeleton Names + _showNodesNamesButton = ViewWidgetShowMenu.AddButton("Skeleton Names", () => ShowNodesNames = !ShowNodesNames); + // Show Floor _showFloorButton = ViewWidgetShowMenu.AddButton("Floor", button => ShowFloor = !ShowFloor); _showFloorButton.IndexInParent = 1; @@ -252,6 +273,41 @@ namespace FlaxEditor.Viewport.Previews _playAnimationOnce = true; } + /// + /// Gets the skinned model bounds. Handles skeleton-only assets. + /// + /// The local bounds. + public BoundingBox GetBounds() + { + var box = BoundingBox.Zero; + var skinnedModel = SkinnedModel; + if (skinnedModel && skinnedModel.IsLoaded) + { + if (skinnedModel.LODs.Length != 0) + { + // Use model geometry bounds + box = skinnedModel.GetBox(); + } + else + { + // Use skeleton bounds + _previewModel.GetCurrentPose(out var pose); + if (pose != null && pose.Length != 0) + { + var point = pose[0].TranslationVector; + box = new BoundingBox(point, point); + for (int i = 1; i < pose.Length; i++) + { + point = pose[i].TranslationVector; + box.Minimum = Vector3.Min(box.Minimum, point); + box.Maximum = Vector3.Max(box.Maximum, point); + } + } + } + } + return box; + } + private void OnBegin(RenderTask task, GPUContext context) { if (!ScaleToFit) @@ -269,7 +325,7 @@ namespace FlaxEditor.Viewport.Previews if (skinnedModel && skinnedModel.IsLoaded) { float targetSize = 50.0f; - BoundingBox box = skinnedModel.GetBox(); + BoundingBox box = GetBounds(); float maxSize = Mathf.Max(0.001f, (float)box.Size.MaxValue); float scale = targetSize / maxSize; _previewModel.Scale = new Vector3(scale); @@ -327,37 +383,51 @@ namespace FlaxEditor.Viewport.Previews base.OnDebugDraw(context, ref renderContext); // Draw skeleton nodes - if (_showNodes) + if (_showNodes || _showNodesNames) { _previewModel.GetCurrentPose(out var pose, true); var nodes = _previewModel.SkinnedModel?.Nodes; if (pose != null && pose.Length != 0 && nodes != null) { - // Draw bounding box at the node locations var nodesMask = NodesMask != null && NodesMask.Length == nodes.Length ? NodesMask : null; - var localBox = new OrientedBoundingBox(new Vector3(-1.0f), new Vector3(1.0f)); - for (int nodeIndex = 0; nodeIndex < pose.Length; nodeIndex++) + if (_showNodes) { - if (nodesMask != null && !nodesMask[nodeIndex]) - continue; - var transform = pose[nodeIndex]; - transform.Decompose(out var scale, out Matrix _, out _); - transform = Matrix.Invert(Matrix.Scaling(scale)) * transform; - var box = localBox * transform; - DebugDraw.DrawWireBox(box, Color.Green, 0, false); - } - - // Nodes connections - for (int nodeIndex = 0; nodeIndex < nodes.Length; nodeIndex++) - { - int parentIndex = nodes[nodeIndex].ParentIndex; - if (parentIndex != -1) + // Draw bounding box at the node locations + var localBox = new OrientedBoundingBox(new Vector3(-1.0f), new Vector3(1.0f)); + for (int nodeIndex = 0; nodeIndex < pose.Length; nodeIndex++) { - if (nodesMask != null && (!nodesMask[nodeIndex] || !nodesMask[parentIndex])) + if (nodesMask != null && !nodesMask[nodeIndex]) continue; - var parentPos = pose[parentIndex].TranslationVector; - var bonePos = pose[nodeIndex].TranslationVector; - DebugDraw.DrawLine(parentPos, bonePos, Color.Green, 0, false); + var transform = pose[nodeIndex]; + transform.Decompose(out var scale, out Matrix _, out _); + transform = Matrix.Invert(Matrix.Scaling(scale)) * transform; + var box = localBox * transform; + DebugDraw.DrawWireBox(box, Color.Green, 0, false); + } + + // Nodes connections + for (int nodeIndex = 0; nodeIndex < nodes.Length; nodeIndex++) + { + int parentIndex = nodes[nodeIndex].ParentIndex; + if (parentIndex != -1) + { + if (nodesMask != null && (!nodesMask[nodeIndex] || !nodesMask[parentIndex])) + continue; + var parentPos = pose[parentIndex].TranslationVector; + var bonePos = pose[nodeIndex].TranslationVector; + DebugDraw.DrawLine(parentPos, bonePos, Color.Green, 0, false); + } + } + } + if (_showNodesNames) + { + // Nodes names + for (int nodeIndex = 0; nodeIndex < nodes.Length; nodeIndex++) + { + if (nodesMask != null && !nodesMask[nodeIndex]) + continue; + //var t = new Transform(pose[nodeIndex].TranslationVector, Quaternion.Identity, new Float3(0.1f)); + DebugDraw.DrawText(nodes[nodeIndex].Name, pose[nodeIndex].TranslationVector, Color.White, 20, 0.0f, 0.1f); } } } @@ -376,13 +446,21 @@ namespace FlaxEditor.Viewport.Previews base.Draw(); var skinnedModel = _previewModel.SkinnedModel; - if (_showCurrentLOD && skinnedModel) + if (skinnedModel == null || !skinnedModel.IsLoaded) + return; + var lods = skinnedModel.LODs; + if (lods.Length == 0) + { + // Force show skeleton for models without geometry + ShowNodes = true; + return; + } + if (_showCurrentLOD) { var lodIndex = ComputeLODIndex(skinnedModel); string text = string.Format("Current LOD: {0}", lodIndex); if (lodIndex != -1) { - var lods = skinnedModel.LODs; lodIndex = Mathf.Clamp(lodIndex + PreviewActor.LODBias, 0, lods.Length - 1); var lod = lods[lodIndex]; int triangleCount = 0, vertexCount = 0; @@ -448,6 +526,7 @@ namespace FlaxEditor.Viewport.Previews _showBoundsButton = null; _showFloorButton = null; _showCurrentLODButton = null; + _showNodesNamesButton = null; base.OnDestroy(); } diff --git a/Source/Editor/Viewport/Previews/AssetPreview.cs b/Source/Editor/Viewport/Previews/AssetPreview.cs index 1267fded6..0bcc4e115 100644 --- a/Source/Editor/Viewport/Previews/AssetPreview.cs +++ b/Source/Editor/Viewport/Previews/AssetPreview.cs @@ -128,6 +128,18 @@ namespace FlaxEditor.Viewport.Previews /// public EditorPrimitives EditorPrimitives => _editorPrimitives; + /// + /// Custom debug drawing event (via ). + /// + public event CustomDebugDrawDelegate CustomDebugDraw; + + /// + /// Debug shapes drawing delegate. + /// + /// The GPU context. + /// The render context. + public delegate void CustomDebugDrawDelegate(GPUContext context, ref RenderContext renderContext); + /// /// Initializes a new instance of the class. /// @@ -249,6 +261,7 @@ namespace FlaxEditor.Viewport.Previews { DebugDraw.SetContext(_debugDrawContext); DebugDraw.UpdateContext(_debugDrawContext, 1.0f / Mathf.Max(Engine.FramesPerSecond, 1)); + CustomDebugDraw?.Invoke(context, ref renderContext); OnDebugDraw(context, ref renderContext); DebugDraw.Draw(ref renderContext, target.View(), targetDepth.View(), true); DebugDraw.SetContext(IntPtr.Zero); diff --git a/Source/Editor/Viewport/Previews/CubeTexturePreview.cs b/Source/Editor/Viewport/Previews/CubeTexturePreview.cs index 08a402eb4..e65349cb8 100644 --- a/Source/Editor/Viewport/Previews/CubeTexturePreview.cs +++ b/Source/Editor/Viewport/Previews/CubeTexturePreview.cs @@ -243,7 +243,7 @@ namespace FlaxEditor.Viewport.Previews public override void OnDestroy() { Material = null; - Object.Destroy(ref _previewMaterial); + FlaxEngine.Object.Destroy(ref _previewMaterial); base.OnDestroy(); } diff --git a/Source/Editor/ViewportDebugDrawData.cs b/Source/Editor/ViewportDebugDrawData.cs index 10bc19c45..48b551675 100644 --- a/Source/Editor/ViewportDebugDrawData.cs +++ b/Source/Editor/ViewportDebugDrawData.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; +using System.Runtime.InteropServices; using FlaxEngine; namespace FlaxEditor @@ -20,7 +21,7 @@ namespace FlaxEditor private int[] _highlightIndicesSet; private Model _highlightTrianglesModel; - internal IntPtr[] ActorsPtrs => Utils.ExtractArrayFromList(_actors); + internal Span ActorsPtrs => CollectionsMarshal.AsSpan(_actors); internal int ActorsCount => _actors.Count; diff --git a/Source/Editor/Windows/AboutDialog.cs b/Source/Editor/Windows/AboutDialog.cs index 6ef152e28..4b9595445 100644 --- a/Source/Editor/Windows/AboutDialog.cs +++ b/Source/Editor/Windows/AboutDialog.cs @@ -125,6 +125,9 @@ namespace FlaxEditor.Windows "Used third party software:", "", "Mono Project - www.mono-project.com", +#if USE_NETCORE + ".NET - www.dotnet.microsoft.com", +#endif "FreeType Project - www.freetype.org", "Assimp - www.assimp.sourceforge.net", "DirectXMesh - Copyright (c) Microsoft Corporation. All rights reserved.", diff --git a/Source/Editor/Windows/Assets/AnimationWindow.cs b/Source/Editor/Windows/Assets/AnimationWindow.cs index db812d442..a765c2faa 100644 --- a/Source/Editor/Windows/Assets/AnimationWindow.cs +++ b/Source/Editor/Windows/Assets/AnimationWindow.cs @@ -1,6 +1,7 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using System; +using System.Globalization; using System.Reflection; using System.Xml; using FlaxEditor.Content; @@ -143,7 +144,7 @@ namespace FlaxEditor.Windows.Assets Asset = window.Asset; // Try to restore target asset import options (useful for fast reimport) - ModelImportSettings.TryRestore(ref ImportSettings, window.Item.Path); + Editor.TryRestoreImportOptions(ref ImportSettings.Settings, window.Item.Path); } public void OnClean() @@ -165,10 +166,9 @@ namespace FlaxEditor.Windows.Assets public override void Initialize(LayoutElementsContainer layout) { var proxy = (PropertiesProxy)Values[0]; - if (proxy.Asset == null || !proxy.Asset.IsLoaded) { - layout.Label("Loading..."); + layout.Label("Loading...", TextAlignment.Center); return; } @@ -374,12 +374,12 @@ namespace FlaxEditor.Windows.Assets /// public override void OnLayoutSerialize(XmlWriter writer) { - writer.WriteAttributeString("TimelineSplitter", _timeline.Splitter.SplitterValue.ToString()); + LayoutSerializeSplitter(writer, "TimelineSplitter", _timeline.Splitter); + LayoutSerializeSplitter(writer, "Panel1Splitter", _panel1); + if (_panel2 != null) + LayoutSerializeSplitter(writer, "Panel2Splitter", _panel2); writer.WriteAttributeString("TimeShowMode", _timeline.TimeShowMode.ToString()); writer.WriteAttributeString("ShowPreviewValues", _timeline.ShowPreviewValues.ToString()); - writer.WriteAttributeString("Panel1Splitter", _panel1.SplitterValue.ToString()); - if (_panel2 != null) - writer.WriteAttributeString("Panel2Splitter", _panel2.SplitterValue.ToString()); if (_properties.PreviewModel) writer.WriteAttributeString("PreviewModel", _properties.PreviewModel.ID.ToString()); } @@ -387,18 +387,16 @@ namespace FlaxEditor.Windows.Assets /// public override void OnLayoutDeserialize(XmlElement node) { - if (Guid.TryParse(node.GetAttribute("PreviewModel"), out Guid value4)) - _initialPreviewModel = FlaxEngine.Content.LoadAsync(value4); - if (float.TryParse(node.GetAttribute("TimelineSplitter"), out float value1)) - _timeline.Splitter.SplitterValue = value1; - if (float.TryParse(node.GetAttribute("Panel1Splitter"), out value1)) - _panel1.SplitterValue = value1; - if (float.TryParse(node.GetAttribute("Panel2Splitter"), out value1)) + LayoutDeserializeSplitter(node, "TimelineSplitter", _timeline.Splitter); + LayoutDeserializeSplitter(node, "Panel1Splitter", _panel1); + if (float.TryParse(node.GetAttribute("Panel2Splitter"), CultureInfo.InvariantCulture, out float value1) && value1 > 0.01f && value1 < 0.99f) _initialPanel2Splitter = value1; if (Enum.TryParse(node.GetAttribute("TimeShowMode"), out Timeline.TimeShowModes value2)) _timeline.TimeShowMode = value2; if (bool.TryParse(node.GetAttribute("ShowPreviewValues"), out bool value3)) _timeline.ShowPreviewValues = value3; + if (Guid.TryParse(node.GetAttribute("PreviewModel"), out Guid value4)) + _initialPreviewModel = FlaxEngine.Content.LoadAsync(value4); } /// diff --git a/Source/Editor/Windows/Assets/AudioClipWindow.cs b/Source/Editor/Windows/Assets/AudioClipWindow.cs index dddfaa296..f5f244c58 100644 --- a/Source/Editor/Windows/Assets/AudioClipWindow.cs +++ b/Source/Editor/Windows/Assets/AudioClipWindow.cs @@ -284,10 +284,10 @@ namespace FlaxEditor.Windows.Assets { _preview.Source = null; _previewSource.Stop(); - Object.Destroy(_previewSource); + FlaxEngine.Object.Destroy(_previewSource); _previewSource = null; } - Object.Destroy(ref _previewScene); + FlaxEngine.Object.Destroy(ref _previewScene); base.OnDestroy(); } @@ -336,14 +336,13 @@ namespace FlaxEditor.Windows.Assets /// public override void OnLayoutSerialize(XmlWriter writer) { - writer.WriteAttributeString("Split", _split.SplitterValue.ToString()); + LayoutSerializeSplitter(writer, "Split", _split); } /// public override void OnLayoutDeserialize(XmlElement node) { - if (float.TryParse(node.GetAttribute("Split"), out float value1)) - _split.SplitterValue = value1; + LayoutDeserializeSplitter(node, "Split", _split); } /// diff --git a/Source/Editor/Windows/Assets/CollisionDataWindow.cs b/Source/Editor/Windows/Assets/CollisionDataWindow.cs index fd044a22c..9ce4c8765 100644 --- a/Source/Editor/Windows/Assets/CollisionDataWindow.cs +++ b/Source/Editor/Windows/Assets/CollisionDataWindow.cs @@ -236,7 +236,7 @@ namespace FlaxEditor.Windows.Assets _collisionWiresModel = FlaxEngine.Content.CreateVirtualAsset(); _collisionWiresModel.SetupLODs(new[] { 1 }); } - Editor.Internal_GetCollisionWires(FlaxEngine.Object.GetUnmanagedPtr(Asset), out var triangles, out var indices); + Editor.Internal_GetCollisionWires(FlaxEngine.Object.GetUnmanagedPtr(Asset), out var triangles, out var indices, out var _, out var _); if (triangles != null && indices != null) _collisionWiresModel.LODs[0].Meshes[0].UpdateMesh(triangles, indices); else @@ -317,14 +317,13 @@ namespace FlaxEditor.Windows.Assets /// public override void OnLayoutSerialize(XmlWriter writer) { - writer.WriteAttributeString("Split", _split.SplitterValue.ToString()); + LayoutSerializeSplitter(writer, "Split", _split); } /// public override void OnLayoutDeserialize(XmlElement node) { - if (float.TryParse(node.GetAttribute("Split"), out float value1)) - _split.SplitterValue = value1; + LayoutDeserializeSplitter(node, "Split", _split); } /// diff --git a/Source/Editor/Windows/Assets/CubeTextureWindow.cs b/Source/Editor/Windows/Assets/CubeTextureWindow.cs index 2292ba556..272cf351b 100644 --- a/Source/Editor/Windows/Assets/CubeTextureWindow.cs +++ b/Source/Editor/Windows/Assets/CubeTextureWindow.cs @@ -27,7 +27,7 @@ namespace FlaxEditor.Windows.Assets private CubeTextureWindow _window; [EditorOrder(1000), EditorDisplay("Import Settings", EditorDisplayAttribute.InlineStyle)] - public TextureImportSettings ImportSettings = new TextureImportSettings(); + public FlaxEngine.Tools.TextureTool.Options ImportSettings = new(); public sealed class ProxyEditor : GenericEditor { @@ -69,7 +69,7 @@ namespace FlaxEditor.Windows.Assets _window = window; // Try to restore target asset texture import options (useful for fast reimport) - TextureImportSettings.TryRestore(ref ImportSettings, window.Item.Path); + Editor.TryRestoreImportOptions(ref ImportSettings, window.Item.Path); // Prepare restore data PeekState(); @@ -206,14 +206,13 @@ namespace FlaxEditor.Windows.Assets /// public override void OnLayoutSerialize(XmlWriter writer) { - writer.WriteAttributeString("Split", _split.SplitterValue.ToString()); + LayoutSerializeSplitter(writer, "Split", _split); } /// public override void OnLayoutDeserialize(XmlElement node) { - if (float.TryParse(node.GetAttribute("Split"), out float value1)) - _split.SplitterValue = value1; + LayoutDeserializeSplitter(node, "Split", _split); } /// diff --git a/Source/Editor/Windows/Assets/GameplayGlobalsWindow.cs b/Source/Editor/Windows/Assets/GameplayGlobalsWindow.cs index bfd93d5ae..623c4ef5b 100644 --- a/Source/Editor/Windows/Assets/GameplayGlobalsWindow.cs +++ b/Source/Editor/Windows/Assets/GameplayGlobalsWindow.cs @@ -11,6 +11,7 @@ using FlaxEditor.GUI.ContextMenu; using FlaxEditor.Scripting; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; namespace FlaxEditor.Windows.Assets { @@ -331,7 +332,7 @@ namespace FlaxEditor.Windows.Assets { Proxy = _proxy, IsAdd = true, - Name = StringUtils.IncrementNameNumber("New parameter", x => OnParameterRenameValidate(null, x)), + Name = Utilities.Utils.IncrementNameNumber("New parameter", x => OnParameterRenameValidate(null, x)), DefaultValue = TypeUtils.GetDefaultValue(new ScriptType(type)), }; _proxy.Window.Undo.AddAction(action); diff --git a/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs b/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs index 9401908d0..d5ab2ae8a 100644 --- a/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs +++ b/Source/Editor/Windows/Assets/MaterialInstanceWindow.cs @@ -233,7 +233,7 @@ namespace FlaxEditor.Windows.Assets } if (!materialInstance.IsLoaded || (materialInstance.BaseMaterial && !materialInstance.BaseMaterial.IsLoaded)) { - layout.Label("Loading..."); + layout.Label("Loading...", TextAlignment.Center); return; } var parameters = materialInstance.Parameters; @@ -548,14 +548,13 @@ namespace FlaxEditor.Windows.Assets /// public override void OnLayoutSerialize(XmlWriter writer) { - writer.WriteAttributeString("Split", _split.SplitterValue.ToString()); + LayoutSerializeSplitter(writer, "Split", _split); } /// public override void OnLayoutDeserialize(XmlElement node) { - if (float.TryParse(node.GetAttribute("Split"), out float value1)) - _split.SplitterValue = value1; + LayoutDeserializeSplitter(node, "Split", _split); } /// diff --git a/Source/Editor/Windows/Assets/ModelBaseWindow.cs b/Source/Editor/Windows/Assets/ModelBaseWindow.cs index 977b15839..5fd90bd23 100644 --- a/Source/Editor/Windows/Assets/ModelBaseWindow.cs +++ b/Source/Editor/Windows/Assets/ModelBaseWindow.cs @@ -36,6 +36,10 @@ namespace FlaxEditor.Windows.Assets Asset = window.Asset; } + public virtual void OnSave() + { + } + public virtual void OnClean() { Window = null; @@ -109,7 +113,7 @@ namespace FlaxEditor.Windows.Assets { AnchorPreset = AnchorPresets.StretchAll, Offsets = new Margin(0, 0, _toolstrip.Bottom, 0), - SplitterValue = 0.65f, + SplitterValue = 0.59f, Parent = this }; @@ -139,9 +143,7 @@ namespace FlaxEditor.Windows.Assets foreach (var child in _tabs.Children) { if (child is Tab tab && tab.Proxy.Window != null) - { tab.Proxy.OnClean(); - } } base.UnlinkItem(); @@ -187,20 +189,19 @@ namespace FlaxEditor.Windows.Assets /// public override void OnLayoutSerialize(XmlWriter writer) { - writer.WriteAttributeString("Split", _split.SplitterValue.ToString()); + LayoutSerializeSplitter(writer, "Split", _split); } /// public override void OnLayoutDeserialize(XmlElement node) { - if (float.TryParse(node.GetAttribute("Split"), out float value1)) - _split.SplitterValue = value1; + LayoutDeserializeSplitter(node, "Split", _split); } /// public override void OnLayoutDeserialize() { - _split.SplitterValue = 0.65f; + _split.SplitterValue = 0.59f; } } } diff --git a/Source/Editor/Windows/Assets/ModelWindow.cs b/Source/Editor/Windows/Assets/ModelWindow.cs index af3bfdf22..e44882b73 100644 --- a/Source/Editor/Windows/Assets/ModelWindow.cs +++ b/Source/Editor/Windows/Assets/ModelWindow.cs @@ -11,6 +11,7 @@ using FlaxEditor.Viewport.Cameras; using FlaxEditor.Viewport.Previews; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Tools; using FlaxEngine.Utilities; using Object = FlaxEngine.Object; @@ -157,7 +158,7 @@ namespace FlaxEditor.Windows.Assets var proxy = (MeshesPropertiesProxy)Values[0]; if (proxy.Asset == null || !proxy.Asset.IsLoaded) { - layout.Label("Loading..."); + layout.Label("Loading...", TextAlignment.Center); return; } proxy._materialSlotComboBoxes.Clear(); @@ -196,12 +197,12 @@ namespace FlaxEditor.Windows.Assets group.Label("No SDF"); } - var resolution = group.FloatValue("Resolution Scale", proxy.Window.Editor.CodeDocs.GetTooltip(typeof(ModelImportSettings), nameof(ModelImportSettings.SDFResolution))); + var resolution = group.FloatValue("Resolution Scale", proxy.Window.Editor.CodeDocs.GetTooltip(typeof(ModelTool.Options), nameof(ModelImportSettings.Settings.SDFResolution))); resolution.ValueBox.MinValue = 0.0001f; resolution.ValueBox.MaxValue = 100.0f; resolution.ValueBox.Value = sdf.Texture != null ? sdf.ResolutionScale : 1.0f; - resolution.ValueBox.BoxValueChanged += b => { proxy.Window._importSettings.SDFResolution = b.Value; }; - proxy.Window._importSettings.SDFResolution = sdf.ResolutionScale; + resolution.ValueBox.BoxValueChanged += b => { proxy.Window._importSettings.Settings.SDFResolution = b.Value; }; + proxy.Window._importSettings.Settings.SDFResolution = sdf.ResolutionScale; var backfacesThreshold = group.FloatValue("Backfaces Threshold", "Custom threshold (in range 0-1) for adjusting mesh internals detection based on the percentage of test rays hit triangle backfaces. Use lower value for more dense mesh."); backfacesThreshold.ValueBox.MinValue = 0.001f; @@ -293,7 +294,7 @@ namespace FlaxEditor.Windows.Assets private void OnRebuildSDF() { var proxy = (MeshesPropertiesProxy)Values[0]; - proxy.Asset.GenerateSDF(proxy.Window._importSettings.SDFResolution, _sdfModelLodIndex.Value, true, proxy.Window._backfacesThreshold); + proxy.Asset.GenerateSDF(proxy.Window._importSettings.Settings.SDFResolution, _sdfModelLodIndex.Value, true, proxy.Window._backfacesThreshold); proxy.Window.MarkAsEdited(); Presenter.BuildLayoutOnUpdate(); } @@ -402,7 +403,7 @@ namespace FlaxEditor.Windows.Assets var proxy = (MaterialsPropertiesProxy)Values[0]; if (proxy.Asset == null || !proxy.Asset.IsLoaded) { - layout.Label("Loading..."); + layout.Label("Loading...", TextAlignment.Center); return; } @@ -464,7 +465,7 @@ namespace FlaxEditor.Windows.Assets var proxy = (UVsPropertiesProxy)Values[0]; if (proxy.Asset == null || !proxy.Asset.IsLoaded) { - layout.Label("Loading..."); + layout.Label("Loading...", TextAlignment.Center); return; } @@ -713,7 +714,7 @@ namespace FlaxEditor.Windows.Assets var proxy = (ImportPropertiesProxy)Values[0]; if (proxy.Asset == null || !proxy.Asset.IsLoaded) { - layout.Label("Loading..."); + layout.Label("Loading...", TextAlignment.Center); return; } @@ -876,10 +877,13 @@ namespace FlaxEditor.Windows.Assets { if (!IsEdited) return; - if (_asset.WaitForLoaded()) - { return; + + foreach (var child in _tabs.Children) + { + if (child is Tab tab && tab.Proxy.Window != null) + tab.Proxy.OnSave(); } if (_asset.Save()) @@ -916,7 +920,7 @@ namespace FlaxEditor.Windows.Assets { _refreshOnLODsLoaded = true; _preview.ViewportCamera.SetArcBallView(Asset.GetBox()); - ModelImportSettings.TryRestore(ref _importSettings, Item.Path); + Editor.TryRestoreImportOptions(ref _importSettings.Settings, Item.Path); UpdateEffectsOnAsset(); // TODO: disable streaming for this model diff --git a/Source/Editor/Windows/Assets/ParticleSystemWindow.cs b/Source/Editor/Windows/Assets/ParticleSystemWindow.cs index 0b59dc86c..328369680 100644 --- a/Source/Editor/Windows/Assets/ParticleSystemWindow.cs +++ b/Source/Editor/Windows/Assets/ParticleSystemWindow.cs @@ -543,22 +543,17 @@ namespace FlaxEditor.Windows.Assets /// public override void OnLayoutSerialize(XmlWriter writer) { - writer.WriteAttributeString("Split1", _split1.SplitterValue.ToString()); - writer.WriteAttributeString("Split2", _split2.SplitterValue.ToString()); - writer.WriteAttributeString("Split3", _timeline.Splitter.SplitterValue.ToString()); + LayoutSerializeSplitter(writer, "Split1", _split1); + LayoutSerializeSplitter(writer, "Split2", _split2); + LayoutSerializeSplitter(writer, "Split3", _timeline.Splitter); } /// public override void OnLayoutDeserialize(XmlElement node) { - if (float.TryParse(node.GetAttribute("Split1"), out float value1)) - _split1.SplitterValue = value1; - - if (float.TryParse(node.GetAttribute("Split2"), out value1)) - _split2.SplitterValue = value1; - - if (float.TryParse(node.GetAttribute("Split3"), out value1)) - _timeline.Splitter.SplitterValue = value1; + LayoutDeserializeSplitter(node, "Split1", _split1); + LayoutDeserializeSplitter(node, "Split2", _split2); + LayoutDeserializeSplitter(node, "Split3", _timeline.Splitter); } /// diff --git a/Source/Editor/Windows/Assets/PrefabWindow.Hierarchy.cs b/Source/Editor/Windows/Assets/PrefabWindow.Hierarchy.cs index 625fd92b4..1b1cfb4ff 100644 --- a/Source/Editor/Windows/Assets/PrefabWindow.Hierarchy.cs +++ b/Source/Editor/Windows/Assets/PrefabWindow.Hierarchy.cs @@ -298,13 +298,13 @@ namespace FlaxEditor.Windows.Assets } // Custom options - bool showCustomNodeOptions = Editor.SceneEditing.Selection.Count == 1; - if (!showCustomNodeOptions && Editor.SceneEditing.Selection.Count != 0) + bool showCustomNodeOptions = Selection.Count == 1; + if (!showCustomNodeOptions && Selection.Count != 0) { showCustomNodeOptions = true; - for (int i = 1; i < Editor.SceneEditing.Selection.Count; i++) + for (int i = 1; i < Selection.Count; i++) { - if (Editor.SceneEditing.Selection[0].GetType() != Editor.SceneEditing.Selection[i].GetType()) + if (Selection[0].GetType() != Selection[i].GetType()) { showCustomNodeOptions = false; break; @@ -313,7 +313,7 @@ namespace FlaxEditor.Windows.Assets } if (showCustomNodeOptions) { - Editor.SceneEditing.Selection[0].OnContextMenu(contextMenu); + Selection[0].OnContextMenu(contextMenu); } ContextMenuShow?.Invoke(contextMenu); @@ -368,7 +368,7 @@ namespace FlaxEditor.Windows.Assets actor.Layer = parentActor.Layer; // Rename actor to identify it easily - actor.Name = StringUtils.IncrementNameNumber(actor.GetType().Name, x => parentActor.GetChild(x) == null); + actor.Name = Utilities.Utils.IncrementNameNumber(actor.GetType().Name, x => parentActor.GetChild(x) == null); } // Spawn it diff --git a/Source/Editor/Windows/Assets/PrefabWindow.cs b/Source/Editor/Windows/Assets/PrefabWindow.cs index 7a283e52d..659bab249 100644 --- a/Source/Editor/Windows/Assets/PrefabWindow.cs +++ b/Source/Editor/Windows/Assets/PrefabWindow.cs @@ -483,8 +483,8 @@ namespace FlaxEditor.Windows.Assets /// public override void OnLayoutSerialize(XmlWriter writer) { - writer.WriteAttributeString("Split1", _split1.SplitterValue.ToString()); - writer.WriteAttributeString("Split2", _split2.SplitterValue.ToString()); + LayoutSerializeSplitter(writer, "Split1", _split1); + LayoutSerializeSplitter(writer, "Split2", _split2); writer.WriteAttributeString("LiveReload", LiveReload.ToString()); writer.WriteAttributeString("GizmoMode", Viewport.TransformGizmo.ActiveMode.ToString()); } @@ -492,15 +492,10 @@ namespace FlaxEditor.Windows.Assets /// public override void OnLayoutDeserialize(XmlElement node) { - if (float.TryParse(node.GetAttribute("Split1"), out float value1)) - _split1.SplitterValue = value1; - - if (float.TryParse(node.GetAttribute("Split2"), out value1)) - _split2.SplitterValue = value1; - + LayoutDeserializeSplitter(node, "Split1", _split1); + LayoutDeserializeSplitter(node, "Split2", _split2); if (bool.TryParse(node.GetAttribute("LiveReload"), out bool value2)) LiveReload = value2; - if (Enum.TryParse(node.GetAttribute("GizmoMode"), out TransformGizmoBase.Mode value3)) Viewport.TransformGizmo.ActiveMode = value3; } diff --git a/Source/Editor/Windows/Assets/SceneAnimationWindow.cs b/Source/Editor/Windows/Assets/SceneAnimationWindow.cs index c85343158..824928743 100644 --- a/Source/Editor/Windows/Assets/SceneAnimationWindow.cs +++ b/Source/Editor/Windows/Assets/SceneAnimationWindow.cs @@ -989,7 +989,7 @@ namespace FlaxEditor.Windows.Assets /// public override void OnLayoutSerialize(XmlWriter writer) { - writer.WriteAttributeString("TimelineSplitter", _timeline.Splitter.SplitterValue.ToString()); + LayoutSerializeSplitter(writer, "TimelineSplitter", _timeline.Splitter); writer.WriteAttributeString("TimeShowMode", _timeline.TimeShowMode.ToString()); var id = _previewButton.Checked ? Guid.Empty : (_timeline.Player?.ID ?? _cachedPlayerId); writer.WriteAttributeString("SelectedPlayer", id.ToString()); @@ -1000,18 +1000,13 @@ namespace FlaxEditor.Windows.Assets /// public override void OnLayoutDeserialize(XmlElement node) { - if (float.TryParse(node.GetAttribute("TimelineSplitter"), out float value1)) - _timeline.Splitter.SplitterValue = value1; - + LayoutDeserializeSplitter(node, "TimelineSplitter", _timeline.Splitter); if (Guid.TryParse(node.GetAttribute("SelectedPlayer"), out Guid value2)) _cachedPlayerId = value2; - if (Enum.TryParse(node.GetAttribute("TimeShowMode"), out Timeline.TimeShowModes value3)) _timeline.TimeShowMode = value3; - if (bool.TryParse(node.GetAttribute("ShowPreviewValues"), out bool value4)) _timeline.ShowPreviewValues = value4; - if (bool.TryParse(node.GetAttribute("ShowSelected3dTrack"), out value4)) _timeline.ShowSelected3dTrack = value4; } diff --git a/Source/Editor/Windows/Assets/SkeletonMaskWindow.cs b/Source/Editor/Windows/Assets/SkeletonMaskWindow.cs index 507e9032d..23f229f65 100644 --- a/Source/Editor/Windows/Assets/SkeletonMaskWindow.cs +++ b/Source/Editor/Windows/Assets/SkeletonMaskWindow.cs @@ -82,7 +82,7 @@ namespace FlaxEditor.Windows.Assets var proxy = (PropertiesProxy)Values[0]; if (proxy.Asset == null || !proxy.Asset.IsLoaded) { - layout.Label("Loading..."); + layout.Label("Loading...", TextAlignment.Center); return; } @@ -304,14 +304,13 @@ namespace FlaxEditor.Windows.Assets /// public override void OnLayoutSerialize(XmlWriter writer) { - writer.WriteAttributeString("Split", _split.SplitterValue.ToString()); + LayoutSerializeSplitter(writer, "Split", _split); } /// public override void OnLayoutDeserialize(XmlElement node) { - if (float.TryParse(node.GetAttribute("Split"), out float value1)) - _split.SplitterValue = value1; + LayoutDeserializeSplitter(node, "Split", _split); } /// diff --git a/Source/Editor/Windows/Assets/SkinnedModelWindow.cs b/Source/Editor/Windows/Assets/SkinnedModelWindow.cs index a3439cbe9..d18593549 100644 --- a/Source/Editor/Windows/Assets/SkinnedModelWindow.cs +++ b/Source/Editor/Windows/Assets/SkinnedModelWindow.cs @@ -2,6 +2,8 @@ using System; using System.Collections.Generic; +using System.IO; +using System.Linq; using System.Reflection; using System.Threading; using System.Threading.Tasks; @@ -11,6 +13,8 @@ using FlaxEditor.CustomEditors; using FlaxEditor.CustomEditors.Elements; using FlaxEditor.CustomEditors.GUI; using FlaxEditor.GUI; +using FlaxEditor.GUI.ContextMenu; +using FlaxEditor.GUI.Tree; using FlaxEditor.Scripting; using FlaxEditor.Viewport.Cameras; using FlaxEditor.Viewport.Previews; @@ -173,7 +177,7 @@ namespace FlaxEditor.Windows.Assets var proxy = (MeshesPropertiesProxy)Values[0]; if (proxy.Asset == null || !proxy.Asset.IsLoaded) { - layout.Label("Loading..."); + layout.Label("Loading...", TextAlignment.Center); return; } proxy._materialSlotComboBoxes.Clear(); @@ -276,6 +280,8 @@ namespace FlaxEditor.Windows.Assets [CustomEditor(typeof(ProxyEditor))] private sealed class SkeletonPropertiesProxy : PropertiesProxyBase { + internal Tree NodesTree; + private class ProxyEditor : ProxyEditorBase { public override void Initialize(LayoutElementsContainer layout) @@ -283,7 +289,7 @@ namespace FlaxEditor.Windows.Assets var proxy = (SkeletonPropertiesProxy)Values[0]; if (proxy.Asset == null || !proxy.Asset.IsLoaded) { - layout.Label("Loading..."); + layout.Label("Loading...", TextAlignment.Center); return; } var lods = proxy.Asset.LODs; @@ -294,8 +300,10 @@ namespace FlaxEditor.Windows.Assets // Skeleton Bones { var group = layout.Group("Skeleton Bones"); + group.Panel.Close(); var tree = group.Tree(); + tree.TreeControl.RightClick += OnTreeNodeRightClick; for (int i = 0; i < bones.Length; i++) { if (bones[i].ParentIndex == -1) @@ -312,6 +320,7 @@ namespace FlaxEditor.Windows.Assets var group = layout.Group("Skeleton Nodes"); var tree = group.Tree(); + tree.TreeControl.RightClick += OnTreeNodeRightClick; for (int i = 0; i < nodes.Length; i++) { if (nodes[i].ParentIndex == -1) @@ -321,6 +330,7 @@ namespace FlaxEditor.Windows.Assets node.TreeNode.ExpandAll(true); } } + proxy.NodesTree = tree.TreeControl; } // Blend Shapes @@ -346,6 +356,22 @@ namespace FlaxEditor.Windows.Assets } } + private void OnTreeNodeRightClick(TreeNode node, Float2 location) + { + var menu = new ContextMenu(); + + var b = menu.AddButton("Copy name"); + b.Tag = node.Text; + b.ButtonClicked += OnTreeNodeCopyName; + + menu.Show(node, location); + } + + private void OnTreeNodeCopyName(ContextMenuButton b) + { + Clipboard.Text = (string)b.Tag; + } + private void BuildSkeletonBonesTree(SkeletonNode[] nodes, SkeletonBone[] bones, TreeNodeElement layout, int boneIndex) { for (int i = 0; i < bones.Length; i++) @@ -466,7 +492,7 @@ namespace FlaxEditor.Windows.Assets var proxy = (MaterialsPropertiesProxy)Values[0]; if (proxy.Asset == null || !proxy.Asset.IsLoaded) { - layout.Label("Loading..."); + layout.Label("Loading...", TextAlignment.Center); return; } @@ -527,7 +553,7 @@ namespace FlaxEditor.Windows.Assets var proxy = (UVsPropertiesProxy)Values[0]; if (proxy.Asset == null || !proxy.Asset.IsLoaded) { - layout.Label("Loading..."); + layout.Label("Loading...", TextAlignment.Center); return; } @@ -686,21 +712,24 @@ namespace FlaxEditor.Windows.Assets Render2D.PushClip(new Rectangle(Float2.Zero, size)); var meshDatas = Proxy.Window._meshDatas; - var lodIndex = Mathf.Clamp(_lod, 0, meshDatas.Length - 1); - var lod = meshDatas[lodIndex]; - var mesh = Mathf.Clamp(_mesh, -1, lod.Length - 1); - if (mesh == -1) + if (meshDatas.Length != 0) { - for (int meshIndex = 0; meshIndex < lod.Length; meshIndex++) + var lodIndex = Mathf.Clamp(_lod, 0, meshDatas.Length - 1); + var lod = meshDatas[lodIndex]; + var mesh = Mathf.Clamp(_mesh, -1, lod.Length - 1); + if (mesh == -1) { - if (_isolateIndex != -1 && _isolateIndex != meshIndex) - continue; - DrawMeshUVs(meshIndex, lod[meshIndex]); + for (int meshIndex = 0; meshIndex < lod.Length; meshIndex++) + { + if (_isolateIndex != -1 && _isolateIndex != meshIndex) + continue; + DrawMeshUVs(meshIndex, lod[meshIndex]); + } + } + else + { + DrawMeshUVs(mesh, lod[mesh]); } - } - else - { - DrawMeshUVs(mesh, lod[mesh]); } Render2D.PopClip(); @@ -723,6 +752,230 @@ namespace FlaxEditor.Windows.Assets } } + [CustomEditor(typeof(ProxyEditor))] + private sealed class RetargetPropertiesProxy : PropertiesProxyBase + { + internal class SetupProxy + { + public SkinnedModel Skeleton; + public Dictionary NodesMapping; + } + + internal Dictionary Setups; + + public override void OnSave() + { + base.OnSave(); + + if (Setups != null) + { + var retargetSetups = new SkinnedModel.SkeletonRetarget[Setups.Count]; + int i = 0; + foreach (var setup in Setups) + { + retargetSetups[i++] = new SkinnedModel.SkeletonRetarget + { + SourceAsset = setup.Key?.ID ?? Guid.Empty, + SkeletonAsset = setup.Value.Skeleton?.ID ?? Guid.Empty, + NodesMapping = setup.Value.NodesMapping, + }; + } + Window.Asset.SkeletonRetargets = retargetSetups; + } + } + + private class ProxyEditor : ProxyEditorBase + { + public override void Initialize(LayoutElementsContainer layout) + { + var proxy = (RetargetPropertiesProxy)Values[0]; + if (proxy.Asset == null || !proxy.Asset.IsLoaded) + { + layout.Label("Loading...", TextAlignment.Center); + return; + } + if (proxy.Setups == null) + { + proxy.Setups = new Dictionary(); + var retargetSetups = proxy.Asset.SkeletonRetargets; + foreach (var retargetSetup in retargetSetups) + { + var sourceAsset = FlaxEngine.Content.LoadAsync(retargetSetup.SourceAsset); + if (sourceAsset) + { + proxy.Setups.Add(sourceAsset, new SetupProxy + { + Skeleton = FlaxEngine.Content.LoadAsync(retargetSetup.SkeletonAsset), + NodesMapping = retargetSetup.NodesMapping, + }); + } + } + } + var targetNodes = proxy.Asset.Nodes; + + layout.Space(10.0f); + var infoLabel = layout.Label("Each retarget setup defines how to convert animated skeleton pose from a source asset to this skinned model skeleton. It allows to play animation from different skeleton on this skeleton. See documentation to learn more.").Label; + infoLabel.Wrapping = TextWrapping.WrapWords; + infoLabel.AutoHeight = true; + layout.Space(10.0f); + + // New setup + { + var setupGroup = layout.Group("New setup"); + infoLabel = setupGroup.Label("Select model or animation asset to add new retarget source", TextAlignment.Center).Label; + infoLabel.Wrapping = TextWrapping.WrapWords; + infoLabel.AutoHeight = true; + var sourceAssetPicker = setupGroup.AddPropertyItem("Source Asset").Custom().CustomControl; + sourceAssetPicker.Height = 48; + sourceAssetPicker.CheckValid = CheckSourceAssetValid; + sourceAssetPicker.SelectedItemChanged += () => + { + proxy.Setups.Add(sourceAssetPicker.SelectedAsset, new SetupProxy()); + proxy.Window.MarkAsEdited(); + RebuildLayout(); + }; + } + + // Setups + foreach (var setup in proxy.Setups) + { + var sourceAsset = setup.Key; + if (sourceAsset == null) + continue; + var setupGroup = layout.Group(Path.GetFileNameWithoutExtension(sourceAsset.Path)); + var settingsButton = setupGroup.AddSettingsButton(); + settingsButton.Tag = sourceAsset; + settingsButton.Clicked += OnShowSetupSettings; + + // Source asset picker + var sourceAssetPicker = setupGroup.AddPropertyItem("Source Asset").Custom().CustomControl; + sourceAssetPicker.SelectedAsset = sourceAsset; + sourceAssetPicker.CanEdit = false; + sourceAssetPicker.Height = 48; + + if (sourceAsset is SkinnedModel sourceModel) + { + // Initialize nodes mapping structure + if (sourceModel.WaitForLoaded()) + continue; + var sourceNodes = sourceModel.Nodes; + if (setup.Value.NodesMapping == null) + setup.Value.NodesMapping = new Dictionary(); + var nodesMapping = setup.Value.NodesMapping; + foreach (var targetNode in targetNodes) + { + if (!nodesMapping.ContainsKey(targetNode.Name)) + { + var node = string.Empty; + foreach (var sourceNode in sourceNodes) + { + if (string.Equals(targetNode.Name, sourceNode.Name, StringComparison.OrdinalIgnoreCase)) + { + node = sourceNode.Name; + break; + } + } + nodesMapping.Add(targetNode.Name, node); + } + } + + // Build source skeleton nodes list (with hierarchy indentation) + var items = new string[sourceNodes.Length + 1]; + items[0] = string.Empty; + for (int i = 0; i < sourceNodes.Length; i++) + items[i + 1] = sourceNodes[i].Name; + + // Show combo boxes with this skeleton nodes to retarget from + foreach (var targetNode in targetNodes) + { + var nodeName = targetNode.Name; + var propertyName = nodeName; + var tmp = targetNode.ParentIndex; + while (tmp != -1) + { + tmp = targetNodes[tmp].ParentIndex; + propertyName = " " + propertyName; + } + var comboBox = setupGroup.AddPropertyItem(propertyName).Custom().CustomControl; + comboBox.AddItems(items); + comboBox.Tag = new KeyValuePair(nodeName, sourceAsset); + comboBox.SelectedItem = nodesMapping[nodeName]; + if (comboBox.SelectedIndex == -1) + comboBox.SelectedIndex = 0; // Auto-select empty node + comboBox.SelectedIndexChanged += OnSelectedNodeChanged; + } + } + else if (sourceAsset is Animation sourceAnimation) + { + // Show skeleton asset picker + var sourceSkeletonPicker = setupGroup.AddPropertyItem("Skeleton", "Skinned model that contains a skeleton for this animation retargeting.").Custom().CustomControl; + sourceSkeletonPicker.AssetType = new ScriptType(typeof(SkinnedModel)); + sourceSkeletonPicker.SelectedAsset = setup.Value.Skeleton; + sourceSkeletonPicker.Height = 48; + sourceSkeletonPicker.SelectedItemChanged += () => + { + setup.Value.Skeleton = (SkinnedModel)sourceSkeletonPicker.SelectedAsset; + proxy.Window.MarkAsEdited(); + }; + } + } + } + + private void OnSelectedNodeChanged(ComboBox comboBox) + { + var proxy = (RetargetPropertiesProxy)Values[0]; + var sourceAsset = ((KeyValuePair)comboBox.Tag).Value; + var nodeMappingKey = ((KeyValuePair)comboBox.Tag).Key; + var nodeMappingValue = comboBox.SelectedItem; + // TODO: check for recursion in setup + proxy.Setups[sourceAsset].NodesMapping[nodeMappingKey] = nodeMappingValue; + proxy.Window.MarkAsEdited(); + } + + private void OnShowSetupSettings(Image settingsButton, MouseButton button) + { + if (button == MouseButton.Left) + { + var sourceAsset = (Asset)settingsButton.Tag; + var menu = new ContextMenu { Tag = sourceAsset }; + menu.AddButton("Clear", OnClearSetup); + menu.AddButton("Remove", OnRemoveSetup).Icon = Editor.Instance.Icons.Cross12; + menu.Show(settingsButton, new Float2(0, settingsButton.Height)); + } + } + + private void OnClearSetup(ContextMenuButton button) + { + var proxy = (RetargetPropertiesProxy)Values[0]; + var sourceAsset = (Asset)button.ParentContextMenu.Tag; + var setup = proxy.Setups[sourceAsset]; + setup.Skeleton = null; + foreach (var e in setup.NodesMapping.Keys.ToArray()) + setup.NodesMapping[e] = string.Empty; + proxy.Window.MarkAsEdited(); + RebuildLayout(); + } + + private void OnRemoveSetup(ContextMenuButton button) + { + var proxy = (RetargetPropertiesProxy)Values[0]; + var sourceAsset = (Asset)button.ParentContextMenu.Tag; + proxy.Setups.Remove(sourceAsset); + proxy.Window.MarkAsEdited(); + RebuildLayout(); + } + + private bool CheckSourceAssetValid(ContentItem item) + { + var proxy = (RetargetPropertiesProxy)Values[0]; + return item is BinaryAssetItem binaryItem && + (binaryItem.Type == typeof(SkinnedModel) || binaryItem.Type == typeof(Animation)) && + item != proxy.Window.Item && + !proxy.Setups.ContainsKey(binaryItem.LoadAsync()); + } + } + } + [CustomEditor(typeof(ProxyEditor))] private sealed class ImportPropertiesProxy : PropertiesProxyBase { @@ -733,7 +986,7 @@ namespace FlaxEditor.Windows.Assets { base.OnLoad(window); - ModelImportSettings.TryRestore(ref ImportSettings, window.Item.Path); + Editor.TryRestoreImportOptions(ref ImportSettings.Settings, window.Item.Path); } public void Reimport() @@ -748,7 +1001,7 @@ namespace FlaxEditor.Windows.Assets var proxy = (ImportPropertiesProxy)Values[0]; if (proxy.Asset == null || !proxy.Asset.IsLoaded) { - layout.Label("Loading..."); + layout.Label("Loading...", TextAlignment.Center); return; } @@ -785,6 +1038,21 @@ namespace FlaxEditor.Windows.Assets { Proxy = new SkeletonPropertiesProxy(); Presenter.Select(Proxy); + window._preview.CustomDebugDraw += OnDebugDraw; + } + + private void OnDebugDraw(GPUContext context, ref RenderContext renderContext) + { + var proxy = (SkeletonPropertiesProxy)Proxy; + if (proxy.NodesTree != null) + { + // Draw selected skeleton nodes + foreach (var node in proxy.NodesTree.Selection) + { + proxy.Window._preview.PreviewActor.GetNodeTransformation(node.Text, out var nodeTransformation, true); + DebugDraw.DrawWireSphere(new BoundingSphere(nodeTransformation.TranslationVector, 4.0f), Color.Red, 0.0f, false); + } + } } } @@ -808,6 +1076,16 @@ namespace FlaxEditor.Windows.Assets } } + private class RetargetTab : Tab + { + public RetargetTab(SkinnedModelWindow window) + : base("Retarget", window) + { + Proxy = new RetargetPropertiesProxy(); + Presenter.Select(Proxy); + } + } + private class ImportTab : Tab { public ImportTab(SkinnedModelWindow window) @@ -855,6 +1133,7 @@ namespace FlaxEditor.Windows.Assets _tabs.AddTab(new SkeletonTab(this)); _tabs.AddTab(new MaterialsTab(this)); _tabs.AddTab(new UVsTab(this)); + _tabs.AddTab(new RetargetTab(this)); _tabs.AddTab(new ImportTab(this)); // Highlight actor (used to highlight selected material slot, see UpdateEffectsOnAsset) @@ -996,6 +1275,14 @@ namespace FlaxEditor.Windows.Assets { if (!IsEdited) return; + if (_asset.WaitForLoaded()) + return; + + foreach (var child in _tabs.Children) + { + if (child is Tab tab && tab.Proxy.Window != null) + tab.Proxy.OnSave(); + } if (_asset.Save()) { @@ -1030,7 +1317,7 @@ namespace FlaxEditor.Windows.Assets protected override void OnAssetLoaded() { _refreshOnLODsLoaded = true; - _preview.ViewportCamera.SetArcBallView(Asset.GetBox()); + _preview.ViewportCamera.SetArcBallView(_preview.GetBounds()); UpdateEffectsOnAsset(); // TODO: disable streaming for this model diff --git a/Source/Editor/Windows/Assets/SpriteAtlasWindow.cs b/Source/Editor/Windows/Assets/SpriteAtlasWindow.cs index ecd031d48..7d09620d5 100644 --- a/Source/Editor/Windows/Assets/SpriteAtlasWindow.cs +++ b/Source/Editor/Windows/Assets/SpriteAtlasWindow.cs @@ -103,7 +103,7 @@ namespace FlaxEditor.Windows.Assets public SpriteEntry[] Sprites; [EditorOrder(1000), EditorDisplay("Import Settings", EditorDisplayAttribute.InlineStyle)] - public TextureImportSettings ImportSettings = new TextureImportSettings(); + public FlaxEngine.Tools.TextureTool.Options ImportSettings = new(); public sealed class ProxyEditor : GenericEditor { @@ -183,11 +183,7 @@ namespace FlaxEditor.Windows.Assets UpdateSprites(); // Try to restore target asset texture import options (useful for fast reimport) - if (TextureImportEntry.Internal_GetTextureImportOptions(win.Item.Path, out TextureImportSettings.InternalOptions options)) - { - // Restore settings - ImportSettings.FromInternal(ref options); - } + Editor.TryRestoreImportOptions(ref ImportSettings, win.Item.Path); // Prepare restore data PeekState(); @@ -269,7 +265,7 @@ namespace FlaxEditor.Windows.Assets { var sprite = new Sprite { - Name = StringUtils.IncrementNameNumber("New Sprite", name => Asset.Sprites.All(s => s.Name != name)), + Name = Utilities.Utils.IncrementNameNumber("New Sprite", name => Asset.Sprites.All(s => s.Name != name)), Area = new Rectangle(Float2.Zero, Float2.One), }; Asset.AddSprite(sprite); @@ -366,14 +362,13 @@ namespace FlaxEditor.Windows.Assets /// public override void OnLayoutSerialize(XmlWriter writer) { - writer.WriteAttributeString("Split", _split.SplitterValue.ToString()); + LayoutSerializeSplitter(writer, "Split", _split); } /// public override void OnLayoutDeserialize(XmlElement node) { - if (float.TryParse(node.GetAttribute("Split"), out float value1)) - _split.SplitterValue = value1; + LayoutDeserializeSplitter(node, "Split", _split); } /// diff --git a/Source/Editor/Windows/Assets/TextureWindow.cs b/Source/Editor/Windows/Assets/TextureWindow.cs index 3b1f1911c..80786f1ed 100644 --- a/Source/Editor/Windows/Assets/TextureWindow.cs +++ b/Source/Editor/Windows/Assets/TextureWindow.cs @@ -70,7 +70,7 @@ namespace FlaxEditor.Windows.Assets internal TextureWindow _window; [EditorOrder(1000), EditorDisplay("Import Settings", EditorDisplayAttribute.InlineStyle)] - public TextureImportSettings ImportSettings = new TextureImportSettings(); + public FlaxEngine.Tools.TextureTool.Options ImportSettings = new(); /// /// Gathers parameters from the specified texture. @@ -82,7 +82,7 @@ namespace FlaxEditor.Windows.Assets _window = window; // Try to restore target asset texture import options (useful for fast reimport) - TextureImportSettings.TryRestore(ref ImportSettings, window.Item.Path); + Editor.TryRestoreImportOptions(ref ImportSettings, window.Item.Path); // Prepare restore data PeekState(); @@ -245,14 +245,13 @@ namespace FlaxEditor.Windows.Assets /// public override void OnLayoutSerialize(XmlWriter writer) { - writer.WriteAttributeString("Split", _split.SplitterValue.ToString()); + LayoutSerializeSplitter(writer, "Split", _split); } /// public override void OnLayoutDeserialize(XmlElement node) { - if (float.TryParse(node.GetAttribute("Split"), out float value1)) - _split.SplitterValue = value1; + LayoutDeserializeSplitter(node, "Split", _split); } /// diff --git a/Source/Editor/Windows/Assets/VisualScriptWindow.cs b/Source/Editor/Windows/Assets/VisualScriptWindow.cs index 6c2ec72b0..ed20b591e 100644 --- a/Source/Editor/Windows/Assets/VisualScriptWindow.cs +++ b/Source/Editor/Windows/Assets/VisualScriptWindow.cs @@ -16,6 +16,7 @@ using FlaxEditor.Surface; using FlaxEngine; using FlaxEngine.GUI; using FlaxEngine.Json; +using FlaxEngine.Utilities; using FlaxEngine.Windows.Search; #pragma warning disable 649 @@ -818,7 +819,7 @@ namespace FlaxEditor.Windows.Assets var state = (BreakpointHangState)Editor.Instance.Simulation.BreakpointHangTag; if (state.Locals == null) { - state.Locals = Editor.Internal_GetVisualScriptLocals(); + state.Locals = Editor.Internal_GetVisualScriptLocals(out var _); Editor.Instance.Simulation.BreakpointHangTag = state; } return state; @@ -829,7 +830,7 @@ namespace FlaxEditor.Windows.Assets var state = (BreakpointHangState)Editor.Instance.Simulation.BreakpointHangTag; if (state.StackFrames == null) { - state.StackFrames = Editor.Internal_GetVisualScriptStackFrames(); + state.StackFrames = Editor.Internal_GetVisualScriptStackFrames(out var _); Editor.Instance.Simulation.BreakpointHangTag = state; } return state; @@ -1370,14 +1371,13 @@ namespace FlaxEditor.Windows.Assets /// public override void OnLayoutSerialize(XmlWriter writer) { - writer.WriteAttributeString("Split", _split.SplitterValue.ToString()); + LayoutSerializeSplitter(writer, "Split", _split); } /// public override void OnLayoutDeserialize(XmlElement node) { - if (float.TryParse(node.GetAttribute("Split"), out float value1)) - _split.SplitterValue = value1; + LayoutDeserializeSplitter(node, "Split", _split); } /// diff --git a/Source/Editor/Windows/ContentWindow.cs b/Source/Editor/Windows/ContentWindow.cs index 207abb84f..f993b79f9 100644 --- a/Source/Editor/Windows/ContentWindow.cs +++ b/Source/Editor/Windows/ContentWindow.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.Xml; using FlaxEditor.Content; @@ -26,6 +27,7 @@ namespace FlaxEditor.Windows { private const string ProjectDataLastViewedFolder = "LastViewedFolder"; private bool _isWorkspaceDirty; + private string _workspaceRebuildLocation; private SplitPanel _split; private Panel _contentViewPanel; private Panel _contentTreePanel; @@ -74,7 +76,23 @@ namespace FlaxEditor.Windows // Content database events editor.ContentDatabase.WorkspaceModified += () => _isWorkspaceDirty = true; - editor.ContentDatabase.ItemRemoved += ContentDatabaseOnItemRemoved; + editor.ContentDatabase.ItemRemoved += OnContentDatabaseItemRemoved; + editor.ContentDatabase.WorkspaceRebuilding += () => { _workspaceRebuildLocation = SelectedNode?.Path; }; + editor.ContentDatabase.WorkspaceRebuilt += () => + { + var selected = Editor.ContentDatabase.Find(_workspaceRebuildLocation); + if (selected is ContentFolder selectedFolder) + { + _navigationUnlocked = false; + RefreshView(selectedFolder.Node); + _tree.Select(selectedFolder.Node); + UpdateItemsSearch(); + _navigationUnlocked = true; + UpdateUI(); + } + else + ShowRoot(); + }; var options = Editor.Options; options.OptionsChanged += OnOptionsChanged; @@ -534,12 +552,12 @@ namespace FlaxEditor.Windows string destinationName; if (item.IsFolder) { - destinationName = StringUtils.IncrementNameNumber(item.ShortName, x => !Directory.Exists(StringUtils.CombinePaths(sourceFolder, x))); + destinationName = Utilities.Utils.IncrementNameNumber(item.ShortName, x => !Directory.Exists(StringUtils.CombinePaths(sourceFolder, x))); } else { string extension = Path.GetExtension(sourcePath); - destinationName = StringUtils.IncrementNameNumber(item.ShortName, x => !File.Exists(StringUtils.CombinePaths(sourceFolder, x + extension))) + extension; + destinationName = Utilities.Utils.IncrementNameNumber(item.ShortName, x => !File.Exists(StringUtils.CombinePaths(sourceFolder, x + extension))) + extension; } return StringUtils.NormalizePath(StringUtils.CombinePaths(sourceFolder, destinationName)); @@ -736,7 +754,7 @@ namespace FlaxEditor.Windows } } - private void ContentDatabaseOnItemRemoved(ContentItem contentItem) + private void OnContentDatabaseItemRemoved(ContentItem contentItem) { if (contentItem is ContentFolder folder) { @@ -1032,8 +1050,8 @@ namespace FlaxEditor.Windows /// public override void OnLayoutSerialize(XmlWriter writer) { - writer.WriteAttributeString("Split", _split.SplitterValue.ToString()); - writer.WriteAttributeString("Scale", _view.ViewScale.ToString()); + LayoutSerializeSplitter(writer, "Split", _split); + writer.WriteAttributeString("Scale", _view.ViewScale.ToString(CultureInfo.InvariantCulture)); writer.WriteAttributeString("ShowFileExtensions", _view.ShowFileExtensions.ToString()); writer.WriteAttributeString("ViewType", _view.ViewType.ToString()); } @@ -1041,15 +1059,11 @@ namespace FlaxEditor.Windows /// public override void OnLayoutDeserialize(XmlElement node) { - if (float.TryParse(node.GetAttribute("Split"), out float value1)) - _split.SplitterValue = value1; - - if (float.TryParse(node.GetAttribute("Scale"), out value1)) + LayoutDeserializeSplitter(node, "Split", _split); + if (float.TryParse(node.GetAttribute("Scale"), CultureInfo.InvariantCulture, out var value1)) _view.ViewScale = value1; - if (bool.TryParse(node.GetAttribute("ShowFileExtensions"), out bool value2)) _view.ShowFileExtensions = value2; - if (Enum.TryParse(node.GetAttribute("ViewType"), out ContentViewType viewType)) _view.ViewType = viewType; } diff --git a/Source/Editor/Windows/DebugLogWindow.cs b/Source/Editor/Windows/DebugLogWindow.cs index b1136523a..b02f63f87 100644 --- a/Source/Editor/Windows/DebugLogWindow.cs +++ b/Source/Editor/Windows/DebugLogWindow.cs @@ -673,14 +673,13 @@ namespace FlaxEditor.Windows /// public override void OnLayoutSerialize(XmlWriter writer) { - writer.WriteAttributeString("Split", _split.SplitterValue.ToString()); + LayoutSerializeSplitter(writer, "Split", _split); } /// public override void OnLayoutDeserialize(XmlElement node) { - if (float.TryParse(node.GetAttribute("Split"), out float value1)) - _split.SplitterValue = value1; + LayoutDeserializeSplitter(node, "Split", _split); } /// diff --git a/Source/Editor/Windows/GameCookerWindow.cs b/Source/Editor/Windows/GameCookerWindow.cs index 0c602422b..f3fd753d1 100644 --- a/Source/Editor/Windows/GameCookerWindow.cs +++ b/Source/Editor/Windows/GameCookerWindow.cs @@ -47,6 +47,7 @@ namespace FlaxEditor.Windows { PlatformType.Switch, new Switch() }, { PlatformType.PS5, new PS5() }, { PlatformType.Mac, new Mac() }, + { PlatformType.iOS, new iOS() }, }; public BuildTabProxy(GameCookerWindow win, PlatformSelector platformSelector) @@ -64,6 +65,7 @@ namespace FlaxEditor.Windows PerPlatformOptions[PlatformType.Switch].Init("Output/Switch", "Switch"); PerPlatformOptions[PlatformType.PS5].Init("Output/PS5", "PS5"); PerPlatformOptions[PlatformType.Mac].Init("Output/Mac", "Mac"); + PerPlatformOptions[PlatformType.iOS].Init("Output/iOS", "iOS"); } [HideInEditor] @@ -109,6 +111,8 @@ namespace FlaxEditor.Windows switch (BuildPlatform) { case BuildPlatform.MacOSx64: + case BuildPlatform.MacOSARM64: + case BuildPlatform.iOSARM64: IsSupported = false; break; default: @@ -130,6 +134,8 @@ namespace FlaxEditor.Windows switch (BuildPlatform) { case BuildPlatform.MacOSx64: + case BuildPlatform.MacOSARM64: + case BuildPlatform.iOSARM64: case BuildPlatform.AndroidARM64: IsSupported = true; break; @@ -228,7 +234,22 @@ namespace FlaxEditor.Windows class Mac : Platform { - protected override BuildPlatform BuildPlatform => BuildPlatform.MacOSx64; + public enum Archs + { + [EditorDisplay(null, "arm64")] + ARM64, + [EditorDisplay(null, "x64")] + x64, + } + + public Archs CPU = Archs.ARM64; + + protected override BuildPlatform BuildPlatform => CPU == Archs.ARM64 ? BuildPlatform.MacOSARM64 : BuildPlatform.MacOSx64; + } + + class iOS : Platform + { + protected override BuildPlatform BuildPlatform => BuildPlatform.iOSARM64; } class Editor : CustomEditor @@ -259,7 +280,7 @@ namespace FlaxEditor.Windows break; case PlatformType.UWP: name = "Windows Store"; - layout.Label("UWP (Windows Store) platform has been deprecated and soon will be removed!", TextAlignment.Center).Label.TextColor = Color.Red; + layout.Label("UWP (Windows Store) platform has been deprecated and is no longer supported", TextAlignment.Center).Label.TextColor = Color.Red; break; case PlatformType.Linux: name = "Linux"; @@ -282,6 +303,9 @@ namespace FlaxEditor.Windows case PlatformType.Mac: name = "Mac"; break; + case PlatformType.iOS: + name = "iOS"; + break; default: name = Utilities.Utils.GetPropertyNameUI(_platform.ToString()); break; @@ -569,7 +593,13 @@ namespace FlaxEditor.Windows { var tmpBat = StringUtils.CombinePaths(Globals.TemporaryFolder, Guid.NewGuid().ToString("N") + ".bat"); File.WriteAllText(tmpBat, command); - Platform.StartProcess(tmpBat, null, null, true, true); + var procSettings = new CreateProcessSettings + { + FileName = tmpBat, + HiddenWindow = true, + WaitForEnd = true, + }; + Platform.CreateProcess(ref procSettings); File.Delete(tmpBat); } catch (Exception ex) diff --git a/Source/Editor/Windows/OutputLogWindow.cs b/Source/Editor/Windows/OutputLogWindow.cs index f2f3b4aff..0b2249a33 100644 --- a/Source/Editor/Windows/OutputLogWindow.cs +++ b/Source/Editor/Windows/OutputLogWindow.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Runtime.InteropServices; using System.Text; using System.Text.RegularExpressions; using System.Xml; @@ -366,7 +367,7 @@ namespace FlaxEditor.Windows // Try to add the line for multi-line logs if (_entries.Count != 0 && !line.StartsWith("======")) { - ref var last = ref Utils.ExtractArrayFromList(_entries)[_entries.Count - 1]; + ref var last = ref CollectionsMarshal.AsSpan(_entries)[_entries.Count - 1]; last.Message += '\n'; last.Message += line; } @@ -445,7 +446,7 @@ namespace FlaxEditor.Windows int logCount; do { - logCount = Editor.Internal_ReadOutputLogs(_outMessages, _outLogTypes, _outLogTimes); + logCount = Editor.Internal_ReadOutputLogs(ref _outMessages, ref _outLogTypes, ref _outLogTimes, OutCapacity); for (int i = 0; i < logCount; i++) { @@ -471,7 +472,7 @@ namespace FlaxEditor.Windows _output.ErrorStyle.Font.GetFont(); // Generate the output log - var entries = Utils.ExtractArrayFromList(_entries); + Span entries = CollectionsMarshal.AsSpan(_entries); var searchQuery = _searchBox.Text; for (int i = _textBufferCount; i < _entries.Count; i++) { diff --git a/Source/Editor/Windows/Profiler/CPU.cs b/Source/Editor/Windows/Profiler/CPU.cs index 3324fddac..36fbf21f4 100644 --- a/Source/Editor/Windows/Profiler/CPU.cs +++ b/Source/Editor/Windows/Profiler/CPU.cs @@ -19,16 +19,16 @@ namespace FlaxEngine { get { - fixed (char* name = &Name0) + fixed (short* name = Name0) { - return new string(name); + return new string((char*)name); } } } internal unsafe bool NameStartsWith(string prefix) { - fixed (char* name = &Name0) + fixed (short* name = Name0) { fixed (char* p = prefix) { diff --git a/Source/Editor/Windows/Profiler/Memory.cs b/Source/Editor/Windows/Profiler/Memory.cs index 6541fd723..f087da88e 100644 --- a/Source/Editor/Windows/Profiler/Memory.cs +++ b/Source/Editor/Windows/Profiler/Memory.cs @@ -61,7 +61,7 @@ namespace FlaxEditor.Windows.Profiler { // Count memory allocated during last frame int nativeMemoryAllocation = 0; - int managedMemoryAllocation = 0; + int managedMemoryAllocation = sharedData.ManagedMemoryAllocation; var events = sharedData.GetEventsCPU(); var length = events?.Length ?? 0; for (int i = 0; i < length; i++) diff --git a/Source/Editor/Windows/Profiler/Physics.cs b/Source/Editor/Windows/Profiler/Physics.cs new file mode 100644 index 000000000..b2f52462d --- /dev/null +++ b/Source/Editor/Windows/Profiler/Physics.cs @@ -0,0 +1,113 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +using FlaxEngine; +using FlaxEngine.GUI; + +namespace FlaxEditor.Windows.Profiler +{ + /// + /// The physics simulation profiling mode. + /// + /// + internal sealed class Physics : ProfilerMode + { + private readonly SingleChart _activeBodiesChart; + private readonly SingleChart _activeJointsChart; + private readonly SingleChart _dynamicBodiesChart; + private readonly SingleChart _staticBodiesChart; + private readonly SingleChart _newPairsChart; + private readonly SingleChart _newTouchesChart; + + public Physics() + : base("Physics") + { + // Layout + var panel = new Panel(ScrollBars.Vertical) + { + AnchorPreset = AnchorPresets.StretchAll, + Offsets = Margin.Zero, + Parent = this, + }; + var layout = new VerticalPanel + { + AnchorPreset = AnchorPresets.HorizontalStretchTop, + Offsets = Margin.Zero, + IsScrollable = true, + Parent = panel, + }; + + // Charts + _activeBodiesChart = new SingleChart + { + Title = "Active Bodies", + Parent = layout, + }; + _activeBodiesChart.SelectedSampleChanged += OnSelectedSampleChanged; + _activeJointsChart = new SingleChart + { + Title = "Active Joints", + Parent = layout, + }; + _activeJointsChart.SelectedSampleChanged += OnSelectedSampleChanged; + _dynamicBodiesChart = new SingleChart + { + Title = "Dynamic Bodies", + Parent = layout, + }; + _dynamicBodiesChart.SelectedSampleChanged += OnSelectedSampleChanged; + _staticBodiesChart = new SingleChart + { + Title = "Static Bodies", + Parent = layout, + }; + _staticBodiesChart.SelectedSampleChanged += OnSelectedSampleChanged; + _newPairsChart = new SingleChart + { + Title = "New Pairs", + Parent = layout, + }; + _newPairsChart.SelectedSampleChanged += OnSelectedSampleChanged; + _newTouchesChart = new SingleChart + { + Title = "New Touches", + Parent = layout, + }; + _newTouchesChart.SelectedSampleChanged += OnSelectedSampleChanged; + } + + /// + public override void Clear() + { + _activeBodiesChart.Clear(); + _activeJointsChart.Clear(); + _dynamicBodiesChart.Clear(); + _staticBodiesChart.Clear(); + _newPairsChart.Clear(); + _newTouchesChart.Clear(); + } + + /// + public override void Update(ref SharedUpdateData sharedData) + { + PhysicsStatistics statistics = FlaxEngine.Physics.DefaultScene.Statistics; + + _activeBodiesChart.AddSample(statistics.ActiveDynamicBodies + statistics.ActiveKinematicBodies); + _activeJointsChart.AddSample(statistics.ActiveJoints); + _dynamicBodiesChart.AddSample(statistics.DynamicBodies + statistics.KinematicBodies); + _staticBodiesChart.AddSample(statistics.StaticBodies); + _newPairsChart.AddSample(statistics.NewPairs); + _newTouchesChart.AddSample(statistics.NewTouches); + } + + /// + public override void UpdateView(int selectedFrame, bool showOnlyLastUpdateEvents) + { + _activeBodiesChart.SelectedSampleIndex = selectedFrame; + _activeJointsChart.SelectedSampleIndex = selectedFrame; + _dynamicBodiesChart.SelectedSampleIndex = selectedFrame; + _staticBodiesChart.SelectedSampleIndex = selectedFrame; + _newPairsChart.SelectedSampleIndex = selectedFrame; + _newTouchesChart.SelectedSampleIndex = selectedFrame; + } + } +} diff --git a/Source/Editor/Windows/Profiler/ProfilerMode.cs b/Source/Editor/Windows/Profiler/ProfilerMode.cs index 45a5723a2..0cc1a39ee 100644 --- a/Source/Editor/Windows/Profiler/ProfilerMode.cs +++ b/Source/Editor/Windows/Profiler/ProfilerMode.cs @@ -24,6 +24,11 @@ namespace FlaxEditor.Windows.Profiler /// public ProfilingTools.MainStats Stats; + /// + /// The additional managed memory allocation size during this update. Given value is in bytes. + /// + public int ManagedMemoryAllocation; + /// /// Gets the collected CPU events by the profiler from local or remote session. /// diff --git a/Source/Editor/Windows/Profiler/ProfilerWindow.cs b/Source/Editor/Windows/Profiler/ProfilerWindow.cs index deffd00bb..f5a5c6f86 100644 --- a/Source/Editor/Windows/Profiler/ProfilerWindow.cs +++ b/Source/Editor/Windows/Profiler/ProfilerWindow.cs @@ -24,6 +24,8 @@ namespace FlaxEditor.Windows.Profiler private int _frameIndex = -1; private int _framesCount; private bool _showOnlyLastUpdateEvents = true; + private long _lastManagedMemory = 0; + private long _lastManagedMemoryProfiler = 0; /// /// Gets or sets a value indicating whether live events recording is enabled. @@ -144,6 +146,7 @@ namespace FlaxEditor.Windows.Profiler { _frameIndex = -1; _framesCount = 0; + _lastManagedMemory = 0; for (int i = 0; i < _tabs.ChildrenCount; i++) { if (_tabs.Children[i] is ProfilerMode mode) @@ -198,6 +201,7 @@ namespace FlaxEditor.Windows.Profiler AddMode(new Memory()); AddMode(new Assets()); AddMode(new Network()); + AddMode(new Physics()); // Init view _frameIndex = -1; @@ -219,8 +223,16 @@ namespace FlaxEditor.Windows.Profiler { FlaxEngine.Profiler.BeginEvent("ProfilerWindow.OnUpdate"); + // Get memory allocations during last frame + long managedMemory = GC.GetAllocatedBytesForCurrentThread(); + if (_lastManagedMemory == 0) + _lastManagedMemory = managedMemory; + var managedAllocs = managedMemory - _lastManagedMemory - _lastManagedMemoryProfiler; + _lastManagedMemory = managedMemory; + ProfilerMode.SharedUpdateData sharedData = new ProfilerMode.SharedUpdateData(); sharedData.Begin(); + sharedData.ManagedMemoryAllocation = (int)managedAllocs; for (int i = 0; i < _tabs.ChildrenCount; i++) { if (_tabs.Children[i] is ProfilerMode mode) @@ -243,6 +255,10 @@ namespace FlaxEditor.Windows.Profiler _framesCount = Mathf.Min(_framesCount + 1, ProfilerMode.MaxSamples); UpdateButtons(); + // Get memory allocations within profiler window update to exclude from stats + managedMemory = GC.GetAllocatedBytesForCurrentThread(); + _lastManagedMemoryProfiler = managedMemory - _lastManagedMemory; + FlaxEngine.Profiler.EndEvent(); } } diff --git a/Source/Editor/Windows/SceneTreeWindow.cs b/Source/Editor/Windows/SceneTreeWindow.cs index 532f400a3..609f98f83 100644 --- a/Source/Editor/Windows/SceneTreeWindow.cs +++ b/Source/Editor/Windows/SceneTreeWindow.cs @@ -168,7 +168,7 @@ namespace FlaxEditor.Windows actor.Transform = parentActor.Transform; // Rename actor to identify it easily - actor.Name = StringUtils.IncrementNameNumber(type.Name, x => parentActor.GetChild(x) == null); + actor.Name = Utilities.Utils.IncrementNameNumber(type.Name, x => parentActor.GetChild(x) == null); } // Spawn it diff --git a/Source/Editor/Windows/Search/ContentSearchWindow.cs b/Source/Editor/Windows/Search/ContentSearchWindow.cs index 5ee3ff11c..e6e407247 100644 --- a/Source/Editor/Windows/Search/ContentSearchWindow.cs +++ b/Source/Editor/Windows/Search/ContentSearchWindow.cs @@ -17,6 +17,7 @@ using FlaxEditor.Surface; using FlaxEditor.Windows; using FlaxEditor.Windows.Assets; using FlaxEngine.GUI; +using FlaxEngine.Utilities; namespace FlaxEngine.Windows.Search { diff --git a/Source/Editor/Windows/SplashScreen.cpp b/Source/Editor/Windows/SplashScreen.cpp index 649f0bcff..3e36d3618 100644 --- a/Source/Editor/Windows/SplashScreen.cpp +++ b/Source/Editor/Windows/SplashScreen.cpp @@ -123,7 +123,6 @@ const Char* SplashScreenQuotes[] = TEXT("Hello There"), TEXT("BAGUETTE"), TEXT("All we had to do was follow the damn train, CJ"), - TEXT("28 stab wounds"), TEXT("Here we go again"), TEXT("@everyone"), TEXT("Potato"), @@ -135,7 +134,8 @@ const Char* SplashScreenQuotes[] = TEXT("Scooby dooby doo"), TEXT("You shall not load!"), TEXT("The roof, the roof, the roof is on fire!"), - TEXT("I've seen better documentation ...\nFrom ransomware gangs !") + TEXT("I've seen better documentation...\nFrom ransomware gangs!"), + TEXT("Slava Ukraini!"), }; SplashScreen::~SplashScreen() @@ -153,7 +153,7 @@ void SplashScreen::Show() LOG(Info, "Showing splash screen"); // Create window - const float dpiScale = (float)Platform::GetDpi() / (float)DefaultDPI; + const float dpiScale = Platform::GetDpiScale(); CreateWindowSettings settings; settings.Title = TEXT("Flax Editor"); settings.Size.X = 500 * dpiScale; diff --git a/Source/Editor/Windows/VisualScriptDebuggerWindow.cs b/Source/Editor/Windows/VisualScriptDebuggerWindow.cs index c85507a1c..330a3963b 100644 --- a/Source/Editor/Windows/VisualScriptDebuggerWindow.cs +++ b/Source/Editor/Windows/VisualScriptDebuggerWindow.cs @@ -12,6 +12,7 @@ using FlaxEditor.Surface; using FlaxEditor.Windows.Assets; using FlaxEngine; using FlaxEngine.GUI; +using FlaxEngine.Utilities; namespace FlaxEditor.Windows { diff --git a/Source/Engine/Animations/AnimEvent.cpp b/Source/Engine/Animations/AnimEvent.cpp index a3ec94861..e46a99c62 100644 --- a/Source/Engine/Animations/AnimEvent.cpp +++ b/Source/Engine/Animations/AnimEvent.cpp @@ -2,7 +2,7 @@ #include "AnimEvent.h" #include "Engine/Scripting/BinaryModule.h" -#include "Engine/Scripting/ManagedSerialization.h" +#include "Engine/Scripting/Internal/ManagedSerialization.h" #include "Engine/Serialization/SerializationFwd.h" #include "Engine/Serialization/Serialization.h" diff --git a/Source/Engine/Animations/AnimationGraph.cs b/Source/Engine/Animations/AnimationGraph.cs index 86c623337..46b3acfc1 100644 --- a/Source/Engine/Animations/AnimationGraph.cs +++ b/Source/Engine/Animations/AnimationGraph.cs @@ -3,6 +3,7 @@ using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Runtime.InteropServices.Marshalling; namespace FlaxEngine { @@ -44,6 +45,7 @@ namespace FlaxEngine /// The node evaluation context structure. /// [StructLayout(LayoutKind.Sequential)] + [NativeMarshalling(typeof(ContextMarshaller))] public struct Context { /// @@ -92,6 +94,61 @@ namespace FlaxEngine public AnimatedModel Instance; } + [CustomMarshaller(typeof(Context), MarshalMode.Default, typeof(ContextMarshaller))] + internal static class ContextMarshaller + { + [StructLayout(LayoutKind.Sequential)] + public struct ContextNative + { + public IntPtr Graph; + public IntPtr GraphExecutor; + public IntPtr Node; + public uint NodeId; + public int BoxId; + public float DeltaTime; + public ulong CurrentFrameIndex; + public IntPtr BaseModel; + public IntPtr Instance; + } + + internal static Context ConvertToManaged(ContextNative unmanaged) => ToManaged(unmanaged); + internal static ContextNative ConvertToUnmanaged(Context managed) => ToNative(managed); + + internal static Context ToManaged(ContextNative managed) + { + return new Context() + { + Graph = managed.Graph, + GraphExecutor = managed.GraphExecutor, + Node = managed.Node, + NodeId = managed.NodeId, + BoxId = managed.BoxId, + DeltaTime = managed.DeltaTime, + CurrentFrameIndex = managed.CurrentFrameIndex, + BaseModel = SkinnedModelMarshaller.ConvertToManaged(managed.BaseModel), + Instance = AnimatedModelMarshaller.ConvertToManaged(managed.Instance), + }; + } + internal static ContextNative ToNative(Context managed) + { + return new ContextNative() + { + Graph = managed.Graph, + GraphExecutor = managed.GraphExecutor, + Node = managed.Node, + NodeId = managed.NodeId, + BoxId = managed.BoxId, + DeltaTime = managed.DeltaTime, + CurrentFrameIndex = managed.CurrentFrameIndex, + BaseModel = SkinnedModelMarshaller.ConvertToUnmanaged(managed.BaseModel), + Instance = AnimatedModelMarshaller.ConvertToUnmanaged(managed.Instance), + }; + } + internal static void Free(ContextNative unmanaged) + { + } + } + /// /// The animation graph 'impulse' connections data container (the actual transfer is done via pointer as it gives better performance). /// Container for skeleton nodes transformation hierarchy and any other required data. @@ -118,12 +175,7 @@ namespace FlaxEngine /// /// The root motion data. /// - public Vector3 RootMotionTranslation; - - /// - /// The root motion data. - /// - public Quaternion RootMotionRotation; + public Transform RootMotion; /// /// The animation time position (in seconds). @@ -194,8 +246,7 @@ namespace FlaxEngine destination->NodesCount = source->NodesCount; destination->Unused = source->Unused; Utils.MemoryCopy(new IntPtr(destination->Nodes), new IntPtr(source->Nodes), (ulong)(source->NodesCount * sizeof(Transform))); - destination->RootMotionTranslation = source->RootMotionTranslation; - destination->RootMotionRotation = source->RootMotionRotation; + destination->RootMotion = source->RootMotion; destination->Position = source->Position; destination->Length = source->Length; } @@ -203,14 +254,16 @@ namespace FlaxEngine #region Internal Calls - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool Internal_HasConnection(ref CustomNode.Context context, int boxId); + [LibraryImport("FlaxEngine", EntryPoint = "AnimGraphInternal_HasConnection")] + [return: MarshalAs(UnmanagedType.U1)] + internal static partial bool Internal_HasConnection(ref AnimationGraph.CustomNode.Context context, int boxId); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern object Internal_GetInputValue(ref CustomNode.Context context, int boxId); + [LibraryImport("FlaxEngine", EntryPoint = "AnimGraphInternal_GetInputValue")] + [return: MarshalUsing(typeof(FlaxEngine.Interop.ManagedHandleMarshaller))] + internal static partial object Internal_GetInputValue(ref AnimationGraph.CustomNode.Context context, int boxId); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern IntPtr Internal_GetOutputImpulseData(ref CustomNode.Context context); + [LibraryImport("FlaxEngine", EntryPoint = "AnimGraphInternal_GetOutputImpulseData")] + internal static partial IntPtr Internal_GetOutputImpulseData(ref AnimationGraph.CustomNode.Context context); #endregion } diff --git a/Source/Engine/Animations/Animations.cpp b/Source/Engine/Animations/Animations.cpp index 6d6787d91..3c80cadbe 100644 --- a/Source/Engine/Animations/Animations.cpp +++ b/Source/Engine/Animations/Animations.cpp @@ -29,6 +29,22 @@ public: void PostExecute(TaskGraph* graph) override; }; +namespace +{ + FORCE_INLINE bool CanUpdateModel(AnimatedModel* animatedModel) + { + auto skinnedModel = animatedModel->SkinnedModel.Get(); + auto animGraph = animatedModel->AnimationGraph.Get(); + return animGraph && animGraph->IsLoaded() + && skinnedModel && skinnedModel->IsLoaded() +#if USE_EDITOR + // It may happen in editor so just add safe check to prevent any crashes + && animGraph->Graph.Parameters.Count() == animatedModel->GraphInstance.Parameters.Count() +#endif + && animGraph->Graph.IsReady(); + } +} + AnimationsService AnimationManagerInstance; Array UpdateList; TaskGraphSystem* Animations::System = nullptr; @@ -53,14 +69,9 @@ void AnimationsSystem::Job(int32 index) { PROFILE_CPU_NAMED("Animations.Job"); auto animatedModel = UpdateList[index]; - auto skinnedModel = animatedModel->SkinnedModel.Get(); - auto graph = animatedModel->AnimationGraph.Get(); - if (graph && graph->IsLoaded() && graph->Graph.CanUseWithSkeleton(skinnedModel) -#if USE_EDITOR - && graph->Graph.Parameters.Count() == animatedModel->GraphInstance.Parameters.Count() // It may happen in editor so just add safe check to prevent any crashes -#endif - ) + if (CanUpdateModel(animatedModel)) { + auto graph = animatedModel->AnimationGraph.Get(); #if COMPILE_WITH_PROFILER && TRACY_ENABLE const StringView graphName(graph->GetPath()); ZoneName(*graphName, graphName.Length()); @@ -120,13 +131,7 @@ void AnimationsSystem::PostExecute(TaskGraph* graph) for (int32 index = 0; index < UpdateList.Count(); index++) { auto animatedModel = UpdateList[index]; - auto skinnedModel = animatedModel->SkinnedModel.Get(); - auto animGraph = animatedModel->AnimationGraph.Get(); - if (animGraph && animGraph->IsLoaded() && animGraph->Graph.CanUseWithSkeleton(skinnedModel) -#if USE_EDITOR - && animGraph->Graph.Parameters.Count() == animatedModel->GraphInstance.Parameters.Count() // It may happen in editor so just add safe check to prevent any crashes -#endif - ) + if (CanUpdateModel(animatedModel)) { animatedModel->OnAnimationUpdated_Sync(); } diff --git a/Source/Engine/Animations/Graph/AnimGraph.Base.cpp b/Source/Engine/Animations/Graph/AnimGraph.Base.cpp index d7cdbeecd..48fa7fed1 100644 --- a/Source/Engine/Animations/Graph/AnimGraph.Base.cpp +++ b/Source/Engine/Animations/Graph/AnimGraph.Base.cpp @@ -23,7 +23,7 @@ AnimSubGraph* AnimGraphBase::LoadSubGraph(const void* data, int32 dataLength, co auto subGraph = New(_graph); // Load graph - MemoryReadStream stream((byte*)data, dataLength); + MemoryReadStream stream((const byte*)data, dataLength); if (subGraph->Load(&stream, false)) { // Load failed @@ -180,8 +180,6 @@ bool AnimGraphBase::onNodeLoaded(Node* n) const Float4 range = n->Values[0].AsFloat4(); for (int32 i = 0; i < ANIM_GRAPH_MULTI_BLEND_MAX_ANIMS; i++) { - auto data0 = n->Values[i * 2 + 4].AsFloat4(); - data0.X = Math::Clamp(data0.X, range.X, range.Y); n->Assets[i] = Content::LoadAsync((Guid)n->Values[i * 2 + 5]); n->Data.MultiBlend1D.IndicesSorted[i] = n->Assets[i] ? i : ANIM_GRAPH_MULTI_BLEND_MAX_ANIMS; } @@ -200,9 +198,6 @@ bool AnimGraphBase::onNodeLoaded(Node* n) const Float4 range = n->Values[0].AsFloat4(); for (int32 i = 0; i < ANIM_GRAPH_MULTI_BLEND_MAX_ANIMS; i++) { - auto data0 = n->Values[i * 2 + 4].AsFloat4(); - data0.X = Math::Clamp(data0.X, range.X, range.Y); - data0.Y = Math::Clamp(data0.Y, range.Z, range.W); n->Assets[i] = (Asset*)Content::LoadAsync((Guid)n->Values[i * 2 + 5]); if (n->Assets[i]) { @@ -283,91 +278,11 @@ bool AnimGraphBase::onNodeLoaded(Node* n) Value& surfaceData = n->Values[1]; data.Graph = LoadSubGraph(surfaceData.AsBlob.Data, surfaceData.AsBlob.Length, (const Char*)name.AsBlob.Data); - // Initialize transitions - Value& transitionsData = n->Values[2]; - int32 validTransitions = 0; - if (transitionsData.Type == VariantType::Blob && transitionsData.AsBlob.Length) - { - MemoryReadStream stream((byte*)transitionsData.AsBlob.Data, transitionsData.AsBlob.Length); - - int32 version; - stream.ReadInt32(&version); - if (version != 1) - { - LOG(Warning, "Invalid version of the Anim Graph state transitions data."); - return true; - } - - int32 transitionsCount; - stream.ReadInt32(&transitionsCount); - - StateTransitions.EnsureCapacity(StateTransitions.Count() + transitionsCount); - - AnimGraphStateTransition transition; - for (int32 i = 0; i < transitionsCount; i++) - { - struct Data - { - int32 Destination; - int32 Flags; - int32 Order; - float BlendDuration; - int32 BlendMode; - int32 Unused0; - int32 Unused1; - int32 Unused2; - }; - Data transitionData; - stream.ReadBytes(&transitionData, sizeof(transitionData)); - - transition.Flags = (AnimGraphStateTransition::FlagTypes)transitionData.Flags; - transition.BlendDuration = transitionData.BlendDuration; - transition.BlendMode = (AlphaBlendMode)transitionData.BlendMode; - transition.Destination = GetNode(transitionData.Destination); - transition.RuleGraph = nullptr; - - int32 ruleSize; - stream.ReadInt32(&ruleSize); - const auto ruleBytes = (byte*)stream.Move(ruleSize); - - if (static_cast(transition.Flags & AnimGraphStateTransition::FlagTypes::Enabled) == 0) - { - // Skip disabled transitions - continue; - } - - if (ruleSize != 0) - { - transition.RuleGraph = LoadSubGraph(ruleBytes, ruleSize, TEXT("Rule")); - if (transition.RuleGraph && transition.RuleGraph->GetRootNode() == nullptr) - { - LOG(Warning, "Missing root node for the state machine transition rule graph."); - continue; - } - } - - if (transition.Destination == nullptr) - { - LOG(Warning, "Missing target node for the state machine transition."); - continue; - } - - if (validTransitions == ANIM_GRAPH_MAX_STATE_TRANSITIONS) - { - LOG(Warning, "State uses too many transitions."); - continue; - } - - data.Transitions[validTransitions++] = (uint16)StateTransitions.Count(); - StateTransitions.Add(transition); - } - } - if (validTransitions != ANIM_GRAPH_MAX_STATE_TRANSITIONS) - data.Transitions[validTransitions] = AnimGraphNode::StateData::InvalidTransitionIndex; - // Release data to don't use that memory surfaceData = Value::Null; - transitionsData = Value::Null; + + // Initialize transitions + LoadStateTransitions(data, n->Values[2]); break; } @@ -443,6 +358,10 @@ bool AnimGraphBase::onNodeLoaded(Node* n) case 33: ADD_BUCKET(InstanceDataBucketInit); break; + // Any State + case 34: + LoadStateTransitions(n->Data.AnyState, n->Values[0]); + break; } break; // Custom @@ -465,4 +384,91 @@ bool AnimGraphBase::onNodeLoaded(Node* n) return VisjectGraph::onNodeLoaded(n); } +void AnimGraphBase::LoadStateTransitions(AnimGraphNode::StateBaseData& data, Value& transitionsData) +{ + int32 validTransitions = 0; + if (transitionsData.Type == VariantType::Blob && transitionsData.AsBlob.Length) + { + MemoryReadStream stream((byte*)transitionsData.AsBlob.Data, transitionsData.AsBlob.Length); + + int32 version; + stream.ReadInt32(&version); + if (version != 1) + { + LOG(Warning, "Invalid version of the Anim Graph state transitions data."); + return; + } + + int32 transitionsCount; + stream.ReadInt32(&transitionsCount); + + StateTransitions.EnsureCapacity(StateTransitions.Count() + transitionsCount); + + AnimGraphStateTransition transition; + for (int32 i = 0; i < transitionsCount; i++) + { + // Must match StateMachineTransition.Data in C# + struct Data + { + int32 Destination; + int32 Flags; + int32 Order; + float BlendDuration; + int32 BlendMode; + int32 Unused0; + int32 Unused1; + int32 Unused2; + }; + Data transitionData; + stream.ReadBytes(&transitionData, sizeof(transitionData)); + + transition.Flags = (AnimGraphStateTransition::FlagTypes)transitionData.Flags; + transition.BlendDuration = transitionData.BlendDuration; + transition.BlendMode = (AlphaBlendMode)transitionData.BlendMode; + transition.Destination = GetNode(transitionData.Destination); + transition.RuleGraph = nullptr; + + int32 ruleSize; + stream.ReadInt32(&ruleSize); + const auto ruleBytes = (byte*)stream.Move(ruleSize); + + if (static_cast(transition.Flags & AnimGraphStateTransition::FlagTypes::Enabled) == 0) + { + // Skip disabled transitions + continue; + } + + if (ruleSize != 0) + { + transition.RuleGraph = LoadSubGraph(ruleBytes, ruleSize, TEXT("Rule")); + if (transition.RuleGraph && transition.RuleGraph->GetRootNode() == nullptr) + { + LOG(Warning, "Missing root node for the state machine transition rule graph."); + continue; + } + } + + if (transition.Destination == nullptr) + { + LOG(Warning, "Missing target node for the state machine transition."); + continue; + } + + if (validTransitions == ANIM_GRAPH_MAX_STATE_TRANSITIONS) + { + LOG(Warning, "State uses too many transitions."); + continue; + } + + data.Transitions[validTransitions++] = (uint16)StateTransitions.Count(); + StateTransitions.Add(transition); + } + } + if (validTransitions != ANIM_GRAPH_MAX_STATE_TRANSITIONS) + data.Transitions[validTransitions] = AnimGraphNode::StateData::InvalidTransitionIndex; + + // Release data to don't use that memory + transitionsData = AnimGraphExecutor::Value::Null; +} + #undef ADD_BUCKET diff --git a/Source/Engine/Animations/Graph/AnimGraph.Custom.cpp b/Source/Engine/Animations/Graph/AnimGraph.Custom.cpp index d2068ae02..d74c523f1 100644 --- a/Source/Engine/Animations/Graph/AnimGraph.Custom.cpp +++ b/Source/Engine/Animations/Graph/AnimGraph.Custom.cpp @@ -2,24 +2,23 @@ #include "AnimGraph.h" #include "Engine/Debug/DebugLog.h" -#include "Engine/Scripting/InternalCalls.h" +#include "Engine/Scripting/Scripting.h" #include "Engine/Scripting/BinaryModule.h" +#include "Engine/Scripting/ManagedCLR/MCore.h" #include "Engine/Scripting/ManagedCLR/MDomain.h" #include "Engine/Scripting/ManagedCLR/MMethod.h" #include "Engine/Scripting/ManagedCLR/MClass.h" #include "Engine/Scripting/ManagedCLR/MUtils.h" -#include "Engine/Scripting/Scripting.h" -#include "Engine/Scripting/MException.h" +#include "Engine/Scripting/ManagedCLR/MException.h" +#include "Engine/Scripting/Internal/InternalCalls.h" #include "Engine/Content/Assets/SkinnedModel.h" -#if USE_MONO - -#include +#if USE_CSHARP struct InternalInitData { - MonoArray* Values; - MonoObject* BaseModel; + MArray* Values; + MObject* BaseModel; }; struct InternalContext @@ -31,8 +30,8 @@ struct InternalContext int32 BoxId; float DeltaTime; uint64 CurrentFrameIndex; - MonoObject* BaseModel; - MonoObject* Instance; + MObject* BaseModel; + MObject* Instance; }; struct InternalImpulse @@ -40,63 +39,57 @@ struct InternalImpulse int32 NodesCount; int32 Unused; Transform* Nodes; - Vector3 RootMotionTranslation; - Quaternion RootMotionRotation; + Transform RootMotion; float Position; float Length; }; static_assert(sizeof(InternalImpulse) == sizeof(AnimGraphImpulse), "Please update managed impulse type for Anim Graph to match the C++ backend data layout."); -namespace AnimGraphInternal +DEFINE_INTERNAL_CALL(bool) AnimGraphInternal_HasConnection(InternalContext* context, int32 boxId) { - bool HasConnection(InternalContext* context, int32 boxId) - { - const auto box = context->Node->TryGetBox(boxId); - if (box == nullptr) - DebugLog::ThrowArgumentOutOfRange("boxId"); - return box->HasConnection(); - } + const auto box = context->Node->TryGetBox(boxId); + if (box == nullptr) + DebugLog::ThrowArgumentOutOfRange("boxId"); + return box->HasConnection(); +} - MonoObject* GetInputValue(InternalContext* context, int32 boxId) - { - const auto box = context->Node->TryGetBox(boxId); - if (box == nullptr) - DebugLog::ThrowArgumentOutOfRange("boxId"); - if (!box->HasConnection()) - DebugLog::ThrowArgument("boxId", "This box has no connection. Use HasConnection to check if can get input value."); +DEFINE_INTERNAL_CALL(MObject*) AnimGraphInternal_GetInputValue(InternalContext* context, int32 boxId) +{ + const auto box = context->Node->TryGetBox(boxId); + if (box == nullptr) + DebugLog::ThrowArgumentOutOfRange("boxId"); + if (!box->HasConnection()) + DebugLog::ThrowArgument("boxId", "This box has no connection. Use HasConnection to check if can get input value."); - Variant value = Variant::Null; - context->GraphExecutor->GetInputValue(box, value); + Variant value = Variant::Null; + context->GraphExecutor->GetInputValue(box, value); - // Cast value to prevent implicit value conversion issues and handling this on C# side - if (!(box->Type.Type == VariantType::Void && value.Type.Type == VariantType::Pointer)) - value = Variant::Cast(value, box->Type); - return MUtils::BoxVariant(value); - } + // Cast value to prevent implicit value conversion issues and handling this on C# side + if (!(box->Type.Type == VariantType::Void && value.Type.Type == VariantType::Pointer)) + value = Variant::Cast(value, box->Type); + return MUtils::BoxVariant(value); +} - AnimGraphImpulse* GetOutputImpulseData(InternalContext* context) - { - const auto nodes = context->Node->GetNodes(context->GraphExecutor); - context->GraphExecutor->InitNodes(nodes); - return nodes; - } +DEFINE_INTERNAL_CALL(AnimGraphImpulse*) AnimGraphInternal_GetOutputImpulseData(InternalContext* context) +{ + const auto nodes = context->Node->GetNodes(context->GraphExecutor); + context->GraphExecutor->InitNodes(nodes); + return nodes; } #endif void AnimGraphExecutor::initRuntime() { -#if USE_MONO - ADD_INTERNAL_CALL("FlaxEngine.AnimationGraph::Internal_HasConnection", &AnimGraphInternal::HasConnection); - ADD_INTERNAL_CALL("FlaxEngine.AnimationGraph::Internal_GetInputValue", &AnimGraphInternal::GetInputValue); - ADD_INTERNAL_CALL("FlaxEngine.AnimationGraph::Internal_GetOutputImpulseData", &AnimGraphInternal::GetOutputImpulseData); -#endif + ADD_INTERNAL_CALL("FlaxEngine.AnimationGraph::Internal_HasConnection", &AnimGraphInternal_HasConnection); + ADD_INTERNAL_CALL("FlaxEngine.AnimationGraph::Internal_GetInputValue", &AnimGraphInternal_GetInputValue); + ADD_INTERNAL_CALL("FlaxEngine.AnimationGraph::Internal_GetOutputImpulseData", &AnimGraphInternal_GetOutputImpulseData); } void AnimGraphExecutor::ProcessGroupCustom(Box* boxBase, Node* nodeBase, Value& value) { -#if USE_MONO +#if USE_CSHARP auto& context = Context.Get(); if (context.ValueCache.TryGet(boxBase, value)) return; @@ -122,7 +115,7 @@ void AnimGraphExecutor::ProcessGroupCustom(Box* boxBase, Node* nodeBase, Value& internalContext.Instance = context.Data->Object ? context.Data->Object->GetOrCreateManagedInstance() : nullptr; // Peek managed object - const auto obj = mono_gchandle_get_target(data.Handle); + const auto obj = MCore::GCHandle::GetTarget(data.Handle); if (obj == nullptr) { LOG(Warning, "Custom node instance is null."); @@ -133,7 +126,7 @@ void AnimGraphExecutor::ProcessGroupCustom(Box* boxBase, Node* nodeBase, Value& void* params[1]; params[0] = &internalContext; MObject* exception = nullptr; - MonoObject* result = data.Evaluate->Invoke(obj, params, &exception); + MObject* result = data.Evaluate->Invoke(obj, params, &exception); if (exception) { MException ex(exception); @@ -152,12 +145,6 @@ bool AnimGraph::IsReady() const return BaseModel && BaseModel->IsLoaded(); } -bool AnimGraph::CanUseWithSkeleton(SkinnedModel* other) const -{ - // All data loaded and nodes count the same - return IsReady() && other && other->IsLoaded() && other->Skeleton.Nodes.Count() == BaseModel->Skeleton.Nodes.Count(); -} - void AnimGraph::ClearCustomNode(Node* node) { // Clear data @@ -165,16 +152,14 @@ void AnimGraph::ClearCustomNode(Node* node) data.Evaluate = nullptr; if (data.Handle) { -#if USE_MONO - mono_gchandle_free(data.Handle); -#endif + MCore::GCHandle::Free(data.Handle); data.Handle = 0; } } bool AnimGraph::InitCustomNode(Node* node) { -#if USE_MONO +#if USE_CSHARP // Fetch the node logic controller type if (node->Values.Count() < 2 || node->Values[0].Type.Type != ValueType::String) { @@ -182,7 +167,7 @@ bool AnimGraph::InitCustomNode(Node* node) return false; } const StringView typeName(node->Values[0]); - const MString typeNameStd = typeName.ToStringAnsi(); + const StringAnsi typeNameStd = typeName.ToStringAnsi(); MClass* type = Scripting::FindClass(typeNameStd); if (type == nullptr) { @@ -205,18 +190,15 @@ bool AnimGraph::InitCustomNode(Node* node) } // Create node values managed array - if (mono_domain_get() == nullptr) - Scripting::GetScriptsDomain()->Dispatch(); - const auto values = mono_array_new(mono_domain_get(), mono_get_object_class(), node->Values.Count()); + MCore::Thread::Attach(); + MArray* values = MCore::Array::New( MCore::TypeCache::Object, node->Values.Count()); + MObject** valuesPtr = MCore::Array::GetAddress(values); for (int32 i = 0; i < node->Values.Count(); i++) - { - const auto v = MUtils::BoxVariant(node->Values[i]); - mono_array_set(values, MonoObject*, i, v); - } + valuesPtr[i] = MUtils::BoxVariant(node->Values[i]); // Allocate managed node object (create GC handle to prevent destruction) - const auto obj = type->CreateInstance(); - const auto handleGC = mono_gchandle_new(obj, false); + MObject* obj = type->CreateInstance(); + const MGCHandle handleGC = MCore::GCHandle::New(obj); // Initialize node InternalInitData initData; @@ -228,7 +210,7 @@ bool AnimGraph::InitCustomNode(Node* node) load->Invoke(obj, params, &exception); if (exception) { - mono_gchandle_free(handleGC); + MCore::GCHandle::Free(handleGC); MException ex(exception); ex.Log(LogType::Warning, TEXT("AnimGraph")); diff --git a/Source/Engine/Animations/Graph/AnimGraph.cpp b/Source/Engine/Animations/Graph/AnimGraph.cpp index fa770f31b..71c9534e0 100644 --- a/Source/Engine/Animations/Graph/AnimGraph.cpp +++ b/Source/Engine/Animations/Graph/AnimGraph.cpp @@ -7,55 +7,10 @@ #include "Engine/Graphics/Models/SkeletonData.h" #include "Engine/Scripting/Scripting.h" +extern void RetargetSkeletonNode(const SkeletonData& sourceSkeleton, const SkeletonData& targetSkeleton, const SkinnedModel::SkeletonMapping& sourceMapping, Transform& node, int32 i); + ThreadLocal AnimGraphExecutor::Context; -RootMotionData RootMotionData::Identity = { Vector3(0.0f), Quaternion(0.0f, 0.0f, 0.0f, 1.0f) }; - -RootMotionData& RootMotionData::operator+=(const RootMotionData& b) -{ - Translation += b.Translation; - Rotation *= b.Rotation; - return *this; -} - -RootMotionData& RootMotionData::operator+=(const Transform& b) -{ - Translation += b.Translation; - Rotation *= b.Orientation; - return *this; -} - -RootMotionData& RootMotionData::operator-=(const Transform& b) -{ - Translation -= b.Translation; - Quaternion invRotation = Rotation; - invRotation.Invert(); - Quaternion::Multiply(invRotation, b.Orientation, Rotation); - return *this; -} - -RootMotionData RootMotionData::operator+(const RootMotionData& b) const -{ - RootMotionData result; - - result.Translation = Translation + b.Translation; - result.Rotation = Rotation * b.Rotation; - - return result; -} - -RootMotionData RootMotionData::operator-(const RootMotionData& b) const -{ - RootMotionData result; - - result.Rotation = Rotation; - result.Rotation.Invert(); - Vector3::Transform(b.Translation - Translation, result.Rotation, result.Translation); - Quaternion::Multiply(result.Rotation, b.Rotation, result.Rotation); - - return result; -} - Transform AnimGraphImpulse::GetNodeModelTransformation(SkeletonData& skeleton, int32 nodeIndex) const { const int32 parentIndex = skeleton.Nodes[nodeIndex].ParentIndex; @@ -87,7 +42,7 @@ void AnimGraphInstanceData::Clear() LastUpdateTime = -1; CurrentFrame = 0; RootTransform = Transform::Identity; - RootMotion = RootMotionData::Identity; + RootMotion = Transform::Identity; Parameters.Resize(0); State.Resize(0); NodesPose.Resize(0); @@ -103,7 +58,7 @@ void AnimGraphInstanceData::ClearState() LastUpdateTime = -1; CurrentFrame = 0; RootTransform = Transform::Identity; - RootMotion = RootMotionData::Identity; + RootMotion = Transform::Identity; State.Resize(0); NodesPose.Resize(0); Slots.Clear(); @@ -257,15 +212,12 @@ void AnimGraphExecutor::Update(AnimGraphInstanceData& data, float dt) e.Hit = false; // Init empty nodes data - context.EmptyNodes.RootMotion = RootMotionData::Identity; + context.EmptyNodes.RootMotion = Transform::Identity; context.EmptyNodes.Position = 0.0f; context.EmptyNodes.Length = 0.0f; context.EmptyNodes.Nodes.Resize(_skeletonNodesCount, false); for (int32 i = 0; i < _skeletonNodesCount; i++) - { - auto& node = skeleton.Nodes[i]; - context.EmptyNodes.Nodes[i] = node.LocalTransform; - } + context.EmptyNodes.Nodes[i] = skeleton.Nodes[i].LocalTransform; } // Update the animation graph and gather skeleton nodes transformations in nodes local space @@ -301,6 +253,44 @@ void AnimGraphExecutor::Update(AnimGraphInstanceData& data, float dt) } } } + SkeletonData* animResultSkeleton = &skeleton; + + // Retarget animation when using output pose from other skeleton + AnimGraphImpulse retargetNodes; + if (_graph.BaseModel != data.NodesSkeleton) + { + ANIM_GRAPH_PROFILE_EVENT("Retarget"); + + // Init nodes for the target skeleton + auto& targetSkeleton = data.NodesSkeleton->Skeleton; + retargetNodes = *animResult; + retargetNodes.Nodes.Resize(targetSkeleton.Nodes.Count()); + Transform* targetNodes = retargetNodes.Nodes.Get(); + for (int32 i = 0; i < retargetNodes.Nodes.Count(); i++) + targetNodes[i] = targetSkeleton.Nodes[i].LocalTransform; + + // Use skeleton mapping + const SkinnedModel::SkeletonMapping mapping = data.NodesSkeleton->GetSkeletonMapping(_graph.BaseModel); + if (mapping.NodesMapping.IsValid()) + { + const auto& sourceSkeleton = _graph.BaseModel->Skeleton; + Transform* sourceNodes = animResult->Nodes.Get(); + for (int32 i = 0; i < retargetNodes.Nodes.Count(); i++) + { + const int32 nodeToNode = mapping.NodesMapping[i]; + if (nodeToNode != -1) + { + Transform node = sourceNodes[nodeToNode]; + RetargetSkeletonNode(sourceSkeleton, targetSkeleton, mapping, node, i); + targetNodes[i] = node; + } + + } + } + + animResult = &retargetNodes; + animResultSkeleton = &targetSkeleton; + } // Allow for external override of the local pose (eg. by the ragdoll) data.LocalPoseOverride(animResult); @@ -309,13 +299,14 @@ void AnimGraphExecutor::Update(AnimGraphInstanceData& data, float dt) { ANIM_GRAPH_PROFILE_EVENT("Global Pose"); - data.NodesPose.Resize(_skeletonNodesCount, false); + ASSERT(animResultSkeleton->Nodes.Count() == animResult->Nodes.Count()); + data.NodesPose.Resize(animResultSkeleton->Nodes.Count(), false); Transform* nodesTransformations = animResult->Nodes.Get(); // Note: this assumes that nodes are sorted (parents first) - for (int32 nodeIndex = 0; nodeIndex < _skeletonNodesCount; nodeIndex++) + for (int32 nodeIndex = 0; nodeIndex < animResultSkeleton->Nodes.Count(); nodeIndex++) { - const int32 parentIndex = skeleton.Nodes[nodeIndex].ParentIndex; + const int32 parentIndex = animResultSkeleton->Nodes[nodeIndex].ParentIndex; if (parentIndex != -1) { nodesTransformations[parentIndex].LocalToWorld(nodesTransformations[nodeIndex], nodesTransformations[nodeIndex]); diff --git a/Source/Engine/Animations/Graph/AnimGraph.h b/Source/Engine/Animations/Graph/AnimGraph.h index aeb91fbd0..41edb72f3 100644 --- a/Source/Engine/Animations/Graph/AnimGraph.h +++ b/Source/Engine/Animations/Graph/AnimGraph.h @@ -26,58 +26,6 @@ class AnimGraphExecutor; class SkinnedModel; class SkeletonData; -/// -/// The root motion data container. Supports displacement and rotation (no scale component). -/// -struct RootMotionData -{ - static RootMotionData Identity; - - Vector3 Translation; - Quaternion Rotation; - - RootMotionData() - { - } - - RootMotionData(const Vector3& translation, const Quaternion& rotation) - { - Translation = translation; - Rotation = rotation; - } - - RootMotionData(const RootMotionData& other) - { - Translation = other.Translation; - Rotation = other.Rotation; - } - - explicit RootMotionData(const Transform& other) - { - Translation = other.Translation; - Rotation = other.Orientation; - } - - RootMotionData& operator=(const Transform& other) - { - Translation = other.Translation; - Rotation = other.Orientation; - return *this; - } - - RootMotionData& operator+=(const RootMotionData& b); - RootMotionData& operator+=(const Transform& b); - RootMotionData& operator-=(const Transform& b); - RootMotionData operator+(const RootMotionData& b) const; - RootMotionData operator-(const RootMotionData& b) const; - - static void Lerp(const RootMotionData& t1, const RootMotionData& t2, float amount, RootMotionData& result) - { - Vector3::Lerp(t1.Translation, t2.Translation, amount, result.Translation); - Quaternion::Slerp(t1.Rotation, t2.Rotation, amount, result.Rotation); - } -}; - /// /// The animation graph 'impulse' connections data container (the actual transfer is done via pointer as it gives better performance). /// Container for skeleton nodes transformation hierarchy and any other required data. @@ -93,7 +41,7 @@ struct FLAXENGINE_API AnimGraphImpulse /// /// The root motion extracted from the animation to apply on animated object. /// - RootMotionData RootMotion = RootMotionData::Identity; + Transform RootMotion = Transform::Identity; /// /// The animation time position (in seconds). @@ -172,25 +120,12 @@ public: /// enum class FlagTypes { - /// - /// The none. - /// None = 0, - - /// - /// The enabled flag. - /// Enabled = 1, - - /// - /// The solo flag. - /// Solo = 2, - - /// - /// The use default rule flag. - /// UseDefaultRule = 4, + InterruptionRuleRechecking = 8, + InterruptionInstant = 16, }; public: @@ -361,7 +296,7 @@ public: /// /// The current root motion delta to apply on a target object. /// - RootMotionData RootMotion = RootMotionData::Identity; + Transform RootMotion = Transform::Identity; /// /// The animation graph parameters collection (instanced, override the default values). @@ -384,7 +319,12 @@ public: ScriptingObject* Object; /// - /// The custom event called after local pose evaluation. + /// The output nodes pose skeleton asset to use. Allows to remap evaluated animation pose for Base Model of the Anim Graph to the target Animated Model that plays it. Nodes Pose will match its skeleton. Use null if disable retargetting. + /// + SkinnedModel* NodesSkeleton = nullptr; + + /// + /// The custom event called after local pose evaluation and retargetting. /// Delegate LocalPoseOverride; @@ -495,24 +435,31 @@ public: AnimSubGraph* Graph; }; - struct StateData + struct StateBaseData { /// /// The invalid transition valid used in Transitions to indicate invalid transition linkage. /// const static uint16 InvalidTransitionIndex = MAX_uint16; - - /// - /// The graph of the state. Contains the state animation evaluation graph. Its root node is the state output node with an input box for the state blend pose sampling. - /// - AnimSubGraph* Graph; - + /// /// The outgoing transitions from this state to the other states. Each array item contains index of the transition data from the state node graph transitions cache. Value InvalidTransitionIndex is used for last transition to indicate the transitions amount. /// uint16 Transitions[ANIM_GRAPH_MAX_STATE_TRANSITIONS]; }; + struct StateData : StateBaseData + { + /// + /// The graph of the state. Contains the state animation evaluation graph. Its root node is the state output node with an input box for the state blend pose sampling. + /// + AnimSubGraph* Graph; + }; + + struct AnyStateData : StateBaseData + { + }; + struct CustomData { /// @@ -523,7 +470,7 @@ public: /// /// The GC handle to the managed instance of the node object. /// - uint32 Handle; + MGCHandle Handle; }; struct CurveData @@ -564,6 +511,7 @@ public: MultiBlend2DData MultiBlend2D; StateMachineData StateMachine; StateData State; + AnyStateData AnyState; CustomData Custom; CurveData Curve; AnimationGraphFunctionData AnimationGraphFunction; @@ -681,6 +629,9 @@ public: protected: // [Graph] bool onNodeLoaded(Node* n) override; + +private: + void LoadStateTransitions(AnimGraphNode::StateBaseData& data, Value& transitionsData); }; /// @@ -763,13 +714,6 @@ public: /// bool IsReady() const; - /// - /// Determines whether this graph can be used with the specified skeleton. - /// - /// The other skinned model to check. - /// True if can perform the update, otherwise false. - bool CanUseWithSkeleton(SkinnedModel* other) const; - private: void ClearCustomNode(Node* node); bool InitCustomNode(Node* node); @@ -887,7 +831,6 @@ private: }; int32 GetRootNodeIndex(Animation* anim); - void ExtractRootMotion(const Animation::NodeToChannel* mapping, int32 rootNodeIndex, Animation* anim, float pos, float prevPos, Transform& rootNode, RootMotionData& rootMotion); void ProcessAnimEvents(AnimGraphNode* node, bool loop, float length, float animPos, float animPrevPos, Animation* anim, float speed); void ProcessAnimation(AnimGraphImpulse* nodes, AnimGraphNode* node, bool loop, float length, float pos, float prevPos, Animation* anim, float speed, float weight = 1.0f, ProcessAnimationMode mode = ProcessAnimationMode::Override); Variant SampleAnimation(AnimGraphNode* node, bool loop, float length, float startTimePos, float prevTimePos, float& newTimePos, Animation* anim, float speed); @@ -895,4 +838,5 @@ private: Variant SampleAnimationsWithBlend(AnimGraphNode* node, bool loop, float length, float startTimePos, float prevTimePos, float& newTimePos, Animation* animA, Animation* animB, Animation* animC, float speedA, float speedB, float speedC, float alphaA, float alphaB, float alphaC); Variant Blend(AnimGraphNode* node, const Value& poseA, const Value& poseB, float alpha, AlphaBlendMode alphaMode); Variant SampleState(AnimGraphNode* state); + void UpdateStateTransitions(AnimGraphContext& context, const AnimGraphNode::StateMachineData& stateMachineData, AnimGraphInstanceData::StateMachineBucket& stateMachineBucket, const AnimGraphNode::StateBaseData& stateData); }; diff --git a/Source/Engine/Animations/Graph/AnimGroup.Animation.cpp b/Source/Engine/Animations/Graph/AnimGroup.Animation.cpp index 86aa42ff6..c508ab3c8 100644 --- a/Source/Engine/Animations/Graph/AnimGroup.Animation.cpp +++ b/Source/Engine/Animations/Graph/AnimGroup.Animation.cpp @@ -11,7 +11,7 @@ namespace { - void BlendAdditiveWeightedRotation(Quaternion& base, Quaternion& additive, float weight) + FORCE_INLINE void BlendAdditiveWeightedRotation(Quaternion& base, Quaternion& additive, float weight) { // Pick a shortest path between rotation to fix blending artifacts additive *= weight; @@ -19,6 +19,36 @@ namespace additive *= -1; base += additive; } + + FORCE_INLINE void NormalizeRotations(AnimGraphImpulse* nodes, RootMotionMode rootMotionMode) + { + for (int32 i = 0; i < nodes->Nodes.Count(); i++) + { + nodes->Nodes[i].Orientation.Normalize(); + } + if (rootMotionMode != RootMotionMode::NoExtraction) + { + nodes->RootMotion.Orientation.Normalize(); + } + } +} + +void RetargetSkeletonNode(const SkeletonData& sourceSkeleton, const SkeletonData& targetSkeleton, const SkinnedModel::SkeletonMapping& mapping, Transform& node, int32 i) +{ + const int32 nodeToNode = mapping.NodesMapping[i]; + if (nodeToNode == -1) + return; + + // Map source skeleton node to the target skeleton (use ref pose difference) + const auto& sourceNode = sourceSkeleton.Nodes[nodeToNode]; + const auto& targetNode = targetSkeleton.Nodes[i]; + Transform value = node; + const Transform sourceToTarget = targetNode.LocalTransform - sourceNode.LocalTransform; + value.Translation += sourceToTarget.Translation; + value.Scale *= sourceToTarget.Scale; + value.Orientation = sourceToTarget.Orientation * value.Orientation; // TODO: find out why this doesn't match referenced animation when played on that skeleton originally + value.Orientation.Normalize(); + node = value; } int32 AnimGraphExecutor::GetRootNodeIndex(Animation* anim) @@ -40,52 +70,6 @@ int32 AnimGraphExecutor::GetRootNodeIndex(Animation* anim) return rootNodeIndex; } -void AnimGraphExecutor::ExtractRootMotion(const Animation::NodeToChannel* mapping, int32 rootNodeIndex, Animation* anim, float pos, float prevPos, Transform& rootNode, RootMotionData& rootMotion) -{ - const Transform& refPose = GetEmptyNodes()->Nodes[rootNodeIndex]; - const int32 nodeToChannel = mapping->At(rootNodeIndex); - if (_rootMotionMode == RootMotionMode::Enable && nodeToChannel != -1) - { - // Get the root bone transformation - Transform rootBefore = refPose; - const NodeAnimationData& rootChannel = anim->Data.Channels[nodeToChannel]; - rootChannel.Evaluate(prevPos, &rootBefore, false); - - // Check if animation looped - if (pos < prevPos) - { - const float length = anim->GetLength(); - const float endPos = length * static_cast(anim->Data.FramesPerSecond); - const float timeToEnd = endPos - prevPos; - - Transform rootBegin = refPose; - rootChannel.Evaluate(0, &rootBegin, false); - - Transform rootEnd = refPose; - rootChannel.Evaluate(endPos, &rootEnd, false); - - //rootChannel.Evaluate(pos - timeToEnd, &rootNow, true); - - // Complex motion calculation to preserve the looped movement - // (end - before + now - begin) - // It sums the motion since the last update to anim end and since the start to now - rootMotion.Translation = rootEnd.Translation - rootBefore.Translation + rootNode.Translation - rootBegin.Translation; - rootMotion.Rotation = rootEnd.Orientation * rootBefore.Orientation.Conjugated() * (rootNode.Orientation * rootBegin.Orientation.Conjugated()); - //rootMotion.Rotation = Quaternion::Identity; - } - else - { - // Simple motion delta - // (now - before) - rootMotion.Translation = rootNode.Translation - rootBefore.Translation; - rootMotion.Rotation = rootBefore.Orientation.Conjugated() * rootNode.Orientation; - } - } - - // Remove root node motion after extraction - rootNode = refPose; -} - void AnimGraphExecutor::ProcessAnimEvents(AnimGraphNode* node, bool loop, float length, float animPos, float animPrevPos, Animation* anim, float speed) { if (anim->Events.Count() == 0) @@ -185,13 +169,15 @@ float GetAnimPos(float& timePos, float startTimePos, bool loop, float length) { // Animation looped result = Math::Mod(result, length); + + // Remove start time offset to properly loop from animation start during the next frame + timePos = result - startTimePos; } else { // Animation ended - result = length; + timePos = result = length; } - timePos = result; } return result; } @@ -257,19 +243,33 @@ void AnimGraphExecutor::ProcessAnimation(AnimGraphImpulse* nodes, AnimGraphNode* } } + // Get skeleton nodes mapping descriptor + const SkinnedModel::SkeletonMapping mapping = _graph.BaseModel->GetSkeletonMapping(anim); + if (mapping.NodesMapping.IsInvalid()) + return; + // Evaluate nodes animations - const auto mapping = anim->GetMapping(_graph.BaseModel); const bool weighted = weight < 1.0f; + const bool retarget = mapping.SourceSkeleton && mapping.SourceSkeleton != mapping.TargetSkeleton; const auto emptyNodes = GetEmptyNodes(); + SkinnedModel::SkeletonMapping sourceMapping; + if (retarget) + sourceMapping = _graph.BaseModel->GetSkeletonMapping(mapping.SourceSkeleton); for (int32 i = 0; i < nodes->Nodes.Count(); i++) { - const int32 nodeToChannel = mapping->At(i); + const int32 nodeToChannel = mapping.NodesMapping[i]; Transform& dstNode = nodes->Nodes[i]; Transform srcNode = emptyNodes->Nodes[i]; if (nodeToChannel != -1) { // Calculate the animated node transformation anim->Data.Channels[nodeToChannel].Evaluate(animPos, &srcNode, false); + + // Optionally retarget animation into the skeleton used by the Anim Graph + if (retarget) + { + RetargetSkeletonNode(mapping.SourceSkeleton->Skeleton, mapping.TargetSkeleton->Skeleton, sourceMapping, srcNode, i); + } } // Blend node @@ -302,26 +302,76 @@ void AnimGraphExecutor::ProcessAnimation(AnimGraphImpulse* nodes, AnimGraphNode* { // Calculate the root motion node transformation const int32 rootNodeIndex = GetRootNodeIndex(anim); - Transform rootNode = emptyNodes->Nodes[rootNodeIndex]; - RootMotionData& dstNode = nodes->RootMotion; - RootMotionData srcNode(rootNode); - ExtractRootMotion(mapping, rootNodeIndex, anim, animPos, animPrevPos, rootNode, srcNode); + const Transform& refPose = emptyNodes->Nodes[rootNodeIndex]; + Transform& rootNode = nodes->Nodes[rootNodeIndex]; + Transform& dstNode = nodes->RootMotion; + Transform srcNode = Transform::Identity; + const int32 nodeToChannel = mapping.NodesMapping[rootNodeIndex]; + if (_rootMotionMode == RootMotionMode::Enable && nodeToChannel != -1) + { + // Get the root bone transformation + Transform rootBefore = refPose; + const NodeAnimationData& rootChannel = anim->Data.Channels[nodeToChannel]; + rootChannel.Evaluate(animPrevPos, &rootBefore, false); + + // Check if animation looped + if (animPos < animPrevPos) + { + const float endPos = anim->GetLength() * static_cast(anim->Data.FramesPerSecond); + const float timeToEnd = endPos - animPrevPos; + + Transform rootBegin = refPose; + rootChannel.Evaluate(0, &rootBegin, false); + + Transform rootEnd = refPose; + rootChannel.Evaluate(endPos, &rootEnd, false); + + //rootChannel.Evaluate(animPos - timeToEnd, &rootNow, true); + + // Complex motion calculation to preserve the looped movement + // (end - before + now - begin) + // It sums the motion since the last update to anim end and since the start to now + srcNode.Translation = rootEnd.Translation - rootBefore.Translation + rootNode.Translation - rootBegin.Translation; + srcNode.Orientation = rootEnd.Orientation * rootBefore.Orientation.Conjugated() * (rootNode.Orientation * rootBegin.Orientation.Conjugated()); + //srcNode.Orientation = Quaternion::Identity; + } + else + { + // Simple motion delta + // (now - before) + srcNode.Translation = rootNode.Translation - rootBefore.Translation; + srcNode.Orientation = rootBefore.Orientation.Conjugated() * rootNode.Orientation; + } + + // Convert root motion from local-space to the actor-space (eg. if root node is not actually a root and its parents have rotation/scale) + auto& skeleton = _graph.BaseModel->Skeleton; + int32 parentIndex = skeleton.Nodes[rootNodeIndex].ParentIndex; + while (parentIndex != -1) + { + const Transform& parentNode = nodes->Nodes[parentIndex]; + srcNode.Translation = parentNode.LocalToWorld(srcNode.Translation); + parentIndex = skeleton.Nodes[parentIndex].ParentIndex; + } + } + + // Remove root node motion after extraction + rootNode = refPose; // Blend root motion if (mode == ProcessAnimationMode::BlendAdditive) { dstNode.Translation += srcNode.Translation * weight; - BlendAdditiveWeightedRotation(dstNode.Rotation, srcNode.Rotation, weight); + BlendAdditiveWeightedRotation(dstNode.Orientation, srcNode.Orientation, weight); } else if (mode == ProcessAnimationMode::Add) { dstNode.Translation += srcNode.Translation * weight; - dstNode.Rotation += srcNode.Rotation * weight; + dstNode.Orientation += srcNode.Orientation * weight; } else if (weighted) { dstNode.Translation = srcNode.Translation * weight; - dstNode.Rotation = srcNode.Rotation * weight; + dstNode.Orientation = srcNode.Orientation * weight; } else { @@ -349,6 +399,7 @@ Variant AnimGraphExecutor::SampleAnimation(AnimGraphNode* node, bool loop, float nodes->Position = pos; nodes->Length = length; ProcessAnimation(nodes, node, loop, length, pos, prevPos, anim, speed); + NormalizeRotations(nodes, _rootMotionMode); return nodes; } @@ -370,16 +421,7 @@ Variant AnimGraphExecutor::SampleAnimationsWithBlend(AnimGraphNode* node, bool l nodes->Length = length; ProcessAnimation(nodes, node, loop, length, pos, prevPos, animA, speedA, 1.0f - alpha, ProcessAnimationMode::Override); ProcessAnimation(nodes, node, loop, length, pos, prevPos, animB, speedB, alpha, ProcessAnimationMode::BlendAdditive); - - // Normalize rotations - for (int32 i = 0; i < nodes->Nodes.Count(); i++) - { - nodes->Nodes[i].Orientation.Normalize(); - } - if (_rootMotionMode != RootMotionMode::NoExtraction) - { - nodes->RootMotion.Rotation.Normalize(); - } + NormalizeRotations(nodes, _rootMotionMode); return nodes; } @@ -404,16 +446,7 @@ Variant AnimGraphExecutor::SampleAnimationsWithBlend(AnimGraphNode* node, bool l ProcessAnimation(nodes, node, loop, length, pos, prevPos, animA, speedA, alphaA, ProcessAnimationMode::Override); ProcessAnimation(nodes, node, loop, length, pos, prevPos, animB, speedB, alphaB, ProcessAnimationMode::BlendAdditive); ProcessAnimation(nodes, node, loop, length, pos, prevPos, animC, speedC, alphaC, ProcessAnimationMode::BlendAdditive); - - // Normalize rotations - for (int32 i = 0; i < nodes->Nodes.Count(); i++) - { - nodes->Nodes[i].Orientation.Normalize(); - } - if (_rootMotionMode != RootMotionMode::NoExtraction) - { - nodes->RootMotion.Rotation.Normalize(); - } + NormalizeRotations(nodes, _rootMotionMode); return nodes; } @@ -437,7 +470,7 @@ Variant AnimGraphExecutor::Blend(AnimGraphNode* node, const Value& poseA, const { Transform::Lerp(nodesA->Nodes[i], nodesB->Nodes[i], alpha, nodes->Nodes[i]); } - RootMotionData::Lerp(nodesA->RootMotion, nodesB->RootMotion, alpha, nodes->RootMotion); + Transform::Lerp(nodesA->RootMotion, nodesB->RootMotion, alpha, nodes->RootMotion); nodes->Position = Math::Lerp(nodesA->Position, nodesB->Position, alpha); nodes->Length = Math::Lerp(nodesA->Length, nodesB->Length, alpha); @@ -463,6 +496,79 @@ Variant AnimGraphExecutor::SampleState(AnimGraphNode* state) return result; } +void AnimGraphExecutor::UpdateStateTransitions(AnimGraphContext& context, const AnimGraphNode::StateMachineData& stateMachineData, AnimGraphInstanceData::StateMachineBucket& stateMachineBucket, const AnimGraphNode::StateBaseData& stateData) +{ + int32 transitionIndex = 0; + while (transitionIndex < ANIM_GRAPH_MAX_STATE_TRANSITIONS && stateData.Transitions[transitionIndex] != AnimGraphNode::StateData::InvalidTransitionIndex) + { + const uint16 idx = stateData.Transitions[transitionIndex]; + ASSERT(idx < stateMachineData.Graph->StateTransitions.Count()); + auto& transition = stateMachineData.Graph->StateTransitions[idx]; + if (transition.Destination == stateMachineBucket.CurrentState) + { + // Ignore transition to the current state + transitionIndex++; + continue; + } + const bool useDefaultRule = EnumHasAnyFlags(transition.Flags, AnimGraphStateTransition::FlagTypes::UseDefaultRule); + if (transition.RuleGraph && !useDefaultRule) + { + // Execute transition rule + auto rootNode = transition.RuleGraph->GetRootNode(); + ASSERT(rootNode); + if (!(bool)eatBox((Node*)rootNode, &rootNode->Boxes[0])) + { + transitionIndex++; + continue; + } + } + + // Evaluate source state transition data (position, length, etc.) + const Value sourceStatePtr = SampleState(stateMachineBucket.CurrentState); + auto& transitionData = context.TransitionData; // Note: this could support nested transitions but who uses state machine inside transition rule? + if (ANIM_GRAPH_IS_VALID_PTR(sourceStatePtr)) + { + // Use source state as data provider + const auto sourceState = (AnimGraphImpulse*)sourceStatePtr.AsPointer; + auto sourceLength = Math::Max(sourceState->Length, 0.0f); + transitionData.Position = Math::Clamp(sourceState->Position, 0.0f, sourceLength); + transitionData.Length = sourceLength; + } + else + { + // Reset + transitionData.Position = 0; + transitionData.Length = ZeroTolerance; + } + + // Check if can trigger the transition + bool canEnter = false; + if (useDefaultRule) + { + // Start transition when the current state animation is about to end (split blend duration evenly into two states) + const auto transitionDurationHalf = transition.BlendDuration * 0.5f + ZeroTolerance; + const auto endPos = transitionData.Length - transitionDurationHalf; + canEnter = transitionData.Position >= endPos; + } + else if (transition.RuleGraph) + canEnter = true; + if (canEnter) + { + // Start transition + stateMachineBucket.ActiveTransition = &transition; + stateMachineBucket.TransitionPosition = 0.0f; + break; + } + + // Skip after Solo transition + // TODO: don't load transitions after first enabled Solo transition and remove this check here + if (EnumHasAnyFlags(transition.Flags, AnimGraphStateTransition::FlagTypes::Solo)) + break; + + transitionIndex++; + } +} + void ComputeMultiBlendLength(float& length, AnimGraphNode* node) { ANIM_GRAPH_PROFILE_EVENT("Setup Mutli Blend Length"); @@ -643,9 +749,6 @@ void AnimGraphExecutor::ProcessGroupAnimation(Box* boxBase, Node* nodeBase, Valu { const auto anim = node->Assets[0].As(); auto& bucket = context.Data->State[node->BucketIndex].Animation; - const float speed = (float)tryGetValue(node->GetBox(5), node->Values[1]); - const bool loop = (bool)tryGetValue(node->GetBox(6), node->Values[2]); - const float startTimePos = (float)tryGetValue(node->GetBox(7), node->Values[3]); switch (box->ID) { @@ -653,6 +756,9 @@ void AnimGraphExecutor::ProcessGroupAnimation(Box* boxBase, Node* nodeBase, Valu case 0: { ANIM_GRAPH_PROFILE_EVENT("Animation"); + const float speed = (float)tryGetValue(node->GetBox(5), node->Values[1]); + const bool loop = (bool)tryGetValue(node->GetBox(6), node->Values[2]); + const float startTimePos = (float)tryGetValue(node->GetBox(7), node->Values[3]); const float length = anim ? anim->GetLength() : 0.0f; // Calculate new time position @@ -672,14 +778,20 @@ void AnimGraphExecutor::ProcessGroupAnimation(Box* boxBase, Node* nodeBase, Valu } // Normalized Time case 1: + { + const float startTimePos = (float)tryGetValue(node->GetBox(7), node->Values[3]); value = startTimePos + bucket.TimePosition; if (anim && anim->IsLoaded()) value.AsFloat /= anim->GetLength(); break; + } // Time case 2: + { + const float startTimePos = (float)tryGetValue(node->GetBox(7), node->Values[3]); value = startTimePos + bucket.TimePosition; break; + } // Length case 3: value = anim ? anim->GetLength() : 0.0f; @@ -912,7 +1024,7 @@ void AnimGraphExecutor::ProcessGroupAnimation(Box* boxBase, Node* nodeBase, Valu { Transform::Lerp(nodesA->Nodes[i], nodesB->Nodes[i], alpha, nodes->Nodes[i]); } - RootMotionData::Lerp(nodesA->RootMotion, nodesB->RootMotion, alpha, nodes->RootMotion); + Transform::Lerp(nodesA->RootMotion, nodesB->RootMotion, alpha, nodes->RootMotion); value = nodes; } @@ -958,7 +1070,7 @@ void AnimGraphExecutor::ProcessGroupAnimation(Box* boxBase, Node* nodeBase, Valu t.Orientation.Normalize(); Transform::Lerp(tA, t, alpha, nodes->Nodes[i]); } - RootMotionData::Lerp(nodesA->RootMotion, nodesA->RootMotion + nodesB->RootMotion, alpha, nodes->RootMotion); + Transform::Lerp(nodesA->RootMotion, nodesA->RootMotion + nodesB->RootMotion, alpha, nodes->RootMotion); value = nodes; } } @@ -1006,7 +1118,7 @@ void AnimGraphExecutor::ProcessGroupAnimation(Box* boxBase, Node* nodeBase, Valu nodes->Nodes[nodeIndex] = tA; } } - RootMotionData::Lerp(nodesA->RootMotion, nodesB->RootMotion, alpha, nodes->RootMotion); + Transform::Lerp(nodesA->RootMotion, nodesB->RootMotion, alpha, nodes->RootMotion); value = nodes; } @@ -1391,7 +1503,7 @@ void AnimGraphExecutor::ProcessGroupAnimation(Box* boxBase, Node* nodeBase, Valu value = poseData->RootMotion.Translation; break; case 1: - value = poseData->RootMotion.Rotation; + value = poseData->RootMotion.Orientation; break; } } @@ -1423,7 +1535,7 @@ void AnimGraphExecutor::ProcessGroupAnimation(Box* boxBase, Node* nodeBase, Valu auto nodes = node->GetNodes(this); nodes->Nodes = poseData->Nodes; nodes->RootMotion.Translation = (Vector3)tryGetValue(node->GetBox(2), Value::Zero); - nodes->RootMotion.Rotation = (Quaternion)tryGetValue(node->GetBox(3), Value::Zero); + nodes->RootMotion.Orientation = (Quaternion)tryGetValue(node->GetBox(3), Value::Zero); value = nodes; break; } @@ -1441,19 +1553,18 @@ void AnimGraphExecutor::ProcessGroupAnimation(Box* boxBase, Node* nodeBase, Valu auto nodes = node->GetNodes(this); nodes->Nodes = poseData->Nodes; nodes->RootMotion.Translation = poseData->RootMotion.Translation + (Vector3)tryGetValue(node->GetBox(2), Value::Zero); - nodes->RootMotion.Rotation = poseData->RootMotion.Rotation * (Quaternion)tryGetValue(node->GetBox(3), Value::Zero); + nodes->RootMotion.Orientation = poseData->RootMotion.Orientation * (Quaternion)tryGetValue(node->GetBox(3), Value::Zero); value = nodes; break; } // State Machine case 18: { + ANIM_GRAPH_PROFILE_EVENT("State Machine"); const int32 maxTransitionsPerUpdate = node->Values[2].AsInt; const bool reinitializeOnBecomingRelevant = node->Values[3].AsBool; const bool skipFirstUpdateTransition = node->Values[4].AsBool; - ANIM_GRAPH_PROFILE_EVENT("State Machine"); - // Prepare auto& bucket = context.Data->State[node->BucketIndex].StateMachine; auto& data = node->Data.StateMachine; @@ -1485,6 +1596,11 @@ void AnimGraphExecutor::ProcessGroupAnimation(Box* boxBase, Node* nodeBase, Valu // Reset all state buckets pof the graphs and nodes included inside the state machine ResetBuckets(context, data.Graph); } +#define END_TRANSITION() \ + ResetBuckets(context, bucket.CurrentState->Data.State.Graph); \ + bucket.CurrentState = bucket.ActiveTransition->Destination; \ + bucket.ActiveTransition = nullptr; \ + bucket.TransitionPosition = 0.0f // Update the active transition if (bucket.ActiveTransition) @@ -1494,95 +1610,66 @@ void AnimGraphExecutor::ProcessGroupAnimation(Box* boxBase, Node* nodeBase, Valu // Check for transition end if (bucket.TransitionPosition >= bucket.ActiveTransition->BlendDuration) { - // End transition - ResetBuckets(context, bucket.CurrentState->Data.State.Graph); - bucket.CurrentState = bucket.ActiveTransition->Destination; - bucket.ActiveTransition = nullptr; - bucket.TransitionPosition = 0.0f; + END_TRANSITION(); + } + // Check for transition interruption + else if (EnumHasAnyFlags(bucket.ActiveTransition->Flags, AnimGraphStateTransition::FlagTypes::InterruptionRuleRechecking)) + { + const bool useDefaultRule = EnumHasAnyFlags(bucket.ActiveTransition->Flags, AnimGraphStateTransition::FlagTypes::UseDefaultRule); + if (bucket.ActiveTransition->RuleGraph && !useDefaultRule) + { + // Execute transition rule + auto rootNode = bucket.ActiveTransition->RuleGraph->GetRootNode(); + if (!(bool)eatBox((Node*)rootNode, &rootNode->Boxes[0])) + { + bool cancelTransition = false; + if (EnumHasAnyFlags(bucket.ActiveTransition->Flags, AnimGraphStateTransition::FlagTypes::InterruptionInstant)) + { + cancelTransition = true; + } + else + { + // Blend back to the source state (remove currently applied delta and rewind transition) + bucket.TransitionPosition -= context.DeltaTime; + bucket.TransitionPosition -= context.DeltaTime; + if (bucket.TransitionPosition <= ZeroTolerance) + { + cancelTransition = true; + } + } + if (cancelTransition) + { + // Go back to the source state + ResetBuckets(context, bucket.CurrentState->Data.State.Graph); + bucket.ActiveTransition = nullptr; + bucket.TransitionPosition = 0.0f; + } + } + } } } - ASSERT(bucket.CurrentState && bucket.CurrentState->GroupID == 9 && bucket.CurrentState->TypeID == 20); + ASSERT(bucket.CurrentState && bucket.CurrentState->Type == GRAPH_NODE_MAKE_TYPE(9, 20)); // Update transitions - // Note: this logic assumes that all transitions are sorted by Order property and Enabled + // Note: this logic assumes that all transitions are sorted by Order property and Enabled (by Editor when saving Anim Graph asset) while (!bucket.ActiveTransition && transitionsLeft-- > 0) { - // Check if can change the current state - const auto& stateData = bucket.CurrentState->Data.State; - int32 transitionIndex = 0; - while (stateData.Transitions[transitionIndex] != AnimGraphNode::StateData::InvalidTransitionIndex - && transitionIndex < ANIM_GRAPH_MAX_STATE_TRANSITIONS) + // State transitions + UpdateStateTransitions(context, data, bucket, bucket.CurrentState->Data.State); + + // Any state transitions + // TODO: cache Any state nodes inside State Machine to optimize the loop below + for (const AnimGraphNode& anyStateNode : data.Graph->Nodes) { - const uint16 idx = stateData.Transitions[transitionIndex]; - ASSERT(idx < data.Graph->StateTransitions.Count()); - auto& transition = data.Graph->StateTransitions[idx]; - const bool useDefaultRule = EnumHasAnyFlags(transition.Flags, AnimGraphStateTransition::FlagTypes::UseDefaultRule); - if (transition.RuleGraph && !useDefaultRule) - { - // Execute transition rule - auto rootNode = transition.RuleGraph->GetRootNode(); - ASSERT(rootNode); - if (!(bool)eatBox((Node*)rootNode, &rootNode->Boxes[0])) - { - transitionIndex++; - continue; - } - } - - // Evaluate source state transition data (position, length, etc.) - const Value sourceStatePtr = SampleState(bucket.CurrentState); - auto& transitionData = context.TransitionData; // Note: this could support nested transitions but who uses state machine inside transition rule? - if (ANIM_GRAPH_IS_VALID_PTR(sourceStatePtr)) - { - // Use source state as data provider - const auto sourceState = (AnimGraphImpulse*)sourceStatePtr.AsPointer; - auto sourceLength = Math::Max(sourceState->Length, 0.0f); - transitionData.Position = Math::Clamp(sourceState->Position, 0.0f, sourceLength); - transitionData.Length = sourceLength; - } - else - { - // Reset - transitionData.Position = 0; - transitionData.Length = ZeroTolerance; - } - - // Check if can trigger the transition - bool canEnter = false; - if (useDefaultRule) - { - // Start transition when the current state animation is about to end (split blend duration evenly into two states) - const auto transitionDurationHalf = transition.BlendDuration * 0.5f + ZeroTolerance; - const auto endPos = transitionData.Length - transitionDurationHalf; - canEnter = transitionData.Position >= endPos; - } - else if (transition.RuleGraph) - canEnter = true; - if (canEnter) - { - // Start transition - bucket.ActiveTransition = &transition; - bucket.TransitionPosition = 0.0f; - break; - } - - // Skip after Solo transition - // TODO: don't load transitions after first enabled Solo transition and remove this check here - if (EnumHasAnyFlags(transition.Flags, AnimGraphStateTransition::FlagTypes::Solo)) - break; - - transitionIndex++; + if (anyStateNode.Type == GRAPH_NODE_MAKE_TYPE(9, 34)) + UpdateStateTransitions(context, data, bucket, anyStateNode.Data.AnyState); } // Check for instant transitions if (bucket.ActiveTransition && bucket.ActiveTransition->BlendDuration <= ZeroTolerance) { - // End transition - ResetBuckets(context, bucket.CurrentState->Data.State.Graph); - bucket.CurrentState = bucket.ActiveTransition->Destination; - bucket.ActiveTransition = nullptr; - bucket.TransitionPosition = 0.0f; + END_TRANSITION(); } } @@ -1603,18 +1690,16 @@ void AnimGraphExecutor::ProcessGroupAnimation(Box* boxBase, Node* nodeBase, Valu // Update bucket bucket.LastUpdateFrame = context.CurrentFrameIndex; +#undef END_TRANSITION break; } // Entry case 19: - { - // Not used - CRASH; - break; - } // State case 20: + // Any State + case 34: { // Not used CRASH; @@ -1622,8 +1707,6 @@ void AnimGraphExecutor::ProcessGroupAnimation(Box* boxBase, Node* nodeBase, Valu } // State Output case 21: - value = box->HasConnection() ? eatBox(nodeBase, box->FirstConnection()) : Value::Null; - break; // Rule Output case 22: value = box->HasConnection() ? eatBox(nodeBase, box->FirstConnection()) : Value::Null; diff --git a/Source/Engine/Animations/SceneAnimations/SceneAnimationPlayer.cpp b/Source/Engine/Animations/SceneAnimations/SceneAnimationPlayer.cpp index dda6e6fcb..fa7999ce0 100644 --- a/Source/Engine/Animations/SceneAnimations/SceneAnimationPlayer.cpp +++ b/Source/Engine/Animations/SceneAnimations/SceneAnimationPlayer.cpp @@ -13,12 +13,12 @@ #include "Engine/Renderer/RenderList.h" #include "Engine/Scripting/Scripting.h" #include "Engine/Scripting/Script.h" -#include "Engine/Scripting/MException.h" +#include "Engine/Scripting/ManagedCLR/MException.h" #include "Engine/Scripting/ManagedCLR/MProperty.h" #include "Engine/Scripting/ManagedCLR/MUtils.h" -#include "Engine/Scripting/ManagedCLR/MType.h" #include "Engine/Scripting/ManagedCLR/MField.h" #include "Engine/Scripting/ManagedCLR/MClass.h" +#include "Engine/Scripting/ManagedCLR/MMethod.h" // This could be Update, LateUpdate or FixedUpdate #define UPDATE_POINT Update @@ -260,7 +260,7 @@ void SceneAnimationPlayer::MapTrack(const StringView& from, const Guid& to) void SceneAnimationPlayer::Restore(SceneAnimation* anim, int32 stateIndexOffset) { -#if USE_MONO +#if USE_CSHARP // Restore all tracks for (int32 j = 0; j < anim->Tracks.Count(); j++) { @@ -364,7 +364,7 @@ void SceneAnimationPlayer::Restore(SceneAnimation* anim, int32 stateIndexOffset) bool SceneAnimationPlayer::TickPropertyTrack(int32 trackIndex, int32 stateIndexOffset, SceneAnimation* anim, float time, const SceneAnimation::Track& track, TrackInstance& state, void* target) { -#if USE_MONO +#if USE_CSHARP switch (track.Type) { case SceneAnimation::Track::Types::KeyframesProperty: @@ -511,7 +511,7 @@ bool SceneAnimationPlayer::TickPropertyTrack(int32 trackIndex, int32 stateIndexO // Return the value StringView str(keyframesValues[leftKey], keyframesLengths[leftKey]); - *(MonoString**)target = MUtils::ToString(str); + *(MString**)target = MUtils::ToString(str); break; } case SceneAnimation::Track::Types::StructProperty: @@ -528,10 +528,10 @@ bool SceneAnimationPlayer::TickPropertyTrack(int32 trackIndex, int32 stateIndexO // Cache field if (!childTrackState.Field) { - MType type = state.Property ? state.Property->GetType() : (state.Field ? state.Field->GetType() : MType()); + MType* type = state.Property ? state.Property->GetType() : (state.Field ? state.Field->GetType() : nullptr); if (!type) continue; - MClass* mclass = Scripting::FindClass(mono_type_get_class(type.GetNative())); + MClass* mclass = MCore::Type::GetClass(type); childTrackState.Field = mclass->GetField(childTrackRuntimeData->PropertyName); if (!childTrackState.Field) continue; @@ -556,7 +556,7 @@ bool SceneAnimationPlayer::TickPropertyTrack(int32 trackIndex, int32 stateIndexO void SceneAnimationPlayer::Tick(SceneAnimation* anim, float time, float dt, int32 stateIndexOffset, CallStack& callStack) { -#if USE_MONO +#if USE_CSHARP const float fps = anim->FramesPerSecond; #if !BUILD_RELEASE || USE_EDITOR callStack.Add(anim); @@ -873,7 +873,7 @@ void SceneAnimationPlayer::Tick(SceneAnimation* anim, float time, float dt, int3 // Cache property or field if (!state.Property && !state.Field) { - MClass* mclass = Scripting::FindClass(mono_object_get_class(instance)); + MClass* mclass = MCore::Object::GetClass(instance); state.Property = mclass->GetProperty(runtimeData->PropertyName); if (!state.Property) { @@ -886,9 +886,8 @@ void SceneAnimationPlayer::Tick(SceneAnimation* anim, float time, float dt, int3 } // Get stack memory for data value - MType valueType = state.Property ? state.Property->GetType() : state.Field->GetType(); - int32 valueAlignment; - int32 valueSize = mono_type_stack_size(valueType.GetNative(), &valueAlignment); + MType* valueType = state.Property ? state.Property->GetType() : state.Field->GetType(); + int32 valueSize = MCore::Type::GetSize(valueType); _tracksDataStack.AddDefault(valueSize); void* value = &_tracksDataStack[_tracksDataStack.Count() - valueSize]; @@ -906,10 +905,10 @@ void SceneAnimationPlayer::Tick(SceneAnimation* anim, float time, float dt, int3 MException ex(exception); ex.Log(LogType::Error, TEXT("Property")); } - else if (!valueType.IsPointer()) + else if (!MCore::Type::IsPointer(valueType)) { if (boxed) - Platform::MemoryCopy(value, mono_object_unbox(boxed), valueSize); + Platform::MemoryCopy(value, MCore::Object::Unbox(boxed), valueSize); else Platform::MemoryClear(value, valueSize); } @@ -932,7 +931,7 @@ void SceneAnimationPlayer::Tick(SceneAnimation* anim, float time, float dt, int3 case SceneAnimation::Track::Types::StringProperty: { StringView str; - MUtils::ToString(*(MonoString**)value, str); + MUtils::ToString(*(MString**)value, str); _restoreData.Add((byte*)str.Get(), str.Length()); _restoreData.Add('\0'); break; @@ -957,7 +956,7 @@ void SceneAnimationPlayer::Tick(SceneAnimation* anim, float time, float dt, int3 if (TickPropertyTrack(j, stateIndexOffset, anim, time, track, state, value)) { // Set the value - if (valueType.IsPointer()) + if (MCore::Type::IsPointer(valueType)) value = (void*)*(intptr*)value; if (state.Property) { @@ -1027,7 +1026,7 @@ void SceneAnimationPlayer::Tick(SceneAnimation* anim, float time, float dt, int3 // Cache method if (!state.Method) { - state.Method = mono_class_get_method_from_name(mono_object_get_class(instance), runtimeData->EventName, runtimeData->EventParamsCount); + state.Method = MCore::Object::GetClass(instance)->FindMethod(runtimeData->EventName, runtimeData->EventParamsCount); if (!state.Method) break; } @@ -1035,7 +1034,7 @@ void SceneAnimationPlayer::Tick(SceneAnimation* anim, float time, float dt, int3 // Invoke the method Variant result; MObject* exception = nullptr; - mono_runtime_invoke((MonoMethod*)state.Method, instance, paramsData, &exception); + state.Method->Invoke(instance, paramsData, &exception); if (exception) { MException ex(exception); diff --git a/Source/Engine/Animations/SceneAnimations/SceneAnimationPlayer.h b/Source/Engine/Animations/SceneAnimations/SceneAnimationPlayer.h index 46ebc918d..55cb35bb2 100644 --- a/Source/Engine/Animations/SceneAnimations/SceneAnimationPlayer.h +++ b/Source/Engine/Animations/SceneAnimations/SceneAnimationPlayer.h @@ -46,7 +46,7 @@ private: MObject* ManagedObject = nullptr; MProperty* Property = nullptr; MField* Field = nullptr; - void* Method = nullptr; + MMethod* Method = nullptr; int32 RestoreStateIndex = -1; bool Warn = true; diff --git a/Source/Engine/Audio/Audio.Build.cs b/Source/Engine/Audio/Audio.Build.cs index 03e7ba2aa..c3296c6f9 100644 --- a/Source/Engine/Audio/Audio.Build.cs +++ b/Source/Engine/Audio/Audio.Build.cs @@ -57,6 +57,9 @@ public class Audio : EngineModule case TargetPlatform.Mac: useOpenAL = true; break; + case TargetPlatform.iOS: + useOpenAL = true; + break; default: throw new InvalidPlatformException(options.Platform.Target); } @@ -91,6 +94,11 @@ public class Audio : EngineModule options.Libraries.Add("AudioUnit.framework"); options.Libraries.Add("AudioToolbox.framework"); break; + case TargetPlatform.iOS: + options.OutputFiles.Add(Path.Combine(depsRoot, "libopenal.a")); + options.Libraries.Add("CoreAudio.framework"); + options.Libraries.Add("AudioToolbox.framework"); + break; default: throw new InvalidPlatformException(options.Platform.Target); } } diff --git a/Source/Engine/Content/Asset.cpp b/Source/Engine/Content/Asset.cpp index 7eec9ac16..309a82e04 100644 --- a/Source/Engine/Content/Asset.cpp +++ b/Source/Engine/Content/Asset.cpp @@ -12,9 +12,7 @@ #include "Engine/Profiler/ProfilerCPU.h" #include "Engine/Threading/MainThreadTask.h" #include "Engine/Threading/ConcurrentTaskQueue.h" -#if USE_MONO -#include -#endif +#include "Engine/Scripting/ManagedCLR/MCore.h" AssetReferenceBase::~AssetReferenceBase() { @@ -269,9 +267,7 @@ void Asset::OnManagedInstanceDeleted() // Cleanup if (_gcHandle) { -#if USE_MONO - mono_gchandle_free(_gcHandle); -#endif + MCore::GCHandle::Free(_gcHandle); _gcHandle = 0; } @@ -399,6 +395,11 @@ bool Asset::WaitForLoaded(double timeoutInMilliseconds) const return false; } + // Check if loading failed + Platform::MemoryBarrier(); + if (LastLoadFailed()) + return true; + // Check if has missing loading task Platform::MemoryBarrier(); const auto loadingTask = _loadingTask; diff --git a/Source/Engine/Content/Assets/Animation.cpp b/Source/Engine/Content/Assets/Animation.cpp index e9ce2a1cb..8aa635244 100644 --- a/Source/Engine/Content/Assets/Animation.cpp +++ b/Source/Engine/Content/Assets/Animation.cpp @@ -3,7 +3,6 @@ #include "Animation.h" #include "SkinnedModel.h" #include "Engine/Core/Log.h" -#include "Engine/Profiler/ProfilerCPU.h" #include "Engine/Content/Factories/BinaryAssetFactory.h" #include "Engine/Animations/CurveSerialization.h" #include "Engine/Animations/AnimEvent.h" @@ -30,9 +29,7 @@ void Animation::OnScriptsReloadStart() for (auto& e : Events) { for (auto& k : e.Second.GetKeyframes()) - { Level::ScriptsReloadRegisterObject((ScriptingObject*&)k.Value.Instance); - } } } @@ -67,72 +64,11 @@ Animation::InfoData Animation::GetInfo() const } info.MemoryUsage += Events.Capacity() * sizeof(Pair>); info.MemoryUsage += NestedAnims.Capacity() * sizeof(Pair); - info.MemoryUsage += MappingCache.Capacity() * (sizeof(void*) + sizeof(NodeToChannel) + 1); for (auto& e : Events) info.MemoryUsage += e.Second.GetKeyframes().Capacity() * sizeof(StepCurve); - for (auto& e : MappingCache) - info.MemoryUsage += e.Value.Capacity() * sizeof(int32); return info; } -void Animation::ClearCache() -{ - ScopeLock lock(Locker); - - // Unlink events - for (auto i = MappingCache.Begin(); i.IsNotEnd(); ++i) - { - i->Key->OnUnloaded.Unbind(this); - i->Key->OnReloading.Unbind(this); - } - - // Free memory - MappingCache.Clear(); - MappingCache.SetCapacity(0); -} - -const Animation::NodeToChannel* Animation::GetMapping(SkinnedModel* obj) -{ - ASSERT(obj && obj->IsLoaded() && IsLoaded()); - - ScopeLock lock(Locker); - - // Try quick lookup - NodeToChannel* result = MappingCache.TryGet(obj); - if (result == nullptr) - { - PROFILE_CPU(); - - // Add to cache - NodeToChannel tmp; - auto bucket = MappingCache.Add(obj, tmp); - result = &bucket->Value; - obj->OnUnloaded.Bind(this); - obj->OnReloading.Bind(this); - - // Initialize the mapping - const auto& skeleton = obj->Skeleton; - const int32 nodesCount = skeleton.Nodes.Count(); - result->Resize(nodesCount, false); - result->SetAll(-1); - for (int32 i = 0; i < Data.Channels.Count(); i++) - { - auto& nodeAnim = Data.Channels[i]; - - for (int32 j = 0; j < nodesCount; j++) - { - if (skeleton.Nodes[j].Name == nodeAnim.NodeName) - { - result->At(j) = i; - break; - } - } - } - } - - return result; -} - #if USE_EDITOR void Animation::LoadTimeline(BytesContainer& result) const @@ -552,23 +488,6 @@ bool Animation::Save(const StringView& path) #endif -void Animation::OnSkinnedModelUnloaded(Asset* obj) -{ - ScopeLock lock(Locker); - - const auto key = static_cast(obj); - auto i = MappingCache.Find(key); - ASSERT(i != MappingCache.End()); - - // Unlink event - key->OnUnloaded.Unbind(this); - key->OnReloading.Unbind(this); - - // Clear cache - i->Value.Resize(0, false); - MappingCache.Remove(i); -} - uint64 Animation::GetMemoryUsage() const { Locker.Lock(); @@ -579,9 +498,6 @@ uint64 Animation::GetMemoryUsage() const for (const auto& e : Events) result += e.First.Length() * sizeof(Char) + e.Second.GetMemoryUsage(); result += NestedAnims.Capacity() * sizeof(Pair); - result += MappingCache.Capacity() * sizeof(Pair>); - for (const auto& e : MappingCache) - result += e.Value.Capacity() * sizeof(int32); Locker.Unlock(); return result; } @@ -738,7 +654,6 @@ void Animation::unload(bool isReloading) Level::ScriptsReloadStart.Unbind(this); } #endif - ClearCache(); Data.Dispose(); for (const auto& e : Events) { diff --git a/Source/Engine/Content/Assets/Animation.h b/Source/Engine/Content/Assets/Animation.h index 6d89039fe..5a96e5bc0 100644 --- a/Source/Engine/Content/Assets/Animation.h +++ b/Source/Engine/Content/Assets/Animation.h @@ -98,17 +98,6 @@ public: /// Array> NestedAnims; - /// - /// Contains the mapping for every skeleton node to the animation data channels. - /// Can be used for a simple lookup or to check if a given node is animated (unused nodes are using -1 index). - /// - typedef Array NodeToChannel; - - /// - /// The skeleton nodes to animation channel indices mapping cache. Use it as read-only. It's being maintained internally by the asset. - /// - Dictionary MappingCache; - public: /// /// Gets the length of the animation (in seconds). @@ -139,18 +128,6 @@ public: /// API_PROPERTY() InfoData GetInfo() const; - /// - /// Clears the skeleton mapping cache. - /// - void ClearCache(); - - /// - /// Clears the skeleton mapping cache. - /// - /// The target skinned model to get mapping to its skeleton. - /// The cached node-to-channel mapping for the fast animation sampling for the skinned model skeleton nodes. - const NodeToChannel* GetMapping(SkinnedModel* obj); - #if USE_EDITOR /// /// Gets the animation as serialized timeline data. Used to show it in Editor. @@ -174,9 +151,6 @@ public: bool Save(const StringView& path = StringView::Empty); #endif -private: - void OnSkinnedModelUnloaded(Asset* obj); - public: // [BinaryAsset] uint64 GetMemoryUsage() const override; diff --git a/Source/Engine/Content/Assets/SkinnedModel.cpp b/Source/Engine/Content/Assets/SkinnedModel.cpp index 603f685d8..a2e687131 100644 --- a/Source/Engine/Content/Assets/SkinnedModel.cpp +++ b/Source/Engine/Content/Assets/SkinnedModel.cpp @@ -1,6 +1,7 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #include "SkinnedModel.h" +#include "Animation.h" #include "Engine/Core/Log.h" #include "Engine/Engine/Engine.h" #include "Engine/Serialization/MemoryReadStream.h" @@ -11,10 +12,12 @@ #include "Engine/Graphics/RenderTask.h" #include "Engine/Graphics/Models/ModelInstanceEntry.h" #include "Engine/Graphics/Models/Config.h" +#include "Engine/Content/Content.h" #include "Engine/Content/WeakAssetReference.h" #include "Engine/Content/Factories/BinaryAssetFactory.h" #include "Engine/Content/Upgraders/SkinnedModelAssetUpgrader.h" #include "Engine/Debug/Exceptions/ArgumentOutOfRangeException.h" +#include "Engine/Profiler/ProfilerCPU.h" #include "Engine/Renderer/DrawCall.h" #define CHECK_INVALID_BUFFER(model, buffer) \ @@ -116,6 +119,7 @@ SkinnedModel::SkinnedModel(const SpawnParams& params, const AssetInfo* info) SkinnedModel::~SkinnedModel() { ASSERT(_streamingTask == nullptr); + ASSERT(_skeletonMappingCache.Count() == 0); } bool SkinnedModel::HasAnyLODInitialized() const @@ -152,23 +156,165 @@ void SkinnedModel::GetLODData(int32 lodIndex, BytesContainer& data) const GetChunkData(chunkIndex, data); } +SkinnedModel::SkeletonMapping SkinnedModel::GetSkeletonMapping(Asset* source) +{ + SkeletonMapping mapping; + mapping.TargetSkeleton = this; + if (WaitForLoaded() || !source || source->WaitForLoaded()) + return mapping; + ScopeLock lock(Locker); + SkeletonMappingData mappingData; + if (!_skeletonMappingCache.TryGet(source, mappingData)) + { + PROFILE_CPU(); + + // Initialize the mapping + const int32 nodesCount = Skeleton.Nodes.Count(); + mappingData.NodesMapping = Span((int32*)Allocator::Allocate(nodesCount * sizeof(int32)), nodesCount); + for (int32 i = 0; i < nodesCount; i++) + mappingData.NodesMapping[i] = -1; + SkeletonRetarget* retarget = nullptr; + const Guid sourceId = source->GetID(); + for (auto& e : _skeletonRetargets) + { + if (e.SourceAsset == sourceId) + { + retarget = &e; + break; + } + } + if (const auto* sourceAnim = Cast(source)) + { + const auto& channels = sourceAnim->Data.Channels; + if (retarget && retarget->SkeletonAsset) + { + // Map retarget skeleton nodes from animation channels + if (auto* skeleton = Content::Load(retarget->SkeletonAsset)) + { + const SkeletonMapping skeletonMapping = GetSkeletonMapping(skeleton); + mappingData.SourceSkeleton = skeleton; + if (skeletonMapping.NodesMapping.Length() == nodesCount) + { + const auto& nodes = skeleton->Skeleton.Nodes; + for (int32 j = 0; j < nodesCount; j++) + { + if (skeletonMapping.NodesMapping[j] != -1) + { + const Char* nodeName = nodes[skeletonMapping.NodesMapping[j]].Name.GetText(); + for (int32 i = 0; i < channels.Count(); i++) + { + if (StringUtils::CompareIgnoreCase(nodeName, channels[i].NodeName.GetText()) == 0) + { + mappingData.NodesMapping[j] = i; + break; + } + } + } + } + } + } + else + { + #if !BUILD_RELEASE + LOG(Error, "Missing asset {0} to use for skeleton mapping of {1}", retarget->SkeletonAsset, ToString()); + #endif + return mapping; + } + } + else + { + // Map animation channels to the skeleton nodes (by name) + for (int32 i = 0; i < channels.Count(); i++) + { + const NodeAnimationData& nodeAnim = channels[i]; + for (int32 j = 0; j < nodesCount; j++) + { + if (StringUtils::CompareIgnoreCase(Skeleton.Nodes[j].Name.GetText(), nodeAnim.NodeName.GetText()) == 0) + { + mappingData.NodesMapping[j] = i; + break; + } + } + } + } + } + else if (const auto* sourceModel = Cast(source)) + { + if (retarget) + { + // Use nodes retargeting + for (const auto& e : retarget->NodesMapping) + { + const int32 dstIndex = Skeleton.FindNode(e.Key); + const int32 srcIndex = sourceModel->Skeleton.FindNode(e.Value); + if (dstIndex != -1 && srcIndex != -1) + { + mappingData.NodesMapping[dstIndex] = srcIndex; + } + } + } + else + { + // Map source skeleton nodes to the target skeleton nodes (by name) + const auto& nodes = sourceModel->Skeleton.Nodes; + for (int32 i = 0; i < nodes.Count(); i++) + { + const SkeletonNode& node = nodes[i]; + for (int32 j = 0; j < nodesCount; j++) + { + if (StringUtils::CompareIgnoreCase(Skeleton.Nodes[j].Name.GetText(), node.Name.GetText()) == 0) + { + mappingData.NodesMapping[j] = i; + break; + } + } + } + } + } + else + { +#if !BUILD_RELEASE + LOG(Error, "Invalid asset type {0} to use for skeleton mapping of {1}", source->GetTypeName(), ToString()); +#endif + } + + // Add to cache + _skeletonMappingCache.Add(source, mappingData); + source->OnUnloaded.Bind(this); +#if USE_EDITOR + source->OnReloading.Bind(this); +#endif + } + mapping.SourceSkeleton = mappingData.SourceSkeleton; + mapping.NodesMapping = mappingData.NodesMapping; + return mapping; +} + bool SkinnedModel::Intersects(const Ray& ray, const Matrix& world, Real& distance, Vector3& normal, SkinnedMesh** mesh, int32 lodIndex) { + if (LODs.Count() == 0) + return false; return LODs[lodIndex].Intersects(ray, world, distance, normal, mesh); } bool SkinnedModel::Intersects(const Ray& ray, const Transform& transform, Real& distance, Vector3& normal, SkinnedMesh** mesh, int32 lodIndex) { + if (LODs.Count() == 0) + return false; return LODs[lodIndex].Intersects(ray, transform, distance, normal, mesh); } BoundingBox SkinnedModel::GetBox(const Matrix& world, int32 lodIndex) const { + if (LODs.Count() == 0) + return BoundingBox::Zero; return LODs[lodIndex].GetBox(world); } BoundingBox SkinnedModel::GetBox(int32 lodIndex) const { + if (LODs.Count() == 0) + return BoundingBox::Zero; return LODs[lodIndex].GetBox(); } @@ -305,10 +451,8 @@ bool SkinnedModel::SetupSkeleton(const Array& nodes) ScopeLock lock(model->Locker); - // Setup nodes + // Setup model->Skeleton.Nodes = nodes; - - // Setup bones model->Skeleton.Bones.Resize(nodes.Count()); for (int32 i = 0; i < nodes.Count(); i++) { @@ -317,6 +461,7 @@ bool SkinnedModel::SetupSkeleton(const Array& nodes) model->Skeleton.Bones[i].LocalTransform = node.LocalTransform; model->Skeleton.Bones[i].NodeIndex = i; } + ClearSkeletonMapping(); // Calculate offset matrix (inverse bind pose transform) for every bone manually for (int32 i = 0; i < model->Skeleton.Bones.Count(); i++) @@ -351,11 +496,10 @@ bool SkinnedModel::SetupSkeleton(const Array& nodes, const ArrayLocker); - // Setup nodes + // Setup model->Skeleton.Nodes = nodes; - - // Setup bones model->Skeleton.Bones = bones; + ClearSkeletonMapping(); // Calculate offset matrix (inverse bind pose transform) for every bone manually if (autoCalculateOffsetMatrix) @@ -412,6 +556,9 @@ bool SkinnedModel::Save(bool withMeshDataFromGpu, const StringView& path) MemoryWriteStream headerStream(1024); MemoryWriteStream* stream = &headerStream; { + // Header Version + stream->WriteByte(1); + // Min Screen Size stream->WriteFloat(MinScreenSize); @@ -499,6 +646,17 @@ bool SkinnedModel::Save(bool withMeshDataFromGpu, const StringView& path) stream->Write(bone.OffsetMatrix); } } + + // Retargeting + { + stream->WriteInt32(_skeletonRetargets.Count()); + for (const auto& retarget : _skeletonRetargets) + { + stream->Write(retarget.SourceAsset); + stream->Write(retarget.SkeletonAsset); + stream->Write(retarget.NodesMapping); + } + } } // Use a temporary chunks for data storage for virtual assets @@ -552,8 +710,6 @@ bool SkinnedModel::Save(bool withMeshDataFromGpu, const StringView& path) task->Start(); tasks.Add(task); } - - // Wait for all if (Task::WaitAll(tasks)) return true; tasks.Clear(); @@ -562,12 +718,10 @@ bool SkinnedModel::Save(bool withMeshDataFromGpu, const StringView& path) { int32 dataSize = meshesCount * (2 * sizeof(uint32) + sizeof(bool)); for (int32 meshIndex = 0; meshIndex < meshesCount; meshIndex++) - { dataSize += meshesData[meshIndex].DataSize(); - } - - MemoryWriteStream meshesStream(dataSize); + MemoryWriteStream meshesStream(Math::RoundUpToPowerOf2(dataSize)); + meshesStream.WriteByte(1); for (int32 meshIndex = 0; meshIndex < meshesCount; meshIndex++) { const auto& mesh = lod.Meshes[meshIndex]; @@ -597,10 +751,10 @@ bool SkinnedModel::Save(bool withMeshDataFromGpu, const StringView& path) return true; } + // #MODEL_DATA_FORMAT_USAGE meshesStream.WriteUint32(vertices); meshesStream.WriteUint32(triangles); meshesStream.WriteUint16(mesh.BlendShapes.Count()); - for (const auto& blendShape : mesh.BlendShapes) { meshesStream.WriteBool(blendShape.UseNormals); @@ -609,9 +763,7 @@ bool SkinnedModel::Save(bool withMeshDataFromGpu, const StringView& path) meshesStream.WriteUint32(blendShape.Vertices.Count()); meshesStream.WriteBytes(blendShape.Vertices.Get(), blendShape.Vertices.Count() * sizeof(BlendShapeVertex)); } - meshesStream.WriteBytes(meshData.VB0.Get(), vb0Size); - if (shouldUse16BitIndexBuffer == use16BitIndexBuffer) { meshesStream.WriteBytes(meshData.IB.Get(), ibSize); @@ -690,11 +842,10 @@ bool SkinnedModel::Init(const Span& meshesCountPerLod) // Setup MaterialSlots.Resize(1); MinScreenSize = 0.0f; - - // Setup LODs for (int32 lodIndex = 0; lodIndex < LODs.Count(); lodIndex++) LODs[lodIndex].Dispose(); LODs.Resize(meshesCountPerLod.Length()); + _initialized = true; // Setup meshes for (int32 lodIndex = 0; lodIndex < meshesCountPerLod.Length(); lodIndex++) @@ -720,6 +871,49 @@ bool SkinnedModel::Init(const Span& meshesCountPerLod) return false; } +void SkinnedModel::ClearSkeletonMapping() +{ + for (auto& e : _skeletonMappingCache) + { + e.Key->OnUnloaded.Unbind(this); +#if USE_EDITOR + e.Key->OnReloading.Unbind(this); +#endif + Allocator::Free(e.Value.NodesMapping.Get()); + } + _skeletonMappingCache.Clear(); +} + +void SkinnedModel::OnSkeletonMappingSourceAssetUnloaded(Asset* obj) +{ + ScopeLock lock(Locker); + auto i = _skeletonMappingCache.Find(obj); + ASSERT(i != _skeletonMappingCache.End()); + + // Unlink event + obj->OnUnloaded.Unbind(this); +#if USE_EDITOR + obj->OnReloading.Unbind(this); +#endif + + // Clear cache + Allocator::Free(i->Value.NodesMapping.Get()); + _skeletonMappingCache.Remove(i); +} + +uint64 SkinnedModel::GetMemoryUsage() const +{ + Locker.Lock(); + uint64 result = BinaryAsset::GetMemoryUsage(); + result += sizeof(SkinnedModel) - sizeof(BinaryAsset); + result += Skeleton.GetMemoryUsage(); + result += _skeletonMappingCache.Capacity() * sizeof(Dictionary>::Bucket); + for (const auto& e : _skeletonMappingCache) + result += e.Value.NodesMapping.Length(); + Locker.Unlock(); + return result; +} + void SkinnedModel::SetupMaterialSlots(int32 slotsCount) { ModelBase::SetupMaterialSlots(slotsCount); @@ -754,6 +948,7 @@ void SkinnedModel::InitAsVirtual() // Init with one mesh and single bone int32 meshesCount = 1; Init(ToSpan(&meshesCount, 1)); + ClearSkeletonMapping(); Skeleton.Dispose(); // Skeleton.Nodes.Resize(1); @@ -874,13 +1069,16 @@ Asset::LoadResult SkinnedModel::load() MemoryReadStream headerStream(chunk0->Get(), chunk0->Size()); ReadStream* stream = &headerStream; + // Header Version + byte version = stream->ReadByte(); + // Min Screen Size stream->ReadFloat(&MinScreenSize); // Amount of material slots int32 materialSlotsCount; stream->ReadInt32(&materialSlotsCount); - if (materialSlotsCount <= 0 || materialSlotsCount > 4096) + if (materialSlotsCount < 0 || materialSlotsCount > 4096) return LoadResult::InvalidData; MaterialSlots.Resize(materialSlotsCount, false); @@ -904,9 +1102,10 @@ Asset::LoadResult SkinnedModel::load() // Amount of LODs byte lods; stream->ReadByte(&lods); - if (lods == 0 || lods > MODEL_MAX_LODS) + if (lods > MODEL_MAX_LODS) return LoadResult::InvalidData; LODs.Resize(lods); + _initialized = true; // For each LOD for (int32 lodIndex = 0; lodIndex < lods; lodIndex++) @@ -972,12 +1171,9 @@ Asset::LoadResult SkinnedModel::load() if (nodesCount <= 0) return LoadResult::InvalidData; Skeleton.Nodes.Resize(nodesCount, false); - - // For each node for (int32 nodeIndex = 0; nodeIndex < nodesCount; nodeIndex++) { - auto& node = Skeleton.Nodes[nodeIndex]; - + auto& node = Skeleton.Nodes.Get()[nodeIndex]; stream->Read(node.ParentIndex); stream->ReadTransform(&node.LocalTransform); stream->ReadString(&node.Name, 71); @@ -988,12 +1184,9 @@ Asset::LoadResult SkinnedModel::load() if (bonesCount <= 0) return LoadResult::InvalidData; Skeleton.Bones.Resize(bonesCount, false); - - // For each bone for (int32 boneIndex = 0; boneIndex < bonesCount; boneIndex++) { - auto& bone = Skeleton.Bones[boneIndex]; - + auto& bone = Skeleton.Bones.Get()[boneIndex]; stream->Read(bone.ParentIndex); stream->Read(bone.NodeIndex); stream->ReadTransform(&bone.LocalTransform); @@ -1001,6 +1194,20 @@ Asset::LoadResult SkinnedModel::load() } } + // Retargeting + { + int32 entriesCount; + stream->ReadInt32(&entriesCount); + _skeletonRetargets.Resize(entriesCount); + for (int32 entryIndex = 0; entryIndex < entriesCount; entryIndex++) + { + auto& retarget = _skeletonRetargets[entryIndex]; + stream->Read(retarget.SourceAsset); + stream->Read(retarget.SkeletonAsset); + stream->Read(retarget.NodesMapping); + } + } + // Request resource streaming StartStreaming(true); @@ -1023,7 +1230,10 @@ void SkinnedModel::unload(bool isReloading) LODs[i].Dispose(); LODs.Clear(); Skeleton.Dispose(); + _initialized = false; _loadedLODs = 0; + _skeletonRetargets.Clear(); + ClearSkeletonMapping(); } bool SkinnedModel::init(AssetInitData& initData) diff --git a/Source/Engine/Content/Assets/SkinnedModel.h b/Source/Engine/Content/Assets/SkinnedModel.h index 02afcacba..11fc0c0aa 100644 --- a/Source/Engine/Content/Assets/SkinnedModel.h +++ b/Source/Engine/Content/Assets/SkinnedModel.h @@ -14,12 +14,32 @@ class StreamSkinnedModelLODTask; /// API_CLASS(NoSpawn) class FLAXENGINE_API SkinnedModel : public ModelBase { - DECLARE_BINARY_ASSET_HEADER(SkinnedModel, 4); + DECLARE_BINARY_ASSET_HEADER(SkinnedModel, 5); friend SkinnedMesh; friend StreamSkinnedModelLODTask; +public: + // Skeleton mapping descriptor. + struct FLAXENGINE_API SkeletonMapping + { + // Target skeleton. + AssetReference TargetSkeleton; + // Source skeleton. + AssetReference SourceSkeleton; + // The node-to-node mapping for the fast animation sampling for the skinned model skeleton nodes. Each item is index of the source skeleton node into target skeleton node. + Span NodesMapping; + }; + private: + struct SkeletonMappingData + { + AssetReference SourceSkeleton; + Span NodesMapping; + }; + + bool _initialized = false; int32 _loadedLODs = 0; StreamSkinnedModelLODTask* _streamingTask = nullptr; + Dictionary _skeletonMappingCache; public: /// @@ -44,7 +64,7 @@ public: /// FORCE_INLINE bool IsInitialized() const { - return LODs.HasItems(); + return _initialized; } /// @@ -76,13 +96,11 @@ public: /// /// Determines whether any LOD has been initialized. /// - /// True if any LOD has been initialized, otherwise false. bool HasAnyLODInitialized() const; /// /// Determines whether this model can be rendered. /// - /// True if can render that model, otherwise false. FORCE_INLINE bool CanBeRendered() const { return _loadedLODs > 0; @@ -109,7 +127,7 @@ public: /// /// The name of the node. /// The index of the node or -1 if not found. - API_FUNCTION() FORCE_INLINE int32 FindNode(const StringView& name) + API_FUNCTION() FORCE_INLINE int32 FindNode(const StringView& name) const { return Skeleton.FindNode(name); } @@ -119,7 +137,7 @@ public: /// /// The name of the node used by the bone. /// The index of the bone or -1 if not found. - API_FUNCTION() FORCE_INLINE int32 FindBone(const StringView& name) + API_FUNCTION() FORCE_INLINE int32 FindBone(const StringView& name) const { return FindBone(FindNode(name)); } @@ -129,7 +147,7 @@ public: /// /// The index of the node. /// The index of the bone or -1 if not found. - API_FUNCTION() FORCE_INLINE int32 FindBone(int32 nodeIndex) + API_FUNCTION() FORCE_INLINE int32 FindBone(int32 nodeIndex) const { return Skeleton.FindBone(nodeIndex); } @@ -154,7 +172,13 @@ public: /// The data (may be missing if failed to get it). void GetLODData(int32 lodIndex, BytesContainer& data) const; -public: + /// + /// Gets the skeleton mapping for a given asset (animation or other skinned model). Uses identity mapping or manually created retargeting setup. + /// + /// The source asset (animation or other skinned model) to get mapping to its skeleton. + /// The skeleton mapping for the source asset into this skeleton. + SkeletonMapping GetSkeletonMapping(Asset* source); + /// /// Determines if there is an intersection between the SkinnedModel and a Ray in given world using given instance. /// @@ -194,7 +218,6 @@ public: /// The bounding box. API_FUNCTION() BoundingBox GetBox(int32 lodIndex = 0) const; -public: /// /// Draws the meshes. Binds vertex and index buffers and invokes the draw calls. /// @@ -219,7 +242,6 @@ public: /// The packed drawing info data. void Draw(const RenderContextBatch& renderContextBatch, const SkinnedMesh::DrawInfo& info); -public: /// /// Setups the model LODs collection including meshes creation. /// @@ -244,7 +266,6 @@ public: API_FUNCTION() bool SetupSkeleton(const Array& nodes, const Array& bones, bool autoCalculateOffsetMatrix); #if USE_EDITOR - /// /// Saves this asset to the file. Supported only in Editor. /// @@ -253,7 +274,6 @@ public: /// The custom asset path to use for the saving. Use empty value to save this asset to its own storage location. Can be used to duplicate asset. Must be specified when saving virtual asset. /// True if cannot save data, otherwise false. API_FUNCTION() bool Save(bool withMeshDataFromGpu = false, const StringView& path = StringView::Empty); - #endif private: @@ -264,8 +284,38 @@ private: /// True if failed, otherwise false. bool Init(const Span& meshesCountPerLod); + void ClearSkeletonMapping(); + void OnSkeletonMappingSourceAssetUnloaded(Asset* obj); + +#if USE_EDITOR +public: + // Skeleton retargeting setup (internal use only - accessed by Editor) + API_STRUCT(NoDefault) struct SkeletonRetarget + { + DECLARE_SCRIPTING_TYPE_MINIMAL(SkeletonRetarget); + // Source asset id. + API_FIELD() Guid SourceAsset; + // Skeleton asset id to use for remapping. + API_FIELD() Guid SkeletonAsset; + // Skeleton nodes remapping table (maps this skeleton node name to other skeleton node). + API_FIELD() Dictionary NodesMapping; + }; + // Gets or sets the skeleton retarget entries (accessed in Editor only). + API_PROPERTY() const Array& GetSkeletonRetargets() const { return _skeletonRetargets; } + API_PROPERTY() void SetSkeletonRetargets(const Array& value) { Locker.Lock(); _skeletonRetargets = value; ClearSkeletonMapping(); Locker.Unlock(); } +private: +#else + struct SkeletonRetarget + { + Guid SourceAsset, SkeletonAsset; + Dictionary NodesMapping; + }; +#endif + Array _skeletonRetargets; + public: // [ModelBase] + uint64 GetMemoryUsage() const override; void SetupMaterialSlots(int32 slotsCount) override; int32 GetLODsCount() const override; void GetMeshes(Array& meshes, int32 lodIndex = 0) override; diff --git a/Source/Engine/Content/Assets/Texture.cpp b/Source/Engine/Content/Assets/Texture.cpp index 33154fae8..d796db914 100644 --- a/Source/Engine/Content/Assets/Texture.cpp +++ b/Source/Engine/Content/Assets/Texture.cpp @@ -7,7 +7,7 @@ #include "Engine/Platform/FileSystem.h" #include "Engine/Graphics/RenderTools.h" #include "Engine/Graphics/Textures/TextureData.h" -#include "Engine/Scripting/MainThreadManagedInvokeAction.h" +#include "Engine/Scripting/Internal/MainThreadManagedInvokeAction.h" #include "Engine/Tools/TextureTool/TextureTool.h" REGISTER_BINARY_ASSET_WITH_UPGRADER(Texture, "FlaxEngine.Texture", TextureAssetUpgrader, true); diff --git a/Source/Engine/Content/Assets/VisualScript.cpp b/Source/Engine/Content/Assets/VisualScript.cpp index 932a611da..b11a2af96 100644 --- a/Source/Engine/Content/Assets/VisualScript.cpp +++ b/Source/Engine/Content/Assets/VisualScript.cpp @@ -5,14 +5,13 @@ #include "Engine/Core/Types/DataContainer.h" #include "Engine/Content/Content.h" #include "Engine/Content/Factories/BinaryAssetFactory.h" -#include "Engine/Scripting/MException.h" #include "Engine/Scripting/Scripting.h" #include "Engine/Scripting/Events.h" #include "Engine/Scripting/ManagedCLR/MClass.h" #include "Engine/Scripting/ManagedCLR/MMethod.h" #include "Engine/Scripting/ManagedCLR/MField.h" #include "Engine/Scripting/ManagedCLR/MUtils.h" -#include "Engine/Scripting/ManagedCLR/MType.h" +#include "Engine/Scripting/ManagedCLR/MException.h" #include "Engine/Serialization/MemoryReadStream.h" #include "Engine/Serialization/MemoryWriteStream.h" #include "Engine/Serialization/Serialization.h" @@ -310,15 +309,15 @@ void VisualScriptExecutor::ProcessGroupTools(Box* box, Node* node, Value& value) const StringAsANSI<100> typeNameAnsi(typeName.Get(), typeName.Length()); if (StringUtils::Compare(typeNameAnsi.Get(), obj.Type.GetTypeName()) != 0) { -#if USE_MONO - MonoClass* klass = Scripting::FindClassNative(StringAnsiView(typeNameAnsi.Get(), typeName.Length())); - MonoClass* objKlass = MUtils::GetClass(obj); - if (!klass || !objKlass || mono_class_is_subclass_of(objKlass, klass, false) == 0) +#if USE_CSHARP + MClass* klass = Scripting::FindClass(StringAnsiView(typeNameAnsi.Get(), typeName.Length())); + MClass* objKlass = MUtils::GetClass(obj); + if (!klass || !objKlass || !objKlass->IsSubClassOf(klass)) obj = Value::Null; #else const ScriptingTypeHandle type = Scripting::FindScriptingType(StringAnsiView(typeNameAnsi.Get(), typeName.Length())); const ScriptingTypeHandle objType = Scripting::FindScriptingType(obj.Type.GetTypeName()); - if (!type || !objType || objType.IsSubclassOf(type)) + if (!type || !objType || !objType.IsSubclassOf(type)) obj = Value::Null; #endif } diff --git a/Source/Engine/Content/Content.cpp b/Source/Engine/Content/Content.cpp index c28ed61ef..0d06dbba8 100644 --- a/Source/Engine/Content/Content.cpp +++ b/Source/Engine/Content/Content.cpp @@ -760,9 +760,14 @@ bool Content::CloneAssetFile(const StringView& dstPath, const StringView& srcPat // Change asset ID { auto storage = ContentStorageManager::GetStorage(tmpPath); + if (!storage) + { + LOG(Warning, "Cannot change asset ID."); + return true; + } FlaxStorage::Entry e; storage->GetEntry(0, e); - if (!storage || storage->ChangeAssetID(e, dstId)) + if (storage->ChangeAssetID(e, dstId)) { LOG(Warning, "Cannot change asset ID."); return true; diff --git a/Source/Engine/Content/JsonAsset.cpp b/Source/Engine/Content/JsonAsset.cpp index 86880e56b..1fbc2abed 100644 --- a/Source/Engine/Content/JsonAsset.cpp +++ b/Source/Engine/Content/JsonAsset.cpp @@ -416,9 +416,13 @@ void JsonAsset::DeleteInstance() ScopeLock lock(Locker); // C# instance - if (MObject* object = GetManagedInstance()) + MObject* object = GetManagedInstance(); + MClass* klass = GetClass(); + if (object && klass) { - GetClass()->GetField("_instance")->SetValue(object, nullptr); + const MField* field = klass->GetField("_instance"); + if (field) + field->SetValue(object, nullptr); } // C++ instance diff --git a/Source/Engine/Content/JsonAsset.cs b/Source/Engine/Content/JsonAsset.cs index afd83bafd..6ba13a2d5 100644 --- a/Source/Engine/Content/JsonAsset.cs +++ b/Source/Engine/Content/JsonAsset.cs @@ -40,7 +40,7 @@ namespace FlaxEngine Debug.LogError(string.Format("Missing typename of data in Json asset '{0}'.", Path), this); return null; } - var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + var assemblies = Utils.GetAssemblies(); for (int i = 0; i < assemblies.Length; i++) { var assembly = assemblies[i]; diff --git a/Source/Engine/Content/Storage/FlaxStorage.cpp b/Source/Engine/Content/Storage/FlaxStorage.cpp index 8608a34f6..52d7c34b5 100644 --- a/Source/Engine/Content/Storage/FlaxStorage.cpp +++ b/Source/Engine/Content/Storage/FlaxStorage.cpp @@ -211,6 +211,12 @@ FlaxStorage::~FlaxStorage() CHECK(_chunksLock == 0); CHECK(_refCount == 0); ASSERT(_chunks.IsEmpty()); + +#if USE_EDITOR + // Ensure to close any outstanding file handles to prevent file locking in case it failed to load + _file.DeleteAll(); +#endif + } FlaxStorage::LockData FlaxStorage::LockSafe() diff --git a/Source/Engine/Content/Upgraders/ModelAssetUpgrader.h b/Source/Engine/Content/Upgraders/ModelAssetUpgrader.h index eb8b2ca2b..977f27349 100644 --- a/Source/Engine/Content/Upgraders/ModelAssetUpgrader.h +++ b/Source/Engine/Content/Upgraders/ModelAssetUpgrader.h @@ -26,10 +26,10 @@ public: { static const Upgrader upgraders[] = { - { 24, 25, &Upgrade_With_Repack }, - { 23, 24, &Upgrade_22OrNewer_To_Newest }, - { 22, 24, &Upgrade_22OrNewer_To_Newest }, - { 1, 24, &Upgrade_Old_To_Newest }, + { 24, 25, &Upgrade_With_Repack }, // [Deprecated on 28.04.2023, expires on 01.01.2024] + { 23, 24, &Upgrade_22OrNewer_To_Newest }, // [Deprecated on 28.04.2023, expires on 01.01.2024] + { 22, 24, &Upgrade_22OrNewer_To_Newest }, // [Deprecated on 28.04.2023, expires on 01.01.2024] + { 1, 24, &Upgrade_Old_To_Newest }, // [Deprecated on 28.04.2023, expires on 01.01.2024] }; setup(upgraders, ARRAY_COUNT(upgraders)); } diff --git a/Source/Engine/Content/Upgraders/SkinnedModelAssetUpgrader.h b/Source/Engine/Content/Upgraders/SkinnedModelAssetUpgrader.h index cd3eb75d1..49be3b347 100644 --- a/Source/Engine/Content/Upgraders/SkinnedModelAssetUpgrader.h +++ b/Source/Engine/Content/Upgraders/SkinnedModelAssetUpgrader.h @@ -28,9 +28,10 @@ public: { static const Upgrader upgraders[] = { - { 1, 2, &Upgrade_1_To_2 }, - { 2, 3, &Upgrade_2_To_3 }, - { 3, 4, &Upgrade_3_To_4 }, + { 1, 2, &Upgrade_1_To_2 }, // [Deprecated on 28.04.2023, expires on 01.01.2024] + { 2, 3, &Upgrade_2_To_3 }, // [Deprecated on 28.04.2023, expires on 01.01.2024] + { 3, 4, &Upgrade_3_To_4 }, // [Deprecated on 28.04.2023, expires on 01.01.2024] + { 4, 5, &Upgrade_4_To_5 }, // [Deprecated on 28.04.2023, expires on 28.04.2026] }; setup(upgraders, ARRAY_COUNT(upgraders)); } @@ -57,7 +58,6 @@ private: MemoryWriteStream output(srcData->Size()); do { - // #MODEL_DATA_FORMAT_USAGE uint32 vertices; stream.ReadUint32(&vertices); uint32 triangles; @@ -422,6 +422,241 @@ private: return false; } + + static bool Upgrade_4_To_5(AssetMigrationContext& context) + { + ASSERT(context.Input.SerializedVersion == 4 && context.Output.SerializedVersion == 5); + + // Changes: + // - added version number to header (for easier changes in future) + // - added version number to mesh data (for easier changes in future) + // - added skeleton retarget setups to header + + // Rewrite header chunk (added header version and retarget entries) + byte lodCount; + Array meshesCounts; + { + const auto srcData = context.Input.Header.Chunks[0]; + if (srcData == nullptr || srcData->IsMissing()) + { + LOG(Warning, "Missing model header chunk"); + return true; + } + MemoryReadStream stream(srcData->Get(), srcData->Size()); + MemoryWriteStream output(srcData->Size()); + + // Header Version + output.WriteByte(1); + + // Min Screen Size + float minScreenSize; + stream.ReadFloat(&minScreenSize); + output.WriteFloat(minScreenSize); + + // Amount of material slots + int32 materialSlotsCount; + stream.ReadInt32(&materialSlotsCount); + output.WriteInt32(materialSlotsCount); + + // For each material slot + for (int32 materialSlotIndex = 0; materialSlotIndex < materialSlotsCount; materialSlotIndex++) + { + // Material + Guid materialId; + stream.Read(materialId); + output.Write(materialId); + + // Shadows Mode + output.WriteByte(stream.ReadByte()); + + // Name + String name; + stream.ReadString(&name, 11); + output.WriteString(name, 11); + } + + // Amount of LODs + stream.ReadByte(&lodCount); + output.WriteByte(lodCount); + meshesCounts.Resize(lodCount); + + // For each LOD + for (int32 lodIndex = 0; lodIndex < lodCount; lodIndex++) + { + // Screen Size + float screenSize; + stream.ReadFloat(&screenSize); + output.WriteFloat(screenSize); + + // Amount of meshes + uint16 meshesCount; + stream.ReadUint16(&meshesCount); + output.WriteUint16(meshesCount); + meshesCounts[lodIndex] = meshesCount; + + // For each mesh + for (uint16 meshIndex = 0; meshIndex < meshesCount; meshIndex++) + { + // Material Slot index + int32 materialSlotIndex; + stream.ReadInt32(&materialSlotIndex); + output.WriteInt32(materialSlotIndex); + + // Box + BoundingBox box; + stream.Read(box); + output.Write(box); + + // Sphere + BoundingSphere sphere; + stream.Read(sphere); + output.Write(sphere); + + // Blend Shapes + uint16 blendShapes; + stream.ReadUint16(&blendShapes); + output.WriteUint16(blendShapes); + for (int32 blendShapeIndex = 0; blendShapeIndex < blendShapes; blendShapeIndex++) + { + String blendShapeName; + stream.ReadString(&blendShapeName, 13); + output.WriteString(blendShapeName, 13); + float blendShapeWeight; + stream.ReadFloat(&blendShapeWeight); + output.WriteFloat(blendShapeWeight); + } + } + } + + // Skeleton + { + int32 nodesCount; + stream.ReadInt32(&nodesCount); + output.WriteInt32(nodesCount); + + // For each node + for (int32 nodeIndex = 0; nodeIndex < nodesCount; nodeIndex++) + { + int32 parentIndex; + stream.ReadInt32(&parentIndex); + output.WriteInt32(parentIndex); + + Transform localTransform; + stream.Read(localTransform); + output.Write(localTransform); + + String name; + stream.ReadString(&name, 71); + output.WriteString(name, 71); + } + + int32 bonesCount; + stream.ReadInt32(&bonesCount); + output.WriteInt32(bonesCount); + + // For each bone + for (int32 boneIndex = 0; boneIndex < bonesCount; boneIndex++) + { + int32 parentIndex; + stream.ReadInt32(&parentIndex); + output.WriteInt32(parentIndex); + + int32 nodeIndex; + stream.ReadInt32(&nodeIndex); + output.WriteInt32(nodeIndex); + + Transform localTransform; + stream.Read(localTransform); + output.Write(localTransform); + + Matrix offsetMatrix; + stream.ReadBytes(&offsetMatrix, sizeof(Matrix)); + output.WriteBytes(&offsetMatrix, sizeof(Matrix)); + } + } + + // Retargeting + { + output.WriteInt32(0); + } + + // Save new data + if (stream.GetPosition() != stream.GetLength()) + { + LOG(Error, "Invalid position after upgrading skinned model header data."); + return true; + } + if (context.AllocateChunk(0)) + return true; + context.Output.Header.Chunks[0]->Data.Copy(output.GetHandle(), output.GetPosition()); + } + + // Rewrite meshes data chunks + for (int32 lodIndex = 0; lodIndex < lodCount; lodIndex++) + { + const int32 chunkIndex = lodIndex + 1; + const auto srcData = context.Input.Header.Chunks[chunkIndex]; + if (srcData == nullptr || srcData->IsMissing()) + { + LOG(Warning, "Missing skinned model LOD meshes data chunk"); + return true; + } + MemoryReadStream stream(srcData->Get(), srcData->Size()); + MemoryWriteStream output(srcData->Size()); + + // Mesh Data Version + output.WriteByte(1); + + for (int32 meshIndex = 0; meshIndex < meshesCounts[lodIndex]; meshIndex++) + { + uint32 vertices; + stream.ReadUint32(&vertices); + output.WriteUint32(vertices); + uint32 triangles; + stream.ReadUint32(&triangles); + output.WriteUint32(triangles); + uint16 blendShapesCount; + stream.ReadUint16(&blendShapesCount); + output.WriteUint16(blendShapesCount); + for (int32 blendShapeIndex = 0; blendShapeIndex < blendShapesCount; blendShapeIndex++) + { + output.WriteBool(stream.ReadBool()); + uint32 minVertexIndex, maxVertexIndex; + stream.ReadUint32(&minVertexIndex); + output.WriteUint32(minVertexIndex); + stream.ReadUint32(&maxVertexIndex); + output.WriteUint32(maxVertexIndex); + uint32 blendShapeVertices; + stream.ReadUint32(&blendShapeVertices); + output.WriteUint32(blendShapeVertices); + const uint32 blendShapeDataSize = blendShapeVertices * sizeof(BlendShapeVertex); + const auto blendShapeData = stream.Move(blendShapeDataSize); + output.WriteBytes(blendShapeData, blendShapeDataSize); + } + const uint32 indicesCount = triangles * 3; + const bool use16BitIndexBuffer = indicesCount <= MAX_uint16; + const uint32 ibStride = use16BitIndexBuffer ? sizeof(uint16) : sizeof(uint32); + if (vertices == 0 || triangles == 0) + return true; + const auto vb0 = stream.Move(vertices); + output.WriteBytes(vb0, vertices * sizeof(VB0SkinnedElementType)); + const auto ib = stream.Move(indicesCount * ibStride); + output.WriteBytes(ib, indicesCount * ibStride); + } + + // Save new data + if (stream.GetPosition() != stream.GetLength()) + { + LOG(Error, "Invalid position after upgrading skinned model LOD meshes data."); + return true; + } + if (context.AllocateChunk(chunkIndex)) + return true; + context.Output.Header.Chunks[chunkIndex]->Data.Copy(output.GetHandle(), output.GetPosition()); + } + + return false; + } }; #endif diff --git a/Source/Engine/ContentExporters/ExportModel.cpp b/Source/Engine/ContentExporters/ExportModel.cpp index 1134108e6..f68e6162b 100644 --- a/Source/Engine/ContentExporters/ExportModel.cpp +++ b/Source/Engine/ContentExporters/ExportModel.cpp @@ -151,6 +151,7 @@ ExportAssetResult AssetExporters::ExportSkinnedModel(ExportAssetContext& context // Extract all meshes const auto& lod = asset->LODs[lodIndex]; int32 vertexStart = 1; // OBJ counts vertices from 1 not from 0 + byte version = stream.ReadByte(); for (int32 meshIndex = 0; meshIndex < lod.Meshes.Count(); meshIndex++) { auto& mesh = lod.Meshes[meshIndex]; @@ -160,6 +161,18 @@ ExportAssetResult AssetExporters::ExportSkinnedModel(ExportAssetContext& context stream.ReadUint32(&vertices); uint32 triangles; stream.ReadUint32(&triangles); + uint16 blendShapesCount; + stream.ReadUint16(&blendShapesCount); + for (int32 blendShapeIndex = 0; blendShapeIndex < blendShapesCount; blendShapeIndex++) + { + stream.ReadBool(); + uint32 tmp; + stream.ReadUint32(&tmp); + stream.ReadUint32(&tmp); + uint32 blendShapeVertices; + stream.ReadUint32(&blendShapeVertices); + stream.Move(blendShapeVertices * sizeof(BlendShapeVertex)); + } uint32 indicesCount = triangles * 3; bool use16BitIndexBuffer = indicesCount <= MAX_uint16; uint32 ibStride = use16BitIndexBuffer ? sizeof(uint16) : sizeof(uint32); diff --git a/Source/Engine/ContentImporters/CreateJson.cpp b/Source/Engine/ContentImporters/CreateJson.cpp index ed4926505..3ca21601c 100644 --- a/Source/Engine/ContentImporters/CreateJson.cpp +++ b/Source/Engine/ContentImporters/CreateJson.cpp @@ -30,7 +30,7 @@ bool CreateJson::Create(const StringView& path, rapidjson_flax::StringBuffer& da return Create(path, data1, data2); } -bool CreateJson::Create(const StringView& path, StringAnsiView& data, StringAnsiView& dataTypename) +bool CreateJson::Create(const StringView& path, const StringAnsiView& data, const StringAnsiView& dataTypename) { Guid id = Guid::New(); diff --git a/Source/Engine/ContentImporters/CreateJson.h b/Source/Engine/ContentImporters/CreateJson.h index c3a3da58d..abe119dd7 100644 --- a/Source/Engine/ContentImporters/CreateJson.h +++ b/Source/Engine/ContentImporters/CreateJson.h @@ -16,7 +16,7 @@ class CreateJson public: static bool Create(const StringView& path, rapidjson_flax::StringBuffer& data, const String& dataTypename); static bool Create(const StringView& path, rapidjson_flax::StringBuffer& data, const char* dataTypename); - static bool Create(const StringView& path, StringAnsiView& data, StringAnsiView& dataTypename); + static bool Create(const StringView& path, const StringAnsiView& data, const StringAnsiView& dataTypename); static CreateAssetResult ImportPo(CreateAssetContext& context); }; diff --git a/Source/Engine/ContentImporters/ImportAudio.cpp b/Source/Engine/ContentImporters/ImportAudio.cpp index a9955a4d4..10915b2d1 100644 --- a/Source/Engine/ContentImporters/ImportAudio.cpp +++ b/Source/Engine/ContentImporters/ImportAudio.cpp @@ -45,12 +45,11 @@ void ImportAudio::Options::Deserialize(DeserializeStream& stream, ISerializeModi DESERIALIZE(BitDepth); } -bool ImportAudio::TryGetImportOptions(const String& path, Options& options) +bool ImportAudio::TryGetImportOptions(const StringView& path, Options& options) { #if IMPORT_AUDIO_CACHE_OPTIONS if (FileSystem::FileExists(path)) { - // Try to load asset file and asset info auto tmpFile = ContentStorageManager::GetStorage(path); AssetInitData data; if (tmpFile @@ -64,13 +63,11 @@ bool ImportAudio::TryGetImportOptions(const String& path, Options& options) metadata.Parse(data.Metadata.Get(), data.Metadata.Length()); if (!metadata.HasParseError()) { - // Success options.Deserialize(metadata, nullptr); return true; } } } - #endif return false; } diff --git a/Source/Engine/ContentImporters/ImportAudio.h b/Source/Engine/ContentImporters/ImportAudio.h index 28c8a2e67..fb4ee64e3 100644 --- a/Source/Engine/ContentImporters/ImportAudio.h +++ b/Source/Engine/ContentImporters/ImportAudio.h @@ -45,7 +45,7 @@ public: /// The asset path. /// The options. /// True if success, otherwise false. - static bool TryGetImportOptions(const String& path, Options& options); + static bool TryGetImportOptions(const StringView& path, Options& options); /// /// Imports the audio data (with given audio decoder). diff --git a/Source/Engine/ContentImporters/ImportModel.h b/Source/Engine/ContentImporters/ImportModel.h index 6a39d0bb3..02e6bfc8d 100644 --- a/Source/Engine/ContentImporters/ImportModel.h +++ b/Source/Engine/ContentImporters/ImportModel.h @@ -28,7 +28,7 @@ public: /// The asset path. /// The options. /// True if success, otherwise false. - static bool TryGetImportOptions(String path, Options& options); + static bool TryGetImportOptions(const StringView& path, Options& options); /// /// Imports the model file. diff --git a/Source/Engine/ContentImporters/ImportModelFile.cpp b/Source/Engine/ContentImporters/ImportModelFile.cpp index 8851ee4ce..b9a4f5675 100644 --- a/Source/Engine/ContentImporters/ImportModelFile.cpp +++ b/Source/Engine/ContentImporters/ImportModelFile.cpp @@ -16,11 +16,9 @@ #include "Engine/Platform/FileSystem.h" #include "AssetsImportingManager.h" -bool ImportModelFile::TryGetImportOptions(String path, Options& options) +bool ImportModelFile::TryGetImportOptions(const StringView& path, Options& options) { #if IMPORT_MODEL_CACHE_OPTIONS - - // Check if target asset file exists if (FileSystem::FileExists(path)) { // Try to load asset file and asset info @@ -41,15 +39,12 @@ bool ImportModelFile::TryGetImportOptions(String path, Options& options) metadata.Parse((const char*)data.Metadata.Get(), data.Metadata.Length()); if (metadata.HasParseError() == false) { - // Success options.Deserialize(metadata, nullptr); return true; } } } - #endif - return false; } @@ -269,6 +264,9 @@ CreateAssetResult ImportModelFile::ImportSkinnedModel(CreateAssetContext& contex { stream.SetPosition(0); + // Mesh Data Version + stream.WriteByte(1); + // Pack meshes auto& meshes = modelData.LODs[lodIndex].Meshes; for (int32 meshIndex = 0; meshIndex < meshes.Count(); meshIndex++) diff --git a/Source/Engine/ContentImporters/ImportTexture.cpp b/Source/Engine/ContentImporters/ImportTexture.cpp index 278837729..51b93420c 100644 --- a/Source/Engine/ContentImporters/ImportTexture.cpp +++ b/Source/Engine/ContentImporters/ImportTexture.cpp @@ -1,9 +1,7 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #include "ImportTexture.h" - #if COMPILE_WITH_ASSETS_IMPORTER - #include "Engine/Core/Log.h" #include "Engine/Serialization/Serialization.h" #include "Engine/Serialization/JsonWriters.h" @@ -28,11 +26,8 @@ bool IsSpriteAtlasOrTexture(const String& typeName) bool ImportTexture::TryGetImportOptions(const StringView& path, Options& options) { #if IMPORT_TEXTURE_CACHE_OPTIONS - - // Check if target asset texture exists if (FileSystem::FileExists(path)) { - // Try to load asset file and asset info (also check for Sprite Atlas or Texture assets) auto tmpFile = ContentStorageManager::GetStorage(path); AssetInitData data; if (tmpFile @@ -48,12 +43,11 @@ bool ImportTexture::TryGetImportOptions(const StringView& path, Options& options if (chunk15 != nullptr && !tmpFile->LoadAssetChunk(chunk15) && chunk15->Data.IsValid()) { MemoryReadStream stream(chunk15->Data.Get(), chunk15->Data.Length()); - - // Load tiles data int32 tilesVersion, tilesCount; stream.ReadInt32(&tilesVersion); if (tilesVersion == 1) { + options.Sprites.Clear(); stream.ReadInt32(&tilesCount); for (int32 i = 0; i < tilesCount; i++) { @@ -72,15 +66,12 @@ bool ImportTexture::TryGetImportOptions(const StringView& path, Options& options metadata.Parse((const char*)data.Metadata.Get(), data.Metadata.Length()); if (metadata.HasParseError() == false) { - // Success options.Deserialize(metadata, nullptr); return true; } } } - #endif - return false; } diff --git a/Source/Engine/Core/Config/BuildSettings.h b/Source/Engine/Core/Config/BuildSettings.h index c2bbfa843..318c304e0 100644 --- a/Source/Engine/Core/Config/BuildSettings.h +++ b/Source/Engine/Core/Config/BuildSettings.h @@ -13,37 +13,37 @@ /// API_CLASS(sealed, Namespace="FlaxEditor.Content.Settings") class FLAXENGINE_API BuildSettings : public SettingsBase { -DECLARE_SCRIPTING_TYPE_MINIMAL(BuildSettings); -public: + DECLARE_SCRIPTING_TYPE_MINIMAL(BuildSettings); +public: /// /// The maximum amount of assets to include into a single assets package. Asset packages will split into several packages if need to. /// - API_FIELD(Attributes="EditorOrder(10), DefaultValue(4096), Limit(1, ushort.MaxValue), EditorDisplay(\"General\", \"Max assets per package\")") + API_FIELD(Attributes="EditorOrder(10), Limit(1, ushort.MaxValue), EditorDisplay(\"General\", \"Max assets per package\")") int32 MaxAssetsPerPackage = 4096; /// /// The maximum size of the single assets package (in megabytes). Asset packages will split into several packages if need to. /// - API_FIELD(Attributes="EditorOrder(20), DefaultValue(1024), Limit(1, ushort.MaxValue), EditorDisplay(\"General\", \"Max package size (in MB)\")") + API_FIELD(Attributes="EditorOrder(20), Limit(1, ushort.MaxValue), EditorDisplay(\"General\", \"Max package size (in MB)\")") int32 MaxPackageSizeMB = 1024; /// /// The game content cooking keycode. Use the same value for a game and DLC packages to support loading them by the build game. Use 0 to randomize it during building. /// - API_FIELD(Attributes="EditorOrder(30), DefaultValue(0), EditorDisplay(\"General\")") + API_FIELD(Attributes="EditorOrder(30), EditorDisplay(\"General\")") int32 ContentKey = 0; /// /// If checked, the builds produced by the Game Cooker will be treated as for final game distribution (eg. for game store upload). Builds done this way cannot be tested on console devkits (eg. Xbox One, Xbox Scarlett). /// - API_FIELD(Attributes="EditorOrder(40), DefaultValue(false), EditorDisplay(\"General\")") + API_FIELD(Attributes="EditorOrder(40), EditorDisplay(\"General\")") bool ForDistribution = false; /// /// If checked, the output build files won't be packaged for the destination platform. Useful when debugging build from local PC. /// - API_FIELD(Attributes="EditorOrder(50), DefaultValue(false), EditorDisplay(\"General\")") + API_FIELD(Attributes="EditorOrder(50), EditorDisplay(\"General\")") bool SkipPackaging = false; /// @@ -51,7 +51,7 @@ public: /// API_FIELD(Attributes="EditorOrder(1000), EditorDisplay(\"Additional Data\")") Array> AdditionalAssets; - + /// /// The list of additional scenes to include into build (into root assets set). /// @@ -67,17 +67,28 @@ public: /// /// Disables shaders compiler optimizations in cooked game. Can be used to debug shaders on a target platform or to speed up the shaders compilation time. /// - API_FIELD(Attributes="EditorOrder(2000), DefaultValue(false), EditorDisplay(\"Content\", \"Shaders No Optimize\")") + API_FIELD(Attributes="EditorOrder(2000), EditorDisplay(\"Content\", \"Shaders No Optimize\")") bool ShadersNoOptimize = false; /// /// Enables shader debug data generation for shaders in cooked game (depends on the target platform rendering backend). /// - API_FIELD(Attributes="EditorOrder(2010), DefaultValue(false), EditorDisplay(\"Content\")") + API_FIELD(Attributes="EditorOrder(2010), EditorDisplay(\"Content\")") bool ShadersGenerateDebugData = false; -public: + /// + /// If checked, .NET Runtime won't be packaged with a game and will be required by user to be installed on system upon running game build. Available only on supported platforms such as Windows, Linux and macOS. + /// + API_FIELD(Attributes="EditorOrder(3000), EditorDisplay(\"Scripting\", \"Skip .NET Runtime Packaging\")") + bool SkipDotnetPackaging = false; + /// + /// If checked, .NET Runtime packaging will skip unused libraries from packaging resulting in smaller game builds. + /// + API_FIELD(Attributes="EditorOrder(3010), EditorDisplay(\"Scripting\", \"Skip Unused .NET Runtime Libs Packaging\")") + bool SkipUnusedDotnetLibsPackaging = true; + +public: /// /// Gets the instance of the settings asset (default value if missing). Object returned by this method is always loaded with valid data to use. /// @@ -95,5 +106,7 @@ public: DESERIALIZE(AdditionalAssetFolders); DESERIALIZE(ShadersNoOptimize); DESERIALIZE(ShadersGenerateDebugData); + DESERIALIZE(SkipDotnetPackaging); + DESERIALIZE(SkipUnusedDotnetLibsPackaging); } }; diff --git a/Source/Engine/Core/Config/GameSettings.cpp b/Source/Engine/Core/Config/GameSettings.cpp index c64fc0d4e..3784c46ff 100644 --- a/Source/Engine/Core/Config/GameSettings.cpp +++ b/Source/Engine/Core/Config/GameSettings.cpp @@ -71,6 +71,8 @@ IMPLEMENT_ENGINE_SETTINGS_GETTER(AndroidPlatformSettings, AndroidPlatform); IMPLEMENT_ENGINE_SETTINGS_GETTER(SwitchPlatformSettings, SwitchPlatform); #elif PLATFORM_MAC IMPLEMENT_ENGINE_SETTINGS_GETTER(MacPlatformSettings, MacPlatform); +#elif PLATFORM_IOS +IMPLEMENT_ENGINE_SETTINGS_GETTER(iOSPlatformSettings, iOSPlatform); #else #error Unknown platform #endif @@ -254,6 +256,7 @@ void GameSettings::Deserialize(DeserializeStream& stream, ISerializeModifier* mo DESERIALIZE(SwitchPlatform); DESERIALIZE(PS5Platform); DESERIALIZE(MacPlatform); + DESERIALIZE(iOSPlatform); } void LayersAndTagsSettings::Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) diff --git a/Source/Engine/Core/Config/GameSettings.cs b/Source/Engine/Core/Config/GameSettings.cs index fbd27e3ca..40d9f5dbc 100644 --- a/Source/Engine/Core/Config/GameSettings.cs +++ b/Source/Engine/Core/Config/GameSettings.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using FlaxEngine; namespace FlaxEditor.Content.Settings @@ -201,6 +202,14 @@ namespace FlaxEditor.Content.Settings public JsonAsset MacPlatform; #endif +#if FLAX_EDITOR || PLATFORM_IOS + /// + /// Reference to asset. Used to apply configuration on iOS platform. + /// + [EditorOrder(2100), EditorDisplay("Platform Settings", "iOS"), AssetReference(typeof(iOSPlatformSettings), true), Tooltip("Reference to iOS Platform Settings asset")] + public JsonAsset iOSPlatform; +#endif + /// /// Gets the absolute path to the game settings asset file. /// @@ -332,6 +341,10 @@ namespace FlaxEditor.Content.Settings if (type == typeof(MacPlatformSettings)) return Load(gameSettings.MacPlatform) as T; #endif +#if FLAX_EDITOR || PLATFORM_IOS + if (type == typeof(iOSPlatformSettings)) + return Load(gameSettings.iOSPlatform) as T; +#endif if (gameSettings.CustomSettings != null) { @@ -426,6 +439,10 @@ namespace FlaxEditor.Content.Settings if (type == typeof(MacPlatformSettings)) return gameSettings.MacPlatform; #endif +#if FLAX_EDITOR || PLATFORM_IOS + if (type == typeof(iOSPlatformSettings)) + return gameSettings.iOSPlatform; +#endif if (gameSettings.CustomSettings != null) { @@ -538,6 +555,8 @@ namespace FlaxEditor.Content.Settings return SaveAsset(gameSettings, ref gameSettings.Audio, obj); if (type == typeof(MacPlatformSettings)) return SaveAsset(gameSettings, ref gameSettings.MacPlatform, obj); + if (type == typeof(iOSPlatformSettings)) + return SaveAsset(gameSettings, ref gameSettings.iOSPlatform, obj); return true; } @@ -572,8 +591,8 @@ namespace FlaxEditor.Content.Settings /// /// Loads the current game settings asset and applies it to the engine runtime configuration. /// - [MethodImpl(MethodImplOptions.InternalCall)] - public static extern void Apply(); + [LibraryImport("FlaxEngine", EntryPoint = "GameSettingsInternal_Apply")] + public static partial void Apply(); #endif } } diff --git a/Source/Engine/Core/Config/GameSettings.h b/Source/Engine/Core/Config/GameSettings.h index d34dca4de..54ad29a7b 100644 --- a/Source/Engine/Core/Config/GameSettings.h +++ b/Source/Engine/Core/Config/GameSettings.h @@ -84,6 +84,7 @@ public: Guid SwitchPlatform; Guid PS5Platform; Guid MacPlatform; + Guid iOSPlatform; public: diff --git a/Source/Engine/Core/Config/LayersAndTagsSettings.cs b/Source/Engine/Core/Config/LayersAndTagsSettings.cs index 0dd6da445..008f70504 100644 --- a/Source/Engine/Core/Config/LayersAndTagsSettings.cs +++ b/Source/Engine/Core/Config/LayersAndTagsSettings.cs @@ -1,7 +1,8 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using System.Collections.Generic; -using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.Marshalling; using FlaxEngine; namespace FlaxEditor.Content.Settings @@ -24,7 +25,13 @@ namespace FlaxEditor.Content.Settings /// Gets the current layer names (max 32 items but trims last empty items). /// /// The layers. - [MethodImpl(MethodImplOptions.InternalCall)] - public static extern string[] GetCurrentLayers(); + public static string[] GetCurrentLayers() + { + return GetCurrentLayers(out int _); + } + + [LibraryImport("FlaxEngine", EntryPoint = "LayersAndTagsSettingsInternal_GetCurrentLayers", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(FlaxEngine.Interop.StringMarshaller))] + [return: MarshalUsing(typeof(FlaxEngine.Interop.ArrayMarshaller<,>), CountElementName = "layerCount")] + internal static partial string[] GetCurrentLayers(out int layerCount); } } diff --git a/Source/Engine/Core/Config/PlatformSettings.h b/Source/Engine/Core/Config/PlatformSettings.h index ed26af514..5353ac7fb 100644 --- a/Source/Engine/Core/Config/PlatformSettings.h +++ b/Source/Engine/Core/Config/PlatformSettings.h @@ -35,3 +35,6 @@ #if PLATFORM_MAC #include "Engine/Platform/Mac/MacPlatformSettings.h" #endif +#if PLATFORM_IOS +#include "Engine/Platform/iOS/iOSPlatformSettings.h" +#endif diff --git a/Source/Engine/Core/Formatting.h b/Source/Engine/Core/Formatting.h index bc2dc150b..069b17e5d 100644 --- a/Source/Engine/Core/Formatting.h +++ b/Source/Engine/Core/Formatting.h @@ -18,8 +18,7 @@ namespace fmt_flax FORCE_INLINE static void format(fmt::basic_memory_buffer>& buffer, const T* format, const Args& ... args) { typedef fmt::buffer_context context; - fmt::format_arg_store as{ args... }; - fmt::internal::vformat_to(buffer, fmt::to_string_view(format), fmt::basic_format_args(as)); + fmt::detail::vformat_to(buffer, fmt::basic_string_view(format), fmt::make_format_args(args...), {}); } } @@ -37,7 +36,7 @@ namespace fmt_flax template \ auto format(const type& v, FormatContext& ctx) -> decltype(ctx.out()) \ { \ - return format_to(ctx.out(), TEXT(formatText), ##__VA_ARGS__); \ + return fmt::format_to(ctx.out(), basic_string_view(TEXT(formatText)), ##__VA_ARGS__); \ } \ }; \ } @@ -57,7 +56,7 @@ namespace fmt_flax auto format(const type& v, FormatContext& ctx) -> decltype(ctx.out()) \ { \ const String str = v.ToString(); \ - return fmt::internal::copy(str.Get(), str.Get() + str.Length(), ctx.out()); \ + return fmt::detail::copy_str(str.Get(), str.Get() + str.Length(), ctx.out()); \ } \ }; \ } diff --git a/Source/Engine/Core/Log.h b/Source/Engine/Core/Log.h index de4dc108d..a7e927612 100644 --- a/Source/Engine/Core/Log.h +++ b/Source/Engine/Core/Log.h @@ -13,7 +13,7 @@ /// /// Sends a formatted message to the log file (message type - describes level of the log (see LogType enum)) /// -#define LOG(messageType, format, ...) Log::Logger::Write(LogType::messageType, TEXT(format), ##__VA_ARGS__) +#define LOG(messageType, format, ...) Log::Logger::Write(LogType::messageType, ::String::Format(TEXT(format), ##__VA_ARGS__)) /// /// Sends a string message to the log file (message type - describes level of the log (see LogType enum)) diff --git a/Source/Engine/Core/Math/Color.cs b/Source/Engine/Core/Math/Color.cs index 7bf60b42a..d585177a0 100644 --- a/Source/Engine/Core/Math/Color.cs +++ b/Source/Engine/Core/Math/Color.cs @@ -1,7 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using System; -using System.ComponentModel; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -9,7 +8,9 @@ using System.Runtime.InteropServices; namespace FlaxEngine { [Serializable] - [TypeConverter(typeof(TypeConverters.ColorConverter))] +#if FLAX_EDITOR + [System.ComponentModel.TypeConverter(typeof(TypeConverters.ColorConverter))] +#endif partial struct Color { /// diff --git a/Source/Engine/Core/Math/Double2.cs b/Source/Engine/Core/Math/Double2.cs index 20a8094f6..02669a869 100644 --- a/Source/Engine/Core/Math/Double2.cs +++ b/Source/Engine/Core/Math/Double2.cs @@ -55,7 +55,6 @@ using Real = System.Single; * THE SOFTWARE. */ using System; -using System.ComponentModel; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -63,7 +62,9 @@ using System.Runtime.InteropServices; namespace FlaxEngine { [Serializable] - [TypeConverter(typeof(TypeConverters.Double2Converter))] +#if FLAX_EDITOR + [System.ComponentModel.TypeConverter(typeof(TypeConverters.Double2Converter))] +#endif partial struct Double2 : IEquatable, IFormattable { private static readonly string _formatString = "X:{0:F2} Y:{1:F2}"; diff --git a/Source/Engine/Core/Math/Double3.cs b/Source/Engine/Core/Math/Double3.cs index 85360f0ff..eb41ad400 100644 --- a/Source/Engine/Core/Math/Double3.cs +++ b/Source/Engine/Core/Math/Double3.cs @@ -56,7 +56,6 @@ using Real = System.Single; */ using System; -using System.ComponentModel; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -64,7 +63,9 @@ using System.Runtime.InteropServices; namespace FlaxEngine { [Serializable] - [TypeConverter(typeof(TypeConverters.Double3Converter))] +#if FLAX_EDITOR + [System.ComponentModel.TypeConverter(typeof(TypeConverters.Double3Converter))] +#endif partial struct Double3 : IEquatable, IFormattable { private static readonly string _formatString = "X:{0:F2} Y:{1:F2} Z:{2:F2}"; diff --git a/Source/Engine/Core/Math/Double4.cs b/Source/Engine/Core/Math/Double4.cs index bf69f2c72..68c9a005c 100644 --- a/Source/Engine/Core/Math/Double4.cs +++ b/Source/Engine/Core/Math/Double4.cs @@ -56,7 +56,6 @@ using Real = System.Single; */ using System; -using System.ComponentModel; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -64,7 +63,9 @@ using System.Runtime.InteropServices; namespace FlaxEngine { [Serializable] - [TypeConverter(typeof(TypeConverters.Double4Converter))] +#if FLAX_EDITOR + [System.ComponentModel.TypeConverter(typeof(TypeConverters.Double4Converter))] +#endif partial struct Double4 : IEquatable, IFormattable { private static readonly string _formatString = "X:{0:F2} Y:{1:F2} Z:{2:F2} W:{3:F2}"; diff --git a/Source/Engine/Core/Math/Float2.cs b/Source/Engine/Core/Math/Float2.cs index a53fddd34..3ca6f51d7 100644 --- a/Source/Engine/Core/Math/Float2.cs +++ b/Source/Engine/Core/Math/Float2.cs @@ -50,7 +50,6 @@ */ using System; -using System.ComponentModel; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -58,7 +57,9 @@ using System.Runtime.InteropServices; namespace FlaxEngine { [Serializable] - [TypeConverter(typeof(TypeConverters.Float2Converter))] +#if FLAX_EDITOR + [System.ComponentModel.TypeConverter(typeof(TypeConverters.Float2Converter))] +#endif partial struct Float2 : IEquatable, IFormattable { private static readonly string _formatString = "X:{0:F2} Y:{1:F2}"; diff --git a/Source/Engine/Core/Math/Float3.cs b/Source/Engine/Core/Math/Float3.cs index 9ea922c2b..1831a3b99 100644 --- a/Source/Engine/Core/Math/Float3.cs +++ b/Source/Engine/Core/Math/Float3.cs @@ -50,7 +50,6 @@ */ using System; -using System.ComponentModel; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -58,7 +57,9 @@ using System.Runtime.InteropServices; namespace FlaxEngine { [Serializable] - [TypeConverter(typeof(TypeConverters.Float3Converter))] +#if FLAX_EDITOR + [System.ComponentModel.TypeConverter(typeof(TypeConverters.Float3Converter))] +#endif partial struct Float3 : IEquatable, IFormattable { private static readonly string _formatString = "X:{0:F2} Y:{1:F2} Z:{2:F2}"; diff --git a/Source/Engine/Core/Math/Float4.cs b/Source/Engine/Core/Math/Float4.cs index eb10e5db4..ff84a07b2 100644 --- a/Source/Engine/Core/Math/Float4.cs +++ b/Source/Engine/Core/Math/Float4.cs @@ -50,7 +50,6 @@ */ using System; -using System.ComponentModel; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -58,7 +57,9 @@ using System.Runtime.InteropServices; namespace FlaxEngine { [Serializable] - [TypeConverter(typeof(TypeConverters.Float4Converter))] +#if FLAX_EDITOR + [System.ComponentModel.TypeConverter(typeof(TypeConverters.Float4Converter))] +#endif partial struct Float4 : IEquatable, IFormattable { private static readonly string _formatString = "X:{0:F2} Y:{1:F2} Z:{2:F2} W:{3:F2}"; diff --git a/Source/Engine/Core/Math/Int2.cs b/Source/Engine/Core/Math/Int2.cs index 62c8bf7ee..47b225ff6 100644 --- a/Source/Engine/Core/Math/Int2.cs +++ b/Source/Engine/Core/Math/Int2.cs @@ -1,7 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using System; -using System.ComponentModel; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -12,7 +11,9 @@ namespace FlaxEngine /// Represents a two dimensional mathematical vector (signed integers). /// [Serializable] - [TypeConverter(typeof(TypeConverters.Int2Converter))] +#if FLAX_EDITOR + [System.ComponentModel.TypeConverter(typeof(TypeConverters.Int2Converter))] +#endif partial struct Int2 : IEquatable, IFormattable { private static readonly string _formatString = "X:{0} Y:{1}"; diff --git a/Source/Engine/Core/Math/Int3.cs b/Source/Engine/Core/Math/Int3.cs index d8fe4bda7..c382a2518 100644 --- a/Source/Engine/Core/Math/Int3.cs +++ b/Source/Engine/Core/Math/Int3.cs @@ -1,7 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using System; -using System.ComponentModel; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -12,7 +11,9 @@ namespace FlaxEngine /// Represents a three dimensional mathematical vector (signed integers). /// [Serializable] - [TypeConverter(typeof(TypeConverters.Int3Converter))] +#if FLAX_EDITOR + [System.ComponentModel.TypeConverter(typeof(TypeConverters.Int3Converter))] +#endif partial struct Int3 : IEquatable, IFormattable { private static readonly string _formatString = "X:{0} Y:{1} Z:{2}"; diff --git a/Source/Engine/Core/Math/Int4.cs b/Source/Engine/Core/Math/Int4.cs index f3ff7d05a..451197cfe 100644 --- a/Source/Engine/Core/Math/Int4.cs +++ b/Source/Engine/Core/Math/Int4.cs @@ -1,7 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using System; -using System.ComponentModel; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -12,7 +11,9 @@ namespace FlaxEngine /// Represents a four dimensional mathematical vector (signed integers). /// [Serializable] - [TypeConverter(typeof(TypeConverters.Int4Converter))] +#if FLAX_EDITOR + [System.ComponentModel.TypeConverter(typeof(TypeConverters.Int4Converter))] +#endif partial struct Int4 : IEquatable, IFormattable { private static readonly string _formatString = "X:{0} Y:{1} Z:{2} W:{3}"; diff --git a/Source/Engine/Core/Math/Quaternion.cs b/Source/Engine/Core/Math/Quaternion.cs index 5fccd5941..ff50a98bf 100644 --- a/Source/Engine/Core/Math/Quaternion.cs +++ b/Source/Engine/Core/Math/Quaternion.cs @@ -50,7 +50,6 @@ */ using System; -using System.ComponentModel; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -58,7 +57,9 @@ using System.Runtime.InteropServices; namespace FlaxEngine { [Serializable] - [TypeConverter(typeof(TypeConverters.QuaternionConverter))] +#if FLAX_EDITOR + [System.ComponentModel.TypeConverter(typeof(TypeConverters.QuaternionConverter))] +#endif partial struct Quaternion : IEquatable, IFormattable { private static readonly string _formatString = "X:{0:F2} Y:{1:F2} Z:{2:F2} W:{3:F2}"; diff --git a/Source/Engine/Core/Math/TypeConverters/ColorConverter.cs b/Source/Engine/Core/Math/TypeConverters/ColorConverter.cs index a8c0cb766..afd34bbfd 100644 --- a/Source/Engine/Core/Math/TypeConverters/ColorConverter.cs +++ b/Source/Engine/Core/Math/TypeConverters/ColorConverter.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_EDITOR using System; using System.ComponentModel; using System.Globalization; @@ -18,6 +19,16 @@ namespace FlaxEngine.TypeConverters return base.CanConvertFrom(context, sourceType); } + /// + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + if (destinationType == typeof(string)) + { + return false; + } + return base.CanConvertTo(context, destinationType); + } + /// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { @@ -25,9 +36,9 @@ namespace FlaxEngine.TypeConverters { string[] v = str.Split(','); if (v.Length == 4) - return new Color(float.Parse(v[0]), float.Parse(v[1]), float.Parse(v[2]), float.Parse(v[3])); + return new Color(float.Parse(v[0], culture), float.Parse(v[1], culture), float.Parse(v[2], culture), float.Parse(v[3], culture)); if (v.Length == 3) - return new Color(float.Parse(v[0]), float.Parse(v[1]), float.Parse(v[2]), 1.0f); + return new Color(float.Parse(v[0], culture), float.Parse(v[1], culture), float.Parse(v[2], culture), 1.0f); throw new FormatException("Invalid Color value format."); } return base.ConvertFrom(context, culture, value); @@ -39,9 +50,10 @@ namespace FlaxEngine.TypeConverters if (destinationType == typeof(string)) { var v = (Color)value; - return v.R + "," + v.G + "," + v.B + "," + v.A; + return v.R.ToString(culture) + "," + v.G.ToString(culture) + "," + v.B.ToString(culture) + "," + v.A.ToString(culture); } return base.ConvertTo(context, culture, value, destinationType); } } } +#endif diff --git a/Source/Engine/Core/Math/TypeConverters/Double2Converter.cs b/Source/Engine/Core/Math/TypeConverters/Double2Converter.cs index 7afca8e6d..4eebbfce4 100644 --- a/Source/Engine/Core/Math/TypeConverters/Double2Converter.cs +++ b/Source/Engine/Core/Math/TypeConverters/Double2Converter.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_EDITOR using System; using System.ComponentModel; using System.Globalization; @@ -18,13 +19,23 @@ namespace FlaxEngine.TypeConverters return base.CanConvertFrom(context, sourceType); } + /// + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + if (destinationType == typeof(string)) + { + return false; + } + return base.CanConvertTo(context, destinationType); + } + /// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string str) { string[] v = str.Split(','); - return new Double2(double.Parse(v[0]), double.Parse(v[1])); + return new Double2(double.Parse(v[0], culture), double.Parse(v[1], culture)); } return base.ConvertFrom(context, culture, value); } @@ -35,9 +46,10 @@ namespace FlaxEngine.TypeConverters if (destinationType == typeof(string)) { var v = (Double2)value; - return v.X + "," + v.Y; + return v.X.ToString(culture) + "," + v.Y.ToString(culture); } return base.ConvertTo(context, culture, value, destinationType); } } } +#endif diff --git a/Source/Engine/Core/Math/TypeConverters/Double3Converter.cs b/Source/Engine/Core/Math/TypeConverters/Double3Converter.cs index 898f74e8a..420e0016c 100644 --- a/Source/Engine/Core/Math/TypeConverters/Double3Converter.cs +++ b/Source/Engine/Core/Math/TypeConverters/Double3Converter.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_EDITOR using System; using System.ComponentModel; using System.Globalization; @@ -18,13 +19,23 @@ namespace FlaxEngine.TypeConverters return base.CanConvertFrom(context, sourceType); } + /// + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + if (destinationType == typeof(string)) + { + return false; + } + return base.CanConvertTo(context, destinationType); + } + /// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string str) { string[] v = str.Split(','); - return new Double3(double.Parse(v[0]), double.Parse(v[1]), double.Parse(v[2])); + return new Double3(double.Parse(v[0], culture), double.Parse(v[1], culture), double.Parse(v[2], culture)); } return base.ConvertFrom(context, culture, value); } @@ -35,9 +46,10 @@ namespace FlaxEngine.TypeConverters if (destinationType == typeof(string)) { var v = (Double3)value; - return v.X + "," + v.Y + "," + v.Z; + return v.X.ToString(culture) + "," + v.Y.ToString(culture) + "," + v.Z.ToString(culture); } return base.ConvertTo(context, culture, value, destinationType); } } } +#endif diff --git a/Source/Engine/Core/Math/TypeConverters/Double4Converter.cs b/Source/Engine/Core/Math/TypeConverters/Double4Converter.cs index ad3593178..fc1d9a7fe 100644 --- a/Source/Engine/Core/Math/TypeConverters/Double4Converter.cs +++ b/Source/Engine/Core/Math/TypeConverters/Double4Converter.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_EDITOR using System; using System.ComponentModel; using System.Globalization; @@ -18,13 +19,23 @@ namespace FlaxEngine.TypeConverters return base.CanConvertFrom(context, sourceType); } + /// + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + if (destinationType == typeof(string)) + { + return false; + } + return base.CanConvertTo(context, destinationType); + } + /// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string str) { string[] v = str.Split(','); - return new Double4(double.Parse(v[0]), double.Parse(v[1]), double.Parse(v[2]), double.Parse(v[3])); + return new Double4(double.Parse(v[0], culture), double.Parse(v[1], culture), double.Parse(v[2], culture), double.Parse(v[3], culture)); } return base.ConvertFrom(context, culture, value); } @@ -35,9 +46,10 @@ namespace FlaxEngine.TypeConverters if (destinationType == typeof(string)) { var v = (Double4)value; - return v.X + "," + v.Y + "," + v.Z + "," + v.W; + return v.X.ToString(culture) + "," + v.Y.ToString(culture) + "," + v.Z.ToString(culture) + "," + v.W.ToString(culture); } return base.ConvertTo(context, culture, value, destinationType); } } } +#endif diff --git a/Source/Engine/Core/Math/TypeConverters/Float2Converter.cs b/Source/Engine/Core/Math/TypeConverters/Float2Converter.cs index 415b63cbd..a41a0f4d5 100644 --- a/Source/Engine/Core/Math/TypeConverters/Float2Converter.cs +++ b/Source/Engine/Core/Math/TypeConverters/Float2Converter.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_EDITOR using System; using System.ComponentModel; using System.Globalization; @@ -18,13 +19,23 @@ namespace FlaxEngine.TypeConverters return base.CanConvertFrom(context, sourceType); } + /// + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + if (destinationType == typeof(string)) + { + return false; + } + return base.CanConvertTo(context, destinationType); + } + /// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string str) { string[] v = str.Split(','); - return new Float2(float.Parse(v[0]), float.Parse(v[1])); + return new Float2(float.Parse(v[0], culture), float.Parse(v[1], culture)); } return base.ConvertFrom(context, culture, value); } @@ -35,9 +46,10 @@ namespace FlaxEngine.TypeConverters if (destinationType == typeof(string)) { var v = (Float2)value; - return v.X + "," + v.Y; + return v.X.ToString(culture) + "," + v.Y.ToString(culture); } return base.ConvertTo(context, culture, value, destinationType); } } } +#endif diff --git a/Source/Engine/Core/Math/TypeConverters/Float3Converter.cs b/Source/Engine/Core/Math/TypeConverters/Float3Converter.cs index ef64662fb..aded4117e 100644 --- a/Source/Engine/Core/Math/TypeConverters/Float3Converter.cs +++ b/Source/Engine/Core/Math/TypeConverters/Float3Converter.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_EDITOR using System; using System.ComponentModel; using System.Globalization; @@ -18,13 +19,23 @@ namespace FlaxEngine.TypeConverters return base.CanConvertFrom(context, sourceType); } + /// + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + if (destinationType == typeof(string)) + { + return false; + } + return base.CanConvertTo(context, destinationType); + } + /// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string str) { string[] v = str.Split(','); - return new Float3(float.Parse(v[0]), float.Parse(v[1]), float.Parse(v[2])); + return new Float3(float.Parse(v[0], culture), float.Parse(v[1], culture), float.Parse(v[2], culture)); } return base.ConvertFrom(context, culture, value); } @@ -35,9 +46,10 @@ namespace FlaxEngine.TypeConverters if (destinationType == typeof(string)) { var v = (Float3)value; - return v.X + "," + v.Y + "," + v.Z; + return v.X.ToString(culture) + "," + v.Y.ToString(culture) + "," + v.Z.ToString(culture); } return base.ConvertTo(context, culture, value, destinationType); } } } +#endif diff --git a/Source/Engine/Core/Math/TypeConverters/Float4Converter.cs b/Source/Engine/Core/Math/TypeConverters/Float4Converter.cs index 79da8d765..58c76ac65 100644 --- a/Source/Engine/Core/Math/TypeConverters/Float4Converter.cs +++ b/Source/Engine/Core/Math/TypeConverters/Float4Converter.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_EDITOR using System; using System.ComponentModel; using System.Globalization; @@ -18,13 +19,23 @@ namespace FlaxEngine.TypeConverters return base.CanConvertFrom(context, sourceType); } + /// + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + if (destinationType == typeof(string)) + { + return false; + } + return base.CanConvertTo(context, destinationType); + } + /// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string str) { string[] v = str.Split(','); - return new Float4(float.Parse(v[0]), float.Parse(v[1]), float.Parse(v[2]), float.Parse(v[3])); + return new Float4(float.Parse(v[0], culture), float.Parse(v[1], culture), float.Parse(v[2], culture), float.Parse(v[3], culture)); } return base.ConvertFrom(context, culture, value); } @@ -35,9 +46,10 @@ namespace FlaxEngine.TypeConverters if (destinationType == typeof(string)) { var v = (Float4)value; - return v.X + "," + v.Y + "," + v.Z + "," + v.W; + return v.X.ToString(culture) + "," + v.Y.ToString(culture) + "," + v.Z.ToString(culture) + "," + v.W.ToString(culture); } return base.ConvertTo(context, culture, value, destinationType); } } } +#endif diff --git a/Source/Engine/Core/Math/TypeConverters/Int2Converter.cs b/Source/Engine/Core/Math/TypeConverters/Int2Converter.cs index ee4e6bf38..c4989c085 100644 --- a/Source/Engine/Core/Math/TypeConverters/Int2Converter.cs +++ b/Source/Engine/Core/Math/TypeConverters/Int2Converter.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_EDITOR using System; using System.ComponentModel; using System.Globalization; @@ -18,13 +19,23 @@ namespace FlaxEngine.TypeConverters return base.CanConvertFrom(context, sourceType); } + /// + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + if (destinationType == typeof(string)) + { + return false; + } + return base.CanConvertTo(context, destinationType); + } + /// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string str) { string[] v = str.Split(','); - return new Int2(int.Parse(v[0]), int.Parse(v[1])); + return new Int2(int.Parse(v[0], culture), int.Parse(v[1], culture)); } return base.ConvertFrom(context, culture, value); } @@ -35,9 +46,10 @@ namespace FlaxEngine.TypeConverters if (destinationType == typeof(string)) { var v = (Int2)value; - return v.X + "," + v.Y; + return v.X.ToString(culture) + "," + v.Y.ToString(culture); } return base.ConvertTo(context, culture, value, destinationType); } } } +#endif diff --git a/Source/Engine/Core/Math/TypeConverters/Int3Converter.cs b/Source/Engine/Core/Math/TypeConverters/Int3Converter.cs index 0b6f74a5b..fe01f91fd 100644 --- a/Source/Engine/Core/Math/TypeConverters/Int3Converter.cs +++ b/Source/Engine/Core/Math/TypeConverters/Int3Converter.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_EDITOR using System; using System.ComponentModel; using System.Globalization; @@ -18,13 +19,23 @@ namespace FlaxEngine.TypeConverters return base.CanConvertFrom(context, sourceType); } + /// + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + if (destinationType == typeof(string)) + { + return false; + } + return base.CanConvertTo(context, destinationType); + } + /// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string str) { string[] v = str.Split(','); - return new Int3(int.Parse(v[0]), int.Parse(v[1]), int.Parse(v[2])); + return new Int3(int.Parse(v[0], culture), int.Parse(v[1], culture), int.Parse(v[2], culture)); } return base.ConvertFrom(context, culture, value); } @@ -35,9 +46,10 @@ namespace FlaxEngine.TypeConverters if (destinationType == typeof(string)) { var v = (Int3)value; - return v.X + "," + v.Y + "," + v.Z; + return v.X.ToString(culture) + "," + v.Y.ToString(culture) + "," + v.Z.ToString(culture); } return base.ConvertTo(context, culture, value, destinationType); } } } +#endif diff --git a/Source/Engine/Core/Math/TypeConverters/Int4Converter.cs b/Source/Engine/Core/Math/TypeConverters/Int4Converter.cs index 71d19dc4b..2ce0fc202 100644 --- a/Source/Engine/Core/Math/TypeConverters/Int4Converter.cs +++ b/Source/Engine/Core/Math/TypeConverters/Int4Converter.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_EDITOR using System; using System.ComponentModel; using System.Globalization; @@ -18,13 +19,23 @@ namespace FlaxEngine.TypeConverters return base.CanConvertFrom(context, sourceType); } + /// + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + if (destinationType == typeof(string)) + { + return false; + } + return base.CanConvertTo(context, destinationType); + } + /// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string str) { string[] v = str.Split(','); - return new Int4(int.Parse(v[0]), int.Parse(v[1]), int.Parse(v[2]), int.Parse(v[3])); + return new Int4(int.Parse(v[0], culture), int.Parse(v[1], culture), int.Parse(v[2], culture), int.Parse(v[3], culture)); } return base.ConvertFrom(context, culture, value); } @@ -35,9 +46,10 @@ namespace FlaxEngine.TypeConverters if (destinationType == typeof(string)) { var v = (Int4)value; - return v.X + "," + v.Y + "," + v.Z + "," + v.W; + return v.X.ToString(culture) + "," + v.Y.ToString(culture) + "," + v.Z.ToString(culture) + "," + v.W.ToString(culture); } return base.ConvertTo(context, culture, value, destinationType); } } } +#endif diff --git a/Source/Engine/Core/Math/TypeConverters/QuaternionConverter.cs b/Source/Engine/Core/Math/TypeConverters/QuaternionConverter.cs index e8b1ff6a3..23bb901be 100644 --- a/Source/Engine/Core/Math/TypeConverters/QuaternionConverter.cs +++ b/Source/Engine/Core/Math/TypeConverters/QuaternionConverter.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_EDITOR using System; using System.ComponentModel; using System.Globalization; @@ -18,13 +19,23 @@ namespace FlaxEngine.TypeConverters return base.CanConvertFrom(context, sourceType); } + /// + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + if (destinationType == typeof(string)) + { + return false; + } + return base.CanConvertTo(context, destinationType); + } + /// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string str) { string[] v = str.Split(','); - return new Quaternion(float.Parse(v[0]), float.Parse(v[1]), float.Parse(v[2]), float.Parse(v[3])); + return new Quaternion(float.Parse(v[0], culture), float.Parse(v[1], culture), float.Parse(v[2], culture), float.Parse(v[3], culture)); } return base.ConvertFrom(context, culture, value); } @@ -35,9 +46,10 @@ namespace FlaxEngine.TypeConverters if (destinationType == typeof(string)) { var v = (Quaternion)value; - return v.X + "," + v.Y + "," + v.Z + "," + v.W; + return v.X.ToString(culture) + "," + v.Y.ToString(culture) + "," + v.Z.ToString(culture) + "," + v.W.ToString(culture); } return base.ConvertTo(context, culture, value, destinationType); } } } +#endif diff --git a/Source/Engine/Core/Math/TypeConverters/Vector2Converter.cs b/Source/Engine/Core/Math/TypeConverters/Vector2Converter.cs index 1eef270ee..96d6beadc 100644 --- a/Source/Engine/Core/Math/TypeConverters/Vector2Converter.cs +++ b/Source/Engine/Core/Math/TypeConverters/Vector2Converter.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_EDITOR using System; using System.ComponentModel; using System.Globalization; @@ -18,13 +19,23 @@ namespace FlaxEngine.TypeConverters return base.CanConvertFrom(context, sourceType); } + /// + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + if (destinationType == typeof(string)) + { + return false; + } + return base.CanConvertTo(context, destinationType); + } + /// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string str) { string[] v = str.Split(','); - return new Vector2(float.Parse(v[0]), float.Parse(v[1])); + return new Vector2(float.Parse(v[0], culture), float.Parse(v[1], culture)); } return base.ConvertFrom(context, culture, value); } @@ -35,9 +46,10 @@ namespace FlaxEngine.TypeConverters if (destinationType == typeof(string)) { var v = (Vector2)value; - return v.X + "," + v.Y; + return v.X.ToString(culture) + "," + v.Y.ToString(culture); } return base.ConvertTo(context, culture, value, destinationType); } } } +#endif diff --git a/Source/Engine/Core/Math/TypeConverters/Vector3Converter.cs b/Source/Engine/Core/Math/TypeConverters/Vector3Converter.cs index 398a85811..23ee4df11 100644 --- a/Source/Engine/Core/Math/TypeConverters/Vector3Converter.cs +++ b/Source/Engine/Core/Math/TypeConverters/Vector3Converter.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_EDITOR using System; using System.ComponentModel; using System.Globalization; @@ -18,13 +19,23 @@ namespace FlaxEngine.TypeConverters return base.CanConvertFrom(context, sourceType); } + /// + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + if (destinationType == typeof(string)) + { + return false; + } + return base.CanConvertTo(context, destinationType); + } + /// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string str) { string[] v = str.Split(','); - return new Vector3(float.Parse(v[0]), float.Parse(v[1]), float.Parse(v[2])); + return new Vector3(float.Parse(v[0], culture), float.Parse(v[1], culture), float.Parse(v[2], culture)); } return base.ConvertFrom(context, culture, value); } @@ -35,9 +46,10 @@ namespace FlaxEngine.TypeConverters if (destinationType == typeof(string)) { var v = (Vector3)value; - return v.X + "," + v.Y + "," + v.Z; + return v.X.ToString(culture) + "," + v.Y.ToString(culture) + "," + v.Z.ToString(culture); } return base.ConvertTo(context, culture, value, destinationType); } } } +#endif diff --git a/Source/Engine/Core/Math/TypeConverters/Vector4Converter.cs b/Source/Engine/Core/Math/TypeConverters/Vector4Converter.cs index 75cc264af..c3b4d074b 100644 --- a/Source/Engine/Core/Math/TypeConverters/Vector4Converter.cs +++ b/Source/Engine/Core/Math/TypeConverters/Vector4Converter.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_EDITOR using System; using System.ComponentModel; using System.Globalization; @@ -18,13 +19,23 @@ namespace FlaxEngine.TypeConverters return base.CanConvertFrom(context, sourceType); } + /// + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + if (destinationType == typeof(string)) + { + return false; + } + return base.CanConvertTo(context, destinationType); + } + /// public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string str) { string[] v = str.Split(','); - return new Vector4(float.Parse(v[0]), float.Parse(v[1]), float.Parse(v[2]), float.Parse(v[3])); + return new Vector4(float.Parse(v[0], culture), float.Parse(v[1], culture), float.Parse(v[2], culture), float.Parse(v[3], culture)); } return base.ConvertFrom(context, culture, value); } @@ -35,9 +46,10 @@ namespace FlaxEngine.TypeConverters if (destinationType == typeof(string)) { var v = (Vector4)value; - return v.X + "," + v.Y + "," + v.Z + "," + v.W; + return v.X.ToString(culture) + "," + v.Y.ToString(culture) + "," + v.Z.ToString(culture) + "," + v.W.ToString(culture); } return base.ConvertTo(context, culture, value, destinationType); } } } +#endif diff --git a/Source/Engine/Core/Math/Vector2.cs b/Source/Engine/Core/Math/Vector2.cs index 730988556..2af365638 100644 --- a/Source/Engine/Core/Math/Vector2.cs +++ b/Source/Engine/Core/Math/Vector2.cs @@ -57,7 +57,6 @@ using Mathr = FlaxEngine.Mathf; * THE SOFTWARE. */ using System; -using System.ComponentModel; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -70,7 +69,9 @@ namespace FlaxEngine [Unmanaged] [Serializable] [StructLayout(LayoutKind.Sequential)] - [TypeConverter(typeof(TypeConverters.Vector2Converter))] +#if FLAX_EDITOR + [System.ComponentModel.TypeConverter(typeof(TypeConverters.Vector2Converter))] +#endif public unsafe partial struct Vector2 : IEquatable, IFormattable { private static readonly string _formatString = "X:{0:F2} Y:{1:F2}"; diff --git a/Source/Engine/Core/Math/Vector3.cs b/Source/Engine/Core/Math/Vector3.cs index d80a6a87f..4442d3334 100644 --- a/Source/Engine/Core/Math/Vector3.cs +++ b/Source/Engine/Core/Math/Vector3.cs @@ -57,7 +57,6 @@ using Mathr = FlaxEngine.Mathf; * THE SOFTWARE. */ using System; -using System.ComponentModel; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -70,7 +69,9 @@ namespace FlaxEngine [Unmanaged] [Serializable] [StructLayout(LayoutKind.Sequential)] - [TypeConverter(typeof(TypeConverters.Vector3Converter))] +#if FLAX_EDITOR + [System.ComponentModel.TypeConverter(typeof(TypeConverters.Vector3Converter))] +#endif public unsafe partial struct Vector3 : IEquatable, IFormattable { private static readonly string _formatString = "X:{0:F2} Y:{1:F2} Z:{2:F2}"; diff --git a/Source/Engine/Core/Math/Vector4.cs b/Source/Engine/Core/Math/Vector4.cs index 8c83e5d3e..ceeafe88f 100644 --- a/Source/Engine/Core/Math/Vector4.cs +++ b/Source/Engine/Core/Math/Vector4.cs @@ -57,7 +57,6 @@ using Mathr = FlaxEngine.Mathf; * THE SOFTWARE. */ using System; -using System.ComponentModel; using System.Globalization; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -70,7 +69,9 @@ namespace FlaxEngine [Unmanaged] [Serializable] [StructLayout(LayoutKind.Sequential)] - [TypeConverter(typeof(TypeConverters.Vector4Converter))] +#if FLAX_EDITOR + [System.ComponentModel.TypeConverter(typeof(TypeConverters.Vector4Converter))] +#endif public partial struct Vector4 : IEquatable, IFormattable { private static readonly string _formatString = "X:{0:F2} Y:{1:F2} Z:{2:F2} W:{3:F2}"; diff --git a/Source/Engine/Core/Types/DateTime.h b/Source/Engine/Core/Types/DateTime.h index 13a2261c8..67b2d70ff 100644 --- a/Source/Engine/Core/Types/DateTime.h +++ b/Source/Engine/Core/Types/DateTime.h @@ -309,7 +309,7 @@ namespace fmt { int32 year, month, day; v.GetDate(year, month, day); - return format_to(ctx.out(), TEXT("{0}-{1:0>2}-{2:0>2} {3:0>2}:{4:0>2}:{5:0>2}"), year, month, day, v.GetHour(), v.GetMinute(), v.GetSecond()); + return fmt::format_to(ctx.out(), basic_string_view(TEXT("{0}-{1:0>2}-{2:0>2} {3:0>2}:{4:0>2}:{5:0>2}")), year, month, day, v.GetHour(), v.GetMinute(), v.GetSecond()); } }; } diff --git a/Source/Engine/Core/Types/String.h b/Source/Engine/Core/Types/String.h index a58dbf454..8728876a1 100644 --- a/Source/Engine/Core/Types/String.h +++ b/Source/Engine/Core/Types/String.h @@ -17,6 +17,8 @@ protected: int32 _length = 0; public: + typedef T CharType; + /// /// Finalizes an instance of the class. /// @@ -1237,7 +1239,7 @@ namespace fmt template auto format(const String& v, FormatContext& ctx) -> decltype(ctx.out()) { - return fmt::internal::copy(v.Get(), v.Get() + v.Length(), ctx.out()); + return fmt::detail::copy_str(v.Get(), v.Get() + v.Length(), ctx.out()); } }; } @@ -1808,7 +1810,7 @@ namespace fmt template auto format(const StringAnsi& v, FormatContext& ctx) -> decltype(ctx.out()) { - return fmt::internal::copy(v.Get(), v.Get() + v.Length(), ctx.out()); + return fmt::detail::copy_str(v.Get(), v.Get() + v.Length(), ctx.out()); } }; } diff --git a/Source/Engine/Core/Types/StringBuilder.h b/Source/Engine/Core/Types/StringBuilder.h index 1df7fc4a2..39c1b3a84 100644 --- a/Source/Engine/Core/Types/StringBuilder.h +++ b/Source/Engine/Core/Types/StringBuilder.h @@ -284,7 +284,7 @@ namespace fmt template auto format(const String& v, FormatContext& ctx) -> decltype(ctx.out()) { - return fmt::internal::copy(v.Get(), v.Get() + v.Length(), ctx.out()); + return fmt::detail::copy_str(v.Get(), v.Get() + v.Length(), ctx.out()); } }; } diff --git a/Source/Engine/Core/Types/StringView.h b/Source/Engine/Core/Types/StringView.h index 1c841070e..27c63c999 100644 --- a/Source/Engine/Core/Types/StringView.h +++ b/Source/Engine/Core/Types/StringView.h @@ -29,6 +29,8 @@ protected: } public: + typedef T CharType; + /// /// Gets the specific const character from this string. /// @@ -381,7 +383,7 @@ namespace fmt template auto format(const StringView& v, FormatContext& ctx) -> decltype(ctx.out()) { - return fmt::internal::copy(v.Get(), v.Get() + v.Length(), ctx.out()); + return fmt::detail::copy_str(v.Get(), v.Get() + v.Length(), ctx.out()); } }; } @@ -551,7 +553,7 @@ namespace fmt template auto format(const StringAnsiView& v, FormatContext& ctx) -> decltype(ctx.out()) { - return fmt::internal::copy(v.Get(), v.Get() + v.Length(), ctx.out()); + return fmt::detail::copy_str(v.Get(), v.Get() + v.Length(), ctx.out()); } }; } diff --git a/Source/Engine/Core/Types/Variant.cpp b/Source/Engine/Core/Types/Variant.cpp index d46b4f8a0..33ffde349 100644 --- a/Source/Engine/Core/Types/Variant.cpp +++ b/Source/Engine/Core/Types/Variant.cpp @@ -23,12 +23,10 @@ #include "Engine/Scripting/ScriptingObject.h" #include "Engine/Scripting/ManagedCLR/MClass.h" #include "Engine/Scripting/ManagedCLR/MCore.h" +#include "Engine/Scripting/ManagedCLR/MCore.h" #include "Engine/Scripting/ManagedCLR/MUtils.h" #include "Engine/Utilities/Crc.h" #include "Engine/Utilities/StringConverter.h" -#if USE_MONO -#include -#endif namespace { @@ -108,15 +106,14 @@ VariantType::VariantType(Types type, const StringAnsiView& typeName) } } -VariantType::VariantType(Types type, _MonoClass* klass) +VariantType::VariantType(Types type, MClass* klass) { Type = type; TypeName = nullptr; -#if USE_MONO +#if USE_CSHARP if (klass) { - MString typeName; - MUtils::GetClassFullname(klass, typeName); + const StringAnsi& typeName = klass->GetFullName(); const int32 length = typeName.Length(); TypeName = static_cast(Allocator::Allocate(length + 1)); Platform::MemoryCopy(TypeName, typeName.Get(), length); @@ -166,7 +163,7 @@ VariantType::VariantType(const StringAnsiView& typeName) } // Try using managed class -#if USE_MONO +#if USE_CSHARP if (const auto mclass = Scripting::FindClass(typeName)) { new(this) VariantType(ManagedObject, typeName); @@ -615,17 +612,21 @@ Variant::Variant(Asset* v) } } -#if USE_MONO +#if USE_CSHARP -Variant::Variant(_MonoObject* v) - : Type(VariantType::ManagedObject, v ? mono_object_get_class(v) : nullptr) +Variant::Variant(MObject* v) + : Type(VariantType::ManagedObject, v ? MCore::Object::GetClass(v) : nullptr) { - AsUint = v ? mono_gchandle_new(v, true) : 0; +#if USE_NETCORE + AsUint64 = v ? MCore::GCHandle::New(v) : 0; +#else + AsUint = v ? MCore::GCHandle::New(v) : 0; +#endif } #else -Variant::Variant(_MonoObject* v) +Variant::Variant(MObject* v) : Type(VariantType::ManagedObject, nullptr) { AsUint = 0; @@ -958,11 +959,14 @@ Variant::~Variant() Delete(AsDictionary); break; case VariantType::ManagedObject: -#if USE_MONO +#if USE_NETCORE + if (AsUint64) + MCore::GCHandle::Free(AsUint64); +#elif USE_MONO if (AsUint) - mono_gchandle_free(AsUint); - break; + MCore::GCHandle::Free(AsUint); #endif + break; default: ; } } @@ -1089,8 +1093,10 @@ Variant& Variant::operator=(const Variant& other) AsDictionary = New>(*other.AsDictionary); break; case VariantType::ManagedObject: -#if USE_MONO - AsUint = other.AsUint ? mono_gchandle_new(mono_gchandle_get_target(other.AsUint), true) : 0; +#if USE_NETCORE + AsUint64 = other.AsUint64 ? MCore::GCHandle::New(MCore::GCHandle::GetTarget(other.AsUint64)) : 0; +#elif USE_MONO + AsUint = other.AsUint ? MCore::GCHandle::New(MCore::GCHandle::GetTarget(other.AsUint)) : 0; #endif break; case VariantType::Null: @@ -1216,9 +1222,13 @@ bool Variant::operator==(const Variant& other) const return false; return AsBlob.Length == other.AsBlob.Length && StringUtils::Compare(static_cast(AsBlob.Data), static_cast(other.AsBlob.Data), AsBlob.Length - 1) == 0; case VariantType::ManagedObject: -#if USE_MONO +#if USE_NETCORE // TODO: invoke C# Equality logic? - return AsUint == other.AsUint || mono_gchandle_get_target(AsUint) == mono_gchandle_get_target(other.AsUint); + return AsUint64 == other.AsUint64 || MCore::GCHandle::GetTarget(AsUint64) == MCore::GCHandle::GetTarget(other.AsUint64); +#elif USE_MONO + return AsUint == other.AsUint || MCore::GCHandle::GetTarget(AsUint) == MCore::GCHandle::GetTarget(other.AsUint); +#else + return false; #endif default: return false; @@ -1309,8 +1319,12 @@ Variant::operator bool() const case VariantType::Asset: return AsAsset != nullptr; case VariantType::ManagedObject: -#if USE_MONO - return AsUint != 0 && mono_gchandle_get_target(AsUint) != nullptr; +#if USE_NETCORE + return AsUint64 != 0 && MCore::GCHandle::GetTarget(AsUint64) != nullptr; +#elif USE_MONO + return AsUint != 0 && MCore::GCHandle::GetTarget(AsUint) != nullptr; +#else + return false; #endif default: return false; @@ -1579,8 +1593,12 @@ Variant::operator void*() const case VariantType::Blob: return AsBlob.Data; case VariantType::ManagedObject: -#if USE_MONO - return AsUint ? mono_gchandle_get_target(AsUint) : nullptr; +#if USE_NETCORE + return AsUint64 ? MCore::GCHandle::GetTarget(AsUint64) : nullptr; +#elif USE_MONO + return AsUint ? MCore::GCHandle::GetTarget(AsUint) : nullptr; +#else + return nullptr; #endif default: return nullptr; @@ -1622,10 +1640,12 @@ Variant::operator ScriptingObject*() const } } -Variant::operator _MonoObject*() const +Variant::operator MObject*() const { -#if USE_MONO - return Type.Type == VariantType::ManagedObject && AsUint ? mono_gchandle_get_target(AsUint) : nullptr; +#if USE_NETCORE + return Type.Type == VariantType::ManagedObject && AsUint64 ? MCore::GCHandle::GetTarget(AsUint64) : nullptr; +#elif USE_MONO + return Type.Type == VariantType::ManagedObject && AsUint ? MCore::GCHandle::GetTarget(AsUint) : nullptr; #else return nullptr; #endif @@ -2338,9 +2358,12 @@ void Variant::SetType(const VariantType& type) Delete(AsDictionary); break; case VariantType::ManagedObject: -#if USE_MONO +#if USE_NETCORE + if (AsUint64) + MCore::GCHandle::Free(AsUint64); +#elif USE_MONO if (AsUint) - mono_gchandle_free(AsUint); + MCore::GCHandle::Free(AsUint); #endif break; default: ; @@ -2448,9 +2471,12 @@ void Variant::SetType(VariantType&& type) Delete(AsDictionary); break; case VariantType::ManagedObject: -#if USE_MONO +#if USE_NETCORE + if (AsUint64) + MCore::GCHandle::Free(AsUint64); +#elif USE_MONO if (AsUint) - mono_gchandle_free(AsUint); + MCore::GCHandle::Free(AsUint); #endif break; default: ; @@ -2626,14 +2652,18 @@ void Variant::SetObject(ScriptingObject* object) object->Deleted.Bind(this); } -void Variant::SetManagedObject(_MonoObject* object) +void Variant::SetManagedObject(MObject* object) { -#if USE_MONO +#if USE_CSHARP if (object) { if (Type.Type != VariantType::ManagedObject) - SetType(VariantType(VariantType::ManagedObject, mono_object_get_class(object))); - AsUint = mono_gchandle_new(object, true); + SetType(VariantType(VariantType::ManagedObject, MCore::Object::GetClass(object))); +#if USE_NETCORE + AsUint64 = MCore::GCHandle::New(object); +#else + AsUint = MCore::GCHandle::New(object); +#endif } else { @@ -2752,8 +2782,12 @@ String Variant::ToString() const case VariantType::Typename: return String((const char*)AsBlob.Data, AsBlob.Length ? AsBlob.Length - 1 : 0); case VariantType::ManagedObject: -#if USE_MONO - return AsUint ? String(MUtils::ToString(mono_object_to_string(mono_gchandle_get_target(AsUint), nullptr))) : TEXT("null"); +#if USE_NETCORE + return AsUint64 ? String(MUtils::ToString(MCore::Object::ToString(MCore::GCHandle::GetTarget(AsUint64)))) : TEXT("null"); +#elif USE_MONO + return AsUint ? String(MUtils::ToString(MCore::Object::ToString(MCore::GCHandle::GetTarget(AsUint)))) : TEXT("null"); +#else + return String::Empty; #endif default: return String::Empty; @@ -3656,23 +3690,28 @@ void Variant::AllocStructure() AsBlob.Data = Allocator::Allocate(AsBlob.Length); *((int16*)AsBlob.Data) = 0; } -#if USE_MONO +#if USE_CSHARP else if (const auto mclass = Scripting::FindClass(typeName)) { // Fallback to C#-only types - MCore::AttachThread(); - auto instance = mclass->CreateInstance(); + MCore::Thread::Attach(); + MObject* instance = mclass->CreateInstance(); if (instance) { #if 0 - void* data = mono_object_unbox(instance); - int32 instanceSize = mono_class_instance_size(mclass->GetNative()); + void* data = MCore::Object::Unbox(instance); + int32 instanceSize = mclass->GetInstanceSize(); AsBlob.Length = instanceSize - (int32)((uintptr)data - (uintptr)instance); AsBlob.Data = Allocator::Allocate(AsBlob.Length); Platform::MemoryCopy(AsBlob.Data, data, AsBlob.Length); #else Type.Type = VariantType::ManagedObject; - AsUint = mono_gchandle_new(instance, true); + +#if USE_NETCORE + AsUint64 = MCore::GCHandle::New(instance); +#else + AsUint = MCore::GCHandle::New(instance); +#endif #endif } else @@ -3764,8 +3803,12 @@ uint32 GetHash(const Variant& key) case VariantType::Typename: return GetHash((const char*)key.AsBlob.Data); case VariantType::ManagedObject: -#if USE_MONO - return key.AsUint ? (uint32)mono_object_hash(mono_gchandle_get_target(key.AsUint)) : 0; +#if USE_NETCORE + return key.AsUint64 ? (uint32)MCore::Object::GetHashCode(MCore::GCHandle::GetTarget(key.AsUint64)) : 0; +#elif USE_MONO + return key.AsUint ? (uint32)MCore::Object::GetHashCode(MCore::GCHandle::GetTarget(key.AsUint)) : 0; +#else + return 0; #endif default: return 0; diff --git a/Source/Engine/Core/Types/Variant.h b/Source/Engine/Core/Types/Variant.h index c50854707..7745307c3 100644 --- a/Source/Engine/Core/Types/Variant.h +++ b/Source/Engine/Core/Types/Variant.h @@ -3,10 +3,9 @@ #pragma once #include "Engine/Core/Types/String.h" +#include "Engine/Scripting/Types.h" class Asset; -class ScriptingObject; -struct ScriptingType; struct Transform; struct CommonValue; template @@ -105,7 +104,7 @@ public: explicit VariantType(Types type, const StringView& typeName); explicit VariantType(Types type, const StringAnsiView& typeName); - explicit VariantType(Types type, struct _MonoClass* klass); + explicit VariantType(Types type, MClass* klass); explicit VariantType(const StringAnsiView& typeName); VariantType(const VariantType& other); VariantType(VariantType&& other) noexcept; @@ -215,7 +214,7 @@ public: Variant(void* v); Variant(ScriptingObject* v); Variant(Asset* v); - Variant(struct _MonoObject* v); + Variant(MObject* v); Variant(const StringView& v); Variant(const StringAnsiView& v); Variant(const Char* v); @@ -296,7 +295,7 @@ public: explicit operator StringView() const; // Returned StringView, if not empty, is guaranteed to point to a null terminated buffer. explicit operator StringAnsiView() const; // Returned StringView, if not empty, is guaranteed to point to a null terminated buffer. explicit operator ScriptingObject*() const; - explicit operator struct _MonoObject*() const; + explicit operator MObject*() const; explicit operator Asset*() const; explicit operator Float2() const; explicit operator Float3() const; @@ -356,7 +355,7 @@ public: void SetBlob(int32 length); void SetBlob(const void* data, int32 length); void SetObject(ScriptingObject* object); - void SetManagedObject(struct _MonoObject* object); + void SetManagedObject(MObject* object); void SetAsset(Asset* asset); String ToString() const; diff --git a/Source/Engine/Debug/DebugDraw.cpp b/Source/Engine/Debug/DebugDraw.cpp index 125ffd520..891792d79 100644 --- a/Source/Engine/Debug/DebugDraw.cpp +++ b/Source/Engine/Debug/DebugDraw.cpp @@ -454,7 +454,12 @@ inline void DrawText3D(const DebugText3D& t, const RenderContext& renderContext, { Matrix w, fw, m; if (t.FaceCamera) - Matrix::CreateWorld(t.Transform.Translation, renderContext.View.Direction, viewUp, w); + { + Matrix s, ss; + Matrix::Scaling(t.Transform.Scale.X, s); + Matrix::CreateWorld(t.Transform.Translation, renderContext.View.Direction, viewUp, ss); + Matrix::Multiply(s, ss, w); + } else t.Transform.GetWorld(w); Matrix::Multiply(f, w, fw); @@ -1995,7 +2000,7 @@ void DebugDraw::DrawText(const StringView& text, const Float2& position, const C t.TimeLeft = duration; } -void DebugDraw::DrawText(const StringView& text, const Vector3& position, const Color& color, int32 size, float duration) +void DebugDraw::DrawText(const StringView& text, const Vector3& position, const Color& color, int32 size, float duration, float scale) { if (text.Length() == 0 || size < 4) return; @@ -2005,6 +2010,7 @@ void DebugDraw::DrawText(const StringView& text, const Vector3& position, const Platform::MemoryCopy(t.Text.Get(), text.Get(), text.Length() * sizeof(Char)); t.Text[text.Length()] = 0; t.Transform = position - Context->Origin; + t.Transform.Scale.X = scale; t.FaceCamera = true; t.Size = size; t.Color = color; diff --git a/Source/Engine/Debug/DebugDraw.h b/Source/Engine/Debug/DebugDraw.h index b37080d0f..8cc5452ed 100644 --- a/Source/Engine/Debug/DebugDraw.h +++ b/Source/Engine/Debug/DebugDraw.h @@ -590,7 +590,8 @@ API_CLASS(Static) class FLAXENGINE_API DebugDraw /// The color. /// The font size. /// The duration (in seconds). Use 0 to draw it only once. - API_FUNCTION() static void DrawText(const StringView& text, const Vector3& position, const Color& color, int32 size = 32, float duration = 0.0f); + /// The text scale. + API_FUNCTION() static void DrawText(const StringView& text, const Vector3& position, const Color& color, int32 size = 32, float duration = 0.0f, float scale = 1.0f); /// /// Draws the text (3D). diff --git a/Source/Engine/Debug/DebugLog.cpp b/Source/Engine/Debug/DebugLog.cpp index d873f4886..da867f0a1 100644 --- a/Source/Engine/Debug/DebugLog.cpp +++ b/Source/Engine/Debug/DebugLog.cpp @@ -3,17 +3,15 @@ #include "DebugLog.h" #include "Engine/Scripting/Scripting.h" #include "Engine/Scripting/BinaryModule.h" -#include "Engine/Scripting/MainThreadManagedInvokeAction.h" +#include "Engine/Scripting/ManagedCLR/MCore.h" #include "Engine/Scripting/ManagedCLR/MDomain.h" #include "Engine/Scripting/ManagedCLR/MAssembly.h" #include "Engine/Scripting/ManagedCLR/MClass.h" +#include "Engine/Scripting/Internal/MainThreadManagedInvokeAction.h" #include "Engine/Threading/Threading.h" #include "FlaxEngine.Gen.h" -#if USE_MONO - -#include -#include +#if USE_CSHARP namespace Impl { @@ -68,19 +66,19 @@ bool CacheMethods() void DebugLog::Log(LogType type, const StringView& message) { -#if USE_MONO +#if USE_CSHARP if (CacheMethods()) return; auto scriptsDomain = Scripting::GetScriptsDomain(); MainThreadManagedInvokeAction::ParamsBuilder params; params.AddParam(type); - params.AddParam(message, scriptsDomain->GetNative()); + params.AddParam(message, scriptsDomain); #if BUILD_RELEASE - params.AddParam(StringView::Empty, scriptsDomain->GetNative()); + params.AddParam(StringView::Empty, scriptsDomain); #else const String stackTrace = Platform::GetStackTrace(1); - params.AddParam(stackTrace, scriptsDomain->GetNative()); + params.AddParam(stackTrace, scriptsDomain); #endif MainThreadManagedInvokeAction::Invoke(Internal_SendLog, params); #endif @@ -88,7 +86,7 @@ void DebugLog::Log(LogType type, const StringView& message) void DebugLog::LogException(MObject* exceptionObject) { -#if USE_MONO +#if USE_CSHARP if (exceptionObject == nullptr || CacheMethods()) return; @@ -101,11 +99,11 @@ void DebugLog::LogException(MObject* exceptionObject) String DebugLog::GetStackTrace() { String result; -#if USE_MONO +#if USE_CSHARP if (!CacheMethods()) { auto stackTraceObj = Internal_GetStackTrace->Invoke(nullptr, nullptr, nullptr); - MUtils::ToString((MonoString*)stackTraceObj, result); + MUtils::ToString((MString*)stackTraceObj, result); } #endif return result; @@ -113,10 +111,9 @@ String DebugLog::GetStackTrace() void DebugLog::ThrowException(const char* msg) { -#if USE_MONO - // Throw exception to the C# world - auto ex = mono_exception_from_name_msg(mono_get_corlib(), "System", "Exception", msg); - mono_raise_exception(ex); +#if USE_CSHARP + auto ex = MCore::Exception::Get(msg); + MCore::Exception::Throw(ex); #endif } @@ -125,45 +122,40 @@ void DebugLog::ThrowNullReference() //LOG(Warning, "Invalid null reference."); //LOG_STR(Warning, DebugLog::GetStackTrace()); -#if USE_MONO - // Throw exception to the C# world - auto ex = mono_get_exception_null_reference(); - mono_raise_exception(ex); +#if USE_CSHARP + auto ex = MCore::Exception::GetNullReference(); + MCore::Exception::Throw(ex); #endif } void DebugLog::ThrowArgument(const char* arg, const char* msg) { -#if USE_MONO - // Throw exception to the C# world - auto ex = mono_get_exception_argument(arg, msg); - mono_raise_exception(ex); +#if USE_CSHARP + auto ex = MCore::Exception::GetArgument(arg, msg); + MCore::Exception::Throw(ex); #endif } void DebugLog::ThrowArgumentNull(const char* arg) { -#if USE_MONO - // Throw exception to the C# world - auto ex = mono_get_exception_argument_null(arg); - mono_raise_exception(ex); +#if USE_CSHARP + auto ex = MCore::Exception::GetArgumentNull(arg); + MCore::Exception::Throw(ex); #endif } void DebugLog::ThrowArgumentOutOfRange(const char* arg) { -#if USE_MONO - // Throw exception to the C# world - auto ex = mono_get_exception_argument_out_of_range(arg); - mono_raise_exception(ex); +#if USE_CSHARP + auto ex = MCore::Exception::GetArgumentOutOfRange(arg); + MCore::Exception::Throw(ex); #endif } void DebugLog::ThrowNotSupported(const char* msg) { -#if USE_MONO - // Throw exception to the C# world - auto ex = mono_get_exception_not_supported(msg); - mono_raise_exception(ex); +#if USE_CSHARP + auto ex = MCore::Exception::GetNotSupported(msg); + MCore::Exception::Throw(ex); #endif } diff --git a/Source/Engine/Debug/Exceptions/ArgumentException.h b/Source/Engine/Debug/Exceptions/ArgumentException.h index 32142f60e..e3f4a1df4 100644 --- a/Source/Engine/Debug/Exceptions/ArgumentException.h +++ b/Source/Engine/Debug/Exceptions/ArgumentException.h @@ -24,7 +24,7 @@ namespace Log /// /// Creates default exception with additional data /// - /// Additional information that help describe error + /// Additional information that help describe error ArgumentException(const String& additionalInfo) : Exception(TEXT("One or more of provided arguments are not valid."), additionalInfo) { @@ -33,7 +33,8 @@ namespace Log /// /// Creates default exception with additional data /// - /// Additional information that help describe error + /// Argument name + /// Additional information that help describe error ArgumentException(const String& argumentName, const String& additionalInfo) : Exception(String::Format(TEXT("Provided argument {0} is not valid."), argumentName), additionalInfo) { diff --git a/Source/Engine/Debug/Exceptions/ArgumentNullException.h b/Source/Engine/Debug/Exceptions/ArgumentNullException.h index ef0ea95d5..dc2d9ea0f 100644 --- a/Source/Engine/Debug/Exceptions/ArgumentNullException.h +++ b/Source/Engine/Debug/Exceptions/ArgumentNullException.h @@ -24,7 +24,7 @@ namespace Log /// /// Creates default exception with additional data /// - /// Additional information that help describe error + /// Additional information that help describe error ArgumentNullException(const String& additionalInfo) : Exception(TEXT("One or more of provided arguments is null"), additionalInfo) { @@ -33,7 +33,8 @@ namespace Log /// /// Creates default exception with additional data /// - /// Additional information that help describe error + /// Argument name + /// Additional information that help describe error ArgumentNullException(const String& argumentName, const String& additionalInfo) : Exception(String::Format(TEXT("Provided argument {0} is null."), argumentName), additionalInfo) { diff --git a/Source/Engine/Debug/Exceptions/ArgumentOutOfRangeException.h b/Source/Engine/Debug/Exceptions/ArgumentOutOfRangeException.h index 011b64bbb..f75576062 100644 --- a/Source/Engine/Debug/Exceptions/ArgumentOutOfRangeException.h +++ b/Source/Engine/Debug/Exceptions/ArgumentOutOfRangeException.h @@ -24,7 +24,7 @@ namespace Log /// /// Creates default exception with additional data /// - /// Additional information that help describe error + /// Additional information that help describe error ArgumentOutOfRangeException(const String& additionalInfo) : Exception(TEXT("One or more of provided arguments has index out of range"), additionalInfo) { @@ -33,7 +33,8 @@ namespace Log /// /// Creates default exception with additional data /// - /// Additional information that help describe error + /// Argument name + /// Additional information that help describe error ArgumentOutOfRangeException(const String& argumentName, const String& additionalInfo) : Exception(String::Format(TEXT("Provided argument {0} is out of range."), argumentName), additionalInfo) { diff --git a/Source/Engine/Debug/Exceptions/CLRInnerException.h b/Source/Engine/Debug/Exceptions/CLRInnerException.h index 919739d57..8a7c5e09e 100644 --- a/Source/Engine/Debug/Exceptions/CLRInnerException.h +++ b/Source/Engine/Debug/Exceptions/CLRInnerException.h @@ -3,6 +3,7 @@ #pragma once #include "Engine/Debug/Exception.h" +#include "Engine/Scripting/Types.h" namespace Log { @@ -24,15 +25,15 @@ namespace Log /// /// Creates default exception with additional data /// - /// Additional information that help describe error + /// Additional information that help describe error CLRInnerException(const String& additionalInfo) : Exception(String::Format(TEXT("Current {0} CLR method has thrown an inner exception"), #if USE_MONO - TEXT("Mono") -#elif USE_CORECLR - TEXT(".NET Core") + TEXT("Mono") +#elif USE_NETCORE + TEXT(".NET Core") #else - TEXT("Unknown engine") + TEXT("Unknown engine") #endif ), additionalInfo) { diff --git a/Source/Engine/Debug/Exceptions/DivideByZeroException.h b/Source/Engine/Debug/Exceptions/DivideByZeroException.h index 3d319df19..cda5a637f 100644 --- a/Source/Engine/Debug/Exceptions/DivideByZeroException.h +++ b/Source/Engine/Debug/Exceptions/DivideByZeroException.h @@ -24,7 +24,7 @@ namespace Log /// /// Creates default exception with additional data /// - /// Additional information that help describe error + /// Additional information that help describe error DivideByZeroException(const String& additionalInfo) : Exception(TEXT("Tried to divide value by zero"), additionalInfo) { diff --git a/Source/Engine/Debug/Exceptions/FileNotFoundException.h b/Source/Engine/Debug/Exceptions/FileNotFoundException.h index bcb9463d5..09e0cc3fb 100644 --- a/Source/Engine/Debug/Exceptions/FileNotFoundException.h +++ b/Source/Engine/Debug/Exceptions/FileNotFoundException.h @@ -24,7 +24,7 @@ namespace Log /// /// Creates default exception with additional data /// - /// Additional information that help describe error + /// Additional information that help describe error FileNotFoundException(const String& additionalInfo) : Exception(TEXT("File not found"), additionalInfo) { diff --git a/Source/Engine/Debug/Exceptions/IOException.h b/Source/Engine/Debug/Exceptions/IOException.h index f130c7e18..b0fadec6f 100644 --- a/Source/Engine/Debug/Exceptions/IOException.h +++ b/Source/Engine/Debug/Exceptions/IOException.h @@ -24,7 +24,7 @@ namespace Log /// /// Creates default exception with additional data /// - /// Additional information that help describe error + /// Additional information that help describe error IOException(const String& additionalInfo) : Exception(TEXT("I/O error occurred."), additionalInfo) { diff --git a/Source/Engine/Debug/Exceptions/IndexOutOfRangeException.h b/Source/Engine/Debug/Exceptions/IndexOutOfRangeException.h index 23511d5ce..445b8df59 100644 --- a/Source/Engine/Debug/Exceptions/IndexOutOfRangeException.h +++ b/Source/Engine/Debug/Exceptions/IndexOutOfRangeException.h @@ -24,7 +24,7 @@ namespace Log /// /// Creates default exception with additional data /// - /// Additional information that help describe error + /// Additional information that help describe error IndexOutOfRangeException(const String& additionalInfo) : Exception(TEXT("Index is out of range for items in array"), additionalInfo) { diff --git a/Source/Engine/Debug/Exceptions/InvalidOperationException.h b/Source/Engine/Debug/Exceptions/InvalidOperationException.h index 3194741b1..63299ff82 100644 --- a/Source/Engine/Debug/Exceptions/InvalidOperationException.h +++ b/Source/Engine/Debug/Exceptions/InvalidOperationException.h @@ -24,7 +24,7 @@ namespace Log /// /// Creates default exception with additional data /// - /// Additional information that help describe error + /// Additional information that help describe error InvalidOperationException(const String& additionalInfo) : Exception(TEXT("Current object didn't exists or its state was invalid."), additionalInfo) { diff --git a/Source/Engine/Debug/Exceptions/NotImplementedException.h b/Source/Engine/Debug/Exceptions/NotImplementedException.h index 49e330a73..118b57187 100644 --- a/Source/Engine/Debug/Exceptions/NotImplementedException.h +++ b/Source/Engine/Debug/Exceptions/NotImplementedException.h @@ -24,7 +24,7 @@ namespace Log /// /// Creates default exception with additional data /// - /// Additional information that help describe error + /// Additional information that help describe error NotImplementedException(const String& additionalInfo) : Exception(TEXT("Current method or operation is not implemented."), additionalInfo) { diff --git a/Source/Engine/Debug/Exceptions/NotSupportedException.h b/Source/Engine/Debug/Exceptions/NotSupportedException.h index 44f692480..c4ecbaa40 100644 --- a/Source/Engine/Debug/Exceptions/NotSupportedException.h +++ b/Source/Engine/Debug/Exceptions/NotSupportedException.h @@ -24,7 +24,7 @@ namespace Log /// /// Creates default exception with additional data /// - /// Additional information that help describe error + /// Additional information that help describe error NotSupportedException(const String& additionalInfo) : Exception(TEXT("Current method or operation is not supported in current context"), additionalInfo) { diff --git a/Source/Engine/Debug/Exceptions/OverflowException.h b/Source/Engine/Debug/Exceptions/OverflowException.h index d484d109e..3b158cae3 100644 --- a/Source/Engine/Debug/Exceptions/OverflowException.h +++ b/Source/Engine/Debug/Exceptions/OverflowException.h @@ -24,7 +24,7 @@ namespace Log /// /// Creates default exception with additional data /// - /// Additional information that help describe error + /// Additional information that help describe error OverflowException(const String& additionalInfo) : Exception(TEXT("Arithmetic, casting, or conversion operation results in an overflow."), additionalInfo) { diff --git a/Source/Engine/Debug/Exceptions/PathTooLongException.h b/Source/Engine/Debug/Exceptions/PathTooLongException.h index cc350986c..76d270a62 100644 --- a/Source/Engine/Debug/Exceptions/PathTooLongException.h +++ b/Source/Engine/Debug/Exceptions/PathTooLongException.h @@ -24,7 +24,7 @@ namespace Log /// /// Creates default exception with additional data /// - /// Additional information that help describe error + /// Additional information that help describe error PathTooLongException(const String& additionalInfo) : Exception(TEXT("Path too long."), additionalInfo) { diff --git a/Source/Engine/Debug/Exceptions/PlatformNotSupportedException.h b/Source/Engine/Debug/Exceptions/PlatformNotSupportedException.h index 46559080b..ad84233e1 100644 --- a/Source/Engine/Debug/Exceptions/PlatformNotSupportedException.h +++ b/Source/Engine/Debug/Exceptions/PlatformNotSupportedException.h @@ -24,7 +24,7 @@ namespace Log /// /// Creates default exception with additional data /// - /// Additional information that help describe error + /// Additional information that help describe error PlatformNotSupportedException(const String& additionalInfo) : Exception(TEXT("Method or operation in not supported on current platform."), additionalInfo) { diff --git a/Source/Engine/Debug/Exceptions/TimeoutException.h b/Source/Engine/Debug/Exceptions/TimeoutException.h index 9220e50cf..67c1c64a3 100644 --- a/Source/Engine/Debug/Exceptions/TimeoutException.h +++ b/Source/Engine/Debug/Exceptions/TimeoutException.h @@ -24,7 +24,7 @@ namespace Log /// /// Creates default exception with additional data /// - /// Additional information that help describe error + /// Additional information that help describe error TimeoutException(const String& additionalInfo) : Exception(TEXT("Current operation has timed out."), additionalInfo) { diff --git a/Source/Engine/Engine/DebugLogHandler.cs b/Source/Engine/Engine/DebugLogHandler.cs index c29da21cc..d123cbe07 100644 --- a/Source/Engine/Engine/DebugLogHandler.cs +++ b/Source/Engine/Engine/DebugLogHandler.cs @@ -4,10 +4,12 @@ using System; using System.Diagnostics; using System.Runtime.CompilerServices; using System.Security; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.Marshalling; namespace FlaxEngine { - internal sealed class DebugLogHandler : ILogHandler + internal partial class DebugLogHandler : ILogHandler { /// /// Occurs on sending a log message. @@ -64,14 +66,14 @@ namespace FlaxEngine Debug.Logger.LogException(exception); } - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_LogWrite(LogType level, string msg); + [LibraryImport("FlaxEngine", EntryPoint = "DebugLogHandlerInternal_LogWrite", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(Interop.StringMarshaller))] + internal static partial void Internal_LogWrite(LogType level, string msg); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_Log(LogType level, string msg, IntPtr obj, string stackTrace); + [LibraryImport("FlaxEngine", EntryPoint = "DebugLogHandlerInternal_Log", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(Interop.StringMarshaller))] + internal static partial void Internal_Log(LogType level, string msg, IntPtr obj, string stackTrace); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_LogException(Exception exception, IntPtr obj); + [LibraryImport("FlaxEngine", EntryPoint = "DebugLogHandlerInternal_LogException", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(Interop.StringMarshaller))] + internal static partial void Internal_LogException([MarshalUsing(typeof(Interop.ExceptionMarshaller))] Exception exception, IntPtr obj); [SecuritySafeCritical] public static string Internal_GetStackTrace() diff --git a/Source/Engine/Engine/Engine.cpp b/Source/Engine/Engine/Engine.cpp index 9c34dafda..bafcd30b3 100644 --- a/Source/Engine/Engine/Engine.cpp +++ b/Source/Engine/Engine/Engine.cpp @@ -20,6 +20,7 @@ #include "Engine/Threading/MainThreadTask.h" #include "Engine/Threading/ThreadRegistry.h" #include "Engine/Graphics/GPUDevice.h" +#include "Engine/Scripting/ManagedCLR/MCore.h" #include "Engine/Scripting/ScriptingType.h" #include "Engine/Content/Content.h" #include "Engine/Content/JsonAsset.h" @@ -39,7 +40,7 @@ #include "Engine/Scripting/ManagedCLR/MAssembly.h" #include "Engine/Scripting/ManagedCLR/MClass.h" #include "Engine/Scripting/ManagedCLR/MMethod.h" -#include "Engine/Scripting/MException.h" +#include "Engine/Scripting/ManagedCLR/MException.h" #include "Engine/Core/Config/PlatformSettings.h" #endif @@ -65,6 +66,7 @@ Action Engine::FixedUpdate; Action Engine::Update; TaskGraph* Engine::UpdateGraph = nullptr; Action Engine::LateUpdate; +Action Engine::LateFixedUpdate; Action Engine::Draw; Action Engine::Pause; Action Engine::Unpause; @@ -198,6 +200,7 @@ int32 Engine::Main(const Char* cmdLine) if (Time::OnBeginPhysics()) { OnFixedUpdate(); + OnLateFixedUpdate(); Time::OnEndPhysics(); } @@ -273,6 +276,17 @@ void Engine::OnFixedUpdate() } } +void Engine::OnLateFixedUpdate() +{ + PROFILE_CPU_NAMED("Late Fixed Update"); + + // Call event + LateFixedUpdate(); + + // Update services + EngineService::OnLateFixedUpdate(); +} + void Engine::OnUpdate() { PROFILE_CPU_NAMED("Update"); @@ -309,6 +323,14 @@ void Engine::OnUpdate() // Update services EngineService::OnUpdate(); + +#ifdef USE_NETCORE + // Force GC to run in background periodically to avoid large blocking collections causing hitches + if (Time::Update.TicksCount % 60 == 0) + { + MCore::GC::Collect(MCore::GC::MaxGeneration(), MGCCollectionMode::Forced, false, false); + } +#endif } void Engine::OnLateUpdate() @@ -547,6 +569,7 @@ void EngineImpl::InitPaths() #endif #if USE_EDITOR Globals::EngineContentFolder = Globals::StartupFolder / TEXT("Content"); +#if USE_MONO #if PLATFORM_WINDOWS Globals::MonoPath = Globals::StartupFolder / TEXT("Source/Platforms/Editor/Windows/Mono"); #elif PLATFORM_LINUX @@ -556,8 +579,11 @@ void EngineImpl::InitPaths() #else #error "Please specify the Mono data location for Editor on this platform." #endif +#endif #else +#if USE_MONO Globals::MonoPath = Globals::StartupFolder / TEXT("Mono"); +#endif #endif Globals::ProjectContentFolder = Globals::ProjectFolder / TEXT("Content"); #if USE_EDITOR diff --git a/Source/Engine/Engine/Engine.h b/Source/Engine/Engine/Engine.h index 6f8c5fe6e..31d1f6ea6 100644 --- a/Source/Engine/Engine/Engine.h +++ b/Source/Engine/Engine/Engine.h @@ -54,6 +54,11 @@ public: /// static Action LateUpdate; + /// + /// Event called after engine update. + /// + static Action LateFixedUpdate; + /// /// Event called during frame rendering and can be used to invoke custom rendering with GPUDevice. /// @@ -107,6 +112,11 @@ public: /// static void OnLateUpdate(); + /// + /// Late fixed update callback. + /// + static void OnLateFixedUpdate(); + /// /// Draw callback. /// diff --git a/Source/Engine/Engine/EngineService.cpp b/Source/Engine/Engine/EngineService.cpp index 9a01b08b5..7eea66853 100644 --- a/Source/Engine/Engine/EngineService.cpp +++ b/Source/Engine/Engine/EngineService.cpp @@ -33,6 +33,7 @@ static bool CompareEngineServices(EngineService* const& a, EngineService* const& DEFINE_ENGINE_SERVICE_EVENT(FixedUpdate); DEFINE_ENGINE_SERVICE_EVENT(Update); DEFINE_ENGINE_SERVICE_EVENT(LateUpdate); +DEFINE_ENGINE_SERVICE_EVENT(LateFixedUpdate); DEFINE_ENGINE_SERVICE_EVENT(Draw); DEFINE_ENGINE_SERVICE_EVENT_INVERTED(BeforeExit); diff --git a/Source/Engine/Engine/EngineService.h b/Source/Engine/Engine/EngineService.h index f4ae1b271..a142455d0 100644 --- a/Source/Engine/Engine/EngineService.h +++ b/Source/Engine/Engine/EngineService.h @@ -44,6 +44,7 @@ public: DECLARE_ENGINE_SERVICE_EVENT(void, FixedUpdate); DECLARE_ENGINE_SERVICE_EVENT(void, Update); DECLARE_ENGINE_SERVICE_EVENT(void, LateUpdate); + DECLARE_ENGINE_SERVICE_EVENT(void, LateFixedUpdate); DECLARE_ENGINE_SERVICE_EVENT(void, Draw); DECLARE_ENGINE_SERVICE_EVENT(void, BeforeExit); DECLARE_ENGINE_SERVICE_EVENT(void, Dispose); diff --git a/Source/Engine/Engine/Game.h b/Source/Engine/Engine/Game.h index 16a992c82..6b71b4e1c 100644 --- a/Source/Engine/Engine/Game.h +++ b/Source/Engine/Engine/Game.h @@ -24,6 +24,8 @@ #include "Platforms/Switch/Engine/Engine/SwitchGame.h" #elif PLATFORM_MAC #include "Mac/MacGame.h" +#elif PLATFORM_IOS +#include "iOS/iOSGame.h" #else #error Missing Game implementation! #endif diff --git a/Source/Engine/Engine/Globals.cpp b/Source/Engine/Engine/Globals.cpp index 88d1ced23..d08aa5b5b 100644 --- a/Source/Engine/Engine/Globals.cpp +++ b/Source/Engine/Engine/Globals.cpp @@ -15,7 +15,9 @@ String Globals::EngineContentFolder; String Globals::ProjectSourceFolder; #endif String Globals::ProjectContentFolder; +#if USE_MONO String Globals::MonoPath; +#endif bool Globals::FatalErrorOccurred; bool Globals::IsRequestingExit; int32 Globals::ExitCode; diff --git a/Source/Engine/Engine/Globals.h b/Source/Engine/Engine/Globals.h index c033e9ef5..a303590de 100644 --- a/Source/Engine/Engine/Globals.h +++ b/Source/Engine/Engine/Globals.h @@ -49,8 +49,10 @@ DECLARE_SCRIPTING_TYPE_NO_SPAWN(Globals); // Project content directory path API_FIELD(ReadOnly) static String ProjectContentFolder; +#if USE_MONO // Mono library folder path API_FIELD(ReadOnly) static String MonoPath; +#endif // State diff --git a/Source/Engine/Engine/NativeInterop.Invoker.cs b/Source/Engine/Engine/NativeInterop.Invoker.cs new file mode 100644 index 000000000..2fc54597c --- /dev/null +++ b/Source/Engine/Engine/NativeInterop.Invoker.cs @@ -0,0 +1,1296 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#if USE_NETCORE +using System; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; +using System.Diagnostics; + +namespace FlaxEngine.Interop +{ + unsafe partial class NativeInterop + { + /// + /// Helper class for invoking managed methods from delegates. + /// + internal static class Invoker + { + // TODO: Use .NET8 Unsafe.BitCast(returnValue) for more efficient casting of value types over boxing cast + + internal static IntPtr MarshalReturnValue(ref TRet returnValue) + { + if (returnValue == null) + return IntPtr.Zero; + if (typeof(TRet) == typeof(string)) + return ManagedString.ToNativeWeak(Unsafe.As(returnValue)); + if (typeof(TRet) == typeof(ManagedHandle)) + return ManagedHandle.ToIntPtr((ManagedHandle)(object)returnValue); + if (typeof(TRet) == typeof(bool)) + return (bool)(object)returnValue ? boolTruePtr : boolFalsePtr; + if (typeof(TRet) == typeof(Type)) + return ManagedHandle.ToIntPtr(GetTypeGCHandle(Unsafe.As(returnValue))); + if (typeof(TRet).IsArray) + { + var elementType = typeof(TRet).GetElementType(); + if (ArrayFactory.GetMarshalledType(elementType) == elementType) + return ManagedHandle.ToIntPtr(ManagedArray.WrapNewArray(Unsafe.As(returnValue)), GCHandleType.Weak); + return ManagedHandle.ToIntPtr(ManagedArrayToGCHandleWrappedArray(Unsafe.As(returnValue)), GCHandleType.Weak); + } + return ManagedHandle.ToIntPtr(returnValue, GCHandleType.Weak); + } + + internal static IntPtr MarshalReturnValueGeneric(Type returnType, object returnObject) + { + if (returnObject == null) + return IntPtr.Zero; + if (returnType == typeof(string)) + return ManagedString.ToNativeWeak(Unsafe.As(returnObject)); + if (returnType == typeof(ManagedHandle)) + return ManagedHandle.ToIntPtr((ManagedHandle)(object)returnObject); + if (returnType == typeof(bool)) + return (bool)returnObject ? boolTruePtr : boolFalsePtr; + if (returnType == typeof(Type)) + return ManagedHandle.ToIntPtr(GetTypeGCHandle(Unsafe.As(returnObject))); + if (returnType.IsArray && ArrayFactory.GetMarshalledType(returnType.GetElementType()) == returnType.GetElementType()) + return ManagedHandle.ToIntPtr(ManagedArray.WrapNewArray(Unsafe.As(returnObject)), GCHandleType.Weak); + if (returnType.IsArray) + return ManagedHandle.ToIntPtr(ManagedArrayToGCHandleWrappedArray(Unsafe.As(returnObject)), GCHandleType.Weak); + return ManagedHandle.ToIntPtr(returnObject, GCHandleType.Weak); + } + + internal static IntPtr MarshalReturnValueThunk(ref TRet returnValue) + { + if (returnValue == null) + return IntPtr.Zero; + if (typeof(TRet) == typeof(string)) + return ManagedString.ToNativeWeak(Unsafe.As(returnValue)); + if (typeof(TRet) == typeof(IntPtr)) + return (IntPtr)(object)returnValue; + if (typeof(TRet) == typeof(ManagedHandle)) + return ManagedHandle.ToIntPtr((ManagedHandle)(object)returnValue); + if (typeof(TRet) == typeof(Type)) + return ManagedHandle.ToIntPtr(GetTypeGCHandle(Unsafe.As(returnValue))); + if (typeof(TRet).IsArray) + { + var elementType = typeof(TRet).GetElementType(); + if (ArrayFactory.GetMarshalledType(elementType) == elementType) + return ManagedHandle.ToIntPtr(ManagedArray.WrapNewArray(Unsafe.As(returnValue)), GCHandleType.Weak); + return ManagedHandle.ToIntPtr(ManagedArrayToGCHandleWrappedArray(Unsafe.As(returnValue)), GCHandleType.Weak); + } + // Match Mono bindings and pass value as pointer to prevent boxing it + if (typeof(TRet) == typeof(System.Boolean)) + return new IntPtr(((System.Boolean)(object)returnValue) ? 1 : 0); + if (typeof(TRet) == typeof(System.Int16)) + return new IntPtr((int)(System.Int16)(object)returnValue); + if (typeof(TRet) == typeof(System.Int32)) + return new IntPtr((int)(System.Int32)(object)returnValue); + if (typeof(TRet) == typeof(System.Int64)) + return new IntPtr((long)(System.Int64)(object)returnValue); + if (typeof(TRet) == typeof(System.UInt16)) + return (IntPtr)new UIntPtr((ulong)(System.UInt16)(object)returnValue); + if (typeof(TRet) == typeof(System.UInt32)) + return (IntPtr)new UIntPtr((ulong)(System.UInt32)(object)returnValue); + if (typeof(TRet) == typeof(System.UInt64)) + return (IntPtr)new UIntPtr((ulong)(System.UInt64)(object)returnValue); + return ManagedHandle.ToIntPtr(returnValue, GCHandleType.Weak); + } + + internal static IntPtr MarshalReturnValueThunkGeneric(Type returnType, object returnObject) + { + if (returnObject == null) + return IntPtr.Zero; + if (returnType == typeof(string)) + return ManagedString.ToNativeWeak(Unsafe.As(returnObject)); + if (returnType == typeof(IntPtr)) + return (IntPtr)(object)returnObject; + if (returnType == typeof(ManagedHandle)) + return ManagedHandle.ToIntPtr((ManagedHandle)(object)returnObject); + if (returnType == typeof(Type)) + return returnObject != null ? ManagedHandle.ToIntPtr(GetTypeGCHandle(Unsafe.As(returnObject))) : IntPtr.Zero; + if (returnType.IsArray) + { + var elementType = returnType.GetElementType(); + if (ArrayFactory.GetMarshalledType(elementType) == elementType) + return ManagedHandle.ToIntPtr(ManagedArray.WrapNewArray(Unsafe.As(returnObject)), GCHandleType.Weak); + return ManagedHandle.ToIntPtr(ManagedArrayToGCHandleWrappedArray(Unsafe.As(returnObject)), GCHandleType.Weak); + } + // Match Mono bindings and pass value as pointer to prevent boxing it + if (returnType == typeof(System.Boolean)) + return new IntPtr(((System.Boolean)(object)returnObject) ? 1 : 0); + if (returnType == typeof(System.Int16)) + return new IntPtr((int)(System.Int16)(object)returnObject); + if (returnType == typeof(System.Int32)) + return new IntPtr((int)(System.Int32)(object)returnObject); + if (returnType == typeof(System.Int64)) + return new IntPtr((long)(System.Int64)(object)returnObject); + if (returnType == typeof(System.UInt16)) + return (IntPtr)new UIntPtr((ulong)(System.UInt16)(object)returnObject); + if (returnType == typeof(System.UInt32)) + return (IntPtr)new UIntPtr((ulong)(System.UInt32)(object)returnObject); + if (returnType == typeof(System.UInt64)) + return (IntPtr)new UIntPtr((ulong)(System.UInt64)(object)returnObject); + return ManagedHandle.ToIntPtr(returnObject, GCHandleType.Weak); + } + +#if !USE_AOT + internal delegate IntPtr MarshalAndInvokeDelegate(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr); + + internal delegate IntPtr InvokeThunkDelegate(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs); + + /// + /// Casts managed pointer to unmanaged pointer. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static T* ToPointer(IntPtr ptr) where T : unmanaged + { + return (T*)ptr.ToPointer(); + } + + internal static MethodInfo ToPointerMethod = typeof(Invoker).GetMethod(nameof(Invoker.ToPointer), BindingFlags.Static | BindingFlags.NonPublic); + + /// + /// Creates a delegate for invoker to pass parameters as references. + /// + internal static Delegate CreateDelegateFromMethod(MethodInfo method, bool passParametersByRef = true) + { + Type[] methodParameters; + if (method.IsStatic) + methodParameters = method.GetParameterTypes(); + else + methodParameters = method.GetParameters().Select(x => x.ParameterType).Prepend(method.DeclaringType).ToArray(); + + // Pass delegate parameters by reference + Type[] delegateParameters = methodParameters.Select(x => x.IsPointer ? typeof(IntPtr) : x).Select(x => passParametersByRef && !x.IsByRef ? x.MakeByRefType() : x).ToArray(); + if (!method.IsStatic && passParametersByRef) + delegateParameters[0] = method.DeclaringType; + + // Convert unmanaged pointer parameters to IntPtr + ParameterExpression[] parameterExpressions = delegateParameters.Select(Expression.Parameter).ToArray(); + Expression[] callExpressions = new Expression[methodParameters.Length]; + for (int i = 0; i < methodParameters.Length; i++) + { + Type parameterType = methodParameters[i]; + if (parameterType.IsPointer) + callExpressions[i] = Expression.Call(null, ToPointerMethod.MakeGenericMethod(parameterType.GetElementType()), parameterExpressions[i]); + else + callExpressions[i] = parameterExpressions[i]; + } + + // Create and compile the delegate + MethodCallExpression callDelegExp; + if (method.IsStatic) + callDelegExp = Expression.Call(null, method, callExpressions.ToArray()); + else + callDelegExp = Expression.Call(parameterExpressions[0], method, callExpressions.Skip(1).ToArray()); + Type delegateType = DelegateHelpers.MakeNewCustomDelegate(delegateParameters.Append(method.ReturnType).ToArray()); + return Expression.Lambda(delegateType, callDelegExp, parameterExpressions).Compile(); + } + + internal static class InvokerNoRet0 + { + internal delegate void InvokerDelegate(object instance); + + internal delegate void ThunkInvokerDelegate(object instance); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + deleg(instancePtr.Target); + + return IntPtr.Zero; + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + deleg(instancePtr.Target); + + return IntPtr.Zero; + } + } + + internal static class InvokerNoRet1 + { + internal delegate void InvokerDelegate(object instance, ref T1 param1); + + internal delegate void ThunkInvokerDelegate(object instance, T1 param1); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + IntPtr param1Ptr = Marshal.ReadIntPtr(paramPtr); + + T1 param1 = default; + if (param1Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param1, param1Ptr, types[0].IsByRef); + + deleg(instancePtr.Target, ref param1); + + // Marshal reference parameters back to original unmanaged references + if (param1Ptr != IntPtr.Zero && types[0].IsByRef) + MarshalHelper.ToNative(ref param1, param1Ptr); + + return IntPtr.Zero; + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + T1 param1 = MarshalHelper.ToManagedUnbox(paramPtrs[0]); + + deleg(instancePtr.Target, param1); + + return IntPtr.Zero; + } + } + + internal static class InvokerNoRet2 + { + internal delegate void InvokerDelegate(object instance, ref T1 param1, ref T2 param2); + + internal delegate void ThunkInvokerDelegate(object instance, T1 param1, T2 param2); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + IntPtr param1Ptr = Marshal.ReadIntPtr(paramPtr); + IntPtr param2Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size); + + T1 param1 = default; + T2 param2 = default; + if (param1Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param1, param1Ptr, types[0].IsByRef); + if (param2Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param2, param2Ptr, types[1].IsByRef); + + deleg(instancePtr.Target, ref param1, ref param2); + + // Marshal reference parameters back to original unmanaged references + if (param1Ptr != IntPtr.Zero && types[0].IsByRef) + MarshalHelper.ToNative(ref param1, param1Ptr); + if (param2Ptr != IntPtr.Zero && types[1].IsByRef) + MarshalHelper.ToNative(ref param2, param2Ptr); + + return IntPtr.Zero; + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + T1 param1 = MarshalHelper.ToManagedUnbox(paramPtrs[0]); + T2 param2 = MarshalHelper.ToManagedUnbox(paramPtrs[1]); + + deleg(instancePtr.Target, param1, param2); + + return IntPtr.Zero; + } + } + + internal static class InvokerNoRet3 + { + internal delegate void InvokerDelegate(object instance, ref T1 param1, ref T2 param2, ref T3 param3); + + internal delegate void ThunkInvokerDelegate(object instance, T1 param1, T2 param2, T3 param3); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + IntPtr param1Ptr = Marshal.ReadIntPtr(paramPtr); + IntPtr param2Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size); + IntPtr param3Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size + IntPtr.Size); + + T1 param1 = default; + T2 param2 = default; + T3 param3 = default; + if (param1Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param1, param1Ptr, types[0].IsByRef); + if (param2Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param2, param2Ptr, types[1].IsByRef); + if (param3Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param3, param3Ptr, types[2].IsByRef); + + deleg(instancePtr.Target, ref param1, ref param2, ref param3); + + // Marshal reference parameters back to original unmanaged references + if (param1Ptr != IntPtr.Zero && types[0].IsByRef) + MarshalHelper.ToNative(ref param1, param1Ptr); + if (param2Ptr != IntPtr.Zero && types[1].IsByRef) + MarshalHelper.ToNative(ref param2, param2Ptr); + if (param3Ptr != IntPtr.Zero && types[2].IsByRef) + MarshalHelper.ToNative(ref param3, param3Ptr); + + return IntPtr.Zero; + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + T1 param1 = MarshalHelper.ToManagedUnbox(paramPtrs[0]); + T2 param2 = MarshalHelper.ToManagedUnbox(paramPtrs[1]); + T3 param3 = MarshalHelper.ToManagedUnbox(paramPtrs[2]); + + deleg(instancePtr.Target, param1, param2, param3); + + return IntPtr.Zero; + } + } + + internal static class InvokerNoRet4 + { + internal delegate void InvokerDelegate(object instance, ref T1 param1, ref T2 param2, ref T3 param3, ref T4 param4); + + internal delegate void ThunkInvokerDelegate(object instance, T1 param1, T2 param2, T3 param3, T4 param4); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + IntPtr param1Ptr = Marshal.ReadIntPtr(paramPtr); + IntPtr param2Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size); + IntPtr param3Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size + IntPtr.Size); + IntPtr param4Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size + IntPtr.Size + IntPtr.Size); + + T1 param1 = default; + T2 param2 = default; + T3 param3 = default; + T4 param4 = default; + if (param1Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param1, param1Ptr, types[0].IsByRef); + if (param2Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param2, param2Ptr, types[1].IsByRef); + if (param3Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param3, param3Ptr, types[2].IsByRef); + if (param4Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param4, param4Ptr, types[3].IsByRef); + + deleg(instancePtr.Target, ref param1, ref param2, ref param3, ref param4); + + // Marshal reference parameters back to original unmanaged references + if (param1Ptr != IntPtr.Zero && types[0].IsByRef) + MarshalHelper.ToNative(ref param1, param1Ptr); + if (param2Ptr != IntPtr.Zero && types[1].IsByRef) + MarshalHelper.ToNative(ref param2, param2Ptr); + if (param3Ptr != IntPtr.Zero && types[2].IsByRef) + MarshalHelper.ToNative(ref param3, param3Ptr); + if (param4Ptr != IntPtr.Zero && types[3].IsByRef) + MarshalHelper.ToNative(ref param4, param4Ptr); + + return IntPtr.Zero; + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + T1 param1 = MarshalHelper.ToManagedUnbox(paramPtrs[0]); + T2 param2 = MarshalHelper.ToManagedUnbox(paramPtrs[1]); + T3 param3 = MarshalHelper.ToManagedUnbox(paramPtrs[2]); + T4 param4 = MarshalHelper.ToManagedUnbox(paramPtrs[3]); + + deleg(instancePtr.Target, param1, param2, param3, param4); + + return IntPtr.Zero; + } + } + + internal static class InvokerStaticNoRet0 + { + internal delegate void InvokerDelegate(); + + internal delegate void ThunkInvokerDelegate(); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + deleg(); + + return IntPtr.Zero; + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + deleg(); + + return IntPtr.Zero; + } + } + + internal static class InvokerStaticNoRet1 + { + internal delegate void InvokerDelegate(ref T1 param1); + + internal delegate void ThunkInvokerDelegate(T1 param1); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + IntPtr param1Ptr = Marshal.ReadIntPtr(paramPtr); + + T1 param1 = default; + if (param1Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param1, param1Ptr, types[0].IsByRef); + + deleg(ref param1); + + // Marshal reference parameters back to original unmanaged references + if (param1Ptr != IntPtr.Zero && types[0].IsByRef) + MarshalHelper.ToNative(ref param1, param1Ptr); + + return IntPtr.Zero; + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + T1 param1 = MarshalHelper.ToManagedUnbox(paramPtrs[0]); + + deleg(param1); + + return IntPtr.Zero; + } + } + + internal static class InvokerStaticNoRet2 + { + internal delegate void InvokerDelegate(ref T1 param1, ref T2 param2); + + internal delegate void ThunkInvokerDelegate(T1 param1, T2 param2); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + IntPtr param1Ptr = Marshal.ReadIntPtr(paramPtr); + IntPtr param2Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size); + + T1 param1 = default; + T2 param2 = default; + if (param1Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param1, param1Ptr, types[0].IsByRef); + if (param2Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param2, param2Ptr, types[1].IsByRef); + + deleg(ref param1, ref param2); + + // Marshal reference parameters back to original unmanaged references + if (param1Ptr != IntPtr.Zero && types[0].IsByRef) + MarshalHelper.ToNative(ref param1, param1Ptr); + if (param2Ptr != IntPtr.Zero && types[1].IsByRef) + MarshalHelper.ToNative(ref param2, param2Ptr); + + return IntPtr.Zero; + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + T1 param1 = MarshalHelper.ToManagedUnbox(paramPtrs[0]); + T2 param2 = MarshalHelper.ToManagedUnbox(paramPtrs[1]); + + deleg(param1, param2); + + return IntPtr.Zero; + } + } + + internal static class InvokerStaticNoRet3 + { + internal delegate void InvokerDelegate(ref T1 param1, ref T2 param2, ref T3 param3); + + internal delegate void ThunkInvokerDelegate(T1 param1, T2 param2, T3 param3); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + IntPtr param1Ptr = Marshal.ReadIntPtr(paramPtr); + IntPtr param2Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size); + IntPtr param3Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size + IntPtr.Size); + + T1 param1 = default; + T2 param2 = default; + T3 param3 = default; + if (param1Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param1, param1Ptr, types[0].IsByRef); + if (param2Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param2, param2Ptr, types[1].IsByRef); + if (param3Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param3, param3Ptr, types[2].IsByRef); + + deleg(ref param1, ref param2, ref param3); + + // Marshal reference parameters back to original unmanaged references + if (param1Ptr != IntPtr.Zero && types[0].IsByRef) + MarshalHelper.ToNative(ref param1, param1Ptr); + if (param2Ptr != IntPtr.Zero && types[1].IsByRef) + MarshalHelper.ToNative(ref param2, param2Ptr); + if (param3Ptr != IntPtr.Zero && types[2].IsByRef) + MarshalHelper.ToNative(ref param3, param3Ptr); + + return IntPtr.Zero; + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + T1 param1 = MarshalHelper.ToManagedUnbox(paramPtrs[0]); + T2 param2 = MarshalHelper.ToManagedUnbox(paramPtrs[1]); + T3 param3 = MarshalHelper.ToManagedUnbox(paramPtrs[2]); + + deleg(param1, param2, param3); + + return IntPtr.Zero; + } + } + + internal static class InvokerStaticNoRet4 + { + internal delegate void InvokerDelegate(ref T1 param1, ref T2 param2, ref T3 param3, ref T4 param4); + + internal delegate void ThunkInvokerDelegate(T1 param1, T2 param2, T3 param3, T4 param4); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + IntPtr param1Ptr = Marshal.ReadIntPtr(paramPtr); + IntPtr param2Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size); + IntPtr param3Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size + IntPtr.Size); + IntPtr param4Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size + IntPtr.Size + IntPtr.Size); + + T1 param1 = default; + T2 param2 = default; + T3 param3 = default; + T4 param4 = default; + if (param1Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param1, param1Ptr, types[0].IsByRef); + if (param2Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param2, param2Ptr, types[1].IsByRef); + if (param3Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param3, param3Ptr, types[2].IsByRef); + if (param4Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param4, param4Ptr, types[3].IsByRef); + + deleg(ref param1, ref param2, ref param3, ref param4); + + // Marshal reference parameters back to original unmanaged references + if (param1Ptr != IntPtr.Zero && types[0].IsByRef) + MarshalHelper.ToNative(ref param1, param1Ptr); + if (param2Ptr != IntPtr.Zero && types[1].IsByRef) + MarshalHelper.ToNative(ref param2, param2Ptr); + if (param3Ptr != IntPtr.Zero && types[2].IsByRef) + MarshalHelper.ToNative(ref param3, param3Ptr); + if (param4Ptr != IntPtr.Zero && types[3].IsByRef) + MarshalHelper.ToNative(ref param4, param4Ptr); + + return IntPtr.Zero; + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + T1 param1 = MarshalHelper.ToManagedUnbox(paramPtrs[0]); + T2 param2 = MarshalHelper.ToManagedUnbox(paramPtrs[1]); + T3 param3 = MarshalHelper.ToManagedUnbox(paramPtrs[2]); + T4 param4 = MarshalHelper.ToManagedUnbox(paramPtrs[3]); + + deleg(param1, param2, param3, param4); + + return IntPtr.Zero; + } + } + + internal static class InvokerRet0 + { + internal delegate TRet InvokerDelegate(object instance); + + internal delegate TRet ThunkInvokerDelegate(object instance); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + TRet ret = deleg(instancePtr.Target); + + return MarshalReturnValue(ref ret); + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + TRet ret = deleg(instancePtr.Target); + + return MarshalReturnValueThunk(ref ret); + } + } + + internal static class InvokerRet1 + { + internal delegate TRet InvokerDelegate(object instance, ref T1 param1); + + internal delegate TRet ThunkInvokerDelegate(object instance, T1 param1); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + IntPtr param1Ptr = Marshal.ReadIntPtr(paramPtr); + + T1 param1 = default; + if (param1Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param1, param1Ptr, types[0].IsByRef); + + TRet ret = deleg(instancePtr.Target, ref param1); + + // Marshal reference parameters back to original unmanaged references + if (param1Ptr != IntPtr.Zero && types[0].IsByRef) + MarshalHelper.ToNative(ref param1, param1Ptr); + + return MarshalReturnValue(ref ret); + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + T1 param1 = MarshalHelper.ToManagedUnbox(paramPtrs[0]); + + TRet ret = deleg(instancePtr.Target, param1); + + return MarshalReturnValueThunk(ref ret); + } + } + + internal static class InvokerRet2 + { + internal delegate TRet InvokerDelegate(object instance, ref T1 param1, ref T2 param2); + + internal delegate TRet ThunkInvokerDelegate(object instance, T1 param1, T2 param2); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + IntPtr param1Ptr = Marshal.ReadIntPtr(paramPtr); + IntPtr param2Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size); + + T1 param1 = default; + T2 param2 = default; + if (param1Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param1, param1Ptr, types[0].IsByRef); + if (param2Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param2, param2Ptr, types[1].IsByRef); + + TRet ret = deleg(instancePtr.Target, ref param1, ref param2); + + // Marshal reference parameters back to original unmanaged references + if (param1Ptr != IntPtr.Zero && types[0].IsByRef) + MarshalHelper.ToNative(ref param1, param1Ptr); + if (param2Ptr != IntPtr.Zero && types[1].IsByRef) + MarshalHelper.ToNative(ref param2, param2Ptr); + + return MarshalReturnValue(ref ret); + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + T1 param1 = MarshalHelper.ToManagedUnbox(paramPtrs[0]); + T2 param2 = MarshalHelper.ToManagedUnbox(paramPtrs[1]); + + TRet ret = deleg(instancePtr.Target, param1, param2); + + return MarshalReturnValueThunk(ref ret); + } + } + + internal static class InvokerRet3 + { + internal delegate TRet InvokerDelegate(object instance, ref T1 param1, ref T2 param2, ref T3 param3); + + internal delegate TRet ThunkInvokerDelegate(object instance, T1 param1, T2 param2, T3 param3); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + IntPtr param1Ptr = Marshal.ReadIntPtr(paramPtr); + IntPtr param2Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size); + IntPtr param3Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size + IntPtr.Size); + + T1 param1 = default; + T2 param2 = default; + T3 param3 = default; + if (param1Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param1, param1Ptr, types[0].IsByRef); + if (param2Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param2, param2Ptr, types[1].IsByRef); + if (param3Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param3, param3Ptr, types[2].IsByRef); + + TRet ret = deleg(instancePtr.Target, ref param1, ref param2, ref param3); + + // Marshal reference parameters back to original unmanaged references + if (param1Ptr != IntPtr.Zero && types[0].IsByRef) + MarshalHelper.ToNative(ref param1, param1Ptr); + if (param2Ptr != IntPtr.Zero && types[1].IsByRef) + MarshalHelper.ToNative(ref param2, param2Ptr); + if (param3Ptr != IntPtr.Zero && types[2].IsByRef) + MarshalHelper.ToNative(ref param3, param3Ptr); + + return MarshalReturnValue(ref ret); + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + T1 param1 = MarshalHelper.ToManagedUnbox(paramPtrs[0]); + T2 param2 = MarshalHelper.ToManagedUnbox(paramPtrs[1]); + T3 param3 = MarshalHelper.ToManagedUnbox(paramPtrs[2]); + + TRet ret = deleg(instancePtr.Target, param1, param2, param3); + + return MarshalReturnValueThunk(ref ret); + } + } + + internal static class InvokerRet4 + { + internal delegate TRet InvokerDelegate(object instance, ref T1 param1, ref T2 param2, ref T3 param3, ref T4 param4); + + internal delegate TRet ThunkInvokerDelegate(object instance, T1 param1, T2 param2, T3 param3, T4 param4); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + IntPtr param1Ptr = Marshal.ReadIntPtr(paramPtr); + IntPtr param2Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size); + IntPtr param3Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size + IntPtr.Size); + IntPtr param4Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size + IntPtr.Size + IntPtr.Size); + + T1 param1 = default; + T2 param2 = default; + T3 param3 = default; + T4 param4 = default; + if (param1Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param1, param1Ptr, types[0].IsByRef); + if (param2Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param2, param2Ptr, types[1].IsByRef); + if (param3Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param3, param3Ptr, types[2].IsByRef); + if (param4Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param4, param4Ptr, types[3].IsByRef); + + TRet ret = deleg(instancePtr.Target, ref param1, ref param2, ref param3, ref param4); + + // Marshal reference parameters back to original unmanaged references + if (param1Ptr != IntPtr.Zero && types[0].IsByRef) + MarshalHelper.ToNative(ref param1, param1Ptr); + if (param2Ptr != IntPtr.Zero && types[1].IsByRef) + MarshalHelper.ToNative(ref param2, param2Ptr); + if (param3Ptr != IntPtr.Zero && types[2].IsByRef) + MarshalHelper.ToNative(ref param3, param3Ptr); + if (param4Ptr != IntPtr.Zero && types[3].IsByRef) + MarshalHelper.ToNative(ref param4, param4Ptr); + + return MarshalReturnValue(ref ret); + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + T1 param1 = MarshalHelper.ToManagedUnbox(paramPtrs[0]); + T2 param2 = MarshalHelper.ToManagedUnbox(paramPtrs[1]); + T3 param3 = MarshalHelper.ToManagedUnbox(paramPtrs[2]); + T4 param4 = MarshalHelper.ToManagedUnbox(paramPtrs[3]); + + TRet ret = deleg(instancePtr.Target, param1, param2, param3, param4); + + return MarshalReturnValueThunk(ref ret); + } + } + + internal static class InvokerStaticRet0 + { + internal delegate TRet InvokerDelegate(); + + internal delegate TRet ThunkInvokerDelegate(); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + TRet ret = deleg(); + + return MarshalReturnValue(ref ret); + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + TRet ret = deleg(); + + return MarshalReturnValueThunk(ref ret); + } + } + + internal static class InvokerStaticRet1 + { + internal delegate TRet InvokerDelegate(ref T1 param1); + + internal delegate TRet ThunkInvokerDelegate(T1 param1); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + IntPtr param1Ptr = Marshal.ReadIntPtr(paramPtr); + + T1 param1 = default; + if (param1Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param1, param1Ptr, types[0].IsByRef); + + TRet ret = deleg(ref param1); + + // Marshal reference parameters back to original unmanaged references + if (param1Ptr != IntPtr.Zero && types[0].IsByRef) + MarshalHelper.ToNative(ref param1, param1Ptr); + + return MarshalReturnValue(ref ret); + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + T1 param1 = MarshalHelper.ToManagedUnbox(paramPtrs[0]); + + TRet ret = deleg(param1); + + return MarshalReturnValueThunk(ref ret); + } + } + + internal static class InvokerStaticRet2 + { + internal delegate TRet InvokerDelegate(ref T1 param1, ref T2 param2); + + internal delegate TRet ThunkInvokerDelegate(T1 param1, T2 param2); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + IntPtr param1Ptr = Marshal.ReadIntPtr(paramPtr); + IntPtr param2Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size); + + T1 param1 = default; + T2 param2 = default; + if (param1Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param1, param1Ptr, types[0].IsByRef); + if (param2Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param2, param2Ptr, types[1].IsByRef); + + TRet ret = deleg(ref param1, ref param2); + + // Marshal reference parameters back to original unmanaged references + if (param1Ptr != IntPtr.Zero && types[0].IsByRef) + MarshalHelper.ToNative(ref param1, param1Ptr); + if (param2Ptr != IntPtr.Zero && types[1].IsByRef) + MarshalHelper.ToNative(ref param2, param2Ptr); + + return MarshalReturnValue(ref ret); + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + T1 param1 = MarshalHelper.ToManagedUnbox(paramPtrs[0]); + T2 param2 = MarshalHelper.ToManagedUnbox(paramPtrs[1]); + + TRet ret = deleg(param1, param2); + + return MarshalReturnValueThunk(ref ret); + } + } + + internal static class InvokerStaticRet3 + { + internal delegate TRet InvokerDelegate(ref T1 param1, ref T2 param2, ref T3 param3); + + internal delegate TRet ThunkInvokerDelegate(T1 param1, T2 param2, T3 param3); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + IntPtr param1Ptr = Marshal.ReadIntPtr(paramPtr); + IntPtr param2Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size); + IntPtr param3Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size + IntPtr.Size); + + T1 param1 = default; + T2 param2 = default; + T3 param3 = default; + if (param1Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param1, param1Ptr, types[0].IsByRef); + if (param2Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param2, param2Ptr, types[1].IsByRef); + if (param3Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param3, param3Ptr, types[2].IsByRef); + + TRet ret = deleg(ref param1, ref param2, ref param3); + + // Marshal reference parameters back to original unmanaged references + if (param1Ptr != IntPtr.Zero && types[0].IsByRef) + MarshalHelper.ToNative(ref param1, param1Ptr); + if (param2Ptr != IntPtr.Zero && types[1].IsByRef) + MarshalHelper.ToNative(ref param2, param2Ptr); + if (param3Ptr != IntPtr.Zero && types[2].IsByRef) + MarshalHelper.ToNative(ref param3, param3Ptr); + + return MarshalReturnValue(ref ret); + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + T1 param1 = MarshalHelper.ToManagedUnbox(paramPtrs[0]); + T2 param2 = MarshalHelper.ToManagedUnbox(paramPtrs[1]); + T3 param3 = MarshalHelper.ToManagedUnbox(paramPtrs[2]); + + TRet ret = deleg(param1, param2, param3); + + return MarshalReturnValueThunk(ref ret); + } + } + + internal static class InvokerStaticRet4 + { + internal delegate TRet InvokerDelegate(ref T1 param1, ref T2 param2, ref T3 param3, ref T4 param4); + + internal delegate TRet ThunkInvokerDelegate(T1 param1, T2 param2, T3 param3, T4 param4); + + internal static object CreateDelegate(MethodInfo method) + { + return new Tuple(method.GetParameterTypes(), Unsafe.As(CreateDelegateFromMethod(method))); + } + + internal static object CreateInvokerDelegate(MethodInfo method) + { + return Unsafe.As(CreateDelegateFromMethod(method, false)); + } + + [DebuggerStepThrough] + internal static IntPtr MarshalAndInvoke(object delegateContext, ManagedHandle instancePtr, IntPtr paramPtr) + { + (Type[] types, InvokerDelegate deleg) = (Tuple)(delegateContext); + + IntPtr param1Ptr = Marshal.ReadIntPtr(paramPtr); + IntPtr param2Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size); + IntPtr param3Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size + IntPtr.Size); + IntPtr param4Ptr = Marshal.ReadIntPtr(paramPtr + IntPtr.Size + IntPtr.Size + IntPtr.Size); + + T1 param1 = default; + T2 param2 = default; + T3 param3 = default; + T4 param4 = default; + if (param1Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param1, param1Ptr, types[0].IsByRef); + if (param2Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param2, param2Ptr, types[1].IsByRef); + if (param3Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param3, param3Ptr, types[2].IsByRef); + if (param4Ptr != IntPtr.Zero) + MarshalHelper.ToManaged(ref param4, param4Ptr, types[3].IsByRef); + + TRet ret = deleg(ref param1, ref param2, ref param3, ref param4); + + // Marshal reference parameters back to original unmanaged references + if (param1Ptr != IntPtr.Zero && types[0].IsByRef) + MarshalHelper.ToNative(ref param1, param1Ptr); + if (param2Ptr != IntPtr.Zero && types[1].IsByRef) + MarshalHelper.ToNative(ref param2, param2Ptr); + if (param3Ptr != IntPtr.Zero && types[2].IsByRef) + MarshalHelper.ToNative(ref param3, param3Ptr); + if (param4Ptr != IntPtr.Zero && types[3].IsByRef) + MarshalHelper.ToNative(ref param4, param4Ptr); + + return MarshalReturnValue(ref ret); + } + + [DebuggerStepThrough] + internal static unsafe IntPtr InvokeThunk(object delegateContext, ManagedHandle instancePtr, IntPtr* paramPtrs) + { + ThunkInvokerDelegate deleg = Unsafe.As(delegateContext); + + T1 param1 = MarshalHelper.ToManagedUnbox(paramPtrs[0]); + T2 param2 = MarshalHelper.ToManagedUnbox(paramPtrs[1]); + T3 param3 = MarshalHelper.ToManagedUnbox(paramPtrs[2]); + T4 param4 = MarshalHelper.ToManagedUnbox(paramPtrs[3]); + + TRet ret = deleg(param1, param2, param3, param4); + + return MarshalReturnValueThunk(ref ret); + } + } +#endif + } + } +} + +#endif diff --git a/Source/Engine/Engine/NativeInterop.Managed.cs b/Source/Engine/Engine/NativeInterop.Managed.cs new file mode 100644 index 000000000..7eda1cdec --- /dev/null +++ b/Source/Engine/Engine/NativeInterop.Managed.cs @@ -0,0 +1,576 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#if USE_NETCORE +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; +using System.Threading; +using FlaxEngine.Assertions; + +#pragma warning disable 1591 + +namespace FlaxEngine.Interop +{ + /// + /// Wrapper for managed arrays which are passed to unmanaged code. + /// +#if FLAX_EDITOR + [HideInEditor] +#endif + public unsafe class ManagedArray + { + private ManagedHandle _managedHandle; + private IntPtr _unmanagedData; + private int _unmanagedAllocationSize; + private Type _arrayType; + private Type _elementType; + private int _elementSize; + private int _length; + + public static ManagedArray WrapNewArray(Array arr) => new ManagedArray(arr, arr.GetType()); + + public static ManagedArray WrapNewArray(Array arr, Type arrayType) => new ManagedArray(arr, arrayType); + + /// + /// Returns an instance of ManagedArray from shared pool. + /// + /// The resources must be released by calling FreePooled() instead of Free()-method. + public static ManagedArray WrapPooledArray(Array arr) + { + ManagedArray managedArray = ManagedArrayPool.Get(); + managedArray.WrapArray(arr, arr.GetType()); + return managedArray; + } + + /// + /// Returns an instance of ManagedArray from shared pool. + /// + /// The resources must be released by calling FreePooled() instead of Free()-method. + public static ManagedArray WrapPooledArray(Array arr, Type arrayType) + { + ManagedArray managedArray = ManagedArrayPool.Get(arr.Length * Marshal.SizeOf(arr.GetType().GetElementType())); + managedArray.WrapArray(arr, arrayType); + return managedArray; + } + + internal static ManagedArray AllocateNewArray(int length, Type arrayType, Type elementType) + => new ManagedArray((IntPtr)NativeInterop.NativeAlloc(length, Marshal.SizeOf(elementType)), length, arrayType, elementType); + + internal static ManagedArray AllocateNewArray(IntPtr ptr, int length, Type arrayType, Type elementType) + => new ManagedArray(ptr, length, arrayType, elementType); + + /// + /// Returns an instance of ManagedArray from shared pool. + /// + /// The resources must be released by calling FreePooled() instead of Free()-method. + public static ManagedArray AllocatePooledArray(int length) where T : unmanaged + { + ManagedArray managedArray = ManagedArrayPool.Get(length * Unsafe.SizeOf()); + managedArray.Allocate(length); + return managedArray; + } + + public ManagedArray(Array arr, Type elementType) => WrapArray(arr, elementType); + + internal void WrapArray(Array arr, Type arrayType) + { + if (_unmanagedData != IntPtr.Zero) + NativeInterop.NativeFree(_unmanagedData.ToPointer()); + if (_managedHandle.IsAllocated) + _managedHandle.Free(); + _managedHandle = ManagedHandle.Alloc(arr, GCHandleType.Pinned); + _unmanagedData = Marshal.UnsafeAddrOfPinnedArrayElement(arr, 0); + _unmanagedAllocationSize = 0; + _length = arr.Length; + _arrayType = arrayType; + _elementType = arr.GetType().GetElementType(); + _elementSize = Marshal.SizeOf(_elementType); + } + + internal void Allocate(int length) where T : unmanaged + { + // Try to reuse existing allocated buffer + if (length * Unsafe.SizeOf() > _unmanagedAllocationSize) + { + if (_unmanagedAllocationSize > 0) + NativeInterop.NativeFree(_unmanagedData.ToPointer()); + _unmanagedData = (IntPtr)NativeInterop.NativeAlloc(length, Unsafe.SizeOf()); + _unmanagedAllocationSize = Unsafe.SizeOf() * length; + } + _length = length; + _arrayType = typeof(T).MakeArrayType(); + _elementType = typeof(T); + _elementSize = Unsafe.SizeOf(); + } + + private ManagedArray() + { + } + + private ManagedArray(IntPtr ptr, int length, Type arrayType, Type elementType) + { + Assert.IsTrue(arrayType.IsArray); + _unmanagedData = ptr; + _unmanagedAllocationSize = Marshal.SizeOf(elementType) * length; + _length = length; + _arrayType = arrayType; + _elementType = elementType; + _elementSize = Marshal.SizeOf(elementType); + } + + ~ManagedArray() + { + if (_unmanagedData != IntPtr.Zero) + Free(); + } + + public void Free() + { + GC.SuppressFinalize(this); + if (_managedHandle.IsAllocated) + { + _managedHandle.Free(); + _unmanagedData = IntPtr.Zero; + } + if (_unmanagedData != IntPtr.Zero) + { + NativeInterop.NativeFree(_unmanagedData.ToPointer()); + _unmanagedData = IntPtr.Zero; + _unmanagedAllocationSize = 0; + } + } + + public void FreePooled() + { + if (_managedHandle.IsAllocated) + { + _managedHandle.Free(); + _unmanagedData = IntPtr.Zero; + } + ManagedArrayPool.Put(this); + } + + internal IntPtr Pointer => _unmanagedData; + + internal int Length => _length; + + internal int ElementSize => _elementSize; + + internal Type ElementType => _elementType; + + internal Type ArrayType => _arrayType; + + public Span ToSpan() where T : struct => new Span(_unmanagedData.ToPointer(), _length); + + public T[] ToArray() where T : struct => new Span(_unmanagedData.ToPointer(), _length).ToArray(); + + public Array ToArray() => ArrayCast.ToArray(new Span(_unmanagedData.ToPointer(), _length * _elementSize), _elementType); + + /// + /// Creates an Array of the specified type from span of bytes. + /// + private static class ArrayCast + { + delegate Array GetDelegate(Span span); + + [ThreadStatic] + private static Dictionary delegates; + + internal static Array ToArray(Span span, Type type) + { + if (delegates == null) + delegates = new(); + if (!delegates.TryGetValue(type, out var deleg)) + { + deleg = typeof(ArrayCastInternal<>).MakeGenericType(type).GetMethod(nameof(ArrayCastInternal.ToArray), BindingFlags.Static | BindingFlags.NonPublic).CreateDelegate(); + delegates.Add(type, deleg); + } + return deleg(span); + } + + private static class ArrayCastInternal where T : struct + { + internal static Array ToArray(Span span) + { + return MemoryMarshal.Cast(span).ToArray(); + } + } + } + + /// + /// Provides a pool of pre-allocated ManagedArray that can be re-used. + /// + private static class ManagedArrayPool + { + [ThreadStatic] + private static List<(bool inUse, ManagedArray array)> pool; + + /// + /// Borrows an array from the pool. + /// + /// Minimum size in bytes for the borrowed array. With value of 0, the returned array allocation is always zero. + /// The returned array size may be smaller than the requested minimumSize. + internal static ManagedArray Get(int minimumSize = 0) + { + if (pool == null) + pool = new(); + + int smallest = -1; + int smallestSize = int.MaxValue; + var poolSpan = CollectionsMarshal.AsSpan(pool); + for (int i = 0; i < poolSpan.Length; i++) + { + ref var tuple = ref poolSpan[i]; + if (tuple.inUse) + continue; + + // Try to get larger arrays than requested in order to avoid reallocations + if (minimumSize > 0) + { + if (tuple.array._unmanagedAllocationSize >= minimumSize && tuple.array._unmanagedAllocationSize < smallestSize) + smallest = i; + continue; + } + else if (minimumSize == 0 && tuple.Item2._unmanagedAllocationSize != 0) + continue; + + tuple.inUse = true; + return tuple.array; + } + if (minimumSize > 0 && smallest != -1) + { + ref var tuple = ref poolSpan[smallest]; + tuple.inUse = true; + return tuple.array; + } + + var newTuple = (inUse: true, array: new ManagedArray()); + pool.Add(newTuple); + return newTuple.array; + } + + /// + /// Returns the borrowed ManagedArray back to pool. + /// + /// The array borrowed from the pool + internal static void Put(ManagedArray obj) + { + foreach (ref var tuple in CollectionsMarshal.AsSpan(pool)) + { + if (tuple.array != obj) + continue; + + tuple.inUse = false; + return; + } + + throw new NativeInteropException("Tried to free non-pooled ManagedArray as pooled ManagedArray"); + } + } + } + +#if FLAX_EDITOR + [HideInEditor] +#endif + internal static class ManagedString + { + internal static ManagedHandle EmptyStringHandle = ManagedHandle.Alloc(string.Empty); + + [System.Diagnostics.DebuggerStepThrough] + internal static unsafe IntPtr ToNative(string str) + { + if (str == null) + return IntPtr.Zero; + else if (str == string.Empty) + return ManagedHandle.ToIntPtr(EmptyStringHandle); + Assert.IsTrue(str.Length > 0); + return ManagedHandle.ToIntPtr(str); + } + + [System.Diagnostics.DebuggerStepThrough] + internal static unsafe IntPtr ToNativeWeak(string str) + { + if (str == null) + return IntPtr.Zero; + else if (str == string.Empty) + return ManagedHandle.ToIntPtr(EmptyStringHandle); + Assert.IsTrue(str.Length > 0); + return ManagedHandle.ToIntPtr(str, GCHandleType.Weak); + } + + [System.Diagnostics.DebuggerStepThrough] + internal static string ToManaged(IntPtr ptr) + { + if (ptr == IntPtr.Zero) + return null; + return Unsafe.As(ManagedHandle.FromIntPtr(ptr).Target); + } + + [System.Diagnostics.DebuggerStepThrough] + internal static void Free(IntPtr ptr) + { + if (ptr == IntPtr.Zero) + return; + ManagedHandle handle = ManagedHandle.FromIntPtr(ptr); + if (handle == EmptyStringHandle) + return; + handle.Free(); + } + } + + /// + /// Handle to managed objects which can be stored in native code. + /// +#if FLAX_EDITOR + [HideInEditor] +#endif + public struct ManagedHandle + { + private IntPtr handle; + + private ManagedHandle(IntPtr handle) + { + this.handle = handle; + } + + private ManagedHandle(object value, GCHandleType type) + { + handle = ManagedHandlePool.AllocateHandle(value, type); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedHandle Alloc(object value) => new ManagedHandle(value, GCHandleType.Normal); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedHandle Alloc(object value, GCHandleType type) => new ManagedHandle(value, type); + + public void Free() + { + if (handle == IntPtr.Zero) + return; + + ManagedHandlePool.FreeHandle(handle); + handle = IntPtr.Zero; + } + + public object Target + { + get => ManagedHandlePool.GetObject(handle); + set => ManagedHandlePool.SetObject(handle, value); + } + + public bool IsAllocated => handle != IntPtr.Zero; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator ManagedHandle(IntPtr value) => FromIntPtr(value); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedHandle FromIntPtr(IntPtr value) => new ManagedHandle(value); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator IntPtr(ManagedHandle value) => ToIntPtr(value); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static IntPtr ToIntPtr(object value) => ManagedHandlePool.AllocateHandle(value, GCHandleType.Normal); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static IntPtr ToIntPtr(object value, GCHandleType type) => ManagedHandlePool.AllocateHandle(value, type); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static IntPtr ToIntPtr(ManagedHandle value) => value.handle; + + public override int GetHashCode() => handle.GetHashCode(); + + public override bool Equals(object o) => o is ManagedHandle other && Equals(other); + + public bool Equals(ManagedHandle other) => handle == other.handle; + + public static bool operator ==(ManagedHandle a, ManagedHandle b) => a.handle == b.handle; + + public static bool operator !=(ManagedHandle a, ManagedHandle b) => a.handle != b.handle; + + private static class ManagedHandlePool + { + private const int WeakPoolCollectionSizeThreshold = 10000000; + private const int WeakPoolCollectionTimeThreshold = 500; + + private static ulong normalHandleAccumulator = 0; + private static ulong pinnedHandleAccumulator = 0; + private static ulong weakHandleAccumulator = 0; + + private static object poolLock = new object(); + private static Dictionary persistentPool = new Dictionary(); + private static Dictionary pinnedPool = new Dictionary(); + + // Manage double-buffered pool for weak handles in order to avoid collecting in-flight handles + [ThreadStatic] private static Dictionary weakPool; + [ThreadStatic] private static Dictionary weakPoolOther; + [ThreadStatic] private static ulong nextWeakPoolCollection; + [ThreadStatic] private static int nextWeakPoolGCCollection; + [ThreadStatic] private static long lastWeakPoolCollectionTime; + + /// + /// Tries to free all references to old weak handles so GC can collect them. + /// + private static void TryCollectWeakHandles() + { + if (weakHandleAccumulator < nextWeakPoolCollection) + return; + + nextWeakPoolCollection = weakHandleAccumulator + 1000; + if (weakPool == null) + { + weakPool = new Dictionary(); + weakPoolOther = new Dictionary(); + nextWeakPoolGCCollection = GC.CollectionCount(0) + 1; + return; + } + // Try to swap pools after garbage collection or whenever the pool gets too large + var gc0CollectionCount = GC.CollectionCount(0); + if (gc0CollectionCount < nextWeakPoolGCCollection && weakPool.Count < WeakPoolCollectionSizeThreshold) + return; + nextWeakPoolGCCollection = gc0CollectionCount + 1; + + // Prevent huge allocations from swapping the pools in the middle of the operation + if (System.Diagnostics.Stopwatch.GetElapsedTime(lastWeakPoolCollectionTime).TotalMilliseconds < WeakPoolCollectionTimeThreshold) + return; + lastWeakPoolCollectionTime = System.Diagnostics.Stopwatch.GetTimestamp(); + + // Swap the pools and release the oldest pool for GC + (weakPool, weakPoolOther) = (weakPoolOther, weakPool); + weakPool.Clear(); + } + + private static IntPtr NewHandle(GCHandleType type) + { + IntPtr handle; + if (type == GCHandleType.Normal) + handle = (IntPtr)Interlocked.Increment(ref normalHandleAccumulator); + else if (type == GCHandleType.Pinned) + handle = (IntPtr)Interlocked.Increment(ref pinnedHandleAccumulator); + else //if (type == GCHandleType.Weak || type == GCHandleType.WeakTrackResurrection) + handle = (IntPtr)Interlocked.Increment(ref weakHandleAccumulator); + + // Two bits reserved for the type + handle |= (IntPtr)(((ulong)type << 62) & 0xC000000000000000); + return handle; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static GCHandleType GetHandleType(IntPtr handle) + { + return (GCHandleType)(((ulong)handle & 0xC000000000000000) >> 62); + } + + internal static IntPtr AllocateHandle(object value, GCHandleType type) + { + TryCollectWeakHandles(); + IntPtr handle = NewHandle(type); + if (type == GCHandleType.Normal) + { + lock (poolLock) + persistentPool.Add(handle, value); + } + else if (type == GCHandleType.Pinned) + { + lock (poolLock) + pinnedPool.Add(handle, GCHandle.Alloc(value, GCHandleType.Pinned)); + } + else if (type == GCHandleType.Weak || type == GCHandleType.WeakTrackResurrection) + weakPool.Add(handle, value); + + return handle; + } + + internal static object GetObject(IntPtr handle) + { + TryCollectWeakHandles(); + object value; + GCHandleType type = GetHandleType(handle); + if (type == GCHandleType.Normal) + { + lock (poolLock) + { + if (persistentPool.TryGetValue(handle, out value)) + return value; + } + } + else if (type == GCHandleType.Pinned) + { + lock (poolLock) + { + if (pinnedPool.TryGetValue(handle, out GCHandle gchandle)) + return gchandle.Target; + } + } + else if (weakPool.TryGetValue(handle, out value)) + return value; + else if (weakPoolOther.TryGetValue(handle, out value)) + return value; + + throw new NativeInteropException("Invalid ManagedHandle"); + } + + internal static void SetObject(IntPtr handle, object value) + { + TryCollectWeakHandles(); + GCHandleType type = GetHandleType(handle); + if (type == GCHandleType.Normal) + { + lock (poolLock) + { + if (persistentPool.ContainsKey(handle)) + persistentPool[handle] = value; + } + } + else if (type == GCHandleType.Pinned) + { + lock (poolLock) + { + if (pinnedPool.TryGetValue(handle, out GCHandle gchandle)) + gchandle.Target = value; + } + } + else if (weakPool.ContainsKey(handle)) + weakPool[handle] = value; + else if (weakPoolOther.ContainsKey(handle)) + weakPoolOther[handle] = value; + + throw new NativeInteropException("Invalid ManagedHandle"); + } + + internal static void FreeHandle(IntPtr handle) + { + TryCollectWeakHandles(); + GCHandleType type = GetHandleType(handle); + if (type == GCHandleType.Normal) + { + lock (poolLock) + { + if (persistentPool.Remove(handle)) + return; + } + } + else if (type == GCHandleType.Pinned) + { + lock (poolLock) + { + if (pinnedPool.Remove(handle, out GCHandle gchandle)) + { + gchandle.Free(); + return; + } + } + } + else + return; + + throw new NativeInteropException("Invalid ManagedHandle"); + } + } + } +} + +#endif diff --git a/Source/Engine/Engine/NativeInterop.Marshallers.cs b/Source/Engine/Engine/NativeInterop.Marshallers.cs new file mode 100644 index 000000000..a3531d11d --- /dev/null +++ b/Source/Engine/Engine/NativeInterop.Marshallers.cs @@ -0,0 +1,600 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#if USE_NETCORE +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.Marshalling; + +#pragma warning disable 1591 + +namespace FlaxEngine.Interop +{ +#if FLAX_EDITOR + [HideInEditor] +#endif + [CustomMarshaller(typeof(object), MarshalMode.ManagedToUnmanagedIn, typeof(ManagedHandleMarshaller.ManagedToNative))] + [CustomMarshaller(typeof(object), MarshalMode.UnmanagedToManagedOut, typeof(ManagedHandleMarshaller.ManagedToNative))] + [CustomMarshaller(typeof(object), MarshalMode.ElementIn, typeof(ManagedHandleMarshaller.ManagedToNative))] + [CustomMarshaller(typeof(object), MarshalMode.ManagedToUnmanagedOut, typeof(ManagedHandleMarshaller.NativeToManaged))] + [CustomMarshaller(typeof(object), MarshalMode.UnmanagedToManagedIn, typeof(ManagedHandleMarshaller.NativeToManaged))] + [CustomMarshaller(typeof(object), MarshalMode.ElementOut, typeof(ManagedHandleMarshaller.NativeToManaged))] + [CustomMarshaller(typeof(object), MarshalMode.ManagedToUnmanagedRef, typeof(ManagedHandleMarshaller.Bidirectional))] + [CustomMarshaller(typeof(object), MarshalMode.UnmanagedToManagedRef, typeof(ManagedHandleMarshaller.Bidirectional))] + [CustomMarshaller(typeof(object), MarshalMode.ElementRef, typeof(ManagedHandleMarshaller))] + public static class ManagedHandleMarshaller + { +#if FLAX_EDITOR + [HideInEditor] +#endif + public static class NativeToManaged + { + public static object ConvertToManaged(IntPtr unmanaged) => unmanaged == IntPtr.Zero ? null : ManagedHandle.FromIntPtr(unmanaged).Target; + + public static void Free(IntPtr unmanaged) + { + // This is a permanent handle, do not release it + } + } + +#if FLAX_EDITOR + [HideInEditor] +#endif + public static class ManagedToNative + { + public static IntPtr ConvertToUnmanaged(object managed) => managed != null ? ManagedHandle.ToIntPtr(managed, GCHandleType.Weak) : IntPtr.Zero; + + public static void Free(IntPtr unmanaged) + { + // This is a weak handle, no need to free it + /* + if (unmanaged == IntPtr.Zero) + return; + ManagedHandle.FromIntPtr(unmanaged).Free(); + */ + } + } + +#if FLAX_EDITOR + [HideInEditor] +#endif + public struct Bidirectional + { + object managed; + IntPtr unmanaged; + + public void FromManaged(object managed) + { + this.managed = managed; + } + + public IntPtr ToUnmanaged() + { + unmanaged = ManagedHandleMarshaller.ToNative(managed); + return unmanaged; + } + + public void FromUnmanaged(IntPtr unmanaged) + { + this.unmanaged = unmanaged; + } + + public object ToManaged() + { + managed = ManagedHandleMarshaller.ToManaged(unmanaged); + unmanaged = IntPtr.Zero; + return managed; + } + + public void Free() + { + // FIXME, might be a permanent handle or a temporary one + throw new NotImplementedException(); + /*if (unmanaged == IntPtr.Zero) + return; + unmanaged.Free();*/ + } + } + + public static object ConvertToManaged(IntPtr unmanaged) => ToManaged(unmanaged); + public static IntPtr ConvertToUnmanaged(object managed) => ToNative(managed); + public static object ToManaged(IntPtr managed) => managed != IntPtr.Zero ? ManagedHandle.FromIntPtr(managed).Target : null; + public static IntPtr ToNative(object managed) => managed != null ? ManagedHandle.ToIntPtr(managed) : IntPtr.Zero; + + public static void Free(IntPtr unmanaged) + { + if (unmanaged == IntPtr.Zero) + return; + ManagedHandle.FromIntPtr(unmanaged).Free(); + } + } + +#if FLAX_EDITOR + [HideInEditor] +#endif + [CustomMarshaller(typeof(Type), MarshalMode.Default, typeof(SystemTypeMarshaller))] + public static class SystemTypeMarshaller + { + public static Type ConvertToManaged(IntPtr unmanaged) => Unsafe.As(ManagedHandleMarshaller.ConvertToManaged(unmanaged)); + + public static IntPtr ConvertToUnmanaged(Type managed) + { + if (managed == null) + return IntPtr.Zero; + ManagedHandle handle = NativeInterop.GetTypeGCHandle(managed); + return ManagedHandle.ToIntPtr(handle); + } + + public static void Free(IntPtr unmanaged) + { + // Cached handle, do not release + } + } + +#if FLAX_EDITOR + [HideInEditor] +#endif + [CustomMarshaller(typeof(Exception), MarshalMode.Default, typeof(ExceptionMarshaller))] + public static class ExceptionMarshaller + { + public static Exception ConvertToManaged(IntPtr unmanaged) => Unsafe.As(ManagedHandleMarshaller.ConvertToManaged(unmanaged)); + public static IntPtr ConvertToUnmanaged(Exception managed) => ManagedHandleMarshaller.ConvertToUnmanaged(managed); + public static void Free(IntPtr unmanaged) => ManagedHandleMarshaller.Free(unmanaged); + } + +#if FLAX_EDITOR + [HideInEditor] +#endif + [CustomMarshaller(typeof(FlaxEngine.Object), MarshalMode.ManagedToUnmanagedIn, typeof(ObjectMarshaller.ManagedToNative))] + [CustomMarshaller(typeof(FlaxEngine.Object), MarshalMode.UnmanagedToManagedOut, typeof(ObjectMarshaller.ManagedToNative))] + [CustomMarshaller(typeof(FlaxEngine.Object), MarshalMode.ElementIn, typeof(ObjectMarshaller.ManagedToNative))] + [CustomMarshaller(typeof(FlaxEngine.Object), MarshalMode.ManagedToUnmanagedOut, typeof(ObjectMarshaller.NativeToManaged))] + [CustomMarshaller(typeof(FlaxEngine.Object), MarshalMode.UnmanagedToManagedIn, typeof(ObjectMarshaller.NativeToManaged))] + [CustomMarshaller(typeof(FlaxEngine.Object), MarshalMode.ElementOut, typeof(ObjectMarshaller.NativeToManaged))] + public static class ObjectMarshaller + { +#if FLAX_EDITOR + [HideInEditor] +#endif + public static class NativeToManaged + { + public static FlaxEngine.Object ConvertToManaged(IntPtr unmanaged) => unmanaged != IntPtr.Zero ? Unsafe.As(ManagedHandle.FromIntPtr(unmanaged).Target) : null; + } + +#if FLAX_EDITOR + [HideInEditor] +#endif + public static class ManagedToNative + { + public static IntPtr ConvertToUnmanaged(FlaxEngine.Object managed) => Unsafe.As(managed) != null ? ManagedHandle.ToIntPtr(managed) : IntPtr.Zero; + } + } + +#if FLAX_EDITOR + [HideInEditor] +#endif + [CustomMarshaller(typeof(CultureInfo), MarshalMode.Default, typeof(CultureInfoMarshaller))] + public static class CultureInfoMarshaller + { + public static CultureInfo ConvertToManaged(IntPtr unmanaged) => Unsafe.As(ManagedHandleMarshaller.ConvertToManaged(unmanaged)); + public static IntPtr ConvertToUnmanaged(CultureInfo managed) => ManagedHandleMarshaller.ConvertToUnmanaged(managed); + public static void Free(IntPtr unmanaged) => ManagedHandleMarshaller.Free(unmanaged); + } + + [CustomMarshaller(typeof(Array), MarshalMode.ManagedToUnmanagedIn, typeof(SystemArrayMarshaller.ManagedToNative))] + [CustomMarshaller(typeof(Array), MarshalMode.UnmanagedToManagedOut, typeof(SystemArrayMarshaller.ManagedToNative))] + [CustomMarshaller(typeof(Array), MarshalMode.ManagedToUnmanagedOut, typeof(SystemArrayMarshaller.NativeToManaged))] + [CustomMarshaller(typeof(Array), MarshalMode.UnmanagedToManagedIn, typeof(SystemArrayMarshaller.NativeToManaged))] + public static unsafe class SystemArrayMarshaller + { +#if FLAX_EDITOR + [HideInEditor] +#endif + public struct ManagedToNative + { + ManagedArray managedArray; + ManagedHandle handle; + + public void FromManaged(Array managed) + { + if (managed != null) + managedArray = ManagedArray.WrapPooledArray(managed); + } + + public IntPtr ToUnmanaged() + { + if (managedArray == null) + return IntPtr.Zero; + handle = ManagedHandle.Alloc(managedArray, GCHandleType.Weak); + return ManagedHandle.ToIntPtr(handle); + } + + public void Free() + { + if (managedArray == null) + return; + managedArray.FreePooled(); + //handle.Free(); // No need to free weak handles + } + } + +#if FLAX_EDITOR + [HideInEditor] +#endif + public struct NativeToManaged + { + ManagedHandle handle; + ManagedArray managedArray; + + public void FromUnmanaged(IntPtr unmanaged) + { + if (unmanaged == IntPtr.Zero) + return; + handle = ManagedHandle.FromIntPtr(unmanaged); + } + + public Array ToManaged() + { + if (!handle.IsAllocated) + return null; + managedArray = Unsafe.As(handle.Target); + return managedArray.ToArray(); + } + + public void Free() + { + if (!handle.IsAllocated) + return; + managedArray.Free(); + handle.Free(); + } + } + } + +#if FLAX_EDITOR + [HideInEditor] +#endif + [CustomMarshaller(typeof(Dictionary<,>), MarshalMode.ManagedToUnmanagedIn, typeof(DictionaryMarshaller<,>.ManagedToNative))] + [CustomMarshaller(typeof(Dictionary<,>), MarshalMode.UnmanagedToManagedOut, typeof(DictionaryMarshaller<,>.ManagedToNative))] + [CustomMarshaller(typeof(Dictionary<,>), MarshalMode.ElementIn, typeof(DictionaryMarshaller<,>.ManagedToNative))] + [CustomMarshaller(typeof(Dictionary<,>), MarshalMode.ManagedToUnmanagedOut, typeof(DictionaryMarshaller<,>.NativeToManaged))] + [CustomMarshaller(typeof(Dictionary<,>), MarshalMode.UnmanagedToManagedIn, typeof(DictionaryMarshaller<,>.NativeToManaged))] + [CustomMarshaller(typeof(Dictionary<,>), MarshalMode.ElementOut, typeof(DictionaryMarshaller<,>.NativeToManaged))] + [CustomMarshaller(typeof(Dictionary<,>), MarshalMode.ManagedToUnmanagedRef, typeof(DictionaryMarshaller<,>.Bidirectional))] + [CustomMarshaller(typeof(Dictionary<,>), MarshalMode.UnmanagedToManagedRef, typeof(DictionaryMarshaller<,>.Bidirectional))] + [CustomMarshaller(typeof(Dictionary<,>), MarshalMode.ElementRef, typeof(DictionaryMarshaller<,>))] + public static unsafe class DictionaryMarshaller + { +#if FLAX_EDITOR + [HideInEditor] +#endif + public static class NativeToManaged + { + public static Dictionary ConvertToManaged(IntPtr unmanaged) => DictionaryMarshaller.ToManaged(unmanaged); + public static void Free(IntPtr unmanaged) => DictionaryMarshaller.Free(unmanaged); + } + +#if FLAX_EDITOR + [HideInEditor] +#endif + public static class ManagedToNative + { + public static IntPtr ConvertToUnmanaged(Dictionary managed) => DictionaryMarshaller.ToNative(managed, GCHandleType.Weak); + + public static void Free(IntPtr unmanaged) + { + //DictionaryMarshaller.Free(unmanaged); // No need to free weak handles + } + } + +#if FLAX_EDITOR + [HideInEditor] +#endif + public struct Bidirectional + { + Dictionary managed; + IntPtr unmanaged; + + public void FromManaged(Dictionary managed) => this.managed = managed; + + public IntPtr ToUnmanaged() + { + unmanaged = DictionaryMarshaller.ToNative(managed); + return unmanaged; + } + + public void FromUnmanaged(IntPtr unmanaged) => this.unmanaged = unmanaged; + + public Dictionary ToManaged() + { + managed = DictionaryMarshaller.ToManaged(unmanaged); + unmanaged = IntPtr.Zero; + return managed; + } + + public void Free() => DictionaryMarshaller.Free(unmanaged); + } + + public static Dictionary ConvertToManaged(IntPtr unmanaged) => unmanaged != IntPtr.Zero ? Unsafe.As>(ManagedHandle.FromIntPtr(unmanaged).Target) : null; + public static IntPtr ConvertToUnmanaged(Dictionary managed) => managed != null ? ManagedHandle.ToIntPtr(managed) : IntPtr.Zero; + + public static Dictionary ToManaged(IntPtr unmanaged) => unmanaged != IntPtr.Zero ? Unsafe.As>(ManagedHandle.FromIntPtr(unmanaged).Target) : null; + public static IntPtr ToNative(Dictionary managed, GCHandleType handleType = GCHandleType.Normal) => managed != null ? ManagedHandle.ToIntPtr(managed, handleType) : IntPtr.Zero; + + public static void Free(IntPtr unmanaged) + { + if (unmanaged != IntPtr.Zero) + ManagedHandle.FromIntPtr(unmanaged).Free(); + } + } + +#if FLAX_EDITOR + [HideInEditor] +#endif + [CustomMarshaller(typeof(CustomMarshallerAttribute.GenericPlaceholder[]), MarshalMode.ManagedToUnmanagedIn, typeof(ArrayMarshaller<,>.ManagedToNative))] + [CustomMarshaller(typeof(CustomMarshallerAttribute.GenericPlaceholder[]), MarshalMode.UnmanagedToManagedOut, typeof(ArrayMarshaller<,>.ManagedToNative))] + [CustomMarshaller(typeof(CustomMarshallerAttribute.GenericPlaceholder[]), MarshalMode.ElementIn, typeof(ArrayMarshaller<,>.ManagedToNative))] + [CustomMarshaller(typeof(CustomMarshallerAttribute.GenericPlaceholder[]), MarshalMode.ManagedToUnmanagedOut, typeof(ArrayMarshaller<,>.NativeToManaged))] + [CustomMarshaller(typeof(CustomMarshallerAttribute.GenericPlaceholder[]), MarshalMode.UnmanagedToManagedIn, typeof(ArrayMarshaller<,>.NativeToManaged))] + [CustomMarshaller(typeof(CustomMarshallerAttribute.GenericPlaceholder[]), MarshalMode.ElementOut, typeof(ArrayMarshaller<,>.NativeToManaged))] + [CustomMarshaller(typeof(CustomMarshallerAttribute.GenericPlaceholder[]), MarshalMode.ManagedToUnmanagedRef, typeof(ArrayMarshaller<,>.Bidirectional))] + [CustomMarshaller(typeof(CustomMarshallerAttribute.GenericPlaceholder[]), MarshalMode.UnmanagedToManagedRef, typeof(ArrayMarshaller<,>.Bidirectional))] + [CustomMarshaller(typeof(CustomMarshallerAttribute.GenericPlaceholder[]), MarshalMode.ElementRef, typeof(ArrayMarshaller<,>))] + [ContiguousCollectionMarshaller] + public static unsafe class ArrayMarshaller where TUnmanagedElement : unmanaged + { +#if FLAX_EDITOR + [HideInEditor] +#endif + public static class NativeToManaged + { + public static T[]? AllocateContainerForManagedElements(TUnmanagedElement* unmanaged, int numElements) + { + if (unmanaged is null) + return null; + return new T[numElements]; + } + + public static Span GetManagedValuesDestination(T[]? managed) => managed; + + public static ReadOnlySpan GetUnmanagedValuesSource(TUnmanagedElement* unmanaged, int numElements) + { + if (unmanaged == null) + return ReadOnlySpan.Empty; + ManagedArray managedArray = Unsafe.As(ManagedHandle.FromIntPtr(new IntPtr(unmanaged)).Target); + return managedArray.ToSpan(); + } + + public static void Free(TUnmanagedElement* unmanaged) + { + if (unmanaged == null) + return; + ManagedHandle handle = ManagedHandle.FromIntPtr(new IntPtr(unmanaged)); + (Unsafe.As(handle.Target)).Free(); + handle.Free(); + } + + public static Span GetUnmanagedValuesDestination(TUnmanagedElement* unmanaged, int numElements) + { + if (unmanaged == null) + return Span.Empty; + ManagedArray managedArray = Unsafe.As(ManagedHandle.FromIntPtr(new IntPtr(unmanaged)).Target); + return managedArray.ToSpan(); + } + } + +#if FLAX_EDITOR + [HideInEditor] +#endif + public static class ManagedToNative + { + public static TUnmanagedElement* AllocateContainerForUnmanagedElements(T[]? managed, out int numElements) + { + if (managed is null) + { + numElements = 0; + return null; + } + numElements = managed.Length; + ManagedArray managedArray = ManagedArray.AllocatePooledArray(managed.Length); + return (TUnmanagedElement*)ManagedHandle.ToIntPtr(managedArray, GCHandleType.Weak); + } + + public static ReadOnlySpan GetManagedValuesSource(T[]? managed) => managed; + + public static Span GetUnmanagedValuesDestination(TUnmanagedElement* unmanaged, int numElements) + { + if (unmanaged == null) + return Span.Empty; + ManagedArray managedArray = Unsafe.As(ManagedHandle.FromIntPtr(new IntPtr(unmanaged)).Target); + return managedArray.ToSpan(); + } + + public static void Free(TUnmanagedElement* unmanaged) + { + if (unmanaged == null) + return; + ManagedHandle handle = ManagedHandle.FromIntPtr(new IntPtr(unmanaged)); + (Unsafe.As(handle.Target)).FreePooled(); + //handle.Free(); // No need to free weak handles + } + } + +#if FLAX_EDITOR + [HideInEditor] +#endif + public struct Bidirectional + { + T[] managedArray; + ManagedArray unmanagedArray; + ManagedHandle handle; + + public void FromManaged(T[]? managed) + { + if (managed == null) + return; + managedArray = managed; + unmanagedArray = ManagedArray.AllocatePooledArray(managed.Length); + handle = ManagedHandle.Alloc(unmanagedArray); + } + + public ReadOnlySpan GetManagedValuesSource() => managedArray; + + public Span GetUnmanagedValuesDestination() + { + if (unmanagedArray == null) + return Span.Empty; + return unmanagedArray.ToSpan(); + } + + public TUnmanagedElement* ToUnmanaged() => (TUnmanagedElement*)ManagedHandle.ToIntPtr(handle); + + public void FromUnmanaged(TUnmanagedElement* unmanaged) + { + ManagedArray arr = Unsafe.As(ManagedHandle.FromIntPtr(new IntPtr(unmanaged)).Target); + if (managedArray == null || managedArray.Length != arr.Length) + managedArray = new T[arr.Length]; + } + + public ReadOnlySpan GetUnmanagedValuesSource(int numElements) + { + if (unmanagedArray == null) + return ReadOnlySpan.Empty; + return unmanagedArray.ToSpan(); + } + + public Span GetManagedValuesDestination(int numElements) => managedArray; + + public T[] ToManaged() => managedArray; + + public void Free() + { + unmanagedArray.FreePooled(); + handle.Free(); + } + } + + public static TUnmanagedElement* AllocateContainerForUnmanagedElements(T[]? managed, out int numElements) + { + if (managed is null) + { + numElements = 0; + return null; + } + numElements = managed.Length; + ManagedArray managedArray = ManagedArray.AllocatePooledArray(managed.Length); + IntPtr handle = ManagedHandle.ToIntPtr(managedArray); + return (TUnmanagedElement*)handle; + } + + public static ReadOnlySpan GetManagedValuesSource(T[]? managed) => managed; + + public static Span GetUnmanagedValuesDestination(TUnmanagedElement* unmanaged, int numElements) + { + if (unmanaged == null) + return Span.Empty; + ManagedArray unmanagedArray = Unsafe.As(ManagedHandle.FromIntPtr(new IntPtr(unmanaged)).Target); + return unmanagedArray.ToSpan(); + } + + public static T[]? AllocateContainerForManagedElements(TUnmanagedElement* unmanaged, int numElements) => unmanaged is null ? null : new T[numElements]; + + public static Span GetManagedValuesDestination(T[]? managed) => managed; + + public static ReadOnlySpan GetUnmanagedValuesSource(TUnmanagedElement* unmanaged, int numElements) + { + if (unmanaged == null) + return ReadOnlySpan.Empty; + ManagedArray array = Unsafe.As(ManagedHandle.FromIntPtr(new IntPtr(unmanaged)).Target); + return array.ToSpan(); + } + + public static void Free(TUnmanagedElement* unmanaged) + { + if (unmanaged == null) + return; + ManagedHandle handle = ManagedHandle.FromIntPtr(new IntPtr(unmanaged)); + Unsafe.As(handle.Target).FreePooled(); + handle.Free(); + } + } + +#if FLAX_EDITOR + [HideInEditor] +#endif + [CustomMarshaller(typeof(string), MarshalMode.ManagedToUnmanagedIn, typeof(StringMarshaller.ManagedToNative))] + [CustomMarshaller(typeof(string), MarshalMode.UnmanagedToManagedOut, typeof(StringMarshaller.ManagedToNative))] + [CustomMarshaller(typeof(string), MarshalMode.ElementIn, typeof(StringMarshaller.ManagedToNative))] + [CustomMarshaller(typeof(string), MarshalMode.ManagedToUnmanagedOut, typeof(StringMarshaller.NativeToManaged))] + [CustomMarshaller(typeof(string), MarshalMode.UnmanagedToManagedIn, typeof(StringMarshaller.NativeToManaged))] + [CustomMarshaller(typeof(string), MarshalMode.ElementOut, typeof(StringMarshaller.NativeToManaged))] + [CustomMarshaller(typeof(string), MarshalMode.ManagedToUnmanagedRef, typeof(StringMarshaller.Bidirectional))] + [CustomMarshaller(typeof(string), MarshalMode.UnmanagedToManagedRef, typeof(StringMarshaller.Bidirectional))] + [CustomMarshaller(typeof(string), MarshalMode.ElementRef, typeof(StringMarshaller))] + public static class StringMarshaller + { +#if FLAX_EDITOR + [HideInEditor] +#endif + public static class NativeToManaged + { + public static string ConvertToManaged(IntPtr unmanaged) => ManagedString.ToManaged(unmanaged); + public static void Free(IntPtr unmanaged) => ManagedString.Free(unmanaged); + } + +#if FLAX_EDITOR + [HideInEditor] +#endif + public static class ManagedToNative + { + public static unsafe IntPtr ConvertToUnmanaged(string managed) + { + return managed == null ? IntPtr.Zero : ManagedHandle.ToIntPtr(managed, GCHandleType.Weak); + } + + public static void Free(IntPtr unmanaged) + { + //ManagedString.Free(unmanaged); // No need to free weak handles + } + } + +#if FLAX_EDITOR + [HideInEditor] +#endif + public struct Bidirectional + { + string managed; + IntPtr unmanaged; + + public void FromManaged(string managed) => this.managed = managed; + + public IntPtr ToUnmanaged() + { + unmanaged = ManagedString.ToNative(managed); + return unmanaged; + } + + public void FromUnmanaged(IntPtr unmanaged) => this.unmanaged = unmanaged; + + public string ToManaged() + { + managed = ManagedString.ToManaged(unmanaged); + unmanaged = IntPtr.Zero; + return managed; + } + + public void Free() => ManagedString.Free(unmanaged); + } + + public static string ConvertToManaged(IntPtr unmanaged) => ManagedString.ToManaged(unmanaged); + public static IntPtr ConvertToUnmanaged(string managed) => ManagedString.ToNative(managed); + public static void Free(IntPtr unmanaged) => ManagedString.Free(unmanaged); + + public static string ToManaged(IntPtr unmanaged) => ManagedString.ToManaged(unmanaged); + public static IntPtr ToNative(string managed) => ManagedString.ToNative(managed); + } +} + +#endif diff --git a/Source/Engine/Engine/NativeInterop.Unmanaged.cs b/Source/Engine/Engine/NativeInterop.Unmanaged.cs new file mode 100644 index 000000000..c079a14e1 --- /dev/null +++ b/Source/Engine/Engine/NativeInterop.Unmanaged.cs @@ -0,0 +1,1167 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#if USE_NETCORE +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.Loader; +using FlaxEngine.Utilities; + +#pragma warning disable 1591 + +namespace FlaxEngine.Interop +{ + [StructLayout(LayoutKind.Sequential)] + internal struct NativeClassDefinitions + { + internal ManagedHandle typeHandle; + internal IntPtr name; + internal IntPtr fullname; + internal IntPtr @namespace; + internal uint typeAttributes; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct NativeMethodDefinitions + { + internal IntPtr name; + internal int numParameters; + internal ManagedHandle typeHandle; + internal uint methodAttributes; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct NativeFieldDefinitions + { + internal IntPtr name; + internal ManagedHandle fieldHandle; + internal ManagedHandle fieldTypeHandle; + internal uint fieldAttributes; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct NativePropertyDefinitions + { + internal IntPtr name; + internal ManagedHandle getterHandle; + internal ManagedHandle setterHandle; + internal uint getterAttributes; + internal uint setterAttributes; + } + + [StructLayout(LayoutKind.Explicit)] + public struct NativeVariant + { + [StructLayout(LayoutKind.Sequential)] + internal struct NativeVariantType + { + internal VariantUtils.VariantType types; + internal IntPtr TypeName; // char* + } + + [FieldOffset(0)] + NativeVariantType Type; + + [FieldOffset(8)] + byte AsBool; + + [FieldOffset(8)] + short AsInt16; + + [FieldOffset(8)] + ushort AsUint16; + + [FieldOffset(8)] + int AsInt; + + [FieldOffset(8)] + uint AsUint; + + [FieldOffset(8)] + long AsInt64; + + [FieldOffset(8)] + ulong AsUint64; + + [FieldOffset(8)] + float AsFloat; + + [FieldOffset(8)] + double AsDouble; + + [FieldOffset(8)] + IntPtr AsPointer; + + [FieldOffset(8)] + int AsData0; + + [FieldOffset(12)] + int AsData1; + + [FieldOffset(16)] + int AsData2; + + [FieldOffset(20)] + int AsData3; + + [FieldOffset(24)] + int AsData4; + + [FieldOffset(28)] + int AsData5; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct NativeVersion + { + internal int _Major; + internal int _Minor; + internal int _Build; + internal int _Revision; + + internal NativeVersion(Version ver) + { + _Major = ver.Major; + _Minor = ver.Minor; + _Build = ver.Build; + _Revision = ver.Revision; + } + + internal Version GetVersion() + { + return new Version(_Major, _Minor, _Build, _Revision); + } + } + + unsafe partial class NativeInterop + { + internal enum MTypes : uint + { + End = 0x00, + Void = 0x01, + Boolean = 0x02, + Char = 0x03, + I1 = 0x04, + U1 = 0x05, + I2 = 0x06, + U2 = 0x07, + I4 = 0x08, + U4 = 0x09, + I8 = 0x0a, + U8 = 0x0b, + R4 = 0x0c, + R8 = 0x0d, + String = 0x0e, + Ptr = 0x0f, + ByRef = 0x10, + ValueType = 0x11, + Class = 0x12, + Var = 0x13, + Array = 0x14, + GenericInst = 0x15, + TypeByRef = 0x16, + I = 0x18, + U = 0x19, + Fnptr = 0x1b, + Object = 0x1c, + SzArray = 0x1d, + MVar = 0x1e, + CmodReqd = 0x1f, + CmodOpt = 0x20, + Internal = 0x21, + Modifier = 0x40, + Sentinel = 0x41, + Pinned = 0x45, + Enum = 0x55, + }; + + [UnmanagedCallersOnly] + internal static void RegisterNativeLibrary(IntPtr moduleNamePtr, IntPtr modulePathPtr) + { + string moduleName = Marshal.PtrToStringAnsi(moduleNamePtr); + string modulePath = Marshal.PtrToStringAnsi(modulePathPtr); + nativeLibraryPaths[moduleName] = modulePath; + } + + [UnmanagedCallersOnly] + internal static void* AllocMemory(int size, bool coTaskMem) + { + if (coTaskMem) + return Marshal.AllocCoTaskMem(size).ToPointer(); + else + return NativeMemory.AlignedAlloc((UIntPtr)size, 16); + } + + [UnmanagedCallersOnly] + internal static void FreeMemory(void* ptr, bool coTaskMem) + { + if (coTaskMem) + Marshal.FreeCoTaskMem(new IntPtr(ptr)); + else + NativeMemory.AlignedFree(ptr); + } + + [UnmanagedCallersOnly] + internal static void GetManagedClasses(ManagedHandle assemblyHandle, NativeClassDefinitions** managedClasses, int* managedClassCount) + { + Assembly assembly = Unsafe.As(assemblyHandle.Target); + var assemblyTypes = GetAssemblyTypes(assembly); + + NativeClassDefinitions* arr = (NativeClassDefinitions*)NativeAlloc(assemblyTypes.Length, Unsafe.SizeOf()); + + for (int i = 0; i < assemblyTypes.Length; i++) + { + var type = assemblyTypes[i]; + IntPtr ptr = IntPtr.Add(new IntPtr(arr), Unsafe.SizeOf() * i); + var managedClass = new NativeClassDefinitions + { + typeHandle = GetTypeGCHandle(type), + name = NativeAllocStringAnsi(type.Name), + fullname = NativeAllocStringAnsi(type.GetTypeName()), + @namespace = NativeAllocStringAnsi(type.Namespace ?? ""), + typeAttributes = (uint)type.Attributes, + }; + Unsafe.Write(ptr.ToPointer(), managedClass); + } + + *managedClasses = arr; + *managedClassCount = assemblyTypes.Length; + } + + [UnmanagedCallersOnly] + internal static void GetManagedClassFromType(ManagedHandle typeHandle, NativeClassDefinitions* managedClass, ManagedHandle* assemblyHandle) + { + Type type = Unsafe.As(typeHandle.Target); + *managedClass = new NativeClassDefinitions + { + typeHandle = GetTypeGCHandle(type), + name = NativeAllocStringAnsi(type.Name), + fullname = NativeAllocStringAnsi(type.GetTypeName()), + @namespace = NativeAllocStringAnsi(type.Namespace ?? ""), + typeAttributes = (uint)type.Attributes, + }; + *assemblyHandle = GetAssemblyHandle(type.Assembly); + } + + [UnmanagedCallersOnly] + internal static void GetClassMethods(ManagedHandle typeHandle, NativeMethodDefinitions** classMethods, int* classMethodsCount) + { + Type type = Unsafe.As(typeHandle.Target); + + var methods = new List(); + var staticMethods = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly); + var instanceMethods = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly); + methods.AddRange(staticMethods); + methods.AddRange(instanceMethods); + + var arr = (NativeMethodDefinitions*)NativeAlloc(methods.Count, Unsafe.SizeOf()); + for (int i = 0; i < methods.Count; i++) + { + IntPtr ptr = IntPtr.Add(new IntPtr(arr), Unsafe.SizeOf() * i); + var classMethod = new NativeMethodDefinitions + { + name = NativeAllocStringAnsi(methods[i].Name), + numParameters = methods[i].GetParameters().Length, + methodAttributes = (uint)methods[i].Attributes, + }; + classMethod.typeHandle = GetMethodGCHandle(methods[i]); + Unsafe.Write(ptr.ToPointer(), classMethod); + } + *classMethods = arr; + *classMethodsCount = methods.Count; + } + + [UnmanagedCallersOnly] + internal static void GetClassFields(ManagedHandle typeHandle, NativeFieldDefinitions** classFields, int* classFieldsCount) + { + Type type = Unsafe.As(typeHandle.Target); + var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + + NativeFieldDefinitions* arr = (NativeFieldDefinitions*)NativeAlloc(fields.Length, Unsafe.SizeOf()); + for (int i = 0; i < fields.Length; i++) + { + FieldHolder fieldHolder = new FieldHolder(fields[i], type); + + ManagedHandle fieldHandle = ManagedHandle.Alloc(fieldHolder); +#if FLAX_EDITOR + if (type.IsCollectible) + fieldHandleCacheCollectible.Add(fieldHandle); + else +#endif + { + fieldHandleCache.Add(fieldHandle); + } + + NativeFieldDefinitions classField = new NativeFieldDefinitions() + { + name = NativeAllocStringAnsi(fieldHolder.field.Name), + fieldHandle = fieldHandle, + fieldTypeHandle = GetTypeGCHandle(fieldHolder.field.FieldType), + fieldAttributes = (uint)fieldHolder.field.Attributes, + }; + Unsafe.Write(IntPtr.Add(new IntPtr(arr), Unsafe.SizeOf() * i).ToPointer(), classField); + } + *classFields = arr; + *classFieldsCount = fields.Length; + } + + [UnmanagedCallersOnly] + internal static void GetClassProperties(ManagedHandle typeHandle, NativePropertyDefinitions** classProperties, int* classPropertiesCount) + { + Type type = Unsafe.As(typeHandle.Target); + var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + + var arr = (NativePropertyDefinitions*)NativeAlloc(properties.Length, Unsafe.SizeOf()); + for (int i = 0; i < properties.Length; i++) + { + IntPtr ptr = IntPtr.Add(new IntPtr(arr), Unsafe.SizeOf() * i); + + var getterMethod = properties[i].GetGetMethod(true); + var setterMethod = properties[i].GetSetMethod(true); + + var classProperty = new NativePropertyDefinitions + { + name = NativeAllocStringAnsi(properties[i].Name), + }; + if (getterMethod != null) + { + classProperty.getterHandle = GetMethodGCHandle(getterMethod); + classProperty.getterAttributes = (uint)getterMethod.Attributes; + } + if (setterMethod != null) + { + classProperty.setterHandle = GetMethodGCHandle(setterMethod); + classProperty.setterAttributes = (uint)setterMethod.Attributes; + } + Unsafe.Write(ptr.ToPointer(), classProperty); + } + *classProperties = arr; + *classPropertiesCount = properties.Length; + } + + [UnmanagedCallersOnly] + internal static void GetClassAttributes(ManagedHandle typeHandle, ManagedHandle** classAttributes, int* classAttributesCount) + { + Type type = Unsafe.As(typeHandle.Target); + object[] attributeValues = type.GetCustomAttributes(false); + + ManagedHandle* arr = (ManagedHandle*)NativeAlloc(attributeValues.Length, Unsafe.SizeOf()); + for (int i = 0; i < attributeValues.Length; i++) + { + if (!classAttributesCacheCollectible.TryGetValue(attributeValues[i], out ManagedHandle attributeHandle)) + { + attributeHandle = ManagedHandle.Alloc(attributeValues[i]); + classAttributesCacheCollectible.Add(attributeValues[i], attributeHandle); + } + arr[i] = attributeHandle; + } + *classAttributes = arr; + *classAttributesCount = attributeValues.Length; + } + + [UnmanagedCallersOnly] + internal static ManagedHandle GetCustomAttribute(ManagedHandle typeHandle, ManagedHandle attributeHandle) + { + Type type = Unsafe.As(typeHandle.Target); + var attributes = type.GetCustomAttributes(false); + object attrib; + if (attributeHandle.IsAllocated) + { + // Check for certain attribute type + Type attributeType = Unsafe.As(attributeHandle.Target); + attrib = attributes.FirstOrDefault(x => x.GetType() == attributeType); + } + else + { + // Check if has any attribute + attrib = attributes.FirstOrDefault(); + } + if (attrib != null) + { + if (!classAttributesCacheCollectible.TryGetValue(attrib, out var handle)) + { + handle = ManagedHandle.Alloc(attrib); + classAttributesCacheCollectible.Add(attrib, handle); + } + return handle; + } + return new ManagedHandle(); + } + + [UnmanagedCallersOnly] + internal static void GetClassInterfaces(ManagedHandle typeHandle, IntPtr* classInterfaces, int* classInterfacesCount) + { + Type type = Unsafe.As(typeHandle.Target); + Type[] interfaces = type.GetInterfaces(); + + // Match mono_class_get_interfaces which doesn't return interfaces from base class + var baseTypeInterfaces = type.BaseType?.GetInterfaces(); + if (baseTypeInterfaces != null) + { + if (baseTypeInterfaces.Length == interfaces.Length) + { + // Both base and this type have the same amount of interfaces so assume that this one has none unique + interfaces = Array.Empty(); + } + else if (baseTypeInterfaces.Length != 0) + { + // Count unique interface types + int uniqueCount = interfaces.Length; + for (int i = 0; i < interfaces.Length; i++) + { + for (int j = 0; j < baseTypeInterfaces.Length; j++) + { + if (interfaces[i] == baseTypeInterfaces[j]) + { + uniqueCount--; + break; + } + } + } + + // Get only unique interface types + var unique = new Type[uniqueCount]; + uniqueCount = 0; + for (int i = 0; i < interfaces.Length; i++) + { + bool isUnique = true; + for (int j = 0; j < baseTypeInterfaces.Length; j++) + { + if (interfaces[i] == baseTypeInterfaces[j]) + { + isUnique = false; + break; + } + } + if (isUnique) + unique[uniqueCount++] = interfaces[i]; + } + interfaces = unique; + } + } + + IntPtr arr = (IntPtr)NativeAlloc(interfaces.Length, IntPtr.Size); + for (int i = 0; i < interfaces.Length; i++) + { + ManagedHandle handle = GetTypeGCHandle(interfaces[i]); + Unsafe.Write(IntPtr.Add(arr, IntPtr.Size * i).ToPointer(), handle); + } + *classInterfaces = arr; + *classInterfacesCount = interfaces.Length; + } + + [UnmanagedCallersOnly] + internal static ManagedHandle GetMethodReturnType(ManagedHandle methodHandle) + { + MethodHolder methodHolder = Unsafe.As(methodHandle.Target); + Type returnType = methodHolder.returnType; + return GetTypeGCHandle(returnType); + } + + [UnmanagedCallersOnly] + internal static void GetMethodParameterTypes(ManagedHandle methodHandle, IntPtr* typeHandles) + { + MethodHolder methodHolder = Unsafe.As(methodHandle.Target); + Type returnType = methodHolder.returnType; + IntPtr arr = (IntPtr)NativeAlloc(methodHolder.parameterTypes.Length, IntPtr.Size); + for (int i = 0; i < methodHolder.parameterTypes.Length; i++) + { + ManagedHandle typeHandle = GetTypeGCHandle(methodHolder.parameterTypes[i]); + Unsafe.Write(IntPtr.Add(new IntPtr(arr), IntPtr.Size * i).ToPointer(), typeHandle); + } + *typeHandles = arr; + } + + /// + /// Returns pointer to the string's internal structure, containing the buffer and length of the string. + /// + [UnmanagedCallersOnly] + internal static char* GetStringPointer(ManagedHandle stringHandle, int* len) + { + string str = Unsafe.As(stringHandle.Target); + *len = str.Length; + fixed (char* p = str) + return p; + } + + [UnmanagedCallersOnly] + internal static ManagedHandle NewObject(ManagedHandle typeHandle) + { + Type type = Unsafe.As(typeHandle.Target); + if (type.IsAbstract) + { + // Dotnet doesn't allow to instantiate abstract type thus allow to use generated mock class usage (eg. for Script or GPUResource) for generated abstract types + var abstractWrapper = type.GetNestedType("AbstractWrapper", BindingFlags.NonPublic); + if (abstractWrapper != null) + type = abstractWrapper; + } + object value = RuntimeHelpers.GetUninitializedObject(type); + return ManagedHandle.Alloc(value); + } + + [UnmanagedCallersOnly] + internal static ManagedHandle NewArray(ManagedHandle typeHandle, long size) + { + Type elementType = Unsafe.As(typeHandle.Target); + Type marshalledType = ArrayFactory.GetMarshalledType(elementType); + Type arrayType = elementType.MakeArrayType(); + if (marshalledType.IsValueType) + { + ManagedArray managedArray = ManagedArray.AllocateNewArray((int)size, arrayType, marshalledType); + return ManagedHandle.Alloc(managedArray); + } + else + { + Array arr = ArrayFactory.CreateArray(elementType, size); + ManagedArray managedArray = ManagedArray.WrapNewArray(arr, arrayType); + return ManagedHandle.Alloc(managedArray); + } + } + + [UnmanagedCallersOnly] + internal static ManagedHandle GetArrayTypeFromElementType(ManagedHandle elementTypeHandle) + { + Type elementType = Unsafe.As(elementTypeHandle.Target); + Type classType = elementType.MakeArrayType(); + return GetTypeGCHandle(classType); + } + + [UnmanagedCallersOnly] + internal static IntPtr GetArrayPointer(ManagedHandle arrayHandle) + { + if (!arrayHandle.IsAllocated) + return IntPtr.Zero; + ManagedArray managedArray = Unsafe.As(arrayHandle.Target); + if (managedArray.Length == 0) + return IntPtr.Zero; + return managedArray.Pointer; + } + + [UnmanagedCallersOnly] + internal static int GetArrayLength(ManagedHandle arrayHandle) + { + if (!arrayHandle.IsAllocated) + return 0; + ManagedArray managedArray = Unsafe.As(arrayHandle.Target); + return managedArray.Length; + } + + [UnmanagedCallersOnly] + internal static IntPtr GetStringEmpty() + { + return ManagedHandle.ToIntPtr(ManagedString.EmptyStringHandle); + } + + [UnmanagedCallersOnly] + internal static IntPtr NewStringUTF16(char* text, int length) + { + return ManagedString.ToNativeWeak(new string(new ReadOnlySpan(text, length))); + } + + [UnmanagedCallersOnly] + internal static IntPtr NewStringLength(sbyte* text, int length) + { + return ManagedString.ToNativeWeak(new string(text, 0, length)); + } + + [UnmanagedCallersOnly] + internal static ManagedHandle GetObjectType(ManagedHandle handle) + { + object obj = handle.Target; + Type classType = obj.GetType(); + if (classType == typeof(ManagedArray)) + classType = ((ManagedArray)obj).ArrayType; + return GetTypeGCHandle(classType); + } + + [UnmanagedCallersOnly] + internal static IntPtr GetObjectString(ManagedHandle handle) + { + object obj = handle.Target; + string result = string.Empty; + try + { + result = obj.ToString(); + } + catch (Exception ex) + { + Debug.LogException(ex); + } + return ManagedHandle.ToIntPtr(result); + } + + [UnmanagedCallersOnly] + internal static int GetObjectHashCode(ManagedHandle handle) + { + object obj = handle.Target; + int result = 0; + try + { + result = obj.GetHashCode(); + } + catch (Exception ex) + { + Debug.LogException(ex); + } + return result; + } + + /// + /// Creates a managed copy of the value, and stores it in a boxed reference. + /// + [UnmanagedCallersOnly] + internal static ManagedHandle BoxValue(ManagedHandle typeHandle, IntPtr valuePtr) + { + Type type = Unsafe.As(typeHandle.Target); + object value = MarshalToManaged(valuePtr, type); + return ManagedHandle.Alloc(value, GCHandleType.Weak); + } + + /// + /// Returns the address of the boxed value type. + /// + [UnmanagedCallersOnly] + internal static IntPtr UnboxValue(ManagedHandle handle) + { + object value = handle.Target; + Type type = value.GetType(); + if (!type.IsValueType) + return ManagedHandle.ToIntPtr(handle); + + // HACK: Get the address of a non-pinned value + return ValueTypeUnboxer.GetPointer(value, type); + } + + [UnmanagedCallersOnly] + internal static void RaiseException(ManagedHandle exceptionHandle) + { + Exception exception = Unsafe.As(exceptionHandle.Target); + throw exception; + } + + [UnmanagedCallersOnly] + internal static void ObjectInit(ManagedHandle objectHandle) + { + try + { + object obj = objectHandle.Target; + Type type = obj.GetType(); + ConstructorInfo ctor = type.GetConstructor(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null); + if (ctor == null) + throw new Exception($"Missing empty constructor in type '{type}'."); + ctor.Invoke(obj, null); + } + catch (Exception ex) + { + Debug.LogException(ex); + } + } + + [UnmanagedCallersOnly] + internal static IntPtr InvokeMethod(ManagedHandle instanceHandle, ManagedHandle methodHandle, IntPtr paramPtr, IntPtr exceptionPtr) + { + MethodHolder methodHolder = Unsafe.As(methodHandle.Target); +#if !USE_AOT + if (methodHolder.TryGetDelegate(out var methodDelegate, out var methodDelegateContext)) + { + // Fast path, invoke the method with minimal allocations + IntPtr returnValue; + try + { + returnValue = methodDelegate(methodDelegateContext, instanceHandle, paramPtr); + } + catch (Exception exception) + { + if (exceptionPtr != IntPtr.Zero) + Marshal.WriteIntPtr(exceptionPtr, ManagedHandle.ToIntPtr(exception, GCHandleType.Weak)); + return IntPtr.Zero; + } + return returnValue; + } + else +#endif + { + // Slow path, method parameters needs to be stored in heap + object returnObject; + int numParams = methodHolder.parameterTypes.Length; + object[] methodParameters = new object[numParams]; + + for (int i = 0; i < numParams; i++) + { + IntPtr nativePtr = Marshal.ReadIntPtr(IntPtr.Add(paramPtr, sizeof(IntPtr) * i)); + methodParameters[i] = MarshalToManaged(nativePtr, methodHolder.parameterTypes[i]); + } + + try + { + returnObject = methodHolder.method.Invoke(instanceHandle.IsAllocated ? instanceHandle.Target : null, methodParameters); + } + catch (Exception exception) + { + // The internal exception thrown in MethodInfo.Invoke is caught here + Exception realException = exception; + if (exception.InnerException != null && exception.TargetSite.ReflectedType.Name == "MethodInvoker") + realException = exception.InnerException; + + if (exceptionPtr != IntPtr.Zero) + Marshal.WriteIntPtr(exceptionPtr, ManagedHandle.ToIntPtr(realException, GCHandleType.Weak)); + else + throw realException; + return IntPtr.Zero; + } + + // Marshal reference parameters back to original unmanaged references + for (int i = 0; i < numParams; i++) + { + Type parameterType = methodHolder.parameterTypes[i]; + if (parameterType.IsByRef) + { + IntPtr nativePtr = Marshal.ReadIntPtr(IntPtr.Add(paramPtr, sizeof(IntPtr) * i)); + MarshalToNative(methodParameters[i], nativePtr, parameterType.GetElementType()); + } + } + + // Return value + return Invoker.MarshalReturnValueGeneric(methodHolder.returnType, returnObject); + } + } + + [UnmanagedCallersOnly] + internal static IntPtr GetThunk(ManagedHandle methodHandle) + { +#if USE_AOT + Debug.LogError("GetThunk is not supported in C# AOT mode"); + return IntPtr.Zero; +#else + MethodHolder methodHolder = Unsafe.As(methodHandle.Target); + + // Wrap the method call, this is needed to get the object instance from ManagedHandle and to pass the exception back to native side + ThunkContext context = new ThunkContext((MethodInfo)methodHolder.method); + Delegate methodDelegate = typeof(ThunkContext).GetMethod(nameof(ThunkContext.InvokeThunk)).CreateDelegate(context); + IntPtr functionPtr = Marshal.GetFunctionPointerForDelegate(methodDelegate); + + // Keep a reference to the delegate to prevent it from being garbage collected +#if FLAX_EDITOR + if (methodHolder.method.IsCollectible) + cachedDelegatesCollectible[functionPtr] = methodDelegate; + else +#endif + { + cachedDelegates[functionPtr] = methodDelegate; + } + return functionPtr; +#endif + } + + [UnmanagedCallersOnly] + internal static void FieldSetValue(ManagedHandle fieldOwnerHandle, ManagedHandle fieldHandle, IntPtr valuePtr) + { + object fieldOwner = fieldOwnerHandle.Target; + FieldHolder field = Unsafe.As(fieldHandle.Target); + object value = null; + if (field.field.FieldType.IsValueType) + value = Marshal.PtrToStructure(valuePtr, field.field.FieldType); + else if (valuePtr != IntPtr.Zero) + value = ManagedHandle.FromIntPtr(valuePtr).Target; + field.field.SetValue(fieldOwner, value); + } + + [UnmanagedCallersOnly] + internal static void FieldGetValue(ManagedHandle fieldOwnerHandle, ManagedHandle fieldHandle, IntPtr valuePtr) + { + object fieldOwner = fieldOwnerHandle.Target; + FieldHolder field = Unsafe.As(fieldHandle.Target); + field.toNativeMarshaller(field.field, fieldOwner, valuePtr, out int fieldOffset); + } + + [UnmanagedCallersOnly] + internal static void WriteArrayReference(ManagedHandle arrayHandle, IntPtr valueHandle, int index) + { + ManagedArray managedArray = Unsafe.As(arrayHandle.Target); + managedArray.ToSpan()[index] = valueHandle; + } + + [UnmanagedCallersOnly] + internal static void WriteArrayReferences(ManagedHandle arrayHandle, IntPtr spanPtr, int spanLength) + { + ManagedArray managedArray = Unsafe.As(arrayHandle.Target); + var unmanagedSpan = new Span(spanPtr.ToPointer(), spanLength); + unmanagedSpan.CopyTo(managedArray.ToSpan()); + } + + [UnmanagedCallersOnly] + internal static ManagedHandle LoadAssemblyImage(IntPtr assemblyPathPtr, IntPtr* assemblyName, IntPtr* assemblyFullName) + { + if (!firstAssemblyLoaded) + { + // This assembly was already loaded when initializing the host context + firstAssemblyLoaded = true; + + Assembly flaxEngineAssembly = AssemblyLoadContext.Default.Assemblies.First(x => x.GetName().Name == "FlaxEngine.CSharp"); + *assemblyName = NativeAllocStringAnsi(flaxEngineAssembly.GetName().Name); + *assemblyFullName = NativeAllocStringAnsi(flaxEngineAssembly.FullName); + return GetAssemblyHandle(flaxEngineAssembly); + } + + string assemblyPath = Marshal.PtrToStringAnsi(assemblyPathPtr); + + Assembly assembly; +#if FLAX_EDITOR + // Load assembly from loaded bytes to prevent file locking in Editor + var assemblyBytes = File.ReadAllBytes(assemblyPath); + using MemoryStream stream = new MemoryStream(assemblyBytes); + var pdbPath = Path.ChangeExtension(assemblyPath, "pdb"); + if (File.Exists(pdbPath)) + { + // Load including debug symbols + using FileStream pdbStream = new FileStream(Path.ChangeExtension(assemblyPath, "pdb"), FileMode.Open); + assembly = scriptingAssemblyLoadContext.LoadFromStream(stream, pdbStream); + } + else + { + assembly = scriptingAssemblyLoadContext.LoadFromStream(stream); + } +#else + // Load assembly from file + assembly = scriptingAssemblyLoadContext.LoadFromAssemblyPath(assemblyPath); +#endif + if (assembly == null) + return new ManagedHandle(); + NativeLibrary.SetDllImportResolver(assembly, NativeLibraryImportResolver); + + // Assemblies loaded via streams have no Location: https://github.com/dotnet/runtime/issues/12822 + AssemblyLocations.Add(assembly.FullName, assemblyPath); + + *assemblyName = NativeAllocStringAnsi(assembly.GetName().Name); + *assemblyFullName = NativeAllocStringAnsi(assembly.FullName); + return GetAssemblyHandle(assembly); + } + + [UnmanagedCallersOnly] + internal static ManagedHandle GetAssemblyByName(IntPtr namePtr, IntPtr* assemblyName, IntPtr* assemblyFullName) + { + string name = Marshal.PtrToStringAnsi(namePtr); + Assembly assembly = Utils.GetAssemblies().FirstOrDefault(x => x.GetName().Name == name); + if (assembly == null) + return new ManagedHandle(); + + *assemblyName = NativeAllocStringAnsi(assembly.GetName().Name); + *assemblyFullName = NativeAllocStringAnsi(assembly.FullName); + return GetAssemblyHandle(assembly); + } + + [UnmanagedCallersOnly] + internal static IntPtr GetRuntimeInformation() + { + return NativeAllocStringAnsi(System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription); + } + + [UnmanagedCallersOnly] + internal static void CloseAssembly(ManagedHandle assemblyHandle) + { + Assembly assembly = Unsafe.As(assemblyHandle.Target); + assemblyHandle.Free(); + assemblyHandles.Remove(assembly); + + AssemblyLocations.Remove(assembly.FullName); + + // Clear all caches which might hold references to closing assembly + typeCache.Clear(); + + // Release all references in collectible ALC +#if FLAX_EDITOR + cachedDelegatesCollectible.Clear(); + foreach (var pair in typeHandleCacheCollectible) + pair.Value.Free(); + typeHandleCacheCollectible.Clear(); + foreach (var handle in methodHandlesCollectible) + handle.Free(); + methodHandlesCollectible.Clear(); + foreach (var handle in fieldHandleCacheCollectible) + handle.Free(); + fieldHandleCacheCollectible.Clear(); +#endif + + foreach (var pair in classAttributesCacheCollectible) + pair.Value.Free(); + classAttributesCacheCollectible.Clear(); + + // Unload native library handles associated for this assembly + string nativeLibraryName = assemblyOwnedNativeLibraries.GetValueOrDefault(assembly); + if (nativeLibraryName != null && loadedNativeLibraries.TryGetValue(nativeLibraryName, out IntPtr nativeLibrary)) + { + NativeLibrary.Free(nativeLibrary); + loadedNativeLibraries.Remove(nativeLibraryName); + } + if (nativeLibraryName != null) + nativeLibraryPaths.Remove(nativeLibraryName); + + // Unload the ALC + bool unloading = true; + scriptingAssemblyLoadContext.Unloading += (alc) => { unloading = false; }; + scriptingAssemblyLoadContext.Unload(); + + while (unloading) + System.Threading.Thread.Sleep(1); + + InitScriptingAssemblyLoadContext(); + DelegateHelpers.InitMethods(); + } + + [UnmanagedCallersOnly] + internal static int NativeSizeOf(ManagedHandle typeHandle) + { + Type type = Unsafe.As(typeHandle.Target); + Type nativeType = GetInternalType(type) ?? type; + if (nativeType == typeof(Version)) + nativeType = typeof(NativeVersion); + int size; + if (nativeType.IsClass) + size = sizeof(IntPtr); + else + size = Marshal.SizeOf(nativeType); + return size; + } + + [UnmanagedCallersOnly] + internal static byte TypeIsSubclassOf(ManagedHandle typeHandle, ManagedHandle otherTypeHandle, byte checkInterfaces) + { + if (typeHandle == otherTypeHandle) + return 1; + + Type type = Unsafe.As(typeHandle.Target); + Type otherType = Unsafe.As(otherTypeHandle.Target); + + if (type == otherType) + return 1; + + if (checkInterfaces != 0 && otherType.IsInterface) + { + if (type.GetInterfaces().Contains(otherType)) + return 1; + } + + return type.IsSubclassOf(otherType) ? (byte)1 : (byte)0; + } + + [UnmanagedCallersOnly] + internal static byte TypeIsAssignableFrom(ManagedHandle typeHandle, ManagedHandle otherTypeHandle) + { + Type type = Unsafe.As(typeHandle.Target); + Type otherType = Unsafe.As(otherTypeHandle.Target); + return (byte)(type.IsAssignableFrom(otherType) ? 1 : 0); + } + + [UnmanagedCallersOnly] + internal static byte TypeIsValueType(ManagedHandle typeHandle) + { + Type type = Unsafe.As(typeHandle.Target); + return (byte)(type.IsValueType ? 1 : 0); + } + + [UnmanagedCallersOnly] + internal static byte TypeIsEnum(ManagedHandle typeHandle) + { + Type type = Unsafe.As(typeHandle.Target); + return (byte)(type.IsEnum ? 1 : 0); + } + + [UnmanagedCallersOnly] + internal static ManagedHandle GetClassParent(ManagedHandle typeHandle) + { + Type type = Unsafe.As(typeHandle.Target); + return GetTypeGCHandle(type.BaseType); + } + + [UnmanagedCallersOnly] + internal static ManagedHandle GetElementClass(ManagedHandle typeHandle) + { + Type type = Unsafe.As(typeHandle.Target); + return GetTypeGCHandle(type.GetElementType()); + } + + [UnmanagedCallersOnly] + internal static byte GetMethodParameterIsOut(ManagedHandle methodHandle, int parameterNum) + { + MethodHolder methodHolder = Unsafe.As(methodHandle.Target); + ParameterInfo parameterInfo = methodHolder.method.GetParameters()[parameterNum]; + return (byte)(parameterInfo.IsOut ? 1 : 0); + } + + [UnmanagedCallersOnly] + internal static ManagedHandle GetNullReferenceException() + { + var exception = new NullReferenceException(); + return ManagedHandle.Alloc(exception, GCHandleType.Weak); + } + + [UnmanagedCallersOnly] + internal static ManagedHandle GetException(IntPtr msgPtr) + { + string msg = Marshal.PtrToStringAnsi(msgPtr); + var exception = new Exception(msg); + return ManagedHandle.Alloc(exception, GCHandleType.Weak); + } + + [UnmanagedCallersOnly] + internal static ManagedHandle GetNotSupportedException() + { + var exception = new NotSupportedException(); + return ManagedHandle.Alloc(exception, GCHandleType.Weak); + } + + [UnmanagedCallersOnly] + internal static ManagedHandle GetArgumentNullException() + { + var exception = new ArgumentNullException(); + return ManagedHandle.Alloc(exception, GCHandleType.Weak); + } + + [UnmanagedCallersOnly] + internal static ManagedHandle GetArgumentException() + { + var exception = new ArgumentException(); + return ManagedHandle.Alloc(exception, GCHandleType.Weak); + } + + [UnmanagedCallersOnly] + internal static ManagedHandle GetArgumentOutOfRangeException() + { + var exception = new ArgumentOutOfRangeException(); + return ManagedHandle.Alloc(exception, GCHandleType.Weak); + } + + [UnmanagedCallersOnly] + internal static ManagedHandle NewGCHandle(ManagedHandle valueHandle, byte pinned) + { + return ManagedHandle.Alloc(valueHandle.Target, pinned != 0 ? GCHandleType.Pinned : GCHandleType.Normal); + } + + [UnmanagedCallersOnly] + internal static ManagedHandle NewGCHandleWeak(ManagedHandle valueHandle, byte trackResurrection) + { + return ManagedHandle.Alloc(valueHandle.Target, trackResurrection != 0 ? GCHandleType.WeakTrackResurrection : GCHandleType.Weak); + } + + [UnmanagedCallersOnly] + internal static void FreeGCHandle(ManagedHandle valueHandle) + { + valueHandle.Free(); + } + + [UnmanagedCallersOnly] + internal static void GCCollect(int generation, int mode, bool blocking, bool compacting) + { + GC.Collect(generation, (GCCollectionMode)mode, blocking, compacting); + } + + [UnmanagedCallersOnly] + internal static int GCMaxGeneration() + { + return GC.MaxGeneration; + } + + [UnmanagedCallersOnly] + internal static void GCWaitForPendingFinalizers() + { + GC.WaitForPendingFinalizers(); + } + + [UnmanagedCallersOnly] + internal static ManagedHandle GetTypeClass(ManagedHandle typeHandle) + { + Type type = Unsafe.As(typeHandle.Target); + if (type.IsByRef) + type = type.GetElementType(); // Drop reference type (&) to get actual value type + return GetTypeGCHandle(type); + } + + [UnmanagedCallersOnly] + internal static bool GetTypeIsPointer(ManagedHandle typeHandle) + { + Type type = Unsafe.As(typeHandle.Target); + return type.IsPointer; + } + + [UnmanagedCallersOnly] + internal static bool GetTypeIsReference(ManagedHandle typeHandle) + { + Type type = Unsafe.As(typeHandle.Target); + return type.IsByRef; + } + + [UnmanagedCallersOnly] + internal static uint GetTypeMTypesEnum(ManagedHandle typeHandle) + { + Type type = Unsafe.As(typeHandle.Target); + if (type.IsByRef) + type = type.GetElementType(); // Drop reference type (&) to get actual value type + MTypes monoType; + switch (type) + { + case Type _ when type == typeof(void): + monoType = MTypes.Void; + break; + case Type _ when type == typeof(bool): + monoType = MTypes.Boolean; + break; + case Type _ when type == typeof(sbyte): + case Type _ when type == typeof(short): + monoType = MTypes.I2; + break; + case Type _ when type == typeof(byte): + case Type _ when type == typeof(ushort): + monoType = MTypes.U2; + break; + case Type _ when type == typeof(int): + monoType = MTypes.I4; + break; + case Type _ when type == typeof(uint): + monoType = MTypes.U4; + break; + case Type _ when type == typeof(long): + monoType = MTypes.I8; + break; + case Type _ when type == typeof(ulong): + monoType = MTypes.U8; + break; + case Type _ when type == typeof(float): + monoType = MTypes.R4; + break; + case Type _ when type == typeof(double): + monoType = MTypes.R8; + break; + case Type _ when type == typeof(string): + monoType = MTypes.String; + break; + case Type _ when type == typeof(IntPtr): + monoType = MTypes.Ptr; + break; + case Type _ when type.IsEnum: + monoType = MTypes.Enum; + break; + case Type _ when type.IsArray: + case Type _ when type == typeof(ManagedArray): + monoType = MTypes.Array; + break; + case Type _ when type.IsValueType && !type.IsEnum && !type.IsPrimitive: + monoType = MTypes.ValueType; + break; + case Type _ when type.IsGenericType: + monoType = MTypes.GenericInst; + break; + case Type _ when type.IsClass: + monoType = MTypes.Object; + break; + default: throw new NativeInteropException($"Unsupported type '{type.FullName}'"); + } + return (uint)monoType; + } + } +} + +#endif diff --git a/Source/Engine/Engine/NativeInterop.cs b/Source/Engine/Engine/NativeInterop.cs new file mode 100644 index 000000000..b33e4bcb6 --- /dev/null +++ b/Source/Engine/Engine/NativeInterop.cs @@ -0,0 +1,1301 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#if USE_NETCORE + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +#if !USE_AOT +using System.Linq.Expressions; +#endif +using System.Reflection; +using System.Runtime.InteropServices; +using System.Runtime.Loader; +using System.Runtime.CompilerServices; +using FlaxEngine.Assertions; +using System.Collections.Concurrent; +using System.IO; +using System.Text; + +namespace FlaxEngine.Interop +{ + /// + /// Provides a Mono-like API for native code to access managed runtime. + /// + internal static unsafe partial class NativeInterop + { + internal static Dictionary AssemblyLocations = new(); + + private static bool firstAssemblyLoaded = false; + + private static Dictionary typeCache = new(); + + private static IntPtr boolTruePtr = ManagedHandle.ToIntPtr(ManagedHandle.Alloc((int)1, GCHandleType.Pinned)); + private static IntPtr boolFalsePtr = ManagedHandle.ToIntPtr(ManagedHandle.Alloc((int)0, GCHandleType.Pinned)); + + private static List methodHandles = new(); + private static ConcurrentDictionary cachedDelegates = new(); + private static Dictionary typeHandleCache = new(); + private static List fieldHandleCache = new(); +#if FLAX_EDITOR + private static List methodHandlesCollectible = new(); + private static ConcurrentDictionary cachedDelegatesCollectible = new(); + private static Dictionary typeHandleCacheCollectible = new(); + private static List fieldHandleCacheCollectible = new(); +#endif + private static Dictionary classAttributesCacheCollectible = new(); + private static Dictionary assemblyHandles = new(); + + private static Dictionary loadedNativeLibraries = new(); + internal static Dictionary nativeLibraryPaths = new(); + private static Dictionary assemblyOwnedNativeLibraries = new(); + internal static AssemblyLoadContext scriptingAssemblyLoadContext; + + [System.Diagnostics.DebuggerStepThrough] + private static IntPtr NativeLibraryImportResolver(string libraryName, Assembly assembly, DllImportSearchPath? dllImportSearchPath) + { + if (!loadedNativeLibraries.TryGetValue(libraryName, out IntPtr nativeLibrary)) + { + if (!nativeLibraryPaths.TryGetValue(libraryName, out var nativeLibraryPath)) + { + nativeLibraryPath = libraryName; + + // Check if any of the loaded assemblies has matching native module filename + foreach (var e in nativeLibraryPaths) + { + if (string.Equals(Path.GetFileNameWithoutExtension(e.Value), libraryName, StringComparison.Ordinal)) + { + nativeLibraryPath = e.Value; + break; + } + } + } + nativeLibrary = NativeLibrary.Load(nativeLibraryPath, assembly, dllImportSearchPath); + loadedNativeLibraries.Add(libraryName, nativeLibrary); + assemblyOwnedNativeLibraries.Add(assembly, libraryName); + } + return nativeLibrary; + } + + private static void InitScriptingAssemblyLoadContext() + { +#if FLAX_EDITOR + var isCollectible = true; +#else + var isCollectible = false; +#endif + scriptingAssemblyLoadContext = new AssemblyLoadContext("Flax", isCollectible); +#if FLAX_EDITOR + scriptingAssemblyLoadContext.Resolving += OnScriptingAssemblyLoadContextResolving; +#endif + } + + [UnmanagedCallersOnly] + internal static unsafe void Init() + { + NativeLibrary.SetDllImportResolver(Assembly.GetExecutingAssembly(), NativeLibraryImportResolver); + + // Change default culture to match with Mono runtime default culture + CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture; + CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture; + System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; + System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture; + + InitScriptingAssemblyLoadContext(); + DelegateHelpers.InitMethods(); + } + +#if FLAX_EDITOR + private static Assembly? OnScriptingAssemblyLoadContextResolving(AssemblyLoadContext assemblyLoadContext, AssemblyName assemblyName) + { + // FIXME: There should be a better way to resolve the path to EditorTargetPath where the dependencies are stored + string editorTargetPath = Path.GetDirectoryName(nativeLibraryPaths.Keys.First(x => x != "FlaxEngine")); + + var assemblyPath = Path.Combine(editorTargetPath, assemblyName.Name + ".dll"); + if (File.Exists(assemblyPath)) + return assemblyLoadContext.LoadFromAssemblyPath(assemblyPath); + return null; + } +#endif + + [UnmanagedCallersOnly] + internal static unsafe void Exit() + { + } + + internal static void* NativeAlloc(int byteCount) + { + return NativeMemory.AlignedAlloc((UIntPtr)byteCount, 16); + } + + internal static void* NativeAlloc(int elementCount, int elementSize) + { + return NativeMemory.AlignedAlloc((UIntPtr)(elementCount * elementSize), 16); + } + + internal static IntPtr NativeAllocStringAnsi(string str) + { + if (str is null) + return IntPtr.Zero; + + int length = str.Length + 1; + void* ptr = NativeMemory.AlignedAlloc((UIntPtr)length, 16); + Span byteSpan = new Span(ptr, length); + Encoding.ASCII.GetBytes(str, byteSpan); + byteSpan[length - 1] = 0; + + return (IntPtr)ptr; + } + + internal static void NativeFree(void* ptr) + { + NativeMemory.AlignedFree(ptr); + } + + internal static T[] GCHandleArrayToManagedArray(ManagedArray ptrArray) where T : class + { + Span span = ptrArray.ToSpan(); + T[] managedArray = new T[ptrArray.Length]; + for (int i = 0; i < managedArray.Length; i++) + managedArray[i] = span[i] != IntPtr.Zero ? (T)ManagedHandle.FromIntPtr(span[i]).Target : default; + return managedArray; + } + + internal static IntPtr[] ManagedArrayToGCHandleArray(Array array) + { + if (array.Length == 0) + return Array.Empty(); + IntPtr[] pointerArray = new IntPtr[array.Length]; + for (int i = 0; i < pointerArray.Length; i++) + { + var obj = array.GetValue(i); + if (obj != null) + pointerArray.SetValue(ManagedHandle.ToIntPtr(obj), i); + } + return pointerArray; + } + + internal static ManagedArray ManagedArrayToGCHandleWrappedArray(Array array) + { + IntPtr[] pointerArray = ManagedArrayToGCHandleArray(array); + return ManagedArray.WrapNewArray(pointerArray, array.GetType()); + } + + internal static TDst[] ConvertArray(Span src, Func convertFunc) + { + TDst[] dst = new TDst[src.Length]; + for (int i = 0; i < src.Length; i++) + dst[i] = convertFunc(src[i]); + return dst; + } + + internal static TDst[] ConvertArray(TSrc[] src, Func convertFunc) + { + TDst[] dst = new TDst[src.Length]; + for (int i = 0; i < src.Length; i++) + dst[i] = convertFunc(src[i]); + return dst; + } + + private static Type FindType(string typeName) + { + if (typeCache.TryGetValue(typeName, out Type type)) + return type; + + type = Type.GetType(typeName, ResolveAssemblyByName, null); + if (type == null) + { + foreach (var assembly in scriptingAssemblyLoadContext.Assemblies) + { + type = assembly.GetType(typeName); + if (type != null) + break; + } + } + + if (type == null) + { + string oldTypeName = typeName; + typeName = typeName.Substring(0, typeName.IndexOf(',')); + type = Type.GetType(typeName, ResolveAssemblyByName, null); + if (type == null) + { + foreach (var assembly in scriptingAssemblyLoadContext.Assemblies) + { + type = assembly.GetType(typeName); + if (type != null) + break; + } + } + typeName = oldTypeName; + } + + typeCache.Add(typeName, type); + + return type; + } + + private static Assembly ResolveAssemblyByName(AssemblyName assemblyName) + { + foreach (Assembly assembly in scriptingAssemblyLoadContext.Assemblies) + if (assembly.GetName() == assemblyName) + return assembly; + return null; + } + + internal static bool IsBlittable(Type type) + { + if (type.IsPrimitive || type.IsEnum) + return true; + if (type.IsArray && IsBlittable(type.GetElementType())) + return true; + if (type.IsPointer && type.HasElementType && type.GetElementType().IsPrimitive) + return true; + if (type.IsClass) + return false; + if (type.IsValueType) + { + var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + foreach (FieldInfo field in fields) + { + if (!IsBlittable(field.FieldType)) + return false; + } + } + return true; + } + + /// + /// Returns blittable internal type for given type. + /// + internal static Type GetInternalType(Type type) + { + string[] splits = type.AssemblyQualifiedName.Split(','); + string @namespace = string.Join('.', splits[0].Split('.').SkipLast(1)); + string className = @namespace.Length > 0 ? splits[0].Substring(@namespace.Length + 1) : splits[0]; + string parentClassName = ""; + if (className.Contains('+')) + { + parentClassName = className.Substring(0, className.LastIndexOf('+') + 1); + className = className.Substring(parentClassName.Length); + } + string marshallerName = className + "Marshaller"; + string internalAssemblyQualifiedName = $"{@namespace}.{parentClassName}{marshallerName}+{className}Internal,{String.Join(',', splits.Skip(1))}"; + return FindType(internalAssemblyQualifiedName); + } + + internal class ReferenceTypePlaceholder + { + } + + internal struct ValueTypePlaceholder + { + } + + internal delegate object MarshalToManagedDelegate(IntPtr nativePtr, bool byRef); + + internal delegate void MarshalToNativeDelegate(object managedObject, IntPtr nativePtr); + + internal delegate void MarshalToNativeFieldDelegate(FieldInfo field, object fieldOwner, IntPtr nativePtr, out int fieldOffset); + + internal static ConcurrentDictionary toManagedMarshallers = new ConcurrentDictionary(1, 3); + internal static ConcurrentDictionary toNativeMarshallers = new ConcurrentDictionary(1, 3); + internal static ConcurrentDictionary toNativeFieldMarshallers = new ConcurrentDictionary(1, 3); + + internal static object MarshalToManaged(IntPtr nativePtr, Type type) + { + static MarshalToManagedDelegate Factory(Type type) + { + Type marshalType = type; + if (marshalType.IsByRef) + marshalType = marshalType.GetElementType(); + else if (marshalType.IsPointer) + marshalType = typeof(IntPtr); + + MethodInfo method = typeof(MarshalHelper<>).MakeGenericType(marshalType).GetMethod(nameof(MarshalHelper.ToManagedWrapper), BindingFlags.Static | BindingFlags.NonPublic); + return method.CreateDelegate(); + } + + if (!toManagedMarshallers.TryGetValue(type, out var deleg)) + deleg = toManagedMarshallers.GetOrAdd(type, Factory); + return deleg(nativePtr, type.IsByRef); + } + + internal static void MarshalToNative(object managedObject, IntPtr nativePtr, Type type) + { + static MarshalToNativeDelegate Factory(Type type) + { + MethodInfo method; + if (type.IsValueType) + method = typeof(MarshalHelperValueType<>).MakeGenericType(type).GetMethod(nameof(MarshalHelperValueType.ToNativeWrapper), BindingFlags.Static | BindingFlags.NonPublic); + else + method = typeof(MarshalHelperReferenceType<>).MakeGenericType(type).GetMethod(nameof(MarshalHelperReferenceType.ToNativeWrapper), BindingFlags.Static | BindingFlags.NonPublic); + return method.CreateDelegate(); + } + + if (!toNativeMarshallers.TryGetValue(type, out var deleg)) + deleg = toNativeMarshallers.GetOrAdd(type, Factory); + deleg(managedObject, nativePtr); + } + + internal static MarshalToNativeFieldDelegate GetToNativeFieldMarshallerDelegate(Type type) + { + static MarshalToNativeFieldDelegate Factory(Type type) + { + MethodInfo method; + if (type.IsValueType) + method = typeof(MarshalHelperValueType<>).MakeGenericType(type).GetMethod(nameof(MarshalHelperValueType.ToNativeFieldWrapper), BindingFlags.Static | BindingFlags.NonPublic); + else + method = typeof(MarshalHelperReferenceType<>).MakeGenericType(type).GetMethod(nameof(MarshalHelperReferenceType.ToNativeFieldWrapper), BindingFlags.Static | BindingFlags.NonPublic); + return method.CreateDelegate(); + } + + if (toNativeFieldMarshallers.TryGetValue(type, out var deleg)) + return deleg; + return toNativeFieldMarshallers.GetOrAdd(type, Factory); + } + + internal static void MarshalToNativeField(FieldInfo field, object fieldOwner, IntPtr nativePtr, out int fieldOffset) + { + GetToNativeFieldMarshallerDelegate(fieldOwner.GetType())(field, fieldOwner, nativePtr, out fieldOffset); + } + + /// + /// Helper class for managing stored marshaller delegates for each type. + /// + internal static class MarshalHelper + { + private delegate void MarshalToNativeTypedDelegate(ref T managedValue, IntPtr nativePtr); + + private delegate void MarshalToManagedTypedDelegate(ref T managedValue, IntPtr nativePtr, bool byRef); + + internal delegate void MarshalFieldTypedDelegate(FieldInfo field, ref T fieldOwner, IntPtr fieldPtr, out int fieldOffset); + + internal static FieldInfo[] marshallableFields; + internal static MarshalFieldTypedDelegate[] toManagedFieldMarshallers; + internal static MarshalFieldTypedDelegate[] toNativeFieldMarshallers; + + private static MarshalToNativeTypedDelegate toNativeTypedMarshaller; + private static MarshalToManagedTypedDelegate toManagedTypedMarshaller; + + static MarshalHelper() + { + Type type = typeof(T); + + // Setup marshallers for managed and native directions + MethodInfo toManagedMethod; + if (type.IsValueType) + toManagedMethod = typeof(MarshalHelperValueType<>).MakeGenericType(type).GetMethod(nameof(MarshalHelperValueType.ToManaged), BindingFlags.Static | BindingFlags.NonPublic); + else if (type.IsArray && type.GetElementType().IsValueType) + toManagedMethod = typeof(MarshalHelperValueType<>).MakeGenericType(type.GetElementType()).GetMethod(nameof(MarshalHelperValueType.ToManagedArray), BindingFlags.Static | BindingFlags.NonPublic); + else if (type.IsArray && !type.GetElementType().IsValueType) + toManagedMethod = typeof(MarshalHelperReferenceType<>).MakeGenericType(type.GetElementType()).GetMethod(nameof(MarshalHelperReferenceType.ToManagedArray), BindingFlags.Static | BindingFlags.NonPublic); + else + toManagedMethod = typeof(MarshalHelperReferenceType<>).MakeGenericType(type).GetMethod(nameof(MarshalHelperReferenceType.ToManaged), BindingFlags.Static | BindingFlags.NonPublic); + toManagedTypedMarshaller = toManagedMethod.CreateDelegate(); + + MethodInfo toNativeMethod; + if (type.IsValueType) + toNativeMethod = typeof(MarshalHelperValueType<>).MakeGenericType(type).GetMethod(nameof(MarshalHelperValueType.ToNative), BindingFlags.Static | BindingFlags.NonPublic); + else + toNativeMethod = typeof(MarshalHelperReferenceType<>).MakeGenericType(type).GetMethod(nameof(MarshalHelperReferenceType.ToNative), BindingFlags.Static | BindingFlags.NonPublic); + toNativeTypedMarshaller = toNativeMethod.CreateDelegate(); + + if (!type.IsPrimitive && !type.IsPointer && type != typeof(bool)) + { + // Setup field-by-field marshallers for reference types or structures containing references + marshallableFields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + if (type.IsValueType && !marshallableFields.Any(x => (x.FieldType.IsClass && !x.FieldType.IsPointer) || x.FieldType.Name == "Boolean")) + marshallableFields = null; + else if (!type.IsValueType && !marshallableFields.Any()) + marshallableFields = null; + + if (marshallableFields != null) + { + toManagedFieldMarshallers = new MarshalFieldTypedDelegate[marshallableFields.Length]; + toNativeFieldMarshallers = new MarshalFieldTypedDelegate[marshallableFields.Length]; + BindingFlags bindingFlags = BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public; + for (int i = 0; i < marshallableFields.Length; i++) + { + FieldInfo field = marshallableFields[i]; + Type fieldType = field.FieldType; + MethodInfo toManagedFieldMethod; + MethodInfo toNativeFieldMethod; + + if (fieldType.IsPointer) + { + toManagedFieldMethod = typeof(MarshalHelper<>).MakeGenericType(type).GetMethod(nameof(MarshalHelper.ToManagedFieldPointer), bindingFlags); + toNativeFieldMethod = typeof(MarshalHelper<>).MakeGenericType(type).GetMethod(nameof(MarshalHelper.ToNativeFieldPointer), bindingFlags); + } + else if (fieldType.IsValueType) + { + if (Nullable.GetUnderlyingType(fieldType) != null) + { + toManagedFieldMethod = typeof(MarshalHelper<>.NullableValueTypeField<>).MakeGenericType(type, fieldType).GetMethod(nameof(MarshalHelper.NullableValueTypeField.ToManagedField), bindingFlags); + toNativeFieldMethod = typeof(MarshalHelper<>.NullableValueTypeField<>).MakeGenericType(type, fieldType).GetMethod(nameof(MarshalHelper.NullableValueTypeField.ToNativeField), bindingFlags); + } + else + { + toManagedFieldMethod = typeof(MarshalHelper<>.ValueTypeField<>).MakeGenericType(type, fieldType).GetMethod(nameof(MarshalHelper.ValueTypeField.ToManagedField), bindingFlags); + toNativeFieldMethod = typeof(MarshalHelper<>.ValueTypeField<>).MakeGenericType(type, fieldType).GetMethod(nameof(MarshalHelper.ValueTypeField.ToNativeField), bindingFlags); + } + } + else if (fieldType.IsArray) + { + Type arrayElementType = fieldType.GetElementType(); + if (arrayElementType.IsValueType) + { + toManagedFieldMethod = typeof(MarshalHelper<>.ValueTypeField<>).MakeGenericType(type, arrayElementType).GetMethod(nameof(MarshalHelper.ValueTypeField.ToManagedFieldArray), bindingFlags); + toNativeFieldMethod = typeof(MarshalHelper<>.ReferenceTypeField<>).MakeGenericType(type, fieldType).GetMethod(nameof(MarshalHelper.ReferenceTypeField.ToNativeField), bindingFlags); + } + else + { + toManagedFieldMethod = typeof(MarshalHelper<>.ReferenceTypeField<>).MakeGenericType(type, fieldType).GetMethod(nameof(MarshalHelper.ReferenceTypeField.ToManagedField), bindingFlags); + toNativeFieldMethod = typeof(MarshalHelper<>.ReferenceTypeField<>).MakeGenericType(type, fieldType).GetMethod(nameof(MarshalHelper.ReferenceTypeField.ToNativeField), bindingFlags); + } + } + else + { + toManagedFieldMethod = typeof(MarshalHelper<>.ReferenceTypeField<>).MakeGenericType(type, fieldType).GetMethod(nameof(MarshalHelper.ReferenceTypeField.ToManagedField), bindingFlags); + toNativeFieldMethod = typeof(MarshalHelper<>.ReferenceTypeField<>).MakeGenericType(type, fieldType).GetMethod(nameof(MarshalHelper.ReferenceTypeField.ToNativeField), bindingFlags); + } + toManagedFieldMarshallers[i] = toManagedFieldMethod.CreateDelegate(); + toNativeFieldMarshallers[i] = toNativeFieldMethod.CreateDelegate(); + } + } + } + } + + internal static object ToManagedWrapper(IntPtr nativePtr, bool byRef) + { + T managed = default; + toManagedTypedMarshaller(ref managed, nativePtr, byRef); + return managed; + } + + internal static void ToManaged(ref T managedValue, IntPtr nativePtr, bool byRef) + { + toManagedTypedMarshaller(ref managedValue, nativePtr, byRef); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static T ToManagedUnbox(IntPtr nativePtr) + { + T managed = default; + if (nativePtr != IntPtr.Zero) + { + Type type = typeof(T); + if (type.IsArray) + managed = (T)MarshalToManaged(nativePtr, type); // Array might be in internal format of custom structs so unbox if need to + else + managed = (T)ManagedHandle.FromIntPtr(nativePtr).Target; + } + return managed; + } + + internal static Array ToManagedArray(Span ptrSpan) + { + T[] arr = new T[ptrSpan.Length]; + for (int i = 0; i < arr.Length; i++) + toManagedTypedMarshaller(ref arr[i], ptrSpan[i], false); + return arr; + } + + internal static Array ToManagedArray(ManagedArray nativeArray) + { + T[] arr = new T[nativeArray.Length]; + IntPtr nativePtr = nativeArray.Pointer; + for (int i = 0; i < arr.Length; i++) + { + toManagedTypedMarshaller(ref arr[i], nativePtr, false); + nativePtr += nativeArray.ElementSize; + } + return arr; + } + + internal static void ToNative(ref T managedValue, IntPtr nativePtr) + { + toNativeTypedMarshaller(ref managedValue, nativePtr); + } + + internal static void ToNativeField(FieldInfo field, ref T fieldOwner, IntPtr nativePtr, out int fieldOffset) + { + if (marshallableFields != null) + { + for (int i = 0; i < marshallableFields.Length; i++) + { + if (marshallableFields[i] == field) + { + toNativeFieldMarshallers[i](marshallableFields[i], ref fieldOwner, nativePtr, out fieldOffset); + return; + } + } + } + throw new NativeInteropException($"Invalid field {field.Name} to marshal for type {typeof(T).Name}"); + } + + private static void ToManagedFieldPointer(FieldInfo field, ref T fieldOwner, IntPtr fieldPtr, out int fieldOffset) + { + ref IntPtr fieldValueRef = ref GetFieldReference(field, ref fieldOwner); + fieldValueRef = Unsafe.Read(fieldPtr.ToPointer()); + fieldOffset = IntPtr.Size; + } + + private static void ToNativeFieldPointer(FieldInfo field, ref T fieldOwner, IntPtr fieldPtr, out int fieldOffset) + { + ref IntPtr fieldValueRef = ref GetFieldReference(field, ref fieldOwner); + Unsafe.Write(fieldPtr.ToPointer(), fieldValueRef); + fieldOffset = IntPtr.Size; + } + + /// + /// Returns a reference to the value of the field. + /// + private static ref TField GetFieldReference(FieldInfo field, ref T fieldOwner) + { + // Get the address of the field, source: https://stackoverflow.com/a/56512720 + if (typeof(T).IsValueType) + { + byte* fieldPtr = (byte*)Unsafe.AsPointer(ref fieldOwner) + (Marshal.ReadInt32(field.FieldHandle.Value + 4 + IntPtr.Size) & 0xFFFFFF); + return ref Unsafe.AsRef(fieldPtr); + } + else + { + byte* fieldPtr = (byte*)Unsafe.As(ref fieldOwner) + IntPtr.Size + (Marshal.ReadInt32(field.FieldHandle.Value + 4 + IntPtr.Size) & 0xFFFFFF); + return ref Unsafe.AsRef(fieldPtr); + } + } + + private static IntPtr EnsureAlignment(IntPtr ptr, int alignment) + { + if (ptr % alignment != 0) + ptr = IntPtr.Add(ptr, alignment - (int)(ptr % alignment)); + return ptr; + } + + private static class ValueTypeField where TField : struct + { + private static int fieldAlignment; + + static ValueTypeField() + { + Type fieldType = typeof(TField); + if (fieldType.IsEnum) + fieldType = fieldType.GetEnumUnderlyingType(); + else if (fieldType == typeof(bool)) + fieldType = typeof(byte); + + if (fieldType.IsValueType && !fieldType.IsEnum && !fieldType.IsPrimitive) // Is it a structure? + { + } + else if (fieldType.IsClass || fieldType.IsPointer) + fieldAlignment = IntPtr.Size; + else + fieldAlignment = Marshal.SizeOf(fieldType); + } + + internal static void ToManagedField(FieldInfo field, ref T fieldOwner, IntPtr fieldPtr, out int fieldOffset) + { + fieldOffset = Unsafe.SizeOf(); + if (fieldAlignment > 1) + { + IntPtr fieldStartPtr = fieldPtr; + fieldPtr = EnsureAlignment(fieldPtr, fieldAlignment); + fieldOffset += (fieldPtr - fieldStartPtr).ToInt32(); + } + + ref TField fieldValueRef = ref GetFieldReference(field, ref fieldOwner); + MarshalHelperValueType.ToManaged(ref fieldValueRef, fieldPtr, false); + } + + internal static void ToManagedFieldArray(FieldInfo field, ref T fieldOwner, IntPtr fieldPtr, out int fieldOffset) + { + // Follows the same marshalling semantics with reference types + fieldOffset = Unsafe.SizeOf(); + IntPtr fieldStartPtr = fieldPtr; + fieldPtr = EnsureAlignment(fieldPtr, IntPtr.Size); + fieldOffset += (fieldPtr - fieldStartPtr).ToInt32(); + + ref TField[] fieldValueRef = ref GetFieldReference(field, ref fieldOwner); + MarshalHelperValueType.ToManagedArray(ref fieldValueRef, Unsafe.Read(fieldPtr.ToPointer()), false); + } + + internal static void ToNativeField(FieldInfo field, ref T fieldOwner, IntPtr fieldPtr, out int fieldOffset) + { + fieldOffset = Unsafe.SizeOf(); + if (fieldAlignment > 1) + { + IntPtr startPtr = fieldPtr; + fieldPtr = EnsureAlignment(fieldPtr, fieldAlignment); + fieldOffset += (fieldPtr - startPtr).ToInt32(); + } + +#if USE_AOT + TField fieldValueRef = (TField)field.GetValue(fieldOwner); +#else + ref TField fieldValueRef = ref GetFieldReference(field, ref fieldOwner); +#endif + MarshalHelperValueType.ToNative(ref fieldValueRef, fieldPtr); + } + } + + private static class NullableValueTypeField + { + static NullableValueTypeField() + { + } + + internal static void ToManagedField(FieldInfo field, ref T fieldOwner, IntPtr fieldPtr, out int fieldOffset) + { + fieldOffset = 0; + } + + internal static void ToNativeField(FieldInfo field, ref T fieldOwner, IntPtr fieldPtr, out int fieldOffset) + { + fieldOffset = 0; + } + } + + private static class ReferenceTypeField where TField : class + { + internal static void ToManagedField(FieldInfo field, ref T fieldOwner, IntPtr fieldPtr, out int fieldOffset) + { + fieldOffset = Unsafe.SizeOf(); + IntPtr fieldStartPtr = fieldPtr; + fieldPtr = EnsureAlignment(fieldPtr, IntPtr.Size); + fieldOffset += (fieldPtr - fieldStartPtr).ToInt32(); + + ref TField fieldValueRef = ref GetFieldReference(field, ref fieldOwner); + MarshalHelperReferenceType.ToManaged(ref fieldValueRef, Unsafe.Read(fieldPtr.ToPointer()), false); + } + + internal static void ToNativeField(FieldInfo field, ref T fieldOwner, IntPtr fieldPtr, out int fieldOffset) + { + fieldOffset = Unsafe.SizeOf(); + IntPtr fieldStartPtr = fieldPtr; + fieldPtr = EnsureAlignment(fieldPtr, IntPtr.Size); + fieldOffset += (fieldPtr - fieldStartPtr).ToInt32(); + + ref TField fieldValueRef = ref GetFieldReference(field, ref fieldOwner); + MarshalHelperReferenceType.ToNative(ref fieldValueRef, fieldPtr); + } + } + } + + internal static class MarshalHelperValueType where T : struct + { + internal static void ToNativeWrapper(object managedObject, IntPtr nativePtr) + { + ToNative(ref Unsafe.Unbox(managedObject), nativePtr); + } + + internal static void ToNativeFieldWrapper(FieldInfo field, object fieldOwner, IntPtr nativePtr, out int fieldOffset) + { + MarshalHelper.ToNativeField(field, ref Unsafe.Unbox(fieldOwner), nativePtr, out fieldOffset); + } + + internal static void ToManaged(ref T managedValue, IntPtr nativePtr, bool byRef) + { + Type type = typeof(T); + if (type.IsByRef || byRef) + { + if (type.IsByRef) + type = type.GetElementType(); + Assert.IsTrue(type.IsValueType); + } + + if (type == typeof(IntPtr)) + managedValue = (T)(object)nativePtr; + else if (type == typeof(ManagedHandle)) + managedValue = (T)(object)ManagedHandle.FromIntPtr(nativePtr); + else if (MarshalHelper.marshallableFields != null) + { + IntPtr fieldPtr = nativePtr; + for (int i = 0; i < MarshalHelper.marshallableFields.Length; i++) + { + MarshalHelper.toManagedFieldMarshallers[i](MarshalHelper.marshallableFields[i], ref managedValue, fieldPtr, out int fieldOffset); + fieldPtr += fieldOffset; + } + Assert.IsTrue((fieldPtr - nativePtr) <= Unsafe.SizeOf()); + } + else + managedValue = Unsafe.Read(nativePtr.ToPointer()); + } + + internal static void ToManagedArray(ref T[] managedValue, IntPtr nativePtr, bool byRef) + { + if (byRef) + nativePtr = Marshal.ReadIntPtr(nativePtr); + + Type elementType = typeof(T); + if (nativePtr != IntPtr.Zero) + { + ManagedArray managedArray = Unsafe.As(ManagedHandle.FromIntPtr(nativePtr).Target); + if (ArrayFactory.GetMarshalledType(elementType) == elementType) + managedValue = Unsafe.As(managedArray.ToArray()); + else if (elementType.IsValueType) + managedValue = Unsafe.As(MarshalHelper.ToManagedArray(managedArray)); + else + managedValue = Unsafe.As(MarshalHelper.ToManagedArray(managedArray.ToSpan())); + } + else + managedValue = null; + } + + internal static void ToNative(ref T managedValue, IntPtr nativePtr) + { + if (typeof(T).IsByRef) + throw new NotImplementedException(); + + if (MarshalHelper.marshallableFields != null) + { + IntPtr fieldPtr = nativePtr; + for (int i = 0; i < MarshalHelper.marshallableFields.Length; i++) + { + MarshalHelper.toNativeFieldMarshallers[i](MarshalHelper.marshallableFields[i], ref managedValue, nativePtr, out int fieldOffset); + nativePtr += fieldOffset; + } + Assert.IsTrue((nativePtr - fieldPtr) <= Unsafe.SizeOf()); + } + else + Unsafe.AsRef(nativePtr.ToPointer()) = managedValue; + } + } + + internal static class MarshalHelperReferenceType where T : class + { + internal static void ToNativeWrapper(object managedObject, IntPtr nativePtr) + { + T managedValue = Unsafe.As(managedObject); + ToNative(ref managedValue, nativePtr); + } + + internal static void ToNativeFieldWrapper(FieldInfo field, object managedObject, IntPtr nativePtr, out int fieldOffset) + { + T managedValue = Unsafe.As(managedObject); + MarshalHelper.ToNativeField(field, ref managedValue, nativePtr, out fieldOffset); + } + + internal static void ToManaged(ref T managedValue, IntPtr nativePtr, bool byRef) + { + Type type = typeof(T); + if (byRef) + nativePtr = Marshal.ReadIntPtr(nativePtr); + + if (type == typeof(string)) + managedValue = Unsafe.As(ManagedString.ToManaged(nativePtr)); + else if (type.IsClass) + managedValue = nativePtr != IntPtr.Zero ? Unsafe.As(ManagedHandle.FromIntPtr(nativePtr).Target) : null; + else if (type.IsInterface) // Dictionary + managedValue = nativePtr != IntPtr.Zero ? Unsafe.As(ManagedHandle.FromIntPtr(nativePtr).Target) : null; + else + throw new NotImplementedException(); + } + + internal static void ToManagedArray(ref T[] managedValue, IntPtr nativePtr, bool byRef) + { + if (byRef) + nativePtr = Marshal.ReadIntPtr(nativePtr); + + if (nativePtr != IntPtr.Zero) + { + ManagedArray managedArray = Unsafe.As(ManagedHandle.FromIntPtr(nativePtr).Target); + managedValue = Unsafe.As(MarshalHelper.ToManagedArray(managedArray.ToSpan())); + } + else + managedValue = null; + } + + internal static void ToNative(ref T managedValue, IntPtr nativePtr) + { + Type type = typeof(T); + + IntPtr managedPtr; + if (type == typeof(string)) + managedPtr = ManagedString.ToNativeWeak(managedValue as string); + else if (type.IsPointer) + { + if (Pointer.Unbox(managedValue) == null) + managedPtr = IntPtr.Zero; + else if (managedValue is FlaxEngine.Object flaxObj) + managedPtr = FlaxEngine.Object.GetUnmanagedPtr(flaxObj); + else + managedPtr = ManagedHandle.ToIntPtr(managedValue, GCHandleType.Weak); + } + else if (type == typeof(Type)) + managedPtr = managedValue != null ? ManagedHandle.ToIntPtr(GetTypeGCHandle((Type)(object)managedValue)) : IntPtr.Zero; + else if (type.IsArray) + { + if (managedValue == null) + managedPtr = IntPtr.Zero; + else + { + var elementType = type.GetElementType(); + var arr = Unsafe.As(managedValue); + var marshalledType = ArrayFactory.GetMarshalledType(elementType); + ManagedArray managedArray; + if (marshalledType == elementType) + managedArray = ManagedArray.WrapNewArray(arr, type); + else if (elementType.IsValueType) + { + // Convert array of custom structures into internal native layout + managedArray = ManagedArray.AllocateNewArray(arr.Length, type, marshalledType); + IntPtr managedArrayPtr = managedArray.Pointer; + for (int i = 0; i < arr.Length; i++) + { + MarshalToNative(arr.GetValue(i), managedArrayPtr, elementType); + managedArrayPtr += managedArray.ElementSize; + } + } + else + managedArray = ManagedArrayToGCHandleWrappedArray(arr); + managedPtr = ManagedHandle.ToIntPtr(managedArray, GCHandleType.Weak); + } + } + else + managedPtr = managedValue != null ? ManagedHandle.ToIntPtr(managedValue, GCHandleType.Weak) : IntPtr.Zero; + + Unsafe.Write(nativePtr.ToPointer(), managedPtr); + } + } + + internal class MethodHolder + { + internal Type[] parameterTypes; + internal MethodInfo method; + internal Type returnType; +#if !USE_AOT + private Invoker.MarshalAndInvokeDelegate invokeDelegate; + private object delegInvoke; +#endif + + internal MethodHolder(MethodInfo method) + { + this.method = method; + returnType = method.ReturnType; + parameterTypes = method.GetParameterTypes(); + } + +#if !USE_AOT + internal bool TryGetDelegate(out Invoker.MarshalAndInvokeDelegate outDeleg, out object outDelegInvoke) + { + if (invokeDelegate == null) + { + List methodTypes = new List(); + if (!method.IsStatic) + methodTypes.Add(method.DeclaringType); + if (returnType != typeof(void)) + methodTypes.Add(returnType); + methodTypes.AddRange(parameterTypes); + + List genericParamTypes = new List(); + foreach (var type in methodTypes) + { + if (type.IsByRef) + genericParamTypes.Add(type.GetElementType()); + else if (type.IsPointer) + genericParamTypes.Add(typeof(IntPtr)); + else + genericParamTypes.Add(type); + } + + string invokerTypeName = $"{typeof(Invoker).FullName}+Invoker{(method.IsStatic ? "Static" : "")}{(returnType != typeof(void) ? "Ret" : "NoRet")}{parameterTypes.Length}{(genericParamTypes.Count > 0 ? "`" + genericParamTypes.Count : "")}"; + Type invokerType = Type.GetType(invokerTypeName); + if (invokerType != null) + { + if (genericParamTypes.Count != 0) + invokerType = invokerType.MakeGenericType(genericParamTypes.ToArray()); + invokeDelegate = invokerType.GetMethod(nameof(Invoker.InvokerStaticNoRet0.MarshalAndInvoke), BindingFlags.Static | BindingFlags.NonPublic).CreateDelegate(); + delegInvoke = invokerType.GetMethod(nameof(Invoker.InvokerStaticNoRet0.CreateDelegate), BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, new object[] { method }); + } + } + + outDeleg = invokeDelegate; + outDelegInvoke = delegInvoke; + return outDeleg != null; + } +#endif + } + + internal static ManagedHandle GetMethodGCHandle(MethodInfo method) + { + MethodHolder methodHolder = new MethodHolder(method); + ManagedHandle handle = ManagedHandle.Alloc(methodHolder); +#if FLAX_EDITOR + if (methodHolder.parameterTypes.Any(x => x.IsCollectible) || method.IsCollectible) + methodHandlesCollectible.Add(handle); + else +#endif + { + methodHandles.Add(handle); + } + return handle; + } + + internal static ManagedHandle GetAssemblyHandle(Assembly assembly) + { + if (!assemblyHandles.TryGetValue(assembly, out ManagedHandle handle)) + { + handle = ManagedHandle.Alloc(assembly); + assemblyHandles.Add(assembly, handle); + } + return handle; + } + + internal class FieldHolder + { + internal FieldInfo field; + internal MarshalToNativeFieldDelegate toNativeMarshaller; + + internal FieldHolder(FieldInfo field, Type type) + { + this.field = field; + toNativeMarshaller = GetToNativeFieldMarshallerDelegate(type); + } + } + + internal static class ArrayFactory + { + private delegate Array CreateArrayDelegate(long size); + + private static ConcurrentDictionary marshalledTypes = new ConcurrentDictionary(1, 3); + private static ConcurrentDictionary createArrayDelegates = new ConcurrentDictionary(1, 3); + + internal static Type GetMarshalledType(Type elementType) + { + static Type Factory(Type type) + { + Type marshalType; + if (IsBlittable(type)) + marshalType = type; + else + marshalType = GetInternalType(type) ?? typeof(IntPtr); + return marshalType; + } + + if (marshalledTypes.TryGetValue(elementType, out var marshalledType)) + return marshalledType; + return marshalledTypes.GetOrAdd(elementType, Factory); + } + + internal static Array CreateArray(Type type, long size) + { + static CreateArrayDelegate Factory(Type type) + { + Type marshalledType = GetMarshalledType(type); + MethodInfo method = typeof(Internal<>).MakeGenericType(marshalledType).GetMethod(nameof(Internal.CreateArrayDelegate), BindingFlags.Static | BindingFlags.NonPublic); + return method.CreateDelegate(); + } + + if (createArrayDelegates.TryGetValue(type, out var deleg)) + return deleg(size); + return createArrayDelegates.GetOrAdd(type, Factory)(size); + } + + + private static class Internal + { + internal static Array CreateArrayDelegate(long size) => new T[size]; + } + } + + internal static class ValueTypeUnboxer + { + private delegate IntPtr UnboxerDelegate(object value); + + private static ConcurrentDictionary unboxers = new ConcurrentDictionary(1, 3); + private static MethodInfo unboxerMethod = typeof(ValueTypeUnboxer).GetMethod(nameof(ValueTypeUnboxer.UnboxPointer), BindingFlags.Static | BindingFlags.NonPublic); + private static MethodInfo unboxerToNativeMethod = typeof(ValueTypeUnboxer).GetMethod(nameof(ValueTypeUnboxer.UnboxPointerWithConverter), BindingFlags.Static | BindingFlags.NonPublic); + + internal static IntPtr GetPointer(object value, Type type) + { + if (!unboxers.TryGetValue(type, out var deleg)) + { + // Non-POD structures use internal layout (eg. SpriteHandleManaged in C++ with SpriteHandleMarshaller.SpriteHandleInternal in C#) so convert C# data into C++ data + var attr = type.GetCustomAttribute(); + var toNativeMethod = attr?.NativeType.GetMethod("ToNative", BindingFlags.Static | BindingFlags.NonPublic); + if (toNativeMethod != null) + { + deleg = unboxerToNativeMethod.MakeGenericMethod(toNativeMethod.ReturnType).CreateDelegate(); + } + else + { + deleg = unboxerMethod.MakeGenericMethod(type).CreateDelegate(); + } + deleg = unboxers.GetOrAdd(type, deleg); + } + return deleg(value); + } + + private static IntPtr UnboxPointer(object value) where T : struct + { + return new IntPtr(Unsafe.AsPointer(ref Unsafe.Unbox(value))); + } + + private static IntPtr UnboxPointerWithConverter(object value) where T : struct + { + var type = value.GetType(); + var attr = type.GetCustomAttribute(); + var toNative = attr.NativeType.GetMethod("ToNative", BindingFlags.Static | BindingFlags.NonPublic); + value = toNative.Invoke(null, new[] { value }); + return new IntPtr(Unsafe.AsPointer(ref Unsafe.Unbox(value))); + } + } + + private delegate IntPtr InvokeThunkDelegate(ManagedHandle instanceHandle, IntPtr param1, IntPtr param2, IntPtr param3, IntPtr param4, IntPtr param5, IntPtr param6, IntPtr param7); + + /// + /// Returns all types that that owned by this assembly. + /// + private static Type[] GetAssemblyTypes(Assembly assembly) + { + var referencedAssemblies = assembly.GetReferencedAssemblies(); + var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + var referencedTypes = new List(); + foreach (var assemblyName in referencedAssemblies) + { + var asm = allAssemblies.FirstOrDefault(x => x.GetName().Name == assemblyName.Name); + if (asm == null) + continue; + referencedTypes.AddRange(asm.DefinedTypes.Select(x => x.FullName).ToArray()); + } + + // TODO: use MetadataReader to read types without loading any of the referenced assemblies? + // https://makolyte.com/csharp-get-a-list-of-types-defined-in-an-assembly-without-loading-it/ + + // We need private types of this assembly too, DefinedTypes contains a lot of types from other assemblies... + var types = referencedTypes.Any() ? assembly.DefinedTypes.Where(x => !referencedTypes.Contains(x.FullName)).ToArray() : assembly.DefinedTypes.ToArray(); + + Assert.IsTrue(Utils.GetAssemblies().Count(x => x.GetName().Name == "FlaxEngine.CSharp") == 1); + return types; + } + + /// + /// Returns a static ManagedHandle for given Type, and caches it if needed. + /// + internal static ManagedHandle GetTypeGCHandle(Type type) + { + if (typeHandleCache.TryGetValue(type, out ManagedHandle handle)) + return handle; +#if FLAX_EDITOR + if (typeHandleCacheCollectible.TryGetValue(type, out handle)) + return handle; +#endif + + handle = ManagedHandle.Alloc(type); +#if FLAX_EDITOR + if (type.IsCollectible) // check if generic parameters are also collectible? + typeHandleCacheCollectible.Add(type, handle); + else +#endif + { + typeHandleCache.Add(type, handle); + } + + return handle; + } + + private static class DelegateHelpers + { +#if USE_AOT + internal static void InitMethods() + { + } +#else + private static Func MakeNewCustomDelegateFunc; +#if FLAX_EDITOR + private static Func MakeNewCustomDelegateFuncCollectible; +#endif + + internal static void InitMethods() + { + MakeNewCustomDelegateFunc = + typeof(Expression).Assembly.GetType("System.Linq.Expressions.Compiler.DelegateHelpers") + .GetMethod("MakeNewCustomDelegate", BindingFlags.NonPublic | BindingFlags.Static).CreateDelegate>(); + +#if FLAX_EDITOR + // Load System.Linq.Expressions assembly to collectible ALC. + // The dynamic assembly where delegates are stored is cached in the DelegateHelpers class, so we should + // use the DelegateHelpers in collectible ALC to make sure the delegates are also stored in the same ALC. + Assembly assembly = scriptingAssemblyLoadContext.LoadFromAssemblyPath(typeof(Expression).Assembly.Location); + MakeNewCustomDelegateFuncCollectible = + assembly.GetType("System.Linq.Expressions.Compiler.DelegateHelpers") + .GetMethod("MakeNewCustomDelegate", BindingFlags.NonPublic | BindingFlags.Static).CreateDelegate>(); + + // Create dummy delegates to force the dynamic Snippets assembly to be loaded in correcet ALCs + MakeNewCustomDelegateFunc(new[] { typeof(void) }); + { + // Ensure the new delegate is placed in the collectible ALC + using var ctx = scriptingAssemblyLoadContext.EnterContextualReflection(); + MakeNewCustomDelegateFuncCollectible(new[] { typeof(void) }); + } +#endif + } + + internal static Type MakeNewCustomDelegate(Type[] parameters) + { +#if FLAX_EDITOR + if (parameters.Any(x => x.IsCollectible)) + return MakeNewCustomDelegateFuncCollectible(parameters); +#endif + return MakeNewCustomDelegateFunc(parameters); + } +#endif + } + +#if !USE_AOT + /// + /// Wrapper class for invoking function pointers from unmanaged code. + /// + internal class ThunkContext + { + internal MethodInfo method; + internal Type[] parameterTypes; + internal Invoker.InvokeThunkDelegate methodDelegate; + internal object methodDelegateContext; + + internal ThunkContext(MethodInfo method) + { + this.method = method; + parameterTypes = method.GetParameterTypes(); + + // Thunk delegates don't support IsByRef parameters (use generic invocation that handles 'out' and 'ref' prams) + foreach (var type in parameterTypes) + { + if (type.IsByRef) + return; + } + + List methodTypes = new List(); + if (!method.IsStatic) + methodTypes.Add(method.DeclaringType); + if (method.ReturnType != typeof(void)) + methodTypes.Add(method.ReturnType); + methodTypes.AddRange(parameterTypes); + + List genericParamTypes = new List(); + foreach (var type in methodTypes) + { + if (type.IsByRef) + genericParamTypes.Add(type.GetElementType()); + else if (type.IsPointer) + genericParamTypes.Add(typeof(IntPtr)); + else + genericParamTypes.Add(type); + } + + string invokerTypeName = $"{typeof(Invoker).FullName}+Invoker{(method.IsStatic ? "Static" : "")}{(method.ReturnType != typeof(void) ? "Ret" : "NoRet")}{parameterTypes.Length}{(genericParamTypes.Count > 0 ? "`" + genericParamTypes.Count : "")}"; + Type invokerType = Type.GetType(invokerTypeName); + if (invokerType != null) + { + if (genericParamTypes.Count != 0) + invokerType = invokerType.MakeGenericType(genericParamTypes.ToArray()); + methodDelegate = invokerType.GetMethod(nameof(Invoker.InvokerStaticNoRet0.InvokeThunk), BindingFlags.Static | BindingFlags.NonPublic).CreateDelegate(); + methodDelegateContext = invokerType.GetMethod(nameof(Invoker.InvokerStaticNoRet0.CreateInvokerDelegate), BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, new object[] { method }); + } + + if (methodDelegate != null) + Assert.IsTrue(methodDelegateContext != null); + } + + public IntPtr InvokeThunk(ManagedHandle instanceHandle, IntPtr param1, IntPtr param2, IntPtr param3, IntPtr param4, IntPtr param5, IntPtr param6, IntPtr param7) + { + IntPtr* nativePtrs = stackalloc IntPtr[] { param1, param2, param3, param4, param5, param6, param7 }; + if (methodDelegate != null) + { + IntPtr returnValue; + try + { + returnValue = methodDelegate(methodDelegateContext, instanceHandle, nativePtrs); + } + catch (Exception exception) + { + // Returned exception is the last parameter + IntPtr exceptionPtr = nativePtrs[parameterTypes.Length]; + if (exceptionPtr != IntPtr.Zero) + Marshal.WriteIntPtr(exceptionPtr, ManagedHandle.ToIntPtr(exception, GCHandleType.Weak)); + return IntPtr.Zero; + } + return returnValue; + } + else + { + // The parameters are wrapped (boxed) in GCHandles + object returnObject; + int numParams = parameterTypes.Length; + object[] methodParameters = new object[numParams]; + for (int i = 0; i < numParams; i++) + { + IntPtr nativePtr = nativePtrs[i]; + object managed = null; + if (nativePtr != IntPtr.Zero) + { + Type type = parameterTypes[i]; + Type elementType = type.GetElementType(); + if (type.IsByRef) + { + // References use indirection to support value returning + nativePtr = Marshal.ReadIntPtr(nativePtr); + type = elementType; + } + if (type.IsArray) + managed = MarshalToManaged(nativePtr, type); // Array might be in internal format of custom structs so unbox if need to + else + managed = ManagedHandle.FromIntPtr(nativePtr).Target; + } + methodParameters[i] = managed; + } + + try + { + returnObject = method.Invoke(instanceHandle.IsAllocated ? instanceHandle.Target : null, methodParameters); + } + catch (Exception exception) + { + // Returned exception is the last parameter + IntPtr exceptionPtr = nativePtrs[numParams]; + if (exceptionPtr != IntPtr.Zero) + Marshal.WriteIntPtr(exceptionPtr, ManagedHandle.ToIntPtr(exception, GCHandleType.Weak)); + return IntPtr.Zero; + } + + // Marshal reference parameters back to original unmanaged references + for (int i = 0; i < numParams; i++) + { + IntPtr nativePtr = nativePtrs[i]; + Type type = parameterTypes[i]; + object managed = methodParameters[i]; + if (nativePtr != IntPtr.Zero && type.IsByRef) + { + type = type.GetElementType(); + if (managed == null) + Marshal.WriteIntPtr(nativePtr, IntPtr.Zero); + else if (type.IsArray) + MarshalToNative(managed, nativePtr, type); + else + Marshal.WriteIntPtr(nativePtr, ManagedHandle.ToIntPtr(ManagedHandle.Alloc(managed, GCHandleType.Weak))); + } + } + + // Return value + return Invoker.MarshalReturnValueThunkGeneric(method.ReturnType, returnObject); + } + } + } +#endif + } + + internal class NativeInteropException : Exception + { + public NativeInteropException(string message) + : base(message) + { +#if !BUILD_RELEASE + Debug.Logger.LogHandler.LogWrite(LogType.Error, "Native interop exception!"); +#endif + } + } +} + +#endif diff --git a/Source/Engine/Engine/RandomStream.cs b/Source/Engine/Engine/RandomStream.cs index 90be3bd2c..37bedcb5c 100644 --- a/Source/Engine/Engine/RandomStream.cs +++ b/Source/Engine/Engine/RandomStream.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using System.Runtime.CompilerServices; diff --git a/Source/Engine/Engine/RandomUtil.cs b/Source/Engine/Engine/RandomUtil.cs index ea95140cc..f17f6b361 100644 --- a/Source/Engine/Engine/RandomUtil.cs +++ b/Source/Engine/Engine/RandomUtil.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using System; using System.Runtime.CompilerServices; diff --git a/Source/Engine/Engine/iOS/iOSGame.h b/Source/Engine/Engine/iOS/iOSGame.h new file mode 100644 index 000000000..0250a8922 --- /dev/null +++ b/Source/Engine/Engine/iOS/iOSGame.h @@ -0,0 +1,19 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#pragma once + +#if PLATFORM_IOS + +#include "../Base/GameBase.h" + +/// +/// The game class implementation for iOS platform. +/// +/// +class iOSGame : public GameBase +{ +}; + +typedef iOSGame Game; + +#endif diff --git a/Source/Engine/Graphics/Graphics.Build.cs b/Source/Engine/Graphics/Graphics.Build.cs index 5a617261a..1e17af3f5 100644 --- a/Source/Engine/Graphics/Graphics.Build.cs +++ b/Source/Engine/Graphics/Graphics.Build.cs @@ -75,6 +75,7 @@ public class Graphics : EngineModule options.PrivateDependencies.Add("GraphicsDevicePS5"); break; case TargetPlatform.Android: + case TargetPlatform.iOS: options.PrivateDependencies.Add("GraphicsDeviceVulkan"); break; case TargetPlatform.Switch: diff --git a/Source/Engine/Graphics/Models/Mesh.cpp b/Source/Engine/Graphics/Models/Mesh.cpp index 335b4cb69..e5ba5488d 100644 --- a/Source/Engine/Graphics/Models/Mesh.cpp +++ b/Source/Engine/Graphics/Models/Mesh.cpp @@ -11,15 +11,13 @@ #include "Engine/Graphics/RenderTask.h" #include "Engine/Profiler/ProfilerCPU.h" #include "Engine/Renderer/RenderList.h" +#include "Engine/Scripting/ManagedCLR/MCore.h" #include "Engine/Serialization/MemoryReadStream.h" #include "Engine/Threading/Task.h" #include "Engine/Threading/Threading.h" #if USE_EDITOR #include "Engine/Renderer/GBufferPass.h" #endif -#if USE_MONO -#include -#endif namespace { @@ -117,28 +115,28 @@ namespace #if !COMPILE_WITHOUT_CSHARP template - bool UpdateMesh(Mesh* mesh, uint32 vertexCount, uint32 triangleCount, MonoArray* verticesObj, MonoArray* trianglesObj, MonoArray* normalsObj, MonoArray* tangentsObj, MonoArray* uvObj, MonoArray* colorsObj) + bool UpdateMesh(Mesh* mesh, uint32 vertexCount, uint32 triangleCount, MArray* verticesObj, MArray* trianglesObj, MArray* normalsObj, MArray* tangentsObj, MArray* uvObj, MArray* colorsObj) { - ASSERT((uint32)mono_array_length(verticesObj) >= vertexCount); - ASSERT((uint32)mono_array_length(trianglesObj) / 3 >= triangleCount); - auto vertices = (Float3*)(void*)mono_array_addr_with_size(verticesObj, sizeof(Float3), 0); - auto triangles = (IndexType*)(void*)mono_array_addr_with_size(trianglesObj, sizeof(IndexType), 0); - const auto normals = normalsObj ? (Float3*)(void*)mono_array_addr_with_size(normalsObj, sizeof(Float3), 0) : nullptr; - const auto tangents = tangentsObj ? (Float3*)(void*)mono_array_addr_with_size(tangentsObj, sizeof(Float3), 0) : nullptr; - const auto uvs = uvObj ? (Float2*)(void*)mono_array_addr_with_size(uvObj, sizeof(Float2), 0) : nullptr; - const auto colors = colorsObj ? (Color32*)(void*)mono_array_addr_with_size(colorsObj, sizeof(Color32), 0) : nullptr; + ASSERT((uint32)MCore::Array::GetLength(verticesObj) >= vertexCount); + ASSERT((uint32)MCore::Array::GetLength(trianglesObj) / 3 >= triangleCount); + auto vertices = MCore::Array::GetAddress(verticesObj); + auto triangles = MCore::Array::GetAddress(trianglesObj); + const auto normals = normalsObj ? MCore::Array::GetAddress(normalsObj) : nullptr; + const auto tangents = tangentsObj ? MCore::Array::GetAddress(tangentsObj) : nullptr; + const auto uvs = uvObj ? MCore::Array::GetAddress(uvObj) : nullptr; + const auto colors = colorsObj ? MCore::Array::GetAddress(colorsObj) : nullptr; return UpdateMesh(mesh, vertexCount, triangleCount, vertices, triangles, normals, tangents, uvs, colors); } template - bool UpdateTriangles(Mesh* mesh, int32 triangleCount, MonoArray* trianglesObj) + bool UpdateTriangles(Mesh* mesh, int32 triangleCount, MArray* trianglesObj) { const auto model = mesh->GetModel(); ASSERT(model && model->IsVirtual() && trianglesObj); // Get buffer data - ASSERT((int32)mono_array_length(trianglesObj) / 3 >= triangleCount); - auto ib = (IndexType*)(void*)mono_array_addr_with_size(trianglesObj, sizeof(IndexType), 0); + ASSERT(MCore::Array::GetLength(trianglesObj) / 3 >= triangleCount); + auto ib = MCore::Array::GetAddress(trianglesObj); return mesh->UpdateTriangles(triangleCount, ib); } @@ -717,22 +715,22 @@ ScriptingObject* Mesh::GetParentModel() #if !COMPILE_WITHOUT_CSHARP -bool Mesh::UpdateMeshUInt(int32 vertexCount, int32 triangleCount, MonoArray* verticesObj, MonoArray* trianglesObj, MonoArray* normalsObj, MonoArray* tangentsObj, MonoArray* uvObj, MonoArray* colorsObj) +bool Mesh::UpdateMeshUInt(int32 vertexCount, int32 triangleCount, MArray* verticesObj, MArray* trianglesObj, MArray* normalsObj, MArray* tangentsObj, MArray* uvObj, MArray* colorsObj) { return ::UpdateMesh(this, (uint32)vertexCount, (uint32)triangleCount, verticesObj, trianglesObj, normalsObj, tangentsObj, uvObj, colorsObj); } -bool Mesh::UpdateMeshUShort(int32 vertexCount, int32 triangleCount, MonoArray* verticesObj, MonoArray* trianglesObj, MonoArray* normalsObj, MonoArray* tangentsObj, MonoArray* uvObj, MonoArray* colorsObj) +bool Mesh::UpdateMeshUShort(int32 vertexCount, int32 triangleCount, MArray* verticesObj, MArray* trianglesObj, MArray* normalsObj, MArray* tangentsObj, MArray* uvObj, MArray* colorsObj) { return ::UpdateMesh(this, (uint32)vertexCount, (uint32)triangleCount, verticesObj, trianglesObj, normalsObj, tangentsObj, uvObj, colorsObj); } -bool Mesh::UpdateTrianglesUInt(int32 triangleCount, MonoArray* trianglesObj) +bool Mesh::UpdateTrianglesUInt(int32 triangleCount, MArray* trianglesObj) { return ::UpdateTriangles(this, triangleCount, trianglesObj); } -bool Mesh::UpdateTrianglesUShort(int32 triangleCount, MonoArray* trianglesObj) +bool Mesh::UpdateTrianglesUShort(int32 triangleCount, MArray* trianglesObj) { return ::UpdateTriangles(this, triangleCount, trianglesObj); } @@ -746,7 +744,7 @@ enum class InternalBufferType IB32 = 4, }; -MonoArray* Mesh::DownloadBuffer(bool forceGpu, MonoReflectionType* resultType, int32 typeI) +MArray* Mesh::DownloadBuffer(bool forceGpu, MTypeObject* resultType, int32 typeI) { auto mesh = this; auto type = (InternalBufferType)typeI; @@ -824,8 +822,8 @@ MonoArray* Mesh::DownloadBuffer(bool forceGpu, MonoReflectionType* resultType, i } // Convert into managed array - MonoArray* result = mono_array_new(mono_domain_get(), mono_type_get_class(mono_reflection_type_get_type(resultType)), dataCount); - void* managedArrayPtr = mono_array_addr_with_size(result, 0, 0); + MArray* result = MCore::Array::New(MCore::Type::GetClass(INTERNAL_TYPE_OBJECT_GET(resultType)), dataCount); + void* managedArrayPtr = MCore::Array::GetAddress(result); const int32 elementSize = data.Length() / dataCount; switch (type) { diff --git a/Source/Engine/Graphics/Models/Mesh.h b/Source/Engine/Graphics/Models/Mesh.h index 9b1ab4846..226134022 100644 --- a/Source/Engine/Graphics/Models/Mesh.h +++ b/Source/Engine/Graphics/Models/Mesh.h @@ -92,7 +92,6 @@ public: } #if USE_PRECISE_MESH_INTERSECTS - /// /// Gets the collision proxy used by the mesh. /// @@ -100,7 +99,6 @@ public: { return _collisionProxy; } - #endif public: @@ -317,10 +315,10 @@ private: // Internal bindings API_FUNCTION(NoProxy) ScriptingObject* GetParentModel(); #if !COMPILE_WITHOUT_CSHARP - API_FUNCTION(NoProxy) bool UpdateMeshUInt(int32 vertexCount, int32 triangleCount, MonoArray* verticesObj, MonoArray* trianglesObj, MonoArray* normalsObj, MonoArray* tangentsObj, MonoArray* uvObj, MonoArray* colorsObj); - API_FUNCTION(NoProxy) bool UpdateMeshUShort(int32 vertexCount, int32 triangleCount, MonoArray* verticesObj, MonoArray* trianglesObj, MonoArray* normalsObj, MonoArray* tangentsObj, MonoArray* uvObj, MonoArray* colorsObj); - API_FUNCTION(NoProxy) bool UpdateTrianglesUInt(int32 triangleCount, MonoArray* trianglesObj); - API_FUNCTION(NoProxy) bool UpdateTrianglesUShort(int32 triangleCount, MonoArray* trianglesObj); - API_FUNCTION(NoProxy) MonoArray* DownloadBuffer(bool forceGpu, MonoReflectionType* resultType, int32 typeI); + API_FUNCTION(NoProxy) bool UpdateMeshUInt(int32 vertexCount, int32 triangleCount, MArray* verticesObj, MArray* trianglesObj, MArray* normalsObj, MArray* tangentsObj, MArray* uvObj, MArray* colorsObj); + API_FUNCTION(NoProxy) bool UpdateMeshUShort(int32 vertexCount, int32 triangleCount, MArray* verticesObj, MArray* trianglesObj, MArray* normalsObj, MArray* tangentsObj, MArray* uvObj, MArray* colorsObj); + API_FUNCTION(NoProxy) bool UpdateTrianglesUInt(int32 triangleCount, MArray* trianglesObj); + API_FUNCTION(NoProxy) bool UpdateTrianglesUShort(int32 triangleCount, MArray* trianglesObj); + API_FUNCTION(NoProxy) MArray* DownloadBuffer(bool forceGpu, MTypeObject* resultType, int32 typeI); #endif }; diff --git a/Source/Engine/Graphics/Models/ModelData.cpp b/Source/Engine/Graphics/Models/ModelData.cpp index 3522e350b..afa591e01 100644 --- a/Source/Engine/Graphics/Models/ModelData.cpp +++ b/Source/Engine/Graphics/Models/ModelData.cpp @@ -766,21 +766,14 @@ bool ModelData::Pack2SkinnedModelHeader(WriteStream* stream) const return true; } const int32 lodCount = GetLODsCount(); - if (lodCount == 0 || lodCount > MODEL_MAX_LODS) + if (lodCount > MODEL_MAX_LODS) { Log::ArgumentOutOfRangeException(); return true; } - if (Materials.IsEmpty()) - { - Log::ArgumentOutOfRangeException(TEXT("MaterialSlots"), TEXT("Material slots collection cannot be empty.")); - return true; - } - if (!HasSkeleton()) - { - Log::InvalidOperationException(TEXT("Missing skeleton.")); - return true; - } + + // Version + stream->WriteByte(1); // Min Screen Size stream->WriteFloat(MinScreenSize); @@ -792,7 +785,6 @@ bool ModelData::Pack2SkinnedModelHeader(WriteStream* stream) const for (int32 materialSlotIndex = 0; materialSlotIndex < Materials.Count(); materialSlotIndex++) { auto& slot = Materials[materialSlotIndex]; - stream->Write(slot.AssetID); stream->WriteByte(static_cast(slot.ShadowsMode)); stream->WriteString(slot.Name, 11); @@ -878,6 +870,11 @@ bool ModelData::Pack2SkinnedModelHeader(WriteStream* stream) const } } + // Retargeting + { + stream->WriteInt32(0); + } + return false; } diff --git a/Source/Engine/Graphics/Models/SkeletonData.h b/Source/Engine/Graphics/Models/SkeletonData.h index 035f8c10a..816f69c85 100644 --- a/Source/Engine/Graphics/Models/SkeletonData.h +++ b/Source/Engine/Graphics/Models/SkeletonData.h @@ -88,7 +88,6 @@ public: /// /// Gets the root node reference. /// - /// The root node. FORCE_INLINE SkeletonNode& RootNode() { ASSERT(Nodes.HasItems()); @@ -98,7 +97,6 @@ public: /// /// Gets the root node reference. /// - /// The root node. FORCE_INLINE const SkeletonNode& RootNode() const { ASSERT(Nodes.HasItems()); @@ -108,14 +106,13 @@ public: /// /// Swaps the contents of object with the other object without copy operation. Performs fast internal data exchange. /// - /// The other object. void Swap(SkeletonData& other) { Nodes.Swap(other.Nodes); Bones.Swap(other.Bones); } - int32 FindNode(const StringView& name) + int32 FindNode(const StringView& name) const { for (int32 i = 0; i < Nodes.Count(); i++) { @@ -125,7 +122,7 @@ public: return -1; } - int32 FindBone(int32 nodeIndex) + int32 FindBone(int32 nodeIndex) const { for (int32 i = 0; i < Bones.Count(); i++) { @@ -135,6 +132,14 @@ public: return -1; } + uint64 GetMemoryUsage() const + { + uint64 result = Nodes.Capacity() * sizeof(SkeletonNode) + Bones.Capacity() * sizeof(SkeletonBone); + for (const auto& e : Nodes) + result += (e.Name.Length() + 1) * sizeof(Char); + return result; + } + /// /// Releases data. /// diff --git a/Source/Engine/Graphics/Models/SkinnedMesh.cpp b/Source/Engine/Graphics/Models/SkinnedMesh.cpp index f33b8b4fd..b6c966508 100644 --- a/Source/Engine/Graphics/Models/SkinnedMesh.cpp +++ b/Source/Engine/Graphics/Models/SkinnedMesh.cpp @@ -12,11 +12,9 @@ #include "Engine/Renderer/RenderList.h" #include "Engine/Serialization/MemoryReadStream.h" #include "Engine/Profiler/ProfilerCPU.h" +#include "Engine/Scripting/ManagedCLR/MCore.h" #include "Engine/Threading/Task.h" #include "Engine/Threading/Threading.h" -#if USE_MONO -#include -#endif void SkinnedMesh::Init(SkinnedModel* model, int32 lodIndex, int32 index, int32 materialSlotIndex, const BoundingBox& box, const BoundingSphere& sphere) { @@ -333,6 +331,7 @@ bool SkinnedMesh::DownloadDataCPU(MeshBufferType type, BytesContainer& result, i MemoryReadStream stream(chunk->Get(), chunk->Size()); // Seek to find mesh location + byte version = stream.ReadByte(); for (int32 i = 0; i <= _index; i++) { // #MODEL_DATA_FORMAT_USAGE @@ -398,18 +397,18 @@ ScriptingObject* SkinnedMesh::GetParentModel() #if !COMPILE_WITHOUT_CSHARP template -bool UpdateMesh(SkinnedMesh* mesh, MonoArray* verticesObj, MonoArray* trianglesObj, MonoArray* blendIndicesObj, MonoArray* blendWeightsObj, MonoArray* normalsObj, MonoArray* tangentsObj, MonoArray* uvObj) +bool UpdateMesh(SkinnedMesh* mesh, MArray* verticesObj, MArray* trianglesObj, MArray* blendIndicesObj, MArray* blendWeightsObj, MArray* normalsObj, MArray* tangentsObj, MArray* uvObj) { auto model = mesh->GetSkinnedModel(); ASSERT(model && model->IsVirtual() && verticesObj && trianglesObj && blendIndicesObj && blendWeightsObj); // Get buffers data - const auto vertexCount = (uint32)mono_array_length(verticesObj); - const auto triangleCount = (uint32)mono_array_length(trianglesObj) / 3; - auto vertices = (Float3*)(void*)mono_array_addr_with_size(verticesObj, sizeof(Float3), 0); - auto ib = (IndexType*)(void*)mono_array_addr_with_size(trianglesObj, sizeof(int32), 0); - auto blendIndices = (Int4*)(void*)mono_array_addr_with_size(blendIndicesObj, sizeof(Int4), 0); - auto blendWeights = (Float4*)(void*)mono_array_addr_with_size(blendWeightsObj, sizeof(Float4), 0); + const auto vertexCount = (uint32)MCore::Array::GetLength(verticesObj); + const auto triangleCount = (uint32)MCore::Array::GetLength(trianglesObj) / 3; + auto vertices = MCore::Array::GetAddress(verticesObj); + auto ib = MCore::Array::GetAddress(trianglesObj); + auto blendIndices = MCore::Array::GetAddress(blendIndicesObj); + auto blendWeights = MCore::Array::GetAddress(blendWeightsObj); Array vb; vb.Resize(vertexCount); for (uint32 i = 0; i < vertexCount; i++) @@ -418,10 +417,10 @@ bool UpdateMesh(SkinnedMesh* mesh, MonoArray* verticesObj, MonoArray* trianglesO } if (normalsObj) { - const auto normals = (Float3*)(void*)mono_array_addr_with_size(normalsObj, sizeof(Float3), 0); + const auto normals = MCore::Array::GetAddress(normalsObj); if (tangentsObj) { - const auto tangents = (Float3*)(void*)mono_array_addr_with_size(tangentsObj, sizeof(Float3), 0); + const auto tangents = MCore::Array::GetAddress(tangentsObj); for (uint32 i = 0; i < vertexCount; i++) { // Peek normal and tangent @@ -475,7 +474,7 @@ bool UpdateMesh(SkinnedMesh* mesh, MonoArray* verticesObj, MonoArray* trianglesO } if (uvObj) { - const auto uvs = (Float2*)(void*)mono_array_addr_with_size(uvObj, sizeof(Float2), 0); + const auto uvs = MCore::Array::GetAddress(uvObj); for (uint32 i = 0; i < vertexCount; i++) vb[i].TexCoord = Half2(uvs[i]); } @@ -499,12 +498,12 @@ bool UpdateMesh(SkinnedMesh* mesh, MonoArray* verticesObj, MonoArray* trianglesO return mesh->UpdateMesh(vertexCount, triangleCount, vb.Get(), ib); } -bool SkinnedMesh::UpdateMeshUInt(MonoArray* verticesObj, MonoArray* trianglesObj, MonoArray* blendIndicesObj, MonoArray* blendWeightsObj, MonoArray* normalsObj, MonoArray* tangentsObj, MonoArray* uvObj) +bool SkinnedMesh::UpdateMeshUInt(MArray* verticesObj, MArray* trianglesObj, MArray* blendIndicesObj, MArray* blendWeightsObj, MArray* normalsObj, MArray* tangentsObj, MArray* uvObj) { return ::UpdateMesh(this, verticesObj, trianglesObj, blendIndicesObj, blendWeightsObj, normalsObj, tangentsObj, uvObj); } -bool SkinnedMesh::UpdateMeshUShort(MonoArray* verticesObj, MonoArray* trianglesObj, MonoArray* blendIndicesObj, MonoArray* blendWeightsObj, MonoArray* normalsObj, MonoArray* tangentsObj, MonoArray* uvObj) +bool SkinnedMesh::UpdateMeshUShort(MArray* verticesObj, MArray* trianglesObj, MArray* blendIndicesObj, MArray* blendWeightsObj, MArray* normalsObj, MArray* tangentsObj, MArray* uvObj) { return ::UpdateMesh(this, verticesObj, trianglesObj, blendIndicesObj, blendWeightsObj, normalsObj, tangentsObj, uvObj); } @@ -516,7 +515,7 @@ enum class InternalBufferType IB32 = 4, }; -MonoArray* SkinnedMesh::DownloadBuffer(bool forceGpu, MonoReflectionType* resultType, int32 typeI) +MArray* SkinnedMesh::DownloadBuffer(bool forceGpu, MTypeObject* resultType, int32 typeI) { SkinnedMesh* mesh = this; InternalBufferType type = (InternalBufferType)typeI; @@ -582,8 +581,8 @@ MonoArray* SkinnedMesh::DownloadBuffer(bool forceGpu, MonoReflectionType* result } // Convert into managed array - MonoArray* result = mono_array_new(mono_domain_get(), mono_type_get_class(mono_reflection_type_get_type(resultType)), dataCount); - void* managedArrayPtr = mono_array_addr_with_size(result, 0, 0); + MArray* result = MCore::Array::New(MCore::Type::GetClass(INTERNAL_TYPE_OBJECT_GET(resultType)), dataCount); + void* managedArrayPtr = MCore::Array::GetAddress(result); const int32 elementSize = data.Length() / dataCount; switch (type) { diff --git a/Source/Engine/Graphics/Models/SkinnedMesh.h b/Source/Engine/Graphics/Models/SkinnedMesh.h index 57a382cff..9e0b184b2 100644 --- a/Source/Engine/Graphics/Models/SkinnedMesh.h +++ b/Source/Engine/Graphics/Models/SkinnedMesh.h @@ -155,15 +155,6 @@ public: /// True whether the two objects intersected bool Intersects(const Ray& ray, const Transform& transform, Real& distance, Vector3& normal) const; - /// - /// Retrieves the eight corners of the bounding box. - /// - /// An array of points representing the eight corners of the bounding box. - FORCE_INLINE void GetCorners(Vector3 corners[8]) const - { - _box.GetCorners(corners); - } - public: /// /// Draws the mesh. Binds vertex and index buffers and invokes the draw call. @@ -197,8 +188,8 @@ private: // Internal bindings API_FUNCTION(NoProxy) ScriptingObject* GetParentModel(); #if !COMPILE_WITHOUT_CSHARP - API_FUNCTION(NoProxy) bool UpdateMeshUInt(MonoArray* verticesObj, MonoArray* trianglesObj, MonoArray* blendIndicesObj, MonoArray* blendWeightsObj, MonoArray* normalsObj, MonoArray* tangentsObj, MonoArray* uvObj); - API_FUNCTION(NoProxy) bool UpdateMeshUShort(MonoArray* verticesObj, MonoArray* trianglesObj, MonoArray* blendIndicesObj, MonoArray* blendWeightsObj, MonoArray* normalsObj, MonoArray* tangentsObj, MonoArray* uvObj); - API_FUNCTION(NoProxy) MonoArray* DownloadBuffer(bool forceGpu, MonoReflectionType* resultType, int32 typeI); + API_FUNCTION(NoProxy) bool UpdateMeshUInt(MArray* verticesObj, MArray* trianglesObj, MArray* blendIndicesObj, MArray* blendWeightsObj, MArray* normalsObj, MArray* tangentsObj, MArray* uvObj); + API_FUNCTION(NoProxy) bool UpdateMeshUShort(MArray* verticesObj, MArray* trianglesObj, MArray* blendIndicesObj, MArray* blendWeightsObj, MArray* normalsObj, MArray* tangentsObj, MArray* uvObj); + API_FUNCTION(NoProxy) MArray* DownloadBuffer(bool forceGpu, MTypeObject* resultType, int32 typeI); #endif }; diff --git a/Source/Engine/Graphics/Models/SkinnedModelLOD.cpp b/Source/Engine/Graphics/Models/SkinnedModelLOD.cpp index d9e34c714..d0c87608c 100644 --- a/Source/Engine/Graphics/Models/SkinnedModelLOD.cpp +++ b/Source/Engine/Graphics/Models/SkinnedModelLOD.cpp @@ -15,6 +15,7 @@ bool SkinnedModelLOD::HasAnyMeshInitialized() const bool SkinnedModelLOD::Load(MemoryReadStream& stream) { // Load LOD for each mesh + byte version = stream.ReadByte(); for (int32 i = 0; i < Meshes.Count(); i++) { auto& mesh = Meshes[i]; @@ -134,8 +135,7 @@ BoundingBox SkinnedModelLOD::GetBox(const Matrix& world) const for (int32 j = 0; j < Meshes.Count(); j++) { const auto& mesh = Meshes[j]; - mesh.GetCorners(corners); - + mesh.GetBox().GetCorners(corners); for (int32 i = 0; i < 8; i++) { Vector3::Transform(corners[i], world, tmp); @@ -153,7 +153,7 @@ BoundingBox SkinnedModelLOD::GetBox(const Matrix& world, int32 meshIndex) const Vector3 tmp, min = Vector3::Maximum, max = Vector3::Minimum; Vector3 corners[8]; const auto& mesh = Meshes[meshIndex]; - mesh.GetCorners(corners); + mesh.GetBox().GetCorners(corners); for (int32 i = 0; i < 8; i++) { Vector3::Transform(corners[i], world, tmp); @@ -171,8 +171,7 @@ BoundingBox SkinnedModelLOD::GetBox() const Vector3 corners[8]; for (int32 j = 0; j < Meshes.Count(); j++) { - Meshes[j].GetCorners(corners); - + Meshes[j].GetBox().GetCorners(corners); for (int32 i = 0; i < 8; i++) { min = Vector3::Min(min, corners[i]); diff --git a/Source/Engine/Graphics/Models/Types.h b/Source/Engine/Graphics/Models/Types.h index 3568cbe76..b03d4948e 100644 --- a/Source/Engine/Graphics/Models/Types.h +++ b/Source/Engine/Graphics/Models/Types.h @@ -22,14 +22,20 @@ struct RenderView; /// /// Importing model lightmap UVs source /// -enum class ModelLightmapUVsSource +API_ENUM(Attributes="HideInEditor") enum class ModelLightmapUVsSource { + // No lightmap UVs. Disable = 0, + // Generate lightmap UVs from model geometry. Generate, + /// The texcoords channel 0. Channel0, + // The texcoords channel 1. Channel1, + // The texcoords channel 2. Channel2, - Channel3 + // The texcoords channel 3. + Channel3, }; /// diff --git a/Source/Engine/Graphics/TextureBase.cs b/Source/Engine/Graphics/TextureBase.cs index 93b646d98..c4a915212 100644 --- a/Source/Engine/Graphics/TextureBase.cs +++ b/Source/Engine/Graphics/TextureBase.cs @@ -176,7 +176,7 @@ namespace FlaxEngine } // Call backend - if (Internal_Init(__unmanagedPtr, new IntPtr(&t))) + if (Internal_InitCSharp(__unmanagedPtr, new IntPtr(&t))) throw new Exception("Failed to init texture data."); } } diff --git a/Source/Engine/Graphics/Textures/TextureBase.cpp b/Source/Engine/Graphics/Textures/TextureBase.cpp index 36720a318..538b15a4a 100644 --- a/Source/Engine/Graphics/Textures/TextureBase.cpp +++ b/Source/Engine/Graphics/Textures/TextureBase.cpp @@ -556,6 +556,7 @@ bool TextureBase::Init(InitData* initData) if (!IsVirtual()) { LOG(Error, "Texture must be virtual."); + Delete(initData); return true; } if (initData->Format == PixelFormat::Unknown || @@ -565,6 +566,7 @@ bool TextureBase::Init(InitData* initData) Math::IsNotInRange(initData->Mips.Count(), 1, GPU_MAX_TEXTURE_MIP_LEVELS)) { Log::ArgumentOutOfRangeException(); + Delete(initData); return true; } ScopeLock lock(Locker); @@ -579,11 +581,11 @@ bool TextureBase::Init(InitData* initData) // Create texture TextureHeader textureHeader; - textureHeader.Format = initData->Format; - textureHeader.Width = initData->Width; - textureHeader.Height = initData->Height; - textureHeader.IsCubeMap = initData->ArraySize == 6; - textureHeader.MipLevels = initData->Mips.Count(); + textureHeader.Format = _customData->Format; + textureHeader.Width = _customData->Width; + textureHeader.Height = _customData->Height; + textureHeader.IsCubeMap = _customData->ArraySize == 6; + textureHeader.MipLevels = _customData->Mips.Count(); textureHeader.Type = TextureFormatType::ColorRGBA; textureHeader.NeverStream = true; if (_texture.Create(textureHeader)) @@ -595,7 +597,9 @@ bool TextureBase::Init(InitData* initData) return false; } -bool TextureBase::Init(void* ptr) +#if !COMPILE_WITHOUT_CSHARP + +bool TextureBase::InitCSharp(void* ptr) { PROFILE_CPU_NAMED("Texture.Init"); struct InternalInitData @@ -637,6 +641,8 @@ bool TextureBase::Init(void* ptr) return Init(initData); } +#endif + uint64 TextureBase::GetMemoryUsage() const { Locker.Lock(); @@ -764,6 +770,22 @@ Asset::LoadResult TextureBase::load() return LoadResult::Ok; } +TextureBase::InitData::MipData::MipData(MipData&& other) noexcept + : Data(MoveTemp(other.Data)) + , RowPitch(other.RowPitch) + , SlicePitch(other.SlicePitch) +{ +} + +TextureBase::InitData::InitData(InitData&& other) noexcept + : Format(other.Format) + , Width(other.Width) + , Height(other.Height) + , ArraySize(other.ArraySize) + , Mips(MoveTemp(other.Mips)) +{ +} + bool TextureBase::InitData::GenerateMip(int32 mipIndex, bool linear) { // Validate input diff --git a/Source/Engine/Graphics/Textures/TextureBase.h b/Source/Engine/Graphics/Textures/TextureBase.h index e09b1bf4e..e47bb548d 100644 --- a/Source/Engine/Graphics/Textures/TextureBase.h +++ b/Source/Engine/Graphics/Textures/TextureBase.h @@ -27,6 +27,9 @@ API_CLASS(Abstract, NoSpawn) class FLAXENGINE_API TextureBase : public BinaryAss BytesContainer Data; uint32 RowPitch; uint32 SlicePitch; + + MipData() = default; + MipData(MipData&& other) noexcept; }; PixelFormat Format; @@ -35,6 +38,16 @@ API_CLASS(Abstract, NoSpawn) class FLAXENGINE_API TextureBase : public BinaryAss int32 ArraySize; Array> Mips; + InitData() = default; + InitData(InitData&& other) noexcept; + + InitData& operator=(InitData&& other) + { + if (this != &other) + *this = MoveTemp(other); + return *this; + } + /// /// Generates the mip map data. /// @@ -208,16 +221,28 @@ public: /// /// Initializes the texture with specified initialize data source (asset must be virtual). /// - /// The initialize data (allocated by the called, will be used and released by the asset internal layer). + /// The initializer data allocated by the caller with New. It will be owned and released by the asset internal layer. /// True if failed, otherwise false. bool Init(InitData* initData); + /// + /// Initializes the texture with specified initialize data source (asset must be virtual). + /// + /// The initializer data. It will be used and released by the asset internal layer (memory allocation will be swapped). + /// True if failed, otherwise false. + bool Init(InitData&& initData) + { + return Init(New(MoveTemp(initData))); + } + protected: virtual int32 CalculateChunkIndex(int32 mipIndex) const; private: +#if !COMPILE_WITHOUT_CSHARP // Internal bindings - API_FUNCTION(NoProxy) bool Init(void* ptr); + API_FUNCTION(NoProxy) bool InitCSharp(void* ptr); +#endif public: // [BinaryAsset] diff --git a/Source/Engine/Graphics/Textures/Types.h b/Source/Engine/Graphics/Textures/Types.h index f261e83cb..9593cbbc2 100644 --- a/Source/Engine/Graphics/Textures/Types.h +++ b/Source/Engine/Graphics/Textures/Types.h @@ -2,14 +2,30 @@ #pragma once -#include "Engine/Core/Enums.h" #include "Engine/Core/Types/BaseTypes.h" #include "Engine/Graphics/PixelFormat.h" /// /// Describes texture compression format type /// -DECLARE_ENUM_EX_7(TextureFormatType, byte, 0, Unknown, ColorRGB, ColorRGBA, NormalMap, GrayScale, HdrRGBA, HdrRGB); +API_ENUM() enum class TextureFormatType : byte +{ + // Invalid value. + API_ENUM(Attributes="HideInEditor") + Unknown = 0, + // The color with RGB channels. + ColorRGB, + // The color with RGBA channels. + ColorRGBA, + // Normal map data (packed and compressed). + NormalMap, + // The gray scale (R channel). + GrayScale, + // The HDR color (RGBA channels). + HdrRGBA, + // The HDR color (RGB channels). + HdrRGB, +}; /// /// Old texture header structure (was not fully initialized to zero). diff --git a/Source/Engine/GraphicsDevice/DirectX/DX12/GPUDeviceDX12.cpp b/Source/Engine/GraphicsDevice/DirectX/DX12/GPUDeviceDX12.cpp index 456a793f1..047b69bb5 100644 --- a/Source/Engine/GraphicsDevice/DirectX/DX12/GPUDeviceDX12.cpp +++ b/Source/Engine/GraphicsDevice/DirectX/DX12/GPUDeviceDX12.cpp @@ -364,10 +364,10 @@ bool GPUDeviceDX12::Init() // Spawn some info about the hardware D3D12_FEATURE_DATA_D3D12_OPTIONS options; VALIDATE_DIRECTX_RESULT(_device->CheckFeatureSupport(D3D12_FEATURE_D3D12_OPTIONS, &options, sizeof(options))); - LOG(Info, "Tiled Resources Tier: {0}", options.TiledResourcesTier); - LOG(Info, "Resource Binding Tier: {0}", options.ResourceBindingTier); - LOG(Info, "Conservative Rasterization Tier: {0}", options.ConservativeRasterizationTier); - LOG(Info, "Resource Heap Tier: {0}", options.ResourceHeapTier); + LOG(Info, "Tiled Resources Tier: {0}", (int32)options.TiledResourcesTier); + LOG(Info, "Resource Binding Tier: {0}", (int32)options.ResourceBindingTier); + LOG(Info, "Conservative Rasterization Tier: {0}", (int32)options.ConservativeRasterizationTier); + LOG(Info, "Resource Heap Tier: {0}", (int32)options.ResourceHeapTier); // Init device limits { diff --git a/Source/Engine/GraphicsDevice/Vulkan/GPUDeviceVulkan.cpp b/Source/Engine/GraphicsDevice/Vulkan/GPUDeviceVulkan.cpp index 9c6d158ce..eb23c0871 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/GPUDeviceVulkan.cpp +++ b/Source/Engine/GraphicsDevice/Vulkan/GPUDeviceVulkan.cpp @@ -526,7 +526,10 @@ RenderPassVulkan::RenderPassVulkan(GPUDeviceVulkan* device, const RenderTargetLa attachment.samples = (VkSampleCountFlagBits)layout.MSAA; #if PLATFORM_ANDROID attachment.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; // TODO: Adreno 640 has glitches when blend is disabled and rt data not loaded +#elif PLATFORM_MAC || PLATFORM_IOS + attachment.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; // MoltenVK seams to have glitches (tiled arch of gpu) #else + // TODO: we need render passes into high-level rendering api to perform more optimal rendering (esp. for tiled gpus) attachment.loadOp = layout.BlendEnable ? VK_ATTACHMENT_LOAD_OP_LOAD : VK_ATTACHMENT_LOAD_OP_DONT_CARE; #endif attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; @@ -1683,8 +1686,12 @@ bool GPUDeviceVulkan::Init() auto& limits = Limits; limits.HasCompute = GetShaderProfile() == ShaderProfile::Vulkan_SM5 && PhysicalDeviceLimits.maxComputeWorkGroupCount[0] >= GPU_MAX_CS_DISPATCH_THREAD_GROUPS && PhysicalDeviceLimits.maxComputeWorkGroupCount[1] >= GPU_MAX_CS_DISPATCH_THREAD_GROUPS; +#if PLATFORM_MAC || PLATFORM_IOS + limits.HasTessellation = false; // MoltenVK has artifacts when using tess +#else limits.HasTessellation = !!PhysicalDeviceFeatures.tessellationShader && PhysicalDeviceLimits.maxBoundDescriptorSets > (uint32_t)DescriptorSet::Domain; -#if PLATFORM_ANDROID +#endif +#if PLATFORM_ANDROID || PLATFORM_IOS limits.HasGeometryShaders = false; // Don't even try GS on mobile #else limits.HasGeometryShaders = !!PhysicalDeviceFeatures.geometryShader; @@ -1904,13 +1911,14 @@ bool GPUDeviceVulkan::Init() { dataPtr++; const int32 version = *dataPtr++; - if (version == VK_PIPELINE_CACHE_HEADER_VERSION_ONE) + const int32 versionExpected = VK_PIPELINE_CACHE_HEADER_VERSION_ONE; + if (version == versionExpected) { dataPtr += VK_UUID_SIZE / sizeof(int32); } else { - LOG(Warning, "Bad validation cache file, version: {0}, expected: {1}", version, VK_PIPELINE_CACHE_HEADER_VERSION_ONE); + LOG(Warning, "Bad validation cache file, version: {0}, expected: {1}", version, versionExpected); data.Clear(); } } diff --git a/Source/Engine/GraphicsDevice/Vulkan/GPUSwapChainVulkan.cpp b/Source/Engine/GraphicsDevice/Vulkan/GPUSwapChainVulkan.cpp index f3d4cfd4d..aee1f4239 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/GPUSwapChainVulkan.cpp +++ b/Source/Engine/GraphicsDevice/Vulkan/GPUSwapChainVulkan.cpp @@ -79,7 +79,7 @@ void GPUSwapChainVulkan::OnReleaseGPU() bool GPUSwapChainVulkan::IsFullscreen() { -#if PLATFORM_ANDROID || PLATFORM_SWITCH +#if PLATFORM_ANDROID || PLATFORM_SWITCH || PLATFORM_IOS // Not supported return true; #else @@ -89,7 +89,7 @@ bool GPUSwapChainVulkan::IsFullscreen() void GPUSwapChainVulkan::SetFullscreen(bool isFullscreen) { -#if PLATFORM_ANDROID || PLATFORM_SWITCH +#if PLATFORM_ANDROID || PLATFORM_SWITCH || PLATFORM_IOS // Not supported #else if (!_surface) diff --git a/Source/Engine/GraphicsDevice/Vulkan/GPUTextureVulkan.cpp b/Source/Engine/GraphicsDevice/Vulkan/GPUTextureVulkan.cpp index 67a1a22c2..e754573a8 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/GPUTextureVulkan.cpp +++ b/Source/Engine/GraphicsDevice/Vulkan/GPUTextureVulkan.cpp @@ -272,7 +272,7 @@ bool GPUTextureVulkan::OnInit() imageInfo.usage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; if (useUAV) imageInfo.usage |= VK_IMAGE_USAGE_STORAGE_BIT; -#if PLATFORM_MAC +#if PLATFORM_MAC || PLATFORM_IOS // MoltenVK: VK_ERROR_FEATURE_NOT_PRESENT: vkCreateImageView(): 2D views on 3D images can only be used as color attachments. if (IsVolume() && _desc.HasPerSliceViews()) imageInfo.usage &= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; diff --git a/Source/Engine/GraphicsDevice/Vulkan/VulkanPlatform.h b/Source/Engine/GraphicsDevice/Vulkan/VulkanPlatform.h index bffad847a..1926d65ab 100644 --- a/Source/Engine/GraphicsDevice/Vulkan/VulkanPlatform.h +++ b/Source/Engine/GraphicsDevice/Vulkan/VulkanPlatform.h @@ -12,4 +12,6 @@ #include "Platforms/Switch/Engine/GraphicsDevice/Vulkan/SwitchVulkanPlatform.h" #elif PLATFORM_MAC #include "Mac/MacVulkanPlatform.h" +#elif PLATFORM_IOS +#include "iOS/iOSVulkanPlatform.h" #endif diff --git a/Source/Engine/GraphicsDevice/Vulkan/iOS/iOSVulkanPlatform.cpp b/Source/Engine/GraphicsDevice/Vulkan/iOS/iOSVulkanPlatform.cpp new file mode 100644 index 000000000..2112eda3e --- /dev/null +++ b/Source/Engine/GraphicsDevice/Vulkan/iOS/iOSVulkanPlatform.cpp @@ -0,0 +1,29 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#if GRAPHICS_API_VULKAN && PLATFORM_IOS + +#include "iOSVulkanPlatform.h" +#include "../RenderToolsVulkan.h" +#include "Engine/Core/Delegate.h" +#include + +void iOSVulkanPlatform::GetInstanceExtensions(Array& extensions, Array& layers) +{ + extensions.Add(VK_KHR_SURFACE_EXTENSION_NAME); + extensions.Add(VK_MVK_IOS_SURFACE_EXTENSION_NAME); +} + +void iOSVulkanPlatform::CreateSurface(void* windowHandle, VkInstance instance, VkSurfaceKHR* surface) +{ + // Create surface on a main UI Thread + Function func = [&windowHandle, &instance, &surface]() + { + VkIOSSurfaceCreateInfoMVK surfaceCreateInfo; + RenderToolsVulkan::ZeroStruct(surfaceCreateInfo, VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK); + surfaceCreateInfo.pView = windowHandle; // UIView or CAMetalLayer + VALIDATE_VULKAN_RESULT(vkCreateIOSSurfaceMVK(instance, &surfaceCreateInfo, nullptr, surface)); + }; + iOSPlatform::RunOnUIThread(func, true); +} + +#endif diff --git a/Source/Engine/GraphicsDevice/Vulkan/iOS/iOSVulkanPlatform.h b/Source/Engine/GraphicsDevice/Vulkan/iOS/iOSVulkanPlatform.h new file mode 100644 index 000000000..dd0b999b8 --- /dev/null +++ b/Source/Engine/GraphicsDevice/Vulkan/iOS/iOSVulkanPlatform.h @@ -0,0 +1,26 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#pragma once + +#include "../VulkanPlatformBase.h" + +#if GRAPHICS_API_VULKAN && PLATFORM_IOS + +#define VULKAN_BACK_BUFFERS_COUNT 3 + +// General/Validation Error:0 VK_ERROR_INITIALIZATION_FAILED: Could not create MTLCounterSampleBuffer for query pool of type VK_QUERY_TYPE_TIMESTAMP. Reverting to emulated behavior. (Error code 0): Cannot allocate sample buffer +#define VULKAN_USE_QUERIES 0 + +/// +/// The implementation for the Vulkan API support for iOS platform. +/// +class iOSVulkanPlatform : public VulkanPlatformBase +{ +public: + static void GetInstanceExtensions(Array& extensions, Array& layers); + static void CreateSurface(void* windowHandle, VkInstance instance, VkSurfaceKHR* outSurface); +}; + +typedef iOSVulkanPlatform VulkanPlatform; + +#endif diff --git a/Source/Engine/Level/Actor.cs b/Source/Engine/Level/Actor.cs index 27263dfea..957d09c7a 100644 --- a/Source/Engine/Level/Actor.cs +++ b/Source/Engine/Level/Actor.cs @@ -165,7 +165,7 @@ namespace FlaxEngine public bool TryGetChild(out T actor) where T : Actor { actor = GetChild(typeof(T)) as T; - return actor != null; + return (object)actor != null; } /// @@ -236,7 +236,7 @@ namespace FlaxEngine public bool TryGetScript(out T script) where T : class { script = GetScript(typeof(T)) as T; - return script != null; + return (object)script != null; } /// diff --git a/Source/Engine/Level/Actor.h b/Source/Engine/Level/Actor.h index 0dc7d34e3..fb9fb0848 100644 --- a/Source/Engine/Level/Actor.h +++ b/Source/Engine/Level/Actor.h @@ -232,9 +232,6 @@ public: T* result = (T*)GetChild(T::GetStaticClass()); if (!result) { - if (T::GetStaticClass()->IsAbstract()) - return nullptr; - result = New(); result->SetParent(this, false, false); } diff --git a/Source/Engine/Level/Actors/AnimatedModel.cpp b/Source/Engine/Level/Actors/AnimatedModel.cpp index 9605119a3..882026db7 100644 --- a/Source/Engine/Level/Actors/AnimatedModel.cpp +++ b/Source/Engine/Level/Actors/AnimatedModel.cpp @@ -25,7 +25,7 @@ AnimatedModel::AnimatedModel(const SpawnParams& params) { _drawCategory = SceneRendering::SceneDrawAsync; GraphInstance.Object = this; - _box = _boxLocal = BoundingBox(Vector3::Zero); + _box = BoundingBox(Vector3::Zero); _sphere = BoundingSphere(Vector3::Zero, 0.0f); SkinnedModel.Changed.Bind(this); @@ -419,10 +419,10 @@ bool AnimatedModel::IsPlayingSlotAnimation(const StringView& slotName, Animation return false; } -void AnimatedModel::ApplyRootMotion(const RootMotionData& rootMotionDelta) +void AnimatedModel::ApplyRootMotion(const Transform& rootMotionDelta) { // Skip if no motion - if (rootMotionDelta.Translation.IsZero() && rootMotionDelta.Rotation.IsIdentity()) + if (rootMotionDelta.Translation.IsZero() && rootMotionDelta.Orientation.IsIdentity()) return; // Transform translation from actor space into world space @@ -430,7 +430,7 @@ void AnimatedModel::ApplyRootMotion(const RootMotionData& rootMotionDelta) // Apply movement Actor* target = RootMotionTarget ? RootMotionTarget.Get() : this; - target->AddMovement(translation, rootMotionDelta.Rotation); + target->AddMovement(translation, rootMotionDelta.Orientation); } void AnimatedModel::SyncParameters() @@ -511,50 +511,41 @@ void AnimatedModel::OnActiveInTreeChanged() ModelInstanceActor::OnActiveInTreeChanged(); } -void AnimatedModel::UpdateLocalBounds() +void AnimatedModel::UpdateBounds() { - BoundingBox box; if (CustomBounds.GetSize().LengthSquared() > 0.01f) { - box = CustomBounds; + BoundingBox::Transform(CustomBounds, _transform, _box); } else if (SkinnedModel && SkinnedModel->IsLoaded()) { - //box = SkinnedModel->GetBox(GraphInstance.RootTransform.GetWorld()); - //box = SkinnedModel->GetBox(); - if (GraphInstance.NodesPose.Count() != 0) { // Per-bone bounds estimated from positions auto& skeleton = SkinnedModel->Skeleton; const int32 bonesCount = skeleton.Bones.Count(); - box = BoundingBox(GraphInstance.NodesPose[skeleton.Bones[0].NodeIndex].GetTranslation()); +#define GET_NODE_POS(i) _transform.LocalToWorld(GraphInstance.NodesPose[skeleton.Bones[i].NodeIndex].GetTranslation()) + BoundingBox box(GET_NODE_POS(0)); for (int32 boneIndex = 1; boneIndex < bonesCount; boneIndex++) - box.Merge(GraphInstance.NodesPose[skeleton.Bones[boneIndex].NodeIndex].GetTranslation()); + box.Merge(GET_NODE_POS(boneIndex)); + _box = box; +#undef GET_NODE_POS } else { - box = SkinnedModel->GetBox(); + _box = SkinnedModel->GetBox(_transform.GetWorld()); } // Apply margin based on model dimensions const Vector3 modelBoxSize = SkinnedModel->GetBox().GetSize(); - const Vector3 center = box.GetCenter(); - const Vector3 sizeHalf = Vector3::Max(box.GetSize() + modelBoxSize * 0.2f, modelBoxSize) * 0.5f; - box = BoundingBox(center - sizeHalf, center + sizeHalf); + const Vector3 center = _box.GetCenter(); + const Vector3 sizeHalf = Vector3::Max(_box.GetSize() + modelBoxSize * 0.2f, modelBoxSize) * 0.5f; + _box = BoundingBox(center - sizeHalf, center + sizeHalf); } else { - box = BoundingBox(Vector3::Zero); + _box = BoundingBox(_transform.Translation); } - _boxLocal = BoundingBox::MakeScaled(box, BoundsScale); -} - -void AnimatedModel::UpdateBounds() -{ - UpdateLocalBounds(); - - BoundingBox::Transform(_boxLocal, _transform, _box); BoundingSphere::FromBox(_box, _sphere); if (_sceneRenderingKey != -1) GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); @@ -573,9 +564,10 @@ void AnimatedModel::UpdateSockets() void AnimatedModel::OnAnimationUpdated_Async() { // Update asynchronous stuff - auto& skeleton = SkinnedModel->Skeleton; + const auto& skeleton = SkinnedModel->Skeleton; // Copy pose from the master + // TODO: support retargetting master pose to current pose if (_masterPose && _masterPose->SkinnedModel->Skeleton.Nodes.Count() == skeleton.Nodes.Count()) { ANIM_GRAPH_PROFILE_EVENT("Copy Master Pose"); @@ -590,11 +582,13 @@ void AnimatedModel::OnAnimationUpdated_Async() ANIM_GRAPH_PROFILE_EVENT("Final Pose"); const int32 bonesCount = skeleton.Bones.Count(); Matrix3x4* output = (Matrix3x4*)_skinningData.Data.Get(); + ASSERT(GraphInstance.NodesPose.Count() == skeleton.Nodes.Count()); ASSERT(_skinningData.Data.Count() == bonesCount * sizeof(Matrix3x4)); for (int32 boneIndex = 0; boneIndex < bonesCount; boneIndex++) { - auto& bone = skeleton.Bones[boneIndex]; - Matrix matrix = bone.OffsetMatrix * GraphInstance.NodesPose[bone.NodeIndex]; + const SkeletonBone& bone = skeleton.Bones[boneIndex]; + Matrix matrix; + Matrix::Multiply(bone.OffsetMatrix, GraphInstance.NodesPose.Get()[bone.NodeIndex], matrix); output[boneIndex].SetMatrixTranspose(matrix); } _skinningData.OnDataChanged(!PerBoneMotionBlur); @@ -628,6 +622,7 @@ void AnimatedModel::OnSkinnedModelChanged() UpdateBounds(); GraphInstance.Invalidate(); } + GraphInstance.NodesSkeleton = SkinnedModel; } void AnimatedModel::OnSkinnedModelLoaded() @@ -963,10 +958,7 @@ void AnimatedModel::OnTransformChanged() // Base ModelInstanceActor::OnTransformChanged(); - BoundingBox::Transform(_boxLocal, _transform, _box); - BoundingSphere::FromBox(_box, _sphere); - if (_sceneRenderingKey != -1) - GetSceneRendering()->UpdateActor(this, _sceneRenderingKey); + UpdateBounds(); } void AnimatedModel::WaitForModelLoad() diff --git a/Source/Engine/Level/Actors/AnimatedModel.h b/Source/Engine/Level/Actors/AnimatedModel.h index 3c578d244..ccd0ee3b5 100644 --- a/Source/Engine/Level/Actors/AnimatedModel.h +++ b/Source/Engine/Level/Actors/AnimatedModel.h @@ -55,7 +55,6 @@ public: }; private: - BoundingBox _boxLocal; GeometryDrawStateData _drawState; SkinnedMeshDrawData _skinningData; AnimationUpdateMode _actualMode; @@ -345,11 +344,10 @@ public: API_FUNCTION() bool IsPlayingSlotAnimation(const StringView& slotName, Animation* anim); private: - void ApplyRootMotion(const RootMotionData& rootMotionDelta); + void ApplyRootMotion(const Transform& rootMotionDelta); void SyncParameters(); void Update(); - void UpdateLocalBounds(); void UpdateBounds(); void UpdateSockets(); void OnAnimationUpdated_Async(); diff --git a/Source/Engine/Level/Actors/PointLight.h b/Source/Engine/Level/Actors/PointLight.h index 43f0e7d06..d3e170a03 100644 --- a/Source/Engine/Level/Actors/PointLight.h +++ b/Source/Engine/Level/Actors/PointLight.h @@ -33,7 +33,7 @@ public: /// /// Controls the radial falloff of light when UseInverseSquaredFalloff is disabled. /// - API_FIELD(Attributes="EditorOrder(13), DefaultValue(8.0f), EditorDisplay(\"Light\"), Limit(2, 16, 0.01f)") + API_FIELD(Attributes="EditorOrder(13), DefaultValue(8.0f), EditorDisplay(\"Light\"), Limit(2, 16, 0.01f), VisibleIf(nameof(UseInverseSquaredFalloff), true)") float FallOffExponent = 8.0f; /// @@ -62,9 +62,8 @@ public: public: /// - /// Computes light brightness value + /// Computes light brightness value. /// - /// Brightness float ComputeBrightness() const; /// diff --git a/Source/Engine/Level/Actors/Spline.cpp b/Source/Engine/Level/Actors/Spline.cpp index 63ba0fe4e..dbd7ef045 100644 --- a/Source/Engine/Level/Actors/Spline.cpp +++ b/Source/Engine/Level/Actors/Spline.cpp @@ -4,9 +4,7 @@ #include "Engine/Serialization/Serialization.h" #include "Engine/Animations/CurveSerialization.h" #include "Engine/Core/Math/Matrix.h" -#if USE_MONO -#include -#endif +#include "Engine/Scripting/ManagedCLR/MCore.h" Spline::Spline(const SpawnParams& params) : Actor(params) @@ -441,16 +439,17 @@ void Spline::UpdateSpline() #if !COMPILE_WITHOUT_CSHARP -void Spline::GetKeyframes(MonoArray* data) +void Spline::GetKeyframes(MArray* data) { - Platform::MemoryCopy(mono_array_addr_with_size(data, sizeof(Keyframe), 0), Curve.GetKeyframes().Get(), sizeof(Keyframe) * Curve.GetKeyframes().Count()); + ASSERT(MCore::Array::GetLength(data) >= Curve.GetKeyframes().Count()); + Platform::MemoryCopy(MCore::Array::GetAddress(data), Curve.GetKeyframes().Get(), sizeof(Keyframe) * Curve.GetKeyframes().Count()); } -void Spline::SetKeyframes(MonoArray* data) +void Spline::SetKeyframes(MArray* data) { - const auto count = (int32)mono_array_length(data); + const int32 count = MCore::Array::GetLength(data); Curve.GetKeyframes().Resize(count, false); - Platform::MemoryCopy(Curve.GetKeyframes().Get(), mono_array_addr_with_size(data, sizeof(Keyframe), 0), sizeof(Keyframe) * count); + Platform::MemoryCopy(Curve.GetKeyframes().Get(), MCore::Array::GetAddress(data), sizeof(Keyframe) * count); UpdateSpline(); } diff --git a/Source/Engine/Level/Actors/Spline.h b/Source/Engine/Level/Actors/Spline.h index 2cf0be7f9..ea3cf8569 100644 --- a/Source/Engine/Level/Actors/Spline.h +++ b/Source/Engine/Level/Actors/Spline.h @@ -363,8 +363,8 @@ protected: private: // Internal bindings #if !COMPILE_WITHOUT_CSHARP - API_FUNCTION(NoProxy) void GetKeyframes(MonoArray* data); - API_FUNCTION(NoProxy) void SetKeyframes(MonoArray* data); + API_FUNCTION(NoProxy) void GetKeyframes(MArray* data); + API_FUNCTION(NoProxy) void SetKeyframes(MArray* data); #endif public: diff --git a/Source/Engine/Level/Actors/SpotLight.h b/Source/Engine/Level/Actors/SpotLight.h index 547a54e3c..6bb0daf8d 100644 --- a/Source/Engine/Level/Actors/SpotLight.h +++ b/Source/Engine/Level/Actors/SpotLight.h @@ -32,7 +32,7 @@ public: /// /// Controls the radial falloff of light when UseInverseSquaredFalloff is disabled. /// - API_FIELD(Attributes="EditorOrder(13), DefaultValue(8.0f), EditorDisplay(\"Light\"), Limit(2, 16, 0.01f)") + API_FIELD(Attributes="EditorOrder(13), DefaultValue(8.0f), EditorDisplay(\"Light\"), Limit(2, 16, 0.01f), VisibleIf(nameof(UseInverseSquaredFalloff), true)") float FallOffExponent = 8.0f; /// diff --git a/Source/Engine/Level/Level.cpp b/Source/Engine/Level/Level.cpp index 2767cdd51..ae617b980 100644 --- a/Source/Engine/Level/Level.cpp +++ b/Source/Engine/Level/Level.cpp @@ -26,7 +26,7 @@ #include "Engine/Scripting/ManagedCLR/MAssembly.h" #include "Engine/Scripting/ManagedCLR/MClass.h" #include "Engine/Scripting/ManagedCLR/MDomain.h" -#include "Engine/Scripting/MException.h" +#include "Engine/Scripting/ManagedCLR/MException.h" #include "Engine/Scripting/Scripting.h" #include "Engine/Scripting/BinaryModule.h" #include "Engine/Serialization/JsonTools.h" @@ -138,6 +138,7 @@ public: void Update() override; void LateUpdate() override; void FixedUpdate() override; + void LateFixedUpdate() override; void Dispose() override; }; @@ -242,96 +243,60 @@ void LayersAndTagsSettings::Apply() } } -void LevelService::Update() -{ - PROFILE_CPU_NAMED("Level::Update"); - - ScopeLock lock(Level::ScenesLock); - auto& scenes = Level::Scenes; - - // Update all actors - if (!Time::GetGamePaused() && Level::TickEnabled) - { - for (int32 i = 0; i < scenes.Count(); i++) - { - if (scenes[i]->GetIsActive()) - scenes[i]->Ticking.Update.Tick(); - } +#define TICK_LEVEL(tickingStage, name) \ + PROFILE_CPU_NAMED(name); \ + ScopeLock lock(Level::ScenesLock); \ + auto& scenes = Level::Scenes; \ + if (!Time::GetGamePaused() && Level::TickEnabled) \ + { \ + for (int32 i = 0; i < scenes.Count(); i++) \ + { \ + if (scenes[i]->GetIsActive()) \ + scenes[i]->Ticking.tickingStage.Tick(); \ + } \ } #if USE_EDITOR - else if (!Editor::IsPlayMode) - { - // Run event for script executed in editor - for (int32 i = 0; i < scenes.Count(); i++) - { - if (scenes[i]->GetIsActive()) - scenes[i]->Ticking.Update.TickExecuteInEditor(); - } +#define TICK_LEVEL_EDITOR(tickingStage) \ + else if (!Editor::IsPlayMode) \ + { \ + for (int32 i = 0; i < scenes.Count(); i++) \ + { \ + if (scenes[i]->GetIsActive()) \ + scenes[i]->Ticking.tickingStage.TickExecuteInEditor(); \ + } \ } +#else +#define TICK_LEVEL_EDITOR(tickingStage) #endif + +void LevelService::Update() +{ + TICK_LEVEL(Update, "Level::Update") + TICK_LEVEL_EDITOR(Update) } void LevelService::LateUpdate() { - PROFILE_CPU_NAMED("Level::LateUpdate"); - - ScopeLock lock(Level::ScenesLock); - auto& scenes = Level::Scenes; - - // Update all actors - if (!Time::GetGamePaused() && Level::TickEnabled) - { - for (int32 i = 0; i < scenes.Count(); i++) - { - if (scenes[i]->GetIsActive()) - scenes[i]->Ticking.LateUpdate.Tick(); - } - } -#if USE_EDITOR - else if (!Editor::IsPlayMode) - { - // Run event for script executed in editor - for (int32 i = 0; i < scenes.Count(); i++) - { - if (scenes[i]->GetIsActive()) - scenes[i]->Ticking.LateUpdate.TickExecuteInEditor(); - } - } -#endif - - // Flush actions + TICK_LEVEL(LateUpdate, "Level::LateUpdate") + TICK_LEVEL_EDITOR(LateUpdate) flushActions(); } void LevelService::FixedUpdate() { - PROFILE_CPU_NAMED("Level::FixedUpdate"); - - ScopeLock lock(Level::ScenesLock); - auto& scenes = Level::Scenes; - - // Update all actors - if (!Time::GetGamePaused() && Level::TickEnabled) - { - for (int32 i = 0; i < scenes.Count(); i++) - { - if (scenes[i]->GetIsActive()) - scenes[i]->Ticking.FixedUpdate.Tick(); - } - } -#if USE_EDITOR - else if (!Editor::IsPlayMode) - { - // Run event for script executed in editor - for (int32 i = 0; i < scenes.Count(); i++) - { - if (scenes[i]->GetIsActive()) - scenes[i]->Ticking.FixedUpdate.TickExecuteInEditor(); - } - } -#endif + TICK_LEVEL(FixedUpdate, "Level::FixedUpdate") + TICK_LEVEL_EDITOR(FixedUpdate) } +void LevelService::LateFixedUpdate() +{ + TICK_LEVEL(LateFixedUpdate, "Level::LateFixedUpdate") + TICK_LEVEL_EDITOR(LateFixedUpdate) +} + +#undef TICK_LEVEL +#undef TICK_LEVEL_EDITOR + void LevelService::Dispose() { ScopeLock lock(_sceneActionsLocker); diff --git a/Source/Engine/Level/Scene/SceneTicking.cpp b/Source/Engine/Level/Scene/SceneTicking.cpp index 8998a4b37..235d7bbab 100644 --- a/Source/Engine/Level/Scene/SceneTicking.cpp +++ b/Source/Engine/Level/Scene/SceneTicking.cpp @@ -121,6 +121,19 @@ void SceneTicking::LateUpdateTickData::TickScripts(const Array& scripts } } +SceneTicking::LateFixedUpdateTickData::LateFixedUpdateTickData() + : TickData(64) +{ +} + +void SceneTicking::LateFixedUpdateTickData::TickScripts(const Array& scripts) +{ + for (auto* script : scripts) + { + script->OnLateFixedUpdate(); + } +} + void SceneTicking::AddScript(Script* obj) { ASSERT_LOW_LAYER(obj && obj->GetParent() && obj->GetParent()->GetScene()); @@ -130,6 +143,8 @@ void SceneTicking::AddScript(Script* obj) Update.AddScript(obj); if (obj->_tickLateUpdate) LateUpdate.AddScript(obj); + if (obj->_tickLateFixedUpdate) + LateFixedUpdate.AddScript(obj); } void SceneTicking::RemoveScript(Script* obj) @@ -141,6 +156,8 @@ void SceneTicking::RemoveScript(Script* obj) Update.RemoveScript(obj); if (obj->_tickLateUpdate) LateUpdate.RemoveScript(obj); + if (obj->_tickLateFixedUpdate) + LateFixedUpdate.RemoveScript(obj); } void SceneTicking::Clear() @@ -148,4 +165,5 @@ void SceneTicking::Clear() FixedUpdate.Clear(); Update.Clear(); LateUpdate.Clear(); + LateFixedUpdate.Clear(); } diff --git a/Source/Engine/Level/Scene/SceneTicking.h b/Source/Engine/Level/Scene/SceneTicking.h index 230861087..7d590c8e7 100644 --- a/Source/Engine/Level/Scene/SceneTicking.h +++ b/Source/Engine/Level/Scene/SceneTicking.h @@ -109,6 +109,13 @@ public: void TickScripts(const Array& scripts) override; }; + class FLAXENGINE_API LateFixedUpdateTickData : public TickData + { + public: + LateFixedUpdateTickData(); + void TickScripts(const Array& scripts) override; + }; + public: /// /// Adds the script to scene ticking system. @@ -142,4 +149,9 @@ public: /// The late update tick function. /// LateUpdateTickData LateUpdate; + + /// + /// The late fixed update tick function. + /// + LateFixedUpdateTickData LateFixedUpdate; }; diff --git a/Source/Engine/Level/SceneObject.cpp b/Source/Engine/Level/SceneObject.cpp index 989cd2c09..64a88be8d 100644 --- a/Source/Engine/Level/SceneObject.cpp +++ b/Source/Engine/Level/SceneObject.cpp @@ -6,7 +6,7 @@ #include "Engine/Content/Content.h" #include "Engine/Level/Prefabs/Prefab.h" #include "Engine/Scripting/BinaryModule.h" -#include "Engine/Scripting/ManagedSerialization.h" +#include "Engine/Scripting/Internal/ManagedSerialization.h" #include "Engine/Serialization/ISerializeModifier.h" #include "Engine/Serialization/Serialization.h" diff --git a/Source/Engine/Level/Tags.cs b/Source/Engine/Level/Tags.cs index 2de17e52c..1ff9acef4 100644 --- a/Source/Engine/Level/Tags.cs +++ b/Source/Engine/Level/Tags.cs @@ -7,7 +7,9 @@ using System.Runtime.CompilerServices; namespace FlaxEngine { +#if FLAX_EDITOR [TypeConverter(typeof(TypeConverters.TagConverter))] +#endif partial struct Tag : IEquatable, IEquatable, IComparable, IComparable, IComparable { /// @@ -252,6 +254,7 @@ namespace FlaxEngine } } +#if FLAX_EDITOR namespace FlaxEngine.TypeConverters { internal class TagConverter : TypeConverter @@ -288,3 +291,4 @@ namespace FlaxEngine.TypeConverters } } } +#endif diff --git a/Source/Engine/Level/Types.h b/Source/Engine/Level/Types.h index a9938658b..d605c6ad3 100644 --- a/Source/Engine/Level/Types.h +++ b/Source/Engine/Level/Types.h @@ -54,8 +54,6 @@ class AudioListener; class AnimatedModel; class BoneSocket; class Decal; -class UICanvas; -class UIControl; // Default extension for JSON scene files #define DEFAULT_SCENE_EXTENSION TEXT("scene") diff --git a/Source/Engine/Localization/CultureInfo.Tables.h b/Source/Engine/Localization/CultureInfo.Tables.h new file mode 100644 index 000000000..17000321e --- /dev/null +++ b/Source/Engine/Localization/CultureInfo.Tables.h @@ -0,0 +1,8634 @@ +/* +https://github.com/mono/mono/blob/main/mono/culture/culture-info-tables.h +### MIT License + +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. +*/ +#ifndef MONO_METADATA_CULTURE_INFO_TABLES +#define MONO_METADATA_CULTURE_INFO_TABLES 1 + +#define NUM_DAYS 7 +#define NUM_MONTHS 13 +#define GROUP_SIZE 2 +#define NUM_CALENDARS 4 + +#define NUM_SHORT_DATE_PATTERNS 14 +#define NUM_LONG_DATE_PATTERNS 10 +#define NUM_SHORT_TIME_PATTERNS 12 +#define NUM_LONG_TIME_PATTERNS 9 +#define NUM_YEAR_MONTH_PATTERNS 8 + +#define idx2string(idx) (locale_strings + (idx)) +#define pattern2string(idx) (patterns + (idx)) +#define dtidx2string(idx) (datetime_strings + (idx)) + +typedef int gint; +typedef int8_t gint8; +typedef int16_t gint16; +typedef uint16_t guint16; +typedef int32_t mono_bool; +typedef uint8_t mono_byte; +typedef mono_byte MonoBoolean; + +/* need to change this if the string data ends up to not fit in a 64KB array. */ +typedef guint16 stridx_t; + +typedef struct { + const stridx_t month_day_pattern; + const stridx_t am_designator; + const stridx_t pm_designator; + + const stridx_t day_names [NUM_DAYS]; + const stridx_t abbreviated_day_names [NUM_DAYS]; + const stridx_t shortest_day_names [NUM_DAYS]; + const stridx_t month_names [NUM_MONTHS]; + const stridx_t month_genitive_names [NUM_MONTHS]; + const stridx_t abbreviated_month_names [NUM_MONTHS]; + const stridx_t abbreviated_month_genitive_names [NUM_MONTHS]; + + const gint8 calendar_week_rule; + const gint8 first_day_of_week; + + const stridx_t date_separator; + const stridx_t time_separator; + + const stridx_t short_date_patterns [NUM_SHORT_DATE_PATTERNS]; + const stridx_t long_date_patterns [NUM_LONG_DATE_PATTERNS]; + const stridx_t short_time_patterns [NUM_SHORT_TIME_PATTERNS]; + const stridx_t long_time_patterns [NUM_LONG_TIME_PATTERNS]; + const stridx_t year_month_patterns [NUM_YEAR_MONTH_PATTERNS]; +} DateTimeFormatEntry; + +typedef struct { + const stridx_t currency_decimal_separator; + const stridx_t currency_group_separator; + const stridx_t number_decimal_separator; + const stridx_t number_group_separator; + + const stridx_t currency_symbol; + const stridx_t percent_symbol; + const stridx_t nan_symbol; + const stridx_t per_mille_symbol; + const stridx_t negative_infinity_symbol; + const stridx_t positive_infinity_symbol; + + const stridx_t negative_sign; + const stridx_t positive_sign; + + const gint8 currency_negative_pattern; + const gint8 currency_positive_pattern; + const gint8 percent_negative_pattern; + const gint8 percent_positive_pattern; + const gint8 number_negative_pattern; + + const gint8 currency_decimal_digits; + const gint8 number_decimal_digits; + + const gint currency_group_sizes [GROUP_SIZE]; + const gint number_group_sizes [GROUP_SIZE]; +} NumberFormatEntry; + +typedef struct { + const gint ansi; + const gint ebcdic; + const gint mac; + const gint oem; + const MonoBoolean is_right_to_left; + const char list_sep; +} TextInfoEntry; + +typedef struct { + const gint16 lcid; + const gint16 parent_lcid; + const gint16 calendar_type; + const gint16 region_entry_index; + const stridx_t name; + const stridx_t englishname; + const stridx_t nativename; + const stridx_t win3lang; + const stridx_t iso3lang; + const stridx_t iso2lang; + const stridx_t territory; + const stridx_t native_calendar_names [NUM_CALENDARS]; + + const gint16 datetime_format_index; + const gint16 number_format_index; + + const TextInfoEntry text_info; +} CultureInfoEntry; + +typedef struct { + const stridx_t name; + const gint16 culture_entry_index; +} CultureInfoNameEntry; + +typedef struct { + const gint16 geo_id; + const stridx_t iso2name; + const stridx_t iso3name; + const stridx_t win3name; + const stridx_t english_name; + const stridx_t native_name; + const stridx_t currency_symbol; + const stridx_t iso_currency_symbol; + const stridx_t currency_english_name; + const stridx_t currency_native_name; +} RegionInfoEntry; + +typedef struct { + const stridx_t name; + const gint16 region_entry_index; +} RegionInfoNameEntry; + +#define NUM_CULTURE_ENTRIES 339 +#define NUM_REGION_ENTRIES 136 + + +static const DateTimeFormatEntry datetime_format_entries [] = { + {1, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {1, 10, 17, 37, 57, 81, 105, 112, 123, 134, 143, 161, 0}, {1, 10, 17, 37, 57, 81, 105, 112, 123, 134, 143, 161, 0}, {1, 10, 17, 37, 57, 81, 105, 112, 123, 134, 143, 161, 0}, {1, 10, 17, 37, 57, 81, 105, 112, 123, 134, 143, 161, 0}, 0, 6, 1, 3, {9,18,0,0,0,0,0,0,0,0,0,0,0,0},{29,42,0,0,0,0,0,0,0,0},{62,71,0,0,0,0,0,0,0,0,0,0},{77,89,0,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {109, 5, 8, {177, 190, 211, 226, 237, 256, 267}, {280, 285, 290, 295, 300, 305, 310}, {315, 318, 321, 324, 327, 318, 324}, {330, 343, 360, 369, 380, 387, 394, 401, 414, 433, 450, 465, 0}, {330, 343, 360, 369, 380, 387, 394, 401, 414, 433, 450, 465, 0}, {482, 489, 360, 496, 380, 387, 394, 503, 510, 517, 524, 531, 0}, {482, 489, 360, 496, 380, 387, 394, 503, 510, 517, 524, 531, 0}, 2, 1, 11, 3, {116,131,147,163,0,0,0,0,0,0,0,0,0,0},{180,199,217,242,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{279,0,0,0,0,0,0,0}}, + {109, 13, 19, {538, 547, 555, 563, 572, 579, 589}, {598, 602, 606, 610, 614, 618, 622}, {626, 629, 632, 635, 638, 641, 644}, {647, 653, 660, 666, 672, 677, 682, 689, 695, 704, 712, 721, 0}, {730, 739, 749, 758, 768, 776, 784, 794, 804, 816, 828, 840, 0}, {852, 857, 660, 863, 672, 677, 868, 873, 877, 882, 887, 892, 0}, {852, 857, 660, 863, 672, 677, 868, 873, 877, 882, 887, 892, 0}, 2, 1, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{315,338,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{355,0,0,0,0,0,0,0}}, + {370, 25, 32, {897, 907, 917, 927, 937, 947, 957}, {967, 974, 981, 988, 995, 1002, 1009}, {1016, 1020, 1024, 1028, 1032, 1036, 1040}, {1044, 1051, 1058, 1065, 1072, 1079, 1086, 1093, 1100, 1107, 1114, 1124, 0}, {1044, 1051, 1058, 1065, 1072, 1079, 1086, 1093, 1100, 1107, 1114, 1124, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, 0, 0, 1, 3, {379,388,397,406,417,428,439,446,453,460,0,0,0,0},{469,491,519,547,562,0,0,0,0,0},{266,71,583,591,0,0,0,0,0,0,0,0},{271,89,600,611,0,0,0,0,0},{623,639,652,666,0,0,0,0}}, + {370, 25, 32, {897, 907, 917, 927, 937, 947, 957}, {967, 974, 981, 988, 995, 1002, 1009}, {1016, 1020, 1024, 1028, 1032, 1036, 1040}, {1044, 1051, 1058, 1065, 1072, 1079, 1086, 1093, 1100, 1107, 1114, 1124, 0}, {1044, 1051, 1058, 1065, 1072, 1079, 1086, 1093, 1100, 1107, 1114, 1124, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, 0, 0, 1, 3, {379,388,397,406,417,428,439,446,453,460,0,0,0,0},{469,491,519,547,562,0,0,0,0,0},{266,71,583,591,0,0,0,0,0,0,0,0},{271,89,600,611,0,0,0,0,0},{623,639,652,666,0,0,0,0}}, + {673, 39, 44, {1197, 1205, 1215, 1223, 1231, 1240, 1247}, {1254, 1257, 1260, 1264, 1267, 1271, 1275}, {1278, 1280, 1282, 1285, 1287, 1280, 1285}, {1290, 1296, 1302, 1310, 1316, 1324, 1332, 1342, 1348, 1356, 1364, 1373, 0}, {1382, 1388, 1395, 1403, 1409, 1417, 1425, 1435, 1348, 1441, 1449, 1459, 0}, {1468, 1472, 1477, 1482, 1486, 1491, 1496, 1501, 1505, 1511, 1517, 1521, 0}, {1468, 1472, 1477, 1482, 1486, 1491, 1496, 1501, 1505, 1511, 1517, 1521, 0}, 2, 1, 11, 3, {681,692,0,0,0,0,0,0,0,0,0,0,0,0},{703,721,0,0,0,0,0,0,0,0},{266,0,0,0,0,0,0,0,0,0,0,0},{271,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 49, 52, {1525, 1533, 1540, 1548, 1555, 1563, 1570}, {1578, 1583, 1587, 1591, 1595, 1599, 1603}, {1285, 1608, 1610, 1612, 1610, 1614, 1616}, {1618, 1625, 1633, 1639, 1645, 1649, 1654, 1659, 1666, 1676, 1684, 1693, 0}, {1618, 1625, 1633, 1639, 1645, 1649, 1654, 1659, 1666, 1676, 1684, 1693, 0}, {1702, 1707, 1712, 1717, 1645, 1722, 868, 1727, 1732, 1737, 887, 1742, 0}, {1702, 1707, 1712, 1717, 1645, 1722, 868, 1727, 1732, 1737, 887, 1742, 0}, 2, 1, 55, 3, {744,755,417,764,0,0,0,0,0,0,0,0,0,0},{721,0,0,0,0,0,0,0,0,0},{71,266,0,0,0,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 57, 63, {1747, 1755, 1762, 1771, 1780, 1791, 1799}, {1807, 1810, 1813, 1816, 1819, 1822, 1825}, {1285, 1608, 1828, 1608, 1828, 1614, 1285}, {1830, 1837, 1845, 1851, 1857, 1861, 1866, 1871, 1878, 1888, 1896, 1905, 0}, {1830, 1837, 1845, 1851, 1857, 1861, 1866, 1871, 1878, 1888, 1896, 1905, 0}, {1914, 1918, 1922, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, {1914, 1918, 1922, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, 2, 1, 11, 3, {681,775,417,784,0,0,0,0,0,0,0,0,0,0},{798,721,817,0,0,0,0,0,0,0},{71,830,0,0,0,0,0,0,0,0,0,0},{89,842,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 70, 77, {1959, 1974, 1989, 2000, 2015, 2028, 2047}, {2062, 2069, 2076, 2083, 2090, 2097, 2104}, {2111, 2114, 2117, 2117, 2120, 2120, 2123}, {2126, 2147, 2170, 2185, 2202, 2213, 2228, 2243, 2262, 2285, 2304, 2323, 0}, {2344, 2365, 2388, 2403, 2420, 2431, 2446, 2461, 2480, 2503, 2522, 2541, 0}, {2562, 2569, 2576, 2583, 2590, 2597, 2606, 2615, 2622, 2629, 2636, 2643, 0}, {2562, 2569, 2576, 2583, 2590, 2597, 2606, 2615, 2622, 2629, 2636, 2643, 0}, 2, 1, 1, 3, {295,18,857,9,864,417,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,62,266,71,0,0,0,0,0,0,0,0},{914,77,271,89,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 49, 52, {2650, 2657, 2664, 2672, 2682, 2691, 2698}, {2707, 2711, 2715, 2719, 2723, 2727, 2731}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, 0, 0, 1, 3, {932,941,948,957,460,417,968,0,0,0,0,0,0,0},{978,997,1010,1029,0,0,0,0,0,0},{906,62,266,71,0,0,0,0,0,0,0,0},{914,77,271,89,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1042, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 2890, 2892, 2894, 1285}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 2986, 882, 887, 2992, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 2986, 882, 887, 2992, 0}, 0, 1, 1, 3, {18,9,1054,857,1062,755,775,417,0,0,0,0,0,0},{1069,1097,1124,0,0,0,0,0,0,0},{266,71,1146,1151,1157,0,0,0,0,0,0,0},{271,89,1165,1173,1182,0,0,0,0},{1193,0,0,0,0,0,0,0}}, + {673, 84, 88, {2997, 3009, 3021, 3031, 3045, 3055, 3067}, {3078, 3081, 3084, 3087, 3090, 3093, 3096}, {1285, 1608, 1610, 3099, 1610, 1280, 1616}, {3101, 3110, 3119, 3129, 3138, 3147, 3156, 3166, 3173, 3181, 3189, 3199, 0}, {3208, 3219, 3230, 3242, 3253, 3264, 3275, 3287, 3296, 3306, 3316, 3328, 0}, {3339, 3345, 3351, 3358, 3364, 3370, 3376, 3383, 3387, 3392, 3397, 3404, 0}, {3339, 3345, 3351, 3358, 3364, 3370, 3376, 3383, 3387, 3392, 3397, 3404, 0}, 2, 1, 11, 11, {1208,0,0,0,0,0,0,0,0,0,0,0,0,0},{703,721,0,0,0,0,0,0,0,0},{1146,0,0,0,0,0,0,0,0,0,0,0},{1165,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 49, 52, {3410, 3419, 3425, 3431, 3440, 3446, 3455}, {3462, 2863, 1712, 3467, 3472, 3477, 3482}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, 0, 1, 1, 3, {18,9,775,755,417,0,0,0,0,0,0,0,0,0},{1217,894,1234,0,0,0,0,0,0,0},{71,266,1151,1243,1253,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 92, 105, {3596, 3614, 3628, 3646, 3664, 3682, 3698}, {3712, 3724, 3736, 3748, 3760, 3772, 3784}, {3791, 3796, 3801, 3806, 3811, 3816, 3821}, {3826, 3837, 3850, 3857, 3868, 3875, 3884, 3893, 3906, 3919, 3934, 3947, 0}, {3826, 3837, 3850, 3857, 3868, 3875, 3884, 3893, 3906, 3919, 3934, 3947, 0}, {3958, 3967, 3850, 3976, 3868, 3875, 3884, 3985, 3994, 4003, 4012, 4021, 0}, {3958, 3967, 3850, 3976, 3868, 3875, 3884, 3985, 3994, 4003, 4012, 4021, 0}, 0, 0, 1, 3, {18,1261,9,29,755,744,1274,417,1287,1304,0,0,0,0},{1314,1261,1332,1354,1287,0,0,0,0,0},{71,62,0,0,0,0,0,0,0,0,0,0},{89,77,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1375, 116, 120, {4030, 4040, 4048, 4053, 4060, 4073, 4081}, {2894, 4089, 3099, 4091, 4095, 1280, 4098}, {2894, 4089, 3099, 4102, 4095, 1280, 4102}, {4105, 4113, 4122, 4131, 4140, 4147, 4155, 4163, 4173, 4184, 1684, 1693, 0}, {4105, 4113, 4122, 4131, 4140, 4147, 4155, 4163, 4173, 4184, 1684, 1693, 0}, {1702, 857, 4193, 4200, 4206, 4212, 4218, 1727, 4224, 1737, 887, 1742, 0}, {1702, 857, 4193, 4200, 4206, 4212, 4218, 1727, 4224, 1737, 887, 1742, 0}, 2, 1, 124, 3, {1383,1397,0,0,0,0,0,0,0,0,0,0,0,0},{1410,1430,0,0,0,0,0,0,0,0},{266,0,0,0,0,0,0,0,0,0,0,0},{271,0,0,0,0,0,0,0,0},{1444,0,0,0,0,0,0,0}}, + {673, 127, 132, {4231, 4242, 4253, 4267, 4281, 4293, 4305}, {4317, 4322, 4328, 4334, 4340, 4345, 4351}, {1285, 1608, 4356, 1608, 1614, 1614, 1616}, {4359, 4367, 3504, 4376, 4383, 4388, 4395, 4402, 1666, 4184, 4410, 4420, 0}, {4359, 4367, 3504, 4376, 4383, 4388, 4395, 4402, 1666, 4184, 4410, 4420, 0}, {1702, 1707, 1712, 1717, 4383, 4212, 4218, 4429, 1732, 1737, 4436, 892, 0}, {1702, 1707, 1712, 1717, 4383, 4212, 4218, 4429, 1732, 1737, 4436, 892, 0}, 2, 1, 11, 3, {1208,1455,0,0,0,0,0,0,0,0,0,0,0,0},{798,721,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 49, 52, {4442, 4451, 4459, 4468, 4479, 4488, 4497}, {4504, 4508, 4512, 4516, 4520, 4524, 4528}, {1828, 1616, 1608, 1608, 4532, 2894, 1285}, {4534, 4542, 2910, 4551, 4558, 4565, 4572, 2933, 4579, 4589, 712, 4597, 0}, {4534, 4542, 2910, 4551, 4558, 4565, 4572, 2933, 4579, 4589, 712, 4597, 0}, {4606, 4610, 4512, 4614, 4618, 4622, 4626, 4630, 4634, 4638, 4642, 4646, 0}, {4606, 4610, 4512, 4614, 4618, 4622, 4626, 4630, 4634, 4638, 4642, 4646, 0}, 2, 1, 1, 3, {18,864,9,1467,857,0,0,0,0,0,0,0,0,0},{1217,1475,894,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {370, 137, 144, {4650, 4660, 4670, 4680, 4690, 4700, 4710}, {1016, 4720, 4724, 4728, 4732, 4736, 4740}, {1016, 4720, 4724, 4728, 4732, 4736, 4740}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {4744, 4746, 4748, 4750, 4752, 4754, 4756, 4758, 4760, 4762, 4765, 4768, 0}, {4744, 4746, 4748, 4750, 4752, 4754, 4756, 4758, 4760, 4762, 4765, 4768, 0}, 0, 0, 1, 3, {406,460,439,379,417,0,0,0,0,0,0,0,0,0},{469,1484,1508,1535,1564,1588,1617,1637,0,0},{266,71,583,591,0,0,0,0,0,0,0,0},{271,89,600,611,0,0,0,0,0},{623,1662,652,0,0,0,0,0}}, + {1680, 151, 158, {4771, 4781, 4791, 4801, 4811, 4821, 4831}, {4841, 4845, 4849, 4853, 4857, 4861, 4865}, {4841, 4845, 4849, 4853, 4857, 4861, 4865}, {4869, 4874, 4879, 4884, 4889, 4894, 4899, 4904, 4909, 4914, 4920, 4926, 0}, {4869, 4874, 4879, 4884, 4889, 4894, 4899, 4904, 4909, 4914, 4920, 4926, 0}, {4869, 4874, 4879, 4884, 4889, 4894, 4899, 4904, 4909, 4914, 4920, 4926, 0}, {4869, 4874, 4879, 4884, 4889, 4894, 4899, 4904, 4909, 4914, 4920, 4926, 0}, 0, 0, 55, 3, {417,1690,446,388,0,0,0,0,0,0,0,0,0,0},{1699,1728,1752,1779,1801,1832,1858,1889,1915,1942},{583,591,266,71,0,0,0,0,0,0,0,0},{600,611,271,89,0,0,0,0,0},{1964,1981,2000,0,0,0,0,0}}, + {109, 165, 170, {4932, 4939, 4947, 4955, 4964, 4974, 4982}, {4991, 3081, 4994, 4997, 5000, 5003, 5006}, {5009, 1608, 1828, 2735, 1828, 2894, 5009}, {5011, 5019, 5028, 1639, 5034, 1649, 1654, 5038, 1666, 1676, 1684, 1693, 0}, {5011, 5019, 5028, 1639, 5034, 1649, 1654, 5038, 1666, 1676, 1684, 1693, 0}, {1702, 1707, 5047, 1717, 5034, 1722, 868, 1727, 1732, 1737, 887, 1742, 0}, {1702, 1707, 5047, 1717, 5034, 1722, 868, 1727, 1732, 1737, 887, 1742, 0}, 2, 1, 55, 3, {2015,1062,755,9,775,2024,417,0,0,0,0,0,0,0},{1217,1475,894,1234,0,0,0,0,0,0},{71,266,1146,2036,2048,0,0,0,0,0,0,0},{89,271,2060,2075,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {2090, 165, 170, {1525, 1533, 1540, 1548, 1555, 1563, 1570}, {5052, 5058, 5063, 5068, 5073, 5078, 5083}, {1285, 1608, 1610, 1612, 1610, 1614, 1616}, {1618, 1625, 3504, 1639, 3515, 1649, 1654, 1659, 1666, 1676, 1684, 4420, 0}, {1618, 1625, 3504, 1639, 3515, 1649, 1654, 1659, 1666, 1676, 1684, 4420, 0}, {5089, 4610, 4512, 4614, 3515, 5093, 5097, 5101, 5105, 5109, 4642, 5113, 0}, {5089, 4610, 4512, 4614, 3515, 5093, 5097, 5101, 5105, 5109, 4642, 5113, 0}, 0, 0, 11, 11, {681,1455,0,0,0,0,0,0,0,0,0,0,0,0},{703,721,0,0,0,0,0,0,0,0},{1151,0,0,0,0,0,0,0,0,0,0,0},{1173,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 49, 52, {5117, 5127, 5141, 5148, 5155, 5164, 1247}, {5172, 5179, 5184, 5188, 5193, 5198, 5202}, {1278, 1280, 2735, 5207, 5210, 1280, 1285}, {5212, 5221, 5226, 5233, 1645, 5243, 5252, 5259, 5269, 5279, 1364, 5292, 0}, {5302, 5311, 5318, 5324, 5333, 5338, 5346, 5352, 5361, 5371, 5385, 5395, 0}, {5403, 5407, 4512, 5411, 1645, 5415, 5419, 5423, 5427, 5431, 1517, 5436, 0}, {5403, 5407, 4512, 5411, 1645, 5415, 5419, 5423, 5427, 5431, 1517, 5436, 0}, 2, 1, 11, 3, {681,0,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1042, 49, 52, {2803, 5440, 5454, 5467, 5480, 5493, 2850}, {4504, 5505, 5509, 5513, 5517, 5521, 5525}, {1828, 1285, 1610, 5530, 5530, 1285, 1285}, {5532, 5540, 5550, 666, 5557, 5562, 5568, 2933, 5574, 5583, 5591, 5600, 0}, {5532, 5540, 5550, 666, 5557, 5562, 5568, 2933, 5574, 5583, 5591, 5600, 0}, {5089, 5609, 4512, 5613, 3515, 5093, 5097, 4630, 4634, 5617, 4642, 5621, 0}, {5089, 5609, 4512, 5613, 3515, 5093, 5097, 4630, 4634, 5617, 4642, 5621, 0}, 0, 0, 1, 3, {18,9,295,857,755,744,1062,2015,775,681,2024,2098,1208,417},{1069,1124,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{1193,0,0,0,0,0,0,0}}, + {673, 49, 52, {5625, 5634, 3425, 5644, 5652, 5660, 5669}, {5675, 5678, 3081, 5682, 5685, 5689, 1275}, {1828, 4532, 1608, 1608, 4532, 2894, 1285}, {5692, 5700, 3504, 5707, 5714, 5719, 5729, 5737, 5743, 5753, 1684, 1693, 0}, {5692, 5700, 3504, 5707, 5714, 5719, 5729, 5737, 5743, 5753, 1684, 1693, 0}, {5761, 5768, 3504, 3579, 5714, 5774, 5781, 5737, 5786, 882, 887, 1742, 0}, {5761, 5768, 3504, 3579, 5714, 5774, 5781, 5737, 5786, 882, 887, 1742, 0}, 2, 1, 55, 3, {744,0,0,0,0,0,0,0,0,0,0,0,0,0},{2105,2134,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 165, 170, {5792, 5802, 5807, 5814, 5823, 5827, 5834}, {5845, 2863, 1712, 5850, 5823, 5855, 5860}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {5866, 5875, 5885, 5892, 3515, 5900, 5906, 1659, 5912, 5923, 5933, 5943, 0}, {5866, 5875, 5885, 5892, 3515, 5900, 5906, 1659, 5912, 5923, 5933, 5943, 0}, {5953, 1707, 1712, 1717, 3515, 5958, 5963, 1727, 2986, 882, 887, 1742, 0}, {5953, 1707, 1712, 1717, 3515, 5958, 5963, 1727, 2986, 882, 887, 1742, 0}, 0, 1, 11, 3, {681,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 175, 180, {5968, 5991, 211, 6014, 6025, 6040, 6055}, {6070, 285, 290, 295, 300, 305, 310}, {6075, 6078, 6075, 6081, 6084, 6078, 6081}, {6087, 6100, 360, 6115, 380, 6128, 6137, 401, 6146, 6163, 6178, 6191, 0}, {6206, 6219, 6234, 6245, 6258, 6265, 6274, 6283, 6298, 6315, 6330, 6343, 0}, {6358, 6366, 360, 6376, 380, 6128, 6137, 6384, 6392, 6402, 6410, 6420, 0}, {6358, 6366, 360, 6376, 380, 6128, 6137, 6384, 6392, 6402, 6410, 6420, 0}, 0, 1, 11, 3, {681,775,2098,744,9,0,0,0,0,0,0,0,0,0},{199,180,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 49, 52, {6428, 6437, 6449, 6456, 6464, 6474, 6480}, {6487, 6491, 6495, 6499, 6503, 6508, 6512}, {6516, 6518, 6520, 6522, 6524, 6518, 6522}, {6527, 6537, 6546, 6554, 6562, 6570, 6577, 6584, 6592, 1364, 6598, 6606, 0}, {6615, 6625, 6634, 6642, 6650, 6658, 6665, 6672, 6681, 5385, 6687, 6697, 0}, {6706, 6710, 6715, 6720, 6724, 5419, 1501, 6728, 6732, 1517, 6736, 1521, 0}, {6706, 6710, 6715, 6720, 6724, 5419, 1501, 6728, 6732, 1517, 6736, 1521, 0}, 0, 1, 11, 3, {2151,2161,2169,2181,2193,2203,2213,417,0,0,0,0,0,0},{2225,2239,2254,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {673, 49, 52, {6740, 6748, 6757, 6764, 6771, 6780, 1247}, {1254, 1257, 6787, 1264, 6790, 6794, 1275}, {6516, 6518, 6520, 6522, 6797, 6518, 6522}, {4105, 4113, 6800, 4376, 6806, 6811, 6816, 1659, 1666, 4184, 1684, 1693, 0}, {6821, 6830, 5318, 6840, 6848, 6854, 6860, 6866, 6874, 6884, 6893, 6902, 0}, {5089, 4610, 4512, 4614, 6806, 6811, 6816, 5101, 5105, 5109, 4642, 6911, 0}, {5089, 4610, 4512, 4614, 6806, 6811, 6816, 5101, 5105, 5109, 4642, 6911, 0}, 2, 1, 11, 3, {681,692,0,0,0,0,0,0,0,0,0,0,0,0},{798,721,0,0,0,0,0,0,0,0},{266,0,0,0,0,0,0,0,0,0,0,0},{271,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 185, 197, {6915, 6922, 6931, 6940, 6952, 6960, 6969}, {6979, 6983, 2791, 6988, 6993, 6997, 7001}, {1828, 4089, 1608, 1608, 7005, 1280, 1285}, {7007, 7013, 7020, 7025, 7031, 7035, 7043, 7050, 7056, 7064, 7070, 7078, 0}, {7086, 7092, 3504, 7099, 1645, 7105, 7113, 7120, 7126, 7134, 7140, 7148, 0}, {1914, 7156, 2791, 7160, 7031, 7164, 7168, 7172, 7001, 7176, 7180, 7185, 0}, {1914, 7156, 2791, 7160, 7031, 7164, 7168, 7172, 7001, 7176, 7180, 7185, 0}, 0, 1, 11, 3, {1208,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {2274, 208, 211, {7189, 7197, 7205, 1548, 1555, 1563, 7212}, {7220, 7225, 7230, 1591, 7234, 1599, 7239}, {1285, 1608, 1610, 1612, 1610, 1614, 1616}, {5011, 5019, 3504, 1639, 1645, 1649, 1654, 7244, 1666, 1676, 1684, 1693, 0}, {5011, 5019, 3504, 1639, 1645, 1649, 1654, 7244, 1666, 1676, 1684, 1693, 0}, {1702, 1707, 3504, 1717, 1645, 1649, 1654, 1727, 1732, 1737, 887, 1742, 0}, {1702, 1707, 3504, 1717, 1645, 1649, 1654, 1727, 1732, 1737, 887, 1742, 0}, 2, 1, 55, 3, {417,1690,0,0,0,0,0,0,0,0,0,0,0,0},{2287,2305,0,0,0,0,0,0,0,0},{71,266,2328,0,0,0,0,0,0,0,0,0},{89,271,2338,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {4744, 4746, 4748, 4750, 4752, 4754, 4756, 4758, 4760, 4762, 4765, 4768, 0}, {4744, 4746, 4748, 4750, 4752, 4754, 4756, 4758, 4760, 4762, 4765, 4768, 0}, 0, 0, 1, 3, {295,857,9,18,304,2351,417,0,0,0,0,0,0,0},{894,2363,2379,0,0,0,0,0,0,0},{266,71,906,62,0,0,0,0,0,0,0,0},{271,89,914,77,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 214, 219, {7252, 7258, 7268, 7274, 7285, 7295, 7300}, {7310, 7314, 7318, 7322, 7327, 7331, 7335}, {1280, 1280, 1285, 7339, 1280, 5210, 5210}, {7342, 7347, 7354, 7359, 7365, 7372, 7380, 7387, 7396, 7403, 7408, 7415, 0}, {7342, 7347, 7354, 7359, 7365, 7372, 7380, 7387, 7396, 7403, 7408, 7415, 0}, {7423, 7427, 2791, 7432, 2760, 7436, 7440, 7444, 7449, 7453, 7457, 7461, 0}, {7423, 7427, 2791, 7432, 2760, 7436, 7440, 7444, 7449, 7453, 7457, 7461, 0}, 0, 1, 11, 3, {2421,304,0,0,0,0,0,0,0,0,0,0,0,0},{2431,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 49, 52, {7465, 7476, 7489, 7498, 7505, 7518, 7527}, {7465, 7476, 7489, 7498, 7505, 7518, 7527}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {7536, 7547, 7558, 7567, 7578, 7585, 7592, 7605, 7614, 7625, 7638, 7649, 0}, {7536, 7547, 7558, 7567, 7578, 7585, 7592, 7605, 7614, 7625, 7638, 7649, 0}, {7536, 7547, 7558, 7567, 7578, 7585, 7592, 7605, 7614, 7625, 7638, 7649, 0}, {7536, 7547, 7558, 7567, 7578, 7585, 7592, 7605, 7614, 7625, 7638, 7649, 0}, 0, 0, 1, 3, {18,9,417,0,0,0,0,0,0,0,0,0,0,0},{2448,42,0,0,0,0,0,0,0,0},{906,62,266,71,0,0,0,0,0,0,0,0},{914,77,271,89,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {109, 49, 52, {7660, 7667, 7673, 7680, 7685, 7691, 7697}, {7703, 7707, 7711, 7715, 7719, 7723, 7727}, {1608, 1285, 1285, 7731, 3099, 2892, 1285}, {7733, 7741, 7750, 1851, 7756, 1861, 1866, 7760, 1878, 1888, 1896, 7768, 0}, {7733, 7741, 7750, 1851, 7756, 1861, 1866, 7760, 1878, 1888, 1896, 7768, 0}, {1914, 1918, 2791, 1927, 7756, 1931, 1935, 7777, 1943, 1947, 1951, 7781, 0}, {1914, 1918, 2791, 1927, 7756, 1931, 1935, 7777, 1943, 1947, 1951, 7781, 0}, 0, 0, 1, 11, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{2462,894,0,0,0,0,0,0,0,0},{1151,0,0,0,0,0,0,0,0,0,0,0},{1173,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 223, 228, {7785, 7798, 7817, 7834, 7847, 7860, 7877}, {280, 285, 290, 295, 300, 305, 310}, {7890, 6078, 6075, 6081, 6084, 6078, 6081}, {7893, 7906, 7917, 7934, 7949, 7964, 7979, 7992, 8007, 8024, 8039, 8056, 0}, {8071, 8082, 8095, 8110, 8123, 8136, 8149, 8160, 8173, 8188, 8201, 8220, 0}, {8233, 8240, 8247, 8254, 8261, 8268, 8275, 8282, 8289, 8296, 8303, 8310, 0}, {8233, 8240, 8247, 8254, 8261, 8268, 8275, 8282, 8289, 8296, 8303, 8310, 0}, 0, 1, 11, 3, {681,775,417,0,0,0,0,0,0,0,0,0,0,0},{2481,0,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{2499,0,0,0,0,0,0,0}}, + {109, 49, 52, {8317, 8332, 8353, 8368, 8381, 8394, 7877}, {280, 285, 8409, 295, 8414, 305, 310}, {315, 318, 8419, 324, 327, 318, 324}, {8422, 8439, 8448, 8463, 380, 8480, 8495, 8508, 8523, 8540, 8561, 8578, 0}, {8593, 8610, 8623, 8640, 6258, 8659, 8674, 8687, 8700, 8715, 8738, 8757, 0}, {8770, 8240, 8777, 8784, 380, 8791, 8798, 8805, 8289, 8812, 8819, 8826, 0}, {8770, 8240, 8777, 8784, 380, 8791, 8798, 8805, 8289, 8812, 8819, 8826, 0}, 0, 1, 11, 3, {775,0,0,0,0,0,0,0,0,0,0,0,0,0},{894,0,0,0,0,0,0,0,0,0},{71,266,0,0,0,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{2515,0,0,0,0,0,0,0}}, + {673, 39, 233, {8833, 8841, 8852, 8858, 8864, 8873, 1247}, {8879, 5179, 5073, 8884, 8889, 8895, 5202}, {6516, 6518, 8900, 6522, 6524, 6518, 6522}, {1618, 1625, 6800, 1639, 1645, 8902, 8908, 8914, 1666, 1676, 1684, 1693, 0}, {1618, 1625, 6800, 1639, 1645, 8902, 8908, 8914, 1666, 1676, 1684, 1693, 0}, {1702, 1707, 1712, 1717, 1645, 1722, 868, 8921, 1732, 1737, 887, 1742, 0}, {1702, 1707, 1712, 1717, 1645, 1722, 868, 8921, 1732, 1737, 887, 1742, 0}, 0, 1, 124, 3, {2529,1455,0,0,0,0,0,0,0,0,0,0,0,0},{2541,2561,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 49, 52, {8926, 8937, 8948, 8959, 8970, 8981, 8987}, {1280, 7005, 1610, 3099, 1278, 7731, 1616}, {1280, 7005, 1610, 3099, 1278, 7731, 1616}, {8996, 9004, 9013, 9020, 3515, 9027, 9033, 1659, 1666, 9039, 1684, 9048, 0}, {8996, 9004, 9013, 9020, 3515, 9027, 9033, 1659, 1666, 9039, 1684, 9048, 0}, {9058, 9063, 9013, 4614, 3515, 9027, 9033, 5101, 9069, 5109, 4642, 9074, 0}, {9058, 9063, 9013, 4614, 3515, 9027, 9033, 5101, 9069, 5109, 4642, 9074, 0}, 2, 1, 11, 3, {681,1455,0,0,0,0,0,0,0,0,0,0,0,0},{798,721,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{2575,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 238, 248, {9079, 9090, 9100, 9109, 9120, 9132, 9143}, {9153, 9161, 9168, 9174, 9182, 9191, 9199}, {1285, 1280, 1612, 1610, 5210, 1280, 1285}, {9206, 9216, 1633, 9227, 9236, 9242, 9250, 9258, 9266, 9277, 9286, 9296, 0}, {9206, 9216, 1633, 9227, 9236, 9242, 9250, 9258, 9266, 9277, 9286, 9296, 0}, {3566, 857, 1633, 1717, 9236, 9306, 9312, 1727, 2986, 1737, 887, 1742, 0}, {3566, 857, 1633, 1717, 9236, 9306, 9312, 1727, 2986, 1737, 887, 1742, 0}, 0, 1, 11, 3, {681,2583,0,0,0,0,0,0,0,0,0,0,0,0},{2603,2630,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2651,0,0,0,0,0,0,0}}, + {925, 255, 266, {9318, 9330, 9342, 9354, 9368, 9383, 9396}, {9410, 9413, 9416, 9419, 9422, 9425, 6790}, {1285, 1280, 9428, 1610, 3099, 1280, 9430}, {9433, 9440, 9448, 9454, 9463, 9472, 9482, 9488, 9499, 9509, 9516, 9526, 0}, {9534, 9541, 9549, 9554, 9565, 9575, 9585, 9592, 9604, 9613, 9620, 9631, 0}, {9641, 9647, 9652, 9657, 9662, 9667, 9674, 9680, 9686, 9692, 9698, 9705, 0}, {9641, 9647, 9652, 9657, 9662, 9667, 9674, 9680, 9686, 9692, 9698, 9705, 0}, 2, 1, 55, 3, {417,0,0,0,0,0,0,0,0,0,0,0,0,0},{2667,2695,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {1, 273, 285, {9712, 9727, 9742, 9757, 9774, 9793, 9804}, {9815, 9822, 9829, 9836, 9843, 9850, 9857}, {0, 0, 0, 0, 0, 0, 0}, {9864, 9875, 9888, 9897, 9908, 9915, 9922, 9929, 9942, 9957, 9970, 9981, 0}, {9864, 9875, 9888, 9897, 9908, 9915, 9922, 9929, 9942, 9957, 9970, 9981, 0}, {9994, 10001, 10008, 10015, 9908, 9915, 9922, 10022, 10029, 10036, 10043, 10050, 0}, {9994, 10001, 10008, 10015, 9908, 9915, 9922, 10022, 10029, 10036, 10043, 10050, 0}, 0, 0, 11, 3, {681,775,2098,744,9,0,0,0,0,0,0,0,0,0},{2727,2745,0,0,0,0,0,0,0,0},{71,266,0,0,0,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 297, 304, {10057, 10070, 10083, 10099, 10116, 10131, 10140}, {10057, 10070, 10083, 10099, 10116, 10131, 10140}, {10149, 10152, 10155, 10158, 10161, 10164, 10167}, {10170, 10183, 10194, 10203, 10214, 10219, 10228, 10239, 10246, 10261, 10272, 10285, 0}, {10298, 10313, 10194, 10203, 10326, 10219, 10333, 10239, 10246, 10261, 10272, 10285, 0}, {10170, 10183, 10194, 10203, 10214, 10219, 10228, 10239, 10246, 10261, 10272, 10285, 0}, {10170, 10183, 10194, 10203, 10214, 10219, 10228, 10239, 10246, 10261, 10272, 10285, 0}, 0, 6, 1, 3, {18,9,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{62,71,0,0,0,0,0,0,0,0,0,0},{77,89,0,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {1, 311, 314, {10346, 10359, 10369, 10378, 10388, 10399, 10410}, {10422, 10425, 10430, 10435, 10440, 10445, 10450}, {10422, 10455, 10458, 10461, 10464, 10467, 10470}, {10473, 10482, 10491, 10500, 10509, 10518, 10527, 10536, 10545, 10554, 10564, 10574, 0}, {10584, 10593, 10602, 10611, 10620, 10629, 10638, 10647, 10656, 10665, 10675, 10685, 0}, {10695, 10701, 10707, 10713, 10719, 10725, 10731, 10737, 10743, 10749, 10756, 10763, 0}, {10695, 10701, 10707, 10713, 10719, 10725, 10731, 10737, 10743, 10749, 10756, 10763, 0}, 0, 1, 1, 3, {18,9,755,744,417,0,0,0,0,0,0,0,0,0},{1261,0,0,0,0,0,0,0,0,0},{906,62,266,71,0,0,0,0,0,0,0,0},{914,77,271,89,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 317, 322, {10770, 10783, 10804, 10823, 10844, 10863, 10876}, {10887, 10894, 10901, 10908, 10915, 10922, 10929}, {10936, 10939, 10939, 10942, 10945, 10948, 10951}, {10954, 10969, 10984, 10993, 11004, 11015, 11028, 11041, 11056, 11075, 11094, 11111, 0}, {11130, 11147, 11164, 11175, 11188, 11201, 11216, 11231, 11248, 11269, 11290, 11309, 0}, {11330, 11337, 11344, 11351, 11358, 11365, 11372, 11379, 11386, 11393, 11400, 11407, 0}, {11330, 11337, 11344, 11351, 11358, 11365, 11372, 11379, 11386, 11393, 11400, 11407, 0}, 0, 1, 11, 3, {681,775,2764,18,2774,864,417,0,0,0,0,0,0,0},{1029,876,2462,1261,2785,2796,2808,2825,0,0},{71,266,0,0,0,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {109, 49, 52, {11414, 11420, 11434, 11457, 11471, 11487, 11494}, {11503, 11506, 11511, 11517, 11521, 11526, 11529}, {4756, 4744, 4746, 4748, 4750, 4752, 4754}, {11533, 11540, 7354, 11547, 2760, 11553, 11559, 11565, 11572, 11581, 11589, 11596, 0}, {11603, 11610, 11617, 11622, 11628, 11632, 11637, 11642, 11649, 11658, 11666, 11673, 0}, {11680, 5609, 4512, 4614, 11628, 11684, 11688, 11692, 11696, 5109, 11700, 11704, 0}, {11680, 5609, 4512, 4614, 11628, 11684, 11688, 11692, 11696, 5109, 11700, 11704, 0}, 0, 0, 11, 3, {681,304,0,0,0,0,0,0,0,0,0,0,0,0},{2843,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 49, 52, {11708, 11716, 11727, 11737, 11748, 11757, 11766}, {11776, 11780, 11784, 11788, 11792, 11796, 11800}, {11804, 9428, 9428, 9428, 1612, 1612, 1616}, {11806, 11816, 11824, 11832, 11840, 11848, 11855, 11863, 11871, 11878, 11884, 11891, 0}, {11806, 11899, 11907, 11915, 11923, 11931, 11938, 11946, 11954, 11961, 11967, 11974, 0}, {11982, 11987, 1712, 11992, 11997, 12002, 12007, 12012, 12017, 12022, 12027, 12032, 0}, {11982, 11987, 1712, 11992, 11997, 12002, 12007, 12012, 12017, 12022, 12027, 12032, 0}, 2, 1, 1, 3, {406,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2872,2899,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2920,0,0,0,0,0,0,0}}, + {673, 327, 338, {12037, 12047, 12058, 12065, 12072, 12082, 1247}, {12088, 12092, 12097, 12101, 12105, 12110, 12114}, {6516, 6518, 12118, 6522, 6797, 6518, 6522}, {1618, 1625, 12120, 12126, 12132, 8902, 8908, 12137, 1666, 1676, 12144, 1693, 0}, {12153, 12161, 12170, 12177, 12184, 12189, 12196, 12203, 6874, 12211, 12219, 6902, 0}, {5089, 4610, 12228, 4614, 12233, 5093, 5097, 12237, 5105, 5109, 12241, 6911, 0}, {5089, 4610, 12228, 4614, 12233, 5093, 5097, 12237, 5105, 5109, 12241, 6911, 0}, 2, 1, 11, 3, {1208,0,0,0,0,0,0,0,0,0,0,0,0,0},{798,721,0,0,0,0,0,0,0,0},{2939,0,0,0,0,0,0,0,0,0,0,0},{271,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 349, 363, {12245, 190, 211, 6014, 12258, 12275, 12286}, {12299, 12307, 12315, 12323, 12331, 12339, 12347}, {315, 318, 321, 324, 327, 318, 324}, {12355, 343, 360, 369, 12370, 12377, 12386, 401, 414, 433, 450, 465, 0}, {12355, 343, 360, 369, 12370, 12377, 12386, 401, 414, 433, 450, 465, 0}, {12395, 12403, 12411, 6376, 12370, 12419, 12427, 6384, 12435, 6402, 12445, 6420, 0}, {12395, 12403, 12411, 6376, 12370, 12419, 12427, 6384, 12435, 6402, 12445, 6420, 0}, 0, 1, 11, 3, {2953,0,0,0,0,0,0,0,0,0,0,0,0,0},{2462,1261,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2963,0,0,0,0,0,0,0}}, + {925, 0, 0, {12455, 12463, 12472, 12481, 12490, 12497, 12507}, {12516, 12520, 12524, 12528, 12532, 12535, 12539}, {0, 0, 0, 0, 0, 0, 0}, {12543, 12554, 12562, 12572, 12578, 12590, 12599, 12605, 12611, 12619, 12628, 12640, 0}, {12543, 12554, 12562, 12572, 12578, 12590, 12599, 12605, 12611, 12619, 12628, 12640, 0}, {12648, 12652, 12656, 12660, 12664, 1914, 12668, 12672, 12676, 12680, 12684, 12688, 0}, {12648, 12652, 12656, 12660, 12664, 1914, 12668, 12672, 12676, 12680, 12684, 12688, 0}, 0, 0, 55, 3, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2979,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {925, 0, 0, {12692, 12698, 12711, 12722, 12733, 12742, 12754}, {12516, 12764, 12768, 12772, 12532, 12776, 12780}, {0, 0, 0, 0, 0, 0, 0}, {12784, 12792, 12804, 12816, 12828, 12838, 12850, 12859, 12867, 12875, 12885, 12892, 0}, {12784, 12792, 12804, 12816, 12828, 12838, 12850, 12859, 12867, 12875, 12885, 12892, 0}, {2707, 12906, 12910, 12914, 12918, 12922, 12926, 12930, 12934, 12938, 12942, 12946, 0}, {2707, 12906, 12910, 12914, 12918, 12922, 12926, 12930, 12934, 12938, 12942, 12946, 0}, 0, 0, 55, 3, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2979,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {925, 0, 0, {12950, 12957, 12472, 12968, 12490, 12977, 12988}, {12688, 12998, 12524, 12528, 12532, 13002, 13006}, {0, 0, 0, 0, 0, 0, 0}, {13010, 13020, 13029, 13037, 13046, 13059, 13071, 13078, 13085, 13092, 13102, 13114, 0}, {13010, 13020, 13029, 13037, 13046, 13059, 13071, 13078, 13085, 13092, 13102, 13114, 0}, {13127, 12776, 13131, 13135, 12664, 13139, 13143, 12672, 13147, 13151, 13155, 13159, 0}, {13127, 12776, 13131, 13135, 12664, 13139, 13143, 12672, 13147, 13151, 13155, 13159, 0}, 0, 0, 55, 3, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2979,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {925, 0, 0, {13163, 13168, 13174, 13184, 13196, 13204, 13215}, {13224, 13228, 13232, 13236, 13240, 12535, 13244}, {0, 0, 0, 0, 0, 0, 0}, {13248, 13258, 13268, 13275, 13282, 1861, 13287, 13294, 13301, 13310, 13318, 13326, 0}, {13248, 13258, 13268, 13275, 13282, 1861, 13287, 13294, 13301, 13310, 13318, 13326, 0}, {1914, 1918, 13006, 13334, 13338, 1931, 1935, 13342, 1943, 1947, 1951, 13346, 0}, {1914, 1918, 13006, 13334, 13338, 1931, 1935, 13342, 1943, 1947, 1951, 13346, 0}, 0, 0, 55, 3, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2979,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {925, 49, 52, {13350, 13357, 13369, 13380, 13393, 13402, 13414}, {12516, 13424, 13428, 13236, 13240, 12535, 13244}, {1285, 1608, 13432, 1610, 1285, 4089, 1608}, {13434, 13258, 13443, 13449, 13282, 1861, 13287, 13294, 13457, 13310, 13318, 13326, 0}, {13467, 13258, 13443, 13449, 13282, 1861, 13287, 13294, 13457, 13310, 13318, 13326, 0}, {1914, 1918, 13478, 13482, 13338, 1931, 1935, 13342, 1943, 1947, 1951, 13346, 0}, {1914, 1918, 13478, 13482, 13338, 1931, 1935, 13342, 1943, 1947, 1951, 13346, 0}, 0, 0, 1, 3, {932,3009,0,0,0,0,0,0,0,0,0,0,0,0},{978,997,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 373, 377, {13486, 13493, 13501, 13509, 13518, 13528, 13535}, {13544, 13548, 13552, 13556, 13560, 13564, 13568}, {1285, 1608, 1828, 2735, 1828, 2894, 1285}, {13572, 13581, 13591, 1851, 7756, 13597, 13603, 13609, 1878, 1888, 1896, 7768, 0}, {13572, 13581, 13591, 1851, 7756, 13597, 13603, 13609, 1878, 1888, 1896, 7768, 0}, {13618, 13623, 13628, 13633, 7756, 13638, 13643, 13648, 13653, 13658, 13663, 13668, 0}, {13618, 13623, 13628, 13633, 7756, 13638, 13643, 13648, 13653, 13658, 13663, 13668, 0}, 0, 0, 55, 3, {417,2351,0,0,0,0,0,0,0,0,0,0,0,0},{2462,1261,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 49, 52, {13673, 13689, 13714, 13742, 13770, 13798, 13826}, {13845, 13855, 13865, 13875, 13885, 13895, 13905}, {13915, 13919, 13923, 13919, 13927, 13931, 13935}, {13939, 13961, 13989, 14005, 14024, 14040, 14059, 14078, 14100, 14131, 14159, 14184, 0}, {13939, 13961, 13989, 14005, 14024, 14040, 14059, 14078, 14100, 14131, 14159, 14184, 0}, {14212, 14222, 14232, 14242, 14252, 14262, 14272, 14282, 14292, 14302, 14312, 14322, 0}, {14212, 14222, 14232, 14242, 14252, 14262, 14272, 14282, 14292, 14302, 14312, 14322, 0}, 0, 1, 11, 3, {681,3021,0,0,0,0,0,0,0,0,0,0,0,0},{42,1029,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {925, 49, 52, {4231, 14332, 14343, 14353, 14363, 14373, 14387}, {14399, 14403, 14408, 14413, 14417, 14422, 14427}, {1285, 1608, 1610, 1608, 4089, 1614, 1616}, {1618, 1625, 3504, 4376, 3515, 1649, 1654, 1659, 1666, 1676, 1684, 4420, 0}, {1618, 1625, 3504, 4376, 3515, 1649, 1654, 1659, 1666, 1676, 1684, 4420, 0}, {5089, 4610, 4512, 4614, 3515, 5093, 5097, 5101, 5105, 5109, 4642, 5113, 0}, {5089, 4610, 4512, 4614, 3515, 5093, 5097, 5101, 5105, 5109, 4642, 5113, 0}, 2, 1, 55, 3, {744,0,0,0,0,0,0,0,0,0,0,0,0,0},{1314,1455,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {1, 381, 409, {14431, 14450, 14469, 14491, 14510, 14532, 14557}, {14576, 14586, 14596, 14609, 14619, 14632, 14648}, {14658, 14662, 14669, 14676, 14683, 14690, 14697}, {14701, 14717, 14736, 14752, 14771, 14778, 14788, 14804, 14820, 14839, 14861, 14877, 0}, {14701, 14717, 14736, 14752, 14771, 14778, 14788, 14804, 14820, 14839, 14861, 14877, 0}, {14896, 14906, 14736, 14752, 14771, 14778, 14919, 14932, 14942, 14955, 14974, 14984, 0}, {14896, 14906, 14736, 14752, 14771, 14778, 14919, 14932, 14942, 14955, 14974, 14984, 0}, 0, 0, 55, 3, {744,755,1062,2098,417,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{71,266,591,583,0,0,0,0,0,0,0,0},{89,271,611,600,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {3033, 49, 52, {14997, 15006, 15015, 15025, 15035, 15045, 15057}, {15065, 15070, 15074, 15078, 15082, 15087, 15092}, {15096, 15100, 15103, 15106, 15109, 15113, 15117}, {15120, 15127, 15132, 1851, 15138, 15144, 15151, 15157, 15165, 15175, 15183, 15192, 0}, {15120, 15127, 15132, 1851, 15138, 15144, 15151, 15157, 15165, 15175, 15183, 15192, 0}, {1914, 15202, 2791, 1927, 15206, 15210, 15215, 15219, 15223, 15227, 1951, 15231, 0}, {1914, 15202, 2791, 1927, 15206, 15210, 15215, 15219, 15223, 15227, 1951, 15231, 0}, 0, 0, 1, 3, {18,2351,0,0,0,0,0,0,0,0,0,0,0,0},{3048,3074,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{3094,0,0,0,0,0,0,0}}, + {925, 431, 436, {15236, 15248, 15259, 15273, 15285, 15295, 15305}, {15316, 15321, 15326, 15331, 15336, 15341, 15346}, {1285, 2894, 1608, 4532, 1828, 13432, 1616}, {15351, 15368, 15381, 15395, 15408, 15421, 15434, 15448, 15460, 15474, 15488, 15502, 0}, {15351, 15368, 15381, 15395, 15408, 15421, 15434, 15448, 15460, 15474, 15488, 15502, 0}, {15515, 15522, 15527, 15532, 15536, 15541, 15546, 15551, 15556, 15563, 15568, 15574, 0}, {15515, 15522, 15527, 15532, 15536, 15541, 15546, 15551, 15556, 15563, 15568, 15574, 0}, 2, 1, 55, 3, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2979,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {109, 165, 170, {15579, 15593, 15603, 15614, 15628, 15639, 15650}, {15663, 15668, 15673, 15680, 15686, 15692, 15698}, {1828, 1616, 1608, 5210, 1828, 9428, 1285}, {15703, 15711, 15719, 15726, 15735, 15745, 15755, 15761, 15769, 15784, 15802, 15810, 0}, {15703, 15711, 15719, 15726, 15735, 15745, 15755, 15761, 15769, 15784, 15802, 15810, 0}, {15818, 15822, 15719, 15828, 15832, 15837, 15755, 15843, 15848, 15855, 15862, 15867, 0}, {15818, 15822, 15719, 15828, 15832, 15837, 15755, 15843, 15848, 15855, 15862, 15867, 0}, 2, 0, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{1217,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 441, 444, {15872, 15877, 7673, 7680, 15883, 15890, 7697}, {15897, 15901, 7711, 7715, 15905, 7723, 7727}, {9428, 11804, 1285, 7731, 3099, 2892, 1285}, {7733, 7741, 15909, 1851, 7756, 1931, 15913, 15919, 1878, 1888, 1896, 15924, 0}, {7733, 7741, 15909, 1851, 7756, 1931, 15913, 15919, 1878, 1888, 1896, 15924, 0}, {1914, 1918, 15909, 1927, 7756, 1931, 1935, 15933, 1943, 1947, 1951, 13346, 0}, {1914, 1918, 15909, 1927, 7756, 1931, 1935, 15933, 1943, 1947, 1951, 13346, 0}, 0, 1, 1, 3, {2764,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 49, 52, {15937, 15954, 15971, 15988, 16005, 16022, 16031}, {16042, 16047, 16052, 16057, 16062, 16067, 16072}, {16077, 16080, 6081, 6081, 16083, 16077, 6081}, {16086, 16099, 16110, 16123, 16134, 16145, 16158, 16169, 16180, 16197, 16208, 16221, 0}, {16240, 16253, 16264, 16277, 16288, 16299, 16312, 16323, 16334, 16351, 16362, 16375, 0}, {16394, 16402, 16410, 16418, 16426, 16434, 16442, 16450, 16458, 16466, 16474, 16482, 0}, {16394, 16402, 16410, 16418, 16426, 16434, 16442, 16450, 16458, 16466, 16474, 16482, 0}, 0, 1, 1, 3, {18,3112,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {3125, 448, 453, {16490, 16507, 16524, 16541, 16558, 16575, 16584}, {16597, 16605, 16613, 16623, 16633, 16575, 16643}, {16077, 16080, 16651, 16651, 16083, 16077, 16654}, {16657, 16670, 9888, 16685, 9908, 16698, 16707, 9929, 16716, 16733, 16748, 16761, 0}, {6087, 6100, 360, 6115, 380, 6128, 6137, 401, 6146, 6163, 6178, 6191, 0}, {9994, 10001, 10008, 10015, 9908, 9915, 9922, 10022, 10029, 10036, 10043, 10050, 0}, {9994, 10001, 10008, 10015, 9908, 9915, 9922, 10022, 10029, 10036, 10043, 10050, 0}, 0, 1, 55, 3, {3132,0,0,0,0,0,0,0,0,0,0,0,0,0},{3141,0,0,0,0,0,0,0,0,0},{71,266,0,0,0,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{3160,0,0,0,0,0,0,0}}, + {109, 49, 52, {16776, 16785, 16794, 16802, 16811, 16820, 16827}, {16776, 16785, 16794, 16802, 16811, 16820, 16827}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {7733, 7741, 16836, 16842, 7756, 1861, 15913, 16849, 13301, 16856, 13318, 16863, 0}, {7733, 7741, 16836, 16842, 7756, 1861, 15913, 16849, 13301, 16856, 13318, 16863, 0}, {1914, 1918, 15909, 1927, 7756, 1931, 1935, 16871, 1943, 1947, 1951, 7781, 0}, {1914, 1918, 15909, 1927, 7756, 1931, 1935, 16871, 1943, 1947, 1951, 7781, 0}, 0, 0, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 0, 0, {16875, 16886, 16895, 16904, 16915, 16925, 16930}, {16937, 16941, 16944, 16947, 16951, 9416, 16954}, {16958, 1828, 1285, 7339, 1280, 9428, 16961}, {16964, 16972, 11617, 11622, 16979, 16984, 16990, 12137, 16996, 17006, 17015, 11673, 0}, {16964, 16972, 11617, 11622, 16979, 16984, 16990, 12137, 16996, 17006, 17015, 11673, 0}, {17023, 17028, 11617, 4614, 16979, 16984, 16990, 12237, 11696, 5109, 17032, 11704, 0}, {17023, 17028, 11617, 4614, 16979, 16984, 16990, 12237, 11696, 5109, 17032, 11704, 0}, 0, 1, 11, 3, {3176,681,0,0,0,0,0,0,0,0,0,0,0,0},{3191,0,0,0,0,0,0,0,0,0},{71,266,0,0,0,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{3223,0,0,0,0,0,0,0}}, + {925, 458, 461, {17037, 17047, 17056, 17065, 17076, 17086, 17091}, {17098, 17102, 17107, 17112, 17117, 7723, 17121}, {17126, 1828, 1285, 5210, 1280, 2892, 1285}, {11533, 11540, 7354, 11547, 2760, 17128, 17133, 17138, 17145, 17153, 11589, 11596, 0}, {11603, 11610, 11617, 11622, 11628, 11632, 11637, 8914, 17160, 17168, 11666, 11673, 0}, {12906, 17175, 2791, 1927, 2760, 17179, 17183, 17187, 7707, 1947, 17191, 17195, 0}, {12906, 17175, 2791, 1927, 2760, 17179, 17183, 17187, 7707, 1947, 17191, 17195, 0}, 0, 0, 1, 3, {406,2861,0,0,0,0,0,0,0,0,0,0,0,0},{3239,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {109, 49, 52, {17199, 17218, 17237, 17262, 17281, 17315, 17340}, {17359, 17369, 17379, 17395, 17405, 17430, 17446}, {17456, 17460, 17467, 17471, 17478, 17485, 17492}, {17496, 17524, 17558, 17574, 17593, 17600, 17610, 17626, 17642, 17673, 17695, 17717, 0}, {17496, 17524, 17558, 17574, 17593, 17600, 17610, 17626, 17642, 17673, 17695, 17717, 0}, {17496, 17524, 17558, 17574, 17593, 17600, 17610, 17626, 17642, 17673, 17695, 17717, 0}, {17496, 17524, 17558, 17574, 17593, 17600, 17610, 17626, 17642, 17673, 17695, 17717, 0}, 0, 1, 55, 11, {755,1062,744,755,744,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{1151,1146,3258,3267,0,0,0,0,0,0,0,0},{1173,1165,3275,3287,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {1, 464, 479, {17742, 17758, 17777, 17799, 17821, 17840, 17868}, {17899, 17906, 17916, 17929, 17942, 17952, 17971}, {17993, 17997, 18004, 18011, 18021, 18028, 18041}, {18048, 18064, 18083, 18096, 18115, 18122, 18132, 18148, 18161, 18177, 18196, 18212, 0}, {18048, 18064, 18083, 18096, 18115, 18122, 18132, 18148, 18161, 18177, 18196, 18212, 0}, {18228, 18235, 18083, 18245, 18115, 18122, 18261, 18274, 18281, 18291, 18304, 18314, 0}, {18228, 18235, 18083, 18245, 18115, 18122, 18261, 18274, 18281, 18291, 18304, 18314, 0}, 0, 0, 55, 3, {755,1062,2098,744,417,0,0,0,0,0,0,0,0,0},{3298,894,0,0,0,0,0,0,0,0},{591,583,266,71,0,0,0,0,0,0,0,0},{611,600,271,89,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {1, 49, 52, {18324, 18343, 18362, 18384, 18403, 18425, 18450}, {18469, 18479, 18489, 18502, 18512, 18525, 18541}, {18551, 18555, 18562, 18569, 18576, 18583, 18590}, {18594, 18622, 18650, 18666, 18685, 18692, 18702, 18718, 18734, 18762, 18784, 18806, 0}, {18594, 18622, 18650, 18666, 18685, 18692, 18702, 18718, 18734, 18762, 18784, 18806, 0}, {18831, 18850, 18650, 18666, 18685, 18692, 18702, 18718, 18869, 18885, 18901, 18911, 0}, {18831, 18850, 18650, 18666, 18685, 18692, 18702, 18718, 18869, 18885, 18901, 18911, 0}, 0, 0, 55, 3, {755,1062,2098,744,417,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{71,266,591,583,0,0,0,0,0,0,0,0},{89,271,611,600,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {1, 5, 8, {18924, 18943, 18962, 18987, 19006, 19028, 19053}, {19072, 19082, 19092, 19108, 19118, 19131, 19147}, {19157, 19161, 19168, 19172, 19179, 19186, 19193}, {19197, 19219, 19241, 19263, 19282, 19289, 19299, 19315, 19331, 19362, 19384, 19406, 0}, {19197, 19219, 19241, 19263, 19282, 19289, 19299, 19315, 19331, 19362, 19384, 19406, 0}, {19197, 19219, 19241, 19263, 19282, 19289, 19299, 19315, 19331, 19362, 19384, 19406, 0}, {19197, 19219, 19241, 19263, 19282, 19289, 19299, 19315, 19331, 19362, 19384, 19406, 0}, 0, 0, 55, 3, {755,1062,2098,744,417,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{71,266,591,583,0,0,0,0,0,0,0,0},{89,271,611,600,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {109, 494, 519, {19431, 19450, 19472, 19497, 19513, 19535, 19554}, {19564, 19578, 19592, 19606, 19617, 19631, 19554}, {19645, 19652, 19659, 19666, 19673, 19680, 19687}, {19691, 19707, 19732, 19751, 19770, 19777, 19790, 19803, 19822, 19853, 19878, 19900, 0}, {19691, 19707, 19732, 19751, 19770, 19777, 19790, 19803, 19822, 19853, 19878, 19900, 0}, {19925, 19933, 19947, 19961, 19770, 19777, 19790, 19972, 19980, 19994, 20005, 20013, 0}, {19925, 19933, 19947, 19961, 19770, 19777, 19790, 19972, 19980, 19994, 20005, 20013, 0}, 0, 1, 55, 3, {744,755,1062,2098,417,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{71,266,591,583,0,0,0,0,0,0,0,0},{89,271,611,600,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 49, 52, {20024, 20046, 20068, 20093, 20115, 20140, 20168}, {20190, 20200, 20210, 20223, 20233, 20246, 20262}, {20272, 20276, 20283, 20287, 20294, 20301, 20308}, {20312, 20328, 20353, 20372, 20394, 20401, 20414, 20427, 20446, 20477, 20502, 20521, 0}, {20312, 20328, 20353, 20372, 20394, 20401, 20414, 20427, 20446, 20477, 20502, 20521, 0}, {20546, 20553, 20353, 20569, 20394, 20401, 20414, 20427, 20585, 20607, 20623, 20633, 0}, {20546, 20553, 20353, 20569, 20394, 20401, 20414, 20427, 20585, 20607, 20623, 20633, 0}, 0, 0, 55, 3, {755,1062,2098,744,417,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{71,266,591,583,0,0,0,0,0,0,0,0},{89,271,611,600,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {925, 544, 572, {20649, 20671, 20690, 20712, 20731, 20753, 20778}, {20797, 20810, 20820, 20833, 20843, 20856, 20872}, {20882, 20889, 20896, 20903, 20910, 20917, 20924}, {20928, 20944, 20969, 20988, 21010, 21017, 21030, 21043, 21062, 21093, 21118, 21140, 0}, {20928, 20944, 20969, 20988, 21010, 21017, 21030, 21043, 21062, 21093, 21118, 21140, 0}, {21165, 21172, 20969, 21188, 21010, 21017, 21030, 21204, 21211, 21233, 21249, 21262, 0}, {21165, 21172, 20969, 21188, 21010, 21017, 21030, 21204, 21211, 21233, 21249, 21262, 0}, 0, 0, 55, 3, {755,1062,2098,744,417,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{71,266,591,583,0,0,0,0,0,0,0,0},{89,271,611,600,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {3316, 49, 52, {21278, 21306, 21340, 21368, 21396, 21427, 21464}, {21492, 21505, 21524, 21540, 21553, 21572, 21591}, {21601, 21608, 21615, 21622, 21629, 21642, 21649}, {21653, 21672, 21700, 21722, 21741, 21754, 21764, 21777, 21802, 21833, 21858, 21874, 0}, {21653, 21672, 21700, 21722, 21741, 21754, 21764, 21777, 21802, 21833, 21858, 21874, 0}, {21893, 21903, 21922, 21932, 21741, 21754, 21764, 21948, 21955, 21980, 21996, 22006, 0}, {21893, 21903, 21922, 21932, 21741, 21754, 21764, 21948, 21955, 21980, 21996, 22006, 0}, 0, 0, 55, 11, {755,1062,775,2098,0,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{1151,1146,3258,3267,0,0,0,0,0,0,0,0},{1173,1165,3275,3287,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {109, 594, 622, {22019, 22038, 22057, 22082, 22101, 22135, 22160}, {22179, 17369, 17379, 17395, 22189, 22214, 17446}, {0, 0, 0, 0, 0, 0, 0}, {22230, 22255, 22286, 22302, 17593, 17600, 17610, 22321, 22337, 22368, 22390, 22412, 0}, {22230, 22255, 22286, 22302, 17593, 17600, 17610, 22321, 22337, 22368, 22390, 22412, 0}, {22437, 22450, 22286, 22302, 17593, 17600, 17610, 22469, 22476, 22492, 22508, 22518, 0}, {22437, 22450, 22286, 22302, 17593, 17600, 17610, 22469, 22476, 22492, 22508, 22518, 0}, 0, 0, 55, 3, {744,0,0,0,0,0,0,0,0,0,0,0,0,0},{3324,0,0,0,0,0,0,0,0,0},{583,591,266,0,0,0,0,0,0,0,0,0},{600,611,271,0,0,0,0,0,0},{3343,3351,0,0,0,0,0,0}}, + {1, 644, 656, {14431, 14450, 22531, 14491, 14510, 14532, 14557}, {14576, 14586, 22553, 14609, 14619, 14632, 14648}, {14658, 14662, 14669, 14676, 14683, 14690, 14697}, {22566, 22591, 14736, 22622, 22641, 14778, 22648, 22661, 22677, 22702, 22724, 22752, 0}, {22566, 22591, 14736, 22622, 22641, 14778, 22648, 22661, 22677, 22702, 22724, 22752, 0}, {22774, 22787, 14736, 22806, 22641, 14778, 22648, 22822, 22829, 22848, 22864, 22886, 0}, {22774, 22787, 14736, 22806, 22641, 14778, 22648, 22822, 22829, 22848, 22864, 22886, 0}, 0, 0, 55, 3, {744,755,1062,2098,417,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{71,266,591,583,0,0,0,0,0,0,0,0},{89,271,611,600,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {925, 665, 670, {22902, 22909, 22920, 22933, 22946, 22957, 22970}, {22981, 22986, 22991, 22996, 23001, 23006, 23011}, {22981, 22986, 22991, 22996, 23001, 23006, 23011}, {23016, 23042, 23070, 23100, 23130, 23156, 23186, 23212, 23240, 23264, 23292, 23329, 0}, {23016, 23042, 23070, 23100, 23130, 23156, 23186, 23212, 23240, 23264, 23292, 23329, 0}, {23368, 23380, 23392, 23404, 23416, 23428, 23440, 23452, 23464, 23476, 23489, 23502, 0}, {23368, 23380, 23392, 23404, 23416, 23428, 23440, 23452, 23464, 23476, 23489, 23502, 0}, 0, 0, 55, 3, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{3361,3399,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {3431, 675, 697, {23515, 23543, 23571, 23608, 23639, 23673, 23704}, {23738, 23754, 23770, 23795, 23814, 23836, 23855}, {23877, 23884, 23891, 23901, 23911, 23921, 23931}, {23944, 23978, 24015, 24052, 24086, 24117, 24154, 24191, 24231, 24265, 24299, 24348, 0}, {24397, 24428, 24462, 24496, 24527, 24555, 24589, 24623, 24660, 24691, 24722, 24768, 0}, {24814, 24827, 24840, 24853, 24866, 24879, 24892, 24905, 24918, 24931, 24947, 24963, 0}, {24814, 24827, 24840, 24853, 24866, 24879, 24892, 24905, 24918, 24931, 24947, 24963, 0}, 0, 0, 1, 3, {379,388,397,428,417,406,446,439,453,0,0,0,0,0},{3455,3498,3546,3578,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{3615,666,0,0,0,0,0,0}}, + {109, 722, 725, {24979, 24988, 24998, 25010, 25023, 25032, 25044}, {25056, 25060, 12926, 25065, 25069, 25073, 25077}, {1285, 25081, 1608, 1608, 11804, 4532, 1285}, {25084, 25091, 25100, 25107, 1857, 25114, 25122, 25133, 25138, 25143, 25150, 25159, 0}, {25084, 25091, 25100, 25107, 1857, 25114, 25122, 25133, 25138, 25143, 25150, 25159, 0}, {25167, 25171, 12926, 25175, 1857, 25179, 25183, 25133, 25138, 25187, 25191, 25196, 0}, {25167, 25171, 12926, 25175, 1857, 25179, 25183, 25133, 25138, 25187, 25191, 25196, 0}, 2, 1, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 49, 52, {25201, 25223, 25239, 25258, 25268, 25299, 25315}, {25201, 25223, 25239, 25258, 25268, 25299, 25315}, {25328, 25332, 25328, 25336, 25336, 25340, 25340}, {25344, 25357, 25376, 25389, 25402, 25415, 25434, 25453, 25466, 25482, 25495, 25520, 0}, {25344, 25357, 25376, 25389, 25402, 25415, 25434, 25453, 25466, 25482, 25495, 25520, 0}, {25344, 25357, 25376, 25389, 25402, 25415, 25434, 25453, 25466, 25482, 25495, 25520, 0}, {25344, 25357, 25376, 25389, 25402, 25415, 25434, 25453, 25466, 25482, 25495, 25520, 0}, 0, 0, 1, 3, {9,417,0,0,0,0,0,0,0,0,0,0,0,0},{894,2363,0,0,0,0,0,0,0,0},{266,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{3648,0,0,0,0,0,0,0}}, + {109, 728, 753, {25533, 25558, 25577, 25605, 25624, 25649, 25668}, {25690, 25706, 25716, 25735, 25745, 25761, 25771}, {25784, 25791, 25795, 25799, 25803, 25810, 25817}, {25821, 25840, 25856, 25869, 25882, 25904, 25923, 25945, 25961, 25977, 25990, 26006, 0}, {25821, 25840, 25856, 25869, 25882, 25904, 25923, 25945, 25961, 25977, 25990, 26006, 0}, {26022, 26031, 26040, 26049, 26058, 26067, 26079, 26088, 26097, 26106, 26115, 26124, 0}, {26022, 26031, 26040, 26049, 26058, 26067, 26079, 26088, 26097, 26106, 26115, 26124, 0}, 0, 0, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{3683,894,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 778, 794, {26133, 26161, 26183, 26202, 26227, 26252, 26271}, {26133, 26161, 26183, 26202, 26227, 26252, 26271}, {26281, 26281, 26285, 26289, 26293, 26297, 26301}, {26305, 26330, 26361, 26371, 26384, 26391, 26404, 26426, 26442, 26467, 26498, 26523, 0}, {26305, 26330, 26361, 26371, 26384, 26391, 26404, 26426, 26442, 26467, 26498, 26523, 0}, {26545, 26555, 26361, 26562, 26384, 26391, 26566, 26573, 26577, 26587, 26603, 26613, 0}, {26545, 26555, 26361, 26562, 26384, 26391, 26566, 26573, 26577, 26587, 26603, 26613, 0}, 0, 0, 55, 3, {744,304,0,0,0,0,0,0,0,0,0,0,0,0},{3710,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 165, 170, {2803, 26620, 2817, 26625, 26635, 26641, 2850}, {26648, 26653, 26658, 26663, 26669, 26674, 26679}, {1828, 1616, 1608, 1608, 2890, 2894, 1285}, {26685, 26693, 26702, 26708, 26714, 26719, 26725, 26731, 26738, 26747, 26755, 26764, 0}, {26773, 26781, 2910, 666, 5557, 26790, 26796, 2933, 5574, 5583, 5591, 26802, 0}, {26811, 13623, 26658, 26816, 26714, 26719, 26821, 26826, 26831, 26836, 13663, 26841, 0}, {26811, 13623, 26658, 26816, 26714, 26719, 26821, 26826, 26831, 26836, 13663, 26841, 0}, 2, 1, 1, 3, {18,3021,0,0,0,0,0,0,0,0,0,0,0,0},{1314,1261,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 644, 804, {26846, 14450, 26874, 14491, 14510, 14532, 14557}, {14576, 14586, 22553, 14609, 14619, 14632, 14648}, {0, 0, 0, 0, 0, 0, 0}, {22566, 22591, 14736, 22622, 22641, 14778, 22648, 26893, 26909, 26937, 22724, 22752, 0}, {22566, 22591, 14736, 22622, 22641, 14778, 22648, 26893, 26909, 26937, 22724, 22752, 0}, {4744, 4746, 4748, 4750, 4752, 4754, 4756, 4758, 4760, 4762, 4765, 4768, 0}, {4744, 4746, 4748, 4750, 4752, 4754, 4756, 4758, 4760, 4762, 4765, 4768, 0}, 0, 0, 55, 3, {744,755,1062,2098,417,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{71,266,591,583,0,0,0,0,0,0,0,0},{89,271,611,600,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {925, 816, 828, {26959, 26975, 26991, 27019, 27035, 27078, 27103}, {26959, 26975, 27131, 27019, 27141, 27163, 27176}, {27186, 27190, 27194, 27198, 27202, 27215, 27222}, {27229, 27248, 27273, 27292, 27317, 27330, 27343, 27356, 27378, 27412, 27437, 27465, 0}, {27229, 27248, 27273, 27292, 27317, 27330, 27343, 27356, 27378, 27412, 27437, 27465, 0}, {27493, 27500, 27510, 27292, 27317, 27330, 27343, 27523, 27533, 27546, 27556, 27569, 0}, {27493, 27500, 27510, 27292, 27317, 27330, 27343, 27523, 27533, 27546, 27556, 27569, 0}, 0, 1, 55, 11, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2979,2997,0,0,0,0,0,0,0,0},{3267,71,0,0,0,0,0,0,0,0,0,0},{3287,89,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {925, 837, 847, {27582, 27604, 27626, 27642, 27658, 27674, 27693}, {27715, 27725, 27735, 27745, 27755, 27765, 27775}, {27785, 27789, 27793, 27797, 27801, 27805, 27809}, {27813, 27829, 27839, 27849, 27859, 27875, 27888, 27901, 27911, 27924, 27937, 27950, 0}, {27813, 27829, 27839, 27849, 27859, 27875, 27888, 27901, 27911, 27924, 27937, 27950, 0}, {27963, 27970, 27977, 27984, 27991, 27998, 28005, 28012, 28019, 28026, 28033, 28040, 0}, {27963, 27970, 27977, 27984, 27991, 27998, 28005, 28012, 28019, 28026, 28033, 28040, 0}, 0, 0, 1, 3, {932,941,948,957,460,417,968,0,0,0,0,0,0,0},{3731,3750,42,2448,0,0,0,0,0,0},{906,62,266,71,0,0,0,0,0,0,0,0},{914,77,271,89,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {925, 866, 876, {28047, 28057, 28064, 28077, 28087, 28097, 28107}, {28047, 28057, 28117, 28077, 28087, 28097, 28107}, {28127, 28131, 28135, 28139, 28143, 28147, 28151}, {28155, 28171, 28187, 28197, 28210, 28217, 28224, 28234, 28247, 28266, 28282, 28298, 0}, {28155, 28171, 28187, 28197, 28210, 28217, 28224, 28234, 28247, 28266, 28282, 28298, 0}, {28314, 28324, 28187, 28334, 28210, 28217, 28224, 28344, 28354, 28364, 28374, 28384, 0}, {28314, 28324, 28187, 28334, 28210, 28217, 28224, 28344, 28354, 28364, 28374, 28384, 0}, 0, 0, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 889, 899, {28394, 28401, 28407, 28414, 28420, 28426, 28434}, {28444, 28448, 28452, 28456, 28460, 28464, 28468}, {9428, 9428, 9428, 9428, 9428, 9428, 9428}, {28474, 28483, 7020, 28492, 28498, 28504, 28510, 28517, 28523, 28532, 28541, 28549, 0}, {28474, 28483, 7020, 28492, 28498, 28504, 28510, 28517, 28523, 28532, 28541, 28549, 0}, {28558, 28562, 2791, 28566, 2760, 28570, 28574, 28578, 28583, 28587, 28593, 28597, 0}, {28558, 28562, 2791, 28566, 2760, 28570, 28574, 28578, 28583, 28587, 28593, 28597, 0}, 0, 0, 55, 3, {744,755,417,0,0,0,0,0,0,0,0,0,0,0},{2448,42,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {1, 381, 409, {28601, 28620, 28639, 28664, 28683, 28705, 28730}, {28749, 14586, 28759, 14609, 28775, 14632, 14648}, {28788, 14662, 28792, 14676, 28796, 14690, 14697}, {14701, 28803, 14736, 28831, 22641, 28850, 14788, 28860, 28876, 28907, 28929, 28954, 0}, {14701, 28803, 14736, 28831, 14771, 28850, 14788, 28860, 28876, 28907, 28929, 28954, 0}, {14701, 28803, 14736, 28831, 22641, 28850, 14788, 28860, 28876, 28907, 28929, 28954, 0}, {14701, 28803, 14736, 28831, 22641, 28850, 14788, 28860, 28876, 28907, 28929, 28954, 0}, 0, 0, 1, 3, {932,941,948,957,460,417,968,0,0,0,0,0,0,0},{3763,3783,42,2448,0,0,0,0,0,0},{906,62,266,71,0,0,0,0,0,0,0,0},{914,77,271,89,0,0,0,0,0},{3351,0,0,0,0,0,0,0}}, + {109, 49, 52, {28979, 28985, 28993, 29001, 29010, 29021, 29027}, {29033, 29036, 3084, 4997, 3090, 29039, 1275}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {29042, 29053, 13591, 1851, 29064, 29070, 2769, 13609, 29075, 1888, 29085, 29094, 0}, {29042, 29053, 13591, 1851, 29064, 29070, 2769, 13609, 29075, 1888, 29085, 29094, 0}, {1914, 1918, 29103, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 7781, 0}, {1914, 1918, 29103, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 7781, 0}, 2, 1, 55, 3, {744,304,0,0,0,0,0,0,0,0,0,0,0,0},{1217,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {29107, 29114, 29123, 29138, 29149, 29158, 29165, 29172, 29179, 29190, 29203, 29216, 0}, {29107, 29114, 29123, 29138, 29149, 29158, 29165, 29172, 29179, 29190, 29203, 29216, 0}, {29107, 29114, 29123, 29138, 29149, 29158, 29165, 29172, 29179, 29190, 29203, 29216, 0}, {29107, 29114, 29123, 29138, 29149, 29158, 29165, 29172, 29179, 29190, 29203, 29216, 0}, 0, 6, 1, 3, {379,417,0,0,0,0,0,0,0,0,0,0,0,0},{894,1217,0,0,0,0,0,0,0,0},{266,0,0,0,0,0,0,0,0,0,0,0},{271,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 49, 52, {29221, 29228, 29234, 29241, 29252, 29260, 29269}, {29276, 29280, 2791, 29284, 29288, 29292, 7727}, {29276, 29280, 2791, 29284, 29288, 29292, 7727}, {29296, 29302, 29310, 26708, 29316, 29321, 29327, 26731, 29333, 29343, 29351, 29361, 0}, {29296, 29302, 29310, 26708, 29316, 29321, 29327, 26731, 29333, 29343, 29351, 29361, 0}, {29371, 29375, 2791, 29379, 2760, 29383, 29387, 16871, 15223, 1947, 29391, 13346, 0}, {29371, 29375, 2791, 29379, 2760, 29383, 29387, 16871, 15223, 1947, 29391, 13346, 0}, 0, 0, 1, 3, {932,3009,0,0,0,0,0,0,0,0,0,0,0,0},{978,997,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 912, 919, {29395, 29400, 29408, 29417, 29427, 29437, 29444}, {29455, 29459, 29464, 12088, 29468, 29472, 29476}, {29480, 29482, 29484, 6516, 6516, 29484, 29486}, {29488, 29494, 29500, 29506, 29514, 29521, 29527, 29533, 29538, 29545, 29554, 29560, 0}, {29488, 29494, 29500, 29506, 29514, 29521, 29527, 29533, 29538, 29545, 29554, 29560, 0}, {29566, 29570, 29574, 29578, 29582, 29586, 29590, 29594, 29598, 29602, 29606, 29610, 0}, {29566, 29570, 29574, 29578, 29582, 29586, 29590, 29594, 29598, 29602, 29606, 29610, 0}, 0, 0, 1, 3, {18,9,775,755,417,0,0,0,0,0,0,0,0,0},{1217,1234,894,0,0,0,0,0,0,0},{71,266,1151,1243,0,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 49, 52, {29614, 29621, 29629, 29636, 29643, 29651, 29660}, {29667, 29671, 29675, 29679, 29683, 7723, 28444}, {1616, 1616, 1610, 1616, 9428, 2892, 9428}, {29687, 29695, 29705, 29711, 29719, 29724, 29729, 29734, 29741, 16856, 29749, 29757, 0}, {29687, 29695, 29705, 29711, 29719, 29724, 29729, 29734, 29741, 16856, 29749, 29757, 0}, {1914, 29765, 2791, 29769, 2760, 28570, 28574, 29773, 2731, 1947, 29777, 13346, 0}, {1914, 29765, 2791, 29769, 2760, 28570, 28574, 29773, 2731, 1947, 29777, 13346, 0}, 0, 0, 1, 3, {295,3021,0,0,0,0,0,0,0,0,0,0,0,0},{1010,1029,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 928, 939, {29781, 29799, 29814, 29836, 29849, 29863, 29880}, {29904, 29912, 29917, 29836, 29849, 29929, 29936}, {0, 0, 0, 0, 0, 0, 0}, {29950, 29972, 29988, 30008, 30022, 30039, 30054, 30071, 30085, 30098, 30117, 30131, 0}, {29950, 29972, 29988, 30008, 30022, 30039, 30054, 30071, 30085, 30098, 30117, 30131, 0}, {30150, 30165, 30174, 30187, 30194, 30204, 30212, 30222, 30229, 30235, 30247, 30254, 0}, {30150, 30165, 30174, 30187, 30194, 30204, 30212, 30222, 30229, 30235, 30247, 30254, 0}, 0, 0, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 0, 0, {30266, 30274, 12472, 12968, 12490, 30285, 30295}, {12516, 12998, 12524, 12528, 12532, 12535, 30304}, {0, 0, 0, 0, 0, 0, 0}, {30308, 30317, 30327, 30335, 7756, 2764, 30343, 30349, 30358, 30367, 30376, 30385, 0}, {30308, 30317, 30327, 30335, 7756, 2764, 30343, 30349, 30358, 30367, 30376, 30385, 0}, {1914, 1918, 13006, 30394, 7756, 1931, 1935, 16871, 15223, 1947, 30398, 13346, 0}, {1914, 1918, 13006, 30394, 7756, 1931, 1935, 16871, 15223, 1947, 30398, 13346, 0}, 0, 0, 55, 3, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2979,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {3797, 949, 955, {30402, 30410, 30419, 30430, 30440, 30452, 30460}, {12516, 30470, 30475, 30480, 30485, 30489, 30493}, {1285, 1608, 1828, 1608, 1828, 1614, 1285}, {1830, 1837, 30497, 30504, 30512, 1861, 1866, 1871, 1878, 1888, 1896, 1905, 0}, {1830, 1837, 30497, 30504, 30512, 1861, 1866, 1871, 1878, 1888, 1896, 1905, 0}, {1914, 1918, 30516, 29379, 30512, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, {1914, 1918, 30516, 29379, 30512, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, 2, 1, 11, 3, {775,9,755,0,0,0,0,0,0,0,0,0,0,0},{721,3806,798,2541,3819,3844,0,0,0,0},{71,266,1146,3870,0,0,0,0,0,0,0,0},{89,3882,3897,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {3913, 965, 970, {30521, 30528, 30543, 30557, 30573, 30588, 30604}, {4528, 30619, 4512, 30623, 30627, 30631, 30635}, {1285, 9428, 1608, 1280, 1285, 1610, 9428}, {5011, 5019, 30639, 30646, 30653, 1649, 1654, 30658, 30668, 30679, 30688, 30698, 0}, {5011, 5019, 30639, 30646, 30653, 1649, 1654, 30658, 30668, 30679, 30688, 30698, 0}, {5089, 4610, 4512, 4614, 1645, 5093, 5097, 5101, 5105, 5109, 4642, 6911, 0}, {5089, 4610, 4512, 4614, 1645, 5093, 5097, 5101, 5105, 5109, 4642, 6911, 0}, 0, 0, 55, 3, {744,755,417,764,0,0,0,0,0,0,0,0,0,0},{3926,721,2561,0,0,0,0,0,0,0},{71,266,0,0,0,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 975, 980, {30708, 30724, 30732, 30740, 30749, 30761, 30771}, {30781, 30787, 30793, 30797, 30801, 30809, 2731}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {30816, 30829, 30843, 30852, 30512, 30858, 30863, 30871, 13301, 30884, 13318, 13326, 0}, {30816, 30829, 30843, 30852, 30512, 30858, 30863, 30871, 13301, 30884, 13318, 13326, 0}, {30893, 1918, 30897, 13334, 30512, 30901, 1935, 30905, 1943, 30913, 1951, 13346, 0}, {30893, 1918, 30897, 13334, 30512, 30901, 1935, 30905, 1943, 30913, 1951, 13346, 0}, 0, 0, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 985, 988, {30919, 30927, 30935, 30943, 30950, 30958, 30966}, {30974, 30978, 30982, 30986, 7719, 30990, 30994}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {30998, 31006, 31018, 31030, 31035, 31042, 31053, 31064, 31072, 31081, 31094, 31102, 0}, {30998, 31006, 31018, 31030, 31035, 31042, 31053, 31064, 31072, 31081, 31094, 31102, 0}, {31109, 31113, 31117, 31121, 31125, 31129, 31133, 31137, 31141, 31145, 25077, 12918, 0}, {31109, 31113, 31117, 31121, 31125, 31129, 31133, 31137, 31141, 31145, 25077, 12918, 0}, 0, 0, 1, 3, {18,2796,0,0,0,0,0,0,0,0,0,0,0,0},{978,1261,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 991, 1011, {31149, 31162, 31172, 28077, 31182, 31192, 31202}, {31212, 31219, 31226, 31233, 31240, 31247, 31254}, {28131, 28131, 31261, 28139, 31265, 28147, 31269}, {31273, 31280, 31293, 31306, 31319, 31332, 31339, 31349, 31359, 31375, 31388, 31398, 0}, {31273, 31280, 31293, 31306, 31319, 31332, 31339, 31349, 31359, 31375, 31388, 31398, 0}, {31273, 31411, 31418, 31425, 31432, 31332, 31439, 31446, 31453, 31460, 31467, 31474, 0}, {31273, 31411, 31418, 31425, 31432, 31332, 31439, 31446, 31453, 31460, 31467, 31474, 0}, 0, 0, 1, 3, {18,2796,0,0,0,0,0,0,0,0,0,0,0,0},{3945,1261,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 49, 52, {31481, 31489, 31499, 31508, 31518, 31527, 31537}, {31546, 31549, 31552, 31555, 31558, 31561, 31564}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {31567, 31575, 31585, 31592, 7756, 31602, 31607, 31613, 31622, 31633, 31643, 31652, 0}, {31567, 31575, 31585, 31592, 7756, 31602, 31607, 31613, 31622, 31633, 31643, 31652, 0}, {31661, 31666, 31671, 31676, 7756, 31682, 31687, 31692, 31698, 31703, 31709, 31714, 0}, {31661, 31666, 31671, 31676, 7756, 31682, 31687, 31692, 31698, 31703, 31709, 31714, 0}, 0, 0, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 1031, 1035, {31719, 31724, 31731, 31739, 31746, 31754, 31760}, {31766, 15901, 29675, 31770, 15905, 30990, 7727}, {9428, 11804, 1610, 9428, 31774, 2892, 1285}, {31777, 31791, 31804, 31820, 31833, 31847, 31860, 31875, 31891, 31907, 31921, 31943, 0}, {31777, 31791, 31804, 31820, 31833, 31847, 31860, 31875, 31891, 31907, 31921, 31943, 0}, {31966, 31970, 25077, 31974, 31978, 31982, 31986, 31990, 31994, 31998, 32002, 32006, 0}, {31966, 31970, 25077, 31974, 31978, 31982, 31986, 31990, 31994, 31998, 32002, 32006, 0}, 0, 0, 1, 3, {18,2796,0,0,0,0,0,0,0,0,0,0,0,0},{3763,1261,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {3982, 1039, 1046, {32010, 32020, 32030, 32040, 32050, 32060, 32070}, {32080, 32087, 32094, 32101, 32108, 32115, 32122}, {32129, 32133, 32137, 32141, 32145, 32149, 32153}, {32157, 32164, 32171, 32178, 32185, 32192, 32199, 32206, 32213, 32220, 32227, 32237, 0}, {32157, 32164, 32171, 32178, 32185, 32192, 32199, 32206, 32213, 32220, 32227, 32237, 0}, {32157, 32164, 32171, 32178, 32185, 32192, 32199, 32206, 32213, 32220, 32227, 32237, 0}, {32157, 32164, 32171, 32178, 32185, 32192, 32199, 32206, 32213, 32220, 32227, 32237, 0}, 0, 0, 1, 3, {379,388,397,428,417,406,0,0,0,0,0,0,0,0},{4005,4029,4059,4089,4106,0,0,0,0,0},{583,266,71,0,0,0,0,0,0,0,0,0},{600,271,89,0,0,0,0,0,0},{4129,666,0,0,0,0,0,0}}, + {109, 975, 1053, {25056, 29280, 32247, 32254, 32264, 32269, 32276}, {25056, 29280, 32283, 32288, 32264, 32293, 32298}, {32303, 1616, 32306, 32309, 17126, 4532, 1825}, {32312, 32319, 32247, 32330, 32336, 32340, 32349, 32356, 32361, 32370, 32375, 32378, 0}, {32312, 32319, 32247, 32330, 32336, 32340, 32349, 32356, 32361, 32370, 32375, 32378, 0}, {32384, 32389, 32397, 32403, 32336, 32408, 32414, 32356, 32420, 32370, 32375, 32426, 0}, {32384, 32389, 32397, 32403, 32336, 32408, 32414, 32356, 32420, 32370, 32375, 32426, 0}, 2, 1, 55, 3, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2979,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {3125, 1058, 1064, {32431, 32448, 32463, 32480, 32497, 32514, 32523}, {32534, 32539, 32544, 32549, 32554, 32559, 32564}, {32569, 10152, 10155, 10158, 10161, 10164, 10167}, {32572, 32585, 32598, 32607, 32620, 32627, 32638, 32649, 32664, 32681, 32698, 32713, 0}, {32572, 32585, 32598, 32607, 32620, 32627, 32638, 32649, 32664, 32681, 32698, 32713, 0}, {32572, 32585, 32598, 32607, 32620, 32627, 32638, 32649, 32664, 32681, 32698, 32713, 0}, {32572, 32585, 32598, 32607, 32620, 32627, 32638, 32649, 32664, 32681, 32698, 32713, 0}, 0, 0, 55, 3, {388,397,417,428,0,0,0,0,0,0,0,0,0,0},{4146,4167,4193,4234,4280,0,0,0,0,0},{266,71,583,591,0,0,0,0,0,0,0,0},{271,89,600,611,0,0,0,0,0},{4294,2717,666,0,0,0,0,0}}, + {673, 1070, 1075, {32728, 32736, 32746, 32756, 32765, 32775, 32783}, {32793, 32797, 32802, 32806, 32810, 32814, 13568}, {1285, 1608, 1828, 1608, 1828, 1614, 1285}, {1830, 1837, 1845, 1851, 1857, 1861, 1866, 32818, 32827, 32838, 32847, 32857, 0}, {1830, 1837, 1845, 1851, 1857, 1861, 1866, 32818, 32827, 32838, 32847, 32857, 0}, {1914, 1918, 1922, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, {1914, 1918, 1922, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, 2, 1, 1, 3, {18,9,775,755,417,0,0,0,0,0,0,0,0,0},{1217,1234,894,0,0,0,0,0,0,0},{71,266,1151,1243,1253,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {4315, 1080, 1085, {32867, 32892, 32917, 32942, 32955, 32970, 32987}, {33002, 33007, 33012, 33017, 33022, 33027, 310}, {16083, 16083, 33032, 6081, 6084, 16083, 6081}, {33035, 33054, 33069, 33091, 33111, 33125, 33139, 33151, 33175, 33197, 33214, 33231, 0}, {33248, 33267, 33282, 33304, 33324, 33340, 33356, 33370, 33396, 33420, 33437, 33231, 0}, {33454, 33463, 33472, 33479, 33486, 33493, 33500, 33507, 33514, 33521, 33528, 33535, 0}, {33454, 33463, 33472, 33479, 33486, 33493, 33500, 33507, 33514, 33521, 33528, 33535, 0}, 0, 1, 11, 3, {681,1208,417,4331,4341,0,0,0,0,0,0,0,0,0},{4354,4389,4418,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{4453,0,0,0,0,0,0,0}}, + {925, 49, 52, {33542, 33554, 33565, 33577, 33589, 33599, 33611}, {33626, 33631, 33636, 33641, 33646, 33651, 33656}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {33661, 33670, 33682, 33690, 33695, 33705, 33712, 33721, 33728, 33734, 33743, 33754, 0}, {33661, 33670, 33682, 33690, 33695, 33705, 33712, 33721, 33728, 33734, 33743, 33754, 0}, {33762, 33767, 33772, 33777, 33782, 33787, 33792, 33646, 33797, 33802, 33807, 33812, 0}, {33762, 33767, 33772, 33777, 33782, 33787, 33792, 33646, 33797, 33802, 33807, 33812, 0}, 0, 0, 1, 3, {406,2861,0,0,0,0,0,0,0,0,0,0,0,0},{3239,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {4469, 1090, 1092, {33817, 33830, 33838, 33847, 33857, 33867, 33876}, {33888, 33892, 33896, 33900, 33904, 33908, 33912}, {1828, 1616, 1608, 5210, 9428, 4089, 1285}, {33916, 33930, 33941, 33950, 33961, 33973, 33987, 33999, 34012, 34025, 34037, 34050, 0}, {34064, 34081, 34095, 34107, 34121, 34136, 34150, 34162, 34177, 34192, 34206, 34221, 0}, {34237, 34242, 34248, 34254, 34259, 34265, 34271, 34276, 34282, 34287, 15862, 34293, 0}, {34237, 34242, 34248, 34254, 34259, 34265, 34271, 34276, 34282, 34287, 15862, 34293, 0}, 2, 1, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{4480,4502,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {1, 10, 17, 37, 57, 81, 105, 112, 123, 134, 143, 161, 0}, {1, 10, 17, 37, 57, 81, 105, 112, 123, 134, 143, 161, 0}, {1, 10, 17, 37, 57, 81, 105, 112, 123, 134, 143, 161, 0}, {1, 10, 17, 37, 57, 81, 105, 112, 123, 134, 143, 161, 0}, 0, 0, 1, 3, {9,18,0,0,0,0,0,0,0,0,0,0,0,0},{29,42,0,0,0,0,0,0,0,0},{62,71,0,0,0,0,0,0,0,0,0,0},{77,89,0,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {109, 5, 8, {177, 190, 211, 226, 237, 256, 267}, {280, 285, 290, 295, 300, 305, 310}, {315, 318, 321, 324, 327, 318, 324}, {330, 343, 360, 369, 380, 387, 394, 401, 414, 433, 450, 465, 0}, {330, 343, 360, 369, 380, 387, 394, 401, 414, 433, 450, 465, 0}, {482, 489, 360, 496, 380, 387, 394, 503, 510, 517, 524, 531, 0}, {482, 489, 360, 496, 380, 387, 394, 503, 510, 517, 524, 531, 0}, 2, 1, 11, 3, {116,131,147,163,0,0,0,0,0,0,0,0,0,0},{180,199,217,242,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{279,0,0,0,0,0,0,0}}, + {109, 13, 19, {538, 547, 555, 563, 572, 579, 589}, {598, 602, 606, 610, 614, 618, 622}, {626, 629, 632, 635, 638, 641, 644}, {647, 653, 660, 666, 672, 677, 682, 689, 695, 704, 712, 721, 0}, {730, 739, 749, 758, 768, 776, 784, 794, 804, 816, 828, 840, 0}, {852, 857, 660, 863, 672, 677, 868, 873, 877, 882, 887, 892, 0}, {852, 857, 660, 863, 672, 677, 868, 873, 877, 882, 887, 892, 0}, 2, 1, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{315,338,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{355,0,0,0,0,0,0,0}}, + {370, 25, 32, {897, 907, 917, 927, 937, 947, 957}, {34299, 34306, 34313, 34320, 34327, 34334, 34341}, {1016, 1020, 1024, 1028, 1032, 1036, 1040}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, 0, 0, 1, 3, {379,406,417,0,0,0,0,0,0,0,0,0,0,0},{469,1484,547,4518,0,0,0,0,0,0},{591,583,71,266,0,0,0,0,0,0,0,0},{611,600,89,271,0,0,0,0,0},{623,639,652,0,0,0,0,0}}, + {673, 39, 44, {1197, 1205, 1215, 1223, 1231, 1240, 1247}, {1254, 1257, 1260, 1264, 1267, 1271, 1275}, {1278, 1280, 1282, 1285, 1287, 1280, 1285}, {1290, 1296, 1302, 1310, 1316, 1324, 1332, 1342, 1348, 1356, 1364, 1373, 0}, {1382, 1388, 1395, 1403, 1409, 1417, 1425, 1435, 1348, 1441, 1449, 1459, 0}, {1468, 1472, 1477, 1482, 1486, 1491, 1496, 1501, 1505, 1511, 1517, 1521, 0}, {1468, 1472, 1477, 1482, 1486, 1491, 1496, 1501, 1505, 1511, 1517, 1521, 0}, 2, 1, 11, 3, {681,692,0,0,0,0,0,0,0,0,0,0,0,0},{703,721,0,0,0,0,0,0,0,0},{266,0,0,0,0,0,0,0,0,0,0,0},{271,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 49, 52, {1525, 1533, 1540, 1548, 1555, 1563, 1570}, {1578, 1583, 1587, 1591, 1595, 1599, 1603}, {1285, 1608, 1610, 1612, 1610, 1614, 1616}, {1618, 1625, 1633, 1639, 1645, 1649, 1654, 1659, 1666, 1676, 1684, 1693, 0}, {1618, 1625, 1633, 1639, 1645, 1649, 1654, 1659, 1666, 1676, 1684, 1693, 0}, {1702, 1707, 1712, 1717, 1645, 1722, 868, 1727, 1732, 1737, 887, 1742, 0}, {1702, 1707, 1712, 1717, 1645, 1722, 868, 1727, 1732, 1737, 887, 1742, 0}, 2, 1, 55, 3, {744,755,417,764,0,0,0,0,0,0,0,0,0,0},{721,0,0,0,0,0,0,0,0,0},{71,266,0,0,0,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 57, 63, {1747, 1755, 1762, 1771, 1780, 1791, 1799}, {1807, 1810, 1813, 1816, 1819, 1822, 1825}, {1285, 1608, 1828, 1608, 1828, 1614, 1285}, {1830, 1837, 1845, 1851, 1857, 1861, 1866, 1871, 1878, 1888, 1896, 1905, 0}, {1830, 1837, 1845, 1851, 1857, 1861, 1866, 1871, 1878, 1888, 1896, 1905, 0}, {1914, 1918, 1922, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, {1914, 1918, 1922, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, 2, 1, 11, 3, {681,775,417,784,0,0,0,0,0,0,0,0,0,0},{798,721,817,0,0,0,0,0,0,0},{71,830,0,0,0,0,0,0,0,0,0,0},{89,842,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 70, 77, {1959, 1974, 1989, 2000, 2015, 2028, 2047}, {2062, 2069, 2076, 2083, 2090, 2097, 2104}, {2111, 2114, 2117, 2117, 2120, 2120, 2123}, {2126, 2147, 2170, 2185, 2202, 2213, 2228, 2243, 2262, 2285, 2304, 2323, 0}, {2344, 2365, 2388, 2403, 2420, 2431, 2446, 2461, 2480, 2503, 2522, 2541, 0}, {2562, 2569, 2576, 2583, 2590, 2597, 2606, 2615, 2622, 2629, 2636, 2643, 0}, {2562, 2569, 2576, 2583, 2590, 2597, 2606, 2615, 2622, 2629, 2636, 2643, 0}, 2, 1, 1, 3, {295,18,857,9,864,417,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,62,266,71,0,0,0,0,0,0,0,0},{914,77,271,89,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 49, 52, {2650, 2657, 2664, 2672, 2682, 2691, 2698}, {2707, 2711, 2715, 2719, 2723, 2727, 2731}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, 0, 0, 1, 3, {932,941,948,957,460,417,968,0,0,0,0,0,0,0},{978,997,1010,1029,0,0,0,0,0,0},{906,62,266,71,0,0,0,0,0,0,0,0},{914,77,271,89,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 84, 88, {2997, 3009, 3021, 3031, 3045, 3055, 3067}, {3078, 3081, 3084, 3087, 3090, 3093, 3096}, {1285, 1608, 1610, 3099, 1610, 1280, 1616}, {3101, 3110, 3119, 3129, 3138, 3147, 3156, 3166, 3173, 3181, 3189, 3199, 0}, {3208, 3219, 3230, 3242, 3253, 3264, 3275, 3287, 3296, 3306, 3316, 3328, 0}, {3339, 3345, 3351, 3358, 3364, 3370, 3376, 3383, 3387, 3392, 3397, 3404, 0}, {3339, 3345, 3351, 3358, 3364, 3370, 3376, 3383, 3387, 3392, 3397, 3404, 0}, 2, 1, 11, 11, {1208,0,0,0,0,0,0,0,0,0,0,0,0,0},{703,721,0,0,0,0,0,0,0,0},{1146,0,0,0,0,0,0,0,0,0,0,0},{1165,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 49, 52, {3410, 3419, 3425, 3431, 3440, 3446, 3455}, {3462, 2863, 1712, 3467, 3472, 3477, 3482}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, 2, 1, 1, 3, {18,9,775,755,417,0,0,0,0,0,0,0,0,0},{1217,894,1234,0,0,0,0,0,0,0},{71,266,1151,1243,1253,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 92, 105, {3596, 3614, 3628, 3646, 3664, 3682, 3698}, {3712, 3724, 3736, 3748, 3760, 3772, 3784}, {3791, 3796, 3801, 3806, 3811, 3816, 3821}, {3826, 3837, 3850, 3857, 3868, 3875, 3884, 3893, 3906, 3919, 3934, 3947, 0}, {3826, 3837, 3850, 3857, 3868, 3875, 3884, 3893, 3906, 3919, 3934, 3947, 0}, {3958, 3967, 3850, 3976, 3868, 3875, 3884, 3985, 3994, 4003, 4012, 4021, 0}, {3958, 3967, 3850, 3976, 3868, 3875, 3884, 3985, 3994, 4003, 4012, 4021, 0}, 0, 0, 1, 3, {18,1261,9,29,755,744,1274,417,1287,1304,0,0,0,0},{1314,1261,1332,1354,1287,0,0,0,0,0},{71,62,0,0,0,0,0,0,0,0,0,0},{89,77,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1375, 116, 120, {4030, 4040, 4048, 4053, 4060, 4073, 4081}, {2894, 4089, 3099, 4091, 4095, 1280, 4098}, {2894, 4089, 3099, 4102, 4095, 1280, 4102}, {4105, 4113, 4122, 4131, 4140, 4147, 4155, 4163, 4173, 4184, 1684, 1693, 0}, {4105, 4113, 4122, 4131, 4140, 4147, 4155, 4163, 4173, 4184, 1684, 1693, 0}, {1702, 857, 4193, 4200, 4206, 4212, 4218, 1727, 4224, 1737, 887, 1742, 0}, {1702, 857, 4193, 4200, 4206, 4212, 4218, 1727, 4224, 1737, 887, 1742, 0}, 2, 1, 124, 3, {1383,1397,0,0,0,0,0,0,0,0,0,0,0,0},{1410,1430,0,0,0,0,0,0,0,0},{266,0,0,0,0,0,0,0,0,0,0,0},{271,0,0,0,0,0,0,0,0},{1444,0,0,0,0,0,0,0}}, + {673, 127, 132, {4231, 4242, 4253, 4267, 4281, 4293, 4305}, {4317, 4322, 4328, 4334, 4340, 4345, 4351}, {1285, 1608, 4356, 1608, 1614, 1614, 1616}, {4359, 4367, 3504, 4376, 4383, 4388, 4395, 4402, 1666, 4184, 4410, 4420, 0}, {4359, 4367, 3504, 4376, 4383, 4388, 4395, 4402, 1666, 4184, 4410, 4420, 0}, {1702, 1707, 1712, 1717, 4383, 4212, 4218, 4429, 1732, 1737, 4436, 892, 0}, {1702, 1707, 1712, 1717, 4383, 4212, 4218, 4429, 1732, 1737, 4436, 892, 0}, 2, 1, 11, 3, {1208,1455,0,0,0,0,0,0,0,0,0,0,0,0},{798,721,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 49, 52, {4442, 4451, 4459, 4468, 4479, 4488, 4497}, {4504, 4508, 4512, 4516, 4520, 4524, 4528}, {1828, 1616, 1608, 1608, 4532, 2894, 1285}, {4534, 4542, 2910, 4551, 4558, 4565, 4572, 2933, 4579, 4589, 712, 4597, 0}, {4534, 4542, 2910, 4551, 4558, 4565, 4572, 2933, 4579, 4589, 712, 4597, 0}, {4606, 4610, 4512, 4614, 4618, 4622, 4626, 4630, 4634, 4638, 4642, 4646, 0}, {4606, 4610, 4512, 4614, 4618, 4622, 4626, 4630, 4634, 4638, 4642, 4646, 0}, 2, 1, 1, 3, {18,864,9,1467,857,0,0,0,0,0,0,0,0,0},{1217,1475,894,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {370, 137, 144, {4650, 4660, 4670, 4680, 4690, 4700, 4710}, {1016, 4720, 4724, 4728, 4732, 4736, 4740}, {1016, 4720, 4724, 4728, 4732, 4736, 4740}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {4744, 4746, 4748, 4750, 4752, 4754, 4756, 4758, 4760, 4762, 4765, 4768, 0}, {4744, 4746, 4748, 4750, 4752, 4754, 4756, 4758, 4760, 4762, 4765, 4768, 0}, 0, 0, 1, 3, {406,460,439,379,417,0,0,0,0,0,0,0,0,0},{469,1484,1508,1535,1564,1588,1617,1637,0,0},{266,71,583,591,0,0,0,0,0,0,0,0},{271,89,600,611,0,0,0,0,0},{623,1662,652,0,0,0,0,0}}, + {1680, 151, 158, {4771, 4781, 4791, 4801, 4811, 4821, 4831}, {4841, 4845, 4849, 4853, 4857, 4861, 4865}, {4841, 4845, 4849, 4853, 4857, 4861, 4865}, {4869, 4874, 4879, 4884, 4889, 4894, 4899, 4904, 4909, 4914, 4920, 4926, 0}, {4869, 4874, 4879, 4884, 4889, 4894, 4899, 4904, 4909, 4914, 4920, 4926, 0}, {4869, 4874, 4879, 4884, 4889, 4894, 4899, 4904, 4909, 4914, 4920, 4926, 0}, {4869, 4874, 4879, 4884, 4889, 4894, 4899, 4904, 4909, 4914, 4920, 4926, 0}, 0, 0, 55, 3, {417,1690,446,388,0,0,0,0,0,0,0,0,0,0},{1699,1728,1752,1779,1801,1832,1858,1889,1915,1942},{583,591,266,71,0,0,0,0,0,0,0,0},{600,611,271,89,0,0,0,0,0},{1964,1981,2000,0,0,0,0,0}}, + {109, 165, 170, {4932, 4939, 4947, 4955, 4964, 4974, 4982}, {4991, 3081, 4994, 4997, 5000, 5003, 5006}, {5009, 1608, 1828, 2735, 1828, 2894, 5009}, {5011, 5019, 5028, 1639, 5034, 1649, 1654, 5038, 1666, 1676, 1684, 1693, 0}, {5011, 5019, 5028, 1639, 5034, 1649, 1654, 5038, 1666, 1676, 1684, 1693, 0}, {1702, 1707, 5047, 1717, 5034, 1722, 868, 1727, 1732, 1737, 887, 1742, 0}, {1702, 1707, 5047, 1717, 5034, 1722, 868, 1727, 1732, 1737, 887, 1742, 0}, 2, 1, 55, 3, {2015,1062,755,9,775,2024,417,0,0,0,0,0,0,0},{1217,1475,894,1234,0,0,0,0,0,0},{71,266,1146,2036,2048,0,0,0,0,0,0,0},{89,271,2060,2075,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {2090, 165, 170, {1525, 1533, 1540, 1548, 1555, 1563, 1570}, {5052, 5058, 5063, 5068, 5073, 5078, 5083}, {1285, 1608, 1610, 1612, 1610, 1614, 1616}, {1618, 1625, 3504, 1639, 3515, 1649, 1654, 1659, 1666, 1676, 1684, 4420, 0}, {1618, 1625, 3504, 1639, 3515, 1649, 1654, 1659, 1666, 1676, 1684, 4420, 0}, {5089, 4610, 4512, 4614, 3515, 5093, 5097, 5101, 5105, 5109, 4642, 5113, 0}, {5089, 4610, 4512, 4614, 3515, 5093, 5097, 5101, 5105, 5109, 4642, 5113, 0}, 2, 1, 11, 11, {681,1455,0,0,0,0,0,0,0,0,0,0,0,0},{703,721,0,0,0,0,0,0,0,0},{1151,0,0,0,0,0,0,0,0,0,0,0},{1173,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 49, 52, {5117, 5127, 5141, 5148, 5155, 5164, 1247}, {5172, 5179, 5184, 5188, 5193, 5198, 5202}, {1278, 1280, 2735, 5207, 5210, 1280, 1285}, {5212, 5221, 5226, 5233, 1645, 5243, 5252, 5259, 5269, 5279, 1364, 5292, 0}, {5302, 5311, 5318, 5324, 5333, 5338, 5346, 5352, 5361, 5371, 5385, 5395, 0}, {5403, 5407, 4512, 5411, 1645, 5415, 5419, 5423, 5427, 5431, 1517, 5436, 0}, {5403, 5407, 4512, 5411, 1645, 5415, 5419, 5423, 5427, 5431, 1517, 5436, 0}, 2, 1, 11, 3, {681,0,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1042, 49, 52, {2803, 5440, 5454, 5467, 5480, 5493, 2850}, {4504, 5505, 5509, 5513, 5517, 5521, 5525}, {1828, 1285, 1610, 5530, 5530, 1285, 1285}, {5532, 5540, 5550, 666, 5557, 5562, 5568, 2933, 5574, 5583, 5591, 5600, 0}, {5532, 5540, 5550, 666, 5557, 5562, 5568, 2933, 5574, 5583, 5591, 5600, 0}, {5089, 5609, 4512, 5613, 3515, 5093, 5097, 4630, 4634, 5617, 4642, 5621, 0}, {5089, 5609, 4512, 5613, 3515, 5093, 5097, 4630, 4634, 5617, 4642, 5621, 0}, 0, 0, 1, 3, {18,9,295,857,755,744,1062,2015,775,681,2024,2098,1208,417},{1069,1124,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{1193,0,0,0,0,0,0,0}}, + {673, 49, 52, {5625, 5634, 3425, 5644, 5652, 5660, 5669}, {5675, 5678, 3081, 5682, 5685, 5689, 1275}, {1828, 4532, 1608, 1608, 4532, 2894, 1285}, {5692, 5700, 3504, 5707, 5714, 5719, 5729, 5737, 5743, 5753, 1684, 1693, 0}, {5692, 5700, 3504, 5707, 5714, 5719, 5729, 5737, 5743, 5753, 1684, 1693, 0}, {5761, 5768, 3504, 3579, 5714, 5774, 5781, 5737, 5786, 882, 887, 1742, 0}, {5761, 5768, 3504, 3579, 5714, 5774, 5781, 5737, 5786, 882, 887, 1742, 0}, 2, 1, 55, 3, {744,0,0,0,0,0,0,0,0,0,0,0,0,0},{2105,2134,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 165, 170, {5792, 5802, 5807, 5814, 5823, 5827, 5834}, {5845, 2863, 1712, 5850, 5823, 5855, 5860}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {5866, 5875, 5885, 5892, 3515, 5900, 5906, 1659, 5912, 5923, 5933, 5943, 0}, {5866, 5875, 5885, 5892, 3515, 5900, 5906, 1659, 5912, 5923, 5933, 5943, 0}, {5953, 1707, 1712, 1717, 3515, 5958, 5963, 1727, 2986, 882, 887, 1742, 0}, {5953, 1707, 1712, 1717, 3515, 5958, 5963, 1727, 2986, 882, 887, 1742, 0}, 0, 1, 11, 3, {681,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 175, 180, {5968, 5991, 211, 6014, 6025, 6040, 6055}, {6070, 285, 290, 295, 300, 305, 310}, {6075, 6078, 6075, 6081, 6084, 6078, 6081}, {6087, 6100, 360, 6115, 380, 6128, 6137, 401, 6146, 6163, 6178, 6191, 0}, {6206, 6219, 6234, 6245, 6258, 6265, 6274, 6283, 6298, 6315, 6330, 6343, 0}, {6358, 6366, 360, 6376, 380, 6128, 6137, 6384, 6392, 6402, 6410, 6420, 0}, {6358, 6366, 360, 6376, 380, 6128, 6137, 6384, 6392, 6402, 6410, 6420, 0}, 0, 1, 11, 3, {681,775,2098,744,9,0,0,0,0,0,0,0,0,0},{199,180,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 49, 52, {6428, 6437, 6449, 6456, 6464, 6474, 6480}, {6487, 6491, 6495, 6499, 6503, 6508, 6512}, {6516, 6518, 6520, 6522, 6524, 6518, 6522}, {6527, 6537, 6546, 6554, 6562, 6570, 6577, 6584, 6592, 1364, 6598, 6606, 0}, {6615, 6625, 6634, 6642, 6650, 6658, 6665, 6672, 6681, 5385, 6687, 6697, 0}, {6706, 6710, 6715, 6720, 6724, 5419, 1501, 6728, 6732, 1517, 6736, 1521, 0}, {6706, 6710, 6715, 6720, 6724, 5419, 1501, 6728, 6732, 1517, 6736, 1521, 0}, 0, 1, 11, 3, {2151,2161,2169,2181,2193,2203,2213,417,0,0,0,0,0,0},{2225,2239,2254,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {673, 49, 52, {6740, 6748, 6757, 6764, 6771, 6780, 1247}, {1254, 1257, 6787, 1264, 6790, 6794, 1275}, {6516, 6518, 6520, 6522, 6797, 6518, 6522}, {4105, 4113, 6800, 4376, 6806, 6811, 6816, 1659, 1666, 4184, 1684, 1693, 0}, {6821, 6830, 5318, 6840, 6848, 6854, 6860, 6866, 6874, 6884, 6893, 6902, 0}, {5089, 4610, 4512, 4614, 6806, 6811, 6816, 5101, 5105, 5109, 4642, 6911, 0}, {5089, 4610, 4512, 4614, 6806, 6811, 6816, 5101, 5105, 5109, 4642, 6911, 0}, 2, 1, 11, 3, {681,692,0,0,0,0,0,0,0,0,0,0,0,0},{798,721,0,0,0,0,0,0,0,0},{266,0,0,0,0,0,0,0,0,0,0,0},{271,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 185, 197, {6915, 6922, 6931, 6940, 6952, 6960, 6969}, {6979, 6983, 2791, 6988, 6993, 6997, 7001}, {1828, 4089, 1608, 1608, 7005, 1280, 1285}, {7007, 7013, 7020, 7025, 7031, 7035, 7043, 7050, 7056, 7064, 7070, 7078, 0}, {7086, 7092, 3504, 7099, 1645, 7105, 7113, 7120, 7126, 7134, 7140, 7148, 0}, {1914, 7156, 2791, 7160, 7031, 7164, 7168, 7172, 7001, 7176, 7180, 7185, 0}, {1914, 7156, 2791, 7160, 7031, 7164, 7168, 7172, 7001, 7176, 7180, 7185, 0}, 0, 1, 11, 3, {1208,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {2274, 208, 211, {7189, 7197, 7205, 1548, 1555, 1563, 7212}, {7220, 7225, 7230, 1591, 7234, 1599, 7239}, {1285, 1608, 1610, 1612, 1610, 1614, 1616}, {5011, 5019, 3504, 1639, 1645, 1649, 1654, 7244, 1666, 1676, 1684, 1693, 0}, {5011, 5019, 3504, 1639, 1645, 1649, 1654, 7244, 1666, 1676, 1684, 1693, 0}, {1702, 1707, 3504, 1717, 1645, 1649, 1654, 1727, 1732, 1737, 887, 1742, 0}, {1702, 1707, 3504, 1717, 1645, 1649, 1654, 1727, 1732, 1737, 887, 1742, 0}, 2, 1, 55, 3, {417,1690,0,0,0,0,0,0,0,0,0,0,0,0},{2287,2305,0,0,0,0,0,0,0,0},{71,266,2328,0,0,0,0,0,0,0,0,0},{89,271,2338,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {4744, 4746, 4748, 4750, 4752, 4754, 4756, 4758, 4760, 4762, 4765, 4768, 0}, {4744, 4746, 4748, 4750, 4752, 4754, 4756, 4758, 4760, 4762, 4765, 4768, 0}, 0, 0, 1, 3, {295,857,9,18,304,2351,417,0,0,0,0,0,0,0},{894,2363,2379,0,0,0,0,0,0,0},{266,71,906,62,0,0,0,0,0,0,0,0},{271,89,914,77,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 214, 219, {7252, 7258, 7268, 7274, 7285, 7295, 7300}, {7310, 7314, 7318, 7322, 7327, 7331, 7335}, {1280, 1280, 1285, 7339, 1280, 5210, 5210}, {7342, 7347, 7354, 7359, 7365, 7372, 7380, 7387, 7396, 7403, 7408, 7415, 0}, {7342, 7347, 7354, 7359, 7365, 7372, 7380, 7387, 7396, 7403, 7408, 7415, 0}, {7423, 7427, 2791, 7432, 2760, 7436, 7440, 7444, 7449, 7453, 7457, 7461, 0}, {7423, 7427, 2791, 7432, 2760, 7436, 7440, 7444, 7449, 7453, 7457, 7461, 0}, 0, 1, 11, 3, {2421,304,0,0,0,0,0,0,0,0,0,0,0,0},{2431,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 49, 52, {7465, 7476, 7489, 7498, 7505, 7518, 7527}, {7465, 7476, 7489, 7498, 7505, 7518, 7527}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {7536, 7547, 7558, 7567, 7578, 7585, 7592, 7605, 7614, 7625, 7638, 7649, 0}, {7536, 7547, 7558, 7567, 7578, 7585, 7592, 7605, 7614, 7625, 7638, 7649, 0}, {7536, 7547, 7558, 7567, 7578, 7585, 7592, 7605, 7614, 7625, 7638, 7649, 0}, {7536, 7547, 7558, 7567, 7578, 7585, 7592, 7605, 7614, 7625, 7638, 7649, 0}, 0, 0, 1, 3, {18,9,417,0,0,0,0,0,0,0,0,0,0,0},{2448,42,0,0,0,0,0,0,0,0},{906,62,266,71,0,0,0,0,0,0,0,0},{914,77,271,89,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {109, 49, 52, {7660, 7667, 7673, 7680, 7685, 7691, 7697}, {7703, 7707, 7711, 7715, 7719, 7723, 7727}, {1608, 1285, 1285, 7731, 3099, 2892, 1285}, {7733, 7741, 7750, 1851, 7756, 1861, 1866, 7760, 1878, 1888, 1896, 7768, 0}, {7733, 7741, 7750, 1851, 7756, 1861, 1866, 7760, 1878, 1888, 1896, 7768, 0}, {1914, 1918, 2791, 1927, 7756, 1931, 1935, 7777, 1943, 1947, 1951, 7781, 0}, {1914, 1918, 2791, 1927, 7756, 1931, 1935, 7777, 1943, 1947, 1951, 7781, 0}, 0, 0, 1, 11, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{2462,894,0,0,0,0,0,0,0,0},{1151,0,0,0,0,0,0,0,0,0,0,0},{1173,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 223, 228, {7785, 7798, 7817, 7834, 7847, 7860, 7877}, {280, 285, 290, 295, 300, 305, 310}, {7890, 6078, 6075, 6081, 6084, 6078, 6081}, {7893, 7906, 7917, 7934, 7949, 7964, 7979, 7992, 8007, 8024, 8039, 8056, 0}, {8071, 8082, 8095, 8110, 8123, 8136, 8149, 8160, 8173, 8188, 8201, 8220, 0}, {8233, 8240, 8247, 8254, 8261, 8268, 8275, 8282, 8289, 8296, 8303, 8310, 0}, {8233, 8240, 8247, 8254, 8261, 8268, 8275, 8282, 8289, 8296, 8303, 8310, 0}, 0, 1, 11, 3, {681,775,417,0,0,0,0,0,0,0,0,0,0,0},{2481,0,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{2499,0,0,0,0,0,0,0}}, + {109, 49, 52, {8317, 8332, 8353, 8368, 8381, 8394, 7877}, {280, 285, 8409, 295, 8414, 305, 310}, {315, 318, 8419, 324, 327, 318, 324}, {8422, 8439, 8448, 8463, 380, 8480, 8495, 8508, 8523, 8540, 8561, 8578, 0}, {8593, 8610, 8623, 8640, 6258, 8659, 8674, 8687, 8700, 8715, 8738, 8757, 0}, {8770, 8240, 8777, 8784, 380, 8791, 8798, 8805, 8289, 8812, 8819, 8826, 0}, {8770, 8240, 8777, 8784, 380, 8791, 8798, 8805, 8289, 8812, 8819, 8826, 0}, 0, 1, 11, 3, {775,0,0,0,0,0,0,0,0,0,0,0,0,0},{894,0,0,0,0,0,0,0,0,0},{71,266,0,0,0,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{2515,0,0,0,0,0,0,0}}, + {673, 39, 233, {8833, 8841, 8852, 8858, 8864, 8873, 1247}, {8879, 5179, 5073, 8884, 8889, 8895, 5202}, {6516, 6518, 8900, 6522, 6524, 6518, 6522}, {1618, 1625, 6800, 1639, 1645, 8902, 8908, 8914, 1666, 1676, 1684, 1693, 0}, {1618, 1625, 6800, 1639, 1645, 8902, 8908, 8914, 1666, 1676, 1684, 1693, 0}, {1702, 1707, 1712, 1717, 1645, 1722, 868, 8921, 1732, 1737, 887, 1742, 0}, {1702, 1707, 1712, 1717, 1645, 1722, 868, 8921, 1732, 1737, 887, 1742, 0}, 0, 1, 124, 3, {2529,1455,0,0,0,0,0,0,0,0,0,0,0,0},{2541,2561,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 49, 52, {8926, 8937, 8948, 8959, 8970, 8981, 8987}, {1280, 7005, 1610, 3099, 1278, 7731, 1616}, {1280, 7005, 1610, 3099, 1278, 7731, 1616}, {8996, 9004, 9013, 9020, 3515, 9027, 9033, 1659, 1666, 9039, 1684, 9048, 0}, {8996, 9004, 9013, 9020, 3515, 9027, 9033, 1659, 1666, 9039, 1684, 9048, 0}, {9058, 9063, 9013, 4614, 3515, 9027, 9033, 5101, 9069, 5109, 4642, 9074, 0}, {9058, 9063, 9013, 4614, 3515, 9027, 9033, 5101, 9069, 5109, 4642, 9074, 0}, 2, 1, 11, 3, {681,1455,0,0,0,0,0,0,0,0,0,0,0,0},{798,721,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{2575,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 238, 248, {9079, 9090, 9100, 9109, 9120, 9132, 9143}, {9153, 9161, 9168, 9174, 9182, 9191, 9199}, {1285, 1280, 1612, 1610, 5210, 1280, 1285}, {9206, 9216, 1633, 9227, 9236, 9242, 9250, 9258, 9266, 9277, 9286, 9296, 0}, {9206, 9216, 1633, 9227, 9236, 9242, 9250, 9258, 9266, 9277, 9286, 9296, 0}, {3566, 857, 1633, 1717, 9236, 9306, 9312, 1727, 2986, 1737, 887, 1742, 0}, {3566, 857, 1633, 1717, 9236, 9306, 9312, 1727, 2986, 1737, 887, 1742, 0}, 0, 1, 11, 3, {681,2583,0,0,0,0,0,0,0,0,0,0,0,0},{2603,2630,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2651,0,0,0,0,0,0,0}}, + {925, 255, 266, {9318, 9330, 9342, 9354, 9368, 9383, 9396}, {9410, 9413, 9416, 9419, 9422, 9425, 6790}, {1285, 1280, 9428, 1610, 3099, 1280, 9430}, {9433, 9440, 9448, 9454, 9463, 9472, 9482, 9488, 9499, 9509, 9516, 9526, 0}, {9534, 9541, 9549, 9554, 9565, 9575, 9585, 9592, 9604, 9613, 9620, 9631, 0}, {9641, 9647, 9652, 9657, 9662, 9667, 9674, 9680, 9686, 9692, 9698, 9705, 0}, {9641, 9647, 9652, 9657, 9662, 9667, 9674, 9680, 9686, 9692, 9698, 9705, 0}, 2, 1, 55, 3, {417,0,0,0,0,0,0,0,0,0,0,0,0,0},{2667,2695,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {1, 273, 285, {9712, 9727, 9742, 9757, 9774, 9793, 9804}, {9815, 9822, 9829, 9836, 9843, 9850, 9857}, {0, 0, 0, 0, 0, 0, 0}, {9864, 9875, 9888, 9897, 9908, 9915, 9922, 9929, 9942, 9957, 9970, 9981, 0}, {9864, 9875, 9888, 9897, 9908, 9915, 9922, 9929, 9942, 9957, 9970, 9981, 0}, {9994, 10001, 10008, 10015, 9908, 9915, 9922, 10022, 10029, 10036, 10043, 10050, 0}, {9994, 10001, 10008, 10015, 9908, 9915, 9922, 10022, 10029, 10036, 10043, 10050, 0}, 0, 1, 11, 3, {681,775,2098,744,9,0,0,0,0,0,0,0,0,0},{2727,2745,0,0,0,0,0,0,0,0},{71,266,0,0,0,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 297, 304, {10057, 10070, 10083, 10099, 10116, 10131, 10140}, {10057, 10070, 10083, 10099, 10116, 10131, 10140}, {10149, 10152, 10155, 10158, 10161, 10164, 10167}, {10170, 10183, 10194, 10203, 10214, 10219, 10228, 10239, 10246, 10261, 10272, 10285, 0}, {10298, 10313, 10194, 10203, 10326, 10219, 10333, 10239, 10246, 10261, 10272, 10285, 0}, {10170, 10183, 10194, 10203, 10214, 10219, 10228, 10239, 10246, 10261, 10272, 10285, 0}, {10170, 10183, 10194, 10203, 10214, 10219, 10228, 10239, 10246, 10261, 10272, 10285, 0}, 0, 6, 1, 3, {18,9,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{62,71,0,0,0,0,0,0,0,0,0,0},{77,89,0,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {1, 311, 314, {10346, 10359, 10369, 10378, 10388, 10399, 10410}, {10422, 10425, 10430, 10435, 10440, 10445, 10450}, {10422, 10455, 10458, 10461, 10464, 10467, 10470}, {10473, 10482, 10491, 10500, 10509, 10518, 10527, 10536, 10545, 10554, 10564, 10574, 0}, {10584, 10593, 10602, 10611, 10620, 10629, 10638, 10647, 10656, 10665, 10675, 10685, 0}, {10695, 10701, 10707, 10713, 10719, 10725, 10731, 10737, 10743, 10749, 10756, 10763, 0}, {10695, 10701, 10707, 10713, 10719, 10725, 10731, 10737, 10743, 10749, 10756, 10763, 0}, 0, 1, 1, 3, {18,9,755,744,417,0,0,0,0,0,0,0,0,0},{1261,0,0,0,0,0,0,0,0,0},{906,62,266,71,0,0,0,0,0,0,0,0},{914,77,271,89,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 317, 322, {10770, 10783, 10804, 10823, 10844, 10863, 10876}, {10887, 10894, 10901, 10908, 10915, 10922, 10929}, {10936, 10939, 10939, 10942, 10945, 10948, 10951}, {10954, 10969, 10984, 10993, 11004, 11015, 11028, 11041, 11056, 11075, 11094, 11111, 0}, {11130, 11147, 11164, 11175, 11188, 11201, 11216, 11231, 11248, 11269, 11290, 11309, 0}, {11330, 11337, 11344, 11351, 11358, 11365, 11372, 11379, 11386, 11393, 11400, 11407, 0}, {11330, 11337, 11344, 11351, 11358, 11365, 11372, 11379, 11386, 11393, 11400, 11407, 0}, 0, 1, 11, 3, {681,775,2764,18,2774,864,417,0,0,0,0,0,0,0},{1029,876,2462,1261,2785,2796,2808,2825,0,0},{71,266,0,0,0,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {109, 49, 52, {11414, 11420, 11434, 11457, 11471, 11487, 11494}, {11503, 11506, 11511, 11517, 11521, 11526, 11529}, {4756, 4744, 4746, 4748, 4750, 4752, 4754}, {11533, 11540, 7354, 11547, 2760, 11553, 11559, 11565, 11572, 11581, 11589, 11596, 0}, {11603, 11610, 11617, 11622, 11628, 11632, 11637, 11642, 11649, 11658, 11666, 11673, 0}, {11680, 5609, 4512, 4614, 11628, 11684, 11688, 11692, 11696, 5109, 11700, 11704, 0}, {11680, 5609, 4512, 4614, 11628, 11684, 11688, 11692, 11696, 5109, 11700, 11704, 0}, 0, 1, 11, 3, {681,304,0,0,0,0,0,0,0,0,0,0,0,0},{2843,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 49, 52, {11708, 11716, 11727, 11737, 11748, 11757, 11766}, {11776, 11780, 11784, 11788, 11792, 11796, 11800}, {11804, 9428, 9428, 9428, 1612, 1612, 1616}, {11806, 11816, 11824, 11832, 11840, 11848, 11855, 11863, 11871, 11878, 11884, 11891, 0}, {11806, 11899, 11907, 11915, 11923, 11931, 11938, 11946, 11954, 11961, 11967, 11974, 0}, {11982, 11987, 1712, 11992, 11997, 12002, 12007, 12012, 12017, 12022, 12027, 12032, 0}, {11982, 11987, 1712, 11992, 11997, 12002, 12007, 12012, 12017, 12022, 12027, 12032, 0}, 2, 1, 1, 3, {406,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2872,2899,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2920,0,0,0,0,0,0,0}}, + {673, 327, 338, {12037, 12047, 12058, 12065, 12072, 12082, 1247}, {12088, 12092, 12097, 12101, 12105, 12110, 12114}, {6516, 6518, 12118, 6522, 6797, 6518, 6522}, {1618, 1625, 12120, 12126, 12132, 8902, 8908, 12137, 1666, 1676, 12144, 1693, 0}, {12153, 12161, 12170, 12177, 12184, 12189, 12196, 12203, 6874, 12211, 12219, 6902, 0}, {5089, 4610, 12228, 4614, 12233, 5093, 5097, 12237, 5105, 5109, 12241, 6911, 0}, {5089, 4610, 12228, 4614, 12233, 5093, 5097, 12237, 5105, 5109, 12241, 6911, 0}, 2, 1, 11, 3, {1208,0,0,0,0,0,0,0,0,0,0,0,0,0},{798,721,0,0,0,0,0,0,0,0},{2939,0,0,0,0,0,0,0,0,0,0,0},{271,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 349, 363, {12245, 190, 211, 6014, 12258, 12275, 12286}, {12299, 12307, 12315, 12323, 12331, 12339, 12347}, {315, 318, 321, 324, 327, 318, 324}, {12355, 343, 360, 369, 12370, 12377, 12386, 401, 414, 433, 450, 465, 0}, {12355, 343, 360, 369, 12370, 12377, 12386, 401, 414, 433, 450, 465, 0}, {12395, 12403, 12411, 6376, 12370, 12419, 12427, 6384, 12435, 6402, 12445, 6420, 0}, {12395, 12403, 12411, 6376, 12370, 12419, 12427, 6384, 12435, 6402, 12445, 6420, 0}, 0, 1, 11, 3, {2953,0,0,0,0,0,0,0,0,0,0,0,0,0},{2462,1261,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2963,0,0,0,0,0,0,0}}, + {925, 0, 0, {12455, 12463, 12472, 12481, 12490, 12497, 12507}, {12516, 12520, 12524, 12528, 12532, 12535, 12539}, {0, 0, 0, 0, 0, 0, 0}, {12543, 12554, 12562, 12572, 12578, 12590, 12599, 12605, 12611, 12619, 12628, 12640, 0}, {12543, 12554, 12562, 12572, 12578, 12590, 12599, 12605, 12611, 12619, 12628, 12640, 0}, {12648, 12652, 12656, 12660, 12664, 1914, 12668, 12672, 12676, 12680, 12684, 12688, 0}, {12648, 12652, 12656, 12660, 12664, 1914, 12668, 12672, 12676, 12680, 12684, 12688, 0}, 0, 0, 55, 3, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2979,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {925, 0, 0, {12692, 12698, 12711, 12722, 12733, 12742, 12754}, {12516, 12764, 12768, 12772, 12532, 12776, 12780}, {0, 0, 0, 0, 0, 0, 0}, {12784, 12792, 12804, 12816, 12828, 12838, 12850, 12859, 12867, 12875, 12885, 12892, 0}, {12784, 12792, 12804, 12816, 12828, 12838, 12850, 12859, 12867, 12875, 12885, 12892, 0}, {2707, 12906, 12910, 12914, 12918, 12922, 12926, 12930, 12934, 12938, 12942, 12946, 0}, {2707, 12906, 12910, 12914, 12918, 12922, 12926, 12930, 12934, 12938, 12942, 12946, 0}, 0, 0, 55, 3, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2979,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {925, 0, 0, {12950, 12957, 12472, 12968, 12490, 12977, 12988}, {12688, 12998, 12524, 12528, 12532, 13002, 13006}, {0, 0, 0, 0, 0, 0, 0}, {13010, 13020, 13029, 13037, 13046, 13059, 13071, 13078, 13085, 13092, 13102, 13114, 0}, {13010, 13020, 13029, 13037, 13046, 13059, 13071, 13078, 13085, 13092, 13102, 13114, 0}, {13127, 12776, 13131, 13135, 12664, 13139, 13143, 12672, 13147, 13151, 13155, 13159, 0}, {13127, 12776, 13131, 13135, 12664, 13139, 13143, 12672, 13147, 13151, 13155, 13159, 0}, 0, 0, 55, 3, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2979,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {925, 0, 0, {13163, 13168, 13174, 13184, 13196, 13204, 13215}, {13224, 13228, 13232, 13236, 13240, 12535, 13244}, {0, 0, 0, 0, 0, 0, 0}, {13248, 13258, 13268, 13275, 13282, 1861, 13287, 13294, 13301, 13310, 13318, 13326, 0}, {13248, 13258, 13268, 13275, 13282, 1861, 13287, 13294, 13301, 13310, 13318, 13326, 0}, {1914, 1918, 13006, 13334, 13338, 1931, 1935, 13342, 1943, 1947, 1951, 13346, 0}, {1914, 1918, 13006, 13334, 13338, 1931, 1935, 13342, 1943, 1947, 1951, 13346, 0}, 0, 0, 55, 3, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2979,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {925, 49, 52, {13350, 13357, 13369, 13380, 13393, 13402, 13414}, {12516, 13424, 13428, 13236, 13240, 12535, 13244}, {1285, 1608, 13432, 1610, 1285, 4089, 1608}, {13434, 13258, 13443, 13449, 13282, 1861, 13287, 13294, 13457, 13310, 13318, 13326, 0}, {13467, 13258, 13443, 13449, 13282, 1861, 13287, 13294, 13457, 13310, 13318, 13326, 0}, {1914, 1918, 13478, 13482, 13338, 1931, 1935, 13342, 1943, 1947, 1951, 13346, 0}, {1914, 1918, 13478, 13482, 13338, 1931, 1935, 13342, 1943, 1947, 1951, 13346, 0}, 0, 0, 1, 3, {932,3009,0,0,0,0,0,0,0,0,0,0,0,0},{978,997,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 373, 377, {13486, 13493, 13501, 13509, 13518, 13528, 13535}, {13544, 13548, 13552, 13556, 13560, 13564, 13568}, {1285, 1608, 1828, 2735, 1828, 2894, 1285}, {13572, 13581, 13591, 1851, 7756, 13597, 13603, 13609, 1878, 1888, 1896, 7768, 0}, {13572, 13581, 13591, 1851, 7756, 13597, 13603, 13609, 1878, 1888, 1896, 7768, 0}, {13618, 13623, 13628, 13633, 7756, 13638, 13643, 13648, 13653, 13658, 13663, 13668, 0}, {13618, 13623, 13628, 13633, 7756, 13638, 13643, 13648, 13653, 13658, 13663, 13668, 0}, 0, 0, 55, 3, {417,2351,0,0,0,0,0,0,0,0,0,0,0,0},{2462,1261,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 49, 52, {13673, 13689, 13714, 13742, 13770, 13798, 13826}, {13845, 13855, 13865, 13875, 13885, 13895, 13905}, {13915, 13919, 13923, 13919, 13927, 13931, 13935}, {13939, 13961, 13989, 14005, 14024, 14040, 14059, 14078, 14100, 14131, 14159, 14184, 0}, {13939, 13961, 13989, 14005, 14024, 14040, 14059, 14078, 14100, 14131, 14159, 14184, 0}, {14212, 14222, 14232, 14242, 14252, 14262, 14272, 14282, 14292, 14302, 14312, 14322, 0}, {14212, 14222, 14232, 14242, 14252, 14262, 14272, 14282, 14292, 14302, 14312, 14322, 0}, 0, 1, 11, 3, {681,3021,0,0,0,0,0,0,0,0,0,0,0,0},{42,1029,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {925, 49, 52, {4231, 14332, 14343, 14353, 14363, 14373, 14387}, {14399, 14403, 14408, 14413, 14417, 14422, 14427}, {1285, 1608, 1610, 1608, 4089, 1614, 1616}, {1618, 1625, 3504, 4376, 3515, 1649, 1654, 1659, 1666, 1676, 1684, 4420, 0}, {1618, 1625, 3504, 4376, 3515, 1649, 1654, 1659, 1666, 1676, 1684, 4420, 0}, {5089, 4610, 4512, 4614, 3515, 5093, 5097, 5101, 5105, 5109, 4642, 5113, 0}, {5089, 4610, 4512, 4614, 3515, 5093, 5097, 5101, 5105, 5109, 4642, 5113, 0}, 2, 1, 55, 3, {744,0,0,0,0,0,0,0,0,0,0,0,0,0},{1314,1455,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {1, 381, 409, {14431, 14450, 14469, 14491, 14510, 14532, 14557}, {14576, 14586, 14596, 14609, 14619, 14632, 14648}, {14658, 14662, 14669, 14676, 14683, 14690, 14697}, {14701, 14717, 14736, 14752, 14771, 14778, 14788, 14804, 14820, 14839, 14861, 14877, 0}, {14701, 14717, 14736, 14752, 14771, 14778, 14788, 14804, 14820, 14839, 14861, 14877, 0}, {14896, 14906, 14736, 14752, 14771, 14778, 14919, 14932, 14942, 14955, 14974, 14984, 0}, {14896, 14906, 14736, 14752, 14771, 14778, 14919, 14932, 14942, 14955, 14974, 14984, 0}, 0, 0, 55, 3, {744,755,1062,2098,417,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{71,266,591,583,0,0,0,0,0,0,0,0},{89,271,611,600,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {3033, 49, 52, {14997, 15006, 15015, 15025, 15035, 15045, 15057}, {15065, 15070, 15074, 15078, 15082, 15087, 15092}, {15096, 15100, 15103, 15106, 15109, 15113, 15117}, {15120, 15127, 15132, 1851, 15138, 15144, 15151, 15157, 15165, 15175, 15183, 15192, 0}, {15120, 15127, 15132, 1851, 15138, 15144, 15151, 15157, 15165, 15175, 15183, 15192, 0}, {1914, 15202, 2791, 1927, 15206, 15210, 15215, 15219, 15223, 15227, 1951, 15231, 0}, {1914, 15202, 2791, 1927, 15206, 15210, 15215, 15219, 15223, 15227, 1951, 15231, 0}, 0, 0, 1, 3, {18,2351,0,0,0,0,0,0,0,0,0,0,0,0},{3048,3074,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{3094,0,0,0,0,0,0,0}}, + {925, 431, 436, {15236, 15248, 15259, 15273, 15285, 15295, 15305}, {15316, 15321, 15326, 15331, 15336, 15341, 15346}, {1285, 2894, 1608, 4532, 1828, 13432, 1616}, {15351, 15368, 15381, 15395, 15408, 15421, 15434, 15448, 15460, 15474, 15488, 15502, 0}, {15351, 15368, 15381, 15395, 15408, 15421, 15434, 15448, 15460, 15474, 15488, 15502, 0}, {15515, 15522, 15527, 15532, 15536, 15541, 15546, 15551, 15556, 15563, 15568, 15574, 0}, {15515, 15522, 15527, 15532, 15536, 15541, 15546, 15551, 15556, 15563, 15568, 15574, 0}, 2, 1, 55, 3, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2979,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {109, 441, 444, {15872, 15877, 7673, 7680, 15883, 15890, 7697}, {15897, 15901, 7711, 7715, 15905, 7723, 7727}, {9428, 11804, 1285, 7731, 3099, 2892, 1285}, {7733, 7741, 15909, 1851, 7756, 1931, 15913, 15919, 1878, 1888, 1896, 15924, 0}, {7733, 7741, 15909, 1851, 7756, 1931, 15913, 15919, 1878, 1888, 1896, 15924, 0}, {1914, 1918, 15909, 1927, 7756, 1931, 1935, 15933, 1943, 1947, 1951, 13346, 0}, {1914, 1918, 15909, 1927, 7756, 1931, 1935, 15933, 1943, 1947, 1951, 13346, 0}, 0, 1, 1, 3, {2764,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 49, 52, {15937, 15954, 15971, 15988, 16005, 16022, 16031}, {16042, 16047, 16052, 16057, 16062, 16067, 16072}, {16077, 16080, 6081, 6081, 16083, 16077, 6081}, {16086, 16099, 16110, 16123, 16134, 16145, 16158, 16169, 16180, 16197, 16208, 16221, 0}, {16240, 16253, 16264, 16277, 16288, 16299, 16312, 16323, 16334, 16351, 16362, 16375, 0}, {16394, 16402, 16410, 16418, 16426, 16434, 16442, 16450, 16458, 16466, 16474, 16482, 0}, {16394, 16402, 16410, 16418, 16426, 16434, 16442, 16450, 16458, 16466, 16474, 16482, 0}, 0, 1, 1, 3, {18,3112,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {3125, 448, 453, {16490, 16507, 16524, 16541, 16558, 16575, 16584}, {16597, 16605, 16613, 16623, 16633, 16575, 16643}, {16077, 16080, 16651, 16651, 16083, 16077, 16654}, {16657, 16670, 9888, 16685, 9908, 16698, 16707, 9929, 16716, 16733, 16748, 16761, 0}, {6087, 6100, 360, 6115, 380, 6128, 6137, 401, 6146, 6163, 6178, 6191, 0}, {9994, 10001, 10008, 10015, 9908, 9915, 9922, 10022, 10029, 10036, 10043, 10050, 0}, {9994, 10001, 10008, 10015, 9908, 9915, 9922, 10022, 10029, 10036, 10043, 10050, 0}, 0, 1, 55, 3, {3132,0,0,0,0,0,0,0,0,0,0,0,0,0},{3141,0,0,0,0,0,0,0,0,0},{71,266,0,0,0,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{3160,0,0,0,0,0,0,0}}, + {109, 49, 52, {16776, 16785, 16794, 16802, 16811, 16820, 16827}, {16776, 16785, 16794, 16802, 16811, 16820, 16827}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {7733, 7741, 16836, 16842, 7756, 1861, 15913, 16849, 13301, 16856, 13318, 16863, 0}, {7733, 7741, 16836, 16842, 7756, 1861, 15913, 16849, 13301, 16856, 13318, 16863, 0}, {1914, 1918, 15909, 1927, 7756, 1931, 1935, 16871, 1943, 1947, 1951, 7781, 0}, {1914, 1918, 15909, 1927, 7756, 1931, 1935, 16871, 1943, 1947, 1951, 7781, 0}, 0, 0, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 0, 0, {16875, 16886, 16895, 16904, 16915, 16925, 16930}, {16937, 16941, 16944, 16947, 16951, 9416, 16954}, {16958, 1828, 1285, 7339, 1280, 9428, 16961}, {16964, 16972, 11617, 11622, 16979, 16984, 16990, 12137, 16996, 17006, 17015, 11673, 0}, {16964, 16972, 11617, 11622, 16979, 16984, 16990, 12137, 16996, 17006, 17015, 11673, 0}, {17023, 17028, 11617, 4614, 16979, 16984, 16990, 12237, 11696, 5109, 17032, 11704, 0}, {17023, 17028, 11617, 4614, 16979, 16984, 16990, 12237, 11696, 5109, 17032, 11704, 0}, 0, 1, 11, 3, {3176,681,0,0,0,0,0,0,0,0,0,0,0,0},{3191,0,0,0,0,0,0,0,0,0},{71,266,0,0,0,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{3223,0,0,0,0,0,0,0}}, + {925, 458, 461, {17037, 17047, 17056, 17065, 17076, 17086, 17091}, {17098, 17102, 17107, 17112, 17117, 7723, 17121}, {17126, 1828, 1285, 5210, 1280, 2892, 1285}, {11533, 11540, 7354, 11547, 2760, 17128, 17133, 17138, 17145, 17153, 11589, 11596, 0}, {11603, 11610, 11617, 11622, 11628, 11632, 11637, 8914, 17160, 17168, 11666, 11673, 0}, {12906, 17175, 2791, 1927, 2760, 17179, 17183, 17187, 7707, 1947, 17191, 17195, 0}, {12906, 17175, 2791, 1927, 2760, 17179, 17183, 17187, 7707, 1947, 17191, 17195, 0}, 0, 1, 1, 3, {406,2861,0,0,0,0,0,0,0,0,0,0,0,0},{3239,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {109, 49, 52, {17199, 17218, 17237, 17262, 17281, 17315, 17340}, {17359, 17369, 17379, 17395, 17405, 17430, 17446}, {17456, 17460, 17467, 17471, 17478, 17485, 17492}, {17496, 17524, 17558, 17574, 17593, 17600, 17610, 17626, 17642, 17673, 17695, 17717, 0}, {17496, 17524, 17558, 17574, 17593, 17600, 17610, 17626, 17642, 17673, 17695, 17717, 0}, {17496, 17524, 17558, 17574, 17593, 17600, 17610, 17626, 17642, 17673, 17695, 17717, 0}, {17496, 17524, 17558, 17574, 17593, 17600, 17610, 17626, 17642, 17673, 17695, 17717, 0}, 0, 0, 55, 11, {755,1062,744,755,744,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{1151,1146,3258,3267,0,0,0,0,0,0,0,0},{1173,1165,3275,3287,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {1, 49, 52, {18324, 18343, 18362, 18384, 18403, 18425, 18450}, {18469, 18479, 18489, 18502, 18512, 18525, 18541}, {18551, 18555, 18562, 18569, 18576, 18583, 18590}, {18594, 18622, 18650, 18666, 18685, 18692, 18702, 18718, 18734, 18762, 18784, 18806, 0}, {18594, 18622, 18650, 18666, 18685, 18692, 18702, 18718, 18734, 18762, 18784, 18806, 0}, {18831, 18850, 18650, 18666, 18685, 18692, 18702, 18718, 18869, 18885, 18901, 18911, 0}, {18831, 18850, 18650, 18666, 18685, 18692, 18702, 18718, 18869, 18885, 18901, 18911, 0}, 0, 0, 55, 3, {755,1062,2098,744,417,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{71,266,591,583,0,0,0,0,0,0,0,0},{89,271,611,600,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {1, 5, 8, {18924, 18943, 18962, 18987, 19006, 19028, 19053}, {19072, 19082, 19092, 19108, 19118, 19131, 19147}, {19157, 19161, 19168, 19172, 19179, 19186, 19193}, {19197, 19219, 19241, 19263, 19282, 19289, 19299, 19315, 19331, 19362, 19384, 19406, 0}, {19197, 19219, 19241, 19263, 19282, 19289, 19299, 19315, 19331, 19362, 19384, 19406, 0}, {19197, 19219, 19241, 19263, 19282, 19289, 19299, 19315, 19331, 19362, 19384, 19406, 0}, {19197, 19219, 19241, 19263, 19282, 19289, 19299, 19315, 19331, 19362, 19384, 19406, 0}, 0, 0, 55, 3, {755,1062,2098,744,417,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{71,266,591,583,0,0,0,0,0,0,0,0},{89,271,611,600,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {109, 494, 519, {19431, 19450, 19472, 19497, 19513, 19535, 19554}, {19564, 19578, 19592, 19606, 19617, 19631, 19554}, {19645, 19652, 19659, 19666, 19673, 19680, 19687}, {19691, 19707, 19732, 19751, 19770, 19777, 19790, 19803, 19822, 19853, 19878, 19900, 0}, {19691, 19707, 19732, 19751, 19770, 19777, 19790, 19803, 19822, 19853, 19878, 19900, 0}, {19925, 19933, 19947, 19961, 19770, 19777, 19790, 19972, 19980, 19994, 20005, 20013, 0}, {19925, 19933, 19947, 19961, 19770, 19777, 19790, 19972, 19980, 19994, 20005, 20013, 0}, 0, 0, 55, 3, {744,755,1062,2098,417,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{71,266,591,583,0,0,0,0,0,0,0,0},{89,271,611,600,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 49, 52, {20024, 20046, 20068, 20093, 20115, 20140, 20168}, {20190, 20200, 20210, 20223, 20233, 20246, 20262}, {20272, 20276, 20283, 20287, 20294, 20301, 20308}, {20312, 20328, 20353, 20372, 20394, 20401, 20414, 20427, 20446, 20477, 20502, 20521, 0}, {20312, 20328, 20353, 20372, 20394, 20401, 20414, 20427, 20446, 20477, 20502, 20521, 0}, {20546, 20553, 20353, 20569, 20394, 20401, 20414, 20427, 20585, 20607, 20623, 20633, 0}, {20546, 20553, 20353, 20569, 20394, 20401, 20414, 20427, 20585, 20607, 20623, 20633, 0}, 0, 0, 55, 3, {755,1062,2098,744,417,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{71,266,591,583,0,0,0,0,0,0,0,0},{89,271,611,600,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {925, 544, 572, {20649, 20671, 20690, 20712, 20731, 20753, 20778}, {20797, 20810, 20820, 20833, 20843, 20856, 20872}, {20882, 20889, 20896, 20903, 20910, 20917, 20924}, {20928, 20944, 20969, 20988, 21010, 21017, 21030, 21043, 21062, 21093, 21118, 21140, 0}, {20928, 20944, 20969, 20988, 21010, 21017, 21030, 21043, 21062, 21093, 21118, 21140, 0}, {21165, 21172, 20969, 21188, 21010, 21017, 21030, 21204, 21211, 21233, 21249, 21262, 0}, {21165, 21172, 20969, 21188, 21010, 21017, 21030, 21204, 21211, 21233, 21249, 21262, 0}, 0, 0, 55, 3, {755,1062,2098,744,417,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{71,266,591,583,0,0,0,0,0,0,0,0},{89,271,611,600,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {3316, 49, 52, {21278, 21306, 21340, 21368, 21396, 21427, 21464}, {21492, 21505, 21524, 21540, 21553, 21572, 21591}, {21601, 21608, 21615, 21622, 21629, 21642, 21649}, {21653, 21672, 21700, 21722, 21741, 21754, 21764, 21777, 21802, 21833, 21858, 21874, 0}, {21653, 21672, 21700, 21722, 21741, 21754, 21764, 21777, 21802, 21833, 21858, 21874, 0}, {21893, 21903, 21922, 21932, 21741, 21754, 21764, 21948, 21955, 21980, 21996, 22006, 0}, {21893, 21903, 21922, 21932, 21741, 21754, 21764, 21948, 21955, 21980, 21996, 22006, 0}, 0, 0, 55, 11, {755,1062,775,2098,0,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{1151,1146,3258,3267,0,0,0,0,0,0,0,0},{1173,1165,3275,3287,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {109, 594, 622, {22019, 22038, 22057, 22082, 22101, 22135, 22160}, {22179, 17369, 17379, 17395, 22189, 22214, 17446}, {0, 0, 0, 0, 0, 0, 0}, {22230, 22255, 22286, 22302, 17593, 17600, 17610, 22321, 22337, 22368, 22390, 22412, 0}, {22230, 22255, 22286, 22302, 17593, 17600, 17610, 22321, 22337, 22368, 22390, 22412, 0}, {22437, 22450, 22286, 22302, 17593, 17600, 17610, 22469, 22476, 22492, 22508, 22518, 0}, {22437, 22450, 22286, 22302, 17593, 17600, 17610, 22469, 22476, 22492, 22508, 22518, 0}, 0, 0, 55, 3, {744,0,0,0,0,0,0,0,0,0,0,0,0,0},{3324,0,0,0,0,0,0,0,0,0},{583,591,266,0,0,0,0,0,0,0,0,0},{600,611,271,0,0,0,0,0,0},{3343,3351,0,0,0,0,0,0}}, + {1, 644, 656, {14431, 14450, 22531, 14491, 14510, 14532, 14557}, {14576, 14586, 22553, 14609, 14619, 14632, 14648}, {14658, 14662, 14669, 14676, 14683, 14690, 14697}, {22566, 22591, 14736, 22622, 22641, 14778, 22648, 22661, 22677, 22702, 22724, 22752, 0}, {22566, 22591, 14736, 22622, 22641, 14778, 22648, 22661, 22677, 22702, 22724, 22752, 0}, {22774, 22787, 14736, 22806, 22641, 14778, 22648, 22822, 22829, 22848, 22864, 22886, 0}, {22774, 22787, 14736, 22806, 22641, 14778, 22648, 22822, 22829, 22848, 22864, 22886, 0}, 0, 0, 55, 3, {744,755,1062,2098,417,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{71,266,591,583,0,0,0,0,0,0,0,0},{89,271,611,600,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {925, 665, 670, {22902, 22909, 22920, 22933, 22946, 22957, 22970}, {22981, 22986, 22991, 22996, 23001, 23006, 23011}, {22981, 22986, 22991, 22996, 23001, 23006, 23011}, {23016, 23042, 23070, 23100, 23130, 23156, 23186, 23212, 23240, 23264, 23292, 23329, 0}, {23016, 23042, 23070, 23100, 23130, 23156, 23186, 23212, 23240, 23264, 23292, 23329, 0}, {23368, 23380, 23392, 23404, 23416, 23428, 23440, 23452, 23464, 23476, 23489, 23502, 0}, {23368, 23380, 23392, 23404, 23416, 23428, 23440, 23452, 23464, 23476, 23489, 23502, 0}, 0, 1, 55, 3, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{3361,3399,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {3431, 675, 697, {23515, 23543, 23571, 23608, 23639, 23673, 23704}, {23738, 23754, 23770, 23795, 23814, 23836, 23855}, {23877, 23884, 23891, 23901, 23911, 23921, 23931}, {23944, 23978, 24015, 24052, 24086, 24117, 24154, 24191, 24231, 24265, 24299, 24348, 0}, {24397, 24428, 24462, 24496, 24527, 24555, 24589, 24623, 24660, 24691, 24722, 24768, 0}, {24814, 24827, 24840, 24853, 24866, 24879, 24892, 24905, 24918, 24931, 24947, 24963, 0}, {24814, 24827, 24840, 24853, 24866, 24879, 24892, 24905, 24918, 24931, 24947, 24963, 0}, 0, 0, 1, 3, {379,388,397,428,417,406,446,439,453,0,0,0,0,0},{3455,3498,3546,3578,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{3615,666,0,0,0,0,0,0}}, + {109, 722, 725, {24979, 24988, 24998, 25010, 25023, 25032, 25044}, {25056, 25060, 12926, 25065, 25069, 25073, 25077}, {1285, 25081, 1608, 1608, 11804, 4532, 1285}, {25084, 25091, 25100, 25107, 1857, 25114, 25122, 25133, 25138, 25143, 25150, 25159, 0}, {25084, 25091, 25100, 25107, 1857, 25114, 25122, 25133, 25138, 25143, 25150, 25159, 0}, {25167, 25171, 12926, 25175, 1857, 25179, 25183, 25133, 25138, 25187, 25191, 25196, 0}, {25167, 25171, 12926, 25175, 1857, 25179, 25183, 25133, 25138, 25187, 25191, 25196, 0}, 2, 1, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 49, 52, {25201, 25223, 25239, 25258, 25268, 25299, 25315}, {25201, 25223, 25239, 25258, 25268, 25299, 25315}, {25328, 25332, 25328, 25336, 25336, 25340, 25340}, {25344, 25357, 25376, 25389, 25402, 25415, 25434, 25453, 25466, 25482, 25495, 25520, 0}, {25344, 25357, 25376, 25389, 25402, 25415, 25434, 25453, 25466, 25482, 25495, 25520, 0}, {25344, 25357, 25376, 25389, 25402, 25415, 25434, 25453, 25466, 25482, 25495, 25520, 0}, {25344, 25357, 25376, 25389, 25402, 25415, 25434, 25453, 25466, 25482, 25495, 25520, 0}, 0, 0, 1, 3, {9,417,0,0,0,0,0,0,0,0,0,0,0,0},{894,2363,0,0,0,0,0,0,0,0},{266,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{3648,0,0,0,0,0,0,0}}, + {109, 728, 753, {25533, 25558, 25577, 25605, 25624, 25649, 25668}, {25690, 25706, 25716, 25735, 25745, 25761, 25771}, {25784, 25791, 25795, 25799, 25803, 25810, 25817}, {25821, 25840, 25856, 25869, 25882, 25904, 25923, 25945, 25961, 25977, 25990, 26006, 0}, {25821, 25840, 25856, 25869, 25882, 25904, 25923, 25945, 25961, 25977, 25990, 26006, 0}, {26022, 26031, 26040, 26049, 26058, 26067, 26079, 26088, 26097, 26106, 26115, 26124, 0}, {26022, 26031, 26040, 26049, 26058, 26067, 26079, 26088, 26097, 26106, 26115, 26124, 0}, 0, 0, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{3683,894,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 778, 794, {26133, 26161, 26183, 26202, 26227, 26252, 26271}, {26133, 26161, 26183, 26202, 26227, 26252, 26271}, {26281, 26281, 26285, 26289, 26293, 26297, 26301}, {26305, 26330, 26361, 26371, 26384, 26391, 26404, 26426, 26442, 26467, 26498, 26523, 0}, {26305, 26330, 26361, 26371, 26384, 26391, 26404, 26426, 26442, 26467, 26498, 26523, 0}, {26545, 26555, 26361, 26562, 26384, 26391, 26566, 26573, 26577, 26587, 26603, 26613, 0}, {26545, 26555, 26361, 26562, 26384, 26391, 26566, 26573, 26577, 26587, 26603, 26613, 0}, 0, 0, 55, 3, {744,304,0,0,0,0,0,0,0,0,0,0,0,0},{3710,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 165, 170, {2803, 26620, 2817, 26625, 26635, 26641, 2850}, {26648, 26653, 26658, 26663, 26669, 26674, 26679}, {1828, 1616, 1608, 1608, 2890, 2894, 1285}, {26685, 26693, 26702, 26708, 26714, 26719, 26725, 26731, 26738, 26747, 26755, 26764, 0}, {26773, 26781, 2910, 666, 5557, 26790, 26796, 2933, 5574, 5583, 5591, 26802, 0}, {26811, 13623, 26658, 26816, 26714, 26719, 26821, 26826, 26831, 26836, 13663, 26841, 0}, {26811, 13623, 26658, 26816, 26714, 26719, 26821, 26826, 26831, 26836, 13663, 26841, 0}, 2, 1, 1, 3, {18,3021,0,0,0,0,0,0,0,0,0,0,0,0},{1314,1261,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 644, 804, {26846, 14450, 26874, 14491, 14510, 14532, 14557}, {14576, 14586, 22553, 14609, 14619, 14632, 14648}, {0, 0, 0, 0, 0, 0, 0}, {22566, 22591, 14736, 22622, 22641, 14778, 22648, 26893, 26909, 26937, 22724, 22752, 0}, {22566, 22591, 14736, 22622, 22641, 14778, 22648, 26893, 26909, 26937, 22724, 22752, 0}, {4744, 4746, 4748, 4750, 4752, 4754, 4756, 4758, 4760, 4762, 4765, 4768, 0}, {4744, 4746, 4748, 4750, 4752, 4754, 4756, 4758, 4760, 4762, 4765, 4768, 0}, 0, 0, 55, 3, {744,755,1062,2098,417,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{71,266,591,583,0,0,0,0,0,0,0,0},{89,271,611,600,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {925, 816, 828, {26959, 26975, 26991, 27019, 27035, 27078, 27103}, {26959, 26975, 27131, 27019, 27141, 27163, 27176}, {27186, 27190, 27194, 27198, 27202, 27215, 27222}, {27229, 27248, 27273, 27292, 27317, 27330, 27343, 27356, 27378, 27412, 27437, 27465, 0}, {27229, 27248, 27273, 27292, 27317, 27330, 27343, 27356, 27378, 27412, 27437, 27465, 0}, {27493, 27500, 27510, 27292, 27317, 27330, 27343, 27523, 27533, 27546, 27556, 27569, 0}, {27493, 27500, 27510, 27292, 27317, 27330, 27343, 27523, 27533, 27546, 27556, 27569, 0}, 0, 1, 55, 11, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2979,2997,0,0,0,0,0,0,0,0},{3267,71,0,0,0,0,0,0,0,0,0,0},{3287,89,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {925, 866, 876, {28047, 28057, 28064, 28077, 28087, 28097, 28107}, {28047, 28057, 28117, 28077, 28087, 28097, 28107}, {28127, 28131, 28135, 28139, 28143, 28147, 28151}, {28155, 28171, 28187, 28197, 28210, 28217, 28224, 28234, 28247, 28266, 28282, 28298, 0}, {28155, 28171, 28187, 28197, 28210, 28217, 28224, 28234, 28247, 28266, 28282, 28298, 0}, {28314, 28324, 28187, 28334, 28210, 28217, 28224, 28344, 28354, 28364, 28374, 28384, 0}, {28314, 28324, 28187, 28334, 28210, 28217, 28224, 28344, 28354, 28364, 28374, 28384, 0}, 0, 0, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 381, 409, {28601, 28620, 28639, 28664, 28683, 28705, 28730}, {28749, 14586, 28759, 14609, 28775, 14632, 14648}, {28788, 14662, 28792, 14676, 28796, 14690, 14697}, {14701, 28803, 14736, 28831, 22641, 28850, 14788, 28860, 28876, 28907, 28929, 28954, 0}, {14701, 28803, 14736, 28831, 14771, 28850, 14788, 28860, 28876, 28907, 28929, 28954, 0}, {14701, 28803, 14736, 28831, 22641, 28850, 14788, 28860, 28876, 28907, 28929, 28954, 0}, {14701, 28803, 14736, 28831, 22641, 28850, 14788, 28860, 28876, 28907, 28929, 28954, 0}, 0, 0, 1, 3, {932,941,948,957,460,417,968,0,0,0,0,0,0,0},{3763,3783,42,2448,0,0,0,0,0,0},{906,62,266,71,0,0,0,0,0,0,0,0},{914,77,271,89,0,0,0,0,0},{3351,0,0,0,0,0,0,0}}, + {109, 49, 52, {28979, 28985, 28993, 29001, 29010, 29021, 29027}, {29033, 29036, 3084, 4997, 3090, 29039, 1275}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {29042, 29053, 13591, 1851, 29064, 29070, 2769, 13609, 29075, 1888, 29085, 29094, 0}, {29042, 29053, 13591, 1851, 29064, 29070, 2769, 13609, 29075, 1888, 29085, 29094, 0}, {1914, 1918, 29103, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 7781, 0}, {1914, 1918, 29103, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 7781, 0}, 2, 1, 55, 3, {744,304,0,0,0,0,0,0,0,0,0,0,0,0},{1217,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 0, 0, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {29107, 29114, 29123, 29138, 29149, 29158, 29165, 29172, 29179, 29190, 29203, 29216, 0}, {29107, 29114, 29123, 29138, 29149, 29158, 29165, 29172, 29179, 29190, 29203, 29216, 0}, {29107, 29114, 29123, 29138, 29149, 29158, 29165, 29172, 29179, 29190, 29203, 29216, 0}, {29107, 29114, 29123, 29138, 29149, 29158, 29165, 29172, 29179, 29190, 29203, 29216, 0}, 0, 6, 1, 3, {379,417,0,0,0,0,0,0,0,0,0,0,0,0},{894,1217,0,0,0,0,0,0,0,0},{266,0,0,0,0,0,0,0,0,0,0,0},{271,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 49, 52, {29221, 29228, 29234, 29241, 29252, 29260, 29269}, {29276, 29280, 2791, 29284, 29288, 29292, 7727}, {29276, 29280, 2791, 29284, 29288, 29292, 7727}, {29296, 29302, 29310, 26708, 29316, 29321, 29327, 26731, 29333, 29343, 29351, 29361, 0}, {29296, 29302, 29310, 26708, 29316, 29321, 29327, 26731, 29333, 29343, 29351, 29361, 0}, {29371, 29375, 2791, 29379, 2760, 29383, 29387, 16871, 15223, 1947, 29391, 13346, 0}, {29371, 29375, 2791, 29379, 2760, 29383, 29387, 16871, 15223, 1947, 29391, 13346, 0}, 0, 0, 1, 3, {932,3009,0,0,0,0,0,0,0,0,0,0,0,0},{978,997,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 49, 52, {29614, 29621, 29629, 29636, 29643, 29651, 29660}, {29667, 29671, 29675, 29679, 29683, 7723, 28444}, {1616, 1616, 1610, 1616, 9428, 2892, 9428}, {29687, 29695, 29705, 29711, 29719, 29724, 29729, 29734, 29741, 16856, 29749, 29757, 0}, {29687, 29695, 29705, 29711, 29719, 29724, 29729, 29734, 29741, 16856, 29749, 29757, 0}, {1914, 29765, 2791, 29769, 2760, 28570, 28574, 29773, 2731, 1947, 29777, 13346, 0}, {1914, 29765, 2791, 29769, 2760, 28570, 28574, 29773, 2731, 1947, 29777, 13346, 0}, 0, 0, 1, 3, {295,3021,0,0,0,0,0,0,0,0,0,0,0,0},{1010,1029,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 928, 939, {29781, 29799, 29814, 29836, 29849, 29863, 29880}, {29904, 29912, 29917, 29836, 29849, 29929, 29936}, {0, 0, 0, 0, 0, 0, 0}, {29950, 29972, 29988, 30008, 30022, 30039, 30054, 30071, 30085, 30098, 30117, 30131, 0}, {29950, 29972, 29988, 30008, 30022, 30039, 30054, 30071, 30085, 30098, 30117, 30131, 0}, {30150, 30165, 30174, 30187, 30194, 30204, 30212, 30222, 30229, 30235, 30247, 30254, 0}, {30150, 30165, 30174, 30187, 30194, 30204, 30212, 30222, 30229, 30235, 30247, 30254, 0}, 0, 0, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 0, 0, {30266, 30274, 12472, 12968, 12490, 30285, 30295}, {12516, 12998, 12524, 12528, 12532, 12535, 30304}, {0, 0, 0, 0, 0, 0, 0}, {30308, 30317, 30327, 30335, 7756, 2764, 30343, 30349, 30358, 30367, 30376, 30385, 0}, {30308, 30317, 30327, 30335, 7756, 2764, 30343, 30349, 30358, 30367, 30376, 30385, 0}, {1914, 1918, 13006, 30394, 7756, 1931, 1935, 16871, 15223, 1947, 30398, 13346, 0}, {1914, 1918, 13006, 30394, 7756, 1931, 1935, 16871, 15223, 1947, 30398, 13346, 0}, 0, 0, 55, 3, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2979,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {3797, 949, 955, {30402, 30410, 30419, 30430, 30440, 30452, 30460}, {12516, 30470, 30475, 30480, 30485, 30489, 30493}, {1285, 1608, 1828, 1608, 1828, 1614, 1285}, {1830, 1837, 30497, 30504, 30512, 1861, 1866, 1871, 1878, 1888, 1896, 1905, 0}, {1830, 1837, 30497, 30504, 30512, 1861, 1866, 1871, 1878, 1888, 1896, 1905, 0}, {1914, 1918, 30516, 29379, 30512, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, {1914, 1918, 30516, 29379, 30512, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, 2, 1, 11, 3, {775,9,755,0,0,0,0,0,0,0,0,0,0,0},{721,3806,798,2541,3819,3844,0,0,0,0},{71,266,1146,3870,0,0,0,0,0,0,0,0},{89,3882,3897,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {3913, 965, 970, {30521, 30528, 30543, 30557, 30573, 30588, 30604}, {4528, 30619, 4512, 30623, 30627, 30631, 30635}, {1285, 9428, 1608, 1280, 1285, 1610, 9428}, {5011, 5019, 30639, 30646, 30653, 1649, 1654, 30658, 30668, 30679, 30688, 30698, 0}, {5011, 5019, 30639, 30646, 30653, 1649, 1654, 30658, 30668, 30679, 30688, 30698, 0}, {5089, 4610, 4512, 4614, 1645, 5093, 5097, 5101, 5105, 5109, 4642, 6911, 0}, {5089, 4610, 4512, 4614, 1645, 5093, 5097, 5101, 5105, 5109, 4642, 6911, 0}, 0, 0, 55, 3, {744,755,417,764,0,0,0,0,0,0,0,0,0,0},{3926,721,2561,0,0,0,0,0,0,0},{71,266,0,0,0,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 975, 980, {30708, 30724, 30732, 30740, 30749, 30761, 30771}, {30781, 30787, 30793, 30797, 30801, 30809, 2731}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {30816, 30829, 30843, 30852, 30512, 30858, 30863, 30871, 13301, 30884, 13318, 13326, 0}, {30816, 30829, 30843, 30852, 30512, 30858, 30863, 30871, 13301, 30884, 13318, 13326, 0}, {30893, 1918, 30897, 13334, 30512, 30901, 1935, 30905, 1943, 30913, 1951, 13346, 0}, {30893, 1918, 30897, 13334, 30512, 30901, 1935, 30905, 1943, 30913, 1951, 13346, 0}, 0, 0, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 985, 988, {30919, 30927, 30935, 30943, 30950, 30958, 30966}, {30974, 30978, 30982, 30986, 7719, 30990, 30994}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {30998, 31006, 31018, 31030, 31035, 31042, 31053, 31064, 31072, 31081, 31094, 31102, 0}, {30998, 31006, 31018, 31030, 31035, 31042, 31053, 31064, 31072, 31081, 31094, 31102, 0}, {31109, 31113, 31117, 31121, 31125, 31129, 31133, 31137, 31141, 31145, 25077, 12918, 0}, {31109, 31113, 31117, 31121, 31125, 31129, 31133, 31137, 31141, 31145, 25077, 12918, 0}, 0, 0, 1, 3, {18,2796,0,0,0,0,0,0,0,0,0,0,0,0},{978,1261,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 991, 1011, {31149, 31162, 31172, 28077, 31182, 31192, 31202}, {31212, 31219, 31226, 31233, 31240, 31247, 31254}, {28131, 28131, 31261, 28139, 31265, 28147, 31269}, {31273, 31280, 31293, 31306, 31319, 31332, 31339, 31349, 31359, 31375, 31388, 31398, 0}, {31273, 31280, 31293, 31306, 31319, 31332, 31339, 31349, 31359, 31375, 31388, 31398, 0}, {31273, 31411, 31418, 31425, 31432, 31332, 31439, 31446, 31453, 31460, 31467, 31474, 0}, {31273, 31411, 31418, 31425, 31432, 31332, 31439, 31446, 31453, 31460, 31467, 31474, 0}, 0, 0, 1, 3, {18,2796,0,0,0,0,0,0,0,0,0,0,0,0},{4538,1261,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 49, 52, {31481, 31489, 31499, 31508, 31518, 31527, 31537}, {31546, 31549, 31552, 31555, 31558, 31561, 31564}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {31567, 31575, 31585, 31592, 7756, 31602, 31607, 31613, 31622, 31633, 31643, 31652, 0}, {31567, 31575, 31585, 31592, 7756, 31602, 31607, 31613, 31622, 31633, 31643, 31652, 0}, {31661, 31666, 31671, 31676, 7756, 31682, 31687, 31692, 31698, 31703, 31709, 31714, 0}, {31661, 31666, 31671, 31676, 7756, 31682, 31687, 31692, 31698, 31703, 31709, 31714, 0}, 0, 0, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 1031, 1035, {31719, 31724, 31731, 31739, 31746, 31754, 31760}, {31766, 15901, 29675, 31770, 15905, 30990, 7727}, {9428, 11804, 1610, 9428, 31774, 2892, 1285}, {31777, 31791, 31804, 31820, 31833, 31847, 31860, 31875, 31891, 31907, 31921, 31943, 0}, {31777, 31791, 31804, 31820, 31833, 31847, 31860, 31875, 31891, 31907, 31921, 31943, 0}, {31966, 31970, 25077, 31974, 31978, 31982, 31986, 31990, 31994, 31998, 32002, 32006, 0}, {31966, 31970, 25077, 31974, 31978, 31982, 31986, 31990, 31994, 31998, 32002, 32006, 0}, 0, 0, 1, 3, {18,2796,0,0,0,0,0,0,0,0,0,0,0,0},{3763,1261,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {3982, 1039, 1046, {32010, 32020, 32030, 32040, 32050, 32060, 32070}, {32080, 32087, 32094, 32101, 32108, 32115, 32122}, {32129, 32133, 32137, 32141, 32145, 32149, 32153}, {32157, 32164, 32171, 32178, 32185, 32192, 32199, 32206, 32213, 32220, 32227, 32237, 0}, {32157, 32164, 32171, 32178, 32185, 32192, 32199, 32206, 32213, 32220, 32227, 32237, 0}, {32157, 32164, 32171, 32178, 32185, 32192, 32199, 32206, 32213, 32220, 32227, 32237, 0}, {32157, 32164, 32171, 32178, 32185, 32192, 32199, 32206, 32213, 32220, 32227, 32237, 0}, 0, 0, 1, 3, {379,388,397,428,417,406,0,0,0,0,0,0,0,0},{4005,4029,4059,4089,4106,0,0,0,0,0},{583,266,71,0,0,0,0,0,0,0,0,0},{600,271,89,0,0,0,0,0,0},{4129,666,0,0,0,0,0,0}}, + {109, 975, 1053, {25056, 29280, 32247, 32254, 32264, 32269, 32276}, {25056, 29280, 32283, 32288, 32264, 32293, 32298}, {32303, 1616, 32306, 32309, 17126, 4532, 1825}, {32312, 32319, 32247, 32330, 32336, 32340, 32349, 32356, 32361, 32370, 32375, 32378, 0}, {32312, 32319, 32247, 32330, 32336, 32340, 32349, 32356, 32361, 32370, 32375, 32378, 0}, {32384, 32389, 32397, 32403, 32336, 32408, 32414, 32356, 32420, 32370, 32375, 32426, 0}, {32384, 32389, 32397, 32403, 32336, 32408, 32414, 32356, 32420, 32370, 32375, 32426, 0}, 2, 1, 55, 3, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2979,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {3125, 1058, 1064, {32431, 32448, 32463, 32480, 32497, 32514, 32523}, {32534, 32539, 32544, 32549, 32554, 32559, 32564}, {32569, 10152, 10155, 10158, 10161, 10164, 10167}, {32572, 32585, 32598, 32607, 32620, 32627, 32638, 32649, 32664, 32681, 32698, 32713, 0}, {32572, 32585, 32598, 32607, 32620, 32627, 32638, 32649, 32664, 32681, 32698, 32713, 0}, {32572, 32585, 32598, 32607, 32620, 32627, 32638, 32649, 32664, 32681, 32698, 32713, 0}, {32572, 32585, 32598, 32607, 32620, 32627, 32638, 32649, 32664, 32681, 32698, 32713, 0}, 0, 0, 55, 3, {388,397,417,428,0,0,0,0,0,0,0,0,0,0},{4146,4167,4193,4234,4280,0,0,0,0,0},{266,71,583,591,0,0,0,0,0,0,0,0},{271,89,600,611,0,0,0,0,0},{4294,2717,666,0,0,0,0,0}}, + {673, 1070, 1075, {32728, 32736, 32746, 32756, 32765, 32775, 32783}, {32793, 32797, 32802, 32806, 32810, 32814, 13568}, {1285, 1608, 1828, 1608, 1828, 1614, 1285}, {1830, 1837, 1845, 1851, 1857, 1861, 1866, 32818, 32827, 32838, 32847, 32857, 0}, {1830, 1837, 1845, 1851, 1857, 1861, 1866, 32818, 32827, 32838, 32847, 32857, 0}, {1914, 1918, 1922, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, {1914, 1918, 1922, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, 2, 1, 1, 3, {18,9,775,755,417,0,0,0,0,0,0,0,0,0},{1217,1234,894,0,0,0,0,0,0,0},{71,266,1151,1243,1253,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {4315, 1080, 1085, {32867, 32892, 32917, 32942, 32955, 32970, 32987}, {33002, 33007, 33012, 33017, 33022, 33027, 310}, {16083, 16083, 33032, 6081, 6084, 16083, 6081}, {33035, 33054, 33069, 33091, 33111, 33125, 33139, 33151, 33175, 33197, 33214, 33231, 0}, {33248, 33267, 33282, 33304, 33324, 33340, 33356, 33370, 33396, 33420, 33437, 33231, 0}, {33454, 33463, 33472, 33479, 33486, 33493, 33500, 33507, 33514, 33521, 33528, 33535, 0}, {33454, 33463, 33472, 33479, 33486, 33493, 33500, 33507, 33514, 33521, 33528, 33535, 0}, 0, 1, 11, 3, {681,1208,417,4331,4341,0,0,0,0,0,0,0,0,0},{4354,4389,4418,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{4453,0,0,0,0,0,0,0}}, + {925, 49, 52, {33542, 33554, 33565, 33577, 33589, 33599, 33611}, {33626, 33631, 33636, 33641, 33646, 33651, 33656}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {33661, 33670, 33682, 33690, 33695, 33705, 33712, 33721, 33728, 33734, 33743, 33754, 0}, {33661, 33670, 33682, 33690, 33695, 33705, 33712, 33721, 33728, 33734, 33743, 33754, 0}, {33762, 33767, 33772, 33777, 33782, 33787, 33792, 33646, 33797, 33802, 33807, 33812, 0}, {33762, 33767, 33772, 33777, 33782, 33787, 33792, 33646, 33797, 33802, 33807, 33812, 0}, 0, 0, 1, 3, {406,2861,0,0,0,0,0,0,0,0,0,0,0,0},{3239,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {4469, 1090, 1092, {33817, 33830, 33838, 33847, 33857, 33867, 33876}, {33888, 33892, 33896, 33900, 33904, 33908, 33912}, {1828, 1616, 1608, 5210, 9428, 4089, 1285}, {33916, 33930, 33941, 33950, 33961, 33973, 33987, 33999, 34012, 34025, 34037, 34050, 0}, {34064, 34081, 34095, 34107, 34121, 34136, 34150, 34162, 34177, 34192, 34206, 34221, 0}, {34237, 34242, 34248, 34254, 34259, 34265, 34271, 34276, 34282, 34287, 15862, 34293, 0}, {34237, 34242, 34248, 34254, 34259, 34265, 34271, 34276, 34282, 34287, 15862, 34293, 0}, 2, 1, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{4480,4502,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 1094, 1097, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34445, 34448, 34451, 34454, 34457, 10164, 10155}, {34460, 34484, 34493, 34502, 34513, 34522, 34535, 34544, 34549, 34560, 34582, 34606, 0}, {34460, 34484, 34493, 34502, 34513, 34522, 34535, 34544, 34549, 34560, 34582, 34606, 0}, {34460, 34484, 34493, 34502, 34513, 34522, 34535, 34544, 34549, 34560, 34582, 34606, 0}, {34460, 34484, 34493, 34502, 34513, 34522, 34535, 34544, 34549, 34560, 34582, 34606, 0}, 0, 6, 1, 3, {18,9,417,0,0,0,0,0,0,0,0,0,0,0},{2448,42,0,0,0,0,0,0,0,0},{62,71,0,0,0,0,0,0,0,0,0,0},{77,89,0,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {109, 13, 19, {538, 547, 555, 563, 572, 579, 589}, {598, 602, 606, 610, 614, 618, 622}, {626, 629, 632, 635, 638, 641, 644}, {647, 653, 660, 666, 672, 677, 682, 689, 695, 704, 712, 721, 0}, {730, 739, 749, 758, 768, 776, 784, 794, 804, 816, 828, 840, 0}, {852, 857, 660, 863, 672, 677, 868, 873, 877, 882, 887, 892, 0}, {852, 857, 660, 863, 672, 677, 868, 873, 877, 882, 887, 892, 0}, 2, 1, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{315,338,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{355,0,0,0,0,0,0,0}}, + {370, 25, 32, {897, 907, 917, 927, 937, 947, 957}, {967, 974, 981, 988, 995, 1002, 1009}, {1016, 1020, 1024, 1028, 1032, 1036, 1040}, {1044, 1051, 1058, 1065, 1072, 1079, 1086, 1093, 1100, 1107, 1114, 1124, 0}, {1044, 1051, 1058, 1065, 1072, 1079, 1086, 1093, 1100, 1107, 1114, 1124, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, 0, 0, 1, 3, {379,388,397,406,417,428,439,446,453,460,0,0,0,0},{469,491,519,547,562,0,0,0,0,0},{266,71,583,591,0,0,0,0,0,0,0,0},{271,89,600,611,0,0,0,0,0},{623,639,652,666,0,0,0,0}}, + {4575, 57, 63, {1747, 1755, 1762, 1771, 1780, 1791, 1799}, {1807, 1810, 1813, 1816, 1819, 1822, 1825}, {1285, 1608, 1828, 1608, 1828, 1614, 1285}, {1830, 1837, 1845, 1851, 1857, 1861, 1866, 1871, 1878, 1888, 1896, 1905, 0}, {1830, 1837, 1845, 1851, 1857, 1861, 1866, 1871, 1878, 1888, 1896, 1905, 0}, {1914, 1918, 1922, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, {1914, 1918, 1922, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, 2, 1, 11, 3, {681,0,0,0,0,0,0,0,0,0,0,0,0,0},{798,721,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 5, 8, {2650, 2657, 2664, 2672, 2682, 2691, 2698}, {2707, 2711, 2715, 2719, 2723, 2727, 2731}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, 2, 1, 1, 3, {18,9,857,2098,417,0,0,0,0,0,0,0,0,0},{1261,894,876,2462,0,0,0,0,0,0},{71,266,62,906,0,0,0,0,0,0,0,0},{89,271,77,914,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1042, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {34628, 4610, 4512, 5613, 11628, 5093, 5097, 4630, 5105, 34632, 4642, 4646, 0}, {34628, 4610, 4512, 5613, 11628, 5093, 5097, 4630, 5105, 34632, 4642, 4646, 0}, 0, 0, 1, 3, {18,864,9,1054,857,755,417,0,0,0,0,0,0,0},{1069,1124,0,0,0,0,0,0,0,0},{62,906,266,71,0,0,0,0,0,0,0,0},{77,914,271,89,0,0,0,0,0},{1193,0,0,0,0,0,0,0}}, + {109, 49, 52, {3410, 3419, 3425, 3431, 3440, 3446, 3455}, {3462, 2863, 1712, 3467, 3472, 3477, 3482}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, 2, 1, 55, 3, {755,18,9,744,0,0,0,0,0,0,0,0,0,0},{1217,894,0,0,0,0,0,0,0,0},{71,266,1151,1243,1253,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {4584, 49, 52, {4442, 4451, 4459, 4468, 4479, 4488, 4497}, {4504, 4508, 4512, 4516, 4520, 4524, 4528}, {1828, 1616, 1608, 1608, 4532, 2894, 1285}, {4534, 4542, 2910, 4551, 4558, 4565, 4572, 2933, 4579, 4589, 712, 4597, 0}, {4534, 4542, 2910, 4551, 4558, 4565, 4572, 2933, 4579, 4589, 712, 4597, 0}, {4606, 4610, 4512, 4614, 4618, 4622, 4626, 4630, 4634, 4638, 4642, 4646, 0}, {4606, 4610, 4512, 4614, 4618, 4622, 4626, 4630, 4634, 4638, 4642, 4646, 0}, 2, 1, 11, 3, {681,2785,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{4592,0,0,0,0,0,0,0}}, + {109, 165, 170, {4932, 4939, 4947, 4955, 4964, 4974, 4982}, {4991, 3081, 4994, 4997, 5000, 5003, 5006}, {5009, 1608, 1828, 2735, 1828, 2894, 5009}, {5011, 5019, 5028, 1639, 5034, 1649, 1654, 5038, 1666, 1676, 1684, 1693, 0}, {5011, 5019, 5028, 1639, 5034, 1649, 1654, 5038, 1666, 1676, 1684, 1693, 0}, {1702, 1707, 5047, 1717, 5034, 1722, 868, 1727, 1732, 1737, 887, 1742, 0}, {1702, 1707, 5047, 1717, 5034, 1722, 868, 1727, 1732, 1737, 887, 1742, 0}, 2, 1, 1, 3, {2764,1054,755,775,2024,417,0,0,0,0,0,0,0,0},{1217,968,894,1304,0,0,0,0,0,0},{266,71,4602,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 1100, 1105, {1525, 7197, 34636, 1548, 1555, 1563, 34643}, {1578, 7225, 34651, 1591, 1595, 1599, 34655}, {1285, 1608, 1610, 1612, 1610, 1614, 1616}, {1618, 1625, 3504, 1639, 3515, 1649, 1654, 1659, 1666, 1676, 1684, 4420, 0}, {1618, 1625, 3504, 1639, 3515, 1649, 1654, 1659, 1666, 1676, 1684, 4420, 0}, {5089, 4610, 4512, 4614, 3515, 5093, 5097, 5101, 5105, 5109, 4642, 5113, 0}, {5089, 4610, 4512, 4614, 3515, 5093, 5097, 5101, 5105, 5109, 4642, 5113, 0}, 2, 1, 11, 3, {681,1455,0,0,0,0,0,0,0,0,0,0,0,0},{703,721,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1042, 165, 170, {2803, 5440, 5454, 5467, 5480, 5493, 2850}, {2803, 34659, 34667, 34674, 34681, 34688, 2850}, {1828, 1285, 1610, 5530, 5530, 1285, 1285}, {5532, 5540, 5550, 666, 5557, 5562, 5568, 2933, 5574, 5583, 5591, 5600, 0}, {5532, 5540, 5550, 666, 5557, 5562, 5568, 2933, 5574, 5583, 5591, 5600, 0}, {5089, 5609, 4512, 5613, 3515, 5093, 5097, 4630, 4634, 5617, 4642, 5621, 0}, {5089, 5609, 4512, 5613, 3515, 5093, 5097, 4630, 4634, 5617, 4642, 5621, 0}, 2, 1, 1, 3, {18,681,744,9,775,755,406,428,417,460,4612,1690,0,0},{1124,1069,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{1193,0,0,0,0,0,0,0}}, + {109, 165, 170, {5792, 5802, 5807, 5814, 5823, 5827, 5834}, {34694, 29280, 2791, 34698, 34702, 34706, 34710}, {1828, 1616, 34715, 1816, 2892, 2894, 1285}, {5866, 5875, 5885, 5892, 3515, 5900, 5906, 1659, 5912, 5923, 5933, 5943, 0}, {5866, 5875, 5885, 5892, 3515, 5900, 5906, 1659, 5912, 5923, 5933, 5943, 0}, {5953, 1707, 1712, 1717, 3515, 5958, 5963, 1727, 2986, 882, 887, 1742, 0}, {5953, 1707, 1712, 1717, 3515, 5958, 5963, 1727, 2986, 882, 887, 1742, 0}, 0, 1, 11, 3, {681,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {4584, 175, 180, {5968, 5991, 211, 6014, 6025, 6040, 6055}, {6070, 285, 290, 295, 300, 305, 310}, {6075, 6078, 6075, 6081, 6084, 6078, 6081}, {6087, 6100, 360, 6115, 380, 6128, 6137, 401, 6146, 6163, 6178, 6191, 0}, {6206, 6219, 6234, 6245, 6258, 6265, 6274, 6283, 6298, 6315, 6330, 6343, 0}, {6358, 6366, 360, 6376, 380, 6128, 6137, 6384, 6392, 6402, 6410, 6420, 0}, {6358, 6366, 360, 6376, 380, 6128, 6137, 6384, 6392, 6402, 6410, 6420, 0}, 0, 1, 11, 3, {681,4621,0,0,0,0,0,0,0,0,0,0,0,0},{4638,4662,0,0,0,0,0,0,0,0},{266,0,0,0,0,0,0,0,0,0,0,0},{271,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 208, 211, {7189, 7197, 7205, 1548, 1555, 1563, 7212}, {7220, 7225, 7230, 1591, 7234, 1599, 7239}, {1285, 1608, 1610, 1612, 1610, 1614, 1616}, {5011, 5019, 3504, 1639, 1645, 1649, 1654, 7244, 1666, 1676, 1684, 1693, 0}, {5011, 5019, 3504, 1639, 1645, 1649, 1654, 7244, 1666, 1676, 1684, 1693, 0}, {1702, 1707, 3504, 1717, 1645, 1649, 1654, 1727, 1732, 1737, 887, 1742, 0}, {1702, 1707, 3504, 1717, 1645, 1649, 1654, 1727, 1732, 1737, 887, 1742, 0}, 2, 1, 55, 3, {744,304,0,0,0,0,0,0,0,0,0,0,0,0},{1217,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 49, 52, {7465, 34718, 7489, 7498, 7505, 7518, 7527}, {7465, 34718, 7489, 7498, 7505, 7518, 7527}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {7536, 7547, 7558, 7567, 7578, 7585, 7592, 7605, 7614, 7625, 7638, 7649, 0}, {7536, 7547, 7558, 7567, 7578, 7585, 7592, 7605, 7614, 7625, 7638, 7649, 0}, {7536, 7547, 7558, 7567, 7578, 7585, 7592, 7605, 7614, 7625, 7638, 7649, 0}, {7536, 7547, 7558, 7567, 7578, 7585, 7592, 7605, 7614, 7625, 7638, 7649, 0}, 0, 0, 1, 3, {857,3021,0,0,0,0,0,0,0,0,0,0,0,0},{1010,1029,0,0,0,0,0,0,0,0},{906,266,0,0,0,0,0,0,0,0,0,0},{914,271,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 1110, 1115, {34725, 34736, 34760, 34790, 34807, 34829, 34838}, {34849, 34853, 34860, 34867, 34871, 34878, 34882}, {4756, 4744, 4746, 4748, 4750, 4752, 4754}, {34886, 9875, 9888, 9897, 9908, 34899, 34908, 9929, 34917, 34934, 34949, 9981, 0}, {34962, 34975, 360, 34988, 380, 34999, 35008, 401, 35017, 35034, 35049, 35062, 0}, {35075, 489, 35082, 496, 380, 35089, 35096, 503, 35103, 517, 35110, 531, 0}, {35075, 489, 35082, 496, 380, 35089, 35096, 503, 35103, 517, 35110, 531, 0}, 0, 1, 11, 3, {681,775,2098,9,417,0,0,0,0,0,0,0,0,0},{894,1261,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 327, 1120, {35117, 35126, 35138, 35147, 35154, 35163, 1247}, {12088, 12092, 35169, 12101, 35174, 35178, 12114}, {6516, 6518, 12118, 6522, 6522, 6518, 6522}, {1618, 1625, 12120, 12126, 1645, 8902, 8908, 12137, 1666, 1676, 12144, 1693, 0}, {12153, 12161, 12170, 12177, 5333, 12189, 12196, 12203, 6874, 12211, 12219, 6902, 0}, {5089, 4610, 12228, 4614, 1645, 5093, 5097, 12237, 5105, 5109, 12241, 6911, 0}, {5089, 4610, 12228, 4614, 1645, 5093, 5097, 12237, 5105, 5109, 12241, 6911, 0}, 2, 1, 124, 3, {692,4680,681,775,417,0,0,0,0,0,0,0,0,0},{798,721,692,0,0,0,0,0,0,0},{71,266,4689,4703,0,0,0,0,0,0,0,0},{89,4716,4733,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 0, 0, {12950, 12957, 12472, 12968, 12490, 12977, 12988}, {12688, 12998, 12524, 12528, 12532, 13002, 13006}, {0, 0, 0, 0, 0, 0, 0}, {13010, 13020, 13029, 13037, 13046, 13059, 13071, 13078, 13085, 13092, 13102, 13114, 0}, {13010, 13020, 13029, 13037, 13046, 13059, 13071, 13078, 13085, 13092, 13102, 13114, 0}, {13127, 12776, 13131, 13135, 12664, 13139, 13143, 12672, 13147, 13151, 13155, 13159, 0}, {13127, 12776, 13131, 13135, 12664, 13139, 13143, 12672, 13147, 13151, 13155, 13159, 0}, 0, 0, 55, 3, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2979,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {4749, 431, 436, {15236, 15248, 15259, 15273, 15285, 15295, 15305}, {15316, 15321, 15326, 15331, 15336, 15341, 15346}, {1285, 2894, 1608, 4532, 1828, 13432, 1616}, {15351, 15368, 15381, 15395, 15408, 15421, 15434, 15448, 15460, 15474, 15488, 15502, 0}, {15351, 15368, 15381, 15395, 15408, 15421, 15434, 15448, 15460, 15474, 15488, 15502, 0}, {15515, 15522, 15527, 15532, 15536, 15541, 15546, 15551, 15556, 15563, 15568, 15574, 0}, {15515, 15522, 15527, 15532, 15536, 15541, 15546, 15551, 15556, 15563, 15568, 15574, 0}, 2, 1, 55, 3, {417,1690,0,0,0,0,0,0,0,0,0,0,0,0},{4762,4786,0,0,0,0,0,0,0,0},{71,266,0,0,0,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 165, 170, {15579, 15593, 15603, 15614, 15628, 15639, 15650}, {15663, 15668, 15673, 15680, 15686, 15692, 15698}, {1828, 1616, 1608, 5210, 1828, 9428, 1285}, {15703, 15711, 15719, 15726, 15735, 15745, 15755, 15761, 15769, 15784, 15802, 15810, 0}, {15703, 15711, 15719, 15726, 15735, 15745, 15755, 15761, 15769, 15784, 15802, 15810, 0}, {15818, 15822, 15719, 15828, 15832, 15837, 15755, 15843, 15848, 15855, 15862, 15867, 0}, {15818, 15822, 15719, 15828, 15832, 15837, 15755, 15843, 15848, 15855, 15862, 15867, 0}, 2, 0, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{1217,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 441, 444, {15872, 15877, 7673, 7680, 15883, 15890, 7697}, {15897, 15901, 7711, 7715, 15905, 7723, 7727}, {9428, 11804, 1285, 7731, 3099, 2892, 1285}, {7733, 7741, 15909, 1851, 7756, 1931, 15913, 15919, 1878, 1888, 1896, 15924, 0}, {7733, 7741, 15909, 1851, 7756, 1931, 15913, 15919, 1878, 1888, 1896, 15924, 0}, {1914, 1918, 15909, 1927, 7756, 1931, 1935, 15933, 1943, 1947, 1951, 13346, 0}, {1914, 1918, 15909, 1927, 7756, 1931, 1935, 15933, 1943, 1947, 1951, 13346, 0}, 0, 1, 1, 3, {2764,304,0,0,0,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 1133, 1138, {35183, 35198, 35213, 35228, 35245, 16575, 35262}, {35273, 35280, 35287, 35294, 35301, 35308, 35315}, {35322, 16080, 6081, 6084, 6078, 16077, 16651}, {9864, 9875, 9888, 9897, 9908, 9915, 9922, 9929, 9942, 9957, 9970, 9981, 0}, {35325, 34975, 360, 34988, 380, 35336, 35343, 401, 35350, 35365, 35378, 35062, 0}, {9994, 10001, 10008, 10015, 9908, 9915, 9922, 10022, 10029, 10036, 10043, 10050, 0}, {9994, 10001, 10008, 10015, 9908, 9915, 9922, 10022, 10029, 10036, 10043, 10050, 0}, 0, 1, 1, 3, {406,2861,0,0,0,0,0,0,0,0,0,0,0,0},{3239,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {1, 49, 52, {17199, 17218, 17237, 17262, 17281, 17315, 17340}, {17359, 17369, 17379, 17395, 17405, 17430, 17446}, {17456, 17460, 17467, 17471, 17478, 17485, 17492}, {17496, 17524, 17558, 17574, 17593, 17600, 17610, 17626, 17642, 17673, 17695, 17717, 0}, {17496, 17524, 17558, 17574, 17593, 17600, 17610, 17626, 17642, 17673, 17695, 17717, 0}, {17496, 17524, 17558, 17574, 17593, 17600, 17610, 17626, 17642, 17673, 17695, 17717, 0}, {17496, 17524, 17558, 17574, 17593, 17600, 17610, 17626, 17642, 17673, 17695, 17717, 0}, 0, 5, 55, 11, {755,1062,2098,744,417,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{1151,1146,3258,3267,0,0,0,0,0,0,0,0},{1173,1165,3275,3287,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {1, 464, 479, {7465, 34718, 7489, 35389, 7505, 7518, 7527}, {17899, 17906, 17916, 17929, 17942, 17952, 17971}, {17993, 17997, 18004, 18011, 18021, 18028, 18041}, {7536, 7547, 7558, 7567, 35398, 7585, 7592, 7605, 7614, 7625, 7638, 7649, 0}, {7536, 7547, 7558, 7567, 35398, 7585, 7592, 7605, 7614, 7625, 7638, 7649, 0}, {18228, 18235, 18083, 18245, 18115, 18122, 18261, 18274, 18281, 18291, 18304, 18314, 0}, {18228, 18235, 18083, 18245, 18115, 18122, 18261, 18274, 18281, 18291, 18304, 18314, 0}, 0, 0, 55, 11, {755,1062,2098,744,417,0,0,0,0,0,0,0,0,0},{3298,894,0,0,0,0,0,0,0,0},{4804,62,266,71,0,0,0,0,0,0,0,0},{4812,77,271,89,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {109, 494, 519, {19431, 19450, 19472, 19497, 19513, 19535, 19554}, {19564, 19578, 19592, 19606, 19617, 19631, 19554}, {19645, 19652, 19659, 19666, 19673, 19680, 19687}, {19691, 19707, 19732, 19751, 19770, 19777, 19790, 19803, 19822, 19853, 19878, 19900, 0}, {19691, 19707, 19732, 19751, 19770, 19777, 19790, 19803, 19822, 19853, 19878, 19900, 0}, {19925, 19933, 19947, 19961, 19770, 19777, 19790, 19972, 19980, 19994, 20005, 20013, 0}, {19925, 19933, 19947, 19961, 19770, 19777, 19790, 19972, 19980, 19994, 20005, 20013, 0}, 0, 1, 55, 3, {2015,3021,0,0,0,0,0,0,0,0,0,0,0,0},{1010,1029,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 381, 409, {28601, 28620, 28639, 28664, 28683, 28705, 28730}, {28749, 14586, 28759, 14609, 28775, 14632, 14648}, {28788, 14662, 28792, 14676, 28796, 14690, 14697}, {14701, 28803, 14736, 28831, 22641, 28850, 14788, 28860, 28876, 28907, 28929, 28954, 0}, {14701, 28803, 14736, 28831, 14771, 28850, 14788, 28860, 28876, 28907, 28929, 28954, 0}, {14701, 28803, 14736, 28831, 22641, 28850, 14788, 28860, 28876, 28907, 28929, 28954, 0}, {14701, 28803, 14736, 28831, 22641, 28850, 14788, 28860, 28876, 28907, 28929, 28954, 0}, 0, 0, 55, 3, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{2979,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {1, 991, 1011, {31149, 31162, 31172, 28077, 31182, 31192, 31202}, {31212, 31219, 31226, 31233, 31240, 31247, 31254}, {28131, 28131, 28131, 28139, 31265, 28147, 31269}, {31273, 31280, 31293, 31306, 31319, 31332, 31339, 31349, 31359, 31375, 31388, 31398, 0}, {31273, 31280, 31293, 31306, 31319, 31332, 31339, 31349, 31359, 31375, 31388, 31398, 0}, {31273, 31411, 31418, 31425, 31432, 31332, 31439, 31446, 31453, 31460, 31467, 31474, 0}, {31273, 31411, 31418, 31425, 31432, 31332, 31439, 31446, 31453, 31460, 31467, 31474, 0}, 0, 0, 1, 3, {18,2796,0,0,0,0,0,0,0,0,0,0,0,0},{3945,1261,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 1094, 1097, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34445, 34448, 34451, 34454, 34457, 10164, 10155}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, 0, 6, 1, 3, {18,9,417,0,0,0,0,0,0,0,0,0,0,0},{2448,42,0,0,0,0,0,0,0,0},{62,71,0,0,0,0,0,0,0,0,0,0},{77,89,0,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {370, 25, 32, {897, 907, 917, 927, 937, 947, 957}, {34299, 34306, 34313, 34320, 34327, 34334, 34341}, {1016, 1020, 1024, 1028, 1032, 1036, 1040}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, 0, 0, 1, 3, {295,857,9,439,460,379,406,417,0,0,0,0,0,0},{469,1484,547,562,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{623,639,652,666,0,0,0,0}}, + {4575, 57, 63, {1747, 1755, 1762, 1771, 1780, 1791, 1799}, {1807, 1810, 1813, 1816, 1819, 1822, 1825}, {1285, 1608, 1828, 1608, 1828, 1614, 1285}, {35532, 1837, 1845, 1851, 1857, 1861, 1866, 1871, 1878, 1888, 1896, 1905, 0}, {35532, 1837, 1845, 1851, 1857, 1861, 1866, 1871, 1878, 1888, 1896, 1905, 0}, {35540, 1918, 1922, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, {35540, 1918, 1922, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, 2, 1, 11, 3, {681,0,0,0,0,0,0,0,0,0,0,0,0,0},{798,721,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 49, 52, {2650, 2657, 2664, 2672, 2682, 2691, 2698}, {35545, 35550, 35555, 35560, 35565, 35570, 35575}, {32793, 35580, 35583, 35587, 35590, 35594, 13568}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {13618, 13623, 26658, 13633, 2760, 13638, 13643, 13648, 13653, 35597, 13663, 26841, 0}, {13618, 13623, 26658, 13633, 2760, 13638, 13643, 13648, 13653, 35597, 13663, 26841, 0}, 0, 0, 1, 3, {2764,1054,857,295,9,18,968,1274,417,460,406,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,266,71,0,0,0,0,0,0,0,0,0},{914,271,89,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1042, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 2890, 2892, 2894, 1285}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 2986, 882, 887, 2992, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 2986, 882, 887, 2992, 0}, 2, 1, 1, 3, {18,9,1054,857,1062,755,775,417,0,0,0,0,0,0},{1069,1097,1124,0,0,0,0,0,0,0},{266,71,1146,1151,1157,0,0,0,0,0,0,0},{271,89,1165,1173,1182,0,0,0,0},{1193,0,0,0,0,0,0,0}}, + {109, 165, 170, {3410, 3419, 3425, 3431, 3440, 3446, 3455}, {3462, 2863, 1712, 3467, 3472, 3477, 3482}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 35602, 3532, 2986, 882, 887, 3590, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 35602, 3532, 2986, 882, 887, 3590, 0}, 0, 0, 55, 3, {417,1690,755,4823,9,864,0,0,0,0,0,0,0,0},{894,304,0,0,0,0,0,0,0,0},{71,266,1151,1243,1253,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {4749, 431, 436, {15236, 35609, 35621, 35636, 35647, 35658, 35669}, {15316, 15321, 15326, 15331, 15336, 15341, 15346}, {1285, 1608, 1828, 4532, 1828, 13432, 1616}, {15351, 15368, 15381, 15395, 15408, 15421, 15434, 15448, 15460, 15474, 15488, 15502, 0}, {15351, 15368, 15381, 15395, 15408, 15421, 15434, 15448, 15460, 15474, 15488, 15502, 0}, {15515, 15522, 15527, 15532, 15536, 15541, 15546, 15551, 15556, 15563, 15568, 15574, 0}, {15515, 15522, 15527, 15532, 15536, 15541, 15546, 15551, 15556, 15563, 15568, 15574, 0}, 2, 1, 11, 3, {1208,681,2098,417,0,0,0,0,0,0,0,0,0,0},{4832,4786,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 1094, 1097, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34445, 34448, 34451, 34454, 34457, 10164, 10155}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, 0, 6, 1, 3, {18,9,417,0,0,0,0,0,0,0,0,0,0,0},{2448,42,0,0,0,0,0,0,0,0},{62,71,0,0,0,0,0,0,0,0,0,0},{77,89,0,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {370, 25, 32, {897, 907, 917, 927, 937, 947, 957}, {967, 974, 981, 988, 995, 1002, 1009}, {1016, 1020, 1024, 1028, 1032, 1036, 1040}, {1044, 1051, 1058, 1065, 1072, 1079, 1086, 1093, 1100, 1107, 1114, 1124, 0}, {1044, 1051, 1058, 1065, 1072, 1079, 1086, 1093, 1100, 1107, 1114, 1124, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, 0, 0, 1, 3, {295,857,9,439,460,379,406,417,0,0,0,0,0,0},{469,1484,547,4518,0,0,0,0,0,0},{583,591,266,71,0,0,0,0,0,0,0,0},{600,611,271,89,0,0,0,0,0},{623,639,652,0,0,0,0,0}}, + {4575, 57, 63, {1747, 1755, 1762, 1771, 1780, 1791, 1799}, {1807, 1810, 1813, 1816, 1819, 1822, 1825}, {1285, 1608, 1828, 1608, 1828, 1614, 1285}, {1830, 1837, 1845, 1851, 1857, 1861, 1866, 1871, 1878, 1888, 1896, 1905, 0}, {1830, 1837, 1845, 1851, 1857, 1861, 1866, 1871, 1878, 1888, 1896, 1905, 0}, {1914, 1918, 1922, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, {1914, 1918, 1922, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, 2, 1, 11, 3, {681,0,0,0,0,0,0,0,0,0,0,0,0,0},{798,721,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 49, 52, {2650, 2657, 2664, 2672, 2682, 2691, 2698}, {2707, 2711, 2715, 2719, 2723, 2727, 2731}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, 0, 0, 55, 3, {417,18,9,857,1690,4858,968,2796,417,0,0,0,0,0},{997,3763,4866,1475,0,0,0,0,0,0},{906,62,71,266,0,0,0,0,0,0,0,0},{914,77,89,271,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {4877, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, 0, 0, 1, 3, {2764,0,0,0,0,0,0,0,0,0,0,0,0,0},{4885,4913,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{355,0,0,0,0,0,0,0}}, + {4584, 49, 52, {3410, 3419, 3425, 3431, 3440, 3446, 3455}, {3462, 2863, 1712, 3467, 3472, 3477, 3482}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, 2, 1, 11, 3, {681,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{4592,0,0,0,0,0,0,0}}, + {673, 49, 52, {6428, 6437, 6449, 6456, 6464, 6474, 6480}, {6487, 6491, 6495, 6499, 6503, 6508, 6512}, {1278, 1280, 35681, 1285, 1287, 1280, 1285}, {6527, 6537, 6546, 6554, 6562, 6570, 6577, 6584, 6592, 1364, 6598, 6606, 0}, {6615, 6625, 6634, 6642, 6650, 6658, 6665, 6672, 6681, 5385, 6687, 6697, 0}, {6706, 6710, 6715, 6720, 6724, 5419, 1501, 6728, 6732, 1517, 6736, 1521, 0}, {6706, 6710, 6715, 6720, 6724, 5419, 1501, 6728, 6732, 1517, 6736, 1521, 0}, 0, 1, 11, 3, {2181,4935,0,0,0,0,0,0,0,0,0,0,0,0},{2254,2225,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{4948,0,0,0,0,0,0,0}}, + {1, 1094, 1097, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34445, 34448, 34451, 34454, 34457, 10164, 10155}, {35683, 35694, 10194, 35705, 32620, 35716, 35725, 35738, 35480, 35493, 35506, 35519, 0}, {35683, 35694, 10194, 35705, 32620, 35716, 35725, 35738, 35480, 35493, 35506, 35519, 0}, {35683, 35694, 10194, 35705, 32620, 35716, 35725, 35738, 35480, 35493, 35506, 35519, 0}, {35683, 35694, 10194, 35705, 32620, 35716, 35725, 35738, 35480, 35493, 35506, 35519, 0}, 0, 6, 55, 3, {744,755,417,0,0,0,0,0,0,0,0,0,0,0},{2448,42,0,0,0,0,0,0,0,0},{266,71,62,0,0,0,0,0,0,0,0,0},{271,89,77,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {370, 25, 32, {897, 907, 917, 927, 937, 947, 957}, {34299, 34306, 34313, 34320, 34327, 34334, 34341}, {1016, 1020, 1024, 1028, 1032, 1036, 1040}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, 0, 0, 1, 3, {295,857,9,439,460,379,406,417,0,0,0,0,0,0},{469,4959,4986,764,547,4518,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{623,639,652,666,0,0,0,0}}, + {4575, 57, 63, {1747, 1755, 1762, 1771, 1780, 1791, 1799}, {1807, 1810, 1813, 1816, 1819, 1822, 1825}, {1285, 1608, 1828, 1608, 1828, 1614, 1285}, {1830, 1837, 1845, 1851, 1857, 1861, 1866, 1871, 1878, 1888, 1896, 1905, 0}, {1830, 1837, 1845, 1851, 1857, 1861, 1866, 1871, 1878, 1888, 1896, 1905, 0}, {1914, 1918, 1922, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, {1914, 1918, 1922, 1927, 1857, 1931, 1935, 1939, 1943, 1947, 1951, 1955, 0}, 2, 1, 11, 3, {681,0,0,0,0,0,0,0,0,0,0,0,0,0},{798,721,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {5002, 165, 170, {2650, 2657, 2664, 2672, 2682, 2691, 2698}, {2707, 2711, 2715, 2719, 2723, 2727, 2731}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, 0, 0, 1, 3, {2764,0,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{5009,0,0,0,0,0,0,0}}, + {4877, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, 0, 1, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{4885,4913,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{355,0,0,0,0,0,0,0}}, + {109, 49, 52, {3410, 3419, 3425, 3431, 3440, 3446, 3455}, {3462, 2863, 1712, 3467, 3472, 3477, 3482}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, 2, 1, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{1217,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 1143, 1154, {6428, 6437, 6449, 6456, 6464, 6474, 6480}, {6487, 6491, 6495, 6499, 6503, 6508, 6512}, {6516, 6518, 6520, 6522, 6524, 6518, 6522}, {1618, 1625, 11617, 1639, 1645, 1649, 1654, 8914, 35745, 35755, 35763, 35772, 0}, {1618, 1625, 11617, 1639, 1645, 1649, 1654, 8914, 35745, 35755, 35763, 35772, 0}, {5089, 4610, 4512, 4614, 1645, 5093, 5097, 35781, 5105, 5109, 4642, 6911, 0}, {5089, 4610, 4512, 4614, 1645, 5093, 5097, 35781, 5105, 5109, 4642, 6911, 0}, 0, 1, 11, 3, {2181,5019,0,0,0,0,0,0,0,0,0,0,0,0},{5034,2239,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{4948,0,0,0,0,0,0,0}}, + {1, 1094, 1097, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34445, 34448, 34451, 34454, 34457, 10164, 10155}, {35403, 35414, 10194, 35427, 32620, 35447, 35785, 35798, 35805, 35493, 35816, 35827, 0}, {35403, 35414, 10194, 35427, 32620, 35447, 35785, 35798, 35805, 35493, 35816, 35827, 0}, {35403, 35414, 10194, 35427, 32620, 35447, 35785, 35798, 35805, 35493, 35816, 35827, 0}, {35403, 35414, 10194, 35427, 32620, 35447, 35785, 35798, 35805, 35493, 35816, 35827, 0}, 0, 6, 55, 3, {744,755,417,0,0,0,0,0,0,0,0,0,0,0},{2448,42,0,0,0,0,0,0,0,0},{266,71,62,0,0,0,0,0,0,0,0,0},{271,89,77,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {5002, 165, 170, {2650, 2657, 2664, 2672, 2682, 2691, 2698}, {2707, 2711, 2715, 2719, 2723, 2727, 2731}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, 2, 0, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{1217,894,0,0,0,0,0,0,0,0},{71,906,0,0,0,0,0,0,0,0,0,0},{89,914,0,0,0,0,0,0,0},{5009,0,0,0,0,0,0,0}}, + {5055, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, 0, 0, 1, 3, {957,0,0,0,0,0,0,0,0,0,0,0,0,0},{4885,4913,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{5009,0,0,0,0,0,0,0}}, + {109, 49, 52, {3410, 3419, 3425, 3431, 3440, 3446, 3455}, {3462, 2863, 1712, 3467, 3472, 3477, 3482}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, 2, 1, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{1217,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 1162, 1174, {6428, 35838, 6449, 6456, 6464, 6474, 6480}, {8879, 5179, 35849, 35853, 8889, 8895, 35857}, {6516, 6518, 6520, 6522, 6524, 6518, 6522}, {1618, 1625, 11617, 1639, 1645, 5093, 5097, 8914, 35745, 35755, 35763, 35772, 0}, {1618, 1625, 11617, 1639, 1645, 5093, 5097, 8914, 35745, 35755, 35763, 35772, 0}, {1702, 1707, 11617, 1717, 1645, 5093, 5097, 8921, 2986, 1737, 887, 1742, 0}, {1702, 1707, 11617, 1717, 1645, 5093, 5097, 8921, 2986, 1737, 887, 1742, 0}, 0, 1, 11, 3, {2151,2181,0,0,0,0,0,0,0,0,0,0,0,0},{5034,2239,0,0,0,0,0,0,0,0},{71,1151,0,0,0,0,0,0,0,0,0,0},{89,1173,0,0,0,0,0,0,0},{4948,0,0,0,0,0,0,0}}, + {1, 1094, 1097, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34445, 34448, 34451, 34454, 34457, 10164, 10155}, {35683, 35694, 10194, 35705, 32620, 35716, 35725, 35738, 35480, 35493, 35506, 35519, 0}, {35683, 35694, 10194, 35705, 32620, 35716, 35725, 35738, 35480, 35493, 35506, 35519, 0}, {35683, 35694, 10194, 35705, 32620, 35716, 35725, 35738, 35480, 35493, 35506, 35519, 0}, {35683, 35694, 10194, 35705, 32620, 35716, 35725, 35738, 35480, 35493, 35506, 35519, 0}, 0, 0, 55, 3, {744,755,417,0,0,0,0,0,0,0,0,0,0,0},{2448,42,0,0,0,0,0,0,0,0},{266,71,62,0,0,0,0,0,0,0,0,0},{271,89,77,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {1, 49, 52, {2650, 2657, 2664, 2672, 2682, 2691, 2698}, {2707, 2711, 2715, 2719, 2723, 2727, 2731}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, 0, 0, 1, 3, {406,2351,0,0,0,0,0,0,0,0,0,0,0,0},{2462,1261,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{5009,0,0,0,0,0,0,0}}, + {4877, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, 0, 0, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{4885,4913,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{355,0,0,0,0,0,0,0}}, + {673, 1183, 1205, {35862, 35877, 35896, 35909, 35924, 35941, 7877}, {12299, 12307, 35952, 35958, 12331, 12339, 35964}, {315, 318, 35972, 324, 327, 318, 324}, {35975, 35988, 360, 369, 12370, 36003, 36010, 401, 36017, 36036, 36051, 36068, 0}, {35975, 35988, 360, 369, 12370, 36003, 36010, 401, 36017, 36036, 36051, 36068, 0}, {12395, 36085, 360, 6376, 12370, 36003, 36010, 6384, 12435, 6402, 36093, 36101, 0}, {12395, 36085, 360, 6376, 12370, 36003, 36010, 6384, 12435, 6402, 36093, 36101, 0}, 0, 1, 11, 3, {2151,2181,0,0,0,0,0,0,0,0,0,0,0,0},{721,2561,798,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {1, 1094, 1097, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34445, 34448, 34451, 34454, 34457, 10164, 10155}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, 0, 6, 1, 3, {18,9,417,0,0,0,0,0,0,0,0,0,0,0},{2448,42,0,0,0,0,0,0,0,0},{62,71,266,0,0,0,0,0,0,0,0,0},{77,89,271,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {5002, 49, 52, {2650, 2657, 2664, 2672, 2682, 2691, 2698}, {2707, 2711, 2715, 2719, 2723, 2727, 2731}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, 0, 0, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{5009,0,0,0,0,0,0,0}}, + {4877, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 2986, 882, 887, 2992, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 2986, 882, 887, 2992, 0}, 0, 0, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{4885,4913,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{355,0,0,0,0,0,0,0}}, + {109, 49, 52, {3410, 3419, 3425, 3431, 3440, 3446, 3455}, {3462, 2863, 1712, 3467, 3472, 3477, 3482}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, 2, 1, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{1217,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {3316, 1221, 1239, {36109, 35877, 35896, 35909, 35924, 35941, 7877}, {36122, 36129, 36136, 36143, 36150, 36157, 36164}, {315, 318, 35972, 324, 327, 318, 324}, {35975, 35988, 360, 369, 12370, 12377, 12386, 401, 36017, 36036, 36051, 36068, 0}, {35975, 35988, 360, 369, 12370, 12377, 12386, 401, 36017, 36036, 36051, 36068, 0}, {35075, 36171, 35082, 496, 12370, 36003, 36010, 503, 510, 517, 36178, 36185, 0}, {35075, 36171, 35082, 496, 12370, 36003, 36010, 503, 510, 517, 36178, 36185, 0}, 0, 1, 11, 3, {1208,2098,692,681,4680,775,5063,417,0,0,0,0,0,0},{721,2561,798,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {1, 1094, 1097, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34445, 34448, 34451, 34454, 34457, 10164, 10155}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, 0, 0, 1, 3, {18,9,417,0,0,0,0,0,0,0,0,0,0,0},{2448,42,0,0,0,0,0,0,0,0},{62,71,266,0,0,0,0,0,0,0,0,0},{77,89,271,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {4877, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {29480, 36192, 29484, 29484, 36194, 36196, 6522}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 2986, 882, 887, 2992, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 2986, 882, 887, 2992, 0}, 0, 0, 1, 3, {2764,0,0,0,0,0,0,0,0,0,0,0,0,0},{4885,4913,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{355,0,0,0,0,0,0,0}}, + {109, 49, 52, {3410, 3419, 3425, 3431, 3440, 3446, 3455}, {3462, 2863, 1712, 3467, 3472, 3477, 3482}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, 0, 0, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{1217,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 1254, 1174, {8833, 35838, 6449, 8858, 6464, 6474, 6480}, {6487, 6491, 6495, 36198, 6503, 6508, 6512}, {6516, 6518, 6520, 6522, 6524, 6518, 6522}, {1618, 1625, 11617, 1639, 1645, 5093, 5097, 8914, 35745, 35755, 35763, 35772, 0}, {1618, 1625, 11617, 1639, 1645, 5093, 5097, 8914, 35745, 35755, 35763, 35772, 0}, {5089, 4610, 4512, 4614, 1645, 5093, 5097, 35781, 5105, 5109, 4642, 6911, 0}, {5089, 4610, 4512, 4614, 1645, 5093, 5097, 35781, 5105, 5109, 4642, 6911, 0}, 0, 1, 11, 11, {2151,2181,0,0,0,0,0,0,0,0,0,0,0,0},{5034,2239,0,0,0,0,0,0,0,0},{1151,0,0,0,0,0,0,0,0,0,0,0},{1173,0,0,0,0,0,0,0,0},{4948,0,0,0,0,0,0,0}}, + {5074, 88, 1264, {36202, 36213, 36225, 36237, 36245, 36256, 36270}, {36280, 36284, 1645, 36288, 36292, 36296, 15346}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {36301, 36319, 36333, 36349, 36365, 36378, 36390, 36404, 36417, 36433, 36449, 36464, 0}, {36301, 36319, 36333, 36349, 36365, 36378, 36390, 36404, 36417, 36433, 36449, 36464, 0}, {36479, 36485, 36492, 36501, 36510, 36516, 36521, 36528, 36534, 36543, 36552, 36560, 0}, {36479, 36485, 36492, 36501, 36510, 36516, 36521, 36528, 36534, 36543, 36552, 36560, 0}, 2, 1, 11, 3, {1208,681,2098,417,0,0,0,0,0,0,0,0,0,0},{5088,0,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 1094, 1097, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34445, 34448, 34451, 34454, 34457, 10164, 10155}, {34460, 34484, 34493, 34502, 34513, 34522, 34535, 34544, 34549, 34560, 34582, 34606, 0}, {34460, 34484, 34493, 34502, 34513, 34522, 34535, 34544, 34549, 34560, 34582, 34606, 0}, {34460, 34484, 34493, 34502, 34513, 34522, 34535, 34544, 34549, 34560, 34582, 34606, 0}, {34460, 34484, 34493, 34502, 34513, 34522, 34535, 34544, 34549, 34560, 34582, 34606, 0}, 0, 6, 1, 3, {18,9,417,0,0,0,0,0,0,0,0,0,0,0},{2448,42,0,0,0,0,0,0,0,0},{62,71,266,0,0,0,0,0,0,0,0,0},{77,89,271,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {1, 49, 52, {2650, 2657, 2664, 2672, 2682, 2691, 2698}, {2707, 2711, 2715, 2719, 2723, 2727, 2731}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, 0, 0, 1, 3, {18,2796,0,0,0,0,0,0,0,0,0,0,0,0},{2462,1261,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{5009,0,0,0,0,0,0,0}}, + {4877, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {29296, 36568, 26702, 26708, 29316, 36576, 36582, 26731, 36588, 36598, 36606, 36616, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 36626, 704, 2951, 2961, 0}, {36636, 13623, 26658, 26816, 36641, 13638, 13643, 26826, 26831, 35597, 13663, 36646, 0}, {36636, 13623, 26658, 26816, 36641, 13638, 13643, 26826, 26831, 35597, 13663, 36646, 0}, 0, 0, 1, 3, {2764,304,0,0,0,0,0,0,0,0,0,0,0,0},{4885,4913,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{355,0,0,0,0,0,0,0}}, + {109, 49, 52, {3410, 3419, 3425, 3431, 3440, 3446, 3455}, {3462, 2863, 1712, 3467, 3472, 3477, 3482}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, 0, 0, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{1217,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 1221, 1205, {36109, 35877, 35896, 6014, 35924, 35941, 7877}, {36122, 36129, 36136, 36651, 36150, 36157, 36164}, {315, 318, 35972, 324, 327, 318, 324}, {35975, 35988, 360, 369, 12370, 36003, 36010, 401, 36017, 36036, 36051, 36068, 0}, {35975, 35988, 360, 369, 12370, 36003, 36010, 401, 36017, 36036, 36051, 36068, 0}, {35075, 36171, 35082, 496, 12370, 36003, 36010, 503, 510, 517, 36178, 36185, 0}, {35075, 36171, 35082, 496, 12370, 36003, 36010, 503, 510, 517, 36178, 36185, 0}, 0, 1, 11, 3, {2181,0,0,0,0,0,0,0,0,0,0,0,0,0},{2225,2239,2254,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{4948,0,0,0,0,0,0,0}}, + {1, 1094, 1097, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34445, 34448, 34451, 34454, 34457, 10164, 10155}, {34460, 34484, 34493, 34502, 34513, 34522, 34535, 34544, 34549, 34560, 34582, 34606, 0}, {34460, 34484, 34493, 34502, 34513, 34522, 34535, 34544, 34549, 34560, 34582, 34606, 0}, {34460, 34484, 34493, 34502, 34513, 34522, 34535, 34544, 34549, 34560, 34582, 34606, 0}, {34460, 34484, 34493, 34502, 34513, 34522, 34535, 34544, 34549, 34560, 34582, 34606, 0}, 0, 6, 1, 3, {18,9,417,0,0,0,0,0,0,0,0,0,0,0},{2448,42,0,0,0,0,0,0,0,0},{62,71,266,0,0,0,0,0,0,0,0,0},{77,89,271,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {109, 49, 52, {2650, 2657, 2664, 2672, 2682, 2691, 2698}, {2707, 2711, 2715, 2719, 2723, 2727, 2731}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, 0, 0, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{5009,0,0,0,0,0,0,0}}, + {4877, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, 0, 0, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{4885,4913,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{5106,0,0,0,0,0,0,0}}, + {109, 1268, 1273, {3410, 3419, 3425, 3431, 3440, 3446, 3455}, {3462, 2863, 1712, 3467, 3472, 3477, 3482}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, 0, 1, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{1217,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 1162, 1174, {6428, 35838, 6449, 6456, 6464, 6474, 6480}, {8879, 5179, 35849, 35853, 8889, 8895, 35857}, {6516, 6518, 6520, 6522, 6524, 6518, 6522}, {1618, 1625, 11617, 1639, 1645, 5093, 5097, 8914, 35745, 35755, 35763, 35772, 0}, {1618, 1625, 11617, 1639, 1645, 5093, 5097, 8914, 35745, 35755, 35763, 35772, 0}, {1702, 1707, 11617, 1717, 1645, 5093, 5097, 8921, 2986, 1737, 887, 1742, 0}, {1702, 1707, 11617, 1717, 1645, 5093, 5097, 8921, 2986, 1737, 887, 1742, 0}, 0, 1, 11, 11, {2151,2181,0,0,0,0,0,0,0,0,0,0,0,0},{5034,2239,0,0,0,0,0,0,0,0},{1151,0,0,0,0,0,0,0,0,0,0,0},{1173,0,0,0,0,0,0,0,0},{4948,0,0,0,0,0,0,0}}, + {1, 1094, 1097, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34445, 34448, 34451, 34454, 34457, 10164, 10155}, {34460, 34484, 34493, 34502, 34513, 34522, 34535, 34544, 34549, 34560, 34582, 34606, 0}, {34460, 34484, 34493, 34502, 34513, 34522, 34535, 34544, 34549, 34560, 34582, 34606, 0}, {34460, 34484, 34493, 34502, 34513, 34522, 34535, 34544, 34549, 34560, 34582, 34606, 0}, {34460, 34484, 34493, 34502, 34513, 34522, 34535, 34544, 34549, 34560, 34582, 34606, 0}, 0, 1, 1, 3, {18,9,417,0,0,0,0,0,0,0,0,0,0,0},{2448,42,0,0,0,0,0,0,0,0},{62,71,266,0,0,0,0,0,0,0,0,0},{77,89,271,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {1, 49, 52, {2650, 2657, 2664, 2672, 2682, 2691, 2698}, {2707, 2711, 2715, 2719, 2723, 2727, 2731}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, 0, 0, 1, 3, {295,5116,0,0,0,0,0,0,0,0,0,0,0,0},{2462,1261,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{5009,0,0,0,0,0,0,0}}, + {4877, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, 0, 1, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{4885,4913,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{355,0,0,0,0,0,0,0}}, + {109, 49, 52, {3410, 3419, 3425, 3431, 3440, 3446, 3455}, {3462, 2863, 1712, 3467, 3472, 3477, 3482}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, 0, 0, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{1217,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 1183, 1205, {35862, 35877, 35896, 35909, 35924, 35941, 7877}, {12299, 12307, 35952, 35958, 12331, 12339, 35964}, {315, 318, 35972, 324, 327, 318, 324}, {35975, 35988, 360, 369, 12370, 36003, 36010, 401, 36017, 36036, 36051, 36068, 0}, {35975, 35988, 360, 369, 12370, 36003, 36010, 401, 36017, 36036, 36051, 36068, 0}, {12395, 36085, 360, 6376, 12370, 36003, 36010, 6384, 12435, 6402, 36093, 36101, 0}, {12395, 36085, 360, 6376, 12370, 36003, 36010, 6384, 12435, 6402, 36093, 36101, 0}, 0, 1, 11, 3, {2151,2161,2169,2181,2193,2203,2213,5128,0,0,0,0,0,0},{2225,2239,2254,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{4948,0,0,0,0,0,0,0}}, + {1, 1094, 1097, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34445, 34448, 34451, 34454, 34457, 10164, 10155}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, 0, 6, 1, 3, {18,9,417,0,0,0,0,0,0,0,0,0,0,0},{2448,42,0,0,0,0,0,0,0,0},{62,71,266,0,0,0,0,0,0,0,0,0},{77,89,271,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {109, 49, 52, {2650, 2657, 2664, 2672, 2682, 2691, 2698}, {2707, 2711, 2715, 2719, 2723, 2727, 2731}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, 0, 0, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{5009,0,0,0,0,0,0,0}}, + {4877, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 2986, 882, 887, 2992, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 2986, 882, 887, 2992, 0}, 0, 1, 55, 3, {744,0,0,0,0,0,0,0,0,0,0,0,0,0},{4885,4913,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{5106,0,0,0,0,0,0,0}}, + {109, 49, 52, {3410, 3419, 3425, 3431, 3440, 3446, 3455}, {3462, 2863, 1712, 3467, 3472, 3477, 3482}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, 0, 0, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{1217,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 1094, 1097, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34445, 34448, 34451, 34454, 34457, 10164, 10155}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, 0, 6, 1, 3, {18,9,417,0,0,0,0,0,0,0,0,0,0,0},{2448,42,0,0,0,0,0,0,0,0},{62,71,266,0,0,0,0,0,0,0,0,0},{77,89,271,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {4877, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {29296, 36568, 26702, 26708, 29316, 36576, 36582, 26731, 36588, 36598, 36606, 36616, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 36626, 704, 2951, 2961, 0}, {36636, 13623, 26658, 26816, 36641, 13638, 13643, 26826, 26831, 35597, 13663, 36646, 0}, {36636, 13623, 26658, 26816, 36641, 13638, 13643, 26826, 26831, 35597, 13663, 36646, 0}, 0, 1, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{4885,4913,0,0,0,0,0,0,0,0},{266,71,62,906,0,0,0,0,0,0,0,0},{271,89,77,914,0,0,0,0,0},{355,0,0,0,0,0,0,0}}, + {109, 165, 170, {3410, 3419, 3425, 3431, 3440, 3446, 3455}, {3462, 2863, 1712, 3467, 3472, 3477, 3482}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {1702, 36658, 1712, 3579, 3515, 36664, 3584, 3532, 2986, 882, 887, 3590, 0}, {1702, 36658, 1712, 3579, 3515, 36664, 3584, 3532, 2986, 882, 887, 3590, 0}, 0, 6, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{1217,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 1094, 1097, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34445, 34448, 34451, 34454, 34457, 10164, 10155}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, 0, 6, 1, 3, {18,9,417,0,0,0,0,0,0,0,0,0,0,0},{2448,42,0,0,0,0,0,0,0,0},{62,71,266,0,0,0,0,0,0,0,0,0},{77,89,271,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {5002, 49, 52, {2650, 2657, 2664, 2672, 2682, 2691, 2698}, {2707, 2711, 2715, 2719, 2723, 2727, 2731}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, 0, 0, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{5009,0,0,0,0,0,0,0}}, + {4877, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 2986, 882, 887, 2992, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 2986, 882, 887, 2992, 0}, 0, 0, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{4885,4913,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{355,0,0,0,0,0,0,0}}, + {109, 49, 52, {3410, 3419, 3425, 3431, 3440, 3446, 3455}, {3462, 2863, 1712, 3467, 3472, 3477, 3482}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3487, 3495, 3504, 3509, 3515, 3519, 3524, 3532, 3538, 3548, 712, 3556, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, {3566, 3572, 3504, 3579, 3515, 3519, 3584, 3532, 2986, 882, 887, 3590, 0}, 0, 0, 1, 3, {18,304,0,0,0,0,0,0,0,0,0,0,0,0},{1217,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {1, 1094, 1097, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34348, 34359, 34374, 34391, 34408, 34421, 34434}, {34445, 34448, 34451, 34454, 34457, 10164, 10155}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, {35403, 35414, 10194, 35427, 35438, 35447, 35458, 35469, 35480, 35493, 35506, 35519, 0}, 0, 6, 1, 3, {18,9,417,0,0,0,0,0,0,0,0,0,0,0},{2448,42,0,0,0,0,0,0,0,0},{62,71,266,0,0,0,0,0,0,0,0,0},{77,89,271,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {109, 49, 52, {2650, 2657, 2664, 2672, 2682, 2691, 2698}, {2707, 2711, 2715, 2719, 2723, 2727, 2731}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, 0, 0, 55, 3, {744,755,1062,2098,417,0,0,0,0,0,0,0,0,0},{1261,894,0,0,0,0,0,0,0,0},{71,266,62,0,0,0,0,0,0,0,0,0},{89,271,4812,77,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {4877, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, 0, 0, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{4885,4913,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{355,0,0,0,0,0,0,0}}, + {109, 49, 52, {2650, 2657, 2664, 2672, 2682, 2691, 2698}, {2707, 2711, 2715, 2719, 2723, 2727, 2731}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, 0, 1, 1, 3, {295,857,18,9,417,0,0,0,0,0,0,0,0,0},{1010,1029,0,0,0,0,0,0,0,0},{906,62,266,71,0,0,0,0,0,0,0,0},{914,77,271,89,0,0,0,0,0},{98,734,0,0,0,0,0,0}}, + {4877, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, 0, 0, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{4885,4913,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{355,0,0,0,0,0,0,0}}, + {109, 49, 52, {2650, 2657, 2664, 2672, 2682, 2691, 2698}, {2707, 2711, 2715, 2719, 2723, 2727, 2731}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {2737, 2745, 2754, 1851, 2760, 2764, 2769, 1871, 1878, 2774, 1896, 2782, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, {1914, 1918, 2791, 1927, 2760, 1931, 1935, 1939, 1943, 2795, 1951, 2799, 0}, 0, 0, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{876,894,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{5009,0,0,0,0,0,0,0}}, + {4877, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, 0, 0, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{5140,5168,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{355,0,0,0,0,0,0,0}}, + {4877, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, 0, 0, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{4885,4913,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{355,0,0,0,0,0,0,0}}, + {5055, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, 0, 0, 1, 3, {957,0,0,0,0,0,0,0,0,0,0,0,0,0},{4885,4913,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{5009,0,0,0,0,0,0,0}}, + {925, 13, 19, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, 0, 0, 1, 3, {932,941,948,957,460,417,968,0,0,0,0,0,0,0},{3763,3783,42,2448,0,0,0,0,0,0},{906,62,266,71,0,0,0,0,0,0,0,0},{914,77,271,89,0,0,0,0,0},{1193,0,0,0,0,0,0,0}}, + {4877, 165, 170, {2803, 2811, 2817, 2824, 2835, 2842, 2850}, {2858, 2863, 1712, 2868, 2874, 2879, 2884}, {1828, 1616, 1608, 1608, 2892, 2894, 1285}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2896, 2902, 2910, 666, 2916, 2921, 2927, 2933, 2940, 704, 2951, 2961, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, {2971, 1707, 1712, 863, 2976, 1722, 868, 2981, 1732, 882, 887, 2992, 0}, 0, 0, 1, 3, {295,304,0,0,0,0,0,0,0,0,0,0,0,0},{4885,4913,0,0,0,0,0,0,0,0},{906,71,0,0,0,0,0,0,0,0,0,0},{914,89,0,0,0,0,0,0,0},{355,0,0,0,0,0,0,0}}, + {3316, 1221, 1239, {36109, 35877, 35896, 35909, 35924, 35941, 7877}, {36122, 36129, 36136, 36143, 36150, 36157, 36164}, {315, 318, 35972, 324, 327, 318, 324}, {35975, 35988, 360, 369, 12370, 12377, 12386, 401, 36017, 36036, 36051, 36068, 0}, {35975, 35988, 360, 369, 12370, 12377, 12386, 401, 36017, 36036, 36051, 36068, 0}, {35075, 36171, 35082, 496, 12370, 36003, 36010, 503, 510, 517, 36178, 36185, 0}, {35075, 36171, 35082, 496, 12370, 36003, 36010, 503, 510, 517, 36178, 36185, 0}, 0, 1, 11, 3, {1208,2098,692,681,4680,775,5063,417,0,0,0,0,0,0},{721,2561,798,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {673, 1143, 1154, {6428, 6437, 6449, 6456, 6464, 6474, 6480}, {6487, 6491, 6495, 6499, 6503, 6508, 6512}, {6516, 6518, 6520, 6522, 6524, 6518, 6522}, {1618, 1625, 11617, 1639, 1645, 1649, 1654, 8914, 35745, 35755, 35763, 35772, 0}, {1618, 1625, 11617, 1639, 1645, 1649, 1654, 8914, 35745, 35755, 35763, 35772, 0}, {5089, 4610, 4512, 4614, 1645, 5093, 5097, 35781, 5105, 5109, 4642, 6911, 0}, {5089, 4610, 4512, 4614, 1645, 5093, 5097, 35781, 5105, 5109, 4642, 6911, 0}, 0, 1, 11, 3, {2181,5019,0,0,0,0,0,0,0,0,0,0,0,0},{5034,2239,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{4948,0,0,0,0,0,0,0}}, + {673, 1221, 1205, {36109, 35877, 35896, 6014, 35924, 35941, 7877}, {36122, 36129, 36136, 36651, 36150, 36157, 36164}, {315, 318, 35972, 324, 327, 318, 324}, {35975, 35988, 360, 369, 12370, 36003, 36010, 401, 36017, 36036, 36051, 36068, 0}, {35975, 35988, 360, 369, 12370, 36003, 36010, 401, 36017, 36036, 36051, 36068, 0}, {35075, 36171, 35082, 496, 12370, 36003, 36010, 503, 510, 517, 36178, 36185, 0}, {35075, 36171, 35082, 496, 12370, 36003, 36010, 503, 510, 517, 36178, 36185, 0}, 0, 1, 11, 3, {2181,0,0,0,0,0,0,0,0,0,0,0,0,0},{2225,2239,2254,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{4948,0,0,0,0,0,0,0}}, + {673, 1254, 1174, {8833, 35838, 6449, 8858, 6464, 6474, 6480}, {6487, 6491, 6495, 36198, 6503, 6508, 6512}, {6516, 6518, 6520, 6522, 6524, 6518, 6522}, {1618, 1625, 11617, 1639, 1645, 5093, 5097, 8914, 35745, 35755, 35763, 35772, 0}, {1618, 1625, 11617, 1639, 1645, 5093, 5097, 8914, 35745, 35755, 35763, 35772, 0}, {5089, 4610, 4512, 4614, 1645, 5093, 5097, 35781, 5105, 5109, 4642, 6911, 0}, {5089, 4610, 4512, 4614, 1645, 5093, 5097, 35781, 5105, 5109, 4642, 6911, 0}, 0, 1, 11, 11, {2151,2181,0,0,0,0,0,0,0,0,0,0,0,0},{5034,2239,0,0,0,0,0,0,0,0},{1151,0,0,0,0,0,0,0,0,0,0,0},{1173,0,0,0,0,0,0,0,0},{4948,0,0,0,0,0,0,0}}, + {5074, 88, 1264, {36202, 36213, 36225, 36237, 36245, 36256, 36270}, {36280, 36284, 1645, 36288, 36292, 36296, 15346}, {1285, 1608, 1610, 2735, 1610, 1614, 1285}, {36301, 36319, 36333, 36349, 36365, 36378, 36390, 36404, 36417, 36433, 36449, 36464, 0}, {36301, 36319, 36333, 36349, 36365, 36378, 36390, 36404, 36417, 36433, 36449, 36464, 0}, {36479, 36485, 36492, 36501, 36510, 36516, 36521, 36528, 36534, 36543, 36552, 36560, 0}, {36479, 36485, 36492, 36501, 36510, 36516, 36521, 36528, 36534, 36543, 36552, 36560, 0}, 2, 1, 11, 3, {1208,681,2098,417,0,0,0,0,0,0,0,0,0,0},{5088,0,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {109, 1110, 1115, {34725, 34736, 34760, 34790, 34807, 34829, 34838}, {34849, 34853, 34860, 34867, 34871, 34878, 34882}, {4756, 4744, 4746, 4748, 4750, 4752, 4754}, {34886, 9875, 9888, 9897, 9908, 34899, 34908, 9929, 34917, 34934, 34949, 9981, 0}, {34962, 34975, 360, 34988, 380, 34999, 35008, 401, 35017, 35034, 35049, 35062, 0}, {35075, 489, 35082, 496, 380, 35089, 35096, 503, 35103, 517, 35110, 531, 0}, {35075, 489, 35082, 496, 380, 35089, 35096, 503, 35103, 517, 35110, 531, 0}, 0, 1, 11, 3, {681,775,2098,9,417,0,0,0,0,0,0,0,0,0},{894,1261,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {370, 25, 32, {897, 907, 917, 927, 937, 947, 957}, {967, 974, 981, 988, 995, 1002, 1009}, {1016, 1020, 1024, 1028, 1032, 1036, 1040}, {1044, 1051, 1058, 1065, 1072, 1079, 1086, 1093, 1100, 1107, 1114, 1124, 0}, {1044, 1051, 1058, 1065, 1072, 1079, 1086, 1093, 1100, 1107, 1114, 1124, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, 0, 0, 1, 3, {379,388,397,406,417,428,439,446,453,460,0,0,0,0},{469,491,519,547,562,0,0,0,0,0},{266,71,583,591,0,0,0,0,0,0,0,0},{271,89,600,611,0,0,0,0,0},{623,639,652,666,0,0,0,0}}, + {673, 1100, 1105, {1525, 7197, 34636, 1548, 1555, 1563, 34643}, {1578, 7225, 34651, 1591, 1595, 1599, 34655}, {1285, 1608, 1610, 1612, 1610, 1614, 1616}, {1618, 1625, 3504, 1639, 3515, 1649, 1654, 1659, 1666, 1676, 1684, 4420, 0}, {1618, 1625, 3504, 1639, 3515, 1649, 1654, 1659, 1666, 1676, 1684, 4420, 0}, {5089, 4610, 4512, 4614, 3515, 5093, 5097, 5101, 5105, 5109, 4642, 5113, 0}, {5089, 4610, 4512, 4614, 3515, 5093, 5097, 5101, 5105, 5109, 4642, 5113, 0}, 2, 1, 11, 3, {681,1455,0,0,0,0,0,0,0,0,0,0,0,0},{703,721,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 1143, 1154, {6428, 6437, 6449, 6456, 6464, 6474, 6480}, {6487, 6491, 6495, 6499, 6503, 6508, 6512}, {6516, 6518, 6520, 6522, 6524, 6518, 6522}, {1618, 1625, 11617, 1639, 1645, 1649, 1654, 8914, 35745, 35755, 35763, 35772, 0}, {1618, 1625, 11617, 1639, 1645, 1649, 1654, 8914, 35745, 35755, 35763, 35772, 0}, {5089, 4610, 4512, 4614, 1645, 5093, 5097, 35781, 5105, 5109, 4642, 6911, 0}, {5089, 4610, 4512, 4614, 1645, 5093, 5097, 35781, 5105, 5109, 4642, 6911, 0}, 0, 1, 11, 3, {2181,5019,0,0,0,0,0,0,0,0,0,0,0,0},{5034,2239,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{4948,0,0,0,0,0,0,0}}, + {109, 49, 52, {11414, 11420, 11434, 11457, 11471, 11487, 11494}, {11503, 11506, 11511, 11517, 11521, 11526, 11529}, {4756, 4744, 4746, 4748, 4750, 4752, 4754}, {11533, 11540, 7354, 11547, 2760, 11553, 11559, 11565, 11572, 11581, 11589, 11596, 0}, {11603, 11610, 11617, 11622, 11628, 11632, 11637, 11642, 11649, 11658, 11666, 11673, 0}, {11680, 5609, 4512, 4614, 11628, 11684, 11688, 11692, 11696, 5109, 11700, 11704, 0}, {11680, 5609, 4512, 4614, 11628, 11684, 11688, 11692, 11696, 5109, 11700, 11704, 0}, 0, 1, 11, 3, {681,304,0,0,0,0,0,0,0,0,0,0,0,0},{2843,894,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 1133, 1138, {35183, 35198, 35213, 35228, 35245, 16575, 35262}, {35273, 35280, 35287, 35294, 35301, 35308, 35315}, {35322, 16080, 6081, 6084, 6078, 16077, 16651}, {9864, 9875, 9888, 9897, 9908, 9915, 9922, 9929, 9942, 9957, 9970, 9981, 0}, {35325, 34975, 360, 34988, 380, 35336, 35343, 401, 35350, 35365, 35378, 35062, 0}, {9994, 10001, 10008, 10015, 9908, 9915, 9922, 10022, 10029, 10036, 10043, 10050, 0}, {9994, 10001, 10008, 10015, 9908, 9915, 9922, 10022, 10029, 10036, 10043, 10050, 0}, 0, 1, 1, 3, {406,2861,0,0,0,0,0,0,0,0,0,0,0,0},{3239,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {925, 665, 670, {22902, 22909, 22920, 22933, 22946, 22957, 22970}, {22981, 22986, 22991, 22996, 23001, 23006, 23011}, {22981, 22986, 22991, 22996, 23001, 23006, 23011}, {23016, 23042, 23070, 23100, 23130, 23156, 23186, 23212, 23240, 23264, 23292, 23329, 0}, {23016, 23042, 23070, 23100, 23130, 23156, 23186, 23212, 23240, 23264, 23292, 23329, 0}, {23368, 23380, 23392, 23404, 23416, 23428, 23440, 23452, 23464, 23476, 23489, 23502, 0}, {23368, 23380, 23392, 23404, 23416, 23428, 23440, 23452, 23464, 23476, 23489, 23502, 0}, 0, 1, 55, 3, {417,2861,0,0,0,0,0,0,0,0,0,0,0,0},{3361,3399,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {370, 25, 32, {897, 907, 917, 927, 937, 947, 957}, {34299, 34306, 34313, 34320, 34327, 34334, 34341}, {1016, 1020, 1024, 1028, 1032, 1036, 1040}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, 0, 0, 1, 3, {295,857,9,439,460,379,406,417,0,0,0,0,0,0},{469,1484,547,562,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{623,639,652,666,0,0,0,0}}, + {370, 25, 32, {897, 907, 917, 927, 937, 947, 957}, {34299, 34306, 34313, 34320, 34327, 34334, 34341}, {1016, 1020, 1024, 1028, 1032, 1036, 1040}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, {1134, 1139, 1144, 1149, 1154, 1159, 1164, 1169, 1174, 1179, 1185, 1191, 0}, 0, 0, 1, 3, {295,857,9,439,460,379,406,417,0,0,0,0,0,0},{469,1484,547,562,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{623,639,652,666,0,0,0,0}}, + {2090, 165, 170, {1525, 1533, 1540, 1548, 1555, 1563, 1570}, {5052, 5058, 5063, 5068, 5073, 5078, 5083}, {1285, 1608, 1610, 1612, 1610, 1614, 1616}, {1618, 1625, 3504, 1639, 3515, 1649, 1654, 1659, 1666, 1676, 1684, 4420, 0}, {1618, 1625, 3504, 1639, 3515, 1649, 1654, 1659, 1666, 1676, 1684, 4420, 0}, {5089, 4610, 4512, 4614, 3515, 5093, 5097, 5101, 5105, 5109, 4642, 5113, 0}, {5089, 4610, 4512, 4614, 3515, 5093, 5097, 5101, 5105, 5109, 4642, 5113, 0}, 2, 1, 11, 11, {681,1455,0,0,0,0,0,0,0,0,0,0,0,0},{703,721,0,0,0,0,0,0,0,0},{1151,0,0,0,0,0,0,0,0,0,0,0},{1173,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 1221, 1205, {36109, 35877, 35896, 6014, 35924, 35941, 7877}, {36122, 36129, 36136, 36651, 36150, 36157, 36164}, {315, 318, 35972, 324, 327, 318, 324}, {35975, 35988, 360, 369, 12370, 36003, 36010, 401, 36017, 36036, 36051, 36068, 0}, {35975, 35988, 360, 369, 12370, 36003, 36010, 401, 36017, 36036, 36051, 36068, 0}, {35075, 36171, 35082, 496, 12370, 36003, 36010, 503, 510, 517, 36178, 36185, 0}, {35075, 36171, 35082, 496, 12370, 36003, 36010, 503, 510, 517, 36178, 36185, 0}, 0, 1, 11, 11, {2151,2181,0,0,0,0,0,0,0,0,0,0,0,0},{5034,2239,0,0,0,0,0,0,0,0},{1151,0,0,0,0,0,0,0,0,0,0,0},{1173,0,0,0,0,0,0,0,0},{4948,0,0,0,0,0,0,0}}, + {1, 273, 285, {9712, 9727, 9742, 9757, 9774, 9793, 9804}, {9815, 9822, 9829, 9836, 9843, 9850, 9857}, {0, 0, 0, 0, 0, 0, 0}, {9864, 9875, 9888, 9897, 9908, 9915, 9922, 9929, 9942, 9957, 9970, 9981, 0}, {9864, 9875, 9888, 9897, 9908, 9915, 9922, 9929, 9942, 9957, 9970, 9981, 0}, {9994, 10001, 10008, 10015, 9908, 9915, 9922, 10022, 10029, 10036, 10043, 10050, 0}, {9994, 10001, 10008, 10015, 9908, 9915, 9922, 10022, 10029, 10036, 10043, 10050, 0}, 0, 1, 11, 3, {681,775,2098,744,9,0,0,0,0,0,0,0,0,0},{2727,2745,0,0,0,0,0,0,0,0},{71,266,0,0,0,0,0,0,0,0,0,0},{89,271,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {673, 327, 1120, {35117, 35126, 35138, 35147, 35154, 35163, 1247}, {12088, 12092, 35169, 12101, 35174, 35178, 12114}, {6516, 6518, 12118, 6522, 6522, 6518, 6522}, {1618, 1625, 12120, 12126, 1645, 8902, 8908, 12137, 1666, 1676, 12144, 1693, 0}, {12153, 12161, 12170, 12177, 5333, 12189, 12196, 12203, 6874, 12211, 12219, 6902, 0}, {5089, 4610, 12228, 4614, 1645, 5093, 5097, 12237, 5105, 5109, 12241, 6911, 0}, {5089, 4610, 12228, 4614, 1645, 5093, 5097, 12237, 5105, 5109, 12241, 6911, 0}, 2, 1, 124, 3, {692,4680,681,775,417,0,0,0,0,0,0,0,0,0},{798,721,692,0,0,0,0,0,0,0},{71,266,4689,4703,0,0,0,0,0,0,0,0},{89,4716,4733,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}}, + {925, 458, 461, {17037, 17047, 17056, 17065, 17076, 17086, 17091}, {17098, 17102, 17107, 17112, 17117, 7723, 17121}, {17126, 1828, 1285, 5210, 1280, 2892, 1285}, {11533, 11540, 7354, 11547, 2760, 17128, 17133, 17138, 17145, 17153, 11589, 11596, 0}, {11603, 11610, 11617, 11622, 11628, 11632, 11637, 8914, 17160, 17168, 11666, 11673, 0}, {12906, 17175, 2791, 1927, 2760, 17179, 17183, 17187, 7707, 1947, 17191, 17195, 0}, {12906, 17175, 2791, 1927, 2760, 17179, 17183, 17187, 7707, 1947, 17191, 17195, 0}, 0, 1, 1, 3, {406,2861,0,0,0,0,0,0,0,0,0,0,0,0},{3239,2997,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{2717,0,0,0,0,0,0,0}}, + {1, 464, 479, {7465, 34718, 7489, 35389, 7505, 7518, 7527}, {17899, 17906, 17916, 17929, 17942, 17952, 17971}, {17993, 17997, 18004, 18011, 18021, 18028, 18041}, {7536, 7547, 7558, 7567, 35398, 7585, 7592, 7605, 7614, 7625, 7638, 7649, 0}, {7536, 7547, 7558, 7567, 35398, 7585, 7592, 7605, 7614, 7625, 7638, 7649, 0}, {18228, 18235, 18083, 18245, 18115, 18122, 18261, 18274, 18281, 18291, 18304, 18314, 0}, {18228, 18235, 18083, 18245, 18115, 18122, 18261, 18274, 18281, 18291, 18304, 18314, 0}, 0, 0, 55, 11, {755,1062,2098,744,417,0,0,0,0,0,0,0,0,0},{3298,894,0,0,0,0,0,0,0,0},{4804,62,266,71,0,0,0,0,0,0,0,0},{4812,77,271,89,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {109, 889, 899, {28394, 28401, 28407, 28414, 28420, 28426, 28434}, {28444, 28448, 28452, 28456, 28460, 28464, 28468}, {9428, 9428, 9428, 9428, 9428, 9428, 9428}, {28474, 28483, 7020, 28492, 28498, 28504, 28510, 28517, 28523, 28532, 28541, 28549, 0}, {28474, 28483, 7020, 28492, 28498, 28504, 28510, 28517, 28523, 28532, 28541, 28549, 0}, {28558, 28562, 2791, 28566, 2760, 28570, 28574, 28578, 28583, 28587, 28593, 28597, 0}, {28558, 28562, 2791, 28566, 2760, 28570, 28574, 28578, 28583, 28587, 28593, 28597, 0}, 0, 0, 55, 3, {744,755,417,0,0,0,0,0,0,0,0,0,0,0},{2448,42,0,0,0,0,0,0,0,0},{266,71,0,0,0,0,0,0,0,0,0,0},{271,89,0,0,0,0,0,0,0},{98,0,0,0,0,0,0,0}}, + {925, 49, 52, {29614, 29621, 29629, 29636, 29643, 29651, 29660}, {29667, 29671, 29675, 29679, 29683, 7723, 28444}, {1616, 1616, 1610, 1616, 9428, 2892, 9428}, {29687, 29695, 29705, 29711, 29719, 29724, 29729, 29734, 29741, 16856, 29749, 29757, 0}, {29687, 29695, 29705, 29711, 29719, 29724, 29729, 29734, 29741, 16856, 29749, 29757, 0}, {1914, 29765, 2791, 29769, 2760, 28570, 28574, 29773, 2731, 1947, 29777, 13346, 0}, {1914, 29765, 2791, 29769, 2760, 28570, 28574, 29773, 2731, 1947, 29777, 13346, 0}, 0, 0, 1, 3, {295,3021,0,0,0,0,0,0,0,0,0,0,0,0},{1010,1029,0,0,0,0,0,0,0,0},{71,0,0,0,0,0,0,0,0,0,0,0},{89,0,0,0,0,0,0,0,0},{734,0,0,0,0,0,0,0}} +}; + + +static const NumberFormatEntry number_format_entries [] = { + {11, 1278, 11, 1278, 1280, 1290, 1295, 1310, 1313, 1323, 55, 1332, 3, 2, 0, 0, 3, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1339, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1361, 1370, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1378, 1345, 1347, 1310, 1313, 1323, 55, 1355, 2, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1378, 1345, 1347, 1310, 1313, 1323, 55, 1355, 2, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1381, 1345, 0, 1351, 1385, 1397, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1409, 1345, 1347, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1413, 1424, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1435, 1449, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1462, 1345, 1347, 1351, 1313, 1323, 55, 1355, 0, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1464, 1474, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 1483, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1492, 1347, 1310, 1495, 1503, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1511, 1345, 1347, 1351, 1313, 1323, 55, 1515, 2, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1520, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1523, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1464, 1527, 55, 1355, 9, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1537, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1541, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 0, 0, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1310, 1545, 1555, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 0, 1290, 1347, 1310, 1313, 1323, 55, 1332, 9, 2, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1564, 1345, 1347, 1351, 1568, 1587, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1606, 1345, 1347, 1351, 1464, 1527, 55, 1355, 9, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1609, 11, 1609, 1613, 1345, 1347, 1351, 1617, 1626, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1635, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1639, 1345, 1643, 1351, 1660, 1688, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1715, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 2, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 1347, 1351, 1385, 1397, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1718, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 1336, 1724, 1345, 1727, 1734, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1740, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1744, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 2, 2, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1748, 1345, 1347, 1351, 1313, 1323, 55, 1751, 3, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1759, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1762, 1345, 1347, 1351, 1313, 1323, 55, 1355, 5, 1, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1766, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1769, 1783, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 1796, 1351, 1799, 1811, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {2, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 1347, 1351, 1822, 1833, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 0, 1345, 0, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1, 1278, 1, 1278, 1843, 1492, 0, 1310, 1313, 1323, 55, 1355, 3, 0, 0, 0, 3, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1852, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1856, 1345, 1859, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 0, 1345, 1347, 1351, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1866, 1876, 55, 1355, 8, 3, 7, 3, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1885, 1345, 1347, 1351, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1892, 1345, 0, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1892, 1345, 0, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1336, 11, 1336, 1892, 1345, 0, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1892, 1345, 0, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1892, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1892, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1894, 1345, 1898, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1724, 1345, 1347, 1351, 1313, 1323, 55, 1355, 2, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1939, 1345, 0, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 1357, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 1727, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1357, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1943, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1946, 1345, 1950, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1967, 1345, 1974, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1991, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1995, 1345, 1999, 1351, 1313, 1323, 55, 1355, 5, 1, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 0, 1492, 2009, 1310, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2028, 1345, 1347, 1351, 1313, 1323, 55, 1355, 12, 2, 1, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 0, 1492, 1347, 1310, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 1939, 1345, 0, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 1939, 1345, 0, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 1939, 1345, 1347, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 1939, 1345, 1347, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 1939, 1345, 1347, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 1939, 1345, 1347, 1351, 1313, 1323, 55, 1355, 12, 2, 2, 2, 1, 2, 2, {3, -1}, {3, 2}}, + {11, 1278, 11, 1278, 1939, 1345, 0, 1351, 1313, 1323, 55, 1355, 12, 2, 1, 1, 1, 2, 2, {3, 2}, {3, 2}}, + {2035, 1278, 11, 1278, 1939, 1345, 1347, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 0, 1345, 1347, 1351, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1378, 1345, 1347, 1351, 1313, 1323, 55, 1355, 2, 0, 1, 1, 1, 2, 2, {3, 0}, {3, -1}}, + {11, 1278, 11, 1278, 2037, 1345, 0, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2040, 1345, 1347, 1351, 1313, 1323, 55, 1355, 5, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2044, 1345, 2048, 1351, 1313, 1323, 55, 1355, 2, 0, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2094, 1345, 2096, 1351, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1464, 1474, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1939, 1345, 0, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 2136, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 0, 1345, 1347, 1351, 1313, 1323, 55, 1355, 0, 0, 1, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2144, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 1, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 0, 1345, 0, 1351, 1495, 1503, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2151, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, 2}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1313, 1323, 55, 1355, 11, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2158, 1492, 1347, 1310, 1313, 1323, 55, 1751, 8, 3, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2161, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 0, 1345, 0, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 0, 1345, 0, 1351, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2165, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1336, 11, 1336, 1892, 1345, 0, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1409, 1345, 1727, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, 0}, {3, -1}}, + {11, 1278, 11, 1278, 2165, 1345, 1347, 1310, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1766, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2169, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1462, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2173, 1345, 0, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1378, 1345, 0, 1351, 1313, 1323, 55, 1355, 2, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 0, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1537, 1345, 1347, 1351, 1313, 1323, 55, 1355, 2, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1639, 1345, 2175, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2204, 1345, 1347, 1351, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2037, 1492, 1347, 1310, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1280, 1492, 1295, 1310, 1313, 1323, 55, 1332, 3, 2, 0, 0, 3, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1339, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1361, 1370, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1462, 1345, 2207, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1381, 1345, 0, 1351, 1385, 1397, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1409, 1345, 1347, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1413, 1424, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1435, 1449, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1462, 1345, 1347, 1351, 1313, 1323, 55, 1355, 0, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 1483, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1492, 1347, 1310, 1495, 1503, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1511, 1345, 1347, 1351, 1313, 1323, 55, 1515, 2, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1520, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1523, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1464, 1527, 55, 1355, 9, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1537, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1541, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 0, 0, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1310, 1545, 1555, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1724, 1290, 1347, 1310, 1313, 1323, 55, 1332, 9, 2, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1564, 1345, 1347, 1351, 1568, 1587, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1606, 1345, 1347, 1351, 1464, 1527, 55, 1355, 9, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1609, 11, 1609, 1613, 1345, 1347, 1351, 1617, 1626, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1635, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1639, 1345, 1643, 1351, 1660, 1688, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2217, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 2, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 1347, 1351, 1385, 1397, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1718, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 1336, 1724, 1345, 1727, 1734, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1740, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1744, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 2, 2, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1748, 1345, 1347, 1351, 1313, 1323, 55, 1751, 3, 0, 0, 0, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1759, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1762, 1345, 1347, 1351, 1313, 1323, 55, 1355, 5, 1, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1766, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1769, 1783, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 1796, 1351, 1799, 1811, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {2, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 1347, 1351, 1822, 1833, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1967, 1345, 0, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1, 1278, 1, 1278, 1843, 1492, 0, 1310, 1313, 1323, 55, 1355, 3, 0, 0, 0, 3, 0, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1852, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1856, 1345, 1859, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2221, 1345, 1347, 1351, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1866, 1876, 55, 1355, 8, 3, 7, 3, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1885, 1345, 1347, 1351, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1892, 1345, 0, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1892, 1345, 0, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1336, 11, 1336, 1892, 1345, 0, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1892, 1345, 0, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1892, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1892, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1894, 1345, 1898, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1724, 1345, 1347, 1351, 1313, 1323, 55, 1355, 2, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1939, 1345, 0, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 1357, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1724, 1345, 1727, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1943, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1946, 1345, 1950, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1967, 1345, 1974, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1991, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1995, 1345, 1999, 1351, 1313, 1323, 55, 1355, 5, 1, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 2225, 1492, 2009, 1310, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1939, 1345, 1347, 1351, 1313, 1323, 55, 1355, 12, 2, 1, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 1939, 1345, 0, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 1939, 1345, 0, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 1939, 1345, 1347, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 1939, 1345, 1347, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 1939, 1345, 1347, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 1939, 1345, 1347, 1351, 1313, 1323, 55, 1355, 12, 2, 2, 2, 1, 2, 2, {3, -1}, {3, 2}}, + {11, 1278, 11, 1278, 1939, 1345, 0, 1351, 1313, 1323, 55, 1355, 12, 2, 1, 1, 1, 2, 2, {3, 2}, {3, 2}}, + {2035, 1278, 11, 1278, 1939, 1345, 1347, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 2231, 1345, 1347, 1351, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1378, 1345, 1347, 1351, 1313, 1323, 55, 1355, 2, 0, 1, 1, 1, 2, 2, {3, 0}, {3, -1}}, + {11, 1278, 11, 1278, 2037, 1345, 0, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2040, 1345, 1347, 1351, 1313, 1323, 55, 1355, 5, 1, 1, 1, 2, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2044, 1345, 2048, 1351, 1313, 1323, 55, 1355, 2, 0, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2094, 1345, 2096, 1351, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1464, 1474, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1939, 1345, 0, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 2136, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2144, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 1, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2235, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, 2}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1313, 1323, 55, 1355, 11, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2158, 1492, 1347, 1310, 1313, 1323, 55, 1751, 8, 3, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2161, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2165, 1345, 0, 1351, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2165, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1336, 11, 1336, 1892, 1345, 0, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1409, 1345, 1727, 1351, 1313, 1323, 55, 1355, 12, 2, 0, 0, 1, 2, 2, {3, 0}, {3, -1}}, + {11, 1278, 11, 1278, 2165, 1345, 1347, 1310, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1766, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1766, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1462, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2173, 1345, 0, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1378, 1345, 0, 1351, 1313, 1323, 55, 1355, 2, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 0, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1537, 1345, 1347, 1351, 1313, 1323, 55, 1355, 2, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1639, 1345, 2175, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2204, 1345, 1347, 1351, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2037, 1492, 1347, 1310, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2248, 1290, 1295, 1310, 1313, 1323, 55, 1332, 3, 2, 0, 0, 3, 0, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1361, 1370, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1537, 1345, 1347, 1310, 1313, 1323, 55, 1355, 2, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 2258, 11, 2258, 1613, 1345, 1347, 1351, 1413, 1424, 55, 1355, 2, 2, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2037, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1462, 1345, 1347, 1351, 1464, 1474, 55, 1355, 1, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1492, 1347, 1310, 1495, 1503, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 2258, 11, 2258, 1613, 1345, 1347, 1351, 1464, 1527, 55, 1355, 2, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 1336, 1357, 1345, 1347, 1310, 1545, 1555, 55, 1355, 12, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1724, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 1347, 1351, 1464, 1527, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2260, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 2260, 1345, 1643, 1351, 1660, 1688, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 1727, 1734, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1939, 1345, 1347, 1351, 1313, 1323, 55, 1751, 1, 0, 1, 2, 1, 2, 2, {3, 2}, {3, -1}}, + {1278, 1336, 1278, 1336, 2221, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1336, 11, 1336, 2262, 1345, 0, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 1336, 1724, 1345, 1727, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1357, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1462, 1345, 1347, 1351, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 2264, 1492, 2271, 1310, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2304, 1345, 1347, 1351, 1313, 1323, 55, 1355, 12, 2, 1, 0, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 2308, 1492, 1347, 1310, 1313, 1323, 55, 1515, 9, 2, 9, 3, 2, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2311, 1345, 1347, 1351, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 2, 2, {3, 2}, {3, 2}}, + {11, 1278, 11, 1278, 1939, 1345, 1347, 1351, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2169, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2315, 1290, 1295, 1310, 1313, 1323, 55, 1332, 3, 2, 0, 0, 3, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2325, 1345, 2207, 1351, 1313, 1323, 55, 1355, 0, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1413, 1424, 55, 1355, 9, 2, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1462, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1464, 1474, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1462, 1492, 1347, 1310, 1495, 1503, 55, 1355, 15, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 1727, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2329, 1290, 1295, 1310, 1313, 1323, 55, 1332, 3, 0, 0, 0, 3, 3, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1462, 1345, 1347, 1310, 1313, 1323, 55, 1355, 0, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1413, 1424, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1462, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2339, 1345, 1347, 1351, 1464, 1474, 55, 1355, 1, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1336, 11, 1336, 1613, 1492, 1347, 1310, 1495, 1503, 55, 1355, 2, 2, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2341, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2344, 1290, 1295, 1310, 1313, 1323, 55, 1332, 3, 2, 0, 0, 3, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2354, 1345, 2207, 1351, 1313, 1323, 55, 1355, 0, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 2258, 11, 2258, 1613, 1345, 1347, 1351, 1413, 1424, 55, 1355, 9, 2, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1462, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2359, 1345, 1347, 1351, 1464, 1474, 55, 1355, 1, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1492, 1347, 1310, 1495, 1503, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2341, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2363, 1290, 1295, 1310, 1313, 1323, 55, 1332, 3, 2, 0, 0, 3, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1357, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2373, 1345, 1347, 1351, 1464, 1474, 55, 1355, 1, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1492, 1347, 1310, 1495, 1503, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2341, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2377, 1290, 1295, 1310, 1313, 1323, 55, 1332, 3, 2, 0, 0, 3, 3, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1892, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2387, 1345, 1347, 1351, 1464, 1474, 55, 1355, 1, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2391, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2396, 1290, 1295, 1310, 1313, 1323, 55, 1332, 3, 2, 0, 0, 3, 3, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1462, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2406, 1345, 1347, 1351, 1464, 1474, 55, 1355, 2, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1492, 1347, 1310, 1495, 1503, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2391, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2410, 1290, 1295, 1310, 1313, 1323, 55, 1332, 3, 2, 0, 0, 3, 0, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1462, 1345, 1347, 1351, 1464, 1474, 55, 1355, 1, 0, 0, 0, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 2420, 1492, 1347, 1310, 1495, 1503, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2423, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 2427, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2435, 1290, 1295, 1310, 1313, 1323, 55, 1332, 3, 2, 0, 0, 3, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1462, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2445, 1345, 1347, 1351, 1464, 1474, 55, 1355, 1, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 2448, 1492, 1347, 1310, 1495, 1503, 55, 1355, 8, 3, 0, 0, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2423, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2452, 1290, 1295, 1310, 1313, 1323, 55, 1332, 3, 2, 0, 0, 3, 3, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1462, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1462, 1345, 1347, 1351, 1464, 1474, 55, 1355, 1, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 2462, 1492, 1347, 1310, 1495, 1503, 55, 1355, 8, 3, 0, 0, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2467, 1290, 1295, 1310, 1313, 1323, 55, 1332, 3, 2, 0, 0, 3, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1462, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1462, 1345, 1347, 1351, 1464, 1474, 55, 1355, 2, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 2448, 1492, 1347, 1310, 1495, 1503, 55, 1355, 8, 3, 0, 0, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2477, 1290, 1295, 1310, 1313, 1323, 55, 1332, 3, 2, 0, 0, 3, 3, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2161, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1462, 1345, 1347, 1351, 1464, 1474, 55, 1355, 2, 0, 0, 0, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 2448, 1492, 1347, 1310, 1495, 1503, 55, 1355, 8, 3, 0, 0, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2487, 1290, 1295, 1310, 1313, 1323, 55, 1332, 3, 2, 0, 0, 3, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1462, 1345, 1347, 1351, 1464, 1474, 55, 1355, 9, 2, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 2497, 1492, 1347, 1310, 1495, 1503, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2501, 1290, 1295, 1310, 1313, 1323, 55, 1332, 3, 2, 0, 0, 3, 3, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2325, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2511, 1345, 1347, 1351, 1464, 1474, 55, 1355, 12, 2, 0, 0, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 2515, 1492, 1347, 1310, 1495, 1503, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2517, 1290, 1295, 1310, 1313, 1323, 55, 1332, 3, 2, 0, 0, 3, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1939, 1345, 1347, 1351, 1313, 1323, 55, 1355, 12, 2, 1, 1, 1, 2, 2, {3, 2}, {3, 2}}, + {1278, 11, 1278, 11, 2527, 1345, 1347, 1351, 1464, 1474, 55, 1355, 1, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1943, 1345, 1347, 1351, 1313, 1323, 55, 1355, 0, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1462, 1345, 1347, 1351, 1464, 1474, 55, 1355, 1, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1462, 1345, 1347, 1351, 1313, 1323, 55, 1355, 1, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2260, 1345, 1347, 1351, 1464, 1474, 55, 1355, 1, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2530, 1345, 1347, 1351, 1464, 1474, 55, 1355, 1, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1462, 1345, 1347, 1351, 1464, 1474, 55, 1355, 1, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1462, 1345, 1347, 1351, 1464, 1474, 55, 1355, 0, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1462, 1345, 1347, 1351, 1464, 1474, 55, 1355, 1, 0, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2391, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2341, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2533, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2541, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1357, 1345, 2427, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 2221, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 1378, 1345, 1347, 1310, 1313, 1323, 55, 1355, 2, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1724, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2341, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2221, 1345, 1347, 1351, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 2264, 1492, 2271, 1310, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2231, 1345, 1347, 1351, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2325, 1345, 2207, 1351, 1313, 1323, 55, 1355, 0, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2325, 1345, 2207, 1351, 1313, 1323, 55, 1355, 0, 0, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1724, 1290, 1347, 1310, 1313, 1323, 55, 1332, 9, 2, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 2541, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 1967, 1345, 0, 1351, 1313, 1323, 55, 1355, 8, 3, 1, 1, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 11, 1278, 11, 1357, 1345, 1347, 1351, 1313, 1323, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 2225, 1492, 2009, 1310, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 0, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2308, 1492, 1347, 1310, 1313, 1323, 55, 1515, 9, 2, 9, 3, 2, 2, 2, {3, -1}, {3, -1}}, + {1278, 1336, 1278, 1336, 0, 1345, 0, 1351, 1495, 1503, 55, 1355, 8, 3, 0, 0, 1, 2, 2, {3, -1}, {3, -1}}, + {11, 1278, 11, 1278, 2165, 1345, 0, 1351, 1313, 1323, 55, 1355, 9, 2, 1, 1, 1, 2, 2, {3, -1}, {3, -1}} +}; + + +static const CultureInfoEntry culture_entries [] = { + {0x0001, 0x007F, 768, -1, 2546, 2549, 2556, 2571, 2575, 2546, 0, {0, 0, 36669, 0}, 0, 0, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x0002, 0x007F, 257, -1, 2579, 2582, 2592, 2611, 2615, 2579, 0, {36697, 0, 0, 0}, 1, 1, { 1251, 21025, 10007, 866, 0, ';' }}, + {0x0003, 0x007F, 257, -1, 2619, 2622, 2630, 2638, 2642, 2619, 0, {36739, 0, 0, 0}, 2, 2, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0004, 0x7804, 257, -1, 2646, 2654, 2675, 2682, 2686, 2690, 0, {36759, 0, 0, 0}, 3, 3, { 936, 500, 10008, 936, 0, ',' }}, + {0x0004, 0x0004, 257, -1, 2693, 2700, 2675, 2682, 2686, 2690, 0, {36759, 0, 0, 0}, 4, 4, { 936, 500, 10008, 936, 0, ',' }}, + {0x0005, 0x007F, 257, -1, 2728, 2731, 2737, 2747, 2751, 2728, 0, {36766, 0, 0, 0}, 5, 5, { 1250, 500, 10029, 852, 0, ';' }}, + {0x0006, 0x007F, 257, -1, 2755, 2758, 2765, 2771, 2775, 2755, 0, {36792, 0, 0, 0}, 6, 6, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x0007, 0x007F, 257, -1, 2779, 2782, 2789, 2797, 2801, 2779, 0, {36813, 0, 0, 0}, 7, 7, { 1252, 20273, 10000, 850, 0, ';' }}, + {0x0008, 0x007F, 257, -1, 2805, 2808, 2814, 2831, 2835, 2805, 0, {36838, 0, 0, 0}, 8, 8, { 1253, 20273, 10006, 737, 0, ';' }}, + {0x0009, 0x007F, 257, -1, 2839, 2842, 2842, 2850, 2854, 2839, 0, {36880, 0, 0, 0}, 9, 9, { 1252, 37, 10000, 437, 0, ',' }}, + {0x000A, 0x007F, 257, -1, 2858, 2861, 2869, 2878, 2882, 2858, 0, {36899, 0, 0, 0}, 10, 10, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x000B, 0x007F, 257, -1, 2886, 2889, 2897, 2903, 2907, 2886, 0, {36921, 0, 0, 0}, 11, 11, { 1252, 20278, 10000, 850, 0, ';' }}, + {0x000C, 0x007F, 257, -1, 2911, 2914, 2921, 2931, 2935, 2911, 0, {36946, 0, 0, 0}, 12, 12, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x000D, 0x007F, 257, -1, 2939, 2942, 2949, 2960, 2964, 2939, 0, {36968, 0, 0, 0}, 13, 13, { 1255, 500, 10005, 862, 1, ',' }}, + {0x000E, 0x007F, 257, -1, 2968, 2971, 2981, 2988, 2992, 2968, 0, {37005, 0, 0, 0}, 14, 14, { 1250, 500, 10029, 852, 0, ';' }}, + {0x000F, 0x007F, 257, -1, 2996, 2999, 3009, 3019, 3023, 2996, 0, {37021, 0, 0, 0}, 15, 15, { 1252, 20871, 10079, 850, 0, ';' }}, + {0x0010, 0x007F, 257, -1, 3027, 3030, 3038, 3047, 3051, 3027, 0, {37041, 0, 0, 0}, 16, 16, { 1252, 20280, 10000, 850, 0, ';' }}, + {0x0011, 0x007F, 257, -1, 3055, 3058, 3067, 3077, 3081, 3055, 0, {37063, 0, 0, 0}, 17, 17, { 932, 20290, 10001, 932, 0, ',' }}, + {0x0012, 0x007F, 257, -1, 3085, 3088, 3095, 3105, 3109, 3085, 0, {37090, 0, 0, 0}, 18, 18, { 949, 20833, 10003, 949, 0, ',' }}, + {0x0013, 0x007F, 257, -1, 3113, 3116, 3122, 3133, 3137, 3113, 0, {37097, 0, 0, 0}, 19, 19, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0014, 0x007F, 257, -1, 3141, 3144, 3154, 3160, 3164, 3168, 0, {36792, 0, 0, 0}, 20, 20, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x0015, 0x007F, 257, -1, 3171, 3174, 3181, 3188, 3192, 3171, 0, {37119, 0, 0, 0}, 21, 21, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x0016, 0x007F, 257, -1, 3196, 3199, 3210, 3221, 3225, 3196, 0, {37143, 0, 0, 0}, 22, 22, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0017, 0x007F, 257, -1, 3229, 3232, 3240, 3250, 3254, 3229, 0, {37166, 0, 0, 0}, 23, 23, { 1252, 20273, 10000, 850, 0, ';' }}, + {0x0018, 0x007F, 257, -1, 3258, 3261, 3270, 3279, 3283, 3258, 0, {37186, 0, 0, 0}, 24, 24, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x0019, 0x007F, 257, -1, 3287, 3290, 3298, 3313, 3317, 3287, 0, {37205, 0, 0, 0}, 25, 25, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x001A, 0x007F, 257, -1, 3321, 3324, 3333, 3342, 3346, 3321, 0, {37251, 0, 0, 0}, 26, 26, { 1250, 500, 10082, 852, 0, ';' }}, + {0x001B, 0x007F, 257, -1, 3350, 3353, 3360, 3372, 3376, 3350, 0, {37274, 0, 0, 0}, 27, 27, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x001C, 0x007F, 257, -1, 3380, 3383, 3392, 3398, 3402, 3380, 0, {37298, 0, 0, 0}, 28, 28, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x001D, 0x007F, 257, -1, 3406, 3409, 3417, 3425, 3429, 3406, 0, {36792, 0, 0, 0}, 29, 29, { 1252, 20278, 10000, 850, 0, ';' }}, + {0x001E, 0x007F, 512, -1, 3433, 3436, 3441, 3451, 3455, 3433, 0, {0, 37317, 0, 0}, 30, 30, { 874, 20838, 10021, 874, 0, ',' }}, + {0x001F, 0x007F, 257, -1, 3459, 3462, 3470, 3479, 3483, 3459, 0, {37348, 0, 0, 0}, 31, 31, { 1254, 20905, 10081, 857, 0, ';' }}, + {0x0020, 0x007F, 257, -1, 3487, 3490, 3495, 3504, 3508, 3487, 0, {37362, 0, 0, 0}, 32, 32, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x0021, 0x007F, 257, -1, 3512, 3515, 3526, 3536, 3540, 3512, 0, {37392, 0, 0, 0}, 33, 33, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0022, 0x007F, 257, -1, 3544, 3547, 3557, 3578, 3582, 3544, 0, {37411, 0, 0, 0}, 34, 34, { 1251, 500, 10017, 866, 0, ';' }}, + {0x0023, 0x007F, 257, -1, 3586, 3589, 3600, 3621, 3625, 3586, 0, {37457, 0, 0, 0}, 35, 35, { 1251, 500, 10007, 866, 0, ';' }}, + {0x0024, 0x007F, 257, -1, 3629, 3632, 3642, 3656, 3660, 3629, 0, {37499, 0, 0, 0}, 36, 36, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x0025, 0x007F, 257, -1, 3664, 3667, 3676, 3682, 3686, 3664, 0, {37521, 0, 0, 0}, 37, 37, { 1257, 500, 10029, 775, 0, ';' }}, + {0x0026, 0x007F, 257, -1, 3690, 3693, 3701, 3711, 3715, 3690, 0, {37541, 0, 0, 0}, 38, 38, { 1257, 500, 10029, 775, 0, ';' }}, + {0x0027, 0x007F, 257, -1, 3719, 3722, 3733, 3743, 3747, 3719, 0, {37560, 0, 0, 0}, 39, 39, { 1257, 500, 10029, 775, 0, ';' }}, + {0x0028, 0x007F, 257, -1, 3751, 3754, 3760, 3773, 3777, 3751, 0, {0, 0, 0, 0}, 40, 40, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x0029, 0x007F, 257, -1, 3781, 3784, 3792, 3803, 3807, 3781, 0, {37583, 0, 0, 0}, 41, 41, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x002A, 0x007F, 257, -1, 3811, 3814, 3825, 3840, 3844, 3811, 0, {37607, 0, 0, 0}, 42, 42, { 1258, 500, 10000, 1258, 0, ',' }}, + {0x002B, 0x007F, 257, -1, 3848, 3851, 3860, 3875, 3879, 3848, 0, {37622, 0, 0, 0}, 43, 43, { 0, 500, 2, 1, 0, ',' }}, + {0x002C, 0x007F, 257, -1, 3883, 3886, 3898, 3910, 3914, 3883, 0, {37652, 0, 0, 0}, 44, 44, { 1254, 20905, 10081, 857, 0, ';' }}, + {0x002D, 0x007F, 257, -1, 3918, 3921, 3928, 3936, 3940, 3918, 0, {37671, 0, 0, 0}, 45, 45, { 1252, 500, 2, 850, 0, ';' }}, + {0x002E, 0x007F, 257, -1, 3944, 3948, 3962, 3980, 3944, 3944, 0, {37691, 0, 0, 0}, 46, 46, { 1252, 870, 10000, 850, 0, ';' }}, + {0x002F, 0x007F, 257, -1, 3984, 3987, 3998, 4019, 4023, 3984, 0, {37712, 0, 0, 0}, 47, 47, { 1251, 500, 10007, 866, 0, ';' }}, + {0x0030, 0x007F, 257, -1, 4027, 4030, 4045, 4053, 4057, 4027, 0, {0, 0, 0, 0}, 48, 48, { 0, 500, 2, 1, 0, ';' }}, + {0x0031, 0x007F, 257, -1, 4061, 4064, 4071, 4080, 4084, 4061, 0, {0, 0, 0, 0}, 49, 49, { 0, 500, 2, 1, 0, ';' }}, + {0x0032, 0x007F, 257, -1, 4088, 4091, 4098, 4107, 4111, 4088, 0, {0, 0, 0, 0}, 50, 50, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0034, 0x007F, 257, -1, 4115, 4118, 4124, 4133, 4137, 4115, 0, {0, 0, 0, 0}, 51, 51, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0035, 0x007F, 257, -1, 4141, 4144, 4149, 4157, 4161, 4141, 0, {37756, 0, 0, 0}, 52, 52, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0036, 0x007F, 257, -1, 4165, 4168, 4168, 4178, 4182, 4165, 0, {37781, 0, 0, 0}, 53, 53, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0037, 0x007F, 257, -1, 4186, 4189, 4198, 4220, 4224, 4186, 0, {37801, 0, 0, 0}, 54, 54, { 0, 500, 2, 1, 0, ';' }}, + {0x0038, 0x007F, 257, -1, 4228, 4231, 4239, 4249, 4253, 4228, 0, {37866, 0, 0, 0}, 55, 55, { 1252, 20277, 10079, 850, 0, ';' }}, + {0x0039, 0x007F, 257, -1, 4257, 4260, 4266, 4285, 4289, 4257, 0, {37890, 0, 0, 0}, 56, 56, { 0, 500, 2, 1, 0, ',' }}, + {0x003A, 0x007F, 257, -1, 4293, 4296, 4304, 4310, 4314, 4293, 0, {37943, 0, 0, 0}, 57, 57, { 0, 500, 2, 1, 0, ';' }}, + {0x003B, 0x007F, 257, -1, 4318, 4321, 4335, 4352, 4356, 4318, 0, {37964, 0, 0, 0}, 58, 58, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x003C, 0x007F, 257, -1, 4360, 4363, 4369, 4377, 4381, 4360, 0, {37983, 0, 0, 0}, 59, 59, { 1252, 500, 10000, 850, 0, ';' }}, + {0x003E, 0x007F, 257, -1, 4385, 4388, 4394, 4408, 4412, 4385, 0, {38004, 0, 0, 0}, 60, 60, { 1252, 500, 10000, 850, 0, ';' }}, + {0x003F, 0x007F, 257, -1, 4416, 4419, 4426, 4446, 4450, 4416, 0, {38021, 0, 0, 0}, 61, 61, { 0, 500, 2, 1, 0, ';' }}, + {0x0040, 0x007F, 257, -1, 4454, 4457, 4464, 4481, 4485, 4454, 0, {38063, 0, 0, 0}, 62, 62, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x0041, 0x007F, 257, -1, 4489, 4492, 4500, 4510, 4514, 4489, 0, {38103, 0, 0, 0}, 63, 63, { 1252, 500, 10000, 437, 0, ';' }}, + {0x0042, 0x007F, 257, -1, 4518, 4521, 4529, 4541, 4545, 4518, 0, {38124, 0, 0, 0}, 64, 64, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x0043, 0x007F, 257, -1, 4549, 4552, 4558, 4567, 4571, 4549, 0, {38146, 0, 0, 0}, 65, 65, { 1254, 500, 10029, 857, 0, ';' }}, + {0x0045, 0x007F, 257, -1, 4575, 4578, 4585, 4601, 4605, 4575, 0, {38164, 0, 0, 0}, 66, 66, { 0, 500, 2, 1, 0, ',' }}, + {0x0046, 0x007F, 257, -1, 4609, 4612, 4620, 4639, 4643, 4609, 0, {38235, 0, 0, 0}, 67, 67, { 0, 500, 2, 1, 0, ',' }}, + {0x0047, 0x007F, 257, -1, 4647, 4650, 4659, 4681, 4685, 4647, 0, {38282, 0, 0, 0}, 68, 68, { 0, 500, 2, 1, 0, ',' }}, + {0x0048, 0x007F, 257, -1, 4689, 4692, 4697, 4713, 4717, 4689, 0, {0, 0, 0, 0}, 69, 69, { 0, 500, 2, 1, 0, ',' }}, + {0x0049, 0x007F, 257, -1, 4721, 4724, 4730, 4746, 4750, 4721, 0, {38338, 0, 0, 0}, 70, 70, { 0, 500, 2, 1, 0, ',' }}, + {0x004A, 0x007F, 257, -1, 4754, 4757, 4764, 4783, 4787, 4754, 0, {38403, 0, 0, 0}, 71, 71, { 0, 500, 2, 1, 0, ',' }}, + {0x004B, 0x007F, 257, -1, 1715, 4791, 4799, 4815, 4819, 1715, 0, {38468, 0, 0, 0}, 72, 72, { 0, 500, 2, 1, 0, ',' }}, + {0x004C, 0x007F, 257, -1, 4823, 4826, 4836, 4855, 4859, 4823, 0, {38533, 0, 0, 0}, 73, 73, { 0, 500, 2, 1, 0, ',' }}, + {0x004D, 0x007F, 257, -1, 4863, 4866, 4875, 4897, 4901, 4863, 0, {38577, 0, 0, 0}, 74, 74, { 0, 500, 2, 1, 0, ',' }}, + {0x004E, 0x007F, 257, -1, 4905, 4908, 4916, 4932, 4936, 4905, 0, {38630, 0, 0, 0}, 75, 75, { 0, 500, 2, 1, 0, ',' }}, + {0x0050, 0x007F, 257, -1, 4940, 4943, 4953, 4966, 4970, 4940, 0, {38692, 0, 0, 0}, 76, 76, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x0051, 0x007F, 257, -1, 4974, 4977, 4985, 5010, 5014, 4974, 0, {0, 0, 0, 0}, 77, 77, { 0, 500, 2, 1, 0, ',' }}, + {0x0052, 0x007F, 257, -1, 5018, 5021, 5027, 5035, 5039, 5018, 0, {38724, 0, 0, 0}, 78, 78, { 1252, 20285, 10000, 850, 0, ';' }}, + {0x0053, 0x007F, 257, -1, 5043, 5046, 5052, 5068, 5072, 5043, 0, {38740, 0, 0, 0}, 79, 79, { 0, 500, 2, 1, 0, ',' }}, + {0x0054, 0x007F, 257, -1, 5076, 5079, 5083, 5093, 5097, 5076, 0, {38795, 0, 0, 0}, 80, 80, { 0, 500, 2, 1, 0, ';' }}, + {0x0055, 0x007F, 257, -1, 5101, 5104, 5112, 5131, 5135, 5101, 0, {38841, 0, 0, 0}, 81, 81, { 0, 500, 2, 1, 0, ';' }}, + {0x0056, 0x007F, 257, -1, 5139, 5142, 5151, 5158, 5162, 5139, 0, {36899, 0, 0, 0}, 82, 82, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0057, 0x007F, 257, -1, 5166, 5170, 5178, 5197, 5166, 5166, 0, {0, 0, 0, 0}, 83, 83, { 0, 500, 2, 1, 0, ',' }}, + {0x005B, 0x007F, 257, -1, 5201, 5204, 5212, 5228, 5232, 5201, 0, {38912, 0, 0, 0}, 84, 84, { 0, 500, 2, 1, 0, ';' }}, + {0x005C, 0x007F, 257, -1, 5236, 5240, 5249, 5259, 5236, 5236, 0, {38978, 0, 0, 0}, 85, 85, { 0, 500, 2, 1, 0, ',' }}, + {0x005E, 0x007F, 257, -1, 5, 5263, 5271, 5284, 5288, 5, 0, {39017, 0, 0, 0}, 86, 86, { 0, 500, 2, 1, 0, ';' }}, + {0x005F, 0x007F, 257, -1, 5292, 5296, 5320, 5343, 5292, 5292, 0, {0, 0, 0, 0}, 87, 87, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x0061, 0x007F, 257, -1, 5347, 5350, 5357, 5376, 5380, 5347, 0, {39065, 0, 0, 0}, 88, 88, { 0, 500, 2, 1, 0, ',' }}, + {0x0062, 0x007F, 257, -1, 5384, 5387, 5403, 5414, 5418, 5384, 0, {39115, 0, 0, 0}, 89, 89, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0063, 0x007F, 1024, -1, 5422, 5425, 5432, 5441, 5445, 5422, 0, {0, 0, 0, 0}, 90, 90, { 0, 500, 2, 1, 1, ';' }}, + {0x0064, 0x007F, 257, -1, 5449, 5453, 5453, 5462, 5449, 5449, 0, {39138, 0, 0, 0}, 91, 91, { 1252, 500, 10000, 437, 0, ';' }}, + {0x0067, 0x007F, 257, -1, 5466, 5469, 5475, 5482, 5486, 5466, 0, {0, 0, 0, 0}, 92, 92, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x0068, 0x007F, 257, -1, 5490, 5493, 5493, 5499, 5503, 5490, 0, {0, 0, 0, 0}, 93, 93, { 1252, 37, 10000, 437, 0, ';' }}, + {0x006A, 0x007F, 257, -1, 5507, 5510, 5517, 5532, 5536, 5507, 0, {0, 0, 0, 0}, 94, 94, { 1252, 37, 10000, 437, 0, ';' }}, + {0x006C, 0x007F, 257, -1, 5540, 5544, 5559, 5576, 5540, 5540, 0, {0, 0, 0, 0}, 95, 95, { 1252, 500, 10000, 850, 0, ';' }}, + {0x006E, 0x007F, 257, -1, 5580, 5583, 5597, 5613, 5617, 5580, 0, {39162, 0, 0, 0}, 96, 96, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x006F, 0x007F, 257, -1, 5621, 5624, 5636, 5648, 5652, 5621, 0, {39186, 0, 0, 0}, 97, 97, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x0070, 0x007F, 257, -1, 5656, 5659, 5659, 5664, 5668, 5656, 0, {0, 0, 0, 0}, 98, 98, { 1252, 37, 10000, 437, 0, ';' }}, + {0x0072, 0x007F, 257, -1, 5672, 5675, 5681, 5688, 5692, 5672, 0, {0, 0, 0, 0}, 99, 99, { 0, 500, 2, 1, 0, ';' }}, + {0x0073, 0x007F, 257, -1, 5696, 5699, 5708, 5721, 5725, 5696, 0, {0, 0, 0, 0}, 100, 100, { 0, 500, 2, 1, 0, ';' }}, + {0x0075, 0x007F, 257, -1, 5729, 5733, 5742, 5760, 5729, 5729, 0, {0, 0, 0, 0}, 101, 101, { 1252, 37, 10000, 437, 0, ';' }}, + {0x0077, 0x007F, 257, -1, 5764, 5767, 5774, 5783, 5787, 5764, 0, {0, 0, 0, 0}, 102, 102, { 0, 500, 2, 1, 0, ';' }}, + {0x0078, 0x007F, 257, -1, 5791, 5794, 5805, 5815, 5819, 5791, 0, {39213, 0, 0, 0}, 103, 103, { 0, 500, 2, 1, 0, ';' }}, + {0x007E, 0x007F, 257, -1, 5823, 5826, 5833, 5843, 5847, 5823, 0, {39226, 0, 0, 0}, 104, 104, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x0080, 0x007F, 257, -1, 5851, 5854, 5861, 5878, 5882, 5851, 0, {39246, 0, 0, 0}, 105, 105, { 1256, 20420, 10004, 720, 1, ',' }}, + {0x0084, 0x007F, 257, -1, 5886, 5890, 5903, 5922, 5886, 5886, 0, {39282, 0, 0, 0}, 106, 106, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x0085, 0x007F, 257, -1, 5926, 5930, 5936, 5954, 5926, 5926, 0, {0, 0, 0, 0}, 107, 107, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x0087, 0x007F, 257, -1, 5958, 5961, 5961, 5973, 5977, 5958, 0, {0, 0, 0, 0}, 108, 108, { 1252, 37, 10000, 437, 0, ';' }}, + {0x0091, 0x007F, 257, -1, 5981, 5984, 6000, 6010, 6014, 5981, 0, {39307, 0, 0, 0}, 109, 109, { 1252, 20285, 10000, 850, 0, ';' }}, + {0x0401, 0x0001, 768, 111, 6018, 6024, 6046, 2571, 2575, 2546, 311, {0, 0, 36669, 0}, 110, 110, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x0402, 0x0002, 257, 11, 6110, 6116, 6137, 2611, 2615, 2579, 6175, {36697, 0, 0, 0}, 111, 111, { 1251, 21025, 10007, 866, 0, ';' }}, + {0x0403, 0x0003, 257, 38, 6178, 6184, 6200, 2638, 2642, 2619, 6218, {36739, 0, 0, 0}, 112, 112, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0404, 0x7C04, 257, 126, 6221, 6227, 6249, 6265, 2686, 2690, 6269, {39332, 0, 0, 0}, 113, 113, { 950, 500, 10002, 950, 0, ',' }}, + {0x0405, 0x0005, 257, 29, 6272, 6278, 6301, 2747, 2751, 2728, 6331, {36766, 0, 0, 0}, 114, 114, { 1250, 500, 10029, 852, 0, ';' }}, + {0x0406, 0x0006, 257, 31, 6334, 6340, 6357, 2771, 2775, 2755, 6373, {36792, 0, 0, 0}, 115, 115, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x0407, 0x0007, 257, 30, 6376, 6382, 6399, 2797, 2801, 2779, 6421, {36813, 0, 0, 0}, 116, 116, { 1252, 20273, 10000, 850, 0, ';' }}, + {0x0408, 0x0008, 257, 46, 6424, 6430, 6445, 2831, 2835, 2805, 6477, {36838, 0, 0, 0}, 117, 117, { 1253, 20273, 10006, 737, 0, ';' }}, + {0x0409, 0x0009, 257, 128, 6480, 6486, 6486, 2850, 2854, 2839, 6510, {36880, 0, 0, 0}, 118, 118, { 1252, 37, 10000, 437, 0, ',' }}, + {0x040B, 0x000B, 257, 40, 6513, 6519, 6537, 2903, 2907, 2886, 6551, {36921, 0, 0, 0}, 119, 119, { 1252, 20278, 10000, 850, 0, ';' }}, + {0x040C, 0x000C, 257, 42, 6554, 6560, 6576, 2931, 2935, 2911, 6595, {36946, 0, 0, 0}, 120, 120, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x040D, 0x000D, 257, 55, 6598, 6604, 6620, 2960, 2964, 2939, 6644, {36968, 0, 0, 0}, 121, 121, { 1255, 500, 10005, 862, 1, ',' }}, + {0x040E, 0x000E, 257, 52, 6647, 6653, 6673, 2988, 2992, 2968, 6696, {37005, 0, 0, 0}, 122, 122, { 1250, 500, 10029, 852, 0, ';' }}, + {0x040F, 0x000F, 257, 59, 6699, 6705, 6725, 3019, 3023, 2996, 6745, {37021, 0, 0, 0}, 123, 123, { 1252, 20871, 10079, 850, 0, ';' }}, + {0x0410, 0x0010, 257, 60, 6748, 6754, 6770, 3047, 3051, 3027, 6788, {37041, 0, 0, 0}, 124, 124, { 1252, 20280, 10000, 850, 0, ';' }}, + {0x0411, 0x0011, 257, 63, 6791, 6797, 6814, 3077, 3081, 3055, 6833, {37063, 0, 0, 0}, 125, 125, { 932, 20290, 10001, 932, 0, ',' }}, + {0x0412, 0x0012, 257, 67, 6836, 6842, 6863, 3105, 3109, 3085, 6888, {37090, 0, 0, 0}, 126, 126, { 949, 20833, 10003, 949, 0, ',' }}, + {0x0413, 0x0013, 257, 92, 6891, 6897, 6917, 3133, 3137, 3113, 6940, {37097, 0, 0, 0}, 127, 127, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0414, 0x7C14, 257, 93, 6943, 6949, 6976, 3160, 3164, 3168, 6998, {36792, 0, 0, 0}, 128, 128, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x0415, 0x0015, 257, 101, 7001, 7007, 7023, 3188, 3192, 3171, 7039, {37119, 0, 0, 0}, 129, 129, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x0416, 0x0016, 257, 15, 7042, 7048, 7068, 3221, 3225, 3196, 7088, {37143, 0, 0, 0}, 130, 130, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0417, 0x0017, 257, 21, 7091, 7097, 7119, 3250, 3254, 3229, 314, {37166, 0, 0, 0}, 131, 131, { 1252, 20273, 10000, 850, 0, ';' }}, + {0x0418, 0x0018, 257, 107, 7138, 7144, 7163, 3279, 3283, 3258, 7183, {37186, 0, 0, 0}, 132, 132, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x0419, 0x0019, 257, 109, 7186, 7192, 7209, 3313, 3317, 3287, 7239, {37205, 0, 0, 0}, 133, 133, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x041A, 0x001A, 257, 50, 7242, 7248, 7267, 3342, 3346, 3321, 7287, {37251, 0, 0, 0}, 134, 134, { 1250, 500, 10082, 852, 0, ';' }}, + {0x041B, 0x001B, 257, 115, 7290, 7296, 7314, 3372, 3376, 3350, 7338, {37274, 0, 0, 0}, 135, 135, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x041C, 0x001C, 257, 2, 7341, 7347, 7366, 3398, 3402, 3380, 7384, {37298, 0, 0, 0}, 136, 136, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x041D, 0x001D, 257, 112, 7387, 7393, 7410, 3425, 3429, 3406, 7428, {36792, 0, 0, 0}, 137, 137, { 1252, 20278, 10000, 850, 0, ';' }}, + {0x041E, 0x001E, 512, 120, 7431, 7437, 7453, 3451, 3455, 3433, 7475, {0, 37317, 0, 0}, 138, 138, { 874, 20838, 10021, 874, 0, ',' }}, + {0x041F, 0x001F, 257, 124, 7478, 7484, 7501, 3479, 3483, 3459, 7521, {37348, 0, 0, 0}, 139, 139, { 1254, 20905, 10081, 857, 0, ';' }}, + {0x0420, 0x0020, 257, 100, 7524, 7530, 7546, 3504, 3508, 3487, 7572, {37362, 0, 0, 0}, 140, 140, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x0421, 0x0021, 257, 53, 7575, 7581, 7604, 3536, 3540, 3512, 7626, {37392, 0, 0, 0}, 141, 141, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0422, 0x0022, 257, 127, 7629, 7635, 7655, 3578, 3582, 3544, 7693, {37411, 0, 0, 0}, 142, 142, { 1251, 500, 10017, 866, 0, ';' }}, + {0x0423, 0x0023, 257, 17, 7696, 7702, 7723, 3621, 3625, 3586, 7763, {37457, 0, 0, 0}, 143, 143, { 1251, 500, 10007, 866, 0, ';' }}, + {0x0424, 0x0024, 257, 114, 7766, 7772, 7793, 3656, 3660, 3629, 7819, {37499, 0, 0, 0}, 144, 144, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x0425, 0x0025, 257, 35, 7822, 7828, 7847, 3682, 3686, 3664, 7861, {37521, 0, 0, 0}, 145, 145, { 1257, 500, 10029, 775, 0, ';' }}, + {0x0426, 0x0026, 257, 76, 7864, 7870, 7887, 3711, 3715, 3690, 7907, {37541, 0, 0, 0}, 146, 146, { 1257, 500, 10029, 775, 0, ';' }}, + {0x0427, 0x0027, 257, 74, 7910, 7916, 7939, 3743, 3747, 3719, 7959, {37560, 0, 0, 0}, 147, 147, { 1257, 500, 10029, 775, 0, ';' }}, + {0x0428, 0x7C28, 257, 121, 7962, 7973, 8002, 3773, 3777, 3751, 8038, {0, 0, 0, 0}, 148, 148, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x0429, 0x0029, 257, 58, 8041, 8047, 8062, 3803, 3807, 3781, 8086, {37583, 0, 0, 0}, 149, 149, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x042A, 0x002A, 257, 132, 8089, 8095, 8116, 3840, 3844, 3811, 8144, {37607, 0, 0, 0}, 150, 150, { 1258, 500, 10000, 1258, 0, ',' }}, + {0x042B, 0x002B, 257, 3, 8147, 8153, 8172, 3875, 3879, 3848, 49, {37622, 0, 0, 0}, 151, 151, { 0, 500, 2, 1, 0, ',' }}, + {0x042C, 0x782C, 257, 7, 8206, 8217, 8249, 3910, 3914, 3883, 8275, {37652, 0, 0, 0}, 152, 152, { 1254, 20905, 10081, 857, 0, ';' }}, + {0x042D, 0x002D, 257, 38, 8278, 8284, 8299, 3936, 3940, 3918, 6218, {37671, 0, 0, 0}, 153, 153, { 1252, 500, 2, 850, 0, ';' }}, + {0x042E, 0x002E, 257, 30, 8318, 8325, 8349, 3980, 3944, 3944, 6421, {37691, 0, 0, 0}, 154, 154, { 1252, 870, 10000, 850, 0, ';' }}, + {0x042F, 0x002F, 257, 82, 8377, 8383, 8406, 4019, 4023, 3984, 8450, {37712, 0, 0, 0}, 155, 155, { 1251, 500, 10007, 866, 0, ';' }}, + {0x0430, 0x0030, 257, 134, 8453, 8459, 4045, 4053, 4057, 4027, 8489, {0, 0, 0, 0}, 156, 156, { 0, 500, 2, 1, 0, ';' }}, + {0x0431, 0x0031, 257, 134, 8492, 8498, 4071, 4080, 4084, 4061, 8489, {0, 0, 0, 0}, 157, 157, { 0, 500, 2, 1, 0, ';' }}, + {0x0432, 0x0032, 257, 134, 8520, 8526, 4098, 4107, 4111, 4088, 8489, {0, 0, 0, 0}, 158, 158, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0434, 0x0034, 257, 134, 8548, 8554, 4124, 4133, 4137, 4115, 8489, {0, 0, 0, 0}, 159, 159, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0435, 0x0035, 257, 134, 8575, 8581, 8601, 4157, 4161, 4141, 8489, {37756, 0, 0, 0}, 160, 160, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0436, 0x0036, 257, 134, 8626, 8632, 8657, 4178, 4182, 4165, 8489, {37781, 0, 0, 0}, 161, 161, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0437, 0x0037, 257, 44, 8681, 8687, 8706, 4220, 4224, 4186, 8761, {37801, 0, 0, 0}, 162, 162, { 0, 500, 2, 1, 0, ';' }}, + {0x0438, 0x0038, 257, 41, 8764, 8770, 8794, 4249, 4253, 4228, 8815, {37866, 0, 0, 0}, 163, 163, { 1252, 20277, 10079, 850, 0, ';' }}, + {0x0439, 0x0039, 257, 56, 8818, 8824, 8838, 4285, 4289, 4257, 8872, {37890, 0, 0, 0}, 164, 164, { 0, 500, 2, 1, 0, ',' }}, + {0x043A, 0x003A, 257, 87, 8875, 8881, 8897, 4310, 4314, 4293, 8911, {37943, 0, 0, 0}, 165, 165, { 0, 500, 2, 1, 0, ';' }}, + {0x043B, 0x003B, 257, 93, 8914, 8920, 8943, 4352, 4356, 4318, 6998, {37964, 0, 0, 0}, 166, 166, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x043E, 0x003E, 257, 89, 8968, 8974, 8991, 4408, 4412, 4385, 9016, {38004, 0, 0, 0}, 167, 167, { 1252, 500, 10000, 850, 0, ';' }}, + {0x043F, 0x003F, 257, 69, 9019, 9025, 9045, 4446, 4450, 4416, 9086, {38021, 0, 0, 0}, 168, 168, { 0, 500, 2, 1, 0, ';' }}, + {0x0440, 0x0040, 257, 65, 9089, 9095, 9115, 4481, 4485, 4454, 9155, {38063, 0, 0, 0}, 169, 169, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x0441, 0x0041, 257, 64, 9158, 9164, 9180, 4510, 4514, 4489, 9198, {38103, 0, 0, 0}, 170, 170, { 1252, 500, 10000, 437, 0, ';' }}, + {0x0442, 0x0042, 257, 122, 9201, 9207, 9230, 4541, 4545, 4518, 9258, {38124, 0, 0, 0}, 171, 171, { 1250, 20880, 10029, 852, 0, ';' }}, + {0x0443, 0x7C43, 257, 130, 9261, 9272, 9298, 4567, 4571, 4549, 9322, {38146, 0, 0, 0}, 172, 172, { 1254, 500, 10029, 857, 0, ';' }}, + {0x0445, 0x0045, 257, 56, 9325, 9331, 9346, 4601, 4605, 4575, 8872, {38164, 0, 0, 0}, 173, 173, { 0, 500, 2, 1, 0, ',' }}, + {0x0447, 0x0047, 257, 56, 9377, 9383, 9400, 4681, 4685, 4647, 8872, {38282, 0, 0, 0}, 174, 174, { 0, 500, 2, 1, 0, ',' }}, + {0x0448, 0x0048, 257, 56, 9437, 9443, 9456, 4713, 4717, 4689, 8872, {0, 0, 0, 0}, 175, 175, { 0, 500, 2, 1, 0, ',' }}, + {0x0449, 0x0049, 257, 56, 9487, 9493, 9507, 4746, 4750, 4721, 8872, {38338, 0, 0, 0}, 176, 176, { 0, 500, 2, 1, 0, ',' }}, + {0x044A, 0x004A, 257, 56, 9547, 9553, 9568, 4783, 4787, 4754, 8872, {38403, 0, 0, 0}, 177, 177, { 0, 500, 2, 1, 0, ',' }}, + {0x044B, 0x004B, 257, 56, 9615, 9621, 9637, 4815, 4819, 1715, 8872, {38468, 0, 0, 0}, 178, 178, { 0, 500, 2, 1, 0, ',' }}, + {0x044C, 0x004C, 257, 56, 9668, 9674, 9692, 4855, 4859, 4823, 8872, {38533, 0, 0, 0}, 179, 179, { 0, 500, 2, 1, 0, ',' }}, + {0x044D, 0x004D, 257, 56, 9732, 9738, 9755, 4897, 4901, 4863, 8872, {38577, 0, 0, 0}, 180, 180, { 0, 500, 2, 1, 0, ',' }}, + {0x044E, 0x004E, 257, 56, 9792, 9798, 9814, 4932, 4936, 4905, 8872, {38630, 0, 0, 0}, 181, 181, { 0, 500, 2, 1, 0, ',' }}, + {0x0450, 0x7850, 257, 85, 9845, 9851, 9872, 9900, 4970, 4940, 9904, {38692, 0, 0, 0}, 182, 182, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x0451, 0x0051, 257, 25, 9907, 9913, 9929, 5010, 5014, 4974, 9975, {0, 0, 0, 0}, 183, 183, { 0, 500, 2, 1, 0, ',' }}, + {0x0452, 0x0052, 257, 43, 9978, 9984, 10007, 5035, 5039, 5018, 10034, {38724, 0, 0, 0}, 184, 184, { 1252, 20285, 10000, 850, 0, ';' }}, + {0x0453, 0x0053, 257, 66, 10037, 10043, 10060, 5068, 5072, 5043, 10100, {38740, 0, 0, 0}, 185, 185, { 0, 500, 2, 1, 0, ',' }}, + {0x0454, 0x0054, 257, 70, 10103, 10109, 10120, 5093, 5097, 5076, 10142, {38795, 0, 0, 0}, 186, 186, { 0, 500, 2, 1, 0, ';' }}, + {0x0455, 0x0055, 257, 84, 10145, 10151, 10177, 5131, 5135, 5101, 10217, {38841, 0, 0, 0}, 187, 187, { 0, 500, 2, 1, 0, ';' }}, + {0x0456, 0x0056, 257, 38, 10220, 10226, 10243, 5158, 5162, 5139, 6218, {36899, 0, 0, 0}, 188, 188, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0457, 0x0057, 257, 56, 10260, 10267, 10283, 5197, 5166, 5166, 8872, {0, 0, 0, 0}, 189, 189, { 0, 500, 2, 1, 0, ',' }}, + {0x045B, 0x005B, 257, 73, 10317, 10323, 10343, 5228, 5232, 5201, 10393, {38912, 0, 0, 0}, 190, 190, { 0, 500, 2, 1, 0, ';' }}, + {0x045E, 0x005E, 257, 39, 10396, 10402, 10421, 5284, 5288, 5, 10452, {39017, 0, 0, 0}, 191, 191, { 0, 500, 2, 1, 0, ';' }}, + {0x0461, 0x0061, 257, 94, 10455, 10461, 10476, 5376, 5380, 5347, 10513, {39065, 0, 0, 0}, 192, 192, { 0, 500, 2, 1, 0, ',' }}, + {0x0462, 0x0062, 257, 92, 10516, 10522, 10552, 5414, 5418, 5384, 6940, {39115, 0, 0, 0}, 193, 193, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0463, 0x0063, 1024, 1, 10575, 10581, 10602, 5441, 5445, 5422, 10632, {0, 0, 0, 0}, 194, 194, { 0, 500, 2, 1, 1, ';' }}, + {0x0464, 0x0064, 257, 99, 10635, 10642, 10665, 5462, 5449, 5449, 10686, {39138, 0, 0, 0}, 195, 195, { 1252, 500, 10000, 437, 0, ';' }}, + {0x0468, 0x7C68, 257, 90, 10689, 10700, 10723, 5499, 5503, 5490, 10740, {0, 0, 0, 0}, 196, 196, { 1252, 37, 10000, 437, 0, ';' }}, + {0x046A, 0x006A, 257, 90, 10743, 10749, 10766, 5532, 5536, 5507, 10740, {0, 0, 0, 0}, 197, 197, { 1252, 37, 10000, 437, 0, ';' }}, + {0x046C, 0x006C, 257, 134, 10812, 10819, 5559, 5576, 5540, 5540, 8489, {0, 0, 0, 0}, 198, 198, { 1252, 500, 10000, 850, 0, ';' }}, + {0x046E, 0x006E, 257, 75, 10849, 10855, 10882, 5613, 5617, 5580, 10912, {39162, 0, 0, 0}, 199, 199, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x046F, 0x006F, 257, 45, 10915, 10921, 10945, 5648, 5652, 5621, 10976, {39186, 0, 0, 0}, 200, 200, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x0470, 0x0070, 257, 90, 10979, 10985, 10985, 5664, 5668, 5656, 10740, {0, 0, 0, 0}, 201, 201, { 1252, 37, 10000, 437, 0, ';' }}, + {0x0472, 0x0072, 257, 39, 11000, 11006, 11023, 5688, 5692, 5672, 10452, {0, 0, 0, 0}, 202, 202, { 0, 500, 2, 1, 0, ';' }}, + {0x0473, 0x0073, 257, 39, 11043, 11049, 11069, 11100, 5725, 5696, 10452, {0, 0, 0, 0}, 203, 203, { 0, 500, 2, 1, 0, ';' }}, + {0x0475, 0x0075, 257, 128, 11104, 11111, 11136, 5760, 5729, 5729, 6510, {0, 0, 0, 0}, 204, 204, { 1252, 37, 10000, 437, 0, ';' }}, + {0x0477, 0x0077, 257, 117, 11179, 11185, 11202, 5783, 5787, 5764, 11224, {0, 0, 0, 0}, 205, 205, { 0, 500, 2, 1, 0, ';' }}, + {0x0478, 0x0078, 257, 25, 11227, 11233, 11252, 5815, 5819, 5791, 9975, {39213, 0, 0, 0}, 206, 206, { 0, 500, 2, 1, 0, ';' }}, + {0x047E, 0x007E, 257, 42, 11271, 11277, 11293, 5843, 5847, 5823, 6595, {39226, 0, 0, 0}, 207, 207, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x0480, 0x0080, 257, 25, 11312, 11318, 11333, 5878, 5882, 5851, 9975, {39246, 0, 0, 0}, 208, 208, { 1256, 20420, 10004, 720, 1, ',' }}, + {0x0484, 0x0084, 257, 42, 11363, 11370, 11392, 5922, 5886, 5886, 6595, {39282, 0, 0, 0}, 209, 209, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x0485, 0x0085, 257, 109, 11424, 11431, 11446, 5954, 5926, 5926, 7239, {0, 0, 0, 0}, 210, 210, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x0487, 0x0087, 257, 110, 11485, 11491, 11491, 5973, 5977, 5958, 11512, {0, 0, 0, 0}, 211, 211, { 1252, 37, 10000, 437, 0, ';' }}, + {0x0491, 0x0091, 257, 43, 11515, 11521, 11554, 6010, 6014, 5981, 10034, {39307, 0, 0, 0}, 212, 212, { 1252, 20285, 10000, 850, 0, ';' }}, + {0x0801, 0x0001, 257, 57, 11590, 11596, 11610, 11640, 2575, 2546, 11644, {39339, 0, 0, 0}, 213, 213, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x0803, 0x0403, 257, 38, 11647, 6184, 6200, 11662, 2642, 2619, 6218, {36739, 0, 0, 0}, 214, 214, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0804, 0x0004, 257, 25, 11666, 2654, 11672, 2682, 2686, 2690, 9975, {36759, 0, 0, 0}, 215, 215, { 936, 500, 10008, 936, 0, ',' }}, + {0x0807, 0x0007, 257, 21, 11688, 11694, 11715, 11733, 2801, 2779, 314, {36813, 0, 0, 0}, 216, 216, { 1252, 20273, 10000, 850, 0, ';' }}, + {0x0809, 0x0009, 257, 43, 11737, 11743, 11743, 11768, 2854, 2839, 10034, {36880, 0, 0, 0}, 217, 217, { 1252, 20285, 10000, 850, 0, ',' }}, + {0x080A, 0x000A, 257, 88, 11772, 11778, 11795, 11814, 2882, 2858, 11818, {37041, 0, 0, 0}, 218, 218, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x080C, 0x000C, 257, 10, 11821, 11827, 11844, 11865, 2935, 2911, 11869, {36946, 0, 0, 0}, 219, 219, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x0810, 0x0010, 257, 21, 11872, 11878, 11900, 11920, 3051, 3027, 314, {37041, 0, 0, 0}, 220, 220, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0813, 0x0013, 257, 10, 11924, 11930, 11946, 11967, 3137, 3113, 11869, {37097, 0, 0, 0}, 221, 221, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0814, 0x7814, 257, 93, 11971, 11977, 12004, 12020, 12024, 12028, 6998, {36792, 0, 0, 0}, 222, 222, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x0816, 0x0016, 257, 103, 12031, 12037, 12059, 444, 3225, 3196, 12081, {39371, 0, 0, 0}, 223, 223, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0818, 0x0018, 257, 80, 12084, 12090, 12109, 12138, 3283, 3258, 12142, {37186, 0, 0, 0}, 224, 224, { 1250, 500, 2, 852, 0, ';' }}, + {0x0819, 0x0019, 257, 80, 12145, 12151, 12169, 12201, 3317, 3287, 12142, {37205, 0, 0, 0}, 225, 225, { 1251, 500, 2, 866, 0, ';' }}, + {0x081D, 0x001D, 257, 40, 12205, 12211, 12229, 12247, 3429, 3406, 6551, {36792, 0, 0, 0}, 226, 226, { 1252, 20278, 10000, 850, 0, ';' }}, + {0x0820, 0x0020, 257, 56, 12251, 12257, 12270, 12292, 3508, 3487, 8872, {37362, 0, 0, 0}, 227, 227, { 1256, 500, 2, 720, 1, ';' }}, + {0x082C, 0x742C, 257, 7, 12296, 12307, 8249, 12342, 3914, 3883, 8275, {37652, 0, 0, 0}, 228, 228, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x082E, 0x7C2E, 257, 30, 12346, 12353, 12377, 12403, 12407, 12407, 6421, {39394, 0, 0, 0}, 229, 229, { 1252, 870, 10000, 850, 0, ';' }}, + {0x0832, 0x0032, 257, 16, 12411, 12417, 4098, 12435, 4111, 4088, 12439, {0, 0, 0, 0}, 230, 230, { 1252, 500, 10000, 850, 0, ';' }}, + {0x083B, 0x003B, 257, 112, 12442, 12448, 12471, 12499, 4356, 4318, 7428, {37964, 0, 0, 0}, 231, 231, { 1252, 20278, 10000, 850, 0, ';' }}, + {0x083C, 0x003C, 257, 54, 12503, 12509, 12525, 4377, 4381, 4360, 12541, {37983, 0, 0, 0}, 232, 232, { 1252, 500, 10000, 850, 0, ';' }}, + {0x083E, 0x003E, 257, 13, 12544, 12550, 12565, 12588, 4412, 4385, 12592, {38004, 0, 0, 0}, 233, 233, { 1252, 500, 10000, 850, 0, ';' }}, + {0x0843, 0x7843, 257, 130, 12595, 12606, 9298, 12635, 4571, 4549, 9322, {39417, 0, 0, 0}, 234, 234, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x0845, 0x0045, 257, 9, 12639, 12645, 12665, 12708, 4605, 4575, 12712, {38164, 0, 0, 0}, 235, 235, { 0, 500, 2, 1, 0, ',' }}, + {0x0846, 0x7C46, 257, 100, 12715, 12726, 12753, 12799, 4643, 4609, 7572, {38235, 0, 0, 0}, 236, 236, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x0849, 0x0049, 257, 73, 12803, 12809, 12827, 12864, 4750, 4721, 10393, {38338, 0, 0, 0}, 237, 237, { 0, 500, 2, 1, 0, ';' }}, + {0x0861, 0x0061, 257, 56, 12868, 12874, 12889, 12923, 5380, 5347, 8872, {39065, 0, 0, 0}, 238, 238, { 0, 500, 2, 1, 0, ';' }}, + {0x0873, 0x0073, 257, 37, 12927, 12933, 12952, 5721, 5725, 5696, 12980, {0, 0, 0, 0}, 239, 239, { 0, 500, 2, 1, 0, ';' }}, + {0x0C01, 0x0001, 257, 36, 12983, 12989, 13004, 13028, 2575, 2546, 13032, {39339, 0, 0, 0}, 240, 240, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x0C04, 0x7C04, 257, 48, 13035, 13041, 13084, 13121, 2686, 2690, 13125, {39332, 0, 0, 0}, 241, 241, { 950, 500, 10002, 950, 0, ',' }}, + {0x0C07, 0x0007, 257, 5, 13128, 13134, 13151, 13173, 2801, 2779, 13177, {36813, 0, 0, 0}, 242, 242, { 1252, 20273, 10000, 850, 0, ';' }}, + {0x0C09, 0x0009, 257, 6, 13180, 13186, 13186, 13206, 2854, 2839, 13210, {36880, 0, 0, 0}, 243, 243, { 1252, 500, 10000, 850, 0, ',' }}, + {0x0C0A, 0x000A, 257, 38, 13213, 13219, 13235, 13254, 2882, 2858, 6218, {36899, 0, 0, 0}, 244, 244, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x0C0C, 0x000C, 257, 19, 13258, 13264, 13280, 13299, 2935, 2911, 13303, {36946, 0, 0, 0}, 245, 245, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x0C3B, 0x003B, 257, 40, 13306, 13312, 13336, 13362, 4356, 4318, 6551, {39455, 0, 0, 0}, 246, 246, { 1252, 20278, 10000, 850, 0, ';' }}, + {0x1001, 0x0001, 257, 77, 13366, 13372, 13387, 13415, 2575, 2546, 13419, {39339, 0, 0, 0}, 247, 247, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x1004, 0x0004, 257, 113, 13422, 13428, 13460, 13479, 2686, 2690, 13483, {36759, 0, 0, 0}, 248, 248, { 936, 500, 10008, 936, 0, ',' }}, + {0x1007, 0x0007, 257, 75, 13486, 13492, 13512, 13532, 2801, 2779, 10912, {36813, 0, 0, 0}, 249, 249, { 1252, 20273, 10000, 850, 0, ';' }}, + {0x1009, 0x0009, 257, 19, 13536, 13542, 13542, 13559, 2854, 2839, 13303, {36880, 0, 0, 0}, 250, 250, { 1252, 37, 10000, 850, 0, ',' }}, + {0x100A, 0x000A, 257, 47, 13563, 13569, 13589, 13610, 2882, 2858, 13614, {36899, 0, 0, 0}, 251, 251, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x100C, 0x000C, 257, 21, 13617, 13623, 13644, 13663, 2935, 2911, 314, {36946, 0, 0, 0}, 252, 252, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x101A, 0x001A, 257, 8, 13667, 13673, 13705, 13736, 3346, 3321, 13740, {37251, 0, 0, 0}, 253, 253, { 1250, 870, 10082, 852, 0, ';' }}, + {0x1401, 0x0001, 257, 33, 13743, 13749, 13766, 13798, 2575, 2546, 13802, {39339, 0, 0, 0}, 254, 254, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x1404, 0x7C04, 257, 86, 13805, 13811, 13850, 13887, 2686, 2690, 13891, {39332, 0, 0, 0}, 255, 255, { 950, 500, 10002, 950, 0, ',' }}, + {0x1407, 0x0007, 257, 72, 13894, 13900, 13923, 13947, 2801, 2779, 13951, {36813, 0, 0, 0}, 256, 256, { 1252, 20273, 10000, 850, 0, ';' }}, + {0x1409, 0x0009, 257, 95, 13954, 13960, 13960, 13982, 2854, 2839, 13986, {36880, 0, 0, 0}, 257, 257, { 1252, 500, 10000, 850, 0, ',' }}, + {0x140A, 0x000A, 257, 27, 13989, 13995, 14016, 14038, 2882, 2858, 14042, {36899, 0, 0, 0}, 258, 258, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x140C, 0x000C, 257, 75, 14045, 14051, 14071, 14094, 2935, 2911, 10912, {36946, 0, 0, 0}, 259, 259, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x141A, 0x681A, 257, 8, 14098, 14109, 14147, 14178, 14182, 14186, 13740, {37251, 0, 0, 0}, 260, 260, { 1250, 870, 10082, 852, 0, ';' }}, + {0x1801, 0x0001, 257, 78, 14189, 14195, 14212, 14242, 2575, 2546, 14246, {39339, 0, 0, 0}, 261, 261, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x1809, 0x0009, 257, 54, 14249, 14255, 14255, 14273, 2854, 2839, 12541, {36880, 0, 0, 0}, 262, 262, { 1252, 500, 10000, 850, 0, ',' }}, + {0x180A, 0x000A, 257, 97, 14277, 14283, 14300, 14319, 2882, 2858, 14323, {36899, 0, 0, 0}, 263, 263, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x180C, 0x000C, 257, 79, 14326, 14332, 14348, 14367, 2935, 2911, 14371, {36946, 0, 0, 0}, 264, 264, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x181A, 0x701A, 257, 8, 14374, 14385, 14423, 14475, 14479, 14483, 13740, {37251, 0, 0, 0}, 265, 265, { 1250, 870, 10082, 852, 0, ';' }}, + {0x1C01, 0x0001, 257, 123, 14486, 14492, 14509, 14535, 2575, 2546, 14539, {39339, 0, 0, 0}, 266, 266, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x1C09, 0x0009, 257, 134, 14542, 14548, 14548, 14571, 2854, 2839, 8489, {36880, 0, 0, 0}, 267, 267, { 1252, 500, 10000, 437, 0, ',' }}, + {0x1C0A, 0x000A, 257, 32, 14575, 14581, 14610, 14643, 2882, 2858, 14647, {36899, 0, 0, 0}, 268, 268, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x1C1A, 0x6C1A, 257, 8, 14650, 14661, 14423, 14702, 14479, 14483, 13740, {39477, 0, 0, 0}, 269, 269, { 1251, 21025, 10007, 855, 0, ';' }}, + {0x2001, 0x0001, 257, 96, 14706, 14712, 14726, 14754, 2575, 2546, 14758, {39339, 0, 0, 0}, 270, 270, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x2009, 0x0009, 257, 61, 14761, 14767, 14767, 14785, 2854, 2839, 14789, {36880, 0, 0, 0}, 271, 271, { 1252, 500, 10000, 850, 0, ',' }}, + {0x200A, 0x000A, 257, 131, 14792, 14798, 14818, 14839, 2882, 2858, 14843, {36899, 0, 0, 0}, 272, 272, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x200C, 0x000C, 257, 106, 14846, 14852, 14870, 14894, 2935, 2911, 14898, {36946, 0, 0, 0}, 273, 273, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x201A, 0x641A, 257, 8, 14901, 14912, 14147, 14953, 14182, 14186, 13740, {37712, 0, 0, 0}, 274, 274, { 1251, 870, 10082, 855, 0, ';' }}, + {0x2401, 0x0001, 257, 133, 14957, 14963, 14978, 15006, 2575, 2546, 15010, {39339, 0, 0, 0}, 275, 275, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x240A, 0x000A, 257, 26, 15013, 15019, 15038, 15058, 2882, 2858, 15062, {36899, 0, 0, 0}, 276, 276, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x240C, 0x000C, 257, 20, 15065, 15071, 15097, 15124, 2935, 2911, 15128, {36946, 0, 0, 0}, 277, 277, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x241A, 0x701A, 257, 108, 15131, 15142, 15166, 15194, 14479, 14483, 15198, {37251, 0, 0, 0}, 278, 278, { 1250, 500, 10029, 852, 0, ';' }}, + {0x243B, 0x703B, 257, 40, 15201, 15208, 15229, 15253, 15257, 15257, 6551, {0, 0, 0, 0}, 279, 279, { 1252, 20278, 10000, 850, 0, ';' }}, + {0x2801, 0x0001, 257, 119, 15261, 15267, 15282, 15310, 2575, 2546, 15314, {39339, 0, 0, 0}, 280, 280, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x2809, 0x0009, 257, 18, 15317, 15323, 15323, 15340, 2854, 2839, 15344, {36880, 0, 0, 0}, 281, 281, { 1252, 500, 10000, 850, 0, ',' }}, + {0x280A, 0x000A, 257, 98, 15347, 15353, 15368, 15385, 2882, 2858, 15389, {36899, 0, 0, 0}, 282, 282, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x280C, 0x000C, 257, 116, 15392, 15398, 15415, 15437, 2935, 2911, 15441, {36946, 0, 0, 0}, 283, 283, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x281A, 0x6C1A, 257, 108, 15444, 15455, 15166, 15482, 14479, 14483, 15198, {39477, 0, 0, 0}, 284, 284, { 1251, 21025, 10007, 855, 0, ';' }}, + {0x2C01, 0x0001, 257, 62, 15486, 15492, 15508, 15538, 2575, 2546, 15542, {39339, 0, 0, 0}, 285, 285, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x2C09, 0x0009, 257, 125, 15545, 15551, 15551, 15579, 2854, 2839, 15583, {36880, 0, 0, 0}, 286, 286, { 1252, 500, 10000, 850, 0, ',' }}, + {0x2C0A, 0x000A, 257, 4, 15586, 15592, 15612, 15633, 2882, 2858, 15637, {36899, 0, 0, 0}, 287, 287, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x2C0C, 0x000C, 257, 24, 15640, 15646, 15664, 15685, 2935, 2911, 15689, {36946, 0, 0, 0}, 288, 288, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x2C1A, 0x701A, 257, 81, 15692, 15703, 15731, 15764, 14479, 14483, 15768, {37251, 0, 0, 0}, 289, 289, { 1250, 500, 10029, 852, 0, ';' }}, + {0x3001, 0x0001, 257, 71, 15771, 15777, 15794, 15822, 2575, 2546, 15826, {39339, 0, 0, 0}, 290, 290, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x3009, 0x0009, 257, 135, 15829, 15835, 15835, 15854, 2854, 2839, 15858, {36880, 0, 0, 0}, 291, 291, { 1252, 500, 10000, 437, 0, ',' }}, + {0x300A, 0x000A, 257, 34, 15861, 15867, 15885, 15904, 2882, 2858, 15908, {36899, 0, 0, 0}, 292, 292, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x300C, 0x000C, 257, 22, 15911, 15917, 15943, 15972, 2935, 2911, 15976, {36946, 0, 0, 0}, 293, 293, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x301A, 0x6C1A, 257, 81, 15979, 15990, 15731, 16021, 14479, 14483, 15768, {39477, 0, 0, 0}, 294, 294, { 1251, 21025, 10007, 855, 0, ';' }}, + {0x3401, 0x0001, 257, 68, 16025, 16031, 16047, 16077, 2575, 2546, 16081, {39339, 0, 0, 0}, 295, 295, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x3409, 0x0009, 257, 99, 16084, 16090, 16090, 16112, 2854, 2839, 10686, {36880, 0, 0, 0}, 296, 296, { 1252, 500, 10000, 437, 0, ',' }}, + {0x340A, 0x000A, 257, 23, 16116, 16122, 16138, 16155, 2882, 2858, 16159, {36899, 0, 0, 0}, 297, 297, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x340C, 0x000C, 257, 83, 16162, 16168, 16182, 16199, 2935, 2911, 16203, {36946, 0, 0, 0}, 298, 298, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x3801, 0x0001, 257, 0, 16206, 16212, 16242, 16306, 2575, 2546, 16310, {39339, 0, 0, 0}, 299, 299, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x380A, 0x000A, 257, 129, 16313, 16319, 16337, 16356, 2882, 2858, 16360, {36899, 0, 0, 0}, 300, 300, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x380C, 0x000C, 257, 78, 16363, 16369, 16386, 16404, 2935, 2911, 14246, {36946, 0, 0, 0}, 301, 301, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x3C01, 0x0001, 257, 12, 16408, 16414, 16431, 16463, 2575, 2546, 16467, {39339, 0, 0, 0}, 302, 302, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x3C09, 0x0009, 257, 48, 16470, 16476, 16476, 16506, 2854, 2839, 13125, {36880, 0, 0, 0}, 303, 303, { 1252, 500, 10000, 850, 0, ',' }}, + {0x3C0A, 0x000A, 257, 104, 16510, 16516, 16535, 16555, 2882, 2858, 16559, {36899, 0, 0, 0}, 304, 304, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x3C0C, 0x000C, 257, 51, 16562, 16568, 16583, 16602, 2935, 2911, 16606, {36946, 0, 0, 0}, 305, 305, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x4001, 0x0001, 257, 105, 16609, 16615, 16630, 16654, 2575, 2546, 16658, {39339, 0, 0, 0}, 306, 306, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x4009, 0x0009, 257, 56, 16661, 16667, 16667, 16683, 2854, 2839, 8872, {36880, 0, 0, 0}, 307, 307, { 1252, 37, 10000, 437, 0, ',' }}, + {0x400A, 0x000A, 257, 14, 16687, 16693, 16711, 16730, 2882, 2858, 16734, {36899, 0, 0, 0}, 308, 308, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x4409, 0x0009, 257, 89, 16737, 16743, 16743, 16762, 2854, 2839, 9016, {36880, 0, 0, 0}, 309, 309, { 1252, 37, 10000, 437, 0, ',' }}, + {0x440A, 0x000A, 257, 118, 16766, 16772, 16794, 16817, 2882, 2858, 16821, {36899, 0, 0, 0}, 310, 310, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x4809, 0x0009, 257, 113, 16824, 16830, 16830, 16850, 2854, 2839, 13483, {36880, 0, 0, 0}, 311, 311, { 1252, 37, 10000, 437, 0, ',' }}, + {0x480A, 0x000A, 257, 49, 16854, 16860, 16879, 16899, 2882, 2858, 16903, {36899, 0, 0, 0}, 312, 312, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x4C0A, 0x000A, 257, 91, 16906, 16912, 16932, 16953, 2882, 2858, 16957, {36899, 0, 0, 0}, 313, 313, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x500A, 0x000A, 257, 102, 16960, 16966, 16988, 17011, 2882, 2858, 17015, {36899, 0, 0, 0}, 314, 314, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x540A, 0x000A, 257, 128, 17018, 17024, 17048, 17074, 2882, 2858, 6510, {36899, 0, 0, 0}, 315, 315, { 1252, 20284, 10000, 850, 0, ',' }}, + {0x5C0A, 0x000A, 257, 28, 17078, 17084, 17099, 17115, 2882, 2858, 17119, {36899, 0, 0, 0}, 316, 316, { 1252, 20284, 10000, 850, 0, ';' }}, + {0x641A, 0x781A, 257, -1, 17122, 17130, 17149, 14953, 14182, 14186, 0, {37712, 0, 0, 0}, 317, 317, { 1251, 870, 10082, 855, 0, ';' }}, + {0x681A, 0x781A, 257, -1, 17158, 17166, 17149, 14178, 14182, 14186, 0, {37251, 0, 0, 0}, 318, 318, { 1250, 870, 10082, 852, 0, ';' }}, + {0x6C1A, 0x7C1A, 257, -1, 17182, 17190, 17209, 15482, 14479, 14483, 0, {39477, 0, 0, 0}, 319, 319, { 1251, 21025, 10007, 855, 0, ';' }}, + {0x701A, 0x7C1A, 257, -1, 17222, 17230, 17209, 15194, 14479, 14483, 0, {37251, 0, 0, 0}, 320, 320, { 1250, 500, 10029, 852, 0, ';' }}, + {0x703B, 0x003B, 257, -1, 15257, 17246, 17257, 15253, 15257, 15257, 0, {0, 0, 0, 0}, 321, 321, { 1252, 20278, 10000, 850, 0, ';' }}, + {0x742C, 0x002C, 257, -1, 17272, 17280, 3898, 12342, 3914, 3883, 0, {37652, 0, 0, 0}, 322, 322, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x7804, 0x007F, 257, -1, 2690, 2654, 2675, 2682, 2686, 2690, 0, {36759, 0, 0, 0}, 323, 323, { 936, 500, 10008, 936, 0, ',' }}, + {0x7814, 0x0014, 257, -1, 12028, 17303, 17321, 12020, 12024, 12028, 0, {36792, 0, 0, 0}, 324, 324, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x781A, 0x007F, 257, -1, 14186, 17329, 17149, 14178, 14182, 14186, 0, {37251, 0, 0, 0}, 325, 325, { 1250, 870, 10082, 852, 0, ';' }}, + {0x782C, 0x002C, 257, -1, 17337, 17345, 3898, 3910, 3914, 3883, 0, {37652, 0, 0, 0}, 326, 326, { 1254, 20905, 10081, 857, 0, ';' }}, + {0x7843, 0x0043, 257, -1, 17365, 17373, 4558, 12635, 4571, 4549, 0, {39417, 0, 0, 0}, 327, 327, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x7850, 0x0050, 257, -1, 17390, 17398, 4953, 9900, 4970, 4940, 0, {38692, 0, 0, 0}, 328, 328, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x7C04, 0x7804, 257, -1, 17419, 6227, 2675, 6265, 2686, 2690, 0, {39332, 0, 0, 0}, 329, 329, { 950, 500, 10002, 950, 0, ',' }}, + {0x7C04, 0x7C04, 257, -1, 17427, 17434, 2675, 6265, 2686, 2690, 0, {39332, 0, 0, 0}, 330, 330, { 950, 500, 10002, 950, 0, ',' }}, + {0x7C14, 0x0014, 257, -1, 3168, 17463, 17481, 3160, 3164, 3168, 0, {36792, 0, 0, 0}, 331, 331, { 1252, 20277, 10000, 850, 0, ';' }}, + {0x7C1A, 0x007F, 257, -1, 14483, 17495, 17209, 17503, 14479, 14483, 0, {39477, 0, 0, 0}, 332, 332, { 1250, 500, 10029, 852, 0, ';' }}, + {0x7C28, 0x0028, 257, -1, 17507, 17515, 3760, 3773, 3777, 3751, 0, {0, 0, 0, 0}, 333, 333, { 1251, 20880, 10007, 866, 0, ';' }}, + {0x7C2E, 0x002E, 257, -1, 12407, 17532, 17546, 12403, 12407, 12407, 0, {39394, 0, 0, 0}, 334, 334, { 1252, 870, 10000, 850, 0, ';' }}, + {0x7C43, 0x0043, 257, -1, 17563, 17571, 4558, 4567, 4571, 4549, 0, {38146, 0, 0, 0}, 335, 335, { 1254, 500, 10029, 857, 0, ';' }}, + {0x7C46, 0x0046, 257, -1, 17585, 17593, 4620, 12799, 4643, 4609, 0, {38235, 0, 0, 0}, 336, 336, { 1256, 20420, 10004, 720, 1, ';' }}, + {0x7C5F, 0x005F, 257, -1, 17610, 17619, 5320, 5343, 5292, 5292, 0, {0, 0, 0, 0}, 337, 337, { 1252, 20297, 10000, 850, 0, ';' }}, + {0x7C68, 0x0068, 257, -1, 17651, 17659, 5493, 5499, 5503, 5490, 0, {0, 0, 0, 0}, 338, 338, { 1252, 37, 10000, 437, 0, ';' }} +}; + + +static const CultureInfoNameEntry culture_name_entries [] = { + {4165, 53}, /* af */ + {17673, 161}, /* af-za */ + {5, 86}, /* am */ + {17679, 191}, /* am-et */ + {2546, 0}, /* ar */ + {17685, 299}, /* ar-ae */ + {17691, 302}, /* ar-bh */ + {17697, 254}, /* ar-dz */ + {17703, 240}, /* ar-eg */ + {17709, 213}, /* ar-iq */ + {17715, 285}, /* ar-jo */ + {17721, 295}, /* ar-kw */ + {17727, 290}, /* ar-lb */ + {17733, 247}, /* ar-ly */ + {17739, 261}, /* ar-ma */ + {17745, 270}, /* ar-om */ + {17751, 306}, /* ar-qa */ + {17757, 110}, /* ar-sa */ + {17763, 280}, /* ar-sy */ + {17769, 266}, /* ar-tn */ + {17775, 275}, /* ar-ye */ + {4863, 74}, /* as */ + {17781, 180}, /* as-in */ + {3883, 44}, /* az */ + {17787, 322}, /* az-cyrl */ + {17795, 228}, /* az-cyrl-az */ + {17806, 326}, /* az-latn */ + {17814, 152}, /* az-latn-az */ + {3586, 35}, /* be */ + {17825, 143}, /* be-by */ + {2579, 1}, /* bg */ + {17831, 111}, /* bg-bg */ + {4575, 66}, /* bn */ + {17837, 235}, /* bn-bd */ + {17843, 173}, /* bn-in */ + {4974, 77}, /* bo */ + {17849, 183}, /* bo-cn */ + {5823, 104}, /* br */ + {17855, 207}, /* br-fr */ + {14186, 325}, /* bs */ + {17861, 317}, /* bs-cyrl */ + {17869, 274}, /* bs-cyrl-ba */ + {17880, 318}, /* bs-latn */ + {17888, 260}, /* bs-latn-ba */ + {2619, 2}, /* ca */ + {17899, 112}, /* ca-es */ + {17905, 214}, /* ca-es-valencia */ + {5236, 85}, /* chr */ + {2728, 5}, /* cs */ + {17920, 114}, /* cs-cz */ + {5018, 78}, /* cy */ + {17926, 184}, /* cy-gb */ + {2755, 6}, /* da */ + {17932, 115}, /* da-dk */ + {2779, 7}, /* de */ + {17938, 242}, /* de-at */ + {17944, 216}, /* de-ch */ + {17950, 116}, /* de-de */ + {17956, 256}, /* de-li */ + {17962, 249}, /* de-lu */ + {12407, 334}, /* dsb */ + {17968, 229}, /* dsb-de */ + {2805, 8}, /* el */ + {17975, 117}, /* el-gr */ + {2839, 9}, /* en */ + {17981, 243}, /* en-au */ + {17987, 281}, /* en-bz */ + {17993, 250}, /* en-ca */ + {17999, 217}, /* en-gb */ + {18005, 303}, /* en-hk */ + {18011, 262}, /* en-ie */ + {18017, 307}, /* en-in */ + {18023, 271}, /* en-jm */ + {18029, 309}, /* en-my */ + {18035, 257}, /* en-nz */ + {18041, 296}, /* en-ph */ + {18047, 311}, /* en-sg */ + {18053, 286}, /* en-tt */ + {18059, 118}, /* en-us */ + {18065, 267}, /* en-za */ + {18071, 291}, /* en-zw */ + {2858, 10}, /* es */ + {18077, 287}, /* es-ar */ + {18083, 308}, /* es-bo */ + {18089, 297}, /* es-cl */ + {18095, 276}, /* es-co */ + {18101, 258}, /* es-cr */ + {18107, 316}, /* es-cu */ + {18113, 268}, /* es-do */ + {18119, 292}, /* es-ec */ + {18125, 244}, /* es-es */ + {18131, 251}, /* es-gt */ + {18137, 312}, /* es-hn */ + {18143, 218}, /* es-mx */ + {18149, 313}, /* es-ni */ + {18155, 263}, /* es-pa */ + {18161, 282}, /* es-pe */ + {18167, 314}, /* es-pr */ + {18173, 304}, /* es-py */ + {18179, 310}, /* es-sv */ + {18185, 315}, /* es-us */ + {18191, 300}, /* es-uy */ + {18197, 272}, /* es-ve */ + {3664, 37}, /* et */ + {18203, 145}, /* et-ee */ + {3918, 45}, /* eu */ + {18209, 153}, /* eu-es */ + {3781, 41}, /* fa */ + {18215, 149}, /* fa-ir */ + {5466, 92}, /* ff */ + {2886, 11}, /* fi */ + {18221, 119}, /* fi-fi */ + {5449, 91}, /* fil */ + {18227, 195}, /* fil-ph */ + {4228, 55}, /* fo */ + {18234, 163}, /* fo-fo */ + {2911, 12}, /* fr */ + {18240, 219}, /* fr-be */ + {18246, 245}, /* fr-ca */ + {18252, 277}, /* fr-cd */ + {18258, 252}, /* fr-ch */ + {18264, 293}, /* fr-ci */ + {18270, 288}, /* fr-cm */ + {18276, 120}, /* fr-fr */ + {18282, 305}, /* fr-ht */ + {18288, 259}, /* fr-lu */ + {18294, 301}, /* fr-ma */ + {18300, 264}, /* fr-mc */ + {18306, 298}, /* fr-ml */ + {18312, 273}, /* fr-re */ + {18318, 283}, /* fr-sn */ + {5384, 89}, /* fy */ + {18324, 193}, /* fy-nl */ + {4360, 59}, /* ga */ + {18330, 232}, /* ga-ie */ + {5981, 109}, /* gd */ + {18336, 212}, /* gd-gb */ + {5139, 82}, /* gl */ + {18342, 188}, /* gl-es */ + {5886, 106}, /* gsw */ + {18348, 209}, /* gsw-fr */ + {4647, 68}, /* gu */ + {18355, 174}, /* gu-in */ + {5490, 93}, /* ha */ + {18361, 338}, /* ha-latn */ + {18369, 196}, /* ha-latn-ng */ + {5729, 101}, /* haw */ + {18380, 204}, /* haw-us */ + {2939, 13}, /* he */ + {18387, 121}, /* he-il */ + {4257, 56}, /* hi */ + {18393, 164}, /* hi-in */ + {3321, 26}, /* hr */ + {18399, 253}, /* hr-ba */ + {18405, 134}, /* hr-hr */ + {3944, 46}, /* hsb */ + {18411, 154}, /* hsb-de */ + {2968, 14}, /* hu */ + {18418, 122}, /* hu-hu */ + {3848, 43}, /* hy */ + {18424, 151}, /* hy-am */ + {3512, 33}, /* id */ + {18430, 141}, /* id-id */ + {5656, 98}, /* ig */ + {18436, 201}, /* ig-ng */ + {5791, 103}, /* ii */ + {18442, 206}, /* ii-cn */ + {2996, 15}, /* is */ + {18448, 123}, /* is-is */ + {3027, 16}, /* it */ + {18454, 220}, /* it-ch */ + {18460, 124}, /* it-it */ + {3055, 17}, /* ja */ + {18466, 125}, /* ja-jp */ + {4186, 54}, /* ka */ + {18472, 162}, /* ka-ge */ + {4416, 61}, /* kk */ + {18478, 168}, /* kk-kz */ + {5621, 97}, /* kl */ + {18484, 200}, /* kl-gl */ + {5043, 79}, /* km */ + {18490, 185}, /* km-kh */ + {1715, 72}, /* kn */ + {18496, 178}, /* kn-in */ + {3085, 18}, /* ko */ + {18502, 126}, /* ko-kr */ + {5166, 83}, /* kok */ + {18508, 189}, /* kok-in */ + {4454, 62}, /* ky */ + {18515, 169}, /* ky-kg */ + {5580, 96}, /* lb */ + {18521, 199}, /* lb-lu */ + {5076, 80}, /* lo */ + {18527, 186}, /* lo-la */ + {3719, 39}, /* lt */ + {18533, 147}, /* lt-lt */ + {3690, 38}, /* lv */ + {18539, 146}, /* lv-lv */ + {3984, 47}, /* mk */ + {18545, 155}, /* mk-mk */ + {4823, 73}, /* ml */ + {18551, 179}, /* ml-in */ + {4940, 76}, /* mn */ + {18557, 328}, /* mn-cyrl */ + {18565, 182}, /* mn-mn */ + {4905, 75}, /* mr */ + {18571, 181}, /* mr-in */ + {4385, 60}, /* ms */ + {18577, 233}, /* ms-bn */ + {18583, 167}, /* ms-my */ + {4293, 57}, /* mt */ + {18589, 165}, /* mt-mt */ + {5101, 81}, /* my */ + {18595, 187}, /* my-mm */ + {3168, 331}, /* nb */ + {18601, 128}, /* nb-no */ + {5347, 88}, /* ne */ + {18607, 238}, /* ne-in */ + {18613, 192}, /* ne-np */ + {3113, 19}, /* nl */ + {18619, 221}, /* nl-be */ + {18625, 127}, /* nl-nl */ + {12028, 324}, /* nn */ + {18631, 222}, /* nn-no */ + {3141, 20}, /* no */ + {5540, 95}, /* nso */ + {18637, 198}, /* nso-za */ + {5672, 99}, /* om */ + {18644, 202}, /* om-et */ + {4689, 69}, /* or */ + {18650, 175}, /* or-in */ + {4609, 67}, /* pa */ + {18656, 336}, /* pa-arab */ + {18664, 236}, /* pa-arab-pk */ + {3171, 21}, /* pl */ + {18675, 129}, /* pl-pl */ + {5422, 90}, /* ps */ + {18681, 194}, /* ps-af */ + {3196, 22}, /* pt */ + {18687, 130}, /* pt-br */ + {18693, 223}, /* pt-pt */ + {3229, 23}, /* rm */ + {18699, 131}, /* rm-ch */ + {3258, 24}, /* ro */ + {18705, 224}, /* ro-md */ + {18711, 132}, /* ro-ro */ + {3287, 25}, /* ru */ + {18717, 225}, /* ru-md */ + {18723, 133}, /* ru-ru */ + {5958, 108}, /* rw */ + {18729, 211}, /* rw-rw */ + {5926, 107}, /* sah */ + {18735, 210}, /* sah-ru */ + {4318, 58}, /* se */ + {18742, 246}, /* se-fi */ + {18748, 166}, /* se-no */ + {18754, 231}, /* se-se */ + {5201, 84}, /* si */ + {18760, 190}, /* si-lk */ + {3350, 27}, /* sk */ + {18766, 135}, /* sk-sk */ + {3629, 36}, /* sl */ + {18772, 144}, /* sl-si */ + {15257, 321}, /* smn */ + {18778, 279}, /* smn-fi */ + {5764, 102}, /* so */ + {18785, 205}, /* so-so */ + {3380, 28}, /* sq */ + {18791, 136}, /* sq-al */ + {14483, 332}, /* sr */ + {18797, 319}, /* sr-cyrl */ + {18805, 269}, /* sr-cyrl-ba */ + {18816, 294}, /* sr-cyrl-me */ + {18827, 284}, /* sr-cyrl-rs */ + {18838, 320}, /* sr-latn */ + {18846, 265}, /* sr-latn-ba */ + {18857, 289}, /* sr-latn-me */ + {18868, 278}, /* sr-latn-rs */ + {4027, 48}, /* st */ + {18879, 156}, /* st-za */ + {3406, 29}, /* sv */ + {18885, 226}, /* sv-fi */ + {18891, 137}, /* sv-se */ + {4489, 63}, /* sw */ + {18897, 170}, /* sw-ke */ + {4721, 70}, /* ta */ + {18903, 176}, /* ta-in */ + {18909, 237}, /* ta-lk */ + {4754, 71}, /* te */ + {18915, 177}, /* te-in */ + {3751, 40}, /* tg */ + {18921, 333}, /* tg-cyrl */ + {18929, 148}, /* tg-cyrl-tj */ + {3433, 30}, /* th */ + {18940, 138}, /* th-th */ + {5696, 100}, /* ti */ + {18946, 239}, /* ti-er */ + {18952, 203}, /* ti-et */ + {4518, 64}, /* tk */ + {18958, 171}, /* tk-tm */ + {4088, 50}, /* tn */ + {18964, 230}, /* tn-bw */ + {18970, 158}, /* tn-za */ + {3459, 31}, /* tr */ + {18976, 139}, /* tr-tr */ + {4061, 49}, /* ts */ + {18982, 157}, /* ts-za */ + {5292, 87}, /* tzm */ + {18988, 337}, /* tzm-latn */ + {5851, 105}, /* ug */ + {18997, 208}, /* ug-cn */ + {3544, 34}, /* uk */ + {19003, 142}, /* uk-ua */ + {3487, 32}, /* ur */ + {19009, 227}, /* ur-in */ + {19015, 140}, /* ur-pk */ + {4549, 65}, /* uz */ + {19021, 327}, /* uz-cyrl */ + {19029, 234}, /* uz-cyrl-uz */ + {19040, 335}, /* uz-latn */ + {19048, 172}, /* uz-latn-uz */ + {3811, 42}, /* vi */ + {19059, 150}, /* vi-vn */ + {4115, 51}, /* xh */ + {19065, 159}, /* xh-za */ + {5507, 94}, /* yo */ + {19071, 197}, /* yo-ng */ + {2690, 323}, /* zh */ + {19077, 4}, /* zh-chs */ + {19084, 330}, /* zh-cht */ + {19091, 215}, /* zh-cn */ + {19097, 3}, /* zh-hans */ + {19105, 329}, /* zh-hant */ + {19113, 241}, /* zh-hk */ + {19119, 255}, /* zh-mo */ + {19125, 248}, /* zh-sg */ + {19131, 113}, /* zh-tw */ + {4141, 52}, /* zu */ + {19137, 160} /* zu-za */ +}; + + +static const RegionInfoEntry region_entries [] = { + { 224,16310,13028,13028,19143,19164,2487,19211,19215,19243}, + { 3,10632,19267,19267,19271,19283,2158,19302,19306,19321}, + { 6,7384,19334,19334,19338,19346,1718,19356,19360,19373}, + { 7,49,14242,14242,19387,19395,1856,19412,19416,19430}, + { 11,15637,13798,13798,19456,19456,1462,15310,19466,19481}, + { 14,13177,19496,19496,19500,19508,1357,19520,19524,19524}, + { 12,13210,19529,19529,19533,19533,1462,19543,19547,19547}, + { 5,8275,3910,3910,19565,19576,2221,19588,19592,19610}, + { 25,13740,19630,19630,19634,19655,2341,19675,19679,19715}, + { 23,12712,19735,19735,19739,19750,2304,19775,19779,19796}, + { 21,11869,3621,3621,19837,19845,1357,19520,19524,19854}, + { 35,6175,2611,2611,19859,19868,1339,19885,19889,19903}, + { 17,16467,19929,19929,19933,19941,2501,19956,19960,19975}, + { 37,12592,19999,19999,20003,20003,1462,20010,20014,20028}, + { 26,16734,20041,20041,20045,20045,2527,5010,20053,20072}, + { 32,7088,20082,20082,20086,20093,1606,20100,20104,20119}, + { 19,12439,20135,20135,20139,0,2262,20148,20152,0}, + { 29,7763,20167,20167,20171,20179,1766,20196,20200,20217}, + { 24,15344,20249,20249,20253,20253,1462,20260,20264,20264}, + { 39,13303,20278,20278,20282,20282,1462,20289,20293,20309}, + { 44,15128,20325,20325,20329,20346,2420,20361,20365,20381}, + { 223,314,20397,20397,20401,20413,1613,1613,20420,20432}, + { 119,15976,20446,20446,20450,20450,2448,20467,20471,20494}, + { 46,16159,20512,20512,20516,20516,1462,20522,20526,20539}, + { 49,15689,20552,20552,20556,20565,2462,20574,20578,20604}, + { 45,9975,20621,20621,20625,20631,1378,20650,20654,20667}, + { 51,15062,20686,20686,20690,20690,1462,20699,20703,20718}, + { 54,14042,20734,20734,20738,20738,2359,20749,20753,20772}, + { 56,17119,20793,20793,20797,20797,1462,20802,20806,20817}, + { 75,6331,20829,20829,20833,20848,1381,20866,20870,20892}, + { 94,6421,2797,2797,20907,20915,1357,19520,19524,19524}, + { 61,6373,20927,20927,20931,20939,1409,20947,20951,20964}, + { 65,14647,20976,20976,20980,20999,2387,21021,21025,21040}, + { 4,13802,21056,21056,21060,21068,2344,21083,21087,21102}, + { 66,15908,21126,21126,21130,21130,1462,21138,21142,21152}, + { 70,7861,17074,17074,21174,21182,1357,19520,19524,19854}, + { 67,13032,21188,21188,21192,21198,2315,21205,21209,21224}, + { 71,12980,21242,21242,21246,21254,2169,21267,21271,0}, + { 217,6218,2878,2878,21286,21292,1357,19520,19524,19854}, + { 73,10452,21300,21300,21304,21313,2144,21329,21333,21348}, + { 77,6551,2903,2903,21374,21382,1357,19520,19524,19854}, + { 81,8815,16404,16404,21388,21402,1724,20947,20951,21411}, + { 84,6595,2931,2931,21424,21424,1357,19520,19524,19854}, + { 242,10034,21431,21431,21435,21450,2037,21467,21471,21485}, + { 88,8761,21498,21498,21502,21510,1894,21541,21545,21559}, + { 93,10976,21594,21594,21598,21608,1409,20947,20951,21625}, + { 98,6477,21645,21645,21649,21656,1357,19520,19524,21669}, + { 99,13614,21678,21678,21682,21682,2339,21692,21696,21715}, + { 104,13125,21723,21723,21727,21747,2325,21775,21779,21796}, + { 106,16903,21803,21803,21807,21807,2260,21816,21820,21837}, + { 108,7287,3342,3342,21856,21864,2217,2217,21873,21887}, + { 103,16606,21901,21901,21905,21911,2515,21918,21922,21937}, + { 109,6696,2988,2988,21955,21963,1520,21977,21981,21998}, + { 111,7626,22012,22012,3526,3526,1759,22016,22020,22038}, + { 68,12541,22055,22055,22059,22067,1357,19520,19524,19524}, + { 117,6644,22073,22073,22077,22084,1511,22095,22099,22118}, + { 113,8872,3536,3536,22132,22138,1939,22151,22155,22168}, + { 121,11644,22203,22203,22207,22212,2248,22225,22229,22241}, + { 116,8086,22263,22263,22267,22272,1843,22283,22287,22300}, + { 110,6745,3019,3019,22320,22328,1523,1523,22336,22353}, + { 118,6788,3047,3047,22369,22375,1357,19520,19524,19854}, + { 124,14789,22382,22382,22386,22386,1462,22394,22398,22398}, + { 126,15542,22414,22414,22418,22425,2452,22438,22442,22458}, + { 122,6833,3077,3077,22480,22486,1537,22493,22497,22510}, + { 129,9198,22520,22520,22524,22524,1991,22530,22534,22550}, + { 130,9155,22568,22568,22572,22583,1967,22604,22608,22623}, + { 40,10100,5068,5068,22653,22662,2040,22684,22688,22703}, + { 134,6888,3105,3105,22737,22749,1541,22762,22766,22783}, + { 136,16081,22800,22800,22804,22811,2477,22824,22828,22842}, + { 137,9086,22864,22864,22868,22879,1946,22898,22902,22920}, + { 138,10142,5093,5093,22954,5083,2044,22959,22963,22975}, + { 139,15826,22995,22995,22999,23007,2467,23018,23022,23037}, + { 145,13951,23059,23059,23063,23063,1613,1613,20420,23077}, + { 42,10393,23095,23095,23099,23109,2136,23141,23145,23162}, + { 141,7959,23210,23210,23214,23224,1357,19520,19524,23232}, + { 147,10912,23238,23238,23242,23253,1357,19520,19524,19524}, + { 140,7907,23265,23265,23269,23276,1357,19520,19524,23284}, + { 148,13419,23289,23289,23293,23299,2329,23310,23314,23327}, + { 159,14246,4932,4932,23347,23355,2363,2497,23368,23384}, + { 158,14371,23404,23404,23408,23408,1357,19520,19524,19854}, + { 152,12142,23415,23415,23419,23427,2260,23445,23449,23462}, + { 270,15768,23478,23478,23482,23493,1357,19520,19524,23511}, + { 19618,8450,23516,23516,23520,23530,1885,23516,23551,23568}, + { 157,16203,23600,23600,23604,23604,2448,20467,20471,20494}, + { 27,10217,23609,23609,23613,5112,2094,23629,23633,23646}, + { 154,9904,23677,23677,23681,23690,2231,23703,23707,23724}, + { 151,13891,23737,23737,23741,23757,2354,23785,23789,23805}, + { 163,8911,4310,4310,23815,23815,1357,19520,19524,23821}, + { 166,11818,23826,23826,23830,23837,1462,23845,23849,23862}, + { 167,9016,23876,23876,23880,23880,1943,23889,23893,23911}, + { 175,10740,23928,23928,23932,23940,2165,23949,23953,23968}, + { 182,16957,23974,23974,23978,23978,2530,23988,23992,24012}, + { 176,6940,3133,3133,24035,24047,1357,19520,19524,19524}, + { 177,6998,3160,3160,24057,24064,1724,24070,24074,24090}, + { 178,10513,24104,24104,24108,24114,2235,24130,24134,24149}, + { 183,13986,24190,24190,24194,24194,1462,24206,24210,24210}, + { 164,14758,24229,24229,24233,24238,2396,24249,24253,24264}, + { 192,14323,4639,4639,24284,24291,2373,24299,24303,24321}, + { 187,15389,24338,24338,24342,24347,2445,24353,24357,24370}, + { 201,10686,24388,24388,24392,24404,2161,24414,24418,24434}, + { 190,7572,24452,24452,24456,24465,1748,24480,24484,24500}, + { 191,7039,24528,24528,24532,24539,1564,24546,24550,24563}, + { 202,17015,24577,24577,24581,24581,1462,21138,21142,21152}, + { 193,12081,24593,24593,24597,24597,1357,19520,19524,19524}, + { 185,16559,24606,24606,24610,24610,2511,24619,24623,24642}, + { 197,16658,24661,24661,24665,24671,2517,24678,24682,24694}, + { 198,14898,24712,24712,24716,24725,1357,19520,19524,19854}, + { 200,7183,24737,24737,24741,24749,1635,1635,24758,24771}, + { 271,15198,17503,17503,24785,24792,2423,2423,24805,24819}, + { 203,7239,3313,3313,24832,24839,1639,24852,24856,24870}, + { 204,11512,24902,24902,24906,24906,2204,24913,24917,0}, + { 205,311,24931,24931,24935,24948,1280,24995,24999,25011}, + { 221,7428,25031,25031,25035,25042,1724,25050,25054,25068}, + { 215,13483,25081,25081,25085,25095,1462,25105,25109,25126}, + { 212,7819,25139,25139,25143,25152,1357,19520,19524,25162}, + { 143,7338,25167,25167,25171,25180,1357,19520,19524,19854}, + { 210,15441,25190,25190,25194,25202,2448,20467,20471,20494}, + { 216,11224,5783,5783,25212,25220,2173,25231,25235,25251}, + { 72,16821,3656,3656,25267,25267,1462,21138,21142,21152}, + { 222,15314,25279,25279,25283,25289,2435,25300,25304,25317}, + { 227,7475,3451,3451,25337,3441,1740,1740,25346,25356}, + { 228,8038,25375,25375,25379,25390,1967,25411,25415,25434}, + { 238,9258,25447,25447,25451,25464,1995,1995,25478,25498}, + { 234,14539,25514,25514,25518,25526,2377,25535,25539,25554}, + { 235,7521,25576,25576,25580,25587,1744,25596,25600,25613}, + { 225,15583,25627,25627,25631,25631,1462,25649,25653,25653}, + { 237,6269,25678,25678,25682,25689,1462,25696,25700,25718}, + { 241,7693,3578,3578,25728,25736,1762,25751,25755,25773}, + { 244,6510,25807,25807,25811,25811,1462,21138,21142,21142}, + { 246,16360,25825,25825,25829,25829,1462,25837,25841,25856}, + { 247,9322,4567,4567,25870,25881,2225,25894,25898,25914}, + { 249,14843,25936,25936,25940,25940,2406,25950,25954,25974}, + { 251,8144,25994,25994,25998,26006,1852,26017,26021,26037}, + { 261,15010,26056,26056,26060,26066,2410,26077,26081,26093}, + { 209,8489,26111,26111,26115,0,1892,26128,26132,0}, + { 264,15858,26151,26151,26155,26155,1462,21138,21142,21142} +}; + + +static const RegionInfoNameEntry region_name_entries [] = { + {16310, 0}, /* AE */ + {10632, 1}, /* AF */ + {7384, 2}, /* AL */ + {49, 3}, /* AM */ + {15637, 4}, /* AR */ + {13177, 5}, /* AT */ + {13210, 6}, /* AU */ + {8275, 7}, /* AZ */ + {13740, 8}, /* BA */ + {12712, 9}, /* BD */ + {11869, 10}, /* BE */ + {6175, 11}, /* BG */ + {16467, 12}, /* BH */ + {12592, 13}, /* BN */ + {16734, 14}, /* BO */ + {7088, 15}, /* BR */ + {12439, 16}, /* BW */ + {7763, 17}, /* BY */ + {15344, 18}, /* BZ */ + {13303, 19}, /* CA */ + {15128, 20}, /* CD */ + {314, 21}, /* CH */ + {15976, 22}, /* CI */ + {16159, 23}, /* CL */ + {15689, 24}, /* CM */ + {9975, 25}, /* CN */ + {15062, 26}, /* CO */ + {14042, 27}, /* CR */ + {17119, 28}, /* CU */ + {6331, 29}, /* CZ */ + {6421, 30}, /* DE */ + {6373, 31}, /* DK */ + {14647, 32}, /* DO */ + {13802, 33}, /* DZ */ + {15908, 34}, /* EC */ + {7861, 35}, /* EE */ + {13032, 36}, /* EG */ + {12980, 37}, /* ER */ + {6218, 38}, /* ES */ + {10452, 39}, /* ET */ + {6551, 40}, /* FI */ + {8815, 41}, /* FO */ + {6595, 42}, /* FR */ + {10034, 43}, /* GB */ + {8761, 44}, /* GE */ + {10976, 45}, /* GL */ + {6477, 46}, /* GR */ + {13614, 47}, /* GT */ + {13125, 48}, /* HK */ + {16903, 49}, /* HN */ + {7287, 50}, /* HR */ + {16606, 51}, /* HT */ + {6696, 52}, /* HU */ + {7626, 53}, /* ID */ + {12541, 54}, /* IE */ + {6644, 55}, /* IL */ + {8872, 56}, /* IN */ + {11644, 57}, /* IQ */ + {8086, 58}, /* IR */ + {6745, 59}, /* IS */ + {6788, 60}, /* IT */ + {14789, 61}, /* JM */ + {15542, 62}, /* JO */ + {6833, 63}, /* JP */ + {9198, 64}, /* KE */ + {9155, 65}, /* KG */ + {10100, 66}, /* KH */ + {6888, 67}, /* KR */ + {16081, 68}, /* KW */ + {9086, 69}, /* KZ */ + {10142, 70}, /* LA */ + {15826, 71}, /* LB */ + {13951, 72}, /* LI */ + {10393, 73}, /* LK */ + {7959, 74}, /* LT */ + {10912, 75}, /* LU */ + {7907, 76}, /* LV */ + {13419, 77}, /* LY */ + {14246, 78}, /* MA */ + {14371, 79}, /* MC */ + {12142, 80}, /* MD */ + {15768, 81}, /* ME */ + {8450, 82}, /* MK */ + {16203, 83}, /* ML */ + {10217, 84}, /* MM */ + {9904, 85}, /* MN */ + {13891, 86}, /* MO */ + {8911, 87}, /* MT */ + {11818, 88}, /* MX */ + {9016, 89}, /* MY */ + {10740, 90}, /* NG */ + {16957, 91}, /* NI */ + {6940, 92}, /* NL */ + {6998, 93}, /* NO */ + {10513, 94}, /* NP */ + {13986, 95}, /* NZ */ + {14758, 96}, /* OM */ + {14323, 97}, /* PA */ + {15389, 98}, /* PE */ + {10686, 99}, /* PH */ + {7572, 100}, /* PK */ + {7039, 101}, /* PL */ + {17015, 102}, /* PR */ + {12081, 103}, /* PT */ + {16559, 104}, /* PY */ + {16658, 105}, /* QA */ + {14898, 106}, /* RE */ + {7183, 107}, /* RO */ + {15198, 108}, /* RS */ + {7239, 109}, /* RU */ + {11512, 110}, /* RW */ + {311, 111}, /* SA */ + {7428, 112}, /* SE */ + {13483, 113}, /* SG */ + {7819, 114}, /* SI */ + {7338, 115}, /* SK */ + {15441, 116}, /* SN */ + {11224, 117}, /* SO */ + {16821, 118}, /* SV */ + {15314, 119}, /* SY */ + {7475, 120}, /* TH */ + {8038, 121}, /* TJ */ + {9258, 122}, /* TM */ + {14539, 123}, /* TN */ + {7521, 124}, /* TR */ + {15583, 125}, /* TT */ + {6269, 126}, /* TW */ + {7693, 127}, /* UA */ + {6510, 128}, /* US */ + {16360, 129}, /* UY */ + {9322, 130}, /* UZ */ + {14843, 131}, /* VE */ + {8144, 132}, /* VN */ + {15010, 133}, /* YE */ + {8489, 134}, /* ZA */ + {15858, 135} /* ZW */ +}; + + +static const char locale_strings [] = { + "\0" + "/\0" + ":\0" + "am\0" + "pm\0" + ".\0" + "a. m.\0" + "p. m.\0" + "\xe4\xb8\x8a\xe5\x8d\x88\0" + "\xe4\xb8\x8b\xe5\x8d\x88\0" + "dop.\0" + "odp.\0" + "AM\0" + "PM\0" + "-\0" + "vorm.\0" + "nachm.\0" + "\xcf\x80.\xce\xbc.\0" + "\xce\xbc.\xce\xbc.\0" + "ap.\0" + "ip.\0" + "\xd7\x9c\xd7\xa4\xd7\xa0\xd7\x94\xd7\xb4\xd7\xa6\0" + "\xd7\x90\xd7\x97\xd7\x94\xd7\xb4\xd7\xa6\0" + "de.\0" + "du.\0" + ". \0" + "f.h.\0" + "e.h.\0" + "\xe5\x8d\x88\xe5\x89\x8d\0" + "\xe5\x8d\x88\xe5\xbe\x8c\0" + "\xec\x98\xa4\xec\xa0\x84\0" + "\xec\x98\xa4\xed\x9b\x84\0" + "a.m.\0" + "p.m.\0" + "\xd0\x94\xd0\x9f\0" + "\xd0\x9f\xd0\x9f\0" + "e paradites\0" + "e pasdites\0" + "fm\0" + "em\0" + "\xc3\x96\xc3\x96\0" + "\xc3\x96S\0" + "\xd0\xb4\xd0\xbf\0" + "\xd0\xbf\xd0\xbf\0" + "pop.\0" + "priek\xc5\xa1p.\0" + "p\xc4\x93\x63p.\0" + "prie\xc5\xa1piet\0" + "popiet\0" + "\xd0\xbf\xd0\xb5. \xd1\x87\xd0\xbe.\0" + "\xd0\xbf\xd0\xb0. \xd1\x87\xd0\xbe.\0" + "\xd9\x82.\xd8\xb8.\0" + "\xd8\xa8.\xd8\xb8.\0" + "SA\0" + "CH\0" + "\xd4\xbf\xd4\xb1\0" + "\xd4\xbf\xd5\x80\0" + "dopo\xc5\x82\x64nja\0" + "popo\xc5\x82\x64nju\0" + "\xd0\xbf\xd1\x80\xd0\xb5\xd1\x82\xd0\xbf\xd0\xbb.\0" + "\xd0\xbf\xd0\xbe\xd0\xbf\xd0\xbb.\0" + "vm.\0" + "nm.\0" + "\xe0\xa4\xaa\xe0\xa5\x82\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\xb9\xe0\xa5\x8d\xe0\xa4\xa8\0" + "\xe0\xa4\x85\xe0\xa4\xaa\xe0\xa4\xb0\xe0\xa4\xbe\xe0\xa4\xb9\xe0\xa5\x8d\xe0\xa4\xa8\0" + "i.b.\0" + "e.b.\0" + "PG\0" + "PTG\0" + "\xd1\x82\xd2\xa3\0" + "\xd1\x82\xd0\xba\0" + "TO\0" + "TK\0" + "\xe0\xa8\xaa\xe0\xa9\x82.\xe0\xa8\xa6\xe0\xa9\x81.\0" + "\xe0\xa8\xac\xe0\xa8\xbe.\xe0\xa8\xa6\xe0\xa9\x81.\0" + "\xe0\xae\xae\xe0\xaf\x81\xe0\xae\xb1\xe0\xaf\x8d\xe0\xae\xaa\xe0\xae\x95\xe0\xae\xb2\xe0\xaf\x8d\0" + "\xe0\xae\xaa\xe0\xae\xbf\xe0\xae\xb1\xe0\xaf\x8d\xe0\xae\xaa\xe0\xae\x95\xe0\xae\xb2\xe0\xaf\x8d\0" + "\xe0\xb2\xaa\xe0\xb3\x82\xe0\xb2\xb0\xe0\xb3\x8d\xe0\xb2\xb5\xe0\xb2\xbe\xe0\xb2\xb9\xe0\xb3\x8d\xe0\xb2\xa8\0" + "\xe0\xb2\x85\xe0\xb2\xaa\xe0\xb2\xb0\xe0\xb2\xbe\xe0\xb2\xb9\xe0\xb3\x8d\xe0\xb2\xa8\0" + "\xe0\xa6\xaa\xe0\xa7\x82\xe0\xa7\xb0\xe0\xa7\x8d\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\xb9\xe0\xa7\x8d\xe0\xa6\xa3\0" + "\xe0\xa6\x85\xe0\xa6\xaa\xe0\xa7\xb0\xe0\xa6\xbe\xe0\xa6\xb9\xe0\xa7\x8d\xe0\xa6\xa3\0" + "\xe0\xa4\xae.\xe0\xa4\xaa\xe0\xa5\x82.\0" + "\xe0\xa4\xae.\xe0\xa4\x89.\0" + "\xd2\xae\xd3\xa8\0" + "\xd2\xae\xd0\xa5\0" + "\xe0\xbd\xa6\xe0\xbe\x94\xe0\xbc\x8b\xe0\xbd\x91\xe0\xbe\xb2\xe0\xbd\xbc\xe0\xbc\x8b\0" + "\xe0\xbd\x95\xe0\xbe\xb1\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x91\xe0\xbe\xb2\xe0\xbd\xbc\xe0\xbc\x8b\0" + "yb\0" + "yh\0" + "\xe0\xba\x81\xe0\xbb\x88\xe0\xba\xad\xe0\xba\x99\xe0\xba\x97\xe0\xbb\x88\xe0\xba\xbd\xe0\xba\x87\0" + "\xe0\xba\xab\xe0\xba\xbc\xe0\xba\xb1\xe0\xba\x87\xe0\xba\x97\xe0\xbb\x88\xe0\xba\xbd\xe0\xba\x87\0" + "\xe1\x80\x94\xe1\x80\xb6\xe1\x80\x94\xe1\x80\x80\xe1\x80\xba\0" + "\xe1\x80\x8a\xe1\x80\x94\xe1\x80\xb1\0" + "\xe0\xa4\xae.\xe0\xa4\xa8\xe0\xa4\x82.\0" + "\xe0\xb6\xb4\xe0\xb7\x99.\xe0\xb7\x80.\0" + "\xe0\xb6\xb4.\xe0\xb7\x80.\0" + "\xe1\x8f\x8c\xe1\x8e\xbe\xe1\x8e\xb4\0" + "\xe1\x8f\x92\xe1\x8e\xaf\xe1\x8f\xb1\xe1\x8e\xa2\xe1\x8f\x97\xe1\x8f\xa2\0" + "\xe1\x8c\xa5\xe1\x8b\x8b\xe1\x89\xb5\0" + "\xe1\x8a\xa8\xe1\x88\xb0\xe1\x8b\x93\xe1\x89\xb5\0" + "Zdat azal\0" + "\xe1\xb8\x8c\x65\x66\x66ir aza\0" + "subaka\0" + "kikii\xc9\x97\x65\0" + "\xc3\x80\xc3\xa1r\xe1\xbb\x8d\xcc\x80\0" + "\xe1\xbb\x8c\xcc\x80s\xc3\xa1n\0" + "moies\0" + "nom\xc3\xabttes\0" + "u.t.\0" + "u.k.\0" + "A.M.\0" + "P.M.\0" + "WD\0" + "WB\0" + "\xe1\x8a\x95\xe1\x8c\x89\xe1\x88\x86 \xe1\x88\xb0\xe1\x8b\x93\xe1\x89\xb0\0" + "\xe1\x8b\xb5\xe1\x88\x95\xe1\x88\xad \xe1\x88\xb0\xe1\x8b\x93\xe1\x89\xb5\0" + "sn.\0" + "gn.\0" + "\xea\x8e\xb8\xea\x84\x91\0" + "\xea\x81\xaf\xea\x8b\x92\0" + "G.M.\0" + "\xda\x86.\xd8\xa8\0" + "\xda\x86.\xd9\x83\0" + "v.m.\0" + "n.m.\0" + "\xd0\xad\xd0\x98\0" + "\xd0\xad\xd0\x9a\0" + "m\0" + "f\0" + "\xd8\xb5\0" + "\xd9\x85\0" + "f.m.\0" + "e.m.\0" + "\xd0\x90\xd0\x9c\0" + "\xd0\x9f\xd0\x9c\0" + "w\xc3\xb3tpo\xc5\x82\x64nja\0" + "\xd0\xa2\xd0\x9e\0" + "\xd0\xa2\xd0\x9a\0" + "prijepodne\0" + "popodne\0" + "prije podne\0" + "po podne\0" + "\xd0\xbf\xd1\x80\xd0\xb8\xd1\x98\xd0\xb5 \xd0\xbf\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xb5\0" + "\xd0\xbf\xd0\xbe \xd0\xbf\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xb5\0" + "\xd0\xbf\xd1\x80\xd0\xb5 \xd0\xbf\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xb5\0" + "\xd0\xbf\xd0\xbe\xd0\xbf\xd0\xbe\xd0\xb4\xd0\xbd\xd0\xb5\0" + "pre podne\0" + "ep.\0" + "mat.\0" + "soir\0" + ",\0" + "\xd8\xb1.\xd8\xb3.\xe2\x80\x8f\0" + "\xd9\xaa\xd8\x9c\0" + "\xd9\x84\xd9\x8a\xd8\xb3\xc2\xa0\xd8\xb1\xd9\x82\xd9\x85\0" + "\xd8\x89\0" + "-Infinity\0" + "Infinity\0" + "\xd8\x9c+\0" + "\xc2\xa0\0" + "\xd0\xbb\xd0\xb2.\0" + "%\0" + "NaN\0" + "\xe2\x80\xb0\0" + "+\0" + "\xe2\x82\xac\0" + "-Infinit\0" + "Infinit\0" + "\xc2\xa5\0" + "K\xc4\x8d\0" + "-nekone\xc4\x8dno\0" + "+nekone\xc4\x8dno\0" + "kr.\0" + "-unendlich\0" + "+unendlich\0" + "-\xce\x86\xcf\x80\xce\xb5\xce\xb9\xcf\x81\xce\xbf\0" + "\xce\x86\xcf\x80\xce\xb5\xce\xb9\xcf\x81\xce\xbf\0" + "$\0" + "-Infinito\0" + "Infinito\0" + "ep\xc3\xa4luku\0" + "\xd9\xaa\0" + "-Infini\0" + "+Infini\0" + "\xe2\x82\xaa\0" + "\xe2\x80\x8e+\0" + "Ft\0" + "ISK\0" + "+Infinito\0" + "\xef\xbf\xa5\0" + "\xe2\x82\xa9\0" + "-oneindig\0" + "oneindig\0" + "z\xc5\x82\0" + "-niesko\xc5\x84\x63zono\xc5\x9b\xc4\x87\0" + "+niesko\xc5\x84\x63zono\xc5\x9b\xc4\x87\0" + "R$\0" + "\xe2\x80\x99\0" + "CHF\0" + "-infinit\0" + "+infinit\0" + "RON\0" + "\xe2\x82\xbd\0" + "\xd0\xbd\xd0\xb5\xc2\xa0\xd1\x87\xd0\xb8\xd1\x81\xd0\xbb\xd0\xbe\0" + "-\xd0\xb1\xd0\xb5\xd1\x81\xd0\xba\xd0\xbe\xd0\xbd\xd0\xb5\xd1\x87\xd0\xbd\xd0\xbe\xd1\x81\xd1\x82\xd1\x8c\0" + "\xd0\xb1\xd0\xb5\xd1\x81\xd0\xba\xd0\xbe\xd0\xbd\xd0\xb5\xd1\x87\xd0\xbd\xd0\xbe\xd1\x81\xd1\x82\xd1\x8c\0" + "kn\0" + "Lek\xc3\xab\0" + "kr\0" + "\xc2\xa4\xc2\xa4\xc2\xa4\0" + "\xd8\x89\xe2\x80\x8f\0" + "THB\0" + "\xe2\x82\xba\0" + "Rs\0" + "\xe2\x80\x8e+\xe2\x80\x8e\0" + "Rp\0" + "\xe2\x82\xb4\0" + "Br\0" + "-neskon\xc4\x8dnost\0" + "neskon\xc4\x8dnost\0" + "NS\0" + "-bezgal\xc4\xab\x62\x61\0" + "bezgal\xc4\xab\x62\x61\0" + "-begalyb\xc4\x97\0" + "begalyb\xc4\x97\0" + "\xd8\xb1\xdb\x8c\xd8\xa7\xd9\x84\0" + "\xe2\x82\xab\0" + "\xd6\x8f\0" + "\xd5\x88\xd5\xb9\xd4\xb9\0" + "-Infinitu\0" + "Infinitu\0" + "\xd0\xb4\xd0\xb5\xd0\xbd\0" + "R\0" + "\xe2\x82\xbe\0" + "\xe1\x83\x90\xe1\x83\xa0\xc2\xa0\xe1\x83\x90\xe1\x83\xa0\xe1\x83\x98\xe1\x83\xa1\xc2\xa0\xe1\x83\xa0\xe1\x83\x98\xe1\x83\xaa\xe1\x83\xae\xe1\x83\x95\xe1\x83\x98\0" + "\xe2\x82\xb9\0" + "RM\0" + "\xe2\x82\xb8\0" + "\xd1\x81\xd0\xb0\xd0\xbd\xc2\xa0\xd0\xb5\xd0\xbc\xd0\xb5\xd1\x81\0" + "\xd1\x81\xd0\xbe\xd0\xbc\0" + "\xd1\x81\xd0\xb0\xd0\xbd\xc2\xa0\xd1\x8d\xd0\xbc\xd0\xb5\xd1\x81\0" + "Ksh\0" + "TMT\0" + "san\xc2\xa0\x64\xc3\xa4l\0" + "haqiqiy\xc2\xa0son\xc2\xa0\x65mas\0" + "\xe0\xa6\x9f\xe0\xa6\xbe\0" + "`\0" + "\xc2\xa3\0" + "\xe1\x9f\x9b\0" + "\xe2\x82\xad\0" + "\xe0\xba\x9a\xe0\xbb\x8d\xe0\xbb\x88\xe2\x80\x8b\xe0\xbb\x81\xe0\xba\xa1\xe0\xbb\x88\xe0\xba\x99\xe2\x80\x8b\xe0\xbb\x82\xe0\xba\x95\xe2\x80\x8b\xe0\xbb\x80\xe0\xba\xa5\xe0\xba\x81\0" + "K\0" + "\xe1\x80\x82\xe1\x80\x8f\xe1\x80\x94\xe1\x80\xba\xe1\x80\xb8\xe1\x80\x99\xe1\x80\x9f\xe1\x80\xaf\xe1\x80\x90\xe1\x80\xba\xe1\x80\x9e\xe1\x80\xb1\xe1\x80\xac\0" + "\xe0\xb6\xbb\xe0\xb7\x94.\0" + "\xe1\x89\xa5\xe1\x88\xad\0" + "\xe0\xa4\xb0\xe0\xa5\x81\0" + "\xd8\x8b\0" + "\xe2\x82\xb1\0" + "\xe2\x82\xa6\0" + "Nfk\0" + "S\0" + "\xd1\x87\xd1\x8b\xd1\x8b\xd2\xbb\xd1\x8b\xd0\xbb\xd0\xb0\xc2\xa0\xd0\xb1\xd1\x83\xd0\xbe\xd1\x82\xd0\xb0\xd1\x85\0" + "RF\0" + "\xe9\x9d\x9e\xe6\x95\xb8\xe5\x80\xbc\0" + "HRK\0" + "\xe2\x82\xbc\0" + "so\xca\xbbm\0" + "\xe2\x82\xae\0" + "\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\xb0\xe0\xa5\x82\0" + "\xd8\xaf.\xd8\xb9.\xe2\x80\x8f\0" + "'\0" + "L\0" + "P\0" + "\xd1\x81\xd1\x9e\xd0\xbc\0" + "\xd2\xb3\xd0\xb0\xd2\x9b\xd0\xb8\xd2\x9b\xd0\xb8\xd0\xb9\xc2\xa0\xd1\x81\xd0\xbe\xd0\xbd\xc2\xa0\xd1\x8d\xd0\xbc\xd0\xb0\xd1\x81\0" + "\xe0\xa7\xb3\0" + "\xd8\xb1\0" + "Rs.\0" + "\xd8\xac.\xd9\x85.\xe2\x80\x8f\0" + "HK$\0" + "\xd8\xaf.\xd9\x84.\xe2\x80\x8f\0" + "Q\0" + "KM\0" + "\xd8\xaf.\xd8\xac.\xe2\x80\x8f\0" + "MOP$\0" + "\xe2\x82\xa1\0" + "\xd8\xaf.\xd9\x85.\xe2\x80\x8f\0" + "B/.\0" + "\xd8\xaf.\xd8\xaa.\xe2\x80\x8f\0" + "RD$\0" + "\xd0\x9a\xd0\x9c\0" + "\xd8\xb1.\xd8\xb9.\xe2\x80\x8f\0" + "Bs.\0" + "\xd8\xb1.\xd9\x8a.\xe2\x80\x8f\0" + "FC\0" + "RSD\0" + "epiloho\0" + "\xd9\x84.\xd8\xb3.\xe2\x80\x8f\0" + "S/\0" + "CFA\0" + "\xd8\xaf.\xd8\xa3.\xe2\x80\x8f\0" + "FCFA\0" + "\xd9\x84.\xd9\x84.\xe2\x80\x8f\0" + "\xd8\xaf.\xd9\x83.\xe2\x80\x8f\0" + "\xd8\xaf.\xd8\xa5.\xe2\x80\x8f\0" + "MAD\0" + "\xd8\xaf.\xd8\xa8.\xe2\x80\x8f\0" + "Gs.\0" + "G\0" + "\xd8\xb1.\xd9\x82.\xe2\x80\x8f\0" + "Bs\0" + "C$\0" + "\xd0\x94\xd0\xb8\xd0\xbd.\0" + "Din.\0" + "ar\0" + "Arabic\0" + "\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9\0" + "ARA\0" + "ara\0" + "bg\0" + "Bulgarian\0" + "\xd0\xb1\xd1\x8a\xd0\xbb\xd0\xb3\xd0\xb0\xd1\x80\xd1\x81\xd0\xba\xd0\xb8\0" + "BGR\0" + "bul\0" + "ca\0" + "Catalan\0" + "catal\xc3\xa0\0" + "CAT\0" + "cat\0" + "zh-Hans\0" + "Chinese (Simplified)\0" + "\xe4\xb8\xad\xe6\x96\x87\0" + "CHS\0" + "zho\0" + "zh\0" + "zh-CHS\0" + "Chinese (Simplified) Legacy\0" + "cs\0" + "Czech\0" + "\xc4\x8d\x65\xc5\xa1tina\0" + "CSY\0" + "ces\0" + "da\0" + "Danish\0" + "dansk\0" + "DAN\0" + "dan\0" + "de\0" + "German\0" + "Deutsch\0" + "DEU\0" + "deu\0" + "el\0" + "Greek\0" + "\xce\x95\xce\xbb\xce\xbb\xce\xb7\xce\xbd\xce\xb9\xce\xba\xce\xac\0" + "ELL\0" + "ell\0" + "en\0" + "English\0" + "ENU\0" + "eng\0" + "es\0" + "Spanish\0" + "espa\xc3\xb1ol\0" + "ESP\0" + "spa\0" + "fi\0" + "Finnish\0" + "suomi\0" + "FIN\0" + "fin\0" + "fr\0" + "French\0" + "fran\xc3\xa7\x61is\0" + "FRA\0" + "fra\0" + "he\0" + "Hebrew\0" + "\xd7\xa2\xd7\x91\xd7\xa8\xd7\x99\xd7\xaa\0" + "HEB\0" + "heb\0" + "hu\0" + "Hungarian\0" + "magyar\0" + "HUN\0" + "hun\0" + "is\0" + "Icelandic\0" + "\xc3\xadslenska\0" + "ISL\0" + "isl\0" + "it\0" + "Italian\0" + "italiano\0" + "ITA\0" + "ita\0" + "ja\0" + "Japanese\0" + "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e\0" + "JPN\0" + "jpn\0" + "ko\0" + "Korean\0" + "\xed\x95\x9c\xea\xb5\xad\xec\x96\xb4\0" + "KOR\0" + "kor\0" + "nl\0" + "Dutch\0" + "Nederlands\0" + "NLD\0" + "nld\0" + "no\0" + "Norwegian\0" + "norsk\0" + "NOR\0" + "nob\0" + "nb\0" + "pl\0" + "Polish\0" + "polski\0" + "PLK\0" + "pol\0" + "pt\0" + "Portuguese\0" + "portugu\xc3\xaas\0" + "PTB\0" + "por\0" + "rm\0" + "Romansh\0" + "rumantsch\0" + "RMC\0" + "roh\0" + "ro\0" + "Romanian\0" + "rom\xc3\xa2n\xc4\x83\0" + "ROM\0" + "ron\0" + "ru\0" + "Russian\0" + "\xd1\x80\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9\0" + "RUS\0" + "rus\0" + "hr\0" + "Croatian\0" + "hrvatski\0" + "HRV\0" + "hrv\0" + "sk\0" + "Slovak\0" + "sloven\xc4\x8dina\0" + "SKY\0" + "slk\0" + "sq\0" + "Albanian\0" + "shqip\0" + "SQI\0" + "sqi\0" + "sv\0" + "Swedish\0" + "svenska\0" + "SVE\0" + "swe\0" + "th\0" + "Thai\0" + "\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0" + "THA\0" + "tha\0" + "tr\0" + "Turkish\0" + "T\xc3\xbcrk\xc3\xa7\x65\0" + "TRK\0" + "tur\0" + "ur\0" + "Urdu\0" + "\xd8\xa7\xd8\xb1\xd8\xaf\xd9\x88\0" + "URD\0" + "urd\0" + "id\0" + "Indonesian\0" + "Indonesia\0" + "IND\0" + "ind\0" + "uk\0" + "Ukrainian\0" + "\xd1\x83\xd0\xba\xd1\x80\xd0\xb0\xd1\x97\xd0\xbd\xd1\x81\xd1\x8c\xd0\xba\xd0\xb0\0" + "UKR\0" + "ukr\0" + "be\0" + "Belarusian\0" + "\xd0\xb1\xd0\xb5\xd0\xbb\xd0\xb0\xd1\x80\xd1\x83\xd1\x81\xd0\xba\xd0\xb0\xd1\x8f\0" + "BEL\0" + "bel\0" + "sl\0" + "Slovenian\0" + "sloven\xc5\xa1\xc4\x8dina\0" + "SLV\0" + "slv\0" + "et\0" + "Estonian\0" + "eesti\0" + "ETI\0" + "est\0" + "lv\0" + "Latvian\0" + "latvie\xc5\xa1u\0" + "LVI\0" + "lav\0" + "lt\0" + "Lithuanian\0" + "lietuvi\xc5\xb3\0" + "LTH\0" + "lit\0" + "tg\0" + "Tajik\0" + "\xd0\xa2\xd0\xbe\xd2\xb7\xd0\xb8\xd0\xba\xd3\xa3\0" + "TAJ\0" + "tgk\0" + "fa\0" + "Persian\0" + "\xd9\x81\xd8\xa7\xd8\xb1\xd8\xb3\xdb\x8c\0" + "FAR\0" + "fas\0" + "vi\0" + "Vietnamese\0" + "Ti\xe1\xba\xbfng Vi\xe1\xbb\x87t\0" + "VIT\0" + "vie\0" + "hy\0" + "Armenian\0" + "\xd5\xb0\xd5\xa1\xd5\xb5\xd5\xa5\xd6\x80\xd5\xa5\xd5\xb6\0" + "HYE\0" + "hye\0" + "az\0" + "Azerbaijani\0" + "az\xc9\x99rbaycan\0" + "AZE\0" + "aze\0" + "eu\0" + "Basque\0" + "euskara\0" + "EUQ\0" + "eus\0" + "hsb\0" + "Upper Sorbian\0" + "hornjoserb\xc5\xa1\xc4\x87ina\0" + "HSB\0" + "mk\0" + "Macedonian\0" + "\xd0\xbc\xd0\xb0\xd0\xba\xd0\xb5\xd0\xb4\xd0\xbe\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8\0" + "MKI\0" + "mkd\0" + "st\0" + "Southern Sotho\0" + "Sesotho\0" + "SOT\0" + "sot\0" + "ts\0" + "Tsonga\0" + "Xitsonga\0" + "TSO\0" + "tso\0" + "tn\0" + "Tswana\0" + "Setswana\0" + "TSN\0" + "tsn\0" + "xh\0" + "Xhosa\0" + "isiXhosa\0" + "XHO\0" + "xho\0" + "zu\0" + "Zulu\0" + "isiZulu\0" + "ZUL\0" + "zul\0" + "af\0" + "Afrikaans\0" + "AFK\0" + "afr\0" + "ka\0" + "Georgian\0" + "\xe1\x83\xa5\xe1\x83\x90\xe1\x83\xa0\xe1\x83\x97\xe1\x83\xa3\xe1\x83\x9a\xe1\x83\x98\0" + "KAT\0" + "kat\0" + "fo\0" + "Faroese\0" + "f\xc3\xb8royskt\0" + "FOS\0" + "fao\0" + "hi\0" + "Hindi\0" + "\xe0\xa4\xb9\xe0\xa4\xbf\xe0\xa4\xa8\xe0\xa5\x8d\xe0\xa4\xa6\xe0\xa5\x80\0" + "HIN\0" + "hin\0" + "mt\0" + "Maltese\0" + "Malti\0" + "MLT\0" + "mlt\0" + "se\0" + "Northern Sami\0" + "davvis\xc3\xa1megiella\0" + "SME\0" + "sme\0" + "ga\0" + "Irish\0" + "Gaeilge\0" + "IRE\0" + "gle\0" + "ms\0" + "Malay\0" + "Bahasa Melayu\0" + "MSL\0" + "msa\0" + "kk\0" + "Kazakh\0" + "\xd2\x9b\xd0\xb0\xd0\xb7\xd0\xb0\xd2\x9b \xd1\x82\xd1\x96\xd0\xbb\xd1\x96\0" + "KKZ\0" + "kaz\0" + "ky\0" + "Kyrgyz\0" + "\xd0\xba\xd1\x8b\xd1\x80\xd0\xb3\xd1\x8b\xd0\xb7\xd1\x87\xd0\xb0\0" + "KYR\0" + "kir\0" + "sw\0" + "Swahili\0" + "Kiswahili\0" + "SWK\0" + "swa\0" + "tk\0" + "Turkmen\0" + "t\xc3\xbcrkmen\xc3\xa7\x65\0" + "TUK\0" + "tuk\0" + "uz\0" + "Uzbek\0" + "o\xe2\x80\x98zbek\0" + "UZB\0" + "uzb\0" + "bn\0" + "Bangla\0" + "\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe\0" + "BNG\0" + "ben\0" + "pa\0" + "Punjabi\0" + "\xe0\xa8\xaa\xe0\xa9\xb0\xe0\xa8\x9c\xe0\xa8\xbe\xe0\xa8\xac\xe0\xa9\x80\0" + "PAN\0" + "pan\0" + "gu\0" + "Gujarati\0" + "\xe0\xaa\x97\xe0\xab\x81\xe0\xaa\x9c\xe0\xaa\xb0\xe0\xaa\xbe\xe0\xaa\xa4\xe0\xab\x80\0" + "GUJ\0" + "guj\0" + "or\0" + "Odia\0" + "\xe0\xac\x93\xe0\xac\xa1\xe0\xac\xbc\xe0\xac\xbf\xe0\xac\x86\0" + "ORI\0" + "ori\0" + "ta\0" + "Tamil\0" + "\xe0\xae\xa4\xe0\xae\xae\xe0\xae\xbf\xe0\xae\xb4\xe0\xaf\x8d\0" + "TAI\0" + "tam\0" + "te\0" + "Telugu\0" + "\xe0\xb0\xa4\xe0\xb1\x86\xe0\xb0\xb2\xe0\xb1\x81\xe0\xb0\x97\xe0\xb1\x81\0" + "TEL\0" + "tel\0" + "Kannada\0" + "\xe0\xb2\x95\xe0\xb2\xa8\xe0\xb3\x8d\xe0\xb2\xa8\xe0\xb2\xa1\0" + "KDI\0" + "kan\0" + "ml\0" + "Malayalam\0" + "\xe0\xb4\xae\xe0\xb4\xb2\xe0\xb4\xaf\xe0\xb4\xbe\xe0\xb4\xb3\xe0\xb4\x82\0" + "MYM\0" + "mal\0" + "as\0" + "Assamese\0" + "\xe0\xa6\x85\xe0\xa6\xb8\xe0\xa6\xae\xe0\xa7\x80\xe0\xa6\xaf\xe0\xa6\xbc\xe0\xa6\xbe\0" + "ASM\0" + "asm\0" + "mr\0" + "Marathi\0" + "\xe0\xa4\xae\xe0\xa4\xb0\xe0\xa4\xbe\xe0\xa4\xa0\xe0\xa5\x80\0" + "MAR\0" + "mar\0" + "mn\0" + "Mongolian\0" + "\xd0\xbc\xd0\xbe\xd0\xbd\xd0\xb3\xd0\xbe\xd0\xbb\0" + "MON\0" + "mon\0" + "bo\0" + "Tibetan\0" + "\xe0\xbd\x96\xe0\xbd\xbc\xe0\xbd\x91\xe0\xbc\x8b\xe0\xbd\xa6\xe0\xbe\x90\xe0\xbd\x91\xe0\xbc\x8b\0" + "BOB\0" + "bod\0" + "cy\0" + "Welsh\0" + "Cymraeg\0" + "CYM\0" + "cym\0" + "km\0" + "Khmer\0" + "\xe1\x9e\x81\xe1\x9f\x92\xe1\x9e\x98\xe1\x9f\x82\xe1\x9e\x9a\0" + "KHM\0" + "khm\0" + "lo\0" + "Lao\0" + "\xe0\xba\xa5\xe0\xba\xb2\xe0\xba\xa7\0" + "LAO\0" + "lao\0" + "my\0" + "Burmese\0" + "\xe1\x80\x99\xe1\x80\xbc\xe1\x80\x94\xe1\x80\xba\xe1\x80\x99\xe1\x80\xac\0" + "MYA\0" + "mya\0" + "gl\0" + "Galician\0" + "galego\0" + "GLC\0" + "glg\0" + "kok\0" + "Konkani\0" + "\xe0\xa4\x95\xe0\xa5\x8b\xe0\xa4\x82\xe0\xa4\x95\xe0\xa4\xa3\xe0\xa5\x80\0" + "KNK\0" + "si\0" + "Sinhala\0" + "\xe0\xb7\x83\xe0\xb7\x92\xe0\xb6\x82\xe0\xb7\x84\xe0\xb6\xbd\0" + "SIN\0" + "sin\0" + "chr\0" + "Cherokee\0" + "\xe1\x8f\xa3\xe1\x8e\xb3\xe1\x8e\xa9\0" + "CRE\0" + "Amharic\0" + "\xe1\x8a\xa0\xe1\x88\x9b\xe1\x88\xad\xe1\x8a\x9b\0" + "AMH\0" + "amh\0" + "tzm\0" + "Central Atlas Tamazight\0" + "Tamazi\xc9\xa3t n la\xe1\xb9\xadla\xe1\xb9\xa3\0" + "TZA\0" + "ne\0" + "Nepali\0" + "\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\xb2\xe0\xa5\x80\0" + "NEP\0" + "nep\0" + "fy\0" + "Western Frisian\0" + "West-Frysk\0" + "FYN\0" + "fry\0" + "ps\0" + "Pashto\0" + "\xd9\xbe\xda\x9a\xd8\xaa\xd9\x88\0" + "PAS\0" + "pus\0" + "fil\0" + "Filipino\0" + "FPO\0" + "ff\0" + "Fulah\0" + "Pulaar\0" + "FUL\0" + "ful\0" + "ha\0" + "Hausa\0" + "HAU\0" + "hau\0" + "yo\0" + "Yoruba\0" + "\xc3\x88\x64\xc3\xa8 Yor\xc3\xb9\x62\xc3\xa1\0" + "YOR\0" + "yor\0" + "nso\0" + "Northern Sotho\0" + "Sesotho sa Leboa\0" + "NSO\0" + "lb\0" + "Luxembourgish\0" + "L\xc3\xabtzebuergesch\0" + "LBX\0" + "ltz\0" + "kl\0" + "Kalaallisut\0" + "kalaallisut\0" + "KAL\0" + "kal\0" + "ig\0" + "Igbo\0" + "IBO\0" + "ibo\0" + "om\0" + "Oromo\0" + "Oromoo\0" + "ORM\0" + "orm\0" + "ti\0" + "Tigrinya\0" + "\xe1\x89\xb5\xe1\x8c\x8d\xe1\x88\xad\xe1\x8a\x9b\0" + "TIR\0" + "tir\0" + "haw\0" + "Hawaiian\0" + "\xca\xbb\xc5\x8clelo Hawai\xca\xbbi\0" + "HAW\0" + "so\0" + "Somali\0" + "Soomaali\0" + "SOM\0" + "som\0" + "ii\0" + "Sichuan Yi\0" + "\xea\x86\x88\xea\x8c\xa0\xea\x89\x99\0" + "III\0" + "iii\0" + "br\0" + "Breton\0" + "brezhoneg\0" + "BRE\0" + "bre\0" + "ug\0" + "Uyghur\0" + "\xd8\xa6\xdb\x87\xd9\x8a\xd8\xba\xdb\x87\xd8\xb1\xda\x86\xdb\x95\0" + "UIG\0" + "uig\0" + "gsw\0" + "Swiss German\0" + "Schwiizert\xc3\xbc\xc3\xbctsch\0" + "GSW\0" + "sah\0" + "Sakha\0" + "\xd1\x81\xd0\xb0\xd1\x85\xd0\xb0 \xd1\x82\xd1\x8b\xd0\xbb\xd0\xb0\0" + "SAH\0" + "rw\0" + "Kinyarwanda\0" + "KIN\0" + "kin\0" + "gd\0" + "Scottish Gaelic\0" + "G\xc3\xa0idhlig\0" + "GLA\0" + "gla\0" + "ar-SA\0" + "Arabic (Saudi Arabia)\0" + "\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 (\xd8\xa7\xd9\x84\xd9\x85\xd9\x85\xd9\x84\xd9\x83\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd8\xa9)\0" + "bg-BG\0" + "Bulgarian (Bulgaria)\0" + "\xd0\xb1\xd1\x8a\xd0\xbb\xd0\xb3\xd0\xb0\xd1\x80\xd1\x81\xd0\xba\xd0\xb8 (\xd0\x91\xd1\x8a\xd0\xbb\xd0\xb3\xd0\xb0\xd1\x80\xd0\xb8\xd1\x8f)\0" + "BG\0" + "ca-ES\0" + "Catalan (Spain)\0" + "catal\xc3\xa0 (Espanya)\0" + "ES\0" + "zh-TW\0" + "Chinese (Traditional)\0" + "\xe4\xb8\xad\xe6\x96\x87 (\xe5\x8f\xb0\xe6\xb9\xbe)\0" + "CHT\0" + "TW\0" + "cs-CZ\0" + "Czech (Czech Republic)\0" + "\xc4\x8d\x65\xc5\xa1tina (\xc4\x8c\x65sk\xc3\xa1 republika)\0" + "CZ\0" + "da-DK\0" + "Danish (Denmark)\0" + "dansk (Danmark)\0" + "DK\0" + "de-DE\0" + "German (Germany)\0" + "Deutsch (Deutschland)\0" + "DE\0" + "el-GR\0" + "Greek (Greece)\0" + "\xce\x95\xce\xbb\xce\xbb\xce\xb7\xce\xbd\xce\xb9\xce\xba\xce\xac (\xce\x95\xce\xbb\xce\xbb\xce\xac\xce\xb4\xce\xb1)\0" + "GR\0" + "en-US\0" + "English (United States)\0" + "US\0" + "fi-FI\0" + "Finnish (Finland)\0" + "suomi (Suomi)\0" + "FI\0" + "fr-FR\0" + "French (France)\0" + "fran\xc3\xa7\x61is (France)\0" + "FR\0" + "he-IL\0" + "Hebrew (Israel)\0" + "\xd7\xa2\xd7\x91\xd7\xa8\xd7\x99\xd7\xaa (\xd7\x99\xd7\xa9\xd7\xa8\xd7\x90\xd7\x9c)\0" + "IL\0" + "hu-HU\0" + "Hungarian (Hungary)\0" + "magyar (Magyarorsz\xc3\xa1g)\0" + "HU\0" + "is-IS\0" + "Icelandic (Iceland)\0" + "\xc3\xadslenska (\xc3\x8dsland)\0" + "IS\0" + "it-IT\0" + "Italian (Italy)\0" + "italiano (Italia)\0" + "IT\0" + "ja-JP\0" + "Japanese (Japan)\0" + "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e (\xe6\x97\xa5\xe6\x9c\xac)\0" + "JP\0" + "ko-KR\0" + "Korean (South Korea)\0" + "\xed\x95\x9c\xea\xb5\xad\xec\x96\xb4 (\xeb\x8c\x80\xed\x95\x9c\xeb\xaf\xbc\xea\xb5\xad)\0" + "KR\0" + "nl-NL\0" + "Dutch (Netherlands)\0" + "Nederlands (Nederland)\0" + "NL\0" + "nb-NO\0" + "Norwegian Bokm\xc3\xa5l (Norway)\0" + "norsk bokm\xc3\xa5l (Norge)\0" + "NO\0" + "pl-PL\0" + "Polish (Poland)\0" + "polski (Polska)\0" + "PL\0" + "pt-BR\0" + "Portuguese (Brazil)\0" + "portugu\xc3\xaas (Brasil)\0" + "BR\0" + "rm-CH\0" + "Romansh (Switzerland)\0" + "rumantsch (Svizra)\0" + "ro-RO\0" + "Romanian (Romania)\0" + "rom\xc3\xa2n\xc4\x83 (Rom\xc3\xa2nia)\0" + "RO\0" + "ru-RU\0" + "Russian (Russia)\0" + "\xd1\x80\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 (\xd0\xa0\xd0\xbe\xd1\x81\xd1\x81\xd0\xb8\xd1\x8f)\0" + "RU\0" + "hr-HR\0" + "Croatian (Croatia)\0" + "hrvatski (Hrvatska)\0" + "HR\0" + "sk-SK\0" + "Slovak (Slovakia)\0" + "sloven\xc4\x8dina (Slovensko)\0" + "SK\0" + "sq-AL\0" + "Albanian (Albania)\0" + "shqip (Shqip\xc3\xabri)\0" + "AL\0" + "sv-SE\0" + "Swedish (Sweden)\0" + "svenska (Sverige)\0" + "SE\0" + "th-TH\0" + "Thai (Thailand)\0" + "\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2 (\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2)\0" + "TH\0" + "tr-TR\0" + "Turkish (Turkey)\0" + "T\xc3\xbcrk\xc3\xa7\x65 (T\xc3\xbcrkiye)\0" + "TR\0" + "ur-PK\0" + "Urdu (Pakistan)\0" + "\xd8\xa7\xd8\xb1\xd8\xaf\xd9\x88 (\xd9\xbe\xd8\xa7\xda\xa9\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86)\0" + "PK\0" + "id-ID\0" + "Indonesian (Indonesia)\0" + "Indonesia (Indonesia)\0" + "ID\0" + "uk-UA\0" + "Ukrainian (Ukraine)\0" + "\xd1\x83\xd0\xba\xd1\x80\xd0\xb0\xd1\x97\xd0\xbd\xd1\x81\xd1\x8c\xd0\xba\xd0\xb0 (\xd0\xa3\xd0\xba\xd1\x80\xd0\xb0\xd1\x97\xd0\xbd\xd0\xb0)\0" + "UA\0" + "be-BY\0" + "Belarusian (Belarus)\0" + "\xd0\xb1\xd0\xb5\xd0\xbb\xd0\xb0\xd1\x80\xd1\x83\xd1\x81\xd0\xba\xd0\xb0\xd1\x8f (\xd0\x91\xd0\xb5\xd0\xbb\xd0\xb0\xd1\x80\xd1\x83\xd1\x81\xd1\x8c)\0" + "BY\0" + "sl-SI\0" + "Slovenian (Slovenia)\0" + "sloven\xc5\xa1\xc4\x8dina (Slovenija)\0" + "SI\0" + "et-EE\0" + "Estonian (Estonia)\0" + "eesti (Eesti)\0" + "EE\0" + "lv-LV\0" + "Latvian (Latvia)\0" + "latvie\xc5\xa1u (Latvija)\0" + "LV\0" + "lt-LT\0" + "Lithuanian (Lithuania)\0" + "lietuvi\xc5\xb3 (Lietuva)\0" + "LT\0" + "tg-Cyrl-TJ\0" + "Tajik (Cyrillic, Tajikistan)\0" + "\xd0\xa2\xd0\xbe\xd2\xb7\xd0\xb8\xd0\xba\xd3\xa3 (\xd0\xa2\xd0\xbe\xd2\xb7\xd0\xb8\xd0\xba\xd0\xb8\xd1\x81\xd1\x82\xd0\xbe\xd0\xbd)\0" + "TJ\0" + "fa-IR\0" + "Persian (Iran)\0" + "\xd9\x81\xd8\xa7\xd8\xb1\xd8\xb3\xdb\x8c (\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86)\0" + "IR\0" + "vi-VN\0" + "Vietnamese (Vietnam)\0" + "Ti\xe1\xba\xbfng Vi\xe1\xbb\x87t (Vi\xe1\xbb\x87t Nam)\0" + "VN\0" + "hy-AM\0" + "Armenian (Armenia)\0" + "\xd5\xb0\xd5\xa1\xd5\xb5\xd5\xa5\xd6\x80\xd5\xa5\xd5\xb6 (\xd5\x80\xd5\xa1\xd5\xb5\xd5\xa1\xd5\xbd\xd5\xbf\xd5\xa1\xd5\xb6)\0" + "az-Latn-AZ\0" + "Azerbaijani (Latin, Azerbaijan)\0" + "az\xc9\x99rbaycan (Az\xc9\x99rbaycan)\0" + "AZ\0" + "eu-ES\0" + "Basque (Spain)\0" + "euskara (Espainia)\0" + "hsb-DE\0" + "Upper Sorbian (Germany)\0" + "hornjoserb\xc5\xa1\xc4\x87ina (N\xc4\x9bmska)\0" + "mk-MK\0" + "Macedonian (Macedonia)\0" + "\xd0\xbc\xd0\xb0\xd0\xba\xd0\xb5\xd0\xb4\xd0\xbe\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8 (\xd0\x9c\xd0\xb0\xd0\xba\xd0\xb5\xd0\xb4\xd0\xbe\xd0\xbd\xd0\xb8\xd1\x98\xd0\xb0)\0" + "MK\0" + "st-ZA\0" + "Southern Sotho (South Africa)\0" + "ZA\0" + "ts-ZA\0" + "Tsonga (South Africa)\0" + "tn-ZA\0" + "Tswana (South Africa)\0" + "xh-ZA\0" + "Xhosa (South Africa)\0" + "zu-ZA\0" + "Zulu (South Africa)\0" + "isiZulu (i-South Africa)\0" + "af-ZA\0" + "Afrikaans (South Africa)\0" + "Afrikaans (Suid-Afrika)\0" + "ka-GE\0" + "Georgian (Georgia)\0" + "\xe1\x83\xa5\xe1\x83\x90\xe1\x83\xa0\xe1\x83\x97\xe1\x83\xa3\xe1\x83\x9a\xe1\x83\x98 (\xe1\x83\xa1\xe1\x83\x90\xe1\x83\xa5\xe1\x83\x90\xe1\x83\xa0\xe1\x83\x97\xe1\x83\x95\xe1\x83\x94\xe1\x83\x9a\xe1\x83\x9d)\0" + "GE\0" + "fo-FO\0" + "Faroese (Faroe Islands)\0" + "f\xc3\xb8royskt (F\xc3\xb8royar)\0" + "FO\0" + "hi-IN\0" + "Hindi (India)\0" + "\xe0\xa4\xb9\xe0\xa4\xbf\xe0\xa4\xa8\xe0\xa5\x8d\xe0\xa4\xa6\xe0\xa5\x80 (\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4)\0" + "IN\0" + "mt-MT\0" + "Maltese (Malta)\0" + "Malti (Malta)\0" + "MT\0" + "se-NO\0" + "Northern Sami (Norway)\0" + "davvis\xc3\xa1megiella (Norga)\0" + "ms-MY\0" + "Malay (Malaysia)\0" + "Bahasa Melayu (Malaysia)\0" + "MY\0" + "kk-KZ\0" + "Kazakh (Kazakhstan)\0" + "\xd2\x9b\xd0\xb0\xd0\xb7\xd0\xb0\xd2\x9b \xd1\x82\xd1\x96\xd0\xbb\xd1\x96 (\xd2\x9a\xd0\xb0\xd0\xb7\xd0\xb0\xd2\x9b\xd1\x81\xd1\x82\xd0\xb0\xd0\xbd)\0" + "KZ\0" + "ky-KG\0" + "Kyrgyz (Kyrgyzstan)\0" + "\xd0\xba\xd1\x8b\xd1\x80\xd0\xb3\xd1\x8b\xd0\xb7\xd1\x87\xd0\xb0 (\xd0\x9a\xd1\x8b\xd1\x80\xd0\xb3\xd1\x8b\xd0\xb7\xd1\x81\xd1\x82\xd0\xb0\xd0\xbd)\0" + "KG\0" + "sw-KE\0" + "Swahili (Kenya)\0" + "Kiswahili (Kenya)\0" + "KE\0" + "tk-TM\0" + "Turkmen (Turkmenistan)\0" + "t\xc3\xbcrkmen\xc3\xa7\x65 (T\xc3\xbcrkmenistan)\0" + "TM\0" + "uz-Latn-UZ\0" + "Uzbek (Latin, Uzbekistan)\0" + "o\xe2\x80\x98zbek (O\xca\xbbzbekiston)\0" + "UZ\0" + "bn-IN\0" + "Bangla (India)\0" + "\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe (\xe0\xa6\xad\xe0\xa6\xbe\xe0\xa6\xb0\xe0\xa6\xa4)\0" + "gu-IN\0" + "Gujarati (India)\0" + "\xe0\xaa\x97\xe0\xab\x81\xe0\xaa\x9c\xe0\xaa\xb0\xe0\xaa\xbe\xe0\xaa\xa4\xe0\xab\x80 (\xe0\xaa\xad\xe0\xaa\xbe\xe0\xaa\xb0\xe0\xaa\xa4)\0" + "or-IN\0" + "Odia (India)\0" + "\xe0\xac\x93\xe0\xac\xa1\xe0\xac\xbc\xe0\xac\xbf\xe0\xac\x86 (\xe0\xac\xad\xe0\xac\xbe\xe0\xac\xb0\xe0\xac\xa4)\0" + "ta-IN\0" + "Tamil (India)\0" + "\xe0\xae\xa4\xe0\xae\xae\xe0\xae\xbf\xe0\xae\xb4\xe0\xaf\x8d (\xe0\xae\x87\xe0\xae\xa8\xe0\xaf\x8d\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\xaf\xe0\xae\xbe)\0" + "te-IN\0" + "Telugu (India)\0" + "\xe0\xb0\xa4\xe0\xb1\x86\xe0\xb0\xb2\xe0\xb1\x81\xe0\xb0\x97\xe0\xb1\x81 (\xe0\xb0\xad\xe0\xb0\xbe\xe0\xb0\xb0\xe0\xb0\xa4 \xe0\xb0\xa6\xe0\xb1\x87\xe0\xb0\xb6\xe0\xb0\x82)\0" + "kn-IN\0" + "Kannada (India)\0" + "\xe0\xb2\x95\xe0\xb2\xa8\xe0\xb3\x8d\xe0\xb2\xa8\xe0\xb2\xa1 (\xe0\xb2\xad\xe0\xb2\xbe\xe0\xb2\xb0\xe0\xb2\xa4)\0" + "ml-IN\0" + "Malayalam (India)\0" + "\xe0\xb4\xae\xe0\xb4\xb2\xe0\xb4\xaf\xe0\xb4\xbe\xe0\xb4\xb3\xe0\xb4\x82 (\xe0\xb4\x87\xe0\xb4\xa8\xe0\xb5\x8d\xe0\xb4\xa4\xe0\xb5\x8d\xe0\xb4\xaf)\0" + "as-IN\0" + "Assamese (India)\0" + "\xe0\xa6\x85\xe0\xa6\xb8\xe0\xa6\xae\xe0\xa7\x80\xe0\xa6\xaf\xe0\xa6\xbc\xe0\xa6\xbe (\xe0\xa6\xad\xe0\xa6\xbe\xe0\xa7\xb0\xe0\xa6\xa4)\0" + "mr-IN\0" + "Marathi (India)\0" + "\xe0\xa4\xae\xe0\xa4\xb0\xe0\xa4\xbe\xe0\xa4\xa0\xe0\xa5\x80 (\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4)\0" + "mn-MN\0" + "Mongolian (Mongolia)\0" + "\xd0\xbc\xd0\xbe\xd0\xbd\xd0\xb3\xd0\xbe\xd0\xbb (\xd0\x9c\xd0\xbe\xd0\xbd\xd0\xb3\xd0\xbe\xd0\xbb)\0" + "MNN\0" + "MN\0" + "bo-CN\0" + "Tibetan (China)\0" + "\xe0\xbd\x96\xe0\xbd\xbc\xe0\xbd\x91\xe0\xbc\x8b\xe0\xbd\xa6\xe0\xbe\x90\xe0\xbd\x91\xe0\xbc\x8b (\xe0\xbd\xa2\xe0\xbe\x92\xe0\xbe\xb1\xe0\xbc\x8b\xe0\xbd\x93\xe0\xbd\x82)\0" + "CN\0" + "cy-GB\0" + "Welsh (United Kingdom)\0" + "Cymraeg (Y Deyrnas Unedig)\0" + "GB\0" + "km-KH\0" + "Khmer (Cambodia)\0" + "\xe1\x9e\x81\xe1\x9f\x92\xe1\x9e\x98\xe1\x9f\x82\xe1\x9e\x9a (\xe1\x9e\x80\xe1\x9e\x98\xe1\x9f\x92\xe1\x9e\x96\xe1\x9e\xbb\xe1\x9e\x87\xe1\x9e\xb6)\0" + "KH\0" + "lo-LA\0" + "Lao (Laos)\0" + "\xe0\xba\xa5\xe0\xba\xb2\xe0\xba\xa7 (\xe0\xba\xa5\xe0\xba\xb2\xe0\xba\xa7)\0" + "LA\0" + "my-MM\0" + "Burmese (Myanmar (Burma))\0" + "\xe1\x80\x99\xe1\x80\xbc\xe1\x80\x94\xe1\x80\xba\xe1\x80\x99\xe1\x80\xac (\xe1\x80\x99\xe1\x80\xbc\xe1\x80\x94\xe1\x80\xba\xe1\x80\x99\xe1\x80\xac)\0" + "MM\0" + "gl-ES\0" + "Galician (Spain)\0" + "galego (Espa\xc3\xb1\x61)\0" + "kok-IN\0" + "Konkani (India)\0" + "\xe0\xa4\x95\xe0\xa5\x8b\xe0\xa4\x82\xe0\xa4\x95\xe0\xa4\xa3\xe0\xa5\x80 (\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4)\0" + "si-LK\0" + "Sinhala (Sri Lanka)\0" + "\xe0\xb7\x83\xe0\xb7\x92\xe0\xb6\x82\xe0\xb7\x84\xe0\xb6\xbd (\xe0\xb7\x81\xe0\xb7\x8a\xe2\x80\x8d\xe0\xb6\xbb\xe0\xb7\x93 \xe0\xb6\xbd\xe0\xb6\x82\xe0\xb6\x9a\xe0\xb7\x8f\xe0\xb7\x80)\0" + "LK\0" + "am-ET\0" + "Amharic (Ethiopia)\0" + "\xe1\x8a\xa0\xe1\x88\x9b\xe1\x88\xad\xe1\x8a\x9b (\xe1\x8a\xa2\xe1\x89\xb5\xe1\x8b\xae\xe1\x8c\xb5\xe1\x8b\xab)\0" + "ET\0" + "ne-NP\0" + "Nepali (Nepal)\0" + "\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\xb2\xe0\xa5\x80 (\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\xb2)\0" + "NP\0" + "fy-NL\0" + "Western Frisian (Netherlands)\0" + "West-Frysk (Nederl\xc3\xa2n)\0" + "ps-AF\0" + "Pashto (Afghanistan)\0" + "\xd9\xbe\xda\x9a\xd8\xaa\xd9\x88 (\xd8\xa7\xd9\x81\xd8\xba\xd8\xa7\xd9\x86\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86)\0" + "AF\0" + "fil-PH\0" + "Filipino (Philippines)\0" + "Filipino (Pilipinas)\0" + "PH\0" + "ha-Latn-NG\0" + "Hausa (Latin, Nigeria)\0" + "Hausa (Najeriya)\0" + "NG\0" + "yo-NG\0" + "Yoruba (Nigeria)\0" + "\xc3\x88\x64\xc3\xa8 Yor\xc3\xb9\x62\xc3\xa1 (Or\xc3\xadl\xe1\xba\xb9\xcc\x81\xc3\xa8\x64\x65 N\xc3\xa0\xc3\xacj\xc3\xadr\xc3\xad\xc3\xa0)\0" + "nso-ZA\0" + "Northern Sotho (South Africa)\0" + "lb-LU\0" + "Luxembourgish (Luxembourg)\0" + "L\xc3\xabtzebuergesch (L\xc3\xabtzebuerg)\0" + "LU\0" + "kl-GL\0" + "Kalaallisut (Greenland)\0" + "kalaallisut (Kalaallit Nunaat)\0" + "GL\0" + "ig-NG\0" + "Igbo (Nigeria)\0" + "om-ET\0" + "Oromo (Ethiopia)\0" + "Oromoo (Itoophiyaa)\0" + "ti-ET\0" + "Tigrinya (Ethiopia)\0" + "\xe1\x89\xb5\xe1\x8c\x8d\xe1\x88\xad\xe1\x8a\x9b (\xe1\x8a\xa2\xe1\x89\xb5\xe1\x8b\xae\xe1\x8c\xb5\xe1\x8b\xab)\0" + "TIE\0" + "haw-US\0" + "Hawaiian (United States)\0" + "\xca\xbb\xc5\x8clelo Hawai\xca\xbbi (\xca\xbb\x41melika Hui P\xc5\xab \xca\xbbIa)\0" + "so-SO\0" + "Somali (Somalia)\0" + "Soomaali (Soomaaliya)\0" + "SO\0" + "ii-CN\0" + "Sichuan Yi (China)\0" + "\xea\x86\x88\xea\x8c\xa0\xea\x89\x99 (\xea\x8d\x8f\xea\x87\xa9)\0" + "br-FR\0" + "Breton (France)\0" + "brezhoneg (Fra\xc3\xb1s)\0" + "ug-CN\0" + "Uyghur (China)\0" + "\xd8\xa6\xdb\x87\xd9\x8a\xd8\xba\xdb\x87\xd8\xb1\xda\x86\xdb\x95 (\xd8\xac\xdb\x87\xda\xad\xda\xaf\xd9\x88)\0" + "gsw-FR\0" + "Swiss German (France)\0" + "Schwiizert\xc3\xbc\xc3\xbctsch (Frankriich)\0" + "sah-RU\0" + "Sakha (Russia)\0" + "\xd1\x81\xd0\xb0\xd1\x85\xd0\xb0 \xd1\x82\xd1\x8b\xd0\xbb\xd0\xb0 (\xd0\x90\xd1\x80\xd0\xb0\xd1\x81\xd1\x81\xd1\x8b\xd1\x8b\xd0\xb9\xd0\xb0)\0" + "rw-RW\0" + "Kinyarwanda (Rwanda)\0" + "RW\0" + "gd-GB\0" + "Scottish Gaelic (United Kingdom)\0" + "G\xc3\xa0idhlig (An R\xc3\xacoghachd Aonaichte)\0" + "ar-IQ\0" + "Arabic (Iraq)\0" + "\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 (\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa7\xd9\x82)\0" + "ARI\0" + "IQ\0" + "ca-ES-valencia\0" + "VAL\0" + "zh-CN\0" + "\xe4\xb8\xad\xe6\x96\x87 (\xe4\xb8\xad\xe5\x9b\xbd)\0" + "de-CH\0" + "German (Switzerland)\0" + "Deutsch (Schweiz)\0" + "DES\0" + "en-GB\0" + "English (United Kingdom)\0" + "ENG\0" + "es-MX\0" + "Spanish (Mexico)\0" + "espa\xc3\xb1ol (M\xc3\xa9xico)\0" + "ESM\0" + "MX\0" + "fr-BE\0" + "French (Belgium)\0" + "fran\xc3\xa7\x61is (Belgique)\0" + "FRB\0" + "BE\0" + "it-CH\0" + "Italian (Switzerland)\0" + "italiano (Svizzera)\0" + "ITS\0" + "nl-BE\0" + "Dutch (Belgium)\0" + "Nederlands (Belgi\xc3\xab)\0" + "NLB\0" + "nn-NO\0" + "Norwegian Nynorsk (Norway)\0" + "nynorsk (Noreg)\0" + "NON\0" + "nno\0" + "nn\0" + "pt-PT\0" + "Portuguese (Portugal)\0" + "portugu\xc3\xaas (Portugal)\0" + "PT\0" + "ro-MD\0" + "Romanian (Moldova)\0" + "rom\xc3\xa2n\xc4\x83 (Republica Moldova)\0" + "ROD\0" + "MD\0" + "ru-MD\0" + "Russian (Moldova)\0" + "\xd1\x80\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 (\xd0\x9c\xd0\xbe\xd0\xbb\xd0\xb4\xd0\xbe\xd0\xb2\xd0\xb0)\0" + "RUM\0" + "sv-FI\0" + "Swedish (Finland)\0" + "svenska (Finland)\0" + "SVF\0" + "ur-IN\0" + "Urdu (India)\0" + "\xd8\xa7\xd8\xb1\xd8\xaf\xd9\x88 (\xd8\xa8\xda\xbe\xd8\xa7\xd8\xb1\xd8\xaa)\0" + "URI\0" + "az-Cyrl-AZ\0" + "Azerbaijani (Cyrillic, Azerbaijan)\0" + "AZC\0" + "dsb-DE\0" + "Lower Sorbian (Germany)\0" + "dolnoserb\xc5\xa1\xc4\x87ina (Nimska)\0" + "DSB\0" + "dsb\0" + "tn-BW\0" + "Tswana (Botswana)\0" + "TSB\0" + "BW\0" + "se-SE\0" + "Northern Sami (Sweden)\0" + "davvis\xc3\xa1megiella (Ruo\xc5\xa7\xc5\xa7\x61)\0" + "SMF\0" + "ga-IE\0" + "Irish (Ireland)\0" + "Gaeilge (\xc3\x89ire)\0" + "IE\0" + "ms-BN\0" + "Malay (Brunei)\0" + "Bahasa Melayu (Brunei)\0" + "MSB\0" + "BN\0" + "uz-Cyrl-UZ\0" + "Uzbek (Cyrillic, Uzbekistan)\0" + "UZC\0" + "bn-BD\0" + "Bangla (Bangladesh)\0" + "\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe (\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe\xe0\xa6\xa6\xe0\xa7\x87\xe0\xa6\xb6)\0" + "BNB\0" + "BD\0" + "pa-Arab-PK\0" + "Punjabi (Arabic, Pakistan)\0" + "\xe0\xa8\xaa\xe0\xa9\xb0\xe0\xa8\x9c\xe0\xa8\xbe\xe0\xa8\xac\xe0\xa9\x80 (\xe0\xa8\xaa\xe0\xa8\xbe\xe0\xa8\x95\xe0\xa8\xbf\xe0\xa8\xb8\xe0\xa8\xa4\xe0\xa8\xbe\xe0\xa8\xa8)\0" + "PAP\0" + "ta-LK\0" + "Tamil (Sri Lanka)\0" + "\xe0\xae\xa4\xe0\xae\xae\xe0\xae\xbf\xe0\xae\xb4\xe0\xaf\x8d (\xe0\xae\x87\xe0\xae\xb2\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xaf\x88)\0" + "TAM\0" + "ne-IN\0" + "Nepali (India)\0" + "\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\xb2\xe0\xa5\x80 (\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4)\0" + "NEI\0" + "ti-ER\0" + "Tigrinya (Eritrea)\0" + "\xe1\x89\xb5\xe1\x8c\x8d\xe1\x88\xad\xe1\x8a\x9b (\xe1\x8a\xa4\xe1\x88\xad\xe1\x89\xb5\xe1\x88\xab)\0" + "ER\0" + "ar-EG\0" + "Arabic (Egypt)\0" + "\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 (\xd9\x85\xd8\xb5\xd8\xb1)\0" + "ARE\0" + "EG\0" + "zh-HK\0" + "Chinese (Traditional, Hong Kong SAR China)\0" + "\xe4\xb8\xad\xe6\x96\x87 (\xe4\xb8\xad\xe5\x9b\xbd\xe9\xa6\x99\xe6\xb8\xaf\xe7\x89\xb9\xe5\x88\xab\xe8\xa1\x8c\xe6\x94\xbf\xe5\x8c\xba)\0" + "ZHH\0" + "HK\0" + "de-AT\0" + "German (Austria)\0" + "Deutsch (\xc3\x96sterreich)\0" + "DEA\0" + "AT\0" + "en-AU\0" + "English (Australia)\0" + "ENA\0" + "AU\0" + "es-ES\0" + "Spanish (Spain)\0" + "espa\xc3\xb1ol (Espa\xc3\xb1\x61)\0" + "ESN\0" + "fr-CA\0" + "French (Canada)\0" + "fran\xc3\xa7\x61is (Canada)\0" + "FRC\0" + "CA\0" + "se-FI\0" + "Northern Sami (Finland)\0" + "davvis\xc3\xa1megiella (Suopma)\0" + "SMG\0" + "ar-LY\0" + "Arabic (Libya)\0" + "\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 (\xd9\x84\xd9\x8a\xd8\xa8\xd9\x8a\xd8\xa7)\0" + "ARL\0" + "LY\0" + "zh-SG\0" + "Chinese (Simplified, Singapore)\0" + "\xe4\xb8\xad\xe6\x96\x87 (\xe6\x96\xb0\xe5\x8a\xa0\xe5\x9d\xa1)\0" + "ZHI\0" + "SG\0" + "de-LU\0" + "German (Luxembourg)\0" + "Deutsch (Luxemburg)\0" + "DEL\0" + "en-CA\0" + "English (Canada)\0" + "ENC\0" + "es-GT\0" + "Spanish (Guatemala)\0" + "espa\xc3\xb1ol (Guatemala)\0" + "ESG\0" + "GT\0" + "fr-CH\0" + "French (Switzerland)\0" + "fran\xc3\xa7\x61is (Suisse)\0" + "FRS\0" + "hr-BA\0" + "Croatian (Bosnia & Herzegovina)\0" + "hrvatski (Bosna i Hercegovina)\0" + "HRB\0" + "BA\0" + "ar-DZ\0" + "Arabic (Algeria)\0" + "\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 (\xd8\xa7\xd9\x84\xd8\xac\xd8\xb2\xd8\xa7\xd8\xa6\xd8\xb1)\0" + "ARG\0" + "DZ\0" + "zh-MO\0" + "Chinese (Traditional, Macau SAR China)\0" + "\xe4\xb8\xad\xe6\x96\x87 (\xe4\xb8\xad\xe5\x9b\xbd\xe6\xbe\xb3\xe9\x97\xa8\xe7\x89\xb9\xe5\x88\xab\xe8\xa1\x8c\xe6\x94\xbf\xe5\x8c\xba)\0" + "ZHM\0" + "MO\0" + "de-LI\0" + "German (Liechtenstein)\0" + "Deutsch (Liechtenstein)\0" + "DEC\0" + "LI\0" + "en-NZ\0" + "English (New Zealand)\0" + "ENZ\0" + "NZ\0" + "es-CR\0" + "Spanish (Costa Rica)\0" + "espa\xc3\xb1ol (Costa Rica)\0" + "ESC\0" + "CR\0" + "fr-LU\0" + "French (Luxembourg)\0" + "fran\xc3\xa7\x61is (Luxembourg)\0" + "FRL\0" + "bs-Latn-BA\0" + "Bosnian (Latin, Bosnia & Herzegovina)\0" + "bosanski (Bosna i Hercegovina)\0" + "BSB\0" + "bos\0" + "bs\0" + "ar-MA\0" + "Arabic (Morocco)\0" + "\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 (\xd8\xa7\xd9\x84\xd9\x85\xd8\xba\xd8\xb1\xd8\xa8)\0" + "ARM\0" + "MA\0" + "en-IE\0" + "English (Ireland)\0" + "ENI\0" + "es-PA\0" + "Spanish (Panama)\0" + "espa\xc3\xb1ol (Panam\xc3\xa1)\0" + "ESA\0" + "PA\0" + "fr-MC\0" + "French (Monaco)\0" + "fran\xc3\xa7\x61is (Monaco)\0" + "FRM\0" + "MC\0" + "sr-Latn-BA\0" + "Serbian (Latin, Bosnia & Herzegovina)\0" + "\xd1\x81\xd1\x80\xd0\xbf\xd1\x81\xd0\xba\xd0\xb8 (\xd0\x91\xd0\xbe\xd1\x81\xd0\xbd\xd0\xb0 \xd0\xb8 \xd0\xa5\xd0\xb5\xd1\x80\xd1\x86\xd0\xb5\xd0\xb3\xd0\xbe\xd0\xb2\xd0\xb8\xd0\xbd\xd0\xb0)\0" + "SRS\0" + "srp\0" + "sr\0" + "ar-TN\0" + "Arabic (Tunisia)\0" + "\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 (\xd8\xaa\xd9\x88\xd9\x86\xd8\xb3)\0" + "ART\0" + "TN\0" + "en-ZA\0" + "English (South Africa)\0" + "ENS\0" + "es-DO\0" + "Spanish (Dominican Republic)\0" + "espa\xc3\xb1ol (Rep\xc3\xba\x62lica Dominicana)\0" + "ESD\0" + "DO\0" + "sr-Cyrl-BA\0" + "Serbian (Cyrillic, Bosnia & Herzegovina)\0" + "SRN\0" + "ar-OM\0" + "Arabic (Oman)\0" + "\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 (\xd8\xb9\xd9\x8f\xd9\x85\xd8\xa7\xd9\x86)\0" + "ARO\0" + "OM\0" + "en-JM\0" + "English (Jamaica)\0" + "ENJ\0" + "JM\0" + "es-VE\0" + "Spanish (Venezuela)\0" + "espa\xc3\xb1ol (Venezuela)\0" + "ESV\0" + "VE\0" + "fr-RE\0" + "French (R\xc3\xa9union)\0" + "fran\xc3\xa7\x61is (La R\xc3\xa9union)\0" + "FRR\0" + "RE\0" + "bs-Cyrl-BA\0" + "Bosnian (Cyrillic, Bosnia & Herzegovina)\0" + "BSC\0" + "ar-YE\0" + "Arabic (Yemen)\0" + "\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 (\xd8\xa7\xd9\x84\xd9\x8a\xd9\x85\xd9\x86)\0" + "ARY\0" + "YE\0" + "es-CO\0" + "Spanish (Colombia)\0" + "espa\xc3\xb1ol (Colombia)\0" + "ESO\0" + "CO\0" + "fr-CD\0" + "French (Congo - Kinshasa)\0" + "fran\xc3\xa7\x61is (Congo-Kinshasa)\0" + "FRD\0" + "CD\0" + "sr-Latn-RS\0" + "Serbian (Latin, Serbia)\0" + "\xd1\x81\xd1\x80\xd0\xbf\xd1\x81\xd0\xba\xd0\xb8 (\xd0\xa1\xd1\x80\xd0\xb1\xd0\xb8\xd1\x98\xd0\xb0)\0" + "SRM\0" + "RS\0" + "smn-FI\0" + "Inari Sami (Finland)\0" + "anar\xc3\xa2\xc5\xa1kiel\xc3\xa2 (Suom\xc3\xa2)\0" + "SMN\0" + "smn\0" + "ar-SY\0" + "Arabic (Syria)\0" + "\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 (\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa7)\0" + "ARS\0" + "SY\0" + "en-BZ\0" + "English (Belize)\0" + "ENL\0" + "BZ\0" + "es-PE\0" + "Spanish (Peru)\0" + "espa\xc3\xb1ol (Per\xc3\xba)\0" + "ESR\0" + "PE\0" + "fr-SN\0" + "French (Senegal)\0" + "fran\xc3\xa7\x61is (S\xc3\xa9n\xc3\xa9gal)\0" + "FRN\0" + "SN\0" + "sr-Cyrl-RS\0" + "Serbian (Cyrillic, Serbia)\0" + "SRO\0" + "ar-JO\0" + "Arabic (Jordan)\0" + "\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 (\xd8\xa7\xd9\x84\xd8\xa3\xd8\xb1\xd8\xaf\xd9\x86)\0" + "ARJ\0" + "JO\0" + "en-TT\0" + "English (Trinidad & Tobago)\0" + "ENT\0" + "TT\0" + "es-AR\0" + "Spanish (Argentina)\0" + "espa\xc3\xb1ol (Argentina)\0" + "ESS\0" + "AR\0" + "fr-CM\0" + "French (Cameroon)\0" + "fran\xc3\xa7\x61is (Cameroun)\0" + "FRE\0" + "CM\0" + "sr-Latn-ME\0" + "Serbian (Latin, Montenegro)\0" + "\xd1\x81\xd1\x80\xd0\xbf\xd1\x81\xd0\xba\xd0\xb8 (\xd0\xa6\xd1\x80\xd0\xbd\xd0\xb0 \xd0\x93\xd0\xbe\xd1\x80\xd0\xb0)\0" + "SRP\0" + "ME\0" + "ar-LB\0" + "Arabic (Lebanon)\0" + "\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 (\xd9\x84\xd8\xa8\xd9\x86\xd8\xa7\xd9\x86)\0" + "ARB\0" + "LB\0" + "en-ZW\0" + "English (Zimbabwe)\0" + "ENW\0" + "ZW\0" + "es-EC\0" + "Spanish (Ecuador)\0" + "espa\xc3\xb1ol (Ecuador)\0" + "ESF\0" + "EC\0" + "fr-CI\0" + "French (C\xc3\xb4te d\xe2\x80\x99Ivoire)\0" + "fran\xc3\xa7\x61is (C\xc3\xb4te d\xe2\x80\x99Ivoire)\0" + "FRI\0" + "CI\0" + "sr-Cyrl-ME\0" + "Serbian (Cyrillic, Montenegro)\0" + "SRQ\0" + "ar-KW\0" + "Arabic (Kuwait)\0" + "\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 (\xd8\xa7\xd9\x84\xd9\x83\xd9\x88\xd9\x8a\xd8\xaa)\0" + "ARK\0" + "KW\0" + "en-PH\0" + "English (Philippines)\0" + "ENP\0" + "es-CL\0" + "Spanish (Chile)\0" + "espa\xc3\xb1ol (Chile)\0" + "ESL\0" + "CL\0" + "fr-ML\0" + "French (Mali)\0" + "fran\xc3\xa7\x61is (Mali)\0" + "FRF\0" + "ML\0" + "ar-AE\0" + "Arabic (United Arab Emirates)\0" + "\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 (\xd8\xa7\xd9\x84\xd8\xa5\xd9\x85\xd8\xa7\xd8\xb1\xd8\xa7\xd8\xaa \xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 \xd8\xa7\xd9\x84\xd9\x85\xd8\xaa\xd8\xad\xd8\xaf\xd8\xa9)\0" + "ARU\0" + "AE\0" + "es-UY\0" + "Spanish (Uruguay)\0" + "espa\xc3\xb1ol (Uruguay)\0" + "ESY\0" + "UY\0" + "fr-MA\0" + "French (Morocco)\0" + "fran\xc3\xa7\x61is (Maroc)\0" + "FRO\0" + "ar-BH\0" + "Arabic (Bahrain)\0" + "\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 (\xd8\xa7\xd9\x84\xd8\xa8\xd8\xad\xd8\xb1\xd9\x8a\xd9\x86)\0" + "ARH\0" + "BH\0" + "en-HK\0" + "English (Hong Kong SAR China)\0" + "ENH\0" + "es-PY\0" + "Spanish (Paraguay)\0" + "espa\xc3\xb1ol (Paraguay)\0" + "ESZ\0" + "PY\0" + "fr-HT\0" + "French (Haiti)\0" + "fran\xc3\xa7\x61is (Ha\xc3\xafti)\0" + "FRH\0" + "HT\0" + "ar-QA\0" + "Arabic (Qatar)\0" + "\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 (\xd9\x82\xd8\xb7\xd8\xb1)\0" + "ARQ\0" + "QA\0" + "en-IN\0" + "English (India)\0" + "ENN\0" + "es-BO\0" + "Spanish (Bolivia)\0" + "espa\xc3\xb1ol (Bolivia)\0" + "ESB\0" + "BO\0" + "en-MY\0" + "English (Malaysia)\0" + "ENM\0" + "es-SV\0" + "Spanish (El Salvador)\0" + "espa\xc3\xb1ol (El Salvador)\0" + "ESE\0" + "SV\0" + "en-SG\0" + "English (Singapore)\0" + "ENE\0" + "es-HN\0" + "Spanish (Honduras)\0" + "espa\xc3\xb1ol (Honduras)\0" + "ESH\0" + "HN\0" + "es-NI\0" + "Spanish (Nicaragua)\0" + "espa\xc3\xb1ol (Nicaragua)\0" + "ESI\0" + "NI\0" + "es-PR\0" + "Spanish (Puerto Rico)\0" + "espa\xc3\xb1ol (Puerto Rico)\0" + "ESU\0" + "PR\0" + "es-US\0" + "Spanish (United States)\0" + "espa\xc3\xb1ol (Estados Unidos)\0" + "EST\0" + "es-CU\0" + "Spanish (Cuba)\0" + "espa\xc3\xb1ol (Cuba)\0" + "ESK\0" + "CU\0" + "bs-Cyrl\0" + "Bosnian (Cyrillic)\0" + "bosanski\0" + "bs-Latn\0" + "Bosnian (Latin)\0" + "sr-Cyrl\0" + "Serbian (Cyrillic)\0" + "\xd1\x81\xd1\x80\xd0\xbf\xd1\x81\xd0\xba\xd0\xb8\0" + "sr-Latn\0" + "Serbian (Latin)\0" + "Inari Sami\0" + "anar\xc3\xa2\xc5\xa1kiel\xc3\xa2\0" + "az-Cyrl\0" + "Azerbaijani (Cyrillic)\0" + "Norwegian Nynorsk\0" + "nynorsk\0" + "Bosnian\0" + "az-Latn\0" + "Azerbaijani (Latin)\0" + "uz-Cyrl\0" + "Uzbek (Cyrillic)\0" + "mn-Cyrl\0" + "Mongolian (Cyrillic)\0" + "zh-Hant\0" + "zh-CHT\0" + "Chinese (Traditional) Legacy\0" + "Norwegian Bokm\xc3\xa5l\0" + "norsk bokm\xc3\xa5l\0" + "Serbian\0" + "SRB\0" + "tg-Cyrl\0" + "Tajik (Cyrillic)\0" + "Lower Sorbian\0" + "dolnoserb\xc5\xa1\xc4\x87ina\0" + "uz-Latn\0" + "Uzbek (Latin)\0" + "pa-Arab\0" + "Punjabi (Arabic)\0" + "tzm-Latn\0" + "Central Atlas Tamazight (Latin)\0" + "ha-Latn\0" + "Hausa (Latin)\0" + "af-za\0" + "am-et\0" + "ar-ae\0" + "ar-bh\0" + "ar-dz\0" + "ar-eg\0" + "ar-iq\0" + "ar-jo\0" + "ar-kw\0" + "ar-lb\0" + "ar-ly\0" + "ar-ma\0" + "ar-om\0" + "ar-qa\0" + "ar-sa\0" + "ar-sy\0" + "ar-tn\0" + "ar-ye\0" + "as-in\0" + "az-cyrl\0" + "az-cyrl-az\0" + "az-latn\0" + "az-latn-az\0" + "be-by\0" + "bg-bg\0" + "bn-bd\0" + "bn-in\0" + "bo-cn\0" + "br-fr\0" + "bs-cyrl\0" + "bs-cyrl-ba\0" + "bs-latn\0" + "bs-latn-ba\0" + "ca-es\0" + "ca-es-valencia\0" + "cs-cz\0" + "cy-gb\0" + "da-dk\0" + "de-at\0" + "de-ch\0" + "de-de\0" + "de-li\0" + "de-lu\0" + "dsb-de\0" + "el-gr\0" + "en-au\0" + "en-bz\0" + "en-ca\0" + "en-gb\0" + "en-hk\0" + "en-ie\0" + "en-in\0" + "en-jm\0" + "en-my\0" + "en-nz\0" + "en-ph\0" + "en-sg\0" + "en-tt\0" + "en-us\0" + "en-za\0" + "en-zw\0" + "es-ar\0" + "es-bo\0" + "es-cl\0" + "es-co\0" + "es-cr\0" + "es-cu\0" + "es-do\0" + "es-ec\0" + "es-es\0" + "es-gt\0" + "es-hn\0" + "es-mx\0" + "es-ni\0" + "es-pa\0" + "es-pe\0" + "es-pr\0" + "es-py\0" + "es-sv\0" + "es-us\0" + "es-uy\0" + "es-ve\0" + "et-ee\0" + "eu-es\0" + "fa-ir\0" + "fi-fi\0" + "fil-ph\0" + "fo-fo\0" + "fr-be\0" + "fr-ca\0" + "fr-cd\0" + "fr-ch\0" + "fr-ci\0" + "fr-cm\0" + "fr-fr\0" + "fr-ht\0" + "fr-lu\0" + "fr-ma\0" + "fr-mc\0" + "fr-ml\0" + "fr-re\0" + "fr-sn\0" + "fy-nl\0" + "ga-ie\0" + "gd-gb\0" + "gl-es\0" + "gsw-fr\0" + "gu-in\0" + "ha-latn\0" + "ha-latn-ng\0" + "haw-us\0" + "he-il\0" + "hi-in\0" + "hr-ba\0" + "hr-hr\0" + "hsb-de\0" + "hu-hu\0" + "hy-am\0" + "id-id\0" + "ig-ng\0" + "ii-cn\0" + "is-is\0" + "it-ch\0" + "it-it\0" + "ja-jp\0" + "ka-ge\0" + "kk-kz\0" + "kl-gl\0" + "km-kh\0" + "kn-in\0" + "ko-kr\0" + "kok-in\0" + "ky-kg\0" + "lb-lu\0" + "lo-la\0" + "lt-lt\0" + "lv-lv\0" + "mk-mk\0" + "ml-in\0" + "mn-cyrl\0" + "mn-mn\0" + "mr-in\0" + "ms-bn\0" + "ms-my\0" + "mt-mt\0" + "my-mm\0" + "nb-no\0" + "ne-in\0" + "ne-np\0" + "nl-be\0" + "nl-nl\0" + "nn-no\0" + "nso-za\0" + "om-et\0" + "or-in\0" + "pa-arab\0" + "pa-arab-pk\0" + "pl-pl\0" + "ps-af\0" + "pt-br\0" + "pt-pt\0" + "rm-ch\0" + "ro-md\0" + "ro-ro\0" + "ru-md\0" + "ru-ru\0" + "rw-rw\0" + "sah-ru\0" + "se-fi\0" + "se-no\0" + "se-se\0" + "si-lk\0" + "sk-sk\0" + "sl-si\0" + "smn-fi\0" + "so-so\0" + "sq-al\0" + "sr-cyrl\0" + "sr-cyrl-ba\0" + "sr-cyrl-me\0" + "sr-cyrl-rs\0" + "sr-latn\0" + "sr-latn-ba\0" + "sr-latn-me\0" + "sr-latn-rs\0" + "st-za\0" + "sv-fi\0" + "sv-se\0" + "sw-ke\0" + "ta-in\0" + "ta-lk\0" + "te-in\0" + "tg-cyrl\0" + "tg-cyrl-tj\0" + "th-th\0" + "ti-er\0" + "ti-et\0" + "tk-tm\0" + "tn-bw\0" + "tn-za\0" + "tr-tr\0" + "ts-za\0" + "tzm-latn\0" + "ug-cn\0" + "uk-ua\0" + "ur-in\0" + "ur-pk\0" + "uz-cyrl\0" + "uz-cyrl-uz\0" + "uz-latn\0" + "uz-latn-uz\0" + "vi-vn\0" + "xh-za\0" + "yo-ng\0" + "zh-chs\0" + "zh-cht\0" + "zh-cn\0" + "zh-hans\0" + "zh-hant\0" + "zh-hk\0" + "zh-mo\0" + "zh-sg\0" + "zh-tw\0" + "zu-za\0" + "United Arab Emirates\0" + "\xd8\xa7\xd9\x84\xd8\xa5\xd9\x85\xd8\xa7\xd8\xb1\xd8\xa7\xd8\xaa \xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 \xd8\xa7\xd9\x84\xd9\x85\xd8\xaa\xd8\xad\xd8\xaf\xd8\xa9\0" + "AED\0" + "United Arab Emirates Dirham\0" + "\xd8\xaf\xd8\xb1\xd9\x87\xd9\x85 \xd8\xa5\xd9\x85\xd8\xa7\xd8\xb1\xd8\xa7\xd8\xaa\xd9\x8a\0" + "AFG\0" + "Afghanistan\0" + "\xd8\xa7\xd9\x81\xd8\xba\xd8\xa7\xd9\x86\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\0" + "AFN\0" + "Afghan Afghani\0" + "\xd8\xa7\xd9\x81\xd8\xba\xd8\xa7\xd9\x86\xdb\x8d\0" + "ALB\0" + "Albania\0" + "Shqip\xc3\xabri\0" + "ALL\0" + "Albanian Lek\0" + "Leku shqiptar\0" + "Armenia\0" + "\xd5\x80\xd5\xa1\xd5\xb5\xd5\xa1\xd5\xbd\xd5\xbf\xd5\xa1\xd5\xb6\0" + "AMD\0" + "Armenian Dram\0" + "\xd5\x80\xd5\xa1\xd5\xb5\xd5\xaf\xd5\xa1\xd5\xaf\xd5\xa1\xd5\xb6 \xd5\xa4\xd6\x80\xd5\xa1\xd5\xb4\0" + "Argentina\0" + "Argentine Peso\0" + "peso argentino\0" + "AUT\0" + "Austria\0" + "\xc3\x96sterreich\0" + "EUR\0" + "Euro\0" + "AUS\0" + "Australia\0" + "AUD\0" + "Australian Dollar\0" + "Azerbaijan\0" + "Az\xc9\x99rbaycan\0" + "AZN\0" + "Azerbaijani Manat\0" + "Az\xc9\x99rbaycan Manat\xc4\xb1\0" + "BIH\0" + "Bosnia & Herzegovina\0" + "Bosna i Hercegovina\0" + "BAM\0" + "Bosnia-Herzegovina Convertible Mark\0" + "konvertibilna marka\0" + "BGD\0" + "Bangladesh\0" + "\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe\xe0\xa6\xa6\xe0\xa7\x87\xe0\xa6\xb6\0" + "BDT\0" + "Bangladeshi Taka\0" + "\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\x82\xe0\xa6\xb2\xe0\xa6\xbe\xe0\xa6\xa6\xe0\xa7\x87\xe0\xa6\xb6\xe0\xa7\x80 \xe0\xa6\x9f\xe0\xa6\xbe\xe0\xa6\x95\xe0\xa6\xbe\0" + "Belgium\0" + "Belgique\0" + "euro\0" + "Bulgaria\0" + "\xd0\x91\xd1\x8a\xd0\xbb\xd0\xb3\xd0\xb0\xd1\x80\xd0\xb8\xd1\x8f\0" + "BGN\0" + "Bulgarian Lev\0" + "\xd0\x91\xd1\x8a\xd0\xbb\xd0\xb3\xd0\xb0\xd1\x80\xd1\x81\xd0\xba\xd0\xb8 \xd0\xbb\xd0\xb5\xd0\xb2\0" + "BHR\0" + "Bahrain\0" + "\xd8\xa7\xd9\x84\xd8\xa8\xd8\xad\xd8\xb1\xd9\x8a\xd9\x86\0" + "BHD\0" + "Bahraini Dinar\0" + "\xd8\xaf\xd9\x8a\xd9\x86\xd8\xa7\xd8\xb1 \xd8\xa8\xd8\xad\xd8\xb1\xd9\x8a\xd9\x86\xd9\x8a\0" + "BRN\0" + "Brunei\0" + "BND\0" + "Brunei Dollar\0" + "Dolar Brunei\0" + "BOL\0" + "Bolivia\0" + "Bolivian Boliviano\0" + "boliviano\0" + "BRA\0" + "Brazil\0" + "Brasil\0" + "BRL\0" + "Brazilian Real\0" + "Real brasileiro\0" + "BWA\0" + "Botswana\0" + "BWP\0" + "Botswanan Pula\0" + "BLR\0" + "Belarus\0" + "\xd0\x91\xd0\xb5\xd0\xbb\xd0\xb0\xd1\x80\xd1\x83\xd1\x81\xd1\x8c\0" + "BYN\0" + "Belarusian Ruble\0" + "\xd0\xb1\xd0\xb5\xd0\xbb\xd0\xb0\xd1\x80\xd1\x83\xd1\x81\xd0\xba\xd1\x96 \xd1\x80\xd1\x83\xd0\xb1\xd0\xb5\xd0\xbb\xd1\x8c\0" + "BLZ\0" + "Belize\0" + "BZD\0" + "Belize Dollar\0" + "CAN\0" + "Canada\0" + "CAD\0" + "Canadian Dollar\0" + "dollar canadien\0" + "COD\0" + "Congo - Kinshasa\0" + "Congo-Kinshasa\0" + "CDF\0" + "Congolese Franc\0" + "franc congolais\0" + "CHE\0" + "Switzerland\0" + "Svizra\0" + "Swiss Franc\0" + "franc svizzer\0" + "CIV\0" + "C\xc3\xb4te d\xe2\x80\x99Ivoire\0" + "XOF\0" + "West African CFA Franc\0" + "franc CFA (BCEAO)\0" + "CHL\0" + "Chile\0" + "CLP\0" + "Chilean Peso\0" + "Peso chileno\0" + "CMR\0" + "Cameroon\0" + "Cameroun\0" + "XAF\0" + "Central African CFA Franc\0" + "franc CFA (BEAC)\0" + "CHN\0" + "China\0" + "\xe0\xbd\xa2\xe0\xbe\x92\xe0\xbe\xb1\xe0\xbc\x8b\xe0\xbd\x93\xe0\xbd\x82\0" + "CNY\0" + "Chinese Yuan\0" + "\xe0\xbd\xa1\xe0\xbd\xb4\xe0\xbc\x8b\xe0\xbd\xa8\xe0\xbd\x93\xe0\xbc\x8b\0" + "COL\0" + "Colombia\0" + "COP\0" + "Colombian Peso\0" + "peso colombiano\0" + "CRI\0" + "Costa Rica\0" + "CRC\0" + "Costa Rican Col\xc3\xb3n\0" + "col\xc3\xb3n costarricense\0" + "CUB\0" + "Cuba\0" + "CUP\0" + "Cuban Peso\0" + "peso cubano\0" + "CZE\0" + "Czech Republic\0" + "\xc4\x8c\x65sk\xc3\xa1 republika\0" + "CZK\0" + "Czech Republic Koruna\0" + "\xc4\x8d\x65sk\xc3\xa1 koruna\0" + "Germany\0" + "Deutschland\0" + "DNK\0" + "Denmark\0" + "Danmark\0" + "DKK\0" + "Danish Krone\0" + "dansk krone\0" + "DOM\0" + "Dominican Republic\0" + "Rep\xc3\xba\x62lica Dominicana\0" + "DOP\0" + "Dominican Peso\0" + "peso dominicano\0" + "DZA\0" + "Algeria\0" + "\xd8\xa7\xd9\x84\xd8\xac\xd8\xb2\xd8\xa7\xd8\xa6\xd8\xb1\0" + "DZD\0" + "Algerian Dinar\0" + "\xd8\xaf\xd9\x8a\xd9\x86\xd8\xa7\xd8\xb1 \xd8\xac\xd8\xb2\xd8\xa7\xd8\xa6\xd8\xb1\xd9\x8a\0" + "ECU\0" + "Ecuador\0" + "USD\0" + "US Dollar\0" + "d\xc3\xb3lar estadounidense\0" + "Estonia\0" + "Eesti\0" + "EGY\0" + "Egypt\0" + "\xd9\x85\xd8\xb5\xd8\xb1\0" + "EGP\0" + "Egyptian Pound\0" + "\xd8\xac\xd9\x86\xd9\x8a\xd9\x87 \xd9\x85\xd8\xb5\xd8\xb1\xd9\x8a\0" + "ERI\0" + "Eritrea\0" + "\xe1\x8a\xa4\xe1\x88\xad\xe1\x89\xb5\xe1\x88\xab\0" + "ERN\0" + "Eritrean Nakfa\0" + "Spain\0" + "Espanya\0" + "ETH\0" + "Ethiopia\0" + "\xe1\x8a\xa2\xe1\x89\xb5\xe1\x8b\xae\xe1\x8c\xb5\xe1\x8b\xab\0" + "ETB\0" + "Ethiopian Birr\0" + "\xe1\x8b\xa8\xe1\x8a\xa2\xe1\x89\xb5\xe1\x8b\xae\xe1\x8c\xb5\xe1\x8b\xab \xe1\x89\xa5\xe1\x88\xad\0" + "Finland\0" + "Suomi\0" + "Faroe Islands\0" + "F\xc3\xb8royar\0" + "donsk kr\xc3\xb3na\0" + "France\0" + "GBR\0" + "United Kingdom\0" + "Y Deyrnas Unedig\0" + "GBP\0" + "British Pound\0" + "Punt Prydain\0" + "GEO\0" + "Georgia\0" + "\xe1\x83\xa1\xe1\x83\x90\xe1\x83\xa5\xe1\x83\x90\xe1\x83\xa0\xe1\x83\x97\xe1\x83\x95\xe1\x83\x94\xe1\x83\x9a\xe1\x83\x9d\0" + "GEL\0" + "Georgian Lari\0" + "\xe1\x83\xa5\xe1\x83\x90\xe1\x83\xa0\xe1\x83\x97\xe1\x83\xa3\xe1\x83\x9a\xe1\x83\x98 \xe1\x83\x9a\xe1\x83\x90\xe1\x83\xa0\xe1\x83\x98\0" + "GRL\0" + "Greenland\0" + "Kalaallit Nunaat\0" + "danmarkimut koruuni\0" + "GRC\0" + "Greece\0" + "\xce\x95\xce\xbb\xce\xbb\xce\xac\xce\xb4\xce\xb1\0" + "\xce\x95\xcf\x85\xcf\x81\xcf\x8e\0" + "GTM\0" + "Guatemala\0" + "GTQ\0" + "Guatemalan Quetzal\0" + "quetzal\0" + "HKG\0" + "Hong Kong SAR China\0" + "\xe4\xb8\xad\xe5\x9b\xbd\xe9\xa6\x99\xe6\xb8\xaf\xe7\x89\xb9\xe5\x88\xab\xe8\xa1\x8c\xe6\x94\xbf\xe5\x8c\xba\0" + "HKD\0" + "Hong Kong Dollar\0" + "\xe6\xb8\xaf\xe5\x85\x83\0" + "HND\0" + "Honduras\0" + "HNL\0" + "Honduran Lempira\0" + "lempira hondure\xc3\xb1o\0" + "Croatia\0" + "Hrvatska\0" + "Croatian Kuna\0" + "hrvatska kuna\0" + "HTI\0" + "Haiti\0" + "Ha\xc3\xafti\0" + "HTG\0" + "Haitian Gourde\0" + "gourde ha\xc3\xaftienne\0" + "Hungary\0" + "Magyarorsz\xc3\xa1g\0" + "HUF\0" + "Hungarian Forint\0" + "magyar forint\0" + "IDN\0" + "IDR\0" + "Indonesian Rupiah\0" + "Rupiah Indonesia\0" + "IRL\0" + "Ireland\0" + "\xc3\x89ire\0" + "ISR\0" + "Israel\0" + "\xd7\x99\xd7\xa9\xd7\xa8\xd7\x90\xd7\x9c\0" + "ILS\0" + "Israeli New Shekel\0" + "\xd7\xa9\xd7\xa7\xd7\x9c \xd7\x97\xd7\x93\xd7\xa9\0" + "India\0" + "\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\0" + "INR\0" + "Indian Rupee\0" + "\xe0\xa4\xad\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa4\xa4\xe0\xa5\x80\xe0\xa4\xaf \xe0\xa4\xb0\xe0\xa5\x81\xe0\xa4\xaa\xe0\xa4\xaf\xe0\xa4\xbe\0" + "IRQ\0" + "Iraq\0" + "\xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa7\xd9\x82\0" + "IQD\0" + "Iraqi Dinar\0" + "\xd8\xaf\xd9\x8a\xd9\x86\xd8\xa7\xd8\xb1 \xd8\xb9\xd8\xb1\xd8\xa7\xd9\x82\xd9\x8a\0" + "IRN\0" + "Iran\0" + "\xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86\0" + "IRR\0" + "Iranian Rial\0" + "\xd8\xb1\xdb\x8c\xd8\xa7\xd9\x84 \xd8\xa7\xdb\x8c\xd8\xb1\xd8\xa7\xd9\x86\0" + "Iceland\0" + "\xc3\x8dsland\0" + "Icelandic Kr\xc3\xb3na\0" + "\xc3\xadslensk kr\xc3\xb3na\0" + "Italy\0" + "Italia\0" + "JAM\0" + "Jamaica\0" + "JMD\0" + "Jamaican Dollar\0" + "JOR\0" + "Jordan\0" + "\xd8\xa7\xd9\x84\xd8\xa3\xd8\xb1\xd8\xaf\xd9\x86\0" + "JOD\0" + "Jordanian Dinar\0" + "\xd8\xaf\xd9\x8a\xd9\x86\xd8\xa7\xd8\xb1 \xd8\xa3\xd8\xb1\xd8\xaf\xd9\x86\xd9\x8a\0" + "Japan\0" + "\xe6\x97\xa5\xe6\x9c\xac\0" + "JPY\0" + "Japanese Yen\0" + "\xe6\x97\xa5\xe6\x9c\xac\xe5\x86\x86\0" + "KEN\0" + "Kenya\0" + "KES\0" + "Kenyan Shilling\0" + "Shilingi ya Kenya\0" + "KGZ\0" + "Kyrgyzstan\0" + "\xd0\x9a\xd1\x8b\xd1\x80\xd0\xb3\xd1\x8b\xd0\xb7\xd1\x81\xd1\x82\xd0\xb0\xd0\xbd\0" + "KGS\0" + "Kyrgystani Som\0" + "\xd0\x9a\xd1\x8b\xd1\x80\xd0\xb3\xd1\x8b\xd0\xb7\xd1\x81\xd1\x82\xd0\xb0\xd0\xbd \xd1\x81\xd0\xbe\xd0\xbc\xd1\x83\0" + "Cambodia\0" + "\xe1\x9e\x80\xe1\x9e\x98\xe1\x9f\x92\xe1\x9e\x96\xe1\x9e\xbb\xe1\x9e\x87\xe1\x9e\xb6\0" + "KHR\0" + "Cambodian Riel\0" + "\xe1\x9e\x9a\xe1\x9f\x80\xe1\x9e\x9b\xe2\x80\x8b\xe1\x9e\x80\xe1\x9e\x98\xe1\x9f\x92\xe1\x9e\x96\xe1\x9e\xbb\xe1\x9e\x87\xe1\x9e\xb6\0" + "South Korea\0" + "\xeb\x8c\x80\xed\x95\x9c\xeb\xaf\xbc\xea\xb5\xad\0" + "KRW\0" + "South Korean Won\0" + "\xeb\x8c\x80\xed\x95\x9c\xeb\xaf\xbc\xea\xb5\xad \xec\x9b\x90\0" + "KWT\0" + "Kuwait\0" + "\xd8\xa7\xd9\x84\xd9\x83\xd9\x88\xd9\x8a\xd8\xaa\0" + "KWD\0" + "Kuwaiti Dinar\0" + "\xd8\xaf\xd9\x8a\xd9\x86\xd8\xa7\xd8\xb1 \xd9\x83\xd9\x88\xd9\x8a\xd8\xaa\xd9\x8a\0" + "KAZ\0" + "Kazakhstan\0" + "\xd2\x9a\xd0\xb0\xd0\xb7\xd0\xb0\xd2\x9b\xd1\x81\xd1\x82\xd0\xb0\xd0\xbd\0" + "KZT\0" + "Kazakhstani Tenge\0" + "\xd2\x9a\xd0\xb0\xd0\xb7\xd0\xb0\xd2\x9b\xd1\x81\xd1\x82\xd0\xb0\xd0\xbd \xd1\x82\xd0\xb5\xd2\xa3\xd0\xb3\xd0\xb5\xd1\x81\xd1\x96\0" + "Laos\0" + "LAK\0" + "Laotian Kip\0" + "\xe0\xba\xa5\xe0\xba\xb2\xe0\xba\xa7 \xe0\xba\x81\xe0\xba\xb5\xe0\xba\x9a\0" + "LBN\0" + "Lebanon\0" + "\xd9\x84\xd8\xa8\xd9\x86\xd8\xa7\xd9\x86\0" + "LBP\0" + "Lebanese Pound\0" + "\xd8\xac\xd9\x86\xd9\x8a\xd9\x87 \xd9\x84\xd8\xa8\xd9\x86\xd8\xa7\xd9\x86\xd9\x8a\0" + "LIE\0" + "Liechtenstein\0" + "Schweizer Franken\0" + "LKA\0" + "Sri Lanka\0" + "\xe0\xb7\x81\xe0\xb7\x8a\xe2\x80\x8d\xe0\xb6\xbb\xe0\xb7\x93 \xe0\xb6\xbd\xe0\xb6\x82\xe0\xb6\x9a\xe0\xb7\x8f\xe0\xb7\x80\0" + "LKR\0" + "Sri Lankan Rupee\0" + "\xe0\xb7\x81\xe0\xb7\x8a\xe2\x80\x8d\xe0\xb6\xbb\xe0\xb7\x93 \xe0\xb6\xbd\xe0\xb6\x82\xe0\xb6\x9a\xe0\xb7\x8f \xe0\xb6\xbb\xe0\xb7\x94\xe0\xb6\xb4\xe0\xb7\x92\xe0\xb6\xba\xe0\xb6\xbd\0" + "LTU\0" + "Lithuania\0" + "Lietuva\0" + "Euras\0" + "LUX\0" + "Luxembourg\0" + "L\xc3\xabtzebuerg\0" + "LVA\0" + "Latvia\0" + "Latvija\0" + "eiro\0" + "LBY\0" + "Libya\0" + "\xd9\x84\xd9\x8a\xd8\xa8\xd9\x8a\xd8\xa7\0" + "LYD\0" + "Libyan Dinar\0" + "\xd8\xaf\xd9\x8a\xd9\x86\xd8\xa7\xd8\xb1 \xd9\x84\xd9\x8a\xd8\xa8\xd9\x8a\0" + "Morocco\0" + "\xd8\xa7\xd9\x84\xd9\x85\xd8\xba\xd8\xb1\xd8\xa8\0" + "Moroccan Dirham\0" + "\xd8\xaf\xd8\xb1\xd9\x87\xd9\x85 \xd9\x85\xd8\xba\xd8\xb1\xd8\xa8\xd9\x8a\0" + "MCO\0" + "Monaco\0" + "MDA\0" + "Moldova\0" + "Republica Moldova\0" + "MDL\0" + "Moldovan Leu\0" + "leu moldovenesc\0" + "MNE\0" + "Montenegro\0" + "\xd0\xa6\xd1\x80\xd0\xbd\xd0\xb0 \xd0\x93\xd0\xbe\xd1\x80\xd0\xb0\0" + "Evro\0" + "MKD\0" + "Macedonia\0" + "\xd0\x9c\xd0\xb0\xd0\xba\xd0\xb5\xd0\xb4\xd0\xbe\xd0\xbd\xd0\xb8\xd1\x98\xd0\xb0\0" + "Macedonian Denar\0" + "\xd0\x9c\xd0\xb0\xd0\xba\xd0\xb5\xd0\xb4\xd0\xbe\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8 \xd0\xb4\xd0\xb5\xd0\xbd\xd0\xb0\xd1\x80\0" + "MLI\0" + "Mali\0" + "MMR\0" + "Myanmar (Burma)\0" + "MMK\0" + "Myanmar Kyat\0" + "\xe1\x80\x99\xe1\x80\xbc\xe1\x80\x94\xe1\x80\xba\xe1\x80\x99\xe1\x80\xac\xe1\x80\x80\xe1\x80\xbb\xe1\x80\x95\xe1\x80\xba\0" + "MNG\0" + "Mongolia\0" + "\xd0\x9c\xd0\xbe\xd0\xbd\xd0\xb3\xd0\xbe\xd0\xbb\0" + "MNT\0" + "Mongolian Tugrik\0" + "\xd1\x82\xd3\xa9\xd0\xb3\xd1\x80\xd3\xa9\xd0\xb3\0" + "MAC\0" + "Macau SAR China\0" + "\xe4\xb8\xad\xe5\x9b\xbd\xe6\xbe\xb3\xe9\x97\xa8\xe7\x89\xb9\xe5\x88\xab\xe8\xa1\x8c\xe6\x94\xbf\xe5\x8c\xba\0" + "MOP\0" + "Macanese Pataca\0" + "\xe6\xbe\xb3\xe9\x96\x80\xe5\x85\x83\0" + "Malta\0" + "ewro\0" + "MEX\0" + "Mexico\0" + "M\xc3\xa9xico\0" + "MXN\0" + "Mexican Peso\0" + "peso mexicano\0" + "MYS\0" + "Malaysia\0" + "MYR\0" + "Malaysian Ringgit\0" + "Ringgit Malaysia\0" + "NGA\0" + "Nigeria\0" + "Najeriya\0" + "NGN\0" + "Nigerian Naira\0" + "Naira\0" + "NIC\0" + "Nicaragua\0" + "NIO\0" + "Nicaraguan C\xc3\xb3rdoba\0" + "c\xc3\xb3rdoba nicarag\xc3\xbc\x65nse\0" + "Netherlands\0" + "Nederland\0" + "Norway\0" + "Norge\0" + "NOK\0" + "Norwegian Krone\0" + "norske kroner\0" + "NPL\0" + "Nepal\0" + "\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\xb2\0" + "NPR\0" + "Nepalese Rupee\0" + "\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\xb2\xe0\xa5\x80 \xe0\xa4\xb0\xe0\xa5\x82\xe0\xa4\xaa\xe0\xa5\x88\xe0\xa4\xaf\xe0\xa4\xbe\xe0\xa4\x81\0" + "NZL\0" + "New Zealand\0" + "NZD\0" + "New Zealand Dollar\0" + "OMN\0" + "Oman\0" + "\xd8\xb9\xd9\x8f\xd9\x85\xd8\xa7\xd9\x86\0" + "OMR\0" + "Omani Rial\0" + "\xd8\xb1\xd9\x8a\xd8\xa7\xd9\x84 \xd8\xb9\xd9\x85\xd8\xa7\xd9\x86\xd9\x8a\0" + "Panama\0" + "Panam\xc3\xa1\0" + "PAB\0" + "Panamanian Balboa\0" + "balboa paname\xc3\xb1o\0" + "PER\0" + "Peru\0" + "Per\xc3\xba\0" + "PEN\0" + "Peruvian Sol\0" + "nuevo sol peruano\0" + "PHL\0" + "Philippines\0" + "Pilipinas\0" + "PHP\0" + "Philippine Peso\0" + "Piso ng Pilipinas\0" + "PAK\0" + "Pakistan\0" + "\xd9\xbe\xd8\xa7\xda\xa9\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\0" + "PKR\0" + "Pakistani Rupee\0" + "\xd9\xbe\xd8\xa7\xda\xa9\xd8\xb3\xd8\xaa\xd8\xa7\xd9\x86\xdb\x8c \xd8\xb1\xd9\x88\xd9\xbe\xdb\x8c\xdb\x81\0" + "POL\0" + "Poland\0" + "Polska\0" + "PLN\0" + "Polish Zloty\0" + "z\xc5\x82oty polski\0" + "PRI\0" + "Puerto Rico\0" + "PRT\0" + "Portugal\0" + "PRY\0" + "Paraguay\0" + "PYG\0" + "Paraguayan Guarani\0" + "guaran\xc3\xad paraguayo\0" + "QAT\0" + "Qatar\0" + "\xd9\x82\xd8\xb7\xd8\xb1\0" + "QAR\0" + "Qatari Rial\0" + "\xd8\xb1\xd9\x8a\xd8\xa7\xd9\x84 \xd9\x82\xd8\xb7\xd8\xb1\xd9\x8a\0" + "REU\0" + "R\xc3\xa9union\0" + "La R\xc3\xa9union\0" + "ROU\0" + "Romania\0" + "Rom\xc3\xa2nia\0" + "Romanian Leu\0" + "leu rom\xc3\xa2nesc\0" + "Serbia\0" + "\xd0\xa1\xd1\x80\xd0\xb1\xd0\xb8\xd1\x98\xd0\xb0\0" + "Serbian Dinar\0" + "Srpski dinar\0" + "Russia\0" + "\xd0\xa0\xd0\xbe\xd1\x81\xd1\x81\xd0\xb8\xd1\x8f\0" + "RUB\0" + "Russian Ruble\0" + "\xd0\xa0\xd0\xbe\xd1\x81\xd1\x81\xd0\xb8\xd0\xb9\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd1\x80\xd1\x83\xd0\xb1\xd0\xbb\xd1\x8c\0" + "RWA\0" + "Rwanda\0" + "RWF\0" + "Rwandan Franc\0" + "SAU\0" + "Saudi Arabia\0" + "\xd8\xa7\xd9\x84\xd9\x85\xd9\x85\xd9\x84\xd9\x83\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\xd8\xa9\0" + "SAR\0" + "Saudi Riyal\0" + "\xd8\xb1\xd9\x8a\xd8\xa7\xd9\x84 \xd8\xb3\xd8\xb9\xd9\x88\xd8\xaf\xd9\x8a\0" + "SWE\0" + "Sweden\0" + "Sverige\0" + "SEK\0" + "Swedish Krona\0" + "svensk krona\0" + "SGP\0" + "Singapore\0" + "\xe6\x96\xb0\xe5\x8a\xa0\xe5\x9d\xa1\0" + "SGD\0" + "Singapore Dollar\0" + "\xe6\x96\xb0\xe5\x8a\xa0\xe5\x9d\xa1\xe5\x85\x83\0" + "SVN\0" + "Slovenia\0" + "Slovenija\0" + "evro\0" + "SVK\0" + "Slovakia\0" + "Slovensko\0" + "SEN\0" + "Senegal\0" + "S\xc3\xa9n\xc3\xa9gal\0" + "Somalia\0" + "Soomaaliya\0" + "SOS\0" + "Somali Shilling\0" + "Shilin soomaali\0" + "El Salvador\0" + "SYR\0" + "Syria\0" + "\xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa7\0" + "SYP\0" + "Syrian Pound\0" + "\xd9\x84\xd9\x8a\xd8\xb1\xd8\xa9 \xd8\xb3\xd9\x88\xd8\xb1\xd9\x8a\xd8\xa9\0" + "Thailand\0" + "Thai Baht\0" + "\xe0\xb8\x9a\xe0\xb8\xb2\xe0\xb8\x97\xe0\xb9\x84\xe0\xb8\x97\xe0\xb8\xa2\0" + "TJK\0" + "Tajikistan\0" + "\xd0\xa2\xd0\xbe\xd2\xb7\xd0\xb8\xd0\xba\xd0\xb8\xd1\x81\xd1\x82\xd0\xbe\xd0\xbd\0" + "TJS\0" + "Tajikistani Somoni\0" + "\xd0\xa1\xd0\xbe\xd0\xbc\xd0\xbe\xd0\xbd\xd3\xa3\0" + "TKM\0" + "Turkmenistan\0" + "T\xc3\xbcrkmenistan\0" + "Turkmenistani Manat\0" + "T\xc3\xbcrkmen manaty\0" + "TUN\0" + "Tunisia\0" + "\xd8\xaa\xd9\x88\xd9\x86\xd8\xb3\0" + "TND\0" + "Tunisian Dinar\0" + "\xd8\xaf\xd9\x8a\xd9\x86\xd8\xa7\xd8\xb1 \xd8\xaa\xd9\x88\xd9\x86\xd8\xb3\xd9\x8a\0" + "TUR\0" + "Turkey\0" + "T\xc3\xbcrkiye\0" + "TRY\0" + "Turkish Lira\0" + "T\xc3\xbcrk Liras\xc4\xb1\0" + "TTO\0" + "Trinidad & Tobago\0" + "TTD\0" + "Trinidad & Tobago Dollar\0" + "TWN\0" + "Taiwan\0" + "\xe5\x8f\xb0\xe6\xb9\xbe\0" + "TWD\0" + "New Taiwan Dollar\0" + "\xe6\x96\xb0\xe5\x8f\xb0\xe5\xb9\xa3\0" + "Ukraine\0" + "\xd0\xa3\xd0\xba\xd1\x80\xd0\xb0\xd1\x97\xd0\xbd\xd0\xb0\0" + "UAH\0" + "Ukrainian Hryvnia\0" + "\xd1\x83\xd0\xba\xd1\x80\xd0\xb0\xd1\x97\xd0\xbd\xd1\x81\xd1\x8c\xd0\xba\xd0\xb0 \xd0\xb3\xd1\x80\xd0\xb8\xd0\xb2\xd0\xbd\xd1\x8f\0" + "USA\0" + "United States\0" + "URY\0" + "Uruguay\0" + "UYU\0" + "Uruguayan Peso\0" + "peso uruguayo\0" + "Uzbekistan\0" + "O\xca\xbbzbekiston\0" + "UZS\0" + "Uzbekistani Som\0" + "O\xe2\x80\x98zbekiston so\xe2\x80\x98mi\0" + "VEN\0" + "Venezuela\0" + "VEF\0" + "Venezuelan Bol\xc3\xadvar\0" + "bol\xc3\xadvar venezolano\0" + "VNM\0" + "Vietnam\0" + "Vi\xe1\xbb\x87t Nam\0" + "VND\0" + "Vietnamese Dong\0" + "\xc4\x90\xe1\xbb\x93ng Vi\xe1\xbb\x87t Nam\0" + "YEM\0" + "Yemen\0" + "\xd8\xa7\xd9\x84\xd9\x8a\xd9\x85\xd9\x86\0" + "YER\0" + "Yemeni Rial\0" + "\xd8\xb1\xd9\x8a\xd8\xa7\xd9\x84 \xd9\x8a\xd9\x85\xd9\x86\xd9\x8a\0" + "ZAF\0" + "South Africa\0" + "ZAR\0" + "South African Rand\0" + "ZWE\0" + "Zimbabwe\0" +}; + + +static const char patterns [] = { + "\0" + "dd MMMM\0" + "dd/MM/yy\0" + "dd/MM/yyyy\0" + "dd/MMMM/yyyy\0" + "dddd, dd MMMM, yyyy\0" + "hh:mm tt\0" + "HH:mm\0" + "hh:mm:ss tt\0" + "HH:mm:ss\0" + "MMMM, yyyy\0" + "d MMMM\0" + "d.M.yyyy '\xd0\xb3.'\0" + "dd.M.yyyy '\xd0\xb3.'\0" + "d.MM.yyyy '\xd0\xb3.'\0" + "dd.MM.yyyy '\xd0\xb3.'\0" + "dd MMMM yyyy '\xd0\xb3.'\0" + "d MMMM yyyy '\xd0\xb3.'\0" + "dddd, dd MMMM yyyy '\xd0\xb3.'\0" + "dddd, d MMMM yyyy '\xd0\xb3.'\0" + "H:mm\0" + "H:mm:ss\0" + "MMMM yyyy '\xd0\xb3.'\0" + "d/M/yyyy\0" + "d MMM yyyy\0" + "dddd, d MMMM 'de' yyyy\0" + "d MMMM 'de' yyyy\0" + "MMMM 'de' yyyy\0" + "M\xe6\x9c\x88\x64\xe6\x97\xa5\0" + "yyyy/M/d\0" + "yyyy-M-d\0" + "yyyy.M.d\0" + "yyyy/MM/dd\0" + "yyyy-MM-dd\0" + "yyyy.MM.dd\0" + "yy/M/d\0" + "yy-M-d\0" + "yy.M.d\0" + "yy/MM/dd\0" + "yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'd'\xe6\x97\xa5'\0" + "yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'd'\xe6\x97\xa5', dddd\0" + "dddd, yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'd'\xe6\x97\xa5'\0" + "yyyy\xe5\xb9\xb4MMMd\xe6\x97\xa5\0" + "yyyy\xe5\xb9\xb4MMMd\xe6\x97\xa5, dddd\0" + "tt h:mm\0" + "tt hh:mm\0" + "tt h:mm:ss\0" + "tt hh:mm:ss\0" + "yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'\0" + "yyyy'\xe5\xb9\xb4'MMM\0" + "yyyy'\xe5\xb9\xb4'MMMM\0" + "yyyy.M\0" + "d. MMMM\0" + "dd.MM.yyyy\0" + "d. M. yyyy\0" + "dddd d. MMMM yyyy\0" + "d. MMMM yyyy\0" + "MMMM yyyy\0" + "dd-MM-yyyy\0" + "dd-MM-yy\0" + "yyyy MM dd\0" + "dd.MM.yy\0" + "dd. MMM. yyyy\0" + "dddd, d. MMMM yyyy\0" + "d. MMM. yyyy\0" + "HH:mm' Uhr'\0" + "HH:mm:ss' Uhr'\0" + "d/M/yy\0" + "dd/MMM/yyyy\0" + "dddd, d MMMM yyyy\0" + "d MMMM yyyy\0" + "h:mm tt\0" + "h:mm:ss tt\0" + "MMMM d\0" + "M/d/yyyy\0" + "M/d/yy\0" + "MM/dd/yy\0" + "MM/dd/yyyy\0" + "dd-MMM-yy\0" + "dddd, MMMM d, yyyy\0" + "MMMM d, yyyy\0" + "dddd, d MMMM, yyyy\0" + "d MMMM, yyyy\0" + "d 'de' MMMM\0" + "d/MM/yy\0" + "d-M-yy\0" + "dddd, d' de 'MMMM' de 'yyyy\0" + "dddd d' de 'MMMM' de 'yyyy\0" + "d' de 'MMMM' de 'yyyy\0" + "H.mm\0" + "HH.mm\0" + "HH'H'mm\0" + "H.mm.ss\0" + "HH.mm.ss\0" + "HH'H'mm.ss\0" + "MMMM' de 'yyyy\0" + "d.M.yyyy\0" + "dddd d MMMM yyyy\0" + "d MMM yy\0" + "HH' h 'mm\0" + "HH'h'mm\0" + "dd MMMM yyyy\0" + "dd-MMMM-yyyy\0" + "dd '\xd7\x91'MMMM yyyy\0" + "dd MMM yy\0" + "dddd dd MMMM yyyy\0" + "dddd dd '\xd7\x91'MMMM yyyy\0" + "ddd dd '\xd7\x91'MMMM yyyy\0" + "MMMM d.\0" + "yyyy. MM. dd.\0" + "yyyy. MMM d.\0" + "yyyy. MMMM d., dddd\0" + "yyyy. MMMM d.\0" + "yyyy. MMMM\0" + "d. MMM yyyy\0" + "dd.M.yy\0" + "d-MMM-yy\0" + "yyyy'\xe5\xb9\xb4'MM'\xe6\x9c\x88'dd'\xe6\x97\xa5'\0" + "yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'd'\xe6\x97\xa5 'dddd\0" + "yyyy'\xe5\xb9\xb4'MM'\xe6\x9c\x88'dd'\xe6\x97\xa5 'dddd\0" + "yyyy'\xe5\xb9\xb4'MMM'\xe6\x9c\x88'd'\xe6\x97\xa5'\0" + "yyyy'\xe5\xb9\xb4'MMM'\xe6\x9c\x88'd'\xe6\x97\xa5 'dddd\0" + "yyyy'\xe5\xb9\xb4'MMMMd'\xe6\x97\xa5'\0" + "yyyy'\xe5\xb9\xb4'MMMMd'\xe6\x97\xa5 'dddd\0" + "yyyy'\xe5\xb9\xb4'MMM'\xe6\x9c\x88'\0" + "M\xec\x9b\x94 d\xec\x9d\xbc\0" + "yy-MM-dd\0" + "yyyy'\xeb\x85\x84' M'\xec\x9b\x94' d'\xec\x9d\xbc' dddd\0" + "yyyy'\xeb\x85\x84' M'\xec\x9b\x94' d'\xec\x9d\xbc'\0" + "yy'\xeb\x85\x84' M'\xec\x9b\x94' d'\xec\x9d\xbc' dddd\0" + "yy'\xeb\x85\x84' M'\xec\x9b\x94' d'\xec\x9d\xbc'\0" + "yyyy'\xeb\x85\x84' MM'\xec\x9b\x94' dd'\xec\x9d\xbc' dddd\0" + "yyyy'\xeb\x85\x84' MM'\xec\x9b\x94' dd'\xec\x9d\xbc'\0" + "yyyy'\xeb\x85\x84 'MMM'\xec\x9b\x94 'd'\xec\x9d\xbc 'dddd\0" + "yyyy'\xeb\x85\x84 'MMM'\xec\x9b\x94 'd'\xec\x9d\xbc'\0" + "yyyy'\xeb\x85\x84 'MMMM d'\xec\x9d\xbc 'dddd\0" + "yyyy'\xeb\x85\x84 'MMMM d'\xec\x9d\xbc'\0" + "yyyy'\xeb\x85\x84' M'\xec\x9b\x94'\0" + "yyyy'\xeb\x85\x84' MMM'\xec\x9b\x94'\0" + "yyyy'\xeb\x85\x84' MMMM\0" + "d-M-yyyy\0" + "dd.MMM.yyyy\0" + "HH.mm' uur'\0" + "HH:mm' uur'\0" + "HH.mm.ss' uur'\0" + "HH:mm:ss' uur'\0" + "d.MMMM.\0" + "d.M.yy\0" + "dddd, 'ils' d 'da' MMMM yyyy\0" + "d 'da' MMMM yyyy\0" + "d.M.yyyy.\0" + "d.M.yy.\0" + "d. M. yyyy.\0" + "dd.MM.yyyy.\0" + "d. M. yy.\0" + "dd.MM.yy.\0" + "dd. MM. yy.\0" + "d. MMMM yyyy.\0" + "dd. MMMM yyyy.\0" + "dddd, d. MMMM yyyy.\0" + "'den 'd MMMM\0" + "'den 'd MMMM yyyy\0" + "dddd' den 'd MMMM yyyy\0" + "'kl 'H:mm\0" + "'kl 'H:mm:ss\0" + "dd MMM yyyy\0" + "ddd d MMMM yyyy\0" + "'\xe0\xb8\xa7\xe0\xb8\xb1\xe0\xb8\x99'dddd'\xe0\xb8\x97\xe0\xb8\xb5\xe0\xb9\x88' d MMMM gg yyyy\0" + "d.MM.yyyy\0" + "d MMMM yyyy dddd\0" + "dd MMMM, yyyy\0" + "dddd, dd MMMM yyyy\0" + "d MMMM yyyy' \xd1\x80.'\0" + "MMMM yyyy' \xd1\x80.'\0" + "MMMM yyyy \xd0\xb3.\0" + "d. MM. yyyy\0" + "dddd, dd. MMMM yyyy\0" + "dd. MMMM yyyy\0" + "H:mm.ss\0" + "yyyy. 'gada' d. MMM\0" + "dddd, yyyy. 'gada' d. MMMM\0" + "yyyy. 'gada' d. MMMM\0" + "yyyy. 'g'. MMMM\0" + "yyyy 'm'. MMMM d 'd'., dddd\0" + "yyyy 'm'. MMMM d 'd'.\0" + "yyyy MMMM\0" + "d MMMM yyyy' \xd1\x81.'\0" + "dd MMMM yyyy' \xd1\x81.'\0" + "d/MM/yyyy\0" + "d/MMM/yyyy\0" + "d-MMM-yyyy\0" + "dd-MMM-yyyy\0" + "ddd, d-MMMM-yyyy\0" + "ddd, dd-MMMM-yyyy\0" + "d MMMM yyyy, dddd\0" + "yyyy MMM d\0" + "yyyy('e')'ko' MMMM d, dddd\0" + "yyyy('e')'ko' MMMM d\0" + "yyyy('e')'ko' MMMM\0" + "H:mm 'hod\xc5\xba'.\0" + "dd.M.yyyy\0" + "MMMM yyyy '\xd0\xb3'.\0" + "yyyy MMMM d, dddd\0" + "yyyy MMMM d\0" + "MMM d, yyyy\0" + "d MMM, yyyy\0" + "d 'ta'\xe2\x80\x99 MMMM\0" + "dddd, d 'ta'\xe2\x80\x99 MMMM yyyy\0" + "d 'ta'\xe2\x80\x99 MMMM yyyy\0" + "MMMM 'ta'\xe2\x80\x99 yyyy\0" + "yyyy, dd-MMM\0" + "d-MMMM\0" + "d-MMM yy\0" + "dd-MMMM yyyy'-\xd0\xb6.'\0" + "MMMM yyyy'-\xd0\xb6.'\0" + "dd.MM.yy '\xc3\xbd.'\0" + "yyyy'-nji \xc3\xbdyly\xc5\x88 'd'-nji 'MMMM\0" + "yyyy '\xc3\xbd.' MMMM\0" + "dddd, yyyy MMMM dd\0" + "tt hh.mm\0" + "tt h.mm\0" + "tt hh.mm.ss\0" + "tt h.mm.ss\0" + "dd MMMM yyyy dddd\0" + "MMMM dd\0" + "yyyy,MMMM dd, dddd\0" + "MMMM,yy\0" + "MMMM,yyyy\0" + "dddd, yyyy '\xd0\xbe\xd0\xbd\xd1\x8b' MM '\xd1\x81\xd0\xb0\xd1\x80\xd1\x8b\xd0\xbd' d\0" + "yyyy '\xd0\xbe\xd0\xbd\xd1\x8b' MM '\xd1\x81\xd0\xb0\xd1\x80\xd1\x8b\xd0\xbd' d\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8bM\xe0\xbd\x9a\xe0\xbd\xba\xe0\xbd\xa6\xe0\xbc\x8b\x64\0" + "yyyy'\xe0\xbd\xa3\xe0\xbd\xbc\xe0\xbd\xa0\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x9f\xe0\xbe\xb3' M'\xe0\xbd\x9a\xe0\xbd\xba\xe0\xbd\xa6' d\0" + "yyyy'\xe0\xbd\xa3\xe0\xbd\xbc\xe0\xbd\xa0\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x9f\xe0\xbe\xb3' M'\xe0\xbd\x9a\xe0\xbd\xba\xe0\xbd\xa6' d dddd\0" + "yyyy\xe0\xbd\xa3\xe0\xbd\xbc\xe0\xbd\xa0\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x9f\xe0\xbe\xb3 MMM d\0" + "yyyy\xe0\xbd\xa3\xe0\xbd\xbc\xe0\xbd\xa0\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x9f\xe0\xbe\xb3 MMM d dddd\0" + "yyyy'\xe0\xbd\xa3\xe0\xbd\xbc\xe0\xbd\xa0\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b' M\0" + "'\xe1\x9e\x81\xe1\x9f\x82' MM '\xe1\x9e\x86\xe1\x9f\x92\xe1\x9e\x93\xe1\x9e\xb6\xe1\x9f\x86' yyyy\0" + "dddd \xe0\xba\x97\xe0\xba\xb5 d MMMM gg yyyy\0" + "dddd\xe1\x81\x8a dd MMMM yyyy\0" + "dddd, MMMM dd,yyyy\0" + "MMMM dd,yyyy\0" + "dddd, MMMM dd, yyyy\0" + "MMMM dd, yyyy\0" + "dd. MMMM\0" + "dd. MMMMyyyy\0" + "dddd,' den 'd. MMMM yyyy\0" + "dddd,' den 'dd. MMMM yyyy\0" + "H.mm' Auer'\0" + "H:mm:ss' Auer'\0" + "HH:mm:ss' Auer'\0" + "MMMM d'.-at'\0" + "MMMM d'.-at, 'yyyy\0" + "dddd\xe1\x8d\xa1 dd MMMM \xe1\x88\x98\xe1\x8b\x93\xe1\x88\x8d\xe1\x89\xb2 yyyy gg\0" + "M\xe2\x80\x99 \xea\x86\xaa\xe2\x80\x99\x64\xe2\x80\x99 \xea\x91\x8d\xe2\x80\x99\0" + "yyyy'\xea\x88\x8e' M'\xea\x86\xaa' d'\xea\x91\x8d'\0" + "dddd, yyyy'\xea\x88\x8e' M'\xea\x86\xaa' d'\xea\x91\x8d'\0" + "yyyy'\xea\x88\x8e' M'\xea\x86\xaa' d'\xea\x91\x8d', dddd\0" + "yyyy\xea\x88\x8e MMM d\xea\x91\x8d\0" + "dddd, yyyy\xea\x88\x8e MMM d\xea\x91\x8d\0" + "yyyy'\xea\x88\x8e' M'\xea\x86\xaa'\0" + "yyyy-'\xd9\x8a\xd9\x89\xd9\x84' d-MMMM\0" + "yyyy-'\xd9\x8a\xd9\x89\xd9\x84' d-MMMM dddd\0" + "yyyy-'\xd9\x8a\xd9\x89\xd9\x84\xd9\x89' MMM'\xd9\x86\xd9\x89\xda\xad' d'-\xd9\x83\xdb\x88\xd9\x86\xd9\x89'\0" + "yyyy-'\xd9\x8a\xd9\x89\xd9\x84\xd9\x89' MMM'\xd9\x86\xd9\x89\xda\xad' d'-\xd9\x83\xdb\x88\xd9\x86\xd9\x89' dddd\0" + "yyyy-M-d dddd\0" + "yyyy-'\xd9\x8a\xd9\x89\xd9\x84\xd9\x89' MMMM\0" + "MMMM d \xd0\xba\xd2\xaf\xd0\xbd\xd1\x8d\0" + "yyyy MM d\0" + "dd yyyy MM d\0" + "dddd, yyyy '\xd1\x81.' MMMM d '\xd0\xba\xd2\xaf\xd0\xbd\xd1\x8d'\0" + "yyyy '\xd1\x81.' MMMM d '\xd0\xba\xd2\xaf\xd0\xbd\xd1\x8d'\0" + "dddd, MMMM d '\xd0\xba\xd2\xaf\xd0\xbd\xd1\x8d' yyyy '\xd1\x81.'\0" + "yyyy '\xd1\x81.' MMMM\0" + "d'mh' MMMM\0" + "dddd, d'mh' MMMM yyyy\0" + "d'mh' MMMM yyyy\0" + "dddd yyyy\xe5\xb9\xb4MMMd\xe6\x97\xa5\0" + "dddd\xe1\x8d\xa3 dd MMMM \xe1\x88\x98\xe1\x8b\x93\xe1\x88\x8d\xe1\x89\xb2 yyyy gg\0" + "dd.MMMM.\0" + "dd.MMMM\0" + "MMMM.yyyy\0" + "H.mm' u.'\0" + "yy.MM.dd\0" + "d MMM yyyy '\xd0\xb3'.\0" + "dddd, d MMMM yyyy '\xd0\xb3'.\0" + "d MMMM yyyy '\xd0\xb3'.\0" + "d. M. yy\0" + "H:mm' g\xc3\xb3\xc5\xba.'\0" + "'zeger 'H:mm\0" + "H:mm:ss' g\xc3\xb3\xc5\xba.'\0" + "'zeger 'H:mm:ss\0" + "MMMM d'. b.'\0" + "dddd, MMMM d'. b. 'yyyy\0" + "MMMM d'. b. 'yyyy\0" + "h.mm tt\0" + "h.mm.ss tt\0" + "yy MM dd\0" + "dddd', 'MMMM d'. b. 'yyyy\0" + "M/dd/yy\0" + "MMMM-dd-yy\0" + "dd-MMMM\0" + "dddd, d 'de' MMMM 'de' yyyy\0" + "d 'de' MMMM 'de' yyyy\0" + "d. MMM yyyy.\0" + "MMMM yyyy.\0" + "dddd yyyy'\xe5\xb9\xb4'M'\xe6\x9c\x88'd'\xe6\x97\xa5'\0" + "dddd yyyy MM dd\0" + "d/MMMM\0" + "MMMM/yyyy\0" + "dd. MMM. yyyy.\0" + "dddd, dd. MMMM yyyy.\0" + "MMMM/dd\0" + "dd. MM. yy\0" + "MMMM d'. p. '\0" + "MMMM d'. p. 'yyyy\0" + "MMMM-yyyy\0" + "dd MMM,yyyy\0" + "yyyy-MM-dd.\0" + "dddd dd 'de' MMMM 'de' yyyy\0" + "dd 'de' MMMM 'de' yyyy\0" +}; + + +static const char datetime_strings [] = { + "\0" + "\xd9\x85\xd8\xad\xd8\xb1\xd9\x85\0" + "\xd8\xb5\xd9\x81\xd8\xb1\0" + "\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xb9 \xd8\xa7\xd9\x84\xd8\xa3\xd9\x88\xd9\x84\0" + "\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xb9 \xd8\xa7\xd9\x84\xd8\xa2\xd8\xae\xd8\xb1\0" + "\xd8\xac\xd9\x85\xd8\xa7\xd8\xaf\xd9\x89 \xd8\xa7\xd9\x84\xd8\xa3\xd9\x88\xd9\x84\xd9\x89\0" + "\xd8\xac\xd9\x85\xd8\xa7\xd8\xaf\xd9\x89 \xd8\xa7\xd9\x84\xd8\xa2\xd8\xae\xd8\xb1\xd8\xa9\0" + "\xd8\xb1\xd8\xac\xd8\xa8\0" + "\xd8\xb4\xd8\xb9\xd8\xa8\xd8\xa7\xd9\x86\0" + "\xd8\xb1\xd9\x85\xd8\xb6\xd8\xa7\xd9\x86\0" + "\xd8\xb4\xd9\x88\xd8\xa7\xd9\x84\0" + "\xd8\xb0\xd9\x88 \xd8\xa7\xd9\x84\xd9\x82\xd8\xb9\xd8\xaf\xd8\xa9\0" + "\xd8\xb0\xd9\x88 \xd8\xa7\xd9\x84\xd8\xad\xd8\xac\xd8\xa9\0" + "\xd0\xbd\xd0\xb5\xd0\xb4\xd0\xb5\xd0\xbb\xd1\x8f\0" + "\xd0\xbf\xd0\xbe\xd0\xbd\xd0\xb5\xd0\xb4\xd0\xb5\xd0\xbb\xd0\xbd\xd0\xb8\xd0\xba\0" + "\xd0\xb2\xd1\x82\xd0\xbe\xd1\x80\xd0\xbd\xd0\xb8\xd0\xba\0" + "\xd1\x81\xd1\x80\xd1\x8f\xd0\xb4\xd0\xb0\0" + "\xd1\x87\xd0\xb5\xd1\x82\xd0\xb2\xd1\x8a\xd1\x80\xd1\x82\xd1\x8a\xd0\xba\0" + "\xd0\xbf\xd0\xb5\xd1\x82\xd1\x8a\xd0\xba\0" + "\xd1\x81\xd1\x8a\xd0\xb1\xd0\xbe\xd1\x82\xd0\xb0\0" + "\xd0\xbd\xd0\xb4\0" + "\xd0\xbf\xd0\xbd\0" + "\xd0\xb2\xd1\x82\0" + "\xd1\x81\xd1\x80\0" + "\xd1\x87\xd1\x82\0" + "\xd0\xbf\xd1\x82\0" + "\xd1\x81\xd0\xb1\0" + "\xd0\xbd\0" + "\xd0\xbf\0" + "\xd0\xb2\0" + "\xd1\x81\0" + "\xd1\x87\0" + "\xd1\x8f\xd0\xbd\xd1\x83\xd0\xb0\xd1\x80\xd0\xb8\0" + "\xd1\x84\xd0\xb5\xd0\xb2\xd1\x80\xd1\x83\xd0\xb0\xd1\x80\xd0\xb8\0" + "\xd0\xbc\xd0\xb0\xd1\x80\xd1\x82\0" + "\xd0\xb0\xd0\xbf\xd1\x80\xd0\xb8\xd0\xbb\0" + "\xd0\xbc\xd0\xb0\xd0\xb9\0" + "\xd1\x8e\xd0\xbd\xd0\xb8\0" + "\xd1\x8e\xd0\xbb\xd0\xb8\0" + "\xd0\xb0\xd0\xb2\xd0\xb3\xd1\x83\xd1\x81\xd1\x82\0" + "\xd1\x81\xd0\xb5\xd0\xbf\xd1\x82\xd0\xb5\xd0\xbc\xd0\xb2\xd1\x80\xd0\xb8\0" + "\xd0\xbe\xd0\xba\xd1\x82\xd0\xbe\xd0\xbc\xd0\xb2\xd1\x80\xd0\xb8\0" + "\xd0\xbd\xd0\xbe\xd0\xb5\xd0\xbc\xd0\xb2\xd1\x80\xd0\xb8\0" + "\xd0\xb4\xd0\xb5\xd0\xba\xd0\xb5\xd0\xbc\xd0\xb2\xd1\x80\xd0\xb8\0" + "\xd1\x8f\xd0\xbd\xd1\x83\0" + "\xd1\x84\xd0\xb5\xd0\xb2\0" + "\xd0\xb0\xd0\xbf\xd1\x80\0" + "\xd0\xb0\xd0\xb2\xd0\xb3\0" + "\xd1\x81\xd0\xb5\xd0\xbf\0" + "\xd0\xbe\xd0\xba\xd1\x82\0" + "\xd0\xbd\xd0\xbe\xd0\xb5\0" + "\xd0\xb4\xd0\xb5\xd0\xba\0" + "diumenge\0" + "dilluns\0" + "dimarts\0" + "dimecres\0" + "dijous\0" + "divendres\0" + "dissabte\0" + "dg.\0" + "dl.\0" + "dt.\0" + "dc.\0" + "dj.\0" + "dv.\0" + "ds.\0" + "dg\0" + "dl\0" + "dt\0" + "dc\0" + "dj\0" + "dv\0" + "ds\0" + "gener\0" + "febrer\0" + "mar\xc3\xa7\0" + "abril\0" + "maig\0" + "juny\0" + "juliol\0" + "agost\0" + "setembre\0" + "octubre\0" + "novembre\0" + "desembre\0" + "de gener\0" + "de febrer\0" + "de mar\xc3\xa7\0" + "d\xe2\x80\x99\x61\x62ril\0" + "de maig\0" + "de juny\0" + "de juliol\0" + "d\xe2\x80\x99\x61gost\0" + "de setembre\0" + "d\xe2\x80\x99octubre\0" + "de novembre\0" + "de desembre\0" + "gen.\0" + "febr.\0" + "abr.\0" + "jul.\0" + "ag.\0" + "set.\0" + "oct.\0" + "nov.\0" + "des.\0" + "\xe6\x98\x9f\xe6\x9c\x9f\xe6\x97\xa5\0" + "\xe6\x98\x9f\xe6\x9c\x9f\xe4\xb8\x80\0" + "\xe6\x98\x9f\xe6\x9c\x9f\xe4\xba\x8c\0" + "\xe6\x98\x9f\xe6\x9c\x9f\xe4\xb8\x89\0" + "\xe6\x98\x9f\xe6\x9c\x9f\xe5\x9b\x9b\0" + "\xe6\x98\x9f\xe6\x9c\x9f\xe4\xba\x94\0" + "\xe6\x98\x9f\xe6\x9c\x9f\xe5\x85\xad\0" + "\xe5\x91\xa8\xe6\x97\xa5\0" + "\xe5\x91\xa8\xe4\xb8\x80\0" + "\xe5\x91\xa8\xe4\xba\x8c\0" + "\xe5\x91\xa8\xe4\xb8\x89\0" + "\xe5\x91\xa8\xe5\x9b\x9b\0" + "\xe5\x91\xa8\xe4\xba\x94\0" + "\xe5\x91\xa8\xe5\x85\xad\0" + "\xe6\x97\xa5\0" + "\xe4\xb8\x80\0" + "\xe4\xba\x8c\0" + "\xe4\xb8\x89\0" + "\xe5\x9b\x9b\0" + "\xe4\xba\x94\0" + "\xe5\x85\xad\0" + "\xe4\xb8\x80\xe6\x9c\x88\0" + "\xe4\xba\x8c\xe6\x9c\x88\0" + "\xe4\xb8\x89\xe6\x9c\x88\0" + "\xe5\x9b\x9b\xe6\x9c\x88\0" + "\xe4\xba\x94\xe6\x9c\x88\0" + "\xe5\x85\xad\xe6\x9c\x88\0" + "\xe4\xb8\x83\xe6\x9c\x88\0" + "\xe5\x85\xab\xe6\x9c\x88\0" + "\xe4\xb9\x9d\xe6\x9c\x88\0" + "\xe5\x8d\x81\xe6\x9c\x88\0" + "\xe5\x8d\x81\xe4\xb8\x80\xe6\x9c\x88\0" + "\xe5\x8d\x81\xe4\xba\x8c\xe6\x9c\x88\0" + "1\xe6\x9c\x88\0" + "2\xe6\x9c\x88\0" + "3\xe6\x9c\x88\0" + "4\xe6\x9c\x88\0" + "5\xe6\x9c\x88\0" + "6\xe6\x9c\x88\0" + "7\xe6\x9c\x88\0" + "8\xe6\x9c\x88\0" + "9\xe6\x9c\x88\0" + "10\xe6\x9c\x88\0" + "11\xe6\x9c\x88\0" + "12\xe6\x9c\x88\0" + "ned\xc4\x9ble\0" + "pond\xc4\x9bl\xc3\xad\0" + "\xc3\xbater\xc3\xbd\0" + "st\xc5\x99\x65\x64\x61\0" + "\xc4\x8dtvrtek\0" + "p\xc3\xa1tek\0" + "sobota\0" + "ne\0" + "po\0" + "\xc3\xbat\0" + "st\0" + "\xc4\x8dt\0" + "p\xc3\xa1\0" + "so\0" + "N\0" + "P\0" + "\xc3\x9a\0" + "S\0" + "\xc4\x8c\0" + "leden\0" + "\xc3\xbanor\0" + "b\xc5\x99\x65zen\0" + "duben\0" + "kv\xc4\x9bten\0" + "\xc4\x8d\x65rven\0" + "\xc4\x8d\x65rvenec\0" + "srpen\0" + "z\xc3\xa1\xc5\x99\xc3\xad\0" + "\xc5\x99\xc3\xadjen\0" + "listopad\0" + "prosinec\0" + "ledna\0" + "\xc3\xbanora\0" + "b\xc5\x99\x65zna\0" + "dubna\0" + "kv\xc4\x9btna\0" + "\xc4\x8d\x65rvna\0" + "\xc4\x8d\x65rvence\0" + "srpna\0" + "\xc5\x99\xc3\xadjna\0" + "listopadu\0" + "prosince\0" + "led\0" + "\xc3\xbano\0" + "b\xc5\x99\x65\0" + "dub\0" + "kv\xc4\x9b\0" + "\xc4\x8dvn\0" + "\xc4\x8dvc\0" + "srp\0" + "z\xc3\xa1\xc5\x99\0" + "\xc5\x99\xc3\xadj\0" + "lis\0" + "pro\0" + "s\xc3\xb8ndag\0" + "mandag\0" + "tirsdag\0" + "onsdag\0" + "torsdag\0" + "fredag\0" + "l\xc3\xb8rdag\0" + "s\xc3\xb8n\0" + "man\0" + "tir\0" + "ons\0" + "tor\0" + "fre\0" + "l\xc3\xb8r\0" + "M\0" + "T\0" + "O\0" + "F\0" + "L\0" + "januar\0" + "februar\0" + "marts\0" + "april\0" + "maj\0" + "juni\0" + "juli\0" + "august\0" + "september\0" + "oktober\0" + "november\0" + "december\0" + "jan.\0" + "feb.\0" + "mar.\0" + "apr.\0" + "jun.\0" + "aug.\0" + "sep.\0" + "okt.\0" + "dec.\0" + "Sonntag\0" + "Montag\0" + "Dienstag\0" + "Mittwoch\0" + "Donnerstag\0" + "Freitag\0" + "Samstag\0" + "So\0" + "Mo\0" + "Di\0" + "Mi\0" + "Do\0" + "Fr\0" + "Sa\0" + "D\0" + "Januar\0" + "Februar\0" + "M\xc3\xa4rz\0" + "April\0" + "Mai\0" + "Juni\0" + "Juli\0" + "August\0" + "September\0" + "Oktober\0" + "November\0" + "Dezember\0" + "Jan\0" + "Feb\0" + "M\xc3\xa4r\0" + "Apr\0" + "Jun\0" + "Jul\0" + "Aug\0" + "Sep\0" + "Okt\0" + "Nov\0" + "Dez\0" + "\xce\x9a\xcf\x85\xcf\x81\xce\xb9\xce\xb1\xce\xba\xce\xae\0" + "\xce\x94\xce\xb5\xcf\x85\xcf\x84\xce\xad\xcf\x81\xce\xb1\0" + "\xce\xa4\xcf\x81\xce\xaf\xcf\x84\xce\xb7\0" + "\xce\xa4\xce\xb5\xcf\x84\xce\xac\xcf\x81\xcf\x84\xce\xb7\0" + "\xce\xa0\xce\xad\xce\xbc\xcf\x80\xcf\x84\xce\xb7\0" + "\xce\xa0\xce\xb1\xcf\x81\xce\xb1\xcf\x83\xce\xba\xce\xb5\xcf\x85\xce\xae\0" + "\xce\xa3\xce\xac\xce\xb2\xce\xb2\xce\xb1\xcf\x84\xce\xbf\0" + "\xce\x9a\xcf\x85\xcf\x81\0" + "\xce\x94\xce\xb5\xcf\x85\0" + "\xce\xa4\xcf\x81\xce\xaf\0" + "\xce\xa4\xce\xb5\xcf\x84\0" + "\xce\xa0\xce\xad\xce\xbc\0" + "\xce\xa0\xce\xb1\xcf\x81\0" + "\xce\xa3\xce\xac\xce\xb2\0" + "\xce\x9a\0" + "\xce\x94\0" + "\xce\xa4\0" + "\xce\xa0\0" + "\xce\xa3\0" + "\xce\x99\xce\xb1\xce\xbd\xce\xbf\xcf\x85\xce\xac\xcf\x81\xce\xb9\xce\xbf\xcf\x82\0" + "\xce\xa6\xce\xb5\xce\xb2\xcf\x81\xce\xbf\xcf\x85\xce\xac\xcf\x81\xce\xb9\xce\xbf\xcf\x82\0" + "\xce\x9c\xce\xac\xcf\x81\xcf\x84\xce\xb9\xce\xbf\xcf\x82\0" + "\xce\x91\xcf\x80\xcf\x81\xce\xaf\xce\xbb\xce\xb9\xce\xbf\xcf\x82\0" + "\xce\x9c\xce\xac\xce\xb9\xce\xbf\xcf\x82\0" + "\xce\x99\xce\xbf\xcf\x8d\xce\xbd\xce\xb9\xce\xbf\xcf\x82\0" + "\xce\x99\xce\xbf\xcf\x8d\xce\xbb\xce\xb9\xce\xbf\xcf\x82\0" + "\xce\x91\xcf\x8d\xce\xb3\xce\xbf\xcf\x85\xcf\x83\xcf\x84\xce\xbf\xcf\x82\0" + "\xce\xa3\xce\xb5\xcf\x80\xcf\x84\xce\xad\xce\xbc\xce\xb2\xcf\x81\xce\xb9\xce\xbf\xcf\x82\0" + "\xce\x9f\xce\xba\xcf\x84\xcf\x8e\xce\xb2\xcf\x81\xce\xb9\xce\xbf\xcf\x82\0" + "\xce\x9d\xce\xbf\xce\xad\xce\xbc\xce\xb2\xcf\x81\xce\xb9\xce\xbf\xcf\x82\0" + "\xce\x94\xce\xb5\xce\xba\xce\xad\xce\xbc\xce\xb2\xcf\x81\xce\xb9\xce\xbf\xcf\x82\0" + "\xce\x99\xce\xb1\xce\xbd\xce\xbf\xcf\x85\xce\xb1\xcf\x81\xce\xaf\xce\xbf\xcf\x85\0" + "\xce\xa6\xce\xb5\xce\xb2\xcf\x81\xce\xbf\xcf\x85\xce\xb1\xcf\x81\xce\xaf\xce\xbf\xcf\x85\0" + "\xce\x9c\xce\xb1\xcf\x81\xcf\x84\xce\xaf\xce\xbf\xcf\x85\0" + "\xce\x91\xcf\x80\xcf\x81\xce\xb9\xce\xbb\xce\xaf\xce\xbf\xcf\x85\0" + "\xce\x9c\xce\xb1\xce\x90\xce\xbf\xcf\x85\0" + "\xce\x99\xce\xbf\xcf\x85\xce\xbd\xce\xaf\xce\xbf\xcf\x85\0" + "\xce\x99\xce\xbf\xcf\x85\xce\xbb\xce\xaf\xce\xbf\xcf\x85\0" + "\xce\x91\xcf\x85\xce\xb3\xce\xbf\xcf\x8d\xcf\x83\xcf\x84\xce\xbf\xcf\x85\0" + "\xce\xa3\xce\xb5\xcf\x80\xcf\x84\xce\xb5\xce\xbc\xce\xb2\xcf\x81\xce\xaf\xce\xbf\xcf\x85\0" + "\xce\x9f\xce\xba\xcf\x84\xcf\x89\xce\xb2\xcf\x81\xce\xaf\xce\xbf\xcf\x85\0" + "\xce\x9d\xce\xbf\xce\xb5\xce\xbc\xce\xb2\xcf\x81\xce\xaf\xce\xbf\xcf\x85\0" + "\xce\x94\xce\xb5\xce\xba\xce\xb5\xce\xbc\xce\xb2\xcf\x81\xce\xaf\xce\xbf\xcf\x85\0" + "\xce\x99\xce\xb1\xce\xbd\0" + "\xce\xa6\xce\xb5\xce\xb2\0" + "\xce\x9c\xce\xac\xcf\x81\0" + "\xce\x91\xcf\x80\xcf\x81\0" + "\xce\x9c\xce\xac\xce\xb9\0" + "\xce\x99\xce\xbf\xcf\x8d\xce\xbd\0" + "\xce\x99\xce\xbf\xcf\x8d\xce\xbb\0" + "\xce\x91\xcf\x8d\xce\xb3\0" + "\xce\xa3\xce\xb5\xcf\x80\0" + "\xce\x9f\xce\xba\xcf\x84\0" + "\xce\x9d\xce\xbf\xce\xad\0" + "\xce\x94\xce\xb5\xce\xba\0" + "Sunday\0" + "Monday\0" + "Tuesday\0" + "Wednesday\0" + "Thursday\0" + "Friday\0" + "Saturday\0" + "Sun\0" + "Mon\0" + "Tue\0" + "Wed\0" + "Thu\0" + "Fri\0" + "Sat\0" + "W\0" + "January\0" + "February\0" + "March\0" + "May\0" + "June\0" + "July\0" + "October\0" + "December\0" + "Mar\0" + "Oct\0" + "Dec\0" + "domingo\0" + "lunes\0" + "martes\0" + "mi\xc3\xa9rcoles\0" + "jueves\0" + "viernes\0" + "s\xc3\xa1\x62\x61\x64o\0" + "dom.\0" + "lun.\0" + "mi\xc3\xa9.\0" + "jue.\0" + "vie.\0" + "s\xc3\xa1\x62.\0" + "X\0" + "J\0" + "V\0" + "enero\0" + "febrero\0" + "marzo\0" + "mayo\0" + "junio\0" + "julio\0" + "agosto\0" + "septiembre\0" + "noviembre\0" + "diciembre\0" + "ene.\0" + "may.\0" + "ago.\0" + "sept.\0" + "dic.\0" + "sunnuntaina\0" + "maanantaina\0" + "tiistaina\0" + "keskiviikkona\0" + "torstaina\0" + "perjantaina\0" + "lauantaina\0" + "su\0" + "ma\0" + "ti\0" + "ke\0" + "to\0" + "pe\0" + "la\0" + "K\0" + "tammikuu\0" + "helmikuu\0" + "maaliskuu\0" + "huhtikuu\0" + "toukokuu\0" + "kes\xc3\xa4kuu\0" + "hein\xc3\xa4kuu\0" + "elokuu\0" + "syyskuu\0" + "lokakuu\0" + "marraskuu\0" + "joulukuu\0" + "tammikuuta\0" + "helmikuuta\0" + "maaliskuuta\0" + "huhtikuuta\0" + "toukokuuta\0" + "kes\xc3\xa4kuuta\0" + "hein\xc3\xa4kuuta\0" + "elokuuta\0" + "syyskuuta\0" + "lokakuuta\0" + "marraskuuta\0" + "joulukuuta\0" + "tammi\0" + "helmi\0" + "maalis\0" + "huhti\0" + "touko\0" + "kes\xc3\xa4\0" + "hein\xc3\xa4\0" + "elo\0" + "syys\0" + "loka\0" + "marras\0" + "joulu\0" + "dimanche\0" + "lundi\0" + "mardi\0" + "mercredi\0" + "jeudi\0" + "vendredi\0" + "samedi\0" + "dim.\0" + "mer.\0" + "jeu.\0" + "ven.\0" + "sam.\0" + "janvier\0" + "f\xc3\xa9vrier\0" + "mars\0" + "avril\0" + "mai\0" + "juin\0" + "juillet\0" + "ao\xc3\xbbt\0" + "septembre\0" + "octobre\0" + "d\xc3\xa9\x63\x65mbre\0" + "janv.\0" + "f\xc3\xa9vr.\0" + "avr.\0" + "juil.\0" + "d\xc3\xa9\x63.\0" + "\xd7\x99\xd7\x95\xd7\x9d \xd7\xa8\xd7\x90\xd7\xa9\xd7\x95\xd7\x9f\0" + "\xd7\x99\xd7\x95\xd7\x9d \xd7\xa9\xd7\xa0\xd7\x99\0" + "\xd7\x99\xd7\x95\xd7\x9d \xd7\xa9\xd7\x9c\xd7\x99\xd7\xa9\xd7\x99\0" + "\xd7\x99\xd7\x95\xd7\x9d \xd7\xa8\xd7\x91\xd7\x99\xd7\xa2\xd7\x99\0" + "\xd7\x99\xd7\x95\xd7\x9d \xd7\x97\xd7\x9e\xd7\x99\xd7\xa9\xd7\x99\0" + "\xd7\x99\xd7\x95\xd7\x9d \xd7\xa9\xd7\x99\xd7\xa9\xd7\x99\0" + "\xd7\x99\xd7\x95\xd7\x9d \xd7\xa9\xd7\x91\xd7\xaa\0" + "\xd7\x99\xd7\x95\xd7\x9d \xd7\x90\xd7\xb3\0" + "\xd7\x99\xd7\x95\xd7\x9d \xd7\x91\xd7\xb3\0" + "\xd7\x99\xd7\x95\xd7\x9d \xd7\x92\xd7\xb3\0" + "\xd7\x99\xd7\x95\xd7\x9d \xd7\x93\xd7\xb3\0" + "\xd7\x99\xd7\x95\xd7\x9d \xd7\x94\xd7\xb3\0" + "\xd7\x99\xd7\x95\xd7\x9d \xd7\x95\xd7\xb3\0" + "\xd7\xa9\xd7\x91\xd7\xaa\0" + "\xd7\x90\xd7\xb3\0" + "\xd7\x91\xd7\xb3\0" + "\xd7\x92\xd7\xb3\0" + "\xd7\x93\xd7\xb3\0" + "\xd7\x94\xd7\xb3\0" + "\xd7\x95\xd7\xb3\0" + "\xd7\xa9\xd7\xb3\0" + "\xd7\x99\xd7\xa0\xd7\x95\xd7\x90\xd7\xa8\0" + "\xd7\xa4\xd7\x91\xd7\xa8\xd7\x95\xd7\x90\xd7\xa8\0" + "\xd7\x9e\xd7\xa8\xd7\xa5\0" + "\xd7\x90\xd7\xa4\xd7\xa8\xd7\x99\xd7\x9c\0" + "\xd7\x9e\xd7\x90\xd7\x99\0" + "\xd7\x99\xd7\x95\xd7\xa0\xd7\x99\0" + "\xd7\x99\xd7\x95\xd7\x9c\xd7\x99\0" + "\xd7\x90\xd7\x95\xd7\x92\xd7\x95\xd7\xa1\xd7\x98\0" + "\xd7\xa1\xd7\xa4\xd7\x98\xd7\x9e\xd7\x91\xd7\xa8\0" + "\xd7\x90\xd7\x95\xd7\xa7\xd7\x98\xd7\x95\xd7\x91\xd7\xa8\0" + "\xd7\xa0\xd7\x95\xd7\x91\xd7\x9e\xd7\x91\xd7\xa8\0" + "\xd7\x93\xd7\xa6\xd7\x9e\xd7\x91\xd7\xa8\0" + "\xd7\x99\xd7\xa0\xd7\x95\xd7\xb3\0" + "\xd7\xa4\xd7\x91\xd7\xa8\xd7\xb3\0" + "\xd7\x90\xd7\xa4\xd7\xa8\xd7\xb3\0" + "\xd7\x90\xd7\x95\xd7\x92\xd7\xb3\0" + "\xd7\xa1\xd7\xa4\xd7\x98\xd7\xb3\0" + "\xd7\x90\xd7\x95\xd7\xa7\xd7\xb3\0" + "\xd7\xa0\xd7\x95\xd7\x91\xd7\xb3\0" + "\xd7\x93\xd7\xa6\xd7\x9e\xd7\xb3\0" + "vas\xc3\xa1rnap\0" + "h\xc3\xa9tf\xc5\x91\0" + "kedd\0" + "szerda\0" + "cs\xc3\xbct\xc3\xb6rt\xc3\xb6k\0" + "p\xc3\xa9ntek\0" + "szombat\0" + "H\0" + "Sze\0" + "Cs\0" + "Szo\0" + "Sz\0" + "janu\xc3\xa1r\0" + "febru\xc3\xa1r\0" + "m\xc3\xa1rcius\0" + "\xc3\xa1prilis\0" + "m\xc3\xa1jus\0" + "j\xc3\xbanius\0" + "j\xc3\xbalius\0" + "augusztus\0" + "szeptember\0" + "okt\xc3\xb3\x62\x65r\0" + "m\xc3\xa1rc.\0" + "\xc3\xa1pr.\0" + "m\xc3\xa1j.\0" + "j\xc3\xban.\0" + "j\xc3\xbal.\0" + "szept.\0" + "sunnudagur\0" + "m\xc3\xa1nudagur\0" + "\xc3\xberi\xc3\xb0judagur\0" + "mi\xc3\xb0vikudagur\0" + "fimmtudagur\0" + "f\xc3\xb6studagur\0" + "laugardagur\0" + "sun.\0" + "m\xc3\xa1n.\0" + "\xc3\xberi.\0" + "mi\xc3\xb0.\0" + "fim.\0" + "f\xc3\xb6s.\0" + "lau.\0" + "\xc3\x9e\0" + "jan\xc3\xba\x61r\0" + "febr\xc3\xba\x61r\0" + "apr\xc3\xadl\0" + "ma\xc3\xad\0" + "j\xc3\xban\xc3\xad\0" + "j\xc3\xbal\xc3\xad\0" + "\xc3\xa1g\xc3\xbast\0" + "n\xc3\xb3vember\0" + "desember\0" + "\xc3\xa1g\xc3\xba.\0" + "n\xc3\xb3v.\0" + "domenica\0" + "luned\xc3\xac\0" + "marted\xc3\xac\0" + "mercoled\xc3\xac\0" + "gioved\xc3\xac\0" + "venerd\xc3\xac\0" + "sabato\0" + "dom\0" + "lun\0" + "mar\0" + "mer\0" + "gio\0" + "ven\0" + "sab\0" + "G\0" + "gennaio\0" + "febbraio\0" + "aprile\0" + "maggio\0" + "giugno\0" + "luglio\0" + "settembre\0" + "ottobre\0" + "dicembre\0" + "gen\0" + "feb\0" + "apr\0" + "mag\0" + "giu\0" + "lug\0" + "ago\0" + "set\0" + "ott\0" + "nov\0" + "dic\0" + "\xe6\x97\xa5\xe6\x9b\x9c\xe6\x97\xa5\0" + "\xe6\x9c\x88\xe6\x9b\x9c\xe6\x97\xa5\0" + "\xe7\x81\xab\xe6\x9b\x9c\xe6\x97\xa5\0" + "\xe6\xb0\xb4\xe6\x9b\x9c\xe6\x97\xa5\0" + "\xe6\x9c\xa8\xe6\x9b\x9c\xe6\x97\xa5\0" + "\xe9\x87\x91\xe6\x9b\x9c\xe6\x97\xa5\0" + "\xe5\x9c\x9f\xe6\x9b\x9c\xe6\x97\xa5\0" + "\xe6\x9c\x88\0" + "\xe7\x81\xab\0" + "\xe6\xb0\xb4\0" + "\xe6\x9c\xa8\0" + "\xe9\x87\x91\0" + "\xe5\x9c\x9f\0" + "1\0" + "2\0" + "3\0" + "4\0" + "5\0" + "6\0" + "7\0" + "8\0" + "9\0" + "10\0" + "11\0" + "12\0" + "\xec\x9d\xbc\xec\x9a\x94\xec\x9d\xbc\0" + "\xec\x9b\x94\xec\x9a\x94\xec\x9d\xbc\0" + "\xed\x99\x94\xec\x9a\x94\xec\x9d\xbc\0" + "\xec\x88\x98\xec\x9a\x94\xec\x9d\xbc\0" + "\xeb\xaa\xa9\xec\x9a\x94\xec\x9d\xbc\0" + "\xea\xb8\x88\xec\x9a\x94\xec\x9d\xbc\0" + "\xed\x86\xa0\xec\x9a\x94\xec\x9d\xbc\0" + "\xec\x9d\xbc\0" + "\xec\x9b\x94\0" + "\xed\x99\x94\0" + "\xec\x88\x98\0" + "\xeb\xaa\xa9\0" + "\xea\xb8\x88\0" + "\xed\x86\xa0\0" + "1\xec\x9b\x94\0" + "2\xec\x9b\x94\0" + "3\xec\x9b\x94\0" + "4\xec\x9b\x94\0" + "5\xec\x9b\x94\0" + "6\xec\x9b\x94\0" + "7\xec\x9b\x94\0" + "8\xec\x9b\x94\0" + "9\xec\x9b\x94\0" + "10\xec\x9b\x94\0" + "11\xec\x9b\x94\0" + "12\xec\x9b\x94\0" + "zondag\0" + "maandag\0" + "dinsdag\0" + "woensdag\0" + "donderdag\0" + "vrijdag\0" + "zaterdag\0" + "zo\0" + "di\0" + "wo\0" + "do\0" + "vr\0" + "za\0" + "Z\0" + "januari\0" + "februari\0" + "maart\0" + "mei\0" + "augustus\0" + "mrt.\0" + "s\xc3\xb8n.\0" + "man.\0" + "tir.\0" + "ons.\0" + "tor.\0" + "fre.\0" + "l\xc3\xb8r.\0" + "jan\0" + "jun\0" + "jul\0" + "aug\0" + "sep\0" + "okt\0" + "des\0" + "niedziela\0" + "poniedzia\xc5\x82\x65k\0" + "wtorek\0" + "\xc5\x9broda\0" + "czwartek\0" + "pi\xc4\x85tek\0" + "niedz.\0" + "pon.\0" + "wt.\0" + "\xc5\x9br.\0" + "czw.\0" + "pt.\0" + "sob.\0" + "\xc5\x9a\0" + "C\0" + "stycze\xc5\x84\0" + "luty\0" + "marzec\0" + "kwiecie\xc5\x84\0" + "czerwiec\0" + "lipiec\0" + "sierpie\xc5\x84\0" + "wrzesie\xc5\x84\0" + "pa\xc5\xba\x64ziernik\0" + "grudzie\xc5\x84\0" + "stycznia\0" + "lutego\0" + "marca\0" + "kwietnia\0" + "maja\0" + "czerwca\0" + "lipca\0" + "sierpnia\0" + "wrze\xc5\x9bnia\0" + "pa\xc5\xba\x64ziernika\0" + "listopada\0" + "grudnia\0" + "sty\0" + "lut\0" + "kwi\0" + "cze\0" + "lip\0" + "sie\0" + "wrz\0" + "pa\xc5\xba\0" + "gru\0" + "segunda-feira\0" + "ter\xc3\xa7\x61-feira\0" + "quarta-feira\0" + "quinta-feira\0" + "sexta-feira\0" + "seg\0" + "ter\0" + "qua\0" + "qui\0" + "sex\0" + "s\xc3\xa1\x62\0" + "Q\0" + "janeiro\0" + "fevereiro\0" + "mar\xc3\xa7o\0" + "maio\0" + "junho\0" + "julho\0" + "setembro\0" + "outubro\0" + "novembro\0" + "dezembro\0" + "fev\0" + "abr\0" + "out\0" + "dez\0" + "dumengia\0" + "glindesdi\0" + "mesemna\0" + "gievgia\0" + "venderdi\0" + "sonda\0" + "du\0" + "gli\0" + "me\0" + "gie\0" + "ve\0" + "schaner\0" + "favrer\0" + "avrigl\0" + "matg\0" + "zercladur\0" + "fanadur\0" + "avust\0" + "settember\0" + "october\0" + "schan.\0" + "favr.\0" + "zercl.\0" + "fan.\0" + "sett.\0" + "duminic\xc4\x83\0" + "luni\0" + "mar\xc8\x9bi\0" + "miercuri\0" + "joi\0" + "vineri\0" + "s\xc3\xa2mb\xc4\x83t\xc4\x83\0" + "dum.\0" + "mie.\0" + "vin.\0" + "s\xc3\xa2m.\0" + "ianuarie\0" + "februarie\0" + "martie\0" + "aprilie\0" + "iunie\0" + "iulie\0" + "septembrie\0" + "octombrie\0" + "noiembrie\0" + "decembrie\0" + "ian.\0" + "iun.\0" + "iul.\0" + "\xd0\xb2\xd0\xbe\xd1\x81\xd0\xba\xd1\x80\xd0\xb5\xd1\x81\xd0\xb5\xd0\xbd\xd1\x8c\xd0\xb5\0" + "\xd0\xbf\xd0\xbe\xd0\xbd\xd0\xb5\xd0\xb4\xd0\xb5\xd0\xbb\xd1\x8c\xd0\xbd\xd0\xb8\xd0\xba\0" + "\xd1\x81\xd1\x80\xd0\xb5\xd0\xb4\xd0\xb0\0" + "\xd1\x87\xd0\xb5\xd1\x82\xd0\xb2\xd0\xb5\xd1\x80\xd0\xb3\0" + "\xd0\xbf\xd1\x8f\xd1\x82\xd0\xbd\xd0\xb8\xd1\x86\xd0\xb0\0" + "\xd1\x81\xd1\x83\xd0\xb1\xd0\xb1\xd0\xbe\xd1\x82\xd0\xb0\0" + "\xd0\xb2\xd1\x81\0" + "\xd0\x92\0" + "\xd0\x9f\0" + "\xd0\xa1\0" + "\xd0\xa7\0" + "\xd1\x8f\xd0\xbd\xd0\xb2\xd0\xb0\xd1\x80\xd1\x8c\0" + "\xd1\x84\xd0\xb5\xd0\xb2\xd1\x80\xd0\xb0\xd0\xbb\xd1\x8c\0" + "\xd0\xb0\xd0\xbf\xd1\x80\xd0\xb5\xd0\xbb\xd1\x8c\0" + "\xd0\xb8\xd1\x8e\xd0\xbd\xd1\x8c\0" + "\xd0\xb8\xd1\x8e\xd0\xbb\xd1\x8c\0" + "\xd1\x81\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8f\xd0\xb1\xd1\x80\xd1\x8c\0" + "\xd0\xbe\xd0\xba\xd1\x82\xd1\x8f\xd0\xb1\xd1\x80\xd1\x8c\0" + "\xd0\xbd\xd0\xbe\xd1\x8f\xd0\xb1\xd1\x80\xd1\x8c\0" + "\xd0\xb4\xd0\xb5\xd0\xba\xd0\xb0\xd0\xb1\xd1\x80\xd1\x8c\0" + "\xd1\x8f\xd0\xbd\xd0\xb2\xd0\xb0\xd1\x80\xd1\x8f\0" + "\xd1\x84\xd0\xb5\xd0\xb2\xd1\x80\xd0\xb0\xd0\xbb\xd1\x8f\0" + "\xd0\xbc\xd0\xb0\xd1\x80\xd1\x82\xd0\xb0\0" + "\xd0\xb0\xd0\xbf\xd1\x80\xd0\xb5\xd0\xbb\xd1\x8f\0" + "\xd0\xbc\xd0\xb0\xd1\x8f\0" + "\xd0\xb8\xd1\x8e\xd0\xbd\xd1\x8f\0" + "\xd0\xb8\xd1\x8e\xd0\xbb\xd1\x8f\0" + "\xd0\xb0\xd0\xb2\xd0\xb3\xd1\x83\xd1\x81\xd1\x82\xd0\xb0\0" + "\xd1\x81\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8f\xd0\xb1\xd1\x80\xd1\x8f\0" + "\xd0\xbe\xd0\xba\xd1\x82\xd1\x8f\xd0\xb1\xd1\x80\xd1\x8f\0" + "\xd0\xbd\xd0\xbe\xd1\x8f\xd0\xb1\xd1\x80\xd1\x8f\0" + "\xd0\xb4\xd0\xb5\xd0\xba\xd0\xb0\xd0\xb1\xd1\x80\xd1\x8f\0" + "\xd1\x8f\xd0\xbd\xd0\xb2.\0" + "\xd1\x84\xd0\xb5\xd0\xb2\xd1\x80.\0" + "\xd0\xb0\xd0\xbf\xd1\x80.\0" + "\xd0\xb0\xd0\xb2\xd0\xb3.\0" + "\xd1\x81\xd0\xb5\xd0\xbd\xd1\x82.\0" + "\xd0\xbe\xd0\xba\xd1\x82.\0" + "\xd0\xbd\xd0\xbe\xd1\x8f\xd0\xb1.\0" + "\xd0\xb4\xd0\xb5\xd0\xba.\0" + "nedjelja\0" + "ponedjeljak\0" + "utorak\0" + "srijeda\0" + "\xc4\x8d\x65tvrtak\0" + "petak\0" + "subota\0" + "ned\0" + "pon\0" + "uto\0" + "sri\0" + "\xc4\x8d\x65t\0" + "pet\0" + "sub\0" + "n\0" + "p\0" + "u\0" + "s\0" + "\xc4\x8d\0" + "sije\xc4\x8d\x61nj\0" + "velja\xc4\x8d\x61\0" + "o\xc5\xbeujak\0" + "travanj\0" + "svibanj\0" + "lipanj\0" + "srpanj\0" + "kolovoz\0" + "rujan\0" + "studeni\0" + "prosinac\0" + "sije\xc4\x8dnja\0" + "velja\xc4\x8d\x65\0" + "o\xc5\xbeujka\0" + "travnja\0" + "svibnja\0" + "lipnja\0" + "srpnja\0" + "kolovoza\0" + "rujna\0" + "studenoga\0" + "prosinca\0" + "sij\0" + "velj\0" + "o\xc5\xbeu\0" + "tra\0" + "svi\0" + "kol\0" + "ruj\0" + "stu\0" + "nede\xc4\xbe\x61\0" + "pondelok\0" + "utorok\0" + "streda\0" + "\xc5\xa1tvrtok\0" + "piatok\0" + "ut\0" + "\xc5\xa1t\0" + "pi\0" + "\xc5\xa1\0" + "marec\0" + "m\xc3\xa1j\0" + "j\xc3\xban\0" + "j\xc3\xbal\0" + "janu\xc3\xa1ra\0" + "febru\xc3\xa1ra\0" + "apr\xc3\xadla\0" + "m\xc3\xa1ja\0" + "j\xc3\xbana\0" + "j\xc3\xbala\0" + "augusta\0" + "septembra\0" + "okt\xc3\xb3\x62ra\0" + "novembra\0" + "decembra\0" + "dec\0" + "e diel\0" + "e h\xc3\xabn\xc3\xab\0" + "e mart\xc3\xab\0" + "e m\xc3\xabrkur\xc3\xab\0" + "e enjte\0" + "e premte\0" + "e shtun\xc3\xab\0" + "Die\0" + "H\xc3\xabn\0" + "M\xc3\xabr\0" + "Enj\0" + "Pre\0" + "Sht\0" + "E\0" + "Janar\0" + "Shkurt\0" + "Mars\0" + "Prill\0" + "Maj\0" + "Qershor\0" + "Korrik\0" + "Gusht\0" + "Shtator\0" + "Tetor\0" + "N\xc3\xabntor\0" + "Dhjetor\0" + "janar\0" + "shkurt\0" + "prill\0" + "qershor\0" + "korrik\0" + "gusht\0" + "shtator\0" + "tetor\0" + "n\xc3\xabntor\0" + "dhjetor\0" + "Shk\0" + "Pri\0" + "Qer\0" + "Kor\0" + "Gsh\0" + "Tet\0" + "N\xc3\xabn\0" + "Dhj\0" + "s\xc3\xb6ndag\0" + "m\xc3\xa5ndag\0" + "tisdag\0" + "l\xc3\xb6rdag\0" + "s\xc3\xb6n\0" + "m\xc3\xa5n\0" + "tis\0" + "tors\0" + "l\xc3\xb6r\0" + "augusti\0" + "Pazar\0" + "Pazartesi\0" + "Sal\xc4\xb1\0" + "\xc3\x87\x61r\xc5\x9f\x61mba\0" + "Per\xc5\x9f\x65mbe\0" + "Cuma\0" + "Cumartesi\0" + "Paz\0" + "Pzt\0" + "Sal\0" + "\xc3\x87\x61r\0" + "Per\0" + "Cum\0" + "Cmt\0" + "\xc3\x87\0" + "Ocak\0" + "\xc5\x9eubat\0" + "Mart\0" + "Nisan\0" + "May\xc4\xb1s\0" + "Haziran\0" + "Temmuz\0" + "A\xc4\x9fustos\0" + "Eyl\xc3\xbcl\0" + "Ekim\0" + "Kas\xc4\xb1m\0" + "Aral\xc4\xb1k\0" + "Oca\0" + "\xc5\x9eub\0" + "Nis\0" + "Haz\0" + "Tem\0" + "A\xc4\x9fu\0" + "Eyl\0" + "Eki\0" + "Kas\0" + "Ara\0" + "\xd8\xa7\xd8\xaa\xd9\x88\xd8\xa7\xd8\xb1\0" + "\xd8\xb3\xd9\x88\xd9\x85\xd9\x88\xd8\xa7\xd8\xb1\0" + "\xd9\x85\xd9\x86\xda\xaf\xd9\x84\0" + "\xd8\xa8\xd8\xaf\xda\xbe\0" + "\xd8\xac\xd9\x85\xd8\xb9\xd8\xb1\xd8\xa7\xd8\xaa\0" + "\xd8\xac\xd9\x85\xd8\xb9\xdb\x81\0" + "\xdb\x81\xd9\x81\xd8\xaa\xdb\x81\0" + "\xd8\xac\xd9\x86\xd9\x88\xd8\xb1\xdb\x8c\0" + "\xd9\x81\xd8\xb1\xd9\x88\xd8\xb1\xdb\x8c\0" + "\xd9\x85\xd8\xa7\xd8\xb1\xda\x86\0" + "\xd8\xa7\xd9\xbe\xd8\xb1\xdb\x8c\xd9\x84\0" + "\xd9\x85\xd8\xa6\xdb\x8c\0" + "\xd8\xac\xd9\x88\xd9\x86\0" + "\xd8\xac\xd9\x88\xd9\x84\xd8\xa7\xd8\xa6\xdb\x8c\0" + "\xd8\xa7\xda\xaf\xd8\xb3\xd8\xaa\0" + "\xd8\xb3\xd8\xaa\xd9\x85\xd8\xa8\xd8\xb1\0" + "\xd8\xa7\xda\xa9\xd8\xaa\xd9\x88\xd8\xa8\xd8\xb1\0" + "\xd9\x86\xd9\x88\xd9\x85\xd8\xa8\xd8\xb1\0" + "\xd8\xaf\xd8\xb3\xd9\x85\xd8\xa8\xd8\xb1\0" + "Minggu\0" + "Senin\0" + "Selasa\0" + "Rabu\0" + "Kamis\0" + "Jumat\0" + "Sabtu\0" + "Min\0" + "Sen\0" + "Sel\0" + "Rab\0" + "Kam\0" + "Jum\0" + "Sab\0" + "R\0" + "Januari\0" + "Februari\0" + "Maret\0" + "Mei\0" + "Agustus\0" + "Desember\0" + "Agt\0" + "Des\0" + "\xd0\xbd\xd0\xb5\xd0\xb4\xd1\x96\xd0\xbb\xd1\x8f\0" + "\xd0\xbf\xd0\xbe\xd0\xbd\xd0\xb5\xd0\xb4\xd1\x96\xd0\xbb\xd0\xbe\xd0\xba\0" + "\xd0\xb2\xd1\x96\xd0\xb2\xd1\x82\xd0\xbe\xd1\x80\xd0\xbe\xd0\xba\0" + "\xd1\x81\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb4\xd0\xb0\0" + "\xd1\x87\xd0\xb5\xd1\x82\xd0\xb2\xd0\xb5\xd1\x80\0" + "\xd0\xbf\xca\xbc\xd1\x8f\xd1\x82\xd0\xbd\xd0\xb8\xd1\x86\xd1\x8f\0" + "\xd1\x81\xd1\x83\xd0\xb1\xd0\xbe\xd1\x82\xd0\xb0\0" + "\xd0\x9d\0" + "\xd1\x81\xd1\x96\xd1\x87\xd0\xb5\xd0\xbd\xd1\x8c\0" + "\xd0\xbb\xd1\x8e\xd1\x82\xd0\xb8\xd0\xb9\0" + "\xd0\xb1\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb7\xd0\xb5\xd0\xbd\xd1\x8c\0" + "\xd0\xba\xd0\xb2\xd1\x96\xd1\x82\xd0\xb5\xd0\xbd\xd1\x8c\0" + "\xd1\x82\xd1\x80\xd0\xb0\xd0\xb2\xd0\xb5\xd0\xbd\xd1\x8c\0" + "\xd1\x87\xd0\xb5\xd1\x80\xd0\xb2\xd0\xb5\xd0\xbd\xd1\x8c\0" + "\xd0\xbb\xd0\xb8\xd0\xbf\xd0\xb5\xd0\xbd\xd1\x8c\0" + "\xd1\x81\xd0\xb5\xd1\x80\xd0\xbf\xd0\xb5\xd0\xbd\xd1\x8c\0" + "\xd0\xb2\xd0\xb5\xd1\x80\xd0\xb5\xd1\x81\xd0\xb5\xd0\xbd\xd1\x8c\0" + "\xd0\xb6\xd0\xbe\xd0\xb2\xd1\x82\xd0\xb5\xd0\xbd\xd1\x8c\0" + "\xd0\xbb\xd0\xb8\xd1\x81\xd1\x82\xd0\xbe\xd0\xbf\xd0\xb0\xd0\xb4\0" + "\xd0\xb3\xd1\x80\xd1\x83\xd0\xb4\xd0\xb5\xd0\xbd\xd1\x8c\0" + "\xd1\x81\xd1\x96\xd1\x87\xd0\xbd\xd1\x8f\0" + "\xd0\xbb\xd1\x8e\xd1\x82\xd0\xbe\xd0\xb3\xd0\xbe\0" + "\xd0\xb1\xd0\xb5\xd1\x80\xd0\xb5\xd0\xb7\xd0\xbd\xd1\x8f\0" + "\xd0\xba\xd0\xb2\xd1\x96\xd1\x82\xd0\xbd\xd1\x8f\0" + "\xd1\x82\xd1\x80\xd0\xb0\xd0\xb2\xd0\xbd\xd1\x8f\0" + "\xd1\x87\xd0\xb5\xd1\x80\xd0\xb2\xd0\xbd\xd1\x8f\0" + "\xd0\xbb\xd0\xb8\xd0\xbf\xd0\xbd\xd1\x8f\0" + "\xd1\x81\xd0\xb5\xd1\x80\xd0\xbf\xd0\xbd\xd1\x8f\0" + "\xd0\xb2\xd0\xb5\xd1\x80\xd0\xb5\xd1\x81\xd0\xbd\xd1\x8f\0" + "\xd0\xb6\xd0\xbe\xd0\xb2\xd1\x82\xd0\xbd\xd1\x8f\0" + "\xd0\xbb\xd0\xb8\xd1\x81\xd1\x82\xd0\xbe\xd0\xbf\xd0\xb0\xd0\xb4\xd0\xb0\0" + "\xd0\xb3\xd1\x80\xd1\x83\xd0\xb4\xd0\xbd\xd1\x8f\0" + "\xd1\x81\xd1\x96\xd1\x87\0" + "\xd0\xbb\xd1\x8e\xd1\x82\0" + "\xd0\xb1\xd0\xb5\xd1\x80\0" + "\xd0\xba\xd0\xb2\xd1\x96\0" + "\xd1\x82\xd1\x80\xd0\xb0\0" + "\xd1\x87\xd0\xb5\xd1\x80\0" + "\xd0\xbb\xd0\xb8\xd0\xbf\0" + "\xd1\x81\xd0\xb5\xd1\x80\0" + "\xd0\xb2\xd0\xb5\xd1\x80\0" + "\xd0\xb6\xd0\xbe\xd0\xb2\0" + "\xd0\xbb\xd0\xb8\xd1\x81\0" + "\xd0\xb3\xd1\x80\xd1\x83\0" + "\xd0\xbd\xd1\x8f\xd0\xb4\xd0\xb7\xd0\xb5\xd0\xbb\xd1\x8f\0" + "\xd0\xbf\xd0\xb0\xd0\xbd\xd1\x8f\xd0\xb4\xd0\xb7\xd0\xb5\xd0\xbb\xd0\xb0\xd0\xba\0" + "\xd0\xb0\xd1\x9e\xd1\x82\xd0\xbe\xd1\x80\xd0\xb0\xd0\xba\0" + "\xd1\x81\xd0\xb5\xd1\x80\xd0\xb0\xd0\xb4\xd0\xb0\0" + "\xd1\x87\xd0\xb0\xd1\x86\xd0\xb2\xd0\xb5\xd1\x80\0" + "\xd0\xbf\xd1\x8f\xd1\x82\xd0\xbd\xd1\x96\xd1\x86\xd0\xb0\0" + "\xd0\xb0\xd1\x9e\0" + "\xd1\x87\xd1\x86\0" + "\xd0\xb0\0" + "\xd1\x81\xd1\x82\xd1\x83\xd0\xb4\xd0\xb7\xd0\xb5\xd0\xbd\xd1\x8c\0" + "\xd0\xbb\xd1\x8e\xd1\x82\xd1\x8b\0" + "\xd1\x81\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb2\xd1\x96\xd0\xba\0" + "\xd0\xba\xd1\x80\xd0\xb0\xd1\x81\xd0\xb0\xd0\xb2\xd1\x96\xd0\xba\0" + "\xd1\x87\xd1\x8d\xd1\x80\xd0\xb2\xd0\xb5\xd0\xbd\xd1\x8c\0" + "\xd0\xbb\xd1\x96\xd0\xbf\xd0\xb5\xd0\xbd\xd1\x8c\0" + "\xd0\xb6\xd0\xbd\xd1\x96\xd0\xb2\xd0\xb5\xd0\xbd\xd1\x8c\0" + "\xd0\xb2\xd0\xb5\xd1\x80\xd0\xb0\xd1\x81\xd0\xb5\xd0\xbd\xd1\x8c\0" + "\xd0\xba\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd1\x8b\xd1\x87\xd0\xbd\xd1\x96\xd0\xba\0" + "\xd0\xbb\xd1\x96\xd1\x81\xd1\x82\xd0\xb0\xd0\xbf\xd0\xb0\xd0\xb4\0" + "\xd1\x81\xd0\xbd\xd0\xb5\xd0\xb6\xd0\xb0\xd0\xbd\xd1\x8c\0" + "\xd1\x81\xd1\x82\xd1\x83\xd0\xb4\xd0\xb7\xd0\xb5\xd0\xbd\xd1\x8f\0" + "\xd0\xbb\xd1\x8e\xd1\x82\xd0\xb0\xd0\xb3\xd0\xb0\0" + "\xd1\x81\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb2\xd1\x96\xd0\xba\xd0\xb0\0" + "\xd0\xba\xd1\x80\xd0\xb0\xd1\x81\xd0\xb0\xd0\xb2\xd1\x96\xd0\xba\xd0\xb0\0" + "\xd1\x87\xd1\x8d\xd1\x80\xd0\xb2\xd0\xb5\xd0\xbd\xd1\x8f\0" + "\xd0\xbb\xd1\x96\xd0\xbf\xd0\xb5\xd0\xbd\xd1\x8f\0" + "\xd0\xb6\xd0\xbd\xd1\x96\xd1\x9e\xd0\xbd\xd1\x8f\0" + "\xd0\xb2\xd0\xb5\xd1\x80\xd0\xb0\xd1\x81\xd0\xbd\xd1\x8f\0" + "\xd0\xba\xd0\xb0\xd1\x81\xd1\x82\xd1\x80\xd1\x8b\xd1\x87\xd0\xbd\xd1\x96\xd0\xba\xd0\xb0\0" + "\xd0\xbb\xd1\x96\xd1\x81\xd1\x82\xd0\xb0\xd0\xbf\xd0\xb0\xd0\xb4\xd0\xb0\0" + "\xd1\x81\xd0\xbd\xd0\xb5\xd0\xb6\xd0\xbd\xd1\x8f\0" + "\xd1\x81\xd1\x82\xd1\x83\0" + "\xd1\x81\xd0\xb0\xd0\xba\0" + "\xd0\xba\xd1\x80\xd0\xb0\0" + "\xd1\x87\xd1\x8d\xd1\x80\0" + "\xd0\xbb\xd1\x96\xd0\xbf\0" + "\xd0\xb6\xd0\xbd\xd1\x96\0" + "\xd0\xba\xd0\xb0\xd1\x81\0" + "\xd0\xbb\xd1\x96\xd1\x81\0" + "\xd1\x81\xd0\xbd\xd0\xb5\0" + "nedelja\0" + "ponedeljek\0" + "torek\0" + "sreda\0" + "\xc4\x8d\x65trtek\0" + "petek\0" + "ned.\0" + "sre.\0" + "\xc4\x8d\x65t.\0" + "pet.\0" + "t\0" + "junij\0" + "julij\0" + "avgust\0" + "avg.\0" + "p\xc3\xbchap\xc3\xa4\x65v\0" + "esmasp\xc3\xa4\x65v\0" + "teisip\xc3\xa4\x65v\0" + "kolmap\xc3\xa4\x65v\0" + "neljap\xc3\xa4\x65v\0" + "reede\0" + "laup\xc3\xa4\x65v\0" + "jaanuar\0" + "veebruar\0" + "m\xc3\xa4rts\0" + "aprill\0" + "juuni\0" + "juuli\0" + "oktoober\0" + "detsember\0" + "jaan\0" + "veebr\0" + "sept\0" + "dets\0" + "sv\xc4\x93tdiena\0" + "pirmdiena\0" + "otrdiena\0" + "tre\xc5\xa1\x64iena\0" + "ceturtdiena\0" + "piektdiena\0" + "sestdiena\0" + "Sv\xc4\x93td.\0" + "Pirmd.\0" + "Otrd.\0" + "Tre\xc5\xa1\x64.\0" + "Ceturtd.\0" + "Piektd.\0" + "Sestd.\0" + "janv\xc4\x81ris\0" + "febru\xc4\x81ris\0" + "apr\xc4\xablis\0" + "maijs\0" + "j\xc5\xabnijs\0" + "j\xc5\xablijs\0" + "augusts\0" + "septembris\0" + "oktobris\0" + "novembris\0" + "decembris\0" + "j\xc5\xabn.\0" + "j\xc5\xabl.\0" + "sekmadienis\0" + "pirmadienis\0" + "antradienis\0" + "tre\xc4\x8diadienis\0" + "ketvirtadienis\0" + "penktadienis\0" + "\xc5\xa1\x65\xc5\xa1tadienis\0" + "sk\0" + "pr\0" + "an\0" + "tr\0" + "kt\0" + "pn\0" + "A\0" + "\xc5\xa0\0" + "sausis\0" + "vasaris\0" + "kovas\0" + "balandis\0" + "gegu\xc5\xbe\xc4\x97\0" + "bir\xc5\xbe\x65lis\0" + "liepa\0" + "rugpj\xc5\xabtis\0" + "rugs\xc4\x97jis\0" + "spalis\0" + "lapkritis\0" + "gruodis\0" + "sausio\0" + "vasario\0" + "kovo\0" + "baland\xc5\xbeio\0" + "gegu\xc5\xbe\xc4\x97s\0" + "bir\xc5\xbe\x65lio\0" + "liepos\0" + "rugpj\xc5\xab\xc4\x8dio\0" + "rugs\xc4\x97jo\0" + "spalio\0" + "lapkri\xc4\x8dio\0" + "gruod\xc5\xbeio\0" + "saus.\0" + "vas.\0" + "kov.\0" + "bal.\0" + "geg.\0" + "bir\xc5\xbe.\0" + "liep.\0" + "rugp.\0" + "rugs.\0" + "spal.\0" + "lapkr.\0" + "gruod.\0" + "\xd0\xaf\xd0\xba\xd1\x88\xd0\xb0\xd0\xbd\xd0\xb1\xd0\xb5\0" + "\xd0\x94\xd1\x83\xd1\x88\xd0\xb0\xd0\xbd\xd0\xb1\xd0\xb5\0" + "\xd0\xa1\xd0\xb5\xd1\x88\xd0\xb0\xd0\xbd\xd0\xb1\xd0\xb5\0" + "\xd0\xa7\xd0\xbe\xd1\x80\xd1\x88\xd0\xb0\xd0\xbd\xd0\xb1\xd0\xb5\0" + "\xd0\x9f\xd0\xb0\xd0\xbd\xd2\xb7\xd1\x88\xd0\xb0\xd0\xbd\xd0\xb1\xd0\xb5\0" + "\xd2\xb6\xd1\x83\xd0\xbc\xd1\x8a\xd0\xb0\0" + "\xd0\xa8\xd0\xb0\xd0\xbd\xd0\xb1\xd0\xb5\0" + "\xd0\xaf\xd1\x88\xd0\xb1\0" + "\xd0\x94\xd1\x88\xd0\xb1\0" + "\xd0\xa1\xd1\x88\xd0\xb1\0" + "\xd0\xa7\xd1\x88\xd0\xb1\0" + "\xd0\x9f\xd1\x88\xd0\xb1\0" + "\xd2\xb6\xd0\xbc\xd1\x8a\0" + "\xd0\xa8\xd0\xbd\xd0\xb1\0" + "\xd0\xaf\xd0\xbd\xd0\xb2\xd0\xb0\xd1\x80\0" + "\xd0\xa4\xd0\xb5\xd0\xb2\xd1\x80\xd0\xb0\xd0\xbb\0" + "\xd0\x9c\xd0\xb0\xd1\x80\xd1\x82\0" + "\xd0\x90\xd0\xbf\xd1\x80\xd0\xb5\xd0\xbb\0" + "\xd0\x9c\xd0\xb0\xd0\xb9\0" + "\xd0\x98\xd1\x8e\xd0\xbd\0" + "\xd0\x98\xd1\x8e\xd0\xbb\0" + "\xd0\x90\xd0\xb2\xd0\xb3\xd1\x83\xd1\x81\xd1\x82\0" + "\xd0\xa1\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8f\xd0\xb1\xd1\x80\0" + "\xd0\x9e\xd0\xba\xd1\x82\xd1\x8f\xd0\xb1\xd1\x80\0" + "\xd0\x9d\xd0\xbe\xd1\x8f\xd0\xb1\xd1\x80\0" + "\xd0\x94\xd0\xb5\xd0\xba\xd0\xb0\xd0\xb1\xd1\x80\0" + "\xd0\xaf\xd0\xbd\xd0\xb2\0" + "\xd0\xa4\xd0\xb5\xd0\xb2\0" + "\xd0\x9c\xd0\xb0\xd1\x80\0" + "\xd0\x90\xd0\xbf\xd1\x80\0" + "\xd0\x90\xd0\xb2\xd0\xb3\0" + "\xd0\xa1\xd0\xb5\xd0\xbd\0" + "\xd0\x9e\xd0\xba\xd1\x82\0" + "\xd0\x9d\xd0\xbe\xd1\x8f\0" + "\xd0\x94\xd0\xb5\xd0\xba\0" + "\xdb\x8c\xda\xa9\xd8\xb4\xd9\x86\xd8\xa8\xd9\x87\0" + "\xd8\xaf\xd9\x88\xd8\xb4\xd9\x86\xd8\xa8\xd9\x87\0" + "\xd8\xb3\xd9\x87\xe2\x80\x8c\xd8\xb4\xd9\x86\xd8\xa8\xd9\x87\0" + "\xda\x86\xd9\x87\xd8\xa7\xd8\xb1\xd8\xb4\xd9\x86\xd8\xa8\xd9\x87\0" + "\xd9\xbe\xd9\x86\xd8\xac\xd8\xb4\xd9\x86\xd8\xa8\xd9\x87\0" + "\xd8\xac\xd9\x85\xd8\xb9\xd9\x87\0" + "\xd8\xb4\xd9\x86\xd8\xa8\xd9\x87\0" + "\xdb\x8c\0" + "\xd8\xaf\0" + "\xd8\xb3\0" + "\xda\x86\0" + "\xd9\xbe\0" + "\xd8\xac\0" + "\xd8\xb4\0" + "\xda\x98\xd8\xa7\xd9\x86\xd9\x88\xdb\x8c\xd9\x87\0" + "\xd9\x81\xd9\x88\xd8\xb1\xdb\x8c\xd9\x87\0" + "\xd9\x85\xd8\xa7\xd8\xb1\xd8\xb3\0" + "\xd8\xa2\xd9\x88\xd8\xb1\xdb\x8c\xd9\x84\0" + "\xd9\x85\xd9\x87\0" + "\xda\x98\xd9\x88\xd8\xa6\xd9\x86\0" + "\xda\x98\xd9\x88\xd8\xa6\xdb\x8c\xd9\x87\0" + "\xd8\xa7\xd9\x88\xd8\xaa\0" + "\xd8\xb3\xd9\xbe\xd8\xaa\xd8\xa7\xd9\x85\xd8\xa8\xd8\xb1\0" + "\xd8\xa7\xda\xa9\xd8\xaa\xd8\xa8\xd8\xb1\0" + "\xd9\x86\xd9\x88\xd8\xa7\xd9\x85\xd8\xa8\xd8\xb1\0" + "\xd8\xaf\xd8\xb3\xd8\xa7\xd9\x85\xd8\xa8\xd8\xb1\0" + "\xda\x98\xd8\xa7\xd9\x86\xd9\x88\xdb\x8c\xd9\x87\xd9\x94\0" + "\xd9\x81\xd9\x88\xd8\xb1\xdb\x8c\xd9\x87\xd9\x94\0" + "\xd9\x85\xd9\x87\xd9\x94\0" + "\xda\x98\xd9\x88\xd8\xa6\xdb\x8c\xd9\x87\xd9\x94\0" + "Ch\xe1\xbb\xa7 Nh\xe1\xba\xadt\0" + "Th\xe1\xbb\xa9 Hai\0" + "Th\xe1\xbb\xa9 Ba\0" + "Th\xe1\xbb\xa9 T\xc6\xb0\0" + "Th\xe1\xbb\xa9 N\xc4\x83m\0" + "Th\xe1\xbb\xa9 S\xc3\xa1u\0" + "Th\xe1\xbb\xa9 B\xe1\xba\xa3y\0" + "CN\0" + "Th 2\0" + "Th 3\0" + "Th 4\0" + "Th 5\0" + "Th 6\0" + "Th 7\0" + "T2\0" + "T3\0" + "T4\0" + "T5\0" + "T6\0" + "T7\0" + "Th\xc3\xa1ng 1\0" + "Th\xc3\xa1ng 2\0" + "Th\xc3\xa1ng 3\0" + "Th\xc3\xa1ng 4\0" + "Th\xc3\xa1ng 5\0" + "Th\xc3\xa1ng 6\0" + "Th\xc3\xa1ng 7\0" + "Th\xc3\xa1ng 8\0" + "Th\xc3\xa1ng 9\0" + "Th\xc3\xa1ng 10\0" + "Th\xc3\xa1ng 11\0" + "Th\xc3\xa1ng 12\0" + "th\xc3\xa1ng 1\0" + "th\xc3\xa1ng 2\0" + "th\xc3\xa1ng 3\0" + "th\xc3\xa1ng 4\0" + "th\xc3\xa1ng 5\0" + "th\xc3\xa1ng 6\0" + "th\xc3\xa1ng 7\0" + "th\xc3\xa1ng 8\0" + "th\xc3\xa1ng 9\0" + "th\xc3\xa1ng 10\0" + "th\xc3\xa1ng 11\0" + "th\xc3\xa1ng 12\0" + "Thg 1\0" + "Thg 2\0" + "Thg 3\0" + "Thg 4\0" + "Thg 5\0" + "Thg 6\0" + "Thg 7\0" + "Thg 8\0" + "Thg 9\0" + "Thg 10\0" + "Thg 11\0" + "Thg 12\0" + "\xd5\xaf\xd5\xab\xd6\x80\xd5\xa1\xd5\xaf\xd5\xab\0" + "\xd5\xa5\xd6\x80\xd5\xaf\xd5\xb8\xd6\x82\xd5\xb7\xd5\xa1\xd5\xa2\xd5\xa9\xd5\xab\0" + "\xd5\xa5\xd6\x80\xd5\xa5\xd6\x84\xd5\xb7\xd5\xa1\xd5\xa2\xd5\xa9\xd5\xab\0" + "\xd5\xb9\xd5\xb8\xd6\x80\xd5\xa5\xd6\x84\xd5\xb7\xd5\xa1\xd5\xa2\xd5\xa9\xd5\xab\0" + "\xd5\xb0\xd5\xab\xd5\xb6\xd5\xa3\xd5\xb7\xd5\xa1\xd5\xa2\xd5\xa9\xd5\xab\0" + "\xd5\xb8\xd6\x82\xd6\x80\xd5\xa2\xd5\xa1\xd5\xa9\0" + "\xd5\xb7\xd5\xa1\xd5\xa2\xd5\xa1\xd5\xa9\0" + "\xd5\xaf\xd5\xab\xd6\x80\0" + "\xd5\xa5\xd6\x80\xd5\xaf\0" + "\xd5\xa5\xd6\x80\xd6\x84\0" + "\xd5\xb9\xd6\x80\xd6\x84\0" + "\xd5\xb0\xd5\xb6\xd5\xa3\0" + "\xd5\xb8\xd6\x82\xd6\x80\0" + "\xd5\xb7\xd5\xa2\xd5\xa9\0" + "\xd4\xbf\0" + "\xd4\xb5\0" + "\xd5\x89\0" + "\xd5\x80\0" + "\xd5\x88\0" + "\xd5\x87\0" + "\xd5\xb0\xd5\xb8\xd6\x82\xd5\xb6\xd5\xbe\xd5\xa1\xd6\x80\0" + "\xd6\x83\xd5\xa5\xd5\xbf\xd6\x80\xd5\xbe\xd5\xa1\xd6\x80\0" + "\xd5\xb4\xd5\xa1\xd6\x80\xd5\xbf\0" + "\xd5\xa1\xd5\xba\xd6\x80\xd5\xab\xd5\xac\0" + "\xd5\xb4\xd5\xa1\xd5\xb5\xd5\xab\xd5\xbd\0" + "\xd5\xb0\xd5\xb8\xd6\x82\xd5\xb6\xd5\xab\xd5\xbd\0" + "\xd5\xb0\xd5\xb8\xd6\x82\xd5\xac\xd5\xab\xd5\xbd\0" + "\xd6\x85\xd5\xa3\xd5\xb8\xd5\xbd\xd5\xbf\xd5\xb8\xd5\xbd\0" + "\xd5\xbd\xd5\xa5\xd5\xba\xd5\xbf\xd5\xa5\xd5\xb4\xd5\xa2\xd5\xa5\xd6\x80\0" + "\xd5\xb0\xd5\xb8\xd5\xaf\xd5\xbf\xd5\xa5\xd5\xb4\xd5\xa2\xd5\xa5\xd6\x80\0" + "\xd5\xb6\xd5\xb8\xd5\xb5\xd5\xa5\xd5\xb4\xd5\xa2\xd5\xa5\xd6\x80\0" + "\xd5\xa4\xd5\xa5\xd5\xaf\xd5\xbf\xd5\xa5\xd5\xb4\xd5\xa2\xd5\xa5\xd6\x80\0" + "\xd5\xb0\xd5\xb8\xd6\x82\xd5\xb6\xd5\xbe\xd5\xa1\xd6\x80\xd5\xab\0" + "\xd6\x83\xd5\xa5\xd5\xbf\xd6\x80\xd5\xbe\xd5\xa1\xd6\x80\xd5\xab\0" + "\xd5\xb4\xd5\xa1\xd6\x80\xd5\xbf\xd5\xab\0" + "\xd5\xa1\xd5\xba\xd6\x80\xd5\xab\xd5\xac\xd5\xab\0" + "\xd5\xb4\xd5\xa1\xd5\xb5\xd5\xab\xd5\xbd\xd5\xab\0" + "\xd5\xb0\xd5\xb8\xd6\x82\xd5\xb6\xd5\xab\xd5\xbd\xd5\xab\0" + "\xd5\xb0\xd5\xb8\xd6\x82\xd5\xac\xd5\xab\xd5\xbd\xd5\xab\0" + "\xd6\x85\xd5\xa3\xd5\xb8\xd5\xbd\xd5\xbf\xd5\xb8\xd5\xbd\xd5\xab\0" + "\xd5\xbd\xd5\xa5\xd5\xba\xd5\xbf\xd5\xa5\xd5\xb4\xd5\xa2\xd5\xa5\xd6\x80\xd5\xab\0" + "\xd5\xb0\xd5\xb8\xd5\xaf\xd5\xbf\xd5\xa5\xd5\xb4\xd5\xa2\xd5\xa5\xd6\x80\xd5\xab\0" + "\xd5\xb6\xd5\xb8\xd5\xb5\xd5\xa5\xd5\xb4\xd5\xa2\xd5\xa5\xd6\x80\xd5\xab\0" + "\xd5\xa4\xd5\xa5\xd5\xaf\xd5\xbf\xd5\xa5\xd5\xb4\xd5\xa2\xd5\xa5\xd6\x80\xd5\xab\0" + "\xd5\xb0\xd5\xb6\xd5\xbe\0" + "\xd6\x83\xd5\xbf\xd5\xbe\0" + "\xd5\xb4\xd6\x80\xd5\xbf\0" + "\xd5\xa1\xd5\xba\xd6\x80\0" + "\xd5\xb4\xd5\xb5\xd5\xbd\0" + "\xd5\xb0\xd5\xb6\xd5\xbd\0" + "\xd5\xb0\xd5\xac\xd5\xbd\0" + "\xd6\x85\xd5\xa3\xd5\xbd\0" + "\xd5\xbd\xd5\xa5\xd5\xba\0" + "\xd5\xb0\xd5\xb8\xd5\xaf\0" + "\xd5\xb6\xd5\xb8\xd5\xb5\0" + "\xd5\xa4\xd5\xa5\xd5\xaf\0" + "bazar\0" + "bazar ert\xc9\x99si\0" + "\xc3\xa7\xc9\x99r\xc5\x9f\xc9\x99nb\xc9\x99 ax\xc5\x9f\x61m\xc4\xb1\0" + "\xc3\xa7\xc9\x99r\xc5\x9f\xc9\x99nb\xc9\x99\0" + "c\xc3\xbcm\xc9\x99 ax\xc5\x9f\x61m\xc4\xb1\0" + "c\xc3\xbcm\xc9\x99\0" + "\xc5\x9f\xc9\x99nb\xc9\x99\0" + "B.\0" + "B.E.\0" + "\xc3\x87.A.\0" + "\xc3\x87.\0" + "C.A.\0" + "C.\0" + "\xc5\x9e.\0" + "Yanvar\0" + "Fevral\0" + "Aprel\0" + "\xc4\xb0yun\0" + "\xc4\xb0yul\0" + "Avqust\0" + "Sentyabr\0" + "Oktyabr\0" + "Noyabr\0" + "Dekabr\0" + "yanvar\0" + "fevral\0" + "mart\0" + "aprel\0" + "may\0" + "iyun\0" + "iyul\0" + "avqust\0" + "sentyabr\0" + "oktyabr\0" + "noyabr\0" + "dekabr\0" + "yan\0" + "iyn\0" + "iyl\0" + "avq\0" + "sen\0" + "noy\0" + "dek\0" + "igandea\0" + "astelehena\0" + "asteartea\0" + "asteazkena\0" + "osteguna\0" + "ostirala\0" + "larunbata\0" + "ig.\0" + "al.\0" + "ar.\0" + "az.\0" + "og.\0" + "or.\0" + "lr.\0" + "I\0" + "urtarrila\0" + "Otsaila\0" + "Martxoa\0" + "Apirila\0" + "Maiatza\0" + "Ekaina\0" + "Uztaila\0" + "Abuztua\0" + "Iraila\0" + "Urria\0" + "Azaroa\0" + "Abendua\0" + "otsaila\0" + "martxoa\0" + "apirila\0" + "maiatza\0" + "ekaina\0" + "uztaila\0" + "abuztua\0" + "iraila\0" + "urria\0" + "azaroa\0" + "abendua\0" + "urt.\0" + "ots.\0" + "api.\0" + "mai.\0" + "eka.\0" + "uzt.\0" + "abu.\0" + "ira.\0" + "urr.\0" + "aza.\0" + "abe.\0" + "njed\xc5\xba\x65la\0" + "p\xc3\xb3nd\xc5\xba\x65la\0" + "wutora\0" + "srjeda\0" + "\xc5\xa1tw\xc3\xb3rtk\0" + "pjatk\0" + "nje\0" + "p\xc3\xb3n\0" + "wut\0" + "srj\0" + "\xc5\xa1tw\0" + "pja\0" + "sob\0" + "w\0" + "m\xc4\x9brc\0" + "apryl\0" + "meja\0" + "awgust\0" + "nowember\0" + "januara\0" + "februara\0" + "m\xc4\x9brca\0" + "apryla\0" + "meje\0" + "junija\0" + "julija\0" + "awgusta\0" + "oktobra\0" + "nowembra\0" + "m\xc4\x9br\0" + "mej\0" + "awg\0" + "now\0" + "\xd0\xbd\xd0\xb5\xd0\xb4\xd0\xb5\xd0\xbb\xd0\xb0\0" + "\xd1\x87\xd0\xb5\xd1\x82\xd0\xb2\xd1\x80\xd1\x82\xd0\xbe\xd0\xba\0" + "\xd0\xbf\xd0\xb5\xd1\x82\xd0\xbe\xd0\xba\0" + "\xd1\x81\xd0\xb0\xd0\xb1\xd0\xbe\xd1\x82\xd0\xb0\0" + "\xd0\xbd\xd0\xb5\xd0\xb4.\0" + "\xd0\xbf\xd0\xbe\xd0\xbd.\0" + "\xd0\xb2\xd1\x82\xd0\xbe.\0" + "\xd1\x81\xd1\x80\xd0\xb5.\0" + "\xd1\x87\xd0\xb5\xd1\x82.\0" + "\xd0\xbf\xd0\xb5\xd1\x82.\0" + "\xd1\x81\xd0\xb0\xd0\xb1.\0" + "\xd1\x98\xd0\xb0\xd0\xbd\xd1\x83\xd0\xb0\xd1\x80\xd0\xb8\0" + "\xd0\xbc\xd0\xb0\xd1\x98\0" + "\xd1\x98\xd1\x83\xd0\xbd\xd0\xb8\0" + "\xd1\x98\xd1\x83\xd0\xbb\xd0\xb8\0" + "\xd1\x98\xd0\xb0\xd0\xbd.\0" + "\xd1\x84\xd0\xb5\xd0\xb2.\0" + "\xd0\xbc\xd0\xb0\xd1\x80.\0" + "\xd1\x98\xd1\x83\xd0\xbd.\0" + "\xd1\x98\xd1\x83\xd0\xbb.\0" + "\xd1\x81\xd0\xb5\xd0\xbf\xd1\x82.\0" + "\xd0\xbd\xd0\xbe\xd0\xb5\xd0\xbc.\0" + "Sontaha\0" + "Mmantaha\0" + "Labobedi\0" + "Laboraru\0" + "Labone\0" + "Labohlane\0" + "Moqebelo\0" + "Son\0" + "Mma\0" + "Bed\0" + "Rar\0" + "Ne\0" + "Hla\0" + "Moq\0" + "Phesekgong\0" + "Hlakola\0" + "Hlakubele\0" + "Mmese\0" + "Motsheanong\0" + "Phupjane\0" + "Phupu\0" + "Phata\0" + "Leotshe\0" + "Mphalane\0" + "Pundungwane\0" + "Tshitwe\0" + "Phe\0" + "Kol\0" + "Ube\0" + "Mme\0" + "Mot\0" + "Upu\0" + "Pha\0" + "Leo\0" + "Mph\0" + "Pun\0" + "Tsh\0" + "Sonto\0" + "Musumbhunuku\0" + "Ravumbirhi\0" + "Ravunharhu\0" + "Ravumune\0" + "Ravuntlhanu\0" + "Mugqivela\0" + "Mus\0" + "Bir\0" + "Har\0" + "Tlh\0" + "Mug\0" + "Sunguti\0" + "Nyenyenyani\0" + "Nyenyankulu\0" + "Dzivamisoko\0" + "Mudyaxihi\0" + "Khotavuxika\0" + "Mawuwani\0" + "Mhawuri\0" + "Ndzhati\0" + "Nhlangula\0" + "Hukuri\0" + "N'wendzamhala\0" + "Yan\0" + "Kul\0" + "Dzi\0" + "Mud\0" + "Kho\0" + "Maw\0" + "Mha\0" + "Ndz\0" + "Nhl\0" + "Huk\0" + "N'w\0" + "Tshipi\0" + "Mosopulogo\0" + "Laboraro\0" + "Labotlhano\0" + "Matlhatso\0" + "Mos\0" + "Tla\0" + "Mat\0" + "Ferikgong\0" + "Tlhakole\0" + "Mopitlo\0" + "Moranang\0" + "Motsheganang\0" + "Seetebosigo\0" + "Phukwi\0" + "Phatwe\0" + "Lwetse\0" + "Diphalane\0" + "Ngwanatsele\0" + "Sedimonthole\0" + "Fer\0" + "Mop\0" + "Mor\0" + "See\0" + "Phu\0" + "Lwe\0" + "Dip\0" + "Ngw\0" + "Sed\0" + "Cawe\0" + "Mvulo\0" + "Lwesibini\0" + "Lwesithathu\0" + "Lwesine\0" + "Lwesihlanu\0" + "Mgqibelo\0" + "Caw\0" + "Mvu\0" + "Bin\0" + "Tha\0" + "Sin\0" + "Mgq\0" + "Janyuwari\0" + "Februwari\0" + "Matshi\0" + "Epreli\0" + "Meyi\0" + "Julayi\0" + "Agasti\0" + "Septemba\0" + "Okthoba\0" + "Novemba\0" + "Disemba\0" + "Epr\0" + "Mey\0" + "Aga\0" + "Dis\0" + "ISonto\0" + "UMsombuluko\0" + "ULwesibili\0" + "ULwesithathu\0" + "ULwesine\0" + "ULwesihlanu\0" + "UMgqibelo\0" + "Mso\0" + "Bil\0" + "B\0" + "Januwari\0" + "Mashi\0" + "Ephreli\0" + "Septhemba\0" + "UMasingana\0" + "Mas\0" + "Eph\0" + "Sondag\0" + "Maandag\0" + "Dinsdag\0" + "Woensdag\0" + "Donderdag\0" + "Vrydag\0" + "Saterdag\0" + "So.\0" + "Ma.\0" + "Di.\0" + "Wo.\0" + "Do.\0" + "Vr.\0" + "Sa.\0" + "Januarie\0" + "Februarie\0" + "Maart\0" + "Junie\0" + "Julie\0" + "Augustus\0" + "Jan.\0" + "Feb.\0" + "Mrt.\0" + "Apr.\0" + "Jun.\0" + "Jul.\0" + "Aug.\0" + "Sep.\0" + "Okt.\0" + "Nov.\0" + "Des.\0" + "\xe1\x83\x99\xe1\x83\x95\xe1\x83\x98\xe1\x83\xa0\xe1\x83\x90\0" + "\xe1\x83\x9d\xe1\x83\xa0\xe1\x83\xa8\xe1\x83\x90\xe1\x83\x91\xe1\x83\x90\xe1\x83\x97\xe1\x83\x98\0" + "\xe1\x83\xa1\xe1\x83\x90\xe1\x83\x9b\xe1\x83\xa8\xe1\x83\x90\xe1\x83\x91\xe1\x83\x90\xe1\x83\x97\xe1\x83\x98\0" + "\xe1\x83\x9d\xe1\x83\x97\xe1\x83\xae\xe1\x83\xa8\xe1\x83\x90\xe1\x83\x91\xe1\x83\x90\xe1\x83\x97\xe1\x83\x98\0" + "\xe1\x83\xae\xe1\x83\xa3\xe1\x83\x97\xe1\x83\xa8\xe1\x83\x90\xe1\x83\x91\xe1\x83\x90\xe1\x83\x97\xe1\x83\x98\0" + "\xe1\x83\x9e\xe1\x83\x90\xe1\x83\xa0\xe1\x83\x90\xe1\x83\xa1\xe1\x83\x99\xe1\x83\x94\xe1\x83\x95\xe1\x83\x98\0" + "\xe1\x83\xa8\xe1\x83\x90\xe1\x83\x91\xe1\x83\x90\xe1\x83\x97\xe1\x83\x98\0" + "\xe1\x83\x99\xe1\x83\x95\xe1\x83\x98\0" + "\xe1\x83\x9d\xe1\x83\xa0\xe1\x83\xa8\0" + "\xe1\x83\xa1\xe1\x83\x90\xe1\x83\x9b\0" + "\xe1\x83\x9d\xe1\x83\x97\xe1\x83\xae\0" + "\xe1\x83\xae\xe1\x83\xa3\xe1\x83\x97\0" + "\xe1\x83\x9e\xe1\x83\x90\xe1\x83\xa0\0" + "\xe1\x83\xa8\xe1\x83\x90\xe1\x83\x91\0" + "\xe1\x83\x99\0" + "\xe1\x83\x9d\0" + "\xe1\x83\xa1\0" + "\xe1\x83\xae\0" + "\xe1\x83\x9e\0" + "\xe1\x83\xa8\0" + "\xe1\x83\x98\xe1\x83\x90\xe1\x83\x9c\xe1\x83\x95\xe1\x83\x90\xe1\x83\xa0\xe1\x83\x98\0" + "\xe1\x83\x97\xe1\x83\x94\xe1\x83\x91\xe1\x83\x94\xe1\x83\xa0\xe1\x83\x95\xe1\x83\x90\xe1\x83\x9a\xe1\x83\x98\0" + "\xe1\x83\x9b\xe1\x83\x90\xe1\x83\xa0\xe1\x83\xa2\xe1\x83\x98\0" + "\xe1\x83\x90\xe1\x83\x9e\xe1\x83\xa0\xe1\x83\x98\xe1\x83\x9a\xe1\x83\x98\0" + "\xe1\x83\x9b\xe1\x83\x90\xe1\x83\x98\xe1\x83\xa1\xe1\x83\x98\0" + "\xe1\x83\x98\xe1\x83\x95\xe1\x83\x9c\xe1\x83\x98\xe1\x83\xa1\xe1\x83\x98\0" + "\xe1\x83\x98\xe1\x83\x95\xe1\x83\x9a\xe1\x83\x98\xe1\x83\xa1\xe1\x83\x98\0" + "\xe1\x83\x90\xe1\x83\x92\xe1\x83\x95\xe1\x83\x98\xe1\x83\xa1\xe1\x83\xa2\xe1\x83\x9d\0" + "\xe1\x83\xa1\xe1\x83\x94\xe1\x83\xa5\xe1\x83\xa2\xe1\x83\x94\xe1\x83\x9b\xe1\x83\x91\xe1\x83\x94\xe1\x83\xa0\xe1\x83\x98\0" + "\xe1\x83\x9d\xe1\x83\xa5\xe1\x83\xa2\xe1\x83\x9d\xe1\x83\x9b\xe1\x83\x91\xe1\x83\x94\xe1\x83\xa0\xe1\x83\x98\0" + "\xe1\x83\x9c\xe1\x83\x9d\xe1\x83\x94\xe1\x83\x9b\xe1\x83\x91\xe1\x83\x94\xe1\x83\xa0\xe1\x83\x98\0" + "\xe1\x83\x93\xe1\x83\x94\xe1\x83\x99\xe1\x83\x94\xe1\x83\x9b\xe1\x83\x91\xe1\x83\x94\xe1\x83\xa0\xe1\x83\x98\0" + "\xe1\x83\x98\xe1\x83\x90\xe1\x83\x9c\0" + "\xe1\x83\x97\xe1\x83\x94\xe1\x83\x91\0" + "\xe1\x83\x9b\xe1\x83\x90\xe1\x83\xa0\0" + "\xe1\x83\x90\xe1\x83\x9e\xe1\x83\xa0\0" + "\xe1\x83\x9b\xe1\x83\x90\xe1\x83\x98\0" + "\xe1\x83\x98\xe1\x83\x95\xe1\x83\x9c\0" + "\xe1\x83\x98\xe1\x83\x95\xe1\x83\x9a\0" + "\xe1\x83\x90\xe1\x83\x92\xe1\x83\x95\0" + "\xe1\x83\xa1\xe1\x83\x94\xe1\x83\xa5\0" + "\xe1\x83\x9d\xe1\x83\xa5\xe1\x83\xa2\0" + "\xe1\x83\x9c\xe1\x83\x9d\xe1\x83\x94\0" + "\xe1\x83\x93\xe1\x83\x94\xe1\x83\x99\0" + "m\xc3\xa1nadagur\0" + "t\xc3\xbdsdagur\0" + "mikudagur\0" + "h\xc3\xb3sdagur\0" + "fr\xc3\xadggjadagur\0" + "leygardagur\0" + "sun\0" + "m\xc3\xa1n\0" + "t\xc3\xbds\0" + "mik\0" + "h\xc3\xb3s\0" + "fr\xc3\xad\0" + "ley\0" + "\xe0\xa4\xb0\xe0\xa4\xb5\xe0\xa4\xbf\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\xb0\0" + "\xe0\xa4\xb8\xe0\xa5\x8b\xe0\xa4\xae\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\xb0\0" + "\xe0\xa4\xae\xe0\xa4\x82\xe0\xa4\x97\xe0\xa4\xb2\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\xb0\0" + "\xe0\xa4\xac\xe0\xa5\x81\xe0\xa4\xa7\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\xb0\0" + "\xe0\xa4\x97\xe0\xa5\x81\xe0\xa4\xb0\xe0\xa5\x81\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\xb0\0" + "\xe0\xa4\xb6\xe0\xa5\x81\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\xb0\0" + "\xe0\xa4\xb6\xe0\xa4\xa8\xe0\xa4\xbf\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\xb0\0" + "\xe0\xa4\xb0\xe0\xa4\xb5\xe0\xa4\xbf\0" + "\xe0\xa4\xb8\xe0\xa5\x8b\xe0\xa4\xae\0" + "\xe0\xa4\xae\xe0\xa4\x82\xe0\xa4\x97\xe0\xa4\xb2\0" + "\xe0\xa4\xac\xe0\xa5\x81\xe0\xa4\xa7\0" + "\xe0\xa4\x97\xe0\xa5\x81\xe0\xa4\xb0\xe0\xa5\x81\0" + "\xe0\xa4\xb6\xe0\xa5\x81\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb0\0" + "\xe0\xa4\xb6\xe0\xa4\xa8\xe0\xa4\xbf\0" + "\xe0\xa4\xb0\0" + "\xe0\xa4\xb8\xe0\xa5\x8b\0" + "\xe0\xa4\xae\xe0\xa4\x82\0" + "\xe0\xa4\xac\xe0\xa5\x81\0" + "\xe0\xa4\x97\xe0\xa5\x81\0" + "\xe0\xa4\xb6\xe0\xa5\x81\0" + "\xe0\xa4\xb6\0" + "\xe0\xa4\x9c\xe0\xa4\xa8\xe0\xa4\xb5\xe0\xa4\xb0\xe0\xa5\x80\0" + "\xe0\xa4\xab\xe0\xa4\xbc\xe0\xa4\xb0\xe0\xa4\xb5\xe0\xa4\xb0\xe0\xa5\x80\0" + "\xe0\xa4\xae\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\x9a\0" + "\xe0\xa4\x85\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa5\x88\xe0\xa4\xb2\0" + "\xe0\xa4\xae\xe0\xa4\x88\0" + "\xe0\xa4\x9c\xe0\xa5\x82\xe0\xa4\xa8\0" + "\xe0\xa4\x9c\xe0\xa5\x81\xe0\xa4\xb2\xe0\xa4\xbe\xe0\xa4\x88\0" + "\xe0\xa4\x85\xe0\xa4\x97\xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\xa4\0" + "\xe0\xa4\xb8\xe0\xa4\xbf\xe0\xa4\xa4\xe0\xa4\x82\xe0\xa4\xac\xe0\xa4\xb0\0" + "\xe0\xa4\x85\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa5\x82\xe0\xa4\xac\xe0\xa4\xb0\0" + "\xe0\xa4\xa8\xe0\xa4\xb5\xe0\xa4\x82\xe0\xa4\xac\xe0\xa4\xb0\0" + "\xe0\xa4\xa6\xe0\xa4\xbf\xe0\xa4\xb8\xe0\xa4\x82\xe0\xa4\xac\xe0\xa4\xb0\0" + "\xe0\xa4\x9c\xe0\xa4\xa8\xe0\xa5\xb0\0" + "\xe0\xa4\xab\xe0\xa4\xbc\xe0\xa4\xb0\xe0\xa5\xb0\0" + "\xe0\xa4\x9c\xe0\xa5\x81\xe0\xa4\xb2\xe0\xa5\xb0\0" + "\xe0\xa4\x85\xe0\xa4\x97\xe0\xa5\xb0\0" + "\xe0\xa4\xb8\xe0\xa4\xbf\xe0\xa4\xa4\xe0\xa5\xb0\0" + "\xe0\xa4\x85\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xa4\xe0\xa5\x82\xe0\xa5\xb0\0" + "\xe0\xa4\xa8\xe0\xa4\xb5\xe0\xa5\xb0\0" + "\xe0\xa4\xa6\xe0\xa4\xbf\xe0\xa4\xb8\xe0\xa5\xb0\0" + "Il-\xc4\xa6\x61\x64\x64\0" + "It-Tnejn\0" + "It-Tlieta\0" + "L-Erbg\xc4\xa7\x61\0" + "Il-\xc4\xa6\x61mis\0" + "Il-\xc4\xa0img\xc4\xa7\x61\0" + "Is-Sibt\0" + "\xc4\xa6\x61\x64\0" + "Tne\0" + "Tli\0" + "Erb\0" + "\xc4\xa6\x61m\0" + "\xc4\xa0im\0" + "Sib\0" + "\xc4\xa6\x64\0" + "Tn\0" + "Tl\0" + "Er\0" + "\xc4\xa6m\0" + "\xc4\xa0m\0" + "Sb\0" + "Jannar\0" + "Frar\0" + "Marzu\0" + "Mejju\0" + "\xc4\xa0unju\0" + "Lulju\0" + "Awwissu\0" + "Settembru\0" + "Ottubru\0" + "Novembru\0" + "Di\xc4\x8b\x65mbru\0" + "Fra\0" + "Mej\0" + "\xc4\xa0un\0" + "Lul\0" + "Aww\0" + "Set\0" + "Ott\0" + "Di\xc4\x8b\0" + "sotnabeaivi\0" + "vuoss\xc3\xa1rga\0" + "ma\xc5\x8b\xc5\x8b\x65\x62\xc3\xa1rga\0" + "gaskavahkku\0" + "duorasdat\0" + "bearjadat\0" + "l\xc3\xa1vvardat\0" + "sotn\0" + "vuos\0" + "ma\xc5\x8b\0" + "gask\0" + "duor\0" + "bear\0" + "l\xc3\xa1v\0" + "o\xc4\x91\xc4\x91\x61jagem\xc3\xa1nnu\0" + "guovvam\xc3\xa1nnu\0" + "njuk\xc4\x8d\x61m\xc3\xa1nnu\0" + "cuo\xc5\x8bom\xc3\xa1nnu\0" + "miessem\xc3\xa1nnu\0" + "geassem\xc3\xa1nnu\0" + "suoidnem\xc3\xa1nnu\0" + "borgem\xc3\xa1nnu\0" + "\xc4\x8d\x61k\xc4\x8d\x61m\xc3\xa1nnu\0" + "golggotm\xc3\xa1nnu\0" + "sk\xc3\xa1\x62mam\xc3\xa1nnu\0" + "juovlam\xc3\xa1nnu\0" + "o\xc4\x91\xc4\x91j\0" + "guov\0" + "njuk\0" + "cuo\0" + "mies\0" + "geas\0" + "suoi\0" + "borg\0" + "\xc4\x8d\x61k\xc4\x8d\0" + "golg\0" + "sk\xc3\xa1\x62\0" + "juov\0" + "D\xc3\xa9 Domhnaigh\0" + "D\xc3\xa9 Luain\0" + "D\xc3\xa9 M\xc3\xa1irt\0" + "D\xc3\xa9 C\xc3\xa9\x61\x64\x61oin\0" + "D\xc3\xa9\x61rdaoin\0" + "D\xc3\xa9 hAoine\0" + "D\xc3\xa9 Sathairn\0" + "Domh\0" + "Luan\0" + "M\xc3\xa1irt\0" + "C\xc3\xa9\x61\x64\0" + "D\xc3\xa9\x61r\0" + "Aoine\0" + "Sath\0" + "Ean\xc3\xa1ir\0" + "Feabhra\0" + "M\xc3\xa1rta\0" + "Aibre\xc3\xa1n\0" + "Bealtaine\0" + "Meitheamh\0" + "I\xc3\xbail\0" + "L\xc3\xbanasa\0" + "Me\xc3\xa1n F\xc3\xb3mhair\0" + "Deireadh F\xc3\xb3mhair\0" + "Samhain\0" + "Nollaig\0" + "Ean\0" + "Feabh\0" + "Aib\0" + "Beal\0" + "Meith\0" + "L\xc3\xban\0" + "MF\xc3\xb3mh\0" + "DF\xc3\xb3mh\0" + "Samh\0" + "Noll\0" + "Ahad\0" + "Isnin\0" + "Khamis\0" + "Jumaat\0" + "Ahd\0" + "Isn\0" + "Kha\0" + "Mac\0" + "Julai\0" + "Ogos\0" + "Disember\0" + "Ogo\0" + "\xd0\xb6\xd0\xb5\xd0\xba\xd1\x81\xd0\xb5\xd0\xbd\xd0\xb1\xd1\x96\0" + "\xd0\xb4\xd2\xaf\xd0\xb9\xd1\x81\xd0\xb5\xd0\xbd\xd0\xb1\xd1\x96\0" + "\xd1\x81\xd0\xb5\xd0\xb9\xd1\x81\xd0\xb5\xd0\xbd\xd0\xb1\xd1\x96\0" + "\xd1\x81\xd3\x99\xd1\x80\xd1\x81\xd0\xb5\xd0\xbd\xd0\xb1\xd1\x96\0" + "\xd0\xb1\xd0\xb5\xd0\xb9\xd1\x81\xd0\xb5\xd0\xbd\xd0\xb1\xd1\x96\0" + "\xd0\xb6\xd2\xb1\xd0\xbc\xd0\xb0\0" + "\xd1\x81\xd0\xb5\xd0\xbd\xd0\xb1\xd1\x96\0" + "\xd0\x96\xd1\x81\0" + "\xd0\x94\xd1\x81\0" + "\xd0\xa1\xd1\x81\0" + "\xd0\xa1\xd1\x80\0" + "\xd0\x91\xd1\x81\0" + "\xd0\x96\xd0\xbc\0" + "\xd0\xa1\xd0\xb1\0" + "\xd0\x96\0" + "\xd0\x94\0" + "\xd0\x91\0" + "\xd2\x9a\xd0\xb0\xd2\xa3\xd1\x82\xd0\xb0\xd1\x80\0" + "\xd0\x90\xd2\x9b\xd0\xbf\xd0\xb0\xd0\xbd\0" + "\xd0\x9d\xd0\xb0\xd1\x83\xd1\x80\xd1\x8b\xd0\xb7\0" + "\xd0\xa1\xd3\x99\xd1\x83\xd1\x96\xd1\x80\0" + "\xd0\x9c\xd0\xb0\xd0\xbc\xd1\x8b\xd1\x80\0" + "\xd0\x9c\xd0\xb0\xd1\x83\xd1\x81\xd1\x8b\xd0\xbc\0" + "\xd0\xa8\xd1\x96\xd0\xbb\xd0\xb4\xd0\xb5\0" + "\xd0\xa2\xd0\xb0\xd0\xbc\xd1\x8b\xd0\xb7\0" + "\xd2\x9a\xd1\x8b\xd1\x80\xd0\xba\xd2\xaf\xd0\xb9\xd0\xb5\xd0\xba\0" + "\xd2\x9a\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xbd\0" + "\xd2\x9a\xd0\xb0\xd1\x80\xd0\xb0\xd1\x88\xd0\xb0\0" + "\xd0\x96\xd0\xb5\xd0\xbb\xd1\x82\xd0\xbe\xd2\x9b\xd1\x81\xd0\xb0\xd0\xbd\0" + "\xd2\x9b\xd0\xb0\xd2\xa3\xd1\x82\xd0\xb0\xd1\x80\0" + "\xd0\xb0\xd2\x9b\xd0\xbf\xd0\xb0\xd0\xbd\0" + "\xd0\xbd\xd0\xb0\xd1\x83\xd1\x80\xd1\x8b\xd0\xb7\0" + "\xd1\x81\xd3\x99\xd1\x83\xd1\x96\xd1\x80\0" + "\xd0\xbc\xd0\xb0\xd0\xbc\xd1\x8b\xd1\x80\0" + "\xd0\xbc\xd0\xb0\xd1\x83\xd1\x81\xd1\x8b\xd0\xbc\0" + "\xd1\x88\xd1\x96\xd0\xbb\xd0\xb4\xd0\xb5\0" + "\xd1\x82\xd0\xb0\xd0\xbc\xd1\x8b\xd0\xb7\0" + "\xd2\x9b\xd1\x8b\xd1\x80\xd0\xba\xd2\xaf\xd0\xb9\xd0\xb5\xd0\xba\0" + "\xd2\x9b\xd0\xb0\xd0\xb7\xd0\xb0\xd0\xbd\0" + "\xd2\x9b\xd0\xb0\xd1\x80\xd0\xb0\xd1\x88\xd0\xb0\0" + "\xd0\xb6\xd0\xb5\xd0\xbb\xd1\x82\xd0\xbe\xd2\x9b\xd1\x81\xd0\xb0\xd0\xbd\0" + "\xd2\x9a\xd0\xb0\xd2\xa3.\0" + "\xd0\x90\xd2\x9b\xd0\xbf.\0" + "\xd0\x9d\xd0\xb0\xd1\x83.\0" + "\xd0\xa1\xd3\x99\xd1\x83.\0" + "\xd0\x9c\xd0\xb0\xd0\xbc.\0" + "\xd0\x9c\xd0\xb0\xd1\x83.\0" + "\xd0\xa8\xd1\x96\xd0\xbb.\0" + "\xd0\xa2\xd0\xb0\xd0\xbc.\0" + "\xd2\x9a\xd1\x8b\xd1\x80.\0" + "\xd2\x9a\xd0\xb0\xd0\xb7.\0" + "\xd2\x9a\xd0\xb0\xd1\x80.\0" + "\xd0\x96\xd0\xb5\xd0\xbb.\0" + "\xd0\xb6\xd0\xb5\xd0\xba\xd1\x88\xd0\xb5\xd0\xbc\xd0\xb1\xd0\xb8\0" + "\xd0\xb4\xd2\xaf\xd0\xb9\xd1\x88\xd3\xa9\xd0\xbc\xd0\xb1\xd2\xaf\0" + "\xd1\x88\xd0\xb5\xd0\xb9\xd1\x88\xd0\xb5\xd0\xbc\xd0\xb1\xd0\xb8\0" + "\xd1\x88\xd0\xb0\xd1\x80\xd1\x88\xd0\xb5\xd0\xbc\xd0\xb1\xd0\xb8\0" + "\xd0\xb1\xd0\xb5\xd0\xb9\xd1\x88\xd0\xb5\xd0\xbc\xd0\xb1\xd0\xb8\0" + "\xd0\xb6\xd1\x83\xd0\xbc\xd0\xb0\0" + "\xd0\xb8\xd1\x88\xd0\xb5\xd0\xbc\xd0\xb1\xd0\xb8\0" + "\xd0\xb6\xd0\xb5\xd0\xba.\0" + "\xd0\xb4\xd2\xaf\xd0\xb9.\0" + "\xd1\x88\xd0\xb5\xd0\xb9\xd1\x88.\0" + "\xd1\x88\xd0\xb0\xd1\x80\xd1\x88.\0" + "\xd0\xb1\xd0\xb5\xd0\xb9\xd1\x88.\0" + "\xd0\xb8\xd1\x88\xd0\xbc.\0" + "\xd0\xa8\0" + "\xd0\x98\0" + "\xd0\xaf\xd0\xbd\xd0\xb2\xd0\xb0\xd1\x80\xd1\x8c\0" + "\xd0\xa4\xd0\xb5\xd0\xb2\xd1\x80\xd0\xb0\xd0\xbb\xd1\x8c\0" + "\xd0\x90\xd0\xbf\xd1\x80\xd0\xb5\xd0\xbb\xd1\x8c\0" + "\xd0\x98\xd1\x8e\xd0\xbd\xd1\x8c\0" + "\xd0\x98\xd1\x8e\xd0\xbb\xd1\x8c\0" + "\xd0\xa1\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8f\xd0\xb1\xd1\x80\xd1\x8c\0" + "\xd0\x9e\xd0\xba\xd1\x82\xd1\x8f\xd0\xb1\xd1\x80\xd1\x8c\0" + "\xd0\x9d\xd0\xbe\xd1\x8f\xd0\xb1\xd1\x80\xd1\x8c\0" + "\xd0\x94\xd0\xb5\xd0\xba\xd0\xb0\xd0\xb1\xd1\x80\xd1\x8c\0" + "Jumapili\0" + "Jumatatu\0" + "Jumanne\0" + "Jumatano\0" + "Alhamisi\0" + "Ijumaa\0" + "Jumamosi\0" + "Machi\0" + "Aprili\0" + "Agosti\0" + "Oktoba\0" + "Desemba\0" + "Ago\0" + "\xc3\xbd\x65k\xc5\x9f\x65nbe\0" + "du\xc5\x9f\x65nbe\0" + "si\xc5\x9f\x65nbe\0" + "\xc3\xa7\x61r\xc5\x9f\x65nbe\0" + "pen\xc5\x9f\x65nbe\0" + "anna\0" + "\xc5\x9f\x65nbe\0" + "\xc3\xbd\x62\0" + "db\0" + "sb\0" + "\xc3\xa7\x62\0" + "pb\0" + "\xc5\x9f\x62\0" + "\xc3\x9d\0" + "\xc5\x9e\0" + "\xc3\xbd\x61nwar\0" + "fewral\0" + "ma\xc3\xbd\0" + "i\xc3\xbdun\0" + "i\xc3\xbdul\0" + "sent\xc3\xbd\x61\x62r\0" + "okt\xc3\xbd\x61\x62r\0" + "no\xc3\xbd\x61\x62r\0" + "\xc3\xbd\x61n\0" + "few\0" + "no\xc3\xbd\0" + "yakshanba\0" + "dushanba\0" + "seshanba\0" + "chorshanba\0" + "payshanba\0" + "juma\0" + "shanba\0" + "Yak\0" + "Dush\0" + "Sesh\0" + "Chor\0" + "Pay\0" + "Shan\0" + "Y\0" + "Iyun\0" + "Iyul\0" + "Avgust\0" + "Sentabr\0" + "Oktabr\0" + "sentabr\0" + "oktabr\0" + "Fev\0" + "Iyn\0" + "Iyl\0" + "Avg\0" + "Noy\0" + "Dek\0" + "\xe0\xa6\xb0\xe0\xa6\xac\xe0\xa6\xbf\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\xb0\0" + "\xe0\xa6\xb8\xe0\xa7\x8b\xe0\xa6\xae\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\xb0\0" + "\xe0\xa6\xae\xe0\xa6\x99\xe0\xa7\x8d\xe0\xa6\x97\xe0\xa6\xb2\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\xb0\0" + "\xe0\xa6\xac\xe0\xa7\x81\xe0\xa6\xa7\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\xb0\0" + "\xe0\xa6\xac\xe0\xa7\x83\xe0\xa6\xb9\xe0\xa6\xb8\xe0\xa7\x8d\xe0\xa6\xaa\xe0\xa6\xa4\xe0\xa6\xbf\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\xb0\0" + "\xe0\xa6\xb6\xe0\xa7\x81\xe0\xa6\x95\xe0\xa7\x8d\xe0\xa6\xb0\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\xb0\0" + "\xe0\xa6\xb6\xe0\xa6\xa8\xe0\xa6\xbf\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa6\xb0\0" + "\xe0\xa6\xb0\xe0\xa6\xac\xe0\xa6\xbf\0" + "\xe0\xa6\xb8\xe0\xa7\x8b\xe0\xa6\xae\0" + "\xe0\xa6\xae\xe0\xa6\x99\xe0\xa7\x8d\xe0\xa6\x97\xe0\xa6\xb2\0" + "\xe0\xa6\xac\xe0\xa7\x81\xe0\xa6\xa7\0" + "\xe0\xa6\xac\xe0\xa7\x83\xe0\xa6\xb9\xe0\xa6\xb8\xe0\xa7\x8d\xe0\xa6\xaa\xe0\xa6\xa4\xe0\xa6\xbf\0" + "\xe0\xa6\xb6\xe0\xa7\x81\xe0\xa6\x95\xe0\xa7\x8d\xe0\xa6\xb0\0" + "\xe0\xa6\xb6\xe0\xa6\xa8\xe0\xa6\xbf\0" + "\xe0\xa6\xb0\0" + "\xe0\xa6\xb8\xe0\xa7\x8b\0" + "\xe0\xa6\xae\0" + "\xe0\xa6\xac\xe0\xa7\x81\0" + "\xe0\xa6\xac\xe0\xa7\x83\0" + "\xe0\xa6\xb6\xe0\xa7\x81\0" + "\xe0\xa6\xb6\0" + "\xe0\xa6\x9c\xe0\xa6\xbe\xe0\xa6\xa8\xe0\xa7\x81\xe0\xa6\xaf\xe0\xa6\xbc\xe0\xa6\xbe\xe0\xa6\xb0\xe0\xa7\x80\0" + "\xe0\xa6\xab\xe0\xa7\x87\xe0\xa6\xac\xe0\xa7\x8d\xe0\xa6\xb0\xe0\xa7\x81\xe0\xa6\xaf\xe0\xa6\xbc\xe0\xa6\xbe\xe0\xa6\xb0\xe0\xa7\x80\0" + "\xe0\xa6\xae\xe0\xa6\xbe\xe0\xa6\xb0\xe0\xa7\x8d\xe0\xa6\x9a\0" + "\xe0\xa6\x8f\xe0\xa6\xaa\xe0\xa7\x8d\xe0\xa6\xb0\xe0\xa6\xbf\xe0\xa6\xb2\0" + "\xe0\xa6\xae\xe0\xa7\x87\0" + "\xe0\xa6\x9c\xe0\xa7\x81\xe0\xa6\xa8\0" + "\xe0\xa6\x9c\xe0\xa7\x81\xe0\xa6\xb2\xe0\xa6\xbe\xe0\xa6\x87\0" + "\xe0\xa6\x86\xe0\xa6\x97\xe0\xa6\xb8\xe0\xa7\x8d\xe0\xa6\x9f\0" + "\xe0\xa6\xb8\xe0\xa7\x87\xe0\xa6\xaa\xe0\xa7\x8d\xe0\xa6\x9f\xe0\xa7\x87\xe0\xa6\xae\xe0\xa7\x8d\xe0\xa6\xac\xe0\xa6\xb0\0" + "\xe0\xa6\x85\xe0\xa6\x95\xe0\xa7\x8d\xe0\xa6\x9f\xe0\xa7\x8b\xe0\xa6\xac\xe0\xa6\xb0\0" + "\xe0\xa6\xa8\xe0\xa6\xad\xe0\xa7\x87\xe0\xa6\xae\xe0\xa7\x8d\xe0\xa6\xac\xe0\xa6\xb0\0" + "\xe0\xa6\xa1\xe0\xa6\xbf\xe0\xa6\xb8\xe0\xa7\x87\xe0\xa6\xae\xe0\xa7\x8d\xe0\xa6\xac\xe0\xa6\xb0\0" + "\xe0\xa8\x90\xe0\xa8\xa4\xe0\xa8\xb5\xe0\xa8\xbe\xe0\xa8\xb0\0" + "\xe0\xa8\xb8\xe0\xa9\x8b\xe0\xa8\xae\xe0\xa8\xb5\xe0\xa8\xbe\xe0\xa8\xb0\0" + "\xe0\xa8\xae\xe0\xa9\xb0\xe0\xa8\x97\xe0\xa8\xb2\xe0\xa8\xb5\xe0\xa8\xbe\xe0\xa8\xb0\0" + "\xe0\xa8\xac\xe0\xa9\x81\xe0\xa9\xb1\xe0\xa8\xa7\xe0\xa8\xb5\xe0\xa8\xbe\xe0\xa8\xb0\0" + "\xe0\xa8\xb5\xe0\xa9\x80\xe0\xa8\xb0\xe0\xa8\xb5\xe0\xa8\xbe\xe0\xa8\xb0\0" + "\xe0\xa8\xb8\xe0\xa8\xbc\xe0\xa9\x81\xe0\xa9\xb1\xe0\xa8\x95\xe0\xa8\xb0\xe0\xa8\xb5\xe0\xa8\xbe\xe0\xa8\xb0\0" + "\xe0\xa8\xb8\xe0\xa8\xbc\xe0\xa8\xa8\xe0\xa8\xbf\xe0\xa9\xb1\xe0\xa8\x9a\xe0\xa8\xb0\xe0\xa8\xb5\xe0\xa8\xbe\xe0\xa8\xb0\0" + "\xe0\xa8\x90\xe0\xa8\xa4\0" + "\xe0\xa8\xb8\xe0\xa9\x8b\xe0\xa8\xae\0" + "\xe0\xa8\xae\xe0\xa9\xb0\xe0\xa8\x97\xe0\xa8\xb2\0" + "\xe0\xa8\xac\xe0\xa9\x81\xe0\xa9\xb1\xe0\xa8\xa7\0" + "\xe0\xa8\xb5\xe0\xa9\x80\xe0\xa8\xb0\0" + "\xe0\xa8\xb8\xe0\xa8\xbc\xe0\xa9\x81\xe0\xa9\xb1\xe0\xa8\x95\xe0\xa8\xb0\0" + "\xe0\xa8\xb8\xe0\xa8\xbc\xe0\xa8\xa8\xe0\xa8\xbf\xe0\xa9\xb1\xe0\xa8\x9a\xe0\xa8\xb0\0" + "\xe0\xa8\x90\0" + "\xe0\xa8\xb8\xe0\xa9\x8b\0" + "\xe0\xa8\xae\xe0\xa9\xb0\0" + "\xe0\xa8\xac\xe0\xa9\x81\xe0\xa9\xb1\0" + "\xe0\xa8\xb5\xe0\xa9\x80\0" + "\xe0\xa8\xb8\xe0\xa8\xbc\xe0\xa9\x81\xe0\xa9\xb1\0" + "\xe0\xa8\xb8\xe0\xa8\xbc\0" + "\xe0\xa8\x9c\xe0\xa8\xa8\xe0\xa8\xb5\xe0\xa8\xb0\xe0\xa9\x80\0" + "\xe0\xa8\xab\xe0\xa8\xbc\xe0\xa8\xb0\xe0\xa8\xb5\xe0\xa8\xb0\xe0\xa9\x80\0" + "\xe0\xa8\xae\xe0\xa8\xbe\xe0\xa8\xb0\xe0\xa8\x9a\0" + "\xe0\xa8\x85\xe0\xa8\xaa\xe0\xa9\x8d\xe0\xa8\xb0\xe0\xa9\x88\xe0\xa8\xb2\0" + "\xe0\xa8\xae\xe0\xa8\x88\0" + "\xe0\xa8\x9c\xe0\xa9\x82\xe0\xa8\xa8\0" + "\xe0\xa8\x9c\xe0\xa9\x81\xe0\xa8\xb2\xe0\xa8\xbe\xe0\xa8\x88\0" + "\xe0\xa8\x85\xe0\xa8\x97\xe0\xa8\xb8\xe0\xa8\xa4\0" + "\xe0\xa8\xb8\xe0\xa8\xa4\xe0\xa9\xb0\xe0\xa8\xac\xe0\xa8\xb0\0" + "\xe0\xa8\x85\xe0\xa8\x95\xe0\xa8\xa4\xe0\xa9\x82\xe0\xa8\xac\xe0\xa8\xb0\0" + "\xe0\xa8\xa8\xe0\xa8\xb5\xe0\xa9\xb0\xe0\xa8\xac\xe0\xa8\xb0\0" + "\xe0\xa8\xa6\xe0\xa8\xb8\xe0\xa9\xb0\xe0\xa8\xac\xe0\xa8\xb0\0" + "\xe0\xa8\x9c\xe0\xa8\xa8\0" + "\xe0\xa8\xab\xe0\xa8\xbc\xe0\xa8\xb0\0" + "\xe0\xa8\x85\xe0\xa8\xaa\xe0\xa9\x8d\xe0\xa8\xb0\xe0\xa9\x88\0" + "\xe0\xa8\x9c\xe0\xa9\x81\xe0\xa8\xb2\xe0\xa8\xbe\0" + "\xe0\xa8\x85\xe0\xa8\x97\0" + "\xe0\xa8\xb8\xe0\xa8\xa4\xe0\xa9\xb0\0" + "\xe0\xa8\x85\xe0\xa8\x95\xe0\xa8\xa4\xe0\xa9\x82\0" + "\xe0\xa8\xa8\xe0\xa8\xb5\xe0\xa9\xb0\0" + "\xe0\xa8\xa6\xe0\xa8\xb8\xe0\xa9\xb0\0" + "\xe0\xaa\xb0\xe0\xaa\xb5\xe0\xaa\xbf\xe0\xaa\xb5\xe0\xaa\xbe\xe0\xaa\xb0\0" + "\xe0\xaa\xb8\xe0\xab\x8b\xe0\xaa\xae\xe0\xaa\xb5\xe0\xaa\xbe\xe0\xaa\xb0\0" + "\xe0\xaa\xae\xe0\xaa\x82\xe0\xaa\x97\xe0\xaa\xb3\xe0\xaa\xb5\xe0\xaa\xbe\xe0\xaa\xb0\0" + "\xe0\xaa\xac\xe0\xab\x81\xe0\xaa\xa7\xe0\xaa\xb5\xe0\xaa\xbe\xe0\xaa\xb0\0" + "\xe0\xaa\x97\xe0\xab\x81\xe0\xaa\xb0\xe0\xab\x81\xe0\xaa\xb5\xe0\xaa\xbe\xe0\xaa\xb0\0" + "\xe0\xaa\xb6\xe0\xab\x81\xe0\xaa\x95\xe0\xab\x8d\xe0\xaa\xb0\xe0\xaa\xb5\xe0\xaa\xbe\xe0\xaa\xb0\0" + "\xe0\xaa\xb6\xe0\xaa\xa8\xe0\xaa\xbf\xe0\xaa\xb5\xe0\xaa\xbe\xe0\xaa\xb0\0" + "\xe0\xaa\xb0\xe0\xaa\xb5\xe0\xaa\xbf\0" + "\xe0\xaa\xb8\xe0\xab\x8b\xe0\xaa\xae\0" + "\xe0\xaa\xae\xe0\xaa\x82\xe0\xaa\x97\xe0\xaa\xb3\0" + "\xe0\xaa\xac\xe0\xab\x81\xe0\xaa\xa7\0" + "\xe0\xaa\x97\xe0\xab\x81\xe0\xaa\xb0\xe0\xab\x81\0" + "\xe0\xaa\xb6\xe0\xab\x81\xe0\xaa\x95\xe0\xab\x8d\xe0\xaa\xb0\0" + "\xe0\xaa\xb6\xe0\xaa\xa8\xe0\xaa\xbf\0" + "\xe0\xaa\xb0\0" + "\xe0\xaa\xb8\xe0\xab\x8b\0" + "\xe0\xaa\xae\xe0\xaa\x82\0" + "\xe0\xaa\xac\xe0\xab\x81\0" + "\xe0\xaa\x97\xe0\xab\x81\0" + "\xe0\xaa\xb6\xe0\xab\x81\0" + "\xe0\xaa\xb6\0" + "\xe0\xaa\x9c\xe0\xaa\xbe\xe0\xaa\xa8\xe0\xab\x8d\xe0\xaa\xaf\xe0\xab\x81\xe0\xaa\x86\xe0\xaa\xb0\xe0\xab\x80\0" + "\xe0\xaa\xab\xe0\xab\x87\xe0\xaa\xac\xe0\xab\x8d\xe0\xaa\xb0\xe0\xab\x81\xe0\xaa\x86\xe0\xaa\xb0\xe0\xab\x80\0" + "\xe0\xaa\xae\xe0\xaa\xbe\xe0\xaa\xb0\xe0\xab\x8d\xe0\xaa\x9a\0" + "\xe0\xaa\x8f\xe0\xaa\xaa\xe0\xab\x8d\xe0\xaa\xb0\xe0\xaa\xbf\xe0\xaa\xb2\0" + "\xe0\xaa\xae\xe0\xab\x87\0" + "\xe0\xaa\x9c\xe0\xab\x82\xe0\xaa\xa8\0" + "\xe0\xaa\x9c\xe0\xab\x81\xe0\xaa\xb2\xe0\xaa\xbe\xe0\xaa\x88\0" + "\xe0\xaa\x91\xe0\xaa\x97\xe0\xaa\xb8\xe0\xab\x8d\xe0\xaa\x9f\0" + "\xe0\xaa\xb8\xe0\xaa\xaa\xe0\xab\x8d\xe0\xaa\x9f\xe0\xab\x87\xe0\xaa\xae\xe0\xab\x8d\xe0\xaa\xac\xe0\xaa\xb0\0" + "\xe0\xaa\x91\xe0\xaa\x95\xe0\xab\x8d\xe0\xaa\x9f\xe0\xab\x8b\xe0\xaa\xac\xe0\xaa\xb0\0" + "\xe0\xaa\xa8\xe0\xaa\xb5\xe0\xab\x87\xe0\xaa\xae\xe0\xab\x8d\xe0\xaa\xac\xe0\xaa\xb0\0" + "\xe0\xaa\xa1\xe0\xaa\xbf\xe0\xaa\xb8\xe0\xab\x87\xe0\xaa\xae\xe0\xab\x8d\xe0\xaa\xac\xe0\xaa\xb0\0" + "\xe0\xaa\x9c\xe0\xaa\xbe\xe0\xaa\xa8\xe0\xab\x8d\xe0\xaa\xaf\xe0\xab\x81\0" + "\xe0\xaa\xab\xe0\xab\x87\xe0\xaa\xac\xe0\xab\x8d\xe0\xaa\xb0\xe0\xab\x81\0" + "\xe0\xaa\xb8\xe0\xaa\xaa\xe0\xab\x8d\xe0\xaa\x9f\xe0\xab\x87\0" + "\xe0\xaa\x91\xe0\xaa\x95\xe0\xab\x8d\xe0\xaa\x9f\xe0\xab\x8b\0" + "\xe0\xaa\xa8\xe0\xaa\xb5\xe0\xab\x87\0" + "\xe0\xaa\xa1\xe0\xaa\xbf\xe0\xaa\xb8\xe0\xab\x87\0" + "\xe0\xac\xb0\xe0\xac\xac\xe0\xac\xbf\xe0\xac\xac\xe0\xac\xbe\xe0\xac\xb0\0" + "\xe0\xac\xb8\xe0\xad\x8b\xe0\xac\xae\xe0\xac\xac\xe0\xac\xbe\xe0\xac\xb0\0" + "\xe0\xac\xae\xe0\xac\x99\xe0\xad\x8d\xe0\xac\x97\xe0\xac\xb3\xe0\xac\xac\xe0\xac\xbe\xe0\xac\xb0\0" + "\xe0\xac\xac\xe0\xad\x81\xe0\xac\xa7\xe0\xac\xac\xe0\xac\xbe\xe0\xac\xb0\0" + "\xe0\xac\x97\xe0\xad\x81\xe0\xac\xb0\xe0\xad\x81\xe0\xac\xac\xe0\xac\xbe\xe0\xac\xb0\0" + "\xe0\xac\xb6\xe0\xad\x81\xe0\xac\x95\xe0\xad\x8d\xe0\xac\xb0\xe0\xac\xac\xe0\xac\xbe\xe0\xac\xb0\0" + "\xe0\xac\xb6\xe0\xac\xa8\xe0\xac\xbf\xe0\xac\xac\xe0\xac\xbe\xe0\xac\xb0\0" + "\xe0\xac\xb0\xe0\xac\xac\xe0\xac\xbf\0" + "\xe0\xac\xb8\xe0\xad\x8b\xe0\xac\xae\0" + "\xe0\xac\xae\xe0\xac\x99\xe0\xad\x8d\xe0\xac\x97\xe0\xac\xb3\0" + "\xe0\xac\xac\xe0\xad\x81\xe0\xac\xa7\0" + "\xe0\xac\x97\xe0\xad\x81\xe0\xac\xb0\xe0\xad\x81\0" + "\xe0\xac\xb6\xe0\xad\x81\xe0\xac\x95\xe0\xad\x8d\xe0\xac\xb0\0" + "\xe0\xac\xb6\xe0\xac\xa8\xe0\xac\xbf\0" + "\xe0\xac\xb0\0" + "\xe0\xac\xb8\xe0\xad\x8b\0" + "\xe0\xac\xae\0" + "\xe0\xac\xac\xe0\xad\x81\0" + "\xe0\xac\x97\xe0\xad\x81\0" + "\xe0\xac\xb6\xe0\xad\x81\0" + "\xe0\xac\xb6\0" + "\xe0\xac\x9c\xe0\xac\xbe\xe0\xac\xa8\xe0\xad\x81\xe0\xac\x86\xe0\xac\xb0\xe0\xad\x80\0" + "\xe0\xac\xab\xe0\xad\x87\xe0\xac\xac\xe0\xad\x83\xe0\xac\x86\xe0\xac\xb0\xe0\xad\x80\0" + "\xe0\xac\xae\xe0\xac\xbe\xe0\xac\xb0\xe0\xad\x8d\xe0\xac\x9a\xe0\xad\x8d\xe0\xac\x9a\0" + "\xe0\xac\x85\xe0\xac\xaa\xe0\xad\x8d\xe0\xac\xb0\xe0\xad\x87\xe0\xac\xb2\0" + "\xe0\xac\xae\xe0\xac\x87\0" + "\xe0\xac\x9c\xe0\xad\x81\xe0\xac\xa8\0" + "\xe0\xac\x9c\xe0\xad\x81\xe0\xac\xb2\xe0\xac\xbe\xe0\xac\x87\0" + "\xe0\xac\x85\xe0\xac\x97\xe0\xac\xb7\xe0\xad\x8d\xe0\xac\x9f\0" + "\xe0\xac\xb8\xe0\xad\x87\xe0\xac\xaa\xe0\xad\x8d\xe0\xac\x9f\xe0\xad\x87\xe0\xac\xae\xe0\xad\x8d\xe0\xac\xac\xe0\xac\xb0\0" + "\xe0\xac\x85\xe0\xac\x95\xe0\xad\x8d\xe0\xac\x9f\xe0\xad\x8b\xe0\xac\xac\xe0\xac\xb0\0" + "\xe0\xac\xa8\xe0\xac\xad\xe0\xad\x87\xe0\xac\xae\xe0\xad\x8d\xe0\xac\xac\xe0\xac\xb0\0" + "\xe0\xac\xa1\xe0\xac\xbf\xe0\xac\xb8\xe0\xad\x87\xe0\xac\xae\xe0\xad\x8d\xe0\xac\xac\xe0\xac\xb0\0" + "\xe0\xae\x9e\xe0\xae\xbe\xe0\xae\xaf\xe0\xae\xbf\xe0\xae\xb1\xe0\xaf\x81\0" + "\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\x99\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xb3\xe0\xaf\x8d\0" + "\xe0\xae\x9a\xe0\xaf\x86\xe0\xae\xb5\xe0\xaf\x8d\xe0\xae\xb5\xe0\xae\xbe\xe0\xae\xaf\xe0\xaf\x8d\0" + "\xe0\xae\xaa\xe0\xaf\x81\xe0\xae\xa4\xe0\xae\xa9\xe0\xaf\x8d\0" + "\xe0\xae\xb5\xe0\xae\xbf\xe0\xae\xaf\xe0\xae\xbe\xe0\xae\xb4\xe0\xae\xa9\xe0\xaf\x8d\0" + "\xe0\xae\xb5\xe0\xaf\x86\xe0\xae\xb3\xe0\xaf\x8d\xe0\xae\xb3\xe0\xae\xbf\0" + "\xe0\xae\x9a\xe0\xae\xa9\xe0\xae\xbf\0" + "\xe0\xae\x9e\xe0\xae\xbe\xe0\xae\xaf\xe0\xae\xbf.\0" + "\xe0\xae\xa4\xe0\xae\xbf\xe0\xae\x99\xe0\xaf\x8d.\0" + "\xe0\xae\x9a\xe0\xaf\x86\xe0\xae\xb5\xe0\xaf\x8d.\0" + "\xe0\xae\xaa\xe0\xaf\x81\xe0\xae\xa4.\0" + "\xe0\xae\xb5\xe0\xae\xbf\xe0\xae\xaf\xe0\xae\xbe.\0" + "\xe0\xae\xb5\xe0\xaf\x86\xe0\xae\xb3\xe0\xaf\x8d.\0" + "\xe0\xae\x9e\xe0\xae\xbe\0" + "\xe0\xae\xa4\xe0\xae\xbf\0" + "\xe0\xae\x9a\xe0\xaf\x86\0" + "\xe0\xae\xaa\xe0\xaf\x81\0" + "\xe0\xae\xb5\xe0\xae\xbf\0" + "\xe0\xae\xb5\xe0\xaf\x86\0" + "\xe0\xae\x9a\0" + "\xe0\xae\x9c\xe0\xae\xa9\xe0\xae\xb5\xe0\xae\xb0\xe0\xae\xbf\0" + "\xe0\xae\xaa\xe0\xae\xbf\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xb0\xe0\xae\xb5\xe0\xae\xb0\xe0\xae\xbf\0" + "\xe0\xae\xae\xe0\xae\xbe\xe0\xae\xb0\xe0\xaf\x8d\xe0\xae\x9a\xe0\xaf\x8d\0" + "\xe0\xae\x8f\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\xb0\xe0\xae\xb2\xe0\xaf\x8d\0" + "\xe0\xae\xae\xe0\xaf\x87\0" + "\xe0\xae\x9c\xe0\xaf\x82\xe0\xae\xa9\xe0\xaf\x8d\0" + "\xe0\xae\x9c\xe0\xaf\x82\xe0\xae\xb2\xe0\xaf\x88\0" + "\xe0\xae\x86\xe0\xae\x95\xe0\xae\xb8\xe0\xaf\x8d\xe0\xae\x9f\xe0\xaf\x8d\0" + "\xe0\xae\x9a\xe0\xaf\x86\xe0\xae\xaa\xe0\xaf\x8d\xe0\xae\x9f\xe0\xae\xae\xe0\xaf\x8d\xe0\xae\xaa\xe0\xae\xb0\xe0\xaf\x8d\0" + "\xe0\xae\x85\xe0\xae\x95\xe0\xaf\x8d\xe0\xae\x9f\xe0\xaf\x8b\xe0\xae\xaa\xe0\xae\xb0\xe0\xaf\x8d\0" + "\xe0\xae\xa8\xe0\xae\xb5\xe0\xae\xae\xe0\xaf\x8d\xe0\xae\xaa\xe0\xae\xb0\xe0\xaf\x8d\0" + "\xe0\xae\x9f\xe0\xae\xbf\xe0\xae\x9a\xe0\xae\xae\xe0\xaf\x8d\xe0\xae\xaa\xe0\xae\xb0\xe0\xaf\x8d\0" + "\xe0\xae\x9c\xe0\xae\xa9.\0" + "\xe0\xae\xaa\xe0\xae\xbf\xe0\xae\xaa\xe0\xaf\x8d.\0" + "\xe0\xae\xae\xe0\xae\xbe\xe0\xae\xb0\xe0\xaf\x8d.\0" + "\xe0\xae\x8f\xe0\xae\xaa\xe0\xaf\x8d.\0" + "\xe0\xae\x86\xe0\xae\x95.\0" + "\xe0\xae\x9a\xe0\xaf\x86\xe0\xae\xaa\xe0\xaf\x8d.\0" + "\xe0\xae\x85\xe0\xae\x95\xe0\xaf\x8d.\0" + "\xe0\xae\xa8\xe0\xae\xb5.\0" + "\xe0\xae\x9f\xe0\xae\xbf\xe0\xae\x9a.\0" + "\xe0\xb0\x86\xe0\xb0\xa6\xe0\xb0\xbf\xe0\xb0\xb5\xe0\xb0\xbe\xe0\xb0\xb0\xe0\xb0\x82\0" + "\xe0\xb0\xb8\xe0\xb1\x8b\xe0\xb0\xae\xe0\xb0\xb5\xe0\xb0\xbe\xe0\xb0\xb0\xe0\xb0\x82\0" + "\xe0\xb0\xae\xe0\xb0\x82\xe0\xb0\x97\xe0\xb0\xb3\xe0\xb0\xb5\xe0\xb0\xbe\xe0\xb0\xb0\xe0\xb0\x82\0" + "\xe0\xb0\xac\xe0\xb1\x81\xe0\xb0\xa7\xe0\xb0\xb5\xe0\xb0\xbe\xe0\xb0\xb0\xe0\xb0\x82\0" + "\xe0\xb0\x97\xe0\xb1\x81\xe0\xb0\xb0\xe0\xb1\x81\xe0\xb0\xb5\xe0\xb0\xbe\xe0\xb0\xb0\xe0\xb0\x82\0" + "\xe0\xb0\xb6\xe0\xb1\x81\xe0\xb0\x95\xe0\xb1\x8d\xe0\xb0\xb0\xe0\xb0\xb5\xe0\xb0\xbe\xe0\xb0\xb0\xe0\xb0\x82\0" + "\xe0\xb0\xb6\xe0\xb0\xa8\xe0\xb0\xbf\xe0\xb0\xb5\xe0\xb0\xbe\xe0\xb0\xb0\xe0\xb0\x82\0" + "\xe0\xb0\x86\xe0\xb0\xa6\xe0\xb0\xbf\0" + "\xe0\xb0\xb8\xe0\xb1\x8b\xe0\xb0\xae\0" + "\xe0\xb0\xae\xe0\xb0\x82\xe0\xb0\x97\xe0\xb0\xb3\0" + "\xe0\xb0\xac\xe0\xb1\x81\xe0\xb0\xa7\0" + "\xe0\xb0\x97\xe0\xb1\x81\xe0\xb0\xb0\xe0\xb1\x81\0" + "\xe0\xb0\xb6\xe0\xb1\x81\xe0\xb0\x95\xe0\xb1\x8d\xe0\xb0\xb0\0" + "\xe0\xb0\xb6\xe0\xb0\xa8\xe0\xb0\xbf\0" + "\xe0\xb0\x86\0" + "\xe0\xb0\xb8\xe0\xb1\x8b\0" + "\xe0\xb0\xae\0" + "\xe0\xb0\xac\xe0\xb1\x81\0" + "\xe0\xb0\x97\xe0\xb1\x81\0" + "\xe0\xb0\xb6\xe0\xb1\x81\0" + "\xe0\xb0\xb6\0" + "\xe0\xb0\x9c\xe0\xb0\xa8\xe0\xb0\xb5\xe0\xb0\xb0\xe0\xb0\xbf\0" + "\xe0\xb0\xab\xe0\xb0\xbf\xe0\xb0\xac\xe0\xb1\x8d\xe0\xb0\xb0\xe0\xb0\xb5\xe0\xb0\xb0\xe0\xb0\xbf\0" + "\xe0\xb0\xae\xe0\xb0\xbe\xe0\xb0\xb0\xe0\xb1\x8d\xe0\xb0\x9a\xe0\xb0\xbf\0" + "\xe0\xb0\x8f\xe0\xb0\xaa\xe0\xb1\x8d\xe0\xb0\xb0\xe0\xb0\xbf\xe0\xb0\xb2\xe0\xb1\x8d\0" + "\xe0\xb0\xae\xe0\xb1\x87\0" + "\xe0\xb0\x9c\xe0\xb1\x82\xe0\xb0\xa8\xe0\xb1\x8d\0" + "\xe0\xb0\x9c\xe0\xb1\x81\xe0\xb0\xb2\xe0\xb1\x88\0" + "\xe0\xb0\x86\xe0\xb0\x97\xe0\xb0\xb8\xe0\xb1\x8d\xe0\xb0\x9f\xe0\xb1\x81\0" + "\xe0\xb0\xb8\xe0\xb1\x86\xe0\xb0\xaa\xe0\xb1\x8d\xe0\xb0\x9f\xe0\xb1\x86\xe0\xb0\x82\xe0\xb0\xac\xe0\xb0\xb0\xe0\xb1\x8d\0" + "\xe0\xb0\x85\xe0\xb0\x95\xe0\xb1\x8d\xe0\xb0\x9f\xe0\xb1\x8b\xe0\xb0\xac\xe0\xb0\xb0\xe0\xb1\x8d\0" + "\xe0\xb0\xa8\xe0\xb0\xb5\xe0\xb0\x82\xe0\xb0\xac\xe0\xb0\xb0\xe0\xb1\x8d\0" + "\xe0\xb0\xa1\xe0\xb0\xbf\xe0\xb0\xb8\xe0\xb1\x86\xe0\xb0\x82\xe0\xb0\xac\xe0\xb0\xb0\xe0\xb1\x8d\0" + "\xe0\xb0\x9c\xe0\xb0\xa8\0" + "\xe0\xb0\xab\xe0\xb0\xbf\xe0\xb0\xac\xe0\xb1\x8d\xe0\xb0\xb0\0" + "\xe0\xb0\x8f\xe0\xb0\xaa\xe0\xb1\x8d\xe0\xb0\xb0\xe0\xb0\xbf\0" + "\xe0\xb0\xb8\xe0\xb1\x86\xe0\xb0\xaa\xe0\xb1\x8d\xe0\xb0\x9f\xe0\xb1\x86\xe0\xb0\x82\0" + "\xe0\xb0\x85\xe0\xb0\x95\xe0\xb1\x8d\xe0\xb0\x9f\xe0\xb1\x8b\0" + "\xe0\xb0\xa8\xe0\xb0\xb5\xe0\xb0\x82\0" + "\xe0\xb0\xa1\xe0\xb0\xbf\xe0\xb0\xb8\xe0\xb1\x86\xe0\xb0\x82\0" + "\xe0\xb2\xad\xe0\xb2\xbe\xe0\xb2\xa8\xe0\xb3\x81\xe0\xb2\xb5\xe0\xb2\xbe\xe0\xb2\xb0\0" + "\xe0\xb2\xb8\xe0\xb3\x8b\xe0\xb2\xae\xe0\xb2\xb5\xe0\xb2\xbe\xe0\xb2\xb0\0" + "\xe0\xb2\xae\xe0\xb2\x82\xe0\xb2\x97\xe0\xb2\xb3\xe0\xb2\xb5\xe0\xb2\xbe\xe0\xb2\xb0\0" + "\xe0\xb2\xac\xe0\xb3\x81\xe0\xb2\xa7\xe0\xb2\xb5\xe0\xb2\xbe\xe0\xb2\xb0\0" + "\xe0\xb2\x97\xe0\xb3\x81\xe0\xb2\xb0\xe0\xb3\x81\xe0\xb2\xb5\xe0\xb2\xbe\xe0\xb2\xb0\0" + "\xe0\xb2\xb6\xe0\xb3\x81\xe0\xb2\x95\xe0\xb3\x8d\xe0\xb2\xb0\xe0\xb2\xb5\xe0\xb2\xbe\xe0\xb2\xb0\0" + "\xe0\xb2\xb6\xe0\xb2\xa8\xe0\xb2\xbf\xe0\xb2\xb5\xe0\xb2\xbe\xe0\xb2\xb0\0" + "\xe0\xb2\xad\xe0\xb2\xbe\xe0\xb2\xa8\xe0\xb3\x81\0" + "\xe0\xb2\xb8\xe0\xb3\x8b\xe0\xb2\xae\0" + "\xe0\xb2\xae\xe0\xb2\x82\xe0\xb2\x97\xe0\xb2\xb3\0" + "\xe0\xb2\xac\xe0\xb3\x81\xe0\xb2\xa7\0" + "\xe0\xb2\x97\xe0\xb3\x81\xe0\xb2\xb0\xe0\xb3\x81\0" + "\xe0\xb2\xb6\xe0\xb3\x81\xe0\xb2\x95\xe0\xb3\x8d\xe0\xb2\xb0\0" + "\xe0\xb2\xb6\xe0\xb2\xa8\xe0\xb2\xbf\0" + "\xe0\xb2\xad\xe0\xb2\xbe\0" + "\xe0\xb2\xb8\xe0\xb3\x8b\0" + "\xe0\xb2\xae\xe0\xb2\x82\0" + "\xe0\xb2\xac\xe0\xb3\x81\0" + "\xe0\xb2\x97\xe0\xb3\x81\0" + "\xe0\xb2\xb6\xe0\xb3\x81\0" + "\xe0\xb2\xb6\0" + "\xe0\xb2\x9c\xe0\xb2\xa8\xe0\xb2\xb5\xe0\xb2\xb0\xe0\xb2\xbf\0" + "\xe0\xb2\xab\xe0\xb3\x86\xe0\xb2\xac\xe0\xb3\x8d\xe0\xb2\xb0\xe0\xb2\xb5\xe0\xb2\xb0\xe0\xb2\xbf\0" + "\xe0\xb2\xae\xe0\xb2\xbe\xe0\xb2\xb0\xe0\xb3\x8d\xe0\xb2\x9a\xe0\xb3\x8d\0" + "\xe0\xb2\x8f\xe0\xb2\xaa\xe0\xb3\x8d\xe0\xb2\xb0\xe0\xb2\xbf\xe0\xb2\xb2\xe0\xb3\x8d\0" + "\xe0\xb2\xae\xe0\xb3\x87\0" + "\xe0\xb2\x9c\xe0\xb3\x82\xe0\xb2\xa8\xe0\xb3\x8d\0" + "\xe0\xb2\x9c\xe0\xb3\x81\xe0\xb2\xb2\xe0\xb3\x88\0" + "\xe0\xb2\x86\xe0\xb2\x97\xe0\xb2\xb8\xe0\xb3\x8d\xe0\xb2\x9f\xe0\xb3\x8d\0" + "\xe0\xb2\xb8\xe0\xb3\x86\xe0\xb2\xaa\xe0\xb3\x8d\xe0\xb2\x9f\xe0\xb3\x86\xe0\xb2\x82\xe0\xb2\xac\xe0\xb2\xb0\xe0\xb3\x8d\0" + "\xe0\xb2\x85\xe0\xb2\x95\xe0\xb3\x8d\xe0\xb2\x9f\xe0\xb3\x8b\xe0\xb2\xac\xe0\xb2\xb0\xe0\xb3\x8d\0" + "\xe0\xb2\xa8\xe0\xb2\xb5\xe0\xb3\x86\xe0\xb2\x82\xe0\xb2\xac\xe0\xb2\xb0\xe0\xb3\x8d\0" + "\xe0\xb2\xa1\xe0\xb2\xbf\xe0\xb2\xb8\xe0\xb3\x86\xe0\xb2\x82\xe0\xb2\xac\xe0\xb2\xb0\xe0\xb3\x8d\0" + "\xe0\xb2\x9c\xe0\xb2\xa8\0" + "\xe0\xb2\xab\xe0\xb3\x86\xe0\xb2\xac\xe0\xb3\x8d\xe0\xb2\xb0\0" + "\xe0\xb2\x8f\xe0\xb2\xaa\xe0\xb3\x8d\xe0\xb2\xb0\xe0\xb2\xbf\0" + "\xe0\xb2\x86\xe0\xb2\x97\0" + "\xe0\xb2\xb8\xe0\xb3\x86\xe0\xb2\xaa\xe0\xb3\x8d\xe0\xb2\x9f\xe0\xb3\x86\xe0\xb2\x82\0" + "\xe0\xb2\x85\xe0\xb2\x95\xe0\xb3\x8d\xe0\xb2\x9f\xe0\xb3\x8b\0" + "\xe0\xb2\xa8\xe0\xb2\xb5\xe0\xb3\x86\xe0\xb2\x82\0" + "\xe0\xb2\xa1\xe0\xb2\xbf\xe0\xb2\xb8\xe0\xb3\x86\xe0\xb2\x82\0" + "\xe0\xb4\x9e\xe0\xb4\xbe\xe0\xb4\xaf\xe0\xb4\xb1\xe0\xb4\xbe\xe0\xb4\xb4\xe0\xb5\x8d\xe2\x80\x8c\xe0\xb4\x9a\0" + "\xe0\xb4\xa4\xe0\xb4\xbf\xe0\xb4\x99\xe0\xb5\x8d\xe0\xb4\x95\xe0\xb4\xb3\xe0\xb4\xbe\xe0\xb4\xb4\xe0\xb5\x8d\xe2\x80\x8c\xe0\xb4\x9a\0" + "\xe0\xb4\x9a\xe0\xb5\x8a\xe0\xb4\xb5\xe0\xb5\x8d\xe0\xb4\xb5\xe0\xb4\xbe\xe0\xb4\xb4\xe0\xb5\x8d\xe0\xb4\x9a\0" + "\xe0\xb4\xac\xe0\xb5\x81\xe0\xb4\xa7\xe0\xb4\xa8\xe0\xb4\xbe\xe0\xb4\xb4\xe0\xb5\x8d\xe2\x80\x8c\xe0\xb4\x9a\0" + "\xe0\xb4\xb5\xe0\xb5\x8d\xe0\xb4\xaf\xe0\xb4\xbe\xe0\xb4\xb4\xe0\xb4\xbe\xe0\xb4\xb4\xe0\xb5\x8d\xe2\x80\x8c\xe0\xb4\x9a\0" + "\xe0\xb4\xb5\xe0\xb5\x86\xe0\xb4\xb3\xe0\xb5\x8d\xe0\xb4\xb3\xe0\xb4\xbf\xe0\xb4\xaf\xe0\xb4\xbe\xe0\xb4\xb4\xe0\xb5\x8d\xe2\x80\x8c\xe0\xb4\x9a\0" + "\xe0\xb4\xb6\xe0\xb4\xa8\xe0\xb4\xbf\xe0\xb4\xaf\xe0\xb4\xbe\xe0\xb4\xb4\xe0\xb5\x8d\xe2\x80\x8c\xe0\xb4\x9a\0" + "\xe0\xb4\x9e\xe0\xb4\xbe\xe0\xb4\xaf\xe0\xb5\xbc\0" + "\xe0\xb4\xa4\xe0\xb4\xbf\xe0\xb4\x99\xe0\xb5\x8d\xe0\xb4\x95\xe0\xb5\xbe\0" + "\xe0\xb4\x9a\xe0\xb5\x8a\xe0\xb4\xb5\xe0\xb5\x8d\xe0\xb4\xb5\0" + "\xe0\xb4\xac\xe0\xb5\x81\xe0\xb4\xa7\xe0\xb5\xbb\0" + "\xe0\xb4\xb5\xe0\xb5\x8d\xe0\xb4\xaf\xe0\xb4\xbe\xe0\xb4\xb4\xe0\xb4\x82\0" + "\xe0\xb4\xb5\xe0\xb5\x86\xe0\xb4\xb3\xe0\xb5\x8d\xe0\xb4\xb3\xe0\xb4\xbf\0" + "\xe0\xb4\xb6\xe0\xb4\xa8\xe0\xb4\xbf\0" + "\xe0\xb4\x9e\xe0\xb4\xbe\0" + "\xe0\xb4\xa4\xe0\xb4\xbf\0" + "\xe0\xb4\x9a\xe0\xb5\x8a\0" + "\xe0\xb4\xac\xe0\xb5\x81\0" + "\xe0\xb4\xb5\xe0\xb5\x8d\xe0\xb4\xaf\xe0\xb4\xbe\0" + "\xe0\xb4\xb5\xe0\xb5\x86\0" + "\xe0\xb4\xb6\0" + "\xe0\xb4\x9c\xe0\xb4\xa8\xe0\xb5\x81\xe0\xb4\xb5\xe0\xb4\xb0\xe0\xb4\xbf\0" + "\xe0\xb4\xab\xe0\xb5\x86\xe0\xb4\xac\xe0\xb5\x8d\xe0\xb4\xb0\xe0\xb5\x81\xe0\xb4\xb5\xe0\xb4\xb0\xe0\xb4\xbf\0" + "\xe0\xb4\xae\xe0\xb4\xbe\xe0\xb5\xbc\xe0\xb4\x9a\xe0\xb5\x8d\xe0\xb4\x9a\xe0\xb5\x8d\0" + "\xe0\xb4\x8f\xe0\xb4\xaa\xe0\xb5\x8d\xe0\xb4\xb0\xe0\xb4\xbf\xe0\xb5\xbd\0" + "\xe0\xb4\xae\xe0\xb5\x87\xe0\xb4\xaf\xe0\xb5\x8d\0" + "\xe0\xb4\x9c\xe0\xb5\x82\xe0\xb5\xba\0" + "\xe0\xb4\x9c\xe0\xb5\x82\xe0\xb4\xb2\xe0\xb5\x88\0" + "\xe0\xb4\x93\xe0\xb4\x97\xe0\xb4\xb8\xe0\xb5\x8d\xe0\xb4\xb1\xe0\xb5\x8d\xe0\xb4\xb1\xe0\xb5\x8d\0" + "\xe0\xb4\xb8\xe0\xb5\x86\xe0\xb4\xaa\xe0\xb5\x8d\xe0\xb4\xb1\xe0\xb5\x8d\xe0\xb4\xb1\xe0\xb4\x82\xe0\xb4\xac\xe0\xb5\xbc\0" + "\xe0\xb4\x92\xe0\xb4\x95\xe0\xb5\x8d\xe2\x80\x8c\xe0\xb4\x9f\xe0\xb5\x8b\xe0\xb4\xac\xe0\xb5\xbc\0" + "\xe0\xb4\xa8\xe0\xb4\xb5\xe0\xb4\x82\xe0\xb4\xac\xe0\xb5\xbc\0" + "\xe0\xb4\xa1\xe0\xb4\xbf\xe0\xb4\xb8\xe0\xb4\x82\xe0\xb4\xac\xe0\xb5\xbc\0" + "\xe0\xb4\x9c\xe0\xb4\xa8\xe0\xb5\x81\0" + "\xe0\xb4\xab\xe0\xb5\x86\xe0\xb4\xac\xe0\xb5\x8d\xe0\xb4\xb0\xe0\xb5\x81\0" + "\xe0\xb4\xae\xe0\xb4\xbe\xe0\xb5\xbc\0" + "\xe0\xb4\x8f\xe0\xb4\xaa\xe0\xb5\x8d\xe0\xb4\xb0\xe0\xb4\xbf\0" + "\xe0\xb4\x93\xe0\xb4\x97\0" + "\xe0\xb4\xb8\xe0\xb5\x86\xe0\xb4\xaa\xe0\xb5\x8d\xe0\xb4\xb1\xe0\xb5\x8d\xe0\xb4\xb1\xe0\xb4\x82\0" + "\xe0\xb4\x92\xe0\xb4\x95\xe0\xb5\x8d\xe0\xb4\x9f\xe0\xb5\x8b\0" + "\xe0\xb4\xa8\xe0\xb4\xb5\xe0\xb4\x82\0" + "\xe0\xb4\xa1\xe0\xb4\xbf\xe0\xb4\xb8\xe0\xb4\x82\0" + "\xe0\xa6\xa6\xe0\xa7\x87\xe0\xa6\x93\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa7\xb0\0" + "\xe0\xa6\xb8\xe0\xa7\x8b\xe0\xa6\xae\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa7\xb0\0" + "\xe0\xa6\xae\xe0\xa6\x99\xe0\xa7\x8d\xe0\xa6\x97\xe0\xa6\xb2\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa7\xb0\0" + "\xe0\xa6\xac\xe0\xa7\x81\xe0\xa6\xa7\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa7\xb0\0" + "\xe0\xa6\xac\xe0\xa7\x83\xe0\xa6\xb9\xe0\xa6\xb7\xe0\xa7\x8d\xe0\xa6\xaa\xe0\xa6\xa4\xe0\xa6\xbf\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa7\xb0\0" + "\xe0\xa6\xb6\xe0\xa7\x81\xe0\xa6\x95\xe0\xa7\x8d\xe0\xa7\xb0\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa7\xb0\0" + "\xe0\xa6\xb6\xe0\xa6\xa8\xe0\xa6\xbf\xe0\xa6\xac\xe0\xa6\xbe\xe0\xa7\xb0\0" + "\xe0\xa7\xb0\xe0\xa6\xac\xe0\xa6\xbf\0" + "\xe0\xa6\xac\xe0\xa7\x83\xe0\xa6\xb9\xe0\xa6\xb7\xe0\xa7\x8d\xe0\xa6\xaa\xe0\xa6\xa4\xe0\xa6\xbf\0" + "\xe0\xa6\xb6\xe0\xa7\x81\xe0\xa6\x95\xe0\xa7\x8d\xe0\xa7\xb0\0" + "\xe0\xa6\x9c\xe0\xa6\xbe\xe0\xa6\xa8\xe0\xa7\x81\xe0\xa7\xb1\xe0\xa6\xbe\xe0\xa7\xb0\xe0\xa7\x80\0" + "\xe0\xa6\xab\xe0\xa7\x87\xe0\xa6\xac\xe0\xa7\x8d\xe0\xa7\xb0\xe0\xa7\x81\xe0\xa7\xb1\xe0\xa6\xbe\xe0\xa7\xb0\xe0\xa7\x80\0" + "\xe0\xa6\xae\xe0\xa6\xbe\xe0\xa7\xb0\xe0\xa7\x8d\xe0\xa6\x9a\0" + "\xe0\xa6\x8f\xe0\xa6\xaa\xe0\xa7\x8d\xe0\xa7\xb0\xe0\xa6\xbf\xe0\xa6\xb2\0" + "\xe0\xa6\x86\xe0\xa6\x97\xe0\xa6\xb7\xe0\xa7\x8d\xe0\xa6\x9f\0" + "\xe0\xa6\x9b\xe0\xa7\x87\xe0\xa6\xaa\xe0\xa7\x8d\xe0\xa6\xa4\xe0\xa7\x87\xe0\xa6\xae\xe0\xa7\x8d\xe0\xa6\xac\xe0\xa7\xb0\0" + "\xe0\xa6\x85\xe0\xa6\x95\xe0\xa7\x8d\xe0\xa6\x9f\xe0\xa7\x8b\xe0\xa6\xac\xe0\xa7\xb0\0" + "\xe0\xa6\xa8\xe0\xa7\xb1\xe0\xa7\x87\xe0\xa6\xae\xe0\xa7\x8d\xe0\xa6\xac\xe0\xa7\xb0\0" + "\xe0\xa6\xa1\xe0\xa6\xbf\xe0\xa6\x9a\xe0\xa7\x87\xe0\xa6\xae\xe0\xa7\x8d\xe0\xa6\xac\xe0\xa7\xb0\0" + "\xe0\xa6\x9c\xe0\xa6\xbe\xe0\xa6\xa8\xe0\xa7\x81\0" + "\xe0\xa6\xab\xe0\xa7\x87\xe0\xa6\xac\xe0\xa7\x8d\xe0\xa7\xb0\xe0\xa7\x81\0" + "\xe0\xa6\x86\xe0\xa6\x97\0" + "\xe0\xa6\xb8\xe0\xa7\x87\xe0\xa6\xaa\xe0\xa7\x8d\xe0\xa6\x9f\0" + "\xe0\xa6\x85\xe0\xa6\x95\xe0\xa7\x8d\xe0\xa6\x9f\xe0\xa7\x8b\0" + "\xe0\xa6\xa8\xe0\xa6\xad\xe0\xa7\x87\0" + "\xe0\xa6\xa1\xe0\xa6\xbf\xe0\xa6\xb8\xe0\xa7\x87\0" + "\xe0\xa4\xae\xe0\xa4\x82\xe0\xa4\x97\xe0\xa4\xb3\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\xb0\0" + "\xe0\xa4\xae\xe0\xa4\x82\xe0\xa4\x97\xe0\xa4\xb3\0" + "\xe0\xa4\x9c\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa5\x87\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa5\x80\0" + "\xe0\xa4\xab\xe0\xa5\x87\xe0\xa4\xac\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa5\x81\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\xb0\xe0\xa5\x80\0" + "\xe0\xa4\x8f\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xbf\xe0\xa4\xb2\0" + "\xe0\xa4\xae\xe0\xa5\x87\0" + "\xe0\xa4\x9c\xe0\xa5\x81\xe0\xa4\xb2\xe0\xa5\x88\0" + "\xe0\xa4\x91\xe0\xa4\x97\xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\x9f\0" + "\xe0\xa4\xb8\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\x9f\xe0\xa5\x87\xe0\xa4\x82\xe0\xa4\xac\xe0\xa4\xb0\0" + "\xe0\xa4\x91\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\x9f\xe0\xa5\x8b\xe0\xa4\xac\xe0\xa4\xb0\0" + "\xe0\xa4\xa8\xe0\xa5\x8b\xe0\xa4\xb5\xe0\xa5\x8d\xe0\xa4\xb9\xe0\xa5\x87\xe0\xa4\x82\xe0\xa4\xac\xe0\xa4\xb0\0" + "\xe0\xa4\xa1\xe0\xa4\xbf\xe0\xa4\xb8\xe0\xa5\x87\xe0\xa4\x82\xe0\xa4\xac\xe0\xa4\xb0\0" + "\xe0\xa4\x9c\xe0\xa4\xbe\xe0\xa4\xa8\xe0\xa5\x87\0" + "\xe0\xa4\xab\xe0\xa5\x87\xe0\xa4\xac\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa5\x81\0" + "\xe0\xa4\x8f\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xbf\0" + "\xe0\xa4\x91\xe0\xa4\x97\0" + "\xe0\xa4\xb8\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\x9f\xe0\xa5\x87\xe0\xa4\x82\0" + "\xe0\xa4\x91\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\x9f\xe0\xa5\x8b\0" + "\xe0\xa4\xa8\xe0\xa5\x8b\xe0\xa4\xb5\xe0\xa5\x8d\xe0\xa4\xb9\xe0\xa5\x87\xe0\xa4\x82\0" + "\xe0\xa4\xa1\xe0\xa4\xbf\xe0\xa4\xb8\xe0\xa5\x87\xe0\xa4\x82\0" + "\xd0\xbd\xd1\x8f\xd0\xbc\0" + "\xd0\xb4\xd0\xb0\xd0\xb2\xd0\xb0\xd0\xb0\0" + "\xd0\xbc\xd1\x8f\xd0\xb3\xd0\xbc\xd0\xb0\xd1\x80\0" + "\xd0\xbb\xd1\x85\xd0\xb0\xd0\xb3\xd0\xb2\xd0\xb0\0" + "\xd0\xbf\xd2\xaf\xd1\x80\xd1\x8d\xd0\xb2\0" + "\xd0\xb1\xd0\xb0\xd0\xb0\xd1\x81\xd0\xb0\xd0\xbd\0" + "\xd0\xb1\xd1\x8f\xd0\xbc\xd0\xb1\xd0\xb0\0" + "\xd0\x9d\xd1\x8f\0" + "\xd0\x94\xd0\xb0\0" + "\xd0\x9c\xd1\x8f\0" + "\xd0\x9b\xd1\x85\0" + "\xd0\x9f\xd2\xaf\0" + "\xd0\x91\xd0\xb0\0" + "\xd0\x91\xd1\x8f\0" + "\xd0\x9d\xd1\x8d\xd0\xb3\xd0\xb4\xd2\xaf\xd0\xb3\xd1\x8d\xd1\x8d\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "\xd0\xa5\xd0\xbe\xd1\x91\xd1\x80\xd0\xb4\xd1\x83\xd0\xb3\xd0\xb0\xd0\xb0\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "\xd0\x93\xd1\x83\xd1\x80\xd0\xb0\xd0\xb2\xd0\xb4\xd1\x83\xd0\xb3\xd0\xb0\xd0\xb0\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "\xd0\x94\xd3\xa9\xd1\x80\xd3\xa9\xd0\xb2\xd0\xb4\xd2\xaf\xd0\xb3\xd1\x8d\xd1\x8d\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "\xd0\xa2\xd0\xb0\xd0\xb2\xd0\xb4\xd1\x83\xd0\xb3\xd0\xb0\xd0\xb0\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "\xd0\x97\xd1\x83\xd1\x80\xd0\xb3\xd0\xb0\xd0\xb4\xd1\x83\xd0\xb3\xd0\xb0\xd0\xb0\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "\xd0\x94\xd0\xbe\xd0\xbb\xd0\xb4\xd1\x83\xd0\xb3\xd0\xb0\xd0\xb0\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "\xd0\x9d\xd0\xb0\xd0\xb9\xd0\xbc\xd0\xb4\xd1\x83\xd0\xb3\xd0\xb0\xd0\xb0\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "\xd0\x95\xd1\x81\xd0\xb4\xd2\xaf\xd0\xb3\xd1\x8d\xd1\x8d\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "\xd0\x90\xd1\x80\xd0\xb0\xd0\xb2\xd0\xb4\xd1\x83\xd0\xb3\xd0\xb0\xd0\xb0\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "\xd0\x90\xd1\x80\xd0\xb2\xd0\xb0\xd0\xbd \xd0\xbd\xd1\x8d\xd0\xb3\xd0\xb4\xd2\xaf\xd0\xb3\xd1\x8d\xd1\x8d\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "\xd0\x90\xd1\x80\xd0\xb2\xd0\xb0\xd0\xbd \xd1\x85\xd0\xbe\xd1\x91\xd1\x80\xd0\xb4\xd1\x83\xd0\xb3\xd0\xb0\xd0\xb0\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "1-\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "2-\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "3-\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "4-\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "5-\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "6-\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "7-\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "8-\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "9-\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "10-\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "11-\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "12-\xd1\x80 \xd1\x81\xd0\xb0\xd1\x80\0" + "\xe0\xbd\x82\xe0\xbd\x9f\xe0\xbd\xa0\xe0\xbc\x8b\xe0\xbd\x89\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x98\xe0\xbc\x8b\0" + "\xe0\xbd\x82\xe0\xbd\x9f\xe0\xbd\xa0\xe0\xbc\x8b\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\0" + "\xe0\xbd\x82\xe0\xbd\x9f\xe0\xbd\xa0\xe0\xbc\x8b\xe0\xbd\x98\xe0\xbd\xb2\xe0\xbd\x82\xe0\xbc\x8b\xe0\xbd\x91\xe0\xbd\x98\xe0\xbd\xa2\xe0\xbc\x8b\0" + "\xe0\xbd\x82\xe0\xbd\x9f\xe0\xbd\xa0\xe0\xbc\x8b\xe0\xbd\xa3\xe0\xbe\xb7\xe0\xbd\x82\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbc\x8b\0" + "\xe0\xbd\x82\xe0\xbd\x9f\xe0\xbd\xa0\xe0\xbc\x8b\xe0\xbd\x95\xe0\xbd\xb4\xe0\xbd\xa2\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbd\xb4\xe0\xbc\x8b\0" + "\xe0\xbd\x82\xe0\xbd\x9f\xe0\xbd\xa0\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbc\x8b\xe0\xbd\xa6\xe0\xbd\x84\xe0\xbd\xa6\xe0\xbc\x8b\0" + "\xe0\xbd\x82\xe0\xbd\x9f\xe0\xbd\xa0\xe0\xbc\x8b\xe0\xbd\xa6\xe0\xbe\xa4\xe0\xbd\xba\xe0\xbd\x93\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbc\x8b\0" + "\xe0\xbd\x89\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x98\xe0\xbc\x8b\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\0" + "\xe0\xbd\x98\xe0\xbd\xb2\xe0\xbd\x82\xe0\xbc\x8b\xe0\xbd\x91\xe0\xbd\x98\xe0\xbd\xa2\xe0\xbc\x8b\0" + "\xe0\xbd\xa3\xe0\xbe\xb7\xe0\xbd\x82\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbc\x8b\0" + "\xe0\xbd\x95\xe0\xbd\xb4\xe0\xbd\xa2\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbd\xb4\xe0\xbc\x8b\0" + "\xe0\xbd\x94\xe0\xbc\x8b\xe0\xbd\xa6\xe0\xbd\x84\xe0\xbd\xa6\xe0\xbc\x8b\0" + "\xe0\xbd\xa6\xe0\xbe\xa4\xe0\xbd\xba\xe0\xbd\x93\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbc\x8b\0" + "\xe0\xbd\x89\xe0\xbd\xb2\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\0" + "\xe0\xbd\x98\xe0\xbd\xb2\xe0\xbd\x82\0" + "\xe0\xbd\xa3\xe0\xbe\xb7\xe0\xbd\x82\0" + "\xe0\xbd\x95\xe0\xbd\xb4\xe0\xbd\xa2\0" + "\xe0\xbd\xa6\xe0\xbd\x84\xe0\xbd\xa6\0" + "\xe0\xbd\xa6\xe0\xbe\xa4\xe0\xbd\xba\xe0\xbd\x93\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x91\xe0\xbd\x84\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbd\xbc\xe0\xbc\x8b\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x82\xe0\xbd\x89\xe0\xbd\xb2\xe0\xbd\xa6\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbc\x8b\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x82\xe0\xbd\xa6\xe0\xbd\xb4\xe0\xbd\x98\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbc\x8b\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbd\x9e\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbc\x8b\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\xa3\xe0\xbe\x94\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbc\x8b\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x91\xe0\xbe\xb2\xe0\xbd\xb4\xe0\xbd\x82\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbc\x8b\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbd\x91\xe0\xbd\xb4\xe0\xbd\x93\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbc\x8b\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbd\xa2\xe0\xbe\x92\xe0\xbe\xb1\xe0\xbd\x91\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbc\x8b\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x91\xe0\xbd\x82\xe0\xbd\xb4\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbc\x8b\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbd\x85\xe0\xbd\xb4\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbc\x8b\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbd\x85\xe0\xbd\xb4\xe0\xbc\x8b\xe0\xbd\x82\xe0\xbd\x85\xe0\xbd\xb2\xe0\xbd\x82\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbc\x8b\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbd\x85\xe0\xbd\xb4\xe0\xbc\x8b\xe0\xbd\x82\xe0\xbd\x89\xe0\xbd\xb2\xe0\xbd\xa6\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbc\x8b\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x91\xe0\xbd\x84\xe0\xbc\x8b\xe0\xbd\x94\xe0\xbd\xbc\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x82\xe0\xbd\x89\xe0\xbd\xb2\xe0\xbd\xa6\xe0\xbc\x8b\xe0\xbd\x94\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x82\xe0\xbd\xa6\xe0\xbd\xb4\xe0\xbd\x98\xe0\xbc\x8b\xe0\xbd\x94\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbd\x9e\xe0\xbd\xb2\xe0\xbc\x8b\xe0\xbd\x94\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\xa3\xe0\xbe\x94\xe0\xbc\x8b\xe0\xbd\x94\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x91\xe0\xbe\xb2\xe0\xbd\xb4\xe0\xbd\x82\xe0\xbc\x8b\xe0\xbd\x94\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbd\x91\xe0\xbd\xb4\xe0\xbd\x93\xe0\xbc\x8b\xe0\xbd\x94\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbd\xa2\xe0\xbe\x92\xe0\xbe\xb1\xe0\xbd\x91\xe0\xbc\x8b\xe0\xbd\x94\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x91\xe0\xbd\x82\xe0\xbd\xb4\xe0\xbc\x8b\xe0\xbd\x94\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbd\x85\xe0\xbd\xb4\xe0\xbc\x8b\xe0\xbd\x94\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbd\x85\xe0\xbd\xb4\xe0\xbc\x8b\xe0\xbd\x82\xe0\xbd\x85\xe0\xbd\xb2\xe0\xbd\x82\xe0\xbc\x8b\xe0\xbd\x94\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbc\x8b\xe0\xbd\x96\xe0\xbd\x85\xe0\xbd\xb4\xe0\xbc\x8b\xe0\xbd\x82\xe0\xbd\x89\xe0\xbd\xb2\xe0\xbd\xa6\xe0\xbc\x8b\xe0\xbd\x94\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbc\xa1\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbc\xa2\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbc\xa3\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbc\xa4\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbc\xa5\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbc\xa6\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbc\xa7\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbc\xa8\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbc\xa9\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbc\xa1\xe0\xbc\xa0\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbc\xa1\xe0\xbc\xa1\0" + "\xe0\xbd\x9f\xe0\xbe\xb3\xe0\xbc\x8b\xe0\xbc\xa1\xe0\xbc\xa2\0" + "Dydd Sul\0" + "Dydd Llun\0" + "Dydd Mawrth\0" + "Dydd Mercher\0" + "Dydd Iau\0" + "Dydd Gwener\0" + "Dydd Sadwrn\0" + "Sul\0" + "Llun\0" + "Mer\0" + "Iau\0" + "Gwe\0" + "Sad\0" + "Ll\0" + "Ionawr\0" + "Chwefror\0" + "Mawrth\0" + "Ebrill\0" + "Mehefin\0" + "Gorffennaf\0" + "Awst\0" + "Medi\0" + "Hydref\0" + "Tachwedd\0" + "Rhagfyr\0" + "Ion\0" + "Chw\0" + "Ebr\0" + "Meh\0" + "Gor\0" + "Hyd\0" + "Tach\0" + "Rhag\0" + "\xe1\x9e\xa2\xe1\x9e\xb6\xe1\x9e\x91\xe1\x9e\xb7\xe1\x9e\x8f\xe1\x9f\x92\xe1\x9e\x99\0" + "\xe1\x9e\x85\xe1\x9f\x90\xe1\x9e\x93\xe1\x9f\x92\xe1\x9e\x91\0" + "\xe1\x9e\xa2\xe1\x9e\x84\xe1\x9f\x92\xe1\x9e\x82\xe1\x9e\xb6\xe1\x9e\x9a\0" + "\xe1\x9e\x96\xe1\x9e\xbb\xe1\x9e\x92\0" + "\xe1\x9e\x96\xe1\x9f\x92\xe1\x9e\x9a\xe1\x9e\xa0\xe1\x9e\x9f\xe1\x9f\x92\xe1\x9e\x94\xe1\x9e\x8f\xe1\x9e\xb7\xe1\x9f\x8d\0" + "\xe1\x9e\x9f\xe1\x9e\xbb\xe1\x9e\x80\xe1\x9f\x92\xe1\x9e\x9a\0" + "\xe1\x9e\x9f\xe1\x9f\x85\xe1\x9e\x9a\xe1\x9f\x8d\0" + "\xe1\x9e\xa2\0" + "\xe1\x9e\x85\0" + "\xe1\x9e\x96\0" + "\xe1\x9e\x9f\0" + "\xe1\x9e\x98\xe1\x9e\x80\xe1\x9e\x9a\xe1\x9e\xb6\0" + "\xe1\x9e\x80\xe1\x9e\xbb\xe1\x9e\x98\xe1\x9f\x92\xe1\x9e\x97\xe1\x9f\x88\0" + "\xe1\x9e\x98\xe1\x9e\xb8\xe1\x9e\x93\xe1\x9e\xb6\0" + "\xe1\x9e\x98\xe1\x9f\x81\xe1\x9e\x9f\xe1\x9e\xb6\0" + "\xe1\x9e\xa7\xe1\x9e\x9f\xe1\x9e\x97\xe1\x9e\xb6\0" + "\xe1\x9e\x98\xe1\x9e\xb7\xe1\x9e\x90\xe1\x9e\xbb\xe1\x9e\x93\xe1\x9e\xb6\0" + "\xe1\x9e\x80\xe1\x9e\x80\xe1\x9f\x92\xe1\x9e\x80\xe1\x9e\x8a\xe1\x9e\xb6\0" + "\xe1\x9e\x9f\xe1\x9e\xb8\xe1\x9e\xa0\xe1\x9e\xb6\0" + "\xe1\x9e\x80\xe1\x9e\x89\xe1\x9f\x92\xe1\x9e\x89\xe1\x9e\xb6\0" + "\xe1\x9e\x8f\xe1\x9e\xbb\xe1\x9e\x9b\xe1\x9e\xb6\0" + "\xe1\x9e\x9c\xe1\x9e\xb7\xe1\x9e\x85\xe1\x9f\x92\xe1\x9e\x86\xe1\x9e\xb7\xe1\x9e\x80\xe1\x9e\xb6\0" + "\xe1\x9e\x92\xe1\x9f\x92\xe1\x9e\x93\xe1\x9e\xbc\0" + "\xe0\xba\xa7\xe0\xba\xb1\xe0\xba\x99\xe0\xba\xad\xe0\xba\xb2\xe0\xba\x97\xe0\xba\xb4\xe0\xba\x94\0" + "\xe0\xba\xa7\xe0\xba\xb1\xe0\xba\x99\xe0\xba\x88\xe0\xba\xb1\xe0\xba\x99\0" + "\xe0\xba\xa7\xe0\xba\xb1\xe0\xba\x99\xe0\xba\xad\xe0\xba\xb1\xe0\xba\x87\xe0\xba\x84\xe0\xba\xb2\xe0\xba\x99\0" + "\xe0\xba\xa7\xe0\xba\xb1\xe0\xba\x99\xe0\xba\x9e\xe0\xba\xb8\xe0\xba\x94\0" + "\xe0\xba\xa7\xe0\xba\xb1\xe0\xba\x99\xe0\xba\x9e\xe0\xba\xb0\xe0\xba\xab\xe0\xba\xb1\xe0\xba\x94\0" + "\xe0\xba\xa7\xe0\xba\xb1\xe0\xba\x99\xe0\xba\xaa\xe0\xba\xb8\xe0\xba\x81\0" + "\xe0\xba\xa7\xe0\xba\xb1\xe0\xba\x99\xe0\xbb\x80\xe0\xba\xaa\xe0\xba\xbb\xe0\xba\xb2\0" + "\xe0\xba\xad\xe0\xba\xb2\xe0\xba\x97\xe0\xba\xb4\xe0\xba\x94\0" + "\xe0\xba\x88\xe0\xba\xb1\xe0\xba\x99\0" + "\xe0\xba\xad\xe0\xba\xb1\xe0\xba\x87\xe0\xba\x84\xe0\xba\xb2\xe0\xba\x99\0" + "\xe0\xba\x9e\xe0\xba\xb8\xe0\xba\x94\0" + "\xe0\xba\x9e\xe0\xba\xb0\xe0\xba\xab\xe0\xba\xb1\xe0\xba\x94\0" + "\xe0\xba\xaa\xe0\xba\xb8\xe0\xba\x81\0" + "\xe0\xbb\x80\xe0\xba\xaa\xe0\xba\xbb\xe0\xba\xb2\0" + "\xe0\xba\xad\xe0\xba\xb2\0" + "\xe0\xba\x88\0" + "\xe0\xba\xad\0" + "\xe0\xba\x9e\0" + "\xe0\xba\x9e\xe0\xba\xab\0" + "\xe0\xba\xaa\xe0\xba\xb8\0" + "\xe0\xba\xaa\0" + "\xe0\xba\xa1\xe0\xba\xb1\xe0\xba\x87\xe0\xba\x81\xe0\xba\xad\xe0\xba\x99\0" + "\xe0\xba\x81\xe0\xba\xb8\xe0\xba\xa1\xe0\xba\x9e\xe0\xba\xb2\0" + "\xe0\xba\xa1\xe0\xba\xb5\xe0\xba\x99\xe0\xba\xb2\0" + "\xe0\xbb\x80\xe0\xba\xa1\xe0\xba\xaa\xe0\xba\xb2\0" + "\xe0\xba\x9e\xe0\xba\xb6\xe0\xba\x94\xe0\xba\xaa\xe0\xba\xb0\xe0\xba\x9e\xe0\xba\xb2\0" + "\xe0\xba\xa1\xe0\xba\xb4\xe0\xba\x96\xe0\xba\xb8\xe0\xba\x99\xe0\xba\xb2\0" + "\xe0\xba\x81\xe0\xbb\x8d\xe0\xba\xa5\xe0\xba\xb0\xe0\xba\x81\xe0\xba\xbb\xe0\xba\x94\0" + "\xe0\xba\xaa\xe0\xba\xb4\xe0\xba\x87\xe0\xba\xab\xe0\xba\xb2\0" + "\xe0\xba\x81\xe0\xba\xb1\xe0\xba\x99\xe0\xba\x8d\xe0\xba\xb2\0" + "\xe0\xba\x95\xe0\xba\xb8\xe0\xba\xa5\xe0\xba\xb2\0" + "\xe0\xba\x9e\xe0\xba\xb0\xe0\xba\x88\xe0\xba\xb4\xe0\xba\x81\0" + "\xe0\xba\x97\xe0\xba\xb1\xe0\xba\x99\xe0\xba\xa7\xe0\xba\xb2\0" + "\xe0\xba\xa1.\xe0\xba\x81.\0" + "\xe0\xba\x81.\xe0\xba\x9e.\0" + "\xe0\xba\xa1.\xe0\xba\x99.\0" + "\xe0\xba\xa1.\xe0\xba\xaa.\0" + "\xe0\xba\x9e.\xe0\xba\x9e.\0" + "\xe0\xba\xa1\xe0\xba\xb4.\xe0\xba\x96.\0" + "\xe0\xba\x81.\xe0\xba\xa5.\0" + "\xe0\xba\xaa.\xe0\xba\xab.\0" + "\xe0\xba\x81.\xe0\xba\x8d.\0" + "\xe0\xba\x95.\xe0\xba\xa5.\0" + "\xe0\xba\x9e.\xe0\xba\x88.\0" + "\xe0\xba\x97.\xe0\xba\xa7.\0" + "\xe1\x80\x90\xe1\x80\x94\xe1\x80\x84\xe1\x80\xba\xe1\x80\xb9\xe1\x80\x82\xe1\x80\x94\xe1\x80\xbd\xe1\x80\xb1\0" + "\xe1\x80\x90\xe1\x80\x94\xe1\x80\x84\xe1\x80\xba\xe1\x80\xb9\xe1\x80\x9c\xe1\x80\xac\0" + "\xe1\x80\xa1\xe1\x80\x84\xe1\x80\xba\xe1\x80\xb9\xe1\x80\x82\xe1\x80\xab\0" + "\xe1\x80\x97\xe1\x80\xaf\xe1\x80\x92\xe1\x80\xb9\xe1\x80\x93\xe1\x80\x9f\xe1\x80\xb0\xe1\x80\xb8\0" + "\xe1\x80\x80\xe1\x80\xbc\xe1\x80\xac\xe1\x80\x9e\xe1\x80\x95\xe1\x80\x90\xe1\x80\xb1\xe1\x80\xb8\0" + "\xe1\x80\x9e\xe1\x80\xb1\xe1\x80\xac\xe1\x80\x80\xe1\x80\xbc\xe1\x80\xac\0" + "\xe1\x80\x85\xe1\x80\x94\xe1\x80\xb1\0" + "\xe1\x80\x90\0" + "\xe1\x80\xa1\0" + "\xe1\x80\x97\0" + "\xe1\x80\x80\0" + "\xe1\x80\x9e\0" + "\xe1\x80\x85\0" + "\xe1\x80\x87\xe1\x80\x94\xe1\x80\xba\xe1\x80\x94\xe1\x80\x9d\xe1\x80\xab\xe1\x80\x9b\xe1\x80\xae\0" + "\xe1\x80\x96\xe1\x80\xb1\xe1\x80\x96\xe1\x80\xb1\xe1\x80\xac\xe1\x80\xba\xe1\x80\x9d\xe1\x80\xab\xe1\x80\x9b\xe1\x80\xae\0" + "\xe1\x80\x99\xe1\x80\x90\xe1\x80\xba\0" + "\xe1\x80\xa7\xe1\x80\x95\xe1\x80\xbc\xe1\x80\xae\0" + "\xe1\x80\x99\xe1\x80\xb1\0" + "\xe1\x80\x87\xe1\x80\xbd\xe1\x80\x94\xe1\x80\xba\0" + "\xe1\x80\x87\xe1\x80\xb0\xe1\x80\x9c\xe1\x80\xad\xe1\x80\xaf\xe1\x80\x84\xe1\x80\xba\0" + "\xe1\x80\xa9\xe1\x80\x82\xe1\x80\xaf\xe1\x80\x90\xe1\x80\xba\0" + "\xe1\x80\x85\xe1\x80\x80\xe1\x80\xba\xe1\x80\x90\xe1\x80\x84\xe1\x80\xba\xe1\x80\x98\xe1\x80\xac\0" + "\xe1\x80\xa1\xe1\x80\xb1\xe1\x80\xac\xe1\x80\x80\xe1\x80\xba\xe1\x80\x90\xe1\x80\xad\xe1\x80\xaf\xe1\x80\x98\xe1\x80\xac\0" + "\xe1\x80\x94\xe1\x80\xad\xe1\x80\xaf\xe1\x80\x9d\xe1\x80\x84\xe1\x80\xba\xe1\x80\x98\xe1\x80\xac\0" + "\xe1\x80\x92\xe1\x80\xae\xe1\x80\x87\xe1\x80\x84\xe1\x80\xba\xe1\x80\x98\xe1\x80\xac\0" + "\xe1\x80\x87\xe1\x80\x94\xe1\x80\xba\0" + "\xe1\x80\x96\xe1\x80\xb1\0" + "\xe1\x80\xa7\0" + "\xe1\x80\x87\xe1\x80\xb0\0" + "\xe1\x80\xa9\0" + "\xe1\x80\x85\xe1\x80\x80\xe1\x80\xba\0" + "\xe1\x80\xa1\xe1\x80\xb1\xe1\x80\xac\xe1\x80\x80\xe1\x80\xba\0" + "\xe1\x80\x94\xe1\x80\xad\xe1\x80\xaf\0" + "\xe1\x80\x92\xe1\x80\xae\0" + "luns\0" + "m\xc3\xa9rcores\0" + "xoves\0" + "venres\0" + "Dom.\0" + "Luns\0" + "Mar.\0" + "M\xc3\xa9r.\0" + "Xov.\0" + "Ven.\0" + "S\xc3\xa1\x62.\0" + "Xaneiro\0" + "Febreiro\0" + "Marzo\0" + "Abril\0" + "Maio\0" + "Xu\xc3\xb1o\0" + "Xullo\0" + "Agosto\0" + "Setembro\0" + "Outubro\0" + "Novembro\0" + "Decembro\0" + "xaneiro\0" + "febreiro\0" + "xu\xc3\xb1o\0" + "xullo\0" + "decembro\0" + "Xan.\0" + "Abr.\0" + "Xul.\0" + "Ago.\0" + "Set.\0" + "Out.\0" + "Dec.\0" + "\xe0\xa4\x86\xe0\xa4\xa6\xe0\xa4\xbf\xe0\xa4\xa4\xe0\xa5\x8d\xe0\xa4\xaf\xe0\xa4\xb5\xe0\xa4\xbe\xe0\xa4\xb0\0" + "\xe0\xa4\xae\xe0\xa4\x82\xe0\xa4\x97\xe0\xa4\xb3\xe0\xa4\xbe\xe0\xa4\xb0\0" + "\xe0\xa4\x93\xe0\xa4\x97\xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\x9f\0" + "\xe0\xa4\xb8\xe0\xa5\x87\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\x9f\xe0\xa5\x87\xe0\xa4\x82\xe0\xa4\xac\xe0\xa4\xb0\0" + "\xe0\xa4\x93\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\x9f\xe0\xa5\x8b\xe0\xa4\xac\xe0\xa4\xb0\0" + "\xe0\xb6\x89\xe0\xb6\xbb\xe0\xb7\x92\xe0\xb6\xaf\xe0\xb7\x8f\0" + "\xe0\xb7\x83\xe0\xb6\xb3\xe0\xb7\x94\xe0\xb6\xaf\xe0\xb7\x8f\0" + "\xe0\xb6\x85\xe0\xb6\x9f\xe0\xb7\x84\xe0\xb6\xbb\xe0\xb7\x94\xe0\xb7\x80\xe0\xb7\x8f\xe0\xb6\xaf\xe0\xb7\x8f\0" + "\xe0\xb6\xb6\xe0\xb6\xaf\xe0\xb7\x8f\xe0\xb6\xaf\xe0\xb7\x8f\0" + "\xe0\xb6\xb6\xe0\xb7\x8a\xe2\x80\x8d\xe0\xb6\xbb\xe0\xb7\x84\xe0\xb7\x83\xe0\xb7\x8a\xe0\xb6\xb4\xe0\xb6\xad\xe0\xb7\x92\xe0\xb6\xb1\xe0\xb7\x8a\xe0\xb6\xaf\xe0\xb7\x8f\0" + "\xe0\xb7\x83\xe0\xb7\x92\xe0\xb6\x9a\xe0\xb7\x94\xe0\xb6\xbb\xe0\xb7\x8f\xe0\xb6\xaf\xe0\xb7\x8f\0" + "\xe0\xb7\x83\xe0\xb7\x99\xe0\xb6\xb1\xe0\xb7\x83\xe0\xb7\x94\xe0\xb6\xbb\xe0\xb7\x8f\xe0\xb6\xaf\xe0\xb7\x8f\0" + "\xe0\xb6\x85\xe0\xb6\x9f\xe0\xb7\x84\0" + "\xe0\xb6\xb6\xe0\xb7\x8a\xe2\x80\x8d\xe0\xb6\xbb\xe0\xb7\x84\xe0\xb7\x83\xe0\xb7\x8a\0" + "\xe0\xb7\x83\xe0\xb7\x92\xe0\xb6\x9a\xe0\xb7\x94\0" + "\xe0\xb7\x83\xe0\xb7\x99\xe0\xb6\xb1\0" + "\xe0\xb6\x89\0" + "\xe0\xb7\x83\0" + "\xe0\xb6\x85\0" + "\xe0\xb6\xb6\0" + "\xe0\xb6\xb6\xe0\xb7\x8a\xe2\x80\x8d\xe0\xb6\xbb\0" + "\xe0\xb7\x83\xe0\xb7\x92\0" + "\xe0\xb7\x83\xe0\xb7\x99\0" + "\xe0\xb6\xa2\xe0\xb6\xb1\xe0\xb7\x80\xe0\xb7\x8f\xe0\xb6\xbb\xe0\xb7\x92\0" + "\xe0\xb6\xb4\xe0\xb7\x99\xe0\xb6\xb6\xe0\xb6\xbb\xe0\xb7\x80\xe0\xb7\x8f\xe0\xb6\xbb\xe0\xb7\x92\0" + "\xe0\xb6\xb8\xe0\xb7\x8f\xe0\xb6\xbb\xe0\xb7\x8a\xe0\xb6\xad\xe0\xb7\x94\0" + "\xe0\xb6\x85\xe0\xb6\xb4\xe0\xb7\x8a\xe2\x80\x8d\xe0\xb6\xbb\xe0\xb7\x9a\xe0\xb6\xbd\xe0\xb7\x8a\0" + "\xe0\xb6\xb8\xe0\xb7\x90\xe0\xb6\xba\xe0\xb7\x92\0" + "\xe0\xb6\xa2\xe0\xb7\x96\xe0\xb6\xb1\xe0\xb7\x92\0" + "\xe0\xb6\xa2\xe0\xb7\x96\xe0\xb6\xbd\xe0\xb7\x92\0" + "\xe0\xb6\x85\xe0\xb6\x9c\xe0\xb7\x9d\xe0\xb7\x83\xe0\xb7\x8a\xe0\xb6\xad\xe0\xb7\x94\0" + "\xe0\xb7\x83\xe0\xb7\x90\xe0\xb6\xb4\xe0\xb7\x8a\xe0\xb6\xad\xe0\xb7\x90\xe0\xb6\xb8\xe0\xb7\x8a\xe0\xb6\xb6\xe0\xb6\xbb\xe0\xb7\x8a\0" + "\xe0\xb6\x94\xe0\xb6\x9a\xe0\xb7\x8a\xe0\xb6\xad\xe0\xb7\x9d\xe0\xb6\xb6\xe0\xb6\xbb\xe0\xb7\x8a\0" + "\xe0\xb6\xb1\xe0\xb7\x9c\xe0\xb7\x80\xe0\xb7\x90\xe0\xb6\xb8\xe0\xb7\x8a\xe0\xb6\xb6\xe0\xb6\xbb\xe0\xb7\x8a\0" + "\xe0\xb6\xaf\xe0\xb7\x99\xe0\xb7\x83\xe0\xb7\x90\xe0\xb6\xb8\xe0\xb7\x8a\xe0\xb6\xb6\xe0\xb6\xbb\xe0\xb7\x8a\0" + "\xe0\xb6\xa2\xe0\xb6\xb1\0" + "\xe0\xb6\xb4\xe0\xb7\x99\xe0\xb6\xb6\0" + "\xe0\xb6\xb8\xe0\xb7\x8f\xe0\xb6\xbb\xe0\xb7\x8a\0" + "\xe0\xb6\x85\xe0\xb6\x9c\xe0\xb7\x9d\0" + "\xe0\xb7\x83\xe0\xb7\x90\xe0\xb6\xb4\xe0\xb7\x8a\0" + "\xe0\xb6\x94\xe0\xb6\x9a\xe0\xb7\x8a\0" + "\xe0\xb6\xb1\xe0\xb7\x9c\xe0\xb7\x80\xe0\xb7\x90\0" + "\xe0\xb6\xaf\xe0\xb7\x99\xe0\xb7\x83\xe0\xb7\x90\0" + "\xe1\x8e\xa4\xe1\x8e\xbe\xe1\x8f\x99\xe1\x8f\x93\xe1\x8f\x86\xe1\x8f\x8d\xe1\x8e\xac\0" + "\xe1\x8e\xa4\xe1\x8e\xbe\xe1\x8f\x99\xe1\x8f\x93\xe1\x8f\x89\xe1\x8f\x85\xe1\x8e\xaf\0" + "\xe1\x8f\x94\xe1\x8e\xb5\xe1\x8f\x81\xe1\x8e\xa2\xe1\x8e\xa6\0" + "\xe1\x8f\xa6\xe1\x8e\xa2\xe1\x8f\x81\xe1\x8e\xa2\xe1\x8e\xa6\0" + "\xe1\x8f\x85\xe1\x8e\xa9\xe1\x8f\x81\xe1\x8e\xa2\xe1\x8e\xa6\0" + "\xe1\x8f\xa7\xe1\x8e\xbe\xe1\x8e\xa9\xe1\x8e\xb6\xe1\x8f\x8d\xe1\x8f\x97\0" + "\xe1\x8e\xa4\xe1\x8e\xbe\xe1\x8f\x99\xe1\x8f\x93\xe1\x8f\x88\xe1\x8f\x95\xe1\x8e\xbe\0" + "\xe1\x8f\x86\xe1\x8f\x8d\xe1\x8e\xac\0" + "\xe1\x8f\x89\xe1\x8f\x85\xe1\x8e\xaf\0" + "\xe1\x8f\x94\xe1\x8e\xb5\xe1\x8f\x81\0" + "\xe1\x8f\xa6\xe1\x8e\xa2\xe1\x8f\x81\0" + "\xe1\x8f\x85\xe1\x8e\xa9\xe1\x8f\x81\0" + "\xe1\x8f\xa7\xe1\x8e\xbe\xe1\x8e\xa9\0" + "\xe1\x8f\x88\xe1\x8f\x95\xe1\x8e\xbe\0" + "\xe1\x8f\x86\0" + "\xe1\x8f\x89\0" + "\xe1\x8f\x94\0" + "\xe1\x8f\xa6\0" + "\xe1\x8f\x85\0" + "\xe1\x8f\xa7\0" + "\xe1\x8e\xa4\0" + "\xe1\x8e\xa4\xe1\x8f\x83\xe1\x8e\xb8\xe1\x8f\x94\xe1\x8f\x85\0" + "\xe1\x8e\xa7\xe1\x8e\xa6\xe1\x8e\xb5\0" + "\xe1\x8e\xa0\xe1\x8f\x85\xe1\x8f\xb1\0" + "\xe1\x8e\xa7\xe1\x8f\xac\xe1\x8f\x82\0" + "\xe1\x8e\xa0\xe1\x8f\x82\xe1\x8f\x8d\xe1\x8e\xac\xe1\x8f\x98\0" + "\xe1\x8f\x95\xe1\x8e\xad\xe1\x8e\xb7\xe1\x8f\xb1\0" + "\xe1\x8e\xab\xe1\x8f\xb0\xe1\x8f\x89\xe1\x8f\x82\0" + "\xe1\x8e\xa6\xe1\x8e\xb6\xe1\x8f\x82\0" + "\xe1\x8f\x9a\xe1\x8e\xb5\xe1\x8f\x8d\xe1\x8f\x97\0" + "\xe1\x8f\x9a\xe1\x8f\x82\xe1\x8f\x85\xe1\x8f\x97\0" + "\xe1\x8f\x85\xe1\x8f\x93\xe1\x8f\x95\xe1\x8f\x86\0" + "\xe1\x8e\xa5\xe1\x8f\x8d\xe1\x8e\xa9\xe1\x8f\xb1\0" + "\xe1\x8e\xa4\xe1\x8f\x83\0" + "\xe1\x8e\xa7\xe1\x8e\xa6\0" + "\xe1\x8e\xa0\xe1\x8f\x85\0" + "\xe1\x8e\xa7\xe1\x8f\xac\0" + "\xe1\x8e\xa0\xe1\x8f\x82\0" + "\xe1\x8f\x95\xe1\x8e\xad\0" + "\xe1\x8e\xab\xe1\x8f\xb0\0" + "\xe1\x8e\xa6\xe1\x8e\xb6\0" + "\xe1\x8f\x9a\xe1\x8e\xb5\0" + "\xe1\x8f\x9a\xe1\x8f\x82\0" + "\xe1\x8f\x85\xe1\x8f\x93\0" + "\xe1\x8e\xa5\xe1\x8f\x8d\0" + "\xe1\x8a\xa5\xe1\x88\x91\xe1\x8b\xb5\0" + "\xe1\x88\xb0\xe1\x8a\x9e\0" + "\xe1\x88\x9b\xe1\x8a\xad\xe1\x88\xb0\xe1\x8a\x9e\0" + "\xe1\x88\xa8\xe1\x89\xa1\xe1\x8b\x95\0" + "\xe1\x88\x90\xe1\x88\x99\xe1\x88\xb5\0" + "\xe1\x8b\x93\xe1\x88\xad\xe1\x89\xa5\0" + "\xe1\x89\x85\xe1\x8b\xb3\xe1\x88\x9c\0" + "\xe1\x88\x9b\xe1\x8a\xad\xe1\x88\xb0\0" + "\xe1\x8a\xa5\0" + "\xe1\x88\xb0\0" + "\xe1\x88\x9b\0" + "\xe1\x88\xa8\0" + "\xe1\x88\x90\0" + "\xe1\x8b\x93\0" + "\xe1\x89\x85\0" + "\xe1\x8c\x83\xe1\x8a\x95\xe1\x8b\xa9\xe1\x8b\x88\xe1\x88\xaa\0" + "\xe1\x8d\x8c\xe1\x89\xa5\xe1\x88\xa9\xe1\x8b\x88\xe1\x88\xaa\0" + "\xe1\x88\x9b\xe1\x88\xad\xe1\x89\xbd\0" + "\xe1\x8a\xa4\xe1\x8d\x95\xe1\x88\xaa\xe1\x88\x8d\0" + "\xe1\x88\x9c\xe1\x8b\xad\0" + "\xe1\x8c\x81\xe1\x8a\x95\0" + "\xe1\x8c\x81\xe1\x88\x8b\xe1\x8b\xad\0" + "\xe1\x8a\xa6\xe1\x8c\x88\xe1\x88\xb5\xe1\x89\xb5\0" + "\xe1\x88\xb4\xe1\x8d\x95\xe1\x89\xb4\xe1\x88\x9d\xe1\x89\xa0\xe1\x88\xad\0" + "\xe1\x8a\xa6\xe1\x8a\xad\xe1\x89\xb6\xe1\x89\xa0\xe1\x88\xad\0" + "\xe1\x8a\x96\xe1\x89\xac\xe1\x88\x9d\xe1\x89\xa0\xe1\x88\xad\0" + "\xe1\x8b\xb2\xe1\x88\xb4\xe1\x88\x9d\xe1\x89\xa0\xe1\x88\xad\0" + "\xe1\x8c\x83\xe1\x8a\x95\xe1\x8b\xa9\0" + "\xe1\x8d\x8c\xe1\x89\xa5\xe1\x88\xa9\0" + "\xe1\x8a\xa4\xe1\x8d\x95\xe1\x88\xaa\0" + "\xe1\x8a\xa6\xe1\x8c\x88\xe1\x88\xb5\0" + "\xe1\x88\xb4\xe1\x8d\x95\xe1\x89\xb4\0" + "\xe1\x8a\xa6\xe1\x8a\xad\xe1\x89\xb6\0" + "\xe1\x8a\x96\xe1\x89\xac\xe1\x88\x9d\0" + "\xe1\x8b\xb2\xe1\x88\xb4\xe1\x88\x9d\0" + "Asamas\0" + "Aynas\0" + "Asinas\0" + "Akras\0" + "Akwas\0" + "Asimwas\0" + "Asi\xe1\xb8\x8dyas\0" + "Asa\0" + "Ayn\0" + "Asn\0" + "Akr\0" + "Akw\0" + "Asm\0" + "As\xe1\xb8\x8d\0" + "Yennayer\0" + "Yebrayer\0" + "Ibrir\0" + "Mayyu\0" + "Yunyu\0" + "Yulyuz\0" + "\xc6\x94uct\0" + "Cutanbir\0" + "K\xe1\xb9\xaduber\0" + "Nwanbir\0" + "Dujanbir\0" + "Yen\0" + "Yeb\0" + "Ibr\0" + "Yun\0" + "Yul\0" + "\xc6\x94uc\0" + "Cut\0" + "K\xe1\xb9\xadu\0" + "Nwa\0" + "Duj\0" + "\xe0\xa4\x86\xe0\xa4\x87\xe0\xa4\xa4\xe0\xa4\xac\xe0\xa4\xbe\xe0\xa4\xb0\0" + "\xe0\xa4\xb8\xe0\xa5\x8b\xe0\xa4\xae\xe0\xa4\xac\xe0\xa4\xbe\xe0\xa4\xb0\0" + "\xe0\xa4\xae\xe0\xa4\x99\xe0\xa5\x8d\xe0\xa4\x97\xe0\xa4\xb2\xe0\xa4\xac\xe0\xa4\xbe\xe0\xa4\xb0\0" + "\xe0\xa4\xac\xe0\xa5\x81\xe0\xa4\xa7\xe0\xa4\xac\xe0\xa4\xbe\xe0\xa4\xb0\0" + "\xe0\xa4\xac\xe0\xa4\xbf\xe0\xa4\xb9\xe0\xa4\xbf\xe0\xa4\xac\xe0\xa4\xbe\xe0\xa4\xb0\0" + "\xe0\xa4\xb6\xe0\xa5\x81\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xac\xe0\xa4\xbe\xe0\xa4\xb0\0" + "\xe0\xa4\xb6\xe0\xa4\xa8\xe0\xa4\xbf\xe0\xa4\xac\xe0\xa4\xbe\xe0\xa4\xb0\0" + "\xe0\xa4\x86\xe0\xa4\x87\xe0\xa4\xa4\0" + "\xe0\xa4\xae\xe0\xa4\x99\xe0\xa5\x8d\xe0\xa4\x97\xe0\xa4\xb2\0" + "\xe0\xa4\xac\xe0\xa4\xbf\xe0\xa4\xb9\xe0\xa4\xbf\0" + "\xe0\xa4\x86\0" + "\xe0\xa4\xae\0" + "\xe0\xa4\xac\xe0\xa4\xbf\0" + "\xe0\xa4\xab\xe0\xa5\x87\xe0\xa4\xac\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa5\x81\xe0\xa4\x85\xe0\xa4\xb0\xe0\xa5\x80\0" + "\xe0\xa4\x85\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa4\xbf\xe0\xa4\xb2\0" + "\xe0\xa4\x9c\xe0\xa5\x81\xe0\xa4\xa8\0" + "\xe0\xa4\x85\xe0\xa4\x97\xe0\xa4\xb8\xe0\xa5\x8d\xe0\xa4\x9f\0" + "\xe0\xa4\xb8\xe0\xa5\x87\xe0\xa4\xaa\xe0\xa5\x8d\xe0\xa4\x9f\xe0\xa5\x87\xe0\xa4\xae\xe0\xa5\x8d\xe0\xa4\xac\xe0\xa4\xb0\0" + "\xe0\xa4\x85\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\x9f\xe0\xa5\x8b\xe0\xa4\xac\xe0\xa4\xb0\0" + "\xe0\xa4\xa8\xe0\xa5\x8b\xe0\xa4\xad\xe0\xa5\x87\xe0\xa4\xae\xe0\xa5\x8d\xe0\xa4\xac\xe0\xa4\xb0\0" + "\xe0\xa4\xa1\xe0\xa4\xbf\xe0\xa4\xb8\xe0\xa5\x87\xe0\xa4\xae\xe0\xa5\x8d\xe0\xa4\xac\xe0\xa4\xb0\0" + "snein\0" + "moandei\0" + "tiisdei\0" + "woansdei\0" + "tongersdei\0" + "freed\0" + "sneon\0" + "si\0" + "mo\0" + "fr\0" + "Jannewaris\0" + "Febrewaris\0" + "Maaie\0" + "Juny\0" + "Septimber\0" + "Novimber\0" + "Desimber\0" + "Mrt\0" + "\xd9\x88\xd8\xb1\xdb\x8c\0" + "\xd8\xba\xd9\x88\xdb\x8c\xdb\x8c\0" + "\xd8\xba\xd8\xa8\xd8\xb1\xda\xaf\xd9\x88\xd9\x84\xdb\x8c\0" + "\xda\x86\xd9\x86\xda\xaf\xd8\xa7\xda\x9a\0" + "\xd8\xb2\xd9\x85\xd8\xb1\xdb\x8c\0" + "\xd9\x88\xda\x96\xdb\x8c\0" + "\xd8\xaa\xd9\x84\xd9\x87\0" + "\xd9\x84\xda\x93\xd9\x85\0" + "\xd9\x84\xdb\x8c\xd9\x86\xd8\xaf\xdb\x8d\0" + "\xd9\x85\xd8\xb1\xd8\xba\xd9\x88\xd9\x85\xdb\x8c\0" + "\xd8\xb3\xd9\x84\xd9\x88\xd8\xa7\xd8\xba\xd9\x87\0" + "\xda\xa9\xd8\xa8\0" + "Linggo\0" + "Lunes\0" + "Martes\0" + "Miyerkules\0" + "Huwebes\0" + "Biyernes\0" + "Sabado\0" + "Lin\0" + "Lun\0" + "Miy\0" + "Huw\0" + "Biy\0" + "Enero\0" + "Pebrero\0" + "Marso\0" + "Mayo\0" + "Hunyo\0" + "Hulyo\0" + "Setyembre\0" + "Oktubre\0" + "Nobyembre\0" + "Disyembre\0" + "Ene\0" + "Peb\0" + "Abr\0" + "Hun\0" + "Hul\0" + "Nob\0" + "dewo\0" + "aa\xc9\x93nde\0" + "mawbaare\0" + "njeslaare\0" + "naasaande\0" + "mawnde\0" + "hoore-biir\0" + "dew\0" + "aa\xc9\x93\0" + "maw\0" + "naa\0" + "mwd\0" + "hbi\0" + "d\0" + "a\0" + "m\0" + "h\0" + "siilo\0" + "colte\0" + "mbooy\0" + "see\xc9\x97to\0" + "duujal\0" + "korse\0" + "morso\0" + "juko\0" + "siilto\0" + "yarkomaa\0" + "jolal\0" + "bowte\0" + "sii\0" + "col\0" + "mbo\0" + "see\0" + "duu\0" + "kor\0" + "mor\0" + "juk\0" + "slt\0" + "yar\0" + "jol\0" + "bow\0" + "Lahadi\0" + "Litinin\0" + "Talata\0" + "Laraba\0" + "Alhamis\0" + "Jumma\xca\xbc\x61\0" + "Asabar\0" + "Lah\0" + "Lit\0" + "Tal\0" + "Lar\0" + "Alh\0" + "Janairu\0" + "Faburairu\0" + "Maris\0" + "Afirilu\0" + "Mayu\0" + "Yuni\0" + "Yuli\0" + "Agusta\0" + "Satumba\0" + "Nuwamba\0" + "Disamba\0" + "Fab\0" + "Afi\0" + "Agu\0" + "Nuw\0" + "\xe1\xbb\x8cj\xe1\xbb\x8d\xcc\x81 \xc3\x80\xc3\xack\xc3\xba\0" + "\xe1\xbb\x8cj\xe1\xbb\x8d\xcc\x81 Aj\xc3\xa9\0" + "\xe1\xbb\x8cj\xe1\xbb\x8d\xcc\x81 \xc3\x8cs\xe1\xba\xb9\xcc\x81gun\0" + "\xe1\xbb\x8cj\xe1\xbb\x8d\xcc\x81r\xc3\xba\0" + "\xe1\xbb\x8cj\xe1\xbb\x8d\xcc\x81\x62\xe1\xbb\x8d\0" + "\xe1\xbb\x8cj\xe1\xbb\x8d\xcc\x81 \xe1\xba\xb8t\xc3\xac\0" + "\xe1\xbb\x8cj\xe1\xbb\x8d\xcc\x81 \xc3\x80\x62\xc3\xa1m\xe1\xba\xb9\xcc\x81ta\0" + "\xc3\x80\xc3\xack\xc3\xba\0" + "Aj\xc3\xa9\0" + "\xc3\x8cs\xe1\xba\xb9\xcc\x81gun\0" + "\xe1\xba\xb8t\xc3\xac\0" + "\xc3\x80\x62\xc3\xa1m\xe1\xba\xb9\xcc\x81ta\0" + "O\xe1\xb9\xa3\xc3\xb9 \xe1\xb9\xa2\xe1\xba\xb9\xcc\x81r\xe1\xba\xb9\xcc\x81\0" + "O\xe1\xb9\xa3\xc3\xb9 \xc3\x88r\xc3\xa8l\xc3\xa8\0" + "O\xe1\xb9\xa3\xc3\xb9 \xe1\xba\xb8r\xe1\xba\xb9\xcc\x80n\xc3\xa0\0" + "O\xe1\xb9\xa3\xc3\xb9 \xc3\x8cgb\xc3\xa9\0" + "O\xe1\xb9\xa3\xc3\xb9 \xe1\xba\xb8\xcc\x80\x62ibi\0" + "O\xe1\xb9\xa3\xc3\xb9 \xc3\x92k\xc3\xba\x64u\0" + "O\xe1\xb9\xa3\xc3\xb9 Ag\xe1\xba\xb9m\xe1\xbb\x8d\0" + "O\xe1\xb9\xa3\xc3\xb9 \xc3\x92g\xc3\xban\0" + "O\xe1\xb9\xa3\xc3\xb9 Owewe\0" + "O\xe1\xb9\xa3\xc3\xb9 \xe1\xbb\x8c\xcc\x80w\xc3\xa0r\xc3\xa0\0" + "O\xe1\xb9\xa3\xc3\xb9 B\xc3\xa9l\xc3\xba\0" + "O\xe1\xb9\xa3\xc3\xb9 \xe1\xbb\x8c\xcc\x80p\xe1\xba\xb9\xcc\x80\0" + "\xe1\xb9\xa2\xe1\xba\xb9\xcc\x81r\xe1\xba\xb9\xcc\x81\0" + "\xc3\x88r\xc3\xa8l\xc3\xa8\0" + "\xe1\xba\xb8r\xe1\xba\xb9\xcc\x80n\xc3\xa0\0" + "\xc3\x8cgb\xc3\xa9\0" + "\xe1\xba\xb8\xcc\x80\x62ibi\0" + "\xc3\x92k\xc3\xba\x64u\0" + "Ag\xe1\xba\xb9m\xe1\xbb\x8d\0" + "\xc3\x92g\xc3\xban\0" + "Owewe\0" + "\xe1\xbb\x8c\xcc\x80w\xc3\xa0r\xc3\xa0\0" + "B\xc3\xa9l\xc3\xba\0" + "\xe1\xbb\x8c\xcc\x80p\xe1\xba\xb9\xcc\x80\0" + "Sontaga\0" + "Mosupalogo\0" + "Labohlano\0" + "Mokibelo\0" + "Mok\0" + "Janaware\0" + "Feberware\0" + "Mat\xc5\xa1he\0" + "Aporele\0" + "Julae\0" + "Agostose\0" + "Setemere\0" + "Oktobore\0" + "Nofemere\0" + "Disemere\0" + "Apo\0" + "Nof\0" + "Sonndeg\0" + "M\xc3\xa9indeg\0" + "D\xc3\xabnschdeg\0" + "M\xc3\xabttwoch\0" + "Donneschdeg\0" + "Freideg\0" + "Samschdeg\0" + "M\xc3\xa9i\0" + "D\xc3\xabn\0" + "M\xc3\xabt\0" + "Don\0" + "Fre\0" + "Sam\0" + "M\xc3\xa4\x65rz\0" + "Abr\xc3\xabll\0" + "Mee\0" + "M\xc3\xa4\x65\0" + "sabaat\0" + "ataasinngorneq\0" + "marlunngorneq\0" + "pingasunngorneq\0" + "sisamanngorneq\0" + "tallimanngorneq\0" + "arfininngorneq\0" + "ata\0" + "pin\0" + "sis\0" + "tal\0" + "arf\0" + "martsi\0" + "aprili\0" + "maji\0" + "augustusi\0" + "septemberi\0" + "oktoberi\0" + "novemberi\0" + "decemberi\0" + "Mb\xe1\xbb\x8ds\xe1\xbb\x8b \xe1\xbb\xa4ka\0" + "M\xe1\xbb\x8dnde\0" + "Tiuzdee\0" + "Wenezdee\0" + "T\xe1\xbb\x8d\xe1\xbb\x8dzdee\0" + "Fra\xe1\xbb\x8b\x64\x65\x65\0" + "Sat\xe1\xbb\x8d\x64\x65\x65\0" + "\xe1\xbb\xa4ka\0" + "M\xe1\xbb\x8dn\0" + "Tiu\0" + "Wen\0" + "T\xe1\xbb\x8d\xe1\xbb\x8d\0" + "Fra\xe1\xbb\x8b\0" + "Jen\xe1\xbb\xa5war\xe1\xbb\x8b\0" + "Febr\xe1\xbb\xa5war\xe1\xbb\x8b\0" + "Maach\xe1\xbb\x8b\0" + "Eprel\0" + "Juun\0" + "Jula\xe1\xbb\x8b\0" + "\xe1\xbb\x8cg\xe1\xbb\x8d\xe1\xbb\x8dst\0" + "\xe1\xbb\x8cktoba\0" + "Jen\0" + "Maa\0" + "Juu\0" + "\xe1\xbb\x8cg\xe1\xbb\x8d\0" + "\xe1\xbb\x8ckt\0" + "Dilbata\0" + "Wiixata\0" + "Qibxata\0" + "Roobii\0" + "Kamiisa\0" + "Jimaata\0" + "Sanbata\0" + "Dil\0" + "Wix\0" + "Qib\0" + "Rob\0" + "Jim\0" + "San\0" + "Amajjii\0" + "Guraandhala\0" + "Bitooteessa\0" + "Elba\0" + "Caamsa\0" + "Waxabajjii\0" + "Adooleessa\0" + "Hagayya\0" + "Fuulbana\0" + "Onkololeessa\0" + "Sadaasa\0" + "Muddee\0" + "Ama\0" + "Gur\0" + "Bit\0" + "Elb\0" + "Cam\0" + "Wax\0" + "Ado\0" + "Hag\0" + "Ful\0" + "Onk\0" + "\xe1\x88\xb0\xe1\x8a\x95\xe1\x89\xa0\xe1\x89\xb5\0" + "\xe1\x88\xb0\xe1\x8a\x91\xe1\x8b\xad\0" + "\xe1\x88\xa0\xe1\x88\x89\xe1\x88\xb5\0" + "\xe1\x8a\x83\xe1\x88\x99\xe1\x88\xb5\0" + "\xe1\x8b\x93\xe1\x88\xad\xe1\x89\xa2\0" + "\xe1\x89\x80\xe1\x8b\xb3\xe1\x88\x9d\0" + "\xe1\x88\xb0\xe1\x8a\x95\0" + "\xe1\x88\xb0\xe1\x8a\x91\0" + "\xe1\x88\xb0\xe1\x88\x89\0" + "\xe1\x88\xa8\xe1\x89\xa1\0" + "\xe1\x88\x93\xe1\x88\x99\0" + "\xe1\x8b\x93\xe1\x88\xad\0" + "\xe1\x89\x80\xe1\x8b\xb3\0" + "\xe1\x88\xa0\0" + "\xe1\x88\x93\0" + "\xe1\x89\x80\0" + "\xe1\x8c\xa5\xe1\x88\xaa\0" + "\xe1\x88\x88\xe1\x8a\xab\xe1\x89\xb2\xe1\x89\xb5\0" + "\xe1\x88\x98\xe1\x8c\x8b\xe1\x89\xa2\xe1\x89\xb5\0" + "\xe1\x88\x9a\xe1\x8b\xab\xe1\x8b\x9d\xe1\x8b\xab\0" + "\xe1\x8c\x8d\xe1\x8a\x95\xe1\x89\xa6\xe1\x89\xb5\0" + "\xe1\x88\xb0\xe1\x8a\x90\0" + "\xe1\x88\x93\xe1\x88\x9d\xe1\x88\x88\0" + "\xe1\x8a\x90\xe1\x88\x93\xe1\x88\xb0\0" + "\xe1\x88\x98\xe1\x88\xb5\xe1\x8a\xa8\xe1\x88\xa8\xe1\x88\x9d\0" + "\xe1\x8c\xa5\xe1\x89\x85\xe1\x88\x9d\xe1\x89\xb2\0" + "\xe1\x88\x95\xe1\x8b\xb3\xe1\x88\xad\0" + "\xe1\x89\xb3\xe1\x88\x95\xe1\x88\xb3\xe1\x88\xb5\0" + "\xe1\x88\x88\xe1\x8a\xab\0" + "\xe1\x88\x98\xe1\x8c\x8b\0" + "\xe1\x88\x9a\xe1\x8b\xab\0" + "\xe1\x8c\x8d\xe1\x8a\x95\0" + "\xe1\x88\x93\xe1\x88\x9d\0" + "\xe1\x8a\x90\xe1\x88\x93\0" + "\xe1\x88\x98\xe1\x88\xb5\0" + "\xe1\x8c\xa5\xe1\x89\x85\0" + "\xe1\x88\x95\xe1\x8b\xb3\0" + "\xe1\x89\xb3\xe1\x88\x95\0" + "L\xc4\x81pule\0" + "Po\xca\xbb\x61kahi\0" + "Po\xca\xbb\x61lua\0" + "Po\xca\xbb\x61kolu\0" + "Po\xca\xbb\x61h\xc4\x81\0" + "Po\xca\xbb\x61lima\0" + "Po\xca\xbb\x61ono\0" + "LP\0" + "P1\0" + "P2\0" + "P3\0" + "P4\0" + "P5\0" + "P6\0" + "Ianuali\0" + "Pepeluali\0" + "Malaki\0" + "\xca\xbb\x41pelila\0" + "Iune\0" + "Iulai\0" + "\xca\xbb\x41ukake\0" + "Kepakemapa\0" + "\xca\xbbOkakopa\0" + "Nowemapa\0" + "Kekemapa\0" + "Ian.\0" + "Pep.\0" + "Mal.\0" + "\xca\xbb\x41p.\0" + "Iun.\0" + "Iul.\0" + "\xca\xbb\x41u.\0" + "Kep.\0" + "\xca\xbbOk.\0" + "Now.\0" + "Kek.\0" + "Axad\0" + "Isniin\0" + "Talaado\0" + "Arbaco\0" + "Khamiis\0" + "Jimco\0" + "Sabti\0" + "Axd\0" + "Arb\0" + "Kh\0" + "Bisha Koobaad\0" + "Bisha Labaad\0" + "Bisha Saddexaad\0" + "Bisha Afraad\0" + "Bisha Shanaad\0" + "Bisha Lixaad\0" + "Bisha Todobaad\0" + "Bisha Sideedaad\0" + "Bisha Sagaalaad\0" + "Bisha Tobnaad\0" + "Bisha Kow iyo Tobnaad\0" + "Bisha Laba iyo Tobnaad\0" + "Kob\0" + "Lab\0" + "Afr\0" + "Sha\0" + "Lix\0" + "Tod\0" + "Sid\0" + "Sag\0" + "Tob\0" + "KIT\0" + "LIT\0" + "\xea\x91\xad\xea\x86\x8f\xea\x91\x8d\0" + "\xea\x86\x8f\xea\x8a\x82\xea\x8b\x8d\0" + "\xea\x86\x8f\xea\x8a\x82\xea\x91\x8d\0" + "\xea\x86\x8f\xea\x8a\x82\xea\x8c\x95\0" + "\xea\x86\x8f\xea\x8a\x82\xea\x87\x96\0" + "\xea\x86\x8f\xea\x8a\x82\xea\x89\xac\0" + "\xea\x86\x8f\xea\x8a\x82\xea\x83\x98\0" + "\xea\x91\xad\xea\x86\x8f\0" + "\xea\x86\x8f\xea\x8b\x8d\0" + "\xea\x86\x8f\xea\x91\x8d\0" + "\xea\x86\x8f\xea\x8c\x95\0" + "\xea\x86\x8f\xea\x87\x96\0" + "\xea\x86\x8f\xea\x89\xac\0" + "\xea\x86\x8f\xea\x83\x98\0" + "\xea\x86\x8f\0" + "\xea\x8b\x8d\0" + "\xea\x91\x8d\0" + "\xea\x8c\x95\0" + "\xea\x87\x96\0" + "\xea\x89\xac\0" + "\xea\x83\x98\0" + "\xea\x8b\x8d\xea\x86\xaa\0" + "\xea\x91\x8d\xea\x86\xaa\0" + "\xea\x8c\x95\xea\x86\xaa\0" + "\xea\x87\x96\xea\x86\xaa\0" + "\xea\x89\xac\xea\x86\xaa\0" + "\xea\x83\x98\xea\x86\xaa\0" + "\xea\x8f\x83\xea\x86\xaa\0" + "\xea\x89\x86\xea\x86\xaa\0" + "\xea\x88\xac\xea\x86\xaa\0" + "\xea\x8a\xb0\xea\x86\xaa\0" + "\xea\x8a\xb0\xea\x8a\xaa\xea\x86\xaa\0" + "\xea\x8a\xb0\xea\x91\x8b\xea\x86\xaa\0" + "Meurzh\0" + "Merc\xca\xbcher\0" + "Yaou\0" + "Gwener\0" + "Sadorn\0" + "Meu.\0" + "Mer.\0" + "Gwe.\0" + "Sad.\0" + "Su\0" + "Mz\0" + "Mc\0" + "Genver\0" + "C\xca\xbchwevrer\0" + "Ebrel\0" + "Mae\0" + "Mezheven\0" + "Gouere\0" + "Eost\0" + "Gwengolo\0" + "Here\0" + "Du\0" + "Kerzu\0" + "Gen.\0" + "C\xca\xbchwe.\0" + "Meur.\0" + "Ebr.\0" + "Mezh.\0" + "Goue.\0" + "Gwen.\0" + "Ker.\0" + "\xd9\x8a\xdb\x95\xd9\x83\xd8\xb4\xdb\x95\xd9\x86\xd8\xa8\xdb\x95\0" + "\xd8\xaf\xdb\x88\xd8\xb4\xdb\x95\xd9\x86\xd8\xa8\xdb\x95\0" + "\xd8\xb3\xdb\x95\xd9\x8a\xd8\xb4\xdb\x95\xd9\x86\xd8\xa8\xdb\x95\0" + "\xda\x86\xd8\xa7\xd8\xb1\xd8\xb4\xdb\x95\xd9\x86\xd8\xa8\xdb\x95\0" + "\xd9\xbe\xdb\x95\xd9\x8a\xd8\xb4\xdb\x95\xd9\x86\xd8\xa8\xdb\x95\0" + "\xd8\xac\xdb\x88\xd9\x85\xdb\x95\0" + "\xd8\xb4\xdb\x95\xd9\x86\xd8\xa8\xdb\x95\0" + "\xd9\x8a\xdb\x95\0" + "\xd8\xaf\xdb\x88\0" + "\xd8\xb3\xdb\x95\0" + "\xda\x86\xd8\xa7\0" + "\xd9\xbe\xdb\x95\0" + "\xd8\xac\xdb\x88\0" + "\xd8\xb4\xdb\x95\0" + "\xd9\x8a\0" + "\xd9\x8a\xd8\xa7\xd9\x86\xdb\x8b\xd8\xa7\xd8\xb1\0" + "\xd9\x81\xdb\x90\xdb\x8b\xd8\xb1\xd8\xa7\xd9\x84\0" + "\xd9\x85\xd8\xa7\xd8\xb1\xd8\xaa\0" + "\xd8\xa6\xd8\xa7\xd9\xbe\xd8\xb1\xdb\x90\xd9\x84\0" + "\xd9\x85\xd8\xa7\xd9\x8a\0" + "\xd8\xa6\xd9\x89\xd9\x8a\xdb\x87\xd9\x86\0" + "\xd8\xa6\xd9\x89\xd9\x8a\xdb\x87\xd9\x84\0" + "\xd8\xa6\xd8\xa7\xdb\x8b\xd8\xba\xdb\x87\xd8\xb3\xd8\xaa\0" + "\xd8\xb3\xdb\x90\xd9\x86\xd8\xaa\xdb\x95\xd8\xa8\xd9\x89\xd8\xb1\0" + "\xd8\xa6\xdb\x86\xd9\x83\xd8\xaa\xdb\x95\xd8\xa8\xd9\x89\xd8\xb1\0" + "\xd9\x86\xd9\x88\xd9\x8a\xd8\xa7\xd8\xa8\xd9\x89\xd8\xb1\0" + "\xd8\xaf\xdb\x90\xd9\x83\xd8\xa7\xd8\xa8\xd9\x89\xd8\xb1\0" + "Sunntig\0" + "M\xc3\xa4\xc3\xa4ntig\0" + "Ziischtig\0" + "Mittwuch\0" + "Dunschtig\0" + "Friitig\0" + "Samschtig\0" + "Su.\0" + "M\xc3\xa4.\0" + "Zi.\0" + "Mi.\0" + "Du.\0" + "Fr.\0" + "Auguscht\0" + "Sept\xc3\xa4mber\0" + "Oktoober\0" + "Nov\xc3\xa4mber\0" + "Dez\xc3\xa4mber\0" + "\xd0\xb1\xd0\xb0\xd1\x81\xd0\xba\xd1\x8b\xd2\xbb\xd1\x8b\xd0\xb0\xd0\xbd\xd0\xbd\xd1\x8c\xd0\xb0\0" + "\xd0\xb1\xd1\x8d\xd0\xbd\xd0\xb8\xd0\xb4\xd0\xb8\xd1\x8d\xd0\xbd\xd0\xbd\xd1\x8c\xd0\xb8\xd0\xba\0" + "\xd0\xbe\xd0\xbf\xd1\x82\xd1\x83\xd0\xbe\xd1\x80\xd1\x83\xd0\xbd\xd0\xbd\xd1\x8c\xd1\x83\xd0\xba\0" + "\xd1\x81\xd1\x8d\xd1\x80\xd1\x8d\xd0\xb4\xd1\x8d\0" + "\xd1\x87\xd1\x8d\xd0\xbf\xd0\xbf\xd0\xb8\xd1\x8d\xd1\x80\0" + "\xd0\x91\xd1\x8d\xd1\x8d\xd1\x82\xd0\xb8\xd2\xa5\xd1\x81\xd1\x8d\0" + "\xd1\x81\xd1\x83\xd0\xb1\xd1\x83\xd0\xbe\xd1\x82\xd0\xb0\0" + "\xd0\xb1\xd1\x81\0" + "\xd0\xb1\xd0\xbd\0" + "\xd0\xbe\xd0\xbf\0" + "\xd1\x81\xd1\x8d\0" + "\xd1\x87\xd0\xbf\0" + "\xd0\xb1\xd1\x8d\0" + "\xd0\x9e\0" + "\xd1\x82\xd0\xbe\xd1\x85\xd1\x81\xd1\x83\xd0\xbd\xd0\xbd\xd1\x8c\xd1\x83\0" + "\xd0\xbe\xd0\xbb\xd1\x83\xd0\xbd\xd0\xbd\xd1\x8c\xd1\x83\0" + "\xd0\xba\xd1\x83\xd0\xbb\xd1\x83\xd0\xbd \xd1\x82\xd1\x83\xd1\x82\xd0\xb0\xd1\x80\0" + "\xd0\xbc\xd1\x83\xd1\x83\xd1\x81 \xd1\x83\xd1\x81\xd1\x82\xd0\xb0\xd1\x80\0" + "\xd1\x8b\xd0\xb0\xd0\xbc \xd1\x8b\xd0\xb9\xd0\xb0\0" + "\xd0\xb1\xd1\x8d\xd1\x81 \xd1\x8b\xd0\xb9\xd0\xb0\0" + "\xd0\xbe\xd1\x82 \xd1\x8b\xd0\xb9\xd0\xb0\0" + "\xd0\xb0\xd1\x82\xd1\x8b\xd1\x80\xd0\xb4\xd1\x8c\xd1\x8b\xd1\x85 \xd1\x8b\xd0\xb9\xd0\xb0\0" + "\xd0\xb1\xd0\xb0\xd0\xbb\xd0\xb0\xd2\x95\xd0\xb0\xd0\xbd \xd1\x8b\xd0\xb9\xd0\xb0\0" + "\xd0\xb0\xd0\xbb\xd1\x82\xd1\x8b\xd0\xbd\xd0\xbd\xd1\x8c\xd1\x8b\0" + "\xd1\x81\xd1\x8d\xd1\x82\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8c\xd0\xb8\0" + "\xd0\xb0\xd1\x85\xd1\x81\xd1\x8b\xd0\xbd\xd0\xbd\xd1\x8c\xd1\x8b\0" + "\xd0\xa2\xd0\xbe\xd1\x85\xd1\x81\xd1\x83\xd0\xbd\xd0\xbd\xd1\x8c\xd1\x83\0" + "\xd0\x9e\xd0\xbb\xd1\x83\xd0\xbd\xd0\xbd\xd1\x8c\xd1\x83\0" + "\xd0\x9a\xd1\x83\xd0\xbb\xd1\x83\xd0\xbd \xd1\x82\xd1\x83\xd1\x82\xd0\xb0\xd1\x80\0" + "\xd0\x9c\xd1\x83\xd1\x83\xd1\x81 \xd1\x83\xd1\x81\xd1\x82\xd0\xb0\xd1\x80\0" + "\xd0\xab\xd0\xb0\xd0\xbc \xd1\x8b\xd0\xb9\xd1\x8b\xd0\xbd\0" + "\xd0\x91\xd1\x8d\xd1\x81 \xd1\x8b\xd0\xb9\xd1\x8b\xd0\xbd\0" + "\xd0\x9e\xd1\x82 \xd1\x8b\xd0\xb9\xd1\x8b\xd0\xbd\0" + "\xd0\x90\xd1\x82\xd1\x8b\xd1\x80\xd0\xb4\xd1\x8c\xd1\x8b\xd1\x85 \xd1\x8b\xd0\xb9\xd1\x8b\xd0\xbd\0" + "\xd0\x91\xd0\xb0\xd0\xbb\xd0\xb0\xd2\x95\xd0\xb0\xd0\xbd \xd1\x8b\xd0\xb9\xd1\x8b\xd0\xbd\0" + "\xd0\x90\xd0\xbb\xd1\x82\xd1\x8b\xd0\xbd\xd0\xbd\xd1\x8c\xd1\x8b\0" + "\xd0\xa1\xd1\x8d\xd1\x82\xd0\xb8\xd0\xbd\xd0\xbd\xd1\x8c\xd0\xb8\0" + "\xd0\xa2\xd0\xbe\xd1\x85\xd1\x81\0" + "\xd0\x9e\xd0\xbb\xd1\x83\xd0\xbd\0" + "\xd0\x9a\xd0\xbb\xd0\xbd\0" + "\xd0\x9c\xd1\x81\xd1\x83\0" + "\xd0\xab\xd0\xb0\xd0\xbc\0" + "\xd0\x91\xd1\x8d\xd1\x81\0" + "\xd0\x9e\xd1\x82\xd0\xb9\0" + "\xd0\x90\xd1\x82\xd1\x80\0" + "\xd0\x91\xd0\xbb\xd2\x95\0" + "\xd0\x90\xd0\xbb\xd1\x82\0" + "\xd0\xa1\xd1\x8d\xd1\x82\0" + "\xd0\x90\xd1\x85\xd1\x81\0" + "Ku cyumweru\0" + "Kuwa mbere\0" + "Kuwa kabiri\0" + "Kuwa gatatu\0" + "Kuwa kane\0" + "Kuwa gatanu\0" + "Kuwa gatandatu\0" + "cyu.\0" + "mbe.\0" + "kab.\0" + "gtu.\0" + "kan.\0" + "gnu.\0" + "gnd.\0" + "Mutarama\0" + "Gashyantare\0" + "Werurwe\0" + "Mata\0" + "Gicuransi\0" + "Kamena\0" + "Nyakanga\0" + "Kanama\0" + "Nzeli\0" + "Ukwakira\0" + "Ugushyingo\0" + "Ukuboza\0" + "mut.\0" + "gas.\0" + "wer.\0" + "mat.\0" + "gic.\0" + "kam.\0" + "nya.\0" + "nze.\0" + "ukw.\0" + "ugu.\0" + "uku.\0" + "DiD\xc3\xb2mhnaich\0" + "DiLuain\0" + "DiM\xc3\xa0irt\0" + "DiCiadain\0" + "DiarDaoin\0" + "DihAoine\0" + "DiSathairne\0" + "DiD\0" + "DiL\0" + "DiM\0" + "DiC\0" + "Dia\0" + "Dih\0" + "DiS\0" + "Am Faoilleach\0" + "An Gearran\0" + "Am M\xc3\xa0rt\0" + "An Giblean\0" + "An C\xc3\xa8itean\0" + "An t-\xc3\x92gmhios\0" + "An t-Iuchar\0" + "An L\xc3\xb9nastal\0" + "An t-Sultain\0" + "An D\xc3\xa0mhair\0" + "An t-Samhain\0" + "An D\xc3\xb9\x62hlachd\0" + "dhen Fhaoilleach\0" + "dhen Ghearran\0" + "dhen Mh\xc3\xa0rt\0" + "dhen Ghiblean\0" + "dhen Ch\xc3\xa8itean\0" + "dhen \xc3\x92gmhios\0" + "dhen Iuchar\0" + "dhen L\xc3\xb9nastal\0" + "dhen t-Sultain\0" + "dhen D\xc3\xa0mhair\0" + "dhen t-Samhain\0" + "dhen D\xc3\xb9\x62hlachd\0" + "Faoi\0" + "Gearr\0" + "M\xc3\xa0rt\0" + "Gibl\0" + "C\xc3\xa8it\0" + "\xc3\x92gmh\0" + "Iuch\0" + "L\xc3\xb9na\0" + "Sult\0" + "D\xc3\xa0mh\0" + "D\xc3\xb9\x62h\0" + "\xe9\x80\xb1\xe6\x97\xa5\0" + "\xe9\x80\xb1\xe4\xb8\x80\0" + "\xe9\x80\xb1\xe4\xba\x8c\0" + "\xe9\x80\xb1\xe4\xb8\x89\0" + "\xe9\x80\xb1\xe5\x9b\x9b\0" + "\xe9\x80\xb1\xe4\xba\x94\0" + "\xe9\x80\xb1\xe5\x85\xad\0" + "\xd8\xa7\xd9\x84\xd8\xa3\xd8\xad\xd8\xaf\0" + "\xd8\xa7\xd9\x84\xd8\xa7\xd8\xab\xd9\x86\xd9\x8a\xd9\x86\0" + "\xd8\xa7\xd9\x84\xd8\xab\xd9\x84\xd8\xa7\xd8\xab\xd8\xa7\xd8\xa1\0" + "\xd8\xa7\xd9\x84\xd8\xa3\xd8\xb1\xd8\xa8\xd8\xb9\xd8\xa7\xd8\xa1\0" + "\xd8\xa7\xd9\x84\xd8\xae\xd9\x85\xd9\x8a\xd8\xb3\0" + "\xd8\xa7\xd9\x84\xd8\xac\xd9\x85\xd8\xb9\xd8\xa9\0" + "\xd8\xa7\xd9\x84\xd8\xb3\xd8\xa8\xd8\xaa\0" + "\xd8\xad\0" + "\xd9\x86\0" + "\xd8\xab\0" + "\xd8\xb1\0" + "\xd8\xae\0" + "\xd9\x83\xd8\xa7\xd9\x86\xd9\x88\xd9\x86 \xd8\xa7\xd9\x84\xd8\xab\xd8\xa7\xd9\x86\xd9\x8a\0" + "\xd8\xb4\xd8\xa8\xd8\xa7\xd8\xb7\0" + "\xd8\xa2\xd8\xb0\xd8\xa7\xd8\xb1\0" + "\xd9\x86\xd9\x8a\xd8\xb3\xd8\xa7\xd9\x86\0" + "\xd8\xa3\xd9\x8a\xd8\xa7\xd8\xb1\0" + "\xd8\xad\xd8\xb2\xd9\x8a\xd8\xb1\xd8\xa7\xd9\x86\0" + "\xd8\xaa\xd9\x85\xd9\x88\xd8\xb2\0" + "\xd8\xa2\xd8\xa8\0" + "\xd8\xa3\xd9\x8a\xd9\x84\xd9\x88\xd9\x84\0" + "\xd8\xaa\xd8\xb4\xd8\xb1\xd9\x8a\xd9\x86 \xd8\xa7\xd9\x84\xd8\xa3\xd9\x88\xd9\x84\0" + "\xd8\xaa\xd8\xb4\xd8\xb1\xd9\x8a\xd9\x86 \xd8\xa7\xd9\x84\xd8\xab\xd8\xa7\xd9\x86\xd9\x8a\0" + "\xd9\x83\xd8\xa7\xd9\x86\xd9\x88\xd9\x86 \xd8\xa7\xd9\x84\xd8\xa3\xd9\x88\xd9\x84\0" + "ene\0" + "oct\0" + "tysdag\0" + "laurdag\0" + "tys\0" + "lau\0" + "segunda\0" + "ter\xc3\xa7\x61\0" + "quarta\0" + "quinta\0" + "sexta\0" + "Dum\0" + "Mie\0" + "Joi\0" + "Vin\0" + "S\xc3\xa2m\0" + "Ma\0" + "\xd9\xbe\xdb\x8c\xd8\xb1\0" + "\xd0\xb1\xd0\xb0\xd0\xb7\xd0\xb0\xd1\x80\0" + "\xd0\xb1\xd0\xb0\xd0\xb7\xd0\xb0\xd1\x80 \xd0\xb5\xd1\x80\xd1\x82\xd3\x99\xd1\x81\xd0\xb8\0" + "\xd1\x87\xd3\x99\xd1\x80\xd1\x88\xd3\x99\xd0\xbd\xd0\xb1\xd3\x99 \xd0\xb0\xd1\x85\xd1\x88\xd0\xb0\xd0\xbc\xd1\x8b\0" + "\xd1\x87\xd3\x99\xd1\x80\xd1\x88\xd3\x99\xd0\xbd\xd0\xb1\xd3\x99\0" + "\xd2\xb9\xd2\xaf\xd0\xbc\xd3\x99 \xd0\xb0\xd1\x85\xd1\x88\xd0\xb0\xd0\xbc\xd1\x8b\0" + "\xd2\xb9\xd2\xaf\xd0\xbc\xd3\x99\0" + "\xd1\x88\xd3\x99\xd0\xbd\xd0\xb1\xd3\x99\0" + "\xd0\x91.\0" + "\xd0\x91.\xd0\x95.\0" + "\xd0\xa7.\xd0\x90.\0" + "\xd0\xa7.\0" + "\xd2\xb8.\xd0\x90.\0" + "\xd2\xb8.\0" + "\xd0\xa8.\0" + "\xd0\x88\xd0\xb0\xd0\xbd\xd0\xb2\xd0\xb0\xd1\x80\0" + "\xd0\x98\xd1\x98\xd1\x83\xd0\xbd\0" + "\xd0\x98\xd1\x98\xd1\x83\xd0\xbb\0" + "\xd0\xa1\xd0\xb5\xd0\xbd\xd1\x82\xd1\x98\xd0\xb0\xd0\xb1\xd1\x80\0" + "\xd0\x9e\xd0\xba\xd1\x82\xd1\x98\xd0\xb0\xd0\xb1\xd1\x80\0" + "\xd0\x9d\xd0\xbe\xd1\x98\xd0\xb0\xd0\xb1\xd1\x80\0" + "\xd1\x98\xd0\xb0\xd0\xbd\xd0\xb2\xd0\xb0\xd1\x80\0" + "\xd1\x84\xd0\xb5\xd0\xb2\xd1\x80\xd0\xb0\xd0\xbb\0" + "\xd0\xb0\xd0\xbf\xd1\x80\xd0\xb5\xd0\xbb\0" + "\xd0\xb8\xd1\x98\xd1\x83\xd0\xbd\0" + "\xd0\xb8\xd1\x98\xd1\x83\xd0\xbb\0" + "\xd1\x81\xd0\xb5\xd0\xbd\xd1\x82\xd1\x98\xd0\xb0\xd0\xb1\xd1\x80\0" + "\xd0\xbe\xd0\xba\xd1\x82\xd1\x98\xd0\xb0\xd0\xb1\xd1\x80\0" + "\xd0\xbd\xd0\xbe\xd1\x98\xd0\xb0\xd0\xb1\xd1\x80\0" + "\xd0\xb4\xd0\xb5\xd0\xba\xd0\xb0\xd0\xb1\xd1\x80\0" + "\xd1\x98\xd0\xb0\xd0\xbd\0" + "\xd0\xbc\xd0\xb0\xd1\x80\0" + "\xd0\xb8\xd1\x98\xd0\xbd\0" + "\xd0\xb8\xd1\x98\xd0\xbb\0" + "\xd1\x81\xd0\xb5\xd0\xbd\0" + "\xd0\xbd\xd0\xbe\xd1\x98\0" + "nje\xc5\xba\x65la\0" + "p\xc3\xb3nje\xc5\xba\x65le\0" + "wa\xc5\x82tora\0" + "srjoda\0" + "stw\xc3\xb3rtk\0" + "p\xc4\x9btk\0" + "wa\xc5\x82\0" + "stw\0" + "p\xc4\x9bt\0" + "\xd1\x8f\xd0\xba\xd1\x88\xd0\xb0\xd0\xbd\xd0\xb1\xd0\xb0\0" + "\xd0\xb4\xd1\x83\xd1\x88\xd0\xb0\xd0\xbd\xd0\xb1\xd0\xb0\0" + "\xd1\x81\xd0\xb5\xd1\x88\xd0\xb0\xd0\xbd\xd0\xb1\xd0\xb0\0" + "\xd1\x87\xd0\xbe\xd1\x80\xd1\x88\xd0\xb0\xd0\xbd\xd0\xb1\xd0\xb0\0" + "\xd0\xbf\xd0\xb0\xd0\xb9\xd1\x88\xd0\xb0\xd0\xbd\xd0\xb1\xd0\xb0\0" + "\xd1\x88\xd0\xb0\xd0\xbd\xd0\xb1\xd0\xb0\0" + "\xd0\xaf\xd0\xba\xd1\x88\0" + "\xd0\x94\xd1\x83\xd1\x88\0" + "\xd0\xa1\xd0\xb5\xd1\x88\0" + "\xd0\xa7\xd0\xbe\xd1\x80\0" + "\xd0\x9f\xd0\xb0\xd0\xb9\0" + "\xd0\x96\xd1\x83\xd0\xbc\0" + "\xd0\xa8\xd0\xb0\xd0\xbd\0" + "\xd0\xaf\0" + "\xd1\x8f\xd0\xbd\xd0\xb2\xd0\xb0\xd1\x80\0" + "\xd0\xb8\xd1\x8e\xd0\xbd\0" + "\xd0\xb8\xd1\x8e\xd0\xbb\0" + "\xd1\x81\xd0\xb5\xd0\xbd\xd1\x82\xd1\x8f\xd0\xb1\xd1\x80\0" + "\xd0\xbe\xd0\xba\xd1\x82\xd1\x8f\xd0\xb1\xd1\x80\0" + "\xd0\xbd\xd0\xbe\xd1\x8f\xd0\xb1\xd1\x80\0" + "\xd8\xa8\xd9\x8f\xd8\xaf\xda\xbe\0" + "\xd9\x85\xd8\xa6\0" + "\xd9\x8a\xd9\x86\xd8\xa7\xd9\x8a\xd8\xb1\0" + "\xd9\x81\xd8\xa8\xd8\xb1\xd8\xa7\xd9\x8a\xd8\xb1\0" + "\xd8\xa3\xd8\xa8\xd8\xb1\xd9\x8a\xd9\x84\0" + "\xd9\x85\xd8\xa7\xd9\x8a\xd9\x88\0" + "\xd9\x8a\xd9\x88\xd9\x86\xd9\x8a\xd9\x88\0" + "\xd9\x8a\xd9\x88\xd9\x84\xd9\x8a\xd9\x88\0" + "\xd8\xa3\xd8\xba\xd8\xb3\xd8\xb7\xd8\xb3\0" + "\xd8\xb3\xd8\xa8\xd8\xaa\xd9\x85\xd8\xa8\xd8\xb1\0" + "\xd8\xa3\xd9\x83\xd8\xaa\xd9\x88\xd8\xa8\xd8\xb1\0" + "\xd9\x86\xd9\x88\xd9\x81\xd9\x85\xd8\xa8\xd8\xb1\0" + "\xd8\xaf\xd9\x8a\xd8\xb3\xd9\x85\xd8\xa8\xd8\xb1\0" + "J\xc3\xa4nner\0" + "J\xc3\xa4n\0" + "Sun.\0" + "Mon.\0" + "Tue.\0" + "Wed.\0" + "Thu.\0" + "Fri.\0" + "Sat.\0" + "M.\0" + "Tu.\0" + "W.\0" + "Th.\0" + "F.\0" + "Oct.\0" + "juill.\0" + "vuoss\xc3\xa1rgga\0" + "ma\xc5\x8b\xc5\x8b\x65\x62\xc3\xa1rgga\0" + "gaskavahku\0" + "duorastaga\0" + "bearjadaga\0" + "l\xc3\xa1vvardaga\0" + "U\0" + "\xd8\xac\xd8\xa7\xd9\x86\xd9\x81\xd9\x8a\0" + "\xd9\x81\xd9\x8a\xd9\x81\xd8\xb1\xd9\x8a\0" + "\xd8\xa3\xd9\x81\xd8\xb1\xd9\x8a\xd9\x84\0" + "\xd8\xac\xd9\x88\xd8\xa7\xd9\x86\0" + "\xd8\xac\xd9\x88\xd9\x8a\xd9\x84\xd9\x8a\xd8\xa9\0" + "\xd8\xa3\xd9\x88\xd8\xaa\0" + "septembar\0" + "oktobar\0" + "novembar\0" + "decembar\0" + "avg\0" + "\xd9\x8a\xd9\x88\xd9\x84\xd9\x8a\xd9\x88\xd8\xb2\0" + "\xd8\xba\xd8\xb4\xd8\xaa\0" + "\xd8\xb4\xd8\xaa\xd9\x86\xd8\xa8\xd8\xb1\0" + "\xd9\x86\xd9\x88\xd9\x86\xd8\xa8\xd8\xb1\0" + "\xd8\xaf\xd8\xac\xd9\x86\xd8\xa8\xd8\xb1\0" + "ponedeljak\0" + "ut.\0" + "sr.\0" + "sub.\0" + "\xd0\xbd\xd0\xb5\xd0\xb4\xd1\x98\xd0\xb5\xd1\x99\xd0\xb0\0" + "\xd0\xbf\xd0\xbe\xd0\xbd\xd0\xb5\xd0\xb4\xd0\xb5\xd1\x99\xd0\xb0\xd0\xba\0" + "\xd1\x83\xd1\x82\xd0\xbe\xd1\x80\xd0\xb0\xd0\xba\0" + "\xd1\x81\xd1\x80\xd0\xb8\xd1\x98\xd0\xb5\xd0\xb4\xd0\xb0\0" + "\xd1\x87\xd0\xb5\xd1\x82\xd0\xb2\xd1\x80\xd1\x82\xd0\xb0\xd0\xba\0" + "\xd0\xbf\xd0\xb5\xd1\x82\xd0\xb0\xd0\xba\0" + "\xd1\x83\xd1\x82.\0" + "\xd1\x81\xd1\x80.\0" + "\xd1\x81\xd1\x83\xd0\xb1.\0" + "\xd1\x83\0" + "\xd1\x98\xd0\xb0\xd0\xbd\xd1\x83\xd0\xb0\xd1\x80\0" + "\xd1\x84\xd0\xb5\xd0\xb1\xd1\x80\xd1\x83\xd0\xb0\xd1\x80\0" + "\xd1\x98\xd1\x83\xd0\xbd\0" + "\xd1\x98\xd1\x83\xd0\xbb\0" + "\xd1\x81\xd0\xb5\xd0\xbf\xd1\x82\xd0\xb5\xd0\xbc\xd0\xb1\xd0\xb0\xd1\x80\0" + "\xd0\xbe\xd0\xba\xd1\x82\xd0\xbe\xd0\xb1\xd0\xb0\xd1\x80\0" + "\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xb5\xd0\xbc\xd0\xb1\xd0\xb0\xd1\x80\0" + "\xd0\xb4\xd0\xb5\xd1\x86\xd0\xb5\xd0\xbc\xd0\xb1\xd0\xb0\xd1\x80\0" + "\xd1\x84\xd0\xb5\xd0\xb1.\0" + "\xd0\xbd\xd0\xbe\xd0\xb2.\0" + "\xd0\xb4\xd0\xb5\xd1\x86.\0" + "\xd0\xbd\xd0\xb5\xd0\xb4\xd0\xb5\xd1\x99\xd0\xb0\0" + "\xd0\xbd\xd0\xb5\xd0\xb4\0" + "\xd0\xbf\xd0\xbe\xd0\xbd\0" + "\xd1\x83\xd1\x82\xd0\xbe\0" + "\xd1\x81\xd1\x80\xd0\xb8\0" + "\xd1\x87\xd0\xb5\xd1\x82\0" + "\xd0\xbf\xd0\xb5\xd1\x82\0" + "\xd1\x81\xd1\x83\xd0\xb1\0" + "\xd1\x84\xd0\xb5\xd0\xb1\0" + "\xd0\xbd\xd0\xbe\xd0\xb2\0" + "\xd0\xb4\xd0\xb5\xd1\x86\0" + "l\0" + "j\0" + "v\0" + "sre\0" + "pasepeeivi\0" + "vuossaarg\xc3\xa2\0" + "majebaarg\xc3\xa2\0" + "koskoho\0" + "tuor\xc3\xa2stuv\0" + "v\xc3\xa1stuppeeivi\0" + "l\xc3\xa1vurduv\0" + "pas\0" + "vuo\0" + "kos\0" + "tuo\0" + "v\xc3\xa1s\0" + "u\xc4\x91\xc4\x91\xc3\xa2ivem\xc3\xa1\xc3\xa1nu\0" + "kuov\xc3\xa2m\xc3\xa1\xc3\xa1nu\0" + "njuh\xc4\x8d\xc3\xa2m\xc3\xa1\xc3\xa1nu\0" + "cu\xc3\xa1\xc5\x8buim\xc3\xa1\xc3\xa1nu\0" + "vyesim\xc3\xa1\xc3\xa1nu\0" + "kesim\xc3\xa1\xc3\xa1nu\0" + "syeinim\xc3\xa1\xc3\xa1nu\0" + "porgem\xc3\xa1\xc3\xa1nu\0" + "\xc4\x8doh\xc4\x8d\xc3\xa2m\xc3\xa1\xc3\xa1nu\0" + "roovv\xc3\xa2\x64m\xc3\xa1\xc3\xa1nu\0" + "skamm\xc3\xa2m\xc3\xa1\xc3\xa1nu\0" + "juovl\xc3\xa2m\xc3\xa1\xc3\xa1nu\0" + "u\xc4\x91iv\0" + "kuov\xc3\xa2\0" + "njuh\xc4\x8d\xc3\xa2\0" + "cu\xc3\xa1\xc5\x8bui\0" + "vyesi\0" + "kesi\0" + "syeini\0" + "porge\0" + "\xc4\x8doh\xc4\x8d\xc3\xa2\0" + "roovv\xc3\xa2\x64\0" + "skamm\xc3\xa2\0" + "juovl\xc3\xa2\0" + "Febrero\0" + "Junio\0" + "Julio\0" + "Setiembre\0" + "Octubre\0" + "Noviembre\0" + "Diciembre\0" + "setiembre\0" + "Ene.\0" + "May.\0" + "Dic.\0" + "\xd1\x81\xd1\x80\xd0\xb5\0" + "f\xc3\xa9v.\0" + "jui.\0" + "\xd8\xa7\xd9\x84\xd8\xaa\xd9\x82\xd9\x88\xd9\x8a\xd9\x85 \xd8\xa7\xd9\x84\xd9\x87\xd8\xac\xd8\xb1\xd9\x8a\0" + "\xd0\xb3\xd1\x80\xd0\xb8\xd0\xb3\xd0\xbe\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8 \xd0\xba\xd0\xb0\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb4\xd0\xb0\xd1\x80\0" + "calendari gregori\xc3\xa0\0" + "\xe5\x85\xac\xe5\x8e\x86\0" + "Gregori\xc3\xa1nsk\xc3\xbd kalend\xc3\xa1\xc5\x99\0" + "gregoriansk kalender\0" + "Gregorianischer Kalender\0" + "\xce\x93\xcf\x81\xce\xb7\xce\xb3\xce\xbf\xcf\x81\xce\xb9\xce\xb1\xce\xbd\xcf\x8c \xce\xb7\xce\xbc\xce\xb5\xcf\x81\xce\xbf\xce\xbb\xcf\x8c\xce\xb3\xce\xb9\xce\xbf\0" + "Gregorian Calendar\0" + "calendario gregoriano\0" + "gregoriaaninen kalenteri\0" + "calendrier gr\xc3\xa9gorien\0" + "\xd7\x9c\xd7\x95\xd7\x97 \xd7\x94\xd7\xa9\xd7\xa0\xd7\x94 \xd7\x94\xd7\x92\xd7\xa8\xd7\x92\xd7\x95\xd7\xa8\xd7\x99\xd7\x90\xd7\xa0\xd7\x99\0" + "Gergely-napt\xc3\xa1r\0" + "Gregor\xc3\xadskt dagatal\0" + "Calendario gregoriano\0" + "\xe8\xa5\xbf\xe6\x9a\xa6(\xe3\x82\xb0\xe3\x83\xac\xe3\x82\xb4\xe3\x83\xaa\xe3\x82\xaa\xe6\x9a\xa6)\0" + "\xec\x96\x91\xeb\xa0\xa5\0" + "Gregoriaanse kalender\0" + "kalendarz gregoria\xc5\x84ski\0" + "Calend\xc3\xa1rio Gregoriano\0" + "chalender gregorian\0" + "calendar gregorian\0" + "\xd0\xb3\xd1\x80\xd0\xb8\xd0\xb3\xd0\xbe\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd0\xba\xd0\xb0\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb4\xd0\xb0\xd1\x80\xd1\x8c\0" + "gregorijanski kalendar\0" + "gregori\xc3\xa1nsky kalend\xc3\xa1r\0" + "kalendar gregorian\0" + "\xe0\xb8\x9b\xe0\xb8\x8f\xe0\xb8\xb4\xe0\xb8\x97\xe0\xb8\xb4\xe0\xb8\x99\xe0\xb8\x9e\xe0\xb8\xb8\xe0\xb8\x97\xe0\xb8\x98\0" + "Miladi Takvim\0" + "\xd8\xac\xd8\xa7\xd8\xb1\xd8\xac\xdb\x8c\xd8\xa7\xd8\xa6\xdb\x8c \xda\xa9\xdb\x8c\xd9\x84\xd9\x86\xda\x88\xd8\xb1\0" + "Kalender Gregorian\0" + "\xd0\xb3\xd1\x80\xd0\xb8\xd0\xb3\xd0\xbe\xd1\x80\xd1\x96\xd0\xb0\xd0\xbd\xd1\x81\xd1\x8c\xd0\xba\xd0\xb8\xd0\xb9 \xd0\xba\xd0\xb0\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb4\xd0\xb0\xd1\x80\0" + "\xd0\xb3\xd1\x80\xd1\x8b\xd0\xb3\xd0\xb0\xd1\x80\xd1\x8b\xd1\x8f\xd0\xbd\xd1\x81\xd0\xba\xd1\x96 \xd0\xba\xd0\xb0\xd0\xbb\xd1\x8f\xd0\xbd\xd0\xb4\xd0\xb0\xd1\x80\0" + "gregorijanski koledar\0" + "Gregoriuse kalender\0" + "Gregora kalend\xc4\x81rs\0" + "Grigaliaus kalendorius\0" + "\xd8\xaa\xd9\x82\xd9\x88\xdb\x8c\xd9\x85 \xd9\x85\xdb\x8c\xd9\x84\xd8\xa7\xd8\xaf\xdb\x8c\0" + "L\xe1\xbb\x8b\x63h Gregory\0" + "\xd5\xa3\xd6\x80\xd5\xab\xd5\xa3\xd5\xb8\xd6\x80\xd5\xb5\xd5\xa1\xd5\xb6 \xd5\xbf\xd5\xb8\xd5\xb4\xd5\xa1\xd6\x80\0" + "Qreqorian T\xc9\x99qvimi\0" + "Egutegi gregoriarra\0" + "gregorianska protyka\0" + "\xd0\x93\xd1\x80\xd0\xb5\xd0\xb3\xd0\xbe\xd1\x80\xd0\xb8\xd1\x98\xd0\xb0\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8 \xd0\xba\xd0\xb0\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb4\xd0\xb0\xd1\x80\0" + "ikhalenda lesi-Gregorian\0" + "Gregoriese kalender\0" + "\xe1\x83\x92\xe1\x83\xa0\xe1\x83\x98\xe1\x83\x92\xe1\x83\x9d\xe1\x83\xa0\xe1\x83\x98\xe1\x83\x90\xe1\x83\x9c\xe1\x83\xa3\xe1\x83\x9a\xe1\x83\x98 \xe1\x83\x99\xe1\x83\x90\xe1\x83\x9a\xe1\x83\x94\xe1\x83\x9c\xe1\x83\x93\xe1\x83\x90\xe1\x83\xa0\xe1\x83\x98\0" + "gregorianskur kalendari\0" + "\xe0\xa4\x97\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x97\xe0\xa5\x8b\xe0\xa4\xb0\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xa8 \xe0\xa4\x95\xe0\xa5\x88\xe0\xa4\xb2\xe0\xa5\x87\xe0\xa4\x82\xe0\xa4\xa1\xe0\xa4\xb0\0" + "Kalendarju Gregorjan\0" + "gregoria kaleander\0" + "F\xc3\xa9ilire Ghr\xc3\xa9\x61g\xc3\xb3ra\0" + "Kalendar Gregory\0" + "\xd0\x93\xd1\x80\xd0\xb5\xd0\xb3\xd0\xbe\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbd\xd0\xb4\xd1\x8b\xd2\x9b \xd0\xba\xd2\xaf\xd0\xbd\xd1\x82\xd1\x96\xd0\xb7\xd0\xb1\xd0\xb5\0" + "\xd0\x93\xd1\x80\xd0\xb8\xd0\xb3\xd0\xbe\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbd \xd0\xb6\xd1\x8b\xd0\xbb\xd0\xbd\xd0\xb0\xd0\xb0\xd0\xbc\xd0\xb0\xd1\x81\xd1\x8b\0" + "Kalenda ya Kigregori\0" + "Gregor\xc3\xbd\x61n senenamasy\0" + "grigorian taqvimi\0" + "\xe0\xa6\x97\xe0\xa7\x8d\xe0\xa6\xb0\xe0\xa6\xbf\xe0\xa6\x97\xe0\xa7\x8b\xe0\xa6\xb0\xe0\xa6\xbf\xe0\xa6\xaf\xe0\xa6\xbc\xe0\xa6\xbe\xe0\xa6\xa8 \xe0\xa6\x95\xe0\xa7\x8d\xe0\xa6\xaf\xe0\xa6\xbe\xe0\xa6\xb2\xe0\xa7\x87\xe0\xa6\xa8\xe0\xa7\x8d\xe0\xa6\xa1\xe0\xa6\xbe\xe0\xa6\xb0\0" + "\xe0\xa8\x97\xe0\xa8\xb0\xe0\xa9\x87\xe0\xa8\x97\xe0\xa9\x8b\xe0\xa8\xb0\xe0\xa9\x80\xe0\xa8\x85\xe0\xa8\xa8 \xe0\xa8\x95\xe0\xa9\x88\xe0\xa8\xb2\xe0\xa9\xb0\xe0\xa8\xa1\xe0\xa8\xb0\0" + "\xe0\xaa\x97\xe0\xab\x8d\xe0\xaa\xb0\xe0\xab\x87\xe0\xaa\x97\xe0\xab\x8b\xe0\xaa\xb0\xe0\xaa\xbf\xe0\xaa\x85\xe0\xaa\xa8 \xe0\xaa\x95\xe0\xab\x87\xe0\xaa\xb2\xe0\xab\x87\xe0\xaa\xa8\xe0\xab\x8d\xe0\xaa\xa1\xe0\xaa\xb0\0" + "\xe0\xae\x95\xe0\xae\xbf\xe0\xae\xb0\xe0\xae\xbf\xe0\xae\x95\xe0\xaf\x8b\xe0\xae\xb0\xe0\xae\xbf\xe0\xae\xaf\xe0\xae\xa9\xe0\xaf\x8d \xe0\xae\xa8\xe0\xae\xbe\xe0\xae\xb3\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xbe\xe0\xae\x9f\xe0\xaf\x8d\xe0\xae\x9f\xe0\xae\xbf\0" + "\xe0\xb0\x97\xe0\xb1\x8d\xe0\xb0\xb0\xe0\xb1\x87\xe0\xb0\x97\xe0\xb1\x8b\xe0\xb0\xb0\xe0\xb0\xbf\xe0\xb0\xaf\xe0\xb0\xa8\xe0\xb1\x8d \xe0\xb0\x95\xe0\xb1\x8d\xe0\xb0\xaf\xe0\xb0\xbe\xe0\xb0\xb2\xe0\xb1\x86\xe0\xb0\x82\xe0\xb0\xa1\xe0\xb0\xb0\xe0\xb1\x8d\0" + "\xe0\xb2\x97\xe0\xb3\x8d\xe0\xb2\xb0\xe0\xb3\x86\xe0\xb2\x97\xe0\xb3\x8b\xe0\xb2\xb0\xe0\xb2\xbf\xe0\xb2\xaf\xe0\xb2\xa8\xe0\xb3\x8d \xe0\xb2\x95\xe0\xb3\x8d\xe0\xb2\xaf\xe0\xb2\xbe\xe0\xb2\xb2\xe0\xb3\x86\xe0\xb2\x82\xe0\xb2\xa1\xe0\xb2\xb0\xe0\xb3\x8d\0" + "\xe0\xb4\x87\xe0\xb4\x82\xe0\xb4\x97\xe0\xb5\x8d\xe0\xb4\xb2\xe0\xb5\x80\xe0\xb4\xb7\xe0\xb5\x8d \xe0\xb4\x95\xe0\xb4\xb2\xe0\xb4\xa3\xe0\xb5\x8d\xe0\xb4\x9f\xe0\xb5\xbc\0" + "\xe0\xa6\x97\xe0\xa7\x8d\xe0\xa7\xb0\xe0\xa6\xbf\xe0\xa6\x97\xe0\xa7\x8b\xe0\xa7\xb0\xe0\xa7\x80\xe0\xa6\xaf\xe0\xa6\xbc \xe0\xa6\xaa\xe0\xa6\x9e\xe0\xa7\x8d\xe0\xa6\x9c\xe0\xa6\xbf\xe0\xa6\x95\xe0\xa6\xbe\0" + "\xe0\xa4\x97\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x97\xe0\xa5\x8b\xe0\xa4\xb0\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xa8 \xe0\xa4\xa6\xe0\xa4\xbf\xe0\xa4\xa8\xe0\xa4\xa6\xe0\xa4\xb0\xe0\xa5\x8d\xe0\xa4\xb6\xe0\xa4\xbf\xe0\xa4\x95\xe0\xa4\xbe\0" + "\xd0\xb3\xd1\x80\xd0\xb5\xd0\xb3\xd0\xbe\xd1\x80\xd0\xb8\xd0\xb9\xd0\xbd \xd1\x85\xd1\x83\xd0\xb0\xd0\xbd\xd0\xbb\xd0\xb8\0" + "Calendr Gregori\0" + "\xe1\x9e\x94\xe1\x9f\x92\xe1\x9e\x9a\xe1\x9e\x8f\xe1\x9e\xb7\xe1\x9e\x91\xe1\x9e\xb7\xe1\x9e\x93\xe2\x80\x8b\xe1\x9e\xa0\xe1\x9f\x92\xe1\x9e\x9f\xe1\x9e\x80\xe1\x9e\xa0\xe1\x9f\x92\xe1\x9e\x9f\xe1\x9f\x8a\xe1\x9e\xb8\0" + "\xe0\xba\x9b\xe0\xba\xb0\xe0\xba\x95\xe0\xba\xb4\xe0\xba\x97\xe0\xba\xb4\xe0\xba\x99\xe0\xbb\x80\xe0\xba\x81\xe0\xba\xa3\xe0\xbb\x82\xe0\xba\x81\xe0\xba\xa3\xe0\xba\xbd\xe0\xba\x99\0" + "\xe1\x80\x94\xe1\x80\xad\xe1\x80\xaf\xe1\x80\x84\xe1\x80\xba\xe1\x80\x84\xe1\x80\xb6\xe1\x80\x90\xe1\x80\x80\xe1\x80\xac\xe1\x80\x9e\xe1\x80\xaf\xe1\x80\xb6\xe1\x80\xb8 \xe1\x80\x95\xe1\x80\xbc\xe1\x80\x80\xe1\x80\xb9\xe1\x80\x81\xe1\x80\x92\xe1\x80\xad\xe1\x80\x94\xe1\x80\xba\0" + "\xe0\xb6\x9c\xe0\xb7\x8a\xe2\x80\x8d\xe0\xb6\xbb\xe0\xb7\x99\xe0\xb6\x9c\xe0\xb6\xbb\xe0\xb7\x92\xe0\xb6\xba\xe0\xb7\x8f\xe0\xb6\xb1\xe0\xb7\x94 \xe0\xb6\xaf\xe0\xb7\x92\xe0\xb6\xb1 \xe0\xb6\xaf\xe0\xb6\xbb\xe0\xb7\x8a\xe0\xb7\x81\xe0\xb6\xb1\xe0\xb6\xba\0" + "\xe1\x8e\xa9\xe1\x8e\xb4\xe1\x8e\xaa\xe1\x8e\xb5\xe1\x8e\xa0\xe1\x8f\x82 \xe1\x8f\x85\xe1\x8f\x99 \xe1\x8f\x97\xe1\x8f\x8e\xe1\x8f\x8d\xe1\x8f\x97\0" + "\xe1\x8b\xa8\xe1\x8c\x8d\xe1\x88\xaa\xe1\x8c\x8e\xe1\x88\xaa\xe1\x8b\xab\xe1\x8a\x95 \xe1\x8b\xa8\xe1\x89\x80\xe1\x8a\x95 \xe1\x8a\xa0\xe1\x89\x86\xe1\x8c\xa3\xe1\x8c\xa0\xe1\x88\xad\0" + "\xe0\xa4\x97\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa5\x87\xe0\xa4\x97\xe0\xa5\x8b\xe0\xa4\xb0\xe0\xa4\xbf\xe0\xa4\xaf\xe0\xa4\xa8 \xe0\xa4\xaa\xe0\xa4\xbe\xe0\xa4\xa4\xe0\xa5\x8d\xe0\xa4\xb0\xe0\xa5\x8b\0" + "Gregoriaanske kalinder\0" + "Gregorian na Kalendaryo\0" + "Gregorianesche Kalenner\0" + "gregorianskit ullorsiutaat\0" + "\xea\x84\x89\xea\x89\xbb\xea\x83\x85\xea\x91\x8d\0" + "deiziadur gregorian\0" + "\xd9\x85\xd9\x89\xd9\x84\xd8\xa7\xd8\xaf\xd9\x89\xd9\x8a\xdb\x95 \xd9\x8a\xd9\x89\xd9\x84\xd9\x86\xd8\xa7\xd9\x85\xdb\x95\xd8\xb3\xd9\x89\0" + "Gregoriaanisch Kal\xc3\xa4nder\0" + "Am M\xc3\xacosachan Griogarach\0" + "\xe5\x85\xac\xe6\x9b\x86\0" + "\xd8\xa7\xd9\x84\xd8\xaa\xd9\x82\xd9\x88\xd9\x8a\xd9\x85 \xd8\xa7\xd9\x84\xd9\x85\xd9\x8a\xd9\x84\xd8\xa7\xd8\xaf\xd9\x8a\0" + "Calend\xc3\xa1rio gregoriano\0" + "gregoria\xc5\x84ski kalender\0" + "\xd0\x93\xd1\x80\xd0\xb8\xd0\xb3\xd0\xbe\xd1\x80\xd0\xb8\xd0\xb0\xd0\xbd \xd0\xba\xd0\xb0\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb4\xd0\xb0\xd1\x80\xd0\xb8\0" + "gregoriala\xc5\xa1 kalendar\0" + "\xd0\xb3\xd1\x80\xd0\xb5\xd0\xb3\xd0\xbe\xd1\x80\xd0\xb8\xd1\x98\xd0\xb0\xd0\xbd\xd1\x81\xd0\xba\xd0\xb8 \xd0\xba\xd0\xb0\xd0\xbb\xd0\xb5\xd0\xbd\xd0\xb4\xd0\xb0\xd1\x80\0" +}; + + +#endif + diff --git a/Source/Engine/Localization/CultureInfo.cpp b/Source/Engine/Localization/CultureInfo.cpp index 6afd85737..3e02ccf6e 100644 --- a/Source/Engine/Localization/CultureInfo.cpp +++ b/Source/Engine/Localization/CultureInfo.cpp @@ -2,13 +2,25 @@ #include "CultureInfo.h" #include "Engine/Core/Log.h" -#include "Engine/Scripting/ManagedCLR/MType.h" +#include "Engine/Core/Types/StringView.h" #include "Engine/Utilities/StringConverter.h" -#if USE_MONO -#include -#include -#include +#include "Engine/Scripting/Types.h" +#include "Engine/Scripting/ManagedCLR/MProperty.h" +#if USE_CSHARP +#include "Engine/Scripting/ScriptingType.h" +#include "Engine/Scripting/BinaryModule.h" +#include "Engine/Scripting/Scripting.h" +#include "Engine/Scripting/ManagedCLR/MAssembly.h" +#include "Engine/Scripting/ManagedCLR/MClass.h" +#include "Engine/Scripting/ManagedCLR/MCore.h" +#include "Engine/Scripting/ManagedCLR/MMethod.h" +#endif + +// Use in-built cultures info tables from mono +#include "CultureInfo.Tables.h" + +#if USE_MONO typedef struct { MonoObject obj; @@ -30,7 +42,6 @@ CultureInfo::CultureInfo(int32 lcid) _englishName = TEXT("Invariant Culture"); return; } -#if USE_MONO for (int32 i = 0; i < NUM_CULTURE_ENTRIES; i++) { auto& e = culture_entries[i]; @@ -47,7 +58,6 @@ CultureInfo::CultureInfo(int32 lcid) break; } } -#endif if (!_data) { _englishName = TEXT("Invariant Culture"); @@ -70,7 +80,6 @@ CultureInfo::CultureInfo(const StringAnsiView& name) _englishName = TEXT("Invariant Culture"); return; } -#if USE_MONO for (int32 i = 0; i < NUM_CULTURE_ENTRIES; i++) { auto& e = culture_entries[i]; @@ -87,7 +96,6 @@ CultureInfo::CultureInfo(const StringAnsiView& name) break; } } -#endif if (!_data) { _lcid = 127; @@ -122,16 +130,6 @@ const String& CultureInfo::GetEnglishName() const return _englishName; } -bool CultureInfo::IsRightToLeft() const -{ -#if USE_MONO - const auto data = static_cast(_data); - if (data) - return data->text_info.is_right_to_left ? true : false; -#endif - return false; -} - String CultureInfo::ToString() const { return _name; @@ -144,31 +142,18 @@ bool CultureInfo::operator==(const CultureInfo& other) const void* MUtils::ToManaged(const CultureInfo& value) { -#if USE_MONO - const auto klass = mono_class_from_name(mono_get_corlib(), "System.Globalization", "CultureInfo"); - if (klass) - { - void* iter = nullptr; - MonoMethod* method; - while ((method = mono_class_get_methods(klass, &iter))) - { - if (StringUtils::Compare(mono_method_get_name(method), ".ctor") == 0) - { - const auto sig = mono_method_signature(method); - void* sigParams = nullptr; - mono_signature_get_params(sig, &sigParams); - if (mono_signature_get_param_count(sig) == 1 && mono_type_get_class(((MonoType**)sigParams)[0]) != mono_get_string_class()) - { - MonoObject* obj = mono_object_new(mono_domain_get(), klass); - int32 lcid = value.GetLCID(); - void* params[1]; - params[0] = &lcid; - mono_runtime_invoke(method, obj, params, nullptr); - return obj; - } - } - } - } +#if USE_CSHARP + auto scriptingClass = Scripting::GetStaticClass(); + CHECK_RETURN(scriptingClass, nullptr); + auto cultureInfoToManaged = scriptingClass->GetMethod("CultureInfoToManaged", 1); + CHECK_RETURN(cultureInfoToManaged, nullptr); + + int32 lcid = value.GetLCID(); + void* params[1]; + params[0] = &lcid; + MObject* obj = cultureInfoToManaged->Invoke(nullptr, params, nullptr); + + return obj; #endif return nullptr; } @@ -179,6 +164,17 @@ CultureInfo MUtils::ToNative(void* value) #if USE_MONO if (value) lcid = static_cast(value)->lcid; +#elif USE_CSHARP + const MClass* klass = GetBinaryModuleCorlib()->Assembly->GetClass("System.Globalization.CultureInfo"); + if (value && klass) + { + MProperty* lcidProperty = klass->GetProperty("LCID"); + if (lcidProperty && lcidProperty->GetGetMethod()) + { + MObject* lcidObj = lcidProperty->GetGetMethod()->Invoke(value, nullptr, nullptr); + lcid = *(int32*)MCore::Object::Unbox(lcidObj); + } + } #endif return CultureInfo(lcid); } diff --git a/Source/Engine/Localization/CultureInfo.h b/Source/Engine/Localization/CultureInfo.h index aa82d36f6..debd537ab 100644 --- a/Source/Engine/Localization/CultureInfo.h +++ b/Source/Engine/Localization/CultureInfo.h @@ -11,6 +11,7 @@ API_CLASS(InBuild, Namespace="System.Globalization") class FLAXENGINE_API CultureInfo { DECLARE_SCRIPTING_TYPE_MINIMAL(CultureInfo); + private: void* _data; int32 _lcid; @@ -64,11 +65,6 @@ public: /// const String& GetEnglishName() const; - /// - /// Returns true if culture uses right-to-left (RTL) text layout. Otherwise it's more common left-to-right. - /// - bool IsRightToLeft() const; - String ToString() const; bool operator==(const CultureInfo& other) const; }; diff --git a/Source/Engine/Main/Linux/main.cpp b/Source/Engine/Main/Default/main.cpp similarity index 89% rename from Source/Engine/Main/Linux/main.cpp rename to Source/Engine/Main/Default/main.cpp index 144ca4d58..3a7efcc4e 100644 --- a/Source/Engine/Main/Linux/main.cpp +++ b/Source/Engine/Main/Default/main.cpp @@ -1,6 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. -#if PLATFORM_LINUX +#if PLATFORM_LINUX || PLATFORM_MAC || PLATFORM_IOS #include "Engine/Engine/Engine.h" #include "Engine/Core/Types/StringBuilder.h" diff --git a/Source/Engine/Main/Mac/main.cpp b/Source/Engine/Main/Mac/main.cpp deleted file mode 100644 index 266b2ca4e..000000000 --- a/Source/Engine/Main/Mac/main.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. - -#if PLATFORM_MAC - -#include "Engine/Engine/Engine.h" -#include "Engine/Core/Types/StringBuilder.h" - -int main(int argc, char* argv[]) -{ - // Join the arguments - StringBuilder args; - for (int i = 1; i < argc; i++) - { - args.Append(argv[i]); - - if (i + 1 != argc) - args.Append(TEXT(' ')); - } - args.Append(TEXT('\0')); - - return Engine::Main(*args); -} - -#endif diff --git a/Source/Engine/Main/Main.Build.cs b/Source/Engine/Main/Main.Build.cs index b061aa303..27c9fb611 100644 --- a/Source/Engine/Main/Main.Build.cs +++ b/Source/Engine/Main/Main.Build.cs @@ -50,9 +50,6 @@ public class Main : EngineModule options.CompileEnv.WinRTComponentExtensions = true; options.CompileEnv.GenerateDocumentation = true; - break; - case TargetPlatform.Linux: - options.SourcePaths.Add(Path.Combine(FolderPath, "Linux")); break; case TargetPlatform.PS4: options.SourcePaths.Add(Path.Combine(Globals.EngineRoot, "Source", "Platforms", "PS4", "Engine", "Main")); @@ -72,8 +69,10 @@ public class Main : EngineModule case TargetPlatform.Switch: options.SourcePaths.Add(Path.Combine(Globals.EngineRoot, "Source", "Platforms", "Switch", "Engine", "Main")); break; + case TargetPlatform.Linux: case TargetPlatform.Mac: - options.SourcePaths.Add(Path.Combine(FolderPath, "Mac")); + case TargetPlatform.iOS: + options.SourcePaths.Add(Path.Combine(FolderPath, "Default")); break; default: throw new InvalidPlatformException(options.Platform.Target); } diff --git a/Source/Engine/Networking/Drivers/NetworkLagDriver.cpp b/Source/Engine/Networking/Drivers/NetworkLagDriver.cpp index 244a2e1a8..615aab7d6 100644 --- a/Source/Engine/Networking/Drivers/NetworkLagDriver.cpp +++ b/Source/Engine/Networking/Drivers/NetworkLagDriver.cpp @@ -97,7 +97,7 @@ bool NetworkLagDriver::PopEvent(NetworkEvent* eventPtr) if (!_driver) return false; - // Try to pop event from the queue + // Try to pop lagged event from the queue for (int32 i = 0; i < _events.Count(); i++) { auto& e = _events[i]; @@ -112,6 +112,9 @@ bool NetworkLagDriver::PopEvent(NetworkEvent* eventPtr) // Consume any incoming events while (_driver->PopEvent(eventPtr)) { + if (Lag <= 0.0) + return true; + auto& e = _events.AddOne(); e.Lag = (double)Lag; e.Event = *eventPtr; @@ -121,6 +124,12 @@ bool NetworkLagDriver::PopEvent(NetworkEvent* eventPtr) void NetworkLagDriver::SendMessage(const NetworkChannelType channelType, const NetworkMessage& message) { + if (Lag <= 0.0) + { + _driver->SendMessage(channelType, message); + return; + } + auto& msg = _messages.AddOne(); msg.Lag = (double)Lag; msg.Type = 0; @@ -130,6 +139,12 @@ void NetworkLagDriver::SendMessage(const NetworkChannelType channelType, const N void NetworkLagDriver::SendMessage(NetworkChannelType channelType, const NetworkMessage& message, NetworkConnection target) { + if (Lag <= 0.0) + { + _driver->SendMessage(channelType, message, target); + return; + } + auto& msg = _messages.AddOne(); msg.Lag = (double)Lag; msg.Type = 1; @@ -140,6 +155,12 @@ void NetworkLagDriver::SendMessage(NetworkChannelType channelType, const Network void NetworkLagDriver::SendMessage(const NetworkChannelType channelType, const NetworkMessage& message, const Array& targets) { + if (Lag <= 0.0) + { + _driver->SendMessage(channelType, message, targets); + return; + } + auto& msg = _messages.AddOne(); msg.Lag = (double)Lag; msg.Type = 2; diff --git a/Source/Engine/Networking/NetworkConfig.h b/Source/Engine/Networking/NetworkConfig.h index 0be511210..b92d822cb 100644 --- a/Source/Engine/Networking/NetworkConfig.h +++ b/Source/Engine/Networking/NetworkConfig.h @@ -82,8 +82,8 @@ API_STRUCT(Namespace="FlaxEngine.Networking") struct FLAXENGINE_API NetworkConfi API_FIELD() uint16 MessagePoolSize = 2048; + // Ignore deprecation warnings in defaults PRAGMA_DISABLE_DEPRECATION_WARNINGS - /// Ctor. NetworkConfig() { NetworkDriverType = NetworkDriverType::ENet; diff --git a/Source/Engine/Networking/NetworkManager.h b/Source/Engine/Networking/NetworkManager.h index 81d607a65..c18a58d96 100644 --- a/Source/Engine/Networking/NetworkManager.h +++ b/Source/Engine/Networking/NetworkManager.h @@ -27,7 +27,7 @@ API_ENUM(Namespace="FlaxEngine.Networking") enum class NetworkManagerMode /// /// The high-level network client connection data. Can be used to accept/deny new connection. /// -API_STRUCT(Namespace="FlaxEngine.Networking") struct NetworkClientConnectionData +API_STRUCT(Namespace="FlaxEngine.Networking", NoDefault) struct NetworkClientConnectionData { DECLARE_SCRIPTING_TYPE_MINIMAL(NetworkClientConnectionData); // The incoming client. diff --git a/Source/Engine/Networking/NetworkReplicator.cpp b/Source/Engine/Networking/NetworkReplicator.cpp index 3c08a01aa..761857ed2 100644 --- a/Source/Engine/Networking/NetworkReplicator.cpp +++ b/Source/Engine/Networking/NetworkReplicator.cpp @@ -701,7 +701,7 @@ void NetworkReplicator::AddRPC(const ScriptingTypeHandle& typeHandle, const Stri NetworkRpcInfo::RPCsTable[rpcName] = rpcInfo; } -void NetworkReplicator::CSharpEndInvokeRPC(ScriptingObject* obj, const ScriptingTypeHandle& type, const StringAnsiView& name, NetworkStream* argsStream, MonoArray* targetIds) +void NetworkReplicator::CSharpEndInvokeRPC(ScriptingObject* obj, const ScriptingTypeHandle& type, const StringAnsiView& name, NetworkStream* argsStream, MArray* targetIds) { EndInvokeRPC(obj, type, GetCSharpCachedName(name), argsStream, MUtils::ToSpan(targetIds)); } @@ -1544,7 +1544,7 @@ void NetworkInternal::NetworkReplicatorUpdate() continue; auto& item = it->Item; - // Send despawn message + // Send RPC message //NETWORK_REPLICATOR_LOG(Info, "[NetworkReplicator] Rpc {}::{} object ID={}", e.Name.First.ToString(), String(e.Name.Second), item.ToString()); NetworkMessageObjectRpc msgData; msgData.ObjectId = item.ObjectId; diff --git a/Source/Engine/Networking/NetworkReplicator.cs b/Source/Engine/Networking/NetworkReplicator.cs index 45fc45ba1..1ca251f75 100644 --- a/Source/Engine/Networking/NetworkReplicator.cs +++ b/Source/Engine/Networking/NetworkReplicator.cs @@ -9,14 +9,23 @@ namespace FlaxEngine.Networking partial class NetworkReplicator { private static Dictionary> _managedSerializers; + private static List _managedExecuteRpcFuncs; #if FLAX_EDITOR - private static void OnScriptsReloadBegin() + private static void ClearManagedReferences() { // Clear refs to managed types that will be hot-reloaded - _managedSerializers.Clear(); - _managedSerializers = null; - FlaxEditor.ScriptsBuilder.ScriptsReloadBegin -= OnScriptsReloadBegin; + if (_managedSerializers != null) + { + _managedSerializers.Clear(); + _managedSerializers = null; + } + if (_managedExecuteRpcFuncs != null) + { + _managedExecuteRpcFuncs.Clear(); + _managedExecuteRpcFuncs = null; + } + FlaxEditor.ScriptsBuilder.ScriptsReloadBegin -= ClearManagedReferences; } #endif @@ -55,8 +64,9 @@ namespace FlaxEngine.Networking if (_managedSerializers == null) { _managedSerializers = new Dictionary>(); + _managedExecuteRpcFuncs = new List(); #if FLAX_EDITOR - FlaxEditor.ScriptsBuilder.ScriptsReloadBegin += OnScriptsReloadBegin; + FlaxEditor.ScriptsBuilder.ScriptsReloadBegin += ClearManagedReferences; #endif } _managedSerializers[type] = new KeyValuePair(serialize, deserialize); @@ -126,10 +136,22 @@ namespace FlaxEngine.Networking /// Client RPC. /// Network channel to use for RPC transport. [Unmanaged] - public static void AddRPC(Type type, string name, ExecuteRPCFunc execute, bool isServer = true, bool isClient = false, NetworkChannelType channel = NetworkChannelType.ReliableOrdered) + public static unsafe void AddRPC(Type type, string name, ExecuteRPCFunc execute, bool isServer = true, bool isClient = false, NetworkChannelType channel = NetworkChannelType.ReliableOrdered) { if (!typeof(FlaxEngine.Object).IsAssignableFrom(type)) throw new ArgumentException("Not supported type for RPC. Only FlaxEngine.Object types are valid."); + + if (_managedExecuteRpcFuncs == null) + { + _managedSerializers = new Dictionary>(); + _managedExecuteRpcFuncs = new List(); +#if FLAX_EDITOR + FlaxEditor.ScriptsBuilder.ScriptsReloadBegin += ClearManagedReferences; +#endif + } + // Store the reference to prevent garbage collection + _managedExecuteRpcFuncs.Add(execute); + Internal_AddRPC(type, name, Marshal.GetFunctionPointerForDelegate(execute), isServer, isClient, channel); } } diff --git a/Source/Engine/Networking/NetworkReplicator.h b/Source/Engine/Networking/NetworkReplicator.h index 931e13afa..156e7eeea 100644 --- a/Source/Engine/Networking/NetworkReplicator.h +++ b/Source/Engine/Networking/NetworkReplicator.h @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #pragma once @@ -201,7 +201,7 @@ private: #if !COMPILE_WITHOUT_CSHARP API_FUNCTION(NoProxy) static void AddSerializer(const ScriptingTypeHandle& typeHandle, const Function& serialize, const Function& deserialize); API_FUNCTION(NoProxy) static void AddRPC(const ScriptingTypeHandle& typeHandle, const StringAnsiView& name, const Function& execute, bool isServer, bool isClient, NetworkChannelType channel); - API_FUNCTION(NoProxy) static void CSharpEndInvokeRPC(ScriptingObject* obj, const ScriptingTypeHandle& type, const StringAnsiView& name, NetworkStream* argsStream, MonoArray* targetIds); + API_FUNCTION(NoProxy) static void CSharpEndInvokeRPC(ScriptingObject* obj, const ScriptingTypeHandle& type, const StringAnsiView& name, NetworkStream* argsStream, MArray* targetIds); static StringAnsiView GetCSharpCachedName(const StringAnsiView& name); #endif }; diff --git a/Source/Engine/Physics/Actors/WheeledVehicle.cpp b/Source/Engine/Physics/Actors/WheeledVehicle.cpp index b491a12fd..2ed59c8f6 100644 --- a/Source/Engine/Physics/Actors/WheeledVehicle.cpp +++ b/Source/Engine/Physics/Actors/WheeledVehicle.cpp @@ -10,6 +10,9 @@ #include "Engine/Level/Scene/SceneRendering.h" #include "Engine/Debug/DebugDraw.h" #endif +#if !WITH_VEHICLE +#include "Engine/Core/Log.h" +#endif WheeledVehicle::WheeledVehicle(const SpawnParams& params) : RigidBody(params) diff --git a/Source/Engine/Physics/Colliders/CharacterController.cpp b/Source/Engine/Physics/Colliders/CharacterController.cpp index 28efcaa44..488acd6e4 100644 --- a/Source/Engine/Physics/Colliders/CharacterController.cpp +++ b/Source/Engine/Physics/Colliders/CharacterController.cpp @@ -210,7 +210,7 @@ void CharacterController::CreateController() _controller = PhysicsBackend::CreateController(GetPhysicsScene()->GetPhysicsScene(), this, this, _contactOffset, position, _slopeLimit, (int32)_nonWalkableMode, Material.Get(), Math::Abs(_radius) * scaling, Math::Abs(_height) * scaling, _stepOffset, _shape); // Setup - PhysicsBackend::SetControllerUpDirection(_shape, _upDirection); + PhysicsBackend::SetControllerUpDirection(_controller, _upDirection); PhysicsBackend::SetShapeLocalPose(_shape, _center, Quaternion::Identity); UpdateLayerBits(); UpdateBounds(); diff --git a/Source/Engine/Physics/CollisionData.cpp b/Source/Engine/Physics/CollisionData.cpp index d73b760af..36f28c111 100644 --- a/Source/Engine/Physics/CollisionData.cpp +++ b/Source/Engine/Physics/CollisionData.cpp @@ -268,18 +268,28 @@ CollisionData::LoadResult CollisionData::load(const SerializedOptions* options, if (dataSize <= 0) return LoadResult::InvalidData; - // Create PhysX object + // Create physics object if (_options.Type == CollisionDataType::ConvexMesh) { _convexMesh = PhysicsBackend::CreateConvexMesh(dataPtr, dataSize, _options.Box); + if (!_convexMesh) + { + LOG(Error, "Failed to create convex mesh"); + return LoadResult::Failed; + } } else if (_options.Type == CollisionDataType::TriangleMesh) { _triangleMesh = PhysicsBackend::CreateTriangleMesh(dataPtr, dataSize, _options.Box); + if (!_triangleMesh) + { + LOG(Error, "Failed to create triangle mesh"); + return LoadResult::Failed; + } } else { - LOG(Warning, "Invalid collision data type."); + LOG(Error, "Invalid collision data type."); return LoadResult::InvalidData; } } diff --git a/Source/Engine/Physics/PhysX/PhysicsBackendPhysX.cpp b/Source/Engine/Physics/PhysX/PhysicsBackendPhysX.cpp index 8f1aa6eb0..41430fb4d 100644 --- a/Source/Engine/Physics/PhysX/PhysicsBackendPhysX.cpp +++ b/Source/Engine/Physics/PhysX/PhysicsBackendPhysX.cpp @@ -10,6 +10,7 @@ #include "Engine/Physics/CollisionData.h" #include "Engine/Physics/PhysicalMaterial.h" #include "Engine/Physics/PhysicsScene.h" +#include "Engine/Physics/PhysicsStatistics.h" #include "Engine/Physics/CollisionCooking.h" #include "Engine/Physics/Actors/IPhysicsActor.h" #include "Engine/Physics/Joints/Limits.h" @@ -51,7 +52,7 @@ #define PHYSX_DEBUG_NAMING 0 // Temporary result buffer size -#define PHYSX_HIT_BUFFER_SIZE 128 +#define PHYSX_HIT_BUFFER_SIZE 128 struct ActionDataPhysX { @@ -75,7 +76,8 @@ struct ScenePhysX Array Actions; #if WITH_VEHICLE Array WheelVehicles; - PxBatchQuery* WheelRaycastBatchQuery = nullptr; + PxBatchQueryExt* WheelRaycastBatchQuery = nullptr; + int32 WheelRaycastBatchQuerySize = 0; #endif }; @@ -83,6 +85,7 @@ class AllocatorPhysX : public PxAllocatorCallback { void* allocate(size_t size, const char* typeName, const char* filename, int line) override { + ASSERT(size < 1024 * 1024 * 1024); // Prevent invalid allocation size return Allocator::Allocate(size, 16); } @@ -124,7 +127,7 @@ class QueryFilterPhysX : public PxQueryFilterCallback return blockSingle ? PxQueryHitType::eBLOCK : PxQueryHitType::eTOUCH; } - PxQueryHitType::Enum postFilter(const PxFilterData& filterData, const PxQueryHit& hit) override + PxQueryHitType::Enum postFilter(const PxFilterData& filterData, const PxQueryHit& hit, const PxShape* shape, const PxRigidActor* actor) override { // Not used return PxQueryHitType::eNONE; @@ -151,7 +154,7 @@ class CharacterQueryFilterPhysX : public PxQueryFilterCallback return PxQueryHitType::eNONE; } - PxQueryHitType::Enum postFilter(const PxFilterData& filterData, const PxQueryHit& hit) override + PxQueryHitType::Enum postFilter(const PxFilterData& filterData, const PxQueryHit& hit, const PxShape* shape, const PxRigidActor* actor) override { // Not used return PxQueryHitType::eNONE; @@ -200,6 +203,35 @@ class CharacterControllerFilterPhysX : public PxControllerFilterCallback } }; +#if WITH_VEHICLE + +class WheelFilterPhysX : public PxQueryFilterCallback +{ +public: + PxQueryHitType::Enum preFilter(const PxFilterData& filterData, const PxShape* shape, const PxRigidActor* actor, PxHitFlags& queryFlags) override + { + if (!shape) + return PxQueryHitType::eNONE; + const PxFilterData shapeFilter = shape->getQueryFilterData(); + + // Hardcoded id for vehicle shapes masking + if (filterData.word3 == shapeFilter.word3) + { + return PxQueryHitType::eNONE; + } + + // Collide for pairs (A,B) where the filtermask of A contains the ID of B and vice versa + if ((filterData.word0 & shapeFilter.word1) && (shapeFilter.word0 & filterData.word1)) + { + return PxQueryHitType::eBLOCK; + } + + return PxQueryHitType::eNONE; + } +}; + +#endif + class WriteStreamPhysX : public PxOutputStream { public: @@ -363,13 +395,12 @@ namespace #if WITH_VEHICLE bool VehicleSDKInitialized = false; Array WheelVehiclesCache; - Array WheelQueryResults; - Array WheelHitResults; Array WheelVehiclesResultsPerWheel; Array WheelVehiclesResultsPerVehicle; PxVehicleDrivableSurfaceToTireFrictionPairs* WheelTireFrictions = nullptr; bool WheelTireFrictionsDirty = false; Array WheelTireTypes; + WheelFilterPhysX WheelRaycastFilter; #endif } @@ -482,23 +513,6 @@ void InitVehicleSDK() } } -PxQueryHitType::Enum WheelRaycastPreFilter(PxFilterData filterData0, PxFilterData filterData1, const void* constantBlock, PxU32 constantBlockSize, PxHitFlags& queryFlags) -{ - // Hardcoded id for vehicle shapes masking - if (filterData0.word3 == filterData1.word3) - { - return PxQueryHitType::eNONE; - } - - // Collide for pairs (A,B) where the filtermask of A contains the ID of B and vice versa - if ((filterData0.word0 & filterData1.word1) && (filterData1.word0 & filterData0.word1)) - { - return PxQueryHitType::eBLOCK; - } - - return PxQueryHitType::eNONE; -} - #endif void* PhysicalMaterial::GetPhysicsMaterial() @@ -586,7 +600,7 @@ bool CollisionCooking::CookConvexMesh(CookingInput& input, BytesContainer& outpu PxConvexMeshCookingResult::Enum result; if (!cooking->cookConvexMesh(desc, outputStream, &result)) { - LOG(Warning, "Convex Mesh cooking failed. Error code: {0}, Input vertices count: {1}", result, input.VertexCount); + LOG(Warning, "Convex Mesh cooking failed. Error code: {0}, Input vertices count: {1}", (int32)result, input.VertexCount); return true; } @@ -620,7 +634,7 @@ bool CollisionCooking::CookTriangleMesh(CookingInput& input, BytesContainer& out PxTriangleMeshCookingResult::Enum result; if (!cooking->cookTriangleMesh(desc, outputStream, &result)) { - LOG(Warning, "Triangle Mesh cooking failed. Error code: {0}, Input vertices count: {1}, indices count: {2}", result, input.VertexCount, input.IndexCount); + LOG(Warning, "Triangle Mesh cooking failed. Error code: {0}, Input vertices count: {1}, indices count: {2}", (int32)result, input.VertexCount, input.IndexCount); return true; } @@ -757,8 +771,6 @@ void PhysicsBackend::Shutdown() // Cleanup any resources #if WITH_VEHICLE RELEASE_PHYSX(WheelTireFrictions); - WheelQueryResults.Resize(0); - WheelHitResults.Resize(0); WheelVehiclesResultsPerWheel.Resize(0); WheelVehiclesResultsPerVehicle.Resize(0); #endif @@ -794,7 +806,6 @@ void PhysicsBackend::ApplySettings(const PhysicsSettings& settings) _frictionCombineMode = settings.FrictionCombineMode; _restitutionCombineMode = settings.RestitutionCombineMode; - // TODO: setting eADAPTIVE_FORCE requires PxScene setup (physx docs: This flag is not mutable, and must be set in PxSceneDesc at scene creation.) // TODO: update all shapes filter data // TODO: update all shapes flags @@ -824,11 +835,10 @@ void* PhysicsBackend::CreateScene(const PhysicsSettings& settings) sceneDesc.flags |= PxSceneFlag::eENABLE_ACTIVE_ACTORS; if (!settings.DisableCCD) sceneDesc.flags |= PxSceneFlag::eENABLE_CCD; - if (settings.EnableAdaptiveForce) - sceneDesc.flags |= PxSceneFlag::eADAPTIVE_FORCE; sceneDesc.simulationEventCallback = &scenePhysX->EventsCallback; sceneDesc.filterShader = FilterShader; sceneDesc.bounceThresholdVelocity = settings.BounceThresholdVelocity; + sceneDesc.solverType = PxSolverType::ePGS; if (sceneDesc.cpuDispatcher == nullptr) { scenePhysX->CpuDispatcher = PxDefaultCpuDispatcherCreate(Math::Clamp(Platform::GetCPUInfo().ProcessorCoreCount - 1, 1, 4)); @@ -870,6 +880,7 @@ void PhysicsBackend::DestroyScene(void* scene) SceneOrigins.Remove(scenePhysX->Scene); #if WITH_VEHICLE RELEASE_PHYSX(scenePhysX->WheelRaycastBatchQuery); + scenePhysX->WheelRaycastBatchQuerySize = 0; #endif RELEASE_PHYSX(scenePhysX->ControllerManager); SAFE_DELETE(scenePhysX->CpuDispatcher); @@ -1108,18 +1119,12 @@ void PhysicsBackend::EndSimulateScene(void* scene) } // Update batches queries cache - if (wheelsCount > WheelQueryResults.Count()) + if (wheelsCount > scenePhysX->WheelRaycastBatchQuerySize) { if (scenePhysX->WheelRaycastBatchQuery) scenePhysX->WheelRaycastBatchQuery->release(); - WheelQueryResults.Resize(wheelsCount, false); - WheelHitResults.Resize(wheelsCount, false); - PxBatchQueryDesc desc(wheelsCount, 0, 0); - desc.queryMemory.userRaycastResultBuffer = WheelQueryResults.Get(); - desc.queryMemory.userRaycastTouchBuffer = WheelHitResults.Get(); - desc.queryMemory.raycastTouchBufferSize = wheelsCount; - desc.preFilterShader = WheelRaycastPreFilter; - scenePhysX->WheelRaycastBatchQuery = scenePhysX->Scene->createBatchQuery(desc); + scenePhysX->WheelRaycastBatchQuerySize = wheelsCount; + scenePhysX->WheelRaycastBatchQuery = PxCreateBatchQueryExt(*scenePhysX->Scene, &WheelRaycastFilter, wheelsCount, wheelsCount, 0, 0, 0, 0); } // Update lookup table that maps wheel type into the surface friction @@ -1169,7 +1174,7 @@ void PhysicsBackend::EndSimulateScene(void* scene) // Update vehicles if (WheelVehiclesCache.Count() != 0) { - PxVehicleSuspensionRaycasts(scenePhysX->WheelRaycastBatchQuery, WheelVehiclesCache.Count(), WheelVehiclesCache.Get(), WheelQueryResults.Count(), WheelQueryResults.Get()); + PxVehicleSuspensionRaycasts(scenePhysX->WheelRaycastBatchQuery, WheelVehiclesCache.Count(), WheelVehiclesCache.Get()); PxVehicleUpdates(scenePhysX->LastDeltaTime, scenePhysX->Scene->getGravity(), *WheelTireFrictions, WheelVehiclesCache.Count(), WheelVehiclesCache.Get(), WheelVehiclesResultsPerVehicle.Get()); } @@ -1336,6 +1341,30 @@ void PhysicsBackend::AddSceneActorAction(void* scene, void* actor, ActionType ac FlushLocker.Unlock(); } +#if COMPILE_WITH_PROFILER + +void PhysicsBackend::GetSceneStatistics(void* scene, PhysicsStatistics& result) +{ + PROFILE_CPU_NAMED("Physics.Statistics"); + auto scenePhysX = (ScenePhysX*)scene; + + PxSimulationStatistics px; + scenePhysX->Scene->getSimulationStatistics(px); + + result.ActiveDynamicBodies = px.nbActiveDynamicBodies; + result.ActiveKinematicBodies = px.nbActiveKinematicBodies; + result.ActiveJoints = px.nbActiveConstraints; + result.StaticBodies = px.nbStaticBodies; + result.DynamicBodies = px.nbDynamicBodies; + result.KinematicBodies = px.nbKinematicBodies; + result.NewPairs = px.nbNewPairs; + result.LostPairs = px.nbLostPairs; + result.NewTouches = px.nbNewTouches; + result.LostTouches = px.nbLostTouches; +} + +#endif + bool PhysicsBackend::RayCast(void* scene, const Vector3& origin, const Vector3& direction, const float maxDistance, uint32 layerMask, bool hitTriggers) { SCENE_QUERY_SETUP(true); @@ -2045,7 +2074,7 @@ bool PhysicsBackend::ComputeShapesPenetration(void* shapeA, void* shapeB, const const PxTransform poseA(C2P(positionA), C2P(orientationA)); const PxTransform poseB(C2P(positionB), C2P(orientationB)); PxVec3 dir = C2P(direction); - const bool result = PxGeometryQuery::computePenetration(dir, distance, shapeAPhysX->getGeometry().any(), poseA, shapeBPhysX->getGeometry().any(), poseB); + const bool result = PxGeometryQuery::computePenetration(dir, distance, shapeAPhysX->getGeometry(), poseA, shapeBPhysX->getGeometry(), poseB); direction = P2C(dir); return result; } @@ -2054,7 +2083,7 @@ float PhysicsBackend::ComputeShapeSqrDistanceToPoint(void* shape, const Vector3& { auto shapePhysX = (PxShape*)shape; const PxTransform trans(C2P(position), C2P(orientation)); - return PxGeometryQuery::pointDistance(C2P(point), shapePhysX->getGeometry().any(), trans, (PxVec3*)closestPoint); + return PxGeometryQuery::pointDistance(C2P(point), shapePhysX->getGeometry(), trans, (PxVec3*)closestPoint); } bool PhysicsBackend::RayCastShape(void* shape, const Vector3& position, const Quaternion& orientation, const Vector3& origin, const Vector3& direction, float& resultHitDistance, float maxDistance) @@ -2064,7 +2093,7 @@ bool PhysicsBackend::RayCastShape(void* shape, const Vector3& position, const Qu const PxTransform trans(C2P(position - sceneOrigin), C2P(orientation)); const PxHitFlags hitFlags = (PxHitFlags)0; PxRaycastHit hit; - if (PxGeometryQuery::raycast(C2P(origin - sceneOrigin), C2P(direction), shapePhysX->getGeometry().any(), trans, maxDistance, hitFlags, 1, &hit) != 0) + if (PxGeometryQuery::raycast(C2P(origin - sceneOrigin), C2P(direction), shapePhysX->getGeometry(), trans, maxDistance, hitFlags, 1, &hit) != 0) { resultHitDistance = hit.distance; return true; @@ -2079,7 +2108,7 @@ bool PhysicsBackend::RayCastShape(void* shape, const Vector3& position, const Qu const PxTransform trans(C2P(position - sceneOrigin), C2P(orientation)); const PxHitFlags hitFlags = PxHitFlag::ePOSITION | PxHitFlag::eNORMAL | PxHitFlag::eFACE_INDEX | PxHitFlag::eUV; PxRaycastHit hit; - if (PxGeometryQuery::raycast(C2P(origin - sceneOrigin), C2P(direction), shapePhysX->getGeometry().any(), trans, maxDistance, hitFlags, 1, &hit) == 0) + if (PxGeometryQuery::raycast(C2P(origin - sceneOrigin), C2P(direction), shapePhysX->getGeometry(), trans, maxDistance, hitFlags, 1, &hit) == 0) return false; P2C(hit, hitInfo); hitInfo.Point += sceneOrigin; @@ -2120,6 +2149,11 @@ void PhysicsBackend::GetJointForce(void* joint, Vector3& linear, Vector3& angula linear = P2C(linearPhysX); angular = P2C(angularPhysX); } + else + { + linear = Vector3::Zero; + angular = Vector3::Zero; + } } void* PhysicsBackend::CreateFixedJoint(const PhysicsJointDesc& desc) @@ -2901,7 +2935,8 @@ void* PhysicsBackend::CreateConvexMesh(byte* data, int32 dataSize, BoundingBox& { PxDefaultMemoryInputData input(data, dataSize); PxConvexMesh* convexMesh = PhysX->createConvexMesh(input); - localBounds = P2C(convexMesh->getLocalBounds()); + if (convexMesh) + localBounds = P2C(convexMesh->getLocalBounds()); return convexMesh; } @@ -2909,7 +2944,8 @@ void* PhysicsBackend::CreateTriangleMesh(byte* data, int32 dataSize, BoundingBox { PxDefaultMemoryInputData input(data, dataSize); PxTriangleMesh* triangleMesh = PhysX->createTriangleMesh(input); - localBounds = P2C(triangleMesh->getLocalBounds()); + if (triangleMesh) + localBounds = P2C(triangleMesh->getLocalBounds()); return triangleMesh; } diff --git a/Source/Engine/Physics/PhysX/PhysicsStepperPhysX.cpp b/Source/Engine/Physics/PhysX/PhysicsStepperPhysX.cpp index a7ba06296..6e7660511 100644 --- a/Source/Engine/Physics/PhysX/PhysicsStepperPhysX.cpp +++ b/Source/Engine/Physics/PhysX/PhysicsStepperPhysX.cpp @@ -32,7 +32,7 @@ bool MultiThreadStepper::advance(PxScene* scene, PxReal dt, void* scratchBlock, mScratchBlockSize = scratchBlockSize; if (!mSync) - mSync = New(); + mSync = New(); substepStrategy(dt, mNbSubSteps, mSubStepSize); diff --git a/Source/Engine/Physics/PhysX/PhysicsStepperPhysX.h b/Source/Engine/Physics/PhysX/PhysicsStepperPhysX.h index 1b616eac2..5c62a6fa3 100644 --- a/Source/Engine/Physics/PhysX/PhysicsStepperPhysX.h +++ b/Source/Engine/Physics/PhysX/PhysicsStepperPhysX.h @@ -7,7 +7,7 @@ #include "Types.h" #include #include -#include +#include class MultiThreadStepper; @@ -135,7 +135,7 @@ protected: StepperTaskSimulate mSimulateTask; StepperTask mCompletion0, mCompletion1; PxScene* mScene; - shdfnd::Sync* mSync; + PxSync* mSync; PxU32 mCurrentSubStep; PxU32 mNbSubSteps; diff --git a/Source/Engine/Physics/PhysX/Types.h b/Source/Engine/Physics/PhysX/Types.h index ed570867d..d95d6b140 100644 --- a/Source/Engine/Physics/PhysX/Types.h +++ b/Source/Engine/Physics/PhysX/Types.h @@ -21,16 +21,44 @@ namespace physx { + template + class PxVec2T; + typedef PxVec2T PxVec2; + + template + class PxVec3T; + typedef PxVec3T PxVec3; + + template + class PxVec4T; + typedef PxVec4T PxVec4; + + template + class PxQuatT; + typedef PxQuatT PxQuat; + + template + class PxMat33T; + typedef PxMat33T PxMat33; + + template + class PxMat34T; + typedef PxMat34T PxMat34; + + template + class PxMat44T; + typedef PxMat44T PxMat44; + + template + class PxTransformT; + typedef PxTransformT PxTransform; + class PxScene; class PxConvexMesh; class PxTriangleMesh; class PxCooking; class PxPhysics; - class PxVec3; - class PxVec4; - class PxTransform; class PxJoint; - class PxMat44; class PxCpuDispatcher; class PxGpuDispatcher; class PxSimulationEventCallback; @@ -55,6 +83,8 @@ namespace physx class PxQueryFilterCallback; class PxControllerFilterCallback; class PxHeightField; + class PxPlane; + class PxBounds3; struct PxFilterData; struct PxRaycastHit; struct PxSweepHit; diff --git a/Source/Engine/Physics/Physics.Build.cs b/Source/Engine/Physics/Physics.Build.cs index 55a972dde..d31e0d271 100644 --- a/Source/Engine/Physics/Physics.Build.cs +++ b/Source/Engine/Physics/Physics.Build.cs @@ -14,6 +14,11 @@ public class Physics : EngineModule /// public static bool WithCooking = true; + /// + /// Enables using PhysX library. Can be overriden by SetupPhysicsBackend. + /// + public static bool WithPhysX = true; + /// /// Physics system extension event to override for custom physics backend plugin. /// @@ -34,6 +39,13 @@ public class Physics : EngineModule private static void SetupPhysicsBackendPhysX(Physics physics, BuildOptions options) { - options.PrivateDependencies.Add("PhysX"); + if (WithPhysX) + { + options.PrivateDependencies.Add("PhysX"); + } + else + { + options.PrivateDefinitions.Add("COMPILE_WITH_EMPTY_PHYSICS"); + } } } diff --git a/Source/Engine/Physics/Physics.cpp b/Source/Engine/Physics/Physics.cpp index 10bf9a7a2..1f9b242ad 100644 --- a/Source/Engine/Physics/Physics.cpp +++ b/Source/Engine/Physics/Physics.cpp @@ -5,6 +5,7 @@ #include "PhysicsBackend.h" #include "PhysicalMaterial.h" #include "PhysicsSettings.h" +#include "PhysicsStatistics.h" #include "Engine/Engine/Time.h" #include "Engine/Engine/EngineService.h" #include "Engine/Profiler/ProfilerCPU.h" @@ -56,7 +57,6 @@ void PhysicsSettings::Deserialize(DeserializeStream& stream, ISerializeModifier* DESERIALIZE(FrictionCombineMode); DESERIALIZE(RestitutionCombineMode); DESERIALIZE(DisableCCD); - DESERIALIZE(EnableAdaptiveForce); DESERIALIZE(MaxDeltaTime); DESERIALIZE(EnableSubstepping); DESERIALIZE(SubstepDeltaTime); @@ -433,6 +433,17 @@ void PhysicsScene::SetOrigin(const Vector3& value) } } +#if COMPILE_WITH_PROFILER + +PhysicsStatistics PhysicsScene::GetStatistics() const +{ + PhysicsStatistics result; + PhysicsBackend::GetSceneStatistics(_scene, result); + return result; +} + +#endif + bool PhysicsScene::Init(const StringView& name, const PhysicsSettings& settings) { if (_scene) diff --git a/Source/Engine/Physics/PhysicsBackend.h b/Source/Engine/Physics/PhysicsBackend.h index fda15a079..f72c7f679 100644 --- a/Source/Engine/Physics/PhysicsBackend.h +++ b/Source/Engine/Physics/PhysicsBackend.h @@ -98,6 +98,9 @@ public: static void AddSceneActor(void* scene, void* actor); static void RemoveSceneActor(void* scene, void* actor); static void AddSceneActorAction(void* scene, void* actor, ActionType action); +#if COMPILE_WITH_PROFILER + static void GetSceneStatistics(void* scene, PhysicsStatistics& result); +#endif // Scene Queries static bool RayCast(void* scene, const Vector3& origin, const Vector3& direction, float maxDistance, uint32 layerMask, bool hitTriggers); diff --git a/Source/Engine/Physics/PhysicsBackendEmpty.cpp b/Source/Engine/Physics/PhysicsBackendEmpty.cpp new file mode 100644 index 000000000..516562e28 --- /dev/null +++ b/Source/Engine/Physics/PhysicsBackendEmpty.cpp @@ -0,0 +1,863 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#if COMPILE_WITH_EMPTY_PHYSICS + +#include "Engine/Core/Log.h" +#include "Engine/Physics/CollisionData.h" +#include "Engine/Physics/PhysicalMaterial.h" +#include "Engine/Physics/PhysicsScene.h" +#include "Engine/Physics/CollisionCooking.h" +#include "Engine/Physics/Actors/IPhysicsActor.h" +#include "Engine/Physics/Joints/Limits.h" +#include "Engine/Physics/Joints/DistanceJoint.h" +#include "Engine/Physics/Joints/HingeJoint.h" +#include "Engine/Physics/Joints/SliderJoint.h" +#include "Engine/Physics/Joints/SphericalJoint.h" +#include "Engine/Physics/Joints/D6Joint.h" +#include "Engine/Physics/Colliders/Collider.h" + +#define DUMY_HANDLE ((void*)1) + +void* PhysicalMaterial::GetPhysicsMaterial() +{ + return DUMY_HANDLE; +} + +void PhysicalMaterial::UpdatePhysicsMaterial() +{ +} + +#if COMPILE_WITH_PHYSICS_COOKING + +bool CollisionCooking::CookConvexMesh(CookingInput& input, BytesContainer& output) +{ + LOG(Error, "No physics."); + return true; +} + +bool CollisionCooking::CookTriangleMesh(CookingInput& input, BytesContainer& output) +{ + LOG(Error, "No physics."); + return true; +} + +bool CollisionCooking::CookHeightField(int32 cols, int32 rows, const PhysicsBackend::HeightFieldSample* data, WriteStream& stream) +{ + LOG(Error, "No physics."); + return true; +} + +#endif + +bool PhysicsBackend::Init() +{ + LOG(Info, "No physics."); + return false; +} + +void PhysicsBackend::Shutdown() +{ +} + +void PhysicsBackend::ApplySettings(const PhysicsSettings& settings) +{ +} + +void* PhysicsBackend::CreateScene(const PhysicsSettings& settings) +{ + return DUMY_HANDLE; +} + +void PhysicsBackend::DestroyScene(void* scene) +{ +} + +void PhysicsBackend::StartSimulateScene(void* scene, float dt) +{ +} + +void PhysicsBackend::EndSimulateScene(void* scene) +{ +} + +Vector3 PhysicsBackend::GetSceneGravity(void* scene) +{ + return Vector3::Zero; +} + +void PhysicsBackend::SetSceneGravity(void* scene, const Vector3& value) +{ +} + +bool PhysicsBackend::GetSceneEnableCCD(void* scene) +{ + return false; +} + +void PhysicsBackend::SetSceneEnableCCD(void* scene, bool value) +{ +} + +float PhysicsBackend::GetSceneBounceThresholdVelocity(void* scene) +{ + return 0.0f; +} + +void PhysicsBackend::SetSceneBounceThresholdVelocity(void* scene, float value) +{ +} + +void PhysicsBackend::SetSceneOrigin(void* scene, const Vector3& oldOrigin, const Vector3& newOrigin) +{ +} + +void PhysicsBackend::AddSceneActor(void* scene, void* actor) +{ +} + +void PhysicsBackend::RemoveSceneActor(void* scene, void* actor) +{ +} + +void PhysicsBackend::AddSceneActorAction(void* scene, void* actor, ActionType action) +{ +} + +#if COMPILE_WITH_PROFILER + +void PhysicsBackend::GetSceneStatistics(void* scene, PhysicsStatistics& result) +{ +} + +#endif + +bool PhysicsBackend::RayCast(void* scene, const Vector3& origin, const Vector3& direction, const float maxDistance, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::RayCast(void* scene, const Vector3& origin, const Vector3& direction, RayCastHit& hitInfo, const float maxDistance, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::RayCastAll(void* scene, const Vector3& origin, const Vector3& direction, Array& results, const float maxDistance, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::BoxCast(void* scene, const Vector3& center, const Vector3& halfExtents, const Vector3& direction, const Quaternion& rotation, const float maxDistance, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::BoxCast(void* scene, const Vector3& center, const Vector3& halfExtents, const Vector3& direction, RayCastHit& hitInfo, const Quaternion& rotation, const float maxDistance, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::BoxCastAll(void* scene, const Vector3& center, const Vector3& halfExtents, const Vector3& direction, Array& results, const Quaternion& rotation, const float maxDistance, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::SphereCast(void* scene, const Vector3& center, const float radius, const Vector3& direction, const float maxDistance, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::SphereCast(void* scene, const Vector3& center, const float radius, const Vector3& direction, RayCastHit& hitInfo, const float maxDistance, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::SphereCastAll(void* scene, const Vector3& center, const float radius, const Vector3& direction, Array& results, const float maxDistance, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::CapsuleCast(void* scene, const Vector3& center, const float radius, const float height, const Vector3& direction, const Quaternion& rotation, const float maxDistance, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::CapsuleCast(void* scene, const Vector3& center, const float radius, const float height, const Vector3& direction, RayCastHit& hitInfo, const Quaternion& rotation, const float maxDistance, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::CapsuleCastAll(void* scene, const Vector3& center, const float radius, const float height, const Vector3& direction, Array& results, const Quaternion& rotation, const float maxDistance, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::ConvexCast(void* scene, const Vector3& center, const CollisionData* convexMesh, const Vector3& scale, const Vector3& direction, const Quaternion& rotation, const float maxDistance, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::ConvexCast(void* scene, const Vector3& center, const CollisionData* convexMesh, const Vector3& scale, const Vector3& direction, RayCastHit& hitInfo, const Quaternion& rotation, const float maxDistance, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::ConvexCastAll(void* scene, const Vector3& center, const CollisionData* convexMesh, const Vector3& scale, const Vector3& direction, Array& results, const Quaternion& rotation, const float maxDistance, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::CheckBox(void* scene, const Vector3& center, const Vector3& halfExtents, const Quaternion& rotation, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::CheckSphere(void* scene, const Vector3& center, const float radius, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::CheckCapsule(void* scene, const Vector3& center, const float radius, const float height, const Quaternion& rotation, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::CheckConvex(void* scene, const Vector3& center, const CollisionData* convexMesh, const Vector3& scale, const Quaternion& rotation, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::OverlapBox(void* scene, const Vector3& center, const Vector3& halfExtents, Array& results, const Quaternion& rotation, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::OverlapSphere(void* scene, const Vector3& center, const float radius, Array& results, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::OverlapCapsule(void* scene, const Vector3& center, const float radius, const float height, Array& results, const Quaternion& rotation, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::OverlapConvex(void* scene, const Vector3& center, const CollisionData* convexMesh, const Vector3& scale, Array& results, const Quaternion& rotation, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::OverlapBox(void* scene, const Vector3& center, const Vector3& halfExtents, Array& results, const Quaternion& rotation, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::OverlapSphere(void* scene, const Vector3& center, const float radius, Array& results, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::OverlapCapsule(void* scene, const Vector3& center, const float radius, const float height, Array& results, const Quaternion& rotation, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +bool PhysicsBackend::OverlapConvex(void* scene, const Vector3& center, const CollisionData* convexMesh, const Vector3& scale, Array& results, const Quaternion& rotation, uint32 layerMask, bool hitTriggers) +{ + return false; +} + +PhysicsBackend::ActorFlags PhysicsBackend::GetActorFlags(void* actor) +{ + return ActorFlags::None; +} + +void PhysicsBackend::SetActorFlags(void* actor, ActorFlags value) +{ +} + +void PhysicsBackend::GetActorBounds(void* actor, BoundingBox& bounds) +{ + bounds = BoundingBox::Empty; +} + +int32 PhysicsBackend::GetRigidActorShapesCount(void* actor) +{ + return 0; +} + +void* PhysicsBackend::CreateRigidDynamicActor(IPhysicsActor* actor, const Vector3& position, const Quaternion& orientation, void* scene) +{ + return DUMY_HANDLE; +} + +void* PhysicsBackend::CreateRigidStaticActor(IPhysicsActor* actor, const Vector3& position, const Quaternion& orientation, void* scene) +{ + return DUMY_HANDLE; +} + +PhysicsBackend::RigidDynamicFlags PhysicsBackend::GetRigidDynamicActorFlags(void* actor) +{ + return RigidDynamicFlags::None; +} + +void PhysicsBackend::SetRigidDynamicActorFlags(void* actor, RigidDynamicFlags value) +{ +} + +void PhysicsBackend::GetRigidActorPose(void* actor, Vector3& position, Quaternion& orientation) +{ + position = Vector3::Zero; + orientation = Quaternion::Identity; +} + +void PhysicsBackend::SetRigidActorPose(void* actor, const Vector3& position, const Quaternion& orientation, bool kinematic, bool wakeUp) +{ +} + +void PhysicsBackend::SetRigidDynamicActorLinearDamping(void* actor, float value) +{ +} + +void PhysicsBackend::SetRigidDynamicActorAngularDamping(void* actor, float value) +{ +} + +void PhysicsBackend::SetRigidDynamicActorMaxAngularVelocity(void* actor, float value) +{ +} + +void PhysicsBackend::SetRigidDynamicActorConstraints(void* actor, RigidbodyConstraints value) +{ +} + +Vector3 PhysicsBackend::GetRigidDynamicActorLinearVelocity(void* actor) +{ + return Vector3::Zero; +} + +void PhysicsBackend::SetRigidDynamicActorLinearVelocity(void* actor, const Vector3& value, bool wakeUp) +{ +} + +Vector3 PhysicsBackend::GetRigidDynamicActorAngularVelocity(void* actor) +{ + return Vector3::Zero; +} + +void PhysicsBackend::SetRigidDynamicActorAngularVelocity(void* actor, const Vector3& value, bool wakeUp) +{ +} + +Vector3 PhysicsBackend::GetRigidDynamicActorCenterOfMass(void* actor) +{ + return Vector3::Zero; +} + +void PhysicsBackend::SetRigidDynamicActorCenterOfMassOffset(void* actor, const Float3& value) +{ +} + +bool PhysicsBackend::GetRigidDynamicActorIsSleeping(void* actor) +{ + return false; +} + +void PhysicsBackend::RigidDynamicActorSleep(void* actor) +{ +} + +void PhysicsBackend::RigidDynamicActorWakeUp(void* actor) +{ +} + +float PhysicsBackend::GetRigidDynamicActorSleepThreshold(void* actor) +{ + return 0.0f; +} + +void PhysicsBackend::SetRigidDynamicActorSleepThreshold(void* actor, float value) +{ +} + +float PhysicsBackend::GetRigidDynamicActorMaxDepenetrationVelocity(void* actor) +{ + return 0.0f; +} + +void PhysicsBackend::SetRigidDynamicActorMaxDepenetrationVelocity(void* actor, float value) +{ +} + +void PhysicsBackend::SetRigidDynamicActorSolverIterationCounts(void* actor, int32 minPositionIters, int32 minVelocityIters) +{ +} + +void PhysicsBackend::UpdateRigidDynamicActorMass(void* actor, float& mass, float massScale, bool autoCalculate) +{ +} + +void PhysicsBackend::AddRigidDynamicActorForce(void* actor, const Vector3& force, ForceMode mode) +{ +} + +void PhysicsBackend::AddRigidDynamicActorForceAtPosition(void* actor, const Vector3& force, const Vector3& position, ForceMode mode) +{ +} + +void PhysicsBackend::AddRigidDynamicActorTorque(void* actor, const Vector3& torque, ForceMode mode) +{ +} + +void* PhysicsBackend::CreateShape(PhysicsColliderActor* collider, const CollisionShape& geometry, JsonAsset* material, bool enabled, bool trigger) +{ + return DUMY_HANDLE; +} + +void PhysicsBackend::SetShapeState(void* shape, bool enabled, bool trigger) +{ +} + +void PhysicsBackend::SetShapeFilterMask(void* shape, uint32 mask0, uint32 mask1) +{ +} + +void* PhysicsBackend::GetShapeActor(void* shape) +{ + return DUMY_HANDLE; +} + +void PhysicsBackend::GetShapePose(void* shape, Vector3& position, Quaternion& orientation) +{ +} + +CollisionShape::Types PhysicsBackend::GetShapeType(void* shape) +{ + return CollisionShape::Types::Box; +} + +void PhysicsBackend::GetShapeLocalPose(void* shape, Vector3& position, Quaternion& orientation) +{ +} + +void PhysicsBackend::SetShapeLocalPose(void* shape, const Vector3& position, const Quaternion& orientation) +{ +} + +void PhysicsBackend::SetShapeContactOffset(void* shape, float value) +{ +} + +void PhysicsBackend::SetShapeMaterial(void* shape, JsonAsset* material) +{ +} + +void PhysicsBackend::SetShapeGeometry(void* shape, const CollisionShape& geometry) +{ +} + +void PhysicsBackend::AttachShape(void* shape, void* actor) +{ +} + +void PhysicsBackend::DetachShape(void* shape, void* actor) +{ +} + +bool PhysicsBackend::ComputeShapesPenetration(void* shapeA, void* shapeB, const Vector3& positionA, const Quaternion& orientationA, const Vector3& positionB, const Quaternion& orientationB, Vector3& direction, float& distance) +{ + direction = Vector3::Forward; + return false; +} + +float PhysicsBackend::ComputeShapeSqrDistanceToPoint(void* shape, const Vector3& position, const Quaternion& orientation, const Vector3& point, Vector3* closestPoint) +{ + return 0.0f; +} + +bool PhysicsBackend::RayCastShape(void* shape, const Vector3& position, const Quaternion& orientation, const Vector3& origin, const Vector3& direction, float& resultHitDistance, float maxDistance) +{ + return false; +} + +bool PhysicsBackend::RayCastShape(void* shape, const Vector3& position, const Quaternion& orientation, const Vector3& origin, const Vector3& direction, RayCastHit& hitInfo, float maxDistance) +{ + return false; +} + +void PhysicsBackend::SetJointFlags(void* joint, JointFlags value) +{ +} + +void PhysicsBackend::SetJointActors(void* joint, void* actors0, void* actor1) +{ +} + +void PhysicsBackend::SetJointActorPose(void* joint, const Vector3& position, const Quaternion& orientation, uint8 index) +{ +} + +void PhysicsBackend::SetJointBreakForce(void* joint, float force, float torque) +{ +} + +void PhysicsBackend::GetJointForce(void* joint, Vector3& linear, Vector3& angular) +{ + linear = Vector3::Zero; + angular = Vector3::Zero; +} + +void* PhysicsBackend::CreateFixedJoint(const PhysicsJointDesc& desc) +{ + return DUMY_HANDLE; +} + +void* PhysicsBackend::CreateDistanceJoint(const PhysicsJointDesc& desc) +{ + return DUMY_HANDLE; +} + +void* PhysicsBackend::CreateHingeJoint(const PhysicsJointDesc& desc) +{ + return DUMY_HANDLE; +} + +void* PhysicsBackend::CreateSliderJoint(const PhysicsJointDesc& desc) +{ + return DUMY_HANDLE; +} + +void* PhysicsBackend::CreateSphericalJoint(const PhysicsJointDesc& desc) +{ + return DUMY_HANDLE; +} + +void* PhysicsBackend::CreateD6Joint(const PhysicsJointDesc& desc) +{ + return DUMY_HANDLE; +} + +void PhysicsBackend::SetDistanceJointFlags(void* joint, DistanceJointFlag flags) +{ +} + +void PhysicsBackend::SetDistanceJointMinDistance(void* joint, float value) +{ +} + +void PhysicsBackend::SetDistanceJointMaxDistance(void* joint, float value) +{ +} + +void PhysicsBackend::SetDistanceJointTolerance(void* joint, float value) +{ +} + +void PhysicsBackend::SetDistanceJointSpring(void* joint, const SpringParameters& value) +{ +} + +float PhysicsBackend::GetDistanceJointDistance(void* joint) +{ + return 0.0f; +} + +void PhysicsBackend::SetHingeJointFlags(void* joint, HingeJointFlag value, bool driveFreeSpin) +{ +} + +void PhysicsBackend::SetHingeJointLimit(void* joint, const LimitAngularRange& value) +{ +} + +void PhysicsBackend::SetHingeJointDrive(void* joint, const HingeJointDrive& value) +{ +} + +float PhysicsBackend::GetHingeJointAngle(void* joint) +{ + return 0.0f; +} + +float PhysicsBackend::GetHingeJointVelocity(void* joint) +{ + return 0.0f; +} + +void PhysicsBackend::SetSliderJointFlags(void* joint, SliderJointFlag value) +{ +} + +void PhysicsBackend::SetSliderJointLimit(void* joint, const LimitLinearRange& value) +{ +} + +float PhysicsBackend::GetSliderJointPosition(void* joint) +{ + return 0.0f; +} + +float PhysicsBackend::GetSliderJointVelocity(void* joint) +{ + return 0.0f; +} + +void PhysicsBackend::SetSphericalJointFlags(void* joint, SphericalJointFlag value) +{ +} + +void PhysicsBackend::SetSphericalJointLimit(void* joint, const LimitConeRange& value) +{ +} + +void PhysicsBackend::SetD6JointMotion(void* joint, D6JointAxis axis, D6JointMotion value) +{ +} + +void PhysicsBackend::SetD6JointDrive(void* joint, const D6JointDriveType index, const D6JointDrive& value) +{ +} + +void PhysicsBackend::SetD6JointLimitLinear(void* joint, const LimitLinear& value) +{ +} + +void PhysicsBackend::SetD6JointLimitTwist(void* joint, const LimitAngularRange& value) +{ +} + +void PhysicsBackend::SetD6JointLimitSwing(void* joint, const LimitConeRange& value) +{ +} + +Vector3 PhysicsBackend::GetD6JointDrivePosition(void* joint) +{ + return Vector3::Zero; +} + +void PhysicsBackend::SetD6JointDrivePosition(void* joint, const Vector3& value) +{ +} + +Quaternion PhysicsBackend::GetD6JointDriveRotation(void* joint) +{ + return Quaternion::Identity; +} + +void PhysicsBackend::SetD6JointDriveRotation(void* joint, const Quaternion& value) +{ +} + +void PhysicsBackend::GetD6JointDriveVelocity(void* joint, Vector3& linear, Vector3& angular) +{ + linear = Vector3::Zero; + angular = Vector3::Zero; +} + +void PhysicsBackend::SetD6JointDriveVelocity(void* joint, const Vector3& linear, const Vector3& angular) +{ +} + +float PhysicsBackend::GetD6JointTwist(void* joint) +{ + return 0.0f; +} + +float PhysicsBackend::GetD6JointSwingY(void* joint) +{ + return 0.0f; +} + +float PhysicsBackend::GetD6JointSwingZ(void* joint) +{ + return 0.0f; +} + +void* PhysicsBackend::CreateController(void* scene, IPhysicsActor* actor, PhysicsColliderActor* collider, float contactOffset, const Vector3& position, float slopeLimit, int32 nonWalkableMode, JsonAsset* material, float radius, float height, float stepOffset, void*& shape) +{ + return DUMY_HANDLE; +} + +void* PhysicsBackend::GetControllerRigidDynamicActor(void* controller) +{ + return DUMY_HANDLE; +} + +void PhysicsBackend::SetControllerSize(void* controller, float radius, float height) +{ +} + +void PhysicsBackend::SetControllerSlopeLimit(void* controller, float value) +{ +} + +void PhysicsBackend::SetControllerNonWalkableMode(void* controller, int32 value) +{ +} + +void PhysicsBackend::SetControllerStepOffset(void* controller, float value) +{ +} + +Vector3 PhysicsBackend::GetControllerUpDirection(void* controller) +{ + return Vector3::Up; +} + +void PhysicsBackend::SetControllerUpDirection(void* controller, const Vector3& value) +{ +} + +Vector3 PhysicsBackend::GetControllerPosition(void* controller) +{ + return Vector3::Zero; +} + +void PhysicsBackend::SetControllerPosition(void* controller, const Vector3& value) +{ +} + +int32 PhysicsBackend::MoveController(void* controller, void* shape, const Vector3& displacement, float minMoveDistance, float deltaTime) +{ + return 0; +} + +#if WITH_VEHICLE + +void* PhysicsBackend::CreateVehicle(WheeledVehicle* actor) +{ + return DUMY_HANDLE; +} + +void PhysicsBackend::DestroyVehicle(void* vehicle, int32 driveType) +{ +} + +void PhysicsBackend::SetVehicleGearbox(void* vehicle, const void* value) +{ +} + +int32 PhysicsBackend::GetVehicleTargetGear(void* vehicle) +{ + return 0; +} + +void PhysicsBackend::SetVehicleTargetGear(void* vehicle, int32 value) +{ +} + +int32 PhysicsBackend::GetVehicleCurrentGear(void* vehicle) +{ + return 0; +} + +void PhysicsBackend::SetVehicleCurrentGear(void* vehicle, int32 value) +{ +} + +float PhysicsBackend::GetVehicleForwardSpeed(void* vehicle) +{ + return 0.0f; +} + +float PhysicsBackend::GetVehicleSidewaysSpeed(void* vehicle) +{ + return 0.0f; +} + +float PhysicsBackend::GetVehicleEngineRotationSpeed(void* vehicle) +{ + return 0.0f; +} + +void PhysicsBackend::AddVehicle(void* scene, WheeledVehicle* actor) +{ +} + +void PhysicsBackend::RemoveVehicle(void* scene, WheeledVehicle* actor) +{ +} + +#endif + +void* PhysicsBackend::CreateConvexMesh(byte* data, int32 dataSize, BoundingBox& localBounds) +{ + return DUMY_HANDLE; +} + +void* PhysicsBackend::CreateTriangleMesh(byte* data, int32 dataSize, BoundingBox& localBounds) +{ + return DUMY_HANDLE; +} + +void* PhysicsBackend::CreateHeightField(byte* data, int32 dataSize) +{ + return DUMY_HANDLE; +} + +void PhysicsBackend::GetConvexMeshTriangles(void* contextMesh, Array& vertexBuffer, Array& indexBuffer) +{ +} + +void PhysicsBackend::GetTriangleMeshTriangles(void* triangleMesh, Array& vertexBuffer, Array& indexBuffer) +{ +} + +const uint32* PhysicsBackend::GetTriangleMeshRemap(void* triangleMesh, uint32& count) +{ + count = 0; + return nullptr; +} + +void PhysicsBackend::GetHeightFieldSize(void* heightField, int32& rows, int32& columns) +{ + rows = 0; + columns = 0; +} + +float PhysicsBackend::GetHeightFieldHeight(void* heightField, float x, float z) +{ + return 0.0f; +} + +bool PhysicsBackend::ModifyHeightField(void* heightField, int32 startCol, int32 startRow, int32 cols, int32 rows, const HeightFieldSample* data) +{ + return true; +} + +void PhysicsBackend::FlushRequests() +{ +} + +void PhysicsBackend::FlushRequests(void* scene) +{ +} + +void PhysicsBackend::DestroyActor(void* actor) +{ +} + +void PhysicsBackend::DestroyShape(void* shape) +{ +} + +void PhysicsBackend::DestroyJoint(void* joint) +{ +} + +void PhysicsBackend::DestroyController(void* controller) +{ +} + +void PhysicsBackend::DestroyObject(void* object) +{ +} + +void PhysicsBackend::RemoveCollider(PhysicsColliderActor* collider) +{ +} + +void PhysicsBackend::RemoveJoint(Joint* joint) +{ +} + +#endif diff --git a/Source/Engine/Physics/PhysicsScene.h b/Source/Engine/Physics/PhysicsScene.h index 9b4fd2911..e238afc98 100644 --- a/Source/Engine/Physics/PhysicsScene.h +++ b/Source/Engine/Physics/PhysicsScene.h @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #pragma once @@ -100,6 +100,13 @@ public: /// API_PROPERTY() void SetOrigin(const Vector3& value); +#if COMPILE_WITH_PROFILER + /// + /// Gets the physics simulation statistics for the scene. + /// + API_PROPERTY() PhysicsStatistics GetStatistics() const; +#endif + public: /// /// Initializes the scene. diff --git a/Source/Engine/Physics/PhysicsSettings.h b/Source/Engine/Physics/PhysicsSettings.h index c90d50c42..1533665e8 100644 --- a/Source/Engine/Physics/PhysicsSettings.h +++ b/Source/Engine/Physics/PhysicsSettings.h @@ -43,12 +43,6 @@ public: API_FIELD(Attributes="EditorOrder(70), EditorDisplay(\"Simulation\")") bool DisableCCD = false; - /// - /// Enables adaptive forces to accelerate convergence of the solver. Can improve physics simulation performance but lead to artifacts. - /// - API_FIELD(Attributes="EditorOrder(80), EditorDisplay(\"Simulation\")") - bool EnableAdaptiveForce = false; - /// /// The maximum allowed delta time (in seconds) for the physics simulation step. /// diff --git a/Source/Engine/Physics/PhysicsStatistics.h b/Source/Engine/Physics/PhysicsStatistics.h new file mode 100644 index 000000000..acb4393e9 --- /dev/null +++ b/Source/Engine/Physics/PhysicsStatistics.h @@ -0,0 +1,40 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#pragma once + +#include "Types.h" +#include "Engine/Scripting/ScriptingType.h" + +/// +/// Physics simulation statistics container for profiler. +/// +API_STRUCT(NoDefault) struct FLAXENGINE_API PhysicsStatistics +{ + DECLARE_SCRIPTING_TYPE_MINIMAL(PhysicsStatistics); + + // Number of active dynamic bodies for the current simulation step. Does not include active kinematic bodies. + API_FIELD() uint32 ActiveDynamicBodies; + // Number of active kinematic bodies for the current simulation step. + API_FIELD() uint32 ActiveKinematicBodies; + // Number of active joints object for the current simulation step. + API_FIELD() uint32 ActiveJoints; + // Number of static bodies for the current simulation step. + API_FIELD() uint32 StaticBodies; + // Number of dynamic bodies for the current simulation step. + API_FIELD() uint32 DynamicBodies; + // Number of kinematic bodies for the current simulation step. + API_FIELD() uint32 KinematicBodies; + // Number of new pairs found during this frame. + API_FIELD() uint32 NewPairs; + // Number of lost pairs during this frame. + API_FIELD() uint32 LostPairs; + // Number of new touches found during this frame. + API_FIELD() uint32 NewTouches; + // Number of lost touches during this frame. + API_FIELD() uint32 LostTouches; + + PhysicsStatistics() + { + Platform::MemoryClear(this, sizeof(PhysicsStatistics)); + } +}; diff --git a/Source/Engine/Physics/Types.h b/Source/Engine/Physics/Types.h index b5b34ceec..ed12f8611 100644 --- a/Source/Engine/Physics/Types.h +++ b/Source/Engine/Physics/Types.h @@ -7,6 +7,7 @@ #include "Engine/Core/Math/Vector3.h" #include "Engine/Scripting/ScriptingType.h" +struct PhysicsStatistics; class PhysicsColliderActor; class PhysicsScene; class Joint; diff --git a/Source/Engine/Platform/Android/AndroidDefines.h b/Source/Engine/Platform/Android/AndroidDefines.h index b94634227..ecb034d30 100644 --- a/Source/Engine/Platform/Android/AndroidDefines.h +++ b/Source/Engine/Platform/Android/AndroidDefines.h @@ -33,4 +33,6 @@ #define PLATFORM_TYPE PlatformType::Android #define PLATFORM_CACHE_LINE_SIZE 64 +#define USE_MONO_AOT_MODE MONO_AOT_MODE_NONE + #endif diff --git a/Source/Engine/Platform/Android/AndroidFileSystem.cpp b/Source/Engine/Platform/Android/AndroidFileSystem.cpp index 0d76e34af..78fa8953d 100644 --- a/Source/Engine/Platform/Android/AndroidFileSystem.cpp +++ b/Source/Engine/Platform/Android/AndroidFileSystem.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2019 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #if PLATFORM_ANDROID @@ -249,13 +249,13 @@ bool AndroidFileSystem::DeleteFile(const StringView& path) uint64 AndroidFileSystem::GetFileSize(const StringView& path) { struct stat fileInfo; - fileInfo.st_size = -1; + fileInfo.st_size = 0; const StringAsANSI<> pathANSI(*path, path.Length()); if (stat(pathANSI.Get(), &fileInfo) != -1) { if (S_ISDIR(fileInfo.st_mode)) { - fileInfo.st_size = -1; + fileInfo.st_size = 0; } } else diff --git a/Source/Engine/Platform/Android/AndroidPlatform.cpp b/Source/Engine/Platform/Android/AndroidPlatform.cpp index 28481c97f..c61e2aadd 100644 --- a/Source/Engine/Platform/Android/AndroidPlatform.cpp +++ b/Source/Engine/Platform/Android/AndroidPlatform.cpp @@ -996,16 +996,6 @@ Float2 AndroidPlatform::GetDesktopSize() return Float2((float)ScreenWidth, (float)ScreenHeight); } -Rectangle AndroidPlatform::GetMonitorBounds(const Float2& screenPos) -{ - return Rectangle(Float2::Zero, GetDesktopSize()); -} - -Rectangle AndroidPlatform::GetVirtualDesktopBounds() -{ - return Rectangle(Float2::Zero, GetDesktopSize()); -} - String AndroidPlatform::GetMainDirectory() { return String(App->activity->internalDataPath); diff --git a/Source/Engine/Platform/Android/AndroidPlatform.h b/Source/Engine/Platform/Android/AndroidPlatform.h index 941836ce6..07e72cac4 100644 --- a/Source/Engine/Platform/Android/AndroidPlatform.h +++ b/Source/Engine/Platform/Android/AndroidPlatform.h @@ -120,9 +120,7 @@ public: static void OpenUrl(const StringView& url); static Float2 GetMousePosition(); static void SetMousePosition(const Float2& pos); - static Rectangle GetMonitorBounds(const Float2& screenPos); static Float2 GetDesktopSize(); - static Rectangle GetVirtualDesktopBounds(); static String GetMainDirectory(); static String GetExecutableFilePath(); static Guid GetUniqueDeviceId(); diff --git a/Source/Engine/Platform/Android/AndroidWindow.h b/Source/Engine/Platform/Android/AndroidWindow.h index 7fca1111d..367c9b16e 100644 --- a/Source/Engine/Platform/Android/AndroidWindow.h +++ b/Source/Engine/Platform/Android/AndroidWindow.h @@ -23,7 +23,7 @@ public: public: - // [Window] + // [WindowBase] void* GetNativePtr() const override; void Show() override; void Hide() override; diff --git a/Source/Engine/Platform/Apple/AppleFileSystem.cpp b/Source/Engine/Platform/Apple/AppleFileSystem.cpp new file mode 100644 index 000000000..cc18fc3ed --- /dev/null +++ b/Source/Engine/Platform/Apple/AppleFileSystem.cpp @@ -0,0 +1,532 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#if PLATFORM_MAC || PLATFORM_IOS + +#include "AppleFileSystem.h" +#include "AppleUtils.h" +#include "Engine/Platform/File.h" +#include "Engine/Core/Types/String.h" +#include "Engine/Core/Types/StringView.h" +#include "Engine/Core/Types/TimeSpan.h" +#include "Engine/Core/Math/Math.h" +#include "Engine/Core/Log.h" +#include "Engine/Utilities/StringConverter.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const DateTime UnixEpoch(1970, 1, 1); + +bool AppleFileSystem::CreateDirectory(const StringView& path) +{ + const StringAsANSI<> pathAnsi(*path, path.Length()); + + // Skip if already exists + struct stat fileInfo; + if (stat(pathAnsi.Get(), &fileInfo) != -1 && S_ISDIR(fileInfo.st_mode)) + { + return false; + } + + // Recursively do it all again for the parent directory, if any + const int32 slashIndex = path.FindLast('/'); + if (slashIndex > 1) + { + if (CreateDirectory(path.Substring(0, slashIndex))) + { + return true; + } + } + + // Create the last directory on the path (the recursive calls will have taken care of the parent directories by now) + return mkdir(pathAnsi.Get(), 0755) != 0 && errno != EEXIST; +} + +bool DeletePathTree(const char* path) +{ + size_t pathLength; + DIR* dir; + struct stat statPath, statEntry; + struct dirent* entry; + + // Stat for the path + stat(path, &statPath); + + // If path does not exists or is not dir - exit with status -1 + if (S_ISDIR(statPath.st_mode) == 0) + { + // Is not directory + return true; + } + + // If not possible to read the directory for this user + if ((dir = opendir(path)) == NULL) + { + // Cannot open directory + return true; + } + + // The length of the path + pathLength = strlen(path); + + // Iteration through entries in the directory + while ((entry = readdir(dir)) != NULL) + { + // Skip entries "." and ".." + if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) + continue; + + // Determinate a full path of an entry + char full_path[256]; + ASSERT(pathLength + strlen(entry->d_name) < ARRAY_COUNT(full_path)); + strcpy(full_path, path); + strcat(full_path, "/"); + strcat(full_path, entry->d_name); + + // Stat for the entry + stat(full_path, &statEntry); + + // Recursively remove a nested directory + if (S_ISDIR(statEntry.st_mode) != 0) + { + if (DeletePathTree(full_path)) + return true; + continue; + } + + // Remove a file object + if (unlink(full_path) != 0) + return true; + } + + // Remove the devastated directory and close the object of it + if (rmdir(path) != 0) + return true; + + closedir(dir); + + return false; +} + +bool AppleFileSystem::DeleteDirectory(const String& path, bool deleteContents) +{ + const StringAsANSI<> pathANSI(*path, path.Length()); + if (deleteContents) + return DeletePathTree(pathANSI.Get()); + return rmdir(pathANSI.Get()) != 0; +} + +bool AppleFileSystem::DirectoryExists(const StringView& path) +{ + struct stat fileInfo; + const StringAsANSI<> pathANSI(*path, path.Length()); + if (stat(pathANSI.Get(), &fileInfo) != -1) + { + return S_ISDIR(fileInfo.st_mode); + } + return false; +} + +bool AppleFileSystem::DirectoryGetFiles(Array& results, const String& path, const Char* searchPattern, DirectorySearchOption option) +{ + const StringAsANSI<> pathANSI(*path, path.Length()); + const StringAsANSI<> searchPatternANSI(searchPattern); + + // Check if use only top directory + if (option == DirectorySearchOption::TopDirectoryOnly) + return getFilesFromDirectoryTop(results, pathANSI.Get(), searchPatternANSI.Get()); + return getFilesFromDirectoryAll(results, pathANSI.Get(), searchPatternANSI.Get()); +} + +bool AppleFileSystem::GetChildDirectories(Array& results, const String& directory) +{ + size_t pathLength; + DIR* dir; + struct stat statPath, statEntry; + struct dirent* entry; + const StringAsANSI<> pathANSI(*directory, directory.Length()); + const char* path = pathANSI.Get(); + + // Stat for the path + stat(path, &statPath); + + // If path does not exists or is not dir - exit with status -1 + if (S_ISDIR(statPath.st_mode) == 0) + { + // Is not directory + return true; + } + + // If not possible to read the directory for this user + if ((dir = opendir(path)) == NULL) + { + // Cannot open directory + return true; + } + + // The length of the path + pathLength = strlen(path); + + // Iteration through entries in the directory + while ((entry = readdir(dir)) != NULL) + { + // Skip entries "." and ".." + if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) + continue; + + // Determinate a full path of an entry + char full_path[256]; + ASSERT(pathLength + strlen(entry->d_name) < ARRAY_COUNT(full_path)); + strcpy(full_path, path); + strcat(full_path, "/"); + strcat(full_path, entry->d_name); + + // Stat for the entry + stat(full_path, &statEntry); + + // Check for directory + if (S_ISDIR(statEntry.st_mode) != 0) + { + // Add directory + results.Add(String(full_path)); + } + } + + closedir(dir); + + return false; +} + +bool AppleFileSystem::FileExists(const StringView& path) +{ + struct stat fileInfo; + const StringAsANSI<> pathANSI(*path, path.Length()); + if (stat(pathANSI.Get(), &fileInfo) != -1) + { + return S_ISREG(fileInfo.st_mode); + } + return false; +} + +bool AppleFileSystem::DeleteFile(const StringView& path) +{ + const StringAsANSI<> pathANSI(*path, path.Length()); + return unlink(pathANSI.Get()) == 0; +} + +uint64 AppleFileSystem::GetFileSize(const StringView& path) +{ + struct stat fileInfo; + fileInfo.st_size = 0; + const StringAsANSI<> pathANSI(*path, path.Length()); + if (stat(pathANSI.Get(), &fileInfo) != -1) + { + // Check for directories + if (S_ISDIR(fileInfo.st_mode)) + { + fileInfo.st_size = 0; + } + } + return fileInfo.st_size; +} + +bool AppleFileSystem::IsReadOnly(const StringView& path) +{ + const StringAsANSI<> pathANSI(*path, path.Length()); + if (access(pathANSI.Get(), W_OK) == -1) + { + return errno == EACCES; + } + return false; +} + +bool AppleFileSystem::SetReadOnly(const StringView& path, bool isReadOnly) +{ + const StringAsANSI<> pathANSI(*path, path.Length()); + struct stat fileInfo; + if (stat(pathANSI.Get(), &fileInfo) != -1) + { + if (isReadOnly) + { + fileInfo.st_mode &= ~S_IWUSR; + } + else + { + fileInfo.st_mode |= S_IWUSR; + } + return chmod(pathANSI.Get(), fileInfo.st_mode) == 0; + } + return false; +} + +bool AppleFileSystem::MoveFile(const StringView& dst, const StringView& src, bool overwrite) +{ + if (!overwrite && FileExists(dst)) + { + // Already exists + return true; + } + + if (overwrite) + { + unlink(StringAsANSI<>(*dst, dst.Length()).Get()); + } + if (rename(StringAsANSI<>(*src, src.Length()).Get(), StringAsANSI<>(*dst, dst.Length()).Get()) != 0) + { + if (errno == EXDEV) + { + if (!CopyFile(dst, src)) + { + unlink(StringAsANSI<>(*src, src.Length()).Get()); + return false; + } + } + return true; + } + return false; +} + +bool AppleFileSystem::CopyFile(const StringView& dst, const StringView& src) +{ + const StringAsANSI<> srcANSI(*src, src.Length()); + const StringAsANSI<> dstANSI(*dst, dst.Length()); + + int srcFile, dstFile; + char buffer[4096]; + ssize_t readSize; + int cachedError; + + srcFile = open(srcANSI.Get(), O_RDONLY); + if (srcFile < 0) + return true; + dstFile = open(dstANSI.Get(), O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); + if (dstFile < 0) + goto out_error; + + while (readSize = read(srcFile, buffer, sizeof(buffer)), readSize > 0) + { + char* ptr = buffer; + ssize_t writeSize; + + do + { + writeSize = write(dstFile, ptr, readSize); + if (writeSize >= 0) + { + readSize -= writeSize; + ptr += writeSize; + } + else if (errno != EINTR) + { + goto out_error; + } + } while (readSize > 0); + } + + if (readSize == 0) + { + if (close(dstFile) < 0) + { + dstFile = -1; + goto out_error; + } + close(srcFile); + + // Success + return false; + } + +out_error: + cachedError = errno; + close(srcFile); + if (dstFile >= 0) + close(dstFile); + errno = cachedError; + return true; +} + +bool AppleFileSystem::getFilesFromDirectoryTop(Array& results, const char* path, const char* searchPattern) +{ + size_t pathLength; + struct stat statPath, statEntry; + struct dirent* entry; + + // Stat for the path + stat(path, &statPath); + + // If path does not exists or is not dir - exit with status -1 + if (S_ISDIR(statPath.st_mode) == 0) + { + // Is not directory + return true; + } + + // If not possible to read the directory for this user + DIR* dir = opendir(path); + if (dir == NULL) + { + // Cannot open directory + return true; + } + + // The length of the path + pathLength = strlen(path); + + // Iteration through entries in the directory + while ((entry = readdir(dir)) != NULL) + { + // Skip entries "." and ".." + if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) + continue; + + // Determinate a full path of an entry + char fullPath[256]; + ASSERT(pathLength + strlen(entry->d_name) < ARRAY_COUNT(fullPath)); + strcpy(fullPath, path); + strcat(fullPath, "/"); + strcat(fullPath, entry->d_name); + + // Stat for the entry + stat(fullPath, &statEntry); + + // Check for file + if (S_ISREG(statEntry.st_mode) != 0) + { + // Validate with filter + const int32 fullPathLength = StringUtils::Length(fullPath); + const int32 searchPatternLength = StringUtils::Length(searchPattern); + if (searchPatternLength == 0 || StringUtils::Compare(searchPattern, "*") == 0) + { + // All files + } + else if (searchPattern[0] == '*' && searchPatternLength < fullPathLength && StringUtils::Compare(fullPath + fullPathLength - searchPatternLength + 1, searchPattern + 1, searchPatternLength - 1) == 0) + { + // Path ending + } + else + { + // TODO: implement all cases in a generic way + continue; + } + + // Add file + results.Add(String(fullPath)); + } + } + + closedir(dir); + + return false; +} + +bool AppleFileSystem::getFilesFromDirectoryAll(Array& results, const char* path, const char* searchPattern) +{ + // Find all files in this directory + getFilesFromDirectoryTop(results, path, searchPattern); + + size_t pathLength; + DIR* dir; + struct stat statPath, statEntry; + struct dirent* entry; + + // Stat for the path + stat(path, &statPath); + + // If path does not exists or is not dir - exit with status -1 + if (S_ISDIR(statPath.st_mode) == 0) + { + // Is not directory + return true; + } + + // If not possible to read the directory for this user + if ((dir = opendir(path)) == NULL) + { + // Cannot open directory + return true; + } + + // The length of the path + pathLength = strlen(path); + + // Iteration through entries in the directory + while ((entry = readdir(dir)) != NULL) + { + // Skip entries "." and ".." + if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) + continue; + + // Determinate a full path of an entry + char full_path[256]; + ASSERT(pathLength + strlen(entry->d_name) < ARRAY_COUNT(full_path)); + strcpy(full_path, path); + strcat(full_path, "/"); + strcat(full_path, entry->d_name); + + // Stat for the entry + stat(full_path, &statEntry); + + // Check for directory + if (S_ISDIR(statEntry.st_mode) != 0) + { + if (getFilesFromDirectoryAll(results, full_path, searchPattern)) + { + closedir(dir); + return true; + } + } + } + + closedir(dir); + + return false; +} + +DateTime AppleFileSystem::GetFileLastEditTime(const StringView& path) +{ + struct stat fileInfo; + const StringAsANSI<> pathANSI(*path, path.Length()); + if (stat(pathANSI.Get(), &fileInfo) == -1) + { + return DateTime::MinValue(); + } + + const TimeSpan timeSinceEpoch(0, 0, fileInfo.st_mtime); + return UnixEpoch + timeSinceEpoch; +} + +void AppleFileSystem::GetSpecialFolderPath(const SpecialFolder type, String& result) +{ + String home; + Platform::GetEnvironmentVariable(TEXT("HOME"), home); + switch (type) + { + case SpecialFolder::Desktop: + result = home / TEXT("/Desktop"); + break; + case SpecialFolder::Documents: + result = home / TEXT("/Documents"); + break; + case SpecialFolder::Pictures: + result = home / TEXT("/Pictures"); + break; + case SpecialFolder::AppData: + case SpecialFolder::LocalAppData: + result = home / TEXT("/Library/Caches"); + break; + case SpecialFolder::ProgramData: + result = home / TEXT("/Library/Application Support"); + break; + case SpecialFolder::Temporary: + Platform::GetEnvironmentVariable(TEXT("TMPDIR"), result); + break; + } +} + +#endif diff --git a/Source/Engine/Platform/Apple/AppleFileSystem.h b/Source/Engine/Platform/Apple/AppleFileSystem.h new file mode 100644 index 000000000..b07f91fb1 --- /dev/null +++ b/Source/Engine/Platform/Apple/AppleFileSystem.h @@ -0,0 +1,52 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#pragma once + +#if PLATFORM_MAC || PLATFORM_IOS + +#include "Engine/Platform/Base/FileSystemBase.h" + +/// +/// Apple platform implementation of filesystem service. +/// +class FLAXENGINE_API AppleFileSystem : public FileSystemBase +{ +public: + + // [FileSystemBase] + static bool CreateDirectory(const StringView& path); + static bool DeleteDirectory(const String& path, bool deleteContents = true); + static bool DirectoryExists(const StringView& path); + static bool DirectoryGetFiles(Array& results, const String& path, const Char* searchPattern, DirectorySearchOption option = DirectorySearchOption::AllDirectories); + static bool GetChildDirectories(Array& results, const String& directory); + static bool FileExists(const StringView& path); + static bool DeleteFile(const StringView& path); + static uint64 GetFileSize(const StringView& path); + static bool IsReadOnly(const StringView& path); + static bool SetReadOnly(const StringView& path, bool isReadOnly); + static bool MoveFile(const StringView& dst, const StringView& src, bool overwrite = false); + static bool CopyFile(const StringView& dst, const StringView& src); + +public: + + /// + /// Gets last time when file has been modified (in UTC). + /// + /// The file path to check. + /// The last write time or DateTime::MinValue() if cannot get data. + static DateTime GetFileLastEditTime(const StringView& path); + + /// + /// Gets the special folder path. + /// + /// The folder type. + /// The result full path. + static void GetSpecialFolderPath(const SpecialFolder type, String& result); + +private: + + static bool getFilesFromDirectoryTop(Array& results, const char* path, const char* searchPattern); + static bool getFilesFromDirectoryAll(Array& results, const char* path, const char* searchPattern); +}; + +#endif diff --git a/Source/Engine/Platform/Apple/ApplePlatform.cpp b/Source/Engine/Platform/Apple/ApplePlatform.cpp new file mode 100644 index 000000000..8ae5a484f --- /dev/null +++ b/Source/Engine/Platform/Apple/ApplePlatform.cpp @@ -0,0 +1,423 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#if PLATFORM_MAC || PLATFORM_IOS + +#include "ApplePlatform.h" +#include "AppleUtils.h" +#include "Engine/Core/Log.h" +#include "Engine/Core/Types/Guid.h" +#include "Engine/Core/Types/String.h" +#include "Engine/Core/Collections/HashFunctions.h" +#include "Engine/Core/Collections/Array.h" +#include "Engine/Core/Collections/Dictionary.h" +#include "Engine/Core/Collections/HashFunctions.h" +#include "Engine/Core/Math/Math.h" +#include "Engine/Core/Math/Rectangle.h" +#include "Engine/Core/Math/Color32.h" +#include "Engine/Platform/CPUInfo.h" +#include "Engine/Platform/MemoryStats.h" +#include "Engine/Platform/StringUtils.h" +#include "Engine/Platform/WindowsManager.h" +#include "Engine/Platform/Clipboard.h" +#include "Engine/Platform/IGuiData.h" +#include "Engine/Platform/Base/PlatformUtils.h" +#include "Engine/Utilities/StringConverter.h" +#include "Engine/Threading/Threading.h" +#include "Engine/Engine/Engine.h" +#include "Engine/Engine/CommandLine.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if CRASH_LOG_ENABLE +#include +#endif + +CPUInfo Cpu; +String UserLocale; +double SecondsPerCycle; +NSAutoreleasePool* AutoreleasePool = nullptr; + +float ApplePlatform::ScreenScale = 1.0f; + +String AppleUtils::ToString(CFStringRef str) +{ + if (!str) + return String::Empty; + String result; + const int32 length = CFStringGetLength(str); + if (length > 0) + { + CFRange range = CFRangeMake(0, length); + result.ReserveSpace(length); + CFStringGetBytes(str, range, kCFStringEncodingUTF16LE, '?', false, (uint8*)result.Get(), length * sizeof(Char), nullptr); + } + return result; +} + +CFStringRef AppleUtils::ToString(const StringView& str) +{ + return CFStringCreateWithBytes(nullptr, (const UInt8*)str.GetText(), str.Length() * sizeof(Char), kCFStringEncodingUTF16LE, false); +} + +typedef uint16_t offset_t; +#define align_mem_up(num, align) (((num) + ((align) - 1)) & ~((align) - 1)) + +bool ApplePlatform::Is64BitPlatform() +{ + return PLATFORM_64BITS; +} + +CPUInfo ApplePlatform::GetCPUInfo() +{ + return Cpu; +} + +int32 ApplePlatform::GetCacheLineSize() +{ + return Cpu.CacheLineSize; +} + +MemoryStats ApplePlatform::GetMemoryStats() +{ + MemoryStats result; + int64 value64; + size_t value64Size = sizeof(value64); + if (sysctlbyname("hw.memsize", &value64, &value64Size, nullptr, 0) != 0) + value64 = 1024 * 1024; + result.TotalPhysicalMemory = value64; + int id[] = { CTL_HW, HW_MEMSIZE }; + if (sysctl(id, 2, &value64, &value64Size, nullptr, 0) != 0) + value64Size = 1024; + result.UsedPhysicalMemory = value64Size; + xsw_usage swapusage; + size_t swapusageSize = sizeof(swapusage); + result.TotalVirtualMemory = result.TotalPhysicalMemory; + result.UsedVirtualMemory = result.UsedPhysicalMemory; + if (sysctlbyname("vm.swapusage", &swapusage, &swapusageSize, nullptr, 0) == 0) + { + result.TotalVirtualMemory += swapusage.xsu_total; + result.UsedVirtualMemory += swapusage.xsu_used; + } + return result; +} + +ProcessMemoryStats ApplePlatform::GetProcessMemoryStats() +{ + ProcessMemoryStats result; + result.UsedPhysicalMemory = 1024; + result.UsedVirtualMemory = 1024; + return result; +} + +uint64 ApplePlatform::GetCurrentThreadID() +{ + return (uint64)pthread_mach_thread_np(pthread_self()); +} + +void ApplePlatform::SetThreadPriority(ThreadPriority priority) +{ + // TODO: impl this +} + +void ApplePlatform::SetThreadAffinityMask(uint64 affinityMask) +{ + // TODO: impl this +} + +void ApplePlatform::Sleep(int32 milliseconds) +{ + usleep(milliseconds * 1000); +} + +double ApplePlatform::GetTimeSeconds() +{ + return SecondsPerCycle * mach_absolute_time(); +} + +uint64 ApplePlatform::GetTimeCycles() +{ + return mach_absolute_time(); +} + +uint64 ApplePlatform::GetClockFrequency() +{ + return (uint64)(1.0 / SecondsPerCycle); +} + +void ApplePlatform::GetSystemTime(int32& year, int32& month, int32& dayOfWeek, int32& day, int32& hour, int32& minute, int32& second, int32& millisecond) +{ + // Query for calendar time + struct timeval time; + gettimeofday(&time, nullptr); + + // Convert to local time + struct tm localTime; + localtime_r(&time.tv_sec, &localTime); + + // Extract time + year = localTime.tm_year + 1900; + month = localTime.tm_mon + 1; + dayOfWeek = localTime.tm_wday; + day = localTime.tm_mday; + hour = localTime.tm_hour; + minute = localTime.tm_min; + second = localTime.tm_sec; + millisecond = time.tv_usec / 1000; +} + +void ApplePlatform::GetUTCTime(int32& year, int32& month, int32& dayOfWeek, int32& day, int32& hour, int32& minute, int32& second, int32& millisecond) +{ + // Get the calendar time + struct timeval time; + gettimeofday(&time, nullptr); + + // Convert to UTC time + struct tm localTime; + gmtime_r(&time.tv_sec, &localTime); + + // Extract time + year = localTime.tm_year + 1900; + month = localTime.tm_mon + 1; + dayOfWeek = localTime.tm_wday; + day = localTime.tm_mday; + hour = localTime.tm_hour; + minute = localTime.tm_min; + second = localTime.tm_sec; + millisecond = time.tv_usec / 1000; +} + +void ApplePlatform::Log(const StringView& msg) +{ +#if !BUILD_RELEASE && !USE_EDITOR + NSLog(@"%s", StringAsANSI<>(*msg, msg.Length()).Get()); +#endif +} + +bool ApplePlatform::Init() +{ + if (UnixPlatform::Init()) + return true; + + // Init timing + { + mach_timebase_info_data_t info; + mach_timebase_info(&info); + SecondsPerCycle = 1e-9 * (double)info.numer / (double)info.denom; + } + + // Get CPU info + int32 value32; + int64 value64; + size_t value32Size = sizeof(value32), value64Size = sizeof(value64); + if (sysctlbyname("hw.packages", &value32, &value32Size, nullptr, 0) != 0) + value32 = 1; + Cpu.ProcessorPackageCount = value32; + if (sysctlbyname("hw.physicalcpu", &value32, &value32Size, nullptr, 0) != 0) + value32 = 1; + Cpu.ProcessorCoreCount = value32; + if (sysctlbyname("hw.logicalcpu", &value32, &value32Size, nullptr, 0) != 0) + value32 = 1; + Cpu.LogicalProcessorCount = value32; + if (sysctlbyname("hw.l1icachesize", &value32, &value32Size, nullptr, 0) != 0) + value32 = 0; + Cpu.L1CacheSize = value32; + if (sysctlbyname("hw.l2cachesize", &value32, &value32Size, nullptr, 0) != 0) + value32 = 0; + Cpu.L2CacheSize = value32; + if (sysctlbyname("hw.l3cachesize", &value32, &value32Size, nullptr, 0) != 0) + value32 = 0; + Cpu.L3CacheSize = value32; + if (sysctlbyname("hw.pagesize", &value32, &value32Size, nullptr, 0) != 0) + value32 = vm_page_size; + Cpu.PageSize = value32; + if (sysctlbyname("hw.cpufrequency_max", &value64, &value64Size, nullptr, 0) != 0) + value64 = GetClockFrequency(); + Cpu.ClockSpeed = value64; + if (sysctlbyname("hw.cachelinesize", &value32, &value32Size, nullptr, 0) != 0) + value32 = PLATFORM_CACHE_LINE_SIZE; + Cpu.CacheLineSize = value32; + + // Get locale + { + CFLocaleRef locale = CFLocaleCopyCurrent(); + CFStringRef localeLang = (CFStringRef)CFLocaleGetValue(locale, kCFLocaleLanguageCode); + CFStringRef localeCountry = (CFStringRef)CFLocaleGetValue(locale, kCFLocaleCountryCode); + UserLocale = AppleUtils::ToString(localeLang); + String localeCountryStr = AppleUtils::ToString(localeCountry); + if (localeCountryStr.HasChars()) + UserLocale += TEXT("-") + localeCountryStr; + CFRelease(locale); + CFRelease(localeLang); + CFRelease(localeCountry); + } + + // Init user + { + String username; + GetEnvironmentVariable(TEXT("USER"), username); + OnPlatformUserAdd(New(username)); + } + + AutoreleasePool = [[NSAutoreleasePool alloc] init]; + + return false; +} + +void ApplePlatform::Tick() +{ + // TODO: do it once every X fames + [AutoreleasePool drain]; + AutoreleasePool = [[NSAutoreleasePool alloc] init]; +} + +void ApplePlatform::BeforeExit() +{ +} + +void ApplePlatform::Exit() +{ +} + +void ApplePlatform::SetHighDpiAwarenessEnabled(bool enable) +{ + // Disable resolution scaling in low dpi mode + if (!enable) + { + CustomDpiScale /= ScreenScale; + ScreenScale = 1.0f; + } +} + +String ApplePlatform::GetUserLocaleName() +{ + return UserLocale; +} + +bool ApplePlatform::GetHasFocus() +{ + // Check if any window is focused + ScopeLock lock(WindowsManager::WindowsLocker); + for (auto window : WindowsManager::Windows) + { + if (window->IsFocused()) + return true; + } + + // Default to true if has no windows open + return WindowsManager::Windows.IsEmpty(); +} + +void ApplePlatform::CreateGuid(Guid& result) +{ + uuid_t uuid; + uuid_generate(uuid); + auto ptr = (uint32*)&uuid; + result.A = ptr[0]; + result.B = ptr[1]; + result.C = ptr[2]; + result.D = ptr[3]; +} + +String ApplePlatform::GetExecutableFilePath() +{ + char buf[PATH_MAX]; + uint32 size = PATH_MAX; + String result; + if (_NSGetExecutablePath(buf, &size) == 0) + result.SetUTF8(buf, StringUtils::Length(buf)); + return result; +} + +String ApplePlatform::GetWorkingDirectory() +{ + char buffer[256]; + getcwd(buffer, ARRAY_COUNT(buffer)); + return String(buffer); +} + +bool ApplePlatform::SetWorkingDirectory(const String& path) +{ + return chdir(StringAsANSI<>(*path).Get()) != 0; +} + +bool ApplePlatform::GetEnvironmentVariable(const String& name, String& value) +{ + char* env = getenv(StringAsANSI<>(*name).Get()); + if (env) + { + value = String(env); + return false; + } + return true; +} + +bool ApplePlatform::SetEnvironmentVariable(const String& name, const String& value) +{ + return setenv(StringAsANSI<>(*name).Get(), StringAsANSI<>(*value).Get(), true) != 0; +} + +void* ApplePlatform::LoadLibrary(const Char* filename) +{ + const StringAsANSI<> filenameANSI(filename); + void* result = dlopen(filenameANSI.Get(), RTLD_LAZY | RTLD_LOCAL); + if (!result) + { + LOG(Error, "Failed to load {0} because {1}", filename, String(dlerror())); + } + return result; +} + +void ApplePlatform::FreeLibrary(void* handle) +{ + dlclose(handle); +} + +void* ApplePlatform::GetProcAddress(void* handle, const char* symbol) +{ + return dlsym(handle, symbol); +} + +Array ApplePlatform::GetStackFrames(int32 skipCount, int32 maxDepth, void* context) +{ + Array result; +#if CRASH_LOG_ENABLE + void* callstack[120]; + skipCount = Math::Min(skipCount, ARRAY_COUNT(callstack)); + int32 maxCount = Math::Min(ARRAY_COUNT(callstack), skipCount + maxDepth); + int32 count = backtrace(callstack, maxCount); + int32 useCount = count - skipCount; + if (useCount > 0) + { + char** names = backtrace_symbols(callstack + skipCount, useCount); + result.Resize(useCount); + for (int32 i = 0; i < useCount; i++) + { + char* name = names[i]; + StackFrame& frame = result[i]; + frame.ProgramCounter = callstack[skipCount + i]; + frame.ModuleName[0] = 0; + frame.FileName[0] = 0; + frame.LineNumber = 0; + int32 nameLen = Math::Min(StringUtils::Length(name), ARRAY_COUNT(frame.FunctionName) - 1); + Platform::MemoryCopy(frame.FunctionName, name, nameLen); + frame.FunctionName[nameLen] = 0; + + } + free(names); + } +#endif + return result; +} + +#endif diff --git a/Source/Engine/Platform/Apple/ApplePlatform.h b/Source/Engine/Platform/Apple/ApplePlatform.h new file mode 100644 index 000000000..f1148d0b6 --- /dev/null +++ b/Source/Engine/Platform/Apple/ApplePlatform.h @@ -0,0 +1,104 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#pragma once + +#if PLATFORM_MAC || PLATFORM_IOS + +#include "../Unix/UnixPlatform.h" + +/// +/// The Apple platform implementation and application management utilities. +/// +class FLAXENGINE_API ApplePlatform : public UnixPlatform +{ +public: + static float ScreenScale; + +public: + + // [UnixPlatform] + FORCE_INLINE static void MemoryBarrier() + { + __sync_synchronize(); + } + FORCE_INLINE static int64 InterlockedExchange(int64 volatile* dst, int64 exchange) + { + return __sync_lock_test_and_set(dst, exchange); + } + FORCE_INLINE static int32 InterlockedCompareExchange(int32 volatile* dst, int32 exchange, int32 comperand) + { + return __sync_val_compare_and_swap(dst, comperand, exchange); + } + FORCE_INLINE static int64 InterlockedCompareExchange(int64 volatile* dst, int64 exchange, int64 comperand) + { + return __sync_val_compare_and_swap(dst, comperand, exchange); + } + FORCE_INLINE static int64 InterlockedIncrement(int64 volatile* dst) + { + return __sync_add_and_fetch(dst, 1); + } + FORCE_INLINE static int64 InterlockedDecrement(int64 volatile* dst) + { + return __sync_sub_and_fetch(dst, 1); + } + FORCE_INLINE static int64 InterlockedAdd(int64 volatile* dst, int64 value) + { + return __sync_fetch_and_add(dst, value); + } + FORCE_INLINE static int32 AtomicRead(int32 volatile* dst) + { + return __atomic_load_n(dst, __ATOMIC_RELAXED); + } + FORCE_INLINE static int64 AtomicRead(int64 volatile* dst) + { + return __atomic_load_n(dst, __ATOMIC_RELAXED); + } + FORCE_INLINE static void AtomicStore(int32 volatile* dst, int32 value) + { + __atomic_store(dst, &value, __ATOMIC_SEQ_CST); + } + FORCE_INLINE static void AtomicStore(int64 volatile* dst, int64 value) + { + __atomic_store(dst, &value, __ATOMIC_SEQ_CST); + } + FORCE_INLINE static void Prefetch(void const* ptr) + { + __builtin_prefetch(static_cast(ptr)); + } + static bool Is64BitPlatform(); + static CPUInfo GetCPUInfo(); + static int32 GetCacheLineSize(); + static MemoryStats GetMemoryStats(); + static ProcessMemoryStats GetProcessMemoryStats(); + static uint64 GetCurrentThreadID(); + static void SetThreadPriority(ThreadPriority priority); + static void SetThreadAffinityMask(uint64 affinityMask); + static void Sleep(int32 milliseconds); + static double GetTimeSeconds(); + static uint64 GetTimeCycles(); + static uint64 GetClockFrequency(); + static void GetSystemTime(int32& year, int32& month, int32& dayOfWeek, int32& day, int32& hour, int32& minute, int32& second, int32& millisecond); + static void GetUTCTime(int32& year, int32& month, int32& dayOfWeek, int32& day, int32& hour, int32& minute, int32& second, int32& millisecond); + static void Log(const StringView& msg); + static bool Init(); + static void Tick(); + static void BeforeExit(); + static void Exit(); + static void SetHighDpiAwarenessEnabled(bool enable); + static String GetUserLocaleName(); + static bool GetHasFocus(); + static void CreateGuid(Guid& result); + static Float2 GetDesktopSize(); + static String GetMainDirectory(); + static String GetExecutableFilePath(); + static String GetWorkingDirectory(); + static bool SetWorkingDirectory(const String& path); + static bool GetEnvironmentVariable(const String& name, String& value); + static bool SetEnvironmentVariable(const String& name, const String& value); + static void* LoadLibrary(const Char* filename); + static void FreeLibrary(void* handle); + static void* GetProcAddress(void* handle, const char* symbol); + static Array GetStackFrames(int32 skipCount = 0, int32 maxDepth = 60, void* context = nullptr); +}; + +#endif diff --git a/Source/Engine/Platform/Apple/ApplePlatformSettings.h b/Source/Engine/Platform/Apple/ApplePlatformSettings.h new file mode 100644 index 000000000..57ad58449 --- /dev/null +++ b/Source/Engine/Platform/Apple/ApplePlatformSettings.h @@ -0,0 +1,41 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#pragma once + +#if PLATFORM_IOS || PLATFORM_MAC || USE_EDITOR + +#include "Engine/Core/Config/PlatformSettingsBase.h" +#include "Engine/Core/Types/String.h" +#include "Engine/Scripting/SoftObjectReference.h" + +class Texture; + +/// +/// Apple platform settings. +/// +API_CLASS(Abstract, Namespace="FlaxEditor.Content.Settings") class FLAXENGINE_API ApplePlatformSettings : public SettingsBase +{ + DECLARE_SCRIPTING_TYPE_MINIMAL(ApplePlatformSettings); + + /// + /// The app identifier (reversed DNS, eg. com.company.product). Custom tokens: ${PROJECT_NAME}, ${COMPANY_NAME}. + /// + API_FIELD(Attributes="EditorOrder(0), EditorDisplay(\"General\")") + String AppIdentifier = TEXT("com.${COMPANY_NAME}.${PROJECT_NAME}"); + + /// + /// Custom icon texture to use for the application (overrides the default one). + /// + API_FIELD(Attributes="EditorOrder(1000), EditorDisplay(\"Other\")") + SoftObjectReference OverrideIcon; + +public: + // [SettingsBase] + void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) override + { + DESERIALIZE(AppIdentifier); + DESERIALIZE(OverrideIcon); + } +}; + +#endif diff --git a/Source/Engine/Platform/Mac/MacThread.h b/Source/Engine/Platform/Apple/AppleThread.h similarity index 78% rename from Source/Engine/Platform/Mac/MacThread.h rename to Source/Engine/Platform/Apple/AppleThread.h index f49969628..43d9d2966 100644 --- a/Source/Engine/Platform/Mac/MacThread.h +++ b/Source/Engine/Platform/Apple/AppleThread.h @@ -2,25 +2,25 @@ #pragma once -#if PLATFORM_MAC +#if PLATFORM_MAC || PLATFORM_IOS #include "../Unix/UnixThread.h" #include /// -/// Thread object for Mac platform. +/// Thread object for Apple platform. /// -class FLAXENGINE_API MacThread : public UnixThread +class FLAXENGINE_API AppleThread : public UnixThread { public: /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The runnable. /// The thread name. /// The thread priority. - MacThread(IRunnable* runnable, const String& name, ThreadPriority priority) + AppleThread(IRunnable* runnable, const String& name, ThreadPriority priority) : UnixThread(runnable, name, priority) { } @@ -35,9 +35,9 @@ public: /// Tells the thread whether it needs to adjust its priority or not. Defaults to normal priority /// The size of the stack to create. 0 means use the current thread's stack size /// Pointer to the new thread or null if cannot create it - static MacThread* Create(IRunnable* runnable, const String& name, ThreadPriority priority = ThreadPriority::Normal, uint32 stackSize = 0) + static AppleThread* Create(IRunnable* runnable, const String& name, ThreadPriority priority = ThreadPriority::Normal, uint32 stackSize = 0) { - return (MacThread*)Setup(New(runnable, name, priority), stackSize); + return (AppleThread*)Setup(New(runnable, name, priority), stackSize); } protected: diff --git a/Source/Engine/Platform/Mac/MacUtils.h b/Source/Engine/Platform/Apple/AppleUtils.h similarity index 78% rename from Source/Engine/Platform/Mac/MacUtils.h rename to Source/Engine/Platform/Apple/AppleUtils.h index b89ff24b6..d6f639042 100644 --- a/Source/Engine/Platform/Mac/MacUtils.h +++ b/Source/Engine/Platform/Apple/AppleUtils.h @@ -2,15 +2,22 @@ #pragma once +#if PLATFORM_MAC || PLATFORM_IOS + #include "Engine/Core/Types/String.h" #include -class FLAXENGINE_API MacUtils +// Apple platform utilities. +class AppleUtils { public: static String ToString(CFStringRef str); static CFStringRef ToString(const StringView& str); +#if PLATFORM_MAC static Float2 PosToCoca(const Float2& pos); static Float2 CocaToPos(const Float2& pos); static Float2 GetScreensOrigin(); +#endif }; + +#endif diff --git a/Source/Engine/Platform/Base/ClipboardBase.h b/Source/Engine/Platform/Base/ClipboardBase.h index 6ab176c38..68ca235f9 100644 --- a/Source/Engine/Platform/Base/ClipboardBase.h +++ b/Source/Engine/Platform/Base/ClipboardBase.h @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2019 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #pragma once diff --git a/Source/Engine/Platform/Base/FileSystemBase.cpp b/Source/Engine/Platform/Base/FileSystemBase.cpp index 34cf7af38..f2f45a6d4 100644 --- a/Source/Engine/Platform/Base/FileSystemBase.cpp +++ b/Source/Engine/Platform/Base/FileSystemBase.cpp @@ -247,6 +247,16 @@ bool FileSystemBase::CopyDirectory(const String& dst, const String& src, bool wi return FileSystemBase::DirectoryCopyHelper(dst, src, withSubDirectories); } +uint64 FileSystemBase::GetDirectorySize(const StringView& path) +{ + uint64 result = 0; + Array files; + FileSystem::DirectoryGetFiles(files, path, TEXT("*"), DirectorySearchOption::AllDirectories); + for (const String& file : files) + result += FileSystem::GetFileSize(file); + return result; +} + String FileSystemBase::ConvertRelativePathToAbsolute(const String& path) { return ConvertRelativePathToAbsolute(Globals::StartupFolder, path); diff --git a/Source/Engine/Platform/Base/FileSystemBase.h b/Source/Engine/Platform/Base/FileSystemBase.h index fc3d75bb1..e7bd83ed8 100644 --- a/Source/Engine/Platform/Base/FileSystemBase.h +++ b/Source/Engine/Platform/Base/FileSystemBase.h @@ -134,6 +134,7 @@ public: static bool CopyFile(const String& dst, const String& src); static bool CopyDirectory(const String& dst, const String& src, bool withSubDirectories); + static uint64 GetDirectorySize(const StringView& path); public: diff --git a/Source/Engine/Platform/Base/PlatformBase.cpp b/Source/Engine/Platform/Base/PlatformBase.cpp index 89fcc1011..d15bec61c 100644 --- a/Source/Engine/Platform/Base/PlatformBase.cpp +++ b/Source/Engine/Platform/Base/PlatformBase.cpp @@ -197,8 +197,8 @@ void PlatformBase::OnMemoryAlloc(void* ptr, uint64 size) #if TRACY_ENABLE_MEMORY // Track memory allocation in Tracy - //tracy::Profiler::MemAlloc(ptr, size, false); - tracy::Profiler::MemAllocCallstack(ptr, size, 12, false); + //tracy::Profiler::MemAlloc(ptr, (size_t)size, false); + tracy::Profiler::MemAllocCallstack(ptr, (size_t)size, 12, false); #endif // Register allocation during the current CPU event @@ -521,6 +521,15 @@ void PlatformBase::CreateGuid(Guid& result) result = Guid(dateThingHigh, randomThing | (sequentialThing << 16), cyclesThing, dateThingLow); } +bool PlatformBase::CanOpenUrl(const StringView& url) +{ + return false; +} + +void PlatformBase::OpenUrl(const StringView& url) +{ +} + Float2 PlatformBase::GetMousePosition() { const Window* win = Engine::MainWindow; @@ -536,6 +545,16 @@ void PlatformBase::SetMousePosition(const Float2& position) win->SetMousePosition(win->ScreenToClient(position)); } +Rectangle PlatformBase::GetMonitorBounds(const Float2& screenPos) +{ + return Rectangle(Float2::Zero, Platform::GetDesktopSize()); +} + +Rectangle PlatformBase::GetVirtualDesktopBounds() +{ + return Rectangle(Float2::Zero, Platform::GetDesktopSize()); +} + Float2 PlatformBase::GetVirtualDesktopSize() { return Platform::GetVirtualDesktopBounds().Size; @@ -558,23 +577,50 @@ bool PlatformBase::SetEnvironmentVariable(const String& name, const String& valu return true; } -int32 PlatformBase::StartProcess(const StringView& filename, const StringView& args, const StringView& workingDir, bool hiddenWindow, bool waitForEnd) +int32 PlatformBase::CreateProcess(CreateProcessSettings& settings) { // Not supported return -1; } +PRAGMA_DISABLE_DEPRECATION_WARNINGS + +#include "Engine/Platform/CreateProcessSettings.h" + +int32 PlatformBase::StartProcess(const StringView& filename, const StringView& args, const StringView& workingDir, bool hiddenWindow, bool waitForEnd) +{ + CreateProcessSettings procSettings; + procSettings.FileName = filename; + procSettings.Arguments = args; + procSettings.WorkingDirectory = workingDir; + procSettings.HiddenWindow = hiddenWindow; + procSettings.WaitForEnd = waitForEnd; + procSettings.LogOutput = waitForEnd; + procSettings.ShellExecute = true; + return Platform::CreateProcess(procSettings); +} + int32 PlatformBase::RunProcess(const StringView& cmdLine, const StringView& workingDir, bool hiddenWindow) { - return Platform::RunProcess(cmdLine, workingDir, Dictionary(), hiddenWindow); + CreateProcessSettings procSettings; + procSettings.FileName = cmdLine; + procSettings.WorkingDirectory = workingDir; + procSettings.HiddenWindow = hiddenWindow; + return Platform::CreateProcess(procSettings); } int32 PlatformBase::RunProcess(const StringView& cmdLine, const StringView& workingDir, const Dictionary& environment, bool hiddenWindow) { - // Not supported - return -1; + CreateProcessSettings procSettings; + procSettings.FileName = cmdLine; + procSettings.WorkingDirectory = workingDir; + procSettings.Environment = environment; + procSettings.HiddenWindow = hiddenWindow; + return Platform::CreateProcess(procSettings); } +PRAGMA_ENABLE_DEPRECATION_WARNINGS + Array PlatformBase::GetStackFrames(int32 skipCount, int32 maxDepth, void* context) { return Array(); @@ -632,6 +678,8 @@ const Char* ToString(PlatformType type) return TEXT("PlayStation 5"); case PlatformType::Mac: return TEXT("Mac"); + case PlatformType::iOS: + return TEXT("iOS"); default: return TEXT(""); } diff --git a/Source/Engine/Platform/Base/PlatformBase.h b/Source/Engine/Platform/Base/PlatformBase.h index 7b06fa3d0..2780d3fa4 100644 --- a/Source/Engine/Platform/Base/PlatformBase.h +++ b/Source/Engine/Platform/Base/PlatformBase.h @@ -10,6 +10,7 @@ struct Guid; struct CPUInfo; struct MemoryStats; struct ProcessMemoryStats; +struct CreateProcessSettings; struct CreateWindowSettings; struct BatteryInfo; @@ -166,7 +167,6 @@ DECLARE_SCRIPTING_TYPE_MINIMAL(PlatformBase); static void Exit(); public: - /// /// Copy memory region /// @@ -333,7 +333,6 @@ public: static void FreePages(void* ptr); public: - /// /// Returns the current runtime platform type. It's compile-time constant. /// @@ -408,7 +407,6 @@ public: static void Sleep(int32 milliseconds) = delete; public: - /// /// Gets the current time in seconds. /// @@ -454,7 +452,6 @@ public: static void GetUTCTime(int32& year, int32& month, int32& dayOfWeek, int32& day, int32& hour, int32& minute, int32& second, int32& millisecond) = delete; public: - /// /// Shows the fatal error message to the user. /// @@ -481,7 +478,6 @@ public: static void Info(const Char* msg); public: - /// /// Shows the fatal error message to the user. /// @@ -519,7 +515,6 @@ public: static bool IsDebuggerPresent(); public: - /// /// Performs a fatal crash. /// @@ -559,7 +554,6 @@ public: static void CheckFailed(const char* message, const char* file, int line); public: - /// /// Sets the High DPI awareness. /// @@ -627,7 +621,6 @@ public: static void CreateGuid(Guid& result); public: - /// /// The list of users. /// @@ -644,22 +637,20 @@ public: API_EVENT() static Delegate UserRemoved; public: - /// /// Returns a value indicating whether can open a given URL in a web browser. /// /// The URI to assign to web browser. /// True if can open URL, otherwise false. - API_FUNCTION() static bool CanOpenUrl(const StringView& url) = delete; + API_FUNCTION() static bool CanOpenUrl(const StringView& url); /// /// Launches a web browser and opens a given URL. /// /// The URI to assign to web browser. - API_FUNCTION() static void OpenUrl(const StringView& url) = delete; + API_FUNCTION() static void OpenUrl(const StringView& url); public: - /// /// Gets the mouse cursor position in screen-space coordinates. /// @@ -677,7 +668,7 @@ public: /// /// The screen position (in pixels). /// The monitor bounds. - API_FUNCTION() static Rectangle GetMonitorBounds(const Float2& screenPos) = delete; + API_FUNCTION() static Rectangle GetMonitorBounds(const Float2& screenPos); /// /// Gets size of the primary desktop. @@ -689,7 +680,7 @@ public: /// Gets virtual bounds of the desktop made of all the monitors outputs attached. /// /// Whole desktop size. - API_PROPERTY() static Rectangle GetVirtualDesktopBounds() = delete; + API_PROPERTY() static Rectangle GetVirtualDesktopBounds(); /// /// Gets virtual size of the desktop made of all the monitors outputs attached. @@ -697,7 +688,6 @@ public: API_PROPERTY() static Float2 GetVirtualDesktopSize(); public: - /// /// Gets full path of the main engine directory. /// @@ -730,7 +720,6 @@ public: static bool SetWorkingDirectory(const String& path); public: - /// /// Gets the process environment variables (pairs of key and value). /// @@ -754,9 +743,9 @@ public: static bool SetEnvironmentVariable(const String& name, const String& value); public: - /// /// Starts a new process (runs app). + /// [Deprecated in v1.6] /// /// The path to the executable file. /// Custom arguments for command line @@ -764,26 +753,35 @@ public: /// True if start process with hidden window /// True if wait for process competition /// Retrieves the termination status of the specified process. Valid only if processed ended. - API_FUNCTION() static int32 StartProcess(const StringView& filename, const StringView& args, const StringView& workingDir, bool hiddenWindow = false, bool waitForEnd = false); + API_FUNCTION() DEPRECATED static int32 StartProcess(const StringView& filename, const StringView& args, const StringView& workingDir, bool hiddenWindow = false, bool waitForEnd = false); /// /// Starts a new process (runs commandline). Waits for it's end and captures its output. + /// [Deprecated in v1.6] /// /// Command line to execute /// The custom path of the working directory. /// True if start process with hidden window. /// Retrieves the termination status of the specified process. Valid only if processed ended. - API_FUNCTION() static int32 RunProcess(const StringView& cmdLine, const StringView& workingDir, bool hiddenWindow = true); + API_FUNCTION() DEPRECATED static int32 RunProcess(const StringView& cmdLine, const StringView& workingDir, bool hiddenWindow = true); /// /// Starts a new process (runs commandline). Waits for it's end and captures its output. + /// [Deprecated in v1.6] /// /// Command line to execute /// The custom path of the working directory. /// The process environment variables. If null the current process environment is used. /// True if start process with hidden window. /// Retrieves the termination status of the specified process. Valid only if processed ended. - API_FUNCTION() static int32 RunProcess(const StringView& cmdLine, const StringView& workingDir, const Dictionary& environment, bool hiddenWindow = true); + API_FUNCTION() DEPRECATED static int32 RunProcess(const StringView& cmdLine, const StringView& workingDir, const Dictionary& environment, bool hiddenWindow = true); + + /// + /// Creates a new process. + /// + /// The process settings. + /// Retrieves the termination status of the specified process. Valid only if processed ended. + API_FUNCTION() static int32 CreateProcess(API_PARAM(Ref) CreateProcessSettings& settings); /// /// Creates the window. diff --git a/Source/Engine/Platform/Base/StringUtilsBase.cpp b/Source/Engine/Platform/Base/StringUtilsBase.cpp index ce895bfa4..ef4e66b72 100644 --- a/Source/Engine/Platform/Base/StringUtilsBase.cpp +++ b/Source/Engine/Platform/Base/StringUtilsBase.cpp @@ -11,9 +11,9 @@ #include #endif -const char DirectorySeparatorChar = '\\'; -const char AltDirectorySeparatorChar = '/'; -const char VolumeSeparatorChar = ':'; +constexpr char DirectorySeparatorChar = '\\'; +constexpr char AltDirectorySeparatorChar = '/'; +constexpr char VolumeSeparatorChar = ':'; const Char* StringUtils::FindIgnoreCase(const Char* str, const Char* toFind) { @@ -337,18 +337,23 @@ void StringUtils::PathRemoveRelativeParts(String& path) path.Split(TEXT('/'), components); Array> stack; - for (auto& bit : components) + for (String& bit : components) { if (bit == TEXT("..")) { if (stack.HasItems()) { - auto popped = stack.Pop(); + String popped = stack.Pop(); + const int32 windowsDriveStart = popped.Find('\\'); if (popped == TEXT("..")) { stack.Push(popped); stack.Push(bit); } + else if (windowsDriveStart != -1) + { + stack.Add(MoveTemp(popped.Left(windowsDriveStart + 1))); + } } else { @@ -361,32 +366,29 @@ void StringUtils::PathRemoveRelativeParts(String& path) } else { - stack.Push(bit); + stack.Add(MoveTemp(bit)); } } const bool isRooted = path.StartsWith(TEXT('/')) || (path.Length() >= 2 && path[0] == '.' && path[1] == '/'); path.Clear(); - for (auto& e : stack) + for (const String& e : stack) path /= e; if (isRooted && path.HasChars() && path[0] != '/') path.Insert(0, TEXT("/")); } -const char DigitPairs[201] = { - "00010203040506070809" - "10111213141516171819" - "20212223242526272829" - "30313233343536373839" - "40414243444546474849" - "50515253545556575859" - "60616263646566676869" - "70717273747576777879" - "80818283848586878889" - "90919293949596979899" -}; - -#define STRING_UTILS_ITOSTR_BUFFER_SIZE 15 +int32 StringUtils::HexDigit(Char c) +{ + int32 result = 0; + if (c >= '0' && c <= '9') + result = c - '0'; + else if (c >= 'a' && c <= 'f') + result = c + 10 - 'a'; + else if (c >= 'A' && c <= 'F') + result = c + 10 - 'A'; + return result; +} bool StringUtils::Parse(const Char* str, float* result) { @@ -414,108 +416,22 @@ bool StringUtils::Parse(const char* str, float* result) String StringUtils::ToString(int32 value) { - char buf[STRING_UTILS_ITOSTR_BUFFER_SIZE]; - char* it = &buf[STRING_UTILS_ITOSTR_BUFFER_SIZE - 2]; - int32 div = value / 100; - if (value >= 0) - { - while (div) - { - Platform::MemoryCopy(it, &DigitPairs[2 * (value - div * 100)], 2); - value = div; - it -= 2; - div = value / 100; - } - Platform::MemoryCopy(it, &DigitPairs[2 * value], 2); - if (value < 10) - it++; - } - else - { - while (div) - { - Platform::MemoryCopy(it, &DigitPairs[-2 * (value - div * 100)], 2); - value = div; - it -= 2; - div = value / 100; - } - Platform::MemoryCopy(it, &DigitPairs[-2 * value], 2); - if (value <= -10) - it--; - *it = '-'; - } - return String(it, (int32)(&buf[STRING_UTILS_ITOSTR_BUFFER_SIZE] - it)); + return String::Format(TEXT("{}"), value); } String StringUtils::ToString(int64 value) { - char buf[STRING_UTILS_ITOSTR_BUFFER_SIZE]; - char* it = &buf[STRING_UTILS_ITOSTR_BUFFER_SIZE - 2]; - int64 div = value / 100; - if (value >= 0) - { - while (div) - { - Platform::MemoryCopy(it, &DigitPairs[2 * (value - div * 100)], 2); - value = div; - it -= 2; - div = value / 100; - } - Platform::MemoryCopy(it, &DigitPairs[2 * value], 2); - if (value < 10) - it++; - } - else - { - while (div) - { - Platform::MemoryCopy(it, &DigitPairs[-2 * (value - div * 100)], 2); - value = div; - it -= 2; - div = value / 100; - } - Platform::MemoryCopy(it, &DigitPairs[-2 * value], 2); - if (value <= -10) - it--; - *it = '-'; - } - return String(it, (int32)(&buf[STRING_UTILS_ITOSTR_BUFFER_SIZE] - it)); + return String::Format(TEXT("{}"), value); } String StringUtils::ToString(uint32 value) { - char buf[STRING_UTILS_ITOSTR_BUFFER_SIZE]; - char* it = &buf[STRING_UTILS_ITOSTR_BUFFER_SIZE - 2]; - int32 div = value / 100; - while (div) - { - Platform::MemoryCopy(it, &DigitPairs[2 * (value - div * 100)], 2); - value = div; - it -= 2; - div = value / 100; - } - Platform::MemoryCopy(it, &DigitPairs[2 * value], 2); - if (value < 10) - it++; - return String((char*)it, (int32)((char*)&buf[STRING_UTILS_ITOSTR_BUFFER_SIZE] - (char*)it)); + return String::Format(TEXT("{}"), value); } String StringUtils::ToString(uint64 value) { - char buf[STRING_UTILS_ITOSTR_BUFFER_SIZE]; - char* it = &buf[STRING_UTILS_ITOSTR_BUFFER_SIZE - 2]; - int64 div = value / 100; - while (div) - { - Platform::MemoryCopy(it, &DigitPairs[2 * (value - div * 100)], 2); - value = div; - it -= 2; - div = value / 100; - } - Platform::MemoryCopy(it, &DigitPairs[2 * value], 2); - if (value < 10) - it++; - return String((char*)it, (int32)((char*)&buf[STRING_UTILS_ITOSTR_BUFFER_SIZE] - (char*)it)); + return String::Format(TEXT("{}"), value); } String StringUtils::ToString(float value) @@ -539,5 +455,3 @@ String StringUtils::GetZZString(const Char* str) } return String(str, (int32)(end - str)); } - -#undef STRING_UTILS_ITOSTR_BUFFER_SIZE diff --git a/Source/Engine/Platform/Base/ThreadBase.cpp b/Source/Engine/Platform/Base/ThreadBase.cpp index be45ceeab..3c4782bee 100644 --- a/Source/Engine/Platform/Base/ThreadBase.cpp +++ b/Source/Engine/Platform/Base/ThreadBase.cpp @@ -111,7 +111,7 @@ int32 ThreadBase::Run() _isRunning = false; ThreadExiting(thread, exitCode); ThreadRegistry::Remove(thread); - MCore::ExitThread(); // TODO: use mono_thread_detach instead of ext and unlink mono runtime from thread in ThreadExiting delegate + MCore::Thread::Exit(); // TODO: use mono_thread_detach instead of ext and unlink mono runtime from thread in ThreadExiting delegate // mono terminates the native thread.. return exitCode; diff --git a/Source/Engine/Platform/Base/WindowBase.cpp b/Source/Engine/Platform/Base/WindowBase.cpp index 3b60f1121..e2460e373 100644 --- a/Source/Engine/Platform/Base/WindowBase.cpp +++ b/Source/Engine/Platform/Base/WindowBase.cpp @@ -10,15 +10,12 @@ #include "Engine/Platform/IGuiData.h" #include "Engine/Scripting/ScriptingType.h" #include "Engine/Profiler/ProfilerCPU.h" -#include "Engine/Scripting/MException.h" +#include "Engine/Scripting/ManagedCLR/MException.h" #include "Engine/Scripting/ManagedCLR/MUtils.h" #include "Engine/Scripting/ManagedCLR/MMethod.h" #include "Engine/Scripting/ManagedCLR/MClass.h" -#if USE_MONO -#include -#endif -#if USE_MONO +#if USE_CSHARP // Helper macros for calling C# events #define BEGIN_INVOKE_EVENT(name, paramsCount) \ auto managedInstance = GetManagedInstance(); \ @@ -68,10 +65,11 @@ isText = false; data->GetAsFiles(&outputData); \ } \ params[1] = (void*)&isText; \ - MonoArray* outputDataMono = mono_array_new(mono_domain_get(), mono_get_string_class(), outputData.Count()); \ + MArray* outputDataManaged = MCore::Array::New(MCore::TypeCache::String, outputData.Count()); \ + MString** outputDataManagedPtr = MCore::Array::GetAddress(outputDataManaged); \ for (int32 i = 0; i < outputData.Count(); i++) \ - *(MonoString**)mono_array_addr_with_size(outputDataMono, sizeof(MonoString*), i) = MUtils::ToString(outputData[i]); \ - params[2] = outputDataMono; \ + outputDataManagedPtr[i] = MUtils::ToString(outputData[i]); \ + params[2] = outputDataManaged; \ MObject* exception = nullptr; \ auto resultObj = _method_##name->Invoke(GetManagedInstance(), params, &exception); \ if (resultObj) \ diff --git a/Source/Engine/Platform/ConditionVariable.h b/Source/Engine/Platform/ConditionVariable.h index b2cd6289b..fe939671f 100644 --- a/Source/Engine/Platform/ConditionVariable.h +++ b/Source/Engine/Platform/ConditionVariable.h @@ -4,7 +4,7 @@ #if PLATFORM_WINDOWS || PLATFORM_UWP || PLATFORM_XBOX_ONE || PLATFORM_XBOX_SCARLETT #include "Win32/Win32ConditionVariable.h" -#elif PLATFORM_LINUX || PLATFORM_ANDROID || PLATFORM_PS4 || PLATFORM_PS5 || PLATFORM_MAC +#elif PLATFORM_LINUX || PLATFORM_ANDROID || PLATFORM_PS4 || PLATFORM_PS5 || PLATFORM_MAC || PLATFORM_IOS #include "Unix/UnixConditionVariable.h" #elif PLATFORM_SWITCH #include "Platforms/Switch/Engine/Platform/SwitchConditionVariable.h" diff --git a/Source/Engine/Platform/CreateProcessSettings.h b/Source/Engine/Platform/CreateProcessSettings.h new file mode 100644 index 000000000..8fa8ae0c0 --- /dev/null +++ b/Source/Engine/Platform/CreateProcessSettings.h @@ -0,0 +1,65 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#pragma once + +#include "Engine/Core/Types/String.h" +#include "Engine/Core/Collections/Array.h" +#include "Engine/Core/Collections/Dictionary.h" + +/// +/// Settings for new process. +/// +API_STRUCT(NoDefault) struct CreateProcessSettings +{ + DECLARE_SCRIPTING_TYPE_MINIMAL(CreateProcessSettings); + + /// + /// The path to the executable file. + /// + API_FIELD() String FileName; + + /// + /// The custom arguments for command line. + /// + API_FIELD() String Arguments; + + /// + /// The custom folder path where start process. Empty if unused. + /// + API_FIELD() String WorkingDirectory; + + /// + /// True if capture process output and print to the log. + /// + API_FIELD() bool LogOutput = true; + + /// + /// True if capture process output and store it as Output text array. + /// + API_FIELD() bool SaveOutput = false; + + /// + /// True if wait for the process execution end. + /// + API_FIELD() bool WaitForEnd = true; + + /// + /// True if hint process to hide window. Supported only on Windows platform. + /// + API_FIELD() bool HiddenWindow = true; + + /// + /// True if use operating system shell to start the process. Supported only on Windows platform. + /// + API_FIELD() bool ShellExecute = false; + + /// + /// Custom environment variables to set for the process. Empty if unused. Additionally newly spawned process inherits this process vars which can be overriden here. + /// + API_FIELD() Dictionary Environment; + + /// + /// Output process contents. + /// + API_FIELD() Array Output; +}; diff --git a/Source/Engine/Platform/CriticalSection.h b/Source/Engine/Platform/CriticalSection.h index fc72b715e..9f2c724f5 100644 --- a/Source/Engine/Platform/CriticalSection.h +++ b/Source/Engine/Platform/CriticalSection.h @@ -4,7 +4,7 @@ #if PLATFORM_WINDOWS || PLATFORM_UWP || PLATFORM_XBOX_ONE || PLATFORM_XBOX_SCARLETT #include "Win32/Win32CriticalSection.h" -#elif PLATFORM_LINUX || PLATFORM_ANDROID || PLATFORM_PS4 || PLATFORM_PS5 || PLATFORM_MAC +#elif PLATFORM_LINUX || PLATFORM_ANDROID || PLATFORM_PS4 || PLATFORM_PS5 || PLATFORM_MAC || PLATFORM_IOS #include "Unix/UnixCriticalSection.h" #elif PLATFORM_SWITCH #include "Platforms/Switch/Engine/Platform/SwitchCriticalSection.h" diff --git a/Source/Engine/Platform/Defines.h b/Source/Engine/Platform/Defines.h index 0506cadc1..dadecf06b 100644 --- a/Source/Engine/Platform/Defines.h +++ b/Source/Engine/Platform/Defines.h @@ -22,6 +22,7 @@ API_ENUM() enum class PlatformType /// /// Running Windows Store App (Universal Windows Platform). /// + API_ENUM(Attributes="EditorDisplay(null, \"UWP\")") UWP = 3, /// @@ -32,6 +33,7 @@ API_ENUM() enum class PlatformType /// /// Running on PlayStation 4. /// + API_ENUM(Attributes="EditorDisplay(null, \"PS4\")") PS4 = 5, /// @@ -52,12 +54,19 @@ API_ENUM() enum class PlatformType /// /// Running on PlayStation 5. /// + API_ENUM(Attributes="EditorDisplay(null, \"PS5\")") PS5 = 9, /// /// Running on Mac. /// Mac = 10, + + /// + /// Running on iPhone. + /// + API_ENUM(Attributes="EditorDisplay(null, \"iOS\")") + iOS = 11, }; /// @@ -152,6 +161,8 @@ API_ENUM() enum class ArchitectureType #include "Platforms/Switch/Engine/Platform/SwitchDefines.h" #elif PLATFORM_MAC #include "Mac/MacDefines.h" +#elif PLATFORM_IOS +#include "iOS/iOSDefines.h" #else #error Missing Defines implementation! #endif diff --git a/Source/Engine/Platform/File.h b/Source/Engine/Platform/File.h index d783213e6..607356c8f 100644 --- a/Source/Engine/Platform/File.h +++ b/Source/Engine/Platform/File.h @@ -6,6 +6,8 @@ #include "Win32/Win32File.h" #elif PLATFORM_LINUX || PLATFORM_PS4 || PLATFORM_PS5 || PLATFORM_MAC #include "Unix/UnixFile.h" +#elif PLATFORM_IOS +#include "iOS/iOSFile.h" #elif PLATFORM_ANDROID #include "Android/AndroidFile.h" #elif PLATFORM_SWITCH diff --git a/Source/Engine/Platform/FileSystem.h b/Source/Engine/Platform/FileSystem.h index 235f43ce2..9398ff704 100644 --- a/Source/Engine/Platform/FileSystem.h +++ b/Source/Engine/Platform/FileSystem.h @@ -22,6 +22,8 @@ #include "Platforms/Switch/Engine/Platform/SwitchFileSystem.h" #elif PLATFORM_MAC #include "Mac/MacFileSystem.h" +#elif PLATFORM_IOS +#include "iOS/iOSFileSystem.h" #else #error Missing File System implementation! #endif diff --git a/Source/Engine/Platform/GDK/GDKPlatform.cpp b/Source/Engine/Platform/GDK/GDKPlatform.cpp index 41c309d39..2834888a9 100644 --- a/Source/Engine/Platform/GDK/GDKPlatform.cpp +++ b/Source/Engine/Platform/GDK/GDKPlatform.cpp @@ -555,21 +555,11 @@ struct GetMonitorBoundsData } }; -Rectangle GDKPlatform::GetMonitorBounds(const Float2& screenPos) -{ - return Rectangle(Float2::Zero, GetDesktopSize()); -} - Float2 GDKPlatform::GetDesktopSize() { return Float2(1920, 1080); } -Rectangle GDKPlatform::GetVirtualDesktopBounds() -{ - return Rectangle(Float2::Zero, GetDesktopSize()); -} - void GDKPlatform::GetEnvironmentVariables(Dictionary& result) { const LPWCH environmentStr = GetEnvironmentStringsW(); diff --git a/Source/Engine/Platform/GDK/GDKPlatform.h b/Source/Engine/Platform/GDK/GDKPlatform.h index 28430165f..8d5d44aad 100644 --- a/Source/Engine/Platform/GDK/GDKPlatform.h +++ b/Source/Engine/Platform/GDK/GDKPlatform.h @@ -68,9 +68,7 @@ public: static bool GetHasFocus(); static bool CanOpenUrl(const StringView& url); static void OpenUrl(const StringView& url); - static Rectangle GetMonitorBounds(const Float2& screenPos); static Float2 GetDesktopSize(); - static Rectangle GetVirtualDesktopBounds(); static void GetEnvironmentVariables(Dictionary& result); static bool GetEnvironmentVariable(const String& name, String& value); static bool SetEnvironmentVariable(const String& name, const String& value); diff --git a/Source/Engine/Platform/GDK/GDKWindow.h b/Source/Engine/Platform/GDK/GDKWindow.h index 9856559de..e091f5f04 100644 --- a/Source/Engine/Platform/GDK/GDKWindow.h +++ b/Source/Engine/Platform/GDK/GDKWindow.h @@ -17,7 +17,6 @@ class FLAXENGINE_API GDKWindow : public WindowBase private: Windows::HWND _handle; - Float2 _clientSize; public: @@ -77,7 +76,7 @@ private: public: - // [Window] + // [WindowBase] void* GetNativePtr() const override; void Show() override; void Hide() override; diff --git a/Source/Engine/Platform/Linux/LinuxFileSystem.cpp b/Source/Engine/Platform/Linux/LinuxFileSystem.cpp index 8efcba2a4..f0d5ff499 100644 --- a/Source/Engine/Platform/Linux/LinuxFileSystem.cpp +++ b/Source/Engine/Platform/Linux/LinuxFileSystem.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2019 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #if PLATFORM_LINUX @@ -346,14 +346,14 @@ bool LinuxFileSystem::DeleteFile(const StringView& path) uint64 LinuxFileSystem::GetFileSize(const StringView& path) { struct stat fileInfo; - fileInfo.st_size = -1; + fileInfo.st_size = 0; const StringAsANSI<> pathANSI(*path, path.Length()); if (stat(pathANSI.Get(), &fileInfo) != -1) { // Check for directories if (S_ISDIR(fileInfo.st_mode)) { - fileInfo.st_size = -1; + fileInfo.st_size = 0; } } return fileInfo.st_size; diff --git a/Source/Engine/Platform/Linux/LinuxPlatform.cpp b/Source/Engine/Platform/Linux/LinuxPlatform.cpp index 92a26032d..0434d8414 100644 --- a/Source/Engine/Platform/Linux/LinuxPlatform.cpp +++ b/Source/Engine/Platform/Linux/LinuxPlatform.cpp @@ -20,6 +20,7 @@ #include "Engine/Platform/StringUtils.h" #include "Engine/Platform/MessageBox.h" #include "Engine/Platform/WindowsManager.h" +#include "Engine/Platform/CreateProcessSettings.h" #include "Engine/Platform/Clipboard.h" #include "Engine/Platform/IGuiData.h" #include "Engine/Platform/Base/PlatformUtils.h" @@ -2718,8 +2719,10 @@ Rectangle LinuxPlatform::GetVirtualDesktopBounds() String LinuxPlatform::GetMainDirectory() { char buffer[UNIX_APP_BUFF_SIZE]; - readlink("/proc/self/exe", buffer, UNIX_APP_BUFF_SIZE); - const String str(buffer); + const int32 len = readlink("/proc/self/exe", buffer, UNIX_APP_BUFF_SIZE); + if (len <= 0) + return String::Empty; + const String str(buffer, len); int32 pos = str.FindLast(TEXT('/')); if (pos != -1 && ++pos < str.Length()) return str.Left(pos); @@ -2729,8 +2732,10 @@ String LinuxPlatform::GetMainDirectory() String LinuxPlatform::GetExecutableFilePath() { char buffer[UNIX_APP_BUFF_SIZE]; - readlink("/proc/self/exe", buffer, UNIX_APP_BUFF_SIZE); - return String(buffer); + const int32 len = readlink("/proc/self/exe", buffer, UNIX_APP_BUFF_SIZE); + if (len <= 0) + return String::Empty; + return String(buffer, len); } Guid LinuxPlatform::GetUniqueDeviceId() @@ -2795,11 +2800,19 @@ bool LinuxPlatform::SetEnvironmentVariable(const String& name, const String& val return setenv(StringAsANSI<>(*name).Get(), StringAsANSI<>(*value).Get(), true) != 0; } -int32 LinuxProcess(const StringView& cmdLine, const StringView& workingDir, const Dictionary& environment, bool waitForEnd, bool logOutput) +int32 LinuxPlatform::CreateProcess(CreateProcessSettings& settings) { + LOG(Info, "Command: {0} {1}", settings.FileName, settings.Arguments); + if (settings.WorkingDirectory.HasChars()) + { + LOG(Info, "Working directory: {0}", settings.WorkingDirectory); + } + const bool captureStdOut = settings.LogOutput || settings.SaveOutput; + const String cmdLine = settings.FileName + TEXT(" ") + settings.Arguments; + int fildes[2]; int32 returnCode = 0; - if (logOutput && pipe(fildes) < 0) + if (captureStdOut && pipe(fildes) < 0) { LOG(Warning, "Failed to create a pipe, errno={}", errno); } @@ -2817,16 +2830,16 @@ int32 LinuxProcess(const StringView& cmdLine, const StringView& workingDir, cons const char* const cmd[] = { "sh", "-c", StringAnsi(cmdLine).GetText(), (char *)0 }; // we could use the execve and supply a list of variable assignments but as we would have to build // and quote the values there is hardly any benefit over using setenv() calls - for (auto& e : environment) + for (auto& e : settings.Environment) { setenv(StringAnsi(e.Key).GetText(), StringAnsi(e.Value).GetText(), 1); } - if (workingDir.HasChars() && chdir(StringAnsi(workingDir).GetText()) != 0) + if (settings.WorkingDirectory.HasChars() && chdir(StringAnsi(settings.WorkingDirectory).GetText()) != 0) { - LOG(Warning, "Failed to set working directory to {}, errno={}", workingDir, errno); + LOG(Warning, "Failed to set working directory to {}, errno={}", settings.WorkingDirectory, errno); } - if (logOutput) + if (captureStdOut) { close(fildes[0]); // close the reading end of the pipe dup2(fildes[1], STDOUT_FILENO); // redirect stdout to pipe @@ -2846,21 +2859,25 @@ int32 LinuxProcess(const StringView& cmdLine, const StringView& workingDir, cons { // parent process LOG(Info, "{} started, pid={}", cmdLine, pid); - if (waitForEnd) + if (settings.WaitForEnd) { - int stat_loc; - if (logOutput) + if (captureStdOut) { char lineBuffer[1024]; close(fildes[1]); // close the writing end of the pipe FILE* stdPipe = fdopen(fildes[0], "r"); while (fgets(lineBuffer, sizeof(lineBuffer), stdPipe) != NULL) { - char *p = lineBuffer + strlen(lineBuffer)-1; - if (*p == '\n') *p=0; - Log::Logger::Write(LogType::Info, String(lineBuffer)); + char *p = lineBuffer + strlen(lineBuffer) - 1; + if (*p == '\n') *p = 0; + String line(lineBuffer); + if (settings.SaveOutput) + settings.Output.Add(line.Get(), line.Length()); + if (settings.LogOutput) + Log::Logger::Write(LogType::Info, line); } } + int stat_loc; if (waitpid(pid, &stat_loc, 0) < 0) { LOG(Warning, "Waiting for pid {} failed, errno={}", pid, errno); @@ -2895,24 +2912,6 @@ int32 LinuxProcess(const StringView& cmdLine, const StringView& workingDir, cons return returnCode; } -int32 LinuxPlatform::StartProcess(const StringView& filename, const StringView& args, const StringView& workingDir, bool hiddenWindow, bool waitForEnd) -{ - // hiddenWindow has hardly any meaning on UNIX/Linux/OSX as the program that is called decides whether it has a GUI or not - String cmdLine(filename); - if (args.HasChars()) cmdLine = cmdLine + TEXT(" ") + args; - return LinuxProcess(cmdLine, workingDir, Dictionary(), waitForEnd, false); -} - -int32 LinuxPlatform::RunProcess(const StringView& cmdLine, const StringView& workingDir, bool hiddenWindow) -{ - return LinuxProcess(cmdLine, workingDir, Dictionary(), true, true); -} - -int32 LinuxPlatform::RunProcess(const StringView& cmdLine, const StringView& workingDir, const Dictionary& environment, bool hiddenWindow) -{ - return LinuxProcess(cmdLine, workingDir, environment, true, true); -} - void* LinuxPlatform::LoadLibrary(const Char* filename) { const StringAsANSI<> filenameANSI(filename); diff --git a/Source/Engine/Platform/Linux/LinuxPlatform.h b/Source/Engine/Platform/Linux/LinuxPlatform.h index e995ab42d..827a6b635 100644 --- a/Source/Engine/Platform/Linux/LinuxPlatform.h +++ b/Source/Engine/Platform/Linux/LinuxPlatform.h @@ -139,9 +139,7 @@ public: static void GetEnvironmentVariables(Dictionary& result); static bool GetEnvironmentVariable(const String& name, String& value); static bool SetEnvironmentVariable(const String& name, const String& value); - static int32 StartProcess(const StringView& filename, const StringView& args, const StringView& workingDir, bool hiddenWindow = false, bool waitForEnd = false); - static int32 RunProcess(const StringView& cmdLine, const StringView& workingDir, bool hiddenWindow = true); - static int32 RunProcess(const StringView& cmdLine, const StringView& workingDir, const Dictionary& environment, bool hiddenWindow = true); + static int32 CreateProcess(CreateProcessSettings& settings); static void* LoadLibrary(const Char* filename); static void FreeLibrary(void* handle); static void* GetProcAddress(void* handle, const char* symbol); diff --git a/Source/Engine/Platform/Linux/LinuxWindow.h b/Source/Engine/Platform/Linux/LinuxWindow.h index f1a6ee587..52c039f6f 100644 --- a/Source/Engine/Platform/Linux/LinuxWindow.h +++ b/Source/Engine/Platform/Linux/LinuxWindow.h @@ -65,7 +65,7 @@ private: public: - // [Window] + // [WindowBase] void* GetNativePtr() const override; void Show() override; void Hide() override; diff --git a/Source/Engine/Platform/Mac/MacDefines.h b/Source/Engine/Platform/Mac/MacDefines.h index e1f57b80b..615e7065e 100644 --- a/Source/Engine/Platform/Mac/MacDefines.h +++ b/Source/Engine/Platform/Mac/MacDefines.h @@ -7,10 +7,16 @@ #include "../Unix/UnixDefines.h" // Platform description +#define PLATFORM_TYPE PlatformType::Mac +#if __aarch64__ +#define PLATFORM_64BITS 1 +#define PLATFORM_ARCH_ARM64 1 +#define PLATFORM_ARCH ArchitectureType::ARM64 +#else #define PLATFORM_64BITS 1 #define PLATFORM_ARCH_X64 1 #define PLATFORM_ARCH ArchitectureType::x64 -#define PLATFORM_TYPE PlatformType::Mac +#endif #define PLATFORM_DESKTOP 1 #define PLATFORM_CACHE_LINE_SIZE 128 #define PLATFORM_HAS_HEADLESS_MODE 1 diff --git a/Source/Engine/Platform/Mac/MacFileSystem.cpp b/Source/Engine/Platform/Mac/MacFileSystem.cpp index b0529e2d1..5efa1905b 100644 --- a/Source/Engine/Platform/Mac/MacFileSystem.cpp +++ b/Source/Engine/Platform/Mac/MacFileSystem.cpp @@ -1,10 +1,11 @@ -// Copyright (c) 2012-2019 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #if PLATFORM_MAC #include "MacFileSystem.h" -#include "MacUtils.h" +#include "Engine/Platform/Apple/AppleUtils.h" #include "Engine/Platform/File.h" +#include "Engine/Platform/Platform.h" #include "Engine/Core/Types/String.h" #include "Engine/Core/Types/StringView.h" #include "Engine/Core/Types/TimeSpan.h" @@ -22,13 +23,11 @@ #include #include -const DateTime UnixEpoch(1970, 1, 1); - void InitMacDialog(NSSavePanel* dialog, const StringView& initialDirectory, const StringView& filter, const StringView& title) { if (initialDirectory.HasChars()) { - [dialog setDirectoryURL:[NSURL fileURLWithPath:(NSString*)MacUtils::ToString(initialDirectory) isDirectory:YES]]; + [dialog setDirectoryURL:[NSURL fileURLWithPath:(NSString*)AppleUtils::ToString(initialDirectory) isDirectory:YES]]; } if (filter.HasChars()) { @@ -41,13 +40,13 @@ void InitMacDialog(NSSavePanel* dialog, const StringView& initialDirectory, cons String extension = entries[i]; if (extension.StartsWith(TEXT("*."))) extension = extension.Substring(2); - [fileTypes addObject:(NSString*)MacUtils::ToString(extension)]; + [fileTypes addObject:(NSString*)AppleUtils::ToString(extension)]; } [dialog setAllowedFileTypes:fileTypes];*/ } if (title.HasChars()) { - [dialog setMessage:(NSString*)MacUtils::ToString(title)]; + [dialog setMessage:(NSString*)AppleUtils::ToString(title)]; } } @@ -69,12 +68,12 @@ bool MacFileSystem::ShowOpenFileDialog(Window* parentWindow, const StringView& i { const NSArray* urls = [dialog URLs]; for (int32 i = 0; i < [urls count]; i++) - filenames.Add(MacUtils::ToString((CFStringRef)[[urls objectAtIndex:i] path])); + filenames.Add(AppleUtils::ToString((CFStringRef)[[urls objectAtIndex:i] path])); } else { const NSURL* url = [dialog URL]; - filenames.Add(MacUtils::ToString((CFStringRef)[url path])); + filenames.Add(AppleUtils::ToString((CFStringRef)[url path])); } result = false; } @@ -97,7 +96,7 @@ bool MacFileSystem::ShowSaveFileDialog(Window* parentWindow, const StringView& i if ([dialog runModal] == NSModalResponseOK) { const NSURL* url = [dialog URL]; - filenames.Add(MacUtils::ToString((CFStringRef)[url path])); + filenames.Add(AppleUtils::ToString((CFStringRef)[url path])); result = false; } @@ -122,7 +121,7 @@ bool MacFileSystem::ShowBrowseFolderDialog(Window* parentWindow, const StringVie if ([dialog runModal] == NSModalResponseOK) { const NSURL* url = [dialog URL]; - path = MacUtils::ToString((CFStringRef)[url path]); + path = AppleUtils::ToString((CFStringRef)[url path]); result = false; } @@ -136,510 +135,4 @@ bool MacFileSystem::ShowFileExplorer(const StringView& path) return Platform::StartProcess(TEXT("open"), String::Format(TEXT("\"{0}\""), path), StringView::Empty) != 0; } -bool MacFileSystem::CreateDirectory(const StringView& path) -{ - const StringAsANSI<> pathAnsi(*path, path.Length()); - - // Skip if already exists - struct stat fileInfo; - if (stat(pathAnsi.Get(), &fileInfo) != -1 && S_ISDIR(fileInfo.st_mode)) - { - return false; - } - - // Recursively do it all again for the parent directory, if any - const int32 slashIndex = path.FindLast('/'); - if (slashIndex > 1) - { - if (CreateDirectory(path.Substring(0, slashIndex))) - { - return true; - } - } - - // Create the last directory on the path (the recursive calls will have taken care of the parent directories by now) - return mkdir(pathAnsi.Get(), 0755) != 0 && errno != EEXIST; -} - -bool DeletePathTree(const char* path) -{ - size_t pathLength; - DIR* dir; - struct stat statPath, statEntry; - struct dirent* entry; - - // Stat for the path - stat(path, &statPath); - - // If path does not exists or is not dir - exit with status -1 - if (S_ISDIR(statPath.st_mode) == 0) - { - // Is not directory - return true; - } - - // If not possible to read the directory for this user - if ((dir = opendir(path)) == NULL) - { - // Cannot open directory - return true; - } - - // The length of the path - pathLength = strlen(path); - - // Iteration through entries in the directory - while ((entry = readdir(dir)) != NULL) - { - // Skip entries "." and ".." - if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) - continue; - - // Determinate a full path of an entry - char full_path[256]; - ASSERT(pathLength + strlen(entry->d_name) < ARRAY_COUNT(full_path)); - strcpy(full_path, path); - strcat(full_path, "/"); - strcat(full_path, entry->d_name); - - // Stat for the entry - stat(full_path, &statEntry); - - // Recursively remove a nested directory - if (S_ISDIR(statEntry.st_mode) != 0) - { - if (DeletePathTree(full_path)) - return true; - continue; - } - - // Remove a file object - if (unlink(full_path) != 0) - return true; - } - - // Remove the devastated directory and close the object of it - if (rmdir(path) != 0) - return true; - - closedir(dir); - - return false; -} - -bool MacFileSystem::DeleteDirectory(const String& path, bool deleteContents) -{ - const StringAsANSI<> pathANSI(*path, path.Length()); - if (deleteContents) - return DeletePathTree(pathANSI.Get()); - return rmdir(pathANSI.Get()) != 0; -} - -bool MacFileSystem::DirectoryExists(const StringView& path) -{ - struct stat fileInfo; - const StringAsANSI<> pathANSI(*path, path.Length()); - if (stat(pathANSI.Get(), &fileInfo) != -1) - { - return S_ISDIR(fileInfo.st_mode); - } - return false; -} - -bool MacFileSystem::DirectoryGetFiles(Array& results, const String& path, const Char* searchPattern, DirectorySearchOption option) -{ - const StringAsANSI<> pathANSI(*path, path.Length()); - const StringAsANSI<> searchPatternANSI(searchPattern); - - // Check if use only top directory - if (option == DirectorySearchOption::TopDirectoryOnly) - return getFilesFromDirectoryTop(results, pathANSI.Get(), searchPatternANSI.Get()); - return getFilesFromDirectoryAll(results, pathANSI.Get(), searchPatternANSI.Get()); -} - -bool MacFileSystem::GetChildDirectories(Array& results, const String& directory) -{ - size_t pathLength; - DIR* dir; - struct stat statPath, statEntry; - struct dirent* entry; - const StringAsANSI<> pathANSI(*directory, directory.Length()); - const char* path = pathANSI.Get(); - - // Stat for the path - stat(path, &statPath); - - // If path does not exists or is not dir - exit with status -1 - if (S_ISDIR(statPath.st_mode) == 0) - { - // Is not directory - return true; - } - - // If not possible to read the directory for this user - if ((dir = opendir(path)) == NULL) - { - // Cannot open directory - return true; - } - - // The length of the path - pathLength = strlen(path); - - // Iteration through entries in the directory - while ((entry = readdir(dir)) != NULL) - { - // Skip entries "." and ".." - if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) - continue; - - // Determinate a full path of an entry - char full_path[256]; - ASSERT(pathLength + strlen(entry->d_name) < ARRAY_COUNT(full_path)); - strcpy(full_path, path); - strcat(full_path, "/"); - strcat(full_path, entry->d_name); - - // Stat for the entry - stat(full_path, &statEntry); - - // Check for directory - if (S_ISDIR(statEntry.st_mode) != 0) - { - // Add directory - results.Add(String(full_path)); - } - } - - closedir(dir); - - return false; -} - -bool MacFileSystem::FileExists(const StringView& path) -{ - struct stat fileInfo; - const StringAsANSI<> pathANSI(*path, path.Length()); - if (stat(pathANSI.Get(), &fileInfo) != -1) - { - return S_ISREG(fileInfo.st_mode); - } - return false; -} - -bool MacFileSystem::DeleteFile(const StringView& path) -{ - const StringAsANSI<> pathANSI(*path, path.Length()); - return unlink(pathANSI.Get()) == 0; -} - -uint64 MacFileSystem::GetFileSize(const StringView& path) -{ - struct stat fileInfo; - fileInfo.st_size = -1; - const StringAsANSI<> pathANSI(*path, path.Length()); - if (stat(pathANSI.Get(), &fileInfo) != -1) - { - // Check for directories - if (S_ISDIR(fileInfo.st_mode)) - { - fileInfo.st_size = -1; - } - } - return fileInfo.st_size; -} - -bool MacFileSystem::IsReadOnly(const StringView& path) -{ - const StringAsANSI<> pathANSI(*path, path.Length()); - if (access(pathANSI.Get(), W_OK) == -1) - { - return errno == EACCES; - } - return false; -} - -bool MacFileSystem::SetReadOnly(const StringView& path, bool isReadOnly) -{ - const StringAsANSI<> pathANSI(*path, path.Length()); - struct stat fileInfo; - if (stat(pathANSI.Get(), &fileInfo) != -1) - { - if (isReadOnly) - { - fileInfo.st_mode &= ~S_IWUSR; - } - else - { - fileInfo.st_mode |= S_IWUSR; - } - return chmod(pathANSI.Get(), fileInfo.st_mode) == 0; - } - return false; -} - -bool MacFileSystem::MoveFile(const StringView& dst, const StringView& src, bool overwrite) -{ - if (!overwrite && FileExists(dst)) - { - // Already exists - return true; - } - - if (overwrite) - { - unlink(StringAsANSI<>(*dst, dst.Length()).Get()); - } - if (rename(StringAsANSI<>(*src, src.Length()).Get(), StringAsANSI<>(*dst, dst.Length()).Get()) != 0) - { - if (errno == EXDEV) - { - if (!CopyFile(dst, src)) - { - unlink(StringAsANSI<>(*src, src.Length()).Get()); - return false; - } - } - return true; - } - return false; -} - -bool MacFileSystem::CopyFile(const StringView& dst, const StringView& src) -{ - const StringAsANSI<> srcANSI(*src, src.Length()); - const StringAsANSI<> dstANSI(*dst, dst.Length()); - - int srcFile, dstFile; - char buffer[4096]; - ssize_t readSize; - int cachedError; - - srcFile = open(srcANSI.Get(), O_RDONLY); - if (srcFile < 0) - return true; - dstFile = open(dstANSI.Get(), O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - if (dstFile < 0) - goto out_error; - - while (readSize = read(srcFile, buffer, sizeof(buffer)), readSize > 0) - { - char* ptr = buffer; - ssize_t writeSize; - - do - { - writeSize = write(dstFile, ptr, readSize); - if (writeSize >= 0) - { - readSize -= writeSize; - ptr += writeSize; - } - else if (errno != EINTR) - { - goto out_error; - } - } while (readSize > 0); - } - - if (readSize == 0) - { - if (close(dstFile) < 0) - { - dstFile = -1; - goto out_error; - } - close(srcFile); - - // Success - return false; - } - -out_error: - cachedError = errno; - close(srcFile); - if (dstFile >= 0) - close(dstFile); - errno = cachedError; - return true; -} - -bool MacFileSystem::getFilesFromDirectoryTop(Array& results, const char* path, const char* searchPattern) -{ - size_t pathLength; - struct stat statPath, statEntry; - struct dirent* entry; - - // Stat for the path - stat(path, &statPath); - - // If path does not exists or is not dir - exit with status -1 - if (S_ISDIR(statPath.st_mode) == 0) - { - // Is not directory - return true; - } - - // If not possible to read the directory for this user - DIR* dir = opendir(path); - if (dir == NULL) - { - // Cannot open directory - return true; - } - - // The length of the path - pathLength = strlen(path); - - // Iteration through entries in the directory - while ((entry = readdir(dir)) != NULL) - { - // Skip entries "." and ".." - if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) - continue; - - // Determinate a full path of an entry - char fullPath[256]; - ASSERT(pathLength + strlen(entry->d_name) < ARRAY_COUNT(fullPath)); - strcpy(fullPath, path); - strcat(fullPath, "/"); - strcat(fullPath, entry->d_name); - - // Stat for the entry - stat(fullPath, &statEntry); - - // Check for file - if (S_ISREG(statEntry.st_mode) != 0) - { - // Validate with filter - const int32 fullPathLength = StringUtils::Length(fullPath); - const int32 searchPatternLength = StringUtils::Length(searchPattern); - if (searchPatternLength == 0 || StringUtils::Compare(searchPattern, "*") == 0) - { - // All files - } - else if (searchPattern[0] == '*' && searchPatternLength < fullPathLength && StringUtils::Compare(fullPath + fullPathLength - searchPatternLength + 1, searchPattern + 1, searchPatternLength - 1) == 0) - { - // Path ending - } - else - { - // TODO: implement all cases in a generic way - continue; - } - - // Add file - results.Add(String(fullPath)); - } - } - - closedir(dir); - - return false; -} - -bool MacFileSystem::getFilesFromDirectoryAll(Array& results, const char* path, const char* searchPattern) -{ - // Find all files in this directory - getFilesFromDirectoryTop(results, path, searchPattern); - - size_t pathLength; - DIR* dir; - struct stat statPath, statEntry; - struct dirent* entry; - - // Stat for the path - stat(path, &statPath); - - // If path does not exists or is not dir - exit with status -1 - if (S_ISDIR(statPath.st_mode) == 0) - { - // Is not directory - return true; - } - - // If not possible to read the directory for this user - if ((dir = opendir(path)) == NULL) - { - // Cannot open directory - return true; - } - - // The length of the path - pathLength = strlen(path); - - // Iteration through entries in the directory - while ((entry = readdir(dir)) != NULL) - { - // Skip entries "." and ".." - if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) - continue; - - // Determinate a full path of an entry - char full_path[256]; - ASSERT(pathLength + strlen(entry->d_name) < ARRAY_COUNT(full_path)); - strcpy(full_path, path); - strcat(full_path, "/"); - strcat(full_path, entry->d_name); - - // Stat for the entry - stat(full_path, &statEntry); - - // Check for directory - if (S_ISDIR(statEntry.st_mode) != 0) - { - if (getFilesFromDirectoryAll(results, full_path, searchPattern)) - { - closedir(dir); - return true; - } - } - } - - closedir(dir); - - return false; -} - -DateTime MacFileSystem::GetFileLastEditTime(const StringView& path) -{ - struct stat fileInfo; - const StringAsANSI<> pathANSI(*path, path.Length()); - if (stat(pathANSI.Get(), &fileInfo) == -1) - { - return DateTime::MinValue(); - } - - const TimeSpan timeSinceEpoch(0, 0, fileInfo.st_mtime); - return UnixEpoch + timeSinceEpoch; -} - -void MacFileSystem::GetSpecialFolderPath(const SpecialFolder type, String& result) -{ - String home; - Platform::GetEnvironmentVariable(TEXT("HOME"), home); - switch (type) - { - case SpecialFolder::Desktop: - result = home / TEXT("/Desktop"); - break; - case SpecialFolder::Documents: - result = home / TEXT("/Documents"); - break; - case SpecialFolder::Pictures: - result = home / TEXT("/Pictures"); - break; - case SpecialFolder::AppData: - case SpecialFolder::LocalAppData: - result = home / TEXT("/Library/Caches"); - break; - case SpecialFolder::ProgramData: - result = home / TEXT("/Library/Application Support"); - break; - case SpecialFolder::Temporary: - Platform::GetEnvironmentVariable(TEXT("TMPDIR"), result); - break; - } -} - #endif diff --git a/Source/Engine/Platform/Mac/MacFileSystem.h b/Source/Engine/Platform/Mac/MacFileSystem.h index 272c909f9..c72932d2c 100644 --- a/Source/Engine/Platform/Mac/MacFileSystem.h +++ b/Source/Engine/Platform/Mac/MacFileSystem.h @@ -4,53 +4,20 @@ #if PLATFORM_MAC -#include "Engine/Platform/Base/FileSystemBase.h" +#include "../Apple/AppleFileSystem.h" /// /// Mac platform implementation of filesystem service. /// -class FLAXENGINE_API MacFileSystem : public FileSystemBase +class FLAXENGINE_API MacFileSystem : public AppleFileSystem { public: - // [FileSystemBase] + // [AppleFileSystem] static bool ShowOpenFileDialog(Window* parentWindow, const StringView& initialDirectory, const StringView& filter, bool multiSelect, const StringView& title, Array& filenames); static bool ShowSaveFileDialog(Window* parentWindow, const StringView& initialDirectory, const StringView& filter, bool multiSelect, const StringView& title, Array& filenames); static bool ShowBrowseFolderDialog(Window* parentWindow, const StringView& initialDirectory, const StringView& title, String& path); static bool ShowFileExplorer(const StringView& path); - static bool CreateDirectory(const StringView& path); - static bool DeleteDirectory(const String& path, bool deleteContents = true); - static bool DirectoryExists(const StringView& path); - static bool DirectoryGetFiles(Array& results, const String& path, const Char* searchPattern, DirectorySearchOption option = DirectorySearchOption::AllDirectories); - static bool GetChildDirectories(Array& results, const String& directory); - static bool FileExists(const StringView& path); - static bool DeleteFile(const StringView& path); - static uint64 GetFileSize(const StringView& path); - static bool IsReadOnly(const StringView& path); - static bool SetReadOnly(const StringView& path, bool isReadOnly); - static bool MoveFile(const StringView& dst, const StringView& src, bool overwrite = false); - static bool CopyFile(const StringView& dst, const StringView& src); - -public: - - /// - /// Gets last time when file has been modified (in UTC). - /// - /// The file path to check. - /// The last write time or DateTime::MinValue() if cannot get data. - static DateTime GetFileLastEditTime(const StringView& path); - - /// - /// Gets the special folder path. - /// - /// The folder type. - /// The result full path. - static void GetSpecialFolderPath(const SpecialFolder type, String& result); - -private: - - static bool getFilesFromDirectoryTop(Array& results, const char* path, const char* searchPattern); - static bool getFilesFromDirectoryAll(Array& results, const char* path, const char* searchPattern); }; #endif diff --git a/Source/Engine/Platform/Mac/MacPlatform.cpp b/Source/Engine/Platform/Mac/MacPlatform.cpp index e2d459c7e..04f928bba 100644 --- a/Source/Engine/Platform/Mac/MacPlatform.cpp +++ b/Source/Engine/Platform/Mac/MacPlatform.cpp @@ -4,7 +4,7 @@ #include "MacPlatform.h" #include "MacWindow.h" -#include "MacUtils.h" +#include "Engine/Platform/Apple/AppleUtils.h" #include "Engine/Core/Log.h" #include "Engine/Core/Types/Guid.h" #include "Engine/Core/Types/String.h" @@ -17,12 +17,13 @@ #include "Engine/Core/Math/Color32.h" #include "Engine/Platform/CPUInfo.h" #include "Engine/Platform/MemoryStats.h" -#include "Engine/Platform/StringUtils.h" #include "Engine/Platform/MessageBox.h" +#include "Engine/Platform/StringUtils.h" #include "Engine/Platform/WindowsManager.h" #include "Engine/Platform/Clipboard.h" #include "Engine/Platform/IGuiData.h" #include "Engine/Platform/Base/PlatformUtils.h" +#include "Engine/Platform/CreateProcessSettings.h" #include "Engine/Utilities/StringConverter.h" #include "Engine/Threading/Threading.h" #include "Engine/Engine/Engine.h" @@ -48,114 +49,15 @@ #include #endif -CPUInfo MacCpu; Guid DeviceId; -String UserLocale, ComputerName; -double SecondsPerCycle; -NSAutoreleasePool* AutoreleasePool = nullptr; - -String MacUtils::ToString(CFStringRef str) -{ - if (!str) - return String::Empty; - String result; - const int32 length = CFStringGetLength(str); - if (length > 0) - { - CFRange range = CFRangeMake(0, length); - result.ReserveSpace(length); - CFStringGetBytes(str, range, kCFStringEncodingUTF16LE, '?', false, (uint8*)result.Get(), length * sizeof(Char), nullptr); - } - return result; -} - -CFStringRef MacUtils::ToString(const StringView& str) -{ - return CFStringCreateWithBytes(nullptr, (const UInt8*)str.GetNonTerminatedText(), str.Length() * sizeof(Char), kCFStringEncodingUTF16LE, false); -} - -Float2 MacUtils::PosToCoca(const Float2& pos) -{ - // MacOS uses y-coordinate starting at the bottom of the screen - Float2 result = pos; - result.Y *= -1; - result += GetScreensOrigin(); - return result; -} - -Float2 MacUtils::CocaToPos(const Float2& pos) -{ - // MacOS uses y-coordinate starting at the bottom of the screen - Float2 result = pos; - result -= GetScreensOrigin(); - result.Y *= -1; - return result; -} - -Float2 MacUtils::GetScreensOrigin() -{ - Float2 result = Float2::Zero; - NSArray* screenArray = [NSScreen screens]; - for (NSUInteger i = 0; i < [screenArray count]; i++) - { - NSRect rect = [[screenArray objectAtIndex:i] frame]; - Float2 pos(rect.origin.x, rect.origin.y + rect.size.height); - if (pos.X < result.X) - result.X = pos.X; - if (pos.Y > result.Y) - result.Y = pos.Y; - } - return result; -} - -void MacClipboard::Clear() -{ - NSPasteboard* pasteboard = [NSPasteboard generalPasteboard]; - [pasteboard clearContents]; -} - -void MacClipboard::SetText(const StringView& text) -{ - NSPasteboard* pasteboard = [NSPasteboard generalPasteboard]; - [pasteboard clearContents]; - [pasteboard writeObjects:[NSArray arrayWithObject:(NSString*)MacUtils::ToString(text)]]; -} - -void MacClipboard::SetRawData(const Span& data) -{ -} - -void MacClipboard::SetFiles(const Array& files) -{ -} - -String MacClipboard::GetText() -{ - NSPasteboard* pasteboard = [NSPasteboard generalPasteboard]; - NSArray* classes = [NSArray arrayWithObject:[NSString class]]; - NSDictionary* options = [NSDictionary dictionary]; - if (![pasteboard canReadObjectForClasses:classes options:options]) - return String::Empty; - NSArray* objects = [pasteboard readObjectsForClasses:classes options:options]; - return MacUtils::ToString((CFStringRef)[objects objectAtIndex:0]); -} - -Array MacClipboard::GetRawData() -{ - return Array(); -} - -Array MacClipboard::GetFiles() -{ - return Array(); -} +String ComputerName; DialogResult MessageBox::Show(Window* parent, const StringView& text, const StringView& caption, MessageBoxButtons buttons, MessageBoxIcon icon) { if (CommandLine::Options.Headless) return DialogResult::None; - CFStringRef textRef = MacUtils::ToString(text); - CFStringRef captionRef = MacUtils::ToString(caption); + CFStringRef textRef = AppleUtils::ToString(text); + CFStringRef captionRef = AppleUtils::ToString(caption); CFOptionFlags flags = 0; switch (buttons) { @@ -186,6 +88,83 @@ DialogResult MessageBox::Show(Window* parent, const StringView& text, const Stri return DialogResult::OK; } +Float2 AppleUtils::PosToCoca(const Float2& pos) +{ + // MacOS uses y-coordinate starting at the bottom of the screen + Float2 result = pos;// / ApplePlatform::ScreenScale; + result.Y *= -1; + result += GetScreensOrigin(); + return result; +} + +Float2 AppleUtils::CocaToPos(const Float2& pos) +{ + // MacOS uses y-coordinate starting at the bottom of the screen + Float2 result = pos;// * ApplePlatform::ScreenScale; + result -= GetScreensOrigin(); + result.Y *= -1; + return result;// * ApplePlatform::ScreenScale; +} + +Float2 AppleUtils::GetScreensOrigin() +{ + Float2 result = Float2::Zero; + NSArray* screenArray = [NSScreen screens]; + for (NSUInteger i = 0; i < [screenArray count]; i++) + { + NSRect rect = [[screenArray objectAtIndex:i] frame]; + Float2 pos(rect.origin.x, rect.origin.y + rect.size.height); + pos *= ApplePlatform::ScreenScale; + if (pos.X < result.X) + result.X = pos.X; + if (pos.Y > result.Y) + result.Y = pos.Y; + } + return result; +} + +void MacClipboard::Clear() +{ + NSPasteboard* pasteboard = [NSPasteboard generalPasteboard]; + [pasteboard clearContents]; +} + +void MacClipboard::SetText(const StringView& text) +{ + NSPasteboard* pasteboard = [NSPasteboard generalPasteboard]; + [pasteboard clearContents]; + [pasteboard writeObjects:[NSArray arrayWithObject:(NSString*)AppleUtils::ToString(text)]]; +} + +void MacClipboard::SetRawData(const Span& data) +{ +} + +void MacClipboard::SetFiles(const Array& files) +{ +} + +String MacClipboard::GetText() +{ + NSPasteboard* pasteboard = [NSPasteboard generalPasteboard]; + NSArray* classes = [NSArray arrayWithObject:[NSString class]]; + NSDictionary* options = [NSDictionary dictionary]; + if (![pasteboard canReadObjectForClasses:classes options:options]) + return String::Empty; + NSArray* objects = [pasteboard readObjectsForClasses:classes options:options]; + return AppleUtils::ToString((CFStringRef)[objects objectAtIndex:0]); +} + +Array MacClipboard::GetRawData() +{ + return Array(); +} + +Array MacClipboard::GetFiles() +{ + return Array(); +} + class MacKeyboard : public Keyboard { public: @@ -214,221 +193,49 @@ public: } }; -typedef uint16_t offset_t; -#define align_mem_up(num, align) (((num) + ((align) - 1)) & ~((align) - 1)) - -bool MacPlatform::Is64BitPlatform() -{ - return PLATFORM_64BITS; -} - -CPUInfo MacPlatform::GetCPUInfo() -{ - return MacCpu; -} - -int32 MacPlatform::GetCacheLineSize() -{ - return MacCpu.CacheLineSize; -} - -MemoryStats MacPlatform::GetMemoryStats() -{ - MemoryStats result; - int64 value64; - size_t value64Size = sizeof(value64); - if (sysctlbyname("hw.memsize", &value64, &value64Size, nullptr, 0) != 0) - value64 = 1024 * 1024; - result.TotalPhysicalMemory = value64; - int id[] = { CTL_HW, HW_MEMSIZE }; - if (sysctl(id, 2, &value64, &value64Size, nullptr, 0) != 0) - value64Size = 1024; - result.UsedPhysicalMemory = value64Size; - xsw_usage swapusage; - size_t swapusageSize = sizeof(swapusage); - result.TotalVirtualMemory = result.TotalPhysicalMemory; - result.UsedVirtualMemory = result.UsedPhysicalMemory; - if (sysctlbyname("vm.swapusage", &swapusage, &swapusageSize, nullptr, 0) == 0) - { - result.TotalVirtualMemory += swapusage.xsu_total; - result.UsedVirtualMemory += swapusage.xsu_used; - } - return result; -} - -ProcessMemoryStats MacPlatform::GetProcessMemoryStats() -{ - ProcessMemoryStats result; - result.UsedPhysicalMemory = 1024; - result.UsedVirtualMemory = 1024; - return result; -} - -uint64 MacPlatform::GetCurrentThreadID() -{ - return (uint64)pthread_mach_thread_np(pthread_self()); -} - -void MacPlatform::SetThreadPriority(ThreadPriority priority) -{ - // TODO: impl this -} - -void MacPlatform::SetThreadAffinityMask(uint64 affinityMask) -{ - // TODO: impl this -} - -void MacPlatform::Sleep(int32 milliseconds) -{ - usleep(milliseconds * 1000); -} - -double MacPlatform::GetTimeSeconds() -{ - return SecondsPerCycle * mach_absolute_time(); -} - -uint64 MacPlatform::GetTimeCycles() -{ - return mach_absolute_time(); -} - -uint64 MacPlatform::GetClockFrequency() -{ - return (uint64)(1.0 / SecondsPerCycle); -} - -void MacPlatform::GetSystemTime(int32& year, int32& month, int32& dayOfWeek, int32& day, int32& hour, int32& minute, int32& second, int32& millisecond) -{ - // Query for calendar time - struct timeval time; - gettimeofday(&time, nullptr); - - // Convert to local time - struct tm localTime; - localtime_r(&time.tv_sec, &localTime); - - // Extract time - year = localTime.tm_year + 1900; - month = localTime.tm_mon + 1; - dayOfWeek = localTime.tm_wday; - day = localTime.tm_mday; - hour = localTime.tm_hour; - minute = localTime.tm_min; - second = localTime.tm_sec; - millisecond = time.tv_usec / 1000; -} - -void MacPlatform::GetUTCTime(int32& year, int32& month, int32& dayOfWeek, int32& day, int32& hour, int32& minute, int32& second, int32& millisecond) -{ - // Get the calendar time - struct timeval time; - gettimeofday(&time, nullptr); - - // Convert to UTC time - struct tm localTime; - gmtime_r(&time.tv_sec, &localTime); - - // Extract time - year = localTime.tm_year + 1900; - month = localTime.tm_mon + 1; - dayOfWeek = localTime.tm_wday; - day = localTime.tm_mday; - hour = localTime.tm_hour; - minute = localTime.tm_min; - second = localTime.tm_sec; - millisecond = time.tv_usec / 1000; -} - bool MacPlatform::Init() { - if (UnixPlatform::Init()) + if (ApplePlatform::Init()) return true; - // Init timing - { - mach_timebase_info_data_t info; - mach_timebase_info(&info); - SecondsPerCycle = 1e-9 * (double)info.numer / (double)info.denom; - } - - // Get CPU info - int32 value32; - int64 value64; - size_t value32Size = sizeof(value32), value64Size = sizeof(value64); - if (sysctlbyname("hw.packages", &value32, &value32Size, nullptr, 0) != 0) - value32 = 1; - MacCpu.ProcessorPackageCount = value32; - if (sysctlbyname("hw.physicalcpu", &value32, &value32Size, nullptr, 0) != 0) - value32 = 1; - MacCpu.ProcessorCoreCount = value32; - if (sysctlbyname("hw.logicalcpu", &value32, &value32Size, nullptr, 0) != 0) - value32 = 1; - MacCpu.LogicalProcessorCount = value32; - if (sysctlbyname("hw.l1icachesize", &value32, &value32Size, nullptr, 0) != 0) - value32 = 0; - MacCpu.L1CacheSize = value32; - if (sysctlbyname("hw.l2cachesize", &value32, &value32Size, nullptr, 0) != 0) - value32 = 0; - MacCpu.L2CacheSize = value32; - if (sysctlbyname("hw.l3cachesize", &value32, &value32Size, nullptr, 0) != 0) - value32 = 0; - MacCpu.L3CacheSize = value32; - if (sysctlbyname("hw.pagesize", &value32, &value32Size, nullptr, 0) != 0) - value32 = vm_page_size; - MacCpu.PageSize = value32; - if (sysctlbyname("hw.cpufrequency_max", &value64, &value64Size, nullptr, 0) != 0) - value64 = GetClockFrequency(); - MacCpu.ClockSpeed = value64; - if (sysctlbyname("hw.cachelinesize", &value32, &value32Size, nullptr, 0) != 0) - value32 = PLATFORM_CACHE_LINE_SIZE; - MacCpu.CacheLineSize = value32; - // Get device id { io_registry_entry_t ioRegistryRoot = IORegistryEntryFromPath(kIOMasterPortDefault, "IOService:/"); CFStringRef deviceUuid = (CFStringRef)IORegistryEntryCreateCFProperty(ioRegistryRoot, CFSTR(kIOPlatformUUIDKey), kCFAllocatorDefault, 0); IOObjectRelease(ioRegistryRoot); - String uuidStr = MacUtils::ToString(deviceUuid); + String uuidStr = AppleUtils::ToString(deviceUuid); Guid::Parse(uuidStr, DeviceId); CFRelease(deviceUuid); } - // Get locale - { - CFLocaleRef locale = CFLocaleCopyCurrent(); - CFStringRef localeLang = (CFStringRef)CFLocaleGetValue(locale, kCFLocaleLanguageCode); - CFStringRef localeCountry = (CFStringRef)CFLocaleGetValue(locale, kCFLocaleCountryCode); - UserLocale = MacUtils::ToString(localeLang); - String localeCountryStr = MacUtils::ToString(localeCountry); - if (localeCountryStr.HasChars()) - UserLocale += TEXT("-") + localeCountryStr; - CFRelease(locale); - CFRelease(localeLang); - CFRelease(localeCountry); - } - // Get computer name { CFStringRef computerName = SCDynamicStoreCopyComputerName(nullptr, nullptr); - ComputerName = MacUtils::ToString(computerName); + ComputerName = AppleUtils::ToString(computerName); CFRelease(computerName); } - // Init user + // Find the maximum scale of the display to handle high-dpi displays scaling factor { - String username; - GetEnvironmentVariable(TEXT("USER"), username); - OnPlatformUserAdd(New(username)); + NSArray* screenArray = [NSScreen screens]; + for (int32 i = 0; i < (int32)[screenArray count]; i++) + { + if ([[screenArray objectAtIndex:i] respondsToSelector:@selector(backingScaleFactor)]) + { + ScreenScale = Math::Max(ScreenScale, (float)[[screenArray objectAtIndex:i] backingScaleFactor]); + } + } + CustomDpiScale *= ScreenScale; } // Init application [NSApplication sharedApplication]; [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular]; + + // Init main menu NSMenu* mainMenu = [[[NSMenu alloc] initWithTitle:@""] autorelease]; [NSApp setMainMenu:mainMenu]; - AutoreleasePool = [[NSAutoreleasePool alloc] init]; + // TODO: expose main menu for app (eg. to be used by Game or Editor on macOS-only) Input::Mouse = New(); Input::Keyboard = New(); @@ -438,7 +245,7 @@ bool MacPlatform::Init() void MacPlatform::LogInfo() { - UnixPlatform::LogInfo(); + ApplePlatform::LogInfo(); char str[250]; size_t strSize = sizeof(str); @@ -467,16 +274,7 @@ void MacPlatform::Tick() [NSApp sendEvent:event]; } - [AutoreleasePool drain]; - AutoreleasePool = [[NSAutoreleasePool alloc] init]; -} - -void MacPlatform::BeforeExit() -{ -} - -void MacPlatform::Exit() -{ + ApplePlatform::Tick(); } int32 MacPlatform::GetDpi() @@ -488,9 +286,9 @@ int32 MacPlatform::GetDpi() return Math::Max(dpi, 72.0f); } -String MacPlatform::GetUserLocaleName() +Guid MacPlatform::GetUniqueDeviceId() { - return UserLocale; + return DeviceId; } String MacPlatform::GetComputerName() @@ -498,40 +296,6 @@ String MacPlatform::GetComputerName() return ComputerName; } -bool MacPlatform::GetHasFocus() -{ - // Check if any window is focused - ScopeLock lock(WindowsManager::WindowsLocker); - for (auto window : WindowsManager::Windows) - { - if (window->IsFocused()) - return true; - } - - // Default to true if has no windows open - return WindowsManager::Windows.IsEmpty(); -} - -void MacPlatform::CreateGuid(Guid& result) -{ - uuid_t uuid; - uuid_generate(uuid); - auto ptr = (uint32*)&uuid; - result.A = ptr[0]; - result.B = ptr[1]; - result.C = ptr[2]; - result.D = ptr[3]; -} - -bool MacPlatform::CanOpenUrl(const StringView& url) -{ - return false; -} - -void MacPlatform::OpenUrl(const StringView& url) -{ -} - Float2 MacPlatform::GetMousePosition() { CGEventRef event = CGEventCreate(nullptr); @@ -551,13 +315,14 @@ void MacPlatform::SetMousePosition(const Float2& pos) Float2 MacPlatform::GetDesktopSize() { CGDirectDisplayID mainDisplay = CGMainDisplayID(); - return Float2((float)CGDisplayPixelsWide(mainDisplay), (float)CGDisplayPixelsHigh(mainDisplay)); + return Float2((float)CGDisplayPixelsWide(mainDisplay) * ScreenScale, (float)CGDisplayPixelsHigh(mainDisplay) * ScreenScale); } Rectangle GetDisplayBounds(CGDirectDisplayID display) { CGRect rect = CGDisplayBounds(display); - return Rectangle(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height); + float screnScale = ApplePlatform::ScreenScale; + return Rectangle(rect.origin.x * screnScale, rect.origin.y * screnScale, rect.size.width * screnScale, rect.size.height * screnScale); } Rectangle MacPlatform::GetMonitorBounds(const Float2& screenPos) @@ -592,71 +357,54 @@ String MacPlatform::GetMainDirectory() if (path.EndsWith(TEXT("/Contents/MacOS"))) { // If running from executable in a package, go up to the Contents - path = StringUtils::GetDirectoryName(path); + path = path.Left(path.Length() - 6); } return path; } -String MacPlatform::GetExecutableFilePath() -{ - char buf[PATH_MAX]; - uint32 size = PATH_MAX; - String result; - if (_NSGetExecutablePath(buf, &size) == 0) - result.SetUTF8(buf, StringUtils::Length(buf)); - return result; -} - -Guid MacPlatform::GetUniqueDeviceId() -{ - return DeviceId; -} - -String MacPlatform::GetWorkingDirectory() -{ - char buffer[256]; - getcwd(buffer, ARRAY_COUNT(buffer)); - return String(buffer); -} - -bool MacPlatform::SetWorkingDirectory(const String& path) -{ - return chdir(StringAsANSI<>(*path).Get()) != 0; -} - Window* MacPlatform::CreateWindow(const CreateWindowSettings& settings) { return New(settings); } -bool MacPlatform::GetEnvironmentVariable(const String& name, String& value) +int32 MacPlatform::CreateProcess(CreateProcessSettings& settings) { - char* env = getenv(StringAsANSI<>(*name).Get()); - if (env) - { - value = String(env); - return false; - } - return true; -} - -bool MacPlatform::SetEnvironmentVariable(const String& name, const String& value) -{ - return setenv(StringAsANSI<>(*name).Get(), StringAsANSI<>(*value).Get(), true) != 0; -} - -int32 MacProcess(const StringView& cmdLine, const StringView& workingDir, const Dictionary& environment, bool waitForEnd, bool logOutput) -{ - LOG(Info, "Command: {0}", cmdLine); + LOG(Info, "Command: {0} {1}", settings.FileName, settings.Arguments); String cwd; - if (workingDir.Length() != 0) + if (settings.WorkingDirectory.HasChars()) { - LOG(Info, "Working directory: {0}", workingDir); + LOG(Info, "Working directory: {0}", settings.WorkingDirectory); cwd = Platform::GetWorkingDirectory(); - Platform::SetWorkingDirectory(workingDir); + Platform::SetWorkingDirectory(settings.WorkingDirectory); } + const bool captureStdOut = settings.LogOutput || settings.SaveOutput; + + // Special case if filename points to the app package (use actual executable) + String exePath = settings.FileName; + { + NSString* processPath = (NSString*)AppleUtils::ToString(exePath); + if (![[NSFileManager defaultManager] fileExistsAtPath: processPath]) + { + NSString* appName = [[processPath lastPathComponent] stringByDeletingPathExtension]; + processPath = [[NSWorkspace sharedWorkspace] fullPathForApplication:appName]; + } + if ([[NSFileManager defaultManager] fileExistsAtPath: processPath]) + { + if([[NSWorkspace sharedWorkspace] isFilePackageAtPath: processPath]) + { + NSBundle* bundle = [NSBundle bundleWithPath:processPath]; + if (bundle != nil) + { + processPath = [bundle executablePath]; + if (processPath != nil) + exePath = AppleUtils::ToString((CFStringRef)processPath); + } + } + } + } - StringAsANSI<> cmdLineAnsi(*cmdLine, cmdLine.Length()); + const String cmdLine = exePath + TEXT(" ") + settings.Arguments; + const StringAsANSI<> cmdLineAnsi(*cmdLine, cmdLine.Length()); FILE* pipe = popen(cmdLineAnsi.Get(), "r"); if (cwd.Length() != 0) { @@ -670,18 +418,21 @@ int32 MacProcess(const StringView& cmdLine, const StringView& workingDir, const // TODO: environment - int32 returnCode = 0; - if (waitForEnd) + int32 returnCode = 0; + if (settings.WaitForEnd) { - int stat_loc; - if (logOutput) + if (captureStdOut) { char lineBuffer[1024]; while (fgets(lineBuffer, sizeof(lineBuffer), pipe) != NULL) { - char *p = lineBuffer + strlen(lineBuffer) - 1; - if (*p == '\n') *p=0; - Log::Logger::Write(LogType::Info, String(lineBuffer)); + char* p = lineBuffer + strlen(lineBuffer) - 1; + if (*p == '\n') *p = 0; + String line(lineBuffer); + if (settings.SaveOutput) + settings.Output.Add(line.Get(), line.Length()); + if (settings.LogOutput) + Log::Logger::Write(LogType::Info, line); } } else @@ -696,75 +447,4 @@ int32 MacProcess(const StringView& cmdLine, const StringView& workingDir, const return returnCode; } -int32 MacPlatform::StartProcess(const StringView& filename, const StringView& args, const StringView& workingDir, bool hiddenWindow, bool waitForEnd) -{ - // hiddenWindow has hardly any meaning on UNIX/Linux/OSX as the program that is called decides whether it has a GUI or not - String cmdLine(filename); - if (args.HasChars()) cmdLine = cmdLine + TEXT(" ") + args; - return MacProcess(cmdLine, workingDir, Dictionary(), waitForEnd, false); -} - -int32 MacPlatform::RunProcess(const StringView& cmdLine, const StringView& workingDir, bool hiddenWindow) -{ - return MacProcess(cmdLine, workingDir, Dictionary(), true, true); -} - -int32 MacPlatform::RunProcess(const StringView& cmdLine, const StringView& workingDir, const Dictionary& environment, bool hiddenWindow) -{ - return MacProcess(cmdLine, workingDir, environment, true, true); -} - -void* MacPlatform::LoadLibrary(const Char* filename) -{ - const StringAsANSI<> filenameANSI(filename); - void* result = dlopen(filenameANSI.Get(), RTLD_LAZY | RTLD_LOCAL); - if (!result) - { - LOG(Error, "Failed to load {0} because {1}", filename, String(dlerror())); - } - return result; -} - -void MacPlatform::FreeLibrary(void* handle) -{ - dlclose(handle); -} - -void* MacPlatform::GetProcAddress(void* handle, const char* symbol) -{ - return dlsym(handle, symbol); -} - -Array MacPlatform::GetStackFrames(int32 skipCount, int32 maxDepth, void* context) -{ - Array result; -#if CRASH_LOG_ENABLE - void* callstack[120]; - skipCount = Math::Min(skipCount, ARRAY_COUNT(callstack)); - int32 maxCount = Math::Min(ARRAY_COUNT(callstack), skipCount + maxDepth); - int32 count = backtrace(callstack, maxCount); - int32 useCount = count - skipCount; - if (useCount > 0) - { - char** names = backtrace_symbols(callstack + skipCount, useCount); - result.Resize(useCount); - for (int32 i = 0; i < useCount; i++) - { - char* name = names[i]; - StackFrame& frame = result[i]; - frame.ProgramCounter = callstack[skipCount + i]; - frame.ModuleName[0] = 0; - frame.FileName[0] = 0; - frame.LineNumber = 0; - int32 nameLen = Math::Min(StringUtils::Length(name), ARRAY_COUNT(frame.FunctionName) - 1); - Platform::MemoryCopy(frame.FunctionName, name, nameLen); - frame.FunctionName[nameLen] = 0; - - } - free(names); - } -#endif - return result; -} - #endif diff --git a/Source/Engine/Platform/Mac/MacPlatform.h b/Source/Engine/Platform/Mac/MacPlatform.h index 47e8f17f3..c2098675e 100644 --- a/Source/Engine/Platform/Mac/MacPlatform.h +++ b/Source/Engine/Platform/Mac/MacPlatform.h @@ -4,115 +4,31 @@ #if PLATFORM_MAC -#include "../Unix/UnixPlatform.h" +#include "../Apple/ApplePlatform.h" /// /// The Mac platform implementation and application management utilities. /// -class FLAXENGINE_API MacPlatform : public UnixPlatform +class FLAXENGINE_API MacPlatform : public ApplePlatform { public: - // [UnixPlatform] - FORCE_INLINE static void MemoryBarrier() - { - __sync_synchronize(); - } - FORCE_INLINE static int64 InterlockedExchange(int64 volatile* dst, int64 exchange) - { - return __sync_lock_test_and_set(dst, exchange); - } - FORCE_INLINE static int32 InterlockedCompareExchange(int32 volatile* dst, int32 exchange, int32 comperand) - { - return __sync_val_compare_and_swap(dst, comperand, exchange); - } - FORCE_INLINE static int64 InterlockedCompareExchange(int64 volatile* dst, int64 exchange, int64 comperand) - { - return __sync_val_compare_and_swap(dst, comperand, exchange); - } - FORCE_INLINE static int64 InterlockedIncrement(int64 volatile* dst) - { - return __sync_add_and_fetch(dst, 1); - } - FORCE_INLINE static int64 InterlockedDecrement(int64 volatile* dst) - { - return __sync_sub_and_fetch(dst, 1); - } - FORCE_INLINE static int64 InterlockedAdd(int64 volatile* dst, int64 value) - { - return __sync_fetch_and_add(dst, value); - } - FORCE_INLINE static int32 AtomicRead(int32 volatile* dst) - { - int32 result; - __atomic_load(dst, &result, __ATOMIC_SEQ_CST); - return result; - } - FORCE_INLINE static int64 AtomicRead(int64 volatile* dst) - { - int64 result; - __atomic_load(dst, &result, __ATOMIC_SEQ_CST); - return result; - } - FORCE_INLINE static void AtomicStore(int32 volatile* dst, int32 value) - { - __atomic_store(dst, &value, __ATOMIC_SEQ_CST); - } - FORCE_INLINE static void AtomicStore(int64 volatile* dst, int64 value) - { - __atomic_store(dst, &value, __ATOMIC_SEQ_CST); - } - FORCE_INLINE static void Prefetch(void const* ptr) - { - __builtin_prefetch(static_cast(ptr)); - } - static bool Is64BitPlatform(); - static CPUInfo GetCPUInfo(); - static int32 GetCacheLineSize(); - static MemoryStats GetMemoryStats(); - static ProcessMemoryStats GetProcessMemoryStats(); - static uint64 GetCurrentThreadID(); - static void SetThreadPriority(ThreadPriority priority); - static void SetThreadAffinityMask(uint64 affinityMask); - static void Sleep(int32 milliseconds); - static double GetTimeSeconds(); - static uint64 GetTimeCycles(); - static uint64 GetClockFrequency(); - static void GetSystemTime(int32& year, int32& month, int32& dayOfWeek, int32& day, int32& hour, int32& minute, int32& second, int32& millisecond); - static void GetUTCTime(int32& year, int32& month, int32& dayOfWeek, int32& day, int32& hour, int32& minute, int32& second, int32& millisecond); + // [ApplePlatform] static bool Init(); static void LogInfo(); static void BeforeRun(); static void Tick(); - static void BeforeExit(); - static void Exit(); static int32 GetDpi(); - static String GetUserLocaleName(); + static Guid GetUniqueDeviceId(); static String GetComputerName(); - static bool GetHasFocus(); - static void CreateGuid(Guid& result); - static bool CanOpenUrl(const StringView& url); - static void OpenUrl(const StringView& url); static Float2 GetMousePosition(); static void SetMousePosition(const Float2& pos); - static Rectangle GetMonitorBounds(const Float2& screenPos); - static Float2 GetDesktopSize(); - static Rectangle GetVirtualDesktopBounds(); + static Rectangle GetMonitorBounds(const Float2& screenPos); + static Float2 GetDesktopSize(); + static Rectangle GetVirtualDesktopBounds(); static String GetMainDirectory(); - static String GetExecutableFilePath(); - static Guid GetUniqueDeviceId(); - static String GetWorkingDirectory(); - static bool SetWorkingDirectory(const String& path); static Window* CreateWindow(const CreateWindowSettings& settings); - static bool GetEnvironmentVariable(const String& name, String& value); - static bool SetEnvironmentVariable(const String& name, const String& value); - static int32 StartProcess(const StringView& filename, const StringView& args, const StringView& workingDir, bool hiddenWindow = false, bool waitForEnd = false); - static int32 RunProcess(const StringView& cmdLine, const StringView& workingDir, bool hiddenWindow = true); - static int32 RunProcess(const StringView& cmdLine, const StringView& workingDir, const Dictionary& environment, bool hiddenWindow = true); - static void* LoadLibrary(const Char* filename); - static void FreeLibrary(void* handle); - static void* GetProcAddress(void* handle, const char* symbol); - static Array GetStackFrames(int32 skipCount = 0, int32 maxDepth = 60, void* context = nullptr); + static int32 CreateProcess(CreateProcessSettings& settings); }; #endif diff --git a/Source/Engine/Platform/Mac/MacPlatformSettings.h b/Source/Engine/Platform/Mac/MacPlatformSettings.h index 8fbe6327e..d3ef21fc4 100644 --- a/Source/Engine/Platform/Mac/MacPlatformSettings.h +++ b/Source/Engine/Platform/Mac/MacPlatformSettings.h @@ -4,25 +4,15 @@ #if PLATFORM_MAC || USE_EDITOR -#include "Engine/Core/Config/PlatformSettingsBase.h" -#include "Engine/Core/Types/String.h" -#include "Engine/Scripting/SoftObjectReference.h" - -class Texture; +#include "../Apple/ApplePlatformSettings.h" /// /// Mac platform settings. /// -API_CLASS(sealed, Namespace="FlaxEditor.Content.Settings") class FLAXENGINE_API MacPlatformSettings : public SettingsBase +API_CLASS(Sealed, Namespace="FlaxEditor.Content.Settings") class FLAXENGINE_API MacPlatformSettings : public ApplePlatformSettings { DECLARE_SCRIPTING_TYPE_MINIMAL(MacPlatformSettings); - /// - /// The app identifier (reversed DNS, eg. com.company.product). Custom tokens: ${PROJECT_NAME}, ${COMPANY_NAME}. - /// - API_FIELD(Attributes="EditorOrder(0), EditorDisplay(\"General\")") - String AppIdentifier = TEXT("com.${COMPANY_NAME}.${PROJECT_NAME}"); - /// /// The default game window mode. /// @@ -47,12 +37,6 @@ API_CLASS(sealed, Namespace="FlaxEditor.Content.Settings") class FLAXENGINE_API API_FIELD(Attributes="EditorOrder(140), EditorDisplay(\"Window\")") bool ResizableWindow = false; - /// - /// Custom icon texture to use for the application (overrides the default one). - /// - API_FIELD(Attributes="EditorOrder(1000), EditorDisplay(\"Other\")") - SoftObjectReference OverrideIcon; - /// /// Enables game running when application window loses focus. /// @@ -68,12 +52,11 @@ public: // [SettingsBase] void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) final override { - DESERIALIZE(AppIdentifier); + ApplePlatformSettings::Deserialize(stream, modifier); DESERIALIZE(WindowMode); DESERIALIZE(ScreenWidth); DESERIALIZE(ScreenHeight); DESERIALIZE(ResizableWindow); - DESERIALIZE(OverrideIcon); DESERIALIZE(RunInBackground); } }; diff --git a/Source/Engine/Platform/Mac/MacWindow.cpp b/Source/Engine/Platform/Mac/MacWindow.cpp index 61a811b75..90bb07279 100644 --- a/Source/Engine/Platform/Mac/MacWindow.cpp +++ b/Source/Engine/Platform/Mac/MacWindow.cpp @@ -3,7 +3,7 @@ #if PLATFORM_MAC #include "../Window.h" -#include "MacUtils.h" +#include "Engine/Platform/Apple/AppleUtils.h" #include "Engine/Platform/IGuiData.h" #include "Engine/Core/Log.h" #include "Engine/Input/Input.h" @@ -167,14 +167,14 @@ Float2 GetWindowTitleSize(const MacWindow* window) NSRect frameStart = [(NSWindow*)window->GetNativePtr() frameRectForContentRect:NSMakeRect(0, 0, 0, 0)]; size.Y = frameStart.size.height; } - return size; + return size * MacPlatform::ScreenScale; } Float2 GetMousePosition(MacWindow* window, NSEvent* event) { NSRect frame = [(NSWindow*)window->GetNativePtr() frame]; NSPoint point = [event locationInWindow]; - return Float2(point.x, frame.size.height - point.y) - GetWindowTitleSize(window); + return Float2(point.x, frame.size.height - point.y) * MacPlatform::ScreenScale - GetWindowTitleSize(window); } class MacDropData : public IGuiData @@ -208,7 +208,7 @@ void GetDragDropData(const MacWindow* window, id sender, Float2& if ([[pasteboard types] containsObject:NSPasteboardTypeString]) { dropData.CurrentType = IGuiData::Type::Text; - dropData.AsText = MacUtils::ToString((CFStringRef)[pasteboard stringForType:NSPasteboardTypeString]); + dropData.AsText = AppleUtils::ToString((CFStringRef)[pasteboard stringForType:NSPasteboardTypeString]); } else { @@ -218,7 +218,7 @@ void GetDragDropData(const MacWindow* window, id sender, Float2& { NSString* url = [[files objectAtIndex:i] path]; NSString* file = [NSURL URLWithString:url].path; - dropData.AsFiles.Add(MacUtils::ToString((CFStringRef)file)); + dropData.AsFiles.Add(AppleUtils::ToString((CFStringRef)file)); } } } @@ -255,17 +255,54 @@ NSDragOperation GetDragDropOperation(DragDropEffect dragDropEffect) @implementation MacWindowImpl +- (BOOL)canBecomeKeyWindow +{ + if (Window && !Window->GetSettings().AllowInput) + { + return NO; + } + return YES; +} + +- (void)windowDidBecomeKey:(NSNotification*)notification +{ + // Handle resizing to be sure that content has valid size when window was resized + [self windowDidResize:notification]; + + Window->OnGotFocus(); +} + +- (void)windowDidResignKey:(NSNotification*)notification +{ + Window->OnLostFocus(); +} + - (void)windowWillClose:(NSNotification*)notification { [self setDelegate: nil]; Window->Close(ClosingReason::User); } +static void ConvertNSRect(NSScreen *screen, NSRect *r) +{ + r->origin.y = CGDisplayPixelsHigh(kCGDirectMainDisplay) - r->origin.y - r->size.height; +} + - (void)windowDidResize:(NSNotification*)notification { NSView* view = [self contentView]; - NSRect contextRect = [view frame]; - Window->CheckForResize((float)contextRect.size.width, (float)contextRect.size.height); + const float screenScale = MacPlatform::ScreenScale; + NSWindow* nswindow = (NSWindow*)Window->GetNativePtr(); + NSRect rect = [nswindow contentRectForFrameRect:[nswindow frame]]; + ConvertNSRect([nswindow screen], &rect); + + // Rescale contents + CALayer* layer = [view layer]; + if (layer) + layer.contentsScale = screenScale; + + // Resize window + Window->CheckForResize((float)rect.size.width * screenScale, (float)rect.size.height * screenScale); } - (void)setWindow:(MacWindow*)window @@ -349,6 +386,10 @@ NSDragOperation GetDragDropOperation(DragDropEffect dragDropEffect) // Ignore text from special keys case KeyboardKeys::Delete: case KeyboardKeys::Backspace: + case KeyboardKeys::ArrowLeft: + case KeyboardKeys::ArrowRight: + case KeyboardKeys::ArrowUp: + case KeyboardKeys::ArrowDown: return; } NSString* text = [event characters]; @@ -544,7 +585,7 @@ MacWindow::MacWindow(const CreateWindowSettings& settings) : WindowBase(settings) { _clientSize = Float2(settings.Size.X, settings.Size.Y); - Float2 pos = MacUtils::PosToCoca(settings.Position); + Float2 pos = AppleUtils::PosToCoca(settings.Position); NSRect frame = NSMakeRect(pos.X, pos.Y - settings.Size.Y, settings.Size.X, settings.Size.Y); NSUInteger styleMask = NSWindowStyleMaskClosable; if (settings.IsRegularWindow) @@ -565,6 +606,12 @@ MacWindow::MacWindow(const CreateWindowSettings& settings) styleMask &= ~NSWindowStyleMaskFullSizeContentView; } + const float screenScale = MacPlatform::ScreenScale; + frame.origin.x /= screenScale; + frame.origin.y /= screenScale; + frame.size.width /= screenScale; + frame.size.height /= screenScale; + MacWindowImpl* window = [[MacWindowImpl alloc] initWithContentRect:frame styleMask:(styleMask) backing:NSBackingStoreBuffered @@ -572,7 +619,7 @@ MacWindow::MacWindow(const CreateWindowSettings& settings) MacViewImpl* view = [[MacViewImpl alloc] init]; view.wantsLayer = YES; [view setWindow:this]; - window.title = (__bridge NSString*)MacUtils::ToString(settings.Title); + window.title = (__bridge NSString*)AppleUtils::ToString(settings.Title); [window setWindow:this]; [window setReleasedWhenClosed:NO]; [window setMinSize:NSMakeSize(settings.MinimumSize.X, settings.MinimumSize.Y)]; @@ -587,6 +634,11 @@ MacWindow::MacWindow(const CreateWindowSettings& settings) [view registerForDraggedTypes:@[NSPasteboardTypeFileURL, NSPasteboardTypeString]]; } + // Rescale contents + CALayer* layer = [view layer]; + if (layer) + layer.contentsScale = screenScale; + // TODO: impl Parent for MacWindow // TODO: impl StartPosition for MacWindow // TODO: impl Fullscreen for MacWindow @@ -618,17 +670,19 @@ void MacWindow::SetIsMouseOver(bool value) if (_isMouseOver == value) return; _isMouseOver = value; + CursorType cursor = _cursor; if (value) { // Refresh cursor typet - SetCursor(_cursor); + SetCursor(CursorType::Default); + SetCursor(cursor); } else { Input::Mouse->OnMouseLeave(this); - if (_cursor == CursorType::Hidden) - [NSCursor unhide]; + SetCursor(CursorType::Default); + _cursor = cursor; } } @@ -665,6 +719,8 @@ void MacWindow::Hide() { if (_visible) { + SetCursor(CursorType::Default); + // Hide NSWindow* window = (NSWindow*)_window; [window orderOut:nil]; @@ -710,7 +766,7 @@ bool MacWindow::IsClosed() const bool MacWindow::IsForegroundWindow() const { - return Platform::GetHasFocus(); + return Platform::GetHasFocus() && IsFocused(); } void MacWindow::BringToFront(bool force) @@ -736,7 +792,7 @@ void MacWindow::SetClientBounds(const Rectangle& clientArea) //newRect.origin.x = oldRect.origin.x; //newRect.origin.y = NSMaxY(oldRect) - newRect.size.height; - Float2 pos = MacUtils::PosToCoca(clientArea.Location); + Float2 pos = AppleUtils::PosToCoca(clientArea.Location); Float2 titleSize = GetWindowTitleSize(this); newRect.origin.x = pos.X + titleSize.X; newRect.origin.y = pos.Y - newRect.size.height + titleSize.Y; @@ -749,7 +805,7 @@ void MacWindow::SetPosition(const Float2& position) NSWindow* window = (NSWindow*)_window; if (!window) return; - Float2 pos = MacUtils::PosToCoca(position); + Float2 pos = AppleUtils::PosToCoca(position) / MacPlatform::ScreenScale; NSRect rect = [window frame]; [window setFrameOrigin:NSMakePoint(pos.X, pos.Y - rect.size.height)]; } @@ -760,7 +816,7 @@ Float2 MacWindow::GetPosition() const if (!window) return Float2::Zero; NSRect rect = [window frame]; - return MacUtils::CocaToPos(Float2(rect.origin.x, rect.origin.y + rect.size.height)); + return AppleUtils::CocaToPos(Float2(rect.origin.x, rect.origin.y + rect.size.height) * MacPlatform::ScreenScale); } Float2 MacWindow::GetSize() const @@ -769,7 +825,7 @@ Float2 MacWindow::GetSize() const if (!window) return Float2::Zero; NSRect rect = [window frame]; - return Float2(rect.size.width, rect.size.height); + return Float2(rect.size.width, rect.size.height) * MacPlatform::ScreenScale; } Float2 MacWindow::GetClientSize() const @@ -825,7 +881,7 @@ void MacWindow::SetTitle(const StringView& title) NSWindow* window = (NSWindow*)_window; if (!window) return; - [window setTitle:(__bridge NSString*)MacUtils::ToString(_title)]; + [window setTitle:(__bridge NSString*)AppleUtils::ToString(_title)]; } DragDropEffect MacWindow::DoDragDrop(const StringView& data) @@ -836,6 +892,9 @@ DragDropEffect MacWindow::DoDragDrop(const StringView& data) void MacWindow::SetCursor(CursorType type) { + CursorType prev = _cursor; + if (prev == type) + return; WindowBase::SetCursor(type); //if (!_isMouseOver) // return; @@ -874,8 +933,11 @@ void MacWindow::SetCursor(CursorType type) } if (cursor) { + if (prev == CursorType::Hidden) + { + [NSCursor unhide]; + } [cursor set]; - [NSCursor unhide]; } } diff --git a/Source/Engine/Platform/Mac/MacWindow.h b/Source/Engine/Platform/Mac/MacWindow.h index 2a554163c..8850f80ba 100644 --- a/Source/Engine/Platform/Mac/MacWindow.h +++ b/Source/Engine/Platform/Mac/MacWindow.h @@ -14,7 +14,6 @@ class FLAXENGINE_API MacWindow : public WindowBase { private: - Float2 _clientSize; void* _window; bool _isMouseOver = false; @@ -28,7 +27,7 @@ public: public: - // [Window] + // [WindowBase] void* GetNativePtr() const override; void Show() override; void Hide() override; diff --git a/Source/Engine/Platform/Network.h b/Source/Engine/Platform/Network.h index fda650304..e41d3c7e4 100644 --- a/Source/Engine/Platform/Network.h +++ b/Source/Engine/Platform/Network.h @@ -4,7 +4,7 @@ #if PLATFORM_WINDOWS || PLATFORM_UWP || PLATFORM_XBOX_ONE || PLATFORM_XBOX_SCARLETT #include "Win32/Win32Network.h" -#elif PLATFORM_LINUX || PLATFORM_ANDROID || PLATFORM_MAC +#elif PLATFORM_LINUX || PLATFORM_ANDROID || PLATFORM_MAC || PLATFORM_IOS #include "Unix/UnixNetwork.h" #elif PLATFORM_PS4 #include "Platforms/PS4/Engine/Platform/PS4Network.h" @@ -12,8 +12,6 @@ #include "Platforms/PS5/Engine/Platform/PS5Network.h" #elif PLATFORM_SWITCH #include "Platforms/Switch/Engine/Platform/SwitchNetwork.h" -#elif PLATFORM_MAC -#include "Mac/MacNetwork.h" #else #error Missing Network implementation! #endif diff --git a/Source/Engine/Platform/Platform.Build.cs b/Source/Engine/Platform/Platform.Build.cs index bfdd07d6f..1aa50b327 100644 --- a/Source/Engine/Platform/Platform.Build.cs +++ b/Source/Engine/Platform/Platform.Build.cs @@ -79,8 +79,14 @@ public class Platform : EngineModule break; case TargetPlatform.Mac: options.SourcePaths.Add(Path.Combine(FolderPath, "Unix")); + options.SourcePaths.Add(Path.Combine(FolderPath, "Apple")); options.SourcePaths.Add(Path.Combine(FolderPath, "Mac")); break; + case TargetPlatform.iOS: + options.SourcePaths.Add(Path.Combine(FolderPath, "Unix")); + options.SourcePaths.Add(Path.Combine(FolderPath, "Apple")); + options.SourcePaths.Add(Path.Combine(FolderPath, "iOS")); + break; default: throw new InvalidPlatformException(options.Platform.Target); } if (options.Target.IsEditor) @@ -91,7 +97,9 @@ public class Platform : EngineModule options.SourceFiles.Add(Path.Combine(FolderPath, "Linux", "LinuxPlatformSettings.h")); options.SourceFiles.Add(Path.Combine(FolderPath, "Android", "AndroidPlatformSettings.h")); options.SourceFiles.Add(Path.Combine(FolderPath, "GDK", "GDKPlatformSettings.h")); + options.SourceFiles.Add(Path.Combine(FolderPath, "Apple", "ApplePlatformSettings.h")); options.SourceFiles.Add(Path.Combine(FolderPath, "Mac", "MacPlatformSettings.h")); + options.SourceFiles.Add(Path.Combine(FolderPath, "iOS", "iOSPlatformSettings.h")); AddSourceFileIfExists(options, Path.Combine(Globals.EngineRoot, "Source", "Platforms", "XboxOne", "Engine", "Platform", "XboxOnePlatformSettings.h")); AddSourceFileIfExists(options, Path.Combine(Globals.EngineRoot, "Source", "Platforms", "XboxScarlett", "Engine", "Platform", "XboxScarlettPlatformSettings.h")); AddSourceFileIfExists(options, Path.Combine(Globals.EngineRoot, "Source", "Platforms", "PS4", "Engine", "Platform", "PS4PlatformSettings.h")); diff --git a/Source/Engine/Platform/Platform.h b/Source/Engine/Platform/Platform.h index 4d9e090f8..986aeec90 100644 --- a/Source/Engine/Platform/Platform.h +++ b/Source/Engine/Platform/Platform.h @@ -28,6 +28,8 @@ #include "Platforms/Switch/Engine/Platform/SwitchPlatform.h" #elif PLATFORM_MAC #include "Mac/MacPlatform.h" +#elif PLATFORM_IOS +#include "iOS/iOSPlatform.h" #else #error Missing Platform implementation! #endif diff --git a/Source/Engine/Platform/StringUtils.h b/Source/Engine/Platform/StringUtils.h index ea982c2ee..04e644d2e 100644 --- a/Source/Engine/Platform/StringUtils.h +++ b/Source/Engine/Platform/StringUtils.h @@ -21,12 +21,11 @@ enum class StringSearchCase }; /// -/// The string operations utilities collection. +/// The string operations utilities. /// class FLAXENGINE_API StringUtils { public: - /// /// Calculates the hash code for input string. /// @@ -65,7 +64,6 @@ public: } public: - // Returns true if character is uppercase static bool IsUpper(char c); @@ -92,7 +90,6 @@ public: static char ToLower(char c); public: - // Returns true if character is uppercase static bool IsUpper(Char c); @@ -119,7 +116,6 @@ public: static Char ToLower(Char c); public: - // Compare two strings with case sensitive. Strings must not be null. static int32 Compare(const Char* str1, const Char* str2); @@ -145,7 +141,6 @@ public: static int32 CompareIgnoreCase(const char* str1, const char* str2, int32 maxCount); public: - // Get string length. Returns 0 if str is null. static int32 Length(const Char* str); @@ -183,7 +178,6 @@ public: static const char* FindIgnoreCase(const char* str, const char* toFind); public: - // Converts characters from ANSI to UTF-16 static void ConvertANSI2UTF16(const char* from, Char* to, int32 len); @@ -203,7 +197,6 @@ public: static char* ConvertUTF162UTF8(const Char* from, int32 fromLength, int32& toLength); public: - // Returns the directory name of the specified path string // @param path The path string from which to obtain the directory name // @returns Directory name @@ -224,95 +217,8 @@ public: static void PathRemoveRelativeParts(String& path); public: - - /// - /// Convert integer value to string - /// - /// Value to convert - /// Base (8,10,16) - /// Input buffer - /// Result string length - template - static void itoa(int32 value, int32 base, CharType* buffer, int32& length) - { - // Allocate buffer - bool isNegative = false; - CharType* pos = buffer; - CharType* pos1 = buffer; - length = 0; - - // Validate input base - if (base < 8 || base > 16) - { - *pos = '\0'; - return; - } - - // Special case for zero - if (value == 0) - { - length++; - *pos++ = '0'; - *pos = '\0'; - return; - } - - // Check if value is negative - if (value < 0) - { - isNegative = true; - value = -value; - } - - // Convert. If base is power of two (2,4,8,16..) - // we could use binary and operation and shift offset instead of division - while (value) - { - length++; - int32 reminder = value % base; - *pos++ = reminder + (reminder > 9 ? 'a' - 10 : '0'); - value /= base; - } - - // Apply negative sign - if (isNegative) - *pos++ = '-'; - - // Add null terminator char - *pos-- = 0; - - // Reverse the buffer - while (pos1 < pos) - { - CharType c = *pos; - *pos-- = *pos1; - *pos1++ = c; - } - } - - static int32 HexDigit(Char c) - { - int32 result = 0; - - if (c >= '0' && c <= '9') - { - result = c - '0'; - } - else if (c >= 'a' && c <= 'f') - { - result = c + 10 - 'a'; - } - else if (c >= 'A' && c <= 'F') - { - result = c + 10 - 'A'; - } - else - { - result = 0; - } - - return result; - } + // Converts hexadecimal character into the value. + static int32 HexDigit(Char c); // Parse text to unsigned integer value // @param str String to parse @@ -431,7 +337,6 @@ public: static bool Parse(const char* str, float* result); public: - static String ToString(int32 value); static String ToString(int64 value); static String ToString(uint32 value); @@ -440,7 +345,6 @@ public: static String ToString(double value); public: - // Returns the String to double null-terminated string // @param str Double null-terminated string // @return Double null-terminated String diff --git a/Source/Engine/Platform/Thread.h b/Source/Engine/Platform/Thread.h index 1cf585014..be85b36f9 100644 --- a/Source/Engine/Platform/Thread.h +++ b/Source/Engine/Platform/Thread.h @@ -14,8 +14,8 @@ #include "Android/AndroidThread.h" #elif PLATFORM_SWITCH #include "Platforms/Switch/Engine/Platform/SwitchThread.h" -#elif PLATFORM_MAC -#include "Mac/MacThread.h" +#elif PLATFORM_MAC || PLATFORM_IOS +#include "Apple/AppleThread.h" #else #error Missing Thread implementation! #endif diff --git a/Source/Engine/Platform/Types.h b/Source/Engine/Platform/Types.h index cb218ddf0..76135dcaf 100644 --- a/Source/Engine/Platform/Types.h +++ b/Source/Engine/Platform/Types.h @@ -243,8 +243,8 @@ class UnixFile; typedef UnixFile File; class MacPlatform; typedef MacPlatform Platform; -class MacThread; -typedef MacThread Thread; +class AppleThread; +typedef AppleThread Thread; class MacWindow; typedef MacWindow Window; class UnixNetwork; @@ -252,6 +252,31 @@ typedef UnixNetwork Network; class UserBase; typedef UserBase User; +#elif PLATFORM_IOS + +class ClipboardBase; +typedef ClipboardBase Clipboard; +class UnixCriticalSection; +typedef UnixCriticalSection CriticalSection; +class UnixConditionVariable; +typedef UnixConditionVariable ConditionVariable; +class iOSFileSystem; +typedef iOSFileSystem FileSystem; +class FileSystemWatcherBase; +typedef FileSystemWatcherBase FileSystemWatcher; +class iOSFile; +typedef iOSFile File; +class iOSPlatform; +typedef iOSPlatform Platform; +class AppleThread; +typedef AppleThread Thread; +class iOSWindow; +typedef iOSWindow Window; +class UnixNetwork; +typedef UnixNetwork Network; +class UserBase; +typedef UserBase User; + #else #error Missing Types implementation! diff --git a/Source/Engine/Platform/UWP/UWPDefines.h b/Source/Engine/Platform/UWP/UWPDefines.h index c2710f6e8..d78801ee3 100644 --- a/Source/Engine/Platform/UWP/UWPDefines.h +++ b/Source/Engine/Platform/UWP/UWPDefines.h @@ -11,6 +11,6 @@ // Use AOT for Mono #define USE_MONO_AOT 1 -#define USE_MONO_AOT_MODE MONO_AOT_MODE_INTERP // TODO: support Full AOT mode instead of interpreter +#define USE_MONO_AOT_MODE MONO_AOT_MODE_FULL #endif diff --git a/Source/Engine/Platform/UWP/UWPPlatform.cpp b/Source/Engine/Platform/UWP/UWPPlatform.cpp index 06a0d964d..58240ca89 100644 --- a/Source/Engine/Platform/UWP/UWPPlatform.cpp +++ b/Source/Engine/Platform/UWP/UWPPlatform.cpp @@ -148,16 +148,6 @@ bool UWPPlatform::GetHasFocus() return true; } -bool UWPPlatform::CanOpenUrl(const StringView& url) -{ - return false; -} - -void UWPPlatform::OpenUrl(const StringView& url) -{ - // TODO: add support for OpenUrl on UWP -} - Float2 UWPPlatform::GetDesktopSize() { Float2 result; @@ -165,18 +155,6 @@ Float2 UWPPlatform::GetDesktopSize() return result; } -Rectangle UWPPlatform::GetMonitorBounds(const Float2& screenPos) -{ - // TODO: do it in a proper way - return Rectangle(Float2::Zero, GetDesktopSize()); -} - -Rectangle UWPPlatform::GetVirtualDesktopBounds() -{ - // TODO: do it in a proper way - return Rectangle(Float2::Zero, GetDesktopSize()); -} - Window* UWPPlatform::CreateWindow(const CreateWindowSettings& settings) { // Settings with provided UWPWindowImpl are only valid diff --git a/Source/Engine/Platform/UWP/UWPPlatform.h b/Source/Engine/Platform/UWP/UWPPlatform.h index 9bc0d7afd..f2f629d02 100644 --- a/Source/Engine/Platform/UWP/UWPPlatform.h +++ b/Source/Engine/Platform/UWP/UWPPlatform.h @@ -35,11 +35,7 @@ public: static String GetUserLocaleName(); static String GetComputerName(); static bool GetHasFocus(); - static bool CanOpenUrl(const StringView& url); - static void OpenUrl(const StringView& url); - static Rectangle GetMonitorBounds(const Float2& screenPos); static Float2 GetDesktopSize(); - static Rectangle GetVirtualDesktopBounds(); static Window* CreateWindow(const CreateWindowSettings& settings); static void* LoadLibrary(const Char* filename); }; diff --git a/Source/Engine/Platform/UWP/UWPWindow.h b/Source/Engine/Platform/UWP/UWPWindow.h index 8e4a62bb8..1d89cdd00 100644 --- a/Source/Engine/Platform/UWP/UWPWindow.h +++ b/Source/Engine/Platform/UWP/UWPWindow.h @@ -150,7 +150,7 @@ private: public: - // [Window] + // [WindowBase] void* GetNativePtr() const override { return _impl->GetHandle(); diff --git a/Source/Engine/Platform/Win32/IncludeWindowsHeaders.h b/Source/Engine/Platform/Win32/IncludeWindowsHeaders.h index c2494c474..3f2b8d36e 100644 --- a/Source/Engine/Platform/Win32/IncludeWindowsHeaders.h +++ b/Source/Engine/Platform/Win32/IncludeWindowsHeaders.h @@ -55,6 +55,7 @@ #undef MessageBox #undef GetCommandLine #undef CreateWindow +#undef CreateProcess #undef SetWindowText #undef DrawText #undef CreateFont diff --git a/Source/Engine/Platform/Window.h b/Source/Engine/Platform/Window.h index b5b3ff7d2..20acde185 100644 --- a/Source/Engine/Platform/Window.h +++ b/Source/Engine/Platform/Window.h @@ -22,6 +22,8 @@ #include "Platforms/PS5/Engine/Platform/PS5Window.h" #elif PLATFORM_MAC #include "Mac/MacWindow.h" +#elif PLATFORM_IOS +#include "iOS/iOSWindow.h" #else #error Missing Window implementation! #endif diff --git a/Source/Engine/Platform/Windows/WindowsFileSystem.cpp b/Source/Engine/Platform/Windows/WindowsFileSystem.cpp index 04f757bc0..83f042730 100644 --- a/Source/Engine/Platform/Windows/WindowsFileSystem.cpp +++ b/Source/Engine/Platform/Windows/WindowsFileSystem.cpp @@ -6,6 +6,7 @@ #include "Engine/Platform/File.h" #include "Engine/Platform/Window.h" #include "Engine/Platform/Windows/ComPtr.h" +#include "Engine/Platform/CreateProcessSettings.h" #include "Engine/Core/Types/StringView.h" #include "../Win32/IncludeWindowsHeaders.h" @@ -16,6 +17,7 @@ #include #include #include +#undef ShellExecute namespace Windows { @@ -335,7 +337,14 @@ bool WindowsFileSystem::ShowBrowseFolderDialog(Window* parentWindow, const Strin bool WindowsFileSystem::ShowFileExplorer(const StringView& path) { - return Platform::StartProcess(path, StringView::Empty, StringView::Empty) != 0; + CreateProcessSettings procSettings; + procSettings.FileName = path; + procSettings.FileName = path; + procSettings.HiddenWindow = false; + procSettings.WaitForEnd = false; + procSettings.LogOutput = false; + procSettings.ShellExecute = true; + return Platform::CreateProcess(procSettings) != 0; } #endif diff --git a/Source/Engine/Platform/Windows/WindowsPlatform.cpp b/Source/Engine/Platform/Windows/WindowsPlatform.cpp index 7c8a5b060..8d02312af 100644 --- a/Source/Engine/Platform/Windows/WindowsPlatform.cpp +++ b/Source/Engine/Platform/Windows/WindowsPlatform.cpp @@ -6,6 +6,7 @@ #include "Engine/Platform/Window.h" #include "Engine/Platform/FileSystem.h" #include "Engine/Platform/CreateWindowSettings.h" +#include "Engine/Platform/CreateProcessSettings.h" #include "Engine/Platform/WindowsManager.h" #include "Engine/Platform/MemoryStats.h" #include "Engine/Platform/BatteryInfo.h" @@ -23,6 +24,7 @@ #include #include #include +#undef ShellExecute #if CRASH_LOG_ENABLE #include #endif @@ -305,10 +307,13 @@ LONG CALLBACK SehExceptionHandler(EXCEPTION_POINTERS* ep) errorMsg += String::Format(TEXT("{:#x}"), (uint32)ep->ExceptionRecord->ExceptionCode); } - // Pause if debugging + // Log exception and return to the crash location when using debugger if (Platform::IsDebuggerPresent()) { - PLATFORM_DEBUG_BREAK; + LOG_STR(Error, errorMsg); + const String stackTrace = Platform::GetStackTrace(0, 60, ep); + LOG_STR(Error, stackTrace); + return EXCEPTION_CONTINUE_SEARCH; } // Crash engine @@ -930,7 +935,7 @@ bool WindowsPlatform::GetEnvironmentVariable(const String& name, String& value) DWORD result = GetEnvironmentVariableW(*name, buffer, bufferSize); if (result == 0) { - LOG_WIN32_LAST_ERROR; + //LOG_WIN32_LAST_ERROR; return true; } if (bufferSize < result) @@ -960,54 +965,12 @@ bool WindowsPlatform::SetEnvironmentVariable(const String& name, const String& v return false; } -int32 WindowsPlatform::StartProcess(const StringView& filename, const StringView& args, const StringView& workingDir, bool hiddenWindow, bool waitForEnd) -{ - // Info - LOG(Info, "Command: {0} {1}", filename, args); - if (workingDir.HasChars()) - { - LOG(Info, "Working directory: {0}", workingDir); - } - - String filenameString(filename); - - SHELLEXECUTEINFOW shExecInfo = { 0 }; - shExecInfo.cbSize = sizeof(SHELLEXECUTEINFOW); - shExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; - shExecInfo.lpFile = filenameString.GetText(); - shExecInfo.lpParameters = args.HasChars() ? args.Get() : nullptr; - shExecInfo.lpDirectory = workingDir.HasChars() ? workingDir.Get() : nullptr; - shExecInfo.nShow = hiddenWindow ? SW_HIDE : SW_SHOW; - if (ShellExecuteExW(&shExecInfo) == FALSE) - { - LOG(Warning, "Cannot start process '{0}' with arguments '{2}'. Error code: {1:x}", filename, (int64)GetLastError(), args); - return 1; - } - - int32 result = 0; - if (waitForEnd) - { - WaitForSingleObject(shExecInfo.hProcess, INFINITE); - DWORD exitCode; - if (GetExitCodeProcess(shExecInfo.hProcess, &exitCode) != 0) - result = exitCode; - CloseHandle(shExecInfo.hProcess); - } - - return result; -} - -int32 WindowsPlatform::RunProcess(const StringView& cmdLine, const StringView& workingDir, bool hiddenWindow) -{ - return RunProcess(cmdLine, workingDir, Dictionary(), hiddenWindow); -} - bool IsProcRunning(HANDLE handle) { return WaitForSingleObject(handle, 0) == WAIT_TIMEOUT; } -void ReadPipe(HANDLE pipe, Array& rawData, Array& logData, LogType logType) +void ReadPipe(HANDLE pipe, Array& rawData, Array& logData, LogType logType, CreateProcessSettings& settings) { // Check if any data is ready to read DWORD bytesAvailable = 0; @@ -1031,162 +994,183 @@ void ReadPipe(HANDLE pipe, Array& rawData, Array& logData, LogType l logData.Resize(rawData.Count() + 1); StringUtils::ConvertANSI2UTF16(rawData.Get(), logData.Get(), rawData.Count()); logData.Last() = '\0'; - Log::Logger::Write(logType, StringView(logData.Get(), rawData.Count())); + if (settings.LogOutput) + Log::Logger::Write(logType, StringView(logData.Get(), rawData.Count())); + if (settings.SaveOutput) + settings.Output.Add(logData.Get(), rawData.Count()); } } } -int32 WindowsPlatform::RunProcess(const StringView& cmdLine, const StringView& workingDir, const Dictionary& environment, bool hiddenWindow) +int32 WindowsPlatform::CreateProcess(CreateProcessSettings& settings) { - const bool captureStdOut = true; - - // Info - LOG(Info, "Command: {0}", cmdLine); - if (workingDir.HasChars()) + LOG(Info, "Command: {0} {1}", settings.FileName, settings.Arguments); + if (settings.WorkingDirectory.HasChars()) { - LOG(Info, "Working directory: {0}", workingDir); + LOG(Info, "Working directory: {0}", settings.WorkingDirectory); } + const bool captureStdOut = settings.LogOutput || settings.SaveOutput; - int32 result = -1; - - STARTUPINFOEX startupInfoEx; - ZeroMemory(&startupInfoEx, sizeof(startupInfoEx)); - startupInfoEx.StartupInfo.cb = sizeof(startupInfoEx); - if (hiddenWindow) + int32 result = 0; + if (settings.ShellExecute) { - startupInfoEx.StartupInfo.dwFlags |= STARTF_USESHOWWINDOW; - startupInfoEx.StartupInfo.wShowWindow |= SW_HIDE | SW_SHOWNOACTIVATE; - } - - DWORD dwCreationFlags = NORMAL_PRIORITY_CLASS | DETACHED_PROCESS; - if (hiddenWindow) - dwCreationFlags |= CREATE_NO_WINDOW; - - Char* environmentStr = nullptr; - if (environment.HasItems()) - { - dwCreationFlags |= CREATE_UNICODE_ENVIRONMENT; - - int32 totalLength = 1; - for (auto& e : environment) - totalLength += e.Key.Length() + e.Value.Length() + 2; - - environmentStr = (Char*)Allocator::Allocate(totalLength * sizeof(Char)); - - Char* env = environmentStr; - for (auto& e : environment) + SHELLEXECUTEINFOW shExecInfo = { 0 }; + shExecInfo.cbSize = sizeof(SHELLEXECUTEINFOW); + shExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; + shExecInfo.lpFile = settings.FileName.GetText(); + shExecInfo.lpParameters = settings.Arguments.HasChars() ? settings.Arguments.Get() : nullptr; + shExecInfo.lpDirectory = settings.WorkingDirectory.HasChars() ? settings.WorkingDirectory.Get() : nullptr; + shExecInfo.nShow = settings.HiddenWindow ? SW_HIDE : SW_SHOW; + if (ShellExecuteExW(&shExecInfo) == FALSE) { - auto& key = e.Key; - auto& value = e.Value; - Platform::MemoryCopy(env, key.Get(), key.Length() * sizeof(Char)); - env += key.Length(); - *env++ = '='; - Platform::MemoryCopy(env, value.Get(), value.Length() * sizeof(Char)); - env += value.Length(); - *env++ = 0; + result = 1; + LOG(Warning, "Cannot start process. Error code: 0x{0:x}", (uint64)GetLastError()); } - *env++ = 0; - ASSERT((uint64)env - (uint64)environmentStr == (uint64)(totalLength * sizeof(Char))); - } - - HANDLE stdOutRead = nullptr; - HANDLE stdErrRead = nullptr; - - if (captureStdOut) - { - dwCreationFlags |= EXTENDED_STARTUPINFO_PRESENT; - startupInfoEx.StartupInfo.dwFlags |= STARTF_USESTDHANDLES; - - SECURITY_ATTRIBUTES securityAttributes; - securityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES); - securityAttributes.bInheritHandle = TRUE; - securityAttributes.lpSecurityDescriptor = nullptr; - - if (!CreatePipe(&stdOutRead, &startupInfoEx.StartupInfo.hStdOutput, &securityAttributes, 0) || - !CreatePipe(&stdErrRead, &startupInfoEx.StartupInfo.hStdError, &securityAttributes, 0)) + else if (settings.WaitForEnd) { - LOG(Warning, "CreatePipe failed"); - return 1; + WaitForSingleObject(shExecInfo.hProcess, INFINITE); + DWORD exitCode; + if (GetExitCodeProcess(shExecInfo.hProcess, &exitCode) != 0) + result = exitCode; + CloseHandle(shExecInfo.hProcess); + } + } + else + { + result = -1; + const String cmdLine = settings.FileName + TEXT(" ") + settings.Arguments; + + STARTUPINFOEX startupInfoEx; + ZeroMemory(&startupInfoEx, sizeof(startupInfoEx)); + startupInfoEx.StartupInfo.cb = sizeof(startupInfoEx); + if (settings.HiddenWindow) + { + startupInfoEx.StartupInfo.dwFlags |= STARTF_USESHOWWINDOW; + startupInfoEx.StartupInfo.wShowWindow |= SW_HIDE | SW_SHOWNOACTIVATE; } - SIZE_T bufferSize = 0; - if (!InitializeProcThreadAttributeList(nullptr, 1, 0, &bufferSize) && GetLastError() == ERROR_INSUFFICIENT_BUFFER) + DWORD dwCreationFlags = NORMAL_PRIORITY_CLASS | DETACHED_PROCESS; + if (settings.HiddenWindow) + dwCreationFlags |= CREATE_NO_WINDOW; + + Char* environmentStr = nullptr; + if (settings.Environment.HasItems()) { - startupInfoEx.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)Allocator::Allocate(bufferSize); - if (!InitializeProcThreadAttributeList(startupInfoEx.lpAttributeList, 1, 0, &bufferSize)) + dwCreationFlags |= CREATE_UNICODE_ENVIRONMENT; + + int32 totalLength = 1; + for (auto& e : settings.Environment) + totalLength += e.Key.Length() + e.Value.Length() + 2; + + environmentStr = (Char*)Allocator::Allocate(totalLength * sizeof(Char)); + + Char* env = environmentStr; + for (auto& e : settings.Environment) { - LOG(Warning, "InitializeProcThreadAttributeList failed"); + auto& key = e.Key; + auto& value = e.Value; + Platform::MemoryCopy(env, key.Get(), key.Length() * sizeof(Char)); + env += key.Length(); + *env++ = '='; + Platform::MemoryCopy(env, value.Get(), value.Length() * sizeof(Char)); + env += value.Length(); + *env++ = 0; + } + *env++ = 0; + ASSERT((uint64)env - (uint64)environmentStr == (uint64)(totalLength * sizeof(Char))); + } + + HANDLE stdOutRead = nullptr; + HANDLE stdErrRead = nullptr; + + if (captureStdOut) + { + dwCreationFlags |= EXTENDED_STARTUPINFO_PRESENT; + startupInfoEx.StartupInfo.dwFlags |= STARTF_USESTDHANDLES; + + SECURITY_ATTRIBUTES securityAttributes; + securityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES); + securityAttributes.bInheritHandle = TRUE; + securityAttributes.lpSecurityDescriptor = nullptr; + + if (!CreatePipe(&stdOutRead, &startupInfoEx.StartupInfo.hStdOutput, &securityAttributes, 0) || + !CreatePipe(&stdErrRead, &startupInfoEx.StartupInfo.hStdError, &securityAttributes, 0)) + { + LOG(Warning, "CreatePipe failed"); + return 1; + } + + SIZE_T bufferSize = 0; + if (!InitializeProcThreadAttributeList(nullptr, 1, 0, &bufferSize) && GetLastError() == ERROR_INSUFFICIENT_BUFFER) + { + startupInfoEx.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)Allocator::Allocate(bufferSize); + if (!InitializeProcThreadAttributeList(startupInfoEx.lpAttributeList, 1, 0, &bufferSize)) + { + LOG(Warning, "InitializeProcThreadAttributeList failed"); + goto ERROR_EXIT; + } + } + + HANDLE inheritHandles[2] = { startupInfoEx.StartupInfo.hStdOutput, startupInfoEx.StartupInfo.hStdError }; + if (!UpdateProcThreadAttribute(startupInfoEx.lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_HANDLE_LIST, inheritHandles, sizeof(inheritHandles), nullptr, nullptr)) + { + LOG(Warning, "UpdateProcThreadAttribute failed"); goto ERROR_EXIT; } } - HANDLE inheritHandles[2] = { startupInfoEx.StartupInfo.hStdOutput, startupInfoEx.StartupInfo.hStdError }; - if (!UpdateProcThreadAttribute(startupInfoEx.lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_HANDLE_LIST, inheritHandles, sizeof(inheritHandles), nullptr, nullptr)) + // Create the process + PROCESS_INFORMATION procInfo; + if (!CreateProcessW(nullptr, const_cast(cmdLine.GetText()), nullptr, nullptr, TRUE, dwCreationFlags, (LPVOID)environmentStr, settings.WorkingDirectory.HasChars() ? settings.WorkingDirectory.Get() : nullptr, &startupInfoEx.StartupInfo, &procInfo)) { - LOG(Warning, "UpdateProcThreadAttribute failed"); + LOG(Warning, "Cannot start process. Error code: 0x{0:x}", (uint64)GetLastError()); goto ERROR_EXIT; } - } - // Create the process - PROCESS_INFORMATION procInfo; - if (!CreateProcessW(nullptr, const_cast(String(cmdLine).GetText()), nullptr, nullptr, TRUE, dwCreationFlags, (LPVOID)environmentStr, workingDir.HasChars() ? workingDir.Get() : nullptr, &startupInfoEx.StartupInfo, &procInfo)) - { - LOG(Warning, "Cannot start process '{0}'. Error code: 0x{1:x}", cmdLine, static_cast(GetLastError())); - goto ERROR_EXIT; - } - - if (stdOutRead != nullptr) - { - // Keep reading std output and std error streams until process is running - Array rawData; - Array logData; - do + if (stdOutRead != nullptr) { - ReadPipe(stdOutRead, rawData, logData, LogType::Info); - ReadPipe(stdErrRead, rawData, logData, LogType::Error); - Sleep(1); - } while (IsProcRunning(procInfo.hProcess)); - ReadPipe(stdOutRead, rawData, logData, LogType::Info); - ReadPipe(stdErrRead, rawData, logData, LogType::Error); - } - else - { - WaitForSingleObject(procInfo.hProcess, INFINITE); - } + // Keep reading std output and std error streams until process is running + Array rawData; + Array logData; + do + { + ReadPipe(stdOutRead, rawData, logData, LogType::Info, settings); + ReadPipe(stdErrRead, rawData, logData, LogType::Error, settings); + Sleep(1); + } while (IsProcRunning(procInfo.hProcess)); + ReadPipe(stdOutRead, rawData, logData, LogType::Info, settings); + ReadPipe(stdErrRead, rawData, logData, LogType::Error, settings); + } + else + { + WaitForSingleObject(procInfo.hProcess, INFINITE); + } - DWORD exitCode; - if (GetExitCodeProcess(procInfo.hProcess, &exitCode) != 0) - result = exitCode; + DWORD exitCode; + if (GetExitCodeProcess(procInfo.hProcess, &exitCode) != 0) + result = exitCode; - CloseHandle(procInfo.hProcess); - CloseHandle(procInfo.hThread); + CloseHandle(procInfo.hProcess); + CloseHandle(procInfo.hThread); - // Cleanup -ERROR_EXIT: - if (startupInfoEx.StartupInfo.hStdOutput != nullptr) - { - CloseHandle(startupInfoEx.StartupInfo.hStdOutput); + // Cleanup + ERROR_EXIT: + if (startupInfoEx.StartupInfo.hStdOutput != nullptr) + CloseHandle(startupInfoEx.StartupInfo.hStdOutput); + if (startupInfoEx.StartupInfo.hStdError != nullptr) + CloseHandle(startupInfoEx.StartupInfo.hStdError); + if (stdOutRead != nullptr) + CloseHandle(stdOutRead); + if (stdErrRead != nullptr) + CloseHandle(stdErrRead); + if (startupInfoEx.lpAttributeList != nullptr) + { + DeleteProcThreadAttributeList(startupInfoEx.lpAttributeList); + Allocator::Free(startupInfoEx.lpAttributeList); + } + if (environmentStr) + Allocator::Free(environmentStr); } - if (startupInfoEx.StartupInfo.hStdError != nullptr) - { - CloseHandle(startupInfoEx.StartupInfo.hStdError); - } - if (stdOutRead != nullptr) - { - CloseHandle(stdOutRead); - } - if (stdErrRead != nullptr) - { - CloseHandle(stdErrRead); - } - if (startupInfoEx.lpAttributeList != nullptr) - { - DeleteProcThreadAttributeList(startupInfoEx.lpAttributeList); - Allocator::Free(startupInfoEx.lpAttributeList); - } - if (environmentStr) - Allocator::Free(environmentStr); return result; } @@ -1249,10 +1233,11 @@ void* WindowsPlatform::LoadLibrary(const Char* filename) return handle; } +#if CRASH_LOG_ENABLE + Array WindowsPlatform::GetStackFrames(int32 skipCount, int32 maxDepth, void* context) { Array result; -#if CRASH_LOG_ENABLE DbgHelpLock(); // Initialize @@ -1378,12 +1363,9 @@ Array WindowsPlatform::GetStackFrames(int32 skipCount, } DbgHelpUnlock(); -#endif return result; } -#if CRASH_LOG_ENABLE - void WindowsPlatform::CollectCrashData(const String& crashDataFolder, void* context) { // Create mini dump file for crash debugging diff --git a/Source/Engine/Platform/Windows/WindowsPlatform.h b/Source/Engine/Platform/Windows/WindowsPlatform.h index a144e09e5..b4fd87a35 100644 --- a/Source/Engine/Platform/Windows/WindowsPlatform.h +++ b/Source/Engine/Platform/Windows/WindowsPlatform.h @@ -79,13 +79,11 @@ public: static void GetEnvironmentVariables(Dictionary& result); static bool GetEnvironmentVariable(const String& name, String& value); static bool SetEnvironmentVariable(const String& name, const String& value); - static int32 StartProcess(const StringView& filename, const StringView& args, const StringView& workingDir, bool hiddenWindow = false, bool waitForEnd = false); - static int32 RunProcess(const StringView& cmdLine, const StringView& workingDir, bool hiddenWindow = true); - static int32 RunProcess(const StringView& cmdLine, const StringView& workingDir, const Dictionary& environment, bool hiddenWindow = true); + static int32 CreateProcess(CreateProcessSettings& settings); static Window* CreateWindow(const CreateWindowSettings& settings); static void* LoadLibrary(const Char* filename); - static Array GetStackFrames(int32 skipCount = 0, int32 maxDepth = 60, void* context = nullptr); #if CRASH_LOG_ENABLE + static Array GetStackFrames(int32 skipCount = 0, int32 maxDepth = 60, void* context = nullptr); static void CollectCrashData(const String& crashDataFolder, void* context = nullptr); #endif }; diff --git a/Source/Engine/Platform/Windows/WindowsWindow.h b/Source/Engine/Platform/Windows/WindowsWindow.h index d99cfcb15..74e923f86 100644 --- a/Source/Engine/Platform/Windows/WindowsWindow.h +++ b/Source/Engine/Platform/Windows/WindowsWindow.h @@ -30,7 +30,6 @@ private: bool _clipCursorSet = false; bool _isDuringMaximize = false; Windows::HANDLE _monitor = nullptr; - Float2 _clientSize; Windows::LONG _clipCursorRect[4]; int32 _regionWidth = 0, _regionHeight = 0; @@ -95,7 +94,7 @@ private: public: - // [Window] + // [WindowBase] void* GetNativePtr() const override; void Show() override; void Hide() override; diff --git a/Source/Engine/Platform/iOS/iOSApp.h b/Source/Engine/Platform/iOS/iOSApp.h new file mode 100644 index 000000000..0543c644e --- /dev/null +++ b/Source/Engine/Platform/iOS/iOSApp.h @@ -0,0 +1,34 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#pragma once + +#ifndef PLATFORM_IOS +// When included from generated XCode main.m file +#define PLATFORM_IOS 1 +#define FLAXENGINE_API +#endif + +#if PLATFORM_IOS + +#import + +FLAXENGINE_API +@interface FlaxView : UIView + +@end + +FLAXENGINE_API +@interface FlaxViewController : UIViewController + +@end + +FLAXENGINE_API +@interface FlaxAppDelegate : UIResponder + +@property(strong, retain, nonatomic) UIWindow* window; +@property(strong, retain, nonatomic) FlaxViewController* viewController; +@property(strong, retain, nonatomic) FlaxView* view; + +@end + +#endif diff --git a/Source/Engine/Platform/iOS/iOSDefines.h b/Source/Engine/Platform/iOS/iOSDefines.h new file mode 100644 index 000000000..fbbcd0afd --- /dev/null +++ b/Source/Engine/Platform/iOS/iOSDefines.h @@ -0,0 +1,21 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#pragma once + +#if PLATFORM_IOS + +#include "../Unix/UnixDefines.h" + +// Platform description +#define PLATFORM_TYPE PlatformType::iOS +#define PLATFORM_64BITS 1 +#define PLATFORM_ARCH_ARM64 1 +#define PLATFORM_ARCH ArchitectureType::ARM64 +#define PLATFORM_CACHE_LINE_SIZE 128 +#define PLATFORM_DEBUG_BREAK __builtin_trap() + +// Use AOT for Mono +#define USE_MONO_AOT 1 +#define USE_MONO_AOT_MODE MONO_AOT_MODE_FULL + +#endif diff --git a/Source/Engine/Platform/iOS/iOSFile.h b/Source/Engine/Platform/iOS/iOSFile.h new file mode 100644 index 000000000..7c7400835 --- /dev/null +++ b/Source/Engine/Platform/iOS/iOSFile.h @@ -0,0 +1,23 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#pragma once + +#if PLATFORM_IOS + +#include "Engine/Platform/Unix/UnixFile.h" + +/// +/// iOS platform file object implementation. +/// +class FLAXENGINE_API iOSFile : public UnixFile +{ +public: + iOSFile(int32 handle) + : UnixFile(handle) + { + } + + static iOSFile* Open(const StringView& path, FileMode mode, FileAccess access = FileAccess::ReadWrite, FileShare share = FileShare::None); +}; + +#endif diff --git a/Source/Engine/Platform/iOS/iOSFileSystem.h b/Source/Engine/Platform/iOS/iOSFileSystem.h new file mode 100644 index 000000000..a4a5baf78 --- /dev/null +++ b/Source/Engine/Platform/iOS/iOSFileSystem.h @@ -0,0 +1,21 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#pragma once + +#if PLATFORM_IOS + +#include "Engine/Platform/Apple/AppleFileSystem.h" + +/// +/// iOS platform implementation of filesystem service. +/// +class FLAXENGINE_API iOSFileSystem : public AppleFileSystem +{ +public: + // [AppleFileSystem] + static bool FileExists(const StringView& path); + static uint64 GetFileSize(const StringView& path); + static bool IsReadOnly(const StringView& path); +}; + +#endif diff --git a/Source/Engine/Platform/iOS/iOSPlatform.cpp b/Source/Engine/Platform/iOS/iOSPlatform.cpp new file mode 100644 index 000000000..7ca27c481 --- /dev/null +++ b/Source/Engine/Platform/iOS/iOSPlatform.cpp @@ -0,0 +1,633 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#if PLATFORM_IOS + +#include "iOSPlatform.h" +#include "iOSWindow.h" +#include "iOSFile.h" +#include "iOSFileSystem.h" +#include "iOSApp.h" +#include "Engine/Core/Log.h" +#include "Engine/Core/Delegate.h" +#include "Engine/Core/Utilities.h" +#include "Engine/Core/Types/String.h" +#include "Engine/Core/Collections/Array.h" +#include "Engine/Platform/Apple/AppleUtils.h" +#include "Engine/Platform/StringUtils.h" +#include "Engine/Platform/MessageBox.h" +#include "Engine/Platform/Window.h" +#include "Engine/Platform/WindowsManager.h" +#include "Engine/Platform/BatteryInfo.h" +#include "Engine/Threading/Threading.h" +#include "Engine/Graphics/RenderTask.h" +#include "Engine/Input/Input.h" +#include "Engine/Input/InputDevice.h" +#include "Engine/Engine/Engine.h" +#include "Engine/Engine/Globals.h" +#include "Engine/Content/Storage/ContentStorageManager.h" +#include +#include +#include +#include +#include +#include +#include +#include + +class iOSTouchScreen : public InputDevice +{ +private: + CriticalSection _locker; + +public: + explicit iOSTouchScreen() + : InputDevice(SpawnParams(Guid::New(), TypeInitializer), TEXT("iOS Touch Screen")) + { + } + + void ResetState() override + { + ScopeLock lock(_locker); + InputDevice::ResetState(); + } + + bool Update(EventQueue& queue) override + { + ScopeLock lock(_locker); + return InputDevice::Update(queue); + } + + void OnTouch(EventType type, float x, float y, int32 pointerId) + { + ScopeLock lock(_locker); + Event& e = _queue.AddOne(); + e.Type = type; + e.Target = nullptr; + e.TouchData.Position.X = x; + e.TouchData.Position.Y = y; + e.TouchData.PointerId = pointerId; + } +}; + +int32 Dpi = 96; +Guid DeviceId; +FlaxView* MainView = nullptr; +FlaxViewController* MainViewController = nullptr; +iOSWindow* MainWindow = nullptr; +iOSTouchScreen* TouchScreen; +bool HasFocus = true; +bool IsPaused = false; + +struct MessagePipeline +{ + CriticalSection Locker; + Array> List; + + void Add(const Function& func, bool wait) + { + Locker.Lock(); + List.Add(func); + Locker.Unlock(); + + // TODO: use atomic counters for more optimized waiting + while (wait) + { + Platform::Sleep(1); + Locker.Lock(); + wait = List.HasItems(); + Locker.Unlock(); + } + } + + void Run() + { + Locker.Lock(); + for (const auto& func : List) + { + func(); + } + List.Clear(); + Locker.Unlock(); + } +}; + +MessagePipeline UIThreadPipeline; +MessagePipeline MainThreadPipeline; + +#define PLATFORM_IOS_MAX_TOUCHES 8 + +@interface FlaxView() + +{ + UITouch* activeTouches[PLATFORM_IOS_MAX_TOUCHES]; +} + +@end + +@implementation FlaxView + ++ (Class)layerClass { return [CAMetalLayer class]; } + +- (void)setFrame:(CGRect)frame +{ + [super setFrame:frame]; + if (!MainWindow) + return; + float scale = [[UIScreen mainScreen] scale]; + float width = (float)frame.size.width * scale; + float height = (float)frame.size.height * scale; + iOSPlatform::RunOnMainThread([width, height]() { MainWindow->CheckForResize(width, height); }); +} + +- (void)Init +{ + self.multipleTouchEnabled = YES; + Platform::MemoryClear(activeTouches, sizeof(activeTouches)); +} + +- (void)OnTouchEvent:(NSSet*)touches ofType:(InputDevice::EventType)eventType +{ + float scale = [[UIScreen mainScreen] scale]; + for (UITouch* touch in touches) + { + // Get touch location + CGPoint location = [touch locationInView:self]; + location.x *= scale; + location.y *= scale; + + // Get touch index (use list of activly tracked touches) + int32 touchIndex = 0; + for (; touchIndex < PLATFORM_IOS_MAX_TOUCHES; touchIndex++) + { + if (activeTouches[touchIndex] == touch) + break; + } + if (touchIndex == PLATFORM_IOS_MAX_TOUCHES && eventType == InputDevice::EventType::TouchDown) + { + // Find free slot for a new touches + touchIndex = 0; + for (; touchIndex < PLATFORM_IOS_MAX_TOUCHES; touchIndex++) + { + if (activeTouches[touchIndex] == nil) + { + activeTouches[touchIndex] = touch; + break; + } + } + } + if (touchIndex == PLATFORM_IOS_MAX_TOUCHES) + continue; + + // Send event to the input device + TouchScreen->OnTouch(eventType, location.x, location.y, touchIndex); + + // Remove ended touches + if (eventType == InputDevice::EventType::TouchUp) + activeTouches[touchIndex] = nil; + } +} + +- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event +{ + [self OnTouchEvent:touches ofType:InputDevice::EventType::TouchDown]; +} + +- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event +{ + [self OnTouchEvent:touches ofType:InputDevice::EventType::TouchMove]; +} + +- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event +{ + [self OnTouchEvent:touches ofType:InputDevice::EventType::TouchUp]; +} + +- (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event +{ + [self OnTouchEvent:touches ofType:InputDevice::EventType::TouchUp]; +} + +@end + +@implementation FlaxViewController + +- (BOOL)prefersHomeIndicatorAutoHidden +{ + return YES; +} + +- (BOOL)prefersStatusBarHidden +{ + return YES; +} + +- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation +{ + return UIStatusBarAnimationSlide; +} + +@end + +@interface FlaxAppDelegate() + +@property(strong, nonatomic) CADisplayLink* displayLink; + +@end + +@implementation FlaxAppDelegate + +- (void)MainThreadMain:(NSDictionary*)launchOptions +{ + // Run engine on a separate game thread + Engine::Main(TEXT("")); +} + +- (void)UIThreadMain +{ + // Invoke callbacks + UIThreadPipeline.Run(); +} + +- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions +{ + // Create window + CGRect frame = [[UIScreen mainScreen] bounds]; + self.window = [[UIWindow alloc] initWithFrame:frame]; + + // Create view + self.view = [[FlaxView alloc] initWithFrame:frame]; + [self.view resignFirstResponder]; + [self.view setNeedsDisplay]; + [self.view setHidden:NO]; + [self.view setOpaque:YES]; + [self.view Init]; + self.view.backgroundColor = [UIColor clearColor]; + MainView = self.view; + + // Create view controller + self.viewController = [[FlaxViewController alloc] init]; + [self.viewController setView:self.view]; + [self.viewController setNeedsUpdateOfHomeIndicatorAutoHidden]; + [self.viewController setNeedsStatusBarAppearanceUpdate]; + MainViewController = self.viewController; + + // Create navigation controller + UINavigationController* navController = [[UINavigationController alloc] initWithRootViewController:self.viewController]; + [self.window setRootViewController:navController]; + [self.window makeKeyAndVisible]; + + // Create UI thread update callback + self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(UIThreadMain)]; + self.displayLink.preferredFramesPerSecond = 60; + [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes]; + + // Run engine on a separate main thread + NSThread* mainThread = [[NSThread alloc] initWithTarget:self selector:@selector(MainThreadMain:) object:launchOptions]; +#if BUILD_DEBUG + const int32 mainThreadStackSize = 4 * 1024 * 1024; // 4 MB +#else + const int32 mainThreadStackSize = 2 * 1024 * 1024; // 2 MB +#endif + [mainThread setStackSize:mainThreadStackSize]; + [mainThread start]; + + return YES; +} + +- (void)applicationWillResignActive:(UIApplication*)application +{ + LOG(Info, "[iOS] applicationWillResignActive"); + + // Defocus app + HasFocus = false; + if (MainWindow) + MainWindow->OnLostFocus(); +} + +- (void)applicationDidEnterBackground:(UIApplication*)application +{ + LOG(Info, "[iOS] applicationDidEnterBackground"); + + // Pause + IsPaused = true; +} + +- (void)applicationWillEnterForeground:(UIApplication*)application +{ + LOG(Info, "[iOS] applicationWillEnterForeground"); + + // Resume + IsPaused = false; +} + +- (void)applicationDidBecomeActive:(UIApplication*)application +{ + LOG(Info, "[iOS] applicationDidBecomeActive"); + + // Focus app + HasFocus = true; + if (MainWindow) + MainWindow->OnGotFocus(); +} + +- (void)applicationDidReceiveMemoryWarning:(UIApplication*)application +{ + LOG(Warning, "[iOS] applicationDidReceiveMemoryWarning"); + LOG(Warning, "os_proc_available_memory: {}", Utilities::BytesToText(os_proc_available_memory())); +} + +@end + +DialogResult MessageBox::Show(Window* parent, const StringView& text, const StringView& caption, MessageBoxButtons buttons, MessageBoxIcon icon) +{ + NSString* title = (NSString*)AppleUtils::ToString(caption); + NSString* message = (NSString*)AppleUtils::ToString(text); + Function func = [&title, &message]() + { + UIAlertController* alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert]; + UIAlertAction* button = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleCancel handler:^(id){ }]; + [alert addAction:button]; + [MainViewController presentViewController:alert animated:YES completion:nil]; + }; + iOSPlatform::RunOnUIThread(func, true); + return DialogResult::OK; +} + +iOSWindow::iOSWindow(const CreateWindowSettings& settings) + : WindowBase(settings) +{ + CGRect frame = [[UIScreen mainScreen] bounds]; + float scale = [[UIScreen mainScreen] scale]; + _clientSize = Float2((float)frame.size.width * scale, (float)frame.size.height * scale); + + MainWindow = this; +} + +iOSWindow::~iOSWindow() +{ + MainWindow = nullptr; +} + +void iOSWindow::CheckForResize(float width, float height) +{ + const Float2 clientSize(width, height); + if (clientSize != _clientSize) + { + _clientSize = clientSize; + OnResize(width, height); + } +} + +void* iOSWindow::GetNativePtr() const +{ + return MainView; +} + +void iOSWindow::Show() +{ + if (!_visible) + { + InitSwapChain(); + if (_showAfterFirstPaint) + { + if (RenderTask) + RenderTask->Enabled = true; + return; + } + + // Show + _focused = true; + + // Base + WindowBase::Show(); + } +} + +bool iOSWindow::IsClosed() const +{ + return false; +} + +bool iOSWindow::IsForegroundWindow() const +{ + return Platform::GetHasFocus() && IsFocused(); +} + +void iOSWindow::BringToFront(bool force) +{ + Focus(); +} + +void iOSWindow::SetIsFullscreen(bool isFullscreen) +{ +} + +// Fallback to file placed side-by-side with application +#define IOS_FALLBACK_PATH(path) (Globals::ProjectFolder / StringUtils::GetFileName(path)) + +iOSFile* iOSFile::Open(const StringView& path, FileMode mode, FileAccess access, FileShare share) +{ + iOSFile* file; + if (mode == FileMode::OpenExisting && !AppleFileSystem::FileExists(path)) + file = (iOSFile*)UnixFile::Open(IOS_FALLBACK_PATH(path), mode, access, share); + else + file = (iOSFile*)UnixFile::Open(path, mode, access, share); + return file; +} + +bool iOSFileSystem::FileExists(const StringView& path) +{ + return AppleFileSystem::FileExists(path) || AppleFileSystem::FileExists(IOS_FALLBACK_PATH(path)); +} + +uint64 iOSFileSystem::GetFileSize(const StringView& path) +{ + if (AppleFileSystem::FileExists(path)) + return AppleFileSystem::GetFileSize(path); + return AppleFileSystem::GetFileSize(IOS_FALLBACK_PATH(path)); +} + +bool iOSFileSystem::IsReadOnly(const StringView& path) +{ + if (AppleFileSystem::FileExists(path)) + return AppleFileSystem::IsReadOnly(path); + return AppleFileSystem::IsReadOnly(IOS_FALLBACK_PATH(path)); +} + +#undef IOS_FALLBACK_PATH + +void iOSPlatform::RunOnUIThread(const Function& func, bool wait) +{ + UIThreadPipeline.Add(func, wait); +} + +void iOSPlatform::RunOnMainThread(const Function& func, bool wait) +{ + MainThreadPipeline.Add(func, wait); +} + +bool iOSPlatform::Init() +{ + if (ApplePlatform::Init()) + return true; + + // Setup screen scaling + ScreenScale = [[UIScreen mainScreen] scale]; + CustomDpiScale *= ScreenScale; + Dpi = Math::TruncToInt(163 * ScreenScale); + + // Get device identifier + NSString* uuid = [UIDevice currentDevice].identifierForVendor.UUIDString; + String uuidStr = AppleUtils::ToString((CFStringRef)uuid); + Guid::Parse(uuidStr, DeviceId); + + // Setup native platform input devices + // TODO: add Gamepad for vibrations usability + Input::CustomDevices.Add(TouchScreen = New()); + + // Use more aggressive content buffers freeing to reduce peek memory + ContentStorageManager::UnusedDataChunksLifetime = TimeSpan::FromMilliseconds(30); + + return false; +} + +void iOSPlatform::LogInfo() +{ + ApplePlatform::LogInfo(); + + struct utsname systemInfo; + uname(&systemInfo); + NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion]; + LOG(Info, "{3}, iOS {0}.{1}.{2}", version.majorVersion, version.minorVersion, version.patchVersion, String(systemInfo.machine)); + LOG(Info, "os_proc_available_memory: {}", Utilities::BytesToText(os_proc_available_memory())); +} + +void iOSPlatform::Tick() +{ + // Invoke callbacks + MainThreadPipeline.Run(); + + ApplePlatform::Tick(); +} + +BatteryInfo iOSPlatform::GetBatteryInfo() +{ + BatteryInfo result; + UIDevice* uiDevice = [UIDevice currentDevice]; + if (uiDevice) + { + uiDevice.batteryMonitoringEnabled = YES; + result.BatteryLifePercent = Math::Saturate([uiDevice batteryLevel]); + switch ([uiDevice batteryState]) + { + case UIDeviceBatteryStateUnknown: + result.BatteryLifePercent = 1.0f; + break; + case UIDeviceBatteryStateUnplugged: + result.State = BatteryInfo::States::BatteryDischarging; + break; + case UIDeviceBatteryStateCharging: + result.State = BatteryInfo::States::BatteryCharging; + break; + case UIDeviceBatteryStateFull: + result.State = BatteryInfo::States::Connected; + break; + } + } + return result; +} + +int32 iOSPlatform::GetDpi() +{ + return Dpi; +} + +NetworkConnectionType iOSPlatform::GetNetworkConnectionType() +{ + struct sockaddr_in emptyAddr; + Platform::MemoryClear(&emptyAddr, sizeof(emptyAddr)); + emptyAddr.sin_len = sizeof(emptyAddr); + emptyAddr.sin_family = AF_INET; + SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*)&emptyAddr); + SCNetworkReachabilityFlags reachabilityFlags; + bool connected = SCNetworkReachabilityGetFlags(reachability, &reachabilityFlags); + CFRelease(reachability); + if (connected) + { + if (reachabilityFlags == 0) + return NetworkConnectionType::AirplaneMode; + if ((reachabilityFlags & kSCNetworkReachabilityFlagsReachable) != 0 && + (reachabilityFlags & kSCNetworkReachabilityFlagsConnectionRequired) == 0 && + (reachabilityFlags & kSCNetworkReachabilityFlagsInterventionRequired) == 0) + { + if ((reachabilityFlags & kSCNetworkReachabilityFlagsIsWWAN) == 0) + return NetworkConnectionType::WiFi; + return NetworkConnectionType::Cell; + } + } + return NetworkConnectionType::None; +} + +ScreenOrientationType iOSPlatform::GetScreenOrientationType() +{ + UIInterfaceOrientation orientation = UIInterfaceOrientationUnknown; + Function func = [&orientation]() + { + orientation = [[[[[UIApplication sharedApplication] delegate] window] windowScene] interfaceOrientation]; + }; + iOSPlatform::RunOnUIThread(func, true); + switch (orientation) + { + case UIInterfaceOrientationPortrait: return ScreenOrientationType::Portrait; + case UIInterfaceOrientationPortraitUpsideDown: return ScreenOrientationType::PortraitUpsideDown; + case UIInterfaceOrientationLandscapeLeft: return ScreenOrientationType::LandscapeLeft; + case UIInterfaceOrientationLandscapeRight: return ScreenOrientationType::LandscapeRight; + case UIInterfaceOrientationUnknown: + default: return ScreenOrientationType::Unknown; + } +} + +Guid iOSPlatform::GetUniqueDeviceId() +{ + return DeviceId; +} + +String iOSPlatform::GetComputerName() +{ + return TEXT("iPhone"); +} + +bool iOSPlatform::GetHasFocus() +{ + return HasFocus; +} + +bool iOSPlatform::GetIsPaused() +{ + return IsPaused; +} + +Float2 iOSPlatform::GetDesktopSize() +{ + CGRect frame = [[UIScreen mainScreen] bounds]; + float scale = [[UIScreen mainScreen] scale]; + return Float2((float)frame.size.width * scale, (float)frame.size.height * scale); +} + +String iOSPlatform::GetMainDirectory() +{ + String path = StringUtils::GetDirectoryName(GetExecutableFilePath()); + if (path.EndsWith(TEXT("/Contents/iOS"))) + { + // If running from executable in a package, go up to the Contents + path = StringUtils::GetDirectoryName(path); + } + return path; +} + +Window* iOSPlatform::CreateWindow(const CreateWindowSettings& settings) +{ + return New(settings); +} + +#endif diff --git a/Source/Engine/Platform/iOS/iOSPlatform.h b/Source/Engine/Platform/iOS/iOSPlatform.h new file mode 100644 index 000000000..b26ea8a1f --- /dev/null +++ b/Source/Engine/Platform/iOS/iOSPlatform.h @@ -0,0 +1,39 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#pragma once + +#if PLATFORM_IOS + +#include "../Apple/ApplePlatform.h" + +/// +/// The iOS platform implementation and application management utilities. +/// +class FLAXENGINE_API iOSPlatform : public ApplePlatform +{ +public: + // Runs the callback on a main UI thread (from iOS). Can optionally wait for execution end to sync. + static void RunOnUIThread(const Function& func, bool wait = false); + // Runs the callback on a main thread (from Flax). Can optionally wait for execution end to sync. + static void RunOnMainThread(const Function& func, bool wait = false); + +public: + + // [ApplePlatform] + static bool Init(); + static void LogInfo(); + static void Tick(); + static BatteryInfo GetBatteryInfo(); + static int32 GetDpi(); + static NetworkConnectionType GetNetworkConnectionType(); + static ScreenOrientationType GetScreenOrientationType(); + static Guid GetUniqueDeviceId(); + static String GetComputerName(); + static bool GetHasFocus(); + static bool GetIsPaused(); + static Float2 GetDesktopSize(); + static String GetMainDirectory(); + static Window* CreateWindow(const CreateWindowSettings& settings); +}; + +#endif diff --git a/Source/Engine/Platform/iOS/iOSPlatformSettings.h b/Source/Engine/Platform/iOS/iOSPlatformSettings.h new file mode 100644 index 000000000..53218e0f6 --- /dev/null +++ b/Source/Engine/Platform/iOS/iOSPlatformSettings.h @@ -0,0 +1,99 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#pragma once + +#if PLATFORM_IOS || USE_EDITOR + +#include "../Apple/ApplePlatformSettings.h" + +/// +/// iOS platform settings. +/// +API_CLASS(Sealed, Namespace="FlaxEditor.Content.Settings") class FLAXENGINE_API iOSPlatformSettings : public ApplePlatformSettings +{ + DECLARE_SCRIPTING_TYPE_MINIMAL(ApplePlatformSettings); + + /// + /// The app export destination methods. + /// + API_ENUM() enum class ExportMethods + { + // Distribute using TestFlight or through the App Store. + AppStore, + // Distribute to a limited number of devices you register in App Store Connect. + Development, + // Distribute to a limited number of devices you register in App Store Connect. + AdHoc, + // Distribute to members of your organization if you’re a part of the Apple Developer Enterprise Program and are ready to release your app to users in your organization. + Enterprise, + }; + + /// + /// The display orientation modes. Can be combined as flags. + /// + API_ENUM(Attributes="Flags") enum class UIInterfaceOrientations + { + // The device is in portrait mode, with the device upright and the Home button on the bottom. + Portrait = 1, + // The device is in portrait mode but is upside down, with the device upright and the Home button at the top. + PortraitUpsideDown = 2, + // The device is in landscape mode, with the device upright and the Home button on the left. + LandscapeLeft = 4, + // The device is in landscape mode, with the device upright and the Home button on the right. + LandscapeRight = 8, + // The all modes. + All = Portrait | PortraitUpsideDown | LandscapeLeft | LandscapeRight + }; + + /// + /// The app developer name - App Store Team ID. For example: 'VG6K6HT8B'. + /// + API_FIELD(Attributes="EditorOrder(10), EditorDisplay(\"General\")") + String AppTeamId; + + /// + /// The app version number (matches CURRENT_PROJECT_VERSION in XCode). + /// + API_FIELD(Attributes="EditorOrder(20), EditorDisplay(\"General\")") + String AppVersion = TEXT("1"); + + /// + /// The app export mode (if automatic packaging is not disabled via Build Settings, otherwise export app manually via XCode project). + /// + API_FIELD(Attributes="EditorOrder(50), EditorDisplay(\"General\")") + ExportMethods ExportMethod = ExportMethods::Development; + + /// + /// The UI interface orientation modes supported on iPhone devices. + /// + API_FIELD(Attributes="EditorOrder(200), EditorDisplay(\"UI\", \"Supported Interface Orientations (iPhone)\")") + UIInterfaceOrientations SupportedInterfaceOrientationsiPhone = UIInterfaceOrientations::All; + + /// + /// The UI interface orientation modes supported on iPad devices. + /// + API_FIELD(Attributes="EditorOrder(210), EditorDisplay(\"UI\", \"Supported Interface Orientations (iPad)\")") + UIInterfaceOrientations SupportedInterfaceOrientationsiPad = UIInterfaceOrientations::All; + + /// + /// Gets the instance of the settings asset (default value if missing). Object returned by this method is always loaded with valid data to use. + /// + static iOSPlatformSettings* Get(); + + // [SettingsBase] + void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) final override + { + ApplePlatformSettings::Deserialize(stream, modifier); + DESERIALIZE(AppTeamId); + DESERIALIZE(AppVersion); + DESERIALIZE(ExportMethod); + DESERIALIZE(SupportedInterfaceOrientationsiPhone); + DESERIALIZE(SupportedInterfaceOrientationsiPad); + } +}; + +#if PLATFORM_IOS +typedef iOSPlatformSettings PlatformSettings; +#endif + +#endif diff --git a/Source/Engine/Platform/iOS/iOSWindow.h b/Source/Engine/Platform/iOS/iOSWindow.h new file mode 100644 index 000000000..401fdc726 --- /dev/null +++ b/Source/Engine/Platform/iOS/iOSWindow.h @@ -0,0 +1,30 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#pragma once + +#if PLATFORM_IOS + +#include "Engine/Platform/Base/WindowBase.h" + +/// +/// Implementation of the window class for iOS platform. +/// +class FLAXENGINE_API iOSWindow : public WindowBase +{ +public: + iOSWindow(const CreateWindowSettings& settings); + ~iOSWindow(); + + void CheckForResize(float width, float height); + +public: + // [WindowBase] + void* GetNativePtr() const override; + void Show() override; + bool IsClosed() const override; + bool IsForegroundWindow() const override; + void BringToFront(bool force = false) override; + void SetIsFullscreen(bool isFullscreen) override; +}; + +#endif diff --git a/Source/Engine/Render2D/Render2D.cs b/Source/Engine/Render2D/Render2D.cs index e2cb14cfd..c4d9e81b4 100644 --- a/Source/Engine/Render2D/Render2D.cs +++ b/Source/Engine/Render2D/Render2D.cs @@ -64,8 +64,7 @@ namespace FlaxEngine /// The rectangle to draw. public static void DrawSprite(SpriteHandle spriteHandle, Rectangle rect) { - var color = Color.White; - Internal_DrawSprite(ref spriteHandle, ref rect, ref color); + DrawSprite(spriteHandle, rect, Color.White); } /// @@ -86,8 +85,7 @@ namespace FlaxEngine /// The rectangle to draw. public static void DrawSpritePoint(SpriteHandle spriteHandle, Rectangle rect) { - var color = Color.White; - Internal_DrawSpritePoint(ref spriteHandle, ref rect, ref color); + DrawSpritePoint(spriteHandle, rect, Color.White); } /// diff --git a/Source/Engine/Renderer/Renderer.cs b/Source/Engine/Renderer/Renderer.cs index 564724460..bfb81a84c 100644 --- a/Source/Engine/Renderer/Renderer.cs +++ b/Source/Engine/Renderer/Renderer.cs @@ -1,6 +1,7 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using System.Collections.Generic; +using System.Runtime.InteropServices; namespace FlaxEngine { @@ -16,7 +17,11 @@ namespace FlaxEngine [Unmanaged] public static void DrawSceneDepth(GPUContext context, SceneRenderTask task, GPUTexture output, List customActors) { - Internal_DrawSceneDepth(FlaxEngine.Object.GetUnmanagedPtr(context), FlaxEngine.Object.GetUnmanagedPtr(task), FlaxEngine.Object.GetUnmanagedPtr(output), Utils.ExtractArrayFromList(customActors)); + if (customActors.Count == 0) + return; + var temp = CollectionsMarshal.AsSpan(customActors).ToArray(); // FIXME + var tempCount = temp.Length; + Internal_DrawSceneDepth(FlaxEngine.Object.GetUnmanagedPtr(context), FlaxEngine.Object.GetUnmanagedPtr(task), FlaxEngine.Object.GetUnmanagedPtr(output), temp, ref tempCount); } /// @@ -27,7 +32,7 @@ namespace FlaxEngine [Unmanaged] public static void DrawActors(ref RenderContext renderContext, List customActors) { - Internal_DrawActors(ref renderContext, Utils.ExtractArrayFromList(customActors)); + DrawActors(ref renderContext, Utils.ExtractArrayFromList(customActors)); } } } diff --git a/Source/Engine/Scripting/BinaryModule.cpp b/Source/Engine/Scripting/BinaryModule.cpp index 8d7991a2e..6ffdb14a9 100644 --- a/Source/Engine/Scripting/BinaryModule.cpp +++ b/Source/Engine/Scripting/BinaryModule.cpp @@ -7,15 +7,14 @@ #include "Engine/Profiler/ProfilerCPU.h" #include "ManagedCLR/MAssembly.h" #include "ManagedCLR/MClass.h" -#include "ManagedCLR/MType.h" #include "ManagedCLR/MMethod.h" #include "ManagedCLR/MField.h" #include "ManagedCLR/MUtils.h" +#include "ManagedCLR/MException.h" #include "FlaxEngine.Gen.h" -#include "MException.h" #include "Scripting.h" #include "Events.h" -#include "StdTypesContainer.h" +#include "Internal/StdTypesContainer.h" Dictionary, void(*)(ScriptingObject*, void*, bool)> ScriptingEvents::EventsTable; Delegate, ScriptingTypeHandle, StringView> ScriptingEvents::Event; @@ -25,7 +24,7 @@ ManagedBinaryModule* GetBinaryModuleCorlib() #if COMPILE_WITHOUT_CSHARP return nullptr; #else - static ManagedBinaryModule assembly("corlib", MAssemblyOptions(false)); // Don't precache all corlib classes + static ManagedBinaryModule assembly("corlib"); return &assembly; #endif } @@ -54,12 +53,12 @@ const ScriptingType& ScriptingTypeHandle::GetType() const return Module->Types[TypeIndex]; } -#if USE_MONO +#if USE_CSHARP -MonoClass* ScriptingTypeHandle::GetMonoClass() const +MClass* ScriptingTypeHandle::GetClass() const { ASSERT_LOW_LAYER(Module && Module->Types[TypeIndex].ManagedClass); - return Module->Types[TypeIndex].ManagedClass->GetNative(); + return Module->Types[TypeIndex].ManagedClass; } #endif @@ -695,8 +694,8 @@ void BinaryModule::Destroy(bool isReloading) GetModules().RemoveKeepOrder(this); } -ManagedBinaryModule::ManagedBinaryModule(const StringAnsiView& name, const MAssemblyOptions& options) - : ManagedBinaryModule(New(nullptr, name, options)) +ManagedBinaryModule::ManagedBinaryModule(const StringAnsiView& name) + : ManagedBinaryModule(New(nullptr, name)) { } @@ -799,18 +798,19 @@ namespace return nullptr; } - bool VariantTypeEquals(const VariantType& type, MonoType* monoType) + bool VariantTypeEquals(const VariantType& type, MType* mType, bool isOut = false) { - MonoClass* monoClass = mono_class_from_mono_type(monoType); - if (MUtils::GetClass(type) != monoClass) + MClass* mClass = MCore::Type::GetClass(mType); + MClass* variantClass = MUtils::GetClass(type); + if (variantClass != mClass) { // Hack for Vector2/3/4 which alias with Float2/3/4 or Double2/3/4 (depending on USE_LARGE_WORLDS) const auto& stdTypes = *StdTypesContainer::Instance(); - if (monoClass == stdTypes.Vector2Class->GetNative() && (type.Type == VariantType::Float2 || type.Type == VariantType::Double2)) + if (mClass == stdTypes.Vector2Class && (type.Type == VariantType::Float2 || type.Type == VariantType::Double2)) return true; - if (monoClass == stdTypes.Vector3Class->GetNative() && (type.Type == VariantType::Float3 || type.Type == VariantType::Double3)) + if (mClass == stdTypes.Vector3Class && (type.Type == VariantType::Float3 || type.Type == VariantType::Double3)) return true; - if (monoClass == stdTypes.Vector4Class->GetNative() && (type.Type == VariantType::Float4 || type.Type == VariantType::Double4)) + if (mClass == stdTypes.Vector4Class && (type.Type == VariantType::Float4 || type.Type == VariantType::Double4)) return true; return false; @@ -828,53 +828,54 @@ MMethod* ManagedBinaryModule::FindMethod(MClass* mclass, const ScriptingTypeMeth const auto& methods = mclass->GetMethods(); for (MMethod* method : methods) { -#if USE_MONO - MonoMethodSignature* sig = mono_method_signature(method->GetNative()); - if (method->IsStatic() != signature.IsStatic || - method->GetName() != signature.Name || - (int32)mono_signature_get_param_count(sig) != signature.Params.Count()) +#if USE_CSHARP + if (method->IsStatic() != signature.IsStatic) + continue; + if (method->GetName() != signature.Name) + continue; + if (method->GetParametersCount() != signature.Params.Count()) continue; - void* sigParams = nullptr; - mono_signature_get_params(sig, &sigParams); bool isValid = true; for (int32 paramIdx = 0; paramIdx < signature.Params.Count(); paramIdx++) { auto& param = signature.Params[paramIdx]; - if (param.IsOut != (mono_signature_param_is_out(sig, paramIdx) != 0) || - !VariantTypeEquals(param.Type, ((MonoType**)sigParams)[paramIdx])) + MType* type = method->GetParameterType(paramIdx); + if (param.IsOut != method->GetParameterIsOut(paramIdx) || + !VariantTypeEquals(param.Type, type, param.IsOut)) { isValid = false; break; } } - if (isValid && VariantTypeEquals(signature.ReturnType, mono_signature_get_return_type(sig))) + if (isValid && VariantTypeEquals(signature.ReturnType, method->GetReturnType())) return method; #endif } return nullptr; } -#if USE_MONO +#if USE_CSHARP -ManagedBinaryModule* ManagedBinaryModule::FindModule(MonoClass* klass) +ManagedBinaryModule* ManagedBinaryModule::FindModule(const MClass* klass) { - // TODO: consider caching lookup table MonoImage* -> ManagedBinaryModule* ManagedBinaryModule* module = nullptr; - MonoImage* mImage = mono_class_get_image(klass); - auto& modules = BinaryModule::GetModules(); - for (auto e : modules) + if (klass && klass->GetAssembly()) { - auto managedModule = dynamic_cast(e); - if (managedModule && managedModule->Assembly->GetMonoImage() == mImage) + auto& modules = BinaryModule::GetModules(); + for (auto e : modules) { - module = managedModule; - break; + auto managedModule = dynamic_cast(e); + if (managedModule && managedModule->Assembly == klass->GetAssembly()) + { + module = managedModule; + break; + } } } return module; } -ScriptingTypeHandle ManagedBinaryModule::FindType(MonoClass* klass) +ScriptingTypeHandle ManagedBinaryModule::FindType(const MClass* klass) { auto typeModule = FindModule(klass); if (typeModule) @@ -913,7 +914,7 @@ void ManagedBinaryModule::OnLoaded(MAssembly* assembly) ASSERT(type.ManagedClass == nullptr); // Cache class - const MString typeName(type.Fullname.Get(), type.Fullname.Length()); + const StringAnsi typeName(type.Fullname.Get(), type.Fullname.Length()); classes.TryGet(typeName, type.ManagedClass); if (type.ManagedClass == nullptr) { @@ -922,7 +923,7 @@ void ManagedBinaryModule::OnLoaded(MAssembly* assembly) } // Cache klass -> type index lookup - MonoClass* klass = type.ManagedClass->GetNative(); + MClass* klass = type.ManagedClass; #if !BUILD_RELEASE if (ClassToTypeIndex.ContainsKey(klass)) { @@ -972,7 +973,15 @@ void ManagedBinaryModule::OnLoaded(MAssembly* assembly) { if (method->GetParametersCount() == 0) { - method->Invoke(nullptr, nullptr, nullptr); + MObject* exception = nullptr; + method->Invoke(nullptr, nullptr, &exception); + if (exception) + { + MException ex(exception); + String methodName = String(method->GetName()); + ex.Log(LogType::Error, methodName.Get()); + LOG(Error, "Failed to call module initializer for class {0} from assembly {1}.", String(mclass->GetFullName()), assembly->ToString()); + } } } } @@ -985,26 +994,14 @@ void ManagedBinaryModule::InitType(MClass* mclass) { #if !COMPILE_WITHOUT_CSHARP // Skip if already initialized - const MString& typeName = mclass->GetFullName(); + const StringAnsi& typeName = mclass->GetFullName(); if (TypeNameToTypeIndex.ContainsKey(typeName)) return; // Find first native base C++ class of this C# class - MClass* baseClass = nullptr; - MonoClass* baseKlass = mono_class_get_parent(mclass->GetNative()); - MonoImage* baseKlassImage = mono_class_get_image(baseKlass); + MClass* baseClass = mclass->GetBaseClass(); ScriptingTypeHandle baseType; - auto& modules = GetModules(); - for (int32 i = 0; i < modules.Count(); i++) - { - auto e = dynamic_cast(modules[i]); - if (e && e->Assembly->GetMonoImage() == baseKlassImage) - { - baseType.Module = e; - baseClass = e->Assembly->GetClass(baseKlass); - break; - } - } + baseType.Module = FindModule(baseClass); if (!baseClass) { LOG(Error, "Missing base class for managed class {0} from assembly {1}.", String(typeName), Assembly->ToString()); @@ -1039,13 +1036,12 @@ void ManagedBinaryModule::InitType(MClass* mclass) _managedMemoryBlocks.Add(typeNameData); // Initialize scripting interfaces implemented in C# - MonoClass* interfaceKlass; - void* interfaceIt = nullptr; int32 interfacesCount = 0; - MonoClass* klass = mclass->GetNative(); - while ((interfaceKlass = mono_class_get_interfaces(klass, &interfaceIt))) + MClass* klass = mclass; + const Array& interfaceClasses = klass->GetInterfaces(); + for (const MClass* interfaceClass : interfaceClasses) { - const ScriptingTypeHandle interfaceType = FindType(interfaceKlass); + const ScriptingTypeHandle interfaceType = FindType(interfaceClass); if (interfaceType) interfacesCount++; } @@ -1054,10 +1050,9 @@ void ManagedBinaryModule::InitType(MClass* mclass) { interfaces = (ScriptingType::InterfaceImplementation*)Allocator::Allocate((interfacesCount + 1) * sizeof(ScriptingType::InterfaceImplementation)); interfacesCount = 0; - interfaceIt = nullptr; - while ((interfaceKlass = mono_class_get_interfaces(klass, &interfaceIt))) + for (const MClass* interfaceClass : interfaceClasses) { - const ScriptingTypeHandle interfaceTypeHandle = FindType(interfaceKlass); + const ScriptingTypeHandle interfaceTypeHandle = FindType(interfaceClass); if (!interfaceTypeHandle) continue; auto& interface = interfaces[interfacesCount++]; @@ -1081,7 +1076,7 @@ void ManagedBinaryModule::InitType(MClass* mclass) auto& type = Types[typeIndex]; type.ManagedClass = mclass; - // Register Mono class + // Register C# class ASSERT(!ClassToTypeIndex.ContainsKey(klass)); ClassToTypeIndex[klass] = typeIndex; @@ -1106,11 +1101,9 @@ void ManagedBinaryModule::InitType(MClass* mclass) // Special case if method was found but the base class uses generic arguments if (method && baseClass->IsGeneric()) { - // TODO: encapsulate it into MClass to support inflated methods - auto parentClass = mono_class_get_parent(mclass->GetNative()); - auto parentMethod = mono_class_get_method_from_name(parentClass, referenceMethod->GetName().Get(), 0); - auto inflatedMethod = mono_class_inflate_generic_method(parentMethod, nullptr); - method = New(inflatedMethod, baseClass); + MClass* parentClass = mclass->GetBaseClass(); + MMethod* parentMethod = parentClass->GetMethod(referenceMethod->GetName().Get(), 0); + method = parentMethod->InflateGeneric(); } baseClass = baseClass->GetBaseClass(); @@ -1134,7 +1127,7 @@ void ManagedBinaryModule::OnUnloading(MAssembly* assembly) for (int32 i = _firstManagedTypeIndex; i < Types.Count(); i++) { const ScriptingType& type = Types[i]; - const MString typeName(type.Fullname.Get(), type.Fullname.Length()); + const StringAnsi typeName(type.Fullname.Get(), type.Fullname.Length()); TypeNameToTypeIndex.Remove(typeName); } } @@ -1192,12 +1185,9 @@ void* ManagedBinaryModule::FindMethod(const ScriptingTypeHandle& typeHandle, con bool ManagedBinaryModule::InvokeMethod(void* method, const Variant& instance, Span paramValues, Variant& result) { -#if USE_MONO +#if USE_CSHARP const auto mMethod = (MMethod*)method; - MonoMethodSignature* signature = mono_method_signature(mMethod->GetNative()); - void* signatureParams = nullptr; - mono_signature_get_params(signature, &signatureParams); - const int32 parametersCount = mono_signature_get_param_count(signature); + const int32 parametersCount = mMethod->GetParametersCount();; if (paramValues.Length() != parametersCount) { LOG(Error, "Failed to call method '{0}.{1}' (args count: {2}) with invalid parameters amount ({3})", String(mMethod->GetParentClass()->GetFullName()), String(mMethod->GetName()), parametersCount, paramValues.Length()); @@ -1210,10 +1200,11 @@ bool ManagedBinaryModule::InvokeMethod(void* method, const Variant& instance, Sp if (!mMethod->IsStatic()) { // Box instance into C# object - MonoObject* instanceObject = MUtils::BoxVariant(instance); + MObject* instanceObject = MUtils::BoxVariant(instance); + const MClass* instanceObjectClass = MCore::Object::GetClass(instanceObject); // Validate instance - if (!instanceObject || !mono_class_is_subclass_of(mono_object_get_class(instanceObject), mMethod->GetParentClass()->GetNative(), withInterfaces)) + if (!instanceObject || !instanceObjectClass->IsSubClassOf(mMethod->GetParentClass(), withInterfaces)) { if (!instanceObject) LOG(Error, "Failed to call method '{0}.{1}' (args count: {2}) without object instance", String(mMethod->GetParentClass()->GetFullName()), String(mMethod->GetName()), parametersCount); @@ -1223,7 +1214,7 @@ bool ManagedBinaryModule::InvokeMethod(void* method, const Variant& instance, Sp } // For value-types instance is the actual boxed object data, not te object itself - mInstance = mono_class_is_valuetype(mono_object_get_class(instanceObject)) ? mono_object_unbox(instanceObject) : instanceObject; + mInstance = instanceObjectClass->IsValueType() ? MCore::Object::Unbox(instanceObject) : instanceObject; } // Marshal parameters @@ -1232,23 +1223,23 @@ bool ManagedBinaryModule::InvokeMethod(void* method, const Variant& instance, Sp bool hasOutParams = false; for (int32 paramIdx = 0; paramIdx < parametersCount; paramIdx++) { - auto& paramValue = paramValues[paramIdx]; - const bool isOut = mono_signature_param_is_out(signature, paramIdx) != 0; + Variant& paramValue = paramValues[paramIdx]; + const bool isOut = mMethod->GetParameterIsOut(paramIdx); hasOutParams |= isOut; // Marshal parameter for managed method - MType paramType(((MonoType**)signatureParams)[paramIdx]); + MType* paramType = mMethod->GetParameterType(paramIdx); params[paramIdx] = MUtils::VariantToManagedArgPtr(paramValue, paramType, failed); if (failed) { - LOG(Error, "Failed to marshal parameter {5}:{4} of method '{0}.{1}' (args count: {2}), value type: {6}, value: {3}", String(mMethod->GetParentClass()->GetFullName()), String(mMethod->GetName()), parametersCount, paramValue, paramType.ToString(), paramIdx, paramValue.Type); + LOG(Error, "Failed to marshal parameter {5}:{4} of method '{0}.{1}' (args count: {2}), value type: {6}, value: {3}", String(mMethod->GetParentClass()->GetFullName()), String(mMethod->GetName()), parametersCount, paramValue, MCore::Type::ToString(paramType), paramIdx, paramValue.Type); return true; } } // Invoke the method MObject* exception = nullptr; - MonoObject* resultObject = withInterfaces ? mMethod->InvokeVirtual((MonoObject*)mInstance, params, &exception) : mMethod->Invoke(mInstance, params, &exception); + MObject* resultObject = withInterfaces ? mMethod->InvokeVirtual((MObject*)mInstance, params, &exception) : mMethod->Invoke(mInstance, params, &exception); if (exception) { MException ex(exception); @@ -1281,18 +1272,17 @@ bool ManagedBinaryModule::InvokeMethod(void* method, const Variant& instance, Sp { for (int32 paramIdx = 0; paramIdx < parametersCount; paramIdx++) { - const bool isOut = mono_signature_param_is_out(signature, paramIdx) != 0; - if (isOut) + if (mMethod->GetParameterIsOut(paramIdx)) { auto& paramValue = paramValues[paramIdx]; auto param = params[paramIdx]; switch (paramValue.Type.Type) { case VariantType::String: - paramValue.SetString(MUtils::ToString((MonoString*)param)); + paramValue.SetString(MUtils::ToString((MString*)param)); break; case VariantType::Object: - paramValue = MUtils::UnboxVariant((MonoObject*)param); + paramValue = MUtils::UnboxVariant((MObject*)param); break; case VariantType::Structure: { @@ -1300,7 +1290,8 @@ bool ManagedBinaryModule::InvokeMethod(void* method, const Variant& instance, Sp if (paramTypeHandle) { auto& valueType = paramTypeHandle.GetType(); - valueType.Struct.Unbox(paramValue.AsBlob.Data, (MonoObject*)((byte*)param - sizeof(MonoObject))); + MObject* boxed = MCore::Object::Box(param, valueType.ManagedClass); + valueType.Struct.Unbox(paramValue.AsBlob.Data, boxed); } break; } @@ -1317,21 +1308,18 @@ bool ManagedBinaryModule::InvokeMethod(void* method, const Variant& instance, Sp void ManagedBinaryModule::GetMethodSignature(void* method, ScriptingTypeMethodSignature& signature) { -#if USE_MONO +#if USE_CSHARP const auto mMethod = (MMethod*)method; signature.Name = mMethod->GetName(); signature.IsStatic = mMethod->IsStatic(); - MonoMethodSignature* sig = mono_method_signature(mMethod->GetNative()); - signature.ReturnType = MoveTemp(MUtils::UnboxVariantType(mono_signature_get_return_type(sig))); - void* signatureParams = nullptr; - mono_signature_get_params(sig, &signatureParams); - const int32 paramsCount = (int32)mono_signature_get_param_count(sig); + signature.ReturnType = MoveTemp(MUtils::UnboxVariantType(mMethod->GetReturnType())); + const int32 paramsCount = mMethod->GetParametersCount(); signature.Params.Resize(paramsCount); for (int32 paramIdx = 0; paramIdx < paramsCount; paramIdx++) { auto& param = signature.Params[paramIdx]; - param.Type = MoveTemp(MUtils::UnboxVariantType(((MonoType**)signatureParams)[paramIdx])); - param.IsOut = mono_signature_param_is_out(sig, paramIdx) != 0; + param.Type = MoveTemp(MUtils::UnboxVariantType(mMethod->GetParameterType(paramIdx))); + param.IsOut = mMethod->GetParameterIsOut(paramIdx); } #endif } @@ -1344,28 +1332,28 @@ void* ManagedBinaryModule::FindField(const ScriptingTypeHandle& typeHandle, cons void ManagedBinaryModule::GetFieldSignature(void* field, ScriptingTypeFieldSignature& fieldSignature) { -#if USE_MONO +#if USE_CSHARP const auto mField = (MField*)field; fieldSignature.Name = mField->GetName(); - fieldSignature.ValueType = MoveTemp(MUtils::UnboxVariantType(mField->GetType().GetNative())); + fieldSignature.ValueType = MoveTemp(MUtils::UnboxVariantType(mField->GetType())); fieldSignature.IsStatic = mField->IsStatic(); #endif } bool ManagedBinaryModule::GetFieldValue(void* field, const Variant& instance, Variant& result) { -#if USE_MONO +#if USE_CSHARP const auto mField = (MField*)field; // Get instance object - MonoObject* instanceObject = nullptr; + MObject* instanceObject = nullptr; if (!mField->IsStatic()) { // Box instance into C# object instanceObject = MUtils::BoxVariant(instance); // Validate instance - if (!instanceObject || !mono_class_is_subclass_of(mono_object_get_class(instanceObject), mField->GetParentClass()->GetNative(), false)) + if (!instanceObject || !MCore::Object::GetClass(instanceObject)->IsSubClassOf(mField->GetParentClass())) { if (!instanceObject) LOG(Error, "Failed to get field '{0}.{1}' without object instance", String(mField->GetParentClass()->GetFullName()), String(mField->GetName())); @@ -1376,7 +1364,7 @@ bool ManagedBinaryModule::GetFieldValue(void* field, const Variant& instance, Va } // Get the value - MonoObject* resultObject = mField->GetValueBoxed(instanceObject); + MObject* resultObject = mField->GetValueBoxed(instanceObject); result = MUtils::UnboxVariant(resultObject); return false; #else @@ -1386,18 +1374,18 @@ bool ManagedBinaryModule::GetFieldValue(void* field, const Variant& instance, Va bool ManagedBinaryModule::SetFieldValue(void* field, const Variant& instance, Variant& value) { -#if USE_MONO +#if USE_CSHARP const auto mField = (MField*)field; // Get instance object - MonoObject* instanceObject = nullptr; + MObject* instanceObject = nullptr; if (!mField->IsStatic()) { // Box instance into C# object instanceObject = MUtils::BoxVariant(instance); // Validate instance - if (!instanceObject || !mono_class_is_subclass_of(mono_object_get_class(instanceObject), mField->GetParentClass()->GetNative(), false)) + if (!instanceObject || !MCore::Object::GetClass(instanceObject)->IsSubClassOf(mField->GetParentClass())) { if (!instanceObject) LOG(Error, "Failed to set field '{0}.{1}' without object instance", String(mField->GetParentClass()->GetFullName()), String(mField->GetName())); @@ -1424,8 +1412,8 @@ void ManagedBinaryModule::Destroy(bool isReloading) Assembly->Unload(isReloading); } -NativeBinaryModule::NativeBinaryModule(const StringAnsiView& name, const MAssemblyOptions& options) - : NativeBinaryModule(New(nullptr, name, options)) +NativeBinaryModule::NativeBinaryModule(const StringAnsiView& name) + : NativeBinaryModule(New(nullptr, name)) { } diff --git a/Source/Engine/Scripting/BinaryModule.h b/Source/Engine/Scripting/BinaryModule.h index 02e3e0c2e..36e90acdf 100644 --- a/Source/Engine/Scripting/BinaryModule.h +++ b/Source/Engine/Scripting/BinaryModule.h @@ -9,7 +9,6 @@ #include "Engine/Core/Collections/Dictionary.h" #include "Engine/Core/Collections/Array.h" #include "Engine/Core/ISerializable.h" -#include "ManagedCLR/MAssemblyOptions.h" /// /// The scripting type method metadata for code reflection. @@ -269,8 +268,7 @@ public: /// Initializes a new instance of the class. /// /// The module name. - /// The assembly options. - ManagedBinaryModule(const StringAnsiView& name, const MAssemblyOptions& options); + ManagedBinaryModule(const StringAnsiView& name); /// /// Initializes a new instance of the class. @@ -290,18 +288,18 @@ public: /// MAssembly* Assembly; -#if !COMPILE_WITHOUT_CSHARP +#if USE_CSHARP /// /// The scripting types cache that maps the managed class to the scripting type index. Build after assembly is loaded and scripting types get the managed classes information. /// - Dictionary ClassToTypeIndex; + Dictionary ClassToTypeIndex; #endif static ScriptingObject* ManagedObjectSpawn(const ScriptingObjectSpawnParams& params); static MMethod* FindMethod(MClass* mclass, const ScriptingTypeMethodSignature& signature); -#if USE_MONO - static ManagedBinaryModule* FindModule(MonoClass* klass); - static ScriptingTypeHandle FindType(MonoClass* klass); +#if USE_CSHARP + static ManagedBinaryModule* FindModule(const MClass* klass); + static ScriptingTypeHandle FindType(const MClass* klass); #endif private: @@ -339,8 +337,7 @@ public: /// Initializes a new instance of the class. /// /// The module name. - /// The assembly options. - NativeBinaryModule(const StringAnsiView& name, const MAssemblyOptions& options); + NativeBinaryModule(const StringAnsiView& name); /// /// Initializes a new instance of the class. diff --git a/Source/Engine/Scripting/Internal/EngineInternalCalls.cpp b/Source/Engine/Scripting/Internal/EngineInternalCalls.cpp new file mode 100644 index 000000000..27bb8aa47 --- /dev/null +++ b/Source/Engine/Scripting/Internal/EngineInternalCalls.cpp @@ -0,0 +1,233 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#include "Engine/Platform/Platform.h" +#include "Engine/Animations/Graph/AnimGraph.h" +#include "Engine/Scripting/Scripting.h" +#include "Engine/Scripting/ScriptingType.h" +#include "Engine/Scripting/BinaryModule.h" +#include "Engine/Scripting/ManagedCLR/MAssembly.h" +#include "Engine/Scripting/ManagedCLR/MException.h" +#include "Engine/Scripting/ManagedCLR/MUtils.h" +#include "Engine/Scripting/ManagedCLR/MCore.h" +#if USE_MONO +#include "Engine/Scripting/ManagedCLR/MClass.h" +#include "Engine/Scripting/ManagedCLR/MField.h" +#endif +#include "Engine/Scripting/Internal/InternalCalls.h" +#include "Engine/Core/ObjectsRemovalService.h" +#include "Engine/Profiler/Profiler.h" +#include "FlaxEngine.Gen.h" +#if TRACY_ENABLE && !PROFILE_CPU_USE_TRANSIENT_DATA +#include "Engine/Core/Collections/ChunkedArray.h" +#endif +#include "Engine/Threading/Threading.h" + +#if !COMPILE_WITHOUT_CSHARP + +#if USE_MONO +DEFINE_INTERNAL_CALL(MObject*) UtilsInternal_ExtractArrayFromList(MObject* obj) +{ + MClass* klass = MCore::Object::GetClass(obj); + MField* field = klass->GetField("_items"); + MObject* o; + field->GetValue(obj, &o); + return o; +} +#endif + +DEFINE_INTERNAL_CALL(void) PlatformInternal_MemoryCopy(void* dst, const void* src, uint64 size) +{ + Platform::MemoryCopy(dst, src, size); +} + +DEFINE_INTERNAL_CALL(void) PlatformInternal_MemoryClear(void* dst, uint64 size) +{ + Platform::MemoryClear(dst, size); +} + +DEFINE_INTERNAL_CALL(int32) PlatformInternal_MemoryCompare(const void* buf1, const void* buf2, uint64 size) +{ + return Platform::MemoryCompare(buf1, buf2, size); +} + +DEFINE_INTERNAL_CALL(void) DebugLogHandlerInternal_LogWrite(LogType level, MString* msgObj) +{ + StringView msg; + MUtils::ToString(msgObj, msg); + Log::Logger::Write(level, msg); +} + +DEFINE_INTERNAL_CALL(void) DebugLogHandlerInternal_Log(LogType level, MString* msgObj, ScriptingObject* obj, MString* stackTrace) +{ + if (msgObj == nullptr) + return; + + // Get info + StringView msg; + MUtils::ToString(msgObj, msg); + //const String objName = obj ? obj->ToString() : String::Empty; + + // Send event + // TODO: maybe option for build to threat warnings and errors as fatal errors? + //const String logMessage = String::Format(TEXT("Debug:{1} {2}"), objName, *msg); + Log::Logger::Write(level, msg); +} + +DEFINE_INTERNAL_CALL(void) DebugLogHandlerInternal_LogException(MObject* exception, ScriptingObject* obj) +{ +#if USE_CSHARP + if (exception == nullptr) + return; + + // Get info + MException ex(exception); + const String objName = obj ? obj->ToString() : String::Empty; + + // Print exception including inner exceptions + // TODO: maybe option for build to threat warnings and errors as fatal errors? + ex.Log(LogType::Warning, objName.GetText()); +#endif +} + +#endif + +#if USE_CSHARP + +namespace +{ +#if COMPILE_WITH_PROFILER + Array> ManagedEventsGPU; +#if TRACY_ENABLE && !PROFILE_CPU_USE_TRANSIENT_DATA + CriticalSection ManagedSourceLocationsLocker; + + struct Location + { + String Name; + StringAnsi NameAnsi; + tracy::SourceLocationData SrcLocation; + }; + + ChunkedArray ManagedSourceLocations; +#endif +#endif +} + +DEFINE_INTERNAL_CALL(void) ProfilerInternal_BeginEvent(MString* nameObj) +{ +#if COMPILE_WITH_PROFILER + StringView name; + MUtils::ToString(nameObj, name); + ProfilerCPU::BeginEvent(*name); +#if TRACY_ENABLE +#if PROFILE_CPU_USE_TRANSIENT_DATA + tracy::ScopedZone::Begin(__LINE__, __FILE__, strlen( __FILE__ ), __FUNCTION__, strlen( __FUNCTION__ ), name.Get(), name.Length() ); +#else + ScopeLock lock(ManagedSourceLocationsLocker); + tracy::SourceLocationData* srcLoc = nullptr; + for (auto e = ManagedSourceLocations.Begin(); e.IsNotEnd(); ++e) + { + if (name == e->Name) + { + srcLoc = &e->SrcLocation; + break; + } + } + if (!srcLoc) + { + auto& e = ManagedSourceLocations.AddOne(); + e.Name = name; + e.NameAnsi = name.Get(); + srcLoc = &e.SrcLocation; + srcLoc->name = e.NameAnsi.Get(); + srcLoc->function = nullptr; + srcLoc->file = nullptr; + srcLoc->line = 0; + srcLoc->color = 0; + } + //static constexpr tracy::SourceLocationData tracySrcLoc{ nullptr, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; + tracy::ScopedZone::Begin(srcLoc); +#endif +#endif +#endif +} + +DEFINE_INTERNAL_CALL(void) ProfilerInternal_EndEvent() +{ +#if COMPILE_WITH_PROFILER +#if TRACY_ENABLE + tracy::ScopedZone::End(); +#endif + ProfilerCPU::EndEvent(); +#endif +} + +DEFINE_INTERNAL_CALL(void) ProfilerInternal_BeginEventGPU(MString* nameObj) +{ +#if COMPILE_WITH_PROFILER + const StringView nameChars = MCore::String::GetChars(nameObj); + const auto index = ProfilerGPU::BeginEvent(nameChars.Get()); + ManagedEventsGPU.Push(index); +#endif +} + +DEFINE_INTERNAL_CALL(void) ProfilerInternal_EndEventGPU() +{ +#if COMPILE_WITH_PROFILER + const auto index = ManagedEventsGPU.Pop(); + ProfilerGPU::EndEvent(index); +#endif +} + +DEFINE_INTERNAL_CALL(bool) ScriptingInternal_HasGameModulesLoaded() +{ + return Scripting::HasGameModulesLoaded(); +} + +DEFINE_INTERNAL_CALL(bool) ScriptingInternal_IsTypeFromGameScripts(MTypeObject* type) +{ + return Scripting::IsTypeFromGameScripts(MUtils::GetClass(INTERNAL_TYPE_OBJECT_GET(type))); +} + +DEFINE_INTERNAL_CALL(void) ScriptingInternal_FlushRemovedObjects() +{ + ASSERT(IsInMainThread()); + ObjectsRemovalService::Flush(); +} + +#endif + +void registerFlaxEngineInternalCalls() +{ + AnimGraphExecutor::initRuntime(); +#if USE_CSHARP + ADD_INTERNAL_CALL("FlaxEngine.Utils::MemoryCopy", &PlatformInternal_MemoryCopy); + ADD_INTERNAL_CALL("FlaxEngine.Utils::MemoryClear", &PlatformInternal_MemoryClear); + ADD_INTERNAL_CALL("FlaxEngine.Utils::MemoryCompare", &PlatformInternal_MemoryCompare); +#if USE_MONO + ADD_INTERNAL_CALL("FlaxEngine.Utils::Internal_ExtractArrayFromList", &UtilsInternal_ExtractArrayFromList); +#endif + ADD_INTERNAL_CALL("FlaxEngine.DebugLogHandler::Internal_LogWrite", &DebugLogHandlerInternal_LogWrite); + ADD_INTERNAL_CALL("FlaxEngine.DebugLogHandler::Internal_Log", &DebugLogHandlerInternal_Log); + ADD_INTERNAL_CALL("FlaxEngine.DebugLogHandler::Internal_LogException", &DebugLogHandlerInternal_LogException); +#endif +} + +class ScriptingInternal +{ +public: + static void InitRuntime() + { + // Scripting API + ADD_INTERNAL_CALL("FlaxEngine.Scripting::HasGameModulesLoaded", &ScriptingInternal_HasGameModulesLoaded); + ADD_INTERNAL_CALL("FlaxEngine.Scripting::IsTypeFromGameScripts", &ScriptingInternal_IsTypeFromGameScripts); + ADD_INTERNAL_CALL("FlaxEngine.Scripting::FlushRemovedObjects", &ScriptingInternal_FlushRemovedObjects); + + // Profiler API + ADD_INTERNAL_CALL("FlaxEngine.Profiler::BeginEvent", &ProfilerInternal_BeginEvent); + ADD_INTERNAL_CALL("FlaxEngine.Profiler::EndEvent", &ProfilerInternal_EndEvent); + ADD_INTERNAL_CALL("FlaxEngine.Profiler::BeginEventGPU", &ProfilerInternal_BeginEventGPU); + ADD_INTERNAL_CALL("FlaxEngine.Profiler::EndEventGPU", &ProfilerInternal_EndEventGPU); + } +}; + +IMPLEMENT_SCRIPTING_TYPE_NO_SPAWN(Scripting, FlaxEngine, "FlaxEngine.Scripting", nullptr, nullptr); diff --git a/Source/Engine/Scripting/InternalCalls.h b/Source/Engine/Scripting/Internal/InternalCalls.h similarity index 82% rename from Source/Engine/Scripting/InternalCalls.h rename to Source/Engine/Scripting/Internal/InternalCalls.h index 49d397a1c..f602cab50 100644 --- a/Source/Engine/Scripting/InternalCalls.h +++ b/Source/Engine/Scripting/Internal/InternalCalls.h @@ -2,10 +2,10 @@ #pragma once -#include "Engine/Debug/DebugLog.h" #include "Engine/Core/Log.h" -#include "ScriptingType.h" -#include "Types.h" +#include "Engine/Debug/DebugLog.h" +#include "Engine/Scripting/ScriptingType.h" +#include "Engine/Scripting/Types.h" #if defined(__clang__) // Helper utility to override vtable entry with automatic restore @@ -29,12 +29,20 @@ struct FLAXENGINE_API VTableFunctionInjector *VTableAddr = OriginalValue; } }; +#elif defined(_MSC_VER) +#define MSVC_FUNC_EXPORT(name) __pragma(comment(linker, "/EXPORT:" #name "=" __FUNCDNAME__)) #endif -#if USE_MONO +#if USE_CSHARP +#if USE_NETCORE +#define ADD_INTERNAL_CALL(fullName, method) +#define DEFINE_INTERNAL_CALL(returnType) extern "C" DLLEXPORT returnType +#else extern "C" FLAXENGINE_API void mono_add_internal_call(const char* name, const void* method); #define ADD_INTERNAL_CALL(fullName, method) mono_add_internal_call(fullName, (const void*)method) +#define DEFINE_INTERNAL_CALL(returnType) static returnType +#endif #if BUILD_RELEASE && 0 @@ -77,6 +85,7 @@ extern "C" FLAXENGINE_API void mono_add_internal_call(const char* name, const vo #else #define ADD_INTERNAL_CALL(fullName, method) +#define DEFINE_INTERNAL_CALL(returnType) static returnType #define INTERNAL_CALL_CHECK(obj) #define INTERNAL_CALL_CHECK_EXP(expression) #define INTERNAL_CALL_CHECK_RETURN(obj, defaultValue) diff --git a/Source/Engine/Scripting/MainThreadManagedInvokeAction.cpp b/Source/Engine/Scripting/Internal/MainThreadManagedInvokeAction.cpp similarity index 98% rename from Source/Engine/Scripting/MainThreadManagedInvokeAction.cpp rename to Source/Engine/Scripting/Internal/MainThreadManagedInvokeAction.cpp index db2bfb4a8..0854b620e 100644 --- a/Source/Engine/Scripting/MainThreadManagedInvokeAction.cpp +++ b/Source/Engine/Scripting/Internal/MainThreadManagedInvokeAction.cpp @@ -3,7 +3,7 @@ #include "MainThreadManagedInvokeAction.h" #include "Engine/Threading/Threading.h" #include "Engine/Scripting/ScriptingCalls.h" -#include "MException.h" +#include "Engine/Scripting/ManagedCLR/MException.h" MainThreadManagedInvokeAction* MainThreadManagedInvokeAction::Invoke(MMethod* method, MObject* instance, LogType exceptionLevel) { diff --git a/Source/Engine/Scripting/MainThreadManagedInvokeAction.h b/Source/Engine/Scripting/Internal/MainThreadManagedInvokeAction.h similarity index 92% rename from Source/Engine/Scripting/MainThreadManagedInvokeAction.h rename to Source/Engine/Scripting/Internal/MainThreadManagedInvokeAction.h index a7924c76b..4b844b61d 100644 --- a/Source/Engine/Scripting/MainThreadManagedInvokeAction.h +++ b/Source/Engine/Scripting/Internal/MainThreadManagedInvokeAction.h @@ -4,8 +4,8 @@ #include "Engine/Threading/MainThreadTask.h" #include "Engine/Core/Log.h" -#include "ManagedCLR/MMethod.h" -#include "ManagedCLR/MUtils.h" +#include "Engine/Scripting/ManagedCLR/MMethod.h" +#include "Engine/Scripting/ManagedCLR/MUtils.h" /// /// Helper class for easy invoking managed code on main thread before all game systems update. @@ -71,28 +71,28 @@ public: AddParam(val); } -#if USE_MONO +#if USE_CSHARP FORCE_INLINE void AddParam(const String& value) { - MonoString* val = MUtils::ToString(value); + MString* val = MUtils::ToString(value); AddParam(val); } FORCE_INLINE void AddParam(const StringView& value) { - MonoString* val = MUtils::ToString(value); + MString* val = MUtils::ToString(value); AddParam(val); } - FORCE_INLINE void AddParam(const String& value, MonoDomain* domain) + FORCE_INLINE void AddParam(const String& value, MDomain* domain) { - MonoString* val = MUtils::ToString(value, domain); + MString* val = MUtils::ToString(value, domain); AddParam(val); } - FORCE_INLINE void AddParam(const StringView& value, MonoDomain* domain) + FORCE_INLINE void AddParam(const StringView& value, MDomain* domain) { - MonoString* val = MUtils::ToString(value, domain); + MString* val = MUtils::ToString(value, domain); AddParam(val); } #endif diff --git a/Source/Engine/Scripting/InternalCalls/ManagedBitArray.h b/Source/Engine/Scripting/Internal/ManagedBitArray.h similarity index 67% rename from Source/Engine/Scripting/InternalCalls/ManagedBitArray.h rename to Source/Engine/Scripting/Internal/ManagedBitArray.h index de6a4cff7..ec4227378 100644 --- a/Source/Engine/Scripting/InternalCalls/ManagedBitArray.h +++ b/Source/Engine/Scripting/Internal/ManagedBitArray.h @@ -2,16 +2,9 @@ #pragma once -#include "Engine/Core/Log.h" #include "Engine/Core/Collections/BitArray.h" -#include "Engine/Scripting/ManagedCLR/MAssembly.h" -#include "Engine/Scripting/ManagedCLR/MClass.h" -#include "Engine/Scripting/ManagedCLR/MField.h" -#include "Engine/Scripting/BinaryModule.h" -#if USE_MONO -#include -#include -#include +#include "Engine/Scripting/ManagedCLR/MCore.h" +#if USE_CSHARP struct ManagedBitArray { @@ -26,7 +19,7 @@ struct ManagedBitArray MonoMethod* bitArrayCtor = mono_method_desc_search_in_class(desc, bitArrayClass->GetNative()); mono_method_desc_free(desc); CHECK_RETURN(bitArrayCtor, nullptr); - MonoObject* instance = mono_object_new(mono_domain_get(), bitArrayClass->GetNative()); + MObject* instance = MCore::Object::New(bitArrayClass); CHECK_RETURN(instance, nullptr); int32 length = data.Count(); void* params[1]; @@ -34,10 +27,10 @@ struct ManagedBitArray mono_runtime_invoke(bitArrayCtor, instance, params, nullptr); const MField* arrayField = bitArrayClass->GetField("m_array"); CHECK_RETURN(arrayField, nullptr); - MonoArray* array = nullptr; + MArray* array = nullptr; arrayField->GetValue(instance, &array); CHECK_RETURN(array, nullptr); - const int32 arrayLength = mono_array_length(array); + const int32 arrayLength = MCore::Array::GetLength(array); //mono_value_copy_array(array, 0, (void*)data.Get(), arrayLength); int32* arrayPtr = mono_array_addr(array, int32, 0); //Platform::MemoryCopy(mono_array_addr_with_size(array, sizeof(int32), 0), data.Get(), data.Count() / sizeof(byte)); @@ -45,12 +38,11 @@ struct ManagedBitArray return instance; #else // Convert into bool[] - MonoArray* array = mono_array_new(mono_domain_get(), mono_get_boolean_class(), data.Count()); + MArray* array = MCore::Array::New(MCore::TypeCache::Boolean, data.Count()); + bool* arrayPtr = MCore::Array::GetAddress(array); for (int32 i = 0; i < data.Count(); i++) - { - mono_array_set(array, bool, i, data[i]); - } - return (MonoObject*)array; + arrayPtr[i] = data[i]; + return (MObject*)array; #endif } }; diff --git a/Source/Engine/Scripting/InternalCalls/ManagedDictionary.h b/Source/Engine/Scripting/Internal/ManagedDictionary.h similarity index 50% rename from Source/Engine/Scripting/InternalCalls/ManagedDictionary.h rename to Source/Engine/Scripting/Internal/ManagedDictionary.h index 0b19a86e8..c42eb1d27 100644 --- a/Source/Engine/Scripting/InternalCalls/ManagedDictionary.h +++ b/Source/Engine/Scripting/Internal/ManagedDictionary.h @@ -4,40 +4,39 @@ #include "Engine/Core/Log.h" #include "Engine/Scripting/Scripting.h" -#include "Engine/Scripting/StdTypesContainer.h" +#if USE_CSHARP #include "Engine/Scripting/BinaryModule.h" #include "Engine/Scripting/ManagedCLR/MUtils.h" #include "Engine/Scripting/ManagedCLR/MClass.h" #include "Engine/Scripting/ManagedCLR/MMethod.h" #include "Engine/Scripting/ManagedCLR/MAssembly.h" -#include "Engine/Scripting/MException.h" -#if USE_MONO -#include +#include "Engine/Scripting/ManagedCLR/MException.h" +#include "Engine/Scripting/Internal/StdTypesContainer.h" /// /// Utility interop between C++ and C# for Dictionary collection. /// struct FLAXENGINE_API ManagedDictionary { - MonoObject* Instance; + MObject* Instance; - ManagedDictionary(MonoObject* instance = nullptr) + ManagedDictionary(MObject* instance = nullptr) { Instance = instance; } template - static MonoObject* ToManaged(const Dictionary& data, MonoType* keyType, MonoType* valueType) + static MObject* ToManaged(const Dictionary& data, MType* keyType, MType* valueType) { MConverter keysConverter; MConverter valueConverter; ManagedDictionary result = New(keyType, valueType); - MonoClass* keyClass = mono_type_get_class(keyType); - MonoClass* valueClass = mono_type_get_class(valueType); + MClass* keyClass = MCore::Type::GetClass(keyType); + MClass* valueClass = MCore::Type::GetClass(valueType); for (auto i = data.Begin(); i.IsNotEnd(); ++i) { - MonoObject* keyManaged = keysConverter.Box(i->Key, keyClass); - MonoObject* valueManaged = valueConverter.Box(i->Value, valueClass); + MObject* keyManaged = keysConverter.Box(i->Key, keyClass); + MObject* valueManaged = valueConverter.Box(i->Value, valueClass); result.Add(keyManaged, valueManaged); } return result.Instance; @@ -49,78 +48,80 @@ struct FLAXENGINE_API ManagedDictionary /// The managed dictionary object. /// The output array. template - static Dictionary ToNative(MonoObject* managed) + static Dictionary ToNative(MObject* managed) { Dictionary result; const ManagedDictionary wrapper(managed); - MonoArray* managedKeys = wrapper.GetKeys(); - auto length = managedKeys ? (int32)mono_array_length(managedKeys) : 0; + MArray* managedKeys = wrapper.GetKeys(); + if (managedKeys == nullptr) + return result; + int32 length = MCore::Array::GetLength(managedKeys); Array keys; keys.Resize(length); result.EnsureCapacity(length); MConverter keysConverter; - for (int32 i = 0; i < keys.Count(); i++) - { - auto& key = keys[i]; - MonoObject* keyManaged = mono_array_get(managedKeys, MonoObject*, i); - keysConverter.Unbox(key, keyManaged); - } MConverter valueConverter; + MObject** managedKeysPtr = MCore::Array::GetAddress(managedKeys); for (int32 i = 0; i < keys.Count(); i++) { - auto& key = keys[i]; - MonoObject* keyManaged = mono_array_get(managedKeys, MonoObject*, i); - MonoObject* valueManaged = wrapper.GetValue(keyManaged); - auto& value = result[key]; + KeyType& key = keys[i]; + MObject* keyManaged = managedKeysPtr[i]; + keysConverter.Unbox(key, keyManaged); + MObject* valueManaged = wrapper.GetValue(keyManaged); + ValueType& value = result[key]; valueConverter.Unbox(value, valueManaged); } return result; } - static MonoReflectionType* GetClass(MonoType* keyType, MonoType* valueType) + static MTypeObject* GetClass(MType* keyType, MType* valueType) { - auto domain = mono_domain_get(); - auto scriptingClass = Scripting::GetStaticClass(); + MClass* scriptingClass = Scripting::GetStaticClass(); CHECK_RETURN(scriptingClass, nullptr); - auto makeGenericMethod = scriptingClass->GetMethod("MakeGenericType", 2); + MMethod* makeGenericMethod = scriptingClass->GetMethod("MakeGenericType", 2); CHECK_RETURN(makeGenericMethod, nullptr); - auto genericType = MUtils::GetType(StdTypesContainer::Instance()->DictionaryClass->GetNative()); - auto genericArgs = mono_array_new(domain, mono_get_object_class(), 2); - mono_array_set(genericArgs, MonoReflectionType*, 0, mono_type_get_object(domain, keyType)); - mono_array_set(genericArgs, MonoReflectionType*, 1, mono_type_get_object(domain, valueType)); + MTypeObject* genericType = MUtils::GetType(StdTypesContainer::Instance()->DictionaryClass); +#if USE_NETCORE + MArray* genericArgs = MCore::Array::New(MCore::TypeCache::IntPtr, 2); +#else + MArray* genericArgs = MCore::Array::New(MCore::TypeCache::Object, 2); +#endif + MTypeObject** genericArgsPtr = MCore::Array::GetAddress(genericArgs); + genericArgsPtr[0] = INTERNAL_TYPE_GET_OBJECT(keyType); + genericArgsPtr[1] = INTERNAL_TYPE_GET_OBJECT(valueType); void* params[2]; params[0] = genericType; params[1] = genericArgs; MObject* exception = nullptr; - auto dictionaryType = makeGenericMethod->Invoke(nullptr, params, &exception); + MObject* dictionaryType = makeGenericMethod->Invoke(nullptr, params, &exception); if (exception) { MException ex(exception); ex.Log(LogType::Error, TEXT("")); return nullptr; } - return (MonoReflectionType*)dictionaryType; + return (MTypeObject*)dictionaryType; } - static ManagedDictionary New(MonoType* keyType, MonoType* valueType) + static ManagedDictionary New(MType* keyType, MType* valueType) { ManagedDictionary result; - auto dictionaryType = GetClass(keyType, valueType); + MTypeObject* dictionaryType = GetClass(keyType, valueType); if (!dictionaryType) return result; - auto scriptingClass = Scripting::GetStaticClass(); + MClass* scriptingClass = Scripting::GetStaticClass(); CHECK_RETURN(scriptingClass, result); - auto createMethod = StdTypesContainer::Instance()->ActivatorClass->GetMethod("CreateInstance", 2); + MMethod* createMethod = StdTypesContainer::Instance()->ActivatorClass->GetMethod("CreateInstance", 2); CHECK_RETURN(createMethod, result); MObject* exception = nullptr; void* params[2]; params[0] = dictionaryType; params[1] = nullptr; - auto instance = createMethod->Invoke(nullptr, params, &exception); + MObject* instance = createMethod->Invoke(nullptr, params, &exception); if (exception) { MException ex(exception); @@ -132,19 +133,19 @@ struct FLAXENGINE_API ManagedDictionary return result; } - void Add(MonoObject* key, MonoObject* value) + void Add(MObject* key, MObject* value) { CHECK(Instance); - auto scriptingClass = Scripting::GetStaticClass(); + MClass* scriptingClass = Scripting::GetStaticClass(); CHECK(scriptingClass); - auto addDictionaryItemMethod = scriptingClass->GetMethod("AddDictionaryItem", 3); + MMethod* addDictionaryItemMethod = scriptingClass->GetMethod("AddDictionaryItem", 3); CHECK(addDictionaryItemMethod); void* params[3]; params[0] = Instance; params[1] = key; params[2] = value; MObject* exception = nullptr; - mono_runtime_invoke(addDictionaryItemMethod->GetNative(), Instance, params, &exception); + addDictionaryItemMethod->Invoke(Instance, params, &exception); if (exception) { MException ex(exception); @@ -152,27 +153,27 @@ struct FLAXENGINE_API ManagedDictionary } } - MonoArray* GetKeys() const + MArray* GetKeys() const { CHECK_RETURN(Instance, nullptr); - auto scriptingClass = Scripting::GetStaticClass(); + MClass* scriptingClass = Scripting::GetStaticClass(); CHECK_RETURN(scriptingClass, nullptr); - auto getDictionaryKeysMethod = scriptingClass->GetMethod("GetDictionaryKeys", 1); + MMethod* getDictionaryKeysMethod = scriptingClass->GetMethod("GetDictionaryKeys", 1); CHECK_RETURN(getDictionaryKeysMethod, nullptr); void* params[1]; params[0] = Instance; - return (MonoArray*)mono_runtime_invoke(getDictionaryKeysMethod->GetNative(), nullptr, params, nullptr); + return (MArray*)getDictionaryKeysMethod->Invoke( nullptr, params, nullptr); } - MonoObject* GetValue(MonoObject* key) const + MObject* GetValue(MObject* key) const { CHECK_RETURN(Instance, nullptr); - auto klass = mono_object_get_class(Instance); - auto getItemMethod = mono_class_get_method_from_name(klass, "System.Collections.IDictionary.get_Item", 1); + MClass* klass = MCore::Object::GetClass(Instance); + MMethod* getItemMethod = klass->GetMethod("System.Collections.IDictionary.get_Item", 1); CHECK_RETURN(getItemMethod, nullptr); void* params[1]; params[0] = key; - return mono_runtime_invoke(getItemMethod, Instance, params, nullptr); + return getItemMethod->Invoke(Instance, params, nullptr); } }; diff --git a/Source/Engine/Scripting/ManagedSerialization.cpp b/Source/Engine/Scripting/Internal/ManagedSerialization.cpp similarity index 80% rename from Source/Engine/Scripting/ManagedSerialization.cpp rename to Source/Engine/Scripting/Internal/ManagedSerialization.cpp index 737c0c91c..f1543a326 100644 --- a/Source/Engine/Scripting/ManagedSerialization.cpp +++ b/Source/Engine/Scripting/Internal/ManagedSerialization.cpp @@ -1,14 +1,14 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #include "ManagedSerialization.h" -#if USE_MONO +#if USE_CSHARP #include "Engine/Core/Log.h" #include "Engine/Serialization/Json.h" #include "Engine/Serialization/JsonWriter.h" -#include "StdTypesContainer.h" -#include "MException.h" -#include "ManagedCLR/MMethod.h" -#include +#include "Engine/Scripting/ManagedCLR/MException.h" +#include "Engine/Scripting/ManagedCLR/MMethod.h" +#include "Engine/Scripting/ManagedCLR/MCore.h" +#include "Engine/Scripting/Internal/StdTypesContainer.h" void ManagedSerialization::Serialize(ISerializable::SerializeStream& stream, MObject* object) { @@ -29,7 +29,7 @@ void ManagedSerialization::Serialize(ISerializable::SerializeStream& stream, MOb // Call serialization tool MObject* exception = nullptr; // TODO: use method thunk - auto invokeResultStr = (MonoString*)StdTypesContainer::Instance()->Json_Serialize->Invoke(nullptr, params, &exception); + auto invokeResultStr = (MString*)StdTypesContainer::Instance()->Json_Serialize->Invoke(nullptr, params, &exception); if (exception) { MException ex(exception); @@ -42,9 +42,7 @@ void ManagedSerialization::Serialize(ISerializable::SerializeStream& stream, MOb } // Write result data - const auto invokeResultChars = mono_string_to_utf8(invokeResultStr); - stream.RawValue(invokeResultChars); - mono_free(invokeResultChars); + stream.RawValue(MCore::String::GetChars(invokeResultStr)); } void ManagedSerialization::SerializeDiff(ISerializable::SerializeStream& stream, MObject* object, MObject* other) @@ -67,7 +65,7 @@ void ManagedSerialization::SerializeDiff(ISerializable::SerializeStream& stream, // Call serialization tool MObject* exception = nullptr; // TODO: use method thunk - auto invokeResultStr = (MonoString*)StdTypesContainer::Instance()->Json_SerializeDiff->Invoke(nullptr, params, &exception); + auto invokeResultStr = (MString*)StdTypesContainer::Instance()->Json_SerializeDiff->Invoke(nullptr, params, &exception); if (exception) { MException ex(exception); @@ -80,9 +78,7 @@ void ManagedSerialization::SerializeDiff(ISerializable::SerializeStream& stream, } // Write result data - auto invokeResultChars = mono_string_to_utf8(invokeResultStr); - stream.RawValue(invokeResultChars); - mono_free(invokeResultChars); + stream.RawValue(MCore::String::GetChars(invokeResultStr)); } void ManagedSerialization::Deserialize(ISerializable::DeserializeStream& stream, MObject* object) diff --git a/Source/Engine/Scripting/ManagedSerialization.h b/Source/Engine/Scripting/Internal/ManagedSerialization.h similarity index 96% rename from Source/Engine/Scripting/ManagedSerialization.h rename to Source/Engine/Scripting/Internal/ManagedSerialization.h index 65b21c235..6b58ac697 100644 --- a/Source/Engine/Scripting/ManagedSerialization.h +++ b/Source/Engine/Scripting/Internal/ManagedSerialization.h @@ -3,7 +3,7 @@ #pragma once #include "Engine/Core/ISerializable.h" -#include "ManagedCLR/MTypes.h" +#include "Engine/Scripting/ManagedCLR/MTypes.h" /// /// Managed objects serialization utilities. Helps with C# scripts saving to JSON or loading. @@ -11,8 +11,7 @@ class FLAXENGINE_API ManagedSerialization { public: - -#if USE_MONO +#if USE_CSHARP /// /// Serializes managed object to JSON. /// diff --git a/Source/Engine/Scripting/StdTypesContainer.cpp b/Source/Engine/Scripting/Internal/StdTypesContainer.cpp similarity index 92% rename from Source/Engine/Scripting/StdTypesContainer.cpp rename to Source/Engine/Scripting/Internal/StdTypesContainer.cpp index 526b01817..7197690cc 100644 --- a/Source/Engine/Scripting/StdTypesContainer.cpp +++ b/Source/Engine/Scripting/Internal/StdTypesContainer.cpp @@ -1,11 +1,11 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #include "StdTypesContainer.h" -#include "Scripting.h" -#include "ScriptingType.h" -#include "BinaryModule.h" -#include "ManagedCLR/MAssembly.h" -#include "ManagedCLR/MClass.h" +#include "Engine/Scripting/Scripting.h" +#include "Engine/Scripting/ScriptingType.h" +#include "Engine/Scripting/BinaryModule.h" +#include "Engine/Scripting/ManagedCLR/MAssembly.h" +#include "Engine/Scripting/ManagedCLR/MClass.h" #include "Engine/Core/Log.h" #include "FlaxEngine.Gen.h" @@ -47,7 +47,7 @@ void StdTypesContainer::Clear() bool StdTypesContainer::Gather() { -#if !COMPILE_WITHOUT_CSHARP +#if USE_CSHARP #define GET_CLASS(assembly, type, typeName) \ type = ((ManagedBinaryModule*)CONCAT_MACROS(GetBinaryModule, assembly)())->Assembly->GetClass(typeName); \ if (type == nullptr) \ diff --git a/Source/Engine/Scripting/StdTypesContainer.h b/Source/Engine/Scripting/Internal/StdTypesContainer.h similarity index 100% rename from Source/Engine/Scripting/StdTypesContainer.h rename to Source/Engine/Scripting/Internal/StdTypesContainer.h diff --git a/Source/Engine/Scripting/InternalCalls/EngineInternalCalls.cpp b/Source/Engine/Scripting/InternalCalls/EngineInternalCalls.cpp deleted file mode 100644 index 48c2656b9..000000000 --- a/Source/Engine/Scripting/InternalCalls/EngineInternalCalls.cpp +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. - -#include "Engine/Platform/FileSystem.h" -#include "Engine/Animations/Graph/AnimGraph.h" -#include "Engine/Scripting/InternalCalls.h" -#include "Engine/Scripting/MException.h" -#include "Engine/Scripting/ManagedCLR/MUtils.h" - -#if USE_MONO - -namespace UtilsInternal -{ - MonoObject* ExtractArrayFromList(MonoObject* obj) - { - auto klass = mono_object_get_class(obj); - auto field = mono_class_get_field_from_name(klass, "_items"); - MonoObject* o; - mono_field_get_value(obj, field, &o); - return o; - } -} - -namespace DebugLogHandlerInternal -{ - void LogWrite(LogType level, MonoString* msgObj) - { - StringView msg; - MUtils::ToString(msgObj, msg); - Log::Logger::Write(level, msg); - } - - void Log(LogType level, MonoString* msgObj, ScriptingObject* obj, MonoString* stackTrace) - { - if (msgObj == nullptr) - return; - - // Get info - StringView msg; - MUtils::ToString(msgObj, msg); - //const String objName = obj ? obj->ToString() : String::Empty; - - // Send event - // TODO: maybe option for build to threat warnings and errors as fatal errors? - //const String logMessage = String::Format(TEXT("Debug:{1} {2}"), objName, *msg); - Log::Logger::Write(level, msg); - } - - void LogException(MonoException* exception, ScriptingObject* obj) - { - if (exception == nullptr) - return; - - // Get info - MException ex(exception); - const String objName = obj ? obj->ToString() : String::Empty; - - // Print exception including inner exceptions - // TODO: maybe option for build to threat warnings and errors as fatal errors? - ex.Log(LogType::Warning, objName.GetText()); - } -} - -namespace FlaxLogWriterInternal -{ - void WriteStringToLog(MonoString* msgObj) - { - if (msgObj == nullptr) - return; - StringView msg; - MUtils::ToString(msgObj, msg); - LOG_STR(Info, msg); - } -} - -#endif - -void registerFlaxEngineInternalCalls() -{ - AnimGraphExecutor::initRuntime(); -#if USE_MONO - ADD_INTERNAL_CALL("FlaxEngine.Utils::MemoryCopy", &Platform::MemoryCopy); - ADD_INTERNAL_CALL("FlaxEngine.Utils::MemoryClear", &Platform::MemoryClear); - ADD_INTERNAL_CALL("FlaxEngine.Utils::MemoryCompare", &Platform::MemoryCompare); - ADD_INTERNAL_CALL("FlaxEngine.Utils::Internal_ExtractArrayFromList", &UtilsInternal::ExtractArrayFromList); - ADD_INTERNAL_CALL("FlaxEngine.DebugLogHandler::Internal_LogWrite", &DebugLogHandlerInternal::LogWrite); - ADD_INTERNAL_CALL("FlaxEngine.DebugLogHandler::Internal_Log", &DebugLogHandlerInternal::Log); - ADD_INTERNAL_CALL("FlaxEngine.DebugLogHandler::Internal_LogException", &DebugLogHandlerInternal::LogException); - ADD_INTERNAL_CALL("FlaxEngine.FlaxLogWriter::Internal_WriteStringToLog", &FlaxLogWriterInternal::WriteStringToLog); -#endif -} diff --git a/Source/Engine/Scripting/MException.cpp b/Source/Engine/Scripting/MException.cpp deleted file mode 100644 index 5b65b7125..000000000 --- a/Source/Engine/Scripting/MException.cpp +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. - -#include "MException.h" -#include "ManagedCLR/MUtils.h" -#if USE_MONO -#include -#endif - -MException::MException(MObject* exception) - : InnerException(nullptr) -{ -#if USE_MONO - ASSERT(exception); - - MonoClass* exceptionClass = mono_object_get_class(exception); - MonoProperty* exceptionMsgProp = mono_class_get_property_from_name(exceptionClass, "Message"); - MonoMethod* exceptionMsgGetter = mono_property_get_get_method(exceptionMsgProp); - MonoString* exceptionMsg = (MonoString*)mono_runtime_invoke(exceptionMsgGetter, exception, nullptr, nullptr); - Message = MUtils::ToString(exceptionMsg); - - MonoProperty* exceptionStackProp = mono_class_get_property_from_name(exceptionClass, "StackTrace"); - MonoMethod* exceptionStackGetter = mono_property_get_get_method(exceptionStackProp); - MonoString* exceptionStackTrace = (MonoString*)mono_runtime_invoke(exceptionStackGetter, exception, nullptr, nullptr); - StackTrace = MUtils::ToString(exceptionStackTrace); - - MonoProperty* innerExceptionProp = mono_class_get_property_from_name(exceptionClass, "InnerException"); - MonoMethod* innerExceptionGetter = mono_property_get_get_method(innerExceptionProp); - MonoObject* innerException = (MonoObject*)mono_runtime_invoke(innerExceptionGetter, exception, nullptr, nullptr); - if (innerException) - InnerException = New(innerException); -#endif -} - -MException::~MException() -{ - if (InnerException) - Delete(InnerException); -} diff --git a/Source/Engine/Scripting/ManagedCLR/MAssembly.cpp b/Source/Engine/Scripting/ManagedCLR/MAssembly.cpp deleted file mode 100644 index b714ed349..000000000 --- a/Source/Engine/Scripting/ManagedCLR/MAssembly.cpp +++ /dev/null @@ -1,420 +0,0 @@ -// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. - -#include "MAssembly.h" -#include "MClass.h" -#include "MDomain.h" -#include "MUtils.h" -#include "Engine/Core/Log.h" -#include "Engine/Core/Types/TimeSpan.h" -#include "Engine/Platform/FileSystem.h" -#include "Engine/Debug/Exceptions/InvalidOperationException.h" -#include "Engine/Debug/Exceptions/FileNotFoundException.h" -#include "Engine/Debug/Exceptions/CLRInnerException.h" -#include "Engine/Scripting/ManagedCLR/MCore.h" -#include "Engine/Scripting/Scripting.h" -#include "Engine/Platform/StringUtils.h" -#include "Engine/Platform/File.h" -#include "Engine/Profiler/ProfilerCPU.h" -#include "Engine/Threading/Threading.h" -#if USE_MONO -#include -#include -#include -#endif - -MAssembly::MAssembly(MDomain* domain, const StringAnsiView& name, const MAssemblyOptions& options) - : _domain(domain) - , _isLoaded(false) - , _isLoading(false) - , _isDependency(false) - , _isFileLocked(false) - , _hasCachedClasses(false) - , _reloadCount(0) - , _name(name) - , _options(options) -{ -} - -MAssembly::~MAssembly() -{ - Unload(); -} - -String MAssembly::ToString() const -{ - return _name.ToString(); -} - -bool MAssembly::Load(const String& assemblyPath) -{ - if (IsLoaded()) - return false; - PROFILE_CPU(); - ZoneText(*assemblyPath, assemblyPath.Length()); - - // Check file path - if (!FileSystem::FileExists(assemblyPath)) - { - Log::FileNotFoundException ex(assemblyPath); - return true; - } - - // Start - const auto startTime = DateTime::NowUTC(); - OnLoading(); - - // Load - bool failed; - if (_options.KeepManagedFileLocked) - failed = LoadDefault(assemblyPath); - else - failed = LoadWithImage(assemblyPath); - if (failed) - { - OnLoadFailed(); - return true; - } - - // End - OnLoaded(startTime); - return false; -} - -#if USE_MONO - -bool MAssembly::Load(MonoImage* monoImage) -{ - if (IsLoaded()) - return false; - PROFILE_CPU(); -#if TRACY_ENABLE - const StringAnsiView monoImageName(mono_image_get_name(monoImage)); - ZoneText(*monoImageName, monoImageName.Length()); -#endif - - // Ensure to be unloaded - Unload(); - - // Start - const auto startTime = DateTime::NowUTC(); - OnLoading(); - - // Load - _monoAssembly = mono_image_get_assembly(monoImage); - if (_monoAssembly == nullptr) - { - OnLoadFailed(); - return true; - } - _monoImage = monoImage; - _isDependency = true; - _hasCachedClasses = false; - - // End - OnLoaded(startTime); - return false; -} - -#endif - -void MAssembly::Unload(bool isReloading) -{ - if (!IsLoaded()) - return; - PROFILE_CPU(); - - Unloading(this); - - // Close runtime -#if USE_MONO - if (_monoImage) - { - if (isReloading) - { - LOG(Info, "Unloading managed assembly \'{0}\' (is reloading)", String(_name)); - - mono_assembly_close(_monoAssembly); - } - else - { - // NOTE: do not try to close all the opened images - // that will cause the domain unload to crash because - // the images have already been closed (double free) - } - - _monoAssembly = nullptr; - _monoImage = nullptr; - } -#endif - - // Cleanup - _debugData.Resize(0); - _assemblyPath.Clear(); - _isFileLocked = false; - _isDependency = false; - _isLoading = false; - _isLoaded = false; - _hasCachedClasses = false; - _classes.ClearDelete(); - - Unloaded(this); -} - -MClass* MAssembly::GetClass(const StringAnsiView& fullname) const -{ - // Check state - if (!IsLoaded()) - { - Log::InvalidOperationException(TEXT("MAssembly was not yet loaded or loading was in progress")); - return nullptr; - } - - StringAnsiView key(fullname); - - // Special case for reference - if (fullname[fullname.Length() - 1] == '&') - key = StringAnsiView(key.Get(), key.Length() - 1); - - // Find class by name - const auto& classes = GetClasses(); - MClass* result = nullptr; - classes.TryGet(key, result); - -#if 0 - if (!result) - { - LOG(Warning, "Failed to find class {0} in assembly {1}. Classes:", String(fullname), ToString()); - for (auto i = classes.Begin(); i.IsNotEnd(); ++i) - { - LOG(Warning, " - {0}", String(i->Key)); - } - } -#endif - return result; -} - -#if USE_MONO - -MClass* MAssembly::GetClass(MonoClass* monoClass) const -{ - if (monoClass == nullptr || !IsLoaded() || mono_class_get_image(monoClass) != _monoImage) - return nullptr; - - // Find class by native pointer - const auto& classes = GetClasses(); - const auto typeToken = mono_class_get_type_token(monoClass); - for (auto i = classes.Begin(); i.IsNotEnd(); ++i) - { - MonoClass* e = i->Value->GetNative(); - if (e == monoClass || mono_class_get_type_token(e) == typeToken) - { - return i->Value; - } - } - -#if 0 - { - LOG(Warning, "Failed to find class {0}.{1} in assembly {2}. Classes:", String(mono_class_get_namespace(monoClass)), String(mono_class_get_name(monoClass)), ToString()); - for (auto i = classes.Begin(); i.IsNotEnd(); ++i) - { - LOG(Warning, " - {0}", String(i->Key)); - } - } -#endif - return nullptr; -} - -MonoReflectionAssembly* MAssembly::GetNative() const -{ - if (!_monoAssembly) - return nullptr; - return mono_assembly_get_object(mono_domain_get(), _monoAssembly); -} - -#endif - -const MAssembly::ClassesDictionary& MAssembly::GetClasses() const -{ - if (_hasCachedClasses || !IsLoaded()) - return _classes; - PROFILE_CPU(); - const auto startTime = DateTime::NowUTC(); - -#if USE_MONO -#if TRACY_ENABLE - const StringAnsiView monoImageName(mono_image_get_name(_monoImage)); - ZoneText(*monoImageName, monoImageName.Length()); -#endif - ScopeLock lock(_locker); - if (_hasCachedClasses) - return _classes; - ASSERT(_classes.IsEmpty()); - const int32 numRows = mono_image_get_table_rows(_monoImage, MONO_TABLE_TYPEDEF); - _classes.EnsureCapacity(numRows * 4); - for (int32 i = 1; i < numRows; i++) // Skip class - { - MonoClass* klass = mono_class_get(_monoImage, (i + 1) | MONO_TOKEN_TYPE_DEF); - - // Peek the typename - MString fullname; - MUtils::GetClassFullname(klass, fullname); - - // Create class object - auto mclass = New(this, klass, fullname); - _classes.Add(fullname, mclass); - } -#endif - - const auto endTime = DateTime::NowUTC(); - LOG(Info, "Caching classes for assembly {0} took {1}ms", String(_name), (int32)(endTime - startTime).GetTotalMilliseconds()); - -#if 0 - for (auto i = _classes.Begin(); i.IsNotEnd(); ++i) - LOG(Info, "Class: {0}", String(i->Value->GetFullName())); -#endif - - _hasCachedClasses = true; - return _classes; -} - -bool MAssembly::LoadDefault(const String& assemblyPath) -{ -#if USE_MONO - // With this method of loading we need to make sure, we won't try to load assembly again if its loaded somewhere. - auto assembly = mono_domain_assembly_open(_domain->GetNative(), assemblyPath.ToStringAnsi().Get()); - if (!assembly) - { - return true; - } - auto assemblyImage = mono_assembly_get_image(assembly); - if (!assembly) - { - mono_assembly_close(assembly); - return true; - } - _monoAssembly = assembly; - _monoImage = assemblyImage; -#endif - - // Set state - _isDependency = false; - _hasCachedClasses = false; - _isFileLocked = true; - _assemblyPath = assemblyPath; - - // Register in domain - _domain->_assemblies[_name] = this; - - return false; -} - -bool MAssembly::LoadWithImage(const String& assemblyPath) -{ - // Lock file only for loading operation - _isFileLocked = true; - - // Load assembly file data - Array data; - File::ReadAllBytes(assemblyPath, data); - -#if USE_MONO - // Init Mono image - MonoImageOpenStatus status; - const auto name = assemblyPath.ToStringAnsi(); - const auto assemblyImage = mono_image_open_from_data_with_name(reinterpret_cast(data.Get()), data.Count(), true, &status, false, name.Get()); - if (status != MONO_IMAGE_OK || assemblyImage == nullptr) - { - Log::CLRInnerException(TEXT("Mono assembly image is invalid at ") + assemblyPath); - return true; - } - - // Setup assembly - const auto assembly = mono_assembly_load_from_full(assemblyImage, name.Substring(0, name.Length() - 3).Get(), &status, false); - mono_image_close(assemblyImage); - if (status != MONO_IMAGE_OK || assembly == nullptr) - { - Log::CLRInnerException(TEXT("Mono assembly image is corrupted at ") + assemblyPath); - return true; - } - -#if MONO_DEBUG_ENABLE - // Try to load debug symbols (use portable PDB format) - const auto pdbPath = String(StringUtils::GetPathWithoutExtension(assemblyPath)) + TEXT(".pdb"); - if (FileSystem::FileExists(pdbPath)) - { - // Load .pdb file - File::ReadAllBytes(pdbPath, _debugData); - - // Attach debugging symbols to image - if (_debugData.HasItems()) - { - mono_debug_open_image_from_memory(assemblyImage, _debugData.Get(), _debugData.Count()); - } - } - - // TODO: load pdbs for custom third-party libs referenced by game assemblies for debugging -#if 0 - // Hack to load debug information for Newtonsoft.Json (enable it to debug C# code of json lib) - if (assemblyPath.EndsWith(TEXT("FlaxEngine.CSharp.dll"))) - { - static Array NewtonsoftJsonDebugData; - File::ReadAllBytes(String(StringUtils::GetDirectoryName(assemblyPath)) / TEXT("Newtonsoft.Json.pdb"), NewtonsoftJsonDebugData); - if (NewtonsoftJsonDebugData.HasItems()) - { - StringAnsi tmp(String(StringUtils::GetDirectoryName(assemblyPath)) / TEXT("Newtonsoft.Json.dll")); - MonoAssembly* a = mono_assembly_open(tmp.Get(), &status); - if (a) - { - mono_debug_open_image_from_memory(mono_assembly_get_image(a), NewtonsoftJsonDebugData.Get(), NewtonsoftJsonDebugData.Count()); - } - } - } -#endif -#endif - _monoAssembly = assembly; - _monoImage = assemblyImage; -#endif - - // Set state - _isDependency = false; - _hasCachedClasses = false; - _isFileLocked = false; - _assemblyPath = assemblyPath; - - return false; -} - -void MAssembly::OnLoading() -{ - Loading(this); - - _isLoading = true; - - // Pick a domain - if (_domain == nullptr) - _domain = MCore::GetActiveDomain(); -} - -void MAssembly::OnLoaded(const DateTime& startTime) -{ - // Register in domain - _domain->_assemblies[_name] = this; - - _isLoaded = true; - _isLoading = false; - - if (_options.PreCacheOnLoad) - GetClasses(); - - const auto endTime = DateTime::NowUTC(); - LOG(Info, "Assembly {0} loaded in {1}ms", String(_name), (int32)(endTime - startTime).GetTotalMilliseconds()); - - Loaded(this); -} - -void MAssembly::OnLoadFailed() -{ - _isLoading = false; - - LoadFailed(this); -} diff --git a/Source/Engine/Scripting/ManagedCLR/MAssembly.h b/Source/Engine/Scripting/ManagedCLR/MAssembly.h index 4f0a8d57f..e0952f9f6 100644 --- a/Source/Engine/Scripting/ManagedCLR/MAssembly.h +++ b/Source/Engine/Scripting/ManagedCLR/MAssembly.h @@ -3,7 +3,6 @@ #pragma once #include "MTypes.h" -#include "MAssemblyOptions.h" #include "Engine/Core/Delegate.h" #include "Engine/Core/Types/String.h" #include "Engine/Core/Collections/Array.h" @@ -16,44 +15,41 @@ class FLAXENGINE_API MAssembly { friend MDomain; -public: + friend Scripting; - typedef Dictionary ClassesDictionary; +public: + typedef Dictionary ClassesDictionary; private: - #if USE_MONO MonoAssembly* _monoAssembly = nullptr; MonoImage* _monoImage = nullptr; +#elif USE_NETCORE + StringAnsi _fullname; + void* _handle = nullptr; #endif MDomain* _domain; int32 _isLoaded : 1; int32 _isLoading : 1; - int32 _isDependency : 1; - int32 _isFileLocked : 1; mutable int32 _hasCachedClasses : 1; mutable ClassesDictionary _classes; CriticalSection _locker; int32 _reloadCount; - MString _name; + StringAnsi _name; String _assemblyPath; Array _debugData; - const MAssemblyOptions _options; - public: - /// /// Initializes a new instance of the class. /// /// The assembly domain. /// The assembly name. - /// The assembly options. - MAssembly(MDomain* domain, const StringAnsiView& name, const MAssemblyOptions& options); + MAssembly(MDomain* domain, const StringAnsiView& name); /// /// Finalizes an instance of the class. @@ -61,7 +57,6 @@ public: ~MAssembly(); public: - /// /// Managed assembly actions delegate type. /// @@ -93,7 +88,6 @@ public: AssemblyDelegate Unloaded; public: - /// /// Returns true if assembly is during loading state. /// @@ -113,7 +107,7 @@ public: /// /// Gets the assembly name. /// - FORCE_INLINE const MString& GetName() const + FORCE_INLINE const StringAnsi& GetName() const { return _name; } @@ -143,39 +137,30 @@ public: } #if USE_MONO - /// - /// Gets the Mono assembly. - /// FORCE_INLINE MonoAssembly* GetMonoAssembly() const { return _monoAssembly; } - /// - /// Gets the Mono image. - /// FORCE_INLINE MonoImage* GetMonoImage() const { return _monoImage; } +#elif USE_NETCORE + FORCE_INLINE void* GetHandle() const + { + return _handle; + } #endif - /// - /// Gets the options that assembly was created with. - /// - FORCE_INLINE const MAssemblyOptions& GetOptions() const - { - return _options; - } - public: - /// /// Loads assembly for domain. /// /// The assembly path. + /// The optional path to the native code assembly (eg. if C# assembly contains bindings). /// True if cannot load, otherwise false - bool Load(const String& assemblyPath); + bool Load(const String& assemblyPath, const StringView& nativePath = StringView::Empty); #if USE_MONO /// @@ -193,7 +178,6 @@ public: void Unload(bool isReloading = false); public: - /// /// Attempts to find a managed class with the specified namespace and name in this assembly. Returns null if one cannot be found. /// @@ -212,31 +196,20 @@ public: /// /// Gets the native of the assembly (for the current domain). Can be used to pass to the scripting backend as a parameter. /// - /// The native assembly object. MonoReflectionAssembly* GetNative() const; #endif /// /// Gets the classes lookup cache. Performs full initialization if not cached. The result cache contains all classes from the assembly. /// - /// The cache. const ClassesDictionary& GetClasses() const; private: - - /// - /// Loads the assembly for domain. - /// - /// True if failed, otherwise false. - bool LoadDefault(const String& assemblyPath); - - /// - /// Loads the assembly for domain from non-blocking image. - /// - /// True if failed, otherwise false. - bool LoadWithImage(const String& assemblyPath); - + bool LoadCorlib(); + bool LoadImage(const String& assemblyPath, const StringView& nativePath); + bool UnloadImage(bool isReloading); void OnLoading(); void OnLoaded(const struct DateTime& startTime); void OnLoadFailed(); + bool ResolveMissingFile(String& assemblyPath) const; }; diff --git a/Source/Engine/Scripting/ManagedCLR/MAssemblyOptions.h b/Source/Engine/Scripting/ManagedCLR/MAssemblyOptions.h deleted file mode 100644 index b5fe04d2c..000000000 --- a/Source/Engine/Scripting/ManagedCLR/MAssemblyOptions.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. - -#pragma once - -#include "Engine/Core/Types/BaseTypes.h" - -/// -/// The options for creation of the managed assembly. -/// -struct MAssemblyOptions -{ - /// - /// Should assembly cache classes on Load method. - /// - int32 PreCacheOnLoad : 1; - - /// - /// Locks DLL/exe file with managed code. - /// - int32 KeepManagedFileLocked : 1; - - /// - /// Initializes a new instance of the struct. - /// - /// if set to true to precache assembly metadata on load. - /// if set to true keep managed file locked after load. - MAssemblyOptions(bool preCacheOnLoad = true, bool keepManagedFileLocked = false) - : PreCacheOnLoad(preCacheOnLoad) - , KeepManagedFileLocked(keepManagedFileLocked) - { - } -}; diff --git a/Source/Engine/Scripting/ManagedCLR/MClass.cpp b/Source/Engine/Scripting/ManagedCLR/MClass.cpp deleted file mode 100644 index 35ef42680..000000000 --- a/Source/Engine/Scripting/ManagedCLR/MClass.cpp +++ /dev/null @@ -1,434 +0,0 @@ -// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. - -#include "MClass.h" -#include "MType.h" -#include "MTypes.h" -#include "MField.h" -#include "MProperty.h" -#include "MMethod.h" -#include "MEvent.h" -#include "Engine/Scripting/Scripting.h" -#include "Engine/Core/Log.h" -#if USE_MONO -#include -#include -#define GET_CUSTOM_ATTR() (MonoCustomAttrInfo*)(_attrInfo ? _attrInfo : _attrInfo = mono_custom_attrs_from_class(_monoClass)) -#endif - -#if USE_MONO -MClass::MClass(const MAssembly* parentAssembly, MonoClass* monoClass, const MString& fullname) - : _assembly(parentAssembly) - , _fullname(fullname) - , _visibility(MVisibility::Private) - , _hasCachedProperties(false) - , _hasCachedFields(false) - , _hasCachedMethods(false) - , _hasCachedAttributes(false) - , _hasCachedEvents(false) - , _isStatic(false) - , _isSealed(false) - , _isAbstract(false) - , _isInterface(false) -{ - _monoClass = monoClass; - ASSERT(monoClass); - - const uint32_t flags = mono_class_get_flags(monoClass); - - switch (flags & MONO_TYPE_ATTR_VISIBILITY_MASK) - { - case MONO_TYPE_ATTR_NOT_PUBLIC: - case MONO_TYPE_ATTR_NESTED_PRIVATE: - _visibility = MVisibility::Private; - break; - case MONO_TYPE_ATTR_PUBLIC: - case MONO_TYPE_ATTR_NESTED_PUBLIC: - _visibility = MVisibility::Public; - break; - case MONO_TYPE_ATTR_NESTED_FAMILY: - case MONO_TYPE_ATTR_NESTED_ASSEMBLY: - _visibility = MVisibility::Internal; - break; - case MONO_TYPE_ATTR_NESTED_FAM_OR_ASSEM: - _visibility = MVisibility::ProtectedInternal; - break; - case MONO_TYPE_ATTR_NESTED_FAM_AND_ASSEM: - _visibility = MVisibility::PrivateProtected; - break; - default: - CRASH; - } - - const uint32_t staticClassFlags = MONO_TYPE_ATTR_ABSTRACT | MONO_TYPE_ATTR_SEALED; - _isStatic = (flags & staticClassFlags) == staticClassFlags; - _isSealed = !_isStatic && (flags & MONO_TYPE_ATTR_SEALED) == MONO_TYPE_ATTR_SEALED; - _isAbstract = !_isStatic && (flags & MONO_TYPE_ATTR_ABSTRACT) == MONO_TYPE_ATTR_ABSTRACT; - _isInterface = (flags & MONO_TYPE_ATTR_CLASS_SEMANTIC_MASK) == MONO_TYPE_ATTR_INTERFACE; -} -#endif - -MClass::~MClass() -{ -#if !COMPILE_WITHOUT_CSHARP -#if USE_MONO - if (_attrInfo) - mono_custom_attrs_free((MonoCustomAttrInfo*)_attrInfo); -#endif - _fields.ClearDelete(); - _properties.ClearDelete(); - _methods.ClearDelete(); - _attributes.ClearDelete(); - _events.ClearDelete(); -#endif -} - -bool MClass::IsGeneric() const -{ - return _fullname.FindLast('`') != -1; -} - -MType MClass::GetType() const -{ -#if USE_MONO - return MType(mono_class_get_type(_monoClass)); -#else - return MType(); -#endif -} - -MClass* MClass::GetBaseClass() const -{ -#if USE_MONO - MonoClass* monoBase = mono_class_get_parent(_monoClass); - if (monoBase == nullptr) - return nullptr; - return Scripting::FindClass(monoBase); -#else - return nullptr; -#endif -} - -bool MClass::IsSubClassOf(const MClass* klass) const -{ -#if USE_MONO - return klass && mono_class_is_subclass_of(_monoClass, klass->GetNative(), false) != 0; -#else - return false; -#endif -} - -#if USE_MONO -bool MClass::IsSubClassOf(const MonoClass* monoClass) const -{ - return monoClass && mono_class_is_subclass_of(_monoClass, (MonoClass*)monoClass, true) != 0; -} -#endif - -bool MClass::HasInterface(const MClass* klass) const -{ -#if USE_MONO - return klass && mono_class_is_assignable_from(klass->GetNative(), _monoClass) != 0; -#else - return false; -#endif -} - -bool MClass::IsInstanceOfType(MObject* object) const -{ - if (object == nullptr) - return false; -#if USE_MONO - MonoClass* monoClass = mono_object_get_class(object); - return mono_class_is_subclass_of(monoClass, _monoClass, false) != 0; -#else - return false; -#endif -} - -uint32 MClass::GetInstanceSize() const -{ -#if USE_MONO - uint32 dummy = 0; - if (mono_class_is_valuetype(_monoClass)) - return mono_class_value_size(_monoClass, &dummy); - return mono_class_instance_size(_monoClass); -#else - return 0; -#endif -} - -MMethod* MClass::FindMethod(const char* name, int32 numParams, bool checkBaseClasses) -{ - auto method = GetMethod(name, numParams); - if (!method && checkBaseClasses) - { - auto base = GetBaseClass(); - if (base) - method = base->FindMethod(name, numParams, true); - } - return method; -} - -MMethod* MClass::GetMethod(const char* name, int32 numParams) -{ - // Lookup for cached method - for (int32 i = 0; i < _methods.Count(); i++) - { - if (_methods[i]->GetName() == name && _methods[i]->GetParametersCount() == numParams) - return _methods[i]; - } - -#if USE_MONO - // Find Mono method - MonoMethod* monoMethod = mono_class_get_method_from_name(_monoClass, name, numParams); - if (monoMethod == nullptr) - return nullptr; - - // Create method - auto method = New(monoMethod, name, this); - _methods.Add(method); - return method; -#else - return nullptr; -#endif -} - -const Array& MClass::GetMethods() -{ - if (_hasCachedMethods) - return _methods; - -#if USE_MONO - void* iter = nullptr; - MonoMethod* curClassMethod; - while ((curClassMethod = mono_class_get_methods(_monoClass, &iter))) - { - // Check if has not been added - bool isMissing = true; - for (int32 i = 0; i < _methods.Count(); i++) - { - if (_methods[i]->GetNative() == curClassMethod) - { - isMissing = false; - break; - } - } - - if (isMissing) - { - // Create method - auto method = New(curClassMethod, this); - _methods.Add(method); - } - } -#endif - - _hasCachedMethods = true; - return _methods; -} - -MField* MClass::GetField(const char* name) -{ - // Lookup for cached field - for (int32 i = 0; i < _fields.Count(); i++) - { - if (_fields[i]->GetName() == name) - return _fields[i]; - } - -#if USE_MONO - // Find mono field - MonoClassField* field = mono_class_get_field_from_name(_monoClass, name); - if (field == nullptr) - return nullptr; - - // Create field - auto mfield = New(field, name, this); - _fields.Add(mfield); - return mfield; -#else - return nullptr; -#endif -} - -const Array& MClass::GetFields() -{ - if (_hasCachedFields) - return _fields; - -#if USE_MONO - void* iter = nullptr; - MonoClassField* curClassField; - while ((curClassField = mono_class_get_fields(_monoClass, &iter))) - { - const char* fieldName = mono_field_get_name(curClassField); - GetField(fieldName); - } -#endif - - _hasCachedFields = true; - return _fields; -} - -MEvent* MClass::GetEvent(const char* name) -{ - GetEvents(); - for (int32 i = 0; i < _events.Count(); i++) - { - if (_events[i]->GetName() == name) - return _events[i]; - } - return nullptr; -} - -const Array& MClass::GetEvents() -{ - if (_hasCachedEvents) - return _events; - -#if USE_MONO - void* iter = nullptr; - MonoEvent* curEvent; - while ((curEvent = mono_class_get_events(_monoClass, &iter))) - { - const char* name = mono_event_get_name(curEvent); - bool missing = true; - for (int32 i = 0; i < _events.Count(); i++) - { - if (_events[i]->GetName() == name) - { - missing = false; - break; - } - } - if (missing) - { - auto result = New(curEvent, name, this); - _events.Add(result); - } - } -#endif - - _hasCachedEvents = true; - return _events; -} - -MProperty* MClass::GetProperty(const char* name) -{ - // Lookup for cached property - for (int32 i = 0; i < _properties.Count(); i++) - { - if (_properties[i]->GetName() == name) - return _properties[i]; - } - -#if USE_MONO - // Find mono property - MonoProperty* monoProperty = mono_class_get_property_from_name(_monoClass, name); - if (monoProperty == nullptr) - return nullptr; - - // Create method - auto mproperty = New(monoProperty, name, this); - _properties.Add(mproperty); - - return mproperty; -#else - return nullptr; -#endif -} - -const Array& MClass::GetProperties() -{ - if (_hasCachedProperties) - return _properties; - -#if USE_MONO - void* iter = nullptr; - MonoProperty* curClassProperty; - while ((curClassProperty = mono_class_get_properties(_monoClass, &iter))) - { - const char* propertyName = mono_property_get_name(curClassProperty); - GetProperty(propertyName); - } -#endif - - _hasCachedProperties = true; - return _properties; -} - -MObject* MClass::CreateInstance() const -{ -#if USE_MONO - MonoObject* obj = mono_object_new(mono_domain_get(), _monoClass); - if (!mono_class_is_valuetype(_monoClass)) - mono_runtime_object_init(obj); - return obj; -#else - return nullptr; -#endif -} - -MObject* MClass::CreateInstance(void** params, uint32 numParams) -{ -#if USE_MONO - MonoObject* obj = mono_object_new(mono_domain_get(), _monoClass); - const auto constructor = GetMethod(".ctor", numParams); - ASSERT(constructor); - constructor->Invoke(obj, params, nullptr); - return obj; -#else - return nullptr; -#endif -} - -bool MClass::HasAttribute(const MClass* monoClass) const -{ -#if USE_MONO - MonoCustomAttrInfo* attrInfo = GET_CUSTOM_ATTR(); - return attrInfo != nullptr && mono_custom_attrs_has_attr(attrInfo, monoClass->GetNative()) != 0; -#else - return false; -#endif -} - -bool MClass::HasAttribute() const -{ -#if USE_MONO - MonoCustomAttrInfo* attrInfo = GET_CUSTOM_ATTR(); - return attrInfo && attrInfo->num_attrs > 0; -#else - return false; -#endif -} - -MObject* MClass::GetAttribute(const MClass* monoClass) const -{ -#if USE_MONO - MonoCustomAttrInfo* attrInfo = GET_CUSTOM_ATTR(); - return attrInfo ? mono_custom_attrs_get_attr(attrInfo, monoClass->GetNative()) : nullptr; -#else - return nullptr; -#endif -} - -const Array& MClass::GetAttributes() -{ - if (_hasCachedAttributes) - return _attributes; - - _hasCachedAttributes = true; -#if USE_MONO - MonoCustomAttrInfo* attrInfo = GET_CUSTOM_ATTR(); - if (attrInfo == nullptr) - return _attributes; - - MonoArray* monoAttributesArray = mono_custom_attrs_construct(attrInfo); - const auto length = (uint32)mono_array_length(monoAttributesArray); - _attributes.Resize(length); - for (uint32 i = 0; i < length; i++) - _attributes[i] = mono_array_get(monoAttributesArray, MonoObject *, i); - mono_custom_attrs_free(attrInfo); -#endif - return _attributes; -} diff --git a/Source/Engine/Scripting/ManagedCLR/MClass.h b/Source/Engine/Scripting/ManagedCLR/MClass.h index b275081ad..49b153731 100644 --- a/Source/Engine/Scripting/ManagedCLR/MClass.h +++ b/Source/Engine/Scripting/ManagedCLR/MClass.h @@ -10,44 +10,49 @@ /// class FLAXENGINE_API MClass { + friend MCore; private: - #if USE_MONO MonoClass* _monoClass; mutable void* _attrInfo = nullptr; +#elif USE_NETCORE + void* _handle; + StringAnsi _name; + StringAnsi _namespace_; + uint32 _types = 0; + mutable uint32 _size = 0; #endif const MAssembly* _assembly; - MString _fullname; + StringAnsi _fullname; - Array _methods; - Array _fields; - Array _properties; - Array _attributes; - Array _events; + mutable Array _methods; + mutable Array _fields; + mutable Array _properties; + mutable Array _attributes; + mutable Array _events; + mutable Array _interfaces; MVisibility _visibility; - int32 _hasCachedProperties : 1; - int32 _hasCachedFields : 1; - int32 _hasCachedMethods : 1; - int32 _hasCachedAttributes : 1; - int32 _hasCachedEvents : 1; + mutable int32 _hasCachedProperties : 1; + mutable int32 _hasCachedFields : 1; + mutable int32 _hasCachedMethods : 1; + mutable int32 _hasCachedAttributes : 1; + mutable int32 _hasCachedEvents : 1; + mutable int32 _hasCachedInterfaces : 1; int32 _isStatic : 1; int32 _isSealed : 1; int32 _isAbstract : 1; int32 _isInterface : 1; + int32 _isValueType : 1; + int32 _isEnum : 1; public: - #if USE_MONO - /// - /// Initializes a new instance of the class. - /// - /// The parent assembly. - /// The Mono class. - /// The fullname. - MClass(const MAssembly* parentAssembly, MonoClass* monoClass, const MString& fullname); + MClass(const MAssembly* parentAssembly, MonoClass* monoClass, const StringAnsi& fullname); +#elif USE_NETCORE + MClass(const MAssembly* parentAssembly, void* handle, const char* name, const char* fullname, const char* namespace_, MTypeAttributes typeAttributes); #endif /// @@ -56,7 +61,6 @@ public: ~MClass(); public: - /// /// Gets the parent assembly. /// @@ -68,11 +72,21 @@ public: /// /// Gets the full name of the class (namespace and typename). /// - FORCE_INLINE const MString& GetFullName() const + FORCE_INLINE const StringAnsi& GetFullName() const { return _fullname; } + /// + /// Gets the name of the class. + /// + StringAnsiView GetName() const; + + /// + /// Gets the namespace of the class. + /// + StringAnsiView GetNamespace() const; + #if USE_MONO /// /// Gets the Mono class handle. @@ -81,6 +95,11 @@ public: { return _monoClass; } +#elif USE_NETCORE + FORCE_INLINE void* GetNative() const + { + return _handle; + } #endif /// @@ -123,15 +142,34 @@ public: return _isInterface != 0; } + /// + /// Gets if class is value type (eg. enum or structure) but not reference type (eg. class, string, array, interface) + /// + FORCE_INLINE bool IsValueType() const + { + return _isValueType != 0; + } + + /// + /// Gets if class is enumeration + /// + FORCE_INLINE bool IsEnum() const + { + return _isEnum != 0; + } + /// /// Gets if class is generic /// - bool IsGeneric() const; + bool IsGeneric() const + { + return _fullname.FindLast('`') != -1; + } /// /// Gets the class type. /// - MType GetType() const; + MType* GetType() const; /// /// Returns the base class of this class. Null if this class has no base. @@ -142,17 +180,9 @@ public: /// Checks if this class is a sub class of the specified class (including any derived types). /// /// The class. + /// True if check interfaces, otherwise just base class. /// True if this class is a sub class of the specified class. - bool IsSubClassOf(const MClass* klass) const; - -#if USE_MONO - /// - /// Checks if this class is a sub class of the specified class (including any derived types). - /// - /// The Mono class. - /// True if this class is a sub class of the specified class. - bool IsSubClassOf(const MonoClass* monoClass) const; -#endif + bool IsSubClassOf(const MClass* klass, bool checkInterfaces = false) const; /// /// Checks if this class implements the specified interface (including any base types). @@ -173,8 +203,12 @@ public: /// uint32 GetInstanceSize() const; -public: + /// + /// Returns the class of the array type elements. + /// + MClass* GetElementClass() const; +public: /// /// Returns an object referencing a method with the specified name and number of parameters. Optionally checks the base classes. /// @@ -182,7 +216,17 @@ public: /// The method parameters count. /// True if check base classes when searching for the given method. /// The method or null if failed to find it. - MMethod* FindMethod(const char* name, int32 numParams, bool checkBaseClasses); + MMethod* FindMethod(const char* name, int32 numParams, bool checkBaseClasses = true) const + { + MMethod* method = GetMethod(name, numParams); + if (!method && checkBaseClasses) + { + MClass* base = GetBaseClass(); + if (base) + method = base->FindMethod(name, numParams, true); + } + return method; + } /// /// Returns an object referencing a method with the specified name and number of parameters. @@ -191,88 +235,73 @@ public: /// The method name. /// The method parameters count. /// The method or null if failed to get it. - MMethod* GetMethod(const char* name, int32 numParams = 0); + MMethod* GetMethod(const char* name, int32 numParams = 0) const; /// /// Returns all methods belonging to this class. /// - /// - /// Be aware this will not include the methods of any base classes. - /// + /// Be aware this will not include the methods of any base classes. /// The list of methods. - const Array& GetMethods(); + const Array& GetMethods() const; /// /// Returns an object referencing a field with the specified name. /// - /// - /// Does not query base class fields. - /// Returns null if field cannot be found. - /// + /// Does not query base class fields. Returns null if field cannot be found. /// The field name. /// The field or null if failed. - MField* GetField(const char* name); + MField* GetField(const char* name) const; /// /// Returns all fields belonging to this class. /// - /// - /// Be aware this will not include the fields of any base classes. - /// + /// Be aware this will not include the fields of any base classes. /// The list of fields. - const Array& GetFields(); + const Array& GetFields() const; /// /// Returns an object referencing a event with the specified name. /// /// The event name. /// The event object. - MEvent* GetEvent(const char* name); + MEvent* GetEvent(const char* name) const; /// /// Returns all events belonging to this class. /// /// The list of events. - const Array& GetEvents(); + const Array& GetEvents() const; /// /// Returns an object referencing a property with the specified name. /// - /// - /// Does not query base class properties. - /// Returns null if property cannot be found. - /// + /// Does not query base class properties. Returns null if property cannot be found. /// The property name. /// The property. - MProperty* GetProperty(const char* name); + MProperty* GetProperty(const char* name) const; /// /// Returns all properties belonging to this class. /// - /// - /// Be aware this will not include the properties of any base classes. - /// + /// Be aware this will not include the properties of any base classes. /// The list of properties. - const Array& GetProperties(); + const Array& GetProperties() const; + + /// + /// Returns all interfaces implemented by this class (excluding interfaces from base classes). + /// + /// Be aware this will not include the interfaces of any base classes. + /// The list of interfaces. + const Array& GetInterfaces() const; public: - /// /// Creates a new instance of this class and constructs it. /// /// The created managed object. MObject* CreateInstance() const; - /// - /// Creates a new instance of this class and then constructs it using the constructor with the specified number of parameters. - /// - /// The array containing pointers to constructor parameters. Array length must be equal to number of parameters. - /// The number of parameters the constructor accepts. - /// The created managed object. - MObject* CreateInstance(void** params, uint32 numParams); - public: - /// /// Checks if class has an attribute of the specified type. /// @@ -297,5 +326,5 @@ public: /// Returns an instance of all attributes connected with given class. Returns null if the class doesn't have any attributes. /// /// The array of attribute objects. - const Array& GetAttributes(); + const Array& GetAttributes() const; }; diff --git a/Source/Engine/Scripting/ManagedCLR/MCore.cpp b/Source/Engine/Scripting/ManagedCLR/MCore.cpp index a3f79ff51..86b906f81 100644 --- a/Source/Engine/Scripting/ManagedCLR/MCore.cpp +++ b/Source/Engine/Scripting/ManagedCLR/MCore.cpp @@ -1,44 +1,268 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #include "MCore.h" +#include "MAssembly.h" +#include "MClass.h" +#include "MEvent.h" #include "MDomain.h" -#include "Engine/Core/Log.h" -#include "Engine/Core/Types/String.h" +#include "MException.h" +#include "MMethod.h" +#include "MProperty.h" +#include "Engine/Core/Math/Math.h" #include "Engine/Core/Types/DateTime.h" -#include "Engine/Engine/CommandLine.h" -#include "Engine/Engine/Globals.h" -#include "Engine/Debug/Exceptions/Exceptions.h" -#include "Engine/Threading/Threading.h" -#include "Engine/Platform/Thread.h" -#include "Engine/Scripting/MException.h" -#include "Engine/Profiler/ProfilerCPU.h" -#if USE_MONO -#ifdef USE_MONO_AOT_MODULE #include "Engine/Core/Types/TimeSpan.h" -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if !USE_MONO_DYNAMIC_LIB -#include -#endif -#endif - -#ifdef USE_MONO_AOT_MODULE -void* MonoAotModuleHandle = nullptr; -#endif +#include "Engine/Platform/FileSystem.h" +#include "Engine/Profiler/ProfilerCPU.h" +#include "Engine/Debug/Exceptions/FileNotFoundException.h" +#include "Engine/Debug/Exceptions/InvalidOperationException.h" MDomain* MRootDomain = nullptr; MDomain* MActiveDomain = nullptr; -Array> MDomains; +Array> MDomains; + +MClass* MCore::TypeCache::Void = nullptr; +MClass* MCore::TypeCache::Object = nullptr; +MClass* MCore::TypeCache::Byte = nullptr; +MClass* MCore::TypeCache::Boolean = nullptr; +MClass* MCore::TypeCache::SByte = nullptr; +MClass* MCore::TypeCache::Char = nullptr; +MClass* MCore::TypeCache::Int16 = nullptr; +MClass* MCore::TypeCache::UInt16 = nullptr; +MClass* MCore::TypeCache::Int32 = nullptr; +MClass* MCore::TypeCache::UInt32 = nullptr; +MClass* MCore::TypeCache::Int64 = nullptr; +MClass* MCore::TypeCache::UInt64 = nullptr; +MClass* MCore::TypeCache::IntPtr = nullptr; +MClass* MCore::TypeCache::UIntPtr = nullptr; +MClass* MCore::TypeCache::Single = nullptr; +MClass* MCore::TypeCache::Double = nullptr; +MClass* MCore::TypeCache::String = nullptr; + +MAssembly::MAssembly(MDomain* domain, const StringAnsiView& name) + : _domain(domain) + , _isLoaded(false) + , _isLoading(false) + , _hasCachedClasses(false) + , _reloadCount(0) + , _name(name) +{ +} + +MAssembly::~MAssembly() +{ + Unload(); +} + +String MAssembly::ToString() const +{ + return _name.ToString(); +} + +bool MAssembly::Load(const String& assemblyPath, const StringView& nativePath) +{ + if (IsLoaded()) + return false; + PROFILE_CPU(); + ZoneText(*assemblyPath, assemblyPath.Length()); + + const String* pathPtr = &assemblyPath; + String path; + if (!FileSystem::FileExists(assemblyPath)) + { + path = assemblyPath; + pathPtr = &path; + if (ResolveMissingFile(path)) + { + Log::FileNotFoundException ex(assemblyPath); + return true; + } + } + + const auto startTime = DateTime::NowUTC(); + OnLoading(); + + if (LoadImage(*pathPtr, nativePath)) + { + OnLoadFailed(); + return true; + } + + OnLoaded(startTime); + return false; +} + +void MAssembly::Unload(bool isReloading) +{ + if (!IsLoaded()) + return; + PROFILE_CPU(); + + Unloading(this); + + // Close runtime + UnloadImage(isReloading); + + // Cleanup + _debugData.Resize(0); + _assemblyPath.Clear(); + _isLoading = false; + _isLoaded = false; + _hasCachedClasses = false; + _classes.ClearDelete(); + + Unloaded(this); +} + +MClass* MAssembly::GetClass(const StringAnsiView& fullname) const +{ + // Check state + if (!IsLoaded()) + { + Log::InvalidOperationException(TEXT("MAssembly was not yet loaded or loading was in progress")); + return nullptr; + } + + StringAnsiView key(fullname); + + // Special case for reference + if (fullname[fullname.Length() - 1] == '&') + key = StringAnsiView(key.Get(), key.Length() - 1); + + // Find class by name + const auto& classes = GetClasses(); + MClass* result = nullptr; + classes.TryGet(key, result); + +#if 0 + if (!result) + { + LOG(Warning, "Failed to find class {0} in assembly {1}. Classes:", String(fullname), ToString()); + for (auto i = classes.Begin(); i.IsNotEnd(); ++i) + { + LOG(Warning, " - {0}", String(i->Key)); + } + } +#endif + return result; +} + +void MAssembly::OnLoading() +{ + Loading(this); + + _isLoading = true; + + // Pick a domain + if (_domain == nullptr) + _domain = MCore::GetActiveDomain(); +} + +void MAssembly::OnLoaded(const DateTime& startTime) +{ + // Register in domain + _domain->_assemblies[_name] = this; + + _isLoaded = true; + _isLoading = false; + + const auto endTime = DateTime::NowUTC(); + LOG(Info, "Assembly {0} loaded in {1}ms", String(_name), (int32)(endTime - startTime).GetTotalMilliseconds()); + + // Pre-cache classes + GetClasses(); + + Loaded(this); +} + +void MAssembly::OnLoadFailed() +{ + _isLoading = false; + + LoadFailed(this); +} + +MEvent* MClass::GetEvent(const char* name) const +{ + GetEvents(); + for (int32 i = 0; i < _events.Count(); i++) + { + if (_events[i]->GetName() == name) + return _events[i]; + } + return nullptr; +} + +MObject* MClass::CreateInstance() const +{ + MObject* obj = MCore::Object::New(this); + if (!IsValueType()) + MCore::Object::Init(obj); + return obj; +} + +MType* MEvent::GetType() const +{ + if (GetAddMethod() != nullptr) + return GetAddMethod()->GetReturnType(); + if (GetRemoveMethod() != nullptr) + return GetRemoveMethod()->GetReturnType(); + return nullptr; +} + +void MException::Log(const LogType type, const Char* target) +{ + // Log inner exceptions chain + MException* inner = InnerException; + while (inner) + { + const Char* stackTrace = inner->StackTrace.HasChars() ? *inner->StackTrace : TEXT(""); + Log::Logger::Write(LogType::Warning, String::Format(TEXT("Inner exception. {0}\nStack strace:\n{1}\n"), inner->Message, stackTrace)); + inner = inner->InnerException; + } + + // Send stack trace only to log file + const Char* stackTrace = StackTrace.HasChars() ? *StackTrace : TEXT(""); + const String info = target && *target ? String::Format(TEXT("Exception has been thrown during {0}."), target) : TEXT("Exception has been thrown."); + Log::Logger::Write(LogType::Warning, String::Format(TEXT("{0} {1}\nStack strace:\n{2}"), info, Message, stackTrace)); + Log::Logger::Write(type, String::Format(TEXT("{0}\n{1}"), info, Message)); +} + +MType* MProperty::GetType() const +{ + if (GetGetMethod() != nullptr) + return GetGetMethod()->GetReturnType(); + return GetSetMethod()->GetReturnType(); +} + +MVisibility MProperty::GetVisibility() const +{ + if (GetGetMethod() && GetSetMethod()) + { + return static_cast( + Math::Max( + static_cast(GetGetMethod()->GetVisibility()), + static_cast(GetSetMethod()->GetVisibility()) + )); + } + if (GetGetMethod()) + { + return GetGetMethod()->GetVisibility(); + } + return GetSetMethod()->GetVisibility(); +} + +bool MProperty::IsStatic() const +{ + if (GetGetMethod()) + { + return GetGetMethod()->IsStatic(); + } + if (GetSetMethod()) + { + return GetSetMethod()->IsStatic(); + } + return false; +} MDomain* MCore::GetRootDomain() { @@ -49,2102 +273,3 @@ MDomain* MCore::GetActiveDomain() { return MActiveDomain; } - -MDomain* MCore::CreateDomain(const MString& domainName) -{ -#if USE_MONO_AOT - LOG(Fatal, "Scripts can run only in single domain mode with AOT mode enabled."); - return nullptr; -#endif - - for (int32 i = 0; i < MDomains.Count(); i++) - { - if (MDomains[i]->GetName() == domainName) - return MDomains[i]; - } - - auto domain = New(domainName); -#if USE_MONO - const auto monoDomain = mono_domain_create_appdomain((char*)domainName.Get(), nullptr); -#if MONO_DEBUG_ENABLE - mono_debug_domain_create(monoDomain); -#endif - ASSERT(monoDomain); - domain->_monoDomain = monoDomain; -#endif - MDomains.Add(domain); - return domain; -} - -void MCore::UnloadDomain(const MString& domainName) -{ - int32 i = 0; - for (; i < MDomains.Count(); i++) - { - if (MDomains[i]->GetName() == domainName) - break; - } - if (i == MDomains.Count()) - return; - - auto domain = MDomains[i]; -#if USE_MONO -#if MONO_DEBUG_ENABLE - //mono_debug_domain_unload(domain->GetNative()); -#endif - //mono_domain_finalize(domain->GetNative(), 2000); - MObject* exception = nullptr; - mono_domain_try_unload(domain->GetNative(), &exception); - if (exception) - { - MException ex(exception); - ex.Log(LogType::Fatal, TEXT("Scripting::Release")); - } -#endif - Delete(domain); - MDomains.RemoveAtKeepOrder(i); -} - -#if USE_MONO - -#if 0 - -void* MonoMalloc(size_t size) -{ - return malloc(size); -} - -void* MonoRealloc(void* mem, size_t count) -{ - return realloc(mem, count); -} - -void MonoFree(void* mem) -{ - return free(mem); -} - -void* MonoCalloc(size_t count, size_t size) -{ - return calloc(count, size); -} - -#endif - -#if USE_MONO_PROFILER - -#include "Engine/Core/Types/StringBuilder.h" - -struct FlaxMonoProfiler -{ -}; - -FlaxMonoProfiler Profiler; - -struct StackWalkDataResult -{ - StringBuilder Buffer; -}; - -mono_bool OnStackWalk(MonoMethod* method, int32_t native_offset, int32_t il_offset, mono_bool managed, void* data) -{ - auto result = (StackWalkDataResult*)data; - - if (method) - { - auto mName = mono_method_get_name(method); - auto mKlassNameSpace = mono_class_get_namespace(mono_method_get_class(method)); - auto mKlassName = mono_class_get_name(mono_method_get_class(method)); - result->Buffer.Append(mKlassNameSpace); - result->Buffer.Append(TEXT(".")); - result->Buffer.Append(mKlassName); - result->Buffer.Append(TEXT("::")); - result->Buffer.Append(mName); - result->Buffer.Append(TEXT("\n")); - } - else if (!managed) - { - result->Buffer.Append(TEXT("\n")); - } - - return 0; -} - -void OnGCAllocation(MonoProfiler* profiler, MonoObject* obj) -{ - // Get allocation info - auto klass = mono_object_get_class(obj); - //auto name_space = mono_class_get_namespace(klass); - //auto name = mono_class_get_name(klass); - auto size = mono_class_instance_size(klass); - - //LOG(Info, "GC new: {0}.{1} ({2} bytes)", name_space, name, size); - -#if 0 - if (ProfilerCPU::IsProfilingCurrentThread()) - { - static int details = 0; - if (details) - { - StackWalkDataResult stackTrace; - stackTrace.Buffer.SetCapacity(1024); - mono_stack_walk(&OnStackWalk, &stackTrace); - - const auto msg = String::Format(TEXT("GC new: {0}.{1} ({2} bytes). Stack Trace:\n{3}"), String(name_space), String(name), size, stackTrace.Buffer.ToStringView()); - Platform::Log(*msg); - //LOG_STR(Info, msg); - } - } -#endif - -#if COMPILE_WITH_PROFILER - // Register allocation during the current CPU event - auto thread = ProfilerCPU::GetCurrentThread(); - if (thread != nullptr && thread->Buffer.GetCount() != 0) - { - auto& activeEvent = thread->Buffer.Last().Event(); - if (activeEvent.End < ZeroTolerance) - { - activeEvent.ManagedMemoryAllocation += size; - } - } -#endif -} - -void OnGCEvent(MonoProfiler* profiler, MonoProfilerGCEvent event, uint32_t generation, mono_bool is_serial) -{ -#if COMPILE_WITH_PROFILER - // GC - static int32 ActiveEventIndex; - if (event == MONO_GC_EVENT_PRE_STOP_WORLD_LOCKED) - { - ActiveEventIndex = ProfilerCPU::BeginEvent(TEXT("Garbage Collection")); - } - else if (event == MONO_GC_EVENT_POST_START_WORLD_UNLOCKED) - { - ProfilerCPU::EndEvent(ActiveEventIndex); - } -#endif -} - -#endif - -void OnLogCallback(const char* logDomain, const char* logLevel, const char* message, mono_bool fatal, void* userData) -{ - String currentDomain(logDomain); - String msg(message); - msg.Replace('\n', ' '); - - static const char* monoErrorLevels[] = - { - nullptr, - "error", - "critical", - "warning", - "message", - "info", - "debug" - }; - - uint32 errorLevel = 0; - if (logLevel != nullptr) - { - for (uint32 i = 1; i < 7; i++) - { - if (strcmp(monoErrorLevels[i], logLevel) == 0) - { - errorLevel = i; - break; - } - } - } - - if (currentDomain.IsEmpty()) - { - auto domain = MCore::GetActiveDomain(); - if (domain != nullptr) - { - currentDomain = domain->GetName().Get(); - } - else - { - currentDomain = "null"; - } - } - -#if 0 - // Print C# stack trace (crash may be caused by the managed code) - if (mono_domain_get() && Assemblies::FlaxEngine.Assembly->IsLoaded()) - { - const auto managedStackTrace = DebugLog::GetStackTrace(); - if (managedStackTrace.HasChars()) - { - LOG(Warning, "Managed stack trace:"); - LOG_STR(Warning, managedStackTrace); - } - } -#endif - - if (errorLevel == 0) - { - Log::CLRInnerException(String::Format(TEXT("Message: {0} | Domain: {1}"), msg, currentDomain)).SetLevel(LogType::Error); - } - else if (errorLevel <= 2) - { - Log::CLRInnerException(String::Format(TEXT("Message: {0} | Domain: {1}"), msg, currentDomain)).SetLevel(LogType::Error); - } - else if (errorLevel <= 3) - { - LOG(Warning, "Message: {0} | Domain: {1}", msg, currentDomain); - } - else - { - LOG(Info, "Message: {0} | Domain: {1}", msg, currentDomain); - } -} - -void OnPrintCallback(const char* string, mono_bool isStdout) -{ - LOG_STR(Warning, String(string)); -} - -void OnPrintErrorCallback(const char* string, mono_bool isStdout) -{ - // HACK: ignore this message - if (string && Platform::MemoryCompare(string, "debugger-agent: Unable to listen on ", 36) == 0) - return; - - LOG_STR(Error, String(string)); -} - -#if PLATFORM_LINUX && !USE_MONO_DYNAMIC_LIB - -#include - -#define MONO_THIS_LIB_HANDLE ((void*)(intptr)-1) - -static void* ThisLibHandle = nullptr; - -static void* OnMonoLinuxDlOpen(const char* name, int flags, char** err, void* user_data) -{ - void* result = nullptr; - if (name && StringUtils::Compare(name + StringUtils::Length(name) - 17, "libmono-native.so") == 0) - { - result = MONO_THIS_LIB_HANDLE; - } - return result; -} - -static void* OnMonoLinuxDlSym(void* handle, const char* name, char** err, void* user_data) -{ - void* result = nullptr; - if (handle == MONO_THIS_LIB_HANDLE && ThisLibHandle != nullptr) - { - result = dlsym(ThisLibHandle, name); - } - return result; -} - -#endif - -bool MCore::LoadEngine() -{ - PROFILE_CPU(); - ASSERT(Globals::MonoPath.IsANSI()); - - // Debugging Mono GC - //Platform::SetEnvironmentVariable(TEXT("MONO_GC_DEBUG"), TEXT("6:gc-log.txt,check-remset-consistency,nursery-canaries")); - -#if 0 - // Override memory allocation callback - // TODO: use ENABLE_OVERRIDABLE_ALLOCATORS when building Mono to support memory callbacks or use counters for memory profiling - MonoAllocatorVTable alloc; - alloc.version = MONO_ALLOCATOR_VTABLE_VERSION; - alloc.malloc = MonoMalloc; - alloc.realloc = MonoRealloc; - alloc.free = MonoFree; - alloc.calloc = MonoCalloc; - mono_set_allocator_vtable(&alloc); -#endif - -#if USE_MONO_AOT - mono_jit_set_aot_mode(USE_MONO_AOT_MODE); -#endif - -#ifdef USE_MONO_AOT_MODULE - // Load AOT module - const DateTime aotModuleLoadStartTime = DateTime::Now(); - LOG(Info, "Loading Mono AOT module..."); - void* libAotModule = Platform::LoadLibrary(TEXT(USE_MONO_AOT_MODULE)); - if (libAotModule == nullptr) - { - LOG(Error, "Failed to laod Mono AOT module (" TEXT(USE_MONO_AOT_MODULE) ")"); - return true; - } - MonoAotModuleHandle = libAotModule; - void* getModulesPtr = Platform::GetProcAddress(libAotModule, "GetMonoModules"); - if (getModulesPtr == nullptr) - { - LOG(Error, "Failed to get Mono AOT modules getter."); - return true; - } - typedef int (*GetMonoModulesFunc)(void** buffer, int bufferSize); - const auto getModules = (GetMonoModulesFunc)getModulesPtr; - const int32 moduelsCount = getModules(nullptr, 0); - void** modules = (void**)Allocator::Allocate(moduelsCount * sizeof(void*)); - getModules(modules, moduelsCount); - for (int32 i = 0; i < moduelsCount; i++) - { - mono_aot_register_module((void**)modules[i]); - } - Allocator::Free(modules); - LOG(Info, "Mono AOT module loaded in {0}ms", (int32)(DateTime::Now() - aotModuleLoadStartTime).GetTotalMilliseconds()); -#endif - - // Set mono assemblies path - MString pathLib = (Globals::MonoPath / TEXT("/lib")).ToStringAnsi(); - MString pathEtc = (Globals::MonoPath / TEXT("/etc")).ToStringAnsi(); - mono_set_dirs(pathLib.Get(), pathEtc.Get()); - - // Setup debugger - { - int32 debuggerLogLevel = 0; - if (CommandLine::Options.MonoLog.IsTrue()) - { - LOG(Info, "Using detailed Mono logging"); - mono_trace_set_level_string("debug"); - debuggerLogLevel = 10; - } - else - { - mono_trace_set_level_string("warning"); - } - -#if MONO_DEBUG_ENABLE && !PLATFORM_SWITCH - StringAnsi debuggerIp = "127.0.0.1"; - uint16 debuggerPort = 41000 + Platform::GetCurrentProcessId() % 1000; - if (CommandLine::Options.DebuggerAddress.HasValue()) - { - const auto& address = CommandLine::Options.DebuggerAddress.GetValue(); - const int32 splitIndex = address.Find(':'); - if (splitIndex == INVALID_INDEX) - { - debuggerIp = address.ToStringAnsi(); - } - else - { - debuggerIp = address.Left(splitIndex).ToStringAnsi(); - StringUtils::Parse(address.Right(address.Length() - splitIndex - 1).Get(), &debuggerPort); - } - } - - char buffer[150]; - sprintf(buffer, "--debugger-agent=transport=dt_socket,address=%s:%d,embedding=1,server=y,suspend=%s,loglevel=%d", debuggerIp.Get(), debuggerPort, CommandLine::Options.WaitForDebugger ? "y,timeout=5000" : "n", debuggerLogLevel); - - const char* options[] = { - "--soft-breakpoints", - //"--optimize=float32", - buffer - }; - mono_jit_parse_options(ARRAY_COUNT(options), (char**)options); - - mono_debug_init(MONO_DEBUG_FORMAT_MONO, 0); - LOG(Info, "Mono debugger server at {0}:{1}", String(debuggerIp), debuggerPort); -#endif - - // Connects to mono engine callback system - mono_trace_set_log_handler(OnLogCallback, nullptr); - mono_trace_set_print_handler(OnPrintCallback); - mono_trace_set_printerr_handler(OnPrintErrorCallback); - } - -#if USE_MONO_PROFILER - // Setup profiler options - bool useExternalProfiler = false; - { - String monoEnvOptions; - if (!Platform::GetEnvironmentVariable(TEXT("MONO_ENV_OPTIONS"), monoEnvOptions)) - { - const StringView prefix(TEXT("--profile=")); - if (monoEnvOptions.StartsWith(prefix)) - { - monoEnvOptions = monoEnvOptions.Substring(prefix.Length()); - LOG(Info, "Loading Mono profiler with options \'{0}\'", monoEnvOptions); - StringAnsi monoEnvOptionsAnsi(monoEnvOptions); - mono_profiler_load(monoEnvOptionsAnsi.Get()); - useExternalProfiler = true; - } - } - } -#endif - -#if PLATFORM_ANDROID - // Disable any AOT code on Android - mono_jit_set_aot_mode(MONO_AOT_MODE_NONE); - - // Hint to use default system assemblies location - const MString assembliesPath = (Globals::MonoPath / TEXT("/lib/mono/2.1")).ToStringAnsi(); - mono_set_assemblies_path(*assembliesPath); -#elif PLATFORM_LINUX - // Adjust GC threads suspending mode on Linux - Platform::SetEnvironmentVariable(TEXT("MONO_THREADS_SUSPEND"), TEXT("preemptive")); - -#if !USE_MONO_DYNAMIC_LIB - // Hook for missing library (when using static linking) - ThisLibHandle = dlopen(nullptr, RTLD_LAZY); - mono_dl_fallback_register(OnMonoLinuxDlOpen, OnMonoLinuxDlSym, nullptr, nullptr); -#endif -#elif PLATFORM_MAC - // Adjust GC threads suspending mode on Mac - Platform::SetEnvironmentVariable(TEXT("MONO_THREADS_SUSPEND"), TEXT("preemptive")); -#endif - const char* configPath = nullptr; -#if PLATFORM_SWITCH - MString configPathBuf = (Globals::MonoPath / TEXT("/etc/mono/config")).ToStringAnsi(); - configPath = *configPathBuf; - const MString assembliesPath = (Globals::MonoPath / TEXT("/lib/mono/4.5")).ToStringAnsi(); - mono_set_assemblies_path(*assembliesPath); -#endif - mono_config_parse(configPath); - -#if USE_MONO_PROFILER - // Init profiler - if (!useExternalProfiler) - { - const MonoProfilerHandle profilerHandle = mono_profiler_create((MonoProfiler*)&Profiler); - mono_profiler_set_gc_allocation_callback(profilerHandle, &OnGCAllocation); - mono_profiler_set_gc_event_callback(profilerHandle, &OnGCEvent); - mono_profiler_enable_allocations(); - } -#endif - - // Init Mono -#if PLATFORM_ANDROID - const char* monoVersion = "mobile"; -#else - const char* monoVersion = "v4.0.30319"; -#endif - auto monoRootDomain = mono_jit_init_version("Flax", monoVersion); - ASSERT(monoRootDomain); - MRootDomain = New("Root"); - MRootDomain->_monoDomain = monoRootDomain; - MDomains.Add(MRootDomain); - - auto exePath = Platform::GetExecutableFilePath(); - auto configDir = StringUtils::GetDirectoryName(exePath).ToStringAnsi(); - auto configFilename = StringUtils::GetFileName(exePath).ToStringAnsi() + ".config"; -#if PLATFORM_UWP - // Change the app root to Mono sub directory to prevent loading .Net Core assemblies from the AppX root folder - configDir += "\\Mono"; -#elif PLATFORM_SWITCH - // Make config file path absolute - configFilename = exePath.ToStringAnsi() + ".config"; -#endif - mono_domain_set_config(monoRootDomain, configDir.Get(), configFilename.Get()); - mono_thread_set_main(mono_thread_current()); - - // Info - char* buildInfo = mono_get_runtime_build_info(); - LOG(Info, "Mono version: {0}", String(buildInfo)); - mono_free(buildInfo); - - return false; -} - -#if PLATFORM_WINDOWS && USE_EDITOR -long MonoHackSehExceptionHandler(class EXCEPTION_POINTERS* ep) -{ - LOG(Error, "Mono crashed on exit"); - return 1; -} -#endif - -void MCore::UnloadEngine() -{ - // Only root domain should be alive at this point - for (auto domain : MDomains) - { - if (domain != MRootDomain) - Delete(domain); - } - MDomains.Clear(); - - if (MRootDomain) - { -#if PLATFORM_WINDOWS && USE_EDITOR - // TODO: reduce issues with hot-reloading C# DLLs because sometimes it crashes on exit - __try -#endif - { - mono_jit_cleanup(MRootDomain->GetNative()); - } -#if PLATFORM_WINDOWS && USE_EDITOR - __except (MonoHackSehExceptionHandler(nullptr)) - { - } -#endif - Delete(MRootDomain); - MRootDomain = nullptr; - } - -#ifdef USE_MONO_AOT_MODULE - Platform::FreeLibrary(MonoAotModuleHandle); -#endif - -#if PLATFORM_LINUX && !USE_MONO_DYNAMIC_LIB - if (ThisLibHandle) - { - dlclose(ThisLibHandle); - ThisLibHandle = nullptr; - } -#endif -} - -#else - -bool MCore::LoadEngine() -{ - MRootDomain = New("Root"); - MDomains.Add(MRootDomain); - return false; -} - -void MCore::UnloadEngine() -{ - MDomains.ClearDelete(); - MRootDomain = nullptr; -} - -#endif - -void MCore::AttachThread() -{ -#if USE_MONO - if (!IsInMainThread() && !mono_domain_get()) - { - const auto domain = GetActiveDomain(); - ASSERT(domain); - mono_thread_attach(domain->GetNative()); - } -#endif -} - -void MCore::ExitThread() -{ -#if USE_MONO - if (!IsInMainThread() && mono_domain_get()) - { - LOG(Info, "Thread 0x{0:x} exits the managed runtime", Platform::GetCurrentThreadID()); - // TODO: use mono_thread_detach but modify mono to call mono_thread_info_detach there so the thread goes into STATE_DETACHED - mono_thread_exit(); - } -#endif -} - -void MCore::GC::Collect() -{ -#if USE_MONO - PROFILE_CPU(); - mono_gc_collect(mono_gc_max_generation()); -#endif -} - -void MCore::GC::Collect(int32 generation) -{ -#if USE_MONO - PROFILE_CPU(); - mono_gc_collect(generation); -#endif -} - -void MCore::GC::WaitForPendingFinalizers() -{ -#if USE_MONO - PROFILE_CPU(); - if (mono_gc_pending_finalizers()) - { - mono_gc_finalize_notify(); - do - { - Platform::Sleep(1); - } while (mono_gc_pending_finalizers()); - } -#endif -} - -#if USE_MONO && PLATFORM_WIN32 && !USE_MONO_DYNAMIC_LIB - -// Export Mono functions -#pragma comment(linker, "/export:mono_add_internal_call") -#pragma comment(linker, "/export:mono_array_addr_with_size") -#pragma comment(linker, "/export:mono_array_calc_byte_len") -#pragma comment(linker, "/export:mono_array_class_get") -#pragma comment(linker, "/export:mono_array_clone") -#pragma comment(linker, "/export:mono_array_clone_checked") -#pragma comment(linker, "/export:mono_array_clone_in_domain") -#pragma comment(linker, "/export:mono_array_element_size") -#pragma comment(linker, "/export:mono_array_full_copy") -#pragma comment(linker, "/export:mono_array_handle_length") -#pragma comment(linker, "/export:mono_array_handle_memcpy_refs") -#pragma comment(linker, "/export:mono_array_handle_pin_with_size") -#pragma comment(linker, "/export:mono_array_length") -#pragma comment(linker, "/export:mono_array_new") -#pragma comment(linker, "/export:mono_array_new_1") -#pragma comment(linker, "/export:mono_array_new_2") -#pragma comment(linker, "/export:mono_array_new_3") -#pragma comment(linker, "/export:mono_array_new_4") -#pragma comment(linker, "/export:mono_array_new_checked") -#pragma comment(linker, "/export:mono_array_new_full") -#pragma comment(linker, "/export:mono_array_new_full_checked") -#pragma comment(linker, "/export:mono_array_new_full_handle") -#pragma comment(linker, "/export:mono_array_new_handle") -#pragma comment(linker, "/export:mono_array_new_specific") -#pragma comment(linker, "/export:mono_array_new_specific_checked") -#pragma comment(linker, "/export:mono_array_new_specific_handle") -#pragma comment(linker, "/export:mono_array_new_va") -#pragma comment(linker, "/export:mono_array_to_byte_byvalarray") -#pragma comment(linker, "/export:mono_array_to_lparray") -#pragma comment(linker, "/export:mono_array_to_savearray") -#pragma comment(linker, "/export:mono_assembly_addref") -#pragma comment(linker, "/export:mono_assembly_binding_applies_to_image") -#pragma comment(linker, "/export:mono_assembly_candidate_predicate_sn_same_name") -#pragma comment(linker, "/export:mono_assembly_cleanup_domain_bindings") -#pragma comment(linker, "/export:mono_assembly_close") -#pragma comment(linker, "/export:mono_assembly_close_except_image_pools") -#pragma comment(linker, "/export:mono_assembly_close_finish") -#pragma comment(linker, "/export:mono_assembly_fill_assembly_name") -#pragma comment(linker, "/export:mono_assembly_fill_assembly_name_full") -#pragma comment(linker, "/export:mono_assembly_foreach") -#pragma comment(linker, "/export:mono_assembly_get_assemblyref") -#pragma comment(linker, "/export:mono_assembly_get_assemblyref_checked") -#pragma comment(linker, "/export:mono_assembly_get_image") -#pragma comment(linker, "/export:mono_assembly_get_image_internal") -#pragma comment(linker, "/export:mono_assembly_get_main") -#pragma comment(linker, "/export:mono_assembly_get_name") -#pragma comment(linker, "/export:mono_assembly_get_name_internal") -#pragma comment(linker, "/export:mono_assembly_get_object") -#pragma comment(linker, "/export:mono_assembly_get_object_handle") -#pragma comment(linker, "/export:mono_assembly_getrootdir") -#pragma comment(linker, "/export:mono_assembly_has_reference_assembly_attribute") -#pragma comment(linker, "/export:mono_assembly_has_skip_verification") -#pragma comment(linker, "/export:mono_assembly_init_weak_fields") -#pragma comment(linker, "/export:mono_assembly_invoke_load_hook") -#pragma comment(linker, "/export:mono_assembly_invoke_search_hook") -#pragma comment(linker, "/export:mono_assembly_invoke_unload_hook") -#pragma comment(linker, "/export:mono_assembly_is_problematic_version") -#pragma comment(linker, "/export:mono_assembly_is_weak_field") -#pragma comment(linker, "/export:mono_assembly_load") -#pragma comment(linker, "/export:mono_assembly_load_corlib") -#pragma comment(linker, "/export:mono_assembly_load_friends") -#pragma comment(linker, "/export:mono_assembly_load_from") -#pragma comment(linker, "/export:mono_assembly_load_from_assemblies_path") -#pragma comment(linker, "/export:mono_assembly_load_from_full") -#pragma comment(linker, "/export:mono_assembly_load_from_predicate") -#pragma comment(linker, "/export:mono_assembly_load_full") -#pragma comment(linker, "/export:mono_assembly_load_full_nosearch") -#pragma comment(linker, "/export:mono_assembly_load_module") -#pragma comment(linker, "/export:mono_assembly_load_module_checked") -#pragma comment(linker, "/export:mono_assembly_load_reference") -#pragma comment(linker, "/export:mono_assembly_load_references") -#pragma comment(linker, "/export:mono_assembly_load_with_partial_name") -#pragma comment(linker, "/export:mono_assembly_load_with_partial_name_internal") -#pragma comment(linker, "/export:mono_assembly_loaded") -#pragma comment(linker, "/export:mono_assembly_loaded_full") -#pragma comment(linker, "/export:mono_assembly_metadata_foreach_custom_attr") -#pragma comment(linker, "/export:mono_assembly_name_free") -#pragma comment(linker, "/export:mono_assembly_name_free_internal") -#pragma comment(linker, "/export:mono_assembly_name_get_culture") -#pragma comment(linker, "/export:mono_assembly_name_get_name") -#pragma comment(linker, "/export:mono_assembly_name_get_pubkeytoken") -#pragma comment(linker, "/export:mono_assembly_name_get_version") -#pragma comment(linker, "/export:mono_assembly_name_new") -#pragma comment(linker, "/export:mono_assembly_name_parse") -#pragma comment(linker, "/export:mono_assembly_name_parse_full") -#pragma comment(linker, "/export:mono_assembly_names_equal") -#pragma comment(linker, "/export:mono_assembly_names_equal_flags") -#pragma comment(linker, "/export:mono_assembly_open") -#pragma comment(linker, "/export:mono_assembly_open_a_lot") -#pragma comment(linker, "/export:mono_assembly_open_from_bundle") -#pragma comment(linker, "/export:mono_assembly_open_full") -#pragma comment(linker, "/export:mono_assembly_open_predicate") -#pragma comment(linker, "/export:mono_assembly_release_gc_roots") -#pragma comment(linker, "/export:mono_assembly_set_main") -#pragma comment(linker, "/export:mono_assembly_setrootdir") -#pragma comment(linker, "/export:mono_class_alloc") -#pragma comment(linker, "/export:mono_class_alloc0") -#pragma comment(linker, "/export:mono_class_array_element_size") -#pragma comment(linker, "/export:mono_class_bind_generic_parameters") -#pragma comment(linker, "/export:mono_class_can_access_class") -#pragma comment(linker, "/export:mono_class_check_context_used") -#pragma comment(linker, "/export:mono_class_check_vtable_constraints") -#pragma comment(linker, "/export:mono_class_compute_bitmap") -#pragma comment(linker, "/export:mono_class_compute_gc_descriptor") -#pragma comment(linker, "/export:mono_class_contextbound_bit_offset") -#pragma comment(linker, "/export:mono_class_create_array") -#pragma comment(linker, "/export:mono_class_create_array_fill_type") -#pragma comment(linker, "/export:mono_class_create_bounded_array") -#pragma comment(linker, "/export:mono_class_create_fnptr") -#pragma comment(linker, "/export:mono_class_create_from_typedef") -#pragma comment(linker, "/export:mono_class_create_generic_inst") -#pragma comment(linker, "/export:mono_class_create_generic_parameter") -#pragma comment(linker, "/export:mono_class_create_ptr") -#pragma comment(linker, "/export:mono_class_data_size") -#pragma comment(linker, "/export:mono_class_describe_statics") -#pragma comment(linker, "/export:mono_class_enum_basetype") -#pragma comment(linker, "/export:mono_class_enum_basetype_internal") -#pragma comment(linker, "/export:mono_class_field_get_special_static_type") -#pragma comment(linker, "/export:mono_class_field_is_special_static") -#pragma comment(linker, "/export:mono_class_fill_runtime_generic_context") -#pragma comment(linker, "/export:mono_class_find_enum_basetype") -#pragma comment(linker, "/export:mono_class_free_ref_info") -#pragma comment(linker, "/export:mono_class_from_generic_parameter") -#pragma comment(linker, "/export:mono_class_from_mono_type") -#pragma comment(linker, "/export:mono_class_from_mono_type_handle") -#pragma comment(linker, "/export:mono_class_from_name") -#pragma comment(linker, "/export:mono_class_from_name_case") -#pragma comment(linker, "/export:mono_class_from_name_case_checked") -#pragma comment(linker, "/export:mono_class_from_name_checked") -#pragma comment(linker, "/export:mono_class_from_typeref") -#pragma comment(linker, "/export:mono_class_from_typeref_checked") -#pragma comment(linker, "/export:mono_class_full_name") -#pragma comment(linker, "/export:mono_class_generic_sharing_enabled") -#pragma comment(linker, "/export:mono_class_get") -#pragma comment(linker, "/export:mono_class_get_and_inflate_typespec_checked") -#pragma comment(linker, "/export:mono_class_get_appdomain_unloaded_exception_class") -#pragma comment(linker, "/export:mono_class_get_byref_type") -#pragma comment(linker, "/export:mono_class_get_cached_class_info") -#pragma comment(linker, "/export:mono_class_get_cctor") -#pragma comment(linker, "/export:mono_class_get_checked") -#pragma comment(linker, "/export:mono_class_get_com_object_class") -#pragma comment(linker, "/export:mono_class_get_context") -#pragma comment(linker, "/export:mono_class_get_declsec_flags") -#pragma comment(linker, "/export:mono_class_get_default_finalize_method") -#pragma comment(linker, "/export:mono_class_get_dim_conflicts") -#pragma comment(linker, "/export:mono_class_get_element_class") -#pragma comment(linker, "/export:mono_class_get_event_info") -#pragma comment(linker, "/export:mono_class_get_event_token") -#pragma comment(linker, "/export:mono_class_get_events") -#pragma comment(linker, "/export:mono_class_get_exception_data") -#pragma comment(linker, "/export:mono_class_get_exception_for_failure") -#pragma comment(linker, "/export:mono_class_get_field") -#pragma comment(linker, "/export:mono_class_get_field_count") -#pragma comment(linker, "/export:mono_class_get_field_def_values") -#pragma comment(linker, "/export:mono_class_get_field_default_value") -#pragma comment(linker, "/export:mono_class_get_field_from_name") -#pragma comment(linker, "/export:mono_class_get_field_from_name_full") -#pragma comment(linker, "/export:mono_class_get_field_token") -#pragma comment(linker, "/export:mono_class_get_fields") -#pragma comment(linker, "/export:mono_class_get_fields_internal") -#pragma comment(linker, "/export:mono_class_get_fields_lazy") -#pragma comment(linker, "/export:mono_class_get_finalizer") -#pragma comment(linker, "/export:mono_class_get_first_field_idx") -#pragma comment(linker, "/export:mono_class_get_first_method_idx") -#pragma comment(linker, "/export:mono_class_get_flags") -#pragma comment(linker, "/export:mono_class_get_full") -#pragma comment(linker, "/export:mono_class_get_generic_class") -#pragma comment(linker, "/export:mono_class_get_generic_container") -#pragma comment(linker, "/export:mono_class_get_generic_type_definition") -#pragma comment(linker, "/export:mono_class_get_idispatch_class") -#pragma comment(linker, "/export:mono_class_get_image") -#pragma comment(linker, "/export:mono_class_get_implemented_interfaces") -#pragma comment(linker, "/export:mono_class_get_inflated_method") -#pragma comment(linker, "/export:mono_class_get_interfaces") -#pragma comment(linker, "/export:mono_class_get_interop_proxy_class") -#pragma comment(linker, "/export:mono_class_get_iunknown_class") -#pragma comment(linker, "/export:mono_class_get_marshal_info") -#pragma comment(linker, "/export:mono_class_get_method_by_index") -#pragma comment(linker, "/export:mono_class_get_method_count") -#pragma comment(linker, "/export:mono_class_get_method_from_name") -#pragma comment(linker, "/export:mono_class_get_method_from_name_checked") -#pragma comment(linker, "/export:mono_class_get_method_from_name_flags") -#pragma comment(linker, "/export:mono_class_get_method_generic") -#pragma comment(linker, "/export:mono_class_get_methods") -#pragma comment(linker, "/export:mono_class_get_methods_by_name") -#pragma comment(linker, "/export:mono_class_get_name") -#pragma comment(linker, "/export:mono_class_get_namespace") -#pragma comment(linker, "/export:mono_class_get_nested_classes_property") -#pragma comment(linker, "/export:mono_class_get_nested_types") -#pragma comment(linker, "/export:mono_class_get_nesting_type") -#pragma comment(linker, "/export:mono_class_get_nullable_param") -#pragma comment(linker, "/export:mono_class_get_object_finalize_slot") -#pragma comment(linker, "/export:mono_class_get_overrides_full") -#pragma comment(linker, "/export:mono_class_get_parent") -#pragma comment(linker, "/export:mono_class_get_properties") -#pragma comment(linker, "/export:mono_class_get_property_default_value") -#pragma comment(linker, "/export:mono_class_get_property_from_name") -#pragma comment(linker, "/export:mono_class_get_property_info") -#pragma comment(linker, "/export:mono_class_get_property_token") -#pragma comment(linker, "/export:mono_class_get_rank") -#pragma comment(linker, "/export:mono_class_get_ref_info") -#pragma comment(linker, "/export:mono_class_get_ref_info_handle") -#pragma comment(linker, "/export:mono_class_get_ref_info_raw") -#pragma comment(linker, "/export:mono_class_get_type") -#pragma comment(linker, "/export:mono_class_get_type_token") -#pragma comment(linker, "/export:mono_class_get_valuetype_class") -#pragma comment(linker, "/export:mono_class_get_variant_class") -#pragma comment(linker, "/export:mono_class_get_virtual_method") -#pragma comment(linker, "/export:mono_class_get_vtable_entry") -#pragma comment(linker, "/export:mono_class_get_vtable_size") -#pragma comment(linker, "/export:mono_class_get_weak_bitmap") -#pragma comment(linker, "/export:mono_class_gtd_get_canonical_inst") -#pragma comment(linker, "/export:mono_class_has_dim_conflicts") -#pragma comment(linker, "/export:mono_class_has_failure") -#pragma comment(linker, "/export:mono_class_has_finalizer") -#pragma comment(linker, "/export:mono_class_has_ref_info") -#pragma comment(linker, "/export:mono_class_has_special_static_fields") -#pragma comment(linker, "/export:mono_class_has_variant_generic_params") -#pragma comment(linker, "/export:mono_class_implements_interface") -#pragma comment(linker, "/export:mono_class_inflate_generic_class_checked") -#pragma comment(linker, "/export:mono_class_inflate_generic_method") -#pragma comment(linker, "/export:mono_class_inflate_generic_method_checked") -#pragma comment(linker, "/export:mono_class_inflate_generic_method_full_checked") -#pragma comment(linker, "/export:mono_class_inflate_generic_type") -#pragma comment(linker, "/export:mono_class_inflate_generic_type_checked") -#pragma comment(linker, "/export:mono_class_inflate_generic_type_with_mempool") -#pragma comment(linker, "/export:mono_class_init") -#pragma comment(linker, "/export:mono_class_init_checked") -#pragma comment(linker, "/export:mono_class_init_sizes") -#pragma comment(linker, "/export:mono_class_instance_size") -#pragma comment(linker, "/export:mono_class_interface_offset") -#pragma comment(linker, "/export:mono_class_interface_offset_with_variance") -#pragma comment(linker, "/export:mono_class_is_assignable_from") -#pragma comment(linker, "/export:mono_class_is_assignable_from_checked") -#pragma comment(linker, "/export:mono_class_is_assignable_from_internal") -#pragma comment(linker, "/export:mono_class_is_assignable_from_slow") -#pragma comment(linker, "/export:mono_class_is_delegate") -#pragma comment(linker, "/export:mono_class_is_enum") -#pragma comment(linker, "/export:mono_class_is_from_assembly") -#pragma comment(linker, "/export:mono_class_is_magic_float") -#pragma comment(linker, "/export:mono_class_is_magic_int") -#pragma comment(linker, "/export:mono_class_is_nullable") -#pragma comment(linker, "/export:mono_class_is_open_constructed_type") -#pragma comment(linker, "/export:mono_class_is_reflection_method_or_constructor") -#pragma comment(linker, "/export:mono_class_is_subclass_of") -#pragma comment(linker, "/export:mono_class_is_valid_enum") -#pragma comment(linker, "/export:mono_class_is_valuetype") -#pragma comment(linker, "/export:mono_class_is_variant_compatible") -#pragma comment(linker, "/export:mono_class_layout_fields") -#pragma comment(linker, "/export:mono_class_load_from_name") -#pragma comment(linker, "/export:mono_class_min_align") -#pragma comment(linker, "/export:mono_class_name_from_token") -#pragma comment(linker, "/export:mono_class_native_size") -#pragma comment(linker, "/export:mono_class_needs_cctor_run") -#pragma comment(linker, "/export:mono_class_num_events") -#pragma comment(linker, "/export:mono_class_num_fields") -#pragma comment(linker, "/export:mono_class_num_methods") -#pragma comment(linker, "/export:mono_class_num_properties") -#pragma comment(linker, "/export:mono_class_publish_gc_descriptor") -#pragma comment(linker, "/export:mono_class_rgctx_get_array_size") -#pragma comment(linker, "/export:mono_class_set_declsec_flags") -#pragma comment(linker, "/export:mono_class_set_dim_conflicts") -#pragma comment(linker, "/export:mono_class_set_event_info") -#pragma comment(linker, "/export:mono_class_set_exception_data") -#pragma comment(linker, "/export:mono_class_set_failure") -#pragma comment(linker, "/export:mono_class_set_field_count") -#pragma comment(linker, "/export:mono_class_set_field_def_values") -#pragma comment(linker, "/export:mono_class_set_first_field_idx") -#pragma comment(linker, "/export:mono_class_set_first_method_idx") -#pragma comment(linker, "/export:mono_class_set_flags") -#pragma comment(linker, "/export:mono_class_set_generic_container") -#pragma comment(linker, "/export:mono_class_set_is_com_object") -#pragma comment(linker, "/export:mono_class_set_marshal_info") -#pragma comment(linker, "/export:mono_class_set_method_count") -#pragma comment(linker, "/export:mono_class_set_nested_classes_property") -#pragma comment(linker, "/export:mono_class_set_nonblittable") -#pragma comment(linker, "/export:mono_class_set_property_info") -#pragma comment(linker, "/export:mono_class_set_ref_info") -#pragma comment(linker, "/export:mono_class_set_ref_info_handle") -#pragma comment(linker, "/export:mono_class_set_type_load_failure") -#pragma comment(linker, "/export:mono_class_set_type_load_failure_causedby_class") -#pragma comment(linker, "/export:mono_class_set_weak_bitmap") -#pragma comment(linker, "/export:mono_class_setup_basic_field_info") -#pragma comment(linker, "/export:mono_class_setup_events") -#pragma comment(linker, "/export:mono_class_setup_fields") -#pragma comment(linker, "/export:mono_class_setup_has_finalizer") -#pragma comment(linker, "/export:mono_class_setup_interface_id") -#pragma comment(linker, "/export:mono_class_setup_interface_offsets") -#pragma comment(linker, "/export:mono_class_setup_interfaces") -#pragma comment(linker, "/export:mono_class_setup_methods") -#pragma comment(linker, "/export:mono_class_setup_mono_type") -#pragma comment(linker, "/export:mono_class_setup_nested_types") -#pragma comment(linker, "/export:mono_class_setup_parent") -#pragma comment(linker, "/export:mono_class_setup_properties") -#pragma comment(linker, "/export:mono_class_setup_runtime_info") -#pragma comment(linker, "/export:mono_class_setup_supertypes") -#pragma comment(linker, "/export:mono_class_setup_vtable") -#pragma comment(linker, "/export:mono_class_setup_vtable_general") -#pragma comment(linker, "/export:mono_class_static_field_address") -#pragma comment(linker, "/export:mono_class_try_get_com_object_class") -#pragma comment(linker, "/export:mono_class_try_get_generic_class") -#pragma comment(linker, "/export:mono_class_try_get_generic_container") -#pragma comment(linker, "/export:mono_class_try_get_safehandle_class") -#pragma comment(linker, "/export:mono_class_try_get_vtable") -#pragma comment(linker, "/export:mono_class_try_load_from_name") -#pragma comment(linker, "/export:mono_class_value_size") -#pragma comment(linker, "/export:mono_class_vtable") -#pragma comment(linker, "/export:mono_class_vtable_checked") -#pragma comment(linker, "/export:mono_custom_attrs_construct") -#pragma comment(linker, "/export:mono_custom_attrs_free") -#pragma comment(linker, "/export:mono_custom_attrs_from_assembly") -#pragma comment(linker, "/export:mono_custom_attrs_from_assembly_checked") -#pragma comment(linker, "/export:mono_custom_attrs_from_builders") -#pragma comment(linker, "/export:mono_custom_attrs_from_class") -#pragma comment(linker, "/export:mono_custom_attrs_from_class_checked") -#pragma comment(linker, "/export:mono_custom_attrs_from_event") -#pragma comment(linker, "/export:mono_custom_attrs_from_event_checked") -#pragma comment(linker, "/export:mono_custom_attrs_from_field") -#pragma comment(linker, "/export:mono_custom_attrs_from_field_checked") -#pragma comment(linker, "/export:mono_custom_attrs_from_index") -#pragma comment(linker, "/export:mono_custom_attrs_from_index_checked") -#pragma comment(linker, "/export:mono_custom_attrs_from_method") -#pragma comment(linker, "/export:mono_custom_attrs_from_method_checked") -#pragma comment(linker, "/export:mono_custom_attrs_from_param") -#pragma comment(linker, "/export:mono_custom_attrs_from_param_checked") -#pragma comment(linker, "/export:mono_custom_attrs_from_property") -#pragma comment(linker, "/export:mono_custom_attrs_from_property_checked") -#pragma comment(linker, "/export:mono_custom_attrs_get_attr") -#pragma comment(linker, "/export:mono_custom_attrs_get_attr_checked") -#pragma comment(linker, "/export:mono_custom_attrs_has_attr") -#pragma comment(linker, "/export:mono_debug_add_aot_method") -#pragma comment(linker, "/export:mono_debug_add_delegate_trampoline") -#pragma comment(linker, "/export:mono_debug_add_method") -#pragma comment(linker, "/export:mono_debug_cleanup") -#pragma comment(linker, "/export:mono_debug_close_image") -#pragma comment(linker, "/export:mono_debug_close_method") -#pragma comment(linker, "/export:mono_debug_close_mono_symbol_file") -#pragma comment(linker, "/export:mono_debug_count") -#pragma comment(linker, "/export:mono_debug_domain_create") -#pragma comment(linker, "/export:mono_debug_domain_unload") -#pragma comment(linker, "/export:mono_debug_enabled") -#pragma comment(linker, "/export:mono_debug_find_method") -#pragma comment(linker, "/export:mono_debug_free_locals") -#pragma comment(linker, "/export:mono_debug_free_method") -#pragma comment(linker, "/export:mono_debug_free_method_async_debug_info") -#pragma comment(linker, "/export:mono_debug_free_method_jit_info") -#pragma comment(linker, "/export:mono_debug_free_source_location") -#pragma comment(linker, "/export:mono_debug_get_handle") -#pragma comment(linker, "/export:mono_debug_get_seq_points") -#pragma comment(linker, "/export:mono_debug_il_offset_from_address") -#pragma comment(linker, "/export:mono_debug_image_has_debug_info") -#pragma comment(linker, "/export:mono_debug_init") -#pragma comment(linker, "/export:mono_debug_init_method") -#pragma comment(linker, "/export:mono_debug_lookup_locals") -#pragma comment(linker, "/export:mono_debug_lookup_method") -#pragma comment(linker, "/export:mono_debug_lookup_method_addresses") -#pragma comment(linker, "/export:mono_debug_lookup_method_async_debug_info") -#pragma comment(linker, "/export:mono_debug_lookup_source_location") -#pragma comment(linker, "/export:mono_debug_lookup_source_location_by_il") -#pragma comment(linker, "/export:mono_debug_method_lookup_location") -#pragma comment(linker, "/export:mono_debug_open_block") -#pragma comment(linker, "/export:mono_debug_open_method") -#pragma comment(linker, "/export:mono_debug_open_mono_symbols") -#pragma comment(linker, "/export:mono_debug_personality") -#pragma comment(linker, "/export:mono_debug_print_stack_frame") -#pragma comment(linker, "/export:mono_debug_print_vars") -#pragma comment(linker, "/export:mono_debug_record_line_number") -#pragma comment(linker, "/export:mono_debug_remove_method") -#pragma comment(linker, "/export:mono_debug_serialize_debug_info") -#pragma comment(linker, "/export:mono_debug_symfile_free_location") -#pragma comment(linker, "/export:mono_debug_symfile_get_seq_points") -#pragma comment(linker, "/export:mono_debug_symfile_is_loaded") -#pragma comment(linker, "/export:mono_debug_symfile_lookup_locals") -#pragma comment(linker, "/export:mono_debug_symfile_lookup_location") -#pragma comment(linker, "/export:mono_debug_symfile_lookup_method") -#pragma comment(linker, "/export:mono_domain_alloc") -#pragma comment(linker, "/export:mono_domain_alloc0") -#pragma comment(linker, "/export:mono_domain_alloc0_lock_free") -#pragma comment(linker, "/export:mono_domain_assembly_open") -#pragma comment(linker, "/export:mono_domain_assembly_open_internal") -#pragma comment(linker, "/export:mono_domain_assembly_postload_search") -#pragma comment(linker, "/export:mono_domain_code_commit") -#pragma comment(linker, "/export:mono_domain_code_foreach") -#pragma comment(linker, "/export:mono_domain_code_reserve") -#pragma comment(linker, "/export:mono_domain_code_reserve_align") -#pragma comment(linker, "/export:mono_domain_create") -#pragma comment(linker, "/export:mono_domain_create_appdomain") -#pragma comment(linker, "/export:mono_domain_finalize") -#pragma comment(linker, "/export:mono_domain_foreach") -#pragma comment(linker, "/export:mono_domain_free") -#pragma comment(linker, "/export:mono_domain_from_appdomain") -#pragma comment(linker, "/export:mono_domain_get") -#pragma comment(linker, "/export:mono_domain_get_assemblies") -#pragma comment(linker, "/export:mono_domain_get_by_id") -#pragma comment(linker, "/export:mono_domain_get_friendly_name") -#pragma comment(linker, "/export:mono_domain_get_id") -#pragma comment(linker, "/export:mono_domain_has_type_resolve") -#pragma comment(linker, "/export:mono_domain_is_unloading") -#pragma comment(linker, "/export:mono_domain_lock") -#pragma comment(linker, "/export:mono_domain_owns_vtable_slot") -#pragma comment(linker, "/export:mono_domain_parse_assembly_bindings") -#pragma comment(linker, "/export:mono_domain_set") -#pragma comment(linker, "/export:mono_domain_set_config") -#pragma comment(linker, "/export:mono_domain_set_config_checked") -#pragma comment(linker, "/export:mono_domain_set_internal") -#pragma comment(linker, "/export:mono_domain_set_internal_with_options") -#pragma comment(linker, "/export:mono_domain_set_options_from_config") -#pragma comment(linker, "/export:mono_domain_try_type_resolve") -#pragma comment(linker, "/export:mono_domain_try_type_resolve_name") -#pragma comment(linker, "/export:mono_domain_try_type_resolve_typebuilder") -#pragma comment(linker, "/export:mono_domain_try_unload") -#pragma comment(linker, "/export:mono_domain_unload") -#pragma comment(linker, "/export:mono_domain_unlock") -#pragma comment(linker, "/export:mono_domain_unset") -#pragma comment(linker, "/export:mono_exception_from_name") -#pragma comment(linker, "/export:mono_exception_from_name_domain") -#pragma comment(linker, "/export:mono_exception_from_name_msg") -#pragma comment(linker, "/export:mono_exception_from_name_two_strings") -#pragma comment(linker, "/export:mono_exception_from_name_two_strings_checked") -#pragma comment(linker, "/export:mono_exception_from_token") -#pragma comment(linker, "/export:mono_exception_from_token_two_strings") -#pragma comment(linker, "/export:mono_exception_from_token_two_strings_checked") -#pragma comment(linker, "/export:mono_exception_get_managed_backtrace") -#pragma comment(linker, "/export:mono_exception_handle_get_native_backtrace") -#pragma comment(linker, "/export:mono_exception_new_argument") -#pragma comment(linker, "/export:mono_exception_new_argument_null") -#pragma comment(linker, "/export:mono_exception_new_by_name_msg") -#pragma comment(linker, "/export:mono_exception_new_invalid_operation") -#pragma comment(linker, "/export:mono_exception_new_serialization") -#pragma comment(linker, "/export:mono_exception_new_thread_abort") -#pragma comment(linker, "/export:mono_exception_new_thread_interrupted") -#pragma comment(linker, "/export:mono_exception_walk_trace") -#pragma comment(linker, "/export:mono_field_from_token") -#pragma comment(linker, "/export:mono_field_from_token_checked") -#pragma comment(linker, "/export:mono_field_full_name") -#pragma comment(linker, "/export:mono_field_get_data") -#pragma comment(linker, "/export:mono_field_get_flags") -#pragma comment(linker, "/export:mono_field_get_name") -#pragma comment(linker, "/export:mono_field_get_object") -#pragma comment(linker, "/export:mono_field_get_object_checked") -#pragma comment(linker, "/export:mono_field_get_object_handle") -#pragma comment(linker, "/export:mono_field_get_offset") -#pragma comment(linker, "/export:mono_field_get_parent") -#pragma comment(linker, "/export:mono_field_get_type") -#pragma comment(linker, "/export:mono_field_get_type_checked") -#pragma comment(linker, "/export:mono_field_get_value") -#pragma comment(linker, "/export:mono_field_get_value_internal") -#pragma comment(linker, "/export:mono_field_get_value_object") -#pragma comment(linker, "/export:mono_field_get_value_object_checked") -#pragma comment(linker, "/export:mono_field_resolve_type") -#pragma comment(linker, "/export:mono_field_set_value") -#pragma comment(linker, "/export:mono_field_static_get_value") -#pragma comment(linker, "/export:mono_field_static_get_value_checked") -#pragma comment(linker, "/export:mono_field_static_get_value_for_thread") -#pragma comment(linker, "/export:mono_field_static_set_value") -#pragma comment(linker, "/export:mono_free") -#pragma comment(linker, "/export:mono_free_address_info") -#pragma comment(linker, "/export:mono_free_altstack") -#pragma comment(linker, "/export:mono_free_bstr") -#pragma comment(linker, "/export:mono_free_loop_info") -#pragma comment(linker, "/export:mono_free_lparray") -#pragma comment(linker, "/export:mono_free_method") -#pragma comment(linker, "/export:mono_free_verify_list") -#pragma comment(linker, "/export:mono_gc_add_memory_pressure") -#pragma comment(linker, "/export:mono_gc_alloc_array") -#pragma comment(linker, "/export:mono_gc_alloc_fixed") -#pragma comment(linker, "/export:mono_gc_alloc_fixed_no_descriptor") -#pragma comment(linker, "/export:mono_gc_alloc_handle_array") -#pragma comment(linker, "/export:mono_gc_alloc_handle_mature") -#pragma comment(linker, "/export:mono_gc_alloc_handle_obj") -#pragma comment(linker, "/export:mono_gc_alloc_handle_pinned_obj") -#pragma comment(linker, "/export:mono_gc_alloc_handle_string") -#pragma comment(linker, "/export:mono_gc_alloc_handle_vector") -#pragma comment(linker, "/export:mono_gc_alloc_mature") -#pragma comment(linker, "/export:mono_gc_alloc_obj") -#pragma comment(linker, "/export:mono_gc_alloc_pinned_obj") -#pragma comment(linker, "/export:mono_gc_alloc_string") -#pragma comment(linker, "/export:mono_gc_alloc_vector") -#pragma comment(linker, "/export:mono_gc_base_cleanup") -#pragma comment(linker, "/export:mono_gc_base_init") -#pragma comment(linker, "/export:mono_gc_bzero_aligned") -#pragma comment(linker, "/export:mono_gc_bzero_atomic") -#pragma comment(linker, "/export:mono_gc_card_table_nursery_check") -#pragma comment(linker, "/export:mono_gc_cleanup") -#pragma comment(linker, "/export:mono_gc_clear_assembly") -#pragma comment(linker, "/export:mono_gc_clear_domain") -#pragma comment(linker, "/export:mono_gc_collect") -#pragma comment(linker, "/export:mono_gc_collection_count") -#pragma comment(linker, "/export:mono_gc_conservatively_scan_area") -#pragma comment(linker, "/export:mono_gc_debug_set") -#pragma comment(linker, "/export:mono_gc_deregister_root") -#pragma comment(linker, "/export:mono_gc_dllmain") -#pragma comment(linker, "/export:mono_gc_ephemeron_array_add") -#pragma comment(linker, "/export:mono_gc_finalize_assembly") -#pragma comment(linker, "/export:mono_gc_finalize_domain") -#pragma comment(linker, "/export:mono_gc_finalize_notify") -#pragma comment(linker, "/export:mono_gc_free_fixed") -#pragma comment(linker, "/export:mono_gc_get_aligned_size_for_allocator") -#pragma comment(linker, "/export:mono_gc_get_bitmap_for_descr") -#pragma comment(linker, "/export:mono_gc_get_card_table") -#pragma comment(linker, "/export:mono_gc_get_description") -#pragma comment(linker, "/export:mono_gc_get_gc_callbacks") -#pragma comment(linker, "/export:mono_gc_get_gc_name") -#pragma comment(linker, "/export:mono_gc_get_generation") -#pragma comment(linker, "/export:mono_gc_get_heap_size") -#pragma comment(linker, "/export:mono_gc_get_logfile") -#pragma comment(linker, "/export:mono_gc_get_los_limit") -#pragma comment(linker, "/export:mono_gc_get_managed_allocator") -#pragma comment(linker, "/export:mono_gc_get_managed_allocator_by_type") -#pragma comment(linker, "/export:mono_gc_get_managed_allocator_types") -#pragma comment(linker, "/export:mono_gc_get_managed_array_allocator") -#pragma comment(linker, "/export:mono_gc_get_nursery") -#pragma comment(linker, "/export:mono_gc_get_range_copy_func") -#pragma comment(linker, "/export:mono_gc_get_restart_signal") -#pragma comment(linker, "/export:mono_gc_get_specific_write_barrier") -#pragma comment(linker, "/export:mono_gc_get_suspend_signal") -#pragma comment(linker, "/export:mono_gc_get_target_card_table") -#pragma comment(linker, "/export:mono_gc_get_used_size") -#pragma comment(linker, "/export:mono_gc_get_vtable") -#pragma comment(linker, "/export:mono_gc_get_vtable_bits") -#pragma comment(linker, "/export:mono_gc_get_write_barrier") -#pragma comment(linker, "/export:mono_gc_init") -#pragma comment(linker, "/export:mono_gc_invoke_finalizers") -#pragma comment(linker, "/export:mono_gc_invoke_with_gc_lock") -#pragma comment(linker, "/export:mono_gc_is_critical_method") -#pragma comment(linker, "/export:mono_gc_is_disabled") -#pragma comment(linker, "/export:mono_gc_is_finalizer_internal_thread") -#pragma comment(linker, "/export:mono_gc_is_finalizer_thread") -#pragma comment(linker, "/export:mono_gc_is_gc_thread") -#pragma comment(linker, "/export:mono_gc_is_moving") -#pragma comment(linker, "/export:mono_gc_is_null") -#pragma comment(linker, "/export:mono_gc_make_descr_for_array") -#pragma comment(linker, "/export:mono_gc_make_descr_for_object") -#pragma comment(linker, "/export:mono_gc_make_descr_for_string") -#pragma comment(linker, "/export:mono_gc_make_descr_from_bitmap") -#pragma comment(linker, "/export:mono_gc_make_root_descr_all_refs") -#pragma comment(linker, "/export:mono_gc_make_root_descr_user") -#pragma comment(linker, "/export:mono_gc_make_vector_descr") -#pragma comment(linker, "/export:mono_gc_max_generation") -#pragma comment(linker, "/export:mono_gc_memmove_aligned") -#pragma comment(linker, "/export:mono_gc_memmove_atomic") -#pragma comment(linker, "/export:mono_gc_params_set") -#pragma comment(linker, "/export:mono_gc_parse_environment_string_extract_number") -#pragma comment(linker, "/export:mono_gc_pending_finalizers") -#pragma comment(linker, "/export:mono_gc_precise_stack_mark_enabled") -#pragma comment(linker, "/export:mono_gc_reference_queue_add") -#pragma comment(linker, "/export:mono_gc_reference_queue_foreach_remove") -#pragma comment(linker, "/export:mono_gc_reference_queue_foreach_remove2") -#pragma comment(linker, "/export:mono_gc_reference_queue_free") -#pragma comment(linker, "/export:mono_gc_reference_queue_new") -#pragma comment(linker, "/export:mono_gc_register_altstack") -#pragma comment(linker, "/export:mono_gc_register_bridge_callbacks") -#pragma comment(linker, "/export:mono_gc_register_finalizer_callbacks") -#pragma comment(linker, "/export:mono_gc_register_for_finalization") -#pragma comment(linker, "/export:mono_gc_register_obj_with_weak_fields") -#pragma comment(linker, "/export:mono_gc_register_object_with_weak_fields") -#pragma comment(linker, "/export:mono_gc_register_root") -#pragma comment(linker, "/export:mono_gc_register_root_wbarrier") -#pragma comment(linker, "/export:mono_gc_run_finalize") -#pragma comment(linker, "/export:mono_gc_scan_for_specific_ref") -#pragma comment(linker, "/export:mono_gc_scan_object") -#pragma comment(linker, "/export:mono_gc_set_desktop_mode") -#pragma comment(linker, "/export:mono_gc_set_gc_callbacks") -#pragma comment(linker, "/export:mono_gc_set_stack_end") -#pragma comment(linker, "/export:mono_gc_set_string_length") -#pragma comment(linker, "/export:mono_gc_skip_thread_changed") -#pragma comment(linker, "/export:mono_gc_skip_thread_changing") -#pragma comment(linker, "/export:mono_gc_stats") -#pragma comment(linker, "/export:mono_gc_suspend_finalizers") -#pragma comment(linker, "/export:mono_gc_thread_attach") -#pragma comment(linker, "/export:mono_gc_thread_detach_with_lock") -#pragma comment(linker, "/export:mono_gc_thread_in_critical_region") -#pragma comment(linker, "/export:mono_gc_toggleref_add") -#pragma comment(linker, "/export:mono_gc_toggleref_register_callback") -#pragma comment(linker, "/export:mono_gc_user_markers_supported") -#pragma comment(linker, "/export:mono_gc_wait_for_bridge_processing") -#pragma comment(linker, "/export:mono_gc_walk_heap") -#pragma comment(linker, "/export:mono_gc_wbarrier_arrayref_copy") -#pragma comment(linker, "/export:mono_gc_wbarrier_generic_nostore") -#pragma comment(linker, "/export:mono_gc_wbarrier_generic_store") -#pragma comment(linker, "/export:mono_gc_wbarrier_generic_store_atomic") -#pragma comment(linker, "/export:mono_gc_wbarrier_object_copy") -#pragma comment(linker, "/export:mono_gc_wbarrier_object_copy_handle") -#pragma comment(linker, "/export:mono_gc_wbarrier_range_copy") -#pragma comment(linker, "/export:mono_gc_wbarrier_set_arrayref") -#pragma comment(linker, "/export:mono_gc_wbarrier_set_field") -#pragma comment(linker, "/export:mono_gc_wbarrier_value_copy") -#pragma comment(linker, "/export:mono_gchandle_free") -#pragma comment(linker, "/export:mono_gchandle_free_domain") -#pragma comment(linker, "/export:mono_gchandle_from_handle") -#pragma comment(linker, "/export:mono_gchandle_get_target") -#pragma comment(linker, "/export:mono_gchandle_get_target_handle") -#pragma comment(linker, "/export:mono_gchandle_is_in_domain") -#pragma comment(linker, "/export:mono_gchandle_new") -#pragma comment(linker, "/export:mono_gchandle_new_weakref") -#pragma comment(linker, "/export:mono_gchandle_set_target") -#pragma comment(linker, "/export:mono_gchandle_set_target_handle") -#pragma comment(linker, "/export:mono_get_addr_from_ftnptr") -#pragma comment(linker, "/export:mono_get_address_info") -#pragma comment(linker, "/export:mono_get_anonymous_container_for_image") -#pragma comment(linker, "/export:mono_get_aot_cache_config") -#pragma comment(linker, "/export:mono_get_array_class") -#pragma comment(linker, "/export:mono_get_assembly_object") -#pragma comment(linker, "/export:mono_get_boolean_class") -#pragma comment(linker, "/export:mono_get_byte_class") -#pragma comment(linker, "/export:mono_get_cached_unwind_info") -#pragma comment(linker, "/export:mono_get_call_filter") -#pragma comment(linker, "/export:mono_get_char_class") -#pragma comment(linker, "/export:mono_get_config_dir") -#pragma comment(linker, "/export:mono_get_constant_value_from_blob") -#pragma comment(linker, "/export:mono_get_context_capture_method") -#pragma comment(linker, "/export:mono_get_corlib") -#pragma comment(linker, "/export:mono_get_dbnull_object") -#pragma comment(linker, "/export:mono_get_delegate_begin_invoke") -#pragma comment(linker, "/export:mono_get_delegate_begin_invoke_checked") -#pragma comment(linker, "/export:mono_get_delegate_end_invoke") -#pragma comment(linker, "/export:mono_get_delegate_end_invoke_checked") -#pragma comment(linker, "/export:mono_get_delegate_invoke") -#pragma comment(linker, "/export:mono_get_delegate_invoke_checked") -#pragma comment(linker, "/export:mono_get_delegate_virtual_invoke_impl") -#pragma comment(linker, "/export:mono_get_delegate_virtual_invoke_impl_name") -#pragma comment(linker, "/export:mono_get_double_class") -#pragma comment(linker, "/export:mono_get_eh_callbacks") -#pragma comment(linker, "/export:mono_get_enum_class") -#pragma comment(linker, "/export:mono_get_exception_appdomain_unloaded") -#pragma comment(linker, "/export:mono_get_exception_argument") -#pragma comment(linker, "/export:mono_get_exception_argument_null") -#pragma comment(linker, "/export:mono_get_exception_argument_out_of_range") -#pragma comment(linker, "/export:mono_get_exception_arithmetic") -#pragma comment(linker, "/export:mono_get_exception_array_type_mismatch") -#pragma comment(linker, "/export:mono_get_exception_bad_image_format") -#pragma comment(linker, "/export:mono_get_exception_bad_image_format2") -#pragma comment(linker, "/export:mono_get_exception_cannot_unload_appdomain") -#pragma comment(linker, "/export:mono_get_exception_class") -#pragma comment(linker, "/export:mono_get_exception_divide_by_zero") -#pragma comment(linker, "/export:mono_get_exception_execution_engine") -#pragma comment(linker, "/export:mono_get_exception_field_access") -#pragma comment(linker, "/export:mono_get_exception_field_access_msg") -#pragma comment(linker, "/export:mono_get_exception_file_not_found") -#pragma comment(linker, "/export:mono_get_exception_file_not_found2") -#pragma comment(linker, "/export:mono_get_exception_index_out_of_range") -#pragma comment(linker, "/export:mono_get_exception_invalid_cast") -#pragma comment(linker, "/export:mono_get_exception_invalid_operation") -#pragma comment(linker, "/export:mono_get_exception_io") -#pragma comment(linker, "/export:mono_get_exception_method_access") -#pragma comment(linker, "/export:mono_get_exception_method_access_msg") -#pragma comment(linker, "/export:mono_get_exception_missing_field") -#pragma comment(linker, "/export:mono_get_exception_missing_method") -#pragma comment(linker, "/export:mono_get_exception_not_implemented") -#pragma comment(linker, "/export:mono_get_exception_not_supported") -#pragma comment(linker, "/export:mono_get_exception_null_reference") -#pragma comment(linker, "/export:mono_get_exception_out_of_memory") -#pragma comment(linker, "/export:mono_get_exception_out_of_memory_handle") -#pragma comment(linker, "/export:mono_get_exception_overflow") -#pragma comment(linker, "/export:mono_get_exception_reflection_type_load") -#pragma comment(linker, "/export:mono_get_exception_reflection_type_load_checked") -#pragma comment(linker, "/export:mono_get_exception_runtime_wrapped") -#pragma comment(linker, "/export:mono_get_exception_runtime_wrapped_handle") -#pragma comment(linker, "/export:mono_get_exception_security") -#pragma comment(linker, "/export:mono_get_exception_serialization") -#pragma comment(linker, "/export:mono_get_exception_stack_overflow") -#pragma comment(linker, "/export:mono_get_exception_synchronization_lock") -#pragma comment(linker, "/export:mono_get_exception_thread_abort") -#pragma comment(linker, "/export:mono_get_exception_thread_interrupted") -#pragma comment(linker, "/export:mono_get_exception_thread_state") -#pragma comment(linker, "/export:mono_get_exception_type_initialization") -#pragma comment(linker, "/export:mono_get_exception_type_initialization_handle") -#pragma comment(linker, "/export:mono_get_exception_type_load") -#pragma comment(linker, "/export:mono_get_generic_trampoline_name") -#pragma comment(linker, "/export:mono_get_generic_trampoline_simple_name") -#pragma comment(linker, "/export:mono_get_hazardous_pointer") -#pragma comment(linker, "/export:mono_get_image_for_generic_param") -#pragma comment(linker, "/export:mono_get_inflated_method") -#pragma comment(linker, "/export:mono_get_int16_class") -#pragma comment(linker, "/export:mono_get_int32_class") -#pragma comment(linker, "/export:mono_get_int64_class") -#pragma comment(linker, "/export:mono_get_intptr_class") -#pragma comment(linker, "/export:mono_get_jit_icall_info") -#pragma comment(linker, "/export:mono_get_lmf") -#pragma comment(linker, "/export:mono_get_local_interfaces") -#pragma comment(linker, "/export:mono_get_machine_config") -#pragma comment(linker, "/export:mono_get_method") -#pragma comment(linker, "/export:mono_get_method_checked") -#pragma comment(linker, "/export:mono_get_method_constrained") -#pragma comment(linker, "/export:mono_get_method_constrained_checked") -#pragma comment(linker, "/export:mono_get_method_constrained_with_method") -#pragma comment(linker, "/export:mono_get_method_from_ip") -#pragma comment(linker, "/export:mono_get_method_full") -#pragma comment(linker, "/export:mono_get_method_object") -#pragma comment(linker, "/export:mono_get_module_file_name") -#pragma comment(linker, "/export:mono_get_native_calli_wrapper") -#pragma comment(linker, "/export:mono_get_object_class") -#pragma comment(linker, "/export:mono_get_object_from_blob") -#pragma comment(linker, "/export:mono_get_optimizations_for_method") -#pragma comment(linker, "/export:mono_get_restore_context") -#pragma comment(linker, "/export:mono_get_rethrow_exception") -#pragma comment(linker, "/export:mono_get_rgctx_fetch_trampoline_name") -#pragma comment(linker, "/export:mono_get_root_domain") -#pragma comment(linker, "/export:mono_get_runtime_build_info") -#pragma comment(linker, "/export:mono_get_runtime_callbacks") -#pragma comment(linker, "/export:mono_get_runtime_info") -#pragma comment(linker, "/export:mono_get_sbyte_class") -#pragma comment(linker, "/export:mono_get_seq_points") -#pragma comment(linker, "/export:mono_get_shared_generic_inst") -#pragma comment(linker, "/export:mono_get_single_class") -#pragma comment(linker, "/export:mono_get_special_static_data") -#pragma comment(linker, "/export:mono_get_special_static_data_for_thread") -#pragma comment(linker, "/export:mono_get_string_class") -#pragma comment(linker, "/export:mono_get_thread_class") -#pragma comment(linker, "/export:mono_get_throw_corlib_exception") -#pragma comment(linker, "/export:mono_get_throw_exception") -#pragma comment(linker, "/export:mono_get_throw_exception_addr") -#pragma comment(linker, "/export:mono_get_trampoline_code") -#pragma comment(linker, "/export:mono_get_trampoline_func") -#pragma comment(linker, "/export:mono_get_uint16_class") -#pragma comment(linker, "/export:mono_get_uint32_class") -#pragma comment(linker, "/export:mono_get_uint64_class") -#pragma comment(linker, "/export:mono_get_uintptr_class") -#pragma comment(linker, "/export:mono_get_void_class") -#pragma comment(linker, "/export:mono_image_add_to_name_cache") -#pragma comment(linker, "/export:mono_image_addref") -#pragma comment(linker, "/export:mono_image_alloc") -#pragma comment(linker, "/export:mono_image_alloc0") -#pragma comment(linker, "/export:mono_image_append_class_to_reflection_info_set") -#pragma comment(linker, "/export:mono_image_build_metadata") -#pragma comment(linker, "/export:mono_image_check_for_module_cctor") -#pragma comment(linker, "/export:mono_image_close") -#pragma comment(linker, "/export:mono_image_close_except_pools") -#pragma comment(linker, "/export:mono_image_close_finish") -#pragma comment(linker, "/export:mono_image_create_pefile") -#pragma comment(linker, "/export:mono_image_create_token") -#pragma comment(linker, "/export:mono_image_ensure_section") -#pragma comment(linker, "/export:mono_image_ensure_section_idx") -#pragma comment(linker, "/export:mono_image_fixup_vtable") -#pragma comment(linker, "/export:mono_image_g_malloc0") -#pragma comment(linker, "/export:mono_image_get_assembly") -#pragma comment(linker, "/export:mono_image_get_entry_point") -#pragma comment(linker, "/export:mono_image_get_filename") -#pragma comment(linker, "/export:mono_image_get_guid") -#pragma comment(linker, "/export:mono_image_get_methodref_token") -#pragma comment(linker, "/export:mono_image_get_name") -#pragma comment(linker, "/export:mono_image_get_public_key") -#pragma comment(linker, "/export:mono_image_get_resource") -#pragma comment(linker, "/export:mono_image_get_strong_name") -#pragma comment(linker, "/export:mono_image_get_table_info") -#pragma comment(linker, "/export:mono_image_get_table_rows") -#pragma comment(linker, "/export:mono_image_has_authenticode_entry") -#pragma comment(linker, "/export:mono_image_init") -#pragma comment(linker, "/export:mono_image_init_name_cache") -#pragma comment(linker, "/export:mono_image_insert_string") -#pragma comment(linker, "/export:mono_image_is_dynamic") -#pragma comment(linker, "/export:mono_image_load_cli_data") -#pragma comment(linker, "/export:mono_image_load_cli_header") -#pragma comment(linker, "/export:mono_image_load_file_for_image") -#pragma comment(linker, "/export:mono_image_load_file_for_image_checked") -#pragma comment(linker, "/export:mono_image_load_metadata") -#pragma comment(linker, "/export:mono_image_load_module") -#pragma comment(linker, "/export:mono_image_load_module_checked") -#pragma comment(linker, "/export:mono_image_load_names") -#pragma comment(linker, "/export:mono_image_load_pe_data") -#pragma comment(linker, "/export:mono_image_loaded") -#pragma comment(linker, "/export:mono_image_loaded_by_guid") -#pragma comment(linker, "/export:mono_image_loaded_by_guid_full") -#pragma comment(linker, "/export:mono_image_loaded_full") -#pragma comment(linker, "/export:mono_image_loaded_internal") -#pragma comment(linker, "/export:mono_image_lock") -#pragma comment(linker, "/export:mono_image_lookup_resource") -#pragma comment(linker, "/export:mono_image_open") -#pragma comment(linker, "/export:mono_image_open_a_lot") -#pragma comment(linker, "/export:mono_image_open_from_data") -#pragma comment(linker, "/export:mono_image_open_from_data_full") -#pragma comment(linker, "/export:mono_image_open_from_data_internal") -#pragma comment(linker, "/export:mono_image_open_from_data_with_name") -#pragma comment(linker, "/export:mono_image_open_from_module_handle") -#pragma comment(linker, "/export:mono_image_open_full") -#pragma comment(linker, "/export:mono_image_open_metadata_only") -#pragma comment(linker, "/export:mono_image_open_raw") -#pragma comment(linker, "/export:mono_image_property_insert") -#pragma comment(linker, "/export:mono_image_property_lookup") -#pragma comment(linker, "/export:mono_image_property_remove") -#pragma comment(linker, "/export:mono_image_rva_map") -#pragma comment(linker, "/export:mono_image_set_alloc") -#pragma comment(linker, "/export:mono_image_set_alloc0") -#pragma comment(linker, "/export:mono_image_set_description") -#pragma comment(linker, "/export:mono_image_set_lock") -#pragma comment(linker, "/export:mono_image_set_strdup") -#pragma comment(linker, "/export:mono_image_set_unlock") -#pragma comment(linker, "/export:mono_image_strdup") -#pragma comment(linker, "/export:mono_image_strdup_printf") -#pragma comment(linker, "/export:mono_image_strdup_vprintf") -#pragma comment(linker, "/export:mono_image_strerror") -#pragma comment(linker, "/export:mono_image_strong_name_position") -#pragma comment(linker, "/export:mono_image_unlock") -#pragma comment(linker, "/export:mono_metadata_blob_heap") -#pragma comment(linker, "/export:mono_metadata_blob_heap_checked") -#pragma comment(linker, "/export:mono_metadata_clean_for_image") -#pragma comment(linker, "/export:mono_metadata_cleanup") -#pragma comment(linker, "/export:mono_metadata_compute_size") -#pragma comment(linker, "/export:mono_metadata_compute_table_bases") -#pragma comment(linker, "/export:mono_metadata_create_anon_gparam") -#pragma comment(linker, "/export:mono_metadata_cross_helpers_run") -#pragma comment(linker, "/export:mono_metadata_custom_attrs_from_index") -#pragma comment(linker, "/export:mono_metadata_declsec_from_index") -#pragma comment(linker, "/export:mono_metadata_decode_blob_size") -#pragma comment(linker, "/export:mono_metadata_decode_row") -#pragma comment(linker, "/export:mono_metadata_decode_row_checked") -#pragma comment(linker, "/export:mono_metadata_decode_row_col") -#pragma comment(linker, "/export:mono_metadata_decode_signed_value") -#pragma comment(linker, "/export:mono_metadata_decode_table_row") -#pragma comment(linker, "/export:mono_metadata_decode_table_row_col") -#pragma comment(linker, "/export:mono_metadata_decode_value") -#pragma comment(linker, "/export:mono_metadata_encode_value") -#pragma comment(linker, "/export:mono_metadata_events_from_typedef") -#pragma comment(linker, "/export:mono_metadata_field_info") -#pragma comment(linker, "/export:mono_metadata_field_info_with_mempool") -#pragma comment(linker, "/export:mono_metadata_free_array") -#pragma comment(linker, "/export:mono_metadata_free_inflated_signature") -#pragma comment(linker, "/export:mono_metadata_free_marshal_spec") -#pragma comment(linker, "/export:mono_metadata_free_method_signature") -#pragma comment(linker, "/export:mono_metadata_free_mh") -#pragma comment(linker, "/export:mono_metadata_free_type") -#pragma comment(linker, "/export:mono_metadata_generic_class_is_valuetype") -#pragma comment(linker, "/export:mono_metadata_generic_context_equal") -#pragma comment(linker, "/export:mono_metadata_generic_context_hash") -#pragma comment(linker, "/export:mono_metadata_generic_inst_equal") -#pragma comment(linker, "/export:mono_metadata_generic_inst_hash") -#pragma comment(linker, "/export:mono_metadata_generic_param_equal") -#pragma comment(linker, "/export:mono_metadata_generic_param_hash") -#pragma comment(linker, "/export:mono_metadata_get_canonical_generic_inst") -#pragma comment(linker, "/export:mono_metadata_get_constant_index") -#pragma comment(linker, "/export:mono_metadata_get_corresponding_event_from_generic_type_definition") -#pragma comment(linker, "/export:mono_metadata_get_corresponding_field_from_generic_type_definition") -#pragma comment(linker, "/export:mono_metadata_get_corresponding_property_from_generic_type_definition") -#pragma comment(linker, "/export:mono_metadata_get_generic_inst") -#pragma comment(linker, "/export:mono_metadata_get_generic_param_row") -#pragma comment(linker, "/export:mono_metadata_get_image_set_for_class") -#pragma comment(linker, "/export:mono_metadata_get_image_set_for_method") -#pragma comment(linker, "/export:mono_metadata_get_inflated_signature") -#pragma comment(linker, "/export:mono_metadata_get_marshal_info") -#pragma comment(linker, "/export:mono_metadata_get_param_attrs") -#pragma comment(linker, "/export:mono_metadata_get_shared_type") -#pragma comment(linker, "/export:mono_metadata_guid_heap") -#pragma comment(linker, "/export:mono_metadata_has_generic_params") -#pragma comment(linker, "/export:mono_metadata_implmap_from_method") -#pragma comment(linker, "/export:mono_metadata_inflate_generic_inst") -#pragma comment(linker, "/export:mono_metadata_init") -#pragma comment(linker, "/export:mono_metadata_interfaces_from_typedef") -#pragma comment(linker, "/export:mono_metadata_interfaces_from_typedef_full") -#pragma comment(linker, "/export:mono_metadata_load_generic_param_constraints_checked") -#pragma comment(linker, "/export:mono_metadata_load_generic_params") -#pragma comment(linker, "/export:mono_metadata_localscope_from_methoddef") -#pragma comment(linker, "/export:mono_metadata_locate") -#pragma comment(linker, "/export:mono_metadata_locate_token") -#pragma comment(linker, "/export:mono_metadata_lookup_generic_class") -#pragma comment(linker, "/export:mono_metadata_method_has_param_attrs") -#pragma comment(linker, "/export:mono_metadata_methods_from_event") -#pragma comment(linker, "/export:mono_metadata_methods_from_property") -#pragma comment(linker, "/export:mono_metadata_nested_in_typedef") -#pragma comment(linker, "/export:mono_metadata_nesting_typedef") -#pragma comment(linker, "/export:mono_metadata_packing_from_typedef") -#pragma comment(linker, "/export:mono_metadata_parse_array") -#pragma comment(linker, "/export:mono_metadata_parse_custom_mod") -#pragma comment(linker, "/export:mono_metadata_parse_field_type") -#pragma comment(linker, "/export:mono_metadata_parse_generic_inst") -#pragma comment(linker, "/export:mono_metadata_parse_marshal_spec") -#pragma comment(linker, "/export:mono_metadata_parse_marshal_spec_full") -#pragma comment(linker, "/export:mono_metadata_parse_method_signature") -#pragma comment(linker, "/export:mono_metadata_parse_method_signature_full") -#pragma comment(linker, "/export:mono_metadata_parse_mh") -#pragma comment(linker, "/export:mono_metadata_parse_mh_full") -#pragma comment(linker, "/export:mono_metadata_parse_param") -#pragma comment(linker, "/export:mono_metadata_parse_signature") -#pragma comment(linker, "/export:mono_metadata_parse_signature_checked") -#pragma comment(linker, "/export:mono_metadata_parse_type") -#pragma comment(linker, "/export:mono_metadata_parse_type_checked") -#pragma comment(linker, "/export:mono_metadata_parse_typedef_or_ref") -#pragma comment(linker, "/export:mono_metadata_properties_from_typedef") -#pragma comment(linker, "/export:mono_metadata_read_constant_value") -#pragma comment(linker, "/export:mono_metadata_signature_alloc") -#pragma comment(linker, "/export:mono_metadata_signature_deep_dup") -#pragma comment(linker, "/export:mono_metadata_signature_dup") -#pragma comment(linker, "/export:mono_metadata_signature_dup_add_this") -#pragma comment(linker, "/export:mono_metadata_signature_dup_full") -#pragma comment(linker, "/export:mono_metadata_signature_dup_mempool") -#pragma comment(linker, "/export:mono_metadata_signature_equal") -#pragma comment(linker, "/export:mono_metadata_signature_size") -#pragma comment(linker, "/export:mono_metadata_str_hash") -#pragma comment(linker, "/export:mono_metadata_string_heap") -#pragma comment(linker, "/export:mono_metadata_string_heap_checked") -#pragma comment(linker, "/export:mono_metadata_token_from_dor") -#pragma comment(linker, "/export:mono_metadata_translate_token_index") -#pragma comment(linker, "/export:mono_metadata_type_dup") -#pragma comment(linker, "/export:mono_metadata_type_dup_with_cmods") -#pragma comment(linker, "/export:mono_metadata_type_equal") -#pragma comment(linker, "/export:mono_metadata_type_equal_full") -#pragma comment(linker, "/export:mono_metadata_type_hash") -#pragma comment(linker, "/export:mono_metadata_typedef_from_field") -#pragma comment(linker, "/export:mono_metadata_typedef_from_method") -#pragma comment(linker, "/export:mono_metadata_user_string") -#pragma comment(linker, "/export:mono_method_add_generic_virtual_invocation") -#pragma comment(linker, "/export:mono_method_alloc_generic_virtual_trampoline") -#pragma comment(linker, "/export:mono_method_body_get_object") -#pragma comment(linker, "/export:mono_method_body_get_object_handle") -#pragma comment(linker, "/export:mono_method_builder_ilgen_init") -#pragma comment(linker, "/export:mono_method_call_message_new") -#pragma comment(linker, "/export:mono_method_can_access_field") -#pragma comment(linker, "/export:mono_method_can_access_field_full") -#pragma comment(linker, "/export:mono_method_can_access_method") -#pragma comment(linker, "/export:mono_method_can_access_method_full") -#pragma comment(linker, "/export:mono_method_check_context_used") -#pragma comment(linker, "/export:mono_method_clear_object") -#pragma comment(linker, "/export:mono_method_construct_object_context") -#pragma comment(linker, "/export:mono_method_desc_free") -#pragma comment(linker, "/export:mono_method_desc_from_method") -#pragma comment(linker, "/export:mono_method_desc_full_match") -#pragma comment(linker, "/export:mono_method_desc_is_full") -#pragma comment(linker, "/export:mono_method_desc_match") -#pragma comment(linker, "/export:mono_method_desc_new") -#pragma comment(linker, "/export:mono_method_desc_search_in_class") -#pragma comment(linker, "/export:mono_method_desc_search_in_image") -#pragma comment(linker, "/export:mono_method_fill_runtime_generic_context") -#pragma comment(linker, "/export:mono_method_from_method_def_or_ref") -#pragma comment(linker, "/export:mono_method_full_name") -#pragma comment(linker, "/export:mono_method_get_base_method") -#pragma comment(linker, "/export:mono_method_get_class") -#pragma comment(linker, "/export:mono_method_get_context") -#pragma comment(linker, "/export:mono_method_get_context_general") -#pragma comment(linker, "/export:mono_method_get_declaring_generic_method") -#pragma comment(linker, "/export:mono_method_get_flags") -#pragma comment(linker, "/export:mono_method_get_full_name") -#pragma comment(linker, "/export:mono_method_get_generic_container") -#pragma comment(linker, "/export:mono_method_get_header") -#pragma comment(linker, "/export:mono_method_get_header_checked") -#pragma comment(linker, "/export:mono_method_get_header_internal") -#pragma comment(linker, "/export:mono_method_get_header_summary") -#pragma comment(linker, "/export:mono_method_get_imt_slot") -#pragma comment(linker, "/export:mono_method_get_index") -#pragma comment(linker, "/export:mono_method_get_last_managed") -#pragma comment(linker, "/export:mono_method_get_marshal_info") -#pragma comment(linker, "/export:mono_method_get_name") -#pragma comment(linker, "/export:mono_method_get_name_full") -#pragma comment(linker, "/export:mono_method_get_object") -#pragma comment(linker, "/export:mono_method_get_object_checked") -#pragma comment(linker, "/export:mono_method_get_object_handle") -#pragma comment(linker, "/export:mono_method_get_param_names") -#pragma comment(linker, "/export:mono_method_get_param_token") -#pragma comment(linker, "/export:mono_method_get_reflection_name") -#pragma comment(linker, "/export:mono_method_get_signature") -#pragma comment(linker, "/export:mono_method_get_signature_checked") -#pragma comment(linker, "/export:mono_method_get_signature_full") -#pragma comment(linker, "/export:mono_method_get_token") -#pragma comment(linker, "/export:mono_method_get_unmanaged_thunk") -#pragma comment(linker, "/export:mono_method_get_vtable_index") -#pragma comment(linker, "/export:mono_method_get_vtable_slot") -#pragma comment(linker, "/export:mono_method_get_wrapper_cache") -#pragma comment(linker, "/export:mono_method_get_wrapper_data") -#pragma comment(linker, "/export:mono_method_has_marshal_info") -#pragma comment(linker, "/export:mono_method_has_no_body") -#pragma comment(linker, "/export:mono_method_header_get_clauses") -#pragma comment(linker, "/export:mono_method_header_get_code") -#pragma comment(linker, "/export:mono_method_header_get_locals") -#pragma comment(linker, "/export:mono_method_header_get_num_clauses") -#pragma comment(linker, "/export:mono_method_is_from_assembly") -#pragma comment(linker, "/export:mono_method_is_generic_impl") -#pragma comment(linker, "/export:mono_method_is_generic_sharable") -#pragma comment(linker, "/export:mono_method_is_generic_sharable_full") -#pragma comment(linker, "/export:mono_method_lookup_or_register_info") -#pragma comment(linker, "/export:mono_method_needs_static_rgctx_invoke") -#pragma comment(linker, "/export:mono_method_print_code") -#pragma comment(linker, "/export:mono_method_return_message_restore") -#pragma comment(linker, "/export:mono_method_same_domain") -#pragma comment(linker, "/export:mono_method_search_in_array_class") -#pragma comment(linker, "/export:mono_method_set_generic_container") -#pragma comment(linker, "/export:mono_method_signature") -#pragma comment(linker, "/export:mono_method_signature_checked") -#pragma comment(linker, "/export:mono_method_verify") -#pragma comment(linker, "/export:mono_method_verify_with_current_settings") -#pragma comment(linker, "/export:mono_object_castclass_mbyref") -#pragma comment(linker, "/export:mono_object_castclass_unbox") -#pragma comment(linker, "/export:mono_object_castclass_with_cache") -#pragma comment(linker, "/export:mono_object_clone") -#pragma comment(linker, "/export:mono_object_clone_checked") -#pragma comment(linker, "/export:mono_object_clone_handle") -#pragma comment(linker, "/export:mono_object_describe") -#pragma comment(linker, "/export:mono_object_describe_fields") -#pragma comment(linker, "/export:mono_object_get_class") -#pragma comment(linker, "/export:mono_object_get_data") -#pragma comment(linker, "/export:mono_object_get_domain") -#pragma comment(linker, "/export:mono_object_get_size") -#pragma comment(linker, "/export:mono_object_get_virtual_method") -#pragma comment(linker, "/export:mono_object_get_vtable") -#pragma comment(linker, "/export:mono_object_handle_get_virtual_method") -#pragma comment(linker, "/export:mono_object_handle_isinst") -#pragma comment(linker, "/export:mono_object_handle_isinst_mbyref") -#pragma comment(linker, "/export:mono_object_handle_pin_unbox") -#pragma comment(linker, "/export:mono_object_hash") -#pragma comment(linker, "/export:mono_object_is_alive") -#pragma comment(linker, "/export:mono_object_is_from_assembly") -#pragma comment(linker, "/export:mono_object_isinst") -#pragma comment(linker, "/export:mono_object_isinst_checked") -#pragma comment(linker, "/export:mono_object_isinst_icall") -#pragma comment(linker, "/export:mono_object_isinst_mbyref") -#pragma comment(linker, "/export:mono_object_isinst_with_cache") -#pragma comment(linker, "/export:mono_object_new") -#pragma comment(linker, "/export:mono_object_new_alloc_by_vtable") -#pragma comment(linker, "/export:mono_object_new_alloc_specific") -#pragma comment(linker, "/export:mono_object_new_alloc_specific_checked") -#pragma comment(linker, "/export:mono_object_new_checked") -#pragma comment(linker, "/export:mono_object_new_fast") -#pragma comment(linker, "/export:mono_object_new_from_token") -#pragma comment(linker, "/export:mono_object_new_handle") -#pragma comment(linker, "/export:mono_object_new_handle_mature") -#pragma comment(linker, "/export:mono_object_new_mature") -#pragma comment(linker, "/export:mono_object_new_pinned") -#pragma comment(linker, "/export:mono_object_new_pinned_handle") -#pragma comment(linker, "/export:mono_object_new_specific") -#pragma comment(linker, "/export:mono_object_new_specific_checked") -#pragma comment(linker, "/export:mono_object_register_finalizer") -#pragma comment(linker, "/export:mono_object_register_finalizer_handle") -#pragma comment(linker, "/export:mono_object_to_string") -#pragma comment(linker, "/export:mono_object_try_to_string") -#pragma comment(linker, "/export:mono_object_unbox") -#pragma comment(linker, "/export:mono_object_xdomain_representation") -#pragma comment(linker, "/export:mono_profiler_call_context_free_buffer") -#pragma comment(linker, "/export:mono_profiler_call_context_get_argument") -#pragma comment(linker, "/export:mono_profiler_call_context_get_local") -#pragma comment(linker, "/export:mono_profiler_call_context_get_result") -#pragma comment(linker, "/export:mono_profiler_call_context_get_this") -#pragma comment(linker, "/export:mono_profiler_cleanup") -#pragma comment(linker, "/export:mono_profiler_coverage_alloc") -#pragma comment(linker, "/export:mono_profiler_coverage_instrumentation_enabled") -#pragma comment(linker, "/export:mono_profiler_create") -#pragma comment(linker, "/export:mono_profiler_enable_allocations") -#pragma comment(linker, "/export:mono_profiler_enable_call_context_introspection") -#pragma comment(linker, "/export:mono_profiler_enable_clauses") -#pragma comment(linker, "/export:mono_profiler_enable_coverage") -#pragma comment(linker, "/export:mono_profiler_enable_sampling") -#pragma comment(linker, "/export:mono_profiler_get_call_instrumentation_flags") -#pragma comment(linker, "/export:mono_profiler_get_coverage_data") -#pragma comment(linker, "/export:mono_profiler_get_sample_mode") -#pragma comment(linker, "/export:mono_profiler_install") -#pragma comment(linker, "/export:mono_profiler_install_allocation") -#pragma comment(linker, "/export:mono_profiler_install_enter_leave") -#pragma comment(linker, "/export:mono_profiler_install_exception") -#pragma comment(linker, "/export:mono_profiler_install_gc") -#pragma comment(linker, "/export:mono_profiler_install_jit_end") -#pragma comment(linker, "/export:mono_profiler_install_thread") -#pragma comment(linker, "/export:mono_profiler_load") -#pragma comment(linker, "/export:mono_profiler_raise_assembly_loaded") -#pragma comment(linker, "/export:mono_profiler_raise_assembly_loading") -#pragma comment(linker, "/export:mono_profiler_raise_assembly_unloaded") -#pragma comment(linker, "/export:mono_profiler_raise_assembly_unloading") -#pragma comment(linker, "/export:mono_profiler_raise_class_failed") -#pragma comment(linker, "/export:mono_profiler_raise_class_loaded") -#pragma comment(linker, "/export:mono_profiler_raise_class_loading") -#pragma comment(linker, "/export:mono_profiler_raise_context_loaded") -#pragma comment(linker, "/export:mono_profiler_raise_context_unloaded") -#pragma comment(linker, "/export:mono_profiler_raise_domain_loaded") -#pragma comment(linker, "/export:mono_profiler_raise_domain_loading") -#pragma comment(linker, "/export:mono_profiler_raise_domain_name") -#pragma comment(linker, "/export:mono_profiler_raise_domain_unloaded") -#pragma comment(linker, "/export:mono_profiler_raise_domain_unloading") -#pragma comment(linker, "/export:mono_profiler_raise_exception_clause") -#pragma comment(linker, "/export:mono_profiler_raise_exception_throw") -#pragma comment(linker, "/export:mono_profiler_raise_gc_allocation") -#pragma comment(linker, "/export:mono_profiler_raise_gc_event") -#pragma comment(linker, "/export:mono_profiler_raise_gc_finalized") -#pragma comment(linker, "/export:mono_profiler_raise_gc_finalized_object") -#pragma comment(linker, "/export:mono_profiler_raise_gc_finalizing") -#pragma comment(linker, "/export:mono_profiler_raise_gc_finalizing_object") -#pragma comment(linker, "/export:mono_profiler_raise_gc_handle_created") -#pragma comment(linker, "/export:mono_profiler_raise_gc_handle_deleted") -#pragma comment(linker, "/export:mono_profiler_raise_gc_moves") -#pragma comment(linker, "/export:mono_profiler_raise_gc_resize") -#pragma comment(linker, "/export:mono_profiler_raise_gc_root_register") -#pragma comment(linker, "/export:mono_profiler_raise_gc_root_unregister") -#pragma comment(linker, "/export:mono_profiler_raise_gc_roots") -#pragma comment(linker, "/export:mono_profiler_raise_image_failed") -#pragma comment(linker, "/export:mono_profiler_raise_image_loaded") -#pragma comment(linker, "/export:mono_profiler_raise_image_loading") -#pragma comment(linker, "/export:mono_profiler_raise_image_unloaded") -#pragma comment(linker, "/export:mono_profiler_raise_image_unloading") -#pragma comment(linker, "/export:mono_profiler_raise_jit_begin") -#pragma comment(linker, "/export:mono_profiler_raise_jit_chunk_created") -#pragma comment(linker, "/export:mono_profiler_raise_jit_chunk_destroyed") -#pragma comment(linker, "/export:mono_profiler_raise_jit_code_buffer") -#pragma comment(linker, "/export:mono_profiler_raise_jit_done") -#pragma comment(linker, "/export:mono_profiler_raise_jit_failed") -#pragma comment(linker, "/export:mono_profiler_raise_method_begin_invoke") -#pragma comment(linker, "/export:mono_profiler_raise_method_end_invoke") -#pragma comment(linker, "/export:mono_profiler_raise_method_enter") -#pragma comment(linker, "/export:mono_profiler_raise_method_exception_leave") -#pragma comment(linker, "/export:mono_profiler_raise_method_free") -#pragma comment(linker, "/export:mono_profiler_raise_method_leave") -#pragma comment(linker, "/export:mono_profiler_raise_method_tail_call") -#pragma comment(linker, "/export:mono_profiler_raise_monitor_acquired") -#pragma comment(linker, "/export:mono_profiler_raise_monitor_contention") -#pragma comment(linker, "/export:mono_profiler_raise_monitor_failed") -#pragma comment(linker, "/export:mono_profiler_raise_runtime_initialized") -#pragma comment(linker, "/export:mono_profiler_raise_runtime_shutdown_begin") -#pragma comment(linker, "/export:mono_profiler_raise_runtime_shutdown_end") -#pragma comment(linker, "/export:mono_profiler_raise_sample_hit") -#pragma comment(linker, "/export:mono_profiler_raise_thread_exited") -#pragma comment(linker, "/export:mono_profiler_raise_thread_name") -#pragma comment(linker, "/export:mono_profiler_raise_thread_started") -#pragma comment(linker, "/export:mono_profiler_raise_thread_stopped") -#pragma comment(linker, "/export:mono_profiler_raise_thread_stopping") -#pragma comment(linker, "/export:mono_profiler_raise_vtable_failed") -#pragma comment(linker, "/export:mono_profiler_raise_vtable_loaded") -#pragma comment(linker, "/export:mono_profiler_raise_vtable_loading") -#pragma comment(linker, "/export:mono_profiler_sampling_enabled") -#pragma comment(linker, "/export:mono_profiler_sampling_thread_post") -#pragma comment(linker, "/export:mono_profiler_sampling_thread_wait") -#pragma comment(linker, "/export:mono_profiler_set_assembly_loaded_callback") -#pragma comment(linker, "/export:mono_profiler_set_assembly_loading_callback") -#pragma comment(linker, "/export:mono_profiler_set_assembly_unloaded_callback") -#pragma comment(linker, "/export:mono_profiler_set_assembly_unloading_callback") -#pragma comment(linker, "/export:mono_profiler_set_call_instrumentation_filter_callback") -#pragma comment(linker, "/export:mono_profiler_set_class_failed_callback") -#pragma comment(linker, "/export:mono_profiler_set_class_loaded_callback") -#pragma comment(linker, "/export:mono_profiler_set_class_loading_callback") -#pragma comment(linker, "/export:mono_profiler_set_cleanup_callback") -#pragma comment(linker, "/export:mono_profiler_set_context_loaded_callback") -#pragma comment(linker, "/export:mono_profiler_set_context_unloaded_callback") -#pragma comment(linker, "/export:mono_profiler_set_coverage_filter_callback") -#pragma comment(linker, "/export:mono_profiler_set_domain_loaded_callback") -#pragma comment(linker, "/export:mono_profiler_set_domain_loading_callback") -#pragma comment(linker, "/export:mono_profiler_set_domain_name_callback") -#pragma comment(linker, "/export:mono_profiler_set_domain_unloaded_callback") -#pragma comment(linker, "/export:mono_profiler_set_domain_unloading_callback") -#pragma comment(linker, "/export:mono_profiler_set_events") -#pragma comment(linker, "/export:mono_profiler_set_exception_clause_callback") -#pragma comment(linker, "/export:mono_profiler_set_exception_throw_callback") -#pragma comment(linker, "/export:mono_profiler_set_gc_allocation_callback") -#pragma comment(linker, "/export:mono_profiler_set_gc_event_callback") -#pragma comment(linker, "/export:mono_profiler_set_gc_finalized_callback") -#pragma comment(linker, "/export:mono_profiler_set_gc_finalized_object_callback") -#pragma comment(linker, "/export:mono_profiler_set_gc_finalizing_callback") -#pragma comment(linker, "/export:mono_profiler_set_gc_finalizing_object_callback") -#pragma comment(linker, "/export:mono_profiler_set_gc_handle_created_callback") -#pragma comment(linker, "/export:mono_profiler_set_gc_handle_deleted_callback") -#pragma comment(linker, "/export:mono_profiler_set_gc_moves_callback") -#pragma comment(linker, "/export:mono_profiler_set_gc_resize_callback") -#pragma comment(linker, "/export:mono_profiler_set_gc_root_register_callback") -#pragma comment(linker, "/export:mono_profiler_set_gc_root_unregister_callback") -#pragma comment(linker, "/export:mono_profiler_set_gc_roots_callback") -#pragma comment(linker, "/export:mono_profiler_set_image_failed_callback") -#pragma comment(linker, "/export:mono_profiler_set_image_loaded_callback") -#pragma comment(linker, "/export:mono_profiler_set_image_loading_callback") -#pragma comment(linker, "/export:mono_profiler_set_image_unloaded_callback") -#pragma comment(linker, "/export:mono_profiler_set_image_unloading_callback") -#pragma comment(linker, "/export:mono_profiler_set_jit_begin_callback") -#pragma comment(linker, "/export:mono_profiler_set_jit_chunk_created_callback") -#pragma comment(linker, "/export:mono_profiler_set_jit_chunk_destroyed_callback") -#pragma comment(linker, "/export:mono_profiler_set_jit_code_buffer_callback") -#pragma comment(linker, "/export:mono_profiler_set_jit_done_callback") -#pragma comment(linker, "/export:mono_profiler_set_jit_failed_callback") -#pragma comment(linker, "/export:mono_profiler_set_method_begin_invoke_callback") -#pragma comment(linker, "/export:mono_profiler_set_method_end_invoke_callback") -#pragma comment(linker, "/export:mono_profiler_set_method_enter_callback") -#pragma comment(linker, "/export:mono_profiler_set_method_exception_leave_callback") -#pragma comment(linker, "/export:mono_profiler_set_method_free_callback") -#pragma comment(linker, "/export:mono_profiler_set_method_leave_callback") -#pragma comment(linker, "/export:mono_profiler_set_method_tail_call_callback") -#pragma comment(linker, "/export:mono_profiler_set_monitor_acquired_callback") -#pragma comment(linker, "/export:mono_profiler_set_monitor_contention_callback") -#pragma comment(linker, "/export:mono_profiler_set_monitor_failed_callback") -#pragma comment(linker, "/export:mono_profiler_set_runtime_initialized_callback") -#pragma comment(linker, "/export:mono_profiler_set_runtime_shutdown_begin_callback") -#pragma comment(linker, "/export:mono_profiler_set_runtime_shutdown_end_callback") -#pragma comment(linker, "/export:mono_profiler_set_sample_hit_callback") -#pragma comment(linker, "/export:mono_profiler_set_sample_mode") -#pragma comment(linker, "/export:mono_profiler_set_thread_exited_callback") -#pragma comment(linker, "/export:mono_profiler_set_thread_name_callback") -#pragma comment(linker, "/export:mono_profiler_set_thread_started_callback") -#pragma comment(linker, "/export:mono_profiler_set_thread_stopped_callback") -#pragma comment(linker, "/export:mono_profiler_set_thread_stopping_callback") -#pragma comment(linker, "/export:mono_profiler_set_vtable_failed_callback") -#pragma comment(linker, "/export:mono_profiler_set_vtable_loaded_callback") -#pragma comment(linker, "/export:mono_profiler_set_vtable_loading_callback") -#pragma comment(linker, "/export:mono_profiler_started") -#pragma comment(linker, "/export:mono_profiler_state") -#pragma comment(linker, "/export:mono_property_bag_add") -#pragma comment(linker, "/export:mono_property_bag_get") -#pragma comment(linker, "/export:mono_property_get_flags") -#pragma comment(linker, "/export:mono_property_get_get_method") -#pragma comment(linker, "/export:mono_property_get_name") -#pragma comment(linker, "/export:mono_property_get_object") -#pragma comment(linker, "/export:mono_property_get_object_checked") -#pragma comment(linker, "/export:mono_property_get_object_handle") -#pragma comment(linker, "/export:mono_property_get_parent") -#pragma comment(linker, "/export:mono_property_get_set_method") -#pragma comment(linker, "/export:mono_property_get_value") -#pragma comment(linker, "/export:mono_property_get_value_checked") -#pragma comment(linker, "/export:mono_property_hash_destroy") -#pragma comment(linker, "/export:mono_property_hash_insert") -#pragma comment(linker, "/export:mono_property_hash_lookup") -#pragma comment(linker, "/export:mono_property_hash_new") -#pragma comment(linker, "/export:mono_property_hash_remove_object") -#pragma comment(linker, "/export:mono_property_set_value") -#pragma comment(linker, "/export:mono_property_set_value_handle") -#pragma comment(linker, "/export:mono_raise_exception") -#pragma comment(linker, "/export:mono_raise_exception_deprecated") -#pragma comment(linker, "/export:mono_raise_exception_with_context") -#pragma comment(linker, "/export:mono_reflection_assembly_get_assembly") -#pragma comment(linker, "/export:mono_reflection_bind_generic_parameters") -#pragma comment(linker, "/export:mono_reflection_call_is_assignable_to") -#pragma comment(linker, "/export:mono_reflection_cleanup_assembly") -#pragma comment(linker, "/export:mono_reflection_cleanup_domain") -#pragma comment(linker, "/export:mono_reflection_create_custom_attr_data_args") -#pragma comment(linker, "/export:mono_reflection_create_custom_attr_data_args_noalloc") -#pragma comment(linker, "/export:mono_reflection_dynimage_basic_init") -#pragma comment(linker, "/export:mono_reflection_emit_init") -#pragma comment(linker, "/export:mono_reflection_free_type_info") -#pragma comment(linker, "/export:mono_reflection_get_custom_attrs") -#pragma comment(linker, "/export:mono_reflection_get_custom_attrs_blob") -#pragma comment(linker, "/export:mono_reflection_get_custom_attrs_blob_checked") -#pragma comment(linker, "/export:mono_reflection_get_custom_attrs_by_type") -#pragma comment(linker, "/export:mono_reflection_get_custom_attrs_by_type_handle") -#pragma comment(linker, "/export:mono_reflection_get_custom_attrs_data") -#pragma comment(linker, "/export:mono_reflection_get_custom_attrs_data_checked") -#pragma comment(linker, "/export:mono_reflection_get_custom_attrs_info") -#pragma comment(linker, "/export:mono_reflection_get_custom_attrs_info_checked") -#pragma comment(linker, "/export:mono_reflection_get_dynamic_overrides") -#pragma comment(linker, "/export:mono_reflection_get_token") -#pragma comment(linker, "/export:mono_reflection_get_token_checked") -#pragma comment(linker, "/export:mono_reflection_get_type") -#pragma comment(linker, "/export:mono_reflection_get_type_checked") -#pragma comment(linker, "/export:mono_reflection_init") -#pragma comment(linker, "/export:mono_reflection_is_usertype") -#pragma comment(linker, "/export:mono_reflection_lookup_dynamic_token") -#pragma comment(linker, "/export:mono_reflection_lookup_signature") -#pragma comment(linker, "/export:mono_reflection_marshal_as_attribute_from_marshal_spec") -#pragma comment(linker, "/export:mono_reflection_method_count_clauses") -#pragma comment(linker, "/export:mono_reflection_methodbuilder_from_ctor_builder") -#pragma comment(linker, "/export:mono_reflection_methodbuilder_from_method_builder") -#pragma comment(linker, "/export:mono_reflection_parse_type") -#pragma comment(linker, "/export:mono_reflection_parse_type_checked") -#pragma comment(linker, "/export:mono_reflection_resolution_scope_from_image") -#pragma comment(linker, "/export:mono_reflection_resolve_object") -#pragma comment(linker, "/export:mono_reflection_resolve_object_handle") -#pragma comment(linker, "/export:mono_reflection_type_from_name") -#pragma comment(linker, "/export:mono_reflection_type_from_name_checked") -#pragma comment(linker, "/export:mono_reflection_type_get_handle") -#pragma comment(linker, "/export:mono_reflection_type_get_type") -#pragma comment(linker, "/export:mono_reflection_type_handle_mono_type") -#pragma comment(linker, "/export:mono_runtime_class_init") -#pragma comment(linker, "/export:mono_runtime_class_init_full") -#pragma comment(linker, "/export:mono_runtime_cleanup") -#pragma comment(linker, "/export:mono_runtime_cleanup_handlers") -#pragma comment(linker, "/export:mono_runtime_create_delegate_trampoline") -#pragma comment(linker, "/export:mono_runtime_create_jump_trampoline") -#pragma comment(linker, "/export:mono_runtime_delegate_invoke") -#pragma comment(linker, "/export:mono_runtime_delegate_invoke_checked") -#pragma comment(linker, "/export:mono_runtime_delegate_try_invoke") -#pragma comment(linker, "/export:mono_runtime_exec_main") -#pragma comment(linker, "/export:mono_runtime_exec_main_checked") -#pragma comment(linker, "/export:mono_runtime_exec_managed_code") -#pragma comment(linker, "/export:mono_runtime_free_method") -#pragma comment(linker, "/export:mono_runtime_get_aotid") -#pragma comment(linker, "/export:mono_runtime_get_caller_no_system_or_reflection") -#pragma comment(linker, "/export:mono_runtime_get_main_args") -#pragma comment(linker, "/export:mono_runtime_get_main_args_handle") -#pragma comment(linker, "/export:mono_runtime_get_no_exec") -#pragma comment(linker, "/export:mono_runtime_init") -#pragma comment(linker, "/export:mono_runtime_init_checked") -#pragma comment(linker, "/export:mono_runtime_init_tls") -#pragma comment(linker, "/export:mono_runtime_install_custom_handlers") -#pragma comment(linker, "/export:mono_runtime_install_custom_handlers_usage") -#pragma comment(linker, "/export:mono_runtime_install_handlers") -#pragma comment(linker, "/export:mono_runtime_invoke") -#pragma comment(linker, "/export:mono_runtime_invoke_array") -#pragma comment(linker, "/export:mono_runtime_invoke_array_checked") -#pragma comment(linker, "/export:mono_runtime_invoke_checked") -#pragma comment(linker, "/export:mono_runtime_invoke_handle") -#pragma comment(linker, "/export:mono_runtime_is_shutting_down") -#pragma comment(linker, "/export:mono_runtime_load") -#pragma comment(linker, "/export:mono_runtime_object_init") -#pragma comment(linker, "/export:mono_runtime_object_init_checked") -#pragma comment(linker, "/export:mono_runtime_object_init_handle") -#pragma comment(linker, "/export:mono_runtime_quit") -#pragma comment(linker, "/export:mono_runtime_resource_check_limit") -#pragma comment(linker, "/export:mono_runtime_resource_limit") -#pragma comment(linker, "/export:mono_runtime_resource_set_callback") -#pragma comment(linker, "/export:mono_runtime_run_main") -#pragma comment(linker, "/export:mono_runtime_run_main_checked") -#pragma comment(linker, "/export:mono_runtime_run_module_cctor") -#pragma comment(linker, "/export:mono_runtime_set_main_args") -#pragma comment(linker, "/export:mono_runtime_set_no_exec") -#pragma comment(linker, "/export:mono_runtime_set_pending_exception") -#pragma comment(linker, "/export:mono_runtime_set_shutting_down") -#pragma comment(linker, "/export:mono_runtime_setup_stat_profiler") -#pragma comment(linker, "/export:mono_runtime_shutdown_stat_profiler") -#pragma comment(linker, "/export:mono_runtime_try_exec_main") -#pragma comment(linker, "/export:mono_runtime_try_invoke") -#pragma comment(linker, "/export:mono_runtime_try_invoke_array") -#pragma comment(linker, "/export:mono_runtime_try_invoke_handle") -#pragma comment(linker, "/export:mono_runtime_try_run_main") -#pragma comment(linker, "/export:mono_runtime_try_shutdown") -#pragma comment(linker, "/export:mono_runtime_unhandled_exception_policy_get") -#pragma comment(linker, "/export:mono_runtime_unhandled_exception_policy_set") -#pragma comment(linker, "/export:mono_signature_explicit_this") -#pragma comment(linker, "/export:mono_signature_full_name") -#pragma comment(linker, "/export:mono_signature_get_call_conv") -#pragma comment(linker, "/export:mono_signature_get_desc") -#pragma comment(linker, "/export:mono_signature_get_param_count") -#pragma comment(linker, "/export:mono_signature_get_params") -#pragma comment(linker, "/export:mono_signature_get_return_type") -#pragma comment(linker, "/export:mono_signature_hash") -#pragma comment(linker, "/export:mono_signature_is_instance") -#pragma comment(linker, "/export:mono_signature_no_pinvoke") -#pragma comment(linker, "/export:mono_signature_param_is_out") -#pragma comment(linker, "/export:mono_signature_vararg_start") -#pragma comment(linker, "/export:mono_stack_mark_pop_value") -#pragma comment(linker, "/export:mono_stack_mark_record_size") -#pragma comment(linker, "/export:mono_stack_walk") -#pragma comment(linker, "/export:mono_stack_walk_async_safe") -#pragma comment(linker, "/export:mono_stack_walk_no_il") -#pragma comment(linker, "/export:mono_string_builder_to_utf16") -#pragma comment(linker, "/export:mono_string_builder_to_utf8") -#pragma comment(linker, "/export:mono_string_chars") -#pragma comment(linker, "/export:mono_string_empty") -#pragma comment(linker, "/export:mono_string_empty_handle") -#pragma comment(linker, "/export:mono_string_empty_wrapper") -#pragma comment(linker, "/export:mono_string_equal") -#pragma comment(linker, "/export:mono_string_from_blob") -#pragma comment(linker, "/export:mono_string_from_bstr") -#pragma comment(linker, "/export:mono_string_from_bstr_icall") -#pragma comment(linker, "/export:mono_string_from_byvalstr") -#pragma comment(linker, "/export:mono_string_from_byvalwstr") -#pragma comment(linker, "/export:mono_string_from_utf16") -#pragma comment(linker, "/export:mono_string_from_utf16_checked") -#pragma comment(linker, "/export:mono_string_from_utf32") -#pragma comment(linker, "/export:mono_string_from_utf32_checked") -#pragma comment(linker, "/export:mono_string_handle_length") -#pragma comment(linker, "/export:mono_string_handle_pin_chars") -#pragma comment(linker, "/export:mono_string_handle_to_utf8") -#pragma comment(linker, "/export:mono_string_hash") -#pragma comment(linker, "/export:mono_string_intern") -#pragma comment(linker, "/export:mono_string_intern_checked") -#pragma comment(linker, "/export:mono_string_is_interned") -#pragma comment(linker, "/export:mono_string_length") -#pragma comment(linker, "/export:mono_string_new") -#pragma comment(linker, "/export:mono_string_new_checked") -#pragma comment(linker, "/export:mono_string_new_handle") -#pragma comment(linker, "/export:mono_string_new_len") -#pragma comment(linker, "/export:mono_string_new_len_checked") -#pragma comment(linker, "/export:mono_string_new_len_wrapper") -#pragma comment(linker, "/export:mono_string_new_size") -#pragma comment(linker, "/export:mono_string_new_size_checked") -#pragma comment(linker, "/export:mono_string_new_utf16") -#pragma comment(linker, "/export:mono_string_new_utf16_checked") -#pragma comment(linker, "/export:mono_string_new_utf16_handle") -#pragma comment(linker, "/export:mono_string_new_utf32") -#pragma comment(linker, "/export:mono_string_new_utf8_len_handle") -#pragma comment(linker, "/export:mono_string_new_wrapper") -#pragma comment(linker, "/export:mono_string_new_wtf8_len_checked") -#pragma comment(linker, "/export:mono_string_to_ansibstr") -#pragma comment(linker, "/export:mono_string_to_bstr") -#pragma comment(linker, "/export:mono_string_to_byvalstr") -#pragma comment(linker, "/export:mono_string_to_byvalwstr") -#pragma comment(linker, "/export:mono_string_to_utf16") -#pragma comment(linker, "/export:mono_string_to_utf32") -#pragma comment(linker, "/export:mono_string_to_utf8") -#pragma comment(linker, "/export:mono_string_to_utf8_checked") -#pragma comment(linker, "/export:mono_string_to_utf8_ignore") -#pragma comment(linker, "/export:mono_string_to_utf8_image") -#pragma comment(linker, "/export:mono_string_to_utf8str") -#pragma comment(linker, "/export:mono_string_to_utf8str_handle") -#pragma comment(linker, "/export:mono_string_utf16_to_builder") -#pragma comment(linker, "/export:mono_string_utf16_to_builder2") -#pragma comment(linker, "/export:mono_string_utf8_to_builder") -#pragma comment(linker, "/export:mono_string_utf8_to_builder2") -#pragma comment(linker, "/export:mono_thread_attach") -#pragma comment(linker, "/export:mono_thread_attach_aborted_cb") -#pragma comment(linker, "/export:mono_thread_callbacks_init") -#pragma comment(linker, "/export:mono_thread_cleanup") -#pragma comment(linker, "/export:mono_thread_cleanup_apartment_state") -#pragma comment(linker, "/export:mono_thread_clear_and_set_state") -#pragma comment(linker, "/export:mono_thread_clr_state") -#pragma comment(linker, "/export:mono_thread_create") -#pragma comment(linker, "/export:mono_thread_create_checked") -#pragma comment(linker, "/export:mono_thread_create_internal") -#pragma comment(linker, "/export:mono_thread_create_internal_handle") -#pragma comment(linker, "/export:mono_thread_current") -#pragma comment(linker, "/export:mono_thread_current_check_pending_interrupt") -#pragma comment(linker, "/export:mono_thread_detach") -#pragma comment(linker, "/export:mono_thread_detach_if_exiting") -#pragma comment(linker, "/export:mono_thread_exit") -#pragma comment(linker, "/export:mono_thread_force_interruption_checkpoint_noraise") -#pragma comment(linker, "/export:mono_thread_get_main") -#pragma comment(linker, "/export:mono_thread_get_managed_id") -#pragma comment(linker, "/export:mono_thread_get_name") -#pragma comment(linker, "/export:mono_thread_get_name_utf8") -#pragma comment(linker, "/export:mono_thread_get_undeniable_exception") -#pragma comment(linker, "/export:mono_thread_has_appdomain_ref") -#pragma comment(linker, "/export:mono_thread_hazardous_queue_free") -#pragma comment(linker, "/export:mono_thread_hazardous_try_free") -#pragma comment(linker, "/export:mono_thread_hazardous_try_free_all") -#pragma comment(linker, "/export:mono_thread_hazardous_try_free_some") -#pragma comment(linker, "/export:mono_thread_init") -#pragma comment(linker, "/export:mono_thread_init_apartment_state") -#pragma comment(linker, "/export:mono_thread_interruption_checkpoint") -#pragma comment(linker, "/export:mono_thread_interruption_checkpoint_bool") -#pragma comment(linker, "/export:mono_thread_interruption_checkpoint_void") -#pragma comment(linker, "/export:mono_thread_interruption_request_flag") -#pragma comment(linker, "/export:mono_thread_interruption_requested") -#pragma comment(linker, "/export:mono_thread_is_foreign") -#pragma comment(linker, "/export:mono_thread_is_gc_unsafe_mode") -#pragma comment(linker, "/export:mono_thread_join") -#pragma comment(linker, "/export:mono_thread_manage") -#pragma comment(linker, "/export:mono_thread_new_init") -#pragma comment(linker, "/export:mono_thread_platform_create_thread") -#pragma comment(linker, "/export:mono_thread_pop_appdomain_ref") -#pragma comment(linker, "/export:mono_thread_push_appdomain_ref") -#pragma comment(linker, "/export:mono_thread_set_main") -#pragma comment(linker, "/export:mono_thread_set_manage_callback") -#pragma comment(linker, "/export:mono_thread_set_name_internal") -#pragma comment(linker, "/export:mono_thread_set_state") -#pragma comment(linker, "/export:mono_thread_small_id_alloc") -#pragma comment(linker, "/export:mono_thread_small_id_free") -#pragma comment(linker, "/export:mono_thread_smr_cleanup") -#pragma comment(linker, "/export:mono_thread_smr_init") -#pragma comment(linker, "/export:mono_thread_stop") -#pragma comment(linker, "/export:mono_thread_test_and_set_state") -#pragma comment(linker, "/export:mono_thread_test_state") -#pragma comment(linker, "/export:mono_type_array_get_and_resolve") -#pragma comment(linker, "/export:mono_type_create_from_typespec") -#pragma comment(linker, "/export:mono_type_create_from_typespec_checked") -#pragma comment(linker, "/export:mono_type_full_name") -#pragma comment(linker, "/export:mono_type_generic_inst_is_valuetype") -#pragma comment(linker, "/export:mono_type_get_array_type") -#pragma comment(linker, "/export:mono_type_get_basic_type_from_generic") -#pragma comment(linker, "/export:mono_type_get_checked") -#pragma comment(linker, "/export:mono_type_get_class") -#pragma comment(linker, "/export:mono_type_get_cmods") -#pragma comment(linker, "/export:mono_type_get_desc") -#pragma comment(linker, "/export:mono_type_get_full_name") -#pragma comment(linker, "/export:mono_type_get_modifiers") -#pragma comment(linker, "/export:mono_type_get_name") -#pragma comment(linker, "/export:mono_type_get_name_full") -#pragma comment(linker, "/export:mono_type_get_object") -#pragma comment(linker, "/export:mono_type_get_object_checked") -#pragma comment(linker, "/export:mono_type_get_object_handle") -#pragma comment(linker, "/export:mono_type_get_ptr_type") -#pragma comment(linker, "/export:mono_type_get_signature") -#pragma comment(linker, "/export:mono_type_get_type") -#pragma comment(linker, "/export:mono_type_get_underlying_type") -#pragma comment(linker, "/export:mono_type_has_exceptions") -#pragma comment(linker, "/export:mono_type_in_image") -#pragma comment(linker, "/export:mono_type_initialization_cleanup") -#pragma comment(linker, "/export:mono_type_initialization_init") -#pragma comment(linker, "/export:mono_type_is_byref") -#pragma comment(linker, "/export:mono_type_is_from_assembly") -#pragma comment(linker, "/export:mono_type_is_generic_parameter") -#pragma comment(linker, "/export:mono_type_is_pointer") -#pragma comment(linker, "/export:mono_type_is_primitive") -#pragma comment(linker, "/export:mono_type_is_reference") -#pragma comment(linker, "/export:mono_type_is_struct") -#pragma comment(linker, "/export:mono_type_is_valid_enum_basetype") -#pragma comment(linker, "/export:mono_type_is_void") -#pragma comment(linker, "/export:mono_type_native_stack_size") -#pragma comment(linker, "/export:mono_type_set_alignment") -#pragma comment(linker, "/export:mono_type_size") -#pragma comment(linker, "/export:mono_type_stack_size") -#pragma comment(linker, "/export:mono_type_stack_size_internal") -#pragma comment(linker, "/export:mono_value_box") -#pragma comment(linker, "/export:mono_value_copy") -#pragma comment(linker, "/export:mono_value_copy_array") -#pragma comment(linker, "/export:mono_jit_info_get_code_start") -#pragma comment(linker, "/export:mono_jit_info_get_code_size") - -#endif diff --git a/Source/Engine/Scripting/ManagedCLR/MCore.h b/Source/Engine/Scripting/ManagedCLR/MCore.h index 3d62db299..38b58403d 100644 --- a/Source/Engine/Scripting/ManagedCLR/MCore.h +++ b/Source/Engine/Scripting/ManagedCLR/MCore.h @@ -10,7 +10,6 @@ class FLAXENGINE_API MCore { public: - /// /// Gets the root domain. /// @@ -26,16 +25,15 @@ public: /// /// The domain name to create. /// The domain object. - static MDomain* CreateDomain(const MString& domainName); + static MDomain* CreateDomain(const StringAnsi& domainName); /// /// Unloads the domain. /// /// The domain name to remove. - static void UnloadDomain(const MString& domainName); + static void UnloadDomain(const StringAnsi& domainName); public: - /// /// Initialize CLR Engine /// @@ -47,39 +45,148 @@ public: /// static void UnloadEngine(); - /// - /// Attaches CLR runtime to the current thread. Use it to allow invoking managed runtime from native threads. - /// - static void AttachThread(); - - /// - /// Exits the managed runtime thread. Clears the thread data and sets its exit code to 0. Use it before ending the native thread that uses AttachThread. - /// - static void ExitThread(); +#if USE_EDITOR + // Called by Scripting in a middle of hot-reload (after unloading modules but before loading them again). + static void OnMidHotReload(); +#endif public: + /// + /// Utilities for C# object management. + /// + struct FLAXENGINE_API Object + { + static MObject* Box(void* value, const MClass* klass); + static void* Unbox(MObject* obj); + static MObject* New(const MClass* klass); + static void Init(MObject* obj); + static MClass* GetClass(MObject* obj); + static MString* ToString(MObject* obj); + static int32 GetHashCode(MObject* obj); + }; + + /// + /// Utilities for C# string management. + /// + struct FLAXENGINE_API String + { + static MString* GetEmpty(MDomain* domain = nullptr); + static MString* New(const char* str, int32 length, MDomain* domain = nullptr); + static MString* New(const Char* str, int32 length, MDomain* domain = nullptr); + static StringView GetChars(MString* obj); + }; + + /// + /// Utilities for C# array management. + /// + struct FLAXENGINE_API Array + { + static MArray* New(const MClass* elementKlass, int32 length); + static MClass* GetClass(MClass* elementKlass); + static int32 GetLength(const MArray* obj); + static void* GetAddress(const MArray* obj); + + template + FORCE_INLINE static T* GetAddress(const MArray* obj) + { + return (T*)GetAddress(obj); + } + }; + + /// + /// Utilities for GC Handle management. + /// + struct FLAXENGINE_API GCHandle + { + static MGCHandle New(MObject* obj, bool pinned = false); + static MGCHandle NewWeak(MObject* obj, bool trackResurrection = false); + static MObject* GetTarget(const MGCHandle& handle); + static void Free(const MGCHandle& handle); + }; /// /// Helper utilities for C# garbage collector. /// - class GC + struct FLAXENGINE_API GC { - public: - - /// - /// Forces an immediate garbage collection of all generations. - /// static void Collect(); - - /// - /// Forces an immediate garbage collection of the given generation. - /// - /// The target generation static void Collect(int32 generation); - - /// - /// Suspends the current thread until the thread that is processing the queue of finalizers has emptied that queue. - /// + static void Collect(int32 generation, MGCCollectionMode collectionMode, bool blocking, bool compacting); + static int32 MaxGeneration(); static void WaitForPendingFinalizers(); + static void WriteRef(void* ptr, MObject* ref); + static void WriteValue(void* dst, void* src, int32 count, const MClass* klass); + static void WriteArrayRef(MArray* dst, MObject* ref, int32 index); + static void WriteArrayRef(MArray* dst, Span span); +#if USE_NETCORE + static void* AllocateMemory(int32 size, bool coTaskMem = false); + static void FreeMemory(void* ptr, bool coTaskMem = false); +#endif + }; + + /// + /// Utilities for C# threads management. + /// + struct FLAXENGINE_API Thread + { + static void Attach(); + static void Exit(); + static bool IsAttached(); + }; + + /// + /// Helper utilities for C# exceptions throwing. + /// + struct FLAXENGINE_API Exception + { + static void Throw(MObject* exception); + static MObject* GetNullReference(); + static MObject* Get(const char* msg); + static MObject* GetArgument(const char* arg, const char* msg); + static MObject* GetArgumentNull(const char* arg); + static MObject* GetArgumentOutOfRange(const char* arg); + static MObject* GetNotSupported(const char* msg); + }; + + /// + /// Helper utilities for C# types information. + /// + struct FLAXENGINE_API Type + { + static ::String ToString(MType* type); + static MClass* GetClass(MType* type); + static MType* GetElementType(MType* type); + static int32 GetSize(MType* type); + static MTypes GetType(MType* type); + static bool IsPointer(MType* type); + static bool IsReference(MType* type); +#if USE_MONO + static MTypeObject* GetObject(MType* type); + static MType* Get(MTypeObject* type); +#endif + }; + + /// + /// Helper types cache from C# corlib and engine. + /// + struct FLAXENGINE_API TypeCache + { + static MClass* Void; + static MClass* Object; + static MClass* Byte; + static MClass* Boolean; + static MClass* SByte; + static MClass* Char; + static MClass* Int16; + static MClass* UInt16; + static MClass* Int32; + static MClass* UInt32; + static MClass* Int64; + static MClass* UInt64; + static MClass* IntPtr; + static MClass* UIntPtr; + static MClass* Single; + static MClass* Double; + static MClass* String; }; }; diff --git a/Source/Engine/Scripting/ManagedCLR/MDomain.cpp b/Source/Engine/Scripting/ManagedCLR/MDomain.cpp deleted file mode 100644 index 19bfaa158..000000000 --- a/Source/Engine/Scripting/ManagedCLR/MDomain.cpp +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. - -#include "MDomain.h" -#include "MCore.h" -#include "MAssembly.h" -#include "Engine/Threading/Threading.h" -#include "Engine/Core/Log.h" -#include "Engine/Debug/Exceptions/ArgumentException.h" -#include "Engine/Debug/Exceptions/Exceptions.h" -#if USE_MONO -#include -#endif - -extern MDomain* MActiveDomain; - -MDomain::MDomain(const MString& domainName) - : _domainName(domainName) -{ -} - -bool MDomain::SetCurrentDomain(bool force) -{ -#if USE_MONO - if (mono_domain_set(_monoDomain, force) == 0) - return false; -#endif - MActiveDomain = this; - return true; -} - -MAssembly* MDomain::CreateEmptyAssembly(const MString& assemblyName, const MAssemblyOptions options) -{ - // Validates if assembly is already open - if (_assemblies.ContainsKey(assemblyName)) - { - Log::ArgumentException(String::Format(TEXT("{0} assembly has already been added"), String(assemblyName))); - return _assemblies.At(assemblyName); - } - - // Create shared pointer to the assembly - const auto assembly = New(this, assemblyName, options); - - // Add assembly instance to dictionary - _assemblies.Add(assemblyName, assembly); - - return assembly; -} - -void MDomain::RemoveAssembly(const MString& assemblyName) -{ - auto assembly = _assemblies[assemblyName]; - _assemblies.Remove(assemblyName); - Delete(assembly); -} - -MAssembly* MDomain::GetAssembly(const MString& assemblyName) const -{ - MAssembly* result = nullptr; - if (!_assemblies.TryGet(assemblyName, result)) - { - Log::ArgumentOutOfRangeException(TEXT("Current assembly was not found in given domain")); - } - return result; -} - -void MDomain::Dispatch() const -{ -#if USE_MONO - if (!IsInMainThread()) - { - mono_thread_attach(_monoDomain); - } -#endif -} - -MClass* MDomain::FindClass(const StringAnsiView& fullname) const -{ - for (auto assembly = _assemblies.Begin(); assembly != _assemblies.End(); ++assembly) - { - const auto currentClass = assembly->Value->GetClass(fullname); - if (!currentClass) - { - return currentClass; - } - } - return nullptr; -} diff --git a/Source/Engine/Scripting/ManagedCLR/MDomain.h b/Source/Engine/Scripting/ManagedCLR/MDomain.h index 7be828ed3..e03b8a23a 100644 --- a/Source/Engine/Scripting/ManagedCLR/MDomain.h +++ b/Source/Engine/Scripting/ManagedCLR/MDomain.h @@ -4,7 +4,6 @@ #include "Engine/Core/Collections/Dictionary.h" #include "MTypes.h" -#include "MAssemblyOptions.h" /// /// Domain separates multiple processes within one executed CLR environment. @@ -17,24 +16,24 @@ class FLAXENGINE_API MDomain { friend MCore; friend MAssembly; -public: - typedef Dictionary AssembliesDictionary; +public: + typedef Dictionary AssembliesDictionary; private: - #if USE_MONO MonoDomain* _monoDomain; #endif - MString _domainName; + StringAnsi _domainName; AssembliesDictionary _assemblies; public: - - MDomain(const MString& domainName); + MDomain(const StringAnsi& domainName) + : _domainName(domainName) + { + } public: - #if USE_MONO /// /// Gets native domain class. @@ -48,7 +47,7 @@ public: /// /// Gets current domain name /// - FORCE_INLINE const MString& GetName() const + FORCE_INLINE const StringAnsi& GetName() const { return _domainName; } @@ -62,27 +61,6 @@ public: } public: - - /// - /// Create assembly container from current domain - /// - /// Assembly name to later receive from assemblies dictionary - /// The assembly options container. - /// MAssembly object ready to Load - MAssembly* CreateEmptyAssembly(const MString& assemblyName, const MAssemblyOptions options); - - /// - /// Removes assembly from current domain and request unloading. - /// - /// Assembly name - void RemoveAssembly(const MString& assemblyName); - - /// - /// Gets current domain assembly. - /// - /// The managed assembly or null if not found. - MAssembly* GetAssembly(const MString& assemblyName) const; - /// /// Attaches current CLR domain calls to the current thread. /// @@ -93,9 +71,4 @@ public: /// /// True if succeed in settings, false if failed. bool SetCurrentDomain(bool force = false); - - /// - /// Returns class from current domain. - /// - MClass* FindClass(const StringAnsiView& fullname) const; }; diff --git a/Source/Engine/Scripting/ManagedCLR/MEvent.cpp b/Source/Engine/Scripting/ManagedCLR/MEvent.cpp deleted file mode 100644 index 8dce9a863..000000000 --- a/Source/Engine/Scripting/ManagedCLR/MEvent.cpp +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. - -#include "MEvent.h" -#include "MType.h" -#include "MClass.h" -#if USE_MONO -#include - -MEvent::MEvent(MonoEvent* monoEvent, const char* name, MClass* parentClass) - : _monoEvent(monoEvent) - , _addMethod(nullptr) - , _removeMethod(nullptr) - , _parentClass(parentClass) - , _name(name) - , _hasCachedAttributes(false) - , _hasAddMonoMethod(true) - , _hasRemoveMonoMethod(true) -{ -#if BUILD_DEBUG - // Validate input name - ASSERT(StringUtils::Compare(name, mono_event_get_name(monoEvent)) == 0); -#endif -} - -#endif - -MType MEvent::GetType() -{ - if (GetAddMethod() != nullptr) - return GetAddMethod()->GetReturnType(); - if (GetRemoveMethod() != nullptr) - return GetRemoveMethod()->GetReturnType(); - return MType(); -} - -MMethod* MEvent::GetAddMethod() -{ - if (!_hasAddMonoMethod) - return nullptr; - if (_addMethod == nullptr) - { -#if USE_MONO - auto addMonoMethod = mono_event_get_add_method(_monoEvent); - if (addMonoMethod != nullptr) - { - _hasAddMonoMethod = true; - return _addMethod = New(addMonoMethod, _parentClass); - } -#endif - } - return _addMethod; -} - -MMethod* MEvent::GetRemoveMethod() -{ - if (!_hasRemoveMonoMethod) - return nullptr; - if (_removeMethod == nullptr) - { -#if USE_MONO - auto removeMonoMethod = mono_event_get_remove_method(_monoEvent); - if (removeMonoMethod) - { - _hasRemoveMonoMethod = true; - return _removeMethod = New(removeMonoMethod, _parentClass); - } -#endif - } - return _removeMethod; -} - -bool MEvent::HasAttribute(MClass* monoClass) const -{ -#if USE_MONO - MonoClass* parentClass = mono_event_get_parent(_monoEvent); - MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_event(parentClass, _monoEvent); - if (attrInfo == nullptr) - return false; - - const bool hasAttr = mono_custom_attrs_has_attr(attrInfo, monoClass->GetNative()) != 0; - mono_custom_attrs_free(attrInfo); - return hasAttr; -#else - return false; -#endif -} - -bool MEvent::HasAttribute() const -{ -#if USE_MONO - MonoClass* parentClass = mono_event_get_parent(_monoEvent); - MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_event(parentClass, _monoEvent); - if (attrInfo == nullptr) - return false; - - if (attrInfo->num_attrs > 0) - { - mono_custom_attrs_free(attrInfo); - return true; - } - mono_custom_attrs_free(attrInfo); - return false; -#else - return false; -#endif -} - -MObject* MEvent::GetAttribute(MClass* monoClass) const -{ -#if USE_MONO - MonoClass* parentClass = mono_event_get_parent(_monoEvent); - MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_event(parentClass, _monoEvent); - if (attrInfo == nullptr) - return nullptr; - - MonoObject* foundAttr = mono_custom_attrs_get_attr(attrInfo, monoClass->GetNative()); - mono_custom_attrs_free(attrInfo); - return foundAttr; -#else - return nullptr; -#endif -} - -const Array& MEvent::GetAttributes() -{ - if (_hasCachedAttributes) - return _attributes; - - _hasCachedAttributes = true; -#if USE_MONO - MonoClass* parentClass = mono_event_get_parent(_monoEvent); - MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_event(parentClass, _monoEvent); - if (attrInfo == nullptr) - return _attributes; - - MonoArray* monoAttributesArray = mono_custom_attrs_construct(attrInfo); - const auto length = (uint32)mono_array_length(monoAttributesArray); - _attributes.Resize(length); - for (uint32 i = 0; i < length; i++) - _attributes[i] = mono_array_get(monoAttributesArray, MonoObject *, i); - mono_custom_attrs_free(attrInfo); -#endif - return _attributes; -} diff --git a/Source/Engine/Scripting/ManagedCLR/MEvent.h b/Source/Engine/Scripting/ManagedCLR/MEvent.h index 69686cc0e..f6353330d 100644 --- a/Source/Engine/Scripting/ManagedCLR/MEvent.h +++ b/Source/Engine/Scripting/ManagedCLR/MEvent.h @@ -12,35 +12,36 @@ class FLAXENGINE_API MEvent friend MClass; protected: - #if USE_MONO MonoEvent* _monoEvent; +#elif USE_NETCORE + void* _handle; #endif - MMethod* _addMethod; - MMethod* _removeMethod; + mutable MMethod* _addMethod; + mutable MMethod* _removeMethod; MClass* _parentClass; - MString _name; + StringAnsi _name; - int32 _hasCachedAttributes : 1; - int32 _hasAddMonoMethod : 1; - int32 _hasRemoveMonoMethod : 1; + mutable int32 _hasCachedAttributes : 1; + mutable int32 _hasAddMonoMethod : 1; + mutable int32 _hasRemoveMonoMethod : 1; - Array _attributes; + mutable Array _attributes; public: - #if USE_MONO explicit MEvent(MonoEvent* monoEvent, const char* name, MClass* parentClass); +#elif USE_NETCORE + MEvent(MClass* parentClass, void* handle, const char* name); #endif public: - /// /// Gets the event name. /// - FORCE_INLINE const MString& GetName() const + FORCE_INLINE const StringAnsi& GetName() const { return _name; } @@ -56,22 +57,22 @@ public: /// /// Gets the event type class. /// - MType GetType(); + MType* GetType() const; /// /// Gets the event add method. /// - MMethod* GetAddMethod(); + MMethod* GetAddMethod() const; /// /// Gets the event remove method. /// - MMethod* GetRemoveMethod(); + MMethod* GetRemoveMethod() const; /// /// Gets event visibility in the class. /// - FORCE_INLINE MVisibility GetVisibility() + FORCE_INLINE MVisibility GetVisibility() const { return GetAddMethod()->GetVisibility(); } @@ -79,7 +80,7 @@ public: /// /// Returns true if event is static. /// - FORCE_INLINE bool IsStatic() + FORCE_INLINE bool IsStatic() const { return GetAddMethod()->IsStatic(); } @@ -95,7 +96,6 @@ public: #endif public: - /// /// Checks if event has an attribute of the specified type. /// @@ -120,5 +120,5 @@ public: /// Returns an instance of all attributes connected with given event. Returns null if the event doesn't have any attributes. /// /// The array of attribute objects. - const Array& GetAttributes(); + const Array& GetAttributes() const; }; diff --git a/Source/Engine/Scripting/MException.h b/Source/Engine/Scripting/ManagedCLR/MException.h similarity index 50% rename from Source/Engine/Scripting/MException.h rename to Source/Engine/Scripting/ManagedCLR/MException.h index 1ad9cc62a..86a531e5f 100644 --- a/Source/Engine/Scripting/MException.h +++ b/Source/Engine/Scripting/ManagedCLR/MException.h @@ -3,8 +3,8 @@ #pragma once #include "Engine/Core/Types/String.h" -#include "ManagedCLR/MTypes.h" #include "Engine/Core/Log.h" +#include "MTypes.h" /// /// Represents errors that occur during script execution. @@ -12,7 +12,6 @@ class FLAXENGINE_API MException { public: - /// /// Gets a message that describes the current exception. /// @@ -29,18 +28,6 @@ public: MException* InnerException; public: - -#if USE_MONO - /// - /// Initializes a new instance of the class. - /// - /// The exception. - explicit MException(MonoException* exception) - : MException((MonoObject*)exception) - { - } -#endif - /// /// Initializes a new instance of the class. /// @@ -53,26 +40,10 @@ public: ~MException(); public: - /// /// Sends exception to the log. /// /// The log message type. /// Execution target name. - void Log(const LogType type, const Char* target) - { - // Log inner exceptions chain - auto inner = InnerException; - while (inner) - { - auto stackTrace = inner->StackTrace.HasChars() ? *inner->StackTrace : TEXT(""); - Log::Logger::Write(LogType::Warning, String::Format(TEXT("Inner exception. {0}\nStack strace:\n{1}\n"), inner->Message, stackTrace)); - inner = inner->InnerException; - } - - // Send stack trace only to log file - auto stackTrace = StackTrace.HasChars() ? *StackTrace : TEXT(""); - Log::Logger::Write(LogType::Warning, String::Format(TEXT("Exception has been thrown during {0}. {1}\nStack strace:\n{2}"), target, Message, stackTrace)); - Log::Logger::Write(type, String::Format(TEXT("Exception has been thrown during {0}.\n{1}"), target, Message)); - } + void Log(const LogType type, const Char* target); }; diff --git a/Source/Engine/Scripting/ManagedCLR/MField.cpp b/Source/Engine/Scripting/ManagedCLR/MField.cpp deleted file mode 100644 index 0d5ba9fc9..000000000 --- a/Source/Engine/Scripting/ManagedCLR/MField.cpp +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. - -#include "MField.h" -#include "MType.h" -#include "MClass.h" -#if USE_MONO -#include -#include - -MField::MField(MonoClassField* monoField, const char* name, MClass* parentClass) - : _monoField(monoField) - , _monoType(mono_field_get_type(monoField)) - , _parentClass(parentClass) - , _name(name) - , _hasCachedAttributes(false) -{ -#if BUILD_DEBUG - // Validate input name - ASSERT(StringUtils::Compare(name, mono_field_get_name(monoField)) == 0); -#endif - - const uint32_t flags = mono_field_get_flags(monoField); - switch (flags & MONO_FIELD_ATTR_FIELD_ACCESS_MASK) - { - case MONO_FIELD_ATTR_PRIVATE: - _visibility = MVisibility::Private; - break; - case MONO_FIELD_ATTR_FAM_AND_ASSEM: - _visibility = MVisibility::PrivateProtected; - break; - case MONO_FIELD_ATTR_ASSEMBLY: - _visibility = MVisibility::Internal; - break; - case MONO_FIELD_ATTR_FAMILY: - _visibility = MVisibility::Protected; - break; - case MONO_FIELD_ATTR_FAM_OR_ASSEM: - _visibility = MVisibility::ProtectedInternal; - break; - case MONO_FIELD_ATTR_PUBLIC: - _visibility = MVisibility::Public; - break; - default: - CRASH; - } - _isStatic = (flags & MONO_FIELD_ATTR_STATIC) != 0; -} - -#endif - -MType MField::GetType() const -{ -#if USE_MONO - return MType(_monoType); -#else - return MType(); -#endif -} - -int32 MField::GetOffset() const -{ -#if USE_MONO - return mono_field_get_offset(_monoField) - sizeof(MonoObject); -#else - return 0; -#endif -} - -void MField::GetValue(MObject* instance, void* result) const -{ -#if USE_MONO - mono_field_get_value(instance, _monoField, result); -#endif -} - -MObject* MField::GetValueBoxed(MObject* instance) const -{ -#if USE_MONO - return mono_field_get_value_object(mono_domain_get(), _monoField, instance); -#else - return nullptr; -#endif -} - -void MField::SetValue(MObject* instance, void* value) const -{ -#if USE_MONO - mono_field_set_value(instance, _monoField, value); -#endif -} - -bool MField::HasAttribute(MClass* monoClass) const -{ -#if USE_MONO - MonoClass* parentClass = mono_field_get_parent(_monoField); - MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_field(parentClass, _monoField); - if (attrInfo == nullptr) - return false; - - const bool hasAttr = mono_custom_attrs_has_attr(attrInfo, monoClass->GetNative()) != 0; - mono_custom_attrs_free(attrInfo); - return hasAttr; -#else - return false; -#endif -} - -bool MField::HasAttribute() const -{ -#if USE_MONO - MonoClass* parentClass = mono_field_get_parent(_monoField); - MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_field(parentClass, _monoField); - if (attrInfo == nullptr) - return false; - - if (attrInfo->num_attrs > 0) - { - mono_custom_attrs_free(attrInfo); - return true; - } - mono_custom_attrs_free(attrInfo); -#endif - return false; -} - -MObject* MField::GetAttribute(MClass* monoClass) const -{ -#if USE_MONO - MonoClass* parentClass = mono_field_get_parent(_monoField); - MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_field(parentClass, _monoField); - if (attrInfo == nullptr) - return nullptr; - - MonoObject* foundAttr = mono_custom_attrs_get_attr(attrInfo, monoClass->GetNative()); - mono_custom_attrs_free(attrInfo); - return foundAttr; -#else - return nullptr; -#endif -} - -const Array& MField::GetAttributes() -{ - if (_hasCachedAttributes) - return _attributes; - - _hasCachedAttributes = true; -#if USE_MONO - MonoClass* parentClass = mono_field_get_parent(_monoField); - MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_field(parentClass, _monoField); - if (attrInfo == nullptr) - return _attributes; - - MonoArray* monoAttributesArray = mono_custom_attrs_construct(attrInfo); - const auto length = (uint32)mono_array_length(monoAttributesArray); - _attributes.Resize(length); - for (uint32 i = 0; i < length; i++) - _attributes[i] = mono_array_get(monoAttributesArray, MonoObject*, i); - mono_custom_attrs_free(attrInfo); -#endif - return _attributes; -} diff --git a/Source/Engine/Scripting/ManagedCLR/MField.h b/Source/Engine/Scripting/ManagedCLR/MField.h index 820b5c9a5..796de27f7 100644 --- a/Source/Engine/Scripting/ManagedCLR/MField.h +++ b/Source/Engine/Scripting/ManagedCLR/MField.h @@ -13,34 +13,36 @@ class FLAXENGINE_API MField friend MClass; protected: - #if USE_MONO MonoClassField* _monoField; MonoType* _monoType; +#elif USE_NETCORE + void* _handle; + void* _type; #endif MClass* _parentClass; - MString _name; + StringAnsi _name; MVisibility _visibility; - int32 _hasCachedAttributes : 1; + mutable int32 _hasCachedAttributes : 1; int32 _isStatic : 1; - Array _attributes; + mutable Array _attributes; public: - #if USE_MONO explicit MField(MonoClassField* monoField, const char* name, MClass* parentClass); +#elif USE_NETCORE + MField(MClass* parentClass, void* handle, const char* name, void* type, MFieldAttributes attributes); #endif public: - /// /// Gets field name. /// - FORCE_INLINE const MString& GetName() const + FORCE_INLINE const StringAnsi& GetName() const { return _name; } @@ -56,7 +58,7 @@ public: /// /// Gets field type class. /// - MType GetType() const; + MType* GetType() const; /// /// Gets the field offset (in bytes) from the start of the parent object. @@ -90,7 +92,6 @@ public: #endif public: - /// /// Retrieves value currently set in the field on the specified object instance. If field is static object instance can be null. /// @@ -119,7 +120,6 @@ public: void SetValue(MObject* instance, void* value) const; public: - /// /// Checks if field has an attribute of the specified type. /// @@ -144,5 +144,5 @@ public: /// Returns an instance of all attributes connected with given field. Returns null if the field doesn't have any attributes. /// /// The array of attribute objects. - const Array& GetAttributes(); + const Array& GetAttributes() const; }; diff --git a/Source/Engine/Scripting/ManagedCLR/MMethod.cpp b/Source/Engine/Scripting/ManagedCLR/MMethod.cpp deleted file mode 100644 index 89c96a27d..000000000 --- a/Source/Engine/Scripting/ManagedCLR/MMethod.cpp +++ /dev/null @@ -1,218 +0,0 @@ -// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. - -#include "MMethod.h" -#include "MType.h" -#include "MClass.h" -#include "Engine/Profiler/ProfilerCPU.h" -#if USE_MONO -#include -#include - -MMethod::MMethod(MonoMethod* monoMethod, MClass* parentClass) - : MMethod(monoMethod, mono_method_get_name(monoMethod), parentClass) -{ -} - -MMethod::MMethod(MonoMethod* monoMethod, const char* name, MClass* parentClass) - : _monoMethod(monoMethod) - , _parentClass(parentClass) - , _name(name) - , _hasCachedAttributes(false) -{ -#if BUILD_DEBUG - // Validate input name - ASSERT(StringUtils::Compare(name, mono_method_get_name(monoMethod)) == 0); -#endif - - const uint32_t flags = mono_method_get_flags(monoMethod, nullptr); - - _isStatic = (flags & MONO_METHOD_ATTR_STATIC) != 0; - switch (flags & MONO_METHOD_ATTR_ACCESS_MASK) - { - case MONO_METHOD_ATTR_PRIVATE: - _visibility = MVisibility::Private; - break; - case MONO_METHOD_ATTR_FAM_AND_ASSEM: - _visibility = MVisibility::PrivateProtected; - break; - case MONO_METHOD_ATTR_ASSEM: - _visibility = MVisibility::Internal; - break; - case MONO_METHOD_ATTR_FAMILY: - _visibility = MVisibility::Protected; - break; - case MONO_METHOD_ATTR_FAM_OR_ASSEM: - _visibility = MVisibility::ProtectedInternal; - break; - case MONO_METHOD_ATTR_PUBLIC: - _visibility = MVisibility::Public; - break; - default: - CRASH; - } - -#if COMPILE_WITH_PROFILER - const MString& className = parentClass->GetFullName(); - ProfilerName.Resize(className.Length() + 2 + _name.Length()); - Platform::MemoryCopy(ProfilerName.Get(), className.Get(), className.Length()); - ProfilerName.Get()[className.Length()] = ':'; - ProfilerName.Get()[className.Length() + 1] = ':'; - Platform::MemoryCopy(ProfilerName.Get() + className.Length() + 2, _name.Get(), _name.Length()); - ProfilerData.name = ProfilerName.Get(); - ProfilerData.function = _name.Get(); - ProfilerData.file = nullptr; - ProfilerData.line = 0; - ProfilerData.color = 0; -#endif -} - -#endif - -MObject* MMethod::Invoke(void* instance, void** params, MObject** exception) const -{ -#if USE_MONO - PROFILE_CPU_SRC_LOC(ProfilerData); - return mono_runtime_invoke(_monoMethod, instance, params, exception); -#else - return nullptr; -#endif -} - -MObject* MMethod::InvokeVirtual(MObject* instance, void** params, MObject** exception) const -{ -#if USE_MONO - PROFILE_CPU_SRC_LOC(ProfilerData); - MonoMethod* virtualMethod = mono_object_get_virtual_method(instance, _monoMethod); - return mono_runtime_invoke(virtualMethod, instance, params, exception); -#else - return nullptr; -#endif -} - -#if !USE_MONO_AOT - -void* MMethod::GetThunk() -{ - if (!_cachedThunk) - { -#if USE_MONO - _cachedThunk = mono_method_get_unmanaged_thunk(_monoMethod); -#endif - } - return _cachedThunk; -} - -#endif - -MType MMethod::GetReturnType() const -{ -#if USE_MONO - MonoMethodSignature* sig = mono_method_signature(_monoMethod); - MonoType* returnType = mono_signature_get_return_type(sig); - return MType(returnType); -#else - return MType(); -#endif -} - -int32 MMethod::GetParametersCount() const -{ -#if USE_MONO - MonoMethodSignature* sig = mono_method_signature(_monoMethod); - return mono_signature_get_param_count(sig); -#else - return 0; -#endif -} - -MType MMethod::GetParameterType(int32 paramIdx) const -{ -#if USE_MONO - MonoMethodSignature* sig = mono_method_signature(_monoMethod); - ASSERT_LOW_LAYER(paramIdx >= 0 && paramIdx < (int32)mono_signature_get_param_count(sig)); - void* it = nullptr; - mono_signature_get_params(sig, &it); - return MType(((MonoType**)it)[paramIdx]); -#else - return MType(); -#endif -} - -bool MMethod::GetParameterIsOut(int32 paramIdx) const -{ -#if USE_MONO - MonoMethodSignature* sig = mono_method_signature(_monoMethod); - ASSERT_LOW_LAYER(paramIdx >= 0 && paramIdx < (int32)mono_signature_get_param_count(sig)); - return mono_signature_param_is_out(sig, paramIdx) != 0; -#else - return false; -#endif -} - -bool MMethod::HasAttribute(MClass* monoClass) const -{ -#if USE_MONO - MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_method(_monoMethod); - if (attrInfo == nullptr) - return false; - - const bool hasAttr = mono_custom_attrs_has_attr(attrInfo, monoClass->GetNative()) != 0; - mono_custom_attrs_free(attrInfo); - return hasAttr; -#else - return false; -#endif -} - -bool MMethod::HasAttribute() const -{ -#if USE_MONO - MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_method(_monoMethod); - if (attrInfo == nullptr) - return false; - - if (attrInfo->num_attrs > 0) - { - mono_custom_attrs_free(attrInfo); - return true; - } - mono_custom_attrs_free(attrInfo); -#endif - return false; -} - -MObject* MMethod::GetAttribute(MClass* monoClass) const -{ -#if USE_MONO - MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_method(_monoMethod); - if (attrInfo == nullptr) - return nullptr; - - MonoObject* foundAttr = mono_custom_attrs_get_attr(attrInfo, monoClass->GetNative()); - mono_custom_attrs_free(attrInfo); - return foundAttr; -#else - return nullptr; -#endif -} - -const Array& MMethod::GetAttributes() -{ - if (_hasCachedAttributes) - return _attributes; - - _hasCachedAttributes = true; -#if USE_MONO - MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_method(_monoMethod); - if (attrInfo == nullptr) - return _attributes; - - MonoArray* monoAttributesArray = mono_custom_attrs_construct(attrInfo); - const auto length = (uint32)mono_array_length(monoAttributesArray); - _attributes.Resize(length); - for (uint32 i = 0; i < length; i++) - _attributes[i] = mono_array_get(monoAttributesArray, MonoObject*, i); - mono_custom_attrs_free(attrInfo); -#endif - return _attributes; -} diff --git a/Source/Engine/Scripting/ManagedCLR/MMethod.h b/Source/Engine/Scripting/ManagedCLR/MMethod.h index d0d572939..90804d186 100644 --- a/Source/Engine/Scripting/ManagedCLR/MMethod.h +++ b/Source/Engine/Scripting/ManagedCLR/MMethod.h @@ -18,33 +18,41 @@ class FLAXENGINE_API MMethod friend MEvent; protected: - #if USE_MONO MonoMethod* _monoMethod; +#elif USE_NETCORE + void* _handle; + int32 _paramsCount; + mutable void* _returnType; + mutable Array> _parameterTypes; + void CacheSignature() const; #endif MClass* _parentClass; - MString _name; + StringAnsi _name; MVisibility _visibility; #if !USE_MONO_AOT void* _cachedThunk = nullptr; #endif - int32 _hasCachedAttributes : 1; + mutable int32 _hasCachedAttributes : 1; +#if USE_NETCORE + mutable int32 _hasCachedSignature : 1; +#endif int32 _isStatic : 1; - Array _attributes; + mutable Array _attributes; public: - #if USE_MONO explicit MMethod(MonoMethod* monoMethod, MClass* parentClass); explicit MMethod(MonoMethod* monoMethod, const char* name, MClass* parentClass); +#elif USE_NETCORE + MMethod(MClass* parentClass, StringAnsi&& name, void* handle, int32 paramsCount, MMethodAttributes attributes); #endif public: - #if COMPILE_WITH_PROFILER - MString ProfilerName; + StringAnsi ProfilerName; SourceLocationData ProfilerData; #endif @@ -84,16 +92,23 @@ public: /// /// /// This is the fastest way of calling managed code. - /// Get thunk from class if you want to call static method. You to call it from method of a instance wrapper to call a specific instance. + /// Get thunk from class if you want to call static method. You need to call it from method of a instance wrapper to call a specific instance. + /// Thunks return boxed value but for some smaller types (eg. bool, int, float) the return is inlined into pointer. /// /// The method thunk pointer. void* GetThunk(); #endif + /// + /// Creates a method that is inflated out of generic method. + /// + /// The inflated generic method. + MMethod* InflateGeneric() const; + /// /// Gets the method name. /// - FORCE_INLINE const MString& GetName() const + FORCE_INLINE const StringAnsi& GetName() const { return _name; } @@ -109,7 +124,7 @@ public: /// /// Returns the type of the return value. Returns null if method has no return value. /// - MType GetReturnType() const; + MType* GetReturnType() const; /// /// Returns the number of parameters the method expects. @@ -121,7 +136,7 @@ public: /// /// The parameter type. /// The parameter type. - MType GetParameterType(int32 paramIdx) const; + MType* GetParameterType(int32 paramIdx) const; /// /// Returns the value indicating whenever the method parameter at the specified index is marked as output parameter. @@ -157,7 +172,6 @@ public: #endif public: - /// /// Checks if method has an attribute of the specified type. /// @@ -182,5 +196,5 @@ public: /// Returns an instance of all attributes connected with given method. Returns null if the method doesn't have any attributes. /// /// The array of attribute objects. - const Array& GetAttributes(); + const Array& GetAttributes() const; }; diff --git a/Source/Engine/Scripting/ManagedCLR/MProperty.cpp b/Source/Engine/Scripting/ManagedCLR/MProperty.cpp deleted file mode 100644 index f87bae3ab..000000000 --- a/Source/Engine/Scripting/ManagedCLR/MProperty.cpp +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. - -#include "MProperty.h" -#include "Engine/Core/Math/Math.h" -#include "MMethod.h" -#include "MClass.h" -#include "MType.h" -#if USE_MONO -#include - -MProperty::MProperty(MonoProperty* monoProperty, const char* name, MClass* parentClass) - : _monoProperty(monoProperty) - , _getMethod(nullptr) - , _setMethod(nullptr) - , _parentClass(parentClass) - , _name(name) - , _hasCachedAttributes(false) - , _hasSetMethod(true) - , _hasGetMethod(true) -{ -#if BUILD_DEBUG - // Validate input name - ASSERT(StringUtils::Compare(name, mono_property_get_name(monoProperty)) == 0); -#endif - - GetGetMethod(); - GetSetMethod(); -} - -#endif - -MProperty::~MProperty() -{ - if (_getMethod) - Delete(_getMethod); - if (_setMethod) - Delete(_setMethod); -} - -MType MProperty::GetType() -{ - if (GetGetMethod() != nullptr) - return GetGetMethod()->GetReturnType(); - return GetSetMethod()->GetReturnType(); -} - -MMethod* MProperty::GetGetMethod() -{ - if (!_hasGetMethod) - return nullptr; - if (_getMethod == nullptr) - { -#if USE_MONO - auto method = mono_property_get_get_method(_monoProperty); - if (method != nullptr) - { - _hasGetMethod = true; - return _getMethod = New(method, _parentClass); - } -#endif - } - return _getMethod; -} - -MMethod* MProperty::GetSetMethod() -{ - if (!_hasSetMethod) - return nullptr; - if (_setMethod == nullptr) - { -#if USE_MONO - auto method = mono_property_get_set_method(_monoProperty); - if (method != nullptr) - { - _hasSetMethod = true; - return _setMethod = New(method, _parentClass); - } -#endif - } - return _setMethod; -} - -MVisibility MProperty::GetVisibility() -{ - if (GetGetMethod() && GetSetMethod()) - { - return static_cast( - Math::Max( - static_cast(GetGetMethod()->GetVisibility()), - static_cast(GetSetMethod()->GetVisibility()) - )); - } - if (GetGetMethod()) - { - return GetGetMethod()->GetVisibility(); - } - return GetSetMethod()->GetVisibility(); -} - -bool MProperty::IsStatic() -{ - if (GetGetMethod()) - { - return GetGetMethod()->IsStatic(); - } - if (GetSetMethod()) - { - return GetSetMethod()->IsStatic(); - } - return false; -} - -MObject* MProperty::GetValue(MObject* instance, MObject** exception) -{ -#if USE_MONO - return mono_property_get_value(_monoProperty, instance, nullptr, exception); -#else - return nullptr; -#endif -} - -void MProperty::SetValue(MObject* instance, void* value, MObject** exception) -{ -#if USE_MONO - void* params[1]; - params[0] = value; - mono_property_set_value(_monoProperty, instance, params, exception); -#endif -} - -bool MProperty::HasAttribute(MClass* monoClass) const -{ -#if USE_MONO - MonoClass* parentClass = mono_property_get_parent(_monoProperty); - MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_property(parentClass, _monoProperty); - if (attrInfo == nullptr) - return false; - - const bool hasAttr = mono_custom_attrs_has_attr(attrInfo, monoClass->GetNative()) != 0; - mono_custom_attrs_free(attrInfo); - return hasAttr; -#else - return false; -#endif -} - -bool MProperty::HasAttribute() const -{ -#if USE_MONO - MonoClass* parentClass = mono_property_get_parent(_monoProperty); - MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_property(parentClass, _monoProperty); - if (attrInfo == nullptr) - return false; - - if (attrInfo->num_attrs > 0) - { - mono_custom_attrs_free(attrInfo); - return true; - } - mono_custom_attrs_free(attrInfo); - return false; -#else - return false; -#endif -} - -MObject* MProperty::GetAttribute(MClass* monoClass) const -{ -#if USE_MONO - MonoClass* parentClass = mono_property_get_parent(_monoProperty); - MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_property(parentClass, _monoProperty); - if (attrInfo == nullptr) - return nullptr; - - MonoObject* foundAttr = mono_custom_attrs_get_attr(attrInfo, monoClass->GetNative()); - mono_custom_attrs_free(attrInfo); - return foundAttr; -#else - return nullptr; -#endif -} - -const Array& MProperty::GetAttributes() -{ - if (_hasCachedAttributes) - return _attributes; - - _hasCachedAttributes = true; -#if USE_MONO - MonoClass* parentClass = mono_property_get_parent(_monoProperty); - MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_property(parentClass, _monoProperty); - if (attrInfo == nullptr) - return _attributes; - - MonoArray* monoAttributesArray = mono_custom_attrs_construct(attrInfo); - const auto length = (uint32)mono_array_length(monoAttributesArray); - _attributes.Resize(length); - for (uint32 i = 0; i < length; i++) - _attributes[i] = mono_array_get(monoAttributesArray, MonoObject *, i); - mono_custom_attrs_free(attrInfo); -#endif - return _attributes; -} diff --git a/Source/Engine/Scripting/ManagedCLR/MProperty.h b/Source/Engine/Scripting/ManagedCLR/MProperty.h index a5fe2be43..8d3f560d7 100644 --- a/Source/Engine/Scripting/ManagedCLR/MProperty.h +++ b/Source/Engine/Scripting/ManagedCLR/MProperty.h @@ -14,27 +14,27 @@ class FLAXENGINE_API MProperty friend MClass; protected: - #if USE_MONO MonoProperty* _monoProperty; #endif - MMethod* _getMethod; - MMethod* _setMethod; + mutable MMethod* _getMethod; + mutable MMethod* _setMethod; MClass* _parentClass; - MString _name; + StringAnsi _name; - int32 _hasCachedAttributes : 1; - int32 _hasSetMethod : 1; - int32 _hasGetMethod : 1; + mutable int32 _hasCachedAttributes : 1; + mutable int32 _hasSetMethod : 1; + mutable int32 _hasGetMethod : 1; - Array _attributes; + mutable Array _attributes; public: - #if USE_MONO explicit MProperty(MonoProperty* monoProperty, const char* name, MClass* parentClass); +#elif USE_NETCORE + MProperty(MClass* parentClass, const char* name, void* getterHandle, void* setterHandle, MMethodAttributes getterAttributes, MMethodAttributes setterAttributes); #endif /// @@ -43,11 +43,10 @@ public: ~MProperty(); public: - /// /// Gets the property name. /// - FORCE_INLINE const MString& GetName() const + FORCE_INLINE const StringAnsi& GetName() const { return _name; } @@ -63,30 +62,29 @@ public: /// /// Gets property type class. /// - MType GetType(); + MType* GetType() const; /// /// Gets property get method. /// - MMethod* GetGetMethod(); + MMethod* GetGetMethod() const; /// /// Gets property set method. /// - MMethod* GetSetMethod(); + MMethod* GetSetMethod() const; /// /// Gets property visibility in the class. /// - MVisibility GetVisibility(); + MVisibility GetVisibility() const; /// /// Returns true if property is static. /// - bool IsStatic(); + bool IsStatic() const; public: - /// /// Retrieves value currently set in the property on the specified object instance. If property is static object instance can be null. /// @@ -96,7 +94,7 @@ public: /// The object of given type to get value from. /// An optional pointer to the exception value to store exception object reference. /// The returned boxed value object. - MObject* GetValue(MObject* instance, MObject** exception); + MObject* GetValue(MObject* instance, MObject** exception) const; /// /// Sets a value for the property on the specified object instance. If property is static object instance can be null. @@ -107,11 +105,9 @@ public: /// Object of given type to set value to. /// An optional pointer to the exception value to store exception object reference. /// The value to set of undefined type. - void SetValue(MObject* instance, void* value, MObject** exception); - + void SetValue(MObject* instance, void* value, MObject** exception) const; public: - /// /// Checks if property has an attribute of the specified type. /// @@ -136,5 +132,5 @@ public: /// Returns an instance of all attributes connected with given property. Returns null if the property doesn't have any attributes. /// /// The array of attribute objects. - const Array& GetAttributes(); + const Array& GetAttributes() const; }; diff --git a/Source/Engine/Scripting/ManagedCLR/MStaticConverter.h b/Source/Engine/Scripting/ManagedCLR/MStaticConverter.h deleted file mode 100644 index 3bf373fab..000000000 --- a/Source/Engine/Scripting/ManagedCLR/MStaticConverter.h +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. - -#pragma once - -#include "Engine/Core/Types/String.h" -#if USE_MONO -#include -#endif - -/// -/// Class for converting mono classes and methods into usable form without instancing a class. -/// Mainly used for reflection where full object are not necessary. -/// -class MStaticConverter -{ -public: - -#if USE_MONO - static MonoClass* GetMonoClassFromObject(MonoObject* monoObject) - { - ASSERT(monoObject); - return mono_object_get_class(monoObject); - } - - static Array GetMonoClassArrayFromObjects(Array monoObjectArray) - { - ASSERT(monoObjectArray.Count() > 0); - Array array = Array(monoObjectArray.Count()); - for (auto i = 0; i < monoObjectArray.Count(); i++) - { - array.Add(GetMonoClassFromObject(monoObjectArray[i])); - } - return array; - } - - static String GetClassName(MonoClass* monoClass) - { - ASSERT(monoClass); - return String(mono_class_get_name(monoClass)); - } - - static Array GetClassNames(Array monoClassArray) - { - ASSERT(monoClassArray.Count() > 0); - Array array = Array(monoClassArray.Count()); - for (auto i = 0; i < monoClassArray.Count(); i++) - { - array.Add(GetClassName(monoClassArray[i])); - } - return array; - } - - static String GetClassNamespace(MonoClass* monoClass) - { - ASSERT(monoClass); - return String(mono_class_get_namespace(monoClass)); - } - - static Array GetClassNamespaces(Array monoClassArray) - { - ASSERT(monoClassArray.Count() > 0); - Array array = Array(monoClassArray.Count()); - for (auto i = 0; i < monoClassArray.Count(); i++) - { - array.Add(GetClassName(monoClassArray[i])); - } - return array; - } -#endif -}; diff --git a/Source/Engine/Scripting/ManagedCLR/MType.cpp b/Source/Engine/Scripting/ManagedCLR/MType.cpp deleted file mode 100644 index f7c9faed0..000000000 --- a/Source/Engine/Scripting/ManagedCLR/MType.cpp +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. - -#include "MType.h" -#include "MUtils.h" -#if USE_MONO -#include - -String MType::ToString() const -{ - return _monoType ? String(mono_type_get_name(_monoType)) : String::Empty; -} - -bool MType::IsStruct() const -{ - ASSERT(_monoType); - return mono_type_is_struct(_monoType) != 0; -} - -bool MType::IsVoid() const -{ - ASSERT(_monoType); - return mono_type_is_void(_monoType) != 0; -} - -bool MType::IsPointer() const -{ - ASSERT(_monoType); - return mono_type_is_pointer(_monoType) != 0; -} - -bool MType::IsReference() const -{ - ASSERT(_monoType); - return mono_type_is_reference(_monoType) != 0; -} - -bool MType::IsByRef() const -{ - ASSERT(_monoType); - return mono_type_is_byref(_monoType) != 0; -} - -#else - -String MType::ToString() const -{ - return String::Empty; -} - -#endif diff --git a/Source/Engine/Scripting/ManagedCLR/MType.h b/Source/Engine/Scripting/ManagedCLR/MType.h deleted file mode 100644 index b0c58db7e..000000000 --- a/Source/Engine/Scripting/ManagedCLR/MType.h +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. - -#pragma once - -#include "MTypes.h" - -/// -/// Contains information about managed type. -/// -class MType -{ -public: - -#if USE_MONO - MonoType* _monoType; - - /// - /// Initializes a new instance of the class. - /// - /// The Mono type. - MType(MonoType* monoType) - : _monoType(monoType) - { - } - - /// - /// Initializes a new instance of the class. - /// - MType() - : _monoType(nullptr) - { - } -#endif - - /// - /// Finalizes an instance of the class. - /// - ~MType() - { - } - -public: - - String ToString() const; - -#if USE_MONO - /// - /// Gets mono type handle - /// - MonoType* GetNative() const - { - return _monoType; - } - - bool IsStruct() const; - bool IsVoid() const; - bool IsPointer() const; - bool IsReference() const; - bool IsByRef() const; - -public: - - FORCE_INLINE bool operator==(const MType& other) const - { - return _monoType == other._monoType; - } - - FORCE_INLINE bool operator!=(const MType& other) const - { - return _monoType != other._monoType; - } - - FORCE_INLINE operator bool() const - { - return _monoType != nullptr; - } -#endif -}; diff --git a/Source/Engine/Scripting/ManagedCLR/MTypes.h b/Source/Engine/Scripting/ManagedCLR/MTypes.h index 3b1cbb4a3..f0ab08b96 100644 --- a/Source/Engine/Scripting/ManagedCLR/MTypes.h +++ b/Source/Engine/Scripting/ManagedCLR/MTypes.h @@ -6,11 +6,6 @@ #include "Engine/Core/Types/String.h" #include "Engine/Core/Types/StringView.h" -/// -/// String container for names and typenames used by the managed runtime backend (8-bit chars). -/// -typedef StringAnsi MString; - enum class MVisibility { Private, @@ -20,3 +15,59 @@ enum class MVisibility ProtectedInternal, Public, }; + +enum class MTypes : uint32 +{ + End = 0x00, + Void = 0x01, + Boolean = 0x02, + Char = 0x03, + I1 = 0x04, + U1 = 0x05, + I2 = 0x06, + U2 = 0x07, + I4 = 0x08, + U4 = 0x09, + I8 = 0x0a, + U8 = 0x0b, + R4 = 0x0c, + R8 = 0x0d, + String = 0x0e, + Ptr = 0x0f, + ByRef = 0x10, + ValueType = 0x11, + Class = 0x12, + Var = 0x13, + Array = 0x14, + GenericInst = 0x15, + TypeByRef = 0x16, + I = 0x18, + U = 0x19, + Fnptr = 0x1b, + Object = 0x1c, + SzArray = 0x1d, + MVar = 0x1e, + CmodReqd = 0x1f, + CmodOpt = 0x20, + Internal = 0x21, + Modifier = 0x40, + Sentinel = 0x41, + Pinned = 0x45, + Enum = 0x55, +}; + +enum class MGCCollectionMode +{ + Default = 0, + Forced = 1, + Optimized = 2, + Aggressive = 3 +}; + +#if USE_NETCORE + +enum class MTypeAttributes : uint32; +enum class MMethodAttributes : uint32; +enum class MFieldAttributes : uint32; + +#endif diff --git a/Source/Engine/Scripting/ManagedCLR/MUtils.cpp b/Source/Engine/Scripting/ManagedCLR/MUtils.cpp index bdc16cbd5..d97ff92cd 100644 --- a/Source/Engine/Scripting/ManagedCLR/MUtils.cpp +++ b/Source/Engine/Scripting/ManagedCLR/MUtils.cpp @@ -2,7 +2,8 @@ #include "MUtils.h" #include "MClass.h" -#include "MType.h" +#include "MCore.h" +#include "MDomain.h" #include "Engine/Core/Log.h" #include "Engine/Core/Types/DataContainer.h" #include "Engine/Core/Types/Version.h" @@ -19,283 +20,233 @@ #include "Engine/Core/Math/Ray.h" #include "Engine/Scripting/Scripting.h" #include "Engine/Scripting/ScriptingObject.h" -#include "Engine/Scripting/StdTypesContainer.h" -#include "Engine/Scripting/InternalCalls/ManagedDictionary.h" +#include "Engine/Scripting/Internal/StdTypesContainer.h" +#include "Engine/Scripting/Internal/ManagedDictionary.h" #include "Engine/Utilities/StringConverter.h" #include "Engine/Content/Asset.h" -#if USE_MONO - -// Inlined mono private types to access MonoType internals - -typedef struct _MonoGenericClass MonoGenericClass; -typedef struct _MonoGenericContext MonoGenericContext; - -struct _MonoGenericInst -{ - unsigned int id; - unsigned int type_argc : 22; - unsigned int is_open : 1; - MonoType* type_argv[MONO_ZERO_LEN_ARRAY]; -}; - -struct _MonoGenericContext -{ - MonoGenericInst* class_inst; - MonoGenericInst* method_inst; -}; - -struct _MonoGenericClass -{ - MonoClass* container_class; - MonoGenericContext context; - unsigned int is_dynamic : 1; - unsigned int is_tb_open : 1; - unsigned int need_sync : 1; - MonoClass* cached_class; - class MonoImageSet* owner; -}; - -struct _MonoType -{ - union - { - MonoClass* klass; - MonoType* type; - MonoArrayType* array; - MonoMethodSignature* method; - MonoGenericParam* generic_param; - MonoGenericClass* generic_class; - } data; - - unsigned int attrs : 16; - MonoTypeEnum type : 8; - unsigned int has_cmods : 1; - unsigned int byref : 1; - unsigned int pinned : 1; -}; +#if USE_CSHARP namespace { // typeName in format System.Collections.Generic.Dictionary`2[KeyType,ValueType] - void GetDictionaryKeyValueTypes(const StringAnsiView& typeName, MonoClass*& keyClass, MonoClass*& valueClass) + void GetDictionaryKeyValueTypes(const StringAnsiView& typeName, MClass*& keyClass, MClass*& valueClass) { const int32 keyStart = typeName.Find('['); const int32 keyEnd = typeName.Find(','); const int32 valueEnd = typeName.Find(']'); const StringAnsiView keyTypename(*typeName + keyStart + 1, keyEnd - keyStart - 1); const StringAnsiView valueTypename(*typeName + keyEnd + 1, valueEnd - keyEnd - 1); - keyClass = Scripting::FindClassNative(keyTypename); - valueClass = Scripting::FindClassNative(valueTypename); + keyClass = Scripting::FindClass(keyTypename); + valueClass = Scripting::FindClass(valueTypename); } } -StringView MUtils::ToString(MonoString* str) +StringView MUtils::ToString(MString* str) { if (str == nullptr) return StringView::Empty; - return StringView((const Char*)mono_string_chars(str), (int32)mono_string_length(str)); + return MCore::String::GetChars(str); } -StringAnsi MUtils::ToStringAnsi(MonoString* str) +StringAnsi MUtils::ToStringAnsi(MString* str) { if (str == nullptr) return StringAnsi::Empty; - return StringAnsi((const Char*)mono_string_chars(str), (int32)mono_string_length(str)); + return StringAnsi(MCore::String::GetChars(str)); } -void MUtils::ToString(MonoString* str, String& result) +void MUtils::ToString(MString* str, String& result) { if (str) - result.Set((const Char*)mono_string_chars(str), (int32)mono_string_length(str)); + { + const StringView chars = MCore::String::GetChars(str); + result.Set(chars.Get(), chars.Length()); + } else result.Clear(); } -void MUtils::ToString(MonoString* str, StringView& result) +void MUtils::ToString(MString* str, StringView& result) { if (str) - { - result = StringView((const Char*)mono_string_chars(str), (int32)mono_string_length(str)); - } + result = MCore::String::GetChars(str); else - { result = StringView(); - } } -void MUtils::ToString(MonoString* str, Variant& result) +void MUtils::ToString(MString* str, Variant& result) { - result.SetString(str ? StringView((const Char*)mono_string_chars(str), (int32)mono_string_length(str)) : StringView::Empty); + result.SetString(str ? MCore::String::GetChars(str) : StringView::Empty); } -void MUtils::ToString(MonoString* str, MString& result) +void MUtils::ToString(MString* str, StringAnsi& result) { if (str) - result.Set((const Char*)mono_string_chars(str), (int32)mono_string_length(str)); + { + const StringView chars = MCore::String::GetChars(str); + result.Set(chars.Get(), chars.Length()); + } else result.Clear(); } -MonoString* MUtils::ToString(const char* str) +MString* MUtils::ToString(const char* str) { if (str == nullptr || *str == 0) - return mono_string_empty(mono_domain_get()); - return mono_string_new(mono_domain_get(), str); + return MCore::String::GetEmpty(); + return MCore::String::New(str, StringUtils::Length(str)); } -MonoString* MUtils::ToString(const StringAnsi& str) +MString* MUtils::ToString(const StringAnsi& str) { if (str.IsEmpty()) - return mono_string_empty(mono_domain_get()); - return mono_string_new(mono_domain_get(), str.Get()); + return MCore::String::GetEmpty(); + return MCore::String::New(str.Get(), str.Length()); } -MonoString* MUtils::ToString(const String& str) +MString* MUtils::ToString(const String& str) { if (str.IsEmpty()) - return mono_string_empty(mono_domain_get()); - return mono_string_new_utf16(mono_domain_get(), (const mono_unichar2*)*str, str.Length()); + return MCore::String::GetEmpty(); + return MCore::String::New(str.Get(), str.Length()); } -MonoString* MUtils::ToString(const String& str, MonoDomain* domain) +MString* MUtils::ToString(const String& str, MDomain* domain) { if (str.IsEmpty()) - return mono_string_empty(domain); - return mono_string_new_utf16(domain, (const mono_unichar2*)*str, str.Length()); + return MCore::String::GetEmpty(domain); + return MCore::String::New(str.Get(), str.Length(), domain); } -MonoString* MUtils::ToString(const StringAnsiView& str) +MString* MUtils::ToString(const StringAnsiView& str) { if (str.IsEmpty()) - return mono_string_empty(mono_domain_get()); - return mono_string_new_len(mono_domain_get(), str.Get(), str.Length()); + return MCore::String::GetEmpty(); + return MCore::String::New(str.Get(), str.Length()); } -MonoString* MUtils::ToString(const StringView& str) +MString* MUtils::ToString(const StringView& str) { if (str.IsEmpty()) - return mono_string_empty(mono_domain_get()); - return mono_string_new_utf16(mono_domain_get(), (const mono_unichar2*)*str, str.Length()); + return MCore::String::GetEmpty(); + return MCore::String::New(str.Get(), str.Length()); } -MonoString* MUtils::ToString(const StringView& str, MonoDomain* domain) +MString* MUtils::ToString(const StringView& str, MDomain* domain) { if (str.IsEmpty()) - return mono_string_empty(domain); - return mono_string_new_utf16(domain, (const mono_unichar2*)*str, str.Length()); + return MCore::String::GetEmpty(domain); + return MCore::String::New(str.Get(), str.Length(), domain); } -ScriptingTypeHandle MUtils::UnboxScriptingTypeHandle(MonoReflectionType* value) +ScriptingTypeHandle MUtils::UnboxScriptingTypeHandle(MTypeObject* value) { - MonoClass* klass = GetClass(value); + MClass* klass = GetClass(value); if (!klass) return ScriptingTypeHandle(); - const ScriptingTypeHandle typeHandle = ManagedBinaryModule::FindType(klass); + const StringAnsi& typeName = klass->GetFullName(); + const ScriptingTypeHandle typeHandle = Scripting::FindScriptingType(typeName); if (!typeHandle) - LOG(Warning, "Unknown scripting type {}", String(MUtils::GetClassFullname(klass))); + LOG(Warning, "Unknown scripting type {}", String(typeName)); return typeHandle; } -MonoReflectionType* MUtils::BoxScriptingTypeHandle(const ScriptingTypeHandle& value) +MTypeObject* MUtils::BoxScriptingTypeHandle(const ScriptingTypeHandle& value) { - MonoReflectionType* result = nullptr; + MTypeObject* result = nullptr; if (value) { - MonoType* monoType = mono_class_get_type(value.GetType().ManagedClass->GetNative()); - result = mono_type_get_object(mono_domain_get(), monoType); + MType* mType = value.GetType().ManagedClass->GetType(); + result = INTERNAL_TYPE_GET_OBJECT(mType); } return result; } -VariantType MUtils::UnboxVariantType(MonoReflectionType* value) +VariantType MUtils::UnboxVariantType(MType* type) { - if (value == nullptr) + if (!type) return VariantType(VariantType::Null); - return MoveTemp(UnboxVariantType(mono_reflection_type_get_type(value))); -} - -VariantType MUtils::UnboxVariantType(MonoType* monoType) -{ const auto& stdTypes = *StdTypesContainer::Instance(); - const auto klass = mono_type_get_class(monoType); + MClass* klass = MCore::Type::GetClass(type); + MTypes types = MCore::Type::GetType(type); // Fast type detection for in-built types - switch (monoType->type) + switch (types) { - case MONO_TYPE_VOID: + case MTypes::Void: return VariantType(VariantType::Void); - case MONO_TYPE_BOOLEAN: + case MTypes::Boolean: return VariantType(VariantType::Bool); - case MONO_TYPE_I1: - case MONO_TYPE_I2: + case MTypes::I1: + case MTypes::I2: return VariantType(VariantType::Int16); - case MONO_TYPE_U1: - case MONO_TYPE_U2: + case MTypes::U1: + case MTypes::U2: return VariantType(VariantType::Uint16); - case MONO_TYPE_I4: - case MONO_TYPE_CHAR: + case MTypes::I4: + case MTypes::Char: return VariantType(VariantType::Int); - case MONO_TYPE_U4: + case MTypes::U4: return VariantType(VariantType::Uint); - case MONO_TYPE_I8: + case MTypes::I8: return VariantType(VariantType::Int64); - case MONO_TYPE_U8: + case MTypes::U8: return VariantType(VariantType::Uint64); - case MONO_TYPE_R4: + case MTypes::R4: return VariantType(VariantType::Float); - case MONO_TYPE_R8: + case MTypes::R8: return VariantType(VariantType::Double); - case MONO_TYPE_STRING: + case MTypes::String: return VariantType(VariantType::String); - case MONO_TYPE_PTR: + case MTypes::Ptr: return VariantType(VariantType::Pointer); - case MONO_TYPE_VALUETYPE: - if (klass == stdTypes.GuidClass->GetNative()) + case MTypes::ValueType: + if (klass == stdTypes.GuidClass) return VariantType(VariantType::Guid); - if (klass == stdTypes.Vector2Class->GetNative()) + if (klass == stdTypes.Vector2Class) return VariantType(VariantType::Vector2); - if (klass == stdTypes.Vector3Class->GetNative()) + if (klass == stdTypes.Vector3Class) return VariantType(VariantType::Vector3); - if (klass == stdTypes.Vector4Class->GetNative()) + if (klass == stdTypes.Vector4Class) return VariantType(VariantType::Vector4); - if (klass == Int2::TypeInitializer.GetMonoClass()) + if (klass == Int2::TypeInitializer.GetClass()) return VariantType(VariantType::Int2); - if (klass == Int3::TypeInitializer.GetMonoClass()) + if (klass == Int3::TypeInitializer.GetClass()) return VariantType(VariantType::Int3); - if (klass == Int4::TypeInitializer.GetMonoClass()) + if (klass == Int4::TypeInitializer.GetClass()) return VariantType(VariantType::Int4); - if (klass == Float2::TypeInitializer.GetMonoClass()) + if (klass == Float2::TypeInitializer.GetClass()) return VariantType(VariantType::Float2); - if (klass == Float3::TypeInitializer.GetMonoClass()) + if (klass == Float3::TypeInitializer.GetClass()) return VariantType(VariantType::Float3); - if (klass == Float4::TypeInitializer.GetMonoClass()) + if (klass == Float4::TypeInitializer.GetClass()) return VariantType(VariantType::Float4); - if (klass == Double2::TypeInitializer.GetMonoClass()) + if (klass == Double2::TypeInitializer.GetClass()) return VariantType(VariantType::Double2); - if (klass == Double3::TypeInitializer.GetMonoClass()) + if (klass == Double3::TypeInitializer.GetClass()) return VariantType(VariantType::Double3); - if (klass == Double4::TypeInitializer.GetMonoClass()) + if (klass == Double4::TypeInitializer.GetClass()) return VariantType(VariantType::Double4); - if (klass == stdTypes.ColorClass->GetNative()) + if (klass == stdTypes.ColorClass) return VariantType(VariantType::Color); - if (klass == stdTypes.BoundingBoxClass->GetNative()) + if (klass == stdTypes.BoundingBoxClass) return VariantType(VariantType::BoundingBox); - if (klass == stdTypes.QuaternionClass->GetNative()) + if (klass == stdTypes.QuaternionClass) return VariantType(VariantType::Quaternion); - if (klass == stdTypes.TransformClass->GetNative()) + if (klass == stdTypes.TransformClass) return VariantType(VariantType::Transform); - if (klass == stdTypes.BoundingSphereClass->GetNative()) + if (klass == stdTypes.BoundingSphereClass) return VariantType(VariantType::BoundingSphere); - if (klass == stdTypes.RectangleClass->GetNative()) + if (klass == stdTypes.RectangleClass) return VariantType(VariantType::Rectangle); - if (klass == stdTypes.MatrixClass->GetNative()) + if (klass == stdTypes.MatrixClass) return VariantType(VariantType::Matrix); break; - case MONO_TYPE_OBJECT: + case MTypes::Object: return VariantType(VariantType::ManagedObject); - case MONO_TYPE_SZARRAY: - if (klass == mono_array_class_get(mono_get_byte_class(), 1)) + case MTypes::SzArray: + if (klass == MCore::Array::GetClass(MCore::TypeCache::Byte)) return VariantType(VariantType::Blob); break; } @@ -303,29 +254,28 @@ VariantType MUtils::UnboxVariantType(MonoType* monoType) // Get actual typename for full type info if (!klass) return VariantType(VariantType::Null); - MString fullname; - GetClassFullname(klass, fullname); - switch (monoType->type) + const StringAnsiView fullname = klass->GetFullName(); + switch (types) { - case MONO_TYPE_SZARRAY: - case MONO_TYPE_ARRAY: + case MTypes::SzArray: + case MTypes::Array: return VariantType(VariantType::Array, fullname); - case MONO_TYPE_ENUM: + case MTypes::Enum: return VariantType(VariantType::Enum, fullname); - case MONO_TYPE_VALUETYPE: + case MTypes::ValueType: return VariantType(VariantType::Structure, fullname); } - if (klass == stdTypes.TypeClass->GetNative()) + if (klass == stdTypes.TypeClass) return VariantType(VariantType::Typename); - if (mono_class_is_subclass_of(klass, Asset::GetStaticClass()->GetNative(), false) != 0) + if (klass->IsSubClassOf(Asset::GetStaticClass())) { - if (klass == Asset::GetStaticClass()->GetNative()) + if (klass == Asset::GetStaticClass()) return VariantType(VariantType::Asset); return VariantType(VariantType::Asset, fullname); } - if (mono_class_is_subclass_of(klass, ScriptingObject::GetStaticClass()->GetNative(), false) != 0) + if (klass->IsSubClassOf(ScriptingObject::GetStaticClass())) { - if (klass == ScriptingObject::GetStaticClass()->GetNative()) + if (klass == ScriptingObject::GetStaticClass()) return VariantType(VariantType::Object); return VariantType(VariantType::Object, fullname); } @@ -335,136 +285,137 @@ VariantType MUtils::UnboxVariantType(MonoType* monoType) return VariantType(); } -MonoReflectionType* MUtils::BoxVariantType(const VariantType& value) +MTypeObject* MUtils::BoxVariantType(const VariantType& value) { if (value.Type == VariantType::Null) return nullptr; - MonoClass* klass = GetClass(value); + MClass* klass = GetClass(value); if (!klass) { LOG(Error, "Invalid native type to box {0}", value); return nullptr; } - MonoType* monoType = mono_class_get_type(klass); - return mono_type_get_object(mono_domain_get(), monoType); + MType* mType = klass->GetType(); + return INTERNAL_TYPE_GET_OBJECT(mType); } -Variant MUtils::UnboxVariant(MonoObject* value) +Variant MUtils::UnboxVariant(MObject* value) { if (value == nullptr) return Variant::Null; const auto& stdTypes = *StdTypesContainer::Instance(); - const auto klass = mono_object_get_class(value); - void* unboxed = (byte*)value + sizeof(MonoObject); - const MonoType* monoType = mono_class_get_type(klass); + MClass* klass = MCore::Object::GetClass(value); + + MType* mType = klass->GetType(); + const MTypes mTypes = MCore::Type::GetType(mType); + void* unboxed = MCore::Object::Unbox(value); // Fast type detection for in-built types - switch (monoType->type) + switch (mTypes) { - case MONO_TYPE_VOID: + case MTypes::Void: return Variant(VariantType(VariantType::Void)); - case MONO_TYPE_BOOLEAN: + case MTypes::Boolean: return *static_cast(unboxed); - case MONO_TYPE_I1: + case MTypes::I1: return *static_cast(unboxed); - case MONO_TYPE_U1: + case MTypes::U1: return *static_cast(unboxed); - case MONO_TYPE_I2: + case MTypes::I2: return *static_cast(unboxed); - case MONO_TYPE_U2: + case MTypes::U2: return *static_cast(unboxed); - case MONO_TYPE_CHAR: + case MTypes::Char: return *static_cast(unboxed); - case MONO_TYPE_I4: + case MTypes::I4: return *static_cast(unboxed); - case MONO_TYPE_U4: + case MTypes::U4: return *static_cast(unboxed); - case MONO_TYPE_I8: + case MTypes::I8: return *static_cast(unboxed); - case MONO_TYPE_U8: + case MTypes::U8: return *static_cast(unboxed); - case MONO_TYPE_R4: + case MTypes::R4: return *static_cast(unboxed); - case MONO_TYPE_R8: + case MTypes::R8: return *static_cast(unboxed); - case MONO_TYPE_STRING: - return Variant(MUtils::ToString((MonoString*)value)); - case MONO_TYPE_PTR: + case MTypes::String: + return Variant(MUtils::ToString((MString*)value)); + case MTypes::Ptr: return *static_cast(unboxed); - case MONO_TYPE_VALUETYPE: - if (klass == stdTypes.GuidClass->GetNative()) + case MTypes::ValueType: + if (klass == stdTypes.GuidClass) return Variant(*static_cast(unboxed)); - if (klass == stdTypes.Vector2Class->GetNative()) + if (klass == stdTypes.Vector2Class) return *static_cast(unboxed); - if (klass == stdTypes.Vector3Class->GetNative()) + if (klass == stdTypes.Vector3Class) return *static_cast(unboxed); - if (klass == stdTypes.Vector4Class->GetNative()) + if (klass == stdTypes.Vector4Class) return *static_cast(unboxed); - if (klass == Int2::TypeInitializer.GetMonoClass()) + if (klass == Int2::TypeInitializer.GetClass()) return *static_cast(unboxed); - if (klass == Int3::TypeInitializer.GetMonoClass()) + if (klass == Int3::TypeInitializer.GetClass()) return *static_cast(unboxed); - if (klass == Int4::TypeInitializer.GetMonoClass()) + if (klass == Int4::TypeInitializer.GetClass()) return *static_cast(unboxed); - if (klass == Float2::TypeInitializer.GetMonoClass()) + if (klass == Float2::TypeInitializer.GetClass()) return *static_cast(unboxed); - if (klass == Float3::TypeInitializer.GetMonoClass()) + if (klass == Float3::TypeInitializer.GetClass()) return *static_cast(unboxed); - if (klass == Float4::TypeInitializer.GetMonoClass()) + if (klass == Float4::TypeInitializer.GetClass()) return *static_cast(unboxed); - if (klass == Double2::TypeInitializer.GetMonoClass()) + if (klass == Double2::TypeInitializer.GetClass()) return *static_cast(unboxed); - if (klass == Double3::TypeInitializer.GetMonoClass()) + if (klass == Double3::TypeInitializer.GetClass()) return *static_cast(unboxed); - if (klass == Double4::TypeInitializer.GetMonoClass()) + if (klass == Double4::TypeInitializer.GetClass()) return *static_cast(unboxed); - if (klass == stdTypes.ColorClass->GetNative()) + if (klass == stdTypes.ColorClass) return *static_cast(unboxed); - if (klass == stdTypes.BoundingBoxClass->GetNative()) + if (klass == stdTypes.BoundingBoxClass) return Variant(*static_cast(unboxed)); - if (klass == stdTypes.QuaternionClass->GetNative()) + if (klass == stdTypes.QuaternionClass) return *static_cast(unboxed); - if (klass == stdTypes.TransformClass->GetNative()) + if (klass == stdTypes.TransformClass) return Variant(*static_cast(unboxed)); - if (klass == stdTypes.BoundingSphereClass->GetNative()) + if (klass == stdTypes.BoundingSphereClass) return *static_cast(unboxed); - if (klass == stdTypes.RectangleClass->GetNative()) + if (klass == stdTypes.RectangleClass) return *static_cast(unboxed); - if (klass == stdTypes.MatrixClass->GetNative()) + if (klass == stdTypes.MatrixClass) return Variant(*reinterpret_cast(unboxed)); break; - case MONO_TYPE_SZARRAY: - case MONO_TYPE_ARRAY: + case MTypes::SzArray: + case MTypes::Array: { - if (klass == mono_array_class_get(mono_get_byte_class(), 1)) + void* ptr = MCore::Array::GetAddress((MArray*)value); + MClass* elementClass = klass->GetElementClass(); + if (elementClass == MCore::TypeCache::Byte) { Variant v; - v.SetBlob(mono_array_addr((MonoArray*)value, byte, 0), (int32)mono_array_length((MonoArray*)value)); + v.SetBlob(ptr, MCore::Array::GetLength((MArray*)value)); return v; } - MString fullname; - GetClassFullname(klass, fullname); + const StringAnsiView fullname = klass->GetFullName(); Variant v; v.SetType(MoveTemp(VariantType(VariantType::Array, fullname))); auto& array = v.AsArray(); - array.Resize((int32)mono_array_length((MonoArray*)value)); + array.Resize(MCore::Array::GetLength((MArray*)value)); const StringAnsiView elementTypename(*fullname, fullname.Length() - 2); - MonoClass* elementClass = mono_class_get_element_class(klass); - uint32_t elementAlign; - const int32 elementSize = mono_class_value_size(elementClass, &elementAlign); - if (mono_class_is_enum(elementClass)) + const int32 elementSize = elementClass->GetInstanceSize(); + if (elementClass->IsEnum()) { // Array of Enums for (int32 i = 0; i < array.Count(); i++) { array[i].SetType(VariantType(VariantType::Enum, elementTypename)); - Platform::MemoryCopy(&array[i].AsUint64, mono_array_addr_with_size((MonoArray*)value, elementSize, i), elementSize); + Platform::MemoryCopy(&array[i].AsUint64, (byte*)ptr + elementSize * i, elementSize); } } - else if (mono_class_is_valuetype(elementClass)) + else if (elementClass->IsValueType()) { // Array of Structures - VariantType elementType = UnboxVariantType(mono_class_get_type(elementClass)); + VariantType elementType = UnboxVariantType(elementClass->GetType()); switch (elementType.Type) { case VariantType::Bool: @@ -498,7 +449,7 @@ Variant MUtils::UnboxVariant(MonoObject* value) { auto& a = array[i]; a.SetType(elementType); - Platform::MemoryCopy(&a.AsData, mono_array_addr_with_size((MonoArray*)value, elementSize, i), elementSize); + Platform::MemoryCopy(&a.AsData,(byte*)ptr + elementSize * i, elementSize); } break; case VariantType::Transform: @@ -514,7 +465,7 @@ Variant MUtils::UnboxVariant(MonoObject* value) { auto& a = array[i]; a.SetType(elementType); - Platform::MemoryCopy(a.AsBlob.Data, mono_array_addr_with_size((MonoArray*)value, elementSize, i), elementSize); + Platform::MemoryCopy(a.AsBlob.Data, (byte*)ptr + elementSize * i, elementSize); } break; case VariantType::Structure: @@ -530,10 +481,10 @@ Variant MUtils::UnboxVariant(MonoObject* value) { auto& a = array[i]; a.SetType(elementType); - void* managed = mono_array_addr_with_size((MonoArray*)value, elementSize, i); - // TODO: optimize structures unboxing to not require MonoObject* but raw managed value data to prevent additional boxing here - MonoObject* boxed = mono_object_new(mono_domain_get(), elementClass); - Platform::MemoryCopy(mono_object_unbox(boxed), managed, elementSize); + void* managed = (byte*)ptr + elementSize * i; + // TODO: optimize structures unboxing to not require MObject* but raw managed value data to prevent additional boxing here + MObject* boxed = MCore::Object::New(elementClass); + Platform::MemoryCopy(MCore::Object::Unbox(boxed), managed, elementSize); type.Struct.Unbox(a.AsBlob.Data, boxed); } break; @@ -550,54 +501,51 @@ Variant MUtils::UnboxVariant(MonoObject* value) { // Array of Objects for (int32 i = 0; i < array.Count(); i++) - array[i] = UnboxVariant(mono_array_get((MonoArray*)value, MonoObject*, i)); + array[i] = UnboxVariant(((MObject**)ptr)[i]); } return v; } - case MONO_TYPE_GENERICINST: + case MTypes::GenericInst: { - if (StringUtils::Compare(mono_class_get_name(klass), "Dictionary`2") == 0 && StringUtils::Compare(mono_class_get_namespace(klass), "System.Collections.Generic") == 0) + if (klass->GetName() == "Dictionary`2" && klass->GetNamespace() == "System.Collections.Generic") { // Dictionary ManagedDictionary managed(value); - MonoArray* managedKeys = managed.GetKeys(); - auto length = managedKeys ? (int32)mono_array_length(managedKeys) : 0; + MArray* managedKeys = managed.GetKeys(); + int32 length = managedKeys ? MCore::Array::GetLength(managedKeys) : 0; Dictionary native; native.EnsureCapacity(length); + MObject** managedKeysPtr = MCore::Array::GetAddress(managedKeys); for (int32 i = 0; i < length; i++) { - MonoObject* keyManaged = mono_array_get(managedKeys, MonoObject*, i); - MonoObject* valueManaged = managed.GetValue(keyManaged); + MObject* keyManaged = managedKeysPtr[i]; + MObject* valueManaged = managed.GetValue(keyManaged); native.Add(UnboxVariant(keyManaged), UnboxVariant(valueManaged)); } Variant v(MoveTemp(native)); - StringAnsi typeName; - GetClassFullname(klass, typeName); - v.Type.SetTypeName(typeName); + v.Type.SetTypeName(klass->GetFullName()); return v; } break; } } - if (mono_class_is_subclass_of(klass, Asset::GetStaticClass()->GetNative(), false) != 0) + if (klass->IsSubClassOf(Asset::GetStaticClass())) return static_cast(ScriptingObject::ToNative(value)); - if (mono_class_is_subclass_of(klass, ScriptingObject::GetStaticClass()->GetNative(), false) != 0) + if (klass->IsSubClassOf(ScriptingObject::GetStaticClass())) return ScriptingObject::ToNative(value); - if (mono_class_is_enum(klass)) + if (klass->IsEnum()) { - MString fullname; - GetClassFullname(klass, fullname); + const StringAnsiView fullname = klass->GetFullName(); Variant v; v.Type = MoveTemp(VariantType(VariantType::Enum, fullname)); // TODO: what about 64-bit enum? use enum size with memcpy - v.AsUint64 = *static_cast(mono_object_unbox(value)); + v.AsUint64 = *static_cast(MCore::Object::Unbox(value)); return v; } - if (mono_class_is_valuetype(klass)) + if (klass->IsValueType()) { - MString fullname; - GetClassFullname(klass, fullname); + const StringAnsiView fullname = klass->GetFullName(); const ScriptingTypeHandle typeHandle = Scripting::FindScriptingType(fullname); if (typeHandle) { @@ -616,7 +564,7 @@ Variant MUtils::UnboxVariant(MonoObject* value) return Variant(value); } -MonoObject* MUtils::BoxVariant(const Variant& value) +MObject* MUtils::BoxVariant(const Variant& value) { const auto& stdTypes = *StdTypesContainer::Instance(); switch (value.Type.Type) @@ -625,97 +573,102 @@ MonoObject* MUtils::BoxVariant(const Variant& value) case VariantType::Void: return nullptr; case VariantType::Bool: - return mono_value_box(mono_domain_get(), mono_get_boolean_class(), (void*)&value.AsBool); + return MCore::Object::Box((void*)&value.AsBool, MCore::TypeCache::Boolean); case VariantType::Int16: - return mono_value_box(mono_domain_get(), mono_get_int16_class(), (void*)&value.AsInt16); + return MCore::Object::Box((void*)&value.AsInt16, MCore::TypeCache::Int16); case VariantType::Uint16: - return mono_value_box(mono_domain_get(), mono_get_uint16_class(), (void*)&value.AsUint16); + return MCore::Object::Box((void*)&value.AsUint16, MCore::TypeCache::UInt16); case VariantType::Int: - return mono_value_box(mono_domain_get(), mono_get_int32_class(), (void*)&value.AsInt); + return MCore::Object::Box((void*)&value.AsInt, MCore::TypeCache::Int32); case VariantType::Uint: - return mono_value_box(mono_domain_get(), mono_get_uint32_class(), (void*)&value.AsUint); + return MCore::Object::Box((void*)&value.AsUint, MCore::TypeCache::UInt32); case VariantType::Int64: - return mono_value_box(mono_domain_get(), mono_get_int64_class(), (void*)&value.AsInt64); + return MCore::Object::Box((void*)&value.AsInt64, MCore::TypeCache::Int64); case VariantType::Uint64: - return mono_value_box(mono_domain_get(), mono_get_uint64_class(), (void*)&value.AsUint64); + return MCore::Object::Box((void*)&value.AsUint64, MCore::TypeCache::UInt64); case VariantType::Float: - return mono_value_box(mono_domain_get(), mono_get_single_class(), (void*)&value.AsFloat); + return MCore::Object::Box((void*)&value.AsFloat, MCore::TypeCache::Single); case VariantType::Double: - return mono_value_box(mono_domain_get(), mono_get_double_class(), (void*)&value.AsDouble); + return MCore::Object::Box((void*)&value.AsDouble, MCore::TypeCache::Double); case VariantType::Float2: - return mono_value_box(mono_domain_get(), Float2::TypeInitializer.GetMonoClass(), (void*)&value.AsData); + return MCore::Object::Box((void*)&value.AsData, Float2::TypeInitializer.GetClass()); case VariantType::Float3: - return mono_value_box(mono_domain_get(), Float3::TypeInitializer.GetMonoClass(), (void*)&value.AsData); + return MCore::Object::Box((void*)&value.AsData, Float3::TypeInitializer.GetClass()); case VariantType::Float4: - return mono_value_box(mono_domain_get(), Float4::TypeInitializer.GetMonoClass(), (void*)&value.AsData); + return MCore::Object::Box((void*)&value.AsData, Float4::TypeInitializer.GetClass()); case VariantType::Double2: - return mono_value_box(mono_domain_get(), Double2::TypeInitializer.GetMonoClass(), (void*)&value.AsData); + return MCore::Object::Box((void*)&value.AsData, Double2::TypeInitializer.GetClass()); case VariantType::Double3: - return mono_value_box(mono_domain_get(), Double3::TypeInitializer.GetMonoClass(), (void*)&value.AsData); + return MCore::Object::Box((void*)&value.AsData, Double3::TypeInitializer.GetClass()); case VariantType::Double4: - return mono_value_box(mono_domain_get(), Double4::TypeInitializer.GetMonoClass(), value.AsBlob.Data); + return MCore::Object::Box((void*)&value.AsData, Double4::TypeInitializer.GetClass()); case VariantType::Color: - return mono_value_box(mono_domain_get(), stdTypes.ColorClass->GetNative(), (void*)&value.AsData); + return MCore::Object::Box((void*)&value.AsData, stdTypes.ColorClass); case VariantType::Guid: - return mono_value_box(mono_domain_get(), stdTypes.GuidClass->GetNative(), (void*)&value.AsData); + return MCore::Object::Box((void*)&value.AsData, stdTypes.GuidClass); case VariantType::String: - return (MonoObject*)MUtils::ToString((StringView)value); +#if USE_NETCORE + return (MObject*)MUtils::ToString((StringView)value); +#else + return (MObject*)MUtils::ToString((StringView)value); +#endif case VariantType::Quaternion: - return mono_value_box(mono_domain_get(), stdTypes.QuaternionClass->GetNative(), (void*)&value.AsData); + return MCore::Object::Box((void*)&value.AsData, stdTypes.QuaternionClass); case VariantType::BoundingSphere: - return mono_value_box(mono_domain_get(), stdTypes.BoundingSphereClass->GetNative(), (void*)&value.AsBoundingSphere()); + return MCore::Object::Box((void*)&value.AsBoundingSphere(), stdTypes.BoundingSphereClass); case VariantType::Rectangle: - return mono_value_box(mono_domain_get(), stdTypes.RectangleClass->GetNative(), (void*)&value.AsData); + return MCore::Object::Box((void*)&value.AsData, stdTypes.RectangleClass); case VariantType::Pointer: - return mono_value_box(mono_domain_get(), mono_get_intptr_class(), (void*)&value.AsPointer); + return MCore::Object::Box((void*)&value.AsPointer, MCore::TypeCache::IntPtr); case VariantType::Ray: - return mono_value_box(mono_domain_get(), stdTypes.RayClass->GetNative(), (void*)&value.AsRay()); + return MCore::Object::Box((void*)&value.AsRay(), stdTypes.RayClass); case VariantType::BoundingBox: - return mono_value_box(mono_domain_get(), stdTypes.BoundingBoxClass->GetNative(), (void*)&value.AsBoundingBox()); + return MCore::Object::Box((void*)&value.AsBoundingBox(), stdTypes.BoundingBoxClass); case VariantType::Transform: - return mono_value_box(mono_domain_get(), stdTypes.TransformClass->GetNative(), value.AsBlob.Data); + return MCore::Object::Box(value.AsBlob.Data, stdTypes.TransformClass); case VariantType::Matrix: - return mono_value_box(mono_domain_get(), stdTypes.MatrixClass->GetNative(), value.AsBlob.Data); + return MCore::Object::Box(value.AsBlob.Data, stdTypes.MatrixClass); case VariantType::Blob: - return (MonoObject*)ToArray(Span((const byte*)value.AsBlob.Data, value.AsBlob.Length)); + return (MObject*)ToArray(Span((const byte*)value.AsBlob.Data, value.AsBlob.Length)); case VariantType::Object: return value.AsObject ? value.AsObject->GetOrCreateManagedInstance() : nullptr; case VariantType::Asset: return value.AsAsset ? value.AsAsset->GetOrCreateManagedInstance() : nullptr; case VariantType::Array: { - MonoArray* managed; + MArray* managed; const auto& array = value.AsArray(); if (value.Type.TypeName) { const StringAnsiView elementTypename(value.Type.TypeName, StringUtils::Length(value.Type.TypeName) - 2); const ScriptingTypeHandle typeHandle = Scripting::FindScriptingType(elementTypename); - MonoClass* elementClass; + MClass* elementClass; if (typeHandle && typeHandle.GetType().ManagedClass) - elementClass = typeHandle.GetType().ManagedClass->GetNative(); + elementClass = typeHandle.GetType().ManagedClass; else - elementClass = Scripting::FindClassNative(elementTypename); + elementClass = Scripting::FindClass(elementTypename); if (!elementClass) { LOG(Error, "Invalid type to box {0}", value.Type); return nullptr; } - uint32_t elementAlign; - const int32 elementSize = mono_class_value_size(elementClass, &elementAlign); - managed = mono_array_new(mono_domain_get(), elementClass, array.Count()); - if (mono_class_is_enum(elementClass)) + const int32 elementSize = elementClass->GetInstanceSize(); + managed = MCore::Array::New(elementClass, array.Count()); + if (elementClass->IsEnum()) { // Array of Enums + byte* managedPtr = (byte*)MCore::Array::GetAddress(managed); for (int32 i = 0; i < array.Count(); i++) { auto data = (uint64)array[i]; - Platform::MemoryCopy(mono_array_addr_with_size(managed, elementSize, i), &data, elementSize); + Platform::MemoryCopy(managedPtr + elementSize * i, &data, elementSize); } } - else if (mono_class_is_valuetype(elementClass)) + else if (elementClass->IsValueType()) { // Array of Structures - const VariantType elementType = UnboxVariantType(mono_class_get_type(elementClass)); + const VariantType elementType = UnboxVariantType(elementClass->GetType()); + byte* managedPtr = (byte*)MCore::Array::GetAddress(managed); switch (elementType.Type) { case VariantType::Bool: @@ -746,7 +699,7 @@ MonoObject* MUtils::BoxVariant(const Variant& value) #endif // Optimized boxing of raw data type for (int32 i = 0; i < array.Count(); i++) - Platform::MemoryCopy(mono_array_addr_with_size(managed, elementSize, i), &array[i].AsData, elementSize); + Platform::MemoryCopy(managedPtr + elementSize * i, &array[i].AsData, elementSize); break; case VariantType::Transform: case VariantType::Matrix: @@ -758,7 +711,7 @@ MonoObject* MUtils::BoxVariant(const Variant& value) #endif // Optimized boxing of raw data type for (int32 i = 0; i < array.Count(); i++) - Platform::MemoryCopy(mono_array_addr_with_size(managed, elementSize, i), array[i].AsBlob.Data, elementSize); + Platform::MemoryCopy(managedPtr + elementSize * i, array[i].AsBlob.Data, elementSize); break; case VariantType::Structure: if (typeHandle) @@ -767,9 +720,9 @@ MonoObject* MUtils::BoxVariant(const Variant& value) ASSERT(type.Type == ScriptingTypes::Structure); for (int32 i = 0; i < array.Count(); i++) { - // TODO: optimize structures boxing to not return MonoObject* but use raw managed object to prevent additional boxing here - MonoObject* boxed = type.Struct.Box(array[i].AsBlob.Data); - Platform::MemoryCopy(mono_array_addr_with_size(managed, elementSize, i), mono_object_unbox(boxed), elementSize); + // TODO: optimize structures boxing to not return MObject* but use raw managed object to prevent additional boxing here + MObject* boxed = type.Struct.Box(array[i].AsBlob.Data); + Platform::MemoryCopy(managedPtr + elementSize * i, MCore::Object::Unbox(boxed), elementSize); } break; } @@ -784,22 +737,22 @@ MonoObject* MUtils::BoxVariant(const Variant& value) { // Array of Objects for (int32 i = 0; i < array.Count(); i++) - mono_array_setref(managed, i, BoxVariant(array[i])); + MCore::GC::WriteArrayRef(managed, BoxVariant(array[i]), i); } } else { // object[] - managed = mono_array_new(mono_domain_get(), mono_get_object_class(), array.Count()); + managed = MCore::Array::New(MCore::TypeCache::Object, array.Count()); for (int32 i = 0; i < array.Count(); i++) - mono_array_setref(managed, i, BoxVariant(array[i])); + MCore::GC::WriteArrayRef(managed, BoxVariant(array[i]), i); } - return (MonoObject*)managed; + return (MObject*)managed; } case VariantType::Dictionary: { // Get dictionary key and value types - MonoClass *keyClass, *valueClass; + MClass *keyClass, *valueClass; GetDictionaryKeyValueTypes(value.Type.GetTypeName(), keyClass, valueClass); if (!keyClass || !valueClass) { @@ -808,7 +761,7 @@ MonoObject* MUtils::BoxVariant(const Variant& value) } // Allocate managed dictionary - ManagedDictionary managed = ManagedDictionary::New(mono_class_get_type(keyClass), mono_class_get_type(valueClass)); + ManagedDictionary managed = ManagedDictionary::New(keyClass->GetType(), valueClass->GetType()); if (!managed.Instance) return nullptr; @@ -836,19 +789,23 @@ MonoObject* MUtils::BoxVariant(const Variant& value) } case VariantType::Enum: { - const auto klass = Scripting::FindClassNative(StringAnsiView(value.Type.TypeName)); + const auto klass = Scripting::FindClass(StringAnsiView(value.Type.TypeName)); if (klass) - return mono_value_box(mono_domain_get(), klass, (void*)&value.AsUint64); + return MCore::Object::Box((void*)&value.AsUint64, klass); LOG(Error, "Invalid type to box {0}", value.Type); return nullptr; } case VariantType::ManagedObject: - return value.AsUint ? mono_gchandle_get_target(value.AsUint) : nullptr; +#if USE_NETCORE + return value.AsUint64 ? MCore::GCHandle::GetTarget(value.AsUint64) : nullptr; +#else + return value.AsUint ? MCore::GCHandle::GetTarget(value.AsUint) : nullptr; +#endif case VariantType::Typename: { - const auto klass = Scripting::FindClassNative((StringAnsiView)value); + const auto klass = Scripting::FindClass((StringAnsiView)value); if (klass) - return (MonoObject*)GetType(klass); + return (MObject*)GetType(klass); LOG(Error, "Invalid type to box {0}", value); return nullptr; } @@ -858,332 +815,283 @@ MonoObject* MUtils::BoxVariant(const Variant& value) } } -void MUtils::GetClassFullname(MonoObject* obj, MString& fullname) +const StringAnsi& MUtils::GetClassFullname(MObject* obj) { - if (obj == nullptr) - return; - MonoClass* monoClass = mono_object_get_class(obj); - GetClassFullname(monoClass, fullname); -} - -void MUtils::GetClassFullname(MonoClass* monoClass, MString& fullname) -{ - static MString plusStr("+"); - static MString dotStr("."); - - // Name - fullname = mono_class_get_name(monoClass); - - // Outer class for nested types - MonoClass* nestingClass = mono_class_get_nesting_type(monoClass); - MonoClass* lastClass = monoClass; - while (nestingClass) + if (obj) { - lastClass = nestingClass; - fullname = mono_class_get_name(nestingClass) + plusStr + fullname; - nestingClass = mono_class_get_nesting_type(nestingClass); - } - - // Namespace - const char* lastClassNamespace = mono_class_get_namespace(lastClass); - if (lastClassNamespace && *lastClassNamespace) - fullname = lastClassNamespace + dotStr + fullname; - - // Generic instance arguments - const MonoType* monoType = mono_class_get_type(monoClass); - if (monoType && monoType->type == MONO_TYPE_GENERICINST) - { - fullname += '['; - MString tmp; - for (unsigned int i = 0; i < monoType->data.generic_class->context.class_inst->type_argc; i++) - { - if (i != 0) - fullname += ','; - MonoType* argType = monoType->data.generic_class->context.class_inst->type_argv[i]; - GetClassFullname(mono_type_get_class(argType), tmp); - fullname += tmp; - } - fullname += ']'; + MClass* mClass = MCore::Object::GetClass(obj); + return mClass->GetFullName(); } + return StringAnsi::Empty; } -void MUtils::GetClassFullname(MonoReflectionType* type, MString& fullname) +MClass* MUtils::GetClass(MTypeObject* type) { - if (!type) - return; - MonoType* monoType = mono_reflection_type_get_type(type); - MonoClass* monoClass = mono_class_from_mono_type(monoType); - GetClassFullname(monoClass, fullname); -} - -MonoClass* MUtils::GetClass(MonoObject* object) -{ - return mono_object_get_class(object); -} - -MonoClass* MUtils::GetClass(MonoReflectionType* type) -{ - if (!type) + if (type == nullptr) return nullptr; - MonoType* monoType = mono_reflection_type_get_type(type); - return mono_class_from_mono_type(monoType); + MType* mType = INTERNAL_TYPE_OBJECT_GET(type); + return MCore::Type::GetClass(mType); } -MonoClass* MUtils::GetClass(const VariantType& value) +MClass* MUtils::GetClass(const VariantType& value) { - const auto& stdTypes = *StdTypesContainer::Instance(); auto mclass = Scripting::FindClass(StringAnsiView(value.TypeName)); if (mclass) - return mclass->GetNative(); + return mclass; + const auto& stdTypes = *StdTypesContainer::Instance(); switch (value.Type) { case VariantType::Void: - return mono_get_void_class(); + return MCore::TypeCache::Void; case VariantType::Bool: - return mono_get_boolean_class(); + return MCore::TypeCache::Boolean; case VariantType::Int16: - return mono_get_int16_class(); + return MCore::TypeCache::Int16; case VariantType::Uint16: - return mono_get_uint16_class(); + return MCore::TypeCache::UInt16; case VariantType::Int: - return mono_get_int32_class(); + return MCore::TypeCache::Int32; case VariantType::Uint: - return mono_get_uint32_class(); + return MCore::TypeCache::UInt32; case VariantType::Int64: - return mono_get_int64_class(); + return MCore::TypeCache::Int64; case VariantType::Uint64: - return mono_get_uint64_class(); + return MCore::TypeCache::UInt64; case VariantType::Float: - return mono_get_single_class(); + return MCore::TypeCache::Single; case VariantType::Double: - return mono_get_double_class(); + return MCore::TypeCache::Double; case VariantType::Pointer: - return mono_get_intptr_class(); + return MCore::TypeCache::IntPtr; case VariantType::String: - return mono_get_string_class(); + return MCore::TypeCache::String; case VariantType::Object: - return ScriptingObject::GetStaticClass()->GetNative(); + return ScriptingObject::GetStaticClass(); case VariantType::Asset: - return Asset::GetStaticClass()->GetNative(); + return Asset::GetStaticClass(); case VariantType::Blob: - return mono_array_class_get(mono_get_byte_class(), 1); + return MCore::Array::GetClass(MCore::TypeCache::Byte); case VariantType::Float2: - return Double2::TypeInitializer.GetMonoClass(); + return Double2::TypeInitializer.GetClass(); case VariantType::Float3: - return Float3::TypeInitializer.GetMonoClass(); + return Float3::TypeInitializer.GetClass(); case VariantType::Float4: - return Float4::TypeInitializer.GetMonoClass(); + return Float4::TypeInitializer.GetClass(); case VariantType::Double2: - return Double2::TypeInitializer.GetMonoClass(); + return Double2::TypeInitializer.GetClass(); case VariantType::Double3: - return Double3::TypeInitializer.GetMonoClass(); + return Double3::TypeInitializer.GetClass(); case VariantType::Double4: - return Double4::TypeInitializer.GetMonoClass(); + return Double4::TypeInitializer.GetClass(); case VariantType::Color: - return stdTypes.ColorClass->GetNative(); + return stdTypes.ColorClass; case VariantType::Guid: - return stdTypes.GuidClass->GetNative(); + return stdTypes.GuidClass; case VariantType::Typename: - return stdTypes.TypeClass->GetNative(); + return stdTypes.TypeClass; case VariantType::BoundingBox: - return stdTypes.BoundingBoxClass->GetNative(); + return stdTypes.BoundingBoxClass; case VariantType::BoundingSphere: - return stdTypes.BoundingSphereClass->GetNative(); + return stdTypes.BoundingSphereClass; case VariantType::Quaternion: - return stdTypes.QuaternionClass->GetNative(); + return stdTypes.QuaternionClass; case VariantType::Transform: - return stdTypes.TransformClass->GetNative(); + return stdTypes.TransformClass; case VariantType::Rectangle: - return stdTypes.RectangleClass->GetNative(); + return stdTypes.RectangleClass; case VariantType::Ray: - return stdTypes.RayClass->GetNative(); + return stdTypes.RayClass; case VariantType::Matrix: - return stdTypes.MatrixClass->GetNative(); + return stdTypes.MatrixClass; case VariantType::Array: if (value.TypeName) { const StringAnsiView elementTypename(value.TypeName, StringUtils::Length(value.TypeName) - 2); mclass = Scripting::FindClass(elementTypename); if (mclass) - return mono_array_class_get(mclass->GetNative(), 1); + return MCore::Array::GetClass(mclass); } - return mono_array_class_get(mono_get_object_class(), 1); + return MCore::Array::GetClass(MCore::TypeCache::Object); case VariantType::Dictionary: { - MonoClass *keyClass, *valueClass; + MClass *keyClass, *valueClass; GetDictionaryKeyValueTypes(value.GetTypeName(), keyClass, valueClass); if (!keyClass || !valueClass) { LOG(Error, "Invalid type to box {0}", value.ToString()); return nullptr; } - return GetClass(ManagedDictionary::GetClass(mono_class_get_type(keyClass), mono_class_get_type(valueClass))); + return GetClass(ManagedDictionary::GetClass(keyClass->GetType(), valueClass->GetType())); } case VariantType::ManagedObject: - return mono_get_object_class(); + return MCore::TypeCache::Object; default: ; } return nullptr; } -MonoClass* MUtils::GetClass(const Variant& value) +MClass* MUtils::GetClass(const Variant& value) { const auto& stdTypes = *StdTypesContainer::Instance(); switch (value.Type.Type) { case VariantType::Void: - return mono_get_void_class(); + return MCore::TypeCache::Void; case VariantType::Bool: - return mono_get_boolean_class(); + return MCore::TypeCache::Boolean; case VariantType::Int16: - return mono_get_int16_class(); + return MCore::TypeCache::Int16; case VariantType::Uint16: - return mono_get_uint16_class(); + return MCore::TypeCache::UInt16; case VariantType::Int: - return mono_get_int32_class(); + return MCore::TypeCache::Int32; case VariantType::Uint: - return mono_get_uint32_class(); + return MCore::TypeCache::UInt32; case VariantType::Int64: - return mono_get_int64_class(); + return MCore::TypeCache::Int64; case VariantType::Uint64: - return mono_get_uint64_class(); + return MCore::TypeCache::UInt64; case VariantType::Float: - return mono_get_single_class(); + return MCore::TypeCache::Single; case VariantType::Double: - return mono_get_double_class(); + return MCore::TypeCache::Double; case VariantType::Pointer: - return mono_get_intptr_class(); + return MCore::TypeCache::IntPtr; case VariantType::String: - return mono_get_string_class(); + return MCore::TypeCache::String; case VariantType::Blob: - return mono_array_class_get(mono_get_byte_class(), 1); + return MCore::Array::GetClass(MCore::TypeCache::Byte); case VariantType::Float2: - return Float2::TypeInitializer.GetMonoClass(); + return Float2::TypeInitializer.GetClass(); case VariantType::Float3: - return Float3::TypeInitializer.GetMonoClass(); + return Float3::TypeInitializer.GetClass(); case VariantType::Float4: - return Float4::TypeInitializer.GetMonoClass(); + return Float4::TypeInitializer.GetClass(); case VariantType::Double2: - return Double2::TypeInitializer.GetMonoClass(); + return Double2::TypeInitializer.GetClass(); case VariantType::Double3: - return Double3::TypeInitializer.GetMonoClass(); + return Double3::TypeInitializer.GetClass(); case VariantType::Double4: - return Double4::TypeInitializer.GetMonoClass(); + return Double4::TypeInitializer.GetClass(); case VariantType::Color: - return stdTypes.ColorClass->GetNative(); + return stdTypes.ColorClass; case VariantType::Guid: - return stdTypes.GuidClass->GetNative(); + return stdTypes.GuidClass; case VariantType::Typename: - return stdTypes.TypeClass->GetNative(); + return stdTypes.TypeClass; case VariantType::BoundingBox: - return stdTypes.BoundingBoxClass->GetNative(); + return stdTypes.BoundingBoxClass; case VariantType::BoundingSphere: - return stdTypes.BoundingSphereClass->GetNative(); + return stdTypes.BoundingSphereClass; case VariantType::Quaternion: - return stdTypes.QuaternionClass->GetNative(); + return stdTypes.QuaternionClass; case VariantType::Transform: - return stdTypes.TransformClass->GetNative(); + return stdTypes.TransformClass; case VariantType::Rectangle: - return stdTypes.RectangleClass->GetNative(); + return stdTypes.RectangleClass; case VariantType::Ray: - return stdTypes.RayClass->GetNative(); + return stdTypes.RayClass; case VariantType::Matrix: - return stdTypes.MatrixClass->GetNative(); + return stdTypes.MatrixClass; case VariantType::Array: case VariantType::Dictionary: - return GetClass(value.Type); + break; case VariantType::Object: - return value.AsObject ? value.AsObject->GetClass()->GetNative() : nullptr; + return value.AsObject ? value.AsObject->GetClass() : nullptr; case VariantType::Asset: - return value.AsAsset ? value.AsAsset->GetClass()->GetNative() : nullptr; + return value.AsAsset ? value.AsAsset->GetClass() : nullptr; case VariantType::Structure: case VariantType::Enum: - return Scripting::FindClassNative(StringAnsiView(value.Type.TypeName)); + return Scripting::FindClass(StringAnsiView(value.Type.TypeName)); case VariantType::ManagedObject: - return GetClass((MonoObject*)value); + { + MObject* obj = (MObject*)value; + if (obj) + return MCore::Object::GetClass(obj); + } default: ; } - return nullptr; + return GetClass(value.Type); } -MonoReflectionType* MUtils::GetType(MonoObject* object) +MTypeObject* MUtils::GetType(MObject* object) { - MonoClass* klass = GetClass(object); + if (!object) + return nullptr; + MClass* klass = MCore::Object::GetClass(object); return GetType(klass); } -MonoReflectionType* MUtils::GetType(MonoClass* klass) +MTypeObject* MUtils::GetType(MClass* klass) { - MonoType* monoType = mono_class_get_type(klass); - return mono_type_get_object(mono_domain_get(), monoType); + if (!klass) + return nullptr; + MType* type = klass->GetType(); + return INTERNAL_TYPE_GET_OBJECT(type); } -MonoReflectionType* MUtils::GetType(MClass* mclass) -{ - return mclass ? GetType(mclass->GetNative()) : nullptr; -} - -BytesContainer MUtils::LinkArray(MonoArray* arrayObj) +BytesContainer MUtils::LinkArray(MArray* arrayObj) { BytesContainer result; - const int32 length = arrayObj ? (int32)mono_array_length(arrayObj) : 0; + const int32 length = arrayObj ? MCore::Array::GetLength(arrayObj) : 0; if (length != 0) { - result.Link((byte*)mono_array_addr_with_size(arrayObj, sizeof(byte), 0), length); + result.Link((byte*)MCore::Array::GetAddress(arrayObj), length); } return result; } -void* MUtils::VariantToManagedArgPtr(Variant& value, const MType& type, bool& failed) +void* MUtils::VariantToManagedArgPtr(Variant& value, MType* type, bool& failed) { // Convert Variant into matching managed type and return pointer to data for the method invocation - switch (type.GetNative()->type) + MTypes mType = MCore::Type::GetType(type); + switch (mType) { - case MONO_TYPE_BOOLEAN: + case MTypes::Boolean: if (value.Type.Type != VariantType::Bool) value = (bool)value; return &value.AsBool; - case MONO_TYPE_CHAR: - case MONO_TYPE_I1: - case MONO_TYPE_I2: + case MTypes::Char: + case MTypes::I1: + case MTypes::I2: if (value.Type.Type != VariantType::Int16) value = (int16)value; return &value.AsInt16; - case MONO_TYPE_I4: + case MTypes::I4: if (value.Type.Type != VariantType::Int) value = (int32)value; return &value.AsInt; - case MONO_TYPE_U1: - case MONO_TYPE_U2: + case MTypes::U1: + case MTypes::U2: if (value.Type.Type != VariantType::Uint16) value = (uint16)value; return &value.AsUint16; - case MONO_TYPE_U4: + case MTypes::U4: if (value.Type.Type != VariantType::Uint) value = (uint32)value; return &value.AsUint; - case MONO_TYPE_I8: + case MTypes::I8: if (value.Type.Type != VariantType::Int64) value = (int64)value; return &value.AsInt64; - case MONO_TYPE_U8: + case MTypes::U8: if (value.Type.Type != VariantType::Uint64) value = (uint64)value; return &value.AsUint64; - case MONO_TYPE_R4: + case MTypes::R4: if (value.Type.Type != VariantType::Float) value = (float)value; return &value.AsFloat; - case MONO_TYPE_R8: + case MTypes::R8: if (value.Type.Type != VariantType::Double) value = (double)value; return &value.AsDouble; - case MONO_TYPE_STRING: + case MTypes::String: return MUtils::ToString((StringView)value); - case MONO_TYPE_VALUETYPE: + case MTypes::ValueType: { - MonoClass* klass = type.GetNative()->data.klass; - if (mono_class_is_enum(klass)) + MClass* klass = MCore::Type::GetClass(type); + if (klass->IsEnum()) { if (value.Type.Type != VariantType::Enum) { @@ -1194,7 +1102,7 @@ void* MUtils::VariantToManagedArgPtr(Variant& value, const MType& type, bool& fa } const auto stdTypes = StdTypesContainer::Instance(); #define CASE_IN_BUILD_TYPE(type, access) \ - if (klass == stdTypes->type##Class->GetNative()) \ + if (klass == stdTypes->type##Class) \ { \ if (value.Type.Type != VariantType::type) \ value = Variant((type)value); \ @@ -1208,7 +1116,7 @@ void* MUtils::VariantToManagedArgPtr(Variant& value, const MType& type, bool& fa CASE_IN_BUILD_TYPE(Transform, AsBlob.Data); #undef CASE_IN_BUILD_TYPE #define CASE_IN_BUILD_TYPE(type, access) \ - if (klass == stdTypes->type##Class->GetNative()) \ + if (klass == stdTypes->type##Class) \ { \ if (value.Type.Type != VariantType::type) \ value = Variant((type)value); \ @@ -1222,7 +1130,7 @@ void* MUtils::VariantToManagedArgPtr(Variant& value, const MType& type, bool& fa CASE_IN_BUILD_TYPE(Ray, AsRay); #undef CASE_IN_BUILD_TYPE #define CASE_IN_BUILD_TYPE(type, access) \ - if (klass == type::TypeInitializer.GetMonoClass()) \ + if (klass == type::TypeInitializer.GetClass()) \ { \ if (value.Type.Type != VariantType::type) \ value = Variant((type)value); \ @@ -1235,7 +1143,7 @@ void* MUtils::VariantToManagedArgPtr(Variant& value, const MType& type, bool& fa CASE_IN_BUILD_TYPE(Double3, AsData); CASE_IN_BUILD_TYPE(Double4, AsBlob.Data); #undef CASE_IN_BUILD_TYPE - if (mono_class_is_valuetype(klass)) + if (klass->IsValueType()) { if (value.Type.Type == VariantType::Structure) { @@ -1243,55 +1151,61 @@ void* MUtils::VariantToManagedArgPtr(Variant& value, const MType& type, bool& fa if (typeHandle && value.AsBlob.Data) { auto& valueType = typeHandle.GetType(); - if (valueType.ManagedClass->GetNative() == mono_type_get_class(type.GetNative())) + if (valueType.ManagedClass == MCore::Type::GetClass(type)) { - return mono_object_unbox(valueType.Struct.Box(value.AsBlob.Data)); + return MCore::Object::Unbox(valueType.Struct.Box(value.AsBlob.Data)); } - LOG(Error, "Cannot marshal argument of type {0} as {1}", String(valueType.Fullname), type.ToString()); + LOG(Error, "Cannot marshal argument of type {0} as {1}", String(valueType.Fullname), MCore::Type::ToString(type)); } } else { - MString typeName; - GetClassFullname(klass, typeName); - const ScriptingTypeHandle typeHandle = Scripting::FindScriptingType(typeName); + const StringAnsiView fullname = klass->GetFullName(); + const ScriptingTypeHandle typeHandle = Scripting::FindScriptingType(fullname); if (typeHandle) { auto& valueType = typeHandle.GetType(); - value.SetType(VariantType(VariantType::Structure, typeName)); - return mono_object_unbox(valueType.Struct.Box(value.AsBlob.Data)); + value.SetType(VariantType(VariantType::Structure, fullname)); + return MCore::Object::Unbox(valueType.Struct.Box(value.AsBlob.Data)); } } } } break; - case MONO_TYPE_CLASS: + case MTypes::Enum: + { + if (value.Type.Type != VariantType::Enum) + return nullptr; + return &value.AsUint64; + } + case MTypes::Class: { if (value.Type.Type == VariantType::Null) return nullptr; - MonoObject* object = BoxVariant(value); - if (object && !mono_class_is_subclass_of(mono_object_get_class(object), type.GetNative()->data.klass, false)) + MObject* object = BoxVariant(value); + if (object && !MCore::Object::GetClass(object)->IsSubClassOf(MCore::Type::GetClass(type))) object = nullptr; return object; } - case MONO_TYPE_OBJECT: + case MTypes::Object: return BoxVariant(value); - case MONO_TYPE_SZARRAY: - case MONO_TYPE_ARRAY: + case MTypes::SzArray: + case MTypes::Array: { if (value.Type.Type != VariantType::Array) return nullptr; - MonoObject* object = BoxVariant(value); - if (object && !mono_class_is_subclass_of(mono_object_get_class(object), mono_array_class_get(type.GetNative()->data.klass, 1), false)) + MObject* object = BoxVariant(value); + auto typeStr = MCore::Type::ToString(type); + if (object && !MCore::Object::GetClass(object)->IsSubClassOf(MCore::Type::GetClass(type))) object = nullptr; return object; } - case MONO_TYPE_GENERICINST: + case MTypes::GenericInst: { if (value.Type.Type == VariantType::Null) return nullptr; - MonoObject* object = BoxVariant(value); - if (object && !mono_class_is_subclass_of(mono_object_get_class(object), mono_class_from_mono_type(type.GetNative()), false)) + MObject* object = BoxVariant(value); + if (object && !MCore::Object::GetClass(object)->IsSubClassOf(MCore::Type::GetClass(type))) object = nullptr; return object; } @@ -1302,17 +1216,53 @@ void* MUtils::VariantToManagedArgPtr(Variant& value, const MType& type, bool& fa return nullptr; } -MonoObject* MUtils::ToManaged(const Version& value) +MObject* MUtils::ToManaged(const Version& value) { - auto obj = mono_object_new(mono_domain_get(), Scripting::FindClassNative("System.Version")); - Platform::MemoryCopy((byte*)obj + sizeof(MonoObject), &value, sizeof(Version)); +#if USE_NETCORE + auto scriptingClass = Scripting::GetStaticClass(); + CHECK_RETURN(scriptingClass, nullptr); + auto versionToManaged = scriptingClass->GetMethod("VersionToManaged", 4); + CHECK_RETURN(versionToManaged, nullptr); + + int major = value.Major(); + int minor = value.Minor(); + int build = value.Build(); + int revision = value.Revision(); + + void* params[4]; + params[0] = &major; + params[1] = &minor; + params[2] = &build; + params[3] = &revision; + auto obj = versionToManaged->Invoke(nullptr, params, nullptr); +#else + auto obj = MCore::Object::New(Scripting::FindClass("System.Version")); + Platform::MemoryCopy(MCore::Object::Unbox(obj), &value, sizeof(Version)); +#endif return obj; } -Version MUtils::ToNative(MonoObject* value) +Version MUtils::ToNative(MObject* value) { if (value) - return *(Version*)((byte*)value + sizeof(MonoObject)); +#if USE_NETCORE + { + auto ver = Version(); + + auto scriptingClass = Scripting::GetStaticClass(); + CHECK_RETURN(scriptingClass, ver); + auto versionToNative = scriptingClass->GetMethod("VersionToNative", 2); + CHECK_RETURN(versionToNative, ver); + + void* params[2]; + params[0] = value; + params[1] = &ver; + versionToNative->Invoke(nullptr, params, nullptr); + return ver; + } +#else + return *(Version*)MCore::Object::Unbox(value); +#endif return Version(); } diff --git a/Source/Engine/Scripting/ManagedCLR/MUtils.h b/Source/Engine/Scripting/ManagedCLR/MUtils.h index 7f7480b0a..90feecab3 100644 --- a/Source/Engine/Scripting/ManagedCLR/MUtils.h +++ b/Source/Engine/Scripting/ManagedCLR/MUtils.h @@ -3,80 +3,78 @@ #pragma once #include "MTypes.h" +#include "MCore.h" #include "Engine/Core/Types/StringView.h" #include "Engine/Core/Types/DataContainer.h" #include "Engine/Core/Types/Variant.h" #include "Engine/Core/Collections/Array.h" #include "Engine/Scripting/ScriptingObject.h" -#if USE_MONO - -#include -#include +#if USE_CSHARP struct Version; +class CultureInfo; +template +class BitArray; namespace MUtils { - extern FLAXENGINE_API StringView ToString(MonoString* str); - extern FLAXENGINE_API StringAnsi ToStringAnsi(MonoString* str); - extern FLAXENGINE_API void ToString(MonoString* str, String& result); - extern FLAXENGINE_API void ToString(MonoString* str, StringView& result); - extern FLAXENGINE_API void ToString(MonoString* str, Variant& result); - extern FLAXENGINE_API void ToString(MonoString* str, MString& result); + extern FLAXENGINE_API StringView ToString(MString* str); + extern FLAXENGINE_API StringAnsi ToStringAnsi(MString* str); + extern FLAXENGINE_API void ToString(MString* str, String& result); + extern FLAXENGINE_API void ToString(MString* str, StringView& result); + extern FLAXENGINE_API void ToString(MString* str, Variant& result); + extern FLAXENGINE_API void ToString(MString* str, StringAnsi& result); - extern FLAXENGINE_API MonoString* ToString(const char* str); - extern FLAXENGINE_API MonoString* ToString(const StringAnsi& str); - extern FLAXENGINE_API MonoString* ToString(const String& str); - extern FLAXENGINE_API MonoString* ToString(const String& str, MonoDomain* domain); - extern FLAXENGINE_API MonoString* ToString(const StringAnsiView& str); - extern FLAXENGINE_API MonoString* ToString(const StringView& str); - extern FLAXENGINE_API MonoString* ToString(const StringView& str, MonoDomain* domain); + extern FLAXENGINE_API MString* ToString(const char* str); + extern FLAXENGINE_API MString* ToString(const StringAnsi& str); + extern FLAXENGINE_API MString* ToString(const String& str); + extern FLAXENGINE_API MString* ToString(const String& str, MDomain* domain); + extern FLAXENGINE_API MString* ToString(const StringAnsiView& str); + extern FLAXENGINE_API MString* ToString(const StringView& str); + extern FLAXENGINE_API MString* ToString(const StringView& str, MDomain* domain); - extern FLAXENGINE_API ScriptingTypeHandle UnboxScriptingTypeHandle(MonoReflectionType* value); - extern FLAXENGINE_API MonoReflectionType* BoxScriptingTypeHandle(const ScriptingTypeHandle& value); - extern FLAXENGINE_API VariantType UnboxVariantType(MonoReflectionType* value); - extern FLAXENGINE_API VariantType UnboxVariantType(MonoType* monoType); - extern FLAXENGINE_API MonoReflectionType* BoxVariantType(const VariantType& value); - extern FLAXENGINE_API Variant UnboxVariant(MonoObject* value); - extern FLAXENGINE_API MonoObject* BoxVariant(const Variant& value); + extern FLAXENGINE_API ScriptingTypeHandle UnboxScriptingTypeHandle(MTypeObject* value); + extern FLAXENGINE_API MTypeObject* BoxScriptingTypeHandle(const ScriptingTypeHandle& value); + extern FLAXENGINE_API VariantType UnboxVariantType(MType* type); + extern FLAXENGINE_API MTypeObject* BoxVariantType(const VariantType& value); + extern FLAXENGINE_API Variant UnboxVariant(MObject* value); + extern FLAXENGINE_API MObject* BoxVariant(const Variant& value); } // Converter for data of type T between managed and unmanaged world template struct MConverter { - MonoObject* Box(const T& data, MonoClass* klass); - void Unbox(T& result, MonoObject* data); - void ToManagedArray(MonoArray* result, const Span& data); - template - void ToNativeArray(Array& result, MonoArray* data, int32 length); + MObject* Box(const T& data, const MClass* klass); + void Unbox(T& result, MObject* data); + void ToManagedArray(MArray* result, const Span& data); + void ToNativeArray(Span& result, const MArray* data); }; // Converter for POD types (that can use raw memory copy). template struct MConverter, TNot::Type>>>::Value>::Type> { - MonoObject* Box(const T& data, MonoClass* klass) + MObject* Box(const T& data, const MClass* klass) { - return mono_value_box(mono_domain_get(), klass, (void*)&data); + return MCore::Object::Box((void*)&data, klass); } - void Unbox(T& result, MonoObject* data) + void Unbox(T& result, MObject* data) { CHECK(data); - Platform::MemoryCopy(&result, mono_object_unbox(data), sizeof(T)); + Platform::MemoryCopy(&result, MCore::Object::Unbox(data), sizeof(T)); } - void ToManagedArray(MonoArray* result, const Span& data) + void ToManagedArray(MArray* result, const Span& data) { - Platform::MemoryCopy(mono_array_addr(result, T, 0), data.Get(), data.Length() * sizeof(T)); + Platform::MemoryCopy(MCore::Array::GetAddress(result), data.Get(), data.Length() * sizeof(T)); } - template - void ToNativeArray(Array& result, MonoArray* data, int32 length) + void ToNativeArray(Span& result, const MArray* data) { - result.Add(mono_array_addr(data, T, 0), length); + Platform::MemoryCopy(result.Get(), MCore::Array::GetAddress(data), result.Length() * sizeof(T)); } }; @@ -84,28 +82,42 @@ struct MConverter, TNot struct MConverter { - MonoObject* Box(const String& data, MonoClass* klass) + MObject* Box(const String& data, const MClass* klass) { - return (MonoObject*)MUtils::ToString(data); +#if USE_NETCORE + MString* str = MUtils::ToString(data); + return MCore::Object::Box(str, klass); +#else + return (MObject*)MUtils::ToString(data); +#endif } - void Unbox(String& result, MonoObject* data) + void Unbox(String& result, MObject* data) { - result = MUtils::ToString((MonoString*)data); +#if USE_NETCORE + MString* str = (MString*)MCore::Object::Unbox(data); + result = MUtils::ToString(str); +#else + result = MUtils::ToString((MString*)data); +#endif } - void ToManagedArray(MonoArray* result, const Span& data) + void ToManagedArray(MArray* result, const Span& data) { + if (data.Length() == 0) + return; + MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); for (int32 i = 0; i < data.Length(); i++) - mono_array_setref(result, i, MUtils::ToString(data[i])); + objects[i] = (MObject*)MUtils::ToString(data.Get()[i]); + MCore::GC::WriteArrayRef(result, Span(objects, data.Length())); + Allocator::Free(objects); } - template - void ToNativeArray(Array& result, MonoArray* data, int32 length) + void ToNativeArray(Span& result, const MArray* data) { - result.Resize(length); - for (int32 i = 0; i < length; i++) - MUtils::ToString(mono_array_get(data, MonoString*, i), result[i]); + MString** dataPtr = MCore::Array::GetAddress(data); + for (int32 i = 0; i < result.Length(); i++) + MUtils::ToString(dataPtr[i], result[i]); } }; @@ -113,28 +125,32 @@ struct MConverter template<> struct MConverter { - MonoObject* Box(const StringAnsi& data, MonoClass* klass) + MObject* Box(const StringAnsi& data, const MClass* klass) { - return (MonoObject*)MUtils::ToString(data); + return (MObject*)MUtils::ToString(data); } - void Unbox(StringAnsi& result, MonoObject* data) + void Unbox(StringAnsi& result, MObject* data) { - result = MUtils::ToStringAnsi((MonoString*)data); + result = MUtils::ToStringAnsi((MString*)data); } - void ToManagedArray(MonoArray* result, const Span& data) + void ToManagedArray(MArray* result, const Span& data) { + if (data.Length() == 0) + return; + auto* objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); for (int32 i = 0; i < data.Length(); i++) - mono_array_setref(result, i, MUtils::ToString(data[i])); + objects[i] = (MObject*)MUtils::ToString(data.Get()[i]); + MCore::GC::WriteArrayRef(result, Span(objects, data.Length())); + Allocator::Free(objects); } - template - void ToNativeArray(Array& result, MonoArray* data, int32 length) + void ToNativeArray(Span& result, const MArray* data) { - result.Resize(length); - for (int32 i = 0; i < length; i++) - MUtils::ToString(mono_array_get(data, MonoString*, i), result[i]); + MString** dataPtr = MCore::Array::GetAddress(data); + for (int32 i = 0; i < result.Length(); i++) + MUtils::ToString(dataPtr[i], result[i]); } }; @@ -142,28 +158,32 @@ struct MConverter template<> struct MConverter { - MonoObject* Box(const StringView& data, MonoClass* klass) + MObject* Box(const StringView& data, const MClass* klass) { - return (MonoObject*)MUtils::ToString(data); + return (MObject*)MUtils::ToString(data); } - void Unbox(StringView& result, MonoObject* data) + void Unbox(StringView& result, MObject* data) { - result = MUtils::ToString((MonoString*)data); + result = MUtils::ToString((MString*)data); } - void ToManagedArray(MonoArray* result, const Span& data) + void ToManagedArray(MArray* result, const Span& data) { + if (data.Length() == 0) + return; + MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); for (int32 i = 0; i < data.Length(); i++) - mono_array_setref(result, i, MUtils::ToString(data[i])); + objects[i] = (MObject*)MUtils::ToString(data.Get()[i]); + MCore::GC::WriteArrayRef(result, Span(objects, data.Length())); + Allocator::Free(objects); } - template - void ToNativeArray(Array& result, MonoArray* data, int32 length) + void ToNativeArray(Span& result, const MArray* data) { - result.Resize(length); - for (int32 i = 0; i < length; i++) - MUtils::ToString(mono_array_get(data, MonoString*, i), result[i]); + MString** dataPtr = MCore::Array::GetAddress(data); + for (int32 i = 0; i < result.Length(); i++) + MUtils::ToString(dataPtr[i], result[i]); } }; @@ -171,28 +191,32 @@ struct MConverter template<> struct MConverter { - MonoObject* Box(const Variant& data, MonoClass* klass) + MObject* Box(const Variant& data, const MClass* klass) { return MUtils::BoxVariant(data); } - void Unbox(Variant& result, MonoObject* data) + void Unbox(Variant& result, MObject* data) { result = MUtils::UnboxVariant(data); } - void ToManagedArray(MonoArray* result, const Span& data) + void ToManagedArray(MArray* result, const Span& data) { + if (data.Length() == 0) + return; + MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); for (int32 i = 0; i < data.Length(); i++) - mono_array_setref(result, i, MUtils::BoxVariant(data[i])); + objects[i] = MUtils::BoxVariant(data[i]); + MCore::GC::WriteArrayRef(result, Span(objects, data.Length())); + Allocator::Free(objects); } - template - void ToNativeArray(Array& result, MonoArray* data, int32 length) + void ToNativeArray(Span& result, const MArray* data) { - result.Resize(length); - for (int32 i = 0; i < length; i++) - result[i] = MUtils::UnboxVariant(mono_array_get(data, MonoObject*, i)); + MObject** dataPtr = MCore::Array::GetAddress(data); + for (int32 i = 0; i < result.Length(); i++) + result[i] = MUtils::UnboxVariant(dataPtr[i]); } }; @@ -200,31 +224,32 @@ struct MConverter template struct MConverter::Value>::Type> { - MonoObject* Box(T* data, MonoClass* klass) + MObject* Box(T* data, const MClass* klass) { return data ? data->GetOrCreateManagedInstance() : nullptr; } - void Unbox(T*& result, MonoObject* data) + void Unbox(T*& result, MObject* data) { result = (T*)ScriptingObject::ToNative(data); } - void ToManagedArray(MonoArray* result, const Span& data) + void ToManagedArray(MArray* result, const Span& data) { + if (data.Length() == 0) + return; + MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); for (int32 i = 0; i < data.Length(); i++) - { - auto obj = data[i]; - mono_array_setref(result, i, obj ? obj->GetOrCreateManagedInstance() : nullptr); - } + objects[i] = data.Get()[i] ? data.Get()[i]->GetOrCreateManagedInstance() : nullptr; + MCore::GC::WriteArrayRef(result, Span(objects, data.Length())); + Allocator::Free(objects); } - template - void ToNativeArray(Array& result, MonoArray* data, int32 length) + void ToNativeArray(Span& result, const MArray* data) { - result.Resize(length); - for (int32 i = 0; i < length; i++) - result[i] = (T*)ScriptingObject::ToNative(mono_array_get(data, MonoObject*, i)); + MObject** dataPtr = MCore::Array::GetAddress(data); + for (int32 i = 0; i < result.Length(); i++) + result[i] = (T*)ScriptingObject::ToNative(dataPtr[i]); } }; @@ -232,28 +257,20 @@ struct MConverter::Va template struct MConverter::Value>::Type> { - MonoObject* Box(const T& data, MonoClass* klass) + MObject* Box(const T& data, const MClass* klass) { return data.GetOrCreateManagedInstance(); } - void Unbox(T& result, MonoObject* data) - { - // Not Supported - CRASH; - } - - void ToManagedArray(MonoArray* result, const Span& data) + void ToManagedArray(MArray* result, const Span& data) { + if (data.Length() == 0) + return; + MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); for (int32 i = 0; i < data.Length(); i++) - mono_array_setref(result, i, data[i].GetOrCreateManagedInstance()); - } - - template - void ToNativeArray(Array& result, MonoArray* data, int32 length) - { - // Not Supported - CRASH; + objects[i] = data.Get()[i].GetOrCreateManagedInstance(); + MCore::GC::WriteArrayRef(result, Span(objects, data.Length())); + Allocator::Free(objects); } }; @@ -264,28 +281,32 @@ class ScriptingObjectReference; template struct MConverter> { - MonoObject* Box(const ScriptingObjectReference& data, MonoClass* klass) + MObject* Box(const ScriptingObjectReference& data, const MClass* klass) { return data.GetManagedInstance(); } - void Unbox(ScriptingObjectReference& result, MonoObject* data) + void Unbox(ScriptingObjectReference& result, MObject* data) { result = (T*)ScriptingObject::ToNative(data); } - void ToManagedArray(MonoArray* result, const Span>& data) + void ToManagedArray(MArray* result, const Span>& data) { + if (data.Length() == 0) + return; + MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); for (int32 i = 0; i < data.Length(); i++) - mono_array_setref(result, i, data[i].GetManagedInstance()); + objects[i] = data[i].GetManagedInstance(); + MCore::GC::WriteArrayRef(result, Span(objects, data.Length())); + Allocator::Free(objects); } - template - void ToNativeArray(Array, AllocationType>& result, MonoArray* data, int32 length) + void ToNativeArray(Span>& result, const MArray* data) { - result.Resize(length); - for (int32 i = 0; i < length; i++) - result[i] = (T*)ScriptingObject::ToNative(mono_array_get(data, MonoObject*, i)); + MObject** dataPtr = MCore::Array::GetAddress(data); + for (int32 i = 0; i < result.Length(); i++) + result[i] = (T*)ScriptingObject::ToNative(dataPtr[i]); } }; @@ -296,28 +317,32 @@ class AssetReference; template struct MConverter> { - MonoObject* Box(const AssetReference& data, MonoClass* klass) + MObject* Box(const AssetReference& data, const MClass* klass) { return data.GetManagedInstance(); } - void Unbox(AssetReference& result, MonoObject* data) + void Unbox(AssetReference& result, MObject* data) { result = (T*)ScriptingObject::ToNative(data); } - void ToManagedArray(MonoArray* result, const Span>& data) + void ToManagedArray(MArray* result, const Span>& data) { + if (data.Length() == 0) + return; + MObject** objects = (MObject**)Allocator::Allocate(data.Length() * sizeof(MObject*)); for (int32 i = 0; i < data.Length(); i++) - mono_array_setref(result, i, data[i].GetManagedInstance()); + objects[i] = data[i].GetManagedInstance(); + MCore::GC::WriteArrayRef(result, Span(objects, data.Length())); + Allocator::Free(objects); } - template - void ToNativeArray(Array, AllocationType>& result, MonoArray* data, int32 length) + void ToNativeArray(Span>& result, const MArray* data) { - result.Resize(length); - for (int32 i = 0; i < length; i++) - result[i] = (T*)ScriptingObject::ToNative(mono_array_get(data, MonoObject*, i)); + MObject** dataPtr = MCore::Array::GetAddress(data); + for (int32 i = 0; i < result.Length(); i++) + result[i] = (T*)ScriptingObject::ToNative(dataPtr[i]); } }; @@ -325,102 +350,66 @@ struct MConverter> template struct MConverter> { - MonoObject* Box(const Array& data, MonoClass* klass) + MObject* Box(const Array& data, const MClass* klass) { if (!klass) return nullptr; - // TODO: use shared empty arrays cache - auto result = mono_array_new(mono_domain_get(), klass, data.Count()); + MArray* result = MCore::Array::New(klass, data.Count()); MConverter converter; converter.ToManagedArray(result, Span(data.Get(), data.Count())); - return (MonoObject*)result; + return (MObject*)result; } - void Unbox(Array& result, MonoObject* data) + void Unbox(Array& result, MObject* data) { - auto length = data ? (int32)mono_array_length((MonoArray*)data) : 0; - result.EnsureCapacity(length); + const int32 length = data ? MCore::Array::GetLength((MArray*)data) : 0; + result.Resize(length); MConverter converter; - converter.ToNativeArray(result, (MonoArray*)data, length); - } - - void ToManagedArray(MonoArray* result, const Span>& data) - { - CRASH; // Not implemented - } - - template - void ToNativeArray(Array, AllocationType>& result, MonoArray* data, int32 length) - { - CRASH; // Not implemented + Span resultSpan(result.Get(), length); + converter.ToNativeArray(resultSpan, (MArray*)data); } }; namespace MUtils { // Outputs the full typename for the type of the specified object. - extern FLAXENGINE_API void GetClassFullname(MonoObject* obj, MString& fullname); - - // Outputs the full typename for the specified type. - extern FLAXENGINE_API void GetClassFullname(MonoClass* monoClass, MString& fullname); - - // Outputs the full typename for the specified type. - extern FLAXENGINE_API void GetClassFullname(MonoReflectionType* type, MString& fullname); - - // Outputs the full typename for the type of the specified object. - inline MString GetClassFullname(MonoObject* obj) - { - MString fullname; - GetClassFullname(obj, fullname); - return fullname; - } - - // Outputs the full typename for the type of the specified object. - inline MString GetClassFullname(MonoClass* monoClass) - { - MString fullname; - GetClassFullname(monoClass, fullname); - return fullname; - } + extern FLAXENGINE_API const StringAnsi& GetClassFullname(MObject* obj); // Returns the class of the provided object. - extern FLAXENGINE_API MonoClass* GetClass(MonoObject* object); + extern FLAXENGINE_API MClass* GetClass(MObject* object); // Returns the class of the provided type. - extern FLAXENGINE_API MonoClass* GetClass(MonoReflectionType* type); + extern FLAXENGINE_API MClass* GetClass(MTypeObject* type); // Returns the class of the provided VariantType value. - extern FLAXENGINE_API MonoClass* GetClass(const VariantType& value); + extern FLAXENGINE_API MClass* GetClass(const VariantType& value); // Returns the class of the provided Variant value. - extern FLAXENGINE_API MonoClass* GetClass(const Variant& value); + extern FLAXENGINE_API MClass* GetClass(const Variant& value); // Returns the type of the provided object. - extern FLAXENGINE_API MonoReflectionType* GetType(MonoObject* object); + extern FLAXENGINE_API MTypeObject* GetType(MObject* object); // Returns the type of the provided class. - extern FLAXENGINE_API MonoReflectionType* GetType(MonoClass* klass); - - // Returns the type of the provided class. - extern FLAXENGINE_API MonoReflectionType* GetType(MClass* mclass); + extern FLAXENGINE_API MTypeObject* GetType(MClass* klass); /// - /// Boxes the native value into the MonoObject. + /// Boxes the native value into the managed object. /// /// The value. /// The value type class. template - MonoObject* Box(const T& value, MonoClass* valueClass) + MObject* Box(const T& value, const MClass* valueClass) { MConverter converter; return converter.Box(value, valueClass); } /// - /// Unboxes MonoObject to the native value of the given type. + /// Unboxes MObject to the native value of the given type. /// template - T Unbox(MonoObject* object) + T Unbox(MObject* object) { MConverter converter; T result; @@ -433,7 +422,7 @@ namespace MUtils /// /// The array object. /// The result data container with linked array data bytes (not copied). - extern FLAXENGINE_API BytesContainer LinkArray(MonoArray* arrayObj); + extern FLAXENGINE_API BytesContainer LinkArray(MArray* arrayObj); /// /// Allocates new managed array of data and copies contents from given native array. @@ -442,12 +431,11 @@ namespace MUtils /// The array values type class. /// The output array. template - MonoArray* ToArray(const Span& data, MonoClass* valueClass) + MArray* ToArray(const Span& data, const MClass* valueClass) { if (!valueClass) return nullptr; - // TODO: use shared empty arrays cache - auto result = mono_array_new(mono_domain_get(), valueClass, data.Length()); + MArray* result = MCore::Array::New(valueClass, data.Length()); MConverter converter; converter.ToManagedArray(result, data); return result; @@ -460,7 +448,7 @@ namespace MUtils /// The array values type class. /// The output array. template - FORCE_INLINE MonoArray* ToArray(const Array& data, MonoClass* valueClass) + FORCE_INLINE MArray* ToArray(const Array& data, const MClass* valueClass) { return MUtils::ToArray(Span(data.Get(), data.Count()), valueClass); } @@ -471,13 +459,14 @@ namespace MUtils /// The managed array object. /// The output array. template - Array ToArray(MonoArray* arrayObj) + Array ToArray(MArray* arrayObj) { Array result; - auto length = arrayObj ? (int32)mono_array_length(arrayObj) : 0; - result.EnsureCapacity(length); + const int32 length = arrayObj ? MCore::Array::GetLength(arrayObj) : 0; + result.Resize(length); MConverter converter; - converter.ToNativeArray(result, arrayObj, length); + Span resultSpan(result.Get(), length); + converter.ToNativeArray(resultSpan, arrayObj); return result; } @@ -487,10 +476,10 @@ namespace MUtils /// The managed array object. /// The output array pointer and size. template - Span ToSpan(MonoArray* arrayObj) + Span ToSpan(MArray* arrayObj) { - auto ptr = (T*)(void*)mono_array_addr_with_size(arrayObj, sizeof(T), 0); - auto length = arrayObj ? (int32)mono_array_length(arrayObj) : 0; + T* ptr = (T*)MCore::Array::GetAddress(arrayObj); + const int32 length = arrayObj ? MCore::Array::GetLength(arrayObj) : 0; return Span(ptr, length); } @@ -511,16 +500,15 @@ namespace MUtils /// The array object. /// The result data (linked not copied). template - void ToArray(MonoArray* arrayObj, DataContainer& result) + void ToArray(MArray* arrayObj, DataContainer& result) { - auto length = arrayObj ? (int32)mono_array_length(arrayObj) : 0; + const int32 length = arrayObj ? MCore::Array::GetLength(arrayObj) : 0; if (length == 0) { result.Release(); return; } - - auto bytesRaw = (T*)(void*)mono_array_addr_with_size(arrayObj, sizeof(T), 0); + T* bytesRaw = (T*)MCore::Array::GetAddress(arrayObj); result.Link(bytesRaw, length); } @@ -529,9 +517,9 @@ namespace MUtils /// /// The input data. /// The output array. - FORCE_INLINE MonoArray* ToArray(const Span& data) + FORCE_INLINE MArray* ToArray(const Span& data) { - return ToArray(data, mono_get_byte_class()); + return ToArray(data, MCore::TypeCache::Byte); } /// @@ -539,9 +527,9 @@ namespace MUtils /// /// The input data. /// The output array. - FORCE_INLINE MonoArray* ToArray(Array& data) + FORCE_INLINE MArray* ToArray(Array& data) { - return ToArray(Span(data.Get(), data.Count()), mono_get_byte_class()); + return ToArray(Span(data.Get(), data.Count()), MCore::TypeCache::Byte); } /// @@ -549,9 +537,9 @@ namespace MUtils /// /// The input data. /// The output array. - FORCE_INLINE MonoArray* ToArray(const Span& data) + FORCE_INLINE MArray* ToArray(const Span& data) { - return ToArray(data, mono_get_string_class()); + return ToArray(data, MCore::TypeCache::String); } /// @@ -559,14 +547,56 @@ namespace MUtils /// /// The input data. /// The output array. - FORCE_INLINE MonoArray* ToArray(const Array& data) + FORCE_INLINE MArray* ToArray(const Array& data) { - return ToArray(Span(data.Get(), data.Count()), mono_get_string_class()); + return ToArray(Span(data.Get(), data.Count()), MCore::TypeCache::String); } - extern void* VariantToManagedArgPtr(Variant& value, const MType& type, bool& failed); - extern MonoObject* ToManaged(const Version& value); - extern Version ToNative(MonoObject* value); +#if USE_NETCORE + /// + /// Allocates new boolean array and copies data from the given unmanaged data container. The managed runtime is responsible for releasing the returned array data. + /// + /// The input data. + /// The output array. + FORCE_INLINE bool* ToBoolArray(const Array& data) + { + // System.Runtime.InteropServices.Marshalling.ArrayMarshaller uses CoTask memory alloc to native data pointer + bool* arr = (bool*)MCore::GC::AllocateMemory(data.Count() * sizeof(bool), true); + memcpy(arr, data.Get(), data.Count() * sizeof(bool)); + return arr; + } + + /// + /// Allocates new boolean array and copies data from the given unmanaged data container. The managed runtime is responsible for releasing the returned array data. + /// + /// The input data. + /// The output array. + template + FORCE_INLINE bool* ToBoolArray(const BitArray& data) + { + // System.Runtime.InteropServices.Marshalling.ArrayMarshaller uses CoTask memory alloc to native data pointer + bool* arr = (bool*)MCore::GC::AllocateMemory(data.Count() * sizeof(bool), true); + for (int i = 0; i < data.Count(); i++) + arr[i] = data[i]; + return arr; + } +#else + FORCE_INLINE bool* ToBoolArray(const Array& data) + { + return nullptr; + } + + template + FORCE_INLINE bool* ToBoolArray(const BitArray& data) + { + return nullptr; + } +#endif + + extern void* VariantToManagedArgPtr(Variant& value, MType* type, bool& failed); + + extern MObject* ToManaged(const Version& value); + extern Version ToNative(MObject* value); }; #endif diff --git a/Source/Engine/Scripting/Object.cs b/Source/Engine/Scripting/Object.cs index bc1a4b1b5..b1421eeec 100644 --- a/Source/Engine/Scripting/Object.cs +++ b/Source/Engine/Scripting/Object.cs @@ -2,6 +2,8 @@ using System; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.Marshalling; // ReSharper disable UnassignedReadonlyField // ReSharper disable InconsistentNaming @@ -13,7 +15,8 @@ namespace FlaxEngine /// Base class for all objects Flax can reference. Every object has unique identifier. /// [Serializable] - public abstract class Object + [NativeMarshalling(typeof(Interop.ObjectMarshaller))] + public abstract partial class Object { /// /// The pointer to the unmanaged object (native C++ instance). @@ -273,8 +276,8 @@ namespace FlaxEngine /// /// The pointer to the unmanaged (native) object. /// The object. - [MethodImpl(MethodImplOptions.InternalCall)] - public static extern Object FromUnmanagedPtr(IntPtr ptr); + [LibraryImport("FlaxEngine", EntryPoint = "ObjectInternal_FromUnmanagedPtr", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(Interop.StringMarshaller))] + public static partial Object FromUnmanagedPtr(IntPtr ptr); /// public override int GetHashCode() @@ -284,35 +287,35 @@ namespace FlaxEngine #region Internal Calls - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern Object Internal_Create1(Type type); + [LibraryImport("FlaxEngine", EntryPoint = "ObjectInternal_Create1", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(Interop.StringMarshaller))] + internal static partial Object Internal_Create1([MarshalUsing(typeof(Interop.SystemTypeMarshaller))] Type type); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern Object Internal_Create2(string typeName); + [LibraryImport("FlaxEngine", EntryPoint = "ObjectInternal_Create2", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(Interop.StringMarshaller))] + internal static partial Object Internal_Create2(string typeName); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_ManagedInstanceCreated(Object managedInstance); + [LibraryImport("FlaxEngine", EntryPoint = "ObjectInternal_ManagedInstanceCreated", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(Interop.StringMarshaller))] + internal static partial void Internal_ManagedInstanceCreated(Object managedInstance); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_ManagedInstanceDeleted(IntPtr nativeInstance); + [LibraryImport("FlaxEngine", EntryPoint = "ObjectInternal_ManagedInstanceDeleted", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(Interop.StringMarshaller))] + internal static partial void Internal_ManagedInstanceDeleted(IntPtr nativeInstance); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_Destroy(IntPtr obj, float timeLeft); + [LibraryImport("FlaxEngine", EntryPoint = "ObjectInternal_Destroy", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(Interop.StringMarshaller))] + internal static partial void Internal_Destroy(IntPtr obj, float timeLeft); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern string Internal_GetTypeName(IntPtr obj); + [LibraryImport("FlaxEngine", EntryPoint = "ObjectInternal_GetTypeName", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(Interop.StringMarshaller))] + internal static partial string Internal_GetTypeName(IntPtr obj); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern Object Internal_FindObject(ref Guid id, Type type); + [LibraryImport("FlaxEngine", EntryPoint = "ObjectInternal_FindObject", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(Interop.StringMarshaller))] + internal static partial Object Internal_FindObject(ref Guid id, [MarshalUsing(typeof(Interop.SystemTypeMarshaller))] Type type); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern Object Internal_TryFindObject(ref Guid id, Type type); + [LibraryImport("FlaxEngine", EntryPoint = "ObjectInternal_TryFindObject", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(Interop.StringMarshaller))] + internal static partial Object Internal_TryFindObject(ref Guid id, [MarshalUsing(typeof(Interop.SystemTypeMarshaller))] Type type); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void Internal_ChangeID(IntPtr obj, ref Guid id); + [LibraryImport("FlaxEngine", EntryPoint = "ObjectInternal_ChangeID", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(Interop.StringMarshaller))] + internal static partial void Internal_ChangeID(IntPtr obj, ref Guid id); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern IntPtr Internal_GetUnmanagedInterface(IntPtr obj, Type type); + [LibraryImport("FlaxEngine", EntryPoint = "ObjectInternal_GetUnmanagedInterface", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(Interop.StringMarshaller))] + internal static partial IntPtr Internal_GetUnmanagedInterface(IntPtr obj, [MarshalUsing(typeof(Interop.SystemTypeMarshaller))] Type type); #endregion } diff --git a/Source/Engine/Scripting/Plugins/PluginManager.cpp b/Source/Engine/Scripting/Plugins/PluginManager.cpp index 16b0c5483..328afa69c 100644 --- a/Source/Engine/Scripting/Plugins/PluginManager.cpp +++ b/Source/Engine/Scripting/Plugins/PluginManager.cpp @@ -30,7 +30,7 @@ GamePlugin::GamePlugin(const SpawnParams& params) #if USE_EDITOR #include "EditorPlugin.h" -#include "Engine/Scripting/MException.h" +#include "Engine/Scripting/ManagedCLR/MException.h" #include "Engine/Scripting/ManagedCLR/MMethod.h" EditorPlugin::EditorPlugin(const SpawnParams& params) diff --git a/Source/Engine/Scripting/Runtime/DotNet.cpp b/Source/Engine/Scripting/Runtime/DotNet.cpp new file mode 100644 index 000000000..f2c5ee376 --- /dev/null +++ b/Source/Engine/Scripting/Runtime/DotNet.cpp @@ -0,0 +1,2067 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#include "Engine/Scripting/Types.h" + +#if USE_NETCORE + +#pragma warning(default : 4297) + +#include "Engine/Core/Log.h" +#include "Engine/Core/Types/DateTime.h" +#include "Engine/Core/Types/TimeSpan.h" +#include "Engine/Core/Collections/Dictionary.h" +#include "Engine/Platform/Platform.h" +#include "Engine/Platform/File.h" +#include "Engine/Platform/FileSystem.h" +#include "Engine/Scripting/ManagedCLR/MCore.h" +#include "Engine/Scripting/ManagedCLR/MAssembly.h" +#include "Engine/Scripting/ManagedCLR/MClass.h" +#include "Engine/Scripting/ManagedCLR/MDomain.h" +#include "Engine/Scripting/ManagedCLR/MEvent.h" +#include "Engine/Scripting/ManagedCLR/MField.h" +#include "Engine/Scripting/ManagedCLR/MMethod.h" +#include "Engine/Scripting/ManagedCLR/MProperty.h" +#include "Engine/Scripting/ManagedCLR/MException.h" +#include "Engine/Scripting/ManagedCLR/MUtils.h" +#include "Engine/Scripting/Scripting.h" +#include "Engine/Engine/Globals.h" +#include "Engine/Profiler/ProfilerCPU.h" +#include "Engine/Threading/Threading.h" +#include "Engine/Debug/Exceptions/CLRInnerException.h" +#if DOTNET_HOST_CORECLR +#include +#include +#include +#elif DOTNET_HOST_MONO +#include "Engine/Engine/CommandLine.h" +#include "Engine/Utilities/StringConverter.h" +#include +#include +#include +#include +#include +#include +#include +#include +typedef char char_t; +#define DOTNET_HOST_MONO_DEBUG 0 +#else +#error "Unknown .NET runtime host." +#endif +#if PLATFORM_WINDOWS +#include +#undef SetEnvironmentVariable +#undef GetEnvironmentVariable +#undef LoadLibrary +#undef LoadImage +#endif + +#if defined(_WIN32) +#define CORECLR_DELEGATE_CALLTYPE __stdcall +#define FLAX_CORECLR_STRING String +#define FLAX_CORECLR_TEXT(x) TEXT(x) +#else +#define CORECLR_DELEGATE_CALLTYPE +#define FLAX_CORECLR_STRING StringAnsi +#define FLAX_CORECLR_TEXT(x) x +#endif + +// System.Reflection.TypeAttributes +enum class MTypeAttributes : uint32 +{ + VisibilityMask = 0x00000007, + NotPublic = 0x00000000, + Public = 0x00000001, + NestedPublic = 0x00000002, + NestedPrivate = 0x00000003, + NestedFamily = 0x00000004, + NestedAssembly = 0x00000005, + NestedFamANDAssem = 0x00000006, + NestedFamORAssem = 0x00000007, + LayoutMask = 0x00000018, + AutoLayout = 0x00000000, + SequentialLayout = 0x00000008, + ExplicitLayout = 0x00000010, + ClassSemanticsMask = 0x00000020, + Class = 0x00000000, + Interface = 0x00000020, + Abstract = 0x00000080, + Sealed = 0x00000100, + SpecialName = 0x00000400, + Import = 0x00001000, + Serializable = 0x00002000, + WindowsRuntime = 0x00004000, + StringFormatMask = 0x00030000, + AnsiClass = 0x00000000, + UnicodeClass = 0x00010000, + AutoClass = 0x00020000, + CustomFormatClass = 0x00030000, + CustomFormatMask = 0x00C00000, + BeforeFieldInit = 0x00100000, + RTSpecialName = 0x00000800, + HasSecurity = 0x00040000, + ReservedMask = 0x00040800, +}; + +// System.Reflection.MethodAttributes +enum class MMethodAttributes : uint32 +{ + MemberAccessMask = 0x0007, + PrivateScope = 0x0000, + Private = 0x0001, + FamANDAssem = 0x0002, + Assembly = 0x0003, + Family = 0x0004, + FamORAssem = 0x0005, + Public = 0x0006, + Static = 0x0010, + Final = 0x0020, + Virtual = 0x0040, + HideBySig = 0x0080, + CheckAccessOnOverride = 0x0200, + VtableLayoutMask = 0x0100, + ReuseSlot = 0x0000, + NewSlot = 0x0100, + Abstract = 0x0400, + SpecialName = 0x0800, + PinvokeImpl = 0x2000, + UnmanagedExport = 0x0008, + RTSpecialName = 0x1000, + HasSecurity = 0x4000, + RequireSecObject = 0x8000, + ReservedMask = 0xd000, +}; + +// System.Reflection.FieldAttributes +enum class MFieldAttributes : uint32 +{ + FieldAccessMask = 0x0007, + PrivateScope = 0x0000, + Private = 0x0001, + FamANDAssem = 0x0002, + Assembly = 0x0003, + Family = 0x0004, + FamORAssem = 0x0005, + Public = 0x0006, + Static = 0x0010, + InitOnly = 0x0020, + Literal = 0x0040, + NotSerialized = 0x0080, + SpecialName = 0x0200, + PinvokeImpl = 0x2000, + RTSpecialName = 0x0400, + HasFieldMarshal = 0x1000, + HasDefault = 0x8000, + HasFieldRVA = 0x0100, + ReservedMask = 0x9500, +}; + +DECLARE_ENUM_OPERATORS(MTypeAttributes); +DECLARE_ENUM_OPERATORS(MMethodAttributes); +DECLARE_ENUM_OPERATORS(MFieldAttributes); + +extern MDomain* MRootDomain; +extern MDomain* MActiveDomain; +extern Array> MDomains; + +Dictionary CachedFunctions; +Dictionary CachedClassHandles; +Dictionary CachedAssemblyHandles; + +/// +/// Returns the function pointer to the managed static method in NativeInterop class. +/// +void* GetStaticMethodPointer(const String& methodName); + +/// +/// Calls the managed static method in NativeInterop class with given parameters. +/// +template +inline RetType CallStaticMethodByName(const String& methodName, Args... args) +{ + typedef RetType (CORECLR_DELEGATE_CALLTYPE* fun)(Args...); + return ((fun)GetStaticMethodPointer(methodName))(args...); +} + +/// +/// Calls the managed static method with given parameters. +/// +template +inline RetType CallStaticMethod(void* methodPtr, Args... args) +{ + typedef RetType (CORECLR_DELEGATE_CALLTYPE* fun)(Args...); + return ((fun)methodPtr)(args...); +} + +void RegisterNativeLibrary(const char* moduleName, const char* modulePath) +{ + static void* RegisterNativeLibraryPtr = GetStaticMethodPointer(TEXT("RegisterNativeLibrary")); + CallStaticMethod(RegisterNativeLibraryPtr, moduleName, modulePath); +} + +bool InitHostfxr(); +void ShutdownHostfxr(); + +MAssembly* GetAssembly(void* assemblyHandle); +MClass* GetClass(MType* typeHandle); +MClass* GetOrCreateClass(MType* typeHandle); +MType* GetObjectType(MObject* obj); + +void* GetCustomAttribute(const MClass* klass, const MClass* attributeClass); + +// Structures used to pass information from runtime, must match with the structures in managed side +struct NativeClassDefinitions +{ + void* typeHandle; + const char* name; + const char* fullname; + const char* namespace_; + MTypeAttributes typeAttributes; +}; + +struct NativeMethodDefinitions +{ + const char* name; + int numParameters; + void* handle; + MMethodAttributes methodAttributes; +}; + +struct NativeFieldDefinitions +{ + const char* name; + void* fieldHandle; + void* fieldType; + MFieldAttributes fieldAttributes; +}; + +struct NativePropertyDefinitions +{ + const char* name; + void* getterHandle; + void* setterHandle; + MMethodAttributes getterAttributes; + MMethodAttributes setterAttributes; +}; + +MDomain* MCore::CreateDomain(const StringAnsi& domainName) +{ + return nullptr; +} + +void MCore::UnloadDomain(const StringAnsi& domainName) +{ +} + +bool MCore::LoadEngine() +{ + PROFILE_CPU(); + + // Initialize hostfxr + if (InitHostfxr()) + return true; + + // Prepare managed side + CallStaticMethodByName(TEXT("Init")); +#ifdef MCORE_MAIN_MODULE_NAME + // MCORE_MAIN_MODULE_NAME define is injected by Scripting.Build.cs on platforms that use separate shared library for engine symbols + ::String flaxLibraryPath(Platform::GetMainDirectory() / TEXT(MACRO_TO_STR(MCORE_MAIN_MODULE_NAME))); +#else + ::String flaxLibraryPath(Platform::GetExecutableFilePath()); +#endif +#if PLATFORM_MAC + // On some platforms all native binaries are side-by-side with the app in a different folder + if (!FileSystem::FileExists(flaxLibraryPath)) + { + flaxLibraryPath = ::String(StringUtils::GetDirectoryName(Platform::GetExecutableFilePath())) / StringUtils::GetFileName(flaxLibraryPath); + } +#endif + RegisterNativeLibrary("FlaxEngine", StringAnsi(flaxLibraryPath).Get()); + + MRootDomain = New("Root"); + MDomains.Add(MRootDomain); + + char* buildInfo = CallStaticMethodByName(TEXT("GetRuntimeInformation")); + LOG(Info, ".NET runtime version: {0}", ::String(buildInfo)); + MCore::GC::FreeMemory(buildInfo); + + return false; +} + +void MCore::UnloadEngine() +{ + if (!MRootDomain) + return; + PROFILE_CPU(); + CallStaticMethodByName(TEXT("Exit")); + MDomains.ClearDelete(); + MRootDomain = nullptr; + ShutdownHostfxr(); +} + +#if USE_EDITOR + +void MCore::OnMidHotReload() +{ + // Clear any cached class attributes (see https://github.com/FlaxEngine/FlaxEngine/issues/1108) + for (auto e : CachedClassHandles) + e.Value->_attributes.Clear(); +} + +#endif + +MObject* MCore::Object::Box(void* value, const MClass* klass) +{ + static void* BoxValuePtr = GetStaticMethodPointer(TEXT("BoxValue")); + return (MObject*)CallStaticMethod(BoxValuePtr, klass->_handle, value); +} + +void* MCore::Object::Unbox(MObject* obj) +{ + static void* UnboxValuePtr = GetStaticMethodPointer(TEXT("UnboxValue")); + return CallStaticMethod(UnboxValuePtr, obj); +} + +MObject* MCore::Object::New(const MClass* klass) +{ + static void* NewObjectPtr = GetStaticMethodPointer(TEXT("NewObject")); + return (MObject*)CallStaticMethod(NewObjectPtr, klass->_handle); +} + +void MCore::Object::Init(MObject* obj) +{ + static void* ObjectInitPtr = GetStaticMethodPointer(TEXT("ObjectInit")); + CallStaticMethod(ObjectInitPtr, obj); +} + +MClass* MCore::Object::GetClass(MObject* obj) +{ + ASSERT(obj); + MType* typeHandle = GetObjectType(obj); + return GetOrCreateClass(typeHandle); +} + +MString* MCore::Object::ToString(MObject* obj) +{ + static void* GetObjectStringPtr = GetStaticMethodPointer(TEXT("GetObjectString")); + return (MString*)CallStaticMethod(GetObjectStringPtr, obj); +} + +int32 MCore::Object::GetHashCode(MObject* obj) +{ + static void* GetObjectStringPtr = GetStaticMethodPointer(TEXT("GetObjectHashCode")); + return CallStaticMethod(GetObjectStringPtr, obj); +} + +MString* MCore::String::GetEmpty(MDomain* domain) +{ + static void* GetStringEmptyPtr = GetStaticMethodPointer(TEXT("GetStringEmpty")); + return (MString*)CallStaticMethod(GetStringEmptyPtr); +} + +MString* MCore::String::New(const char* str, int32 length, MDomain* domain) +{ + static void* NewStringLengthPtr = GetStaticMethodPointer(TEXT("NewStringLength")); + return (MString*)CallStaticMethod(NewStringLengthPtr, str, length); +} + +MString* MCore::String::New(const Char* str, int32 length, MDomain* domain) +{ + static void* NewStringUTF16Ptr = GetStaticMethodPointer(TEXT("NewStringUTF16")); + return (MString*)CallStaticMethod(NewStringUTF16Ptr, str, length); +} + +StringView MCore::String::GetChars(MString* obj) +{ + int32 length = 0; + static void* GetStringPointerPtr = GetStaticMethodPointer(TEXT("GetStringPointer")); + const Char* chars = CallStaticMethod(GetStringPointerPtr, obj, &length); + return StringView(chars, length); +} + +MArray* MCore::Array::New(const MClass* elementKlass, int32 length) +{ + static void* NewArrayPtr = GetStaticMethodPointer(TEXT("NewArray")); + return (MArray*)CallStaticMethod(NewArrayPtr, elementKlass->_handle, length); +} + +MClass* MCore::Array::GetClass(MClass* elementKlass) +{ + static void* GetArrayLengthPtr = GetStaticMethodPointer(TEXT("GetArrayTypeFromElementType")); + MType* typeHandle = (MType*)CallStaticMethod(GetArrayLengthPtr, elementKlass->_handle); + return GetOrCreateClass(typeHandle); +} + +int32 MCore::Array::GetLength(const MArray* obj) +{ + static void* GetArrayLengthPtr = GetStaticMethodPointer(TEXT("GetArrayLength")); + return CallStaticMethod(GetArrayLengthPtr, (void*)obj); +} + +void* MCore::Array::GetAddress(const MArray* obj) +{ + static void* GetArrayPointerPtr = GetStaticMethodPointer(TEXT("GetArrayPointer")); + return CallStaticMethod(GetArrayPointerPtr, (void*)obj); +} + +MGCHandle MCore::GCHandle::New(MObject* obj, bool pinned) +{ + ASSERT(obj); + static void* NewGCHandlePtr = GetStaticMethodPointer(TEXT("NewGCHandle")); + return (MGCHandle)CallStaticMethod(NewGCHandlePtr, obj, pinned); +} + +MGCHandle MCore::GCHandle::NewWeak(MObject* obj, bool trackResurrection) +{ + ASSERT(obj); + static void* NewGCHandleWeakPtr = GetStaticMethodPointer(TEXT("NewGCHandleWeak")); + return (MGCHandle)CallStaticMethod(NewGCHandleWeakPtr, obj, trackResurrection); +} + +MObject* MCore::GCHandle::GetTarget(const MGCHandle& handle) +{ + return (MObject*)(void*)handle; +} + +void MCore::GCHandle::Free(const MGCHandle& handle) +{ + static void* FreeGCHandlePtr = GetStaticMethodPointer(TEXT("FreeGCHandle")); + CallStaticMethod(FreeGCHandlePtr, (void*)handle); +} + +void MCore::GC::Collect() +{ + PROFILE_CPU(); + static void* GCCollectPtr = GetStaticMethodPointer(TEXT("GCCollect")); + CallStaticMethod(GCCollectPtr, MaxGeneration(), (int)MGCCollectionMode::Default, true, false); +} + +void MCore::GC::Collect(int32 generation) +{ + PROFILE_CPU(); + static void* GCCollectPtr = GetStaticMethodPointer(TEXT("GCCollect")); + CallStaticMethod(GCCollectPtr, generation, (int)MGCCollectionMode::Default, true, false); +} + +void MCore::GC::Collect(int32 generation, MGCCollectionMode collectionMode, bool blocking, bool compacting) +{ + PROFILE_CPU(); + static void* GCCollectPtr = GetStaticMethodPointer(TEXT("GCCollect")); + CallStaticMethod(GCCollectPtr, generation, (int)collectionMode, blocking, compacting); +} + +int32 MCore::GC::MaxGeneration() +{ + static int32 maxGeneration = CallStaticMethod(GetStaticMethodPointer(TEXT("GCMaxGeneration"))); + return maxGeneration; +} + +void MCore::GC::WaitForPendingFinalizers() +{ + PROFILE_CPU(); + static void* GCWaitForPendingFinalizersPtr = GetStaticMethodPointer(TEXT("GCWaitForPendingFinalizers")); + CallStaticMethod(GCWaitForPendingFinalizersPtr); +} + +void MCore::GC::WriteRef(void* ptr, MObject* ref) +{ + *(void**)ptr = ref; +} + +void MCore::GC::WriteValue(void* dst, void* src, int32 count, const MClass* klass) +{ + const int32 size = klass->GetInstanceSize(); + memcpy(dst, src, count * size); +} + +void MCore::GC::WriteArrayRef(MArray* dst, MObject* ref, int32 index) +{ + static void* WriteArrayReferencePtr = GetStaticMethodPointer(TEXT("WriteArrayReference")); + CallStaticMethod(WriteArrayReferencePtr, dst, ref, index); +} + +void MCore::GC::WriteArrayRef(MArray* dst, Span refs) +{ + static void* WriteArrayReferencesPtr = GetStaticMethodPointer(TEXT("WriteArrayReferences")); + CallStaticMethod(WriteArrayReferencesPtr, dst, refs.Get(), refs.Length()); +} + +void* MCore::GC::AllocateMemory(int32 size, bool coTaskMem) +{ + static void* AllocMemoryPtr = GetStaticMethodPointer(TEXT("AllocMemory")); + return CallStaticMethod(AllocMemoryPtr, size, coTaskMem); +} + +void MCore::GC::FreeMemory(void* ptr, bool coTaskMem) +{ + if (!ptr) + return; + static void* FreeMemoryPtr = GetStaticMethodPointer(TEXT("FreeMemory")); + CallStaticMethod(FreeMemoryPtr, ptr, coTaskMem); +} + +void MCore::Thread::Attach() +{ +} + +void MCore::Thread::Exit() +{ +} + +bool MCore::Thread::IsAttached() +{ + return true; +} + +void MCore::Exception::Throw(MObject* exception) +{ + static void* RaiseExceptionPtr = GetStaticMethodPointer(TEXT("RaiseException")); + CallStaticMethod(RaiseExceptionPtr, exception); +} + +MObject* MCore::Exception::GetNullReference() +{ + static void* GetNullReferenceExceptionPtr = GetStaticMethodPointer(TEXT("GetNullReferenceException")); + return (MObject*)CallStaticMethod(GetNullReferenceExceptionPtr); +} + +MObject* MCore::Exception::Get(const char* msg) +{ + static void* GetExceptionPtr = GetStaticMethodPointer(TEXT("GetException")); + return (MObject*)CallStaticMethod(GetExceptionPtr, msg); +} + +MObject* MCore::Exception::GetArgument(const char* arg, const char* msg) +{ + static void* GetArgumentExceptionPtr = GetStaticMethodPointer(TEXT("GetArgumentException")); + return (MObject*)CallStaticMethod(GetArgumentExceptionPtr); +} + +MObject* MCore::Exception::GetArgumentNull(const char* arg) +{ + static void* GetArgumentNullExceptionPtr = GetStaticMethodPointer(TEXT("GetArgumentNullException")); + return (MObject*)CallStaticMethod(GetArgumentNullExceptionPtr); +} + +MObject* MCore::Exception::GetArgumentOutOfRange(const char* arg) +{ + static void* GetArgumentOutOfRangeExceptionPtr = GetStaticMethodPointer(TEXT("GetArgumentOutOfRangeException")); + return (MObject*)CallStaticMethod(GetArgumentOutOfRangeExceptionPtr); +} + +MObject* MCore::Exception::GetNotSupported(const char* msg) +{ + static void* GetNotSupportedExceptionPtr = GetStaticMethodPointer(TEXT("GetNotSupportedException")); + return (MObject*)CallStaticMethod(GetNotSupportedExceptionPtr); +} + +::String MCore::Type::ToString(MType* type) +{ + MClass* klass = GetOrCreateClass(type); + return ::String(klass->GetFullName()); +} + +MClass* MCore::Type::GetClass(MType* type) +{ + static void* GetTypeClassPtr = GetStaticMethodPointer(TEXT("GetTypeClass")); + type = (MType*)CallStaticMethod(GetTypeClassPtr, type); + return GetOrCreateClass(type); +} + +MType* MCore::Type::GetElementType(MType* type) +{ + static void* GetElementClassPtr = GetStaticMethodPointer(TEXT("GetElementClass")); + return (MType*)CallStaticMethod(GetElementClassPtr, type); +} + +int32 MCore::Type::GetSize(MType* type) +{ + return GetOrCreateClass(type)->GetInstanceSize(); +} + +MTypes MCore::Type::GetType(MType* type) +{ + MClass* klass = GetOrCreateClass(type); + if (klass->_types == 0) + { + static void* GetTypeMTypesEnumPtr = GetStaticMethodPointer(TEXT("GetTypeMTypesEnum")); + klass->_types = CallStaticMethod(GetTypeMTypesEnumPtr, klass->_handle); + } + return (MTypes)klass->_types; +} + +bool MCore::Type::IsPointer(MType* type) +{ + static void* GetTypeIsPointerPtr = GetStaticMethodPointer(TEXT("GetTypeIsPointer")); + return CallStaticMethod(GetTypeIsPointerPtr, type); +} + +bool MCore::Type::IsReference(MType* type) +{ + static void* GetTypeIsReferencePtr = GetStaticMethodPointer(TEXT("GetTypeIsReference")); + return CallStaticMethod(GetTypeIsReferencePtr, type); +} + +const MAssembly::ClassesDictionary& MAssembly::GetClasses() const +{ + if (_hasCachedClasses || !IsLoaded()) + return _classes; + PROFILE_CPU(); + const auto startTime = DateTime::NowUTC(); + +#if TRACY_ENABLE + ZoneText(*_name, _name.Length()); +#endif + ScopeLock lock(_locker); + if (_hasCachedClasses) + return _classes; + ASSERT(_classes.IsEmpty()); + + NativeClassDefinitions* managedClasses; + int classCount; + static void* GetManagedClassesPtr = GetStaticMethodPointer(TEXT("GetManagedClasses")); + CallStaticMethod(GetManagedClassesPtr, _handle, &managedClasses, &classCount); + _classes.EnsureCapacity(classCount); + for (int32 i = 0; i < classCount; i++) + { + NativeClassDefinitions& managedClass = managedClasses[i]; + + // Create class object + MClass* klass = New(this, managedClass.typeHandle, managedClass.name, managedClass.fullname, managedClass.namespace_, managedClass.typeAttributes); + _classes.Add(klass->GetFullName(), klass); + + MCore::GC::FreeMemory((void*)managedClasses[i].name); + MCore::GC::FreeMemory((void*)managedClasses[i].fullname); + MCore::GC::FreeMemory((void*)managedClasses[i].namespace_); + } + MCore::GC::FreeMemory(managedClasses); + + const auto endTime = DateTime::NowUTC(); + LOG(Info, "Caching classes for assembly {0} took {1}ms", String(_name), (int32)(endTime - startTime).GetTotalMilliseconds()); + +#if 0 + for (auto i = _classes.Begin(); i.IsNotEnd(); ++i) + LOG(Info, "Class: {0}", String(i->Value->GetFullName())); +#endif + + _hasCachedClasses = true; + return _classes; +} + +bool MAssembly::LoadCorlib() +{ + if (IsLoaded()) + return false; + PROFILE_CPU(); +#if TRACY_ENABLE + const StringAnsiView name("Corlib"); + ZoneText(*name, name.Length()); +#endif + + // Ensure to be unloaded + Unload(); + + // Start + const auto startTime = DateTime::NowUTC(); + OnLoading(); + + // Load + { + const char* name; + const char* fullname; + static void* GetAssemblyByNamePtr = GetStaticMethodPointer(TEXT("GetAssemblyByName")); + _handle = CallStaticMethod(GetAssemblyByNamePtr, "System.Private.CoreLib", &name, &fullname); + _name = name; + _fullname = fullname; + MCore::GC::FreeMemory((void*)name); + MCore::GC::FreeMemory((void*)fullname); + } + if (_handle == nullptr) + { + OnLoadFailed(); + return true; + } + _hasCachedClasses = false; + CachedAssemblyHandles.Add(_handle, this); + + // End + OnLoaded(startTime); + return false; +} + +bool MAssembly::LoadImage(const String& assemblyPath, const StringView& nativePath) +{ + // TODO: Use new hostfxr delegate load_assembly_bytes? (.NET 8+) + // Open .Net assembly + const StringAnsi assemblyPathAnsi = assemblyPath.ToStringAnsi(); + const char* name; + const char* fullname; + static void* LoadAssemblyImagePtr = GetStaticMethodPointer(TEXT("LoadAssemblyImage")); + _handle = CallStaticMethod(LoadAssemblyImagePtr, assemblyPathAnsi.Get(), &name, &fullname); + _name = name; + _fullname = fullname; + MCore::GC::FreeMemory((void*)name); + MCore::GC::FreeMemory((void*)fullname); + if (_handle == nullptr) + { + Log::CLRInnerException(TEXT(".NET assembly image is invalid at ") + assemblyPath); + return true; + } + CachedAssemblyHandles.Add(_handle, this); + + // Provide new path of hot-reloaded native library path for managed DllImport + if (nativePath.HasChars()) + { + RegisterNativeLibrary(assemblyPathAnsi.Get(), StringAnsi(nativePath).Get()); + } + + _hasCachedClasses = false; + _assemblyPath = assemblyPath; + return false; +} + +bool MAssembly::UnloadImage(bool isReloading) +{ + if (_handle) + { + // TODO: closing assembly on reload only is copy-paste from mono, do we need do this on .NET too? + if (isReloading) + { + LOG(Info, "Unloading managed assembly \'{0}\' (is reloading)", String(_name)); + + static void* CloseAssemblyPtr = GetStaticMethodPointer(TEXT("CloseAssembly")); + CallStaticMethod(CloseAssemblyPtr, _handle); + } + + CachedAssemblyHandles.Remove(_handle); + _handle = nullptr; + } + return false; +} + +MClass::MClass(const MAssembly* parentAssembly, void* handle, const char* name, const char* fullname, const char* namespace_, MTypeAttributes attributes) + : _handle(handle) + , _name(name) + , _namespace_(namespace_) + , _assembly(parentAssembly) + , _fullname(fullname) + , _hasCachedProperties(false) + , _hasCachedFields(false) + , _hasCachedMethods(false) + , _hasCachedAttributes(false) + , _hasCachedEvents(false) + , _hasCachedInterfaces(false) +{ + ASSERT(handle != nullptr); + switch (attributes & MTypeAttributes::VisibilityMask) + { + case MTypeAttributes::NotPublic: + case MTypeAttributes::NestedPrivate: + _visibility = MVisibility::Private; + break; + case MTypeAttributes::Public: + case MTypeAttributes::NestedPublic: + _visibility = MVisibility::Public; + break; + case MTypeAttributes::NestedFamily: + case MTypeAttributes::NestedAssembly: + _visibility = MVisibility::Internal; + break; + case MTypeAttributes::NestedFamORAssem: + _visibility = MVisibility::ProtectedInternal; + break; + case MTypeAttributes::NestedFamANDAssem: + _visibility = MVisibility::PrivateProtected; + break; + default: + CRASH; + } + + const MTypeAttributes staticClassFlags = MTypeAttributes::Abstract | MTypeAttributes::Sealed; + _isStatic = (attributes & staticClassFlags) == staticClassFlags; + _isSealed = !_isStatic && (attributes & MTypeAttributes::Sealed) == MTypeAttributes::Sealed; + _isAbstract = !_isStatic && (attributes & MTypeAttributes::Abstract) == MTypeAttributes::Abstract; + _isInterface = (attributes & MTypeAttributes::ClassSemanticsMask) == MTypeAttributes::Interface; + + // TODO: pass type info from C# side at once (pack into flags with attributes) + + static void* TypeIsValueTypePtr = GetStaticMethodPointer(TEXT("TypeIsValueType")); + _isValueType = CallStaticMethod(TypeIsValueTypePtr, handle); + + static void* TypeIsEnumPtr = GetStaticMethodPointer(TEXT("TypeIsEnum")); + _isEnum = CallStaticMethod(TypeIsEnumPtr, handle); + + CachedClassHandles.Add(handle, this); +} + +bool MAssembly::ResolveMissingFile(String& assemblyPath) const +{ +#if DOTNET_HOST_MONO + // Fallback to AOT-ed assembly location + assemblyPath = Globals::BinariesFolder / TEXT("Dotnet") / StringUtils::GetFileName(assemblyPath); + return !FileSystem::FileExists(assemblyPath); +#endif + return true; +} + +MClass::~MClass() +{ + _methods.ClearDelete(); + _fields.ClearDelete(); + _properties.ClearDelete(); + _events.ClearDelete(); + + CachedClassHandles.Remove(_handle); +} + +StringAnsiView MClass::GetName() const +{ + return _name; +} + +StringAnsiView MClass::GetNamespace() const +{ + return _namespace_; +} + +MType* MClass::GetType() const +{ + return (MType*)_handle; +} + +MClass* MClass::GetBaseClass() const +{ + static void* GetClassParentPtr = GetStaticMethodPointer(TEXT("GetClassParent")); + MType* parentTypeHandle = CallStaticMethod(GetClassParentPtr, _handle); + return GetOrCreateClass(parentTypeHandle); +} + +bool MClass::IsSubClassOf(const MClass* klass, bool checkInterfaces) const +{ + static void* TypeIsSubclassOfPtr = GetStaticMethodPointer(TEXT("TypeIsSubclassOf")); + return klass && CallStaticMethod(TypeIsSubclassOfPtr, _handle, klass->_handle, checkInterfaces); +} + +bool MClass::HasInterface(const MClass* klass) const +{ + static void* TypeIsAssignableFrom = GetStaticMethodPointer(TEXT("TypeIsAssignableFrom")); + return klass && CallStaticMethod(TypeIsAssignableFrom, _handle, klass->_handle); +} + +bool MClass::IsInstanceOfType(MObject* object) const +{ + if (object == nullptr) + return false; + MClass* objectClass = MCore::Object::GetClass(object); + return IsSubClassOf(objectClass, false); +} + +uint32 MClass::GetInstanceSize() const +{ + if (_size != 0) + return _size; + static void* NativeSizeOfPtr = GetStaticMethodPointer(TEXT("NativeSizeOf")); + _size = CallStaticMethod(NativeSizeOfPtr, _handle); + return _size; +} + +MClass* MClass::GetElementClass() const +{ + static void* GetElementClassPtr = GetStaticMethodPointer(TEXT("GetElementClass")); + MType* elementTypeHandle = CallStaticMethod(GetElementClassPtr, _handle); + return GetOrCreateClass(elementTypeHandle); +} + +MMethod* MClass::GetMethod(const char* name, int32 numParams) const +{ + GetMethods(); + for (int32 i = 0; i < _methods.Count(); i++) + { + if (_methods[i]->GetName() == name && _methods[i]->GetParametersCount() == numParams) + return _methods[i]; + } + return nullptr; +} + +const Array& MClass::GetMethods() const +{ + if (_hasCachedMethods) + return _methods; + + NativeMethodDefinitions* methods; + int methodsCount; + static void* GetClassMethodsPtr = GetStaticMethodPointer(TEXT("GetClassMethods")); + CallStaticMethod(GetClassMethodsPtr, _handle, &methods, &methodsCount); + for (int32 i = 0; i < methodsCount; i++) + { + NativeMethodDefinitions& definition = methods[i]; + MMethod* method = New(const_cast(this), StringAnsi(definition.name), definition.handle, definition.numParameters, definition.methodAttributes); + _methods.Add(method); + + MCore::GC::FreeMemory((void*)definition.name); + } + MCore::GC::FreeMemory(methods); + + _hasCachedMethods = true; + return _methods; +} + +MField* MClass::GetField(const char* name) const +{ + GetFields(); + for (int32 i = 0; i < _fields.Count(); i++) + { + if (_fields[i]->GetName() == name) + return _fields[i]; + } + return nullptr; +} + +const Array& MClass::GetFields() const +{ + if (_hasCachedFields) + return _fields; + + NativeFieldDefinitions* fields; + int numFields; + static void* GetClassFieldsPtr = GetStaticMethodPointer(TEXT("GetClassFields")); + CallStaticMethod(GetClassFieldsPtr, _handle, &fields, &numFields); + for (int32 i = 0; i < numFields; i++) + { + NativeFieldDefinitions& definition = fields[i]; + MField* field = New(const_cast(this), definition.fieldHandle, definition.name, definition.fieldType, definition.fieldAttributes); + _fields.Add(field); + + MCore::GC::FreeMemory((void*)definition.name); + } + MCore::GC::FreeMemory(fields); + + _hasCachedFields = true; + return _fields; +} + +const Array& MClass::GetEvents() const +{ + if (_hasCachedEvents) + return _events; + + // TODO: implement MEvent in .NET + + _hasCachedEvents = true; + return _events; +} + +MProperty* MClass::GetProperty(const char* name) const +{ + GetProperties(); + for (int32 i = 0; i < _properties.Count(); i++) + { + if (_properties[i]->GetName() == name) + return _properties[i]; + } + return nullptr; +} + +const Array& MClass::GetProperties() const +{ + if (_hasCachedProperties) + return _properties; + + NativePropertyDefinitions* foundProperties; + int numProperties; + static void* GetClassPropertiesPtr = GetStaticMethodPointer(TEXT("GetClassProperties")); + CallStaticMethod(GetClassPropertiesPtr, _handle, &foundProperties, &numProperties); + for (int i = 0; i < numProperties; i++) + { + const NativePropertyDefinitions& definition = foundProperties[i]; + MProperty* property = New(const_cast(this), definition.name, definition.getterHandle, definition.setterHandle, definition.getterAttributes, definition.setterAttributes); + _properties.Add(property); + + MCore::GC::FreeMemory((void*)definition.name); + } + MCore::GC::FreeMemory(foundProperties); + + _hasCachedProperties = true; + return _properties; +} + +const Array& MClass::GetInterfaces() const +{ + if (_hasCachedInterfaces) + return _interfaces; + + MType** foundInterfaceTypes; + int numInterfaces; + static void* GetClassInterfacesPtr = GetStaticMethodPointer(TEXT("GetClassInterfaces")); + CallStaticMethod(GetClassInterfacesPtr, _handle, &foundInterfaceTypes, &numInterfaces); + for (int32 i = 0; i < numInterfaces; i++) + { + MClass* interfaceClass = GetOrCreateClass(foundInterfaceTypes[i]); + _interfaces.Add(interfaceClass); + } + MCore::GC::FreeMemory(foundInterfaceTypes); + + _hasCachedInterfaces = true; + return _interfaces; +} + +bool MClass::HasAttribute(const MClass* monoClass) const +{ + return GetCustomAttribute(this, monoClass) != nullptr; +} + +bool MClass::HasAttribute() const +{ + return GetCustomAttribute(this, nullptr) != nullptr; +} + +MObject* MClass::GetAttribute(const MClass* monoClass) const +{ + return (MObject*)GetCustomAttribute(this, monoClass); +} + +const Array& MClass::GetAttributes() const +{ + if (_hasCachedAttributes) + return _attributes; + + MObject** attributes; + int numAttributes; + static void* GetClassAttributesPtr = GetStaticMethodPointer(TEXT("GetClassAttributes")); + CallStaticMethod(GetClassAttributesPtr, _handle, &attributes, &numAttributes); + _attributes.Set(attributes, numAttributes); + MCore::GC::FreeMemory(attributes); + + _hasCachedAttributes = true; + return _attributes; +} + +bool MDomain::SetCurrentDomain(bool force) +{ + MActiveDomain = this; + return true; +} + +void MDomain::Dispatch() const +{ +} + +MEvent::MEvent(MClass* parentClass, void* handle, const char* name) + : _handle(handle) + , _addMethod(nullptr) + , _removeMethod(nullptr) + , _parentClass(parentClass) + , _name(name) + , _hasCachedAttributes(false) + , _hasAddMonoMethod(true) + , _hasRemoveMonoMethod(true) +{ +} + +MMethod* MEvent::GetAddMethod() const +{ + return nullptr; // TODO: implement MEvent in .NET +} + +MMethod* MEvent::GetRemoveMethod() const +{ + return nullptr; // TODO: implement MEvent in .NET +} + +bool MEvent::HasAttribute(MClass* monoClass) const +{ + return false; // TODO: implement MEvent in .NET +} + +bool MEvent::HasAttribute() const +{ + return false; // TODO: implement MEvent in .NET +} + +MObject* MEvent::GetAttribute(MClass* monoClass) const +{ + return nullptr; // TODO: implement MEvent in .NET +} + +const Array& MEvent::GetAttributes() const +{ + if (_hasCachedAttributes) + return _attributes; + _hasCachedAttributes = true; + + // TODO: implement MEvent in .NET + return _attributes; +} + +MException::MException(MObject* exception) + : InnerException(nullptr) +{ + ASSERT(exception); + MClass* exceptionClass = MCore::Object::GetClass(exception); + + MProperty* exceptionMsgProp = exceptionClass->GetProperty("Message"); + MMethod* exceptionMsgGetter = exceptionMsgProp->GetGetMethod(); + MString* exceptionMsg = (MString*)exceptionMsgGetter->Invoke(exception, nullptr, nullptr); + Message = MUtils::ToString(exceptionMsg); + + MProperty* exceptionStackProp = exceptionClass->GetProperty("StackTrace"); + MMethod* exceptionStackGetter = exceptionStackProp->GetGetMethod(); + MString* exceptionStackTrace = (MString*)exceptionStackGetter->Invoke(exception, nullptr, nullptr); + StackTrace = MUtils::ToString(exceptionStackTrace); + + MProperty* innerExceptionProp = exceptionClass->GetProperty("InnerException"); + MMethod* innerExceptionGetter = innerExceptionProp->GetGetMethod(); + MObject* innerException = (MObject*)innerExceptionGetter->Invoke(exception, nullptr, nullptr); + if (innerException) + InnerException = New(innerException); +} + +MException::~MException() +{ + if (InnerException) + Delete(InnerException); +} + +MField::MField(MClass* parentClass, void* handle, const char* name, void* type, MFieldAttributes attributes) + : _handle(handle) + , _type(type) + , _parentClass(parentClass) + , _name(name) + , _hasCachedAttributes(false) +{ + switch (attributes & MFieldAttributes::FieldAccessMask) + { + case MFieldAttributes::Private: + _visibility = MVisibility::Private; + break; + case MFieldAttributes::FamANDAssem: + _visibility = MVisibility::PrivateProtected; + break; + case MFieldAttributes::Assembly: + _visibility = MVisibility::Internal; + break; + case MFieldAttributes::Family: + _visibility = MVisibility::Protected; + break; + case MFieldAttributes::FamORAssem: + _visibility = MVisibility::ProtectedInternal; + break; + case MFieldAttributes::Public: + _visibility = MVisibility::Public; + break; + default: + CRASH; + } + _isStatic = (attributes & MFieldAttributes::Static) == MFieldAttributes::Static; +} + +MType* MField::GetType() const +{ + return (MType*)_type; +} + +int32 MField::GetOffset() const +{ + MISSING_CODE("TODO: MField::GetOffset"); // TODO: MField::GetOffset + return 0; +} + +void MField::GetValue(MObject* instance, void* result) const +{ + static void* FieldGetValuePtr = GetStaticMethodPointer(TEXT("FieldGetValue")); + CallStaticMethod(FieldGetValuePtr, instance, _handle, result); +} + +MObject* MField::GetValueBoxed(MObject* instance) const +{ + MISSING_CODE("TODO: MField::GetValueBoxed"); // TODO: MField::GetValueBoxed + return nullptr; +} + +void MField::SetValue(MObject* instance, void* value) const +{ + static void* FieldSetValuePtr = GetStaticMethodPointer(TEXT("FieldSetValue")); + CallStaticMethod(FieldSetValuePtr, instance, _handle, value); +} + +bool MField::HasAttribute(MClass* monoClass) const +{ + // TODO: implement MField attributes in .NET + return false; +} + +bool MField::HasAttribute() const +{ + // TODO: implement MField attributes in .NET + return false; +} + +MObject* MField::GetAttribute(MClass* monoClass) const +{ + // TODO: implement MField attributes in .NET + return nullptr; +} + +const Array& MField::GetAttributes() const +{ + if (_hasCachedAttributes) + return _attributes; + _hasCachedAttributes = true; + + // TODO: implement MField attributes in .NET + return _attributes; +} + +MMethod::MMethod(MClass* parentClass, StringAnsi&& name, void* handle, int32 paramsCount, MMethodAttributes attributes) + : _handle(handle) + , _paramsCount(paramsCount) + , _parentClass(parentClass) + , _name(MoveTemp(name)) + , _hasCachedAttributes(false) + , _hasCachedSignature(false) +{ + switch (attributes & MMethodAttributes::MemberAccessMask) + { + case MMethodAttributes::Private: + _visibility = MVisibility::Private; + break; + case MMethodAttributes::FamANDAssem: + _visibility = MVisibility::PrivateProtected; + break; + case MMethodAttributes::Assembly: + _visibility = MVisibility::Internal; + break; + case MMethodAttributes::Family: + _visibility = MVisibility::Protected; + break; + case MMethodAttributes::FamORAssem: + _visibility = MVisibility::ProtectedInternal; + break; + case MMethodAttributes::Public: + _visibility = MVisibility::Public; + break; + default: + CRASH; + } + _isStatic = (attributes & MMethodAttributes::Static) == MMethodAttributes::Static; + +#if COMPILE_WITH_PROFILER + const StringAnsi& className = parentClass->GetFullName(); + ProfilerName.Resize(className.Length() + 2 + _name.Length()); + Platform::MemoryCopy(ProfilerName.Get(), className.Get(), className.Length()); + ProfilerName.Get()[className.Length()] = ':'; + ProfilerName.Get()[className.Length() + 1] = ':'; + Platform::MemoryCopy(ProfilerName.Get() + className.Length() + 2, _name.Get(), _name.Length()); + ProfilerData.name = ProfilerName.Get(); + ProfilerData.function = _name.Get(); + ProfilerData.file = nullptr; + ProfilerData.line = 0; + ProfilerData.color = 0; +#endif +} + +void MMethod::CacheSignature() const +{ + _hasCachedSignature = true; + + static void* GetMethodReturnTypePtr = GetStaticMethodPointer(TEXT("GetMethodReturnType")); + static void* GetMethodParameterTypesPtr = GetStaticMethodPointer(TEXT("GetMethodParameterTypes")); + + _returnType = CallStaticMethod(GetMethodReturnTypePtr, _handle); + + if (_paramsCount == 0) + return; + void** parameterTypeHandles; + CallStaticMethod(GetMethodParameterTypesPtr, _handle, ¶meterTypeHandles); + _parameterTypes.Set(parameterTypeHandles, _paramsCount); + MCore::GC::FreeMemory(parameterTypeHandles); +} + +MObject* MMethod::Invoke(void* instance, void** params, MObject** exception) const +{ + PROFILE_CPU_SRC_LOC(ProfilerData); + static void* InvokeMethodPtr = GetStaticMethodPointer(TEXT("InvokeMethod")); + return (MObject*)CallStaticMethod(InvokeMethodPtr, instance, _handle, params, exception); +} + +MObject* MMethod::InvokeVirtual(MObject* instance, void** params, MObject** exception) const +{ + return Invoke(instance, params, exception); +} + +#if !USE_MONO_AOT + +void* MMethod::GetThunk() +{ + if (!_cachedThunk) + { + static void* GetThunkPtr = GetStaticMethodPointer(TEXT("GetThunk")); + _cachedThunk = CallStaticMethod(GetThunkPtr, _handle); +#if !BUILD_RELEASE + if (!_cachedThunk) + LOG(Error, "Failed to get C# method thunk for {0}::{1}", String(_parentClass->GetFullName()), String(_name)); +#endif + } + return _cachedThunk; +} + +#endif + +MMethod* MMethod::InflateGeneric() const +{ + // This seams to be unused on .NET (Mono required inflating generic class of the script) + return const_cast(this); +} + +MType* MMethod::GetReturnType() const +{ + if (!_hasCachedSignature) + CacheSignature(); + return (MType*)_returnType; +} + +int32 MMethod::GetParametersCount() const +{ + return _paramsCount; +} + +MType* MMethod::GetParameterType(int32 paramIdx) const +{ + if (!_hasCachedSignature) + CacheSignature(); + ASSERT_LOW_LAYER(paramIdx >= 0 && paramIdx < _paramsCount); + return (MType*)_parameterTypes[paramIdx]; +} + +bool MMethod::GetParameterIsOut(int32 paramIdx) const +{ + if (!_hasCachedSignature) + CacheSignature(); + ASSERT_LOW_LAYER(paramIdx >= 0 && paramIdx < _paramsCount); + // TODO: cache GetParameterIsOut maybe? + static void* GetMethodParameterIsOutPtr = GetStaticMethodPointer(TEXT("GetMethodParameterIsOut")); + return CallStaticMethod(GetMethodParameterIsOutPtr, _handle, paramIdx); +} + +bool MMethod::HasAttribute(MClass* monoClass) const +{ + // TODO: implement MMethod attributes in .NET + return false; +} + +bool MMethod::HasAttribute() const +{ + // TODO: implement MMethod attributes in .NET + return false; +} + +MObject* MMethod::GetAttribute(MClass* monoClass) const +{ + // TODO: implement MMethod attributes in .NET + return nullptr; +} + +const Array& MMethod::GetAttributes() const +{ + if (_hasCachedAttributes) + return _attributes; + _hasCachedAttributes = true; + + // TODO: implement MMethod attributes in .NET + return _attributes; +} + +MProperty::MProperty(MClass* parentClass, const char* name, void* getterHandle, void* setterHandle, MMethodAttributes getterAttributes, MMethodAttributes setterAttributes) + : _parentClass(parentClass) + , _name(name) + , _hasCachedAttributes(false) +{ + _hasGetMethod = getterHandle != nullptr; + if (_hasGetMethod) + _getMethod = New(parentClass, StringAnsi("get_" + _name), getterHandle, 1, getterAttributes); + else + _getMethod = nullptr; + _hasSetMethod = setterHandle != nullptr; + if (_hasSetMethod) + _setMethod = New(parentClass, StringAnsi("set_" + _name), setterHandle, 1, setterAttributes); + else + _setMethod = nullptr; +} + +MProperty::~MProperty() +{ + if (_getMethod) + Delete(_getMethod); + if (_setMethod) + Delete(_setMethod); +} + +MMethod* MProperty::GetGetMethod() const +{ + return _getMethod; +} + +MMethod* MProperty::GetSetMethod() const +{ + return _setMethod; +} + +MObject* MProperty::GetValue(MObject* instance, MObject** exception) const +{ + CHECK_RETURN(_getMethod, nullptr); + return _getMethod->Invoke(instance, nullptr, exception); +} + +void MProperty::SetValue(MObject* instance, void* value, MObject** exception) const +{ + CHECK(_setMethod); + void* params[1]; + params[0] = value; + _setMethod->Invoke(instance, params, exception); +} + +bool MProperty::HasAttribute(MClass* monoClass) const +{ + // TODO: implement MProperty attributes in .NET + return false; +} + +bool MProperty::HasAttribute() const +{ + // TODO: implement MProperty attributes in .NET + return false; +} + +MObject* MProperty::GetAttribute(MClass* monoClass) const +{ + // TODO: implement MProperty attributes in .NET + return nullptr; +} + +const Array& MProperty::GetAttributes() const +{ + if (_hasCachedAttributes) + return _attributes; + _hasCachedAttributes = true; + + // TODO: implement MProperty attributes in .NET + return _attributes; +} + +MAssembly* GetAssembly(void* assemblyHandle) +{ + MAssembly* assembly; + if (CachedAssemblyHandles.TryGet(assemblyHandle, assembly)) + return assembly; + return nullptr; +} + +MClass* GetClass(MType* typeHandle) +{ + MClass* klass = nullptr; + CachedClassHandles.TryGet(typeHandle, klass); + return nullptr; +} + +MClass* GetOrCreateClass(MType* typeHandle) +{ + if (!typeHandle) + return nullptr; + MClass* klass; + if (!CachedClassHandles.TryGet(typeHandle, klass)) + { + NativeClassDefinitions classInfo; + void* assemblyHandle; + static void* GetManagedClassFromTypePtr = GetStaticMethodPointer(TEXT("GetManagedClassFromType")); + CallStaticMethod(GetManagedClassFromTypePtr, typeHandle, &classInfo, &assemblyHandle); + MAssembly* assembly = GetAssembly(assemblyHandle); + klass = New(assembly, classInfo.typeHandle, classInfo.name, classInfo.fullname, classInfo.namespace_, classInfo.typeAttributes); + if (assembly != nullptr) + { + const_cast(assembly->GetClasses()).Add(klass->GetFullName(), klass); + } + + if (typeHandle != classInfo.typeHandle) + CallStaticMethod(GetManagedClassFromTypePtr, typeHandle, &classInfo); + + MCore::GC::FreeMemory((void*)classInfo.name); + MCore::GC::FreeMemory((void*)classInfo.fullname); + MCore::GC::FreeMemory((void*)classInfo.namespace_); + } + ASSERT(klass != nullptr); + return klass; +} + +MType* GetObjectType(MObject* obj) +{ + static void* GetObjectTypePtr = GetStaticMethodPointer(TEXT("GetObjectType")); + void* typeHandle = CallStaticMethod(GetObjectTypePtr, obj); + return (MType*)typeHandle; +} + +void* GetCustomAttribute(const MClass* klass, const MClass* attributeClass) +{ + const Array& attributes = klass->GetAttributes(); + for (MObject* attr : attributes) + { + MType* typeHandle = GetObjectType(attr); + MClass* attrClass = GetOrCreateClass(typeHandle); + if (attrClass == attributeClass) + return attr; + } + return nullptr; +} + +#if DOTNET_HOST_CORECLR + +const char_t* NativeInteropTypeName = FLAX_CORECLR_TEXT("FlaxEngine.Interop.NativeInterop, FlaxEngine.CSharp"); +hostfxr_initialize_for_runtime_config_fn hostfxr_initialize_for_runtime_config; +hostfxr_initialize_for_dotnet_command_line_fn hostfxr_initialize_for_dotnet_command_line; +hostfxr_get_runtime_delegate_fn hostfxr_get_runtime_delegate; +hostfxr_close_fn hostfxr_close; +load_assembly_and_get_function_pointer_fn load_assembly_and_get_function_pointer; +get_function_pointer_fn get_function_pointer; +hostfxr_set_error_writer_fn hostfxr_set_error_writer; +hostfxr_get_dotnet_environment_info_result_fn hostfxr_get_dotnet_environment_info_result; +hostfxr_run_app_fn hostfxr_run_app; + +bool InitHostfxr() +{ + const ::String csharpLibraryPath = Globals::BinariesFolder / TEXT("FlaxEngine.CSharp.dll"); + const ::String csharpRuntimeConfigPath = Globals::BinariesFolder / TEXT("FlaxEngine.CSharp.runtimeconfig.json"); + if (!FileSystem::FileExists(csharpLibraryPath)) + LOG(Fatal, "Failed to initialize managed runtime, missing file: {0}", csharpLibraryPath); + if (!FileSystem::FileExists(csharpRuntimeConfigPath)) + LOG(Fatal, "Failed to initialize managed runtime, missing file: {0}", csharpRuntimeConfigPath); + const FLAX_CORECLR_STRING& libraryPath = FLAX_CORECLR_STRING(csharpLibraryPath); + + // Get path to hostfxr library + get_hostfxr_parameters get_hostfxr_params; + get_hostfxr_params.size = sizeof(hostfxr_initialize_parameters); + get_hostfxr_params.assembly_path = libraryPath.Get(); +#if PLATFORM_MAC + get_hostfxr_params.dotnet_root = "/usr/local/share/dotnet"; +#else + get_hostfxr_params.dotnet_root = nullptr; +#endif + FLAX_CORECLR_STRING dotnetRoot; + String dotnetRootEnvVar; + if (!Platform::GetEnvironmentVariable(TEXT("DOTNET_ROOT"), dotnetRootEnvVar) && FileSystem::DirectoryExists(dotnetRootEnvVar)) + { + dotnetRoot = FLAX_CORECLR_STRING(dotnetRootEnvVar); + get_hostfxr_params.dotnet_root = dotnetRoot.Get(); + } +#if !USE_EDITOR + const String bundledDotnetPath = Globals::ProjectFolder / TEXT("Dotnet"); + if (FileSystem::DirectoryExists(bundledDotnetPath)) + { + dotnetRoot = FLAX_CORECLR_STRING(bundledDotnetPath); +#if PLATFORM_WINDOWS_FAMILY + dotnetRoot.Replace('/', '\\'); +#endif + get_hostfxr_params.dotnet_root = dotnetRoot.Get(); + } +#endif + char_t hostfxrPath[1024]; + size_t hostfxrPathSize = sizeof(hostfxrPath) / sizeof(char_t); + int rc = get_hostfxr_path(hostfxrPath, &hostfxrPathSize, &get_hostfxr_params); + if (rc != 0) + { + LOG(Error, "Failed to find hostfxr: {0:x} ({1})", (unsigned int)rc, String(get_hostfxr_params.dotnet_root)); + + // Warn user about missing .Net +#if PLATFORM_DESKTOP + Platform::OpenUrl(TEXT("https://dotnet.microsoft.com/en-us/download/dotnet/7.0")); +#endif +#if USE_EDITOR + LOG(Fatal, "Missing .NET 7 SDK installation required to run Flax Editor."); +#else + LOG(Fatal, "Missing .NET 7 Runtime installation required to run this application."); +#endif + return true; + } + String path(hostfxrPath); + LOG(Info, "Found hostfxr in {0}", path); + + // Get API from hostfxr library + void* hostfxr = Platform::LoadLibrary(path.Get()); + if (hostfxr == nullptr) + { + LOG(Fatal, "Failed to load hostfxr library ({0})", path); + return true; + } + hostfxr_initialize_for_runtime_config = (hostfxr_initialize_for_runtime_config_fn)Platform::GetProcAddress(hostfxr, "hostfxr_initialize_for_runtime_config"); + hostfxr_initialize_for_dotnet_command_line = (hostfxr_initialize_for_dotnet_command_line_fn)Platform::GetProcAddress(hostfxr, "hostfxr_initialize_for_dotnet_command_line"); + hostfxr_get_runtime_delegate = (hostfxr_get_runtime_delegate_fn)Platform::GetProcAddress(hostfxr, "hostfxr_get_runtime_delegate"); + hostfxr_close = (hostfxr_close_fn)Platform::GetProcAddress(hostfxr, "hostfxr_close"); + hostfxr_set_error_writer = (hostfxr_set_error_writer_fn)Platform::GetProcAddress(hostfxr, "hostfxr_set_error_writer"); + hostfxr_get_dotnet_environment_info_result = (hostfxr_get_dotnet_environment_info_result_fn)Platform::GetProcAddress(hostfxr, "hostfxr_get_dotnet_environment_info_result"); + hostfxr_run_app = (hostfxr_run_app_fn)Platform::GetProcAddress(hostfxr, "hostfxr_run_app"); + if (!hostfxr_get_runtime_delegate || !hostfxr_run_app) + { + LOG(Fatal, "Failed to setup hostfxr API ({0})", path); + return true; + } + + // TODO: Implement picking different version of hostfxr, currently prefers highest available version. + // Allow future and preview versions of .NET + String dotnetRollForward; + String dotnetRollForwardPr; + if (Platform::GetEnvironmentVariable(TEXT("DOTNET_ROLL_FORWARD"), dotnetRollForward)) + Platform::SetEnvironmentVariable(TEXT("DOTNET_ROLL_FORWARD"), TEXT("LatestMajor")); + if (Platform::GetEnvironmentVariable(TEXT("DOTNET_ROLL_FORWARD_TO_PRERELEASE"), dotnetRollForwardPr)) + Platform::SetEnvironmentVariable(TEXT("DOTNET_ROLL_FORWARD_TO_PRERELEASE"), TEXT("1")); + + // Initialize hosting component + const char_t* argv[1] = { libraryPath.Get() }; + hostfxr_initialize_parameters init_params; + init_params.size = sizeof(hostfxr_initialize_parameters); + init_params.host_path = libraryPath.Get(); + path = String(StringUtils::GetDirectoryName(path)) / TEXT("/../../../"); + StringUtils::PathRemoveRelativeParts(path); + dotnetRoot = FLAX_CORECLR_STRING(path); + init_params.dotnet_root = dotnetRoot.Get(); + hostfxr_handle handle = nullptr; + rc = hostfxr_initialize_for_dotnet_command_line(ARRAY_COUNT(argv), argv, &init_params, &handle); + if (rc != 0 || handle == nullptr) + { + hostfxr_close(handle); + LOG(Fatal, "Failed to initialize hostfxr: {0:x} ({1})", (unsigned int)rc, String(init_params.dotnet_root)); + return true; + } + + void* pget_function_pointer = nullptr; + rc = hostfxr_get_runtime_delegate(handle, hdt_get_function_pointer, &pget_function_pointer); + if (rc != 0 || pget_function_pointer == nullptr) + { + hostfxr_close(handle); + LOG(Fatal, "Failed to get runtime delegate hdt_get_function_pointer: 0x{0:x}", (unsigned int)rc); + return true; + } + + hostfxr_close(handle); + get_function_pointer = (get_function_pointer_fn)pget_function_pointer; + return false; +} + +void ShutdownHostfxr() +{ +} + +void* GetStaticMethodPointer(const String& methodName) +{ + void* fun; + if (CachedFunctions.TryGet(methodName, fun)) + return fun; + const int rc = get_function_pointer(NativeInteropTypeName, FLAX_CORECLR_STRING(methodName).Get(), UNMANAGEDCALLERSONLY_METHOD, nullptr, nullptr, &fun); + if (rc != 0) + LOG(Fatal, "Failed to get unmanaged function pointer for method {0}: 0x{1:x}", methodName.Get(), (unsigned int)rc); + CachedFunctions.Add(methodName, fun); + return fun; +} + +#elif DOTNET_HOST_MONO + +#ifdef USE_MONO_AOT_MODULE +void* MonoAotModuleHandle = nullptr; +#endif +MonoDomain* MonoDomainHandle = nullptr; + +void OnLogCallback(const char* logDomain, const char* logLevel, const char* message, mono_bool fatal, void* userData) +{ + String currentDomain(logDomain); + String msg(message); + msg.Replace('\n', ' '); + + static const char* monoErrorLevels[] = + { + nullptr, + "error", + "critical", + "warning", + "message", + "info", + "debug" + }; + + uint32 errorLevel = 0; + if (logLevel != nullptr) + { + for (uint32 i = 1; i < 7; i++) + { + if (strcmp(monoErrorLevels[i], logLevel) == 0) + { + errorLevel = i; + break; + } + } + } + + if (currentDomain.IsEmpty()) + { + auto domain = MCore::GetActiveDomain(); + if (domain != nullptr) + { + currentDomain = domain->GetName().Get(); + } + else + { + currentDomain = "null"; + } + } + +#if 0 + // Print C# stack trace (crash may be caused by the managed code) + if (mono_domain_get() && Assemblies::FlaxEngine.Assembly->IsLoaded()) + { + const auto managedStackTrace = DebugLog::GetStackTrace(); + if (managedStackTrace.HasChars()) + { + LOG(Warning, "Managed stack trace:"); + LOG_STR(Warning, managedStackTrace); + } + } +#endif + + if (errorLevel == 0) + { + Log::CLRInnerException(String::Format(TEXT("Message: {0} | Domain: {1}"), msg, currentDomain)).SetLevel(LogType::Error); + } + else if (errorLevel <= 2) + { + Log::CLRInnerException(String::Format(TEXT("Message: {0} | Domain: {1}"), msg, currentDomain)).SetLevel(LogType::Error); + } + else if (errorLevel <= 3) + { + LOG(Warning, "Message: {0} | Domain: {1}", msg, currentDomain); + } + else + { + LOG(Info, "Message: {0} | Domain: {1}", msg, currentDomain); + } +} + +void OnPrintCallback(const char* string, mono_bool isStdout) +{ + LOG_STR(Warning, String(string)); +} + +void OnPrintErrorCallback(const char* string, mono_bool isStdout) +{ + // HACK: ignore this message + if (string && Platform::MemoryCompare(string, "debugger-agent: Unable to listen on ", 36) == 0) + return; + + LOG_STR(Error, String(string)); +} + +static MonoAssembly* OnMonoAssemblyLoad(const char* aname) +{ + // Find assembly file + const String name(aname); +#if DOTNET_HOST_MONO_DEBUG + LOG(Info, "Loading C# assembly {0}", name); +#endif + String fileName = name; + if (!name.EndsWith(TEXT(".dll")) && !name.EndsWith(TEXT(".exe"))) + fileName += TEXT(".dll"); + String path = fileName; + if (!FileSystem::FileExists(path)) + { + path = Globals::ProjectFolder / String(TEXT("/Dotnet/shared/Microsoft.NETCore.App/")) / fileName; + if (!FileSystem::FileExists(path)) + { + path = Globals::ProjectFolder / String(TEXT("/Dotnet/")) / fileName; + } + } + + // Load assembly +#if DOTNET_HOST_MONO_DEBUG + LOG(Info, "Loading C# assembly from path = {0}, exist = {1}", path, FileSystem::FileExists(path)); +#endif + MonoAssembly* assembly = nullptr; + if (FileSystem::FileExists(path)) + { + StringAnsi pathAnsi(path); + assembly = mono_assembly_open(pathAnsi.Get(), nullptr); + } + if (!assembly) + { + LOG(Error, "Failed to load C# assembly {0}", path); + } + return assembly; +} + +static MonoAssembly* OnMonoAssemblyPreloadHook(MonoAssemblyName* aname, char** assemblies_path, void* user_data) +{ + return OnMonoAssemblyLoad(mono_assembly_name_get_name(aname)); +} + +#if 0 + +static unsigned char* OnMonoLoadAOT(MonoAssembly* assembly, int size, void* user_data, void** out_handle) +{ + MonoAssemblyName* assemblyName = mono_assembly_get_name(assembly); + const char* assemblyNameStr = mono_assembly_name_get_name(assemblyName); +#if DOTNET_HOST_MONO_DEBUG + LOG(Info, "Loading AOT data for C# assembly {0}", String(assemblyNameStr)); +#endif + return nullptr; +} + +static void OnMonoFreeAOT(MonoAssembly* assembly, int size, void* user_data, void* handle) +{ +#if DOTNET_HOST_MONO_DEBUG + MonoAssemblyName* assemblyName = mono_assembly_get_name(assembly); + const char* assemblyNameStr = mono_assembly_name_get_name(assemblyName); + LOG(Info, "Free AOT data for C# assembly {0}", String(assemblyNameStr)); +#endif +} + +#endif + +#if PLATFORM_IOS + +#include "Engine/Engine/Globals.h" +#include +#include + +static void* OnMonoDlFallbackLoad(const char* name, int flags, char** err, void* user_data) +{ + const String fileName = StringUtils::GetFileName(String(name)); +#if DOTNET_HOST_MONO_DEBUG + LOG(Info, "Loading dynamic library {0}", fileName); +#endif + int dlFlags = 0; + if (flags & MONO_DL_GLOBAL && !(flags & MONO_DL_LOCAL)) + dlFlags |= RTLD_GLOBAL; + else + dlFlags |= RTLD_LOCAL; + if (flags & MONO_DL_LAZY) + dlFlags |= RTLD_LAZY; + else + dlFlags |= RTLD_NOW; + void* result = dlopen(name, dlFlags); + if (!result) + { + // Try Frameworks location on iOS + String path = Globals::ProjectFolder / TEXT("Frameworks") / fileName; + if (!path.EndsWith(TEXT(".dylib"))) + path += TEXT(".dylib"); + result = dlopen(StringAsANSI<>(*path).Get(), dlFlags); + if (!result) + { + LOG(Error, "Failed to load dynamic libary {0}", String(name)); + } + } + return result; +} + +static void* OnMonoDlFallbackSymbol(void* handle, const char* name, char** err, void* user_data) +{ + return dlsym(handle, name); +} + +static void* OnMonoDlFallbackClose(void* handle, void* user_data) +{ + dlclose(handle); + return 0; +} + +#endif + +bool InitHostfxr() +{ +#if DOTNET_HOST_MONO_DEBUG + // Enable detailed Mono logging + Platform::SetEnvironmentVariable(TEXT("MONO_LOG_LEVEL"), TEXT("debug")); + Platform::SetEnvironmentVariable(TEXT("MONO_LOG_MASK"), TEXT("all")); + //Platform::SetEnvironmentVariable(TEXT("MONO_GC_DEBUG"), TEXT("6:gc-log.txt,check-remset-consistency,nursery-canaries")); +#endif + +#if defined(USE_MONO_AOT_MODE) + // Enable AOT mode (per-platform) + mono_jit_set_aot_mode(USE_MONO_AOT_MODE); +#endif + + // Platform-specific setup +#if PLATFORM_IOS + setenv("MONO_AOT_MODE", "aot", 1); + setenv("DOTNET_SYSTEM_GLOBALIZATION_INVARIANT", "1", 1); +#endif + +#ifdef USE_MONO_AOT_MODULE + // Load AOT module + const DateTime aotModuleLoadStartTime = DateTime::Now(); + LOG(Info, "Loading Mono AOT module..."); + void* libAotModule = Platform::LoadLibrary(TEXT(USE_MONO_AOT_MODULE)); + if (libAotModule == nullptr) + { + LOG(Error, "Failed to laod Mono AOT module (" TEXT(USE_MONO_AOT_MODULE) ")"); + return true; + } + MonoAotModuleHandle = libAotModule; + void* getModulesPtr = Platform::GetProcAddress(libAotModule, "GetMonoModules"); + if (getModulesPtr == nullptr) + { + LOG(Error, "Failed to get Mono AOT modules getter."); + return true; + } + typedef int (*GetMonoModulesFunc)(void** buffer, int bufferSize); + const auto getModules = (GetMonoModulesFunc)getModulesPtr; + const int32 moduelsCount = getModules(nullptr, 0); + void** modules = (void**)Allocator::Allocate(moduelsCount * sizeof(void*)); + getModules(modules, moduelsCount); + for (int32 i = 0; i < moduelsCount; i++) + { + mono_aot_register_module((void**)modules[i]); + } + Allocator::Free(modules); + LOG(Info, "Mono AOT module loaded in {0}ms", (int32)(DateTime::Now() - aotModuleLoadStartTime).GetTotalMilliseconds()); +#endif + + // Setup debugger + { + int32 debuggerLogLevel = 0; + if (CommandLine::Options.MonoLog.IsTrue()) + { + LOG(Info, "Using detailed Mono logging"); + mono_trace_set_level_string("debug"); + debuggerLogLevel = 10; + } + else + { + mono_trace_set_level_string("warning"); + } + +#if MONO_DEBUG_ENABLE && !PLATFORM_SWITCH + StringAnsi debuggerIp = "127.0.0.1"; + uint16 debuggerPort = 41000 + Platform::GetCurrentProcessId() % 1000; + if (CommandLine::Options.DebuggerAddress.HasValue()) + { + const auto& address = CommandLine::Options.DebuggerAddress.GetValue(); + const int32 splitIndex = address.Find(':'); + if (splitIndex == INVALID_INDEX) + { + debuggerIp = address.ToStringAnsi(); + } + else + { + debuggerIp = address.Left(splitIndex).ToStringAnsi(); + StringUtils::Parse(address.Right(address.Length() - splitIndex - 1).Get(), &debuggerPort); + } + } + + char buffer[150]; + sprintf(buffer, "--debugger-agent=transport=dt_socket,address=%s:%d,embedding=1,server=y,suspend=%s,loglevel=%d", debuggerIp.Get(), debuggerPort, CommandLine::Options.WaitForDebugger ? "y,timeout=5000" : "n", debuggerLogLevel); + + const char* options[] = { + "--soft-breakpoints", + //"--optimize=float32", + buffer + }; + mono_jit_parse_options(ARRAY_COUNT(options), (char**)options); + + mono_debug_init(MONO_DEBUG_FORMAT_MONO, 0); + LOG(Info, "Mono debugger server at {0}:{1}", ::String(debuggerIp), debuggerPort); +#endif + } + + // Connect to mono engine callback system + mono_trace_set_log_handler(OnLogCallback, nullptr); + mono_trace_set_print_handler(OnPrintCallback); + mono_trace_set_printerr_handler(OnPrintErrorCallback); + + // Initialize Mono VM + StringAnsi baseDirectory(Globals::ProjectFolder); + const char* appctxKeys[] = + { + "RUNTIME_IDENTIFIER", + "APP_CONTEXT_BASE_DIRECTORY", + }; + const char* appctxValues[] = + { + MACRO_TO_STR(DOTNET_HOST_RUNTIME_IDENTIFIER), + baseDirectory.Get(), + }; + static_assert(ARRAY_COUNT(appctxKeys) == ARRAY_COUNT(appctxValues), "Invalid appctx setup"); + monovm_initialize(ARRAY_COUNT(appctxKeys), appctxKeys, appctxValues); + mono_install_assembly_preload_hook(OnMonoAssemblyPreloadHook, nullptr); +#if 0 + mono_install_load_aot_data_hook(OnMonoLoadAOT, OnMonoFreeAOT, nullptr); +#endif +#if PLATFORM_IOS + mono_dl_fallback_register(OnMonoDlFallbackLoad, OnMonoDlFallbackSymbol, OnMonoDlFallbackClose, nullptr); +#endif + + // Init managed runtime +#if PLATFORM_ANDROID || PLATFORM_IOS + const char* monoVersion = "mobile"; +#else + const char* monoVersion = ""; // ignored +#endif + MonoDomainHandle = mono_jit_init_version("Flax", monoVersion); + if (!MonoDomainHandle) + { + LOG(Fatal, "Failed to initialize Mono."); + return true; + } + + // Log info + char* buildInfo = mono_get_runtime_build_info(); + LOG(Info, "Mono runtime version: {0}", String(buildInfo)); + mono_free(buildInfo); + + return false; +} + +void ShutdownHostfxr() +{ + mono_jit_cleanup(MonoDomainHandle); + MonoDomainHandle = nullptr; + +#ifdef USE_MONO_AOT_MODULE + Platform::FreeLibrary(MonoAotModuleHandle); +#endif +} + +void* GetStaticMethodPointer(const String& methodName) +{ + void* fun; + if (CachedFunctions.TryGet(methodName, fun)) + return fun; + + static MonoClass* nativeInteropClass = nullptr; + if (!nativeInteropClass) + { + const char* assemblyName = "FlaxEngine.CSharp"; + const char* className = "FlaxEngine.Interop.NativeInterop"; + MonoAssembly* flaxEngineAssembly = OnMonoAssemblyLoad(assemblyName); + ASSERT(flaxEngineAssembly); + MonoType* interopTyp = mono_reflection_type_from_name((char*)className, mono_assembly_get_image(flaxEngineAssembly)); + ASSERT(interopTyp); + nativeInteropClass = mono_class_from_mono_type(interopTyp); + ASSERT(nativeInteropClass); + } + const StringAsUTF8<40> methodNameAnsi(methodName.Get(), methodName.Length()); + MonoMethod* method = mono_class_get_method_from_name(nativeInteropClass, methodNameAnsi.Get(), -1); + ASSERT(method); + + MonoError error; + mono_error_init(&error); + fun = mono_method_get_unmanaged_callers_only_ftnptr(method, &error); + if (fun == nullptr) + { + const unsigned short errorCode = mono_error_get_error_code(&error); + const char* errorMessage = mono_error_get_message(&error); + LOG(Fatal, "mono_method_get_unmanaged_callers_only_ftnptr failed with error code 0x{0:x}, {1}", errorCode, String(errorMessage)); + } + mono_error_cleanup(&error); + + CachedFunctions.Add(methodName, fun); + return fun; +} + +#endif + +#endif diff --git a/Source/Engine/Scripting/Runtime/Mono.cpp b/Source/Engine/Scripting/Runtime/Mono.cpp new file mode 100644 index 000000000..ca4ef367b --- /dev/null +++ b/Source/Engine/Scripting/Runtime/Mono.cpp @@ -0,0 +1,3602 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#include "Engine/Scripting/Types.h" + +#if USE_MONO + +#include "Engine/Core/Log.h" +#include "Engine/Core/Types/DateTime.h" +#include "Engine/Core/Types/TimeSpan.h" +#include "Engine/Platform/File.h" +#include "Engine/Platform/FileSystem.h" +#include "Engine/Engine/Globals.h" +#include "Engine/Engine/CommandLine.h" +#include "Engine/Scripting/ManagedCLR/MCore.h" +#include "Engine/Scripting/ManagedCLR/MAssembly.h" +#include "Engine/Scripting/ManagedCLR/MClass.h" +#include "Engine/Scripting/ManagedCLR/MDomain.h" +#include "Engine/Scripting/ManagedCLR/MEvent.h" +#include "Engine/Scripting/ManagedCLR/MField.h" +#include "Engine/Scripting/ManagedCLR/MMethod.h" +#include "Engine/Scripting/ManagedCLR/MProperty.h" +#include "Engine/Scripting/ManagedCLR/MException.h" +#include "Engine/Scripting/ManagedCLR/MUtils.h" +#include "Engine/Scripting/Scripting.h" +#include "Engine/Scripting/BinaryModule.h" +#include "Engine/Profiler/ProfilerCPU.h" +#include "Engine/Threading/Threading.h" +#include "Engine/Debug/Exceptions/CLRInnerException.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if !USE_MONO_DYNAMIC_LIB +#include +#endif + +#ifdef USE_MONO_AOT_MODULE +void* MonoAotModuleHandle = nullptr; +#endif + +#define GET_CUSTOM_ATTR() (MonoCustomAttrInfo*)(_attrInfo ? _attrInfo : _attrInfo = mono_custom_attrs_from_class(_monoClass)) + +extern MDomain* MRootDomain; +extern MDomain* MActiveDomain; +extern Array> MDomains; + +// Inlined mono private types to access MonoType internals + +typedef struct _MonoGenericClass MonoGenericClass; +typedef struct _MonoGenericContext MonoGenericContext; + +struct _MonoGenericInst +{ + unsigned int id; + unsigned int type_argc : 22; + unsigned int is_open : 1; + MonoType* type_argv[MONO_ZERO_LEN_ARRAY]; +}; + +struct _MonoGenericContext +{ + MonoGenericInst* class_inst; + MonoGenericInst* method_inst; +}; + +struct _MonoGenericClass +{ + MonoClass* container_class; + MonoGenericContext context; + unsigned int is_dynamic : 1; + unsigned int is_tb_open : 1; + unsigned int need_sync : 1; + MonoClass* cached_class; + class MonoImageSet* owner; +}; + +struct _MonoType +{ + union + { + MonoClass* klass; + MonoType* type; + MonoArrayType* array; + MonoMethodSignature* method; + MonoGenericParam* generic_param; + MonoGenericClass* generic_class; + } data; + + unsigned int attrs : 16; + MonoTypeEnum type : 8; + unsigned int has_cmods : 1; + unsigned int byref : 1; + unsigned int pinned : 1; +}; + +namespace +{ + static StringAnsi PlusStr("+"); + static StringAnsi DotStr("."); + + void GetClassFullname(MonoClass* monoClass, StringAnsi& fullname) + { + // Name + fullname = mono_class_get_name(monoClass); + + // Outer class for nested types + MonoClass* nestingClass = mono_class_get_nesting_type(monoClass); + MonoClass* lastClass = monoClass; + while (nestingClass) + { + lastClass = nestingClass; + fullname = mono_class_get_name(nestingClass) + PlusStr + fullname; + nestingClass = mono_class_get_nesting_type(nestingClass); + } + + // Namespace + const char* lastClassNamespace = mono_class_get_namespace(lastClass); + if (lastClassNamespace && *lastClassNamespace) + fullname = lastClassNamespace + DotStr + fullname; + + // Generic instance arguments + MonoType* mType = mono_class_get_type(monoClass); + if (mType && mType->type == MONO_TYPE_GENERICINST) + { + fullname += '['; + StringAnsi tmp; + for (unsigned int i = 0; i < mType->data.generic_class->context.class_inst->type_argc; i++) + { + if (i != 0) + fullname += ','; + MType* argType = mType->data.generic_class->context.class_inst->type_argv[i]; + GetClassFullname(mono_class_from_mono_type(argType), tmp); + fullname += tmp; + } + fullname += ']'; + } + } + + MClass* FindClass(MonoClass* monoClass, bool addIfMissing = true) + { + if (monoClass == nullptr) + return nullptr; + PROFILE_CPU(); + auto& modules = BinaryModule::GetModules(); + for (auto module : modules) + { + auto managedModule = dynamic_cast(module); + if (managedModule && managedModule->Assembly->IsLoaded()) + { + MClass* result = managedModule->Assembly->GetClass(monoClass); + if (result != nullptr) + return result; + } + } + if (addIfMissing) + { + MISSING_CODE("TODO: register new MClass"); // TODO: this might happen when for example querying class to array of game script type and it should add new MClass to handle this + } + return nullptr; + } +} + +MDomain* MCore::CreateDomain(const StringAnsi& domainName) +{ +#if USE_MONO_AOT + LOG(Fatal, "Scripts can run only in single domain mode with AOT mode enabled."); + return nullptr; +#endif + + for (int32 i = 0; i < MDomains.Count(); i++) + { + if (MDomains[i]->GetName() == domainName) + return MDomains[i]; + } + + auto domain = New(domainName); + const auto monoDomain = mono_domain_create_appdomain((char*)domainName.Get(), nullptr); +#if MONO_DEBUG_ENABLE + mono_debug_domain_create(monoDomain); +#endif + ASSERT(monoDomain); + domain->_monoDomain = monoDomain; + MDomains.Add(domain); + return domain; +} + +void MCore::UnloadDomain(const StringAnsi& domainName) +{ + int32 i = 0; + for (; i < MDomains.Count(); i++) + { + if (MDomains[i]->GetName() == domainName) + break; + } + if (i == MDomains.Count()) + return; + + auto domain = MDomains[i]; +#if MONO_DEBUG_ENABLE + //mono_debug_domain_unload(domain->GetNative()); +#endif + //mono_domain_finalize(domain->GetNative(), 2000); + MObject* exception = nullptr; + mono_domain_try_unload(domain->GetNative(), &exception); + if (exception) + { + MException ex(exception); + ex.Log(LogType::Fatal, TEXT("Scripting::Release")); + } + Delete(domain); + MDomains.RemoveAtKeepOrder(i); +} + +#if 0 + +void* MonoMalloc(size_t size) +{ + return malloc(size); +} + +void* MonoRealloc(void* mem, size_t count) +{ + return realloc(mem, count); +} + +void MonoFree(void* mem) +{ + return free(mem); +} + +void* MonoCalloc(size_t count, size_t size) +{ + return calloc(count, size); +} + +#endif + +#if USE_MONO_PROFILER + +#include "Engine/Core/Types/StringBuilder.h" + +struct FlaxMonoProfiler +{ +}; + +FlaxMonoProfiler Profiler; + +struct StackWalkDataResult +{ + StringBuilder Buffer; +}; + +mono_bool OnStackWalk(MonoMethod* method, int32_t native_offset, int32_t il_offset, mono_bool managed, void* data) +{ + auto result = (StackWalkDataResult*)data; + + if (method) + { + auto mName = mono_method_get_name(method); + auto mKlassNameSpace = mono_class_get_namespace(mono_method_get_class(method)); + auto mKlassName = mono_class_get_name(mono_method_get_class(method)); + result->Buffer.Append(mKlassNameSpace); + result->Buffer.Append(TEXT(".")); + result->Buffer.Append(mKlassName); + result->Buffer.Append(TEXT("::")); + result->Buffer.Append(mName); + result->Buffer.Append(TEXT("\n")); + } + else if (!managed) + { + result->Buffer.Append(TEXT("\n")); + } + + return 0; +} + +void OnGCAllocation(MonoProfiler* profiler, MonoObject* obj) +{ + // Get allocation info + auto klass = mono_object_get_class(obj); + //auto name_space = mono_class_get_namespace(klass); + //auto name = mono_class_get_name(klass); + auto size = mono_class_instance_size(klass); + + //LOG(Info, "GC new: {0}.{1} ({2} bytes)", name_space, name, size); + +#if 0 + if (ProfilerCPU::IsProfilingCurrentThread()) + { + static int details = 0; + if (details) + { + StackWalkDataResult stackTrace; + stackTrace.Buffer.SetCapacity(1024); + mono_stack_walk(&OnStackWalk, &stackTrace); + + const auto msg = String::Format(TEXT("GC new: {0}.{1} ({2} bytes). Stack Trace:\n{3}"), String(name_space), String(name), size, stackTrace.Buffer.ToStringView()); + Platform::Log(*msg); + //LOG_STR(Info, msg); + } + } +#endif + +#if COMPILE_WITH_PROFILER + // Register allocation during the current CPU event + auto thread = ProfilerCPU::GetCurrentThread(); + if (thread != nullptr && thread->Buffer.GetCount() != 0) + { + auto& activeEvent = thread->Buffer.Last().Event(); + if (activeEvent.End < ZeroTolerance) + { + activeEvent.ManagedMemoryAllocation += size; + } + } +#endif +} + +void OnGCEvent(MonoProfiler* profiler, MonoProfilerGCEvent event, uint32_t generation, mono_bool is_serial) +{ +#if COMPILE_WITH_PROFILER + // GC + static int32 ActiveEventIndex; + if (event == MONO_GC_EVENT_PRE_STOP_WORLD_LOCKED) + { + ActiveEventIndex = ProfilerCPU::BeginEvent(TEXT("Garbage Collection")); + } + else if (event == MONO_GC_EVENT_POST_START_WORLD_UNLOCKED) + { + ProfilerCPU::EndEvent(ActiveEventIndex); + } +#endif +} + +#endif + +void OnLogCallback(const char* logDomain, const char* logLevel, const char* message, mono_bool fatal, void* userData) +{ + String currentDomain(logDomain); + String msg(message); + msg.Replace('\n', ' '); + + static const char* monoErrorLevels[] = + { + nullptr, + "error", + "critical", + "warning", + "message", + "info", + "debug" + }; + + uint32 errorLevel = 0; + if (logLevel != nullptr) + { + for (uint32 i = 1; i < 7; i++) + { + if (strcmp(monoErrorLevels[i], logLevel) == 0) + { + errorLevel = i; + break; + } + } + } + + if (currentDomain.IsEmpty()) + { + auto domain = MCore::GetActiveDomain(); + if (domain != nullptr) + { + currentDomain = domain->GetName().Get(); + } + else + { + currentDomain = "null"; + } + } + +#if 0 + // Print C# stack trace (crash may be caused by the managed code) + if (mono_domain_get() && Assemblies::FlaxEngine.Assembly->IsLoaded()) + { + const auto managedStackTrace = DebugLog::GetStackTrace(); + if (managedStackTrace.HasChars()) + { + LOG(Warning, "Managed stack trace:"); + LOG_STR(Warning, managedStackTrace); + } + } +#endif + + if (errorLevel == 0) + { + Log::CLRInnerException(String::Format(TEXT("Message: {0} | Domain: {1}"), msg, currentDomain)).SetLevel(LogType::Error); + } + else if (errorLevel <= 2) + { + Log::CLRInnerException(String::Format(TEXT("Message: {0} | Domain: {1}"), msg, currentDomain)).SetLevel(LogType::Error); + } + else if (errorLevel <= 3) + { + LOG(Warning, "Message: {0} | Domain: {1}", msg, currentDomain); + } + else + { + LOG(Info, "Message: {0} | Domain: {1}", msg, currentDomain); + } +} + +void OnPrintCallback(const char* string, mono_bool isStdout) +{ + LOG_STR(Warning, String(string)); +} + +void OnPrintErrorCallback(const char* string, mono_bool isStdout) +{ + // HACK: ignore this message + if (string && Platform::MemoryCompare(string, "debugger-agent: Unable to listen on ", 36) == 0) + return; + + LOG_STR(Error, String(string)); +} + +#if PLATFORM_LINUX && !USE_MONO_DYNAMIC_LIB + +#include + +#define MONO_THIS_LIB_HANDLE ((void*)(intptr)-1) + +static void* ThisLibHandle = nullptr; + +static void* OnMonoLinuxDlOpen(const char* name, int flags, char** err, void* user_data) +{ + void* result = nullptr; + if (name && StringUtils::Compare(name + StringUtils::Length(name) - 17, "libmono-native.so") == 0) + { + result = MONO_THIS_LIB_HANDLE; + } + return result; +} + +static void* OnMonoLinuxDlSym(void* handle, const char* name, char** err, void* user_data) +{ + void* result = nullptr; + if (handle == MONO_THIS_LIB_HANDLE && ThisLibHandle != nullptr) + { + result = dlsym(ThisLibHandle, name); + } + return result; +} + +#endif + +bool MCore::LoadEngine() +{ + PROFILE_CPU(); + ASSERT(Globals::MonoPath.IsANSI()); + + // Debugging Mono GC + //Platform::SetEnvironmentVariable(TEXT("MONO_GC_DEBUG"), TEXT("6:gc-log.txt,check-remset-consistency,nursery-canaries")); + +#if 0 + // Override memory allocation callback + // TODO: use ENABLE_OVERRIDABLE_ALLOCATORS when building Mono to support memory callbacks or use counters for memory profiling + MonoAllocatorVTable alloc; + alloc.version = MONO_ALLOCATOR_VTABLE_VERSION; + alloc.malloc = MonoMalloc; + alloc.realloc = MonoRealloc; + alloc.free = MonoFree; + alloc.calloc = MonoCalloc; + mono_set_allocator_vtable(&alloc); +#endif + +#if USE_MONO_AOT + mono_jit_set_aot_mode(USE_MONO_AOT_MODE); +#endif + +#ifdef USE_MONO_AOT_MODULE + // Load AOT module + const DateTime aotModuleLoadStartTime = DateTime::Now(); + LOG(Info, "Loading Mono AOT module..."); + void* libAotModule = Platform::LoadLibrary(TEXT(USE_MONO_AOT_MODULE)); + if (libAotModule == nullptr) + { + LOG(Error, "Failed to laod Mono AOT module (" TEXT(USE_MONO_AOT_MODULE) ")"); + return true; + } + MonoAotModuleHandle = libAotModule; + void* getModulesPtr = Platform::GetProcAddress(libAotModule, "GetMonoModules"); + if (getModulesPtr == nullptr) + { + LOG(Error, "Failed to get Mono AOT modules getter."); + return true; + } + typedef int (*GetMonoModulesFunc)(void** buffer, int bufferSize); + const auto getModules = (GetMonoModulesFunc)getModulesPtr; + const int32 moduelsCount = getModules(nullptr, 0); + void** modules = (void**)Allocator::Allocate(moduelsCount * sizeof(void*)); + getModules(modules, moduelsCount); + for (int32 i = 0; i < moduelsCount; i++) + { + mono_aot_register_module((void**)modules[i]); + } + Allocator::Free(modules); + LOG(Info, "Mono AOT module loaded in {0}ms", (int32)(DateTime::Now() - aotModuleLoadStartTime).GetTotalMilliseconds()); +#endif + + // Set mono assemblies path + StringAnsi pathLib = (Globals::MonoPath / TEXT("/lib")).ToStringAnsi(); + StringAnsi pathEtc = (Globals::MonoPath / TEXT("/etc")).ToStringAnsi(); + mono_set_dirs(pathLib.Get(), pathEtc.Get()); + + // Setup debugger + { + int32 debuggerLogLevel = 0; + if (CommandLine::Options.MonoLog.IsTrue()) + { + LOG(Info, "Using detailed Mono logging"); + mono_trace_set_level_string("debug"); + debuggerLogLevel = 10; + } + else + { + mono_trace_set_level_string("warning"); + } + +#if MONO_DEBUG_ENABLE && !PLATFORM_SWITCH + StringAnsi debuggerIp = "127.0.0.1"; + uint16 debuggerPort = 41000 + Platform::GetCurrentProcessId() % 1000; + if (CommandLine::Options.DebuggerAddress.HasValue()) + { + const auto& address = CommandLine::Options.DebuggerAddress.GetValue(); + const int32 splitIndex = address.Find(':'); + if (splitIndex == INVALID_INDEX) + { + debuggerIp = address.ToStringAnsi(); + } + else + { + debuggerIp = address.Left(splitIndex).ToStringAnsi(); + StringUtils::Parse(address.Right(address.Length() - splitIndex - 1).Get(), &debuggerPort); + } + } + + char buffer[150]; + sprintf(buffer, "--debugger-agent=transport=dt_socket,address=%s:%d,embedding=1,server=y,suspend=%s,loglevel=%d", debuggerIp.Get(), debuggerPort, CommandLine::Options.WaitForDebugger ? "y,timeout=5000" : "n", debuggerLogLevel); + + const char* options[] = { + "--soft-breakpoints", + //"--optimize=float32", + buffer + }; + mono_jit_parse_options(ARRAY_COUNT(options), (char**)options); + + mono_debug_init(MONO_DEBUG_FORMAT_MONO, 0); + LOG(Info, "Mono debugger server at {0}:{1}", ::String(debuggerIp), debuggerPort); +#endif + + // Connects to mono engine callback system + mono_trace_set_log_handler(OnLogCallback, nullptr); + mono_trace_set_print_handler(OnPrintCallback); + mono_trace_set_printerr_handler(OnPrintErrorCallback); + } + +#if USE_MONO_PROFILER + // Setup profiler options + bool useExternalProfiler = false; + { + ::String monoEnvOptions; + if (!Platform::GetEnvironmentVariable(TEXT("MONO_ENV_OPTIONS"), monoEnvOptions)) + { + const StringView prefix(TEXT("--profile=")); + if (monoEnvOptions.StartsWith(prefix)) + { + monoEnvOptions = monoEnvOptions.Substring(prefix.Length()); + LOG(Info, "Loading Mono profiler with options \'{0}\'", monoEnvOptions); + StringAnsi monoEnvOptionsAnsi(monoEnvOptions); + mono_profiler_load(monoEnvOptionsAnsi.Get()); + useExternalProfiler = true; + } + } + } +#endif + +#if PLATFORM_ANDROID + // Disable any AOT code on Android + mono_jit_set_aot_mode(MONO_AOT_MODE_NONE); + + // Hint to use default system assemblies location + const StringAnsi assembliesPath = (Globals::MonoPath / TEXT("/lib/mono/2.1")).ToStringAnsi(); + mono_set_assemblies_path(*assembliesPath); +#elif PLATFORM_LINUX + // Adjust GC threads suspending mode on Linux + Platform::SetEnvironmentVariable(TEXT("MONO_THREADS_SUSPEND"), TEXT("preemptive")); + +#if !USE_MONO_DYNAMIC_LIB + // Hook for missing library (when using static linking) + ThisLibHandle = dlopen(nullptr, RTLD_LAZY); + mono_dl_fallback_register(OnMonoLinuxDlOpen, OnMonoLinuxDlSym, nullptr, nullptr); +#endif +#elif PLATFORM_MAC + // Adjust GC threads suspending mode on Mac + Platform::SetEnvironmentVariable(TEXT("MONO_THREADS_SUSPEND"), TEXT("preemptive")); +#endif + const char* configPath = nullptr; +#if PLATFORM_SWITCH + StringAnsi configPathBuf = (Globals::MonoPath / TEXT("/etc/mono/config")).ToStringAnsi(); + configPath = *configPathBuf; + const StringAnsi assembliesPath = (Globals::MonoPath / TEXT("/lib/mono/4.5")).ToStringAnsi(); + mono_set_assemblies_path(*assembliesPath); +#endif + mono_config_parse(configPath); + +#if USE_MONO_PROFILER + // Init profiler + if (!useExternalProfiler) + { + const MonoProfilerHandle profilerHandle = mono_profiler_create((MonoProfiler*)&Profiler); + mono_profiler_set_gc_allocation_callback(profilerHandle, &OnGCAllocation); + mono_profiler_set_gc_event_callback(profilerHandle, &OnGCEvent); + mono_profiler_enable_allocations(); + } +#endif + + // Init managed runtime +#if PLATFORM_ANDROID + const char* monoVersion = "mobile"; +#else + const char* monoVersion = "v4.0.30319"; +#endif + auto monoRootDomain = mono_jit_init_version("Flax", monoVersion); + ASSERT(monoRootDomain); + MRootDomain = New("Root"); + MRootDomain->_monoDomain = monoRootDomain; + MDomains.Add(MRootDomain); + + auto exePath = Platform::GetExecutableFilePath(); + auto configDir = StringUtils::GetDirectoryName(exePath).ToStringAnsi(); + auto configFilename = StringUtils::GetFileName(exePath).ToStringAnsi() + ".config"; +#if PLATFORM_UWP + // Change the app root to Mono sub directory to prevent loading .Net Core assemblies from the AppX root folder + configDir += "\\Mono"; +#elif PLATFORM_SWITCH + // Make config file path absolute + configFilename = exePath.ToStringAnsi() + ".config"; +#endif + mono_domain_set_config(monoRootDomain, configDir.Get(), configFilename.Get()); + mono_thread_set_main(mono_thread_current()); + + // Info + char* buildInfo = mono_get_runtime_build_info(); + LOG(Info, "Mono runtime version: {0}", ::String(buildInfo)); + mono_free(buildInfo); + + return false; +} + +#if PLATFORM_WINDOWS && USE_EDITOR +long MonoHackSehExceptionHandler(class EXCEPTION_POINTERS* ep) +{ + LOG(Error, "Mono crashed on exit"); + return 1; +} +#endif + +void MCore::UnloadEngine() +{ + // Only root domain should be alive at this point + for (auto domain : MDomains) + { + if (domain != MRootDomain) + Delete(domain); + } + MDomains.Clear(); + + if (MRootDomain) + { +#if PLATFORM_WINDOWS && USE_EDITOR + // TODO: reduce issues with hot-reloading C# DLLs because sometimes it crashes on exit + __try +#endif + { + mono_jit_cleanup(MRootDomain->GetNative()); + } +#if PLATFORM_WINDOWS && USE_EDITOR + __except (MonoHackSehExceptionHandler(nullptr)) + { + } +#endif + Delete(MRootDomain); + MRootDomain = nullptr; + } + +#ifdef USE_MONO_AOT_MODULE + Platform::FreeLibrary(MonoAotModuleHandle); +#endif + +#if PLATFORM_LINUX && !USE_MONO_DYNAMIC_LIB + if (ThisLibHandle) + { + dlclose(ThisLibHandle); + ThisLibHandle = nullptr; + } +#endif +} + +#if USE_EDITOR + +void MCore::OnMidHotReload() +{ +} + +#endif + +MObject* MCore::Object::Box(void* value, const MClass* klass) +{ + return mono_value_box(mono_domain_get(), klass->GetNative(), value); +} + +void* MCore::Object::Unbox(MObject* obj) +{ + return (byte*)obj + sizeof(MonoObject); + //return mono_object_unbox(obj); +} + +MObject* MCore::Object::New(const MClass* klass) +{ + return mono_object_new(mono_domain_get(), klass->GetNative()); +} + +void MCore::Object::Init(MObject* obj) +{ + mono_runtime_object_init(obj); +} + +MClass* MCore::Object::GetClass(MObject* obj) +{ + MonoClass* mclass = mono_object_get_class(obj); + return FindClass(mclass); +} + +MString* MCore::Object::ToString(MObject* obj) +{ + return mono_object_to_string(obj, nullptr); +} + +int32 MCore::Object::GetHashCode(MObject* obj) +{ + return mono_object_hash(obj); +} + +MString* MCore::String::GetEmpty(MDomain* domain) +{ + MonoDomain* mdomain = domain ? domain->GetNative() : mono_domain_get(); + return mono_string_empty(mdomain); +} + +MString* MCore::String::New(const char* str, int32 length, MDomain* domain) +{ + MonoDomain* mdomain = domain ? domain->GetNative() : mono_domain_get(); + return mono_string_new_len(mdomain, str, length); +} + +MString* MCore::String::New(const Char* str, int32 length, MDomain* domain) +{ + MonoDomain* mdomain = domain ? domain->GetNative() : mono_domain_get(); + return mono_string_new_utf16(mdomain, str, length); +} + +StringView MCore::String::GetChars(MString* obj) +{ + return StringView(mono_string_chars(obj), (int32)mono_string_length(obj)); +} + +MArray* MCore::Array::New(const MClass* elementKlass, int32 length) +{ + // TODO: use shared empty arrays cache + return mono_array_new(mono_domain_get(), elementKlass->GetNative(), length); +} + +MClass* MCore::Array::GetClass(MClass* elementKlass) +{ + MonoClass* monoClass = mono_array_class_get(elementKlass->GetNative(), 1); + return FindClass(monoClass); +} + +int32 MCore::Array::GetLength(const MArray* obj) +{ + return (int32)mono_array_length((MonoArray*)obj); +} + +void* MCore::Array::GetAddress(const MArray* obj) +{ + return mono_array_addr_with_size((MonoArray*)obj, 0, 0); +} + +MGCHandle MCore::GCHandle::New(MObject* obj, bool pinned) +{ + return mono_gchandle_new(obj, pinned); +} + +MGCHandle MCore::GCHandle::NewWeak(MObject* obj, bool trackResurrection) +{ + return mono_gchandle_new_weakref(obj, trackResurrection); +} + +MObject* MCore::GCHandle::GetTarget(const MGCHandle& handle) +{ + return mono_gchandle_get_target(handle); +} + +void MCore::GCHandle::Free(const MGCHandle& handle) +{ + mono_gchandle_free(handle); +} + +void MCore::GC::Collect() +{ + PROFILE_CPU(); + mono_gc_collect(mono_gc_max_generation()); +} + +void MCore::GC::Collect(int32 generation) +{ + PROFILE_CPU(); + mono_gc_collect(generation); +} + +void MCore::GC::Collect(int32 generation, MGCCollectionMode collectionMode, bool blocking, bool compacting) +{ + PROFILE_CPU(); + mono_gc_collect(generation); +} + +int32 MCore::GC::MaxGeneration() +{ + PROFILE_CPU(); + return mono_gc_max_generation(); +} + +void MCore::GC::WaitForPendingFinalizers() +{ + PROFILE_CPU(); + if (mono_gc_pending_finalizers()) + { + mono_gc_finalize_notify(); + do + { + Platform::Sleep(1); + } while (mono_gc_pending_finalizers()); + } +} + +void MCore::GC::WriteRef(void* ptr, MObject* ref) +{ + mono_gc_wbarrier_generic_store(ptr, ref); +} + +void MCore::GC::WriteValue(void* dst, void* src, int32 count, const MClass* klass) +{ + mono_gc_wbarrier_value_copy(dst, src, count, klass->GetNative()); +} + +void MCore::GC::WriteArrayRef(MArray* dst, MObject* ref, int32 index) +{ + void* ptr = mono_array_addr_with_size(dst, 0, 0); + mono_gc_wbarrier_set_arrayref(dst, (byte*)ptr + index * sizeof(void*), ref); +} + +void MCore::GC::WriteArrayRef(MArray* dst, Span refs) +{ + void* ptr = mono_array_addr_with_size(dst, 0, 0); + for (int32 index = 0; index < refs.Length(); index++) + mono_gc_wbarrier_set_arrayref(dst, (byte*)ptr + index * sizeof(void*), refs[index]); +} + +void MCore::Thread::Attach() +{ + if (!IsInMainThread() && !mono_domain_get()) + { + const auto domain = GetActiveDomain(); + ASSERT(domain); + mono_thread_attach(domain->GetNative()); + } +} + +void MCore::Thread::Exit() +{ + if (!IsInMainThread() && mono_domain_get()) + { + LOG(Info, "Thread 0x{0:x} exits the managed runtime", Platform::GetCurrentThreadID()); + // TODO: use mono_thread_detach but modify mono to call mono_thread_info_detach there so the thread goes into STATE_DETACHED + mono_thread_exit(); + } +} + +bool MCore::Thread::IsAttached() +{ + return mono_domain_get() && mono_thread_current(); +} + +void MCore::Exception::Throw(MObject* exception) +{ + mono_raise_exception((MonoException*)exception); +} + +MObject* MCore::Exception::GetNullReference() +{ + return (MonoObject*)mono_get_exception_null_reference(); +} + +MObject* MCore::Exception::Get(const char* msg) +{ + return (MonoObject*)mono_exception_from_name_msg(mono_get_corlib(), "System", "Exception", msg); +} + +MObject* MCore::Exception::GetArgument(const char* arg, const char* msg) +{ + return (MonoObject*)mono_get_exception_argument(arg, msg); +} + +MObject* MCore::Exception::GetArgumentNull(const char* arg) +{ + return (MonoObject*)mono_get_exception_argument_null(arg); +} + +MObject* MCore::Exception::GetArgumentOutOfRange(const char* arg) +{ + return (MonoObject*)mono_get_exception_argument_out_of_range(arg); +} + +MObject* MCore::Exception::GetNotSupported(const char* msg) +{ + return (MonoObject*)mono_get_exception_not_supported(msg); +} + +::String MCore::Type::ToString(MType* type) +{ + return ::String(mono_type_get_name(type)); +} + +MClass* MCore::Type::GetClass(MType* type) +{ + MonoClass* mclass = mono_class_from_mono_type(type); + return FindClass(mclass); +} + +MType* MCore::Type::GetElementType(MType* type) +{ + CRASH; // impl this (get type class and call GetElementClass) + return nullptr; +} + +int32 MCore::Type::GetSize(MType* type) +{ + int32 valueAlignment; + return mono_type_stack_size(type, &valueAlignment); +} + +MTypes MCore::Type::GetType(MType* type) +{ + return (MTypes)type->type; +} + +bool MCore::Type::IsPointer(MType* type) +{ + return mono_type_is_pointer(type) != 0; +} + +bool MCore::Type::IsReference(MType* type) +{ + return mono_type_is_reference(type) != 0; +} + +MTypeObject* MCore::Type::GetObject(MType* type) +{ + return mono_type_get_object(mono_domain_get(), type); +} + +MType* MCore::Type::Get(MTypeObject* type) +{ + return mono_reflection_type_get_type(type); +} + +MClass* MAssembly::GetClass(MonoClass* monoClass) const +{ + if (monoClass == nullptr || !IsLoaded() || mono_class_get_image(monoClass) != _monoImage) + return nullptr; + + // Find class by native pointer + const auto& classes = GetClasses(); + const auto typeToken = mono_class_get_type_token(monoClass); + for (auto i = classes.Begin(); i.IsNotEnd(); ++i) + { + MonoClass* e = i->Value->GetNative(); + if (e == monoClass || mono_class_get_type_token(e) == typeToken) + { + return i->Value; + } + } + +#if 0 + { + LOG(Warning, "Failed to find class {0}.{1} in assembly {2}. Classes:", String(mono_class_get_namespace(monoClass)), String(mono_class_get_name(monoClass)), ToString()); + for (auto i = classes.Begin(); i.IsNotEnd(); ++i) + { + LOG(Warning, " - {0}", String(i->Key)); + } + } +#endif + return nullptr; +} + +MonoReflectionAssembly* MAssembly::GetNative() const +{ + if (!_monoAssembly) + return nullptr; + return mono_assembly_get_object(mono_domain_get(), _monoAssembly); +} + +const MAssembly::ClassesDictionary& MAssembly::GetClasses() const +{ + if (_hasCachedClasses || !IsLoaded()) + return _classes; + PROFILE_CPU(); + const auto startTime = DateTime::NowUTC(); + +#if TRACY_ENABLE + const StringAnsiView monoImageName(mono_image_get_name(_monoImage)); + ZoneText(*monoImageName, monoImageName.Length()); +#endif + ScopeLock lock(_locker); + if (_hasCachedClasses) + return _classes; + ASSERT(_classes.IsEmpty()); + const int32 numRows = mono_image_get_table_rows(_monoImage, MONO_TABLE_TYPEDEF); + _classes.EnsureCapacity(numRows * 4); + for (int32 i = 1; i < numRows; i++) // Skip class + { + MonoClass* klass = mono_class_get(_monoImage, (i + 1) | MONO_TOKEN_TYPE_DEF); + + // Build the typename + StringAnsi fullname; + GetClassFullname(klass, fullname); + + // Create class object + auto mclass = New(this, klass, fullname); + _classes.Add(fullname, mclass); + } + + const auto endTime = DateTime::NowUTC(); + LOG(Info, "Caching classes for assembly {0} took {1}ms", String(_name), (int32)(endTime - startTime).GetTotalMilliseconds()); + +#if 0 + for (auto i = _classes.Begin(); i.IsNotEnd(); ++i) + LOG(Info, "Class: {0}", String(i->Value->GetFullName())); +#endif + + _hasCachedClasses = true; + return _classes; +} + +bool MAssembly::Load(MonoImage* monoImage) +{ + if (IsLoaded()) + return false; + PROFILE_CPU(); +#if TRACY_ENABLE + const StringAnsiView monoImageName(mono_image_get_name(monoImage)); + ZoneText(*monoImageName, monoImageName.Length()); +#endif + + // Ensure to be unloaded + Unload(); + + // Start + const auto startTime = DateTime::NowUTC(); + OnLoading(); + + // Load + _monoAssembly = mono_image_get_assembly(monoImage); + if (_monoAssembly == nullptr) + { + OnLoadFailed(); + return true; + } + _monoImage = monoImage; + _hasCachedClasses = false; + + // End + OnLoaded(startTime); + return false; +} + +bool MAssembly::LoadCorlib() +{ + return Load(mono_get_corlib()); +} + +bool MAssembly::LoadImage(const String& assemblyPath, const StringView& nativePath) +{ + // Load assembly file data + Array data; + File::ReadAllBytes(assemblyPath, data); + + // Init Mono image + MonoImageOpenStatus status; + const auto name = assemblyPath.ToStringAnsi(); + const auto assemblyImage = mono_image_open_from_data_with_name(reinterpret_cast(data.Get()), data.Count(), true, &status, false, name.Get()); + if (status != MONO_IMAGE_OK || assemblyImage == nullptr) + { + Log::CLRInnerException(TEXT("Mono assembly image is invalid at ") + assemblyPath); + return true; + } + + // Setup assembly + const auto assembly = mono_assembly_load_from_full(assemblyImage, name.Substring(0, name.Length() - 3).Get(), &status, false); + mono_image_close(assemblyImage); + if (status != MONO_IMAGE_OK || assembly == nullptr) + { + Log::CLRInnerException(TEXT("Mono assembly image is corrupted at ") + assemblyPath); + return true; + } + +#if MONO_DEBUG_ENABLE + // Try to load debug symbols (use portable PDB format) + const auto pdbPath = String(StringUtils::GetPathWithoutExtension(assemblyPath)) + TEXT(".pdb"); + if (FileSystem::FileExists(pdbPath)) + { + // Load .pdb file + File::ReadAllBytes(pdbPath, _debugData); + + // Attach debugging symbols to image + if (_debugData.HasItems()) + { + mono_debug_open_image_from_memory(assemblyImage, _debugData.Get(), _debugData.Count()); + } + } + + // TODO: load pdbs for custom third-party libs referenced by game assemblies for debugging +#if 0 + // Hack to load debug information for Newtonsoft.Json (enable it to debug C# code of json lib) + if (assemblyPath.EndsWith(TEXT("FlaxEngine.CSharp.dll"))) + { + static Array NewtonsoftJsonDebugData; + File::ReadAllBytes(String(StringUtils::GetDirectoryName(assemblyPath)) / TEXT("Newtonsoft.Json.pdb"), NewtonsoftJsonDebugData); + if (NewtonsoftJsonDebugData.HasItems()) + { + StringAnsi tmp(String(StringUtils::GetDirectoryName(assemblyPath)) / TEXT("Newtonsoft.Json.dll")); + MonoAssembly* a = mono_assembly_open(tmp.Get(), &status); + if (a) + { + mono_debug_open_image_from_memory(mono_assembly_get_image(a), NewtonsoftJsonDebugData.Get(), NewtonsoftJsonDebugData.Count()); + } + } + } +#endif +#endif + + _monoAssembly = assembly; + _monoImage = assemblyImage; + _hasCachedClasses = false; + _assemblyPath = assemblyPath; + return false; +} + +bool MAssembly::UnloadImage(bool isReloading) +{ + if (_monoImage) + { + if (isReloading) + { + LOG(Info, "Unloading managed assembly \'{0}\' (is reloading)", String(_name)); + + mono_assembly_close(_monoAssembly); + } + else + { + // NOTE: do not try to close all the opened images + // that will cause the domain unload to crash because + // the images have already been closed (double free) + } + + _monoAssembly = nullptr; + _monoImage = nullptr; + } + return false; +} + +bool MAssembly::ResolveMissingFile(String& assemblyPath) const +{ + return true; +} + +MClass::MClass(const MAssembly* parentAssembly, MonoClass* monoClass, const StringAnsi& fullname) + : _assembly(parentAssembly) + , _fullname(fullname) + , _hasCachedProperties(false) + , _hasCachedFields(false) + , _hasCachedMethods(false) + , _hasCachedAttributes(false) + , _hasCachedEvents(false) + , _hasCachedInterfaces(false) +{ + _monoClass = monoClass; + ASSERT(monoClass); + + const uint32_t flags = mono_class_get_flags(monoClass); + + switch (flags & MONO_TYPE_ATTR_VISIBILITY_MASK) + { + case MONO_TYPE_ATTR_NOT_PUBLIC: + case MONO_TYPE_ATTR_NESTED_PRIVATE: + _visibility = MVisibility::Private; + break; + case MONO_TYPE_ATTR_PUBLIC: + case MONO_TYPE_ATTR_NESTED_PUBLIC: + _visibility = MVisibility::Public; + break; + case MONO_TYPE_ATTR_NESTED_FAMILY: + case MONO_TYPE_ATTR_NESTED_ASSEMBLY: + _visibility = MVisibility::Internal; + break; + case MONO_TYPE_ATTR_NESTED_FAM_OR_ASSEM: + _visibility = MVisibility::ProtectedInternal; + break; + case MONO_TYPE_ATTR_NESTED_FAM_AND_ASSEM: + _visibility = MVisibility::PrivateProtected; + break; + default: + CRASH; + } + + const uint32_t staticClassFlags = MONO_TYPE_ATTR_ABSTRACT | MONO_TYPE_ATTR_SEALED; + _isStatic = (flags & staticClassFlags) == staticClassFlags; + _isSealed = !_isStatic && (flags & MONO_TYPE_ATTR_SEALED) == MONO_TYPE_ATTR_SEALED; + _isAbstract = !_isStatic && (flags & MONO_TYPE_ATTR_ABSTRACT) == MONO_TYPE_ATTR_ABSTRACT; + _isInterface = (flags & MONO_TYPE_ATTR_CLASS_SEMANTIC_MASK) == MONO_TYPE_ATTR_INTERFACE; + _isValueType = mono_class_is_valuetype(monoClass); + _isEnum = mono_class_is_enum(monoClass); +} + +MClass::~MClass() +{ + if (_attrInfo) + mono_custom_attrs_free((MonoCustomAttrInfo*)_attrInfo); + _fields.ClearDelete(); + _properties.ClearDelete(); + _methods.ClearDelete(); + _attributes.ClearDelete(); + _events.ClearDelete(); +} + +StringAnsiView MClass::GetName() const +{ + return StringAnsiView(mono_class_get_name(_monoClass)); +} + +StringAnsiView MClass::GetNamespace() const +{ + return StringAnsiView(mono_class_get_namespace(_monoClass)); +} + +MType* MClass::GetType() const +{ + return mono_class_get_type(_monoClass); +} + +MClass* MClass::GetBaseClass() const +{ + MonoClass* monoBase = mono_class_get_parent(_monoClass); + if (monoBase == nullptr) + return nullptr; + return FindClass(monoBase); +} + +bool MClass::IsSubClassOf(const MClass* klass, bool checkInterfaces) const +{ + return klass && mono_class_is_subclass_of(_monoClass, klass->GetNative(), checkInterfaces) != 0; +} + +bool MClass::HasInterface(const MClass* klass) const +{ + return klass && mono_class_is_assignable_from(klass->GetNative(), _monoClass) != 0; +} + +bool MClass::IsInstanceOfType(MObject* object) const +{ + if (object == nullptr) + return false; + MonoClass* monoClass = mono_object_get_class(object); + return mono_class_is_subclass_of(monoClass, _monoClass, false) != 0; +} + +uint32 MClass::GetInstanceSize() const +{ + uint32 align = 0; + if (IsValueType()) + return mono_class_value_size(_monoClass, &align); + return mono_class_instance_size(_monoClass); +} + +MClass* MClass::GetElementClass() const +{ + MonoClass* monoClass = mono_class_get_element_class(_monoClass); + return FindClass(monoClass); +} + +MMethod* MClass::GetMethod(const char* name, int32 numParams) const +{ + // Lookup for cached method + for (int32 i = 0; i < _methods.Count(); i++) + { + if (_methods[i]->GetName() == name && _methods[i]->GetParametersCount() == numParams) + return _methods[i]; + } + + // Find Mono method + MonoMethod* monoMethod = mono_class_get_method_from_name(_monoClass, name, numParams); + if (monoMethod == nullptr) + return nullptr; + + // Create method + auto method = New(monoMethod, name, (MClass*)this); + _methods.Add(method); + return method; +} + +const Array& MClass::GetMethods() const +{ + if (_hasCachedMethods) + return _methods; + + void* iter = nullptr; + MonoMethod* curClassMethod; + while ((curClassMethod = mono_class_get_methods(_monoClass, &iter))) + { + // Check if has not been added + bool isMissing = true; + for (int32 i = 0; i < _methods.Count(); i++) + { + if (_methods[i]->GetNative() == curClassMethod) + { + isMissing = false; + break; + } + } + + if (isMissing) + { + // Create method + auto method = New(curClassMethod, (MClass*)this); + _methods.Add(method); + } + } + + _hasCachedMethods = true; + return _methods; +} + +MField* MClass::GetField(const char* name) const +{ + // Lookup for cached field + for (int32 i = 0; i < _fields.Count(); i++) + { + if (_fields[i]->GetName() == name) + return _fields[i]; + } + + // Find mono field + MonoClassField* field = mono_class_get_field_from_name(_monoClass, name); + if (field == nullptr) + return nullptr; + + // Create field + auto mfield = New(field, name, (MClass*)this); + _fields.Add(mfield); + return mfield; +} + +const Array& MClass::GetFields() const +{ + if (_hasCachedFields) + return _fields; + + void* iter = nullptr; + MonoClassField* curClassField; + while ((curClassField = mono_class_get_fields(_monoClass, &iter))) + { + const char* fieldName = mono_field_get_name(curClassField); + GetField(fieldName); + } + + _hasCachedFields = true; + return _fields; +} + +const Array& MClass::GetEvents() const +{ + if (_hasCachedEvents) + return _events; + + void* iter = nullptr; + MonoEvent* curEvent; + while ((curEvent = mono_class_get_events(_monoClass, &iter))) + { + const char* name = mono_event_get_name(curEvent); + bool missing = true; + for (int32 i = 0; i < _events.Count(); i++) + { + if (_events[i]->GetName() == name) + { + missing = false; + break; + } + } + if (missing) + { + auto result = New(curEvent, name, (MClass*)this); + _events.Add(result); + } + } + + _hasCachedEvents = true; + return _events; +} + +MProperty* MClass::GetProperty(const char* name) const +{ + // Lookup for cached property + for (int32 i = 0; i < _properties.Count(); i++) + { + if (_properties[i]->GetName() == name) + return _properties[i]; + } + + // Find mono property + MonoProperty* monoProperty = mono_class_get_property_from_name(_monoClass, name); + if (monoProperty == nullptr) + return nullptr; + + // Create method + auto mproperty = New(monoProperty, name, (MClass*)this); + _properties.Add(mproperty); + + return mproperty; +} + +class PhysicsColliderActorInternal +{ +public: + void CollisionEnter_ManagedWrapper(const int32& arg0) + { + MMethod* mmethod = nullptr; + CHECK(mmethod); + PROFILE_CPU_NAMED("FlaxEngine.PhysicsColliderActor::OnCollisionEnter"); + MonoObject* exception = nullptr; + void* params[1]; + MonoObject* instance; + mono_runtime_invoke(mmethod->GetNative(), instance, params, &exception); + mmethod->Invoke(instance, params, &exception); + } +}; + +const Array& MClass::GetProperties() const +{ + if (_hasCachedProperties) + return _properties; + + void* iter = nullptr; + MonoProperty* curClassProperty; + while ((curClassProperty = mono_class_get_properties(_monoClass, &iter))) + { + const char* propertyName = mono_property_get_name(curClassProperty); + GetProperty(propertyName); + } + + _hasCachedProperties = true; + return _properties; +} + +const Array& MClass::GetInterfaces() const +{ + if (_hasCachedInterfaces) + return _interfaces; + + void* iter = nullptr; + MonoClass* curInterface; + while ((curInterface = mono_class_get_interfaces(_monoClass, &iter))) + { + _interfaces.Add(FindClass(curInterface)); + } + + _hasCachedInterfaces = true; + return _interfaces; +} + +bool MClass::HasAttribute(const MClass* monoClass) const +{ + MonoCustomAttrInfo* attrInfo = GET_CUSTOM_ATTR(); + return attrInfo != nullptr && mono_custom_attrs_has_attr(attrInfo, monoClass->GetNative()) != 0; +} + +bool MClass::HasAttribute() const +{ + MonoCustomAttrInfo* attrInfo = GET_CUSTOM_ATTR(); + return attrInfo && attrInfo->num_attrs > 0; +} + +MObject* MClass::GetAttribute(const MClass* monoClass) const +{ + MonoCustomAttrInfo* attrInfo = GET_CUSTOM_ATTR(); + return attrInfo ? mono_custom_attrs_get_attr(attrInfo, monoClass->GetNative()) : nullptr; +} + +const Array& MClass::GetAttributes() const +{ + if (_hasCachedAttributes) + return _attributes; + _hasCachedAttributes = true; + + MonoCustomAttrInfo* attrInfo = GET_CUSTOM_ATTR(); + if (attrInfo == nullptr) + return _attributes; + + MonoArray* monoAttributesArray = mono_custom_attrs_construct(attrInfo); + const uint32 length = (uint32)mono_array_length(monoAttributesArray); + _attributes.Resize(length); + for (uint32 i = 0; i < length; i++) + _attributes[i] = mono_array_get(monoAttributesArray, MonoObject*, i); + mono_custom_attrs_free(attrInfo); + return _attributes; +} + +bool MDomain::SetCurrentDomain(bool force) +{ + if (mono_domain_set(_monoDomain, force) == 0) + return false; + MActiveDomain = this; + return true; +} + +void MDomain::Dispatch() const +{ + if (!IsInMainThread()) + { + mono_thread_attach(_monoDomain); + } +} + +MEvent::MEvent(MonoEvent* monoEvent, const char* name, MClass* parentClass) + : _monoEvent(monoEvent) + , _addMethod(nullptr) + , _removeMethod(nullptr) + , _parentClass(parentClass) + , _name(name) + , _hasCachedAttributes(false) + , _hasAddMonoMethod(true) + , _hasRemoveMonoMethod(true) +{ +#if BUILD_DEBUG + // Validate input name + ASSERT(StringUtils::Compare(name, mono_event_get_name(monoEvent)) == 0); +#endif +} + +MMethod* MEvent::GetAddMethod() const +{ + if (!_hasAddMonoMethod) + return nullptr; + if (_addMethod == nullptr) + { + MonoMethod* addMonoMethod = mono_event_get_add_method(_monoEvent); + if (addMonoMethod != nullptr) + { + _hasAddMonoMethod = true; + return _addMethod = New(addMonoMethod, (MClass*)_parentClass); + } + } + return _addMethod; +} + +MMethod* MEvent::GetRemoveMethod() const +{ + if (!_hasRemoveMonoMethod) + return nullptr; + if (_removeMethod == nullptr) + { + MonoMethod* removeMonoMethod = mono_event_get_remove_method(_monoEvent); + if (removeMonoMethod) + { + _hasRemoveMonoMethod = true; + return _removeMethod = New(removeMonoMethod, (MClass*)_parentClass); + } + } + return _removeMethod; +} + +bool MEvent::HasAttribute(MClass* monoClass) const +{ + MonoClass* parentClass = mono_event_get_parent(_monoEvent); + MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_event(parentClass, _monoEvent); + if (attrInfo == nullptr) + return false; + + const bool hasAttr = mono_custom_attrs_has_attr(attrInfo, monoClass->GetNative()) != 0; + mono_custom_attrs_free(attrInfo); + return hasAttr; +} + +bool MEvent::HasAttribute() const +{ + MonoClass* parentClass = mono_event_get_parent(_monoEvent); + MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_event(parentClass, _monoEvent); + if (attrInfo == nullptr) + return false; + + if (attrInfo->num_attrs > 0) + { + mono_custom_attrs_free(attrInfo); + return true; + } + mono_custom_attrs_free(attrInfo); + return false; +} + +MObject* MEvent::GetAttribute(MClass* monoClass) const +{ + MonoClass* parentClass = mono_event_get_parent(_monoEvent); + MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_event(parentClass, _monoEvent); + if (attrInfo == nullptr) + return nullptr; + + MonoObject* foundAttr = mono_custom_attrs_get_attr(attrInfo, monoClass->GetNative()); + mono_custom_attrs_free(attrInfo); + return foundAttr; +} + +const Array& MEvent::GetAttributes() const +{ + if (_hasCachedAttributes) + return _attributes; + _hasCachedAttributes = true; + + MonoClass* parentClass = mono_event_get_parent(_monoEvent); + MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_event(parentClass, _monoEvent); + if (attrInfo == nullptr) + return _attributes; + + MonoArray* monoAttributesArray = mono_custom_attrs_construct(attrInfo); + const uint32 length = (uint32)mono_array_length(monoAttributesArray); + _attributes.Resize(length); + for (uint32 i = 0; i < length; i++) + _attributes[i] = mono_array_get(monoAttributesArray, MonoObject*, i); + mono_custom_attrs_free(attrInfo); + return _attributes; +} + +MException::MException(MObject* exception) + : InnerException(nullptr) +{ + ASSERT(exception); + + MonoClass* exceptionClass = mono_object_get_class(exception); + MonoProperty* exceptionMsgProp = mono_class_get_property_from_name(exceptionClass, "Message"); + MonoMethod* exceptionMsgGetter = mono_property_get_get_method(exceptionMsgProp); + MonoString* exceptionMsg = (MonoString*)mono_runtime_invoke(exceptionMsgGetter, exception, nullptr, nullptr); + Message = MUtils::ToString(exceptionMsg); + + MonoProperty* exceptionStackProp = mono_class_get_property_from_name(exceptionClass, "StackTrace"); + MonoMethod* exceptionStackGetter = mono_property_get_get_method(exceptionStackProp); + MonoString* exceptionStackTrace = (MonoString*)mono_runtime_invoke(exceptionStackGetter, exception, nullptr, nullptr); + StackTrace = MUtils::ToString(exceptionStackTrace); + + MonoProperty* innerExceptionProp = mono_class_get_property_from_name(exceptionClass, "InnerException"); + MonoMethod* innerExceptionGetter = mono_property_get_get_method(innerExceptionProp); + MonoObject* innerException = (MonoObject*)mono_runtime_invoke(innerExceptionGetter, exception, nullptr, nullptr); + if (innerException) + InnerException = New(innerException); +} + +MException::~MException() +{ + if (InnerException) + Delete(InnerException); +} + +MField::MField(MonoClassField* monoField, const char* name, MClass* parentClass) + : _monoField(monoField) + , _monoType(mono_field_get_type(monoField)) + , _parentClass(parentClass) + , _name(name) + , _hasCachedAttributes(false) +{ +#if BUILD_DEBUG + // Validate input name + ASSERT(StringUtils::Compare(name, mono_field_get_name(monoField)) == 0); +#endif + + const uint32_t flags = mono_field_get_flags(monoField); + switch (flags & MONO_FIELD_ATTR_FIELD_ACCESS_MASK) + { + case MONO_FIELD_ATTR_PRIVATE: + _visibility = MVisibility::Private; + break; + case MONO_FIELD_ATTR_FAM_AND_ASSEM: + _visibility = MVisibility::PrivateProtected; + break; + case MONO_FIELD_ATTR_ASSEMBLY: + _visibility = MVisibility::Internal; + break; + case MONO_FIELD_ATTR_FAMILY: + _visibility = MVisibility::Protected; + break; + case MONO_FIELD_ATTR_FAM_OR_ASSEM: + _visibility = MVisibility::ProtectedInternal; + break; + case MONO_FIELD_ATTR_PUBLIC: + _visibility = MVisibility::Public; + break; + default: + CRASH; + } + _isStatic = (flags & MONO_FIELD_ATTR_STATIC) != 0; +} + +MType* MField::GetType() const +{ + return _monoType; +} + +int32 MField::GetOffset() const +{ + return (int32)(mono_field_get_offset(_monoField) - sizeof(MonoObject)); +} + +void MField::GetValue(MObject* instance, void* result) const +{ + mono_field_get_value(instance, _monoField, result); +} + +MObject* MField::GetValueBoxed(MObject* instance) const +{ + return mono_field_get_value_object(mono_domain_get(), _monoField, instance); +} + +void MField::SetValue(MObject* instance, void* value) const +{ + mono_field_set_value(instance, _monoField, value); +} + +bool MField::HasAttribute(MClass* monoClass) const +{ + MonoClass* parentClass = mono_field_get_parent(_monoField); + MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_field(parentClass, _monoField); + if (attrInfo == nullptr) + return false; + + const bool hasAttr = mono_custom_attrs_has_attr(attrInfo, monoClass->GetNative()) != 0; + mono_custom_attrs_free(attrInfo); + return hasAttr; +} + +bool MField::HasAttribute() const +{ + MonoClass* parentClass = mono_field_get_parent(_monoField); + MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_field(parentClass, _monoField); + if (attrInfo == nullptr) + return false; + + if (attrInfo->num_attrs > 0) + { + mono_custom_attrs_free(attrInfo); + return true; + } + mono_custom_attrs_free(attrInfo); + return false; +} + +MObject* MField::GetAttribute(MClass* monoClass) const +{ + MonoClass* parentClass = mono_field_get_parent(_monoField); + MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_field(parentClass, _monoField); + if (attrInfo == nullptr) + return nullptr; + + MonoObject* foundAttr = mono_custom_attrs_get_attr(attrInfo, monoClass->GetNative()); + mono_custom_attrs_free(attrInfo); + return foundAttr; +} + +const Array& MField::GetAttributes() const +{ + if (_hasCachedAttributes) + return _attributes; + _hasCachedAttributes = true; + + MonoClass* parentClass = mono_field_get_parent(_monoField); + MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_field(parentClass, _monoField); + if (attrInfo == nullptr) + return _attributes; + + MonoArray* monoAttributesArray = mono_custom_attrs_construct(attrInfo); + const uint32 length = (uint32)mono_array_length(monoAttributesArray); + _attributes.Resize(length); + for (uint32 i = 0; i < length; i++) + _attributes[i] = mono_array_get(monoAttributesArray, MonoObject*, i); + mono_custom_attrs_free(attrInfo); + return _attributes; +} + +MMethod::MMethod(MonoMethod* monoMethod, MClass* parentClass) + : MMethod(monoMethod, mono_method_get_name(monoMethod), parentClass) +{ +} + +MMethod::MMethod(MonoMethod* monoMethod, const char* name, MClass* parentClass) + : _monoMethod(monoMethod) + , _parentClass(parentClass) + , _name(name) + , _hasCachedAttributes(false) +{ +#if BUILD_DEBUG + // Validate input name + ASSERT(StringUtils::Compare(name, mono_method_get_name(monoMethod)) == 0); +#endif + + const uint32_t flags = mono_method_get_flags(monoMethod, nullptr); + _isStatic = (flags & MONO_METHOD_ATTR_STATIC) != 0; + switch (flags & MONO_METHOD_ATTR_ACCESS_MASK) + { + case MONO_METHOD_ATTR_PRIVATE: + _visibility = MVisibility::Private; + break; + case MONO_METHOD_ATTR_FAM_AND_ASSEM: + _visibility = MVisibility::PrivateProtected; + break; + case MONO_METHOD_ATTR_ASSEM: + _visibility = MVisibility::Internal; + break; + case MONO_METHOD_ATTR_FAMILY: + _visibility = MVisibility::Protected; + break; + case MONO_METHOD_ATTR_FAM_OR_ASSEM: + _visibility = MVisibility::ProtectedInternal; + break; + case MONO_METHOD_ATTR_PUBLIC: + _visibility = MVisibility::Public; + break; + default: + CRASH; + } + +#if COMPILE_WITH_PROFILER + const StringAnsi& className = parentClass->GetFullName(); + ProfilerName.Resize(className.Length() + 2 + _name.Length()); + Platform::MemoryCopy(ProfilerName.Get(), className.Get(), className.Length()); + ProfilerName.Get()[className.Length()] = ':'; + ProfilerName.Get()[className.Length() + 1] = ':'; + Platform::MemoryCopy(ProfilerName.Get() + className.Length() + 2, _name.Get(), _name.Length()); + ProfilerData.name = ProfilerName.Get(); + ProfilerData.function = _name.Get(); + ProfilerData.file = nullptr; + ProfilerData.line = 0; + ProfilerData.color = 0; +#endif +} + +MObject* MMethod::Invoke(void* instance, void** params, MObject** exception) const +{ + PROFILE_CPU_SRC_LOC(ProfilerData); + return mono_runtime_invoke(_monoMethod, instance, params, exception); +} + +MObject* MMethod::InvokeVirtual(MObject* instance, void** params, MObject** exception) const +{ + PROFILE_CPU_SRC_LOC(ProfilerData); + MonoMethod* virtualMethod = mono_object_get_virtual_method(instance, _monoMethod); + return mono_runtime_invoke(virtualMethod, instance, params, exception); +} + +#if !USE_MONO_AOT + +void* MMethod::GetThunk() +{ + if (!_cachedThunk) + _cachedThunk = mono_method_get_unmanaged_thunk(_monoMethod); + return _cachedThunk; +} + +#endif + +MMethod* MMethod::InflateGeneric() const +{ + MonoMethod* inflatedMethod = mono_class_inflate_generic_method(_monoMethod, nullptr); + // TODO: don't leak created method + return New(inflatedMethod, _parentClass); +} + +MType* MMethod::GetReturnType() const +{ + MonoMethodSignature* sig = mono_method_signature(_monoMethod); + return mono_signature_get_return_type(sig); +} + +int32 MMethod::GetParametersCount() const +{ + MonoMethodSignature* sig = mono_method_signature(_monoMethod); + return (int32)mono_signature_get_param_count(sig); +} + +MType* MMethod::GetParameterType(int32 paramIdx) const +{ + MonoMethodSignature* sig = mono_method_signature(_monoMethod); + ASSERT_LOW_LAYER(paramIdx >= 0 && paramIdx < (int32)mono_signature_get_param_count(sig)); + void* it = nullptr; + mono_signature_get_params(sig, &it); + return ((MonoType**)it)[paramIdx]; +} + +bool MMethod::GetParameterIsOut(int32 paramIdx) const +{ + MonoMethodSignature* sig = mono_method_signature(_monoMethod); + ASSERT_LOW_LAYER(paramIdx >= 0 && paramIdx < (int32)mono_signature_get_param_count(sig)); + return mono_signature_param_is_out(sig, paramIdx) != 0; +} + +bool MMethod::HasAttribute(MClass* monoClass) const +{ + MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_method(_monoMethod); + if (attrInfo == nullptr) + return false; + + const bool hasAttr = mono_custom_attrs_has_attr(attrInfo, monoClass->GetNative()) != 0; + mono_custom_attrs_free(attrInfo); + return hasAttr; +} + +bool MMethod::HasAttribute() const +{ + MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_method(_monoMethod); + if (attrInfo == nullptr) + return false; + + if (attrInfo->num_attrs > 0) + { + mono_custom_attrs_free(attrInfo); + return true; + } + mono_custom_attrs_free(attrInfo); + return false; +} + +MObject* MMethod::GetAttribute(MClass* monoClass) const +{ + MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_method(_monoMethod); + if (attrInfo == nullptr) + return nullptr; + + MonoObject* foundAttr = mono_custom_attrs_get_attr(attrInfo, monoClass->GetNative()); + mono_custom_attrs_free(attrInfo); + return foundAttr; +} + +const Array& MMethod::GetAttributes() const +{ + if (_hasCachedAttributes) + return _attributes; + _hasCachedAttributes = true; + + MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_method(_monoMethod); + if (attrInfo == nullptr) + return _attributes; + + MonoArray* monoAttributesArray = mono_custom_attrs_construct(attrInfo); + const uint32 length = (uint32)mono_array_length(monoAttributesArray); + _attributes.Resize(length); + for (uint32 i = 0; i < length; i++) + _attributes[i] = mono_array_get(monoAttributesArray, MonoObject*, i); + mono_custom_attrs_free(attrInfo); + return _attributes; +} + +MProperty::MProperty(MonoProperty* monoProperty, const char* name, MClass* parentClass) + : _monoProperty(monoProperty) + , _getMethod(nullptr) + , _setMethod(nullptr) + , _parentClass(parentClass) + , _name(name) + , _hasCachedAttributes(false) + , _hasSetMethod(true) + , _hasGetMethod(true) +{ +#if BUILD_DEBUG + // Validate input name + ASSERT(StringUtils::Compare(name, mono_property_get_name(monoProperty)) == 0); +#endif + + GetGetMethod(); + GetSetMethod(); +} + +MProperty::~MProperty() +{ + if (_getMethod) + Delete(_getMethod); + if (_setMethod) + Delete(_setMethod); +} + +MMethod* MProperty::GetGetMethod() const +{ + if (!_hasGetMethod) + return nullptr; + if (_getMethod == nullptr) + { + MonoMethod* method = mono_property_get_get_method(_monoProperty); + if (method != nullptr) + { + _hasGetMethod = true; + return _getMethod = New(method, (MClass*)_parentClass); + } + } + return _getMethod; +} + +MMethod* MProperty::GetSetMethod() const +{ + if (!_hasSetMethod) + return nullptr; + if (_setMethod == nullptr) + { + MonoMethod* method = mono_property_get_set_method(_monoProperty); + if (method != nullptr) + { + _hasSetMethod = true; + return _setMethod = New(method, (MClass*)_parentClass); + } + } + return _setMethod; +} + +MObject* MProperty::GetValue(MObject* instance, MObject** exception) const +{ + return mono_property_get_value(_monoProperty, instance, nullptr, exception); +} + +void MProperty::SetValue(MObject* instance, void* value, MObject** exception) const +{ + void* params[1]; + params[0] = value; + mono_property_set_value(_monoProperty, instance, params, exception); +} + +bool MProperty::HasAttribute(MClass* monoClass) const +{ + MonoClass* parentClass = mono_property_get_parent(_monoProperty); + MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_property(parentClass, _monoProperty); + if (attrInfo == nullptr) + return false; + + const bool hasAttr = mono_custom_attrs_has_attr(attrInfo, monoClass->GetNative()) != 0; + mono_custom_attrs_free(attrInfo); + return hasAttr; +} + +bool MProperty::HasAttribute() const +{ + MonoClass* parentClass = mono_property_get_parent(_monoProperty); + MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_property(parentClass, _monoProperty); + if (attrInfo == nullptr) + return false; + + if (attrInfo->num_attrs > 0) + { + mono_custom_attrs_free(attrInfo); + return true; + } + mono_custom_attrs_free(attrInfo); + return false; +} + +MObject* MProperty::GetAttribute(MClass* monoClass) const +{ + MonoClass* parentClass = mono_property_get_parent(_monoProperty); + MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_property(parentClass, _monoProperty); + if (attrInfo == nullptr) + return nullptr; + + MonoObject* foundAttr = mono_custom_attrs_get_attr(attrInfo, monoClass->GetNative()); + mono_custom_attrs_free(attrInfo); + return foundAttr; +} + +const Array& MProperty::GetAttributes() const +{ + if (_hasCachedAttributes) + return _attributes; + _hasCachedAttributes = true; + + MonoClass* parentClass = mono_property_get_parent(_monoProperty); + MonoCustomAttrInfo* attrInfo = mono_custom_attrs_from_property(parentClass, _monoProperty); + if (attrInfo == nullptr) + return _attributes; + + MonoArray* monoAttributesArray = mono_custom_attrs_construct(attrInfo); + const uint32 length = (uint32)mono_array_length(monoAttributesArray); + _attributes.Resize(length); + for (uint32 i = 0; i < length; i++) + _attributes[i] = mono_array_get(monoAttributesArray, MonoObject*, i); + mono_custom_attrs_free(attrInfo); + return _attributes; +} + +#endif + +#if USE_MONO && PLATFORM_WIN32 && !USE_MONO_DYNAMIC_LIB + +// Export Mono functions +#pragma comment(linker, "/export:mono_add_internal_call") +#pragma comment(linker, "/export:mono_array_addr_with_size") +#pragma comment(linker, "/export:mono_array_calc_byte_len") +#pragma comment(linker, "/export:mono_array_class_get") +#pragma comment(linker, "/export:mono_array_clone") +#pragma comment(linker, "/export:mono_array_clone_checked") +#pragma comment(linker, "/export:mono_array_clone_in_domain") +#pragma comment(linker, "/export:mono_array_element_size") +#pragma comment(linker, "/export:mono_array_full_copy") +#pragma comment(linker, "/export:mono_array_handle_length") +#pragma comment(linker, "/export:mono_array_handle_memcpy_refs") +#pragma comment(linker, "/export:mono_array_handle_pin_with_size") +#pragma comment(linker, "/export:mono_array_length") +#pragma comment(linker, "/export:mono_array_new") +#pragma comment(linker, "/export:mono_array_new_1") +#pragma comment(linker, "/export:mono_array_new_2") +#pragma comment(linker, "/export:mono_array_new_3") +#pragma comment(linker, "/export:mono_array_new_4") +#pragma comment(linker, "/export:mono_array_new_checked") +#pragma comment(linker, "/export:mono_array_new_full") +#pragma comment(linker, "/export:mono_array_new_full_checked") +#pragma comment(linker, "/export:mono_array_new_full_handle") +#pragma comment(linker, "/export:mono_array_new_handle") +#pragma comment(linker, "/export:mono_array_new_specific") +#pragma comment(linker, "/export:mono_array_new_specific_checked") +#pragma comment(linker, "/export:mono_array_new_specific_handle") +#pragma comment(linker, "/export:mono_array_new_va") +#pragma comment(linker, "/export:mono_array_to_byte_byvalarray") +#pragma comment(linker, "/export:mono_array_to_lparray") +#pragma comment(linker, "/export:mono_array_to_savearray") +#pragma comment(linker, "/export:mono_assembly_addref") +#pragma comment(linker, "/export:mono_assembly_binding_applies_to_image") +#pragma comment(linker, "/export:mono_assembly_candidate_predicate_sn_same_name") +#pragma comment(linker, "/export:mono_assembly_cleanup_domain_bindings") +#pragma comment(linker, "/export:mono_assembly_close") +#pragma comment(linker, "/export:mono_assembly_close_except_image_pools") +#pragma comment(linker, "/export:mono_assembly_close_finish") +#pragma comment(linker, "/export:mono_assembly_fill_assembly_name") +#pragma comment(linker, "/export:mono_assembly_fill_assembly_name_full") +#pragma comment(linker, "/export:mono_assembly_foreach") +#pragma comment(linker, "/export:mono_assembly_get_assemblyref") +#pragma comment(linker, "/export:mono_assembly_get_assemblyref_checked") +#pragma comment(linker, "/export:mono_assembly_get_image") +#pragma comment(linker, "/export:mono_assembly_get_image_internal") +#pragma comment(linker, "/export:mono_assembly_get_main") +#pragma comment(linker, "/export:mono_assembly_get_name") +#pragma comment(linker, "/export:mono_assembly_get_name_internal") +#pragma comment(linker, "/export:mono_assembly_get_object") +#pragma comment(linker, "/export:mono_assembly_get_object_handle") +#pragma comment(linker, "/export:mono_assembly_getrootdir") +#pragma comment(linker, "/export:mono_assembly_has_reference_assembly_attribute") +#pragma comment(linker, "/export:mono_assembly_has_skip_verification") +#pragma comment(linker, "/export:mono_assembly_init_weak_fields") +#pragma comment(linker, "/export:mono_assembly_invoke_load_hook") +#pragma comment(linker, "/export:mono_assembly_invoke_search_hook") +#pragma comment(linker, "/export:mono_assembly_invoke_unload_hook") +#pragma comment(linker, "/export:mono_assembly_is_problematic_version") +#pragma comment(linker, "/export:mono_assembly_is_weak_field") +#pragma comment(linker, "/export:mono_assembly_load") +#pragma comment(linker, "/export:mono_assembly_load_corlib") +#pragma comment(linker, "/export:mono_assembly_load_friends") +#pragma comment(linker, "/export:mono_assembly_load_from") +#pragma comment(linker, "/export:mono_assembly_load_from_assemblies_path") +#pragma comment(linker, "/export:mono_assembly_load_from_full") +#pragma comment(linker, "/export:mono_assembly_load_from_predicate") +#pragma comment(linker, "/export:mono_assembly_load_full") +#pragma comment(linker, "/export:mono_assembly_load_full_nosearch") +#pragma comment(linker, "/export:mono_assembly_load_module") +#pragma comment(linker, "/export:mono_assembly_load_module_checked") +#pragma comment(linker, "/export:mono_assembly_load_reference") +#pragma comment(linker, "/export:mono_assembly_load_references") +#pragma comment(linker, "/export:mono_assembly_load_with_partial_name") +#pragma comment(linker, "/export:mono_assembly_load_with_partial_name_internal") +#pragma comment(linker, "/export:mono_assembly_loaded") +#pragma comment(linker, "/export:mono_assembly_loaded_full") +#pragma comment(linker, "/export:mono_assembly_metadata_foreach_custom_attr") +#pragma comment(linker, "/export:mono_assembly_name_free") +#pragma comment(linker, "/export:mono_assembly_name_free_internal") +#pragma comment(linker, "/export:mono_assembly_name_get_culture") +#pragma comment(linker, "/export:mono_assembly_name_get_name") +#pragma comment(linker, "/export:mono_assembly_name_get_pubkeytoken") +#pragma comment(linker, "/export:mono_assembly_name_get_version") +#pragma comment(linker, "/export:mono_assembly_name_new") +#pragma comment(linker, "/export:mono_assembly_name_parse") +#pragma comment(linker, "/export:mono_assembly_name_parse_full") +#pragma comment(linker, "/export:mono_assembly_names_equal") +#pragma comment(linker, "/export:mono_assembly_names_equal_flags") +#pragma comment(linker, "/export:mono_assembly_open") +#pragma comment(linker, "/export:mono_assembly_open_a_lot") +#pragma comment(linker, "/export:mono_assembly_open_from_bundle") +#pragma comment(linker, "/export:mono_assembly_open_full") +#pragma comment(linker, "/export:mono_assembly_open_predicate") +#pragma comment(linker, "/export:mono_assembly_release_gc_roots") +#pragma comment(linker, "/export:mono_assembly_set_main") +#pragma comment(linker, "/export:mono_assembly_setrootdir") +#pragma comment(linker, "/export:mono_class_alloc") +#pragma comment(linker, "/export:mono_class_alloc0") +#pragma comment(linker, "/export:mono_class_array_element_size") +#pragma comment(linker, "/export:mono_class_bind_generic_parameters") +#pragma comment(linker, "/export:mono_class_can_access_class") +#pragma comment(linker, "/export:mono_class_check_context_used") +#pragma comment(linker, "/export:mono_class_check_vtable_constraints") +#pragma comment(linker, "/export:mono_class_compute_bitmap") +#pragma comment(linker, "/export:mono_class_compute_gc_descriptor") +#pragma comment(linker, "/export:mono_class_contextbound_bit_offset") +#pragma comment(linker, "/export:mono_class_create_array") +#pragma comment(linker, "/export:mono_class_create_array_fill_type") +#pragma comment(linker, "/export:mono_class_create_bounded_array") +#pragma comment(linker, "/export:mono_class_create_fnptr") +#pragma comment(linker, "/export:mono_class_create_from_typedef") +#pragma comment(linker, "/export:mono_class_create_generic_inst") +#pragma comment(linker, "/export:mono_class_create_generic_parameter") +#pragma comment(linker, "/export:mono_class_create_ptr") +#pragma comment(linker, "/export:mono_class_data_size") +#pragma comment(linker, "/export:mono_class_describe_statics") +#pragma comment(linker, "/export:mono_class_enum_basetype") +#pragma comment(linker, "/export:mono_class_enum_basetype_internal") +#pragma comment(linker, "/export:mono_class_field_get_special_static_type") +#pragma comment(linker, "/export:mono_class_field_is_special_static") +#pragma comment(linker, "/export:mono_class_fill_runtime_generic_context") +#pragma comment(linker, "/export:mono_class_find_enum_basetype") +#pragma comment(linker, "/export:mono_class_free_ref_info") +#pragma comment(linker, "/export:mono_class_from_generic_parameter") +#pragma comment(linker, "/export:mono_class_from_mono_type") +#pragma comment(linker, "/export:mono_class_from_mono_type_handle") +#pragma comment(linker, "/export:mono_class_from_name") +#pragma comment(linker, "/export:mono_class_from_name_case") +#pragma comment(linker, "/export:mono_class_from_name_case_checked") +#pragma comment(linker, "/export:mono_class_from_name_checked") +#pragma comment(linker, "/export:mono_class_from_typeref") +#pragma comment(linker, "/export:mono_class_from_typeref_checked") +#pragma comment(linker, "/export:mono_class_full_name") +#pragma comment(linker, "/export:mono_class_generic_sharing_enabled") +#pragma comment(linker, "/export:mono_class_get") +#pragma comment(linker, "/export:mono_class_get_and_inflate_typespec_checked") +#pragma comment(linker, "/export:mono_class_get_appdomain_unloaded_exception_class") +#pragma comment(linker, "/export:mono_class_get_byref_type") +#pragma comment(linker, "/export:mono_class_get_cached_class_info") +#pragma comment(linker, "/export:mono_class_get_cctor") +#pragma comment(linker, "/export:mono_class_get_checked") +#pragma comment(linker, "/export:mono_class_get_com_object_class") +#pragma comment(linker, "/export:mono_class_get_context") +#pragma comment(linker, "/export:mono_class_get_declsec_flags") +#pragma comment(linker, "/export:mono_class_get_default_finalize_method") +#pragma comment(linker, "/export:mono_class_get_dim_conflicts") +#pragma comment(linker, "/export:mono_class_get_element_class") +#pragma comment(linker, "/export:mono_class_get_event_info") +#pragma comment(linker, "/export:mono_class_get_event_token") +#pragma comment(linker, "/export:mono_class_get_events") +#pragma comment(linker, "/export:mono_class_get_exception_data") +#pragma comment(linker, "/export:mono_class_get_exception_for_failure") +#pragma comment(linker, "/export:mono_class_get_field") +#pragma comment(linker, "/export:mono_class_get_field_count") +#pragma comment(linker, "/export:mono_class_get_field_def_values") +#pragma comment(linker, "/export:mono_class_get_field_default_value") +#pragma comment(linker, "/export:mono_class_get_field_from_name") +#pragma comment(linker, "/export:mono_class_get_field_from_name_full") +#pragma comment(linker, "/export:mono_class_get_field_token") +#pragma comment(linker, "/export:mono_class_get_fields") +#pragma comment(linker, "/export:mono_class_get_fields_internal") +#pragma comment(linker, "/export:mono_class_get_fields_lazy") +#pragma comment(linker, "/export:mono_class_get_finalizer") +#pragma comment(linker, "/export:mono_class_get_first_field_idx") +#pragma comment(linker, "/export:mono_class_get_first_method_idx") +#pragma comment(linker, "/export:mono_class_get_flags") +#pragma comment(linker, "/export:mono_class_get_full") +#pragma comment(linker, "/export:mono_class_get_generic_class") +#pragma comment(linker, "/export:mono_class_get_generic_container") +#pragma comment(linker, "/export:mono_class_get_generic_type_definition") +#pragma comment(linker, "/export:mono_class_get_idispatch_class") +#pragma comment(linker, "/export:mono_class_get_image") +#pragma comment(linker, "/export:mono_class_get_implemented_interfaces") +#pragma comment(linker, "/export:mono_class_get_inflated_method") +#pragma comment(linker, "/export:mono_class_get_interfaces") +#pragma comment(linker, "/export:mono_class_get_interop_proxy_class") +#pragma comment(linker, "/export:mono_class_get_iunknown_class") +#pragma comment(linker, "/export:mono_class_get_marshal_info") +#pragma comment(linker, "/export:mono_class_get_method_by_index") +#pragma comment(linker, "/export:mono_class_get_method_count") +#pragma comment(linker, "/export:mono_class_get_method_from_name") +#pragma comment(linker, "/export:mono_class_get_method_from_name_checked") +#pragma comment(linker, "/export:mono_class_get_method_from_name_flags") +#pragma comment(linker, "/export:mono_class_get_method_generic") +#pragma comment(linker, "/export:mono_class_get_methods") +#pragma comment(linker, "/export:mono_class_get_methods_by_name") +#pragma comment(linker, "/export:mono_class_get_name") +#pragma comment(linker, "/export:mono_class_get_namespace") +#pragma comment(linker, "/export:mono_class_get_nested_classes_property") +#pragma comment(linker, "/export:mono_class_get_nested_types") +#pragma comment(linker, "/export:mono_class_get_nesting_type") +#pragma comment(linker, "/export:mono_class_get_nullable_param") +#pragma comment(linker, "/export:mono_class_get_object_finalize_slot") +#pragma comment(linker, "/export:mono_class_get_overrides_full") +#pragma comment(linker, "/export:mono_class_get_parent") +#pragma comment(linker, "/export:mono_class_get_properties") +#pragma comment(linker, "/export:mono_class_get_property_default_value") +#pragma comment(linker, "/export:mono_class_get_property_from_name") +#pragma comment(linker, "/export:mono_class_get_property_info") +#pragma comment(linker, "/export:mono_class_get_property_token") +#pragma comment(linker, "/export:mono_class_get_rank") +#pragma comment(linker, "/export:mono_class_get_ref_info") +#pragma comment(linker, "/export:mono_class_get_ref_info_handle") +#pragma comment(linker, "/export:mono_class_get_ref_info_raw") +#pragma comment(linker, "/export:mono_class_get_type") +#pragma comment(linker, "/export:mono_class_get_type_token") +#pragma comment(linker, "/export:mono_class_get_valuetype_class") +#pragma comment(linker, "/export:mono_class_get_variant_class") +#pragma comment(linker, "/export:mono_class_get_virtual_method") +#pragma comment(linker, "/export:mono_class_get_vtable_entry") +#pragma comment(linker, "/export:mono_class_get_vtable_size") +#pragma comment(linker, "/export:mono_class_get_weak_bitmap") +#pragma comment(linker, "/export:mono_class_gtd_get_canonical_inst") +#pragma comment(linker, "/export:mono_class_has_dim_conflicts") +#pragma comment(linker, "/export:mono_class_has_failure") +#pragma comment(linker, "/export:mono_class_has_finalizer") +#pragma comment(linker, "/export:mono_class_has_ref_info") +#pragma comment(linker, "/export:mono_class_has_special_static_fields") +#pragma comment(linker, "/export:mono_class_has_variant_generic_params") +#pragma comment(linker, "/export:mono_class_implements_interface") +#pragma comment(linker, "/export:mono_class_inflate_generic_class_checked") +#pragma comment(linker, "/export:mono_class_inflate_generic_method") +#pragma comment(linker, "/export:mono_class_inflate_generic_method_checked") +#pragma comment(linker, "/export:mono_class_inflate_generic_method_full_checked") +#pragma comment(linker, "/export:mono_class_inflate_generic_type") +#pragma comment(linker, "/export:mono_class_inflate_generic_type_checked") +#pragma comment(linker, "/export:mono_class_inflate_generic_type_with_mempool") +#pragma comment(linker, "/export:mono_class_init") +#pragma comment(linker, "/export:mono_class_init_checked") +#pragma comment(linker, "/export:mono_class_init_sizes") +#pragma comment(linker, "/export:mono_class_instance_size") +#pragma comment(linker, "/export:mono_class_interface_offset") +#pragma comment(linker, "/export:mono_class_interface_offset_with_variance") +#pragma comment(linker, "/export:mono_class_is_assignable_from") +#pragma comment(linker, "/export:mono_class_is_assignable_from_checked") +#pragma comment(linker, "/export:mono_class_is_assignable_from_internal") +#pragma comment(linker, "/export:mono_class_is_assignable_from_slow") +#pragma comment(linker, "/export:mono_class_is_delegate") +#pragma comment(linker, "/export:mono_class_is_enum") +#pragma comment(linker, "/export:mono_class_is_from_assembly") +#pragma comment(linker, "/export:mono_class_is_magic_float") +#pragma comment(linker, "/export:mono_class_is_magic_int") +#pragma comment(linker, "/export:mono_class_is_nullable") +#pragma comment(linker, "/export:mono_class_is_open_constructed_type") +#pragma comment(linker, "/export:mono_class_is_reflection_method_or_constructor") +#pragma comment(linker, "/export:mono_class_is_subclass_of") +#pragma comment(linker, "/export:mono_class_is_valid_enum") +#pragma comment(linker, "/export:mono_class_is_valuetype") +#pragma comment(linker, "/export:mono_class_is_variant_compatible") +#pragma comment(linker, "/export:mono_class_layout_fields") +#pragma comment(linker, "/export:mono_class_load_from_name") +#pragma comment(linker, "/export:mono_class_min_align") +#pragma comment(linker, "/export:mono_class_name_from_token") +#pragma comment(linker, "/export:mono_class_native_size") +#pragma comment(linker, "/export:mono_class_needs_cctor_run") +#pragma comment(linker, "/export:mono_class_num_events") +#pragma comment(linker, "/export:mono_class_num_fields") +#pragma comment(linker, "/export:mono_class_num_methods") +#pragma comment(linker, "/export:mono_class_num_properties") +#pragma comment(linker, "/export:mono_class_publish_gc_descriptor") +#pragma comment(linker, "/export:mono_class_rgctx_get_array_size") +#pragma comment(linker, "/export:mono_class_set_declsec_flags") +#pragma comment(linker, "/export:mono_class_set_dim_conflicts") +#pragma comment(linker, "/export:mono_class_set_event_info") +#pragma comment(linker, "/export:mono_class_set_exception_data") +#pragma comment(linker, "/export:mono_class_set_failure") +#pragma comment(linker, "/export:mono_class_set_field_count") +#pragma comment(linker, "/export:mono_class_set_field_def_values") +#pragma comment(linker, "/export:mono_class_set_first_field_idx") +#pragma comment(linker, "/export:mono_class_set_first_method_idx") +#pragma comment(linker, "/export:mono_class_set_flags") +#pragma comment(linker, "/export:mono_class_set_generic_container") +#pragma comment(linker, "/export:mono_class_set_is_com_object") +#pragma comment(linker, "/export:mono_class_set_marshal_info") +#pragma comment(linker, "/export:mono_class_set_method_count") +#pragma comment(linker, "/export:mono_class_set_nested_classes_property") +#pragma comment(linker, "/export:mono_class_set_nonblittable") +#pragma comment(linker, "/export:mono_class_set_property_info") +#pragma comment(linker, "/export:mono_class_set_ref_info") +#pragma comment(linker, "/export:mono_class_set_ref_info_handle") +#pragma comment(linker, "/export:mono_class_set_type_load_failure") +#pragma comment(linker, "/export:mono_class_set_type_load_failure_causedby_class") +#pragma comment(linker, "/export:mono_class_set_weak_bitmap") +#pragma comment(linker, "/export:mono_class_setup_basic_field_info") +#pragma comment(linker, "/export:mono_class_setup_events") +#pragma comment(linker, "/export:mono_class_setup_fields") +#pragma comment(linker, "/export:mono_class_setup_has_finalizer") +#pragma comment(linker, "/export:mono_class_setup_interface_id") +#pragma comment(linker, "/export:mono_class_setup_interface_offsets") +#pragma comment(linker, "/export:mono_class_setup_interfaces") +#pragma comment(linker, "/export:mono_class_setup_methods") +#pragma comment(linker, "/export:mono_class_setup_mono_type") +#pragma comment(linker, "/export:mono_class_setup_nested_types") +#pragma comment(linker, "/export:mono_class_setup_parent") +#pragma comment(linker, "/export:mono_class_setup_properties") +#pragma comment(linker, "/export:mono_class_setup_runtime_info") +#pragma comment(linker, "/export:mono_class_setup_supertypes") +#pragma comment(linker, "/export:mono_class_setup_vtable") +#pragma comment(linker, "/export:mono_class_setup_vtable_general") +#pragma comment(linker, "/export:mono_class_static_field_address") +#pragma comment(linker, "/export:mono_class_try_get_com_object_class") +#pragma comment(linker, "/export:mono_class_try_get_generic_class") +#pragma comment(linker, "/export:mono_class_try_get_generic_container") +#pragma comment(linker, "/export:mono_class_try_get_safehandle_class") +#pragma comment(linker, "/export:mono_class_try_get_vtable") +#pragma comment(linker, "/export:mono_class_try_load_from_name") +#pragma comment(linker, "/export:mono_class_value_size") +#pragma comment(linker, "/export:mono_class_vtable") +#pragma comment(linker, "/export:mono_class_vtable_checked") +#pragma comment(linker, "/export:mono_custom_attrs_construct") +#pragma comment(linker, "/export:mono_custom_attrs_free") +#pragma comment(linker, "/export:mono_custom_attrs_from_assembly") +#pragma comment(linker, "/export:mono_custom_attrs_from_assembly_checked") +#pragma comment(linker, "/export:mono_custom_attrs_from_builders") +#pragma comment(linker, "/export:mono_custom_attrs_from_class") +#pragma comment(linker, "/export:mono_custom_attrs_from_class_checked") +#pragma comment(linker, "/export:mono_custom_attrs_from_event") +#pragma comment(linker, "/export:mono_custom_attrs_from_event_checked") +#pragma comment(linker, "/export:mono_custom_attrs_from_field") +#pragma comment(linker, "/export:mono_custom_attrs_from_field_checked") +#pragma comment(linker, "/export:mono_custom_attrs_from_index") +#pragma comment(linker, "/export:mono_custom_attrs_from_index_checked") +#pragma comment(linker, "/export:mono_custom_attrs_from_method") +#pragma comment(linker, "/export:mono_custom_attrs_from_method_checked") +#pragma comment(linker, "/export:mono_custom_attrs_from_param") +#pragma comment(linker, "/export:mono_custom_attrs_from_param_checked") +#pragma comment(linker, "/export:mono_custom_attrs_from_property") +#pragma comment(linker, "/export:mono_custom_attrs_from_property_checked") +#pragma comment(linker, "/export:mono_custom_attrs_get_attr") +#pragma comment(linker, "/export:mono_custom_attrs_get_attr_checked") +#pragma comment(linker, "/export:mono_custom_attrs_has_attr") +#pragma comment(linker, "/export:mono_debug_add_aot_method") +#pragma comment(linker, "/export:mono_debug_add_delegate_trampoline") +#pragma comment(linker, "/export:mono_debug_add_method") +#pragma comment(linker, "/export:mono_debug_cleanup") +#pragma comment(linker, "/export:mono_debug_close_image") +#pragma comment(linker, "/export:mono_debug_close_method") +#pragma comment(linker, "/export:mono_debug_close_mono_symbol_file") +#pragma comment(linker, "/export:mono_debug_count") +#pragma comment(linker, "/export:mono_debug_domain_create") +#pragma comment(linker, "/export:mono_debug_domain_unload") +#pragma comment(linker, "/export:mono_debug_enabled") +#pragma comment(linker, "/export:mono_debug_find_method") +#pragma comment(linker, "/export:mono_debug_free_locals") +#pragma comment(linker, "/export:mono_debug_free_method") +#pragma comment(linker, "/export:mono_debug_free_method_async_debug_info") +#pragma comment(linker, "/export:mono_debug_free_method_jit_info") +#pragma comment(linker, "/export:mono_debug_free_source_location") +#pragma comment(linker, "/export:mono_debug_get_handle") +#pragma comment(linker, "/export:mono_debug_get_seq_points") +#pragma comment(linker, "/export:mono_debug_il_offset_from_address") +#pragma comment(linker, "/export:mono_debug_image_has_debug_info") +#pragma comment(linker, "/export:mono_debug_init") +#pragma comment(linker, "/export:mono_debug_init_method") +#pragma comment(linker, "/export:mono_debug_lookup_locals") +#pragma comment(linker, "/export:mono_debug_lookup_method") +#pragma comment(linker, "/export:mono_debug_lookup_method_addresses") +#pragma comment(linker, "/export:mono_debug_lookup_method_async_debug_info") +#pragma comment(linker, "/export:mono_debug_lookup_source_location") +#pragma comment(linker, "/export:mono_debug_lookup_source_location_by_il") +#pragma comment(linker, "/export:mono_debug_method_lookup_location") +#pragma comment(linker, "/export:mono_debug_open_block") +#pragma comment(linker, "/export:mono_debug_open_method") +#pragma comment(linker, "/export:mono_debug_open_mono_symbols") +#pragma comment(linker, "/export:mono_debug_personality") +#pragma comment(linker, "/export:mono_debug_print_stack_frame") +#pragma comment(linker, "/export:mono_debug_print_vars") +#pragma comment(linker, "/export:mono_debug_record_line_number") +#pragma comment(linker, "/export:mono_debug_remove_method") +#pragma comment(linker, "/export:mono_debug_serialize_debug_info") +#pragma comment(linker, "/export:mono_debug_symfile_free_location") +#pragma comment(linker, "/export:mono_debug_symfile_get_seq_points") +#pragma comment(linker, "/export:mono_debug_symfile_is_loaded") +#pragma comment(linker, "/export:mono_debug_symfile_lookup_locals") +#pragma comment(linker, "/export:mono_debug_symfile_lookup_location") +#pragma comment(linker, "/export:mono_debug_symfile_lookup_method") +#pragma comment(linker, "/export:mono_domain_alloc") +#pragma comment(linker, "/export:mono_domain_alloc0") +#pragma comment(linker, "/export:mono_domain_alloc0_lock_free") +#pragma comment(linker, "/export:mono_domain_assembly_open") +#pragma comment(linker, "/export:mono_domain_assembly_open_internal") +#pragma comment(linker, "/export:mono_domain_assembly_postload_search") +#pragma comment(linker, "/export:mono_domain_code_commit") +#pragma comment(linker, "/export:mono_domain_code_foreach") +#pragma comment(linker, "/export:mono_domain_code_reserve") +#pragma comment(linker, "/export:mono_domain_code_reserve_align") +#pragma comment(linker, "/export:mono_domain_create") +#pragma comment(linker, "/export:mono_domain_create_appdomain") +#pragma comment(linker, "/export:mono_domain_finalize") +#pragma comment(linker, "/export:mono_domain_foreach") +#pragma comment(linker, "/export:mono_domain_free") +#pragma comment(linker, "/export:mono_domain_from_appdomain") +#pragma comment(linker, "/export:mono_domain_get") +#pragma comment(linker, "/export:mono_domain_get_assemblies") +#pragma comment(linker, "/export:mono_domain_get_by_id") +#pragma comment(linker, "/export:mono_domain_get_friendly_name") +#pragma comment(linker, "/export:mono_domain_get_id") +#pragma comment(linker, "/export:mono_domain_has_type_resolve") +#pragma comment(linker, "/export:mono_domain_is_unloading") +#pragma comment(linker, "/export:mono_domain_lock") +#pragma comment(linker, "/export:mono_domain_owns_vtable_slot") +#pragma comment(linker, "/export:mono_domain_parse_assembly_bindings") +#pragma comment(linker, "/export:mono_domain_set") +#pragma comment(linker, "/export:mono_domain_set_config") +#pragma comment(linker, "/export:mono_domain_set_config_checked") +#pragma comment(linker, "/export:mono_domain_set_internal") +#pragma comment(linker, "/export:mono_domain_set_internal_with_options") +#pragma comment(linker, "/export:mono_domain_set_options_from_config") +#pragma comment(linker, "/export:mono_domain_try_type_resolve") +#pragma comment(linker, "/export:mono_domain_try_type_resolve_name") +#pragma comment(linker, "/export:mono_domain_try_type_resolve_typebuilder") +#pragma comment(linker, "/export:mono_domain_try_unload") +#pragma comment(linker, "/export:mono_domain_unload") +#pragma comment(linker, "/export:mono_domain_unlock") +#pragma comment(linker, "/export:mono_domain_unset") +#pragma comment(linker, "/export:mono_exception_from_name") +#pragma comment(linker, "/export:mono_exception_from_name_domain") +#pragma comment(linker, "/export:mono_exception_from_name_msg") +#pragma comment(linker, "/export:mono_exception_from_name_two_strings") +#pragma comment(linker, "/export:mono_exception_from_name_two_strings_checked") +#pragma comment(linker, "/export:mono_exception_from_token") +#pragma comment(linker, "/export:mono_exception_from_token_two_strings") +#pragma comment(linker, "/export:mono_exception_from_token_two_strings_checked") +#pragma comment(linker, "/export:mono_exception_get_managed_backtrace") +#pragma comment(linker, "/export:mono_exception_handle_get_native_backtrace") +#pragma comment(linker, "/export:mono_exception_new_argument") +#pragma comment(linker, "/export:mono_exception_new_argument_null") +#pragma comment(linker, "/export:mono_exception_new_by_name_msg") +#pragma comment(linker, "/export:mono_exception_new_invalid_operation") +#pragma comment(linker, "/export:mono_exception_new_serialization") +#pragma comment(linker, "/export:mono_exception_new_thread_abort") +#pragma comment(linker, "/export:mono_exception_new_thread_interrupted") +#pragma comment(linker, "/export:mono_exception_walk_trace") +#pragma comment(linker, "/export:mono_field_from_token") +#pragma comment(linker, "/export:mono_field_from_token_checked") +#pragma comment(linker, "/export:mono_field_full_name") +#pragma comment(linker, "/export:mono_field_get_data") +#pragma comment(linker, "/export:mono_field_get_flags") +#pragma comment(linker, "/export:mono_field_get_name") +#pragma comment(linker, "/export:mono_field_get_object") +#pragma comment(linker, "/export:mono_field_get_object_checked") +#pragma comment(linker, "/export:mono_field_get_object_handle") +#pragma comment(linker, "/export:mono_field_get_offset") +#pragma comment(linker, "/export:mono_field_get_parent") +#pragma comment(linker, "/export:mono_field_get_type") +#pragma comment(linker, "/export:mono_field_get_type_checked") +#pragma comment(linker, "/export:mono_field_get_value") +#pragma comment(linker, "/export:mono_field_get_value_internal") +#pragma comment(linker, "/export:mono_field_get_value_object") +#pragma comment(linker, "/export:mono_field_get_value_object_checked") +#pragma comment(linker, "/export:mono_field_resolve_type") +#pragma comment(linker, "/export:mono_field_set_value") +#pragma comment(linker, "/export:mono_field_static_get_value") +#pragma comment(linker, "/export:mono_field_static_get_value_checked") +#pragma comment(linker, "/export:mono_field_static_get_value_for_thread") +#pragma comment(linker, "/export:mono_field_static_set_value") +#pragma comment(linker, "/export:mono_free") +#pragma comment(linker, "/export:mono_free_address_info") +#pragma comment(linker, "/export:mono_free_altstack") +#pragma comment(linker, "/export:mono_free_bstr") +#pragma comment(linker, "/export:mono_free_loop_info") +#pragma comment(linker, "/export:mono_free_lparray") +#pragma comment(linker, "/export:mono_free_method") +#pragma comment(linker, "/export:mono_free_verify_list") +#pragma comment(linker, "/export:mono_gc_add_memory_pressure") +#pragma comment(linker, "/export:mono_gc_alloc_array") +#pragma comment(linker, "/export:mono_gc_alloc_fixed") +#pragma comment(linker, "/export:mono_gc_alloc_fixed_no_descriptor") +#pragma comment(linker, "/export:mono_gc_alloc_handle_array") +#pragma comment(linker, "/export:mono_gc_alloc_handle_mature") +#pragma comment(linker, "/export:mono_gc_alloc_handle_obj") +#pragma comment(linker, "/export:mono_gc_alloc_handle_pinned_obj") +#pragma comment(linker, "/export:mono_gc_alloc_handle_string") +#pragma comment(linker, "/export:mono_gc_alloc_handle_vector") +#pragma comment(linker, "/export:mono_gc_alloc_mature") +#pragma comment(linker, "/export:mono_gc_alloc_obj") +#pragma comment(linker, "/export:mono_gc_alloc_pinned_obj") +#pragma comment(linker, "/export:mono_gc_alloc_string") +#pragma comment(linker, "/export:mono_gc_alloc_vector") +#pragma comment(linker, "/export:mono_gc_base_cleanup") +#pragma comment(linker, "/export:mono_gc_base_init") +#pragma comment(linker, "/export:mono_gc_bzero_aligned") +#pragma comment(linker, "/export:mono_gc_bzero_atomic") +#pragma comment(linker, "/export:mono_gc_card_table_nursery_check") +#pragma comment(linker, "/export:mono_gc_cleanup") +#pragma comment(linker, "/export:mono_gc_clear_assembly") +#pragma comment(linker, "/export:mono_gc_clear_domain") +#pragma comment(linker, "/export:mono_gc_collect") +#pragma comment(linker, "/export:mono_gc_collection_count") +#pragma comment(linker, "/export:mono_gc_conservatively_scan_area") +#pragma comment(linker, "/export:mono_gc_debug_set") +#pragma comment(linker, "/export:mono_gc_deregister_root") +#pragma comment(linker, "/export:mono_gc_dllmain") +#pragma comment(linker, "/export:mono_gc_ephemeron_array_add") +#pragma comment(linker, "/export:mono_gc_finalize_assembly") +#pragma comment(linker, "/export:mono_gc_finalize_domain") +#pragma comment(linker, "/export:mono_gc_finalize_notify") +#pragma comment(linker, "/export:mono_gc_free_fixed") +#pragma comment(linker, "/export:mono_gc_get_aligned_size_for_allocator") +#pragma comment(linker, "/export:mono_gc_get_bitmap_for_descr") +#pragma comment(linker, "/export:mono_gc_get_card_table") +#pragma comment(linker, "/export:mono_gc_get_description") +#pragma comment(linker, "/export:mono_gc_get_gc_callbacks") +#pragma comment(linker, "/export:mono_gc_get_gc_name") +#pragma comment(linker, "/export:mono_gc_get_generation") +#pragma comment(linker, "/export:mono_gc_get_heap_size") +#pragma comment(linker, "/export:mono_gc_get_logfile") +#pragma comment(linker, "/export:mono_gc_get_los_limit") +#pragma comment(linker, "/export:mono_gc_get_managed_allocator") +#pragma comment(linker, "/export:mono_gc_get_managed_allocator_by_type") +#pragma comment(linker, "/export:mono_gc_get_managed_allocator_types") +#pragma comment(linker, "/export:mono_gc_get_managed_array_allocator") +#pragma comment(linker, "/export:mono_gc_get_nursery") +#pragma comment(linker, "/export:mono_gc_get_range_copy_func") +#pragma comment(linker, "/export:mono_gc_get_restart_signal") +#pragma comment(linker, "/export:mono_gc_get_specific_write_barrier") +#pragma comment(linker, "/export:mono_gc_get_suspend_signal") +#pragma comment(linker, "/export:mono_gc_get_target_card_table") +#pragma comment(linker, "/export:mono_gc_get_used_size") +#pragma comment(linker, "/export:mono_gc_get_vtable") +#pragma comment(linker, "/export:mono_gc_get_vtable_bits") +#pragma comment(linker, "/export:mono_gc_get_write_barrier") +#pragma comment(linker, "/export:mono_gc_init") +#pragma comment(linker, "/export:mono_gc_invoke_finalizers") +#pragma comment(linker, "/export:mono_gc_invoke_with_gc_lock") +#pragma comment(linker, "/export:mono_gc_is_critical_method") +#pragma comment(linker, "/export:mono_gc_is_disabled") +#pragma comment(linker, "/export:mono_gc_is_finalizer_internal_thread") +#pragma comment(linker, "/export:mono_gc_is_finalizer_thread") +#pragma comment(linker, "/export:mono_gc_is_gc_thread") +#pragma comment(linker, "/export:mono_gc_is_moving") +#pragma comment(linker, "/export:mono_gc_is_null") +#pragma comment(linker, "/export:mono_gc_make_descr_for_array") +#pragma comment(linker, "/export:mono_gc_make_descr_for_object") +#pragma comment(linker, "/export:mono_gc_make_descr_for_string") +#pragma comment(linker, "/export:mono_gc_make_descr_from_bitmap") +#pragma comment(linker, "/export:mono_gc_make_root_descr_all_refs") +#pragma comment(linker, "/export:mono_gc_make_root_descr_user") +#pragma comment(linker, "/export:mono_gc_make_vector_descr") +#pragma comment(linker, "/export:mono_gc_max_generation") +#pragma comment(linker, "/export:mono_gc_memmove_aligned") +#pragma comment(linker, "/export:mono_gc_memmove_atomic") +#pragma comment(linker, "/export:mono_gc_params_set") +#pragma comment(linker, "/export:mono_gc_parse_environment_string_extract_number") +#pragma comment(linker, "/export:mono_gc_pending_finalizers") +#pragma comment(linker, "/export:mono_gc_precise_stack_mark_enabled") +#pragma comment(linker, "/export:mono_gc_reference_queue_add") +#pragma comment(linker, "/export:mono_gc_reference_queue_foreach_remove") +#pragma comment(linker, "/export:mono_gc_reference_queue_foreach_remove2") +#pragma comment(linker, "/export:mono_gc_reference_queue_free") +#pragma comment(linker, "/export:mono_gc_reference_queue_new") +#pragma comment(linker, "/export:mono_gc_register_altstack") +#pragma comment(linker, "/export:mono_gc_register_bridge_callbacks") +#pragma comment(linker, "/export:mono_gc_register_finalizer_callbacks") +#pragma comment(linker, "/export:mono_gc_register_for_finalization") +#pragma comment(linker, "/export:mono_gc_register_obj_with_weak_fields") +#pragma comment(linker, "/export:mono_gc_register_object_with_weak_fields") +#pragma comment(linker, "/export:mono_gc_register_root") +#pragma comment(linker, "/export:mono_gc_register_root_wbarrier") +#pragma comment(linker, "/export:mono_gc_run_finalize") +#pragma comment(linker, "/export:mono_gc_scan_for_specific_ref") +#pragma comment(linker, "/export:mono_gc_scan_object") +#pragma comment(linker, "/export:mono_gc_set_desktop_mode") +#pragma comment(linker, "/export:mono_gc_set_gc_callbacks") +#pragma comment(linker, "/export:mono_gc_set_stack_end") +#pragma comment(linker, "/export:mono_gc_set_string_length") +#pragma comment(linker, "/export:mono_gc_skip_thread_changed") +#pragma comment(linker, "/export:mono_gc_skip_thread_changing") +#pragma comment(linker, "/export:mono_gc_stats") +#pragma comment(linker, "/export:mono_gc_suspend_finalizers") +#pragma comment(linker, "/export:mono_gc_thread_attach") +#pragma comment(linker, "/export:mono_gc_thread_detach_with_lock") +#pragma comment(linker, "/export:mono_gc_thread_in_critical_region") +#pragma comment(linker, "/export:mono_gc_toggleref_add") +#pragma comment(linker, "/export:mono_gc_toggleref_register_callback") +#pragma comment(linker, "/export:mono_gc_user_markers_supported") +#pragma comment(linker, "/export:mono_gc_wait_for_bridge_processing") +#pragma comment(linker, "/export:mono_gc_walk_heap") +#pragma comment(linker, "/export:mono_gc_wbarrier_arrayref_copy") +#pragma comment(linker, "/export:mono_gc_wbarrier_generic_nostore") +#pragma comment(linker, "/export:mono_gc_wbarrier_generic_store") +#pragma comment(linker, "/export:mono_gc_wbarrier_generic_store_atomic") +#pragma comment(linker, "/export:mono_gc_wbarrier_object_copy") +#pragma comment(linker, "/export:mono_gc_wbarrier_object_copy_handle") +#pragma comment(linker, "/export:mono_gc_wbarrier_range_copy") +#pragma comment(linker, "/export:mono_gc_wbarrier_set_arrayref") +#pragma comment(linker, "/export:mono_gc_wbarrier_set_field") +#pragma comment(linker, "/export:mono_gc_wbarrier_value_copy") +#pragma comment(linker, "/export:mono_gchandle_free") +#pragma comment(linker, "/export:mono_gchandle_free_domain") +#pragma comment(linker, "/export:mono_gchandle_from_handle") +#pragma comment(linker, "/export:mono_gchandle_get_target") +#pragma comment(linker, "/export:mono_gchandle_get_target_handle") +#pragma comment(linker, "/export:mono_gchandle_is_in_domain") +#pragma comment(linker, "/export:mono_gchandle_new") +#pragma comment(linker, "/export:mono_gchandle_new_weakref") +#pragma comment(linker, "/export:mono_gchandle_set_target") +#pragma comment(linker, "/export:mono_gchandle_set_target_handle") +#pragma comment(linker, "/export:mono_get_addr_from_ftnptr") +#pragma comment(linker, "/export:mono_get_address_info") +#pragma comment(linker, "/export:mono_get_anonymous_container_for_image") +#pragma comment(linker, "/export:mono_get_aot_cache_config") +#pragma comment(linker, "/export:mono_get_array_class") +#pragma comment(linker, "/export:mono_get_assembly_object") +#pragma comment(linker, "/export:mono_get_boolean_class") +#pragma comment(linker, "/export:mono_get_byte_class") +#pragma comment(linker, "/export:mono_get_cached_unwind_info") +#pragma comment(linker, "/export:mono_get_call_filter") +#pragma comment(linker, "/export:mono_get_char_class") +#pragma comment(linker, "/export:mono_get_config_dir") +#pragma comment(linker, "/export:mono_get_constant_value_from_blob") +#pragma comment(linker, "/export:mono_get_context_capture_method") +#pragma comment(linker, "/export:mono_get_corlib") +#pragma comment(linker, "/export:mono_get_dbnull_object") +#pragma comment(linker, "/export:mono_get_delegate_begin_invoke") +#pragma comment(linker, "/export:mono_get_delegate_begin_invoke_checked") +#pragma comment(linker, "/export:mono_get_delegate_end_invoke") +#pragma comment(linker, "/export:mono_get_delegate_end_invoke_checked") +#pragma comment(linker, "/export:mono_get_delegate_invoke") +#pragma comment(linker, "/export:mono_get_delegate_invoke_checked") +#pragma comment(linker, "/export:mono_get_delegate_virtual_invoke_impl") +#pragma comment(linker, "/export:mono_get_delegate_virtual_invoke_impl_name") +#pragma comment(linker, "/export:mono_get_double_class") +#pragma comment(linker, "/export:mono_get_eh_callbacks") +#pragma comment(linker, "/export:mono_get_enum_class") +#pragma comment(linker, "/export:mono_get_exception_appdomain_unloaded") +#pragma comment(linker, "/export:mono_get_exception_argument") +#pragma comment(linker, "/export:mono_get_exception_argument_null") +#pragma comment(linker, "/export:mono_get_exception_argument_out_of_range") +#pragma comment(linker, "/export:mono_get_exception_arithmetic") +#pragma comment(linker, "/export:mono_get_exception_array_type_mismatch") +#pragma comment(linker, "/export:mono_get_exception_bad_image_format") +#pragma comment(linker, "/export:mono_get_exception_bad_image_format2") +#pragma comment(linker, "/export:mono_get_exception_cannot_unload_appdomain") +#pragma comment(linker, "/export:mono_get_exception_class") +#pragma comment(linker, "/export:mono_get_exception_divide_by_zero") +#pragma comment(linker, "/export:mono_get_exception_execution_engine") +#pragma comment(linker, "/export:mono_get_exception_field_access") +#pragma comment(linker, "/export:mono_get_exception_field_access_msg") +#pragma comment(linker, "/export:mono_get_exception_file_not_found") +#pragma comment(linker, "/export:mono_get_exception_file_not_found2") +#pragma comment(linker, "/export:mono_get_exception_index_out_of_range") +#pragma comment(linker, "/export:mono_get_exception_invalid_cast") +#pragma comment(linker, "/export:mono_get_exception_invalid_operation") +#pragma comment(linker, "/export:mono_get_exception_io") +#pragma comment(linker, "/export:mono_get_exception_method_access") +#pragma comment(linker, "/export:mono_get_exception_method_access_msg") +#pragma comment(linker, "/export:mono_get_exception_missing_field") +#pragma comment(linker, "/export:mono_get_exception_missing_method") +#pragma comment(linker, "/export:mono_get_exception_not_implemented") +#pragma comment(linker, "/export:mono_get_exception_not_supported") +#pragma comment(linker, "/export:mono_get_exception_null_reference") +#pragma comment(linker, "/export:mono_get_exception_out_of_memory") +#pragma comment(linker, "/export:mono_get_exception_out_of_memory_handle") +#pragma comment(linker, "/export:mono_get_exception_overflow") +#pragma comment(linker, "/export:mono_get_exception_reflection_type_load") +#pragma comment(linker, "/export:mono_get_exception_reflection_type_load_checked") +#pragma comment(linker, "/export:mono_get_exception_runtime_wrapped") +#pragma comment(linker, "/export:mono_get_exception_runtime_wrapped_handle") +#pragma comment(linker, "/export:mono_get_exception_security") +#pragma comment(linker, "/export:mono_get_exception_serialization") +#pragma comment(linker, "/export:mono_get_exception_stack_overflow") +#pragma comment(linker, "/export:mono_get_exception_synchronization_lock") +#pragma comment(linker, "/export:mono_get_exception_thread_abort") +#pragma comment(linker, "/export:mono_get_exception_thread_interrupted") +#pragma comment(linker, "/export:mono_get_exception_thread_state") +#pragma comment(linker, "/export:mono_get_exception_type_initialization") +#pragma comment(linker, "/export:mono_get_exception_type_initialization_handle") +#pragma comment(linker, "/export:mono_get_exception_type_load") +#pragma comment(linker, "/export:mono_get_generic_trampoline_name") +#pragma comment(linker, "/export:mono_get_generic_trampoline_simple_name") +#pragma comment(linker, "/export:mono_get_hazardous_pointer") +#pragma comment(linker, "/export:mono_get_image_for_generic_param") +#pragma comment(linker, "/export:mono_get_inflated_method") +#pragma comment(linker, "/export:mono_get_int16_class") +#pragma comment(linker, "/export:mono_get_int32_class") +#pragma comment(linker, "/export:mono_get_int64_class") +#pragma comment(linker, "/export:mono_get_intptr_class") +#pragma comment(linker, "/export:mono_get_jit_icall_info") +#pragma comment(linker, "/export:mono_get_lmf") +#pragma comment(linker, "/export:mono_get_local_interfaces") +#pragma comment(linker, "/export:mono_get_machine_config") +#pragma comment(linker, "/export:mono_get_method") +#pragma comment(linker, "/export:mono_get_method_checked") +#pragma comment(linker, "/export:mono_get_method_constrained") +#pragma comment(linker, "/export:mono_get_method_constrained_checked") +#pragma comment(linker, "/export:mono_get_method_constrained_with_method") +#pragma comment(linker, "/export:mono_get_method_from_ip") +#pragma comment(linker, "/export:mono_get_method_full") +#pragma comment(linker, "/export:mono_get_method_object") +#pragma comment(linker, "/export:mono_get_module_file_name") +#pragma comment(linker, "/export:mono_get_native_calli_wrapper") +#pragma comment(linker, "/export:mono_get_object_class") +#pragma comment(linker, "/export:mono_get_object_from_blob") +#pragma comment(linker, "/export:mono_get_optimizations_for_method") +#pragma comment(linker, "/export:mono_get_restore_context") +#pragma comment(linker, "/export:mono_get_rethrow_exception") +#pragma comment(linker, "/export:mono_get_rgctx_fetch_trampoline_name") +#pragma comment(linker, "/export:mono_get_root_domain") +#pragma comment(linker, "/export:mono_get_runtime_build_info") +#pragma comment(linker, "/export:mono_get_runtime_callbacks") +#pragma comment(linker, "/export:mono_get_runtime_info") +#pragma comment(linker, "/export:mono_get_sbyte_class") +#pragma comment(linker, "/export:mono_get_seq_points") +#pragma comment(linker, "/export:mono_get_shared_generic_inst") +#pragma comment(linker, "/export:mono_get_single_class") +#pragma comment(linker, "/export:mono_get_special_static_data") +#pragma comment(linker, "/export:mono_get_special_static_data_for_thread") +#pragma comment(linker, "/export:mono_get_string_class") +#pragma comment(linker, "/export:mono_get_thread_class") +#pragma comment(linker, "/export:mono_get_throw_corlib_exception") +#pragma comment(linker, "/export:mono_get_throw_exception") +#pragma comment(linker, "/export:mono_get_throw_exception_addr") +#pragma comment(linker, "/export:mono_get_trampoline_code") +#pragma comment(linker, "/export:mono_get_trampoline_func") +#pragma comment(linker, "/export:mono_get_uint16_class") +#pragma comment(linker, "/export:mono_get_uint32_class") +#pragma comment(linker, "/export:mono_get_uint64_class") +#pragma comment(linker, "/export:mono_get_uintptr_class") +#pragma comment(linker, "/export:mono_get_void_class") +#pragma comment(linker, "/export:mono_image_add_to_name_cache") +#pragma comment(linker, "/export:mono_image_addref") +#pragma comment(linker, "/export:mono_image_alloc") +#pragma comment(linker, "/export:mono_image_alloc0") +#pragma comment(linker, "/export:mono_image_append_class_to_reflection_info_set") +#pragma comment(linker, "/export:mono_image_build_metadata") +#pragma comment(linker, "/export:mono_image_check_for_module_cctor") +#pragma comment(linker, "/export:mono_image_close") +#pragma comment(linker, "/export:mono_image_close_except_pools") +#pragma comment(linker, "/export:mono_image_close_finish") +#pragma comment(linker, "/export:mono_image_create_pefile") +#pragma comment(linker, "/export:mono_image_create_token") +#pragma comment(linker, "/export:mono_image_ensure_section") +#pragma comment(linker, "/export:mono_image_ensure_section_idx") +#pragma comment(linker, "/export:mono_image_fixup_vtable") +#pragma comment(linker, "/export:mono_image_g_malloc0") +#pragma comment(linker, "/export:mono_image_get_assembly") +#pragma comment(linker, "/export:mono_image_get_entry_point") +#pragma comment(linker, "/export:mono_image_get_filename") +#pragma comment(linker, "/export:mono_image_get_guid") +#pragma comment(linker, "/export:mono_image_get_methodref_token") +#pragma comment(linker, "/export:mono_image_get_name") +#pragma comment(linker, "/export:mono_image_get_public_key") +#pragma comment(linker, "/export:mono_image_get_resource") +#pragma comment(linker, "/export:mono_image_get_strong_name") +#pragma comment(linker, "/export:mono_image_get_table_info") +#pragma comment(linker, "/export:mono_image_get_table_rows") +#pragma comment(linker, "/export:mono_image_has_authenticode_entry") +#pragma comment(linker, "/export:mono_image_init") +#pragma comment(linker, "/export:mono_image_init_name_cache") +#pragma comment(linker, "/export:mono_image_insert_string") +#pragma comment(linker, "/export:mono_image_is_dynamic") +#pragma comment(linker, "/export:mono_image_load_cli_data") +#pragma comment(linker, "/export:mono_image_load_cli_header") +#pragma comment(linker, "/export:mono_image_load_file_for_image") +#pragma comment(linker, "/export:mono_image_load_file_for_image_checked") +#pragma comment(linker, "/export:mono_image_load_metadata") +#pragma comment(linker, "/export:mono_image_load_module") +#pragma comment(linker, "/export:mono_image_load_module_checked") +#pragma comment(linker, "/export:mono_image_load_names") +#pragma comment(linker, "/export:mono_image_load_pe_data") +#pragma comment(linker, "/export:mono_image_loaded") +#pragma comment(linker, "/export:mono_image_loaded_by_guid") +#pragma comment(linker, "/export:mono_image_loaded_by_guid_full") +#pragma comment(linker, "/export:mono_image_loaded_full") +#pragma comment(linker, "/export:mono_image_loaded_internal") +#pragma comment(linker, "/export:mono_image_lock") +#pragma comment(linker, "/export:mono_image_lookup_resource") +#pragma comment(linker, "/export:mono_image_open") +#pragma comment(linker, "/export:mono_image_open_a_lot") +#pragma comment(linker, "/export:mono_image_open_from_data") +#pragma comment(linker, "/export:mono_image_open_from_data_full") +#pragma comment(linker, "/export:mono_image_open_from_data_internal") +#pragma comment(linker, "/export:mono_image_open_from_data_with_name") +#pragma comment(linker, "/export:mono_image_open_from_module_handle") +#pragma comment(linker, "/export:mono_image_open_full") +#pragma comment(linker, "/export:mono_image_open_metadata_only") +#pragma comment(linker, "/export:mono_image_open_raw") +#pragma comment(linker, "/export:mono_image_property_insert") +#pragma comment(linker, "/export:mono_image_property_lookup") +#pragma comment(linker, "/export:mono_image_property_remove") +#pragma comment(linker, "/export:mono_image_rva_map") +#pragma comment(linker, "/export:mono_image_set_alloc") +#pragma comment(linker, "/export:mono_image_set_alloc0") +#pragma comment(linker, "/export:mono_image_set_description") +#pragma comment(linker, "/export:mono_image_set_lock") +#pragma comment(linker, "/export:mono_image_set_strdup") +#pragma comment(linker, "/export:mono_image_set_unlock") +#pragma comment(linker, "/export:mono_image_strdup") +#pragma comment(linker, "/export:mono_image_strdup_printf") +#pragma comment(linker, "/export:mono_image_strdup_vprintf") +#pragma comment(linker, "/export:mono_image_strerror") +#pragma comment(linker, "/export:mono_image_strong_name_position") +#pragma comment(linker, "/export:mono_image_unlock") +#pragma comment(linker, "/export:mono_metadata_blob_heap") +#pragma comment(linker, "/export:mono_metadata_blob_heap_checked") +#pragma comment(linker, "/export:mono_metadata_clean_for_image") +#pragma comment(linker, "/export:mono_metadata_cleanup") +#pragma comment(linker, "/export:mono_metadata_compute_size") +#pragma comment(linker, "/export:mono_metadata_compute_table_bases") +#pragma comment(linker, "/export:mono_metadata_create_anon_gparam") +#pragma comment(linker, "/export:mono_metadata_cross_helpers_run") +#pragma comment(linker, "/export:mono_metadata_custom_attrs_from_index") +#pragma comment(linker, "/export:mono_metadata_declsec_from_index") +#pragma comment(linker, "/export:mono_metadata_decode_blob_size") +#pragma comment(linker, "/export:mono_metadata_decode_row") +#pragma comment(linker, "/export:mono_metadata_decode_row_checked") +#pragma comment(linker, "/export:mono_metadata_decode_row_col") +#pragma comment(linker, "/export:mono_metadata_decode_signed_value") +#pragma comment(linker, "/export:mono_metadata_decode_table_row") +#pragma comment(linker, "/export:mono_metadata_decode_table_row_col") +#pragma comment(linker, "/export:mono_metadata_decode_value") +#pragma comment(linker, "/export:mono_metadata_encode_value") +#pragma comment(linker, "/export:mono_metadata_events_from_typedef") +#pragma comment(linker, "/export:mono_metadata_field_info") +#pragma comment(linker, "/export:mono_metadata_field_info_with_mempool") +#pragma comment(linker, "/export:mono_metadata_free_array") +#pragma comment(linker, "/export:mono_metadata_free_inflated_signature") +#pragma comment(linker, "/export:mono_metadata_free_marshal_spec") +#pragma comment(linker, "/export:mono_metadata_free_method_signature") +#pragma comment(linker, "/export:mono_metadata_free_mh") +#pragma comment(linker, "/export:mono_metadata_free_type") +#pragma comment(linker, "/export:mono_metadata_generic_class_is_valuetype") +#pragma comment(linker, "/export:mono_metadata_generic_context_equal") +#pragma comment(linker, "/export:mono_metadata_generic_context_hash") +#pragma comment(linker, "/export:mono_metadata_generic_inst_equal") +#pragma comment(linker, "/export:mono_metadata_generic_inst_hash") +#pragma comment(linker, "/export:mono_metadata_generic_param_equal") +#pragma comment(linker, "/export:mono_metadata_generic_param_hash") +#pragma comment(linker, "/export:mono_metadata_get_canonical_generic_inst") +#pragma comment(linker, "/export:mono_metadata_get_constant_index") +#pragma comment(linker, "/export:mono_metadata_get_corresponding_event_from_generic_type_definition") +#pragma comment(linker, "/export:mono_metadata_get_corresponding_field_from_generic_type_definition") +#pragma comment(linker, "/export:mono_metadata_get_corresponding_property_from_generic_type_definition") +#pragma comment(linker, "/export:mono_metadata_get_generic_inst") +#pragma comment(linker, "/export:mono_metadata_get_generic_param_row") +#pragma comment(linker, "/export:mono_metadata_get_image_set_for_class") +#pragma comment(linker, "/export:mono_metadata_get_image_set_for_method") +#pragma comment(linker, "/export:mono_metadata_get_inflated_signature") +#pragma comment(linker, "/export:mono_metadata_get_marshal_info") +#pragma comment(linker, "/export:mono_metadata_get_param_attrs") +#pragma comment(linker, "/export:mono_metadata_get_shared_type") +#pragma comment(linker, "/export:mono_metadata_guid_heap") +#pragma comment(linker, "/export:mono_metadata_has_generic_params") +#pragma comment(linker, "/export:mono_metadata_implmap_from_method") +#pragma comment(linker, "/export:mono_metadata_inflate_generic_inst") +#pragma comment(linker, "/export:mono_metadata_init") +#pragma comment(linker, "/export:mono_metadata_interfaces_from_typedef") +#pragma comment(linker, "/export:mono_metadata_interfaces_from_typedef_full") +#pragma comment(linker, "/export:mono_metadata_load_generic_param_constraints_checked") +#pragma comment(linker, "/export:mono_metadata_load_generic_params") +#pragma comment(linker, "/export:mono_metadata_localscope_from_methoddef") +#pragma comment(linker, "/export:mono_metadata_locate") +#pragma comment(linker, "/export:mono_metadata_locate_token") +#pragma comment(linker, "/export:mono_metadata_lookup_generic_class") +#pragma comment(linker, "/export:mono_metadata_method_has_param_attrs") +#pragma comment(linker, "/export:mono_metadata_methods_from_event") +#pragma comment(linker, "/export:mono_metadata_methods_from_property") +#pragma comment(linker, "/export:mono_metadata_nested_in_typedef") +#pragma comment(linker, "/export:mono_metadata_nesting_typedef") +#pragma comment(linker, "/export:mono_metadata_packing_from_typedef") +#pragma comment(linker, "/export:mono_metadata_parse_array") +#pragma comment(linker, "/export:mono_metadata_parse_custom_mod") +#pragma comment(linker, "/export:mono_metadata_parse_field_type") +#pragma comment(linker, "/export:mono_metadata_parse_generic_inst") +#pragma comment(linker, "/export:mono_metadata_parse_marshal_spec") +#pragma comment(linker, "/export:mono_metadata_parse_marshal_spec_full") +#pragma comment(linker, "/export:mono_metadata_parse_method_signature") +#pragma comment(linker, "/export:mono_metadata_parse_method_signature_full") +#pragma comment(linker, "/export:mono_metadata_parse_mh") +#pragma comment(linker, "/export:mono_metadata_parse_mh_full") +#pragma comment(linker, "/export:mono_metadata_parse_param") +#pragma comment(linker, "/export:mono_metadata_parse_signature") +#pragma comment(linker, "/export:mono_metadata_parse_signature_checked") +#pragma comment(linker, "/export:mono_metadata_parse_type") +#pragma comment(linker, "/export:mono_metadata_parse_type_checked") +#pragma comment(linker, "/export:mono_metadata_parse_typedef_or_ref") +#pragma comment(linker, "/export:mono_metadata_properties_from_typedef") +#pragma comment(linker, "/export:mono_metadata_read_constant_value") +#pragma comment(linker, "/export:mono_metadata_signature_alloc") +#pragma comment(linker, "/export:mono_metadata_signature_deep_dup") +#pragma comment(linker, "/export:mono_metadata_signature_dup") +#pragma comment(linker, "/export:mono_metadata_signature_dup_add_this") +#pragma comment(linker, "/export:mono_metadata_signature_dup_full") +#pragma comment(linker, "/export:mono_metadata_signature_dup_mempool") +#pragma comment(linker, "/export:mono_metadata_signature_equal") +#pragma comment(linker, "/export:mono_metadata_signature_size") +#pragma comment(linker, "/export:mono_metadata_str_hash") +#pragma comment(linker, "/export:mono_metadata_string_heap") +#pragma comment(linker, "/export:mono_metadata_string_heap_checked") +#pragma comment(linker, "/export:mono_metadata_token_from_dor") +#pragma comment(linker, "/export:mono_metadata_translate_token_index") +#pragma comment(linker, "/export:mono_metadata_type_dup") +#pragma comment(linker, "/export:mono_metadata_type_dup_with_cmods") +#pragma comment(linker, "/export:mono_metadata_type_equal") +#pragma comment(linker, "/export:mono_metadata_type_equal_full") +#pragma comment(linker, "/export:mono_metadata_type_hash") +#pragma comment(linker, "/export:mono_metadata_typedef_from_field") +#pragma comment(linker, "/export:mono_metadata_typedef_from_method") +#pragma comment(linker, "/export:mono_metadata_user_string") +#pragma comment(linker, "/export:mono_method_add_generic_virtual_invocation") +#pragma comment(linker, "/export:mono_method_alloc_generic_virtual_trampoline") +#pragma comment(linker, "/export:mono_method_body_get_object") +#pragma comment(linker, "/export:mono_method_body_get_object_handle") +#pragma comment(linker, "/export:mono_method_builder_ilgen_init") +#pragma comment(linker, "/export:mono_method_call_message_new") +#pragma comment(linker, "/export:mono_method_can_access_field") +#pragma comment(linker, "/export:mono_method_can_access_field_full") +#pragma comment(linker, "/export:mono_method_can_access_method") +#pragma comment(linker, "/export:mono_method_can_access_method_full") +#pragma comment(linker, "/export:mono_method_check_context_used") +#pragma comment(linker, "/export:mono_method_clear_object") +#pragma comment(linker, "/export:mono_method_construct_object_context") +#pragma comment(linker, "/export:mono_method_desc_free") +#pragma comment(linker, "/export:mono_method_desc_from_method") +#pragma comment(linker, "/export:mono_method_desc_full_match") +#pragma comment(linker, "/export:mono_method_desc_is_full") +#pragma comment(linker, "/export:mono_method_desc_match") +#pragma comment(linker, "/export:mono_method_desc_new") +#pragma comment(linker, "/export:mono_method_desc_search_in_class") +#pragma comment(linker, "/export:mono_method_desc_search_in_image") +#pragma comment(linker, "/export:mono_method_fill_runtime_generic_context") +#pragma comment(linker, "/export:mono_method_from_method_def_or_ref") +#pragma comment(linker, "/export:mono_method_full_name") +#pragma comment(linker, "/export:mono_method_get_base_method") +#pragma comment(linker, "/export:mono_method_get_class") +#pragma comment(linker, "/export:mono_method_get_context") +#pragma comment(linker, "/export:mono_method_get_context_general") +#pragma comment(linker, "/export:mono_method_get_declaring_generic_method") +#pragma comment(linker, "/export:mono_method_get_flags") +#pragma comment(linker, "/export:mono_method_get_full_name") +#pragma comment(linker, "/export:mono_method_get_generic_container") +#pragma comment(linker, "/export:mono_method_get_header") +#pragma comment(linker, "/export:mono_method_get_header_checked") +#pragma comment(linker, "/export:mono_method_get_header_internal") +#pragma comment(linker, "/export:mono_method_get_header_summary") +#pragma comment(linker, "/export:mono_method_get_imt_slot") +#pragma comment(linker, "/export:mono_method_get_index") +#pragma comment(linker, "/export:mono_method_get_last_managed") +#pragma comment(linker, "/export:mono_method_get_marshal_info") +#pragma comment(linker, "/export:mono_method_get_name") +#pragma comment(linker, "/export:mono_method_get_name_full") +#pragma comment(linker, "/export:mono_method_get_object") +#pragma comment(linker, "/export:mono_method_get_object_checked") +#pragma comment(linker, "/export:mono_method_get_object_handle") +#pragma comment(linker, "/export:mono_method_get_param_names") +#pragma comment(linker, "/export:mono_method_get_param_token") +#pragma comment(linker, "/export:mono_method_get_reflection_name") +#pragma comment(linker, "/export:mono_method_get_signature") +#pragma comment(linker, "/export:mono_method_get_signature_checked") +#pragma comment(linker, "/export:mono_method_get_signature_full") +#pragma comment(linker, "/export:mono_method_get_token") +#pragma comment(linker, "/export:mono_method_get_unmanaged_thunk") +#pragma comment(linker, "/export:mono_method_get_vtable_index") +#pragma comment(linker, "/export:mono_method_get_vtable_slot") +#pragma comment(linker, "/export:mono_method_get_wrapper_cache") +#pragma comment(linker, "/export:mono_method_get_wrapper_data") +#pragma comment(linker, "/export:mono_method_has_marshal_info") +#pragma comment(linker, "/export:mono_method_has_no_body") +#pragma comment(linker, "/export:mono_method_header_get_clauses") +#pragma comment(linker, "/export:mono_method_header_get_code") +#pragma comment(linker, "/export:mono_method_header_get_locals") +#pragma comment(linker, "/export:mono_method_header_get_num_clauses") +#pragma comment(linker, "/export:mono_method_is_from_assembly") +#pragma comment(linker, "/export:mono_method_is_generic_impl") +#pragma comment(linker, "/export:mono_method_is_generic_sharable") +#pragma comment(linker, "/export:mono_method_is_generic_sharable_full") +#pragma comment(linker, "/export:mono_method_lookup_or_register_info") +#pragma comment(linker, "/export:mono_method_needs_static_rgctx_invoke") +#pragma comment(linker, "/export:mono_method_print_code") +#pragma comment(linker, "/export:mono_method_return_message_restore") +#pragma comment(linker, "/export:mono_method_same_domain") +#pragma comment(linker, "/export:mono_method_search_in_array_class") +#pragma comment(linker, "/export:mono_method_set_generic_container") +#pragma comment(linker, "/export:mono_method_signature") +#pragma comment(linker, "/export:mono_method_signature_checked") +#pragma comment(linker, "/export:mono_method_verify") +#pragma comment(linker, "/export:mono_method_verify_with_current_settings") +#pragma comment(linker, "/export:mono_object_castclass_mbyref") +#pragma comment(linker, "/export:mono_object_castclass_unbox") +#pragma comment(linker, "/export:mono_object_castclass_with_cache") +#pragma comment(linker, "/export:mono_object_clone") +#pragma comment(linker, "/export:mono_object_clone_checked") +#pragma comment(linker, "/export:mono_object_clone_handle") +#pragma comment(linker, "/export:mono_object_describe") +#pragma comment(linker, "/export:mono_object_describe_fields") +#pragma comment(linker, "/export:mono_object_get_class") +#pragma comment(linker, "/export:mono_object_get_data") +#pragma comment(linker, "/export:mono_object_get_domain") +#pragma comment(linker, "/export:mono_object_get_size") +#pragma comment(linker, "/export:mono_object_get_virtual_method") +#pragma comment(linker, "/export:mono_object_get_vtable") +#pragma comment(linker, "/export:mono_object_handle_get_virtual_method") +#pragma comment(linker, "/export:mono_object_handle_isinst") +#pragma comment(linker, "/export:mono_object_handle_isinst_mbyref") +#pragma comment(linker, "/export:mono_object_handle_pin_unbox") +#pragma comment(linker, "/export:mono_object_hash") +#pragma comment(linker, "/export:mono_object_is_alive") +#pragma comment(linker, "/export:mono_object_is_from_assembly") +#pragma comment(linker, "/export:mono_object_isinst") +#pragma comment(linker, "/export:mono_object_isinst_checked") +#pragma comment(linker, "/export:mono_object_isinst_icall") +#pragma comment(linker, "/export:mono_object_isinst_mbyref") +#pragma comment(linker, "/export:mono_object_isinst_with_cache") +#pragma comment(linker, "/export:mono_object_new") +#pragma comment(linker, "/export:mono_object_new_alloc_by_vtable") +#pragma comment(linker, "/export:mono_object_new_alloc_specific") +#pragma comment(linker, "/export:mono_object_new_alloc_specific_checked") +#pragma comment(linker, "/export:mono_object_new_checked") +#pragma comment(linker, "/export:mono_object_new_fast") +#pragma comment(linker, "/export:mono_object_new_from_token") +#pragma comment(linker, "/export:mono_object_new_handle") +#pragma comment(linker, "/export:mono_object_new_handle_mature") +#pragma comment(linker, "/export:mono_object_new_mature") +#pragma comment(linker, "/export:mono_object_new_pinned") +#pragma comment(linker, "/export:mono_object_new_pinned_handle") +#pragma comment(linker, "/export:mono_object_new_specific") +#pragma comment(linker, "/export:mono_object_new_specific_checked") +#pragma comment(linker, "/export:mono_object_register_finalizer") +#pragma comment(linker, "/export:mono_object_register_finalizer_handle") +#pragma comment(linker, "/export:mono_object_to_string") +#pragma comment(linker, "/export:mono_object_try_to_string") +#pragma comment(linker, "/export:mono_object_unbox") +#pragma comment(linker, "/export:mono_object_xdomain_representation") +#pragma comment(linker, "/export:mono_profiler_call_context_free_buffer") +#pragma comment(linker, "/export:mono_profiler_call_context_get_argument") +#pragma comment(linker, "/export:mono_profiler_call_context_get_local") +#pragma comment(linker, "/export:mono_profiler_call_context_get_result") +#pragma comment(linker, "/export:mono_profiler_call_context_get_this") +#pragma comment(linker, "/export:mono_profiler_cleanup") +#pragma comment(linker, "/export:mono_profiler_coverage_alloc") +#pragma comment(linker, "/export:mono_profiler_coverage_instrumentation_enabled") +#pragma comment(linker, "/export:mono_profiler_create") +#pragma comment(linker, "/export:mono_profiler_enable_allocations") +#pragma comment(linker, "/export:mono_profiler_enable_call_context_introspection") +#pragma comment(linker, "/export:mono_profiler_enable_clauses") +#pragma comment(linker, "/export:mono_profiler_enable_coverage") +#pragma comment(linker, "/export:mono_profiler_enable_sampling") +#pragma comment(linker, "/export:mono_profiler_get_call_instrumentation_flags") +#pragma comment(linker, "/export:mono_profiler_get_coverage_data") +#pragma comment(linker, "/export:mono_profiler_get_sample_mode") +#pragma comment(linker, "/export:mono_profiler_install") +#pragma comment(linker, "/export:mono_profiler_install_allocation") +#pragma comment(linker, "/export:mono_profiler_install_enter_leave") +#pragma comment(linker, "/export:mono_profiler_install_exception") +#pragma comment(linker, "/export:mono_profiler_install_gc") +#pragma comment(linker, "/export:mono_profiler_install_jit_end") +#pragma comment(linker, "/export:mono_profiler_install_thread") +#pragma comment(linker, "/export:mono_profiler_load") +#pragma comment(linker, "/export:mono_profiler_raise_assembly_loaded") +#pragma comment(linker, "/export:mono_profiler_raise_assembly_loading") +#pragma comment(linker, "/export:mono_profiler_raise_assembly_unloaded") +#pragma comment(linker, "/export:mono_profiler_raise_assembly_unloading") +#pragma comment(linker, "/export:mono_profiler_raise_class_failed") +#pragma comment(linker, "/export:mono_profiler_raise_class_loaded") +#pragma comment(linker, "/export:mono_profiler_raise_class_loading") +#pragma comment(linker, "/export:mono_profiler_raise_context_loaded") +#pragma comment(linker, "/export:mono_profiler_raise_context_unloaded") +#pragma comment(linker, "/export:mono_profiler_raise_domain_loaded") +#pragma comment(linker, "/export:mono_profiler_raise_domain_loading") +#pragma comment(linker, "/export:mono_profiler_raise_domain_name") +#pragma comment(linker, "/export:mono_profiler_raise_domain_unloaded") +#pragma comment(linker, "/export:mono_profiler_raise_domain_unloading") +#pragma comment(linker, "/export:mono_profiler_raise_exception_clause") +#pragma comment(linker, "/export:mono_profiler_raise_exception_throw") +#pragma comment(linker, "/export:mono_profiler_raise_gc_allocation") +#pragma comment(linker, "/export:mono_profiler_raise_gc_event") +#pragma comment(linker, "/export:mono_profiler_raise_gc_finalized") +#pragma comment(linker, "/export:mono_profiler_raise_gc_finalized_object") +#pragma comment(linker, "/export:mono_profiler_raise_gc_finalizing") +#pragma comment(linker, "/export:mono_profiler_raise_gc_finalizing_object") +#pragma comment(linker, "/export:mono_profiler_raise_gc_handle_created") +#pragma comment(linker, "/export:mono_profiler_raise_gc_handle_deleted") +#pragma comment(linker, "/export:mono_profiler_raise_gc_moves") +#pragma comment(linker, "/export:mono_profiler_raise_gc_resize") +#pragma comment(linker, "/export:mono_profiler_raise_gc_root_register") +#pragma comment(linker, "/export:mono_profiler_raise_gc_root_unregister") +#pragma comment(linker, "/export:mono_profiler_raise_gc_roots") +#pragma comment(linker, "/export:mono_profiler_raise_image_failed") +#pragma comment(linker, "/export:mono_profiler_raise_image_loaded") +#pragma comment(linker, "/export:mono_profiler_raise_image_loading") +#pragma comment(linker, "/export:mono_profiler_raise_image_unloaded") +#pragma comment(linker, "/export:mono_profiler_raise_image_unloading") +#pragma comment(linker, "/export:mono_profiler_raise_jit_begin") +#pragma comment(linker, "/export:mono_profiler_raise_jit_chunk_created") +#pragma comment(linker, "/export:mono_profiler_raise_jit_chunk_destroyed") +#pragma comment(linker, "/export:mono_profiler_raise_jit_code_buffer") +#pragma comment(linker, "/export:mono_profiler_raise_jit_done") +#pragma comment(linker, "/export:mono_profiler_raise_jit_failed") +#pragma comment(linker, "/export:mono_profiler_raise_method_begin_invoke") +#pragma comment(linker, "/export:mono_profiler_raise_method_end_invoke") +#pragma comment(linker, "/export:mono_profiler_raise_method_enter") +#pragma comment(linker, "/export:mono_profiler_raise_method_exception_leave") +#pragma comment(linker, "/export:mono_profiler_raise_method_free") +#pragma comment(linker, "/export:mono_profiler_raise_method_leave") +#pragma comment(linker, "/export:mono_profiler_raise_method_tail_call") +#pragma comment(linker, "/export:mono_profiler_raise_monitor_acquired") +#pragma comment(linker, "/export:mono_profiler_raise_monitor_contention") +#pragma comment(linker, "/export:mono_profiler_raise_monitor_failed") +#pragma comment(linker, "/export:mono_profiler_raise_runtime_initialized") +#pragma comment(linker, "/export:mono_profiler_raise_runtime_shutdown_begin") +#pragma comment(linker, "/export:mono_profiler_raise_runtime_shutdown_end") +#pragma comment(linker, "/export:mono_profiler_raise_sample_hit") +#pragma comment(linker, "/export:mono_profiler_raise_thread_exited") +#pragma comment(linker, "/export:mono_profiler_raise_thread_name") +#pragma comment(linker, "/export:mono_profiler_raise_thread_started") +#pragma comment(linker, "/export:mono_profiler_raise_thread_stopped") +#pragma comment(linker, "/export:mono_profiler_raise_thread_stopping") +#pragma comment(linker, "/export:mono_profiler_raise_vtable_failed") +#pragma comment(linker, "/export:mono_profiler_raise_vtable_loaded") +#pragma comment(linker, "/export:mono_profiler_raise_vtable_loading") +#pragma comment(linker, "/export:mono_profiler_sampling_enabled") +#pragma comment(linker, "/export:mono_profiler_sampling_thread_post") +#pragma comment(linker, "/export:mono_profiler_sampling_thread_wait") +#pragma comment(linker, "/export:mono_profiler_set_assembly_loaded_callback") +#pragma comment(linker, "/export:mono_profiler_set_assembly_loading_callback") +#pragma comment(linker, "/export:mono_profiler_set_assembly_unloaded_callback") +#pragma comment(linker, "/export:mono_profiler_set_assembly_unloading_callback") +#pragma comment(linker, "/export:mono_profiler_set_call_instrumentation_filter_callback") +#pragma comment(linker, "/export:mono_profiler_set_class_failed_callback") +#pragma comment(linker, "/export:mono_profiler_set_class_loaded_callback") +#pragma comment(linker, "/export:mono_profiler_set_class_loading_callback") +#pragma comment(linker, "/export:mono_profiler_set_cleanup_callback") +#pragma comment(linker, "/export:mono_profiler_set_context_loaded_callback") +#pragma comment(linker, "/export:mono_profiler_set_context_unloaded_callback") +#pragma comment(linker, "/export:mono_profiler_set_coverage_filter_callback") +#pragma comment(linker, "/export:mono_profiler_set_domain_loaded_callback") +#pragma comment(linker, "/export:mono_profiler_set_domain_loading_callback") +#pragma comment(linker, "/export:mono_profiler_set_domain_name_callback") +#pragma comment(linker, "/export:mono_profiler_set_domain_unloaded_callback") +#pragma comment(linker, "/export:mono_profiler_set_domain_unloading_callback") +#pragma comment(linker, "/export:mono_profiler_set_events") +#pragma comment(linker, "/export:mono_profiler_set_exception_clause_callback") +#pragma comment(linker, "/export:mono_profiler_set_exception_throw_callback") +#pragma comment(linker, "/export:mono_profiler_set_gc_allocation_callback") +#pragma comment(linker, "/export:mono_profiler_set_gc_event_callback") +#pragma comment(linker, "/export:mono_profiler_set_gc_finalized_callback") +#pragma comment(linker, "/export:mono_profiler_set_gc_finalized_object_callback") +#pragma comment(linker, "/export:mono_profiler_set_gc_finalizing_callback") +#pragma comment(linker, "/export:mono_profiler_set_gc_finalizing_object_callback") +#pragma comment(linker, "/export:mono_profiler_set_gc_handle_created_callback") +#pragma comment(linker, "/export:mono_profiler_set_gc_handle_deleted_callback") +#pragma comment(linker, "/export:mono_profiler_set_gc_moves_callback") +#pragma comment(linker, "/export:mono_profiler_set_gc_resize_callback") +#pragma comment(linker, "/export:mono_profiler_set_gc_root_register_callback") +#pragma comment(linker, "/export:mono_profiler_set_gc_root_unregister_callback") +#pragma comment(linker, "/export:mono_profiler_set_gc_roots_callback") +#pragma comment(linker, "/export:mono_profiler_set_image_failed_callback") +#pragma comment(linker, "/export:mono_profiler_set_image_loaded_callback") +#pragma comment(linker, "/export:mono_profiler_set_image_loading_callback") +#pragma comment(linker, "/export:mono_profiler_set_image_unloaded_callback") +#pragma comment(linker, "/export:mono_profiler_set_image_unloading_callback") +#pragma comment(linker, "/export:mono_profiler_set_jit_begin_callback") +#pragma comment(linker, "/export:mono_profiler_set_jit_chunk_created_callback") +#pragma comment(linker, "/export:mono_profiler_set_jit_chunk_destroyed_callback") +#pragma comment(linker, "/export:mono_profiler_set_jit_code_buffer_callback") +#pragma comment(linker, "/export:mono_profiler_set_jit_done_callback") +#pragma comment(linker, "/export:mono_profiler_set_jit_failed_callback") +#pragma comment(linker, "/export:mono_profiler_set_method_begin_invoke_callback") +#pragma comment(linker, "/export:mono_profiler_set_method_end_invoke_callback") +#pragma comment(linker, "/export:mono_profiler_set_method_enter_callback") +#pragma comment(linker, "/export:mono_profiler_set_method_exception_leave_callback") +#pragma comment(linker, "/export:mono_profiler_set_method_free_callback") +#pragma comment(linker, "/export:mono_profiler_set_method_leave_callback") +#pragma comment(linker, "/export:mono_profiler_set_method_tail_call_callback") +#pragma comment(linker, "/export:mono_profiler_set_monitor_acquired_callback") +#pragma comment(linker, "/export:mono_profiler_set_monitor_contention_callback") +#pragma comment(linker, "/export:mono_profiler_set_monitor_failed_callback") +#pragma comment(linker, "/export:mono_profiler_set_runtime_initialized_callback") +#pragma comment(linker, "/export:mono_profiler_set_runtime_shutdown_begin_callback") +#pragma comment(linker, "/export:mono_profiler_set_runtime_shutdown_end_callback") +#pragma comment(linker, "/export:mono_profiler_set_sample_hit_callback") +#pragma comment(linker, "/export:mono_profiler_set_sample_mode") +#pragma comment(linker, "/export:mono_profiler_set_thread_exited_callback") +#pragma comment(linker, "/export:mono_profiler_set_thread_name_callback") +#pragma comment(linker, "/export:mono_profiler_set_thread_started_callback") +#pragma comment(linker, "/export:mono_profiler_set_thread_stopped_callback") +#pragma comment(linker, "/export:mono_profiler_set_thread_stopping_callback") +#pragma comment(linker, "/export:mono_profiler_set_vtable_failed_callback") +#pragma comment(linker, "/export:mono_profiler_set_vtable_loaded_callback") +#pragma comment(linker, "/export:mono_profiler_set_vtable_loading_callback") +#pragma comment(linker, "/export:mono_profiler_started") +#pragma comment(linker, "/export:mono_profiler_state") +#pragma comment(linker, "/export:mono_property_bag_add") +#pragma comment(linker, "/export:mono_property_bag_get") +#pragma comment(linker, "/export:mono_property_get_flags") +#pragma comment(linker, "/export:mono_property_get_get_method") +#pragma comment(linker, "/export:mono_property_get_name") +#pragma comment(linker, "/export:mono_property_get_object") +#pragma comment(linker, "/export:mono_property_get_object_checked") +#pragma comment(linker, "/export:mono_property_get_object_handle") +#pragma comment(linker, "/export:mono_property_get_parent") +#pragma comment(linker, "/export:mono_property_get_set_method") +#pragma comment(linker, "/export:mono_property_get_value") +#pragma comment(linker, "/export:mono_property_get_value_checked") +#pragma comment(linker, "/export:mono_property_hash_destroy") +#pragma comment(linker, "/export:mono_property_hash_insert") +#pragma comment(linker, "/export:mono_property_hash_lookup") +#pragma comment(linker, "/export:mono_property_hash_new") +#pragma comment(linker, "/export:mono_property_hash_remove_object") +#pragma comment(linker, "/export:mono_property_set_value") +#pragma comment(linker, "/export:mono_property_set_value_handle") +#pragma comment(linker, "/export:mono_raise_exception") +#pragma comment(linker, "/export:mono_raise_exception_deprecated") +#pragma comment(linker, "/export:mono_raise_exception_with_context") +#pragma comment(linker, "/export:mono_reflection_assembly_get_assembly") +#pragma comment(linker, "/export:mono_reflection_bind_generic_parameters") +#pragma comment(linker, "/export:mono_reflection_call_is_assignable_to") +#pragma comment(linker, "/export:mono_reflection_cleanup_assembly") +#pragma comment(linker, "/export:mono_reflection_cleanup_domain") +#pragma comment(linker, "/export:mono_reflection_create_custom_attr_data_args") +#pragma comment(linker, "/export:mono_reflection_create_custom_attr_data_args_noalloc") +#pragma comment(linker, "/export:mono_reflection_dynimage_basic_init") +#pragma comment(linker, "/export:mono_reflection_emit_init") +#pragma comment(linker, "/export:mono_reflection_free_type_info") +#pragma comment(linker, "/export:mono_reflection_get_custom_attrs") +#pragma comment(linker, "/export:mono_reflection_get_custom_attrs_blob") +#pragma comment(linker, "/export:mono_reflection_get_custom_attrs_blob_checked") +#pragma comment(linker, "/export:mono_reflection_get_custom_attrs_by_type") +#pragma comment(linker, "/export:mono_reflection_get_custom_attrs_by_type_handle") +#pragma comment(linker, "/export:mono_reflection_get_custom_attrs_data") +#pragma comment(linker, "/export:mono_reflection_get_custom_attrs_data_checked") +#pragma comment(linker, "/export:mono_reflection_get_custom_attrs_info") +#pragma comment(linker, "/export:mono_reflection_get_custom_attrs_info_checked") +#pragma comment(linker, "/export:mono_reflection_get_dynamic_overrides") +#pragma comment(linker, "/export:mono_reflection_get_token") +#pragma comment(linker, "/export:mono_reflection_get_token_checked") +#pragma comment(linker, "/export:mono_reflection_get_type") +#pragma comment(linker, "/export:mono_reflection_get_type_checked") +#pragma comment(linker, "/export:mono_reflection_init") +#pragma comment(linker, "/export:mono_reflection_is_usertype") +#pragma comment(linker, "/export:mono_reflection_lookup_dynamic_token") +#pragma comment(linker, "/export:mono_reflection_lookup_signature") +#pragma comment(linker, "/export:mono_reflection_marshal_as_attribute_from_marshal_spec") +#pragma comment(linker, "/export:mono_reflection_method_count_clauses") +#pragma comment(linker, "/export:mono_reflection_methodbuilder_from_ctor_builder") +#pragma comment(linker, "/export:mono_reflection_methodbuilder_from_method_builder") +#pragma comment(linker, "/export:mono_reflection_parse_type") +#pragma comment(linker, "/export:mono_reflection_parse_type_checked") +#pragma comment(linker, "/export:mono_reflection_resolution_scope_from_image") +#pragma comment(linker, "/export:mono_reflection_resolve_object") +#pragma comment(linker, "/export:mono_reflection_resolve_object_handle") +#pragma comment(linker, "/export:mono_reflection_type_from_name") +#pragma comment(linker, "/export:mono_reflection_type_from_name_checked") +#pragma comment(linker, "/export:mono_reflection_type_get_handle") +#pragma comment(linker, "/export:mono_reflection_type_get_type") +#pragma comment(linker, "/export:mono_reflection_type_handle_mono_type") +#pragma comment(linker, "/export:mono_runtime_class_init") +#pragma comment(linker, "/export:mono_runtime_class_init_full") +#pragma comment(linker, "/export:mono_runtime_cleanup") +#pragma comment(linker, "/export:mono_runtime_cleanup_handlers") +#pragma comment(linker, "/export:mono_runtime_create_delegate_trampoline") +#pragma comment(linker, "/export:mono_runtime_create_jump_trampoline") +#pragma comment(linker, "/export:mono_runtime_delegate_invoke") +#pragma comment(linker, "/export:mono_runtime_delegate_invoke_checked") +#pragma comment(linker, "/export:mono_runtime_delegate_try_invoke") +#pragma comment(linker, "/export:mono_runtime_exec_main") +#pragma comment(linker, "/export:mono_runtime_exec_main_checked") +#pragma comment(linker, "/export:mono_runtime_exec_managed_code") +#pragma comment(linker, "/export:mono_runtime_free_method") +#pragma comment(linker, "/export:mono_runtime_get_aotid") +#pragma comment(linker, "/export:mono_runtime_get_caller_no_system_or_reflection") +#pragma comment(linker, "/export:mono_runtime_get_main_args") +#pragma comment(linker, "/export:mono_runtime_get_main_args_handle") +#pragma comment(linker, "/export:mono_runtime_get_no_exec") +#pragma comment(linker, "/export:mono_runtime_init") +#pragma comment(linker, "/export:mono_runtime_init_checked") +#pragma comment(linker, "/export:mono_runtime_init_tls") +#pragma comment(linker, "/export:mono_runtime_install_custom_handlers") +#pragma comment(linker, "/export:mono_runtime_install_custom_handlers_usage") +#pragma comment(linker, "/export:mono_runtime_install_handlers") +#pragma comment(linker, "/export:mono_runtime_invoke") +#pragma comment(linker, "/export:mono_runtime_invoke_array") +#pragma comment(linker, "/export:mono_runtime_invoke_array_checked") +#pragma comment(linker, "/export:mono_runtime_invoke_checked") +#pragma comment(linker, "/export:mono_runtime_invoke_handle") +#pragma comment(linker, "/export:mono_runtime_is_shutting_down") +#pragma comment(linker, "/export:mono_runtime_load") +#pragma comment(linker, "/export:mono_runtime_object_init") +#pragma comment(linker, "/export:mono_runtime_object_init_checked") +#pragma comment(linker, "/export:mono_runtime_object_init_handle") +#pragma comment(linker, "/export:mono_runtime_quit") +#pragma comment(linker, "/export:mono_runtime_resource_check_limit") +#pragma comment(linker, "/export:mono_runtime_resource_limit") +#pragma comment(linker, "/export:mono_runtime_resource_set_callback") +#pragma comment(linker, "/export:mono_runtime_run_main") +#pragma comment(linker, "/export:mono_runtime_run_main_checked") +#pragma comment(linker, "/export:mono_runtime_run_module_cctor") +#pragma comment(linker, "/export:mono_runtime_set_main_args") +#pragma comment(linker, "/export:mono_runtime_set_no_exec") +#pragma comment(linker, "/export:mono_runtime_set_pending_exception") +#pragma comment(linker, "/export:mono_runtime_set_shutting_down") +#pragma comment(linker, "/export:mono_runtime_setup_stat_profiler") +#pragma comment(linker, "/export:mono_runtime_shutdown_stat_profiler") +#pragma comment(linker, "/export:mono_runtime_try_exec_main") +#pragma comment(linker, "/export:mono_runtime_try_invoke") +#pragma comment(linker, "/export:mono_runtime_try_invoke_array") +#pragma comment(linker, "/export:mono_runtime_try_invoke_handle") +#pragma comment(linker, "/export:mono_runtime_try_run_main") +#pragma comment(linker, "/export:mono_runtime_try_shutdown") +#pragma comment(linker, "/export:mono_runtime_unhandled_exception_policy_get") +#pragma comment(linker, "/export:mono_runtime_unhandled_exception_policy_set") +#pragma comment(linker, "/export:mono_signature_explicit_this") +#pragma comment(linker, "/export:mono_signature_full_name") +#pragma comment(linker, "/export:mono_signature_get_call_conv") +#pragma comment(linker, "/export:mono_signature_get_desc") +#pragma comment(linker, "/export:mono_signature_get_param_count") +#pragma comment(linker, "/export:mono_signature_get_params") +#pragma comment(linker, "/export:mono_signature_get_return_type") +#pragma comment(linker, "/export:mono_signature_hash") +#pragma comment(linker, "/export:mono_signature_is_instance") +#pragma comment(linker, "/export:mono_signature_no_pinvoke") +#pragma comment(linker, "/export:mono_signature_param_is_out") +#pragma comment(linker, "/export:mono_signature_vararg_start") +#pragma comment(linker, "/export:mono_stack_mark_pop_value") +#pragma comment(linker, "/export:mono_stack_mark_record_size") +#pragma comment(linker, "/export:mono_stack_walk") +#pragma comment(linker, "/export:mono_stack_walk_async_safe") +#pragma comment(linker, "/export:mono_stack_walk_no_il") +#pragma comment(linker, "/export:mono_string_builder_to_utf16") +#pragma comment(linker, "/export:mono_string_builder_to_utf8") +#pragma comment(linker, "/export:mono_string_chars") +#pragma comment(linker, "/export:mono_string_empty") +#pragma comment(linker, "/export:mono_string_empty_handle") +#pragma comment(linker, "/export:mono_string_empty_wrapper") +#pragma comment(linker, "/export:mono_string_equal") +#pragma comment(linker, "/export:mono_string_from_blob") +#pragma comment(linker, "/export:mono_string_from_bstr") +#pragma comment(linker, "/export:mono_string_from_bstr_icall") +#pragma comment(linker, "/export:mono_string_from_byvalstr") +#pragma comment(linker, "/export:mono_string_from_byvalwstr") +#pragma comment(linker, "/export:mono_string_from_utf16") +#pragma comment(linker, "/export:mono_string_from_utf16_checked") +#pragma comment(linker, "/export:mono_string_from_utf32") +#pragma comment(linker, "/export:mono_string_from_utf32_checked") +#pragma comment(linker, "/export:mono_string_handle_length") +#pragma comment(linker, "/export:mono_string_handle_pin_chars") +#pragma comment(linker, "/export:mono_string_handle_to_utf8") +#pragma comment(linker, "/export:mono_string_hash") +#pragma comment(linker, "/export:mono_string_intern") +#pragma comment(linker, "/export:mono_string_intern_checked") +#pragma comment(linker, "/export:mono_string_is_interned") +#pragma comment(linker, "/export:mono_string_length") +#pragma comment(linker, "/export:mono_string_new") +#pragma comment(linker, "/export:mono_string_new_checked") +#pragma comment(linker, "/export:mono_string_new_handle") +#pragma comment(linker, "/export:mono_string_new_len") +#pragma comment(linker, "/export:mono_string_new_len_checked") +#pragma comment(linker, "/export:mono_string_new_len_wrapper") +#pragma comment(linker, "/export:mono_string_new_size") +#pragma comment(linker, "/export:mono_string_new_size_checked") +#pragma comment(linker, "/export:mono_string_new_utf16") +#pragma comment(linker, "/export:mono_string_new_utf16_checked") +#pragma comment(linker, "/export:mono_string_new_utf16_handle") +#pragma comment(linker, "/export:mono_string_new_utf32") +#pragma comment(linker, "/export:mono_string_new_utf8_len_handle") +#pragma comment(linker, "/export:mono_string_new_wrapper") +#pragma comment(linker, "/export:mono_string_new_wtf8_len_checked") +#pragma comment(linker, "/export:mono_string_to_ansibstr") +#pragma comment(linker, "/export:mono_string_to_bstr") +#pragma comment(linker, "/export:mono_string_to_byvalstr") +#pragma comment(linker, "/export:mono_string_to_byvalwstr") +#pragma comment(linker, "/export:mono_string_to_utf16") +#pragma comment(linker, "/export:mono_string_to_utf32") +#pragma comment(linker, "/export:mono_string_to_utf8") +#pragma comment(linker, "/export:mono_string_to_utf8_checked") +#pragma comment(linker, "/export:mono_string_to_utf8_ignore") +#pragma comment(linker, "/export:mono_string_to_utf8_image") +#pragma comment(linker, "/export:mono_string_to_utf8str") +#pragma comment(linker, "/export:mono_string_to_utf8str_handle") +#pragma comment(linker, "/export:mono_string_utf16_to_builder") +#pragma comment(linker, "/export:mono_string_utf16_to_builder2") +#pragma comment(linker, "/export:mono_string_utf8_to_builder") +#pragma comment(linker, "/export:mono_string_utf8_to_builder2") +#pragma comment(linker, "/export:mono_thread_attach") +#pragma comment(linker, "/export:mono_thread_attach_aborted_cb") +#pragma comment(linker, "/export:mono_thread_callbacks_init") +#pragma comment(linker, "/export:mono_thread_cleanup") +#pragma comment(linker, "/export:mono_thread_cleanup_apartment_state") +#pragma comment(linker, "/export:mono_thread_clear_and_set_state") +#pragma comment(linker, "/export:mono_thread_clr_state") +#pragma comment(linker, "/export:mono_thread_create") +#pragma comment(linker, "/export:mono_thread_create_checked") +#pragma comment(linker, "/export:mono_thread_create_internal") +#pragma comment(linker, "/export:mono_thread_create_internal_handle") +#pragma comment(linker, "/export:mono_thread_current") +#pragma comment(linker, "/export:mono_thread_current_check_pending_interrupt") +#pragma comment(linker, "/export:mono_thread_detach") +#pragma comment(linker, "/export:mono_thread_detach_if_exiting") +#pragma comment(linker, "/export:mono_thread_exit") +#pragma comment(linker, "/export:mono_thread_force_interruption_checkpoint_noraise") +#pragma comment(linker, "/export:mono_thread_get_main") +#pragma comment(linker, "/export:mono_thread_get_managed_id") +#pragma comment(linker, "/export:mono_thread_get_name") +#pragma comment(linker, "/export:mono_thread_get_name_utf8") +#pragma comment(linker, "/export:mono_thread_get_undeniable_exception") +#pragma comment(linker, "/export:mono_thread_has_appdomain_ref") +#pragma comment(linker, "/export:mono_thread_hazardous_queue_free") +#pragma comment(linker, "/export:mono_thread_hazardous_try_free") +#pragma comment(linker, "/export:mono_thread_hazardous_try_free_all") +#pragma comment(linker, "/export:mono_thread_hazardous_try_free_some") +#pragma comment(linker, "/export:mono_thread_init") +#pragma comment(linker, "/export:mono_thread_init_apartment_state") +#pragma comment(linker, "/export:mono_thread_interruption_checkpoint") +#pragma comment(linker, "/export:mono_thread_interruption_checkpoint_bool") +#pragma comment(linker, "/export:mono_thread_interruption_checkpoint_void") +#pragma comment(linker, "/export:mono_thread_interruption_request_flag") +#pragma comment(linker, "/export:mono_thread_interruption_requested") +#pragma comment(linker, "/export:mono_thread_is_foreign") +#pragma comment(linker, "/export:mono_thread_is_gc_unsafe_mode") +#pragma comment(linker, "/export:mono_thread_join") +#pragma comment(linker, "/export:mono_thread_manage") +#pragma comment(linker, "/export:mono_thread_new_init") +#pragma comment(linker, "/export:mono_thread_platform_create_thread") +#pragma comment(linker, "/export:mono_thread_pop_appdomain_ref") +#pragma comment(linker, "/export:mono_thread_push_appdomain_ref") +#pragma comment(linker, "/export:mono_thread_set_main") +#pragma comment(linker, "/export:mono_thread_set_manage_callback") +#pragma comment(linker, "/export:mono_thread_set_name_internal") +#pragma comment(linker, "/export:mono_thread_set_state") +#pragma comment(linker, "/export:mono_thread_small_id_alloc") +#pragma comment(linker, "/export:mono_thread_small_id_free") +#pragma comment(linker, "/export:mono_thread_smr_cleanup") +#pragma comment(linker, "/export:mono_thread_smr_init") +#pragma comment(linker, "/export:mono_thread_stop") +#pragma comment(linker, "/export:mono_thread_test_and_set_state") +#pragma comment(linker, "/export:mono_thread_test_state") +#pragma comment(linker, "/export:mono_type_array_get_and_resolve") +#pragma comment(linker, "/export:mono_type_create_from_typespec") +#pragma comment(linker, "/export:mono_type_create_from_typespec_checked") +#pragma comment(linker, "/export:mono_type_full_name") +#pragma comment(linker, "/export:mono_type_generic_inst_is_valuetype") +#pragma comment(linker, "/export:mono_type_get_array_type") +#pragma comment(linker, "/export:mono_type_get_basic_type_from_generic") +#pragma comment(linker, "/export:mono_type_get_checked") +#pragma comment(linker, "/export:mono_type_get_class") +#pragma comment(linker, "/export:mono_type_get_cmods") +#pragma comment(linker, "/export:mono_type_get_desc") +#pragma comment(linker, "/export:mono_type_get_full_name") +#pragma comment(linker, "/export:mono_type_get_modifiers") +#pragma comment(linker, "/export:mono_type_get_name") +#pragma comment(linker, "/export:mono_type_get_name_full") +#pragma comment(linker, "/export:mono_type_get_object") +#pragma comment(linker, "/export:mono_type_get_object_checked") +#pragma comment(linker, "/export:mono_type_get_object_handle") +#pragma comment(linker, "/export:mono_type_get_ptr_type") +#pragma comment(linker, "/export:mono_type_get_signature") +#pragma comment(linker, "/export:mono_type_get_type") +#pragma comment(linker, "/export:mono_type_get_underlying_type") +#pragma comment(linker, "/export:mono_type_has_exceptions") +#pragma comment(linker, "/export:mono_type_in_image") +#pragma comment(linker, "/export:mono_type_initialization_cleanup") +#pragma comment(linker, "/export:mono_type_initialization_init") +#pragma comment(linker, "/export:mono_type_is_byref") +#pragma comment(linker, "/export:mono_type_is_from_assembly") +#pragma comment(linker, "/export:mono_type_is_generic_parameter") +#pragma comment(linker, "/export:mono_type_is_pointer") +#pragma comment(linker, "/export:mono_type_is_primitive") +#pragma comment(linker, "/export:mono_type_is_reference") +#pragma comment(linker, "/export:mono_type_is_struct") +#pragma comment(linker, "/export:mono_type_is_valid_enum_basetype") +#pragma comment(linker, "/export:mono_type_is_void") +#pragma comment(linker, "/export:mono_type_native_stack_size") +#pragma comment(linker, "/export:mono_type_set_alignment") +#pragma comment(linker, "/export:mono_type_size") +#pragma comment(linker, "/export:mono_type_stack_size") +#pragma comment(linker, "/export:mono_type_stack_size_internal") +#pragma comment(linker, "/export:mono_value_box") +#pragma comment(linker, "/export:mono_value_copy") +#pragma comment(linker, "/export:mono_value_copy_array") +#pragma comment(linker, "/export:mono_jit_info_get_code_start") +#pragma comment(linker, "/export:mono_jit_info_get_code_size") + +#endif diff --git a/Source/Engine/Scripting/Runtime/None.cpp b/Source/Engine/Scripting/Runtime/None.cpp new file mode 100644 index 000000000..c8f8926e5 --- /dev/null +++ b/Source/Engine/Scripting/Runtime/None.cpp @@ -0,0 +1,563 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#include "Engine/Scripting/Types.h" + +#if !USE_CSHARP + +#include "Engine/Scripting/ManagedCLR/MCore.h" +#include "Engine/Scripting/ManagedCLR/MDomain.h" +#include "Engine/Scripting/ManagedCLR/MAssembly.h" +#include "Engine/Scripting/ManagedCLR/MClass.h" +#include "Engine/Scripting/ManagedCLR/MDomain.h" +#include "Engine/Scripting/ManagedCLR/MEvent.h" +#include "Engine/Scripting/ManagedCLR/MException.h" +#include "Engine/Scripting/ManagedCLR/MField.h" +#include "Engine/Scripting/ManagedCLR/MMethod.h" +#include "Engine/Scripting/ManagedCLR/MProperty.h" + +extern MDomain* MRootDomain; +extern Array> MDomains; + +MDomain* MCore::CreateDomain(const StringAnsi& domainName) +{ + for (int32 i = 0; i < MDomains.Count(); i++) + { + if (MDomains[i]->GetName() == domainName) + return MDomains[i]; + } + auto domain = New(domainName); + MDomains.Add(domain); + return domain; +} + +void MCore::UnloadDomain(const StringAnsi& domainName) +{ + int32 i = 0; + for (; i < MDomains.Count(); i++) + { + if (MDomains[i]->GetName() == domainName) + break; + } + if (i == MDomains.Count()) + return; + + auto domain = MDomains[i]; + Delete(domain); + MDomains.RemoveAtKeepOrder(i); +} + +bool MCore::LoadEngine() +{ + MRootDomain = New("Root"); + MDomains.Add(MRootDomain); + return false; +} + +void MCore::UnloadEngine() +{ + MDomains.ClearDelete(); + MRootDomain = nullptr; +} + +#if USE_EDITOR + +void MCore::OnMidHotReload() +{ +} + +#endif + +MObject* MCore::Object::Box(void* value, const MClass* klass) +{ + return nullptr; +} + +void* MCore::Object::Unbox(MObject* obj) +{ + return nullptr; +} + +MObject* MCore::Object::New(const MClass* klass) +{ + return nullptr; +} + +void MCore::Object::Init(MObject* obj) +{ +} + +MClass* MCore::Object::GetClass(MObject* obj) +{ + return nullptr; +} + +MString* MCore::Object::ToString(MObject* obj) +{ + return nullptr; +} + +int32 MCore::Object::GetHashCode(MObject* obj) +{ + return 0; +} + +MString* MCore::String::GetEmpty(MDomain* domain) +{ + return nullptr; +} + +MString* MCore::String::New(const char* str, int32 length, MDomain* domain) +{ + return nullptr; +} + +MString* MCore::String::New(const Char* str, int32 length, MDomain* domain) +{ + return nullptr; +} + +StringView MCore::String::GetChars(MString* obj) +{ + return StringView::Empty; +} + +MArray* MCore::Array::New(const MClass* elementKlass, int32 length) +{ + return nullptr; +} + +MClass* MCore::Array::GetClass(MClass* elementKlass) +{ + return nullptr; +} + +int32 MCore::Array::GetLength(const MArray* obj) +{ + return 0; +} + +void* MCore::Array::GetAddress(const MArray* obj) +{ + return nullptr; +} + +MGCHandle MCore::GCHandle::New(MObject* obj, bool pinned) +{ + return (MGCHandle)(uintptr)obj; +} + +MGCHandle MCore::GCHandle::NewWeak(MObject* obj, bool trackResurrection) +{ + return (MGCHandle)(uintptr)obj; +} + +MObject* MCore::GCHandle::GetTarget(const MGCHandle& handle) +{ + return (MObject*)(uintptr)handle; +} + +void MCore::GCHandle::Free(const MGCHandle& handle) +{ +} + +void MCore::GC::Collect() +{ +} + +void MCore::GC::Collect(int32 generation) +{ +} + +void MCore::GC::Collect(int32 generation, MGCCollectionMode collectionMode, bool blocking, bool compacting) +{ +} + +int32 MCore::GC::MaxGeneration() +{ + return 0; +} + +void MCore::GC::WaitForPendingFinalizers() +{ +} + +void MCore::GC::WriteRef(void* ptr, MObject* ref) +{ +} + +void MCore::GC::WriteValue(void* dst, void* src, int32 count, const MClass* klass) +{ +} + +void MCore::GC::WriteArrayRef(MArray* dst, MObject* ref, int32 index) +{ +} + +void MCore::GC::WriteArrayRef(MArray* dst, Span refs) +{ +} + +void MCore::Thread::Attach() +{ +} + +void MCore::Thread::Exit() +{ +} + +bool MCore::Thread::IsAttached() +{ + return true; +} + +void MCore::Exception::Throw(MObject* exception) +{ +} + +MObject* MCore::Exception::GetNullReference() +{ + return nullptr; +} + +MObject* MCore::Exception::Get(const char* msg) +{ + return nullptr; +} + +MObject* MCore::Exception::GetArgument(const char* arg, const char* msg) +{ + return nullptr; +} + +MObject* MCore::Exception::GetArgumentNull(const char* arg) +{ + return nullptr; +} + +MObject* MCore::Exception::GetArgumentOutOfRange(const char* arg) +{ + return nullptr; +} + +MObject* MCore::Exception::GetNotSupported(const char* msg) +{ + return nullptr; +} + +const MAssembly::ClassesDictionary& MAssembly::GetClasses() const +{ + _hasCachedClasses = true; + return _classes; +} + +bool MAssembly::LoadCorlib() +{ + return false; +} + +bool MAssembly::LoadImage(const String& assemblyPath, const StringView& nativePath) +{ + _hasCachedClasses = false; + _assemblyPath = assemblyPath; + return false; +} + +bool MAssembly::UnloadImage(bool isReloading) +{ + return false; +} + +bool MAssembly::ResolveMissingFile(String& assemblyPath) const +{ + return true; +} + +MClass::~MClass() +{ + _fields.ClearDelete(); + _properties.ClearDelete(); + _methods.ClearDelete(); + _events.ClearDelete(); +} + +MClass* MClass::GetBaseClass() const +{ + return nullptr; +} + +bool MClass::IsSubClassOf(const MClass* klass, bool checkInterfaces) const +{ + return false; +} + +bool MClass::HasInterface(const MClass* klass) const +{ + return false; +} + +bool MClass::IsInstanceOfType(MObject* object) const +{ + return false; +} + +uint32 MClass::GetInstanceSize() const +{ + return 0; +} + +MMethod* MClass::GetMethod(const char* name, int32 numParams) const +{ + return nullptr; +} + +const Array& MClass::GetMethods() const +{ + _hasCachedMethods = true; + return _methods; +} + +MField* MClass::GetField(const char* name) const +{ + return nullptr; +} + +const Array& MClass::GetFields() const +{ + _hasCachedFields = true; + return _fields; +} + +const Array& MClass::GetEvents() const +{ + _hasCachedEvents = true; + return _events; +} + +MProperty* MClass::GetProperty(const char* name) const +{ + return nullptr; +} + +const Array& MClass::GetProperties() const +{ + _hasCachedProperties = true; + return _properties; +} + +bool MClass::HasAttribute(const MClass* monoClass) const +{ + return false; +} + +bool MClass::HasAttribute() const +{ + return false; +} + +MObject* MClass::GetAttribute(const MClass* monoClass) const +{ + return nullptr; +} + +const Array& MClass::GetAttributes() const +{ + _hasCachedAttributes = true; + return _attributes; +} + +bool MDomain::SetCurrentDomain(bool force) +{ + extern MDomain* MActiveDomain; + MActiveDomain = this; + return true; +} + +void MDomain::Dispatch() const +{ +} + +MMethod* MEvent::GetAddMethod() const +{ + return _addMethod; +} + +MMethod* MEvent::GetRemoveMethod() const +{ + return _removeMethod; +} + +bool MEvent::HasAttribute(MClass* monoClass) const +{ + return false; +} + +bool MEvent::HasAttribute() const +{ + return false; +} + +MObject* MEvent::GetAttribute(MClass* monoClass) const +{ + return nullptr; +} + +const Array& MEvent::GetAttributes() const +{ + return _attributes; +} + +MException::MException(MObject* exception) + : InnerException(nullptr) +{ +} + +MException::~MException() +{ +} + +MType* MField::GetType() const +{ + return nullptr; +} + +int32 MField::GetOffset() const +{ + return 0; +} + +void MField::GetValue(MObject* instance, void* result) const +{ +} + +MObject* MField::GetValueBoxed(MObject* instance) const +{ + return nullptr; +} + +void MField::SetValue(MObject* instance, void* value) const +{ +} + +bool MField::HasAttribute(MClass* monoClass) const +{ + return false; +} + +bool MField::HasAttribute() const +{ + return false; +} + +MObject* MField::GetAttribute(MClass* monoClass) const +{ + return nullptr; +} + +const Array& MField::GetAttributes() const +{ + return _attributes; +} + +MObject* MMethod::Invoke(void* instance, void** params, MObject** exception) const +{ + return nullptr; +} + +MObject* MMethod::InvokeVirtual(MObject* instance, void** params, MObject** exception) const +{ + return nullptr; +} + +MMethod* MMethod::InflateGeneric() const +{ + return nullptr; +} + +MType* MMethod::GetReturnType() const +{ + return nullptr; +} + +int32 MMethod::GetParametersCount() const +{ + return 0; +} + +MType* MMethod::GetParameterType(int32 paramIdx) const +{ + return nullptr; +} + +bool MMethod::GetParameterIsOut(int32 paramIdx) const +{ + return false; +} + +bool MMethod::HasAttribute(MClass* monoClass) const +{ + return false; +} + +bool MMethod::HasAttribute() const +{ + return false; +} + +MObject* MMethod::GetAttribute(MClass* monoClass) const +{ + return nullptr; +} + +const Array& MMethod::GetAttributes() const +{ + return _attributes; +} + +MProperty::~MProperty() +{ + if (_getMethod) + Delete(_getMethod); + if (_setMethod) + Delete(_setMethod); +} + +MMethod* MProperty::GetGetMethod() const +{ + return _getMethod; +} + +MMethod* MProperty::GetSetMethod() const +{ + return _setMethod; +} + +MObject* MProperty::GetValue(MObject* instance, MObject** exception) const +{ + return nullptr; +} + +void MProperty::SetValue(MObject* instance, void* value, MObject** exception) const +{ +} + +bool MProperty::HasAttribute(MClass* monoClass) const +{ + return false; +} + +bool MProperty::HasAttribute() const +{ + return false; +} + +MObject* MProperty::GetAttribute(MClass* monoClass) const +{ + return nullptr; +} + +const Array& MProperty::GetAttributes() const +{ + return _attributes; +} + +#endif diff --git a/Source/Engine/Scripting/Script.cpp b/Source/Engine/Scripting/Script.cpp index 16931b14d..8eaff42de 100644 --- a/Source/Engine/Scripting/Script.cpp +++ b/Source/Engine/Scripting/Script.cpp @@ -3,7 +3,7 @@ #include "Script.h" #include "Engine/Core/Log.h" #if USE_EDITOR -#include "StdTypesContainer.h" +#include "Internal/StdTypesContainer.h" #include "ManagedCLR/MClass.h" #include "Editor/Editor.h" #endif @@ -26,6 +26,7 @@ Script::Script(const SpawnParams& params) , _tickFixedUpdate(false) , _tickUpdate(false) , _tickLateUpdate(false) + , _tickLateFixedUpdate(false) , _wasStartCalled(false) , _wasEnableCalled(false) { @@ -181,6 +182,7 @@ void Script::SetupType() _tickUpdate |= type.Script.ScriptVTable[8] != nullptr; _tickLateUpdate |= type.Script.ScriptVTable[9] != nullptr; _tickFixedUpdate |= type.Script.ScriptVTable[10] != nullptr; + _tickLateFixedUpdate |= type.Script.ScriptVTable[11] != nullptr; } typeHandle = type.GetBaseType(); } diff --git a/Source/Engine/Scripting/Script.h b/Source/Engine/Scripting/Script.h index 2304ea57c..49cba0ec4 100644 --- a/Source/Engine/Scripting/Script.h +++ b/Source/Engine/Scripting/Script.h @@ -19,6 +19,7 @@ protected: int32 _tickFixedUpdate : 1; int32 _tickUpdate : 1; int32 _tickLateUpdate : 1; + int32 _tickLateFixedUpdate : 1; int32 _wasStartCalled : 1; int32 _wasEnableCalled : 1; #if USE_EDITOR @@ -108,6 +109,13 @@ public: { } + /// + /// Called every fixed framerate frame (after FixedUpdate) if object is enabled. + /// + API_FUNCTION(Attributes = "NoAnimate") virtual void OnLateFixedUpdate() + { + } + /// /// Called during drawing debug shapes in editor. Use to draw debug shapes and other visualization. /// diff --git a/Source/Engine/Scripting/Scripting.Build.cs b/Source/Engine/Scripting/Scripting.Build.cs index 31d7b0689..21f4477d0 100644 --- a/Source/Engine/Scripting/Scripting.Build.cs +++ b/Source/Engine/Scripting/Scripting.Build.cs @@ -15,7 +15,25 @@ public class Scripting : EngineModule if (EngineConfiguration.WithCSharp(options)) { - options.PublicDependencies.Add("mono"); + if (EngineConfiguration.WithDotNet(options)) + { + // .NET + options.PrivateDependencies.Add("nethost"); + options.ScriptingAPI.Defines.Add("USE_NETCORE"); + + if (options.Target is EngineTarget engineTarget && engineTarget.UseSeparateMainExecutable(options)) + { + // Build target doesn't support linking again main executable (eg. Linux) thus additional shared library is used for the engine (eg. libFlaxEditor.so) + var fileName = options.Platform.GetLinkOutputFileName(engineTarget.OutputName, LinkerOutput.SharedLibrary); + options.CompileEnv.PreprocessorDefinitions.Add("MCORE_MAIN_MODULE_NAME=" + fileName); + } + } + else + { + // Mono + options.PrivateDependencies.Add("mono"); + options.ScriptingAPI.Defines.Add("USE_MONO"); + } } options.PrivateDependencies.Add("Utilities"); diff --git a/Source/Engine/Scripting/Scripting.Internal.cpp b/Source/Engine/Scripting/Scripting.Internal.cpp deleted file mode 100644 index 7c531dd4e..000000000 --- a/Source/Engine/Scripting/Scripting.Internal.cpp +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. - -#include "Scripting.h" -#include "ScriptingType.h" -#include "FlaxEngine.Gen.h" -#include "Engine/Scripting/InternalCalls.h" -#include "Engine/Scripting/BinaryModule.h" -#include "Engine/Scripting/ManagedCLR/MAssembly.h" -#include "Engine/Scripting/ManagedCLR/MUtils.h" -#include "Engine/Core/ObjectsRemovalService.h" -#include "Engine/Profiler/Profiler.h" -#if TRACY_ENABLE && !PROFILE_CPU_USE_TRANSIENT_DATA -#include "Engine/Core/Collections/ChunkedArray.h" -#endif -#include "Engine/Core/Types/Pair.h" -#include "Engine/Threading/Threading.h" -#if USE_MONO -#include -#endif - -#if USE_MONO - -namespace ProfilerInternal -{ -#if COMPILE_WITH_PROFILER - Array> ManagedEventsGPU; -#if TRACY_ENABLE && !PROFILE_CPU_USE_TRANSIENT_DATA - CriticalSection ManagedSourceLocationsLocker; - - struct Location - { - String Name; - StringAnsi NameAnsi; - tracy::SourceLocationData SrcLocation; - }; - - ChunkedArray ManagedSourceLocations; -#endif -#endif - - void BeginEvent(MonoString* nameObj) - { -#if COMPILE_WITH_PROFILER - const StringView name((const Char*)mono_string_chars(nameObj), mono_string_length(nameObj)); - ProfilerCPU::BeginEvent(*name); -#if TRACY_ENABLE -#if PROFILE_CPU_USE_TRANSIENT_DATA - tracy::ScopedZone::Begin(__LINE__, __FILE__, strlen( __FILE__ ), __FUNCTION__, strlen( __FUNCTION__ ), name.Get(), name.Length() ); -#else - ScopeLock lock(ManagedSourceLocationsLocker); - tracy::SourceLocationData* srcLoc = nullptr; - for (auto e = ManagedSourceLocations.Begin(); e.IsNotEnd(); ++e) - { - if (name == e->Name) - { - srcLoc = &e->SrcLocation; - break; - } - } - if (!srcLoc) - { - auto& e = ManagedSourceLocations.AddOne(); - e.Name = name; - e.NameAnsi = name.Get(); - srcLoc = &e.SrcLocation; - srcLoc->name = e.NameAnsi.Get(); - srcLoc->function = nullptr; - srcLoc->file = nullptr; - srcLoc->line = 0; - srcLoc->color = 0; - } - //static constexpr tracy::SourceLocationData tracySrcLoc{ nullptr, __FUNCTION__, __FILE__, (uint32_t)__LINE__, 0 }; - tracy::ScopedZone::Begin(srcLoc); -#endif -#endif -#endif - } - - void EndEvent() - { -#if COMPILE_WITH_PROFILER -#if TRACY_ENABLE - tracy::ScopedZone::End(); -#endif - ProfilerCPU::EndEvent(); -#endif - } - - void BeginEventGPU(MonoString* nameObj) - { -#if COMPILE_WITH_PROFILER - const auto index = ProfilerGPU::BeginEvent((const Char*)mono_string_chars(nameObj)); - ManagedEventsGPU.Push(index); -#endif - } - - void EndEventGPU() - { -#if COMPILE_WITH_PROFILER - const auto index = ManagedEventsGPU.Pop(); - ProfilerGPU::EndEvent(index); -#endif - } -} - -#endif - -class ScriptingInternal -{ -public: -#if USE_MONO - static bool HasGameModulesLoaded() - { - return Scripting::HasGameModulesLoaded(); - } - - static bool IsTypeFromGameScripts(MonoReflectionType* type) - { - return Scripting::IsTypeFromGameScripts(Scripting::FindClass(MUtils::GetClass(type))); - } - - static void FlushRemovedObjects() - { - ASSERT(IsInMainThread()); - ObjectsRemovalService::Flush(); - } -#endif - - static void InitRuntime() - { -#if USE_MONO - // Scripting API - ADD_INTERNAL_CALL("FlaxEngine.Scripting::HasGameModulesLoaded", &HasGameModulesLoaded); - ADD_INTERNAL_CALL("FlaxEngine.Scripting::IsTypeFromGameScripts", &IsTypeFromGameScripts); - ADD_INTERNAL_CALL("FlaxEngine.Scripting::FlushRemovedObjects", &FlushRemovedObjects); - - // Profiler API - ADD_INTERNAL_CALL("FlaxEngine.Profiler::BeginEvent", &ProfilerInternal::BeginEvent); - ADD_INTERNAL_CALL("FlaxEngine.Profiler::EndEvent", &ProfilerInternal::EndEvent); - ADD_INTERNAL_CALL("FlaxEngine.Profiler::BeginEventGPU", &ProfilerInternal::BeginEventGPU); - ADD_INTERNAL_CALL("FlaxEngine.Profiler::EndEventGPU", &ProfilerInternal::EndEventGPU); -#endif - } -}; - -IMPLEMENT_SCRIPTING_TYPE_NO_SPAWN(Scripting, FlaxEngine, "FlaxEngine.Scripting", nullptr, nullptr); diff --git a/Source/Engine/Scripting/Scripting.cpp b/Source/Engine/Scripting/Scripting.cpp index f1ac6922b..046e5c6b0 100644 --- a/Source/Engine/Scripting/Scripting.cpp +++ b/Source/Engine/Scripting/Scripting.cpp @@ -2,7 +2,6 @@ #include "BinaryModule.h" #include "Scripting.h" -#include "StdTypesContainer.h" #include "ScriptingType.h" #include "FlaxEngine.Gen.h" #include "Engine/Threading/Threading.h" @@ -20,7 +19,8 @@ #include "ManagedCLR/MMethod.h" #include "ManagedCLR/MDomain.h" #include "ManagedCLR/MCore.h" -#include "MException.h" +#include "ManagedCLR/MException.h" +#include "Internal/StdTypesContainer.h" #include "Engine/Core/ObjectsRemovalService.h" #include "Engine/Core/Types/TimeSpan.h" #include "Engine/Profiler/ProfilerCPU.h" @@ -29,11 +29,8 @@ #include "Engine/Engine/EngineService.h" #include "Engine/Engine/Globals.h" #include "Engine/Graphics/RenderTask.h" +#include "Engine/Platform/MemoryStats.h" #include "Engine/Serialization/JsonTools.h" -#if USE_MONO -#include -#include -#endif extern void registerFlaxEngineInternalCalls(); @@ -49,6 +46,7 @@ public: void Update() override; void LateUpdate() override; void FixedUpdate() override; + void LateFixedUpdate() override; void Draw() override; void BeforeExit() override; void Dispose() override; @@ -103,6 +101,7 @@ namespace MMethod* _method_Update = nullptr; MMethod* _method_LateUpdate = nullptr; MMethod* _method_FixedUpdate = nullptr; + MMethod* _method_LateFixedUpdate = nullptr; MMethod* _method_Draw = nullptr; MMethod* _method_Exit = nullptr; Array> _nonNativeModules; @@ -137,7 +136,7 @@ bool ScriptingService::Init() // Initialize managed runtime if (MCore::LoadEngine()) { - LOG(Fatal, "Mono initialization failed."); + LOG(Fatal, "C# runtime initialization failed."); return true; } @@ -198,35 +197,36 @@ bool ScriptingService::Init() void ScriptingService::Update() { PROFILE_CPU_NAMED("Scripting::Update"); - INVOKE_EVENT(Update); } void ScriptingService::LateUpdate() { PROFILE_CPU_NAMED("Scripting::LateUpdate"); - INVOKE_EVENT(LateUpdate); } void ScriptingService::FixedUpdate() { PROFILE_CPU_NAMED("Scripting::FixedUpdate"); - INVOKE_EVENT(FixedUpdate); } +void ScriptingService::LateFixedUpdate() +{ + PROFILE_CPU_NAMED("Scripting::LateFixedUpdate"); + INVOKE_EVENT(LateFixedUpdate); +} + void ScriptingService::Draw() { PROFILE_CPU_NAMED("Scripting::Draw"); - INVOKE_EVENT(Draw); } void ScriptingService::BeforeExit() { PROFILE_CPU_NAMED("Scripting::BeforeExit"); - INVOKE_EVENT(Exit); } @@ -353,10 +353,18 @@ bool Scripting::LoadBinaryModules(const String& path, const String& projectFolde { // Load library const auto startTime = DateTime::NowUTC(); -#if PLATFORM_ANDROID - // On Android all native binaries are side-by-side with the app - nativePath = StringUtils::GetDirectoryName(Platform::GetExecutableFilePath()); - nativePath /= StringUtils::GetFileName(nativePath); +#if PLATFORM_ANDROID || PLATFORM_MAC + // On some platforms all native binaries are side-by-side with the app in a different folder + if (!FileSystem::FileExists(nativePath)) + { + nativePath = String(StringUtils::GetDirectoryName(Platform::GetExecutableFilePath())) / StringUtils::GetFileName(nativePath); + } +#elif PLATFORM_IOS + // iOS uses Frameworks folder with native binaries + if (!FileSystem::FileExists(nativePath)) + { + nativePath = Globals::ProjectFolder / TEXT("Frameworks") / StringUtils::GetFileName(nativePath); + } #endif auto library = Platform::LoadLibrary(nativePath.Get()); if (!library) @@ -394,7 +402,7 @@ bool Scripting::LoadBinaryModules(const String& path, const String& projectFolde else { // Create module if native library is not used - module = New(nameAnsi, MAssemblyOptions()); + module = New(nameAnsi); _nonNativeModules.Add(module); } } @@ -403,7 +411,7 @@ bool Scripting::LoadBinaryModules(const String& path, const String& projectFolde // C# if (managedPath.HasChars() && !((ManagedBinaryModule*)module)->Assembly->IsLoaded()) { - if (((ManagedBinaryModule*)module)->Assembly->Load(managedPath)) + if (((ManagedBinaryModule*)module)->Assembly->Load(managedPath, nativePath)) { LOG(Error, "Failed to load C# assembly '{0}' for binary module {1}.", managedPath, name); return true; @@ -424,13 +432,46 @@ bool Scripting::Load() // Note: this action can be called from main thread (due to Mono problems with assemblies actions from other threads) ASSERT(IsInMainThread()); -#if !COMPILE_WITHOUT_CSHARP +#if USE_CSHARP // Load C# core assembly - if (GetBinaryModuleCorlib()->Assembly->Load(mono_get_corlib())) + ManagedBinaryModule* corlib = GetBinaryModuleCorlib(); + if (corlib->Assembly->LoadCorlib()) { LOG(Error, "Failed to load corlib C# assembly."); return true; } + + // Initialize C# corelib types + { + const auto& corlibClasses = corlib->Assembly->GetClasses(); + bool gotAll = true; +#define CACHE_CORLIB_CLASS(var, name) gotAll &= corlibClasses.TryGet(StringAnsiView(name), MCore::TypeCache::var) + CACHE_CORLIB_CLASS(Void, "System.Void"); + CACHE_CORLIB_CLASS(Object, "System.Object"); + CACHE_CORLIB_CLASS(Byte, "System.Byte"); + CACHE_CORLIB_CLASS(Boolean, "System.Boolean"); + CACHE_CORLIB_CLASS(SByte, "System.SByte"); + CACHE_CORLIB_CLASS(Char, "System.Char"); + CACHE_CORLIB_CLASS(Int16, "System.Int16"); + CACHE_CORLIB_CLASS(UInt16, "System.UInt16"); + CACHE_CORLIB_CLASS(Int32, "System.Int32"); + CACHE_CORLIB_CLASS(UInt32, "System.UInt32"); + CACHE_CORLIB_CLASS(Int64, "System.Int64"); + CACHE_CORLIB_CLASS(UInt64, "System.UInt64"); + CACHE_CORLIB_CLASS(IntPtr, "System.IntPtr"); + CACHE_CORLIB_CLASS(UIntPtr, "System.UIntPtr"); + CACHE_CORLIB_CLASS(Single, "System.Single"); + CACHE_CORLIB_CLASS(Double, "System.Double"); + CACHE_CORLIB_CLASS(String, "System.String"); +#undef CACHE_CORLIB_CLASS + if (!gotAll) + { + LOG(Error, "Failed to load corlib C# assembly."); + for (const auto& e : corlibClasses) + LOG(Info, "Class: {0}", String(e.Value->GetFullName())); + return true; + } + } #endif // Load FlaxEngine @@ -630,6 +671,7 @@ void Scripting::Reload(bool canTriggerSceneReload) modules.Clear(); _nonNativeModules.ClearDelete(); _hasGameModulesLoaded = false; + MCore::OnMidHotReload(); // Give GC a try to cleanup old user objects and the other mess MCore::GC::Collect(); @@ -666,48 +708,6 @@ MClass* Scripting::FindClass(const StringAnsiView& fullname) return nullptr; } -#if USE_MONO - -MClass* Scripting::FindClass(MonoClass* monoClass) -{ - if (monoClass == nullptr) - return nullptr; - PROFILE_CPU(); - auto& modules = BinaryModule::GetModules(); - for (auto module : modules) - { - auto managedModule = dynamic_cast(module); - if (managedModule && managedModule->Assembly->IsLoaded()) - { - MClass* result = managedModule->Assembly->GetClass(monoClass); - if (result != nullptr) - return result; - } - } - return nullptr; -} - -MonoClass* Scripting::FindClassNative(const StringAnsiView& fullname) -{ - if (fullname.IsEmpty()) - return nullptr; - PROFILE_CPU(); - auto& modules = BinaryModule::GetModules(); - for (auto module : modules) - { - auto managedModule = dynamic_cast(module); - if (managedModule && managedModule->Assembly->IsLoaded()) - { - MClass* result = managedModule->Assembly->GetClass(fullname); - if (result != nullptr) - return result->GetNative(); - } - } - return nullptr; -} - -#endif - ScriptingTypeHandle Scripting::FindScriptingType(const StringAnsiView& fullname) { if (fullname.IsEmpty()) @@ -749,21 +749,20 @@ ScriptingObject* Scripting::NewObject(const MClass* type) LOG(Error, "Invalid type."); return nullptr; } -#if USE_MONO +#if USE_CSHARP // Get the assembly with that class - MonoClass* typeClass = type->GetNative(); - auto module = ManagedBinaryModule::FindModule(typeClass); + auto module = ManagedBinaryModule::FindModule(type); if (module == nullptr) { - LOG(Error, "Cannot find scripting assembly for type \'{0}.{1}\'.", String(mono_class_get_namespace(typeClass)), String(mono_class_get_name(typeClass))); + LOG(Error, "Cannot find scripting assembly for type \'{0}\'.", String(type->GetFullName())); return nullptr; } // Try to find the scripting type for this class int32 typeIndex; - if (!module->ClassToTypeIndex.TryGet(typeClass, typeIndex)) + if (!module->ClassToTypeIndex.TryGet(type, typeIndex)) { - LOG(Error, "Cannot spawn objects of type \'{0}.{1}\'.", String(mono_class_get_namespace(typeClass)), String(mono_class_get_name(typeClass))); + LOG(Error, "Cannot spawn objects of type \'{0}\'.", String(type->GetFullName())); return nullptr; } const ScriptingType& scriptingType = module->Types[typeIndex]; diff --git a/Source/Engine/Scripting/Scripting.cs b/Source/Engine/Scripting/Scripting.cs index fcf86d3c8..7a91b2d96 100644 --- a/Source/Engine/Scripting/Scripting.cs +++ b/Source/Engine/Scripting/Scripting.cs @@ -4,10 +4,14 @@ using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Globalization; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.Marshalling; using System.Threading; using System.Threading.Tasks; using FlaxEngine.GUI; +using FlaxEngine.Interop; namespace FlaxEngine { @@ -65,7 +69,7 @@ namespace FlaxEngine /// /// C# scripting service. /// - public static class Scripting + public static partial class Scripting { private static readonly List UpdateActions = new List(); private static readonly MainThreadTaskScheduler MainThreadTaskScheduler = new MainThreadTaskScheduler(); @@ -76,17 +80,22 @@ namespace FlaxEngine public static event Action Update; /// - /// Occurs on scripting 'late' update. + /// Occurs on scripting late update. /// public static event Action LateUpdate; /// - /// Occurs on scripting `fixed` update. + /// Occurs on scripting fixed update. /// public static event Action FixedUpdate; /// - /// Occurs on scripting `draw` update. Called during frame rendering and can be used to invoke custom rendering with GPUDevice. + /// Occurs on scripting late fixed update. + /// + public static event Action LateFixedUpdate; + + /// + /// Occurs on scripting draw update. Called during frame rendering and can be used to invoke custom rendering with GPUDevice. /// public static event Action Draw; @@ -201,12 +210,44 @@ namespace FlaxEngine internal static object[] GetDictionaryKeys(IDictionary dictionary) { + if (dictionary == null) + return null; var keys = dictionary.Keys; var result = new object[keys.Count]; keys.CopyTo(result, 0); return result; } + internal static ManagedHandle VersionToManaged(int major, int minor, int build, int revision) + { + Version version = new Version(major, minor, Math.Max(build, 0), Math.Max(revision, 0)); + return ManagedHandle.Alloc(version); + } + + internal static ManagedHandle CultureInfoToManaged(int lcid) + { + return ManagedHandle.Alloc(new CultureInfo(lcid)); + } + + internal static void VersionToNative(ManagedHandle versionHandle, IntPtr nativePtr) + { + Version version = Unsafe.As(versionHandle.Target); + if (version != null) + { + Marshal.WriteInt32(nativePtr, 0, version.Major); + Marshal.WriteInt32(nativePtr, 4, version.Minor); + Marshal.WriteInt32(nativePtr, 8, version.Build); + Marshal.WriteInt32(nativePtr, 12, version.Revision); + } + else + { + Marshal.WriteInt32(nativePtr, 0, 0); + Marshal.WriteInt32(nativePtr, 4, 0); + Marshal.WriteInt32(nativePtr, 8, -1); + Marshal.WriteInt32(nativePtr, 12, -1); + } + } + private static void CreateGuiStyle() { var style = new Style @@ -266,6 +307,11 @@ namespace FlaxEngine FixedUpdate?.Invoke(); } + internal static void Internal_LateFixedUpdate() + { + LateFixedUpdate?.Invoke(); + } + internal static void Internal_Draw() { Draw?.Invoke(); @@ -283,21 +329,23 @@ namespace FlaxEngine /// Returns true if game scripts assembly has been loaded. /// /// True if game scripts assembly is loaded, otherwise false. - [MethodImpl(MethodImplOptions.InternalCall)] - public static extern bool HasGameModulesLoaded(); + [LibraryImport("FlaxEngine", EntryPoint = "ScriptingInternal_HasGameModulesLoaded", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalAs(UnmanagedType.U1)] + public static partial bool HasGameModulesLoaded(); /// /// Returns true if given type is from one of the game scripts assemblies. /// /// True if the type is from game assembly, otherwise false. - [MethodImpl(MethodImplOptions.InternalCall)] - public static extern bool IsTypeFromGameScripts(Type type); + [LibraryImport("FlaxEngine", EntryPoint = "ScriptingInternal_IsTypeFromGameScripts", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + [return: MarshalAs(UnmanagedType.U1)] + public static partial bool IsTypeFromGameScripts([MarshalUsing(typeof(SystemTypeMarshaller))] Type type); /// /// Flushes the removed objects (disposed objects using Object.Destroy). /// - [MethodImpl(MethodImplOptions.InternalCall)] - public static extern void FlushRemovedObjects(); + [LibraryImport("FlaxEngine", EntryPoint = "ScriptingInternal_FlushRemovedObjects", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + public static partial void FlushRemovedObjects(); } /// @@ -306,32 +354,32 @@ namespace FlaxEngine /// /// Profiler is available in the editor and Debug/Development builds. Release builds don't have profiling tools. /// - public static class Profiler + public static partial class Profiler { /// /// Begins profiling a piece of code with a custom label. /// /// The name of the event. - [MethodImpl(MethodImplOptions.InternalCall)] - public static extern void BeginEvent(string name); + [LibraryImport("FlaxEngine", EntryPoint = "ProfilerInternal_BeginEvent", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + public static partial void BeginEvent(string name); /// /// Ends profiling an event. /// - [MethodImpl(MethodImplOptions.InternalCall)] - public static extern void EndEvent(); + [LibraryImport("FlaxEngine", EntryPoint = "ProfilerInternal_EndEvent", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + public static partial void EndEvent(); /// /// Begins GPU profiling a piece of code with a custom label. /// /// The name of the event. - [MethodImpl(MethodImplOptions.InternalCall)] - public static extern void BeginEventGPU(string name); + [LibraryImport("FlaxEngine", EntryPoint = "ProfilerInternal_BeginEventGPU", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + public static partial void BeginEventGPU(string name); /// /// Ends GPU profiling an event. /// - [MethodImpl(MethodImplOptions.InternalCall)] - public static extern void EndEventGPU(); + [LibraryImport("FlaxEngine", EntryPoint = "ProfilerInternal_EndEventGPU", StringMarshalling = StringMarshalling.Custom, StringMarshallingCustomType = typeof(StringMarshaller))] + public static partial void EndEventGPU(); } } diff --git a/Source/Engine/Scripting/Scripting.h b/Source/Engine/Scripting/Scripting.h index 0d12737cd..cc2bdadf1 100644 --- a/Source/Engine/Scripting/Scripting.h +++ b/Source/Engine/Scripting/Scripting.h @@ -86,22 +86,6 @@ public: /// The MClass object or null if missing. static MClass* FindClass(const StringAnsiView& fullname); -#if USE_MONO - /// - /// Finds the class from the given Mono class object within whole assembly. - /// - /// The Mono class. - /// The MClass object or null if missing. - static MClass* FindClass(MonoClass* monoClass); - - /// - /// Finds the native class with given fully qualified name within whole assembly. - /// - /// The full name of the type eg: System.Int64. - /// The MClass object or null if missing. - static MonoClass* FindClassNative(const StringAnsiView& fullname); -#endif - /// /// Finds the scripting type of the given fullname by searching loaded scripting assemblies. /// diff --git a/Source/Engine/Scripting/ScriptingObject.cpp b/Source/Engine/Scripting/ScriptingObject.cpp index c199acd47..318f1e36f 100644 --- a/Source/Engine/Scripting/ScriptingObject.cpp +++ b/Source/Engine/Scripting/ScriptingObject.cpp @@ -3,7 +3,6 @@ #include "ScriptingObject.h" #include "Scripting.h" #include "BinaryModule.h" -#include "InternalCalls.h" #include "Engine/Level/Actor.h" #include "Engine/Core/Log.h" #include "Engine/Utilities/StringConverter.h" @@ -15,11 +14,8 @@ #include "ManagedCLR/MUtils.h" #include "ManagedCLR/MField.h" #include "ManagedCLR/MCore.h" +#include "Internal/InternalCalls.h" #include "FlaxEngine.Gen.h" -#if USE_MONO -#include -#include -#endif #define ScriptingObject_unmanagedPtr "__unmanagedPtr" #define ScriptingObject_id "__internalId" @@ -68,9 +64,13 @@ ScriptingObject* ScriptingObject::NewObject(const ScriptingTypeHandle& typeHandl MObject* ScriptingObject::GetManagedInstance() const { -#if USE_MONO - const int32 handle = Platform::AtomicRead((int32*)&_gcHandle); - return handle ? mono_gchandle_get_target(handle) : nullptr; +#if USE_NETCORE + const MGCHandle handle = Platform::AtomicRead((int64*)&_gcHandle); +#elif USE_MONO + const MGCHandle handle = Platform::AtomicRead((int32*)&_gcHandle); +#endif +#if USE_CSHARP + return handle ? MCore::GCHandle::GetTarget(handle) : nullptr; #else return nullptr; #endif @@ -176,13 +176,13 @@ void* ScriptingObject::ToInterface(ScriptingObject* obj, const ScriptingTypeHand ScriptingObject* ScriptingObject::ToNative(MObject* obj) { ScriptingObject* ptr = nullptr; -#if USE_MONO +#if USE_CSHARP if (obj) { // TODO: cache the field offset from object and read directly from object pointer - const auto ptrField = mono_class_get_field_from_name(mono_object_get_class(obj), ScriptingObject_unmanagedPtr); + const auto ptrField = MCore::Object::GetClass(obj)->GetField(ScriptingObject_unmanagedPtr); CHECK_RETURN(ptrField, nullptr); - mono_field_get_value(obj, ptrField, &ptr); + ptrField->GetValue(obj, &ptr); } #endif return ptr; @@ -217,13 +217,23 @@ void ScriptingObject::ChangeID(const Guid& newId) _type.GetType().Module->OnObjectIdChanged(this, prevId); } +void ScriptingObject::SetManagedInstance(MObject* instance) +{ + ASSERT(_gcHandle == 0); +#if USE_NETCORE + _gcHandle = (MGCHandle)instance; +#elif !COMPILE_WITHOUT_CSHARP + _gcHandle = MCore::GCHandle::New(instance); +#endif +} + void ScriptingObject::OnManagedInstanceDeleted() { // Release the handle if (_gcHandle) { -#if USE_MONO - mono_gchandle_free(_gcHandle); +#if USE_CSHARP + MCore::GCHandle::Free(_gcHandle); #endif _gcHandle = 0; } @@ -243,15 +253,21 @@ void ScriptingObject::OnScriptingDispose() bool ScriptingObject::CreateManaged() { -#if USE_MONO - MonoObject* managedInstance = CreateManagedInternal(); +#if USE_CSHARP + MObject* managedInstance = CreateManagedInternal(); if (!managedInstance) return true; - // Prevent form object GC destruction - auto handle = mono_gchandle_new(managedInstance, false); + // Prevent from object GC destruction +#if USE_NETCORE + auto handle = (MGCHandle)managedInstance; + auto oldHandle = Platform::InterlockedCompareExchange((int64*)&_gcHandle, *(int64*)&handle, 0); + if (*(uint64*)&oldHandle != 0) +#else + auto handle = MCore::GCHandle::New(managedInstance, false); auto oldHandle = Platform::InterlockedCompareExchange((int32*)&_gcHandle, *(int32*)&handle, 0); if (*(uint32*)&oldHandle != 0) +#endif { // Other thread already created the object before if (const auto monoClass = GetClass()) @@ -264,7 +280,7 @@ bool ScriptingObject::CreateManaged() monoUnmanagedPtrField->SetValue(managedInstance, ¶m); } } - mono_gchandle_free(handle); + MCore::GCHandle::Free(handle); return true; } #endif @@ -276,9 +292,9 @@ bool ScriptingObject::CreateManaged() return false; } -#if USE_MONO +#if USE_CSHARP -MonoObject* ScriptingObject::CreateManagedInternal() +MObject* ScriptingObject::CreateManagedInternal() { // Get class MClass* monoClass = GetClass(); @@ -289,15 +305,10 @@ MonoObject* ScriptingObject::CreateManagedInternal() } // Ensure to have managed domain attached (this can be called from custom native thread, eg. content loader) - auto domain = mono_domain_get(); - if (!domain) - { - MCore::AttachThread(); - domain = mono_domain_get(); - } + MCore::Thread::Attach(); // Allocate managed instance - MonoObject* managedInstance = mono_object_new(domain, monoClass->GetNative()); + MObject* managedInstance = MCore::Object::New(monoClass); if (managedInstance == nullptr) { LOG(Warning, "Failed to create new instance of the object of type {0}", String(monoClass->GetFullName())); @@ -319,7 +330,7 @@ MonoObject* ScriptingObject::CreateManagedInternal() } // Initialize managed instance (calls constructor) - mono_runtime_object_init(managedInstance); + MCore::Object::Init(managedInstance); return managedInstance; } @@ -328,7 +339,7 @@ MonoObject* ScriptingObject::CreateManagedInternal() void ScriptingObject::DestroyManaged() { -#if USE_MONO +#if USE_CSHARP // Get managed instance const auto managedInstance = GetManagedInstance(); @@ -349,7 +360,7 @@ void ScriptingObject::DestroyManaged() // Clear the handle if (_gcHandle) { - mono_gchandle_free(_gcHandle); + MCore::GCHandle::Free(_gcHandle); _gcHandle = 0; } #else @@ -387,30 +398,12 @@ bool ScriptingObject::CanCast(const MClass* from, const MClass* to) #if PLATFORM_LINUX || PLATFORM_MAC // Cannot enter GC unsafe region if the thread is not attached - MCore::AttachThread(); + MCore::Thread::Attach(); #endif return from->IsSubClassOf(to); } -#if USE_MONO - -bool ScriptingObject::CanCast(const MClass* from, const MonoClass* to) -{ - if (!from && !to) - return true; - CHECK_RETURN(from && to, false); - -#if PLATFORM_LINUX - // Cannot enter GC unsafe region if the thread is not attached - MCore::AttachThread(); -#endif - - return from->IsSubClassOf(to); -} - -#endif - void ScriptingObject::OnDeleteObject() { // Cleanup managed object @@ -434,6 +427,16 @@ ManagedScriptingObject::ManagedScriptingObject(const SpawnParams& params) { } +void ManagedScriptingObject::SetManagedInstance(MObject* instance) +{ + ASSERT(_gcHandle == 0); +#if USE_NETCORE + _gcHandle = (MGCHandle)instance; +#elif !COMPILE_WITHOUT_CSHARP + _gcHandle = MCore::GCHandle::NewWeak(instance); +#endif +} + void ManagedScriptingObject::OnManagedInstanceDeleted() { // Base @@ -454,15 +457,21 @@ void ManagedScriptingObject::OnScriptingDispose() bool ManagedScriptingObject::CreateManaged() { -#if USE_MONO - MonoObject* managedInstance = CreateManagedInternal(); +#if USE_CSHARP + MObject* managedInstance = CreateManagedInternal(); if (!managedInstance) return true; // Cache the GC handle to the object (used to track the target object because it can be moved in a memory) - auto handle = mono_gchandle_new_weakref(managedInstance, false); +#if USE_NETCORE + auto handle = (MGCHandle)managedInstance; + auto oldHandle = Platform::InterlockedCompareExchange((int64*)&_gcHandle, *(int64*)&handle, 0); + if (*(uint64*)&oldHandle != 0) +#else + auto handle = MCore::GCHandle::NewWeak(managedInstance, false); auto oldHandle = Platform::InterlockedCompareExchange((int32*)&_gcHandle, *(int32*)&handle, 0); if (*(uint32*)&oldHandle != 0) +#endif { // Other thread already created the object before if (const auto monoClass = GetClass()) @@ -475,7 +484,7 @@ bool ManagedScriptingObject::CreateManaged() monoUnmanagedPtrField->SetValue(managedInstance, ¶m); } } - mono_gchandle_free(handle); + MCore::GCHandle::Free(handle); return true; } #endif @@ -492,284 +501,275 @@ PersistentScriptingObject::PersistentScriptingObject(const SpawnParams& params) { } +#if USE_CSHARP + +DEFINE_INTERNAL_CALL(MObject*) ObjectInternal_Create1(MTypeObject* type) +{ + // Peek class for that type (handle generic class cases) + if (!type) + DebugLog::ThrowArgumentNull("type"); + MType* mType = INTERNAL_TYPE_OBJECT_GET(type); + const MTypes mTypeType = MCore::Type::GetType(mType); + if (mTypeType == MTypes::GenericInst) + { + LOG(Error, "Generic scripts are not supported."); + return nullptr; + } + MClass* typeClass = MCore::Type::GetClass(mType); + if (typeClass == nullptr) + { + LOG(Error, "Invalid type."); + return nullptr; + } + + // Get the assembly with that class + auto module = ManagedBinaryModule::FindModule(typeClass); + if (module == nullptr) + { + LOG(Error, "Cannot find scripting assembly for type \'{0}\'.", String(typeClass->GetFullName())); + return nullptr; + } + + // Try to find the scripting type for this class + int32 typeIndex; + if (!module->ClassToTypeIndex.TryGet(typeClass, typeIndex)) + { + LOG(Error, "Cannot spawn objects of type \'{0}\'.", String(typeClass->GetFullName())); + return nullptr; + } + const ScriptingType& scriptingType = module->Types[typeIndex]; + + // Create unmanaged object + const ScriptingObjectSpawnParams params(Guid::New(), ScriptingTypeHandle(module, typeIndex)); + ScriptingObject* obj = scriptingType.Script.Spawn(params); + if (obj == nullptr) + { + LOG(Error, "Failed to spawn object of type \'{0}\'.", String(typeClass->GetFullName())); + return nullptr; + } + + // Set default name for actors + if (auto* actor = dynamic_cast(obj)) + { + actor->SetName(String(typeClass->GetName())); + } + + // Create managed object + obj->CreateManaged(); + MObject* managedInstance = obj->GetManagedInstance(); + if (managedInstance == nullptr) + { + LOG(Error, "Cannot create managed instance for type \'{0}\'.", String(typeClass->GetFullName())); + Delete(obj); + } + + return managedInstance; +} + +DEFINE_INTERNAL_CALL(MObject*) ObjectInternal_Create2(MString* typeNameObj) +{ + // Get typename + if (typeNameObj == nullptr) + DebugLog::ThrowArgumentNull("typeName"); + const StringView typeNameChars = MCore::String::GetChars(typeNameObj); + const StringAsANSI<100> typeNameData(typeNameChars.Get(), typeNameChars.Length()); + const StringAnsiView typeName(typeNameData.Get(), typeNameChars.Length()); + + // Try to find the scripting type for this typename + const ScriptingTypeHandle type = Scripting::FindScriptingType(typeName); + if (!type) + { + LOG(Error, "Cannot find scripting type for \'{0}\'.", String(typeName)); + return nullptr; + } + + // Create unmanaged object + const ScriptingObjectSpawnParams params(Guid::New(), type); + ScriptingObject* obj = type.GetType().Script.Spawn(params); + if (obj == nullptr) + { + LOG(Error, "Failed to spawn object of type \'{0}\'.", String(typeName)); + return nullptr; + } + + // Create managed object + obj->CreateManaged(); + MObject* managedInstance = obj->GetManagedInstance(); + if (managedInstance == nullptr) + { + LOG(Error, "Cannot create managed instance for type \'{0}\'.", String(typeName)); + Delete(obj); + } + + return managedInstance; +} + +DEFINE_INTERNAL_CALL(void) ObjectInternal_ManagedInstanceCreated(MObject* managedInstance) +{ + MClass* typeClass = MCore::Object::GetClass(managedInstance); + + // Get the assembly with that class + auto module = ManagedBinaryModule::FindModule(typeClass); + if (module == nullptr) + { + LOG(Error, "Cannot find scripting assembly for type \'{0}\'.", String(typeClass->GetFullName())); + return; + } + + // Try to find the scripting type for this class + int32 typeIndex; + if (!module->ClassToTypeIndex.TryGet(typeClass, typeIndex)) + { + LOG(Error, "Cannot spawn objects of type \'{0}\'.", String(typeClass->GetFullName())); + return; + } + const ScriptingType& scriptingType = module->Types[typeIndex]; + + // Create unmanaged object + const ScriptingObjectSpawnParams params(Guid::New(), ScriptingTypeHandle(module, typeIndex)); + ScriptingObject* obj = scriptingType.Script.Spawn(params); + if (obj == nullptr) + { + LOG(Error, "Failed to spawn object of type \'{0}\'.", String(typeClass->GetFullName())); + return; + } + + // Link created managed instance to the unmanaged object + obj->SetManagedInstance(managedInstance); + + // Set default name for actors + if (auto* actor = dynamic_cast(obj)) + { + actor->SetName(String(typeClass->GetName())); + } + + MClass* monoClass = obj->GetClass(); + + // Set handle to unmanaged object + const MField* monoUnmanagedPtrField = monoClass->GetField(ScriptingObject_unmanagedPtr); + if (monoUnmanagedPtrField) + { + const void* value = obj; + monoUnmanagedPtrField->SetValue(managedInstance, &value); + } + + // Set object id + const MField* monoIdField = monoClass->GetField(ScriptingObject_id); + if (monoIdField) + { + const Guid id = obj->GetID(); + monoIdField->SetValue(managedInstance, (void*)&id); + } + + // Register object + if (!obj->IsRegistered()) + obj->RegisterObject(); +} + +DEFINE_INTERNAL_CALL(void) ObjectInternal_ManagedInstanceDeleted(ScriptingObject* obj) +{ + Scripting::OnManagedInstanceDeleted(obj); +} + +DEFINE_INTERNAL_CALL(void) ObjectInternal_Destroy(ScriptingObject* obj, float timeLeft) +{ + // Use scaled game time for removing actors/scripts by the user (maybe expose it to the api?) + const bool useGameTime = timeLeft > ZeroTolerance; + + if (obj) + obj->DeleteObject(timeLeft, useGameTime); +} + +DEFINE_INTERNAL_CALL(MString*) ObjectInternal_GetTypeName(ScriptingObject* obj) +{ + INTERNAL_CALL_CHECK_RETURN(obj, nullptr); + return MUtils::ToString(obj->GetType().Fullname); +} + +DEFINE_INTERNAL_CALL(MObject*) ObjectInternal_FindObject(Guid* id, MTypeObject* type) +{ + if (!id->IsValid()) + return nullptr; + MClass* klass = MUtils::GetClass(type); + ScriptingObject* obj = Scripting::TryFindObject(*id); + if (!obj) + { + if (!klass || klass == ScriptingObject::GetStaticClass() || klass->IsSubClassOf(Asset::GetStaticClass())) + { + obj = Content::LoadAsync(*id); + } + } + if (obj) + { + if (klass && !obj->Is(klass)) + { + LOG(Warning, "Found scripting object with ID={0} of type {1} that doesn't match type {2}.", *id, String(obj->GetType().Fullname), String(klass->GetFullName())); + return nullptr; + } + return obj->GetOrCreateManagedInstance(); + } + if (klass) + LOG(Warning, "Unable to find scripting object with ID={0}. Required type {1}.", *id, String(klass->GetFullName())); + else + LOG(Warning, "Unable to find scripting object with ID={0}", *id); + return nullptr; +} + +DEFINE_INTERNAL_CALL(MObject*) ObjectInternal_TryFindObject(Guid* id, MTypeObject* type) +{ + ScriptingObject* obj = Scripting::TryFindObject(*id); + if (obj && !obj->Is(MUtils::GetClass(type))) + obj = nullptr; + return obj ? obj->GetOrCreateManagedInstance() : nullptr; +} + +DEFINE_INTERNAL_CALL(void) ObjectInternal_ChangeID(ScriptingObject* obj, Guid* id) +{ + INTERNAL_CALL_CHECK(obj); + obj->ChangeID(*id); +} + +DEFINE_INTERNAL_CALL(void*) ObjectInternal_GetUnmanagedInterface(ScriptingObject* obj, MTypeObject* type) +{ + if (obj && type) + { + MClass* typeClass = MUtils::GetClass(type); + const ScriptingTypeHandle interfaceType = ManagedBinaryModule::FindType(typeClass); + if (interfaceType) + { + return ScriptingObject::ToInterface(obj, interfaceType); + } + } + return nullptr; +} + +DEFINE_INTERNAL_CALL(MObject*) ObjectInternal_FromUnmanagedPtr(ScriptingObject* obj) +{ + MObject* result = nullptr; + if (obj) + result = obj->GetOrCreateManagedInstance(); + return result; +} +#endif + class ScriptingObjectInternal { public: -#if !COMPILE_WITHOUT_CSHARP - - static MonoObject* Create1(MonoReflectionType* type) - { - // Peek class for that type (handle generic class cases) - if (!type) - DebugLog::ThrowArgumentNull("type"); - MonoType* monoType = mono_reflection_type_get_type(type); - const int32 monoTypeType = mono_type_get_type(monoType); - if (monoTypeType == MONO_TYPE_GENERICINST) - { - LOG(Error, "Generic scripts are not supported."); - return nullptr; - } - MonoClass* typeClass = mono_type_get_class(monoType); - if (typeClass == nullptr) - { - LOG(Error, "Invalid type."); - return nullptr; - } - - // Get the assembly with that class - auto module = ManagedBinaryModule::FindModule(typeClass); - if (module == nullptr) - { - LOG(Error, "Cannot find scripting assembly for type \'{0}.{1}\'.", String(mono_class_get_namespace(typeClass)), String(mono_class_get_name(typeClass))); - return nullptr; - } - - // Try to find the scripting type for this class - int32 typeIndex; - if (!module->ClassToTypeIndex.TryGet(typeClass, typeIndex)) - { - LOG(Error, "Cannot spawn objects of type \'{0}.{1}\'.", String(mono_class_get_namespace(typeClass)), String(mono_class_get_name(typeClass))); - return nullptr; - } - const ScriptingType& scriptingType = module->Types[typeIndex]; - - // Create unmanaged object - const ScriptingObjectSpawnParams params(Guid::New(), ScriptingTypeHandle(module, typeIndex)); - ScriptingObject* obj = scriptingType.Script.Spawn(params); - if (obj == nullptr) - { - LOG(Error, "Failed to spawn object of type \'{0}.{1}\'.", String(mono_class_get_namespace(typeClass)), String(mono_class_get_name(typeClass))); - return nullptr; - } - - // Set default name for actors - if (auto* actor = dynamic_cast(obj)) - { - actor->SetName(String(mono_class_get_name(typeClass))); - } - - // Create managed object - obj->CreateManaged(); - MonoObject* managedInstance = obj->GetManagedInstance(); - if (managedInstance == nullptr) - { - LOG(Error, "Cannot create managed instance for type \'{0}.{1}\'.", String(mono_class_get_namespace(typeClass)), String(mono_class_get_name(typeClass))); - Delete(obj); - } - - return managedInstance; - } - - static MonoObject* Create2(MonoString* typeNameObj) - { - // Get typename - if (typeNameObj == nullptr) - DebugLog::ThrowArgumentNull("typeName"); - const StringAsANSI<> typeNameData((const Char*)mono_string_chars(typeNameObj), (int32)mono_string_length(typeNameObj)); - const StringAnsiView typeName(typeNameData.Get(), (int32)mono_string_length(typeNameObj)); - - // Try to find the scripting type for this typename - const ScriptingTypeHandle type = Scripting::FindScriptingType(typeName); - if (!type) - { - LOG(Error, "Cannot find scripting type for \'{0}\'.", String(typeName)); - return nullptr; - } - - // Create unmanaged object - const ScriptingObjectSpawnParams params(Guid::New(), type); - ScriptingObject* obj = type.GetType().Script.Spawn(params); - if (obj == nullptr) - { - LOG(Error, "Failed to spawn object of type \'{0}\'.", String(typeName)); - return nullptr; - } - - // Create managed object - obj->CreateManaged(); - MonoObject* managedInstance = obj->GetManagedInstance(); - if (managedInstance == nullptr) - { - LOG(Error, "Cannot create managed instance for type \'{0}\'.", String(typeName)); - Delete(obj); - } - - return managedInstance; - } - - static void ManagedInstanceCreated(MonoObject* managedInstance) - { - MonoClass* typeClass = mono_object_get_class(managedInstance); - - // Get the assembly with that class - auto module = ManagedBinaryModule::FindModule(typeClass); - if (module == nullptr) - { - LOG(Error, "Cannot find scripting assembly for type \'{0}.{1}\'.", String(mono_class_get_namespace(typeClass)), String(mono_class_get_name(typeClass))); - return; - } - - // Try to find the scripting type for this class - int32 typeIndex; - if (!module->ClassToTypeIndex.TryGet(typeClass, typeIndex)) - { - LOG(Error, "Cannot spawn objects of type \'{0}.{1}\'.", String(mono_class_get_namespace(typeClass)), String(mono_class_get_name(typeClass))); - return; - } - const ScriptingType& scriptingType = module->Types[typeIndex]; - - // Create unmanaged object - const ScriptingObjectSpawnParams params(Guid::New(), ScriptingTypeHandle(module, typeIndex)); - ScriptingObject* obj = scriptingType.Script.Spawn(params); - if (obj == nullptr) - { - LOG(Error, "Failed to spawn object of type \'{0}.{1}\'.", String(mono_class_get_namespace(typeClass)), String(mono_class_get_name(typeClass))); - return; - } - - // Set default name for actors - if (auto* actor = dynamic_cast(obj)) - { - actor->SetName(String(mono_class_get_name(typeClass))); - } - - // Link created managed instance to the unmanaged object - if (auto* managedScriptingObject = dynamic_cast(obj)) - { - // Managed - managedScriptingObject->_gcHandle = mono_gchandle_new_weakref(managedInstance, false); - } - else - { - // Persistent - obj->_gcHandle = mono_gchandle_new(managedInstance, false); - } - - MClass* monoClass = obj->GetClass(); - - // Set handle to unmanaged object - const MField* monoUnmanagedPtrField = monoClass->GetField(ScriptingObject_unmanagedPtr); - if (monoUnmanagedPtrField) - { - const void* value = obj; - monoUnmanagedPtrField->SetValue(managedInstance, &value); - } - - // Set object id - const MField* monoIdField = monoClass->GetField(ScriptingObject_id); - if (monoIdField) - { - monoIdField->SetValue(managedInstance, (void*)&obj->_id); - } - - // Register object - if (!obj->IsRegistered()) - obj->RegisterObject(); - } - - static void Destroy(ScriptingObject* obj, float timeLeft) - { - // Use scaled game time for removing actors/scripts by the user (maybe expose it to the api?) - const bool useGameTime = timeLeft > ZeroTolerance; - - if (obj) - obj->DeleteObject(timeLeft, useGameTime); - } - - static MonoString* GetTypeName(ScriptingObject* obj) - { - INTERNAL_CALL_CHECK_RETURN(obj, nullptr); - return MUtils::ToString(obj->GetType().Fullname); - } - - static MonoObject* FindObject(Guid* id, MonoReflectionType* type) - { - if (!id->IsValid()) - return nullptr; - auto klass = MUtils::GetClass(type); - ScriptingObject* obj = Scripting::TryFindObject(*id); - if (!obj) - { - if (!klass || klass == ScriptingObject::GetStaticClass()->GetNative() || mono_class_is_subclass_of(klass, Asset::GetStaticClass()->GetNative(), false) != 0) - { - obj = Content::LoadAsync(*id); - } - } - if (obj) - { - if (klass && !obj->Is(klass)) - { - LOG(Warning, "Found scripting object with ID={0} of type {1} that doesn't match type {2}.", *id, String(obj->GetType().Fullname), String(MUtils::GetClassFullname(klass))); - return nullptr; - } - return obj->GetOrCreateManagedInstance(); - } - if (klass) - LOG(Warning, "Unable to find scripting object with ID={0}. Required type {1}.", *id, String(MUtils::GetClassFullname(klass))); - else - LOG(Warning, "Unable to find scripting object with ID={0}", *id); - return nullptr; - } - - static MonoObject* TryFindObject(Guid* id, MonoReflectionType* type) - { - ScriptingObject* obj = Scripting::TryFindObject(*id); - if (obj && !obj->Is(MUtils::GetClass(type))) - obj = nullptr; - return obj ? obj->GetOrCreateManagedInstance() : nullptr; - } - - static void ChangeID(ScriptingObject* obj, Guid* id) - { - INTERNAL_CALL_CHECK(obj); - obj->ChangeID(*id); - } - - static void* GetUnmanagedInterface(ScriptingObject* obj, MonoReflectionType* type) - { - if (obj && type) - { - auto typeClass = MUtils::GetClass(type); - const ScriptingTypeHandle interfaceType = ManagedBinaryModule::FindType(typeClass); - if (interfaceType) - { - return ScriptingObject::ToInterface(obj, interfaceType); - } - } - return nullptr; - } - - static MonoObject* FromUnmanagedPtr(ScriptingObject* obj) - { - MonoObject* result = nullptr; - if (obj) - result = obj->GetOrCreateManagedInstance(); - return result; - } - static void InitRuntime() { - ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_Create1", &Create1); - ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_Create2", &Create2); - ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_ManagedInstanceCreated", &ManagedInstanceCreated); - ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_ManagedInstanceDeleted", &Scripting::OnManagedInstanceDeleted); - ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_Destroy", &Destroy); - ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_GetTypeName", &GetTypeName); - ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_FindObject", &FindObject); - ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_TryFindObject", &TryFindObject); - ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_ChangeID", &ChangeID); - ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_GetUnmanagedInterface", &GetUnmanagedInterface); - ADD_INTERNAL_CALL("FlaxEngine.Object::FromUnmanagedPtr", &FromUnmanagedPtr); + ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_Create1", &ObjectInternal_Create1); + ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_Create2", &ObjectInternal_Create2); + ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_ManagedInstanceCreated", &ObjectInternal_ManagedInstanceCreated); + ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_ManagedInstanceDeleted", &ObjectInternal_ManagedInstanceDeleted); + ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_Destroy", &ObjectInternal_Destroy); + ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_GetTypeName", &ObjectInternal_GetTypeName); + ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_FindObject", &ObjectInternal_FindObject); + ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_TryFindObject", &ObjectInternal_TryFindObject); + ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_ChangeID", &ObjectInternal_ChangeID); + ADD_INTERNAL_CALL("FlaxEngine.Object::Internal_GetUnmanagedInterface", &ObjectInternal_GetUnmanagedInterface); + ADD_INTERNAL_CALL("FlaxEngine.Object::FromUnmanagedPtr", &ObjectInternal_FromUnmanagedPtr); } -#else - - static void InitRuntime() - { - } - -#endif - static ScriptingObject* Spawn(const ScriptingObjectSpawnParams& params) { return New(params); diff --git a/Source/Engine/Scripting/ScriptingObject.h b/Source/Engine/Scripting/ScriptingObject.h index 860226986..ad72a31c3 100644 --- a/Source/Engine/Scripting/ScriptingObject.h +++ b/Source/Engine/Scripting/ScriptingObject.h @@ -14,19 +14,17 @@ API_CLASS(InBuild) class FLAXENGINE_API ScriptingObject : public Object { friend class Scripting; friend class BinaryModule; -DECLARE_SCRIPTING_TYPE_NO_SPAWN(ScriptingObject); -public: + DECLARE_SCRIPTING_TYPE_NO_SPAWN(ScriptingObject); +public: typedef ScriptingObjectSpawnParams SpawnParams; protected: - - uint32 _gcHandle; + MGCHandle _gcHandle; ScriptingTypeHandle _type; Guid _id; public: - /// /// Initializes a new instance of the class. /// @@ -39,14 +37,15 @@ public: virtual ~ScriptingObject(); public: - // Spawns a new objects of the given type. static ScriptingObject* NewObject(const ScriptingTypeHandle& typeHandle); + template static T* NewObject() { return (T*)NewObject(T::TypeInitializer); } + template static T* NewObject(const ScriptingTypeHandle& typeHandle) { @@ -60,14 +59,12 @@ public: } public: - /// /// Event fired when object gets deleted. /// Delegate Deleted; public: - /// /// Gets the managed instance object. /// @@ -116,15 +113,17 @@ public: MClass* GetClass() const; public: - // Tries to cast native interface object to scripting object instance. Returns null if fails. static ScriptingObject* FromInterface(void* interfaceObj, const ScriptingTypeHandle& interfaceType); + template static ScriptingObject* FromInterface(T* interfaceObj) { return FromInterface(interfaceObj, T::TypeInitializer); } + static void* ToInterface(ScriptingObject* obj, const ScriptingTypeHandle& interfaceType); + template static T* ToInterface(ScriptingObject* obj) { @@ -153,9 +152,6 @@ public: /// The destination class to the cast. /// True if can, otherwise false. static bool CanCast(const MClass* from, const MClass* to); -#if USE_MONO - static bool CanCast(const MClass* from, const MonoClass* to); -#endif template static T* Cast(ScriptingObject* obj) @@ -170,13 +166,6 @@ public: return CanCast(GetClass(), type); } -#if USE_MONO - bool Is(MonoClass* klass) const - { - return CanCast(GetClass(), klass); - } -#endif - template bool Is() const { @@ -184,7 +173,6 @@ public: } public: - /// /// Changes the object id (both managed and unmanaged). Warning! Use with caution as object ID is what it identifies it and change might cause issues. /// @@ -192,7 +180,7 @@ public: virtual void ChangeID(const Guid& newId); public: - + virtual void SetManagedInstance(MObject* instance); virtual void OnManagedInstanceDeleted(); virtual void OnScriptingDispose(); @@ -200,7 +188,6 @@ public: virtual void DestroyManaged(); public: - /// /// Determines whether this object is registered or not (can be found by the queries and used in a game). /// @@ -220,16 +207,14 @@ public: void UnregisterObject(); protected: - -#if USE_MONO +#if USE_CSHARP /// /// Create a new managed object. /// - MonoObject* CreateManagedInternal(); + MObject* CreateManagedInternal(); #endif public: - // [Object] void OnDeleteObject() override; String ToString() const override; @@ -243,7 +228,6 @@ public: API_CLASS(InBuild) class FLAXENGINE_API ManagedScriptingObject : public ScriptingObject { public: - /// /// Initializes a new instance of the class. /// @@ -251,8 +235,8 @@ public: explicit ManagedScriptingObject(const SpawnParams& params); public: - // [ScriptingObject] + void SetManagedInstance(MObject* instance) override; void OnManagedInstanceDeleted() override; void OnScriptingDispose() override; bool CreateManaged() override; diff --git a/Source/Engine/Scripting/ScriptingType.h b/Source/Engine/Scripting/ScriptingType.h index fe2f53486..4b109173e 100644 --- a/Source/Engine/Scripting/ScriptingType.h +++ b/Source/Engine/Scripting/ScriptingType.h @@ -65,8 +65,8 @@ struct FLAXENGINE_API ScriptingTypeHandle String ToString(bool withAssembly = false) const; const ScriptingType& GetType() const; -#if USE_MONO - MonoClass* GetMonoClass() const; +#if USE_CSHARP + MClass* GetClass() const; #endif bool IsSubclassOf(ScriptingTypeHandle c) const; bool IsAssignableFrom(ScriptingTypeHandle c) const; diff --git a/Source/Engine/Scripting/Types.h b/Source/Engine/Scripting/Types.h index e54db5c4d..3f0f3a606 100644 --- a/Source/Engine/Scripting/Types.h +++ b/Source/Engine/Scripting/Types.h @@ -19,36 +19,44 @@ class MMethod; class MProperty; class MEvent; class MDomain; -class MType; #if COMPILE_WITHOUT_CSHARP // No Scripting +#define USE_CSHARP 0 #define USE_MONO 0 #define USE_NETCORE 0 -typedef void MObject; + +// Dummy types declarations +typedef struct CSharpObject MObject; +typedef struct CSharpArray MArray; +typedef struct CSharpString MString; +typedef struct CSharpType MType; +typedef MType MTypeObject; +typedef unsigned int MGCHandle; +#define INTERNAL_TYPE_GET_OBJECT(type) (type) +#define INTERNAL_TYPE_OBJECT_GET(type) (type) #else +#ifndef USE_MONO_AOT +#define USE_MONO_AOT 0 +#define USE_MONO_AOT_MODE MONO_AOT_MODE_NONE +#endif + +#if COMPILE_WITH_MONO + +// Mono scripting +#define USE_CSHARP 1 #define USE_MONO 1 #define USE_NETCORE 0 -// Enables using single (root) app domain for the user scripts -#define USE_SCRIPTING_SINGLE_DOMAIN 1 - -#if USE_MONO - // Enables/disables profiling managed world via Mono #define USE_MONO_PROFILER (COMPILE_WITH_PROFILER) // Enable/disable mono debugging #define MONO_DEBUG_ENABLE (!BUILD_RELEASE) -#ifndef USE_MONO_AOT -#define USE_MONO_AOT 0 -#define USE_MONO_AOT_MODE MONO_AOT_MODE_NONE -#endif - // Mono types declarations typedef struct _MonoClass MonoClass; typedef struct _MonoDomain MonoDomain; @@ -66,7 +74,34 @@ typedef struct _MonoReflectionAssembly MonoReflectionAssembly; typedef struct _MonoException MonoException; typedef struct _MonoClassField MonoClassField; typedef MonoObject MObject; +typedef MonoArray MArray; +typedef MonoString MString; +typedef MonoType MType; +typedef MonoReflectionType MTypeObject; +typedef unsigned int MGCHandle; +#define INTERNAL_TYPE_GET_OBJECT(type) MCore::Type::GetObject(type) +#define INTERNAL_TYPE_OBJECT_GET(type) MCore::Type::Get(type) + +#else + +// .NET scripting +#define USE_CSHARP 1 +#define USE_MONO 0 +#define USE_NETCORE 1 + +// Dotnet types declarations +typedef struct DotNetObject MObject; +typedef struct DotNetArray MArray; +typedef struct DotNetString MString; +typedef struct DotNetType MType; +typedef MType MTypeObject; +typedef unsigned long long MGCHandle; +#define INTERNAL_TYPE_GET_OBJECT(type) (type) +#define INTERNAL_TYPE_OBJECT_GET(type) (type) #endif +// Enables using single (root) app domain for the user scripts +#define USE_SCRIPTING_SINGLE_DOMAIN 1 + #endif diff --git a/Source/Engine/Serialization/JsonSerializer.cs b/Source/Engine/Serialization/JsonSerializer.cs index 30889fce0..619862b1f 100644 --- a/Source/Engine/Serialization/JsonSerializer.cs +++ b/Source/Engine/Serialization/JsonSerializer.cs @@ -147,13 +147,8 @@ namespace FlaxEngine.Json /// True if both objects are equal, otherwise false. public static bool ValueEquals(object objA, object objB) { - // If referenced object has the same linkage to the prefab object as the default value used in SerializeDiff, then mark it as equal - /*if (objA is ISceneObject sceneObjA && objB is ISceneObject sceneObjB && (sceneObjA.HasPrefabLink || sceneObjB.HasPrefabLink)) - { - return sceneObjA.PrefabObjectID == sceneObjB.PrefabObjectID; - }*/ - - return Newtonsoft.Json.Utilities.MiscellaneousUtils.DefaultValueEquals(objA, objB); + // Use default value comparision used by C# json serialization library + return Newtonsoft.Json.Utilities.MiscellaneousUtils.ValueEquals(objA, objB); } /// diff --git a/Source/Engine/Serialization/JsonWriter.h b/Source/Engine/Serialization/JsonWriter.h index 6e6c607cf..fd500cc14 100644 --- a/Source/Engine/Serialization/JsonWriter.h +++ b/Source/Engine/Serialization/JsonWriter.h @@ -78,6 +78,12 @@ public: String(buf.Get()); } + void String(const StringView& value) + { + const StringAsUTF8<256> buf(*value, value.Length()); + String(buf.Get()); + } + void String(const StringAnsi& value) { String(value.Get(), static_cast(value.Length())); @@ -85,7 +91,13 @@ public: FORCE_INLINE void RawValue(const StringAnsi& str) { - RawValue(str.Get(), static_cast(str.Length())); + RawValue(str.Get(), str.Length()); + } + + void RawValue(const StringView& str) + { + const StringAsUTF8<256> buf(*str, str.Length()); + RawValue(buf.Get(), buf.Length()); } FORCE_INLINE void RawValue(const CharType* json) diff --git a/Source/Engine/Serialization/ReadStream.h b/Source/Engine/Serialization/ReadStream.h index 69e86fa4b..9d3215442 100644 --- a/Source/Engine/Serialization/ReadStream.h +++ b/Source/Engine/Serialization/ReadStream.h @@ -193,14 +193,11 @@ public: ReadInt32(&count); data.Clear(); data.EnsureCapacity(count); - if (count > 0) + for (int32 i = 0; i < count; i++) { - for (int32 i = 0; i < count; i++) - { - KeyType key; - Read(key); - Read(data[key]); - } + KeyType key; + Read(key); + Read(data[key]); } } diff --git a/Source/Engine/Serialization/Serialization.cpp b/Source/Engine/Serialization/Serialization.cpp index a913781a9..ac8eb41a9 100644 --- a/Source/Engine/Serialization/Serialization.cpp +++ b/Source/Engine/Serialization/Serialization.cpp @@ -18,14 +18,12 @@ #include "Engine/Core/Math/Color.h" #include "Engine/Core/Math/Color32.h" #include "Engine/Core/Math/Matrix.h" -#include "Engine/Scripting/ManagedSerialization.h" +#include "Engine/Scripting/Internal/ManagedSerialization.h" #include "Engine/Scripting/ManagedCLR/MUtils.h" +#include "Engine/Scripting/ManagedCLR/MClass.h" #include "Engine/Scripting/ScriptingObjectReference.h" #include "Engine/Content/Asset.h" #include "Engine/Utilities/Encryption.h" -#if USE_MONO -#include -#endif void ISerializable::DeserializeIfExists(DeserializeStream& stream, const char* memberName, ISerializeModifier* modifier) { @@ -216,12 +214,12 @@ void Serialization::Serialize(ISerializable::SerializeStream& stream, const Vari case VariantType::ManagedObject: case VariantType::Structure: { -#if USE_MONO - MonoObject* obj; +#if USE_CSHARP + MObject* obj; if (v.Type.Type == VariantType::Structure) obj = MUtils::BoxVariant(v); else - obj = (MonoObject*)v; + obj = (MObject*)v; ManagedSerialization::Serialize(stream, obj); #endif break; @@ -365,24 +363,24 @@ void Serialization::Deserialize(ISerializable::DeserializeStream& stream, Varian case VariantType::ManagedObject: case VariantType::Structure: { -#if USE_MONO - auto obj = (MonoObject*)v; +#if USE_CSHARP + auto obj = (MObject*)v; if (!obj && v.Type.TypeName) { - MonoClass* klass = MUtils::GetClass(v.Type); + MClass* klass = MUtils::GetClass(v.Type); if (!klass) { LOG(Error, "Invalid variant type {0}", v.Type); return; } - obj = mono_object_new(mono_domain_get(), klass); + obj = MCore::Object::New(klass); if (!obj) { LOG(Error, "Failed to managed instance of the variant type {0}", v.Type); return; } - if (!mono_class_is_valuetype(klass)) - mono_runtime_object_init(obj); + if (!klass->IsValueType()) + MCore::Object::Init(obj); if (v.Type.Type == VariantType::ManagedObject) v.SetManagedObject(obj); } diff --git a/Source/Engine/Serialization/Stream.cpp b/Source/Engine/Serialization/Stream.cpp index 84b772f9a..30acc3d94 100644 --- a/Source/Engine/Serialization/Stream.cpp +++ b/Source/Engine/Serialization/Stream.cpp @@ -12,9 +12,10 @@ #include "Engine/Core/Cache.h" #include "Engine/Debug/Exceptions/JsonParseException.h" #include "Engine/Profiler/ProfilerCPU.h" -#include "Engine/Scripting/ManagedSerialization.h" +#include "Engine/Scripting/Internal/ManagedSerialization.h" #include "Engine/Scripting/Scripting.h" #include "Engine/Scripting/ScriptingObject.h" +#include "Engine/Scripting/ManagedCLR/MClass.h" #include "Engine/Scripting/ManagedCLR/MCore.h" #include "Engine/Scripting/ManagedCLR/MUtils.h" @@ -359,22 +360,22 @@ void ReadStream::Read(Variant& data) // Json StringAnsi json; ReadStringAnsi(&json, -71); -#if USE_MONO - MCore::AttachThread(); - MonoClass* klass = MUtils::GetClass(data.Type); +#if USE_CSHARP + MCore::Thread::Attach(); + MClass* klass = MUtils::GetClass(data.Type); if (!klass) { LOG(Error, "Invalid variant type {0}", data.Type); return; } - MonoObject* obj = mono_object_new(mono_domain_get(), klass); + MObject* obj = MCore::Object::New(klass); if (!obj) { LOG(Error, "Failed to managed instance of the variant type {0}", data.Type); return; } - if (!mono_class_is_valuetype(klass)) - mono_runtime_object_init(obj); + if (!klass->IsValueType()) + MCore::Object::Init(obj); ManagedSerialization::Deserialize(json, obj); if (data.Type.Type == VariantType::ManagedObject) data.SetManagedObject(obj); @@ -900,18 +901,18 @@ void WriteStream::Write(const Variant& data) case VariantType::ManagedObject: case VariantType::Structure: { -#if USE_MONO - MonoObject* obj; +#if USE_CSHARP + MObject* obj; if (data.Type.Type == VariantType::Structure) obj = MUtils::BoxVariant(data); else - obj = (MonoObject*)data; + obj = (MObject*)data; if (obj) { WriteByte(1); rapidjson_flax::StringBuffer json; CompactJsonWriter writerObj(json); - MCore::AttachThread(); + MCore::Thread::Attach(); ManagedSerialization::Serialize(writerObj, obj); WriteStringAnsi(StringAnsiView(json.GetString(), (int32)json.GetSize()), -71); } diff --git a/Source/Engine/Serialization/WriteStream.h b/Source/Engine/Serialization/WriteStream.h index 49573bf8d..92ac211ca 100644 --- a/Source/Engine/Serialization/WriteStream.h +++ b/Source/Engine/Serialization/WriteStream.h @@ -199,13 +199,10 @@ public: { const int32 count = data.Count(); WriteInt32(count); - if (count > 0) + for (const auto& e : data) { - for (const auto& e : data) - { - Write(e.Key); - Write(e.Value); - } + Write(e.Key); + Write(e.Value); } } diff --git a/Source/Engine/Streaming/Streaming.h b/Source/Engine/Streaming/Streaming.h index 72540df16..6eacaa2fd 100644 --- a/Source/Engine/Streaming/Streaming.h +++ b/Source/Engine/Streaming/Streaming.h @@ -9,7 +9,7 @@ class GPUSampler; // Streaming service statistics container. -API_STRUCT() struct FLAXENGINE_API StreamingStats +API_STRUCT(NoDefault) struct FLAXENGINE_API StreamingStats { DECLARE_SCRIPTING_TYPE_MINIMAL(StreamingStats); // Amount of active streamable resources. diff --git a/Source/Engine/Terrain/Terrain.Build.cs b/Source/Engine/Terrain/Terrain.Build.cs index 16cf6d2ab..1cc36a237 100644 --- a/Source/Engine/Terrain/Terrain.Build.cs +++ b/Source/Engine/Terrain/Terrain.Build.cs @@ -14,7 +14,6 @@ public class Terrain : EngineModule base.Setup(options); options.PrivateDependencies.Add("Physics"); - options.PrivateDependencies.Add("PhysX"); if (options.Target.IsEditor) { diff --git a/Source/Engine/Terrain/TerrainPatch.cpp b/Source/Engine/Terrain/TerrainPatch.cpp index e7889049a..d98827ce1 100644 --- a/Source/Engine/Terrain/TerrainPatch.cpp +++ b/Source/Engine/Terrain/TerrainPatch.cpp @@ -892,7 +892,7 @@ bool TerrainPatch::SetupHeightMap(int32 heightMapLength, const float* heightMap, collisionData = &tmpData; } - // Generate PhysX height field data for the runtime + // Generate physics backend height field data for the runtime if (CookCollision(info, initData, _terrain->_collisionLod, collisionData)) { return true; @@ -1853,7 +1853,7 @@ void TerrainPatch::SaveHeightData() return; } - // Generate PhysX height field data for the runtime + // Generate physics backend height field data for the runtime if (_heightfield->WaitForLoaded()) { LOG(Error, "Failed to load patch heightfield data."); diff --git a/Source/Tools/FlaxEngine.Tests/CircularBufferTests.cs b/Source/Engine/Tests/TestCircularBuffer.cs similarity index 99% rename from Source/Tools/FlaxEngine.Tests/CircularBufferTests.cs rename to Source/Engine/Tests/TestCircularBuffer.cs index 4f0deda1d..c30164a69 100644 --- a/Source/Tools/FlaxEngine.Tests/CircularBufferTests.cs +++ b/Source/Engine/Tests/TestCircularBuffer.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_TESTS using System; using System.Collections; using FlaxEngine.Collections; @@ -9,7 +10,7 @@ using Assert = FlaxEngine.Assertions.Assert; namespace FlaxEngine.Tests { [TestFixture] - public class CircularBufferTests + public class TestsCircularBuffer { [Test] public void CircularBufferTestFrontOverwrite() @@ -525,3 +526,4 @@ namespace FlaxEngine.Tests } } } +#endif diff --git a/Source/Tools/FlaxEngine.Tests/TestColor.cs b/Source/Engine/Tests/TestColor.cs similarity index 98% rename from Source/Tools/FlaxEngine.Tests/TestColor.cs rename to Source/Engine/Tests/TestColor.cs index e952eb596..89d207bf2 100644 --- a/Source/Tools/FlaxEngine.Tests/TestColor.cs +++ b/Source/Engine/Tests/TestColor.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_TESTS using NUnit.Framework; namespace FlaxEngine.Tests @@ -38,3 +39,4 @@ namespace FlaxEngine.Tests } } } +#endif diff --git a/Source/Tools/FlaxEngine.Tests/TestContainerControl.cs b/Source/Engine/Tests/TestContainerControl.cs similarity index 98% rename from Source/Tools/FlaxEngine.Tests/TestContainerControl.cs rename to Source/Engine/Tests/TestContainerControl.cs index bfb479359..10f337725 100644 --- a/Source/Tools/FlaxEngine.Tests/TestContainerControl.cs +++ b/Source/Engine/Tests/TestContainerControl.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_TESTS using FlaxEngine.GUI; using NUnit.Framework; using Assert = FlaxEngine.Assertions.Assert; @@ -54,3 +55,4 @@ namespace FlaxEngine.Tests } } } +#endif diff --git a/Source/Tools/FlaxEngine.Tests/TextControl.cs b/Source/Engine/Tests/TestControl.cs similarity index 98% rename from Source/Tools/FlaxEngine.Tests/TextControl.cs rename to Source/Engine/Tests/TestControl.cs index 144ddd76c..30b665f34 100644 --- a/Source/Tools/FlaxEngine.Tests/TextControl.cs +++ b/Source/Engine/Tests/TestControl.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_TESTS using FlaxEngine.GUI; using NUnit.Framework; using Assert = FlaxEngine.Assertions.Assert; @@ -7,7 +8,7 @@ using Assert = FlaxEngine.Assertions.Assert; namespace FlaxEngine.Tests { [TestFixture] - public class TextControl + public class TestControl { public class SimpleControl : Control { @@ -110,3 +111,4 @@ namespace FlaxEngine.Tests } } } +#endif diff --git a/Source/Tools/FlaxEngine.Tests/TestEditorUtils.cs b/Source/Engine/Tests/TestEditorUtils.cs similarity index 84% rename from Source/Tools/FlaxEngine.Tests/TestEditorUtils.cs rename to Source/Engine/Tests/TestEditorUtils.cs index f7d714cba..bd8d5837b 100644 --- a/Source/Tools/FlaxEngine.Tests/TestEditorUtils.cs +++ b/Source/Engine/Tests/TestEditorUtils.cs @@ -1,8 +1,8 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_TESTS using System; using System.Globalization; -using System.Threading; using NUnit.Framework; namespace FlaxEngine.Tests @@ -19,7 +19,7 @@ namespace FlaxEngine.Tests [Test] public void TestFormatFloat() { - Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; + CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; Assert.AreEqual("0", FlaxEditor.Utilities.Utils.FormatFloat(0.0f)); Assert.AreEqual("0", FlaxEditor.Utilities.Utils.FormatFloat(0.0d)); @@ -42,8 +42,8 @@ namespace FlaxEngine.Tests { double value1 = sign * value; string text = FlaxEditor.Utilities.Utils.FormatFloat(value1); - Assert.IsFalse(text.IndexOf("e", StringComparison.Ordinal) != -1); - Assert.IsFalse(text.IndexOf("E", StringComparison.Ordinal) != -1); + Assert.IsFalse(text.Contains("e", StringComparison.Ordinal)); + Assert.IsFalse(text.Contains("E", StringComparison.Ordinal)); double value2 = double.Parse(text); Assert.AreEqual(value2, value1); } @@ -54,8 +54,8 @@ namespace FlaxEngine.Tests { float value1 = (float)(sign * value); string text = FlaxEditor.Utilities.Utils.FormatFloat(value1); - Assert.IsFalse(text.IndexOf("e", StringComparison.Ordinal) != -1); - Assert.IsFalse(text.IndexOf("E", StringComparison.Ordinal) != -1); + Assert.IsFalse(text.Contains("e", StringComparison.Ordinal)); + Assert.IsFalse(text.Contains("E", StringComparison.Ordinal)); float value2 = float.Parse(text); Assert.AreEqual(value2, value1); } @@ -63,3 +63,4 @@ namespace FlaxEngine.Tests } } } +#endif diff --git a/Source/Tools/FlaxEngine.Tests/TestFloatR10G10B10A2.cs b/Source/Engine/Tests/TestFloatR10G10B10A2.cs similarity index 97% rename from Source/Tools/FlaxEngine.Tests/TestFloatR10G10B10A2.cs rename to Source/Engine/Tests/TestFloatR10G10B10A2.cs index f44848e0f..270482b90 100644 --- a/Source/Tools/FlaxEngine.Tests/TestFloatR10G10B10A2.cs +++ b/Source/Engine/Tests/TestFloatR10G10B10A2.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_TESTS using NUnit.Framework; namespace FlaxEngine.Tests @@ -20,3 +21,4 @@ namespace FlaxEngine.Tests } } } +#endif diff --git a/Source/Tools/FlaxEngine.Tests/TestFloatR11G11B10.cs b/Source/Engine/Tests/TestFloatR11G11B10.cs similarity index 97% rename from Source/Tools/FlaxEngine.Tests/TestFloatR11G11B10.cs rename to Source/Engine/Tests/TestFloatR11G11B10.cs index f7761d134..93e9c1507 100644 --- a/Source/Tools/FlaxEngine.Tests/TestFloatR11G11B10.cs +++ b/Source/Engine/Tests/TestFloatR11G11B10.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_TESTS using NUnit.Framework; namespace FlaxEngine.Tests @@ -20,3 +21,4 @@ namespace FlaxEngine.Tests } } } +#endif diff --git a/Source/Tools/FlaxEngine.Tests/HistoryStackTests.cs b/Source/Engine/Tests/TestHistoryStack.cs similarity index 98% rename from Source/Tools/FlaxEngine.Tests/HistoryStackTests.cs rename to Source/Engine/Tests/TestHistoryStack.cs index 8f2b35d66..99be9b21c 100644 --- a/Source/Tools/FlaxEngine.Tests/HistoryStackTests.cs +++ b/Source/Engine/Tests/TestHistoryStack.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_TESTS using System; using FlaxEditor.History; using NUnit.Framework; @@ -8,7 +9,7 @@ using Assert = FlaxEngine.Assertions.Assert; namespace FlaxEditor.Tests { [TestFixture] - public class HistoryStackTests + public class TestHistoryStack { public class HistoryTestObject : IHistoryAction { @@ -136,3 +137,4 @@ namespace FlaxEditor.Tests } } } +#endif diff --git a/Source/Tools/FlaxEngine.Tests/TestHtmlParser.cs b/Source/Engine/Tests/TestHtmlParser.cs similarity index 99% rename from Source/Tools/FlaxEngine.Tests/TestHtmlParser.cs rename to Source/Engine/Tests/TestHtmlParser.cs index 147d07a42..bf77d0125 100644 --- a/Source/Tools/FlaxEngine.Tests/TestHtmlParser.cs +++ b/Source/Engine/Tests/TestHtmlParser.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_TESTS using System.Collections.Generic; using FlaxEngine.Utilities; using NUnit.Framework; @@ -116,3 +117,4 @@ namespace FlaxEngine.Tests } } } +#endif diff --git a/Source/Engine/Tests/TestLocalization.cpp b/Source/Engine/Tests/TestLocalization.cpp new file mode 100644 index 000000000..02cf0e6f4 --- /dev/null +++ b/Source/Engine/Tests/TestLocalization.cpp @@ -0,0 +1,66 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#include "Engine/Core/Formatting.h" +#include "Engine/Core/Types/String.h" +#include "Engine/Core/Types/StringView.h" +#include "Engine/Core/Math/Vector2.h" +#include "Engine/Core/Math/Vector3.h" +#include "Engine/Core/Types/Guid.h" +#include "Engine/Localization/Localization.h" +#include + +struct MyStruct +{ + Vector2 Direction; + float Speed; +}; + +DEFINE_DEFAULT_FORMATTING(MyStruct, "Direction:{0} Speed:{1}", v.Direction, v.Speed); + +TEST_CASE("Localization") +{ + SECTION("Test Fallback Values") + { + String myStr = Localization::GetString(TEXT("localized_id"), TEXT("Fallback value")); + String myStrPlural = Localization::GetPluralString(TEXT("localized_id_n"), 2, TEXT("Count: {}")); + CHECK(myStr == TEXT("Fallback value")); + CHECK(myStrPlural == TEXT("Count: 2")); + } + SECTION("Test String Formatting") + { + // https://docs.flaxengine.com/manual/scripting/cpp/string-formatting.html + + // Values formatting + auto str1 = String::Format(TEXT("a: {0}, b: {1}, a: {0}"), TEXT("a"), TEXT("b")); + CHECK(str1 == TEXT("a: a, b: b, a: a")); + auto str2 = String::Format(TEXT("1: {}, 2: {}, 3: {}"), 1, 2, 3); + CHECK(str2 == TEXT("1: 1, 2: 2, 3: 3")); + auto str3 = String::Format(TEXT("vector: {0}"), Vector3(1, 2, 3)); + CHECK(str3 == TEXT("vector: X:1 Y:2 Z:3")); + String str = TEXT("hello"); + auto str4 = String::Format(TEXT("string: {0}"), str.ToString()); + CHECK(str4 == TEXT("string: hello")); + auto str5 = String::Format(TEXT("boolean: {0}"), true); + CHECK(str5 == TEXT("boolean: true")); + + // Custom type formatting + MyStruct data = { Vector2(1, 2), 10.0f }; + auto str6 = String::Format(TEXT("{0}"), data); + CHECK(str6 == TEXT("Direction:X:1 Y:2 Speed:10")); + + // Named arguments formatting + String text1 = String::Format(TEXT("text: {0}, {1}"), TEXT("one"), TEXT("two")); + String text2 = String::Format(TEXT("text: {arg0}, {arg1}"), fmt::arg(TEXT("arg0"), TEXT("one")), fmt::arg(TEXT("arg1"), TEXT("two"))); + CHECK(text1 == text2); + } + SECTION("Test Guid String") + { + const StringView text = TEXT("665bb01c49a3370f14a023b5395de261"); + Guid guid; + Guid::Parse(text, guid); + String guidText1 = guid.ToString(); + String guidText2 = String::Format(TEXT("{}"), guid); + CHECK(text == guidText1); + CHECK(text == guidText2); + } +} diff --git a/Source/Tools/FlaxEngine.Tests/TestModulusOperator.cs b/Source/Engine/Tests/TestModulusOperator.cs similarity index 95% rename from Source/Tools/FlaxEngine.Tests/TestModulusOperator.cs rename to Source/Engine/Tests/TestModulusOperator.cs index de67edd30..6ef34d6d4 100644 --- a/Source/Tools/FlaxEngine.Tests/TestModulusOperator.cs +++ b/Source/Engine/Tests/TestModulusOperator.cs @@ -1,3 +1,6 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#if FLAX_TESTS using NUnit.Framework; namespace FlaxEngine.Tests @@ -54,3 +57,4 @@ namespace FlaxEngine.Tests } } } +#endif diff --git a/Source/Tools/FlaxEngine.Tests/TestPropertyNameUI.cs b/Source/Engine/Tests/TestPropertyNameUI.cs similarity index 98% rename from Source/Tools/FlaxEngine.Tests/TestPropertyNameUI.cs rename to Source/Engine/Tests/TestPropertyNameUI.cs index e51905ff2..d9aff3ea1 100644 --- a/Source/Tools/FlaxEngine.Tests/TestPropertyNameUI.cs +++ b/Source/Engine/Tests/TestPropertyNameUI.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_TESTS using FlaxEditor.Utilities; using NUnit.Framework; @@ -28,3 +29,4 @@ namespace FlaxEditor.Tests } } } +#endif diff --git a/Source/Tools/FlaxEngine.Tests/TestQuaternion.cs b/Source/Engine/Tests/TestQuaternion.cs similarity index 98% rename from Source/Tools/FlaxEngine.Tests/TestQuaternion.cs rename to Source/Engine/Tests/TestQuaternion.cs index 41e784afe..a5a199ab3 100644 --- a/Source/Tools/FlaxEngine.Tests/TestQuaternion.cs +++ b/Source/Engine/Tests/TestQuaternion.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_TESTS using NUnit.Framework; namespace FlaxEngine.Tests @@ -36,3 +37,4 @@ namespace FlaxEngine.Tests } } } +#endif diff --git a/Source/Tools/FlaxEngine.Tests/TestQueryFilterHelper.cs b/Source/Engine/Tests/TestQueryFilterHelper.cs similarity index 99% rename from Source/Tools/FlaxEngine.Tests/TestQueryFilterHelper.cs rename to Source/Engine/Tests/TestQueryFilterHelper.cs index fe5ac15e2..03459ef77 100644 --- a/Source/Tools/FlaxEngine.Tests/TestQueryFilterHelper.cs +++ b/Source/Engine/Tests/TestQueryFilterHelper.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_TESTS using FlaxEditor.Utilities; using NUnit.Framework; @@ -80,3 +81,4 @@ namespace FlaxEditor.Tests } } } +#endif diff --git a/Source/Tools/FlaxEngine.Tests/TestSceneGraph.cs b/Source/Engine/Tests/TestSceneGraph.cs similarity index 99% rename from Source/Tools/FlaxEngine.Tests/TestSceneGraph.cs rename to Source/Engine/Tests/TestSceneGraph.cs index 0484901ce..447e66955 100644 --- a/Source/Tools/FlaxEngine.Tests/TestSceneGraph.cs +++ b/Source/Engine/Tests/TestSceneGraph.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_TESTS using System; using System.Collections.Generic; using FlaxEditor.SceneGraph; @@ -130,3 +131,4 @@ namespace FlaxEditor.Tests } } } +#endif diff --git a/Source/Engine/Tests/TestScripting.cpp b/Source/Engine/Tests/TestScripting.cpp index ce921412d..712cc3aaf 100644 --- a/Source/Engine/Tests/TestScripting.cpp +++ b/Source/Engine/Tests/TestScripting.cpp @@ -2,6 +2,9 @@ #include "TestScripting.h" #include "Engine/Scripting/Scripting.h" +#include "Engine/Scripting/ManagedCLR/MClass.h" +#include "Engine/Scripting/ManagedCLR/MMethod.h" +#include "Engine/Scripting/ManagedCLR/MUtils.h" #include TestClassNative::TestClassNative(const SpawnParams& params) @@ -11,6 +14,18 @@ TestClassNative::TestClassNative(const SpawnParams& params) TEST_CASE("Scripting") { + SECTION("Test Library Imports") + { + MClass* klass = Scripting::FindClass("FlaxEngine.Tests.TestScripting"); + CHECK(klass); + MMethod* method = klass->GetMethod("TestLibraryImports"); + CHECK(method); + MObject* result = method->Invoke(nullptr, nullptr, nullptr); + CHECK(result); + int32 resultValue = MUtils::Unbox(result); + CHECK(resultValue == 0); + } + SECTION("Test Class") { // Test native class @@ -23,12 +38,15 @@ TEST_CASE("Scripting") CHECK(testClass->SimpleField == 1); CHECK(testClass->SimpleStruct.Object == nullptr); CHECK(testClass->SimpleStruct.Vector == Float3::One); + TestStruct nonPod; Array struct1 = { testClass->SimpleStruct }; Array struct2 = { testClass->SimpleStruct }; Array objects; TestStructPOD pod; - int32 methodResult = testClass->TestMethod(TEXT("123"), pod, struct1, struct2, objects); + int32 methodResult = testClass->TestMethod(TEXT("123"), pod, nonPod, struct1, struct2, objects); CHECK(methodResult == 3); + CHECK(nonPod.Object == testClass); + CHECK(nonPod.Vector == Float3::UnitY); CHECK(objects.Count() == 0); // Test managed class @@ -43,13 +61,16 @@ TEST_CASE("Scripting") CHECK(testClass->SimpleField == 2); CHECK(testClass->SimpleStruct.Object == testClass); CHECK(testClass->SimpleStruct.Vector == Float3::UnitX); + nonPod = TestStruct(); struct1 = { testClass->SimpleStruct }; struct2 = { testClass->SimpleStruct }; objects.Clear(); pod.Vector = Float3::One; - methodResult = testClass->TestMethod(TEXT("123"), pod, struct1, struct2, objects); + methodResult = testClass->TestMethod(TEXT("123"), pod, nonPod, struct1, struct2, objects); CHECK(methodResult == 6); CHECK(pod.Vector == Float3::Half); + CHECK(nonPod.Object == testClass); + CHECK(nonPod.Vector == Float3::UnitY); CHECK(struct2.Count() == 2); CHECK(struct2[0] == testClass->SimpleStruct); CHECK(struct2[1] == testClass->SimpleStruct); @@ -68,11 +89,14 @@ TEST_CASE("Scripting") CHECK(testClass->SimpleField == 2); String str1 = TEXT("1"); String str2 = TEXT("2"); + TestStruct nonPod; Array arr1 = { testClass->SimpleStruct }; Array arr2 = { testClass->SimpleStruct }; - testClass->SimpleEvent(1, Float3::One, str1, str2, arr1, arr2); + testClass->SimpleEvent(1, Float3::One, str1, str2, nonPod, arr1, arr2); CHECK(testClass->SimpleField == 4); CHECK(str2 == TEXT("4")); + CHECK(nonPod.Object == testClass); + CHECK(nonPod.Vector == Float3::UnitY); CHECK(arr2.Count() == 2); CHECK(arr2[0].Vector == Float3::Half); CHECK(arr2[0].Object == nullptr); diff --git a/Source/Engine/Tests/TestScripting.cs b/Source/Engine/Tests/TestScripting.cs index ded2a97a0..fd94b8017 100644 --- a/Source/Engine/Tests/TestScripting.cs +++ b/Source/Engine/Tests/TestScripting.cs @@ -1,6 +1,50 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #if FLAX_TESTS +using System; +using System.Reflection; +using System.Runtime.InteropServices; + +namespace FlaxEngine.Tests +{ + /// + /// Tests for scripting. + /// + public class TestScripting + { + /// + /// Tests all usages in the engine to verify all bindings are correct to work with P/Invoke. + /// + public static int TestLibraryImports() + { + var result = 0; + var libraryName = "FlaxEngine"; + var library = NativeLibrary.Load(Interop.NativeInterop.nativeLibraryPaths[libraryName]); + if (library == IntPtr.Zero) + return -1; + var types = typeof(FlaxEngine.Object).Assembly.GetTypes(); + foreach (var type in types) + { + var methods = type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); + foreach (var method in methods) + { + var libraryImport = method.GetCustomAttribute(); + if (libraryImport == null || libraryImport.LibraryName != libraryName || libraryImport.EntryPoint == null) + continue; + bool found = NativeLibrary.TryGetExport(library, libraryImport.EntryPoint, out var addr); + if (!found) + { + Debug.LogError("Missing library import: " + libraryImport.EntryPoint + " on " + type.FullName + "::" + method.Name); + result++; + } + } + } + NativeLibrary.Free(library); + return result; + } + } +} + namespace FlaxEngine { partial struct TestStruct : System.IEquatable @@ -63,7 +107,7 @@ namespace FlaxEngine } /// - public override int TestMethod(string str, ref TestStructPOD pod, TestStruct[] struct1, ref TestStruct[] struct2, out Object[] objects) + public override int TestMethod(string str, ref TestStructPOD pod, ref TestStruct nonPod, TestStruct[] struct1, ref TestStruct[] struct2, out Object[] objects) { objects = new Object[3]; if (struct1 == null || struct1.Length != 1) @@ -80,7 +124,7 @@ namespace FlaxEngine pod.Vector = Float3.Half; // Test C++ base method invocation - return str.Length + base.TestMethod(str, ref pod, struct1, ref struct2, out _); + return str.Length + base.TestMethod(str, ref pod, ref nonPod, struct1, ref struct2, out _); } /// @@ -90,18 +134,22 @@ namespace FlaxEngine return str.Length + base.TestInterfaceMethod(str); } - private void OnSimpleEvent(int arg1, Float3 arg2, string arg3, ref string arg4, TestStruct[] arg5, ref TestStruct[] arg6) + private void OnSimpleEvent(int arg1, Float3 arg2, string arg3, ref string arg4, ref TestStruct nonPod, TestStruct[] arg5, ref TestStruct[] arg6) { // Verify that C++ passed proper data to C# via event bindings if (arg1 == 1 && arg2 == Float3.One && arg3 == "1" && arg4 == "2" && + nonPod.Object == null && + nonPod.Vector == Float3.One && arg5 != null && arg5.Length == 1 && arg5[0] == SimpleStruct && arg6 != null && arg6.Length == 1 && arg6[0] == SimpleStruct) { // Test passing data back from C# to C++ SimpleField = 4; + nonPod.Object = this; + nonPod.Vector = Float3.UnitY; arg4 = "4"; arg6 = new TestStruct[2] { diff --git a/Source/Engine/Tests/TestScripting.h b/Source/Engine/Tests/TestScripting.h index 2cfa4b0d1..23f64353d 100644 --- a/Source/Engine/Tests/TestScripting.h +++ b/Source/Engine/Tests/TestScripting.h @@ -63,11 +63,15 @@ public: API_FIELD() TestStruct SimpleStruct; // Test event - API_EVENT() Delegate&, Array&> SimpleEvent; + API_EVENT() Delegate&, Array&> SimpleEvent; // Test virtual method - API_FUNCTION() virtual int32 TestMethod(const String& str, API_PARAM(Ref) TestStructPOD& pod, const Array& struct1, API_PARAM(Ref) Array& struct2, API_PARAM(Out) Array& objects) + API_FUNCTION() virtual int32 TestMethod(const String& str, API_PARAM(Ref) TestStructPOD& pod, API_PARAM(Ref) TestStruct& nonPod, const Array& struct1, API_PARAM(Ref) Array& struct2, API_PARAM(Out) Array& objects) { + if (nonPod.Vector != Float3::One) + return -1; + nonPod.Object = this; + nonPod.Vector = Float3::UnitY; return str.Length(); } diff --git a/Source/Tools/FlaxEngine.Tests/TestSerialization.cs b/Source/Engine/Tests/TestSerialization.cs similarity index 99% rename from Source/Tools/FlaxEngine.Tests/TestSerialization.cs rename to Source/Engine/Tests/TestSerialization.cs index 3c57c6888..6e6c33e84 100644 --- a/Source/Tools/FlaxEngine.Tests/TestSerialization.cs +++ b/Source/Engine/Tests/TestSerialization.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_TESTS using System; using FlaxEngine.Json; using NUnit.Framework; @@ -150,3 +151,4 @@ namespace FlaxEngine.Tests } } } +#endif diff --git a/Source/Engine/Tests/TestString.cpp b/Source/Engine/Tests/TestString.cpp index 265f20b42..bf3ad8647 100644 --- a/Source/Engine/Tests/TestString.cpp +++ b/Source/Engine/Tests/TestString.cpp @@ -4,7 +4,7 @@ #include "Engine/Core/Types/StringView.h" #include -TEST_CASE("String Replace works") +TEST_CASE("String Replace") { SECTION("Char, case sensitive") { @@ -79,7 +79,7 @@ TEST_CASE("String Replace works") } } -TEST_CASE("String Starts/EndsWith works") +TEST_CASE("String Starts/EndsWith") { SECTION("StartsWith, case sensitive") { @@ -222,7 +222,7 @@ TEST_CASE("String Starts/EndsWith works") } } -TEST_CASE("String Compare works") +TEST_CASE("String Compare") { SECTION("String") { diff --git a/Source/Engine/Tests/TestStringUtils.cs b/Source/Engine/Tests/TestStringUtils.cs new file mode 100644 index 000000000..92c2f62d0 --- /dev/null +++ b/Source/Engine/Tests/TestStringUtils.cs @@ -0,0 +1,28 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +#if FLAX_TESTS +using NUnit.Framework; + +namespace FlaxEngine.Tests +{ + /// + /// Tests for . + /// + [TestFixture] + public class TestStringUtils + { + /// + /// Test incrementing name numbers. + /// + [Test] + public void TestIncName() + { + Assert.AreEqual("my Name", FlaxEditor.Utilities.Utils.IncrementNameNumber("my Name", null)); + Assert.AreEqual("my Name", FlaxEditor.Utilities.Utils.IncrementNameNumber("my Name", x => true)); + Assert.AreEqual("my Name 10", FlaxEditor.Utilities.Utils.IncrementNameNumber("my Name 1", x => x.EndsWith("10"))); + Assert.AreEqual("my Name (10)", FlaxEditor.Utilities.Utils.IncrementNameNumber("my Name (1)", x => x.EndsWith("10)"))); + Assert.AreEqual("my Name110", FlaxEditor.Utilities.Utils.IncrementNameNumber("my Name100", x => x.EndsWith("110"))); + } + } +} +#endif diff --git a/Source/Tools/FlaxEngine.Tests/TestSurface.cs b/Source/Engine/Tests/TestSurface.cs similarity index 99% rename from Source/Tools/FlaxEngine.Tests/TestSurface.cs rename to Source/Engine/Tests/TestSurface.cs index ed4e269c8..1412aeab3 100644 --- a/Source/Tools/FlaxEngine.Tests/TestSurface.cs +++ b/Source/Engine/Tests/TestSurface.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_TESTS using System.Linq; using FlaxEditor.Surface; using NUnit.Framework; @@ -56,3 +57,4 @@ namespace FlaxEditor.Tests } } } +#endif diff --git a/Source/Tools/FlaxEngine.Tests/TestTransform.cs b/Source/Engine/Tests/TestTransform.cs similarity index 99% rename from Source/Tools/FlaxEngine.Tests/TestTransform.cs rename to Source/Engine/Tests/TestTransform.cs index b4d20023c..59238615d 100644 --- a/Source/Tools/FlaxEngine.Tests/TestTransform.cs +++ b/Source/Engine/Tests/TestTransform.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_TESTS using System; using FlaxEngine.Utilities; using NUnit.Framework; @@ -171,3 +172,4 @@ namespace FlaxEngine.Tests } } } +#endif diff --git a/Source/Tools/FlaxEngine.Tests/UndoTests.cs b/Source/Engine/Tests/TestUndo.cs similarity index 99% rename from Source/Tools/FlaxEngine.Tests/UndoTests.cs rename to Source/Engine/Tests/TestUndo.cs index 7e7239f26..7dc4d858d 100644 --- a/Source/Tools/FlaxEngine.Tests/UndoTests.cs +++ b/Source/Engine/Tests/TestUndo.cs @@ -1,5 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. +#if FLAX_TESTS using System; using NUnit.Framework; using Assert = FlaxEngine.Assertions.Assert; @@ -7,7 +8,7 @@ using Assert = FlaxEngine.Assertions.Assert; namespace FlaxEditor.Tests { [TestFixture] - public class UndoTests + public class TestUndo { [Serializable] public class UndoObject @@ -404,3 +405,4 @@ namespace FlaxEditor.Tests } } } +#endif diff --git a/Source/Engine/Threading/JobSystem.cpp b/Source/Engine/Threading/JobSystem.cpp index 396294e56..1e9e55b33 100644 --- a/Source/Engine/Threading/JobSystem.cpp +++ b/Source/Engine/Threading/JobSystem.cpp @@ -8,11 +8,8 @@ #include "Engine/Core/Collections/Dictionary.h" #include "Engine/Engine/EngineService.h" #include "Engine/Profiler/ProfilerCPU.h" +#if USE_CSHARP #include "Engine/Scripting/ManagedCLR/MCore.h" -#if USE_MONO -#include "Engine/Scripting/ManagedCLR/MDomain.h" -#include -#include #endif // Jobs storage perf info: @@ -161,7 +158,7 @@ int32 JobSystemThread::Run() Platform::SetThreadAffinityMask(1ull << Index); JobData data; - bool attachMonoThread = true; + bool attachCSharpThread = true; #if !JOB_SYSTEM_USE_MUTEX moodycamel::ConsumerToken consumerToken(Jobs); #endif @@ -190,13 +187,12 @@ int32 JobSystemThread::Run() if (data.Job.IsBinded()) { -#if USE_MONO +#if USE_CSHARP // Ensure to have C# thread attached to this thead (late init due to MCore being initialized after Job System) - if (attachMonoThread && !mono_domain_get()) + if (attachCSharpThread) { - const auto domain = MCore::GetActiveDomain(); - mono_thread_attach(domain->GetNative()); - attachMonoThread = false; + MCore::Thread::Attach(); + attachCSharpThread = false; } #endif diff --git a/Source/Engine/Tools/ModelTool/ModelTool.Options.cpp b/Source/Engine/Tools/ModelTool/ModelTool.Options.cpp deleted file mode 100644 index b7fb04855..000000000 --- a/Source/Engine/Tools/ModelTool/ModelTool.Options.cpp +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. - -#if COMPILE_WITH_MODEL_TOOL && USE_EDITOR - -#include "ModelTool.h" -#include "Engine/Core/Log.h" -#include "Engine/Serialization/Serialization.h" - -BoundingBox ImportedModelData::LOD::GetBox() const -{ - if (Meshes.IsEmpty()) - return BoundingBox::Empty; - - BoundingBox box; - Meshes[0]->CalculateBox(box); - for (int32 i = 1; i < Meshes.Count(); i++) - { - if (Meshes[i]->Positions.HasItems()) - { - BoundingBox t; - Meshes[i]->CalculateBox(t); - BoundingBox::Merge(box, t, box); - } - } - - return box; -} - -void ModelTool::Options::Serialize(SerializeStream& stream, const void* otherObj) -{ - SERIALIZE_GET_OTHER_OBJ(ModelTool::Options); - - SERIALIZE(Type); - SERIALIZE(CalculateNormals); - SERIALIZE(SmoothingNormalsAngle); - SERIALIZE(FlipNormals); - SERIALIZE(CalculateTangents); - SERIALIZE(SmoothingTangentsAngle); - SERIALIZE(OptimizeMeshes); - SERIALIZE(MergeMeshes); - SERIALIZE(ImportLODs); - SERIALIZE(ImportVertexColors); - SERIALIZE(ImportBlendShapes); - SERIALIZE(LightmapUVsSource); - SERIALIZE(CollisionMeshesPrefix); - SERIALIZE(Scale); - SERIALIZE(Rotation); - SERIALIZE(Translation); - SERIALIZE(CenterGeometry); - SERIALIZE(Duration); - SERIALIZE(FramesRange); - SERIALIZE(DefaultFrameRate); - SERIALIZE(SamplingRate); - SERIALIZE(SkipEmptyCurves); - SERIALIZE(OptimizeKeyframes); - SERIALIZE(ImportScaleTracks); - SERIALIZE(EnableRootMotion); - SERIALIZE(RootNodeName); - SERIALIZE(GenerateLODs); - SERIALIZE(BaseLOD); - SERIALIZE(LODCount); - SERIALIZE(TriangleReduction); - SERIALIZE(ImportMaterials); - SERIALIZE(ImportTextures); - SERIALIZE(RestoreMaterialsOnReimport); - SERIALIZE(GenerateSDF); - SERIALIZE(SDFResolution); - SERIALIZE(SplitObjects); - SERIALIZE(ObjectIndex); -} - -void ModelTool::Options::Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) -{ - DESERIALIZE(Type); - DESERIALIZE(CalculateNormals); - DESERIALIZE(SmoothingNormalsAngle); - DESERIALIZE(FlipNormals); - DESERIALIZE(CalculateTangents); - DESERIALIZE(SmoothingTangentsAngle); - DESERIALIZE(OptimizeMeshes); - DESERIALIZE(MergeMeshes); - DESERIALIZE(ImportLODs); - DESERIALIZE(ImportVertexColors); - DESERIALIZE(ImportBlendShapes); - DESERIALIZE(LightmapUVsSource); - DESERIALIZE(CollisionMeshesPrefix); - DESERIALIZE(Scale); - DESERIALIZE(Rotation); - DESERIALIZE(Translation); - DESERIALIZE(CenterGeometry); - DESERIALIZE(Duration); - DESERIALIZE(FramesRange); - DESERIALIZE(DefaultFrameRate); - DESERIALIZE(SamplingRate); - DESERIALIZE(SkipEmptyCurves); - DESERIALIZE(OptimizeKeyframes); - DESERIALIZE(ImportScaleTracks); - DESERIALIZE(EnableRootMotion); - DESERIALIZE(RootNodeName); - DESERIALIZE(GenerateLODs); - DESERIALIZE(BaseLOD); - DESERIALIZE(LODCount); - DESERIALIZE(TriangleReduction); - DESERIALIZE(ImportMaterials); - DESERIALIZE(ImportTextures); - DESERIALIZE(RestoreMaterialsOnReimport); - DESERIALIZE(GenerateSDF); - DESERIALIZE(SDFResolution); - DESERIALIZE(SplitObjects); - DESERIALIZE(ObjectIndex); - - // [Deprecated on 23.11.2021, expires on 21.11.2023] - int32 AnimationIndex = -1; - DESERIALIZE(AnimationIndex); - if (AnimationIndex != -1) - ObjectIndex = AnimationIndex; -} - -#endif diff --git a/Source/Engine/Tools/ModelTool/ModelTool.cpp b/Source/Engine/Tools/ModelTool/ModelTool.cpp index 2db64c1f7..f2dfd6927 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.cpp +++ b/Source/Engine/Tools/ModelTool/ModelTool.cpp @@ -31,6 +31,7 @@ #include "Engine/ContentImporters/AssetsImportingManager.h" #include "Engine/ContentImporters/CreateMaterial.h" #include "Engine/ContentImporters/CreateCollisionData.h" +#include "Engine/Serialization/Serialization.h" #include "Editor/Utilities/EditorUtilities.h" #include #endif @@ -328,6 +329,116 @@ bool ModelTool::GenerateModelSDF(Model* inputModel, ModelData* modelData, float #if USE_EDITOR +BoundingBox ImportedModelData::LOD::GetBox() const +{ + if (Meshes.IsEmpty()) + return BoundingBox::Empty; + + BoundingBox box; + Meshes[0]->CalculateBox(box); + for (int32 i = 1; i < Meshes.Count(); i++) + { + if (Meshes[i]->Positions.HasItems()) + { + BoundingBox t; + Meshes[i]->CalculateBox(t); + BoundingBox::Merge(box, t, box); + } + } + + return box; +} + +void ModelTool::Options::Serialize(SerializeStream& stream, const void* otherObj) +{ + SERIALIZE_GET_OTHER_OBJ(ModelTool::Options); + + SERIALIZE(Type); + SERIALIZE(CalculateNormals); + SERIALIZE(SmoothingNormalsAngle); + SERIALIZE(FlipNormals); + SERIALIZE(CalculateTangents); + SERIALIZE(SmoothingTangentsAngle); + SERIALIZE(OptimizeMeshes); + SERIALIZE(MergeMeshes); + SERIALIZE(ImportLODs); + SERIALIZE(ImportVertexColors); + SERIALIZE(ImportBlendShapes); + SERIALIZE(LightmapUVsSource); + SERIALIZE(CollisionMeshesPrefix); + SERIALIZE(Scale); + SERIALIZE(Rotation); + SERIALIZE(Translation); + SERIALIZE(CenterGeometry); + SERIALIZE(Duration); + SERIALIZE(FramesRange); + SERIALIZE(DefaultFrameRate); + SERIALIZE(SamplingRate); + SERIALIZE(SkipEmptyCurves); + SERIALIZE(OptimizeKeyframes); + SERIALIZE(ImportScaleTracks); + SERIALIZE(EnableRootMotion); + SERIALIZE(RootNodeName); + SERIALIZE(GenerateLODs); + SERIALIZE(BaseLOD); + SERIALIZE(LODCount); + SERIALIZE(TriangleReduction); + SERIALIZE(ImportMaterials); + SERIALIZE(ImportTextures); + SERIALIZE(RestoreMaterialsOnReimport); + SERIALIZE(GenerateSDF); + SERIALIZE(SDFResolution); + SERIALIZE(SplitObjects); + SERIALIZE(ObjectIndex); +} + +void ModelTool::Options::Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) +{ + DESERIALIZE(Type); + DESERIALIZE(CalculateNormals); + DESERIALIZE(SmoothingNormalsAngle); + DESERIALIZE(FlipNormals); + DESERIALIZE(CalculateTangents); + DESERIALIZE(SmoothingTangentsAngle); + DESERIALIZE(OptimizeMeshes); + DESERIALIZE(MergeMeshes); + DESERIALIZE(ImportLODs); + DESERIALIZE(ImportVertexColors); + DESERIALIZE(ImportBlendShapes); + DESERIALIZE(LightmapUVsSource); + DESERIALIZE(CollisionMeshesPrefix); + DESERIALIZE(Scale); + DESERIALIZE(Rotation); + DESERIALIZE(Translation); + DESERIALIZE(CenterGeometry); + DESERIALIZE(Duration); + DESERIALIZE(FramesRange); + DESERIALIZE(DefaultFrameRate); + DESERIALIZE(SamplingRate); + DESERIALIZE(SkipEmptyCurves); + DESERIALIZE(OptimizeKeyframes); + DESERIALIZE(ImportScaleTracks); + DESERIALIZE(EnableRootMotion); + DESERIALIZE(RootNodeName); + DESERIALIZE(GenerateLODs); + DESERIALIZE(BaseLOD); + DESERIALIZE(LODCount); + DESERIALIZE(TriangleReduction); + DESERIALIZE(ImportMaterials); + DESERIALIZE(ImportTextures); + DESERIALIZE(RestoreMaterialsOnReimport); + DESERIALIZE(GenerateSDF); + DESERIALIZE(SDFResolution); + DESERIALIZE(SplitObjects); + DESERIALIZE(ObjectIndex); + + // [Deprecated on 23.11.2021, expires on 21.11.2023] + int32 AnimationIndex = -1; + DESERIALIZE(AnimationIndex); + if (AnimationIndex != -1) + ObjectIndex = AnimationIndex; +} + void RemoveNamespace(String& name) { const int32 namespaceStart = name.Find(':'); @@ -673,6 +784,15 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op } case ModelType::SkinnedModel: { + // Add single node if imported skeleton is empty + if (data.Skeleton.Nodes.IsEmpty()) + { + data.Skeleton.Nodes.Resize(1); + data.Skeleton.Nodes[0].Name = TEXT("Root"); + data.Skeleton.Nodes[0].LocalTransform = Transform::Identity; + data.Skeleton.Nodes[0].ParentIndex = -1; + } + // Special case if imported model has no bones but has valid skeleton and meshes. // We assume that every mesh uses a single bone. Copy nodes to bones. if (data.Skeleton.Bones.IsEmpty() && Math::IsInRange(data.Skeleton.Nodes.Count(), 1, MAX_BONES_PER_MODEL)) @@ -700,16 +820,6 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op } // Validate - if (data.LODs.IsEmpty() || data.LODs[0].Meshes.IsEmpty()) - { - errorMsg = TEXT("Imported model has no valid geometry."); - return true; - } - if (data.Skeleton.Nodes.IsEmpty() || data.Skeleton.Bones.IsEmpty()) - { - errorMsg = TEXT("Imported model has no skeleton."); - return true; - } if (data.Skeleton.Bones.Count() > MAX_BONES_PER_MODEL) { errorMsg = String::Format(TEXT("Imported model skeleton has too many bones. Imported: {0}, maximum supported: {1}. Please optimize your asset."), data.Skeleton.Bones.Count(), MAX_BONES_PER_MODEL); @@ -720,7 +830,8 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op LOG(Warning, "Imported skinned model has more than one LOD. Removing the lower LODs. Only single one is supported."); data.LODs.Resize(1); } - for (int32 i = 0; i < data.LODs[0].Meshes.Count(); i++) + const int32 meshesCount = data.LODs.Count() != 0 ? data.LODs[0].Meshes.Count() : 0; + for (int32 i = 0; i < meshesCount; i++) { const auto mesh = data.LODs[0].Meshes[i]; if (mesh->BlendIndices.IsEmpty() || mesh->BlendWeights.IsEmpty()) @@ -771,7 +882,7 @@ bool ModelTool::ImportModel(const String& path, ModelData& meshData, Options& op #endif } - LOG(Info, "Imported skeleton has {0} bones, {3} nodes, {1} meshes and {2} material", data.Skeleton.Bones.Count(), data.LODs[0].Meshes.Count(), data.Materials.Count(), data.Nodes.Count()); + LOG(Info, "Imported skeleton has {0} bones, {3} nodes, {1} meshes and {2} material", data.Skeleton.Bones.Count(), meshesCount, data.Materials.Count(), data.Nodes.Count()); break; } case ModelType::Animation: diff --git a/Source/Engine/Tools/ModelTool/ModelTool.h b/Source/Engine/Tools/ModelTool/ModelTool.h index b29bed71f..985bd3ccc 100644 --- a/Source/Engine/Tools/ModelTool/ModelTool.h +++ b/Source/Engine/Tools/ModelTool/ModelTool.h @@ -60,7 +60,6 @@ DECLARE_ENUM_OPERATORS(ImportDataTypes); class ImportedModelData { public: - struct LOD { Array Meshes; @@ -87,7 +86,6 @@ public: }; public: - /// /// The import data types types. /// @@ -124,7 +122,6 @@ public: AnimationData Animation; public: - /// /// Initializes a new instance of the class. /// @@ -179,83 +176,181 @@ struct ModelSDFMip }; /// -/// Models data importing and processing utility. +/// Models data importing and processing utility. /// -class FLAXENGINE_API ModelTool +API_CLASS(Namespace="FlaxEngine.Tools", Static) class FLAXENGINE_API ModelTool { -public: + DECLARE_SCRIPTING_TYPE_MINIMAL(ModelTool); // Optional: inputModel or modelData // Optional: outputSDF or null, outputStream or null static bool GenerateModelSDF(class Model* inputModel, class ModelData* modelData, float resolutionScale, int32 lodIndex, ModelBase::SDFData* outputSDF, class MemoryWriteStream* outputStream, const StringView& assetName, float backfacesThreshold = 0.6f); #if USE_EDITOR + public: /// /// Declares the imported data type. /// - DECLARE_ENUM_EX_3(ModelType, int32, 0, Model, SkinnedModel, Animation); + API_ENUM(Attributes="HideInEditor") enum class ModelType : int32 + { + // The model asset. + Model = 0, + // The skinned model asset. + SkinnedModel = 1, + // The animation asset. + Animation = 2, + }; /// /// Declares the imported animation clip duration. /// - DECLARE_ENUM_EX_2(AnimationDuration, int32, 0, Imported, Custom); + API_ENUM(Attributes="HideInEditor") enum class AnimationDuration : int32 + { + // The imported duration. + Imported = 0, + // The custom duration specified via keyframes range. + Custom = 1, + }; /// - /// Importing model options + /// Model import options. /// - struct Options : public ISerializable + API_STRUCT(Attributes="HideInEditor") struct FLAXENGINE_API Options : public ISerializable { + DECLARE_SCRIPTING_TYPE_MINIMAL(Options); + + // Type of the imported asset. + API_FIELD(Attributes="EditorOrder(0)") ModelType Type = ModelType::Model; - // Geometry - bool CalculateNormals = false; - float SmoothingNormalsAngle = 175.0f; - bool FlipNormals = false; - float SmoothingTangentsAngle = 45.0f; - bool CalculateTangents = false; - bool OptimizeMeshes = true; - bool MergeMeshes = true; - bool ImportLODs = true; - bool ImportVertexColors = true; - bool ImportBlendShapes = false; - ModelLightmapUVsSource LightmapUVsSource = ModelLightmapUVsSource::Disable; - String CollisionMeshesPrefix; + public: // Geometry - // Transform + // Enable model normal vectors recalculating. + API_FIELD(Attributes="EditorOrder(20), EditorDisplay(\"Geometry\"), VisibleIf(nameof(ShowGeometry))") + bool CalculateNormals = false; + // Specifies the maximum angle (in degrees) that may be between two face normals at the same vertex position that their are smoothed together. The default value is 175. + API_FIELD(Attributes="EditorOrder(30), EditorDisplay(\"Geometry\"), VisibleIf(nameof(ShowSmoothingNormalsAngle)), Limit(0, 175, 0.1f)") + float SmoothingNormalsAngle = 175.0f; + // If checked, the imported normal vectors of the mesh will be flipped (scaled by -1). + API_FIELD(Attributes="EditorOrder(35), EditorDisplay(\"Geometry\"), VisibleIf(nameof(ShowGeometry))") + bool FlipNormals = false; + // Enable model tangent vectors recalculating. + API_FIELD(Attributes="EditorOrder(40), EditorDisplay(\"Geometry\"), VisibleIf(nameof(ShowGeometry))") + bool CalculateTangents = false; + // Specifies the maximum angle (in degrees) that may be between two vertex tangents that their tangents and bi-tangents are smoothed. The default value is 45. + API_FIELD(Attributes="EditorOrder(45), EditorDisplay(\"Geometry\"), VisibleIf(nameof(ShowSmoothingTangentsAngle)), Limit(0, 45, 0.1f)") + float SmoothingTangentsAngle = 45.0f; + // Enable/disable meshes geometry optimization. + API_FIELD(Attributes="EditorOrder(50), EditorDisplay(\"Geometry\"), VisibleIf(nameof(ShowGeometry))") + bool OptimizeMeshes = true; + // Enable/disable geometry merge for meshes with the same materials. + API_FIELD(Attributes="EditorOrder(60), EditorDisplay(\"Geometry\"), VisibleIf(nameof(ShowGeometry))") + bool MergeMeshes = true; + // Enable/disable importing meshes Level of Details. + API_FIELD(Attributes="EditorOrder(70), EditorDisplay(\"Geometry\", \"Import LODs\"), VisibleIf(nameof(ShowGeometry))") + bool ImportLODs = true; + // Enable/disable importing vertex colors (channel 0 only). + API_FIELD(Attributes="EditorOrder(80), EditorDisplay(\"Geometry\"), VisibleIf(nameof(ShowModel))") + bool ImportVertexColors = true; + // Enable/disable importing blend shapes (morph targets). + API_FIELD(Attributes="EditorOrder(85), EditorDisplay(\"Geometry\"), VisibleIf(nameof(ShowSkinnedModel))") + bool ImportBlendShapes = false; + // The lightmap UVs source. + API_FIELD(Attributes="EditorOrder(90), EditorDisplay(\"Geometry\", \"Lightmap UVs Source\"), VisibleIf(nameof(ShowModel))") + ModelLightmapUVsSource LightmapUVsSource = ModelLightmapUVsSource::Disable; + // If specified, all meshes which name starts with this prefix will be imported as a separate collision data (excluded used for rendering). + API_FIELD(Attributes="EditorOrder(100), EditorDisplay(\"Geometry\"), VisibleIf(nameof(ShowGeometry))") + String CollisionMeshesPrefix = TEXT(""); + + public: // Transform + + // Custom uniform import scale. + API_FIELD(Attributes="EditorOrder(500), EditorDisplay(\"Transform\")") float Scale = 1.0f; + // Custom import geometry rotation. + API_FIELD(Attributes="EditorOrder(510), EditorDisplay(\"Transform\")") Quaternion Rotation = Quaternion::Identity; + // Custom import geometry offset. + API_FIELD(Attributes="EditorOrder(520), EditorDisplay(\"Transform\")") Float3 Translation = Float3::Zero; + // If checked, the imported geometry will be shifted to the center of mass. + API_FIELD(Attributes="EditorOrder(530), EditorDisplay(\"Transform\")") bool CenterGeometry = false; - // Animation - AnimationDuration Duration = AnimationDuration::Imported; - Float2 FramesRange = Float2::Zero; - float DefaultFrameRate = 0.0f; - float SamplingRate = 0.0f; - bool SkipEmptyCurves = true; - bool OptimizeKeyframes = true; - bool ImportScaleTracks = false; - bool EnableRootMotion = false; - String RootNodeName; + public: // Animation - // Level Of Detail + // Imported animation duration mode. Can use the original value or overriden by settings. + API_FIELD(Attributes="EditorOrder(1000), EditorDisplay(\"Animation\"), VisibleIf(nameof(ShowAnimation))") + AnimationDuration Duration = AnimationDuration::Imported; + // Imported animation first/last frame index. Used only if Duration mode is set to Custom. + API_FIELD(Attributes="EditorOrder(1010), EditorDisplay(\"Animation\"), VisibleIf(nameof(ShowFramesRange)), Limit(0)") + Float2 FramesRange = Float2::Zero; + // The imported animation default frame rate. Can specify the default frames per second amount for imported animation. If value is 0 then the original animation frame rate will be used. + API_FIELD(Attributes="EditorOrder(1020), EditorDisplay(\"Animation\"), VisibleIf(nameof(ShowAnimation)), Limit(0, 1000, 0.01f)") + float DefaultFrameRate = 0.0f; + // The imported animation sampling rate. If value is 0 then the original animation speed will be used. + API_FIELD(Attributes="EditorOrder(1030), EditorDisplay(\"Animation\"), VisibleIf(nameof(ShowAnimation)), Limit(0, 1000, 0.01f)") + float SamplingRate = 0.0f; + // The imported animation will have removed tracks with no keyframes or unspecified data. + API_FIELD(Attributes="EditorOrder(1040), EditorDisplay(\"Animation\"), VisibleIf(nameof(ShowAnimation))") + bool SkipEmptyCurves = true; + // The imported animation channels will be optimized to remove redundant keyframes. + API_FIELD(Attributes="EditorOrder(1050), EditorDisplay(\"Animation\"), VisibleIf(nameof(ShowAnimation))") + bool OptimizeKeyframes = true; + // If checked, the importer will import scale animation tracks (otherwise scale animation will be ignored). + API_FIELD(Attributes="EditorOrder(1055), EditorDisplay(\"Animation\"), VisibleIf(nameof(ShowAnimation))") + bool ImportScaleTracks = false; + // Enables root motion extraction support from this animation. + API_FIELD(Attributes="EditorOrder(1060), EditorDisplay(\"Animation\"), VisibleIf(nameof(ShowAnimation))") + bool EnableRootMotion = false; + // The custom node name to be used as a root motion source. If not specified the actual root node will be used. + API_FIELD(Attributes="EditorOrder(1070), EditorDisplay(\"Animation\"), VisibleIf(nameof(ShowAnimation))") + String RootNodeName = TEXT(""); + + public: // Level Of Detail + + // If checked, the importer will generate a sequence of LODs based on the base LOD index. + API_FIELD(Attributes="EditorOrder(1100), EditorDisplay(\"Level Of Detail\", \"Generate LODs\"), VisibleIf(nameof(ShowGeometry))") bool GenerateLODs = false; + // The index of the LOD from the source model data to use as a reference for following LODs generation. + API_FIELD(Attributes="EditorOrder(1110), EditorDisplay(\"Level Of Detail\", \"Base LOD\"), VisibleIf(nameof(ShowGeometry)), Limit(0, 5)") int32 BaseLOD = 0; + // The amount of LODs to include in the model (all remaining ones starting from Base LOD will be generated). + API_FIELD(Attributes="EditorOrder(1120), EditorDisplay(\"Level Of Detail\", \"LOD Count\"), VisibleIf(nameof(ShowGeometry)), Limit(1, 6)") int32 LODCount = 4; + // The target amount of triangles for the generated LOD (based on the higher LOD). Normalized to range 0-1. For instance 0.4 cuts the triangle count to 40%. + API_FIELD(Attributes="EditorOrder(1130), EditorDisplay(\"Level Of Detail\"), VisibleIf(nameof(ShowGeometry)), Limit(0, 1, 0.001f)") float TriangleReduction = 0.5f; - // Materials + public: // Materials + + // If checked, the importer will create materials for model meshes as specified in the file. + API_FIELD(Attributes="EditorOrder(400), EditorDisplay(\"Materials\"), VisibleIf(nameof(ShowGeometry))") bool ImportMaterials = true; + // If checked, the importer will import texture files used by the model and any embedded texture resources. + API_FIELD(Attributes="EditorOrder(410), EditorDisplay(\"Materials\"), VisibleIf(nameof(ShowGeometry))") bool ImportTextures = true; + // If checked, the importer will try to restore the model material slots. + API_FIELD(Attributes="EditorOrder(420), EditorDisplay(\"Materials\", \"Restore Materials On Reimport\"), VisibleIf(nameof(ShowGeometry))") bool RestoreMaterialsOnReimport = true; - // SDF + public: // SDF + + // If checked, enables generation of Signed Distance Field (SDF). + API_FIELD(Attributes="EditorOrder(1500), EditorDisplay(\"SDF\"), VisibleIf(nameof(ShowModel))") bool GenerateSDF = false; + // Resolution scale for generated Signed Distance Field (SDF) texture. Higher values improve accuracy but increase memory usage and reduce performance. + API_FIELD(Attributes="EditorOrder(1510), EditorDisplay(\"SDF\"), VisibleIf(nameof(ShowModel)), Limit(0.0001f, 100.0f)") float SDFResolution = 1.0f; - // Splitting + public: // Splitting + + // If checked, the imported mesh/animations are splitted into separate assets. Used if ObjectIndex is set to -1. + API_FIELD(Attributes="EditorOrder(2000), EditorDisplay(\"Splitting\")") bool SplitObjects = false; + // The zero-based index for the mesh/animation clip to import. If the source file has more than one mesh/animation it can be used to pick a desire object. Default -1 imports all objects. + API_FIELD(Attributes="EditorOrder(2010), EditorDisplay(\"Splitting\")") int32 ObjectIndex = -1; // Runtime data for objects splitting during import (used internally) @@ -263,14 +358,12 @@ public: Function OnSplitImport; public: - // [ISerializable] void Serialize(SerializeStream& stream, const void* otherObj) override; void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) override; }; public: - /// /// Imports the model source file data. /// @@ -293,7 +386,6 @@ public: static bool ImportModel(const String& path, ModelData& meshData, Options& options, String& errorMsg, const String& autoImportOutput = String::Empty); public: - static int32 DetectLodIndex(const String& nodeName); static bool FindTexture(const String& sourcePath, const String& file, String& path); @@ -321,7 +413,6 @@ public: } private: - #if USE_ASSIMP static bool ImportDataAssimp(const char* path, ImportedModelData& data, Options& options, String& errorMsg); #endif diff --git a/Source/Engine/Tools/TextureTool/TextureTool.Build.cs b/Source/Engine/Tools/TextureTool/TextureTool.Build.cs index 8bdd1c013..f2e675038 100644 --- a/Source/Engine/Tools/TextureTool/TextureTool.Build.cs +++ b/Source/Engine/Tools/TextureTool/TextureTool.Build.cs @@ -36,6 +36,7 @@ public class TextureTool : EngineModule case TargetPlatform.Android: case TargetPlatform.Switch: case TargetPlatform.Mac: + case TargetPlatform.iOS: useStb = true; break; default: throw new InvalidPlatformException(options.Platform.Target); diff --git a/Source/Engine/Tools/TextureTool/TextureTool.cpp b/Source/Engine/Tools/TextureTool/TextureTool.cpp index 8dc94deb3..0f9c8729c 100644 --- a/Source/Engine/Tools/TextureTool/TextureTool.cpp +++ b/Source/Engine/Tools/TextureTool/TextureTool.cpp @@ -12,6 +12,7 @@ #include "Engine/Platform/FileSystem.h" #include "Engine/Serialization/JsonWriter.h" #include "Engine/Serialization/JsonTools.h" +#include "Engine/Scripting/Enums.h" #include "Engine/Graphics/Textures/TextureData.h" #include "Engine/Graphics/PixelFormatExtensions.h" @@ -23,30 +24,10 @@ namespace } #endif -TextureTool::Options::Options() -{ - Type = TextureFormatType::ColorRGB; - IsAtlas = false; - NeverStream = false; - Compress = true; - IndependentChannels = false; - sRGB = false; - GenerateMipMaps = true; - FlipY = false; - Resize = false; - PreserveAlphaCoverage = false; - PreserveAlphaCoverageReference = 0.5f; - TextureGroup = -1; - Scale = 1.0f; - SizeX = 1024; - SizeY = 1024; - MaxSize = GPU_MAX_TEXTURE_SIZE; -} - String TextureTool::Options::ToString() const { return String::Format(TEXT("Type: {}, IsAtlas: {}, NeverStream: {}, IndependentChannels: {}, sRGB: {}, GenerateMipMaps: {}, FlipY: {}, Scale: {}, MaxSize: {}, Resize: {}, PreserveAlphaCoverage: {}, PreserveAlphaCoverageReference: {}, SizeX: {}, SizeY: {}"), - ::ToString(Type), + ScriptingEnum::ToString(Type), IsAtlas, NeverStream, IndependentChannels, diff --git a/Source/Engine/Tools/TextureTool/TextureTool.h b/Source/Engine/Tools/TextureTool/TextureTool.h index b71c6555b..98ebf1d89 100644 --- a/Source/Engine/Tools/TextureTool/TextureTool.h +++ b/Source/Engine/Tools/TextureTool/TextureTool.h @@ -14,128 +14,97 @@ class JsonWriter; /// /// Textures importing, processing and exporting utilities. /// -class FLAXENGINE_API TextureTool +API_CLASS(Namespace="FlaxEngine.Tools", Static) class FLAXENGINE_API TextureTool { -public: + DECLARE_SCRIPTING_TYPE_MINIMAL(TextureTool); /// - /// Importing texture options + /// Texture import options. /// - struct Options : public ISerializable + API_STRUCT(Attributes="HideInEditor") struct FLAXENGINE_API Options : public ISerializable { - /// - /// Texture format type - /// - TextureFormatType Type; + DECLARE_SCRIPTING_TYPE_MINIMAL(Options); - /// - /// True if texture should be imported as a texture atlas resource - /// - bool IsAtlas; + // Texture format type. + API_FIELD(Attributes="EditorOrder(0)") + TextureFormatType Type = TextureFormatType::ColorRGB; - /// - /// True if disable dynamic texture streaming - /// - bool NeverStream; + // True if texture should be imported as a texture atlas (with sprites). + API_FIELD(Attributes="EditorOrder(10)") + bool IsAtlas = false; - /// - /// Enables/disables texture data compression. - /// - bool Compress; + // True if disable dynamic texture streaming. + API_FIELD(Attributes="EditorOrder(20)") + bool NeverStream = false; - /// - /// True if texture channels have independent data - /// - bool IndependentChannels; + // True if disable dynamic texture streaming. + API_FIELD(Attributes="EditorOrder(30)") + bool Compress = true; - /// - /// True if use sRGB format for texture data. Recommended for color maps and diffuse color textures. - /// - bool sRGB; + // True if texture channels have independent data (for compression methods). + API_FIELD(Attributes="EditorOrder(40)") + bool IndependentChannels = false; - /// - /// True if generate mip maps chain for the texture. - /// - bool GenerateMipMaps; + // True if use sRGB format for texture data. Recommended for color maps and diffuse color textures. + API_FIELD(Attributes="EditorOrder(50), EditorDisplay(null, \"sRGB\")") + bool sRGB = false; - /// - /// True if flip Y coordinate of the texture. - /// - bool FlipY; + // True if generate mip maps chain for the texture. + API_FIELD(Attributes="EditorOrder(60)") + bool GenerateMipMaps = true; - /// - /// True if resize the texture. - /// - bool Resize; + // True if flip Y coordinate of the texture. + API_FIELD(Attributes="EditorOrder(70)") + bool FlipY = false; - /// - /// True if preserve alpha coverage in generated mips for alpha test reference. Scales mipmap alpha values to preserve alpha coverage based on an alpha test reference value. - /// - bool PreserveAlphaCoverage; + // Texture size scale. Default is 1. + API_FIELD(Attributes="EditorOrder(80), Limit(0.0001f, 1000.0f, 0.01f)") + float Scale = 1.0f; - /// - /// The reference value for the alpha coverage preserving. - /// - float PreserveAlphaCoverageReference; + // Maximum size of the texture (for both width and height). Higher resolution textures will be resized during importing process. + API_FIELD(Attributes="HideInEditor") + int32 MaxSize = 8192; - /// - /// Texture group for streaming (negative if unused). See Streaming Settings. - /// - int32 TextureGroup; + // True if resize texture on import. Use SizeX/SizeY properties to define texture width and height. Texture scale property will be ignored. + API_FIELD(Attributes="EditorOrder(100)") + bool Resize = false; - /// - /// The import texture scale. - /// - float Scale; + // The width of the imported texture. If Resize property is set to true then texture will be resized during the import to this value. Otherwise it will be ignored. + API_FIELD(Attributes="HideInEditor") + int32 SizeX = 1024; - /// - /// Custom texture size X, use only if Resize texture flag is set. - /// - int32 SizeX; + // The height of the imported texture. If Resize property is set to true then texture will be resized during the import to this value. Otherwise it will be ignored. + API_FIELD(Attributes="HideInEditor") + int32 SizeY = 1024; - /// - /// Custom texture size Y, use only if Resize texture flag is set. - /// - int32 SizeY; + // Check to preserve alpha coverage in generated mips for alpha test reference. Scales mipmap alpha values to preserve alpha coverage based on an alpha test reference value. + API_FIELD(Attributes="EditorOrder(200)") + bool PreserveAlphaCoverage = false; - /// - /// Maximum size of the texture (for both width and height). - /// Higher resolution textures will be resized during importing process. - /// - int32 MaxSize; + // The reference value for the alpha coverage preserving. + API_FIELD(Attributes="EditorOrder(210), VisibleIf(\"PreserveAlphaCoverage\")") + float PreserveAlphaCoverageReference = 0.5f; - /// - /// Function used for fast importing textures used by internal parts of the engine - /// - Function InternalLoad; + // Texture group for streaming (negative if unused). See Streaming Settings. + API_FIELD(Attributes="EditorOrder(300), CustomEditorAlias(\"FlaxEditor.CustomEditors.Dedicated.TextureGroupEditor\")") + int32 TextureGroup = -1; - /// - /// The sprites for the sprite sheet import mode. - /// + // The sprites for the sprite sheet import mode. + API_FIELD(Attributes="HideInEditor") Array Sprites; + // Function used for fast importing textures used by internal parts of the engine + Function InternalLoad; + public: - - /// - /// Init - /// - Options(); - - /// - /// Gets string that contains information about options - /// - /// String String ToString() const; - public: - // [ISerializable] void Serialize(SerializeStream& stream, const void* otherObj) override; void Deserialize(DeserializeStream& stream, ISerializeModifier* modifier) override; }; public: - #if USE_EDITOR /// @@ -193,7 +162,6 @@ public: static bool Resize(TextureData& dst, const TextureData& src, int32 dstWidth, int32 dstHeight); public: - typedef Color (*ReadPixel)(const void*); typedef void (*WritePixel)(const void*, const Color&); @@ -269,7 +237,6 @@ public: static Color SampleLinear(const PixelFormatSampler* sampler, const Float2& uv, const void* data, const Int2& size, int32 rowPitch); private: - enum class ImageType { DDS, diff --git a/Source/Engine/UI/GUI/Common/RichTextBox.Parsing.cs b/Source/Engine/UI/GUI/Common/RichTextBox.Parsing.cs index 2abadb40e..2270136ae 100644 --- a/Source/Engine/UI/GUI/Common/RichTextBox.Parsing.cs +++ b/Source/Engine/UI/GUI/Common/RichTextBox.Parsing.cs @@ -1,6 +1,7 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using System.Collections.Generic; +using System.Runtime.InteropServices; using FlaxEngine.Utilities; namespace FlaxEngine.GUI @@ -224,7 +225,7 @@ namespace FlaxEngine.GUI private void OnLineAdded(ref ParsingContext context, int lineEnd) { // Calculate size of the line - var textBlocks = Utils.ExtractArrayFromList(_textBlocks); + var textBlocks = CollectionsMarshal.AsSpan(_textBlocks); var lineOrigin = textBlocks[context.LineStartTextBlockIndex].Bounds.Location; var lineSize = Float2.Zero; var lineAscender = 0.0f; diff --git a/Source/Engine/UI/GUI/Common/RichTextBoxBase.cs b/Source/Engine/UI/GUI/Common/RichTextBoxBase.cs index 5070bf657..438a7e3d8 100644 --- a/Source/Engine/UI/GUI/Common/RichTextBoxBase.cs +++ b/Source/Engine/UI/GUI/Common/RichTextBoxBase.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; +using System.Runtime.InteropServices; namespace FlaxEngine.GUI { @@ -44,7 +45,7 @@ namespace FlaxEngine.GUI /// True if got text block, otherwise false. public bool GetTextBlock(int index, out TextBlock result) { - var textBlocks = Utils.ExtractArrayFromList(_textBlocks); + var textBlocks = CollectionsMarshal.AsSpan(_textBlocks); var count = _textBlocks.Count; for (int i = 0; i < count; i++) { @@ -95,7 +96,7 @@ namespace FlaxEngine.GUI public override Float2 GetTextSize() { var count = _textBlocks.Count; - var textBlocks = Utils.ExtractArrayFromList(_textBlocks); + var textBlocks = CollectionsMarshal.AsSpan(_textBlocks); var max = Float2.Zero; for (int i = 0; i < count; i++) { @@ -109,7 +110,7 @@ namespace FlaxEngine.GUI public override Float2 GetCharPosition(int index, out float height) { var count = _textBlocks.Count; - var textBlocks = Utils.ExtractArrayFromList(_textBlocks); + var textBlocks = CollectionsMarshal.AsSpan(_textBlocks); // Check if text is empty if (count == 0) @@ -181,7 +182,7 @@ namespace FlaxEngine.GUI { location = Float2.Clamp(location, Float2.Zero, _textSize); - var textBlocks = Utils.ExtractArrayFromList(_textBlocks); + var textBlocks = CollectionsMarshal.AsSpan(_textBlocks); var count = _textBlocks.Count; for (int i = 0; i < count; i++) { @@ -242,7 +243,7 @@ namespace FlaxEngine.GUI Render2D.PushTransform(Matrix3x3.Translation2D(-_viewOffset)); // Calculate text blocks for drawing - var textBlocks = Utils.ExtractArrayFromList(_textBlocks); + var textBlocks = CollectionsMarshal.AsSpan(_textBlocks); var textBlocksCount = _textBlocks?.Count ?? 0; var hasSelection = HasSelection; var selection = new TextRange(SelectionLeft, SelectionRight); diff --git a/Source/Engine/UI/GUI/Common/TextBoxBase.cs b/Source/Engine/UI/GUI/Common/TextBoxBase.cs index d94ff8854..a4ccbe5d2 100644 --- a/Source/Engine/UI/GUI/Common/TextBoxBase.cs +++ b/Source/Engine/UI/GUI/Common/TextBoxBase.cs @@ -1385,6 +1385,8 @@ namespace FlaxEngine.GUI // End editing RemoveFocus(); } + else + return false; return true; case KeyboardKeys.Home: if (shiftDown) diff --git a/Source/Engine/UI/GUI/ContainerControl.cs b/Source/Engine/UI/GUI/ContainerControl.cs index d5a7e89d3..2de96d0b3 100644 --- a/Source/Engine/UI/GUI/ContainerControl.cs +++ b/Source/Engine/UI/GUI/ContainerControl.cs @@ -709,6 +709,12 @@ namespace FlaxEngine.GUI Focus(); } + // Disable layout + if (!_isLayoutLocked) + { + LockChildrenRecursive(); + } + base.OnDestroy(); // Pass event further diff --git a/Source/Engine/UI/GUI/Tooltip.cs b/Source/Engine/UI/GUI/Tooltip.cs index 5089e0211..0a54610fd 100644 --- a/Source/Engine/UI/GUI/Tooltip.cs +++ b/Source/Engine/UI/GUI/Tooltip.cs @@ -99,7 +99,7 @@ namespace FlaxEngine.GUI desc.SupportsTransparency = false; desc.ShowInTaskbar = false; desc.ActivateWhenFirstShown = false; - desc.AllowInput = true; + desc.AllowInput = false; desc.AllowMinimize = false; desc.AllowMaximize = false; desc.AllowDragAndDrop = false; diff --git a/Source/Engine/UI/UICanvas.cpp b/Source/Engine/UI/UICanvas.cpp index 22d7ea550..2aba929d6 100644 --- a/Source/Engine/UI/UICanvas.cpp +++ b/Source/Engine/UI/UICanvas.cpp @@ -1,13 +1,11 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #include "UICanvas.h" -#include "Engine/Scripting/MException.h" +#include "Engine/Scripting/ManagedCLR/MException.h" #include "Engine/Scripting/ManagedCLR/MMethod.h" #include "Engine/Scripting/ManagedCLR/MClass.h" +#include "Engine/Scripting/ManagedCLR/MUtils.h" #include "Engine/Serialization/Serialization.h" -#if USE_MONO -#include -#endif #if COMPILE_WITHOUT_CSHARP #define UICANVAS_INVOKE(event) @@ -85,7 +83,7 @@ void UICanvas::Serialize(SerializeStream& stream, const void* otherObj) params[0] = other ? other->GetOrCreateManagedInstance() : nullptr; MObject* exception = nullptr; auto method = other ? UICanvas_SerializeDiff : UICanvas_Serialize; - auto invokeResultStr = (MonoString*)method->Invoke(GetOrCreateManagedInstance(), params, &exception); + auto invokeResultStr = (MString*)method->Invoke(GetOrCreateManagedInstance(), params, &exception); if (exception) { MException ex(exception); @@ -98,9 +96,7 @@ void UICanvas::Serialize(SerializeStream& stream, const void* otherObj) else { // Write result data - auto invokeResultChars = mono_string_to_utf8(invokeResultStr); - stream.RawValue(invokeResultChars); - mono_free(invokeResultChars); + stream.RawValue(MCore::String::GetChars(invokeResultStr)); } #endif } @@ -118,9 +114,8 @@ void UICanvas::Deserialize(DeserializeStream& stream, ISerializeModifier* modifi rapidjson_flax::StringBuffer buffer; rapidjson_flax::Writer writer(buffer); dataMember->value.Accept(writer); - const auto str = buffer.GetString(); void* args[1]; - args[0] = mono_string_new(mono_domain_get(), str); + args[0] = MUtils::ToString(StringAnsiView(buffer.GetString(), (int32)buffer.GetSize())); MObject* exception = nullptr; UICanvas_Deserialize->Invoke(GetOrCreateManagedInstance(), args, &exception); if (exception) diff --git a/Source/Engine/UI/UIControl.cpp b/Source/Engine/UI/UIControl.cpp index 75d25aed7..37fb2f95c 100644 --- a/Source/Engine/UI/UIControl.cpp +++ b/Source/Engine/UI/UIControl.cpp @@ -1,14 +1,12 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. #include "UIControl.h" -#include "Engine/Scripting/MException.h" +#include "Engine/Scripting/Scripting.h" +#include "Engine/Scripting/ManagedCLR/MException.h" #include "Engine/Scripting/ManagedCLR/MMethod.h" #include "Engine/Scripting/ManagedCLR/MClass.h" -#include "Engine/Scripting/Scripting.h" +#include "Engine/Scripting/ManagedCLR/MCore.h" #include "Engine/Serialization/Serialization.h" -#if USE_MONO -#include -#endif #if COMPILE_WITHOUT_CSHARP #define UICONTROL_INVOKE(event) @@ -80,12 +78,12 @@ void UIControl::Serialize(SerializeStream& stream, const void* otherObj) #if !COMPILE_WITHOUT_CSHARP void* params[2]; - MonoString* controlType = nullptr; + MString* controlType = nullptr; params[0] = &controlType; params[1] = other ? other->GetOrCreateManagedInstance() : nullptr; MObject* exception = nullptr; const auto method = other ? UIControl_SerializeDiff : UIControl_Serialize; - const auto invokeResultStr = (MonoString*)method->Invoke(GetOrCreateManagedInstance(), params, &exception); + const auto invokeResultStr = (MString*)method->Invoke(GetOrCreateManagedInstance(), params, &exception); if (exception) { MException ex(exception); @@ -107,19 +105,16 @@ void UIControl::Serialize(SerializeStream& stream, const void* otherObj) return; } - const auto controlTypeLength = mono_string_length(controlType); - if (controlTypeLength != 0) + const StringView controlTypeChars = MCore::String::GetChars(controlType); + if (controlTypeChars.Length() != 0) { stream.JKEY("Control"); - const auto controlTypeChars = mono_string_to_utf8(controlType); stream.String(controlTypeChars); - mono_free(controlTypeChars); } + const StringView invokeResultStrChars = MCore::String::GetChars(invokeResultStr); stream.JKEY("Data"); - const auto invokeResultChars = mono_string_to_utf8(invokeResultStr); - stream.RawValue(invokeResultChars); - mono_free(invokeResultChars); + stream.RawValue(invokeResultStrChars); #endif } @@ -134,15 +129,15 @@ void UIControl::Deserialize(DeserializeStream& stream, ISerializeModifier* modif DESERIALIZE_MEMBER(NavTargetRight, _navTargetRight); #if !COMPILE_WITHOUT_CSHARP - MonoReflectionType* typeObj = nullptr; + MTypeObject* typeObj = nullptr; const auto controlMember = stream.FindMember("Control"); if (controlMember != stream.MemberEnd()) { const StringAnsiView controlType(controlMember->value.GetStringAnsiView()); - const auto type = Scripting::FindClass(controlType); + const MClass* type = Scripting::FindClass(controlType); if (type != nullptr) { - typeObj = mono_type_get_object(mono_domain_get(), mono_class_get_type(type->GetNative())); + typeObj = INTERNAL_TYPE_GET_OBJECT(type->GetType()); } else { @@ -156,9 +151,8 @@ void UIControl::Deserialize(DeserializeStream& stream, ISerializeModifier* modif rapidjson_flax::StringBuffer buffer; rapidjson_flax::Writer writer(buffer); dataMember->value.Accept(writer); - const auto str = buffer.GetString(); void* args[2]; - args[0] = mono_string_new(mono_domain_get(), str); + args[0] = MCore::String::New(buffer.GetString(), (int32)buffer.GetSize()); args[1] = typeObj; MObject* exception = nullptr; UIControl_Deserialize->Invoke(GetOrCreateManagedInstance(), args, &exception); diff --git a/Source/Engine/Utilities/StringUtils.cs b/Source/Engine/Utilities/StringUtils.cs index 5409acf9f..e758d2899 100644 --- a/Source/Engine/Utilities/StringUtils.cs +++ b/Source/Engine/Utilities/StringUtils.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text.RegularExpressions; namespace FlaxEngine { @@ -260,94 +259,5 @@ namespace FlaxEngine { return s.Replace("\n", "").Replace("\r", ""); } - - private static readonly Regex IncNameRegex1 = new Regex("(\\d+)$"); - private static readonly Regex IncNameRegex2 = new Regex("\\((\\d+)\\)$"); - - /// - /// Tries to parse number in the name brackets at the end of the value and then increment it to create a new name. - /// Supports numbers at the end without brackets. - /// - /// The input name. - /// Custom function to validate the created name. - /// The new name. - public static string IncrementNameNumber(string name, Func isValid) - { - // Validate input name - if (isValid == null || isValid(name)) - return name; - - // Temporary data - int index; - int MaxChecks = 10000; - string result; - - // Find '' case - var match = IncNameRegex1.Match(name); - if (match.Success && match.Groups.Count == 2) - { - // Get result - string num = match.Groups[0].Value; - - // Parse value - if (int.TryParse(num, out index)) - { - // Get prefix - string prefix = name.Substring(0, name.Length - num.Length); - - // Generate name - do - { - result = string.Format("{0}{1}", prefix, ++index); - - if (MaxChecks-- < 0) - return name + Guid.NewGuid(); - } while (!isValid(result)); - - if (result.Length > 0) - return result; - } - } - - // Find ' ()' case - match = IncNameRegex2.Match(name); - if (match.Success && match.Groups.Count == 2) - { - // Get result - string num = match.Groups[0].Value; - num = num.Substring(1, num.Length - 2); - - // Parse value - if (int.TryParse(num, out index)) - { - // Get prefix - string prefix = name.Substring(0, name.Length - num.Length - 2); - - // Generate name - do - { - result = string.Format("{0}({1})", prefix, ++index); - - if (MaxChecks-- < 0) - return name + Guid.NewGuid(); - } while (!isValid(result)); - - if (result.Length > 0) - return result; - } - } - - // Generate name - index = 0; - do - { - result = string.Format("{0} {1}", name, index++); - - if (MaxChecks-- < 0) - return name + Guid.NewGuid(); - } while (!isValid(result)); - - return result; - } } } diff --git a/Source/Engine/Utilities/TextWriter.h b/Source/Engine/Utilities/TextWriter.h index 2825e7c6d..397c6cd9e 100644 --- a/Source/Engine/Utilities/TextWriter.h +++ b/Source/Engine/Utilities/TextWriter.h @@ -22,7 +22,7 @@ public: /// Init with default capacity /// /// Initial capacity in bytes - TextWriter(uint32 capacity) + TextWriter(uint32 capacity = 1024) : _buffer(capacity) { } @@ -36,19 +36,17 @@ public: public: /// - /// Gets writer private buffer + /// Gets writer private buffer. /// - /// Buffer FORCE_INLINE MemoryWriteStream* GetBuffer() { return &_buffer; } /// - /// Gets writer private buffer + /// Gets writer private buffer. /// - /// Buffer - const FORCE_INLINE MemoryWriteStream* GetBuffer() const + FORCE_INLINE const MemoryWriteStream* GetBuffer() const { return &_buffer; } diff --git a/Source/Engine/Utilities/TypeUtils.cs b/Source/Engine/Utilities/TypeUtils.cs new file mode 100644 index 000000000..feb12c83b --- /dev/null +++ b/Source/Engine/Utilities/TypeUtils.cs @@ -0,0 +1,41 @@ +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + +using System; +using System.Text; + +namespace FlaxEngine.Utilities +{ + /// + /// Editor utilities and helper functions for System.Type. + /// + public static partial class TypeUtils + { + /// + /// Gets the typename full name. + /// + /// The type. + /// The full typename of the type. + public static string GetTypeName(this Type type) + { + if (type.IsGenericType && type.IsConstructedGenericType) + { + // For generic types (eg. Dictionary) FullName returns generic parameter types with fully qualified name so simplify it manually + var sb = new StringBuilder(); + sb.Append(type.Namespace); + sb.Append('.'); + sb.Append(type.Name); + sb.Append('['); + var genericArgs = type.GetGenericArguments(); + for (var i = 0; i < genericArgs.Length; i++) + { + if (i != 0) + sb.Append(','); + sb.Append(genericArgs[i].GetTypeName()); + } + sb.Append(']'); + return sb.ToString(); + } + return type.FullName; + } + } +} diff --git a/Source/Engine/Utilities/Utils.cs b/Source/Engine/Utilities/Utils.cs index 9d1ba1bf7..5ac43ecd9 100644 --- a/Source/Engine/Utilities/Utils.cs +++ b/Source/Engine/Utilities/Utils.cs @@ -5,14 +5,16 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; -using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.Loader; +using FlaxEngine.Interop; namespace FlaxEngine { /// /// Class with helper functions. /// - public static class Utils + public static partial class Utils { /// /// Copies data from one memory location to another using an unmanaged memory pointers. @@ -35,8 +37,8 @@ namespace FlaxEngine /// The source location. /// The destination location. /// The length (amount of bytes to copy). - [MethodImpl(MethodImplOptions.InternalCall)] - public static extern void MemoryCopy(IntPtr destination, IntPtr source, ulong length); + [LibraryImport("FlaxEngine", EntryPoint = "PlatformInternal_MemoryCopy")] + public static partial void MemoryCopy(IntPtr destination, IntPtr source, ulong length); /// /// Clears the memory region with zeros. @@ -44,8 +46,8 @@ namespace FlaxEngine /// Uses low-level platform impl. /// Destination memory address /// Size of the memory to clear in bytes - [MethodImpl(MethodImplOptions.InternalCall)] - public static extern void MemoryClear(IntPtr dst, ulong size); + [LibraryImport("FlaxEngine", EntryPoint = "PlatformInternal_MemoryClear")] + public static partial void MemoryClear(IntPtr dst, ulong size); /// /// Compares two blocks of the memory. @@ -54,8 +56,8 @@ namespace FlaxEngine /// The first buffer address. /// The second buffer address. /// Size of the memory to compare in bytes. - [MethodImpl(MethodImplOptions.InternalCall)] - public static extern int MemoryCompare(IntPtr buf1, IntPtr buf2, ulong size); + [LibraryImport("FlaxEngine", EntryPoint = "PlatformInternal_MemoryCompare")] + public static partial int MemoryCompare(IntPtr buf1, IntPtr buf2, ulong size); /// /// Rounds the floating point value up to 1 decimal place. @@ -94,7 +96,11 @@ namespace FlaxEngine /// The empty array object. public static T[] GetEmptyArray() { +#if USE_NETCORE + return Array.Empty(); +#else return Enumerable.Empty() as T[]; +#endif } /// @@ -178,6 +184,19 @@ namespace FlaxEngine return true; } + /// + /// Gets all currently loaded assemblies in the runtime. + /// + /// List of assemblies + public static Assembly[] GetAssemblies() + { +#if USE_NETCORE + return AssemblyLoadContext.Default.Assemblies.Concat(NativeInterop.scriptingAssemblyLoadContext.Assemblies).ToArray(); +#else + return AppDomain.CurrentDomain.GetAssemblies(); +#endif + } + /// /// Gets the assembly with the given name. /// @@ -185,7 +204,7 @@ namespace FlaxEngine /// The assembly or null if not found. public static Assembly GetAssemblyByName(string name) { - return GetAssemblyByName(name, AppDomain.CurrentDomain.GetAssemblies()); + return GetAssemblyByName(name, GetAssemblies()); } /// @@ -209,10 +228,49 @@ namespace FlaxEngine return result; } + /// + /// Gets the location of the assembly. + /// + /// The assembly. + /// Path in the filesystem + public static string GetAssemblyLocation(Assembly assembly) + { +#if USE_NETCORE + var location = assembly.Location; + if (!string.IsNullOrEmpty(location)) + return location; + if (Interop.NativeInterop.AssemblyLocations.TryGetValue(assembly.FullName, out location)) + return location; + return null; +#else + return assembly.Location; +#endif + } + +#if USE_MONO internal static T[] ExtractArrayFromList(List list) { return list != null ? (T[])Internal_ExtractArrayFromList(list) : null; } +#else + private class ExtractArrayFromListContext + { + public static FieldInfo? itemsField; + } + internal static T[] ExtractArrayFromList(List list) + { + if (list == null) + return null; + + if (ExtractArrayFromListContext.itemsField == null) + { + Type listType = typeof(List); + ExtractArrayFromListContext.itemsField = listType.GetField("_items", BindingFlags.NonPublic | BindingFlags.Instance); + } + + return (T[])ExtractArrayFromListContext.itemsField.GetValue(list); // boxing is slower; + } +#endif internal static Float2[] ConvertCollection(Vector2[] v) { @@ -295,8 +353,12 @@ namespace FlaxEngine return result; } - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern Array Internal_ExtractArrayFromList(object list); +#if USE_NETCORE +#else + [LibraryImport("FlaxEngine", EntryPoint = "UtilsInternal_ExtractArrayFromList")] + [return: MarshalUsing(typeof(FlaxEngine.SystemArrayMarshaller))] + internal static partial Array Internal_ExtractArrayFromList([MarshalUsing(typeof(FlaxEngine.GCHandleMarshaller))] object list); +#endif /// /// Reads the color from the binary stream. @@ -956,5 +1018,25 @@ namespace FlaxEngine } } } + + /// + /// Gets the array of method parameter types. + /// + /// The method to get it's parameters. + /// Method parameters array. + public static Type[] GetParameterTypes(this MethodBase method) + { + Type[] parameterTypes; + var parameters = method.GetParameters(); + if (parameters.Length != 0) + { + parameterTypes = new Type[parameters.Length]; + for (int i = 0; i < parameters.Length; i++) + parameterTypes[i] = parameters[i].ParameterType; + } + else + parameterTypes = Array.Empty(); + return parameterTypes; + } } } diff --git a/Source/Editor/Utilities/VariantUtils.cs b/Source/Engine/Utilities/VariantUtils.cs similarity index 99% rename from Source/Editor/Utilities/VariantUtils.cs rename to Source/Engine/Utilities/VariantUtils.cs index d6fe25a5b..465a72f04 100644 --- a/Source/Editor/Utilities/VariantUtils.cs +++ b/Source/Engine/Utilities/VariantUtils.cs @@ -4,11 +4,14 @@ using System; using System.Collections; using System.Collections.Generic; using System.IO; +#if FLAX_EDITOR using FlaxEditor.Scripting; +using FlaxEditor.Utilities; +#endif using FlaxEngine; using Newtonsoft.Json; -namespace FlaxEditor.Utilities +namespace FlaxEngine.Utilities { /// /// Editor utilities and helper functions for Variant type. @@ -76,6 +79,7 @@ namespace FlaxEditor.Utilities #endif } +#if FLAX_EDITOR internal static VariantType ToVariantType(this Type type) { VariantType variantType; @@ -107,7 +111,9 @@ namespace FlaxEditor.Utilities variantType = VariantType.Pointer; else if (type == typeof(string)) variantType = VariantType.String; - else if (type == typeof(Type) || type == typeof(ScriptType)) + else if (type == typeof(Type)) + variantType = VariantType.Typename; + else if (type == typeof(ScriptType)) variantType = VariantType.Typename; else if (typeof(Asset).IsAssignableFrom(type)) variantType = VariantType.Asset; @@ -1286,5 +1292,6 @@ namespace FlaxEditor.Utilities stream.WriteEndObject(); } +#endif } } diff --git a/Source/Engine/Visject/GraphNode.h b/Source/Engine/Visject/GraphNode.h index 9ee44e364..62ff5c783 100644 --- a/Source/Engine/Visject/GraphNode.h +++ b/Source/Engine/Visject/GraphNode.h @@ -9,7 +9,7 @@ template class GraphNode; -#define GRAPH_NODE_MAKE_TYPE(groupID, typeID) ((groupID) << 16 | (typeID)) +#define GRAPH_NODE_MAKE_TYPE(groupID, typeID) (uint32)((groupID) << 16 | (typeID)) #define GRAPH_NODE_MAX_VALUES 32 diff --git a/Source/Engine/Visject/ShaderGraph.cpp b/Source/Engine/Visject/ShaderGraph.cpp index 41c09687f..385a08fb7 100644 --- a/Source/Engine/Visject/ShaderGraph.cpp +++ b/Source/Engine/Visject/ShaderGraph.cpp @@ -786,6 +786,7 @@ void ShaderGenerator::ProcessGroupTools(Box* box, Node* node, Value& value) PLATFORM_CASE(9, "PLATFORM_SWITCH"); PLATFORM_CASE(10, "PLATFORM_PS5"); PLATFORM_CASE(11, "PLATFORM_MAC"); + PLATFORM_CASE(12, "PLATFORM_IOS"); #undef PLATFORM_CASE break; } diff --git a/Source/Engine/Visject/ShaderGraphValue.cpp b/Source/Engine/Visject/ShaderGraphValue.cpp index 5a792a4a1..b55da8cdb 100644 --- a/Source/Engine/Visject/ShaderGraphValue.cpp +++ b/Source/Engine/Visject/ShaderGraphValue.cpp @@ -40,11 +40,11 @@ ShaderGraphValue::ShaderGraphValue(const Variant& v) break; case VariantType::Float: Type = VariantType::Types::Float; - Value = String::Format(TEXT("{0}"), v.AsFloat); + Value = String::Format(TEXT("{}"), v.AsFloat); break; case VariantType::Double: Type = VariantType::Types::Float; - Value = String::Format(TEXT("{0}"), (float)v.AsDouble); + Value = String::Format(TEXT("{}"), (float)v.AsDouble); break; case VariantType::Float2: { @@ -412,7 +412,7 @@ ShaderGraphValue ShaderGraphValue::Cast(const ShaderGraphValue& v, VariantType:: case VariantType::Types::Float4: case VariantType::Types::Double4: case VariantType::Types::Quaternion: - format = TEXT("{0}"); + format = TEXT("{}"); break; } break; @@ -422,7 +422,7 @@ ShaderGraphValue ShaderGraphValue::Cast(const ShaderGraphValue& v, VariantType:: case VariantType::Types::Color: case VariantType::Types::Float4: case VariantType::Types::Double4: - format = TEXT("{0}"); + format = TEXT("{}"); break; } break; diff --git a/Source/Engine/Visject/VisjectGraph.cpp b/Source/Engine/Visject/VisjectGraph.cpp index 4aac619af..37154e09f 100644 --- a/Source/Engine/Visject/VisjectGraph.cpp +++ b/Source/Engine/Visject/VisjectGraph.cpp @@ -9,7 +9,6 @@ #include "Engine/Engine/GameplayGlobals.h" #include "Engine/Scripting/Scripting.h" #include "Engine/Level/Actor.h" -#include "Engine/Scripting/ManagedCLR/MType.h" #include "Engine/Scripting/ManagedCLR/MClass.h" #include "Engine/Scripting/ManagedCLR/MField.h" #include "Engine/Scripting/ManagedCLR/MUtils.h" @@ -693,14 +692,14 @@ void VisjectExecutor::ProcessGroupPacking(Box* box, Node* node, Value& value) const ScriptingTypeHandle typeHandle = Scripting::FindScriptingType(typeNameAnsiView); if (!typeHandle) { -#if !COMPILE_WITHOUT_CSHARP +#if USE_CSHARP const auto mclass = Scripting::FindClass(typeNameAnsiView); if (mclass) { // Fallback to C#-only types - auto instance = (MonoObject*)structureValue; + auto instance = (MObject*)structureValue; CHECK(instance); - if (structureValue.Type.Type != VariantType::ManagedObject || mono_object_get_class(instance) != mclass->GetNative()) + if (structureValue.Type.Type != VariantType::ManagedObject || MCore::Object::GetClass(instance) != mclass) { OnError(node, box, String::Format(TEXT("Cannot unpack value of type {0} to structure of type {1}"), String(MUtils::GetClassFullname(instance)), typeName)); return; @@ -983,6 +982,9 @@ void VisjectExecutor::ProcessGroupTools(Box* box, Node* node, Value& value) case PlatformType::Mac: boxId = 11; break; + case PlatformType::iOS: + boxId = 12; + break; default: ; } value = tryGetValue(node->GetBox(node->GetBox(boxId)->HasConnection() ? boxId : 1), Value::Zero); diff --git a/Source/FlaxEditor.Build.cs b/Source/FlaxEditor.Build.cs index ed2b0e960..85facb2a6 100644 --- a/Source/FlaxEditor.Build.cs +++ b/Source/FlaxEditor.Build.cs @@ -28,6 +28,7 @@ public class FlaxEditor : EngineTarget Architectures = new[] { TargetArchitecture.x64, + TargetArchitecture.ARM64, }; GlobalDefinitions.Add("USE_EDITOR"); Win32ResourceFile = Path.Combine(Globals.EngineRoot, "Source", "FlaxEditor.rc"); diff --git a/Source/FlaxTests.Build.cs b/Source/FlaxTests.Build.cs index 91b44a5ab..7d8275268 100644 --- a/Source/FlaxTests.Build.cs +++ b/Source/FlaxTests.Build.cs @@ -2,6 +2,7 @@ using System; using System.Linq; +using System.IO; using Flax.Build; using Flax.Build.NativeCpp; @@ -19,7 +20,7 @@ public class FlaxTestsTarget : FlaxEditor OutputName = "FlaxTests"; ConfigurationName = "Tests"; IsPreBuilt = false; - UseSymbolsExports = false; + UseSymbolsExports = true; Platforms = new[] { TargetPlatform.Windows, @@ -45,7 +46,11 @@ public class FlaxTestsTarget : FlaxEditor { base.SetupTargetEnvironment(options); + // Setup C# scripts environment + options.ScriptingAPI.IgnoreMissingDocumentationWarnings = true; options.ScriptingAPI.Defines.Add("FLAX_TESTS"); + var nunitFramework = Path.Combine(Globals.EngineRoot, "Source/Platforms/DotNet/NUnit/framework/nunit.framework.dll"); + options.ScriptingAPI.FileReferences.Add(nunitFramework); // Produce console program options.LinkEnv.LinkAsConsoleProgram = true; diff --git a/Source/Platforms/Android/Binaries/Mono/etc/mono/2.0/Browsers/Compat.browser b/Source/Platforms/Android/Binaries/Mono/etc/mono/2.0/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Android/Binaries/Mono/etc/mono/2.0/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Android/Binaries/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Android/Binaries/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Android/Binaries/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Android/Binaries/Mono/etc/mono/2.0/machine.config b/Source/Platforms/Android/Binaries/Mono/etc/mono/2.0/machine.config deleted file mode 100644 index 2577c81dd..000000000 --- a/Source/Platforms/Android/Binaries/Mono/etc/mono/2.0/machine.config +++ /dev/null @@ -1,280 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
- - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Android/Binaries/Mono/etc/mono/2.0/settings.map b/Source/Platforms/Android/Binaries/Mono/etc/mono/2.0/settings.map deleted file mode 100644 index 9a52ccc02..000000000 --- a/Source/Platforms/Android/Binaries/Mono/etc/mono/2.0/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Android/Binaries/Mono/etc/mono/2.0/web.config b/Source/Platforms/Android/Binaries/Mono/etc/mono/2.0/web.config deleted file mode 100644 index e1428f8c3..000000000 --- a/Source/Platforms/Android/Binaries/Mono/etc/mono/2.0/web.config +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.0/Browsers/Compat.browser b/Source/Platforms/Android/Binaries/Mono/etc/mono/4.0/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.0/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Android/Binaries/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.0/machine.config b/Source/Platforms/Android/Binaries/Mono/etc/mono/4.0/machine.config deleted file mode 100644 index f3b71c43c..000000000 --- a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.0/machine.config +++ /dev/null @@ -1,307 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - - -
- -
-
-
-
- - - - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
-
-
-
- - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.0/settings.map b/Source/Platforms/Android/Binaries/Mono/etc/mono/4.0/settings.map deleted file mode 100644 index 4c53aca67..000000000 --- a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.0/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.0/web.config b/Source/Platforms/Android/Binaries/Mono/etc/mono/4.0/web.config deleted file mode 100644 index 2a7dfd2ed..000000000 --- a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.0/web.config +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.5/Browsers/Compat.browser b/Source/Platforms/Android/Binaries/Mono/etc/mono/4.5/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.5/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Android/Binaries/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.5/machine.config b/Source/Platforms/Android/Binaries/Mono/etc/mono/4.5/machine.config deleted file mode 100644 index 455709536..000000000 --- a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.5/machine.config +++ /dev/null @@ -1,310 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
- - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - - -
- -
-
-
-
- - - - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
-
-
-
- - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.5/settings.map b/Source/Platforms/Android/Binaries/Mono/etc/mono/4.5/settings.map deleted file mode 100644 index 4c53aca67..000000000 --- a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.5/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.5/web.config b/Source/Platforms/Android/Binaries/Mono/etc/mono/4.5/web.config deleted file mode 100644 index 324c529f0..000000000 --- a/Source/Platforms/Android/Binaries/Mono/etc/mono/4.5/web.config +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Android/Binaries/Mono/etc/mono/browscap.ini b/Source/Platforms/Android/Binaries/Mono/etc/mono/browscap.ini deleted file mode 100644 index 1267e1deb..000000000 --- a/Source/Platforms/Android/Binaries/Mono/etc/mono/browscap.ini +++ /dev/null @@ -1,16979 +0,0 @@ -;;; Provided courtesy of http://browsers.garykeith.com -;;; Created on Wednesday, June 17, 2009 at 6:30 AM GMT - -[GJK_Browscap_Version] -Version=4476 -Released=Wed, 17 Jun 2009 06:30:21 -0000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DefaultProperties - -[DefaultProperties] -Browser=DefaultProperties -Version=0 -MajorVer=0 -MinorVer=0 -Platform=unknown -Alpha=false -Beta=false -Win16=false -Win32=false -Win64=false -Frames=false -IFrames=false -Tables=false -Cookies=false -BackgroundSounds=false -CDF=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -isBanned=false -isMobileDevice=false -isSyndicationReader=false -Crawler=false -CssVersion=0 -supportsCSS=false -AOL=false -aolVersion=0 -ECMAScriptVersion=0.0 -W3CDOMVersion=0.0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ask - -[Ask] -Parent=DefaultProperties -Browser=Ask -Frames=true -Tables=true -Crawler=true - -[Mozilla/?.0 (compatible; Ask Jeeves/Teoma*)] -Parent=Ask -Browser=Teoma - -[Mozilla/2.0 (compatible; Ask Jeeves)] -Parent=Ask -Browser=AskJeeves - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Baidu - -[Baidu] -Parent=DefaultProperties -Browser=Baidu -Frames=true -Tables=true -Crawler=true - -[BaiduImageSpider*] -Parent=Baidu -Browser=BaiduImageSpider - -[Baiduspider*] -Parent=Baidu -Browser=BaiDu - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google - -[Google] -Parent=DefaultProperties -Browser=Google -Frames=true -IFrames=true -Tables=true -JavaScript=true -Crawler=true - -[* (compatible; Googlebot-Mobile/2.1; *http://www.google.com/bot.html)] -Parent=Google -Browser=Googlebot-Mobile -Frames=false -IFrames=false -Tables=false - -[*Google Wireless Transcoder*] -Parent=Google -Browser=Google Wireless Transcoder - -[AdsBot-Google (?http://www.google.com/adsbot.html)] -Parent=Google -Browser=AdsBot-Google - -[Feedfetcher-Google-iGoogleGadgets;*] -Parent=Google -Browser=iGoogleGadgets -isBanned=true -isSyndicationReader=true - -[Feedfetcher-Google;*] -Parent=Google -Browser=Feedfetcher-Google -isBanned=true -isSyndicationReader=true - -[Google OpenSocial agent (http://www.google.com/feedfetcher.html)] -Parent=Google -Browser=Google OpenSocial - -[Google-Site-Verification/1.0] -Parent=Google -Browser=Google-Site-Verification - -[Google-Sitemaps/*] -Parent=Google -Browser=Google-Sitemaps - -[Googlebot-Image/*] -Parent=Google -Browser=Googlebot-Image -CDF=true - -[googlebot-urlconsole] -Parent=Google -Browser=googlebot-urlconsole - -[Googlebot-Video/1.0] -Parent=Google -Browser=Google-Video - -[Googlebot/2.1 (?http://www.google.com/bot.html)] -Parent=Google -Browser=Googlebot - -[Googlebot/2.1 (?http://www.googlebot.com/bot.html)] -Parent=Google -Browser=Googlebot - -[Googlebot/Test*] -Parent=Google -Browser=Googlebot/Test - -[gsa-crawler*] -Parent=Google -Browser=Google Search Appliance -isBanned=true - -[Mediapartners-Google*] -Parent=Google -Browser=Mediapartners-Google - -[Mozilla/4.0 (compatible; Google Desktop)] -Parent=Google -Browser=Google Desktop - -[Mozilla/4.0 (compatible; GoogleToolbar*)] -Parent=Google -Browser=Google Toolbar -isBanned=true - -[Mozilla/5.0 (compatible; Google Keyword Tool;*)] -Parent=Google -Browser=Google Keyword Tool - -[Mozilla/5.0 (compatible; Googlebot/2.1; ?http://www.google.com/bot.html)] -Parent=Google -Browser=Google Webmaster Tools - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Inktomi - -[Inktomi] -Parent=DefaultProperties -Browser=Inktomi -Frames=true -Tables=true -Crawler=true - -[* (compatible;YahooSeeker/M1A1-R2D2; *)] -Parent=Inktomi -Browser=YahooSeeker-Mobile -Frames=false -Tables=false - -[Mozilla/4.0] -Parent=Inktomi - -[Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)] -Parent=Inktomi -Win32=true - -[Mozilla/4.0 (compatible; Yahoo Japan; for robot study; kasugiya)] -Parent=Inktomi -Browser=Yahoo! RobotStudy -isBanned=true - -[Mozilla/5.0 (compatible; BMC/1.0 (Y!J-AGENT))] -Parent=Inktomi -Browser=Y!J-AGENT/BMC - -[Mozilla/5.0 (compatible; BMF/1.0 (Y!J-AGENT))] -Parent=Inktomi -Browser=Y!J-AGENT/BMF - -[Mozilla/5.0 (compatible; BMI/1.0 (Y!J-AGENT; 1.0))] -Parent=Inktomi -Browser=Y!J-AGENT/BMI - -[Mozilla/5.0 (compatible; Yahoo! DE Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Directory Engine - -[Mozilla/5.0 (compatible; Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html)] -Parent=Inktomi -Browser=Yahoo! Slurp China - -[Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Slurp -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Slurp - -[Mozilla/5.0 (compatible; Yahoo! Verifier/1.1)] -Parent=Inktomi -Browser=Yahoo! Verifier -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Slurp/cat; slurp@inktomi.com; http://www.inktomi.com/slurp.html)] -Parent=Inktomi -Browser=Slurp/cat - -[Mozilla/5.0 (Slurp/si; slurp@inktomi.com; http://www.inktomi.com/slurp.html)] -Parent=Inktomi - -[Mozilla/5.0 (Yahoo-MMCrawler/4.0; mailto:vertical-crawl-support@yahoo-inc.com)] -Parent=Inktomi -Browser=Yahoo-MMCrawler -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Scooter/*] -Parent=Inktomi -Browser=Scooter - -[Scooter/3.3Y!CrawlX] -Parent=Inktomi -Browser=Scooter/3.3Y!CrawlX -Version=3.3 -MajorVer=3 -MinorVer=3 - -[slurp] -Parent=Inktomi -Browser=slurp - -[Y!J-BSC/1.0*] -Parent=Inktomi -Browser=Y!J-BSC -Version=1.0 -MajorVer=1 -MinorVer=0 -isBanned=true - -[Y!J-SRD/1.0] -Parent=Inktomi -Browser=Y!J-SRD -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Yahoo Mindset] -Parent=Inktomi -Browser=Yahoo Mindset - -[Yahoo Pipes*] -Parent=Inktomi -Browser=Yahoo Pipes - -[Yahoo! Mindset] -Parent=Inktomi -Browser=Yahoo! Mindset - -[Yahoo! Slurp/Site Explorer] -Parent=Inktomi -Browser=Yahoo! Site Explorer - -[Yahoo-Blogs/*] -Parent=Inktomi -Browser=Yahoo-Blogs - -[Yahoo-MMAudVid*] -Parent=Inktomi -Browser=Yahoo-MMAudVid - -[Yahoo-MMCrawler*] -Parent=Inktomi -Browser=Yahoo-MMCrawler -isBanned=true - -[YahooFeedSeeker*] -Parent=Inktomi -Browser=YahooFeedSeeker -isSyndicationReader=true -Crawler=false - -[YahooSeeker/*] -Parent=Inktomi -Browser=YahooSeeker -isMobileDevice=true - -[YahooSeeker/CafeKelsa (compatible; Konqueror/3.2; FreeBSD*) (KHTML, like Gecko)] -Parent=Inktomi -Browser=YahooSeeker/CafeKelsa - -[YahooSeeker/CafeKelsa-dev (compatible; Konqueror/3.2; FreeBSD*) (KHTML, like Gecko)] -Parent=Inktomi - -[YahooVideoSearch*] -Parent=Inktomi -Browser=YahooVideoSearch - -[YahooYSMcm*] -Parent=Inktomi -Browser=YahooYSMcm - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN - -[MSN] -Parent=DefaultProperties -Browser=MSN -Frames=true -Tables=true -Crawler=true - -[adidxbot/1.1 (?http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=adidxbot - -[librabot/1.0 (*)] -Parent=MSN -Browser=librabot - -[llssbot/1.0] -Parent=MSN -Browser=llssbot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MSMOBOT/1.1*] -Parent=MSN -Browser=msnbot-mobile -Version=1.1 -MajorVer=1 -MinorVer=1 - -[MSNBot-Academic/1.0*] -Parent=MSN -Browser=MSNBot-Academic -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot-media/1.0*] -Parent=MSN -Browser=msnbot-media -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot-media/1.1*] -Parent=MSN -Browser=msnbot-media -Version=1.1 -MajorVer=1 -MinorVer=1 - -[MSNBot-News/1.0*] -Parent=MSN -Browser=MSNBot-News -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MSNBot-NewsBlogs/1.0*] -Parent=MSN -Browser=MSNBot-NewsBlogs -Version=1 -MajorVer=1 -MinorVer=0 - -[msnbot-products] -Parent=MSN -Browser=msnbot-products - -[msnbot-webmaster/1.0 (*http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=msnbot-webmaster tools - -[msnbot/1.0*] -Parent=MSN -Browser=msnbot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot/1.1*] -Parent=MSN -Browser=msnbot -Version=1.1 -MajorVer=1 -MinorVer=1 - -[msnbot/2.0b*] -Parent=MSN -Version=2.0 -MajorVer=2 -MinorVer=0 -Beta=true - -[MSR-ISRCCrawler] -Parent=MSN -Browser=MSR-ISRCCrawler - -[renlifangbot/1.0 (?http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=renlifangbot - -[T-Mobile Dash Mozilla/4.0 (*) MSNBOT-MOBILE/1.1 (*)] -Parent=MSN -Browser=msnbot-mobile - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yahoo - -[Yahoo] -Parent=DefaultProperties -Browser=Yahoo -Frames=true -Tables=true -Crawler=true - -[Mozilla/4.0 (compatible; Y!J; for robot study*)] -Parent=Yahoo -Browser=Y!J - -[Mozilla/5.0 (Yahoo-Test/4.0*)] -Parent=Yahoo -Browser=Yahoo-Test -Version=4.0 -MajorVer=4 -MinorVer=0 - -[mp3Spider cn-search-devel at yahoo-inc dot com] -Parent=Yahoo -Browser=Yahoo! Media -isBanned=true - -[My Browser] -Parent=Yahoo -Browser=Yahoo! My Browser - -[Y!OASIS/*] -Parent=Yahoo -Browser=Y!OASIS -isBanned=true - -[YahooYSMcm/2.0.0] -Parent=Yahoo -Browser=YahooYSMcm -Version=2.0 -MajorVer=2 -MinorVer=0 -isBanned=true - -[YRL_ODP_CRAWLER] -Parent=Yahoo -Browser=YRL_ODP_CRAWLER -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yandex - -[Yandex] -Parent=DefaultProperties -Browser=Yandex -Frames=true -IFrames=true -Tables=true -Cookies=true -Crawler=true - -[Mozilla/4.0 (compatible; MSIE 5.0; YANDEX)] -Parent=Yandex - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9) Gecko VisualParser/3.0] -Parent=Yandex -Browser=VisualParser -isBanned=true - -[YaDirectBot/*] -Parent=Yandex -Browser=YaDirectBot - -[Yandex/*] -Parent=Yandex - -[YandexBlog/*] -Parent=Yandex -Browser=YandexBlog -isSyndicationReader=true - -[YandexSomething/*] -Parent=Yandex -Browser=YandexSomething -isSyndicationReader=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Best of the Web - -[Best of the Web] -Parent=DefaultProperties -Browser=Best of the Web -Frames=true -Tables=true - -[Mozilla/4.0 (compatible; BOTW Feed Grabber; *http://botw.org)] -Parent=Best of the Web -Browser=BOTW Feed Grabber -isSyndicationReader=true -Crawler=false - -[Mozilla/4.0 (compatible; BOTW Spider; *http://botw.org)] -Parent=Best of the Web -Browser=BOTW Spider -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Boitho - -[Boitho] -Parent=DefaultProperties -Browser=Boitho -Frames=true -Tables=true -Crawler=true - -[boitho.com-dc/*] -Parent=Boitho -Browser=boitho.com-dc - -[boitho.com-robot/*] -Parent=Boitho -Browser=boitho.com-robot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Convera - -[Convera] -Parent=DefaultProperties -Browser=Convera -Frames=true -Tables=true -Crawler=true - -[ConveraCrawler/*] -Parent=Convera -Browser=ConveraCrawler - -[ConveraMultiMediaCrawler/0.1*] -Parent=Convera -Browser=ConveraMultiMediaCrawler -Version=0.1 -MajorVer=0 -MinorVer=1 - -[CrawlConvera*] -Parent=Convera -Browser=CrawlConvera - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DotBot - -[DotBot] -Parent=DefaultProperties -Browser=DotBot -Frames=true -Tables=true -isBanned=true -Crawler=true - -[DotBot/* (http://www.dotnetdotcom.org/*)] -Parent=DotBot - -[Mozilla/5.0 (compatible; DotBot/*; http://www.dotnetdotcom.org/*)] -Parent=DotBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Entireweb - -[Entireweb] -Parent=DefaultProperties -Browser=Entireweb -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[Mozilla/4.0 (compatible; SpeedySpider; www.entireweb.com)] -Parent=Entireweb - -[Speedy Spider (*Beta/*)] -Parent=Entireweb - -[Speedy?Spider?(http://www.entireweb.com*)] -Parent=Entireweb - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Envolk - -[Envolk] -Parent=DefaultProperties -Browser=Envolk -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[envolk/* (?http://www.envolk.com/envolk*)] -Parent=Envolk - -[envolk?ITS?spider/* (?http://www.envolk.com/envolk*)] -Parent=Envolk - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Exalead - -[Exalead] -Parent=DefaultProperties -Browser=Exalead -Frames=true -Tables=true -isBanned=true -Crawler=true - -[Exabot-Images/1.0] -Parent=Exalead -Browser=Exabot-Images -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Exabot-Test/*] -Parent=Exalead -Browser=Exabot-Test - -[Exabot/2.0] -Parent=Exalead -Browser=Exabot - -[Exabot/3.0] -Parent=Exalead -Browser=Exabot -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Liberate - -[Exalead NG/*] -Parent=Exalead -Browser=Exalead NG -isBanned=true - -[Mozilla/5.0 (compatible; Exabot-Images/3.0;*)] -Parent=Exalead -Browser=Exabot-Images - -[Mozilla/5.0 (compatible; Exabot/3.0 (BiggerBetter/tests);*)] -Parent=Exalead -Browser=Exabot/BiggerBetter/tests - -[Mozilla/5.0 (compatible; Exabot/3.0;*)] -Parent=Exalead -Browser=Exabot -isBanned=false - -[Mozilla/5.0 (compatible; NGBot/*)] -Parent=Exalead - -[ng/*] -Parent=Exalead -Browser=Exalead Previewer -Version=1.0 -MajorVer=1 -MinorVer=0 -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fast/AllTheWeb - -[Fast/AllTheWeb] -Parent=DefaultProperties -Browser=Fast/AllTheWeb -Alpha=true -Beta=true -Win16=true -Win32=true -Win64=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -isBanned=true -isMobileDevice=true -isSyndicationReader=true -Crawler=true - -[*FAST Enterprise Crawler*] -Parent=Fast/AllTheWeb -Browser=FAST Enterprise Crawler - -[FAST Data Search Document Retriever/4.0*] -Parent=Fast/AllTheWeb -Browser=FAST Data Search Document Retriever - -[FAST MetaWeb Crawler (helpdesk at fastsearch dot com)] -Parent=Fast/AllTheWeb -Browser=FAST MetaWeb Crawler - -[Fast PartnerSite Crawler*] -Parent=Fast/AllTheWeb -Browser=FAST PartnerSite - -[FAST-WebCrawler/*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler - -[FAST-WebCrawler/*/FirstPage*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/FirstPage - -[FAST-WebCrawler/*/Fresh*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/Fresh - -[FAST-WebCrawler/*/PartnerSite*] -Parent=Fast/AllTheWeb -Browser=FAST PartnerSite - -[FAST-WebCrawler/*?Multimedia*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/Multimedia - -[FastSearch Web Crawler for*] -Parent=Fast/AllTheWeb -Browser=FastSearch Web Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Gigabot - -[Gigabot] -Parent=DefaultProperties -Browser=Gigabot -Frames=true -IFrames=true -Tables=true -Crawler=true - -[Gigabot*] -Parent=Gigabot - -[GigabotSiteSearch/*] -Parent=Gigabot -Browser=GigabotSiteSearch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ilse - -[Ilse] -Parent=DefaultProperties -Browser=Ilse -Frames=true -Tables=true -Crawler=true - -[IlseBot/*] -Parent=Ilse - -[INGRID/?.0*] -Parent=Ilse -Browser=Ilse - -[Mozilla/3.0 (INGRID/*] -Parent=Ilse -Browser=Ilse - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iVia Project - -[iVia Project] -Parent=DefaultProperties -Browser=iVia Project -Frames=true -IFrames=true -Tables=true -Crawler=true - -[DataFountains/DMOZ Downloader*] -Parent=iVia Project -Browser=DataFountains/DMOZ Downloader -isBanned=true - -[DataFountains/DMOZ Feature Vector Corpus Creator*] -Parent=iVia Project -Browser=DataFountains/DMOZ Feature Vector Corpus - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Jayde Online - -[Jayde Online] -Parent=DefaultProperties -Browser=Jayde Online -Frames=true -Tables=true -Crawler=true - -[ExactSeek Crawler/*] -Parent=Jayde Online -Browser=ExactSeek Crawler - -[exactseek-pagereaper-* (crawler@exactseek.com)] -Parent=Jayde Online -Browser=exactseek-pagereaper -isBanned=true - -[exactseek.com] -Parent=Jayde Online -Browser=exactseek.com - -[Jayde Crawler*] -Parent=Jayde Online -Browser=Jayde Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycos - -[Lycos] -Parent=DefaultProperties -Browser=Lycos -Frames=true -Tables=true -Crawler=true - -[Lycos*] -Parent=Lycos -Browser=Lycos - -[Lycos-Proxy] -Parent=Lycos -Browser=Lycos-Proxy - -[Lycos-Spider_(modspider)] -Parent=Lycos -Browser=Lycos-Spider_(modspider) - -[Lycos-Spider_(T-Rex)] -Parent=Lycos -Browser=Lycos-Spider_(T-Rex) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Naver - -[Naver] -Parent=DefaultProperties -Browser=Naver -isBanned=true -Crawler=true - -[Cowbot-* (NHN Corp*naver.com)] -Parent=Naver -Browser=Naver Cowbot - -[Mozilla/4.0 (compatible; NaverBot/*; *)] -Parent=Naver - -[Mozilla/4.0 (compatible; NaverBot/*; nhnbot@naver.com)] -Parent=Naver -Browser=Naver NaverBot - -[NaverBot-* (NHN Corp*naver.com)] -Parent=Naver -Browser=Naver NHN Corp - -[Yeti/*] -Parent=Naver -Browser=Yeti - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Snap - -[Snap] -Parent=DefaultProperties -Browser=Snap -isBanned=true -Crawler=true - -[Mozilla/5.0 (SnapPreviewBot) Gecko/* Firefox/*] -Parent=Snap - -[Snapbot/*] -Parent=Snap - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sogou - -[Sogou] -Parent=DefaultProperties -Browser=Sogou -Frames=true -Tables=true -isBanned=true -Crawler=true - -[shaboyi spider] -Parent=Sogou -Browser=Sogou/Shaboyi Spider - -[Sogou develop spider/*] -Parent=Sogou -Browser=Sogou Develop Spider - -[Sogou head spider*] -Parent=Sogou -Browser=Sogou/HEAD Spider - -[sogou js robot(*)] -Parent=Sogou - -[Sogou Orion spider/*] -Parent=Sogou -Browser=Sogou Orion spider - -[Sogou Pic Agent] -Parent=Sogou -Browser=Sogou/Image Crawler - -[Sogou Pic Spider] -Parent=Sogou -Browser=Sogou Pic Spider - -[Sogou Push Spider/*] -Parent=Sogou -Browser=Sogou Push Spider - -[sogou spider] -Parent=Sogou -Browser=Sogou/Spider - -[sogou web spider*] -Parent=Sogou -Browser=sogou web spider - -[Sogou-Test-Spider/*] -Parent=Sogou -Browser=Sogou-Test-Spider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; YodaoBot - -[YodaoBot] -Parent=DefaultProperties -Browser=YodaoBot -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[Mozilla/5.0 (compatible; YodaoBot/1.*)] -Parent=YodaoBot - -[Mozilla/5.0 (compatible;YodaoBot-Image/1.*)] -Parent=YodaoBot -Browser=YodaoBot-Image - -[WAP_Browser/5.0 (compatible; YodaoBot/1.*)] -Parent=YodaoBot - -[YodaoBot/1.* (*)] -Parent=YodaoBot - -[Best Whois (http://www.bestwhois.net/)] -Parent=DNS Tools -Browser=Best Whois - -[DNSGroup/*] -Parent=DNS Tools -Browser=DNS Group Crawler - -[NG-Search/*] -Parent=Exalead -Browser=NG-SearchBot - -[TouchStone] -Parent=Feeds Syndicators -Browser=TouchStone -isSyndicationReader=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; General Crawlers - -[General Crawlers] -Parent=DefaultProperties -Browser=General Crawlers -Crawler=true - -[A .NET Web Crawler] -Parent=General Crawlers -isBanned=true - -[BabalooSpider/1.*] -Parent=General Crawlers -Browser=BabalooSpider - -[BilgiBot/*] -Parent=General Crawlers -Browser=BilgiBot -isBanned=true - -[bot/* (bot; *bot@bot.bot)] -Parent=General Crawlers -Browser=bot -isBanned=true - -[CyberPatrol*] -Parent=General Crawlers -Browser=CyberPatrol -isBanned=true - -[Cynthia 1.0] -Parent=General Crawlers -Browser=Cynthia -Version=1.0 -MajorVer=1 -MinorVer=0 - -[ddetailsbot (http://www.displaydetails.com)] -Parent=General Crawlers -Browser=ddetailsbot - -[DomainCrawler/1.0 (info@domaincrawler.com; http://www.domaincrawler.com/domains/view/*)] -Parent=General Crawlers -Browser=DomainCrawler - -[DomainsBotBot/1.*] -Parent=General Crawlers -Browser=DomainsBotBot -isBanned=true - -[DomainsDB.net MetaCrawler*] -Parent=General Crawlers -Browser=DomainsDB - -[Drupal (*)] -Parent=General Crawlers -Browser=Drupal - -[Dumbot (version *)*] -Parent=General Crawlers -Browser=Dumbfind - -[EuripBot/*] -Parent=General Crawlers -Browser=Europe Internet Portal - -[eventax/*] -Parent=General Crawlers -Browser=eventax - -[FANGCrawl/*] -Parent=General Crawlers -Browser=Safe-t.net Web Filtering Service -isBanned=true - -[favorstarbot/*] -Parent=General Crawlers -Browser=favorstarbot -isBanned=true - -[FollowSite.com (*)] -Parent=General Crawlers -Browser=FollowSite -isBanned=true - -[Gaisbot*] -Parent=General Crawlers -Browser=Gaisbot - -[Healthbot/Health_and_Longevity_Project_(HealthHaven.com) ] -Parent=General Crawlers -Browser=Healthbot -isBanned=true - -[hitcrawler_0.*] -Parent=General Crawlers -Browser=hitcrawler -isBanned=true - -[htdig/*] -Parent=General Crawlers -Browser=ht://Dig - -[http://hilfe.acont.de/bot.html ACONTBOT] -Parent=General Crawlers -Browser=ACONTBOT -isBanned=true - -[JetBrains*] -Parent=General Crawlers -Browser=Omea Pro - -[KakleBot - www.kakle.com/0.1] -Parent=General Crawlers -Browser=KakleBot - -[KBeeBot/0.*] -Parent=General Crawlers -Browser=KBeeBot -isBanned=true - -[Keyword Density/*] -Parent=General Crawlers -Browser=Keyword Density - -[LetsCrawl.com/1.0*] -Parent=General Crawlers -Browser=LetsCrawl.com -isBanned=true - -[Lincoln State Web Browser] -Parent=General Crawlers -Browser=Lincoln State Web Browser -isBanned=true - -[Links4US-Crawler,*] -Parent=General Crawlers -Browser=Links4US-Crawler -isBanned=true - -[Lorkyll *.* -- lorkyll@444.net] -Parent=General Crawlers -Browser=Lorkyll -isBanned=true - -[Lsearch/sondeur] -Parent=General Crawlers -Browser=Lsearch/sondeur -isBanned=true - -[LucidMedia ClickSense/4.?] -Parent=General Crawlers -Browser=LucidMedia-ClickSense -isBanned=true - -[MapoftheInternet.com?(?http://MapoftheInternet.com)] -Parent=General Crawlers -Browser=MapoftheInternet -isBanned=true - -[Marvin v0.3] -Parent=General Crawlers -Browser=MedHunt -Version=0.3 -MajorVer=0 -MinorVer=3 - -[masidani_bot_v0.6*] -Parent=General Crawlers -Browser=masidani_bot - -[Metaspinner/0.01 (Metaspinner; http://www.meta-spinner.de/; support@meta-spinner.de/)] -Parent=General Crawlers -Browser=Metaspinner/0.01 -Version=0.01 -MajorVer=0 -MinorVer=01 - -[metatagsdir/*] -Parent=General Crawlers -Browser=metatagsdir -isBanned=true - -[Microsoft Windows Network Diagnostics] -Parent=General Crawlers -Browser=Microsoft Windows Network Diagnostics -isBanned=true - -[Miva (AlgoFeedback@miva.com)] -Parent=General Crawlers -Browser=Miva - -[moget/*] -Parent=General Crawlers -Browser=Goo - -[Mozdex/0.7.2*] -Parent=General Crawlers -Browser=Mozdex - -[Mozilla Compatible (MS IE 3.01 WinNT)] -Parent=General Crawlers -isBanned=true - -[Mozilla/* (compatible; WebCapture*)] -Parent=General Crawlers -Browser=WebCapture - -[Mozilla/4.0 (compatible; DepSpid/*)] -Parent=General Crawlers -Browser=DepSpid - -[Mozilla/4.0 (compatible; MSIE *; Windows NT *; SV1)] -Parent=General Crawlers -Browser=AVG - -[Mozilla/4.0 (compatible; MSIE 4.01; Vonna.com b o t)] -Parent=General Crawlers -Browser=Vonna.com -isBanned=true - -[Mozilla/4.0 (compatible; MSIE 4.01; Windows95)] -Parent=General Crawlers -Win32=true - -[Mozilla/4.0 (compatible; MSIE 4.5; Windows 98; )] -Parent=General Crawlers -Win32=true - -[Mozilla/4.0 (compatible; MyFamilyBot/*)] -Parent=General Crawlers -Browser=MyFamilyBot - -[Mozilla/4.0 (compatible; N-Stealth)] -Parent=General Crawlers -Browser=N-Stealth - -[Mozilla/4.0 (compatible; Scumbot/*; Linux/*)] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.0 (compatible; Spider; Linux)] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.0 (compatible; Win32)] -Parent=General Crawlers -Browser=Unknown Crawler -isBanned=true - -[Mozilla/4.1] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.5] -Parent=General Crawlers -isBanned=true - -[Mozilla/5.0 (*http://gnomit.com/) Gecko/* Gnomit/1.0] -Parent=General Crawlers -Browser=Gnomit -isBanned=true - -[Mozilla/5.0 (compatible; AboutUsBot/*)] -Parent=General Crawlers -Browser=AboutUsBot -isBanned=true - -[Mozilla/5.0 (compatible; BuzzRankingBot/*)] -Parent=General Crawlers -Browser=BuzzRankingBot -isBanned=true - -[Mozilla/5.0 (compatible; Diffbot/0.1; http://www.diffbot.com)] -Parent=General Crawlers -Browser=Diffbot - -[Mozilla/5.0 (compatible; FirstSearchBot/1.0; *)] -Parent=General Crawlers -Browser=FirstSearchBot - -[mozilla/5.0 (compatible; genevabot http://www.healthdash.com)] -Parent=General Crawlers -Browser=Healthdash - -[Mozilla/5.0 (compatible; JadynAveBot; *http://www.jadynave.com/robot*] -Parent=General Crawlers -Browser=JadynAveBot -isBanned=true - -[Mozilla/5.0 (compatible; Kyluka crawl; http://www.kyluka.com/crawl.html; crawl@kyluka.com)] -Parent=General Crawlers -Browser=Kyluka - -[Mozilla/5.0 (compatible; MJ12bot/v1.2.*; http://www.majestic12.co.uk/bot.php*)] -Parent=General Crawlers -Browser=MJ12bot -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (compatible; MSIE 7.0 ?http://www.europarchive.org)] -Parent=General Crawlers -Browser=Europe Web Archive - -[Mozilla/5.0 (compatible; Seznam screenshot-generator 2.0;*)] -Parent=General Crawlers -Browser=Seznam screenshot-generator -isBanned=true - -[Mozilla/5.0 (compatible; Twingly Recon; http://www.twingly.com/)] -Parent=General Crawlers -Browser=Twingly Recon - -[Mozilla/5.0 (compatible; unwrapbot/2.*; http://www.unwrap.jp*)] -Parent=General Crawlers -Browser=UnWrap - -[Mozilla/5.0 (compatible; Vermut*)] -Parent=General Crawlers -Browser=Vermut - -[Mozilla/5.0 (compatible; Webbot/*)] -Parent=General Crawlers -Browser=Webbot.ru -isBanned=true - -[n4p_bot*] -Parent=General Crawlers -Browser=n4p_bot - -[nabot*] -Parent=General Crawlers -Browser=Nabot - -[NetCarta_WebMapper/*] -Parent=General Crawlers -Browser=NetCarta_WebMapper -isBanned=true - -[NetID.com Bot*] -Parent=General Crawlers -Browser=NetID.com Bot -isBanned=true - -[neTVision AG andreas.heidoetting@thomson-webcast.net] -Parent=General Crawlers -Browser=neTVision - -[NextopiaBOT*] -Parent=General Crawlers -Browser=NextopiaBOT - -[nicebot] -Parent=General Crawlers -Browser=nicebot -isBanned=true - -[niXXieBot?Foster*] -Parent=General Crawlers -Browser=niXXiebot-Foster - -[Nozilla/P.N (Just for IDS woring)] -Parent=General Crawlers -Browser=Nozilla/P.N -isBanned=true - -[Nudelsalat/*] -Parent=General Crawlers -Browser=Nudelsalat -isBanned=true - -[NV32ts] -Parent=General Crawlers -Browser=NV32ts -isBanned=true - -[Ocelli/*] -Parent=General Crawlers -Browser=Ocelli - -[OpenTaggerBot (http://www.opentagger.com/opentaggerbot.htm)] -Parent=General Crawlers -Browser=OpenTaggerBot - -[Oracle Enterprise Search] -Parent=General Crawlers -Browser=Oracle Enterprise Search -isBanned=true - -[Oracle Ultra Search] -Parent=General Crawlers -Browser=Oracle Ultra Search - -[Pajaczek/*] -Parent=General Crawlers -Browser=Pajaczek -isBanned=true - -[panscient.com] -Parent=General Crawlers -Browser=panscient.com -isBanned=true - -[Patwebbot (http://www.herz-power.de/technik.html)] -Parent=General Crawlers -Browser=Patwebbot - -[PDFBot (crawler@pdfind.com)] -Parent=General Crawlers -Browser=PDFBot - -[Pete-Spider/1.*] -Parent=General Crawlers -Browser=Pete-Spider -isBanned=true - -[PhpDig/*] -Parent=General Crawlers -Browser=PhpDig - -[PlantyNet_WebRobot*] -Parent=General Crawlers -Browser=PlantyNet -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PluckIt - -[PluckItCrawler/1.0 (*)] -Parent=General Crawlers -isMobileDevice=true - -[PMAFind] -Parent=General Crawlers -Browser=PMAFind -isBanned=true - -[Poodle_predictor_1.0] -Parent=General Crawlers -Browser=Poodle Predictor - -[QuickFinder Crawler] -Parent=General Crawlers -Browser=QuickFinder -isBanned=true - -[Radiation Retriever*] -Parent=General Crawlers -Browser=Radiation Retriever -isBanned=true - -[RedCarpet/*] -Parent=General Crawlers -Browser=RedCarpet -isBanned=true - -[RixBot (http://babelserver.org/rix)] -Parent=General Crawlers -Browser=RixBot - -[Rome Client (http://tinyurl.com/64t5n) Ver: 0.*] -Parent=General Crawlers -Browser=TinyURL - -[SBIder/*] -Parent=General Crawlers -Browser=SiteSell - -[ScollSpider/2.*] -Parent=General Crawlers -Browser=ScollSpider -isBanned=true - -[Search Fst] -Parent=General Crawlers -Browser=Search Fst - -[searchbot admin@google.com] -Parent=General Crawlers -Browser=searchbot -isBanned=true - -[Seeker.lookseek.com] -Parent=General Crawlers -Browser=LookSeek -isBanned=true - -[semanticdiscovery/*] -Parent=General Crawlers -Browser=Semantic Discovery - -[SeznamBot/*] -Parent=General Crawlers -Browser=SeznamBot -isBanned=true - -[Shelob (shelob@gmx.net)] -Parent=General Crawlers -Browser=Shelob -isBanned=true - -[shelob v1.*] -Parent=General Crawlers -Browser=shelob -isBanned=true - -[ShopWiki/1.0*] -Parent=General Crawlers -Browser=ShopWiki -Version=1.0 -MajorVer=1 -MinorVer=0 - -[ShowXML/1.0 libwww/5.4.0] -Parent=General Crawlers -Browser=ShowXML -isBanned=true - -[sitecheck.internetseer.com*] -Parent=General Crawlers -Browser=Internetseer - -[SMBot/*] -Parent=General Crawlers -Browser=SMBot - -[sohu*] -Parent=General Crawlers -Browser=sohu-search -isBanned=true - -[SpankBot*] -Parent=General Crawlers -Browser=SpankBot -isBanned=true - -[spider (tspyyp@tom.com)] -Parent=General Crawlers -Browser=spider (tspyyp@tom.com) -isBanned=true - -[Sunrise/0.*] -Parent=General Crawlers -Browser=Sunrise -isBanned=true - -[Superpages URL Verification Engine] -Parent=General Crawlers -Browser=Superpages - -[Surf Knight] -Parent=General Crawlers -Browser=Surf Knight -isBanned=true - -[SurveyBot/*] -Parent=General Crawlers -Browser=SurveyBot -isBanned=true - -[SynapticSearch/AI Crawler 1.?] -Parent=General Crawlers -Browser=SynapticSearch -isBanned=true - -[SyncMgr] -Parent=General Crawlers -Browser=SyncMgr - -[Tagyu Agent/1.0] -Parent=General Crawlers -Browser=Tagyu - -[Talkro Web-Shot/*] -Parent=General Crawlers -Browser=Talkro Web-Shot -isBanned=true - -[Tecomi Bot (http://www.tecomi.com/bot.htm)] -Parent=General Crawlers -Browser=Tecomi - -[TheInformant*] -Parent=General Crawlers -Browser=TheInformant -isBanned=true - -[Toata dragostea*] -Parent=General Crawlers -Browser=Toata dragostea -isBanned=true - -[Tutorial Crawler*] -Parent=General Crawlers -isBanned=true - -[UbiCrawler/*] -Parent=General Crawlers -Browser=UbiCrawler - -[UCmore] -Parent=General Crawlers -Browser=UCmore - -[User*Agent:*] -Parent=General Crawlers -isBanned=true - -[USER_AGENT] -Parent=General Crawlers -Browser=USER_AGENT -isBanned=true - -[VadixBot] -Parent=General Crawlers -Browser=VadixBot - -[VengaBot/*] -Parent=General Crawlers -Browser=VengaBot -isBanned=true - -[Visicom Toolbar] -Parent=General Crawlers -Browser=Visicom Toolbar - -[W3C-WebCon/*] -Parent=General Crawlers -Browser=W3C-WebCon - -[Webclipping.com] -Parent=General Crawlers -Browser=Webclipping.com -isBanned=true - -[webcollage/*] -Parent=General Crawlers -Browser=WebCollage -isBanned=true - -[WebCrawler_1.*] -Parent=General Crawlers -Browser=WebCrawler - -[WebFilter Robot*] -Parent=General Crawlers -Browser=WebFilter Robot - -[WeBoX/*] -Parent=General Crawlers -Browser=WeBoX - -[WebTrends/*] -Parent=General Crawlers -Browser=WebTrends - -[West Wind Internet Protocols*] -Parent=General Crawlers -Browser=Versatel -isBanned=true - -[WhizBang] -Parent=General Crawlers -Browser=WhizBang - -[Willow Internet Crawler by Twotrees V*] -Parent=General Crawlers -Browser=Willow Internet Crawler - -[WIRE/* (Linux; i686; Bot,Robot,Spider,Crawler)] -Parent=General Crawlers -Browser=WIRE -isBanned=true - -[www.fi crawler, contact crawler@www.fi] -Parent=General Crawlers -Browser=www.fi crawler - -[Xerka WebBot v1.*] -Parent=General Crawlers -Browser=Xerka -isBanned=true - -[XML Sitemaps Generator*] -Parent=General Crawlers -Browser=XML Sitemaps Generator - -[XSpider*] -Parent=General Crawlers -Browser=XSpider -isBanned=true - -[YooW!/* (?http://www.yoow.eu)] -Parent=General Crawlers -Browser=YooW! -isBanned=true - -[HiddenMarket-*] -Parent=General RSS -Browser=HiddenMarket -isBanned=true - -[FOTOCHECKER] -Parent=Image Crawlers -Browser=FOTOCHECKER -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Search Engines - -[Search Engines] -Parent=DefaultProperties -Browser=Search Engines -Crawler=true - -[*FDSE robot*] -Parent=Search Engines -Browser=FDSE Robot - -[*Fluffy the spider*] -Parent=Search Engines -Browser=SearchHippo - -[Abacho*] -Parent=Search Engines -Browser=Abacho - -[ah-ha.com crawler (crawler@ah-ha.com)] -Parent=Search Engines -Browser=Ah-Ha - -[AIBOT/*] -Parent=Search Engines -Browser=21Seek.Com - -[ALeadSoftbot/*] -Parent=Search Engines -Browser=ALeadSoftbot - -[Amfibibot/*] -Parent=Search Engines -Browser=Amfibi - -[AnswerBus (http://www.answerbus.com/)] -Parent=Search Engines - -[antibot-V*] -Parent=Search Engines -Browser=antibot - -[appie*(www.walhello.com)] -Parent=Search Engines -Browser=Walhello - -[ASPSeek/*] -Parent=Search Engines -Browser=ASPSeek - -[BigCliqueBOT/*] -Parent=Search Engines -Browser=BigClique.com/BigClic.com - -[Blaiz-Bee/*] -Parent=Search Engines -Browser=RawGrunt - -[btbot/*] -Parent=Search Engines -Browser=Bit Torrent Search Engine - -[Busiversebot/v1.0 (http://www.busiverse.com/bot.php)] -Parent=Search Engines -Browser=Busiversebot -isBanned=true - -[CatchBot/*; http://www.catchbot.com] -Parent=Search Engines -Browser=CatchBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[CipinetBot (http://www.cipinet.com/bot.html)] -Parent=Search Engines -Browser=CipinetBot - -[Cogentbot/1.?*] -Parent=Search Engines -Browser=Cogentbot - -[compatible; Mozilla 4.0; MSIE 5.5; (SqwidgeBot v1.01 - http://www.sqwidge.com/bot/)] -Parent=Search Engines -Browser=SqwidgeBot - -[cosmos*] -Parent=Search Engines -Browser=Xyleme - -[Deepindex] -Parent=Search Engines -Browser=Deepindex - -[DiamondBot] -Parent=Search Engines -Browser=DiamondBot - -[Dumbot*] -Parent=Search Engines -Browser=Dumbot -Version=0.2 -MajorVer=0 -MinorVer=2 -Beta=true - -[Eule?Robot*] -Parent=Search Engines -Browser=Eule-Robot - -[Faxobot/*] -Parent=Search Engines -Browser=Faxo - -[Filangy/*] -Parent=Search Engines -Browser=Filangy - -[flatlandbot/*] -Parent=Search Engines -Browser=Flatland - -[Fooky.com/ScorpionBot/ScoutOut;*] -Parent=Search Engines -Browser=ScorpionBot -isBanned=true - -[FyberSpider*] -Parent=Search Engines -Browser=FyberSpider -isBanned=true - -[Gaisbot/*] -Parent=Search Engines -Browser=Gaisbot - -[gazz/*(gazz@nttr.co.jp)] -Parent=Search Engines -Browser=gazz - -[geniebot*] -Parent=Search Engines -Browser=GenieKnows - -[GOFORITBOT (?http://www.goforit.com/about/?)] -Parent=Search Engines -Browser=GoForIt - -[GoGuidesBot/*] -Parent=Search Engines -Browser=GoGuidesBot - -[GroschoBot/*] -Parent=Search Engines -Browser=GroschoBot - -[GurujiBot/1.*] -Parent=Search Engines -Browser=GurujiBot -isBanned=true - -[HenryTheMiragoRobot*] -Parent=Search Engines -Browser=Mirago - -[HolmesBot (http://holmes.ge)] -Parent=Search Engines -Browser=HolmesBot - -[Hotzonu/*] -Parent=Search Engines -Browser=Hotzonu - -[HyperEstraier/*] -Parent=Search Engines -Browser=HyperEstraier -isBanned=true - -[i1searchbot/*] -Parent=Search Engines -Browser=i1searchbot - -[IIITBOT/1.*] -Parent=Search Engines -Browser=Indian Language Web Search Engine - -[Iltrovatore-?etaccio/*] -Parent=Search Engines -Browser=Iltrovatore-Setaccio - -[InfociousBot (?http://corp.infocious.com/tech_crawler.php)] -Parent=Search Engines -Browser=InfociousBot -isBanned=true - -[Infoseek SideWinder/*] -Parent=Search Engines -Browser=Infoseek - -[iSEEKbot/*] -Parent=Search Engines -Browser=iSEEKbot - -[Knight/0.? (Zook Knight; http://knight.zook.in/; knight@zook.in)] -Parent=Search Engines -Browser=Knight - -[Kolinka Forum Search (www.kolinka.com)] -Parent=Search Engines -Browser=Kolinka Forum Search -isBanned=true - -[KRetrieve/] -Parent=Search Engines -Browser=KRetrieve -isBanned=true - -[LapozzBot/*] -Parent=Search Engines -Browser=LapozzBot - -[Linknzbot*] -Parent=Search Engines -Browser=Linknzbot - -[LocalcomBot/*] -Parent=Search Engines -Browser=LocalcomBot - -[Mail.Ru/1.0] -Parent=Search Engines -Browser=Mail.Ru - -[MaSagool/*] -Parent=Search Engines -Browser=Sagoo -Version=1.0 -MajorVer=1 -MinorVer=0 - -[miniRank/*] -Parent=Search Engines -Browser=miniRank - -[Mnogosearch*] -Parent=Search Engines -Browser=Mnogosearch - -[Mozilla/0.9* no dos :) (Linux)] -Parent=Search Engines -Browser=goliat -isBanned=true - -[Mozilla/4.0 (compatible; Arachmo)] -Parent=Search Engines -Browser=Arachmo - -[Mozilla/4.0 (compatible; http://search.thunderstone.com/texis/websearch/about.html)] -Parent=Search Engines -Browser=ThunderStone -isBanned=true - -[Mozilla/4.0 (compatible; MSIE *; Windows NT; Girafabot; girafabot at girafa dot com; http://www.girafa.com)] -Parent=Search Engines -Browser=Girafabot -Win32=true - -[Mozilla/4.0 (compatible; Vagabondo/*; webcrawler at wise-guys dot nl; *)] -Parent=Search Engines -Browser=Vagabondo - -[Mozilla/4.0(?compatible; MSIE 6.0; Qihoo *)] -Parent=Search Engines -Browser=Qihoo - -[Mozilla/4.7 (compatible; WhizBang; http://www.whizbang.com/crawler)] -Parent=Search Engines -Browser=Inxight Software - -[Mozilla/5.0 (*) VoilaBot*] -Parent=Search Engines -Browser=VoilaBot -isBanned=true - -[Mozilla/5.0 (compatible; ActiveTouristBot*; http://www.activetourist.com)] -Parent=Search Engines -Browser=ActiveTouristBot - -[Mozilla/5.0 (compatible; Butterfly/1.0; *)*] -Parent=Search Engines -Browser=Butterfly - -[Mozilla/5.0 (compatible; Charlotte/*; *)] -Parent=Search Engines -Browser=Charlotte -Beta=true -isBanned=true - -[Mozilla/5.0 (compatible; CXL-FatAssANT*)] -Parent=Search Engines -Browser=FatAssANT - -[Mozilla/5.0 (compatible; DBLBot/1.0; ?http://www.dontbuylists.com/)] -Parent=Search Engines -Browser=DBLBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (compatible; EARTHCOM.info/*)] -Parent=Search Engines -Browser=EARTHCOM - -[Mozilla/5.0 (compatible; Lipperhey Spider; http://www.lipperhey.com/)] -Parent=Search Engines -Browser=Lipperhey Spider - -[Mozilla/5.0 (compatible; MojeekBot/*; http://www.mojeek.com/bot.html)] -Parent=Search Engines -Browser=MojeekBot - -[Mozilla/5.0 (compatible; NLCrawler/*] -Parent=Search Engines -Browser=Northern Light Web Search - -[Mozilla/5.0 (compatible; OsO;*] -Parent=Search Engines -Browser=Octopodus -isBanned=true - -[Mozilla/5.0 (compatible; Pogodak.*)] -Parent=Search Engines -Browser=Pogodak - -[Mozilla/5.0 (compatible; Quantcastbot/1.*)] -Parent=Search Engines -Browser=Quantcastbot - -[Mozilla/5.0 (compatible; ScoutJet; *http://www.scoutjet.com/)] -Parent=Search Engines -Browser=ScoutJet - -[Mozilla/5.0 (compatible; Scrubby/*; http://www.scrubtheweb.com/abs/meta-check.html)] -Parent=Search Engines -Browser=Scrubby -isBanned=true - -[Mozilla/5.0 (compatible; YoudaoBot/1.*; http://www.youdao.com/help/webmaster/spider/*)] -Parent=Search Engines -Browser=YoudaoBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Twiceler*)] -Parent=Search Engines -Browser=Twiceler -isBanned=true - -[Mozilla/5.0 CostaCider Search*] -Parent=Search Engines -Browser=CostaCider Search - -[Mozilla/5.0 GurujiBot/1.0 (*)] -Parent=Search Engines -Browser=GurujiBot - -[NavissoBot] -Parent=Search Engines -Browser=NavissoBot - -[NextGenSearchBot*(for information visit *)] -Parent=Search Engines -Browser=ZoomInfo -isBanned=true - -[Norbert the Spider(Burf.com)] -Parent=Search Engines -Browser=Norbert the Spider - -[NuSearch Spider*] -Parent=Search Engines -Browser=nuSearch - -[ObjectsSearch/*] -Parent=Search Engines -Browser=ObjectsSearch - -[OpenISearch/1.*] -Parent=Search Engines -Browser=OpenISearch (Amazon) - -[Pagebull http://www.pagebull.com/] -Parent=Search Engines -Browser=Pagebull - -[PEERbot*] -Parent=Search Engines -Browser=PEERbot - -[Pompos/*] -Parent=Search Engines -Browser=Pompos - -[Popdexter/*] -Parent=Search Engines -Browser=Popdex - -[Qweery*] -Parent=Search Engines -Browser=QweeryBot - -[RedCell/* (*)] -Parent=Search Engines -Browser=RedCell - -[Scrubby/*] -Parent=Search Engines -Browser=Scrub The Web - -[Search-10/*] -Parent=Search Engines -Browser=Search-10 - -[search.ch*] -Parent=Search Engines -Browser=Swiss Search Engine - -[Searchmee! Spider*] -Parent=Search Engines -Browser=Searchmee! - -[Seekbot/*] -Parent=Search Engines -Browser=Seekbot - -[SiteSpider (http://www.SiteSpider.com/)] -Parent=Search Engines -Browser=SiteSpider - -[Spinne/*] -Parent=Search Engines -Browser=Spinne - -[sproose/*] -Parent=Search Engines -Browser=Sproose - -[Sqeobot/0.*] -Parent=Search Engines -Browser=Branzel -isBanned=true - -[SquigglebotBot/*] -Parent=Search Engines -Browser=SquigglebotBot -isBanned=true - -[StackRambler/*] -Parent=Search Engines -Browser=StackRambler - -[SygolBot*] -Parent=Search Engines -Browser=SygolBot - -[SynoBot] -Parent=Search Engines -Browser=SynoBot - -[Szukacz/*] -Parent=Search Engines -Browser=Szukacz - -[Tarantula/*] -Parent=Search Engines -Browser=Tarantula -isBanned=true - -[TerrawizBot/*] -Parent=Search Engines -Browser=TerrawizBot -isBanned=true - -[Tkensaku/*] -Parent=Search Engines -Browser=Tkensaku - -[TMCrawler] -Parent=Search Engines -Browser=TMCrawler -isBanned=true - -[Twingly Recon] -Parent=Search Engines -Browser=Twingly Recon -isBanned=true - -[updated/*] -Parent=Search Engines -Browser=Updated! - -[URL Spider Pro/*] -Parent=Search Engines -Browser=URL Spider Pro - -[URL Spider SQL*] -Parent=Search Engines -Browser=Innerprise Enterprise Search - -[VMBot/*] -Parent=Search Engines -Browser=VMBot - -[voyager/2.0 (http://www.kosmix.com/html/crawler.html)] -Parent=Search Engines -Browser=Voyager - -[wadaino.jp-crawler*] -Parent=Search Engines -Browser=wadaino.jp -isBanned=true - -[WebAlta Crawler/*] -Parent=Search Engines -Browser=WebAlta Crawler -isBanned=true - -[WebCorp/*] -Parent=Search Engines -Browser=WebCorp -isBanned=true - -[webcrawl.net] -Parent=Search Engines -Browser=webcrawl.net - -[WISEbot/*] -Parent=Search Engines -Browser=WISEbot -isBanned=true - -[Wotbox/*] -Parent=Search Engines -Browser=Wotbox - -[www.zatka.com] -Parent=Search Engines -Browser=Zatka - -[WWWeasel Robot v*] -Parent=Search Engines -Browser=World Wide Weasel - -[YadowsCrawler*] -Parent=Search Engines -Browser=YadowsCrawler - -[YodaoBot/*] -Parent=Search Engines -Browser=YodaoBot -isBanned=true - -[ZeBot_www.ze.bz*] -Parent=Search Engines -Browser=ZE.bz - -[zibber-v*] -Parent=Search Engines -Browser=Zibb - -[ZipppBot/*] -Parent=Search Engines -Browser=ZipppBot - -[ATA-Translation-Service] -Parent=Translators -Browser=ATA-Translation-Service - -[GJK_Browser_Check] -Parent=Version Checkers -Browser=GJK_Browser_Check - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Hatena - -[Hatena] -Parent=DefaultProperties -Browser=Hatena -isBanned=true -Crawler=true - -[Feed::Find/*] -Parent=Hatena -Browser=Feed Find -isSyndicationReader=true - -[Hatena Antenna/*] -Parent=Hatena -Browser=Hatena Antenna - -[Hatena Bookmark/*] -Parent=Hatena -Browser=Hatena Bookmark - -[Hatena RSS/*] -Parent=Hatena -Browser=Hatena RSS -isSyndicationReader=true - -[Hatena::Crawler/*] -Parent=Hatena -Browser=Hatena Crawler - -[HatenaScreenshot*] -Parent=Hatena -Browser=HatenaScreenshot - -[URI::Fetch/*] -Parent=Hatena -Browser=URI::Fetch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Internet Archive - -[Internet Archive] -Parent=DefaultProperties -Browser=Internet Archive -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*heritrix*] -Parent=Internet Archive -Browser=Heritrix -isBanned=true - -[ia_archiver*] -Parent=Internet Archive -Browser=Internet Archive - -[InternetArchive/*] -Parent=Internet Archive -Browser=InternetArchive - -[Mozilla/5.0 (compatible; archive.org_bot/1.*)] -Parent=Internet Archive - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nutch - -[Nutch] -Parent=DefaultProperties -Browser=Nutch -isBanned=true -Crawler=true - -[*Nutch*] -Parent=Nutch -isBanned=true - -[CazoodleBot/*] -Parent=Nutch -Browser=CazoodleBot - -[LOOQ/0.1*] -Parent=Nutch -Browser=LOOQ - -[Nutch/0.? (OpenX Spider)] -Parent=Nutch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Webaroo - -[Webaroo] -Parent=DefaultProperties -Browser=Webaroo - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Webaroo/*)] -Parent=Webaroo -Browser=Webaroo - -[Mozilla/5.0 (Windows; U; Windows *; *; rv:*) Gecko/* Firefox/* webaroo/*] -Parent=Webaroo -Browser=Webaroo - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Word Press - -[Word Press] -Parent=DefaultProperties -Browser=Word Press -Alpha=true -Beta=true -Win16=true -Win32=true -Win64=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -isBanned=true -isMobileDevice=true -isSyndicationReader=true -Crawler=true - -[WordPress-B-/2.*] -Parent=Word Press -Browser=WordPress-B - -[WordPress-Do-P-/2.*] -Parent=Word Press -Browser=WordPress-Do-P - -[BlueCoat ProxySG] -Parent=Blue Coat Systems -Browser=BlueCoat ProxySG - -[CerberianDrtrs/*] -Parent=Blue Coat Systems -Browser=Cerberian - -[Inne: Mozilla/4.0 (compatible; Cerberian Drtrs*)] -Parent=Blue Coat Systems -Browser=Cerberian - -[Mozilla/4.0 (compatible; Cerberian Drtrs*)] -Parent=Blue Coat Systems -Browser=Cerberian - -[Mozilla/4.0 (compatible; MSIE 6.0; Bluecoat DRTR)] -Parent=Blue Coat Systems -Browser=Bluecoat - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Copyright/Plagiarism - -[Copyright/Plagiarism] -Parent=DefaultProperties -Browser=Copyright/Plagiarism -isBanned=true -Crawler=true - -[BDFetch] -Parent=Copyright/Plagiarism -Browser=BDFetch - -[copyright sheriff (*)] -Parent=Copyright/Plagiarism -Browser=copyright sheriff - -[CopyRightCheck*] -Parent=Copyright/Plagiarism -Browser=CopyRightCheck - -[FairAd Client*] -Parent=Copyright/Plagiarism -Browser=FairAd Client - -[iCopyright Conductor*] -Parent=Copyright/Plagiarism -Browser=iCopyright Conductor - -[IPiumBot laurion(dot)com] -Parent=Copyright/Plagiarism -Browser=IPiumBot - -[IWAgent/*] -Parent=Copyright/Plagiarism -Browser=Brand Protect - -[Mozilla/5.0 (compatible; DKIMRepBot/*)] -Parent=Copyright/Plagiarism -Browser=DKIMRepBot - -[oBot] -Parent=Copyright/Plagiarism -Browser=oBot - -[SlySearch/*] -Parent=Copyright/Plagiarism -Browser=SlySearch - -[TurnitinBot/*] -Parent=Copyright/Plagiarism -Browser=TurnitinBot - -[TutorGigBot/*] -Parent=Copyright/Plagiarism -Browser=TutorGig - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DNS Tools - -[DNS Tools] -Parent=DefaultProperties -Browser=DNS Tools -Crawler=true - -[Domain Dossier utility*] -Parent=DNS Tools -Browser=Domain Dossier - -[Mozilla/5.0 (compatible; DNS-Digger/*)] -Parent=DNS Tools -Browser=DNS-Digger - -[OpenDNS Domain Crawler noc@opendns.com] -Parent=DNS Tools -Browser=OpenDNS Domain Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Download Managers - -[Download Managers] -Parent=DefaultProperties -Browser=Download Managers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[AndroidDownloadManager] -Parent=Download Managers -Browser=Android Download Manager - -[AutoMate5] -Parent=Download Managers -Browser=AutoMate5 - -[Beamer*] -Parent=Download Managers -Browser=Beamer - -[BitBeamer/*] -Parent=Download Managers -Browser=BitBeamer - -[BitTorrent/*] -Parent=Download Managers -Browser=BitTorrent - -[DA *] -Parent=Download Managers -Browser=Download Accelerator - -[Download Demon*] -Parent=Download Managers -Browser=Download Demon - -[Download Express*] -Parent=Download Managers -Browser=Download Express - -[Download Master*] -Parent=Download Managers -Browser=Download Master - -[Download Ninja*] -Parent=Download Managers -Browser=Download Ninja - -[Download Wonder*] -Parent=Download Managers -Browser=Download Wonder - -[DownloadSession*] -Parent=Download Managers -Browser=DownloadSession - -[EasyDL/*] -Parent=Download Managers -Browser=EasyDL - -[FDM 1.x] -Parent=Download Managers -Browser=Free Download Manager - -[FlashGet] -Parent=Download Managers -Browser=FlashGet - -[FreshDownload/*] -Parent=Download Managers -Browser=FreshDownload - -[GetRight/*] -Parent=Download Managers -Browser=GetRight - -[GetRightPro/*] -Parent=Download Managers -Browser=GetRightPro - -[GetSmart/*] -Parent=Download Managers -Browser=GetSmart - -[Go!Zilla*] -Parent=Download Managers -Browser=GoZilla - -[Gozilla/*] -Parent=Download Managers -Browser=Gozilla - -[Internet Ninja*] -Parent=Download Managers -Browser=Internet Ninja - -[Kontiki Client*] -Parent=Download Managers -Browser=Kontiki Client - -[lftp/3.2.1] -Parent=Download Managers -Browser=lftp - -[LightningDownload/*] -Parent=Download Managers -Browser=LightningDownload - -[LMQueueBot/*] -Parent=Download Managers -Browser=LMQueueBot - -[MetaProducts Download Express/*] -Parent=Download Managers -Browser=Download Express - -[Mozilla/4.0 (compatible; Getleft*)] -Parent=Download Managers -Browser=Getleft - -[Myzilla] -Parent=Download Managers -Browser=Myzilla - -[Net Vampire/*] -Parent=Download Managers -Browser=Net Vampire - -[Net_Vampire*] -Parent=Download Managers -Browser=Net_Vampire - -[NetAnts*] -Parent=Download Managers -Browser=NetAnts - -[NetPumper*] -Parent=Download Managers -Browser=NetPumper - -[NetSucker*] -Parent=Download Managers -Browser=NetSucker - -[NetZip Downloader*] -Parent=Download Managers -Browser=NetZip Downloader - -[NexTools WebAgent*] -Parent=Download Managers -Browser=NexTools WebAgent - -[Offline Downloader*] -Parent=Download Managers -Browser=Offline Downloader - -[P3P Client] -Parent=Download Managers -Browser=P3P Client - -[PageDown*] -Parent=Download Managers -Browser=PageDown - -[PicaLoader*] -Parent=Download Managers -Browser=PicaLoader - -[Prozilla*] -Parent=Download Managers -Browser=Prozilla - -[RealDownload/*] -Parent=Download Managers -Browser=RealDownload - -[sEasyDL/*] -Parent=Download Managers -Browser=EasyDL - -[shareaza*] -Parent=Download Managers -Browser=shareaza - -[SmartDownload/*] -Parent=Download Managers -Browser=SmartDownload - -[SpeedDownload/*] -Parent=Download Managers -Browser=Speed Download - -[Star*Downloader/*] -Parent=Download Managers -Browser=StarDownloader - -[STEROID Download] -Parent=Download Managers -Browser=STEROID Download - -[SuperBot/*] -Parent=Download Managers -Browser=SuperBot - -[Vegas95/*] -Parent=Download Managers -Browser=Vegas95 - -[WebZIP*] -Parent=Download Managers -Browser=WebZIP - -[Wget*] -Parent=Download Managers -Browser=Wget - -[WinTools] -Parent=Download Managers -Browser=WinTools - -[Xaldon WebSpider*] -Parent=Download Managers -Browser=Xaldon WebSpider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; E-Mail Harvesters - -[E-Mail Harvesters] -Parent=DefaultProperties -Browser=E-Mail Harvesters -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*E-Mail Address Extractor*] -Parent=E-Mail Harvesters -Browser=E-Mail Address Extractor - -[*Larbin*] -Parent=E-Mail Harvesters -Browser=Larbin - -[*www4mail/*] -Parent=E-Mail Harvesters -Browser=www4mail - -[8484 Boston Project*] -Parent=E-Mail Harvesters -Browser=8484 Boston Project - -[CherryPicker*/*] -Parent=E-Mail Harvesters -Browser=CherryPickerElite - -[Chilkat/*] -Parent=E-Mail Harvesters -Browser=Chilkat - -[ContactBot/*] -Parent=E-Mail Harvesters -Browser=ContactBot - -[eCatch*] -Parent=E-Mail Harvesters -Browser=eCatch - -[EmailCollector*] -Parent=E-Mail Harvesters -Browser=E-Mail Collector - -[EMAILsearcher] -Parent=E-Mail Harvesters -Browser=EMAILsearcher - -[EmailSiphon*] -Parent=E-Mail Harvesters -Browser=E-Mail Siphon - -[EmailWolf*] -Parent=E-Mail Harvesters -Browser=EMailWolf - -[Epsilon SoftWorks' MailMunky] -Parent=E-Mail Harvesters -Browser=MailMunky - -[ExtractorPro*] -Parent=E-Mail Harvesters -Browser=ExtractorPro - -[Franklin Locator*] -Parent=E-Mail Harvesters -Browser=Franklin Locator - -[Missigua Locator*] -Parent=E-Mail Harvesters -Browser=Missigua Locator - -[Mozilla/4.0 (compatible; Advanced Email Extractor*)] -Parent=E-Mail Harvesters -Browser=Advanced Email Extractor - -[Netprospector*] -Parent=E-Mail Harvesters -Browser=Netprospector - -[ProWebWalker*] -Parent=E-Mail Harvesters -Browser=ProWebWalker - -[sna-0.0.*] -Parent=E-Mail Harvesters -Browser=Mike Elliott's E-Mail Harvester - -[WebEnhancer*] -Parent=E-Mail Harvesters -Browser=WebEnhancer - -[WebMiner*] -Parent=E-Mail Harvesters -Browser=WebMiner - -[ZIBB Crawler (email address / WWW address)] -Parent=E-Mail Harvesters -Browser=ZIBB Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Feeds Blogs - -[Feeds Blogs] -Parent=DefaultProperties -Browser=Feeds Blogs -isSyndicationReader=true -Crawler=true - -[Bloglines Title Fetch/*] -Parent=Feeds Blogs -Browser=Bloglines Title Fetch - -[Bloglines/* (http://www.bloglines.com*)] -Parent=Feeds Blogs -Browser=BlogLines Web - -[BlogPulseLive (support@blogpulse.com)] -Parent=Feeds Blogs -Browser=BlogPulseLive - -[blogsearchbot-pumpkin-2] -Parent=Feeds Blogs -Browser=blogsearchbot-pumpkin -isSyndicationReader=false - -[Irish Blogs Aggregator/*1.0*] -Parent=Feeds Blogs -Browser=Irish Blogs Aggregator -Version=1.0 -MajorVer=1 -MinorVer=0 - -[kinjabot (http://www.kinja.com; *)] -Parent=Feeds Blogs -Browser=kinjabot - -[Net::Trackback/*] -Parent=Feeds Blogs -Browser=Net::Trackback - -[Reblog*] -Parent=Feeds Blogs -Browser=Reblog - -[WordPress/*] -Parent=Feeds Blogs -Browser=WordPress - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Feeds Syndicators - -[Feeds Syndicators] -Parent=DefaultProperties -Browser=Feeds Syndicators -isSyndicationReader=true - -[*LinkLint*] -Parent=Feeds Syndicators -Browser=LinkLint - -[*NetNewsWire/*] -Parent=Feeds Syndicators - -[*NetVisualize*] -Parent=Feeds Syndicators -Browser=NetVisualize - -[AideRSS 2.* (postrank.com)] -Parent=Feeds Syndicators -Browser=AideRSS - -[AideRSS/2.0 (aiderss.com)] -Parent=Feeds Syndicators -Browser=AideRSS -isBanned=true - -[Akregator/*] -Parent=Feeds Syndicators -Browser=Akregator - -[AppleSyndication/*] -Parent=Feeds Syndicators -Browser=Safari RSS -Platform=MacOSX - -[Cocoal.icio.us/* (*)*] -Parent=Feeds Syndicators -Browser=Cocoal.icio.us -isBanned=true - -[Feed43 Proxy/* (*)] -Parent=Feeds Syndicators -Browser=Feed For Free - -[FeedBurner/*] -Parent=Feeds Syndicators -Browser=FeedBurner - -[FeedDemon/* (*)] -Parent=Feeds Syndicators -Browser=FeedDemon -Platform=Win32 - -[FeedDigest/* (*)] -Parent=Feeds Syndicators -Browser=FeedDigest - -[FeedGhost/1.*] -Parent=Feeds Syndicators -Browser=FeedGhost -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedOnFeeds/0.1.* ( http://minutillo.com/steve/feedonfeeds/)] -Parent=Feeds Syndicators -Browser=FeedOnFeeds -Version=0.1 -MajorVer=0 -MinorVer=1 - -[Feedreader * (Powered by Newsbrain)] -Parent=Feeds Syndicators -Browser=Newsbrain - -[Feedshow/* (*)] -Parent=Feeds Syndicators -Browser=Feedshow - -[Feedster Crawler/?.0; Feedster, Inc.] -Parent=Feeds Syndicators -Browser=Feedster - -[GreatNews/1.0] -Parent=Feeds Syndicators -Browser=GreatNews -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Gregarius/*] -Parent=Feeds Syndicators -Browser=Gregarius - -[intraVnews/*] -Parent=Feeds Syndicators -Browser=intraVnews - -[JetBrains Omea Reader*] -Parent=Feeds Syndicators -Browser=Omea Reader -isBanned=true - -[Liferea/1.5* (Linux; *; http://liferea.sf.net/)] -Parent=Feeds Syndicators -Browser=Liferea -isBanned=true - -[livedoor FeedFetcher/0.0* (http://reader.livedoor.com/;*)] -Parent=Feeds Syndicators -Browser=FeedFetcher -Version=0.0 -MajorVer=0 -MinorVer=0 - -[MagpieRSS/* (*)] -Parent=Feeds Syndicators -Browser=MagpieRSS - -[Mobitype * (compatible; Mozilla/*; MSIE *.*; Windows *)] -Parent=Feeds Syndicators -Browser=Mobitype -Platform=Win32 - -[Mozilla/5.0 (*; Rojo *; http://www.rojo.com/corporate/help/agg; *)*] -Parent=Feeds Syndicators -Browser=Rojo - -[Mozilla/5.0 (*aggregator:TailRank; http://tailrank.com/robot)*] -Parent=Feeds Syndicators -Browser=TailRank - -[Mozilla/5.0 (compatible; MSIE 6.0; Podtech Network; crawler_admin@podtech.net)] -Parent=Feeds Syndicators -Browser=Podtech Network - -[Mozilla/5.0 (compatible; Newz Crawler *; http://www.newzcrawler.com/?)] -Parent=Feeds Syndicators -Browser=Newz Crawler - -[Mozilla/5.0 (compatible; RSSMicro.com RSS/Atom Feed Robot)] -Parent=Feeds Syndicators -Browser=RSSMicro - -[Mozilla/5.0 (compatible;*newstin.com;*)] -Parent=Feeds Syndicators -Browser=NewsTin - -[Mozilla/5.0 (RSS Reader Panel)] -Parent=Feeds Syndicators -Browser=RSS Reader Panel - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:FeedParser; *) Gecko/*] -Parent=Feeds Syndicators -Browser=FeedParser - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:NewsMonster; *) Gecko/*] -Parent=Feeds Syndicators -Browser=NewsMonster - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:Rojo; *) Gecko/*] -Parent=Feeds Syndicators -Browser=Rojo - -[Netvibes (*)] -Parent=Feeds Syndicators -Browser=Netvibes - -[NewsAlloy/* (*)] -Parent=Feeds Syndicators -Browser=NewsAlloy - -[Omnipelagos*] -Parent=Feeds Syndicators -Browser=Omnipelagos - -[Particls] -Parent=Feeds Syndicators -Browser=Particls - -[Protopage/* (*)] -Parent=Feeds Syndicators -Browser=Protopage - -[PubSub-RSS-Reader/* (*)] -Parent=Feeds Syndicators -Browser=PubSub-RSS-Reader - -[RSS Menu/*] -Parent=Feeds Syndicators -Browser=RSS Menu - -[RssBandit/*] -Parent=Feeds Syndicators -Browser=RssBandit - -[RssBar/1.2*] -Parent=Feeds Syndicators -Browser=RssBar -Version=1.2 -MajorVer=1 -MinorVer=2 - -[SharpReader/*] -Parent=Feeds Syndicators -Browser=SharpReader - -[SimplePie/*] -Parent=Feeds Syndicators -Browser=SimplePie - -[Strategic Board Bot (?http://www.strategicboard.com)] -Parent=Feeds Syndicators -Browser=Strategic Board Bot -isBanned=true - -[TargetYourNews.com bot] -Parent=Feeds Syndicators -Browser=TargetYourNews - -[Technoratibot/*] -Parent=Feeds Syndicators -Browser=Technoratibot - -[Tumblr/* RSS syndication ( http://www.tumblr.com/) (support@tumblr.com)] -Parent=Feeds Syndicators -Browser=Tumblr RSS syndication - -[Windows-RSS-Platform/1.0*] -Parent=Feeds Syndicators -Browser=Windows-RSS-Platform -Version=1.0 -MajorVer=1 -MinorVer=0 -Win32=true - -[Wizz RSS News Reader] -Parent=Feeds Syndicators -Browser=Wizz - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; General RSS - -[General RSS] -Parent=DefaultProperties -Browser=General RSS -isSyndicationReader=true - -[AideRSS/1.0 (aiderss.com); * subscribers] -Parent=General RSS -Browser=AideRSS -Version=1.0 -MajorVer=1 -MinorVer=0 - -[CC Metadata Scaper http://wiki.creativecommons.org/Metadata_Scraper] -Parent=General RSS -Browser=CC Metadata Scaper - -[Mozilla/5.0 (compatible) GM RSS Panel] -Parent=General RSS -Browser=RSS Panel - -[Mozilla/5.0 http://www.inclue.com; graeme@inclue.com] -Parent=General RSS -Browser=Inclue - -[Runnk online rss reader : http://www.runnk.com/ : RSS favorites : RSS ranking : RSS aggregator*] -Parent=General RSS -Browser=Ruunk - -[Windows-RSS-Platform/2.0 (MSIE 8.0; Windows NT 6.0)] -Parent=General RSS -Browser=Windows-RSS-Platform -Platform=WinVista - -[Mozilla/5.0 (X11; ?; Linux; *) AppleWebKit/* (KHTML, like Gecko, Safari/*) Arora/0.4] -Parent=Google Code -Browser=Arora -Version=0.4 -MajorVer=0 -MinorVer=4 -Platform=Linux -CssVersion=2 -supportsCSS=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Validation Checkers - -[HTML Validators] -Parent=DefaultProperties -Browser=HTML Validators -Frames=true -IFrames=true -Tables=true -Crawler=true - -[(HTML Validator http://www.searchengineworld.com/validator/)] -Parent=HTML Validators -Browser=Search Engine World HTML Validator - -[FeedValidator/1.3] -Parent=HTML Validators -Browser=FeedValidator -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Jigsaw/* W3C_CSS_Validator_JFouffa/*] -Parent=HTML Validators -Browser=Jigsaw CSS Validator - -[Search Engine World Robots.txt Validator*] -Parent=HTML Validators -Browser=Search Engine World Robots.txt Validator - -[W3C_Validator/*] -Parent=HTML Validators -Browser=W3C Validator - -[W3CLineMode/*] -Parent=HTML Validators -Browser=W3C Line Mode - -[Weblide/2.? beta*] -Parent=HTML Validators -Browser=Weblide -Version=2.0 -MajorVer=2 -MinorVer=0 -Beta=true - -[WebmasterWorld StickyMail Server Header Checker*] -Parent=HTML Validators -Browser=WebmasterWorld Server Header Checker - -[WWWC/*] -Parent=HTML Validators - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Image Crawlers - -[Image Crawlers] -Parent=DefaultProperties -Browser=Image Crawlers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*CFNetwork*] -Parent=Image Crawlers -Browser=CFNetwork - -[*PhotoStickies/*] -Parent=Image Crawlers -Browser=PhotoStickies - -[Camcrawler*] -Parent=Image Crawlers -Browser=Camcrawler - -[CydralSpider/*] -Parent=Image Crawlers -Browser=Cydral Web Image Search -isBanned=true - -[Der gro\xdfe BilderSauger*] -Parent=Image Crawlers -Browser=Gallery Grabber - -[Extreme Picture Finder] -Parent=Image Crawlers -Browser=Extreme Picture Finder - -[FLATARTS_FAVICO] -Parent=Image Crawlers -Browser=FlatArts Favorites Icon Tool - -[HTML2JPG Blackbox, http://www.html2jpg.com] -Parent=Image Crawlers -Browser=HTML2JPG - -[IconSurf/2.*] -Parent=Image Crawlers -Browser=IconSurf - -[kalooga/KaloogaBot*] -Parent=Image Crawlers -Browser=KaloogaBot - -[Mister PIX*] -Parent=Image Crawlers -Browser=Mister PIX - -[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/* (*) Pandora/2.*] -Parent=Image Crawlers -Browser=Pandora - -[naoFavicon4IE*] -Parent=Image Crawlers -Browser=naoFavicon4IE - -[pixfinder/*] -Parent=Image Crawlers -Browser=pixfinder - -[rssImagesBot/0.1 (*http://herbert.groot.jebbink.nl/?app=rssImages)] -Parent=Image Crawlers -Browser=rssImagesBot - -[Web Image Collector*] -Parent=Image Crawlers -Browser=Web Image Collector - -[WebImages * (?http://herbert.groot.jebbink.nl/?app=WebImages?)] -Parent=Image Crawlers -Browser=WebImages - -[WebPix*] -Parent=Image Crawlers -Browser=Custo - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Link Checkers - -[Link Checkers] -Parent=DefaultProperties -Browser=Link Checkers -Frames=true -IFrames=true -Tables=true -Crawler=true - -[!Susie (http://www.sync2it.com/susie)] -Parent=Link Checkers -Browser=!Susie - -[*AgentName/*] -Parent=Link Checkers -Browser=AgentName - -[*Linkman*] -Parent=Link Checkers -Browser=Linkman - -[*LinksManager.com*] -Parent=Link Checkers -Browser=LinksManager - -[*Powermarks/*] -Parent=Link Checkers -Browser=Powermarks - -[*W3C-checklink/*] -Parent=Link Checkers -Browser=W3C Link Checker - -[*Web Link Validator*] -Parent=Link Checkers -Browser=Web Link Validator - -[*Zeus*] -Parent=Link Checkers -Browser=Zeus -isBanned=true - -[ActiveBookmark *] -Parent=Link Checkers -Browser=ActiveBookmark - -[Bookdog/*] -Parent=Link Checkers -Browser=Bookdog - -[Bookmark Buddy*] -Parent=Link Checkers -Browser=Bookmark Buddy - -[Bookmark Renewal Check Agent*] -Parent=Link Checkers -Browser=Bookmark Renewal Check Agent - -[Bookmark search tool*] -Parent=Link Checkers -Browser=Bookmark search tool - -[Bookmark-Manager] -Parent=Link Checkers -Browser=Bookmark-Manager - -[Checkbot*] -Parent=Link Checkers -Browser=Checkbot - -[CheckLinks/*] -Parent=Link Checkers -Browser=CheckLinks - -[CyberSpyder Link Test/*] -Parent=Link Checkers -Browser=CyberSpyder Link Test - -[DLC/*] -Parent=Link Checkers -Browser=DLC - -[DocWeb Link Crawler (http://doc.php.net)] -Parent=Link Checkers -Browser=DocWeb Link Crawler - -[FavOrg] -Parent=Link Checkers -Browser=FavOrg - -[Favorites Sweeper v.3.*] -Parent=Link Checkers -Browser=Favorites Sweeper - -[FindLinks/*] -Parent=Link Checkers -Browser=FindLinks - -[Funnel Web Profiler*] -Parent=Link Checkers -Browser=Funnel Web Profiler - -[Html Link Validator (www.lithopssoft.com)] -Parent=Link Checkers -Browser=HTML Link Validator - -[IECheck] -Parent=Link Checkers -Browser=IECheck - -[JCheckLinks/*] -Parent=Link Checkers -Browser=JCheckLinks - -[JRTwine Software Check Favorites Utility] -Parent=Link Checkers -Browser=JRTwine - -[Link Valet Online*] -Parent=Link Checkers -Browser=Link Valet -isBanned=true - -[LinkAlarm/*] -Parent=Link Checkers -Browser=LinkAlarm - -[Linkbot*] -Parent=Link Checkers -Browser=Linkbot - -[LinkChecker/*] -Parent=Link Checkers -Browser=LinkChecker - -[LinkextractorPro*] -Parent=Link Checkers -Browser=LinkextractorPro -isBanned=true - -[LinkLint-checkonly/*] -Parent=Link Checkers -Browser=LinkLint - -[LinkScan/*] -Parent=Link Checkers -Browser=LinkScan - -[LinkSweeper/*] -Parent=Link Checkers -Browser=LinkSweeper - -[LinkWalker*] -Parent=Link Checkers -Browser=LinkWalker - -[MetaGer-LinkChecker] -Parent=Link Checkers -Browser=MetaGer-LinkChecker - -[Mozilla/* (compatible; linktiger/*; *http://www.linktiger.com*)] -Parent=Link Checkers -Browser=LinkTiger -isBanned=true - -[Mozilla/4.0 (Compatible); URLBase*] -Parent=Link Checkers -Browser=URLBase - -[Mozilla/4.0 (compatible; Link Utility; http://net-promoter.com)] -Parent=Link Checkers -Browser=NetPromoter Link Utility - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98) Web Link Validator*] -Parent=Link Checkers -Browser=Web Link Validator -Win32=true - -[Mozilla/4.0 (compatible; MSIE 7.0; Win32) Link Commander 3.0] -Parent=Link Checkers -Browser=Link Commander -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Win32 - -[Mozilla/4.0 (compatible; smartBot/1.*; checking links; *)] -Parent=Link Checkers -Browser=smartBot - -[Mozilla/4.0 (compatible; SuperCleaner*;*)] -Parent=Link Checkers -Browser=SuperCleaner - -[Mozilla/5.0 gURLChecker/*] -Parent=Link Checkers -Browser=gURLChecker -isBanned=true - -[Newsgroupreporter LinkCheck] -Parent=Link Checkers -Browser=Newsgroupreporter LinkCheck - -[onCHECK Linkchecker von www.scientec.de fuer www.onsinn.de] -Parent=Link Checkers -Browser=onCHECK Linkchecker - -[online link validator (http://www.dead-links.com/)] -Parent=Link Checkers -Browser=Dead-Links.com -isBanned=true - -[REL Link Checker*] -Parent=Link Checkers -Browser=REL Link Checker - -[RLinkCheker*] -Parent=Link Checkers -Browser=RLinkCheker - -[Robozilla/*] -Parent=Link Checkers -Browser=Robozilla - -[RPT-HTTPClient/*] -Parent=Link Checkers -Browser=RPT-HTTPClient -isBanned=true - -[SafariBookmarkChecker*(?http://www.coriolis.ch/)] -Parent=Link Checkers -Browser=SafariBookmarkChecker -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[Simpy/* (Simpy; http://www.simpy.com/?ref=bot; feedback at simpy dot com)] -Parent=Link Checkers -Browser=Simpy - -[SiteBar/*] -Parent=Link Checkers -Browser=SiteBar - -[Susie (http://www.sync2it.com/bms/susie.php] -Parent=Link Checkers -Browser=Susie - -[URLBase/6.*] -Parent=Link Checkers - -[VSE/*] -Parent=Link Checkers -Browser=VSE Link Tester - -[WebTrends Link Analyzer] -Parent=Link Checkers -Browser=WebTrends Link Analyzer - -[WorQmada/*] -Parent=Link Checkers -Browser=WorQmada - -[Xenu* Link Sleuth*] -Parent=Link Checkers -Browser=Xenu's Link Sleuth -isBanned=true - -[Z-Add Link Checker*] -Parent=Link Checkers -Browser=Z-Add Link Checker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Microsoft - -[Microsoft] -Parent=DefaultProperties -Browser=Microsoft -isBanned=true - -[Live (http://www.live.com/)] -Parent=Microsoft -Browser=Microsoft Live -isBanned=false -isSyndicationReader=true - -[MFC Foundation Class Library*] -Parent=Microsoft -Browser=MFC Foundation Class Library - -[MFHttpScan] -Parent=Microsoft -Browser=MFHttpScan - -[Microsoft BITS/*] -Parent=Microsoft -Browser=BITS - -[Microsoft Data Access Internet Publishing Provider Cache Manager] -Parent=Microsoft -Browser=MS IPP - -[Microsoft Data Access Internet Publishing Provider DAV*] -Parent=Microsoft -Browser=MS IPP DAV - -[Microsoft Data Access Internet Publishing Provider Protocol Discovery] -Parent=Microsoft -Browser=MS IPPPD - -[Microsoft Internet Explorer] -Parent=Microsoft -Browser=Fake IE - -[Microsoft Office Existence Discovery] -Parent=Microsoft -Browser=Microsoft Office Existence Discovery - -[Microsoft Office Protocol Discovery] -Parent=Microsoft -Browser=MS OPD - -[Microsoft Office/* (*Picture Manager*)] -Parent=Microsoft -Browser=Microsoft Office Picture Manager - -[Microsoft URL Control*] -Parent=Microsoft -Browser=Microsoft URL Control - -[Microsoft Visio MSIE] -Parent=Microsoft -Browser=Microsoft Visio - -[Microsoft-WebDAV-MiniRedir/*] -Parent=Microsoft -Browser=Microsoft-WebDAV - -[Mozilla/5.0 (Macintosh; Intel Mac OS X) Excel/12.*] -Parent=Microsoft -Browser=Microsoft Excel -Version=12.0 -MajorVer=12 -MinorVer=0 -Platform=MacOSX - -[MSN Feed Manager] -Parent=Microsoft -Browser=MSN Feed Manager -isBanned=false -isSyndicationReader=true - -[MSProxy/*] -Parent=Microsoft -Browser=MS Proxy - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Miscellaneous Browsers - -[Miscellaneous Browsers] -Parent=DefaultProperties -Browser=Miscellaneous Browsers -Frames=true -Tables=true -Cookies=true - -[*Amiga*] -Parent=Miscellaneous Browsers -Browser=Amiga -Platform=Amiga - -[*avantbrowser*] -Parent=Miscellaneous Browsers -Browser=Avant Browser - -[12345] -Parent=Miscellaneous Browsers -Browser=12345 -isBanned=true - -[Ace Explorer] -Parent=Miscellaneous Browsers -Browser=Ace Explorer - -[Enigma Browser*] -Parent=Miscellaneous Browsers -Browser=Enigma Browser - -[EVE-minibrowser/*] -Parent=Miscellaneous Browsers -Browser=EVE-minibrowser -IFrames=false -Tables=false -BackgroundSounds=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -isBanned=false -Crawler=false - -[Godzilla/* (Basic*; *; Commodore C=64; *; rv:1.*)*] -Parent=Miscellaneous Browsers -Browser=Godzilla - -[GreenBrowser] -Parent=Miscellaneous Browsers -Browser=GreenBrowser -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Kopiczek/* (WyderOS*; *)] -Parent=Miscellaneous Browsers -Browser=Kopiczek -Platform=WyderOS -IFrames=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (*) - BrowseX (*)] -Parent=Miscellaneous Browsers -Browser=BrowseX - -[Mozilla/* (Win32;*Escape?*; ?)] -Parent=Miscellaneous Browsers -Browser=Escape -Platform=Win32 - -[Mozilla/4.0 (compatible; ibisBrowser)] -Parent=Miscellaneous Browsers -Browser=ibisBrowser - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) AppleWebKit/* (*) HistoryHound/*] -Parent=Miscellaneous Browsers -Browser=HistoryHound - -[NetRecorder*] -Parent=Miscellaneous Browsers -Browser=NetRecorder - -[NetSurfer*] -Parent=Miscellaneous Browsers -Browser=NetSurfer - -[ogeb browser , Version 1.1.0] -Parent=Miscellaneous Browsers -Browser=ogeb browser -Version=1.1 -MajorVer=1 -MinorVer=1 - -[SCEJ PSP BROWSER 0102pspNavigator] -Parent=Miscellaneous Browsers -Browser=Wipeout Pure - -[SlimBrowser] -Parent=Miscellaneous Browsers -Browser=SlimBrowser - -[WWW_Browser/*] -Parent=Miscellaneous Browsers -Browser=WWW Browser -Version=1.69 -MajorVer=1 -MinorVer=69 -Platform=Win16 -CssVersion=3 -supportsCSS=true - -[*Netcraft Webserver Survey*] -Parent=Netcraft -Browser=Netcraft Webserver Survey -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Offline Browsers - -[Offline Browsers] -Parent=DefaultProperties -Browser=Offline Browsers -Frames=true -Tables=true -Cookies=true -isBanned=true -Crawler=true - -[*Check&Get*] -Parent=Offline Browsers -Browser=Check&Get - -[*HTTrack*] -Parent=Offline Browsers -Browser=HTTrack - -[*MSIECrawler*] -Parent=Offline Browsers -Browser=IE Offline Browser - -[*TweakMASTER*] -Parent=Offline Browsers -Browser=TweakMASTER - -[BackStreet Browser *] -Parent=Offline Browsers -Browser=BackStreet Browser - -[Go-Ahead-Got-It*] -Parent=Offline Browsers -Browser=Go Ahead Got-It - -[iGetter/*] -Parent=Offline Browsers -Browser=iGetter - -[Teleport*] -Parent=Offline Browsers -Browser=Teleport - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Online Scanners - -[Online Scanners] -Parent=DefaultProperties -Browser=Online Scanners -isBanned=true - -[JoeDog/* (X11; I; Siege *)] -Parent=Online Scanners -Browser=JoeDog -isBanned=false - -[Morfeus Fucking Scanner] -Parent=Online Scanners -Browser=Morfeus Fucking Scanner - -[Mozilla/4.0 (compatible; Trend Micro tmdr 1.*] -Parent=Online Scanners -Browser=Trend Micro - -[Titanium 2005 (4.02.01)] -Parent=Online Scanners -Browser=Panda Antivirus Titanium - -[virus_detector*] -Parent=Online Scanners -Browser=Secure Computing Corporation - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Proxy Servers - -[Proxy Servers] -Parent=DefaultProperties -Browser=Proxy Servers -isBanned=true - -[*squid*] -Parent=Proxy Servers -Browser=Squid - -[Anonymisiert*] -Parent=Proxy Servers -Browser=Anonymizied - -[Anonymizer/*] -Parent=Proxy Servers -Browser=Anonymizer - -[Anonymizied*] -Parent=Proxy Servers -Browser=Anonymizied - -[Anonymous*] -Parent=Proxy Servers -Browser=Anonymous - -[Anonymous/*] -Parent=Proxy Servers -Browser=Anonymous - -[CE-Preload] -Parent=Proxy Servers -Browser=CE-Preload - -[http://Anonymouse.org/*] -Parent=Proxy Servers -Browser=Anonymouse - -[IE/6.01 (CP/M; 8-bit*)] -Parent=Proxy Servers -Browser=Squid - -[Mozilla/* (TuringOS; Turing Machine; 0.0)] -Parent=Proxy Servers -Browser=Anonymizer - -[Mozilla/4.0 (compatible; MSIE ?.0; SaferSurf*)] -Parent=Proxy Servers -Browser=SaferSurf - -[Mozilla/5.0 (compatible; del.icio.us-thumbnails/*; *) KHTML/* (like Gecko)] -Parent=Proxy Servers -Browser=Yahoo! -isBanned=true -Crawler=true - -[Nutscrape] -Parent=Proxy Servers -Browser=Squid - -[Nutscrape/* (CP/M; 8-bit*)] -Parent=Proxy Servers -Browser=Squid - -[Privoxy/*] -Parent=Proxy Servers -Browser=Privoxy - -[ProxyTester*] -Parent=Proxy Servers -Browser=ProxyTester -isBanned=true -Crawler=true - -[SilentSurf*] -Parent=Proxy Servers -Browser=SilentSurf - -[SmallProxy*] -Parent=Proxy Servers -Browser=SmallProxy - -[Space*Bison/*] -Parent=Proxy Servers -Browser=Proxomitron - -[Sqworm/*] -Parent=Proxy Servers -Browser=Websense - -[SurfControl] -Parent=Proxy Servers -Browser=SurfControl - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Research Projects - -[Research Projects] -Parent=DefaultProperties -Browser=Research Projects -isBanned=true -Crawler=true - -[*research*] -Parent=Research Projects - -[AcadiaUniversityWebCensusClient] -Parent=Research Projects -Browser=AcadiaUniversityWebCensusClient - -[Amico Alpha * (*) Gecko/* AmicoAlpha/*] -Parent=Research Projects -Browser=Amico Alpha - -[annotate_google; http://ponderer.org/*] -Parent=Research Projects -Browser=Annotate Google - -[CMS crawler (?http://buytaert.net/crawler/)] -Parent=Research Projects - -[e-SocietyRobot(http://www.yama.info.waseda.ac.jp/~yamana/es/)] -Parent=Research Projects -Browser=e-SocietyRobot - -[Forschungsportal/*] -Parent=Research Projects -Browser=Forschungsportal - -[Gulper Web *] -Parent=Research Projects -Browser=Gulper Web Bot - -[HooWWWer/*] -Parent=Research Projects -Browser=HooWWWer - -[http://buytaert.net/crawler] -Parent=Research Projects - -[inetbot/* (?http://www.inetbot.com/bot.html)] -Parent=Research Projects -Browser=inetbot - -[IRLbot/*] -Parent=Research Projects -Browser=IRLbot - -[Lachesis] -Parent=Research Projects -Browser=Lachesis - -[Mozilla/5.0 (compatible; nextthing.org/*)] -Parent=Research Projects -Browser=nextthing.org -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (compatible; Theophrastus/*)] -Parent=Research Projects -Browser=Theophrastus - -[Mozilla/5.0 (compatible; Webscan v0.*; http://otc.dyndns.org/webscan/)] -Parent=Research Projects -Browser=Webscan - -[MQbot*] -Parent=Research Projects -Browser=MQbot - -[OutfoxBot/*] -Parent=Research Projects -Browser=OutfoxBot - -[polybot?*] -Parent=Research Projects -Browser=Polybot - -[Shim?Crawler*] -Parent=Research Projects -Browser=Shim Crawler - -[Steeler/*] -Parent=Research Projects -Browser=Steeler - -[Taiga web spider] -Parent=Research Projects -Browser=Taiga - -[Theme Spider*] -Parent=Research Projects -Browser=Theme Spider - -[UofTDB_experiment* (leehyun@cs.toronto.edu)] -Parent=Research Projects -Browser=UofTDB Experiment - -[USyd-NLP-Spider*] -Parent=Research Projects -Browser=USyd-NLP-Spider - -[woriobot*] -Parent=Research Projects -Browser=woriobot - -[wwwster/* (Beta, mailto:gue@cis.uni-muenchen.de)] -Parent=Research Projects -Browser=wwwster -Beta=true - -[Zao-Crawler] -Parent=Research Projects -Browser=Zao-Crawler - -[Zao/*] -Parent=Research Projects -Browser=Zao - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Rippers - -[Rippers] -Parent=DefaultProperties -Browser=Rippers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*grub*] -Parent=Rippers -Browser=grub - -[*ickHTTP*] -Parent=Rippers -Browser=IP*Works - -[*java*] -Parent=Rippers - -[*libwww-perl*] -Parent=Rippers -Browser=libwww-perl - -[*WebGrabber*] -Parent=Rippers - -[*WinHttpRequest*] -Parent=Rippers -Browser=WinHttp - -[3D-FTP/*] -Parent=Rippers -Browser=3D-FTP - -[3wGet/*] -Parent=Rippers -Browser=3wGet - -[ActiveRefresh*] -Parent=Rippers -Browser=ActiveRefresh - -[Artera (Version *)] -Parent=Rippers -Browser=Artera - -[AutoHotkey] -Parent=Rippers -Browser=AutoHotkey - -[b2w/*] -Parent=Rippers -Browser=b2w - -[BasicHTTP/*] -Parent=Rippers -Browser=BasicHTTP - -[BlockNote.Net] -Parent=Rippers -Browser=BlockNote.Net - -[CAST] -Parent=Rippers -Browser=CAST - -[CFNetwork/*] -Parent=Rippers -Browser=CFNetwork - -[CFSCHEDULE*] -Parent=Rippers -Browser=ColdFusion Task Scheduler - -[CobWeb/*] -Parent=Rippers -Browser=CobWeb - -[ColdFusion*] -Parent=Rippers -Browser=ColdFusion - -[Crawl_Application] -Parent=Rippers -Browser=Crawl_Application - -[curl/*] -Parent=Rippers -Browser=cURL - -[Custo*] -Parent=Rippers -Browser=Custo - -[DataCha0s/*] -Parent=Rippers -Browser=DataCha0s - -[DeepIndexer*] -Parent=Rippers -Browser=DeepIndexer - -[DISCo Pump *] -Parent=Rippers -Browser=DISCo Pump - -[eStyleSearch * (compatible; MSIE 6.0; Windows NT 5.0)] -Parent=Rippers -Browser=eStyleSearch -Win32=true - -[ezic.com http agent *] -Parent=Rippers -Browser=Ezic.com - -[fetch libfetch/*] -Parent=Rippers - -[FGet*] -Parent=Rippers -Browser=FGet - -[Flaming AttackBot*] -Parent=Rippers -Browser=Flaming AttackBot - -[Foobot*] -Parent=Rippers -Browser=Foobot - -[GameSpyHTTP/*] -Parent=Rippers -Browser=GameSpyHTTP - -[gnome-vfs/*] -Parent=Rippers -Browser=gnome-vfs - -[Harvest/*] -Parent=Rippers -Browser=Harvest - -[hcat/*] -Parent=Rippers -Browser=hcat - -[HLoader] -Parent=Rippers -Browser=HLoader - -[Holmes/*] -Parent=Rippers -Browser=Holmes - -[HTMLParser/*] -Parent=Rippers -Browser=HTMLParser - -[http generic] -Parent=Rippers -Browser=http generic - -[httpclient*] -Parent=Rippers - -[httperf/*] -Parent=Rippers -Browser=httperf - -[HTTPFetch/*] -Parent=Rippers -Browser=HTTPFetch - -[HTTPGrab] -Parent=Rippers -Browser=HTTPGrab - -[HttpSession] -Parent=Rippers -Browser=HttpSession - -[httpunit/*] -Parent=Rippers -Browser=HttpUnit - -[ICE_GetFile] -Parent=Rippers -Browser=ICE_GetFile - -[iexplore.exe] -Parent=Rippers - -[Inet - Eureka App] -Parent=Rippers -Browser=Inet - Eureka App - -[INetURL/*] -Parent=Rippers -Browser=INetURL - -[InetURL:/*] -Parent=Rippers -Browser=InetURL - -[Internet Exploiter/*] -Parent=Rippers - -[Internet Explore *] -Parent=Rippers -Browser=Fake IE - -[Internet Explorer *] -Parent=Rippers -Browser=Fake IE - -[IP*Works!*/*] -Parent=Rippers -Browser=IP*Works! - -[IrssiUrlLog/*] -Parent=Rippers -Browser=IrssiUrlLog - -[JPluck/*] -Parent=Rippers -Browser=JPluck - -[Kapere (http://www.kapere.com)] -Parent=Rippers -Browser=Kapere - -[LeechFTP] -Parent=Rippers -Browser=LeechFTP - -[LeechGet*] -Parent=Rippers -Browser=LeechGet - -[libcurl-agent/*] -Parent=Rippers -Browser=libcurl - -[libWeb/clsHTTP*] -Parent=Rippers -Browser=libWeb/clsHTTP - -[lwp*] -Parent=Rippers - -[MFC_Tear_Sample] -Parent=Rippers -Browser=MFC_Tear_Sample - -[Moozilla] -Parent=Rippers -Browser=Moozilla - -[MovableType/*] -Parent=Rippers -Browser=MovableType Web Log - -[Mozilla/2.0 (compatible; NEWT ActiveX; Win32)] -Parent=Rippers -Browser=NEWT ActiveX -Platform=Win32 - -[Mozilla/3.0 (compatible)] -Parent=Rippers - -[Mozilla/3.0 (compatible; Indy Library)] -Parent=Rippers -Cookies=true - -[Mozilla/3.01 (compatible;)] -Parent=Rippers - -[Mozilla/4.0 (compatible; BorderManager*)] -Parent=Rippers -Browser=Novell BorderManager - -[Mozilla/4.0 (compatible;)] -Parent=Rippers - -[Mozilla/5.0 (compatible; IPCheck Server Monitor*)] -Parent=Rippers -Browser=IPCheck Server Monitor - -[OCN-SOC/*] -Parent=Rippers -Browser=OCN-SOC - -[Offline Explorer*] -Parent=Rippers -Browser=Offline Explorer - -[Open Web Analytics Bot*] -Parent=Rippers -Browser=Open Web Analytics Bot - -[OSSProxy*] -Parent=Rippers -Browser=OSSProxy - -[Pageload*] -Parent=Rippers -Browser=PageLoad - -[PageNest/*] -Parent=Rippers -Browser=PageNest - -[pavuk/*] -Parent=Rippers -Browser=Pavuk - -[PEAR HTTP_Request*] -Parent=Rippers -Browser=PEAR-PHP - -[PHP*] -Parent=Rippers -Browser=PHP - -[PigBlock (Windows NT 5.1; U)*] -Parent=Rippers -Browser=PigBlock -Win32=true - -[Pockey*] -Parent=Rippers -Browser=Pockey-GetHTML - -[POE-Component-Client-HTTP/*] -Parent=Rippers -Browser=POE-Component-Client-HTTP - -[PycURL/*] -Parent=Rippers -Browser=PycURL - -[Python*] -Parent=Rippers -Browser=Python - -[RepoMonkey*] -Parent=Rippers -Browser=RepoMonkey - -[SBL-BOT*] -Parent=Rippers -Browser=BlackWidow - -[ScoutAbout*] -Parent=Rippers -Browser=ScoutAbout - -[sherlock/*] -Parent=Rippers -Browser=Sherlock - -[SiteParser/*] -Parent=Rippers -Browser=SiteParser - -[SiteSnagger*] -Parent=Rippers -Browser=SiteSnagger - -[SiteSucker/*] -Parent=Rippers -Browser=SiteSucker - -[SiteWinder*] -Parent=Rippers -Browser=SiteWinder - -[Snoopy*] -Parent=Rippers -Browser=Snoopy - -[SOFTWING_TEAR_AGENT*] -Parent=Rippers -Browser=AspTear - -[SuperHTTP/*] -Parent=Rippers -Browser=SuperHTTP - -[Tcl http client package*] -Parent=Rippers -Browser=Tcl http client package - -[Twisted PageGetter] -Parent=Rippers -Browser=Twisted PageGetter - -[URL2File/*] -Parent=Rippers -Browser=URL2File - -[UtilMind HTTPGet] -Parent=Rippers -Browser=UtilMind HTTPGet - -[VCI WebViewer*] -Parent=Rippers -Browser=VCI WebViewer - -[W3CRobot/*] -Parent=Rippers -Browser=W3CRobot - -[Web Downloader*] -Parent=Rippers -Browser=Web Downloader - -[Web Downloader/*] -Parent=Rippers -Browser=Web Downloader - -[Web Magnet*] -Parent=Rippers -Browser=Web Magnet - -[WebAuto/*] -Parent=Rippers - -[webbandit/*] -Parent=Rippers -Browser=webbandit - -[WebCopier*] -Parent=Rippers -Browser=WebCopier - -[WebDownloader*] -Parent=Rippers -Browser=WebDownloader - -[WebFetch] -Parent=Rippers -Browser=WebFetch - -[webfetch/*] -Parent=Rippers -Browser=WebFetch - -[WebGatherer*] -Parent=Rippers -Browser=WebGatherer - -[WebGet] -Parent=Rippers -Browser=WebGet - -[WebReaper*] -Parent=Rippers -Browser=WebReaper - -[WebRipper] -Parent=Rippers -Browser=WebRipper - -[WebSauger*] -Parent=Rippers -Browser=WebSauger - -[Website Downloader*] -Parent=Rippers -Browser=Website Downloader - -[Website eXtractor*] -Parent=Rippers -Browser=Website eXtractor - -[Website Quester] -Parent=Rippers -Browser=Website Quester - -[WebsiteExtractor*] -Parent=Rippers -Browser=Website eXtractor - -[WebSnatcher*] -Parent=Rippers -Browser=WebSnatcher - -[Webster Pro*] -Parent=Rippers -Browser=Webster Pro - -[WebStripper*] -Parent=Rippers -Browser=WebStripper - -[WebWhacker*] -Parent=Rippers -Browser=WebWhacker - -[WinScripter iNet Tools] -Parent=Rippers -Browser=WinScripter iNet Tools - -[WWW-Mechanize/*] -Parent=Rippers -Browser=WWW-Mechanize - -[Zend_Http_Client] -Parent=Rippers -Browser=Zend_Http_Client - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Site Monitors - -[Site Monitors] -Parent=DefaultProperties -Browser=Site Monitors -Cookies=true -isBanned=true -Crawler=true - -[*EasyRider*] -Parent=Site Monitors -Browser=EasyRider - -[*maxamine.com--robot*] -Parent=Site Monitors -Browser=maxamine.com--robot -isBanned=true - -[*WebMon ?.*] -Parent=Site Monitors -Browser=WebMon - -[Kenjin Spider*] -Parent=Site Monitors -Browser=Kenjin Spider - -[Kevin http://*] -Parent=Site Monitors -Browser=Kevin -isBanned=true - -[Mozilla/4.0 (compatible; ChangeDetection/*] -Parent=Site Monitors -Browser=ChangeDetection - -[Myst Monitor Service v*] -Parent=Site Monitors -Browser=Myst Monitor Service - -[Net Probe] -Parent=Site Monitors -Browser=Net Probe - -[NetMechanic*] -Parent=Site Monitors -Browser=NetMechanic - -[NetReality*] -Parent=Site Monitors -Browser=NetReality - -[Pingdom GIGRIB*] -Parent=Site Monitors -Browser=Pingdom - -[Site Valet Online*] -Parent=Site Monitors -Browser=Site Valet -isBanned=true - -[SITECHECKER] -Parent=Site Monitors -Browser=SITECHECKER - -[sitemonitor@dnsvr.com/*] -Parent=Site Monitors -Browser=ZoneEdit Failover Monitor -isBanned=false - -[UpTime Checker*] -Parent=Site Monitors -Browser=UpTime Checker - -[URL Control*] -Parent=Site Monitors -Browser=URL Control - -[URL_Access/*] -Parent=Site Monitors - -[URLCHECK] -Parent=Site Monitors -Browser=URLCHECK - -[URLy Warning*] -Parent=Site Monitors -Browser=URLy Warning - -[Webcheck *] -Parent=Site Monitors -Browser=Webcheck -Version=1.0 -MajorVer=1 -MinorVer=0 - -[WebPatrol/*] -Parent=Site Monitors -Browser=WebPatrol - -[websitepulse checker/*] -Parent=Site Monitors -Browser=websitepulse checker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Social Bookmarkers - -[Social Bookmarkers] -Parent=DefaultProperties -Browser=Social Bookmarkers -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[BookmarkBase(2/;http://bookmarkbase.com)] -Parent=Social Bookmarkers -Browser=BookmarkBase - -[Cocoal.icio.us/1.0 (v43) (Mac OS X; http://www.scifihifi.com/cocoalicious)] -Parent=Social Bookmarkers -Browser=Cocoalicious - -[Mozilla/5.0 (compatible; FriendFeedBot/0.*; Http://friendfeed.com/about/bot)] -Parent=Social Bookmarkers -Browser=FriendFeedBot - -[Twitturly*] -Parent=Social Bookmarkers -Browser=Twitturly - -[WinkBot/*] -Parent=Social Bookmarkers -Browser=WinkBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Translators - -[Translators] -Parent=DefaultProperties -Browser=Translators -Frames=true -Tables=true -Cookies=true - -[Seram Server] -Parent=Translators -Browser=Seram Server - -[TeragramWebcrawler/*] -Parent=Translators -Browser=TeragramWebcrawler -Version=1.0 -MajorVer=1 -MinorVer=0 - -[WebIndexer/* (Web Indexer; *)] -Parent=Translators -Browser=WorldLingo - -[WebTrans] -Parent=Translators -Browser=WebTrans - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Version Checkers - -[Version Checkers] -Parent=DefaultProperties -Browser=Version Checkers -Crawler=true - -[Automated Browscap.ini Updater. To report issues contact us at http://www.skycomp.ca] -Parent=Version Checkers -Browser=Automated Browscap.ini Updater - -[BMC Link Validator (http://www.briansmodelcars.com/links/)] -Parent=Version Checkers -Browser=BMC Link Validator -MajorVer=1 -MinorVer=0 -Platform=Win2000 - -[Browscap updater] -Parent=Version Checkers -Browser=Browscap updater - -[BrowscapUpdater1.0] -Parent=Version Checkers - -[Browser Capabilities Project (http://browsers.garykeith.com; http://browsers.garykeith.com/sitemail/contact-me.asp)] -Parent=Version Checkers -Browser=Gary Keith's Version Checker - -[Browser Capabilities Project AutoDownloader] -Parent=Version Checkers -Browser=TKC AutoDownloader - -[browsers.garykeith.com browscap.ini bot BETA] -Parent=Version Checkers - -[Code Sample Web Client] -Parent=Version Checkers -Browser=Code Sample Web Client - -[Desktop Sidebar*] -Parent=Version Checkers -Browser=Desktop Sidebar -isBanned=true - -[Mono Browser Capabilities Updater*] -Parent=Version Checkers -Browser=Mono Browser Capabilities Updater -isBanned=true - -[Rewmi/*] -Parent=Version Checkers -isBanned=true - -[Subtext Version 1.9* - http://subtextproject.com/ (Microsoft Windows NT 5.2.*)] -Parent=Version Checkers -Browser=Subtext - -[TherapeuticResearch] -Parent=Version Checkers -Browser=TherapeuticResearch - -[UpdateBrowscap*] -Parent=Version Checkers -Browser=UpdateBrowscap - -[www.garykeith.com browscap.ini bot*] -Parent=Version Checkers -Browser=clarkson.edu - -[www.substancia.com AutoHTTPAgent (ver *)] -Parent=Version Checkers -Browser=Substância - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Become - -[Become] -Parent=DefaultProperties -Browser=Become -Frames=true -Tables=true -isSyndicationReader=true -Crawler=true - -[*BecomeBot/*] -Parent=Become -Browser=BecomeBot - -[*BecomeBot@exava.com*] -Parent=Become -Browser=BecomeBot - -[*Exabot@exava.com*] -Parent=Become -Browser=Exabot - -[MonkeyCrawl/*] -Parent=Become -Browser=MonkeyCrawl - -[Mozilla/5.0 (compatible; BecomeJPBot/2.3; *)] -Parent=Become -Browser=BecomeJPBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Blue Coat Systems - -[Blue Coat Systems] -Parent=DefaultProperties -Browser=Blue Coat Systems -isBanned=true -Crawler=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Browscap Abusers - -[Browscap Abusers] -Parent=DefaultProperties -Browser=Browscap Abusers -isBanned=true - -[Apple-PubSub/*] -Parent=Browscap Abusers -Browser=Apple-PubSub - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FeedHub - -[FeedHub] -Parent=DefaultProperties -Browser=FeedHub -isSyndicationReader=true - -[FeedHub FeedDiscovery/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub FeedDiscovery -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedHub FeedFetcher/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub FeedFetcher -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedHub MetaDataFetcher/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub MetaDataFetcher -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Internet Content Rating Association] -Parent=DefaultProperties -Browser= -Frames=true -IFrames=true -Tables=true -Cookies=true -Crawler=true - -[ICRA_label_generator/1.?] -Parent=Internet Content Rating Association -Browser=ICRA_label_generator - -[ICRA_Semantic_spider/0.?] -Parent=Internet Content Rating Association -Browser=ICRA_Semantic_spider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NameProtect - -[NameProtect] -Parent=DefaultProperties -Browser=NameProtect -isBanned=true -Crawler=true - -[abot/*] -Parent=NameProtect -Browser=NameProtect - -[NP/*] -Parent=NameProtect -Browser=NameProtect - -[NPBot*] -Parent=NameProtect -Browser=NameProtect - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netcraft - -[Netcraft] -Parent=DefaultProperties -Browser=Netcraft -isBanned=true -Crawler=true - -[*Netcraft Web Server Survey*] -Parent=Netcraft -Browser=Netcraft Webserver Survey -isBanned=true - -[Mozilla/5.0 (compatible; NetcraftSurveyAgent/1.0; info@netcraft.com)] -Parent=Netcraft -Browser=NetcraftSurveyAgent - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NewsGator - -[NewsGator] -Parent=DefaultProperties -Browser=NewsGator -isSyndicationReader=true - -[MarsEdit*] -Parent=NewsGator -Browser=MarsEdit - -[NetNewsWire*/*] -Parent=NewsGator -Browser=NetNewsWire -Platform=MacOSX - -[NewsFire/*] -Parent=NewsGator -Browser=NewsFire - -[NewsGator FetchLinks extension/*] -Parent=NewsGator -Browser=NewsGator FetchLinks - -[NewsGator/*] -Parent=NewsGator -Browser=NewsGator -isBanned=true - -[NewsGatorOnline/*] -Parent=NewsGator -Browser=NewsGatorOnline - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.2 - -[Chrome 0.2] -Parent=DefaultProperties -Browser=Chrome -Version=0.2 -MinorVer=2 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.3 - -[Chrome 0.3] -Parent=DefaultProperties -Browser=Chrome -Version=0.3 -MinorVer=3 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.4 - -[Chrome 0.4] -Parent=DefaultProperties -Browser=Chrome -Version=0.4 -MinorVer=4 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.5 - -[Chrome 0.5] -Parent=DefaultProperties -Browser=Chrome -Version=0.5 -MinorVer=5 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 1.0 - -[Chrome 1.0] -Parent=DefaultProperties -Browser=Chrome -Version=1.0 -MajorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 2.0 - -[Chrome 2.0] -Parent=DefaultProperties -Browser=Chrome -Version=2.0 -MajorVer=2 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 3.0 - -[Chrome 3.0] -Parent=DefaultProperties -Browser=Chrome -Version=3.0 -MajorVer=3 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google Code - -[Google Code] -Parent=DefaultProperties -Browser=Google Code -Tables=true -Cookies=true -JavaApplets=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.2 - -[Iron 0.2] -Parent=DefaultProperties -Browser=Iron -Version=0.2 -MinorVer=2 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.3 - -[Iron 0.3] -Parent=DefaultProperties -Browser=Iron -Version=0.3 -MinorVer=3 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.4 - -[Iron 0.4] -Parent=DefaultProperties -Browser=Iron -Version=0.4 -MinorVer=4 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iPod - -[iPod] -Parent=DefaultProperties -Browser=iPod -Platform=iPhone OSX -isMobileDevice=true - -[Mozilla/5.0 (iPod; U; *Mac OS X; *) AppleWebKit/* (*) Version/3.0 Mobile/* Safari/*] -Parent=iPod -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX - -[Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2 like Mac OS X; en-us) AppleWebKit/* (KHTML, like Gecko) Mobile/*] -Parent=iPod - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iTunes - -[iTunes] -Parent=DefaultProperties -Browser=iTunes -Platform=iPhone OSX - -[iTunes/* (Windows; ?)] -Parent=iTunes -Browser=iTunes -Platform=Win32 -Win32=true - -[MOT-* iTunes/* MIB/* Profile/MIDP-* Configuration/CLDC-* UP.Link/*] -Parent=iTunes - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Media Players - -[Media Players] -Parent=DefaultProperties -Browser=Media Players -Cookies=true - -[Microsoft NetShow(TM) Player with RealVideo(R)] -Parent=Media Players -Browser=Microsoft NetShow - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; *) AppleWebKit/* RealPlayer] -Parent=Media Players -Browser=RealPlayer -Platform=MacOSX - -[MPlayer 0.9*] -Parent=Media Players -Browser=MPlayer -Version=0.9 -MajorVer=0 -MinorVer=9 - -[MPlayer 1.*] -Parent=Media Players -Browser=MPlayer -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MPlayer HEAD CVS] -Parent=Media Players -Browser=MPlayer - -[RealPlayer*] -Parent=Media Players -Browser=RealPlayer - -[RMA/*] -Parent=Media Players -Browser=RMA - -[VLC media player*] -Parent=Media Players -Browser=VLC - -[vobsub] -Parent=Media Players -Browser=vobsub -isBanned=true - -[WinampMPEG/*] -Parent=Media Players -Browser=WinAmp - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nintendo - -[Nintendo Wii] -Parent=DefaultProperties -Browser= -isMobileDevice=true - -[Opera/* (Nintendo DSi; Opera/*; *; *)] -Parent=Nintendo Wii -Browser=DSi - -[Opera/* (Nintendo Wii; U; *)] -Parent=Nintendo Wii -Browser=Wii - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Windows Media Player - -[Windows Media Player] -Parent=DefaultProperties -Browser=Windows Media Player -Cookies=true - -[NSPlayer/10.*] -Parent=Windows Media Player -Version=10.0 -MajorVer=10 -MinorVer=0 - -[NSPlayer/11.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=11.0 -MajorVer=11 -MinorVer=0 - -[NSPlayer/4.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=4.0 -MajorVer=4 -MinorVer=0 - -[NSPlayer/7.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=7.0 -MajorVer=7 -MinorVer=0 - -[NSPlayer/8.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=8.0 -MajorVer=8 -MinorVer=0 - -[NSPlayer/9.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=9.0 -MajorVer=9 -MinorVer=0 - -[Windows-Media-Player/10.*] -Parent=Windows Media Player -Browser=Windows-Media-Player -Version=10.0 -MajorVer=10 -MinorVer=0 -Win32=true - -[Windows-Media-Player/11.*] -Parent=Windows Media Player -Version=11.0 -MajorVer=11 -MinorVer=0 -Win32=true - -[Windows-Media-Player/7.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=7.0 -MajorVer=7 -MinorVer=0 -Win32=true - -[Windows-Media-Player/8.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=8.0 -MajorVer=8 -MinorVer=0 -Win32=true - -[Windows-Media-Player/9.*] -Parent=Windows Media Player -Version=9.0 -MajorVer=9 -MinorVer=0 -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Zune - -[Zune] -Parent=DefaultProperties -Browser=Zune -Cookies=true - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 2.0*)*] -Parent=Zune -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 2.5*)*] -Parent=Zune -Version=2.5 -MajorVer=2 -MinorVer=5 - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 3.0*)*] -Parent=Zune -Version=3.0 -MajorVer=3 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.0 - -[QuickTime 7.0] -Parent=DefaultProperties -Browser=QuickTime -Version=7.0 -MajorVer=7 -Cookies=true - -[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.0 -Platform=MacOSX - -[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.0 -Platform=MacPPC - -[QuickTime (qtver=7.0*;os=Windows 95*)] -Parent=QuickTime 7.0 -Platform=Win95 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows 98*)] -Parent=QuickTime 7.0 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows Me*)] -Parent=QuickTime 7.0 -Platform=WinME -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 4.0*)] -Parent=QuickTime 7.0 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.0*)] -Parent=QuickTime 7.0 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.1*)] -Parent=QuickTime 7.0 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.2*)] -Parent=QuickTime 7.0 -Platform=Win2003 -Win32=true - -[QuickTime/7.0.* (qtver=7.0.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.0 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.1 - -[QuickTime 7.1] -Parent=DefaultProperties -Browser=QuickTime -Version=7.1 -MajorVer=7 -MinorVer=1 -Cookies=true - -[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.1 -Platform=MacOSX - -[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.1 -Platform=MacPPC - -[QuickTime (qtver=7.1*;os=Windows 98*)] -Parent=QuickTime 7.1 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 4.0*)] -Parent=QuickTime 7.1 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.0*)] -Parent=QuickTime 7.1 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.1*)] -Parent=QuickTime 7.1 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.2*)] -Parent=QuickTime 7.1 -Platform=Win2003 -Win32=true - -[QuickTime/7.1.* (qtver=7.1.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.1 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.2 - -[QuickTime 7.2] -Parent=DefaultProperties -Browser=QuickTime -Version=7.2 -MajorVer=7 -MinorVer=2 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.2*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.2 -Platform=MacOSX - -[QuickTime (qtver=7.2*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.2 -Platform=MacPPC - -[QuickTime (qtver=7.2*;os=Windows 98*)] -Parent=QuickTime 7.2 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 4.0*)] -Parent=QuickTime 7.2 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.0*)] -Parent=QuickTime 7.2 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.1*)] -Parent=QuickTime 7.2 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.2*)] -Parent=QuickTime 7.2 -Platform=Win2003 -Win32=true - -[QuickTime/7.2.* (qtver=7.2.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.2 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.3 - -[QuickTime 7.3] -Parent=DefaultProperties -Browser=QuickTime -Version=7.3 -MajorVer=7 -MinorVer=3 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.3*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.3 -Platform=MacOSX - -[QuickTime (qtver=7.3*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.3 -Platform=MacPPC - -[QuickTime (qtver=7.3*;os=Windows 98*)] -Parent=QuickTime 7.3 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 4.0*)] -Parent=QuickTime 7.3 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.0*)] -Parent=QuickTime 7.3 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.1*)] -Parent=QuickTime 7.3 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.2*)] -Parent=QuickTime 7.3 -Platform=Win2003 -Win32=true - -[QuickTime/7.3.* (qtver=7.3.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.3 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.4 - -[QuickTime 7.4] -Parent=DefaultProperties -Browser=QuickTime -Version=7.4 -MajorVer=7 -MinorVer=4 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.4*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.4 -Platform=MacOSX - -[QuickTime (qtver=7.4*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.4 -Platform=MacPPC - -[QuickTime (qtver=7.4*;os=Windows 98*)] -Parent=QuickTime 7.4 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 4.0*)] -Parent=QuickTime 7.4 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.0*)] -Parent=QuickTime 7.4 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.1*)] -Parent=QuickTime 7.4 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.2*)] -Parent=QuickTime 7.4 -Platform=Win2003 -Win32=true - -[QuickTime/7.4.* (qtver=7.4.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.4 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google Android - -[Android] -Parent=DefaultProperties -Browser=Android -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[Mozilla/5.0 (Linux; U; Android *; *) AppleWebKit/* (KHTML, like Gecko) Safari/*] -Parent=Android -Browser=Android -Platform=Linux -isMobileDevice=true - -[Mozilla/5.0 (Linux; U; Android *; *) AppleWebKit/* (KHTML, like Gecko) Version/3.0.* Mobile Safari/*] -Parent=Android -Browser=Android -Platform=Linux -isMobileDevice=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BlackBerry - -[BlackBerry] -Parent=DefaultProperties -Browser=BlackBerry -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[*BlackBerry*] -Parent=BlackBerry - -[*BlackBerrySimulator/*] -Parent=BlackBerry - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Handspring Blazer - -[Blazer] -Parent=DefaultProperties -Browser=Handspring Blazer -Platform=Palm -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 95; PalmSource; Blazer 3.0) 16;160x160] -Parent=Blazer -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.0) 16;320x448] -Parent=Blazer -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.1) 16;320x320] -Parent=Blazer -Version=4.1 -MajorVer=4 -MinorVer=1 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.2) 16;320x320] -Parent=Blazer -Version=4.2 -MajorVer=4 -MinorVer=2 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.4) 16;320x320] -Parent=Blazer -Version=4.4 -MajorVer=4 -MinorVer=4 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.5) 16;320x320] -Parent=Blazer -Version=4.5 -MajorVer=4 -MinorVer=5 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DoCoMo - -[DoCoMo] -Parent=DefaultProperties -Browser=DoCoMo -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[DoCoMo/1.0*] -Parent=DoCoMo -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WAP - -[DoCoMo/2.0*] -Parent=DoCoMo -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=WAP - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IEMobile - -[IEMobile] -Parent=DefaultProperties -Browser=IEMobile -Platform=WinCE -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -VBScript=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.*)*] -Parent=IEMobile -Version=6.0 -MajorVer=6 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.*)*] -Parent=IEMobile -Version=7.0 -MajorVer=7 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iPhone - -[iPhone] -Parent=DefaultProperties -Browser=iPhone -Platform=iPhone OSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -isMobileDevice=true -CssVersion=3 -supportsCSS=true - -[Mozilla/4.0 (iPhone; *)] -Parent=iPhone - -[Mozilla/4.0 (iPhone; U; CPU like Mac OS X; *)] -Parent=iPhone - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_0_1 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_1 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko)] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0_2 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_1 like Mac OS X; *)*] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_2_1 like Mac OS X; *)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.0 Mobile/* Safari/*] -Parent=iPhone -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/5.0 (iPod; U; *Mac OS X; *) AppleWebKit/* (*) Version/* Mobile/*] -Parent=iPhone -Browser=iTouch - -[Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2* like Mac OS X; *)*] -Parent=iPhone -Browser=iTouch -Version=2.2 -MajorVer=2 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KDDI - -[KDDI] -Parent=DefaultProperties -Browser=KDDI -Frames=true -Tables=true -Cookies=true -BackgroundSounds=true -VBScript=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[KDDI-* UP.Browser/* (GUI) MMP/*] -Parent=KDDI - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Miscellaneous Mobile - -[Miscellaneous Mobile] -Parent=DefaultProperties -Browser= -IFrames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; *; CentOS; *) AppleWebKit/* (KHTML, like Gecko) Bolt/0.* Version/3.0 Safari/*] -Parent=Miscellaneous Mobile -Browser=Bolt - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Motorola Internet Browser - -[Motorola Internet Browser] -Parent=DefaultProperties -Browser=Motorola Internet Browser -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[MOT-*/*] -Parent=Motorola Internet Browser - -[MOT-1*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-8700_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-0A/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-2B/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-88/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-C???/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-GATW_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-L6/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-L7/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-M*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-MP*/* Mozilla/* (compatible; MSIE *; Windows CE; *)] -Parent=Motorola Internet Browser -Win32=true - -[MOT-MP*/* Mozilla/4.0 (compatible; MSIE *; Windows CE; *)] -Parent=Motorola Internet Browser -Win32=true - -[MOT-SAP4_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-T*/*] -Parent=Motorola Internet Browser - -[MOT-T7*/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-T721*] -Parent=Motorola Internet Browser - -[MOT-TA02/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V*/*] -Parent=Motorola Internet Browser - -[MOT-V*/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-V3/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V4*/* MIB/*] -Parent=Motorola Internet Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN Mobile Proxy - -[MSN Mobile Proxy] -Parent=DefaultProperties -Browser=MSN Mobile Proxy -Win32=true -Frames=true -Tables=true -Cookies=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true - -[Mozilla/* (compatible; MSIE *; Windows*; MSN Mobile Proxy)] -Parent=MSN Mobile Proxy - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetFront - -[NetFront] -Parent=DefaultProperties -Browser=NetFront -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[*NetFront/*] -Parent=NetFront - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nokia - -[Nokia] -Parent=DefaultProperties -Browser=Nokia -Tables=true -Cookies=true -isMobileDevice=true - -[*Nokia*/*] -Parent=Nokia - -[Mozilla/* (SymbianOS/*; ?; *) AppleWebKit/* (KHTML, like Gecko) Safari/*] -Parent=Nokia -Platform=SymbianOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Openwave Mobile Browser - -[Openwave Mobile Browser] -Parent=DefaultProperties -Browser=Openwave Mobile Browser -Alpha=true -Win32=true -Win64=true -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[*UP.Browser/*] -Parent=Openwave Mobile Browser - -[*UP.Link/*] -Parent=Openwave Mobile Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera Mini - -[Opera Mini] -Parent=DefaultProperties -Browser=Opera Mini -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[Opera/* (J2ME/MIDP; Opera Mini/1.0*)*] -Parent=Opera Mini -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/1.1*)*] -Parent=Opera Mini -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/1.2*)*] -Parent=Opera Mini -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Opera/* (J2ME/MIDP; Opera Mini/2.0*)*] -Parent=Opera Mini -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/3.0*)*] -Parent=Opera Mini -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/3.1*)*] -Parent=Opera Mini -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/4.0*)*] -Parent=Opera Mini -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/4.1*)*] -Parent=Opera Mini -Version=4.1 -MajorVer=4 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/4.2*)*] -Parent=Opera Mini -Version=4.2 -MajorVer=4 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera Mobile - -[Opera Mobile] -Parent=DefaultProperties -Browser=Opera Mobi -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Opera/9.5 (Microsoft Windows; PPC; *Opera Mobile/*)] -Parent=Opera Mobile -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Opera/9.5 (Microsoft Windows; PPC; Opera Mobi/*)] -Parent=Opera Mobile -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Opera/9.51 Beta (Microsoft Windows; PPC; Opera Mobi/*)*] -Parent=Opera Mobile -Version=9.51 -MajorVer=9 -MinorVer=51 -Beta=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Playstation - -[Playstation] -Parent=DefaultProperties -Browser=Playstation -Platform=WAP -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Mozilla/* (PLAYSTATION *; *)] -Parent=Playstation -Browser=PlayStation 3 -Frames=false - -[Mozilla/* (PSP (PlayStation Portable); *)] -Parent=Playstation - -[Sony PS2 (Linux)] -Parent=Playstation -Browser=Sony PS2 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Pocket PC - -[Pocket PC] -Parent=DefaultProperties -Browser=Pocket PC -Platform=WinCE -Win32=true -Frames=true -Tables=true -Cookies=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*(compatible; MSIE *.*; Windows CE; PPC; *)] -Parent=Pocket PC - -[HTC-*/* Mozilla/* (compatible; MSIE *.*; Windows CE*)*] -Parent=Pocket PC -Win32=true - -[Mozilla/* (compatible; MSPIE *.*; *Windows CE*)*] -Parent=Pocket PC -Win32=true - -[T-Mobile* Mozilla/* (compatible; MSIE *.*; Windows CE; *)] -Parent=Pocket PC - -[Vodafone* Mozilla/* (compatible; MSIE *.*; Windows CE; *)*] -Parent=Pocket PC - -[Windows CE (Pocket PC) - Version *.*] -Parent=Pocket PC -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SEMC Browser - -[SEMC Browser] -Parent=DefaultProperties -Browser=SEMC Browser -Platform=JAVA -Tables=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*SEMC-Browser/*] -Parent=SEMC Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SonyEricsson - -[SonyEricsson] -Parent=DefaultProperties -Browser=SonyEricsson -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*Ericsson*] -Parent=SonyEricsson - -[*SonyEricsson*] -Parent=SonyEricsson - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netbox - -[Netbox] -Parent=DefaultProperties -Browser=Netbox -Frames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/3.01 (compatible; Netbox/*; Linux*)] -Parent=Netbox -Browser=Netbox -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PowerTV - -[PowerTV] -Parent=DefaultProperties -Browser=PowerTV -Platform=PowerTV -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/4.0 PowerTV/1.5 (Compatible; Spyglass DM 3.2.1, EXPLORER)] -Parent=PowerTV -Version=1.5 -MajorVer=1 -MinorVer=5 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WebTV/MSNTV - -[WebTV] -Parent=DefaultProperties -Browser=WebTV/MSNTV -Platform=WebTV -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/3.0 WebTV/1.*(compatible; MSIE 2.0)] -Parent=WebTV -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/4.0 WebTV/2.0*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/4.0 WebTV/2.1*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/4.0 WebTV/2.2*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Mozilla/4.0 WebTV/2.3*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.3 -MajorVer=2 -MinorVer=3 - -[Mozilla/4.0 WebTV/2.4*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.4 -MajorVer=2 -MinorVer=4 - -[Mozilla/4.0 WebTV/2.5*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.5 -MajorVer=2 -MinorVer=5 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.6*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.6 -MajorVer=2 -MinorVer=6 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.7*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.7 -MajorVer=2 -MinorVer=7 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.8*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.8 -MajorVer=2 -MinorVer=8 -JavaApplets=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.9*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.9 -MajorVer=2 -MinorVer=9 -JavaApplets=true -CssVersion=1 -supportsCSS=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Amaya - -[Amaya] -Parent=DefaultProperties -Browser=Amaya -Tables=true -Cookies=true - -[amaya/7.*] -Parent=Amaya -Version=7.0 -MajorVer=7 -MinorVer=0 - -[amaya/8.0*] -Parent=Amaya -Version=8.0 -MajorVer=8 -MinorVer=0 -CssVersion=2 -supportsCSS=true - -[amaya/8.1*] -Parent=Amaya -Version=8.1 -MajorVer=8 -MinorVer=1 -CssVersion=2 -supportsCSS=true - -[amaya/8.2*] -Parent=Amaya -Version=8.2 -MajorVer=8 -MinorVer=2 -CssVersion=2 -supportsCSS=true - -[amaya/8.3*] -Parent=Amaya -Version=8.3 -MajorVer=8 -MinorVer=3 -CssVersion=2 -supportsCSS=true - -[amaya/8.4*] -Parent=Amaya -Version=8.4 -MajorVer=8 -MinorVer=4 -CssVersion=2 -supportsCSS=true - -[amaya/8.5*] -Parent=Amaya -Version=8.5 -MajorVer=8 -MinorVer=5 -CssVersion=2 -supportsCSS=true - -[amaya/8.6*] -Parent=Amaya -Version=8.6 -MajorVer=8 -MinorVer=6 -CssVersion=2 -supportsCSS=true - -[amaya/8.7*] -Parent=Amaya -Version=8.7 -MajorVer=8 -MinorVer=7 -CssVersion=2 -supportsCSS=true - -[amaya/8.8*] -Parent=Amaya -Version=8.8 -MajorVer=8 -MinorVer=8 -CssVersion=2 -supportsCSS=true - -[amaya/8.9*] -Parent=Amaya -Version=8.9 -MajorVer=8 -MinorVer=9 -CssVersion=2 -supportsCSS=true - -[amaya/9.0*] -Parent=Amaya -Version=9.0 -MajorVer=8 -MinorVer=0 -CssVersion=2 -supportsCSS=true - -[amaya/9.1*] -Parent=Amaya -Version=9.1 -MajorVer=9 -MinorVer=1 -CssVersion=2 -supportsCSS=true - -[amaya/9.2*] -Parent=Amaya -Version=9.2 -MajorVer=9 -MinorVer=2 -CssVersion=2 -supportsCSS=true - -[amaya/9.3*] -Parent=Amaya -Version=9.3 -MajorVer=9 -MinorVer=3 - -[amaya/9.4*] -Parent=Amaya -Version=9.4 -MajorVer=9 -MinorVer=4 - -[amaya/9.5*] -Parent=Amaya -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Emacs-w3m/*] -Parent=Emacs/W3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Links - -[Links] -Parent=DefaultProperties -Browser=Links -Frames=true -Tables=true - -[Links (0.9*; CYGWIN_NT-5.1*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=WinXP - -[Links (0.9*; Darwin*)] -Parent=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=MacPPC - -[Links (0.9*; FreeBSD*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=FreeBSD - -[Links (0.9*; Linux*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Linux - -[Links (0.9*; OS/2*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=OS/2 - -[Links (0.9*; Unix*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Unix - -[Links (0.9*; Win32*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Win32 -Win32=true - -[Links (1.0*; CYGWIN_NT-5.1*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP - -[Links (1.0*; FreeBSD*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=FreeBSD - -[Links (1.0*; Linux*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Linux - -[Links (1.0*; OS/2*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=OS/2 - -[Links (1.0*; Unix*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Unix - -[Links (1.0*; Win32*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win32 -Win32=true - -[Links (2.0*; Linux*)] -Parent=Links -Browser=Links -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Linux - -[Links (2.1*; FreeBSD*)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=FreeBSD - -[Links (2.1*; Linux *)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=Linux - -[Links (2.1*; OpenBSD*)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=OpenBSD - -[Links (2.2*; FreeBSD*)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=FreeBSD - -[Links (2.2*; Linux *)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=Linux - -[Links (2.2*; OpenBSD*)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=OpenBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lynx - -[Lynx] -Parent=DefaultProperties -Browser=Lynx -Frames=true -Tables=true - -[Lynx *] -Parent=Lynx -Browser=Lynx - -[Lynx/2.3*] -Parent=Lynx -Browser=Lynx -Version=2.3 -MajorVer=2 -MinorVer=3 - -[Lynx/2.4*] -Parent=Lynx -Browser=Lynx -Version=2.4 -MajorVer=2 -MinorVer=4 - -[Lynx/2.5*] -Parent=Lynx -Browser=Lynx -Version=2.5 -MajorVer=2 -MinorVer=5 - -[Lynx/2.6*] -Parent=Lynx -Browser=Lynx -Version=2.6 -MajorVer=2 -MinorVer=6 - -[Lynx/2.7*] -Parent=Lynx -Browser=Lynx -Version=2.7 -MajorVer=2 -MinorVer=7 - -[Lynx/2.8*] -Parent=Lynx -Browser=Lynx -Version=2.8 -MajorVer=2 -MinorVer=8 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NCSA Mosaic - -[Mosaic] -Parent=DefaultProperties -Browser=Mosaic - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; w3m - -[w3m] -Parent=DefaultProperties -Browser=w3m -Frames=true -Tables=true - -[w3m/0.1*] -Parent=w3m -Browser=w3m -Version=0.1 -MajorVer=0 -MinorVer=1 - -[w3m/0.2*] -Parent=w3m -Browser=w3m -Version=0.2 -MajorVer=0 -MinorVer=2 - -[w3m/0.3*] -Parent=w3m -Browser=w3m -Version=0.3 -MajorVer=0 -MinorVer=3 - -[w3m/0.4*] -Parent=w3m -Browser=w3m -Version=0.4 -MajorVer=0 -MinorVer=4 -Cookies=true - -[w3m/0.5*] -Parent=w3m -Browser=w3m -Version=0.5 -MajorVer=0 -MinorVer=5 -Cookies=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.10 - -[ELinks 0.10] -Parent=DefaultProperties -Browser=ELinks -Version=0.10 -MinorVer=10 -Frames=true -Tables=true - -[ELinks (0.10*; *AIX*)] -Parent=ELinks 0.10 -Platform=AIX - -[ELinks (0.10*; *BeOS*)] -Parent=ELinks 0.10 -Platform=BeOS - -[ELinks (0.10*; *CygWin*)] -Parent=ELinks 0.10 -Platform=CygWin - -[ELinks (0.10*; *Darwin*)] -Parent=ELinks 0.10 -Platform=Darwin - -[ELinks (0.10*; *Digital Unix*)] -Parent=ELinks 0.10 -Platform=Digital Unix - -[ELinks (0.10*; *FreeBSD*)] -Parent=ELinks 0.10 -Platform=FreeBSD - -[ELinks (0.10*; *HPUX*)] -Parent=ELinks 0.10 -Platform=HP-UX - -[ELinks (0.10*; *IRIX*)] -Parent=ELinks 0.10 -Platform=IRIX - -[ELinks (0.10*; *Linux*)] -Parent=ELinks 0.10 -Platform=Linux - -[ELinks (0.10*; *NetBSD*)] -Parent=ELinks 0.10 -Platform=NetBSD - -[ELinks (0.10*; *OpenBSD*)] -Parent=ELinks 0.10 -Platform=OpenBSD - -[ELinks (0.10*; *OS/2*)] -Parent=ELinks 0.10 -Platform=OS/2 - -[ELinks (0.10*; *RISC*)] -Parent=ELinks 0.10 -Platform=RISC OS - -[ELinks (0.10*; *Solaris*)] -Parent=ELinks 0.10 -Platform=Solaris - -[ELinks (0.10*; *Unix*)] -Parent=ELinks 0.10 -Platform=Unix - -[ELinks/0.10* (*AIX*)] -Parent=ELinks 0.10 -Platform=AIX - -[ELinks/0.10* (*BeOS*)] -Parent=ELinks 0.10 -Platform=BeOS - -[ELinks/0.10* (*CygWin*)] -Parent=ELinks 0.10 -Platform=CygWin - -[ELinks/0.10* (*Darwin*)] -Parent=ELinks 0.10 -Platform=Darwin - -[ELinks/0.10* (*Digital Unix*)] -Parent=ELinks 0.10 -Platform=Digital Unix - -[ELinks/0.10* (*FreeBSD*)] -Parent=ELinks 0.10 -Platform=FreeBSD - -[ELinks/0.10* (*HPUX*)] -Parent=ELinks 0.10 -Platform=HP-UX - -[ELinks/0.10* (*IRIX*)] -Parent=ELinks 0.10 -Platform=IRIX - -[ELinks/0.10* (*Linux*)] -Parent=ELinks 0.10 -Platform=Linux - -[ELinks/0.10* (*NetBSD*)] -Parent=ELinks 0.10 -Platform=NetBSD - -[ELinks/0.10* (*OpenBSD*)] -Parent=ELinks 0.10 -Platform=OpenBSD - -[ELinks/0.10* (*OS/2*)] -Parent=ELinks 0.10 -Platform=OS/2 - -[ELinks/0.10* (*RISC*)] -Parent=ELinks 0.10 -Platform=RISC OS - -[ELinks/0.10* (*Solaris*)] -Parent=ELinks 0.10 -Platform=Solaris - -[ELinks/0.10* (*Unix*)] -Parent=ELinks 0.10 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.11 - -[ELinks 0.11] -Parent=DefaultProperties -Browser=ELinks -Version=0.11 -MinorVer=11 -Frames=true -Tables=true - -[ELinks (0.11*; *AIX*)] -Parent=ELinks 0.11 -Platform=AIX - -[ELinks (0.11*; *BeOS*)] -Parent=ELinks 0.11 -Platform=BeOS - -[ELinks (0.11*; *CygWin*)] -Parent=ELinks 0.11 -Platform=CygWin - -[ELinks (0.11*; *Darwin*)] -Parent=ELinks 0.11 -Platform=Darwin - -[ELinks (0.11*; *Digital Unix*)] -Parent=ELinks 0.11 -Platform=Digital Unix - -[ELinks (0.11*; *FreeBSD*)] -Parent=ELinks 0.11 -Platform=FreeBSD - -[ELinks (0.11*; *HPUX*)] -Parent=ELinks 0.11 -Platform=HP-UX - -[ELinks (0.11*; *IRIX*)] -Parent=ELinks 0.11 -Platform=IRIX - -[ELinks (0.11*; *Linux*)] -Parent=ELinks 0.11 -Platform=Linux - -[ELinks (0.11*; *NetBSD*)] -Parent=ELinks 0.11 -Platform=NetBSD - -[ELinks (0.11*; *OpenBSD*)] -Parent=ELinks 0.11 -Platform=OpenBSD - -[ELinks (0.11*; *OS/2*)] -Parent=ELinks 0.11 -Platform=OS/2 - -[ELinks (0.11*; *RISC*)] -Parent=ELinks 0.11 -Platform=RISC OS - -[ELinks (0.11*; *Solaris*)] -Parent=ELinks 0.11 -Platform=Solaris - -[ELinks (0.11*; *Unix*)] -Parent=ELinks 0.11 -Platform=Unix - -[ELinks/0.11* (*AIX*)] -Parent=ELinks 0.11 -Platform=AIX - -[ELinks/0.11* (*BeOS*)] -Parent=ELinks 0.11 -Platform=BeOS - -[ELinks/0.11* (*CygWin*)] -Parent=ELinks 0.11 -Platform=CygWin - -[ELinks/0.11* (*Darwin*)] -Parent=ELinks 0.11 -Platform=Darwin - -[ELinks/0.11* (*Digital Unix*)] -Parent=ELinks 0.11 -Platform=Digital Unix - -[ELinks/0.11* (*FreeBSD*)] -Parent=ELinks 0.11 -Platform=FreeBSD - -[ELinks/0.11* (*HPUX*)] -Parent=ELinks 0.11 -Platform=HP-UX - -[ELinks/0.11* (*IRIX*)] -Parent=ELinks 0.11 -Platform=IRIX - -[ELinks/0.11* (*Linux*)] -Parent=ELinks 0.11 -Platform=Linux - -[ELinks/0.11* (*NetBSD*)] -Parent=ELinks 0.11 -Platform=NetBSD - -[ELinks/0.11* (*OpenBSD*)] -Parent=ELinks 0.11 -Platform=OpenBSD - -[ELinks/0.11* (*OS/2*)] -Parent=ELinks 0.11 -Platform=OS/2 - -[ELinks/0.11* (*RISC*)] -Parent=ELinks 0.11 -Platform=RISC OS - -[ELinks/0.11* (*Solaris*)] -Parent=ELinks 0.11 -Platform=Solaris - -[ELinks/0.11* (*Unix*)] -Parent=ELinks 0.11 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.12 - -[ELinks 0.12] -Parent=DefaultProperties -Browser=ELinks -Version=0.12 -MinorVer=12 -Frames=true -Tables=true - -[ELinks (0.12*; *AIX*)] -Parent=ELinks 0.12 -Platform=AIX - -[ELinks (0.12*; *BeOS*)] -Parent=ELinks 0.12 -Platform=BeOS - -[ELinks (0.12*; *CygWin*)] -Parent=ELinks 0.12 -Platform=CygWin - -[ELinks (0.12*; *Darwin*)] -Parent=ELinks 0.12 -Platform=Darwin - -[ELinks (0.12*; *Digital Unix*)] -Parent=ELinks 0.12 -Platform=Digital Unix - -[ELinks (0.12*; *FreeBSD*)] -Parent=ELinks 0.12 -Platform=FreeBSD - -[ELinks (0.12*; *HPUX*)] -Parent=ELinks 0.12 -Platform=HP-UX - -[ELinks (0.12*; *IRIX*)] -Parent=ELinks 0.12 -Platform=IRIX - -[ELinks (0.12*; *Linux*)] -Parent=ELinks 0.12 -Platform=Linux - -[ELinks (0.12*; *NetBSD*)] -Parent=ELinks 0.12 -Platform=NetBSD - -[ELinks (0.12*; *OpenBSD*)] -Parent=ELinks 0.12 -Platform=OpenBSD - -[ELinks (0.12*; *OS/2*)] -Parent=ELinks 0.12 -Platform=OS/2 - -[ELinks (0.12*; *RISC*)] -Parent=ELinks 0.12 -Platform=RISC OS - -[ELinks (0.12*; *Solaris*)] -Parent=ELinks 0.12 -Platform=Solaris - -[ELinks (0.12*; *Unix*)] -Parent=ELinks 0.12 -Platform=Unix - -[ELinks/0.12* (*AIX*)] -Parent=ELinks 0.12 -Platform=AIX - -[ELinks/0.12* (*BeOS*)] -Parent=ELinks 0.12 -Platform=BeOS - -[ELinks/0.12* (*CygWin*)] -Parent=ELinks 0.12 -Platform=CygWin - -[ELinks/0.12* (*Darwin*)] -Parent=ELinks 0.12 -Platform=Darwin - -[ELinks/0.12* (*Digital Unix*)] -Parent=ELinks 0.12 -Platform=Digital Unix - -[ELinks/0.12* (*FreeBSD*)] -Parent=ELinks 0.12 -Platform=FreeBSD - -[ELinks/0.12* (*HPUX*)] -Parent=ELinks 0.12 -Platform=HP-UX - -[ELinks/0.12* (*IRIX*)] -Parent=ELinks 0.12 -Platform=IRIX - -[ELinks/0.12* (*Linux*)] -Parent=ELinks 0.12 -Platform=Linux - -[ELinks/0.12* (*NetBSD*)] -Parent=ELinks 0.12 -Platform=NetBSD - -[ELinks/0.12* (*OpenBSD*)] -Parent=ELinks 0.12 -Platform=OpenBSD - -[ELinks/0.12* (*OS/2*)] -Parent=ELinks 0.12 -Platform=OS/2 - -[ELinks/0.12* (*RISC*)] -Parent=ELinks 0.12 -Platform=RISC OS - -[ELinks/0.12* (*Solaris*)] -Parent=ELinks 0.12 -Platform=Solaris - -[ELinks/0.12* (*Unix*)] -Parent=ELinks 0.12 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.9 - -[ELinks 0.9] -Parent=DefaultProperties -Browser=ELinks -Version=0.9 -MinorVer=9 -Frames=true -Tables=true - -[ELinks (0.9*; *AIX*)] -Parent=ELinks 0.9 -Platform=AIX - -[ELinks (0.9*; *BeOS*)] -Parent=ELinks 0.9 -Platform=BeOS - -[ELinks (0.9*; *CygWin*)] -Parent=ELinks 0.9 -Platform=CygWin - -[ELinks (0.9*; *Darwin*)] -Parent=ELinks 0.9 -Platform=Darwin - -[ELinks (0.9*; *Digital Unix*)] -Parent=ELinks 0.9 -Platform=Digital Unix - -[ELinks (0.9*; *FreeBSD*)] -Parent=ELinks 0.9 -Platform=FreeBSD - -[ELinks (0.9*; *HPUX*)] -Parent=ELinks 0.9 -Platform=HP-UX - -[ELinks (0.9*; *IRIX*)] -Parent=ELinks 0.9 -Platform=IRIX - -[ELinks (0.9*; *Linux*)] -Parent=ELinks 0.9 -Platform=Linux - -[ELinks (0.9*; *NetBSD*)] -Parent=ELinks 0.9 -Platform=NetBSD - -[ELinks (0.9*; *OpenBSD*)] -Parent=ELinks 0.9 -Platform=OpenBSD - -[ELinks (0.9*; *OS/2*)] -Parent=ELinks 0.9 -Platform=OS/2 - -[ELinks (0.9*; *RISC*)] -Parent=ELinks 0.9 -Platform=RISC OS - -[ELinks (0.9*; *Solaris*)] -Parent=ELinks 0.9 -Platform=Solaris - -[ELinks (0.9*; *Unix*)] -Parent=ELinks 0.9 -Platform=Unix - -[ELinks/0.9* (*AIX*)] -Parent=ELinks 0.9 -Platform=AIX - -[ELinks/0.9* (*BeOS*)] -Parent=ELinks 0.9 -Platform=BeOS - -[ELinks/0.9* (*CygWin*)] -Parent=ELinks 0.9 -Platform=CygWin - -[ELinks/0.9* (*Darwin*)] -Parent=ELinks 0.9 -Platform=Darwin - -[ELinks/0.9* (*Digital Unix*)] -Parent=ELinks 0.9 -Platform=Digital Unix - -[ELinks/0.9* (*FreeBSD*)] -Parent=ELinks 0.9 -Platform=FreeBSD - -[ELinks/0.9* (*HPUX*)] -Parent=ELinks 0.9 -Platform=HP-UX - -[ELinks/0.9* (*IRIX*)] -Parent=ELinks 0.9 -Platform=IRIX - -[ELinks/0.9* (*Linux*)] -Parent=ELinks 0.9 -Platform=Linux - -[ELinks/0.9* (*NetBSD*)] -Parent=ELinks 0.9 -Platform=NetBSD - -[ELinks/0.9* (*OpenBSD*)] -Parent=ELinks 0.9 -Platform=OpenBSD - -[ELinks/0.9* (*OS/2*)] -Parent=ELinks 0.9 -Platform=OS/2 - -[ELinks/0.9* (*RISC*)] -Parent=ELinks 0.9 -Platform=RISC OS - -[ELinks/0.9* (*Solaris*)] -Parent=ELinks 0.9 -Platform=Solaris - -[ELinks/0.9* (*Unix*)] -Parent=ELinks 0.9 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AppleWebKit - -[AppleWebKit] -Parent=DefaultProperties -Browser=AppleWebKit -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (KHTML, like Gecko)] -Parent=AppleWebKit - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Camino - -[Camino] -Parent=DefaultProperties -Browser=Camino -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.7*] -Parent=Camino -Version=0.7 -MajorVer=0 -MinorVer=7 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.8*] -Parent=Camino -Version=0.8 -MajorVer=0 -MinorVer=8 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.9*] -Parent=Camino -Version=0.9 -MajorVer=0 -MinorVer=9 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.0*] -Parent=Camino -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.2*] -Parent=Camino -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.3*] -Parent=Camino -Version=1.3 -MajorVer=1 -MinorVer=3 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.4*] -Parent=Camino -Version=1.4 -MajorVer=1 -MinorVer=4 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.5*] -Parent=Camino -Version=1.5 -MajorVer=1 -MinorVer=5 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.6*] -Parent=Camino -Version=1.6 -MajorVer=1 -MinorVer=6 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chimera - -[Chimera] -Parent=DefaultProperties -Browser=Chimera -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Chimera/*] -Parent=Chimera -Platform=MacOSX - -[Mozilla/5.0 Gecko/* Chimera/*] -Parent=Chimera - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Dillo - -[Dillo] -Parent=DefaultProperties -Browser=Dillo -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -CssVersion=2 -supportsCSS=true - -[Dillo/0.6*] -Parent=Dillo -Version=0.6 -MajorVer=0 -MinorVer=6 - -[Dillo/0.7*] -Parent=Dillo -Version=0.7 -MajorVer=0 -MinorVer=7 - -[Dillo/0.8*] -Parent=Dillo -Version=0.8 -MajorVer=0 -MinorVer=8 - -[Dillo/2.0] -Parent=Dillo -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Emacs/W3 - -[Emacs/W3] -Parent=DefaultProperties -Browser=Emacs/W3 -Frames=true -Tables=true -Cookies=true - -[Emacs/W3/2.* (Unix*] -Parent=Emacs/W3 -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Unix - -[Emacs/W3/2.* (X11*] -Parent=Emacs/W3 -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Linux - -[Emacs/W3/3.* (Unix*] -Parent=Emacs/W3 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Unix - -[Emacs/W3/3.* (X11*] -Parent=Emacs/W3 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Linux - -[Emacs/W3/4.* (Unix*] -Parent=Emacs/W3 -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Unix - -[Emacs/W3/4.* (X11*] -Parent=Emacs/W3 -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; fantomas - -[fantomas] -Parent=DefaultProperties -Browser=fantomas -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/4.0 (cloakBrowser)] -Parent=fantomas -Browser=fantomas cloakBrowser - -[Mozilla/4.0 (fantomas shadowMaker Browser)] -Parent=fantomas -Browser=fantomas shadowMaker Browser - -[Mozilla/4.0 (fantomBrowser)] -Parent=fantomas -Browser=fantomas fantomBrowser - -[Mozilla/4.0 (fantomCrew Browser)] -Parent=fantomas -Browser=fantomas fantomCrew Browser - -[Mozilla/4.0 (stealthBrowser)] -Parent=fantomas -Browser=fantomas stealthBrowser - -[multiBlocker browser*] -Parent=fantomas -Browser=fantomas multiBlocker browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FrontPage - -[FrontPage] -Parent=DefaultProperties -Browser=FrontPage -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/?* (compatible; MS FrontPage*)] -Parent=FrontPage - -[MSFrontPage/*] -Parent=FrontPage - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Galeon - -[Galeon] -Parent=DefaultProperties -Browser=Galeon -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/1.*] -Parent=Galeon -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/2.*] -Parent=Galeon -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 Galeon/1.* (X11; Linux*)*] -Parent=Galeon -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 Galeon/2.* (X11; Linux*)*] -Parent=Galeon -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HP Secure Web Browser - -[HP Secure Web Browser] -Parent=DefaultProperties -Browser=HP Secure Web Browser -Platform=OpenVMS -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.0*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.1*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.2*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.3*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.4*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.4 -MajorVer=1 -MinorVer=4 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.5*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.5 -MajorVer=1 -MinorVer=5 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.6*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.6 -MajorVer=1 -MinorVer=6 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.7*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.7 -MajorVer=1 -MinorVer=7 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.8*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.8 -MajorVer=1 -MinorVer=8 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IBrowse - -[IBrowse] -Parent=DefaultProperties -Browser=IBrowse -Platform=Amiga -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Arexx (compatible; MSIE 6.0; AmigaOS5.0) IBrowse 4.0] -Parent=IBrowse -Version=4.0 -MajorVer=4 -MinorVer=0 - -[IBrowse/1.22 (AmigaOS *)] -Parent=IBrowse -Version=1.22 -MajorVer=1 -MinorVer=22 - -[IBrowse/2.1 (AmigaOS *)] -Parent=IBrowse -Version=2.1 -MajorVer=2 -MinorVer=1 - -[IBrowse/2.2 (AmigaOS *)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=2 - -[IBrowse/2.3 (AmigaOS *)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=3 - -[Mozilla/* (Win98; I) IBrowse/2.1 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/* (Win98; I) IBrowse/2.2 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Mozilla/* (Win98; I) IBrowse/2.3 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.3 -MajorVer=2 -MinorVer=3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iCab - -[iCab] -Parent=DefaultProperties -Browser=iCab -Frames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[iCab/2.7* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=Mac68K - -[iCab/2.7* (Macintosh; ?; PPC*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=MacPPC - -[iCab/2.8* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacOSX - -[iCab/2.8* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=Mac68K - -[iCab/2.8* (Macintosh; ?; PPC)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacPPC - -[iCab/2.9* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacOSX - -[iCab/2.9* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=Mac68K - -[iCab/2.9* (Macintosh; ?; PPC*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacPPC - -[iCab/3.0* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[iCab/3.0* (Macintosh; ?; PPC*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacPPC -CssVersion=2 -supportsCSS=true - -[iCab/4.0 (Macintosh; U; *Mac OS X)] -Parent=iCab -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (compatible; iCab 3.0*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; iCab 3.0*; Macintosh; ?; PPC*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacPPC -CssVersion=2 -supportsCSS=true - -[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; 68K*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=Mac68K - -[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacOSX - -[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacOSX - -[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 4.2*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iSiloX - -[iSiloX] -Parent=DefaultProperties -Browser=iSiloX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -Crawler=true -CssVersion=2 -supportsCSS=true - -[iSiloX/4.0* MacOS] -Parent=iSiloX -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacPPC - -[iSiloX/4.0* Windows/32] -Parent=iSiloX -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Win32 -Win32=true - -[iSiloX/4.1* MacOS] -Parent=iSiloX -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=MacPPC - -[iSiloX/4.1* Windows/32] -Parent=iSiloX -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=Win32 -Win32=true - -[iSiloX/4.2* MacOS] -Parent=iSiloX -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=MacPPC - -[iSiloX/4.2* Windows/32] -Parent=iSiloX -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=Win32 -Win32=true - -[iSiloX/4.3* MacOS] -Parent=iSiloX -Version=4.3 -MajorVer=4 -MinorVer=4 -Platform=MacOSX - -[iSiloX/4.3* Windows/32] -Parent=iSiloX -Version=4.3 -MajorVer=4 -MinorVer=3 -Platform=Win32 -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycoris Desktop/LX - -[Lycoris Desktop/LX] -Parent=DefaultProperties -Browser=Lycoris Desktop/LX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -Crawler=true - -[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*: Desktop/LX Amethyst) Gecko/*] -Parent=Lycoris Desktop/LX -Version=1.1 -MajorVer=1 -MinorVer=1 -Platform=Linux - -[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*; Desktop/LX Amethyst) Gecko/*] -Parent=Lycoris Desktop/LX -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mosaic - -[Mosaic] -Parent=DefaultProperties -Browser=Mosaic -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[Mozilla/4.0 (VMS_Mosaic)] -Parent=Mosaic -Platform=OpenVMS - -[VMS_Mosaic/3.7*] -Parent=Mosaic -Version=3.7 -MajorVer=3 -MinorVer=7 -Platform=OpenVMS - -[VMS_Mosaic/3.8*] -Parent=Mosaic -Version=3.8 -MajorVer=3 -MinorVer=8 -Platform=OpenVMS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetPositive - -[NetPositive] -Parent=DefaultProperties -Browser=NetPositive -Platform=BeOS -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[*NetPositive/2.2*] -Parent=NetPositive -Version=2.2 -MajorVer=2 -MinorVer=2 - -[*NetPositive/2.2*BeOS*] -Parent=NetPositive -Version=2.2 -MajorVer=2 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OmniWeb - -[OmniWeb] -Parent=DefaultProperties -Browser=OmniWeb -Platform=MacOSX -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v4*] -Parent=OmniWeb -Version=4.5 -MajorVer=4 -MinorVer=5 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v5*] -Parent=OmniWeb -Version=5. -MajorVer=5 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v6*] -Parent=OmniWeb -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/4*] -Parent=OmniWeb -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacPPC - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/5*] -Parent=OmniWeb -Version=5.0 -MajorVer=5 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/6*] -Parent=OmniWeb -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=MacPPC - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.34] -Parent=OmniWeb -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.34] -Parent=OmniWeb -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v607] -Parent=OmniWeb -Version=5.5 -MajorVer=5 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v607] -Parent=OmniWeb -Version=5.5 -MajorVer=5 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/522+ (KHTML, like Gecko, Safari/522) OmniWeb/v613] -Parent=OmniWeb -Version=5.6 -MajorVer=5 -MinorVer=6 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/522+ (KHTML, like Gecko, Safari/522) OmniWeb/v613] -Parent=OmniWeb -Version=5.6 -MajorVer=5 -MinorVer=6 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v496] -Parent=OmniWeb -Version=4.5 -MajorVer=4 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558.36 ] -Parent=OmniWeb -Version=5.0 -MajorVer=5 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Shiira - -[Shiira] -Parent=DefaultProperties -Browser=Shiira -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/0.9*] -Parent=Shiira -Version=0.9 -MajorVer=0 -MinorVer=9 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.0*] -Parent=Shiira -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.1*] -Parent=Shiira -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.2*] -Parent=Shiira -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/2.1*] -Parent=Shiira -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/2.2*] -Parent=Shiira -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Windows Maker] -Parent=DefaultProperties -Browser=WMaker -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -VBScript=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[WMaker*] -Parent=Windows Maker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.0 - -[K-Meleon 1.0] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.0 -MajorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.1 - -[K-Meleon 1.1] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.1 -MajorVer=1 -MinorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.5 - -[K-Meleon 1.5] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.5 -MajorVer=1 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Platform=WinVista - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 3.0 - -[Konqueror 3.0] -Parent=DefaultProperties -Browser=Konqueror -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[*Konqueror/3.0*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -IFrames=false - -[*Konqueror/3.0*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=FreeBSD -IFrames=false - -[*Konqueror/3.0*Linux*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Linux -IFrames=false - -[*Konqueror/3.1*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 - -[*Konqueror/3.1*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 -Platform=FreeBSD - -[*Konqueror/3.1*Linux*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 - -[*Konqueror/3.2*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 - -[*Konqueror/3.2*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 -Platform=FreeBSD - -[*Konqueror/3.2*Linux*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 -Platform=Linux - -[*Konqueror/3.3*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 - -[*Konqueror/3.3*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=FreeBSD - -[*Konqueror/3.3*Linux*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=Linux - -[*Konqueror/3.3*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=OpenBSD - -[*Konqueror/3.4*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 - -[*Konqueror/3.4*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=FreeBSD - -[*Konqueror/3.4*Linux*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=Linux - -[*Konqueror/3.4*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=OpenBSD - -[*Konqueror/3.5*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 - -[*Konqueror/3.5*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=FreeBSD - -[*Konqueror/3.5*Linux*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=Linux - -[*Konqueror/3.5*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=OpenBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.0 - -[Konqueror 4.0] -Parent=DefaultProperties -Browser=Konqueror -Version=4.0 -MajorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.0*; Debian) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; *Linux) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; FreeBSD) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; NetBSD) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.1 - -[Konqueror 4.1] -Parent=DefaultProperties -Browser=Konqueror -Version=4.1 -MajorVer=4 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.1*; *Linux*) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.1*; Debian) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.1*; FreeBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.1*; NetBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.2 - -[Konqueror 4.2] -Parent=DefaultProperties -Browser=Konqueror -Version=4.2 -MajorVer=4 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.2*; *Linux*) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.2*; Debian) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.2*; FreeBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.2*; NetBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari - -[Safari] -Parent=DefaultProperties -Browser=Safari -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/100*] -Parent=Safari -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/125*] -Parent=Safari -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/312*] -Parent=Safari -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/412*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/416*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/417*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/418*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/419*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/52*] -Parent=Safari -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/85*] -Parent=Safari -Version=1.0 -MajorVer=1 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.0 - -[Safari 3.0] -Parent=DefaultProperties -Browser=Safari -Version=3.0 -MajorVer=3 -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.1 - -[Safari 3.1] -Parent=DefaultProperties -Browser=Safari -Version=3.1 -MajorVer=3 -MinorVer=1 -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.2 - -[Safari 3.2] -Parent=DefaultProperties -Browser=Safari -Version=3.2 -MajorVer=3 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 4.0 - -[Safari 4.0] -Parent=DefaultProperties -Browser=Safari -Version=4.0 -MajorVer=4 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *) AppleWebKit/* (KHTML, like Gecko) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *) AppleWebKit/* (KHTML, like Gecko) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 7.0; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 7.0; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 10.0 - -[Opera 10.0] -Parent=DefaultProperties -Browser=Opera -Version=10.0 -MajorVer=10 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 10.0*] -Parent=Opera 10.0 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 10.0*] -Parent=Opera 10.0 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (Linux*)*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (Macintosh; *Mac OS X;*)*] -Parent=Opera 10.0 -Platform=MacOSX - -[Opera/10.0* (Windows 95*)*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Opera/10.0* (Windows 98*)*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Opera/10.0* (Windows CE*)*] -Parent=Opera 10.0 -Platform=WinCE -Win32=true - -[Opera/10.0* (Windows ME*)*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Opera/10.0* (Windows NT 4.0*)*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Opera/10.0* (Windows NT 5.0*)*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Opera/10.0* (Windows NT 5.1*)*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Opera/10.0* (Windows NT 5.2*)*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Opera/10.0* (Windows NT 6.0*)*] -Parent=Opera 10.0 -Platform=WinVista -Win32=true - -[Opera/10.0* (Windows NT 6.1*)*] -Parent=Opera 10.0 -Platform=Win7 - -[Opera/10.0* (Windows XP*)*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Opera/10.0* (X11; FreeBSD*)*] -Parent=Opera 10.0 -Platform=FreeBSD - -[Opera/10.0* (X11; Linux*)*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (X11; SunOS*)*] -Parent=Opera 10.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.0 - -[Opera 7.0] -Parent=DefaultProperties -Browser=Opera -Version=7.0 -MajorVer=7 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/3.0 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/3.0 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/3.0 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/3.0 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/3.0 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/3.0 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 2000) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 95) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 98) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows ME) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 4.0) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.0) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows XP) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.78 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.78 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/4.78 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/4.78 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/4.78 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/4.78 (Windows NT 5.1; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.78 (Windows Windows NT 5.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.78 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows NT 5.1; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Opera/7.0* (Windows 2000; ?)*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Opera/7.0* (Windows 95; ?)*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Opera/7.0* (Windows 98; ?)*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Opera/7.0* (Windows ME; ?)*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Opera/7.0* (Windows NT 4.0; ?)*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Opera/7.0* (Windows NT 5.0; ?)*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Opera/7.0* (Windows NT 5.1; ?)*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Opera/7.0* (Windows XP; ?)*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.1 - -[Opera 7.1] -Parent=DefaultProperties -Browser=Opera -Version=7.1 -MajorVer=7 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows 2000; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Opera/7.1* (Linux*; ?)*] -Parent=Opera 7.1 -Platform=Linux - -[Opera/7.1* (Windows 95; ?)*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Opera/7.1* (Windows 98; ?)*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Opera/7.1* (Windows ME; ?)*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Opera/7.1* (Windows NT 4.0; ?)*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Opera/7.1* (Windows NT 5.0; ?)*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Opera/7.1* (Windows NT 5.1; ?)*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Opera/7.1* (Windows XP; ?)*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.2 - -[Opera 7.2] -Parent=DefaultProperties -Browser=Opera -Version=7.2 -MajorVer=7 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.2*] -Parent=Opera 7.2 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows 2000; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Opera/7.2* (Linux*; ?)*] -Parent=Opera 7.2 -Platform=Linux - -[Opera/7.2* (Windows 95; ?)*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Opera/7.2* (Windows 98; ?)*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Opera/7.2* (Windows ME; ?)*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Opera/7.2* (Windows NT 4.0; ?)*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Opera/7.2* (Windows NT 5.0; ?)*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Opera/7.2* (Windows NT 5.1; ?)*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Opera/7.2* (Windows NT 5.2; ?)*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Opera/7.2* (Windows XP; ?)*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Opera/7.2* (X11; FreeBSD*; ?)*] -Parent=Opera 7.2 -Platform=FreeBSD - -[Opera/7.2* (X11; Linux*; ?)*] -Parent=Opera 7.2 -Platform=Linux - -[Opera/7.2* (X11; SunOS*)*] -Parent=Opera 7.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.5 - -[Opera 7.5] -Parent=DefaultProperties -Browser=Opera -Version=7.5 -MajorVer=7 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.5*] -Parent=Opera 7.5 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Opera/7.5* (Linux*; ?)*] -Parent=Opera 7.5 -Platform=Linux - -[Opera/7.5* (Macintosh; *Mac OS X; ?)*] -Parent=Opera 7.5 -Platform=MacOSX - -[Opera/7.5* (Windows 95; ?)*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Opera/7.5* (Windows 98; ?)*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Opera/7.5* (Windows ME; ?)*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Opera/7.5* (Windows NT 4.0; ?)*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Opera/7.5* (Windows NT 5.0; ?)*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Opera/7.5* (Windows NT 5.1; ?)*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Opera/7.5* (Windows NT 5.2; ?)*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Opera/7.5* (Windows XP; ?)*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Opera/7.5* (X11; FreeBSD*; ?)*] -Parent=Opera 7.5 -Platform=FreeBSD - -[Opera/7.5* (X11; Linux*; ?)*] -Parent=Opera 7.5 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.6 - -[Opera 7.6] -Parent=DefaultProperties -Browser=Opera -Version=7.6 -MajorVer=7 -MinorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.6*] -Parent=Opera 7.6 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Opera/7.6* (Linux*)*] -Parent=Opera 7.6 -Platform=Linux - -[Opera/7.6* (Macintosh; *Mac OS X; ?)*] -Parent=Opera 7.6 -Platform=MacOSX - -[Opera/7.6* (Windows 95*)*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Opera/7.6* (Windows 98*)*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Opera/7.6* (Windows ME*)*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Opera/7.6* (Windows NT 4.0*)*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Opera/7.6* (Windows NT 5.0*)*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Opera/7.6* (Windows NT 5.1*)*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Opera/7.6* (Windows NT 5.2*)*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Opera/7.6* (Windows XP*)*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Opera/7.6* (X11; FreeBSD*)*] -Parent=Opera 7.6 -Platform=FreeBSD - -[Opera/7.6* (X11; Linux*)*] -Parent=Opera 7.6 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.0 - -[Opera 8.0] -Parent=DefaultProperties -Browser=Opera -Version=8.0 -MajorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacOSX - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.0*] -Parent=Opera 8.0 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Opera/8.0* (Linux*)*] -Parent=Opera 8.0 -Platform=Linux - -[Opera/8.0* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.0 -Platform=MacOSX - -[Opera/8.0* (Windows 95*)*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Opera/8.0* (Windows 98*)*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Opera/8.0* (Windows CE*)*] -Parent=Opera 8.0 -Platform=WinCE -Win32=true - -[Opera/8.0* (Windows ME*)*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Opera/8.0* (Windows NT 4.0*)*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Opera/8.0* (Windows NT 5.0*)*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Opera/8.0* (Windows NT 5.1*)*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Opera/8.0* (Windows NT 5.2*)*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Opera/8.0* (Windows XP*)*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Opera/8.0* (X11; FreeBSD*)*] -Parent=Opera 8.0 -Platform=FreeBSD - -[Opera/8.0* (X11; Linux*)*] -Parent=Opera 8.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.1 - -[Opera 8.1] -Parent=DefaultProperties -Browser=Opera -Version=8.1 -MajorVer=8 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.1*] -Parent=Opera 8.1 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.1*] -Parent=Opera 8.1 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.1*] -Parent=Opera 8.1 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Opera/8.1* (Linux*)*] -Parent=Opera 8.1 -Platform=Linux - -[Opera/8.1* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.1 -Platform=MacOSX - -[Opera/8.1* (Windows 95*)*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Opera/8.1* (Windows 98*)*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Opera/8.1* (Windows CE*)*] -Parent=Opera 8.1 -Platform=WinCE -Win32=true - -[Opera/8.1* (Windows ME*)*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Opera/8.1* (Windows NT 4.0*)*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Opera/8.1* (Windows NT 5.0*)*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Opera/8.1* (Windows NT 5.1*)*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Opera/8.1* (Windows NT 5.2*)*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Opera/8.1* (Windows XP*)*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Opera/8.1* (X11; FreeBSD*)*] -Parent=Opera 8.1 -Platform=FreeBSD - -[Opera/8.1* (X11; Linux*)*] -Parent=Opera 8.1 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.5 - -[Opera 8.5] -Parent=DefaultProperties -Browser=Opera -Version=8.5 -MajorVer=8 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X;*) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.5*] -Parent=Opera 8.5 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (Macintosh; PPC Mac OS X;*) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Opera/8.5* (Linux*)*] -Parent=Opera 8.5 -Platform=Linux - -[Opera/8.5* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.5 -Platform=MacOSX - -[Opera/8.5* (Windows 95*)*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Opera/8.5* (Windows 98*)*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Opera/8.5* (Windows CE*)*] -Parent=Opera 8.5 -Platform=WinCE -Win32=true - -[Opera/8.5* (Windows ME*)*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Opera/8.5* (Windows NT 4.0*)*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Opera/8.5* (Windows NT 5.0*)*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Opera/8.5* (Windows NT 5.1*)*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Opera/8.5* (Windows NT 5.2*)*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Opera/8.5* (Windows XP*)*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Opera/8.5* (X11; FreeBSD*)*] -Parent=Opera 8.5 -Platform=FreeBSD - -[Opera/8.5* (X11; Linux*)*] -Parent=Opera 8.5 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.0 - -[Opera 9.0] -Parent=DefaultProperties -Browser=Opera -Version=9.0 -MajorVer=9 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.0*] -Parent=Opera 9.0 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.0*] -Parent=Opera 9.0 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (X11; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Opera/9.0* (Linux*)*] -Parent=Opera 9.0 -Platform=Linux - -[Opera/9.0* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.0 -Platform=MacOSX - -[Opera/9.0* (Windows 95*)*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Opera/9.0* (Windows 98*)*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Opera/9.0* (Windows CE*)*] -Parent=Opera 9.0 -Platform=WinCE -Win32=true - -[Opera/9.0* (Windows ME*)*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Opera/9.0* (Windows NT 4.0*)*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Opera/9.0* (Windows NT 5.0*)*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Opera/9.0* (Windows NT 5.1*)*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Opera/9.0* (Windows NT 5.2*)*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Opera/9.0* (Windows NT 6.0*)*] -Parent=Opera 9.0 -Platform=WinVista -Win32=true - -[Opera/9.0* (Windows XP*)*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Opera/9.0* (X11; FreeBSD*)*] -Parent=Opera 9.0 -Platform=FreeBSD - -[Opera/9.0* (X11; Linux*)*] -Parent=Opera 9.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.1 - -[Opera 9.1] -Parent=DefaultProperties -Browser=Opera -Version=9.1 -MajorVer=9 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.1*] -Parent=Opera 9.1 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.1*] -Parent=Opera 9.1 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Mozilla/* (X11; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (Linux*)*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.1 -Platform=MacOSX - -[Opera/9.1* (Windows 95*)*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Opera/9.1* (Windows 98*)*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Opera/9.1* (Windows CE*)*] -Parent=Opera 9.1 -Platform=WinCE -Win32=true - -[Opera/9.1* (Windows ME*)*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Opera/9.1* (Windows NT 4.0*)*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Opera/9.1* (Windows NT 5.0*)*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Opera/9.1* (Windows NT 5.1*)*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Opera/9.1* (Windows NT 5.2*)*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Opera/9.1* (Windows NT 6.0*)*] -Parent=Opera 9.1 -Platform=WinVista -Win32=true - -[Opera/9.1* (Windows XP*)*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Opera/9.1* (X11; FreeBSD*)*] -Parent=Opera 9.1 -Platform=FreeBSD - -[Opera/9.1* (X11; Linux*)*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (X11; SunOS*)*] -Parent=Opera 9.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.2 - -[Opera 9.2] -Parent=DefaultProperties -Browser=Opera -Version=9.2 -MajorVer=9 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.2*] -Parent=Opera 9.2 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.2*] -Parent=Opera 9.2 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (Linux*)*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.2 -Platform=MacOSX - -[Opera/9.2* (Windows 95*)*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Opera/9.2* (Windows 98*)*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Opera/9.2* (Windows CE*)*] -Parent=Opera 9.2 -Platform=WinCE -Win32=true - -[Opera/9.2* (Windows ME*)*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Opera/9.2* (Windows NT 4.0*)*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Opera/9.2* (Windows NT 5.0*)*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Opera/9.2* (Windows NT 5.1*)*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Opera/9.2* (Windows NT 5.2*)*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Opera/9.2* (Windows NT 6.0*)*] -Parent=Opera 9.2 -Platform=WinVista -Win32=true - -[Opera/9.2* (Windows NT 6.1*)*] -Parent=Opera 9.2 -Platform=Win7 - -[Opera/9.2* (Windows XP*)*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Opera/9.2* (X11; FreeBSD*)*] -Parent=Opera 9.2 -Platform=FreeBSD - -[Opera/9.2* (X11; Linux*)*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (X11; SunOS*)*] -Parent=Opera 9.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.3 - -[Opera 9.3] -Parent=DefaultProperties -Browser=Opera -Version=9.3 -MajorVer=9 -MinorVer=3 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.3*] -Parent=Opera 9.3 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.3*] -Parent=Opera 9.3 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (Linux*)*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.3 -Platform=MacOSX - -[Opera/9.3* (Windows 95*)*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Opera/9.3* (Windows 98*)*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Opera/9.3* (Windows CE*)*] -Parent=Opera 9.3 -Platform=WinCE -Win32=true - -[Opera/9.3* (Windows ME*)*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Opera/9.3* (Windows NT 4.0*)*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Opera/9.3* (Windows NT 5.0*)*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Opera/9.3* (Windows NT 5.1*)*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Opera/9.3* (Windows NT 5.2*)*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Opera/9.3* (Windows NT 6.0*)*] -Parent=Opera 9.3 -Platform=WinVista -Win32=true - -[Opera/9.3* (Windows NT 6.1*)*] -Parent=Opera 9.3 -Platform=Win7 - -[Opera/9.3* (Windows XP*)*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Opera/9.3* (X11; FreeBSD*)*] -Parent=Opera 9.3 -Platform=FreeBSD - -[Opera/9.3* (X11; Linux*)*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (X11; SunOS*)*] -Parent=Opera 9.3 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.4 - -[Opera 9.4] -Parent=DefaultProperties -Browser=Opera -Version=9.4 -MajorVer=9 -MinorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.4*] -Parent=Opera 9.4 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.4*] -Parent=Opera 9.4 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (Linux*)*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.4 -Platform=MacOSX - -[Opera/9.4* (Windows 95*)*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Opera/9.4* (Windows 98*)*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Opera/9.4* (Windows CE*)*] -Parent=Opera 9.4 -Platform=WinCE -Win32=true - -[Opera/9.4* (Windows ME*)*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Opera/9.4* (Windows NT 4.0*)*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Opera/9.4* (Windows NT 5.0*)*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Opera/9.4* (Windows NT 5.1*)*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Opera/9.4* (Windows NT 5.2*)*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Opera/9.4* (Windows NT 6.0*)*] -Parent=Opera 9.4 -Platform=WinVista -Win32=true - -[Opera/9.4* (Windows NT 6.1*)*] -Parent=Opera 9.4 -Platform=Win7 - -[Opera/9.4* (Windows XP*)*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Opera/9.4* (X11; FreeBSD*)*] -Parent=Opera 9.4 -Platform=FreeBSD - -[Opera/9.4* (X11; Linux*)*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (X11; SunOS*)*] -Parent=Opera 9.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.5 - -[Opera 9.5] -Parent=DefaultProperties -Browser=Opera -Version=9.5 -MajorVer=9 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.5*] -Parent=Opera 9.5 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.5*] -Parent=Opera 9.5 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (Linux*)*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.5 -Platform=MacOSX - -[Opera/9.5* (Windows 95*)*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Opera/9.5* (Windows 98*)*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Opera/9.5* (Windows CE*)*] -Parent=Opera 9.5 -Platform=WinCE -Win32=true - -[Opera/9.5* (Windows ME*)*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Opera/9.5* (Windows NT 4.0*)*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Opera/9.5* (Windows NT 5.0*)*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Opera/9.5* (Windows NT 5.1*)*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Opera/9.5* (Windows NT 5.2*)*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Opera/9.5* (Windows NT 6.0*)*] -Parent=Opera 9.5 -Platform=WinVista -Win32=true - -[Opera/9.5* (Windows NT 6.1*)*] -Parent=Opera 9.5 -Platform=Win7 - -[Opera/9.5* (Windows XP*)*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Opera/9.5* (X11; FreeBSD*)*] -Parent=Opera 9.5 -Platform=FreeBSD - -[Opera/9.5* (X11; Linux*)*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (X11; SunOS*)*] -Parent=Opera 9.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.6 - -[Opera 9.6] -Parent=DefaultProperties -Browser=Opera -Version=9.6 -MajorVer=9 -MinorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.6*] -Parent=Opera 9.6 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.6*] -Parent=Opera 9.6 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (Linux*)*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.6 -Platform=MacOSX - -[Opera/9.6* (Windows 95*)*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Opera/9.6* (Windows 98*)*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Opera/9.6* (Windows CE*)*] -Parent=Opera 9.6 -Platform=WinCE -Win32=true - -[Opera/9.6* (Windows ME*)*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Opera/9.6* (Windows NT 4.0*)*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Opera/9.6* (Windows NT 5.0*)*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Opera/9.6* (Windows NT 5.1*)*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Opera/9.6* (Windows NT 5.2*)*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Opera/9.6* (Windows NT 6.0*)*] -Parent=Opera 9.6 -Platform=WinVista -Win32=true - -[Opera/9.6* (Windows NT 6.1*)*] -Parent=Opera 9.6 -Platform=Win7 - -[Opera/9.6* (Windows XP*)*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Opera/9.6* (X11; FreeBSD*)*] -Parent=Opera 9.6 -Platform=FreeBSD - -[Opera/9.6* (X11; Linux*)*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (X11; SunOS*)*] -Parent=Opera 9.6 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.0 - -[Netscape 4.0] -Parent=DefaultProperties -Browser=Netscape -Version=4.0 -MajorVer=4 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0*(Macintosh*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=MacPPC - -[Mozilla/4.0*(Win95;*] -Parent=Netscape 4.0 -Platform=Win95 - -[Mozilla/4.0*(Win98;*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=Win98 - -[Mozilla/4.0*(WinNT*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=WinNT - -[Mozilla/4.0*(X11;*)] -Parent=Netscape 4.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.5 - -[Netscape 4.5] -Parent=DefaultProperties -Browser=Netscape -Version=4.5 -MajorVer=4 -MinorVer=5 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.5*(Macintosh; ?; PPC)] -Parent=Netscape 4.5 -Platform=MacPPC - -[Mozilla/4.5*(Win2000; ?)] -Parent=Netscape 4.5 -Platform=Win2000 - -[Mozilla/4.5*(Win95; ?)] -Parent=Netscape 4.5 -Platform=Win95 - -[Mozilla/4.5*(Win98; ?)] -Parent=Netscape 4.5 -Platform=Win98 - -[Mozilla/4.5*(WinME; ?)] -Parent=Netscape 4.5 -Platform=WinME - -[Mozilla/4.5*(WinNT; ?)] -Parent=Netscape 4.5 -Platform=WinNT - -[Mozilla/4.5*(WinXP; ?)] -Parent=Netscape 4.5 -Platform=WinXP - -[Mozilla/4.5*(X11*)] -Parent=Netscape 4.5 -Platform=Linux - -[Mozilla/4.51*(Macintosh; ?; PPC)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 - -[Mozilla/4.51*(Win2000; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win2000 - -[Mozilla/4.51*(Win95; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win95 - -[Mozilla/4.51*(Win98; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win98 - -[Mozilla/4.51*(WinME; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinME - -[Mozilla/4.51*(WinNT; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinNT - -[Mozilla/4.51*(WinXP; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinXP - -[Mozilla/4.51*(X11*)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.6 - -[Netscape 4.6] -Parent=DefaultProperties -Browser=Netscape -Version=4.6 -MajorVer=4 -MinorVer=6 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.6 * (OS/2; ?)] -Parent=Netscape 4.6 -Platform=OS/2 - -[Mozilla/4.6*(Macintosh; ?; PPC)] -Parent=Netscape 4.6 -Platform=MacPPC - -[Mozilla/4.6*(Win95; ?)] -Parent=Netscape 4.6 -Platform=Win95 - -[Mozilla/4.6*(Win98; ?)] -Parent=Netscape 4.6 -Platform=Win98 - -[Mozilla/4.6*(WinNT; ?)] -Parent=Netscape 4.6 -Platform=WinNT - -[Mozilla/4.61*(Macintosh; ?; PPC)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=MacPPC - -[Mozilla/4.61*(OS/2; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=OS/2 - -[Mozilla/4.61*(Win95; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=Win95 - -[Mozilla/4.61*(Win98; ?)] -Parent=Netscape 4.6 -Version=4.61 -Platform=Win98 - -[Mozilla/4.61*(WinNT; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=WinNT - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.7 - -[Netscape 4.7] -Parent=DefaultProperties -Browser=Netscape -Version=4.7 -MajorVer=4 -MinorVer=7 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.7 * (Win2000; ?)] -Parent=Netscape 4.7 -Platform=Win2000 - -[Mozilla/4.7*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=MacPPC - -[Mozilla/4.7*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win95 - -[Mozilla/4.7*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win98 - -[Mozilla/4.7*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=WinNT -Win32=true - -[Mozilla/4.7*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win2000 -Win32=true - -[Mozilla/4.7*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=WinXP -Win32=true - -[Mozilla/4.7*(WinNT; ?)*] -Parent=Netscape 4.7 -Platform=WinNT - -[Mozilla/4.7*(X11*)*] -Parent=Netscape 4.7 -Platform=Linux - -[Mozilla/4.7*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Platform=SunOS - -[Mozilla/4.71*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=MacPPC - -[Mozilla/4.71*(Win95; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win95 - -[Mozilla/4.71*(Win98; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win98 - -[Mozilla/4.71*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinNT -Win32=true - -[Mozilla/4.71*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win2000 -Win32=true - -[Mozilla/4.71*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinXP -Win32=true - -[Mozilla/4.71*(WinNT; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinNT - -[Mozilla/4.71*(X11*)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Linux - -[Mozilla/4.71*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=SunOS - -[Mozilla/4.72*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=MacPPC - -[Mozilla/4.72*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win95 - -[Mozilla/4.72*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win98 - -[Mozilla/4.72*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinNT -Win32=true - -[Mozilla/4.72*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win2000 -Win32=true - -[Mozilla/4.72*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinXP -Win32=true - -[Mozilla/4.72*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinNT - -[Mozilla/4.72*(X11*)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Linux - -[Mozilla/4.72*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=SunOS - -[Mozilla/4.73*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=MacPPC - -[Mozilla/4.73*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win95 - -[Mozilla/4.73*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win98 - -[Mozilla/4.73*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinNT -Win32=true - -[Mozilla/4.73*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win2000 -Win32=true - -[Mozilla/4.73*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinXP -Win32=true - -[Mozilla/4.73*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinNT - -[Mozilla/4.73*(X11*)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Linux - -[Mozilla/4.73*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=SunOS - -[Mozilla/4.74*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=MacPPC - -[Mozilla/4.74*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win95 - -[Mozilla/4.74*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win98 - -[Mozilla/4.74*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinNT -Win32=true - -[Mozilla/4.74*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win2000 -Win32=true - -[Mozilla/4.74*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinXP -Win32=true - -[Mozilla/4.74*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinNT - -[Mozilla/4.74*(X11*)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Linux - -[Mozilla/4.74*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=SunOS - -[Mozilla/4.75*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=MacPPC - -[Mozilla/4.75*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win95 - -[Mozilla/4.75*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win98 - -[Mozilla/4.75*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinNT -Win32=true - -[Mozilla/4.75*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win2000 -Win32=true - -[Mozilla/4.75*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinXP -Win32=true - -[Mozilla/4.75*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinNT - -[Mozilla/4.75*(X11*)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Linux - -[Mozilla/4.75*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=SunOS - -[Mozilla/4.76*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=MacPPC - -[Mozilla/4.76*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win95 - -[Mozilla/4.76*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win98 - -[Mozilla/4.76*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinNT -Win32=true - -[Mozilla/4.76*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win2000 -Win32=true - -[Mozilla/4.76*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinXP -Win32=true - -[Mozilla/4.76*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinNT - -[Mozilla/4.76*(X11*)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Linux - -[Mozilla/4.76*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=SunOS - -[Mozilla/4.77*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=MacPPC - -[Mozilla/4.77*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win95 - -[Mozilla/4.77*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win98 - -[Mozilla/4.77*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinNT -Win32=true - -[Mozilla/4.77*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win2000 -Win32=true - -[Mozilla/4.77*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinXP -Win32=true - -[Mozilla/4.77*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinNT - -[Mozilla/4.77*(X11*)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Linux - -[Mozilla/4.77*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=SunOS - -[Mozilla/4.78*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=MacPPC - -[Mozilla/4.78*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win95 - -[Mozilla/4.78*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win98 - -[Mozilla/4.78*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinNT -Win32=true - -[Mozilla/4.78*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win2000 -Win32=true - -[Mozilla/4.78*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinXP -Win32=true - -[Mozilla/4.78*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinNT - -[Mozilla/4.78*(X11*)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Linux - -[Mozilla/4.78*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=SunOS - -[Mozilla/4.79*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=MacPPC - -[Mozilla/4.79*(Win95; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win95 - -[Mozilla/4.79*(Win98; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win98 - -[Mozilla/4.79*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinNT -Win32=true - -[Mozilla/4.79*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win2000 -Win32=true - -[Mozilla/4.79*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinXP -Win32=true - -[Mozilla/4.79*(WinNT; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinNT - -[Mozilla/4.79*(X11*)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Linux - -[Mozilla/4.79*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.8 - -[Netscape 4.8] -Parent=DefaultProperties -Browser=Netscape -Version=4.8 -MajorVer=4 -MinorVer=8 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.8*(Macintosh; ?; MacPPC)*] -Parent=Netscape 4.8 -Platform=MacPPC - -[Mozilla/4.8*(Macintosh; ?; PPC Mac OS X*] -Parent=Netscape 4.8 -Platform=MacOSX - -[Mozilla/4.8*(Macintosh; ?; PPC)*] -Parent=Netscape 4.8 -Platform=MacPPC - -[Mozilla/4.8*(Win95; *)*] -Parent=Netscape 4.8 - -[Mozilla/4.8*(Win98; *)*] -Parent=Netscape 4.8 -Platform=Win98 - -[Mozilla/4.8*(Windows NT 4.0; *)*] -Parent=Netscape 4.8 -Platform=WinNT -Win32=true - -[Mozilla/4.8*(Windows NT 5.0; *)*] -Parent=Netscape 4.8 -Platform=Win2000 -Win32=true - -[Mozilla/4.8*(Windows NT 5.1; *)*] -Parent=Netscape 4.8 -Platform=WinXP -Win32=true - -[Mozilla/4.8*(WinNT; *)*] -Parent=Netscape 4.8 -Platform=WinNT - -[Mozilla/4.8*(X11; *)*] -Parent=Netscape 4.8 -Platform=Linux - -[Mozilla/4.8*(X11; *SunOS*)*] -Parent=Netscape 4.8 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.0 - -[Netscape 6.0] -Parent=DefaultProperties -Browser=Netscape -Version=6.0 -MajorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.1 - -[Netscape 6.1] -Parent=DefaultProperties -Browser=Netscape -Version=6.1 -MajorVer=6 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.2 - -[Netscape 6.2] -Parent=DefaultProperties -Browser=Netscape -Version=6.2 -MajorVer=6 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.0 - -[Netscape 7.0] -Parent=DefaultProperties -Browser=Netscape -Version=7.0 -MajorVer=7 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win*9x 4.90; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.1 - -[Netscape 7.1] -Parent=DefaultProperties -Browser=Netscape -Version=7.1 -MajorVer=7 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/7.1] -Parent=Netscape 7.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.2 - -[Netscape 7.2] -Parent=DefaultProperties -Browser=Netscape -Version=7.2 -MajorVer=7 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 8.0 - -[Netscape 8.0] -Parent=DefaultProperties -Browser=Netscape -Version=8.0 -MajorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 8.1 - -[Netscape 8.1] -Parent=DefaultProperties -Browser=Netscape -Version=8.1 -MajorVer=8 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.0 - -[SeaMonkey 1.0] -Parent=DefaultProperties -Browser=SeaMonkey -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.8*) Gecko/20060221 SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.1 - -[SeaMonkey 1.1] -Parent=DefaultProperties -Browser=SeaMonkey -Version=1.1 -MajorVer=1 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.8*) Gecko/20060221 SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 2.0 - -[SeaMonkey 2.0] -Parent=DefaultProperties -Browser=SeaMonkey -Version=2.0 -MajorVer=2 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.9*) Gecko/20060221 SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Flock 1.0 - -[Flock 1.0] -Parent=DefaultProperties -Browser=Flock -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; U; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinME - -[Mozilla/5.0 (Windows; U; Windows NT 5.0*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; U; Windows NT 5.1*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Flock 2.0 - -[Flock 2.0] -Parent=DefaultProperties -Browser=Flock -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; U; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinME - -[Mozilla/5.0 (Windows; U; Windows NT 5.0*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; U; Windows NT 5.1*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sleipnir 2.0 - -[Sleipnir] -Parent=DefaultProperties -Browser=Sleipnir -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.0*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.1*) Sleipnir/2.*] -Parent=Sleipnir -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.2*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 6.0*) Sleipnir/2.*] -Parent=Sleipnir -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 6.1*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win7 - -[Sleipnir*] -Parent=Sleipnir - -[Sleipnir/2.*] -Parent=Sleipnir - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fennec 1.0 - -[Fennec 1.0] -Parent=DefaultProperties -Browser=Firefox Mobile -Version=1.0 -MajorVer=1 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firebird - -[Firebird] -Parent=DefaultProperties -Browser=Firebird -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Linux; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird Browser/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; IRIX*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox - -[Firefox] -Parent=DefaultProperties -Browser=Firefox -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (OS/2; *; Warp*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (Windows NT 5.?; ?; rv:1.*) Gecko/* Firefox] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.*; *; rv:1.*) Gecko/* Deer Park/Alpha*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firefox/10.5] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; FreeBSD*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; HP-UX*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; Linux*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.0 - -[Firefox 1.0] -Parent=DefaultProperties -Browser=Firefox -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=MacPPC - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; *Linux*; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; DragonFly*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.4 - -[Firefox 1.4] -Parent=DefaultProperties -Browser=Firefox -Version=1.4 -MajorVer=1 -MinorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.5 - -[Firefox 1.5] -Parent=DefaultProperties -Browser=Firefox -Version=1.5 -MajorVer=1 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=OS/2 - -[Mozilla/5.0 (rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2 x64; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 2.0 - -[Firefox 2.0] -Parent=DefaultProperties -Browser=Firefox -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.0 - -[Firefox 3.0] -Parent=DefaultProperties -Browser=Firefox -Version=3.0 -MajorVer=3 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.1 - -[Firefox 3.1] -Parent=DefaultProperties -Browser=Firefox -Version=3.1 -MajorVer=3 -MinorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.5 - -[Firefox 3.5] -Parent=DefaultProperties -Browser=Firefox -Version=3.5 -MajorVer=3 -MinorVer=5 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Phoenix - -[Phoenix] -Parent=DefaultProperties -Browser=Phoenix -Version=0.5 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iceweasel - -[Iceweasel] -Parent=DefaultProperties -Browser=Iceweasel -Platform=Linux -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.8*) Gecko/* Iceweasel/2.0* (Debian-*)] -Parent=Iceweasel -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.0 - -[Mozilla 1.0] -Parent=DefaultProperties -Browser=Mozilla -Version=1.0 -MajorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.0.*) Gecko/*] -Parent=Mozilla 1.0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.1 - -[Mozilla 1.1] -Parent=DefaultProperties -Browser=Mozilla -Version=1.1 -MajorVer=1 -MinorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.1.*) Gecko/*] -Parent=Mozilla 1.1 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.2 - -[Mozilla 1.2] -Parent=DefaultProperties -Browser=Mozilla -Version=1.2 -MajorVer=1 -MinorVer=2 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.2.*) Gecko/*] -Parent=Mozilla 1.2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.3 - -[Mozilla 1.3] -Parent=DefaultProperties -Browser=Mozilla -Version=1.3 -MajorVer=1 -MinorVer=3 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.3.*) Gecko/*] -Parent=Mozilla 1.3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.4 - -[Mozilla 1.4] -Parent=DefaultProperties -Browser=Mozilla -Version=1.4 -MajorVer=1 -MinorVer=4 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.5 - -[Mozilla 1.5] -Parent=DefaultProperties -Browser=Mozilla -Version=1.5 -MajorVer=1 -MinorVer=5 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.6 - -[Mozilla 1.6] -Parent=DefaultProperties -Browser=Mozilla -Version=1.6 -MajorVer=1 -MinorVer=6 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.7 - -[Mozilla 1.7] -Parent=DefaultProperties -Browser=Mozilla -Version=1.7 -MajorVer=1 -MinorVer=7 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (*rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.8 - -[Mozilla 1.8] -Parent=DefaultProperties -Browser=Mozilla -Version=1.8 -MajorVer=1 -MinorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (*rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.9 - -[Mozilla 1.9] -Parent=DefaultProperties -Browser=Mozilla -Version=1.9 -MajorVer=1 -MinorVer=9 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE Mac - -[IE Mac] -Parent=DefaultProperties -Browser=IE -Platform=MacPPC -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/?.? (compatible; MSIE 4.0*; *Mac_PowerPC*] -Parent=IE Mac -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Mozilla/?.? (compatible; MSIE 4.5*; *Mac_PowerPC*] -Parent=IE Mac -Version=4.5 -MajorVer=4 -MinorVer=5 - -[Mozilla/?.? (compatible; MSIE 5.0*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.0 -MajorVer=5 -MinorVer=0 - -[Mozilla/?.? (compatible; MSIE 5.1*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/?.? (compatible; MSIE 5.2*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.2 -MajorVer=5 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 5.5 - -[AOL 9.0/IE 5.5] -Parent=DefaultProperties -Browser=AOL -Version=5.5 -MajorVer=5 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 5.5; *AOL 9.0*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 6.0 - -[AOL 9.0/IE 6.0] -Parent=DefaultProperties -Browser=AOL -Version=6.0 -MajorVer=6 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 6.0; *AOL 9.0*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 7.0 - -[AOL 9.0/IE 7.0] -Parent=DefaultProperties -Browser=AOL -Version=7.0 -MajorVer=7 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 - -[Mozilla/?.* (?compatible; *MSIE 7.0; *AOL 9.0*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Avant Browser - -[Avant Browser] -Parent=DefaultProperties -Browser=Avant Browser -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Advanced Browser (http://www.avantbrowser.com)] -Parent=Avant Browser - -[Avant Browser*] -Parent=Avant Browser - -[Avant Browser/*] -Parent=Avant Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 4.01 - -[IE 4.01] -Parent=DefaultProperties -Browser=IE -Version=4.01 -MajorVer=4 -MinorVer=01 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 4.01*)*] -Parent=IE 4.01 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 95*)*] -Parent=IE 4.01 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 98*)*] -Parent=IE 4.01 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 4.01 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 4.0*)*] -Parent=IE 4.01 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.0*)*] -Parent=IE 4.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.01*)*] -Parent=IE 4.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 4.01; Windows NT)] -Parent=IE 4.01 -Platform=WinNT - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.0 - -[IE 5.0] -Parent=DefaultProperties -Browser=IE -Version=5.0 -MajorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 5.0*)*] -Parent=IE 5.0 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 95*)*] -Parent=IE 5.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98*)*] -Parent=IE 5.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 5.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 4.0*)*] -Parent=IE 5.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.0*)*] -Parent=IE 5.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.01*)*] -Parent=IE 5.0 -Platform=Win2000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.01 - -[IE 5.01] -Parent=DefaultProperties -Browser=IE -Version=5.01 -MajorVer=5 -MinorVer=01 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 5.01*)*] -Parent=IE 5.01 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 95*)*] -Parent=IE 5.01 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98*)*] -Parent=IE 5.01 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 5.01 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 4.0*)*] -Parent=IE 5.01 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.0*)*] -Parent=IE 5.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.01*)*] -Parent=IE 5.01 -Platform=Win2000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.5 - -[IE 5.5] -Parent=DefaultProperties -Browser=IE -Version=5.5 -MajorVer=5 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 5.5*)*] -Parent=IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 95*)*] -Parent=IE 5.5 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98*)*] -Parent=IE 5.5 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98; Win 9x 4.90*)*] -Parent=IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 4.0*)*] -Parent=IE 5.5 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.0*)*] -Parent=IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.01*)*] -Parent=IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.1*)*] -Parent=IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.2*)*] -Parent=IE 5.5 -Platform=Win2003 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 6.0 - -[IE 6.0] -Parent=DefaultProperties -Browser=IE -Version=6.0 -MajorVer=6 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -w3cdomversion=1.0 -msdomversion=6.0 - -[Mozilla/?.* (?compatible; *MSIE 6.0*)*] -Parent=IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 95*)*] -Parent=IE 6.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98*)*] -Parent=IE 6.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98; Win 9x 4.90*)*] -Parent=IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 4.0*)*] -Parent=IE 6.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.0*)*] -Parent=IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.01*)*] -Parent=IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.1*)*] -Parent=IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2*)*] -Parent=IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*Win64;*)*] -Parent=IE 6.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*WOW64;*)*] -Parent=IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 6.0*)*] -Parent=IE 6.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 7.0 - -[IE 7.0] -Parent=DefaultProperties -Browser=IE -Version=7.0 -MajorVer=7 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -msdomversion=7.0 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 7.0*)*] -Parent=IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98*)*] -Parent=IE 7.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 4.0*)*] -Parent=IE 7.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.0*)*] -Parent=IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.01*)*] -Parent=IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.1*)*] -Parent=IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2*)*] -Parent=IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*Win64;*)*] -Parent=IE 7.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*WOW64;*)*] -Parent=IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.0*)*] -Parent=IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.1*)*] -Parent=IE 7.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; *)*] -Parent=IE 7.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 8.0 - -[IE 8.0] -Parent=DefaultProperties -Browser=IE -Version=8.0 -MajorVer=8 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=3 -supportsCSS=true -ecmascriptversion=1.2 -msdomversion=8.0 -w3cdomversion=1.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Win32*)*] -Parent=IE 8.0 -Platform=Win32 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0*)*] -Parent=IE 8.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1*)*] -Parent=IE 8.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2*)*] -Parent=IE 8.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Win64; x64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista -Win64=false - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1*)*] -Parent=IE 8.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 -Win64=false - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 7.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Default Browser - -[*] -Browser=Default Browser -Version=0 -MajorVer=0 -MinorVer=0 -Platform=unknown -Alpha=false -Beta=false -Win16=false -Win32=false -Win64=false -Frames=true -IFrames=false -Tables=true -Cookies=false -BackgroundSounds=false -CDF=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -Stripper=false -isBanned=false -isMobileDevice=false -isSyndicationReader=false -Crawler=false -CssVersion=0 -supportsCSS=false -AOL=false -aolVersion=0 -AuthenticodeUpdate=0 -CSS=0 -WAP=false -netCLR=false -ClrVersion=0 -ECMAScriptVersion=0.0 -W3CDOMVersion=0.0 diff --git a/Source/Platforms/Android/Binaries/Mono/etc/mono/config b/Source/Platforms/Android/Binaries/Mono/etc/mono/config deleted file mode 100644 index 5c4639c28..000000000 --- a/Source/Platforms/Android/Binaries/Mono/etc/mono/config +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Android/Binaries/Mono/lib/libMonoPosixHelper.so b/Source/Platforms/Android/Binaries/Mono/lib/libMonoPosixHelper.so deleted file mode 100644 index c444674c8..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/libMonoPosixHelper.so +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14889e284d5ffe63eba3c744b707f0c836b156ecb67b313a7c6dca954ebc06a7 -size 806936 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/libmono-btls-shared.so b/Source/Platforms/Android/Binaries/Mono/lib/libmono-btls-shared.so deleted file mode 100644 index edf0c449e..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/libmono-btls-shared.so +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7767e4adb93486de5152a7179f425f7ababa464007ed380ed3b4e891d035b903 -size 4960968 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/libmono-native.so b/Source/Platforms/Android/Binaries/Mono/lib/libmono-native.so deleted file mode 100644 index 858860130..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/libmono-native.so +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:008e99a0694a42b1775b599a4824eccc38e13d3c44ad5e6fa3ed82e0677f4a09 -size 82720 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/I18N.CJK.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/I18N.CJK.dll deleted file mode 100644 index aee6e88c4..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/I18N.CJK.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:094b524b08ba818ae3668df5cab90eb5e8e9a2126e1d1addec0ae4c6757d6262 -size 680448 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/I18N.MidEast.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/I18N.MidEast.dll deleted file mode 100644 index e6fbe078e..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/I18N.MidEast.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc7bb18bb492bf136fa0694a738aedc6385680847d8130fbbc75f2c957ba50a9 -size 32256 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/I18N.Other.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/I18N.Other.dll deleted file mode 100644 index b853e093b..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/I18N.Other.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:430377b69b3ad190da12e0cf6b9be5308817ea00d13c761957aa0d5be69d9990 -size 36352 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/I18N.Rare.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/I18N.Rare.dll deleted file mode 100644 index 221d48414..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/I18N.Rare.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb09bd812e0c35c34a2bebc54ab6b3d5a148f8552cc76889b8cf17194061b461 -size 192000 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/I18N.West.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/I18N.West.dll deleted file mode 100644 index 2712b78a2..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/I18N.West.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d45f598314a87aa7136af6e5a1065e0fae14645ff530fecd3eafb84f4749dfe -size 72192 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/I18N.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/I18N.dll deleted file mode 100644 index 4fa8fdc55..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/I18N.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2201c923dff48f0e13560b389085abeee1e3667d791c7061c92e4dcc71bb1261 -size 39424 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Microsoft.CSharp.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Microsoft.CSharp.dll deleted file mode 100644 index 0e7738ac4..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Microsoft.CSharp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:765c0195b1888d8033f4e2754d7776569fdc685d550dae874576b2bafe333ac5 -size 300544 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.Btls.Interface.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.Btls.Interface.dll deleted file mode 100644 index 6773ee910..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.Btls.Interface.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a1c9aea16b99d4939c64f634ee304c1dc5ccbd2a658cc505b6a1e63016f506a -size 22528 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.CSharp.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.CSharp.dll deleted file mode 100644 index 7045bd7c4..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.CSharp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76e18cdcc9fdd29c9863395119fdcdd44c57d73873e6429cf83d7c58dcdd55dd -size 1353216 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.CompilerServices.SymbolWriter.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.CompilerServices.SymbolWriter.dll deleted file mode 100644 index 88ca9a1e0..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.CompilerServices.SymbolWriter.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22f2c6ceca24720a92bf3138fd6c46ed46576b447d33db0566ced5bc45da32cd -size 43520 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.Data.Sqlite.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.Data.Sqlite.dll deleted file mode 100644 index eab84868f..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.Data.Sqlite.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:536a4a8ead1d2f72ce6783439925f2f67933f3eb38715de0964570ba578502c6 -size 166400 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.Data.Tds.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.Data.Tds.dll deleted file mode 100644 index 430b0f3e8..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.Data.Tds.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31b880abdb1a6da8902267b0a896a4b12a421167b5e7831b1087c3bb5dec1242 -size 100352 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.Posix.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.Posix.dll deleted file mode 100644 index 28c651123..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.Posix.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78e50778305a389427fc7fbaa656d47933a135c32b8c3b116edbebe486251c25 -size 213504 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.Security.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.Security.dll deleted file mode 100644 index 5dcb4a1df..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/Mono.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c145ecf5246a22440cef3261d94a65e710f21a64a25e7b5ee82ce39a985f2dd6 -size 314880 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.ComponentModel.Composition.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.ComponentModel.Composition.dll deleted file mode 100644 index 08a91251a..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.ComponentModel.Composition.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:92b5754853695ef9eb42e6b2cad52586447be43e6a397b7a27feb89a8f676839 -size 258560 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.ComponentModel.DataAnnotations.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.ComponentModel.DataAnnotations.dll deleted file mode 100644 index 69e7ec155..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.ComponentModel.DataAnnotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:43f9925046ae96439d4da16847096514da66056fabf314e40706f0ab83efb8e8 -size 84992 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Core.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Core.dll deleted file mode 100644 index 3bdc2e0d9..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a033471e9de025db856dfa38a39450840f86494582438089b237d1ae151827b8 -size 1036288 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Data.Services.Client.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Data.Services.Client.dll deleted file mode 100644 index d7eabf8fb..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Data.Services.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:86a6ac6258bbaee0a071b1808f290ff671342bf5bf4794bd95af3aa5a529d668 -size 418816 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Data.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Data.dll deleted file mode 100644 index 2ee487b8d..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1026c16ae364da2fffa707f3dae567cbbcbf21cb0dd88c689cacc1140e22cf4d -size 1945600 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.IO.Compression.FileSystem.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.IO.Compression.FileSystem.dll deleted file mode 100644 index 9a88f139d..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.IO.Compression.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ee9fceeee6a27f9f2964cb2f43529657c511999df80d16353b336c2ae7aaa33 -size 18432 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.IO.Compression.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.IO.Compression.dll deleted file mode 100644 index 9a9e072bf..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.IO.Compression.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b65bd3c600cde44e85e5e5b50c436dcc7a0d96f087702f2a0a353beb53e1828 -size 99840 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.IdentityModel.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.IdentityModel.dll deleted file mode 100644 index cd19e18e1..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.IdentityModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5084c75dd0afe653cb00c5d4c1b9e47d2d617e617f067b4a6bd049c9831d4ab0 -size 14336 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Json.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Json.dll deleted file mode 100644 index 599a6f7ff..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a706ef86b75ad3d9d1f7fe3d5dd20eb7a799eb3273c21251ce342a565045db1b -size 32768 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Net.Http.WinHttpHandler.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Net.Http.WinHttpHandler.dll deleted file mode 100644 index 5a36cc19f..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Net.Http.WinHttpHandler.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c61d1460d5a803496be11cd5fe56b9e7fa79ad4e2f92ed67023b26747a9219d -size 16384 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Net.Http.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Net.Http.dll deleted file mode 100644 index 342539715..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Net.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5baf341380934b59d72b291f1a365dc715081cdb58119e318ca4a712fb74e041 -size 116736 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Net.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Net.dll deleted file mode 100644 index 61e1e6253..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Net.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a7f66dc102d6f5fff5f993c253bf32f568c31732ed8586e15b54c58e97dac7b1 -size 14336 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Numerics.Vectors.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Numerics.Vectors.dll deleted file mode 100644 index 3777aa860..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Numerics.Vectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:567d0dcc5aea718564a6186be99a6ae5303d588453d7e208539e7924e432bb7b -size 12288 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Numerics.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Numerics.dll deleted file mode 100644 index 0a3330797..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0299df1fbc091a0fe63636d67be998ce25fd750f5fa8a43281dc7ef10cdc286 -size 119296 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Reflection.Context.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Reflection.Context.dll deleted file mode 100644 index 90bd71749..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Reflection.Context.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ebc46a924530e81fb8cfff45dc44ab8aa76708e8e49b5837b6c6146b3bfc77bd -size 13312 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Runtime.CompilerServices.Unsafe.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Runtime.CompilerServices.Unsafe.dll deleted file mode 100644 index ff2ca1efc..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Runtime.CompilerServices.Unsafe.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee25b36d2ff502ffe106b0e09da74a7cc78fc22754ac30a7ce138c35107e8fe0 -size 4096 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Runtime.Serialization.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Runtime.Serialization.dll deleted file mode 100644 index 089ee773e..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Runtime.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c59dab51c697a9808732bba661090df501de050425d32ee61b341205a695a027 -size 861696 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Security.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Security.dll deleted file mode 100644 index 953d34a84..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db3082ec4c67cb912028d1d356f265fe824ae7733209358d3387935254595af1 -size 143360 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.ServiceModel.Internals.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.ServiceModel.Internals.dll deleted file mode 100644 index cb1bd9b4c..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.ServiceModel.Internals.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e2f992c8864e7bc047377bea720f9747922bee7e08bb72024dac155b04beb25 -size 218624 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.ServiceModel.Web.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.ServiceModel.Web.dll deleted file mode 100644 index ec0a2d903..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.ServiceModel.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3fa268fafff157ca3ba49e38efce3458ea2f6b09e7c0458af95013bcaf1a49a -size 57856 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.ServiceModel.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.ServiceModel.dll deleted file mode 100644 index cdead5ecf..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.ServiceModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8fa17b24e6bed62e28b9883aeefeb6f016935fe1f799c66074ea9e705181b3f4 -size 402432 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Transactions.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Transactions.dll deleted file mode 100644 index 523b79376..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Transactions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ecea31e68a3df8150a7a40f4cc9e98b495aee2a1fc14d47a753c929e0e26a99c -size 32256 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Web.Services.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Web.Services.dll deleted file mode 100644 index a1ead1710..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Web.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb1ffbc25bf7c9efe370d2b7170d1fc491558f475b09152dddaba4db8e544a65 -size 214016 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Windows.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Windows.dll deleted file mode 100644 index a276e2e47..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Windows.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b342116e1df9d772e373b6e5878e9f03c982e2b63fbfd5cdbd75816af77e518 -size 11776 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Xml.Linq.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Xml.Linq.dll deleted file mode 100644 index 6a8162ea5..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Xml.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0754c2b07be2ec7d8f499005d2a9a8692a06c80442a63a358584f1b95a9fc42 -size 137728 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Xml.Serialization.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Xml.Serialization.dll deleted file mode 100644 index 582e21a42..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Xml.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:382a09261987d5f9897a3fc45b60f4c7c44da8d4e9fda74cd225ded1a372aac3 -size 11776 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Xml.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Xml.dll deleted file mode 100644 index 823d80e56..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e707bddd6b5e10cbed940c52082cef70667a98663df5a8db1b6fb6ccb5075163 -size 2442752 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.dll deleted file mode 100644 index b4b273512..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/System.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:83c1d5b0f3873b15b05922d06a275ff5bba57d8cd0c32f5140abb24fb0497a7d -size 1911296 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/mscorlib.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/mscorlib.dll deleted file mode 100644 index 18b420bc6..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/mscorlib.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af05591d44a5ff7f496b035525ea8ce8df4164e8484bcfd08246714737e8f63a -size 4378112 diff --git a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/nunitlite.dll b/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/nunitlite.dll deleted file mode 100644 index 418c012a7..000000000 --- a/Source/Platforms/Android/Binaries/Mono/lib/mono/2.1/nunitlite.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02780ab5a2569a881e4df73c187d39fa35b0db21b6227350d0741c5306348962 -size 213504 diff --git a/Source/Platforms/Android/Binaries/Project/app/src/main/java/com/flaxengine/GameActivity.java b/Source/Platforms/Android/Binaries/Project/app/src/main/java/com/flaxengine/GameActivity.java index 9332b36f7..2a7fc8631 100644 --- a/Source/Platforms/Android/Binaries/Project/app/src/main/java/com/flaxengine/GameActivity.java +++ b/Source/Platforms/Android/Binaries/Project/app/src/main/java/com/flaxengine/GameActivity.java @@ -1,4 +1,4 @@ -// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved. +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. package com.flaxengine; @@ -188,7 +188,7 @@ public class GameActivity extends NativeActivity { return new String(buffer, encoding); } - void extractMonoFiles() throws IOException + void extractDotnetFiles() throws IOException { String filesDir = getFilesDir().getAbsolutePath(); AssetManager am = getAssets(); @@ -196,13 +196,13 @@ public class GameActivity extends NativeActivity { // Skip if extracted has is the same as in the package String hashFile = "hash.txt"; - File monoHashFile = new File(filesDir + "/" + hashFile); - if (monoHashFile.exists()) { + File currentHashFile = new File(filesDir + "/" + hashFile); + if (currentHashFile.exists()) { for (int i = 0; i < amRootFiles.length; i++) { if (amRootFiles[i].equals(hashFile)) { - String monoHash = readFileText(new FileInputStream(monoHashFile), StandardCharsets.US_ASCII); + String currentHash = readFileText(new FileInputStream(currentHashFile), StandardCharsets.US_ASCII); String hash = readFileText(am.open(hashFile), StandardCharsets.US_ASCII); - if (monoHash.equals(hash)) { + if (currentHash.equals(hash)) { return; } break; @@ -211,9 +211,9 @@ public class GameActivity extends NativeActivity { } // Extract files - Log.i("Flax", "Extracting Mono files"); - new File(filesDir + "/Mono").mkdir(); - copyAssetDir(am, "Mono", filesDir + "/Mono"); + Log.i("Flax", "Extracting Dotnet files"); + new File(filesDir + "/Dotnet").mkdir(); + copyAssetDir(am, "Dotnet", filesDir + "/Dotnet"); for (int i = 0; i < amRootFiles.length; i++) { String fromFile = amRootFiles[i]; if (!fromFile.endsWith(".dll") && !fromFile.equals(hashFile)) @@ -239,9 +239,9 @@ public class GameActivity extends NativeActivity { protected void onCreate(Bundle instance) { _activity = this; - // Extract Mono files and other bundled C# libraries from APK (Mono uses unix file access API which doesn't work with AAssetManager API) + // Extract Dotnet files and other bundled C# libraries from APK (Mono uses unix file access API which doesn't work with AAssetManager API) try { - extractMonoFiles(); + extractDotnetFiles(); } catch (Exception e) { Log.i("Flax", "Error", e); } diff --git a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXCharacterKinematic_static.a b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXCharacterKinematic_static.a deleted file mode 100644 index 5ee88ade3..000000000 --- a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXCharacterKinematic_static.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb0b758d0e51d14ecdd18b2c55c801a7a729da06aa116c729602c7bbdc564bb9 -size 2656678 diff --git a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXCharacterKinematic_static_64.a b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXCharacterKinematic_static_64.a new file mode 100644 index 000000000..884943f02 --- /dev/null +++ b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXCharacterKinematic_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c07afaaa62724f7f8f532a1bc65a5fc50753e266495248a608d9f4b9476aa0b +size 2025020 diff --git a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXCommon_static.a b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXCommon_static.a deleted file mode 100644 index f4f65287e..000000000 --- a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXCommon_static.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:299ece94b714429fcb541599927daec994919fbb87bcee4345f1f1a6b43ba548 -size 48900330 diff --git a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXCommon_static_64.a b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXCommon_static_64.a new file mode 100644 index 000000000..59899248c --- /dev/null +++ b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXCommon_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9817730bdeae1cfeb5207470d721b27f448cdd36b9eba85da73dec59e8a5bf99 +size 52205712 diff --git a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXCooking_static.a b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXCooking_static.a deleted file mode 100644 index d34e0c5e5..000000000 --- a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXCooking_static.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:067245b08a742cc488503300a78c7c7c2975b5b13d2a072b041480dc6d9eb55c -size 3900056 diff --git a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXCooking_static_64.a b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXCooking_static_64.a new file mode 100644 index 000000000..37e24dc4c --- /dev/null +++ b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXCooking_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:524ded53592c687bc834c9db24c6ccfa8449f3392ec3fd99627c87cf7f069368 +size 111200 diff --git a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXExtensions_static.a b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXExtensions_static.a deleted file mode 100644 index 02c14d19e..000000000 --- a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXExtensions_static.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e4b27fec3205418a57f118dab8afe86a7cc4427c9a14298fc0579ed38bb8aa5 -size 25755118 diff --git a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXExtensions_static_64.a b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXExtensions_static_64.a new file mode 100644 index 000000000..b13b12074 --- /dev/null +++ b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXExtensions_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:759aa0379faa5f010c66654e46d352f24c1f837507ffa0178022546540f4ca0f +size 31683652 diff --git a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXFoundation_static.a b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXFoundation_static.a deleted file mode 100644 index bb19eabdd..000000000 --- a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXFoundation_static.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bad24dff285b711e7fd8bfa79fac21e7536158e02a5c995e8f970bd359ffc3dd -size 755994 diff --git a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXFoundation_static_64.a b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXFoundation_static_64.a new file mode 100644 index 000000000..19216936b --- /dev/null +++ b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXFoundation_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6738a094c3dbe50a5820c83944b3992211bd3e372b1ccfbd2f3acb0541c04d2b +size 570452 diff --git a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXPvdSDK_static.a b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXPvdSDK_static.a deleted file mode 100644 index 56c1149b2..000000000 --- a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXPvdSDK_static.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e44058be0cd48106fee815ac2e472ad1f6897725464d7ae49eff61a954891a4 -size 4188330 diff --git a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXPvdSDK_static_64.a b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXPvdSDK_static_64.a new file mode 100644 index 000000000..e681dfc1b --- /dev/null +++ b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXPvdSDK_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7369e2822a705f592c67942c0ba354694b857fa9d83db6bed4dc0dcf3a4875f0 +size 3405028 diff --git a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXVehicle2_static_64.a b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXVehicle2_static_64.a new file mode 100644 index 000000000..edb89c6a0 --- /dev/null +++ b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXVehicle2_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7bbb5ba66f5e47ee53fd099c805e94d66f47cb66c44ec2339f06b66ea89c6100 +size 1543576 diff --git a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXVehicle_static.a b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXVehicle_static.a deleted file mode 100644 index 67e626f3f..000000000 --- a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXVehicle_static.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c3b2ffb1343ff8246833c364010bea8f496b6965b0aa66ccc53edb771022df27 -size 13785474 diff --git a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXVehicle_static_64.a b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXVehicle_static_64.a new file mode 100644 index 000000000..815ea1e4a --- /dev/null +++ b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysXVehicle_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4eff2cf32d6bfed5f32d26b5478ec4e1eda31d3959e71f79fa6e205905b1e67c +size 12277380 diff --git a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysX_static.a b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysX_static.a deleted file mode 100644 index e9ed78ee0..000000000 --- a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysX_static.a +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f391f69d9692ca06710d489089da7a00978028918af1e7c4e8c5d9239a03a423 -size 97447380 diff --git a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysX_static_64.a b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysX_static_64.a new file mode 100644 index 000000000..a37ba9028 --- /dev/null +++ b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libPhysX_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee3f4e2cc3160b7556dd8678c49f27160d401fbef729c81568dbc184b07fbab5 +size 37483230 diff --git a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libmonosgen-2.0.so b/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libmonosgen-2.0.so deleted file mode 100644 index ef7e6e412..000000000 --- a/Source/Platforms/Android/Binaries/ThirdParty/ARM64/libmonosgen-2.0.so +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:13ba5704dfa7a837614866f261d9f53bc718f25fb2f5713a96b32fa2f56753db -size 15519200 diff --git a/Source/Platforms/DotNet/AOT/Newtonsoft.Json.dll b/Source/Platforms/DotNet/AOT/Newtonsoft.Json.dll new file mode 100644 index 000000000..ef2f325da --- /dev/null +++ b/Source/Platforms/DotNet/AOT/Newtonsoft.Json.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e045d6ae2a72b9b6e8922fa37537f7f14fdc9d5ced502e48a5b4ab5064a2458 +size 540672 diff --git a/Source/Platforms/DotNet/Microsoft.CodeAnalysis.CSharp.dll b/Source/Platforms/DotNet/Microsoft.CodeAnalysis.CSharp.dll new file mode 100644 index 000000000..9e8e2f00e --- /dev/null +++ b/Source/Platforms/DotNet/Microsoft.CodeAnalysis.CSharp.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15f25e79e0bcc65c885d430f059e0dedd9ce6a323e050b9ec9da67bb33bcda33 +size 6145664 diff --git a/Source/Platforms/DotNet/Microsoft.CodeAnalysis.CSharp.xml b/Source/Platforms/DotNet/Microsoft.CodeAnalysis.CSharp.xml new file mode 100644 index 000000000..49a5cb41a --- /dev/null +++ b/Source/Platforms/DotNet/Microsoft.CodeAnalysis.CSharp.xml @@ -0,0 +1,44241 @@ + + + + Microsoft.CodeAnalysis.CSharp + + + + + A Binder converts names in to symbols and syntax nodes into bound trees. It is context + dependent, relative to a location in source code. + + + This portion of the binder converts a AnonymousObjectCreationExpressionSyntax into + a bound anonymous object creation node + + + This portion of the binder converts an AwaitExpressionSyntax into a BoundExpression + + + This portion of the binder converts deconstruction-assignment syntax (AssignmentExpressionSyntax nodes with the left + being a tuple expression or declaration expression) into a BoundDeconstructionAssignmentOperator (or bad node). + The BoundDeconstructionAssignmentOperator will have: + - a BoundTupleLiteral as its Left, + - a BoundConversion as its Right, holding: + - a tree of Conversion objects with Kind=Deconstruction, information about a Deconstruct method (optional) and + an array of nested Conversions (like a tuple conversion), + - a BoundExpression as its Operand. + + + This portion of the binder converts an into a . + + + This portion of the binder converts an into a . + + + This portion of the binder converts a QueryExpressionSyntax into a BoundExpression + + + This portion of the binder reports errors arising from resolving queries. + + + This portion of the binder converts StatementSyntax nodes into BoundStatements + + + This portion of the binder converts a into a . + + + + + Used to create a root binder. + + + + + Get the next binder in which to look up a name, if not found by this binder. + + + + + Get the next binder in which to look up a name, if not found by this binder, asserting if `Next` is null. + + + + + if we are in an explicitly checked context (within checked block or expression). + if we are in an explicitly unchecked context (within unchecked block or expression). + otherwise. + + + + + True if instructions that check overflow should be generated. + + + Spec 7.5.12: + For non-constant expressions (expressions that are evaluated at run-time) that are not + enclosed by any checked or unchecked operators or statements, the default overflow checking + context is unchecked unless external factors (such as compiler switches and execution + environment configuration) call for checked evaluation. + + + + + True if the compiler should check for overflow while evaluating constant expressions. + + + Spec 7.5.12: + For constant expressions (expressions that can be fully evaluated at compile-time), + the default overflow checking context is always checked. Unless a constant expression + is explicitly placed in an unchecked context, overflows that occur during the compile-time + evaluation of the expression always cause compile-time errors. + + + + + Some nodes have special binders for their contents (like Blocks) + + + + + Gets a binder for a node that must be not null, and asserts + if it is not. + + + + + Get locals declared immediately in scope designated by the node. + + + + + Get local functions declared immediately in scope designated by the node. + + + + + If this binder owns a scope for locals, return syntax node that is used + as the scope designator. Otherwise, null. + + + + + True if this is the top-level binder for a local function or lambda + (including implicit lambdas from query expressions). + + + + + The member containing the binding context. Note that for the purposes of the compiler, + a lambda expression is considered a "member" of its enclosing method, field, or lambda. + + + + + Are we in a context where un-annotated types should be interpreted as non-null? + + + + + Is the contained code within a member method body? + + + May be false in lambdas that are outside of member method bodies, e.g. lambdas in + field initializers. + + + + + Is the contained code within an iterator block? + + + Will be false in a lambda in an iterator. + + + + + Is the contained code within the syntactic span of an + iterator method? + + + Will be true in a lambda in an iterator. + + + + + If we are inside a context where a break statement is legal, + returns the that a break statement would branch to. + Returns null otherwise. + + + + + If we are inside a context where a continue statement is legal, + returns the that a continue statement would branch to. + Returns null otherwise. + + + + + Get the element type of this iterator. + + Element type of the current iterator, or an error type. + + + + The imports for all containing namespace declarations (innermost-to-outermost, including global), + or null if there are none. + + + + + Get that can be used to quickly + check for certain attribute applications in context of this binder. + + + + + The type containing the binding context + + + + + Returns true if the binder is binding top-level script code. + + + + + Issue an error or warning for a symbol if it is Obsolete. If there is not enough + information to report diagnostics, then store the symbols so that diagnostics + can be reported at a later stage. + + + This method is introduced to move the implicit conversion operator call from the caller + so as to reduce the caller stack frame size + + + + + Issue an error or warning for a symbol if it is Obsolete. If there is not enough + information to report diagnostics, then store the symbols so that diagnostics + can be reported at a later stage. + + + + + Report diagnostics that should be reported when using a synthesized attribute. + + + + + Should only be used with scopes that could declare local functions. + + + + + Outside of checked, unchecked expression/block. + + + + + Within unchecked expression/block. + + + + + Within checked expression/block. + + + + + We represent the set of query variables in scope at a particular point by a RangeVariableMap. + Each query variable in scope has a key in this map. If the corresponding value is empty, then + that query variable is represented directly by a lambda parameter. If it is non-empty, then + to get the value of that query variable one starts with the first parameter of the current + lambda (the first parameter is always the transparent one), and dot through its members using + the names in the value list, in reverse order. So, for example, if the query variable "x" has + a value in this map of ["Item2", "Item1", "Item1"], then the way to compute the value of that + query variable is starting with the current lambda's first parameter P, compute "P.Item1.Item1.Item2". + See also WithQueryLambdaParametersBinder. + + + + + The destination in a method arguments must match (MAMM) check. This is + created primarily for ref and out arguments of a ref struct. It also applies + to function pointer this and arglist arguments. + + + + + In the case this is the argument for a ref / out parameter this will refer + to the corresponding parameter. This will be null in cases like arguments + passed to an arglist. + + + + + This destination can only be written to by arguments that have an equal or + wider escape level. An destination that is + can never be written to by an argument that has a level of . + + + + + Represents an argument being analyzed for escape analysis purposes. This represents the + argument as written. For example a `ref x` will only be represented by a single + . + + + + + This will be null in cases like arglist or a function pointer receiver. + + + + + Represents a value being analyzed for escape analysis purposes. This represents the value + as it contributes to escape analysis which means arguments can show up multiple times. For + example `ref x` will be represented as both a val and ref escape. + + + + + This will be null in cases like arglist or a function pointer receiver. + + + + + This is _only_ useful when calculating MAMM as it dictates to what level the value + escaped to. That allows it to be filtered against the parameters it could possibly + write to. + + + + + For the purpose of escape verification we operate with the depth of local scopes. + The depth is a uint, with smaller number representing shallower/wider scopes. + 0, 1 and 2 are special scopes - + 0 is the "calling method" scope that is outside of the containing method/lambda. + If something can escape to scope 0, it can escape to any scope in a given method through a ref parameter or return. + 1 is the "return-only" scope that is outside of the containing method/lambda. + If something can escape to scope 1, it can escape to any scope in a given method or can be returned, but it can't escape through a ref parameter. + 2 is the "current method" scope that is just inside the containing method/lambda. + If something can escape to scope 1, it can escape to any scope in a given method, but cannot be returned. + n + 1 corresponds to scopes immediately inside a scope of depth n. + Since sibling scopes do not intersect and a value cannot escape from one to another without + escaping to a wider scope, we can use simple depth numbering without ambiguity. + + + + + Expression capabilities and requirements. + + + + + Expression can be an RHS of an assignment operation. + + + The following are rvalues: values, variables, null literals, properties + and indexers with getters, events. + + The following are not rvalues: + namespaces, types, method groups, anonymous functions. + + + + + Expression can be the LHS of a simple assignment operation. + Example: + property with a setter + + + + + Expression represents a location. Often referred as a "variable" + Examples: + local variable, parameter, field + + + + + Expression can be the LHS of a ref-assign operation. + Example: + ref local, ref parameter, out parameter, ref field + + + + + Expression is the RHS of an assignment operation + and may be a method group. + Basically an RValue, but could be treated differently for the purpose of error reporting + + + + + Expression can be an LHS of a compound assignment + operation (such as +=). + + + + + Expression can be the operand of an increment or decrement operation. + Same as CompoundAssignment, the distinction is really just for error reporting. + + + + + Expression is a r/o reference. + + + + + Expression can be the operand of an address-of operation (&). + Same as ReadonlyRef. The difference is just for error reporting. + + + + + Expression is the receiver of a fixed buffer field access + Same as ReadonlyRef. The difference is just for error reporting. + + + + + Expression is passed as a ref or out parameter or assigned to a byref variable. + + + + + Expression is returned by an ordinary r/w reference. + Same as RefOrOut. The difference is just for error reporting. + + + + + Check the expression is of the required lvalue and rvalue specified by valueKind. + The method returns the original expression if the expression is of the required + type. Otherwise, an appropriate error is added to the diagnostics bag and the + method returns a BoundBadExpression node. The method returns the original + expression without generating any error if the expression has errors. + + + + + The purpose of this method is to determine if the expression satisfies desired capabilities. + If it is not then this code gives an appropriate error message. + + To determine the appropriate error message we need to know two things: + + (1) What capabilities we need - increment it, assign, return as a readonly reference, . . . ? + + (2) Are we trying to determine if the left hand side of a dot is a variable in order + to determine if the field or property on the right hand side of a dot is assignable? + + (3) The syntax of the expression that started the analysis. (for error reporting purposes). + + + + + SPEC: When a property or indexer declared in a struct-type is the target of an + SPEC: assignment, the instance expression associated with the property or indexer + SPEC: access must be classified as a variable. If the instance expression is + SPEC: classified as a value, a compile-time error occurs. Because of 7.6.4, + SPEC: the same rule also applies to fields. + + + NOTE: The spec fails to impose the restriction that the event receiver must be classified + as a variable (unlike for properties - 7.17.1). This seems like a bug, but we have + production code that won't build with the restriction in place (see DevDiv #15674). + + + + + Computes the scope to which the given invocation can escape + NOTE: the escape scope for ref and val escapes is the same for invocations except for trivial cases (ordinary type returned by val) + where escape is known otherwise. Therefore we do not have two ref/val variants of this. + + NOTE: we need scopeOfTheContainingExpression as some expressions such as optional in parameters or ref dynamic behave as + local variables declared at the scope of the invocation. + + + + + Validates whether given invocation can allow its results to escape from level to level. + The result indicates whether the escape is possible. + Additionally, the method emits diagnostics (possibly more than one, recursively) that would help identify the cause for the failure. + + NOTE: we need scopeOfTheContainingExpression as some expressions such as optional in parameters or ref dynamic behave as + local variables declared at the scope of the invocation. + + + + + Returns the set of arguments to be considered for escape analysis of a method invocation. + Each argument is returned with the correponding parameter and ref kind. Arguments are not + filtered - all arguments are included exactly once in the array, and the caller is responsible for + determining which arguments affect escape analysis. This method is used for method invocation + analysis, regardless of whether UseUpdatedEscapeRules is set. + + + + + Returns the set of arguments to be considered for escape analysis of a method + invocation. Each argument is returned with the correponding parameter and + whether analysis should consider value or ref escape. Not all method arguments + are included, and some arguments may be included twice - once for value, once for ref. + + + + + Returns the set of to an invocation that impact ref analysis. + This will filter out everything that could never meaningfully contribute to ref analysis. For + example: + - For ref arguments it will return an for both ref and + value escape (if appropriate based on scoped-ness of associated parameters). + - It will remove value escape for args which correspond to scoped parameters. + - It will remove value escape for non-ref struct. + - It will remove ref escape for args which correspond to scoped refs. + Optionally this will also return all of the that + result from this invocation. That is useful for MAMM analysis. + + + + + Validates whether the invocation is valid per no-mixing rules. + Returns when it is not valid and produces diagnostics (possibly more than one recursively) that helps to figure the reason. + + + + + Checks whether given expression can escape from the current scope to the + In a case if it cannot a bad expression is returned and diagnostics is produced. + + + + + Computes the widest scope depth to which the given expression can escape by reference. + + NOTE: in a case if expression cannot be passed by an alias (RValue and similar), the ref-escape is scopeOfTheContainingExpression + There are few cases where RValues are permitted to be passed by reference which implies that a temporary local proxy is passed instead. + We reflect such behavior by constraining the escape value to the narrowest scope possible. + + + + + A counterpart to the GetRefEscape, which validates if given escape demand can be met by the expression. + The result indicates whether the escape is possible. + Additionally, the method emits diagnostics (possibly more than one, recursively) that would help identify the cause for the failure. + + + + + Computes the widest scope depth to which the given expression can escape by value. + + NOTE: unless the type of expression is ref-like, the result is Binder.ExternalScope since ordinary values can always be returned from methods. + + + + + A counterpart to the GetValEscape, which validates if given escape demand can be met by the expression. + The result indicates whether the escape is possible. + Additionally, the method emits diagnostics (possibly more than one, recursively) that would help identify the cause for the failure. + + + + + Checks if expression directly or indirectly represents a value with its own home. In + such cases it is possible to get a reference without loading into a temporary. + + + + + Special HasHome for fields. + Fields have readable homes when they are not constants. + Fields have writeable homes unless they are readonly and used outside of the constructor. + + + + + Actually, defines if an error ERR_AnonymousTypeNotAvailable is to be generated; + + Dev10 rules (which are based on BindingContext::InMethod()) are difficult to + reproduce, so this implementation checks both current symbol as well as syntax nodes. + + + + + Returns the type to be used as a field type; generates errors in case the type is not + supported for anonymous type fields. + + + + + The caller is responsible for freeing and . + + + + + Gets the rewritten attribute constructor arguments, i.e. the arguments + are in the order of parameters, which may differ from the source + if named constructor arguments are used. + + For example: + void Goo(int x, int y, int z, int w = 3); + + Goo(0, z: 2, y: 1); + + Arguments returned: 0, 1, 2, 3 + + Rewritten attribute constructor arguments + + CONSIDER: Can we share some code will call rewriting in the local rewriter? + + + + + Walk a custom attribute argument bound node and return a TypedConstant. Verify that the expression is a constant expression. + + + + + Return true iff an await with this subexpression would be legal where the expression appears. + + + + + Assuming we are in an async method, return true if we're in a context where await would be illegal. + Specifically, return true if we're in a lock or catch filter. + + + + + Reports an error if the await expression did not occur in an async context. + + True if the expression contains errors. + + + + Report diagnostics if the await expression occurs in a context where it is not allowed. + + True if errors were found. + + + + Finds and validates the required members of an awaitable expression, as described in spec 7.7.7.1. + + True if the expression is awaitable; false otherwise. + + + + Validates the awaited expression, returning true if no errors are found. + + + + + Finds the GetAwaiter method of an awaitable expression. + + + Spec 7.7.7.1: + An awaitable expression t has an accessible instance or extension method called GetAwaiter with no + parameters and no type parameters, and a return type A that meets the additional requirements for an + Awaiter. + NOTE: this is an error in the spec. An extension method of the form + Awaiter<T> GetAwaiter<T>(this Task<T>) may be used. + + + + + Finds the IsCompleted property of an Awaiter type. + + + Spec 7.7.7.1: + An Awaiter A has an accessible, readable instance property IsCompleted of type bool. + + + + + Checks that the Awaiter implements System.Runtime.CompilerServices.INotifyCompletion. + + + Spec 7.7.7.1: + An Awaiter A implements the interface System.Runtime.CompilerServices.INotifyCompletion. + + + + + Finds the GetResult method of an Awaiter type. + + + Spec 7.7.7.1: + An Awaiter A has an accessible instance method GetResult with no parameters and no type parameters. + + + + + Return a collection of bound constraint clauses indexed by type parameter + ordinal. All constraint clauses are bound, even if there are multiple constraints + for the same type parameter, or constraints for unrecognized type parameters. + Extra constraints are not included in the returned collection however. + + + + + Bind and return a single type parameter constraint clause along with syntax nodes corresponding to type constraints. + + + + + Constraints are checked for invalid types, duplicate types, and accessibility. + + + + + Returns true if the constraint is valid. Otherwise + returns false and generates a diagnostic. + + + + + Rewrite the subexpressions in a conditional expression to convert the whole thing to the destination type. + + + + + Rewrite the expressions in the switch expression arms to add a conversion to the destination type. + + + + + This method implements the algorithm in spec section 7.6.5.1. + + For method group conversions, there are situations in which the conversion is + considered to exist ("Otherwise the algorithm produces a single best method M having + the same number of parameters as D and the conversion is considered to exist"), but + application of the conversion fails. These are the "final validation" steps of + overload resolution. + + + True if there is any error, except lack of runtime support errors. + + + + + Performs the following checks: + + Spec 7.6.5: Invocation expressions (definition of Final Validation) + The method is validated in the context of the method group: If the best method is a static method, + the method group must have resulted from a simple-name or a member-access through a type. If the best + method is an instance method, the method group must have resulted from a simple-name, a member-access + through a variable or value, or a base-access. If neither of these requirements is true, a binding-time + error occurs. + (Note that the spec omits to mention, in the case of an instance method invoked through a simple name, that + the invocation must appear within the body of an instance method) + + Spec 7.5.4: Compile-time checking of dynamic overload resolution + If F is a static method, the method group must have resulted from a simple-name, a member-access through a type, + or a member-access whose receiver can't be classified as a type or value until after overload resolution (see §7.6.4.1). + If F is an instance method, the method group must have resulted from a simple-name, a member-access through a variable or value, + or a member-access whose receiver can't be classified as a type or value until after overload resolution (see §7.6.4.1). + + + True if there is any error. + + + + + Was the receiver expression compiler-generated? + + + + + This method implements the checks in spec section 15.2. + + + + + This method combines final validation (section 7.6.5.1) and delegate compatibility (section 15.2). + + CSharpSyntaxNode of the expression requiring method group conversion. + Conversion to be performed. + Optional receiver. + Method invoked as extension method. + Target delegate type. + Where diagnostics should be added. + True if a diagnostic has been added. + + + + This method is a wrapper around MethodGroupConversionHasErrors. As a preliminary step, + it checks whether a conversion exists. + + + + + We can't use BindNamespaceOrTypeSymbol, since it doesn't return inaccessible symbols (directly). + + + Guaranteed not to return null. + + CONSIDER: As in dev11, we don't handle ambiguity at this level. Hypothetically, + we could just pick one, though an "ideal" solution would probably involve a search + down all ambiguous branches. + + + + + Perform lookup (optionally, in a specified container). If nothing is found and the member name matches the containing type + name, then use the instance constructors of the type instead. The resulting symbols are sorted since tie-breaking is based + on order and we want cref binding to be repeatable. + + + Never returns null. + + + + + Given a list of viable lookup results (based on the name, arity, and containing symbol), + attempt to select one. + + + + + At this point, we have a list of viable symbols and no parameter list with which to perform + overload resolution. We'll just return the first symbol, giving a diagnostic if there are + others. + Caveat: If there are multiple candidates and only one is from source, then the source symbol + wins and no diagnostic is reported. + + + + + Replace any named type in the symbol list with its instance constructors. + Construct all candidates with the implicitly-declared CrefTypeParameterSymbols. + + + + + Given a list of method and/or property candidates, choose the first one (if any) with a signature + that matches the parameter list in the cref. Return null if there isn't one. + + + Produces a diagnostic for ambiguous matches, but not for unresolved members - WRN_BadXMLRef is + handled in BindMemberCref. + + + + + If the member is generic, construct it with the CrefTypeParameterSymbols that should be in scope. + + + + + Keep in sync with CSharpSemanticModel.GetSpeculativelyBoundExpressionWithoutNullability. + + + + + Bind a deconstruction assignment. + + The deconstruction operation + The left (tuple) operand + The right (deconstructable) operand + Where to report diagnostics + A variable set to the first variable declaration found in the left + A variable set to the first expression in the left that isn't a declaration or discard + The expression evaluator needs to bind deconstructions (both assignments and declarations) as expression-statements + and still access the returned value + + + + + When boundRHS is a tuple literal, fix it up by inferring its types. + + + + Recursively builds a Conversion object with Kind=Deconstruction including information about any necessary + Deconstruct method and any element-wise conversion. + + Note that the variables may either be plain or nested variables. + The variables may be updated with inferred types if they didn't have types initially. + Returns false if there was an error. + + + + + Inform the variables about found types. + + + + + Find any deconstruction locals that are still pending inference and fail their inference. + Set the safe-to-escape scope for all deconstruction locals. + + + + + Holds the variables on the LHS of a deconstruction as a tree of bound expressions. + + + + + For cases where the RHS of a deconstruction-declaration is a tuple literal, we merge type information from both the LHS and RHS. + For cases where the RHS of a deconstruction-assignment is a tuple literal, the type information from the LHS determines the merged type, since all variables have a type. + Returns null if a merged tuple type could not be fabricated. + + + + Extract inferred name from a single deconstruction variable. + + + + Find the Deconstruct method for the expression on the right, that will fit the number of assignable variables on the left. + Returns an invocation expression if the Deconstruct method is found. + If so, it outputs placeholders that were coerced to the output types of the resolved Deconstruct method. + The overload resolution is similar to writing receiver.Deconstruct(out var x1, out var x2, ...). + + + + + Prepares locals (or fields in global statement) and lvalue expressions corresponding to the variables of the declaration. + The locals/fields/lvalues are kept in a tree which captures the nesting of variables. + Each local or field is either a simple local or field access (when its type is known) or a deconstruction variable pending inference. + The caller is responsible for releasing the nested ArrayBuilders. + + + + + In embedded statements, returns a BoundLocal when the type was explicit. + In global statements, returns a BoundFieldAccess when the type was explicit. + Otherwise returns a DeconstructionVariablePendingInference when the type is implicit. + + + + + Determines whether "this" reference is available within the current context. + + The reference was explicitly specified in syntax. + True if "this" is not available due to the current method/property/field initializer being static. + True if a reference to "this" is available. + + + + Returns true if the node is in a position where an unbound type + such as (C<,>) is allowed. + + + + + Generates a new with no known type + + + + + Generates a new with no known type, and the given bound child. + + + + + Generates a new with no known type, and the given bound children. + + + + + Generates a new with no known type, given lookup resultKind. + + + + + Generates a new with no known type, given lookup resultKind and the given bound child. + + + + + Generates a new with no known type, given lookupResultKind and given symbols for GetSemanticInfo API. + + + + + Generates a new with no known type, given lookupResultKind and given symbols for GetSemanticInfo API, + and the given bound child. + + + + + Generates a new with no known type, given lookupResultKind and given symbols for GetSemanticInfo API, + and the given bound children. + + + + + Helper method to generate a bound expression with HasErrors set to true. + Returned bound expression is guaranteed to have a non-null type, except when is an unbound lambda. + If already has errors and meets the above type requirements, then it is returned unchanged. + Otherwise, if is a BoundBadExpression, then it is updated with the and non-null type. + Otherwise, a new wrapping is returned. + + + Returned expression need not be a , but is guaranteed to have HasErrors set to true. + + + + + Bind the expression and verify the expression matches the combination of lvalue and + rvalue requirements given by valueKind. If the expression was bound successfully, but + did not meet the requirements, the return value will be a that + (typically) wraps the subexpression. + + + + + When binding a switch case's expression, it is possible that it resolves to a type (technically, a type pattern). + This implementation permits either an rvalue or a BoundTypeExpression. + + + + + Bind an rvalue expression to its natural type. For example, a switch expression that has not been + converted to another type has to be converted to its own natural type by applying a conversion to + that type to each of the arms of the switch expression. This method is a bottleneck for ensuring + that such a conversion occurs when needed. It also handles tuple expressions which need to be + converted to their own natural type because they may contain switch expressions. + + + + + Bind a declaration variable where it isn't permitted. The caller is expected to produce a diagnostic. + + + + + Removes duplicate entries in and frees it if only nulls remain. + + + + + This can be reached for the qualified name on the right-hand-side of an `is` operator. + For compatibility we parse it as a qualified name, as the is-type expression only permitted + a type on the right-hand-side in C# 6. But the same syntax now, in C# 7 and later, can + refer to a constant, which would normally be represented as a *simple member access expression*. + Since the parser cannot distinguish, it parses it as before and depends on the binder + to handle a qualified name appearing as an expression. + + + + Called when an "attribute-dependent" type such as 'dynamic', 'string?', etc. is not permitted. + + + true if managed type-related errors were found, otherwise false. + + + true if managed type-related errors were found, otherwise false. + + + + Binds a simple identifier. + + + + + Is this is an _ identifier in a context where discards are allowed? + + + + + This implements the casting behavior described in section 6.2.3 of the spec: + + - If the nullable conversion is from S to T?, the conversion is evaluated as the underlying conversion + from S to T followed by a wrapping from T to T?. + + This particular check is done in the binder because it involves conversion processing rules (like overflow + checking and constant folding) which are not handled by Conversions. + + + + + Gets the NameSyntax associated with the syntax node + If no syntax is attached it sets the nameString to plain text + name and returns a null NameSyntax + + Syntax node + Plain text name + + + + Gets the plain text name associated with the expression syntax node + + Expression syntax node + Plain text name + + + + Returns true if a bad special by ref local was found. + + + + + Bind argument and verify argument matches rvalue or out param requirements. + + + + + This method walks through the array's InitializerExpressionSyntax and binds all the initializer expressions recursively. + NOTE: It doesn't convert the bound initializer expressions to array's element type. + NOTE: This is done separately in ConvertAndBindArrayInitialization method below. + + Initializer Syntax. + Bound expression builder. + Diagnostics. + Current array dimension being processed. + Rank of the array type. + + + + Given an array of bound initializer expressions, this method converts these bound expressions + to array's element type and generates a BoundArrayInitialization with the converted initializers. + + Diagnostics. + Initializer Syntax. + Array type. + Known array bounds. + Current array dimension being processed. + Array of bound initializer expressions. + + Index into the array of bound initializer expressions to fetch the next bound expression. + + + + + + Bind the (implicit or explicit) constructor initializer of a constructor symbol (in source). + + + Null for implicit, + , or + for explicit. + Constructor containing the initializer. + Accumulates errors (e.g. unable to find constructor to invoke). + A bound expression for the constructor initializer call. + + This method should be kept consistent with Compiler.BindConstructorInitializer (e.g. same error codes). + + + + + Helper method to create a synthesized constructor invocation. + + + + Shouldn't be null if is not null. + + + + Given the type containing constructors, gets the list of candidate instance constructors and uses overload resolution to determine which one should be called. + + The containing type of the constructors. + The already bound arguments to the constructor. + The name to use in diagnostics if overload resolution fails. + The location at which to report overload resolution result diagnostics. + True to suppress overload resolution result diagnostics (but not argument diagnostics). + Where diagnostics will be reported. + If this method returns true, then it will contain a valid MethodResolutionResult. + Otherwise, it may contain a MethodResolutionResult for an inaccessible constructor (in which case, it will incorrectly indicate success) or nothing at all. + Candidate instance constructors of type used for overload resolution. + It is always legal to access a protected base class constructor + via a constructor initializer, but not from an object creation expression. + True if overload resolution successfully chose an accessible constructor. + + The two-pass algorithm (accessible constructors, then all constructors) is the reason for the unusual signature + of this method (i.e. not populating a pre-existing ). + Presently, rationalizing this behavior is not worthwhile. + + + + + Binds a member access expression + + + + + Attempt to bind the LHS of a member access expression. If this is a Color Color case (spec 7.6.4.1), + then return a BoundExpression if we can easily disambiguate or a BoundTypeOrValueExpression if we + cannot. If this is not a Color Color case, then return null. + + + + + Bind the RHS of a member access expression, given the bound LHS. + It is assumed that CheckValue has not been called on the LHS. + + + If new checks are added to this method, they will also need to be added to . + + + + + Create a value from the expression that can be used as a left-hand-side + of a member access. This method special-cases method and property + groups only. All other expressions are returned as is. + + + + + Report the error from member access lookup. Or, if there + was no explicit error from lookup, report "no such member". + + + + + Return true if the given type is or implements a WinRTAsyncInterface. + + + + + Return a BoundExpression representing the invalid member. + + + + + Combine the receiver and arguments of an extension method + invocation into a single argument list to allow overload resolution + to treat the invocation as a static method invocation with no receiver. + + + + + Binds a static or instance member access. + + + + + Given a viable LookupResult, report any ambiguity errors and return either a single + non-method symbol or a method or property group. If the result set represents a + collection of methods or a collection of properties where at least one of the properties + is an indexed property, then 'methodOrPropertyGroup' is populated with the method or + property group and the method returns null. Otherwise, the method returns a single + symbol and 'methodOrPropertyGroup' is empty. (Since the result set is viable, there + must be at least one symbol.) If the result set is ambiguous - either containing multiple + members of different member types, or multiple properties but no indexed properties - + then a diagnostic is reported for the ambiguity and a single symbol is returned. + + + + + Finds pattern-based implicit indexer and Length/Count property. + + + + + Perform lookup and overload resolution on methods defined directly on the class and any + extension methods in scope. Lookup will occur for extension methods in all nested scopes + as necessary until an appropriate method is found. If analyzedArguments is null, the first + method group is returned, without overload resolution being performed. That method group + will either be the methods defined on the receiver class directly (no extension methods) + or the first set of extension methods. + + The node associated with the method group + The arguments of the invocation (or the delegate type, if a method group conversion) + True if it is a method group conversion + + + If a method group conversion, the desired ref kind of the delegate + If a method group conversion, the desired return type of the delegate. + May be null during inference if the return type of the delegate needs to be computed. + + + + Returns one of the methods from the method group if all methods in the method group + have the same signature, ignoring parameter names and custom modifiers. The particular + method returned is not important since the caller is interested in the signature only. + + + + + Represents a small change from the enclosing/next binder. + Can specify a BindingLocation and a ContainingMemberOrLambda. + + + + + Represents a small change from the enclosing/next binder. + Can specify a receiver Expression for containing conditional member access. + + + + + It seems to be common to do both of these things at once, so provide a way to do so + without adding two links to the binder chain. + + + + + In regular C#, all field initializers are assignments to fields and the assigned expressions + may not reference instance members. + + + + + In script C#, some field initializers are assignments to fields and others are global + statements. There are no restrictions on accessing instance members. + + + + + Helper method to create a synthesized method invocation expression. + + Syntax Node. + Receiver for the method call. + Method to be invoked on the receiver. + Arguments to the method call. + Diagnostics. + Optional type arguments syntax. + Optional type arguments. + The syntax for the query clause generating this invocation expression, if any. + True to allow invocation of fields and properties of delegate type. Only methods are allowed otherwise. + False to prevent selecting a params method in unexpanded form. + Synthesized method invocation expression. + + + + Bind an expression as a method invocation. + + + + + Bind an expression as a method invocation. + + + + + Perform overload resolution on the method group or expression (BoundMethodGroup) + and arguments and return a BoundExpression representing the invocation. + + Invocation syntax node. + The syntax for the invoked method, including receiver. + Name of the invoked method. + Overload resolution result for method group executed by caller. + Arguments bound by the caller. + Method group if the invocation represents a potentially overloaded member. + Delegate type if method group represents a delegate. + Diagnostics. + The syntax for the query clause generating this invocation expression, if any. + BoundCall or error expression representing the invocation. + + + + Returns false if an implicit 'this' copy will occur due to an instance member invocation in a readonly member. + + + + Invocation syntax node. + The syntax for the invoked method, including receiver. + + + + Replace a BoundTypeOrValueExpression with a BoundExpression for either a type (if useType is true) + or a value (if useType is false). Any other node is bound to its natural type. + + + Call this once overload resolution has succeeded on the method group of which the BoundTypeOrValueExpression + is the receiver. Generally, useType will be true if the chosen method is static and false otherwise. + + + + + Return the delegate type if this expression represents a delegate. + + + + + Compute the type of the corresponding parameter, if any. This is used to improve error recovery, + for bad invocations, not for semantic analysis of correct invocations, so it is a heuristic. + If no parameter appears to correspond to the given argument, we return null. + + The analyzed argument list + The index of the argument + The parameter list to match against + The type of the corresponding parameter. + + + + Absent parameter types to bind the arguments, we simply use the arguments provided for error recovery. + + + + + Returns true if syntax form is OK (so no errors were reported) + + + + + Helper method that checks whether there is an invocable 'nameof' in scope. + + + + + Performs name lookup for simple generic or non-generic name + within an optional qualifier namespace or type symbol. + If LookupOption.AttributeTypeOnly is set, then it performs + attribute type lookup which involves attribute name lookup + with and without "Attribute" suffix. + + + + + Look for any symbols in scope with the given name and arity. + + + Makes a second attempt if the results are not viable, in order to produce more detailed failure information (symbols and diagnostics). + + + + + If qualifierOpt is null, look for any symbols in + scope with the given name and arity. + Otherwise look for symbols that are members of the specified qualifierOpt. + + + + + Look for symbols that are members of the specified namespace or type. + + + + + Lookup a member name in a submission chain. + + + We start with the current submission class and walk the submission chain back to the first submission. + The search has two phases + 1) We are looking for any symbol matching the given name, arity, and options. If we don't find any the search is over. + If we find and overloadable symbol(s) (a method or an indexer) we start looking for overloads of this kind + (lookingForOverloadsOfKind) of symbol in phase 2. + 2) If a visited submission contains a matching member of a kind different from lookingForOverloadsOfKind we stop + looking further. Otherwise, if we find viable overload(s) we add them into the result. + + Note that indexers are not supported in script but we deal with them here to handle errors. + + + + + Lookup extension methods by name and arity in the given binder and + check viability in this binder. The lookup is performed on a single + binder because extension method search stops at the first applicable + method group from the nearest enclosing namespace. + + + + + Lookup attribute name in the given binder. By default two name lookups are performed: + (1) With the provided name + (2) With an Attribute suffix added to the provided name + Lookup with Attribute suffix is performed only if LookupOptions.VerbatimAttributeName is not set. + + If either lookup is ambiguous, we return the corresponding result with ambiguous symbols. + Else if exactly one result is single viable attribute type, we return that result. + Otherwise, we return a non-viable result with LookupResult.NotAnAttributeType or an empty result. + + + + + Return the extension methods from this specific binding scope that match the name and optional + arity. Since the lookup of extension methods is iterative, proceeding one binding scope at a time, + GetCandidateExtensionMethods should not defer to the next binding scope. Instead, the caller is + responsible for walking the nested binding scopes from innermost to outermost. This method is overridden + to search the available members list in binding types that represent types, namespaces, and usings. + + + + + If the type implements one of a select few WinRT interfaces, the interface type is + projected to the CLR collection type (e.g., IVector to IList). + When importing a winmd type it may implement one or more winmd collection + interfaces. When the collection interfaces are projected, we may need + to add the projected members to the imported type so that calls to those + members succeed as normal. This method adds the interface methods to + the lookup, if necessary. The CLR understands that a call to the .NET interface + should be projected onto the WinRT interface method. + + + + + This helper is used to determine whether this symbol hides / is hidden + based on its signature, as opposed to its name. + + + CONSIDER: It might be nice to generalize this - maybe an extension method + on Symbol (e.g. IsOverloadable or HidesByName). + + + + + Distinguish from , which performs an analogous task for Add*LookupSymbolsInfo*. + + + + + Used by Add*LookupSymbolsInfo* to determine whether the symbol is of interest. + Distinguish from , which performs an analogous task for LookupSymbols*. + + + Does not consider - that is left to the caller. + + + + + A symbol is accessible for referencing in a cref if it is in the same assembly as the reference + or the symbols's effective visibility is not private. + + + + + Check whether "symbol" is accessible from this binder. + Also checks protected access via "accessThroughType". + + + + + Check whether "symbol" is accessible from this binder. + Also checks protected access via "accessThroughType", and sets "failedThroughTypeCheck" if fails + the protected access check. + + + + + Should only be called by , + which will already have checked for . + + + + + Look for names in scope + + + + + Look for names of members + + + + + Don't call this one directly - call one of the helpers. + + + + + For "receiver.event += expr", produce "receiver.add_event(expr)". + For "receiver.event -= expr", produce "receiver.remove_event(expr)". + + + Performs some validation of the accessor that couldn't be done in CheckEventValueKind, because + the specific accessor wasn't known. + + + + + If one of the (unconverted) operands has constant value null and the other has + a null constant value other than null, then they are definitely not equal + and we can give a constant value for either == or !=. This is a spec violation + that we retain from Dev10. + + The operator kind. Nothing will happen if it is not a lifted equality operator. + The left-hand operand of the operation (possibly wrapped in a conversion). + The right-hand operand of the operation (possibly wrapped in a conversion). + + If the operator represents lifted equality, then constant value true if both arguments have constant + value null, constant value false if exactly one argument has constant value null, and null otherwise. + If the operator represents lifted inequality, then constant value false if both arguments have constant + value null, constant value true if exactly one argument has constant value null, and null otherwise. + + + SPEC VIOLATION: according to the spec (section 7.19) constant expressions cannot + include implicit nullable conversions or nullable subexpressions. However, Dev10 + specifically folds over lifted == and != (see ExpressionBinder::TryFoldingNullableEquality). + Dev 10 does do compile-time evaluation of simple lifted operators, but it does so + in a rewriting pass (see NullableRewriter) - they are not treated as constant values. + + + + + Returns ConstantValue.Bad if, and only if, the resulting string length exceeds . + + + + + Returns false if reported an error, true otherwise. + + + + + Checks to see whether an expression is a "moveable" variable according to the spec. Moveable + variables have underlying memory which may be moved by the runtime. The spec defines anything + not fixed as moveable and specifies the expressions which are fixed. + + + + + Possible return values: + - + - + - - compiler doesn't support the type check, i.e. cannot perform it, even at runtime + - 'null' value - result is not known at compile time + + + + + Possible return values: + - + - - compiler doesn't support the type check, i.e. cannot perform it, even at runtime + - 'null' value - result is not known at compile time + + + + + From ExpressionBinder::EnsureQMarkTypesCompatible: + + The v2.0 specification states that the types of the second and third operands T and S of a conditional operator + must be TT and TS such that either (a) TT==TS, or (b), TT->TS or TS->TT but not both. + + Unfortunately that is not what we implemented in v2.0. Instead, we implemented + that either (a) TT=TS or (b) T->TS or S->TT but not both. That is, we looked at the + convertibility of the expressions, not the types. + + + Changing that to the algorithm in the standard would be a breaking change. + + b ? (Func<int>)(delegate(){return 1;}) : (delegate(){return 2;}) + + and + + b ? 0 : myenum + + would suddenly stop working. (The first because o2 has no type, the second because 0 goes to + any enum but enum doesn't go to int.) + + It gets worse. We would like the 3.0 language features which require type inference to use + a consistent algorithm, and that furthermore, the algorithm be smart about choosing the best + of a set of types. However, the language committee has decided that this algorithm will NOT + consume information about the convertibility of expressions. Rather, it will gather up all + the possible types and then pick the "largest" of them. + + To maintain backwards compatibility while still participating in the spirit of consistency, + we implement an algorithm here which picks the type based on expression convertibility, but + if there is a conflict, then it chooses the larger type rather than producing a type error. + This means that b?0:myshort will have type int rather than producing an error (because 0->short, + myshort->int). + + + + + Constant folding for conditional (aka ternary) operators. + + + + + Types which list-patterns can be used on (ie. countable and indexable ones) are assumed to have + non-negative lengths. + + + + + Binds the expression for a pattern. Sets if it was a type rather than an expression, + and in that case it returns a . + + + + + Binds the expression for an is-type right-hand-side, in case it does not bind as a type. + + + + + Check that the pattern type is valid for the operand. Return true if an error was reported. + + + + + Does an expression of type "match" a pattern that looks for + type ? + - if the matched type catches all of them + - if it catches none of them + - - compiler doesn't support the type check, i.e. cannot perform it, even at runtime + - 'null' if it might catch some of them. + + + + + Compute the val escape of an expression of the given , which is known to be derived + from an expression whose escape scope is . By the language rules, the + result is either that same scope (if the type is a ref struct type) or . + + + + + Check that the given name designates a tuple element at the given index, and return that element. + + + + + Compute the type code for the comparison operator to be used. When comparing `byte`s for example, + the compiler actually uses the operator on the type `int` as there is no corresponding operator for + the type `byte`. + + + + + This is a clone of the Dev10 logic for reporting query errors. + + + + + This is the set of parameters and local variables that were used as arguments to + lock or using statements in enclosing scopes. + + + using (x) { } // x counts + using (IDisposable y = null) { } // y does not count + + + + + Noteworthy override is in MemberSemanticModel.IncrementalBinder (used for caching). + + + + + Report an error if this is an awaitable async method invocation that is not being awaited. + + + The checks here are equivalent to StatementBinder::CheckForUnobservedAwaitable() in the native compiler. + + + + + Checks for a Dispose method on and returns its if found. + + Expression on which to perform lookup + The syntax node to perform lookup on + Populated with invocation errors, and warnings of near misses + The of the Dispose method if one is found, otherwise null. + + + + Wrap the initializer in a BoundFixedLocalCollectionInitializer so that the rewriter will have the + information it needs (e.g. conversions, helper methods). + + + + + There are two BadEventUsage error codes and this method decides which one should + be used for a given event. + + + + + Returns a value that tells how many local scopes are visible, including the current. + I.E. outside of any method will be 0 + immediately inside a method - 1 + + + + + Like BindForEachParts, but only bind the deconstruction part of the foreach, for purpose of inferring the types of the declared locals. + + + + + Wrap a given expression e into a block as either { e; } or { return e; } + Shared between lambda and expression-bodied method binding. + + + + + Binds an expression-bodied member with expression e as either { return e; } or { e; }. + + + + + Binds a lambda with expression e as either { return e; } or { e; }. + + + + + Bind the implicit constructor initializer of a constructor symbol. + + Constructor method. + Accumulates errors (e.g. access "this" in constructor initializer). + Used to retrieve binder. + A bound expression for the constructor initializer call. + + + + If this binder owns the scope that can declare extern aliases, a set of declared aliases should be returned (even if empty). + Otherwise, a default instance should be returned. + + + + + If this binder owns the scope that can declare using aliases, a set of declared aliases should be returned (even if empty). + Otherwise, a default instance should be returned. + Note, only aliases syntactically declared within the enclosing declaration are included. For example, global aliases + declared in a different compilation units are not included. + + + + + Perform a lookup for the specified method on the specified expression by attempting to invoke it + + The expression to perform pattern lookup on + Method to search for. + The expression for which lookup is being performed + Populated with binding diagnostics. + The method symbol that was looked up, or null + A value with the outcome of the lookup + + + + Binds the type for the syntax taking into account possibility of "var" type. + + Type syntax to bind. + Diagnostics. + + Set to false if syntax binds to a type in the current context and true if + syntax is "var" and it binds to "var" keyword in the current context. + + + Bound type if syntax binds to a type in the current context and + null if syntax binds to "var" keyword in the current context. + + + + + Binds the type for the syntax taking into account possibility of "unmanaged" type. + + Type syntax to bind. + Diagnostics. + + Set to if syntax binds to a type in the current context, otherwise + syntax binds to the corresponding keyword in the current context. + + + Bound type if syntax binds to a type in the current context and + null if syntax binds to a contextual constraint keyword. + + + + + Binds the type for the syntax taking into account possibility of "var" type. + + Type syntax to bind. + Diagnostics. + + Set to false if syntax binds to a type in the current context and true if + syntax is "var" and it binds to "var" keyword in the current context. + + Alias symbol if syntax binds to an alias. + + Bound type if syntax binds to a type in the current context and + null if syntax binds to "var" keyword in the current context. + + + + + Binds the type for the syntax taking into account possibility of "var" type. + If the syntax binds to an alias symbol to a type, it returns the alias symbol. + + Type syntax to bind. + Diagnostics. + + Set to false if syntax binds to a type or alias to a type in the current context and true if + syntax is "var" and it binds to "var" keyword in the current context. + + + Bound type or alias if syntax binds to a type or alias to a type in the current context and + null if syntax binds to "var" keyword in the current context. + + + + + Binds the type for the syntax taking into account possibility of the type being a keyword. + If the syntax binds to an alias symbol to a type, it returns the alias symbol. + PREREQUISITE: syntax should be checked to match the keyword, like or . + Otherwise, call instead. + + + + + The immediately containing namespace or named type, or the global + namespace if containing symbol is neither a namespace or named type. + + + + + This method is used in deeply recursive parts of the compiler and requires a non-trivial amount of stack + space to execute. Preventing inlining here to keep recursive frames small. + + + + + Bind the syntax into a namespace, type or alias symbol. + + + This method is used in deeply recursive parts of the compiler. Specifically this and + + are mutually recursive. The non-recursive parts of this method tend to reserve significantly large + stack frames due to their use of large struct like . + + To keep the stack frame size on recursive paths small the non-recursive parts are factored into local + functions. This means we pay their stack penalty only when they are used. They are themselves big + enough they should be disqualified from inlining. In the future when attributes are allowed on + local functions we should explicitly mark them as + + + + + Binds a simple name or the simple name portion of a qualified name. + + + + + If the node is "nint" or "nuint" and not alone inside nameof, return the corresponding native integer symbol. + Otherwise return null. + + + + + Keep check and error in sync with ConstructBoundMethodGroupAndReportOmittedTypeArguments. + + + + + Keep check and error in sync with ConstructNamedTypeUnlessTypeArgumentOmitted. + + + + + Check generic type constraints unless the type is used as part of a type or method + declaration. In those cases, constraints checking is handled by the caller. + + + + + This is a layer on top of the Compilation version that generates a diagnostic if the special + member isn't found. + + + + + Reports use-site diagnostics and dependencies for the specified symbol. + + + True if there was an error among the reported diagnostics + + + + + Reports use-site diagnostics and dependencies for the specified symbol. + + + True if there was an error among the reported diagnostics + + + + + This is a layer on top of the Compilation version that generates a diagnostic if the well-known + type isn't found. + + + + + This is a layer on top of the Compilation version that generates a diagnostic if the well-known + type isn't found. + + + + + This is a layer on top of the Compilation version that generates a diagnostic if the well-known + type isn't found. + + + + + This is a layer on top of the Compilation version that generates a diagnostic if the well-known + type isn't found. + + + + + Retrieves a well-known type member and reports diagnostics. + + Null if the symbol is missing. + + + + Returns -1 if None. + + + + + Prefers symbols from source module, then from added modules, then from referenced assemblies. + Returns true if values were swapped. + + + + + Returns true if the second is a better location than the first. + + + + + Prefer symbols from source module, then from added modules, then from referenced assemblies. + + + + + This is only intended to be called when the type isn't found (i.e. not when it is found but is inaccessible, has the wrong arity, etc). + + + + + Look for a type forwarder for the given type in the containing assembly and any referenced assemblies. + + The name of the (potentially) forwarded type. + The arity of the forwarded type. + The namespace of the potentially forwarded type. If none is provided, will + try Usings of the current import for eligible namespaces and return the namespace of the found forwarder, + if any. + Will be used to report non-fatal errors during look up. + Location to report errors on. + Returns the Assembly to which the type is forwarded, or null if none is found. + + Since this method is intended to be used for error reporting, it stops as soon as it finds + any type forwarder (or an error to report). It does not check other assemblies for consistency or better results. + + + + + If the left and right are tuples of matching cardinality, we'll try to bind the operator element-wise. + When that succeeds, the element-wise conversions are collected. We keep them for semantic model. + The element-wise binary operators are collected and stored as a tree for lowering. + + + + + Binds: + 1. dynamically, if either side is dynamic + 2. as tuple binary operator, if both sides are tuples of matching cardinalities + 3. as regular binary operator otherwise + + + + + If an element-wise binary operator returns a non-bool type, we will either: + - prepare a conversion to bool if one exists + - prepare a truth operator: op_false in the case of an equality (a == b will be lowered to !((a == b).op_false)) or op_true in the case of inequality, + with the conversion being used for its input. + + + + + If an element in a tuple literal has an explicit name which doesn't match the name on the other side, we'll warn. + The user can either remove the name, or fix it. + + This method handles two expressions, each of which is either a tuple literal or an expression with tuple type. + In a tuple literal, each element can have an explicit name, an inferred name or no name. + In an expression of tuple type, each element can have a name or not. + + + + + Given a tuple literal or expression, we'll get two arrays: + - the elements from the literal, or some placeholder with proper type (for tuple expressions) + - the elements' names + + + + + Make a tuple type (with appropriate nesting) from the types (on the left or on the right) collected + from binding element-wise binary operators. + If any of the elements is typeless, then the tuple is typeless too. + + + + + True if we are currently in an unsafe region (type, member, or block). + + + Does not imply that this compilation allows unsafe regions (could be in an error recovery scenario). + To determine that, check this.Compilation.Options.AllowUnsafe. + + + + True if a diagnostic was reported + + + True if a diagnostic was reported + + + + Get the name of the method so that it can be looked up in the containing type. + + Non-null declaration syntax. + Binder for the scope around the method (may be null for operators, constructors, and destructors). + + + + Get the name of the property, indexer, or event so that it can be looked up in the containing type. + + Non-null declaration syntax. + Non-null binder for the scope around the member. + + + + Returns true if the location is within the syntax tree and span. + + + + + Returns true if one of the locations is within the syntax tree and span. + + + + + Returns true if containingNode has a child that contains the specified position + and has kind UsingDirective. + + + Usings can't see other usings, so this is extra info when looking at a namespace + or compilation unit scope. + + + + + Used to detect whether we are in a cref parameter type. + + + + + Used to detect whether we are in a cref return type. + + + + + We're in a <param> or <paramref> element, so we want a binder that can see + the parameters of the associated member and nothing else. + + + + + We're in a <typeparam> or <typeparamref> element, so we want a binder that can see + the type parameters of the associated member and nothing else. + + + + + Given a CrefSyntax and an associated member declaration syntax node, + construct an appropriate binder for binding the cref. + + Cref that will be bound. + The member to which the documentation comment (logically) containing + the cref syntax applies. + Corresponding binder factory. + True to get a special binder for cref parameter and return types. + + The CrefSyntax does not actually have to be within the documentation comment on the member - it + could be included from another file. + + + + + Internal version of MakeCrefBinder that allows the caller to explicitly set the underlying binder. + + + + + Walk up from an XML syntax node (attribute or tag) to the enclosing documentation comment trivia. + + + + + Return binder for binding at node. + and + are optional syntax and symbol for the member containing . + If provided, the will use the member symbol rather + than looking up the member in the containing type, allowing this method to be called + while calculating the member list. + + + Note, there is no guarantee that the factory always gives back the same binder instance for the same node. + + + + + A specific location for binding. + + + + + Indicates that the current context allows unsafe constructs. + + + NOTE: Dev10 doesn't seem to treat attributes as being within the unsafe region. + Fortunately, not following this behavior should not be a breaking change since + attribute arguments have to be constants and there are no constants of unsafe + types. + + + + + Indicates that the unsafe diagnostics are not reported in the current context, regardless + of whether or not it is (part of) an unsafe region. + + + + + Indicates that this binder is being used to answer SemanticModel questions (i.e. not + for batch compilation). + + + Imports touched by a binder with this flag set are not consider "used". + + + + Remarks, mutually exclusive with . + + + Remarks, mutually exclusive with . + + + + In the debugger, one can take the address of a moveable variable. + + + + + In the debugger, the context is always unsafe, but one can still await. + + + + + Ignore duplicate types from the cor library. + + + + + This is a , or has as its parent. + + + + + Are we binding for the purpose of an Expression Evaluator + + + + + Skip binding type arguments (we use instead). + For example, currently used when type constraints are bound in some scenarios. + + + + + The current context is an expression tree + + + + + Extension methods for the type. + + + + + A binder that knows no symbols and will not delegate further. + + + + + * In non-speculative scenarios, the identifier for the file being bound. + * In speculative scenarios, the identifier for the file from the original compilation used as the speculation context. + * In EE scenarios, the identifier for the file from the original compilation used as the evaluation context. + + This is in some scenarios, such as the binder used for + or the binder used to bind usings in . + + + + + Get that can be used to quickly + check for certain attribute applications in context of this binder. + + + + + This is used while computing the values of constant fields. Since they can depend on each + other, we need to keep track of which ones we are currently computing in order to avoid (and + report) cycles. + + + + + This binder keeps track of the set of constant fields that are currently being evaluated + so that the set can be passed into the next call to SourceFieldSymbol.ConstantValue (and + its callers). + + + + + Each application of an attribute is effectively a constructor call. Since the attribute constructor + might have a CallerMemberName parameter, we need to keep track of which method/property/event + the attribute is on/in (e.g. on a parameter) so that we can use the name of that member as the + CallerMemberName argument. + This binder is also needed when a introduces type parameters to a scope within an attribute. + + + + Next binder in the chain (enclosing). + Symbol to which the attribute was applied (e.g. a parameter). + + + + We're binding an attribute and this is the member to/in which the attribute was applied. + + + Method, property, event, or null. + A virtual property on Binder (i.e. our usual pattern) would be more robust, but the applicability + of this property is so narrow that it doesn't seem worthwhile. + + + + + Walk up to the nearest method/property/event. + + + + + + A utility class for making a decision dag (directed acyclic graph) for a pattern-matching construct. + A decision dag is represented by + the class and is a representation of a finite state automaton that performs a + sequence of binary tests. Each node is represented by a . There are four + kind of nodes: performs one of the binary tests; + simply performs some computation and stores it in one or more + temporary variables for use in subsequent nodes (think of it as a node with a single successor); + represents the test performed by evaluating the expression of the + when-clause of a switch case; and represents a leaf node when we + have finally determined exactly which case matches. Each test processes a single input, and there are + four kinds: tests a value for null; + tests that a value is not null; checks if the value is of a given type; + and checks if the value is equal to a given constant. Of the evaluations, + there are which represents an invocation of a type's + "Deconstruct" method; reads a field; + reads a property; and converts a value from one type to another (which + is performed only after testing that the value is of that type). + + + In order to build this automaton, we start (in + + by computing a description of the initial state in a , and then + for each such state description we decide what the test or evaluation will be at + that state, and compute the successor state descriptions. + A state description represented by a is a collection of partially matched + cases represented + by , in which some number of the tests have already been performed + for each case. + When we have computed descriptions for all of the states, we create a new + for each of them, containing + the state transitions (including the test to perform at each node and the successor nodes) but + not the state descriptions. A containing this + set of nodes becomes part of the bound nodes (e.g. in and + ) and is used for semantic analysis and lowering. + + + + + + We might need to build a dedicated dag for lowering during which we + avoid synthesizing tests to relate alternative indexers. This won't + affect code semantics but it results in a better code generation. + + + + + Create a decision dag for a switch statement. + + + + + Create a decision dag for a switch expression. + + + + + Translate the pattern of an is-pattern expression. + + + + + Used to create a decision dag for a switch expression. + + + + + Compute the set of remaining tests for a pattern. + + + + + Make the tests and variable bindings for the given pattern with the given input. The pattern's + "output" value is placed in . The output is defined as the input + narrowed according to the pattern's *narrowed type*; see https://github.com/dotnet/csharplang/issues/2850. + + + + + Get the earliest input of which the symbol is a member. + A BoundDagTypeEvaluation doesn't change the underlying object being pointed to. + So two evaluations act on the same input so long as they have the same original input. + We use this method to compute the original input for an evaluation. + + + + + Generate a not-null check and a type check. + + + + + Compute and translate the decision dag, given a description of its initial state and a default + decision when no decision appears to match. This implementation is nonrecursive to avoid + overflowing the compiler's evaluation stack when compiling a large switch statement. + + + + + Make a (state machine) starting with the given set of cases in the root node, + and return the node for the root. + + + + + Compute the corresponding to each of the given + and store it in . + + + + + Given that the test has occurred and produced a true/false result, + set some flags indicating the implied status of the test. + + + + The possible values of test.Input when has succeeded. + The possible values of test.Input when has failed. + set if being true would permit to succeed + set if a false result on would permit to succeed + set if being true means has been proven true + set if being false means has been proven true + + + Returns true if the tests are related i.e. they have the same input, otherwise false. + The pre-condition under which these tests are related. + A possible assignment node which will correspond two non-identical but related test inputs. + + + + Determine what we can learn from one successful runtime type test about another planned + runtime type test for the purpose of building the decision tree. + We accommodate a special behavior of the runtime here, which does not match the language rules. + A value of type `int[]` is an "instanceof" (i.e. result of the `isinst` instruction) the type + `uint[]` and vice versa. It is similarly so for every pair of same-sized numeric types, and + arrays of enums are considered to be their underlying type. We need the dag construction to + recognize this runtime behavior, so we pretend that matching one of them gives no information + on whether the other will be matched. That isn't quite correct (nothing reasonable we do + could be), but it comes closest to preserving the existing C#7 behavior without undesirable + side-effects, and permits the code-gen strategy to preserve the dynamic semantic equivalence + of a switch (on the one hand) and a series of if-then-else statements (on the other). + See, for example, https://github.com/dotnet/roslyn/issues/35661 + + + + + A representation of the entire decision dag and each of its states. + + + + + The starting point for deciding which case matches. + + + + + A successor function used to topologically sort the DagState set. + + + + + Produce the states in topological order. + + Topologically sorted nodes. + True if the graph was acyclic. + + + + The state at a given node of the decision finite state automaton. This is used during computation of the state + machine (), and contains a representation of the meaning of the state. Because we always make + forward progress when a test is evaluated (the state description is monotonically smaller at each edge), the + graph of states is acyclic, which is why we call it a dag (directed acyclic graph). + + + + + For each dag temp of a type for which we track such things (the integral types, floating-point types, and bool), + the possible values it can take on when control reaches this state. + If this dictionary is mutated after , , + and are computed (for example to merge states), they must be cleared and recomputed, + as the set of possible values can affect successor states. + A absent from this dictionary means that all values of the type are possible. + + + + + The set of cases that may still match, and for each of them the set of tests that remain to be tested. + + + + + Decide on what test to use at this node of the decision dag. This is the principal + heuristic we can change to adjust the quality of the generated decision automaton. + See https://www.cs.tufts.edu/~nr/cs257/archive/norman-ramsey/match.pdf for some ideas. + + + + + An equivalence relation between dag states used to dedup the states during dag construction. + After dag construction is complete we treat a DagState as using object equality as equivalent + states have been merged. + + + + + As part of the description of a node of the decision automaton, we keep track of what tests + remain to be done for each case. + + + + + A number that is distinct for each case and monotonically increasing from earlier to later cases. + Since we always keep the cases in order, this is only used to assist with debugging (e.g. + see DecisionDag.Dump()). + + + + + Is the pattern in a state in which it is fully matched and there is no when clause? + + + + + Is the pattern fully matched and ready for the when clause to be evaluated (if any)? + + + + + Is the clause impossible? We do not consider a when clause with a constant false value to cause the branch to be impossible. + Note that we do not include the possibility that a when clause is the constant false. That is treated like any other expression. + + + + + + + + A set of tests to be performed. This is a discriminated union; see the options (nested types) for more details. + + + + + Take the set of tests and split them into two, one for when the test has succeeded, and one for when the test has failed. + + + + + Rewrite nested length tests in slice subpatterns to check the top-level length property instead. + + + + + No tests to be performed; the result is true (success). + + + + + No tests to be performed; the result is false (failure). + + + + + A single test to be performed, described by a . + Note that the test might be a , in which case it is deemed to have + succeeded after being evaluated. + + + + + A sequence of tests that must be performed, each of which must succeed. + The sequence is deemed to succeed if no element fails. + + + + + A sequence of tests that must be performed, any of which must succeed. + The sequence is deemed to succeed if some element succeeds. + + + + + This is a special binder used for decoding some special well-known attributes very early in the attribute binding phase. + It only binds those attribute argument syntax which can produce valid attribute arguments, but doesn't report any diagnostics. + Subsequent binding phase will rebind such erroneous attributes and generate appropriate diagnostics. + + + + + Since this method is expected to be called on every nested expression of the argument, it doesn't + need to recurse (directly). + + + + + This binder owns the scope for an embedded statement. + + + + + This binder owns and lazily creates the map of SyntaxNodes to Binders associated with + the syntax with which it is created. This binder is not created in reaction to any + specific syntax node type. It is inserted into the binder chain + between the binder which it is constructed with and those that it constructs via + the LocalBinderFactory. + + + + + Make a variable for a declaration expression other than a deconstruction left-hand-side. The only + other legal place for a declaration expression today is an out variable declaration; this method + handles that and the error cases as well. + + + + + Make a variable for a declaration expression appearing as one of the declared variables of the left-hand-side + of a deconstruction assignment. + + + + + A distinct scope that may expose extension methods. For a particular Binder, there + are two possible scopes: one for the namespace, and another for any using statements + in the namespace. The namespace scope is searched before the using scope. + + + + + An enumerable collection of extension method scopes in search + order, from the given Binder, out through containing Binders. + + + + + An enumerator over ExtensionMethodScopes. + + + + + Information to be deduced while binding a foreach loop so that the loop can be lowered + to a while over an enumerator. Not applicable to the array or string forms. + + + + + A loop binder that (1) knows how to bind foreach loops and (2) has the foreach iteration variable in scope. + + + This binder produces BoundForEachStatements. The lowering described in the spec is performed in ControlFlowRewriter. + + + + + Bind the ForEachStatementSyntax at the root of this binder. + + + + + Like BindForEachParts, but only bind the deconstruction part of the foreach, for purpose of inferring the types of the declared locals. + + + + + The spec describes an algorithm for finding the following types: + 1) Collection type + 2) Enumerator type + 3) Element type + + The implementation details are a bit different. If we're iterating over a string or an array, then we don't need to record anything + but the inferredType (in case the iteration variable is implicitly typed). If we're iterating over anything else, then we want the + inferred type plus a ForEachEnumeratorInfo.Builder with: + 1) Collection type + 2) Element type + 3) GetEnumerator (or GetAsyncEnumerator) method of the collection type (return type will be the enumerator type from the spec) + 4) Current property and MoveNext (or MoveNextAsync) method of the enumerator type + + The caller will have to do some extra conversion checks before creating a ForEachEnumeratorInfo for the BoundForEachStatement. + + Builder to fill in (partially, all but conversions). + The expression over which to iterate. + Populated with binding diagnostics. + Partially populated (all but conversions) or null if there was an error. + + + + Check for a GetEnumerator (or GetAsyncEnumerator) method on collectionExprType. Failing to satisfy the pattern is not an error - + it just means that we have to check for an interface instead. + + Expression over which to iterate. + Populated with *warnings* if there are near misses. + Builder to fill in. set if the pattern in satisfied. + True if the method was found (still have to verify that the return (i.e. enumerator) type is acceptable). + + Only adds warnings, so does not affect control flow (i.e. no need to check for failure). + + + + + Perform a lookup for the specified method on the specified type. Perform overload resolution + on the lookup results. + + Type to search. + Method to search for. + Passed in for reusability. + True if failures should result in warnings; false if they should result in errors. + Populated with binding diagnostics. + The desired method or null. + + + + The overload resolution portion of FindForEachPatternMethod. + If no arguments are passed in, then an empty argument list will be used. + + + + + Called after it is determined that the expression being enumerated is of a type that + has a GetEnumerator (or GetAsyncEnumerator) method. Checks to see if the return type of the GetEnumerator + method is suitable (i.e. has Current and MoveNext for regular case, + or Current and MoveNextAsync for async case). + + Must be non-null and contain a non-null GetEnumeratorMethod. + Will be populated with pattern diagnostics. + True if the return type has suitable members. + + It seems that every failure path reports the same diagnostics, so that is left to the caller. + + + + + Checks if the given type implements (or extends, in the case of an interface), + System.Collections.IEnumerable or System.Collections.Generic.IEnumerable<T>, + (or System.Collections.Generic.IAsyncEnumerable<T>) + for at least one T. + + builder to fill in CollectionType. + Type to check. + + True if multiple T's are found. + True if some IEnumerable is found (may still be ambiguous). + + + + Report appropriate diagnostics when lookup of a pattern member (i.e. GetEnumerator, Current, or MoveNext) fails. + + Failed lookup result. + Type in which member was looked up. + Name of looked up member. + True if failures should result in warnings; false if they should result in errors. + Populated appropriately. + + + If method is an extension method, this must be non-null. + + + + Tracks fields that are being bound while binding their initializers. + + + Used to detect circular references like: + var x = y; + var y = x; + + + + + Represents symbols imported to the binding scope via using namespace, using alias, and extern alias. + + + + + Does not preserve diagnostics. + + + + + A binder that places the members of a symbol in scope. + + + + + Creates a binder for a container. + + + + + A binder for a method body, which places the method's parameters in scope + and notes if the method is an iterator method. + Note: instances of this type can be re-used across different attempts at compiling the same method (caching by binder factory). + + + + + A binder that places the members of a submission class and aliases in scope. + + + + + Get that can be used to quickly + check for certain attribute applications in context of this binder. + + + + + The LocalBinderFactory is used to build up the map of all Binders within a method body, and the associated + CSharpSyntaxNode. To do so it traverses all the statements, handling blocks and other + statements that create scopes. For efficiency reasons, it does not traverse into all + expressions. This means that blocks within lambdas and queries are not created. + Blocks within lambdas are bound by their own LocalBinderFactory when they are + analyzed. + + For reasons of lifetime management, this type is distinct from the BinderFactory + which also creates a map from CSharpSyntaxNode to Binder. That type owns its binders + and that type's lifetime is that of the compilation. Therefore we do not store + binders local to method bodies in that type's cache. + + + + + Some statements by default do not introduce its own scope for locals. + For example: Expression Statement, Return Statement, etc. However, + when a statement like that is an embedded statement (like IfStatementSyntax.Statement), + then it should introduce a scope for locals declared within it. + Here we are detecting such statements and creating a binder that should own the scope. + + + + + This binder keeps track of the local variable (if any) that is currently being evaluated + so that it can be passed into the next call to LocalSymbol.GetConstantValue (and + its callers). + + + + + Call this when you are sure there is a local declaration on this token. Returns the local. + + + + + This type exists to share code between UsingStatementBinder and LockBinder. + + + + + This class exists so these two fields can be set atomically. + CONSIDER: If this causes too many allocations, we could use start and end flags plus spinlocking + as for completion parts. + + + + + Options that can be used to modify the symbol lookup mechanism. + + + Multiple options can be combined together. LookupOptions.AreValid checks for valid combinations. + + + + + Consider all symbols, using normal accessibility rules. + + + + + Consider only namespace aliases and extern aliases. + + + + + Consider only namespaces and types. + + + + + Consider non-members, plus invocable members. + + + + + Consider only symbols that are instance members. Valid with IncludeExtensionMethods + since extension methods are invoked on an instance. + + + + + Do not consider symbols that are instance members. + + + + + Do not consider symbols that are namespaces. + + + + + Consider methods of any arity when arity zero is specified. Because type parameters can be inferred, it is + often desired to consider generic methods when no type arguments were present. + + + + + Look only for label symbols. This must be exclusive of all other options. + + + + + Usually, when determining if a member is accessible, both the type of the receiver + and the type containing the access are used. If this flag is specified, then only + the containing type will be used (i.e. as if you've written base.XX). + + + + + Include extension methods. + + + + + Consider only attribute types. + + + + + Consider lookup name to be a verbatim identifier. + If this flag is specified, then only one lookup is performed for attribute name: lookup with the given name, + and attribute name lookup with "Attribute" suffix is skipped. + + + + + Consider named types of any arity when arity zero is specified. It is specifically desired for nameof in such situations: nameof(System.Collections.Generic.List) + + + + + Do not consider symbols that are method type parameters. + + + + + Consider only symbols that are abstract or virtual. + + + + + Are these options valid in their current combination? + + + Some checks made here: + + - Default is valid. + - If LabelsOnly is set, it must be the only option. + - If one of MustBeInstance or MustNotBeInstance are set, the other one must not be set. + - If any of MustNotBeInstance, MustBeInstance, or MustNotBeNonInvocableMember are set, + the options are considered valid. + - If MustNotBeNamespace is set, neither NamespaceAliasesOnly nor NamespacesOrTypesOnly must be set. + - Otherwise, only one of NamespaceAliasesOnly, NamespacesOrTypesOnly, or AllMethodsOnArityZero must be set. + + + + + represents one-to-one symbol -> SingleLookupResult filter. + + + + + A LookupResult summarizes the result of a name lookup within a scope It also allows + combining name lookups from different scopes in an easy way. + + A LookupResult can be ONE OF: + empty - nothing found. + a viable result - this kind of result prevents lookup into further scopes of lower priority. + Viable results should be without error; ambiguity is handled in the caller. + (Note that handling multiple "viable" results is not the same as in the VB compiler) + a non-accessible result - this kind of result means that search continues into further scopes of lower priority for + a viable result. An error is attached with the inaccessibility errors. Non-accessible results take priority over + non-viable results. + a non-viable result - a result that means that the search continues into further scopes of lower priority for + a viable or non-accessible result. An error is attached with the error that indicates + why the result is non-viable. A typical reason would be that it is the wrong kind of symbol. + + Note that the class is poolable so its instances can be obtained from a pool via GetInstance. + Also it is a good idea to call Free on instances after they no longer needed. + + The typical pattern is "caller allocates / caller frees" - + + var result = LookupResult.GetInstance(); + + scope.Lookup(result, "goo"); + ... use result ... + + result.Clear(); + anotherScope.Lookup(result, "moo"); + ... use result ... + + result.Free(); //result and its content is invalid after this + + + + + + Currently LookupResult is intended only for name lookup, not for overload resolution. It is + not clear if overload resolution will work with the structure as is, require enhancements, + or be best served by an alternate mechanism. + + We might want to extend this to a more general priority scheme. + + + + + + Return the single symbol if there is exactly one, otherwise null. + + + + + Is the result viable with one or more symbols? + + + + + NOTE: Even there is a single viable symbol, it may be an error type symbol. + + + + + Set current result according to another. + + + + + Set current result according to another. + + + + + Merge another result with this one, with the symbols combined if both + this and other are viable. Otherwise the highest priority result wins (this if equal + priority and non-viable.) + + + + + Classifies the different ways in which a found symbol might be incorrect. + Higher values are considered "better" than lower values. These values are used + in a few different places: + 1) Inside a LookupResult to indicate the quality of a symbol from lookup. + 2) Inside a bound node (for example, BoundBadExpression), to indicate + the "binding quality" of the symbols referenced by that bound node. + 3) Inside an error type symbol, to indicate the reason that the candidate symbols + in the error type symbols were not good. + + While most of the values can occur in all places, some of the problems are not + detected at lookup time (e.g., NotAVariable), so only occur in bound nodes. + + + This enumeration is parallel to and almost the same as the CandidateReason enumeration. + Changes to one should usually result in changes to the other. + + There are two enumerations because: + 1) CandidateReason in language-independent, while this enum is language specific. + 2) The name "CandidateReason" didn't make much sense in the way LookupResultKind is used internally. + 3) Viable isn't used in CandidateReason, but we need it in LookupResultKind, and there isn't a + a way to have internal enumeration values. + + + + + Maps a LookupResultKind to a CandidateReason. Should not be called on LookupResultKind.Viable! + + + + + Information about the arguments of a call that can turned into a BoundCall later without recalculating + default arguments. + + + + + Information about the arguments of a call that can turned into a BoundCall later without recalculating + default arguments. + + + + + Packages up the various parts returned when resolving a method group. + + + + + If a proper method named "nameof" exists in the outer scopes, is false and this binder does nothing. + Otherwise, it relaxes the instance-vs-static requirement for top-level member access expressions + and when inside an attribute on a method it adds type parameters from the target of that attribute. + To do so, it works together with . + + For other attributes (on types, type parameters or parameters) we use a WithTypeParameterBinder directly + in the binder chain and some filtering () to keep + pre-existing behavior. + + + + + Find the shortest path from the root node to the node of interest. + + The set of nodes in topological order. + The node of interest. + Whether to permit following paths that test for null. + set to true if the returned path requires some when clause to evaluate to 'false' + The shortest path, excluding the node of interest. + + + + Return a sample pattern that would lead to the given decision dag node. + + A topologically sorted list of nodes in the decision dag. + A node of interest (typically, the default node for a non-exhaustive switch). + Permit the use of "null" paths on tests which check for null. + + + + + The Lookup was successful + + + + + A member was found, but it was not a method + + + + + A member was found, but it was not callable + + + + + The lookup failed to find anything + + + + + One or more errors occurred while performing the lookup + + + + + Contains the code for determining C# accessibility rules. + + + + + Checks if 'symbol' is accessible from within assembly 'within'. + + + + + Checks if 'symbol' is accessible from within type 'within', with + an optional qualifier of type "throughTypeOpt". + + + + + Checks if 'symbol' is accessible from within type 'within', with + a qualifier of type "throughTypeOpt". Sets "failedThroughTypeCheck" to true + if it failed the "through type" check. + + + + + Returns true if the symbol is effectively public or internal based on + the declared accessibility of the symbol and any containing symbols. + + + + + Checks if 'symbol' is accessible from within 'within', which must be a NamedTypeSymbol + or an AssemblySymbol. + + + Note that NamedTypeSymbol, if available, is the type that is associated with the binder + that found the 'symbol', not the inner-most type that contains the access to the + 'symbol'. + + If 'symbol' is accessed off of an expression then 'throughTypeOpt' is the type of that + expression. This is needed to properly do protected access checks. Sets + "failedThroughTypeCheck" to true if this protected check failed. + + + This function is expected to be called a lot. As such, it avoids memory + allocations in the function itself (including not making any iterators). This means + that certain helper functions that could otherwise be called are inlined in this method to + prevent the overhead of returning collections or enumerators. + + + + + + Is the named type accessible from within , + which must be a named type or an assembly. + + + + + Is a top-level type with accessibility "declaredAccessibility" inside assembly "assembly" + accessible from "within", which must be a named type of an assembly. + + + + + Is a member with declared accessibility "declaredAccessibility" accessible from within + "within", which must be a named type or an assembly. + + + + + Is a protected symbol inside "originalContainingType" accessible from within "within", + which much be a named type or an assembly. + + + + + Is the type "withinType" nested within the original type "originalContainingType". + + + + + Determine if "type" inherits from or implements "baseType", ignoring constructed types, and dealing + only with original types. + + + + + Does the assembly has internal accessibility to "toAssembly"? + + The assembly wanting access. + The assembly possibly providing symbols to be accessed. + + + + This method finds the best common type of a set of expressions as per section 7.5.2.14 of the specification. + NOTE: If some or all of the expressions have error types, we return error type as the inference result. + + + + + This method implements best type inference for the conditional operator ?:. + NOTE: If either expression is an error type, we return error type as the inference result. + + + + + Returns the better type amongst the two, with some possible modifications (dynamic/object or tuple names). + + + + + Summarizes whether a conversion is allowed, and if so, which kind of conversion (and in some cases, the + associated symbol). + + + + + Returns true if the conversion exists, either as an implicit or explicit conversion. + + + The existence of a conversion does not necessarily imply that the conversion is valid. + For example, an ambiguous user-defined conversion may exist but may not be valid. + + + + + Returns true if the conversion is implicit. + + + Implicit conversions are described in section 6.1 of the C# language specification. + + + + + Returns true if the conversion is explicit. + + + Explicit conversions are described in section 6.2 of the C# language specification. + + + + + Returns true if the conversion is an identity conversion. + + + Identity conversions are described in section 6.1.1 of the C# language specification. + + + + + Returns true if the conversion is a stackalloc conversion. + + + + + Returns true if the conversion is an implicit numeric conversion or explicit numeric conversion. + + + Implicit and explicit numeric conversions are described in sections 6.1.2 and 6.2.1 of the C# language specification. + + + + + Returns true if the conversion is an implicit enumeration conversion or explicit enumeration conversion. + + + Implicit and explicit enumeration conversions are described in sections 6.1.3 and 6.2.2 of the C# language specification. + + + + + Returns true if the conversion is an implicit throw conversion. + + + + + Returns true if the conversion is an implicit object creation expression conversion. + + + + + Returns true if the conversion is an implicit switch expression conversion. + + + + + Returns true if the conversion is an implicit conditional expression conversion. + + + + + Returns true if the conversion is an interpolated string conversion. + + + The interpolated string conversion described in section 6.1.N of the C# language specification. + + + + + Returns true if the conversion is an interpolated string builder conversion. + + + + + Returns true if the conversion is an implicit nullable conversion or explicit nullable conversion. + + + Implicit and explicit nullable conversions are described in sections 6.1.4 and 6.2.3 of the C# language specification. + + + + + Returns true if the conversion is an implicit tuple literal conversion or explicit tuple literal conversion. + + + + + Returns true if the conversion is an implicit tuple conversion or explicit tuple conversion. + + + + + Returns true if the conversion is an implicit reference conversion or explicit reference conversion. + + + Implicit and explicit reference conversions are described in sections 6.1.6 and 6.2.4 of the C# language specification. + + + + + Returns true if the conversion is an implicit user-defined conversion or explicit user-defined conversion. + + + Implicit and explicit user-defined conversions are described in section 6.4 of the C# language specification. + + + + + Returns true if the conversion is an implicit boxing conversion. + + + Implicit boxing conversions are described in section 6.1.7 of the C# language specification. + + + + + Returns true if the conversion is an explicit unboxing conversion. + + + Explicit unboxing conversions as described in section 6.2.5 of the C# language specification. + + + + + Returns true if the conversion is an implicit null literal conversion. + + + Null literal conversions are described in section 6.1.5 of the C# language specification. + + + + + Returns true if the conversion is an implicit default literal conversion. + + + + + Returns true if the conversion is an implicit dynamic conversion. + + + Implicit dynamic conversions are described in section 6.1.8 of the C# language specification. + + + + + Returns true if the conversion is an implicit constant expression conversion. + + + Implicit constant expression conversions are described in section 6.1.9 of the C# language specification. + + + + + Returns true if the conversion is an implicit anonymous function conversion. + + + Implicit anonymous function conversions are described in section 6.5 of the C# language specification. + + + + + Returns true if the conversion is an implicit method group conversion. + + + Implicit method group conversions are described in section 6.6 of the C# language specification. + + + + + Returns true if the conversion is a pointer conversion + + + Pointer conversions are described in section 18.4 of the C# language specification. + + Returns true if the conversion is a conversion + a) from a pointer type to void*, + b) from a pointer type to another pointer type (other than void*), + c) from the null literal to a pointer type, + d) from an integral numeric type to a pointer type, + e) from a pointer type to an integral numeric type, or + d) from a function pointer type to a function pointer type. + + Does not return true for user-defined conversions to/from pointer types. + Does not return true for conversions between pointer types and IntPtr/UIntPtr. + + + + + Returns true if the conversion is a conversion to or from IntPtr or UIntPtr. + + + Returns true if the conversion is a conversion to or from IntPtr or UIntPtr. + This includes: + IntPtr to/from int + IntPtr to/from long + IntPtr to/from void* + UIntPtr to/from int + UIntPtr to/from long + UIntPtr to/from void* + + + + + Returns the method used to create the delegate for a method group conversion if is true + or the method used to perform the conversion for a user-defined conversion if is true. + Otherwise, returns null. + + + Method group conversions are described in section 6.6 of the C# language specification. + User-defined conversions are described in section 6.4 of the C# language specification. + + + + + Type parameter which runtime type will be used to resolve virtual invocation of the , if any. + Null if is resolved statically, or is null. + + + + + Gives an indication of how successful the conversion was. + Viable - found a best built-in or user-defined conversion. + Empty - found no applicable built-in or user-defined conversions. + OverloadResolutionFailure - found applicable conversions, but no unique best. + + + + + Conversion applied to operand of the user-defined conversion. + + + + + Conversion applied to the result of the user-defined conversion. + + + + + The user-defined operators that were considered when attempting this conversion + (i.e. the arguments to overload resolution). + + + + + Creates a from this C# conversion. + + The that represents this conversion. + + This is a lossy conversion; it is not possible to recover the original + from the struct. + + + + + Returns a string that represents the of the conversion. + + A string that represents the of the conversion. + + + + Determines whether the specified object is equal to the current object. + + The object to compare with the current object. + true if the specified object is equal to the current object; otherwise, false. + + + + Determines whether the specified object is equal to the current object. + + The object to compare with the current object. + true if the specified object is equal to the current object; otherwise, false. + + + + Returns a hash code for the current object. + + A hash code for the current object. + + + + Returns true if the specified objects are equal and false otherwise. + + The first object. + The second object. + + + + + Returns false if the specified objects are equal and true otherwise. + + The first object. + The second object. + + + + Stores all the information from binding for calling a Deconstruct method. + + + + An optional clone of this instance with distinct IncludeNullability. + Used to avoid unnecessary allocations when calling WithNullability() repeatedly. + + + + + Returns this instance if includeNullability is correct, and returns a + cached clone of this instance with distinct IncludeNullability otherwise. + + + + + Derived types should provide non-null value for proper classification of conversions from expression. + + + + + Determines if the source expression is convertible to the destination type via + any built-in or user-defined implicit conversion. + + + + + Determines if the source type is convertible to the destination type via + any built-in or user-defined implicit conversion. + + + + + Helper method that calls or + depending on whether the + types are instances. + Used by method type inference and best common type only. + + + + + Determines if the source expression of given type is convertible to the destination type via + any built-in or user-defined conversion. + + This helper is used in rare cases involving synthesized expressions where we know the type of an expression, but do not have the actual expression. + The reason for this helper (as opposed to ClassifyConversionFromType) is that conversions from expressions could be different + from conversions from type. For example expressions of dynamic type are implicitly convertable to any type, while dynamic type itself is not. + + + + + Determines if the source expression is convertible to the destination type via + any conversion: implicit, explicit, user-defined or built-in. + + + It is rare but possible for a source expression to be convertible to a destination type + by both an implicit user-defined conversion and a built-in explicit conversion. + In that circumstance, this method classifies the conversion as the implicit conversion or explicit depending on "forCast" + + + + + Determines if the source type is convertible to the destination type via + any conversion: implicit, explicit, user-defined or built-in. + + + It is rare but possible for a source type to be convertible to a destination type + by both an implicit user-defined conversion and a built-in explicit conversion. + In that circumstance, this method classifies the conversion as the implicit conversion or explicit depending on "forCast" + + + + + Determines if the source expression is convertible to the destination type via + any conversion: implicit, explicit, user-defined or built-in. + + + It is rare but possible for a source expression to be convertible to a destination type + by both an implicit user-defined conversion and a built-in explicit conversion. + In that circumstance, this method classifies the conversion as the built-in conversion. + + An implicit conversion exists from an expression of a dynamic type to any type. + An explicit conversion exists from a dynamic type to any type. + When casting we prefer the explicit conversion. + + + + + Determines if the source type is convertible to the destination type via + any conversion: implicit, explicit, user-defined or built-in. + + + It is rare but possible for a source type to be convertible to a destination type + by both an implicit user-defined conversion and a built-in explicit conversion. + In that circumstance, this method classifies the conversion as the built-in conversion. + + + + + Attempt a quick classification of builtin conversions. As result of "no conversion" + means that there is no built-in conversion, though there still may be a user-defined + conversion if compiling against a custom mscorlib. + + + + + Determines if the source type is convertible to the destination type via + any standard implicit or standard explicit conversion. + + + Not all built-in explicit conversions are standard explicit conversions. + + + + + Determines if the source type is convertible to the destination type via + any standard implicit or standard explicit conversion. + + + Not all built-in explicit conversions are standard explicit conversions. + + + + + IsBaseInterface returns true if baseType is on the base interface list of derivedType or + any base class of derivedType. It may be on the base interface list either directly or + indirectly. + * baseType must be an interface. + * type parameters do not have base interfaces. (They have an "effective interface list".) + * an interface is not a base of itself. + * this does not check for variance conversions; if a type inherits from + IEnumerable<string> then IEnumerable<object> is not a base interface. + + + + + returns true when implicit conversion is not necessarily the same as explicit conversion + + + + + Returns true if: + - Either type has no nullability information (oblivious). + - Both types cannot have different nullability at the same time, + including the case of type parameters that by themselves can represent nullable and not nullable reference types. + + + + + Returns false if source type can be nullable at the same time when destination type can be not nullable, + including the case of type parameters that by themselves can represent nullable and not nullable reference types. + When either type has no nullability information (oblivious), this method returns true. + + + + + Returns false if the source does not have an implicit conversion to the destination + because of either incompatible top level or nested nullability. + + + + + NOTE: Keep this method in sync with . + + + + + This method find the set of applicable user-defined and lifted conversion operators, u. + The set consists of the user-defined and lifted implicit conversion operators declared by + the classes and structs in d that convert from a type encompassing source to a type encompassed by target. + However if allowAnyTarget is true, then it considers all operators that convert from a type encompassing source + to any target. This flag must be set only if we are computing user defined conversions from a given source + type to any target type. + + + Currently allowAnyTarget flag is only set to true by , + where we must consider user defined implicit conversions from the type of the switch expression to + any of the possible switch governing types. + + + + + Find the most specific among a set of conversion operators, with the given constraint on the conversion. + + + + + NOTE: Keep this method in sync with AnalyzeImplicitUserDefinedConversion. + + + + + Resolve method group based on the optional delegate invoke method. + If the invoke method is null, ignore arguments in resolution. + + + + + Return the Invoke method symbol if the type is a delegate + type and the Invoke method is available, otherwise null. + + + + + Returns this instance if includeNullability is correct, and returns a + cached clone of this instance with distinct IncludeNullability otherwise. + + + + + Remove candidates to a delegate conversion where the method's return ref kind or return type is wrong. + + The ref kind of the delegate's return, if known. This is only unknown in + error scenarios, such as a delegate type that has no invoke method. + The return type of the delegate, if known. It isn't + known when we're attempting to infer the return type of a method group for type inference. + + + + Does override or the + thing that it originally overrides, but in a more derived class? + + Set to false if the caller has already checked that + is in a type that derives from the type containing + . + + + + Does the member group contain an override of or the method it + overrides, but in a more derived type? + + Set to false if the caller has already checked that + are all in a type that derives from the type containing + . + + + + This is specifically a private helper function (rather than a public property or extension method) + because applying this predicate to a non-method member doesn't have a clear meaning. The goal was + simply to avoid repeating ad-hoc code in a group of related collections. + + + + + Returns the parameter type (considering params). + + + + + Returns the parameter corresponding to the given argument index. + + + + + Returns true if the overload required a function type conversion to infer + generic method type arguments or to convert to parameter types. + + + + + To duplicate native compiler behavior for some scenarios we force a priority among + operators. If two operators are both applicable and both have a non-null Priority, + the one with the numerically lower Priority value is preferred. + + + + + Omit ref feature for COM interop: We can pass arguments by value for ref parameters if we are invoking a method/property on an instance of a COM imported type. + This property returns a flag indicating whether we had any ref omitted argument for the given call. + + + + + Returns false for + because those diagnostics are only reported if no other candidates are + available. + + + + + Indicates why the compiler accepted or rejected the member during overload resolution. + + + + + No resolution has (yet) been determined. + + + + + The candidate member was accepted in its normal (non-expanded) form. + + + + + The candidate member was accepted in its expanded form, after expanding a "params" parameter. + + + + + The candidate member was rejected because an inferred type argument is inaccessible. + + + + + The candidate member was rejected because an argument was specified that did not have a corresponding + parameter. + + + + + The candidate member was rejected because a named argument was specified that did not have a corresponding + parameter. + + + + + The candidate member was rejected because there were two named arguments with the same parameter name. + + + + + The candidate member was rejected because a required parameter had no corresponding argument. + + + + + The candidate member was rejected because a named argument was used that corresponded to a previously-given positional argument. + + + + + The candidate member was rejected because a named argument was used out-of-position and followed by unnamed arguments. + + + + + The candidate member was rejected because it is not supported by the language or cannot be used + given the current set of assembly references. + + + + + The candidate member was rejected because it is not supported by the language. + + + No diagnostics will be reported for such candidates unless they "win" overload resolution. + + + + + The candidate member was rejected because an argument could not be converted to the appropriate parameter + type. + + + + + The candidate member was rejected because type inference failed. + + + + + The extension method candidate was rejected because type + inference based on the "instance" argument failed. + + + + + The candidate member was rejected because a constraint on the type of a parameter was not satisfied. + + + + + The candidate method's type arguments do not satisfy their constraints. + + + + + The candidate member was rejected because it was an instance member accessed from a type, + or a static member accessed from an instance. + + + + + The candidate member was rejected because its calling convention did not match the function pointer + calling convention. + + + + + The candidate method in a delegate conversion was rejected because the ref kind of its return does not match the delegate. + + + + + The candidate method in a delegate conversion was rejected because its return type does not match the return type of the delegate. + + + + + The candidate member was rejected because another member further down in the inheritance hierarchy was + present. + + + + + The candidate member was rejected because it was considered worse that another member (according to section + 7.5.3.2 of the language specification). + + + + + Same as , but the candidate shouldn't be mentioned in an ambiguity diagnostics. + + + + + Represents the results of overload resolution for a single member. + + + + + At least one type argument was inferred from a function type. + + + + + The member considered during overload resolution. + + + + + The least overridden member that is accessible from the call site that performed overload resolution. + Typically a virtual or abstract method (but not necessarily). + + + The member whose parameter types and params modifiers were considered during overload resolution. + + + + + Indicates why the compiler accepted or rejected the member during overload resolution. + + + + + Returns true if the compiler accepted this member as the sole correct result of overload resolution. + + + + + The result of member analysis. + + + + + At least one type argument was inferred from a function type. + + + + + For error recovery, we allow a mismatch between the number of arguments and parameters + during type inference. This sometimes enables inferring the type for a lambda parameter. + + + + + Return the interface with an original definition matches + the original definition of the target. If the are no matches, + or multiple matches, the return value is null. + + + + + Return the inferred type arguments using null + for any type arguments that were not inferred. + + + + + This is a comparer that ignores differences in dynamic-ness and tuple names. + But it has a special case for top-level object vs. dynamic for purpose of method type inference. + + + + + Summarizes the results of an overload resolution analysis, as described in section 7.5 of + the language specification. Describes whether overload resolution succeeded, and which + method was selected if overload resolution succeeded, as well as detailed information about + each method that was considered. + + + + + True if overload resolution successfully selected a single best method. + + + + + If overload resolution successfully selected a single best method, returns information + about that method. Otherwise returns null. + + + + + If there was a method that overload resolution considered better than all others, + returns information about that method. A method may be returned even if that method was + not considered a successful overload resolution, as long as it was better that any other + potential method considered. + + + + + Returns information about each method that was considered during overload resolution, + and what the results of overload resolution were for that method. + + + + + Returns true if one or more of the members in the group are applicable. (Note that + Succeeded implies IsApplicable but IsApplicable does not imply Succeeded. It is possible + that no applicable member was better than all others.) + + + + + Returns all methods in the group that are applicable, . + + + + + Called when overload resolution has failed. Figures out the best way to describe what went wrong. + + + Overload resolution (effectively) starts out assuming that all candidates are valid and then + gradually disqualifies them. Therefore, our strategy will be to perform our checks in the + reverse order - the farther a candidate got through the process without being flagged, the + "better" it was. + + Note that "final validation" is performed after overload resolution, + so final validation errors are not seen here. Final validation errors include + violations of constraints on method type parameters, static/instance mismatches, + and so on. + + + + + If an argument fails to convert to the type of the corresponding parameter and that + parameter is a params array, then the error message should reflect the element type + of the params array - not the array type. + + + + + The base class for all symbols (namespaces, classes, method, parameters, etc.) that are + exposed by the compiler. + + + + + Checks if 'symbol' is accessible from within named type 'within'. If 'symbol' is accessed off + of an expression then 'throughTypeOpt' is the type of that expression. This is needed to + properly do protected access checks. + + + + + Checks if 'symbol' is accessible from within assembly 'within'. + + + + + Checks if this symbol is a definition and its containing module is a SourceModuleSymbol. + + + + + Return whether the symbol is either the original definition + or distinct from the original. Intended for use in Debug.Assert + only since it may include a deep comparison. + + + + + Returns a list of attributes to emit to CustomAttribute table. + The builder is freed after all its items are enumerated. + + + + + True if this Symbol should be completed by calling ForceComplete. + Intuitively, true for source entities (from any compilation). + + + + + Gets the name of this symbol. Symbols without a name return the empty string; null is + never returned. + + + + + Gets the name of a symbol as it appears in metadata. Most of the time, this + is the same as the Name property, with the following exceptions: + 1) The metadata name of generic types includes the "`1", "`2" etc. suffix that + indicates the number of type parameters (it does not include, however, names of + containing types or namespaces). + 2) The metadata name of explicit interface names have spaces removed, compared to + the name property. + + + + + Gets the token for this symbol as it appears in metadata. Most of the time this is 0, + as it is when the symbol is not loaded from metadata. + + + + + Gets the kind of this symbol. + + + + + Get the symbol that logically contains this symbol. + + + + + Returns the nearest lexically enclosing type, or null if there is none. + + + + + Gets the nearest enclosing namespace for this namespace or type. For a nested type, + returns the namespace that contains its container. + + + + + Returns the assembly containing this symbol. If this symbol is shared across multiple + assemblies, or doesn't belong to an assembly, returns null. + + + + + For a source assembly, the associated compilation. + For any other assembly, null. + For a source module, the DeclaringCompilation of the associated source assembly. + For any other module, null. + For any other symbol, the DeclaringCompilation of the associated module. + + + We're going through the containing module, rather than the containing assembly, + because of /addmodule (symbols in such modules should return null). + + Remarks, not "ContainingCompilation" because it isn't transitive. + + + + + Returns the module containing this symbol. If this symbol is shared across multiple + modules, or doesn't belong to a module, returns null. + + + + + The index of this member in the containing symbol. This is an optional + property, implemented by anonymous type properties only, for comparing + symbols in flow analysis. + + + Should this be used for tuple fields as well? + + + + + The original definition of this symbol. If this symbol is constructed from another + symbol by type substitution then OriginalDefinition gets the original symbol as it was defined in + source or metadata. + + + + + Returns true if this is the original definition of this symbol. + + + + + + Get a source location key for sorting. For performance, it's important that this + be able to be returned from a symbol without doing any additional allocations (even + if nothing is cached yet.) + + + Only (original) source symbols and namespaces that can be merged + need implement this function if they want to do so for efficiency. + + + + + + Gets the locations where this symbol was originally defined, either in source or + metadata. Some symbols (for example, partial classes) may be defined in more than one + location. + + + + + + Get the syntax node(s) where this symbol was declared in source. Some symbols (for + example, partial classes) may be defined in more than one location. This property should + return one or more syntax nodes only if the symbol was declared in source code and also + was not implicitly declared (see the property). + + + Note that for namespace symbol, the declaring syntax might be declaring a nested + namespace. For example, the declaring syntax node for N1 in "namespace N1.N2 {...}" is + the entire for N1.N2. For the global namespace, the declaring + syntax will be the . + + + + The syntax node(s) that declared the symbol. If the symbol was declared in metadata or + was implicitly declared, returns an empty read-only array. + + + To go the opposite direction (from syntax node to symbol), see . + + + + + Helper for implementing for derived classes that store a location but not a + or . + + + + + Get this accessibility that was declared on this symbol. For symbols that do not have + accessibility declared on them, returns . + + + + + Returns true if this symbol is "static"; i.e., declared with the static modifier or + implicitly static. + + + + + Returns true if this symbol is "virtual", has an implementation, and does not override a + base class member; i.e., declared with the virtual modifier. Does not return true for + members declared as abstract or override. + + + + + Returns true if this symbol was declared to override a base class member; i.e., declared + with the override modifier. Still returns true if member was declared to override + something, but (erroneously) no member to override exists. + + + Even for metadata symbols, = true does not imply that will + be non-null. + + + + + Returns true if this symbol was declared as requiring an override; i.e., declared with + the abstract modifier. Also returns true on a type declared as "abstract", all + interface types, and members of interface types. + + + + + Returns true if this symbol was declared to override a base class member and was also + sealed from further overriding; i.e., declared with the sealed modifier. Also set for + types that do not allow a derived class (declared with sealed or static or struct + or enum or delegate). + + + + + Returns true if this symbol has external implementation; i.e., declared with the + extern modifier. + + + + + Returns true if this symbol was automatically created by the compiler, and does not + have an explicit corresponding source code declaration. + + This is intended for symbols that are ordinary symbols in the language sense, + and may be used by code, but that are simply declared implicitly rather than + with explicit language syntax. + + Examples include (this list is not exhaustive): + the default constructor for a class or struct that is created if one is not provided, + the BeginInvoke/Invoke/EndInvoke methods for a delegate, + the generated backing field for an auto property or a field-like event, + the "this" parameter for non-static methods, + the "value" parameter for a property setter, + the parameters on indexer accessor methods (not on the indexer itself), + methods in anonymous types, + anonymous functions + + + + + Returns true if this symbol can be referenced by its name in code. Examples of symbols + that cannot be referenced by name are: + constructors, destructors, operators, explicit interface implementations, + accessor methods for properties and events, array types. + + + + + As an optimization, viability checking in the lookup code should use this property instead + of . The full name check will then be performed in the . + + + This property exists purely for performance reasons. + + + + + Perform additional checks after the member has been + added to the member list of the containing type. + + + + + Compare two symbol objects to see if they refer to the same symbol. You should always + use and , or the method, to compare two symbols for equality. + + + + + Compare two symbol objects to see if they refer to the same symbol. You should always + use == and !=, or the Equals method, to compare two symbols for equality. + + + + + Returns a string representation of this symbol, suitable for debugging purposes, or + for placing in an error message. + + + This will provide a useful representation, but it would be clearer to call + directly and provide an explicit format. + Sealed so that and can't get out of sync. + + + + + Build and add synthesized attributes for this symbol. + + + + + Convenience helper called by subclasses to add a synthesized attribute to a collection of attributes. + + + + + effective for this symbol (type or DllImport method). + Nothing if isn't applied on the containing module or it doesn't apply on this symbol. + + + Determined based upon value specified via applied on the containing module. + + + + + Always prefer . + + + + Unfortunately, when determining overriding/hiding/implementation relationships, we don't + have the "current" compilation available. We could, but that would clutter up the API + without providing much benefit. As a compromise, we consider all compilations "current". + + + Unlike in VB, we are not allowing retargeting symbols. This method is used as an approximation + for when a compilation is not available and that method will never return + true for retargeting symbols. + + + + + + Returns the Documentation Comment ID for the symbol, or null if the symbol doesn't + support documentation comments. + + + + + Fetches the documentation comment for this element with a cancellation token. + + Optionally, retrieve the comments formatted for a particular culture. No impact on source documentation comments. + Optionally, expand ]]> elements. No impact on non-source documentation comments. + Optionally, allow cancellation of documentation comment retrieval. + The XML that would be written to the documentation file for the symbol. + + + + True if the symbol has a use-site diagnostic with error severity. + + + + + Returns diagnostic info that should be reported at the use site of the symbol, or default if there is none. + + + + + Returns true if the error code is the highest priority while calculating use site error for this symbol. + Supposed to be ErrorCode, but it causes inconsistent accessibility error. + + + + + Indicates that this symbol uses metadata that cannot be supported by the language. + + Examples include: + - Pointer types in VB + - ByRef return type + - Required custom modifiers + + This is distinguished from, for example, references to metadata symbols defined in assemblies that weren't referenced. + Symbols where this returns true can never be used successfully, and thus should never appear in any IDE feature. + + This is set for metadata symbols, as follows: + Type - if a type is unsupported (e.g., a pointer type, etc.) + Method - parameter or return type is unsupported + Field - type is unsupported + Event - type is unsupported + Property - type is unsupported + Parameter - type is unsupported + + + + + Merges given diagnostic to the existing result diagnostic. + + + + + Merges given diagnostic and dependencies to the existing result. + + + + + Reports specified use-site diagnostic to given diagnostic bag. + + + This method should be the only method adding use-site diagnostics to a diagnostic bag. + It performs additional adjustments of the location for unification related diagnostics and + may be the place where to add more use-site location post-processing. + + True if the diagnostic has error severity. + + + + Derive use-site info from a type symbol. + + + + + True if this symbol has been marked with the attribute. + This property returns if the attribute hasn't been cracked yet. + + + + + Returns data decoded from attribute or null if there is no attribute. + This property returns if attribute arguments haven't been decoded yet. + + + + + Returns true and a from the first on the symbol, + the string might be null or an invalid guid representation. False, + if there is no with string argument. + + + + + True if the symbol is declared outside of the scope of the containing + symbol + + + + + Gets the attributes for this symbol. Returns an empty if + there are no attributes. + + + + + Gets the attribute target kind corresponding to the symbol kind + If attributes cannot be applied to this symbol kind, returns + an invalid AttributeTargets value of 0 + + AttributeTargets or 0 + + + + Method to early decode the type of well-known attribute which can be queried during the BindAttributeType phase. + This method is called first during attribute binding so that any attributes that affect semantics of type binding + can be decoded here. + + + NOTE: If you are early decoding any new well-known attribute, make sure to update PostEarlyDecodeWellKnownAttributeTypes + to default initialize this data. + + + + + This method is called during attribute binding after EarlyDecodeWellKnownAttributeTypes has been executed. + Symbols should default initialize the data for early decoded well-known attributes here. + + + + + Method to early decode applied well-known attribute which can be queried by the binder. + This method is called during attribute binding after we have bound the attribute types for all attributes, + but haven't yet bound the attribute arguments/attribute constructor. + Early decoding certain well-known attributes enables the binder to use this decoded information on this symbol + when binding the attribute arguments/attribute constructor without causing attribute binding cycle. + + + + + This method is called by the binder when it is finished binding a set of attributes on the symbol so that + the symbol can extract data from the attribute arguments and potentially perform validation specific to + some well known attributes. + + NOTE: If we are decoding a well-known attribute that could be queried by the binder, consider decoding it during early decoding pass. + + + + + Symbol types should override this if they want to handle a specific well-known attribute. + If the attribute is of a type that the symbol does not wish to handle, it should delegate back to + this (base) method. + + + + + + Called to report attribute related diagnostics after all attributes have been bound and decoded. + Called even if there are no attributes. + + + This method is called by the binder from after it has finished binding attributes on the symbol, + has executed for attributes applied on the symbol and has stored the decoded data in the + lazyCustomAttributesBag on the symbol. Bound attributes haven't been stored on the bag yet. + + Post-validation for attributes that is dependent on other attributes can be done here. + + This method should not have any side effects on the symbol, i.e. it SHOULD NOT change the symbol state. + + Bound attributes. + Syntax nodes of attributes in order they are specified in source, or null if there are no attributes. + Diagnostic bag. + Specific part of the symbol to which the attributes apply, or if the attributes apply to the symbol itself. + Decoded well-known attribute data, could be null. + + + + This method does the following set of operations in the specified order: + (1) GetAttributesToBind: Merge attributes from the given attributesSyntaxLists and filter out attributes by attribute target. + (2) BindAttributeTypes: Bind all the attribute types to enable early decode of certain well-known attributes by type. + (3) EarlyDecodeWellKnownAttributes: Perform early decoding of certain well-known attributes that could be queried by the binder in subsequent steps. + (NOTE: This step has the side effect of updating the symbol state based on the data extracted from well known attributes). + (4) GetAttributes: Bind the attributes (attribute arguments and constructor) using bound attribute types. + (5) DecodeWellKnownAttributes: Decode and validate bound well known attributes. + (NOTE: This step has the side effect of updating the symbol state based on the data extracted from well known attributes). + (6) StoreBoundAttributesAndDoPostValidation: + (a) Store the bound attributes in lazyCustomAttributes in a thread safe manner. + (b) Perform some additional post attribute validations, such as + 1) Duplicate attributes, attribute usage target validation, etc. + 2) Post validation for attributes dependent on other attributes + These validations cannot be performed prior to step 6(a) as we might need to + perform a GetAttributes() call on a symbol which can introduce a cycle in attribute binding. + We avoid this cycle by performing such validations in PostDecodeWellKnownAttributes after lazyCustomAttributes have been set. + NOTE: PostDecodeWellKnownAttributes SHOULD NOT change the symbol state. + + + Current design of early decoding well-known attributes doesn't permit decoding attribute arguments/constructor as this can lead to binding cycles. + For well-known attributes used by the binder, where we need the decoded arguments, we must handle them specially in one of the following possible ways: + (a) Avoid decoding the attribute arguments during binding and delay the corresponding binder tasks to a separate post-pass executed after binding. + (b) As the cycles can be caused only when we are binding attribute arguments/constructor, special case the corresponding binder tasks based on the current BinderFlags. + + + + Specific part of the symbol to which the attributes apply, or if the attributes apply to the symbol itself. + Indicates that only early decoding should be performed. WARNING: the resulting bag will not be sealed. + Binder to use. If null, GetBinderFactory will be used. + If specified, only load attributes that match this predicate, and any diagnostics produced will be dropped. + If specified, invoked before any part of the attribute syntax is bound. + If specified, invoked after any part of the attribute syntax is bound. + Flag indicating whether lazyCustomAttributes were stored on this thread. Caller should check for this flag and perform NotePartComplete if true. + + + + Method to merge attributes from the given attributesSyntaxLists and filter out attributes by attribute target. + This is the first step in attribute binding. + + + This method can generate diagnostics for few cases where we have an invalid target specifier and the parser hasn't generated the necessary diagnostics. + It should not perform any bind operations as it can lead to an attribute binding cycle. + + + + + Method to early decode certain well-known attributes which can be queried by the binder. + This method is called during attribute binding after we have bound the attribute types for all attributes, + but haven't yet bound the attribute arguments/attribute constructor. + Early decoding certain well-known attributes enables the binder to use this decoded information on this symbol + when binding the attribute arguments/attribute constructor without causing attribute binding cycle. + + + + + This method validates attribute usage for each bound attribute and calls + on attributes with valid attribute usage. + This method is called by the binder when it is finished binding a set of attributes on the symbol so that + the symbol can extract data from the attribute arguments and potentially perform validation specific to + some well known attributes. + + + + + Validate attribute usage target and duplicate attributes. + + Bound attribute + Syntax node for attribute specification + Compilation + Symbol part to which the attribute has been applied. + Diagnostics + Set of unique attribute types applied to the symbol + + + + Ensure that attributes are bound and the ObsoleteState of this symbol is known. + + + + + This binder owns the scope for Simple Program top-level statements. + + + + + This binder provides a context for binding within a specific compilation unit, but outside of top-level statements. + It ensures that locals are in scope, however it is not responsible + for creating the symbols. That task is actually owned by and + this binder simply delegates to it when appropriate. That ensures that the same set of symbols is + shared across all compilation units. + + + + + Represents a result of lookup operation over a 0 or 1 symbol (as opposed to a scope). The + typical use is to represent that a particular symbol is good/bad/unavailable. + + For more explanation of Kind, Symbol, Error - see LookupResult. + + + + + Bind the switch statement, reporting in the process any switch labels that are subsumed by previous cases. + + + + + Bind a pattern switch label in order to force inference of the type of pattern variables. + + + + + Bind the pattern switch labels. + + + + + Bind the pattern switch section. + + + + + Binder for one of the arms of a switch expression. For example, in the one-armed switch expression + "e switch { p when c => v }", this could be the binder for the arm "p when c => v". + + + + + Build the decision dag, giving an error if some cases are subsumed and a warning if the switch expression is not exhaustive. + + + + + + + true if there was a non-exhaustive warning reported + + + + Infer the result type of the switch expression by looking for a common type + to which every arm's expression can be converted. + + + + + This binder is for binding the argument to typeof. It traverses + the syntax marking each open type ("unbound generic type" in the + C# spec) as either allowed or not allowed, so that BindType can + appropriately return either the corresponding type symbol or an + error type. It also indicates whether the argument as a whole + should be considered open so that the flag can be set + appropriately in BoundTypeOfOperator. + + + + + This visitor walks over a type expression looking for open types. + Open types are allowed if an only if: + 1) There is no constructed generic type elsewhere in the visited syntax; and + 2) The open type is not used as a type argument or array/pointer/nullable + element type. + + + + The argument to typeof. + + Keys are GenericNameSyntax nodes representing unbound generic types. + Values are false if the node should result in an error and true otherwise. + + True if no constructed generic type was encountered. + + + + A binder that places class/interface/struct/delegate type parameters in scope + + + + + The scope within a documentation cref. Contains the implicitly declared type parameters + of the cref (see for details). + + + + + A binder that brings extern aliases into the scope and deals with looking up names in them. + + + + + A binder that brings both extern and using aliases into the scope and deals with looking up names in them. + + + + + This overload is added to shadow the one from the base. + + + + + Get that can be used to quickly + check for certain attribute applications in context of this binder. + + + + + A binder that places method type parameters in scope. + + + + + Binder used to place the parameters of a method, property, indexer, or delegate + in scope when binding <param> tags inside of XML documentation comments + and `nameof` in certain attribute positions. + + + + + A binder that represents a scope introduced by 'using' namespace or type directives and deals with looking up names in it. + + + + + Look for a type forwarder for the given type in any referenced assemblies, checking any using namespaces in + the current imports. + + The metadata name of the (potentially) forwarded type, without qualifiers. + Will be used to return the namespace of the found forwarder, + if any. + Will be used to report non-fatal errors during look up. + Location to report errors on. + Returns the Assembly to which the type is forwarded, or null if none is found. + + Since this method is intended to be used for error reporting, it stops as soon as it finds + any type forwarder (or an error to report). It does not check other assemblies for consistency or better results. + + + + + Check if this is equivalent to the node, ignoring the input. + + + + + Does this dag temp represent the original input of the pattern-matching operation? + + + + + Check if this is equivalent to the node, ignoring the source. + + + + + A list of all the nodes reachable from the root node, in a topologically sorted order. + + + + + Rewrite a decision dag, using a mapping function that rewrites one node at a time. That function + takes as its input the node to be rewritten and a function that returns the previously computed + rewritten node for successor nodes. + + + + + A trivial node replacement function for use with . + + + + + Given a decision dag and a constant-valued input, produce a simplified decision dag that has removed all the + tests that are unnecessary due to that constant value. This simplification affects flow analysis (reachability + and definite assignment) and permits us to simplify the generated code. + + + + + Returns true if calls and delegate invocations with this + expression as the receiver should be non-virtual calls. + + + + + Returns a serializable object that is used for displaying this expression in a diagnostic message. + + + + + Returns true when conversion itself (not the operand) may have side-effects + A typical side-effect of a conversion is an exception when conversion is unsuccessful. + + + + + + This method is intended for passes other than the LocalRewriter. + Use MakeConversion helper method in the LocalRewriter instead, + it generates a synthesized conversion in its lowered form. + + + + + NOTE: This method is intended for passes other than the LocalRewriter. + NOTE: Use MakeConversion helper method in the LocalRewriter instead, + NOTE: it generates a synthesized conversion in its lowered form. + + + + + Build an object creation expression without performing any rewriting + + + + + Infer return type. If `nullableState` is non-null, nullability is also inferred and `NullableWalker.Analyze` + uses that state to set the inferred nullability of variables in the enclosing scope. `conversions` is + only needed when nullability is inferred. + + + + + Indicates the type of return statement with no expression. Used in InferReturnType. + + + + + Behavior of this function should be kept aligned with . + + + + + Applies action to all the nested elements of this tuple. + + + + + Returns the RefKind if the expression represents a symbol + that has a RefKind, or RefKind.None otherwise. + + + + + Indicates whether a bound local is also a declaration, and if so was it a declaration with an explicit or an inferred type. + Ex: + - In `M(x)`, `x` has `LocalDeclarationKind.None` + - In `M(out int x)`, `x` has `LocalDeclarationKind.WithExplicitType` + - In `M(out var x)`, `x` has `LocalDeclarationKind.WithInferredType` + + + + + Set if the group has a receiver but one was not specified in syntax. + + + + + Sequence points permit Syntax to be null. But all other contexts require a non-null Syntax, + so we annotate it for the majority of uses. + + + + + Captures the fact that consumers of the node already checked the state of the WasCompilerGenerated bit. + Allows to assert on attempts to set WasCompilerGenerated bit after that. + + + + + Captures the fact that the node was either converted to some type, or converted to its natural + type. This is used to check the fact that every rvalue must pass through one of the two, + so that expressions like tuple literals and switch expressions can reliably be rewritten once + the target type is known. + + + + + Determines if a bound node, or associated syntax or type has an error (not a warning) + diagnostic associated with it. + + Typically used in the binder as a way to prevent cascading errors. + In most other cases a more lightweight HasErrors should be used. + + + + + Determines if a bound node, or any child, grandchild, etc has an error (not warning) + diagnostic associated with it. The HasError bit is initially set for a node by providing it + to the node constructor. If any child nodes of a node have + the HasErrors bit set, then it is automatically set to true on the parent bound node. + + HasErrors indicates that the tree is not emittable and used to short-circuit lowering/emit stages. + NOTE: not having HasErrors does not guarantee that we do not have any diagnostic associated + with corresponding syntax or type. + + + + + NOTE: not generally set in rewriters. + + + + + Top level nullability for the node. This should not be used by flow analysis. + + + + + This is for debugger display use only: will set the BoundNodeAttributes.WasTopLevelNullabilityChecked + bit in the boundnode properties, which will break debugging. This allows the debugger to display the current value without setting the bit. + + + + + Return a clone of the current node with the HasErrors flag set. + + + + + Override this property to return the child bound nodes if the IOperation API corresponding to this bound node is not yet designed or implemented. + + Note that any of the child bound nodes may be null. + + + + Visits the binary operator tree of interpolated string additions in a depth-first pre-order visit, + meaning parent, left, then right. + controls whether to continue the visit by returning true or false: + if true, the visit will continue. If false, the walk will be cut off. + + + + + Rewrites a BoundBinaryOperator composed of interpolated strings (either converted or unconverted) iteratively, without + recursion on the left side of the tree. Nodes of the tree are rewritten in a depth-first post-order fashion, meaning + left, then right, then parent. + + The original top of the binary operations. + The callback args. + + Rewriter for the BoundInterpolatedString or BoundUnconvertedInterpolatedString parts of the binary operator. Passed the callback + parameter, the original interpolated string, and the index of the interpolated string in the tree. + + + Rewriter for the BoundBinaryOperator parts fo the binary operator. Passed the callback parameter, the original binary operator, and + the rewritten left and right components. + + + + + Represents the operand type used for the result of a null-coalescing + operator. Used when determining nullability. + + + + + No valid type for operator. + + + + + Type of left operand is used. + + + + + Nullable underlying type of left operand is used. + + + + + Type of right operand is used. + + + + + Type of right operand is used and nullable left operand is converted + to underlying type before converting to right operand type. + + + + + Type of right operand is dynamic and is used. + + + + + Sets to the inner pattern after stripping off outer + s, and returns true if the original pattern is a + negated form of the inner pattern. + + + + + Consumers must provide implementation for . + + + + + We should be intentional about behavior of derived classes regarding guarding against stack overflow. + + + + + Note: do not use a static/singleton instance of this type, as it holds state. + + + + + Note: do not use a static/singleton instance of this type, as it holds state. + + + + + A group is a common instance referenced by all BoundConversion instances + generated from a single Conversion. The group is used by NullableWalker to + determine which BoundConversion nodes should be considered as a unit. + + + + + True if the conversion is an explicit conversion. + + + + + The conversion (from Conversions.ClassifyConversionFromExpression for + instance) from which all BoundConversions in the group were created. + + + + + The target type of the conversion specified explicitly in source, + or null if not an explicit conversion. + + + + + For nodes that can generate an , this allows the Lazy implementation + to get the children of this node on demand. + + + + + The scope of the expression that contained the interpolated string during initial binding. This is used to determine the SafeToEscape rules + for the builder during lowering. + + + + + The placeholders that are used for . + + + + + Simple helper method to get the object creation expression for this data. This should only be used in + scenarios where the data in is known to be valid, or it will throw. + + + + + BoundExpressions to be used for emit. The expressions are assumed + to be lowered and will not be visited by . + + + + + A tree of binary operators for tuple comparisons. + + For (a, (b, c)) == (d, (e, f)) we'll hold a Multiple with two elements. + The first element is a Single (describing the binary operator and conversions that are involved in a == d). + The second element is a Multiple containing two Singles (one for the b == e comparison and the other for c == f). + + + + + Holds the information for an element-wise comparison (like a == b as part of (a, ...) == (b, ...)) + + + + + Holds the information for a tuple comparison, either at the top-level (like (a, b) == ...) or nested (like (..., (a, b)) == (..., ...)). + + + + + Represents an element-wise null/null comparison. + For instance, (null, ...) == (null, ...). + + + + + Return the bound expression if the lambda has an expression body and can be reused easily. + This is an optimization only. Implementations can return null to skip reuse. + + + + + Produce a bound block for the expression returned from GetLambdaExpressionBody. + + + + + Behavior of this key should be kept aligned with . + + + + + What we need to do is find a *repeatable* arbitrary way to choose between + two errors; we can for example simply take the one whose arguments are lower in alphabetical + order when converted to a string. As an optimization, we compare error codes + first and skip string comparison if they differ. + + + + + In some cases returns are handled as gotos to return epilogue. + This is used to track the state of the epilogue. + + + + + Used to implement and . + + + + + True if there was a anywhere in the method. This will + affect whether or not we require the locals init flag to be marked, since locals init + affects . + + + + + Emits address as in & + + May introduce a temp which it will return. (otherwise returns null) + + + + + Emit code for a conditional (aka ternary) operator. + + + (b ? x : y) becomes + push b + if pop then goto CONSEQUENCE + push y + goto DONE + CONSEQUENCE: + push x + DONE: + + + + + May introduce a temp which it will return. (otherwise returns null) + + + + + May introduce a temp which it will return. (otherwise returns null) + + + + + Emits address of a temp. + Used in cases where taking address directly is not possible + (typically because expression does not have a home) + + Introduce a temp which it will return. + + + + + May introduce a temp which it will return. (otherwise returns null) + + + + + May introduce a temp which it will return. (otherwise returns null) + + + + + Checks if expression directly or indirectly represents a value with its own home. In + such cases it is possible to get a reference without loading into a temporary. + + + + + Emits receiver in a form that allows member accesses ( O or & ). + For verifier-reference types it is the actual reference. + For the value types it is an address of the receiver. + For generic types it is either a boxed receiver or the address of the receiver with readonly intent. + + addressKind - kind of address that is needed in case if receiver is not a reference type. + + May introduce a temp which it will return. (otherwise returns null) + + + + + May introduce a temp which it will return. (otherwise returns null) + + + + + Entry point to the array initialization. + Assumes that we have newly created array on the stack. + + inits could be an array of values for a single dimensional array + or an array (of array)+ of values for a multidimensional case + + in either case it is expected that number of leaf values will match number + of elements in the array and nesting level should match the rank of the array. + + + + + To handle array initialization of arbitrary rank it is convenient to + approach multidimensional initialization as a recursively nested. + + ForAll{i, j, k} Init(i, j, k) ===> + ForAll{i} ForAll{j, k} Init(i, j, k) ===> + ForAll{i} ForAll{j} ForAll{k} Init(i, j, k) + + This structure is used for capturing initializers of a given index and + the index value itself. + + + + + Emits all initializers that match indices on the stack recursively. + + Example: + if array has [0..2, 0..3, 0..2] shape + and we have {1, 2} indices on the stack + initializers for + [1, 2, 0] + [1, 2, 1] + [1, 2, 2] + + will be emitted and the top index will be pushed off the stack + as at that point we would be completely done with emitting initializers + corresponding to that index. + + + + + Determine if enum arrays can be initialized using block initialization. + + True if it's safe to use block initialization for enum arrays. + + In NetFx 4.0, block array initializers do not work on all combinations of {32/64 X Debug/Retail} when array elements are enums. + This is fixed in 4.5 thus enabling block array initialization for a very common case. + We look for the presence of which was introduced in .NET Framework 4.5 + + + + + Count of all nontrivial initializers and count of those that are constants. + + + + + Produces a serialized blob of all constant initializers. + Non-constant initializers are matched with a zero of corresponding size. + + + + + Check if it is a regular collection of expressions or there are nested initializers. + + + + + Returns a byte blob that matches serialized content of single array initializer. + returns -1 if the initializer is null or not an array of literals + + + + + Defines sequence locals and record them so that they could be retained for the duration of the encompassing expression + Use this when taking a reference of the sequence, which can indirectly refer to any of its locals. + + + + + Closes the visibility/debug scopes for the sequence locals, but keep the local slots from reuse + for the duration of the encompassing expression. + Use this paired with DefineAndRecordLocals when taking a reference of the sequence, which can indirectly refer to any of its locals. + + + + + Computes the desired refkind of the argument. + Considers all the cases - where ref kinds are explicit, omitted, vararg cases. + + + + + Used to decide if we need to emit call or callvirt. + It basically checks if the receiver expression cannot be null, but it is not 100% precise. + There are cases where it really can be null, but we do not care. + + + + + checks if receiver is effectively ldarg.0 + + + + + Used to decide if we need to emit 'call' or 'callvirt' for structure method. + It basically checks if the method overrides any other and method's defining type + is not a 'special' or 'special-by-ref' type. + + + + + When array operation get long or ulong arguments the args should be + cast to native int. + Note that the cast is always checked. + + + + + Recognizes constructors known to not have side-effects (which means they can be skipped unless the constructed object is used) + + + + + Emit an element store instruction for a single dimensional array. + + + + + Emit code for a conditional (aka ternary) operator. + + + (b ? x : y) becomes + push b + if pop then goto CONSEQUENCE + push y + goto DONE + CONSEQUENCE: + push x + DONE: + + + + + Emit code for a null-coalescing operator. + + + x ?? y becomes + push x + dup x + if pop != null goto LEFT_NOT_NULL + pop + push y + LEFT_NOT_NULL: + + + + + Produces opcode for a jump that corresponds to given operation and sense. + Also produces a reverse opcode - opcode for the same condition with inverted sense. + + + + + The interesting part in the following method is the support for exception filters. + === Example: + + try + { + TryBlock + } + catch (ExceptionType ex) when (Condition) + { + Handler + } + + gets emitted as something like ===> + + Try + TryBlock + Filter + var tmp = Pop() as {ExceptionType} + if (tmp == null) + { + Push 0 + } + else + { + ex = tmp + Push Condition ? 1 : 0 + } + End Filter // leaves 1 or 0 on the stack + Catch // gets called after finalization of nested exception frames if condition above produced 1 + Pop // CLR pushes the exception object again + variable ex can be used here + Handler + EndCatch + + When evaluating `Condition` requires additional statements be executed first, those + statements are stored in `catchBlock.ExceptionFilterPrologueOpt` and emitted before the condition. + + + + + Delegate to emit string compare call and conditional branch based on the compare result. + + Key to compare + Node for diagnostics. + Case constant to compare the key against + Target label to branch to if key = stringConstant + String equality method + + + + Delegate to emit ReadOnlySpanChar compare with string and conditional branch based on the compare result. + + Key to compare + Node for diagnostics. + Case constant to compare the key against + Target label to branch to if key = stringConstant + String equality method + + + + Gets already declared and initialized local. + + + + + Gets the name and id of the local that are going to be generated into the debug metadata. + + + + + Releases a local. + + + + + Allocates a temp without identity. + + + + + Frees a temp. + + + + + Frees an optional temp. + + + + + Clones all labels used in a finally block. + This allows creating an emittable clone of finally. + It is safe to do because no branches can go in or out of the finally handler. + + + + + The argument is BoundTryStatement (and not a BoundBlock) specifically + to support only Finally blocks where it is guaranteed to not have incoming or leaving branches. + + + + + Perform IL specific optimizations (mostly reduction of local slots) + + Method body to optimize + + When set, do not perform aggressive optimizations that degrade debugging experience. + In particular we do not do the following: + + 1) Do not elide any user defined locals, even if never read from. + Example: + { + var dummy = Goo(); // should not become just "Goo" + } + + User might want to examine dummy in the debugger. + + 2) Do not carry values on the stack between statements + Example: + { + var temp = Goo(); + temp.ToString(); // should not become Goo().ToString(); + } + + User might want to examine temp in the debugger. + + + + Produced list of "ephemeral" locals. + Essentially, these locals do not need to leave the evaluation stack. + As such they do not require an allocation of a local slot and + their load/store operations are implemented trivially. + + + + + + when current and other use spans are regular spans we can have only 2 conflict cases: + [1, 3) conflicts with [0, 2) + [1, 3) conflicts with [2, 4) + + NOTE: with regular spans, it is not possible for two spans to share an edge point + unless they belong to the same local. (because we cannot access two real locals at the same time) + + specifically: + [1, 3) does not conflict with [0, 1) since such spans would need to belong to the same local + + + + + Dummy locals represent implicit control flow + It is not allowed for a regular local span to cross into or + be immediately adjacent to a dummy span. + + specifically: + [1, 3) does conflict with [0, 1) since that would imply a value flowing into or out of a span surrounded by a branch/label + + + + + + Fixed-sized buffers are lowered as field accesses with pointer type, but + we want to assign them to pinned ref locals before creating the pointer + type, so this results in an assignment with mismatched types (pointer to managed + ref). This is legal according to the CLR, but not how we usually represent things + in lowering. + + + + + Compiler should always be synthesizing locals with correct escape semantics. + Checking escape scopes is not valid here. + + + + + Compiler should always be synthesizing locals with correct escape semantics. + Checking escape scopes is not valid here. + + + + + Get the path name starting from the + + + + + The command line arguments to a C# . + + + + + Gets the compilation options for the C# + created from the . + + + + + Gets the parse options for the C# . + + + + + Should the format of error messages include the line and column of + the end of the offending text. + + + + + Parses a command line. + + A collection of strings representing the command line arguments. + The base directory used for qualifying file locations. + The directory to search for mscorlib, or null if not available. + A string representing additional reference paths. + a commandlinearguments object representing the parsed command line. + + + + Diagnostic for the errorCode added if the warningOptions does not mention suppressed for the errorCode. + + + + + Given a compilation and a destination directory, determine three names: + 1) The name with which the assembly should be output. + 2) The path of the assembly/module file. + 3) The path of the pdb file. + + When csc produces an executable, but the name of the resulting assembly + is not specified using the "/out" switch, the name is taken from the name + of the file (note: file, not class) containing the assembly entrypoint + (as determined by binding and the "/main" switch). + + For example, if the command is "csc /target:exe a.cs b.cs" and b.cs contains the + entrypoint, then csc will produce "b.exe" and "b.pdb" in the output directory, + with assembly name "b" and module name "b.exe" embedded in the file. + + + + + Print compiler logo + + + + + + Print Commandline help message (up to 80 English characters per line) + + + + + + A binding for an attribute. Represents the result of binding an attribute constructor and + the positional and named arguments. + + + + + Creates an AttributeSemanticModel that allows asking semantic questions about an attribute node. + + + + + Creates a speculative AttributeSemanticModel that allows asking semantic questions about an attribute node that did not appear in the original source code. + + + + + Structure containing all semantic information about an await expression. + + + + + Internal cache of built-in operators. + Cache is compilation-specific because it uses compilation-specific SpecialTypes. + + + + + The compilation object is an immutable representation of a single invocation of the + compiler. Although immutable, a compilation is also on-demand, and will realize and cache + data as necessary. A compilation can produce a new compilation from existing compilation + with the application of small deltas. In many cases, it is more efficient than creating a + new compilation from scratch, as the new compilation can reuse information from the old + compilation. + + + + + All imports (using directives and extern aliases) in syntax trees in this compilation. + NOTE: We need to de-dup since the Imports objects that populate the list may be GC'd + and re-created. + Values are the sets of dependencies for corresponding directives. + + + + + A conversions object that ignores nullability. + + + + + Manages anonymous types declared in this compilation. Unifies types that are structurally equivalent. + + + + + The for this compilation. Do not access directly, use Assembly property + instead. This field is lazily initialized by ReferenceManager, ReferenceManager.CacheLockObject must be locked + while ReferenceManager "calculates" the value and assigns it, several threads must not perform duplicate + "calculation" simultaneously. + + + + + Holds onto data related to reference binding. + The manager is shared among multiple compilations that we expect to have the same result of reference binding. + In most cases this can be determined without performing the binding. If the compilation however contains a circular + metadata reference (a metadata reference that refers back to the compilation) we need to avoid sharing of the binding results. + We do so by creating a new reference manager for such compilation. + + + + + Contains the main method of this assembly, if there is one. + + + + + Emit nullable attributes for only those members that are visible outside the assembly + (public, protected, and if any [InternalsVisibleTo] attributes, internal members). + If false, attributes are emitted for all members regardless of visibility. + + + + + The set of trees for which a has been added to the queue. + + + + + The set of trees for which enough analysis was performed in order to record usage of using directives. + Once all trees are processed the value is set to null. + + + + + Optional data collected during testing only. + Used for instance for nullable analysis () + and inferred delegate types (). + + + + + The options the compilation was created with. + + + + + True when the compiler is run in "strict" mode, in which it enforces the language specification + in some cases even at the expense of full compatibility. Such differences typically arise when + earlier versions of the compiler failed to enforce the full language specification. + + + + + True when the "peverify-compat" feature flag is set or the language version is below C# 7.2. + With this flag we will avoid certain patterns known not be compatible with PEVerify. + The code may be less efficient and may deviate from spec in corner cases. + The flag is only to be used if PEVerify pass is extremely important. + + + + + Returns true if nullable analysis is enabled in the text span represented by the syntax node. + + + This overload is used for member symbols during binding, or for cases other + than symbols such as attribute arguments and parameter defaults. + + + + + Returns true if nullable analysis is enabled in the text span. + + + This overload is used for member symbols during binding, or for cases other + than symbols such as attribute arguments and parameter defaults. + + + + + Returns true if nullable analysis is enabled for the method. For constructors, the + region considered may include other constructors and field and property initializers. + + + This overload is intended for callers that rely on symbols rather than syntax. The overload + uses the cached value calculated during binding (from potentially several spans) + from . + + + + + Returns true if nullable analysis is enabled for all methods regardless + of the actual nullable context. + If this property returns true but IsNullableAnalysisEnabled returns false, + any nullable analysis should be enabled but results should be ignored. + + + For DEBUG builds, we treat nullable analysis as enabled for all methods + unless explicitly disabled, so that analysis is run, even though results may + be ignored, to increase the chance of catching nullable regressions + (e.g. https://github.com/dotnet/roslyn/issues/40136). + + + + + Returns Feature("run-nullable-analysis") as a bool? value: + true for "always"; false for "never"; and null otherwise. + + + + + The language version that was used to parse the syntax trees of this compilation. + + + + + Creates a new compilation from scratch. Methods such as AddSyntaxTrees or AddReferences + on the returned object will allow to continue building up the Compilation incrementally. + + Simple assembly name. + The syntax trees with the source code for the new compilation. + The references for the new compilation. + The compiler options to use. + A new compilation. + + + + Creates a new compilation that can be used in scripting. + + + + + Create a duplicate of this compilation with different symbol instances. + + + + + Creates a new compilation with the specified name. + + + + + Creates a new compilation with the specified references. + + + The new will query the given for the underlying + metadata as soon as the are needed. + + The new compilation uses whatever metadata is currently being provided by the . + E.g. if the current compilation references a metadata file that has changed since the creation of the compilation + the new compilation is going to use the updated version, while the current compilation will be using the previous (it doesn't change). + + + + + Creates a new compilation with the specified references. + + + + + Creates a new compilation with the specified compilation options. + + + + + Returns a new compilation with the given compilation set as the previous submission. + + + + + Returns a new compilation with the given semantic model provider. + + + + + Returns a new compilation with a given event queue. + + + + + The syntax trees (parsed from source code) that this compilation was created with. + + + + + Returns true if this compilation contains the specified tree. False otherwise. + + + + + Creates a new compilation with additional syntax trees. + + + + + Creates a new compilation with additional syntax trees. + + + + + Creates a new compilation without the specified syntax trees. Preserves metadata info for use with trees + added later. + + + + + Creates a new compilation without the specified syntax trees. Preserves metadata info for use with trees + added later. + + + + + Creates a new compilation without any syntax trees. Preserves metadata info + from this compilation for use with trees added later. + + + + + Creates a new compilation without the old tree but with the new tree. + + + + + Gets the or for a metadata reference used to create this compilation. + + or corresponding to the given reference or null if there is none. + + Uses object identity when comparing two references. + + + + + All reference directives used in this compilation. + + + + + Returns a metadata reference that a given #r resolves to. + + #r directive. + Metadata reference the specified directive resolves to, or null if the doesn't match any #r directive in the compilation. + + + + Creates a new compilation with additional metadata references. + + + + + Creates a new compilation with additional metadata references. + + + + + Creates a new compilation without the specified metadata references. + + + + + Creates a new compilation without the specified metadata references. + + + + + Creates a new compilation without any metadata references + + + + + Creates a new compilation with an old metadata reference replaced with a new metadata reference. + + + + + Get all modules in this compilation, including the source module, added modules, and all + modules of referenced assemblies that do not come from an assembly with an extern alias. + Metadata imported from aliased assemblies is not visible at the source level except through + the use of an extern alias directive. So exclude them from this list which is used to construct + the global namespace. + + + + + Return a list of assembly symbols than can be accessed without using an alias. + For example: + 1) /r:A.dll /r:B.dll -> A, B + 2) /r:Goo=A.dll /r:B.dll -> B + 3) /r:Goo=A.dll /r:A.dll -> A + + + + + Gets the that corresponds to the assembly symbol. + + + + + The AssemblySymbol that represents the assembly being created. + + + + + The AssemblySymbol that represents the assembly being created. + + + + + Get a ModuleSymbol that refers to the module being created by compiling all of the code. + By getting the GlobalNamespace property of that module, all of the namespaces and types + defined in source code can be obtained. + + + + + Gets the root namespace that contains all namespaces and types defined in source code or in + referenced metadata, merged into a single namespace hierarchy. + + + + + Given for the specified module or assembly namespace, gets the corresponding compilation + namespace (merged namespace representation for all namespace declarations and references + with contributions for the namespaceSymbol). Can return null if no corresponding + namespace can be bound in this compilation with the same name. + + + + + A symbol representing the implicit Script class. This is null if the class is not + defined in the compilation. + + + + + Resolves a symbol that represents script container (Script class). Uses the + full name of the container class stored in to find the symbol. + + The Script class symbol or null if it is not defined. + + + + Global imports (including those from previous submissions, if there are any). + + + + + Global imports not including those from previous submissions. + + + + + Imports declared by this submission (null if this isn't one). + + + + + Imports from all previous submissions. + + + + + Get the symbol for the predefined type from the COR Library referenced by this compilation. + + + + + Get the symbol for the predefined type member from the COR Library referenced by this compilation. + + + + + Gets the type within the compilation's assembly and all referenced assemblies (other than + those that can only be referenced via an extern alias) using its canonical CLR metadata name. + + + + + The TypeSymbol for the type 'dynamic' in this Compilation. + + + + + The NamedTypeSymbol for the .NET System.Object type, which could have a TypeKind of + Error if there was no COR Library in this Compilation. + + + + + Checks if the method has an entry point compatible signature, i.e. + - the return type is either void, int, or returns a , + or where the return type of GetAwaiter().GetResult() + is either void or int. + - has either no parameter or a single parameter of type string[] + + + + + Classifies a conversion from to . + + Source type of value to be converted + Destination type of value to be converted + A that classifies the conversion from the + type to the type. + + + + Classifies a conversion from to according + to this compilation's programming language. + + Source type of value to be converted + Destination type of value to be converted + A that classifies the conversion from the + type to the type. + + + + Returns a new ArrayTypeSymbol representing an array type tied to the base types of the + COR Library in this Compilation. + + + + + Returns a new PointerTypeSymbol representing a pointer type tied to a type in this Compilation. + + + + + Gets a new SyntaxTreeSemanticModel for the specified syntax tree. + + + + + The bag in which semantic analysis should deposit its diagnostics. + + + + + A bag in which diagnostics that should be reported after code gen can be deposited. + + + + + Gets the diagnostics produced during the parsing stage of a compilation. There are no diagnostics for declarations or accessor or + method bodies, for example. + + + + + Gets the diagnostics produced during symbol declaration headers. There are no diagnostics for accessor or + method bodies, for example. + + + + + Gets the diagnostics produced during the analysis of method bodies and field initializers. + + + + + Gets the all the diagnostics for the compilation, including syntax, declaration, and binding. Does not + include any diagnostics that might be produced during emit. + + + + + Return true if there is a source declaration symbol name that meets given predicate. + + + + + Return source declaration symbols whose name meets given predicate. + + + + + Return true if there is a source declaration symbol name that matches the provided name. + This will be faster than + when predicate is just a simple string check. + + + + + Return source declaration symbols whose name matches the provided name. This will be + faster than when predicate is just a simple string check. is case sensitive. + + + + + Returns if the compilation has all of the members necessary to emit metadata about + dynamic types. + + + + + + Returns whether the compilation has the Boolean type and if it's good. + + Returns true if Boolean is present and healthy. + + + + Determine if enum arrays can be initialized using block initialization. + + True if it's safe to use block initialization for enum arrays. + + In NetFx 4.0, block array initializers do not work on all combinations of {32/64 X Debug/Retail} when array elements are enums. + This is fixed in 4.5 thus enabling block array initialization for a very common case. + We look for the presence of which was introduced in .NET Framework 4.5 + + + + + An array of cached well known types available for use in this Compilation. + Lazily filled by GetWellKnownType method. + + + + + Lazy cache of well known members. + Not yet known value is represented by ErrorTypeSymbol.UnknownResultType + + + + + Returns a value indicating which embedded attributes should be generated during emit phase. + The value is set during binding the symbols that need those attributes, and is frozen on first trial to get it. + Freezing is needed to make sure that nothing tries to modify the value after the value is read. + + + + + Lookup member declaration in well known type used by this Compilation. + + + If a well-known member of a generic type instantiation is needed use this method to get the corresponding generic definition and + to construct an instantiation. + + + + + This method handles duplicate types in a few different ways: + - for types before C# 7, the first candidate is returned with a warning + - for types after C# 7, the type is considered missing + - in both cases, when BinderFlags.IgnoreCorLibraryDuplicatedTypes is set, type from corlib will not count as a duplicate + + + + + Synthesizes a custom attribute. + Returns null if the symbol is missing, + or any of the members in are missing. + The attribute is synthesized only if present. + + + Constructor of the attribute. If it doesn't exist, the attribute is not created. + + Arguments to the attribute constructor. + + Takes a list of pairs of well-known members and constants. The constants + will be passed to the field/property referenced by the well-known member. + If the well-known member does not exist in the compilation then no attribute + will be synthesized. + + + Indicates if this particular attribute application should be considered optional. + + + + + Given a type , which is either dynamic type OR is a constructed type with dynamic type present in it's type argument tree, + returns a synthesized DynamicAttribute with encoded dynamic transforms array. + + This method is port of AttrBind::CompileDynamicAttr from the native C# compiler. + + + + Used to generate the dynamic attributes for the required typesymbol. + + + + + ReferenceManager encapsulates functionality to create an underlying SourceAssemblySymbol + (with underlying ModuleSymbols) for Compilation and AssemblySymbols for referenced + assemblies (with underlying ModuleSymbols) all properly linked together based on + reference resolution between them. + + ReferenceManager is also responsible for reuse of metadata readers for imported modules + and assemblies as well as existing AssemblySymbols for referenced assemblies. In order + to do that, it maintains global cache for metadata readers and AssemblySymbols + associated with them. The cache uses WeakReferences to refer to the metadata readers and + AssemblySymbols to allow memory and resources being reclaimed once they are no longer + used. The tricky part about reusing existing AssemblySymbols is to find a set of + AssemblySymbols that are created for the referenced assemblies, which (the + AssemblySymbols from the set) are linked in a way, consistent with the reference + resolution between the referenced assemblies. + + When existing Compilation is used as a metadata reference, there are scenarios when its + underlying SourceAssemblySymbol cannot be used to provide symbols in context of the new + Compilation. Consider classic multi-targeting scenario: compilation C1 references v1 of + Lib.dll and compilation C2 references C1 and v2 of Lib.dll. In this case, + SourceAssemblySymbol for C1 is linked to AssemblySymbol for v1 of Lib.dll. However, + given the set of references for C2, the same reference for C1 should be resolved against + v2 of Lib.dll. In other words, in context of C2, all types from v1 of Lib.dll leaking + through C1 (through method signatures, etc.) must be retargeted to the types from v2 of + Lib.dll. In this case, ReferenceManager creates a special RetargetingAssemblySymbol for + C1, which is responsible for the type retargeting. The RetargetingAssemblySymbols could + also be reused for different Compilations, ReferenceManager maintains a cache of + RetargetingAssemblySymbols (WeakReferences) for each Compilation. + + The only public entry point of this class is CreateSourceAssembly() method. + + + + + Checks if the properties of are compatible with properties of . + Reports inconsistencies to the given diagnostic bag. + + True if the properties are compatible and hence merged, false if the duplicate reference should not merge it's properties with primary reference. + + + + C# only considers culture when comparing weak identities. + It ignores versions of weak identities and reports an error if there are two weak assembly + references passed to a compilation that have the same simple name. + + + + + Creates a from specified metadata. + + + Used by EnC to create symbols for emit baseline. The PE symbols are used by . + + The assembly references listed in the metadata AssemblyRef table are matched to the resolved references + stored on this . We assume that the dependencies of the baseline metadata are + the same as the dependencies of the current compilation. This is not exactly true when the dependencies use + time-based versioning pattern, e.g. AssemblyVersion("1.0.*"). In that case we assume only the version + changed and nothing else. + + Each AssemblyRef is matched against the assembly identities using an exact equality comparison modulo version. + AssemblyRef with lower version in metadata is matched to a PE assembly symbol with the higher version + (provided that the assembly name, culture, PKT and flags are the same) if there is no symbol with the exactly matching version. + If there are multiple symbols with higher versions selects the one with the minimal version among them. + + Matching to a higher version is necessary to support EnC for projects whose P2P dependencies use time-based versioning pattern. + The versions of the dependent projects seen from the IDE will be higher than + the one written in the metadata at the time their respective baselines are built. + + No other unification or further resolution is performed. + + + + + A map of the PE assembly symbol identities to the identities of the original metadata AssemblyRefs. + This map will be used in emit when serializing AssemblyRef table of the delta. For the delta to be compatible with + the original metadata we need to map the identities of the PE assembly symbols back to the original AssemblyRefs (if different). + In other words, we pretend that the versions of the dependencies haven't changed. + + + + + Guarded by . + + + + + Import options of the compilation being built. + + + + + For testing purposes only. + + + + + For testing purposes only. + + + + + Represents a reference to another C# compilation. + + + + + Returns the referenced Compilation. + + + + + Create a metadata reference to a compilation. + + The compilation to reference. + Extern aliases for this reference. + Should interop types be embedded in the created assembly? + + + + Applies C#-specific modification and filtering of s. + + + + + Modifies an input per the given options. For example, the + severity may be escalated, or the may be filtered out entirely + (by returning null). + + The input diagnostic + The maximum warning level to allow. Diagnostics with a higher warning level will be filtered out. + How warning diagnostics should be reported + Whether Nullable Reference Types feature is enabled globally + How specific diagnostics should be reported + A diagnostic updated to reflect the options, or null if it has been filtered out + + + + Take a warning and return the final disposition of the given warning, + based on both command line options and pragmas. The diagnostic options + have precedence in the following order: + 1. Warning level + 2. Command line options (/nowarn, /warnaserror) + 3. Editor config options (syntax tree level) + 4. Global analyzer config options (compilation level) + 5. Global warning level + + Pragmas are considered separately. If a diagnostic would not otherwise + be suppressed, but is suppressed by a pragma, + is true but the diagnostic is not reported as suppressed. + + + + + Allows asking semantic questions about a tree of syntax nodes in a Compilation. Typically, + an instance is obtained by a call to .. + + + An instance of caches local symbols and semantic + information. Thus, it is much more efficient to use a single instance of when asking multiple questions about a syntax tree, because + information from the first question may be reused. This also means that holding onto an + instance of SemanticModel for a long time may keep a significant amount of memory from being + garbage collected. + + + When an answer is a named symbol that is reachable by traversing from the root of the symbol + table, (that is, from an of the ), + that symbol will be returned (i.e. the returned value will be reference-equal to one + reachable from the root of the symbol table). Symbols representing entities without names + (e.g. array-of-int) may or may not exhibit reference equality. However, some named symbols + (such as local variables) are not reachable from the root. These symbols are visible as + answers to semantic questions. When the same SemanticModel object is used, the answers + exhibit reference-equality. + + + + + + The compilation this object was obtained from. + + + + + The root node of the syntax tree that this binding is based on. + + + + + Gets symbol information about a syntax node. This is overridden by various specializations of SemanticModel. + It can assume that CheckSyntaxNode and CanGetSemanticInfo have already been called, as well as that named + argument nodes have been handled. + + The syntax node to get semantic information for. + Options to control behavior. + The cancellation token. + + + + Gets symbol information about the 'Add' method corresponding to an expression syntax within collection initializer. + This is the worker function that is overridden in various derived kinds of Semantic Models. It can assume that + CheckSyntaxNode has already been called and the is in the right place in the syntax tree. + + + + + Gets type information about a syntax node. This is overridden by various specializations of SemanticModel. + It can assume that CheckSyntaxNode and CanGetSemanticInfo have already been called, as well as that named + argument nodes have been handled. + + The syntax node to get semantic information for. + The cancellation token. + + + + Binds the provided expression in the given context. + + The position to bind at. + The expression to bind + How to speculatively bind the given expression. If this is + then the provided expression should be a . + The binder that was used to bind the given syntax. + The symbols used in a cref. If this is not default, then the return is null. + The expression that was bound. If is not default, this is null. + + + + Gets a list of method or indexed property symbols for a syntax node. This is overridden by various specializations of SemanticModel. + It can assume that CheckSyntaxNode and CanGetSemanticInfo have already been called, as well as that named + argument nodes have been handled. + + The syntax node to get semantic information for. + + The cancellation token. + + + + Gets a list of indexer symbols for a syntax node. This is overridden by various specializations of SemanticModel. + It can assume that CheckSyntaxNode and CanGetSemanticInfo have already been called, as well as that named + argument nodes have been handled. + + The syntax node to get semantic information for. + + The cancellation token. + + + + Gets the constant value for a syntax node. This is overridden by various specializations of SemanticModel. + It can assume that CheckSyntaxNode and CanGetSemanticInfo have already been called, as well as that named + argument nodes have been handled. + + The syntax node to get semantic information for. + The cancellation token. + + + + Bind the given expression speculatively at the given position, and return back + the resulting bound node. May return null in some error cases. + + + Keep in sync with Binder.BindCrefParameterOrReturnType. + + + + + Bind the given attribute speculatively at the given position, and return back + the resulting bound node. May return null in some error cases. + + + + + Gets the semantic information for an ordering clause in an orderby query clause. + + + + + Gets the semantic information associated with a select or group clause. + + + + + Gets the SymbolInfo for the Deconstruct method used for a deconstruction pattern clause, if any. + + + + + Returns what symbol(s), if any, the given expression syntax bound to in the program. + + An AliasSymbol will never be returned by this method. What the alias refers to will be + returned instead. To get information about aliases, call GetAliasInfo. + + If binding the type name C in the expression "new C(...)" the actual constructor bound to + will be returned (or all constructor if overload resolution failed). This occurs as long as C + unambiguously binds to a single type that has a constructor. If C ambiguously binds to multiple + types, or C binds to a static class, then type(s) are returned. + + + + + Given a variable designation (typically in the left-hand-side of a deconstruction declaration statement), + figure out its type by looking at the declared symbol of the corresponding variable. + + + + + Returns what 'Add' method symbol(s), if any, corresponds to the given expression syntax + within . + + + + + Returns what symbol(s), if any, the given constructor initializer syntax bound to in the program. + + The syntax node to get semantic information for. + The cancellation token. + + + + Returns what symbol(s), if any, the given constructor initializer syntax bound to in the program. + + The syntax node to get semantic information for. + The cancellation token. + + + + Returns what symbol(s), if any, the given attribute syntax bound to in the program. + + The syntax node to get semantic information for. + The cancellation token. + + + + Gets the semantic information associated with a documentation comment cref. + + + + + Binds the expression in the context of the specified location and gets symbol information. + This method is used to get symbol information about an expression that did not actually + appear in the source code. + + A character position used to identify a declaration scope and + accessibility. This character position must be within the FullSpan of the Root syntax + node in this SemanticModel. + + A syntax node that represents a parsed expression. This syntax + node need not and typically does not appear in the source code referred to by the + SemanticModel instance. + Indicates whether to binding the expression as a full expressions, + or as a type or namespace. If SpeculativeBindingOption.BindAsTypeOrNamespace is supplied, then + expression should derive from TypeSyntax. + The symbol information for the topmost node of the expression. + + The passed in expression is interpreted as a stand-alone expression, as if it + appeared by itself somewhere within the scope that encloses "position". + + is ignored if is within a documentation + comment cref attribute value. + + + + + Bind the attribute in the context of the specified location and get semantic information + such as type, symbols and diagnostics. This method is used to get semantic information about an attribute + that did not actually appear in the source code. + + A character position used to identify a declaration scope and accessibility. This + character position must be within the FullSpan of the Root syntax node in this SemanticModel. In order to obtain + the correct scoping rules for the attribute, position should be the Start position of the Span of the symbol that + the attribute is being applied to. + + A syntax node that represents a parsed attribute. This syntax node + need not and typically does not appear in the source code referred to SemanticModel instance. + The semantic information for the topmost node of the attribute. + + + + Bind the constructor initializer in the context of the specified location and get semantic information + such as type, symbols and diagnostics. This method is used to get semantic information about a constructor + initializer that did not actually appear in the source code. + + NOTE: This will only work in locations where there is already a constructor initializer. + + A character position used to identify a declaration scope and accessibility. This + character position must be within the FullSpan of the Root syntax node in this SemanticModel. + Furthermore, it must be within the span of an existing constructor initializer. + + A syntax node that represents a parsed constructor initializer. This syntax node + need not and typically does not appear in the source code referred to SemanticModel instance. + The semantic information for the topmost node of the constructor initializer. + + + + Bind the constructor initializer in the context of the specified location and get semantic information + about symbols. This method is used to get semantic information about a constructor + initializer that did not actually appear in the source code. + + NOTE: This will only work in locations where there is already a constructor initializer. + + A character position used to identify a declaration scope and accessibility. This + character position must be within the span of an existing constructor initializer. + + A syntax node that represents a parsed constructor initializer. This syntax node + need not and typically does not appear in the source code referred to SemanticModel instance. + The semantic information for the topmost node of the constructor initializer. + + + + Bind the cref in the context of the specified location and get semantic information + such as type, symbols and diagnostics. This method is used to get semantic information about a cref + that did not actually appear in the source code. + + A character position used to identify a declaration scope and accessibility. This + character position must be within the FullSpan of the Root syntax node in this SemanticModel. In order to obtain + the correct scoping rules for the cref, position should be the Start position of the Span of the original cref. + + A syntax node that represents a parsed cref. This syntax node + need not and typically does not appear in the source code referred to SemanticModel instance. + SymbolInfo options. + The semantic information for the topmost node of the cref. + + + + Gets type information about a constructor initializer. + + The syntax node to get semantic information for. + The cancellation token. + + + + Gets type information about an expression. + + The syntax node to get semantic information for. + The cancellation token. + + + + Gets type information about an attribute. + + The syntax node to get semantic information for. + The cancellation token. + + + + Gets the conversion that occurred between the expression's type and type implied by the expression's context. + + + + + Binds the expression in the context of the specified location and gets type information. + This method is used to get type information about an expression that did not actually + appear in the source code. + + A character position used to identify a declaration scope and + accessibility. This character position must be within the FullSpan of the Root syntax + node in this SemanticModel. + + A syntax node that represents a parsed expression. This syntax + node need not and typically does not appear in the source code referred to by the + SemanticModel instance. + Indicates whether to binding the expression as a full expressions, + or as a type or namespace. If SpeculativeBindingOption.BindAsTypeOrNamespace is supplied, then + expression should derive from TypeSyntax. + The type information for the topmost node of the expression. + The passed in expression is interpreted as a stand-alone expression, as if it + appeared by itself somewhere within the scope that encloses "position". + + + + Gets the conversion that occurred between the expression's type and type implied by the expression's context. + + + + + Gets a list of method or indexed property symbols for a syntax node. + + The syntax node to get semantic information for. + The cancellation token. + + + + Gets a list of method or indexed property symbols for a syntax node. + + The syntax node to get semantic information for. + The cancellation token. + + + + Gets a list of method symbols for a syntax node. + + The syntax node to get semantic information for. + The cancellation token. + + + + Returns the list of accessible, non-hidden indexers that could be invoked with the given expression as receiver. + + Potential indexer receiver. + To cancel the computation. + Accessible, non-hidden indexers. + + If the receiver is an indexer expression, the list will contain the indexers that could be applied to the result + of accessing the indexer, not the set of candidates that were considered during construction of the indexer expression. + + + + + Gets the semantic information associated with a query clause. + + + + + If resolves to an alias name, return the AliasSymbol corresponding + to A. Otherwise return null. + + + + + Binds the name in the context of the specified location and sees if it resolves to an + alias name. If it does, return the AliasSymbol corresponding to it. Otherwise, return null. + + A character position used to identify a declaration scope and + accessibility. This character position must be within the FullSpan of the Root syntax + node in this SemanticModel. + + A syntax node that represents a name. This syntax + node need not and typically does not appear in the source code referred to by the + SemanticModel instance. + Indicates whether to binding the name as a full expression, + or as a type or namespace. If SpeculativeBindingOption.BindAsTypeOrNamespace is supplied, then + expression should derive from TypeSyntax. + The passed in name is interpreted as a stand-alone name, as if it + appeared by itself somewhere within the scope that encloses "position". + + + + Gets the binder that encloses the position. + + + + + Gets the MemberSemanticModel that contains the node. + + + + + Given a position, locates the containing token. If the position is actually within the + leading trivia of the containing token or if that token is EOF, moves one token to the + left. Returns the start position of the resulting token. + + This has the effect of moving the position left until it hits the beginning of a non-EOF + token. + + Throws an ArgumentOutOfRangeException if position is not within the root of this model. + + + + + A convenience method that determines a position from a node. If the node is missing, + then its position will be adjusted using CheckAndAdjustPosition. + + + + + Gets the available named symbols in the context of the specified location and optional container. Only + symbols that are accessible and visible from the given location are returned. + + The character position for determining the enclosing declaration scope and + accessibility. + The container to search for symbols within. If null then the enclosing declaration + scope around position is used. + The name of the symbol to find. If null is specified then symbols + with any names are returned. + Consider (reduced) extension methods. + A list of symbols that were found. If no symbols were found, an empty list is returned. + + The "position" is used to determine what variables are visible and accessible. Even if "container" is + specified, the "position" location is significant for determining which members of "containing" are + accessible. + + Labels are not considered (see ). + + Non-reduced extension methods are considered regardless of the value of . + + + + + Gets the available base type members in the context of the specified location. Akin to + calling with the container set to the immediate base type of + the type in which occurs. However, the accessibility rules + are different: protected members of the base type will be visible. + + Consider the following example: + + public class Base + { + protected void M() { } + } + + public class Derived : Base + { + void Test(Base b) + { + b.M(); // Error - cannot access protected member. + base.M(); + } + } + + Protected members of an instance of another type are only accessible if the instance is known + to be "this" instance (as indicated by the "base" keyword). + + The character position for determining the enclosing declaration scope and + accessibility. + The name of the symbol to find. If null is specified then symbols + with any names are returned. + A list of symbols that were found. If no symbols were found, an empty list is returned. + + The "position" is used to determine what variables are visible and accessible. + + Non-reduced extension methods are considered, but reduced extension methods are not. + + + + + Gets the available named static member symbols in the context of the specified location and optional container. + Only members that are accessible and visible from the given location are returned. + + Non-reduced extension methods are considered, since they are static methods. + + The character position for determining the enclosing declaration scope and + accessibility. + The container to search for symbols within. If null then the enclosing declaration + scope around position is used. + The name of the symbol to find. If null is specified then symbols + with any names are returned. + A list of symbols that were found. If no symbols were found, an empty list is returned. + + The "position" is used to determine what variables are visible and accessible. Even if "container" is + specified, the "position" location is significant for determining which members of "containing" are + accessible. + + + + + Gets the available named namespace and type symbols in the context of the specified location and optional container. + Only members that are accessible and visible from the given location are returned. + + The character position for determining the enclosing declaration scope and + accessibility. + The container to search for symbols within. If null then the enclosing declaration + scope around position is used. + The name of the symbol to find. If null is specified then symbols + with any names are returned. + A list of symbols that were found. If no symbols were found, an empty list is returned. + + The "position" is used to determine what variables are visible and accessible. Even if "container" is + specified, the "position" location is significant for determining which members of "containing" are + accessible. + + Does not return NamespaceOrTypeSymbol, because there could be aliases. + + + + + Gets the available named label symbols in the context of the specified location and optional container. + Only members that are accessible and visible from the given location are returned. + + The character position for determining the enclosing declaration scope and + accessibility. + The name of the symbol to find. If null is specified then symbols + with any names are returned. + A list of symbols that were found. If no symbols were found, an empty list is returned. + + The "position" is used to determine what variables are visible and accessible. Even if "container" is + specified, the "position" location is significant for determining which members of "containing" are + accessible. + + + + + Gets the available named symbols in the context of the specified location and optional + container. Only symbols that are accessible and visible from the given location are + returned. + + The character position for determining the enclosing declaration + scope and accessibility. + The container to search for symbols within. If null then the + enclosing declaration scope around position is used. + The name of the symbol to find. If null is specified then symbols + with any names are returned. + Additional options that affect the lookup process. + Ignore 'throughType' in accessibility checking. + Used in checking accessibility of symbols accessed via 'MyBase' or 'base'. + + The "position" is used to determine what variables are visible and accessible. Even if + "container" is specified, the "position" location is significant for determining which + members of "containing" are accessible. + + Throws an argument exception if the passed lookup options are invalid. + + + + Remaps a local, parameter, localfunction, or lambda symbol, if that symbol or its containing + symbols were reinferred. This should only be called when nullable semantic analysis is enabled. + + + + + Determines if the symbol is accessible from the specified location. + + A character position used to identify a declaration scope and + accessibility. This character position must be within the FullSpan of the Root syntax + node in this SemanticModel. + + The symbol that we are checking to see if it accessible. + + True if "symbol is accessible, false otherwise. + + This method only checks accessibility from the point of view of the accessibility + modifiers on symbol and its containing types. Even if true is returned, the given symbol + may not be able to be referenced for other reasons, such as name hiding. + + + + + Field-like events can be used as fields in types that can access private + members of the declaring type of the event. + + + + + Analyze control-flow within a part of a method body. + + The first statement to be included in the analysis. + The last statement to be included in the analysis. + An object that can be used to obtain the result of the control flow analysis. + The two statements are not contained within the same statement list. + + + + Analyze control-flow within a part of a method body. + + The statement to be included in the analysis. + An object that can be used to obtain the result of the control flow analysis. + + + + Analyze data-flow within an . + + The ctor-init within the associated SyntaxTree to analyze. + An object that can be used to obtain the result of the data flow analysis. + + + + Analyze data-flow within an . + + The node within the associated SyntaxTree to analyze. + An object that can be used to obtain the result of the data flow analysis. + + + + Analyze data-flow within an . + + The expression within the associated SyntaxTree to analyze. + An object that can be used to obtain the result of the data flow analysis. + + + + Analyze data-flow within a part of a method body. + + The first statement to be included in the analysis. + The last statement to be included in the analysis. + An object that can be used to obtain the result of the data flow analysis. + The two statements are not contained within the same statement list. + + + + Analyze data-flow within a part of a method body. + + The statement to be included in the analysis. + An object that can be used to obtain the result of the data flow analysis. + + + + Get a SemanticModel object that is associated with a method body that did not appear in this source code. + Given must lie within an existing method body of the Root syntax node for this SemanticModel. + Locals and labels declared within this existing method body are not considered to be in scope of the speculated method body. + + A character position used to identify a declaration scope and accessibility. This + character position must be within the FullSpan of the Root syntax node in this SemanticModel and must be + within the FullSpan of a Method body within the Root syntax node. + A syntax node that represents a parsed method declaration. This method should not be + present in the syntax tree associated with this object, but must have identical signature to the method containing + the given in this SemanticModel. + A SemanticModel object that can be used to inquire about the semantic + information associated with syntax nodes within . + Flag indicating whether a speculative semantic model was created. + Throws this exception if the node is contained any SyntaxTree in the current Compilation + Throws this exception if is null. + Throws this exception if this model is a speculative semantic model, i.e. is true. + Chaining of speculative semantic model is not supported. + + + + Get a SemanticModel object that is associated with a method body that did not appear in this source code. + Given must lie within an existing method body of the Root syntax node for this SemanticModel. + Locals and labels declared within this existing method body are not considered to be in scope of the speculated method body. + + A character position used to identify a declaration scope and accessibility. This + character position must be within the FullSpan of the Root syntax node in this SemanticModel and must be + within the FullSpan of a Method body within the Root syntax node. + A syntax node that represents a parsed accessor declaration. This accessor should not be + present in the syntax tree associated with this object. + A SemanticModel object that can be used to inquire about the semantic + information associated with syntax nodes within . + Flag indicating whether a speculative semantic model was created. + Throws this exception if the node is contained any SyntaxTree in the current Compilation + Throws this exception if is null. + Throws this exception if this model is a speculative semantic model, i.e. is true. + Chaining of speculative semantic model is not supported. + + + + Get a SemanticModel object that is associated with a type syntax node that did not appear in + this source code. This can be used to get detailed semantic information about sub-parts + of a type syntax that did not appear in source code. + + A character position used to identify a declaration scope and accessibility. This + character position must be within the FullSpan of the Root syntax node in this SemanticModel. + + A syntax node that represents a parsed expression. This expression should not be + present in the syntax tree associated with this object. + Indicates whether to bind the expression as a full expression, + or as a type or namespace. + A SemanticModel object that can be used to inquire about the semantic + information associated with syntax nodes within . + Flag indicating whether a speculative semantic model was created. + Throws this exception if the node is contained any SyntaxTree in the current Compilation + Throws this exception if is null. + Throws this exception if this model is a speculative semantic model, i.e. is true. + Chaining of speculative semantic model is not supported. + + + + Get a SemanticModel object that is associated with a statement that did not appear in + this source code. This can be used to get detailed semantic information about sub-parts + of a statement that did not appear in source code. + + A character position used to identify a declaration scope and accessibility. This + character position must be within the FullSpan of the Root syntax node in this SemanticModel. + A syntax node that represents a parsed statement. This statement should not be + present in the syntax tree associated with this object. + A SemanticModel object that can be used to inquire about the semantic + information associated with syntax nodes within . + Flag indicating whether a speculative semantic model was created. + Throws this exception if the node is contained any SyntaxTree in the current Compilation + Throws this exception if is null. + Throws this exception if this model is a speculative semantic model, i.e. is true. + Chaining of speculative semantic model is not supported. + + + + Get a SemanticModel object that is associated with an initializer that did not appear in + this source code. This can be used to get detailed semantic information about sub-parts + of a field initializer or default parameter value that did not appear in source code. + + A character position used to identify a declaration scope and accessibility. This + character position must be within the FullSpan of the Root syntax node in this SemanticModel. + + A syntax node that represents a parsed initializer. This initializer should not be + present in the syntax tree associated with this object. + A SemanticModel object that can be used to inquire about the semantic + information associated with syntax nodes within . + Flag indicating whether a speculative semantic model was created. + Throws this exception if the node is contained any SyntaxTree in the current Compilation. + Throws this exception if is null. + Throws this exception if this model is a speculative semantic model, i.e. is true. + Chaining of speculative semantic model is not supported. + + + + Get a SemanticModel object that is associated with an expression body that did not appear in + this source code. This can be used to get detailed semantic information about sub-parts + of an expression body that did not appear in source code. + + A character position used to identify a declaration scope and accessibility. This + character position must be within the FullSpan of the Root syntax node in this SemanticModel. + + A syntax node that represents a parsed expression body. This node should not be + present in the syntax tree associated with this object. + A SemanticModel object that can be used to inquire about the semantic + information associated with syntax nodes within . + Flag indicating whether a speculative semantic model was created. + Throws this exception if the node is contained any SyntaxTree in the current Compilation. + Throws this exception if is null. + Throws this exception if this model is a speculative semantic model, i.e. is true. + Chaining of speculative semantic model is not supported. + + + + Get a SemanticModel object that is associated with a constructor initializer that did not appear in + this source code. This can be used to get detailed semantic information about sub-parts + of a constructor initializer that did not appear in source code. + + NOTE: This will only work in locations where there is already a constructor initializer. + + A character position used to identify a declaration scope and accessibility. This + character position must be within the FullSpan of the Root syntax node in this SemanticModel. + Furthermore, it must be within the span of an existing constructor initializer. + + A syntax node that represents a parsed constructor initializer. + This node should not be present in the syntax tree associated with this object. + A SemanticModel object that can be used to inquire about the semantic + information associated with syntax nodes within . + Flag indicating whether a speculative semantic model was created. + Throws this exception if the node is contained any SyntaxTree in the current Compilation. + Throws this exception if is null. + Throws this exception if this model is a speculative semantic model, i.e. is true. + Chaining of speculative semantic model is not supported. + + + + Get a SemanticModel object that is associated with a constructor initializer that did not appear in + this source code. This can be used to get detailed semantic information about sub-parts + of a constructor initializer that did not appear in source code. + + NOTE: This will only work in locations where there is already a constructor initializer. + + A character position used to identify a declaration scope and accessibility. This + character position must be within the span of an existing constructor initializer. + + A syntax node that represents a parsed constructor initializer. + This node should not be present in the syntax tree associated with this object. + A SemanticModel object that can be used to inquire about the semantic + information associated with syntax nodes within . + Flag indicating whether a speculative semantic model was created. + Throws this exception if the node is contained any SyntaxTree in the current Compilation. + Throws this exception if is null. + Throws this exception if this model is a speculative semantic model, i.e. is true. + Chaining of speculative semantic model is not supported. + + + + Get a SemanticModel object that is associated with a cref that did not appear in + this source code. This can be used to get detailed semantic information about sub-parts + of a cref that did not appear in source code. + + NOTE: This will only work in locations where there is already a cref. + + A character position used to identify a declaration scope and accessibility. This + character position must be within the FullSpan of the Root syntax node in this SemanticModel. + Furthermore, it must be within the span of an existing cref. + + A syntax node that represents a parsed cref syntax. + This node should not be present in the syntax tree associated with this object. + A SemanticModel object that can be used to inquire about the semantic + information associated with syntax nodes within . + Flag indicating whether a speculative semantic model was created. + Throws this exception if the node is contained any SyntaxTree in the current Compilation. + Throws this exception if is null. + Throws this exception if this model is a speculative semantic model, i.e. is true. + Chaining of speculative semantic model is not supported. + + + + Get a SemanticModel object that is associated with an attribute that did not appear in + this source code. This can be used to get detailed semantic information about sub-parts + of an attribute that did not appear in source code. + + A character position used to identify a declaration scope and accessibility. This + character position must be within the FullSpan of the Root syntax node in this SemanticModel. + A syntax node that represents a parsed attribute. This attribute should not be + present in the syntax tree associated with this object. + A SemanticModel object that can be used to inquire about the semantic + information associated with syntax nodes within . + Flag indicating whether a speculative semantic model was created. + Throws this exception if the node is contained any SyntaxTree in the current Compilation. + Throws this exception if is null. + Throws this exception if this model is a speculative semantic model, i.e. is true. + Chaining of speculative semantic model is not supported. + + + + If this is a speculative semantic model, then returns its parent semantic model. + Otherwise, returns null. + + + + + The SyntaxTree that this object is associated with. + + + + + Determines what type of conversion, if any, would be used if a given expression was + converted to a given type. If isExplicitInSource is true, the conversion produced is + that which would be used if the conversion were done for a cast expression. + + An expression which much occur within the syntax tree + associated with this object. + The type to attempt conversion to. + True if the conversion should be determined as for a cast expression. + Returns a Conversion object that summarizes whether the conversion was + possible, and if so, what kind of conversion it was. If no conversion was possible, a + Conversion object with a false "Exists" property is returned. + To determine the conversion between two types (instead of an expression and a + type), use Compilation.ClassifyConversion. + + + + Determines what type of conversion, if any, would be used if a given expression was + converted to a given type. If isExplicitInSource is true, the conversion produced is + that which would be used if the conversion were done for a cast expression. + + The character position for determining the enclosing declaration + scope and accessibility. + The expression to classify. This expression does not need to be + present in the syntax tree associated with this object. + The type to attempt conversion to. + True if the conversion should be determined as for a cast expression. + Returns a Conversion object that summarizes whether the conversion was + possible, and if so, what kind of conversion it was. If no conversion was possible, a + Conversion object with a false "Exists" property is returned. + To determine the conversion between two types (instead of an expression and a + type), use Compilation.ClassifyConversion. + + + + Determines what type of conversion, if any, would be used if a given expression was + converted to a given type using an explicit cast. + + An expression which much occur within the syntax tree + associated with this object. + The type to attempt conversion to. + Returns a Conversion object that summarizes whether the conversion was + possible, and if so, what kind of conversion it was. If no conversion was possible, a + Conversion object with a false "Exists" property is returned. + To determine the conversion between two types (instead of an expression and a + type), use Compilation.ClassifyConversion. + + + + Determines what type of conversion, if any, would be used if a given expression was + converted to a given type using an explicit cast. + + The character position for determining the enclosing declaration + scope and accessibility. + The expression to classify. This expression does not need to be + present in the syntax tree associated with this object. + The type to attempt conversion to. + Returns a Conversion object that summarizes whether the conversion was + possible, and if so, what kind of conversion it was. If no conversion was possible, a + Conversion object with a false "Exists" property is returned. + To determine the conversion between two types (instead of an expression and a + type), use Compilation.ClassifyConversion. + + + + Given a member declaration syntax, get the corresponding symbol. + + The syntax node that declares a member. + The cancellation token. + The symbol that was declared. + + NOTE: We have no GetDeclaredSymbol overloads for following subtypes of MemberDeclarationSyntax: + NOTE: (1) GlobalStatementSyntax as they don't declare any symbols. + NOTE: (2) IncompleteMemberSyntax as there are no symbols for incomplete members. + NOTE: (3) BaseFieldDeclarationSyntax or its subtypes as these declarations can contain multiple variable declarators. + NOTE: GetDeclaredSymbol should be called on the variable declarators directly. + + + + + Given a local function declaration syntax, get the corresponding symbol. + + The syntax node that declares a member. + The cancellation token. + The symbol that was declared. + + + + Given a compilation unit syntax, get the corresponding Simple Program entry point symbol. + + The compilation unit that declares the entry point member. + The cancellation token. + The symbol that was declared. + + + + Given a namespace declaration syntax node, get the corresponding namespace symbol for + the declaration assembly. + + The syntax node that declares a namespace. + The cancellation token. + The namespace symbol that was declared by the namespace declaration. + + + + Given a namespace declaration syntax node, get the corresponding namespace symbol for + the declaration assembly. + + The syntax node that declares a namespace. + The cancellation token. + The namespace symbol that was declared by the namespace declaration. + + + + Given a type declaration, get the corresponding type symbol. + + The syntax node that declares a type. + The cancellation token. + The type symbol that was declared. + + NOTE: We have no GetDeclaredSymbol overloads for subtypes of BaseTypeDeclarationSyntax as all of them return a NamedTypeSymbol. + + + + + Given a delegate declaration, get the corresponding type symbol. + + The syntax node that declares a delegate. + The cancellation token. + The type symbol that was declared. + + + + Given a enum member declaration, get the corresponding field symbol. + + The syntax node that declares an enum member. + The cancellation token. + The symbol that was declared. + + + + Given a base method declaration syntax, get the corresponding method symbol. + + The syntax node that declares a method. + The cancellation token. + The symbol that was declared. + + NOTE: We have no GetDeclaredSymbol overloads for subtypes of BaseMethodDeclarationSyntax as all of them return a MethodSymbol. + + + + + Given a syntax node that declares a property, indexer or an event, get the corresponding declared symbol. + + The syntax node that declares a property, indexer or an event. + The cancellation token. + The symbol that was declared. + + + + Given a syntax node that declares a property, get the corresponding declared symbol. + + The syntax node that declares a property. + The cancellation token. + The symbol that was declared. + + + + Given a syntax node that declares an indexer, get the corresponding declared symbol. + + The syntax node that declares an indexer. + The cancellation token. + The symbol that was declared. + + + + Given a syntax node that declares a (custom) event, get the corresponding event symbol. + + The syntax node that declares a event. + The cancellation token. + The symbol that was declared. + + + + Given a syntax node of anonymous object creation initializer, get the anonymous object property symbol. + + The syntax node that declares a property. + The cancellation token. + The symbol that was declared. + + + + Given a syntax node of anonymous object creation expression, get the anonymous object type symbol. + + The syntax node that declares an anonymous object. + The cancellation token. + The symbol that was declared. + + + + Given a syntax node of a tuple expression, get the tuple type symbol. + + The tuple expression node. + The cancellation token. + The symbol that was declared. + + + + Given a syntax node of an argument expression, get the declared symbol. + + The argument syntax node. + The cancellation token. + The symbol that was declared. + + Generally ArgumentSyntax nodes do not declare symbols, except when used as arguments of a tuple literal. + Example: var x = (Alice: 1, Bob: 2); + ArgumentSyntax "Alice: 1" declares a tuple element field "(int Alice, int Bob).Alice" + + + + + Given a syntax node that declares a property or member accessor, get the corresponding + symbol. + + The syntax node that declares an accessor. + The cancellation token. + The symbol that was declared. + + + + Given a syntax node that declares an expression body, get the corresponding symbol. + + The syntax node that declares an expression body. + The cancellation token. + The symbol that was declared. + + + + Given a variable declarator syntax, get the corresponding symbol. + + The syntax node that declares a variable. + The cancellation token. + The symbol that was declared. + + + + Given a variable designation syntax, get the corresponding symbol. + + The syntax node that declares a variable. + The cancellation token. + The symbol that was declared. + + + + Given a labeled statement syntax, get the corresponding label symbol. + + The syntax node of the labeled statement. + The cancellation token. + The label symbol for that label. + + + + Given a switch label syntax, get the corresponding label symbol. + + The syntax node of the switch label. + The cancellation token. + The label symbol for that label. + + + + Given a using declaration get the corresponding symbol for the using alias that was + introduced. + + + The cancellation token. + The alias symbol that was declared. + + If the using directive is an error because it attempts to introduce an alias for which an existing alias was + previously declared in the same scope, the result is a newly-constructed AliasSymbol (i.e. not one from the + symbol table). + + + + + Given an extern alias declaration get the corresponding symbol for the alias that was introduced. + + + The cancellation token. + The alias symbol that was declared, or null if a duplicate alias symbol was declared. + + + + Given a parameter declaration syntax node, get the corresponding symbol. + + The syntax node that declares a parameter. + The cancellation token. + The parameter that was declared. + + + + Given a base field declaration syntax, get the corresponding symbols. + + The syntax node that declares one or more fields or events. + The cancellation token. + The symbols that were declared. + + + + Given a type parameter declaration (field or method), get the corresponding symbol + + The cancellation token. + + + + + Given a foreach statement, get the symbol for the iteration variable + + The cancellation token. + + + + + Given a local symbol, gets an updated version of that local symbol adjusted for nullability analysis + if the analysis affects the local. + + The original symbol from initial binding. + + The nullability-adjusted local, or the original symbol if the nullability analysis made no adjustments or was not run. + + + + Given a catch declaration, get the symbol for the exception variable + + The cancellation token. + + + + + Get the query range variable declared in a join into clause. + + + + + Get the query range variable declared in a query continuation clause. + + + + + Returns a list of accessible, non-hidden indexers that could be invoked with the given expression + as a receiver. + + + If the given expression is an indexer access, then this method will return the list of indexers + that could be invoked on the result, not the list of indexers that were considered. + + + + + The method group can contain "duplicate" symbols that we do not want to display in the IDE analysis. + + For example, there could be an overriding virtual method and the method it overrides both in + the method group. This, strictly speaking, is a violation of the C# specification because we are + supposed to strip out overriding methods from the method group before overload resolution; overload + resolution is supposed to treat overridden methods as being methods of the less derived type. However, + in the IDE we want to display information about the overriding method, not the overridden method, and + therefore we leave both in the method group. The overload resolution algorithm has been written + to handle this departure from the specification. + + Similarly, we might have two methods in the method group where one is a "new" method that hides + another. Again, in overload resolution this would be handled by the rule that says that methods + declared on more derived types take priority over methods declared on less derived types. Both + will be in the method group, but in the IDE we want to only display information about the + hiding method, not the hidden method. + + We can also have "diamond" inheritance of interfaces leading to multiple copies of the same + method ending up in the method group: + + interface IB { void M(); } + interface IL : IB {} + interface IR : IB {} + interface ID : IL, IR {} + ... + id.M(); + + We only want to display one symbol in the IDE, even if the member lookup algorithm is unsophisticated + and puts IB.M in the member group twice. (Again, this is a mild spec violation since a method group + is supposed to be a set, without duplicates.) + + Finally, the interaction of multiple inheritance of interfaces and hiding can lead to some subtle + situations. Suppose we make a slight modification to the scenario above: + + interface IL : IB { new void M(); } + + Again, we only want to display one symbol in the method group. The fact that there is a "path" + to IB.M from ID via IR is irrelevant; if the symbol IB.M is hidden by IL.M then it is hidden + in ID, period. + + + + + Get the semantic info of a named argument in an invocation-like expression (e.g. `x` in `M(x: 3)`) + or the name in a Subpattern (e.g. either `Name` in `e is (Name: 3){Name: 3}`). + + + + + Find the first parameter named "argumentName". + + + + + If the call represents an extension method invocation with an explicit receiver, return the original + methods as ReducedExtensionMethodSymbols. Otherwise, return the original methods unchanged. + + + + + If the call represents an extension method with an explicit receiver, return a + ReducedExtensionMethodSymbol if it can be constructed. Otherwise, return the + original call method. + + + + + Gets for each statement info. + + The node. + + + + Gets for each statement info. + + The node. + + + + Gets deconstruction assignment info. + + The node. + + + + Gets deconstruction foreach info. + + The node. + + + + Gets await expression info. + + The node. + + + + If the given node is within a preprocessing directive, gets the preprocessing symbol info for it. + + Preprocessing symbol identifier node. + + + + Options to control the internal working of GetSymbolInfoWorker. Not currently exposed + to public clients, but could be if desired. + + + + + When binding "C" new C(...), return the type C and do not return information about + which constructor was bound to. Bind "new C(...)" to get information about which constructor + was chosen. + + + + + When binding "C" new C(...), return the constructor of C that was bound to, if C unambiguously + binds to a single type with at least one constructor. + + + + + When binding a name X that was declared with a "using X=OtherTypeOrNamespace", return OtherTypeOrNamespace. + + + + + When binding a name X that was declared with a "using X=OtherTypeOrNamespace", return the alias symbol X. + + + + + Given a position in the SyntaxTree for this SemanticModel returns the innermost + NamedType that the position is considered inside of. + + + + + Given a tuple element syntax, get the corresponding symbol. + + The syntax node that declares a tuple element. + The cancellation token. + The symbol that was declared. + + + + The representation of a deconstruction as a tree of Deconstruct methods and conversions. + Methods only appear in non-terminal nodes. All terminal nodes have a Conversion. + + Here's an example: + A deconstruction like (int x1, (long x2, long x3)) = deconstructable1 with + Deconstructable1.Deconstruct(out int y1, out Deconstructable2 y2) and + Deconstructable2.Deconstruct(out int z1, out int z2) is represented as 5 DeconstructionInfo nodes. + + The top-level node has a (Deconstructable1.Deconstruct), no , but has two nodes. + Its first nested node has no , but has a (Identity). + Its second nested node has a (Deconstructable2.Deconstruct), no , and two nodes. + Those last two nested nodes have no , but each have a (ImplicitNumeric, from int to long). + + + + + The Deconstruct method (if any) for this non-terminal position in the deconstruction tree. + + + + + The conversion for a terminal position in the deconstruction tree. + + + + + The children for this deconstruction node. + + + + + Structure containing all semantic information about a for each statement. + + + + + Whether this is an asynchronous foreach. + + + + + Gets the "GetEnumerator" method. + + + + + Gets the "MoveNext" method (or "MoveNextAsync" in an asynchronous foreach). + + + + + Gets the "Current" property. + + + + + Gets the "Dispose" method (or "DisposeAsync" in an asynchronous foreach). + + + + + The intermediate type to which the output of the is converted + before being converted to the iteration variable type. + + + As you might hope, for an array, it is the element type of the array. + + + + + The conversion from the to the iteration variable type. + + + May be user-defined. + + + + + The conversion from the type of the to the . + + + + + Initializes a new instance of the structure. + + + + + A binding for a field initializer, property initializer, constructor + initializer, or a parameter default value. + Represents the result of binding a value expression rather than a + block (for that, use a ). + + + + + Creates a SemanticModel for a true field initializer (field = value) of a named type (incl. Enums). + + + + + Creates a SemanticModel for an autoprop initializer of a named type + + + + + Creates a SemanticModel for a parameter default value. + + + + + Creates a speculative SemanticModel for an initializer node (field initializer, constructor initializer, or parameter default value) + that did not appear in the original source code. + + + + + This is an implementation of a special symbol comparer, which is supposed to be used for sorting + original definition symbols (explicitly or implicitly declared in source within the same compilation) + in lexical order of their declarations. It will not work on anything that uses non-source locations. + + + + + Binding info for expressions and statements that are part of a member declaration. + + + + + Only used when this is a speculative semantic model. + + + + + Field specific to a non-speculative MemberSemanticModel that must have a containing semantic model. + + + + + The member symbol + + + + + This will cause the bound node cache to be populated if nullable semantic analysis is enabled. + + + + + Get the bound node corresponding to the root. + + + + + Get the highest bound node in the tree associated with a particular syntax node. + + + + + Get the lowest bound node in the tree associated with a particular syntax node. Lowest is defined as last + in a pre-order traversal of the bound tree. + + + + + Internal for test purposes only + + + + + This overload exists for callers who already have a node in hand + and don't want to search through the tree. + + + + + Returned binder doesn't need to have set - the caller will add it. + + + + + Performs the same function as GetEnclosingBinder, but is known to take place within a + specified lambda. Walks up the syntax hierarchy until a node with an associated binder + is found. + + + CONSIDER: can this share code with MemberSemanticModel.GetEnclosingBinder? + + Returned binder doesn't need to have set - the caller will add it. + + + + + If we're doing nullable analysis, we need to fully bind this member, and then run + nullable analysis on the resulting nodes before putting them in the map. Nullable + analysis does not run a subset of code, so we need to fully bind the entire member + first + + + + + Rewrites the given bound node with nullability information, and returns snapshots for later speculative analysis at positions inside this member. + + + + + Performs the analysis step of getting nullability information for a semantic model but + does not actually use the results. This gives us extra verification of nullable flow analysis. + It is only used in contexts where nullable analysis is disabled in the compilation but requested + through "run-nullable-analysis=always" or when the compiler is running in DEBUG. + + + + + Get all bounds nodes associated with a node, ordered from highest to lowest in the bound tree. + Strictly speaking, the order is that of a pre-order traversal of the bound tree. + + + + + If the node is an expression, return the nearest parent node + with semantic meaning. Otherwise return null. + + + + + The incremental binder is used when binding statements. Whenever a statement + is bound, it checks the bound node cache to see if that statement was bound, + and returns it instead of rebinding it. + + For example, we might have: + while (x > goo()) + { + y = y * x; + z = z + y; + } + + We might first get semantic info about "z", and thus bind just the statement + "z = z + y". Later, we might bind the entire While block. While binding the while + block, we can reuse the binding we did of "z = z + y". + + + NOTE: any member overridden by this binder should follow the BuckStopsHereBinder pattern. + Otherwise, a subsequent binder in the chain could suppress the caching behavior. + + + + + We override GetBinder so that the BindStatement override is still + in effect on nested binders. + + + + + Walks the bound tree and adds all non compiler generated bound nodes whose syntax matches the given one + to the cache. + + The root of the bound tree. + The cache. + The syntax node where to add bound nodes for. + + + + Decides whether to the add the bound node to the cache or not. + + The bound node. + + + + Allows asking semantic questions about a TypeSyntax (or its descendants) within a member, that did not appear in the original source code. + Typically, an instance is obtained by a call to SemanticModel.TryGetSpeculativeSemanticModel. + + + + + Creates a speculative SemanticModel for a TypeSyntax node at a position within an existing MemberSemanticModel. + + + + + Initial state for a MethodBodySemanticModel. Shared between here and the . Used to make a + with the required syntax and optional precalculated starting state for the model. + + + + + Creates a SemanticModel for the method. + + + + + Creates a speculative SemanticModel for a method body that did not appear in the original source code. + + + + + Creates a speculative SemanticModel for an expression body that did not appear in the original source code. + + + + + Creates a speculative SemanticModel for a constructor initializer that did not appear in the original source code. + + + + + Creates a speculative SemanticModel for a constructor initializer that did not appear in the original source code. + + + + + Semantic information associated with a query clause in a C# query expression. + + + + + The .Cast<T>() operation generated from the query range variable's type restriction, + or null if the type restriction isn't specified. + + + The operation, when present is implemented via . + To access the type, when this is non-null use [0]. + If it is an extension method, it is returned in reduced form. + + + + + The operation (e.g. Select(), Where(), etc) that implements the given clause. + + + The clause can be implemented via , or + or that return a delegate. + If it is an extension method, it is returned in reduced form. + + + + + Allows asking semantic questions about a tree of syntax nodes that did not appear in the original source code. + Typically, an instance is obtained by a call to SemanticModel.TryGetSpeculativeSemanticModel. + + + + + Appends all trees (including any trees from #load'ed files). + + + + + Collects all the trees #load'ed by (as well as + itself) and populates + with all the trees that are safe to remove (not #load'ed by any other tree). + + + + + Allows asking semantic questions about any node in a SyntaxTree within a Compilation. + + + Allows asking semantic questions about any node in a SyntaxTree within a Compilation. + + + + + Note, the name of this field could be somewhat confusing because it is also + used to store models for attributes and default parameter values, which are + not members. + + + + + The compilation this object was obtained from. + + + + + The root node of the syntax tree that this object is associated with. + + + + + The SyntaxTree that this object is associated with. + + + + + Returns true if this is a SemanticModel that ignores accessibility rules when answering semantic questions. + + + + + Gets the enclosing binder associated with the node + + + + + + + Internal for test purposes only + + + + + + + + + + + Given a type declaration, get the corresponding type symbol. + + The syntax node that declares a type. + The cancellation token. + The type symbol that was declared. + + NOTE: We have no GetDeclaredSymbol overloads for subtypes of BaseTypeDeclarationSyntax as all of them return a NamedTypeSymbol. + + + + + Given a delegate declaration, get the corresponding type symbol. + + The syntax node that declares a delegate. + The cancellation token. + The type symbol that was declared. + + + + Given a member declaration syntax, get the corresponding symbol. + + The syntax node that declares a member. + The cancellation token. + The symbol that was declared. + + NOTE: We have no GetDeclaredSymbol overloads for following subtypes of MemberDeclarationSyntax: + NOTE: (1) GlobalStatementSyntax as they don't declare any symbols. + NOTE: (2) IncompleteMemberSyntax as there are no symbols for incomplete members. + NOTE: (3) BaseFieldDeclarationSyntax or its subtypes as these declarations can contain multiple variable declarators. + NOTE: GetDeclaredSymbol should be called on the variable declarators directly. + + + + + Given a local function declaration syntax, get the corresponding symbol. + + The syntax node that declares a member. + The cancellation token. + The symbol that was declared. + + + + Given a enum member declaration, get the corresponding field symbol. + + The syntax node that declares an enum member. + The cancellation token. + The symbol that was declared. + + + + Given a base method declaration syntax, get the corresponding method symbol. + + The syntax node that declares a method. + The cancellation token. + The symbol that was declared. + + NOTE: We have no GetDeclaredSymbol overloads for subtypes of BaseMethodDeclarationSyntax as all of them return a MethodSymbol. + + + + + Given a syntax node that declares a property, indexer or an event, get the corresponding declared symbol. + + The syntax node that declares a property, indexer or an event. + The cancellation token. + The symbol that was declared. + + + + Given a syntax node that declares a property, get the corresponding declared symbol. + + The syntax node that declares a property, indexer or an event. + The cancellation token. + The symbol that was declared. + + + + Given a syntax node that declares an indexer, get the corresponding declared symbol. + + The syntax node that declares an indexer. + The cancellation token. + The symbol that was declared. + + + + Given a syntax node that declares a (custom) event, get the corresponding event symbol. + + The syntax node that declares a event. + The cancellation token. + The symbol that was declared. + + + + Given a syntax node that declares a property or member accessor, get the corresponding symbol. + + The syntax node that declares an accessor. + The cancellation token. + The symbol that was declared. + + + + Finds the member in the containing symbol which is inside the given declaration span. + + + + + Given a variable declarator syntax, get the corresponding symbol. + + The syntax node that declares a variable. + The cancellation token. + The symbol that was declared. + + + + Given a labeled statement syntax, get the corresponding label symbol. + + The syntax node of the labeled statement. + The cancellation token. + The label symbol for that label. + + + + Given a switch label syntax, get the corresponding label symbol. + + The syntax node of the switch label. + The cancellation token. + The label symbol for that label. + + + + Given a using declaration get the corresponding symbol for the using alias that was introduced. + + + The cancellation token. + The alias symbol that was declared. + + If the using directive is an error because it attempts to introduce an alias for which an existing alias was + previously declared in the same scope, the result is a newly-constructed AliasSymbol (i.e. not one from the + symbol table). + + + + + Given an extern alias declaration get the corresponding symbol for the alias that was introduced. + + + The cancellation token. + The alias symbol that was declared, or null if a duplicate alias symbol was declared. + + + + Given a base field declaration syntax, get the corresponding symbols. + + The syntax node that declares one or more fields or events. + The cancellation token. + The field symbols that were declared. + + + + Given a parameter declaration syntax node, get the corresponding symbol. + + The syntax node that declares a parameter. + The cancellation token. + The parameter that was declared. + + + + Given a type parameter declaration (field or method), get the corresponding symbol + + + The cancellation token. + + + + + The type of the expression represented by the syntax node. For expressions that do not + have a type, null is returned. If the type could not be determined due to an error, than + an object derived from ErrorTypeSymbol is returned. + + + + + The type of the expression after it has undergone an implicit conversion. If the type + did not undergo an implicit conversion, returns the same as Type. + + + + + If the expression underwent an implicit conversion, return information about that + conversion. Otherwise, returns an identity conversion. + + + + + Manages anonymous types created in owning compilation. All requests for + anonymous type symbols go via the instance of this class. + + + Manages anonymous types created on module level. All requests for anonymous type symbols + go via the instance of this class, the symbol will be either created or returned from cache. + + + + + Represents an anonymous type constructor. + + + + + Represents a getter for anonymous type property. + + + + + Represents an anonymous type 'Equals' method. + + + + + Represents an anonymous type 'GetHashCode' method. + + + + + Represents an anonymous type 'ToString' method. + + + + + Current compilation + + + + + Given anonymous type descriptor provided constructs an anonymous type symbol. + + + + + Get a symbol of constructed anonymous type property by property index + + + + + Retrieves anonymous type field types. + + + + + Given an anonymous type and new field types construct a new anonymous type symbol; + a new type symbol will reuse type descriptor from the constructed type with new type arguments. + + + + + Reports all use site errors in special or well known symbols required for anonymous types + + true if there was at least one error + + + + Cache of created anonymous type templates used as an implementation of anonymous + types in emit phase. + + + + + Maps delegate signature shape (number of parameters and their ref-ness) to a synthesized generic delegate symbol. + Currently used for dynamic call-sites and inferred delegate types whose signature doesn't match any of the well-known Func or Action types. + + + + + Given anonymous type provided constructs an implementation type symbol to be used in emit phase; + if the anonymous type has at least one field the implementation type symbol will be created based on + a generic type template generated for each 'unique' anonymous type structure, otherwise the template + type will be non-generic. + + + + + Resets numbering in anonymous type names and compiles the + anonymous type methods. Also seals the collection of templates. + + + + + The set of anonymous type templates created by + this AnonymousTypeManager, in fixed order. + + + + + The set of synthesized delegates created by + this AnonymousTypeManager. + + + + + Returns all templates owned by this type manager + + + + + Returns true if the named type is an implementation template for an anonymous type + + + + + Retrieves methods of anonymous type template which are not placed to symbol table. + In current implementation those are overridden 'ToString', 'Equals' and 'GetHashCode' + + + + + Translates anonymous type public symbol into an implementation type symbol to be used in emit. + + + + + Translates anonymous type method symbol into an implementation method symbol to be used in emit. + + + + + Comparator being used for stable ordering in anonymous type or delegate indices. + + + + Anonymous type manager owning this template + + + Anonymous type descriptor + + + + Represents an anonymous type 'public' symbol which is used in binding and lowering. + In emit phase it is being substituted with implementation symbol. + + + + Properties defined in the type + + + Maps member names to symbol(s) + + + + True if any of the delegate parameter types or return type are + fixed types rather than type parameters. + + + + + A delegate type where the parameter types and return type + of the delegate signature are type parameters. + + + + + A delegate type where at least one of the parameter types or return type + of the delegate signature is a fixed type not a type parameter. + + + + + Represents a baking field for an anonymous type template property symbol. + + + + + Represents an anonymous type template's property symbol. + + + + + Represents a base implementation for anonymous type synthesized methods. + + + + + Represents an anonymous type 'template' which is a generic type to be used for all + anonymous types having the same structure, i.e. the same number of fields and field names. + + + + This list consists of synthesized method symbols for ToString, + Equals and GetHashCode which are not part of symbol table + + + Properties defined in the template + + + Maps member names to symbol(s) + + + + Returns a synthesized debugger display attribute or null if one + could not be synthesized. + + + + Name to be used as metadata name during emit + + + Smallest location of the template, actually contains the smallest location + of all the anonymous type instances created using this template during EMIT + + + Anonymous type manager owning this template + + + + Smallest location of the template, actually contains the smallest location + of all the anonymous type instances created using this template during EMIT; + + NOTE: if this property is queried, smallest location must not be null. + + + + + In emit phase every time a created anonymous type is referenced we try to store the lowest + location of the template. It will be used for ordering templates and assigning emitted type names. + + + + + Represents an anonymous type template's type parameter. + + + + + Represents a compiler generated synthesized method symbol + representing string switch hash function + + + + + Compute the hashcode of a sub string using FNV-1a + See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + + + This method should be kept consistent with MethodBodySynthesizer.ConstructStringSwitchHashFunctionBody + The control flow in this method mimics lowered "for" loop. It is exactly what we want to emit + to ensure that JIT can do range check hoisting. + + + + + This method should be kept consistent with + + + + + The synthesized method for computing the hash from a ReadOnlySpan<char> or Span<char>. + Matches the corresponding method for string . + + + + + This method should be kept consistent with + + + + + When C# interface implementation differs from CLR interface implementation, + we insert a synthesized explicit interface implementation that delegates + to the method that C# considers an implicit implementation. + There are two key scenarios for this: + 1) A single source method is implicitly implementing one or more interface + methods from metadata and the interface methods have different custom + modifiers. In this case, we explicitly implement the interface methods + and have (all) implementations delegate to the source method. + 2) A non-virtual, non-source method in a base type is implicitly implementing + an interface method. Since we can't change the "virtualness" of the + non-source method, we introduce an explicit implementation that delegates + to it instead. + + + + + Given a SynthesizedExplicitImplementationMethod (effectively a tuple (interface method, implementing method, implementing type)), + construct a BoundBlock body. Consider the tuple (Interface.Goo, Base.Goo, Derived). The generated method will look like: + + R Interface.Goo<T1, T2, ...>(A1 a1, A2 a2, ...) + { + //don't return the output if the return type is void + return this.Goo<T1, T2, ...>(a1, a2, ...); + } + + + + + If a sealed override property defines fewer accessors than the + original virtual property, it is necessary to synthesize a sealed + accessor so that the accessor will not be overridable from metadata. + + + + + Given a SynthesizedSealedPropertyAccessor (an accessor with a reference to the accessor it overrides), + construct a BoundBlock body. + + + + + a bound node rewriter that rewrites types properly (which in some cases the automatically-generated + base class does not). This is used in the lambda rewriter, the iterator rewriter, and the async rewriter. + + + + + A wrapper method that is created for non-virtually calling a base-class + virtual method from other classes (like those created for lambdas...). + + + + + Given a SynthesizedSealedPropertyAccessor (an accessor with a reference to the accessor it overrides), + construct a BoundBlock body. + + + + A not-null collection of synthesized methods generated for the current source type. + + + + Returns true if the specified local/parameter needs to be hoisted to a field. + Variable may be hoisted even if it is not captured, to improve debugging experience. + + + + + Contains methods related to synthesizing bound nodes in lowered form + that does not need any processing before passing to codegen + + + + + Given a set of fields, produce an expression that is true when all of the given fields on + `this` are equal to the fields on according to the + default EqualityComparer. + + + + + Construct a body for a method containing a call to a single other method with the same signature (modulo name). + + Bound node factory. + Method to invoke in constructed body. + True for "base.", false for "this.". + Body for implementedMethod. + + + + An ArrayTypeSymbol represents an array type, such as int[] or object[,]. + + + + + Gets the number of dimensions of the array. A regular single-dimensional array + has rank 1, a two-dimensional array has rank 2, etc. + + + + + Is this a zero-based one-dimensional array, i.e. SZArray in CLR terms. + + + + + Specified sizes for dimensions, by position. The length can be less than , + meaning that some trailing dimensions don't have the size specified. + The most common case is none of the dimensions have the size specified - an empty array is returned. + + + + + Specified lower bounds for dimensions, by position. The length can be less than , + meaning that some trailing dimensions don't have the lower bound specified. + The most common case is all dimensions are zero bound - a default array is returned in this case. + + + + + Note, equality should be checked separately!!! + + + + + Normally C# arrays have default sizes and lower bounds - sizes are not specified and all dimensions are zero bound. + This property should return false for any deviations. + + + + + Gets the type of the elements stored in the array along with its annotations. + + + + + Gets the type of the elements stored in the array. + + + + + Represents SZARRAY - zero-based one-dimensional array + + + + + SZArray is an array type encoded in metadata with ELEMENT_TYPE_SZARRAY (always single-dim array with 0 lower bound). + Non-SZArray type is encoded in metadata with ELEMENT_TYPE_ARRAY and with optional sizes and lower bounds. Even though + non-SZArray can also be a single-dim array with 0 lower bound, the encoding of these types in metadata is distinct. + + + + + Represents MDARRAY - multi-dimensional array (possibly of rank 1) + + + + + Represents an attribute applied to a Symbol. + + + + + Gets the attribute class being applied. + + + + + Gets the constructor used in this application of the attribute. + + + + + Gets a reference to the source for this application of the attribute. Returns null for applications of attributes on metadata Symbols. + + + + + Gets the list of constructor arguments specified by this application of the attribute. This list contains both positional arguments + and named arguments that are formal parameters to the constructor. + + + + + Gets the list of named field or property value arguments specified by this application of the attribute. + + + + + Compares the namespace and type name with the attribute's namespace and type name. + Returns true if they are the same. + + + + + Checks if an applied attribute with the given attributeType matches the namespace name and type name of the given early attribute's description + and the attribute description has a signature with parameter count equal to the given attribute syntax's argument list count. + NOTE: We don't allow early decoded attributes to have optional parameters. + + + + + Returns the that represents the current AttributeData. + + A that represents the current AttributeData. + + + + Gets the attribute class being applied as an + + + + + Gets the constructor used in this application of the attribute as an . + + + + + Gets a reference to the source for this application of the attribute. Returns null for applications of attributes on metadata Symbols. + + + + + Decodes PermissionSetAttribute applied in source to determine if it needs any fixup during codegen. + + + PermissionSetAttribute needs fixup when it contains an assignment to the 'File' property as a single named attribute argument. + Fixup performed is ported from SecurityAttributes::FixUpPermissionSetAttribute. + It involves following steps: + 1) Verifying that the specified file name resolves to a valid path. + 2) Reading the contents of the file into a byte array. + 3) Convert each byte in the file content into two bytes containing hexadecimal characters. + 4) Replacing the 'File = fileName' named argument with 'Hex = hexFileContent' argument, where hexFileContent is the converted output from step 3) above. + + Step 1) is performed in this method, i.e. during binding. + Remaining steps are performed during serialization as we want to avoid retaining the entire file contents throughout the binding/codegen pass. + See for remaining fixup steps. + + String containing the resolved file path if PermissionSetAttribute needs fixup during codegen, null otherwise. + + + + This method determines if an applied attribute must be emitted. + Some attributes appear in symbol model to reflect the source code, + but should not be emitted. + + + + + Represents a custom modifier (modopt/modreq). + + + + + A type used as a tag that indicates which type of modification applies. + + + + + Represents an event. + + + + + The original definition of this symbol. If this symbol is constructed from another + symbol by type substitution then OriginalDefinition gets the original symbol as it was defined in + source or metadata. + + + + + The type of the event along with its annotations. + + + + + The type of the event. + + + + + The 'add' accessor of the event. Null only in error scenarios. + + + + + The 'remove' accessor of the event. Null only in error scenarios. + + + + + Returns true if this symbol requires an instance reference as the implicit receiver. This is false if the symbol is static. + + + + + True if this is a Windows Runtime-style event. + + A normal C# event, "event D E", has accessors + void add_E(D d) + void remove_E(D d) + + A Windows Runtime event, "event D E", has accessors + EventRegistrationToken add_E(D d) + void remove_E(EventRegistrationToken t) + + + + + True if the event itself is excluded from code coverage instrumentation. + True for source events marked with . + + + + + True if this symbol has a special name (metadata flag SpecialName is set). + + + + + Gets the attributes on event's associated field, if any. + Returns an empty if + there are no attributes. + + + This publicly exposes the attributes of the internal backing field. + + + + + Returns the overridden event, or null. + + + + + Source: Was the member name qualified with a type name? + Metadata: Is the member an explicit implementation? + + + Will not always agree with ExplicitInterfaceImplementations.Any() + (e.g. if binding of the type part of the name fails). + + + + + Returns interface events explicitly implemented by this event. + + + Events imported from metadata can explicitly implement more than one event. + + + + + Gets the kind of this symbol. + + + + + Implements visitor pattern. + + + + + Represents a field in a class, struct or enum + + + + + The original definition of this symbol. If this symbol is constructed from another + symbol by type substitution then OriginalDefinition gets the original symbol as it was defined in + source or metadata. + + + + + Gets the type of this field along with its annotations. + + + + + Gets the type of this field. + + + + + If this field serves as a backing variable for an automatically generated + property or a field-like event, returns that + property/event. Otherwise returns null. + Note, the set of possible associated symbols might be expanded in the future to + reflect changes in the languages. + + + + + Returns true if this field was declared as "readonly". + + + + + Returns true if this field was declared as "volatile". + + + + + Returns true if this symbol requires an instance reference as the implicit receiver. This is false if the symbol is static. + + + + + Returns true if this field was declared as "fixed". + Note that for a fixed-size buffer declaration, this.Type will be a pointer type, of which + the pointed-to type will be the declared element type of the fixed-size buffer. + + + + + If IsFixedSizeBuffer is true, the value between brackets in the fixed-size-buffer declaration. + If IsFixedSizeBuffer is false FixedSize is 0. + Note that for fixed-a size buffer declaration, this.Type will be a pointer type, of which + the pointed-to type will be the declared element type of the fixed-size buffer. + + + + + If this.IsFixedSizeBuffer is true, returns the underlying implementation type for the + fixed-size buffer when emitted. Otherwise returns null. + + + + + Returns true when field is a backing field for a captured frame pointer (typically "this"). + + + + + Returns true if this field was declared as "const" (i.e. is a constant declaration). + Also returns true for an enum member. + + + + + Returns false if the field wasn't declared as "const", or constant value was omitted or erroneous. + True otherwise. + + + + + If IsConst returns true, then returns the constant value of the field or enum member. If IsConst returns + false, then returns null. + + + + + Gets the kind of this symbol. + + + + + Returns false because field can't be abstract. + + + + + Returns false because field can't be defined externally. + + + + + Returns false because field can't be overridden. + + + + + Returns false because field can't be sealed. + + + + + Returns false because field can't be virtual. + + + + + True if this symbol has a special name (metadata flag SpecialName is set). + + + + + True if this symbol has a runtime-special name (metadata flag RuntimeSpecialName is set). + + + + + True if this field is not serialized (metadata flag NotSerialized is set). + + + + + True if this field has a pointer type. + + + By default we defer to this.Type.IsPointerOrFunctionPointer() + However in some cases this may cause circular dependency via binding a + pointer that points to the type that contains the current field. + Fortunately in those cases we do not need to force binding of the field's type + and can just check the declaration syntax if the field type is not yet known. + + + + + Describes how the field is marshalled when passed to native code. + Null if no specific marshalling information is available for the field. + + PE symbols don't provide this information and always return null. + + + + Returns the marshalling type of this field, or 0 if marshalling information isn't available. + + + By default this information is extracted from if available. + Since the compiler does only need to know the marshalling type of symbols that aren't emitted + PE symbols just decode the type from metadata and don't provide full marshalling information. + + + + + Offset assigned to the field when the containing type is laid out by the VM. + Null if unspecified. + + + + + Returns true if this field is required to be set in an object initializer on object creation. + + + + + Returns true if the error code is highest priority while calculating use site error for this symbol. + + + + + Returns True when field symbol is not mapped directly to a field in the underlying tuple struct. + + + + + Returns true if this is a field representing a Default element like Item1, Item2... + + + + + If this is a field of a tuple type, return corresponding underlying field from the + tuple underlying type. Otherwise, null. In case of a malformed underlying type + the corresponding underlying field might be missing, return null in this case too. + + + + + If this field represents a tuple element, returns a corresponding default element field. + Otherwise returns null. + + + + + Returns true if a given field is a tuple element + + + + + If this is a field representing a tuple element, + returns the index of the element (zero-based). + Otherwise returns -1 + + + + + We need to be able to differentiate between a FunctionPointer used as a type and a function pointer used + as a StandaloneMethodSig. To do this, we wrap the in a + , to hide its implementation of . + + + + + Creates a function pointer from individual parts. This method should only be used when diagnostics are not needed. This is + intended for use in test code. + + + + + Creates a function pointer from individual parts. This method should only be used when diagnostics are not needed. + + + + + For scenarios such as overriding with differing ref kinds (such as out vs in or ref) + we need to compare function pointer parameters assuming that Ref matches RefReadonly/In + and Out. This is done because you cannot overload on ref vs out vs in in regular method + signatures, and we are disallowing similar overloads in source with function pointers. + + + + + For scenarios such as overriding with differing ref kinds (such as out vs in or ref) + we need to compare function pointer parameters assuming that Ref matches RefReadonly/In + and Out. For that reason, we must also ensure that GetHashCode returns equal hashcodes + for types that only differ by the type of ref they have. + + + + + Return true if the given type is valid as a calling convention modifier type. + + + + + Represents a method or method-like symbol (including constructor, + destructor, operator, or property/event accessor). + + + + + This method indicates whether or not the runtime will regard the method + as newslot (as indicated by the presence of the "newslot" modifier in the + signature). + WARN WARN WARN: We won't have a final value for this until declaration + diagnostics have been computed for all s, so pass + ignoringInterfaceImplementationChanges: true if you need a value sooner + and aren't concerned about tweaks made to satisfy interface implementation + requirements. + NOTE: Not ignoring changes can only result in a value that is more true. + + + + + This method indicates whether or not the runtime will regard the method + as virtual (as indicated by the presence of the "virtual" modifier in the + signature). + WARN WARN WARN: We won't have a final value for this until declaration + diagnostics have been computed for all s, so pass + ignoringInterfaceImplementationChanges: true if you need a value sooner + and aren't concerned about tweaks made to satisfy interface implementation + requirements. + NOTE: Not ignoring changes can only result in a value that is more true. + + + + + The original definition of this symbol. If this symbol is constructed from another + symbol by type substitution then OriginalDefinition gets the original symbol as it was defined in + source or metadata. + + + + + Gets what kind of method this is. There are several different kinds of things in the + C# language that are represented as methods. This property allow distinguishing those things + without having to decode the name of the method. + + + + + Returns the arity of this method, or the number of type parameters it takes. + A non-generic method has zero arity. + + + + + Returns whether this method is generic; i.e., does it have any type parameters? + + + + + Returns true if this symbol requires an instance reference as the implicit receiver. This is false if the symbol is static, or a + + + + + True if the method itself is excluded from code coverage instrumentation. + True for source methods marked with . + + + + + If a method is annotated with `[MemberNotNull(...)]` attributes, returns the list of members + listed in those attributes. + Otherwise, an empty array. + + + + + Returns the data for this method, if there is any. If forceComplete + is false and the data has not yet been loaded or only early attribute binding has occurred, then either + or + will be returned, respectively. + If passing true for forceComplete, ensure that cycles will not occur by not calling in the process of binding + an attribute argument. + + + + + Returns true if this method is an extension method. + + + + + True if this symbol has a special name (metadata flag SpecialName is set). + + + + + Misc implementation metadata flags (ImplFlags in metadata). + + + + + True if the type has declarative security information (HasSecurity flags). + + + + + Platform invoke information, or null if the method isn't a P/Invoke. + + + + + Declaration security information associated with this type, or null if there is none. + + + + + Marshalling information for return value (FieldMarshal in metadata). + + + + + True if the method calls another method containing security code (metadata flag RequiresSecurityObject is set). + + + A method can me marked as RequiresSecurityObject by applying the DynamicSecurityMethodAttribute in source. + DynamicSecurityMethodAttribute is a pseudo custom attribute defined as an internal class in System.Security namespace. + This attribute is set on certain security methods defined within mscorlib. + + + + + Returns true if this method hides base methods by name. This cannot be specified directly + in the C# language, but can be true for methods defined in other languages imported from + metadata. The equivalent of the "hidebyname" flag in metadata. + + + + + Returns whether this method is using CLI VARARG calling convention. This is used for C-style variable + argument lists. This is used extremely rarely in C# code and is represented using the undocumented "__arglist" keyword. + + Note that methods with "params" on the last parameter are indicated with the "IsParams" property on ParameterSymbol, and + are not represented with this property. + + + + + Returns whether this built-in operator checks for integer overflow. + + + + + Returns true if this method has no return type; i.e., returns "void". + + + + + Source: Returns whether this method is async; i.e., does it have the async modifier? + Metadata: Returns false; methods from metadata cannot be async. + + + + + Indicates whether or not the method returns by reference + + + + + Indicates whether or not the method returns by ref readonly + + + + + Gets the ref kind of the method's return value + + + + + Gets the return type of the method along with its annotations + + + + + Gets the return type of the method + + + + + Flow analysis annotations on the method itself (ie. DoesNotReturn) + + + + + Returns the type arguments that have been substituted for the type parameters. + If nothing has been substituted for a given type parameter, + then the type parameter itself is consider the type argument. + + + + + Get the type parameters on this method. If the method has not generic, + returns an empty list. + + + + + Call and throw if it returns false. + + + + + True if this type supports retrieving the this parameter + and false otherwise. Note that a return value of true does not guarantee a non-null + (e.g. fails for static methods). + + + + + Optimization: in many cases, the parameter count (fast) is sufficient and we + don't need the actual parameter symbols (slow). + + + The default implementation is always correct, but may be unnecessarily slow. + + + + + Gets the parameters of this method. If this method has no parameters, returns + an empty list. + + + + + Returns the method symbol that this method was constructed from. The resulting + method symbol + has the same containing type (if any), but has type arguments that are the same + as the type parameters (although its containing type might not). + + + + + Source: Was the member name qualified with a type name? + Metadata: Is the member an explicit implementation? + + + Will not always agree with ExplicitInterfaceImplementations.Any() + (e.g. if binding of the type part of the name fails). + + + + + Indicates whether the method is declared readonly, i.e. + whether the 'this' receiver parameter is 'ref readonly'. + See also + + + + + Indicates whether the accessor is marked with the 'init' modifier. + + + + + Indicates whether the method is effectively readonly, + by either the method or the containing type being marked readonly. + + + + + Returns interface methods explicitly implemented by this method. + + + Methods imported from metadata can explicitly implement more than one method, + that is why return type is ImmutableArray. + + + + + Custom modifiers associated with the ref modifier, or an empty array if there are none. + + + + + Gets the attributes on method's return type. + Returns an empty array if there are no attributes. + + + + + If this method has MethodKind of MethodKind.PropertyGet or MethodKind.PropertySet, + returns the property that this method is the getter or setter for. + If this method has MethodKind of MethodKind.EventAdd or MethodKind.EventRemove, + returns the event that this method is the adder or remover for. + Note, the set of possible associated symbols might be expanded in the future to + reflect changes in the languages. + + + + + Returns the original virtual or abstract method which a given method symbol overrides, + ignoring any other overriding methods in base classes. + + The search must respect accessibility from this type. + + + + Returns the original virtual or abstract method which a given method symbol overrides, + ignoring any other overriding methods in base classes. + + The search must respect accessibility from this type. + The returned method must have the same return type. + + + + Returns the original virtual or abstract method which a given method symbol overrides, + ignoring any other overriding methods in base classes. + Also, if the given method symbol is generic then the resulting virtual or abstract method is constructed with the + same type arguments as the given method. + + The returned method must have the same return type. + + + + If this method overrides another method (because it both had the override modifier + and there correctly was a method to override), returns the overridden method. + Note that if an overriding method D.M overrides C.M, which in turn overrides + virtual method A.M, the "overridden method" of D.M is C.M, not the original virtual + method A.M. Note also that constructed generic methods are not considered to + override anything. + + + + + Returns true if calls to this method are omitted in this syntax tree. Calls are omitted + when the called method is a partial method with no implementation part, or when the + called method is a conditional method whose condition is not true in the source file + corresponding to the given syntax tree. + + + + + Calls are conditionally omitted if both the following requirements are true: + (a) IsConditional == true, i.e. it has at least one applied/inherited conditional attribute AND + (b) None of conditional symbols corresponding to these conditional attributes are defined in the given syntaxTree. + + + Forces binding and decoding of attributes. + + + + + Returns a sequence of preprocessor symbols specified in applied on this symbol, or null if there are none. + + + + + Returns a flag indicating whether this symbol has at least one applied/inherited conditional attribute. + + + Forces binding and decoding of attributes. + + + + + Returns true if this is a constructor attributed with HasSetsRequiredMembers + + + + + Some method kinds do not participate in overriding/hiding (e.g. constructors). + + + + + Returns value 'Method' of the + + + + + Returns true if this symbol represents a constructor of a script class. + + + + + Returns if the method is implicit constructor (normal and static) + + + + + Returns if the method is implicit instance constructor + + + + + Returns true if this symbol represents a constructor of an interactive submission class. + + + + + Determines whether this method is a candidate for a default assembly entry point + (i.e. it is a static method called "Main"). + + + + + If this is an extension method that can be applied to a receiver of the given type, + returns a reduced extension method symbol thus formed. Otherwise, returns null. + + The compilation in which constraints should be checked. + Should not be null, but if it is null we treat constraints as we would in the latest + language version. + + + + If this is an extension method, returns a reduced extension method + symbol representing the method. Otherwise, returns null. + + + + + If this method is a reduced extension method, returns the extension method that + should be used at call site during ILGen. Otherwise, returns null. + + + + + If this is a partial method declaration without a body, and the method also + has a part that implements it with a body, returns that implementing + definition. Otherwise null. + + + + + If this is a partial method with a body, returns the corresponding + definition part (without a body). Otherwise null. + + + + + If this method is a reduced extension method, gets the extension method definition that + this method was reduced from. Otherwise, returns null. + + + + + If this method can be applied to an object, returns the type of object it is applied to. + + + + + If this method is a reduced extension method, returns a type inferred during reduction process for the type parameter. + + Type parameter of the corresponding method. + Inferred type or Nothing if nothing was inferred. + If this is not a reduced extension method. + If is null. + If doesn't belong to the corresponding method. + + + + Apply type substitution to a generic method to create a method symbol with the given type parameters supplied. + + + + + + + Apply type substitution to a generic method to create a method symbol with the given type parameters supplied. + + + + + + + As a performance optimization, cache parameter types and refkinds - overload resolution uses them a lot. + + + + + Null if no parameter is ref/out. Otherwise the RefKind for each parameter. + + + + + Returns the map from type parameters to type arguments. + If this is not a generic method instantiation, returns null. + The map targets the original definition of the method. + + + + + Determines if this method is a valid target for UnmanagedCallersOnly, reporting an error in the given diagnostic + bag if it is not null. and should both be null, or + neither should be null. If an error would be reported (whether or not diagnostics is null), true is returned. + + + + + Returns true if the error code is highest priority while calculating use site error for this symbol. + + + + + If the method was written as an iterator method (i.e. with yield statements in its body) returns the + element type of the iterator. Otherwise returns default(TypeWithAnnotations). + + + + + Generates bound block representing method's body for methods in lowered form and adds it to + a collection of method bodies of the current module. This method is supposed to only be + called for method symbols which return SynthesizesLoweredBoundBody == true. + + + + + Returns true for synthesized symbols which generate synthesized body in lowered form + + + + + Return true iff the method contains user code. + + + + + Calculates a syntax offset for a local (user-defined or long-lived synthesized) declared at . + Must be implemented by all methods that may contain user code. + + + Syntax offset is a unique identifier for the local within the emitted method body. + It's based on position of the local declarator. In single-part method bodies it's simply the distance + from the start of the method body syntax span. If a method body has multiple parts (such as a constructor + comprising of code for member initializers and constructor initializer calls) the offset is calculated + as if all source these parts were concatenated together and prepended to the constructor body. + The resulting syntax offset is then negative for locals defined outside of the constructor body. + + + + + Build and add synthesized return type attributes for this method symbol. + + + + + Returns true if locals are to be initialized + + + + + Represents a type other than an array, a pointer, a type parameter, and dynamic. + + + + + Gets the set of interfaces to emit on this type. This set can be different from the set returned by Interfaces property. + + + + + Add the type to the builder and then recurse on its interfaces. + + + Pre-order depth-first search. + + + + + To represent a gap in interface's v-table null value should be returned in the appropriate position, + unless the gap has a symbol (happens if it is declared in source, for example). + + + + + if uninitialized. if there are errors. if + there are no required members. Otherwise, the required members. + + + + + Returns the arity of this type, or the number of type parameters it takes. + A non-generic type has zero arity. + + + + + Returns the type parameters that this type has. If this is a non-generic type, + returns an empty ImmutableArray. + + + + + Returns the type arguments that have been substituted for the type parameters. + If nothing has been substituted for a give type parameters, + then the type parameter itself is consider the type argument. + + + + + Returns the type symbol that this type was constructed from. This type symbol + has the same containing type (if any), but has type arguments that are the same + as the type parameters (although its containing type might not). + + + + + For enum types, gets the underlying type. Returns null on all other + kinds of types. + + + + + Returns true for a struct type containing a cycle. + This property is intended for flow analysis only + since it is only implemented for source types. + + + + + Is this a NoPia local type explicitly declared in source, i.e. + top level type with a TypeIdentifier attribute on it? + + + + + Returns true and a string from the first GuidAttribute on the type, + the string might be null or an invalid guid representation. False, + if there is no GuidAttribute with string argument. + + + + + For delegate types, gets the delegate's invoke method. Returns null on + all other kinds of types. Note that it is possible to have an ill-formed + delegate type imported from metadata which does not have an Invoke method. + Such a type will be classified as a delegate but its DelegateInvokeMethod + would be null. + + + + + Get the operators for this type by their metadata name + + + + + Get the instance constructors for this type. + + + + + Get the static constructors for this type. + + + + + Get the instance and static constructors for this type. + + + + + Get the indexers for this type. + + + Won't include indexers that are explicit interface implementations. + + + + + Returns true if this type might contain extension methods. If this property + returns false, there are no extension methods in this type. + + + This property allows the search for extension methods to be narrowed quickly. + + + + + Returns true if this type is known to be a reference type. It is never the case that + IsReferenceType and IsValueType both return true. However, for an unconstrained type + parameter, IsReferenceType and IsValueType will both return false. + + + + + Returns true if this type is known to be a value type. It is never the case that + IsReferenceType and IsValueType both return true. However, for an unconstrained type + parameter, IsReferenceType and IsValueType will both return false. + + + + + Gets the associated attribute usage info for an attribute type. + + + + + Returns true if the type is a Script class. + It might be an interactive submission class or a Script class in a csx file. + + + + + Returns true if the type is the implicit class that holds onto invalid global members (like methods or + statements in a non script file). + + + + + Gets the name of this symbol. Symbols without a name return the empty string; null is + never returned. + + + + + Return the name including the metadata arity suffix. + + + + + If this type is a file-local type, returns an identifier for the file this type was declared in. Otherwise, returns null. + + + + + Should the name returned by Name property be mangled with [`arity] suffix in order to get metadata name. + Must return False for a type with Arity == 0. + + + Some types with Arity > 0 still have MangleName == false. For example, EENamedTypeSymbol. + Note that other differences between source names and metadata names exist and are not controlled by this property, + such as the 'AssociatedFileIdentifier' prefix for file types. + + + + + Collection of names of members declared within this type. May return duplicates. + + + + + True if this type declares any required members. It does not recursively check up the tree for _all_ required members. + + + + + Whether the type encountered an error while trying to build its complete list of required members. + + + + + Returns true if there are any required members. Prefer calling this over checking for empty, as + this will avoid calculating base type requirements if not necessary. + + + + + The full list of all required members for this type, including from base classes. If is true, + this returns empty. + + + Do not call this API if all you need are the required members declared on this type. Use instead, filtering for + required members, instead of calling this API. If you only need to determine whether this type or any base types have required members, call + , which will avoid calling this API if not required. + + + + + Attempts to calculate the required members for this type. Returns false if there were errors. + + + + + Get all the members of this symbol. + + An ImmutableArray containing all the members of this symbol. If this symbol has no members, + returns an empty ImmutableArray. Never returns null. + + + + Get all the members of this symbol that have a particular name. + + An ImmutableArray containing all the members of this symbol with the given name. If there are + no members with this name, returns an empty ImmutableArray. Never returns null. + + + + A lightweight check for whether this type has a possible clone method. This is less costly than GetMembers, + particularly for PE symbols, and can be used as a cheap heuristic for whether to fully search through all + members of this type for a valid clone method. + + + + + Get all the members of this symbol that are types. + + An ImmutableArray containing all the types that are members of this symbol. If this symbol has no type members, + returns an empty ImmutableArray. Never returns null. + + + + Get all the members of this symbol that are types that have a particular name, of any arity. + + An ImmutableArray containing all the types that are members of this symbol with the given name. + If this symbol has no type members with this name, + returns an empty ImmutableArray. Never returns null. + + + + Get all the members of this symbol that are types that have a particular name and arity + + An ImmutableArray containing all the types that are members of this symbol with the given name and arity. + If this symbol has no type members with this name and arity, + returns an empty ImmutableArray. Never returns null. + + + + Get all instance field and event members. + + + For source symbols may be called while calculating + . + + + + + Get this accessibility that was declared on this symbol. For symbols that do not have + accessibility declared on them, returns NotApplicable. + + + + + Used to implement visitor pattern. + + + + + During early attribute decoding, we consider a safe subset of all members that will not + cause cyclic dependencies. Get all such members for this symbol. + + + Never returns null (empty instead). + Expected implementations: for source, return type and field members; for metadata, return all members. + + + + + During early attribute decoding, we consider a safe subset of all members that will not + cause cyclic dependencies. Get all such members for this symbol that have a particular name. + + + Never returns null (empty instead). + Expected implementations: for source, return type and field members; for metadata, return all members. + + + + + Gets the kind of this symbol. + + + + + Compares this type to another type. + + + + + Helper for more complicated cases of Equals like when we have generic instantiations or types nested within them. + + + + + Merges nullability of all type arguments from the `typeA` and `typeB`. + The type parameters are added to `allTypeParameters`; the merged + type arguments are added to `allTypeArguments`; and the method + returns true if there were changes from the original `typeA`. + + + + + Returns a constructed type given its type arguments. + + The immediate type arguments to be replaced for type + parameters in the type. + + + + Returns a constructed type given its type arguments. + + The immediate type arguments to be replaced for type + parameters in the type. + + + + Returns a constructed type given its type arguments. + + + + + + Returns an unbound generic type of this named type. + + + + + Gets a value indicating whether this type has an EmbeddedAttribute or not. + + + + + Gets a value indicating whether this type has System.Runtime.CompilerServices.InterpolatedStringHandlerAttribute or not. + + + + + True if this type or some containing type has type parameters. + + + + + True if this is a reference to an unbound generic type. These occur only + within a typeof expression. A generic type is considered unbound + if all of the type argument lists in its fully qualified name are empty. + Note that the type arguments of an unbound generic type will be returned as error + types because they do not really have type arguments. An unbound generic type + yields null for its BaseType and an empty result for its Interfaces. + + + + + The original definition of this symbol. If this symbol is constructed from another + symbol by type substitution then OriginalDefinition gets the original symbol as it was defined in + source or metadata. + + + + + Returns the map from type parameters to type arguments. + If this is not a generic type instantiation, returns null. + The map targets the original definition of the type. + + + + + True if the type itself is excluded from code coverage instrumentation. + True for source types marked with . + + + + + True if this symbol has a special name (metadata flag SpecialName is set). + + + + + Returns a flag indicating whether this symbol is ComImport. + + + A type can me marked as a ComImport type in source by applying the + + + + + True if the type is a Windows runtime type. + + + A type can me marked as a Windows runtime type in source by applying the WindowsRuntimeImportAttribute. + WindowsRuntimeImportAttribute is a pseudo custom attribute defined as an internal class in System.Runtime.InteropServices.WindowsRuntime namespace. + This is needed to mark Windows runtime types which are redefined in mscorlib.dll and System.Runtime.WindowsRuntime.dll. + These two assemblies are special as they implement the CLR's support for WinRT. + + + + + True if the type should have its WinRT interfaces projected onto .NET types and + have missing .NET interface members added to the type. + + + + + Returns a flag indicating whether this symbol has at least one applied/inherited conditional attribute. + + + Forces binding and decoding of attributes. + + + + + True if the type is serializable (has Serializable metadata flag). + + + + + Returns true if locals are to be initialized + + + + + Type layout information (ClassLayout metadata and layout kind flags). + + + + + The default charset used for type marshalling. + Can be changed via applied on the containing module. + + + + + Marshalling charset of string data fields within the type (string formatting flags in metadata). + + + + + True if the type has declarative security information (HasSecurity flags). + + + + + Declaration security information associated with this type, or null if there is none. + + + + + Returns a sequence of preprocessor symbols specified in applied on this symbol, or null if there are none. + + + + + If was applied to the type and the attribute argument is a valid named type argument, i.e. accessible class type, then it returns the type symbol for the argument. + Otherwise, returns null. + + + + This property invokes force completion of attributes. If you are accessing this property + from the binder, make sure that we are not binding within an Attribute context. + This could lead to a possible cycle in attribute binding. + We can avoid this cycle by first checking if we are within the context of an Attribute argument, + i.e. if(!binder.InAttributeArgument) { ... namedType.ComImportCoClass ... } + + + CONSIDER: We can remove the above restriction and possibility of cycle if we do an + early binding of some well known attributes. + + + + + + If class represents fixed buffer, this property returns the FixedElementField + + + + + Requires less computation than == . + + + Metadata types need to compute their base types in order to know their TypeKinds, and that can lead + to cycles if base types are already being computed. + + True if this is an interface type. + + + + Verify if the given type can be used to back a tuple type + and return cardinality of that tuple type in . + + If method returns true, contains cardinality of the compatible tuple type. + + + + + Returns an instance of a symbol that represents a native integer + if this underlying symbol represents System.IntPtr or System.UIntPtr. + For platforms that support numeric IntPtr/UIntPtr, those types are returned as-is. + For other symbols, throws . + + + + + If this is a native integer, returns the symbol for the underlying type, + either or . + Otherwise, returns null. + + + + + Helps create a tuple type from source. + + + + + Copy this tuple, but modify it to use the new element types. + + + + + Copy this tuple, but modify it to use the new element names. + Also applies new location of the whole tuple as well as each element. + Drops the inferred positions. + + + + + Decompose the underlying tuple type into its links and store them into the underlyingTupleTypeChain. + + For instance, ValueTuple<..., ValueTuple< int >> (the underlying type for an 8-tuple) + will be decomposed into two links: the first one is the entire thing, and the second one is the ValueTuple< int > + + + + + Returns the number of nestings required to represent numElements as nested ValueTuples. + For example, for 8 elements, you need 2 ValueTuples and the remainder (ie the size of the last nested ValueTuple) is 1. + + + + + For tuples with no natural type, we still need to verify that an underlying type of proper arity exists, and report if otherwise. + + + + + Find the well-known ValueTuple type of a given arity. + For example, for arity=2: + returns WellKnownType.System_ValueTuple_T2 + + + + + Find the constructor for a well-known ValueTuple type of a given arity. + + For example, for arity=2: + returns WellKnownMember.System_ValueTuple_T2__ctor + + For arity=12: + return System_ValueTuple_TRest__ctor + + + + + Find the well-known members to the ValueTuple type of a given arity and position. + For example, for arity=3 and position=1: + returns WellKnownMember.System_ValueTuple_T3__Item1 + + + + + Returns "Item1" for position=1 + Returns "Item12" for position=12 + + + + + Checks whether the field name is reserved and tells us which position it's reserved for. + + For example: + Returns 3 for "Item3". + Returns 0 for "Rest", "ToString" and other members of System.ValueTuple. + Returns -1 for names that aren't reserved. + + + + + Lookup well-known member declaration in provided type and reports diagnostics. + + + + + The main purpose of this type is to store element names and also cache some information related to tuples. + + + + + Element names, if provided. + + + + + Declaration locations for individual elements, if provided. + Declaration location for this tuple type symbol + + + + + Which element names were inferred and therefore cannot be used. + If none of the element names were inferred, or inferred names can be used (no tracking necessary), leave as default. + This information is ignored in type equality and comparison. + + + + + Element types. + + + + + The same named type, but without element names. + + + + + Represents a namespace. + + + + + Get all the members of this symbol that are namespaces. + + An IEnumerable containing all the namespaces that are members of this symbol. + If this symbol has no namespace members, returns an empty IEnumerable. Never returns + null. + + + + Returns whether this namespace is the unnamed, global namespace that is + at the root of all namespaces. + + + + + The kind of namespace: Module, Assembly or Compilation. + Module namespaces contain only members from the containing module that share the same namespace name. + Assembly namespaces contain members for all modules in the containing assembly that share the same namespace name. + Compilation namespaces contain all members, from source or referenced metadata (assemblies and modules) that share the same namespace name. + + + + + The containing compilation for compilation namespaces. + + + + + If a namespace has Assembly or Compilation extent, it may be composed of multiple + namespaces that are merged together. If so, ConstituentNamespaces returns + all the namespaces that were merged. If this namespace was not merged, returns + an array containing only this namespace. + + + + + Containing assembly. + + + + + Gets the kind of this symbol. + + + + + Implements visitor pattern. + + + + + Get this accessibility that was declared on this symbol. For symbols that do not have + accessibility declared on them, returns NotApplicable. + + + + + Returns true if this symbol is "static"; i.e., declared with the "static" modifier or + implicitly static. + + + + + Returns true if this symbol was declared as requiring an override; i.e., declared with + the "abstract" modifier. Also returns true on a type declared as "abstract", all + interface types, and members of interface types. + + + + + Returns true if this symbol was declared to override a base class member and was also + sealed from further overriding; i.e., declared with the "sealed" modifier. Also set for + types that do not allow a derived class (declared with "sealed" or "static" or "struct" + or "enum" or "delegate"). + + + + + Returns data decoded from Obsolete attribute or null if there is no Obsolete attribute. + This property returns ObsoleteAttributeData.Uninitialized if attribute arguments haven't been decoded yet. + + + + + Returns an implicit type symbol for this namespace or null if there is none. This type + wraps misplaced global code. + + + + + Lookup a nested namespace. + + + Sequence of names for nested child namespaces. + + + Symbol for the most nested namespace, if found. Nothing + if namespace or any part of it can not be found. + + + + + Add all extension methods in this namespace to the given list. If name or arity + or both are provided, only those extension methods that match are included. + + Methods list + Optional method name + Method arity + Lookup options + + + + Represents a parameter of a method or indexer. + + + + + Gets constant value to be stored in metadata Constant table. + + + + + The original definition of this symbol. If this symbol is constructed from another + symbol by type substitution then OriginalDefinition gets the original symbol as it was defined in + source or metadata. + + + + + Gets the type of the parameter along with its annotations. + + + + + Gets the type of the parameter. + + + + + Determines if the parameter ref, out or neither. + + + + + Returns true if the parameter is a discard parameter. + + + + + Custom modifiers associated with the ref modifier, or an empty array if there are none. + + + + + Describes how the parameter is marshalled when passed to native code. + Null if no specific marshalling information is available for the parameter. + + PE symbols don't provide this information and always return null. + + + + Returns the marshalling type of this parameter, or 0 if marshalling information isn't available. + + + By default this information is extracted from if available. + Since the compiler does only need to know the marshalling type of symbols that aren't emitted + PE symbols just decode the type from metadata and don't provide full marshalling information. + + + + + Gets the ordinal position of the parameter. The first parameter has ordinal zero. + The "'this' parameter has ordinal -1. + + + + + Returns true if the parameter was declared as a parameter array. + Note: it is possible for any parameter to have the [ParamArray] attribute (for instance, in IL), + even if it is not the last parameter. So check for that. + + + + + Returns true if the parameter is semantically optional. + + + True if and only if the parameter has a default argument syntax, + or the parameter is not a params-array and Optional metadata flag is set. + + + + + True if Optional flag is set in metadata. + + + + + True if In flag is set in metadata. + + + + + True if Out flag is set in metadata. + + + + + Returns true if the parameter explicitly specifies a default value to be passed + when no value is provided as an argument to a call. + + + True if the parameter has a default argument syntax, + or the parameter is from source and is applied, + or the parameter is from metadata and HasDefault metadata flag is set. See + to determine if the parameter will be considered optional by + overload resolution. + + The default value can be obtained with property. + + + + + Returns the default value of the parameter. If + returns false then DefaultValue throws an InvalidOperationException. + + + If the parameter type is a struct and the default value of the parameter + is the default value of the struct type or of type parameter type which is + not known to be a referenced type, then this property will return null. + + The parameter has no default value. + + + + Returns the default value constant of the parameter, + or null if the parameter doesn't have a default value or + the parameter type is a struct and the default value of the parameter + is the default value of the struct type or of type parameter type which is + not known to be a referenced type. + + + This is used for emitting. It does not reflect the language semantics + (i.e. even non-optional parameters can have default values). + + + + + Gets the kind of this symbol. + + + + + Implements visitor pattern. + + + + + Get this accessibility that was declared on this symbol. For symbols that do not have + accessibility declared on them, returns NotApplicable. + + + + + Returns true if this symbol was declared as requiring an override; i.e., declared with + the "abstract" modifier. Also returns true on a type declared as "abstract", all + interface types, and members of interface types. + + + + + Returns true if this symbol was declared to override a base class member and was also + sealed from further overriding; i.e., declared with the "sealed" modifier. Also set for + types that do not allow a derived class (declared with "sealed" or "static" or "struct" + or "enum" or "delegate"). + + + + + Returns true if this symbol is "virtual", has an implementation, and does not override a + base class member; i.e., declared with the "virtual" modifier. Does not return true for + members declared as abstract or override. + + + + + Returns true if this symbol was declared to override a base class member; i.e., declared + with the "override" modifier. Still returns true if member was declared to override + something, but (erroneously) no member to override exists. + + + + + Returns true if this symbol is "static"; i.e., declared with the "static" modifier or + implicitly static. + + + + + Returns true if this symbol has external implementation; i.e., declared with the + "extern" modifier. + + + + + Returns true if the parameter is the hidden 'this' parameter. + + + + + Returns data decoded from Obsolete attribute or null if there is no Obsolete attribute. + This property returns ObsoleteAttributeData.Uninitialized if attribute arguments haven't been decoded yet. + + + + + Indexes of the parameters that will be passed to the constructor of the interpolated string handler type + when an interpolated string handler conversion occurs. These indexes are ordered in the order to be passed + to the constructor. + + Indexes greater than or equal to 0 are references to parameters defined on the containing method or indexer. + Indexes less than 0 are constants defined on . + + + + + True if the parameter is attributed with InterpolatedStringHandlerArgumentAttribute and the attribute + has some error (such as invalid names). + + + + + The effective scope. This is from the declared scope, implicit scope and any + UnscopedRefAttribute. + + + + + Represents a pointer type such as "int *". Pointer types + are used only in unsafe code. + + + + + Create a new PointerTypeSymbol. + + The type being pointed at. + + + + Gets the type of the storage location that an instance of the pointer type points to, along with its annotations. + + + + + Gets the type of the storage location that an instance of the pointer type points to. + + + + + Represents a property or indexer. + + + + + As a performance optimization, cache parameter types and refkinds - overload resolution uses them a lot. + + + + + The original definition of this symbol. If this symbol is constructed from another + symbol by type substitution then OriginalDefinition gets the original symbol as it was defined in + source or metadata. + + + + + If a property is annotated with `[MemberNotNull(...)]` attributes, returns the list of members + listed in those attributes. + Otherwise, an empty array. + + + + + Indicates whether or not the property returns by reference + + + + + Indicates whether or not the property returns a readonly reference + + + + + Gets the ref kind of the property. + + + + + The type of the property along with its annotations. + + + + + The type of the property. + + + + + Custom modifiers associated with the ref modifier, or an empty array if there are none. + + + + + The parameters of this property. If this property has no parameters, returns + an empty list. Parameters are only present on indexers, or on some properties + imported from a COM interface. + + + + + Optimization: in many cases, the parameter count (fast) is sufficient and we + don't need the actual parameter symbols (slow). + + + + + Returns true if this symbol requires an instance reference as the implicit receiver. This is false if the symbol is static. + + + + + Returns whether the property is really an indexer. + + + In source, we regard a property as an indexer if it is declared with an IndexerDeclarationSyntax. + From metadata, we regard a property if it has parameters and is a default member of the containing + type. + CAVEAT: To ensure that this property (and indexer Names) roundtrip, source properties are not + indexers if they are explicit interface implementations (since they will not be marked as default + members in metadata). + + + + + True if this an indexed property; that is, a property with parameters + within a [ComImport] type. + + + + + True if this is a read-only property; that is, a property with no set accessor. + + + + + True if this is a write-only property; that is, a property with no get accessor. + + + + + Returns true if this property is required to be set in an object initializer on object creation. + + + + + True if the property itself is excluded from code coverage instrumentation. + True for source properties marked with . + + + + + True if this symbol has a special name (metadata flag SpecialName is set). + + + + + The 'get' accessor of the property, or null if the property is write-only. + + + + + The 'set' accessor of the property, or null if the property is read-only. + + + + + Returns the overridden property, or null. + + + + + Source: Was the member name qualified with a type name? + Metadata: Is the member an explicit implementation? + + + Will not always agree with ExplicitInterfaceImplementations.Any() + (e.g. if binding of the type part of the name fails). + + + + + Returns interface properties explicitly implemented by this property. + + + Properties imported from metadata can explicitly implement more than one property. + + + + + Gets the kind of this symbol. + + + + + Implements visitor pattern. + + + + + Returns true if the error code is highest priority while calculating use site error for this symbol. + + + + + Represents an assembly built by compiler. + + + + + A Compilation the assembly is created for. + + + + + Assembly's identity. + + + + + A list of modules the assembly consists of. + The first (index=0) module is a SourceModuleSymbol, which is a primary module, the rest are net-modules. + + + + + Bag of assembly's custom attributes and decoded well-known attribute data from source. + + + + + Bag of assembly's custom attributes and decoded well-known attribute data from added netmodules. + + + + + Indices of attributes that will not be emitted for one of two reasons: + - They are duplicates of another attribute (i.e. attributes that bind to the same constructor and have identical arguments) + - They are InternalsVisibleToAttributes with invalid assembly identities + + + These indices correspond to the merged assembly attributes from source and added net modules, i.e. attributes returned by method. + + + + + Map for storing effectively private or effectively internal fields declared in this assembly but never initialized nor assigned. + Each {symbol, bool} key-value pair in this map indicates the following: + (a) Key: Unassigned field symbol. + (b) Value: True if the unassigned field is effectively internal, false otherwise. + + + + + private fields declared in this assembly but never read + + + + + We imitate the native compiler's policy of not warning about unused fields + when the enclosing type is used by an extern method for a ref argument. + Here we keep track of those types. + + + + + The warnings for unused fields. + + + + + This override is essential - it's a base case of the recursive definition. + + + + + This represents what the user claimed in source through the AssemblyFlagsAttribute. + It may be modified as emitted due to presence or absence of the public key. + + + + + We're going to synthesize some well-known attributes for this assembly symbol. However, at synthesis time, it is + too late to report diagnostics or cancel the emit. Instead, we check for use site errors on the types and members + we know we'll need at synthesis time. + + + As in Dev10, we won't report anything if the attribute TYPES are missing (note: missing, not erroneous) because we won't + synthesize anything in that case. We'll only report diagnostics if the attribute TYPES are present and either they or + the attribute CONSTRUCTORS have errors. + + + + + If this compilation allows unsafe code (note: allows, not contains), then when we actually emit the assembly/module, + we're going to synthesize SecurityPermissionAttribute/UnverifiableCodeAttribute. However, at synthesis time, it is + too late to report diagnostics or cancel the emit. Instead, we check for use site errors on the types and members + we know we'll need at synthesis time. + + + As in Dev10, we won't report anything if the attribute TYPES are missing (note: missing, not erroneous) because we won't + synthesize anything in that case. We'll only report diagnostics if the attribute TYPES are present and either they or + the attribute CONSTRUCTORS have errors. + + + + + True if internals are exposed at all. + + + Forces binding and decoding of attributes. + This property shouldn't be accessed during binding as it can lead to attribute binding cycle. + + + + + Gets unique source assembly attributes that should be emitted, + i.e. filters out attributes with errors and duplicate attributes. + + + + + Returns a bag of applied custom attributes and data decoded from well-known attributes. Returns null if there are no attributes applied on the symbol. + + + Forces binding and decoding of attributes. + + + + + Gets the attributes applied on this symbol. + Returns an empty array if there are no attributes. + + + NOTE: This method should always be kept as a sealed override. + If you want to override attribute binding logic for a sub-class, then override method. + + + + + Returns true if the assembly attribute at the given index is a duplicate assembly attribute that must not be emitted. + Duplicate assembly attributes are attributes that bind to the same constructor and have identical arguments. + + + This method must be invoked only after all the assembly attributes have been bound. + + + + + Returns data decoded from source assembly attributes or null if there are none. + + + Forces binding and decoding of attributes. + TODO: We should replace methods GetSourceDecodedWellKnownAttributeData and GetNetModuleDecodedWellKnownAttributeData with + a single method GetDecodedWellKnownAttributeData, which merges DecodedWellKnownAttributeData from source and netmodule attributes. + + + + + This implements the same logic as + but loading a smaller set of attributes if possible, to reduce circularity. + + + + + This only forces binding of attributes that look like they may be forwarded types attributes (syntactically). + + + + + Returns true if and only if at least one type within the assembly contains + extension methods. Note, this method is expensive since it potentially + inspects all types within the assembly. The expectation is that this method is + only called at emit time, when all types have been or will be traversed anyway. + + + + + Get the warnings for unused fields. This should only be fetched when all method bodies have been compiled. + + + + + Represents a type parameter in a generic type or generic method. + + + + + The original definition of this symbol. If this symbol is constructed from another + symbol by type substitution then OriginalDefinition gets the original symbol as it was defined in + source or metadata. + + + + + If this is a type parameter of a reduced extension method, gets the type parameter definition that + this type parameter was reduced from. Otherwise, returns Nothing. + + + + + The ordinal position of the type parameter in the parameter list which declares + it. The first type parameter has ordinal zero. + + + + + The types that were directly specified as constraints on the type parameter. + Duplicates and cycles are removed, although the collection may include + redundant constraints where one constraint is a base type of another. + + + + + True if the parameterless constructor constraint was specified for the type parameter. + + + + + The type parameter kind of this type parameter. + + + + + The method that declared this type parameter, or null. + + + + + The type that declared this type parameter, or null. + + + + + The effective base class of the type parameter (spec 10.1.5). If the deduced + base type is a reference type, the effective base type will be the same as + the deduced base type. Otherwise if the deduced base type is a value type, + the effective base type will be the most derived reference type from which + deduced base type is derived. + + + + + The effective interface set (spec 10.1.5). + + + + + The most encompassed type (spec 6.4.2) from the constraints. + + + + + The effective interface set and any base interfaces of those + interfaces. This is AllInterfaces excluding interfaces that are + only implemented by the effective base type. + + + + + Called by , , , and . + to allow derived classes to ensure constraints within the containing + type or method are resolved in a consistent order, regardless of the + order the callers query individual type parameters. + + + + + Helper method to force type parameter constraints to be resolved. + + + + + Returns whether the reference type constraint (the 'class' constraint) should also be treated as nullable ('class?') or non-nullable (class!). + In some cases this aspect is unknown (null value is returned). For example, when 'class' constraint is specified in a NonNullTypes(false) context. + This API returns false when is false. + + + + + This type is synthesized to hold the cached delegates that target static method groups. + + + + Creates a type-scope concrete delegate cache container. + + + Creates a method-scope generic delegate cache container. + + + + State machine interface property implementation. + + + + + A base method symbol used as a base class for lambda method symbol and base method wrapper symbol. + + + + + Indicates that this method inherits attributes from the base method, its parameters, return type, and type parameters. + + + + + Abstract base class for mutable and immutable type maps. + + + + + Substitute for a type declaration. May use alpha renaming if the container is substituted. + + + + + SubstType, but for NamedTypeSymbols only. This is used for concrete types, so no alpha substitution appears in the result. + + + + + Perform the substitution on the given type. Each occurrence of the type parameter is + replaced with its corresponding type argument from the map. + + The type to be rewritten. + The type with type parameters replaced with the type arguments. + + + + Substitute types, and return the results without duplicates, preserving the original order. + Note, all occurrences of 'dynamic' in resulting types will be replaced with 'object'. + + + + + Like SubstTypes, but for NamedTypeSymbols. + + + + + Symbol representing a using alias appearing in a compilation unit or within a namespace + declaration. Generally speaking, these symbols do not appear in the set of symbols reachable + from the unnamed namespace declaration. In other words, when a using alias is used in a + program, it acts as a transparent alias, and the symbol to which it is an alias is used in + the symbol table. For example, in the source code +
+            namespace NS
+            {
+                using o = System.Object;
+                partial class C : o {}
+                partial class C : object {}
+                partial class C : System.Object {}
+            }
+            
+ all three declarations for class C are equivalent and result in the same symbol table object + for C. However, these using alias symbols do appear in the results of certain SemanticModel + APIs. Specifically, for the base clause of the first of C's class declarations, the + following APIs may produce a result that contains an AliasSymbol: +
+                SemanticInfo SemanticModel.GetSemanticInfo(ExpressionSyntax expression);
+                SemanticInfo SemanticModel.BindExpression(CSharpSyntaxNode location, ExpressionSyntax expression);
+                SemanticInfo SemanticModel.BindType(CSharpSyntaxNode location, ExpressionSyntax type);
+                SemanticInfo SemanticModel.BindNamespaceOrType(CSharpSyntaxNode location, ExpressionSyntax type);
+            
+ Also, the following are affected if container==null (and, for the latter, when arity==null + or arity==0): +
+                IList<string> SemanticModel.LookupNames(CSharpSyntaxNode location, NamespaceOrTypeSymbol container = null, LookupOptions options = LookupOptions.Default, List<string> result = null);
+                IList<Symbol> SemanticModel.LookupSymbols(CSharpSyntaxNode location, NamespaceOrTypeSymbol container = null, string name = null, int? arity = null, LookupOptions options = LookupOptions.Default, List<Symbol> results = null);
+            
+
+
+ + + Gets the for the + namespace or type referenced by the alias. + + + + + Returns data decoded from Obsolete attribute or null if there is no Obsolete attribute. + This property returns ObsoleteAttributeData.Uninitialized if attribute arguments haven't been decoded yet. + + + + + Using aliases in C# are always contained within a namespace declaration, or at the top + level within a compilation unit, within the implicit unnamed namespace declaration. We + return that as the "containing" symbol, even though the alias isn't a member of the + namespace as such. + + + + + Gets the for the + namespace or type referenced by the alias. + + + + + Gets the for the + namespace or type referenced by the alias. + + + + + Describes anonymous type in terms of fields + + + + Anonymous type location + + + Anonymous type fields + + + + Anonymous type descriptor Key + + The key is to be used to separate anonymous type templates in an anonymous type symbol cache. + The type descriptors with the same keys are supposed to map to 'the same' anonymous type + template in terms of the same generic type being used for their implementation. + + + + + Compares two anonymous type descriptors, takes into account fields names and types, not locations. + + + + + Compares two anonymous type descriptors, takes into account fields names and types, not locations. + + + + + Creates a new anonymous type descriptor based on 'this' one, + but having field types passed as an argument. + + + + + Describes anonymous type field in terms of its name, type and other attributes + + + + Anonymous type field name, not nothing and not empty + + + Anonymous type field location + + + Anonymous type field type with annotations + + + Anonymous type field type + + + + Represents a .NET assembly, consisting of one or more modules. + + + + + The system assembly, which provides primitive types like Object, String, etc., e.g. mscorlib.dll. + The value is provided by ReferenceManager and must not be modified. For SourceAssemblySymbol, non-missing + coreLibrary must match one of the referenced assemblies returned by GetReferencedAssemblySymbols() method of + the main module. If there is no existing assembly that can be used as a source for the primitive types, + the value is a Compilation.MissingCorLibrary. + + + + + The system assembly, which provides primitive types like Object, String, etc., e.g. mscorlib.dll. + The value is MissingAssemblySymbol if none of the referenced assemblies can be used as a source for the + primitive types and the owning assembly cannot be used as the source too. Otherwise, it is one of + the referenced assemblies returned by GetReferencedAssemblySymbols() method or the owning assembly. + + + + + A helper method for ReferenceManager to set the system assembly, which provides primitive + types like Object, String, etc., e.g. mscorlib.dll. + + + + + Simple name the assembly. + + + This is equivalent to ., but may be + much faster to retrieve for source code assemblies, since it does not require binding + the assembly-level attributes that contain the version number and other assembly + information. + + + + + Gets the identity of this assembly. + + + + + Assembly version pattern with wildcards represented by , + or null if the version string specified in the doesn't contain a wildcard. + + For example, + AssemblyVersion("1.2.*") is represented as 1.2.65535.65535, + AssemblyVersion("1.2.3.*") is represented as 1.2.3.65535. + + + + + Target architecture of the machine. + + + + + Indicates that this PE file makes Win32 calls. See CorPEKind.pe32BitRequired for more information (http://msdn.microsoft.com/en-us/library/ms230275.aspx). + + + + + Gets the merged root namespace that contains all namespaces and types defined in the modules + of this assembly. If there is just one module in this assembly, this property just returns the + GlobalNamespace of that module. + + + + + Given a namespace symbol, returns the corresponding assembly specific namespace symbol + + + + + Gets a read-only list of all the modules in this assembly. (There must be at least one.) The first one is the main module + that holds the assembly manifest. + + + + + Does this symbol represent a missing assembly. + + + + + Returns data decoded from Obsolete attribute or null if there is no Obsolete attribute. + This property returns ObsoleteAttributeData.Uninitialized if attribute arguments haven't been decoded yet. + + + + + True if the assembly contains interactive code. + + + + + Lookup a top level type referenced from metadata, names should be + compared case-sensitively. + + + Full type name with generic name mangling. + + + Take forwarded types into account. + + + + + + Lookup a top level type referenced from metadata, names should be + compared case-sensitively. Detect cycles during lookup. + + + Full type name, possibly with generic name mangling. + + + List of assemblies lookup has already visited (since type forwarding can introduce cycles). + + + Take forwarded types into account. + + + + + Returns the type symbol for a forwarded type based its canonical CLR metadata name. + The name should refer to a non-nested type. If type with this name is not forwarded, + null is returned. + + + + + Look up the given metadata type, if it is forwarded. + + + + + Look up the given metadata type, if it is forwarded. + + + + + Lookup declaration for predefined CorLib type in this Assembly. + + The symbol for the pre-defined type or an error type if the type is not defined in the core library. + + + + Register declaration of predefined CorLib type in this Assembly. + + + + + + Continue looking for declaration of predefined CorLib type in this Assembly + while symbols for new type declarations are constructed. + + + + + Return the native integer type corresponding to the underlying type. + + + + + Figure out if the target runtime supports default interface implementation. + + + + + Figure out if the target runtime supports static abstract members in interfaces. + + + + + Whether the target runtime supports numeric IntPtr types. + This test hook should be removed once TargetFramework.Net70 is added. + Tracked by https://github.com/dotnet/roslyn/issues/61235 + + + + + True if the target runtime support covariant returns of methods declared in classes. + + + + + Return an array of assemblies involved in canonical type resolution of + NoPia local types defined within this assembly. In other words, all + references used by previous compilation referencing this assembly. + + + + + + Return an array of assemblies referenced by this assembly, which are linked (/l-ed) by + each compilation that is using this AssemblySymbol as a reference. + If this AssemblySymbol is linked too, it will be in this array too. + + + + + Assembly is /l-ed by compilation that is using it as a reference. + + + + + Returns true and a string from the first GuidAttribute on the assembly, + the string might be null or an invalid guid representation. False, + if there is no GuidAttribute with string argument. + + + + + Gets the set of type identifiers from this assembly. + + + These names are the simple identifiers for the type, and do not include namespaces, + outer type names, or type parameters. + + This functionality can be used for features that want to quickly know if a name could be + a type for performance reasons. For example, classification does not want to incur an + expensive binding call cost if it knows that there is no type with the name that they + are looking at. + + + + + Gets the set of namespace names from this assembly. + + + + + Returns true if this assembly might contain extension methods. If this property + returns false, there are no extension methods in this assembly. + + + This property allows the search for extension methods to be narrowed quickly. + + + + + Gets the symbol for the pre-defined type from core library associated with this assembly. + + The symbol for the pre-defined type or an error type if the type is not defined in the core library. + + + + The NamedTypeSymbol for the .NET System.Object type, which could have a TypeKind of + Error if there was no COR Library in a compilation using the assembly. + + + + + Get symbol for predefined type from Cor Library used by this assembly. + + + + + + + Lookup a type within the assembly using the canonical CLR metadata name of the type. + + Type name. + Symbol for the type or null if type cannot be found or is ambiguous. + + + + Lookup a type within the assembly using its canonical CLR metadata name. + + + + If search within assembly fails, lookup in assemblies referenced by the primary module. + For source assembly, this is equivalent to all assembly references given to compilation. + + + Extra restrictions apply when searching for a well-known type. In particular, the type must be public. + + + While resolving the name, consider only types following CLS-compliant generic type names and arity encoding (ECMA-335, section 10.7.2). + I.e. arity is inferred from the name and matching type must have the same emitted name and arity. + + + A diagnostic bag to receive warnings if we should allow multiple definitions and pick one. + + + In case duplicate types are found, ignore the one from corlib. This is useful for any kind of compilation at runtime + (EE/scripting/Powershell) using a type that is being migrated to corlib. + + + In cases a type could not be found because of ambiguity, we return two of the candidates that caused the ambiguity. + + Null if the type can't be found. + + + + Resolves to a available in this assembly + its referenced assemblies. + + The type to resolve. + Use referenced assemblies for resolution. + The resolved symbol if successful or null on failure. + + + + Lookup member declaration in predefined CorLib type in this Assembly. Only valid if this + assembly is the Cor Library + + + + + Lookup member declaration in predefined CorLib type used by this Assembly. + + + + + If this symbol represents a metadata assembly returns the underlying . + + Otherwise, this returns . + + + + + Represents a PE custom attribute + + + + + Matches an attribute by metadata namespace, metadata type name. Does not load the type symbol for + the attribute. + + + + True if the attribute data matches. + + + + Matches an attribute by metadata namespace, metadata type name and metadata signature. Does not load the + type symbol for the attribute. + + Target symbol. + Attribute to match. + + An index of the target constructor signature in + signatures array, -1 if + this is not the target attribute. + + + + + Decodes System.Runtime.CompilerServices.DynamicAttribute applied to a specified metadata symbol and + transforms the specified metadata type, using the decoded dynamic transforms attribute argument, + by replacing each occurrence of type with dynamic type. + + + This is a port of TypeManager::ImportDynamicTransformType from the native compiler. + Comments from the C# design document for Dynamic: + SPEC: To represent the dynamic type in metadata, any indexer, field or return value typed as dynamic or known to be a constructed type + SPEC: containing dynamic will have each occurrence of dynamic erased to object and will be annotated with a [DynamicAttribute]. + SPEC: If the relevant type is a constructed type, the attribute's constructor is passed a bool array. + SPEC: This array represents a preorder traversal of each "node" in the constructed type's "tree of types", + SPEC: with true set for each "node" that is dynamic, and false set for all other types. + SPEC: When dynamic occurs as part of the base type of a type, the applicable [DynamicAttribute] is applied to the type itself. + + + + + Should be accessed through , , and . + + + + + Decodes the attributes applied to the given from metadata and checks if System.Runtime.CompilerServices.DynamicAttribute is applied. + If so, it transforms the given , using the decoded dynamic transforms attribute argument, + by replacing each occurrence of type with dynamic type. + If no System.Runtime.CompilerServices.DynamicAttribute is applied or the decoded dynamic transforms attribute argument is erroneous, + returns the unchanged . + + This method is a port of TypeManager::ImportDynamicTransformType from the native compiler. + + + + This subclass of MetadataDecoder is specifically for finding + method symbols corresponding to method MemberRefs. The parent + implementation is unsuitable because it requires a PEMethodSymbol + for context when decoding method type parameters and no such + context is available because it is precisely what we are trying + to find. Since we know in advance that there will be no context + and that signatures decoded with this class will only be used + for comparison (when searching through the methods of a known + TypeSymbol), we can return indexed type parameters instead. + + + + + Type context for resolving generic type parameters. + + + + + We know that we'll never have a method context because that's what we're + trying to find. Instead, just return an indexed type parameter that will + make comparison easier. + + + + + + + This override can handle non-PE types. + + + + + Search through the members of the type symbol to find the method that matches a particular + signature. + + A MemberRef or a MethodDef handle that can be used to obtain the name and signature of the method + True to only return a method. + The matching method symbol, or null if the inputs do not correspond to a valid method. + + + + Helper class to resolve metadata tokens and signatures. + + + + + Type context for resolving generic type arguments. + + + + + Method context for resolving generic method type arguments. + + + + + Lookup a type defined in referenced assembly. + + + + + + + Lookup a type defined in a module of a multi-module assembly. + + + + + Lookup a type defined in this module. + This method will be called only if the type we are + looking for hasn't been loaded yet. Otherwise, MetadataDecoder + would have found the type in TypeDefRowIdToTypeMap based on its + TypeDef row id. + + + + + Perform a check whether the type or at least one of its generic arguments + is defined in the specified assemblies. The check is performed recursively. + + + + + Find canonical type for NoPia embedded type. + + + Symbol for the canonical type or an ErrorTypeSymbol. Never returns null. + + + + + If the type reference has an associated NullableAttribute, this method + returns the type transformed to have IsNullable set to true or false + (but not null) for each reference type in the type. + + + + + Represents an assembly imported from a PE. + + + + + An Assembly object providing metadata for the assembly. + + + + + A DocumentationProvider that provides XML documentation comments for this assembly. + + + + + The list of contained PEModuleSymbol objects. + The list doesn't use type ReadOnlyCollection(Of PEModuleSymbol) so that we + can return it from Modules property as is. + + + + + An array of assemblies involved in canonical type resolution of + NoPia local types defined within this assembly. In other words, all + references used by a compilation referencing this assembly. + The array and its content is provided by ReferenceManager and must not be modified. + + + + + An array of assemblies referenced by this assembly, which are linked (/l-ed) by + each compilation that is using this AssemblySymbol as a reference. + If this AssemblySymbol is linked too, it will be in this array too. + The array and its content is provided by ReferenceManager and must not be modified. + + + + + Assembly is /l-ed by compilation that is using it as a reference. + + + + + Assembly's custom attributes + + + + + Look up the assemblies to which the given metadata type is forwarded. + + + + The assemblies to which the given type is forwarded. + + + The returned assemblies may also forward the type. + + + + + The class to represent all events imported from a PE/module. + + + + + Look for a field with the same name and an appropriate type (i.e. the same type, except in WinRT). + If one is found, the caller will assume that this event was originally field-like and associate + the two symbols. + + + Perf impact: If we find a field with the same name, we will eagerly evaluate its type. + + + + + Intended behavior: this event, E, explicitly implements an interface event, IE, + if E.add explicitly implements IE.add and E.remove explicitly implements IE.remove. + + + + + The class to represent all fields imported from a PE/module. + + + + + Mark this field as the backing field of a field-like event. + The caller will also ensure that it is excluded from the member list of + the containing type (as it would be in source). + + + + + The module containing the namespace. + + + + + + The class to represent all methods imported from a PE/module. + + + + + internal for testing purpose + + + + + Holds infrequently accessed fields. See for an explanation. + + + + + A single field to hold optional auxiliary data. + In many scenarios it is possible to avoid allocating this, thus saving total space in . + Even for lazily-computed values, it may be possible to avoid allocating if + the computed value is a well-known "empty" value. In this case, bits in are used + to indicate that the lazy values have been computed and, if is null, then + the "empty" value should be inferred. + + + + + Associate the method with a particular property. Returns + false if the method is already associated with a property or event. + + + + + Associate the method with a particular event. Returns + false if the method is already associated with a property or event. + + + + + internal for testing purpose + + + + + If a methodimpl record indicates a unique overridden method, that method. Otherwise null. + + + + + Represents a net-module imported from a PE. Can be a primary module of an assembly. + + + + + Owning AssemblySymbol. This can be a PEAssemblySymbol or a SourceAssemblySymbol. + + + + + A Module object providing metadata. + + + + + Global namespace. + + + + + Cache the symbol for well-known type System.Type because we use it frequently + (for attributes). + + + + + The same value as ConcurrentDictionary.DEFAULT_CAPACITY + + + + + This is a map from TypeDef handle to the target . + It is used by to speed up type reference resolution + for metadata coming from this module. The map is lazily populated + as we load types from the module. + + + + + This is a map from TypeRef row id to the target . + It is used by to speed up type reference resolution + for metadata coming from this module. The map is lazily populated + by as we resolve TypeRefs from the module. + + + + + Module's custom attributes + + + + + Module's assembly attributes + + + + + Returns attributes with up-to 6 filters applied. For each filter, the last application of the + attribute will be tracked and returned. + + + + + Get the custom attributes, but filter out any ParamArrayAttributes. + + The parameter token handle. + Set to a ParamArrayAttribute + CustomAttributeHandle if any are found. Nil token otherwise. + + + + Filters extension attributes from the attribute results. + + + True if we found an extension method, false otherwise. + The attributes on the token, minus any ExtensionAttributes. + + + + Returns a tuple of the assemblies this module forwards the given type to. + + Type to look up. + A tuple of the forwarded to assemblies. + + The returned assemblies may also forward the type. + + + + + The class to represent all types imported from a PE/module. + + + + + A set of all the names of the members in this type. + We can get names without getting members (which is a more expensive operation) + + + + + We used to sort symbols on demand and relied on row ids to figure out the order between symbols of the same kind. + However, that was fragile because, when map tables are used in metadata, row ids in the map table define the order + and we don't have them. + Members are grouped by kind. First we store fields, then methods, then properties, then events and finally nested types. + Within groups, members are sorted based on declaration order. + + + + + A map of members immediately contained within this type + grouped by their name (case-sensitively). + + + + + A map of types immediately contained within this type + grouped by their name (case-sensitively). + + + + + Lazily initialized by TypeKind property. + + + + + Need to import them for an enum from a linked assembly, when we are embedding it. These symbols are not included into lazyMembersInDeclarationOrder. + + + + + Returns the index of the first member of the specific kind. + Returns the number of members if not found. + + + + + Returns all members of the specific kind, starting at the optional offset. + Members of the same kind are assumed to be contiguous. + + + + + Specialized PENamedTypeSymbol for types with no type parameters in + metadata (no type parameters on this type and all containing types). + + + + + Specialized PENamedTypeSymbol for types with type parameters in metadata. + NOTE: the type may have Arity == 0 if it has same metadata arity as the metadata arity of the containing type. + + + + + Return true if the type parameters specified on the nested type (this), + that represent the corresponding type parameters on the containing + types, in fact match the actual type parameters on the containing types. + + + + + The base class to represent a namespace imported from a PE/module. Namespaces that differ + only by casing in name are not merged. + + + + + A map of namespaces immediately contained within this namespace + mapped by their name (case-sensitively). + + + + + A map of types immediately contained within this namespace + grouped by their name (case-sensitively). + + + + + A map of NoPia local types immediately contained in this assembly. + Maps type name (non-qualified) to the row id. Note, for VB we should use + full name. + + + + + All type members in a flat array + + + + + Returns PEModuleSymbol containing the namespace. + + PEModuleSymbol containing the namespace. + + + + Initializes namespaces and types maps with information about + namespaces and types immediately contained within this namespace. + + + The sequence of groups of TypeDef row ids for types contained within the namespace, + recursively including those from nested namespaces. The row ids must be grouped by the + fully-qualified namespace name case-sensitively. There could be multiple groups + for each fully-qualified namespace name. The groups must be sorted by + their key in case-sensitive manner. Empty string must be used as namespace name for types + immediately contained within Global namespace. Therefore, all types in this namespace, if any, + must be in several first IGroupings. + + + + + Create symbols for nested namespaces and initialize namespaces map. + + + + + Create symbols for nested types and initialize types map. + + + + + The class to represent all, but Global, namespaces imported from a PE/module. + Namespaces that differ only by casing in name are not merged. + + + + + + The parent namespace. There is always one, Global namespace contains all + top level namespaces. + + + + + + The name of the namespace. + + + + + + The sequence of groups of TypeDef row ids for types contained within the namespace, + recursively including those from nested namespaces. The row ids are grouped by the + fully-qualified namespace name case-sensitively. There could be multiple groups + for each fully-qualified namespace name. The groups are sorted by their + key in case-sensitive manner. Empty string is used as namespace name for types + immediately contained within Global namespace. Therefore, all types in this namespace, if any, + will be in several first IGroupings. + + This member is initialized by constructor and is cleared in EnsureAllMembersLoaded + as soon as symbols for children are created. + + + + + + Constructor. + + + Name of the namespace, must be not empty. + + + Containing namespace. + + + The sequence of groups of TypeDef row ids for types contained within the namespace, + recursively including those from nested namespaces. The row ids are grouped by the + fully-qualified namespace name case-sensitively. There could be multiple groups + for each fully-qualified namespace name. The groups are sorted by their + key in case-sensitive manner. Empty string is used as namespace name for types + immediately contained within Global namespace. Therefore, all types in this namespace, if any, + will be in several first IGroupings. + + + + + The class to represent all method parameters imported from a PE/module. + + + + + The index of a CallerArgumentExpression. The value -2 means uninitialized, -1 means + not found. Otherwise, the index of the CallerArgumentExpression. + + + + + Attributes filtered out from m_lazyCustomAttributes, ParamArray, etc. + + + + + Construct a parameter symbol for a property loaded from metadata. + + + + + The property parameter doesn't have a name in metadata, + so this is the handle of a corresponding accessor parameter, if there is one, + or of the ParamInfo passed in, otherwise. + + + + + + Internal for testing. Non-test code should use . + + + + + The class to represent all properties imported from a PE/module. + + + + + To facilitate lookup, all indexer symbols have the same name. + Check the MetadataName property to find the name we imported. + + + + + This property can return true for bogus indexers. + Rationale: If a type in metadata has a single, bogus indexer + and a source method tries to invoke it, then Dev10 reports a bogus + indexer rather than lack of an indexer. + + + + + Intended behavior: this property, P, explicitly implements an interface property, IP, + if any of the following is true: + + 1) P.get explicitly implements IP.get and P.set explicitly implements IP.set + 2) P.get explicitly implements IP.get and there is no IP.set + 3) P.set explicitly implements IP.set and there is no IP.get + + Extra or missing accessors will not result in errors, P will simply not report that + it explicitly implements IP. + + + + + The class to represent all generic type parameters imported from a PE/module. + + + + + + First error calculating bounds. + + + + + Returns the byte value from the (single byte) NullableAttribute or nearest + NullableContextAttribute. Returns 0 if neither attribute is specified. + + + + + In C#, tuples can be represented using tuple syntax and be given + names. However, the underlying representation for tuples unifies + to a single underlying tuple type, System.ValueTuple. Since the + names aren't part of the underlying tuple type they have to be + recorded somewhere else. + + Roslyn records tuple names in an attribute: the + TupleElementNamesAttribute. The attribute contains a single string + array which records the names of the tuple elements in a pre-order + depth-first traversal. If the type contains nested parameters, + they are also recorded in a pre-order depth-first traversal. + + can be used to extract tuple names and types from metadata and create + a with attached names. + + + For instance, a method returning a tuple + + + (int x, int y) M() { ... } + + + will be encoded using an attribute on the return type as follows + + + [return: TupleElementNamesAttribute(new[] { "x", "y" })] + System.ValueTuple<int, int> M() { ... } + + + + + For nested type parameters, we expand the tuple names in a pre-order + traversal: + + + class C : BaseType<((int e1, int e2) e3, int e4)< { ... } + + + becomes + + + [TupleElementNamesAttribute(new[] { "e3", "e4", "e1", "e2" }); + class C : BaseType<System.ValueTuple< + System.ValueTuple<int,int>, int> + { ... } + + + + + + + Represents a retargeting custom attribute + + + + + Gets the retargeted System.Type type symbol. + + Target symbol on which this attribute is applied. + Retargeted System.Type type symbol. + + + + Essentially this is a wrapper around another AssemblySymbol that is responsible for retargeting + symbols from one assembly to another. It can retarget symbols for multiple assemblies at the same time. + + For example, compilation C1 references v1 of Lib.dll and compilation C2 references C1 and v2 of Lib.dll. + In this case, in context of C2, all types from v1 of Lib.dll leaking through C1 (through method + signatures, etc.) must be retargeted to the types from v2 of Lib.dll. This is what + RetargetingAssemblySymbol is responsible for. In the example above, modules in C2 do not + reference C1.m_AssemblySymbol, but reference a special RetargetingAssemblySymbol created for + C1 by ReferenceManager. + + Here is how retargeting is implemented in general: + - Symbols from underlying assembly are substituted with retargeting symbols. + - Symbols from referenced assemblies that can be reused as is (i.e. doesn't have to be retargeted) are + used as is. + - Symbols from referenced assemblies that must be retargeted are substituted with result of retargeting. + + + + + The underlying AssemblySymbol, it leaks symbols that should be retargeted. + This cannot be an instance of RetargetingAssemblySymbol. + + + + + The list of contained ModuleSymbol objects. First item in the list + is RetargetingModuleSymbol that wraps corresponding SourceModuleSymbol + from underlyingAssembly.Modules list, the rest are PEModuleSymbols for + added modules. + + + + + An array of assemblies involved in canonical type resolution of + NoPia local types defined within this assembly. In other words, all + references used by a compilation referencing this assembly. + The array and its content is provided by ReferenceManager and must not be modified. + + + + + An array of assemblies referenced by this assembly, which are linked (/l-ed) by + each compilation that is using this AssemblySymbol as a reference. + If this AssemblySymbol is linked too, it will be in this array too. + The array and its content is provided by ReferenceManager and must not be modified. + + + + + Backing field for the map from a local NoPia type to corresponding canonical type. + + + + + A map from a local NoPia type to corresponding canonical type. + + + + + Assembly is /l-ed by compilation that is using it as a reference. + + + + + Retargeted custom attributes + + + + + Constructor. + + + The underlying AssemblySymbol, cannot be an instance of RetargetingAssemblySymbol. + + + Assembly is /l-ed by compilation that is using it as a reference. + + + + + The underlying . + + + + + Lookup declaration for FX type in this Assembly. + + + + + + + + Owning RetargetingModuleSymbol. + + + + + Represents a field in a RetargetingModuleSymbol. Essentially this is a wrapper around + another FieldSymbol that is responsible for retargeting symbols from one assembly to another. + It can retarget symbols for multiple assemblies at the same time. + + + + + Owning RetargetingModuleSymbol. + + + + + Retargeted custom attributes + + + + + Represents a method in a RetargetingModuleSymbol. Essentially this is a wrapper around + another MethodSymbol that is responsible for retargeting symbols from one assembly to another. + It can retarget symbols for multiple assemblies at the same time. + + + + + Owning RetargetingModuleSymbol. + + + + + The underlying MethodSymbol. + + + + + Retargeted custom attributes + + + + + Retargeted return type custom attributes + + + + + The explicitly overridden method (e.g. as would be declared in the PE method in covariant return scenarios). + + + + + Represents a primary module of a . Essentially this is a wrapper around + another that is responsible for retargeting symbols from one assembly to another. + It can retarget symbols for multiple assemblies at the same time. + + Here is how retargeting is implemented in general: + - Symbols from underlying module are substituted with retargeting symbols. + - Symbols from referenced assemblies that can be reused as is (i.e. don't have to be retargeted) are + used as is. + - Symbols from referenced assemblies that must be retargeted are substituted with result of retargeting. + + + + + Owning . + + + + + The underlying , cannot be another . + + + + + The map that captures information about what assembly should be retargeted + to what assembly. Key is the referenced by the underlying module, + value is the corresponding referenced by this module, and corresponding + retargeting map for symbols. + + + + + Retargeted custom attributes + + + + + Constructor. + + + Owning assembly. + + + The underlying ModuleSymbol, cannot be another RetargetingModuleSymbol. + + + + + The underlying ModuleSymbol, cannot be another RetargetingModuleSymbol. + + + + + A helper method for ReferenceManager to set AssemblySymbols for assemblies + referenced by this module. + + + + + Retargeting map from underlying module to this one. + + + + + Retargeting map from underlying module to the retargeting module. + + + + + RetargetingAssemblySymbol owning retargetingModule. + + + + + The underlying ModuleSymbol for retargetingModule. + + + + + The map that captures information about what assembly should be retargeted + to what assembly. Key is the AssemblySymbol referenced by the underlying module, + value is the corresponding AssemblySymbol referenced by the retargeting module, and + corresponding retargeting map for symbols. + + + + + Perform a check whether the type or at least one of its generic arguments + is an explicitly defined local type. The check is performed recursively. + + + + + Represents a type of a RetargetingModuleSymbol. Essentially this is a wrapper around + another NamedTypeSymbol that is responsible for retargeting referenced symbols from one assembly to another. + It can retarget symbols for multiple assemblies at the same time. + + + + + Owning RetargetingModuleSymbol. + + + + + Represents a namespace of a RetargetingModuleSymbol. Essentially this is a wrapper around + another NamespaceSymbol that is responsible for retargeting symbols from one assembly to another. + It can retarget symbols for multiple assemblies at the same time. + + + + + Owning RetargetingModuleSymbol. + + + + + The underlying NamespaceSymbol, cannot be another RetargetingNamespaceSymbol. + + + + + Represents a parameter of a RetargetingMethodSymbol. Essentially this is a wrapper around + another ParameterSymbol that is responsible for retargeting symbols from one assembly to another. + It can retarget symbols for multiple assemblies at the same time. + + + + + Retargeted custom attributes + + + + + + + + This override is done for performance reasons. Lacking the override this would redirect to + which returns null. The override + short circuits the overhead in and the extra virtual + dispatch and just returns null. + + + + + Owning RetargetingMethodSymbol. + + + + + Owning RetargetingPropertySymbol. + + + + + Owning RetargetingModuleSymbol. + + + + + Retargeted custom attributes + + + + + Represents a type parameter in a RetargetingModuleSymbol. Essentially this is a wrapper around + another TypeParameterSymbol that is responsible for retargeting symbols from one assembly to another. + It can retarget symbols for multiple assemblies at the same time. + + + + + Owning RetargetingModuleSymbol. + + + + + Retargeted custom attributes + + + + + Represents a Source custom attribute specification + + + + + If the contains any named constructor arguments or default value arguments, + it returns an array representing each argument's source argument index. A value of -1 indicates default value argument. + Otherwise, returns null. + + + + + This method finds an attribute by metadata name and signature. The algorithm for signature matching is similar to the one + in Module.GetTargetAttributeSignatureIndex. Note, the signature matching is limited to primitive types + and System.Type. It will not match an arbitrary signature but it is sufficient to match the signatures of the current set of + well known attributes. + + The symbol which is the target of the attribute + The attribute to match. + + + + Gets the System.Type type symbol from targetSymbol's containing assembly. + + Target symbol on which this attribute is applied. + System.Type type symbol. + + + + Information decoded from well-known custom attributes applied on a field. + + + + + Information decoded from well-known custom attributes applied on a method. + + + + + Information decoded from well-known custom attributes applied on a method. + + + + + Information decoded from well-known custom attributes applied on a module. + + + + + Information early-decoded from well-known custom attributes applied on a parameter. + + + + + Information decoded from well-known custom attributes applied on a parameter. + + + + + Information decoded from early well-known custom attributes applied on a property. + + + + + Information decoded from well-known custom attributes applied on a property. + + + + + Information decoded from well-known custom attributes applied on a type. + + + + + Information decoded early from well-known custom attributes applied on a type. + + + + + IsManagedType is simple for most named types: + enums are not managed; + non-enum, non-struct named types are managed; + type parameters are managed unless an 'unmanaged' constraint is present; + all special types have spec'd values (basically, (non-string) primitives) are not managed; + + Only structs are complicated, because the definition is recursive. A struct type is managed + if one of its instance fields is managed or a ref field. Unfortunately, this can result in infinite recursion. + If the closure is finite, and we don't find anything definitely managed, then we return true. + If the closure is infinite, we disregard all but a representative of any expanding cycle. + + Intuitively, this will only return true if there's a specific type we can point to that is would + be managed even if it had no fields. e.g. struct S { S s; } is not managed, but struct S { S s; object o; } + is because we can point to object. + + + + + Returns True or False if we can determine whether the type is managed + without looking at its fields and Unknown otherwise. + Also returns whether or not the given type is generic. + + + + + This enum describes the types of components that could give + us diagnostics. We shouldn't read the list of diagnostics + until all of these types are accounted for. + + + PEParameterSymbol reserves all completion part bits and uses them to track the completion state and + presence of well known attributes. + + + + + A tuple of TypeParameterSymbol and DiagnosticInfo, created for errors + reported from ConstraintsHelper rather than creating Diagnostics directly. + This decouples constraints checking from syntax and Locations, and supports + callers that may want to create Location instances lazily or not at all. + + + + + Helper methods for generic type parameter constraints. There are two sets of methods: one + set for resolving constraint "bounds" (that is, determining the effective base type, interface set, + etc.), and another set for checking for constraint violations in type and method references. + + Bounds are resolved by calling one of the ResolveBounds overloads. Typically bounds are + resolved by each TypeParameterSymbol at, or before, one of the corresponding properties + (BaseType, Interfaces, etc.) is accessed. Resolving bounds may result in errors (cycles, + inconsistent constraints, etc.) and it is the responsibility of the caller to report any such + errors as declaration errors or use-site errors (depending on whether the type parameter + was from source or metadata) and to ensure bounds are resolved for source type parameters + even if the corresponding properties are never accessed directly. + + Constraints are checked by calling one of the CheckConstraints or CheckAllConstraints + overloads for any generic type or method reference from source. In some circumstances, + references are checked at the time the generic type or generic method is bound and constructed + by the Binder. In those case, it is sufficient to call one of the CheckConstraints overloads + since compound types (such as A<T>.B<U> or A<B<T>>) are checked + incrementally as each part is bound. In other cases however, constraint checking needs to be + delayed to prevent cycles where checking constraints requires binding the syntax that is currently + being bound (such as the constraint in class C<T> where T : C<T>). In those cases, + the caller must lazily check constraints, and since the types may be compound types, it is + necessary to call CheckAllConstraints. + + + + + Determine the effective base type, effective interface set, and set of type + parameters (excluding cycles) from the type parameter constraints. Conflicts + within the constraints and constraint types are returned as diagnostics. + 'inherited' should be true if the type parameters are from an overridden + generic method. In those cases, additional constraint checks are applied. + + + + + Check all generic constraints on the given type and any containing types + (such as A<T> in A<T>.B<U>). This includes checking constraints + on generic types within the type (such as B<T> in A<B<T>[]>). + + + + + Check type parameter constraints for the containing type or method symbol. + + The generic type or method. + Arguments for constraints checking. + The map from type parameters to type arguments. + Containing symbol type parameters. + Containing symbol type arguments. + Diagnostics. + Nullability warnings. + Parameters to skip. + + If an original form of a type constraint + depends on a type parameter from this set, do not verify this type constraint. + True if the constraints were satisfied, false otherwise. + + + + Returns true if type a is encompassed by type b (spec 6.4.3), + and returns false otherwise. + + + + + A named type symbol that results from substituting a new owner for a type declaration. + + + + + A generic named type symbol that has been constructed with type arguments distinct from its own type parameters. + + + + + Substitutes all occurrences of dynamic type with Object type. + + + + + When indexer overload resolution fails, we have two options: + 1) Create a BoundBadExpression with the candidates as child nodes; + 2) Create a BoundIndexerAccess with the error flag set. + + Option 2 is preferable, because it retains information about the arguments + (names, ref kind, etc), and results in better output from flow analysis. + However, we can't create a BoundIndexerAccess with a null indexer symbol, + so we create an ErrorPropertySymbol to fill the gap. + + + + + An ErrorSymbol is used when the compiler cannot determine a symbol object to return because + of an error. For example, if a field is declared "Goo x;", and the type "Goo" cannot be + found, an ErrorSymbol is returned when asking the field "x" what it's type is. + + + + + The underlying error. + + + + + Summary of the reason why the type is bad. + + + + + Called by to perform substitution + on types with TypeKind ErrorType. The general pattern is to use the type map + to perform substitution on the wrapped type, if any, and then construct a new + error type symbol from the result (if there was a change). + + + + + When constructing this ErrorTypeSymbol, there may have been symbols that seemed to + be what the user intended, but were unsuitable. For example, a type might have been + inaccessible, or ambiguous. This property returns the possible symbols that the user + might have intended. It will return no symbols if no possible symbols were found. + See the CandidateReason property to understand why the symbols were unsuitable. + + + + + If CandidateSymbols returns one or more symbols, returns the reason that those + symbols were not chosen. Otherwise, returns None. + + + + + Returns true if this type is known to be a reference type. It is never the case that + IsReferenceType and IsValueType both return true. However, for an unconstrained type + parameter, IsReferenceType and IsValueType will both return false. + + + + + Returns true if this type is known to be a value type. It is never the case that + IsReferenceType and IsValueType both return true. However, for an unconstrained type + parameter, IsReferenceType and IsValueType will both return false. + + + + + Collection of names of members declared within this type. + + + + + Get all the members of this symbol. + + An ImmutableArray containing all the members of this symbol. If this symbol has no members, + returns an empty ImmutableArray. Never returns Null. + + + + Get all the members of this symbol that have a particular name. + + An ImmutableArray containing all the members of this symbol with the given name. If there are + no members with this name, returns an empty ImmutableArray. Never returns Null. + + + + Get all the members of this symbol that are types. + + An ImmutableArray containing all the types that are members of this symbol. If this symbol has no type members, + returns an empty ImmutableArray. Never returns null. + + + + Get all the members of this symbol that are types that have a particular name, of any arity. + + An ImmutableArray containing all the types that are members of this symbol with the given name. + If this symbol has no type members with this name, + returns an empty ImmutableArray. Never returns null. + + + + Get all the members of this symbol that are types that have a particular name and arity + + An ImmutableArray containing all the types that are members of this symbol with the given name and arity. + If this symbol has no type members with this name and arity, + returns an empty ImmutableArray. Never returns null. + + + + Gets the kind of this symbol. + + + + + Gets the kind of this type. + + + + + Get the symbol that logically contains this symbol. + + + + + Gets the locations where this symbol was originally defined, either in source or + metadata. Some symbols (for example, partial classes) may be defined in more than one + location. + + + + + Returns the arity of this type, or the number of type parameters it takes. + A non-generic type has zero arity. + + + + + Gets the name of this symbol. Symbols without a name return the empty string; null is + never returned. + + + + + Returns the type arguments that have been substituted for the type parameters. + If nothing has been substituted for a give type parameters, + then the type parameter itself is consider the type argument. + + + + + Returns the type parameters that this type has. If this is a non-generic type, + returns an empty ImmutableArray. + + + + + Returns the type symbol that this type was constructed from. This type symbol + has the same containing type (if any), but has type arguments that are the same + as the type parameters (although its containing type might not). + + + + + Implements visitor pattern. + + + + + Get this accessibility that was declared on this symbol. For symbols that do not have + accessibility declared on them, returns NotApplicable. + + + + + Returns true if this symbol is "static"; i.e., declared with the "static" modifier or + implicitly static. + + + + + Returns true if this symbol was declared as requiring an override; i.e., declared with + the "abstract" modifier. Also returns true on a type declared as "abstract", all + interface types, and members of interface types. + + + + + Returns true if this symbol was declared to override a base class member and was also + sealed from further overriding; i.e., declared with the "sealed" modifier. Also set for + types that do not allow a derived class (declared with "sealed" or "static" or "struct" + or "enum" or "delegate"). + + + + + An error type, used to represent the type of a type binding + operation when binding fails. + + + + + If (we believe) we know which symbol the user intended, then we should retain that information + in the corresponding error symbol - it can be useful for deciding how to handle the error. + For example, we might want to know whether (we believe) the error type was supposed to be an + interface, so that we can put it in a derived type's interface list, rather than in the base + type slot. + + Sometimes we will return the original definition of the intended symbol. For example, if we see + ]]> and we have an IGoo with a different arity or accessibility + (e.g. ]]> was constructed from an error symbol based on ]]>), + then we'll return ]]>, rather than trying to construct a corresponding closed + type (which may not be difficult/possible in the case of nested types or mismatched arities). + + NOTE: Any non-null type symbol returned is guaranteed not to be an error type. + + + TypeSymbolExtensions.GetNonErrorGuess is a more discoverable version of this functionality. + However, the real definition is in this class so that it can access the private field + nonErrorGuessType. + + + + + Represents a field initializer, a property initializer, or a global statement in script code. + + + + + The field being initialized (possibly a backing field of a property), or null if this is a top-level statement in script code. + + + + + A reference to , + or top-level in script code, + or for an initialization of a generated property based on record parameter. + + + + + Creates a function pointer method symbol from individual parts. This method should only be used when diagnostics are not needed. + This should only be used from testing code. + + + + + Creates a function pointer method symbol from individual parts. This method should only be used when diagnostics are not needed. + + + + + Creates a function pointer method symbol from individual parts. This method should only be used when diagnostics are not needed. + + + + + Inferred delegate type state, recorded during testing only. + + + + + Number of delegate types calculated in the compilation. + + + + + A implementation that represents the lazily-inferred signature of a + lambda expression or method group. This is implemented as a + to allow types and function signatures to be treated similarly in , + , and . Instances of this type + should only be used in those code paths and should not be exposed from the symbol model. + The actual delegate signature is calculated on demand in . + + + + + Returns the inferred signature as a delegate type + or null if the signature could not be inferred. + + + + + Represents a label in method body + + + + + Returns false because label can't be defined externally. + + + + + Returns false because label can't be sealed. + + + + + Returns false because label can't be abstract. + + + + + Returns false because label can't be overridden. + + + + + Returns false because label can't be virtual. + + + + + Returns false because label can't be static. + + + + + Returns data decoded from Obsolete attribute or null if there is no Obsolete attribute. + This property returns ObsoleteAttributeData.Uninitialized if attribute arguments haven't been decoded yet. + + + + + Returns 'NotApplicable' because label can't be used outside the member body. + + + + + Gets the locations where the symbol was originally defined, either in source or + metadata. Some symbols (for example, partial classes) may be defined in more than one + location. + + + + + Gets the immediately containing symbol of the . + It should be the containing the label in its body. + + + + + Gets the immediately containing symbol of the . + It should be the containing the label in its body. + + + + + Returns value 'Label' of the + + + + + A structure used to lexically order symbols. For performance, it's important that this be + a STRUCTURE, and be able to be returned from a symbol without doing any additional allocations (even + if nothing is cached yet). + + + + + Compare two lexical sort keys in a compilation. + + + + + Specifies the syntactic construct that a user defined variable comes from. + + + + + The local is not user defined nor it is a copy of a user defined local (e.g. with a substituted type). + Check the value of for the kind of synthesized variable. + + + + + User defined local variable declared by . + + + + + User defined local constant declared by . + + + + + User defined local variable declared by in . + + + + + User defined local variable declared by in . + + + + + User defined local variable declared by . + + + + + User defined local variable declared by or . + + + + + The variable that captures the result of a pattern matching operation like "i" in "expr is int i" + + + + + User variable declared by a declaration expression in the left-hand-side of a deconstruction assignment. + + + + + User variable declared as an out argument. + + + + + User variable declared by a declaration expression in some unsupported context. + This occurs as a result of error recovery in incorrect code. + + + + + Represents a local variable in a method body. + + + + + Syntax node that is used as the scope designator. Otherwise, null. + + + + + Gets the type of this local along with its annotations. + + + + + Gets the type of this local. + + + + + WARN WARN WARN: If you access this via the semantic model, things will break (since the initializer may not have been bound). + + Whether or not this local is pinned (i.e. the type will be emitted with the "pinned" modifier). + + + Superficially, it seems as though this should always be the same as DeclarationKind == LocalDeclarationKind.Fixed. + Unfortunately, when we fix a string expression, it is not the declared local (e.g. char*) but a synthesized temp (string) + that is pinned. + + + + + Returns false because local variable can't be defined externally. + + + + + Returns false because local variable can't be sealed. + + + + + Returns false because local variable can't be abstract. + + + + + Returns false because local variable can't be overridden. + + + + + Returns false because local variable can't be virtual. + + + + + Returns false because local variable can't be declared as static in C#. + + + + + Returns data decoded from Obsolete attribute or null if there is no Obsolete attribute. + This property returns ObsoleteAttributeData.Uninitialized if attribute arguments haven't been decoded yet. + + + + + Returns 'NotApplicable' because local variable can't be used outside the member body.. + + + + + Returns value 'Local' of the + + + + + Returns true if this local variable was declared in a catch clause. + + + + + Returns true if this local variable was declared as "const" (i.e. is a constant declaration). + + + + + Returns true if the local variable is declared in resource-acquisition of a 'using statement'; + otherwise false + + + + using (var localVariable = new StreamReader("C:\\Temp\\MyFile.txt")) { ... } + + + + + + Returns true if the local variable is declared in fixed-pointer-initializer (in unsafe context) + + + + + Returns true if this local variable is declared as iteration variable + + + + + Returns the syntax node that declares the variable. + + + All user-defined and long-lived synthesized variables must return a reference to a node that is + tracked by the EnC diffing algorithm. For example, for variable + the declarator is the node. + + The location of the declarator is used to calculate during emit. + + + + + Describes whether this represents a modifiable variable. Note that + this refers to the variable, not the underlying value, so if this + variable is a ref-local, the writability refers to ref-assignment, + not assignment to the underlying storage. + + + + + Returns false if the field wasn't declared as "const", or constant value was omitted or erroneous. + True otherwise. + + + + + If IsConst returns true, then returns the constant value of the field or enum member. If IsConst returns + false, then returns null. + + + + + Returns true if the local symbol was compiler generated. + + + + + Returns the scope to which a local can "escape" ref assignments or other form of aliasing + Makes sense only for locals with formal scopes - i.e. source locals + + + + + Returns the scope to which values of a local can "escape" via ordinary assignments + Makes sense only for ref-like locals with formal scopes - i.e. source locals + + + + + When a local variable's type is inferred, it may not be used in the + expression that computes its value (and type). This property returns + the expression where a reference to an inferred variable is forbidden. + + + + + The diagnostic code to be reported when an inferred variable is used + in its forbidden zone. + + + + + + C# 4.0 §10.6: The name, the type parameter list and the formal parameter list of a method define + the signature (§3.6) of the method. Specifically, the signature of a method consists of its + name, the number of type parameters and the number, modifiers, and types of its formal + parameters. For these purposes, any type parameter of the method that occurs in the type of + a formal parameter is identified not by its name, but by its ordinal position in the type + argument list of the method. The return type is not part of a method's signature, nor are + the names of the type parameters or the formal parameters. + + + C# 4.0 §3.6: For the purposes of signatures, the types object and dynamic are considered the + same. + + + C# 4.0 §3.6: We implement the rules for ref/out by mapping both to ref. The caller (i.e. + checking for proper overrides or partial methods, etc) should check that ref/out are + consistent. + + + + + + This instance is used when trying to determine if one member explicitly implements another, + according the C# definition. + The member signatures are compared without regard to name (including the interface part, if any) + and the return types must match. + + + + + This instance is used when trying to determine if one member implicitly implements another, + according to the C# definition. + The member names, parameters, and (return) types must match. Custom modifiers are ignored. + + + One would expect this comparer to have requireSourceMethod = true, but it doesn't because (for source types) + we allow inexact matching of custom modifiers when computing implicit member implementations. Consider the + following scenario: interface I has a method M with custom modifiers C1, source type ST includes I in its + interface list but has no method M, and metadata type MT has a method M with custom modifiers C2. + In this scenario, we want to compare I.M to MT.M without regard to custom modifiers, because if C1 != C2, + we can just synthesize an explicit implementation of I.M in ST that calls MT.M. + + + + + This instance is used as a fallback when it is determined that one member does not implicitly implement + another. It applies a looser check to determine whether the proposed implementation should be reported + as "close". + + + + + This instance is used to determine if two C# member declarations in source conflict with each other. + Names, arities, and parameter types are considered. + Return types, type parameter constraints, custom modifiers, and parameter ref kinds, etc are ignored. + + + This does the same comparison that MethodSignature used to do. + + + + + This instance is used to determine if some API specific to records is explicitly declared. + It is the same as except it considers ref kinds as well. + + + + + This instance is used to determine if a partial method implementation matches the definition. + It is the same as except it considers ref kinds as well. + + + + + This instance is used to determine if a partial method implementation matches the definition, + including differences ignored by the runtime. + + + + + This instance is used to check whether one member overrides another, according to the C# definition. + + + + + This instance checks whether two signatures match including tuples names, in both return type and parameters. + It is used to detect tuple-name-only differences. + + + + + This instance checks whether two signatures match excluding tuples names, in both return type and parameters. + It is used to detect tuple-name-only differences. + + + + + This instance is used to check whether one property or event overrides another, according to the C# definition. + NOTE: C# ignores accessor member names. + + + + + Same as except that it pays attention to custom modifiers and return type. + Normally, the return type isn't considered during overriding, but this comparer is actually used to find + exact matches (i.e. before tie-breaking takes place amongst close matches). + + + + + If this returns false, then the real override comparer (whichever one is appropriate for the scenario) + will also return false. + + + + + This instance is intended to reflect the definition of signature equality used by the runtime + (ECMA-335, Partition I, §8.6.1.6 Signature Matching). + It considers return type, name, parameters, calling convention, and custom modifiers, but ignores + the difference between and . + + + + + Same as , but in addition ignores name. + + + + + Same as , but distinguishes between ref and out. During override resolution, + if we find two methods that match except for ref/out, we want to prefer the one that matches, even + if the runtime doesn't. + + + + + This instance is the same as RuntimeSignatureComparer. + CONSIDER: just use RuntimeSignatureComparer? + + + + + This instance is used to search for members that have the same name, parameters, (return) type, and constraints (if any) + according to the C# definition. Custom modifiers are ignored. + + + + + This instance is used to search for members that have identical signatures in every regard. + + + + + This instance is used for performing approximate overload resolution of documentation + comment cref attributes. It ignores the name, because the candidates were all found by lookup. + + + + + Compare signatures of methods from a method group. + + + + + Returns true if the first set of constraint types + is a subset of the second set. + + + + + Do the members differ in terms of tuple names (both in their return type and parameters), but would match ignoring names? + + We'll look at the result of equality without tuple names (1) and with tuple names (2). + The question is whether there is a change in tuple element names only (3). + + member1 vs. member2 | (1) | (2) | (3) | + (int a, int b) M() vs. (int a, int b) M() | yes | yes | match | + (int a, int b) M() vs. (int x, int y) M() | yes | no | different | + void M((int a, int b)) vs. void M((int x, int y)) | yes | no | different | + int M() vs. string M() | no | no | match | + + + + + + SymbolExtensions for member symbols. + + + + + Get the parameters of a member symbol. Should be a method, property, or event. + + + + + Get the types of the parameters of a member symbol. Should be a method, property, or event. + + + + + Get the ref kinds of the parameters of a member symbol. Should be a method, property, or event. + + + + + Count the number of custom modifiers in/on the return type + and parameters of the specified method. + + + + + Count the number of custom modifiers in/on the type + and parameters (for indexers) of the specified property. + + + + + Return the arity of a member. + + + + + Returns true if the method is a constructor and has a this() constructor initializer. + + + + + NOTE: every struct has a public parameterless constructor either user-defined or default one + + + + + Returns true if the method is the default constructor synthesized for struct types. + If the containing struct type is from metadata, the default constructor is synthesized when there + is no accessible parameterless constructor. (That synthesized constructor from metadata zero-inits + the instance.) If the containing struct type is from source, the parameterless constructor is synthesized + if there is no explicit parameterless constructor, and the synthesized + parameterless constructor simply zero-inits the instance (and is not emitted). + + + + + Indicates whether the method should be emitted. + + + + + If the event has a AddMethod, return that. Otherwise check the overridden + event, if any. Repeat for each overridden event. + + + This method exists to mimic the behavior of GetOwnOrInheritedGetMethod, but it + should only ever look at the overridden event in error scenarios. + + + + + If the event has a RemoveMethod, return that. Otherwise check the overridden + event, if any. Repeat for each overridden event. + + + This method exists to mimic the behavior of GetOwnOrInheritedSetMethod, but it + should only ever look at the overridden event in error scenarios. + + + + + Does the compilation this symbol belongs to output to a winmdobj? + + + + + + + Returns a constructed named type symbol if 'type' is generic, otherwise just returns 'type' + + + + + Returns true if the members of superType are accessible from subType due to inheritance. + + + + + The immediately containing namespace or named type, or null + if the containing symbol is neither a namespace or named type. + + + + + Returns true if all type parameter references within the given + type belong to containingSymbol or its containing types. + + + + + Returns true if all type parameter references within the given + types belong to containingSymbol or its containing types. + + + + + Does the top level type containing this symbol have 'Microsoft.CodeAnalysis.Embedded' attribute? + + + + + Returns true if the method has a [AsyncMethodBuilder(typeof(B))] attribute. If so it returns type B. + Validation of builder type B is left for elsewhere. This method returns B without validation of any kind. + + + + + A MergedNamespaceSymbol represents a namespace that merges the contents of two or more other + namespaces. Any sub-namespaces with the same names are also merged if they have two or more + instances. + + Merged namespaces are used to merge the symbols from multiple metadata modules and the + source "module" into a single symbol tree that represents all the available symbols. The + compiler resolves names against this merged set of symbols. + + Typically there will not be very many merged namespaces in a Compilation: only the root + namespaces and namespaces that are used in multiple referenced modules. (Microsoft, System, + System.Xml, System.Diagnostics, System.Threading, ...) + + + + + Create a possibly merged namespace symbol. If only a single namespace is passed it, it + is just returned directly. If two or more namespaces are passed in, then a new merged + namespace is created with the given extent and container. + + The namespace extent to use, IF a merged namespace is created. + The containing namespace to used, IF a merged + namespace is created. + One or more namespaces to merged. If just one, then it + is returned. The merged namespace symbol may hold onto the array. + An optional name to give the resulting namespace. + A namespace symbol representing the merged namespace. + + + + Method that is called from the CachingLookup to lookup the children of a given name. + Looks in all the constituent namespaces. + + + + + Method that is called from the CachingLookup to get all child names. Looks in all + constituent namespaces. + + + + + Represents source or metadata assembly. + + + + + An array of cached Cor types defined in this assembly. + Lazily filled by GetDeclaredSpecialType method. + + + + + How many Cor types have we cached so far. + + + + + Lookup declaration for predefined CorLib type in this Assembly. + + + + + + + Register declaration of predefined CorLib type in this Assembly. + + + + + + Continue looking for declaration of predefined CorLib type in this Assembly + while symbols for new type declarations are constructed. + + + + + Not yet known value is represented by ErrorTypeSymbol.UnknownResultType + + + + + Lookup member declaration in predefined CorLib type in this Assembly. Only valid if this + assembly is the Cor Library + + + + + Determine whether this assembly has been granted access to . + Assumes that the public key has been determined. The result will be cached. + + + + + + + + The runtime considers a method to be a finalizer (i.e. a method that should be invoked + by the garbage collector) if it (directly or indirectly) overrides System.Object.Finalize. + + + As an optimization, return true immediately for metadata methods with MethodKind + Destructor - they are guaranteed to be finalizers. + + Method to inspect. + This method is used to determine the method kind of + a PEMethodSymbol, so we may need to avoid using MethodKind until we move on to a different + MethodSymbol. + + + + Returns a constructed method symbol if 'method' is generic, otherwise just returns 'method' + + + + + Some kinds of methods are not considered to be hideable by certain kinds of members. + Specifically, methods, properties, and types cannot hide constructors, destructors, + operators, conversions, or accessors. + + + + + Some kinds of methods are never considered hidden by methods, properties, or types + (constructors, destructors, operators, conversions, and accessors). + + + + + Returns whether this method is async and returns void. + + + + + Returns whether this method is async and returns a task, task-like, or other type with a method-level builder. + + + + + Returns whether this method is async and returns a generic task, task-like, or other type with a method-level builder. + + + + + Returns whether this method is async and returns an IAsyncEnumerable`1. + + + + + Returns whether this method is async and returns an IAsyncEnumerator`1. + + + + + A is a special kind of that represents + an assembly that couldn't be found. + + + + + AssemblySymbol to represent missing, for whatever reason, CorLibrary. + The symbol is created by ReferenceManager on as needed basis and is shared by all compilations + with missing CorLibraries. + + + + + An array of cached Cor types defined in this assembly. + Lazily filled by GetDeclaredSpecialType method. + + + + + + Lookup declaration for predefined CorLib type in this Assembly. Only should be + called if it is know that this is the Cor Library (mscorlib). + + + + + + A is a special kind of that represents + a type symbol that was attempted to be read from metadata, but couldn't be + found, because: + a) The metadata file it lives in wasn't referenced + b) The metadata file was referenced, but didn't contain the type + c) The metadata file was referenced, contained the correct outer type, but + didn't contains a nested type in that outer type. + + + + + Get the arity of the missing type. + + + + + Represents not nested missing type. + + + + + Either , , or -1 if not initialized. + + + + + This is the FULL namespace name (e.g., "System.Collections.Generic") + of the type that couldn't be found. + + + + + Represents nested missing type. + + + + + A is a special kind of that represents + a module that couldn't be found. + + + + + A is a special kind of that represents + a namespace that couldn't be found. + + + + + Represents a module within an assembly. Every assembly contains one or more modules. + + + + + Returns a NamespaceSymbol representing the global (root) namespace, with + module extent, that can be used to browse all of the symbols defined in this module. + + + + + Returns the containing assembly. Modules are always directly contained by an assembly, + so this property always returns the same as ContainingSymbol. + + + + + Returns value 'NetModule' of the + + + + + Module's ordinal within containing assembly's Modules array. + 0 - for a source module, etc. + -1 - for a module that doesn't have containing assembly, or has it, but is not part of Modules array. + + + + + Target architecture of the machine. + + + + + Indicates that this PE file makes Win32 calls. See CorPEKind.pe32BitRequired for more information (http://msdn.microsoft.com/en-us/library/ms230275.aspx). + + + + + Does this symbol represent a missing module. + + + + + Returns 'NotApplicable' + + + + + Returns false because module can't be declared as 'static'. + + + + + Returns false because module can't be virtual. + + + + + Returns false because module can't be overridden. + + + + + Returns false because module can't be abstract. + + + + + Returns false because module can't be sealed. + + + + + Returns false because module can't be defined externally. + + + + + Returns data decoded from Obsolete attribute or null if there is no Obsolete attribute. + This property returns ObsoleteAttributeData.Uninitialized if attribute arguments haven't been decoded yet. + + + + + Returns an array of assembly identities for assemblies referenced by this module. + Items at the same position from ReferencedAssemblies and from ReferencedAssemblySymbols + correspond to each other. + + + + + Returns an array of assembly identities for assemblies referenced by this module. + Items at the same position from GetReferencedAssemblies and from GetReferencedAssemblySymbols + should correspond to each other. + + The array and its content is provided by ReferenceManager and must not be modified. + + + + + + Returns an array of AssemblySymbol objects corresponding to assemblies referenced + by this module. Items at the same position from ReferencedAssemblies and + from ReferencedAssemblySymbols correspond to each other. + + + + + Returns an array of AssemblySymbol objects corresponding to assemblies referenced + by this module. Items at the same position from GetReferencedAssemblies and + from GetReferencedAssemblySymbols should correspond to each other. If reference is + not resolved by compiler, GetReferencedAssemblySymbols returns MissingAssemblySymbol in the + corresponding item. + + The array and its content is provided by ReferenceManager and must not be modified. + + + + + A helper method for ReferenceManager to set assembly identities for assemblies + referenced by this module and corresponding AssemblySymbols. + + A description of the assemblies referenced by this module. + + Source assembly that triggered creation of this module symbol. + For debug purposes only, this assembly symbol should not be persisted within + this module symbol because the module can be shared across multiple source + assemblies. This method will only be called for the first one. + + + + + True if this module has any unified references. + + + + + Returns a unification use-site error (if any) for a symbol contained in this module + that is referring to a specified . + + + If an assembly referenced by this module isn't exactly matching any reference given to compilation + the Assembly Manager might decide to use another reference if it matches except for version + (it unifies the version with the existing reference). + + + + + Lookup a top level type referenced from metadata, names should be + compared case-sensitively. + + + Full type name, possibly with generic name mangling. + + + Symbol for the type, or MissingMetadataSymbol if the type isn't found. + + + + + + Returns true if there is any applied CompilationRelaxationsAttribute assembly attribute for this module. + + + + + Returns true if there is any applied RuntimeCompatibilityAttribute assembly attribute for this module. + + + + + Default char set for contained types, or null if not specified. + + + + + Given a namespace symbol, returns the corresponding module specific namespace symbol + + + + + Given a namespace symbol, returns the corresponding module specific namespace symbol + + + + + If this symbol represents a metadata module returns the underlying . + + Otherwise, this returns . + + + + + Utility class for substituting actual type arguments for formal generic type parameters. + + + + + A NamespaceExtent represents whether a namespace contains types and sub-namespaces from a + particular module, assembly, or merged across all modules (source and metadata) in a + particular compilation. + + + + + Returns what kind of extent: Module, Assembly, or Compilation. + + + + + If the Kind is ExtendKind.Module, returns the module symbol that this namespace + encompasses. Otherwise throws InvalidOperationException. + + + + + If the Kind is ExtendKind.Assembly, returns the assembly symbol that this namespace + encompasses. Otherwise throws InvalidOperationException. + + + + + If the Kind is ExtendKind.Compilation, returns the compilation symbol that this + namespace encompasses. Otherwise throws InvalidOperationException. + + + + + Create a NamespaceExtent that represents a given ModuleSymbol. + + + + + Create a NamespaceExtent that represents a given AssemblySymbol. + + + + + Create a NamespaceExtent that represents a given Compilation. + + + + + Represents either a namespace or a type. + + + + + Returns true if this symbol is a namespace. If it is not a namespace, it must be a type. + + + + + Returns true if this symbols is a type. Equivalent to !IsNamespace. + + + + + Returns true if this symbol is "virtual", has an implementation, and does not override a + base class member; i.e., declared with the "virtual" modifier. Does not return true for + members declared as abstract or override. + + + Always returns false. + + + + + Returns true if this symbol was declared to override a base class member; i.e., declared + with the "override" modifier. Still returns true if member was declared to override + something, but (erroneously) no member to override exists. + + + Always returns false. + + + + + Returns true if this symbol has external implementation; i.e., declared with the + "extern" modifier. + + + Always returns false. + + + + + Get all the members of this symbol. + + An ImmutableArray containing all the members of this symbol. If this symbol has no members, + returns an empty ImmutableArray. Never returns null. + + + + Get all the members of this symbol. The members may not be in a particular order, and the order + may not be stable from call-to-call. + + An ImmutableArray containing all the members of this symbol. If this symbol has no members, + returns an empty ImmutableArray. Never returns null. + + + + Get all the members of this symbol that have a particular name. + + An ImmutableArray containing all the members of this symbol with the given name. If there are + no members with this name, returns an empty ImmutableArray. Never returns null. + + + + Get all the members of this symbol that are types. The members may not be in a particular order, and the order + may not be stable from call-to-call. + + An ImmutableArray containing all the types that are members of this symbol. If this symbol has no type members, + returns an empty ImmutableArray. Never returns null. + + + + Get all the members of this symbol that are types. + + An ImmutableArray containing all the types that are members of this symbol. If this symbol has no type members, + returns an empty ImmutableArray. Never returns null. + + + + Get all the members of this symbol that are types that have a particular name, of any arity. + + An ImmutableArray containing all the types that are members of this symbol with the given name. + If this symbol has no type members with this name, + returns an empty ImmutableArray. Never returns null. + + + + Get all the members of this symbol that are types that have a particular name and arity + + An IEnumerable containing all the types that are members of this symbol with the given name and arity. + If this symbol has no type members with this name and arity, + returns an empty IEnumerable. Never returns null. + + + + Get a source type symbol for the given declaration syntax. + + Null if there is no matching declaration. + + + + Get a source type symbol for the given declaration syntax. + + Null if there is no matching declaration. + + + + Get a source type symbol of given name, arity and kind. If a tree and syntax are provided, restrict the results + to those that are declared within the given syntax. + + Null if there is no matching declaration. + + + + Lookup an immediately nested type referenced from metadata, names should be + compared case-sensitively. + + + Simple type name, possibly with generic name mangling. + + + Symbol for the type, or MissingMetadataSymbol if the type isn't found. + + + + + Finds types or namespaces described by a qualified name. + + Sequence of simple plain names. + + A set of namespace or type symbols with given qualified name (might comprise of types with multiple generic arities), + or an empty set if the member can't be found (the qualified name is ambiguous or the symbol doesn't exist). + + + "C.D" matches C.D, C{T}.D, C{S,T}.D{U}, etc. + + + + + This wrapper is only used on platforms where System.IntPtr isn't considered + a numeric type (as indicated by a RuntimeFeature flag). + + + + + Certain members from the underlying types are not exposed from the native integer types: + constructors other than the default parameterless constructor are not supported; + operators are handled explicitly as built-in operators and conversions; + 0 should be used instead of Zero; + sizeof() should be used instead of Size; + + and - should be used instead of Add() and Subtract(); + ToInt32(), ToInt64(), ToPointer() should be used from underlying types only. + The remaining members are exposed on the native integer types with appropriate + substitution of underlying types in the signatures. + Specifically, we expose public, non-generic instance and static methods and properties + other than those named above. + + + + + Replaces references to underlying type with references to native integer type. + + + + + Replaces references to underlying type with references to native integer type. + + + + + A is a special kind of that represents + an assembly that is not missing, i.e. the "real" thing. + + + + + This is a cache similar to the one used by MetaImport::GetTypeByName + in native compiler. The difference is that native compiler pre-populates + the cache when it loads types. Here we are populating the cache only + with things we looked for, so that next time we are looking for the same + thing, the lookup is fast. This cache also takes care of TypeForwarders. + Gives about 8% win on subsequent lookups in some scenarios. + + + + + + Does this symbol represent a missing assembly. + + + + + Gets the merged root namespace that contains all namespaces and types defined in the modules + of this assembly. If there is just one module in this assembly, this property just returns the + GlobalNamespace of that module. + + + + + Lookup a top level type referenced from metadata, names should be + compared case-sensitively. Detect cycles during lookup. + + + Full type name, possibly with generic name mangling. + + + List of assemblies lookup has already visited (since type forwarding can introduce cycles). + + + Take forwarded types into account. + + + + + For test purposes only. + + + + + For test purposes only. + + + + + A is a special kind of that represents + a module that is not missing, i.e. the "real" thing. + + + + + An array of objects corresponding to assemblies directly referenced by this module. + + + The contents are provided by ReferenceManager and may not be modified. + + + + + Does this symbol represent a missing module. + + + + + Returns an array of assembly identities for assemblies referenced by this module. + Items at the same position from GetReferencedAssemblies and from GetReferencedAssemblySymbols + should correspond to each other. + + + + + Returns an array of AssemblySymbol objects corresponding to assemblies referenced + by this module. Items at the same position from GetReferencedAssemblies and + from GetReferencedAssemblySymbols should correspond to each other. If reference is + not resolved by compiler, GetReferencedAssemblySymbols returns MissingAssemblySymbol in the + corresponding item. + + + + + A helper method for ReferenceManager to set assembly identities for assemblies + referenced by this module and corresponding AssemblySymbols. + + + + + Lookup a top level type referenced from metadata, names should be + compared case-sensitively. + + + Full type name, possibly with generic name mangling. + + + Symbol for the type, or MissingMetadataSymbol if the type isn't found. + + + + + + A NoPiaAmbiguousCanonicalTypeSymbol is a special kind of ErrorSymbol that represents a NoPia + embedded type symbol that was attempted to be substituted with canonical type, but the + canonical type was ambiguous. + + + + + A NoPiaIllegalGenericInstantiationSymbol is a special kind of ErrorSymbol that represents a + generic type instantiation that cannot cross assembly boundaries according to NoPia rules. + + + + + A NoPiaMissingCanonicalTypeSymbol is a special kind of ErrorSymbol that represents a NoPia + embedded type symbol that was attempted to be substituted with canonical type, but the + canonical type couldn't be found. + + + + + Used by symbol implementations (source and metadata) to represent the value + that was mapped from, or will be mapped to a [NullableContext] attribute. + + + + + Uninitialized state + + + + + No [NullableContext] attribute + + + + + [NullableContext(0)] + + + + + [NullableContext(1)] + + + + + [NullableContext(2)] + + + + + Initialize the ObsoleteAttributeData by fetching attributes and decoding ObsoleteAttributeData. This can be + done for Metadata symbol easily whereas trying to do this for source symbols could result in cycles. + + + + + Get the ObsoleteAttributeData by fetching attributes and decoding ObsoleteAttributeData. This can be + done for Metadata symbol easily whereas trying to do this for source symbols could result in cycles. + + + + + This method checks to see if the given symbol is Obsolete or if any symbol in the parent hierarchy is Obsolete. + + + True if some symbol in the parent hierarchy is known to be Obsolete. Unknown if any + symbol's Obsoleteness is Unknown. False, if we are certain that no symbol in the parent + hierarchy is Obsolete. + + + + + Create a diagnostic for the given symbol. This could be an error or a warning based on + the ObsoleteAttribute's arguments. + + + + + Encapsulates the MakeOverriddenOrHiddenMembers functionality for methods, properties (including indexers), + and events. + + + + + Walk up the type hierarchy from ContainingType and list members that this + member either overrides (accessible members with the same signature, if this + member is declared "override") or hides (accessible members with the same name + but different kinds, plus members that would be in the overrides list if + this member were not declared "override"). + + Members in the overridden list may be non-virtual or may have different + accessibilities, types, accessors, etc. They are really candidates to be + overridden. + + Members in the hidden list are definitely hidden. + + Members in the runtime overridden list are indistinguishable from the members + in the overridden list from the point of view of the runtime (see + FindOtherOverriddenMethodsInContainingType for details). + + + In the presence of non-C# types, the meaning of "same signature" is rather + complicated. If this member isn't from source, then it refers to the runtime's + notion of signature (i.e. including return type, custom modifiers, etc). + If this member is from source, then the process is (conceptually) as follows. + + 1) Walk up the type hierarchy, recording all matching members with the same + signature, ignoring custom modifiers and return type. Stop if a hidden + member is encountered. + 2) Apply the following "tie-breaker" rules until you have at most one member, + a) Prefer members in more derived types. + b) Prefer an exact custom modifier match (i.e. none, for a source member). + c) Prefer fewer custom modifiers (values/positions don't matter, just count). + d) Prefer earlier in GetMembers order (within the same type). + 3) If a member remains, search its containing type for other members that + have the same C# signature (overridden members) or runtime signature + (runtime overridden members). + + In metadata, properties participate in overriding only through their accessors. + That is, property/event accessors may implicitly or explicitly override other methods + and a property/event can be considered to override another property/event if its accessors + override those of the other property/event. + This implementation (like Dev10) will not follow that approach. Instead, it is + based on spec section 10.7.5, which treats properties as entities in their own + right. If all property/event accessors have conventional names in metadata and nothing + "unusual" is done with explicit overriding, this approach should produce the same + results as an implementation based on accessor overriding. + + + + + Compute a candidate overridden method when a method knows what method it is intended to + override. This makes a particular difference when covariant returns are used, in which + case the signature matching rules would not compute the correct overridden method. + + + + + In the CLI, accessors are just regular methods and their overriding/hiding rules are the same as for + regular methods. In C#, however, accessors are intimately connected with their corresponding properties. + Rather than walking up the type hierarchy from the containing type of this accessor, looking for members + with the same name, MakePropertyAccessorOverriddenOrHiddenMembers delegates to the associated property. + For an accessor to hide a member, the hidden member must be a corresponding accessor on a property hidden + by the associated property. For an accessor to override a member, the overridden member must be a + corresponding accessor on a property (directly or indirectly) overridden by the associated property. + + Example 1: + + public class A { public virtual int P { get; set; } } + public class B : A { public override int P { get { return 1; } } } //get only + public class C : B { public override int P { set { } } } // set only + + C.P.set overrides A.P.set because C.P.set is the setter of C.P, which overrides B.P, + which overrides A.P, which has A.P.set as a setter. + + Example 2: + + public class A { public virtual int P { get; set; } } + public class B : A { public new virtual int P { get { return 1; } } } //get only + public class C : B { public override int P { set { } } } // set only + + C.P.set does not override any method because C.P overrides B.P, which has no setter + and does not override a property. + + This accessor. + The property associated with this accessor. + Members overridden or hidden by this accessor. + + This method is intended to return values consistent with the definition of C#, which + may differ from the actual meaning at runtime. + + Note: we don't need a different path for interfaces - Property.OverriddenOrHiddenMembers handles that. + + + + + In the CLI, accessors are just regular methods and their overriding/hiding rules are the same as for + regular methods. In C#, however, accessors are intimately connected with their corresponding events. + Rather than walking up the type hierarchy from the containing type of this accessor, looking for members + with the same name, MakeEventAccessorOverriddenOrHiddenMembers delegates to the associated event. + For an accessor to hide a member, the hidden member must be a corresponding accessor on a event hidden + by the associated event. For an accessor to override a member, the overridden member must be a + corresponding accessor on a event (directly or indirectly) overridden by the associated event. + + This accessor. + The event associated with this accessor. + Members overridden or hidden by this accessor. + + This method is intended to return values consistent with the definition of C#, which + may differ from the actual meaning at runtime. + + Note: we don't need a different path for interfaces - Event.OverriddenOrHiddenMembers handles that. + + CONSIDER: It is an error for an event to have only one accessor. Currently, we mimic the behavior for + properties, for consistency, but an alternative approach would be to say that nothing is overridden. + + CONSIDER: is there a way to share code with MakePropertyAccessorOverriddenOrHiddenMembers? + + + + + There are two key reasons why interface overriding/hiding is different from class overriding/hiding: + 1) interface members never override other members; and + 2) interfaces can extend multiple interfaces. + The first difference doesn't require any special handling - as long as the members have IsOverride=false, + the code for class overriding/hiding does the right thing. + The second difference is more problematic. For one thing, an interface member can hide a different member in + each base interface. We only report the first one, but we need to expose all of them in the API. More importantly, + multiple inheritance raises the possibility of diamond inheritance. Spec section 13.2.5, Interface member access, + says: "The intuitive rule for hiding in multiple-inheritance interfaces is simply this: If a member is hidden in any + access path, it is hidden in all access paths." For example, consider the following interfaces: + + interface I0 { void M(); } + interface I1 : I0 { void M(); } + interface I2 : I0, I1 { void M(); } + + I2.M does not hide I0.M, because it is already hidden by I1.M. To make this work, we need to traverse the graph + of ancestor interfaces in topological order and flag ones later in the enumeration that are hidden along some path. + + + See SymbolPreparer::checkIfaceHiding. + + + + + Look for overridden or hidden members in a specific type. + + Member that is hiding or overriding. + True if member is from the current compilation. + The type that contains member (member.ContainingType). + The known overridden member (e.g. in the presence of a metadata methodimpl). + The type to search. + + A member with the same signature if currTypeHasExactMatch is true, + a member with (a minimal number of) different custom modifiers if there is one, + and null otherwise. + True if there's a member with the same name and kind that is not a match. + Hidden members (same name, different kind) will be added to this builder. + + There is some similarity between this member and TypeSymbol.FindPotentialImplicitImplementationMemberDeclaredInType. + When making changes to this member, think about whether or not they should also be applied in TypeSymbol. + + In incorrect or imported code, it is possible that both currTypeBestMatch and hiddenBuilder will be populated. + + + + + If representative member is non-null and is contained in a constructed type, then find + other members in the same type with the same signature. If this is an override member, + add them to the overridden and runtime overridden lists. Otherwise, add them to the + hidden list. + + + + + Some kinds of methods are not considered to be hideable by certain kinds of members. + Specifically, methods, properties, and types cannot hide constructors, destructors, + operators, conversions, or accessors. + + + + + Having found the best member to override, we want to find members with the same signature on the + best member's containing type. + + + The member that we consider to be overridden (may have different custom modifiers from the overriding member). + Assumed to already be in the overridden and runtime overridden lists. + + + If the best match was based on the custom modifier count, rather than the custom modifiers themselves + (because the overriding member is in the current compilation), then we should use the count when determining + whether the override is ambiguous. + + + If the declaring type is constructed, it's possible that two (or more) members have the same signature + (including custom modifiers). Return a list of such members so that we can report the ambiguity. + + + + + Having found that we are hiding a method with exactly the same signature + (including custom modifiers), we want to find methods with the same signature + on the declaring type because they will also be hidden. + (If the declaring type is constructed, it's possible that two or more + methods have the same signature (including custom modifiers).) + (If the representative member is an indexer, it's possible that two or more + properties have the same signature (including custom modifiers, even in a + non-generic type). + + + This kind of the hiding member. + + + The member that we consider to be hidden (must have exactly the same custom modifiers as the hiding member). + Assumed to already be in hiddenBuilder. + + + Will have all other members with the same signature (including custom modifiers) as + representativeMember added. + + + + + Determine if this method requires a methodimpl table entry to inform the runtime of the override relationship. + + True if we should produce an ambiguity warning per https://github.com/dotnet/roslyn/issues/45453 . + + + + Given a method, find the first method that it overrides from the perspective of the CLI. + Key differences from C#: non-virtual methods are ignored, the RuntimeSignatureComparer + is used (i.e. consider return types, ignore ref/out distinction). Sets + to true if more than one method is overridden by CLI rules. + + + WARN: Must not check method.MethodKind - PEMethodSymbol.ComputeMethodKind uses this method. + NOTE: Does not check whether the given method will be marked "newslot" in metadata (as + "newslot" is used for covariant method overrides). + + + + + Note that the access check is done using the original definitions. This is because we want to avoid + reductions in accessibility that result from type argument substitution (e.g. if an inaccessible type + has been passed as a type argument). + See DevDiv #11967 for an example. + + + + + Groups the information computed by MakeOverriddenOrHiddenMembers. + + + + + It is not suitable to call this method on a object + associated with a member within substituted type, + should be used instead. + + + + + Used for lightweight binding of type constraints. Instead of binding type arguments, + we'll just use these placeholders instead. That's good enough binding to compute + with minimal binding. + + + + + Helper methods that exist to share code between properties and events. + + + + + If the property has a GetMethod, return that. Otherwise check the overridden + property, if any. Repeat for each overridden property. + + + + + If the property has a SetMethod, return that. Otherwise check the overridden + property, if any. Repeat for each overridden property. + + + + + Returns fields that represent tuple elements for types that are tuples. + + If this type is not a tuple, then returns default. + + + + + If this is a tuple type with element names, returns the symbol for the tuple type without names. + Otherwise, returns null. + + + + + A RangeVariableSymbol represents an identifier introduced in a query expression as the + identifier of a "from" clause, an "into" query continuation, a "let" clause, or a "join" clause. + + + + + Returns data decoded from Obsolete attribute or null if there is no Obsolete attribute. + This property returns ObsoleteAttributeData.Uninitialized if attribute arguments haven't been decoded yet. + + + + + An extension method with the "this" parameter removed. + Used for the public binding API only, not for compilation. + + + + + Return the extension method in reduced form if the extension method + is applicable, and satisfies type parameter constraints, based on the + "this" argument type. Otherwise, returns null. + + Compilation used to check constraints. + The latest language version is assumed if this is null. + + + + If the extension method is applicable based on the "this" argument type, return + the method constructed with the inferred type arguments. If the method is not an + unconstructed generic method, type inference is skipped. If the method is not + applicable, or if constraints when inferring type parameters from the "this" type + are not satisfied, the return value is null. + + Compilation used to check constraints. The latest language version is assumed if this is null. + + + + A representation of a method symbol that is intended only to be used for comparison purposes + (esp in MethodSignatureComparer). + + + + + Intended to be used to create ParameterSymbols for a SignatureOnlyMethodSymbol. + + + + + A representation of a property symbol that is intended only to be used for comparison purposes + (esp in PropertySignatureComparer). + + + + + Generate a list containing the given field and all dependencies + of that field that require evaluation. The list is ordered by + dependencies, with fields with no dependencies first. Cycles are + broken at the first field lexically in the cycle. If multiple threads + call this method with the same field, the order of the fields + returned should be the same, although some fields may be missing + from the lists in some threads as other threads evaluate fields. + + + + + The set of fields on which the field depends. + + + + + The set of fields that depend on the field. + + + + + Build a dependency graph (a map from + field to dependencies). + + + + + Type parameters in documentation comments are complicated since they sort of act as declarations, + rather than references. Consider the following example: + + See . + class B { void M(T t) { } } + ]]> + + We make some key observations: + 1) The type parameter name in the cref is not tied to the type parameter name in the type declaration. + 2) A relationship exists between the two occurrences of "U" in the cref: they both refer to (or define) + the same symbol. + + In Roslyn, we've decided on the following representation: within the (entire) scope of a cref, the names + of all type parameters "declared" in the cref are in scope and bind to the corresponding type parameters. + This representation has one major advantage: as long as the appropriate binder (i.e. the one that knows + about the implicitly-declared type parameters) is used, TypeSyntaxes within the cref can be bound by + calling BindType. In addition to eliminating the necessity for custom binding code in the batch case, + this reduces the problem of exposing such nodes in the SemanticModel to one of ensuring that the right + enclosing binder is chosen. That is, new code will have to be written to handle CrefSyntaxes, but the + existing code for TypeSyntaxes should just work! + + In the example above, this means that, between the cref quotation marks, the name "U" binds to an + implicitly declared type parameter, whether it is in "B{U}", "M{U}", or "M{List{U[]}}". + + Of course, it's not all gravy. One thing we're giving up by using this representation is the ability to + distinguish between "declared" type parameters with the same name. Consider the following example: + + See .
+ class A + { + void M(T t) { } + void M(U u) { } + } + ]]> +
+ + The native compiler interprets this in the same way as it would interpret A{T1, T2}.M(T2) and unambiguously + (i.e. without a warning) binds to A{T, U}.M(U). Since Roslyn does not distinguish between the T's, Roslyn + reports an ambiguity warning and picks the first method. Furthermore, renaming one 'T' will rename all of + them. + + This class represents such an implicitly declared type parameter. The declaring syntax is expected to be + an IdentifierNameSyntax in the type argument list of a QualifiedNameSyntax. + + + + Out params are updated by assignment. If you require thread-safety, pass temps and then + CompareExchange them back into shared memory. + + + + Type that already has custom modifiers. + Same as , but without custom modifiers. + May differ in object/dynamic, tuple element names, or other differences ignored by the runtime. + The assembly containing the signature referring to the destination type. + with custom modifiers copied from . + + + + Given a member, look for other members contained in the same type with signatures that will + not be distinguishable by the runtime. + + + + + Gets the syntax list of custom attributes applied on the symbol. + + + + + Gets the attributes applied on this symbol. + Returns an empty array if there are no attributes. + + + NOTE: This method should always be kept as a sealed override. + If you want to override attribute binding logic for a sub-class, then override method. + + + + + Returns a bag of applied custom attributes and data decoded from well-known attributes. + Returns an empty bag if there are no attributes applied on the symbol. + + + Forces binding and decoding of attributes. + + + + + Returns data decoded from well-known attributes applied to the symbol or null if there are no applied attributes. + + + Forces binding and decoding of attributes. + + + + + Returns data decoded from Obsolete attribute or null if there is no Obsolete attribute. + This property returns ObsoleteAttributeData.Uninitialized if attribute arguments haven't been decoded yet. + + + + + Verify the constant value matches the default value from any earlier attribute + (DateTimeConstantAttribute or DecimalConstantAttribute). + If not, report ERR_FieldHasMultipleDistinctConstantValues. + + + + + Represents expression and deconstruction variables declared in a global statement. + + + + + The type syntax, if any, from source. Optional for patterns that can omit an explicit type. + + + + + Can add some diagnostics into . + Returns the type that it actually locks onto (it's possible that it had already locked onto ErrorType). + + + + + Can add some diagnostics into . + Returns the type that it actually locks onto (it's possible that it had already locked onto ErrorType). + + + + + Implemented by symbols that can be targeted by an attribute declaration (i.e. source symbols). + + + + + Returns the owner of attributes that apply to this symbol. + + + Attributes for this symbol might be retrieved from attribute list of another (owning) symbol. + In that case this property returns that owning symbol, otherwise it returns "this". + + + + + Returns a bit set of attribute locations applicable to this symbol. + + + + + Attribute location corresponding to this symbol. + + + Location of an attribute if an explicit location is not specified via attribute target specification syntax. + + + + + Represents implicit, script and submission classes. + + + + + Returns null for a submission class. + This ensures that a submission class does not inherit methods such as ToString or GetHashCode. + + + + + Indexed type parameters are used in place of type parameters for method signatures. There is + a unique mapping from index to a single IndexedTypeParameterSymbol. + + They don't have a containing symbol or locations. + + They do not have constraints, variance, or attributes. + + + + + Create a vector of n dummy type parameters. Always reuses the same type parameter symbol + for the same position. + + + + + + + This symbol is used as the return type of a LambdaSymbol when we are interpreting + lambda's body in order to infer its return type. + + + + + This symbol is used as the return type of a LambdaSymbol when we failed to infer its return type. + + + + + Locations[0] on lambda symbols covers the entire syntax, which is inconvenient but remains for compatibility. + For better diagnostics quality, use the DiagnosticLocation instead, which points to the "delegate" or the "=>". + + + + + Binder that owns the scope for the local function symbol, namely the scope where the + local function is declared. + + + + + The QuickAttributeChecker applies a simple fast heuristic for determining probable + attributes of certain kinds without binding attribute types, just by looking at the final syntax of an + attribute usage. + + + It works by maintaining a dictionary of all possible simple names that might map to the given + attribute. + + + + + Returns the that corresponds to the particular type + passed in. If is + then the name will be checked both as-is as well as with the 'Attribute' suffix. + + + + + Represents a source parameter cloned from another , when they must share attribute data and default constant value. + For example, parameters on a property symbol are cloned to generate parameters on accessors. + Similarly parameters on delegate invoke method are cloned to delegate begin/end invoke methods. + + + + + A source parameter, potentially with a default value, attributes, etc. + + + + + Symbol to copy bound attributes from, or null if the attributes are not shared among multiple source parameter symbols. + + + Used for parameters of partial implementation. We bind the attributes only on the definition + part and copy them over to the implementation. + + + + + Gets the syntax list of custom attributes that declares attributes for this parameter symbol. + + + + + Returns data decoded from well-known attributes applied to the symbol or null if there are no applied attributes. + + + Forces binding and decoding of attributes. + + + + + Returns data decoded from special early bound well-known attributes applied to the symbol or null if there are no applied attributes. + + + Forces binding and decoding of attributes. + + + + + Returns a bag of applied custom attributes and data decoded from well-known attributes. Returns null if there are no attributes applied on the symbol. + + + Forces binding and decoding of attributes. + + + + + Verify the default value matches the default value from any earlier attribute + (DefaultParameterValueAttribute, DateTimeConstantAttribute or DecimalConstantAttribute). + If not, report ERR_ParamDefaultValueDiffersFromAttribute. + + + + + Is the attribute syntax appearing on a parameter of a partial method implementation part? + Since attributes are merged between the parts of a partial, we need to look at the syntax where the + attribute appeared in the source to see if it corresponds to a partial method implementation part. + + + + + + + True if the parameter has default argument syntax. + + + + + True if the parameter is marked by . + + + + + This class represents an event accessor declared in source + (i.e. not one synthesized for a field-like event). + + + The accessors are associated with . + + + + + This class represents an event declared in source with explicit accessors + (i.e. not a field-like event). + + + + + Represents a constant field of an enum. + + + + + Base class for event accessors - synthesized and user defined. + + + + + A delegate field associated with a . + + + SourceFieldSymbol takes care of the initializer (plus "var" in the interactive case). + + + + + This class represents an event declared in source. It may be either + field-like (see ) or property-like (see + ). + + + + + Gets the syntax list of custom attributes applied on the event symbol. + + + + + Returns a bag of applied custom attributes and data decoded from well-known attributes. Returns null if there are no attributes applied on the symbol. + + + Forces binding and decoding of attributes. + + + + + Gets the attributes applied on this symbol. + Returns an empty array if there are no attributes. + + + NOTE: This method should always be kept as a sealed override. + If you want to override attribute binding logic for a sub-class, then override method. + + + + + Returns data decoded from well-known attributes applied to the symbol or null if there are no applied attributes. + + + Forces binding and decoding of attributes. + + + + + Returns data decoded from special early bound well-known attributes applied to the symbol or null if there are no applied attributes. + + + Forces binding and decoding of attributes. + + + + + Returns data decoded from Obsolete attribute or null if there is no Obsolete attribute. + This property returns ObsoleteAttributeData.Uninitialized if attribute arguments haven't been decoded yet. + + + + + This class represents an event declared in source without explicit accessors. + It implicitly has thread safe accessors and an associated field (of the same + name), unless it does not have an initializer and is either extern or inside + an interface, in which case it only has accessors. + + + + + Backing field for field-like event. Will be null if the event + has no initializer and is either extern or inside an interface. + + + + + Return the constant value dependencies. Compute the dependencies + if necessary by evaluating the constant value but only persist the + constant value if there were no dependencies. (If there are dependencies, + the constant value will be re-evaluated after evaluating dependencies.) + + + + + Switch case labels have a constant expression associated with them. + + + + + If the label is a switch case label, returns the associated constant value with + case expression, otherwise returns null. + + + + + Represents a local variable in a method body. + + + + + Might not be a method symbol. + + + + + Scope to which the local can "escape" via aliasing/ref assignment. + Not readonly because we can only know escape values after binding the initializer. + + + + + Scope to which the local's values can "escape" via ordinary assignments. + Not readonly because we can only know escape values after binding the initializer. + + + + + Binder that owns the scope for the local, the one that returns it in its array. + + + + + Binder that should be used to bind type syntax for the local. + + + + + Make a local variable symbol for an element of a deconstruction, + which can be inferred (if necessary) by binding the enclosing statement. + + + + Binder that owns the scope for the local, the one that returns it in its array. + + + Enclosing binder for the location where the local is declared. + It should be used to bind something at that location. + + + + + + + + + + Make a local variable symbol whose type can be inferred (if necessary) by binding and enclosing construct. + + + + + Make a local variable symbol which can be inferred (if necessary) by binding its initializing expression. + + + + Binder that owns the scope for the local, the one that returns it in its array. + + + + + + + + + Binder that should be used to bind initializer, if different from the . + + + + + + Gets the name of the local variable. + + + + + Gets the locations where the local symbol was originally defined in source. + There should not be local symbols from metadata, and there should be only one local variable declared. + TODO: check if there are multiple same name local variables - error symbol or local symbol? + + + + + Symbol for a local whose type can be inferred by binding its initializer. + + + + + Store the constant value and the corresponding diagnostics together + to avoid having the former set by one thread and the latter set by + another. + + + + + Determine the constant value of this local and the corresponding diagnostics. + Set both to constantTuple in a single operation for thread safety. + + Null for the initial call, non-null if we are in the process of evaluating a constant. + If we already have the bound node for the initial value, pass it in to avoid recomputing it. + + + + Symbol for a foreach iteration variable that can be inferred by binding the + collection element type of the foreach. + + + + + We initialize the base's ScopeBinder with a ForEachLoopBinder, so it is safe + to cast it to that type here. + + + + + There is no forbidden zone for a foreach loop, because the iteration + variable is not in scope in the collection expression. + + + + + Symbol for a deconstruction local that might require type inference. + For instance, local x in var (x, y) = ... or (var x, int y) = .... + + + + + Represents a named type symbol whose members are declared in source. + + + + + Compute the "effective accessibility" of the current class for the purpose of warnings about unused fields. + + + + + Encapsulates information about the non-type members of a (i.e. this) type. + 1) For non-initializers, symbols are created and stored in a list. + 2) For fields and properties/indexers, the symbols are stored in (1) and their initializers are + stored with other initialized fields and properties from the same syntax tree with + the same static-ness. + + + + + Calculates a syntax offset of a syntax position that is contained in a property or field initializer (if it is in fact contained in one). + + + + + For source symbols, there can only be a valid clone method if this is a record, which is a + simple syntax check. This will need to change when we generalize cloning, but it's a good + heuristic for now. + + + + + During early attribute decoding, we consider a safe subset of all members that will not + cause cyclic dependencies. Get all such members for this symbol. + + In particular, this method will return nested types and fields (other than auto-property + backing fields). + + + + + During early attribute decoding, we consider a safe subset of all members that will not + cause cyclic dependencies. Get all such members for this symbol that have a particular name. + + In particular, this method will return nested types and fields (other than auto-property + backing fields). + + + + + The purpose of this function is to assert that the symbol + is actually among the symbols cached by this type symbol in a way that ensures + that any consumer of standard APIs to get to type's members is going to get the same + symbol (same instance) for the member rather than an equivalent, but different instance. + + + + + Fix up a partial method by combining its defining and implementing declarations, updating the array of symbols (by name), + and returning the combined symbol. + + The symbols array containing both the latent and implementing declaration + One of the two declarations + The other declaration + An updated symbols array containing only one method symbol representing the two parts + + + + Report an error if a member (other than a method) exists with the same name + as the property accessor, or if a method exists with the same name and signature. + + + + + Report an error if a member (other than a method) exists with the same name + as the event accessor, or if a method exists with the same name and signature. + + + + + Return the location of the accessor, or if no accessor, the location of the property. + + + + + Return the location of the accessor, or if no accessor, the location of the event. + + + + + Return true if the method parameters match the parameters of the + property accessor, including the value parameter for the setter. + + + + + Return true if the method parameters match the parameters of the + event accessor, including the value parameter. + + + + + Returns true if the overall nullable context is enabled for constructors and initializers. + + Consider static constructor and fields rather than instance constructors and fields. + + + + In some circumstances (e.g. implicit implementation of an interface method by a non-virtual method in a + base type from another assembly) it is necessary for the compiler to generate explicit implementations for + some interface methods. They don't go in the symbol table, but if we are emitting, then we should + generate code for them. + + + + + It's not interesting to report diagnostics on implementation of interface accessors + if the corresponding events or properties are not implemented (i.e. we want to suppress + cascading diagnostics). + Caveat: Indexed property accessors are always interesting. + Caveat: It's also uninteresting if a WinRT event is implemented by a non-WinRT event, + or vice versa. + + + + + Return true if is valid for the return type of an override method when the overridden method's return type is . + + + + + if a diagnostic was added. Otherwise, . + + + + + Returns true if the method signature must match, with respect to scoped for ref safety, + in overrides, interface implementations, or delegate conversions. + + + + + Returns true if a scoped mismatch should be reported as an error rather than a warning. + + + + + Returns true if a diagnostic was added. + + + + + If necessary, report a diagnostic for a hidden abstract member. + + True if a diagnostic was reported. + + + + It is invalid for a type to directly (vs through a base class) implement two interfaces that + unify (i.e. are the same for some substitution of type parameters). + + + CONSIDER: check this while building up InterfacesAndTheirBaseInterfaces (only in the SourceNamedTypeSymbol case). + + + + + Though there is a method that C# considers to be an implementation of the interface method, that + method may not be considered an implementation by the CLR. In particular, implicit implementation + methods that are non-virtual or that have different (usually fewer) custom modifiers than the + interface method, will not be considered CLR overrides. To address this problem, we either make + them virtual (in metadata, not in C#), or we introduce an explicit interface implementation that + delegates to the implicit implementation. + + Returned from FindImplementationForInterfaceMemberWithDiagnostics. + The interface method or property that is being implemented. + + A synthesized forwarding method for the implementation, or information about MethodImpl entry that should be emitted, + or default if neither needed. + + + + + The CLR will only look for an implementation of an interface method in a type that + 1) declares that it implements that interface; or + 2) is a base class of a type that declares that it implements the interface but not + a subtype of a class that declares that it implements the interface. + + For example, + + interface I + class A + class B : A, I + class C : B + class D : C, I + + Suppose the runtime is looking for D's implementation of a member of I. It will look in + D because of (1), will not look in C, will look in B because of (1), and will look in A + because of (2). + + The key point is that it does not look in C, which C# *does*. + + + + + If C# picks a different implementation than the CLR (see IsPossibleImplementationUnderClrRules), then we might + still be okay, but dynamic dispatch might result in C#'s choice getting called anyway. + + + This is based on SymbolPreparer::IsCLRMethodImplSame in the native compiler. + + ACASEY: What the native compiler actually does is compute the C# answer, compute the CLR answer, + and then confirm that they override the same method. What I've done here is check for the situations + where the answers could disagree. I believe the results will be equivalent. If in doubt, a more conservative + check would be implementingMethod.ContainingType.InterfacesAndTheirBaseInterfaces.Contains(@interface). + + + + + Implementers should assume that a lock has been taken on MethodChecksLockObject. + In particular, it should not (generally) be necessary to use CompareExchange to + protect assignments to fields. + + + + + We can usually lock on the syntax reference of this method, but it turns + out that some synthesized methods (e.g. field-like event accessors) also + need to do method checks. This property allows such methods to supply + their own lock objects, so that we don't have to add a new field to every + SourceMethodSymbol. + + + + + Overridden by , + which might return locations of partial methods. + + + + + Checks to see if a body is legal given the current modifiers. + If it is not, a diagnostic is added with the current type. + + + + + Returns true if the method body is an expression, as expressed + by the syntax. False + otherwise. + + + If the method has both block body and an expression body + present, this is not treated as expression-bodied. + + + + + Base class to represent all source method-like symbols. This includes + things like ordinary methods and constructors, and functions + like lambdas and local functions. + + + + + If there are no constraints, returns an empty immutable array. Otherwise, returns an immutable + array of types, indexed by the constrained type parameter in . + + + + + If there are no constraints, returns an empty immutable array. Otherwise, returns an immutable + array of kinds, indexed by the constrained type parameter in . + + + + + A source method that can have attributes, including a member method, accessor, or local function. + + + + + Gets the syntax node used for the in-method binder. + + + + + Symbol to copy bound attributes from, or null if the attributes are not shared among multiple source method symbols. + + + Used for example for event accessors. The "remove" method delegates attribute binding to the "add" method. + The bound attribute data are then applied to both accessors. + + + + + Gets the syntax list of custom attributes that declares attributes for this method symbol. + + + + + Gets the syntax list of custom attributes that declares attributes for return type of this method. + + + + + Returns data decoded from special early bound well-known attributes applied to the symbol or null if there are no applied attributes. + + + Forces binding and decoding of attributes. + + + + + Returns data decoded from well-known attributes applied to the symbol or null if there are no applied attributes. + + + Forces binding and decoding of attributes. + + + + + Returns information retrieved from custom attributes on return type in source, or null if the symbol is not source symbol or there are none. + + + Forces binding and decoding of attributes. + + + + + Returns a bag of applied custom attributes and data decoded from well-known attributes. Returns null if there are no attributes applied on the symbol. + + + Forces binding and decoding of attributes. + + + + + Returns a bag of custom attributes applied on the method return value and data decoded from well-known attributes. Returns null if there are no attributes. + + + Forces binding and decoding of attributes. + + + + + Called when this thread loaded the method's attributes. For method symbols with completion state. + + + + + Gets the attributes applied on this symbol. + Returns an empty array if there are no attributes. + + + + + Gets the attributes applied on the return value of this method symbol. + Returns an empty array if there are no attributes. + + + + + Returns data decoded from Obsolete attribute or null if there is no Obsolete attribute. + This property returns ObsoleteAttributeData.Uninitialized if attribute arguments haven't been decoded yet. + + + + + Represents the primary module of an assembly being built by compiler. + + + + + Owning assembly. + + + + + The declarations corresponding to the source files of this module. + + + + + The name (contains extension) + + + + + This override is essential - it's a base case of the recursive definition. + + + + + Returns a bag of applied custom attributes and data decoded from well-known attributes. Returns null if there are no attributes applied on the symbol. + + + Forces binding and decoding of attributes. + + + + + Gets the attributes applied on this symbol. + Returns an empty array if there are no attributes. + + + NOTE: This method should always be kept as a sealed override. + If you want to override attribute binding logic for a sub-class, then override method. + + + + + Returns data decoded from well-known attributes applied to the symbol or null if there are no applied attributes. + + + Forces binding and decoding of attributes. + + + + + A collection of type parameter constraint types, populated when + constraint types for the first type parameter are requested. + + + + + A collection of type parameter constraint kinds, populated when + constraint kinds for the first type parameter are requested. + + + + + Returns the constraint types for the given type parameter. + + + + + Returns the constraint kind for the given type parameter. + + + + + Note, only nullability aspects are merged if possible, other mismatches are treated as failures. + + + + + Note, only nullability aspects are merged if possible, other mismatches are treated as failures. + + + + + Gets all the attribute lists for this named type. If is provided + the attribute lists will only be returned if there is reasonable belief that + the type has one of the attributes specified by on it. + This can avoid going back to syntax if we know the type definitely doesn't have an attribute + on it that could be the one specified by . Pass + to get all attribute declarations. + + + + + Returns a bag of applied custom attributes and data decoded from well-known attributes. Returns null if there are no attributes applied on the symbol. + + + Forces binding and decoding of attributes. + + + + + Gets the attributes applied on this symbol. + Returns an empty array if there are no attributes. + + + + + Returns data decoded from well-known attributes applied to the symbol or null if there are no applied attributes. + + + Forces binding and decoding of attributes. + + + + + Returns data decoded from special early bound well-known attributes applied to the symbol or null if there are no applied attributes. + + + Forces binding and decoding of attributes. + + + + + Returns data decoded from Obsolete attribute or null if there is no Obsolete attribute. + This property returns ObsoleteAttributeData.Uninitialized if attribute arguments haven't been decoded yet. + + + + + These won't be returned by GetAttributes on source methods, but they + will be returned by GetAttributes on metadata symbols. + + + + + Gets the BaseType of this type. If the base type could not be determined, then + an instance of ErrorType is returned. If this kind of type does not have a base type + (for example, interfaces), null is returned. Also the special class System.Object + always has a BaseType of null. + + + + + Gets the set of interfaces that this type directly implements. This set does not include + interfaces that are base interfaces of directly implemented interfaces. + + + + + Returns true if the type cannot be used as an explicit base class. + + + + + For enum types, gets the underlying type. Returns null on all other + kinds of types. + + + + + For enum types, returns the synthesized instance field used + for generating metadata. Returns null for non-enum types. + + + + + Completion state that tracks whether validation was done/not done/currently in process. + + + + + Completion state that tracks whether validation was done/not done/currently in process. + + + + + Register COR types declared in this namespace, if any, in the COR types cache. + + + + + A collection of type parameter constraint types, populated when + constraint types for the first type parameter is requested. + Initialized in two steps. Hold a copy if accessing during initialization. + + + + + A collection of type parameter constraint kinds, populated when + constraint kinds for the first type parameter is requested. + Initialized in two steps. Hold a copy if accessing during initialization. + + + + + If this symbol represents a partial method definition or implementation part, its other part (if any). + This should be set, if at all, before this symbol appears among the members of its owner. + The implementation part is not listed among the "members" of the enclosing type. + + + + + If this is a partial implementation part returns the definition part and vice versa. + + + + + Returns true if this symbol represents a partial method definition (the part that specifies a signature but no body). + + + + + Returns true if this symbol represents a partial method implementation (the part that specifies both signature and body). + + + + + True if this is a partial method that doesn't have an implementation part. + + + + + Returns the implementation part of a partial method definition, + or null if this is not a partial method or it is the definition part. + + + + + Returns the definition part of a partial method implementation, + or null if this is not a partial method or it is the implementation part. + + + + + Report differences between the defining and implementing + parts of a partial method. Diagnostics are reported on the + implementing part, matching Dev10 behavior. + + + + + Unlike , this type doesn't depend + on any specific kind of syntax node associated with it. Any syntax node is good enough + for it. + + + + + Base class for parameters can be referred to from source code. + + + These parameters can potentially be targeted by an attribute specified in source code. + As an optimization we distinguish simple parameters (no attributes, no modifiers, etc.) and complex parameters. + + + + + True if the parameter is marked by . + + + + + True if the parameter has default argument syntax. + + + + + Gets the attributes applied on this symbol. + Returns an empty array if there are no attributes. + + + + + The declaration diagnostics for a parameter depend on the containing symbol. + For instance, if the containing symbol is a method the declaration diagnostics + go on the compilation, but if it is a local function it is part of the local + function's declaration diagnostics. + + + + + The declared scope. From source, this is from the scope keyword only. + + + + + Base class for all parameters that are emitted. + + + + + Return Accessibility declared locally on the accessor, or + NotApplicable if no accessibility was declared explicitly. + + + + + Indicates whether this accessor itself has a 'readonly' modifier. + + + + + Indicates whether this accessor is readonly due to reasons scoped to itself and its containing property. + + + + + If we are outputting a .winmdobj then the setter name is put_, not set_. + + + + + The declaring syntax for the accessor, or property if there is no accessor-specific + syntax. + + + + + Condensed flags storing useful information about the + so that we do not have to go back to source to compute this data. + + + + + To facilitate lookup, all indexer symbols have the same name. + Check the MetadataName property to find the name that will be + emitted (based on IndexerNameAttribute, or the default "Item"). + + + + + Even though it is declared with an IndexerDeclarationSyntax, an explicit + interface implementation is not an indexer because it will not cause the + containing type to be emitted with a DefaultMemberAttribute (and even if + there is another indexer, the name of the explicit implementation won't + match). This is important for round-tripping. + + + + + The method is called at the end of constructor. + The implementation may depend only on information available from the type. + + + + + The method is called at the end of constructor. + The implementation may depend only on information available from the type. + + + + + Backing field for automatically implemented property, or + for a property with an initializer. + + + + + Return true if the accessor accessibility is more restrictive + than the property accessibility, otherwise false. + + + + + If this property is sealed, then we have to emit both accessors - regardless of whether + they are present in the source - so that they can be marked final. (i.e. sealed). + + + + + Only non-null for sealed properties without both accessors. + + + + + Returns a bag of custom attributes applied on the property and data decoded from well-known attributes. Returns null if there are no attributes. + + + Forces binding and decoding of attributes. + + + + + Gets the attributes applied on this symbol. + Returns an empty array if there are no attributes. + + + NOTE: This method should always be kept as a sealed override. + If you want to override attribute binding logic for a sub-class, then override method. + + + + + Returns data decoded from well-known attributes applied to the symbol or null if there are no applied attributes. + + + Forces binding and decoding of attributes. + + + + + Returns data decoded from special early bound well-known attributes applied to the symbol or null if there are no applied attributes. + + + Forces binding and decoding of attributes. + + + + + Returns data decoded from Obsolete attribute or null if there is no Obsolete attribute. + This property returns ObsoleteAttributeData.Uninitialized if attribute arguments haven't been decoded yet. + + + + + A source parameter that has no default value, no attributes, + and is not params. + + + + + Base class for type and method type parameters. + + + + + Gets the attributes applied on this symbol. + Returns an empty array if there are no attributes. + + + NOTE: This method should always be kept as a sealed override. + If you want to override attribute binding logic for a sub-class, then override method. + + + + + Returns a bag of applied custom attributes and data decoded from well-known attributes. Returns null if there are no attributes applied on the symbol. + + + Forces binding and decoding of attributes. + + + + + Check constraints of generic types referenced in constraint types. For instance, + with "interface I<T> where T : I<T> {}", check T satisfies constraints + on I<T>. Those constraints are not checked when binding ConstraintTypes + since ConstraintTypes has not been set on I<T> at that point. + + + + + A map shared by all type parameters for an overriding method or a method + that explicitly implements an interface. The map caches the overridden method + and a type map from overridden type parameters to overriding type parameters. + + + + + A type parameter for a method that either overrides a base + type method or explicitly implements an interface method. + + + Exists to copy constraints from the corresponding type parameter of an overridden method. + + + + + The type parameter to use for determining constraints. If there is a base + method that the owner method is overriding, the corresponding type + parameter on that method is used. Otherwise, the result is null. + + + + + Class to represent a synthesized attribute + + + + + A context for binding type parameter symbols of named types. + + + + + Type parameter has no type constraints, including `struct`, `class`, `unmanaged` and is declared in a context + where nullable annotations are disabled. + Cannot be combined with , or . + Note, presence of this flag suppresses generation of Nullable attribute on the corresponding type parameter. + This imitates the shape of metadata produced by pre-nullable compilers. Metadata import is adjusted accordingly + to distinguish between the two situations. + + + + + mismatch is detected during merging process for partial type declarations. + + + + + All bits involved into describing various aspects of 'class' constraint. + + + + + Any of these bits is equivalent to presence of 'struct' constraint. + + + + + All bits except those that are involved into describing various nullability aspects. + + + + + A simple representation of a type parameter constraint clause + as a set of constraint bits and a set of constraint types. + + + + + Either a SubstitutedNestedTypeSymbol or a ConstructedNamedTypeSymbol, which share in common that they + have type parameters substituted. + + + + + This field keeps track of the s for which we already retrieved + diagnostics. We shouldn't return from ForceComplete (i.e. indicate that diagnostics are + available) until this is equal to , except that when completing + with a given position, we might not complete .Member*. + + Since completeParts is used as a flag indicating completion of other assignments + it must be volatile to ensure the read is not reordered/optimized to happen + before the writes. + + + + + Used to force (source) symbols to a given state of completion when the only potential remaining + part is attributes. This does force the invariant on the caller that the implementation of + of will set the part on + the thread that actually completes the loading of attributes. Failure to do so will potentially + result in a deadlock. + + The owning source symbol. + + + + Produce the next (i.e. lowest) CompletionPart (bit) that is not set. + + + + + Since this formula is rather opaque, a demonstration of its correctness is + provided in Roslyn.Compilers.CSharp.UnitTests.CompletionTests.TestHasAtMostOneBitSet. + + + + + A comparer that treats dynamic and object as "the same" types, and also ignores tuple element names differences. + + + + + Synthesized namespace that contains synthesized types or subnamespaces. + All its members are stored in a table on . + + + + + Parses generated local function name out of a generated method name. + + + + + This method will work with either unmangled or mangled type names as input, but it does not remove any arity suffix if present. + + + + + Produces name of the synthesized delegate symbol that encodes the parameter byref-ness and return type of the delegate. + The arity is appended via `N suffix in MetadataName calculation since the delegate is generic. + + + Logic here should match . + + + + + Parses the name of a synthesized delegate out into the things it represents. + + + Logic here should match . + + + + + A synthesized local variable with a val escape scope. + + + + + If the record type is derived from a base record type Base, the record type includes + a synthesized override of the strongly-typed Equals(Base other). The synthesized + override is sealed. It is an error if the override is declared explicitly. + The synthesized override returns Equals((object?)other). + + + + + If a virtual "clone" method is present in the base record, the synthesized "clone" method overrides it + and the return type of the method is the current containing type if the "covariant returns" feature is + supported and the override return type otherwise. An error is produced if the base record clone method + is sealed. If a virtual "clone" method is not present in the base record, the return type of the clone + method is the containing type and the method is virtual, unless the record is sealed or abstract. + If the containing record is abstract, the synthesized clone method is also abstract. + If the "clone" method is not abstract, it returns the result of a call to a copy constructor. + + + + + The record type includes synthesized '==' and '!=' operators equivalent to operators declared as follows: + + For record class: + public static bool operator==(R? left, R? right) + => (object) left == right || ((object)left != null && left.Equals(right)); + public static bool operator !=(R? left, R? right) + => !(left == right); + + For record struct: + public static bool operator==(R left, R right) + => left.Equals(right); + public static bool operator !=(R left, R right) + => !(left == right); + + The 'Equals' method called by the '==' operator is the 'Equals(R? other)' (). + The '!=' operator delegates to the '==' operator. It is an error if the operators are declared explicitly. + + + + + The record type includes synthesized '==' and '!=' operators equivalent to operators declared as follows: + + For record class: + public static bool operator==(R? left, R? right) + => (object) left == right || ((object)left != null && left.Equals(right)); + public static bool operator !=(R? left, R? right) + => !(left == right); + + For record struct: + public static bool operator==(R left, R right) + => left.Equals(right); + public static bool operator !=(R left, R right) + => !(left == right); + + The 'Equals' method called by the '==' operator is the 'Equals(R? other)' (). + The '!=' operator delegates to the '==' operator. It is an error if the operators are declared explicitly. + + + + + Unless explicitly declared, a record includes a synthesized strongly-typed overload + of `Equals(R? other)` where `R` is the record type. + The method is `public`, and the method is `virtual` unless the record type is `sealed`. + + + + + The record type includes a synthesized override of object.GetHashCode(). + The method can be declared explicitly. It is an error if the explicit + declaration is sealed unless the record type is sealed. + + + + + The record type includes synthesized '==' and '!=' operators equivalent to operators declared as follows: + + For record class: + public static bool operator==(R? left, R? right) + => (object) left == right || ((object)left != null && left.Equals(right)); + public static bool operator !=(R? left, R? right) + => !(left == right); + + For record struct: + public static bool operator==(R left, R right) + => left.Equals(right); + public static bool operator !=(R left, R right) + => !(left == right); + + The 'Equals' method called by the '==' operator is the 'Equals(R? other)' (). + The '!=' operator delegates to the '==' operator. It is an error if the operators are declared explicitly. + + + + + Common base for ordinary methods overriding methods from object synthesized by compiler for records. + + + + + Returns true if reported an error + + + + + The record type includes a synthesized override of object.Equals(object? obj). + It is an error if the override is declared explicitly. The synthesized override + returns Equals(other as R) where R is the record type. + + + + + Common base for ordinary methods synthesized by compiler for records. + + + + + The `bool PrintMembers(StringBuilder)` method is responsible for printing members declared + in the containing type that are "printable" (public fields and properties), + and delegating to the base to print inherited printable members. Base members get printed first. + It returns true if the record contains some printable members. + The method is used to implement `ToString()`. + + + + + The record includes a synthesized override of object.ToString(). + For `record R(int I) { public int J; }` it prints `R { I = ..., J = ... }`. + + The method can be declared explicitly. It is an error if the explicit + declaration does not match the expected signature or accessibility, or + if the explicit declaration doesn't allow overriding it in a derived type and + the record type is not sealed. + It is an error if either synthesized or explicitly declared method doesn't + override `object.ToString()` (for example, due to shadowing in intermediate base types, etc.). + + + + + Represents the compiler generated value parameter for property/event accessor. + This parameter has no source location/syntax, but may have attributes. + Attributes with 'param' target specifier on the accessor must be applied to the this parameter. + + + + + Represents a compiler generated backing field for an automatically implemented property. + + + + + A container synthesized for a lambda, iterator method, or async method. + + + + + Represents a compiler generated and embedded attribute type. + This type has the following properties: + 1) It is non-generic, sealed, internal, non-static class. + 2) It derives from System.Attribute + 3) It has Microsoft.CodeAnalysis.EmbeddedAttribute + 4) It has System.Runtime.CompilerServices.CompilerGeneratedAttribute + + + + + Represents a compiler generated and embedded attribute type with a single default constructor + + + + + Represents an interactive code entry point that is inserted into the compilation if there is not an existing one. + + + + A synthesized entrypoint that forwards all calls to an async Main Method + + + The syntax for the user-defined asynchronous main method. + + + The user-defined asynchronous main method. + + + + Represents __value field of an enum. + + + + + Event accessor that has been synthesized for a field-like event declared in source, + or for an event re-abstraction in an interface. + + + Associated with and . + + + + + Represents a compiler generated field. + + + Represents a compiler generated field of given type and name. + + + + + Represents a compiler generated field or captured variable. + + + + + Represents a compiler generated synthesized method symbol + that must be emitted in the compiler generated + PrivateImplementationDetails class + + + + + Synthesized methods that must be emitted in the compiler generated + PrivateImplementationDetails class have null containing type symbol. + + + + + A base class for synthesized methods that want a this parameter. + + + + + Returns data decoded from Obsolete attribute or null if there is no Obsolete attribute. + This property returns ObsoleteAttributeData.Uninitialized if attribute arguments haven't been decoded yet. + + + + + A synthesized local variable. + + + + + Compiler should always be synthesizing locals with correct escape semantics. + Checking escape scopes is not valid here. + + + + + Compiler should always be synthesizing locals with correct escape semantics. + Checking escape scopes is not valid here. + + + + + Throws an exception of a given type using a parameterless constructor. + + + + + Represents a simple compiler generated parameter of a given type. + + + + + For each parameter of a source method, construct a corresponding synthesized parameter + for a destination method. + + Has parameters. + Needs parameters. + Synthesized parameters to add to destination method. + + + + The corresponding . + + + + + A type parameter for a synthesized class or method. + + + + + Throws a System.ArgumentNullException if 'argument' is null. + + + + + Throws a System.ArgumentNullException with the given 'paramName'. + + + + + Throws a 'System.Runtime.CompilerServices.SwitchExpressionException' with the given 'unmatchedValue'. + + + + + Compiler should always be synthesizing locals with correct escape semantics. + Checking escape scopes is not valid here. + + + + + Compiler should always be synthesizing locals with correct escape semantics. + Checking escape scopes is not valid here. + + + + + Compiler should always be synthesizing locals with correct escape semantics. + Checking escape scopes is not valid here. + + + + + Represents a field of a tuple type (such as (int, byte).Item1) + that doesn't have a corresponding backing field within the tuple underlying type. + Created in response to an error condition. + + + + + If this field represents a tuple element with index X + 2X if this field represents Default-named element + 2X + 1 if this field represents Friendly-named element + Otherwise, (-1 - [index in members array]); + + + + + If this is a field representing a tuple element, + returns the index of the element (zero-based). + Otherwise returns -1 + + + + + A plain TupleElementFieldSymbol (as opposed to a TupleVirtualElementFieldSymbol) represents + an element field of a tuple type (such as (int, byte).Item1) that is backed by a real field + with the same name within the tuple underlying type. + + Note that original tuple fields (like 'System.ValueTuple`2.Item1') do not get wrapped. + + + + + If this field represents a tuple element with index X + 2X if this field represents Default-named element + 2X + 1 if this field represents Friendly-named element + + + + + If this is a field representing a tuple element, + returns the index of the element (zero-based). + Otherwise returns -1 + + + + + Represents an element field of a tuple type that is not backed by a real field + with the same name within the tuple type. + + Examples + // alias to Item1 with a different name + (int a, byte b).a + + // not backed directly by the type + (int i1, int i2, int i3, int i4, int i5, int i6, int i7, int i8).i8 + + // Item8, which is also not backed directly by the type + (int, int, int, int, int, int, int, int).Item8 + + NOTE: For any virtual element, there is a nonvirtual way to access the same underlying field. + In scenarios where we need to enumerate actual fields of a struct, + virtual fields should be ignored. + + + + + Utility class for substituting actual type arguments for formal generic type parameters. + + + + + The effective "bounds" of a type parameter: the constraint types, effective + interface set, and effective base type, determined from the declared + constraints, with any cycles removed. The fields are exposed by the + TypeParameterSymbol as ConstraintTypes, Interfaces, and BaseType. + + + + + Creates a "late" bound instance with all fields set. + + + + + The type parameters, classes, and interfaces explicitly declared as + constraint types on the containing type parameter, with cycles removed. + + + + + The set of interfaces explicitly declared on the containing type + parameter and any type parameters on which the containing + type parameter depends, with duplicates removed. + + + + + As defined in 10.1.5 of the specification. + + + + + The "exact" effective base type. + In the definition of effective base type we abstract some concrete types to their base classes: + * For each constraint of T that is a struct-type, R contains System.ValueType. + * For each constraint of T that is an enumeration type, R contains System.Enum. + * For each constraint of T that is a delegate type, R contains System.Delegate. + * For each constraint of T that is an array type, R contains System.Array. + * For each constraint of T that is a class-type C, R contains type C' which is constructed + from C by replacing all occurrences of dynamic with object. + The reason is that the CLR doesn't support operations on generic parameters that would be needed + to work with these types. For example, ldelem instruction requires the receiver to be a specific array, + not a type parameter constrained to be an array. + + When computing the deduced type we don't perform this abstraction. We keep the original constraint T. + Deduced base type is used to check that consistency rules are satisfied. + + + + + A TypeSymbol is a base class for all the symbols that represent a type + in C#. + + + + + + + + + + key = interface method/property/event compared using , + value = explicitly implementing methods/properties/events declared on this type (normally a single value, multiple in case of + an error). + + + + + The original definition of this symbol. If this symbol is constructed from another + symbol by type substitution then OriginalDefinition gets the original symbol as it was defined in + source or metadata. + + + + + Gets the BaseType of this type. If the base type could not be determined, then + an instance of ErrorType is returned. If this kind of type does not have a base type + (for example, interfaces), null is returned. Also the special class System.Object + always has a BaseType of null. + + + + + Gets the set of interfaces that this type directly implements. This set does not include + interfaces that are base interfaces of directly implemented interfaces. + + + + + The list of all interfaces of which this type is a declared subtype, excluding this type + itself. This includes all declared base interfaces, all declared base interfaces of base + types, and all declared base interfaces of those results (recursively). Each result + appears exactly once in the list. This list is topologically sorted by the inheritance + relationship: if interface type A extends interface type B, then A precedes B in the + list. This is not quite the same as "all interfaces of which this type is a proper + subtype" because it does not take into account variance: AllInterfaces for + IEnumerable<string> will not include IEnumerable<object> + + + + + If this is a type parameter returns its effective base class, otherwise returns this type. + + + + + Returns true if this type derives from a given type. + + + + + Returns true if this type is equal or derives from a given type. + + + + + Determines if this type symbol represent the same type as another, according to the language + semantics. + + The other type. + + What kind of comparison to use? + You can ignore custom modifiers, ignore the distinction between object and dynamic, or ignore tuple element names differences. + + True if the types are equivalent. + + + + We ignore custom modifiers, and the distinction between dynamic and object, when computing a type's hash code. + + + + + Produce all implemented interfaces in topologically sorted order. We use + TypeSymbol.Interfaces as the source of edge data, which has had cycles and infinitely + long dependency cycles removed. Consequently, it is possible (and we do) use the + simplest version of Tarjan's topological sorting algorithm. + + + + Gets the set of interfaces that this type directly implements, plus the base interfaces + of all such types. Keys are compared using , + values are distinct interfaces corresponding to the key, according to rules. + + + CONSIDER: it probably isn't truly necessary to cache this. If space gets tight, consider + alternative approaches (recompute every time, cache on the side, only store on some types, + etc). + + + + + Returns the corresponding symbol in this type or a base type that implements + interfaceMember (either implicitly or explicitly), or null if no such symbol exists + (which might be either because this type doesn't implement the container of + interfaceMember, or this type doesn't supply a member that successfully implements + interfaceMember). + + + Must be a non-null interface property, method, or event. + + + + + Returns true if this type is known to be a reference type. It is never the case that + IsReferenceType and IsValueType both return true. However, for an unconstrained type + parameter, IsReferenceType and IsValueType will both return false. + + + + + Returns true if this type is known to be a value type. It is never the case that + IsReferenceType and IsValueType both return true. However, for an unconstrained type + parameter, IsReferenceType and IsValueType will both return false. + + + + + Gets the kind of this type. + + + + + Gets corresponding special TypeId of this type. + + + Not preserved in types constructed from this one. + + + + + Gets corresponding primitive type code for this type declaration. + + + + + Returns true if the error code is highest priority while calculating use site error for this symbol. + + + + + Is this a symbol for an anonymous type (including delegate). + + + + + Is this a symbol for a Tuple. + + + + + True if the type represents a native integer. In C#, the types represented + by language keywords 'nint' and 'nuint' on platforms where they are not unified + with 'System.IntPtr' and 'System.UIntPtr'. + + + + + Verify if the given type is a tuple of a given cardinality, or can be used to back a tuple type + with the given cardinality. + + + + + If this symbol represents a tuple type, get the types of the tuple's elements. + + + + + If this symbol represents a tuple type, get the names of the tuple's elements. + + + + + If this symbol represents a tuple type, get the fields for the tuple's elements. + Otherwise, returns default. + + + + + Is this type a managed type (false for everything but enum, pointer, and + some struct types). + + + See Type::computeManagedType. + + + + + Indicates whether a type is managed or not (i.e. you can take a pointer to it). + Contains additional cases to help implement FeatureNotAvailable diagnostics. + + + + + Merges features of the type with another type where there is an identity conversion between them. + The features to be merged are + object vs dynamic (dynamic wins), tuple names (dropped in case of conflict), and nullable + annotations (e.g. in type arguments). + + + + + Returns true if the type may contain embedded references + + + + + Returns true if the type is a readonly struct + + + + + Locate implementation of the in context of the current type. + The method is using cache to optimize subsequent calls for the same . + + Member for which an implementation should be found. + + The process of looking up an implementation for an accessor can involve figuring out how corresponding event/property is implemented, + . And the process of looking up an implementation for a property can + involve figuring out how corresponding accessors are implemented, . This can + lead to cycles, which could be avoided if we ignore the presence of implementations in interfaces for the purpose of + . Fortunately, logic in it allows us to ignore the presence of + implementations in interfaces and we use that. + When the value of this parameter is true and the result that takes presence of implementations in interfaces into account is not + available from the cache, the lookup will be performed ignoring the presence of implementations in interfaces. Otherwise, result from + the cache is returned. + When the value of the parameter is false, the result from the cache is returned, or calculated, taking presence of implementations + in interfaces into account and then cached. + This means that: + - A symbol from an interface can still be returned even when is true. + A subsequent call with false will return the same value. + - If symbol from a non-interface is returned when is true. A subsequent + call with false will return the same value. + - If no symbol is returned for true. A subsequent call with + might return a symbol, but that symbol guaranteed to be from an interface. + - If the first request is done with false. A subsequent call + is guaranteed to return the same result regardless of value. + + + + + Performs interface mapping (spec 13.4.4). + + + CONSIDER: we could probably do less work in the metadata and retargeting cases - we won't use the diagnostics. + + A non-null implementable member on an interface type. + The type implementing the interface property (usually "this"). + Bag to which to add diagnostics. + Do not consider implementation in an interface as a valid candidate for the purpose of this computation. + + Returns true when is true, the method fails to locate an implementation and an implementation in + an interface, if any (its presence is not checked), could potentially be a candidate. Returns false otherwise. + When true is returned, a different call with false might return a symbol. That symbol, if any, + is guaranteed to be from an interface. + This parameter is used to optimize caching in . + + The implementing property or null, if there isn't one. + + + + One implementation M1 is considered more specific than another implementation M2 + if M1 is declared on interface T1, M2 is declared on interface T2, and + T1 contains T2 among its direct or indirect interfaces. + + + + + Since dev11 didn't expose a symbol API, it had the luxury of being able to accept a base class's claim that + it implements an interface. Roslyn, on the other hand, needs to be able to point to an implementing symbol + for each interface member. + + DevDiv #718115 was triggered by some unusual metadata in a Microsoft reference assembly (Silverlight System.Windows.dll). + The issue was that a type explicitly implemented the accessors of an interface event, but did not tie them together with + an event declaration. To make matters worse, it declared its own protected event with the same name as the interface + event (presumably to back the explicit implementation). As a result, when Roslyn was asked to find the implementing member + for the interface event, it found the protected event and reported an appropriate diagnostic. What it should have done + (and does do now) is recognize that no event associated with the accessors explicitly implementing the interface accessors + and returned null. + + We resolved this issue by introducing a new step into the interface mapping algorithm: after failing to find an explicit + implementation in a type, but before searching for an implicit implementation in that type, check for an explicit implementation + of an associated accessor. If there is such an implementation, then immediately return the associated property or event, + even if it is null. That is, never attempt to find an implicit implementation for an interface property or event with an + explicitly implemented accessor. + + + + + If we were looking for an accessor, then look for an accessor on the implementation of the + corresponding interface property/event. If it is valid as an implementation (ignoring the name), + then prefer it to our current result if: + 1) our current result is null; or + 2) our current result is on the same type. + + If there is no corresponding accessor on the implementation of the corresponding interface + property/event and we found an accessor, then the accessor we found is invalid, so clear it. + + + + + These diagnostics are for members that do implicitly implement an interface member, but do so + in an undesirable way. + + + + + These diagnostics are for members that almost, but not actually, implicitly implement an interface member. + + + + + Determine a better location for diagnostic squiggles. Squiggle the interface rather than the class. + + + + + Search the declared members of a type for one that could be an implementation + of a given interface member (depending on interface declarations). + + The interface member being implemented. + True if the implementing type is from some compilation (i.e. not from metadata). + The type on which we are looking for a declared implementation of the interface member. + A member on currType that could implement the interface, or null. + A member on currType that could have been an attempt to implement the interface, or null. + + There is some similarity between this member and OverriddenOrHiddenMembersHelpers.FindOverriddenOrHiddenMembersInType. + When making changes to this member, think about whether or not they should also be applied in MemberSymbol. + One key difference is that custom modifiers are considered when looking up overridden members, but + not when looking up implicit implementations. We're preserving this behavior from Dev10. + + + + + To implement an interface member, a candidate member must be public, non-static, and have + the same signature. "Have the same signature" has a looser definition if the type implementing + the interface is from source. + + + PROPERTIES: + NOTE: we're not checking whether this property has at least the accessors + declared in the interface. Dev10 considers it a match either way and, + reports failure to implement accessors separately. + + If the implementing type (i.e. the type with the interface in its interface + list) is in source, then we can ignore custom modifiers in/on the property + type because they will be copied into the bridge property that explicitly + implements the interface property (or they would be, if we created such + a bridge property). Bridge *methods* (not properties) are inserted in + SourceMemberContainerTypeSymbol.SynthesizeInterfaceMemberImplementation. + + CONSIDER: The spec for interface mapping (13.4.4) could be interpreted to mean that this + property is not an implementation unless it has an accessor for each accessor of the + interface property. For now, we prefer to represent that case as having an implemented + property and an unimplemented accessor because it makes finding accessor implementations + much easier. If we decide that we want the API to report the property as unimplemented, + then it might be appropriate to keep current result internally and just check the accessors + before returning the value from the public API (similar to the way MethodSymbol.OverriddenMethod + filters MethodSymbol.OverriddenOrHiddenMembers. + + + + + If implementation of an interface method will be accompanied with + a MethodImpl entry in metadata, information about which isn't already exposed through + API, this method returns the "Body" part + of the MethodImpl entry, i.e. the method that implements the . + Some of the MethodImpl entries could require synthetic forwarding methods. In such cases, + the result is the method that the language considers to implement the , + rather than the forwarding method. In other words, it is the method that the forwarding method forwards to. + + The interface method that is going to be implemented by using synthesized MethodImpl entry. + + + + + Returns information about interface method implementations that will be accompanied with + MethodImpl entries in metadata, information about which isn't already exposed through + API. The "Body" is the method that + implements the interface method "Implemented". + Some of the MethodImpl entries could require synthetic forwarding methods. In such cases, + the "Body" is the method that the language considers to implement the interface method, + the "Implemented", rather than the forwarding method. In other words, it is the method that + the forwarding method forwards to. + + + + + The set of abstract members in declared in this type or declared in a base type and not overridden. + + + + + Represents the method by which this type implements a given interface type + and/or the corresponding diagnostics. + + + + + Assuming that nullable annotations are enabled: + T => true + T where T : struct => false + T where T : class => false + T where T : class? => true + T where T : IComparable => true + T where T : IComparable? => true + T where T : notnull => true + + + In C#9, annotations are allowed regardless of constraints. + + + + + Assuming that nullable annotations are enabled: + T => true + T where T : struct => false + T where T : class => false + T where T : class? => true + T where T : IComparable => false + T where T : IComparable? => true + + + + + Is this System.Nullable`1 type, or its substitution. + + To check whether a type is System.Nullable`1 or is a type parameter constrained to System.Nullable`1 + use instead. + + + + + Determines if the given type is a valid attribute parameter type. + + Type to validated + compilation + + + + + Gets the typed constant kind for the given attribute parameter type. + + Type to validated + compilation + TypedConstantKind for the attribute parameter type. + + + + Returns true if the type is constructed from a generic type named "System.Linq.Expressions.Expression" + with one type parameter. + + + + + Returns true if the type is a non-generic type named "System.Linq.Expressions.Expression" + or "System.Linq.Expressions.LambdaExpression". + + + + + Returns true if the type is constructed from a generic type named "System.Linq.Expressions.Expression" + with one type parameter, or if the type is a non-generic type named "System.Linq.Expressions.Expression" + or "System.Linq.Expressions.LambdaExpression". + + + + + return true if the type is constructed from a generic interface that + might be implemented by an array. + + + + + Return the default value constant for the given type, + or null if the default value is not a constant. + + + + + Visit the given type and, in the case of compound types, visit all "sub type" + (such as A in A[], or { A<T>, T, U } in A<T>.B<U>) invoking 'predicate' + with the type and 'arg' at each sub type. If the predicate returns true for any type, + traversal stops and that type is returned from this method. Otherwise if traversal + completes without the predicate returning true for any type, this method returns null. + + + + + Visit the given type and, in the case of compound types, visit all "sub type". + One of the predicates will be invoked at each type. If the type is a + TypeWithAnnotations, + will be invoked; otherwise will be invoked. + If the corresponding predicate returns true for any type, + traversal stops and that type is returned from this method. Otherwise if traversal + completes without the predicate returning true for any type, this method returns null. + + If true, use + instead of to avoid early resolution of nullable types + + + + (null TypeParameterSymbol "parameter"): Checks if the given type is a type parameter + or its referent type is a type parameter (array/pointer) or contains a type parameter (aggregate type) + (non-null TypeParameterSymbol "parameter"): above + also checks if the type parameter + is the same as "parameter" + + + + + Return true if the type contains any dynamic type reference. + + + + + Return true if the type contains any tuples. + + + + + Return true if the type contains any tuples with element names. + + + + + Return true if the type contains any function pointer types. + + + + + Guess the non-error type that the given type was intended to represent. + If the type itself is not an error type, then it will be returned. + Otherwise, the underlying type (if any) of the error type will be + returned. + + + Any non-null type symbol returned is guaranteed not to be an error type. + + It is possible to pass in a constructed type and received back an + unconstructed type. This can occur when the type passed in was + constructed from an error type - the underlying definition will be + available, but there won't be a good way to "re-substitute" back up + to the level of the specified type. + + + + + Guess the non-error type kind that the given type was intended to represent, + if possible. If not, return TypeKind.Error. + + + + + Returns true if the type was a valid switch expression type in C# 6. We use this test to determine + whether or not we should attempt a user-defined conversion from the type to a C# 6 switch governing + type, which we support for compatibility with C# 6 and earlier. + + + + + Returns true if the type is one of the restricted types, namely: , + , or . + or a ref-like type. + + + + + Add this instance to the set of checked types. Returns true + if this was added, false if the type was already in the set. + + + + + These special types are structs that contain fields of the same type + (e.g. contains an instance field of type ). + + + + + Compute a hash code for the constructed type. The return value will be + non-zero so callers can used zero to represent an uninitialized value. + + + + + If we are in a COM PIA with embedInteropTypes enabled we should turn properties and methods + that have the type and return type of object, respectively, into type dynamic. If the requisite conditions + are fulfilled, this method returns a dynamic type. If not, it returns the original type. + + A property type or method return type to be checked for dynamification. + Containing type. + + + + + Type variables are never considered reference types by the verifier. + + + + + Type variables are never considered value types by the verifier. + + + + + Return all of the type parameters in this type and enclosing types, + from outer-most to inner-most type. + + + + + Return all of the type parameters in this type and enclosing types, + from outer-most to inner-most type. + + + + + Return the nearest type parameter with the given name in + this type or any enclosing type. + + + + + Return the nearest type parameter with the given name in + this symbol or any enclosing symbol. + + + + + Return true if the fully qualified name of the type's containing symbol + matches the given name. This method avoids string concatenations + in the common case where the type is a top-level type. + + + + + Returns true if the type is generic or non-generic custom task-like type due to the + [AsyncMethodBuilder(typeof(B))] attribute. It returns the "B". + + + For the Task types themselves, this method might return true or false depending on mscorlib. + The definition of "custom task-like type" is one that has an [AsyncMethodBuilder(typeof(B))] attribute, + no more, no less. Validation of builder type B is left for elsewhere. This method returns B + without validation of any kind. + + + + + Replace Task-like types with Task types. + + + + + Replace Task-like types with Task types. Returns true if there were changes. + + + + + Count the custom modifiers within the specified TypeSymbol. + Potentially non-zero for arrays, pointers, and generic instantiations. + + + + + Check for custom modifiers within the specified TypeSymbol. + Potentially true for arrays, pointers, and generic instantiations. + + + A much less efficient implementation would be CustomModifierCount() == 0. + CONSIDER: Could share a backing method with CustomModifierCount. + + + + + Return true if this type can unify with the specified type + (i.e. is the same for some substitution of type parameters). + + + + + Used when iterating through base types in contexts in which the caller needs to avoid cycles and can't use BaseType + (perhaps because BaseType is in the process of being computed) + + + + + + + + + + A struct that combines a single type with annotations + + + + + The underlying type, unless overridden by _extensions. + + + + + Additional data or behavior. Such cases should be + uncommon to minimize allocations. + + + + + True if the fields are unset. Appropriate when detecting if a lazily-initialized variable has been initialized. + + + + + True if the type is not null. + + + + + If this is a lazy nullable type pending resolution, forces this to be resolved. + + + + + Merges top-level and nested nullability, dynamic/object, and tuple names from an otherwise equivalent type. + + + + + Is this System.Nullable`1 type, or its substitution. + + To check whether a type is System.Nullable`1 or is a type parameter constrained to System.Nullable`1 + use instead. + + + + + The list of custom modifiers, if any, associated with the . + + + + + Extract type under assumption that there should be no custom modifiers or annotations. + The method asserts otherwise. + + + + + Is this the given type parameter? + + + + + Used by callers before calling CSharpCompilation.EnsureNullableAttributeExists(). + + + This method ignores any [NullableContext]. For example, if there is a [NullableContext(1)] + at the containing type, and this type reference is oblivious, NeedsNullableAttribute() + will return false even though a [Nullable(0)] will be emitted for this type reference. + In practice, this shouldn't be an issue though since EnsuresNullableAttributeExists() + will have returned true for at least some of other type references that required + [Nullable(1)] and were subsequently aggregated to the [NullableContext(1)]. + + + + + If the type is a non-generic value type or Nullable<>, and + is not a type parameter, the nullability is not included in the byte[]. + + + + + Used by the generated . + + + + + Used by the generated . + + + + + Compute the flow state resulting from reading from an lvalue. + + + + + Additional data or behavior beyond the core TypeWithAnnotations. + + + + + Nullable type parameter. The underlying TypeSymbol is resolved + lazily to avoid cycles when binding declarations. + + + + + A type and its corresponding flow state resulting from evaluating an rvalue expression. + + + + + Creates a new for testing purposes, + which does not verify that the containing symbol matches the original containing symbol. + + + + + This class groups together all of the functionality needed to check for error CS1961, ERR_UnexpectedVariance. + Its functionality is accessible through the NamedTypeSymbol extension method CheckInterfaceVarianceSafety and + the MethodSymbol extension method CheckMethodVarianceSafety (for checking delegate Invoke). + + + + + Accumulate diagnostics related to the variance safety of an interface. + + + + + Check for illegal nesting into a variant interface. + + + + + Accumulate diagnostics related to the variance safety of a delegate. + + + + + Accumulate diagnostics related to the variance safety of an interface method. + + + + + Accumulate diagnostics related to the variance safety of an interface property. + + + + + Accumulate diagnostics related to the variance safety of an interface event. + + + + + Accumulate diagnostics related to the variance safety of an interface method/property parameter. + + + + + Accumulate diagnostics related to the variance safety of an interface method type parameters. + + + + + Returns true if the type is output-unsafe or input-unsafe, as defined in the C# spec. + Roughly, a type is output-unsafe if it could not be the return type of a method and + input-unsafe if it could not be a parameter type of a method. + + + This method is intended to match spec section 13.1.3.1 as closely as possible + (except that the output-unsafe and input-unsafe checks are merged). + + + + + 3) T is an interface, class, struct, enum, or delegate type ]]> constructed + from a generic type ]]> where for at least one A_i one + of the following holds: + a) X_i is covariant or invariant and A_i is output-unsafe [input-unsafe] + b) X_i is contravariant or invariant and A_i is input-unsafe [output-unsafe] (note: spec has "input-safe", but it's a typo) + + + Slight rewrite to make it more idiomatic for C#: + a) X_i is covariant and A_i is input-unsafe + b) X_i is contravariant and A_i is output-unsafe + c) X_i is invariant and A_i is input-unsafe or output-unsafe + + + + + Add an ERR_UnexpectedVariance diagnostic to the diagnostic bag. + + Diagnostic bag. + Type parameter that is not variance safe. + Context in which type is not variance safe (e.g. method). + Callback to provide location. + Callback argument. + Desired variance of type. + + + + Represents an event that is based on another event. + When inheriting from this class, one shouldn't assume that + the default behavior it has is appropriate for every case. + That behavior should be carefully reviewed and derived type + should override behavior as appropriate. + + + + + The underlying EventSymbol. + + + + + Represents a field that is based on another field. + When inheriting from this class, one shouldn't assume that + the default behavior it has is appropriate for every case. + That behavior should be carefully reviewed and derived type + should override behavior as appropriate. + + + + + The underlying FieldSymbol. + + + + + Represents a method that is based on another method. + When inheriting from this class, one shouldn't assume that + the default behavior it has is appropriate for every case. + That behavior should be carefully reviewed and derived type + should override behavior as appropriate. + + + + + Represents a named type that is based on another named type. + When inheriting from this class, one shouldn't assume that + the default behavior it has is appropriate for every case. + That behavior should be carefully reviewed and derived type + should override behavior as appropriate. + + + + + The underlying NamedTypeSymbol. + + + + + Represents a parameter that is based on another parameter. + When inheriting from this class, one shouldn't assume that + the default behavior it has is appropriate for every case. + That behavior should be carefully reviewed and derived type + should override behavior as appropriate. + + + + + Represents a property that is based on another property. + When inheriting from this class, one shouldn't assume that + the default behavior it has is appropriate for every case. + That behavior should be carefully reviewed and derived type + should override behavior as appropriate. + + + + + The underlying PropertySymbol. + + + + + Represents a type parameter that is based on another type parameter. + When inheriting from this class, one shouldn't assume that + the default behavior it has is appropriate for every case. + That behavior should be carefully reviewed and derived type + should override behavior as appropriate. + + + + + The underlying TypeParameterSymbol, cannot be another RetargetingTypeParameterSymbol. + + + + + Traverses the symbol table checking for CLS compliance. + + + + + + + + Gets a value indicating whether is allowed to analyze in parallel. + + + + + Traverses the symbol table checking for CLS compliance. + + Compilation that owns the symbol table. + Will be supplemented with documentation comment diagnostics. + To stop traversing the symbol table early. + Only report diagnostics from this syntax tree, if non-null. + If and is non-null, report diagnostics within this span in the . + + + False if no further checks are required (because they would be cascading). + + + + BREAK: Dev11 reports WRN_CLS_ArrayArgumentToAttribute on all symbols, whereas roslyn reports it only + on accessible symbols. + + + + True if the symbol is okay (i.e. no warnings). + + + + NOTE: Dev11 behavior - First, it ignores arity, + which seems like a good way to disambiguate symbols (in particular, + CLS Rule 43 says that the name includes backtick-arity). Second, it + does not consider two members with identical names (i.e. not differing + in case) to collide. + + + + + This check (the only one that uses the "context" parameter is based on CLS Rule 46, + as implemented by LangCompiler::IsCLSAccessible. The idea is that C<int> and C<char> + are separate types in CLS, so they can't touch each other's protected members. + TODO: This should really have a separate error code - it's logically separate and requires explanation. + + Check the accessibility of this type (probably a parameter or return type). + Context for the accessibility check (e.g. containing type of method with as a parameter type. + + + + As in dev11, we ignore the fact that CLSCompliantAttribute is inherited (i.e. from the base type) + (see CSemanticChecker::CheckSymForCLS). This should only affect types where the syntactic parent + and the inheritance parent disagree. + + + + + Based on CompilationPass::CLSReduceSignature. + + + + + Traverses the symbol table processing XML documentation comments and optionally writing them to + a provided stream. + + + + + Traverses the symbol table processing XML documentation comments and optionally writing them to + a provided stream. + + Compilation that owns the symbol table. + Assembly name override, if specified. Otherwise the of the source assembly is used. + Stream to which XML will be written, if specified. + Will be supplemented with documentation comment diagnostics. + To stop traversing the symbol table early. + Only report diagnostics from this syntax tree, if non-null. + If and filterSpanWithinTree is non-null, report diagnostics within this span in the . + + + + Gets the XML that would be written to the documentation comment file for this assembly. + + The symbol for which to retrieve documentation comments. + True to treat includes as semantically meaningful (pull in contents from other files and bind crefs, etc). + To stop traversing the symbol table early. + + + + Write header, descend into members, and write footer. + + + + + Write own documentation comments and then descend into members. + + + + + Compile documentation comments on the symbol and write them to the stream if one is provided. + + + + + Loop over the DocumentationCommentTriviaSyntaxes. Gather + 1) concatenated XML, as a string; + 2) whether or not the XML is valid; + 3) set of type parameters covered by <typeparam> elements; + 4) set of parameters covered by <param> elements; + 5) list of <include> elements, as SyntaxNodes. + + True, if at least one documentation comment was processed; false, otherwise. + This was factored out for clarity, not because it's reusable. + + + + Similar to SymbolExtensions.GetParameters, but returns empty for unsupported symbols + and handles delegates. + + + + + Similar to SymbolExtensions.GetMemberTypeParameters, but returns empty for unsupported symbols. + + + + + A symbol requires a documentation comment if it was explicitly declared and + will be visible outside the current assembly (ignoring InternalsVisibleTo). + Exception: accessors do not require doc comments. + + + + + Get all of the DocumentationCommentTriviaSyntax associated with any declaring syntax of the + given symbol (except for partial methods, which only consider the part with the body). + + True if the nodes are all valid XML. + + + + Given the full text of a documentation comment, strip off the comment punctuation (///, /**, etc) + and add appropriate indentations. + + + + + Given a string, find the index of the first non-whitespace char. + + The string to search + The index of the first non-whitespace char in the string + + + + Find the first non-whitespace character in a given substring. + + The string to search + The start index + The last index (non-inclusive) + The index of the first non-whitespace char after index start in the string up to, but not including the end index + + + + Determine if the given string starts with the given prefix if whitespace + is first trimmed from the beginning. + + The string to search + The prefix + true if str.TrimStart().StartsWith(prefix) + + + + Given a string which may contain newline sequences, get the index of the first newline + sequence beginning at the given starting index. + + The string to split. + The starting index within the string. + The length of the newline sequence discovered. 0 if the end of the string was reached, otherwise either 1 or 2 chars + The index of the start of the first newline sequence following the start index + + + + Given the full text of a single-line style documentation comment, for each line, strip off + the comment punctuation (///) and add appropriate indentations. + + + + + Given the full text of a multi-line style documentation comment, broken into lines, strip off + the comment punctuation (/**, */, etc) and add appropriate indentations. + + + + + Remove "*/" and any following text, if it is present. + + + + + Return the longest prefix matching [whitespace]*[*][whitespace]*. + + + + + Return the longest common prefix of two strings + + + + + Bind a CrefSyntax and unwrap the result if it's an alias. + + + Does not respect DocumentationMode, so use a temporary bag if diagnostics are not desired. + + + + + Given a cref syntax that cannot be resolved, get the string that will be written to + the documentation file in place of a documentation comment ID. + + + + + Bind an XmlNameAttributeSyntax and update the sets of documented parameters and type parameters. + + + Does not respect DocumentationMode, so do not call unless diagnostics are desired. + + + + + WORKAROUND: + We're taking a dependency on the location and structure of a framework assembly resource. This is not a robust solution. + + Possible alternatives: + 1) Polish our XML parser until it matches MSXML. We don't want to reinvent the wheel. + 2) Build a map that lets us go from XML string positions back to source positions. + This is what the native compiler did, and it was a lot of work. We'd also still need to modify the message. + 3) Do not report a diagnostic. This is very unhelpful. + 4) Report a vague diagnostic (i.e. there's a problem somewhere in this doc comment). This is relatively unhelpful. + 5) Always report the message in English, so that we can pull it apart without needing to consume resource files. + This engenders a lot of ill will. + 6) Report the exception message without modification and (optionally) include the text with respect to which the + position is specified. This would not look sufficiently polished. + + + + + Walks a DocumentationCommentTriviaSyntax, binding the semantically meaningful parts + to produce diagnostics and to replace source crefs with documentation comment IDs. + + + + + Writes the matching 'param' tags on a primary constructor as 'summary' tags for a synthesized record property. + + + Still has all of the comment punctuation (///, /**, etc). associated with the 'param' tag. + + + + + Given a DocumentationCommentTriviaSyntax, return the full text, but with + documentation comment IDs substituted into crefs. + + + Still has all of the comment punctuation (///, /**, etc). + + + + + Rewrites nodes in , which is a snapshot of nodes from the original document. + We're mutating the tree as we rewrite, so it's important to grab a snapshot of the + nodes that we're going to reparent before we enumerate them. + + + + + This method boils down to Rewrite(XDocument.Load(fileAttrValue).XPathSelectElements(pathAttrValue)). + Everything else is error handling. + + + + + Respects the DocumentationMode at the source location. + + + + + Respects the DocumentationMode at the source location. + + + + + Contains methods related to synthesizing bound nodes in initial binding + form that needs lowering, primarily method bodies for compiler-generated methods. + + + + + Generates a submission initialization part of a Script type constructor that represents an interactive submission. + + + The constructor takes a parameter of type Microsoft.CodeAnalysis.Scripting.Session - the session reference. + It adds the object being constructed into the session by calling Microsoft.CSharp.RuntimeHelpers.SessionHelpers.SetSubmission, + and retrieves strongly typed references on all previous submission script classes whose members are referenced by this submission. + The references are stored to fields of the submission (). + + + + + Construct a body for an auto-property accessor (updating or returning the backing field). + + + + + Generate an accessor for a field-like event. + + + + + Generate a thread-safe accessor for a WinRT field-like event. + + Add: + return EventRegistrationTokenTable<Event>.GetOrCreateEventRegistrationTokenTable(ref _tokenTable).AddEventHandler(value); + + Remove: + EventRegistrationTokenTable<Event>.GetOrCreateEventRegistrationTokenTable(ref _tokenTable).RemoveEventHandler(value); + + + + + Generate a thread-safe accessor for a regular field-like event. + + DelegateType tmp0 = _event; //backing field + DelegateType tmp1; + DelegateType tmp2; + do { + tmp1 = tmp0; + tmp2 = (DelegateType)Delegate.Combine(tmp1, value); //Remove for -= + tmp0 = Interlocked.CompareExchange<DelegateType>(ref _event, tmp2, tmp1); + } while ((object)tmp0 != (object)tmp1); + + Note, if System.Threading.Interlocked.CompareExchange<T> is not available, + we emit the following code and mark the method Synchronized (unless it is a struct). + + _event = (DelegateType)Delegate.Combine(_event, value); //Remove for -= + + + + + + Look for a base type method named "Finalize" that is protected (or protected internal), has no parameters, + and returns void. It doesn't need to be virtual or a destructor. + + + You may assume that this would share code and logic with PEMethodSymbol.OverridesRuntimeFinalizer, + but FUNCBRECCS::bindDestructor has its own loop that performs these checks (differently). + + + + + In some circumstances (e.g. implicit implementation of an interface method by a non-virtual method in a + base type from another assembly) it is necessary for the compiler to generate explicit implementations for + some interface methods. They don't go in the symbol table, but if we are emitting, then we should + generate code for them. + + + + + entryPointOpt is only considered for synthesized methods (to recognize the synthesized MoveNext method for async Main) + + + + + When compiling in metadata-only mode, is not run. This is problematic because + adds synthesized explicit implementations to the list of synthesized definitions. + In lieu of running , this class performs a quick + traversal of the symbol table and performs processing of synthesized symbols if necessary + + + + + Traverse the symbol table and call Module.AddSynthesizedDefinition for each + synthesized explicit implementation stub that has been generated (e.g. when the real + implementation doesn't have the appropriate custom modifiers). + + + + + Represents the state of compilation of one particular type. + This includes, for example, a collection of synthesized methods created during lowering. + + + WARNING: Note that the collection class is not thread-safe and will + need to be revised if emit phase is changed to support multithreading when + translating a particular type. + + + + Synthesized method info + + + Flat array of created methods, non-empty if not-null + + + + Map of wrapper methods created for base access of base type virtual methods from + other classes (like those created for lambdas...); actually each method symbol will + only need one wrapper to call it non-virtually. + + + + + Type symbol being compiled, or null if we compile a synthesized type that doesn't have a symbol (e.g. PrivateImplementationDetails). + + + + + The builder for generating code, or null if not in emit phase. + + + + + Any generated methods that don't suppress debug info will use this + list of debug imports. + + + + + A graph of method->method references for this(...) constructor initializers. + Used to detect and report initializer cycles. + + + + + The type for which this compilation state is being used. + + + + + The type passed to the runtime binder as context. + + + + + Add a 'regular' synthesized method. + + + + + Add a 'wrapper' synthesized method and map it to the original one so it can be reused. + + + Wrapper methods are created for base access of base type virtual methods from + other classes (like those created for lambdas...). + + + + The index of the next wrapped method to be used + + + + Get a 'wrapper' method for the original one. + + + Wrapper methods are created for base access of base type virtual methods from + other classes (like those created for lambdas...). + + + + Free resources allocated for this method collection + + + + Report an error if adding the edge (method1, method2) to the ctor-initializer + graph would add a new cycle to that graph. + + a calling ctor + the chained-to ctor + where to report a cyclic error if needed + a diagnostic bag for receiving the diagnostic + + + + Represents various options that affect compilation, such as + whether to emit an executable or a library, whether to optimize + generated code, and so on. + + + + + Allow unsafe regions (i.e. unsafe modifiers on members and unsafe blocks). + + + + + Global namespace usings. + + + + + Flags applied to the top-level binder created for each syntax tree in the compilation + as well as for the binder of global imports. + + + + + Global Nullable context options. + + + + + Determines if the given raw kind value belongs to the C# enumeration. + + The raw value to test. + when the raw value belongs to the C# syntax kind; otherwise, . + + + + Returns for from property. + + + + + Returns for from property. + + + + + Returns for from property. + + + + + Returns for from property. + + + + + Insert one or more tokens in the list at the specified index. + + A new list with the tokens inserted. + + + + Creates a new token with the specified old trivia replaced with computed new trivia. + + + The trivia to be replaced; descendants of the root token. + A function that computes a replacement trivia for + the argument trivia. The first argument is the original trivia. The second argument is + the same trivia rewritten with replaced structure. + + + + Creates a new token with the specified old trivia replaced with a new trivia. The old trivia may appear in + the token's leading or trailing trivia. + + + The trivia to be replaced. + The new trivia to use in the new tree in place of the old + trivia. + + + + Returns this list as a . + + The type of the list elements in the separated list. + + + + + Gets the first directive of the tree rooted by this node. + + + + + Gets the last directive of the tree rooted by this node. + + + + + Gets the semantic information for an ordering clause in an orderby query clause. + + + + + Gets the semantic information associated with a select or group clause. + + + + + Returns what symbol(s), if any, the given expression syntax bound to in the program. + + An AliasSymbol will never be returned by this method. What the alias refers to will be + returned instead. To get information about aliases, call GetAliasInfo. + + If binding the type name C in the expression "new C(...)" the actual constructor bound to + will be returned (or all constructor if overload resolution failed). This occurs as long as C + unambiguously binds to a single type that has a constructor. If C ambiguously binds to multiple + types, or C binds to a static class, then type(s) are returned. + + + + + Returns what 'Add' method symbol(s), if any, corresponds to the given expression syntax + within . + + + + + Returns what symbol(s), if any, the given constructor initializer syntax bound to in the program. + + + + + Returns what symbol(s), if any, the given constructor initializer syntax bound to in the program. + + + + + Returns what symbol(s), if any, the given attribute syntax bound to in the program. + + + + + Gets the semantic information associated with a documentation comment cref. + + + + + Binds the expression in the context of the specified location and gets symbol information. + This method is used to get symbol information about an expression that did not actually + appear in the source code. + + + + + Binds the CrefSyntax expression in the context of the specified location and gets symbol information. + This method is used to get symbol information about an expression that did not actually + appear in the source code. + + + + + Bind the attribute in the context of the specified location and get semantic information + such as type, symbols and diagnostics. This method is used to get semantic information about an attribute + that did not actually appear in the source code. + + + + + Bind the constructor initializer in the context of the specified location and get semantic information + such as type, symbols and diagnostics. This method is used to get semantic information about a constructor + initializer that did not actually appear in the source code. + + NOTE: This will only work in locations where there is already a constructor initializer. + + + + + Bind the constructor initializer in the context of the specified location and get semantic information + about symbols. This method is used to get semantic information about a constructor + initializer that did not actually appear in the source code. + + NOTE: This will only work in locations where there is already a constructor initializer. + . + + + + + Gets type information about a constructor initializer. + + + + + Gets type information about an expression. + + + + + Gets type information about an attribute. + + + + + Binds the expression in the context of the specified location and gets type information. + This method is used to get type information about an expression that did not actually + appear in the source code. + + + + + Gets the underlying information from this . This + must have been created from CSharp code. + + The conversion expression to get original info from. + The underlying . + If the was not created from CSharp code. + + + + Gets the underlying information from this . This + conversion is applied before the operator is applied to the result of this conversion and . + + + This compound assignment must have been created from C# code. + + + + + Gets the underlying information from this . This + conversion is applied after the operator is applied, before the result is assigned to . + + + This compound assignment must have been created from C# code. + + + + + Returns the list of accessible, non-hidden indexers that could be invoked with the given expression as receiver. + + + + + Gets the semantic information associated with a query clause. + + + + + If resolves to an alias name, return the AliasSymbol corresponding + to A. Otherwise return null. + + + + + Binds the name in the context of the specified location and sees if it resolves to an + alias name. If it does, return the AliasSymbol corresponding to it. Otherwise, return null. + + + + + Analyze control-flow within a part of a method body. + + + + + Analyze control-flow within a part of a method body. + + + + + Analyze data-flow within a . + + + + + Analyze data-flow within a initializer. + + + + + Analyze data-flow within an . + + + + + Analyze data-flow within a part of a method body. + + + + + Analyze data-flow within a part of a method body. + + + + + Get a SemanticModel object that is associated with a method body that did not appear in this source code. + Given must lie within an existing method body of the Root syntax node for this SemanticModel. + Locals and labels declared within this existing method body are not considered to be in scope of the speculated method body. + + + + + Get a SemanticModel object that is associated with a method body that did not appear in this source code. + Given must lie within an existing method body of the Root syntax node for this SemanticModel. + Locals and labels declared within this existing method body are not considered to be in scope of the speculated method body. + + + + + Get a SemanticModel object that is associated with a type syntax node that did not appear in + this source code. This can be used to get detailed semantic information about sub-parts + of a type syntax that did not appear in source code. + + + + + Get a SemanticModel object that is associated with a cref syntax node that did not appear in + this source code. This can be used to get detailed semantic information about sub-parts + of a cref syntax that did not appear in source code. + + + + + Get a SemanticModel object that is associated with a statement that did not appear in + this source code. This can be used to get detailed semantic information about sub-parts + of a statement that did not appear in source code. + + + + + Get a SemanticModel object that is associated with an initializer that did not appear in + this source code. This can be used to get detailed semantic information about sub-parts + of a field initializer or default parameter value that did not appear in source code. + + + + + Get a SemanticModel object that is associated with an expression body that did not appear in + this source code. This can be used to get detailed semantic information about sub-parts + of an expression body that did not appear in source code. + + + + + Get a SemanticModel object that is associated with a constructor initializer that did not appear in + this source code. This can be used to get detailed semantic information about sub-parts + of a constructor initializer that did not appear in source code. + + NOTE: This will only work in locations where there is already a constructor initializer. + + + + + Get a SemanticModel object that is associated with a constructor initializer that did not appear in + this source code. This can be used to get detailed semantic information about sub-parts + of a constructor initializer that did not appear in source code. + + NOTE: This will only work in locations where there is already a constructor initializer. + + + + + Get a SemanticModel object that is associated with an attribute that did not appear in + this source code. This can be used to get detailed semantic information about sub-parts + of an attribute that did not appear in source code. + + + + + Determines what type of conversion, if any, would be used if a given expression was + converted to a given type. If isExplicitInSource is true, the conversion produced is + that which would be used if the conversion were done for a cast expression. + + + + + Determines what type of conversion, if any, would be used if a given expression was + converted to a given type. If isExplicitInSource is true, the conversion produced is + that which would be used if the conversion were done for a cast expression. + + + + + Given a member declaration syntax, get the corresponding symbol. + + + + + Given a compilation unit syntax, get the corresponding Simple Program entry point symbol. + + + + + Given a namespace declaration syntax node, get the corresponding namespace symbol for + the declaration assembly. + + + + + Given a namespace declaration syntax node, get the corresponding namespace symbol for + the declaration assembly. + + + + + Given a type declaration, get the corresponding type symbol. + + + + + Given a delegate declaration, get the corresponding type symbol. + + + + + Given a enum member declaration, get the corresponding field symbol. + + + + + Given a base method declaration syntax, get the corresponding method symbol. + + + + + Given a syntax node that declares a property, indexer or an event, get the corresponding declared symbol. + + + + + Given a syntax node that declares a property, get the corresponding declared symbol. + + + + + Given a syntax node that declares an indexer, get the corresponding declared symbol. + + + + + Given a syntax node that declares a (custom) event, get the corresponding event symbol. + + + + + Given a syntax node of anonymous object creation initializer, get the anonymous object property symbol. + + + + + Given a syntax node of anonymous object creation expression, get the anonymous object type symbol. + + + + + Given a syntax node of tuple expression, get the tuple type symbol. + + + + + Given a syntax node of a tuple argument, get the tuple element symbol. + + + + + Given a syntax node that declares a property or member accessor, get the corresponding symbol. + + + + + Given a variable declarator syntax, get the corresponding symbol. + + + + + Given a variable declarator syntax, get the corresponding symbol. + + + + + Given a tuple element syntax, get the corresponding symbol. + + + + + Given a labeled statement syntax, get the corresponding label symbol. + + + + + Given a switch label syntax, get the corresponding label symbol. + + + + + Given a using declaration get the corresponding symbol for the using alias that was introduced. + + + + + Given an extern alias declaration get the corresponding symbol for the alias that was introduced. + + + + + Given a parameter declaration syntax node, get the corresponding symbol. + + + + + Given a type parameter declaration (field or method), get the corresponding symbol + + + + + Given a foreach statement, get the symbol for the iteration variable + + + + + Given a catch declaration, get the symbol for the exception variable + + + + + Get the query range variable declared in a join into clause. + + + + + Get the query range variable declared in a query continuation clause. + + + + + Emit the IL for the compilation into the specified stream. + + Compilation. + Path of the file to which the PE image will be written. + Path of the file to which the compilation's debug info will be written. + Also embedded in the output file. Null to forego PDB generation. + + Path of the file to which the compilation's XML documentation will be written. Null to forego XML generation. + Path of the file from which the compilation's Win32 resources will be read (in RES format). + Null to indicate that there are none. + List of the compilation's managed resources. Null to indicate that there are none. + To cancel the emit process. + Compilation or path is null. + Path is empty or invalid. + An error occurred while reading or writing a file. + + + + This class stores several source parsing related options and offers access to their values. + + + + + The default parse options. + + + + + Gets the effective language version, which the compiler uses to select the + language rules to apply to the program. + + + + + Gets the specified language version, which is the value that was specified in + the call to the constructor, or modified using the method, + or provided on the command line. + + + + + Gets the names of defined preprocessor symbols. + + + + + Enable some experimental language features for testing. + + + + + A Declaration summarizes the declaration structure of a source file. Each entity declaration + in the program that is a container (specifically namespaces, classes, interfaces, structs, + and delegate declarations) is represented by a node in this tree. At the top level, the + compilation unit is treated as a declaration of the unnamed namespace. + + Special treatment is required for namespace declarations, because a single namespace + declaration can declare more than one namespace. For example, in the declaration + + namespace A.B.C {} + + we see that namespaces A and B and C are declared. This declaration is represented as three + declarations. All three of these ContainerDeclaration objects contain a reference to the + syntax tree for the declaration. + + A "single" declaration represents a specific namespace or type declaration at a point in + source code. A "root" declaration is a special single declaration which summarizes the + contents of an entire file's types and namespaces. Each source file is represented as a tree + of single declarations. + + A "merged" declaration merges together one or more declarations for the same symbol. For + example, the root namespace has multiple single declarations (one in each source file) but + there is a single merged declaration for them all. Similarly partial classes may have + multiple declarations, grouped together under the umbrella of a merged declaration. In the + common trivial case, a merged declaration for a single declaration contains only that single + declaration. The whole program, consisting of the set of all declarations in all of the + source files, is represented by a tree of merged declarations. + + + + + A declaration table is a device which keeps track of type and namespace declarations from + parse trees. It is optimized for the case where there is one set of declarations that stays + constant, and a specific root namespace declaration corresponding to the currently edited + file which is being added and removed repeatedly. It maintains a cache of information for + "merging" the root declarations into one big summary declaration; this cache is efficiently + re-used provided that the pattern of adds and removes is as we expect. + + + + + Any special attributes we may be referencing through a using alias in the file. + For example using X = System.Runtime.CompilerServices.TypeForwardedToAttribute. + + + + + Creates a root declaration that contains a Script class declaration (possibly in a namespace) and namespace declarations. + Top-level declarations in script code are nested in Script class. + + + + + Returns the original syntax nodes for this type declaration across all its parts. If + is provided, attributes will not be returned if it + is certain there are none that could match the request. This prevents going back to + source unnecessarily. + + + + + Any special attributes we may be referencing directly through a global using alias in the file. + global using X = System.Runtime.CompilerServices.TypeForwardedToAttribute. + + + + + Any diagnostics reported while converting the Namespace/Type syntax into the Declaration + instance. Generally, we determine and store some diagnostics here because we don't want + to have to go back to Syntax when we have our NamespaceSymbol or NamedTypeSymbol. + + + + + Any special attributes we may be referencing directly as an attribute on this type or + through a using alias in the file. For example + using X = System.Runtime.CompilerServices.TypeForwardedToAttribute or + [TypeForwardedToAttribute]. Can be used to avoid having to go back to source + to retrieve attributes when there is no chance they would bind to attribute of interest. + + + + + Simple program uses await expressions. Set only in conjunction with + + + + + Set only in conjunction with + + + + + Set only in conjunction with + + + + + A visitor that generates the part of the documentation comment after the initial type + and colon. + + + + + Matches symbols from an assembly in one compilation to + the corresponding assembly in another. Assumes that only + one assembly has changed between the two compilations. + + + + + Match local declarations to names to generate a map from + declaration to local slot. The names are indexed by slot and the + assumption is that declarations are in the same order as slots. + + + + + Members that are not listed directly on their containing type or namespace symbol as they were synthesized in a lowering phase, + after the symbol has been created. + + + + + A cache of members per type, populated when the first member for a given + type is needed. Within each type, members are indexed by name. The reason + for caching, and indexing by name, is to avoid searching sequentially + through all members of a given kind each time a member is matched. + + + + + Return a version of the baseline with all definitions mapped to this compilation. + Definitions from the initial generation, from metadata, are not mapped since + the initial generation is always included as metadata. That is, the symbols from + types, methods, ... in the TypesAdded, MethodsAdded, ... collections are replaced + by the corresponding symbols from the current compilation. + + + + + Represents a reference to a generic method instantiation, closed over type parameters, + e.g. MyNamespace.Class.Method{T}() + + + + + Represents a reference to a generic type instantiation that is not nested. + e.g. MyNamespace.A{int} + + + + + Represents a reference to a generic type instantiation that is nested in a non-generic type. + e.g. A.B{int} + + + + + Represents a reference to a generic type instantiation. + Subclasses represent nested and namespace types. + + + + + Additional types injected by the Expression Evaluator. + + + + This is a cache of a subset of . We don't include manifest resources in ref assemblies + + + + The behavior of the C# command-line compiler is as follows: + 1) If the /out switch is specified, then the explicit assembly name is used. + 2) Otherwise, + a) if the assembly is executable, then the assembly name is derived from + the name of the file containing the entrypoint; + b) otherwise, the assembly name is derived from the name of the first input + file. + + Since we don't know which method is the entrypoint until well after the + SourceAssemblySymbol is created, in case 2a, its name will not reflect the + name of the file containing the entrypoint. We leave it to our caller to + provide that name explicitly. + + + In cases 1 and 2b, we expect (metadataName == sourceAssembly.MetadataName). + + + + + The compiler-generated implementation type for each fixed-size buffer. + + + + + Returns a value indicating which embedded attributes should be generated during emit phase. + The value is set during binding the symbols that need those attributes, and is frozen on first trial to get it. + Freezing is needed to make sure that nothing tries to modify the value after the value is read. + + + + + Gets a list of documents from the method definitions in the types in or any + nested types of those types. + + + + + Ignore accessibility when resolving well-known type + members, in particular for generic type arguments + (e.g.: binding to internal types in the EE). + + + + + Override the dynamic operation context type for all dynamic calls in the module. + + + + + Builds an array of public type symbols defined in netmodules included in the compilation + and type forwarders defined in this compilation or any included netmodule (in this order). + + + + + Returns a set of top-level forwarded types + + + + + Set the underlying implementation type for a given fixed-size buffer field. + + + + + Given a type , which is either a nullable reference type OR + is a constructed type with a nullable reference type present in its type argument tree, + returns a synthesized NullableAttribute with encoded nullable transforms array. + + + + + Creates the ThrowIfNull and Throw helpers if needed. + + + The ThrowIfNull and Throw helpers are modeled off of the helpers on ArgumentNullException. + https://github.com/dotnet/runtime/blob/22663769611ba89cd92d14cfcb76e287f8af2335/src/libraries/System.Private.CoreLib/src/System/ArgumentNullException.cs#L56-L69 + + + + + Creates the ThrowSwitchExpressionException helper if needed. + + + + + Creates the ThrowSwitchExpressionExceptionParameterless helper if needed. + + + + + Creates the ThrowInvalidOperationException helper if needed. + + + + + Represents a reference to a field of a generic type instantiation. + e.g. + A{int}.Field + A{int}.B{string}.C.Field + + + + + Represents a generic method of a generic type instantiation, closed over type parameters. + e.g. + A{T}.M{S}() + A.B{T}.C.M{S}() + + + + + Represents a reference to an instantiation of a generic type nested in an instantiation of another generic type. + e.g. + A{int}.B{string} + A.B{int}.C.D{string} + + + + + Represents a method of a generic type instantiation. + e.g. + A{int}.M() + A.B{int}.C.M() + + + + + Represents a reference to a type nested in an instantiation of a generic type. + e.g. + A{int}.B + A.B{int}.C.D + + + + + Used only for testing. + + + + + Returns true if the type can be embedded. If the type is defined in a linked (/l-ed) + assembly, but doesn't meet embeddable type requirements, this function returns false + and reports appropriate diagnostics. + + + + + Returns the common value if all bytes are the same value. + Otherwise returns null. + + + + + A diagnostic, along with the location where it occurred. + + + + + Add a diagnostic to the bag. + + + + + + + + + Add a diagnostic to the bag. + + + + + + + + + + Adds diagnostics from useSiteDiagnostics into diagnostics and returns True if there were any errors. + + + + + Adds diagnostics from useSiteDiagnostics into diagnostics and returns True if there were any errors. + + + + Don't call this during a parse--it loads resources + + + Don't call this during a parse--it loads resources + + + Don't call this during a parse--it loads resources + + + + Returns true if this is a build-only diagnostic that is never reported from + API. + Diagnostics generated during compilation phases such as lowering, emit, etc. + are example of build-only diagnostics. + + + + + When converting an anonymous function to a delegate type, there are some diagnostics + that will occur regardless of the delegate type - particularly those that do not + depend on the substituted types (e.g. name uniqueness). Even though we need to + produce a diagnostic in such cases, we do not need to abandon overload resolution - + we can choose the overload that is best without regard to such diagnostics. + + True if seeing the ErrorCode should prevent a delegate conversion + from completing successfully. + + + + WARNING: will resolve lazy diagnostics - do not call this before the member lists are completed + or you could trigger infinite recursion. + + + + + A lazily calculated diagnostic for use of nullable annotations outside of a '#nullable' annotations context. + + + + + A `?` annotation on a type that isn't a value type causes: + - an error before C# 8.0 + - a warning outside of a NonNullTypes context + + + + + An abstract flow pass that takes some shortcuts in analyzing finally blocks, in order to enable + the analysis to take place without tracking exceptions or repeating the analysis of a finally block + for each exit from a try statement. The shortcut results in a slightly less precise + (but still conservative) analysis, but that less precise analysis is all that is required for + the language specification. The most significant shortcut is that we do not track the state + where exceptions can arise. That does not affect the soundness for most analyses, but for those + analyses whose soundness would be affected (e.g. "data flows out"), we track "unassignments" to keep + the analysis sound. + + + Formally, this is a fairly conventional lattice flow analysis () that moves upward through the operation. + + + + + The compilation in which the analysis is taking place. This is needed to determine which + conditional methods will be compiled and which will be omitted. + + + + + The method whose body is being analyzed, or the field whose initializer is being analyzed. + May be a top-level member or a lambda or local function. It is used for + references to method parameters. Thus, '_symbol' should not be used directly, but + 'MethodParameters', 'MethodThisParameter' and 'AnalyzeOutParameters(...)' should be used + instead. _symbol is null during speculative binding. + + + + + Reflects the enclosing member, lambda or local function at the current location (in the bound tree). + + + + + The bound node of the method or initializer being analyzed. + + + + + The flow analysis state at each label, computed by calling on the state from branches to that label with the state + when we fall into the label. Entries are created when the label is encountered. One + case deserves special attention: when the destination of the branch is a label earlier + in the code, it is possible (though rarely occurs in practice) that we are changing the + state at a label that we've already analyzed. In that case we run another pass of the + analysis to allow those changes to propagate. This repeats until no further changes to + the state of these labels occurs. This can result in quadratic performance in unlikely + but possible code such as this: "int x; if (cond) goto l1; x = 3; l5: print x; l4: goto + l5; l3: goto l4; l2: goto l3; l1: goto l2;" + + + + + Set to true after an analysis scan if the analysis was incomplete due to state changing + after it was used by another analysis component. In this case the caller scans again (until + this is false). Since the analysis proceeds by monotonically changing the state computed + at each label, this must terminate. + + + + + All of the labels seen so far in this forward scan of the body + + + + + Pending escapes generated in the current scope (or more deeply nested scopes). When jump + statements (goto, break, continue, return) are processed, they are placed in the + pendingBranches buffer to be processed later by the code handling the destination + statement. As a special case, the processing of try-finally statements might modify the + contents of the pendingBranches buffer to take into account the behavior of + "intervening" finally clauses. + + + + + The definite assignment and/or reachability state at the point currently being analyzed. + + + + + Indicates that the transfer function for a particular node (the function mapping the + state before the node to the state after the node) is not monotonic, in the sense that + it can change the state in either direction in the lattice. If the transfer function is + monotonic, the transfer function can only change the state toward the . Reachability and definite assignment are monotonic, and + permit a more efficient analysis. Region analysis and nullable analysis are not + monotonic. This is just an optimization; we could treat all of them as nonmonotonic + without much loss of performance. In fact, this only affects the analysis of (relatively + rare) try statements, and is only a slight optimization. + + + + + Where all diagnostics are deposited. + + + + + A cache of the state at the backward branch point of each loop. This is not needed + during normal flow analysis, but is needed for DataFlowsOut region analysis. + + + + + Subclasses may override EnterRegion to perform any actions at the entry to the region. + + + + + Subclasses may override LeaveRegion to perform any action at the end of the region. + + + + + A pending branch. These are created for a return, break, continue, goto statement, + yield return, yield break, await expression, and await foreach/using. The idea is that + we don't know if the branch will eventually reach its destination because of an + intervening finally block that cannot complete normally. So we store them up and handle + them as we complete processing each construct. At the end of a block, if there are any + pending branches to a label in that block we process the branch. Otherwise we relay it + up to the enclosing construct as a pending branch of the enclosing construct. + + + + + Perform a single pass of flow analysis. Note that after this pass, + this.backwardBranchChanged indicates if a further pass is required. + + + + + If a method is currently being analyzed returns its parameters, returns an empty array + otherwise. + + + + + If a method is currently being analyzed returns its 'this' parameter, returns null + otherwise. + + + + + Specifies whether or not method's out parameters should be analyzed. + + location to be used + true if the out parameters of the method should be analyzed + + + + Return the flow analysis state associated with a label. + + + + + + + Return to the caller the set of pending return statements. + + + + + + Set the current state to one that indicates that it is unreachable. + + + + + Visit a boolean condition expression. + + + + + + Visit a general expression, where we will only need to determine if variables are + assigned (or not). That is, we will not be needing AssignedWhenTrue and + AssignedWhenFalse. + + True when visiting an rvalue that will actually be used as an lvalue, + for example a ref parameter when simulating a read of it, or an argument corresponding to an in parameter + + + + Visit a statement. + + + + + Called at the point in a loop where the backwards branch would go to. + + + + + Called at the point in a loop where the backward branch is placed. + + + + + Used to resolve break statements in each statement form that has a break statement + (loops, switch). + + + + + Used to resolve continue statements in each statement form that supports it. + + + + + Subclasses override this if they want to take special actions on processing a goto + statement, when both the jump and the label have been located. + + + + + To handle a label, we resolve all branches to that label. Returns true if the state of + the label changes as a result. + + Target label + Statement containing the target label + + + + Since branches cannot branch into constructs, only out, we save the pending branches + when visiting more nested constructs. When tracking exceptions, we store the current + state as the exception state for the following code. + + + + + We use this when closing a block that may contain labels or branches + - branches to new labels are resolved + - new labels are removed (no longer can be reached) + - unresolved pending branches are carried forward + + The old pending branches, which are to be merged with the current ones + + + + Since each language construct must be handled according to the rules of the language specification, + the default visitor reports that the construct for the node is not implemented in the compiler. + + + + + Certain (struct) types are known by the compiler to be immutable. In these cases calling a method on + the type is known (by flow analysis) not to write the receiver. + + + + + + + Do not call for a local function. + + + + + Writes ref and out parameters + + + + + Join state from other try block, potentially in a nested method. + + + + + Visits a node only if it is a conditional access. + Returns 'true' if and only if the node was visited. + + + + + "State when not null" can only propagate out of a conditional access if + it is not subject to a user-defined conversion whose parameter is not of a non-nullable value type. + + + + + Unconditionally visits an expression. + If the expression has "state when not null" after visiting, + the method returns 'true' and writes the state to . + + + + + This visitor represents just the assignment part of the null coalescing assignment + operator. + + + + + This visitor represents just the non-assignment part of the null coalescing assignment + operator (when the left operand is non-null). + + + + + This is the "top" state of the data flow lattice. Generally, it is considered the state + which is reachable, but no information is yet available. This is the state used at the + start of method bodies. + + + + + This is the absolute "bottom" state of the data flow lattice. C# does not specify a + difference between unreachable states, so there can only be one. This is the state used + for unreachable code, like statements after a "return" or "throw" statement. + + + + + This should be a reachable state that won't affect another reachable state in a + . + + Nontrivial implementation is required for DataFlowsOutWalker or any flow analysis pass + that "tracks unassignments" like the nullable walker. The result should be a state, for + each variable, that is the strongest result possible (i.e. definitely assigned for the + data flow passes, or not null for the nullable analysis). + operation. + + + + + The "Join" operation is used when two separate control flow paths converge at a single + statement. This operation is used to combine the if/else paths of a conditional, or two + "goto" statements to the same label, for example. + + According to convention, Join moves "up" the lattice, so the following equations must hold: + 1. Join(Unreachable(), X) = X + 2. Join(Top, X) = Top + + + + True if was changed. False otherwise. + + + + + The Meet operation is the inverse of . + It's used when combining state additively, like when the state from a return statement + inside a 'try' clause is combined with the end state of a 'finally' clause. + + This moves "down" our flow lattice, by convention. The following equations must hold: + 1. Meet(Unreachable, X) = Unreachable + 2. Meet(ReachableBottom, X - Unreachable) = ReachableBottom + 3. Meet(Top, X) = X + + + + + + Produce a duplicate of this flow analysis state. + + + + + Is the code reachable? + + + + + Returns the unordered collection of branches. + + + + + Returns the unordered collection of branches. + + + + + This is the state from the local function which makes the + current state less specific. For example, in nullable analysis + this would be captured variables that may be nullable after + calling the local function. When a local function is called, + this state is + with the current state. + + + + + This is the part of the local function transfer function which + transfers knowledge additively. For example, in definite + assignment this would be captured state which is assigned by + the local function. When a local function is called, this + state is + with the current state. + + + + + Executed at the start of visiting a local function body. The + parameter holds the current state information for the local function being visited. To + save state information across the analysis, return an instance of . + + + + + Executed after visiting a local function body. The is the + return value from . The + is state information for the local function that was just visited. is + the state after visiting the method. + + + + + Is the switch statement one that could be interpreted as a C# 6 or earlier switch statement? + + + + + The possible places that we are processing when there is a region. + + + This should be nested inside but is not due to https://github.com/dotnet/roslyn/issues/36992 . + + + + + To scan the whole body, we start outside (before) the region. + + + + + A region analysis walker that computes the set of variables that are always assigned a value + in the region. A variable is "always assigned" in a region if an analysis of the region that + starts with the variable unassigned ends with the variable assigned. + + + + + This class implements the region control flow analysis operations. Region control flow + analysis provides information about statements which enter and leave a region. The analysis + is done lazily. When created, it performs no analysis, but simply caches the arguments. + Then, the first time one of the analysis results is used it computes that one result and + caches it. Each result is computed using a custom algorithm. + + + + + A collection of statements outside the region that jump into the region. + + + + + A collection of statements inside the region that jump to locations outside the region. + + + + + Returns true if and only if the endpoint of the last statement in the region is reachable or the region contains no + statements. + + + + + A collection of return (or yield break) statements found within the region that return from the enclosing method or lambda. + + + + + Returns true if and only if analysis was successful. Analysis can fail if the region does not properly span a single expression, + a single statement, or a contiguous series of statements within the enclosing block. + + + + + Produce a duplicate of this flow analysis state. + + + + + + Perform control flow analysis, reporting all necessary diagnostics. Returns true if the end of + the body might be reachable... + + + + + Analyze the body, reporting all necessary diagnostics. Returns true if the end of the + body might be reachable. + + + + + + This class implements the region data flow analysis operations. Region data flow analysis + provides information how data flows into and out of a region. The analysis is done lazily. + When created, it performs no analysis, but simply caches the arguments. Then, the first time + one of the analysis results is used it computes that one result and caches it. Each result + is computed using a custom algorithm. + + + + + A collection of the local variables that are declared within the region. Note that the region must be + bounded by a method's body or a field's initializer, so method parameter symbols are never included + in the result, but lambda parameters might appear in the result. + + + + + A collection of the local variables for which a value assigned outside the region may be used inside the region. + + + + + The set of local variables which are definitely assigned a value when a region is + entered. + + + + + The set of local variables which are definitely assigned a value when a region is + exited. + + + + + A collection of the local variables for which a value assigned inside the region may be used outside the region. + Note that every reachable assignment to a ref or out variable will be included in the results. + + + + + A collection of the local variables for which a value is always assigned inside the region. + + + + + A collection of the local variables that are read inside the region. + + + + + A collection of local variables that are written inside the region. + + + + + A collection of the local variables that are read outside the region. + + + + + A collection of local variables that are written outside the region. + + + + + A collection of the non-constant local variables and parameters that have been referenced in anonymous functions + and therefore must be moved to a field of a frame class. + + + + + A collection of the non-constant local variables and parameters that have had their address (or the address of one + of their fields) taken using the '&' operator. + + + If there are any of these in the region, then a method should not be extracted. + + + + + Returns true if and only if analysis was successful. Analysis can fail if the region does not properly span a single expression, + a single statement, or a contiguous series of statements within the enclosing block. + + + + + A region analysis walker that computes the set of variables whose values flow into (are used + in) the region. A variable assigned outside is used inside if an analysis that leaves the + variable unassigned on entry to the region would cause the generation of "unassigned" errors + within the region. + + + + + A region analysis walker that computes the set of variables for + which their assigned values flow out of the region. + A variable assigned inside is used outside if an analysis that + treats assignments in the region as unassigning the variable would + cause "unassigned" errors outside the region. + + + + + Implement C# definite assignment. + + + + + A mapping from local variables to the index of their slot in a flow analysis local state. + + + + + A mapping from the local variable slot to the symbol for the local variable itself. This + is used in the implementation of region analysis (support for extract method) to compute + the set of variables "always assigned" in a region of code. + + The first slot, slot 0, is reserved for indicating reachability, so the first tracked variable will + be given slot 1. When referring to VariableIdentifier.ContainingSlot, slot 0 indicates + that the variable in VariableIdentifier.Symbol is a root, i.e. not nested within another + tracked variable. Slots less than 0 are illegal. + + + + + Some variables that should be considered initially assigned. Used for region analysis. + + + + + Variables that were used anywhere, in the sense required to suppress warnings about + unused variables. + + + + + Parameters of record primary constructors that were read anywhere. + + + + + Variables that were used anywhere, in the sense required to suppress warnings about + unused variables. + + + + + Variables that were initialized or written anywhere. + + + + + Struct fields that are implicitly initialized, due to being used before being written, or not being written at an exit point. + + + + + Map from variables that had their addresses taken, to the location of the first corresponding + address-of expression. + + + Doesn't include fixed statement address-of operands. + + + + + Variables that were captured by anonymous functions. + + + + + The current source assembly. + + + + + A set of address-of expressions for which the operand is not definitely assigned. + + + + + Tracks variables for which we have already reported a definite assignment error. This + allows us to report at most one such error per variable. + + + + + true if we should check to ensure that out parameters are assigned on every exit point. + + + + + Track fields of classes in addition to structs. + + + + + Track static fields, properties, events, in addition to instance members. + + + + + The topmost method of this analysis. + + + + + Check that every rvalue has been converted in the definite assignment pass only (not later passes deriving from it). + + + + + Constructor to be used for region analysis, for which a struct type should never be considered empty. + + + + + Perform data flow analysis, reporting all necessary diagnostics. + + + + + Analyze the body, reporting all necessary diagnostics. + + + + + Check if the variable is captured and, if so, add it to this._capturedVariables. + + The variable to be checked + If variable.Kind is RangeVariable, its underlying lambda parameter. Else null. + + + + Add the variable to the captured set. For range variables we only add it if inside the region. + + + + + + This reflects the Dev10 compiler's rules for when a variable initialization is considered a "use" + for the purpose of suppressing the warning about unused variables. + + + + + Check that the given variable is definitely assigned. If not, produce an error. + + + + + Report a given variable as not definitely assigned. Once a variable has been so + reported, we suppress further reports of that variable. + + + + + Mark a variable as assigned (or unassigned). + + Node being assigned to. + The value being assigned. + True if target location is considered written to. + Ref assignment or value assignment. + True if target location is considered read from. + + + + Does the struct variable at the given slot have all of its instance fields assigned? + + + + + Variables declared in a using statement are always considered used, so this is just an assert. + + + + + Produce a duplicate of this flow analysis state. + + + + + + Check that the given variable is definitely assigned when replaying local function + reads. If not, produce an error. + + + Specifying the slot manually may be necessary if the symbol is a field, + in which case + will not know which containing slot to look for. + + + + + State changes are handled by the base class. We override to find captured variables that + have been read before they were assigned and determine if the set has changed. + + + + + Does a data flow analysis for state attached to local variables and fields of struct locals. + + + + + Indicates whether this variable is nested inside another tracked variable. + For instance, if a field `x` of a struct is a tracked variable, the symbol is not sufficient + to uniquely determine which field is being tracked. The containing slot(s) would + identify which tracked variable the field `x` is part of. + + + + + True if new variables introduced in should be set + to the bottom state. False if they should be set to the top state. + + + + + A cache for remember which structs are empty. + + + + + Locals are given slots when their declarations are encountered. We only need give slots + to local variables, out parameters, and the "this" variable of a struct constructs. + Other variables are not given slots, and are therefore not tracked by the analysis. This + returns -1 for a variable that is not tracked, for fields of structs that have the same + assigned status as the container, and for structs that (recursively) contain no data members. + We do not need to track references to + variables that occur before the variable is declared, as those are reported in an + earlier phase as "use before declaration". That allows us to avoid giving slots to local + variables before processing their declarations. + + + + + Force a variable to have a slot. Returns -1 if the variable has an empty struct type. + + + + + Sets the starting state for any newly declared variables in the LocalDataFlowPass. + + + + + Descends through Rest fields of a tuple if "symbol" is an extended field + As a result the "symbol" will be adjusted to be the field of the innermost tuple + and a corresponding containingSlot is returned. + Return value -1 indicates a failure which could happen for the following reasons + a) Rest field does not exist, which could happen in rare error scenarios involving broken ValueTuple types + b) Rest is not tracked already and forceSlotsToExist is false (otherwise we create slots on demand) + + + + + Return the slot for a variable, or -1 if it is not tracked (because, for example, it is an empty struct). + + + + + + + A region analysis walker that computes the set of variables that are definitely assigned + when a region is entered or exited. + + + + + A small cache for remembering empty struct types for flow analysis. + + + + + When set, we ignore private reference fields of structs loaded from metadata. + + + + + Create a cache for computing whether or not a struct type is "empty". + + Enable compatibility with the native compiler, which + ignores inaccessible fields of reference type for structs loaded from metadata. + if is true, set to the compilation from + which to check accessibility. + + + + Specialized EmptyStructTypeCache that reports all structs as not empty + + + + + Determine if the given type is an empty struct type. + + + + + Determine if the given type is an empty struct type,. "typesWithMembersOfThisType" contains + a list of types that have members (directly or indirectly) of this type. + to remove circularity. + + + + + Get all instance fields of a struct. They are not necessarily returned in order. + + + + + Get all instance fields of a struct. They are not necessarily returned in order. + + + + + + When deciding what struct fields to drop on the floor, the native compiler looks + through arrays, and does not ignore value types or type parameters. + + + + + Is it possible that the given symbol can be accessed somewhere in the given assembly? + For the purposes of this test, we assume that code in the given assembly might derive from + any type. So protected members are considered potentially accessible. + + + + + A region analysis walker that records jumps into the region. Works by overriding NoteBranch, which is + invoked by a superclass when the two endpoints of a jump have been identified. + + + + + A region analysis walker that records jumps out of the region. + + + + + The flow analysis pass. This pass reports required diagnostics for unreachable + statements and uninitialized variables (through the call to FlowAnalysisWalker.Analyze), + and inserts a final return statement if the end of a void-returning method is reachable. + + the method to be analyzed + the method's body + The state of compilation of the enclosing type + the receiver of the reported diagnostics + indicates whether this Script had a trailing expression + the original method body is the last statement in the block + the rewritten block for the method (with a return statement possibly inserted) + + + + Nullability flow analysis. + + + + + Nullable analysis data for methods, parameter default values, and attributes + stored on the Compilation during testing only. + The key is a symbol for methods or parameters, and syntax for attributes. + + + + + Used to copy variable slots and types from the NullableWalker for the containing method + or lambda to the NullableWalker created for a nested lambda or local function. + + + + + Data recorded for a particular analysis run. + + + + + Number of entries tracked during analysis. + + + + + True if analysis was required; false if analysis was optional and results dropped. + + + + + Represents the result of visiting an expression. + Contains a result type which tells us whether the expression may be null, + and an l-value type which tells us whether we can assign null to the expression. + + + + + Represents the result of visiting an argument expression. + In addition to storing the , also stores the + for reanalyzing a lambda. + + + + + Binder for symbol being analyzed. + + + + + Conversions with nullability and unknown matching any. + + + + + 'true' if non-nullable member warnings should be issued at return points. + One situation where this is 'false' is when we are analyzing field initializers and there is a constructor symbol in the type. + + + + + If true, the parameter types and nullability from _delegateInvokeMethod is used for + initial parameter state. If false, the signature of CurrentSymbol is used instead. + + + + + If true, the return type and nullability from _delegateInvokeMethod is used. + If false, the signature of CurrentSymbol is used instead. + + + + + Method signature used for return or parameter types. Distinct from CurrentSymbol signature + when CurrentSymbol is a lambda and type is inferred from MethodTypeInferrer. + + + + + Return statements and the result types from analyzing the returned expressions. Used when inferring lambda return type in MethodTypeInferrer. + + + + + Invalid type, used only to catch Visit methods that do not set + _result.Type. See VisitExpressionWithoutStackGuard. + + + + + Contains the map of expressions to inferred nullabilities and types used by the optional rewriter phase of the + compiler. + + + + + Manages creating snapshots of the walker as appropriate. Null if we're not taking snapshots of + this walker. + + + + + State of method group receivers, used later when analyzing the conversion to a delegate. + (Could be replaced by _analyzedNullabilityMapOpt if that map is always available.) + + + + + Variables instances for each lambda or local function defined within the analyzed region. + + + + + Map from a target-typed expression (such as a target-typed conditional, switch or new) to the delegate + that completes analysis once the target type is known. + The delegate is invoked by . + + + + + True if we're analyzing speculative code. This turns off some initialization steps + that would otherwise be taken. + + + + + True if this walker was created using an initial state. + + + + + The result and l-value type of the last visited expression. + + + + + The visit result of the receiver for the current conditional access. + + For example: A conditional invocation uses a placeholder as a receiver. By storing the + visit result from the actual receiver ahead of time, we can give this placeholder a correct result. + + + + + The result type represents the state of the last visited expression. + + + + + Force the inference of the LValueResultType from ResultType. + + + + + Force the inference of the ResultType from LValueResultType. + + + + + Sets the analyzed nullability of the expression to be the given result. + + + + + Placeholder locals, e.g. for objects being constructed. + + + + + For methods with annotations, we'll need to visit the arguments twice. + Once for diagnostics and once for result state (but disabling diagnostics). + + + + + Whether we are going to read the currently visited expression. + + + + + Used to allow to substitute the correct slot for a when + it's encountered. + + + + + We have multiple ways of entering the nullable walker: we could be just analyzing the initializers, with a BoundStatementList body and _baseOrThisInitializer + having been provided, or we could be analyzing the body of a constructor, with a BoundConstructorBody body and _baseOrThisInitializer being null. + + + + + Analyzes a method body if settings indicate we should. + + + + + Gets the "after initializers state" which should be used at the beginning of nullable analysis + of certain constructors. + + + + + Analyzes a set of bound nodes, recording updated nullability information. This method is only + used when nullable is explicitly enabled for all methods but disabled otherwise to verify that + correct semantic information is being recorded for all bound nodes. The results are thrown away. + + + + + Analyzes a set of bound nodes, recording updated nullability information, and returns an + updated BoundNode with the information populated. + + + + + Returns true if the nullable analysis is needed for the region represented by . + The syntax node is used to determine the overall nullable context for the region. + + + + Analyzes a node in a "one-off" context, such as for attributes or parameter default values. + is the syntax span used to determine the overall nullable context. + + + + The contents of this method, particularly , are problematic when + inlined. The methods themselves are small but they end up allocating significantly larger + frames due to the use of biggish value types within them. The method + is used on a hot path for fluent calls and this size change is enough that it causes us + to exceed our thresholds in EndToEndTests.OverflowOnFluentCall. + + + + + Should we warn for assigning this state into this type? + + This should often be checked together with + It catches putting a `null` into a `[DisallowNull]int?` for example, which cannot simply be represented as a non-nullable target type. + + + + + Reports top-level nullability problem in assignment. + Any conversion of the value should have been applied. + + + + + Update tracked value on assignment. + + + + + Whenever assigning a variable, and that variable is not declared at the point the state is being set, + and the new state is not , this method should be called to perform the + state setting and to ensure the mutation is visible outside the finally block when the mutation occurs in a + finally block. + + + + + If , is known only within returned delegate. + + A delegate to complete the initializer analysis. + + + + If , is known only within returned delegate. + + A delegate to complete the element initializer analysis. + + + + Returns true if the type is a struct with no fields or properties. + + + + + Applies analysis similar to . + The expressions returned from a lambda are not converted though, so we'll have to classify fresh conversions. + Note: even if some conversions fail, we'll proceed to infer top-level nullability. That is reasonable in common cases. + + + + + If we learn that the operand is non-null, we can infer that certain + sub-expressions were also non-null. + Get all nested conditional slots for those sub-expressions. For example in a?.b?.c we'll set a, b, and c. + Only returns slots for tracked expressions. + + https://github.com/dotnet/roslyn/issues/53397 This method should potentially be removed. + + + + Visits a node only if it is a conditional access. + Returns 'true' if and only if the node was visited. + + + + + Unconditionally visits an expression and returns the "state when not null" for the expression. + + + + + Placeholders are bound expressions with type and state. + But for typeless expressions (such as `null` or `(null, null)` we hold onto the original bound expression, + as it will be useful for conversions from expression. + + + + + Fix a TypeWithAnnotations based on Allow/DisallowNull annotations prior to a conversion or assignment. + Note this does not work for nullable value types, so an additional check with may be required. + + + + + Update the null-state based on MaybeNull/NotNull + + + + + If you pass in a method symbol, its type arguments will be re-inferred and the re-inferred method will be returned. + + + + + Verifies that an argument's nullability is compatible with its parameter's on the way in. + + + + Returns if this is an assignment forbidden by DisallowNullAttribute, otherwise . + + + + Verifies that outbound assignments (from parameter to argument) are safe and + tracks those assignments (or learns from post-condition attributes) + + + + + Learn from postconditions on a by-value or 'in' argument. + + + + + Return top-level nullability for the expression. This method should be called on a limited + set of expressions only. It should not be called on expressions tracked by flow analysis + other than which is an expression + specifically created in NullableWalker to represent the flow analysis state. + + + + + Returns the expression without the top-most conversion plus the conversion. + If the expression is not a conversion, returns the original expression plus + the Identity conversion. If `includeExplicitConversions` is true, implicit and + explicit conversions are considered. If `includeExplicitConversions` is false + only implicit conversions are considered and if the expression is an explicit + conversion, the expression is returned as is, with the Identity conversion. + (Currently, the only visit method that passes `includeExplicitConversions: true` + is VisitConversion. All other callers are handling implicit conversions only.) + + + + + Returns true if the expression should be used as the source when calculating + a conversion from this expression, rather than using the type (with nullability) + calculated by visiting this expression. Typically, that means expressions that + do not have an explicit type but there are several other cases as well. + (See expressions handled in ClassifyImplicitBuiltInConversionFromExpression.) + + + + + Adjust declared type based on inferred nullability at the point of reference. + + + + + Gets the corresponding member for a symbol from initial binding to match an updated receiver type in NullableWalker. + For instance, this will map from List<string~>.Add(string~) to List<string?>.Add(string?) in the following example: + + string s = null; + var list = new[] { s }.ToList(); + list.Add(null); + + + + + + Visit an expression. If an explicit target type is provided, the expression is converted + to that type. This method should be called whenever an expression may contain + an implicit conversion, even if that conversion was omitted from the bound tree, + so the conversion can be re-classified with nullability. + + + + + Set the nullability of tuple elements for tuples at the point of construction. + If is true, the tuple was constructed with an explicit + 'new ValueTuple' call, in which case the 8-th element, if any, represents the 'Rest' field. + + + + + Gets the conversion node for passing to VisitConversion, if one should be passed. + + + + + Apply the conversion to the type of the operand and return the resulting type. + If the operand does not have an explicit type, the operand expression is used. + + + If , the incoming conversion is assumed to be from binding + and will be re-calculated, this time considering nullability. + Note that the conversion calculation considers nested nullability only. + The caller is responsible for checking the top-level nullability of + the type returned by this method. + + + If , the nullability of any members of the operand + will be copied to the converted result when possible. + + + If , indicates that the "non-safety" diagnostic + should be given for an invalid conversion. + + + + + Return the return type for a lifted operator, given the nullability state of its operands. + + + + + When the allowed output of a property/indexer is not-null but the allowed input is maybe-null, we store a not-null value instead. + This way, assignment of a legal input value results in a legal output value. + This adjustment doesn't apply to oblivious properties/indexers. + + + + + Return the sub-expressions for the righthand side of a deconstruction + assignment. cf. LocalRewriter.GetRightParts. + + + + + Report warning passing argument where nested nullability does not match + parameter (e.g.: calling `void F(object[] o)` with `F(new[] { maybeNull })`). + + + + + A bit array containing the nullability of variables associated with a method scope. If the method is a + nested function (a lambda or a local function), there is a reference to the corresponding instance for + the containing method scope. The instances in the chain are associated with a corresponding + chain, and the field in this type matches . + + + + + Produce a duplicate of this flow analysis state. + + + + + + Defines the starting state used in the local function body to + produce diagnostics and determine types. + + + + + A symbol to be used as a placeholder for an instance being constructed by + , or the input expression of a pattern-matching operation. + It is used to track the state of an expression, such as members being initialized. + + + + + The int key corresponds to . + + + + + The snapshot array should be sorted in ascending order by the position tuple element in order for the binary search algorithm to + function correctly. + + + + + Contains the map of expression and original symbol to reinferred symbols, used by the optional + rewriter phase of the compiler. + + + Lambda symbols are mapped to the NameTypeSymbol of the delegate type they were reinferred to, + and are stored with a null node. The LambdaSymbol itself is position-independent, and does not + need any more information to serve as a key. + All other symbol types are stored mapped to exactly the same type as was provided. + + + + + Shared walker states are the parts of the walker state that are not unique at a single position, + but are instead used by all snapshots. Each shared state corresponds to one invocation of Analyze, + so entering a lambda or local function will create a new state here. The indexes in this array + correspond to . + + + + + Snapshots are kept in a dictionary of position -> snapshot at that position. These are stored in descending order. + + + + + Every walker is walking a specific symbol, and can potentially walk each symbol multiple times + to get to a stable state. Each of these symbols gets a single shared state slot, which this + dictionary keeps track of. These slots correspond to indexes into . + + + + + Contains the shared state used to restore the walker at a specific point + + + + + Contains a snapshot of the state of the NullableWalker at any given point of execution, used for restoring the walker to + a specific point for speculatively analyzing a piece of code that does not appear in the original tree. + + + + + An immutable copy of . + + + + + Unique identifier in the chain of nested VariablesSnapshot instances. The value starts at 0 + for the outermost method and increases at each nested function. + + + + + VariablesSnapshot instance for containing method, or null if this is the outermost method. + + + + + Symbol that contains this set of variables. This is typically a method but may be a field + when analyzing a field initializer. The symbol may be null at the outermost scope when + analyzing an attribute argument value or a parameter default value. + + + + + Mapping from variable to slot. + + + + + Mapping from local or parameter to inferred type. + + + + + A collection of variables associated with a method scope. For a particular method, the variables + may contain parameters and locals and any fields from other variables in the collection. If the method + is a nested function (a lambda or a local function), there is a reference to the variables collection at + the containing method scope. The outermost scope may also contain variables for static fields. + Each variable (parameter, local, or field of other variable) must be associated with the variables collection + for that method where the parameter or local are declared, even if the variable is used in a nested scope. + + + + + Unique identifier in the chain of nested Variables instances. The value starts at 0 + for the outermost method and increases at each nested function. + + + + + Variables instance for containing method, or null if this is the outermost method. + + + + + Symbol that contains this set of variables. This is typically a method but may be a field + when analyzing a field initializer. The symbol may be null at the outermost scope when + analyzing an attribute argument value or a parameter default value. + + + + + A mapping from local variables to the index of their slot in a flow analysis local state. + + + + + The inferred type at the point of declaration of var locals and parameters. + + + + + A mapping from the local variable slot to the symbol for the local variable itself. + + The first slot, slot 0, is reserved for indicating reachability, so the first tracked variable will + be given slot 1. When referring to VariableIdentifier.ContainingSlot, slot 0 indicates + that the variable in VariableIdentifier.Symbol is a root, i.e. not nested within another + tracked variable. Slots less than 0 are illegal. + + + + + Learn something about the input from a test of a given expression against a given pattern. The given + state is updated to note that any slots that are tested against `null` may be null. + + + + + Learn from any constant null patterns appearing in the pattern. + + Type type of the input expression (before nullable analysis). + Used to determine which types can contain null. + + + + A region analysis walker that records reads and writes of all variables, both inside and outside the region. + + + + + Note that a variable is read. + + The variable + If variable.Kind is RangeVariable, its underlying lambda parameter. Else null. + + + + When we read a field from a struct, the receiver isn't seen as being read until we get to the + end of the field access expression, because we only read the relevant piece of the struct. + But we want the receiver to be considered to be read in the region in that case. + For example, if an rvalue expression is x.y.z and the region is x.y, we want x to be included + in the ReadInside set. That is implemented here. + + + + + Compute the underlying lambda parameter symbol for a range variable, if any. + + The bound node for the expansion of the range variable + + + + Represents region analysis context attributes such as compilation, region, etc... + + + + Compilation to use + + + Containing symbol if available, null otherwise + + + Bound node, not null + + + Region to be used + + + Region to be used + + + True if the input was bad, such as no first and last nodes + + + + Construct context + + + + + A region analysis walker that computes whether or not the region completes normally. It does this by determining + if the point at which the region ends is reachable. + + + + + An analysis that computes all cases where the address is taken of a variable that has not yet been assigned + + + + + An analysis that computes the set of variables that may be used + before being assigned anywhere within a method. + + + + + A region analysis walker that records declared variables. + + + + + Record declared variables in the pattern. + + + + + Specifies the language version. + + + + + C# language version 1 + + + + + C# language version 2 + + + + + C# language version 3 + + Features: LINQ. + + + + + + C# language version 4 + + Features: dynamic. + + + + + + C# language version 5 + + Features: async, caller info attributes. + + + + + + C# language version 6 + Features: + + Using of a static class + Exception filters + Await in catch/finally blocks + Auto-property initializers + Expression-bodied methods and properties + Null-propagating operator ?. + String interpolation + nameof operator + Dictionary initializer + + + + + + C# language version 7.0 + Features: + + Out variables + Pattern-matching + Tuples + Deconstruction + Discards + Local functions + Digit separators + Ref returns and locals + Generalized async return types + More expression-bodied members + Throw expressions + + + + + + C# language version 7.1 + Features: + + Async Main + Default literal + Inferred tuple element names + Pattern-matching with generics + + + + + + C# language version 7.2 + Features: + + Ref readonly + Ref and readonly structs + Ref extensions + Conditional ref operator + Private protected + Digit separators after base specifier + Non-trailing named arguments + + + + + + C# language version 7.3 + Features: + + Indexing fixed fields does not require pinning + ref local variables may be reassigned + stackalloc arrays support initializers + More types support the fixed statement + Enhanced generic constraints + Tuples support == and != + Attach attributes to the backing fields for auto-implemented properties + Method overload resolution improvements when arguments differ by 'in' + Extend expression variables in initializers + Improved overload candidates + New compiler options (-publicsign and -pathmap) + + + + + + C# language version 8.0 + Features: + + Readonly members + Default interface methods + Pattern matching enhancements (switch expressions, property patterns, tuple patterns, and positional patterns) + Using declarations + Static local functions + Disposable ref structs + Nullable reference types + Asynchronous streams + Asynchronous disposable + Indices and ranges + Null-coalescing assignment + Unmanaged constructed types + Stackalloc in nested expressions + Enhancement of interpolated verbatim strings + + + + + + C# language version 9.0 + Features: + + Records + Init only setters + Top-level statements + Pattern matching enhancements + Native sized integers + Function pointers + Suppress emitting localsinit flag + Target-typed new expressions + Static anonymous functions + Target-typed conditional expressions + Covariant return types + Extension GetEnumerator support for foreach loops + Lambda discard parameters + Attributes on local functions + Module initializers + New features for partial methods + + + + + + C# language version 10.0 + Features: + + Record structs + Global using directives + Lambda improvements + Improved definite assignment + Constant interpolated strings + Mix declarations and variables in deconstruction + Extended property patterns + Sealed record ToString + Source Generator v2 APIs + Method-level AsyncMethodBuilder + + + + + + C# language version 11.0 +
+ Features: + + Raw string literals + Static abstract members in interfaces + Generic attributes + Newlines in interpolations + List-patterns + Required members + Span<char> constant pattern + Struct auto-default + Nameof(parameter) + Checked user-defined operators + UTF-8 string literals + Unsigned right-shift operator + Relaxed shift operator + Ref fields + File-local types + +
+
+ + + The latest major supported version. + + + + + Preview of the next language version. + + + + + The latest supported version of the language. + + + + + The default language version, which is the latest supported version. + + + + + Usages of TestOptions.RegularNext and LanguageVersionFacts.CSharpNext + will be replaced with TestOptions.RegularN and LanguageVersion.CSharpN when language version N is introduced. + + Corresponds to Microsoft.CodeAnalysis.CSharp.Shared.Extensions.LanguageVersionExtensions.CSharpNext. + + + + + + Displays the version number in the format expected on the command-line (/langver flag). + For instance, "6", "7.0", "7.1", "latest". + + + + + Try parse a from a string input, returning default if input was null. + + + + + Map a language version (such as Default, Latest, or CSharpN) to a specific version (CSharpM). + + + + Inference of tuple element names was added in C# 7.1 + + + + The purpose of this rewriter is to replace await-containing catch and finally handlers + with surrogate replacements that keep actual handler code in regular code blocks. + That allows these constructs to be further lowered at the async lowering pass. + + + + + Lower a block of code by performing local rewritings. + The goal is to not have exception handlers that contain awaits in them. + + 1) Await containing finally blocks: + The general strategy is to rewrite await containing handlers into synthetic handlers. + Synthetic handlers are not handlers in IL sense so it is ok to have awaits in them. + Since synthetic handlers are just blocks, we have to deal with pending exception/branch/return manually + (this is the hard part of the rewrite). + + try{ + code; + }finally{ + handler; + } + + Into ===> + + Exception ex = null; + int pendingBranch = 0; + + try{ + code; // any gotos/returns are rewritten to code that pends the necessary info and goes to finallyLabel + goto finallyLabel; + }catch (ex){ // essentially pend the currently active exception + }; + + finallyLabel: + { + handler; + if (ex != null) throw ex; // unpend the exception + unpend branches/return + } + + 2) Await containing catches: + try{ + code; + }catch (Exception ex){ + handler; + throw; + } + + + Into ===> + + Object pendingException; + int pendingCatch = 0; + + try{ + code; + }catch (Exception temp){ // essentially pend the currently active exception + pendingException = temp; + pendingCatch = 1; + }; + + switch(pendingCatch): + { + case 1: + { + Exception ex = (Exception)pendingException; + handler; + throw pendingException + } + } + + + + + Rewrites Try/Catch part of the Try/Catch/Finally + + + + + Analyzes method body for try blocks with awaits in finally blocks + Also collects labels that such blocks contain. + + + + + Returns true if a finally of the given try contains awaits + + + + + Returns true if a catch contains awaits + + + + + Returns true if body contains await in a finally block. + + + + + Labels reachable from within this frame without invoking its finally. + null if there are no such labels. + + + + + Additional information for rewriting an async-iterator. + + + + + Produces a MoveNext() method for an async-iterator method. + Compared to an async method, this handles rewriting `yield return` (with states decreasing from -3) and + `yield break`, and adds special handling for `try` to allow disposal. + `await` is handled like in async methods (with states 0 and up). + + + + + Where should we jump to to continue the execution of disposal path. + + Initially, this is the method's return value label (). + Inside a `try` or `catch` with a `finally`, we'll use the label directly preceding the `finally`. + Inside a `try` or `catch` with an extracted `finally`, we will use the label preceding the extracted `finally`. + Inside a `finally`, we'll have no/null label (disposal continues without a jump). + + + + + We use _exprReturnLabel for normal end of method (ie. no more values) and `yield break;`. + We use _exprReturnLabelTrue for `yield return;`. + + + + + States for `yield return` are decreasing from . + + + + + Lower the body, adding an entry state (-3) at the start, + so that we can differentiate an async-iterator that was never moved forward with MoveNextAsync() + from one that is running (-1). + Then we can guard against some bad usages of DisposeAsync. + + + + + An async-iterator state machine has a flag indicating "dispose mode". + We enter dispose mode by calling DisposeAsync() when the state machine is paused on a `yield return`. + DisposeAsync() will resume execution of the state machine from that state (using existing dispatch mechanism + to restore execution from a given state, without executing other code to get there). + + From there, we don't want normal code flow: + - from `yield return` within a try, we'll jump to its `finally` if it has one (or method exit) + - after finishing a `finally` within a `finally`, we'll continue + - after finishing a `finally` within a `try`, jump to the its `finally` if it has one (or method exit) + + Some `finally` clauses may have already been rewritten and extracted to a plain block (). + In those cases, we saved the finally-entry label in . + + + + + Some `finally` clauses may have already been rewritten and extracted to a plain block (). + The extracted block will have been wrapped as a so that we can process it as a `finally` block here. + + + + + Async methods have both a return type (void, Task, or Task<T>) and a 'result' type, which is the + operand type of any return expressions in the async method. The result type is void in the case of + Task-returning and void-returning async methods, and T in the case of Task<T>-returning async + methods. + + System.Runtime.CompilerServices provides a collection of async method builders that are used in the + generated code of async methods to create and manipulate the async method's task. There are three + distinct async method builder types, one of each async return type: AsyncVoidMethodBuilder, + AsyncTaskMethodBuilder, and AsyncTaskMethodBuilder<T>. + + AsyncMethodBuilderMemberCollection provides a common mechanism for accessing the well-known members of + each async method builder type. This avoids having to inspect the return style of the current async method + to pick the right async method builder member during async rewriting. + + + + + The builder's constructed type. + + + + + The result type of the constructed task: T for Task<T>, void otherwise. + + + + + Create an instance of the method builder. + + + + + Binds an exception to the method builder. + + + + + Marks the method builder as successfully completed, and sets the result if method is Task<T>-returning. + + + + + Schedules the state machine to proceed to the next action when the specified awaiter completes. + + + + + Schedules the state machine to proceed to the next action when the specified awaiter completes. This method can be called from partially trusted code. + + + + + Begins running the builder with the associated state machine. + + + + + Associates the builder with the specified state machine. + + + + + Get the constructed task for a Task-returning or Task<T>-returning async method. + + + + + True if generic method constraints should be checked at the call-site. + + + + + Produces a MoveNext() method for an async method. + + + + + The method being rewritten. + + + + + The field of the generated async class used to store the async method builder: an instance of + , , or depending on the + return type of the async method. + + + + + A collection of well-known members for the current async method builder. + + + + + The exprReturnLabel is used to label the return handling code at the end of the async state-machine + method. Return expressions are rewritten as unconditional branches to exprReturnLabel. + + + + + The label containing a return from the method when the async method has not completed. + + + + + The field of the generated async class used in generic task returning async methods to store the value + of rewritten return expressions. The return-handling code then uses SetResult on the async method builder + to make the result available to the caller. + + + + + Generate the body for MoveNext(). + + + + + This rewriter rewrites an async-iterator method. See async-streams.md for design overview. + + + + + Generates the `ValueTask<bool> MoveNextAsync()` method. + + + + + Prepares most of the parts for MoveNextAsync() and DisposeAsync() methods. + + + + + Generates the `ValueTask IAsyncDisposable.DisposeAsync()` method. + The DisposeAsync method should not be called from states -1 (running) or 0-and-up (awaits). + + + + + Generates the Current property. + + + + + Generates the GetAsyncEnumerator method. + + + + + Rewrite an async method into a state machine type. + + + + + Returns true if all types and members we need are present and good + + + + + Note: do not use a static/singleton instance of this type, as it holds state. + + + + + The class that represents a translated async or async-iterator method. + + + + + The rewriter for removing lambda expressions from method bodies and introducing closure classes + as containers for captured variables along the lines of the example in section 6.5.3 of the + C# language specification. A closure is the lowered form of a nested function, consisting of a + synthesized method and a set of environments containing the captured variables. + + The entry point is the public method . It operates as follows: + + First, an analysis of the whole method body is performed that determines which variables are + captured, what their scopes are, and what the nesting relationship is between scopes that + have captured variables. The result of this analysis is left in . + + Then we make a frame, or compiler-generated class, represented by an instance of + for each scope with captured variables. The generated frames are kept + in . Each frame is given a single field for each captured + variable in the corresponding scope. These are maintained in . + + Next, we walk and rewrite the input bound tree, keeping track of the following: + (1) The current set of active frame pointers, in + (2) The current method being processed (this changes within a lambda's body), in + (3) The "this" symbol for the current method in , and + (4) The symbol that is used to access the innermost frame pointer (it could be a local variable or "this" parameter) + + Lastly, we visit the top-level method and each of the lowered methods + to rewrite references (e.g., calls and delegate conversions) to local + functions. We visit references to local functions separately from + lambdas because we may see the reference before we lower the target + local function. Lambdas, on the other hand, are always convertible as + they are being lowered. + + There are a few key transformations done in the rewriting. + (1) Lambda expressions are turned into delegate creation expressions, and the body of the lambda is + moved into a new, compiler-generated method of a selected frame class. + (2) On entry to a scope with captured variables, we create a frame object and store it in a local variable. + (3) References to captured variables are transformed into references to fields of a frame class. + + In addition, the rewriting deposits into + a (, ) pair for each generated method. + + produces its output in two forms. First, it returns a new bound statement + for the caller to use for the body of the original method. Second, it returns a collection of + (, ) pairs for additional methods that the lambda rewriter produced. + These additional methods contain the bodies of the lambdas moved into ordinary methods of their + respective frame classes, and the caller is responsible for processing them just as it does with + the returned bound node. For example, the caller will typically perform iterator method and + asynchronous method transformations, and emit IL instructions into an assembly. + + + + + Perform a first analysis pass in preparation for removing all lambdas from a method body. The entry point is Analyze. + The results of analysis are placed in the fields seenLambda, blockParent, variableBlock, captured, and captures. + + + + + If a local function is in the set, at some point in the code it is converted to a delegate and should then not be optimized to a struct closure. + Also contains all lambdas (as they are converted to delegates implicitly). + + + + + True if the method signature can be rewritten to contain ref/out parameters. + + + + + The root of the scope tree for this method. + + + + + Must be called only after + has been calculated. + + Finds the most optimal capture environment to place a closure in. + This roughly corresponds to the 'highest' Scope in the tree where all + the captured variables for this closure are in scope. This minimizes + the number of indirections we may have to traverse to access captured + variables. + + + + + We may have ended up with a closure environment containing only + 'this'. This is basically equivalent to the containing type itself, + so we can inline the 'this' parameter into environments that + reference this one or lower closures directly onto the containing + type. + + + + + Calculates all functions which directly or indirectly capture a scope's variables. + + + + + + Must be called only after and . + + In order to reduce allocations, merge environments into a parent environment when it is safe to do so. + This must be done whilst preserving semantics. + + We also have to make sure not to extend the life of any variable. + This means that we can only merge an environment into its parent if exactly the same closures directly or indirectly reference both environments. + + + + + Walk up the scope tree looking for a variable declaration. + + + + + Find the parent of the corresponding to + the given . + + + + + Finds a with a matching + as the one given. + + + + + Walk up the scope tree looking for a nested function. + + + A tuple of the found and the it was found in. + + + + + Finds a with a matching original symbol somewhere in the given scope or nested scopes. + + + + + This is the core node for a Scope tree, which stores all semantically meaningful + information about declared variables, closures, and environments in each scope. + It can be thought of as the essence of the bound tree -- stripping away many of + the unnecessary details stored in the bound tree and just leaving the pieces that + are important for closure conversion. The root scope is the method scope for the + method being analyzed and has a null . + + + + + A list of all nested functions (all lambdas and local functions) declared in this scope. + + + + + A list of all locals or parameters that were declared in this scope and captured + in this scope or nested scopes. "Declared" refers to the start of the variable + lifetime (which, at this point in lowering, should be equivalent to lexical scope). + + + It's important that this is a set and that enumeration order is deterministic. We loop + over this list to generate proxies and if we loop out of order this will cause + non-deterministic compilation, and if we generate duplicate proxies we'll generate + wasteful code in the best case and incorrect code in the worst. + + + + + The bound node representing this scope. This roughly corresponds to the bound + node for the block declaring locals for this scope, although parameters of + methods/functions are introduced into their Body's scope and do not get their + own scope. + + + + + The nested function that this scope is nested inside. Null if this scope is not nested + inside a nested function. + + + + + Environment created in this scope to hold . + At the moment, all variables declared in the same scope + always get assigned to the same environment. + + + + + Is it safe to move any of the variables declared in this scope to the parent scope, + or would doing so change the meaning of the program? + + + + + The NestedFunction type represents a lambda or local function and stores + information related to that function. After initially building the + tree the only information available is + and . + Subsequent passes are responsible for translating captured + variables into captured environments and for calculating + the rewritten signature of the method. + + + + + The method symbol for the original lambda or local function. + + + + + Syntax for the block of the nested function. + + + + + True if this function directly or transitively captures 'this' (captures + a local function which directly or indirectly captures 'this'). + Calculated in . + + + + + True if this environment captures a reference to a class environment + declared in a higher scope. Assigned by + + + + + + Visit all nested functions in all nested scopes and run the . + + + + + Visit all the functions and return true when the returns + true. Otherwise, returns false. + + + + + Visit the tree with the given root and run the + + + + + Builds a tree of nodes corresponding to a given method. + + visits the bound tree and translates information from the bound tree about + variable scope, declared variables, and variable captures into the resulting + tree. + + At the same time it sets + for each Scope. This is done by looking for s + and s that jump from a point + after the beginning of a , to a + before the start of the scope, but after the start of . + + All loops have been converted to gotos and labels by this stage, + so we do not have to visit them to do so. Similarly all s + have been converted to s, so we do not have to + visit them. + + + + + Do not set this directly, except when setting the root scope. + Instead use or . + + + + + Null if we're not inside a nested function, otherwise the nearest nested function. + + + + + A mapping from all captured vars to the scope they were declared in. This + is used when recording captured variables as we must know what the lifetime + of a captured variable is to determine the lifetime of its capture environment. + + + + + If a local function is in the set, at some point in the code it is converted + to a delegate and should then not be optimized to a struct closure. + Also contains all lambdas (as they are converted to delegates implicitly). + + + + + For every label visited so far, this dictionary maps to a list of all scopes either visited so far, or currently being visited, + that are both after the label, and are on the same level of the scope tree as the label. + + + + + Contains a list of the labels visited so far for each scope. + The outer ArrayBuilder is a stack representing the chain of scopes from the root scope to the current scope, + and for each item on the stack, the ArrayBuilder is the list of the labels visited so far for the scope. + + Used by to determine which labels a new child scope appears after. + + + + + This is where we calculate . + is always true unless we jump from after + the beginning of a scope, to a point in between the beginning of the parent scope, and the beginning of the scope + + + + + + Add a diagnostic if the type of a captured variable is a restricted type + + + + + Create a new nested scope under the current scope, and replace with the new scope, + or reuse the current scope if there's no change in the bound node for the nested scope. + Records the given locals as declared in the aforementioned scope. + + + + + Creates a new nested scope which is a child of , + and replaces with the new scope + + + + + + Requires that scope is either the same as , + or is the of . + Returns immediately in the first case, + Replaces with scope in the second. + + + + + + Temporary bag for methods synthesized by the rewriting. Added to + at the end of rewriting. + + + + + TODO(https://github.com/dotnet/roslyn/projects/26): Delete this. + This should only be used by which + hasn't had logic to move the proxy analysis into , + where the could be walked to build + the proxy list. + + + + + Rewrite the given node to eliminate lambda expressions. Also returned are the method symbols and their + bound bodies for the extracted lambda bodies. These would typically be emitted by the caller such as + MethodBodyCompiler. See this class' documentation + for a more thorough explanation of the algorithm and its use by clients. + + The bound node to be rewritten + The type of the top-most frame + The "this" parameter in the top-most frame, or null if static method + The containing method of the node to be rewritten + Index of the method symbol in its containing type member list. + If this is non-null, then will be treated as this for uses of parent symbols. For use in EE. + Information on lambdas defined in needed for debugging. + Information on closures defined in needed for debugging. + Slot allocator. + The caller's buffer into which we produce additional methods to be emitted by the caller + Diagnostic bag for diagnostics + The set of original locals that should be assigned to proxies if lifted + + + + Adds synthesized types to the compilation state + and creates hoisted fields for all locals captured by the environments. + + + + + Synthesize closure methods for all nested functions. + + + + + Get the static container for closures or create one if one doesn't already exist. + + + associate the frame with the first lambda that caused it to exist. + we need to associate this with some syntax. + unfortunately either containing method or containing class could be synthetic + therefore could have no syntax. + + + + + Produce a bound expression representing a pointer to a frame of a particular frame type. + + The syntax to attach to the bound nodes produced + The type of frame to be returned + A bound node that computes the pointer to the required frame + + + + Produce a bound expression representing a pointer to a frame of a particular frame class. + Note that for generic frames, the frameClass parameter is the generic definition, but + the resulting expression will be constructed with the current type parameters. + + The syntax to attach to the bound nodes produced + The class type of frame to be returned + A bound node that computes the pointer to the required frame + + + + Introduce a frame around the translation of the given node. + + The node whose translation should be translated to contain a frame + The environment for the translated node + A function that computes the translation of the node. It receives lists of added statements and added symbols + The translated statement, as returned from F + + + + Rewrites a reference to an unlowered local function to the newly + lowered local function. + + + + + Substitutes references from old type arguments to new type arguments + in the lowered methods. + + + Consider the following method: + void M() { + void L<T>(T t) => Console.Write(t); + L("A"); + } + + In this example, L<T> is a local function that will be + lowered into its own method and the type parameter T will be + alpha renamed to something else (let's call it T'). In this case, + all references to the original type parameter T in L must be + rewritten to the renamed parameter, T'. + + + + + The closure doesn't declare any variables, and is never converted to a delegate. + Lambdas are emitted directly to the containing class as a static method. + + + + + The closure doesn't declare any variables, and is converted to a delegate at least once. + Display class is a singleton and may be shared with other top-level methods. + + + + + The closure only contains a reference to the containing class instance ("this"). + We don't emit a display class, lambdas are emitted directly to the containing class as its instance methods. + + + + + General closure. + Display class may only contain lambdas defined in the same top-level method. + + + + + Visit the expression, but do so in a way that ensures that its type is precise. That means that any + sometimes-unnecessary conversions (such as an implicit reference conversion) are retained. + + + + + A field of a frame class that represents a variable that has been captured in a lambda. + + + + + The synthesized type added to a compilation to hold captured variables for closures. + + + + + The closest method/lambda that this frame is originally from. Null if nongeneric static closure. + Useful because this frame's type parameters are constructed from this method and all methods containing this method. + + + + + All fields should have already been added as synthesized members on the + , so we don't want to duplicate them here. + + + + + A method that results from the translation of a single lambda expression. + + + + + This pass detects and reports diagnostics that do not affect lambda convertibility. + This part of the partial class focuses on features that cannot be used in expression trees. + CAVEAT: Errors may be produced for ObsoleteAttribute, but such errors don't affect lambda convertibility. + + + This pass detects and reports diagnostics that do not affect lambda convertibility. + This part of the partial class focuses on expression and operator warnings. + + + + + Called when a local represents an out variable declaration. Its syntax is of type DeclarationExpressionSyntax. + + + + + This is for when we are taking the address of a field. + Distinguish from . + + + + + This is for when we are dotting into a field. + Distinguish from . + + NOTE: dev11 also calls this on string initializers in fixed statements, + but never accomplishes anything since string is a reference type. This + is probably a bug, but fixing it would be a breaking change. + + + + + Based on OutputContext::IsNonAgileField. + + + + + Returns the expression if the statement is actually an expression (ExpressionStatementSyntax with no trailing semicolon). + + + + + Utility class, provides a convenient way of combining various s in a chain, + allowing each of them to apply specific instrumentations in particular order. + + Default implementation of all APIs delegates to the "previous" passed as a parameter + to the constructor of this class. Usually, derived types are going to let the base (this class) to do its work first + and then operate on the result they get back. + + + + + This type is responsible for adding debugging sequence points for the executable code. + It can be combined with other s. Usually, this class should be + the root of the chain in order to ensure sound debugging experience for the instrumented code. + In other words, sequence points are typically applied after all other changes. + + + + + A singleton object that performs only one type of instrumentation - addition of debugging sequence points. + + + + + Add sequence point |here|: + + foreach (Type var in |expr|) { } + + + Hit once, before looping begins. + + + + + Add sequence point |here|: + + |foreach| (Type var in expr) { } + + + Hit once, before looping begins. + + + + + Add sequence point |here|: + + foreach (|Type var| in expr) { } + + + Hit every iteration. + + + + + This type provides means for instrumenting compiled methods for dynamic analysis. + It can be combined with other s. + + + + + A base class for components that instrument various portions of executable code. + It provides a set of APIs that are called by to instrument + specific portions of the code. These APIs have at least two parameters: + - original bound node produced by the for the relevant portion of the code; + - rewritten bound node created by the for the original node. + The APIs are expected to return new state of the rewritten node, after they apply appropriate + modifications, if any. + + The base class provides default implementation for all APIs, which simply returns the rewritten node. + + + + + The singleton NoOp instrumenter, can be used to terminate the chain of s. + + + + + Return a node that is associated with open brace of the block. Ok to return null. + + + + + Return a node that is associated with close brace of the block. Ok to return null. + + + + + Instrument a switch case when clause, which is translated to a conditional branch to the body of the case block. + + the bound expression of the when clause + the lowered conditional branch into the case block + + + + Instrument the expression of a switch arm of a switch expression. + + + + + The constructor of the class that is the translation of an iterator method. + + + + + A synthesized Finally method containing finalization code for a resumable try statement. + Finalization code for such try may run when: + 1) control flow goes out of try scope by dropping through + 2) control flow goes out of try scope by conditionally or unconditionally branching outside of one ore more try/finally frames. + 3) enumerator is disposed by the owner. + 4) enumerator is being disposed after an exception. + + It is easier to manage partial or complete finalization when every finally is factored out as a separate method. + + NOTE: Finally is a private void nonvirtual instance method with no parameters. + It is a valid JIT inlining target as long as JIT may consider inlining profitable. + + + + + The field of the generated iterator class that underlies the Current property. + + + + + Tells us if a particular try contains yield returns + + + + + When this is more that 0, returns are emitted as "methodValue = value; goto exitLabel;" + + + + + The current iterator finally frame in the tree of finally frames. + By default there is a root finally frame. + Root frame does not have a handler, but may contain nested frames. + + + + + Finally state of the next Finally frame if such created. + Finally state is a negative decreasing number starting with -3. (-2 is used for something else). + Root frame has finally state -1. + + The Finally state is the state that we are in when "between states". + Regular states are positive and are the only states that can be resumed to. + The purpose of distinct finally states is to have enough information about + which finally handlers must run when we need to finalize iterator after a fault. + + + + + Produces a Try/Finally if frame has a handler (otherwise a regular block). + Handler goes into the Finally. + If there are nested frames, they are emitted into the try block. + This way the handler for the current frame is guaranteed to run even if + nested handlers throw exceptions. + + { + switch(state) + { + case state1: + case state2: + case state3: + case state4: + try + { + switch(state) + { + case state3: + case state4: + try + { + ... more nested state dispatches if any .... + } + finally + { + // handler for a try where state3 and state4 can be observed + handler_3_4() + } + break; + } + } + finally + { + // handler for a try where state1 and state2 can be observed + handler_1_2() + } + break; + + case state5: + ... another dispatch of nested states to their finally blocks ... + break; + } + } + + + + + + Analyzes method body for yields in try blocks and labels that they contain. + + + + + Returns true if given try or any of its nested try blocks contain yields + + + + + Returns true if body contains yield returns within try blocks. + + + + + Labels reachable from within this frame without invoking its finally. + null if there are none such labels. + + + + + Analyzes method body for labels. + + + + + Rewrite an iterator method into a state machine class. + + + + + Returns true if all types and members we need are present and good + + + + + Check that the property and its getter exist and collect any use-site errors. + + + + + Add IEnumerator<elementType> IEnumerable<elementType>.GetEnumerator() + + + + + The class that represents a translated iterator method. + + + + + This type helps rewrite the delegate creations that target static method groups to use a cached instance of delegate. + + + + + Lower a block of code by performing local rewritings. + + + + + Return the translated node, or null if no code is necessary in the translation. + + + + + Returns substitution currently used by the rewriter for a placeholder node. + Each occurrence of the placeholder node is replaced with the node returned. + Throws if there is no substitution. + + + + + Sets substitution used by the rewriter for a placeholder node. + Each occurrence of the placeholder node is replaced with the node returned. + Throws if there is already a substitution. + + + + + Removes substitution currently used by the rewriter for a placeholder node. + Asserts if there isn't already a substitution. + + + + + This function provides a false sense of security, it is likely going to surprise you when the requested member is missing. + Recommendation: Do not use, use instead! + If used, a unit-test with a missing member is absolutely a must have. + + + + + This function provides a false sense of security, it is likely going to surprise you when the requested member is missing. + Recommendation: Do not use, use instead! + If used, a unit-test with a missing member is absolutely a must have. + + + + + Returns true if the initializer is a field initializer which should be optimized out + + + + + A common base class for lowering a decision dag. + + + + + Get the builder for code in the given section of the switch. + For an is-pattern expression, this is a singleton. + + + + + The lowered decision dag. This includes all of the code to decide which pattern + is matched, but not the code to assign to pattern variables and evaluate when clauses. + + + + + The label in the code for the beginning of code for each node of the dag. + + + + + A utility class that is used to scan a when clause to determine if it might assign a pattern variable + declared in that case, directly or indirectly. Used to determine if we can skip the allocation of + pattern-matching temporary variables and use user-declared pattern variables instead, because we can + conclude that they are not mutated by a when clause while the pattern-matching automaton is running. + + + + + If we have a type test followed by a cast to that type, and the types are reference types, + then we can replace the pair of them by a conversion using `as` and a null check. + + true if we generated code for the test + + + + Generate a switch dispatch for a contiguous sequence of dag nodes if applicable. + Returns true if it was applicable. + + + + + Push the set of equality tests down to the level of the leaves in the value dispatch tree. + + + + + A comparer for sorting cases containing values of type float, double, or decimal. + + + + + Checks whether we are generating a hash table based string switch and + we need to generate a new helper method for computing string hash value. + Creates the method if needed. + + + + + Translate the decision dag for node, given that it will be followed by the translation for nextNode. + + + + + A node in a tree representing the form of a generated decision tree for classifying an input value. + + + + + A node representing the dispatch by value (equality). This corresponds to a classical C switch + statement, except that it also handles values of type float, double, decimal, and string. + + + + + A node representing a final destination that requires no further dispatch. + + + + + A node representing a dispatch based on a relational test of the input value by some constant. + Nodes of this kind are required to be height-balanced when constructed, so that when the full + decision tree is produced it generates a balanced tree of comparisons. The shape of the tree + keeps tests for lower values on the left and tests for higher values on the right: + For and , + the branch is and the branch + is ; for and + it is reversed. + See for where that is computed. + + + + The side of the test handling lower values. The true side for < and <=, the false side for > and >=. + + + The side of the test handling higher values. The false side for < and <=, the true side for > and >=. + + + + Is the operator among those for which is ? + + + + + A common base class for lowering constructs that use pattern-matching. + + + + + True if we should produce instrumentation and sequence points, which we do for a switch statement and a switch expression. + This affects + - whether or not we invoke the instrumentation APIs + - production of sequence points + - synthesized local variable kind + The temp variables must be long lived in a switch statement since their lifetime spans across sequence points. + + + + + Try setting a user-declared variable (given by its accessing expression) to be + used for a pattern-matching temporary variable. Returns true when not already + assigned. The return value of this method is typically ignored by the caller as + once we have made an assignment we can keep it (we keep the first assignment we + find), but we return a success bool to emphasize that the assignment is not unconditional. + + + + + Return the side-effect expression corresponding to an evaluation. + + + + + Return the boolean expression to be evaluated for the given test. Returns `null` if the test is trivially true. + + + + + Lower a test followed by an evaluation into a side-effect followed by a test. This permits us to optimize + a type test followed by a cast into an `as` expression followed by a null check. Returns true if the optimization + applies and the results are placed into and . The caller + should place the side-effect before the test in the generated code. + + + + + + true if the optimization is applied + + + + Produce assignment of the input expression. This method is also responsible for assigning + variables for some pattern-matching temps that can be shared with user variables. + + + + + We have a decision dag whose input is a tuple literal, and the decision dag does not need the tuple itself. + We rewrite the decision dag into one which doesn't touch the tuple, but instead works directly with the + values that have been stored in temps. This permits the caller to avoid creation of the tuple object + itself. We also emit assignments of the tuple values into their corresponding temps. + + An expression that produces the value of the original input if needed + by the caller. + A new decision dag that does not reference the input directly + + + + Generates a lowered form of the assignment operator for the given left and right sub-expressions. + Left and right sub-expressions must be in lowered form. + + + + + Generates a lowered form of the assignment operator for the given left and right sub-expressions. + Left and right sub-expressions must be in lowered form. + + + + + Lower an await expression that has already had its components rewritten. + + + + + A common base class for lowering the pattern switch statement and the pattern switch expression. + + + + + Map from when clause's syntax to the lowered code for the matched pattern. The code for a section + includes the code to assign to the pattern variables and evaluate the when clause. Since a + when clause can yield a false value, it can jump back to a label in the lowered decision dag. + + + + + Lower the given nodes into _loweredDecisionDag. Should only be called once per instance of this. + + + + + This function provides a false sense of security, it is likely going to surprise you when the requested member is missing. + Recommendation: Do not use, use instead! + If used, a unit-test with a missing member is absolutely a must have. + + + + + This function provides a false sense of security, it is likely going to surprise you when the requested member is missing. + Recommendation: Do not use, use instead! + If used, a unit-test with a missing member is absolutely a must have. + + + + + Spec section 7.9: if the left operand is int or uint, mask the right operand with 0x1F; + if the left operand is long or ulong, mask the right operand with 0x3F. + + + + + This rather confusing method tries to reproduce the functionality of ExpressionBinder::bindPtrAddMul and + ExpressionBinder::bindPtrMul. The basic idea is that we have a numeric expression, x, and a pointer type, + T*, and we want to multiply x by sizeof(T). Unfortunately, we need to stick in some conversions to make + everything work. + + 1) If x is an int, then convert it to an IntPtr (i.e. a native int). Dev10 offers no explanation (ExpressionBinder::bindPtrMul). + 2) Do overload resolution based on the (possibly converted) type of X and int (the type of sizeof(T)). + 3) If the result type of the chosen multiplication operator is signed, convert the product to IntPtr; + otherwise, convert the product to UIntPtr. + + + + + Visit a partial list of statements that possibly contain using declarations + + The array builder to append statements to + The list of statements to visit + The index of the to begin visiting at + An of + + + + Visits a node that is possibly a + + The node to visit + All statements in the block containing this node + The current statement being visited in + Set to true if this visited a node + A + + The node being visited is not necessarily equal to statements[startIndex]. + When traversing down a set of labels, we set node to the label.body and recurse, but statements[startIndex] still refers to the original parent label + as we haven't actually moved down the original statement list + + + + + Visits all arguments of a method, doing any necessary rewriting for interpolated string handler conversions that + might be present in the arguments and creating temps for any discard parameters. + + + + + Rewrites arguments of an invocation according to the receiving method or indexer. + It is assumed that each argument has already been lowered, but we may need + additional rewriting for the arguments, such as generating a params array, re-ordering + arguments based on map, inserting arguments for optional parameters, etc. + + + + + Patch refKinds for arguments that match 'In' or 'Ref' parameters to have effective RefKind. + For the purpose of further analysis we will mark the arguments as - + - In if was originally passed as None + - StrictIn if was originally passed as In + - Ref if the argument is an interpolated string literal subject to an interpolated string handler conversion. No other types + are patched here. + Here and in the layers after the lowering we only care about None/notNone differences for the arguments + Except for async stack spilling which needs to know whether arguments were originally passed as "In" and must obey "no copying" rule. + + + + + Returns true if the given argument is the beginning of a list of param array arguments (could be empty), otherwise returns false. + When returns true, numberOfParamArrayArguments is set to the number of param array arguments. + + + + + To create literal expression for IOperation, set localRewriter to null. + + + + + Process tempStores and add them as side-effects to arguments where needed. The return + value tells how many temps are actually needed. For unnecessary temps the corresponding + temp store will be cleared. + + + + + Returns true if the was lowered and transformed. + The is not changed if this function returns false. + + + + + In the expanded form of a compound assignment (or increment/decrement), the LHS appears multiple times. + If we aren't careful, this can result in repeated side-effects. This creates (ordered) temps for all of the + subexpressions that could result in side-effects and returns a side-effect-free expression that can be used + in place of the LHS in the expanded form. + + The LHS sub-expression of the compound assignment (or increment/decrement). + Populated with a list of assignment expressions that initialize the temporary locals. + Populated with a list of temporary local symbols. + True if the compound assignment is a dynamic operation. + + A side-effect-free expression representing the LHS. + The returned node needs to be lowered but its children are already lowered. + + + + + Variables local to current frame do not need temps when re-read multiple times + as long as there is no code that may write to locals in between accesses and they + are not captured. + + Example: + l += goo(ref l); + + even though l is a local, we must access it via a temp since "goo(ref l)" may change it + on between accesses. + + Note: In this.x++, this cannot change between reads. But in (this, ...) == (..., this.Mutate()) it can. + + + + + If the condition has a constant value, then just use the selected branch. + e.g. "true ? x : y" becomes "x". + + + + + Helper method to generate a lowered conversion. + + + + + Helper method to generate a lowered conversion from the given to the given . + + + If we're converting a default parameter value to the parameter type, then the conversion can actually fail + (e.g. if the default value was specified by an attribute and was, therefore, not checked by the compiler). + Set acceptFailingConversion if you want to see default(rewrittenType) in such cases. + The error will be suppressed only for conversions from or . + + + + + If the nullable expression always has a value, returns the value, otherwise null. + This is normally performed on a lowered expression, however for the purpose of + tuples and tuple equality operators, we do this on a partially lowered expression in + which conversions appearing at the top of the expression have not been lowered. + If this method is updated to recognize more complex patterns, callers should be reviewed. + + + + + Reports diagnostics and returns Conversion.NoConversion in case of missing runtime helpers. + + + + + Reports diagnostics and returns Conversion.NoConversion in case of missing runtime helpers. + + + + + Reports diagnostics and returns Conversion.NoConversion in case of missing runtime helpers. + + + + + The left represents a tree of L-values. The structure of right can be missing parts of the tree on the left. + The conversion holds nested conversions and deconstruction information, which matches the tree from the left, + and it provides the information to fill in the missing parts of the tree from the right and convert it to + the tree from the left. + + A bound sequence is returned which has different phases of side-effects: + - the initialization phase includes side-effects from the left, followed by evaluations of the right + - the deconstruction phase includes all the invocations of Deconstruct methods and tuple element accesses below a Deconstruct call + - the conversion phase + - the assignment phase + + + + + This method recurses through leftTargets, right and conversion at the same time. + As it does, it collects side-effects into the proper buckets (init, deconstructions, conversions, assignments). + + The side-effects from the right initially go into the init bucket. But once we started drilling into a Deconstruct + invocation, subsequent side-effects from the right go into the deconstructions bucket (otherwise they would + be evaluated out of order). + + + + + Evaluate side effects into a temp, if any. Return the expression to give the value later. + + The argument to evaluate early. + A store of the argument into a temp, if necessary, is added here. + Any generated temps are added here. + An expression evaluating the argument later (e.g. reading the temp), including a possible deferred user-defined conversion. + + + + Adds the side effects to effects and returns temporaries to access them. + The caller is responsible for releasing the nested ArrayBuilders. + The variables should be unlowered. + + + + + If we have a WinRT type event, we need to encapsulate the adder call + (which returns an EventRegistrationToken) with a call to + WindowsRuntimeMarshal.AddEventHandler or RemoveEventHandler, but these + require us to create a new Func representing the adder and another + Action representing the Remover. + + The rewritten call looks something like: + + WindowsRuntimeMarshal.AddEventHandler<EventHandler> + (new Func<EventHandler, EventRegistrationToken>(@object.add), + new Action<EventRegistrationToken>(@object.remove), handler); + + Where @object is a compiler-generated local temp if needed. + + + TODO: use or delete isDynamic. + + + + + Converts access to a tuple instance into access into the underlying ValueTuple(s). + + For instance, tuple.Item8 + produces fieldAccess(field=Item1, receiver=fieldAccess(field=Rest, receiver=ValueTuple for tuple)) + + + + + Basically, what we need to know is, if an exception occurred within the fixed statement, would + additional code in the current method be executed before its stack frame was popped? + + + + + If two (or more) fixed statements are nested, then we want to avoid having the outer + fixed statement re-traverse the lowered bound tree of the inner one. We accomplish + this by having each fixed statement cache a set of unmatched gotos that can be + reused by any containing fixed statements. + + + + + Look for gotos without corresponding labels in the lowered body of a fixed statement. + + + Assumes continue, break, etc have already been rewritten to gotos. + + + + + + + pinned ref int pinnedTemp = ref v; // pinning managed ref + int* ptr = (int*)&pinnedTemp; // unsafe cast to unmanaged ptr + . . . + ]]> + + + + + + + pinned ref int pinnedTemp = ref v; // pinning managed ref + int* ptr = (int*)&pinnedTemp; // unsafe cast to unmanaged ptr + . . . + ]]> + + + + + fixed(char* ptr = stringVar){ ... } == becomes ===> + + pinned string pinnedTemp = stringVar; // pinning managed ref + char* ptr = (char*)pinnedTemp; // unsafe cast to unmanaged ptr + if (pinnedTemp != null) ptr += OffsetToStringData(); + . . . + + + + + + + pinned int[] pinnedTemp = arr; // pinning managed ref + int* ptr = pinnedTemp != null && pinnedTemp.Length != 0 ? + (int*)&pinnedTemp[0] : // unsafe cast to unmanaged ptr + 0; + . . . + ]]> + + + + + This is the entry point for foreach-loop lowering. It delegates to + RewriteEnumeratorForEachStatement + RewriteSingleDimensionalArrayForEachStatement + RewriteMultiDimensionalArrayForEachStatement + CanRewriteForEachAsFor + + + We are diverging from the C# 4 spec (and Dev10) to follow the C# 5 spec. + The iteration variable will be declared *inside* each loop iteration, + rather than outside the loop. + + + + + Lower a foreach loop that will enumerate a collection using an enumerator. + + + + + + + There are three possible cases where we need disposal: + - pattern-based disposal (we have a Dispose/DisposeAsync method) + - interface-based disposal (the enumerator type converts to IDisposable/IAsyncDisposable) + - we need to do a runtime check for IDisposable + + + + + Produce: + await /* disposeCall */; + + + + + Optionally apply a conversion to the receiver. + + If the receiver is of struct type and the method is an interface method, then skip the conversion. + When we call the interface method directly - the code generator will detect it and generate a + constrained virtual call. + + A syntax node to attach to the synthesized bound node. + Receiver of method call. + Method to invoke. + Conversion to be applied to the receiver if not calling an interface method on a struct. + Type of the receiver after applying the conversion. + + + + Lower a foreach loop that will enumerate a collection via indexing. + + + + + NOTE: We're assuming that sequence points have already been generated. + Otherwise, lowering to for-loops would generated spurious ones. + + + + + Takes the expression for the current value of the iteration variable and either + (1) assigns it into a local, or + (2) deconstructs it into multiple locals (if there is a deconstruct step). + + Produces V v = /* expression */ or (D1 d1, ...) = /* expression */. + + + + + Lower a foreach loop that will enumerate a single-dimensional array. + + A[] a = x; + for (int p = 0; p < a.Length; p = p + 1) { + V v = (V)a[p]; /* OR */ (D1 d1, ...) = (V)a[p]; + // body + } + + + We will follow Dev10 in diverging from the C# 4 spec by ignoring Array's + implementation of IEnumerable and just indexing into its elements. + + NOTE: We're assuming that sequence points have already been generated. + Otherwise, lowering to for-loops would generated spurious ones. + + + + + Lower a foreach loop that will enumerate a multi-dimensional array. + + A[...] a = x; + int q_0 = a.GetUpperBound(0), q_1 = a.GetUpperBound(1), ...; + for (int p_0 = a.GetLowerBound(0); p_0 <= q_0; p_0 = p_0 + 1) + for (int p_1 = a.GetLowerBound(1); p_1 <= q_1; p_1 = p_1 + 1) + ... + { + V v = (V)a[p_0, p_1, ...]; /* OR */ (D1 d1, ...) = (V)a[p_0, p_1, ...]; + /* body */ + } + + + We will follow Dev10 in diverging from the C# 4 spec by ignoring Array's + implementation of IEnumerable and just indexing into its elements. + + NOTE: We're assuming that sequence points have already been generated. + Otherwise, lowering to nested for-loops would generated spurious ones. + + + + + So that the binding info can return an appropriate SemanticInfo.Converted type for the collection + expression of a foreach node, it is wrapped in a BoundConversion to the collection type in the + initial bound tree. However, we may be able to optimize away (or entirely disregard) the conversion + so we pull out the bound node for the underlying expression. + + + + + Used to produce an expression translating to an integer offset + according to the . + The implementation should be in sync with . + + The lowered input for the translation + + An expression accessing the length of the indexing target. This should + be a non-side-effecting operation. + + The translation strategy + + + + Determine the lowering strategy for translating a System.Index value to an integer offset value + and prepare the lowered input for the translation process handled by . + The implementation should be in sync with . + + + + + A local rewriter for lowering an is-pattern expression. This handles the general case by lowering + the decision dag, and returning a "true" or "false" value as the result at the end. + + + + + Accumulates side-effects that come before the next conjunct. + + + + + Accumulates conjuncts (conditions that must all be true) for the translation. When a conjunct is added, + elements of the _sideEffectBuilder, if any, should be added as part of a sequence expression for + the conjunct being added. + + + + + Translate the single test into _sideEffectBuilder and _conjunctBuilder. + + + + + Translate an is-pattern expression into a sequence of tests separated by the control-flow-and operator. + + + + + Lowers a lock statement to a try-finally block that calls Monitor.Enter and Monitor.Exit + before and after the body, respectively. + + + + + A map from section syntax to the first label in that section. + + + + + We revise the returned label for a leaf so that all leaves in the same switch section are given the same label. + This enables the switch emitter to produce better code. + + + + + The strategy of this rewrite is to do rewrite "locally". + We analyze arguments of the concat in a shallow fashion assuming that + lowering and optimizations (including this one) is already done for the arguments. + Based on the arguments we select the most appropriate pattern for the current node. + + NOTE: it is not guaranteed that the node that we chose will be the most optimal since we have only + local information - i.e. we look at the arguments, but we do not know about siblings. + When we move to the parent, the node may be rewritten by this or some another optimization. + + Example: + result = ( "abc" + "def" + null ?? expr1 + "moo" + "baz" ) + expr2 + + Will rewrite into: + result = Concat("abcdef", expr2) + + However there will be transient nodes like Concat(expr1 + "moo") that will not be present in the + resulting tree. + + + + + + digs into known concat operators and unwraps their arguments + otherwise returns the expression as-is + + Generally we only need to recognize same node patterns that we create as a result of concatenation rewrite. + + + + + Determines whether an expression is a known string concat operator (with or without a subsequent ?? ""), and extracts + its args if so. + + True if this is a call to a known string concat operator, false otherwise + + + + folds two concat operands into one expression if possible + otherwise returns null + + + + + folds two concat constants into one if possible + otherwise returns null. + It is generally always possible to concat constants, unless resulting string would be too large. + + + + + Strangely enough there is such a thing as unary concatenation and it must be rewritten. + + + + + Most of the above optimizations are not applicable in expression trees as the operator + must stay a binary operator. We cannot do much beyond constant folding which is done in binder. + + + + + Returns an expression which converts the given expression into a string (or null). + If necessary, this invokes .ToString() on the expression, to avoid boxing value types. + + + + + Helper method to generate a lowered conversion from the given to the given . + + + + + Rewrites the given interpolated string to the set of handler creation and Append calls, returning an array builder of the append calls and the result + local temp. + + Caller is responsible for freeing the ArrayBuilder + + + + Is there any code to execute in the given statement that could have side-effects, + such as throwing an exception? This implementation is conservative, in the sense + that it may return true when the statement actually may have no side effects. + + + + + Rewrite GetTuple() == (1, 2) to tuple.Item1 == 1 && tuple.Item2 == 2. + Also supports the != operator, nullable and nested tuples. + + Note that all the side-effects for visible expressions are evaluated first and from left to right. The initialization phase + contains side-effects for: + - single elements in tuple literals, like a in (a, ...) == (...) for example + - nested expressions that aren't tuple literals, like GetTuple() in (..., GetTuple()) == (..., (..., ...)) + On the other hand, Item1 and Item2 of GetTuple() are not saved as part of the initialization phase of GetTuple() == (..., ...) + + Element-wise conversions occur late, together with the element-wise comparisons. They might not be evaluated. + + + + + Walk down tuple literals and replace all the side-effecting elements that need saving with temps. + Expressions that are not tuple literals need saving, as are tuple literals that are involved in + a simple comparison rather than a tuple comparison. + + + + + Evaluate side effects into a temp, if necessary. If there is an implicit user-defined + conversion operation near the top of the arg, preserve that in the returned expression to be evaluated later. + Conversions at the head of the result are unlowered, though the nested arguments within it are lowered. + That resulting expression must be passed through to + complete the lowering. + + + + + Produce a .HasValue and a .GetValueOrDefault() for nullable expressions that are neither always null or + never null, and functionally equivalent parts for other cases. + + + + + Returns a temp which is initialized with lowered-expression.HasValue + + + + + Produces a chain of equality (or inequality) checks combined logically with AND (or OR) + + + + + For tuple literals, we just return the element. + For expressions with tuple type, we access Item{i+1}. + + + + + Produce an element-wise comparison and logic to ensure the result is a bool type. + + If an element-wise comparison doesn't return bool, then: + - if it is dynamic, we'll do !(comparisonResult.false) or comparisonResult.true + - if it implicitly converts to bool, we'll just do the conversion + - otherwise, we'll do !(comparisonResult.false) or comparisonResult.true (as we'd do for if or while) + + + + + Lower any conversions appearing near the top of the bound expression, assuming non-conversions + appearing below them have already been lowered. + + + + + Converts the expression for creating a tuple instance into an expression creating a ValueTuple (if short) or nested ValueTuples (if longer). + + For instance, for a long tuple we'll generate: + creationExpression(ctor=largestCtor, args=firstArgs+(nested creationExpression for remainder, with smaller ctor and next few args)) + + + + + This rewriter lowers pre-/post- increment/decrement operations (initially represented as + unary operators). We use BoundSequenceExpressions because we need to capture the RHS of the + assignment in a temp variable. + + + This rewriter assumes that it will be run before decimal rewriting (so that it does not have + to lower decimal constants and operations) and call rewriting (so that it does not have to + lower property accesses). + + + + + The rewrites are as follows: suppose the operand x is a variable of type X. The + chosen increment/decrement operator is modelled as a static method on a type T, + which takes a value of type T and returns the result of incrementing or decrementing + that value. + + x++ + X temp = x + x = (X)(T.Increment((T)temp)) + return temp + x-- + X temp = x + x = (X)(T.Decrement((T)temp)) + return temp + ++x + X temp = (X)(T.Increment((T)x)) + x = temp + return temp + --x + X temp = (X)(T.Decrement((T)x)) + x = temp + return temp + + Note: + Dev11 implements dynamic prefix operators incorrectly. + + result = ++x.P is emitted as result = SetMember{"P"}(t, UnaryOperation{Inc}(GetMember{"P"}(x))) + + The difference is that Dev11 relies on SetMember returning the same value as it was given as an argument. + Failing to do so changes the semantics of ++/-- operator which is undesirable. We emit the same pattern for + both dynamic and static operators. + + For example, we might have a class X with user-defined implicit conversions + to and from short, but no user-defined increment or decrement operators. We + would bind x++ as "X temp = x; x = (X)(short)((int)(short)temp + 1); return temp;" + + The unary operator expression representing the increment/decrement. + A bound sequence that uses a temp to achieve the correct side effects and return value. + + + + Transform an expression from a form suitable as an lvalue to a form suitable as an rvalue. + + The children of this node must already be lowered. + Fully lowered node. + + + + Rewrite a using statement into a try finally statement. Four forms are possible: + 1) using (expr) stmt + 2) await using (expr) stmt + 3) using (C c = expr) stmt + 4) await using (C c = expr) stmt + + The first two are handled by RewriteExpressionUsingStatement and the latter two are handled by + RewriteDeclarationUsingStatement (called in a loop, once for each local declared). + + For the async variants, `IAsyncDisposable` is used instead of `IDisposable` and we produce + `... await expr.DisposeAsync() ...` instead of `... expr.Dispose() ...`. + + + It would be more in line with our usual pattern to rewrite using to try-finally + in the ControlFlowRewriter, but if we don't do it here the BoundMultipleLocalDeclarations + will be rewritten into a form that makes them harder to separate. + + + + + Lower "[await] using var x = (expression)" to a try-finally block. + + + + + Lower "using [await] (expression) statement" to a try-finally block. + + + + + Lower "using [await] (ResourceType resource = expression) statement" to a try-finally block. + + + Assumes that the local symbol will be declared (i.e. in the LocalsOpt array) of an enclosing block. + Assumes that using statements with multiple locals have already been split up into multiple using statements. + + + + + The node that declares the type of the resource (might be shared by multiple resource declarations, e.g. using T x = expr, y = expr;) + + + The node that declares the resource storage, e.g. x = expr in using T x = expr, y = expr;. + + + + + The node that declares the type of the resource (might be shared by multiple resource declarations, e.g. using T x = expr, y = expr;) + + + The node that declares the resource storage, e.g. x = expr in using T x = expr, y = expr;. + + + + + Synthesize a call `expression.Method()`, but with some extra smarts to handle extension methods, and to fill-in optional and params parameters. This call expects that the + receiver parameter has already been visited. + + + + + The dynamic operation factories below return this struct so that the caller + have the option of separating the call-site initialization from its invocation. + + Most callers just call to get the combo but some (object and array initializers) + hoist all call-site initialization code and emit multiple invocations of the same site. + + + + + Corresponds to Microsoft.CSharp.RuntimeBinder.CSharpBinderFlags. + + + + + Corresponds to Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfoFlags. + + + + + If there are any discards in the arguments, create locals for each, updates the arguments and + returns the symbols that were created. + Returns default if no discards found. + + + + + If an expression node that declares synthesized short-lived locals (currently only sequence) contains + a spill sequence (from an await or switch expression), these locals become long-lived since their + values may be read by code that follows. We promote these variables to long-lived of kind + . + + + + + Rewrite the replacement expression for the hoisted local so all synthesized field are accessed as members + of the appropriate frame. + + + + + A walker that computes the set of local variables of an iterator/async + method that must be hoisted to the state machine. + + + Data flow analysis is used to calculate the locals. At yield/await we mark all variables as "unassigned". + When a read from an unassigned variables is reported we add the variable to the captured set. + "this" parameter is captured if a reference to "this", "base" or an instance field is encountered. + Variables used in finally also need to be captured if there is a yield in the corresponding try block. + + + + + The "state" of the state machine that is the translation of the iterator method. + + + + + Cached "state" of the state machine within the MoveNext method. We work with a copy of + the state to avoid shared mutable state between threads. (Two threads can be executing + in a Task's MoveNext method because an awaited task may complete after the awaiter has + tested whether the subtask is complete but before the awaiter has returned) + + + + + Cached "this" local, used to store the captured "this", which is safe to cache locally since "this" + is semantically immutable. + It would be hard for such caching to happen at JIT level (since JIT does not know that it never changes). + NOTE: this field is null when we are not caching "this" which happens when + - not optimizing + - method is not capturing "this" at all + - containing type is a struct + (we could cache "this" as a ref local for struct containers, + but such caching would not save as much indirection and could actually + be done at JIT level, possibly more efficiently) + + + + + Allocates resumable states, i.e. states that resume execution of the state machine after await expression or yield return. + + + + + For each distinct label, the set of states that need to be dispatched to that label. + Note that there is a dispatch occurring at every try-finally statement, so this + variable takes on a new set of values inside each try block. + + + + + A pool of fields used to hoist locals. They appear in this set when not in scope, + so that members of this set may be allocated to locals when the locals come into scope. + + + + + Fields allocated for temporary variables are given unique names distinguished by a number at the end. + This counter ensures they are unique within a given translated method. + + + + + Used to enumerate the instance fields of a struct. + + + + + The set of local variables and parameters that were hoisted and need a proxy. + + + + + EnC support: the rewriter stores debug info for each await/yield in this builder. + + + + + Generate return statements from the state machine method body. + + + + + Generates code that switches over states and jumps to the target labels listed in . + + + If this is the outermost state dispatch switching over all states of the state machine - i.e. not state dispatch generated for a try-block. + + + + + Translate a statement that declares a given set of locals. Also allocates and frees hoisted temps as + required for the translation. + + The set of locals declared in the original version of this statement + A delegate to return the translation of the body of this statement + + + + Must remain in sync with . + + + + + Must remain in sync with . + + + + + Might the given type be, or contain, managed references? This is used to determine which + fields allocated to temporaries should be cleared when the underlying variable goes out of scope, so + that they do not cause unnecessary object retention. + + + + + The try statement is the most complex part of the state machine transformation. + Since the CLR will not allow a 'goto' into the scope of a try statement, we must + generate the dispatch to the state's label stepwise. That is done by translating + the try statements from the inside to the outside. Within a try statement, we + start with an empty dispatch table (representing the mapping from state numbers + to labels). During translation of the try statement's body, the dispatch table + will be filled in with the data necessary to dispatch once we're inside the try + block. We generate that at the head of the translated try statement. Then, we + copy all of the states from that table into the table for the enclosing construct, + but associate them with a label just before the translated try block. That way + the enclosing construct will generate the code necessary to get control into the + try block for all of those states. + + + + + Set the state field and the cached state + + + + + Allocates resumable states, i.e. states that resume execution of the state machine after await expression or yield return. + + + + + The number of the next generated resumable state (i.e. state that resumes execution of the state machine after await expression or yield return). + + + + + EnC support: number of states in this state machine that match states of the previous generation state machine. + + + + + True if any of the states generated for any previous state machine has not been allocated in this version. + + + + + Represents a synthesized state machine field. + + + + + True if the initial values of locals in the rewritten method and the initial thread ID need to be preserved. (e.g. enumerable iterator methods and async-enumerable iterator methods) + + + + + Add fields to the state machine class that control the state machine. + + + + + Initialize the state machine class. + + + + + Generate implementation-specific state machine initialization for the kickoff method body. + + + + + Generate implementation-specific state machine member method implementations. + + + + + Produce Environment.CurrentManagedThreadId if available, otherwise CurrentThread.ManagedThreadId + + + + + Generate the GetEnumerator() method for iterators and GetAsyncEnumerator() for async-iterators. + + + + + Generate logic to reset the current instance (rather than creating a new instance) + + + + + Returns true if either Thread.ManagedThreadId or Environment.CurrentManagedThreadId are available + + + + + State machine interface method implementation. + + + + + Represents a state machine MoveNext method. + Handles special behavior around inheriting some attributes from the original async/iterator method. + + + + + Represents a state machine method other than a MoveNext method. + All such methods are considered debugger hidden. + + + + + Tracks synthesized fields that are needed in a submission being compiled. + + + For every other submission referenced by this submission we add a field, so that we can access members of the target submission. + A field is also needed for the host object, if provided. + + + + + A helper class for synthesizing quantities of code. + + + + + Thrown by the bound node factory when there is a failure to synthesize code. + An appropriate diagnostic is included that should be reported. Currently + the only diagnostic handled through this mechanism is a missing special/well-known + member. + + + + + A binder suitable for performing overload resolution to synthesize a call to a helper method. + + + + + A binder used only for performing overload resolution of runtime helper methods. + + + + + Create a bound node factory. Note that the use of the factory to get special or well-known members + that do not exist will result in an exception of type being thrown. + + The top-level method that will contain the code + The syntax node to which generated code should be attributed + The state of compilation of the enclosing type + A bag where any diagnostics should be output + + + The top-level method that will contain the code + The enclosing class + The syntax node to which generated code should be attributed + The state of compilation of the enclosing type + A bag where any diagnostics should be output + + + + Get the symbol for a well-known member. The use of this method to get a well-known member + that does not exist will result in an exception of type being thrown + containing an appropriate diagnostic for the caller to report. + + The desired well-known member + If true, the method may return null for a missing member without an exception + A symbol for the well-known member, or null if it is missing and == true + + + + Get the symbol for a special member. The use of this method to get a special member + that does not exist will result in an exception of type MissingPredefinedMember being thrown + containing an appropriate diagnostic for the caller to report. + + The desired special member + A symbol for the special member. + + + + An internal helper class for building a switch statement. + + + + + Produce an int switch. + + + + + Check for (and assert that there are no) duplicate case labels in the switch. + + + + + + Synthesizes an expression that evaluates to the current module's MVID. + + + + + + Synthesizes an expression that evaluates to the index of a source document in the table of debug source documents. + + + + + Helper that will use Array.Empty if available and elements have 0 length + NOTE: it is valid only if we know that the API that is being called will not + retain or use the array argument for any purpose (like locking or key in a hash table) + Typical example of valid use is Linq.Expressions factories - they do not make any + assumptions about array arguments and do not keep them or rely on their identity. + + + + + Takes an expression and returns the bound local expression "temp" + and the bound assignment expression "temp = expr". + + + + + Compiles a list of all labels that are targeted by gotos within a + node, but are not declared within the node. + + + + + newPosition represents the position we are in the final SourceText. As we consume and reuse + nodes from the old tree we will update our position in the new text accordingly. + Likewise, when we must lex tokens out of the new tree we will update as well. + + NOTE(cyrusn): We do not need an oldPosition because it is redundant given the + oldTreeCursor. The oldPosition is implicitly defined by the position of the cursor. + + + + + Affected range of a change is the range within which nodes can be affected by a change + and cannot be reused. Because of lookahead effective range of a change is larger than + the change itself. + + + + + THe cursor represents a location in the tree that we can move around to indicate where + we are in the original tree as we're incrementally parsing. When it is at a node or + token, it can either move forward to that entity's next sibling. It can also move down + to a node's first child or first token. + + Once the cursor hits the end of file, it's done. Note: the cursor will skip any other + zero length nodes in the tree. + + + + + An error/warning directive tells the compiler to indicate a syntactic error/warning + at the current location. + + Format: #error Error message string + Resulting message: from the first non-whitespace character after the directive + keyword until the end of the directive (aka EOD) at the line break or EOF. + Resulting span: [first non-whitespace char, EOD) + + Examples (pipes indicate span): + #error |goo| + #error |goo| + #error |goo | + #error |goo baz| + #error |//goo| + #error |/*goo*/| + #error |/*goo| + + The '#' token. + The 'error' or 'warning' token. + True if the error/warning should be recorded. + An ErrorDirective or WarningDirective node. + + + + These aren't acceptable in place of ASCII quotation marks in XML, + but we want to consume them (and produce an appropriate error) if + they occur in a place where a quotation mark is legal. + + + + + ACASEY: This grammar is derived from the behavior and sources of the native compiler. + Tokens start with underscores (I've cheated for _PredefinedTypeToken, which is not actually a + SyntaxKind), "*" indicates "0 or more", "?" indicates "0 or 1", and parentheses are for grouping. + + Cref = CrefType _DotToken CrefMember + | CrefType + | CrefMember + | CrefFirstType _OpenParenToken CrefParameterList? _CloseParenToken + CrefName = _IdentifierToken (_LessThanToken _IdentifierToken (_CommaToken _IdentifierToken)* _GreaterThanToken)? + CrefFirstType = ((_IdentifierToken _ColonColonToken)? CrefName) + | _PredefinedTypeToken + CrefType = CrefFirstType (_DotToken CrefName)* + CrefMember = CrefName (_OpenParenToken CrefParameterList? _CloseParenToken)? + | _ThisKeyword (_OpenBracketToken CrefParameterList _CloseBracketToken)? + | _OperatorKeyword _OperatorToken (_OpenParenToken CrefParameterList? _CloseParenToken)? + | (_ImplicitKeyword | _ExplicitKeyword) _OperatorKeyword CrefParameterType (_OpenParenToken CrefParameterList? _CloseParenToken)? + CrefParameterList = CrefParameter (_CommaToken CrefParameter)* + CrefParameter = (_RefKeyword | _OutKeyword)? CrefParameterType + CrefParameterType = CrefParameterType2 _QuestionToken? _AsteriskToken* (_OpenBracketToken _CommaToken* _CloseBracketToken)* + CrefParameterType2 = (((_IdentifierToken _ColonColonToken)? CrefParameterType3) | _PredefinedTypeToken) (_DotToken CrefParameterType3)* + CrefParameterType3 = _IdentifierToken (_LessThanToken CrefParameterType (_CommaToken CrefParameterType)* _GreaterThanToken)? + + NOTE: type parameters, not type arguments + NOTE: the first production of Cref is preferred to the other two + NOTE: pointer, array, and nullable types only work in parameters + NOTE: CrefParameterType2 and CrefParameterType3 correspond to CrefType and CrefName, respectively. + Since the only difference is that they accept non-identifier type arguments, this is accomplished + using parameters on the parsing methods (rather than whole new methods). + + + + + Parse the custom cref syntax for a named member (method, property, etc), + an indexer, an overloadable operator, or a user-defined conversion. + + + + + Parse a named member (method, property, etc), with optional type + parameters and regular parameters. + + + + + Parse an indexer member, with optional parameters. + + + + + Parse an overloadable operator, with optional parameters. + + + + + Parse a user-defined conversion, with optional parameters. + + + + + Parse a parenthesized parameter list. + + + + + Parse a bracketed parameter list. + + + + + Parse the parameter list (if any) of a cref member (name, indexer, operator, or conversion). + + + + + True if the current token could be the beginning of a cref parameter. + + + + + Parse an element of a cref parameter list. + + + "ref" and "out" work, but "params", "this", and "__arglist" don't. + + + + + Parse an identifier, optionally followed by an angle-bracketed list of type parameters. + + True to give an error when a non-identifier + type argument is seen, false to accept. No change in the shape of the tree. + + + + Parse a type. May include an alias, a predefined type, and/or a qualified name. + + + Pointer, nullable, or array types are only allowed if is false. + Leaves a dot and a name unconsumed if the name is not followed by another dot + and checkForMember is true. + + True to give an error when a non-identifier + type argument is seen, false to accept. No change in the shape of the tree. + True means that the last name should not be consumed + if it is followed by a parameter list. + + + + Parse a type. May include an alias, a predefined type, and/or a qualified name. + + + No pointer, nullable, or array types. + Leaves a dot and a name unconsumed if the name is not followed by another dot + and checkForMember is true. + + True to give an error when a non-identifier + type argument is seen, false to accept. No change in the shape of the tree. + True means that the last name should not be consumed + if it is followed by a parameter list. + + + + Once the name part of a type (including type parameter/argument lists) is parsed, + we need to consume ?, *, and rank specifiers. + + + + + Ends at appropriate quotation mark, EOF, or EndOfDocumentationComment. + + + + + Convenience method for checking the mode. + + + + + Ends at appropriate quotation mark, EOF, or EndOfDocumentationComment. + + + + + Set of well-known SyntaxTokens commonly found within XML doc comments. + + + + + Look up a well known SyntaxToken for a given XML element tag or attribute. + This is a performance optimization to avoid creating duplicate tokens for the same content. + + The text of the tag or attribute. + The leading trivia of the token. + The SyntaxToken representing the well-known tag or attribute or null if it's not well-known. + + + + Returns true if the lookahead tokens compose extern alias directive. + + + + + checks for modifiers whose feature is not available + + + + + Changes in this function around member parsing should be mirrored in . + Try keeping structure of both functions similar to simplify this task. The split was made to + reduce the stack usage during recursive parsing. + + Returns null if we can't parse anything (even partially). + + + + Changes in this function should be mirrored in . + Try keeping structure of both functions similar to simplify this task. The split was made to + reduce the stack usage during recursive parsing. + + Returns null if we can't parse anything (even partially). + + + + Parses any block or expression bodies that are present. Also parses + the trailing semicolon if one is present. + + + + + WARNING: it is possible that "list" is really the underlying builder of a SeparateSyntaxListBuilder, + so it is important that we not add anything to the list. + + + + + Parses the !! as skipped tokens following a parameter name token. If the parameter name + is followed by !!= or ! !=, then the final equals will be returned through . + + + + + Merges two successive tokens into a single token with the given . If the two tokens + have no trivia between them, then the final token will be trivially generated, properly passing on the right + leading/trailing trivia. However, if there is trivia between the tokens, then appropriate errors will be + reported that the tokens cannot merge successfully. + + + IsFabricatedToken should be updated for tokens whose SyntaxKind is . + + + + + True if current identifier token is not really some contextual keyword + + + + + + True if the given token is not really some contextual keyword. + This method is for use in executable code, as it treats partial as an identifier. + + + + + This is an adjusted version of . + When it returns true, it stops at operator keyword (). + When it returns false, it does not advance in the token stream. + + + + + Definitely not a type name. + + + + + Definitely a type name: either a predefined type (int, string, etc.) or an array + type (ending with a [] brackets), or a pointer type (ending with *s), or a function + pointer type (ending with > in valid cases, or a *, ), or calling convention + identifier, in invalid cases). + + + + + Might be a generic (qualified) type name or a method name. + + + + + Might be a generic (qualified) type name or an expression or a method name. + + + + + Might be a non-generic (qualified) type name or an expression. + + + + + A type name with alias prefix (Alias::Name). Note that Alias::Name.X would not fall under this. This + only is returned for exactly Alias::Name. + + + + + Nullable type (ending with ?). + + + + + Might be a pointer type or a multiplication. + + + + + Might be a tuple type. + + + + + Returns TupleType when a possible tuple type is found. + Note that this is not MustBeType, so that the caller can consider deconstruction syntaxes. + The caller is expected to have consumed the opening paren. + + + + If we're being called while parsing a C# top-level statements (Script or Simple Program). + At the top level in Script, we allow most statements *except* for local-decls/local-funcs. + Those will instead be parsed out as script-fields/methods. + + + + true if the current token can be the first token of a typed identifier (a type name followed by an identifier), + false if it definitely can't be, + null if we need to scan further to find out. + + + + + Used to parse the block-body for a method or accessor. For blocks that appear *inside* + method bodies, call . + + If is true, then we produce a special diagnostic if the + open brace is missing. + + + + Used to parse normal blocks that appear inside method bodies. For the top level block + of a method/accessor use . + + + + + Is the following set of tokens, interpreted as a type, the type var? + + + + + Parses any kind of local declaration statement: local variable or local function. + + + + + Parse a single variable designation (e.g. x) or a wildcard designation (e.g. _) + + + + + + Parse a local variable declaration. + + + + + + Is the current token one that could start an expression? + + + + + Is the current token one that could be in an expression? + + + + + Parse a subexpression of the enclosing operator of the given precedence. + + + + + Returns true if... + 1. The precedence is less than or equal to Assignment, and + 2. The current token is the identifier var or a predefined type, and + 3. it is followed by (, and + 4. that ( begins a valid parenthesized designation, and + 5. the token following that designation is = + + + + + Tokens that match the following are considered a possible lambda expression: + attribute-list* ('async' | 'static')* type? ('(' | identifier) ... + For better error recovery 'static =>' is also considered a possible lambda expression. + + + + + Parse expected lambda expression but assume `x ? () => y :` is a conditional + expression rather than a lambda expression with an explicit return type and + return null in that case only. + + + + + Interpret the given raw text from source as an InterpolatedStringTextToken. + + The text for the full string literal, including the quotes and contents + The kind of the interpolated string we were processing + + + + Parses the type, or pattern, right-hand operand of an is expression. + Priority is the TypeSyntax. It may return a TypeSyntax which turns out in binding to + be a constant pattern such as enum 'Days.Sunday'. We handle such cases in the binder of the is operator. + Note that the syntax `_` will be parsed as a type. + + + + + Given tk, the type of the current token, does this look like the type of a pattern? + + + + + Is the current token something that could follow a type in a pattern? + + + + + Check the next token to see if it is valid as the first token of a subpattern element. + Used to assist in error recovery for subpattern lists (e.g. determining which tokens to skip) + to ensure we make forward progress during recovery. + + + + + The lexer is for the contents of an interpolation that is followed by a colon that signals the start of the format string. + + + + + This method is essentially the same as ScanIdentifier_SlowPath, + except that it can handle XML entities. Since ScanIdentifier + is hot code and since this method does extra work, it seem + worthwhile to separate it from the common case. + + + + + + + Scans a new-line sequence (either a single new-line character or a CR-LF combo). + + A trivia node with the new-line text + + + + Scans all of the whitespace (not new-lines) into a trivia node until it runs out. + + A trivia node with the whitespace text + + + + Lexer entry point for LexMode.XmlDocComment + + + + + Lexer entry point for LexMode.XmlElementTag + + + + + Determines whether this Unicode character can start a XMLName. + + The Unicode character. + + + + Determines if this Unicode character can be part of an XML Name. + + The Unicode character. + + + + Lexer entry point for LexMode.XmlAttributeText + + + + + Lexer entry point for LexerMode.XmlCharacter. + + + + + Scan a single XML character (or entity). Assumes that leading trivia has already + been consumed. + + + + + Lexer entry point for LexerMode.XmlCrefQuote, LexerMode.XmlCrefDoubleQuote, + LexerMode.XmlNameQuote, and LexerMode.XmlNameDoubleQuote. + + + + + Scan a single cref attribute token. Assumes that leading trivia has already + been consumed. + + + Within this method, characters that are not XML meta-characters can be seamlessly + replaced with the corresponding XML entities. + + + + + Given a character, advance the input if either the character or the + corresponding XML entity appears next in the text window. + + + + + + + Convenience property for determining whether we are currently lexing the + value of a cref or name attribute. + + + + + Convenience property for determining whether we are currently lexing the + value of a name attribute. + + + + + Diagnostics that occur within cref attributes need to be + wrapped with ErrorCode.WRN_ErrorOverride. + + + + + Diagnostics that occur within cref attributes need to be + wrapped with ErrorCode.WRN_ErrorOverride. + + + + + Lexer entry point for LexMode.XmlCDataSectionText + + + + + Lexer entry point for LexMode.XmlCommentText + + + + + Lexer entry point for LexMode.XmlProcessingInstructionText + + + + + Collects XML doc comment exterior trivia, and therefore is a no op unless we are in the Start or Exterior of an XML doc comment. + + List in which to collect the trivia + + + + Collects whitespace and new line trivia for XML doc comments. Does not see XML doc comment exterior trivia, and is a no op unless we are in the interior. + + List in which to collect the trivia + + + + Range of the format colon in the interpolation. Empty if there is no colon. + + + + + Range of the close brace. Empty if there was no close brace (an error condition). + + + + The number of quotes that were consumed + + + + Returns true if starts with . + + + + + Turn a (parsed) interpolated string nonterminal into an interpolated string token. + + + + + + Normal interpolated string that just starts with $" + + + + + Verbatim interpolated string that starts with $@" or @$" + + + + + Single-line raw interpolated string that starts with at least one $, and at least three "s. + + + + + Multi-line raw interpolated string that starts with at least one $, and at least three "s. + + + + + Non-copyable ref-struct so that this will only live on the stack for the lifetime of the lexer/parser + recursing to process interpolated strings. + + + + + Error encountered while scanning. If we run into an error, then we'll attempt to stop parsing at the + next potential ending location to prevent compounding the issue. + + + + + Number of '$' characters this interpolated string started with. We'll need to see that many '{' in a + row to start an interpolation. Any less and we'll treat that as just text. Note if this count is '1' + then this is a normal (non-raw) interpolation and `{{` is treated as an escape. + + Number of '"' characters this interpolated string started with. + if we successfully processed the open quote range and can proceed to the + rest of the literal. if we were not successful and should stop + processing. + + + + Returns if the quote was an end delimiter and lexing of the contents of the + interpolated string literal should stop. If it was an end delimiter it will not be consumed. If it is + content and should not terminate the string then it will be consumed by this method. + + + + + Scan past the hole inside an interpolated string literal, leaving the current character on the '}' (if any) + + + + + The lexer can run away consuming the rest of the input when delimiters are mismatched. This is a test + for when we are attempting to recover from that situation. Note that just running into new lines will + not make us think we're in runaway lexing. + + + + + Keeps a sliding buffer over the SourceText of a file for the lexer. Also + provides the lexer with the ability to keep track of a current "lexeme" + by leaving a marker and advancing ahead the offset. The lexer can then + decide to "keep" the lexeme by erasing the marker, or abandon the current + lexeme by moving the offset back to the marker. + + + + + In many cases, e.g. PeekChar, we need the ability to indicate that there are + no characters left and we have reached the end of the stream, or some other + invalid or not present character was asked for. Due to perf concerns, things + like nullable or out variables are not viable. Instead we need to choose a + char value which can never be legal. + + In .NET, all characters are represented in 16 bits using the UTF-16 encoding. + Fortunately for us, there are a variety of different bit patterns which + are *not* legal UTF-16 characters. 0xffff (char.MaxValue) is one of these + characters -- a legal Unicode code point, but not a legal UTF-16 bit pattern. + + + + + The current absolute position in the text file. + + + + + The current offset inside the window (relative to the window start). + + + + + The buffer backing the current window. + + + + + Returns the start of the current lexeme relative to the window start. + + + + + Number of characters in the character window. + + + + + The absolute position of the start of the current lexeme in the given + SourceText. + + + + + The number of characters in the current lexeme. + + + + + Start parsing a new lexeme. + + + + + After reading , a consumer can determine + if the InvalidCharacter was in the user's source or a sentinel. + + Comments and string literals are allowed to contain any Unicode character. + + + + + + Advance the current position by one. No guarantee that this + position is valid. + + + + + Advance the current position by n. No guarantee that this position + is valid. + + + + + Moves past the newline that the text window is currently pointing at. The text window must be pointing at a + newline. If the newline is \r\n then that entire sequence will be skipped. Otherwise, the text + window will only advance past a single character. + + + + + Gets the length of the newline the text window must be pointing at here. For \r\n this is 2, + for everything else, this is 1. + + + + + Grab the next character and advance the position. + + + The next character, if there were no characters + remaining. + + + + + Gets the next character if there are any characters in the + SourceText. May advance the window if we are at the end. + + + The next character if any are available. InvalidCharacter otherwise. + + + + + Gets the character at the given offset to the current position if + the position is valid within the SourceText. + + + The next character if any are available. InvalidCharacter otherwise. + + + + + Given that the next character is an ampersand ('&'), attempt to interpret the + following characters as an XML entity. On success, populate the out parameters + with the low and high UTF-16 surrogates for the character represented by the + entity. + + e.g. '<' for &lt;. + e.g. '\uDC00' for &#x10000; (ch == '\uD800'). + True if a valid XML entity was consumed. + + NOTE: Always advances, even on failure. + + + + + If the next characters in the window match the given string, + then advance past those characters. Otherwise, do nothing. + + + + + Because syntax nodes need to be constructed with context information - to allow us to + determine whether or not they can be reused during incremental parsing - the syntax + factory needs a view of some internal parser state. + + + Read-only outside SyntaxParser (not enforced for perf reasons). + Reference type so that the factory stays up-to-date. + + + + + If a method goes from async to non-async, or vice versa, then every occurrence of "await" + within the method (but not within a lambda) needs to be reinterpreted, to determine whether + it is a keyword or an identifier. + + + + + If the end of a query expression statement is commented out, then the following statement may + appear to be part of the query. When this occurs, identifiers within the following statement + may need to be reinterpreted as query keywords. + + + + + Returns and consumes the current token if it has the requested . + Otherwise, returns . + + + + + Converts skippedSyntax node into tokens and adds these as trivia on the target token. + Also adds the first error (in depth-first preorder) found in the skipped syntax tree to the target token. + + + + + This function searches for the given location node within the subtree rooted at root node. + If it finds it, the function computes the offset span of that child node within the root and returns true, + otherwise it returns false. + + Root node + Node to search in the subtree rooted at root node + Offset of the location node within the subtree rooted at child + + + + + NOTE: we are specifically diverging from dev11 to improve the user experience. + Since treating the "async" keyword as an identifier in older language + versions can never result in a correct program, we instead accept it as a + keyword regardless of the language version and produce an error if the version + is insufficient. + + + + + Whenever parsing in a while (true) loop and a bug could prevent the loop from making progress, + this method can prevent the parsing from hanging. + Use as: + int tokenProgress = -1; + while (IsMakingProgress(ref tokenProgress)) + It should be used as a guardrail, not as a crutch, so it asserts if no progress was made. + + + + + Should only be called during construction. + + + This should probably be an extra constructor parameter, but we don't need more constructor overloads. + + + + + Gets the syntax node represented the structure of this trivia, if any. The HasStructure property can be used to + determine if this trivia has structure. + + + A CSharpSyntaxNode derived from StructuredTriviaSyntax, with the structured view of this trivia node. + If this trivia node does not have structure, returns null. + + + Some types of trivia have structure that can be accessed as additional syntax nodes. + These forms of trivia include: + directives, where the structure describes the structure of the directive. + documentation comments, where the structure describes the XML structure of the comment. + skipped tokens, where the structure describes the tokens that were skipped by the parser. + + + + Class which represents the syntax node for identifier name. + + + SyntaxToken representing the keyword for the kind of the identifier name. + + + Class which represents the syntax node for name colon syntax. + + + IdentifierNameSyntax representing the identifier name. + + + SyntaxToken representing colon. + + + + Creates a token whose and are the same. + + + + + Returns the string representation of this token, not including its leading and trailing trivia. + + The string representation of this token, not including its leading and trailing trivia. + The length of the returned string is always the same as Span.Length + + + Provides the base class from which the classes that represent type syntax nodes are derived. This is an abstract class. + + + Provides the base class from which the classes that represent name syntax nodes are derived. This is an abstract class. + + + Provides the base class from which the classes that represent simple name syntax nodes are derived. This is an abstract class. + + + SyntaxToken representing the identifier of the simple name. + + + Class which represents the syntax node for qualified name. + + + NameSyntax node representing the name on the left side of the dot token of the qualified name. + + + SyntaxToken representing the dot. + + + SimpleNameSyntax node representing the name on the right side of the dot token of the qualified name. + + + Class which represents the syntax node for generic name. + + + SyntaxToken representing the name of the identifier of the generic name. + + + TypeArgumentListSyntax node representing the list of type arguments of the generic name. + + + Class which represents the syntax node for type argument list. + + + SyntaxToken representing less than. + + + SeparatedSyntaxList of TypeSyntax node representing the type arguments. + + + SyntaxToken representing greater than. + + + Class which represents the syntax node for alias qualified name. + + + IdentifierNameSyntax node representing the name of the alias + + + SyntaxToken representing colon colon. + + + SimpleNameSyntax node representing the name that is being alias qualified. + + + Class which represents the syntax node for predefined types. + + + SyntaxToken which represents the keyword corresponding to the predefined type. + + + Class which represents the syntax node for the array type. + + + TypeSyntax node representing the type of the element of the array. + + + SyntaxList of ArrayRankSpecifierSyntax nodes representing the list of rank specifiers for the array. + + + Class which represents the syntax node for pointer type. + + + TypeSyntax node that represents the element type of the pointer. + + + SyntaxToken representing the asterisk. + + + SyntaxToken representing the delegate keyword. + + + SyntaxToken representing the asterisk. + + + Node representing the optional calling convention. + + + List of the parameter types and return type of the function pointer. + + + Function pointer parameter list syntax. + + + SyntaxToken representing the less than token. + + + SeparatedSyntaxList of ParameterSyntaxes representing the list of parameters and return type. + + + SyntaxToken representing the greater than token. + + + Function pointer calling convention syntax. + + + SyntaxToken representing whether the calling convention is managed or unmanaged. + + + Optional list of identifiers that will contribute to an unmanaged calling convention. + + + Function pointer calling convention syntax. + + + SyntaxToken representing open bracket. + + + SeparatedSyntaxList of calling convention identifiers. + + + SyntaxToken representing close bracket. + + + Individual function pointer unmanaged calling convention. + + + SyntaxToken representing the calling convention identifier. + + + Class which represents the syntax node for a nullable type. + + + TypeSyntax node representing the type of the element. + + + SyntaxToken representing the question mark. + + + Class which represents the syntax node for tuple type. + + + SyntaxToken representing the open parenthesis. + + + SyntaxToken representing the close parenthesis. + + + Tuple type element. + + + Gets the type of the tuple element. + + + Gets the name of the tuple element. + + + Class which represents a placeholder in the type argument list of an unbound generic type. + + + SyntaxToken representing the omitted type argument. + + + The ref modifier of a method's return value or a local. + + + Gets the optional "readonly" keyword. + + + The 'scoped' modifier of a local. + + + Provides the base class from which the classes that represent expression syntax nodes are derived. This is an abstract class. + + + Class which represents the syntax node for parenthesized expression. + + + SyntaxToken representing the open parenthesis. + + + ExpressionSyntax node representing the expression enclosed within the parenthesis. + + + SyntaxToken representing the close parenthesis. + + + Class which represents the syntax node for tuple expression. + + + SyntaxToken representing the open parenthesis. + + + SeparatedSyntaxList of ArgumentSyntax representing the list of arguments. + + + SyntaxToken representing the close parenthesis. + + + Class which represents the syntax node for prefix unary expression. + + + SyntaxToken representing the kind of the operator of the prefix unary expression. + + + ExpressionSyntax representing the operand of the prefix unary expression. + + + Class which represents the syntax node for an "await" expression. + + + SyntaxToken representing the kind "await" keyword. + + + ExpressionSyntax representing the operand of the "await" operator. + + + Class which represents the syntax node for postfix unary expression. + + + ExpressionSyntax representing the operand of the postfix unary expression. + + + SyntaxToken representing the kind of the operator of the postfix unary expression. + + + Class which represents the syntax node for member access expression. + + + ExpressionSyntax node representing the object that the member belongs to. + + + SyntaxToken representing the kind of the operator in the member access expression. + + + SimpleNameSyntax node representing the member being accessed. + + + Class which represents the syntax node for conditional access expression. + + + ExpressionSyntax node representing the object conditionally accessed. + + + SyntaxToken representing the question mark. + + + ExpressionSyntax node representing the access expression to be executed when the object is not null. + + + Class which represents the syntax node for member binding expression. + + + SyntaxToken representing dot. + + + SimpleNameSyntax node representing the member being bound to. + + + Class which represents the syntax node for element binding expression. + + + BracketedArgumentListSyntax node representing the list of arguments of the element binding expression. + + + Class which represents the syntax node for a range expression. + + + ExpressionSyntax node representing the expression on the left of the range operator. + + + SyntaxToken representing the operator of the range expression. + + + ExpressionSyntax node representing the expression on the right of the range operator. + + + Class which represents the syntax node for implicit element access expression. + + + BracketedArgumentListSyntax node representing the list of arguments of the implicit element access expression. + + + Class which represents an expression that has a binary operator. + + + ExpressionSyntax node representing the expression on the left of the binary operator. + + + SyntaxToken representing the operator of the binary expression. + + + ExpressionSyntax node representing the expression on the right of the binary operator. + + + Class which represents an expression that has an assignment operator. + + + ExpressionSyntax node representing the expression on the left of the assignment operator. + + + SyntaxToken representing the operator of the assignment expression. + + + ExpressionSyntax node representing the expression on the right of the assignment operator. + + + Class which represents the syntax node for conditional expression. + + + ExpressionSyntax node representing the condition of the conditional expression. + + + SyntaxToken representing the question mark. + + + ExpressionSyntax node representing the expression to be executed when the condition is true. + + + SyntaxToken representing the colon. + + + ExpressionSyntax node representing the expression to be executed when the condition is false. + + + Provides the base class from which the classes that represent instance expression syntax nodes are derived. This is an abstract class. + + + Class which represents the syntax node for a this expression. + + + SyntaxToken representing the this keyword. + + + Class which represents the syntax node for a base expression. + + + SyntaxToken representing the base keyword. + + + Class which represents the syntax node for a literal expression. + + + SyntaxToken representing the keyword corresponding to the kind of the literal expression. + + + Class which represents the syntax node for MakeRef expression. + + + SyntaxToken representing the MakeRefKeyword. + + + SyntaxToken representing open parenthesis. + + + Argument of the primary function. + + + SyntaxToken representing close parenthesis. + + + Class which represents the syntax node for RefType expression. + + + SyntaxToken representing the RefTypeKeyword. + + + SyntaxToken representing open parenthesis. + + + Argument of the primary function. + + + SyntaxToken representing close parenthesis. + + + Class which represents the syntax node for RefValue expression. + + + SyntaxToken representing the RefValueKeyword. + + + SyntaxToken representing open parenthesis. + + + Typed reference expression. + + + Comma separating the arguments. + + + The type of the value. + + + SyntaxToken representing close parenthesis. + + + Class which represents the syntax node for Checked or Unchecked expression. + + + SyntaxToken representing the checked or unchecked keyword. + + + SyntaxToken representing open parenthesis. + + + Argument of the primary function. + + + SyntaxToken representing close parenthesis. + + + Class which represents the syntax node for Default expression. + + + SyntaxToken representing the DefaultKeyword. + + + SyntaxToken representing open parenthesis. + + + Argument of the primary function. + + + SyntaxToken representing close parenthesis. + + + Class which represents the syntax node for TypeOf expression. + + + SyntaxToken representing the TypeOfKeyword. + + + SyntaxToken representing open parenthesis. + + + The expression to return type of. + + + SyntaxToken representing close parenthesis. + + + Class which represents the syntax node for SizeOf expression. + + + SyntaxToken representing the SizeOfKeyword. + + + SyntaxToken representing open parenthesis. + + + Argument of the primary function. + + + SyntaxToken representing close parenthesis. + + + Class which represents the syntax node for invocation expression. + + + ExpressionSyntax node representing the expression part of the invocation. + + + ArgumentListSyntax node representing the list of arguments of the invocation expression. + + + Class which represents the syntax node for element access expression. + + + ExpressionSyntax node representing the expression which is accessing the element. + + + BracketedArgumentListSyntax node representing the list of arguments of the element access expression. + + + Provides the base class from which the classes that represent argument list syntax nodes are derived. This is an abstract class. + + + SeparatedSyntaxList of ArgumentSyntax nodes representing the list of arguments. + + + Class which represents the syntax node for the list of arguments. + + + SyntaxToken representing open parenthesis. + + + SeparatedSyntaxList of ArgumentSyntax representing the list of arguments. + + + SyntaxToken representing close parenthesis. + + + Class which represents the syntax node for bracketed argument list. + + + SyntaxToken representing open bracket. + + + SeparatedSyntaxList of ArgumentSyntax representing the list of arguments. + + + SyntaxToken representing close bracket. + + + Class which represents the syntax node for argument. + + + NameColonSyntax node representing the optional name arguments. + + + SyntaxToken representing the optional ref or out keyword. + + + ExpressionSyntax node representing the argument. + + + Class which represents the syntax node for the variable declaration in an out var declaration or a deconstruction declaration. + + + Declaration representing the variable declared in an out parameter or deconstruction. + + + Class which represents the syntax node for cast expression. + + + SyntaxToken representing the open parenthesis. + + + TypeSyntax node representing the type to which the expression is being cast. + + + SyntaxToken representing the close parenthesis. + + + ExpressionSyntax node representing the expression that is being casted. + + + Provides the base class from which the classes that represent anonymous function expressions are derived. + + + + BlockSyntax node representing the body of the anonymous function. + Only one of Block or ExpressionBody will be non-null. + + + + + ExpressionSyntax node representing the body of the anonymous function. + Only one of Block or ExpressionBody will be non-null. + + + + Class which represents the syntax node for anonymous method expression. + + + SyntaxToken representing the delegate keyword. + + + List of parameters of the anonymous method expression, or null if there no parameters are specified. + + + + BlockSyntax node representing the body of the anonymous function. + This will never be null. + + + + + Inherited from AnonymousFunctionExpressionSyntax, but not used for + AnonymousMethodExpressionSyntax. This will always be null. + + + + Provides the base class from which the classes that represent lambda expressions are derived. + + + SyntaxToken representing equals greater than. + + + Class which represents the syntax node for a simple lambda expression. + + + ParameterSyntax node representing the parameter of the lambda expression. + + + SyntaxToken representing equals greater than. + + + + BlockSyntax node representing the body of the lambda. + Only one of Block or ExpressionBody will be non-null. + + + + + ExpressionSyntax node representing the body of the lambda. + Only one of Block or ExpressionBody will be non-null. + + + + Class which represents the syntax node for parenthesized lambda expression. + + + ParameterListSyntax node representing the list of parameters for the lambda expression. + + + SyntaxToken representing equals greater than. + + + + BlockSyntax node representing the body of the lambda. + Only one of Block or ExpressionBody will be non-null. + + + + + ExpressionSyntax node representing the body of the lambda. + Only one of Block or ExpressionBody will be non-null. + + + + Class which represents the syntax node for initializer expression. + + + SyntaxToken representing the open brace. + + + SeparatedSyntaxList of ExpressionSyntax representing the list of expressions in the initializer expression. + + + SyntaxToken representing the close brace. + + + SyntaxToken representing the new keyword. + + + ArgumentListSyntax representing the list of arguments passed as part of the object creation expression. + + + InitializerExpressionSyntax representing the initializer expression for the object being created. + + + Class which represents the syntax node for implicit object creation expression. + + + SyntaxToken representing the new keyword. + + + ArgumentListSyntax representing the list of arguments passed as part of the object creation expression. + + + InitializerExpressionSyntax representing the initializer expression for the object being created. + + + Class which represents the syntax node for object creation expression. + + + SyntaxToken representing the new keyword. + + + TypeSyntax representing the type of the object being created. + + + ArgumentListSyntax representing the list of arguments passed as part of the object creation expression. + + + InitializerExpressionSyntax representing the initializer expression for the object being created. + + + InitializerExpressionSyntax representing the initializer expression for the with expression. + + + NameEqualsSyntax representing the optional name of the member being initialized. + + + ExpressionSyntax representing the value the member is initialized with. + + + Class which represents the syntax node for anonymous object creation expression. + + + SyntaxToken representing the new keyword. + + + SyntaxToken representing the open brace. + + + SeparatedSyntaxList of AnonymousObjectMemberDeclaratorSyntax representing the list of object member initializers. + + + SyntaxToken representing the close brace. + + + Class which represents the syntax node for array creation expression. + + + SyntaxToken representing the new keyword. + + + ArrayTypeSyntax node representing the type of the array. + + + InitializerExpressionSyntax node representing the initializer of the array creation expression. + + + Class which represents the syntax node for implicit array creation expression. + + + SyntaxToken representing the new keyword. + + + SyntaxToken representing the open bracket. + + + SyntaxList of SyntaxToken representing the commas in the implicit array creation expression. + + + SyntaxToken representing the close bracket. + + + InitializerExpressionSyntax representing the initializer expression of the implicit array creation expression. + + + Class which represents the syntax node for stackalloc array creation expression. + + + SyntaxToken representing the stackalloc keyword. + + + TypeSyntax node representing the type of the stackalloc array. + + + InitializerExpressionSyntax node representing the initializer of the stackalloc array creation expression. + + + Class which represents the syntax node for implicit stackalloc array creation expression. + + + SyntaxToken representing the stackalloc keyword. + + + SyntaxToken representing the open bracket. + + + SyntaxToken representing the close bracket. + + + InitializerExpressionSyntax representing the initializer expression of the implicit stackalloc array creation expression. + + + Gets the identifier. + + + Gets the identifier. + + + Gets the identifier. + + + Gets the identifier. + + + Gets the identifier. + + + Class which represents a placeholder in an array size list. + + + SyntaxToken representing the omitted array size expression. + + + The first part of an interpolated string, $" or $@" or $""" + + + List of parts of the interpolated string, each one is either a literal part or an interpolation. + + + The closing quote of the interpolated string. + + + Class which represents a simple pattern-matching expression using the "is" keyword. + + + ExpressionSyntax node representing the expression on the left of the "is" operator. + + + PatternSyntax node representing the pattern on the right of the "is" operator. + + + ExpressionSyntax node representing the constant expression. + + + SyntaxToken representing the operator of the relational pattern. + + + The type for the type pattern. + + + The text contents of a part of the interpolated string. + + + This could be a single { or multiple in a row (in the case of an interpolation in a raw interpolated string). + + + + This could be a single } or multiple in a row (in the case of an interpolation in a raw interpolated string). + + + + The text contents of the format specifier for an interpolation. + + + Represents the base class for all statements syntax classes. + + + Gets the identifier. + + + Gets the optional semicolon token. + + + Gets the modifier list. + + + Gets the identifier. + + + Represents a labeled statement syntax. + + + Gets the identifier. + + + Gets a SyntaxToken that represents the colon following the statement's label. + + + + Represents a goto statement syntax + + + + + Gets a SyntaxToken that represents the goto keyword. + + + + + Gets a SyntaxToken that represents the case or default keywords if any exists. + + + + + Gets a constant expression for a goto case statement. + + + + + Gets a SyntaxToken that represents the semi-colon at the end of the statement. + + + + Gets the identifier. + + + + The variable(s) of the loop. In correct code this is a tuple + literal, declaration expression with a tuple designator, or + a discard syntax in the form of a simple identifier. In broken + code it could be something else. + + + + + Represents an if statement syntax. + + + + + Gets a SyntaxToken that represents the if keyword. + + + + + Gets a SyntaxToken that represents the open parenthesis before the if statement's condition expression. + + + + + Gets an ExpressionSyntax that represents the condition of the if statement. + + + + + Gets a SyntaxToken that represents the close parenthesis after the if statement's condition expression. + + + + + Gets a StatementSyntax the represents the statement to be executed when the condition is true. + + + + + Gets an ElseClauseSyntax that represents the statement to be executed when the condition is false if such statement exists. + + + + Represents an else statement syntax. + + + + Gets a syntax token + + + + Represents a switch statement syntax. + + + + Gets a SyntaxToken that represents the switch keyword. + + + + + Gets a SyntaxToken that represents the open parenthesis preceding the switch governing expression. + + + + + Gets an ExpressionSyntax representing the expression of the switch statement. + + + + + Gets a SyntaxToken that represents the close parenthesis following the switch governing expression. + + + + + Gets a SyntaxToken that represents the open braces preceding the switch sections. + + + + + Gets a SyntaxList of SwitchSectionSyntax's that represents the switch sections of the switch statement. + + + + + Gets a SyntaxToken that represents the open braces following the switch sections. + + + + Represents a switch section syntax of a switch statement. + + + + Gets a SyntaxList of SwitchLabelSyntax's the represents the possible labels that control can transfer to within the section. + + + + + Gets a SyntaxList of StatementSyntax's the represents the statements to be executed when control transfer to a label the belongs to the section. + + + + Represents a switch label within a switch statement. + + + + Gets a SyntaxToken that represents a case or default keyword that belongs to a switch label. + + + + + Gets a SyntaxToken that represents the colon that terminates the switch label. + + + + Represents a case label within a switch statement. + + + Gets the case keyword token. + + + + Gets a PatternSyntax that represents the pattern that gets matched for the case label. + + + + Represents a case label within a switch statement. + + + Gets the case keyword token. + + + + Gets an ExpressionSyntax that represents the constant expression that gets matched for the case label. + + + + Represents a default label within a switch statement. + + + Gets the default keyword token. + + + Gets the attribute declaration list. + + + + Represents an ExternAlias directive syntax, e.g. "extern alias MyAlias;" with specifying "/r:MyAlias=SomeAssembly.dll " on the compiler command line. + + + + SyntaxToken representing the extern keyword. + + + SyntaxToken representing the alias keyword. + + + Gets the identifier. + + + SyntaxToken representing the semicolon token. + + + Member declaration syntax. + + + Gets the attribute declaration list. + + + Gets the modifier list. + + + Gets the optional semicolon token. + + + Class representing one or more attributes applied to a language construct. + + + Gets the open bracket token. + + + Gets the optional construct targeted by the attribute. + + + Gets the attribute declaration list. + + + Gets the close bracket token. + + + Class representing what language construct an attribute targets. + + + Gets the identifier. + + + Gets the colon token. + + + Attribute syntax. + + + Gets the name. + + + Attribute argument list syntax. + + + Gets the open paren token. + + + Gets the arguments syntax list. + + + Gets the close paren token. + + + Attribute argument syntax. + + + Gets the expression. + + + Class representing an identifier name followed by an equals token. + + + Gets the identifier name. + + + Type parameter list syntax. + + + Gets the < token. + + + Gets the parameter list. + + + Gets the > token. + + + Type parameter syntax. + + + Gets the attribute declaration list. + + + Gets the identifier. + + + Base class for type declaration syntax. + + + Gets the identifier. + + + Gets the base type list. + + + Gets the open brace token. + + + Gets the close brace token. + + + Gets the optional semicolon token. + + + Base class for type declaration syntax (class, struct, interface, record). + + + Gets the type keyword token ("class", "struct", "interface", "record"). + + + Gets the type constraint list. + + + Gets the member declarations. + + + Class type declaration syntax. + + + Gets the class keyword token. + + + Struct type declaration syntax. + + + Gets the struct keyword token. + + + Interface type declaration syntax. + + + Gets the interface keyword token. + + + Enum type declaration syntax. + + + Gets the enum keyword token. + + + Gets the members declaration list. + + + Gets the optional semicolon token. + + + Delegate declaration syntax. + + + Gets the "delegate" keyword. + + + Gets the return type. + + + Gets the identifier. + + + Gets the parameter list. + + + Gets the constraint clause list. + + + Gets the semicolon token. + + + Gets the identifier. + + + Base list syntax. + + + Gets the colon token. + + + Gets the base type references. + + + Provides the base class from which the classes that represent base type syntax nodes are derived. This is an abstract class. + + + Type parameter constraint clause. + + + Gets the identifier. + + + Gets the colon token. + + + Gets the constraints list. + + + Base type for type parameter constraint syntax. + + + Constructor constraint syntax. + + + Gets the "new" keyword. + + + Gets the open paren keyword. + + + Gets the close paren keyword. + + + Class or struct constraint syntax. + + + Gets the constraint keyword ("class" or "struct"). + + + SyntaxToken representing the question mark. + + + Type constraint syntax. + + + Gets the type syntax. + + + Default constraint syntax. + + + Gets the "default" keyword. + + + Base type for method declaration syntax. + + + Gets the parameter list. + + + Gets the optional semicolon token. + + + Method declaration syntax. + + + Gets the return type syntax. + + + Gets the identifier. + + + Gets the constraint clause list. + + + Gets the optional semicolon token. + + + Operator declaration syntax. + + + Gets the return type. + + + Gets the "operator" keyword. + + + Gets the "checked" keyword. + + + Gets the operator token. + + + Gets the optional semicolon token. + + + Conversion operator declaration syntax. + + + Gets the "implicit" or "explicit" token. + + + Gets the "operator" token. + + + Gets the "checked" keyword. + + + Gets the type. + + + Gets the optional semicolon token. + + + Constructor declaration syntax. + + + Gets the identifier. + + + Gets the optional semicolon token. + + + Constructor initializer syntax. + + + Gets the colon token. + + + Gets the "this" or "base" keyword. + + + Destructor declaration syntax. + + + Gets the tilde token. + + + Gets the identifier. + + + Gets the optional semicolon token. + + + Base type for property declaration syntax. + + + Gets the type syntax. + + + Gets the optional explicit interface specifier. + + + Gets the identifier. + + + The syntax for the expression body of an expression-bodied member. + + + Gets the identifier. + + + Gets the parameter list. + + + Gets the attribute declaration list. + + + Gets the modifier list. + + + Gets the keyword token, or identifier if an erroneous accessor declaration. + + + Gets the optional body block which may be empty, but it is null if there are no braces. + + + Gets the optional expression body. + + + Gets the optional semicolon token. + + + Base type for parameter list syntax. + + + Gets the parameter list. + + + Parameter list syntax. + + + Gets the open paren token. + + + Gets the close paren token. + + + Parameter list syntax with surrounding brackets. + + + Gets the open bracket token. + + + Gets the close bracket token. + + + Base parameter syntax. + + + Gets the attribute declaration list. + + + Gets the modifier list. + + + Parameter syntax. + + + Gets the attribute declaration list. + + + Gets the modifier list. + + + Gets the identifier. + + + Parameter syntax. + + + Gets the attribute declaration list. + + + Gets the modifier list. + + + + A symbol referenced by a cref attribute (e.g. in a <see> or <seealso> documentation comment tag). + For example, the M in <see cref="M" />. + + + + + A symbol reference that definitely refers to a type. + For example, "int", "A::B", "A.B", "A<T>", but not "M()" (has parameter list) or "this" (indexer). + NOTE: TypeCrefSyntax, QualifiedCrefSyntax, and MemberCrefSyntax overlap. The syntax in a TypeCrefSyntax + will always be bound as type, so it's safer to use QualifiedCrefSyntax or MemberCrefSyntax if the symbol + might be a non-type member. + + + + + A symbol reference to a type or non-type member that is qualified by an enclosing type or namespace. + For example, cref="System.String.ToString()". + NOTE: TypeCrefSyntax, QualifiedCrefSyntax, and MemberCrefSyntax overlap. The syntax in a TypeCrefSyntax + will always be bound as type, so it's safer to use QualifiedCrefSyntax or MemberCrefSyntax if the symbol + might be a non-type member. + + + + + The unqualified part of a CrefSyntax. + For example, "ToString()" in "object.ToString()". + NOTE: TypeCrefSyntax, QualifiedCrefSyntax, and MemberCrefSyntax overlap. The syntax in a TypeCrefSyntax + will always be bound as type, so it's safer to use QualifiedCrefSyntax or MemberCrefSyntax if the symbol + might be a non-type member. + + + + + A MemberCrefSyntax specified by a name (an identifier, predefined type keyword, or an alias-qualified name, + with an optional type parameter list) and an optional parameter list. + For example, "M", "M<T>" or "M(int)". + Also, "A::B()" or "string()". + + + + + A MemberCrefSyntax specified by a this keyword and an optional parameter list. + For example, "this" or "this[int]". + + + + + A MemberCrefSyntax specified by an operator keyword, an operator symbol and an optional parameter list. + For example, "operator +" or "operator -[int]". + NOTE: the operator must be overloadable. + + + + Gets the operator token. + + + + A MemberCrefSyntax specified by an implicit or explicit keyword, an operator keyword, a destination type, and an optional parameter list. + For example, "implicit operator int" or "explicit operator MyType(int)". + + + + + A list of cref parameters with surrounding punctuation. + Unlike regular parameters, cref parameters do not have names. + + + + Gets the parameter list. + + + + A parenthesized list of cref parameters. + + + + Gets the open paren token. + + + Gets the close paren token. + + + + A bracketed list of cref parameters. + + + + Gets the open bracket token. + + + Gets the close bracket token. + + + + An element of a BaseCrefParameterListSyntax. + Unlike a regular parameter, a cref parameter has only an optional ref or out keyword and a type - + there is no name and there are no attributes or other modifiers. + + + + Class which represents the syntax node for alias qualified name. + + This node is associated with the following syntax kinds: + + + + + + + IdentifierNameSyntax node representing the name of the alias + + + SyntaxToken representing colon colon. + + + SimpleNameSyntax node representing the name that is being alias qualified. + + + Provides the base class from which the classes that represent anonymous function expressions are derived. + + + + Either the if it is not null or the + otherwise. + + + + + If the given is default, remove all async keywords, if any. + Otherwise, replace the existing (the first one) or add a new one. + + + + + BlockSyntax node representing the body of the anonymous function. + Only one of Block or ExpressionBody will be non-null. + + + + + ExpressionSyntax node representing the body of the anonymous function. + Only one of Block or ExpressionBody will be non-null. + + + + Class which represents the syntax node for anonymous method expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the delegate keyword. + + + List of parameters of the anonymous method expression, or null if there no parameters are specified. + + + + BlockSyntax node representing the body of the anonymous function. + This will never be null. + + + + + Inherited from AnonymousFunctionExpressionSyntax, but not used for + AnonymousMethodExpressionSyntax. This will always be null. + + + + Class which represents the syntax node for argument. + + This node is associated with the following syntax kinds: + + + + + + + + Pre C# 7.2 back-compat overload, which simply calls the replacement property . + + + + + Pre C# 7.2 back-compat overload, which simply calls the replacement method . + + + + NameColonSyntax node representing the optional name arguments. + + + SyntaxToken representing the optional ref or out keyword. + + + ExpressionSyntax node representing the argument. + + + + This node is associated with the following syntax kinds: + + + + + + + Attribute syntax. + + This node is associated with the following syntax kinds: + + + + + + + + Return the name used in syntax for the attribute. This is typically the class + name without the "Attribute" suffix. (For certain diagnostics, the native + compiler uses the attribute name from syntax rather than the class name.) + + + + Gets the name. + + + Class representing what language construct an attribute targets. + + This node is associated with the following syntax kinds: + + + + + + + Gets the identifier. + + + Gets the colon token. + + + Base type for method declaration syntax. + + + Gets the parameter list. + + + Gets the optional semicolon token. + + + Base type for property declaration syntax. + + + Gets the type syntax. + + + Gets the optional explicit interface specifier. + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + Class or struct constraint syntax. + + This node is associated with the following syntax kinds: + + + + + + + + Gets the constraint keyword ("class" or "struct"). + + + SyntaxToken representing the question mark. + + + + This node is associated with the following syntax kinds: + + + + + + + + Returns #r directives specified in the compilation. + + + + + Returns #load directives specified in the compilation. + + + + Gets the attribute declaration list. + + + Constructor declaration syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the identifier. + + + Gets the optional semicolon token. + + + + This node is associated with the following syntax kinds: + + + + + + + Conversion operator declaration syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the "implicit" or "explicit" token. + + + Gets the "operator" token. + + + Gets the "checked" keyword. + + + Gets the type. + + + Gets the optional semicolon token. + + + + A MemberCrefSyntax specified by an implicit or explicit keyword, an operator keyword, a destination type, and an optional parameter list. + For example, "implicit operator int" or "explicit operator MyType(int)". + + + This node is associated with the following syntax kinds: + + + + + + + + An element of a BaseCrefParameterListSyntax. + Unlike a regular parameter, a cref parameter has only an optional ref or out keyword and a type - + there is no name and there are no attributes or other modifiers. + + + This node is associated with the following syntax kinds: + + + + + + + + Pre C# 7.2 back-compat overload, which simply calls the replacement property . + + + + + Pre C# 7.2 back-compat overload, which simply calls the replacement method . + + + + + Adds C# specific parts to the line directive map. + + + + + Describes how to report a warning diagnostic. + + + + + Report a diagnostic by default. + Either there is no corresponding #pragma, or the action is "restore". + + + + + Diagnostic is enabled. + NOTE: this may be removed as part of https://github.com/dotnet/roslyn/issues/36550 + + + + + Diagnostic is disabled. + + + + + This node is associated with the following syntax kinds: + + + + + + + Gets the modifier list. + + + Delegate declaration syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the "delegate" keyword. + + + Gets the return type. + + + Gets the identifier. + + + Gets the parameter list. + + + Gets the constraint clause list. + + + Gets the semicolon token. + + + Destructor declaration syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the tilde token. + + + Gets the identifier. + + + Gets the optional semicolon token. + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + Gets the identifier. + + + + This node is associated with the following syntax kinds: + + + + + + + Gets the identifier. + + + + This node is associated with the following syntax kinds: + + + + + + + + Returns true if the property is allowed by the rules of the + language to be an arbitrary expression, not just a statement expression. + + + True if, for example, this expression statement represents the last expression statement + of the interactive top-level code. + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + Gets the identifier. + + + + This node is associated with the following syntax kinds: + + + + + + + + The variable(s) of the loop. In correct code this is a tuple + literal, declaration expression with a tuple designator, or + a discard syntax in the form of a simple identifier. In broken + code it could be something else. + + + + + This node is associated with the following syntax kinds: + + + + + + + Class which represents the syntax node for generic name. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the name of the identifier of the generic name. + + + TypeArgumentListSyntax node representing the list of type arguments of the generic name. + + + + This node is associated with the following syntax kinds: + + + + + + + + Represents a goto statement syntax + + + This node is associated with the following syntax kinds: + + + + + + + + + + Gets a SyntaxToken that represents the goto keyword. + + + + + Gets a SyntaxToken that represents the case or default keywords if any exists. + + + + + Gets a constant expression for a goto case statement. + + + + + Gets a SyntaxToken that represents the semi-colon at the end of the statement. + + + + Class which represents the syntax node for identifier name. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the keyword for the kind of the identifier name. + + + + Represents an if statement syntax. + + + This node is associated with the following syntax kinds: + + + + + + + + Gets a SyntaxToken that represents the if keyword. + + + + + Gets a SyntaxToken that represents the open parenthesis before the if statement's condition expression. + + + + + Gets an ExpressionSyntax that represents the condition of the if statement. + + + + + Gets a SyntaxToken that represents the close parenthesis after the if statement's condition expression. + + + + + Gets a StatementSyntax the represents the statement to be executed when the condition is true. + + + + + Gets an ElseClauseSyntax that represents the statement to be executed when the condition is false if such statement exists. + + + + + This node is associated with the following syntax kinds: + + + + + + + Gets the parameter list. + + + Represents a labeled statement syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the identifier. + + + Gets a SyntaxToken that represents the colon following the statement's label. + + + Provides the base class from which the classes that represent lambda expressions are derived. + + + SyntaxToken representing equals greater than. + + + + This node is associated with the following syntax kinds: + + + + + + + Gets the identifier. + + + Gets the optional semicolon token. + + + + This node is associated with the following syntax kinds: + + + + + + + + This class contains a variety of helper methods for determining whether a + position is within the scope (and not just the span) of a node. In general, + general, the scope extends from the first token up to, but not including, + the last token. For example, the open brace of a block is within the scope + of the block, but the close brace is not. + + + + + A position is considered to be inside a block if it is on or after + the open brace and strictly before the close brace. + + + + + A position is inside a property body only if it is inside an expression body. + All block bodies for properties are part of the accessor declaration (a type + of BaseMethodDeclaration), not the property declaration. + + + + + A position is inside a property body only if it is inside an expression body. + All block bodies for properties are part of the accessor declaration (a type + of BaseMethodDeclaration), not the property declaration. + + + + + A position is inside an accessor body if it is inside the block or expression + body. + + + + + A position is inside a body if it is inside the block or expression + body. + + A position is considered to be inside a block if it is on or after + the open brace and strictly before the close brace. A position is + considered to be inside an expression body if it is on or after + the '=>' and strictly before the semicolon. + + + + + Returns true if position is within the given node and before the first excluded token. + + + + + Used to determine whether it would be appropriate to use the binder for the statement (if any). + Not used to determine whether the position is syntactically within the statement. + + + + + Used to determine whether it would be appropriate to use the binder for the switch section (if any). + Not used to determine whether the position is syntactically within the statement. + + + + + Used to determine whether it would be appropriate to use the binder for the statement (if any). + Not used to determine whether the position is syntactically within the statement. + + + + + Used to determine whether it would be appropriate to use the binder for the statement (if any). + Not used to determine whether the position is syntactically within the statement. + + + + Method declaration syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the return type syntax. + + + Gets the identifier. + + + Gets the constraint clause list. + + + Gets the optional semicolon token. + + + Class which represents the syntax node for name colon syntax. + + This node is associated with the following syntax kinds: + + + + + + + IdentifierNameSyntax representing the identifier name. + + + SyntaxToken representing colon. + + + + This node is associated with the following syntax kinds: + + + + + + + Gets the optional semicolon token. + + + Provides the base class from which the classes that represent name syntax nodes are derived. This is an abstract class. + + + + Returns the unqualified (right-most) part of a qualified or alias-qualified name, or the name itself if already unqualified. + + The unqualified (right-most) part of a qualified or alias-qualified name, or the name itself if already unqualified. + If called on an instance of returns the value of the property. + If called on an instance of returns the value of the property. + If called on an instance of returns the instance itself. + + + + + Return the name in string form, without trivia or generic arguments, for use in diagnostics. + + + + + This inspection is entirely syntactic. We are not trying to find the alias corresponding to the assembly symbol + containing the explicitly implemented interface symbol - there may be more than one. We just want to know + how the name was qualified in source so that we can make a similar qualification (for uniqueness purposes). + + + + + Contains the nullable warnings and annotations context state at a given position in source. + + + + + Returns whether nullable warnings are enabled within the span. + Returns true if nullable warnings are enabled anywhere in the span; + false if nullable warnings are disabled throughout the span; and + null otherwise. + + + + Operator declaration syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the return type. + + + Gets the "operator" keyword. + + + Gets the "checked" keyword. + + + Gets the operator token. + + + Gets the optional semicolon token. + + + + A MemberCrefSyntax specified by an operator keyword, an operator symbol and an optional parameter list. + For example, "operator +" or "operator -[int]". + NOTE: the operator must be overloadable. + + + This node is associated with the following syntax kinds: + + + + + + + Gets the operator token. + + + Parameter list syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the open paren token. + + + Gets the close paren token. + + + Parameter syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the attribute declaration list. + + + Gets the modifier list. + + + Gets the identifier. + + + Class which represents the syntax node for parenthesized lambda expression. + + This node is associated with the following syntax kinds: + + + + + + + ParameterListSyntax node representing the list of parameters for the lambda expression. + + + SyntaxToken representing equals greater than. + + + + BlockSyntax node representing the body of the lambda. + Only one of Block or ExpressionBody will be non-null. + + + + + ExpressionSyntax node representing the body of the lambda. + Only one of Block or ExpressionBody will be non-null. + + + + + This node is associated with the following syntax kinds: + + + + + + + Gets the identifier. + + + + This node is associated with the following syntax kinds: + + + + + + + + + + + + Gets the attribute declaration list. + + + Gets the modifier list. + + + Gets the keyword token, or identifier if an erroneous accessor declaration. + + + Gets the optional body block which may be empty, but it is null if there are no braces. + + + Gets the optional expression body. + + + Gets the optional semicolon token. + + + Class which represents the syntax node for qualified name. + + This node is associated with the following syntax kinds: + + + + + + + NameSyntax node representing the name on the left side of the dot token of the qualified name. + + + SyntaxToken representing the dot. + + + SimpleNameSyntax node representing the name on the right side of the dot token of the qualified name. + + + + This node is associated with the following syntax kinds: + + + + + + + + The ref modifier of a method's return value or a local. + + This node is associated with the following syntax kinds: + + + + + + + Gets the optional "readonly" keyword. + + + + This node is associated with the following syntax kinds: + + + + + + + Class which represents the syntax node for a simple lambda expression. + + This node is associated with the following syntax kinds: + + + + + + + ParameterSyntax node representing the parameter of the lambda expression. + + + SyntaxToken representing equals greater than. + + + + BlockSyntax node representing the body of the lambda. + Only one of Block or ExpressionBody will be non-null. + + + + + ExpressionSyntax node representing the body of the lambda. + Only one of Block or ExpressionBody will be non-null. + + + + Provides the base class from which the classes that represent simple name syntax nodes are derived. This is an abstract class. + + + SyntaxToken representing the identifier of the simple name. + + + + This node is associated with the following syntax kinds: + + + + + + + Class which represents the syntax node for stackalloc array creation expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the stackalloc keyword. + + + TypeSyntax node representing the type of the stackalloc array. + + + InitializerExpressionSyntax node representing the initializer of the stackalloc array creation expression. + + + + It's a non terminal Trivia CSharpSyntaxNode that has a tree underneath it. + + + + + Get parent trivia. + + + + + This node is associated with the following syntax kinds: + + + + + + + Represents a switch statement syntax. + + This node is associated with the following syntax kinds: + + + + + + + + Gets a SyntaxToken that represents the switch keyword. + + + + + Gets a SyntaxToken that represents the open parenthesis preceding the switch governing expression. + + + + + Gets an ExpressionSyntax representing the expression of the switch statement. + + + + + Gets a SyntaxToken that represents the close parenthesis following the switch governing expression. + + + + + Gets a SyntaxToken that represents the open braces preceding the switch sections. + + + + + Gets a SyntaxList of SwitchSectionSyntax's that represents the switch sections of the switch statement. + + + + + Gets a SyntaxToken that represents the open braces following the switch sections. + + + + + Returns whether the specified token is also the end of the line. This will + be true for , , + and all preprocessor directives. + + + + + Returns the first end of line found in a . + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + Base class for type declaration syntax (class, struct, interface, record). + + + Gets the type keyword token ("class", "struct", "interface", "record"). + + + Gets the type constraint list. + + + Gets the member declarations. + + + Provides the base class from which the classes that represent type syntax nodes are derived. This is an abstract class. + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + Class which represents the syntax node for type argument list. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing less than. + + + SeparatedSyntaxList of TypeSyntax node representing the type arguments. + + + SyntaxToken representing greater than. + + + Class which represents the syntax node for predefined types. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken which represents the keyword corresponding to the predefined type. + + + Class which represents the syntax node for the array type. + + This node is associated with the following syntax kinds: + + + + + + + TypeSyntax node representing the type of the element of the array. + + + SyntaxList of ArrayRankSpecifierSyntax nodes representing the list of rank specifiers for the array. + + + Class which represents the syntax node for pointer type. + + This node is associated with the following syntax kinds: + + + + + + + TypeSyntax node that represents the element type of the pointer. + + + SyntaxToken representing the asterisk. + + + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the delegate keyword. + + + SyntaxToken representing the asterisk. + + + Node representing the optional calling convention. + + + List of the parameter types and return type of the function pointer. + + + Function pointer parameter list syntax. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the less than token. + + + SeparatedSyntaxList of ParameterSyntaxes representing the list of parameters and return type. + + + SyntaxToken representing the greater than token. + + + Function pointer calling convention syntax. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing whether the calling convention is managed or unmanaged. + + + Optional list of identifiers that will contribute to an unmanaged calling convention. + + + Function pointer calling convention syntax. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing open bracket. + + + SeparatedSyntaxList of calling convention identifiers. + + + SyntaxToken representing close bracket. + + + Individual function pointer unmanaged calling convention. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the calling convention identifier. + + + Class which represents the syntax node for a nullable type. + + This node is associated with the following syntax kinds: + + + + + + + TypeSyntax node representing the type of the element. + + + SyntaxToken representing the question mark. + + + Class which represents the syntax node for tuple type. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the open parenthesis. + + + SyntaxToken representing the close parenthesis. + + + Tuple type element. + + This node is associated with the following syntax kinds: + + + + + + + Gets the type of the tuple element. + + + Gets the name of the tuple element. + + + Class which represents a placeholder in the type argument list of an unbound generic type. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the omitted type argument. + + + The 'scoped' modifier of a local. + + This node is associated with the following syntax kinds: + + + + + + + Provides the base class from which the classes that represent expression syntax nodes are derived. This is an abstract class. + + + Class which represents the syntax node for parenthesized expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the open parenthesis. + + + ExpressionSyntax node representing the expression enclosed within the parenthesis. + + + SyntaxToken representing the close parenthesis. + + + Class which represents the syntax node for tuple expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the open parenthesis. + + + SeparatedSyntaxList of ArgumentSyntax representing the list of arguments. + + + SyntaxToken representing the close parenthesis. + + + Class which represents the syntax node for prefix unary expression. + + This node is associated with the following syntax kinds: + + + + + + + + + + + + + + + SyntaxToken representing the kind of the operator of the prefix unary expression. + + + ExpressionSyntax representing the operand of the prefix unary expression. + + + Class which represents the syntax node for an "await" expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the kind "await" keyword. + + + ExpressionSyntax representing the operand of the "await" operator. + + + Class which represents the syntax node for postfix unary expression. + + This node is associated with the following syntax kinds: + + + + + + + + + ExpressionSyntax representing the operand of the postfix unary expression. + + + SyntaxToken representing the kind of the operator of the postfix unary expression. + + + Class which represents the syntax node for member access expression. + + This node is associated with the following syntax kinds: + + + + + + + + ExpressionSyntax node representing the object that the member belongs to. + + + SyntaxToken representing the kind of the operator in the member access expression. + + + SimpleNameSyntax node representing the member being accessed. + + + Class which represents the syntax node for conditional access expression. + + This node is associated with the following syntax kinds: + + + + + + + ExpressionSyntax node representing the object conditionally accessed. + + + SyntaxToken representing the question mark. + + + ExpressionSyntax node representing the access expression to be executed when the object is not null. + + + Class which represents the syntax node for member binding expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing dot. + + + SimpleNameSyntax node representing the member being bound to. + + + Class which represents the syntax node for element binding expression. + + This node is associated with the following syntax kinds: + + + + + + + BracketedArgumentListSyntax node representing the list of arguments of the element binding expression. + + + Class which represents the syntax node for a range expression. + + This node is associated with the following syntax kinds: + + + + + + + ExpressionSyntax node representing the expression on the left of the range operator. + + + SyntaxToken representing the operator of the range expression. + + + ExpressionSyntax node representing the expression on the right of the range operator. + + + Class which represents the syntax node for implicit element access expression. + + This node is associated with the following syntax kinds: + + + + + + + BracketedArgumentListSyntax node representing the list of arguments of the implicit element access expression. + + + Class which represents an expression that has a binary operator. + + This node is associated with the following syntax kinds: + + + + + + + + + + + + + + + + + + + + + + + + + + + + ExpressionSyntax node representing the expression on the left of the binary operator. + + + SyntaxToken representing the operator of the binary expression. + + + ExpressionSyntax node representing the expression on the right of the binary operator. + + + Class which represents an expression that has an assignment operator. + + This node is associated with the following syntax kinds: + + + + + + + + + + + + + + + + + + + ExpressionSyntax node representing the expression on the left of the assignment operator. + + + SyntaxToken representing the operator of the assignment expression. + + + ExpressionSyntax node representing the expression on the right of the assignment operator. + + + Class which represents the syntax node for conditional expression. + + This node is associated with the following syntax kinds: + + + + + + + ExpressionSyntax node representing the condition of the conditional expression. + + + SyntaxToken representing the question mark. + + + ExpressionSyntax node representing the expression to be executed when the condition is true. + + + SyntaxToken representing the colon. + + + ExpressionSyntax node representing the expression to be executed when the condition is false. + + + Provides the base class from which the classes that represent instance expression syntax nodes are derived. This is an abstract class. + + + Class which represents the syntax node for a this expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the this keyword. + + + Class which represents the syntax node for a base expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the base keyword. + + + Class which represents the syntax node for a literal expression. + + This node is associated with the following syntax kinds: + + + + + + + + + + + + + + + SyntaxToken representing the keyword corresponding to the kind of the literal expression. + + + Class which represents the syntax node for MakeRef expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the MakeRefKeyword. + + + SyntaxToken representing open parenthesis. + + + Argument of the primary function. + + + SyntaxToken representing close parenthesis. + + + Class which represents the syntax node for RefType expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the RefTypeKeyword. + + + SyntaxToken representing open parenthesis. + + + Argument of the primary function. + + + SyntaxToken representing close parenthesis. + + + Class which represents the syntax node for RefValue expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the RefValueKeyword. + + + SyntaxToken representing open parenthesis. + + + Typed reference expression. + + + Comma separating the arguments. + + + The type of the value. + + + SyntaxToken representing close parenthesis. + + + Class which represents the syntax node for Checked or Unchecked expression. + + This node is associated with the following syntax kinds: + + + + + + + + SyntaxToken representing the checked or unchecked keyword. + + + SyntaxToken representing open parenthesis. + + + Argument of the primary function. + + + SyntaxToken representing close parenthesis. + + + Class which represents the syntax node for Default expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the DefaultKeyword. + + + SyntaxToken representing open parenthesis. + + + Argument of the primary function. + + + SyntaxToken representing close parenthesis. + + + Class which represents the syntax node for TypeOf expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the TypeOfKeyword. + + + SyntaxToken representing open parenthesis. + + + The expression to return type of. + + + SyntaxToken representing close parenthesis. + + + Class which represents the syntax node for SizeOf expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the SizeOfKeyword. + + + SyntaxToken representing open parenthesis. + + + Argument of the primary function. + + + SyntaxToken representing close parenthesis. + + + Class which represents the syntax node for invocation expression. + + This node is associated with the following syntax kinds: + + + + + + + ExpressionSyntax node representing the expression part of the invocation. + + + ArgumentListSyntax node representing the list of arguments of the invocation expression. + + + Class which represents the syntax node for element access expression. + + This node is associated with the following syntax kinds: + + + + + + + ExpressionSyntax node representing the expression which is accessing the element. + + + BracketedArgumentListSyntax node representing the list of arguments of the element access expression. + + + Provides the base class from which the classes that represent argument list syntax nodes are derived. This is an abstract class. + + + SeparatedSyntaxList of ArgumentSyntax nodes representing the list of arguments. + + + Class which represents the syntax node for the list of arguments. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing open parenthesis. + + + SeparatedSyntaxList of ArgumentSyntax representing the list of arguments. + + + SyntaxToken representing close parenthesis. + + + Class which represents the syntax node for bracketed argument list. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing open bracket. + + + SeparatedSyntaxList of ArgumentSyntax representing the list of arguments. + + + SyntaxToken representing close bracket. + + + + This node is associated with the following syntax kinds: + + + + + + + Class which represents the syntax node for the variable declaration in an out var declaration or a deconstruction declaration. + + This node is associated with the following syntax kinds: + + + + + + + Declaration representing the variable declared in an out parameter or deconstruction. + + + Class which represents the syntax node for cast expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the open parenthesis. + + + TypeSyntax node representing the type to which the expression is being cast. + + + SyntaxToken representing the close parenthesis. + + + ExpressionSyntax node representing the expression that is being casted. + + + + This node is associated with the following syntax kinds: + + + + + + + Class which represents the syntax node for initializer expression. + + This node is associated with the following syntax kinds: + + + + + + + + + + + SyntaxToken representing the open brace. + + + SeparatedSyntaxList of ExpressionSyntax representing the list of expressions in the initializer expression. + + + SyntaxToken representing the close brace. + + + SyntaxToken representing the new keyword. + + + ArgumentListSyntax representing the list of arguments passed as part of the object creation expression. + + + InitializerExpressionSyntax representing the initializer expression for the object being created. + + + Class which represents the syntax node for implicit object creation expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the new keyword. + + + ArgumentListSyntax representing the list of arguments passed as part of the object creation expression. + + + InitializerExpressionSyntax representing the initializer expression for the object being created. + + + Class which represents the syntax node for object creation expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the new keyword. + + + TypeSyntax representing the type of the object being created. + + + ArgumentListSyntax representing the list of arguments passed as part of the object creation expression. + + + InitializerExpressionSyntax representing the initializer expression for the object being created. + + + + This node is associated with the following syntax kinds: + + + + + + + InitializerExpressionSyntax representing the initializer expression for the with expression. + + + + This node is associated with the following syntax kinds: + + + + + + + NameEqualsSyntax representing the optional name of the member being initialized. + + + ExpressionSyntax representing the value the member is initialized with. + + + Class which represents the syntax node for anonymous object creation expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the new keyword. + + + SyntaxToken representing the open brace. + + + SeparatedSyntaxList of AnonymousObjectMemberDeclaratorSyntax representing the list of object member initializers. + + + SyntaxToken representing the close brace. + + + Class which represents the syntax node for array creation expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the new keyword. + + + ArrayTypeSyntax node representing the type of the array. + + + InitializerExpressionSyntax node representing the initializer of the array creation expression. + + + Class which represents the syntax node for implicit array creation expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the new keyword. + + + SyntaxToken representing the open bracket. + + + SyntaxList of SyntaxToken representing the commas in the implicit array creation expression. + + + SyntaxToken representing the close bracket. + + + InitializerExpressionSyntax representing the initializer expression of the implicit array creation expression. + + + Class which represents the syntax node for implicit stackalloc array creation expression. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the stackalloc keyword. + + + SyntaxToken representing the open bracket. + + + SyntaxToken representing the close bracket. + + + InitializerExpressionSyntax representing the initializer expression of the implicit stackalloc array creation expression. + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + Gets the identifier. + + + + This node is associated with the following syntax kinds: + + + + + + + Gets the identifier. + + + + This node is associated with the following syntax kinds: + + + + + + + Gets the identifier. + + + + This node is associated with the following syntax kinds: + + + + + + + Gets the identifier. + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + Gets the identifier. + + + Class which represents a placeholder in an array size list. + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the omitted array size expression. + + + + This node is associated with the following syntax kinds: + + + + + + + The first part of an interpolated string, $" or $@" or $""" + + + List of parts of the interpolated string, each one is either a literal part or an interpolation. + + + The closing quote of the interpolated string. + + + Class which represents a simple pattern-matching expression using the "is" keyword. + + This node is associated with the following syntax kinds: + + + + + + + ExpressionSyntax node representing the expression on the left of the "is" operator. + + + PatternSyntax node representing the pattern on the right of the "is" operator. + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + ExpressionSyntax node representing the constant expression. + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the operator of the relational pattern. + + + + This node is associated with the following syntax kinds: + + + + + + + The type for the type pattern. + + + + This node is associated with the following syntax kinds: + + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + The text contents of a part of the interpolated string. + + + + This node is associated with the following syntax kinds: + + + + + + + This could be a single { or multiple in a row (in the case of an interpolation in a raw interpolated string). + + + + This could be a single } or multiple in a row (in the case of an interpolation in a raw interpolated string). + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + The text contents of the format specifier for an interpolation. + + + Represents the base class for all statements syntax classes. + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + Gets the identifier. + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + Represents an else statement syntax. + + This node is associated with the following syntax kinds: + + + + + + + + Gets a syntax token + + + + Represents a switch section syntax of a switch statement. + + This node is associated with the following syntax kinds: + + + + + + + + Gets a SyntaxList of SwitchLabelSyntax's the represents the possible labels that control can transfer to within the section. + + + + + Gets a SyntaxList of StatementSyntax's the represents the statements to be executed when control transfer to a label the belongs to the section. + + + + Represents a switch label within a switch statement. + + + + Gets a SyntaxToken that represents a case or default keyword that belongs to a switch label. + + + + + Gets a SyntaxToken that represents the colon that terminates the switch label. + + + + Represents a case label within a switch statement. + + This node is associated with the following syntax kinds: + + + + + + + Gets the case keyword token. + + + + Gets a PatternSyntax that represents the pattern that gets matched for the case label. + + + + Represents a case label within a switch statement. + + This node is associated with the following syntax kinds: + + + + + + + Gets the case keyword token. + + + + Gets an ExpressionSyntax that represents the constant expression that gets matched for the case label. + + + + Represents a default label within a switch statement. + + This node is associated with the following syntax kinds: + + + + + + + Gets the default keyword token. + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + Represents an ExternAlias directive syntax, e.g. "extern alias MyAlias;" with specifying "/r:MyAlias=SomeAssembly.dll " on the compiler command line. + + + This node is associated with the following syntax kinds: + + + + + + + SyntaxToken representing the extern keyword. + + + SyntaxToken representing the alias keyword. + + + Gets the identifier. + + + SyntaxToken representing the semicolon token. + + + Member declaration syntax. + + + Gets the attribute declaration list. + + + Gets the modifier list. + + + + This node is associated with the following syntax kinds: + + + + + + + Class representing one or more attributes applied to a language construct. + + This node is associated with the following syntax kinds: + + + + + + + Gets the open bracket token. + + + Gets the optional construct targeted by the attribute. + + + Gets the attribute declaration list. + + + Gets the close bracket token. + + + Attribute argument list syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the open paren token. + + + Gets the arguments syntax list. + + + Gets the close paren token. + + + Attribute argument syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the expression. + + + Class representing an identifier name followed by an equals token. + + This node is associated with the following syntax kinds: + + + + + + + Gets the identifier name. + + + Type parameter list syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the < token. + + + Gets the parameter list. + + + Gets the > token. + + + Type parameter syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the attribute declaration list. + + + Gets the identifier. + + + Base class for type declaration syntax. + + + Gets the identifier. + + + Gets the base type list. + + + Gets the open brace token. + + + Gets the close brace token. + + + Gets the optional semicolon token. + + + Class type declaration syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the class keyword token. + + + Struct type declaration syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the struct keyword token. + + + Interface type declaration syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the interface keyword token. + + + Enum type declaration syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the enum keyword token. + + + Gets the members declaration list. + + + Gets the optional semicolon token. + + + Base list syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the colon token. + + + Gets the base type references. + + + Provides the base class from which the classes that represent base type syntax nodes are derived. This is an abstract class. + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + Type parameter constraint clause. + + This node is associated with the following syntax kinds: + + + + + + + Gets the identifier. + + + Gets the colon token. + + + Gets the constraints list. + + + Base type for type parameter constraint syntax. + + + Constructor constraint syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the "new" keyword. + + + Gets the open paren keyword. + + + Gets the close paren keyword. + + + Type constraint syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the type syntax. + + + Default constraint syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the "default" keyword. + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + Constructor initializer syntax. + + This node is associated with the following syntax kinds: + + + + + + + + Gets the colon token. + + + Gets the "this" or "base" keyword. + + + The syntax for the expression body of an expression-bodied member. + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + Base type for parameter list syntax. + + + Gets the parameter list. + + + Parameter list syntax with surrounding brackets. + + This node is associated with the following syntax kinds: + + + + + + + Gets the open bracket token. + + + Gets the close bracket token. + + + Base parameter syntax. + + + Gets the attribute declaration list. + + + Gets the modifier list. + + + Parameter syntax. + + This node is associated with the following syntax kinds: + + + + + + + Gets the attribute declaration list. + + + Gets the modifier list. + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + + A symbol referenced by a cref attribute (e.g. in a <see> or <seealso> documentation comment tag). + For example, the M in <see cref="M" />. + + + + + A symbol reference that definitely refers to a type. + For example, "int", "A::B", "A.B", "A<T>", but not "M()" (has parameter list) or "this" (indexer). + NOTE: TypeCrefSyntax, QualifiedCrefSyntax, and MemberCrefSyntax overlap. The syntax in a TypeCrefSyntax + will always be bound as type, so it's safer to use QualifiedCrefSyntax or MemberCrefSyntax if the symbol + might be a non-type member. + + + This node is associated with the following syntax kinds: + + + + + + + + A symbol reference to a type or non-type member that is qualified by an enclosing type or namespace. + For example, cref="System.String.ToString()". + NOTE: TypeCrefSyntax, QualifiedCrefSyntax, and MemberCrefSyntax overlap. The syntax in a TypeCrefSyntax + will always be bound as type, so it's safer to use QualifiedCrefSyntax or MemberCrefSyntax if the symbol + might be a non-type member. + + + This node is associated with the following syntax kinds: + + + + + + + + The unqualified part of a CrefSyntax. + For example, "ToString()" in "object.ToString()". + NOTE: TypeCrefSyntax, QualifiedCrefSyntax, and MemberCrefSyntax overlap. The syntax in a TypeCrefSyntax + will always be bound as type, so it's safer to use QualifiedCrefSyntax or MemberCrefSyntax if the symbol + might be a non-type member. + + + + + A MemberCrefSyntax specified by a name (an identifier, predefined type keyword, or an alias-qualified name, + with an optional type parameter list) and an optional parameter list. + For example, "M", "M<T>" or "M(int)". + Also, "A::B()" or "string()". + + + This node is associated with the following syntax kinds: + + + + + + + + A MemberCrefSyntax specified by a this keyword and an optional parameter list. + For example, "this" or "this[int]". + + + This node is associated with the following syntax kinds: + + + + + + + + A list of cref parameters with surrounding punctuation. + Unlike regular parameters, cref parameters do not have names. + + + + Gets the parameter list. + + + + A parenthesized list of cref parameters. + + + This node is associated with the following syntax kinds: + + + + + + + Gets the open paren token. + + + Gets the close paren token. + + + + A bracketed list of cref parameters. + + + This node is associated with the following syntax kinds: + + + + + + + Gets the open bracket token. + + + Gets the close bracket token. + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + This node is associated with the following syntax kinds: + + + + + + + + Defines a set of methods to determine how Unicode characters are treated by the C# compiler. + + + + + Returns true if the Unicode character is a hexadecimal digit. + + The Unicode character. + true if the character is a hexadecimal digit 0-9, A-F, a-f. + + + + Returns true if the Unicode character is a binary (0-1) digit. + + The Unicode character. + true if the character is a binary digit. + + + + Returns true if the Unicode character is a decimal digit. + + The Unicode character. + true if the Unicode character is a decimal digit. + + + + Returns the value of a hexadecimal Unicode character. + + The Unicode character. + + + + Returns the value of a binary Unicode character. + + The Unicode character. + + + + Returns the value of a decimal Unicode character. + + The Unicode character. + + + + Returns true if the Unicode character represents a whitespace. + + The Unicode character. + + + + Returns true if the Unicode character is a newline character. + + The Unicode character. + + + + Returns true if the Unicode character can be the starting character of a C# identifier. + + The Unicode character. + + + + Returns true if the Unicode character can be a part of a C# identifier. + + The Unicode character. + + + + Check that the name is a valid identifier. + + + + + Spec section 2.4.2 says that identifiers are compared without regard + to leading "@" characters or unicode formatting characters. As in dev10, + this is actually accomplished by dropping such characters during parsing. + Unfortunately, metadata names can still contain these characters and will + not be referenceable from source if they do (lookup will fail since the + characters will have been dropped from the search string). + See DevDiv #14432 for more. + + + + + Returns true if the node is the alias of an AliasQualifiedNameSyntax + + + + + Returns true if the node is the object of an invocation expression. + + + + + Returns true if the node is the object of an element access expression. + + + + + Returns true if the node is in a tree location that is expected to be a type + + + + + + + Returns true if a node is in a tree location that is expected to be either a namespace or type + + + + + + + Is the node the name of a named argument of an invocation, object creation expression, + constructor initializer, or element access, but not an attribute. + + + + + Is the expression the initializer in a fixed statement? + + + + + Given an initializer expression infer the name of anonymous property or tuple element. + Returns null if unsuccessful + + + + + Checks whether the element name is reserved. + + For example: + "Item3" is reserved (at certain positions). + "Rest", "ToString" and other members of System.ValueTuple are reserved (in any position). + Names that are not reserved return false. + + + + + A custom equality comparer for + + + PERF: The framework specializes EqualityComparer for enums, but only if the underlying type is System.Int32 + Since SyntaxKind's underlying type is System.UInt16, ObjectEqualityComparer will be chosen instead. + + + + + Some preprocessor keywords are only keywords when they appear after a + hash sign (#). For these keywords, the lexer will produce tokens with + Kind = SyntaxKind.IdentifierToken and ContextualKind set to the keyword + SyntaxKind. + + + This wrinkle is specifically not publicly exposed. + + + + + Member declarations that can appear in global code (other than type declarations). + + + + + A implementation for the CSharp language. + + + + + Creates a new instance of + + The that should be used when parsing generated files. + The generators that will run as part of this driver. + An that can be used to retrieve analyzer config values by the generators in this driver. + A list of s available to generators in this driver. + + + + Creates a new instance of with the specified s and default options + + The generators to create this driver with + A new instance. + + + + Creates a new instance of with the specified s and default options + + The incremental generators to create this driver with + A new instance. + + + + Creates a new instance of with the specified s and the provided options or default. + + The generators to create this driver with + A list of s available to generators in this driver, or null if there are none. + The that should be used when parsing generated files, or null to use + An that can be used to retrieve analyzer config values by the generators in this driver, or null if there are none. + A that controls the behavior of the created driver. + A new instance. + + + + Displays a value in the C# style. + + + Separate from because we want to link this functionality into + the Formatter project and we don't want it to be public there. + + + + + + Returns a string representation of an object of primitive type. + + A value to display as a string. + Options used to customize formatting of an object value. + A string representation of an object of primitive type (or null if the type is not supported). + + Handles , , , + , , , , , + , , , , , + and null. + + + + + Returns true if the character should be replaced and sets + to the replacement text. + + + + + Returns a C# string literal with the given value. + + The value that the resulting string literal should have. + Options used to customize formatting of an object value. + A string literal with the given value. + + Optionally escapes non-printable characters. + + + + + Returns a C# character literal with the given value. + + The value that the resulting character literal should have. + Options used to customize formatting of an object value. + A character literal with the given value. + + + + Displays a symbol in the C# style. + + + + + + Displays a symbol in the C# style, based on a . + + The symbol to be displayed. + The formatting options to apply. If null is passed, will be used. + A formatted string that can be displayed to the user. + + The return value is not expected to be syntactically valid C#. + + + + + Displays a symbol in the C# style, based on a . + Based on the context, qualify type and member names as little as possible without + introducing ambiguities. + + The symbol to be displayed. + Semantic information about the context in which the symbol is being displayed. + A position within the or . + The formatting options to apply. If null is passed, will be used. + A formatted string that can be displayed to the user. + + The return value is not expected to be syntactically valid C#. + + + + + Convert a symbol to an array of string parts, each of which has a kind. Useful for + colorizing the display string. + + The symbol to be displayed. + The formatting options to apply. If null is passed, will be used. + A list of display parts. + + Parts are not localized until they are converted to strings. + + + + + Convert a symbol to an array of string parts, each of which has a kind. Useful for + colorizing the display string. + + The symbol to be displayed. + Semantic information about the context in which the symbol is being displayed. + A position within the or . + The formatting options to apply. If null is passed, will be used. + A list of display parts. + + Parts are not localized until they are converted to strings. + + + + + Returns a string representation of an object of primitive type. + + A value to display as a string. + Whether or not to quote string literals. + Whether or not to display integral literals in hexadecimal. + A string representation of an object of primitive type (or null if the type is not supported). + + Handles , , , + , , , , , + , , , , , + and null. + + + + + Returns a C# string literal with the given value. + + The value that the resulting string literal should have. + True to put (double) quotes around the string literal. + A string literal with the given value. + + Escapes non-printable characters. + + + + + Returns a C# character literal with the given value. + + The value that the resulting character literal should have. + True to put (single) quotes around the character literal. + A character literal with the given value. + + Escapes non-printable characters. + + + + + Returns true if tuple type syntax can be used to refer to the tuple type without loss of information. + For example, it cannot be used when extension tuple is using non-default friendly names. + + + + + + + The nullable annotations that can apply in source. + + + The order of values here is used in the computation of , + , and + . If the order here is changed + then those implementations may have to be revised (or simplified). + + + + + Type is not annotated - string, int, T (including the case when T is unconstrained). + + + + + The type is not annotated in a context where the nullable feature is not enabled. + Used for interoperation with existing pre-nullable code. + + + + + Type is annotated with '?' - string?, T?. + + + + + Used for indexed type parameters and used locally in override/implementation checks. + When substituting a type parameter with Ignored annotation into some original type parameter + with some other annotation, the result is the annotation from the original symbol. + + T annotated + (T -> U ignored) = U annotated + T oblivious + (T -> U ignored) = U oblivious + T not-annotated + (T -> U ignored) = U not-annotated + + + + + Join nullable annotations from the set of lower bounds for fixing a type parameter. + This uses the covariant merging rules. (Annotated wins over Oblivious which wins over NotAnnotated) + + + + + Meet two nullable annotations for computing the nullable annotation of a type parameter from upper bounds. + This uses the contravariant merging rules. (NotAnnotated wins over Oblivious which wins over Annotated) + + + + + Return the nullable annotation to use when two annotations are expected to be "compatible", which means + they could be the same. These are the "invariant" merging rules. (NotAnnotated wins over Annotated which wins over Oblivious) + + + + + Merges nullability. + + + + + The attribute (metadata) representation of . + + + + + The attribute (metadata) representation of . + + + + + The attribute (metadata) representation of . + + + + + The nullable state of an rvalue computed in . + When in doubt we conservatively use + to minimize diagnostics. + + + + + Not null. + + + + + Maybe null (type is nullable). + + + + + Maybe null (type may be not nullable). + + + + + Join nullable flow states from distinct branches during flow analysis. + The result is if either operand is that. + + + + + Meet two nullable flow states from distinct states for the meet (union) operation in flow analysis. + The result is if either operand is that. + + + + + Some error messages are particularly confusing if multiple placeholders are substituted + with the same string. For example, "cannot convert from 'Goo' to 'Goo'". Usually, this + occurs because there are two types in different contexts with the same qualified name. + The solution is to provide additional qualification on each symbol - either a source + location, an assembly path, or an assembly identity. + + + Performs the same function as ErrArgFlags::Unique in the native compiler. + + + + + Virtual dispatch based on a symbol's particular class. + + Additional argument type + Result type + + + + Call the correct VisitXXX method in this class based on the particular type of symbol that is passed in. + Return default(TResult) if symbol is null + + + + + The default Visit method called when visiting any and + if visiting specific symbol method VisitXXX is not overridden + + The visited symbol + Additional argument + + + + + Called when visiting an ; Override this method with + specific implementation; Calling default if it's not + overridden + + The visited symbol + Additional argument + + + + + Called when visiting a ; Override this method with specific + implementation; Calling default if it's not overridden + + The visited symbol + Additional argument + + + + + Called when visiting a ; Should override this method if + want to visit members of the namespace; Calling + and loop over each member; calling on it Or override this with + specific implementation; Calling if it's not + overridden + + The visited symbol + Additional argument + + + + + Called when visiting a ; Override this with specific + implementation; Calling if it's not overridden + + The visited symbol + Additional argument + + + + + Called when visiting an ; Override this with specific + implementation; Calling if it's not overridden + + The visited symbol + Additional argument + + + + + Called when visiting a ; Override this with specific + implementation; Calling if it's not overridden + + The visited symbol + Additional argument + + + + + Called when visiting a ; Override this with specific + implementation; Calling if it's not overridden + + The visited symbol + Additional argument + + + + + Called when visiting an + Error symbol is created when there is compiler error; Override this with specific + implementation; Calling if it's not overridden + + The visited symbol + Additional argument + + + + + Called when visiting a ; Override this with specific + implementation; Calling if it's not overridden + + The visited symbol + Additional argument + + + + + Called when visiting a ; Override this with specific + implementation; Calling if it's not overridden + + The visited symbol + Additional argument + + + + + Called when visiting a ; Override this with specific + implementation; Calling if it's not overridden + + The visited symbol + Additional argument + + + + + Called when visiting a ; Override this with specific + implementation; Calling default if it's not overridden + + The visited symbol + Additional argument + + + + + Called when visiting a ; Override this with specific + implementation; Calling default if it's not overridden + + The visited symbol + Additional argument + + + + + Called when visiting a ; Override this with specific + implementation; Calling default if it's not overridden + + The visited symbol + Additional argument + + + + + Called when visiting an ; Override this with specific + implementation; Calling default if it's not overridden + + The visited symbol + Additional argument + + + + + Called when visiting a ; Override this with specific + implementation; Calling default if it's not overridden + + The visited symbol + Additional argument + + + + + Called when visiting a ; Override this with specific + implementation; Calling default if it's not overridden + + The visited symbol + Additional argument + + + + + Called when visiting a ; Override this with specific + implementation; Calling default if it's not overridden + + The visited symbol + Additional argument + + + + + Called when visiting an ; Override this with specific + implementation; Calling default if it's not overridden + + The visited symbol + Additional argument + + + + + Called when visiting a ; Override this with specific + implementation; Calling default if it's not overridden + + The visited symbol + Additional argument + + + + + Returns the System.String that represents the current TypedConstant. + + A System.String that represents the current TypedConstant. + + + + Determine whether there is any substitution of type parameters that will + make two types identical. + + + + + Determine whether there is any substitution of type parameters that will + make two types identical. + + LHS + RHS + + Substitutions performed so far (or null for none). + Keys are type parameters, values are types (possibly type parameters). + Will be updated with new substitutions by the callee. + Should be ignored when false is returned. + + True if there exists a type map such that Map(LHS) == Map(RHS). + + Derived from Dev10's BSYMMGR::UnifyTypes. + Two types will not unify if they have different custom modifiers. + + + + + Return true if the given type contains the specified type parameter. + + + + + A class containing factory methods for constructing syntax nodes, tokens and trivia. + + + + Creates a new AnonymousMethodExpressionSyntax instance. + + + Creates a new LiteralExpressionSyntax instance. + + + Creates a new AccessorDeclarationSyntax instance. + + + Creates a new RefTypeSyntax instance. + + + + A trivia with kind EndOfLineTrivia containing both the carriage return and line feed characters. + + + + + A trivia with kind EndOfLineTrivia containing a single line feed character. + + + + + A trivia with kind EndOfLineTrivia containing a single carriage return character. + + + + + A trivia with kind WhitespaceTrivia containing a single space character. + + + + + A trivia with kind WhitespaceTrivia containing a single tab character. + + + + + An elastic trivia with kind EndOfLineTrivia containing both the carriage return and line feed characters. + Elastic trivia are used to denote trivia that was not produced by parsing source text, and are usually not + preserved during formatting. + + + + + An elastic trivia with kind EndOfLineTrivia containing a single line feed character. Elastic trivia are used + to denote trivia that was not produced by parsing source text, and are usually not preserved during + formatting. + + + + + An elastic trivia with kind EndOfLineTrivia containing a single carriage return character. Elastic trivia + are used to denote trivia that was not produced by parsing source text, and are usually not preserved during + formatting. + + + + + An elastic trivia with kind WhitespaceTrivia containing a single space character. Elastic trivia are used to + denote trivia that was not produced by parsing source text, and are usually not preserved during formatting. + + + + + An elastic trivia with kind WhitespaceTrivia containing a single tab character. Elastic trivia are used to + denote trivia that was not produced by parsing source text, and are usually not preserved during formatting. + + + + + An elastic trivia with kind WhitespaceTrivia containing no characters. Elastic marker trivia are included + automatically by factory methods when trivia is not specified. Syntax formatting will replace elastic + markers with appropriate trivia. + + + + + Creates a trivia with kind EndOfLineTrivia containing the specified text. + + The text of the end of line. Any text can be specified here, however only carriage return and + line feed characters are recognized by the parser as end of line. + + + + Creates a trivia with kind EndOfLineTrivia containing the specified text. Elastic trivia are used to + denote trivia that was not produced by parsing source text, and are usually not preserved during formatting. + + The text of the end of line. Any text can be specified here, however only carriage return and + line feed characters are recognized by the parser as end of line. + + + + Creates a trivia with kind WhitespaceTrivia containing the specified text. + + The text of the whitespace. Any text can be specified here, however only specific + whitespace characters are recognized by the parser. + + + + Creates a trivia with kind WhitespaceTrivia containing the specified text. Elastic trivia are used to + denote trivia that was not produced by parsing source text, and are usually not preserved during formatting. + + The text of the whitespace. Any text can be specified here, however only specific + whitespace characters are recognized by the parser. + + + + Creates a trivia with kind either SingleLineCommentTrivia or MultiLineCommentTrivia containing the specified + text. + + The entire text of the comment including the leading '//' token for single line comments + or stop or start tokens for multiline comments. + + + + Creates a trivia with kind DisabledTextTrivia. Disabled text corresponds to any text between directives that + is not considered active. + + + + + Creates a trivia with kind PreprocessingMessageTrivia. + + + + + Trivia nodes represent parts of the program text that are not parts of the + syntactic grammar, such as spaces, newlines, comments, preprocessor + directives, and disabled code. + + + A representing the specific kind of . One of + , , + , , + , + + + The actual text of this token. + + + + + Creates a token corresponding to a syntax kind. This method can be used for token syntax kinds whose text + can be inferred by the kind alone. + + A syntax kind value for a token. These have the suffix Token or Keyword. + + + + + Creates a token corresponding to syntax kind. This method can be used for token syntax kinds whose text can + be inferred by the kind alone. + + A list of trivia immediately preceding the token. + A syntax kind value for a token. These have the suffix Token or Keyword. + A list of trivia immediately following the token. + + + + Creates a token corresponding to syntax kind. This method gives control over token Text and ValueText. + + For example, consider the text '<see cref="operator &#43;"/>'. To create a token for the value of + the operator symbol (&#43;), one would call + Token(default(SyntaxTriviaList), SyntaxKind.PlusToken, "&#43;", "+", default(SyntaxTriviaList)). + + A list of trivia immediately preceding the token. + A syntax kind value for a token. These have the suffix Token or Keyword. + The text from which this token was created (e.g. lexed). + How C# should interpret the text of this token. + A list of trivia immediately following the token. + + + + Creates a missing token corresponding to syntax kind. A missing token is produced by the parser when an + expected token is not found. A missing token has no text and normally has associated diagnostics. + + A syntax kind value for a token. These have the suffix Token or Keyword. + + + + Creates a missing token corresponding to syntax kind. A missing token is produced by the parser when an + expected token is not found. A missing token has no text and normally has associated diagnostics. + + A list of trivia immediately preceding the token. + A syntax kind value for a token. These have the suffix Token or Keyword. + A list of trivia immediately following the token. + + + + Creates a token with kind IdentifierToken containing the specified text. + + The raw text of the identifier name, including any escapes or leading '@' character. + + + + Creates a token with kind IdentifierToken containing the specified text. + + A list of trivia immediately preceding the token. + The raw text of the identifier name, including any escapes or leading '@' + character. + A list of trivia immediately following the token. + + + + Creates a verbatim token with kind IdentifierToken containing the specified text. + + A list of trivia immediately preceding the token. + The identifier, not including any escapes or leading '@' + character. + The canonical value of the token's text. + A list of trivia immediately following the token. + + + + Creates a token with kind IdentifierToken containing the specified text. + + A list of trivia immediately preceding the token. + An alternative SyntaxKind that can be inferred for this token in special + contexts. These are usually keywords. + The raw text of the identifier name, including any escapes or leading '@' + character. + The text of the identifier name without escapes or leading '@' character. + A list of trivia immediately following the token. + + + + + Creates a token with kind NumericLiteralToken from a 4-byte signed integer value. + + The 4-byte signed integer value to be represented by the returned token. + + + + Creates a token with kind NumericLiteralToken from the text and corresponding 4-byte signed integer value. + + The raw text of the literal. + The 4-byte signed integer value to be represented by the returned token. + + + + Creates a token with kind NumericLiteralToken from the text and corresponding 4-byte signed integer value. + + A list of trivia immediately preceding the token. + The raw text of the literal. + The 4-byte signed integer value to be represented by the returned token. + A list of trivia immediately following the token. + + + + Creates a token with kind NumericLiteralToken from a 4-byte unsigned integer value. + + The 4-byte unsigned integer value to be represented by the returned token. + + + + Creates a token with kind NumericLiteralToken from the text and corresponding 4-byte unsigned integer value. + + The raw text of the literal. + The 4-byte unsigned integer value to be represented by the returned token. + + + + Creates a token with kind NumericLiteralToken from the text and corresponding 4-byte unsigned integer value. + + A list of trivia immediately preceding the token. + The raw text of the literal. + The 4-byte unsigned integer value to be represented by the returned token. + A list of trivia immediately following the token. + + + + Creates a token with kind NumericLiteralToken from an 8-byte signed integer value. + + The 8-byte signed integer value to be represented by the returned token. + + + + Creates a token with kind NumericLiteralToken from the text and corresponding 8-byte signed integer value. + + The raw text of the literal. + The 8-byte signed integer value to be represented by the returned token. + + + + Creates a token with kind NumericLiteralToken from the text and corresponding 8-byte signed integer value. + + A list of trivia immediately preceding the token. + The raw text of the literal. + The 8-byte signed integer value to be represented by the returned token. + A list of trivia immediately following the token. + + + + Creates a token with kind NumericLiteralToken from an 8-byte unsigned integer value. + + The 8-byte unsigned integer value to be represented by the returned token. + + + + Creates a token with kind NumericLiteralToken from the text and corresponding 8-byte unsigned integer value. + + The raw text of the literal. + The 8-byte unsigned integer value to be represented by the returned token. + + + + Creates a token with kind NumericLiteralToken from the text and corresponding 8-byte unsigned integer value. + + A list of trivia immediately preceding the token. + The raw text of the literal. + The 8-byte unsigned integer value to be represented by the returned token. + A list of trivia immediately following the token. + + + + Creates a token with kind NumericLiteralToken from a 4-byte floating point value. + + The 4-byte floating point value to be represented by the returned token. + + + + Creates a token with kind NumericLiteralToken from the text and corresponding 4-byte floating point value. + + The raw text of the literal. + The 4-byte floating point value to be represented by the returned token. + + + + Creates a token with kind NumericLiteralToken from the text and corresponding 4-byte floating point value. + + A list of trivia immediately preceding the token. + The raw text of the literal. + The 4-byte floating point value to be represented by the returned token. + A list of trivia immediately following the token. + + + + Creates a token with kind NumericLiteralToken from an 8-byte floating point value. + + The 8-byte floating point value to be represented by the returned token. + + + + Creates a token with kind NumericLiteralToken from the text and corresponding 8-byte floating point value. + + The raw text of the literal. + The 8-byte floating point value to be represented by the returned token. + + + + Creates a token with kind NumericLiteralToken from the text and corresponding 8-byte floating point value. + + A list of trivia immediately preceding the token. + The raw text of the literal. + The 8-byte floating point value to be represented by the returned token. + A list of trivia immediately following the token. + + + + Creates a token with kind NumericLiteralToken from a decimal value. + + The decimal value to be represented by the returned token. + + + + Creates a token with kind NumericLiteralToken from the text and corresponding decimal value. + + The raw text of the literal. + The decimal value to be represented by the returned token. + + + + Creates a token with kind NumericLiteralToken from the text and corresponding decimal value. + + A list of trivia immediately preceding the token. + The raw text of the literal. + The decimal value to be represented by the returned token. + A list of trivia immediately following the token. + + + + Creates a token with kind StringLiteralToken from a string value. + + The string value to be represented by the returned token. + + + + Creates a token with kind StringLiteralToken from the text and corresponding string value. + + The raw text of the literal, including quotes and escape sequences. + The string value to be represented by the returned token. + + + + Creates a token with kind StringLiteralToken from the text and corresponding string value. + + A list of trivia immediately preceding the token. + The raw text of the literal, including quotes and escape sequences. + The string value to be represented by the returned token. + A list of trivia immediately following the token. + + + + Creates a token with kind CharacterLiteralToken from a character value. + + The character value to be represented by the returned token. + + + + Creates a token with kind CharacterLiteralToken from the text and corresponding character value. + + The raw text of the literal, including quotes and escape sequences. + The character value to be represented by the returned token. + + + + Creates a token with kind CharacterLiteralToken from the text and corresponding character value. + + A list of trivia immediately preceding the token. + The raw text of the literal, including quotes and escape sequences. + The character value to be represented by the returned token. + A list of trivia immediately following the token. + + + + Creates a token with kind BadToken. + + A list of trivia immediately preceding the token. + The raw text of the bad token. + A list of trivia immediately following the token. + + + + Creates a token with kind XmlTextLiteralToken. + + A list of trivia immediately preceding the token. + The raw text of the literal. + The xml text value. + A list of trivia immediately following the token. + + + + Creates a token with kind XmlEntityLiteralToken. + + A list of trivia immediately preceding the token. + The raw text of the literal. + The xml entity value. + A list of trivia immediately following the token. + + + + Creates an xml documentation comment that abstracts xml syntax creation. + + + A list of xml node syntax that will be the content within the xml documentation comment + (e.g. a summary element, a returns element, exception element and so on). + + + + + Creates a summary element within an xml documentation comment. + + A list of xml node syntax that will be the content within the summary element. + + + + Creates a summary element within an xml documentation comment. + + A list of xml node syntax that will be the content within the summary element. + + + + Creates a see element within an xml documentation comment. + + A cref syntax node that points to the referenced item (e.g. a class, struct). + + + + Creates a seealso element within an xml documentation comment. + + A cref syntax node that points to the referenced item (e.g. a class, struct). + + + + Creates a seealso element within an xml documentation comment. + + The uri of the referenced item. + A list of xml node syntax that will be used as the link text for the referenced item. + + + + Creates a threadsafety element within an xml documentation comment. + + + + + Creates a threadsafety element within an xml documentation comment. + + Indicates whether static member of this type are safe for multi-threaded operations. + Indicates whether instance members of this type are safe for multi-threaded operations. + + + + Creates a syntax node for a name attribute in a xml element within a xml documentation comment. + + The value of the name attribute. + + + + Creates a syntax node for a preliminary element within a xml documentation comment. + + + + + Creates a syntax node for a cref attribute within a xml documentation comment. + + The used for the xml cref attribute syntax. + + + + Creates a syntax node for a cref attribute within a xml documentation comment. + + The used for the xml cref attribute syntax. + The kind of the quote for the referenced item in the cref attribute. + + + + Creates a remarks element within an xml documentation comment. + + A list of xml node syntax that will be the content within the remarks element. + + + + Creates a remarks element within an xml documentation comment. + + A list of xml node syntax that will be the content within the remarks element. + + + + Creates a returns element within an xml documentation comment. + + A list of xml node syntax that will be the content within the returns element. + + + + Creates a returns element within an xml documentation comment. + + A list of xml node syntax that will be the content within the returns element. + + + + Creates the syntax representation of an xml value element (e.g. for xml documentation comments). + + A list of xml syntax nodes that represents the content of the value element. + + + + Creates the syntax representation of an xml value element (e.g. for xml documentation comments). + + A list of xml syntax nodes that represents the content of the value element. + + + + Creates the syntax representation of an exception element within xml documentation comments. + + Syntax representation of the reference to the exception type. + A list of syntax nodes that represents the content of the exception element. + + + + Creates the syntax representation of an exception element within xml documentation comments. + + Syntax representation of the reference to the exception type. + A list of syntax nodes that represents the content of the exception element. + + + + Creates the syntax representation of a permission element within xml documentation comments. + + Syntax representation of the reference to the permission type. + A list of syntax nodes that represents the content of the permission element. + + + + Creates the syntax representation of a permission element within xml documentation comments. + + Syntax representation of the reference to the permission type. + A list of syntax nodes that represents the content of the permission element. + + + + Creates the syntax representation of an example element within xml documentation comments. + + A list of syntax nodes that represents the content of the example element. + + + + Creates the syntax representation of an example element within xml documentation comments. + + A list of syntax nodes that represents the content of the example element. + + + + Creates the syntax representation of a para element within xml documentation comments. + + A list of syntax nodes that represents the content of the para element. + + + + Creates the syntax representation of a para element within xml documentation comments. + + A list of syntax nodes that represents the content of the para element. + + + + Creates the syntax representation of a param element within xml documentation comments (e.g. for + documentation of method parameters). + + The name of the parameter. + A list of syntax nodes that represents the content of the param element (e.g. + the description and meaning of the parameter). + + + + Creates the syntax representation of a param element within xml documentation comments (e.g. for + documentation of method parameters). + + The name of the parameter. + A list of syntax nodes that represents the content of the param element (e.g. + the description and meaning of the parameter). + + + + Creates the syntax representation of a paramref element within xml documentation comments (e.g. for + referencing particular parameters of a method). + + The name of the referenced parameter. + + + + Creates the syntax representation of a see element within xml documentation comments, + that points to the 'null' language keyword. + + + + + Creates the syntax representation of a see element within xml documentation comments, + that points to a language keyword. + + The language keyword to which the see element points to. + + + + Creates the syntax representation of a placeholder element within xml documentation comments. + + A list of syntax nodes that represents the content of the placeholder element. + + + + Creates the syntax representation of a placeholder element within xml documentation comments. + + A list of syntax nodes that represents the content of the placeholder element. + + + + Creates the syntax representation of a named empty xml element within xml documentation comments. + + The name of the empty xml element. + + + + Creates the syntax representation of a named xml element within xml documentation comments. + + The name of the empty xml element. + A list of syntax nodes that represents the content of the xml element. + + + + Creates the syntax representation of a named xml element within xml documentation comments. + + The name of the empty xml element. + A list of syntax nodes that represents the content of the xml element. + + + + Creates the syntax representation of an xml text attribute. + + The name of the xml text attribute. + The value of the xml text attribute. + + + + Creates the syntax representation of an xml text attribute. + + The name of the xml text attribute. + A list of tokens used for the value of the xml text attribute. + + + + Creates the syntax representation of an xml text attribute. + + The name of the xml text attribute. + The kind of the quote token to be used to quote the value (e.g. " or '). + A list of tokens used for the value of the xml text attribute. + + + + Creates the syntax representation of an xml text attribute. + + The name of the xml text attribute. + The kind of the quote token to be used to quote the value (e.g. " or '). + A list of tokens used for the value of the xml text attribute. + + + + Creates the syntax representation of an xml element that spans multiple text lines. + + The name of the xml element. + A list of syntax nodes that represents the content of the xml multi line element. + + + + Creates the syntax representation of an xml element that spans multiple text lines. + + The name of the xml element. + A list of syntax nodes that represents the content of the xml multi line element. + + + + Creates the syntax representation of an xml text that contains a newline token with a documentation comment + exterior trivia at the end (continued documentation comment). + + The raw text within the new line. + + + + Creates the syntax representation of an xml newline token with a documentation comment exterior trivia at + the end (continued documentation comment). + + The raw text within the new line. + + + + Creates a token with kind XmlTextLiteralNewLineToken. + + A list of trivia immediately preceding the token. + The raw text of the literal. + The xml text new line value. + A list of trivia immediately following the token. + + + + Creates the syntax representation of an xml newline token for xml documentation comments. + + The raw text within the new line. + + If set to true, a documentation comment exterior token will be added to the trailing trivia + of the new token. + + + + Generates the syntax representation of a xml text node (e.g. for xml documentation comments). + + The string literal used as the text of the xml text node. + + + + Generates the syntax representation of a xml text node (e.g. for xml documentation comments). + + A list of text tokens used as the text of the xml text node. + + + + Generates the syntax representation of an xml text literal. + + The text used within the xml text literal. + + + + Generates the syntax representation of an xml text literal. + + The raw text of the literal. + The text used within the xml text literal. + + + + Helper method that replaces less-than and greater-than characters with brackets. + + The original token that is to be replaced. + The new rewritten token. + Returns the new rewritten token with replaced characters. + + + + Creates a trivia with kind DocumentationCommentExteriorTrivia. + + The raw text of the literal. + + + + Creates an empty list of syntax nodes. + + The specific type of the element nodes. + + + + Creates a singleton list of syntax nodes. + + The specific type of the element nodes. + The single element node. + + + + + Creates a list of syntax nodes. + + The specific type of the element nodes. + A sequence of element nodes. + + + + Creates an empty list of tokens. + + + + + Creates a singleton list of tokens. + + The single token. + + + + Creates a list of tokens. + + An array of tokens. + + + + Creates a list of tokens. + + + + + + + Creates a trivia from a StructuredTriviaSyntax node. + + + + + Creates an empty list of trivia. + + + + + Creates a singleton list of trivia. + + A single trivia. + + + + Creates a list of trivia. + + An array of trivia. + + + + Creates a list of trivia. + + A sequence of trivia. + + + + Creates an empty separated list. + + The specific type of the element nodes. + + + + Creates a singleton separated list. + + The specific type of the element nodes. + A single node. + + + + Creates a separated list of nodes from a sequence of nodes, synthesizing comma separators in between. + + The specific type of the element nodes. + A sequence of syntax nodes. + + + + Creates a separated list of nodes from a sequence of nodes and a sequence of separator tokens. + + The specific type of the element nodes. + A sequence of syntax nodes. + A sequence of token to be interleaved between the nodes. The number of tokens must + be one less than the number of nodes. + + + + Creates a separated list from a sequence of nodes and tokens, starting with a node and alternating between additional nodes and separator tokens. + + The specific type of the element nodes. + A sequence of nodes or tokens, alternating between nodes and separator tokens. + + + + Creates a separated list from a , where the list elements start with a node and then alternate between + additional nodes and separator tokens. + + The specific type of the element nodes. + The list of nodes and tokens. + + + + Creates an empty . + + + + + Create a from a sequence of . + + The sequence of nodes and tokens + + + + Create a from one or more . + + The nodes and tokens + + + + Creates an IdentifierNameSyntax node. + + The identifier name. + + + + Create a new syntax tree from a syntax node. + + + + + + + + + + + Parse a list of trivia rules for leading trivia. + + + + + Parse a list of trivia rules for leading trivia. + + + + + Parse a list of trivia using the parsing rules for trailing trivia. + + + + + Parse a C# language token. + + The text of the token including leading and trailing trivia. + Optional offset into text. + + + + Parse a sequence of C# language tokens. + Since this API does not create a that owns all produced tokens, + the API may yield surprising results for + the produced tokens and its behavior is generally unspecified. + + The text of all the tokens. + An integer to use as the starting position of the first token. + Optional offset into text. + Parse options. + + + + Parse a NameSyntax node using the grammar rule for names. + + + + + Parse a TypeNameSyntax node using the grammar rule for type names. + + + + + Parse a TypeNameSyntax node using the grammar rule for type names. + + + + + Parse an ExpressionSyntax node using the lowest precedence grammar rule for expressions. + + The text of the expression. + Optional offset into text. + The optional parse options to use. If no options are specified default options are + used. + True if extra tokens in the input should be treated as an error + + + + Parse a StatementSyntaxNode using grammar rule for statements. + + The text of the statement. + Optional offset into text. + The optional parse options to use. If no options are specified default options are + used. + True if extra tokens in the input should be treated as an error + + + + Parse a MemberDeclarationSyntax. This includes all of the kinds of members that could occur in a type declaration. + If nothing resembling a valid member declaration is found in the input, returns null. + + The text of the declaration. + Optional offset into text. + The optional parse options to use. If no options are specified default options are + used. + True if extra tokens in the input following a declaration should be treated as an error + + + + Parse a CompilationUnitSyntax using the grammar rule for an entire compilation unit (file). To produce a + SyntaxTree instance, use CSharpSyntaxTree.ParseText instead. + + The text of the compilation unit. + Optional offset into text. + The optional parse options to use. If no options are specified default options are + used. + + + + Parse a ParameterListSyntax node. + + The text of the parenthesized parameter list. + Optional offset into text. + The optional parse options to use. If no options are specified default options are + used. + True if extra tokens in the input should be treated as an error + + + + Parse a BracketedParameterListSyntax node. + + The text of the bracketed parameter list. + Optional offset into text. + The optional parse options to use. If no options are specified default options are + used. + True if extra tokens in the input should be treated as an error + + + + Parse an ArgumentListSyntax node. + + The text of the parenthesized argument list. + Optional offset into text. + The optional parse options to use. If no options are specified default options are + used. + True if extra tokens in the input should be treated as an error + + + + Parse a BracketedArgumentListSyntax node. + + The text of the bracketed argument list. + Optional offset into text. + The optional parse options to use. If no options are specified default options are + used. + True if extra tokens in the input should be treated as an error + + + + Parse an AttributeArgumentListSyntax node. + + The text of the attribute argument list. + Optional offset into text. + The optional parse options to use. If no options are specified default options are + used. + True if extra tokens in the input should be treated as an error + + + + Helper method for wrapping a string in a SourceText. + + + + + Determines if two trees are the same, disregarding trivia differences. + + The original tree. + The new tree. + + If true then the trees are equivalent if the contained nodes and tokens declaring + metadata visible symbolic information are equivalent, ignoring any differences of nodes inside method bodies + or initializer expressions, otherwise all nodes and tokens must be equivalent. + + + + + Determines if two syntax nodes are the same, disregarding trivia differences. + + The old node. + The new node. + + If true then the nodes are equivalent if the contained nodes and tokens declaring + metadata visible symbolic information are equivalent, ignoring any differences of nodes inside method bodies + or initializer expressions, otherwise all nodes and tokens must be equivalent. + + + + + Determines if two syntax nodes are the same, disregarding trivia differences. + + The old node. + The new node. + + If specified called for every child syntax node (not token) that is visited during the comparison. + If it returns true the child is recursively visited, otherwise the child and its subtree is disregarded. + + + + + Determines if two syntax tokens are the same, disregarding trivia differences. + + The old token. + The new token. + + + + Determines if two lists of tokens are the same, disregarding trivia differences. + + The old token list. + The new token list. + + + + Determines if two lists of syntax nodes are the same, disregarding trivia differences. + + The old list. + The new list. + + If true then the nodes are equivalent if the contained nodes and tokens declaring + metadata visible symbolic information are equivalent, ignoring any differences of nodes inside method bodies + or initializer expressions, otherwise all nodes and tokens must be equivalent. + + + + + Determines if two lists of syntax nodes are the same, disregarding trivia differences. + + The old list. + The new list. + + If specified called for every child syntax node (not token) that is visited during the comparison. + If it returns true the child is recursively visited, otherwise the child and its subtree is disregarded. + + + + + Determines if two lists of syntax nodes are the same, disregarding trivia differences. + + The old list. + The new list. + + If true then the nodes are equivalent if the contained nodes and tokens declaring + metadata visible symbolic information are equivalent, ignoring any differences of nodes inside method bodies + or initializer expressions, otherwise all nodes and tokens must be equivalent. + + + + + Determines if two lists of syntax nodes are the same, disregarding trivia differences. + + The old list. + The new list. + + If specified called for every child syntax node (not token) that is visited during the comparison. + If it returns true the child is recursively visited, otherwise the child and its subtree is disregarded. + + + + + Gets the containing expression that is actually a language expression and not just typed + as an ExpressionSyntax for convenience. For example, NameSyntax nodes on the right side + of qualified names and member access expressions are not language expressions, yet the + containing qualified names or member access expressions are indeed expressions. + + + + + Gets the containing expression that is actually a language expression (or something that + GetSymbolInfo can be applied to) and not just typed + as an ExpressionSyntax for convenience. For example, NameSyntax nodes on the right side + of qualified names and member access expressions are not language expressions, yet the + containing qualified names or member access expressions are indeed expressions. + Similarly, if the input node is a cref part that is not independently meaningful, then + the result will be the full cref. Besides an expression, an input that is a NameSyntax + of a SubpatternSyntax, e.g. in `name: 3` may cause this method to return the enclosing + SubpatternSyntax. + + + + + Given a conditional binding expression, find corresponding conditional access node. + + + + + Converts a generic name expression into one without the generic arguments. + + + + + + + Determines whether the given text is considered a syntactically complete submission. + Throws if the tree was not compiled as an interactive submission. + + + + Creates a new CaseSwitchLabelSyntax instance. + + + Creates a new DefaultSwitchLabelSyntax instance. + + + Creates a new BlockSyntax instance. + + + Creates a new BlockSyntax instance. + + + Creates a new instance. + + + Creates a new OperatorDeclarationSyntax instance. + + + Creates a new OperatorDeclarationSyntax instance. + + + Creates a new OperatorDeclarationSyntax instance. + + + Creates a new instance. + + + Creates a new UsingDirectiveSyntax instance. + + + Creates a new ClassOrStructConstraintSyntax instance. + + + Creates a new EventDeclarationSyntax instance. + + + Creates a new EventDeclarationSyntax instance. + + + Creates a new SwitchStatementSyntax instance. + + + Creates a new SwitchStatementSyntax instance. + + + Creates a new instance. + + + Creates a new instance. + + + Creates a new IdentifierNameSyntax instance. + + + Creates a new QualifiedNameSyntax instance. + + + Creates a new QualifiedNameSyntax instance. + + + Creates a new GenericNameSyntax instance. + + + Creates a new GenericNameSyntax instance. + + + Creates a new GenericNameSyntax instance. + + + Creates a new TypeArgumentListSyntax instance. + + + Creates a new TypeArgumentListSyntax instance. + + + Creates a new AliasQualifiedNameSyntax instance. + + + Creates a new AliasQualifiedNameSyntax instance. + + + Creates a new AliasQualifiedNameSyntax instance. + + + Creates a new PredefinedTypeSyntax instance. + + + Creates a new ArrayTypeSyntax instance. + + + Creates a new ArrayTypeSyntax instance. + + + Creates a new ArrayRankSpecifierSyntax instance. + + + Creates a new ArrayRankSpecifierSyntax instance. + + + Creates a new PointerTypeSyntax instance. + + + Creates a new PointerTypeSyntax instance. + + + Creates a new FunctionPointerTypeSyntax instance. + + + Creates a new FunctionPointerTypeSyntax instance. + + + Creates a new FunctionPointerTypeSyntax instance. + + + Creates a new FunctionPointerParameterListSyntax instance. + + + Creates a new FunctionPointerParameterListSyntax instance. + + + Creates a new FunctionPointerCallingConventionSyntax instance. + + + Creates a new FunctionPointerCallingConventionSyntax instance. + + + Creates a new FunctionPointerUnmanagedCallingConventionListSyntax instance. + + + Creates a new FunctionPointerUnmanagedCallingConventionListSyntax instance. + + + Creates a new FunctionPointerUnmanagedCallingConventionSyntax instance. + + + Creates a new NullableTypeSyntax instance. + + + Creates a new NullableTypeSyntax instance. + + + Creates a new TupleTypeSyntax instance. + + + Creates a new TupleTypeSyntax instance. + + + Creates a new TupleElementSyntax instance. + + + Creates a new TupleElementSyntax instance. + + + Creates a new OmittedTypeArgumentSyntax instance. + + + Creates a new OmittedTypeArgumentSyntax instance. + + + Creates a new RefTypeSyntax instance. + + + Creates a new RefTypeSyntax instance. + + + Creates a new ScopedTypeSyntax instance. + + + Creates a new ScopedTypeSyntax instance. + + + Creates a new ParenthesizedExpressionSyntax instance. + + + Creates a new ParenthesizedExpressionSyntax instance. + + + Creates a new TupleExpressionSyntax instance. + + + Creates a new TupleExpressionSyntax instance. + + + Creates a new PrefixUnaryExpressionSyntax instance. + + + Creates a new PrefixUnaryExpressionSyntax instance. + + + Creates a new AwaitExpressionSyntax instance. + + + Creates a new AwaitExpressionSyntax instance. + + + Creates a new PostfixUnaryExpressionSyntax instance. + + + Creates a new PostfixUnaryExpressionSyntax instance. + + + Creates a new MemberAccessExpressionSyntax instance. + + + Creates a new MemberAccessExpressionSyntax instance. + + + Creates a new ConditionalAccessExpressionSyntax instance. + + + Creates a new ConditionalAccessExpressionSyntax instance. + + + Creates a new MemberBindingExpressionSyntax instance. + + + Creates a new MemberBindingExpressionSyntax instance. + + + Creates a new ElementBindingExpressionSyntax instance. + + + Creates a new ElementBindingExpressionSyntax instance. + + + Creates a new RangeExpressionSyntax instance. + + + Creates a new RangeExpressionSyntax instance. + + + Creates a new RangeExpressionSyntax instance. + + + Creates a new ImplicitElementAccessSyntax instance. + + + Creates a new ImplicitElementAccessSyntax instance. + + + Creates a new BinaryExpressionSyntax instance. + + + Creates a new BinaryExpressionSyntax instance. + + + Creates a new AssignmentExpressionSyntax instance. + + + Creates a new AssignmentExpressionSyntax instance. + + + Creates a new ConditionalExpressionSyntax instance. + + + Creates a new ConditionalExpressionSyntax instance. + + + Creates a new ThisExpressionSyntax instance. + + + Creates a new ThisExpressionSyntax instance. + + + Creates a new BaseExpressionSyntax instance. + + + Creates a new BaseExpressionSyntax instance. + + + Creates a new LiteralExpressionSyntax instance. + + + Creates a new MakeRefExpressionSyntax instance. + + + Creates a new MakeRefExpressionSyntax instance. + + + Creates a new RefTypeExpressionSyntax instance. + + + Creates a new RefTypeExpressionSyntax instance. + + + Creates a new RefValueExpressionSyntax instance. + + + Creates a new RefValueExpressionSyntax instance. + + + Creates a new CheckedExpressionSyntax instance. + + + Creates a new CheckedExpressionSyntax instance. + + + Creates a new DefaultExpressionSyntax instance. + + + Creates a new DefaultExpressionSyntax instance. + + + Creates a new TypeOfExpressionSyntax instance. + + + Creates a new TypeOfExpressionSyntax instance. + + + Creates a new SizeOfExpressionSyntax instance. + + + Creates a new SizeOfExpressionSyntax instance. + + + Creates a new InvocationExpressionSyntax instance. + + + Creates a new InvocationExpressionSyntax instance. + + + Creates a new ElementAccessExpressionSyntax instance. + + + Creates a new ElementAccessExpressionSyntax instance. + + + Creates a new ArgumentListSyntax instance. + + + Creates a new ArgumentListSyntax instance. + + + Creates a new BracketedArgumentListSyntax instance. + + + Creates a new BracketedArgumentListSyntax instance. + + + Creates a new ArgumentSyntax instance. + + + Creates a new ArgumentSyntax instance. + + + Creates a new ExpressionColonSyntax instance. + + + Creates a new NameColonSyntax instance. + + + Creates a new DeclarationExpressionSyntax instance. + + + Creates a new CastExpressionSyntax instance. + + + Creates a new CastExpressionSyntax instance. + + + Creates a new AnonymousMethodExpressionSyntax instance. + + + Creates a new SimpleLambdaExpressionSyntax instance. + + + Creates a new SimpleLambdaExpressionSyntax instance. + + + Creates a new SimpleLambdaExpressionSyntax instance. + + + Creates a new RefExpressionSyntax instance. + + + Creates a new RefExpressionSyntax instance. + + + Creates a new ParenthesizedLambdaExpressionSyntax instance. + + + Creates a new ParenthesizedLambdaExpressionSyntax instance. + + + Creates a new ParenthesizedLambdaExpressionSyntax instance. + + + Creates a new InitializerExpressionSyntax instance. + + + Creates a new InitializerExpressionSyntax instance. + + + Creates a new ImplicitObjectCreationExpressionSyntax instance. + + + Creates a new ImplicitObjectCreationExpressionSyntax instance. + + + Creates a new ImplicitObjectCreationExpressionSyntax instance. + + + Creates a new ObjectCreationExpressionSyntax instance. + + + Creates a new ObjectCreationExpressionSyntax instance. + + + Creates a new ObjectCreationExpressionSyntax instance. + + + Creates a new WithExpressionSyntax instance. + + + Creates a new WithExpressionSyntax instance. + + + Creates a new AnonymousObjectMemberDeclaratorSyntax instance. + + + Creates a new AnonymousObjectMemberDeclaratorSyntax instance. + + + Creates a new AnonymousObjectCreationExpressionSyntax instance. + + + Creates a new AnonymousObjectCreationExpressionSyntax instance. + + + Creates a new ArrayCreationExpressionSyntax instance. + + + Creates a new ArrayCreationExpressionSyntax instance. + + + Creates a new ArrayCreationExpressionSyntax instance. + + + Creates a new ImplicitArrayCreationExpressionSyntax instance. + + + Creates a new ImplicitArrayCreationExpressionSyntax instance. + + + Creates a new ImplicitArrayCreationExpressionSyntax instance. + + + Creates a new StackAllocArrayCreationExpressionSyntax instance. + + + Creates a new StackAllocArrayCreationExpressionSyntax instance. + + + Creates a new StackAllocArrayCreationExpressionSyntax instance. + + + Creates a new ImplicitStackAllocArrayCreationExpressionSyntax instance. + + + Creates a new ImplicitStackAllocArrayCreationExpressionSyntax instance. + + + Creates a new QueryExpressionSyntax instance. + + + Creates a new QueryBodySyntax instance. + + + Creates a new QueryBodySyntax instance. + + + Creates a new FromClauseSyntax instance. + + + Creates a new FromClauseSyntax instance. + + + Creates a new FromClauseSyntax instance. + + + Creates a new FromClauseSyntax instance. + + + Creates a new LetClauseSyntax instance. + + + Creates a new LetClauseSyntax instance. + + + Creates a new LetClauseSyntax instance. + + + Creates a new JoinClauseSyntax instance. + + + Creates a new JoinClauseSyntax instance. + + + Creates a new JoinClauseSyntax instance. + + + Creates a new JoinClauseSyntax instance. + + + Creates a new JoinIntoClauseSyntax instance. + + + Creates a new JoinIntoClauseSyntax instance. + + + Creates a new JoinIntoClauseSyntax instance. + + + Creates a new WhereClauseSyntax instance. + + + Creates a new WhereClauseSyntax instance. + + + Creates a new OrderByClauseSyntax instance. + + + Creates a new OrderByClauseSyntax instance. + + + Creates a new OrderingSyntax instance. + + + Creates a new OrderingSyntax instance. + + + Creates a new SelectClauseSyntax instance. + + + Creates a new SelectClauseSyntax instance. + + + Creates a new GroupClauseSyntax instance. + + + Creates a new GroupClauseSyntax instance. + + + Creates a new QueryContinuationSyntax instance. + + + Creates a new QueryContinuationSyntax instance. + + + Creates a new QueryContinuationSyntax instance. + + + Creates a new OmittedArraySizeExpressionSyntax instance. + + + Creates a new OmittedArraySizeExpressionSyntax instance. + + + Creates a new InterpolatedStringExpressionSyntax instance. + + + Creates a new InterpolatedStringExpressionSyntax instance. + + + Creates a new IsPatternExpressionSyntax instance. + + + Creates a new IsPatternExpressionSyntax instance. + + + Creates a new ThrowExpressionSyntax instance. + + + Creates a new ThrowExpressionSyntax instance. + + + Creates a new WhenClauseSyntax instance. + + + Creates a new WhenClauseSyntax instance. + + + Creates a new DiscardPatternSyntax instance. + + + Creates a new DiscardPatternSyntax instance. + + + Creates a new DeclarationPatternSyntax instance. + + + Creates a new VarPatternSyntax instance. + + + Creates a new VarPatternSyntax instance. + + + Creates a new RecursivePatternSyntax instance. + + + Creates a new RecursivePatternSyntax instance. + + + Creates a new PositionalPatternClauseSyntax instance. + + + Creates a new PositionalPatternClauseSyntax instance. + + + Creates a new PropertyPatternClauseSyntax instance. + + + Creates a new PropertyPatternClauseSyntax instance. + + + Creates a new SubpatternSyntax instance. + + + Creates a new SubpatternSyntax instance. + + + Creates a new ConstantPatternSyntax instance. + + + Creates a new ParenthesizedPatternSyntax instance. + + + Creates a new ParenthesizedPatternSyntax instance. + + + Creates a new RelationalPatternSyntax instance. + + + Creates a new TypePatternSyntax instance. + + + Creates a new BinaryPatternSyntax instance. + + + Creates a new BinaryPatternSyntax instance. + + + Creates a new UnaryPatternSyntax instance. + + + Creates a new UnaryPatternSyntax instance. + + + Creates a new ListPatternSyntax instance. + + + Creates a new ListPatternSyntax instance. + + + Creates a new ListPatternSyntax instance. + + + Creates a new SlicePatternSyntax instance. + + + Creates a new SlicePatternSyntax instance. + + + Creates a new InterpolatedStringTextSyntax instance. + + + Creates a new InterpolatedStringTextSyntax instance. + + + Creates a new InterpolationSyntax instance. + + + Creates a new InterpolationSyntax instance. + + + Creates a new InterpolationSyntax instance. + + + Creates a new InterpolationAlignmentClauseSyntax instance. + + + Creates a new InterpolationFormatClauseSyntax instance. + + + Creates a new InterpolationFormatClauseSyntax instance. + + + Creates a new GlobalStatementSyntax instance. + + + Creates a new GlobalStatementSyntax instance. + + + Creates a new BlockSyntax instance. + + + Creates a new BlockSyntax instance. + + + Creates a new BlockSyntax instance. + + + Creates a new LocalFunctionStatementSyntax instance. + + + Creates a new LocalFunctionStatementSyntax instance. + + + Creates a new LocalFunctionStatementSyntax instance. + + + Creates a new LocalFunctionStatementSyntax instance. + + + Creates a new LocalDeclarationStatementSyntax instance. + + + Creates a new LocalDeclarationStatementSyntax instance. + + + Creates a new LocalDeclarationStatementSyntax instance. + + + Creates a new VariableDeclarationSyntax instance. + + + Creates a new VariableDeclarationSyntax instance. + + + Creates a new VariableDeclaratorSyntax instance. + + + Creates a new VariableDeclaratorSyntax instance. + + + Creates a new VariableDeclaratorSyntax instance. + + + Creates a new EqualsValueClauseSyntax instance. + + + Creates a new EqualsValueClauseSyntax instance. + + + Creates a new SingleVariableDesignationSyntax instance. + + + Creates a new DiscardDesignationSyntax instance. + + + Creates a new DiscardDesignationSyntax instance. + + + Creates a new ParenthesizedVariableDesignationSyntax instance. + + + Creates a new ParenthesizedVariableDesignationSyntax instance. + + + Creates a new ExpressionStatementSyntax instance. + + + Creates a new ExpressionStatementSyntax instance. + + + Creates a new ExpressionStatementSyntax instance. + + + Creates a new EmptyStatementSyntax instance. + + + Creates a new EmptyStatementSyntax instance. + + + Creates a new EmptyStatementSyntax instance. + + + Creates a new LabeledStatementSyntax instance. + + + Creates a new LabeledStatementSyntax instance. + + + Creates a new LabeledStatementSyntax instance. + + + Creates a new LabeledStatementSyntax instance. + + + Creates a new GotoStatementSyntax instance. + + + Creates a new GotoStatementSyntax instance. + + + Creates a new GotoStatementSyntax instance. + + + Creates a new BreakStatementSyntax instance. + + + Creates a new BreakStatementSyntax instance. + + + Creates a new BreakStatementSyntax instance. + + + Creates a new ContinueStatementSyntax instance. + + + Creates a new ContinueStatementSyntax instance. + + + Creates a new ContinueStatementSyntax instance. + + + Creates a new ReturnStatementSyntax instance. + + + Creates a new ReturnStatementSyntax instance. + + + Creates a new ReturnStatementSyntax instance. + + + Creates a new ThrowStatementSyntax instance. + + + Creates a new ThrowStatementSyntax instance. + + + Creates a new ThrowStatementSyntax instance. + + + Creates a new YieldStatementSyntax instance. + + + Creates a new YieldStatementSyntax instance. + + + Creates a new YieldStatementSyntax instance. + + + Creates a new WhileStatementSyntax instance. + + + Creates a new WhileStatementSyntax instance. + + + Creates a new WhileStatementSyntax instance. + + + Creates a new DoStatementSyntax instance. + + + Creates a new DoStatementSyntax instance. + + + Creates a new DoStatementSyntax instance. + + + Creates a new ForStatementSyntax instance. + + + Creates a new ForStatementSyntax instance. + + + Creates a new ForStatementSyntax instance. + + + Creates a new ForEachStatementSyntax instance. + + + Creates a new ForEachStatementSyntax instance. + + + Creates a new ForEachStatementSyntax instance. + + + Creates a new ForEachStatementSyntax instance. + + + Creates a new ForEachVariableStatementSyntax instance. + + + Creates a new ForEachVariableStatementSyntax instance. + + + Creates a new ForEachVariableStatementSyntax instance. + + + Creates a new UsingStatementSyntax instance. + + + Creates a new UsingStatementSyntax instance. + + + Creates a new UsingStatementSyntax instance. + + + Creates a new FixedStatementSyntax instance. + + + Creates a new FixedStatementSyntax instance. + + + Creates a new FixedStatementSyntax instance. + + + Creates a new CheckedStatementSyntax instance. + + + Creates a new CheckedStatementSyntax instance. + + + Creates a new CheckedStatementSyntax instance. + + + Creates a new UnsafeStatementSyntax instance. + + + Creates a new UnsafeStatementSyntax instance. + + + Creates a new UnsafeStatementSyntax instance. + + + Creates a new LockStatementSyntax instance. + + + Creates a new LockStatementSyntax instance. + + + Creates a new LockStatementSyntax instance. + + + Creates a new IfStatementSyntax instance. + + + Creates a new IfStatementSyntax instance. + + + Creates a new IfStatementSyntax instance. + + + Creates a new ElseClauseSyntax instance. + + + Creates a new ElseClauseSyntax instance. + + + Creates a new SwitchStatementSyntax instance. + + + Creates a new SwitchSectionSyntax instance. + + + Creates a new SwitchSectionSyntax instance. + + + Creates a new CasePatternSwitchLabelSyntax instance. + + + Creates a new CasePatternSwitchLabelSyntax instance. + + + Creates a new CasePatternSwitchLabelSyntax instance. + + + Creates a new CaseSwitchLabelSyntax instance. + + + Creates a new CaseSwitchLabelSyntax instance. + + + Creates a new DefaultSwitchLabelSyntax instance. + + + Creates a new DefaultSwitchLabelSyntax instance. + + + Creates a new SwitchExpressionSyntax instance. + + + Creates a new SwitchExpressionSyntax instance. + + + Creates a new SwitchExpressionSyntax instance. + + + Creates a new SwitchExpressionArmSyntax instance. + + + Creates a new SwitchExpressionArmSyntax instance. + + + Creates a new SwitchExpressionArmSyntax instance. + + + Creates a new TryStatementSyntax instance. + + + Creates a new TryStatementSyntax instance. + + + Creates a new TryStatementSyntax instance. + + + Creates a new CatchClauseSyntax instance. + + + Creates a new CatchClauseSyntax instance. + + + Creates a new CatchClauseSyntax instance. + + + Creates a new CatchDeclarationSyntax instance. + + + Creates a new CatchDeclarationSyntax instance. + + + Creates a new CatchDeclarationSyntax instance. + + + Creates a new CatchFilterClauseSyntax instance. + + + Creates a new CatchFilterClauseSyntax instance. + + + Creates a new FinallyClauseSyntax instance. + + + Creates a new FinallyClauseSyntax instance. + + + Creates a new CompilationUnitSyntax instance. + + + Creates a new CompilationUnitSyntax instance. + + + Creates a new CompilationUnitSyntax instance. + + + Creates a new ExternAliasDirectiveSyntax instance. + + + Creates a new ExternAliasDirectiveSyntax instance. + + + Creates a new ExternAliasDirectiveSyntax instance. + + + Creates a new UsingDirectiveSyntax instance. + + + Creates a new UsingDirectiveSyntax instance. + + + Creates a new UsingDirectiveSyntax instance. + + + Creates a new NamespaceDeclarationSyntax instance. + + + Creates a new NamespaceDeclarationSyntax instance. + + + Creates a new NamespaceDeclarationSyntax instance. + + + Creates a new FileScopedNamespaceDeclarationSyntax instance. + + + Creates a new FileScopedNamespaceDeclarationSyntax instance. + + + Creates a new FileScopedNamespaceDeclarationSyntax instance. + + + Creates a new AttributeListSyntax instance. + + + Creates a new AttributeListSyntax instance. + + + Creates a new AttributeListSyntax instance. + + + Creates a new AttributeTargetSpecifierSyntax instance. + + + Creates a new AttributeTargetSpecifierSyntax instance. + + + Creates a new AttributeSyntax instance. + + + Creates a new AttributeSyntax instance. + + + Creates a new AttributeArgumentListSyntax instance. + + + Creates a new AttributeArgumentListSyntax instance. + + + Creates a new AttributeArgumentSyntax instance. + + + Creates a new AttributeArgumentSyntax instance. + + + Creates a new NameEqualsSyntax instance. + + + Creates a new NameEqualsSyntax instance. + + + Creates a new NameEqualsSyntax instance. + + + Creates a new TypeParameterListSyntax instance. + + + Creates a new TypeParameterListSyntax instance. + + + Creates a new TypeParameterSyntax instance. + + + Creates a new TypeParameterSyntax instance. + + + Creates a new TypeParameterSyntax instance. + + + Creates a new ClassDeclarationSyntax instance. + + + Creates a new ClassDeclarationSyntax instance. + + + Creates a new ClassDeclarationSyntax instance. + + + Creates a new ClassDeclarationSyntax instance. + + + Creates a new StructDeclarationSyntax instance. + + + Creates a new StructDeclarationSyntax instance. + + + Creates a new StructDeclarationSyntax instance. + + + Creates a new StructDeclarationSyntax instance. + + + Creates a new InterfaceDeclarationSyntax instance. + + + Creates a new InterfaceDeclarationSyntax instance. + + + Creates a new InterfaceDeclarationSyntax instance. + + + Creates a new InterfaceDeclarationSyntax instance. + + + Creates a new RecordDeclarationSyntax instance. + + + Creates a new RecordDeclarationSyntax instance. + + + Creates a new RecordDeclarationSyntax instance. + + + Creates a new RecordDeclarationSyntax instance. + + + Creates a new EnumDeclarationSyntax instance. + + + Creates a new EnumDeclarationSyntax instance. + + + Creates a new EnumDeclarationSyntax instance. + + + Creates a new EnumDeclarationSyntax instance. + + + Creates a new DelegateDeclarationSyntax instance. + + + Creates a new DelegateDeclarationSyntax instance. + + + Creates a new DelegateDeclarationSyntax instance. + + + Creates a new DelegateDeclarationSyntax instance. + + + Creates a new EnumMemberDeclarationSyntax instance. + + + Creates a new EnumMemberDeclarationSyntax instance. + + + Creates a new EnumMemberDeclarationSyntax instance. + + + Creates a new BaseListSyntax instance. + + + Creates a new BaseListSyntax instance. + + + Creates a new SimpleBaseTypeSyntax instance. + + + Creates a new PrimaryConstructorBaseTypeSyntax instance. + + + Creates a new PrimaryConstructorBaseTypeSyntax instance. + + + Creates a new TypeParameterConstraintClauseSyntax instance. + + + Creates a new TypeParameterConstraintClauseSyntax instance. + + + Creates a new TypeParameterConstraintClauseSyntax instance. + + + Creates a new TypeParameterConstraintClauseSyntax instance. + + + Creates a new ConstructorConstraintSyntax instance. + + + Creates a new ConstructorConstraintSyntax instance. + + + Creates a new ClassOrStructConstraintSyntax instance. + + + Creates a new ClassOrStructConstraintSyntax instance. + + + Creates a new TypeConstraintSyntax instance. + + + Creates a new DefaultConstraintSyntax instance. + + + Creates a new DefaultConstraintSyntax instance. + + + Creates a new FieldDeclarationSyntax instance. + + + Creates a new FieldDeclarationSyntax instance. + + + Creates a new FieldDeclarationSyntax instance. + + + Creates a new EventFieldDeclarationSyntax instance. + + + Creates a new EventFieldDeclarationSyntax instance. + + + Creates a new EventFieldDeclarationSyntax instance. + + + Creates a new ExplicitInterfaceSpecifierSyntax instance. + + + Creates a new ExplicitInterfaceSpecifierSyntax instance. + + + Creates a new MethodDeclarationSyntax instance. + + + Creates a new MethodDeclarationSyntax instance. + + + Creates a new MethodDeclarationSyntax instance. + + + Creates a new MethodDeclarationSyntax instance. + + + Creates a new OperatorDeclarationSyntax instance. + + + Creates a new OperatorDeclarationSyntax instance. + + + Creates a new OperatorDeclarationSyntax instance. + + + Creates a new ConversionOperatorDeclarationSyntax instance. + + + Creates a new ConversionOperatorDeclarationSyntax instance. + + + Creates a new ConversionOperatorDeclarationSyntax instance. + + + Creates a new ConstructorDeclarationSyntax instance. + + + Creates a new ConstructorDeclarationSyntax instance. + + + Creates a new ConstructorDeclarationSyntax instance. + + + Creates a new ConstructorDeclarationSyntax instance. + + + Creates a new ConstructorInitializerSyntax instance. + + + Creates a new ConstructorInitializerSyntax instance. + + + Creates a new DestructorDeclarationSyntax instance. + + + Creates a new DestructorDeclarationSyntax instance. + + + Creates a new DestructorDeclarationSyntax instance. + + + Creates a new DestructorDeclarationSyntax instance. + + + Creates a new PropertyDeclarationSyntax instance. + + + Creates a new PropertyDeclarationSyntax instance. + + + Creates a new PropertyDeclarationSyntax instance. + + + Creates a new PropertyDeclarationSyntax instance. + + + Creates a new ArrowExpressionClauseSyntax instance. + + + Creates a new ArrowExpressionClauseSyntax instance. + + + Creates a new EventDeclarationSyntax instance. + + + Creates a new EventDeclarationSyntax instance. + + + Creates a new EventDeclarationSyntax instance. + + + Creates a new EventDeclarationSyntax instance. + + + Creates a new IndexerDeclarationSyntax instance. + + + Creates a new IndexerDeclarationSyntax instance. + + + Creates a new IndexerDeclarationSyntax instance. + + + Creates a new AccessorListSyntax instance. + + + Creates a new AccessorListSyntax instance. + + + Creates a new AccessorDeclarationSyntax instance. + + + Creates a new AccessorDeclarationSyntax instance. + + + Creates a new AccessorDeclarationSyntax instance. + + + Creates a new ParameterListSyntax instance. + + + Creates a new ParameterListSyntax instance. + + + Creates a new BracketedParameterListSyntax instance. + + + Creates a new BracketedParameterListSyntax instance. + + + Creates a new ParameterSyntax instance. + + + Creates a new ParameterSyntax instance. + + + Creates a new FunctionPointerParameterSyntax instance. + + + Creates a new FunctionPointerParameterSyntax instance. + + + Creates a new IncompleteMemberSyntax instance. + + + Creates a new IncompleteMemberSyntax instance. + + + Creates a new SkippedTokensTriviaSyntax instance. + + + Creates a new SkippedTokensTriviaSyntax instance. + + + Creates a new DocumentationCommentTriviaSyntax instance. + + + Creates a new DocumentationCommentTriviaSyntax instance. + + + Creates a new TypeCrefSyntax instance. + + + Creates a new QualifiedCrefSyntax instance. + + + Creates a new QualifiedCrefSyntax instance. + + + Creates a new NameMemberCrefSyntax instance. + + + Creates a new NameMemberCrefSyntax instance. + + + Creates a new IndexerMemberCrefSyntax instance. + + + Creates a new IndexerMemberCrefSyntax instance. + + + Creates a new OperatorMemberCrefSyntax instance. + + + Creates a new OperatorMemberCrefSyntax instance. + + + Creates a new OperatorMemberCrefSyntax instance. + + + Creates a new ConversionOperatorMemberCrefSyntax instance. + + + Creates a new ConversionOperatorMemberCrefSyntax instance. + + + Creates a new ConversionOperatorMemberCrefSyntax instance. + + + Creates a new CrefParameterListSyntax instance. + + + Creates a new CrefParameterListSyntax instance. + + + Creates a new CrefBracketedParameterListSyntax instance. + + + Creates a new CrefBracketedParameterListSyntax instance. + + + Creates a new CrefParameterSyntax instance. + + + Creates a new CrefParameterSyntax instance. + + + Creates a new XmlElementSyntax instance. + + + Creates a new XmlElementSyntax instance. + + + Creates a new XmlElementStartTagSyntax instance. + + + Creates a new XmlElementStartTagSyntax instance. + + + Creates a new XmlElementStartTagSyntax instance. + + + Creates a new XmlElementEndTagSyntax instance. + + + Creates a new XmlElementEndTagSyntax instance. + + + Creates a new XmlEmptyElementSyntax instance. + + + Creates a new XmlEmptyElementSyntax instance. + + + Creates a new XmlEmptyElementSyntax instance. + + + Creates a new XmlNameSyntax instance. + + + Creates a new XmlNameSyntax instance. + + + Creates a new XmlNameSyntax instance. + + + Creates a new XmlPrefixSyntax instance. + + + Creates a new XmlPrefixSyntax instance. + + + Creates a new XmlPrefixSyntax instance. + + + Creates a new XmlTextAttributeSyntax instance. + + + Creates a new XmlTextAttributeSyntax instance. + + + Creates a new XmlTextAttributeSyntax instance. + + + Creates a new XmlCrefAttributeSyntax instance. + + + Creates a new XmlCrefAttributeSyntax instance. + + + Creates a new XmlNameAttributeSyntax instance. + + + Creates a new XmlNameAttributeSyntax instance. + + + Creates a new XmlNameAttributeSyntax instance. + + + Creates a new XmlTextSyntax instance. + + + Creates a new XmlTextSyntax instance. + + + Creates a new XmlCDataSectionSyntax instance. + + + Creates a new XmlCDataSectionSyntax instance. + + + Creates a new XmlProcessingInstructionSyntax instance. + + + Creates a new XmlProcessingInstructionSyntax instance. + + + Creates a new XmlProcessingInstructionSyntax instance. + + + Creates a new XmlCommentSyntax instance. + + + Creates a new XmlCommentSyntax instance. + + + Creates a new IfDirectiveTriviaSyntax instance. + + + Creates a new IfDirectiveTriviaSyntax instance. + + + Creates a new ElifDirectiveTriviaSyntax instance. + + + Creates a new ElifDirectiveTriviaSyntax instance. + + + Creates a new ElseDirectiveTriviaSyntax instance. + + + Creates a new ElseDirectiveTriviaSyntax instance. + + + Creates a new EndIfDirectiveTriviaSyntax instance. + + + Creates a new EndIfDirectiveTriviaSyntax instance. + + + Creates a new RegionDirectiveTriviaSyntax instance. + + + Creates a new RegionDirectiveTriviaSyntax instance. + + + Creates a new EndRegionDirectiveTriviaSyntax instance. + + + Creates a new EndRegionDirectiveTriviaSyntax instance. + + + Creates a new ErrorDirectiveTriviaSyntax instance. + + + Creates a new ErrorDirectiveTriviaSyntax instance. + + + Creates a new WarningDirectiveTriviaSyntax instance. + + + Creates a new WarningDirectiveTriviaSyntax instance. + + + Creates a new BadDirectiveTriviaSyntax instance. + + + Creates a new BadDirectiveTriviaSyntax instance. + + + Creates a new DefineDirectiveTriviaSyntax instance. + + + Creates a new DefineDirectiveTriviaSyntax instance. + + + Creates a new DefineDirectiveTriviaSyntax instance. + + + Creates a new UndefDirectiveTriviaSyntax instance. + + + Creates a new UndefDirectiveTriviaSyntax instance. + + + Creates a new UndefDirectiveTriviaSyntax instance. + + + Creates a new LineDirectiveTriviaSyntax instance. + + + Creates a new LineDirectiveTriviaSyntax instance. + + + Creates a new LineDirectiveTriviaSyntax instance. + + + Creates a new LineDirectivePositionSyntax instance. + + + Creates a new LineDirectivePositionSyntax instance. + + + Creates a new LineSpanDirectiveTriviaSyntax instance. + + + Creates a new LineSpanDirectiveTriviaSyntax instance. + + + Creates a new LineSpanDirectiveTriviaSyntax instance. + + + Creates a new PragmaWarningDirectiveTriviaSyntax instance. + + + Creates a new PragmaWarningDirectiveTriviaSyntax instance. + + + Creates a new PragmaWarningDirectiveTriviaSyntax instance. + + + Creates a new PragmaChecksumDirectiveTriviaSyntax instance. + + + Creates a new PragmaChecksumDirectiveTriviaSyntax instance. + + + Creates a new ReferenceDirectiveTriviaSyntax instance. + + + Creates a new ReferenceDirectiveTriviaSyntax instance. + + + Creates a new LoadDirectiveTriviaSyntax instance. + + + Creates a new LoadDirectiveTriviaSyntax instance. + + + Creates a new ShebangDirectiveTriviaSyntax instance. + + + Creates a new ShebangDirectiveTriviaSyntax instance. + + + Creates a new NullableDirectiveTriviaSyntax instance. + + + Creates a new NullableDirectiveTriviaSyntax instance. + + + Creates a new NullableDirectiveTriviaSyntax instance. + + + + Represents a non-terminal node in the syntax tree. + + + + + Used by structured trivia which has "parent == null", and therefore must know its + SyntaxTree explicitly when created. + + + + + Returns a non-null that owns this node. + If this node was created with an explicit non-null , returns that tree. + Otherwise, if this node has a non-null parent, then returns the parent's . + Otherwise, returns a newly created rooted at this node, preserving this node's reference identity. + + + + + The node that contains this node in its Children collection. + + + + + Returns the of the node. + + + + + The language name that this node is syntax of. + + + + + The list of trivia that appears before this node in the source code. + + + + + The list of trivia that appears after this node in the source code. + + + + + Deserialize a syntax node from the byte stream. + + + + + Gets a for this node. + + + + + Gets a SyntaxReference for this syntax node. SyntaxReferences can be used to + regain access to a syntax node without keeping the entire tree and source text in + memory. + + + + + Gets a list of all the diagnostics in the sub tree that has this node as its root. + This method does not filter diagnostics based on #pragmas and compiler options + like nowarn, warnaserror etc. + + + + + Gets the first directive of the tree rooted by this node. + + + + + Gets the last directive of the tree rooted by this node. + + + + + Gets the first token of the tree rooted by this node. + + True if zero width tokens should be included, false by + default. + True if skipped tokens should be included, false by default. + True if directives should be included, false by default. + True if documentation comments should be + included, false by default. + + + + + Gets the first token of the tree rooted by this node. + + Only tokens for which this predicate returns true are included. Pass null to include + all tokens. + Steps into trivia if this is not null. Only trivia for which this delegate returns + true are included. + + + + + Gets the last non-zero-width token of the tree rooted by this node. + + True if zero width tokens should be included, false by + default. + True if skipped tokens should be included, false by default. + True if directives should be included, false by default. + True if documentation comments should be + included, false by default. + + + + + Finds a token according to the following rules: + 1) If position matches the End of the node/s FullSpan and the node is CompilationUnit, + then EoF is returned. + + 2) If node.FullSpan.Contains(position) then the token that contains given position is + returned. + + 3) Otherwise an ArgumentOutOfRangeException is thrown + + + + + Finds a token according to the following rules: + 1) If position matches the End of the node/s FullSpan and the node is CompilationUnit, + then EoF is returned. + + 2) If node.FullSpan.Contains(position) then the token that contains given position is + returned. + + 3) Otherwise an ArgumentOutOfRangeException is thrown + + + + + Finds a descendant trivia of this node at the specified position, where the position is + within the span of the node. + + The character position of the trivia relative to the beginning of + the file. + Specifies a function that determines per trivia node, whether to + descend into structured trivia of that node. + + + + + Finds a descendant trivia of this node whose span includes the supplied position. + + The character position of the trivia relative to the beginning of + the file. + Whether to search inside structured trivia. + + + + Determine if this node is structurally equivalent to another. + + + + + + + Represents a which descends an entire graph and + may replace or remove visited SyntaxNodes in depth-first order. + + + + + The parsed representation of a C# source document. + + + + + Stores positions where preprocessor state changes. Sorted by position. + The updated state can be found in array at the same index. + + + + + Preprocessor states corresponding to positions in . + + + + + The options used by the parser to produce the syntax tree. + + + + + Produces a clone of a which will have current syntax tree as its parent. + + Caller must guarantee that if the same instance of makes multiple calls + to this function, only one result is observable. + + Type of the syntax node. + The original syntax node. + A clone of the original syntax node that has current as its parent. + + + + Gets the root node of the syntax tree. + + + + + Gets the root node of the syntax tree if it is already available. + + + + + Gets the root node of the syntax tree asynchronously. + + + By default, the work associated with this method will be executed immediately on the current thread. + Implementations that wish to schedule this work differently should override . + + + + + Gets the root of the syntax tree statically typed as . + + + Ensure that is true for this tree prior to invoking this method. + + Throws this exception if is false. + + + + Determines if two trees are the same, disregarding trivia differences. + + The tree to compare against. + + If true then the trees are equivalent if the contained nodes and tokens declaring metadata visible symbolic information are equivalent, + ignoring any differences of nodes inside method bodies or initializer expressions, otherwise all nodes and tokens must be equivalent. + + + + + Creates a new syntax tree from a syntax node. + + + + + Creates a new syntax tree from a syntax node. + + An obsolete parameter. Diagnostic options should now be passed with + An obsolete parameter. It is unused. + + + + Creates a new syntax tree from a syntax node with text that should correspond to the syntax node. + + This is used by the ExpressionEvaluator. + + + + + Internal helper for class to create a new syntax tree rooted at the given root node. + This method does not create a clone of the given root, but instead preserves it's reference identity. + + NOTE: This method is only intended to be used from property. + NOTE: Do not use this method elsewhere, instead use method for creating a syntax tree. + + + + + Produces a syntax tree by parsing the source text lazily. The syntax tree is realized when + is called. + + + + + Produces a syntax tree by parsing the source text. + + + + + Produces a syntax tree by parsing the source text. + + An obsolete parameter. Diagnostic options should now be passed with + An obsolete parameter. It is unused. + + + + Produces a syntax tree by parsing the source text. + + + + + Produces a syntax tree by parsing the source text. + + An obsolete parameter. Diagnostic options should now be passed with + An obsolete parameter. It is unused. + + + + Creates a new syntax based off this tree using a new source text. + + + If the new source text is a minor change from the current source text an incremental parse will occur + reusing most of the current syntax tree internal data. Otherwise, a full parse will occur using the new + source text. + + + + + Produces a pessimistic list of spans that denote the regions of text in this tree that + are changed from the text of the old tree. + + The old tree. Cannot be null. + The list is pessimistic because it may claim more or larger regions than actually changed. + + + + Gets a list of text changes that when applied to the old tree produce this tree. + + The old tree. Cannot be null. + The list of changes may be different than the original changes that produced this tree. + + + + Gets the location in terms of path, line and column for a given span. + + Span within the tree. + Cancellation token. + + that contains path, line and column information. + + The values are not affected by line mapping directives (#line). + + + + Gets the location in terms of path, line and column after applying source line mapping directives (#line). + + Span within the tree. + Cancellation token. + + A valid that contains path, line and column information. + + If the location path is mapped the resulting path is the path specified in the corresponding #line, + otherwise it's . + + + A location path is considered mapped if the first #line directive that precedes it and that + either specifies an explicit file path or is #line default exists and specifies an explicit path. + + + + + + + + + + + + Gets a for a . FileLinePositionSpans are used + primarily for diagnostics and source locations. + + The source to convert. + When the method returns, contains a boolean value indicating whether this span is considered hidden or not. + A resulting . + + + + Gets a boolean value indicating whether there are any hidden regions in the tree. + + True if there is at least one hidden region. + + + + Given the error code and the source location, get the warning state based on #pragma warning directives. + + Error code. + Source location. + + + + Gets a for the specified text . + + + + + Gets a list of all the diagnostics in the sub tree that has the specified node as its root. + + + This method does not filter diagnostics based on #pragmas and compiler options + like /nowarn, /warnaserror etc. + + + + + Gets a list of all the diagnostics associated with the token and any related trivia. + + + This method does not filter diagnostics based on #pragmas and compiler options + like /nowarn, /warnaserror etc. + + + + + Gets a list of all the diagnostics associated with the trivia. + + + This method does not filter diagnostics based on #pragmas and compiler options + like /nowarn, /warnaserror etc. + + + + + Gets a list of all the diagnostics in either the sub tree that has the specified node as its root or + associated with the token and its related trivia. + + + This method does not filter diagnostics based on #pragmas and compiler options + like /nowarn, /warnaserror etc. + + + + + Gets a list of all the diagnostics in the syntax tree. + + + This method does not filter diagnostics based on #pragmas and compiler options + like /nowarn, /warnaserror etc. + + + + + Represents a visitor that visits only the single CSharpSyntaxNode + passed into its Visit method and produces + a value of the type specified by the parameter. + + + The type of the return value this visitor's Visit method. + + + + Called when the visitor visits a IdentifierNameSyntax node. + + + Called when the visitor visits a QualifiedNameSyntax node. + + + Called when the visitor visits a GenericNameSyntax node. + + + Called when the visitor visits a TypeArgumentListSyntax node. + + + Called when the visitor visits a AliasQualifiedNameSyntax node. + + + Called when the visitor visits a PredefinedTypeSyntax node. + + + Called when the visitor visits a ArrayTypeSyntax node. + + + Called when the visitor visits a ArrayRankSpecifierSyntax node. + + + Called when the visitor visits a PointerTypeSyntax node. + + + Called when the visitor visits a FunctionPointerTypeSyntax node. + + + Called when the visitor visits a FunctionPointerParameterListSyntax node. + + + Called when the visitor visits a FunctionPointerCallingConventionSyntax node. + + + Called when the visitor visits a FunctionPointerUnmanagedCallingConventionListSyntax node. + + + Called when the visitor visits a FunctionPointerUnmanagedCallingConventionSyntax node. + + + Called when the visitor visits a NullableTypeSyntax node. + + + Called when the visitor visits a TupleTypeSyntax node. + + + Called when the visitor visits a TupleElementSyntax node. + + + Called when the visitor visits a OmittedTypeArgumentSyntax node. + + + Called when the visitor visits a RefTypeSyntax node. + + + Called when the visitor visits a ScopedTypeSyntax node. + + + Called when the visitor visits a ParenthesizedExpressionSyntax node. + + + Called when the visitor visits a TupleExpressionSyntax node. + + + Called when the visitor visits a PrefixUnaryExpressionSyntax node. + + + Called when the visitor visits a AwaitExpressionSyntax node. + + + Called when the visitor visits a PostfixUnaryExpressionSyntax node. + + + Called when the visitor visits a MemberAccessExpressionSyntax node. + + + Called when the visitor visits a ConditionalAccessExpressionSyntax node. + + + Called when the visitor visits a MemberBindingExpressionSyntax node. + + + Called when the visitor visits a ElementBindingExpressionSyntax node. + + + Called when the visitor visits a RangeExpressionSyntax node. + + + Called when the visitor visits a ImplicitElementAccessSyntax node. + + + Called when the visitor visits a BinaryExpressionSyntax node. + + + Called when the visitor visits a AssignmentExpressionSyntax node. + + + Called when the visitor visits a ConditionalExpressionSyntax node. + + + Called when the visitor visits a ThisExpressionSyntax node. + + + Called when the visitor visits a BaseExpressionSyntax node. + + + Called when the visitor visits a LiteralExpressionSyntax node. + + + Called when the visitor visits a MakeRefExpressionSyntax node. + + + Called when the visitor visits a RefTypeExpressionSyntax node. + + + Called when the visitor visits a RefValueExpressionSyntax node. + + + Called when the visitor visits a CheckedExpressionSyntax node. + + + Called when the visitor visits a DefaultExpressionSyntax node. + + + Called when the visitor visits a TypeOfExpressionSyntax node. + + + Called when the visitor visits a SizeOfExpressionSyntax node. + + + Called when the visitor visits a InvocationExpressionSyntax node. + + + Called when the visitor visits a ElementAccessExpressionSyntax node. + + + Called when the visitor visits a ArgumentListSyntax node. + + + Called when the visitor visits a BracketedArgumentListSyntax node. + + + Called when the visitor visits a ArgumentSyntax node. + + + Called when the visitor visits a ExpressionColonSyntax node. + + + Called when the visitor visits a NameColonSyntax node. + + + Called when the visitor visits a DeclarationExpressionSyntax node. + + + Called when the visitor visits a CastExpressionSyntax node. + + + Called when the visitor visits a AnonymousMethodExpressionSyntax node. + + + Called when the visitor visits a SimpleLambdaExpressionSyntax node. + + + Called when the visitor visits a RefExpressionSyntax node. + + + Called when the visitor visits a ParenthesizedLambdaExpressionSyntax node. + + + Called when the visitor visits a InitializerExpressionSyntax node. + + + Called when the visitor visits a ImplicitObjectCreationExpressionSyntax node. + + + Called when the visitor visits a ObjectCreationExpressionSyntax node. + + + Called when the visitor visits a WithExpressionSyntax node. + + + Called when the visitor visits a AnonymousObjectMemberDeclaratorSyntax node. + + + Called when the visitor visits a AnonymousObjectCreationExpressionSyntax node. + + + Called when the visitor visits a ArrayCreationExpressionSyntax node. + + + Called when the visitor visits a ImplicitArrayCreationExpressionSyntax node. + + + Called when the visitor visits a StackAllocArrayCreationExpressionSyntax node. + + + Called when the visitor visits a ImplicitStackAllocArrayCreationExpressionSyntax node. + + + Called when the visitor visits a QueryExpressionSyntax node. + + + Called when the visitor visits a QueryBodySyntax node. + + + Called when the visitor visits a FromClauseSyntax node. + + + Called when the visitor visits a LetClauseSyntax node. + + + Called when the visitor visits a JoinClauseSyntax node. + + + Called when the visitor visits a JoinIntoClauseSyntax node. + + + Called when the visitor visits a WhereClauseSyntax node. + + + Called when the visitor visits a OrderByClauseSyntax node. + + + Called when the visitor visits a OrderingSyntax node. + + + Called when the visitor visits a SelectClauseSyntax node. + + + Called when the visitor visits a GroupClauseSyntax node. + + + Called when the visitor visits a QueryContinuationSyntax node. + + + Called when the visitor visits a OmittedArraySizeExpressionSyntax node. + + + Called when the visitor visits a InterpolatedStringExpressionSyntax node. + + + Called when the visitor visits a IsPatternExpressionSyntax node. + + + Called when the visitor visits a ThrowExpressionSyntax node. + + + Called when the visitor visits a WhenClauseSyntax node. + + + Called when the visitor visits a DiscardPatternSyntax node. + + + Called when the visitor visits a DeclarationPatternSyntax node. + + + Called when the visitor visits a VarPatternSyntax node. + + + Called when the visitor visits a RecursivePatternSyntax node. + + + Called when the visitor visits a PositionalPatternClauseSyntax node. + + + Called when the visitor visits a PropertyPatternClauseSyntax node. + + + Called when the visitor visits a SubpatternSyntax node. + + + Called when the visitor visits a ConstantPatternSyntax node. + + + Called when the visitor visits a ParenthesizedPatternSyntax node. + + + Called when the visitor visits a RelationalPatternSyntax node. + + + Called when the visitor visits a TypePatternSyntax node. + + + Called when the visitor visits a BinaryPatternSyntax node. + + + Called when the visitor visits a UnaryPatternSyntax node. + + + Called when the visitor visits a ListPatternSyntax node. + + + Called when the visitor visits a SlicePatternSyntax node. + + + Called when the visitor visits a InterpolatedStringTextSyntax node. + + + Called when the visitor visits a InterpolationSyntax node. + + + Called when the visitor visits a InterpolationAlignmentClauseSyntax node. + + + Called when the visitor visits a InterpolationFormatClauseSyntax node. + + + Called when the visitor visits a GlobalStatementSyntax node. + + + Called when the visitor visits a BlockSyntax node. + + + Called when the visitor visits a LocalFunctionStatementSyntax node. + + + Called when the visitor visits a LocalDeclarationStatementSyntax node. + + + Called when the visitor visits a VariableDeclarationSyntax node. + + + Called when the visitor visits a VariableDeclaratorSyntax node. + + + Called when the visitor visits a EqualsValueClauseSyntax node. + + + Called when the visitor visits a SingleVariableDesignationSyntax node. + + + Called when the visitor visits a DiscardDesignationSyntax node. + + + Called when the visitor visits a ParenthesizedVariableDesignationSyntax node. + + + Called when the visitor visits a ExpressionStatementSyntax node. + + + Called when the visitor visits a EmptyStatementSyntax node. + + + Called when the visitor visits a LabeledStatementSyntax node. + + + Called when the visitor visits a GotoStatementSyntax node. + + + Called when the visitor visits a BreakStatementSyntax node. + + + Called when the visitor visits a ContinueStatementSyntax node. + + + Called when the visitor visits a ReturnStatementSyntax node. + + + Called when the visitor visits a ThrowStatementSyntax node. + + + Called when the visitor visits a YieldStatementSyntax node. + + + Called when the visitor visits a WhileStatementSyntax node. + + + Called when the visitor visits a DoStatementSyntax node. + + + Called when the visitor visits a ForStatementSyntax node. + + + Called when the visitor visits a ForEachStatementSyntax node. + + + Called when the visitor visits a ForEachVariableStatementSyntax node. + + + Called when the visitor visits a UsingStatementSyntax node. + + + Called when the visitor visits a FixedStatementSyntax node. + + + Called when the visitor visits a CheckedStatementSyntax node. + + + Called when the visitor visits a UnsafeStatementSyntax node. + + + Called when the visitor visits a LockStatementSyntax node. + + + Called when the visitor visits a IfStatementSyntax node. + + + Called when the visitor visits a ElseClauseSyntax node. + + + Called when the visitor visits a SwitchStatementSyntax node. + + + Called when the visitor visits a SwitchSectionSyntax node. + + + Called when the visitor visits a CasePatternSwitchLabelSyntax node. + + + Called when the visitor visits a CaseSwitchLabelSyntax node. + + + Called when the visitor visits a DefaultSwitchLabelSyntax node. + + + Called when the visitor visits a SwitchExpressionSyntax node. + + + Called when the visitor visits a SwitchExpressionArmSyntax node. + + + Called when the visitor visits a TryStatementSyntax node. + + + Called when the visitor visits a CatchClauseSyntax node. + + + Called when the visitor visits a CatchDeclarationSyntax node. + + + Called when the visitor visits a CatchFilterClauseSyntax node. + + + Called when the visitor visits a FinallyClauseSyntax node. + + + Called when the visitor visits a CompilationUnitSyntax node. + + + Called when the visitor visits a ExternAliasDirectiveSyntax node. + + + Called when the visitor visits a UsingDirectiveSyntax node. + + + Called when the visitor visits a NamespaceDeclarationSyntax node. + + + Called when the visitor visits a FileScopedNamespaceDeclarationSyntax node. + + + Called when the visitor visits a AttributeListSyntax node. + + + Called when the visitor visits a AttributeTargetSpecifierSyntax node. + + + Called when the visitor visits a AttributeSyntax node. + + + Called when the visitor visits a AttributeArgumentListSyntax node. + + + Called when the visitor visits a AttributeArgumentSyntax node. + + + Called when the visitor visits a NameEqualsSyntax node. + + + Called when the visitor visits a TypeParameterListSyntax node. + + + Called when the visitor visits a TypeParameterSyntax node. + + + Called when the visitor visits a ClassDeclarationSyntax node. + + + Called when the visitor visits a StructDeclarationSyntax node. + + + Called when the visitor visits a InterfaceDeclarationSyntax node. + + + Called when the visitor visits a RecordDeclarationSyntax node. + + + Called when the visitor visits a EnumDeclarationSyntax node. + + + Called when the visitor visits a DelegateDeclarationSyntax node. + + + Called when the visitor visits a EnumMemberDeclarationSyntax node. + + + Called when the visitor visits a BaseListSyntax node. + + + Called when the visitor visits a SimpleBaseTypeSyntax node. + + + Called when the visitor visits a PrimaryConstructorBaseTypeSyntax node. + + + Called when the visitor visits a TypeParameterConstraintClauseSyntax node. + + + Called when the visitor visits a ConstructorConstraintSyntax node. + + + Called when the visitor visits a ClassOrStructConstraintSyntax node. + + + Called when the visitor visits a TypeConstraintSyntax node. + + + Called when the visitor visits a DefaultConstraintSyntax node. + + + Called when the visitor visits a FieldDeclarationSyntax node. + + + Called when the visitor visits a EventFieldDeclarationSyntax node. + + + Called when the visitor visits a ExplicitInterfaceSpecifierSyntax node. + + + Called when the visitor visits a MethodDeclarationSyntax node. + + + Called when the visitor visits a OperatorDeclarationSyntax node. + + + Called when the visitor visits a ConversionOperatorDeclarationSyntax node. + + + Called when the visitor visits a ConstructorDeclarationSyntax node. + + + Called when the visitor visits a ConstructorInitializerSyntax node. + + + Called when the visitor visits a DestructorDeclarationSyntax node. + + + Called when the visitor visits a PropertyDeclarationSyntax node. + + + Called when the visitor visits a ArrowExpressionClauseSyntax node. + + + Called when the visitor visits a EventDeclarationSyntax node. + + + Called when the visitor visits a IndexerDeclarationSyntax node. + + + Called when the visitor visits a AccessorListSyntax node. + + + Called when the visitor visits a AccessorDeclarationSyntax node. + + + Called when the visitor visits a ParameterListSyntax node. + + + Called when the visitor visits a BracketedParameterListSyntax node. + + + Called when the visitor visits a ParameterSyntax node. + + + Called when the visitor visits a FunctionPointerParameterSyntax node. + + + Called when the visitor visits a IncompleteMemberSyntax node. + + + Called when the visitor visits a SkippedTokensTriviaSyntax node. + + + Called when the visitor visits a DocumentationCommentTriviaSyntax node. + + + Called when the visitor visits a TypeCrefSyntax node. + + + Called when the visitor visits a QualifiedCrefSyntax node. + + + Called when the visitor visits a NameMemberCrefSyntax node. + + + Called when the visitor visits a IndexerMemberCrefSyntax node. + + + Called when the visitor visits a OperatorMemberCrefSyntax node. + + + Called when the visitor visits a ConversionOperatorMemberCrefSyntax node. + + + Called when the visitor visits a CrefParameterListSyntax node. + + + Called when the visitor visits a CrefBracketedParameterListSyntax node. + + + Called when the visitor visits a CrefParameterSyntax node. + + + Called when the visitor visits a XmlElementSyntax node. + + + Called when the visitor visits a XmlElementStartTagSyntax node. + + + Called when the visitor visits a XmlElementEndTagSyntax node. + + + Called when the visitor visits a XmlEmptyElementSyntax node. + + + Called when the visitor visits a XmlNameSyntax node. + + + Called when the visitor visits a XmlPrefixSyntax node. + + + Called when the visitor visits a XmlTextAttributeSyntax node. + + + Called when the visitor visits a XmlCrefAttributeSyntax node. + + + Called when the visitor visits a XmlNameAttributeSyntax node. + + + Called when the visitor visits a XmlTextSyntax node. + + + Called when the visitor visits a XmlCDataSectionSyntax node. + + + Called when the visitor visits a XmlProcessingInstructionSyntax node. + + + Called when the visitor visits a XmlCommentSyntax node. + + + Called when the visitor visits a IfDirectiveTriviaSyntax node. + + + Called when the visitor visits a ElifDirectiveTriviaSyntax node. + + + Called when the visitor visits a ElseDirectiveTriviaSyntax node. + + + Called when the visitor visits a EndIfDirectiveTriviaSyntax node. + + + Called when the visitor visits a RegionDirectiveTriviaSyntax node. + + + Called when the visitor visits a EndRegionDirectiveTriviaSyntax node. + + + Called when the visitor visits a ErrorDirectiveTriviaSyntax node. + + + Called when the visitor visits a WarningDirectiveTriviaSyntax node. + + + Called when the visitor visits a BadDirectiveTriviaSyntax node. + + + Called when the visitor visits a DefineDirectiveTriviaSyntax node. + + + Called when the visitor visits a UndefDirectiveTriviaSyntax node. + + + Called when the visitor visits a LineDirectiveTriviaSyntax node. + + + Called when the visitor visits a LineDirectivePositionSyntax node. + + + Called when the visitor visits a LineSpanDirectiveTriviaSyntax node. + + + Called when the visitor visits a PragmaWarningDirectiveTriviaSyntax node. + + + Called when the visitor visits a PragmaChecksumDirectiveTriviaSyntax node. + + + Called when the visitor visits a ReferenceDirectiveTriviaSyntax node. + + + Called when the visitor visits a LoadDirectiveTriviaSyntax node. + + + Called when the visitor visits a ShebangDirectiveTriviaSyntax node. + + + Called when the visitor visits a NullableDirectiveTriviaSyntax node. + + + + Represents a visitor that visits only the single CSharpSyntaxNode + passed into its Visit method. + + + + Called when the visitor visits a IdentifierNameSyntax node. + + + Called when the visitor visits a QualifiedNameSyntax node. + + + Called when the visitor visits a GenericNameSyntax node. + + + Called when the visitor visits a TypeArgumentListSyntax node. + + + Called when the visitor visits a AliasQualifiedNameSyntax node. + + + Called when the visitor visits a PredefinedTypeSyntax node. + + + Called when the visitor visits a ArrayTypeSyntax node. + + + Called when the visitor visits a ArrayRankSpecifierSyntax node. + + + Called when the visitor visits a PointerTypeSyntax node. + + + Called when the visitor visits a FunctionPointerTypeSyntax node. + + + Called when the visitor visits a FunctionPointerParameterListSyntax node. + + + Called when the visitor visits a FunctionPointerCallingConventionSyntax node. + + + Called when the visitor visits a FunctionPointerUnmanagedCallingConventionListSyntax node. + + + Called when the visitor visits a FunctionPointerUnmanagedCallingConventionSyntax node. + + + Called when the visitor visits a NullableTypeSyntax node. + + + Called when the visitor visits a TupleTypeSyntax node. + + + Called when the visitor visits a TupleElementSyntax node. + + + Called when the visitor visits a OmittedTypeArgumentSyntax node. + + + Called when the visitor visits a RefTypeSyntax node. + + + Called when the visitor visits a ScopedTypeSyntax node. + + + Called when the visitor visits a ParenthesizedExpressionSyntax node. + + + Called when the visitor visits a TupleExpressionSyntax node. + + + Called when the visitor visits a PrefixUnaryExpressionSyntax node. + + + Called when the visitor visits a AwaitExpressionSyntax node. + + + Called when the visitor visits a PostfixUnaryExpressionSyntax node. + + + Called when the visitor visits a MemberAccessExpressionSyntax node. + + + Called when the visitor visits a ConditionalAccessExpressionSyntax node. + + + Called when the visitor visits a MemberBindingExpressionSyntax node. + + + Called when the visitor visits a ElementBindingExpressionSyntax node. + + + Called when the visitor visits a RangeExpressionSyntax node. + + + Called when the visitor visits a ImplicitElementAccessSyntax node. + + + Called when the visitor visits a BinaryExpressionSyntax node. + + + Called when the visitor visits a AssignmentExpressionSyntax node. + + + Called when the visitor visits a ConditionalExpressionSyntax node. + + + Called when the visitor visits a ThisExpressionSyntax node. + + + Called when the visitor visits a BaseExpressionSyntax node. + + + Called when the visitor visits a LiteralExpressionSyntax node. + + + Called when the visitor visits a MakeRefExpressionSyntax node. + + + Called when the visitor visits a RefTypeExpressionSyntax node. + + + Called when the visitor visits a RefValueExpressionSyntax node. + + + Called when the visitor visits a CheckedExpressionSyntax node. + + + Called when the visitor visits a DefaultExpressionSyntax node. + + + Called when the visitor visits a TypeOfExpressionSyntax node. + + + Called when the visitor visits a SizeOfExpressionSyntax node. + + + Called when the visitor visits a InvocationExpressionSyntax node. + + + Called when the visitor visits a ElementAccessExpressionSyntax node. + + + Called when the visitor visits a ArgumentListSyntax node. + + + Called when the visitor visits a BracketedArgumentListSyntax node. + + + Called when the visitor visits a ArgumentSyntax node. + + + Called when the visitor visits a ExpressionColonSyntax node. + + + Called when the visitor visits a NameColonSyntax node. + + + Called when the visitor visits a DeclarationExpressionSyntax node. + + + Called when the visitor visits a CastExpressionSyntax node. + + + Called when the visitor visits a AnonymousMethodExpressionSyntax node. + + + Called when the visitor visits a SimpleLambdaExpressionSyntax node. + + + Called when the visitor visits a RefExpressionSyntax node. + + + Called when the visitor visits a ParenthesizedLambdaExpressionSyntax node. + + + Called when the visitor visits a InitializerExpressionSyntax node. + + + Called when the visitor visits a ImplicitObjectCreationExpressionSyntax node. + + + Called when the visitor visits a ObjectCreationExpressionSyntax node. + + + Called when the visitor visits a WithExpressionSyntax node. + + + Called when the visitor visits a AnonymousObjectMemberDeclaratorSyntax node. + + + Called when the visitor visits a AnonymousObjectCreationExpressionSyntax node. + + + Called when the visitor visits a ArrayCreationExpressionSyntax node. + + + Called when the visitor visits a ImplicitArrayCreationExpressionSyntax node. + + + Called when the visitor visits a StackAllocArrayCreationExpressionSyntax node. + + + Called when the visitor visits a ImplicitStackAllocArrayCreationExpressionSyntax node. + + + Called when the visitor visits a QueryExpressionSyntax node. + + + Called when the visitor visits a QueryBodySyntax node. + + + Called when the visitor visits a FromClauseSyntax node. + + + Called when the visitor visits a LetClauseSyntax node. + + + Called when the visitor visits a JoinClauseSyntax node. + + + Called when the visitor visits a JoinIntoClauseSyntax node. + + + Called when the visitor visits a WhereClauseSyntax node. + + + Called when the visitor visits a OrderByClauseSyntax node. + + + Called when the visitor visits a OrderingSyntax node. + + + Called when the visitor visits a SelectClauseSyntax node. + + + Called when the visitor visits a GroupClauseSyntax node. + + + Called when the visitor visits a QueryContinuationSyntax node. + + + Called when the visitor visits a OmittedArraySizeExpressionSyntax node. + + + Called when the visitor visits a InterpolatedStringExpressionSyntax node. + + + Called when the visitor visits a IsPatternExpressionSyntax node. + + + Called when the visitor visits a ThrowExpressionSyntax node. + + + Called when the visitor visits a WhenClauseSyntax node. + + + Called when the visitor visits a DiscardPatternSyntax node. + + + Called when the visitor visits a DeclarationPatternSyntax node. + + + Called when the visitor visits a VarPatternSyntax node. + + + Called when the visitor visits a RecursivePatternSyntax node. + + + Called when the visitor visits a PositionalPatternClauseSyntax node. + + + Called when the visitor visits a PropertyPatternClauseSyntax node. + + + Called when the visitor visits a SubpatternSyntax node. + + + Called when the visitor visits a ConstantPatternSyntax node. + + + Called when the visitor visits a ParenthesizedPatternSyntax node. + + + Called when the visitor visits a RelationalPatternSyntax node. + + + Called when the visitor visits a TypePatternSyntax node. + + + Called when the visitor visits a BinaryPatternSyntax node. + + + Called when the visitor visits a UnaryPatternSyntax node. + + + Called when the visitor visits a ListPatternSyntax node. + + + Called when the visitor visits a SlicePatternSyntax node. + + + Called when the visitor visits a InterpolatedStringTextSyntax node. + + + Called when the visitor visits a InterpolationSyntax node. + + + Called when the visitor visits a InterpolationAlignmentClauseSyntax node. + + + Called when the visitor visits a InterpolationFormatClauseSyntax node. + + + Called when the visitor visits a GlobalStatementSyntax node. + + + Called when the visitor visits a BlockSyntax node. + + + Called when the visitor visits a LocalFunctionStatementSyntax node. + + + Called when the visitor visits a LocalDeclarationStatementSyntax node. + + + Called when the visitor visits a VariableDeclarationSyntax node. + + + Called when the visitor visits a VariableDeclaratorSyntax node. + + + Called when the visitor visits a EqualsValueClauseSyntax node. + + + Called when the visitor visits a SingleVariableDesignationSyntax node. + + + Called when the visitor visits a DiscardDesignationSyntax node. + + + Called when the visitor visits a ParenthesizedVariableDesignationSyntax node. + + + Called when the visitor visits a ExpressionStatementSyntax node. + + + Called when the visitor visits a EmptyStatementSyntax node. + + + Called when the visitor visits a LabeledStatementSyntax node. + + + Called when the visitor visits a GotoStatementSyntax node. + + + Called when the visitor visits a BreakStatementSyntax node. + + + Called when the visitor visits a ContinueStatementSyntax node. + + + Called when the visitor visits a ReturnStatementSyntax node. + + + Called when the visitor visits a ThrowStatementSyntax node. + + + Called when the visitor visits a YieldStatementSyntax node. + + + Called when the visitor visits a WhileStatementSyntax node. + + + Called when the visitor visits a DoStatementSyntax node. + + + Called when the visitor visits a ForStatementSyntax node. + + + Called when the visitor visits a ForEachStatementSyntax node. + + + Called when the visitor visits a ForEachVariableStatementSyntax node. + + + Called when the visitor visits a UsingStatementSyntax node. + + + Called when the visitor visits a FixedStatementSyntax node. + + + Called when the visitor visits a CheckedStatementSyntax node. + + + Called when the visitor visits a UnsafeStatementSyntax node. + + + Called when the visitor visits a LockStatementSyntax node. + + + Called when the visitor visits a IfStatementSyntax node. + + + Called when the visitor visits a ElseClauseSyntax node. + + + Called when the visitor visits a SwitchStatementSyntax node. + + + Called when the visitor visits a SwitchSectionSyntax node. + + + Called when the visitor visits a CasePatternSwitchLabelSyntax node. + + + Called when the visitor visits a CaseSwitchLabelSyntax node. + + + Called when the visitor visits a DefaultSwitchLabelSyntax node. + + + Called when the visitor visits a SwitchExpressionSyntax node. + + + Called when the visitor visits a SwitchExpressionArmSyntax node. + + + Called when the visitor visits a TryStatementSyntax node. + + + Called when the visitor visits a CatchClauseSyntax node. + + + Called when the visitor visits a CatchDeclarationSyntax node. + + + Called when the visitor visits a CatchFilterClauseSyntax node. + + + Called when the visitor visits a FinallyClauseSyntax node. + + + Called when the visitor visits a CompilationUnitSyntax node. + + + Called when the visitor visits a ExternAliasDirectiveSyntax node. + + + Called when the visitor visits a UsingDirectiveSyntax node. + + + Called when the visitor visits a NamespaceDeclarationSyntax node. + + + Called when the visitor visits a FileScopedNamespaceDeclarationSyntax node. + + + Called when the visitor visits a AttributeListSyntax node. + + + Called when the visitor visits a AttributeTargetSpecifierSyntax node. + + + Called when the visitor visits a AttributeSyntax node. + + + Called when the visitor visits a AttributeArgumentListSyntax node. + + + Called when the visitor visits a AttributeArgumentSyntax node. + + + Called when the visitor visits a NameEqualsSyntax node. + + + Called when the visitor visits a TypeParameterListSyntax node. + + + Called when the visitor visits a TypeParameterSyntax node. + + + Called when the visitor visits a ClassDeclarationSyntax node. + + + Called when the visitor visits a StructDeclarationSyntax node. + + + Called when the visitor visits a InterfaceDeclarationSyntax node. + + + Called when the visitor visits a RecordDeclarationSyntax node. + + + Called when the visitor visits a EnumDeclarationSyntax node. + + + Called when the visitor visits a DelegateDeclarationSyntax node. + + + Called when the visitor visits a EnumMemberDeclarationSyntax node. + + + Called when the visitor visits a BaseListSyntax node. + + + Called when the visitor visits a SimpleBaseTypeSyntax node. + + + Called when the visitor visits a PrimaryConstructorBaseTypeSyntax node. + + + Called when the visitor visits a TypeParameterConstraintClauseSyntax node. + + + Called when the visitor visits a ConstructorConstraintSyntax node. + + + Called when the visitor visits a ClassOrStructConstraintSyntax node. + + + Called when the visitor visits a TypeConstraintSyntax node. + + + Called when the visitor visits a DefaultConstraintSyntax node. + + + Called when the visitor visits a FieldDeclarationSyntax node. + + + Called when the visitor visits a EventFieldDeclarationSyntax node. + + + Called when the visitor visits a ExplicitInterfaceSpecifierSyntax node. + + + Called when the visitor visits a MethodDeclarationSyntax node. + + + Called when the visitor visits a OperatorDeclarationSyntax node. + + + Called when the visitor visits a ConversionOperatorDeclarationSyntax node. + + + Called when the visitor visits a ConstructorDeclarationSyntax node. + + + Called when the visitor visits a ConstructorInitializerSyntax node. + + + Called when the visitor visits a DestructorDeclarationSyntax node. + + + Called when the visitor visits a PropertyDeclarationSyntax node. + + + Called when the visitor visits a ArrowExpressionClauseSyntax node. + + + Called when the visitor visits a EventDeclarationSyntax node. + + + Called when the visitor visits a IndexerDeclarationSyntax node. + + + Called when the visitor visits a AccessorListSyntax node. + + + Called when the visitor visits a AccessorDeclarationSyntax node. + + + Called when the visitor visits a ParameterListSyntax node. + + + Called when the visitor visits a BracketedParameterListSyntax node. + + + Called when the visitor visits a ParameterSyntax node. + + + Called when the visitor visits a FunctionPointerParameterSyntax node. + + + Called when the visitor visits a IncompleteMemberSyntax node. + + + Called when the visitor visits a SkippedTokensTriviaSyntax node. + + + Called when the visitor visits a DocumentationCommentTriviaSyntax node. + + + Called when the visitor visits a TypeCrefSyntax node. + + + Called when the visitor visits a QualifiedCrefSyntax node. + + + Called when the visitor visits a NameMemberCrefSyntax node. + + + Called when the visitor visits a IndexerMemberCrefSyntax node. + + + Called when the visitor visits a OperatorMemberCrefSyntax node. + + + Called when the visitor visits a ConversionOperatorMemberCrefSyntax node. + + + Called when the visitor visits a CrefParameterListSyntax node. + + + Called when the visitor visits a CrefBracketedParameterListSyntax node. + + + Called when the visitor visits a CrefParameterSyntax node. + + + Called when the visitor visits a XmlElementSyntax node. + + + Called when the visitor visits a XmlElementStartTagSyntax node. + + + Called when the visitor visits a XmlElementEndTagSyntax node. + + + Called when the visitor visits a XmlEmptyElementSyntax node. + + + Called when the visitor visits a XmlNameSyntax node. + + + Called when the visitor visits a XmlPrefixSyntax node. + + + Called when the visitor visits a XmlTextAttributeSyntax node. + + + Called when the visitor visits a XmlCrefAttributeSyntax node. + + + Called when the visitor visits a XmlNameAttributeSyntax node. + + + Called when the visitor visits a XmlTextSyntax node. + + + Called when the visitor visits a XmlCDataSectionSyntax node. + + + Called when the visitor visits a XmlProcessingInstructionSyntax node. + + + Called when the visitor visits a XmlCommentSyntax node. + + + Called when the visitor visits a IfDirectiveTriviaSyntax node. + + + Called when the visitor visits a ElifDirectiveTriviaSyntax node. + + + Called when the visitor visits a ElseDirectiveTriviaSyntax node. + + + Called when the visitor visits a EndIfDirectiveTriviaSyntax node. + + + Called when the visitor visits a RegionDirectiveTriviaSyntax node. + + + Called when the visitor visits a EndRegionDirectiveTriviaSyntax node. + + + Called when the visitor visits a ErrorDirectiveTriviaSyntax node. + + + Called when the visitor visits a WarningDirectiveTriviaSyntax node. + + + Called when the visitor visits a BadDirectiveTriviaSyntax node. + + + Called when the visitor visits a DefineDirectiveTriviaSyntax node. + + + Called when the visitor visits a UndefDirectiveTriviaSyntax node. + + + Called when the visitor visits a LineDirectiveTriviaSyntax node. + + + Called when the visitor visits a LineDirectivePositionSyntax node. + + + Called when the visitor visits a LineSpanDirectiveTriviaSyntax node. + + + Called when the visitor visits a PragmaWarningDirectiveTriviaSyntax node. + + + Called when the visitor visits a PragmaChecksumDirectiveTriviaSyntax node. + + + Called when the visitor visits a ReferenceDirectiveTriviaSyntax node. + + + Called when the visitor visits a LoadDirectiveTriviaSyntax node. + + + Called when the visitor visits a ShebangDirectiveTriviaSyntax node. + + + Called when the visitor visits a NullableDirectiveTriviaSyntax node. + + + + Represents a that descends an entire graph + visiting each CSharpSyntaxNode and its child SyntaxNodes and s in depth-first order. + + + + + Returns true if the specified node represents a lambda. + + + + + Given a node that represents a lambda body returns a node that represents the lambda. + + + + + See SyntaxNode.GetCorrespondingLambdaBody. + + + + + Returns true if the specified represents a body of a lambda. + + + + + When queries are translated into expressions select and group-by expressions such that + 1) select/group-by expression is the same identifier as the "source" identifier and + 2) at least one Where or OrderBy clause but no other clause is present in the contained query body or + the expression in question is a group-by expression and the body has no clause + + do not translate into lambdas. + By "source" identifier we mean the identifier specified in the from clause that initiates the query or the query continuation that includes the body. + + The above condition can be derived from the language specification (chapter 7.16.2) as follows: + - In order for 7.16.2.5 "Select clauses" to be applicable the following conditions must hold: + - There has to be at least one clause in the body, otherwise the query is reduced into a final form by 7.16.2.3 "Degenerate query expressions". + - Only where and order-by clauses may be present in the query body, otherwise a transformation in 7.16.2.4 "From, let, where, join and orderby clauses" + produces pattern that doesn't match the requirements of 7.16.2.5. + + - In order for 7.16.2.6 "Groupby clauses" to be applicable the following conditions must hold: + - Only where and order-by clauses may be present in the query body, otherwise a transformation in 7.16.2.4 "From, let, where, join and orderby clauses" + produces pattern that doesn't match the requirements of 7.16.2.5. + + + + + In C# lambda bodies are expressions or block statements. In both cases it's a single node. + In VB a lambda body might be a sequence of nodes (statements). + We define this function to minimize differences between C# and VB implementation. + + + + + If the specified node represents a lambda returns a node (or nodes) that represent its body (bodies). + + + + + Compares content of two nodes ignoring lambda bodies and trivia. + + + + + "Pair lambda" is a synthesized lambda that creates an instance of an anonymous type representing a pair of values. + + + + + Returns true if the specified node is of a kind that could represent a closure scope -- that + is, a scope of a captured variable. + Doesn't check whether or not the node actually declares any captured variable. + + + + + Given a node that represents a variable declaration, lambda or a closure scope return the position to be used to calculate + the node's syntax offset with respect to its containing member. + + + + + A SyntaxReference implementation that lazily translates the result (CSharpSyntaxNode) of the + original syntax reference to a syntax reference for its NamespaceDeclarationSyntax. + + + + + this is a basic do-nothing implementation of a syntax reference + + + + + Gets the expression-body syntax from an expression-bodied member. The + given syntax must be for a member which could contain an expression-body. + + + + + Creates a new syntax token with all whitespace and end of line trivia replaced with + regularly formatted trivia. + + The token to normalize. + A sequence of whitespace characters that defines a single level of indentation. + If true the replaced trivia is elastic trivia. + + + + Return the identifier of an out declaration argument expression. + + + + + Creates a new syntax token with all whitespace and end of line trivia replaced with + regularly formatted trivia. + + The token to normalize. + An optional sequence of whitespace characters that defines a + single level of indentation. + An optional sequence of whitespace characters used for end of line. + If true the replaced trivia is elastic trivia. + + + + Creates a new syntax trivia list with all whitespace and end of line trivia replaced with + regularly formatted trivia. + + The trivia list to normalize. + A sequence of whitespace characters that defines a single level of indentation. + If true the replaced trivia is elastic trivia. + + + + Creates a new syntax trivia list with all whitespace and end of line trivia replaced with + regularly formatted trivia. + + The trivia list to normalize. + An optional sequence of whitespace characters that defines a + single level of indentation. + An optional sequence of whitespace characters used for end of line. + If true the replaced trivia is elastic trivia. + + + + Updates the given SimpleNameSyntax node with the given identifier token. + This function is a wrapper that calls WithIdentifier on derived syntax nodes. + + + + The given simple name updated with the given identifier. + + + + Returns true if the expression on the left-hand-side of an assignment causes the assignment to be a deconstruction. + + + + + If this declaration or identifier is part of a deconstruction, find the deconstruction. + If found, returns either an assignment expression or a foreach variable statement. + Returns null otherwise. + + + + + Visits all the ArrayRankSpecifiers of a typeSyntax, invoking an action on each one in turn. + + + + The argument that is passed to the action whenever it is invoked + + + Represents ~ token. + + + Represents ! token. + + + Represents $ token. + + This is a debugger special punctuation and not related to string interpolation. + + + + + Represents % token. + + + Represents ^ token. + + + Represents & token. + + + Represents * token. + + + Represents ( token. + + + Represents ) token. + + + Represents - token. + + + Represents + token. + + + Represents = token. + + + Represents { token. + + + Represents } token. + + + Represents [ token. + + + Represents ] token. + + + Represents | token. + + + Represents \ token. + + + Represents : token. + + + Represents ; token. + + + Represents " token. + + + Represents ' token. + + + Represents < token. + + + Represents , token. + + + Represents > token. + + + Represents . token. + + + Represents ? token. + + + Represents # token. + + + Represents / token. + + + Represents .. token. + + + Represents /> token. + + + Represents </ token. + + + Represents <!-- token. + + + Represents --> token. + + + Represents <![CDATA[ token. + + + Represents ]]> token. + + + Represents <? token. + + + Represents ?> token. + + + Represents || token. + + + Represents && token. + + + Represents -- token. + + + Represents ++ token. + + + Represents :: token. + + + Represents ?? token. + + + Represents -> token. + + + Represents != token. + + + Represents == token. + + + Represents => token. + + + Represents <= token. + + + Represents << token. + + + Represents <<= token. + + + Represents >= token. + + + Represents >> token. + + + Represents >>= token. + + + Represents /= token. + + + Represents *= token. + + + Represents |= token. + + + Represents &= token. + + + Represents += token. + + + Represents -= token. + + + Represents ^= token. + + + Represents %= token. + + + Represents ??= token. + + + Represents >>> token. + + + Represents >>>= token. + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents $" token. + + + Represents " token that is closing $". + + + Represents $@ or @$ token. + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents . + + + Represents _ token. + + + Represents that nothing was specified as a type argument. + For example Dictionary<,> which has as a child of + before and after the . + + + + + Represents that nothing was specified as an array size. + For example int[,] which has as a child of + before and after the . + + + + + Represents a token that comes after the end of a directive such as #endif. + + + Represents the end of a triple-slash documentation comment. + + + Represents the end of a file. + + + + Token for a whole interpolated string $""" ... { expr } ...""". This only exists in transient form during parsing. + + + + + This method is used to keep the code that generates binders in sync + with the code that searches for binders. We don't want the searcher + to skip over any nodes that could have associated binders, especially + if changes are made later. + + "Local binder" is a term that refers to binders that are + created by LocalBinderFactory. + + + + + Because the instruction cannot have any values on the stack before CLR execution + we limited it to assignments and conditional expressions in C# 7. + See https://github.com/dotnet/roslyn/issues/22046. + In C# 8 we relaxed + that by rewriting the code to move it to the statement level where the stack is empty. + + + + + Given an initializer expression infer the name of anonymous property or tuple element. + Returns default if unsuccessful + + + + + See if the expression is an invocation of a method named 'var', + I.e. something like "var(x, y)" or "var(x, (y, z))" or "var(1)". + We report an error when such an invocation is used in a certain syntactic contexts that + will require an lvalue because we may elect to support deconstruction + in the future. We need to ensure that we do not successfully interpret this as an invocation of a + ref-returning method named var. + + + + + An enumerator for diagnostic lists. + + + + + Moves the enumerator to the next diagnostic instance in the diagnostic list. + + Returns true if enumerator moved to the next diagnostic, false if the + enumerator was at the end of the diagnostic list. + + + + The current diagnostic that the enumerator is pointing at. + + + + + An interface representing a set of values of a specific type. During construction of the state machine + for pattern-matching, we track the set of values of each intermediate result that can reach each state. + That permits us to determine when tests can be eliminated either because they are impossible (and can be + replaced by an always-false test) or always true with the set of values that can reach that state (and + can be replaced by an always-true test). + + + + + Return the intersection of this value set with another. Both must have been created with the same . + + + + + Return this union of this value set with another. Both must have been created with the same . + + + + + Return the complement of this value set. + + + + + Test if the value set contains any values that satisfy the given relation with the given value. Supported values for + are for all supported types, and for numeric types we also support + , , , and + . + + + + + Test if all of the value in the set satisfy the given relation with the given value. Note that the empty set trivially satisfies this. + Because of that all four combinations of results from and + are possible: both true when the set is nonempty and all values satisfy the relation; both false when the set is nonempty and none of + the values satisfy the relation; all but not any when the set is empty; any but not all when the set is nonempty and some values satisfy + the relation and some do not. + + + + + Does this value set contain no values? + + + + + Produce a sample value contained in the set. Throws if the set is empty. If the set + contains values but we cannot produce a particular value (e.g. for the set `nint > int.MaxValue`), returns null. + + + + + An interface representing a set of values of a specific type. Like but strongly typed to . + + + + + Return the intersection of this value set with another. Both must have been created with the same . + + + + + Return this union of this value set with another. Both must have been created with the same . + + + + + Return the complement of this value set. + + + + + Test if the value set contains any values that satisfy the given relation with the given value. + + + + + Test if all of the value in the set satisfy the given relation with the given value. Note that the empty set trivially satisfies this. + Because of that all four combinations of results from and + are possible: both true when the set is nonempty and all values satisfy the relation; both false when the set is nonempty and none of + the values satisfy the relation; all but not any when the set is empty; any but not all when the set is nonempty and some values satisfy + the relation and some do not. + + + + + A value set factory, which can be used to create a value set instance. A given instance of + supports only one type for the value sets it can produce. + + + + + Returns a value set that includes any values that satisfy the given relation when compared to the given value. + + + + + Returns true iff the values are related according to the given relation. + + + + + Produce a random value set with the given expected size for testing. + + + + + Produce a random value for testing. + + + + + The set containing all values of the type. + + + + + The empty set of values. + + + + + A value set factory, which can be used to create a value set instance. Like but strongly + typed to . + + + + + Returns a value set that includes any values that satisfy the given relation when compared to the given value. + + + + + A collection of value set factory instances for built-in types. + + + + + A value set factory for boolean values. + + + + + The implementation of Next depends critically on the internal representation of an IEEE floating-point + number. Every bit sequence between the representation of 0 and MaxValue represents a distinct + value, and the integer representations are ordered by value the same as the floating-point numbers they represent. + + + + + Produce a string for testing purposes that is likely to be the same independent of platform and locale. + + + + + A value set that only supports equality and works by including or excluding specific values. + This is used for value set of because the language defines no + relational operators for it; such a set can be formed only by including explicitly mentioned + members (or the inverse, excluding them, by complementing the set). + + + + + In , then members are listed by inclusion. Otherwise all members + are assumed to be contained in the set unless excluded. + + + + + A value set factory that only supports equality and works by including or excluding specific values. + + + + + A type class providing primitive operations needed to support a value set for a floating-point type. + + + + + A "not a number" value for the floating-point type . + All NaN values are treated as equivalent. + + + + + A value set implementation for and . + + A floating-point type. + A typeclass supporting that floating-point type. + + + + A type class for values (of type ) that can be directly compared for equality + using . + + + + + Get the constant value of type from a . This method is shared among all + typeclasses for value sets. + + + + + Translate a numeric value of type into a . + + + + + Generate random values of type . + If the domain of is infinite (for example, a string type), + the parameter is used to identify the size of a restricted + domain. If the domain is finite (for example the numeric types), then + is ignored. + + + + + A type class providing the primitive operations needed to support a value set. + + the underlying primitive numeric type + + + + Get the constant value of type from a . This method is shared among all + typeclasses for value sets. + + + + + Translate a numeric value of type into a . + + + + + Compute the value of the binary relational operator on the given operands. + + + + + The smallest value of . + + + + + The largest value of . + + + + + The successor (next larger) value to a given value. The result is not defined + when is . + + + + + The predecessor (previous larger) value to a given value. The result is not defined + when is . + + + + + Produce a randomly-selected value for testing purposes. + + + + + Produce the zero value for the type. + + + + + A formatter for values of type . This is needed for testing because + the default ToString output for float and double changed between desktop and .net core, + and also because we want the string representation to be locale-independent. + + + + + A value of type nint may, in a 64-bit runtime, take on values less than . + A value set representing values of type nint groups them all together, so that it is not possible to + distinguish one such value from another. The flag is true when the set is considered + to contain all values less than (if any). + + + + + A value of type nint may, in a 64-bit runtime, take on values greater than . + A value set representing values of type nint groups them all together, so that it is not possible to + distinguish one such value from another. The flag is true when the set is considered + to contain all values greater than (if any). + + + + + A value of type nuint may, in a 64-bit runtime, take on values greater than . + A value set representing values of type nuint groups them all together, so that it is not possible to + distinguish one such value from another. The flag is true when the set is considered + to contain all values greater than (if any). + + + + + The implementation of a value set for an numeric type . + + + + + Add an interval to the end of the builder. + + + + + Produce a random value set for testing purposes. + + + + + A string representation for testing purposes. + + + + + The implementation of a value set factory of any numeric type , + parameterized by a type class + that provides the primitives for that type. + + + + + The implementation of Next depends critically on the internal representation of an IEEE floating-point + number. Every bit sequence between the representation of 0 and MaxValue represents a distinct + value, and the integer representations are ordered by value the same as the floating-point numbers they represent. + + + + + Produce a string for testing purposes that is likely to be the same independent of platform and locale. + + + + + Gets the expression-body syntax from an expression-bodied member. The + given syntax must be for a member which could contain an expression-body. + + + + <null> + + + <throw expression> + + + <switch expression> + + + local function attributes + + + extern local functions + + + (Location of symbol related to previous error) + + + (Location of symbol related to previous warning) + + + <!-- Badly formed XML comment ignored for member "{0}" --> + + + Badly formed XML file "{0}" cannot be included + + + Failed to insert some or all of included XML + + + Include tag is invalid + + + No matching elements were found for the following include tag + + + Missing file attribute + + + Missing path attribute + + + <global namespace> + + + generics + + + anonymous methods + + + module as an attribute target specifier + + + namespace alias qualifier + + + fixed size buffers + + + #pragma + + + static classes + + + readonly structs + + + partial types + + + async function + + + switch on boolean type + + + method group + + + anonymous method + + + lambda expression + + + collection + + + disposable + + + access modifiers on properties + + + extern alias + + + iterators + + + default operator + + + async streams + + + unmanaged constructed types + + + readonly members + + + default literal + + + private protected + + + tuple equality + + + nullable types + + + pattern matching + + + expression body property accessor + + + expression body constructor and destructor + + + throw expression + + + implicitly typed array + + + implicitly typed local variable + + + anonymous types + + + automatically implemented properties + + + readonly automatically implemented properties + + + object initializer + + + collection initializer + + + query expression + + + extension method + + + partial method + + + method + + + type + + + namespace + + + field + + + property + + + element + + + variable + + + label + + + event + + + type parameter + + + using alias + + + extern alias + + + constructor + + + foreach iteration variable + + + fixed variable + + + using variable + + + contravariant + + + contravariantly + + + covariant + + + covariantly + + + invariantly + + + dynamic + + + named argument + + + optional parameter + + + exception filter + + + type variance + + + parameter + + + return + + + The character(s) '{0}' cannot be used at this location. + + + Incorrect syntax was used in a comment. + + + An invalid character was found inside an entity reference. + + + Expected '>' or '/>' to close tag '{0}'. + + + An identifier was expected. + + + Invalid unicode character. + + + Whitespace is not allowed at this location. + + + The character '<' cannot be used in an attribute value. + + + Missing equals sign between attribute and attribute value. + + + Reference to undefined entity '{0}'. + + + A string literal was expected, but no opening quotation mark was found. + + + Missing closing quotation mark for string literal. + + + Non-ASCII quotations marks may not be used around string literals. + + + End tag was not expected at this location. + + + End tag '{0}' does not match the start tag '{1}'. + + + Expected an end tag for element '{0}'. + + + Required white space was missing. + + + Unexpected character at this location. + + + The literal string ']]>' is not allowed in element content. + + + Duplicate '{0}' attribute + + + Metadata file '{0}' could not be found + + + Metadata references are not supported. + + + Metadata file '{0}' could not be opened -- {1} + + + The type '{0}' is defined in an assembly that is not referenced. You must add a reference to assembly '{1}'. + + + The type '{0}' is defined in a module that has not been added. You must add the module '{1}'. + + + Could not write to output file '{0}' -- '{1}' + + + Program has more than one entry point defined. Compile with /main to specify the type that contains the entry point. + + + Operator '{0}' cannot be applied to operands of type '{1}' and '{2}' + + + Operator '{0}' cannot be applied to 'default' and operand of type '{1}' because it is a type parameter that is not known to be a reference type + + + Division by constant zero + + + Cannot apply indexing with [] to an expression of type '{0}' + + + Wrong number of indices inside []; expected {0} + + + Operator '{0}' cannot be applied to operand of type '{1}' + + + Operator '{0}' cannot be applied to operand '{1}' + + + Keyword 'this' is not valid in a static property, static method, or static field initializer + + + Keyword 'this' is not available in the current context + + + Omitting the type argument is not allowed in the current context + + + '{0}' has the wrong signature to be an entry point + + + Method has the wrong signature to be an entry point + + + Cannot implicitly convert type '{0}' to '{1}' + + + Cannot convert type '{0}' to '{1}' + + + Constant value '{0}' cannot be converted to a '{1}' + + + Operator '{0}' is ambiguous on operands of type '{1}' and '{2}' + + + Operator '{0}' is ambiguous on operands '{1}' and '{2}' + + + Operator '{0}' is ambiguous on an operand of type '{1}' + + + An out parameter cannot have the In attribute + + + Cannot convert null to '{0}' because it is a non-nullable value type + + + Cannot convert type '{0}' to '{1}' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion + + + Unexpected error writing debug information -- '{0}' + + + Inconsistent accessibility: return type '{1}' is less accessible than method '{0}' + + + Inconsistent accessibility: parameter type '{1}' is less accessible than method '{0}' + + + Inconsistent accessibility: field type '{1}' is less accessible than field '{0}' + + + Inconsistent accessibility: property type '{1}' is less accessible than property '{0}' + + + Inconsistent accessibility: indexer return type '{1}' is less accessible than indexer '{0}' + + + Inconsistent accessibility: parameter type '{1}' is less accessible than indexer '{0}' + + + Inconsistent accessibility: return type '{1}' is less accessible than operator '{0}' + + + Inconsistent accessibility: parameter type '{1}' is less accessible than operator '{0}' + + + Inconsistent accessibility: return type '{1}' is less accessible than delegate '{0}' + + + Inconsistent accessibility: parameter type '{1}' is less accessible than delegate '{0}' + + + Inconsistent accessibility: base class '{1}' is less accessible than class '{0}' + + + Inconsistent accessibility: base interface '{1}' is less accessible than interface '{0}' + + + '{0}': event property must have both add and remove accessors + + + '{0}': abstract event cannot use event accessor syntax + + + '{0}': event must be of a delegate type + + + The event '{0}' is never used + + + Event is never used + + + '{0}': instance event in interface cannot have initializer + + + The event '{0}' can only appear on the left hand side of += or -= (except when used from within the type '{1}') + + + An explicit interface implementation of an event must use event accessor syntax + + + '{0}': cannot override; '{1}' is not an event + + + An add or remove accessor must have a body + + + '{0}': abstract event cannot have initializer + + + The assembly name '{0}' is reserved and cannot be used as a reference in an interactive session + + + The enumerator name '{0}' is reserved and cannot be used + + + The as operator must be used with a reference type or nullable type ('{0}' is a non-nullable value type) + + + The 'l' suffix is easily confused with the digit '1' -- use 'L' for clarity + + + The 'l' suffix is easily confused with the digit '1' + + + The event '{0}' can only appear on the left hand side of += or -= + + + Constraints are not allowed on non-generic declarations + + + Type parameter declaration must be an identifier not a type + + + Type '{1}' already reserves a member called '{0}' with the same parameter types + + + The parameter name '{0}' is a duplicate + + + The namespace '{1}' already contains a definition for '{0}' + + + The type '{0}' already contains a definition for '{1}' + + + The name '{0}' does not exist in the current context + + + The name '{0}' does not exist in the current context (are you missing a reference to assembly '{1}'?) + + + '{0}' is an ambiguous reference between '{1}' and '{2}' + + + The using directive for '{0}' appeared previously in this namespace + + + Using directive appeared previously in this namespace + + + The modifier '{0}' is not valid for this item + + + The 'init' accessor is not valid on static members + + + More than one protection modifier + + + '{0}' hides inherited member '{1}'. Use the new keyword if hiding was intended. + + + Member hides inherited member; missing new keyword + + + A variable was declared with the same name as a variable in a base type. However, the new keyword was not used. This warning informs you that you should use new; the variable is declared as if new had been used in the declaration. + + + The member '{0}' does not hide an accessible member. The new keyword is not required. + + + Member does not hide an inherited member; new keyword is not required + + + The evaluation of the constant value for '{0}' involves a circular definition + + + Type '{1}' already defines a member called '{0}' with the same parameter types + + + A static member cannot be marked as '{0}' + + + A member '{0}' marked as override cannot be marked as new or virtual + + + '{0}' hides inherited member '{1}'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword. + + + Member hides inherited member; missing override keyword + + + '{0}': no suitable method found to override + + + A namespace cannot directly contain members such as fields, methods or statements + + + '{0}' does not contain a definition for '{1}' + + + '{0}' is a {1} but is used like a {2} + + + '{0}' is a {1}, which is not valid in the given context + + + An object reference is required for the non-static field, method, or property '{0}' + + + The call is ambiguous between the following methods or properties: '{0}' and '{1}' + + + '{0}' is inaccessible due to its protection level + + + No overload for '{0}' matches delegate '{1}' + + + An object of a type convertible to '{0}' is required + + + Since '{0}' returns void, a return keyword must not be followed by an object expression + + + A local variable or function named '{0}' is already defined in this scope + + + The left-hand side of an assignment must be a variable, property or indexer + + + '{0}': a static constructor must be parameterless + + + The expression being assigned to '{0}' must be constant + + + '{0}' is of type '{1}'. A const field of a reference type other than string can only be initialized with null. + + + A local or parameter named '{0}' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter + + + A 'using namespace' directive can only be applied to namespaces; '{0}' is a type not a namespace. Consider a 'using static' directive instead + + + A 'using static' directive can only be applied to types; '{0}' is a namespace not a type. Consider a 'using namespace' directive instead + + + A 'using static' directive cannot be used to declare an alias + + + No enclosing loop out of which to break or continue + + + The label '{0}' is a duplicate + + + The type '{0}' has no constructors defined + + + Cannot create an instance of the abstract type or interface '{0}' + + + A const field requires a value to be provided + + + Circular base type dependency involving '{0}' and '{1}' + + + The delegate '{0}' does not have a valid constructor + + + Method name expected + + + A constant value is expected + + + A switch expression or case label must be a bool, char, string, integral, enum, or corresponding nullable type in C# 6 and earlier. + + + A value of an integral type expected + + + The switch statement contains multiple cases with the label value '{0}' + + + A goto case is only valid inside a switch statement + + + The property or indexer '{0}' cannot be used in this context because it lacks the get accessor + + + The type caught or thrown must be derived from System.Exception + + + A throw statement with no arguments is not allowed outside of a catch clause + + + Control cannot leave the body of a finally clause + + + The label '{0}' shadows another label by the same name in a contained scope + + + No such label '{0}' within the scope of the goto statement + + + A previous catch clause already catches all exceptions of this or of a super type ('{0}') + + + Filter expression is a constant 'true', consider removing the filter + + + Filter expression is a constant 'true' + + + '{0}': not all code paths return a value + + + Unreachable code detected + + + Unreachable code detected + + + Control cannot fall through from one case label ('{0}') to another + + + This label has not been referenced + + + This label has not been referenced + + + Use of unassigned local variable '{0}' + + + Use of unassigned local variable '{0}' + + + Use of unassigned local variable + + + The variable '{0}' is declared but never used + + + Variable is declared but never used + + + The field '{0}' is never used + + + Field is never used + + + Use of possibly unassigned field '{0}' + + + Use of possibly unassigned field '{0}' + + + Use of possibly unassigned field + + + Use of possibly unassigned auto-implemented property '{0}' + + + Use of possibly unassigned auto-implemented property '{0}' + + + Use of possibly unassigned auto-implemented property + + + Field '{0}' must be fully assigned before control is returned to the caller. Consider updating to language version '{1}' to auto-default the field. + + + Field '{0}' must be fully assigned before control is returned to the caller. Consider updating to language version '{1}' to auto-default the field. + + + Fields of a struct must be fully assigned in a constructor before control is returned to the caller. Consider updating the language version to auto-default the field. + + + Type of conditional expression cannot be determined because '{0}' and '{1}' implicitly convert to one another + + + Type of conditional expression cannot be determined because there is no implicit conversion between '{0}' and '{1}' + + + A base class is required for a 'base' reference + + + Use of keyword 'base' is not valid in this context + + + Member '{0}' cannot be accessed with an instance reference; qualify it with a type name instead + + + The out parameter '{0}' must be assigned to before control leaves the current method + + + The out parameter '{0}' must be assigned to before control leaves the current method + + + An out parameter must be assigned to before control leaves the method + + + Invalid rank specifier: expected ',' or ']' + + + '{0}' cannot be extern and declare a body + + + '{0}' cannot be extern and have a constructor initializer + + + '{0}' cannot be both extern and abstract + + + Attribute constructor parameter '{0}' has type '{1}', which is not a valid attribute parameter type + + + An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type + + + Attribute constructor parameter '{0}' is optional, but no default parameter value was specified. + + + The given expression is always of the provided ('{0}') type + + + 'is' expression's given expression is always of the provided type + + + The given expression is never of the provided ('{0}') type + + + 'is' expression's given expression is never of the provided type + + + '{0}' is not a reference type as required by the lock statement + + + Use of null is not valid in this context + + + Use of default literal is not valid in this context + + + The 'this' object cannot be used before all of its fields have been assigned. Consider updating to language version '{0}' to auto-default the unassigned fields. + + + The 'this' object cannot be used before all of its fields have been assigned. Consider updating to language version '{0}' to auto-default the unassigned fields. + + + The 'this' object cannot be used in a constructor before all of its fields have been assigned. Consider updating the language version to auto-default the unassigned fields. + + + The __arglist construct is valid only within a variable argument method + + + The * or -> operator must be applied to a pointer + + + A pointer must be indexed by only one value + + + Using '{0}' as a ref or out value or taking its address may cause a runtime exception because it is a field of a marshal-by-reference class + + + Using a field of a marshal-by-reference class as a ref or out value or taking its address may cause a runtime exception + + + A static readonly field cannot be assigned to (except in a static constructor or a variable initializer) + + + A static readonly field cannot be used as a ref or out value (except in a static constructor) + + + Property or indexer '{0}' cannot be assigned to -- it is read only + + + Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement + + + foreach requires that the return type '{0}' of '{1}' must have a suitable public 'MoveNext' method and public 'Current' property + + + Asynchronous foreach requires that the return type '{0}' of '{1}' must have a suitable public 'MoveNextAsync' method and public 'Current' property + + + Only 65534 locals, including those generated by the compiler, are allowed + + + Cannot call an abstract base member: '{0}' + + + A property or indexer may not be passed as an out or ref parameter + + + Cannot take the address of, get the size of, or declare a pointer to a managed type ('{0}') + + + This takes the address of, gets the size of, or declares a pointer to a managed type ('{0}') + + + This takes the address of, gets the size of, or declares a pointer to a managed type + + + The type of a local declared in a fixed statement must be a pointer type + + + You must provide an initializer in a fixed or using statement declaration + + + Cannot take the address of the given expression + + + You can only take the address of an unfixed expression inside of a fixed statement initializer + + + You cannot use the fixed statement to take the address of an already fixed expression + + + The given expression cannot be used in a fixed statement + + + Pointers and fixed size buffers may only be used in an unsafe context + + + The return type of operator True or False must be bool + + + The operator '{0}' requires a matching operator '{1}' to also be defined + + + In order to be applicable as a short circuit operator a user-defined logical operator ('{0}') must have the same return type and parameter types + + + In order for '{0}' to be applicable as a short circuit operator, its declaring type '{1}' must define operator true and operator false + + + The variable '{0}' is assigned but its value is never used + + + Variable is assigned but its value is never used + + + The operation overflows at compile time in checked mode + + + Constant value '{0}' cannot be converted to a '{1}' (use 'unchecked' syntax to override) + + + A method with vararg cannot be generic, be in a generic type, or have a params parameter + + + The params parameter must be a single dimensional array + + + An __arglist expression may only appear inside of a call or new expression + + + Unsafe code may only appear if compiling with /unsafe + + + Ambiguity between '{0}' and '{1}' + + + Type and identifier are both required in a foreach statement + + + A params parameter must be the last parameter in a parameter list + + + '{0}' does not have a predefined size, therefore sizeof can only be used in an unsafe context + + + The type or namespace name '{0}' does not exist in the namespace '{1}' (are you missing an assembly reference?) + + + A field initializer cannot reference the non-static field, method, or property '{0}' + + + '{0}' cannot be sealed because it is not an override + + + '{0}': cannot override inherited member '{1}' because it is sealed + + + The operation in question is undefined on void pointers + + + The Conditional attribute is not valid on '{0}' because it is an override method + + + Local function '{0}' must be 'static' in order to use the Conditional attribute + + + Neither 'is' nor 'as' is valid on pointer types + + + Destructors and object.Finalize cannot be called directly. Consider calling IDisposable.Dispose if available. + + + The type or namespace name '{0}' could not be found (are you missing a using directive or an assembly reference?) + + + Cannot use a negative size with stackalloc + + + Cannot create an array with a negative size + + + Do not override object.Finalize. Instead, provide a destructor. + + + Do not directly call your base type Finalize method. It is called automatically from your destructor. + + + Indexing an array with a negative index (array indices always start at zero) + + + Indexing an array with a negative index + + + Possible unintended reference comparison; to get a value comparison, cast the left hand side to type '{0}' + + + Possible unintended reference comparison; left hand side needs cast + + + Possible unintended reference comparison; to get a value comparison, cast the right hand side to type '{0}' + + + Possible unintended reference comparison; right hand side needs cast + + + The right hand side of a fixed statement assignment may not be a cast expression + + + stackalloc may not be used in a catch or finally block + + + An __arglist parameter must be the last parameter in a parameter list + + + Missing partial modifier on declaration of type '{0}'; another partial declaration of this type exists + + + Partial declarations of '{0}' must be all classes, all record classes, all structs, all record structs, or all interfaces + + + Partial declarations of '{0}' have conflicting accessibility modifiers + + + Partial declarations of '{0}' must not specify different base classes + + + Partial declarations of '{0}' must have the same type parameter names in the same order + + + Partial declarations of '{0}' have inconsistent constraints for type parameter '{1}' + + + Cannot implicitly convert type '{0}' to '{1}'. An explicit conversion exists (are you missing a cast?) + + + The 'partial' modifier can only appear immediately before 'class', 'record', 'struct', 'interface', or a method return type. + + + Imported type '{0}' is invalid. It contains a circular base type dependency. + + + Use of unassigned out parameter '{0}' + + + Use of unassigned out parameter '{0}' + + + Use of unassigned out parameter + + + Array size cannot be specified in a variable declaration (try initializing with a 'new' expression) + + + The property or indexer '{0}' cannot be used in this context because the get accessor is inaccessible + + + The property or indexer '{0}' cannot be used in this context because the set accessor is inaccessible + + + The accessibility modifier of the '{0}' accessor must be more restrictive than the property or indexer '{1}' + + + Cannot specify accessibility modifiers for both accessors of the property or indexer '{0}' + + + '{0}': accessibility modifiers on accessors may only be used if the property or indexer has both a get and a set accessor + + + '{0}' does not implement interface member '{1}'. '{2}' is not public. + + + '{0}' does not implement the '{1}' pattern. '{2}' is ambiguous with '{3}'. + + + Type does not implement the collection pattern; members are ambiguous + + + '{0}' does not implement the '{1}' pattern. '{2}' is not a public instance or extension method. + + + Type does not implement the collection pattern; member is is not a public instance or extension method. + + + '{0}' does not implement the '{1}' pattern. '{2}' has the wrong signature. + + + Type does not implement the collection pattern; member has the wrong signature + + + Friend access was granted by '{0}', but the public key of the output assembly ('{1}') does not match that specified by the InternalsVisibleTo attribute in the granting assembly. + + + Friend access was granted by '{0}', but the strong name signing state of the output assembly does not match that of the granting assembly. + + + There is no defined ordering between fields in multiple declarations of partial struct '{0}'. To specify an ordering, all instance fields must be in the same declaration. + + + There is no defined ordering between fields in multiple declarations of partial struct + + + The type '{0}' cannot be declared const + + + Cannot create an instance of the variable type '{0}' because it does not have the new() constraint + + + Using the generic {1} '{0}' requires {2} type arguments + + + The type '{0}' may not be used as a type argument + + + The {1} '{0}' cannot be used with type arguments + + + The non-generic {1} '{0}' cannot be used with type arguments + + + '{2}' must be a non-abstract type with a public parameterless constructor in order to use it as parameter '{1}' in the generic type or method '{0}' + + + The type '{3}' cannot be used as type parameter '{2}' in the generic type or method '{0}'. There is no implicit reference conversion from '{3}' to '{1}'. + + + The type '{3}' cannot be used as type parameter '{2}' in the generic type or method '{0}'. The nullable type '{3}' does not satisfy the constraint of '{1}'. + + + The type '{3}' cannot be used as type parameter '{2}' in the generic type or method '{0}'. The nullable type '{3}' does not satisfy the constraint of '{1}'. Nullable types can not satisfy any interface constraints. + + + The type '{3}' cannot be used as type parameter '{2}' in the generic type or method '{0}'. There is no boxing conversion or type parameter conversion from '{3}' to '{1}'. + + + The type '{3}' cannot be used as type parameter '{2}' in the generic type or method '{0}'. There is no boxing conversion from '{3}' to '{1}'. + + + The parameter name '{0}' conflicts with an automatically-generated parameter name + + + The type or namespace name '{0}' could not be found in the global namespace (are you missing an assembly reference?) + + + The new() constraint must be the last constraint specified + + + '{0}': an entry point cannot be generic or in a generic type + + + An entry point cannot be generic or in a generic type + + + Cannot convert null to type parameter '{0}' because it could be a non-nullable value type. Consider using 'default({0})' instead. + + + Duplicate constraint '{0}' for type parameter '{1}' + + + The class type constraint '{0}' must come before any other constraints + + + '{1} {0}' has the wrong return type + + + Ref mismatch between '{0}' and delegate '{1}' + + + A constraint clause has already been specified for type parameter '{0}'. All of the constraints for a type parameter must be specified in a single where clause. + + + The type arguments for method '{0}' cannot be inferred from the usage. Try specifying the type arguments explicitly. + + + '{0}': a parameter, local variable, or local function cannot have the same name as a method type parameter + + + The type parameter '{0}' cannot be used with the 'as' operator because it does not have a class type constraint nor a 'class' constraint + + + The field '{0}' is assigned but its value is never used + + + Field is assigned but its value is never used + + + The '{0}' attribute is valid only on an indexer that is not an explicit interface member declaration + + + '{0}': an attribute argument cannot use type parameters + + + '{0}': an attribute type argument cannot use type parameters + + + Type '{0}' cannot be used in this context because it cannot be represented in metadata. + + + Type cannot be used in this context because it cannot be represented in metadata. + + + Type '{0}' cannot be used in this context because it cannot be represented in metadata. + + + '{0}': cannot provide arguments when creating an instance of a variable type + + + '{0}': an abstract type cannot be sealed or static + + + Ambiguous reference in cref attribute: '{0}'. Assuming '{1}', but could have also matched other overloads including '{2}'. + + + Ambiguous reference in cref attribute + + + '{0}': a reference to a volatile field will not be treated as volatile + + + A reference to a volatile field will not be treated as volatile + + + A volatile field should not normally be used as a ref or out value, since it will not be treated as volatile. There are exceptions to this, such as when calling an interlocked API. + + + Since '{1}' has the ComImport attribute, '{0}' must be extern or abstract + + + '{0}': a class with the ComImport attribute cannot specify a base class + + + The constraints for type parameter '{0}' of method '{1}' must match the constraints for type parameter '{2}' of interface method '{3}'. Consider using an explicit interface implementation instead. + + + The tuple element names in the signature of method '{0}' must match the tuple element names of interface method '{1}' (including on the return type). + + + The type name '{0}' does not exist in the type '{1}' + + + Cannot convert method group '{0}' to non-delegate type '{1}'. Did you intend to invoke the method? + + + Converting method group '{0}' to non-delegate type '{1}'. Did you intend to invoke the method? + + + Converting method group to non-delegate type + + + The extern alias '{0}' was not specified in a /reference option + + + Cannot use alias '{0}' with '::' since the alias references a type. Use '.' instead. + + + Alias '{0}' not found + + + The type '{1}' exists in both '{0}' and '{2}' + + + The namespace '{1}' in '{0}' conflicts with the type '{3}' in '{2}' + + + The namespace '{1}' in '{0}' conflicts with the imported type '{3}' in '{2}'. Using the namespace defined in '{0}'. + + + Namespace conflicts with imported type + + + The type '{1}' in '{0}' conflicts with the imported type '{3}' in '{2}'. Using the type defined in '{0}'. + + + Type conflicts with imported type + + + The type '{1}' in '{0}' conflicts with the imported namespace '{3}' in '{2}'. Using the type defined in '{0}'. + + + Type conflicts with imported namespace + + + The type '{1}' in '{0}' conflicts with the namespace '{3}' in '{2}' + + + An extern alias declaration must precede all other elements defined in the namespace + + + Defining an alias named 'global' is ill-advised since 'global::' always references the global namespace and not an alias + + + Defining an alias named 'global' is ill-advised + + + '{0}': a type cannot be both static and sealed + + + '{0}': abstract properties cannot have private accessors + + + Syntax error; value expected + + + Cannot modify the result of an unboxing conversion + + + Foreach cannot operate on a '{0}'. Did you intend to invoke the '{0}'? + + + The return type for ++ or -- operator must match the parameter type or be derived from the parameter type + + + The 'class', 'struct', 'unmanaged', 'notnull', and 'default' constraints cannot be combined or duplicated, and must be specified first in the constraints list. + + + '{0}': cannot specify both a constraint class and the 'class' or 'struct' constraint + + + '{0}': cannot specify both a constraint class and the 'unmanaged' constraint + + + The 'new()' constraint cannot be used with the 'struct' constraint + + + The type '{2}' must be a reference type in order to use it as parameter '{1}' in the generic type or method '{0}' + + + The type '{2}' must be a non-nullable value type in order to use it as parameter '{1}' in the generic type or method '{0}' + + + Circular constraint dependency involving '{0}' and '{1}' + + + Type parameter '{0}' inherits conflicting constraints '{1}' and '{2}' + + + Type parameter '{1}' has the 'struct' constraint so '{1}' cannot be used as a constraint for '{0}' + + + Ambiguous user defined conversions '{0}' and '{1}' when converting from '{2}' to '{3}' + + + The result of the expression is always 'null' of type '{0}' + + + The result of the expression is always 'null' + + + Cannot return 'this' by reference. + + + Cannot use attribute constructor '{0}' because it has 'in' parameters. + + + Constraints for override and explicit interface implementation methods are inherited from the base method, so they cannot be specified directly, except for either a 'class', or a 'struct' constraint. + + + The inherited members '{0}' and '{1}' have the same signature in type '{2}', so they cannot be overridden + + + Evaluation of the decimal constant expression failed + + + Comparing with null of type '{0}' always produces 'false' + + + Comparing with null of struct type always produces 'false' + + + Introducing a 'Finalize' method can interfere with destructor invocation. Did you intend to declare a destructor? + + + Introducing a 'Finalize' method can interfere with destructor invocation + + + This warning occurs when you create a class with a method whose signature is public virtual void Finalize. + + If such a class is used as a base class and if the deriving class defines a destructor, the destructor will override the base class Finalize method, ... + + + '{0}' should not have a params parameter since '{1}' does not + + + The 'goto case' value is not implicitly convertible to type '{0}' + + + The 'goto case' value is not implicitly convertible to the switch type + + + Method '{0}' cannot implement interface accessor '{1}' for type '{2}'. Use an explicit interface implementation. + + + The result of the expression is always '{0}' since a value of type '{1}' is never equal to 'null' of type '{2}' + + + The result of the expression is always the same since a value of this type is never equal to 'null' + + + The result of the expression is always '{0}' since a value of type '{1}' is never equal to 'null' of type '{2}' + + + The result of the expression is always the same since a value of this type is never equal to 'null' + + + Explicit interface implementation '{0}' matches more than one interface member. Which interface member is actually chosen is implementation-dependent. Consider using a non-explicit implementation instead. + + + Explicit interface implementation matches more than one interface member + + + '{0}' cannot declare a body because it is marked abstract + + + '{0}' must declare a body because it is not marked abstract, extern, or partial + + + '{0}' cannot be both abstract and sealed + + + The abstract {0} '{1}' cannot be marked virtual + + + The constant '{0}' cannot be marked static + + + '{0}': cannot override because '{1}' is not a function + + + '{0}': cannot override inherited member '{1}' because it is not marked virtual, abstract, or override + + + '{0}': cannot change access modifiers when overriding '{1}' inherited member '{2}' + + + '{0}': cannot change tuple element names when overriding inherited member '{1}' + + + '{0}': return type must be '{2}' to match overridden member '{1}' + + + '{0}': cannot derive from sealed type '{1}' + + + '{0}' is abstract but it is contained in non-abstract type '{1}' + + + '{0}': static constructor cannot have an explicit 'this' or 'base' constructor call + + + '{0}': access modifiers are not allowed on static constructors + + + Constructor '{0}' cannot call itself + + + Constructor '{0}' cannot call itself through another constructor + + + '{0}' has no base class and cannot call a base constructor + + + Predefined type '{0}' is not defined or imported + + + Predefined type '{0}' is not defined or imported + + + Predefined type '{0}' is declared in multiple referenced assemblies: '{1}' and '{2}' + + + '{0}': structs cannot call base class constructors + + + Struct member '{0}' of type '{1}' causes a cycle in the struct layout + + + Interfaces cannot contain instance fields + + + Interfaces cannot contain instance constructors + + + Type '{0}' in interface list is not an interface + + + '{0}' is already listed in interface list + + + '{0}' is already listed in the interface list on type '{2}' with different tuple element names, as '{1}'. + + + '{0}' is already listed in the interface list on type '{2}' as '{1}'. + + + Inherited interface '{1}' causes a cycle in the interface hierarchy of '{0}' + + + '{0}' hides inherited abstract member '{1}' + + + '{0}' does not implement inherited abstract member '{1}' + + + '{0}' does not implement interface member '{1}' + + + The class System.Object cannot have a base class or implement an interface + + + '{0}' in explicit interface declaration is not an interface + + + '{0}' in explicit interface declaration is not found among members of the interface that can be implemented + + + '{0}': containing type does not implement interface '{1}' + + + '{0}': explicit interface declaration can only be declared in a class, record, struct or interface + + + '{0}': member names cannot be the same as their enclosing type + + + '{0}': the enumerator value is too large to fit in its type + + + '{0}': cannot override because '{1}' is not a property + + + '{0}': cannot override because '{1}' does not have an overridable get accessor + + + '{0}': cannot override because '{1}' does not have an overridable set accessor + + + '{0}': property or indexer cannot have void type + + + '{0}': property or indexer must have at least one accessor + + + __arglist cannot have an argument of void type + + + '{0}' is a new virtual member in sealed type '{1}' + + + '{0}' adds an accessor not found in interface member '{1}' + + + Accessors '{0}' and '{1}' should both be init-only or neither + + + Explicit interface implementation '{0}' is missing accessor '{1}' + + + '{0}': user-defined conversions to or from an interface are not allowed + + + '{0}': user-defined conversions to or from a base type are not allowed + + + '{0}': user-defined conversions to or from a derived type are not allowed + + + User-defined operator cannot convert a type to itself + + + User-defined conversion must convert to or from the enclosing type + + + Duplicate user-defined conversion in type '{0}' + + + User-defined operator '{0}' must be declared static and public + + + The parameter type for ++ or -- operator must be the containing type + + + The parameter of a unary operator must be the containing type + + + One of the parameters of a binary operator must be the containing type + + + The first operand of an overloaded shift operator must have the same type as the containing type + + + Conversion, equality, or inequality operators declared in interfaces must be abstract or virtual + + + Enums cannot contain explicit parameterless constructors + + + '{0}': cannot override '{1}' because it is not supported by the language + + + '{0}' is not supported by the language + + + '{0}': cannot explicitly call operator or accessor + + + '{0}': cannot reference a type through an expression; try '{1}' instead + + + Name of destructor must match name of type + + + Only class types can contain destructors + + + Namespace '{1}' contains a definition conflicting with alias '{0}' + + + Alias '{0}' conflicts with {1} definition + + + The Conditional attribute is not valid on '{0}' because it is a constructor, destructor, operator, lambda expression, or explicit interface implementation + + + The Conditional attribute is not valid on '{0}' because its return type is not void + + + Duplicate '{0}' attribute + + + Duplicate '{0}' attribute in '{1}' + + + The Conditional attribute is not valid on interface members + + + User-defined operators cannot return void + + + '{0}': user-defined conversions to or from the dynamic type are not allowed + + + Invalid value for argument to '{0}' attribute + + + Parameter not valid for the specified unmanaged type. + + + Attribute parameter '{0}' must be specified. + + + Attribute parameter '{0}' or '{1}' must be specified. + + + Unmanaged type '{0}' not valid for fields. + + + Unmanaged type '{0}' is only valid for fields. + + + Attribute '{0}' is not valid on this declaration type. It is only valid on '{1}' declarations. + + + Floating-point constant is outside the range of type '{0}' + + + The Guid attribute must be specified with the ComImport attribute + + + Invalid value for named attribute argument '{0}' + + + The DllImport attribute must be specified on a method marked 'static' and 'extern' + + + Cannot update '{0}'; attribute '{1}' is missing. + + + The DllImport attribute cannot be applied to a method that is generic or contained in a generic method or type. + + + Field or property cannot be of type '{0}' + + + Field or auto-implemented property cannot be of type '{0}' unless it is an instance member of a ref struct. + + + Array elements cannot be of type '{0}' + + + '{0}' is obsolete + + + Type or member is obsolete + + + '{0}' is not an attribute class + + + '{0}' is not a valid named attribute argument. Named attribute arguments must be fields which are not readonly, static, or const, or read-write properties which are public and not static. + + + '{0}' is obsolete: '{1}' + + + Type or member is obsolete + + + '{0}' is obsolete: '{1}' + + + Indexers cannot have void type + + + '{0}': virtual or abstract members cannot be private + + + Can only use array initializer expressions to assign to array types. Try using a new expression instead. + + + Array initializers can only be used in a variable or field initializer. Try using a new expression instead. + + + '{0}': instance field in types marked with StructLayout(LayoutKind.Explicit) must have a FieldOffset attribute + + + Method, operator, or accessor '{0}' is marked external and has no attributes on it. Consider adding a DllImport attribute to specify the external implementation. + + + Method, operator, or accessor is marked external and has no attributes on it + + + '{0}': new protected member declared in sealed type + + + New protected member declared in sealed type + + + Conditional member '{0}' cannot implement interface member '{1}' in type '{2}' + + + '{0}' cannot implement interface member '{1}' in type '{2}' because it has an __arglist parameter + + + ref and out are not valid in this context + + + The argument to the '{0}' attribute must be a valid identifier + + + The FieldOffset attribute can only be placed on members of types marked with the StructLayout(LayoutKind.Explicit) + + + The FieldOffset attribute is not allowed on static or const fields + + + Attribute '{0}' is only valid on classes derived from System.Attribute + + + Possible mistaken empty statement + + + Possible mistaken empty statement + + + '{0}' duplicate named attribute argument + + + '{0}' cannot derive from special class '{1}' + + + Cannot specify the DefaultMember attribute on a type containing an indexer + + + '{0}' is a type not supported by the language + + + Field '{0}' is never assigned to, and will always have its default value {1} + + + Field is never assigned to, and will always have its default value + + + Bad array declarator: To declare a managed array the rank specifier precedes the variable's identifier. To declare a fixed size buffer field, use the fixed keyword before the field type. + + + Comparison to integral constant is useless; the constant is outside the range of type '{0}' + + + Comparison to integral constant is useless; the constant is outside the range of the type + + + Cannot apply attribute class '{0}' because it is abstract + + + '{0}' is not a valid named attribute argument because it is not a valid attribute parameter type + + + Missing compiler required member '{0}.{1}' + + + '{0}' is not a valid attribute location for this declaration. Valid attribute locations for this declaration are '{1}'. All attributes in this block will be ignored. + + + Not a valid attribute location for this declaration + + + '{0}' is not a recognized attribute location. Valid attribute locations for this declaration are '{1}'. All attributes in this block will be ignored. + + + Not a recognized attribute location + + + '{0}' overrides Object.Equals(object o) but does not override Object.GetHashCode() + + + Type overrides Object.Equals(object o) but does not override Object.GetHashCode() + + + '{0}' defines operator == or operator != but does not override Object.Equals(object o) + + + Type defines operator == or operator != but does not override Object.Equals(object o) + + + '{0}' defines operator == or operator != but does not override Object.GetHashCode() + + + Type defines operator == or operator != but does not override Object.GetHashCode() + + + Cannot specify the Out attribute on a ref parameter without also specifying the In attribute. + + + '{0}' cannot define an overloaded {1} that differs only on parameter modifiers '{2}' and '{3}' + + + Literal of type double cannot be implicitly converted to type '{1}'; use an '{0}' suffix to create a literal of this type + + + Assignment in conditional expression is always constant; did you mean to use == instead of = ? + + + Assignment in conditional expression is always constant + + + '{0}': new protected member declared in struct + + + Two indexers have different names; the IndexerName attribute must be used with the same name on every indexer within a type + + + A class with the ComImport attribute cannot have a user-defined constructor + + + Field cannot have void type + + + Member '{0}' overrides obsolete member '{1}'. Add the Obsolete attribute to '{0}'. + + + Member overrides obsolete member + + + System.Void cannot be used from C# -- use typeof(void) to get the void type object + + + Do not use 'System.ParamArrayAttribute'. Use the 'params' keyword instead. + + + Bitwise-or operator used on a sign-extended operand; consider casting to a smaller unsigned type first + + + Bitwise-or operator used on a sign-extended operand + + + The compiler implicitly widened and sign-extended a variable, and then used the resulting value in a bitwise OR operation. This can result in unexpected behavior. + + + '{0}': a volatile field cannot be of the type '{1}' + + + '{0}': a field cannot be both volatile and readonly + + + The modifier 'abstract' is not valid on fields. Try using a property instead. + + + '{0}' cannot implement '{1}' because it is not supported by the language + + + '{0}' explicit method implementation cannot implement '{1}' because it is an accessor + + + '{0}' interface marked with 'CoClassAttribute' not marked with 'ComImportAttribute' + + + Interface marked with 'CoClassAttribute' not marked with 'ComImportAttribute' + + + Conditional member '{0}' cannot have an out parameter + + + Accessor '{0}' cannot implement interface member '{1}' for type '{2}'. Use an explicit interface implementation. + + + The namespace alias qualifier '::' always resolves to a type or namespace so is illegal here. Consider using '.' instead. + + + Cannot derive from '{0}' because it is a type parameter + + + Duplicate type parameter '{0}' + + + Type parameter '{0}' has the same name as the type parameter from outer type '{1}' + + + Type parameter has the same name as the type parameter from outer type + + + Type parameter '{0}' has the same name as the type parameter from outer method '{1}' + + + Type parameter has the same type as the type parameter from outer method. + + + Type parameter '{0}' has the same name as the containing type, or method + + + '{0}' cannot implement both '{1}' and '{2}' because they may unify for some type parameter substitutions + + + '{1}' does not define type parameter '{0}' + + + '{0}' is not a valid constraint. A type used as a constraint must be an interface, a non-sealed class or a type parameter. + + + Constraint cannot be special class '{0}' + + + Inconsistent accessibility: constraint type '{1}' is less accessible than '{0}' + + + Cannot do non-virtual member lookup in '{0}' because it is a type parameter + + + Invalid constraint type. A type used as a constraint must be an interface, a non-sealed class or a type parameter. + + + '{0}': cannot declare instance members in a static class + + + '{1}': cannot derive from static class '{0}' + + + Static classes cannot have instance constructors + + + Static classes cannot contain destructors + + + Cannot create an instance of the static class '{0}' + + + Static class '{0}' cannot derive from type '{1}'. Static classes must derive from object. + + + '{0}': static classes cannot implement interfaces + + + '{0}': ref structs cannot implement interfaces + + + '{0}': static classes cannot contain user-defined operators + + + Cannot convert to static type '{0}' + + + '{0}': static classes cannot be used as constraints + + + '{0}': static types cannot be used as type arguments + + + '{0}': array elements cannot be of static type + + + '{0}': cannot declare indexers in a static class + + + '{0}': static types cannot be used as parameters + + + '{0}': static types cannot be used as parameters + + + Static types cannot be used as parameters + + + '{0}': static types cannot be used as return types + + + '{0}': static types cannot be used as return types + + + Static types cannot be used as return types + + + Cannot declare a variable of static type '{0}' + + + A throw statement with no arguments is not allowed in a finally clause that is nested inside the nearest enclosing catch clause + + + '{0}' is not a valid format specifier + + + Possibly incorrect assignment to local '{0}' which is the argument to a using or lock statement. The Dispose call or unlocking will happen on the original value of the local. + + + Possibly incorrect assignment to local which is the argument to a using or lock statement + + + Type '{0}' is defined in this assembly, but a type forwarder is specified for it + + + Cannot forward type '{0}' because it is a nested type of '{1}' + + + The type forwarder for type '{0}' in assembly '{1}' causes a cycle + + + The /moduleassemblyname option may only be specified when building a target type of 'module' + + + Assembly reference '{0}' is invalid and cannot be resolved + + + Invalid type specified as an argument for TypeForwardedTo attribute + + + '{0}' does not implement instance interface member '{1}'. '{2}' cannot implement the interface member because it is static. + + + '{0}' does not implement interface member '{1}'. '{2}' cannot implement an interface member because it is not public. + + + '{0}' does not implement interface member '{1}'. '{2}' cannot implement '{1}' because it does not have the matching return type of '{3}'. + + + '{0}' duplicate TypeForwardedToAttribute + + + A query body must end with a select clause or a group clause + + + Expected contextual keyword 'on' + + + Expected contextual keyword 'equals' + + + Expected contextual keyword 'by' + + + Invalid anonymous type member declarator. Anonymous type members must be declared with a member assignment, simple name or member access. + + + Invalid initializer member declarator + + + Inconsistent lambda parameter usage; parameter types must be all explicit or all implicit + + + A partial method cannot have the 'abstract' modifier + + + A partial method must be declared within a partial type + + + A partial method may not explicitly implement an interface method + + + Both partial method declarations must be extension methods or neither may be an extension method + + + A partial method may not have multiple defining declarations + + + A partial method may not have multiple implementing declarations + + + Both partial method declarations must use a params parameter or neither may use a params parameter + + + No defining declaration found for implementing declaration of partial method '{0}' + + + Both partial method declarations, '{0}' and '{1}', must use the same tuple element names. + + + Partial method declarations of '{0}' have inconsistent constraints for type parameter '{1}' + + + Cannot create delegate from method '{0}' because it is a partial method without an implementing declaration + + + Both partial method declarations must be static or neither may be static + + + Both partial method declarations must be unsafe or neither may be unsafe + + + Partial methods with only a defining declaration or removed conditional methods cannot be used in expression trees + + + Obsolete member '{0}' overrides non-obsolete member '{1}' + + + Obsolete member overrides non-obsolete member + + + The fully qualified name for '{0}' is too long for debug information. Compile without '/debug' option. + + + Fully qualified name is too long for debug information + + + Cannot assign {0} to an implicitly-typed variable + + + Implicitly-typed variables must be initialized + + + Implicitly-typed variables cannot have multiple declarators + + + Cannot initialize an implicitly-typed variable with an array initializer + + + Implicitly-typed local variables cannot be fixed + + + Implicitly-typed variables cannot be constant + + + Constructor '{0}' is marked external + + + Constructor is marked external + + + The contextual keyword 'var' may only appear within a local variable declaration or in script code + + + No best type found for implicitly-typed array + + + Cannot assign '{0}' to anonymous type property + + + An expression tree may not contain a base access + + + An expression tree may not contain a tuple == or != operator + + + An expression tree may not contain an assignment operator + + + An anonymous type cannot have multiple properties with the same name + + + A lambda expression with a statement body cannot be converted to an expression tree + + + Cannot convert lambda to an expression tree whose type argument '{0}' is not a delegate type + + + Cannot use anonymous type in a constant expression + + + The first operand of an 'is' or 'as' operator may not be a lambda expression, anonymous method, or method group. + + + The first operand of an 'as' operator may not be a tuple literal without a natural type. + + + An expression tree may not contain a multidimensional array initializer + + + Argument missing + + + Cannot use local variable '{0}' before it is declared + + + Type of '{0}' cannot be inferred since its initializer directly or indirectly refers to the definition. + + + Auto-implemented property '{0}' must be fully assigned before control is returned to the caller. Consider updating to language version '{1}' to auto-default the property. + + + Auto-implemented property '{0}' must be fully assigned before control is returned to the caller. Consider updating to language version '{1}' to auto-default the property. + + + An auto-implemented property must be fully assigned before control is returned to the caller. Consider updating the language version to auto-default the property. + + + Cannot use local variable '{0}' before it is declared. The declaration of the local variable hides the field '{1}'. + + + An expression tree lambda may not contain a coalescing operator with a null or default literal left-hand side + + + Identifier expected + + + ; expected + + + Syntax error, '{0}' expected + + + Duplicate '{0}' modifier + + + Property accessor already defined + + + Type byte, sbyte, short, ushort, int, uint, long, or ulong expected + + + Unrecognized escape sequence + + + Newline in constant + + + Empty character literal + + + Too many characters in character literal + + + Invalid number + + + A get or set accessor expected + + + An object, string, or class type expected + + + Named attribute argument expected + + + Catch clauses cannot follow the general catch clause of a try statement + + + Keyword 'this' or 'base' expected + + + Overloadable unary operator expected + + + Overloadable binary operator expected + + + Integral constant is too large + + + Type or namespace definition, or end-of-file expected + + + Member definition, statement, or end-of-file expected + + + Embedded statement cannot be a declaration or labeled statement + + + Preprocessor directive expected + + + Single-line comment or end-of-line expected + + + ) expected + + + #endif directive expected + + + Unexpected preprocessor directive + + + #error: '{0}' + + + #warning: '{0}' + + + #warning directive + + + Type expected + + + Cannot define/undefine preprocessor symbols after first token in file + + + Cannot use #r after first token in file + + + End-of-file found, '*/' expected + + + Merge conflict marker encountered + + + Do not use refout when using refonly. + + + Cannot compile net modules when using /refout or /refonly. + + + Overloadable operator expected + + + #endregion directive expected + + + Unterminated string literal + + + Preprocessor directives must appear as the first non-whitespace character on a line + + + Identifier expected; '{1}' is a keyword + + + { or ; expected + + + Cannot use more than one type in a for, using, fixed, or declaration statement + + + An add or remove accessor expected + + + Unexpected character '{0}' + + + Unexpected token '{0}' + + + '{0}': static classes cannot contain protected members + + + A previous catch clause already catches all exceptions. All non-exceptions thrown will be wrapped in a System.Runtime.CompilerServices.RuntimeWrappedException. + + + A previous catch clause already catches all exceptions + + + This warning is caused when a catch() block has no specified exception type after a catch (System.Exception e) block. The warning advises that the catch() block will not catch any exceptions. + + A catch() block after a catch (System.Exception e) block can ca ... + + + The operand of an increment or decrement operator must be a variable, property or indexer + + + '{0}' does not contain a definition for '{1}' and no accessible extension method '{1}' accepting a first argument of type '{0}' could be found (are you missing a using directive or an assembly reference?) + + + '{0}' does not contain a definition for '{1}' and no extension method '{1}' accepting a first argument of type '{0}' could be found (are you missing a using directive for '{2}'?) + + + Method '{0}' has a parameter modifier 'this' which is not on the first parameter + + + The parameter modifier '{0}' cannot be used with '{1}' + + + The first parameter of an extension method cannot be of type '{0}' + + + A parameter array cannot be used with 'this' modifier on an extension method + + + Extension method must be static + + + Extension method must be defined in a non-generic static class + + + A parameter can only have one '{0}' modifier + + + Extension methods must be defined in a top level static class; {0} is a nested class + + + Cannot define a new extension method because the compiler required type '{0}' cannot be found. Are you missing a reference to System.Core.dll? + + + Do not use 'System.Runtime.CompilerServices.ExtensionAttribute'. Use the 'this' keyword instead. + + + Do not use 'System.Runtime.CompilerServices.DynamicAttribute'. Use the 'dynamic' keyword instead. + + + The constructor call needs to be dynamically dispatched, but cannot be because it is part of a constructor initializer. Consider casting the dynamic arguments. + + + Extension method '{0}' defined on value type '{1}' cannot be used to create delegates + + + No overload for method '{0}' takes {1} arguments + + + Argument {0}: cannot convert from '{1}' to '{2}' + + + Source file '{0}' could not be opened -- {1} + + + Cannot link resource files when building a module + + + Resource identifier '{0}' has already been used in this assembly + + + Each linked resource and module must have a unique filename. Filename '{0}' is specified more than once in this assembly + + + The referenced file '{0}' is not an assembly + + + A ref or out value must be an assignable variable + + + Keyword 'base' is not available in a static method + + + Keyword 'base' is not available in the current context + + + } expected + + + { expected + + + 'in' expected + + + Invalid preprocessor expression + + + Invalid token '{0}' in class, record, struct, or interface member declaration + + + Method must have a return type + + + Invalid base type + + + Empty switch block + + + Empty switch block + + + Expected catch or finally + + + Invalid expression term '{0}' + + + A new expression requires an argument list or (), [], or {} after type + + + Elements defined in a namespace cannot be explicitly declared as private, protected, protected internal, or private protected + + + Expected ; or = (cannot specify constructor arguments in declaration) + + + A using clause must precede all other elements defined in the namespace except extern alias declarations + + + Overloaded binary operator '{0}' takes two parameters + + + Overloaded unary operator '{0}' takes one parameter + + + Invalid parameter type 'void' + + + The using alias '{0}' appeared previously in this namespace + + + Cannot access protected member '{0}' via a qualifier of type '{1}'; the qualifier must be of type '{2}' (or derived from it) + + + '{0}' cannot be added to this assembly because it already is an assembly + + + Property, indexer, or event '{0}' is not supported by the language; try directly calling accessor methods '{1}' or '{2}' + + + Property, indexer, or event '{0}' is not supported by the language; try directly calling accessor method '{1}' + + + Keyword 'void' cannot be used in this context + + + Indexers must have at least one parameter + + + Array type specifier, [], must appear before parameter name + + + Declaration is not valid; use '{0} operator <dest-type> (...' instead + + + Could not find '{0}' specified for Main method + + + '{0}' specified for Main method must be a non-generic class, record, struct, or interface + + + '{0}' does not have a suitable static 'Main' method + + + Cannot use '{0}' for Main method because it is imported + + + Outputs without source must have the /out option specified + + + Output directory could not be determined + + + Conflicting options specified: Win32 resource file; Win32 manifest + + + Conflicting options specified: Win32 resource file; Win32 icon + + + Error reading resource '{0}' -- '{1}' + + + Error writing to XML documentation file: {0} + + + XML comment has badly formed XML -- '{0}' + + + XML comment has badly formed XML + + + XML comment has a duplicate param tag for '{0}' + + + XML comment has a duplicate param tag + + + XML comment has a param tag for '{0}', but there is no parameter by that name + + + XML comment has a param tag, but there is no parameter by that name + + + XML comment on '{1}' has a paramref tag for '{0}', but there is no parameter by that name + + + XML comment has a paramref tag, but there is no parameter by that name + + + Parameter '{0}' has no matching param tag in the XML comment for '{1}' (but other parameters do) + + + Parameter has no matching param tag in the XML comment (but other parameters do) + + + XML comment has cref attribute '{0}' that could not be resolved + + + XML comment has cref attribute that could not be resolved + + + A stackalloc expression requires [] after type + + + The line number specified for #line directive is missing or invalid + + + Quoted file name, single-line comment or end-of-line expected + + + Quoted file name expected + + + #r is only allowed in scripts + + + foreach statement cannot operate on variables of type '{0}' because '{0}' does not contain a public instance or extension definition for '{1}' + + + Asynchronous foreach statement cannot operate on variables of type '{0}' because '{0}' does not contain a suitable public instance or extension definition for '{1}' + + + foreach statement cannot operate on variables of type '{0}' because '{0}' does not contain a public instance or extension definition for '{1}'. Did you mean 'await foreach' rather than 'foreach'? + + + Asynchronous foreach statement cannot operate on variables of type '{0}' because '{0}' does not contain a public instance or extension definition for '{1}'. Did you mean 'foreach' rather than 'await foreach'? + + + The body of an async-iterator method must contain a 'yield' statement. + + + The body of an async-iterator method must contain a 'yield' statement. Consider removing 'async' from the method declaration or adding a 'yield' statement. + + + A static local function cannot contain a reference to '{0}'. + + + A static local function cannot contain a reference to 'this' or 'base'. + + + Invalid type for parameter {0} in XML comment cref attribute: '{1}' + + + Invalid type for parameter in XML comment cref attribute + + + Invalid return type in XML comment cref attribute + + + Invalid return type in XML comment cref attribute + + + Error reading Win32 resources -- {0} + + + XML comment has syntactically incorrect cref attribute '{0}' + + + XML comment has syntactically incorrect cref attribute + + + Member modifier '{0}' must precede the member type and name + + + Array creation must have array size or array initializer + + + XML comment is not placed on a valid language element + + + XML comment is not placed on a valid language element + + + Unable to include XML fragment '{1}' of file '{0}' -- {2} + + + Unable to include XML fragment + + + Invalid XML include element -- {0} + + + Invalid XML include element + + + Missing XML comment for publicly visible type or member '{0}' + + + Missing XML comment for publicly visible type or member + + + The /doc compiler option was specified, but one or more constructs did not have comments. + + + Badly formed XML in included comments file -- '{0}' + + + Badly formed XML in included comments file + + + Delegate '{0}' does not take {1} arguments + + + Semicolon after method or accessor block is not valid + + + The return type of a method, delegate, or function pointer cannot be '{0}' + + + Compilation cancelled by user + + + Cannot make reference to variable of type '{0}' + + + Cannot assign to '{0}' because it is read-only + + + Cannot use '{0}' as a ref or out value because it is read-only + + + The RequiredAttribute attribute is not permitted on C# types + + + Modifiers cannot be placed on event accessor declarations + + + The params parameter cannot be declared as {0} + + + Cannot modify the return value of '{0}' because it is not a variable + + + The managed coclass wrapper class '{0}' for interface '{1}' cannot be found (are you missing an assembly reference?) + + + '{0}' is ambiguous between '{1}' and '{2}'. Either use '@{0}' or explicitly include the 'Attribute' suffix. + + + Argument {0} may not be passed with the '{1}' keyword + + + Option '{0}' overrides attribute '{1}' given in a source file or added module + + + Option overrides attribute given in a source file or added module + + + This warning occurs if the assembly attributes AssemblyKeyFileAttribute or AssemblyKeyNameAttribute found in source conflict with the /keyfile or /keycontainer command line option or key file name or key container specified in the Project Properties. + + + Invalid option '{0}' for /langversion. Use '/langversion:?' to list supported values. + + + Cannot create delegate with '{0}' because it or a method it overrides has a Conditional attribute + + + Cannot create temporary file -- {0} + + + Argument {0} must be passed with the '{1}' keyword + + + The yield statement cannot be used inside an anonymous method or lambda expression + + + Cannot return a value from an iterator. Use the yield return statement to return a value, or yield break to end the iteration. + + + Iterators cannot have ref, in or out parameters + + + The body of '{0}' cannot be an iterator block because '{1}' is not an iterator interface type + + + Cannot yield in the body of a finally clause + + + Method '{0}' with an iterator block must be 'async' to return '{1}' + + + Cannot yield a value in the body of a try block with a catch clause + + + Expression expected after yield return + + + Cannot use ref, out, or in parameter '{0}' inside an anonymous method, lambda expression, query expression, or local function + + + Unsafe code may not appear in iterators + + + Cannot yield a value in the body of a catch clause + + + Control cannot leave the body of an anonymous method or lambda expression + + + The suppression operator is not allowed in this context + + + Unrecognized #pragma directive + + + Unrecognized #pragma directive + + + Expected 'disable' or 'restore' + + + Expected 'disable' or 'restore' after #pragma warning + + + Cannot restore warning 'CS{0}' because it was disabled globally + + + Cannot restore warning because it was disabled globally + + + __arglist is not allowed in the parameter list of iterators + + + Iterators cannot have unsafe parameters or yield types + + + The managed coclass wrapper class signature '{0}' for interface '{1}' is not a valid class name signature + + + foreach statement cannot operate on variables of type '{0}' because it implements multiple instantiations of '{1}'; try casting to a specific interface instantiation + + + Asynchronous foreach statement cannot operate on variables of type '{0}' because it implements multiple instantiations of '{1}'; try casting to a specific interface instantiation + + + A fixed size buffer field must have the array size specifier after the field name + + + Fixed size buffer fields may only be members of structs + + + Not all code paths return a value in {0} of type '{1}' + + + Feature '{0}' is not part of the standardized ISO C# language specification, and may not be accepted by other compilers + + + Feature is not part of the standardized ISO C# language specification, and may not be accepted by other compilers + + + Keyword, identifier, or string expected after verbatim specifier: @ + + + A readonly field cannot be used as a ref or out value (except in a constructor) + + + Members of readonly field '{0}' cannot be used as a ref or out value (except in a constructor) + + + A readonly field cannot be assigned to (except in a constructor or init-only setter of the type in which the field is defined or a variable initializer) + + + Members of readonly field '{0}' cannot be modified (except in a constructor or a variable initializer) + + + Cannot use {0} '{1}' as a ref or out value because it is a readonly variable + + + Members of {0} '{1}' cannot be used as a ref or out value because it is a readonly variable + + + Cannot assign to {0} '{1}' or use it as the right hand side of a ref assignment because it is a readonly variable + + + Cannot assign to a member of {0} '{1}' or use it as the right hand side of a ref assignment because it is a readonly variable + + + Cannot return {0} '{1}' by writable reference because it is a readonly variable + + + Members of {0} '{1}' cannot be returned by writable reference because it is a readonly variable + + + Fields of static readonly field '{0}' cannot be assigned to (except in a static constructor or a variable initializer) + + + Fields of static readonly field '{0}' cannot be used as a ref or out value (except in a static constructor) + + + Cannot modify members of '{0}' because it is a '{1}' + + + Cannot use fields of '{0}' as a ref or out value because it is a '{1}' + + + Cannot assign to '{0}' because it is a '{1}' + + + Cannot use '{0}' as a ref or out value because it is a '{1}' + + + {0}. See also error CS{1}. + + + Warning is overriding an error + + + The compiler emits this warning when it overrides an error with a warning. For information about the problem, search for the error code mentioned. + + + Cannot convert {0} to type '{1}' because it is not a delegate type + + + Cannot convert {0} to type '{1}' because the parameter types do not match the delegate parameter types + + + Cannot convert {0} to type '{1}' because the return type does not match the delegate return type + + + Cannot convert {0} to intended delegate type because some of the return types in the block are not implicitly convertible to the delegate return type + + + Since this is an async method, the return expression must be of type '{0}' rather than 'Task<{0}>' + + + Cannot convert async {0} to delegate type '{1}'. An async {0} may return void, Task or Task<T>, none of which are convertible to '{1}'. + + + Fixed size buffer type must be one of the following: bool, byte, short, int, long, char, sbyte, ushort, uint, ulong, float or double + + + Fixed size buffer of length {0} and type '{1}' is too big + + + Fixed size buffers must have a length greater than zero + + + You cannot use fixed size buffers contained in unfixed expressions. Try using the fixed statement. + + + Attribute '{0}' is not valid on property or event accessors. It is only valid on '{1}' declarations. + + + Invalid search path '{0}' specified in '{1}' -- '{2}' + + + Invalid search path specified + + + __arglist is not valid in this context + + + params is not valid in this context + + + A namespace declaration cannot have modifiers or attributes + + + Invalid option '{0}' for /platform; must be anycpu, x86, Itanium, arm, arm64 or x64 + + + Anonymous methods, lambda expressions, query expressions, and local functions inside structs cannot access instance members of 'this'. Consider copying 'this' to a local variable outside the anonymous method, lambda expression, query expression, or local f ... + + + '{0}': type used in a using statement must be implicitly convertible to 'System.IDisposable'. + + + '{0}': type used in a using statement must be implicitly convertible to 'System.IDisposable'. Did you mean 'await using' rather than 'using'? + + + '{0}': type used in an asynchronous using statement must be implicitly convertible to 'System.IAsyncDisposable' or implement a suitable 'DisposeAsync' method. + + + '{0}': type used in an asynchronous using statement must be implicitly convertible to 'System.IAsyncDisposable' or implement a suitable 'DisposeAsync' method. Did you mean 'using' rather than 'await using'? + + + Parameter {0} must be declared with the '{1}' keyword + + + Parameter {0} should not be declared with the '{1}' keyword + + + Parameter {0} is declared as type '{1}{2}' but should be '{3}{4}' + + + Invalid extern alias for '/reference'; '{0}' is not a valid identifier + + + Invalid reference alias option: '{0}=' -- missing filename + + + You cannot redefine the global extern alias + + + Reference to type '{0}' claims it is defined in this assembly, but it is not defined in source or any added modules + + + Reference to type '{0}' claims it is defined in '{1}', but it could not be found + + + The predefined type '{0}' is defined in multiple assemblies in the global alias; using definition from '{1}' + + + Predefined type is defined in multiple assemblies in the global alias + + + This error occurs when a predefined system type such as System.Int32 is found in two assemblies. One way this can happen is if you are referencing mscorlib or System.Runtime.dll from two different places, such as trying to run two versions of the .NET Fram ... + + + Local '{0}' or its members cannot have their address taken and be used inside an anonymous method or lambda expression + + + Source file has exceeded the limit of 16,707,565 lines representable in the PDB; debug information will be incorrect + + + Source file has exceeded the limit of 16,707,565 lines representable in the PDB; debug information will be incorrect + + + Cannot convert anonymous method block without a parameter list to delegate type '{0}' because it has one or more out parameters + + + Attribute '{0}' is only valid on methods or attribute classes + + + Accessing a member on '{0}' may cause a runtime exception because it is a field of a marshal-by-reference class + + + Accessing a member on a field of a marshal-by-reference class may cause a runtime exception + + + This warning occurs when you try to call a method, property, or indexer on a member of a class that derives from MarshalByRefObject, and the member is a value type. Objects that inherit from MarshalByRefObject are typically intended to be marshaled by refe ... + + + '{0}' is not a valid warning number + + + Not a valid warning number + + + A number that was passed to the #pragma warning preprocessor directive was not a valid warning number. Verify that the number represents a warning, not an error. + + + Invalid number + + + Invalid number + + + Invalid filename specified for preprocessor directive. Filename is too long or not a valid filename. + + + Invalid filename specified for preprocessor directive + + + Invalid #pragma checksum syntax; should be #pragma checksum "filename" "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" "XXXX..." + + + Invalid #pragma checksum syntax + + + Single-line comment or end-of-line expected + + + Single-line comment or end-of-line expected after #pragma directive + + + Different checksum values given for '{0}' + + + Different #pragma checksum values given + + + Assembly reference '{0}' is invalid and cannot be resolved + + + Assembly reference is invalid and cannot be resolved + + + This warning indicates that an attribute, such as InternalsVisibleToAttribute, was not specified correctly. + + + Assuming assembly reference '{0}' used by '{1}' matches identity '{2}' of '{3}', you may need to supply runtime policy + + + Assuming assembly reference matches identity + + + The two assemblies differ in release and/or version number. For unification to occur, you must specify directives in the application's .config file, and you must provide the correct strong name of an assembly. + + + Assuming assembly reference '{0}' used by '{1}' matches identity '{2}' of '{3}', you may need to supply runtime policy + + + Assuming assembly reference matches identity + + + The two assemblies differ in release and/or version number. For unification to occur, you must specify directives in the application's .config file, and you must provide the correct strong name of an assembly. + + + Multiple assemblies with equivalent identity have been imported: '{0}' and '{1}'. Remove one of the duplicate references. + + + An assembly with the same simple name '{0}' has already been imported. Try removing one of the references (e.g. '{1}') or sign them to enable side-by-side. + + + Assembly '{0}' with identity '{1}' uses '{2}' which has a higher version than referenced assembly '{3}' with identity '{4}' + + + Fixed size buffers can only be accessed through locals or fields + + + XML comment has a duplicate typeparam tag for '{0}' + + + XML comment has a duplicate typeparam tag + + + XML comment has a typeparam tag for '{0}', but there is no type parameter by that name + + + XML comment has a typeparam tag, but there is no type parameter by that name + + + XML comment on '{1}' has a typeparamref tag for '{0}', but there is no type parameter by that name + + + XML comment has a typeparamref tag, but there is no type parameter by that name + + + Type parameter '{0}' has no matching typeparam tag in the XML comment on '{1}' (but other type parameters do) + + + Type parameter has no matching typeparam tag in the XML comment (but other type parameters do) + + + '{0}': type must be '{2}' to match overridden member '{1}' + + + Do not use 'System.Runtime.CompilerServices.FixedBuffer' attribute. Use the 'fixed' field modifier instead. + + + Do not use 'System.Runtime.CompilerServices.FixedBuffer' attribute on a property + + + Assignment made to same variable; did you mean to assign something else? + + + Assignment made to same variable + + + Comparison made to same variable; did you mean to compare something else? + + + Comparison made to same variable + + + Error opening Win32 resource file '{0}' -- '{1}' + + + Expression will always cause a System.NullReferenceException because the default value of '{0}' is null + + + Expression will always cause a System.NullReferenceException because the type's default value is null + + + Class '{0}' cannot have multiple base classes: '{1}' and '{2}' + + + Base class '{0}' must come before any interfaces + + + XML comment has cref attribute '{0}' that refers to a type parameter + + + XML comment has cref attribute that refers to a type parameter + + + Friend assembly reference '{0}' is invalid. InternalsVisibleTo declarations cannot have a version, culture, public key token, or processor architecture specified. + + + Friend assembly reference '{0}' is invalid. Strong-name signed assemblies must specify a public key in their InternalsVisibleTo declarations. + + + Cannot bind delegate to '{0}' because it is a member of 'System.Nullable<T>' + + + '{0}' does not contain a constructor that takes {1} arguments + + + Assembly and module attributes must precede all other elements defined in a file except using clauses and extern alias declarations + + + Expected expression + + + Invalid version {0} for /subsystemversion. The version must be 6.02 or greater for ARM or AppContainerExe, and 4.00 or greater otherwise + + + Embedded interop method '{0}' contains a body. + + + Warning level must be zero or greater + + + Invalid option '{0}' for /debug; must be 'portable', 'embedded', 'full' or 'pdbonly' + + + Invalid option '{0}'; Resource visibility must be either 'public' or 'private' + + + The type of the argument to the DefaultParameterValue attribute must match the parameter type + + + Argument of type '{0}' is not applicable for the DefaultParameterValue attribute + + + Duplicate initialization of member '{0}' + + + Member '{0}' cannot be initialized. It is not a field or property. + + + Static field or property '{0}' cannot be assigned in an object initializer + + + Members of readonly field '{0}' of type '{1}' cannot be assigned with an object initializer because it is of a value type + + + Members of property '{0}' of type '{1}' cannot be assigned with an object initializer because it is of a value type + + + Unsafe type '{0}' cannot be used in object creation + + + Element initializer cannot be empty + + + The best overloaded method match for '{0}' has wrong signature for the initializer element. The initializable Add must be an accessible instance method. + + + Cannot initialize type '{0}' with a collection initializer because it does not implement 'System.Collections.IEnumerable' + + + Error reading Win32 manifest file '{0}' -- '{1}' + + + Ignoring /win32manifest for module because it only applies to assemblies + + + Ignoring /win32manifest for module because it only applies to assemblies + + + '{0}' does not contain a definition for '{1}' and the best extension method overload '{2}' requires a receiver of type '{3}' + + + The range variable '{0}' has already been declared + + + The range variable '{0}' conflicts with a previous declaration of '{0}' + + + Cannot assign {0} to a range variable + + + Could not find an implementation of the query pattern for source type '{0}'. '{1}' not found. Consider explicitly specifying the type of the range variable '{2}'. + + + Could not find an implementation of the query pattern for source type '{0}'. '{1}' not found. Are you missing required assembly references or a using directive for 'System.Linq'? + + + Could not find an implementation of the query pattern for source type '{0}'. '{1}' not found. + + + The name '{0}' is not in scope on the left side of 'equals'. Consider swapping the expressions on either side of 'equals'. + + + The name '{0}' is not in scope on the right side of 'equals'. Consider swapping the expressions on either side of 'equals'. + + + Cannot pass the range variable '{0}' as an out or ref parameter + + + Multiple implementations of the query pattern were found for source type '{0}'. Ambiguous call to '{1}'. + + + The type of one of the expressions in the {0} clause is incorrect. Type inference failed in the call to '{1}'. + + + The type of the expression in the {0} clause is incorrect. Type inference failed in the call to '{1}'. + + + An expression of type '{0}' is not allowed in a subsequent from clause in a query expression with source type '{1}'. Type inference failed in the call to '{2}'. + + + An expression tree may not contain an unsafe pointer operation + + + An expression tree may not contain an anonymous method expression + + + An anonymous method expression cannot be converted to an expression tree + + + Range variable '{0}' cannot be assigned to -- it is read only + + + The range variable '{0}' cannot have the same name as a method type parameter + + + The contextual keyword 'var' cannot be used in a range variable declaration + + + The best overloaded Add method '{0}' for the collection initializer has some invalid arguments + + + An expression tree lambda may not contain a ref, in or out parameter + + + An expression tree lambda may not contain a method with variable arguments + + + An expression tree lambda may not contain a method group + + + The best overloaded method match '{0}' for the collection initializer element cannot be used. Collection initializer 'Add' methods cannot have ref or out parameters. + + + Non-invocable member '{0}' cannot be used like a method. + + + Member '{0}' implements interface member '{1}' in type '{2}'. There are multiple matches for the interface member at run-time. It is implementation dependent which method will be called. + + + Member implements interface member with multiple matches at run-time + + + This warning can be generated when two interface methods are differentiated only by whether a particular parameter is marked with ref or with out. It is best to change your code to avoid this warning because it is not obvious or guaranteed which method is ... + + + Member '{1}' overrides '{0}'. There are multiple override candidates at run-time. It is implementation dependent which method will be called. Please use a newer runtime. + + + Member overrides base member with multiple override candidates at run-time + + + Object and collection initializer expressions may not be applied to a delegate creation expression + + + '{0}' is of type '{1}'. The type specified in a constant declaration must be sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, string, an enum-type, or a reference-type. + + + Source file '{0}' could not be found. + + + Source file '{0}' specified multiple times + + + Source file specified multiple times + + + Missing file specification for '{0}' option + + + Command-line syntax error: Missing '{0}' for '{1}' option + + + Unrecognized option: '{0}' + + + No source files specified. + + + No source files specified + + + Expected a script (.csx file) but none specified + + + Error opening response file '{0}' + + + Cannot open '{0}' for writing -- '{1}' + + + Invalid image base number '{0}' + + + '{0}' is a binary file instead of a text file + + + Code page '{0}' is invalid or not installed + + + Algorithm '{0}' is not supported + + + Cannot specify /main if building a module or library + + + Invalid target type for /target: must specify 'exe', 'winexe', 'library', or 'module' + + + File name '{0}' is empty, contains invalid characters, has a drive specification without an absolute path, or is too long + + + Ignoring /noconfig option because it was specified in a response file + + + Ignoring /noconfig option because it was specified in a response file + + + Invalid file section alignment '{0}' + + + Invalid output name: {0} + + + Invalid debug information format: {0} + + + 'id#' syntax is no longer supported. Use '$id' instead. + + + Invalid name for a preprocessing symbol; '{0}' is not a valid identifier + + + Invalid name for a preprocessing symbol; not a valid identifier + + + Cannot create short filename '{0}' when a long filename with the same short filename already exists + + + A /reference option that declares an extern alias can only have one filename. To specify multiple aliases or filenames, use multiple /reference options. + + + Command-line syntax error: Missing ':<number>' for '{0}' option + + + The /pdb option requires that the /debug option also be used + + + An expression tree lambda may not contain a COM call with ref omitted on arguments + + + Command-line syntax error: Invalid Guid format '{0}' for option '{1}' + + + Command-line syntax error: Missing Guid for option '{1}' + + + Methods with variable arguments are not CLS-compliant + + + Methods with variable arguments are not CLS-compliant + + + Argument type '{0}' is not CLS-compliant + + + Argument type is not CLS-compliant + + + Return type of '{0}' is not CLS-compliant + + + Return type is not CLS-compliant + + + Type of '{0}' is not CLS-compliant + + + Type is not CLS-compliant + + + A public, protected, or protected internal variable must be of a type that is compliant with the Common Language Specification (CLS). + + + Identifier '{0}' differing only in case is not CLS-compliant + + + Identifier differing only in case is not CLS-compliant + + + Overloaded method '{0}' differing only in ref or out, or in array rank, is not CLS-compliant + + + Overloaded method differing only in ref or out, or in array rank, is not CLS-compliant + + + Overloaded method '{0}' differing only by unnamed array types is not CLS-compliant + + + Overloaded method differing only by unnamed array types is not CLS-compliant + + + This error occurs if you have an overloaded method that takes a jagged array and the only difference between the method signatures is the element type of the array. To avoid this error, consider using a rectangular array rather than a jagged array; use an ... + + + Identifier '{0}' is not CLS-compliant + + + Identifier is not CLS-compliant + + + '{0}': base type '{1}' is not CLS-compliant + + + Base type is not CLS-compliant + + + A base type was marked as not having to be compliant with the Common Language Specification (CLS) in an assembly that was marked as being CLS compliant. Either remove the attribute that specifies the assembly is CLS compliant or remove the attribute that i ... + + + '{0}': CLS-compliant interfaces must have only CLS-compliant members + + + CLS-compliant interfaces must have only CLS-compliant members + + + '{0}': only CLS-compliant members can be abstract + + + Only CLS-compliant members can be abstract + + + You must specify the CLSCompliant attribute on the assembly, not the module, to enable CLS compliance checking + + + You must specify the CLSCompliant attribute on the assembly, not the module, to enable CLS compliance checking + + + Added modules must be marked with the CLSCompliant attribute to match the assembly + + + Added modules must be marked with the CLSCompliant attribute to match the assembly + + + '{0}' cannot be marked as CLS-compliant because the assembly does not have a CLSCompliant attribute + + + Type or member cannot be marked as CLS-compliant because the assembly does not have a CLSCompliant attribute + + + '{0}' has no accessible constructors which use only CLS-compliant types + + + Type has no accessible constructors which use only CLS-compliant types + + + Arrays as attribute arguments is not CLS-compliant + + + Arrays as attribute arguments is not CLS-compliant + + + You cannot specify the CLSCompliant attribute on a module that differs from the CLSCompliant attribute on the assembly + + + You cannot specify the CLSCompliant attribute on a module that differs from the CLSCompliant attribute on the assembly + + + '{0}' cannot be marked as CLS-compliant because it is a member of non-CLS-compliant type '{1}' + + + Type cannot be marked as CLS-compliant because it is a member of non-CLS-compliant type + + + CLS compliance checking will not be performed on '{0}' because it is not visible from outside this assembly + + + CLS compliance checking will not be performed because it is not visible from outside this assembly + + + '{0}' does not need a CLSCompliant attribute because the assembly does not have a CLSCompliant attribute + + + Type or member does not need a CLSCompliant attribute because the assembly does not have a CLSCompliant attribute + + + CLSCompliant attribute has no meaning when applied to parameters. Try putting it on the method instead. + + + CLSCompliant attribute has no meaning when applied to parameters + + + CLSCompliant attribute has no meaning when applied to return types. Try putting it on the method instead. + + + CLSCompliant attribute has no meaning when applied to return types + + + Constraint type '{0}' is not CLS-compliant + + + Constraint type is not CLS-compliant + + + CLS-compliant field '{0}' cannot be volatile + + + CLS-compliant field cannot be volatile + + + '{0}' is not CLS-compliant because base interface '{1}' is not CLS-compliant + + + Type is not CLS-compliant because base interface is not CLS-compliant + + + 'await' requires that the type {0} have a suitable 'GetAwaiter' method + + + Cannot await '{0}' + + + 'await' requires that the return type '{0}' of '{1}.GetAwaiter()' have suitable 'IsCompleted', 'OnCompleted', and 'GetResult' members, and implement 'INotifyCompletion' or 'ICriticalNotifyCompletion' + + + 'await' requires that the type '{0}' have a suitable 'GetAwaiter' method. Are you missing a using directive for 'System'? + + + Cannot await 'void' + + + 'await' cannot be used as an identifier within an async method or lambda expression + + + '{0}' does not implement '{1}' + + + Since '{0}' is an async method that returns 'Task', a return keyword must not be followed by an object expression. Did you intend to return 'Task<T>'? + + + The return type of an async method must be void, Task, Task<T>, a task-like type, IAsyncEnumerable<T>, or IAsyncEnumerator<T> + + + A generic task-like return type was expected, but the type '{0}' found in 'AsyncMethodBuilder' attribute was not suitable. It must be an unbound generic type of arity one, and its containing type (if any) must be non-generic. + + + Cannot return an expression of type 'void' + + + __arglist is not allowed in the parameter list of async methods + + + 'await' cannot be used in an expression containing the type '{0}' + + + Async methods cannot have unsafe parameters or return types + + + Async methods cannot have ref, in or out parameters + + + The 'await' operator can only be used when contained within a method or lambda expression marked with the 'async' modifier + + + The 'await' operator can only be used within an async {0}. Consider marking this {0} with the 'async' modifier. + + + The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task<{0}>'. + + + The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'. + + + Cannot await in the body of a finally clause + + + Cannot await in a catch clause + + + Cannot await in the filter expression of a catch clause + + + Cannot await in the body of a lock statement + + + The 'await' operator cannot be used in a static script variable initializer. + + + Cannot await in an unsafe context + + + The 'async' modifier can only be used in methods that have a body. + + + Parameters or locals of type '{0}' cannot be declared in async methods or async lambda expressions. + + + foreach statement cannot operate on enumerators of type '{0}' in async or iterator methods because '{0}' is a ref struct. + + + Security attribute '{0}' cannot be applied to an Async method. + + + Async methods are not allowed in an Interface, Class, or Structure which has the 'SecurityCritical' or 'SecuritySafeCritical' attribute. + + + The 'await' operator may only be used in a query expression within the first collection expression of the initial 'from' clause or within the collection expression of a 'join' clause + + + This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread. + + + Async method lacks 'await' operators and will run synchronously + + + Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the 'await' operator to the result of the call. + + + Because this call is not awaited, execution of the current method continues before the call is completed + + + The current method calls an async method that returns a Task or a Task<TResult> and doesn't apply the await operator to the result. The call to the async method starts an asynchronous task. However, because no await operator is applied, the program continu ... + + + 'MethodImplOptions.Synchronized' cannot be applied to an async method + + + CallerLineNumberAttribute cannot be applied because there are no standard conversions from type '{0}' to type '{1}' + + + CallerFilePathAttribute cannot be applied because there are no standard conversions from type '{0}' to type '{1}' + + + CallerMemberNameAttribute cannot be applied because there are no standard conversions from type '{0}' to type '{1}' + + + The CallerLineNumberAttribute may only be applied to parameters with default values + + + The CallerFilePathAttribute may only be applied to parameters with default values + + + The CallerMemberNameAttribute may only be applied to parameters with default values + + + The CallerLineNumberAttribute applied to parameter '{0}' will have no effect because it applies to a member that is used in contexts that do not allow optional arguments + + + The CallerLineNumberAttribute will have no effect because it applies to a member that is used in contexts that do not allow optional arguments + + + The CallerFilePathAttribute applied to parameter '{0}' will have no effect because it applies to a member that is used in contexts that do not allow optional arguments + + + The CallerFilePathAttribute will have no effect because it applies to a member that is used in contexts that do not allow optional arguments + + + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect because it applies to a member that is used in contexts that do not allow optional arguments + + + The CallerMemberNameAttribute will have no effect because it applies to a member that is used in contexts that do not allow optional arguments + + + Program does not contain a static 'Main' method suitable for an entry point + + + An array initializer of length '{0}' is expected + + + A nested array initializer is expected + + + Invalid variance modifier. Only interface and delegate type parameters can be specified as variant. + + + Unexpected use of an aliased name + + + Unexpected use of a generic name + + + Unexpected use of an unbound generic name + + + Expressions and statements can only occur in a method body + + + An array access may not have a named argument specifier + + + This language feature ('{0}') is not yet implemented. + + + Default values are not valid in this context. + + + Error opening icon file {0} -- {1} + + + Error opening Win32 manifest file {0} -- {1} + + + Error building Win32 resources -- {0} + + + Optional parameters must appear after all required parameters + + + Cannot inherit interface '{0}' with the specified type parameters because it causes method '{1}' to contain overloads which differ only on ref and out + + + Partial declarations of '{0}' must have the same type parameter names and variance modifiers in the same order + + + Invalid variance: The type parameter '{1}' must be {3} valid on '{0}'. '{1}' is {2}. + + + Invalid variance: The type parameter '{1}' must be {3} valid on '{0}' unless language version '{4}' or greater is used. '{1}' is {2}. + + + '{0}': cannot derive from the dynamic type + + + '{0}': cannot implement a dynamic interface '{1}' + + + Constraint cannot be the dynamic type + + + Constraint cannot be a dynamic type '{0}' + + + One or more types required to compile a dynamic expression cannot be found. Are you missing a reference? + + + Name '{0}' exceeds the maximum length allowed in metadata. + + + Attributes are not valid in this context. + + + Attributes on lambda expressions require a parenthesized parameter list. + + + 'extern alias' is not valid in this context + + + Using '{0}' to test compatibility with '{1}' is essentially identical to testing compatibility with '{2}' and will succeed for all non-null values + + + Using 'is' to test compatibility with 'dynamic' is essentially identical to testing compatibility with 'Object' + + + Cannot use 'yield' in top-level script code + + + Cannot declare namespace in script code + + + Assembly and module attributes are not allowed in this context + + + Delegate '{0}' has no invoke method or an invoke method with a return type or parameter types that are not supported. + + + The entry point of the program is global code; ignoring '{0}' entry point. + + + The entry point of the program is global code; ignoring entry point + + + The second operand of an 'is' or 'as' operator may not be static type '{0}' + + + The second operand of an 'is' or 'as' operator may not be a static type + + + Inconsistent accessibility: event type '{1}' is less accessible than event '{0}' + + + Named argument specifications must appear after all fixed arguments have been specified. Please use language version {0} or greater to allow non-trailing named arguments. + + + Named argument specifications must appear after all fixed arguments have been specified in a dynamic invocation. + + + The best overload for '{0}' does not have a parameter named '{1}' + + + The delegate '{0}' does not have a parameter named '{1}' + + + Named argument '{0}' cannot be specified multiple times + + + Named argument '{0}' specifies a parameter for which a positional argument has already been given + + + Named argument '{0}' is used out-of-position but is followed by an unnamed argument + + + Cannot specify default parameter value in conjunction with DefaultParameterAttribute or OptionalAttribute + + + Default parameter value for '{0}' must be a compile-time constant + + + A ref or out parameter cannot have a default value + + + Cannot specify a default value for the 'this' parameter + + + Cannot specify a default value for a parameter array + + + A value of type '{0}' cannot be used as a default parameter because there are no standard conversions to type '{1}' + + + A value of type '{0}' cannot be used as default parameter for nullable parameter '{1}' because '{0}' is not a simple type + + + '{0}' is of type '{1}'. A default parameter value of a reference type other than string can only be initialized with null + + + The default value specified for parameter '{0}' will have no effect because it applies to a member that is used in contexts that do not allow optional arguments + + + The default value specified will have no effect because it applies to a member that is used in contexts that do not allow optional arguments + + + Error signing output with public key from file '{0}' -- {1} + + + Error signing output with public key from container '{0}' -- {1} + + + The typeof operator cannot be used on the dynamic type + + + The typeof operator cannot be used on a nullable reference type + + + An expression tree may not contain a dynamic operation + + + Async lambda expressions cannot be converted to expression trees + + + Cannot define a class or member that utilizes 'dynamic' because the compiler required type '{0}' cannot be found. Are you missing a reference? + + + Cannot pass null for friend assembly name + + + Key file '{0}' is missing the private key needed for signing + + + Public signing was specified and requires a public key, but no public key was specified. + + + Public signing is not supported for netmodules. + + + Delay signing was specified and requires a public key, but no public key was specified + + + Delay signing was specified and requires a public key, but no public key was specified + + + The specified version string does not conform to the required format - major[.minor[.build[.revision]]] + + + The specified version string contains wildcards, which are not compatible with determinism. Either remove wildcards from the version string, or disable determinism for this compilation + + + The specified version string does not conform to the required format - major.minor.build.revision (without wildcards) + + + The specified version string does not conform to the recommended format - major.minor.build.revision + + + The specified version string does not conform to the recommended format - major.minor.build.revision + + + Executables cannot be satellite assemblies; culture should always be empty + + + There is no argument given that corresponds to the required parameter '{0}' of '{1}' + + + The command line switch '{0}' is not yet implemented and was ignored. + + + Command line switch is not yet implemented + + + Failed to emit module '{0}': {1} + + + Cannot use fixed local '{0}' inside an anonymous method, lambda expression, or query expression + + + An expression tree may not contain a named argument specification + + + An expression tree may not contain a call or invocation that uses optional arguments + + + An expression tree may not contain an indexed property + + + Indexed property '{0}' has non-optional arguments which must be provided + + + Indexed property '{0}' must have all arguments optional + + + Instance of type '{0}' cannot be used inside a nested function, query expression, iterator block or async method + + + First argument to a security attribute must be a valid SecurityAction + + + Security attribute '{0}' has an invalid SecurityAction value '{1}' + + + SecurityAction value '{0}' is invalid for security attributes applied to an assembly + + + SecurityAction value '{0}' is invalid for security attributes applied to a type or a method + + + SecurityAction value '{0}' is invalid for PrincipalPermission attribute + + + An expression tree may not contain '{0}' + + + Unable to resolve file path '{0}' specified for the named argument '{1}' for PermissionSet attribute + + + Error reading file '{0}' specified for the named argument '{1}' for PermissionSet attribute: '{2}' + + + The type name '{0}' could not be found in the global namespace. This type has been forwarded to assembly '{1}' Consider adding a reference to that assembly. + + + The type name '{0}' could not be found in the namespace '{1}'. This type has been forwarded to assembly '{2}' Consider adding a reference to that assembly. + + + The type name '{0}' could not be found. This type has been forwarded to assembly '{1}'. Consider adding a reference to that assembly. + + + Assemblies '{0}' and '{1}' refer to the same metadata but only one is a linked reference (specified using /link option); consider removing one of the references. + + + The best overloaded Add method '{0}' for the collection initializer element is obsolete. + + + The best overloaded Add method for the collection initializer element is obsolete + + + The best overloaded Add method '{0}' for the collection initializer element is obsolete. {1} + + + The best overloaded Add method for the collection initializer element is obsolete + + + The best overloaded Add method '{0}' for the collection initializer element is obsolete. {1} + + + Security attribute '{0}' is not valid on this declaration type. Security attributes are only valid on assembly, type and method declarations. + + + Cannot use an expression of type '{0}' as an argument to a dynamically dispatched operation. + + + Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type. + + + Cannot use a method group as an argument to a dynamically dispatched operation. Did you intend to invoke the method? + + + The call to method '{0}' needs to be dynamically dispatched, but cannot be because it is part of a base access expression. Consider casting the dynamic arguments or eliminating the base access. + + + Query expressions over source type 'dynamic' or with a join sequence of type 'dynamic' are not allowed + + + The indexer access needs to be dynamically dispatched, but cannot be because it is part of a base access expression. Consider casting the dynamic arguments or eliminating the base access. + + + The dynamically dispatched call to method '{0}' may fail at runtime because one or more applicable overloads are conditional methods. + + + Dynamically dispatched call may fail at runtime because one or more applicable overloads are conditional methods + + + '{0}' has no applicable method named '{1}' but appears to have an extension method by that name. Extension methods cannot be dynamically dispatched. Consider casting the dynamic arguments or calling the extension method without the extension method syntax. + + + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. + + + The CallerMemberNameAttribute will have no effect; it is overridden by the CallerFilePathAttribute + + + The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerLineNumberAttribute. + + + The CallerMemberNameAttribute will have no effect; it is overridden by the CallerLineNumberAttribute + + + The CallerFilePathAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerLineNumberAttribute. + + + The CallerFilePathAttribute will have no effect; it is overridden by the CallerLineNumberAttribute + + + Expression must be implicitly convertible to Boolean or its type '{0}' must define operator '{1}'. + + + '{0}' cannot implement '{1}' because '{2}' is a Windows Runtime event and '{3}' is a regular .NET event. + + + Call System.IDisposable.Dispose() on allocated instance of {0} before all references to it are out of scope. + + + Call System.IDisposable.Dispose() on allocated instance before all references to it are out of scope + + + Allocated instance of {0} is not disposed along all exception paths. Call System.IDisposable.Dispose() before all references to it are out of scope. + + + Allocated instance is not disposed along all exception paths + + + Object '{0}' can be disposed more than once. + + + Object can be disposed more than once + + + Interop type '{0}' cannot be embedded. Use the applicable interface instead. + + + Type '{0}' cannot be embedded because it is a nested type. Consider setting the 'Embed Interop Types' property to false. + + + Type '{0}' cannot be embedded because it has a generic argument. Consider setting the 'Embed Interop Types' property to false. + + + Embedded interop struct '{0}' can contain only public instance fields. + + + A Windows Runtime event may not be passed as an out or ref parameter. + + + Source interface '{0}' is missing method '{1}' which is required to embed event '{2}'. + + + Interface '{0}' has an invalid source interface which is required to embed event '{1}'. + + + Interop type '{0}' cannot be embedded because it is missing the required '{1}' attribute. + + + Cannot embed interop types from assembly '{0}' because it is missing the '{1}' attribute. + + + Cannot embed interop types from assembly '{0}' because it is missing either the '{1}' attribute or the '{2}' attribute. + + + Cannot embed interop type '{0}' found in both assembly '{1}' and '{2}'. Consider setting the 'Embed Interop Types' property to false. + + + Embedding the interop type '{0}' from assembly '{1}' causes a name clash in the current assembly. Consider setting the 'Embed Interop Types' property to false. + + + A reference was created to embedded interop assembly '{0}' because of an indirect reference to that assembly created by assembly '{1}'. Consider changing the 'Embed Interop Types' property on either assembly. + + + A reference was created to embedded interop assembly because of an indirect assembly reference + + + You have added a reference to an assembly using /link (Embed Interop Types property set to True). This instructs the compiler to embed interop type information from that assembly. However, the compiler cannot embed interop type information from that assemb ... + + + Type '{0}' from assembly '{1}' cannot be used across assembly boundaries because it has a generic type argument that is an embedded interop type. + + + Cannot find the interop type that matches the embedded interop type '{0}'. Are you missing an assembly reference? + + + Module name '{0}' stored in '{1}' must match its filename. + + + Invalid module name: {0} + + + Invalid '{0}' value: '{1}'. + + + AppConfigPath must be absolute. + + + Attribute '{0}' from module '{1}' will be ignored in favor of the instance appearing in source + + + Attribute will be ignored in favor of the instance appearing in source + + + Attribute '{0}' given in a source file conflicts with option '{1}'. + + + A fixed buffer may only have one dimension. + + + Referenced assembly '{0}' does not have a strong name. + + + Referenced assembly does not have a strong name + + + Invalid signature public key specified in AssemblySignatureKeyAttribute. + + + Type '{0}' exported from module '{1}' conflicts with type declared in primary module of this assembly. + + + Type '{0}' exported from module '{1}' conflicts with type '{2}' exported from module '{3}'. + + + Forwarded type '{0}' conflicts with type declared in primary module of this assembly. + + + Type '{0}' forwarded to assembly '{1}' conflicts with type '{2}' forwarded to assembly '{3}'. + + + Type '{0}' forwarded to assembly '{1}' conflicts with type '{2}' exported from module '{3}'. + + + Referenced assembly '{0}' has different culture setting of '{1}'. + + + Referenced assembly has different culture setting + + + Agnostic assembly cannot have a processor specific module '{0}'. + + + Assembly and module '{0}' cannot target different processors. + + + Referenced assembly '{0}' targets a different processor. + + + Referenced assembly targets a different processor + + + Cryptographic failure while creating hashes. + + + Reference to '{0}' netmodule missing. + + + Module '{0}' is already defined in this assembly. Each module must have a unique filename. + + + Cannot read config file '{0}' -- '{1}' + + + Cannot continue since the edit includes a reference to an embedded type: '{0}'. + + + Member '{0}' added during the current debug session can only be accessed from within its declaring assembly '{1}'. + + + Compilation options '{0}' and '{1}' can't both be specified at the same time. + + + Linked netmodule metadata must provide a full PE image: '{0}'. + + + /platform:anycpu32bitpreferred can only be used with /t:exe, /t:winexe and /t:appcontainerexe + + + <path list> + + + <text> + + + null propagating operator + + + expression-bodied method + + + expression-bodied property + + + expression-bodied indexer + + + auto property initializer + + + <namespace> + + + byref locals and returns + + + readonly references + + + ref structs + + + ref conditional expression + + + ref reassignment + + + ref for-loop variables + + + ref foreach iteration variables + + + extensible fixed statement + + + Compilation (C#): + + + Syntax node is not within syntax tree + + + Location must be provided in order to provide minimal type qualification. + + + SyntaxTreeSemanticModel must be provided in order to provide minimal type qualification. + + + Can't reference compilation of type '{0}' from {1} compilation. + + + Syntax tree already present + + + Submission can only include script code. + + + Submission can have at most one syntax tree. + + + SyntaxTree is not part of the compilation, so it cannot be removed + + + tree must have a root node with SyntaxKind.CompilationUnit + + + Type argument cannot be null + + + Wrong number of type arguments + + + Name conflict for name {0} + + + LookupOptions has an invalid combination of options + + + items: must be non-empty + + + Use Microsoft.CodeAnalysis.CSharp.SyntaxFactory.Identifier or Microsoft.CodeAnalysis.CSharp.SyntaxFactory.VerbatimIdentifier to create identifier tokens. + + + Use Microsoft.CodeAnalysis.CSharp.SyntaxFactory.Literal to create character literal tokens. + + + Use Microsoft.CodeAnalysis.CSharp.SyntaxFactory.Literal to create numeric literal tokens. + + + This method can only be used to create tokens - {0} is not a token kind. + + + Generic parameter is definition when expected to be reference {0} + + + Called GetDeclarationName for a declaration node that can possibly contain multiple variable declarators. + + + Position is not within syntax tree with full span {0} + + + The language name '{0}' is invalid. + + + The language name is invalid + + + Transparent identifier member access failed for field '{0}' of '{1}'. Does the data being queried implement the query pattern? + + + The parameter has multiple distinct default values. + + + The field has multiple distinct constant values. + + + Within cref attributes, nested types of generic types should be qualified. + + + Within cref attributes, nested types of generic types should be qualified + + + Not a C# symbol. + + + Unnecessary using directive. + + + Unused extern alias. + + + Elements cannot be null. + + + LIB environment variable + + + /LIB option + + + /REFERENCEPATH option + + + directory does not exist + + + path is too long or invalid + + + No value for RuntimeMetadataVersion found. No assembly containing System.Object was found nor was a value for RuntimeMetadataVersion specified through options. + + + No value for RuntimeMetadataVersion found + + + Expected a {0} SemanticModel. + + + lambda expression + + + Feature '{0}' is not available in C# 1. Please use language version {1} or greater. + + + Feature '{0}' is not available in C# 2. Please use language version {1} or greater. + + + Feature '{0}' is not available in C# 3. Please use language version {1} or greater. + + + Feature '{0}' is not available in C# 4. Please use language version {1} or greater. + + + Feature '{0}' is not available in C# 5. Please use language version {1} or greater. + + + Feature '{0}' is not available in C# 6. Please use language version {1} or greater. + + + Feature '{0}' is not available in C# 7.0. Please use language version {1} or greater. + + + Feature '{0}' is experimental and unsupported; use '/features:{1}' to enable. + + + 'experimental' + + + Position must be within span of the syntax tree. + + + Syntax node to be speculated cannot belong to a syntax tree from the current compilation. + + + Chaining speculative semantic model is not supported. You should create a speculative model from the non-speculative ParentModel. + + + Microsoft (R) Visual C# Compiler + + + {0} version {1} + + + Copyright (C) Microsoft Corporation. All rights reserved. + + + Supported language versions: + + + Visual C# Compiler Options + + - OUTPUT FILES - + -out:<file> Specify output file name (default: base name of + file with main class or first file) + -target:exe Build a consol ... + + + '{0}': a class with the ComImport attribute cannot specify field initializers. + + + Local name '{0}' is too long for PDB. Consider shortening or compiling without /debug. + + + Local name is too long for PDB + + + Anonymous function converted to a void returning delegate cannot return a value + + + Async lambda expression converted to a 'Task' returning delegate cannot return a value. Did you intend to return 'Task<T>'? + + + An instance of analyzer {0} cannot be created from {1} : {2}. + + + An analyzer instance cannot be created + + + The assembly {0} does not contain any analyzers. + + + Assembly does not contain any analyzers + + + Unable to load Analyzer assembly {0} : {1} + + + Unable to load Analyzer assembly + + + Skipping some types in analyzer assembly {0} due to a ReflectionTypeLoadException : {1}. + + + Error reading ruleset file {0} - {1} + + + Error reading debug information for '{0}' + + + Operation caused a stack overflow. + + + Expected identifier or numeric literal. + + + Expected identifier or numeric literal + + + Only auto-implemented properties can have initializers. + + + Instance properties in interfaces cannot have initializers. + + + Auto-implemented properties must have get accessors. + + + Auto-implemented properties must override all accessors of the overridden property. + + + Structs without explicit constructors cannot contain members with initializers. + + + Cannot emit debug information for a source text without encoding. + + + Block bodies and expression bodies cannot both be provided. + + + Control cannot fall out of switch from final case label ('{0}') + + + Type arguments are not allowed in the nameof operator. + + + An expression tree lambda may not contain a null propagating operator. + + + An expression tree lambda may not contain a dictionary initializer. + + + An extension Add method is not supported for a collection initializer in an expression lambda. + + + nameof operator + + + dictionary initializer + + + Missing close delimiter '}' for interpolated expression started with '{'. + + + A single-line comment may not be used in an interpolated string. + + + An expression is too long or complex to compile + + + Expression does not have a name. + + + Sub-expression cannot be used in an argument to nameof. + + + An alias-qualified name is not an expression. + + + Type parameters are not allowed on a method group as an argument to 'nameof'. + + + SearchCriteria is expected. + + + Assembly culture strings may not contain embedded NUL characters. + + + using static + + + interpolated strings + + + alternative interpolated verbatim strings + + + await in catch blocks and finally blocks + + + binary literals + + + digit separators + + + local functions + + + A '{0}' character must be escaped (by doubling) in an interpolated string. + + + A '{0}' character may only be escaped by doubling '{0}{0}' in an interpolated string. + + + A format specifier may not contain trailing whitespace. + + + Empty format specifier. + + + There is an error in a referenced assembly '{0}'. + + + Expression or declaration statement expected. + + + Extension method groups are not allowed as an argument to 'nameof'. + + + Alignment value {0} has a magnitude greater than {1} and may result in a large formatted string. + + + Unused extern alias + + + Unnecessary using directive + + + Skip loading types in analyzer assembly that fail due to a ReflectionTypeLoadException + + + Alignment value has a magnitude that may result in a large formatted string + + + Length of String constant resulting from concatenation exceeds System.Int32.MaxValue. Try splitting the string into multiple constants. + + + Tuple must contain at least two elements. + + + Debug entry point must be a definition of a method declared in the current compilation. + + + #load is only allowed in scripts + + + Cannot use #load after first token in file + + + Could not find file. + + + SyntaxTree resulted from a #load directive and cannot be removed or replaced directly. + + + Source file references are not supported. + + + The pathmap option was incorrectly formatted. + + + Invalid real literal. + + + Auto-implemented properties cannot return by reference + + + Properties which return by reference must have a get accessor + + + Properties which return by reference cannot have set accessors + + + '{0}' must match by reference return of overridden member '{1}' + + + '{0}' must match by init-only of overridden member '{1}' + + + By-reference returns may only be used in methods that return by reference + + + By-value returns may only be used in methods that return by value + + + The return expression must be of type '{0}' because this method returns by reference + + + '{0}' does not implement interface member '{1}'. '{2}' cannot implement '{1}' because it does not have matching return by reference. + + + '{0}' does not implement interface member '{1}'. '{2}' cannot implement '{1}'. + + + The body of '{0}' cannot be an iterator block because '{0}' returns by reference + + + Lambda expressions that return by reference cannot be converted to expression trees + + + An expression tree lambda may not contain a call to a method, property, or indexer that returns by reference + + + An expression cannot be used in this context because it may not be passed or returned by reference + + + Cannot return '{0}' by reference because it was initialized to a value that cannot be returned by reference + + + Cannot return by reference a member of '{0}' because it was initialized to a value that cannot be returned by reference + + + Local '{0}' is returned by reference but was initialized to a value that cannot be returned by reference + + + Local is returned by reference but was initialized to a value that cannot be returned by reference + + + A member of '{0}' is returned by reference but was initialized to a value that cannot be returned by reference + + + A member is returned by reference but was initialized to a value that cannot be returned by reference + + + Cannot return '{0}' by reference because it is read-only + + + Cannot return the range variable '{0}' by reference + + + Cannot return '{0}' by reference because it is a '{1}' + + + Cannot return fields of '{0}' by reference because it is a '{1}' + + + A readonly field cannot be returned by writable reference + + + A static readonly field cannot be returned by writable reference + + + Members of readonly field '{0}' cannot be returned by writable reference + + + Fields of static readonly field '{0}' cannot be returned by writable reference + + + Cannot return a parameter by reference '{0}' because it is not a ref parameter + + + Cannot return by reference a member of parameter '{0}' because it is not a ref or out parameter + + + Cannot return a parameter by reference '{0}' because it is scoped to the current method + + + Cannot return by reference a member of parameter '{0}' because it is scoped to the current method + + + Cannot return a parameter by reference '{0}' through a ref parameter; it can only be returned in a return statement + + + Cannot return by reference a member of parameter '{0}' through a ref parameter; it can only be returned in a return statement + + + This returns a parameter by reference '{0}' through a ref parameter; but it can only safely be returned in a return statement + + + This returns a parameter by reference through a ref parameter; but it can only safely be returned in a return statement + + + This returns by reference a member of parameter '{0}' through a ref parameter; but it can only safely be returned in a return statement + + + This returns by reference a member of parameter through a ref parameter; but it can only safely be returned in a return statement + + + This returns a parameter by reference '{0}' but it is not a ref parameter + + + This returns a parameter by reference but it is not a ref parameter + + + This returns a parameter by reference '{0}' but it is scoped to the current method + + + This returns a parameter by reference but it is scoped to the current method + + + This returns by reference a member of parameter '{0}' that is not a ref or out parameter + + + This returns by reference a member of parameter that is not a ref or out parameter + + + This returns by reference a member of parameter '{0}' that is scoped to the current method + + + This returns by reference a member of parameter that is scoped to the current method + + + Cannot return local '{0}' by reference because it is not a ref local + + + Cannot return a member of local '{0}' by reference because it is not a ref local + + + This returns local '{0}' by reference but it is not a ref local + + + This returns local by reference but it is not a ref local + + + This returns a member of local '{0}' by reference but it is not a ref local + + + This returns a member of local by reference but it is not a ref local + + + Struct members cannot return 'this' or other instance members by reference + + + Struct member returns 'this' or other instance members by reference + + + Struct member returns 'this' or other instance members by reference + + + Expression cannot be used in this context because it may indirectly expose variables outside of their declaration scope + + + Cannot use variable '{0}' in this context because it may expose referenced variables outside of their declaration scope + + + Use of variable '{0}' in this context may expose referenced variables outside of their declaration scope + + + Use of variable in this context may expose referenced variables outside of their declaration scope + + + Cannot use a result of '{0}' in this context because it may expose variables referenced by parameter '{1}' outside of their declaration scope + + + Cannot use a member of result of '{0}' in this context because it may expose variables referenced by parameter '{1}' outside of their declaration scope + + + Use of result of '{0}' in this context may expose variables referenced by parameter '{1}' outside of their declaration scope + + + Use of result in this context may expose variables referenced by parameter outside of their declaration scope + + + Use of member of result of '{0}' in this context may expose variables referenced by parameter '{1}' outside of their declaration scope + + + Use of member of result in this context may expose variables referenced by parameter outside of their declaration scope + + + This combination of arguments to '{0}' is disallowed because it may expose variables referenced by parameter '{1}' outside of their declaration scope + + + This combination of arguments to '{0}' may expose variables referenced by parameter '{1}' outside of their declaration scope + + + This combination of arguments may expose variables referenced by parameter outside of their declaration scope + + + Branches of a ref conditional operator cannot refer to variables with incompatible declaration scopes + + + The branches of the ref conditional operator refer to variables with incompatible declaration scopes + + + The branches of the ref conditional operator refer to variables with incompatible declaration scopes + + + A result of a stackalloc expression of type '{0}' cannot be used in this context because it may be exposed outside of the containing method + + + A result of a stackalloc expression of type '{0}' in this context may be exposed outside of the containing method + + + A result of a stackalloc expression of this type in this context may be exposed outside of the containing method + + + Cannot initialize a by-value variable with a reference + + + Cannot initialize a by-reference variable with a value + + + The expression must be of type '{0}' because it is being assigned by reference + + + A declaration of a by-reference variable must have an initializer + + + Cannot use ref local '{0}' inside an anonymous method, lambda expression, or query expression + + + Iterators cannot have by-reference locals + + + Async methods cannot have by-reference locals + + + 'await' cannot be used in an expression containing a call to '{0}' because it returns by reference + + + 'await' cannot be used in an expression containing a ref conditional operator + + + Both conditional operator values must be ref values or neither may be a ref value + + + The expression must be of type '{0}' to match the alternative ref value + + + An expression tree may not contain a reference to a local function + + + Cannot pass argument with dynamic type to params parameter '{0}' of local function '{1}'. + + + Syntax tree should be created from a submission. + + + Combined length of user strings used by the program exceeds allowed limit. Try to decrease use of string literals. + + + It is not legal to use nullable type '{0}?' in a pattern; use the underlying type '{0}' instead. + + + It is not legal to use nullable reference type '{0}?' in an is-type expression; use the underlying type '{0}' instead. + + + It is not legal to use nullable reference type '{0}?' in an as expression; use the underlying type '{0}' instead. + + + Invalid operand for pattern match; value required, but found '{0}'. + + + An error occurred while writing the output file: {0}. + + + Tuple element names must be unique. + + + Tuple element name '{0}' is only allowed at position {1}. + + + Tuple element name '{0}' is disallowed at any position. + + + Member '{0}' was not found on type '{1}' from assembly '{2}'. + + + tuples + + + No suitable 'Deconstruct' instance or extension method was found for type '{0}', with {1} out parameters and a void return type. + + + Deconstruct assignment requires an expression with a type on the right-hand-side. + + + The switch expression must be a value; found '{0}'. + + + The switch case is unreachable. It has already been handled by a previous case or it is impossible to match. + + + stdin argument '-' is specified, but input has not been redirected from the standard input stream. + + + The pattern is unreachable. It has already been handled by a previous arm of the switch expression or it is impossible to match. + + + An expression of type '{0}' cannot be handled by a pattern of type '{1}'. + + + An expression of type '{0}' cannot be handled by a pattern of type '{1}'. Please use language version '{2}' or greater to match an open type with a constant pattern. + + + Attribute '{0}' is ignored when public signing is specified. + + + Attribute is ignored when public signing is specified. + + + Option '{0}' must be an absolute path. + + + Tuple with {0} elements cannot be converted to type '{1}'. + + + out variable declaration + + + Reference to an implicitly-typed out variable '{0}' is not permitted in the same argument list. + + + Cannot infer the type of implicitly-typed out variable '{0}'. + + + Cannot infer the type of implicitly-typed deconstruction variable '{0}'. + + + Cannot infer the type of implicitly-typed discard. + + + Cannot deconstruct a tuple of '{0}' elements into '{1}' variables. + + + Cannot deconstruct dynamic objects. + + + Deconstruction must contain at least two variables. + + + The tuple element name '{0}' is ignored because a different name or no name is specified by the target type '{1}'. + + + The tuple element name is ignored because a different name or no name is specified by the assignment target. + + + The tuple element name '{0}' is ignored because a different name or no name is specified on the other side of the tuple == or != operator. + + + The tuple element name is ignored because a different name or no name is specified on the other side of the tuple == or != operator. + + + Predefined type '{0}' must be a struct. + + + 'new' cannot be used with tuple type. Use a tuple literal expression instead. + + + Deconstruction 'var (...)' form disallows a specific type for 'var'. + + + Cannot define a class or member that utilizes tuples because the compiler required type '{0}' cannot be found. Are you missing a reference? + + + Cannot reference 'System.Runtime.CompilerServices.TupleElementNamesAttribute' explicitly. Use the tuple syntax to define tuple names. + + + An expression tree may not contain an out argument variable declaration. + + + An expression tree may not contain a discard. + + + An expression tree may not contain an 'is' pattern-matching operator. + + + An expression tree may not contain a tuple literal. + + + An expression tree may not contain a tuple conversion. + + + /sourcelink switch is only supported when emitting PDB. + + + /embed switch is only supported when emitting a PDB. + + + Invalid instrumentation kind: {0} + + + Invalid hash algorithm name: '{0}' + + + The syntax 'var (...)' as an lvalue is reserved. + + + { or ; or => expected + + + A throw expression is not allowed in this context. + + + A declaration is not allowed in this context. + + + A foreach loop must declare its iteration variables. + + + Tuple element names are not permitted on the left of a deconstruction. + + + To cast a negative value, you must enclose the value in parentheses. + + + An expression tree may not contain a throw-expression. + + + An expression tree may not contain a with-expression. + + + Invalid assembly name: {0} + + + For type '{0}' to be used as an AsyncMethodBuilder for type '{1}', its Task property should return type '{1}' instead of type '{2}'. + + + Module '{0}' in assembly '{1}' is forwarding the type '{2}' to multiple assemblies: '{3}' and '{4}'. + + + It is not legal to use the type 'dynamic' in a pattern. + + + Provided documentation mode is unsupported or invalid: '{0}'. + + + Provided source code kind is unsupported or invalid: '{0}' + + + Provided language version is unsupported or invalid: '{0}'. + + + Invalid name for a preprocessing symbol; '{0}' is not a valid identifier + + + Feature '{0}' is not available in C# 7.1. Please use language version {1} or greater. + + + Feature '{0}' is not available in C# 7.2. Please use language version {1} or greater. + + + Feature '{0}' is not available in C# 7.3. Please use language version {1} or greater. + + + Feature '{0}' is not available in C# 8.0. Please use language version {1} or greater. + + + Specified language version '{0}' cannot have leading zeroes + + + A value of type 'void' may not be assigned. + + + '{0}' is for evaluation purposes only and is subject to change or removal in future updates. + + + Type is for evaluation purposes only and is subject to change or removal in future updates. + + + Compiler version: '{0}'. Language version: {1}. + + + async main + + + Tuple element name '{0}' is inferred. Please use language version {1} or greater to access an element by its inferred name. + + + To use '@$' instead of '$@' for an interpolated verbatim string, please use language version '{0}' or greater. + + + Field-targeted attributes on auto-properties are not supported in language version {0}. Please use language version {1} or greater. + + + Field-targeted attributes on auto-properties are not supported in this version of the language. + + + A tuple may not contain a value of type 'void'. + + + nullable reference types + + + warning action enable + + + Converting null literal or possible null value to non-nullable type. + + + Converting null literal or possible null value to non-nullable type. + + + Possible null reference assignment. + + + Possible null reference assignment. + + + Dereference of a possibly null reference. + + + Dereference of a possibly null reference. + + + Possible null reference return. + + + Possible null reference return. + + + Possible null reference argument for parameter '{0}' in '{1}'. + + + Possible null reference argument. + + + Thrown value may be null. + + + Thrown value may be null. + + + Unboxing a possibly null value. + + + Unboxing a possibly null value. + + + Nullability of reference types in type doesn't match overridden member. + + + Nullability of reference types in type doesn't match overridden member. + + + Nullability of reference types in return type doesn't match overridden member. + + + Nullability of reference types in return type doesn't match overridden member. + + + Nullability of return type doesn't match overridden member (possibly because of nullability attributes). + + + Nullability of return type doesn't match overridden member (possibly because of nullability attributes). + + + Nullability of reference types in type of parameter '{0}' doesn't match overridden member. + + + Nullability of reference types in type of parameter doesn't match overridden member. + + + Nullability of type of parameter '{0}' doesn't match overridden member (possibly because of nullability attributes). + + + Nullability of type of parameter doesn't match overridden member (possibly because of nullability attributes). + + + Nullability of reference types in type of parameter '{0}' doesn't match partial method declaration. + + + Nullability of reference types in type of parameter doesn't match partial method declaration. + + + Nullability of reference types in return type doesn't match partial method declaration. + + + Nullability of reference types in return type doesn't match partial method declaration. + + + Nullability of reference types in type of '{0}' doesn't match implicitly implemented member '{1}'. + + + Nullability of reference types in type doesn't match implicitly implemented member. + + + Nullability of reference types in return type of '{0}' doesn't match implicitly implemented member '{1}'. + + + Nullability of reference types in return type doesn't match implicitly implemented member. + + + Nullability of reference types in type of parameter '{0}' of '{1}' doesn't match implicitly implemented member '{2}'. + + + Nullability of reference types in type of parameter doesn't match implicitly implemented member. + + + Nullability of reference types in return type of '{0}' doesn't match implicitly implemented member '{1}' (possibly because of nullability attributes). + + + Nullability of reference types in return type doesn't match implicitly implemented member (possibly because of nullability attributes). + + + Nullability of reference types in type of parameter '{0}' of '{1}' doesn't match implicitly implemented member '{2}' (possibly because of nullability attributes). + + + Nullability of reference types in type of parameter doesn't match implicitly implemented member (possibly because of nullability attributes). + + + Nullability of reference types in type doesn't match implemented member '{0}'. + + + Nullability of reference types in type doesn't match implemented member. + + + Nullability of reference types in return type doesn't match implemented member '{0}'. + + + Nullability of reference types in return type doesn't match implemented member. + + + Nullability of reference types in type of parameter '{0}' doesn't match implemented member '{1}'. + + + Nullability of reference types in type of parameter doesn't match implemented member. + + + Nullability of reference types in return type doesn't match implemented member '{0}' (possibly because of nullability attributes). + + + Nullability of reference types in return type doesn't match implemented member (possibly because of nullability attributes). + + + Nullability of reference types in type of parameter '{0}' doesn't match implemented member '{1}' (possibly because of nullability attributes). + + + Nullability of reference types in type of parameter doesn't match implemented member (possibly because of nullability attributes). + + + Non-nullable {0} '{1}' must contain a non-null value when exiting constructor. Consider declaring the {0} as nullable. + + + Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. + + + Nullability of reference types in value of type '{0}' doesn't match target type '{1}'. + + + Nullability of reference types in value doesn't match target type. + + + Call to non-readonly member '{0}' from a 'readonly' member results in an implicit copy of '{1}'. + + + Call to non-readonly member from a 'readonly' member results in an implicit copy. + + + Static member '{0}' cannot be marked 'readonly'. + + + Auto-implemented 'set' accessor '{0}' cannot be marked 'readonly'. + + + Auto-implemented property '{0}' cannot be marked 'readonly' because it has a 'set' accessor. + + + Cannot specify 'readonly' modifiers on both property or indexer '{0}' and its accessor. Remove one of them. + + + Cannot specify 'readonly' modifiers on both accessors of property or indexer '{0}'. Instead, put a 'readonly' modifier on the property itself. + + + Field-like event '{0}' cannot be 'readonly'. + + + Both partial method declarations must be readonly or neither may be readonly + + + '{0}': 'readonly' can only be used on accessors if the property or indexer has both a get and a set accessor + + + Argument of type '{0}' cannot be used for parameter '{2}' of type '{1}' in '{3}' due to differences in the nullability of reference types. + + + Argument cannot be used for parameter due to differences in the nullability of reference types. + + + Argument of type '{0}' cannot be used as an output of type '{1}' for parameter '{2}' in '{3}' due to differences in the nullability of reference types. + + + Argument cannot be used as an output for parameter due to differences in the nullability of reference types. + + + A possible null value may not be used for a type marked with [NotNull] or [DisallowNull] + + + A possible null value may not be used for a type marked with [NotNull] or [DisallowNull] + + + Parameter '{0}' must have a non-null value when exiting with '{1}'. + + + Parameter must have a non-null value when exiting in some condition. + + + Parameter '{0}' must have a non-null value when exiting. + + + Parameter must have a non-null value when exiting. + + + Parameter '{0}' must have a non-null value when exiting because parameter '{1}' is non-null. + + + Parameter must have a non-null value when exiting because parameter referenced by NotNullIfNotNull is non-null. + + + Return value must be non-null because parameter '{0}' is non-null. + + + Return value must be non-null because parameter is non-null. + + + Member '{0}' must have a non-null value when exiting. + + + Member must have a non-null value when exiting. + + + Member '{0}' cannot be used in this attribute. + + + Member cannot be used in this attribute. + + + Member '{0}' must have a non-null value when exiting with '{1}'. + + + Member must have a non-null value when exiting in some condition. + + + A method marked [DoesNotReturn] should not return. + + + A method marked [DoesNotReturn] should not return. + + + Method '{0}' lacks `[DoesNotReturn]` annotation to match implemented or overridden member. + + + Method lacks `[DoesNotReturn]` annotation to match implemented or overridden member. + + + Nullability of reference types in return type of '{0}' doesn't match the target delegate '{1}' (possibly because of nullability attributes). + + + Nullability of reference types in return type doesn't match the target delegate (possibly because of nullability attributes). + + + Nullability of reference types in type of parameter '{0}' of '{1}' doesn't match the target delegate '{2}' (possibly because of nullability attributes). + + + Nullability of reference types in type of parameter doesn't match the target delegate (possibly because of nullability attributes). + + + Cannot convert null literal to non-nullable reference type. + + + Cannot convert null literal to non-nullable reference type. + + + Cannot use a nullable reference type in object creation. + + + Nullable value type may be null. + + + Nullable value type may be null. + + + The type '{3}' cannot be used as type parameter '{2}' in the generic type or method '{0}'. Nullability of type argument '{3}' doesn't match constraint type '{1}'. + + + The type cannot be used as type parameter in the generic type or method. Nullability of type argument doesn't match constraint type. + + + The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. + + + The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. + + + Explicit application of 'System.Runtime.CompilerServices.NullableAttribute' is not allowed. + + + A nullable type parameter must be known to be a value type or non-nullable reference type unless language version '{0}' or greater is used. Consider changing the language version or adding a 'class', 'struct', or type constraint. + + + Invalid '{0}' value: '{1}' for C# {2}. Please use language version '{3}' or greater. + + + A void or int returning entry point cannot be async + + + An expression of type '{0}' cannot be handled by a pattern of type '{1}' in C# {2}. Please use language version {3} or greater. + + + The local function '{0}' is declared but never used + + + Local function is declared but never used + + + Local function '{0}' must declare a body because it is not marked 'static extern'. + + + Unable to read debug information of method '{0}' (token 0x{1:X8}) from assembly '{2}' + + + {0} is not a valid C# conversion expression + + + Cannot pass argument with dynamic type to generic local function '{0}' with inferred type arguments. + + + leading digit separator + + + Do not use '{0}'. This is reserved for compiler usage. + + + The type name '{0}' is reserved to be used by the compiler. + + + The first parameter of the 'in' extension method '{0}' must be a concrete (non-generic) value type. + + + Instance fields of readonly structs must be readonly. + + + Auto-implemented instance properties in readonly structs must be readonly. + + + Field-like events are not allowed in readonly structs. + + + ref extension methods + + + Conversion of a stackalloc expression of type '{0}' to type '{1}' is not possible. + + + The first parameter of a 'ref' extension method '{0}' must be a value type or a generic type constrained to struct. + + + An in parameter cannot have the Out attribute. + + + {0} is not a valid C# compound assignment operation + + + Filter expression is a constant 'false', consider removing the catch clause + + + Filter expression is a constant 'false' + + + Filter expression is a constant 'false', consider removing the try-catch block + + + Filter expression is a constant 'false'. + + + A conditional expression cannot be used directly in a string interpolation because the ':' ends the interpolation. Parenthesize the conditional expression. + + + Arguments with 'in' modifier cannot be used in dynamically dispatched expressions. + + + Tuple types used as operands of an == or != operator must have matching cardinalities. But this operator has tuple types of cardinality {0} on the left and {1} on the right. + + + The left-hand side of a ref assignment must be a ref variable. + + + Cannot ref-assign '{1}' to '{0}' because '{1}' has a narrower escape scope than '{0}'. + + + Cannot ref-assign '{1}' to '{0}' because '{1}' can only escape the current method through a return statement. + + + This ref-assigns '{1}' to '{0}' but '{1}' can only escape the current method through a return statement. + + + This ref-assigns a value that can only escape the current method through a return statement. + + + This ref-assigns '{1}' to '{0}' but '{1}' has a narrower escape scope than '{0}'. + + + This ref-assigns a value that has a narrower escape scope than the target. + + + enum generic type constraints + + + delegate generic type constraints + + + unmanaged generic type constraints + + + The 'new()' constraint cannot be used with the 'unmanaged' constraint + + + The type '{2}' must be a non-nullable value type, along with all fields at any level of nesting, in order to use it as parameter '{1}' in the generic type or method '{0}' + + + Type parameter '{1}' has the 'unmanaged' constraint so '{1}' cannot be used as a constraint for '{0}' + + + stackalloc initializer + + + "Invalid rank specifier: expected ']' + + + declaration of expression variables in member initializers and queries + + + Pattern missing + + + recursive patterns + + + null pointer constant pattern + + + default type parameter constraints + + + Matching the tuple type '{0}' requires '{1}' subpatterns, but '{2}' subpatterns are present. + + + A property subpattern requires a reference to the property or field to be matched, e.g. '{{ Name: {0} }}' + + + A default literal 'default' is not valid as a pattern. Use another literal (e.g. '0' or 'null') as appropriate. To match everything, use a discard pattern '_'. + + + No best type was found for the switch expression. + + + There is no target type for the default literal. + + + The delegate type could not be inferred. + + + The contextual keyword 'var' cannot be used as an explicit lambda return type + + + A single-element deconstruct pattern requires some other syntax for disambiguation. It is recommended to add a discard designator '_' after the close paren ')'. + + + The syntax 'var' for a pattern is not permitted to refer to a type, but '{0}' is in scope here. + + + The switch expression does not handle all possible values of its input type (it is not exhaustive). For example, the pattern '{0}' is not covered. + + + The switch expression does not handle all possible values of its input type (it is not exhaustive). + + + The switch expression does not handle all possible values of its input type (it is not exhaustive). For example, the pattern '{0}' is not covered. However, a pattern with a 'when' clause might successfully match this value. + + + The switch expression does not handle all possible values of its input type (it is not exhaustive). + + + The switch expression does not handle some values of its input type (it is not exhaustive) involving an unnamed enum value. For example, the pattern '{0}' is not covered. + + + The switch expression does not handle some values of its input type (it is not exhaustive) involving an unnamed enum value. + + + The name '_' refers to the constant, not the discard pattern. Use 'var _' to discard the value, or '@_' to refer to a constant by that name. + + + Do not use '_' for a case constant. + + + The name '_' refers to the type '{0}', not the discard pattern. Use '@_' for the type, or 'var _' to discard. + + + Do not use '_' to refer to the type in an is-type expression. + + + An expression tree may not contain a switch expression. + + + Invalid object creation + + + indexing movable fixed buffers + + + __arglist cannot have an argument passed by 'in' or 'out' + + + SyntaxTree is not part of the compilation + + + An out variable cannot be declared as a ref local + + + Multiple analyzer config files cannot be in the same directory ('{0}'). + + + coalescing assignment + + + Cannot create constructed generic type from another constructed generic type. + + + Cannot create constructed generic type from non-generic type. + + + unconstrained type parameters in null coalescing operator + + + Nullability in constraints for type parameter '{0}' of method '{1}' doesn't match the constraints for type parameter '{2}' of interface method '{3}'. Consider using an explicit interface implementation instead. + + + Nullability in constraints for type parameter doesn't match the constraints for type parameter in implicitly implemented interface method'. + + + The type '{2}' cannot be used as type parameter '{1}' in the generic type or method '{0}'. Nullability of type argument '{2}' doesn't match 'class' constraint. + + + The type cannot be used as type parameter in the generic type or method. Nullability of type argument doesn't match 'class' constraint. + + + Unexpected character sequence '...' + + + index operator + + + range operator + + + static local functions + + + name shadowing in nested functions + + + lambda discard parameters + + + MemberNotNull attribute + + + native-sized integers + + + Cannot use a collection of dynamic type in an asynchronous foreach + + + Expected 'enable', 'disable', or 'restore' + + + Expected 'warnings', 'annotations', or end of directive + + + The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source. + + + The annotation for nullable reference types should only be used in code within a '#nullable' annotations context. Auto-generated code requires an explicit '#nullable' directive in source. + + + Object or collection initializer implicitly dereferences possibly null member '{0}'. + + + Object or collection initializer implicitly dereferences possibly null member. + + + Expression tree cannot contain value of ref struct or restricted type '{0}'. + + + 'else' cannot start a statement. + + + An expression tree may not contain a null coalescing assignment + + + Invalid option '{0}' for /nullable; must be 'disable', 'enable', 'warnings' or 'annotations' + + + Parentheses are required around the switch governing expression. + + + The name '{0}' does not identify tuple element '{1}'. + + + The name '{0}' does not match the corresponding 'Deconstruct' parameter '{1}'. + + + An expression of type '{0}' can never match the provided pattern. + + + An expression of type '{0}' always matches the provided pattern. + + + The input always matches the provided pattern. + + + The given expression never matches the provided pattern. + + + The given expression never matches the provided pattern. + + + The given expression always matches the provided constant. + + + The given expression always matches the provided constant. + + + The given expression always matches the provided pattern. + + + The given expression always matches the provided pattern. + + + Feature '{0}' is not available in C# 8.0. Please use language version {1} or greater. + + + Pattern-matching is not permitted for pointer types. + + + Element names are not permitted when pattern-matching via 'System.Runtime.CompilerServices.ITuple'. + + + The discard pattern is not permitted as a case label in a switch statement. Use 'case var _:' for a discard pattern, or 'case @_:' for a constant named '_'. + + + Nullability of reference types in explicit interface specifier doesn't match interface implemented by the type. + + + Nullability of reference types in explicit interface specifier doesn't match interface implemented by the type. + + + '{0}' does not implement interface member '{1}'. Nullability of reference types in interface implemented by the base type doesn't match. + + + Type does not implement interface member. Nullability of reference types in interface implemented by the base type doesn't match. + + + '{0}' is already listed in the interface list on type '{1}' with different nullability of reference types. + + + Interface is already listed in the interface list with different nullability of reference types. + + + '{0}' is explicitly implemented more than once. + + + A using variable cannot be used directly within a switch section (consider using braces). + + + A goto cannot jump to a location after a using declaration. + + + A goto cannot jump to a location before a using declaration within the same block. + + + using declarations + + + pattern-based disposal + + + The feature '{0}' is currently in Preview and *unsupported*. To use Preview features, use the 'preview' language version. + + + default interface implementation + + + Target runtime doesn't support default interface implementation. + + + '{0}' cannot implement interface member '{1}' in type '{2}' because the target runtime doesn't support default interface implementation. + + + The modifier '{0}' is not valid for this item in C# {1}. Please use language version '{2}' or greater. + + + '{0}' does not implement interface member '{1}'. '{2}' cannot implicitly implement a non-public member in C# {3}. Please use language version '{4}' or greater. + + + Interface member '{0}' does not have a most specific implementation. Neither '{1}', nor '{2}' are most specific. + + + '{0}' cannot implement interface member '{1}' in type '{2}' because feature '{3}' is not available in C# {4}. Please use language version '{5}' or greater. + + + Target runtime doesn't support 'protected', 'protected internal', or 'private protected' accessibility for a member of an interface. + + + Type '{0}' cannot be embedded because it has a non-abstract member. Consider setting the 'Embed Interop Types' property to false. + + + The switch expression does not handle some null inputs (it is not exhaustive). For example, the pattern '{0}' is not covered. + + + The switch expression does not handle some null inputs. + + + The switch expression does not handle some null inputs (it is not exhaustive). For example, the pattern '{0}' is not covered. However, a pattern with a 'when' clause might successfully match this value. + + + The switch expression does not handle some null inputs. + + + Attribute '{0}' is not valid on event accessors. It is only valid on '{1}' declarations. + + + obsolete on property accessor + + + The EnumeratorCancellationAttribute applied to parameter '{0}' will have no effect. The attribute is only effective on a parameter of type CancellationToken in an async-iterator method returning IAsyncEnumerable + + + The EnumeratorCancellationAttribute will have no effect. The attribute is only effective on a parameter of type CancellationToken in an async-iterator method returning IAsyncEnumerable + + + Async-iterator '{0}' has one or more parameters of type 'CancellationToken' but none of them is decorated with the 'EnumeratorCancellation' attribute, so the cancellation token parameter from the generated 'IAsyncEnumerable<>.GetAsyncEnumerator' will be un ... + + + Async-iterator member has one or more parameters of type 'CancellationToken' but none of them is decorated with the 'EnumeratorCancellation' attribute, so the cancellation token parameter from the generated 'IAsyncEnumerable<>.GetAsyncEnumerator' will be u ... + + + The attribute [EnumeratorCancellation] cannot be used on multiple parameters + + + Method '{0}' specifies a 'class' constraint for type parameter '{1}', but corresponding type parameter '{2}' of overridden or explicitly implemented method '{3}' is not a reference type. + + + Method '{0}' specifies a 'struct' constraint for type parameter '{1}', but corresponding type parameter '{2}' of overridden or explicitly implemented method '{3}' is not a non-nullable value type. + + + Method '{0}' specifies a 'default' constraint for type parameter '{1}', but corresponding type parameter '{2}' of overridden or explicitly implemented method '{3}' is constrained to a reference type or a value type. + + + The 'default' constraint is valid on override and explicit interface implementation methods only. + + + constraints for override and explicit interface implementation methods + + + Partial method declarations of '{0}' have inconsistent nullability in constraints for type parameter '{1}' + + + Partial method declarations have inconsistent nullability in constraints for type parameter + + + stackalloc in nested expressions + + + The type '{2}' cannot be used as type parameter '{1}' in the generic type or method '{0}'. Nullability of type argument '{2}' doesn't match 'notnull' constraint. + + + The type cannot be used as type parameter in the generic type or method. Nullability of type argument doesn't match 'notnull' constraint. + + + notnull generic type constraint + + + Duplicate null suppression operator ('!') + + + The 'parameter null-checking' feature is not supported. + + + Type '{0}' cannot be embedded because it has a re-abstraction of a member from base interface. Consider setting the 'Embed Interop Types' property to false. + + + Command-line syntax error: '{0}' is not a valid value for the '{1}' option. The value must be of the form '{2}'. + + + function pointers + + + &method group + + + '{0}' is not a valid calling convention specifier for a function pointer. + + + Type '{0}' is not defined. + + + Type '{0}' must be public to be used as a calling convention. + + + Method '{0}' will not be used as an entry point because a synchronous entry point '{1}' was found. + + + Internal error in the C# compiler. + + + static anonymous function + + + A static anonymous function cannot contain a reference to 'this' or 'base'. + + + A static anonymous function cannot contain a reference to '{0}'. + + + asynchronous using + + + parenthesized pattern + + + or pattern + + + and pattern + + + not pattern + + + type pattern + + + relational pattern + + + Enums, classes, and structures cannot be declared in an interface that has an 'in' or 'out' type parameter. + + + '{0}': extern event cannot have initializer + + + Invocation of implicit Index Indexer cannot name the argument. + + + Invocation of implicit Range Indexer cannot name the argument. + + + The type '{0}' may not be used as the target type of new() + + + Use of new() is not valid in this context + + + There is no target type for '{0}' + + + target-typed object creation + + + An expression tree may not contain a pattern System.Index or System.Range indexer access + + + An expression tree may not contain a from-end index ('^') expression. + + + An expression tree may not contain a range ('..') expression. + + + Generator '{0}' failed to generate source. It will not contribute to the output and compilation errors may occur as a result. Exception was of type '{1}' with message '{2}' + + + Generator '{0}' failed to initialize. It will not contribute to the output and compilation errors may occur as a result. Exception was of type '{1}' with message '{2}' + + + Generator failed to generate source. + + + Generator failed to initialize. + + + Generator threw the following exception: + '{0}'. + + + Generator threw the following exception: + '{0}'. + + + records + + + init-only setters + + + The receiver of a `with` expression must have a non-void type. + + + The receiver type '{0}' is not a valid record type and is not a struct type. + + + Init-only property or indexer '{0}' can only be assigned in an object initializer, or on 'this' or 'base' in an instance constructor or an 'init' accessor. + + + A variable may not be declared within a 'not' or 'or' pattern. + + + Relational patterns may not be used for a value of type '{0}'. + + + Relational patterns may not be used for a floating-point NaN. + + + pattern matching ReadOnly/Span<char> on constant string + + + extended partial methods + + + constant interpolated strings + + + Partial method '{0}' must have accessibility modifiers because it has a non-void return type. + + + Partial method '{0}' must have accessibility modifiers because it has 'out' parameters. + + + Partial method '{0}' must have an implementation part because it has accessibility modifiers. + + + Partial method '{0}' must have accessibility modifiers because it has a 'virtual', 'override', 'sealed', 'new', or 'extern' modifier. + + + Both partial method declarations must have identical accessibility modifiers. + + + Both partial method declarations must have identical combinations of 'virtual', 'override', 'sealed', and 'new' modifiers. + + + Both partial method declarations must have the same return type. + + + Partial method declarations must have matching ref return values. + + + Partial method declarations '{0}' and '{1}' have signature differences. + + + Partial method declarations have signature differences. + + + top-level statements + + + Cannot use local variable or local function '{0}' declared in a top-level statement in this context. + + + Only one compilation unit can have top-level statements. + + + Top-level statements must precede namespace and type declarations. + + + Cannot specify /main if there is a compilation unit with top-level statements. + + + Program using top-level statements must be an executable. + + + '{0}' is not a valid function pointer return type modifier. Valid modifiers are 'ref' and 'ref readonly'. + + + A return type can only have one '{0}' modifier. + + + '{0}' cannot be used as a modifier on a function pointer parameter. + + + Function pointer '{0}' does not take {1} arguments + + + No overload for '{0}' matches function pointer '{1}' + + + Ref mismatch between '{0}' and function pointer '{1}' + + + Cannot create a function pointer for '{0}' because it is not a static method + + + '&' on method groups cannot be used in expression trees + + + Calling convention of '{0}' is not compatible with '{1}'. + + + Cannot convert method group to function pointer (Are you missing a '&'?) + + + Cannot use an extension method with a receiver as the target of a '&' operator. + + + The type of a local declared in a fixed statement cannot be a function pointer type. + + + The calling convention of '{0}' is not supported by the language. + + + The target runtime doesn't support extensible or runtime-environment default calling conventions. + + + Given {0} parameter types and {1} parameter ref kinds. These arrays must have the same length. + + + 'RefKind.Out' is not a valid ref kind for a return type. + + + Passing '{0}' is not valid unless '{1}' is 'SignatureCallingConvention.Unmanaged'. + + + Cannot use '{0}' as a calling convention modifier. + + + Cannot convert &method group '{0}' to delegate type '{1}'. + + + Cannot convert &method group '{0}' to non-function pointer type '{1}'. + + + 'managed' calling convention cannot be combined with unmanaged calling convention specifiers. + + + Feature '{0}' is not available in C# 9.0. Please use language version {1} or greater. + + + Feature '{0}' is not available in C# 10.0. Please use language version {1} or greater. + + + Feature '{0}' is not available in C# 11.0. Please use language version {1} or greater. + + + Unexpected argument list. + + + A constructor declared in a record with parameter list must have 'this' constructor initializer. + + + Only a single record partial declaration may have a parameter list + + + Records may only inherit from object or another record + + + Only records may inherit from records. + + + Record member '{0}' must be a readable instance property or field of type '{1}' to match positional parameter '{2}'. + + + No accessible copy constructor found in base type '{0}'. + + + A copy constructor in a record must call a copy constructor of the base, or a parameterless object constructor if the record inherits from object. + + + target-typed conditional expression + + + Conditional expression is not valid in language version {0} because a common type was not found between '{1}' and '{2}'. To use a target-typed conversion, upgrade to language version {3} or greater. + + + '{0}' does not override expected method from 'object'. + + + covariant returns + + + '{0}': Target runtime doesn't support covariant return types in overrides. Return type must be '{2}' to match overridden member '{1}' + + + '{0}': Target runtime doesn't support covariant types in overrides. Type must be '{2}' to match overridden member '{1}' + + + '{0}' cannot be sealed because containing record is not sealed. + + + '{0}' does not override expected method from '{1}'. + + + Constant value '{0}' may overflow '{1}' at runtime (use 'unchecked' syntax to override) + + + Constant value may overflow at runtime (use 'unchecked' syntax to override) + + + Members named 'Clone' are disallowed in records. + + + Types and aliases should not be named 'record'. + + + Types and aliases should not be named 'record'. + + + '{0}' must allow overriding because the containing record is not sealed. + + + Record member '{0}' must be public. + + + Record member '{0}' must return '{1}'. + + + Record member '{0}' must be protected. + + + '{0}' does not override expected property from '{1}'. + + + Record member '{0}' may not be static. + + + A copy constructor '{0}' must be public or protected because the record is not sealed. + + + Record member '{0}' must be private. + + + Operator '{0}' cannot be used here due to precedence. Use parentheses to disambiguate. + + + Operator cannot be used here due to precedence. + + + module initializers + + + Module initializer method '{0}' must be accessible at the module level + + + Module initializer method '{0}' must be static, and non-virtual, must have no parameters, and must return 'void' + + + Module initializer method '{0}' must not be generic and must not be contained in a generic type + + + A module initializer must be an ordinary member method + + + extension GetAsyncEnumerator + + + extension GetEnumerator + + + 'UnmanagedCallersOnly' can only be applied to ordinary static non-abstract, non-virtual methods or static local functions. + + + '{0}' is not a valid calling convention type for 'UnmanagedCallersOnly'. + + + Cannot use '{0}' as a {1} type on a method attributed with 'UnmanagedCallersOnly'. + + + Methods attributed with 'UnmanagedCallersOnly' cannot have generic type parameters and cannot be declared in a generic type. + + + '{0}' is attributed with 'UnmanagedCallersOnly' and cannot be called directly. Obtain a function pointer to this method. + + + '{0}' is attributed with 'UnmanagedCallersOnly' and cannot be converted to a delegate type. Obtain a function pointer to this method. + + + Application entry points cannot be attributed with 'UnmanagedCallersOnly'. + + + Module initializer cannot be attributed with 'UnmanagedCallersOnly'. + + + '{0}' defines 'Equals' but not 'GetHashCode' + + + Record defines 'Equals' but not 'GetHashCode'. + + + 'init' accessors cannot be marked 'readonly'. Mark '{0}' readonly instead. + + + discards + + + Mixed declarations and expressions in deconstruction + + + record structs + + + with on structs + + + with on anonymous types + + + async method builder override + + + positional fields in records + + + parameterless struct constructors + + + struct field initializers + + + ref fields + + + variance safety for static interface members + + + Record equality contract property '{0}' must have a get accessor. + + + The assembly '{0}' containing type '{1}' references .NET Framework, which is not supported. + + + The loaded assembly references .NET Framework, which is not supported. + + + The analyzer assembly '{0}' references version '{1}' of the compiler, which is newer than the currently running version '{2}'. + + + The analyzer assembly references a newer version of the compiler than the currently running version. + + + The type '{0}' may not be used for a field of a record. + + + A function pointer cannot be called with named arguments. + + + file-scoped namespace + + + Source file can only contain one file-scoped namespace declaration. + + + Source file can not contain both file-scoped and normal namespace declarations. + + + File-scoped namespace must precede all other members in a file. + + + Parameter '{0}' is unread. Did you forget to use it to initialize the property with that name? + + + Parameter is unread. Did you forget to use it to initialize the property with that name? + + + The primary constructor conflicts with the synthesized copy constructor. + + + lambda attributes + + + lambda return type + + + inferred delegate type + + + auto default struct fields + + + The #line directive value is missing or out of range + + + The #line directive end position must be greater than or equal to the start position + + + The #line span directive requires space before the first parenthesis, before the character offset, and before the file name + + + Comparison of function pointers might yield an unexpected result, since pointers to the same function may be distinct. + + + Do not compare function pointer values + + + Using a function pointer type in a 'typeof' in an attribute is not supported. + + + The CallerArgumentExpressionAttribute may only be applied to parameters with default values + + + CallerArgumentExpressionAttribute cannot be applied because there are no standard conversions from type '{0}' to type '{1}' + + + The CallerArgumentExpressionAttribute applied to parameter '{0}' will have no effect because it applies to a member that is used in contexts that do not allow optional arguments + + + The CallerArgumentExpressionAttribute will have no effect because it applies to a member that is used in contexts that do not allow optional arguments + + + The CallerArgumentExpressionAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. + + + The CallerArgumentExpressionAttribute will have no effect; it is overridden by the CallerFilePathAttribute + + + The CallerArgumentExpressionAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerLineNumberAttribute. + + + The CallerArgumentExpressionAttribute will have no effect; it is overridden by the CallerLineNumberAttribute + + + The CallerArgumentExpressionAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerMemberNameAttribute. + + + The CallerArgumentExpressionAttribute will have no effect; it is overridden by the CallerMemberNameAttribute + + + The CallerArgumentExpressionAttribute applied to parameter '{0}' will have no effect. It is applied with an invalid parameter name. + + + The CallerArgumentExpressionAttribute is applied with an invalid parameter name. + + + The CallerArgumentExpressionAttribute applied to parameter '{0}' will have no effect because it's self-referential. + + + The CallerArgumentExpressionAttribute applied to parameter will have no effect because it's self-refential. + + + sealed ToString in record + + + Inheriting from a record with a sealed 'Object.ToString' is not supported in C# {0}. Please use language version '{1}' or greater. + + + list pattern + + + List patterns may not be used for a value of type '{0}'. + + + List patterns may not be used for a value of type '{0}'. No suitable 'Length' or 'Count' property was found. + + + The 'scoped' modifier can be used for refs and ref struct values only. + + + The 'scoped' modifier of parameter '{0}' doesn't match overridden or implemented member. + + + The 'scoped' modifier of parameter '{0}' doesn't match overridden or implemented member. + + + The 'scoped' modifier of parameter doesn't match overridden or implemented member. + + + The 'scoped' modifier of parameter '{0}' doesn't match target '{1}'. + + + The 'scoped' modifier of parameter '{0}' doesn't match target '{1}'. + + + The 'scoped' modifier of parameter doesn't match target. + + + The 'scoped' modifier of parameter '{0}' doesn't match partial method declaration. + + + A fixed field must not be a ref field. + + + A ref field cannot refer to a ref struct. + + + A ref field can only be declared in a ref struct. + + + Auto-implemented property '{0}' is read before being explicitly assigned, causing a preceding implicit assignment of 'default'. + + + Auto-implemented property is read before being explicitly assigned, causing a preceding implicit assignment of 'default'. + + + Field '{0}' is read before being explicitly assigned, causing a preceding implicit assignment of 'default'. + + + Field is read before being explicitly assigned, causing a preceding implicit assignment of 'default'. + + + The 'this' object is read before all of its fields have been assigned, causing preceding implicit assignments of 'default' to non-explicitly assigned fields. + + + The 'this' object is read before all of its fields have been assigned, causing preceding implicit assignments of 'default' to non-explicitly assigned fields. + + + Control is returned to caller before auto-implemented property '{0}' is explicitly assigned, causing a preceding implicit assignment of 'default'. + + + Control is returned to caller before auto-implemented property is explicitly assigned, causing a preceding implicit assignment of 'default'. + + + Control is returned to caller before field '{0}' is explicitly assigned, causing a preceding implicit assignment of 'default'. + + + Control is returned to caller before field is explicitly assigned, causing a preceding implicit assignment of 'default'. + + + Use of possibly unassigned field '{0}'. Consider updating to language version '{1}' to auto-default the field. + + + Use of possibly unassigned auto-implemented property '{0}'. Consider updating to language version '{1}' to auto-default the property. + + + Use of possibly unassigned field '{0}'. Consider updating to language version '{1}' to auto-default the field. + + + Use of possibly unassigned field. Consider updating the language version to auto-default the field. + + + Use of possibly unassigned auto-implemented property '{0}'. Consider updating to language version '{1}' to auto-default the property. + + + Use of possibly unassigned auto-implemented property. Consider updating the language version to auto-default the property. + + + Slice patterns may not be used for a value of type '{0}'. + + + Slice patterns may only be used once and directly inside a list pattern. + + + The positional member '{0}' found corresponding to this parameter is hidden. + + + interpolated string handlers + + + Interpolated string handler method '{0}' is malformed. It does not return 'void' or 'bool'. + + + Interpolated string handler method '{0}' has inconsistent return type. Expected to return '{1}'. + + + Identifier or a simple member access expected. + + + extended property patterns + + + global using directive + + + A global using directive cannot be used in a namespace declaration. + + + A global using directive must precede all non-global using directives. + + + null is not a valid parameter name. To get access to the receiver of an instance method, use the empty string as the parameter name. + + + '{0}' is not an instance method, the receiver cannot be an interpolated string handler argument. + + + '{0}' is not a valid parameter name from '{1}'. + + + '{0}' is not an interpolated string handler type. + + + Parameter '{0}' occurs after '{1}' in the parameter list, but is used as an argument for interpolated string handler conversions. This will require the caller to reorder parameters with named arguments at the call site. Consider putting the interpolated st ... + + + Parameter to interpolated string handler conversion occurs after handler parameter + + + InterpolatedStringHandlerArgumentAttribute arguments cannot refer to the parameter the attribute is used on. + + + The InterpolatedStringHandlerArgumentAttribute applied to parameter '{0}' is malformed and cannot be interpreted. Construct an instance of '{1}' manually. + + + Parameter '{0}' is an argument to the interpolated string handler conversion on parameter '{1}', but the corresponding argument is specified after the interpolated string expression. Reorder the arguments to move '{0}' before '{1}'. + + + Parameter '{0}' is not explicitly provided, but is used as an argument to the interpolated string handler conversion on parameter '{1}'. Specify the value of '{0}' before '{1}'. + + + An expression tree may not contain an interpolated string handler conversion. + + + An interpolated string handler construction cannot use dynamic. Manually construct an instance of '{0}'. + + + The parameterless struct constructor must be 'public'. + + + static abstract members in interfaces + + + Target runtime doesn't support static abstract members in interfaces. + + + The interface '{0}' cannot be used as type argument. Static member '{1}' does not have a most specific implementation in the interface. + + + The parameter of a unary operator must be the containing type, or its type parameter constrained to it. + + + The parameter type for ++ or -- operator must be the containing type, or its type parameter constrained to it. + + + The return type for ++ or -- operator must either match the parameter type, or be derived from the parameter type, or be the containing type's type parameter constrained to it unless the parameter type is a different type parameter. + + + One of the parameters of a binary operator must be the containing type, or its type parameter constrained to it. + + + The first operand of an overloaded shift operator must have the same type as the containing type or its type parameter constrained to it + + + A static virtual or abstract interface member can be accessed only on a type parameter. + + + An expression tree may not contain an access of static virtual or abstract interface member + + + '{0}' does not implement static interface member '{1}'. '{2}' cannot implement the interface member because it is not static. + + + '{0}' cannot implement interface member '{1}' in type '{2}' because the target runtime doesn't support static abstract members in interfaces. + + + Explicit implementation of a user-defined operator '{0}' must be declared static + + + User-defined conversion in an interface must convert to or from a type parameter on the enclosing type constrained to the enclosing type + + + 'UnmanagedCallersOnly' method '{0}' cannot implement interface member '{1}' in type '{2}' + + + The using directive for '{0}' appeared previously as global using + + + The using directive appeared previously as global using + + + The AsyncMethodBuilder attribute is disallowed on anonymous methods without an explicit return type. + + + At least one top-level statement must be non-empty. + + + Line does not start with the same whitespace as the closing line of the raw string literal. + + + Raw string literals are not allowed in preprocessor directives. + + + Raw string literal delimiter must be on its own line. + + + The raw string literal does not start with enough quote characters to allow this many consecutive quote characters as content. + + + The interpolated raw string literal does not start with enough '$' characters to allow this many consecutive opening braces as content. + + + The interpolated raw string literal does not start with enough '$' characters to allow this many consecutive closing braces as content. + + + Not enough quotes for raw string literal. + + + The interpolation must end with the same number of closing braces as the number of '$' characters that the raw string literal started with. + + + Sequence of '@' characters is not allowed. A verbatim string or identifier can only have one '@' character and a raw string cannot have any. + + + String must start with quote character: " + + + Unterminated raw string literal. + + + raw string literals + + + Multi-line raw string literals are only allowed in verbatim interpolated strings. + + + Multi-line raw string literals must contain at least one line of content. + + + Newlines inside a non-verbatim interpolated string are not supported in C# {0}. Please use language version {1} or greater. + + + generic attributes + + + InterpolatedStringHandlerArgument has no effect when applied to lambda parameters and will be ignored at the call site. + + + InterpolatedStringHandlerArgument has no effect when applied to lambda parameters and will be ignored at the call site. + + + A lambda expression with attributes cannot be converted to an expression tree + + + A constructor declared in a 'record struct' with parameter list must have a 'this' initializer that calls the primary constructor or an explicitly declared constructor. + + + A 'struct' with field initializers must include an explicitly declared constructor. + + + A string 'null' constant is not supported as a pattern for '{0}'. Use an empty string instead. + + + Cannot update because an inferred delegate type has changed. + + + The operation may overflow '{0}' at runtime (use 'unchecked' syntax to override) + + + The operation may overflow at runtime (use 'unchecked' syntax to override) + + + Cannot use 'ref', 'in', or 'out' in the signature of a method attributed with 'UnmanagedCallersOnly'. + + + newlines in interpolations + + + Interpolated string handler conversions that reference the instance being indexed cannot be used in indexer member initializers. + + + '{0}' cannot be made nullable. + + + The type name '{0}' only contains lower-cased ascii characters. Such names may become reserved for the language. + + + The type name only contains lower-cased ascii characters. Such names may become reserved for the language. + + + Types and aliases cannot be named 'required'. + + + required members + + + '{0}' must be required because it overrides required member '{1}' + + + Required member '{0}' cannot be hidden by '{1}'. + + + Required member '{0}' cannot be less visible or have a setter less visible than the containing type '{1}'. + + + Do not use 'System.Runtime.CompilerServices.RequiredMemberAttribute'. Use the 'required' keyword on required fields and properties instead. + + + Required member '{0}' must be settable. + + + Required member '{0}' must be set in the object initializer or attribute constructor. + + + Required member '{0}' must be assigned a value, it cannot use a nested member or collection initializer. + + + The required members list for '{0}' is malformed and cannot be interpreted. + + + The required members list for the base type '{0}' is malformed and cannot be interpreted. To use this constructor, apply the 'SetsRequiredMembers' attribute. + + + Line contains different whitespace than the closing line of the raw string literal: '{0}' versus '{1}' + + + Keyword 'enum' cannot be used as a constraint. Did you mean 'struct, System.Enum'? + + + Keyword 'delegate' cannot be used as a constraint. Did you mean 'System.Delegate'? + + + Unexpected keyword 'record'. Did you mean 'record struct' or 'record class'? + + + checked user-defined operators + + + User-defined operator '{0}' cannot be declared checked + + + An 'implicit' user-defined conversion operator cannot be declared checked + + + The operator '{0}' requires a matching non-checked version of the operator to also be defined + + + The input string cannot be converted into the equivalent UTF-8 byte representation. {0} + + + UTF-8 string literals + + + An expression tree may not contain UTF-8 string conversion or literal. + + + This constructor must add 'SetsRequiredMembers' because it chains to a constructor that has that attribute. + + + '{2}' cannot satisfy the 'new()' constraint on parameter '{1}' in the generic type or or method '{0}' because '{2}' has required members. + + + File-local type '{0}' cannot be used in a member signature in non-file-local type '{1}'. + + + File-local type '{0}' cannot use accessibility modifiers. + + + File-local type '{0}' cannot be used as a base type of non-file-local type '{1}'. + + + File-local type '{0}' must be defined in a top level type; '{0}' is a nested type. + + + File-local type '{0}' cannot be used because the containing file path cannot be converted into the equivalent UTF-8 byte representation. {1} + + + File-local type '{0}' cannot be used in a 'global using static' directive. + + + Types and aliases cannot be named 'file'. + + + File-local type '{0}' must be declared in a file with a unique path. Path '{1}' is used in multiple files. + + + unsigned right shift + + + relaxed shift operator + + + '{0}' requires compiler feature '{1}', which is not supported by this version of the C# compiler. + + + Required member '{0}' should not be attributed with 'ObsoleteAttribute' unless the containing type is obsolete or all constructors are obsolete. + + + Members attributed with 'ObsoleteAttribute' should not be required unless the containing type is obsolete or all constructors are obsolete. + + + Ref returning properties cannot be required. + + + Unexpected keyword 'unchecked' + + + '{0}' does not implement interface member '{1}'. '{2}' cannot implicitly implement an inaccessible member. + + + Required members are not allowed on the top level of a script or submission. + + + One of the parameters of an equality, or inequality operator declared in interface '{0}' must be a type parameter on '{0}' constrained to '{0}' + + + Operator '{0}' cannot be applied to operands of type '{1}' and '{2}' that are not UTF-8 byte representations + + + file types + + + Cannot use a numeric constant or relational pattern on '{0}' because it inherits from or extends 'INumberBase<T>'. Consider using a type pattern to narrow to a specifc numeric type. + + + array access + + + pointer element access + + + Types and aliases cannot be named 'scoped'. + + + UnscopedRefAttribute cannot be applied to this item because it is unscoped by default. + + + Target runtime doesn't support ref fields. + + + Do not use 'System.Runtime.CompilerServices.ScopedRefAttribute'. Use the 'scoped' keyword instead. + + + Analyzer reference '{0}' specified multiple times + + + Analyzer reference specified multiple times + + + The namespace '{1}' already contains a definition for '{0}' in this file. + + + UnscopedRefAttribute cannot be applied to parameters that have a 'scoped' modifier. + + + 'readonly' is not supported as a parameter modifier. Did you mean 'in'? + + + + DiagnosticAnalyzer for C# compiler's syntax/semantic/compilation diagnostics. + + + + + Determines if is of a specified kind. + + The source token. + The syntax kind to test for. + if the token is of the specified kind; otherwise, . + + + + Determines if is of a specified kind. + + The source trivia. + The syntax kind to test for. + if the trivia is of the specified kind; otherwise, . + + + + Determines if is of a specified kind. + + The source node. + The syntax kind to test for. + if the node is of the specified kind; otherwise, . + + + + Determines if is of a specified kind. + + The source node or token. + The syntax kind to test for. + if the node or token is of the specified kind; otherwise, . + + + + Returns the index of the first node of a specified kind in the node list. + + Node list. + The to find. + Returns non-negative index if the list contains a node which matches , -1 otherwise. + + + + True if the list has at least one node of the specified kind. + + + + + Returns the index of the first node of a specified kind in the node list. + + Node list. + The to find. + Returns non-negative index if the list contains a node which matches , -1 otherwise. + + + + True if the list has at least one node of the specified kind. + + + + + Returns the index of the first trivia of a specified kind in the trivia list. + + Trivia list. + The to find. + Returns non-negative index if the list contains a trivia which matches , -1 otherwise. + + + + True if the list has at least one trivia of the specified kind. + + + + + Returns the index of the first token of a specified kind in the token list. + + Token list. + The to find. + Returns non-negative index if the list contains a token which matches , -1 otherwise. + + + + Tests whether a list contains a token of a particular kind. + + + The to test for. + Returns true if the list contains a token which matches + + + + An array of child bound nodes. + + Note that any of the child nodes may be null. + + + diff --git a/Source/Platforms/DotNet/Microsoft.CodeAnalysis.dll b/Source/Platforms/DotNet/Microsoft.CodeAnalysis.dll new file mode 100644 index 000000000..8ab2c2e37 --- /dev/null +++ b/Source/Platforms/DotNet/Microsoft.CodeAnalysis.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f8a255d6e5595a6564bfa66f9fd9afdba27e51bd79261f3b6dc6748e3408d4b +size 2828968 diff --git a/Source/Platforms/DotNet/Microsoft.CodeAnalysis.xml b/Source/Platforms/DotNet/Microsoft.CodeAnalysis.xml new file mode 100644 index 000000000..3b30724a6 --- /dev/null +++ b/Source/Platforms/DotNet/Microsoft.CodeAnalysis.xml @@ -0,0 +1,40014 @@ + + + + Microsoft.CodeAnalysis + + + + + Represents a non source code file. + + + + + Path to the file. + + + + + Returns a with the contents of this file, or null if + there were errors reading the file. + + + + + Errors encountered when trying to read the additional file. Always empty if + has not been called. + + + + + If is set, then will be null. + The only arity in that case will be encoded in the symbol. + + + + + + + + + This is base class for a bag used to accumulate information while binding is performed. + Including diagnostic messages and dependencies in the form of "used" assemblies. + + + + + An information that should be reported at a call site of a symbol. + + + + + Diagnostic info that should be reported at the use site of the symbol, or null if there is none. + + + + + When not-null, this is primary dependency of the use-site, usually the assembly defining the used symbol. + Never a core library. Usually it is not included into the . + Null if is an error. + + + + + The set of other assemblies the use site will depend upon, excluding a core library. + Empty if is an error. + + + + + A helper used to combine information from multiple s related to the same + use site. + + + + + A helper used to efficiently cache in the symbol. + + + + + Either + - null (meaning no diagnostic info and dependencies), or + - a , or + - dependencies as a , or + - a tuple of a and a . + + + + + Diagnostic info that should be reported at the use site of the symbol, or null if there is none. + + + + + The set of assemblies the use site will depend upon, excluding assembly for core library. + Empty or null if is an error. + + + + + Case-insensitive operations (mostly comparison) on unicode strings. + + + + + ToLower implements the Unicode lowercase mapping + as described in ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt. + VB uses these mappings for case-insensitive comparison. + + + If is upper case, then this returns its Unicode lower case equivalent. Otherwise, is returned unmodified. + + + + This class seeks to perform the lowercase Unicode case mapping. + + + + + Returns a StringComparer that compares strings according to Unicode rules for case-insensitive + identifier comparison (lower-case mapping). + + + These are also the rules used for VB identifier comparison. + + + + + Returns a StringComparer that compares strings according to Unicode rules for case-insensitive + identifier comparison (lower-case mapping). + + + These are also the rules used for VB identifier comparison. + + + + + Determines if two strings are equal according to Unicode rules for case-insensitive + identifier comparison (lower-case mapping). + + First identifier to compare + Second identifier to compare + true if the identifiers should be considered the same. + + These are also the rules used for VB identifier comparison. + + + + + Determines if two strings are equal according to Unicode rules for case-insensitive + identifier comparison (lower-case mapping). + + First identifier to compare + Second identifier to compare + true if the identifiers should be considered the same. + + These are also the rules used for VB identifier comparison. + + + + + Determines if the string 'value' end with string 'possibleEnd'. + + + + + + + + Determines if the string 'value' starts with string 'possibleStart'. + + + + + + + + Compares two strings according to the Unicode rules for case-insensitive + identifier comparison (lower-case mapping). + + First identifier to compare + Second identifier to compare + -1 if < , 1 if > , 0 if they are equal. + + These are also the rules used for VB identifier comparison. + + + + + Compares two strings according to the Unicode rules for case-insensitive + identifier comparison (lower-case mapping). + + First identifier to compare + Second identifier to compare + -1 if < , 1 if > , 0 if they are equal. + + These are also the rules used for VB identifier comparison. + + + + + Gets a case-insensitive hash code for Unicode identifiers. + + identifier to get the hash code for + The hash code for the given identifier + + These are also the rules used for VB identifier comparison. + + + + + Convert a string to lower case per Unicode + + + + + + + In-place convert string in StringBuilder to lower case per Unicode rules + + + + + + Constructs and caches already created pseudo-methods. + Every compiled module is supposed to have one of this, created lazily + (multidimensional arrays are not common). + + + + + Acquires an array constructor for a given array type + + + + + Acquires an element getter method for a given array type + + + + + Acquires an element setter method for a given array type + + + + + Acquires an element referencer method for a given array type + + + + + Maps {array type, method kind} tuples to implementing pseudo-methods. + + + + + lazily fetches or creates a new array method. + + + + + "newobj ArrayConstructor" is equivalent of "newarr ElementType" + when working with multidimensional arrays + + + + + "call ArrayGet" is equivalent of "ldelem ElementType" + when working with multidimensional arrays + + + + + "call ArrayAddress" is equivalent of "ldelema ElementType" + when working with multidimensional arrays + + + + + "call ArraySet" is equivalent of "stelem ElementType" + when working with multidimensional arrays + + + + + Represents a parameter in an array pseudo-method. + + NOTE: It appears that only number of indices is used for verification, + types just have to be Int32. + Even though actual arguments can be native ints. + + + + + Represents the "value" parameter of the Set pseudo-method. + + NOTE: unlike index parameters, type of the value parameter must match + the actual element type. + + + + + Base of all array methods. They have a lot in common. + + + + + Block is not reachable or reachability analysis + has not been performed. + + + + + Block can be reached either falling through + from previous block or from branch. + + + + + Block is reachable from try or catch but + finally prevents falling through. + + + + + Returns true if this block has a branch label + and is not a "nop" branch. + + + + + Instructions that are not branches. + + + + + The block contains only the final branch or nothing at all + + + + + Updates position of the current block to account for shorter sizes of previous blocks. + + + + + + If possible, changes the branch code of the current block to the short version and + updates the delta correspondingly. + + Position delta created by previous block size reductions. + + + + replaces branches with more compact code if possible. + * same branch as in the next ===> nop + * branch to the next block ===> nop + * branch to ret block ===> ret + * cond branch over uncond branch ===> flip condition, skip next block + * cond branch to equivalent ===> pop args + nop + + + + + Blocks are identical if: + 1) have same regular instructions + 2) lead to unconditional control transfer (no fall through) + 3) branch with the same instruction to the same label + + + + + Returns reversed branch operation for the current block. + If no reverse opcode can be obtained Nop is returned. + + + + + Abstract Execution state. + If we know something interesting about IL stream we put it here. + + + + + Eval stack's high watermark. + + + + + Current evaluation stack depth. + + + + + Record effects of that currently emitted instruction on the eval stack. + + + + + In some cases we have to get a final IL offset during emit phase, for example for + proper emitting sequence points. The problem is that before the builder is realized we + don't know the actual IL offset, but only {block/offset-in-the-block} pair. + + Thus, whenever we need to mark some IL position we allocate a new marker id, store it + in allocatedILMarkers and reference this IL marker in the entity requiring the IL offset. + + IL markers will be 'materialized' when the builder is realized; the resulting offsets + will be put into allocatedILMarkers array. Note that only markers from reachable blocks + are materialized, the rest will have offset -1. + + + + + Realizes method body. + No more data can be added to the builder after this call. + + + + + Gets all scopes that contain variables. + + + + + Gets all scopes that contain variables. + + + + + IL opcodes emitted by this builder. + This includes branch instructions that end blocks except if they are fall-through NOPs. + + This count allows compilers to see if emitting a particular statement/expression + actually produced any instructions. + + Example: a label will not result in any code so when emitting debugging information + an extra NOP may be needed if we want to decorate the label with sequence point. + + + + + Marks blocks that are reachable. + + + + + Marks blocks that are recursively reachable from the given block. + + + + + If a label points to a block that does nothing other than passing to block X, + replaces target label's block with block X. + + + + + + Drops blocks that are not reachable + Returns true if any blocks were dropped + + + + + Marks all blocks unreachable. + + + + + Rewrite any block marked as BlockedByFinally as an "infinite loop". + + + Matches the code generated by the native compiler in + ILGENREC::AdjustBlockedLeaveTargets. + + + + + Returns true if the block has the signature of the special + labeled block that follows a complete try/catch or try/finally. + + + + + Returns true if any branches were optimized (that does not include shortening) + We need this because optimizing a branch may result in unreachable code that needs to be eliminated. + + === Example: + + x = 1; + + if (blah) + { + global = 1; + } + else + { + throw null; + } + + return x; + + === rewrites into + + push 1; + + if (blah) + { + global = 1; + ret; + } + else + { + throw null; + } + + // this ret unreachable now! + // even worse - empty stack is assumed thus the ret is illegal. + ret; + + + + + + Define a sequence point with the given syntax tree and span within it. + + + + + Defines a hidden sequence point. + The effect of this is that debugger will not associate following code + with any source (until it sees a lexically following sequence point). + + This is used for synthetic code that is reachable through labels. + + If such code is not separated from previous sequence point by the means of a hidden sequence point + It looks as a part of the statement that previous sequence point specifies. + As a result, when user steps through the code and goes through a jump to such label, + it will appear as if the jump landed at the beginning of the previous statement. + + NOTE: Also inserted as the first statement of a method that would not otherwise have a leading + sequence point so that step-into will find the method body. + + + + + Define a hidden sequence point at the first statement of + the method so that step-into will find the method body. + + + + + This is called when starting emitting a method for which there is some source. + It is done in case the first sequence point is a hidden point. + Even though hidden points do not have syntax, they need to associate with some document. + + + + + Marks the end of filter condition and start of the actual filter handler. + + + + + Puts local variable into current scope. + + + + + Puts local constant into current scope. + + + + + Mark current IL position with a label + + + + + Primary method for emitting string switch jump table + + switch case labels + fall through label for the jump table + Local holding the value to switch on. + This value has already been loaded onto the execution stack. + + Local holding the hash value of the key for emitting + hash table switch. Hash value has already been computed and loaded into keyHash. + This parameter is null if emitting non hash table switch. + + + Delegate to emit string compare call and conditional branch based on the compare result. + + + Delegate to compute string hash consistent with value of keyHash. + + + + + Primary method for emitting integer switch jump table. + + switch case labels + fall through label for the jump table. + Local or parameter holding the value to switch on. + This value has already been loaded onto the execution stack. + + Primitive type code of switch key. + + + + Finishes filter condition (and starts actual handler portion of the handler). + Returns the last block of the condition. + + + + + Generates code that creates an instance of multidimensional array + + + + + Generates code that loads an element of a multidimensional array + + + + + Generates code that loads an address of an element of a multidimensional array. + + + + + Generates code that stores an element of a multidimensional array. + + + + + Contains information about a label. + + + + + Sometimes we need to know if a label is targeted by conditional branches. + For example optimizer can do optimizations of branches into outer try scopes only + if they are unconditional (because there are no conditional Leave opcodes) + + + + + Used when we see a branch, but label is not yet marked. + + + + + Used when label is marked to the code. + + + + + Gets all scopes that contain variables. + + + + + Returns an ExceptionHandlerRegion for each exception handler clause + beneath the root scope. Each ExceptionHandlerRegion indicates the type + of clause (catch or finally) and the bounds of the try block and clause block. + + + + + Base class for IL scopes where a scope contains IL blocks and other nested + scopes. A scope may represent a scope for variable declarations, an exception + handler clause, or an entire exception handler (multiple clauses). + + + + + Recursively calculates the start and end of the given scope. + Only scopes with locals are actually dumped to the list. + + + + + Recursively calculates the start and end of the given scope. + Only scopes with locals are actually dumped to the list. + + + + + Free any basic blocks owned by this scope or sub-scopes. + + + + + Class that collects content of the scope (blocks, nested scopes, variables etc). + There is one for every opened scope. + + + + + A scope for a single try, catch, or finally clause. If the clause + is a catch clause, ExceptionType will be set. + + + + + A scope for an entire exception handler (a try block with either several + catches or a finally block). Unlike other scopes, this scope contains + nested scopes only, no IL blocks (although nested ExceptionHandlerScopes + for the clauses will contain IL blocks). + + + + + Compares scopes by their start (ascending) and then size (descending). + + + + + Unique identification of an emitted entity (method, lambda, closure) used for debugging purposes (EnC). + + + When used for a synthesized method the ordinal and generation numbers are included its name. + For user defined methods the ordinal is included in Custom Debug Information record attached to the method. + + + + + The index of the method in member list of the containing type, or if undefined. + + + + + The EnC generation the method was defined in (0 is the baseline build). + + + + + These opcodes represent control transfer. + They should not appear inside basic blocks. + + + + + Opcodes that represents a branch to a label. + + + + + Handles storage of items referenced via tokens in metadata. When items are stored + they are uniquely "associated" with fake tokens, which are basically sequential numbers. + IL gen will use these fake tokens during codegen and later, when actual values + are known, the method bodies will be patched. + To support these two scenarios we need two maps - Item-->uint, and uint-->Item. (The second is really just a list). + + + + + Gets the or corresponding to this token. + + + + + Debug information maintained for each lambda. + + + The information is emitted to PDB in Custom Debug Information record for a method containing the lambda. + + + + + The syntax offset of the syntax node declaring the lambda (lambda expression) or its body (lambda in a query). + + + + + The ordinal of the closure frame the lambda belongs to, or + if the lambda is static, or + if the lambda is closed over "this" pointer only. + + + + + We need a CCI representation for local constants because they are emitted as locals in + PDB scopes to improve the debugging experience (see LocalScopeProvider.GetConstantsInScope). + + + + + Id that associates an emitted user-defined or long-lived synthesized local variable + with a syntax node that defined it. If a syntax node defines multiple variables it + provides information necessary to identify which one of these variables is it. + + + + + We calculate a "syntax offset" for each user-defined and long-lived synthesized variable. + Every such variable symbol has to be associated with a syntax node (its declarator). + In usual cases this is the textual distance of the declarator from the start of the method body. + It gets a bit complicated when the containing method body is not contiguous (constructors). + If the variable is in the body of the constructor the definition of syntax offset is the same. + If the variable is defined in a constructor initializer or in a member initializer + (this is only possible when declaration expressions or closures in primary constructors are involved) + then the distance is a negative sum of the widths of all the initializers that succeed the declarator + of the variable in the emitted constructor body plus the relative offset of the declarator from + the start of the containing initializer. + + + + + If a single node is a declarator for multiple variables of the same synthesized kind (it can only happen for synthesized variables) + we calculate additional number "ordinal" for such variable. We assign the ordinals to the synthesized variables with the same kind + and syntax offset in the order as they appear in the lowered bound tree. It is important that a valid EnC edit can't change + the ordinal of a synthesized variable. If it could it would need to be assigned a different kind or associated with a different declarator node. + + + + . + + + + Creates a new LocalDefinition. + + Local symbol, used by edit and continue only, null otherwise. + Name associated with the slot. + Type associated with the slot. + Slot position in the signature. + Local kind. + Local id. + Value to emit in the attributes field in the PDB. + Specifies whether slot type should have pinned modifier and whether slot should have byref constraint. + The synthesized dynamic attributes of the local. + Tuple element names of the local. + + + + At this level there are two kinds of local variables: + + + Locals - have identities by which consuming code refers to them. + Typical use is a local variable or a compiler generated temp that can be accessed in multiple operations. + Any object can be used as identity. Reference equality is used. + + + Temps - do not have identity. They are borrowed and returned to the free list. + Typical use is a scratch temporary or spilling storage. + + + + + + + Structure that represents a local signature (as in ECMA-335, Partition I, §8.6.1.3 Local signatures). + + + + + Retrieve a local slot by its symbol. + + + + + Release a local slot by its symbol. + Slot is not associated with symbol after this. + + + + + Gets a local slot. + + + + + Frees a local slot. + + + + + An expression that creates an array instance in metadata. Only for use in custom attributes. + + + + + An expression that represents a (name, value) pair and that is typically used in method calls, custom attributes and object initializers. + + + + + The name of the parameter or property or field that corresponds to the argument. + + + + + The value of the argument. + + + + + True if the named argument provides the value of a field. + + + + + An expression that results in a System.Type instance. + + + + + The type that will be represented by the System.Type instance. + + + + + Holds on to the method body data. + + + + + This is a list of the using directives that were in scope for this method body. + + + + + True if there's a stackalloc somewhere in the method. + + + + + This class represents the PermissionSetAttribute specified in source which needs fixup during codegen. + + + PermissionSetAttribute needs fixup when it contains an assignment to the 'File' property as a single named attribute argument. + Fixup performed is ported from SecurityAttributes::FixUpPermissionSetAttribute at ndp\clr\src\vm\securityattributes.cpp. + It involves following steps: + 1) Verifying that the specified file name resolves to a valid path: This is done during binding. + 2) Reading the contents of the file into a byte array. + 3) Convert each byte in the file content into two bytes containing hexadecimal characters (see method ). + 4) Replacing the 'File = fileName' named argument with 'Hex = hexFileContent' argument, where hexFileContent is the converted output from step 3) above. + + + + + Zero or more positional arguments for the attribute constructor. + + + + + A reference to the constructor that will be used to instantiate this custom attribute during execution (if the attribute is inspected via Reflection). + + + + + Zero or more named arguments that specify values for fields and properties of the attribute. + + + + + The number of positional arguments. + + + + + The number of named arguments. + + + + + The type of the attribute. For example System.AttributeUsageAttribute. + + + + + Exception class to enable generating ERR_PermissionSetAttributeFileReadError while reading the file for PermissionSetAttribute fixup. + + + + + TypeDefinition that represents <PrivateImplementationDetails> class. + The main purpose of this class so far is to contain mapped fields and their types. + + + + + Simple struct type with explicit size and no members. + + + + + Definition of a simple field mapped to a metadata block + + + + + Just a default implementation of a type definition. + + + + + Represents a sequence point before translation by #line/ExternalSource directives. + + + + + Some features of the compiler (such as anonymous types, pay-as-you-go, NoPIA, ...) + rely on all referenced symbols to go through translate mechanism. Because by default + symbol translator does not translate some of indirectly referenced symbols, such as + type argument, we have to force translation here + + This class provides unified implementation for this functionality. + + + + + Scope of user-defined variable hoisted to state machine. + + + + + Maintains a list of sequence points in a space efficient way. Most of the time sequence points + occur in the same syntax tree, so optimize for that case. Store a sequence point as an offset, and + position in a syntax tree, then translate to CCI format only on demand. + + Use a ArrayBuilder{RawSequencePoint} to create. + + + + + Create a SequencePointList with the raw sequence points from an ArrayBuilder. + A linked list of instances for each syntax tree is created (almost always of length one). + + + + + Get all the sequence points, possibly mapping them using #line/ExternalSource directives, and mapping + file names to debug documents with the given mapping function. + + Function that maps file paths to CCI debug documents + where sequence points should be deposited + + + + Represents the combination of an IL offset and a source text span. + + + + + A local whose type is represented by a metadata signature instead of a type symbol. + + + Used when emitting a new version of a method during EnC for variables that are no longer used. + + + + + This temp is not interesting to the expression compiler. However, it + may be replaced by an interesting local in a later stage. + + + + + Debug information maintained for each state machine. + Facilitates mapping of state machine states from a compilation to the previous one (or to a metadata baseline) during EnC. + + + + + The number of the first state that has not been used in any of the previous versions of the state machine, + or null if we are not generating EnC delta. + + For 1st generation EnC delta, this is calculated by examining the stored in the baseline metadata. + For subsequent generations, the number is updated to account for newly generated states in that generation. + + + + + The number of the first state that has not been used in any of the previous versions of the state machine, + or null if we are not generating EnC delta, or the state machine has no decreasing states. + + For 1st generation EnC delta, this is calculated by examining the stored in the baseline metadata. + For subsequent generations, the number is updated to account for newly generated states in that generation. + + + + + Class for emitting the switch jump table for switch statements with integral governing type + + + + + Switch key for the jump table + + + + + Primitive type of the switch key + + + + + Fall through label for the jump table + + + + + Integral case labels sorted and indexed by their ConstantValue + + + + + Degenerate buckets here are buckets with contiguous range of constants + leading to the same label. Like: + + case 0: + case 1: + case 2: + case 3: + DoOneThing(); + break; + + case 4: + case 5: + case 6: + case 7: + DoAnotherThing(); + break; + + NOTE: A trivial bucket with only one case constant is by definition degenerate. + + + + + Try to merge with the nextBucket. + If merge results in a better bucket than two original ones, merge and return true. + Else don't merge and return false. + + + + + Switch key for the jump table + + + + + Switch case labels + + + + + Fall through label for the jump table + + + + + Delegate to emit string compare call and conditional branch based on the compare result. + + Key to compare + Case constant to compare the key against + Target label to branch to if key = stringConstant + + + + Delegate to compute string hash code. + This piece is language-specific because VB treats "" and null as equal while C# does not. + + + + + Delegate to emit string compare call + + + + + Delegate to emit string hash + + + + + Local storing the key hash value, used for emitting hash table based string switch. + + + + + Dispenser of unique ordinals for synthesized variable names that have the same kind and syntax offset. + + + + + Handles storage of items referenced via tokens in metadata (strings or Symbols). + When items are stored they are uniquely "associated" with fake token, which is basically + a sequential number. + IL gen will use these fake tokens during codegen and later, when actual token values are known + the method bodies will be patched. + To support these two scenarios we need two maps - Item-->uint, and uint-->Item. (the second is really just a list). + This map supports tokens of type and . + + + + + Returns an index of a slot that stores specified hoisted local variable in the previous generation. + + + + + Number of slots reserved for hoisted local variables. + + + Some of the slots might not be used anymore (a variable might have been deleted or its type changed). + Still, new hoisted variables are assigned slots starting with . + + + + + Returns true and an index of a slot that stores an awaiter of a specified type in the previous generation, if any. + + + + + Number of slots reserved for awaiters. + + + Some of the slots might not be used anymore (the type of an awaiter might have changed). + Still, new awaiters are assigned slots starting with . + + + + + The id of the method, or null if the method wasn't assigned one. + + + + + Finds a closure in the previous generation that corresponds to the specified syntax. + + + See LambdaFrame.AssertIsLambdaScopeSyntax for kinds of syntax nodes that represent closures. + + + + + Finds a lambda in the previous generation that corresponds to the specified syntax. + The is either a lambda syntax ( is false), + or lambda body syntax ( is true). + + + + + State number to be used for next state of the state machine, + or if none of the previous versions of the method was a state machine with an increasing state + + True if the state number increases with progress, false if it decreases (e.g. states for iterator try-finally blocks, or iterator states of async iterators). + + + + For a given node associated with entering a state of a state machine in the new compilation, + returns the ordinal of the corresponding state in the previous version of the state machine. + + + True if there is a corresponding node in the previous code version that matches the given . + + + is an await expression, yield return statement, or try block syntax node. + + + + + First state of an async iterator state machine that is used to resume the machine after yield return. + Initial state is not used to resume state machine that yielded. State numbers decrease as the iterator makes progress. + + + + + Initial iterator state of an async iterator. + Distinct from so that DisposeAsync can throw in latter case. + + + + + First state of an iterator state machine. State numbers decrease for subsequent finalize states. + + + + + First state in async state machine that is used to resume the machine after await. + State numbers increase as the async computation makes progress. + + + + + Initial iterator state of an iterator. + + + + + First state in iterator state machine that is used to resume the machine after yield return. + Initial state is not used to resume state machine that yielded. State numbers increase as the iterator makes progress. + + + + + Maps an array builder to immutable array. + + + + The array to map + The mapping delegate + If the items's length is 0, this will return an empty immutable array + + + + Maps an array builder to immutable array. + + + + + The sequence to map + The mapping delegate + The extra input used by mapping delegate + If the items's length is 0, this will return an empty immutable array. + + + + Maps an array builder to immutable array. + + + + + The sequence to map + The mapping delegate + The extra input used by mapping delegate + If the items's length is 0, this will return an empty immutable array. + + + + Create BitArray with at least the specified number of bits. + + + + + return a bit array with all bits set from index 0 through bitCount-1 + + + + + + + Make a copy of a bit array. + + + + + + Invert all the bits in the vector. + + + + + Is the given bit array null? + + + + + Modify this bit vector by bitwise AND-ing each element with the other bit vector. + For the purposes of the intersection, any bits beyond the current length will be treated as zeroes. + Return true if any changes were made to the bits of this bit vector. + + + + + Modify this bit vector by '|'ing each element with the other bit vector. + + + True if any bits were set as a result of the union. + + + + + The CachingLookup class provides a convenient representation of an ILookup that is based + upon a potentially slow lookup, and caches lookup results so that subsequent lookups are + fast. Internally a ConcurrentDictionary is used to cache lookup results. The client provides + two delegates to perform lookups: One that maps a key to a IEnumerable of values, and one + that provides all keys. + + The client must provide an IEqualityComparer used for comparing keys. Failed lookups are + cached, but that has the disadvantage that every different failed lookup will consume a + small amount of extra memory. However, that memory can be reclaimed by forcing a full + population of the cache. + + Thread safe. + + + + + Create a CachingLookup. + + A function that takes a key, and returns an IEnumerable of values that + correspond to that key. If no values correspond, the function may either return null or an empty + IEnumerable. + A function that returns an IEnumerable of all keys that have associated values. + A IEqualityComparer used to compare keys. + + + + Does this key have one or more associated values? + + + + + Get the values associated with a key. + + Key to look up. + All values associated with key. Returns an empty IEnumerable if + no values are associated. Never returns null. + + + + Get the number of distinct keys. + Forces a full population of the cache. + + + + + Enumerate all the keys. + Forces a full population of the cache. + + + + + Add the values from all keys to a flat array. + Forces a full population of the cache. + + + + + + Create an instance of the concurrent dictionary. + + The concurrent dictionary + + + + Create a dictionary instance suitable for use as the fully populated map. + + A new, empty dictionary, suitable for use as the fully populated map. + + + + Use the underlying (possibly slow) functions to get the values associated with a key. + + + + + Add a new value with the given key to the given concurrent map. + + The concurrent map to augment. + The key of the new entry. + The added entry. If there was a race, and another thread beat this one, then this returns the previously added entry. + + + + Determines if the given map is fully populated. + + The map to test. + true if the map is fully populated. + + + + Create the fully populated map from an existing map and the key generator. + + The existing map which may be null or a ConcurrentDictionary. + + + + + Fully populate the underlying dictionary. Once this returns, the dictionary is guaranteed + to have every key in it. + + + + + A MultiDictionary that allows only adding, and preserves the order of values added to the + dictionary. Thread-safe for reading, but not for adding. + + + Always uses the default comparer. + + + + + Add a value to the dictionary. + + + + + Get all values associated with K, in the order they were added. + Returns empty read-only array if no values were present. + + + + + Get a collection of all the keys. + + + + + Each value is either a single V or an . + Never null. + + + + + A set of ints that is small, thread-safe and lock free. + Several assumptions have been made that allow it to be small and fast: + 1. Deletes never happen. + 2. The size is small. In dogfooding experiments, 89% had 4 or fewer elements and + 98% had 8 or fewer elements. The largest size was 17. + 3. As a result of assumption 2, linear look-up is good enough. + 4. One value, in this case int.MinValue, is used as a sentinel and may never appear in the set. + + + + + Determine if the given integer appears in the set. + + The value to look up. + true if appears in the set. false otherwise. + + + + Insert the given value into the set. + + The value to insert + true if was added. false if it was already present. + + + + If the given slot is unoccupied, then try to replace it with a new value. + + The slot to examine. + The new value to insert if the slot is unoccupied. + An out param indicating whether the slot was successfully updated. + true if the value in the slot either now contains, or already contained . false otherwise. + + + + Provides methods for creating a segmented dictionary that is immutable; meaning it cannot be changed once it is + created. + + + + + Represents a segmented dictionary that is immutable; meaning it cannot be changed once it is created. + + + There are different scenarios best for and others + best for . + + In general, is applicable in scenarios most like + the scenarios where is applicable, and + is applicable in scenarios most like the scenarios where + is applicable. + + The following table summarizes the performance characteristics of + : + + + + Operation + Complexity + Complexity + Comments + + + Item + O(1) + O(log n) + Directly index into the underlying segmented dictionary + + + Add() + O(n) + O(log n) + Requires creating a new segmented dictionary + + + + This type is backed by segmented arrays to avoid using the Large Object Heap without impacting algorithmic + complexity. + + The type of the keys in the dictionary. + The type of the values in the dictionary. + + This type has a documented contract of being exactly one reference-type field in size. Our own + class depends on it, as well as others externally. + + IMPORTANT NOTICE FOR MAINTAINERS AND REVIEWERS: + + This type should be thread-safe. As a struct, it cannot protect its own fields from being changed from one + thread while its members are executing on other threads because structs can change in place simply by + reassigning the field containing this struct. Therefore it is extremely important that ⚠⚠ Every member + should only dereference this ONCE ⚠⚠. If a member needs to reference the + field, that counts as a dereference of this. Calling other instance members + (properties or methods) also counts as dereferencing this. Any member that needs to use this more + than once must instead assign this to a local variable and use that for the rest of the code instead. + This effectively copies the one field in the struct to a local variable so that it is insulated from other + threads. + + + + + The immutable collection this builder is based on. + + + + + The current mutable collection this builder is operating on. This field is initialized to a copy of + the first time a change is made. + + + + + The return value from the implementation of is + . This is the return value for most instances of this + enumerator. + + + + + The return value from the implementation of is + . This is the return value for instances of this + enumerator created by the implementation in + . + + + + + Private helper class for use only by . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The immutable collection this builder is based on. + + + + + The current mutable collection this builder is operating on. This field is initialized to a copy of + the first time a change is made. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Private helper class for use only by . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a segmented list that is immutable; meaning it cannot be changed once it is created. + + + There are different scenarios best for and others + best for . + + The following table summarizes the performance characteristics of + : + + + + Operation + Complexity + Complexity + Comments + + + Item + O(1) + O(log n) + Directly index into the underlying segmented list + + + Add() + Currently O(n), but could be O(1) with a relatively large constant + O(log n) + Currently requires creating a new segmented list, but could be modified to only clone the segments with changes + + + Insert() + O(n) + O(log n) + Requires creating a new segmented list and cloning all impacted segments + + + + This type is backed by segmented arrays to avoid using the Large Object Heap without impacting algorithmic + complexity. + + The type of the value in the list. + + This type has a documented contract of being exactly one reference-type field in size. Our own + class depends on it, as well as others externally. + + IMPORTANT NOTICE FOR MAINTAINERS AND REVIEWERS: + + This type should be thread-safe. As a struct, it cannot protect its own fields from being changed from one + thread while its members are executing on other threads because structs can change in place simply by + reassigning the field containing this struct. Therefore it is extremely important that ⚠⚠ Every member + should only dereference this ONCE ⚠⚠. If a member needs to reference the + field, that counts as a dereference of this. Calling other instance members + (properties or methods) also counts as dereferencing this. Any member that needs to use this more + than once must instead assign this to a local variable and use that for the rest of the code instead. + This effectively copies the one field in the struct to a local variable so that it is insulated from other + threads. + + + + + The immutable collection this builder is based on. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Private helper class for use only by . + + + + + The immutable collection this builder is based on. + + + + + The current mutable collection this builder is operating on. This field is initialized to a copy of + the first time a change is made. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Swaps the values in the two references if the first is greater than the second. + + + Swaps the values in the two references, regardless of whether the two references are the same. + + + Helper methods for use in array/span sorting routines. + + + How many ints must be allocated to represent n bits. Returns (n+31)/32, but avoids overflow. + + + Returns approximate reciprocal of the divisor: ceil(2**64 / divisor). + This should only be used on 64-bit. + + + Performs a mod operation using the multiplier pre-computed with . + + PERF: This improves performance in 64-bit scenarios at the expense of performance in 32-bit scenarios. Since + we only build a single AnyCPU binary, we opt for improved performance in the 64-bit scenario. + + + + + Provides static methods to invoke members on value types that explicitly implement the + member. + + + Normally, invocation of explicit interface members requires boxing or copying the value type, which is + especially problematic for operations that mutate the value. Invocation through these helpers behaves like a + normal call to an implicitly implemented member. + + + + + Provides static methods to invoke members on value types that explicitly implement + the member. + + + Normally, invocation of explicit interface members requires boxing or copying the value type, which is + especially problematic for operations that mutate the value. Invocation through these helpers behaves like a + normal call to an implicitly implemented member. + + + + + Provides static methods to invoke members on value types that explicitly implement the + member. + + + Normally, invocation of explicit interface members requires boxing or copying the value type, which is + especially problematic for operations that mutate the value. Invocation through these helpers behaves like a + normal call to an implicitly implemented member. + + + + + Provides static methods to invoke members on value types that explicitly implement + the member. + + + Normally, invocation of explicit interface members requires boxing or copying the value type, which is + especially problematic for operations that mutate the value. Invocation through these helpers behaves like a + normal call to an implicitly implemented member. + + + + + Provides static methods to invoke members on value types that explicitly implement the + member. + + + Normally, invocation of explicit interface members requires boxing or copying the value type, which is + especially problematic for operations that mutate the value. Invocation through these helpers behaves like a + normal call to an implicitly implemented member. + + + + + Used internally to control behavior of insertion into a or . + + + + + The default insertion behavior. + + + + + Specifies that an existing entry with the same key should be overwritten if encountered. + + + + + Specifies that if an existing entry with the same key is encountered, an exception should be thrown. + + + + + Returns a by-ref to type that is a null reference. + + + + + Returns if a given by-ref to type is a null reference. + + + This check is conceptually similar to (void*)(&source) == nullptr. + + + + + A combination of and + . + + + + + Calculates the maximum number of elements of size which can fit into an array + which has the following characteristics: + + The array can be allocated in the small object heap. + The array length is a power of 2. + + + The size of the elements in the array. + The segment size to use for small object heap segmented arrays. + + + + Calculates a shift which can be applied to an absolute index to get the page index within a segmented array. + + The number of elements in each page of the segmented array. Must be a power of 2. + The shift to apply to the absolute index to get the page index within a segmented array. + + + + Calculates a mask, which can be applied to an absolute index to get the index within a page of a segmented + array. + + The number of elements in each page of the segmented array. Must be a power of 2. + The bit mask to obtain the index within a page from an absolute index within a segmented array. + + + Equality comparer for hashsets of hashsets + + + Destination array is not long enough to copy all the items in the collection. Check array index and length. + + + Hashtable's capacity overflowed and went negative. Check load factor, capacity and the current size of the table. + + + The given key '{0}' was not present in the dictionary. + + + Destination array was not long enough. Check the destination index, length, and the array's lower bounds. + + + Source array was not long enough. Check the source index, length, and the array's lower bounds. + + + The lower bound of target array must be zero. + + + Only single dimensional arrays are supported for the requested action. + + + The value "{0}" is not of type "{1}" and cannot be used in this generic collection. + + + An item with the same key has already been added. Key: {0} + + + Target array type is not compatible with the type of items in the collection. + + + Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection. + + + Number was less than the array's lower bound in the first dimension. + + + Larger than collection size. + + + Count must be positive and count must refer to a location within the string/array/collection. + + + Index was out of range. Must be non-negative and less than the size of the collection. + + + Index must be within the bounds of the List. + + + Non-negative number required. + + + capacity was less than the current size. + + + Operations that change non-concurrent collections must have exclusive access. A concurrent update was performed on this collection and corrupted its state. The collection's state is no longer correct. + + + Collection was modified; enumeration operation may not execute. + + + Enumeration has either not started or has already finished. + + + Failed to compare two elements in the array. + + + Mutating a key collection derived from a dictionary is not allowed. + + + Mutating a value collection derived from a dictionary is not allowed. + + + The specified arrays must have the same number of dimensions. + + + Collection was of a fixed size. + + + Object is not a array with the same number of elements as the array to compare it to. + + + Unable to sort because the IComparer.Compare() method returns inconsistent results. Either a value does not compare equal to itself, or one value repeatedly compared to another value yields different results. IComparer: '{0}'. + + + Cannot find the old value + + + + Mutates a value in-place with optimistic locking transaction semantics via a specified transformation + function. The transformation is retried as many times as necessary to win the optimistic locking race. + + The type of value stored by the list. + + The variable or field to be changed, which may be accessed by multiple threads. + + + A function that mutates the value. This function should be side-effect free, + as it may run multiple times when races occur with other threads. + + if the location's value is changed by applying the result of the + function; otherwise, if the location's value remained + the same because the last invocation of returned the existing value. + + + + + Mutates a value in-place with optimistic locking transaction semantics via a specified transformation + function. The transformation is retried as many times as necessary to win the optimistic locking race. + + The type of value stored by the list. + The type of argument passed to the . + + The variable or field to be changed, which may be accessed by multiple threads. + + + A function that mutates the value. This function should be side-effect free, as it may run multiple times + when races occur with other threads. + The argument to pass to . + + if the location's value is changed by applying the result of the + function; otherwise, if the location's value remained + the same because the last invocation of returned the existing value. + + + + + Assigns a field or variable containing an immutable list to the specified value and returns the previous + value. + + The type of value stored by the list. + The field or local variable to change. + The new value to assign. + The prior value at the specified . + + + + Assigns a field or variable containing an immutable list to the specified value if it is currently equal to + another specified value. Returns the previous value. + + The type of value stored by the list. + The field or local variable to change. + The new value to assign. + The value to check equality for before assigning. + The prior value at the specified . + + + + Assigns a field or variable containing an immutable list to the specified value if it is has not yet been + initialized. + + The type of value stored by the list. + The field or local variable to change. + The new value to assign. + if the field was assigned the specified value; otherwise, + if it was previously initialized. + + + + Mutates a value in-place with optimistic locking transaction semantics via a specified transformation + function. The transformation is retried as many times as necessary to win the optimistic locking race. + + The type of value stored by the set. + + The variable or field to be changed, which may be accessed by multiple threads. + + + A function that mutates the value. This function should be side-effect free, + as it may run multiple times when races occur with other threads. + + if the location's value is changed by applying the result of the + function; otherwise, if the location's value remained + the same because the last invocation of returned the existing value. + + + + + Mutates a value in-place with optimistic locking transaction semantics via a specified transformation + function. The transformation is retried as many times as necessary to win the optimistic locking race. + + The type of value stored by the set. + The type of argument passed to the . + + The variable or field to be changed, which may be accessed by multiple threads. + + + A function that mutates the value. This function should be side-effect free, as it may run multiple times + when races occur with other threads. + The argument to pass to . + + if the location's value is changed by applying the result of the + function; otherwise, if the location's value remained + the same because the last invocation of returned the existing value. + + + + + Assigns a field or variable containing an immutable set to the specified value and returns the + previous value. + + The type of value stored by the set. + The field or local variable to change. + The new value to assign. + The prior value at the specified . + + + + Assigns a field or variable containing an immutable set to the specified value if it is currently + equal to another specified value. Returns the previous value. + + The type of value stored by the set. + The field or local variable to change. + The new value to assign. + The value to check equality for before assigning. + The prior value at the specified . + + + + Assigns a field or variable containing an immutable set to the specified value if it is has not yet + been initialized. + + The type of value stored by the set. + The field or local variable to change. + The new value to assign. + if the field was assigned the specified value; otherwise, + if it was previously initialized. + + + + Mutates a value in-place with optimistic locking transaction semantics via a specified transformation + function. The transformation is retried as many times as necessary to win the optimistic locking race. + + The type of key stored by the dictionary. + The type of value stored by the dictionary. + + The variable or field to be changed, which may be accessed by multiple threads. + + + A function that mutates the value. This function should be side-effect free, + as it may run multiple times when races occur with other threads. + + if the location's value is changed by applying the result of the + function; otherwise, if the location's value remained + the same because the last invocation of returned the existing value. + + + + + Mutates a value in-place with optimistic locking transaction semantics via a specified transformation + function. The transformation is retried as many times as necessary to win the optimistic locking race. + + The type of key stored by the dictionary. + The type of value stored by the dictionary. + The type of argument passed to the . + + The variable or field to be changed, which may be accessed by multiple threads. + + + A function that mutates the value. This function should be side-effect free, as it may run multiple times + when races occur with other threads. + The argument to pass to . + + if the location's value is changed by applying the result of the + function; otherwise, if the location's value remained + the same because the last invocation of returned the existing value. + + + + + Assigns a field or variable containing an immutable dictionary to the specified value and returns the + previous value. + + The type of key stored by the dictionary. + The type of value stored by the dictionary. + The field or local variable to change. + The new value to assign. + The prior value at the specified . + + + + Assigns a field or variable containing an immutable dictionary to the specified value if it is currently + equal to another specified value. Returns the previous value. + + The type of key stored by the dictionary. + The type of value stored by the dictionary. + The field or local variable to change. + The new value to assign. + The value to check equality for before assigning. + The prior value at the specified . + + + + Assigns a field or variable containing an immutable dictionary to the specified value if it is has not yet + been initialized. + + The type of key stored by the dictionary. + The type of value stored by the dictionary. + The field or local variable to change. + The new value to assign. + if the field was assigned the specified value; otherwise, + if it was previously initialized. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Defines a fixed-size collection with the same API surface and behavior as an "SZArray", which is a + single-dimensional zero-based array commonly represented in C# as T[]. The implementation of this + collection uses segmented arrays to avoid placing objects on the Large Object Heap. + + The type of elements stored in the array. + + + + The number of elements in each page of the segmented array of type . + + + The segment size is calculated according to , performs the IL operation + defined by . ECMA-335 defines this operation with the following note: + + sizeof returns the total size that would be occupied by each element in an array of this type – + including any padding the implementation chooses to add. Specifically, array elements lie sizeof + bytes apart. + + + + + The bit shift to apply to an array index to get the page index within . + + + + + The bit mask to apply to an array index to get the index within a page of . + + + + + Represents a collection of keys and values. + + + This collection has the same performance characteristics as , but + uses segmented arrays to avoid allocations in the Large Object Heap. + + The type of the keys in the dictionary. + The type of the values in the dictionary. + + + + Ensures that the dictionary can hold up to 'capacity' entries without any further expansion of its backing storage + + + + + Sets the capacity of this dictionary to what it would be if it had been originally initialized with all its entries + + + This method can be used to minimize the memory overhead + once it is known that no new elements will be added. + + To allocate minimum size storage array, execute the following statements: + + dictionary.Clear(); + dictionary.TrimExcess(); + + + + + Sets the capacity of this dictionary to hold up 'capacity' entries without any further expansion of its backing storage + + + This method can be used to minimize the memory overhead + once it is known that no new elements will be added. + + + + + 0-based index of next entry in chain: -1 means end of chain + also encodes whether this entry _itself_ is part of the free list by changing sign and subtracting 3, + so -2 means end of free list, -3 means index 0 but on free list, -4 means index 1 but on free list, etc. + + + + Cutoff point for stackallocs. This corresponds to the number of ints. + + + + When constructing a hashset from an existing collection, it may contain duplicates, + so this is used as the max acceptable excess ratio of capacity to count. Note that + this is only used on the ctor and not to automatically shrink if the hashset has, e.g, + a lot of adds followed by removes. Users must explicitly shrink by calling TrimExcess. + This is set to 3 because capacity is acceptable as 2x rounded up to nearest prime. + + + + Initializes the SegmentedHashSet from another SegmentedHashSet with the same element type and equality comparer. + + + Removes all elements from the object. + + + Determines whether the contains the specified element. + The element to locate in the object. + true if the object contains the specified element; otherwise, false. + + + Gets the index of the item in , or -1 if it's not in the set. + + + Gets a reference to the specified hashcode's bucket, containing an index into . + + + Gets the number of elements that are contained in the set. + + + Adds the specified element to the . + The element to add to the set. + true if the element is added to the object; false if the element is already present. + + + Searches the set for a given value and returns the equal value it finds, if any. + The value to search for. + The value from the set that the search found, or the default value of when the search yielded no match. + A value indicating whether the search was successful. + + This can be useful when you want to reuse a previously stored reference instead of + a newly constructed one (so that more sharing of references can occur) or to look up + a value that has more complete data than the value you currently have, although their + comparer functions indicate they are equal. + + + + Modifies the current object to contain all elements that are present in itself, the specified collection, or both. + The collection to compare to the current object. + + + Modifies the current object to contain only elements that are present in that object and in the specified collection. + The collection to compare to the current object. + + + Removes all elements in the specified collection from the current object. + The collection to compare to the current object. + + + Modifies the current object to contain only elements that are present either in that object or in the specified collection, but not both. + The collection to compare to the current object. + + + Determines whether a object is a subset of the specified collection. + The collection to compare to the current object. + true if the object is a subset of ; otherwise, false. + + + Determines whether a object is a proper subset of the specified collection. + The collection to compare to the current object. + true if the object is a proper subset of ; otherwise, false. + + + Determines whether a object is a proper superset of the specified collection. + The collection to compare to the current object. + true if the object is a superset of ; otherwise, false. + + + Determines whether a object is a proper superset of the specified collection. + The collection to compare to the current object. + true if the object is a proper superset of ; otherwise, false. + + + Determines whether the current object and a specified collection share common elements. + The collection to compare to the current object. + true if the object and share at least one common element; otherwise, false. + + + Determines whether a object and the specified collection contain the same elements. + The collection to compare to the current object. + true if the object is equal to ; otherwise, false. + + + Copies the elements of a object to an array, starting at the specified array index. + The destination array. + The zero-based index in array at which copying begins. + + + Removes all elements that match the conditions defined by the specified predicate from a collection. + + + Gets the object that is used to determine equality for the values in the set. + + + Ensures that this hash set can hold the specified number of elements without growing. + + + + Sets the capacity of a object to the actual number of elements it contains, + rounded up to a nearby, implementation-specific value. + + + + Returns an object that can be used for equality testing of a object. + + + + Initializes buckets and slots arrays. Uses suggested capacity by finding next prime + greater than or equal to capacity. + + + + Adds the specified element to the set if it's not already contained. + The element to add to the set. + The index into of the element. + true if the element is added to the object; false if the element is already present. + + + + Checks if this contains of other's elements. Iterates over other's elements and + returns false as soon as it finds an element in other that's not in this. + Used by SupersetOf, ProperSupersetOf, and SetEquals. + + + + + Implementation Notes: + If other is a hashset and is using same equality comparer, then checking subset is + faster. Simply check that each element in this is in other. + + Note: if other doesn't use same equality comparer, then Contains check is invalid, + which is why callers must take are of this. + + If callers are concerned about whether this is a proper subset, they take care of that. + + + + + If other is a hashset that uses same equality comparer, intersect is much faster + because we can use other's Contains + + + + + Iterate over other. If contained in this, mark an element in bit array corresponding to + its position in _slots. If anything is unmarked (in bit array), remove it. + + This attempts to allocate on the stack, if below StackAllocThreshold. + + + + + if other is a set, we can assume it doesn't have duplicate elements, so use this + technique: if can't remove, then it wasn't present in this set, so add. + + As with other methods, callers take care of ensuring that other is a hashset using the + same equality comparer. + + + + + + Implementation notes: + + Used for symmetric except when other isn't a SegmentedHashSet. This is more tedious because + other may contain duplicates. SegmentedHashSet technique could fail in these situations: + 1. Other has a duplicate that's not in this: SegmentedHashSet technique would add then + remove it. + 2. Other has a duplicate that's in this: SegmentedHashSet technique would remove then add it + back. + In general, its presence would be toggled each time it appears in other. + + This technique uses bit marking to indicate whether to add/remove the item. If already + present in collection, it will get marked for deletion. If added from other, it will + get marked as something not to remove. + + + + + + + Determines counts that can be used to determine equality, subset, and superset. This + is only used when other is an IEnumerable and not a SegmentedHashSet. If other is a SegmentedHashSet + these properties can be checked faster without use of marking because we can assume + other has no duplicates. + + The following count checks are performed by callers: + 1. Equals: checks if unfoundCount = 0 and uniqueFoundCount = _count; i.e. everything + in other is in this and everything in this is in other + 2. Subset: checks if unfoundCount >= 0 and uniqueFoundCount = _count; i.e. other may + have elements not in this and everything in this is in other + 3. Proper subset: checks if unfoundCount > 0 and uniqueFoundCount = _count; i.e + other must have at least one element not in this and everything in this is in other + 4. Proper superset: checks if unfound count = 0 and uniqueFoundCount strictly less + than _count; i.e. everything in other was in this and this had at least one element + not contained in other. + + An earlier implementation used delegates to perform these checks rather than returning + an ElementCount struct; however this was changed due to the perf overhead of delegates. + + + Allows us to finish faster for equals and proper superset + because unfoundCount must be 0. + + + + Checks if equality comparers are equal. This is used for algorithms that can + speed up if it knows the other item has unique elements. I.e. if they're using + different equality comparers, then uniqueness assumption between sets break. + + + + + 0-based index of next entry in chain: -1 means end of chain + also encodes whether this entry _itself_ is part of the free list by changing sign and subtracting 3, + so -2 means end of free list, -3 means index 0 but on free list, -4 means index 1 but on free list, etc. + + + + + Represents a strongly typed list of objects that can be accessed by index. Provides methods to search, sort, and + manipulate lists. + + + This collection has the same performance characteristics as , but uses segmented + arrays to avoid allocations in the Large Object Heap. + + The type of elements in the list. + + + + Extension methods associated with ConsList. + + + + + The collection of extension methods for the type + + + + + If the given key is not found in the dictionary, add it with the given value and return the value. + Otherwise return the existing value associated with that key. + + + + + A simple class to implement IGrouping. + + + + + A dictionary that maps strings to all known spellings of that string. Can be used to + efficiently store the set of known type names for a module for both VB and C# while also + answering questions like "do you have a type called Goo" in either a case sensitive or + insensitive manner. + + + + + The collection of extension methods for the type + + + + + Converts a sequence to an immutable array. + + Elemental type of the sequence. + The sequence to convert. + An immutable copy of the contents of the sequence. + If items is null (default) + If the sequence is null, this will throw + + + + Converts a sequence to an immutable array. + + Elemental type of the sequence. + The sequence to convert. + An immutable copy of the contents of the sequence. + If the sequence is null, this will return an empty array. + + + + Converts a sequence to an immutable array. + + Elemental type of the sequence. + The sequence to convert. + An immutable copy of the contents of the sequence. + If the sequence is null, this will return the default (null) array. + + + + Converts an array to an immutable array. The array must not be null. + + + The sequence to convert + + + + + Converts a array to an immutable array. + + + The sequence to convert + + If the sequence is null, this will return the default (null) array. + + + + Converts an array to an immutable array. + + + The sequence to convert + If the array is null, this will return an empty immutable array. + + + + Reads bytes from specified . + + The stream. + Read-only content of the stream. + + + + Maps an immutable array to another immutable array. + + + + The array to map + The mapping delegate + If the items's length is 0, this will return an empty immutable array + + + + Maps an immutable array to another immutable array. + + + + + The sequence to map + The mapping delegate + The extra input used by mapping delegate + If the items's length is 0, this will return an empty immutable array. + + + + Maps an immutable array to another immutable array. + + + + + The sequence to map + The mapping delegate + The extra input used by mapping delegate + If the items's length is 0, this will return an empty immutable array. + + + + Maps a subset of immutable array to another immutable array. + + Type of the source array items + Type of the transformed array items + The array to transform + The condition to use for filtering the array content. + A transform function to apply to each element that is not filtered out by . + If the items's length is 0, this will return an empty immutable array. + + + + Maps an immutable array through a function that returns ValueTasks, returning the new ImmutableArray. + + + + + Zips two immutable arrays together through a mapping function, producing another immutable array. + + If the items's length is 0, this will return an empty immutable array. + + + + Creates a new immutable array based on filtered elements by the predicate. The array must not be null. + + The array to process + The delegate that defines the conditions of the element to search for. + + + + Creates a new immutable array based on filtered elements by the predicate. The array must not be null. + + The array to process + The delegate that defines the conditions of the element to search for. + + + + Casts the immutable array of a Type to an immutable array of its base type. + + + + + Determines whether this instance and another immutable array are equal. + + + + + The comparer to determine if the two arrays are equal. + True if the two arrays are equal + + + + Returns an empty array if the input array is null (default) + + + + + Returns an empty array if the input nullable value type is null or the underlying array is null (default) + + + + + Returns an array of distinct elements, preserving the order in the original array. + If the array has no duplicates, the original array is returned. The original array must not be null. + + + + + A representation of a string of characters that requires O(1) extra space to concatenate two ropes. + + + + + A rope can wrap a simple string. + + + + + A rope can be formed from the concatenation of two ropes. + + + + + Two ropes are "the same" if they represent the same sequence of characters. + + + + + A rope that wraps a simple string. + + + + + A rope that represents the concatenation of two ropes. + + + + + Dictionary designed to hold small number of items. + Compared to the regular Dictionary, average overhead per-item is roughly the same, but + unlike regular dictionary, this one is based on an AVL tree and as such does not require + rehashing when items are added. + It does require rebalancing, but that is allocation-free. + + Major caveats: + 1) There is no Remove method. (can be added, but we do not seem to use Remove that much) + 2) foreach [keys|values|pairs] may allocate a small array. + 3) Performance is no longer O(1). At a certain count it becomes slower than regular Dictionary. + In comparison to regular Dictionary on my machine: + On trivial number of elements (5 or so) it is more than 2x faster. + The break even count is about 120 elements for read and 55 for write operations (with unknown initial size). + At UShort.MaxValue elements, this dictionary is 6x slower to read and 4x slower to write + + Generally, this dictionary is a win if number of elements is small, not known beforehand or both. + + If the size of the dictionary is known at creation and it is likely to contain more than 10 elements, + then regular Dictionary is a better choice. + + + + + Gets a mutable reference to a stored in a using variable. + + + This supporting method allows , a non-copyable + implementing , to be used with using statements while still allowing them to + be passed by reference in calls. The following two calls are equivalent: + + + using var array = TemporaryArray<T>.Empty; + + // Using the 'Unsafe.AsRef' method + Method(ref Unsafe.AsRef(in array)); + + // Using this helper method + Method(ref array.AsRef()); + + + ⚠ Do not move or rename this method without updating the corresponding + RS0049 + analyzer. + + The type of element stored in the temporary array. + A read-only reference to a temporary array which is part of a using statement. + A mutable reference to the temporary array. + + + + Provides temporary storage for a collection of elements. This type is optimized for handling of small + collections, particularly for cases where the collection will eventually be discarded or used to produce an + . + + + This type stores small collections on the stack, with the ability to transition to dynamic storage if/when + larger number of elements are added. + + The type of elements stored in the collection. + + + + The number of elements the temporary can store inline. Storing more than this many elements requires the + array transition to dynamic storage. + + + + + The first inline element. + + + This field is only used when is . In other words, this type + stores elements inline or stores them in , but does not use both approaches + at the same time. + + + + + The second inline element. + + + + + + The third inline element. + + + + + + The fourth inline element. + + + + + + The number of inline elements held in the array. This value is only used when is + . + + + + + A builder used for dynamic storage of collections that may exceed the limit for inline elements. + + + This field is initialized to non- the first time the + needs to store more than four elements. From that point, is used instead of inline + elements, even if items are removed to make the result smaller than four elements. + + + + + Create an with the elements currently held in the temporary array, and clear + the array. + + + + + + Transitions the current from inline storage to dynamic storage storage. An + instance is taken from the shared pool, and all elements currently in inline + storage are added to it. After this point, dynamic storage will be used instead of inline storage. + + + + + Throws . + + + This helper improves the ability of the JIT to inline callers. + + + + + A helper class that contains a topological sort algorithm. + + + + + Produce a topological sort of a given directed acyclic graph, given a set of nodes which include all nodes + that have no predecessors. Any nodes not in the given set, but reachable through successors, will be added + to the result. This is an iterative rather than recursive implementation, so it is unlikely to cause a stack + overflow. + + The type of the node + Any subset of the nodes that includes all nodes with no predecessors + A function mapping a node to its set of successors + A list of all reachable nodes, in which each node always precedes its successors + true if successful; false if not successful due to cycles in the graph + + + + Implements a readonly collection over a set of existing collections. This can be used to + prevent having to copy items from one collection over to another (thus bloating space). + + Note: this is a *collection*, not a *set*. There is no removal of duplicated elements. This + allows us to be able to efficiently do operations like CopyTo, Count, etc. in O(c) time + instead of O(n) (where 'c' is the number of collections and 'n' is the number of elements). + If you have a few collections with many elements in them, then this is an appropriate + collection for you. + + + + + Represents a single EditorConfig file, see https://editorconfig.org for details about the format. + + + + + Key that indicates if this config is a global config + + + + + Key that indicates the precedence of this config when is true + + + + + Filename that indicates this file is a user provided global config + + + + + A set of keys that are reserved for special interpretation for the editorconfig specification. + All values corresponding to reserved keys in a (key,value) property pair are always lowercased + during parsing. + + + This list was retrieved from https://github.com/editorconfig/editorconfig/wiki/EditorConfig-Properties + at 2018-04-21 19:37:05Z. New keys may be added to this list in newer versions, but old ones will + not be removed. + + + + + A set of values that are reserved for special use for the editorconfig specification + and will always be lower-cased by the parser. + + + + + The directory the editorconfig was contained in, with all directory separators + replaced with '/'. + + + + + The path passed to during construction. + + + + + Comparer for sorting files by path length. + + + + + Gets whether this editorconfig is a topmost editorconfig. + + + + + Gets whether this editorconfig is a global editorconfig. + + + + + Get the global level of this config, used to resolve conflicting keys + + + A user can explicitly set the global level via the . + When no global level is explicitly set, we use a heuristic: + + + Any file matching the is determined to be a user supplied global config and gets a level of 100 + + + Any other file gets a default level of 0 + + + + This value is unused when is false. + + + + + Parses an editor config file text located at the given path. No parsing + errors are reported. If any line contains a parse error, it is dropped. + + + + + Parses an editor config file text located at the given path. No parsing + errors are reported. If any line contains a parse error, it is dropped. + + + + + Represents a named section of the editorconfig file, which consists of a name followed by a set + of key-value pairs. + + + + + Used to compare s of sections. Specified by editorconfig to + be a case-sensitive comparison. + + + + + Used to compare s of sections. Specified by editorconfig to + be a case-sensitive comparison. + + + + + Used to compare keys in . The editorconfig spec defines property + keys as being compared case-insensitively according to Unicode lower-case rules. + + + + + For regular files, the name as present directly in the section specification of the editorconfig file. For sections in + global configs, this is the unescaped full file path. + + + + + Keys and values for this section. All keys are lower-cased according to the + EditorConfig specification and keys are compared case-insensitively. Values are + lower-cased if the value appears in + or if the corresponding key is in . Otherwise, + the values are the literal values present in the source. + + + + + Takes a and creates a matcher that + matches the given language. Returns null if the section name is + invalid. + + + + + Test if a section name is an absolute path with no special chars + + + + + ::= | + ::= "*" | "**" | "?" | | | + ::= any unicode character + ::= "{" "}" + ::= | "," + ]]> + + + + + Compile a globbing character class of the form [...]. Returns true if + the character class was successfully compiled. False if there was a syntax + error. The starting character is expected to be directly after the '['. + + + + + Parses choice defined by the following grammar: + ::= "{" "}" + ::= | "," + ]]> + + + + + Parses range defined by the following grammar. + ::= "{" ".." "}" + ::= "-" | + ::= | + ::= 0-9 + ]]> + + + + + Call after getting from + + + + + Returns false if there are no more characters in the lex stream. + Otherwise, produces the next character in the stream and returns true. + + + + + Returns the string representation of a decimal integer, or null if + the current lexeme is not an integer. + + + + + Holds results from . + + + + + Options that customize diagnostic severity as reported by the compiler. + + + + + Options that do not have any special compiler behavior and are passed to analyzers as-is. + + + + + Any produced diagnostics while applying analyzer configuration. + + + + + Represents a set of , and can compute the effective analyzer options for a given source file. This is used to + collect all the files for that would apply to a compilation. + + + + + The list of s in this set. This list has been sorted per . + This does not include any of the global configs that were merged into . + + + + + s for each section. The entries in the outer array correspond to entries in , and each inner array + corresponds to each . + + + + + Gets an that contain the options that apply globally + + + + + Returns a for a source file. This computes which rules applies to this file, and correctly applies + precedence rules if there are multiple rules for the same file. + + The path to a file such as a source file or additional file. Must be non-null. + This method is safe to call from multiple threads. + + + + Merge any partial global configs into a single global config, and remove the partial configs + + An of containing a mix of regular and unmerged partial global configs + Diagnostics produced during merge will be added to this bag + A that contains the merged partial configs, or null if there were no partial configs + + + + Builds a global analyzer config from a series of partial configs + + + + + Represents a combined global analyzer config. + + + We parse all s as individual files, according to the editorconfig spec. + + However, when viewing the configs as an if multiple files have the + is_global property set to true we combine those files and treat them as a single + 'logical' global config file. This type represents that combined file. + + + + + Describes a command line analyzer assembly specification. + + + + + Assembly file path. + + + + + The base class for representing command line arguments to a + . + + + + + Drop to an interactive loop. If a script is specified in executes the script first. + + + + + Directory used to resolve relative paths stored in the arguments. + + + Except for paths stored in , all + paths stored in the properties of this class are resolved and + absolute. This is the directory that relative paths specified on + command line were resolved against. + + + + + A list of pairs of paths. This stores the value of the command-line compiler + option /pathMap:X1=Y1;X2=Y2... which causes a prefix of X1 followed by a path + separator to be replaced by Y1 followed by a path separator, and so on for each following pair. + + + This option is used to help get build-to-build determinism even when the build + directory is different from one build to the next. The prefix matching is case sensitive. + + + + + Sequence of absolute paths used to search for references. + + + + + Sequence of absolute paths used to search for sources specified as #load directives. + + + + + Sequence of absolute paths used to search for key files. + + + + + If true, use UTF-8 for output. + + + + + Compilation name or null if not specified. + + + + + Gets the emit options. + + + + + Name of the output file or null if not specified. + + + + + Path of the output ref assembly or null if not specified. + + + + + Path of the PDB file or null if same as output binary path with .pdb extension. + + + + + Path of the file containing information linking the compilation to source server that stores + a snapshot of the source code included in the compilation. + + + + + Absolute path of the .ruleset file or null if not specified. + + + + + True to emit PDB information (to a standalone PDB file or embedded into the PE file). + + + + + Absolute path of the output directory (could only be null if there is an error reported). + + + + + Absolute path of the documentation comment XML file or null if not specified. + + + + + Absolute path of the directory to place generated files in, or null to not emit any generated files. + + + + + Options controlling the generation of a SARIF log file containing compilation or + analysis diagnostics, or null if no log file is desired. + + + + + Options controlling the generation of a SARIF log file containing compilation or + analysis diagnostics, or null if no log file is desired. + + + + + An absolute path of the app.config file or null if not specified. + + + + + Errors while parsing the command line arguments. + + + + + References to metadata supplied on the command line. + Includes assemblies specified via /r and netmodules specified via /addmodule. + + + + + References to analyzers supplied on the command line. + + + + + A set of paths to EditorConfig-compatible analyzer config files. + + + + + A set of additional non-code text files that can be used by analyzers. + + + + + A set of files to embed in the PDB. + + + + + Report additional information related to analyzers, such as analyzer execution time. + + + + + Skip execution of s. + + + + + If true, prepend the command line header logo during + . + + + + + If true, append the command line help during + + + + + + If true, append the compiler version during + + + + + + If true, prepend the compiler-supported language versions during + + + + + + The path to a Win32 resource. + + + + + The path to a .ico icon file. + + + + + The path to a Win32 manifest file to embed + into the output portable executable (PE) file. + + + + + If true, do not embed any Win32 manifest, including + one specified by or any + default manifest. + + + + + Resources specified as arguments to the compilation. + + + + + Encoding to be used for source files or 'null' for autodetect/default. + + + + + Hash algorithm to use to calculate source file debug checksums and PDB checksum. + + + + + Arguments following a script file or separator "--". Null if the command line parser is not interactive. + + + + + Source file paths. + + + Includes files specified directly on command line as well as files matching patterns specified + on command line using '*' and '?' wildcards or /recurse option. + + + + + Full path of a log of file paths accessed by the compiler, or null if file logging should be suppressed. + + + Two log files will be created: + One with path and extension ".read" logging the files read, + and second with path and extension ".write" logging the files written to during compilation. + + + + + If true, prints the full path of the file containing errors or + warnings in diagnostics. + + + + + Options to the . + + + + + + Options to the . + + + + + Specify the preferred output language name. + + + + + Returns a full path of the file that the compiler will generate the assembly to if compilation succeeds. + + + The method takes rather than using the value of + since the latter might be unspecified, in which case actual output path can't be determined for C# command line + without creating a compilation and finding an entry point. VB does not allow to + be unspecified. + + + + + Returns a full path of the PDB file that the compiler will generate the debug symbols to + if is true and the compilation succeeds. + + + The method takes rather than using the value of + since the latter might be unspecified, in which case actual output path can't be determined for C# command line + without creating a compilation and finding an entry point. VB does not allow to + be unspecified. + + + + + Returns true if the PDB is generated to a PDB file, as opposed to embedded to the output binary and not generated at all. + + + + + Resolves metadata references stored in using given file resolver and metadata provider. + + to use for assembly name and relative path resolution. + Yields resolved metadata references or . + is null. + + + + Resolves metadata references stored in using given file resolver and metadata provider. + If a non-null diagnostic bag is provided, it catches exceptions that may be generated while reading the metadata file and + reports appropriate diagnostics. + Otherwise, if is null, the exceptions are unhandled. + + + called by CommonCompiler with diagnostics and message provider + + + + + Resolves analyzer references stored in using given file resolver. + + Load an assembly from a file path + Yields resolved or . + + + + Enumerates files in the specified directory and subdirectories whose name matches the given pattern. + + Full path of the directory to enumerate. + File name pattern. May contain wildcards '*' (matches zero or more characters) and '?' (matches any character). + Specifies whether to search the specified only, or all its subdirectories as well. + Sequence of file paths. + + + + Parses a command line. + + A collection of strings representing the command line arguments. + The base directory used for qualifying file locations. + The directory to search for mscorlib, or null if not available. + A string representing additional reference paths. + a object representing the parsed command line. + + + + Determines if a is equal to the provided option name + + + Prefer this over the Equals methods on . The + implementation allocates a . + The 99% case here is that we are dealing with an ASCII string that matches the input hence + it's worth special casing that here and falling back to the more complicated comparison + when dealing with non-ASCII input + + + + + Trims all '.' and whitespace from the end of the path + + + + + Splits specified on + treating two consecutive separators as if they were a single non-separating character. + E.g. "a,,b,c" split on ',' yields ["a,b", "c"]. + + + + + Returns false if any of the client arguments are invalid and true otherwise. + + + The original args to the client. + + + The original args minus the client args, if no errors were encountered. + + + Only defined if no errors were encountered. + True if '/shared' was an argument, false otherwise. + + + Only defined if no errors were encountered. + The value to the '/keepalive' argument if one was specified, null otherwise. + + + Only defined if errors were encountered. + The error message for the encountered error. + + + Only specified if is true and the session key + was provided. Can be null + + + + + See + + + + + Remove the extraneous quotes and slashes from the argument. This function is designed to have + compat behavior with the native compiler. + + + Mimics the function RemoveQuotes from the native C# compiler. The native VB equivalent of this + function is called RemoveQuotesAndSlashes. It has virtually the same behavior except for a few + quirks in error cases. + + + + + Split a string by a set of separators, taking quotes into account. + + + + + Tries to parse a UInt64 from string in either decimal, octal or hex format. + + The string value. + The result if parsing was successful. + true if parsing was successful, otherwise false. + + + + Tries to parse a UInt16 from string in either decimal, octal or hex format. + + The string value. + The result if parsing was successful. + true if parsing was successful, otherwise false. + + + + Sort so that more specific keys precede less specific. + When mapping a path we find the first key in the array that is a prefix of the path. + If multiple keys are prefixes of the path we want to use the longest (more specific) one for the mapping. + + + + + Describes a command line metadata reference (assembly or netmodule) specification. + + + + + Metadata file path or an assembly display name. + + + + + Metadata reference properties. + + + + + Describes a source file specification stored on command line arguments. + + + + + Resolved absolute path of the source file (does not contain wildcards). + + + Although this path is absolute it may not be normalized. That is, it may contain ".." and "." in the middle. + + + + + True if the input has been redirected from the standard input stream. + + + + + True if the file should be treated as a script file. + + + + + Base class for csc.exe, csi.exe, vbc.exe and vbi.exe implementations. + + + + + This implementation of will delay the creation + of the PE / PDB file until the compiler determines the compilation has succeeded. This prevents + the compiler from deleting output from the previous compilation when a new compilation + fails. The method must be called to retrieve all diagnostics. + + + + + Looks for metadata references among the assembly file references given to the compilation when constructed. + When scripts are included into a project we don't want #r's to reference other assemblies than those + specified explicitly in the project references. + + + + + Fallback encoding that is lazily retrieved if needed. If is + evaluated and stored, the value is used if a PDB is created for this compilation. + + + + + The set of source file paths that are in the set of embedded paths. + This is used to prevent reading source files that are embedded twice. + + + + + The used to access the file system inside this instance. + + + + + Print compiler version + + + + + + The type of the compiler class for version information in /help and /version. + We don't simply use this.GetType() because that would break mock subclasses. + + + + + The version of this compiler with commit hash, used in logo and /version output. + + + + + Tool name used, along with assembly version, for error logging. + + + + + Tool version identifier used for error logging. + + + + + Resolves metadata references stored in command line arguments and reports errors for those that can't be resolved. + + + + + Reads content of a source file. + + Source file information. + Storage for diagnostics. + File content or null on failure. + + + + Reads content of a source file. + + Source file information. + Storage for diagnostics. + If given opens successfully, set to normalized absolute path of the file, null otherwise. + File content or null on failure. + + + + Read all analyzer config files from the given paths. + + + + + Returns the fallback encoding for parsing source files, if used, or null + if not used + + + + + Read a UTF-8 encoded file and return the text as a string. + + + + Returns true if there were any errors, false otherwise. + + + Returns true if there were any errors, false otherwise. + + + Returns true if there were any errors, false otherwise. + + + + Returns true if there are any error diagnostics in the bag which cannot be suppressed and + are guaranteed to break the build. + Only diagnostics which have default severity error and are tagged as NotConfigurable fall in this bucket. + This includes all compiler error diagnostics and specific analyzer error diagnostics that are marked as not configurable by the analyzer author. + + + + + Returns true if the bag has any diagnostics with effective Severity=Error. Also returns true for warnings or informationals + or warnings promoted to error via /warnaserror which are not suppressed. + + + + + csc.exe and vbc.exe entry point. + + + + + Perform source generation, if the compiler supports it. + + The compilation before any source generation has occurred. + The to use when parsing any generated sources. + The generators to run + A provider that returns analyzer config options. + Any additional texts that should be passed to the generators when run. + Any diagnostics that were produced during generation. + A compilation that represents the original compilation with any additional, generated texts added to it. + + + + Perform all the work associated with actual compilation + (parsing, binding, compile, emit), resulting in diagnostics + and analyzer output. + + + + + Returns the name with which the assembly should be output + + + + + When overridden by a derived class, this property can override the current thread's + CurrentUICulture property for diagnostic message resource lookups. + + + + + Looks for metadata references among the assembly file references given to the compilation when constructed. + When scripts are included into a project we don't want #r's to reference other assemblies than those + specified explicitly in the project references. + + + + + Special informational diagnostic for each programmatic reported by a . + + + + + The path which contains the compiler binaries and response files. + + + + + The path in which the compilation takes place. This is also referred to as "baseDirectory" in + the code base. + + + + + The path which contains mscorlib. This can be null when specified by the user or running in a + CoreClr environment. + + + + + The temporary directory a compilation should use instead of . The latter + relies on global state individual compilations should ignore. + + + + + Base class for logging compiler diagnostics. + + + + + Options controlling the generation of a SARIF log file containing compilation or analyzer diagnostics. + + + + + Absolute path of the error log file. + + + + + Version of the SARIF format used in the error log. + + + + + Initializes a new instance of the class. + + Absolute path of the error log file. + Version of the SARIF format used in the error log. + + + + Compares descriptors by the values that we write to a SARIF log and nothing else. + + We cannot just use 's built-in implementation + of for two reasons: + + 1. is part of that built-in + equatability, but we do not write it out, and so descriptors differing only + by MessageFormat (common) would lead to duplicate rule metadata entries in + the log. + + 2. is *not* part of that built-in + equatability, but we do write them out, and so descriptors differing only + by CustomTags (rare) would cause only one set of tags to be reported in the + log. + + + + + Base class for the and classes. + The SarifV2ErrorLogger produces the standardized SARIF v2.1.0. The SarifV1ErrorLogger produces + the non-standardized SARIF v1.0.0. It is retained (and in fact, is retained as the default) + for compatibility with previous versions of the compiler. Customers who want to integrate + with standardized SARIF tooling should specify /errorlog:logFilePath;version=2 on the command + line to produce SARIF v2.1.0. + + + + + Used for logging compiler diagnostics to a stream in the unstandardized SARIF + (Static Analysis Results Interchange Format) v1.0.0 format. + https://github.com/sarif-standard/sarif-spec + https://rawgit.com/sarif-standard/sarif-spec/main/Static%20Analysis%20Results%20Interchange%20Format%20(SARIF).html + + + To log diagnostics in the standardized SARIF v2.1.0 format, use the SarifV2ErrorLogger. + + + + + Represents a distinct set of s and provides unique string keys + to distinguish them. + + The first added with a given + value is given that value as its unique key. Subsequent adds with the same ID will have .NNN + appended to their with an auto-incremented numeric value. + + + + + The total number of descriptors in the set. + + + + + Adds a descriptor to the set if not already present. + + + The unique key assigned to the given descriptor. + + + + + Converts the set to a list of (key, descriptor) pairs sorted by key. + + + + + Used for logging compiler diagnostics to a stream in the standardized SARIF + (Static Analysis Results Interchange Format) v2.1.0 format. + http://docs.oasis-open.org/sarif/sarif/v2.1.0/sarif-v2.1.0.html + + + + + Represents a distinct set of s and provides unique integer indices + to distinguish them. + + + + + The total number of descriptors in the set. + + + + + Adds a descriptor to the set if not already present. + + + The unique key assigned to the given descriptor. + + + + + Converts the set to a list, sorted by index. + + + + + Specifies the version of the SARIF log file to produce. + + + + + The original, non-standardized version of the SARIF format. + + + + + The first standardized version of the SARIF format. + + + + + The default SARIF version, which is v1.0.0 for compatibility with + previous versions of the compiler. + + + + + The latest supported SARIF version. + + + + + Try to parse the SARIF log file version from a string. + + + + + Used for logging all the paths which are "touched" (used) in any way + in the process of compilation. + + + + + Adds a fully-qualified path to the Logger for a read file. + Semantics are undefined after a call to . + + + + + Adds a fully-qualified path to the Logger for a written file. + Semantics are undefined after a call to . + + + + + Adds a fully-qualified path to the Logger for a read and written + file. Semantics are undefined after a call to + . + + + + + Writes all of the paths the TouchedFileLogger to the given + TextWriter in upper case. After calling this method the + logger is in an undefined state. + + + + + Writes all of the paths the TouchedFileLogger to the given + TextWriter in upper case. After calling this method the + logger is in an undefined state. + + + + + The compilation object is an immutable representation of a single invocation of the + compiler. Although immutable, a compilation is also on-demand, and will realize and cache + data as necessary. A compilation can produce a new compilation from existing compilation + with the application of small deltas. In many cases, it is more efficient than creating a + new compilation from scratch, as the new compilation can reuse information from the old + compilation. + + + The compilation object is an immutable representation of a single invocation of the + compiler. Although immutable, a compilation is also on-demand, and will realize and cache + data as necessary. A compilation can produce a new compilation from existing compilation + with the application of small deltas. In many cases, it is more efficient than creating a + new compilation from scratch, as the new compilation can reuse information from the old + compilation. + + + + + Describes the kind of real signing that is being done during Emit. In the case of public signing + this value will be . + + + + + This form of signing occurs in memory using the APIs. This is the default + form of signing and will be used when a strong name key is provided in a file on disk. + + + + + This form of signing occurs using the COM APIs. This form of signing + requires the unsigned PE to be written to disk before it can be signed (typically by writing it + out to the %TEMP% folder). This signing is used when the key in a key container, the signing + requires a counter signature or customers opted in via the UseLegacyStrongNameProvider feature + flag. + + + + + This type abstracts away the legacy COM based signing implementation for PE streams. Under the hood + a temporary file must be created on disk (at the last possible moment), emitted to, signed on disk + and then copied back to the original . Only when legacy signing is enabled though. + + + + + The that is being emitted into. This value should _never_ be + disposed. It is either returned from the instance in + which case it is owned by that. Or it is just an alias for the value that is stored + in in which case it will be disposed from there. + + + + + Create the stream which should be used for Emit. This should only be called one time. + + + + + Abstraction that allows the caller to delay the creation of the values + until they are actually needed. + + + + + Returns an existing open stream or null if no stream has been open. + + + + + This method will be called once during Emit at the time the Compilation needs + to create a stream for writing. It will not be called in the case of + user errors in code. Shall not be called when returns non-null. + + + + + Returns a . If one cannot be gotten or created then a diagnostic will + be added to + + + + + Returns true if this is a case sensitive compilation, false otherwise. Case sensitivity + affects compilation features such as name lookup as well as choosing what names to emit + when there are multiple different choices (for example between a virtual method and an + override). + + + + + Used for test purposes only to emulate missing members. + + + + + Used for test purposes only to emulate missing members. + + + + + Gets the source language ("C#" or "Visual Basic"). + + + + + This method generates a string that represents the input content to the compiler which impacts + the output of the build. This string is effectively a content key for a + with these values that can be used to identify the outputs. + + The returned string has the following properties: + + + + + The format is undefined. Consumers should assume the format and content can change between + compiler versions. + + + + + It is designed to be human readable and diffable. This is to help developers + understand the difference between two compilations which is impacting the deterministic + output + + + + + It is *not* in a minimal form. If used as a key in say a content addressable storage consumers + should first pass it through a strong hashing function. + + + + + Compilations which do not use the /deterministic option can still use this API but + the results will change on every invocation. + + + The set of inputs that impact deterministic output are described in the following document + - https://github.com/dotnet/roslyn/blob/main/docs/compilers/Deterministic%20Inputs.md + + There are a few dark corners of determinism that are not captured with this key as they are + considered outside the scope of this work: + + + + + Environment variables: clever developers can subvert determinism by manipulation of + environment variables that impact program execution. For example changing normal library + loading by manipulating the %LIBPATH% environment variable. Doing so can cause a change + in deterministic output of compilation by changing compiler, runtime or generator + dependencies. + + + + + Manipulation of strong name keys: strong name keys are read "on demand" by the compiler + and both normal compilation and this key can have non-deterministic output if they are + manipulated at the correct point in program execution. That is an existing limitation + of compilation that is tracked by https://github.com/dotnet/roslyn/issues/57940 + + + + This API can throw exceptions in a few cases like invalid file paths. + + + + + Checks options passed to submission compilation constructor. + Throws an exception if the options are not applicable to submissions. + + + + + Creates a new compilation equivalent to this one with different symbol instances. + + + + + Returns a new compilation with a given event queue. + + + + + Returns a new compilation with a given semantic model provider. + + + + + Gets a new for the specified syntax tree. + + The specified syntax tree. + + True if the SemanticModel should ignore accessibility rules when answering semantic questions. + + + + + Gets a for the given . + If is non-null, it attempts to use + to get a semantic model. Otherwise, it creates a new semantic model using . + + + + + + + + Creates a new for the given . + Unlike the and , + it does not attempt to use the to get a semantic model, but instead always creates a new semantic model. + + + + + + + + Returns a new INamedTypeSymbol representing an error type with the given name and arity + in the given optional container. + + + + + Returns a new INamespaceSymbol representing an error (missing) namespace with the given name. + + + + + Simple assembly name, or null if not specified. + + + The name is used for determining internals-visible-to relationship with referenced assemblies. + + If the compilation represents an assembly the value of is its simple name. + + Unless specifies otherwise the module name + written to metadata is with an extension based upon . + + + + + Creates a compilation with the specified assembly name. + + The new assembly name. + A new compilation. + + + + Gets the options the compilation was created with. + + + + + Creates a new compilation with the specified compilation options. + + The new options. + A new compilation. + + + + True if the compilation represents an interactive submission. + + + + + The previous submission, if any, or null. + + + + + Gets or allocates a runtime submission slot index for this compilation. + + Non-negative integer if this is a submission and it or a previous submission contains code, negative integer otherwise. + + + + The type object that represents the type of submission result the host requested. + + + + + The type of the globals object or null if not specified for this compilation. + + + + + Gets the syntax trees (parsed from source code) that this compilation was created with. + + + + + Creates a new compilation with additional syntax trees. + + The new syntax trees. + A new compilation. + + + + Creates a new compilation with additional syntax trees. + + The new syntax trees. + A new compilation. + + + + Creates a new compilation without the specified syntax trees. Preserves metadata info for use with trees + added later. + + The new syntax trees. + A new compilation. + + + + Creates a new compilation without the specified syntax trees. Preserves metadata info for use with trees + added later. + + The new syntax trees. + A new compilation. + + + + Creates a new compilation without any syntax trees. Preserves metadata info for use with + trees added later. + + + + + Creates a new compilation with an old syntax tree replaced with a new syntax tree. + Reuses metadata from old compilation object. + + The new tree. + The old tree. + A new compilation. + + + + Returns true if this compilation contains the specified tree. False otherwise. + + A syntax tree. + + + + Optional semantic model provider for this compilation. + + + + + The event queue that this compilation was created with. + + + + + Metadata references passed to the compilation constructor. + + + + + Unique metadata references specified via #r directive in the source code of this compilation. + + + + + All reference directives used in this compilation. + + + + + Maps values of #r references to resolved metadata references. + + + + + All metadata references -- references passed to the compilation + constructor as well as references specified via #r directives. + + + + + Creates a metadata reference for this compilation. + + + Optional aliases that can be used to refer to the compilation root namespace via extern alias directive. + + + Embed the COM types from the reference so that the compiled + application no longer requires a primary interop assembly (PIA). + + + + + Creates a new compilation with the specified references. + + + The new references. + + A new compilation. + + + + Creates a new compilation with the specified references. + + The new references. + A new compilation. + + + + Creates a new compilation with the specified references. + + + + + Creates a new compilation with additional metadata references. + + The new references. + A new compilation. + + + + Creates a new compilation with additional metadata references. + + The new references. + A new compilation. + + + + Creates a new compilation without the specified metadata references. + + The new references. + A new compilation. + + + + Creates a new compilation without the specified metadata references. + + The new references. + A new compilation. + + + + Creates a new compilation without any metadata references. + + + + + Creates a new compilation with an old metadata reference replaced with a new metadata + reference. + + The new reference. + The old reference. + A new compilation. + + + + Gets the or for a metadata reference used to create this + compilation. + + The target reference. + + Assembly or module symbol corresponding to the given reference or null if there is none. + + + + + Gets the that corresponds to the assembly symbol. + + The target symbol. + + + + Assembly identities of all assemblies directly referenced by this compilation. + + + Includes identities of references passed in the compilation constructor + as well as those specified via directives in source code. + + + + + The that represents the assembly being created. + + + + + Gets the for the module being created by compiling all of + the source code. + + + + + The root namespace that contains all namespaces and types defined in source code or in + referenced metadata, merged into a single namespace hierarchy. + + + + + Gets the corresponding compilation namespace for the specified module or assembly namespace. + + + + + Returns the Main method that will serves as the entry point of the assembly, if it is + executable (and not a script). + + + + + Get the symbol for the predefined type from the Cor Library referenced by this + compilation. + + + + + Get the symbol for the predefined type member from the COR Library referenced by this compilation. + + + + + Returns true if the type is System.Type. + + + + + Lookup member declaration in well known type used by this Compilation. + + + + + Lookup well-known type used by this Compilation. + + + + + Returns true if the specified type is equal to or derives from System.Attribute well-known type. + + + + + The INamedTypeSymbol for the .NET System.Object type, which could have a TypeKind of + Error if there was no COR Library in this Compilation. + + + + + The TypeSymbol for the type 'dynamic' in this Compilation. + + If the compilation is a VisualBasic compilation. + + + + A symbol representing the script globals type. + + + + + A symbol representing the implicit Script class. This is null if the class is not + defined in the compilation. + + + + + Resolves a symbol that represents script container (Script class). Uses the + full name of the container class stored in to find the symbol. + + The Script class symbol or null if it is not defined. + + + + Returns a new ArrayTypeSymbol representing an array type tied to the base types of the + COR Library in this Compilation. + + + + + Returns a new ArrayTypeSymbol representing an array type tied to the base types of the + COR Library in this Compilation. + + This overload is for backwards compatibility. Do not remove. + + + + Returns a new IPointerTypeSymbol representing a pointer type tied to a type in this + Compilation. + + If the compilation is a VisualBasic compilation. + + + + Returns a new IFunctionPointerTypeSymbol representing a function pointer type tied to types in this + Compilation. + + If the compilation is a VisualBasic compilation. + + If: + * is passed as the returnRefKind. + * parameterTypes and parameterRefKinds do not have the same length. + + + If returnType is , or if parameterTypes or parameterRefKinds are default, + or if any of the types in parameterTypes are null. + + + + Returns a new INamedTypeSymbol representing a native integer. + + If the compilation is a VisualBasic compilation. + + + + Gets the type within the compilation's assembly and all referenced assemblies (other than + those that can only be referenced via an extern alias) using its canonical CLR metadata name. + This lookup follows the following order: + + If the type is found in the compilation's assembly, that type is returned. + + Next, the core library (the library that defines System.Object and has no assembly references) is searched. + If the type is found there, that type is returned. + + + Finally, all remaining referenced non-extern assemblies are searched. If one and only one type matching the provided metadata name is found, that + single type is returned. Accessibility is ignored for this check. + + + + Null if the type can't be found or there was an ambiguity during lookup. + + + Since VB does not have the concept of extern aliases, it considers all referenced assemblies. + + + In C#, if the core library is referenced as an extern assembly, it will be searched. All other extern-aliased assemblies will not be searched. + + + Because accessibility to the current assembly is ignored when searching for types that match the provided metadata name, if multiple referenced + assemblies define the same type symbol (as often happens when users copy well-known types from the BCL or other sources) then this API will return null, + even if all but one of those symbols would be otherwise inaccessible to user-written code in the current assembly. For fine-grained control over ambiguity + resolution, consider using instead and filtering the results for the symbol required. + + + Assemblies can contain multiple modules. Within each assembly, the search is performed based on module's position in the module list of that assembly. When + a match is found in one module in an assembly, no further modules within that assembly are searched. + + Type forwarders are ignored, and not considered part of the assembly where the TypeForwardAttribute is written. + + Ambiguities are detected on each nested level. For example, if A+B is requested, and there are multiple As but only one of them has a B nested + type, the lookup will be considered ambiguous and null will be returned. + + + + + + Gets all types with the compilation's assembly and all referenced assemblies that have the + given canonical CLR metadata name. Accessibility to the current assembly is ignored when + searching for matching type names. + + Empty array if no types match. Otherwise, all types that match the name, current assembly first if present. + + + Assemblies can contain multiple modules. Within each assembly, the search is performed based on module's position in the module list of that assembly. When + a match is found in one module in an assembly, no further modules within that assembly are searched. + + Type forwarders are ignored, and not considered part of the assembly where the TypeForwardAttribute is written. + + + + + Returns a new INamedTypeSymbol with the given element types and + (optional) element names, locations, and nullable annotations. + + + + + Returns a new INamedTypeSymbol with the given element types, names, and locations. + + This overload is for backwards compatibility. Do not remove. + + + + Check that if any names are provided, and their number matches the expected cardinality. + Returns a normalized version of the element names (empty array if all the names are null). + + + + + Returns a new INamedTypeSymbol with the given underlying type and + (optional) element names, locations, and nullable annotations. + The underlying type needs to be tuple-compatible. + + + + + Returns a new INamedTypeSymbol with the given underlying type and element names and locations. + The underlying type needs to be tuple-compatible. + + This overload is for backwards compatibility. Do not remove. + + + + Returns a new anonymous type symbol with the given member types, names, source locations, and nullable annotations. + Anonymous type members will be readonly by default. Writable properties are + supported in VB and can be created by passing in in the + appropriate locations in . + + + + + Returns a new anonymous type symbol with the given member types, names, and source locations. + Anonymous type members will be readonly by default. Writable properties are + supported in VB and can be created by passing in in the + appropriate locations in . + + This overload is for backwards compatibility. Do not remove. + + + + Creates an whose is for a binary operator. Built-in operators are commonly created for + symbols like bool int.operator ==(int v1, int v2) which the language implicitly supports, even if such + a symbol is not explicitly defined for that type in either source or metadata. + + The binary operator name. Should be one of the names from . + The return type of the binary operator. + The type of the left operand of the binary operator. + The type of the right operand of the binary operator. + + + + Creates an whose is for a unary operator. Built-in operators are commonly created for + symbols like bool int.operator -(int value) which the language implicitly supports, even if such a + symbol is not explicitly defined for that type in either source or metadata. + + The unary operator name. Should be one of the names from . + The return type of the unary operator. + The type the operator applies to. + + + + Classifies a conversion from to according + to this compilation's programming language. + + Source type of value to be converted + Destination type of value to be converted + A that classifies the conversion from the + type to the type. + + + + Returns true if there is an implicit (C#) or widening (VB) conversion from + to . Returns false if + either or is null, or + if no such conversion exists. + + + + + Checks if is accessible from within . An optional qualifier of type + is used to resolve protected access for instance members. All symbols are + required to be from this compilation or some assembly referenced () by this + compilation. is required to be an or . + + + Submissions can reference symbols from previous submissions and their referenced assemblies, even + though those references are missing from . + See https://github.com/dotnet/roslyn/issues/27356. + This implementation works around that by permitting symbols from previous submissions as well. + It is advised to avoid the use of this API within the compilers, as the compilers have additional + requirements for access checking that are not satisfied by this implementation, including the + avoidance of infinite recursion that could result from the use of the ISymbol APIs here, the detection + of use-site diagnostics, and additional returned details (from the compiler's internal APIs) that are + helpful for more precisely diagnosing reasons for accessibility failure. + + + + + Gets the diagnostics produced during the parsing stage. + + + + + Gets the diagnostics produced during symbol declaration. + + + + + Gets the diagnostics produced during the analysis of method bodies and field initializers. + + + + + Gets all the diagnostics for the compilation, including syntax, declaration, and + binding. Does not include any diagnostics that might be produced during emit, see + . + + + + + Unique metadata assembly references that are considered to be used by this compilation. + For example, if a type declared in a referenced assembly is referenced in source code + within this compilation, the reference is considered to be used. Etc. + The returned set is a subset of references returned by API. + The result is undefined if the compilation contains errors. + + + + + Filter out warnings based on the compiler options (/nowarn, /warn and /warnaserror) and the pragma warning directives. + 'incoming' is freed. + + Bag to which filtered diagnostics will be added. + Diagnostics to be filtered. + True if there are no unsuppressed errors (i.e., no errors which fail compilation). + + + + Filter out warnings based on the compiler options (/nowarn, /warn and /warnaserror) and the pragma warning directives. + + True if there are no unsuppressed errors (i.e., no errors which fail compilation). + + + + Create a stream filled with default win32 resources. + + + + + There are two ways to sign PE files + 1. By directly signing the + 2. Write the unsigned PE to disk and use CLR COM APIs to sign. + The preferred method is #1 as it's more efficient and more resilient (no reliance on %TEMP%). But + we must continue to support #2 as it's the only way to do the following: + - Access private keys stored in a key container + - Do proper counter signature verification for AssemblySignatureKey attributes + + + + + Constructs the module serialization properties out of the compilation options of this compilation. + + + + + The value is not used by Windows loader, but the OS appcompat infrastructure uses it to identify apps. + It is useful for us to have a mechanism to identify the compiler that produced the binary. + This is the appropriate value to use for that. That is what it was invented for. + We don't want to have the high bit set for this in case some users perform a signed comparison to + determine if the value is less than some version. The C++ linker is at 0x0B. + We'll start our numbering at 0x30 for C#, 0x50 for VB. + + + + + Return true if the compilation contains any code or types. + + + + + Report declaration diagnostics and compile and synthesize method bodies. + + True if successful. + + + + Update resources. + + True if successful. + + + + Generate XML documentation comments. + + True if successful. + + + + Reports all unused imports/usings so far (and thus it must be called as a last step of Emit) + + + + + Signals the event queue, if any, that we are done compiling. + There should not be more compiling actions after this step. + NOTE: once we signal about completion to analyzers they will cancel and thus in some cases we + may be effectively cutting off some diagnostics. + It is not clear if behavior is desirable. + See: https://github.com/dotnet/roslyn/issues/11470 + + What tree to complete. null means complete all trees. + + + + Emit the IL for the compiled source code into the specified stream. + + Stream to which the compilation will be written. + Stream to which the metadata-only output will be written. + Stream to which the compilation's debug info will be written. Null to forego PDB generation. + Stream to which the compilation's XML documentation will be written. Null to forego XML generation. + Stream from which the compilation's Win32 resources will be read (in RES format). + Null to indicate that there are none. The RES format begins with a null resource entry. + Note that the caller is responsible for disposing this stream, if provided. + List of the compilation's managed resources. Null to indicate that there are none. + Emit options. + + Debug entry-point of the assembly. The method token is stored in the generated PDB stream. + + When a program launches with a debugger attached the debugger places the first breakpoint to the start of the debug entry-point method. + The CLR starts executing the static Main method of type. When the first breakpoint is hit + the debugger steps thru the code statement by statement until user code is reached, skipping methods marked by , + and taking other debugging attributes into consideration. + + By default both entry points in an executable program (, , ) + are the same method (Main). A non-executable program has no entry point. Runtimes that implement a custom loader may specify debug entry-point + to force the debugger to skip over complex custom loader logic executing at the beginning of the .exe and thus improve debugging experience. + + Unlike ordinary entry-point which is limited to a non-generic static method of specific signature, there are no restrictions on the + method other than having a method body (extern, interface, or abstract methods are not allowed). + + + Stream containing information linking the compilation to a source control. + + + Texts to embed in the PDB. + Only supported when emitting Portable PDBs. + + To cancel the emit process. + + + + This overload is only intended to be directly called by tests that want to pass . + The map is used for storing a list of methods and their associated IL. + + + + + Emit the differences between the compilation and the previous generation + for Edit and Continue. The differences are expressed as added and changed + symbols, and are emitted as metadata, IL, and PDB deltas. A representation + of the current compilation is returned as an EmitBaseline for use in a + subsequent Edit and Continue. + + + + + Emit the differences between the compilation and the previous generation + for Edit and Continue. The differences are expressed as added and changed + symbols, and are emitted as metadata, IL, and PDB deltas. A representation + of the current compilation is returned as an EmitBaseline for use in a + subsequent Edit and Continue. + + + + + Emit the differences between the compilation and the previous generation + for Edit and Continue. The differences are expressed as added and changed + symbols, and are emitted as metadata, IL, and PDB deltas. A representation + of the current compilation is returned as an EmitBaseline for use in a + subsequent Edit and Continue. + + + + + Check compilation options and create . + + if successful. + + + + The compiler needs to define an ordering among different partial class in different syntax trees + in some cases, because emit order for fields in structures, for example, is semantically important. + This function defines an ordering among syntax trees in this compilation. + + + + + Compare two source locations, using their containing trees, and then by Span.First within a tree. + Can be used to get a total ordering on declarations, for example. + + + + + Compare two source locations, using their containing trees, and then by Span.First within a tree. + Can be used to get a total ordering on declarations, for example. + + + + + Compare two source locations, using their containing trees, and then by Span.First within a tree. + Can be used to get a total ordering on declarations, for example. + + + + + Return the lexically first of two locations. + + + + + Return the lexically first of multiple locations. + + + + + Return true if there is a source declaration symbol name that meets given predicate. + + + + + Return source declaration symbols whose name meets given predicate. + + + + + Return true if there is a source declaration symbol name that matches the provided name. + This may be faster than when predicate is just a simple string check. + is case sensitive or not depending on the target language. + + + + + Return source declaration symbols whose name matches the provided name. This may be + faster than when predicate is just a simple string check. is case sensitive or not depending on the target language. + + + + + Given a reporting unreferenced s, returns + the actual instances that were not referenced. + + + + + Returns the required language version found in a , if any is found. + Returns null if none is found. + + + + + The list of RetargetingAssemblySymbol objects created for this Compilation. + RetargetingAssemblySymbols are created when some other compilation references this one, + but the other references provided are incompatible with it. For example, compilation C1 + references v1 of Lib.dll and compilation C2 references C1 and v2 of Lib.dll. In this + case, in context of C2, all types from v1 of Lib.dll leaking through C1 (through method + signatures, etc.) must be retargeted to the types from v2 of Lib.dll. This is what + RetargetingAssemblySymbol is responsible for. In the example above, modules in C2 do not + reference C1.AssemblySymbol, but reference a special RetargetingAssemblySymbol created + for C1 by ReferenceManager. + + WeakReference is used to allow RetargetingAssemblySymbol to be collected when they become unused. + + Guarded by . + + + + + Adds given retargeting assembly for this compilation into the cache. + must be locked while calling this method. + + + + + Adds cached retargeting symbols into the given list. + must be locked while calling this method. + + + + + Indicates the reasons why a candidate (or set of candidate) symbols were not considered + correct in SemanticInfo. Higher values take precedence over lower values, so if, for + example, there a symbol with a given name that was inaccessible, and other with the wrong + arity, only the inaccessible one would be reported in the SemanticInfo. + + + + + No CandidateSymbols. + + + + + Only a type or namespace was valid in the given location, but the candidate symbols was + of the wrong kind. + + + + + Only an event was valid in the given location, but the candidate symbols was + of the wrong kind. + + + + + The candidate symbol must be a WithEvents member, but it was not. + + + + + Only an attribute type was valid in the given location, but the candidate symbol was + of the wrong kind. + + + + + The candidate symbol takes a different number of type parameters that was required. + + + + + The candidate symbol existed, but was not allowed to be created in a new expression. + For example, interfaces, static classes, and unconstrained type parameters. + + + + + The candidate symbol existed, but was not allowed to be referenced. For example, the + "get_XXX" method used to implement a property named "XXX" may not be directly + referenced. Similarly, the type "System.Void" can not be directly referenced. + Also occurs if "this" is used in a context (static method or field initializer) + where "this" is not available. + + + + + The candidate symbol had an accessibility modifier (private, protected, ...) that made + it inaccessible. + + + + + The candidate symbol was in a place where a value was required, but was not a value + (e.g., was a type or namespace). + + + + + The candidate symbol was in a place where a variable (or sometimes, a property) was + required, but was not allowed there because it isn't a symbol that can be assigned to. + For example, the left hand side of an assignment, or a ref or out parameter. + + + + + The candidate symbol was used in a way that an invocable member (method, or variable of + delegate type) was required, but the candidate symbol was not invocable. + + + + + The candidate symbol must be an instance variable, but was used as static, or the + reverse. + + + + + Overload resolution did not choose a method. The candidate symbols are the methods there + were considered during overload resolution (which may or may not be applicable methods). + + + + + Method could not be selected statically. + The candidate symbols are the methods there were considered during overload resolution + (which may or may not be applicable methods). + + + + + Multiple ambiguous symbols were available with the same name. This can occur if "using" + statements bring multiple namespaces into scope, and the same type is available in + multiple. This can also occur if multiple properties of the same name are available in a + multiple interface inheritance situation. + + + + + CandidateSymbols are members of a group of results. This is used when there isn't a problem, + but there is more than one result, for example nameof(int.ToString). + + + + + Maps an async/iterator method to the synthesized state machine type that implements the method. + + + + + Represents compilation options common to C# and VB. + + + + + The kind of assembly generated when emitted. + + + + + Name of the primary module, or null if a default name should be used. + + + The name usually (but not necessarily) includes an extension, e.g. "MyModule.dll". + + If is null the actual name written to metadata + is derived from the name of the compilation () + by appending a default extension for . + + + + + The full name of a global implicit class (script class). This class implicitly encapsulates top-level statements, + type declarations, and member declarations. Could be a namespace qualified name. + + + + + The full name of a type that declares static Main method. Must be a valid non-generic namespace-qualified name. + Null if any static Main method is a candidate for an entry point. + + + + + Specifies public key used to generate strong name for the compilation assembly, or empty if not specified. + + + If specified the values of and + must be null. If is true the assembly is marked as fully signed + but only signed with the public key (aka "OSS signing"). + + + + + The name of the file containing the public and private keys to use to generate strong name of the + compilation assembly and to sign it. + + + + To sign the output supply either one of or . + but not both. If both are specified is ignored. + + + If is also set, must be the absolute + path to key file. + + + + + + The CSP container containing the key with which to sign the output. + + + + To sign the output supply either one of or . + but not both. If both are specified is ignored. + + + This setting is obsolete and only supported on Microsoft Windows platform. + Use to generate assemblies with strong name and + a signing tool (Microsoft .NET Framework Strong Name Utility (sn.exe) or equivalent) to sign them. + + + + + + Mark the compilation assembly as delay-signed. + + + If true the resulting assembly is marked as delay signed. + + If false and , , or is specified + or attribute System.Reflection.AssemblyKeyFileAttribute or System.Reflection.AssemblyKeyNameAttribute is applied to the + compilation assembly in source the resulting assembly is signed accordingly to the specified values/attributes. + + If null the semantics is specified by the value of attribute System.Reflection.AssemblyDelaySignAttribute + applied to the compilation assembly in source. If the attribute is not present the value defaults to "false". + + + + + Mark the compilation assembly as fully signed, but only sign with the public key. + + + + If true, the assembly is marked as signed, but is only signed with the public key. + + + The key must be provided through either an absolute path in + or directly via . + + + + + + Whether bounds checking on integer arithmetic is enforced by default or not. + + + + + Specifies which version of the common language runtime (CLR) can run the assembly. + + + + + Specifies whether or not optimizations should be performed on the output IL. + This is independent of whether or not PDB information is generated. + + + + + Global warning report option + + + + + Global warning level (a non-negative integer). + + + + + Specifies whether building compilation may use multiple threads. + + + + + Specifies whether the compilation should be deterministic. + + + + + Used for time-based version generation when contains a wildcard. + If equal to default() the actual current local time will be used. + + + + + Emit mode that favors debuggability. + + + + + Specifies whether to import members with accessibility other than public or protected by default. + Default value is . The value specified is not going to + affect correctness of analysis performed by compilers because all members needed for correctness + are going to be imported regardless. This setting can force compilation to import members that it + normally doesn't. + + + + + Apply additional disambiguation rules during resolution of referenced assemblies. + + + + + Modifies the incoming diagnostic, for example escalating its severity, or discarding it (returning null) based on the compilation options. + + + The modified diagnostic, or null + + + + Warning report option for each warning. + + + + + Provider to retrieve options for particular syntax trees. + + + + + Whether diagnostics suppressed in source, i.e. is true, should be reported. + + + + + Resolves paths to metadata references specified in source via #r directives. + Null if the compilation can't contain references to metadata other than those explicitly passed to its factory (such as #r directives in sources). + + + + + Gets the resolver for resolving XML document references for the compilation. + Null if the compilation is not allowed to contain XML file references, such as XML doc comment include tags and permission sets stored in an XML file. + + + + + Gets the resolver for resolving source document references for the compilation. + Null if the compilation is not allowed to contain source file references, such as #line pragmas and #load directives. + + + + + Provides strong name and signature the source assembly. + Null if assembly signing is not supported. + + + + + Used to compare assembly identities. May implement unification and portability policies specific to the target platform. + if not specified. + + + + + Gets the default nullable context state in this compilation. + + + This context does not apply to files that are marked as generated. Nullable is off + by default in those locations. + + + + + A set of strings designating experimental compiler features that are to be enabled. + + + + + Gets the source language ("C#" or "Visual Basic"). + + + + + Creates a new options instance with the specified general diagnostic option. + + + + + Creates a new options instance with the specified diagnostic-specific options. + + + + + Creates a new options instance with the specified diagnostic-specific options. + + + + + Creates a new options instance with the specified suppressed diagnostics reporting option. + + + + + Creates a new options instance with the concurrent build property set accordingly. + + + + + Creates a new options instance with the deterministic property set accordingly. + + + + + Creates a new options instance with the specified output kind. + + + + + Creates a new options instance with the specified platform. + + + + + Creates a new options instance with the specified public sign setting. + + + + + Creates a new options instance with optimizations enabled or disabled. + + + + + Performs validation of options compatibilities and generates diagnostics if needed + + + + + Errors collection related to an incompatible set of compilation options + + + + + Represents the possible compilation stages for which it is possible to get diagnostics + (errors). + + + + + Provides information about statements which transfer control in and out of a region. This + information is returned from a call to . + + + + + The set of statements inside the region what are the + destination of branches outside the region. + + + + + The set of statements inside a region that jump to locations outside + the region. + + + + + Indicates whether a region completes normally. Return true if and only if the end of the + last statement in a region is reachable or the region contains no statements. + + + + + The set of return statements found within a region. + + + + + Returns true if and only if analysis was successful. Analysis can fail if the region does not properly span a single expression, + a single statement, or a contiguous series of statements within the enclosing block. + + + + + Provides information about how data flows into and out of a region. This information is + returned from a call to + , or one of its language-specific overloads, + where you pass the first and last statements of the region as parameters. + "Inside" means those statements or ones between them. "Outside" are any other statements of the same method. + + + + + The set of local variables that are declared within a region. Note + that the region must be bounded by a method's body or a field's initializer, so + parameter symbols are never included in the result. + + + + + The set of local variables which are assigned a value outside a region + that may be used inside the region. + + + + + The set of local variables which are assigned a value inside a region + that may be used outside the region. + + + + + + The set of local variables which are definitely assigned a value when a region is + entered. + + + + + + + The set of local variables which are definitely assigned a value when a region is + exited. + + + + + + The set of local variables for which a value is always assigned inside + a region. + + + + + The set of local variables that are read inside a region. + + + + + The set of local variables that are written inside a region. + + + + + The set of the local variables that are read outside a region. + + + + + The set of local variables that are written outside a region. + + + + + The set of the local variables that have been referenced in anonymous + functions within a region and therefore must be moved to a field of a frame class. + + + + + The set of variables that are captured inside a region. + + + + + The set of variables that are captured outside a region. + + + + + The set of non-constant local variables and parameters that have had their + address (or the address of one of their fields) taken. + + + + + The set of local functions that are used. + + + + + Returns true if and only if analysis was successful. Analysis can fail if the region does not + properly span a single expression, a single statement, or a contiguous series of + statements within the enclosing block. + + + + + The string returned from this function represents the inputs to the compiler which impact determinism. It is + meant to be inline with the specification here: + + - https://github.com/dotnet/roslyn/blob/main/docs/compilers/Deterministic%20Inputs.md + + Options which can cause compilation failure, but doesn't impact the result of a successful + compilation should be included. That is because it is interesting to describe error states + not just success states. Think about caching build failures as well as build successes. + + When an option is omitted, say if there is no value for a public crypto key, we should emit + the property with a null value vs. omitting the property. Either approach would produce + correct results the preference is to be declarative that an option is omitted. + + + + + The default is to include all inputs to the compilation which impact the output of the + compilation: binaries or diagnostics. + + + + + Ignore all file paths, but still include file names, in the deterministic key. + + + This is useful for scenarios where the consumer is interested in the content of the + being the same but aren't concerned precisely with the file + path of the content. A typical example of this type of consumer is one that operates + in CI where the path changes frequently. + + + + + Ignore the versions of the tools contributing to the build (compiler and runtime) + + + Compiler output is not guaranteed to be deterministically equivalent between versions + but very often is for wide ranges of versions. This option is useful for consumers + who are comfortable ignoring the versions when looking at compiler output. + + + + + The result of the Compilation.Emit method. + + + + + True if the compilation successfully produced an executable. + If false then the diagnostics should include at least one error diagnostic + indicating the cause of the failure. + + + + + A list of all the diagnostics associated with compilations. This include parse errors, declaration errors, + compilation errors, and emitting errors. + + + + + Name of the anonymous type field. + + + + + True if the anonymous type field was marked as 'Key' in VB. + + + + + is case insensitive. + + + + + Represents additional info needed by async method implementation methods + (MoveNext methods) to properly emit necessary PDB data for async debugging. + + + + + IL offset of catch handler or -1 + + + + + Set of IL offsets where await operators yield control + + + + + Set of IL offsets where await operators are to be resumed + + + + + Symbol changes when emitting EnC delta. + + + + + Previous EnC generation baseline, or null if this is not EnC delta. + + + + + True if this module is an EnC update. + + + + + EnC generation. 0 if the module is not an EnC delta, 1 if it is the first EnC delta, etc. + + + + + If this module represents an assembly, name of the assembly used in AssemblyDef table. Otherwise name of the module same as . + + + + + Name of the module. Used in ModuleDef table. + + + + + Public types defined in other modules making up this assembly and to which other assemblies may refer to via this assembly + followed by types forwarded to another assembly. + + + + + Used to distinguish which style to pick while writing native PDB information. + + + The PDB content for custom debug information is different between Visual Basic and CSharp. + E.g. C# always includes a CustomMetadata Header (MD2) that contains the namespace scope counts, where + as VB only outputs namespace imports into the namespace scopes. + C# defines forwards in that header, VB includes them into the scopes list. + + Currently the compiler doesn't allow mixing C# and VB method bodies. Thus this flag can be per module. + It is possible to move this flag to per-method basis but native PDB CDI forwarding would need to be adjusted accordingly. + + + + + Linked assembly names to be stored to native PDB (VB only). + + + + + Project level imports (VB only, TODO: C# scripts). + + + + + Default namespace (VB only). + + + + + Additional top-level types injected by the Expression Evaluators. + + + + + Anonymous types defined in the compilation. + + + + + Top-level embedded types (e.g. attribute types that are not present in referenced assemblies). + + + + + Top-level named types defined in source. + + + + + A list of the files that constitute the assembly. Empty for netmodule. These are not the source language files that may have been + used to compile the assembly, but the files that contain constituent modules of a multi-module assembly as well + as any external resources. It corresponds to the File table of the .NET assembly file format. + + + + + Builds symbol definition to location map used for emitting token -> location info + into PDB to be consumed by WinMdExp.exe tool (only applicable for /t:winmdobj) + + + + + Builds a list of types, and their documents, that would otherwise not be referenced by any document info + of any methods in those types, or any nested types. This data is helpful for navigating to the source of + types that have no methods in one or more of the source files they are contained in. + + For example: + + First.cs: + + partial class Outer + { + partial class Inner + { + public void Method() + { + } + } + } + + + /// Second.cs: + + partial class Outer + { + partial class Inner + { + } + } + + + When navigating to the definition of "Outer" we know about First.cs because of the MethodDebugInfo for Outer.Inner.Method() + but there would be no document information for Second.cs so this method would return that information. + + When navigating to "Inner" we likewise know about First.cs because of the MethodDebugInfo, and we know about Second.cs because + of the document info for its containing type, so this method would not return information for Inner. In fact this method + will never return information for any nested type. + + + + + + + Number of debug documents in the module. + Used to determine capacities of lists and indices when emitting debug info. + + + + + An approximate number of method definitions that can + provide a basis for approximating the capacities of + various databases used during Emit. + + + + + CorLibrary assembly referenced by this module. + + + + + Returns User Strings referenced from the IL in the module. + + + + + Assembly reference aliases (C# only). + + + + + Common base class for C# and VB PE module builder. + + + + + Returns all top-level (not nested) types defined in the module. + + + + + Captures the set of synthesized definitions that should be added to a type + during emit process. + + + + + Returns null if there are no compiler generated types. + + + + + Returns null if there are no synthesized fields. + + + + + Returns null if there are no synthesized properties. + + + + + Returns null if there are no synthesized methods. + + + + + Debugging information associated with the specified method that is emitted by the compiler to support Edit and Continue. + + + + + Deserializes Edit and Continue method debug information from specified blobs. + + Local variable slot map. + Lambda and closure map. + Invalid data. + + + + Deserializes Edit and Continue method debug information from specified blobs. + + Local variable slot map. + Lambda and closure map. + State machine suspension points, if the method is the MoveNext method of the state machine. + Invalid data. + + + Invalid data. + + + Invalid data. + + + + Constructs a deleted definition + + The old definition of the member + + Cache of type definitions used in signatures of deleted members. Used so that if a method 'C M(C c)' is deleted + we use the same instance for the method return type, and the parameter type. + + + + + Represents a type referenced from a deleted member (as distinct from a type that has been deleted). This is also + why it doesn't inherit from + + + + + Type definitions containing any changes (includes added types). + + + + + Cache of type definitions used in signatures of deleted members. Used so that if a method 'C M(C c)' is deleted + we use the same instance for the method return type, and the parameter type. + + + + + Return tokens for all updated debuggable methods. + + + + + Return tokens for all updated or added types. + + + + + CustomAttributes point to their target via the Parent column so we cannot simply output new rows + in the delta or we would end up with duplicates, but we also don't want to do complex logic to determine + which attributes have changes, so we just emit them all. + This means our logic for emitting CustomAttributes is to update any existing rows, either from the original + compilation or subsequent deltas, and only add more if we need to. The EncLog table is the thing that tells + the runtime which row a CustomAttributes row is (ie, new or existing) + + + + + Add an item from a previous generation + that has been updated in this generation. + + + + + Represents a module from a previous compilation. Used in Edit and Continue + to emit the differences in a subsequent compilation. + + + + + In C#, this is the set of anonymous types only; in VB, this is the set of anonymous types and delegates. + + + + + In C#, the set of anonymous delegates where the parameter types and return type are + generic type arguments; in VB, this set is unused and empty. + + + + + In C#, the set of anonymous delegates where at least one of the parameter types or return type + is not a valid type argument; in VB, this set is unused and empty. + + + + + A map of the assembly identities of the baseline compilation to the identities of the original metadata AssemblyRefs. + Only includes identities that differ between these two. + + + + + Creates an from the metadata of the module before editing + and from a function that maps from a method to an array of local names. + + The metadata of the module before editing. + + A function that for a method handle returns Edit and Continue debug information emitted by the compiler into the PDB. + The function shall throw if the debug information can't be read for the specified method. + This exception and are caught and converted to an emit diagnostic. Other exceptions are passed through. + + An for the module. + is not a PE image. + is null. + is null. + Error reading module metadata. + Module metadata is invalid. + Module has been disposed. + + + + Creates an from the metadata of the module before editing + and from a function that maps from a method to an array of local names. + + The metadata of the module before editing. + + A function that for a method handle returns Edit and Continue debug information emitted by the compiler into the PDB. + The function shall throw if the debug information can't be read for the specified method. + This exception and are caught and converted to an emit diagnostic. Other exceptions are passed through. + + + A function that for a method handle returns the signature of its local variables. + The function shall throw if the information can't be read for the specified method. + This exception and are caught and converted to an emit diagnostic. Other exceptions are passed through. + + + True if the baseline PDB is portable. + + An for the module. + + Only the initial baseline is created using this method; subsequent baselines are created + automatically when emitting the differences in subsequent compilations. + + When an active method (one for which a frame is allocated on a stack) is updated the values of its local variables need to be preserved. + The mapping of local variable names to their slots in the frame is not included in the metadata and thus needs to be provided by + . + + The is only needed for the initial generation. The mapping for the subsequent generations + is carried over through . The compiler assigns slots to named local variables (including named temporary variables) + it the order in which they appear in the source code. This property allows the compiler to reconstruct the local variable mapping + for the initial generation. A subsequent generation may add a new variable in between two variables of the previous generation. + Since the slots of the previous generation variables need to be preserved the only option is to add these new variables to the end. + The slot ordering thus no longer matches the syntax ordering. It is therefore necessary to pass + to the next generation (rather than e.g. create new s from scratch based on metadata produced by subsequent compilations). + + is null. + is null. + is null. + Error reading module metadata. + Module metadata is invalid. + Module has been disposed. + + + + The original metadata of the module. + + + + + Metadata generation ordinal. Zero for + full metadata and non-zero for delta. + + + + + Unique Guid for this delta, or default(Guid) + if full metadata. + + + + + The latest generation number of each symbol added via edit. + + + + + EnC metadata for methods added or updated since the initial generation, indexed by method row id. + + + + + Reads EnC debug information of a method from the initial baseline PDB. + The function shall throw if the debug information can't be read for the specified method. + This exception and are caught and converted to an emit diagnostic. Other exceptions are passed through. + The function shall return an empty if the method that corresponds to the specified handle + has no debug information. + + + + + A function that for a method handle returns the signature of its local variables. + The function shall throw if the information can't be read for the specified method. + This exception and are caught and converted to an emit diagnostic. Other exceptions are passed through. + The function shall return a nil if the method that corresponds to the specified handle + has no local variables. + + + + + Handles of methods with sequence points that have been updated in this delta. + + + + + Handles of types that were changed (updated or inserted) in this delta. + + + + + When invoked on a node that represents an anonymous function or a query clause [1] + with a of another anonymous function or a query clause of the same kind [2], + returns the body of the [1] that positionally corresponds to the specified . + + E.g. join clause declares left expression and right expression -- each of these expressions is a lambda body. + JoinClause1.GetCorrespondingLambdaBody(JoinClause2.RightExpression) returns JoinClause1.RightExpression. + + + + + Given a node that represents a variable declaration, lambda or a closure scope return the position to be used to calculate + the node's syntax offset with respect to its containing member. + + + + + No change to symbol or members. + + + + + No change to symbol but may contain changed symbols. + + + + + Symbol updated. + + + + + Symbol added. + + + + + Maps definitions being emitted to the corresponding definitions defined in the previous generation (metadata or source). + + + + + Contains all symbols explicitly updated/added to the source and + their containing types and namespaces. + + + + + A set of symbols whose name emitted to metadata must include a "#{generation}" suffix to avoid naming collisions with existing types. + Populated based on semantic edits with . + + + + + A set of symbols, from the old compilation, that have been deleted from the new compilation + keyed by the containing type from the new compilation. + Populated based on semantic edits with . + + + + + True if the symbol is a source symbol added during EnC session. + The symbol may be declared in any source compilation in the current solution. + + + + + Returns true if the symbol or some child symbol has changed and needs to be compiled. + + + + + Calculate the set of changes up to top-level types. The result + will be used as a filter when traversing the module. + + Note that these changes only include user-defined source symbols, not synthesized symbols since those will be + generated during lowering of the changed user-defined symbols. + + + + + Return the symbol that contains this symbol as far + as changes are concerned. For instance, an auto property + is considered the containing symbol for the backing + field and the accessor methods. By default, the containing + symbol is simply Symbol.ContainingSymbol. + + + + + Merges synthesized or deleted members generated during lowering, or emit, of the current compilation with aggregate + synthesized or deleted members from all previous source generations (gen >= 1). + + + Suppose {S -> {A, B, D}, T -> {E, F}} are all synthesized members in previous generations, + and {S' -> {A', B', C}, U -> {G, H}} members are generated in the current compilation. + + Where X matches X' via this matcher, i.e. X' is from the new compilation and + represents the same metadata entity as X in the previous compilation. + + Then the resulting collection shall have the following entries: + {S' -> {A', B', C, D}, U -> {G, H}, T -> {E, F}} + + + + + Represents compilation emit options. + + + + + True to emit an assembly excluding executable code such as method bodies. + + + + + Tolerate errors, producing a PE stream and a success result even in the presence of (some) errors. + + + + + Unless set (private) members that don't affect the language semantics of the resulting assembly will be excluded + when emitting metadata-only assemblies as primary output (with on). + If emitting a secondary output, this flag is required to be false. + + + + + Type of instrumentation that should be added to the output binary. + + + + + Subsystem version + + + + + Specifies the size of sections in the output file. + + + Valid values are 0, 512, 1024, 2048, 4096 and 8192. + If the value is 0 the file alignment is determined based upon the value of . + + + + + True to enable high entropy virtual address space for the output binary. + + + + + Specifies the preferred base address at which to load the output DLL. + + + + + Debug information format. + + + + + Assembly name override - file name and extension. If not specified the compilation name is used. + + + By default the name of the output assembly is . Only in rare cases it is necessary + to override the name. + + CAUTION: If this is set to a (non-null) value other than the existing compilation output name, then internals-visible-to + and assembly references may not work as expected. In particular, things that were visible at bind time, based on the + name of the compilation, may not be visible at runtime and vice-versa. + + + + + The name of the PDB file to be embedded in the PE image, or null to use the default. + + + If not specified the file name of the source module with an extension changed to "pdb" is used. + + + + + A crypto hash algorithm used to calculate PDB Checksum stored in the PE/COFF File. + If not specified (the value is default(HashAlgorithmName)) the checksum is not calculated. + + + + + Runtime metadata version. + + + + + The encoding used to parse source files that do not have a Byte Order Mark. If specified, + is stored in the emitted PDB in order to allow recreating the original compilation. + + + + + If is not specified, the encoding used to parse source files + that do not declare their encoding via Byte Order Mark and are not UTF-8 encoded. + + + + + Sets the byte alignment for portable executable file sections. + + Can be one of the following values: 0, 512, 1024, 2048, 4096, 8192 + + + + Error type symbols should be replaced with an object of this class + in the translation layer for emit. + + + + + For the name we will use a word "Error" followed by a guid, generated on the spot. + + + + + A fake containing assembly for an ErrorType object. + + + + + For the name we will use a word "Error" followed by a guid, generated on the spot. + + + + + Specifies a kind of instrumentation to be applied in generated code. + + + + + No instrumentation. + + + + + Instruments the binary to add test coverage. + + + + + Represents additional info needed by iterator method implementation methods + (MoveNext methods) to properly emit necessary PDB data for iterator debugging. + + + + + This is only used for testing. + + + + + This is only used for testing. + + + + + This is only used for testing. + + + + + Returns null if member doesn't belong to an embedded NoPia type. + + + + + Describes a symbol edit between two compilations. + For example, an addition of a method, an update of a method, removal of a type, etc. + + + + + The type of edit. + + + + + The symbol from the earlier compilation, + or null if the edit represents an addition. + + + + + The symbol from the later compilation, or the symbol of the containing type + from the later compilation if the edit represents a deletion. + + + + + A map from syntax node in the later compilation to syntax node in the previous compilation, + or null if is false and the map is not needed or + the source of the current method is the same as the source of the previous method. + + + The map does not need to map all syntax nodes in the active method, only those syntax nodes + that declare a local or generate a long lived local. + + + + + True if the edit is an update of the active method and local values + should be preserved; false otherwise. + + + + + Initializes an instance of . + + The type of edit. + + The symbol from the earlier compilation, or null if the edit represents an addition. + + + The symbol from the later compilation, or null if the edit represents a deletion. + + + A map from syntax node in the later compilation to syntax node in the previous compilation, + or null if is false and the map is not needed or + the source of the current method is the same as the source of the previous method. + + + True if the edit is an update of an active method and local values should be preserved; false otherwise. + + + or is null and the edit isn't a or , respectively. + + + is not a valid kind. + + + + + No change. + + + + + Symbol is updated. + + + + + Symbol is inserted. + + + + + Symbol is deleted. + + + + + Existing symbol is replaced by its new version. + + + + + Information associated with method body of a state machine MoveNext method. + + + + + Original async/iterator method transformed into MoveNext() + + + + + Represents an invalid operation with one or more child operations. + + Current usage: + (1) C# invalid expression or invalid statement. + (2) VB invalid expression or invalid statement. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents a block containing a sequence of operations and local declarations. + + Current usage: + (1) C# "{ ... }" block statement. + (2) VB implicit block statement for method bodies and other block scoped statements. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Operations contained within the block. + + + + + Local declarations contained within the block. + + + + + Represents a variable declaration statement. + + + Current Usage: + (1) C# local declaration statement + (2) C# fixed statement + (3) C# using statement + (4) C# using declaration + (5) VB Dim statement + (6) VB Using statement + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Variable declaration in the statement. + + + In C#, this will always be a single declaration, with all variables in . + + + + + Represents a switch operation with a value to be switched upon and switch cases. + + Current usage: + (1) C# switch statement. + (2) VB Select Case statement. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Locals declared within the switch operation with scope spanning across all . + + + + + Value to be switched upon. + + + + + Cases of the switch. + + + + + Exit label for the switch statement. + + + + + Represents a loop operation. + + Current usage: + (1) C# 'while', 'for', 'foreach' and 'do' loop statements + (2) VB 'While', 'ForTo', 'ForEach', 'Do While' and 'Do Until' loop statements + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Kind of the loop. + + + + + Body of the loop. + + + + + Declared locals. + + + + + Loop continue label. + + + + + Loop exit/break label. + + + + + Represents a for each loop. + + Current usage: + (1) C# 'foreach' loop statement + (2) VB 'For Each' loop statement + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Refers to the operation for declaring a new local variable or reference an existing variable or an expression. + + + + + Collection value over which the loop iterates. + + + + + Optional list of comma separated next variables at loop bottom in VB. + This list is always empty for C#. + + + + + Whether this for each loop is asynchronous. + Always false for VB. + + + + + Represents a for loop. + + Current usage: + (1) C# 'for' loop statement + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + List of operations to execute before entry to the loop. For C#, this comes from the first clause of the for statement. + + + + + Locals declared within the loop Condition and are in scope throughout the , + and . + They are considered to be declared per iteration. + + + + + Condition of the loop. For C#, this comes from the second clause of the for statement. + + + + + List of operations to execute at the bottom of the loop. For C#, this comes from the third clause of the for statement. + + + + + Represents a for to loop with loop control variable and initial, limit and step values for the control variable. + + Current usage: + (1) VB 'For ... To ... Step' loop statement + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Refers to the operation for declaring a new local variable or reference an existing variable or an expression. + + + + + Operation for setting the initial value of the loop control variable. This comes from the expression between the 'For' and 'To' keywords. + + + + + Operation for the limit value of the loop control variable. This comes from the expression after the 'To' keyword. + + + + + Operation for the step value of the loop control variable. This comes from the expression after the 'Step' keyword, + or inferred by the compiler if 'Step' clause is omitted. + + + + + true if arithmetic operations behind this loop are 'checked'. + + + + + Optional list of comma separated next variables at loop bottom. + + + + + Represents a while or do while loop. + + Current usage: + (1) C# 'while' and 'do while' loop statements. + (2) VB 'While', 'Do While' and 'Do Until' loop statements. + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Condition of the loop. This can only be null in error scenarios. + + + + + True if the is evaluated at start of each loop iteration. + False if it is evaluated at the end of each loop iteration. + + + + + True if the loop has 'Until' loop semantics and the loop is executed while is false. + + + + + Additional conditional supplied for loop in error cases, which is ignored by the compiler. + For example, for VB 'Do While' or 'Do Until' loop with syntax errors where both the top and bottom conditions are provided. + The top condition is preferred and exposed as and the bottom condition is ignored and exposed by this property. + This property should be null for all non-error cases. + + + + + Represents an operation with a label. + + Current usage: + (1) C# labeled statement. + (2) VB label statement. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Label that can be the target of branches. + + + + + Operation that has been labeled. In VB, this is always null. + + + + + Represents a branch operation. + + Current usage: + (1) C# goto, break, or continue statement. + (2) VB GoTo, Exit ***, or Continue *** statement. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Label that is the target of the branch. + + + + + Kind of the branch. + + + + + Represents an empty or no-op operation. + + Current usage: + (1) C# empty statement. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents a return from the method with an optional return value. + + Current usage: + (1) C# return statement and yield statement. + (2) VB Return statement. + + + + This node is associated with the following operation kinds: + + + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Value to be returned. + + + + + Represents a of operations that are executed while holding a lock onto the . + + Current usage: + (1) C# lock statement. + (2) VB SyncLock statement. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Operation producing a value to be locked. + + + + + Body of the lock, to be executed while holding the lock. + + + + + Represents a try operation for exception handling code with a body, catch clauses and a finally handler. + + Current usage: + (1) C# try statement. + (2) VB Try statement. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Body of the try, over which the handlers are active. + + + + + Catch clauses of the try. + + + + + Finally handler of the try. + + + + + Exit label for the try. This will always be null for C#. + + + + + Represents a of operations that are executed while using disposable . + + Current usage: + (1) C# using statement. + (2) VB Using statement. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Declaration introduced or resource held by the using. + + + + + Body of the using, over which the resources of the using are maintained. + + + + + Locals declared within the with scope spanning across this entire . + + + + + Whether this using is asynchronous. + Always false for VB. + + + + + Represents an operation that drops the resulting value and the type of the underlying wrapped . + + Current usage: + (1) C# expression statement. + (2) VB expression statement. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Underlying operation with a value and type. + + + + + Represents a local function defined within a method. + + Current usage: + (1) C# local function statement. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Local function symbol. + + + + + Body of the local function. + + + This can be null in error scenarios, or when the method is an extern method. + + + + + An extra body for the local function, if both a block body and expression body are specified in source. + + + This is only ever non-null in error situations. + + + + + Represents an operation to stop or suspend execution of code. + + Current usage: + (1) VB Stop statement. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents an operation that stops the execution of code abruptly. + + Current usage: + (1) VB End Statement. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents an operation for raising an event. + + Current usage: + (1) VB raise event statement. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Reference to the event to be raised. + + + + + Arguments of the invocation, excluding the instance argument. Arguments are in evaluation order. + + + If the invocation is in its expanded form, then params/ParamArray arguments would be collected into arrays. + Default values are supplied for optional arguments missing in source. + + + + + Represents a textual literal numeric, string, etc. + + Current usage: + (1) C# literal expression. + (2) VB literal expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents a type conversion. + + Current usage: + (1) C# conversion expression. + (2) VB conversion expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Value to be converted. + + + + + Operator method used by the operation, null if the operation does not use an operator method. + + + + + Type parameter which runtime type will be used to resolve virtual invocation of the , if any. + Null if is resolved statically, or is null. + + + + + Gets the underlying common conversion information. + + + If you need conversion information that is language specific, use either + or + . + + + + + False if the conversion will fail with a at runtime if the cast fails. This is true for C#'s + as operator and for VB's TryCast operator. + + + + + True if the conversion can fail at runtime with an overflow exception. This corresponds to C# checked and unchecked blocks. + + + + + Represents an invocation of a method. + + Current usage: + (1) C# method invocation expression. + (2) C# collection element initializer. + For example, in the following collection initializer: new C() { 1, 2, 3 }, we will have + 3 nodes, each of which will be a call to the corresponding Add method + with either 1, 2, 3 as the argument. + (3) VB method invocation expression. + (4) VB collection element initializer. + Similar to the C# example, New C() From {1, 2, 3} will have 3 + nodes with 1, 2, and 3 as their arguments, respectively. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Method to be invoked. + + + + + Type parameter which runtime type will be used to resolve virtual invocation of the . + Null if is resolved statically, or is an instance method. + + + + + 'This' or 'Me' instance to be supplied to the method, or null if the method is static. + + + + + True if the invocation uses a virtual mechanism, and false otherwise. + + + + + Arguments of the invocation, excluding the instance argument. Arguments are in evaluation order. + + + If the invocation is in its expanded form, then params/ParamArray arguments would be collected into arrays. + Default values are supplied for optional arguments missing in source. + + + + + Represents a reference to an array element. + + Current usage: + (1) C# array element reference expression. + (2) VB array element reference expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Array to be indexed. + + + + + Indices that specify an individual element. + + + + + Represents a reference to a declared local variable. + + Current usage: + (1) C# local reference expression. + (2) VB local reference expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Referenced local variable. + + + + + True if this reference is also the declaration site of this variable. This is true in out variable declarations + and in deconstruction operations where a new variable is being declared. + + + + + Represents a reference to a parameter. + + Current usage: + (1) C# parameter reference expression. + (2) VB parameter reference expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Referenced parameter. + + + + + Represents a reference to a member of a class, struct, or interface. + + Current usage: + (1) C# member reference expression. + (2) VB member reference expression. + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Instance of the type. Null if the reference is to a static/shared member. + + + + + Referenced member. + + + + + Type parameter which runtime type will be used to resolve virtual invocation of the . + Null if is resolved statically, or is an instance member. + + + + + Represents a reference to a field. + + Current usage: + (1) C# field reference expression. + (2) VB field reference expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Referenced field. + + + + + If the field reference is also where the field was declared. + + + This is only ever true in CSharp scripts, where a top-level statement creates a new variable + in a reference, such as an out variable declaration or a deconstruction declaration. + + + + + Represents a reference to a method other than as the target of an invocation. + + Current usage: + (1) C# method reference expression. + (2) VB method reference expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Referenced method. + + + + + Indicates whether the reference uses virtual semantics. + + + + + Represents a reference to a property. + + Current usage: + (1) C# property reference expression. + (2) VB property reference expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Referenced property. + + + + + Arguments of the indexer property reference, excluding the instance argument. Arguments are in evaluation order. + + + If the invocation is in its expanded form, then params/ParamArray arguments would be collected into arrays. + Default values are supplied for optional arguments missing in source. + + + + + Represents a reference to an event. + + Current usage: + (1) C# event reference expression. + (2) VB event reference expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Referenced event. + + + + + Represents an operation with one operand and a unary operator. + + Current usage: + (1) C# unary operation expression. + (2) VB unary operation expression. + + + + This node is associated with the following operation kinds: + + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Kind of unary operation. + + + + + Operand. + + + + + if this is a 'lifted' unary operator. When there is an + operator that is defined to work on a value type, 'lifted' operators are + created to work on the versions of those + value types. + + + + + if overflow checking is performed for the arithmetic operation. + + + + + Operator method used by the operation, null if the operation does not use an operator method. + + + + + Type parameter which runtime type will be used to resolve virtual invocation of the , if any. + Null if is resolved statically, or is null. + + + + + Represents an operation with two operands and a binary operator that produces a result with a non-null type. + + Current usage: + (1) C# binary operator expression. + (2) VB binary operator expression. + + + + This node is associated with the following operation kinds: + + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Kind of binary operation. + + + + + Left operand. + + + + + Right operand. + + + + + if this is a 'lifted' binary operator. When there is an + operator that is defined to work on a value type, 'lifted' operators are + created to work on the versions of those + value types. + + + + + if this is a 'checked' binary operator. + + + + + if the comparison is text based for string or object comparison in VB. + + + + + Operator method used by the operation, null if the operation does not use an operator method. + + + + + Type parameter which runtime type will be used to resolve virtual invocation of the + or corresponding true/false operator, if any. + Null if operators are resolved statically, or are not used. + + + + + Represents a conditional operation with: + (1) to be tested, + (2) operation to be executed when is true and + (3) operation to be executed when the is false. + + Current usage: + (1) C# ternary expression "a ? b : c" and if statement. + (2) VB ternary expression "If(a, b, c)" and If Else statement. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Condition to be tested. + + + + + Operation to be executed if the is true. + + + + + Operation to be executed if the is false. + + + + + Is result a managed reference + + + + + Represents a coalesce operation with two operands: + (1) , which is the first operand that is unconditionally evaluated and is the result of the operation if non null. + (2) , which is the second operand that is conditionally evaluated and is the result of the operation if is null. + + Current usage: + (1) C# null-coalescing expression "Value ?? WhenNull". + (2) VB binary conditional expression "If(Value, WhenNull)". + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Operation to be unconditionally evaluated. + + + + + Operation to be conditionally evaluated if evaluates to null/Nothing. + + + + + Conversion associated with when it is not null/Nothing. + Identity if result type of the operation is the same as type of . + Otherwise, if type of is nullable, then conversion is applied to an + unwrapped , otherwise to the itself. + + + + + Represents an anonymous function operation. + + Current usage: + (1) C# lambda expression. + (2) VB anonymous delegate expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Symbol of the anonymous function. + + + + + Body of the anonymous function. + + + + + Represents creation of an object instance. + + Current usage: + (1) C# new expression. + (2) VB New expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Constructor to be invoked on the created instance. + + + + + Object or collection initializer, if any. + + + + + Arguments of the object creation, excluding the instance argument. Arguments are in evaluation order. + + + If the invocation is in its expanded form, then params/ParamArray arguments would be collected into arrays. + Default values are supplied for optional arguments missing in source. + + + + + Represents a creation of a type parameter object, i.e. new T(), where T is a type parameter with new constraint. + + Current usage: + (1) C# type parameter object creation expression. + (2) VB type parameter object creation expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Object or collection initializer, if any. + + + + + Represents the creation of an array instance. + + Current usage: + (1) C# array creation expression. + (2) VB array creation expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Sizes of the dimensions of the created array instance. + + + + + Values of elements of the created array instance. + + + + + Represents an implicit/explicit reference to an instance. + + Current usage: + (1) C# this or base expression. + (2) VB Me, MyClass, or MyBase expression. + (3) C# object or collection or 'with' expression initializers. + (4) VB With statements, object or collection initializers. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The kind of reference that is being made. + + + + + Represents an operation that tests if a value is of a specific type. + + Current usage: + (1) C# "is" operator expression. + (2) VB "TypeOf" and "TypeOf IsNot" expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Value to test. + + + + + Type for which to test. + + + + + Flag indicating if this is an "is not" type expression. + True for VB "TypeOf ... IsNot ..." expression. + False, otherwise. + + + + + Represents an await operation. + + Current usage: + (1) C# await expression. + (2) VB await expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Awaited operation. + + + + + Represents a base interface for assignments. + + Current usage: + (1) C# simple, compound and deconstruction assignment expressions. + (2) VB simple and compound assignment expressions. + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Target of the assignment. + + + + + Value to be assigned to the target of the assignment. + + + + + Represents a simple assignment operation. + + Current usage: + (1) C# simple assignment expression. + (2) VB simple assignment expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Is this a ref assignment + + + + + Represents a compound assignment that mutates the target with the result of a binary operation. + + Current usage: + (1) C# compound assignment expression. + (2) VB compound assignment expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Conversion applied to before the operation occurs. + + + + + Conversion applied to the result of the binary operation, before it is assigned back to + . + + + + + Kind of binary operation. + + + + + if this assignment contains a 'lifted' binary operation. + + + + + if overflow checking is performed for the arithmetic operation. + + + + + Operator method used by the operation, null if the operation does not use an operator method. + + + + + Type parameter which runtime type will be used to resolve virtual invocation of the , if any. + Null if is resolved statically, or is null. + + + + + Represents a parenthesized operation. + + Current usage: + (1) VB parenthesized expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Operand enclosed in parentheses. + + + + + Represents a binding of an event. + + Current usage: + (1) C# event assignment expression. + (2) VB Add/Remove handler statement. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Reference to the event being bound. + + + + + Handler supplied for the event. + + + + + True for adding a binding, false for removing one. + + + + + Represents a conditionally accessed operation. Note that is used to refer to the value + of within . + + Current usage: + (1) C# conditional access expression (? or ?. operator). + (2) VB conditional access expression (? or ?. operator). + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Operation that will be evaluated and accessed if non null. + + + + + Operation to be evaluated if is non null. + + + + + Represents the value of a conditionally-accessed operation within . + For a conditional access operation of the form someExpr?.Member, this operation is used as the InstanceReceiver for the right operation Member. + See https://github.com/dotnet/roslyn/issues/21279#issuecomment-323153041 for more details. + + Current usage: + (1) C# conditional access instance expression. + (2) VB conditional access instance expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents an interpolated string. + + Current usage: + (1) C# interpolated string expression. + (2) VB interpolated string expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Constituent parts of interpolated string, each of which is an . + + + + + Represents a creation of anonymous object. + + Current usage: + (1) C# "new { ... }" expression + (2) VB "New With { ... }" expression + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Property initializers. + Each initializer is an , with an + as the target whose Instance is an with kind. + + + + + Represents an initialization for an object or collection creation. + + Current usage: + (1) C# object or collection initializer expression. + (2) VB object or collection initializer expression. + For example, object initializer "{ X = x }" within object creation "new Class() { X = x }" and + collection initializer "{ x, y, 3 }" within collection creation "new MyList() { x, y, 3 }". + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Object member or collection initializers. + + + + + Represents an initialization of member within an object initializer with a nested object or collection initializer. + + Current usage: + (1) C# nested member initializer expression. + For example, given an object creation with initializer "new Class() { X = x, Y = { x, y, 3 }, Z = { X = z } }", + member initializers for Y and Z, i.e. "Y = { x, y, 3 }", and "Z = { X = z }" are nested member initializers represented by this operation. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Initialized member reference or an invalid operation for error cases. + + + + + Member initializer. + + + + + Obsolete interface that used to represent a collection element initializer. It has been replaced by + and , as appropriate. + + Current usage: + None. This API has been obsoleted in favor of and . + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents an operation that gets a string value for the name. + + Current usage: + (1) C# nameof expression. + (2) VB NameOf expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Argument to the name of operation. + + + + + Represents a tuple with one or more elements. + + Current usage: + (1) C# tuple expression. + (2) VB tuple expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Tuple elements. + + + + + Natural type of the tuple, or null if tuple doesn't have a natural type. + Natural type can be different from depending on the + conversion context, in which the tuple is used. + + + + + Represents an object creation with a dynamically bound constructor. + + Current usage: + (1) C# "new" expression with dynamic argument(s). + (2) VB late bound "New" expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Object or collection initializer, if any. + + + + + Dynamically bound arguments, excluding the instance argument. + + + + + Represents a reference to a member of a class, struct, or module that is dynamically bound. + + Current usage: + (1) C# dynamic member reference expression. + (2) VB late bound member reference expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Instance receiver, if it exists. + + + + + Referenced member. + + + + + Type arguments. + + + + + The containing type of the referenced member, if different from type of the . + + + + + Represents a invocation that is dynamically bound. + + Current usage: + (1) C# dynamic invocation expression. + (2) C# dynamic collection element initializer. + For example, in the following collection initializer: new C() { do1, do2, do3 } where + the doX objects are of type dynamic, we'll have 3 with do1, do2, and + do3 as their arguments. + (3) VB late bound invocation expression. + (4) VB dynamic collection element initializer. + Similar to the C# example, New C() From {do1, do2, do3} will generate 3 + nodes with do1, do2, and do3 as their arguments, respectively. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Dynamically or late bound operation. + + + + + Dynamically bound arguments, excluding the instance argument. + + + + + Represents an indexer access that is dynamically bound. + + Current usage: + (1) C# dynamic indexer access expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Dynamically indexed operation. + + + + + Dynamically bound arguments, excluding the instance argument. + + + + + Represents an unrolled/lowered query operation. + For example, for a C# query expression "from x in set where x.Name != null select x.Name", the Operation tree has the following shape: + ITranslatedQueryExpression + IInvocationExpression ('Select' invocation for "select x.Name") + IInvocationExpression ('Where' invocation for "where x.Name != null") + IInvocationExpression ('From' invocation for "from x in set") + + Current usage: + (1) C# query expression. + (2) VB query expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Underlying unrolled operation. + + + + + Represents a delegate creation. This is created whenever a new delegate is created. + + Current usage: + (1) C# delegate creation expression. + (2) VB delegate creation expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The lambda or method binding that this delegate is created from. + + + + + Represents a default value operation. + + Current usage: + (1) C# default value expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents an operation that gets for the given . + + Current usage: + (1) C# typeof expression. + (2) VB GetType expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Type operand. + + + + + Represents an operation to compute the size of a given type. + + Current usage: + (1) C# sizeof expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Type operand. + + + + + Represents an operation that creates a pointer value by taking the address of a reference. + + Current usage: + (1) C# address of expression + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Addressed reference. + + + + + Represents an operation that tests if a value matches a specific pattern. + + Current usage: + (1) C# is pattern expression. For example, "x is int i". + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Underlying operation to test. + + + + + Pattern. + + + + + Represents an or operation. + Note that this operation is different from an as it mutates the , + while unary operator expression does not mutate it's operand. + + Current usage: + (1) C# increment expression or decrement expression. + + + + This node is associated with the following operation kinds: + + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + if this is a postfix expression. if this is a prefix expression. + + + + + if this is a 'lifted' increment operator. When there + is an operator that is defined to work on a value type, 'lifted' operators are + created to work on the versions of those + value types. + + + + + if overflow checking is performed for the arithmetic operation. + + + + + Target of the assignment. + + + + + Operator method used by the operation, null if the operation does not use an operator method. + + + + + Type parameter which runtime type will be used to resolve virtual invocation of the , if any. + Null if is resolved statically, or is null. + + + + + Represents an operation to throw an exception. + + Current usage: + (1) C# throw expression. + (2) C# throw statement. + (2) VB Throw statement. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Instance of an exception being thrown. + + + + + Represents a assignment with a deconstruction. + + Current usage: + (1) C# deconstruction assignment expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents a declaration expression operation. Unlike a regular variable declaration and , this operation represents an "expression" declaring a variable. + + Current usage: + (1) C# declaration expression. For example, + (a) "var (x, y)" is a deconstruction declaration expression with variables x and y. + (b) "(var x, var y)" is a tuple expression with two declaration expressions. + (c) "M(out var x);" is an invocation expression with an out "var x" declaration expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Underlying expression. + + + + + Represents an argument value that has been omitted in an invocation. + + Current usage: + (1) VB omitted argument in an invocation expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents an initializer for a field, property, parameter or a local variable declaration. + + Current usage: + (1) C# field, property, parameter or local variable initializer. + (2) VB field(s), property, parameter or local variable initializer. + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Local declared in and scoped to the . + + + + + Underlying initializer value. + + + + + Represents an initialization of a field. + + Current usage: + (1) C# field initializer with equals value clause. + (2) VB field(s) initializer with equals value clause or AsNew clause. Multiple fields can be initialized with AsNew clause in VB. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Initialized fields. There can be multiple fields for Visual Basic fields declared with AsNew clause. + + + + + Represents an initialization of a local variable. + + Current usage: + (1) C# local variable initializer with equals value clause. + (2) VB local variable initializer with equals value clause or AsNew clause. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents an initialization of a property. + + Current usage: + (1) C# property initializer with equals value clause. + (2) VB property initializer with equals value clause or AsNew clause. Multiple properties can be initialized with 'WithEvents' declaration with AsNew clause in VB. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Initialized properties. There can be multiple properties for Visual Basic 'WithEvents' declaration with AsNew clause. + + + + + Represents an initialization of a parameter at the point of declaration. + + Current usage: + (1) C# parameter initializer with equals value clause. + (2) VB parameter initializer with equals value clause. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Initialized parameter. + + + + + Represents the initialization of an array instance. + + Current usage: + (1) C# array initializer. + (2) VB array initializer. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Values to initialize array elements. + + + + + Represents a single variable declarator and initializer. + + + Current Usage: + (1) C# variable declarator + (2) C# catch variable declaration + (3) VB single variable declaration + (4) VB catch variable declaration + + + In VB, the initializer for this node is only ever used for explicit array bounds initializers. This node corresponds to + the VariableDeclaratorSyntax in C# and the ModifiedIdentifierSyntax in VB. + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Symbol declared by this variable declaration + + + + + Optional initializer of the variable. + + + If this variable is in an , the initializer may be located + in the parent operation. Call + to check in all locations. It is only possible to have initializers in both locations in VB invalid code scenarios. + + + + + Additional arguments supplied to the declarator in error cases, ignored by the compiler. This only used for the C# case of + DeclaredArgumentSyntax nodes on a VariableDeclaratorSyntax. + + + + + Represents a declarator that declares multiple individual variables. + + + Current Usage: + (1) C# VariableDeclaration + (2) C# fixed declarations + (3) VB Dim statement declaration groups + (4) VB Using statement variable declarations + + + The initializer of this node is applied to all individual declarations in . There cannot + be initializers in both locations except in invalid code scenarios. + In C#, this node will never have an initializer. + This corresponds to the VariableDeclarationSyntax in C#, and the VariableDeclaratorSyntax in Visual Basic. + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Individual variable declarations declared by this multiple declaration. + + + All will have at least 1 , + even if the declaration group only declares 1 variable. + + + + + Optional initializer of the variable. + + + In C#, this will always be null. + + + + + Array dimensions supplied to an array declaration in error cases, ignored by the compiler. This is only used for the C# case of + RankSpecifierSyntax nodes on an ArrayTypeSyntax. + + + + + Represents an argument to a method invocation. + + Current usage: + (1) C# argument to an invocation expression, object creation expression, etc. + (2) VB argument to an invocation expression, object creation expression, etc. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Kind of argument. + + + + + Parameter the argument matches. This can be null for __arglist parameters. + + + + + Value supplied for the argument. + + + + + Information of the conversion applied to the argument value passing it into the target method. Applicable only to VB Reference arguments. + + + + + Information of the conversion applied to the argument value after the invocation. Applicable only to VB Reference arguments. + + + + + Represents a catch clause. + + Current usage: + (1) C# catch clause. + (2) VB Catch clause. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Optional source for exception. This could be any of the following operation: + 1. Declaration for the local catch variable bound to the caught exception (C# and VB) OR + 2. Null, indicating no declaration or expression (C# and VB) + 3. Reference to an existing local or parameter (VB) OR + 4. Other expression for error scenarios (VB) + + + + + Type of the exception handled by the catch clause. + + + + + Locals declared by the and/or clause. + + + + + Filter operation to be executed to determine whether to handle the exception. + + + + + Body of the exception handler. + + + + + Represents a switch case section with one or more case clauses to match and one or more operations to execute within the section. + + Current usage: + (1) C# switch section for one or more case clause and set of statements to execute. + (2) VB case block with a case statement for one or more case clause and set of statements to execute. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Clauses of the case. + + + + + One or more operations to execute within the switch section. + + + + + Locals declared within the switch case section scoped to the section. + + + + + Represents a case clause. + + Current usage: + (1) C# case clause. + (2) VB Case clause. + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Kind of the clause. + + + + + Label associated with the case clause, if any. + + + + + Represents a default case clause. + + Current usage: + (1) C# default clause. + (2) VB Case Else clause. + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents a case clause with a pattern and an optional guard operation. + + Current usage: + (1) C# pattern case clause. + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Label associated with the case clause. + + + + + Pattern associated with case clause. + + + + + Guard associated with the pattern case clause. + + + + + Represents a case clause with range of values for comparison. + + Current usage: + (1) VB range case clause of the form "Case x To y". + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Minimum value of the case range. + + + + + Maximum value of the case range. + + + + + Represents a case clause with custom relational operator for comparison. + + Current usage: + (1) VB relational case clause of the form "Case Is op x". + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Case value. + + + + + Relational operator used to compare the switch value with the case value. + + + + + Represents a case clause with a single value for comparison. + + Current usage: + (1) C# case clause of the form "case x" + (2) VB case clause of the form "Case x". + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Case value. + + + + + Represents a constituent part of an interpolated string. + + Current usage: + (1) C# interpolated string content. + (2) VB interpolated string content. + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents a constituent string literal part of an interpolated string operation. + + Current usage: + (1) C# interpolated string text. + (2) VB interpolated string text. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Text content. + + + + + Represents a constituent interpolation part of an interpolated string operation. + + Current usage: + (1) C# interpolation part. + (2) VB interpolation part. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Expression of the interpolation. + + + + + Optional alignment of the interpolation. + + + + + Optional format string of the interpolation. + + + + + Represents a pattern matching operation. + + Current usage: + (1) C# pattern. + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The input type to the pattern-matching operation. + + + + + The narrowed type of the pattern-matching operation. + + + + + Represents a pattern with a constant value. + + Current usage: + (1) C# constant pattern. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Constant value of the pattern operation. + + + + + Represents a pattern that declares a symbol. + + Current usage: + (1) C# declaration pattern. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The type explicitly specified, or null if it was inferred (e.g. using var in C#). + + + + + True if the pattern is of a form that accepts null. + For example, in C# the pattern `var x` will match a null input, + while the pattern `string x` will not. + + + + + Symbol declared by the pattern, if any. + + + + + Represents a comparison of two operands that returns a bool type. + + Current usage: + (1) C# tuple binary operator expression. + + + + This node is associated with the following operation kinds: + + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Kind of binary operation. + + + + + Left operand. + + + + + Right operand. + + + + + Represents a method body operation. + + Current usage: + (1) C# method body + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Method body corresponding to BaseMethodDeclarationSyntax.Body or AccessorDeclarationSyntax.Body + + + + + Method body corresponding to BaseMethodDeclarationSyntax.ExpressionBody or AccessorDeclarationSyntax.ExpressionBody + + + + + Represents a method body operation. + + Current usage: + (1) C# method body for non-constructor + + + + This node is associated with the following operation kinds: + + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents a constructor method body operation. + + Current usage: + (1) C# method body for constructor declaration + + + + This node is associated with the following operation kinds: + + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Local declarations contained within the . + + + + + Constructor initializer, if any. + + + + + Represents a discard operation. + + Current usage: C# discard expressions + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The symbol of the discard operation. + + + + + Represents a coalesce assignment operation with a target and a conditionally-evaluated value: + (1) is evaluated for null. If it is null, is evaluated and assigned to target. + (2) is conditionally evaluated if is null, and the result is assigned into . + The result of the entire expression is, which is only evaluated once. + + Current usage: + (1) C# null-coalescing assignment operation Target ??= Value. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents a range operation. + + Current usage: + (1) C# range expressions + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Left operand. + + + + + Right operand. + + + + + true if this is a 'lifted' range operation. When there is an + operator that is defined to work on a value type, 'lifted' operators are + created to work on the versions of those + value types. + + + + + Factory method used to create this Range value. Can be null if appropriate + symbol was not found. + + + + + Represents the ReDim operation to re-allocate storage space for array variables. + + Current usage: + (1) VB ReDim statement. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Individual clauses of the ReDim operation. + + + + + Modifier used to preserve the data in the existing array when you change the size of only the last dimension. + + + + + Represents an individual clause of an to re-allocate storage space for a single array variable. + + Current usage: + (1) VB ReDim clause. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Operand whose storage space needs to be re-allocated. + + + + + Sizes of the dimensions of the created array instance. + + + + + Represents a C# recursive pattern. + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The type accepted for the recursive pattern. + + + + + The symbol, if any, used for the fetching values for subpatterns. This is either a Deconstruct + method, the type System.Runtime.CompilerServices.ITuple, or null (for example, in + error cases or when matching a tuple type). + + + + + This contains the patterns contained within a deconstruction or positional subpattern. + + + + + This contains the (symbol, property) pairs within a property subpattern. + + + + + Symbol declared by the pattern. + + + + + Represents a discard pattern. + + Current usage: C# discard pattern + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents a switch expression. + + Current usage: + (1) C# switch expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Value to be switched upon. + + + + + Arms of the switch expression. + + + + + True if the switch expressions arms cover every possible input value. + + + + + Represents one arm of a switch expression. + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The pattern to match. + + + + + Guard (when clause expression) associated with the switch arm, if any. + + + + + Result value of the enclosing switch expression when this arm matches. + + + + + Locals declared within the switch arm (e.g. pattern locals and locals declared in the guard) scoped to the arm. + + + + + Represents an element of a property subpattern, which identifies a member to be matched and the + pattern to match it against. + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The member being matched in a property subpattern. This can be a + in non-error cases, or an in error cases. + + + + + The pattern to which the member is matched in a property subpattern. + + + + + Represents a standalone VB query Aggregate operation with more than one item in Into clause. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents a C# fixed statement. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Locals declared. + + + + + Variables to be fixed. + + + + + Body of the fixed, over which the variables are fixed. + + + + + Represents a creation of an instance of a NoPia interface, i.e. new I(), where I is an embedded NoPia interface. + + Current usage: + (1) C# NoPia interface instance creation expression. + (2) VB NoPia interface instance creation expression. + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Object or collection initializer, if any. + + + + + Represents a general placeholder when no more specific kind of placeholder is available. + A placeholder is an expression whose meaning is inferred from context. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents a reference through a pointer. + + Current usage: + (1) C# pointer indirection reference expression. + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Pointer to be dereferenced. + + + + + Represents a of operations that are executed with implicit reference to the for member references. + + Current usage: + (1) VB With statement. + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Body of the with. + + + + + Value to whose members leading-dot-qualified references within the with body bind. + + + + + Represents using variable declaration, with scope spanning across the parent . + + Current Usage: + (1) C# using declaration + (1) C# asynchronous using declaration + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The variables declared by this using declaration. + + + + + True if this is an asynchronous using declaration. + + + + + Represents a negated pattern. + + Current usage: + (1) C# negated pattern. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The negated pattern. + + + + + Represents a binary ("and" or "or") pattern. + + Current usage: + (1) C# "and" and "or" patterns. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Kind of binary pattern; either or . + + + + + The pattern on the left. + + + + + The pattern on the right. + + + + + Represents a pattern comparing the input with a given type. + + Current usage: + (1) C# type pattern. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The type explicitly specified, or null if it was inferred (e.g. using var in C#). + + + + + Represents a pattern comparing the input with a constant value using a relational operator. + + Current usage: + (1) C# relational pattern. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The kind of the relational operator. + + + + + Constant value of the pattern operation. + + + + + Represents cloning of an object instance. + + Current usage: + (1) C# with expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Operand to be cloned. + + + + + Clone method to be invoked on the value. This can be null in error scenarios. + + + + + With collection initializer. + + + + + Represents an interpolated string converted to a custom interpolated string handler type. + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The construction of the interpolated string handler instance. This can be an for valid code, and + or for invalid code. + + + + + True if the last parameter of is an out parameter that will be checked before executing the code in + . False otherwise. + + + + + True if the AppendLiteral or AppendFormatted calls in nested return . When that is true, each part + will be conditional on the return of the part before it, only being executed when the Append call returns true. False otherwise. + + + when this is true and is true, then the first part in nested is conditionally + run. If this is true and is false, then the first part is unconditionally run. +
+ Just because this is true or false does not guarantee that all Append calls actually do return boolean values, as there could be dynamic calls or errors. + It only governs what the compiler was expecting, based on the first calls it did see. +
+
+ + + The interpolated string expression or addition operation that makes up the content of this string. This is either an + or an operation. + + + + + Represents an addition of multiple interpolated string literals being converted to an interpolated string handler type. + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The interpolated string expression or addition operation on the left side of the operator. This is either an + or an operation. + + + + + The interpolated string expression or addition operation on the right side of the operator. This is either an + or an operation. + + + + + Represents a call to either AppendLiteral or AppendFormatted as part of an interpolated string handler conversion. + + + This node is associated with the following operation kinds: + + + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + If this interpolated string is subject to an interpolated string handler conversion, the construction of the interpolated string handler instance. + This can be an or for valid code, and for invalid code. + + + + + Represents an argument from the method call, indexer access, or constructor invocation that is creating the containing + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The index of the argument of the method call, indexer, or object creation containing the interpolated string handler conversion this placeholder is referencing. + -1 if is anything other than . + + + + + The component this placeholder represents. + + + + + Represents an invocation of a function pointer. + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Invoked pointer. + + + + + Arguments of the invocation. Arguments are in evaluation order. + + + + + Represents a C# list pattern. + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The Length or Count property that is used to fetch the length value. + Returns null if no such property is found. + + + + + The indexer that is used to fetch elements. + Returns null for an array input. + + + + + Returns subpatterns contained within the list pattern. + + + + + Symbol declared by the pattern, if any. + + + + + Represents a C# slice pattern. + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The range indexer or the Slice method used to fetch the slice value. + + + + + The pattern that the slice value is matched with, if any. + + + + + Represents a reference to an implicit System.Index or System.Range indexer over a non-array type. + + Current usage: + (1) C# implicit System.Index or System.Range indexer reference expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Instance of the type to be indexed. + + + + + System.Index or System.Range value. + + + + + The Length or Count property that might be used to fetch the length value. + + + + + Symbol for the underlying indexer or a slice method that is used to implement the implicit indexer. + + + + + Represents a UTF-8 encoded byte representation of a string. + + Current usage: + (1) C# UTF-8 string literal expression. + + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The underlying string value. + + + + + This creates a block that can be used for temporary, internal applications that require a block composed of + statements from another block. Blocks created by this API violate IOperation tree constraints and should + never be exposed from a public API. + + + + Deep clone given IOperation + + + + Represents a visitor that visits only the single IOperation + passed into its Visit method. + + + + + Represents a visitor that visits only the single IOperation + passed into its Visit method with an additional argument of the type specified by the + parameter and produces a value of the type specified by + the parameter. + + + The type of the additional argument passed to this visitor's Visit method. + + + The type of the return value of this visitor's Visit method. + + + + + Kinds of arguments. + + + + + Represents unknown argument kind. + + + + + Argument value is explicitly supplied. + + + + + Argument is a param array created by compilers for the matching C# params or VB ParamArray parameter. + Note, the value is a an array creation expression that encapsulates all the elements, if any. + + + + + Argument is a default value supplied automatically by the compilers. + + + + + Kind of binary operator. + + + + + Represents unknown or error operator kind. + + + + + Represents the '+' operator. + + + + + Represents the '-' operator. + + + + + Represents the '*' operator. + + + + + Represents the '/' operator. + + + + + Represents the VB '\' integer divide operator. + + + + + Represents the C# '%' operator and VB 'Mod' operator. + + + + + Represents the VB '^' exponentiation operator. + + + + + Represents the operator. + + + + + Represents the >']]> operator. + + + + + Represents the C# operator and VB 'And' operator. + + + + + Represents the C# operator and VB 'Or' operator. + + + + + Represents the C# '^' operator and VB 'Xor' operator. + + + + + Represents the C# operator and VB 'AndAlso' operator. + + + + + Represents the C# operator and VB 'OrElse' operator. + + + + + Represents the VB operator for string concatenation. + + + + + Represents the C# '==' operator and VB 'Is' operator and '=' operator for non-object typed operands. + + + + + Represents the VB '=' operator for object typed operands. + + + + + Represents the C# '!=' operator and VB 'IsNot' operator and ']]> operator for non-object typed operands. + + + + + Represents the VB ']]> operator for object typed operands. + + + + + Represents the operator. + + + + + Represents the operator. + + + + + Represents the =']]> operator. + + + + + Represents the ']]> operator. + + + + + Represents the VB 'Like' operator. + + + + + Represents the >>']]> operator. + + + + + Kind of the branch for an + + + + + Represents unknown branch kind. + + + + + Represents a continue branch kind. + + + + + Represents a break branch kind. + + + + + Represents a goto branch kind. + + + + + Kinds of cases. + + + + + Represents unknown case kind. + + + + + Indicates an in C# or VB. + + + + + Indicates an in VB. + + + + + Indicates an in VB. + + + + + Indicates an in C# or VB. + + + + + Indicates an in C#. + + + + + Represents the common, language-agnostic elements of a conversion. + + + We reserve the right to change this struct in the future. + + + + + Returns true if the conversion exists, as defined by the target language. + + + The existence of a conversion does not necessarily imply that the conversion is valid. + For example, an ambiguous user-defined conversion may exist but may not be valid. + + + + + Returns true if the conversion is an identity conversion. + + + + + Returns true if the conversion is an nullable conversion. + + + + + Returns true if the conversion is a numeric conversion. + + + + + Returns true if the conversion is a reference conversion. + + + + + Returns true if the conversion is an implicit (C#) or widening (VB) conversion. + + + + + Returns true if the conversion is a user-defined conversion. + + + + + Returns the method used to perform the conversion for a user-defined conversion if is true. + Otherwise, returns null. + + + + + Type parameter which runtime type will be used to resolve virtual invocation of the , if any. + Null if is resolved statically, or is null. + + + + + Kind of reference for an . + + + + + Reference to an instance of the containing type. Used for this and base in C# code, and Me, + MyClass, MyBase in VB code. + + + + + Reference to the object being initialized in C# or VB object or collection initializer, + anonymous type creation initializer, or to the object being referred to in a VB With statement, + or the C# 'with' expression initializer. + + + + + Reference to the value being matching in a property subpattern. + + + + + Reference to the interpolated string handler instance created as part of a parent interpolated string handler conversion. + + + + + Kind of placeholder for an . + + + + + This is a placeholder for an argument from the containing method call, indexer access, or object creation. + The corresponding argument index is accessed in . + + + + + This is a placeholder for the receiver of the containing method call, indexer access, or object creation. + + + + + This is a placeholder for the trailing bool out parameter of the interpolated string handler type. This bool + controls whether the conditional evaluation for the rest of the interpolated string should be run after the + constructor returns. + + + + + Element type of the collection + + + + + The conversion from the type of the to the . + + + + + The conversion from the to the iteration variable type. + + + + + Kinds of loop operations. + + + + + Represents unknown loop kind. + + + + + Represents an in C# or VB. + + + + + Indicates an in C#. + + + + + Indicates an in VB. + + + + + Indicates an in C# or VB. + + + + + Helper function to simplify the access to the function pointer signature of an FunctionPointerInvocationOperation + + + + + This will check whether context around the operation has any error such as syntax or semantic error + + + + + Returns all the descendant operations of the given in evaluation order. + + Operation whose descendants are to be fetched. + + + + Returns all the descendant operations of the given including the given in evaluation order. + + Operation whose descendants are to be fetched. + + + + Gets all the declared local variables in the given . + + Variable declaration group + + + + Gets all the declared local variables in the given . + + Variable declaration + + + + Gets the variable initializer for the given , checking to see if there is a parent initializer + if the single variable initializer is null. + + Single variable declaration to retrieve initializer for. + + + + Get an optional argument name for a named argument to the given at the given . + + Dynamic or late bound operation. + Argument index. + + + + Get an optional argument name for a named argument to the given at the given . + + Dynamic or late bound operation. + Argument index. + + + + Get an optional argument name for a named argument to the given at the given . + + Dynamic or late bound operation. + Argument index. + + + + Get an optional argument name for a named argument to the given at the given . + + Dynamic or late bound operation. + Argument index. + + + + Get an optional argument for an argument at the given to the given . + Returns a non-null argument for C#. + Always returns null for VB as cannot be specified for an argument in VB. + + Dynamic or late bound operation. + Argument index. + + + + Get an optional argument for an argument at the given to the given . + Returns a non-null argument for C#. + Always returns null for VB as cannot be specified for an argument in VB. + + Dynamic or late bound operation. + Argument index. + + + + Get an optional argument for an argument at the given to the given . + Returns a non-null argument for C#. + Always returns null for VB as cannot be specified for an argument in VB. + + Dynamic or late bound operation. + Argument index. + + + + Gets the root operation for the tree containing the given . + + Operation whose root is requested. + + + + Gets either a loop or a switch operation that corresponds to the given branch operation. + + The branch operation for which a corresponding operation is looked up + The corresponding operation or null in case not found (e.g. no loop or switch syntax, or the branch is not a break or continue) + is null + The operation is a part of Control Flow Graph + + + + Use this to create IOperation when we don't have proper specific IOperation yet for given language construct + + + + + Represents a that descends an entire tree + visiting each IOperation and its child IOperation nodes in depth-first order. + + + + + Represents a that descends an entire tree + visiting each IOperation and its child IOperation nodes in depth-first order. Returns null. + + + + + Kind of unary operator + + + + + Represents unknown or error operator kind. + + + + + Represents the C# '~' operator. + + + + + Represents the C# '!' operator and VB 'Not' operator. + + + + + Represents the unary '+' operator. + + + + + Represents the unary '-' operator. + + + + + Represents the C# 'true' operator and VB 'IsTrue' operator. + + + + + Represents the C# 'false' operator and VB 'IsFalse' operator. + + + + + Represents the C# '^' operator. + + + + + Gets symbol information about a syntax node. + + + The syntax node to get semantic information for. + A cancellation token that can be used to cancel the + process of obtaining the semantic info. + + + + Binds the node in the context of the specified location and get semantic information + such as type, symbols and diagnostics. This method is used to get semantic information + about an expression that did not actually appear in the source code. + + + A character position used to identify a declaration scope and + accessibility. This character position must be within the FullSpan of the Root syntax + node in this SemanticModel. + + A syntax node that represents a parsed expression. This syntax + node need not and typically does not appear in the source code referred to SemanticModel + instance. + Indicates whether to binding the expression as a full expressions, + or as a type or namespace. If SpeculativeBindingOption.BindAsTypeOrNamespace is supplied, then + expression should derive from TypeSyntax. + The semantic information for the topmost node of the expression. + The passed in expression is interpreted as a stand-alone expression, as if it + appeared by itself somewhere within the scope that encloses "position". + + + + Gets type information about a syntax node. + + + The syntax node to get semantic information for. + A cancellation token that can be used to cancel the + process of obtaining the semantic info. + + + + If "nameSyntax" resolves to an alias name, return the IAliasSymbol corresponding + to A. Otherwise return null. + + + Name to get alias info for. + A cancellation token that can be used to cancel the + process of obtaining the alias information. + + + + Binds the name in the context of the specified location and sees if it resolves to an + alias name. If it does, return the AliasSymbol corresponding to it. Otherwise, return null. + + + A character position used to identify a declaration scope and + accessibility. This character position must be within the FullSpan of the Root syntax + node in this SemanticModel. + + A syntax node that represents a name. This syntax + node need not and typically does not appear in the source code referred to by the + SemanticModel instance. + Indicates whether to binding the name as a full expression, + or as a type or namespace. If SpeculativeBindingOption.BindAsTypeOrNamespace is supplied, then + expression should derive from TypeSyntax. + The passed in name is interpreted as a stand-alone name, as if it + appeared by itself somewhere within the scope that encloses "position". + + + + Binds the node in the context of the specified location and get semantic information + such as type, symbols and diagnostics. This method is used to get semantic information + about an expression that did not actually appear in the source code. + + + A character position used to identify a declaration scope and + accessibility. This character position must be within the FullSpan of the Root syntax + node in this SemanticModel. + + A syntax node that represents a parsed expression. This syntax + node need not and typically does not appear in the source code referred to SemanticModel + instance. + Indicates whether to binding the expression as a full expressions, + or as a type or namespace. If SpeculativeBindingOption.BindAsTypeOrNamespace is supplied, then + expression should derive from TypeSyntax. + The semantic information for the topmost node of the expression. + The passed in expression is interpreted as a stand-alone expression, as if it + appeared by itself somewhere within the scope that encloses "position". + + + + Gets the symbol associated with a declaration syntax node. + + + A syntax node that is a declaration. This can be any type + derived from MemberDeclarationSyntax, TypeDeclarationSyntax, EnumDeclarationSyntax, + NamespaceDeclarationSyntax, ParameterSyntax, TypeParameterSyntax, or the alias part of a + UsingDirectiveSyntax + The cancellation token. + The symbol declared by the node or null if the node is not a declaration. + + + + Gets a list of method or indexed property symbols for a syntax node. + + + The syntax node to get semantic information for. + The cancellation token. + + + + Analyze control-flow within a part of a method body. + + + + + Analyze control-flow within a part of a method body. + + + + + Analyze data-flow within a part of a method body. + + + + + Analyze data-flow within a part of a method body. + note (for C#): ConstructorInitializerSyntax and PrimaryConstructorBaseTypeSyntax are treated by this API as regular statements + + + + + It is unknown if the is automatically generated. + + + + + The is not automatically generated. + + + + + The is marked as automatically generated. + + + + + Represents the set of symbols that are imported to a particular position in a source file. Each import has a + reference to the location the import directive was declared at. For the import, the + location can be found using either or on the itself. For + or the location is found through or respectively. + + + + Scopes returned will always have at least one non-empty property value in them. + Symbols may be imported, but may not necessarily be available at that location (for example, an alias + symbol hidden by another symbol). + + In C# there will be an for every containing namespace-declarations that include any + import directives. There will also be an for the containing compilation-unit if it + includes any import directives or if there are global import directives pulled in from other files. + + + In Visual Basic there will commonly be one or two s returned for any position. This will + commonly be a scope for the containing compilation unit if it includes any import directives. As well as a scope + representing any imports specified at the project level. + + + Elements of any property have no defined order. Even if they represent items from a single document, they are + not guaranteed to be returned in any specific file-oriented order. + + There is no guarantee that the same scope instances will be returned from successive calls to . + + + + + + Aliases defined at this level of the chain. This corresponds to using X = TypeOrNamespace; in C# or + Imports X = TypeOrNamespace in Visual Basic. This will include global aliases if present for both + languages. + + May be , will never be . + + + + Extern aliases defined at this level of the chain. This corresponds to extern alias X; in C#. It + will be empty in Visual Basic. + + May be , will never be . + + + + Types or namespaces imported at this level of the chain. This corresponds to using Namespace; or + using static Type; in C#, or Imports TypeOrNamespace in Visual Basic. This will include + global namespace or type imports for both languages. + + May be , will never be . + + + + Xml namespaces imported at this level of the chain. This corresponds to Imports <xmlns:prefix = + "name"> in Visual Basic. It will be empty in C#. + + May be , will never be . + + + + Represents an that has been imported, and the location the import was + declared at. This corresponds to using Namespace; or using static Type; in C#, or Imports + TypeOrNamespace in Visual Basic. + + + + + Location in source where the using directive or Imports clause was declared. May be null for + Visual Basic for a project-level import directive, or for a C# global using provided directly through . + + + + + Represents an imported xml namespace name. This corresponds to Imports <xmlns:prefix = "name"> in + Visual Basic. It does not exist for C#. + + + + + Location in source where the Imports clause was declared. May be null for a project-level import + directive. + + + + + Simple POCO implementation of the import scope, usable by both C# and VB. + + + + + Represents the state of the nullable analysis at a specific point in a file. Bits one and + two correspond to whether the nullable feature is enabled. Bits three and four correspond + to whether the context was inherited from the global context. + + + + + Nullable warnings and annotations are explicitly turned off at this location. + + + + + Nullable warnings are enabled and will be reported at this file location. + + + + + Nullable annotations are enabled and will be shown when APIs defined at + this location are used in other contexts. + + + + + The nullable feature is fully enabled. + + + + + The nullable warning state is inherited from the project default. + + The project default can change depending on the file type. Generated + files have nullable off by default, regardless of the project-level + default setting. + + + + + + The nullable annotation state is inherited from the project default. + + The project default can change depending on the file type. Generated + files have nullable off by default, regardless of the project-level + default setting. + + + + + + The current state of both warnings and annotations are inherited from + the project default. + + This flag is set by default at the start of all files. + + The project default can change depending on the file type. Generated + files have nullable off by default, regardless of the project-level + default setting. + + + + + + Returns whether nullable warnings are enabled for this context. + + + + + Returns whether nullable annotations are enabled for this context. + + + + + Returns whether the nullable warning state was inherited from the project default for this file type. + + + + + Returns whether the nullable annotation state was inherited from the project default for this file type. + + + + + Represents the default state of nullable analysis in this compilation. + + + + + The nullable analysis feature is disabled. + + + + + Nullable warnings are enabled and will be reported by default. + + + + + Nullable annotations are enabled and will be shown when APIs + defined in this project are used in other contexts. + + + + + The nullable analysis feature is fully enabled. + + + + + Returns whether nullable warnings are enabled. + + + + + Returns whether nullable annotations are enabled. + + + + + Determines the level of optimization of the generated code. + + + + + Disables all optimizations and instruments the generated code to improve debugging experience. + + The compiler prefers debuggability over performance. Do not use for code running in a production environment. + + + JIT optimizations are disabled via assembly level attribute (). + Edit and Continue is enabled. + Slots for local variables are not reused, lifetime of local variables is extended to make the values available during debugging. + + + Corresponds to command line argument /optimize-. + + + + + + Enables all optimizations, debugging experience might be degraded. + + The compiler prefers performance over debuggability. Use for code running in a production environment. + + + JIT optimizations are enabled via assembly level attribute (). + Edit and Continue is disabled. + Sequence points may be optimized away. As a result it might not be possible to place or hit a breakpoint. + User-defined locals might be optimized away. They might not be available while debugging. + + + Corresponds to command line argument /optimize+. + + + + + + Represents parse options common to C# and VB. + + + + + Specifies whether to parse as regular code files, script files or interactive code. + + + + + Gets the specified source code kind, which is the value that was specified in + the call to the constructor, or modified using the method. + + + + + Gets a value indicating whether the documentation comments are parsed and analyzed. + + + + + Gets the source language ("C#" or "Visual Basic"). + + + + + Errors collection related to an incompatible set of parse options + + + + + Creates a new options instance with the specified source code kind. + + + + + Performs validation of options compatibilities and generates diagnostics if needed + + + + + Creates a new options instance with the specified documentation mode. + + + + + Enable some experimental language features for testing. + + + + + Returns the experimental features. + + + + + Names of defined preprocessor symbols. + + + + + AnyCPU (default) compiles the assembly to run on any platform. + + + + + x86 compiles the assembly to be run by the 32-bit, x86-compatible common language runtime. + + + + + x64 compiles the assembly to be run by the 64-bit common language runtime on a computer that supports the AMD64 or EM64T instruction set. + + + + + Itanium compiles the assembly to be run by the 64-bit common language runtime on a computer with an Itanium processor. + + + + + Compiles your assembly to run on any platform. Your application runs in 32-bit mode on systems that support both 64-bit and 32-bit applications. + + + + + Compiles your assembly to run on a computer that has an Advanced RISC Machine (ARM) processor. + + + + + Compiles your assembly to run on a computer that has an Advanced RISC Machine 64 bit (ARM64) processor. + + + + + The symbol that was referred to by the identifier, if any. + + + + + Returns true if this preprocessing symbol is defined at the identifier position. + + + + + This represents the set of document names for the #line / #ExternalSource directives + that we need to emit into the PDB (in the order specified in the array). + + + + + Allows asking semantic questions about a tree of syntax nodes in a Compilation. Typically, + an instance is obtained by a call to GetBinding on a Compilation or Compilation. + + + An instance of SemanticModel caches local symbols and semantic information. Thus, it + is much more efficient to use a single instance of SemanticModel when asking multiple + questions about a syntax tree, because information from the first question may be reused. + This also means that holding onto an instance of SemanticModel for a long time may keep a + significant amount of memory from being garbage collected. + + + When an answer is a named symbol that is reachable by traversing from the root of the symbol + table, (that is, from an AssemblySymbol of the Compilation), that symbol will be returned + (i.e. the returned value will be reference-equal to one reachable from the root of the + symbol table). Symbols representing entities without names (e.g. array-of-int) may or may + not exhibit reference equality. However, some named symbols (such as local variables) are + not reachable from the root. These symbols are visible as answers to semantic questions. + When the same SemanticModel object is used, the answers exhibit reference-equality. + + + + + + Gets the source language ("C#" or "Visual Basic"). + + + + + The compilation this model was obtained from. + + + + + The compilation this model was obtained from. + + + + + The syntax tree this model was obtained from. + + + + + The syntax tree this model was obtained from. + + + + + Gets the operation corresponding to the expression or statement syntax node. + + The expression or statement syntax node. + An optional cancellation token. + + + + + Returns true if this is a SemanticModel that ignores accessibility rules when answering semantic questions. + + + + + Gets symbol information about a syntax node. + + The syntax node to get semantic information for. + A cancellation token that can be used to cancel the + process of obtaining the semantic info. + + + + Gets symbol information about a syntax node. + + The syntax node to get semantic information for. + A cancellation token that can be used to cancel the + process of obtaining the semantic info. + + + + Binds the node in the context of the specified location and get semantic information + such as type, symbols and diagnostics. This method is used to get semantic information + about an expression that did not actually appear in the source code. + + A character position used to identify a declaration scope and + accessibility. This character position must be within the FullSpan of the Root syntax + node in this SemanticModel. + + A syntax node that represents a parsed expression. This syntax + node need not and typically does not appear in the source code referred to SemanticModel + instance. + Indicates whether to binding the expression as a full expressions, + or as a type or namespace. If SpeculativeBindingOption.BindAsTypeOrNamespace is supplied, then + expression should derive from TypeSyntax. + The semantic information for the topmost node of the expression. + The passed in expression is interpreted as a stand-alone expression, as if it + appeared by itself somewhere within the scope that encloses "position". + + + + Binds the node in the context of the specified location and get semantic information + such as type, symbols and diagnostics. This method is used to get semantic information + about an expression that did not actually appear in the source code. + + A character position used to identify a declaration scope and + accessibility. This character position must be within the FullSpan of the Root syntax + node in this SemanticModel. + + A syntax node that represents a parsed expression. This syntax + node need not and typically does not appear in the source code referred to SemanticModel + instance. + Indicates whether to binding the expression as a full expressions, + or as a type or namespace. If SpeculativeBindingOption.BindAsTypeOrNamespace is supplied, then + expression should derive from TypeSyntax. + The semantic information for the topmost node of the expression. + The passed in expression is interpreted as a stand-alone expression, as if it + appeared by itself somewhere within the scope that encloses "position". + + + + Binds the node in the context of the specified location and get semantic information + such as type, symbols and diagnostics. This method is used to get semantic information + about an expression that did not actually appear in the source code. + + A character position used to identify a declaration scope and + accessibility. This character position must be within the FullSpan of the Root syntax + node in this SemanticModel. + + A syntax node that represents a parsed expression. This syntax + node need not and typically does not appear in the source code referred to SemanticModel + instance. + Indicates whether to binding the expression as a full expressions, + or as a type or namespace. If SpeculativeBindingOption.BindAsTypeOrNamespace is supplied, then + expression should derive from TypeSyntax. + The semantic information for the topmost node of the expression. + The passed in expression is interpreted as a stand-alone expression, as if it + appeared by itself somewhere within the scope that encloses "position". + + + + Binds the node in the context of the specified location and get semantic information + such as type, symbols and diagnostics. This method is used to get semantic information + about an expression that did not actually appear in the source code. + + A character position used to identify a declaration scope and + accessibility. This character position must be within the FullSpan of the Root syntax + node in this SemanticModel. + + A syntax node that represents a parsed expression. This syntax + node need not and typically does not appear in the source code referred to SemanticModel + instance. + Indicates whether to binding the expression as a full expressions, + or as a type or namespace. If SpeculativeBindingOption.BindAsTypeOrNamespace is supplied, then + expression should derive from TypeSyntax. + The semantic information for the topmost node of the expression. + The passed in expression is interpreted as a stand-alone expression, as if it + appeared by itself somewhere within the scope that encloses "position". + + + + Gets type information about a syntax node. + + The syntax node to get semantic information for. + A cancellation token that can be used to cancel the + process of obtaining the semantic info. + + + + Gets type information about a syntax node. + + The syntax node to get semantic information for. + A cancellation token that can be used to cancel the + process of obtaining the semantic info. + + + + If "nameSyntax" resolves to an alias name, return the IAliasSymbol corresponding + to A. Otherwise return null. + + Name to get alias info for. + A cancellation token that can be used to cancel the + process of obtaining the alias information. + + + + If "nameSyntax" resolves to an alias name, return the IAliasSymbol corresponding + to A. Otherwise return null. + + Name to get alias info for. + A cancellation token that can be used to cancel the + process of obtaining the alias information. + + + + Returns true if this is a speculative semantic model created with any of the TryGetSpeculativeSemanticModel methods. + + + + + If this is a speculative semantic model, returns the original position at which the speculative model was created. + Otherwise, returns 0. + + + + + If this is a speculative semantic model, then returns its parent semantic model. + Otherwise, returns null. + + + + + If this is a speculative semantic model, then returns its parent semantic model. + Otherwise, returns null. + + + + + If this is a non-speculative member semantic model, then returns the containing semantic model for the entire tree. + Otherwise, returns this instance of the semantic model. + + + + + Binds the name in the context of the specified location and sees if it resolves to an + alias name. If it does, return the AliasSymbol corresponding to it. Otherwise, return null. + + A character position used to identify a declaration scope and + accessibility. This character position must be within the FullSpan of the Root syntax + node in this SemanticModel. + + A syntax node that represents a name. This syntax + node need not and typically does not appear in the source code referred to by the + SemanticModel instance. + Indicates whether to binding the name as a full expression, + or as a type or namespace. If SpeculativeBindingOption.BindAsTypeOrNamespace is supplied, then + expression should derive from TypeSyntax. + The passed in name is interpreted as a stand-alone name, as if it + appeared by itself somewhere within the scope that encloses "position". + + + + Binds the name in the context of the specified location and sees if it resolves to an + alias name. If it does, return the AliasSymbol corresponding to it. Otherwise, return null. + + A character position used to identify a declaration scope and + accessibility. This character position must be within the FullSpan of the Root syntax + node in this SemanticModel. + + A syntax node that represents a name. This syntax + node need not and typically does not appear in the source code referred to by the + SemanticModel instance. + Indicates whether to binding the name as a full expression, + or as a type or namespace. If SpeculativeBindingOption.BindAsTypeOrNamespace is supplied, then + expression should derive from TypeSyntax. + The passed in name is interpreted as a stand-alone name, as if it + appeared by itself somewhere within the scope that encloses "position". + + + + Get all of the syntax errors within the syntax tree associated with this + object. Does not get errors involving declarations or compiling method bodies or initializers. + + Optional span within the syntax tree for which to get diagnostics. + If no argument is specified, then diagnostics for the entire tree are returned. + A cancellation token that can be used to cancel the + process of obtaining the diagnostics. + + + + Get all of the declaration errors within the syntax tree associated with this + object. Does not get errors involving incorrect syntax, compiling method bodies or initializers. + + Optional span within the syntax tree for which to get diagnostics. + If no argument is specified, then diagnostics for the entire tree are returned. + A cancellation token that can be used to cancel the + process of obtaining the diagnostics. + The declaration errors for a syntax tree are cached. The first time this method + is called, all declarations are analyzed for diagnostics. Calling this a second time + will return the cached diagnostics. + + + + + Get all of the method body and initializer errors within the syntax tree associated with this + object. Does not get errors involving incorrect syntax or declarations. + + Optional span within the syntax tree for which to get diagnostics. + If no argument is specified, then diagnostics for the entire tree are returned. + A cancellation token that can be used to cancel the + process of obtaining the diagnostics. + The method body errors for a syntax tree are not cached. The first time this method + is called, all method bodies are analyzed for diagnostics. Calling this a second time + will repeat this work. + + + + + Get all the errors within the syntax tree associated with this object. Includes errors + involving compiling method bodies or initializers, in addition to the errors returned by + GetDeclarationDiagnostics. + + Optional span within the syntax tree for which to get diagnostics. + If no argument is specified, then diagnostics for the entire tree are returned. + A cancellation token that can be used to cancel the + process of obtaining the diagnostics. + + Because this method must semantically bind all method bodies and initializers to check + for diagnostics, it may take a significant amount of time. Unlike + GetDeclarationDiagnostics, diagnostics for method bodies and initializers are not + cached, any semantic information used to obtain the diagnostics is discarded. + + + + + Gets the symbol associated with a declaration syntax node. + + A syntax node that is a declaration. This can be any type + derived from MemberDeclarationSyntax, TypeDeclarationSyntax, EnumDeclarationSyntax, + NamespaceDeclarationSyntax, ParameterSyntax, TypeParameterSyntax, or the alias part of a + UsingDirectiveSyntax + The cancellation token. + The symbol declared by the node or null if the node is not a declaration. + + + + Gets the symbol associated with a declaration syntax node. + + A syntax node that is a declaration. This can be any type + derived from MemberDeclarationSyntax, TypeDeclarationSyntax, EnumDeclarationSyntax, + NamespaceDeclarationSyntax, ParameterSyntax, TypeParameterSyntax, or the alias part of a + UsingDirectiveSyntax + The cancellation token. + The symbol declared by the node or null if the node is not a declaration. + + + + Gets the symbol associated with a declaration syntax node. Unlike , + this method returns all symbols declared by a given declaration syntax node. Specifically, in the case of field declaration syntax nodes, + which can declare multiple symbols, this method returns all declared symbols. + + A syntax node that is a declaration. This can be any type + derived from MemberDeclarationSyntax, TypeDeclarationSyntax, EnumDeclarationSyntax, + NamespaceDeclarationSyntax, ParameterSyntax, TypeParameterSyntax, or the alias part of a + UsingDirectiveSyntax + The cancellation token. + The symbols declared by the node. + + + + Gets the symbol associated with a declaration syntax node. Unlike , + this method returns all symbols declared by a given declaration syntax node. Specifically, in the case of field declaration syntax nodes, + which can declare multiple symbols, this method returns all declared symbols. + + A syntax node that is a declaration. This can be any type + derived from MemberDeclarationSyntax, TypeDeclarationSyntax, EnumDeclarationSyntax, + NamespaceDeclarationSyntax, ParameterSyntax, TypeParameterSyntax, or the alias part of a + UsingDirectiveSyntax + The cancellation token. + The symbols declared by the node. + + + + Gets the available named symbols in the context of the specified location and optional container. Only + symbols that are accessible and visible from the given location are returned. + + The character position for determining the enclosing declaration scope and + accessibility. + The container to search for symbols within. If null then the enclosing declaration + scope around position is used. + The name of the symbol to find. If null is specified then symbols + with any names are returned. + Consider (reduced) extension methods. + A list of symbols that were found. If no symbols were found, an empty list is returned. + + The "position" is used to determine what variables are visible and accessible. Even if "container" is + specified, the "position" location is significant for determining which members of "containing" are + accessible. + + Labels are not considered (see ). + + Non-reduced extension methods are considered regardless of the value of . + + + + + Backing implementation of . + + + + + Gets the available base type members in the context of the specified location. Akin to + calling with the container set to the immediate base type of + the type in which occurs. However, the accessibility rules + are different: protected members of the base type will be visible. + + Consider the following example: + + public class Base + { + protected void M() { } + } + + public class Derived : Base + { + void Test(Base b) + { + b.M(); // Error - cannot access protected member. + base.M(); + } + } + + Protected members of an instance of another type are only accessible if the instance is known + to be "this" instance (as indicated by the "base" keyword). + + The character position for determining the enclosing declaration scope and + accessibility. + The name of the symbol to find. If null is specified then symbols + with any names are returned. + A list of symbols that were found. If no symbols were found, an empty list is returned. + + The "position" is used to determine what variables are visible and accessible. + + Non-reduced extension methods are considered, but reduced extension methods are not. + + + + + Backing implementation of . + + + + + Gets the available named static member symbols in the context of the specified location and optional container. + Only members that are accessible and visible from the given location are returned. + + Non-reduced extension methods are considered, since they are static methods. + + The character position for determining the enclosing declaration scope and + accessibility. + The container to search for symbols within. If null then the enclosing declaration + scope around position is used. + The name of the symbol to find. If null is specified then symbols + with any names are returned. + A list of symbols that were found. If no symbols were found, an empty list is returned. + + The "position" is used to determine what variables are visible and accessible. Even if "container" is + specified, the "position" location is significant for determining which members of "containing" are + accessible. + + Essentially the same as filtering instance members out of the results of an analogous call. + + + + + Backing implementation of . + + + + + Gets the available named namespace and type symbols in the context of the specified location and optional container. + Only members that are accessible and visible from the given location are returned. + + The character position for determining the enclosing declaration scope and + accessibility. + The container to search for symbols within. If null then the enclosing declaration + scope around position is used. + The name of the symbol to find. If null is specified then symbols + with any names are returned. + A list of symbols that were found. If no symbols were found, an empty list is returned. + + The "position" is used to determine what variables are visible and accessible. Even if "container" is + specified, the "position" location is significant for determining which members of "containing" are + accessible. + + Does not return INamespaceOrTypeSymbol, because there could be aliases. + + + + + Backing implementation of . + + + + + Gets the available named label symbols in the context of the specified location and optional container. + Only members that are accessible and visible from the given location are returned. + + The character position for determining the enclosing declaration scope and + accessibility. + The name of the symbol to find. If null is specified then symbols + with any names are returned. + A list of symbols that were found. If no symbols were found, an empty list is returned. + + The "position" is used to determine what variables are visible and accessible. Even if "container" is + specified, the "position" location is significant for determining which members of "containing" are + accessible. + + + + + Backing implementation of . + + + + + Analyze control-flow within a part of a method body. + + The first node to be included within the analysis. + The last node to be included within the analysis. + An object that can be used to obtain the result of the control flow analysis. + The span is not with a method + body. + + The first and last nodes must be fully inside the same method body. + + + + + Analyze control-flow within a part of a method body. + + The first node to be included within the analysis. + The last node to be included within the analysis. + An object that can be used to obtain the result of the control flow analysis. + The span is not with a method + body. + + The first and last nodes must be fully inside the same method body. + + + + + Analyze control-flow within a part of a method body. + + The statement to be analyzed. + An object that can be used to obtain the result of the control flow analysis. + The span is not with a method + body. + + The statement must be fully inside the same method body. + + + + + Analyze control-flow within a part of a method body. + + The statement to be analyzed. + An object that can be used to obtain the result of the control flow analysis. + The span is not with a method + body. + + The statement must be fully inside the same method body. + + + + + Analyze data-flow within a part of a method body. + + The first node to be included within the analysis. + The last node to be included within the analysis. + An object that can be used to obtain the result of the data flow analysis. + The span is not with a method + body. + + The first and last nodes must be fully inside the same method body. + + + + + Analyze data-flow within a part of a method body. + + The first node to be included within the analysis. + The last node to be included within the analysis. + An object that can be used to obtain the result of the data flow analysis. + The span is not with a method + body. + + The first and last nodes must be fully inside the same method body. + + + + + Analyze data-flow within a part of a method body. + + The statement or expression to be analyzed. A ConstructorInitializerSyntax / PrimaryConstructorBaseTypeSyntax is treated here as a regular statement. + An object that can be used to obtain the result of the data flow analysis. + The statement or expression is not with a method + body or field or property initializer. + + The statement or expression must be fully inside a method body. + + + + + Analyze data-flow within a part of a method body. + + The statement or expression to be analyzed. + An object that can be used to obtain the result of the data flow analysis. + The statement or expression is not with a method + body or field or property initializer. + + The statement or expression must be fully inside a method body. + + + + + If the node provided has a constant value an Optional value will be returned with + HasValue set to true and with Value set to the constant. If the node does not have an + constant value, an Optional will be returned with HasValue set to false. + + + + + If the node provided has a constant value an Optional value will be returned with + HasValue set to true and with Value set to the constant. If the node does not have an + constant value, an Optional will be returned with HasValue set to false. + + + + + When getting information for a symbol that resolves to a method group or property group, + from which a method is then chosen; the chosen method or property is present in Symbol; + all methods in the group that was consulted are placed in this property. + + + + + When getting information for a symbol that resolves to a method group or property group, + from which a method is then chosen; the chosen method or property is present in Symbol; + all methods in the group that was consulted are placed in this property. + + + + + Given a position in the SyntaxTree for this SemanticModel returns the innermost Symbol + that the position is considered inside of. + + + + + Given a position in the SyntaxTree for this SemanticModel returns the innermost Symbol + that the position is considered inside of. + + + + + Given a position in the SyntaxTree for this SemanticModel returns the s at that + point. Scopes are ordered from closest to the passed in to the furthest. See + for a deeper description of what information is available for each scope. + + + + + Determines if the symbol is accessible from the specified location. + + A character position used to identify a declaration scope and + accessibility. This character position must be within the FullSpan of the Root syntax + node in this SemanticModel. + + The symbol that we are checking to see if it accessible. + + True if "symbol is accessible, false otherwise. + + This method only checks accessibility from the point of view of the accessibility + modifiers on symbol and its containing types. Even if true is returned, the given symbol + may not be able to be referenced for other reasons, such as name hiding. + + + + + Determines if the symbol is accessible from the specified location. + + A character position used to identify a declaration scope and + accessibility. This character position must be within the FullSpan of the Root syntax + node in this SemanticModel. + + The symbol that we are checking to see if it accessible. + + True if "symbol is accessible, false otherwise. + + This method only checks accessibility from the point of view of the accessibility + modifiers on symbol and its containing types. Even if true is returned, the given symbol + may not be able to be referenced for other reasons, such as name hiding. + + + + + Field-like events can be used as fields in types that can access private + members of the declaring type of the event. + + + Always false for VB events. + + + + + Field-like events can be used as fields in types that can access private + members of the declaring type of the event. + + + Always false for VB events. + + + + + If is an identifier name syntax node, return the corresponding + to it. + + The nameSyntax node to get semantic information for. + + + + If is an identifier name syntax node, return the corresponding + to it. + + The nameSyntax node to get semantic information for. + + + + Gets the for all the declarations whose span overlaps with the given . + + Span to get declarations. + Flag indicating whether should be computed for the returned declaration infos. + If false, then is always null. + Builder to add declarations. + Cancellation token. + + + + Takes a node and returns a set of declarations that overlap the node's span. + + + + + Gets a filter that determines whether or not a given syntax node and its descendants should be analyzed for the given + declared node and declared symbol. We have scenarios where certain syntax nodes declare multiple symbols, + for example record declarations, and we want to avoid duplicate syntax node callbacks for such nodes. + Note that the predicate returned by this method filters out both the node and all its descendants from analysis. + If you wish to skip analysis just for a specific node, but not its descendants, then add the required logic in + . + + + + + Determines if the given syntax node with the given containing symbol should be analyzed or not. + Note that only the given syntax node will be filtered out from analysis, this API will be invoked separately + for each of its descendants. If you wish to skip analysis of the node and all its descendants, then add the required + logic to . + + + + + Takes a Symbol and syntax for one of its declaring syntax reference and returns the topmost syntax node to be used by syntax analyzer. + + + + + Root of this semantic model + + + + + Root of this semantic model + + + + + Gets the at a position in the file. + + The position to get the context for. + + + + Provides semantic models for syntax trees in a compilation. + This provider can be attached to a compilation, see . + + + + + Gets a for the given that belongs to the given . + + + + + Resolves references to source documents specified in the source. + + + + + Normalizes specified source path with respect to base file path. + + The source path to normalize. May be absolute or relative. + Path of the source file that contains the (may also be relative), or null if not available. + Normalized path, or null if can't be normalized. The resulting path doesn't need to exist. + + + + Resolves specified path with respect to base file path. + + The path to resolve. May be absolute or relative. + Path of the source file that contains the (may also be relative), or null if not available. + Normalized path, or null if the file can't be resolved. + + + + Opens a that allows reading the content of the specified file. + + Path returned by . + is null. + is not a valid absolute path. + Error reading file . See for details. + + + + Reads the contents of and returns a . + + Path returned by . + + + + Describes the kind of binding to be performed in one of the SemanticModel + speculative binding methods. + + + + + Binds the given expression using the normal expression binding rules + that would occur during normal binding of expressions. + + + + + Binds the given expression as a type or namespace only. If this option + is selected, then the given expression must derive from TypeSyntax. + + + + + Represents subsystem version, see /subsystemversion command line + option for details and valid values. + + The following table lists common subsystem versions of Windows. + + Windows version Subsystem version + - Windows 2000 5.00 + - Windows XP 5.01 + - Windows Vista 6.00 + - Windows 7 6.01 + - Windows 8 Release Preview 6.02 + + + + + Major subsystem version + + + + + Minor subsystem version + + + + + Subsystem version not specified + + + + + Subsystem version: Windows 2000 + + + + + Subsystem version: Windows XP + + + + + Subsystem version: Windows Vista + + + + + Subsystem version: Windows 7 + + + + + Subsystem version: Windows 8 + + + + + Try parse subsystem version in "x.y" format. Note, no spaces are allowed in string representation. + + String to parse + the value if successfully parsed or None otherwise + true if parsed successfully, false otherwise + + + + Create a new instance of subsystem version with specified major and minor values. + + major subsystem version + minor subsystem version + subsystem version with provided major and minor + + + + Subsystem version default for the specified output kind and platform combination + + Output kind + Platform + Subsystem version + + + + True if the subsystem version has a valid value + + + + + Indicate what kinds of declaration symbols will be included + + + + + None + + + + + include namespace symbols + + + + + include type symbols + + + + + include member symbols such as method, event, property, field + + + + + include type and member + + + + + include all namespace, type and member + + + + + Array of potential candidate symbols if did not bind successfully. Note: all code in + this type should prefer referencing instead of this so that they uniformly + only see an non- array. + + + + + The symbol that was referred to by the syntax node, if any. Returns null if the given expression did not + bind successfully to a single symbol. If null is returned, it may still be that case that we have one or + more "best guesses" as to what symbol was intended. These best guesses are available via the property. + + + + + If the expression did not successfully resolve to a symbol, but there were one or more symbols that may have + been considered but discarded, this property returns those symbols. The reason that the symbols did not + successfully resolve to a symbol are available in the property. For example, + if the symbol was inaccessible, ambiguous, or used in the wrong context. + + Will never return a array. + + + + If the expression did not successfully resolve to a symbol, but there were one or more symbols that may have + been considered but discarded, this property describes why those symbol or symbols were not considered + suitable. + + + + + Get whether the given tree is generated. + + + + + Get diagnostic severity setting for a given diagnostic identifier in a given tree. + + + + + Get diagnostic severity set globally for a given diagnostic identifier + + + + + The type of the expression represented by the syntax node. For expressions that do not + have a type, null is returned. If the type could not be determined due to an error, then + an IErrorTypeSymbol is returned. + + + + + The top-level nullability information of the expression represented by the syntax node. + + + + + The type of the expression after it has undergone an implicit conversion. If the type + did not undergo an implicit conversion, returns the same as Type. + + + + + The top-level nullability of the expression after it has undergone an implicit conversion. + For most expressions, this will be the same as the type. It can change in situations such + as implicit user-defined conversions that have a nullable return type. + + + + + Resolves references to XML documents specified in source code. + + + + + Resolves specified XML reference with respect to base file path. + + The reference path to resolve. May be absolute or relative path. + Path of the source file that contains the (may also be relative), or null if not available. + Path to the XML artifact, or null if the file can't be resolved. + + + + Opens a that allows reading the content of the specified file. + + Path returned by . + is null. + is not a valid absolute path. + Error reading file . See for details. + + + + The IEEE floating-point spec doesn't specify which bit pattern an implementation + is required to use when producing NaN values. Indeed, the spec does recommend + "diagnostic" information "left to the implementer’s discretion" be placed in the + undefined bits. It is therefore likely that NaNs produced on different platforms + will differ even for the same arithmetic such as 0.0 / 0.0. To ensure that the + compiler behaves in a deterministic way, we force NaN values to use the + IEEE "canonical" form with the diagnostic bits set to zero and the sign bit set + to one. Conversion of this value to float produces the corresponding + canonical NaN of the float type (IEEE Std 754-2008 section 6.2.3). + + + + + Some string constant values can have large costs to realize. To compensate, we realize + constant values lazily, and hold onto a weak reference. If the next time we're asked for the constant + value the previous one still exists, we can avoid rerealizing it. But we don't want to root the constant + value if it's not being used. + + + + + Parses .RES a file into its constituent resource elements. + Mostly translated from cvtres.cpp. + + + + + Assume that 3 WORDs preceded this string and that they began 32-bit aligned. + Given the string length compute the number of bytes that should be written to end + the buffer on a 32-bit boundary + + + + + + assuming the length of bytes submitted began on a 32-bit boundary, + round up this length as necessary so that it ends at a 32-bit boundary. + + + + + + + compute number of chars needed to end up on a 32-bit boundary assuming that three + WORDS preceded this string. + + + + + + + Hash algorithms supported by the debugger used for source file checksums stored in the PDB. + + + + + Constants for producing and consuming streams of binary custom debug info. + + + + More than records added. + + + + The kinds of custom debug info in Windows PDBs that we know how to interpret. + The values correspond to possible values of the "kind" byte + in the record header. + + + + + C# only. Encodes the sizes of using groups that are applicable to the method. + The actual import strings are stored separately trhu ISymUnmanagedWriter.UsingNamespace. + + + Represented by using XML node in PDB tests. + + + + + C# only. Indicates that per-method debug information (import strings) is stored on another method, + whose token is specified. + + + Represented by forward XML node in PDB tests. + + + + + C# only. Indicates that per-module debug information (assembly reference aliases) is stored on another method, + whose token is specified. + + + Represented by forwardToModule XML node in PDB tests. + + + + + C# only. Specifies local scopes for state machine hoisted local variables. + + + Represented by hoistedLocalScopes XML node in PDB tests. + Equivalent to in Portable PDB. + + + + + C# and VB. The name of the state machine type. Emitted for async and iterator kick-off methods. + + + Represented by forwardIterator XML node in PDB tests. + + + + + C# only. Dynamic flags for local variables and constants. + + + Represented by dynamicLocals XML node in PDB tests. + Equivalent to in Portable PDB. + + + + + C# and VB. Encodes EnC local variable slot map. + See https://github.com/dotnet/corefx/blob/main/src/System.Reflection.Metadata/specs/PortablePdb-Metadata.md#EditAndContinueLocalSlotMap. + + + Represented by encLocalSlotMap XML node in PDB tests. + Equivalent to in Portable PDB. + + + + + C# and VB. Encodes EnC lambda map. + See https://github.com/dotnet/corefx/blob/main/src/System.Reflection.Metadata/specs/PortablePdb-Metadata.md#EditAndContinueLambdaAndClosureMap. + + + Represented by encLambdaMap XML node in PDB tests. + Equivalent to in Portable PDB. + + + + + C# and VB. Tuple element names for local variables and constants. + + + Represented by tupleElementNames XML node in PDB tests. + Equivalent to in Portable PDB. + + + + + C# and VB. Syntax offsets of nodes associated with state machine states in an async/iterator method and their corresponding state numbers. + + + Represented by encStateMachineStateMap XML node in PDB tests. + Equivalent to in Portable PDB. + + + + + A collection of utility method for consuming custom debug info from a PDB. + + + This is not a public API, so we're just going to let bad offsets fail on their own. + + + + + This is the first header in the custom debug info blob. + + + + + After the global header (see comes list of custom debug info record. + Each record begins with a standard header. + + + + + + + + Exposed for . + + + + + + For each namespace declaration enclosing a method (innermost-to-outermost), there is a count + of the number of imports in that declaration. + + + There's always at least one entry (for the global namespace). + Exposed for . + + + + + This indicates that further information can be obtained by looking at the custom debug + info of another method (specified by token). + + + Appears when multiple method would otherwise have identical using records (see ). + Exposed for . + + + + + This indicates that further information can be obtained by looking at the custom debug + info of another method (specified by token). + + + Appears when there are extern aliases and edit-and-continue is disabled. + Exposed for . + + + + + Scopes of state machine hoisted local variables. + + + Exposed for . + + + + + Indicates that this method is the iterator state machine for the method named in the record. + + + Appears when are iterator methods. + Exposed for . + + + + + Does for locals what System.Runtime.CompilerServices.DynamicAttribute does for parameters, return types, and fields. + In particular, indicates which occurrences of in the signature are really dynamic. + + + Appears when there are dynamic locals. + Exposed for . + + Bad data. + + + + Tuple element names for locals. + + + + + Get the import strings for a given method, following forward pointers as necessary. + + + For each namespace enclosing the method, a list of import strings, innermost to outermost. + There should always be at least one entry, for the global namespace. + + + + + Get the import strings for a given method, following forward pointers as necessary. + + + A list of import strings. There should always be at least one entry, for the global namespace. + + + + + Parse a string representing a C# using (or extern alias) directive. + + + + "AS USystem" -> + "AC TSystem.Console" -> + "AS ESystem alias" -> + "XOldLib" -> + "ZOldLib assembly" -> + "ESystem alias" -> + "TSystem.Math" -> + ]]> + + + + + Parse a string representing a VB import statement. + + is null. + Format of is not valid. + + + + Read UTF-8 string with null terminator. + + + + + C# or VB namespace import. + + + + + C# or VB type import. + + + + + VB namespace or type alias target (not specified). + + + + + C# extern alias. + + + + + VB XML import. + + + + + VB forwarding information (i.e. another method has the imports for this one). + + + + + VB containing namespace (not an import). + + + + + VB root namespace (not an import). + + + + + A kind that is no longer used. + + + + + The offset of the first operation in the scope. + + + + + The offset of the first operation outside of the scope, or the method body length. + If zero then is also zero and the slot represents a synthesized local. + + + + + Policy to be used when matching assembly reference to an assembly definition across platforms. + + + + + Converts to . + + Major, minor, build or revision number are less than 0 or greater than 0xFFFF. + + + Assembly portability policy, usually provided through an app.config file. + + + + Loads information from XML with app.config schema. + + The stream doesn't contain a well formed XML. + is null. + + Tries to find supportPortability elements in the given XML: + + + + + + + + + ]]> + + Keeps the stream open. + + + + + Returns true if the identity is a Framework 4.5 or lower assembly. + + + + + Represents a non source code file. + + + + + Path to the text. + + + + + Returns a with the contents of this file, or null if + there were errors reading the file. + + + + + this hold onto analyzer executor context which will be used later to put context information in analyzer exception if it occurs. + + + + + Stores the results of analyzer execution: + 1. Local and non-local diagnostics, per-analyzer. + 2. Analyzer execution times, if requested. + + + + + Analyzers corresponding to this analysis result. + + + + + Syntax diagnostics reported by the . + + + + + Semantic diagnostics reported by the . + + + + + Diagnostics in additional files reported by the . + + + + + Compilation diagnostics reported by the . + + + + + Analyzer telemetry info (register action counts and execution times). + + + + + Gets all the diagnostics reported by the given . + + + + + Gets all the diagnostics reported by all the . + + + + + Stores the results of analyzer execution: + 1. Local and non-local diagnostics, per-analyzer. + 2. Analyzer execution times, if requested. + + + + + Scope for analyzer execution. + This scope could either be the entire compilation for all analyzers (command line build) or + could be scoped to a specific tree/span and/or a subset of analyzers (CompilationWithAnalyzers). + + + + + Syntax trees on which we need to perform syntax analysis. + + + + + Non-source files on which we need to perform analysis. + + + + + True if we need to categorize diagnostics into local and non-local diagnostics and track the analyzer reporting each diagnostic. + + + + + True if we need to perform only syntax analysis for a single source or additional file. + + + + + True if we need to perform analysis for a single source or additional file. + + + + + Flag indicating if this is a partial analysis for the corresponding , + i.e. is true and/or is a subset of . + + + + + Stores the partial analysis state for analyzers executed on a specific compilation. + + + Stores the current partial analysis state for an analyzer. + + + + + Stores the partial analysis state for a specific event/symbol/tree for a specific analyzer. + + + + + Current state of analysis. + + + + + Set of completed actions. + + + + + Resets the from to . + This method must be invoked after successful analysis completion AND on analysis cancellation. + + + + + Per-analyzer analysis state map. + The integer value points to the index within the array. + + + + + Per-analyzer analysis state. + + + + + Compilation events corresponding to source tree, that are not completely processed for all analyzers. + Events are dropped as and when they are fully processed by all analyzers. + + + + + Compilation events corresponding to the compilation (compilation start and completed events), that are not completely processed for all analyzers. + + + + + Action counts per-analyzer. + + + + + Invoke this method at completion of event processing for the given analyzers. + It updates the analysis state of this event for each analyzer and if the event has been fully processed for all analyzers, then removes it from our event cache. + + + + + Gets pending events for given set of analyzers for the given syntax tree. + + + + + Gets pending events for given set of analyzers for the given syntax tree. + + + + + Gets all pending events for given set of analyzers. + + + Indicates if source events (symbol declared, compilation unit completed event) should be included. + Indicates if compilation wide events (compilation started and completed event) should be included. + Cancellation token. + + + + Returns true if we have any pending syntax analysis for given analysis scope. + + + + + Returns true if we have any pending symbol analysis for given analysis scope. + + + + + Attempts to start processing a compilation event for the given analyzer. + + + Returns false if the event has already been processed for the analyzer OR is currently being processed by another task. + If true, then it returns a non-null representing partial analysis state for the given event for the given analyzer. + + + + + Marks the given event as fully analyzed for the given analyzer. + + + + + Marks the given event as fully analyzed for the given analyzers. + + + + + Marks the given event as fully analyzed for the unprocessed analyzers in the given analysisScope. + + + + + Checks if the given event has been fully analyzed for the given analyzer. + + + + + Attempts to start processing a symbol for the given analyzer's symbol actions. + + + Returns false if the symbol has already been processed for the analyzer OR is currently being processed by another task. + If true, then it returns a non-null representing partial analysis state for the given symbol for the given analyzer. + + + + + Attempts to start executing a symbol's end actions for the given analyzer. + + + Returns false if the symbol end actions have already been executed for the analyzer OR are currently being executed by another task. + If true, then it returns a non-null representing partial analysis state for the given symbol end actions for the given analyzer. + + + + + Marks the given symbol as fully analyzed for the given analyzer. + + + + + Marks the given symbol as fully analyzed for the unprocessed analyzers in the given analysisScope. + + + + + True if the given symbol is fully analyzed for the given analyzer. + + + + + Marks the given symbol end actions as fully executed for the given analyzers. + + + + + Marks the given symbol end actions as fully executed for the given analyzer. + + + + + True if the given symbol end analysis is complete for the given analyzer. + + + + + Attempts to start processing a symbol declaration for the given analyzer's syntax node and code block actions. + + + Returns false if the declaration has already been processed for the analyzer OR is currently being processed by another task. + If true, then it returns a non-null representing partial analysis state for the given declaration for the given analyzer. + + + + + True if the given symbol declaration is fully analyzed for all the analyzers. + + + + + True if the given symbol declaration is fully analyzed for the given analyzer. + + + + + Marks the given symbol declaration as fully analyzed for the given analyzer. + + + + + Marks the given symbol declaration as fully analyzed for the given analyzers. + + + + + Marks all the symbol declarations for the given symbol as fully analyzed for all the given analyzers. + + + + + Attempts to start processing a syntax tree or additional file for the given analyzer's syntax tree or additional file actions respectively. + + + Returns false if the file has already been processed for the analyzer OR is currently being processed by another task. + If true, then it returns a non-null representing partial syntax analysis state for the given tree for the given analyzer. + + + + + Marks the given file as fully syntactically analyzed for the given analyzer. + + + + + Marks the given file as fully syntactically analyzed for the given analyzers. + + + + + Marks the given file as fully syntactically analyzed for the unprocessed analyzers in the given analysisScope. + + + + + State kind of per-analyzer tracking an analyzer's partial analysis state. + An analysis state object can be in one of the following states: + 1. Completely unprocessed: + 2. Currently being processed: + 3. Partially processed by one or more older requests that was either completed or cancelled: + 4. Fully processed: . + + + + + Ready for processing. + Indicates it is either completely unprocessed or partially processed by one or more older requests that was either completed or cancelled. + + + + + Currently being processed. + + + + + Fully processed. + + + + + Stores the partial analysis state for a specific symbol declaration for a specific analyzer. + + + + + Partial analysis state for code block actions executed on the declaration. + + + + + Partial analysis state for operation block actions executed on the declaration. + + NOTE: This state tracks operations actions registered inside operation block start context. + Operation actions registered outside operation block start context are tracked + with . + + + + + Partial analysis state for operation actions executed on the declaration. + + NOTE: This state tracks operations actions registered outside of operation block start context. + Operation actions registered inside operation block start context are tracked + with . + + + + + Stores the partial analysis state for syntax node actions executed on the declaration. + + + + + Stores the partial analysis state for operation actions executed on the declaration. + + + + + Stores the partial analysis state for code block actions or operation block actions executed on the declaration. + + + + + Stores the partial analysis state for code block actions executed on the declaration. + + + + + Stores the partial analysis state for operation block actions executed on the declaration. + + + + + Contains the counts of registered actions for an analyzer. + + + + + Count of registered compilation start actions. + + + + + Count of registered compilation end actions. + + + + + Count of registered compilation actions. + + + + + Count of registered syntax tree actions. + + + + + Count of registered additional file actions. + + + + + Count of registered semantic model actions. + + + + + Count of registered symbol actions. + + + + + Count of registered symbol start actions. + + + + + Count of registered symbol end actions. + + + + + Count of registered syntax node actions. + + + + + Count of code block start actions. + + + + + Count of code block end actions. + + + + + Count of code block actions. + + + + + Count of Operation actions. + + + + + Count of Operation block start actions. + + + + + Count of Operation block end actions. + + + + + Count of Operation block actions. + + + + + Returns true if there are any actions that need to run on executable code. + + + + + Gets a value indicating whether the analyzer supports concurrent execution. + + + + + Contains telemetry info for a specific analyzer, such as count of registered actions, the total execution time, etc. + + + + + Count of registered compilation start actions. + + + + + Count of registered compilation end actions. + + + + + Count of registered compilation actions. + + + + + Count of registered syntax tree actions. + + + + + Count of registered additional file actions. + + + + + Count of registered semantic model actions. + + + + + Count of registered symbol actions. + + + + + Count of registered symbol start actions. + + + + + Count of registered symbol end actions. + + + + + Count of registered syntax node actions. + + + + + Count of registered code block start actions. + + + + + Count of registered code block end actions. + + + + + Count of registered code block actions. + + + + + Count of registered operation actions. + + + + + Count of registered operation block start actions. + + + + + Count of registered operation block end actions. + + + + + Count of registered operation block actions. + + + + + Count of registered suppression actions. + This is the same as count of s as each suppressor + has a single suppression action, i.e. . + + + + + Total execution time. + + + + + Gets a value indicating whether the analyzer supports concurrent execution. + + + + + Create telemetry info for a specific analyzer, such as count of registered actions, the total execution time, etc. + + + + + Comparer that should be used for all analyzer config keys. This is a case-insensitive comparison based + on Unicode case sensitivity rules for identifiers. + + + + + Get an analyzer config value for the given key, using the . + + + + + Enumerates unique keys of all available options in no specific order. + + Not implemented by the derived type. + + + + Provide options from an analyzer config file keyed on a source file. + + + + + Gets global options that do not apply to any specific file + + + + + Get options for a given . + + + + + Get options for a given + + + + + Driver to execute diagnostic analyzers for a given compilation. + It uses a of s to drive its analysis. + + + + + Stores for symbols declared in the compilation. + This allows us to avoid recomputing this data across analyzer execution for different analyzers + on the same symbols. This cached compilation data is strongly held by the associated + object. + + + + + Set of diagnostic suppressions that are suppressed via analyzer suppression actions. + + + + + Set of diagnostics that have already been processed for application of programmatic suppressions. + + + + + Flag indicating if the include any + which can suppress reported analyzer/compiler diagnostics. + + + + + Filtered diagnostic severities in the compilation, i.e. diagnostics with effective severity from this set should not be reported. + PERF: If all supported diagnostics for an analyzer are from this set, we completely skip executing the analyzer. + + + + + Unsuppressed analyzers that need to be executed. + + + + + Cache of additional analyzer actions to be executed per symbol per analyzer, which are registered in symbol start actions. + We cache the tuple: + 1. myActions: analyzer actions registered in the symbol start actions of containing namespace/type, which are to be executed for this symbol + 2. childActions: analyzer actions registered in this symbol's start actions, which are to be executed for member symbols. + + + + + Default analysis mode for generated code. + + + This mode should always guarantee that analyzer action callbacks are enabled for generated code, i.e. is set. + However, the default diagnostic reporting mode is liable to change in future. + + + + + Map from non-concurrent analyzers to the gate guarding callback into the analyzer. + + + + + Map from analyzers to their setting. + + + + + The set of registered analyzer actions. + + + + + + Set of unsuppressed analyzers that report non-configurable diagnostics that cannot be suppressed with end user configuration. + + + + + Set of analyzers that have registered symbol start analyzer actions. + + + + + True if all analyzers need to analyze and report diagnostics in generated code - we can assume all code to be non-generated code. + + + + + True if no analyzer needs generated code analysis - we can skip all analysis on a generated code symbol/tree. + + + + + Lazily populated dictionary indicating whether a source file is a generated code file or not - we populate it lazily to avoid realizing all syntax trees in the compilation upfront. + + + + + Lazily populated dictionary from tree to declared symbols with GeneratedCodeAttribute. + + + + + Lazily populated dictionary from tree to analyzers that are suppressed on the entire tree. + + + + + Lazily populated dictionary from symbol to a bool indicating if it is a generated code symbol. + + + + + Lazily populated dictionary indicating whether a source file has any hidden regions - we populate it lazily to avoid realizing all syntax trees in the compilation upfront. + + + + + Symbol for . + + + + + Driver task which initializes all analyzers. + This task is initialized and executed only once at start of analysis. + + + + + Flag to indicate if the was successfully started. + + + + + Primary driver task which processes all events, runs analyzer actions and signals completion of at the end. + + + + + Number of worker tasks processing compilation events and executing analyzer actions. + + + + + Events queue for analyzer execution. + + + + + that is fed the diagnostics as they are computed. + + + + + Create an analyzer driver. + + The set of analyzers to include in the analysis + AnalyzerManager to manage analyzers for analyzer host's lifetime. + Filtered diagnostic severities in the compilation, i.e. diagnostics with effective severity from this set should not be reported. + Delegate to identify if the given trivia is a comment. + + + + Initializes the and related actions maps for the analyzer driver. + It kicks off the task for initialization. + Note: This method must be invoked exactly once on the driver. + + + + + Returns true if all analyzers need to analyze and report diagnostics in generated code - we can assume all code to be non-generated code. + + + + + Attaches a pre-populated event queue to the driver and processes all events in the queue. + + Compilation events to analyze. + Scope of analysis. + An optional object to track partial analysis state. + Cancellation token to abort analysis. + Driver must be initialized before invoking this method, i.e. method must have been invoked and must be non-null. + + + + Attaches event queue to the driver and start processing all events pertaining to the given analysis scope. + + Compilation events to analyze. + Scope of analysis. + Cancellation token to abort analysis. + Driver must be initialized before invoking this method, i.e. method must have been invoked and must be non-null. + + + + Create an and attach it to the given compilation. + + The compilation to which the new driver should be attached. + The set of analyzers to include in the analysis. + Options that are passed to analyzers. + AnalyzerManager to manage analyzers for the lifetime of analyzer host. + Delegate to add diagnostics generated for exceptions from third party analyzers. + Report additional information related to analyzers, such as analyzer execution time. + Filtered diagnostic severities in the compilation, i.e. diagnostics with effective severity from this set should not be reported. + The new compilation with the analyzer driver attached. + A cancellation token that can be used to abort analysis. + A newly created analyzer driver + + Note that since a compilation is immutable, the act of creating a driver and attaching it produces + a new compilation. Any further actions on the compilation should use the new compilation. + + + + + Returns all diagnostics computed by the analyzers since the last time this was invoked. + If has been completed with all compilation events, then it waits for + task for the driver to finish processing all events and generate remaining analyzer diagnostics. + + + + + Return a task that completes when the driver is initialized. + + + + + Return a task that completes when the driver is done producing diagnostics. + + + + + Tries to execute symbol action, symbol start/end actions and declaration actions for the given symbol. + + + indicating the current state of processing of the given compilation event. + + + + + Tries to execute symbol actions. + + + True, if successfully executed the actions for the given analysis scope OR no actions were required to be executed for the given analysis scope. + False, otherwise. + + + + + Tries to execute compilation unit actions. + + + True, if successfully executed the actions for the given analysis scope OR no actions were required to be executed for the given analysis scope. + False, otherwise. + + + + + Tries to execute compilation started actions. + + + True, if successfully executed the actions for the given analysis scope OR no actions were required to be executed for the given analysis scope. + False, otherwise. + + + + + Tries to execute compilation completed actions. + + + True, if successfully executed the actions for the given analysis scope OR no actions were required to be executed for the given analysis scope. + False, otherwise. + + + + + Tries to execute compilation actions. + + + True, if successfully executed the actions for the given analysis scope OR no actions were required to be executed for the given analysis scope. + False, otherwise. + + + + + Returns true if all the diagnostics that can be produced by this analyzer are suppressed through options. + + + + + GetSyntax() for the given SyntaxReference. + + + + + Topmost declaration node for analysis. + + + + + All member declarations within the declaration. + + + + + All descendant nodes for syntax node actions. + + + + + Flag indicating if this is a partial analysis. + + + + + Used to represent state of processing of a . + + + + + Subset of processed analyzers. + NOTE: This property is only non-null for . + + + + + Driver to execute diagnostic analyzers for a given compilation. + It uses a of s to drive its analysis. + + + + + Create an analyzer driver. + + The set of analyzers to include in the analysis + A delegate that returns the language-specific kind for a given syntax node + AnalyzerManager to manage analyzers for the lifetime of analyzer host. + Filtered diagnostic severities in the compilation, i.e. diagnostics with effective severity from this set should not be reported. + Delegate to identify if the given trivia is a comment. + + + + Tries to execute syntax node, code block and operation actions for all declarations for the given symbol. + + + True, if successfully executed the actions for the given analysis scope OR no actions were required to be executed for the given analysis scope. + False, otherwise. + + + + + Tries to execute syntax node, code block and operation actions for the given declaration. + + + True, if successfully executed the actions for the given analysis scope OR no actions were required to be executed for the given analysis scope. + False, otherwise. + + + + + grouped by , and possibly other entities, such as , , etc. + + + + + Contains the core execution logic for callbacks into analyzers. + + + + + Pooled object that carries the info needed to process + a reported diagnostic from a syntax node action. + + + + + The values in this map convert to using . + + + + + Creates to execute analyzer actions with given arguments + + Compilation to be used in the analysis. + Analyzer options. + Optional delegate to add non-categorized analyzer diagnostics. + + Delegate which is invoked when an analyzer throws an exception. + Delegate can do custom tasks such as report the given analyzer exception diagnostic, report a non-fatal watson for the exception, etc. + + + Optional delegate which is invoked when an analyzer throws an exception as an exception filter. + Delegate can do custom tasks such as crash hosting process to create a dump. + + Delegate to determine if the given analyzer is compiler analyzer. + We need to special case the compiler analyzer at few places for performance reasons. + Analyzer manager to fetch supported diagnostics. + + Delegate to fetch the gate object to guard all callbacks into the analyzer. + It should return a unique gate object for the given analyzer instance for non-concurrent analyzers, and null otherwise. + All analyzer callbacks for non-concurrent analyzers will be guarded with a lock on the gate. + + Delegate to get a semantic model for the given syntax tree which can be shared across analyzers. + Delegate to identify if analysis should be skipped on generated code. + Delegate to identify if diagnostic reported while analyzing generated code should be suppressed. + Delegate to identify if the given location is in generated code. + Delegate to identify if the given analyzer is suppressed for the given tree. + Flag indicating whether we need to log analyzer execution time. + Optional delegate to add categorized local analyzer diagnostics. + Optional delegate to add categorized non-local analyzer diagnostics. + Optional thread-safe delegate to add diagnostic suppressions from suppressors. + Cancellation token. + + + + Creates to fetch . + + + Optional delegate which is invoked when an analyzer throws an exception. + Delegate can do custom tasks such as report the given analyzer exception diagnostic, report a non-fatal watson for the exception, etc. + + Analyzer manager to fetch supported diagnostics. + Cancellation token. + + + + Executes the for the given analyzer. + + Analyzer to get session wide analyzer actions. + Session scope to store register session wide analyzer actions. + + Note that this API doesn't execute any registered by the Initialize invocation. + Use API + to get execute these actions to get the per-compilation analyzer actions. + + + + + Executes the compilation start actions. + + whose compilation start actions are to be executed. + Compilation scope to store the analyzer actions. + + + + Executes the symbol start actions. + + Symbol whose symbol start actions are to be executed. + Analyzer whose symbol start actions are to be executed. + whose symbol start actions are to be executed. + Symbol scope to store the analyzer actions. + Flag indicating if the symbol being analyzed is generated code. + + + + Executes the given diagnostic suppressor. + + Suppressor to be executed. + Reported analyzer/compiler diagnostics that can be suppressed. + + + + Tries to executes compilation actions or compilation end actions. + + Compilation actions to be executed. + Analyzer whose actions are to be executed. + Compilation event. + Scope for analyzer execution. + An optional object to track analysis state. + + True, if successfully executed the actions for the given analysis scope OR all the actions have already been executed for the given analysis scope. + False, if there are some pending actions that are currently being executed on another thread. + + + + + Tries to execute the symbol actions on the given symbol. + + Symbol actions to be executed. + Analyzer whose actions are to be executed. + Symbol event to be analyzed. + Delegate to get topmost declaration node for a symbol declaration reference. + Scope for analyzer execution. + An optional object to track analysis state. + Flag indicating if this is a generated code symbol. + + True, if successfully executed the actions for the given analysis scope OR all the actions have already been executed for the given analysis scope. + False, if there are some pending actions that are currently being executed on another thread. + + + + + Tries to execute the symbol end actions on the given namespace or type containing symbol for the process member symbol for the given analyzer. + + Symbol whose actions are to be executed. + Completed member symbol. + Analyzer whose actions are to be executed. + Delegate to get topmost declaration node for a symbol declaration reference. + Flag indicating if the containing symbol being analyzed is generated code. + An optional object to track analysis state. + + True, if successfully executed the actions for the given analysis scope OR all the actions have already been executed for the given analysis scope. + False, if there are some pending actions. + + + + + Tries to execute the symbol end actions on the given symbol for the given analyzer. + + Symbol actions to be executed. + Analyzer whose actions are to be executed. + Symbol event to be analyzed. + Delegate to get topmost declaration node for a symbol declaration reference. + Flag indicating if the symbol being analyzed is generated code. + An optional object to track analysis state. + + True, if successfully executed the actions for the given analysis scope OR all the actions have already been executed for the given analysis scope. + False, if there are some pending actions. + + + + + Tries to execute the semantic model actions on the given semantic model. + + Semantic model actions to be executed. + Analyzer whose actions are to be executed. + Semantic model to analyze. + Compilation event for semantic model analysis. + Scope for analyzer execution. + An optional object to track analysis state. + Flag indicating if the syntax tree being analyzed is generated code. + + True, if successfully executed the actions for the given analysis scope OR all the actions have already been executed for the given analysis scope. + False, if there are some pending actions that are currently being executed on another thread. + + + + + Tries to execute the syntax tree actions on the given syntax tree. + + Syntax tree actions to be executed. + Analyzer whose actions are to be executed. + Syntax tree to analyze. + Scope for analyzer execution. + An optional object to track analysis state. + Flag indicating if the syntax tree being analyzed is generated code. + + True, if successfully executed the actions for the given analysis scope OR all the actions have already been executed for the given analysis scope. + False, if there are some pending actions that are currently being executed on another thread. + + + + + Tries to execute the additional file actions. + + Actions to be executed. + Analyzer whose actions are to be executed. + Additional file to analyze. + Scope for analyzer execution. + An optional object to track analysis state. + + True, if successfully executed the actions for the given analysis scope OR all the actions have already been executed for the given analysis scope. + False, if there are some pending actions that are currently being executed on another thread. + + + + + Tries to execute code block actions for the given analyzer for the given declaration. + + + True, if successfully executed the actions for the given analysis scope OR all the actions have already been executed for the given analysis scope. + False, if there are some pending actions that are currently being executed on another thread. + + + + + Tries to execute operation block actions for the given analyzer for the given declaration. + + + True, if successfully executed the actions for the given analysis scope OR all the actions have already been executed for the given analysis scope. + False, if there are some pending actions that are currently being executed on another thread. + + + + + Tries to execute syntax node actions for the given analyzer for the given declaration. + + + True, if successfully executed the actions for the given analysis scope OR all the actions have already been executed for the given analysis scope. + False, if there are some pending actions that are currently being executed on another thread. + + + + + Tries to execute operation actions for the given analyzer for the given declaration. + + + True, if successfully executed the actions for the given analysis scope OR all the actions have already been executed for the given analysis scope. + False, if there are some pending actions that are currently being executed on another thread. + + + + + Represents analyzers stored in an analyzer assembly file. + + + Analyzer are read from the file, owned by the reference, and doesn't change + since the reference is accessed until the reference object is garbage collected. + + If you need to manage the lifetime of the analyzer reference (and the file stream) explicitly use . + + + + + Creates an AnalyzerFileReference with the given and . + + Full path of the analyzer assembly. + Loader for obtaining the from the + + + + Adds the of defined in this assembly reference of given . + + + + + Adds the of defined in this assembly reference of given . + + + + + Opens the analyzer dll with the metadata reader and builds a map of language -> analyzer type names. + + The PE image format is invalid. + IO error reading the metadata. + + + + Represents an in-memory analyzer reference image. + + + + + If a specific analyzer failed to load the namespace-qualified name of its type, null otherwise. + + + + + Error message. + + + + + Error code. + + + + + Exception that was thrown while loading the analyzer. May be null. + + + + + If is , returns the compiler version referenced by the analyzer assembly. Otherwise, returns null. + + + + + Manages properties of analyzers (such as registered actions, supported diagnostics) for analyzer host's lifetime + and executes the callbacks into the analyzers. + + It ensures the following for the lifetime of analyzer host: + 1) is invoked only once per-analyzer. + 2) is invoked only once per-analyzer. + 3) registered during Initialize are invoked only once per-compilation per-analyzer and analyzer options. + + + + + Map from (symbol, analyzer) to count of its member symbols whose symbol declared events are not yet processed. + + + + + Symbol declared events for symbols with pending symbol end analysis for given analyzer. + + + + + Task to compute HostSessionStartAnalysisScope for session wide analyzer actions, i.e. AnalyzerActions registered by analyzer's Initialize method. + These are run only once per every analyzer. + + + + + Task to compute HostCompilationStartAnalysisScope for per-compilation analyzer actions, i.e. AnalyzerActions registered by analyzer's CompilationStartActions. + + + + + Task to compute HostSymbolStartAnalysisScope for per-symbol analyzer actions, i.e. AnalyzerActions registered by analyzer's SymbolStartActions. + + + + + Supported diagnostic descriptors for diagnostic analyzer, if any. + + + + + Supported suppression descriptors for diagnostic suppressor, if any. + + + + + Compute and exception handler for the given . + + + + + Get all the analyzer actions to execute for the given analyzer against a given compilation. + The returned actions include the actions registered during method as well as + the actions registered during for the given compilation. + + + + + Get the per-symbol analyzer actions to be executed by the given analyzer. + These are the actions registered during the various RegisterSymbolStartAction method invocations for the given symbol on different analysis contexts. + + + + + Returns true if the given analyzer has enabled concurrent execution by invoking . + + + + + Returns for the given analyzer. + If an analyzer hasn't configured generated code analysis, returns . + + + + + Return of given . + + + + + Return of given . + + + + + Returns true if all the diagnostics that can be produced by this analyzer are suppressed through options. + + + + + Options passed to . + + + + + A set of additional non-code text files that can be used by analyzers. + + + + + A set of options keyed to or . + + + + + Creates analyzer options to be passed to . + + A set of additional non-code text files that can be used by analyzers. + A set of per-tree options that can be used by analyzers. + + + + Creates analyzer options to be passed to . + + A set of additional non-code text files that can be used by analyzers. + + + + Returns analyzer options with the given . + + + + + Tries to get configured severity for the given + for the given from bulk configuration analyzer config options, i.e. + 'dotnet_analyzer_diagnostic.category-%RuleCategory%.severity = %severity%' + or + 'dotnet_analyzer_diagnostic.severity = %severity%' + + + + + Represents an analyzer assembly reference that contains diagnostic analyzers. + + + Represents a logical location of the analyzer reference, not the content of the reference. + The content might change in time. A snapshot is taken when the compiler queries the reference for its analyzers. + + + + + Full path describing the location of the analyzer reference, or null if the reference has no location. + + + + + Path or name used in error messages to identity the reference. + + + Should not be null. + + + + + A unique identifier for this analyzer reference. + + + Should not be null. + Note that this and serve different purposes. An analyzer reference may not + have a path, but it always has an ID. Further, two analyzer references with different paths may + represent two copies of the same analyzer, in which case the IDs should also be the same. + + + + + Gets all the diagnostic analyzers defined in this assembly reference, irrespective of the language supported by the analyzer. + Use this method only if you need all the analyzers defined in the assembly, without a language context. + In most instances, either the analyzer reference is associated with a project or is being queried for analyzers in a particular language context. + If so, use method. + + + + + Gets all the diagnostic analyzers defined in this assembly reference for the given . + + Language name. + + + + Gets all the source generators defined in this assembly reference. + + + + + Gets all the generators defined in this assembly reference for the given . + + Language name. + + + + A queue whose enqueue and dequeue operations can be performed in parallel. + + The type of values kept by the queue. + + + + The number of unconsumed elements in the queue. + + + + + Adds an element to the tail of the queue. This method will throw if the queue + is completed. + + The queue is already completed. + The value to add. + + + + Tries to add an element to the tail of the queue. This method will return false if the queue + is completed. + + The value to add. + + + + Attempts to dequeue an existing item and return whether or not it was available. + + + + + Gets a value indicating whether the queue has completed. + + + + + Signals that no further elements will be enqueued. All outstanding and future + Dequeue Task will be cancelled. + + The queue is already completed. + + + + Same operation as except it will not + throw if the queue is already completed. + + Whether or not the operation succeeded. + + + + Gets a task that transitions to a completed state when or + is called. This transition will not happen synchronously. + + This Task will not complete until it has completed all existing values returned + from . + + + + + Gets a task whose result is the element at the head of the queue. If the queue + is empty, the returned task waits for an element to be enqueued. If + is called before an element becomes available, the returned task is cancelled. + + + + + Gets a task whose result is the element at the head of the queue. If the queue + is empty, the returned task waits for an element to be enqueued. If + is called before an element becomes available, the returned task is completed and + will be . + + + + + Cancels a if a given is canceled. + + The type of value returned by a successfully completed . + The to cancel. + The . + + + + + A state object for tracking cancellation and a TaskCompletionSource. + + The type of value returned from a task. + + We use this class so that we only allocate one object to support all continuations + required for cancellation handling, rather than a special closure and delegate for each one. + + + + + + Initializes a new instance of the class. + + The task completion source. + The cancellation token. + + + + Gets the cancellation token. + + + + + Gets the Task completion source. + + + + + Gets or sets the cancellation token registration. + + + + + Provider that caches semantic models for requested trees, with a strong reference to the model. + Clients using this provider are responsible for maintaining the lifetime of the entries in this cache, + and should invoke and to clear entries when appropriate. + For example, uses this provider to ensure that semantic model instances + are shared between the compiler and analyzers for improved analyzer execution performance. The underlying + executing analyzers clears per-tree entries in the cache whenever a + has been processed, indicating all relevant analyzers have executed on the corresponding syntax tree for the event. + Similarly, it clears the entire compilation wide cache whenever a has been processed, + indicating all relevant analyzers have executed on the entire compilation. + + + + + Wrapper over the core which holds a strong reference to key-value pairs for the lifetime of a compilation that this provider is associated with. + This ensures that values are never re-computed for equivalent keys while analyzing each compilation, improving overall analyzer performance. + + + + + The last event placed into a compilation's event queue. + + + + + The first event placed into a compilation's event queue. + + + + + Optional filter span for a synthesized CompilationUnitCompletedEvent generated for span-based semantic diagnostic computation. + Such synthesized events are used primarily for performance improvements when running compiler analyzer in span-based mode in the IDE, + such as computing diagnostics for the lightbulb for the current line. + Note that such a synthesized CompilationUnitCompletedEvent with non-null FilterSpan is not a true + compilation unit completed event, but just a stub event to drive span-based semantic model action callbacks + for analyzer execution. This event will eventually be followed by a true CompilationUnitCompletedEvent + with null FilterSpan when the entire compilation unit has actually completed. + See https://github.com/dotnet/roslyn/issues/56843 for details. + + + + + Pool of s used for analyzer execution. + + + + + Contains the partial analysis state per-analyzer. It tracks: + 1. Global set of pending compilation events. This is used to populate the event queue for analyzer execution. + 2. Per-analyzer set of pending compilation events, symbols, declarations, etc. Each of these pending entities has a state object to track partial analysis. + + + + + Builder for storing current, possibly partial, analysis results: + 1. Diagnostics reported by analyzers. + 2. AnalyzerTelemetryInfo. + + + + + Set of exception diagnostics reported for exceptions thrown by the analyzers. + + + + + Lock to track the set of active tasks computing tree diagnostics and task computing compilation diagnostics. + + + + + Used to generate a unique token for each tree diagnostics request. + The token is used to determine the priority of each request. + Each new tree diagnostic request gets an incremented token value and has higher priority over other requests for the same tree. + Compilation diagnostics requests always have the lowest priority. + + + + + Map from active tasks computing tree diagnostics to their token number. + + + + + Pool of event queues to serve each diagnostics request. + + + + + Underlying with a non-null , used to drive analyzer execution. + + + + + Analyzers to execute on the compilation. + + + + + Options to configure analyzer execution. + + + + + An optional cancellation token which can be used to cancel analysis. + Note: This token is only used if the API invoked to get diagnostics doesn't provide a cancellation token. + + + + + Creates a new compilation by attaching diagnostic analyzers to an existing compilation. + + The original compilation. + The set of analyzers to include in future analyses. + Options that are passed to analyzers. + A cancellation token that can be used to abort analysis. + + + + Creates a new compilation by attaching diagnostic analyzers to an existing compilation. + + The original compilation. + The set of analyzers to include in future analyses. + Options to configure analyzer execution. + + + + Returns diagnostics produced by all . + + + + + Returns diagnostics produced by all . + + + + + Returns diagnostics produced by given . + + Analyzers whose diagnostics are required. All the given analyzers must be from the analyzers passed into the constructor of . + Cancellation token. + + + + Executes all and returns the corresponding with all diagnostics and telemetry info. + + + + + Executes the given and returns the corresponding with all diagnostics and telemetry info. + + Analyzers whose analysis results are required. All the given analyzers must be from the analyzers passed into the constructor of . + Cancellation token. + + + + Returns all diagnostics produced by compilation and by all . + + + + + Returns all diagnostics produced by compilation and by all . + + + + + Returns diagnostics produced by compilation actions of all . + + + + + Returns diagnostics produced by compilation actions of given . + + Analyzers whose diagnostics are required. All the given analyzers must be from the analyzers passed into the constructor of . + Cancellation token. + + + + Returns syntax diagnostics produced by all from analyzing the given . + Depending on analyzers' behavior, returned diagnostics can have locations outside the tree, + and some diagnostics that would be reported for the tree by an analysis of the complete compilation + can be absent. + + Syntax tree to analyze. + Cancellation token. + + + + Returns syntax diagnostics produced by given from analyzing the given . + Depending on analyzers' behavior, returned diagnostics can have locations outside the tree, + and some diagnostics that would be reported for the tree by an analysis of the complete compilation + can be absent. + + Syntax tree to analyze. + Analyzers whose diagnostics are required. All the given analyzers must be from the analyzers passed into the constructor of . + Cancellation token. + + + + Returns an populated with produced by all from analyzing the given . + Depending on analyzers' behavior, some diagnostics that would be reported for the tree by an analysis of the complete compilation can be absent. + + Syntax tree to analyze. + Cancellation token. + + + + Returns an populated with produced by given from analyzing the given . + Depending on analyzers' behavior, some diagnostics that would be reported for the tree by an analysis of the complete compilation can be absent. + + Syntax tree to analyze. + Analyzers whose diagnostics are required. All the given analyzers must be from the analyzers passed into the constructor of . + Cancellation token. + + + + Returns an populated with produced by all from analyzing the given additional . + The given must be part of for the for this CompilationWithAnalyzers instance. + Depending on analyzers' behavior, some diagnostics that would be reported for the file by an analysis of the complete compilation can be absent. + + Additional file to analyze. + Cancellation token. + + + + Returns an populated with produced by given from analyzing the given additional . + The given must be part of for the for this CompilationWithAnalyzers instance. + Depending on analyzers' behavior, some diagnostics that would be reported for the file by an analysis of the complete compilation can be absent. + + Additional file to analyze. + Analyzers whose diagnostics are required. All the given analyzers must be from the analyzers passed into the constructor of . + Cancellation token. + + + + Returns semantic diagnostics produced by all from analyzing the given , optionally scoped to a . + Depending on analyzers' behavior, some diagnostics that would be reported for the tree by an analysis of the complete compilation can be absent. + + Semantic model representing the syntax tree to analyze. + An optional span within the tree to scope analysis. + Cancellation token. + + + + Returns semantic diagnostics produced by the given from analyzing the given , optionally scoped to a . + Depending on analyzers' behavior, some diagnostics that would be reported for the tree by an analysis of the complete compilation can be absent. + + Semantic model representing the syntax tree to analyze. + An optional span within the tree to scope analysis. + Analyzers whose diagnostics are required. All the given analyzers must be from the analyzers passed into the constructor of . + Cancellation token. + + + + Returns an populated with produced by all from analyzing the given , optionally scoped to a . + Depending on analyzers' behavior, some diagnostics that would be reported for the tree by an analysis of the complete compilation can be absent. + + Semantic model representing the syntax tree to analyze. + An optional span within the tree to scope analysis. + Cancellation token. + + + + Returns an populated with produced by the given from analyzing the given , optionally scoped to a . + Depending on analyzers' behavior, some diagnostics that would be reported for the tree by an analysis of the complete compilation can be absent. + + Semantic model representing the syntax tree to analyze. + An optional span within the tree to scope analysis. + Analyzers whose diagnostics are required. All the given analyzers must be from the analyzers passed into the constructor of . + Cancellation token. + + + + Core method for executing analyzers. + + + + + Given a set of compiler or generated , returns the effective diagnostics after applying the below filters: + 1) specified for the given . + 2) specified for the given . + 3) Diagnostic suppression through applied . + 4) Pragma directives for the given . + + + + + Given a set of compiler or generated , returns the effective diagnostics after applying the below filters: + 1) specified for the given . + 2) specified for the given . + 3) Diagnostic suppression through applied . + 4) Pragma directives for the given . + + + + + Returns true if all the diagnostics that can be produced by this analyzer are suppressed through options. + + Analyzer to be checked for suppression. + Compilation options. + + Optional delegate which is invoked when an analyzer throws an exception. + Delegate can do custom tasks such as report the given analyzer exception diagnostic, report a non-fatal watson for the exception, etc. + + + + + This method should be invoked when the analyzer host is disposing off the given . + It clears the cached internal state (supported descriptors, registered actions, exception handlers, etc.) for analyzers. + + Analyzers whose state needs to be cleared. + + + + Gets telemetry info for the given analyzer, such as count of registered actions, the total execution time (if is true), etc. + + + + + Gets the count of registered actions for the analyzer. + + + + + Gets the execution time for the given analyzer. + + + + + Options to configure analyzer execution within . + + + + + Options passed to s. + + + + + An optional delegate to be invoked when an analyzer throws an exception. + + + + + An optional delegate to be invoked when an analyzer throws an exception as an exception filter. + + + + + Flag indicating whether analysis can be performed concurrently on multiple threads. + + + + + Flag indicating whether analyzer execution time should be logged. + + + + + Flag indicating whether analyzer diagnostics with should be reported. + + + + + Creates a new . + + Options that are passed to analyzers. + Action to invoke if an analyzer throws an exception. + Flag indicating whether analysis can be performed concurrently on multiple threads. + Flag indicating whether analyzer execution time should be logged. + + + + Creates a new . + + Options that are passed to analyzers. + Action to invoke if an analyzer throws an exception. + Flag indicating whether analysis can be performed concurrently on multiple threads. + Flag indicating whether analyzer execution time should be logged. + Flag indicating whether analyzer diagnostics with should be reported. + + + + Creates a new . + + Options that are passed to analyzers. + Action to invoke if an analyzer throws an exception. + Action to invoke if an analyzer throws an exception as an exception filter. + Flag indicating whether analysis can be performed concurrently on multiple threads. + Flag indicating whether analyzer execution time should be logged. + Flag indicating whether analyzer diagnostics with should be reported. + + + + DiagnosticAnalyzer for compiler's syntax/semantic/compilation diagnostics. + + + + + Per-compilation DiagnosticAnalyzer for compiler's syntax/semantic/compilation diagnostics. + + + + + Context for initializing an analyzer. + Analyzer initialization can use an to register actions to be executed at any of: + + + compilation start, + + + compilation end, + + + completion of parsing a code document, + + + completion of semantic analysis of a code document, + + + completion of semantic analysis of a symbol, + + + start of semantic analysis of a method body or an expression appearing outside a method body, + + + completion of semantic analysis of a method body or an expression appearing outside a method body, or + + + completion of semantic analysis of a syntax node. + + + + + + + Register an action to be executed at compilation start. + A compilation start action can register other actions and/or collect state information to be used in diagnostic analysis, + but cannot itself report any s. + + Action to be executed at compilation start. + + + + Register an action to be executed for a complete compilation. + A compilation action reports s about the . + + Action to be executed at compilation end. + + + + Register an action to be executed at completion of semantic analysis of a document, + which will operate on the of the document. A semantic model action + reports s about the model. + + Action to be executed for a document's . + + + + Register an action to be executed at completion of semantic analysis of an with an appropriate Kind. + A symbol action reports s about s. + + Action to be executed for an . + Action will be executed only if an 's Kind matches one of the values. + + + + Register an action to be executed at completion of semantic analysis of an with an appropriate Kind. + A symbol action reports s about s. + + Action to be executed for an . + Action will be executed only if an 's Kind matches one of the values. + + + + Register an action to be executed at start of semantic analysis of an and its members with an appropriate Kind. + + Action to be executed. + Action will be executed only if an 's Kind matches the given . + + + + Register an action to be executed at the start of semantic analysis of a method body or an expression appearing outside a method body. + A code block start action can register other actions and/or collect state information to be used in diagnostic analysis, + but cannot itself report any s. + + Enum type giving the syntax node kinds of the source language for which the action applies. + Action to be executed at the start of semantic analysis of a code block. + + + + Register an action to be executed after semantic analysis of a method body or an expression appearing outside a method body. + A code block action reports s about code blocks. + + Action to be executed for a code block. + + + + Register an action to be executed at completion of parsing of a code document. + A syntax tree action reports s about the of a document. + + Action to be executed at completion of parsing of a document. + + + + Register an action to be executed for each non-code document. + An additional file action reports s about the of a document. + + Action to be executed for each non-code document. + + + + Register an action to be executed at completion of semantic analysis of a with an appropriate Kind. + A syntax node action can report s about s, and can also collect + state information to be used by other syntax node actions or code block end actions. + + Enum type giving the syntax node kinds of the source language for which the action applies. + Action to be executed at completion of semantic analysis of a . + Action will be executed only if a 's Kind matches one of the syntax kind values. + + + + Register an action to be executed at completion of semantic analysis of a with an appropriate Kind. + A syntax node action can report s about s, and can also collect + state information to be used by other syntax node actions or code block end actions. + + Enum type giving the syntax node kinds of the source language for which the action applies. + Action to be executed at completion of semantic analysis of a . + Action will be executed only if a 's Kind matches one of the syntax kind values. + + + + Register an action to be executed at the start of semantic analysis of a method body or an expression appearing outside a method body. + An operation block start action can register other actions and/or collect state information to be used in diagnostic analysis, + but cannot itself report any s. + + Action to be executed at the start of semantic analysis of an operation block. + + + + Register an action to be executed after semantic analysis of a method body or an expression appearing outside a method body. + An operation block action reports s about operation blocks. + + Action to be executed for an operation block. + + + + Register an action to be executed at completion of semantic analysis of an with an appropriate Kind. + An operation action can report s about s, and can also collect + state information to be used by other operation actions or code block end actions. + + Action to be executed at completion of semantic analysis of an . + Action will be executed only if an 's Kind matches one of the operation kind values. + + + + Register an action to be executed at completion of semantic analysis of an with an appropriate Kind. + An operation action can report s about s, and can also collect + state information to be used by other operation actions or code block end actions. + + Action to be executed at completion of semantic analysis of an . + Action will be executed only if an 's Kind matches one of the operation kind values. + + + + Enable concurrent execution of analyzer actions registered by this analyzer. + An analyzer that registers for concurrent execution can have better performance than a non-concurrent analyzer. + However, such an analyzer must ensure that its actions can execute correctly in parallel. + + + Even when an analyzer registers for concurrent execution, certain related actions are *never* executed concurrently. + For example, end actions registered on any analysis unit (compilation, code block, operation block, etc.) are by definition semantically dependent on analysis from non-end actions registered on the same analysis unit. + Hence, end actions are never executed concurrently with non-end actions operating on the same analysis unit. + + + + + Configure analysis mode of generated code for this analyzer. + Non-configured analyzers will default to an appropriate default mode for generated code. + It is recommended for the analyzer to invoke this API with the required setting. + + + + + Attempts to compute or get the cached value provided by the given for the given . + Note that the pair {, } acts as the key. + Reusing the same instance across analyzer actions and/or analyzer instances can improve the overall analyzer performance by avoiding recomputation of the values. + + The type of the value associated with the key. + for which the value is queried. + Provider that computes the underlying value. + Value associated with the key. + Returns true on success, false otherwise. + + + + Flags to configure mode of generated code analysis. + + + + + Disable analyzer action callbacks and diagnostic reporting for generated code. + Analyzer driver will not make callbacks into the analyzer for entities (source files, symbols, etc.) that it classifies as generated code. + Additionally, any diagnostic reported by the analyzer with location in generated code will not be reported. + + + + + Enable analyzer action callbacks for generated code. + Analyzer driver will make callbacks into the analyzer for all entities (source files, symbols, etc.) in the compilation, including generated code. + + + + + Enable reporting diagnostics on generated code. + Analyzer driver will not suppress any analyzer diagnostic based on whether or not it's location is in generated code. + + + + + Context for a compilation start action. + A compilation start action can use a to register actions to be executed at any of: + + + compilation end, + + + completion of parsing a code document, + + + completion of semantic analysis of a code document, + + + completion of semantic analysis of a symbol, + + + start of semantic analysis of a method body or an expression appearing outside a method body, + + + completion of semantic analysis of a method body or an expression appearing outside a method body, or + + + completion of semantic analysis of a syntax node. + + + + + + + that is the subject of the analysis. + + + + + Options specified for the analysis. + + + + + Token to check for requested cancellation of the analysis. + + + + + Register an action to be executed at compilation end. + A compilation end action reports s about the . + + Action to be executed at compilation end. + + + + Register an action to be executed at completion of semantic analysis of a document, + which will operate on the of the document. A semantic model action + reports s about the model. + + Action to be executed for a document's . + + + + Register an action to be executed at completion of semantic analysis of an with an appropriate Kind. + A symbol action reports s about s. + + Action to be executed for an . + Action will be executed only if an 's Kind matches one of the values. + + + + Register an action to be executed at completion of semantic analysis of an with an appropriate Kind. + A symbol action reports s about s. + + Action to be executed for an . + Action will be executed only if an 's Kind matches one of the values. + + + + Register an action to be executed at start of semantic analysis of an and its members with an appropriate Kind. + + Action to be executed. + Action will be executed only if an 's Kind matches the given . + + + + Register an action to be executed at the start of semantic analysis of a method body or an expression appearing outside a method body. + A code block start action can register other actions and/or collect state information to be used in diagnostic analysis, + but cannot itself report any s. + + Enum type giving the syntax node kinds of the source language for which the action applies. + Action to be executed at the start of semantic analysis of a code block. + + + + Register an action to be executed at the end of semantic analysis of a method body or an expression appearing outside a method body. + A code block action reports s about code blocks. + + Action to be executed for a code block. + + + + Register an action to be executed at the start of semantic analysis of a method body or an expression appearing outside a method body. + An operation block start action can register other actions and/or collect state information to be used in diagnostic analysis, + but cannot itself report any s. + + Action to be executed at the start of semantic analysis of an operation block. + + + + Register an action to be executed after semantic analysis of a method body or an expression appearing outside a method body. + An operation block action reports s about operation blocks. + + Action to be executed for an operation block. + + + + Register an action to be executed at completion of parsing of a code document. + A syntax tree action reports s about the of a document. + + Action to be executed at completion of parsing of a document. + + + + Register an action to be executed for each non-code document. + An additional file action reports s about the of a document. + + Action to be executed for each non-code document. + + + + Register an action to be executed at completion of semantic analysis of a with an appropriate Kind. + A syntax node action can report s about s, and can also collect + state information to be used by other syntax node actions or code block end actions. + + Enum type giving the syntax node kinds of the source language for which the action applies. + Action to be executed at completion of semantic analysis of a . + Action will be executed only if a 's Kind matches one of the syntax kind values. + + + + Register an action to be executed at completion of semantic analysis of a with an appropriate Kind. + A syntax node action can report s about s, and can also collect + state information to be used by other syntax node actions or code block end actions. + + Enum type giving the syntax node kinds of the source language for which the action applies. + Action to be executed at completion of semantic analysis of a . + Action will be executed only if a 's Kind matches one of the syntax kind values. + + + + Register an action to be executed at completion of semantic analysis of an with an appropriate Kind. + An operation action can report s about s, and can also collect + state information to be used by other operation actions or code block end actions. + + Action to be executed at completion of semantic analysis of an . + Action will be executed only if an 's Kind matches one of the operation kind values. + + + + Register an action to be executed at completion of semantic analysis of an with an appropriate Kind. + An operation action can report s about s, and can also collect + state information to be used by other operation actions or code block end actions. + + Action to be executed at completion of semantic analysis of an . + Action will be executed only if an 's Kind matches one of the operation kind values. + + + + Attempts to compute or get the cached value provided by the given for the given . + Note that the pair {, } acts as the key. + Reusing the same instance across analyzer actions and/or analyzer instances can improve the overall analyzer performance by avoiding recomputation of the values. + + The type of the value associated with the key. + for which the value is queried. + Provider that computes the underlying value. + Value associated with the key. + Returns true on success, false otherwise. + + + + Attempts to compute or get the cached value provided by the given for the given . + Note that the pair {, } acts as the key. + Reusing the same instance across analyzer actions and/or analyzer instances can improve the overall analyzer performance by avoiding recomputation of the values. + + The type of the value associated with the key. + instance for which the value is queried. + Provider that computes the underlying value. + Value associated with the key. + Returns true on success, false otherwise. + + + + Context for a compilation action or compilation end action. + A compilation action or compilation end action can use a to report s about a . + + + + + that is the subject of the analysis. + + + + + Options specified for the analysis. + + + + + Token to check for requested cancellation of the analysis. + + + + + Report a about a . + + to be reported. + + + + Attempts to compute or get the cached value provided by the given for the given . + Note that the pair {, } acts as the key. + Reusing the same instance across analyzer actions and/or analyzer instances can improve the overall analyzer performance by avoiding recomputation of the values. + + The type of the value associated with the key. + for which the value is queried. + Provider that computes the underlying value. + Value associated with the key. + Returns true on success, false otherwise. + + + + Attempts to compute or get the cached value provided by the given for the given . + Note that the pair {, } acts as the key. + Reusing the same instance across analyzer actions and/or analyzer instances can improve the overall analyzer performance by avoiding recomputation of the values. + + The type of the value associated with the key. + for which the value is queried. + Provider that computes the underlying value. + Value associated with the key. + Returns true on success, false otherwise. + + + + Context for a semantic model action. + A semantic model action operates on the of a code document, and can use a to report s about the model. + + + + + that is the subject of the analysis. + + + + + Options specified for the analysis. + + + + + Token to check for requested cancellation of the analysis. + + + + + Optional filter span for which to compute diagnostics. + + + + + Indicates if the underlying is generated code. + + + + + Report a about a . + + to be reported. + + + + Context for a symbol action. + A symbol action can use a to report s about an . + + + + + that is the subject of the analysis. + + + + + containing the . + + + + + Options specified for the analysis. + + + + + Token to check for requested cancellation of the analysis. + + + + + Indicates if the is generated code. + + + + + Report a about an . + + to be reported. + + + + Context for a symbol start action to analyze a symbol and its members. + A symbol start/end action can use a to report s about code within a and its members. + + + + + that is the subject of the analysis. + + + + + containing the . + + + + + Options specified for the analysis. + + + + + Indicates if the is generated code. + + + + + Token to check for requested cancellation of the analysis. + + + + + Register an action to be executed at end of semantic analysis of an and its members. + A symbol end action reports s about the code within a and its members. + + Action to be executed at compilation end. + + + + Register an action to be executed at the start of semantic analysis of a method body or an expression appearing outside a method body. + A code block start action can register other actions and/or collect state information to be used in diagnostic analysis, + but cannot itself report any s. + + Enum type giving the syntax node kinds of the source language for which the action applies. + Action to be executed at the start of semantic analysis of a code block. + + + + Register an action to be executed after semantic analysis of a method body or an expression appearing outside a method body. + A code block action reports s about code blocks. + + Action to be executed for a code block. + + + + Register an action to be executed at completion of semantic analysis of a with an appropriate Kind. + A syntax node action can report s about s, and can also collect + state information to be used by other syntax node actions or code block end actions. + + Enum type giving the syntax node kinds of the source language for which the action applies. + Action to be executed at completion of semantic analysis of a . + Action will be executed only if a 's Kind matches one of the syntax kind values. + + + + Register an action to be executed at completion of semantic analysis of a with an appropriate Kind. + A syntax node action can report s about s, and can also collect + state information to be used by other syntax node actions or code block end actions. + + Enum type giving the syntax node kinds of the source language for which the action applies. + Action to be executed at completion of semantic analysis of a . + Action will be executed only if a 's Kind matches one of the syntax kind values. + + + + Register an action to be executed at the start of semantic analysis of a method body or an expression appearing outside a method body. + An operation block start action can register other actions and/or collect state information to be used in diagnostic analysis, + but cannot itself report any s. + + Action to be executed at the start of semantic analysis of an operation block. + + + + Register an action to be executed after semantic analysis of a method body or an expression appearing outside a method body. + An operation block action reports s about operation blocks. + + Action to be executed for an operation block. + + + + Register an action to be executed at completion of semantic analysis of an with an appropriate Kind. + An operation action can report s about s, and can also collect + state information to be used by other operation actions or code block end actions. + + Action to be executed at completion of semantic analysis of an . + Action will be executed only if an 's Kind matches one of the operation kind values. + + + + Register an action to be executed at completion of semantic analysis of an with an appropriate Kind. + An operation action can report s about s, and can also collect + state information to be used by other operation actions or code block end actions. + + Action to be executed at completion of semantic analysis of an . + Action will be executed only if an 's Kind matches one of the operation kind values. + + + + Context for a code block start action. + A code block start action can use a to register actions to be executed + at any of: + + + completion of semantic analysis of a method body or an expression appearing outside a method body, or + + + completion of semantic analysis of a syntax node. + + + + + + + Method body or expression subject to analysis. + + + + + for which the code block provides a definition or value. + + + + + that can provide semantic information about the s in the code block. + + + + + Options specified for the analysis. + + + + + Indicates if the is generated code. + + + + + Token to check for requested cancellation of the analysis. + + + + + Register an action to be executed at the end of semantic analysis of a method body or an expression appearing outside a method body. + A code block end action reports s about code blocks. + + Action to be executed at the end of semantic analysis of a code block. + + + + Register an action to be executed at completion of semantic analysis of a with an appropriate Kind. + A syntax node action can report s about s, and can also collect + state information to be used by other syntax node actions or code block end actions. + + Action to be executed at completion of semantic analysis of a . + Action will be executed only if a 's Kind matches one of the syntax kind values. + + + + Register an action to be executed at completion of semantic analysis of a with an appropriate Kind. + A syntax node action can report s about s, and can also collect + state information to be used by other syntax node actions or code block end actions. + + Action to be executed at completion of semantic analysis of a . + Action will be executed only if a 's Kind matches one of the syntax kind values. + + + + Context for a code block action or code block end action. + A code block action or code block end action can use a to report s about a code block. + + + + + Code block that is the subject of the analysis. + + + + + for which the code block provides a definition or value. + + + + + that can provide semantic information about the s in the code block. + + + + + Options specified for the analysis. + + + + + Indicates if the is generated code. + + + + + Token to check for requested cancellation of the analysis. + + + + + Report a about a code block. + + to be reported. + + + + Context for an operation block start action. + An operation block start action can use an to register actions to be executed + at any of: + + + completion of semantic analysis of a method body or an expression appearing outside a method body, or + + + completion of semantic analysis of an operation. + + + + + + + One or more operation blocks that are the subject of the analysis. + This includes all blocks associated with the , + such as method body, field/property/constructor/parameter initializer(s), attributes, etc. + + Note that the operation blocks are not in any specific order. + + + + for which the provides a definition or value. + + + + + containing the . + + + + + Options specified for the analysis. + + + + + Indicates if the is generated code. + + + + + Token to check for requested cancellation of the analysis. + + + + + Register an action to be executed at the end of semantic analysis of a method body or an expression appearing outside a method body. + A code block end action reports s about code blocks. + + Action to be executed at the end of semantic analysis of a code block. + + + + Register an action to be executed at completion of semantic analysis of an operation with an appropriate Kind. + An operation action can report s about s, and can also collect + state information to be used by other operation actions or operation block end actions. + + Action to be executed at completion of semantic analysis of an . + Action will be executed only if an 's Kind matches one of the operation kind values. + + + + Register an action to be executed at completion of semantic analysis of an with an appropriate Kind. + An operation action can report s about s, and can also collect + state information to be used by other operation actions or operation block end actions. + + Action to be executed at completion of semantic analysis of an . + Action will be executed only if an 's Kind matches one of the operation kind values. + + + + Gets a for a given from this analysis context's . + + Operation block. + + + + Context for an operation block action or operation block end action. + An operation block action or operation block end action can use an to report s about an operation block. + + + + + One or more operation blocks that are the subject of the analysis. + This includes all blocks associated with the , + such as method body, field/property/constructor/parameter initializer(s), attributes, etc. + + Note that the operation blocks are not in any specific order. + + + + for which the provides a definition or value. + + + + + containing the . + + + + + Options specified for the analysis. + + + + + Indicates if the is generated code. + + + + + Token to check for requested cancellation of the analysis. + + + + + Report a about a code block. + + to be reported. + + + + Gets a for a given from this analysis context's . + + Operation block. + + + + Context for a syntax tree action. + A syntax tree action can use a to report s about a for a code document. + + + + + that is the subject of the analysis. + + + + + Options specified for the analysis. + + + + + Indicates if the is generated code. + + + + + Token to check for requested cancellation of the analysis. + + + + + Report a about a . + + to be reported. + + + + Context for an additional file action. + An additional file action can use an to report s about a non-source document. + + + + + that is the subject of the analysis. + + + + + Options specified for the analysis. + + + + + Token to check for requested cancellation of the analysis. + + + + + Compilation being analyzed. + + + + + Report a diagnostic for the given . + A diagnostic in a non-source document should be created with a non-source , + which can be created using API. + + + + + Context for a syntax node action. + A syntax node action can use a to report s for a . + + + + + that is the subject of the analysis. + + + + + for the declaration containing the syntax node. + + + + + that can provide semantic information about the . + + + + + containing the . + + + + + Options specified for the analysis. + + + + + Indicates if the is generated code. + + + + + Token to check for requested cancellation of the analysis. + + + + + Report a about a . + + to be reported. + + + + Context for an operation action. + An operation action can use an to report s for an . + + + + + that is the subject of the analysis. + + + + + for the declaration containing the operation. + + + + + containing the . + + + + + Options specified for the analysis. + + + + + Indicates if the is generated code. + + + + + Token to check for requested cancellation of the analysis. + + + + + Report a about a . + + to be reported. + + + + Gets a for the operation block containing the . + + + + + Context for suppressing analyzer and/or compiler non-error diagnostics reported for the compilation. + + + + + Analyzer and/or compiler non-error diagnostics reported for the compilation. + Each only receives diagnostics whose IDs were declared suppressible in its . + This may be a subset of the full set of reported diagnostics, as an optimization for + supporting incremental and partial analysis scenarios. + A diagnostic is considered suppressible by a DiagnosticSuppressor if *all* of the following conditions are met: + 1. Diagnostic is not already suppressed in source via pragma/suppress message attribute. + 2. Diagnostic's is not . + 3. Diagnostic is not tagged with custom tag. + + + + + for the context. + + + + + Options specified for the analysis. + + + + + Token to check for requested cancellation of the analysis. + + + + + Report a for a reported diagnostic. + + + + + Gets a for the given , which is shared across all analyzers. + + + + + The base type for diagnostic analyzers. + + + + + Returns a set of descriptors for the diagnostics that this analyzer is capable of producing. + + + + + Called once at session start to register actions in the analysis context. + + + + + + Place this attribute onto a type to cause it to be considered a diagnostic analyzer. + + + + + The source languages to which this analyzer applies. See . + + + + + Attribute constructor used to specify automatic application of a diagnostic analyzer. + + One language to which the analyzer applies. + Additional languages to which the analyzer applies. See . + + + + Returns a new compilation with attached diagnostic analyzers. + + Compilation to which analyzers are to be added. + The set of analyzers to include in future analyses. + Options that are passed to analyzers. + A cancellation token that can be used to abort analysis. + + + + Returns a new compilation with attached diagnostic analyzers. + + Compilation to which analyzers are to be added. + The set of analyzers to include in future analyses. + Options to configure analyzer execution within . + + + + Queue to store analyzer diagnostics on the . + + + + + Simple diagnostics queue: maintains all diagnostics reported by all analyzers in a single queue. + + + + + Categorized diagnostics queue: maintains separate set of simple diagnostic queues for local semantic, local syntax and non-local diagnostics for every analyzer. + + + + + Scope for setting up analyzers for an entire session, automatically associating actions with analyzers. + + + + + Scope for setting up analyzers for a compilation, automatically associating actions with analyzers. + + + + + Scope for setting up analyzers for code within a symbol and its members. + + + + + Scope for setting up analyzers for a code block, automatically associating actions with analyzers. + + + + + Scope for setting up analyzers for an operation block, automatically associating actions with analyzers. + + + + + Scope for setting up analyzers for an entire session, capable of retrieving the actions. + + + + + Scope for setting up analyzers for a compilation, capable of retrieving the actions. + + + + + Scope for setting up analyzers for analyzing a symbol and its members. + + + + + Scope for setting up analyzers for a code block, capable of retrieving the actions. + + + + + Actions registered by a particular analyzer. + + + + + Append analyzer actions from to actions from this instance. + + Analyzer actions to append. + + + + The base type for diagnostic suppressors that can programmatically suppress analyzer and/or compiler non-error diagnostics. + + + + + Returns a set of descriptors for the suppressions that this suppressor is capable of producing. + + + + + Suppress analyzer and/or compiler non-error diagnostics reported for the compilation. + This may be a subset of the full set of reported diagnostics, as an optimization for + supporting incremental and partial analysis scenarios. + A diagnostic is considered suppressible by a DiagnosticSuppressor if *all* of the following conditions are met: + 1. Diagnostic is not already suppressed in source via pragma/suppress message attribute. + 2. Diagnostic's is not . + 3. Diagnostic is not tagged with custom tag. + + + + + Represents a source file or an additional file. + For source files, is non-null and is null. + For additional files, is non-null and is null. + + + + + Provides custom values associated with instances using the given computeValue delegate. + + + + + Provides custom values associated with instances using the given . + + Delegate to compute the value associated with a given instance. + Optional equality comparer to determine equivalent instances that have the same value. + If no comparer is provided, then is used by default. + + + + Programmatic suppression of a by a . + + + + + Creates a suppression of a with the given . + + + Descriptor for the suppression, which must be from + for the creating this suppression. + + + to be suppressed, which must be from + for the suppression context in which this suppression is being created. + + + + Descriptor for this suppression. + + + + + Diagnostic suppressed by this suppression. + + + + + Attempts to resolve the "Target" argument of the global SuppressMessageAttribute to symbols in compilation. + + Indicates if resolved "Target" argument is in Roslyn's format. + Resolved symbols for the the "Target" argument of the global SuppressMessageAttribute. + + + + An event for each declaration in the program (namespace, type, method, field, parameter, etc). + Note that some symbols may have multiple declarations (namespaces, partial types) and may therefore + have multiple events. + + + + + Provides custom values associated with instances using the given computeValue delegate. + + + + + Provides values associated with instances using the given . + + Delegate to compute the value associated with a given instance. + Optional equality comparer to determine equivalent instances that have the same value. + If no comparer is provided, then is used by default. + + + + Represents an analyzer reference that can't be resolved. + + + For error reporting only, can't be used to reference an analyzer assembly. + + + + + Contains information about the source of a programmatic diagnostic suppression produced by an . + + + + + Represents a set of filtered diagnostic severities. + Currently, we only support filtering out Hidden and Info severities during build. + + + + + Contains information about the source of diagnostic suppression. + + + + + of the suppressed diagnostic. + + + + + If the diagnostic was suppressed by an attribute, then returns that attribute. + Otherwise, returns null. + + + + + The base implementation for . This type provides caching and tracking of inputs given + to . + + + This type generally assumes that files on disk aren't changing, since it ensure that two calls to + will always return the same thing, per that interface's contract. + + + + + Implemented by derived types to actually perform the load for an assembly that doesn't have a cached result. + + + + + Returns the cached assembly for fullPath if we've done a load for this path before, or calls if + it needs to be loaded. This method skips the check in release builds that the path is an absolute path, hence the "Unchecked" in the name. + + + + + When overridden in a derived class, allows substituting an assembly path after we've + identified the context to load an assembly in, but before the assembly is actually + loaded from disk. This is used to substitute out the original path with the shadow-copied version. + + + + +

Typically a user analyzer has a reference to the compiler and some of the compiler's + dependencies such as System.Collections.Immutable. For the analyzer to correctly + interoperate with the compiler that created it, we need to ensure that we always use the + compiler's version of a given assembly over the analyzer's version.

+ +

If we neglect to do this, then in the case where the user ships the compiler or its + dependencies in the analyzer's bin directory, we could end up loading a separate + instance of those assemblies in the process of loading the analyzer, which will surface + as a failure to load the analyzer.

+
+
+ + + Handles loading analyzer assemblies and their dependencies. + + Before an analyzer assembly is loaded with , + its location and the location of all of its dependencies must first be specified + by calls to . + + + To the extent possible, implementations should remain consistent in the face + of exceptions and allow the caller to handle them. This allows the caller to + decide how to surface issues to the user and whether or not they are fatal. For + example, if asked to load an a non-existent or inaccessible file a command line + tool may wish to exit immediately, while an IDE may wish to keep going and give + the user a chance to correct the issue. + + + + + Given the full path to an assembly on disk, loads and returns the + corresponding object. + + + Multiple calls with the same path should return the same + instance. + + is null. + is not a full path. + + + + Adds a file to consider when loading an analyzer or its dependencies. + + is null. + is not a full path. + + + + The base directory for shadow copies. Each instance of + gets its own + subdirectory under this directory. This is also the starting point + for scavenge operations. + + + + + The directory where this instance of + will shadow-copy assemblies, and the mutex created to mark that the owner of it is still active. + + + + + Used to generate unique names for per-assembly directories. Should be updated with . + + + + + Abstracts the ability to classify and load messages for error codes. Allows the error + infrastructure to be reused between C# and VB. + + + + + Caches the return values for . + + + + + Given an error code, get the severity (warning or error) of the code. + + + + + Load the message for the given error code. If the message contains + "fill-in" placeholders, those should be expressed in standard string.Format notation + and be in the string. + + + + + Get an optional localizable title for the given diagnostic code. + + + + + Get an optional localizable description for the given diagnostic code. + + + + + Get a localizable message format string for the given diagnostic code. + + + + + Get an optional help link for the given diagnostic code. + + + + + Get the diagnostic category for the given diagnostic code. + Default category is . + + + + + Get the text prefix (e.g., "CS" for C#) used on error messages. + + + + + Get the warning level for warnings (e.g., 1 or greater for C#). VB does not have warning + levels and always uses 1. Errors should return 0. + + + + + Type that defines error codes. For testing purposes only. + + + + + Create a simple language specific diagnostic for given error code. + + + + + Create a simple language specific diagnostic with no location for given info. + + + + + Create a simple language specific diagnostic for given error code. + + + + + Given a message identifier (e.g., CS0219), severity, warning as error and a culture, + get the entire prefix (e.g., "error CS0219: Warning as Error:" for C# or "error BC42024:" for VB) used on error messages. + + + + + Convert given symbol to string representation. + + + + + Given an error code (like 1234) return the identifier (CS1234 or BC1234). + + + + + Produces the filtering action for the diagnostic based on the options passed in. + + + A new with new effective severity based on the options or null if the + diagnostic has been suppressed. + + + + + Filter a based on the compilation options so that /nowarn and /warnaserror etc. take effect.options + + A with effective severity based on option or null if suppressed. + + + + Takes an exception produced while writing to a file stream and produces a diagnostic. + + + + + Represents a diagnostic, such as a compiler error or a warning, along with the location where it occurred. + + + A diagnostic (such as a compiler error or a warning), along with the location where it occurred. + + + + + The default warning level, which is also used for non-error diagnostics. + + + + + The warning level used for hidden and info diagnostics. Because these diagnostics interact with other editor features, we want them to always be produced unless /warn:0 is set. + + + + + The maximum warning level represented by a large value of 9999. + + + + + Creates a instance. + + A describing the diagnostic + An optional primary location of the diagnostic. If null, will return . + Arguments to the message of the diagnostic + The instance. + + + + Creates a instance. + + A describing the diagnostic. + An optional primary location of the diagnostic. If null, will return . + + An optional set of name-value pairs by means of which the analyzer that creates the diagnostic + can convey more detailed information to the fixer. If null, will return + . + + Arguments to the message of the diagnostic. + The instance. + + + + Creates a instance. + + A describing the diagnostic. + An optional primary location of the diagnostic. If null, will return . + + An optional set of additional locations related to the diagnostic. + Typically, these are locations of other items referenced in the message. + If null, will return an empty list. + + Arguments to the message of the diagnostic. + The instance. + + + + Creates a instance. + + A describing the diagnostic. + An optional primary location of the diagnostic. If null, will return . + + An optional set of additional locations related to the diagnostic. + Typically, these are locations of other items referenced in the message. + If null, will return an empty list. + + + An optional set of name-value pairs by means of which the analyzer that creates the diagnostic + can convey more detailed information to the fixer. If null, will return + . + + Arguments to the message of the diagnostic. + The instance. + + + + Creates a instance. + + A describing the diagnostic. + An optional primary location of the diagnostic. If null, will return . + Effective severity of the diagnostic. + + An optional set of additional locations related to the diagnostic. + Typically, these are locations of other items referenced in the message. + If null, will return an empty list. + + + An optional set of name-value pairs by means of which the analyzer that creates the diagnostic + can convey more detailed information to the fixer. If null, will return + . + + Arguments to the message of the diagnostic. + The instance. + + + + Creates a instance which is localizable. + + An identifier for the diagnostic. For diagnostics generated by the compiler, this will be a numeric code with a prefix such as "CS1001". + The category of the diagnostic. For diagnostics generated by the compiler, the category will be "Compiler". + The diagnostic message text. + The diagnostic's effective severity. + The diagnostic's default severity. + True if the diagnostic is enabled by default + The warning level, greater than 0 if severity is ; otherwise 0. + An optional short localizable title describing the diagnostic. + An optional longer localizable description for the diagnostic. + An optional hyperlink that provides more detailed information regarding the diagnostic. + An optional primary location of the diagnostic. If null, will return . + + An optional set of additional locations related to the diagnostic. + Typically, these are locations of other items referenced in the message. + If null, will return an empty list. + + + An optional set of custom tags for the diagnostic. See for some well known tags. + If null, will return an empty list. + + + An optional set of name-value pairs by means of which the analyzer that creates the diagnostic + can convey more detailed information to the fixer. If null, will return + . + + The instance. + + + + Creates a instance which is localizable. + + An identifier for the diagnostic. For diagnostics generated by the compiler, this will be a numeric code with a prefix such as "CS1001". + The category of the diagnostic. For diagnostics generated by the compiler, the category will be "Compiler". + The diagnostic message text. + The diagnostic's effective severity. + The diagnostic's default severity. + True if the diagnostic is enabled by default + The warning level, greater than 0 if severity is ; otherwise 0. + Flag indicating whether the diagnostic is suppressed by a source suppression. + An optional short localizable title describing the diagnostic. + An optional longer localizable description for the diagnostic. + An optional hyperlink that provides more detailed information regarding the diagnostic. + An optional primary location of the diagnostic. If null, will return . + + An optional set of additional locations related to the diagnostic. + Typically, these are locations of other items referenced in the message. + If null, will return an empty list. + + + An optional set of custom tags for the diagnostic. See for some well known tags. + If null, will return an empty list. + + + An optional set of name-value pairs by means of which the analyzer that creates the diagnostic + can convey more detailed information to the fixer. If null, will return + . + + The instance. + + + + Gets the diagnostic descriptor, which provides a description about a . + + + + + Gets the diagnostic identifier. For diagnostics generated by the compiler, this will be a numeric code with a prefix such as "CS1001". + + + + + Gets the category of diagnostic. For diagnostics generated by the compiler, the category will be "Compiler". + + + + + Get the culture specific text of the message. + + + + + Gets the default of the diagnostic's . + + + To get the effective severity of the diagnostic, use . + + + + + Gets the effective of the diagnostic. + + + To get the default severity of diagnostic's , use . + To determine if this is a warning treated as an error, use . + + + + + Gets the warning level. This is 0 for diagnostics with severity , + otherwise an integer greater than zero. + + + + + Returns true if the diagnostic has a source suppression, i.e. an attribute or a pragma suppression. + + + + + Gets the for suppressed diagnostics, i.e. = true. + Otherwise, returns null. + + + + + Returns true if this diagnostic is enabled by default by the author of the diagnostic. + + + + + Returns true if this is a warning treated as an error; otherwise false. + + + True implies = + and = . + + + + + Gets the primary location of the diagnostic, or if no primary location. + + + + + Gets an array of additional locations related to the diagnostic. + Typically these are the locations of other items referenced in the message. + + + + + Gets custom tags for the diagnostic. + + + + + Gets property bag for the diagnostic. it will return + if there is no entry. This can be used to put diagnostic specific information you want + to pass around. for example, to corresponding fixer. + + + + + Create a new instance of this diagnostic with the Location property changed. + + + + + Create a new instance of this diagnostic with the Severity property changed. + + + + + Create a new instance of this diagnostic with the suppression info changed. + + + + + Create a new instance of this diagnostic with the given programmatic suppression info. + + + + + Returns true if the diagnostic location (or any additional location) is within the given tree and intersects with the filterSpanWithinTree, if non-null. + + + + + Gets the default warning level for a diagnostic severity. Warning levels are used with the /warn:N + command line option to suppress diagnostics over a severity of interest. When N is 0, only error severity + messages are produced by the compiler. Values greater than 0 indicated that warnings up to and including + level N should also be included. + + + and are treated as warning + level 1. In other words, these diagnostics which typically interact with editor features are enabled unless + the special /warn:0 option is set. + + A value. + The default compiler warning level for . + + + + Returns true if a diagnostic is not configurable, i.e. cannot be suppressed or filtered or have its severity changed. + For example, compiler errors are always non-configurable. + + + + + Returns true if this is an error diagnostic which cannot be suppressed and is guaranteed to break the build. + Only diagnostics which have default severity error and are tagged as NotConfigurable fall in this bucket. + This includes all compiler error diagnostics and specific analyzer error diagnostics that are marked as not configurable by the analyzer author. + + + + + Returns true if this is a unsuppressed diagnostic with an effective error severity. + + + + + This type is attached to diagnostics for required language version and should only be used + on such diagnostics, as they are recognized by . + + + + + Represents a mutable bag of diagnostics. You can add diagnostics to the bag, + and also get all the diagnostics out of the bag (the bag implements + IEnumerable<Diagnostics>. Once added, diagnostics cannot be removed, and no ordering + is guaranteed. + + It is ok to Add diagnostics to the same bag concurrently on multiple threads. + It is NOT ok to Add concurrently with Clear or Free operations. + + The bag is optimized to be efficient when containing zero errors. + + + + Return true if the bag is completely empty - not even containing void diagnostics. + + + This exists for short-circuiting purposes. Use + to get a resolved Tuple(Of NamedTypeSymbol, ImmutableArray(Of Diagnostic)) (i.e. empty after eliminating void diagnostics). + + + + + Returns true if the bag has any diagnostics with DefaultSeverity=Error. Does not consider warnings or informationals + or warnings promoted to error via /warnaserror. + + + Resolves any lazy diagnostics in the bag. + + Generally, this should only be called by the creator (modulo pooling) of the bag (i.e. don't use bags to communicate - + if you need more info, pass more info). + + + + + Returns true if the bag has any non-lazy diagnostics with DefaultSeverity=Error. Does not consider warnings or informationals + or warnings promoted to error via /warnaserror. + + + Does not resolve any lazy diagnostics in the bag. + + Generally, this should only be called by the creator (modulo pooling) of the bag (i.e. don't use bags to communicate - + if you need more info, pass more info). + + + + + Add a diagnostic to the bag. + + + + + Add multiple diagnostics to the bag. + + + + + Add multiple diagnostics to the bag. + + + + + Add another DiagnosticBag to the bag. + + + + + Add another DiagnosticBag to the bag and free the argument. + + + + + Seal the bag so no further errors can be added, while clearing it and returning the old set of errors. + Return the bag to the pool. + + + + + Generally, this should only be called by the creator (modulo pooling) of the bag (i.e. don't use bags to communicate - + if you need more info, pass more info). + + + + + Using an iterator to avoid copying the list. If perf is a problem, + create an explicit enumerator type. + + + + + Get the underlying concurrent storage, creating it on demand if needed. + NOTE: Concurrent Adding to the bag is supported, but concurrent Clearing is not. + If one thread adds to the bug while another clears it, the scenario is + broken and we cannot do anything about it here. + + + + NOTE: Concurrent Adding to the bag is supported, but concurrent Clearing is not. + If one thread adds to the bug while another clears it, the scenario is + broken and we cannot do anything about it here. + + + + Provides a description about a + + + + + An unique identifier for the diagnostic. + + + + + A short localizable title describing the diagnostic. + + + + + An optional longer localizable description for the diagnostic. + + + + + An optional hyperlink that provides more detailed information regarding the diagnostic. + + + + + A localizable format message string, which can be passed as the first argument to when creating the diagnostic message with this descriptor. + + + + + + The category of the diagnostic (like Design, Naming etc.) + + + + + The default severity of the diagnostic. + + + + + Returns true if the diagnostic is enabled by default. + + + + + Custom tags for the diagnostic. + + + + + Create a DiagnosticDescriptor, which provides description about a . + NOTE: For localizable , and/or , + use constructor overload . + + A unique identifier for the diagnostic. For example, code analysis diagnostic ID "CA1001". + A short title describing the diagnostic. For example, for CA1001: "Types that own disposable fields should be disposable". + A format message string, which can be passed as the first argument to when creating the diagnostic message with this descriptor. + For example, for CA1001: "Implement IDisposable on '{0}' because it creates members of the following IDisposable types: '{1}'." + The category of the diagnostic (like Design, Naming etc.). For example, for CA1001: "Microsoft.Design". + Default severity of the diagnostic. + True if the diagnostic is enabled by default. + An optional longer description of the diagnostic. + An optional hyperlink that provides a more detailed description regarding the diagnostic. + Optional custom tags for the diagnostic. See for some well known tags. + + + + Create a DiagnosticDescriptor, which provides description about a . + + A unique identifier for the diagnostic. For example, code analysis diagnostic ID "CA1001". + A short localizable title describing the diagnostic. For example, for CA1001: "Types that own disposable fields should be disposable". + A localizable format message string, which can be passed as the first argument to when creating the diagnostic message with this descriptor. + For example, for CA1001: "Implement IDisposable on '{0}' because it creates members of the following IDisposable types: '{1}'." + The category of the diagnostic (like Design, Naming etc.). For example, for CA1001: "Microsoft.Design". + Default severity of the diagnostic. + True if the diagnostic is enabled by default. + An optional longer localizable description of the diagnostic. + An optional hyperlink that provides a more detailed description regarding the diagnostic. + Optional custom tags for the diagnostic. See for some well known tags. + Example descriptor for rule CA1001: + internal static DiagnosticDescriptor Rule = new DiagnosticDescriptor(RuleId, + new LocalizableResourceString(nameof(FxCopRulesResources.TypesThatOwnDisposableFieldsShouldBeDisposable), FxCopRulesResources.ResourceManager, typeof(FxCopRulesResources)), + new LocalizableResourceString(nameof(FxCopRulesResources.TypeOwnsDisposableFieldButIsNotDisposable), FxCopRulesResources.ResourceManager, typeof(FxCopRulesResources)), + FxCopDiagnosticCategory.Design, + DiagnosticSeverity.Warning, + isEnabledByDefault: true, + helpLinkUri: "http://msdn.microsoft.com/library/ms182172.aspx", + customTags: DiagnosticCustomTags.Microsoft); + + + + + Gets the effective severity of diagnostics created based on this descriptor and the given . + + Compilation options + + + + Returns true if diagnostic descriptor is not configurable, i.e. cannot be suppressed or filtered or have its severity changed. + For example, compiler errors are always non-configurable. + + + + + Returns true if diagnostic descriptor is a built-in compiler diagnostic or is not configurable. + + + + + Formats messages. + + + + + Formats the message using the optional . + + The diagnostic. + The formatter; or null to use the default formatter. + The formatted message. + + + + A DiagnosticInfo object has information about a diagnostic, but without any attached location information. + + + More specialized diagnostics with additional information (e.g., ambiguity errors) can derive from this class to + provide access to additional information about the error, such as what symbols were involved in the ambiguity. + + + + + The error code, as an integer. + + + + + Returns the effective severity of the diagnostic: whether this diagnostic is informational, warning, or error. + If IsWarningsAsError is true, then this returns , while returns . + + + + + Returns whether this diagnostic is informational, warning, or error by default, based on the error code. + To get diagnostic's effective severity, use . + + + + + Gets the warning level. This is 0 for diagnostics with severity , + otherwise an integer greater than zero. + + + + + Returns true if this is a warning treated as an error. + + + True implies = and + = . + + + + + Get the diagnostic category for the given diagnostic code. + Default category is . + + + + + If a derived class has additional information about other referenced symbols, it can + expose the locations of those symbols in a general way, so they can be reported along + with the error. + + + + + Get the message id (for example "CS1001") for the message. This includes both the error number + and a prefix identifying the source. + + + + + Get the text of the message in the given language. + + + + + For a DiagnosticInfo that is lazily evaluated, this method evaluates it + and returns a non-lazy DiagnosticInfo. + + + + + Describes how severe a diagnostic is. + + + + + Something that is an issue, as determined by some authority, + but is not surfaced through normal means. + There may be different mechanisms that act on these issues. + + + + + Information that does not indicate a problem (i.e. not prescriptive). + + + + + Something suspicious but allowed. + + + + + Something not allowed by the rules of the language or other authority. + + + + + Values for severity that are used internally by the compiler but are not exposed. + + + + + An unknown severity diagnostic is something whose severity has not yet been determined. + + + + + If an unknown diagnostic is resolved and found to be unnecessary then it is + treated as a "Void" diagnostic + + + + + Values for ErrorCode/ERRID that are used internally by the compiler but are not exposed. + + + + + The code has yet to be determined. + + + + + The code was lazily determined and does not need to be reported. + + + + + A diagnostic (such as a compiler error or a warning), along with the location where it occurred. + + + + + Get the information about the diagnostic: the code, severity, message, etc. + + + + + True if the DiagnosticInfo for this diagnostic requires (or required - this property + is immutable) resolution. + + + + + Usage is unexpected unless is true. + + + + + A program location in source code. + + + + + Represents a span of text in a source code file in terms of file name, line number, and offset within line. + However, the file is actually whatever was passed in when asked to parse; there may not really be a file. + + + + + Path, or null if the span represents an invalid value. + + + Path may be if not available. + + + + + Gets the span. + + + + + True if the is a mapped path. + + + A mapped path is a path specified in source via #line (C#) or #ExternalSource (VB) directives. + + + + + Initializes the instance. + + The file identifier - typically a relative or absolute path. + The start line position. + The end line position. + is null. + + + + Initializes the instance. + + The file identifier - typically a relative or absolute path. + The span. + is null. + + + + Gets the of the start of the span. + + + + + + Gets the of the end of the span. + + + + + + Returns true if the span represents a valid location. + + + + + Determines if two FileLinePositionSpan objects are equal. + + + The path is treated as an opaque string, i.e. a case-sensitive comparison is used. + + + + + Determines if two FileLinePositionSpan objects are equal. + + + + + Serves as a hash function for FileLinePositionSpan. + + The hash code. + + The path is treated as an opaque string, i.e. a case-sensitive hash is calculated. + + + + + Returns a that represents . + + The string representation of . + Path: (0,0)-(5,6) + + + + A localizable resource string that may possibly be formatted differently depending on culture. + + + + + Creates a localizable resource string with no formatting arguments. + + nameof the resource that needs to be localized. + for the calling assembly. + Type handling assembly's resource management. Typically, this is the static class generated for the resources file from which resources are accessed. + + + + Creates a localizable resource string that may possibly be formatted differently depending on culture. + + nameof the resource that needs to be localized. + for the calling assembly. + Type handling assembly's resource management. Typically, this is the static class generated for the resources file from which resources are accessed. + Optional arguments for formatting the localizable resource string. + + + + A string that may possibly be formatted differently depending on culture. + NOTE: Types implementing must be serializable. + + + + + FixedLocalizableString representing an empty string. + + + + + Fired when an exception is raised by any of the public methods of . + If the exception handler itself throws an exception, that exception is ignored. + + + + + Formats the value of the current instance using the optionally specified format. + + + + + Formats the value of the current instance using the optionally specified format. + Provides the implementation of ToString. ToString will provide a default value + if this method throws an exception. + + + + + Provides the implementation of GetHashCode. GetHashCode will provide a default value + if this method throws an exception. + + + + + + Provides the implementation of Equals. Equals will provide a default value + if this method throws an exception. + + + + + + Flag indicating if any methods on this type can throw exceptions from public entrypoints. + + + + + A program location in source code. + + + + + Location kind (None/SourceFile/MetadataFile). + + + + + Returns true if the location represents a specific location in a source code file. + + + + + Returns true if the location is in metadata. + + + + + The syntax tree this location is located in or null if not in a syntax tree. + + + + + Returns the metadata module the location is associated with or null if the module is not available. + + + Might return null even if returns true. The module symbol might not be available anymore, + for example, if the location is serialized and deserialized. + + + + + The location within the syntax tree that this location is associated with. + + + If returns False this method returns an empty which starts at position 0. + + + + + Gets the location in terms of path, line and column. + + + that contains path, line and column information. + + Returns an invalid span (see ) if the information is not available. + + The values are not affected by line mapping directives (#line in C# or #ExternalSource in VB). + + + + + Gets the location in terms of path, line and column after applying source line mapping directives + (#line in C# or #ExternalSource in VB). + + + that contains file, line and column information, + or an invalid span (see ) if not available. + + + + + A location of kind LocationKind.None. + + + + + Creates an instance of a for a span in a . + + + + + Creates an instance of a for a span in a file. + + + + + Specifies the kind of location (source vs. metadata). + + + + + Unspecified location. + + + + + The location represents a position in a source file. + + + + + The location represents a metadata file. + + + + + The location represents a position in an XML file. + + + + + The location in some external file. + + + + + A program location in metadata. + + + + + A class that represents no location at all. Useful for errors in command line options, for example. + + + + + + Describes how to report a warning diagnostic. + + + + + Report a diagnostic by default. + + + + + Report a diagnostic as an error. + + + + + Report a diagnostic as a warning even though /warnaserror is specified. + + + + + Report a diagnostic as an info. + + + + + Report a diagnostic as hidden. + + + + + Suppress a diagnostic. + + + + + A program location in source code. + + + + + Provides a description about a programmatic suppression of a by a . + + + + + An unique identifier for the suppression. + + + + + Identifier of the suppressed diagnostic, i.e. . + + + + + A localizable justification about the suppression. + + + + + Create a SuppressionDescriptor, which provides a justification about a programmatic suppression of a . + NOTE: For localizable , + use constructor overload . + + A unique identifier for the suppression. For example, suppression ID "SP1001". + Identifier of the suppressed diagnostic, i.e. . For example, compiler warning Id "CS0649". + Justification for the suppression. For example: "Suppress CS0649 on fields marked with YYY attribute as they are implicitly assigned.". + + + + Create a SuppressionDescriptor, which provides a localizable justification about a programmatic suppression of a . + + A unique identifier for the suppression. For example, suppression ID "SP1001". + Identifier of the suppressed diagnostic, i.e. . For example, compiler warning Id "CS0649". + Justification for the suppression. For example: "Suppress CS0649 on fields marked with YYY attribute as they are implicitly assigned.". + + + + Returns a flag indicating if the suppression is disabled for the given . + + Compilation options + + + + Indicates that the diagnostic is related to some unnecessary source code. + + + + + Indicates that the diagnostic is related to edit and continue. + + + + + Indicates that the diagnostic is related to build. + + + + + Indicates that the diagnostic is reported by the compiler. + + + + + Indicates that the diagnostic can be used for telemetry + + + + + Indicates that the diagnostic is not configurable, i.e. it cannot be suppressed or filtered or have its severity changed. + + + + + Indicates that the diagnostic is related to an exception thrown by a . + + + + + Indicates that the diagnostic is an obsolete diagnostic with a custom ID + specified by the 'DiagnosticId' property on 'ObsoleteAttribute'. + + + + + Indicates that the diagnostic is a compilation end diagnostic reported + from a compilation end action. + + + + + A program location in an XML file. + + + + + APIs for constructing documentation comment id's, and finding symbols that match ids. + + + + + Creates an id string used by external documentation comment files to identify declarations + of types, namespaces, methods, properties, etc. + + + + + Creates an id string used to reference type symbols (not strictly declarations, includes + arrays, pointers, type parameters, etc.) + + + + + Gets all declaration symbols that match the declaration id string + + + + + Try to get all the declaration symbols that match the declaration id string. + Returns true if at least one symbol matches. + + + + + Gets the first declaration symbol that matches the declaration id string, order undefined. + + + + + Gets the symbols that match the reference id string. + + + + + Try to get all symbols that match the reference id string. + Returns true if at least one symbol matches. + + + + + Gets the first symbol that matches the reference id string, order undefined. + + + + + WARN: This is a test hook - do not take a dependency on this. + + + + + + + + + + A class used to provide XML documentation to the compiler for members from metadata. A + custom implementation of this class should be returned from a DocumentationResolver to provide XML + documentation comments from custom caches or locations. + + + + + Fetches a documentation comment for the given member ID. + + The documentation member ID of the item to fetch. + The preferred culture to receive a comment in. Null if + there is no preference. This is a preference only, and providers may choose to provide + results from another culture if the preferred culture was unavailable. + A cancellation token for the search. + A DocumentationComment. + + + + DocumentationProviders are compared when determining whether an AssemblySymbol can be reused. + Hence, if multiple instances can represent the same documentation, it is imperative that + Equals (and GetHashCode) be overridden to capture this fact. Otherwise, it is possible to end + up with multiple AssemblySymbols for the same assembly, which plays havoc with the type hierarchy. + + + + + DocumentationProviders are compared when determining whether an AssemblySymbol can be reused. + Hence, if multiple instances can represent the same documentation, it is imperative that + GetHashCode (and Equals) be overridden to capture this fact. Otherwise, it is possible to end + up with multiple AssemblySymbols for the same assembly, which plays havoc with the type hierarchy. + + + + + A trivial DocumentationProvider which never returns documentation. + + + + + Used by the DocumentationCommentCompiler(s) to check doc comments for XML parse errors. + As a performance optimization, this class tries to re-use the same underlying instance + when possible. + + + + + Current text to validate. + + + + + We use to validate XML doc comments. Unfortunately it cannot be reset and thus can't be pooled. + Each time we need to validate a fragment of XML we "append" it to the underlying text reader, implemented by this class, + and advance the reader. By the end of the fragment validation, we keep the reader open in a state + that is ready for the next fragment validation unless the fragment was invalid, in which case we need to create a new XmlReader. + That is why pretends that the stream has extra spaces + at the end. That should be sufficient for to not reach the end of this reader before the next + fragment is appended, unless the current fragment is malformed in one way or another. + + + + + Specifies the different documentation comment processing modes. + + + Order matters: least processing to most processing. + + + + + Treats documentation comments as regular comments. + + + + + Parses documentation comments as structured trivia, but do not report any diagnostics. + + + + + Parses documentation comments as structured trivia and report diagnostics. + + + + + Represents text to be embedded in a PDB. + + + + + The maximum number of bytes in to write out uncompressed. + + This prevents wasting resources on compressing tiny files with little to negative gain + in PDB file size. + + Chosen as the point at which we start to see > 10% blob size reduction using all + current source files in corefx and roslyn as sample data. + + + + + The path to the file to embed. + + See remarks of + Empty file paths are disallowed, as the debugger finds source by looking up files by their name (and then verifying their signature) + + + + Hash algorithm to use to calculate checksum of the text that's saved to PDB. + + + + + The hash of the uncompressed bytes + that's saved to the PDB. + + + + + The content that will be written to the PDB. + + + Internal since this is an implementation detail. The only public + contract is that you can pass EmbeddedText instances to Emit. + It just so happened that doing this up-front was most practical + and efficient, but we don't want to be tied to it. + + For efficiency, the format of this blob is exactly as it is written + to the PDB,which prevents extra copies being made during emit. + + The first 4 bytes (little endian int32) indicate the format: + + 0: data that follows is uncompressed + Positive: data that follows is deflate compressed and value is original, uncompressed size + Negative: invalid at this time, but reserved to mark a different format in the future. + + + + + Constructs a for embedding the given . + + The file path (pre-normalization) to use in the PDB. + The source text to embed. + + is null. + is null. + + + empty. + cannot be embedded (see ). + + + + + Constructs an from stream content. + + The file path (pre-normalization) to use in the PDB. + The stream. + Hash algorithm to use to calculate checksum of the text that's saved to PDB. + + is null. + is null. + + + is empty. + doesn't support reading or seeking. + is not supported. + + An I/O error occurs. + Reads from the beginning of the stream. Leaves the stream open. + + + + Constructs an from bytes. + + The file path (pre-normalization) to use in the PDB. + The bytes. + Hash algorithm to use to calculate checksum of the text that's saved to PDB. + + is default-initialized. + is null. + + + is empty. + is not supported. + + An I/O error occurs. + Reads from the beginning of the stream. Leaves the stream open. + + + is null. + is empty. + + + + Creates the blob to be saved to the PDB. + + + + + Encoding to use when there is no byte order mark (BOM) on the stream. This encoder may throw a + if the stream contains invalid UTF-8 bytes. + + + + + Encoding to use when UTF-8 fails. We try to find the following, in order, if available: + 1. The default ANSI codepage + 2. CodePage 1252. + 3. Latin1. + + + + + Initializes an instance of from the provided stream. This version differs + from in two ways: + 1. It attempts to minimize allocations by trying to read the stream into a byte array. + 2. If is null, it will first try UTF-8 and, if that fails, it will + try CodePage 1252. If CodePage 1252 is not available on the system, then it will try Latin1. + + The stream containing encoded text. + + Specifies an encoding to be used if the actual encoding can't be determined from the stream content (the stream doesn't start with Byte Order Mark). + If not specified auto-detect heuristics are used to determine the encoding. If these heuristics fail the decoding is assumed to be Encoding.Default. + Note that if the stream starts with Byte Order Mark the value of is ignored. + + Indicates if the file can be embedded in the PDB. + Hash algorithm used to calculate document checksum. + + The stream content can't be decoded using the specified , or + is null and the stream appears to be a binary file. + + An IO error occurred while reading from the stream. + + + + Try to create a from the given stream using the given encoding. + + The input stream containing the encoded text. The stream will not be closed. + The expected encoding of the stream. The actual encoding used may be different if byte order marks are detected. + The checksum algorithm to use. + Throw if binary (non-text) data is detected. + Indicates if the text can be embedded in the PDB. + The decoded from the stream. + The decoder was unable to decode the stream with the given encoding. + Error reading from stream. + + + + Some streams are easily represented as bytes. + + The stream + The bytes, if available. + + True if the stream's bytes could easily be read, false otherwise. + + + + + Read the contents of a FileStream into a byte array. + + The FileStream with encoded text. + A byte array filled with the contents of the file. + True if a byte array could be created. + + + + Computes line starts faster given already computed line starts from text before the change. + + + + + A composite of a sequence of s. + + + + + Validates the arguments passed to against the published contract. + + True if should bother to proceed with copying. + + + + Reduces the number of segments toward the target number of segments, + if the number of segments is deemed to be too large (beyond the maximum). + + + + + Determines the segment size to use for call to CombineSegments, that will result in the segment count + being reduced to less than or equal to the target segment count. + + + + + Determines the segment count that would result if the segments of size less than or equal to + the specified segment size were to be combined. + + + + + Combines contiguous segments with lengths that are each less than or equal to the specified segment size. + + + + + Compute total text length and total size of storage buffers held + + + + + Trim excessive inaccessible text. + + + + + A optimized for very large sources. The text is stored as + a list of chunks (char arrays). + + + + + internal for unit testing + + + + + Called from to initialize the . Thereafter, + the collection is cached. + + A new representing the individual text lines. + + + + Append chunk to writer (may reuse char array) + + + + + Immutable representation of a line number and position within a SourceText instance. + + + + + A that represents position 0 at line 0. + + + + + Initializes a new instance of a with the given line and character. + + + The line of the line position. The first line in a file is defined as line 0 (zero based line numbering). + + + The character position in the line. + + or is less than zero. + + + + The line number. The first line in a file is defined as line 0 (zero based line numbering). + + + + + The character position within the line. + + + + + Determines whether two are the same. + + + + + Determines whether two are different. + + + + + Determines whether two are the same. + + The object to compare. + + + + Determines whether two are the same. + + The object to compare. + + + + Provides a hash function for . + + + + + Provides a string representation for . + + 0,10 + + + + Immutable span represented by a pair of line number and index within the line. + + + + + Creates . + + Start position. + End position. + precedes . + + + + Gets the start position of the span. + + + + + Gets the end position of the span. + + + + + Provides a string representation for . + + (0,0)-(5,6) + + + + Specifies a hash algorithms used for hashing source files. + + + + + No algorithm specified. + + + + + Secure Hash Algorithm 1. + + + + + Secure Hash Algorithm 2 with a hash size of 256 bits. + + + + + An abstraction of source text. + + + + + Constructs a from text in a string. + + Text. + + Encoding of the file that the was read from or is going to be saved to. + null if the encoding is unspecified. + If the encoding is not specified the resulting isn't debuggable. + If an encoding-less is written to a file a shall be used as a default. + + + Hash algorithm to use to calculate checksum of the text that's saved to PDB. + + is null. + is not supported. + + + + Constructs a from text in a string. + + TextReader + length of content from + + Encoding of the file that the was read from or is going to be saved to. + null if the encoding is unspecified. + If the encoding is not specified the resulting isn't debuggable. + If an encoding-less is written to a file a shall be used as a default. + + + Hash algorithm to use to calculate checksum of the text that's saved to PDB. + + is null. + is not supported. + + + + Constructs a from stream content. + + Stream. The stream must be seekable. + + Data encoding to use if the stream doesn't start with Byte Order Mark specifying the encoding. + if not specified. + + + Hash algorithm to use to calculate checksum of the text that's saved to PDB. + + If the decoded text contains at least two consecutive NUL + characters, then an is thrown. + True if the text can be passed to and be embedded in a PDB. + is null. + + doesn't support reading or seeking. + is not supported. + + If the given encoding is set to use a throwing decoder as a fallback + Two consecutive NUL characters were detected in the decoded text and was true. + An I/O error occurs. + Reads from the beginning of the stream. Leaves the stream open. + + + + Constructs a from a byte array. + + The encoded source buffer. + The number of bytes to read from the buffer. + + Data encoding to use if the encoded buffer doesn't start with Byte Order Mark. + if not specified. + + + Hash algorithm to use to calculate checksum of the text that's saved to PDB. + + If the decoded text contains at least two consecutive NUL + characters, then an is thrown. + The decoded text. + True if the text can be passed to and be embedded in a PDB. + The is null. + The is negative or longer than the . + is not supported. + If the given encoding is set to use a throwing decoder as a fallback + Two consecutive NUL characters were detected in the decoded text and was true. + + + + Decode text from a stream. + + The stream containing encoded text. + The encoding to use if an encoding cannot be determined from the byte order mark. + The actual encoding used. + The decoded text. + If the given encoding is set to use a throwing decoder as a fallback + + + + Decode text from a byte array. + + The byte array containing encoded text. + The count of valid bytes in . + The encoding to use if an encoding cannot be determined from the byte order mark. + The actual encoding used. + The decoded text. + If the given encoding is set to use a throwing decoder as a fallback + + + + Check for occurrence of two consecutive NUL (U+0000) characters. + This is unlikely to appear in genuine text, so it's a good heuristic + to detect binary files. + + + internal for unit testing + + + + + + + + Hash algorithm to use to calculate checksum of the text that's saved to PDB. + + + + + Encoding of the file that the text was read from or is going to be saved to. + null if the encoding is unspecified. + + + If the encoding is not specified the source isn't debuggable. + If an encoding-less is written to a file a shall be used as a default. + + + + + The length of the text in characters. + + + + + The size of the storage representation of the text (in characters). + This can differ from length when storage buffers are reused to represent fragments/subtext. + + + + + Indicates whether this source text can be embedded in the PDB. + + + If this text was constructed via or + , then the canBeEmbedded arg must have + been true. + + Otherwise, must be non-null. + + + + + If the text was created from a stream or byte[] and canBeEmbedded argument was true, + this provides the embedded text blob that was precomputed using the original stream + or byte[]. The precomputation was required in that case so that the bytes written to + the PDB match the original bytes exactly (and match the checksum of the original + bytes). + + + + + Returns a character at given position. + + The position to get the character from. + The character. + When position is negative or + greater than . + + + + Copy a range of characters from this SourceText to a destination array. + + + + + The container of this . + + + + + Gets a that contains the characters in the specified span of this text. + + + + + Returns a that has the contents of this text including and after the start position. + + + + + Write this to a text writer. + + + + + Write a span of text to a text writer. + + + + + Provides a string representation of the SourceText. + + + + + Gets a string containing the characters in specified span. + + When given span is outside of the text range. + + + + Constructs a new SourceText from this text with the specified changes. + + + + + Constructs a new SourceText from this text with the specified changes. + + + Changes do not have to be in sorted order. However, will + perform better if they are. + + If any changes are not in bounds of this . + If any changes overlap other changes. + + + + Returns a new SourceText with the specified span of characters replaced by the new text. + + + + + Returns a new SourceText with the specified range of characters replaced by the new text. + + + + + Gets the set of that describe how the text changed + between this text an older version. This may be multiple detailed changes + or a single change encompassing the entire text. + + + + + Gets the set of that describe how the text changed + between this text and an older version. This may be multiple detailed changes + or a single change encompassing the entire text. + + + + + The collection of individual text lines. + + + + + Called from to initialize the . Thereafter, + the collection is cached. + + A new representing the individual text lines. + + + + Compares the content with content of another . + + + + + Implements equality comparison of the content of two different instances of . + + + + + Detect an encoding by looking for byte order marks. + + A buffer containing the encoded text. + The length of valid data in the buffer. + The length of any detected byte order marks. + The detected encoding or null if no recognized byte order mark was present. + + + + An object that contains an instance of a SourceText and raises events when its current instance + changes. + + + + + The current text instance. + + + + + Raised when the current text instance changes. + + + + + A read-only, non-seekable over a . + + + + + Implementation of based on a input + + + + + Underlying string on which this SourceText instance is based + + + + + Underlying string which is the source of this SourceText instance + + + + + The length of the text represented by . + + + + + Returns a character at given position. + + The position to get the character from. + The character. + When position is negative or + greater than . + + + + Provides a string representation of the StringBuilderText located within given span. + + When given span is outside of the text range. + + + + Implementation of SourceText based on a input + + + + + Underlying string which is the source of this instance + + + + + The length of the text represented by . + + + + + Returns a character at given position. + + The position to get the character from. + The character. + When position is negative or + greater than . + + + + Provides a string representation of the StringText located within given span. + + When given span is outside of the text range. + + + + A that represents a subrange of another . + + + + + Describes a single change when a particular span is replaced with a new text. + + + + + The original span of the changed text. + + + + + The new text. + + + + + Initializes a new instance of + + The original span of the changed text. + The new text. + + + + Provides a string representation for . + + + + + Converts a to a . + + + + + + An empty set of changes. + + + + + Represents state for a TextChanged event. + + + + + Initializes an instance of . + + The text before the change. + The text after the change. + A set of ranges for the change. + + + + Initializes an instance of . + + The text before the change. + The text after the change. + A set of ranges for the change. + + + + Gets the text before the change. + + + + + Gets the text after the change. + + + + + Gets the set of ranges for the change. + + + + + Represents the change to a span of text. + + + + + The span of text before the edit which is being changed + + + + + Width of the span after the edit. A 0 here would represent a delete + + + + + Initializes a new instance of . + + + + + + + Compares current instance of to another. + + + + + Compares current instance of to another. + + + + + Provides hash code for current instance of . + + + + + + Determines if two instances of are same. + + + + + Determines if two instances of are different. + + + + + An empty set of changes. + + + + + Collapse a set of s into a single encompassing range. If + the set of ranges provided is empty, an empty range is returned. + + + + + Information about the character boundaries of a single line of text. + + + + + Creates a instance. + + The source text. + The span of the line. + An instance of . + The span does not represent a text line. + + + + Gets the source text. + + + + + Gets the zero-based line number. + + + + + Gets the start position of the line. + + + + + Gets the end position of the line not including the line break. + + + + + Gets the end position of the line including the line break. + + + + + Gets the line span not including the line break. + + + + + Gets the line span including the line break. + + + + + Abstract base class for collections. + + + + + The count of items in the collection + + + + + Gets the item at the specified index. + + + + + The index of the TextLine that encompasses the character position. + + + + + Gets a that encompasses the character position. + + + + + + + Gets a corresponding to a character position. + + + + + Convert a to a . + + + + + Convert a to a position. + + + + + Convert a to . + + + + + Immutable abstract representation of a span of text. For example, in an error diagnostic that reports a + location, it could come from a parsed string, text from a tool editor buffer, etc. + + + + + Creates a TextSpan instance beginning with the position Start and having the Length + specified with . + + + + + Start point of the span. + + + + + End of the span. + + + + + Length of the span. + + + + + Determines whether or not the span is empty. + + + + + Determines whether the position lies within the span. + + + The position to check. + + + true if the position is greater than or equal to Start and strictly less + than End, otherwise false. + + + + + Determines whether falls completely within this span. + + + The span to check. + + + true if the specified span falls completely within this span, otherwise false. + + + + + Determines whether overlaps this span. Two spans are considered to overlap + if they have positions in common and neither is empty. Empty spans do not overlap with any + other span. + + + The span to check. + + + true if the spans overlap, otherwise false. + + + + + Returns the overlap with the given span, or null if there is no overlap. + + + The span to check. + + + The overlap of the spans, or null if the overlap is empty. + + + + + Determines whether intersects this span. Two spans are considered to + intersect if they have positions in common or the end of one span + coincides with the start of the other span. + + + The span to check. + + + true if the spans intersect, otherwise false. + + + + + Determines whether intersects this span. + A position is considered to intersect if it is between the start and + end positions (inclusive) of this span. + + + The position to check. + + + true if the position intersects, otherwise false. + + + + + Returns the intersection with the given span, or null if there is no intersection. + + + The span to check. + + + The intersection of the spans, or null if the intersection is empty. + + + + + Creates a new from and positions as opposed to a position and length. + + The returned TextSpan contains the range with inclusive, + and exclusive. + + + + + Determines if two instances of are the same. + + + + + Determines if two instances of are different. + + + + + Determines if current instance of is equal to another. + + + + + Determines if current instance of is equal to another. + + + + + Produces a hash code for . + + + + + Provides a string representation for . + This representation uses "half-open interval" notation, indicating the endpoint character is not included. + Example: [10..20), indicating the text starts at position 10 and ends at position 20 not included. + + + + + Compares current instance of with another. + + + + + Holder for common Text Utility functions and values + + + + + Return startLineBreak = index-1, lengthLineBreak = 2 if there is a \r\n at index-1 + Return startLineBreak = index, lengthLineBreak = 1 if there is a 1-char newline at index + Return startLineBreak = index+1, lengthLineBreak = 0 if there is no newline at index. + + + + + Determine if the character in question is any line break character + + + + + Generate a ConstantValue of the same integer type as the argument + and offset by the given non-negative amount. Return ConstantValue.Bad + if the generated constant would be outside the valid range of the type. + + + + + Emit the IL for the compilation into the specified stream. + + Compilation. + Path of the file to which the compilation will be written. + Path of the file to which the compilation's debug info will be written. + Also embedded in the output file. Null to forego PDB generation. + + Path of the file to which the compilation's XML documentation will be written. Null to forego XML generation. + Path of the file from which the compilation's Win32 resources will be read (in RES format). + Null to indicate that there are none. + List of the compilation's managed resources. Null to indicate that there are none. + To cancel the emit process. + Compilation or path is null. + Path is empty or invalid. + An error occurred while reading or writing a file. + + + + Initializes a new instance of the class. + + An ordered set of fully qualified + paths which are searched when resolving assembly names. + Directory used when resolving relative paths. + + + + Represents that an intermediate result is being captured. + This node is produced only as part of a . + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + An id used to match references to the same intermediate result. + + + + + Value to be captured. + + + + + Represents a point of use of an intermediate result captured earlier. + The fact of capturing the result is represented by . + This node is produced only as part of a . + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + An id used to match references to the same intermediate result. + + + + + True if this reference to the capture initializes the capture. Used when the capture is being initialized by being passed as an out parameter. + + + + + Represents result of checking whether the is null. + For reference types this checks if the is a null reference, + for nullable types this checks if the doesn’t have a value. + The node is produced as part of a flow graph during rewrite of + and nodes. + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Value to check. + + + + + Represents a exception instance passed by an execution environment to an exception filter or handler. + This node is produced only as part of a . + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents the check during initialization of a VB static local that is initialized on the first call of the function, and never again. + If the semaphore operation returns true, the static local has not yet been initialized, and the initializer will be run. If it returns + false, then the local has already been initialized, and the static local initializer region will be skipped. + This node is produced only as part of a . + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The static local variable that is possibly initialized. + + + + + Represents an anonymous function operation in context of a . + + Current usage: + (1) C# lambda expression. + (2) VB anonymous delegate expression. + + A for the body of the anonymous function is available from + the enclosing . + + + This node is associated with the following operation kinds: + + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Symbol of the anonymous function. + + + + + Represents a basic block in a with a sequence of . + Once a basic block is entered, all operations in it are always executed. + Optional , if non-null, is evaluated after the . + Control flow leaves the basic block by taking either the branch or + the branch. + + + + + Basic block kind (entry, block, or exit). + + + + + Sequence of operations in the basic block. + + + + + Optional branch value, which if non-null, is evaluated after . + For conditional branches, this value is used to represent the condition which determines if + is taken or not. + For non-conditional branches, this value is used to represent the return or throw value associated + with the . + + + + + Indicates the condition kind for the branch out of the basic block. + + + + + Optional fall through branch executed at the end of the basic block. + This branch is null for exit block, and non-null for all other basic blocks. + + + + + Optional conditional branch out of the basic block. + If non-null, this branch may be taken at the end of the basic block based + on the and . + + + + + List of basic blocks which have a control flow branch ( or ) + into this basic block. + + + + + Unique ordinal for each basic block in a , + which can be used to index into array. + + + + + Indicates if control flow can reach this basic block from the entry block of the graph. + + + + + Enclosing region. + + + + + kind. + + + + + Indicates an entry block for a , + which is always the first block in . + + + + + Indicates an exit block for a , + which is always the last block in . + + + + + Indicates an intermediate block for a . + + + + + Capture Id is an opaque identifier to represent an intermediate result from an . + + + + + Compares s. + + + + + + + + + + + Represents a control flow branch from a basic block to a + basic block in a . + + + + + Source basic block of this branch. + + + + + Destination basic block of this branch. + + + + + Semantics associated with this branch (such as "regular", "return", "throw", etc). + + + + + Indicates if this branch represents of the basic block. + + + + + Regions exited if this branch is taken. + Ordered from the innermost region to the outermost region. + + + + + Regions entered if this branch is taken. + Ordered from the outermost region to the innermost region. + + + + + The finally regions the control goes through if this branch is taken. + Ordered in the sequence by which the finally regions are executed. + + + + + Semantics associated with a . + + + + + Represents a with no associated semantics. + + + + + Represents a regular from a source basic block to a non-null destination basic block. + + + + + Represents a to the exit block, i.e. the destination block has . + + + + + Represents a with special structured exception handling semantics: + 1. The source basic block is the last block of an enclosing finally or filter region. + 2. The destination basic block is null. + + + + + Represents a to indicate flow transfer to the end of program execution. + The destination basic block is null for this branch. + + + + + Represents a generated for an with an explicit thrown exception. + The destination basic block is null for this branch. + + + + + Represents a generated for an with in implicit rethrown exception. + The destination basic block is null for this branch. + + + + + Represents a generated for error cases. + + + + + Represents kind of conditional branch from a . + + + + + Indicates no conditional branch from a . + Associated is null. + + + + + Indicates a conditional branch from a , + with a non-null and . + If evaluates to false, + then the branch is taken. + + + + + Indicates a conditional branch from a , + with a non-null and . + If evaluates to true, + then the branch is taken. + + + + + Control flow graph representation for a given executable code block . + This graph contains a set of s, with an entry block, zero + or more intermediate basic blocks and an exit block. + Each basic block contains zero or more and + explicit (s) to other basic block(s). + + + + + Creates a for the given executable code block root . + + Root syntax node for an executable code block. + Semantic model for the syntax tree containing the . + Optional cancellation token. + + Returns null if returns null for the given and . + Otherwise, returns a for the executable code block. + + + + + Creates a for the given executable code block . + + Root operation block, which must have a null parent. + Optional cancellation token. + + + + Creates a for the given executable code block . + + Root field initializer operation, which must have a null parent. + Optional cancellation token. + + + + Creates a for the given executable code block . + + Root property initializer operation, which must have a null parent. + Optional cancellation token. + + + + Creates a for the given executable code block . + + Root parameter initializer operation, which must have a null parent. + Optional cancellation token. + + + + Creates a for the given executable code block . + + Root constructor body operation, which must have a null parent. + Optional cancellation token. + + + + Creates a for the given executable code block . + + Root method body operation, which must have a null parent. + Optional cancellation token. + + + + Original operation, representing an executable code block, from which this control flow graph was generated. + Note that in the control flow graph are not in the same operation tree as + the original operation. + + + + + Optional parent control flow graph for this graph. + Non-null for a control flow graph generated for a local function or a lambda. + Null otherwise. + + + + + Basic blocks for the control flow graph. + + + + + Root () region for the graph. + + + + + Local functions declared within . + + + + + Creates a control flow graph for the given . + + + + + Creates a control flow graph for the given . + + + + + Some basic concepts: + - Basic blocks are sequences of statements/operations with no branching. The only branching + allowed is at the end of the basic block. + - Regions group blocks together and represent the lifetime of locals and captures, loosely similar to scopes in C#. + There are different kinds of regions, . + - converts values on the stack into captures. + - Error scenarios from initial binding need to be handled. + + + + + Represents the stack s of a tree of conditional accesses. The top of the stack is the + deepest node, and except in error conditions it should contain a that will be visited + when visiting this node. This is the basic recursion that ensures that the operations are visited at the correct time. + + + + + The basic block to branch to if the top of the stack is null. + + + + + This structure is meant to capture a snapshot of the state + that is needed to build graphs for lambdas and local functions. + + + + + Holds the current object being initialized if we're visiting an object initializer. + Or the current anonymous type object being initialized if we're visiting an anonymous type object initializer. + Or the target of a VB With statement. + + + + + Do a pass to eliminate blocks without statements that can be merged with predecessor(s) and + to eliminate regions that can be merged with parents. + + + + + Merge content of into its enclosing region and free it. + + + + + Do a pass to eliminate blocks without statements that can be merged with predecessor(s). + Returns true if any blocks were eliminated + + + + + Deal with labeled blocks that were not added to the graph because labels were never found + + + + + Either visits a single operation, or a using and all subsequent statements + + The statement to visit + All statements in the block containing this node + The current statement being visited in + True if this visited all of the statements + + The operation being visited is not necessarily equal to statements[startIndex]. + When traversing down a set of labels, we set operation to the label.Operation and recurse, but statements[startIndex] still refers to the original parent label + as we haven't actually moved down the original statement list + + + + + This class captures information about beginning of stack frame + and corresponding if one was allocated to + track s used by the stack spilling, etc. + Do not create instances of this type manually, use + helper instead. Also, do not assign explicitly. + Let the builder machinery do this when appropriate. + + + + + This function does not change the current region. The stack should be spilled before calling it. + + + + + Returns converted test expression. + Caller is responsible for spilling the stack and pushing a stack frame before calling this helper. + + + + + Recursively push nexted values onto the stack for visiting + + + + + Recursively pop nested tuple values off the stack after visiting + + + + + Holds the current object being initialized if we're visiting an object initializer. + Or the current anonymous type object being initialized if we're visiting an anonymous type object initializer. + Or the target of a VB With statement. + + + + + Holds the current object instance being initialized if we're visiting an object initializer. + + + + + Holds the current anonymous type instance being initialized if we're visiting an anonymous object initializer. + + + + + Holds the captured values for initialized anonymous type properties in an anonymous object initializer. + + + + + Gets or creates a control flow graph for the given defined in + the given or any of it's parent control flow graphs. + + + + + Gets or creates a control flow graph for the given defined in + the given or any of it's parent control flow graphs. + + + + + Encapsulates information about regions of s in a . + Regions can overlap, but never cross each other boundaries. + + + + + Region's kind + + + + + Enclosing region. Null for + + + + + Target exception type for , , + + + + + + Ordinal () of the first within the region. + + + + + Ordinal () of the last within the region. + + + + + Regions nested within this region. + + + + + Locals for which this region represent the life-time. + + + + + Local functions declared within the region. + + + + + Capture Ids used for intermediate results within the region. + + + + + Defines kinds of regions that can be present in a + + + + + A root region encapsulating all s in a + + + + + Region with the only purpose to represent the life-time of locals, intermediate results, and nested methods (local functions, lambdas). + The lifetime of a local variable is the portion of program execution during which storage is guaranteed to be reserved for it. + The lifetime of a nested method is the portion of program execution within which the method can be referenced. + The lifetime of an intermediate result (capture) is the portion of program execution within which the result can be referenced. + + + + + Region representing a try region. For example, + + + + + Region representing + + + + + Region representing + + + + + Region representing a union of a and the corresponding catch regions. + Doesn't contain any s directly. + + + + + Region representing a union of a and all corresponding catch + and regions. Doesn't contain any s directly. + + + + + Region representing + + + + + Region representing a union of a and corresponding finally + region. Doesn't contain any s directly. + + An that has a set of and a + at the same time is mapped to a region with region inside its region. + + + + + Region representing the initialization for a VB Static local variable. This region will only be executed + the first time a function is called. + + + + + Region representing erroneous block of code that is unreachable from the entry block. + + + + + All of the kinds of operations, including statements and expressions. + + + + Indicates an for a construct that is not implemented yet. + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . This is further differentiated by . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . This has yield break semantics. + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . This has yield return semantics. + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . Use instead. + + + Indicates an . + + + Indicates an . Use instead. + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . This is used as an increment operator + + + Indicates an . + + + Indicates an . This is used as a decrement operator + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . This is further differentiated by . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . Use instead. + + + Indicates an . + + + Indicates an . Use instead. + + + Indicates an . + + + Indicates an . Use instead. + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . This append is of a literal component + + + Indicates an . This append is of an interpolation component + + + Indicates an . This append is invalid + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + Indicates an . + + + + Cache with a fixed size that evicts the least recently used members. + Thread-safe. + + + + + Create cache from an array. The cache capacity will be the size + of the array. All elements of the array will be added to the + cache. If any duplicate keys are found in the array a + will be thrown. + + + + + For testing. Very expensive. + + + + + Expects non-empty cache. Does not lock. + + + + + Doesn't lock. + + + + + Doesn't lock. + + + + + A pre-created delegate to assign to if needed. + + + + + Dumps the stack trace of the exception and the handler to the console. This is useful + for debugging unit tests that hit a fatal exception + + + + + Checks for the given ; if the is true, + immediately terminates the process without running any pending finally blocks or finalizers + and causes a crash dump to be collected (if the system is configured to do so). + Otherwise, the process continues normally. + + The conditional expression to evaluate. + An optional message to be recorded in the dump in case of failure. Can be null. + + + + Thrown when async code must cancel the current execution but does not have access to the of the passed to the code. + Should be used in very rare cases where the is out of our control (e.g. owned but not exposed by JSON RPC in certain call-back scenarios). + + + + + Set by the host to handle an error report; this may crash the process or report telemetry. + + + + + Same as setting the Handler property except that it avoids the assert. This is useful in + test code which needs to verify the handler is called in specific cases and will continually + overwrite this value. + + + + + Copies the handler in this instance to the linked copy of this type in this other assembly. + + + This file is in linked into multiple layers, but we want to ensure that all layers have the same copy. + This lets us copy the handler in this instance into the same in another instance. + + + + + Use in an exception filter to report an error without catching the exception. + The error is reported by calling . + + to avoid catching the exception. + + + + Use in an exception filter to report an error (by calling ), unless the + operation has been cancelled. The exception is never caught. + + to avoid catching the exception. + + + + Use in an exception filter to report an error (by calling ), unless the + operation has been cancelled at the request of . The exception is + never caught. + + Cancellable operations are only expected to throw if the + applicable indicates cancellation is requested by setting + . Unexpected cancellation, i.e. an + which occurs without + requesting cancellation, is treated as an error by this method. + + This method does not require to match + , provided cancellation is expected per the previous + paragraph. + + A which will have + set if cancellation is expected. + to avoid catching the exception. + + + + The severity of the error, see the enum members for a description of when to use each. This is metadata that's included + in a non-fatal fault report, which we can take advantage of on the backend to automatically triage bugs. For example, + a critical severity issue we can open with a lower bug count compared to a low priority one. + + + + + The severity hasn't been categorized. Don't use this in new code. + + + + + Something failed, but the user is unlikely to notice. Especially useful for background things that we can silently recover + from, like bugs in caching systems. + + + + + Something failed, and the user might notice, but they're still likely able to carry on. For example, if the user + asked for some information from the IDE (find references, completion, etc.) and we were able to give partial results. + + + + + Something failed, and the user likely noticed. For example, the user pressed a button to do an action, and + we threw an exception so we completely failed to do that in an unrecoverable way. This may also be used + for back-end systems where a failure is going to result in a highly broken experience, for example if parsing a file + catastrophically failed. + + + + + A Span-compatible version of . + + + + + Ensures that the remaining stack space is large enough to execute + the average function. + + how many times the calling function has recursed + + The available stack space is insufficient to execute + the average function. + + + + + Represents an optional bool as a single byte. + + + + + Used to devirtualize ConcurrentDictionary for EqualityComparer{T}.Default and ReferenceEquals + + This type is to enable fast-path devirtualization in the Jit. Dictionary{K, V}, HashTable{T} + and ConcurrentDictionary{K, V} will devirtualize (and potentially inline) the IEquatable{T}.Equals + method for a struct when the Comparer is unspecified in .NET Core, .NET 5; whereas specifying + a Comparer will make .Equals and GetHashcode slower interface calls. + + + + + The result of + + + + + This indicates that friend access should be granted. + + + + + This indicates that friend access should be granted for the purposes of error recovery, + but the program is wrong. + + That's because this indicates that a strong-named assembly has referred to a weak-named assembly + which has extended friend access to the strong-named assembly. This will ultimately + result in an error because strong-named assemblies may not refer to weak-named assemblies. + In Roslyn we give a new error, CS7029, before emit time. In the dev10 compiler we error at + emit time. + + + + + This indicates that friend access should not be granted because the other assembly grants + friend access to a strong-named assembly, and either this assembly is weak-named, or + it is strong-named and the names don't match. + + + + + This indicates that friend access should not be granted because the other assembly + does not name this assembly as a friend in any way whatsoever. + + + + + Structure that describes a member of a type. + + + + + Id/token of containing type, usually value from some enum. + For example from SpecialType enum. + I am not using SpecialType as the type for this field because + VB runtime types are not part of SpecialType. + + So, the implication is that any type ids we use outside of the SpecialType + (either for the VB runtime classes, or types like System.Task etc.) will need + to use IDs that are all mutually disjoint. + + + + + Signature of the field or method, similar to metadata signature, + but with the following exceptions: + 1) Truncated on the left, for methods starts at [ParamCount], for fields at [Type] + 2) Type tokens are not compressed + 3) BOOLEAN | CHAR | I1 | U1 | I2 | U2 | I4 | U4 | I8 | U8 | R4 | R8 | I | U | Void types are encoded by + using VALUETYPE+typeId notation. + 4) array bounds are not included. + 5) modifiers are not included. + 6) (CLASS | VALUETYPE) are omitted after GENERICINST + + + + + Applicable only to properties and methods, throws otherwise. + + + + + The type Id may be: + (1) encoded in a single byte (for types below 255) + (2) encoded in two bytes (255 + extension byte) for types below 512 + + + + + Read a type Id from the stream and copy it into the builder. + This may copy one or two bytes depending on the first one. + + + + + Helper class to match signatures in format of + MemberDescriptor.Signature to members. + + + + + Returns true if signature matches signature of the field. + Signature should be in format described in MemberDescriptor. + + + + + Returns true if signature matches signature of the property. + Signature should be in format described in MemberDescriptor. + + + + + Returns true if signature matches signature of the method. + Signature should be in format described in MemberDescriptor. + + + + + Does pretty much the same thing as MetadataDecoder.DecodeType only instead of + producing a type symbol it compares encoded type to the target. + + Signature should be in format described in MemberDescriptor. + + + + + Read a type Id from the signature. + This may consume one or two bytes, and therefore increment the position correspondingly. + + + + + Should return null in case of error. + + + + + Should return null in case of error. + + + + + Should only accept Pointer types. + Should return null in case of error. + + + + + Should return null in case of error. + + + + + Should only accept multi-dimensional arrays. + + + + + Should only accept multi-dimensional arrays. + Should return null in case of error. + + + + If the encoded type is invalid. + An exception from metadata reader. + + + If the encoded type is invalid. + An exception from metadata reader. + + + If the encoded type is invalid. + An exception from metadata reader. + + + An exception from metadata reader. + + + If the encoded type is invalid. + An exception from metadata reader. + + + If the encoded local variable type is invalid. + An exception from metadata reader. + + + If the encoded local variable type is invalid. + An exception from metadata reader. + + + + Used to decode signatures of local constants returned by SymReader. + + + + + Returns the local info for all locals indexed by slot. + + + + If the encoded parameter type is invalid. + + + An exception from metadata reader. + + + + Decodes attribute parameter type from method signature. + + If the encoded parameter type is invalid. + An exception from metadata reader. + + + + Decodes attribute argument type from attribute blob (called FieldOrPropType in the spec). + + If the encoded argument type is invalid. + An exception from metadata reader. + + + If the encoded attribute argument is invalid. + An exception from metadata reader. + + + If the encoded attribute argument is invalid. + An exception from metadata reader. + + + If the encoded attribute argument is invalid. + An exception from metadata reader. + + + If the given is invalid. + An exception from metadata reader. + + + If the encoded named argument is invalid. + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + + Find the methods that a given method explicitly overrides. + + + Methods may be on class or interfaces. + Containing classes/interfaces will be supertypes of the implementing type. + + TypeDef handle of the implementing type. + MethodDef handle of the implementing method. + The type symbol for the implementing type. + Array of implemented methods. + + + + Search for the corresponding to the given MethodDef token. Search amongst + the supertypes (classes and interfaces) of a designated type. + + + Generally, the type will be a type that explicitly implements an interface and the method will be the + implemented method (i.e. on the interface). + + TypeDef token of the type from which the search should begin. + MethodDef token of the target method. + Corresponding or null, if none is found. + + + + Enqueue the interfaces implemented and the type extended by a given TypeDef. + + Queue of TypeDefs to search. + Queue of TypeSymbols (representing typeRefs to search). + Handle of the TypeDef for which we want to enqueue supertypes. + An exception from metadata reader. + + + + Helper method for enqueuing a type token in the right queue. + Def -> typeDefsToSearch + Ref -> typeSymbolsToSearch + null -> neither + + + + + Enqueue the interfaces implemented and the type extended by a given TypeDef. + + Queue of TypeDefs to search. + Queue of TypeSymbols (representing typeRefs to search). + Symbol for which we want to enqueue supertypes. + + + + Enqueue the given type as either a def or a ref. + + Queue of TypeDefs to search. + Queue of TypeSymbols (representing typeRefs to search). + Symbol to enqueue. + + + + Search the members of a TypeSymbol to find the one that matches a given MethodDef token. + + Type to search for method. + MethodDef handle of the method to find. + The corresponding MethodSymbol or null. + + + + Search the members of a TypeSymbol to find the one that matches a given FieldDef token. + + Type to search for field. + FieldDef handle of the field to find. + The corresponding FieldSymbol or null. + + + + Given a MemberRef token for a method, we can find a corresponding MethodSymbol by + searching for the name and signature. + + A MemberRef token for a method. + Scope the search to supertypes of the implementing type. + True to only return method symbols, null if the token resolves to a field. + The corresponding MethodSymbol or null. + + + + Given a method symbol, return the MethodDef token, if it is defined in + this module, or a nil token, otherwise. + + The method symbol for which to return a MethodDef token. + A MethodDef token or nil. + + + + Returns a symbol that given token resolves to or null of the token represents an entity that isn't represented by a symbol, + such as vararg MemberRef. + + + + + Given a MemberRef token, return the TypeSymbol for its Class field. + + + + + Checks whether signatures match where the signatures are either from a property + and an accessor or two accessors. When comparing a property or getter to setter, the + setter signature must be the second argument and 'comparingToSetter' must be true. + + + Signature of the property containing the accessor, or the getter (type, then parameters). + + + Signature of the accessor when comparing property and accessor, + or the setter when comparing getter and setter (return type and then parameters). + + + True when comparing a property or getter to a setter, false otherwise. + + + True if differences in IsByRef for parameters should be treated as significant. + + + True if differences in return type (or value parameter for setter) should be treated as significant. + + True if the accessor signature is appropriate for the containing property. + + + + Check whether an event accessor has an appropriate signature. + + Type of the event containing the accessor. + Signature of the accessor (return type and then parameters). + True if the accessor signature is appropriate for the containing event. + + + + Rank equal 0 is used to denote an SzArray, rank equal 1 denotes multi-dimensional array of rank 1. + + + + + Decodes a serialized type name in its canonical form. The canonical name is its full type name, followed + optionally by the assembly where it is defined, its version, culture and public key token. If the assembly + name is omitted, the type name is in the current assembly otherwise it is in the referenced assembly. The + full type name is the fully qualified metadata type name. + + + + + Decodes a type name. A type name is a string which is terminated by the end of the string or one of the + delimiters '+', ',', '[', ']'. '+' separates nested classes. '[' and ']' + enclosed generic type arguments. ',' separates types. + + + + + Decodes a generic name. This is a type name followed optionally by a type parameter count + + + + + Rank equal 0 is used to denote an SzArray, rank equal 1 denotes multi-dimensional array of rank 1. + + + + + An ImmutableArray representing the single string "System" + + + + + Calculates information about types and namespaces immediately contained within a namespace. + + + Is current namespace a global namespace? + + + Length of the fully-qualified name of this namespace. + + + The sequence of groups of TypeDef row ids for types contained within the namespace, + recursively including those from nested namespaces. The row ids must be grouped by the + fully-qualified namespace name in case-sensitive manner. + Key of each IGrouping is a fully-qualified namespace name, which starts with the name of + this namespace. There could be multiple groups for each fully-qualified namespace name. + + The groups must be sorted by the keys in a manner consistent with comparer passed in as + nameComparer. Therefore, all types immediately contained within THIS namespace, if any, + must be in several IGrouping at the very beginning of the sequence. + + + Equality comparer to compare namespace names. + + + Output parameter, never null: + A sequence of groups of TypeDef row ids for types immediately contained within this namespace. + + + Output parameter, never null: + A sequence with information about namespaces immediately contained within this namespace. + For each pair: + Key - contains simple name of a child namespace. + Value - contains a sequence similar to the one passed to this function, but + calculated for the child namespace. + + + + + + Extract a simple name of a top level child namespace from potentially qualified namespace name. + + + Parent namespace name length plus the dot. + + + Fully qualified namespace name. + + + Simple name of a top level child namespace, the left-most name following parent namespace name + in the fully qualified name. + + + + + Determines whether given string can be used as a non-empty metadata identifier (a NUL-terminated UTF-8 string). + + + + + True if the string doesn't contain incomplete surrogates. + + + + + Checks that the specified name is a valid metadata String and a file name. + The specification isn't entirely consistent and complete but it mentions: + + 22.19.2: "Name shall index a non-empty string in the String heap. It shall be in the format {filename}.{extension} (e.g., 'goo.dll', but not 'c:\utils\goo.dll')." + 22.30.2: "The format of Name is {file name}.{file extension} with no path or drive letter; on POSIX-compliant systems Name contains no colon, no forward-slash, no backslash." + As Microsoft specific constraint. + + A reasonable restriction seems to be a valid UTF-8 non-empty string that doesn't contain '\0', '\', '/', ':' characters. + + + + + Determine if the given namespace and type names combine to produce the given fully qualified name. + + The namespace part of the split name. + The type name part of the split name. + The fully qualified name to compare with. + true if the combination of and equals the fully-qualified name given by + + + + Given an input string changes it to be acceptable as a part of a type name. + + + + + Specifies what symbols to import from metadata. + + + + + Only import public and protected symbols. + + + + + Import public, protected and internal symbols. + + + + + Import all symbols. + + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + + Helper structure to encapsulate/cache various information about metadata name of a type and + name resolution options. + Also, allows us to stop using strings in the APIs that accept only metadata names, + making usage of them less bug prone. + + + + + Full metadata name of a type, includes namespace name for top level types. + + + + + Namespace name for top level types. + + + + + Name of the type without namespace prefix, but possibly with generic arity mangling present. + + + + + Name of the type without namespace prefix and without generic arity mangling. + + + + + Arity of the type inferred based on the name mangling. It doesn't have to match the actual + arity of the type. + + + + + While resolving the name, consider only types with this arity. + (-1) means allow any arity. + If forcedArity >= 0 and useCLSCompliantNameArityEncoding, lookup may + fail because forcedArity doesn't match the one encoded in the name. + + + + + While resolving the name, consider only types following + CLS-compliant generic type names and arity encoding (ECMA-335, section 10.7.2). + I.e. arity is inferred from the name and matching type must have the same + emitted name and arity. + TODO: PERF: Encode this field elsewhere to save 4 bytes + + + + + Individual parts of qualified namespace name. + + + + + Full metadata name of a type, includes namespace name for top level types. + + + + + Namespace name for top level types, empty string for nested types. + + + + + Name of the type without namespace prefix, but possibly with generic arity mangling present. + + + + + Name of the type without namespace prefix and without generic arity mangling. + + + + + Arity of the type inferred based on the name mangling. It doesn't have to match the actual + arity of the type. + + + + + Does name include arity mangling suffix. + + + + + While resolving the name, consider only types following + CLS-compliant generic type names and arity encoding (ECMA-335, section 10.7.2). + I.e. arity is inferred from the name and matching type must have the same + emitted name and arity. + + + + + While resolving the name, consider only types with this arity. + (-1) means allow any arity. + If ForcedArity >= 0 and UseCLSCompliantNameArityEncoding, lookup may + fail because ForcedArity doesn't match the one encoded in the name. + + + + + Individual parts of qualified namespace name. + + + + + A digest of MetadataTypeName's fully qualified name which can be used as the key in a dictionary + + + + + Returns true if the nested type should be imported. + + + + + Returns true if the field should be imported. Visibility + and the value of are considered + + + + + Returns true if the flags represent a field that should be imported. + Visibility and the value of are considered + + + + + Returns true if the method should be imported. Returns false for private methods that are not + explicit interface implementations. For other methods, visibility and the value of + are considered. + + + + + Returns 0 if method name doesn't represent a v-table gap. + Otherwise, returns the gap size. + + + + + All assemblies this assembly references. + + + A concatenation of assemblies referenced by each module in the order they are listed in . + + + + + The number of assemblies referenced by each module in . + + + + + Assembly identity read from Assembly table, or null if the table is empty. + + + + + Using for atomicity. + + + + + We need to store reference to the assembly metadata to keep the metadata alive while + symbols have reference to PEAssembly. + + + + + + + + A set of helpers for extracting elements from metadata. + This type is not responsible for managing the underlying storage + backing the PE image. + + + + + We need to store reference to the module metadata to keep the metadata alive while + symbols have reference to PEModule. + + + + + This is a tuple for optimization purposes. In valid cases, we need to store + only one assembly index per type. However, if we found more than one, we + keep a second one as well to use it for error reporting. + We use -1 in case there was no forward. + + + + + Using as a type for atomicity. + + + + + If bitmap is not null, each bit indicates whether a TypeDef + with corresponding RowId has been checked if it is a NoPia + local type. If the bit is 1, local type will have an entry + in m_lazyTypeDefToTypeIdentifierMap. + + + + + For each TypeDef that has 1 in m_lazyNoPiaLocalTypeCheckBitMap, + this map stores corresponding TypeIdentifier AttributeInfo. + + + + + Target architecture of the machine. + + + + + Indicates that this PE file makes Win32 calls. See CorPEKind.pe32BitRequired for more information (http://msdn.microsoft.com/en-us/library/ms230275.aspx). + + + + An exception from metadata reader. + + + + Returns the names of linked managed modules. + + An exception from metadata reader. + + + + Returns names of referenced modules. + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + + The function groups types defined in the module by their fully-qualified namespace name. + The case-sensitivity of the grouping depends upon the provided StringComparer. + + The sequence is sorted by name by using provided comparer. Therefore, if there are multiple + groups for a namespace name (e.g. because they differ in case), the groups are going to be + adjacent to each other. + + Empty string is used as namespace name for types in the Global namespace. Therefore, all types + in the Global namespace, if any, should be in the first group (assuming a reasonable StringComparer). + + Comparer to sort the groups. + + + A sorted list of TypeDef row ids, grouped by fully-qualified namespace name. + An exception from metadata reader. + + + + Groups together the RowIds of types in a given namespaces. The types considered are + those defined in this module. + + An exception from metadata reader. + + + + Supplements the namespace-to-RowIDs map with the namespaces of forwarded types. + These types will not have associated row IDs (represented as null, for efficiency). + These namespaces are important because we want lookups of missing forwarded types + to succeed far enough that we can actually find the type forwarder and provide + information about the target assembly. + + For example, consider the following forwarded type: + + .class extern forwarder Namespace.Type {} + + If this type is referenced in source as "Namespace.Type", then dev10 reports + + error CS1070: The type name 'Namespace.Name' could not be found. This type has been + forwarded to assembly 'pe2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'. + Consider adding a reference to that assembly. + + If we did not include "Namespace" as a child of the global namespace of this module + (the forwarding module), then Roslyn would report that the type "Namespace" was not + found and say nothing about "Name" (because of the diagnostic already attached to + the qualifier). + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + + Returns a collection of interfaces implemented by given type. + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + + Find the MemberNotNull attribute(s) and extract the list of referenced member names + + + + + Find the MemberNotNullWhen attribute(s) and extract the list of referenced member names + + + + + Gets the well-known optional named properties on ObsoleteAttribute, if present. + Both 'diagnosticId' and 'urlFormat' may be present, or only one, or neither. + + + Failure to find any of these properties does not imply failure to decode the ObsoleteAttribute, + so we don't return a value indicating success or failure. + + + + An exception from metadata reader. + + + + Determine if custom attribute application is + NoPia TypeIdentifier. + + + An index of the target constructor signature in + signaturesOfTypeIdentifierAttribute array, -1 if + this is not NoPia TypeIdentifier. + + + + + Determines if a custom attribute matches a namespace and name. + + Handle of the custom attribute. + The custom attribute's namespace in metadata format (case sensitive) + The custom attribute's type name in metadata format (case sensitive) + Constructor of the custom attribute. + Should case be ignored for name comparison? + true if match is found + + + + Determines if a custom attribute matches a namespace and name. + + The metadata reader. + Handle of the custom attribute. + The custom attribute's namespace in metadata format (case sensitive) + The custom attribute's type name in metadata format (case sensitive) + Constructor of the custom attribute. + Should case be ignored for name comparison? + true if match is found + + + + Returns MetadataToken for assembly ref matching name + + The assembly name in metadata format (case sensitive) + Matching assembly ref token or nil (0) + + + + Returns MetadataToken for type ref matching resolution scope and name + + The resolution scope token + The namespace name in metadata format (case sensitive) + The type name in metadata format (case sensitive) + Matching type ref token or nil (0) + + + An exception from metadata reader. + + + + Determine if custom attribute matches the target attribute. + + + Handle of the custom attribute. + + The attribute to match. + + An index of the target constructor signature in + signatures array, -1 if + this is not the target attribute. + + + + + Determine if custom attribute matches the target attribute. + + + The metadata reader. + + + Handle of the custom attribute. + + The attribute to match. + + An index of the target constructor signature in + signatures array, -1 if + this is not the target attribute. + + + + + Given a token for a constructor, return the token for the constructor's type and the blob containing the + constructor's signature. + + True if the function successfully returns the type and signature. + + + + Given a token for a constructor, return the token for the constructor's type and the blob containing the + constructor's signature. + + True if the function successfully returns the type and signature. + + + + Given a token for a type, return the type's name and namespace. Only works for top level types. + namespaceHandle will be NamespaceDefinitionHandle for defs and StringHandle for refs. + + True if the function successfully returns the name and namespace. + + + + Given a token for a type, return the type's name and namespace. Only works for top level types. + namespaceHandle will be NamespaceDefinitionHandle for defs and StringHandle for refs. + + True if the function successfully returns the name and namespace. + + + + For testing purposes only!!! + + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + An exception from metadata reader. + + + + Returns true if method IL can be retrieved from the module. + + + + + Returns true if the full image of the module is available. + + + + Invalid metadata. + + + + Produce unbound generic type symbol if the type is a generic type. + + + + + Produce constructed type symbol. + + + + Symbol for generic type. + + + Generic type arguments, including those for containing types. + + + Flags for arguments. Each item indicates whether corresponding argument refers to NoPia local types. + + + + + Extracts information from TypeDef flags. + Returns 0 if the value is invalid. + + + + + Lookup a type defined in this module. + + + + + Lookup a type defined in referenced assembly. + + + + + Given the identity of an assembly referenced by this module, finds + the index of that assembly in the list of assemblies referenced by + the current module. + + + + + Represents an identity of an assembly as defined by CLI metadata specification. + + + May represent assembly definition or assembly reference identity. + + + Represents an identity of an assembly as defined by CLI metadata specification. + + + May represent assembly definition or assembly reference identity. + + + + + Constructs an from its constituent parts. + + The simple name of the assembly. + The version of the assembly. + + The name of the culture to associate with the assembly. + Specify null, , or "neutral" (any casing) to represent . + The name can be an arbitrary string that doesn't contain NUL character, the legality of the culture name is not validated. + + The public key or public key token of the assembly. + Indicates whether represents a public key. + Indicates whether the assembly is retargetable. + Specifies the binding model for how this object will be treated in comparisons. + If is null, empty or contains a NUL character. + If contains a NUL character. + is not a value of the enumeration. + contains values that are not greater than or equal to zero and less than or equal to ushort.MaxValue. + is true and is not set. + is false and + contains a value that is not the size of a public key token, 8 bytes. + + + + The simple name of the assembly. + + + + + The version of the assembly. + + + + + The culture name of the assembly, or empty if the culture is neutral. + + + + + The AssemblyNameFlags. + + + + + Specifies assembly binding model for the assembly definition or reference; + that is how assembly references are matched to assembly definitions. + + + + + True if the assembly identity includes full public key. + + + + + Full public key or empty. + + + + + Low 8 bytes of SHA1 hash of the public key, or empty. + + + + + True if the assembly identity has a strong name, ie. either a full public key or a token. + + + + + Gets the value which specifies if the assembly is retargetable. + + + + + Determines whether two instances are equal. + + The operand appearing on the left side of the operator. + The operand appearing on the right side of the operator. + + + + Determines whether two instances are not equal. + + The operand appearing on the left side of the operator. + The operand appearing on the right side of the operator. + + + + Determines whether the specified instance is equal to the current instance. + + The object to be compared with the current instance. + + + + Determines whether the specified instance is equal to the current instance. + + The object to be compared with the current instance. + + + + Returns the hash code for the current instance. + + + + + + Returns true (false) if specified assembly identities are (not) equal + regardless of unification, retargeting or other assembly binding policies. + Returns null if these policies must be consulted to determine name equivalence. + + + + + Retrieves assembly definition identity from given runtime assembly. + + The runtime assembly. + Assembly definition identity. + is null. + + + + Returns the display name of the assembly identity. + + True if the full public key should be included in the name. Otherwise public key token is used. + The display name. + + Characters ',', '=', '"', '\'', '\' occurring in the simple name are escaped by backslash in the display name. + Any character '\t' is replaced by two characters '\' and 't', + Any character '\n' is replaced by two characters '\' and 'n', + Any character '\r' is replaced by two characters '\' and 'r', + The assembly name in the display name is enclosed in double quotes if it starts or ends with + a whitespace character (' ', '\t', '\r', '\n'). + + + + + Returns the display name of the current instance. + + + + + Parses display name filling defaults for any basic properties that are missing. + + Display name. + A full assembly identity. + + Parts of the assembly identity that were specified in the display name, + or 0 if the parsing failed. + + True if display name parsed correctly. + + The simple name has to be non-empty. + A partially specified version might be missing build and/or revision number. The default value for these is 65535. + The default culture is neutral ( is . + If neither public key nor token is specified the identity is considered weak. + + is null. + + + + Compares assembly identities. + Derived types may implement platform specific unification and portability policies. + + + + + A set of possible outcomes of comparison. + + + + + Reference doesn't match definition. + + + + + Strongly named reference matches strongly named definition (strong identity is identity with public key or token), + Or weak reference matches weak definition. + + + + + Reference matches definition except for version (reference version is lower or higher than definition version). + + + + + Compares assembly reference name (possibly partial) with definition identity. + + Partial or full assembly display name. + Full assembly display name. + True if the reference name matches the definition identity. + + + + Compares assembly reference identity with definition identity. + + Reference assembly identity. + Full assembly display name. + True if the reference identity matches the definition identity. + + + + Compares reference assembly identity with definition identity and returns their relationship. + + Reference identity. + Definition identity. + + + + Implements a map from an assembly identity to a value. The map allows to look up the value by an identity + that either exactly matches the original identity key, or corresponds to a key with the lowest version among identities + with higher version than the requested identity key. + + + + + Represents an immutable snapshot of assembly CLI metadata. + + + + + Factory that provides the for additional modules (other than ) of the assembly. + Shall only throw or . + Null of all modules were specified at construction time. + + + + + Modules the was created with, in case they are eagerly allocated. + + + + + Cached assembly symbols. + + + Guarded by . + + + + + Creates a single-module assembly. + + + Manifest module image. + + is null. + + + + Creates a single-module assembly. + + + Manifest module image. + + is null. + The PE image format is invalid. + + + + Creates a single-module assembly. + + Manifest module PE image stream. + False to close the stream upon disposal of the metadata. + The PE image format is invalid. + + + + Creates a single-module assembly. + + Manifest module PE image stream. + False to close the stream upon disposal of the metadata. + The PE image format is invalid. + + + + Finds all modules of an assembly on a specified path and builds an instance of that represents them. + + The full path to the assembly on disk. + is null. + is invalid. + Error reading file . See for details. + Reading from a file path is not supported by the platform. + + + + Creates a single-module assembly. + + + Manifest module. + + This object disposes it when it is itself disposed. + + + + Creates a multi-module assembly. + + + Modules comprising the assembly. The first module is the manifest module of the assembly. + This object disposes the elements of it when it is itself . + is default value. + contains null elements. + is empty or contains a module that doesn't own its image (was created via ). + + + + Creates a multi-module assembly. + + + Modules comprising the assembly. The first module is the manifest module of the assembly. + This object disposes the elements of it when it is itself . + is default value. + contains null elements. + is empty or contains a module that doesn't own its image (was created via ). + + + + Creates a multi-module assembly. + + Modules comprising the assembly. The first module is the manifest module of the assembly. + This object disposes the elements of it when it is itself . + is default value. + contains null elements. + is empty or contains a module that doesn't own its image (was created via ). + + + + Creates a shallow copy of contained modules and wraps them into a new instance of . + + + The resulting copy shares the metadata images and metadata information read from them with the original. + It doesn't own the underlying metadata images and is not responsible for its disposal. + + This is used, for example, when a metadata cache needs to return the cached metadata to its users + while keeping the ownership of the cached metadata object. + + + + + Modules comprising this assembly. The first module is the manifest module. + + The PE image format is invalid. + IO error reading the metadata. See for details. + The object has been disposed. + + + The PE image format is invalid. + IO error while reading the metadata. See for details. + The object has been disposed. + + + The PE image format is invalid. + IO error while reading the metadata. See for details. + The object has been disposed. + + + + Disposes all modules contained in the assembly. + + + + + Checks if the first module has a single row in Assembly table and that all other modules have none. + + The PE image format is invalid. + IO error reading the metadata. See for details. + The object has been disposed. + + + + Returns the metadata kind. + + + + + Creates a reference to the assembly metadata. + + Provider of XML documentation comments for the metadata symbols contained in the module. + Aliases that can be used to refer to the assembly from source code (see "extern alias" directive in C#). + True to embed interop types from the referenced assembly to the referencing compilation. Must be false for a module. + Path describing the location of the metadata, or null if the metadata have no location. + Display string used in error messages to identity the reference. + A reference to the assembly metadata. + + + + Reference to another C# or VB compilation. + + + + + Returns an instance of the reference with specified aliases. + + The new aliases for the reference. + Alias is invalid for the metadata kind. + + + + Returns an instance of the reference with specified aliases. + + The new aliases for the reference. + Alias is invalid for the metadata kind. + + + + Returns an instance of the reference with specified interop types embedding. + + The new value for . + Interop types can't be embedded from modules. + + + + Returns an instance of the reference with specified properties, or this instance if properties haven't changed. + + The new properties for the reference. + Specified values not valid for this reference. + + + + An Id that can be used to identify a metadata instance. If two metadata instances + have the same id then they are guaranteed to have the same content. If two metadata + instances have different ids, then the contents may or may not be the same. As such, + the id is useful as a key in a cache when a client wants to share data for a metadata + reference as long as it has not changed. + + + + + Represents immutable assembly or module CLI metadata. + + + + + The id for this metadata instance. If two metadata instances have the same id, then + they have the same content. If they have different ids they may or may not have the + same content. + + + + + Retrieves the for this instance. + + + + + Releases any resources associated with this instance. + + + + + Creates a copy of this object. + + + + + The kind of metadata a PE file image contains. + + + + + The PE file is an assembly. + + + + + The PE file is a module. + + + + + Represents an in-memory Portable-Executable image. + + + + + Represents metadata image reference. + + + Represents a logical location of the image, not the content of the image. + The content might change in time. A snapshot is taken when the compiler queries the reference for its metadata. + + + + + Path or name used in error messages to identity the reference. + + + + + Returns true if this reference is an unresolved reference. + + + + + Returns an instance of the reference with specified aliases. + + The new aliases for the reference. + Alias is invalid for the metadata kind. + + + + Returns an instance of the reference with specified interop types embedding. + + The new value for . + Interop types can't be embedded from modules. + + + + Returns an instance of the reference with specified aliases. + + The new aliases for the reference. + Alias is invalid for the metadata kind. + + + + Returns an instance of the reference with specified properties, or this instance if properties haven't changed. + + The new properties for the reference. + Specified values not valid for this reference. + + + + Creates a reference to a single-module assembly or a standalone module stored in memory. + + Assembly image. + Reference properties (extern aliases, type embedding, ). + Provides XML documentation for symbol found in the reference. + Optional path that describes the location of the metadata. The file doesn't need to exist on disk. The path is opaque to the compiler. + + Performance considerations: + + It is recommended to use or + API when creating multiple references to the same metadata. + Reusing object to create multiple references allows for sharing data across these references. + + + The method pins in managed heap. The pinned memory is released + when the resulting reference becomes unreachable and GC collects it. To control the lifetime of the pinned memory + deterministically use + to create an metadata object and + to get a reference to it. + + + The method creates a reference to a single-module assembly. To create a reference to a multi-module assembly or a stand-alone module use + and . + + + is null. + + + + Creates a reference to a single-module assembly or a standalone module stored in memory. + + Assembly image. + Reference properties (extern aliases, type embedding, ). + Provides XML documentation for symbol found in the reference. + Optional path that describes the location of the metadata. The file doesn't need to exist on disk. The path is opaque to the compiler. + + Performance considerations: + + It is recommended to use or + API when creating multiple references to the same metadata. + Reusing object to create multiple references allows for sharing data across these references. + + + The method makes a copy of the data and pins it. To avoid making a copy use an overload that takes an . + The pinned memory is released when the resulting reference becomes unreachable and GC collects it. To control the lifetime of the pinned memory + deterministically use + to create an metadata object and + to get a reference to it. + + + is null. + + + + Creates a reference to a single-module assembly or a stand-alone module from data in specified stream. + Reads the content of the stream into memory and closes the stream upon return. + + Assembly image. + Reference properties (extern aliases, type embedding, ). + Provides XML documentation for symbol found in the reference. + Optional path that describes the location of the metadata. The file doesn't need to exist on disk. The path is opaque to the compiler. + doesn't support read and seek operations. + is null. + An error occurred while reading the stream. + + Performance considerations: + + It is recommended to use or + API when creating multiple references to the same metadata. + Reusing object to create multiple references allows for sharing data across these references. + + + The method eagerly reads the entire content of into native heap. The native memory block is released + when the resulting reference becomes unreachable and GC collects it. To decrease memory footprint of the reference and/or manage + the lifetime deterministically use + to create an metadata object and + + to get a reference to it. + + + + + + Creates a reference to an assembly or standalone module stored in a file. + Reads the content of the file into memory. + + Path to the assembly file. + Reference properties (extern aliases, type embedding, ). + Provides XML documentation for symbol found in the reference. + is null. + is invalid. + An error occurred while reading the file. + + Performance considerations: + + It is recommended to use or + API when creating multiple references to the same file. + Reusing object allows for sharing data across these references. + + + The method eagerly reads the entire content of the file into native heap. The native memory block is released + when the resulting reference becomes unreachable and GC collects it. To decrease memory footprint of the reference and/or manage + the lifetime deterministically use + to create an metadata object and + + to get a reference to it. + + + + + + Creates a reference to a loaded assembly. + + Path to the module file. + is null. + is dynamic, doesn't have a location, or the platform doesn't support reading from the location. + + Performance considerations: + + It is recommended to use API when creating multiple references to the same assembly. + Reusing object allows for sharing data across these references. + + + + + + Creates a reference to a loaded assembly. + + Path to the module file. + Reference properties (extern aliases, type embedding). + Provides XML documentation for symbol found in the reference. + is null. + . is not . + is dynamic, doesn't have a location, or the platform doesn't support reading from the location. + + Performance considerations: + + It is recommended to use API when creating multiple references to the same assembly. + Reusing object allows for sharing data across these references. + + + + + + Information about a metadata reference. + + + + + Default properties for a module reference. + + + + + Default properties for an assembly reference. + + + + + Initializes reference properties. + + The image kind - assembly or module. + Assembly aliases. Can't be set for a module. + True to embed interop types from the referenced assembly to the referencing compilation. Must be false for a module. + + + + Returns with specified aliases. + + + is , as modules can't be aliased. + + + + + Returns with specified aliases. + + + is , as modules can't be aliased. + + + + + Returns with set to specified value. + + is , as interop types can't be embedded from modules. + + + + Returns with set to specified value. + + + + + The image kind (assembly or module) the reference refers to. + + + + + Alias that represents a global declaration space. + + + Namespaces in references whose contain are available in global declaration space. + + + + + Aliases for the metadata reference. Empty if the reference has no aliases. + + + In C# these aliases can be used in "extern alias" syntax to disambiguate type names. + + + + + True if interop types defined in the referenced metadata should be embedded into the compilation referencing the metadata. + + + + + True to apply recursively on the target assembly and on all its transitive dependencies. + False to apply only on the target assembly. + + + + + Resolves references to metadata specified in the source (#r directives). + + + + + True to instruct the compiler to invoke for each assembly reference that + doesn't match any of the assemblies explicitly referenced by the (via , or #r directives. + + + + + Resolves a missing assembly reference. + + The metadata definition (assembly or module) that declares assembly reference in its list of dependencies. + Identity of the assembly reference that couldn't be resolved against metadata references explicitly specified to in the compilation. + Resolved reference or null if the identity can't be resolved. + + + + Represents an immutable snapshot of module CLI metadata. + + This object may allocate significant resources or lock files depending upon how it is constructed. + + + + Optional action to invoke when this metadata is disposed. + + + + + Create metadata module from a raw memory pointer to metadata directory of a PE image or .cormeta section of an object file. + Only manifest modules are currently supported. + + Pointer to the start of metadata block. + The size of the metadata block. + is null. + is not positive. + + + + Create metadata module from a raw memory pointer to metadata directory of a PE image or .cormeta section of an object file. + Only manifest modules are currently supported. + + Pointer to the start of metadata block. + The size of the metadata block. + Action to run when the metadata module is disposed. This will only be called then + this actual metadata instance is disposed. Any instances created from this using will not call this when they are disposed. + is null. + + + + Create metadata module from a raw memory pointer to a PE image or an object file. + + Pointer to the DOS header ("MZ") of a portable executable image. + The size of the image pointed to by . + is null. + is not positive. + + + + Create metadata module from a sequence of bytes. + + The portable executable image beginning with the DOS header ("MZ"). + is null. + + + + Create metadata module from a byte array. + + Portable executable image beginning with the DOS header ("MZ"). + is null. + + + + Create metadata module from a stream. + + Stream containing portable executable image. Position zero should contain the first byte of the DOS header ("MZ"). + + False to close the stream upon disposal of the metadata (the responsibility for disposal of the stream is transferred upon entry of the constructor + unless the arguments given are invalid). + + is null. + The stream doesn't support seek operations. + + + + Create metadata module from a stream. + + Stream containing portable executable image. Position zero should contain the first byte of the DOS header ("MZ"). + + Options specifying how sections of the PE image are read from the stream. + Unless is specified, the responsibility for disposal of the stream is transferred upon entry of the constructor + unless the arguments given are invalid. + + is null. + The stream doesn't support read and seek operations. + has an invalid value. + + or is specified and the PE headers of the image are invalid. + + + or is specified and an error occurs while reading the stream. + + + + + Creates metadata module from a file containing a portable executable image. + + File path. + + The file might remain mapped (and read-locked) until this object is disposed. + The memory map is only created for large files. Small files are read into memory. + + is null. + is invalid. + Error opening file . See for details. + File not found. + Reading from a file path is not supported by the platform. + + + + Creates a shallow copy of this object. + + + The resulting copy shares the metadata image and metadata information read from it with the original. + It doesn't own the underlying metadata image and is not responsible for its disposal. + + This is used, for example, when a metadata cache needs to return the cached metadata to its users + while keeping the ownership of the cached metadata object. + + + + + Frees memory and handles allocated for the module. + + + + + True if the module has been disposed. + + + + + Name of the module. + + Invalid metadata. + Module has been disposed. + + + + Version of the module content. + + Invalid metadata. + Module has been disposed. + + + + Returns the for this instance. + + + + + Returns the file names of linked managed modules. + + When an invalid module name is encountered. + Module has been disposed. + + + + Returns the metadata reader. + + Module has been disposed. + When an invalid module name is encountered. + + + + Creates a reference to the module metadata. + + Provider of XML documentation comments for the metadata symbols contained in the module. + Path describing the location of the metadata, or null if the metadata have no location. + Display string used in error messages to identity the reference. + A reference to the module metadata. + + + + Reference to metadata stored in the standard ECMA-335 metadata format. + + + + + Display string used in error messages to identity the reference. + + + + + Path describing the location of the metadata, or null if the metadata have no location. + + + + + XML documentation comments provider for the reference. + + + + + Create documentation provider for the reference. + + + Called when the compiler needs to read the documentation for the reference. + This method can be called multiple times from different threads. The result of one of the calls + is cached on the reference object. + + + + + Returns an instance of the reference with specified aliases. + + The new aliases for the reference. + Alias is invalid for the metadata kind. + + + + Returns an instance of the reference with specified aliases. + + The new aliases for the reference. + Alias is invalid for the metadata kind. + + + + Returns an instance of the reference with specified interop types embedding. + + The new value for . + Interop types can't be embedded from modules. + + + + Returns an instance of the reference with specified properties, or this instance if properties haven't changed. + + The new properties for the reference. + Specified values not valid for this reference. + + + + Returns an instance of the reference with specified properties. + + The new properties for the reference. + Specified values not supported. + Only invoked if the properties changed. + + + + Get metadata representation for the PE file. + + If the PE image format is invalid. + The metadata image content can't be read. + The metadata image is stored in a file that can't be found. + + Called when the needs to read the reference metadata. + + The listed exceptions are caught and converted to compilation diagnostics. + Any other exception is considered an unexpected error in the implementation and is not caught. + + objects may cache information decoded from the PE image. + Reusing instances across metadata references will result in better performance. + + The calling doesn't take ownership of the objects returned by this method. + The implementation needs to retrieve the object from a provider that manages their lifetime (such as metadata cache). + The object is kept alive by the that called + and by all compilations created from it via calls to With- factory methods on , + other than overloads. A compilation created using + will call to again. + + + + + Returns a copy of the object this + contains. This copy does not need to be d. + + If the PE image format is invalid. + The metadata image content can't be read. + The metadata image is stored in a file that can't be found. + + + + Returns the for this reference's . + This will be equivalent to calling ., + but can be done more efficiently. + + If the PE image format is invalid. + The metadata image content can't be read. + The metadata image is stored in a file that can't be found. + + + + Represents the value of #r reference along with its source location. + + + + + Represents a metadata reference that can't be or is not yet resolved. + + + For error reporting only, can't be used to reference a metadata file. + + + + + Root type for representing the abstract semantics of C# and VB statements and expressions. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + IOperation that has this operation as a child. Null for the root. + + + + + Identifies the kind of the operation. + + + + + Syntax that was analyzed to produce the operation. + + + + + Result type of the operation, or null if the operation does not produce a result. + + + + + If the operation is an expression that evaluates to a constant value, is true and is the value of the expression. Otherwise, is false. + + + + + An array of child operations for this operation. Deprecated: please use . + + + + + An enumerable of child operations for this operation. + + + + + The source language of the IOperation. Possible values are and . + + + + + Set to True if compiler generated /implicitly computed by compiler code + + + + + Optional semantic model that was used to generate this operation. + Non-null for operations generated from source with API + and operation callbacks made to analyzers. + Null for operations inside a . + + + + + Implements a struct-based collection of nodes. This collection is ordered, but + random access into the collection is not provided. + + + + + Implements a struct-based enumerator for nodes. This type is not hardened + to default(Enumerator), and will null reference in these cases. Calling after + has returned false will throw an . + + + + + Implementation of the and + members are delegated to the virtual and + methods, respectively. + + + + + + + + + + Implements a reverse-order struct-based collection of nodes. + This collection is ordered, but random access into the collection is not provided. + + + + + Implements a reverse-order struct-based enumerator for nodes. This type is not hardened + to default(Enumerator), and will null reference in these cases. Calling after + has returned false will throw an . + + + + + Root type for representing the abstract semantics of C# and VB statements and expressions. + + + + + IOperation that has this operation as a child + + + + + Set to True if compiler generated /implicitly computed by compiler code + + + + + Identifies the kind of the operation. + + + + + Syntax that was analyzed to produce the operation. + + + + + Result type of the operation, or null if the operation does not produce a result. + + + + + The source language of the IOperation. Possible values are and . + + + + + If the operation is an expression that evaluates to a constant value, is true and is the value of the expression. Otherwise, is false. + + + + + + + + A slot of -1 means start at the beginning. + + + + + A slot of int.MaxValue means start from the end. + + + + + Gets the owning semantic model for this operation node. + Note that this may be different than , which + is the semantic model on which was invoked + to create this node. + + + + + Populates a empty dictionary of SyntaxNode->IOperation, where every key corresponds to an explicit IOperation node. + If there is a SyntaxNode with more than one explicit IOperation, this will throw. + + + + + Combines a value, , and a flag, , + indicating whether or not that value is meaningful. + + The type of the value. + + + + Constructs an with a meaningful value. + + + + + + Returns if the will return a meaningful value. + + + + + + Gets the value of the current object. Not meaningful unless returns . + + + Unlike , this property does not throw an exception when + is . + + + The value if is ; otherwise, the default value for type + . + + + + + Creates a new object initialized to a meaningful value. + + + + + + Returns a string representation of this object. + + + + + Specifies output assembly kinds generated by compiler. + + + + + An .exe with an entry point and a console. + + + + + An .exe with an entry point but no console. + + + + + A .dll file. + + + + + A .netmodule file. + + + + + A .winmdobj file. + + + + + An .exe that can run in an app container. + + Equivalent to a WindowsApplication, but with an extra bit set in the Portable Executable file + so that the application can only be run in an app container. + Also known as a "Windows Store app". + + + + + + A set of utilities for converting from a decimal floating-point literal string to its IEEE float + or double representation, which considers all digits significant and correctly rounds according to + the IEEE round-to-nearest-ties-to-even mode. This code does not support a leading sign character, + as that is not part of the C# or VB floating-point literal lexical syntax. + + If you change this code, please run the set of long-running random tests in the solution + RandomRealParserTests.sln. That solution is not included in Roslyn.sln as it is Windows-specific. + + + + + Try parsing a correctly-formatted double floating-point literal into the nearest representable double + using IEEE round-to-nearest-ties-to-even rounding mode. Behavior is not defined for inputs that are + not valid C# floating-point literals. + + The decimal floating-point constant's string + The nearest double value, if conversion succeeds + True if the input was converted; false if there was an overflow + + + + Try parsing a correctly-formatted float floating-point literal into the nearest representable float + using IEEE round-to-nearest-ties-to-even rounding mode. Behavior is not defined for inputs that are + not valid C# floating-point literals. + + The float floating-point constant's string + The nearest float value, if conversion succeeds + True if the input was converted; false if there was an overflow + + + + Properties of an IEEE floating-point representation. + + + + + Converts the floating point value 0.mantissa * 2^exponent into the + correct form for the FloatingPointType and stores the bits of the resulting value + into the result object. + The caller must ensure that the mantissa and exponent are correctly computed + such that either [1] the most significant bit of the mantissa is in the + correct position for the FloatingType, or [2] the exponent has been correctly + adjusted to account for the shift of the mantissa that will be required. + + This function correctly handles range errors and stores a zero or infinity in + the result object on underflow and overflow errors, respectively. This + function correctly forms denormal numbers when required. + + If the provided mantissa has more bits of precision than can be stored in the + result object, the mantissa is rounded to the available precision. Thus, if + possible, the caller should provide a mantissa with at least one more bit of + precision than is required, to ensure that the mantissa is correctly rounded. + (The caller should not round the mantissa before calling this function.) + + The bits of the mantissa + The exponent + Whether there are any nonzero bits past the supplied mantissa + Where the bits of the floating-point number are stored + A status indicating whether the conversion succeeded and why + + + + Properties of a C# float. + + + + + Properties of a C# double. + + + + + This type is used to hold a partially-parsed string representation of a + floating point number. The number is stored in the following form: +
+                0.Mantissa * 10^Exponent
+             
+ The Mantissa buffer stores the mantissa digits as characters in a string. + The MantissaCount gives the number of digits present in the Mantissa buffer. + There shall be neither leading nor trailing zero digits in the Mantissa. + Note that this represents only nonnegative floating-point literals; the + negative sign in C# and VB is actually a separate unary negation operator. +
+
+ + + Create a DecimalFloatingPointString from a string representing a floating-point literal. + + The text of the floating-point literal + + + + Convert a DecimalFloatingPointString to the bits of the given floating-point type. + + + + + This function is part of the fast track for integer floating point strings. + It takes an integer stored as an array of bytes (lsb first) and converts the value into its FloatingType + representation, storing the bits into "result". If the value is not + representable, +/-infinity is stored and overflow is reported (since this + function only deals with integers, underflow is impossible). + + the bits of the integer, least significant bits first + the number of bits of precision in integerValueAsBytes + whether there are nonzero digits after the decimal + the kind of real number to build + the result + An indicator of the kind of result + + + + Parse a sequence of digits into a BigInteger. + + The DecimalFloatingPointString containing the digits in its Mantissa + The index of the first digit to convert + The index just past the last digit to convert + The BigInteger result + + + + Return the number of significant bits set. + + + + + Return the number of significant bits set. + + + + + Return the number of significant bits set. + + + + + Return the number of significant bits set. + + + + + Computes value / 2^shift, then rounds the result according to the current + rounding mode. By the time we call this function, we will already have + discarded most digits. The caller must pass true for has_zero_tail if + all discarded bits were zeroes. + + The value to shift + The amount of shift + Whether there are any less significant nonzero bits in the value + + + + + Determines whether a mantissa should be rounded up in the + round-to-nearest-ties-to-even mode given [1] the value of the least + significant bit of the mantissa, [2] the value of the next bit after + the least significant bit (the "round" bit) and [3] whether any + trailing bits after the round bit are set. + + The mantissa is treated as an unsigned integer magnitude. + + For this function, "round up" is defined as "increase the magnitude" of the + mantissa. + + the least-significant bit of the representable value + the bit following the least-significant bit + true if there are any (less significant) bits set following roundBit + + + + + Multiply a BigInteger by the given power of two. + + The BigInteger to multiply by a power of two and replace with the product + The power of two to multiply it by + + + + Multiply a BigInteger by the given power of ten. + + The BigInteger to multiply by a power of ten and replace with the product + The power of ten to multiply it by + + + + Convert a float value to the bits of its representation + + + + + Convert the bits of its representation to a float + + + + + A union used to convert between a float and the bits of its representation + + + + + The base class for language specific assembly managers. + + Language specific representation for a compilation + Language specific representation for an assembly symbol. + + + + Information about an assembly, used as an input for the Binder class. + + + + + Identity of the assembly. + + + + + Identity of assemblies referenced by this assembly. + References should always be returned in the same order. + + + + + The sequence of AssemblySymbols the Binder can choose from. + + + + + Check if provided AssemblySymbol is created for assembly described by this instance. + This method is expected to return true for every AssemblySymbol returned by + AvailableSymbols property. + + + The AssemblySymbol to check. + + Boolean. + + + + Resolve assembly references against assemblies described by provided AssemblyData objects. + In other words, match assembly identities returned by AssemblyReferences property against + assemblies described by provided AssemblyData objects. + + An array of AssemblyData objects to match against. + Used to compare assembly identities. + + For each assembly referenced by this assembly () + a description of how it binds to one of the input assemblies. + + + + + Get the source compilation backing this assembly, if one exists. + Returns null otherwise. + + + + + Result of binding an AssemblyRef to an AssemblyDef. + + + + + Failed binding. + + + + + Successful binding. + + + + + Returns true if the reference was matched with the identity of the assembly being built. + + + + + True if the definition index is available (reference was successfully matched with the definition). + + + + + 0 if the reference is equivalent to the definition. + -1 if version of the matched definition is lower than version of the reference, but the reference otherwise matches the definition. + +1 if version of the matched definition is higher than version of the reference, but the reference otherwise matches the definition. + + Undefined unless is true. + + + + + Index into assembly definition list. + Undefined unless is true. + + + + + Private helper class to capture information about AssemblySymbol instance we + should check for suitability. Used by the Bind method. + + + + + An index of the AssemblyData object in the input array. AssemblySymbol instance should + be checked for suitability against assembly described by that object, taking into account + assemblies described by other AssemblyData objects in the input array. + + + + + AssemblySymbol instance to check for suitability. + + + + + Convenience constructor to initialize fields of this structure. + + + + + Result of binding an input assembly and its references. + + + + + Suitable AssemblySymbol instance for the corresponding assembly, + null reference if none is available/found. + + + + + For each AssemblyRef of this AssemblyDef specifies which AssemblyDef matches the reference. + + + Result of resolving assembly references of the corresponding assembly + against provided set of assemblies. Essentially, this is an array returned by + AssemblyData.BindAssemblyReferences method. + + Each element describes the assembly the corresponding reference of the input assembly + is bound to. + + + + + For the given set of AssemblyData objects, do the following: + 1) Resolve references from each assembly against other assemblies in the set. + 2) Choose suitable AssemblySymbol instance for each AssemblyData object. + + The first element (index==0) of the assemblies array represents the assembly being built. + One can think about the rest of the items in assemblies array as assembly references given to the compiler to + build executable for the assembly being built. + + Compilation. + + An array of objects describing assemblies, for which this method should + resolve references and find suitable AssemblySymbols. The first slot contains the assembly being built. + + + An array of objects describing standalone modules referenced by the compilation. + + + An array of references passed to the compilation and resolved from #r directives. + May contain references that were skipped during resolution (they don't have a corresponding explicit assembly). + + + Maps index to to an index of a resolved assembly or module in or modules. + + + Reference resolver used to look up missing assemblies. + + + Hide lower versions of dependencies that have multiple versions behind an alias. + + + Used to filter out assemblies that have the same strong or weak identity. + Maps simple name to a list of identities. The highest version of each name is the first. + + + Import options applied to implicitly resolved references. + + + Updated array with resolved implicitly referenced assemblies appended. + + + Implicitly resolved references. + + + Maps indices of implicitly resolved references to the corresponding indices of resolved assemblies in (explicit + implicit). + + + Map of implicit reference resolutions performed in the preceding script compilation. + Output contains additional implicit resolutions performed during binding of this script compilation references. + + + Any diagnostics reported while resolving missing assemblies. + + + True if the assembly being compiled is indirectly referenced through some of its own references. + + + The definition index of the COR library. + + + An array of structures describing the result. It has the same amount of items as + the input assemblies array, for each input AssemblyData object resides + at the same position. + + Each contains the following data: + + - Suitable AssemblySymbol instance for the corresponding assembly, + null reference if none is available/found. Always null for the first element, which corresponds to the assembly being built. + + - Result of resolving assembly references of the corresponding assembly + against provided set of assembly definitions. Essentially, this is an array returned by + method. + + + + + Resolve using a given . + + We make sure not to query the resolver for the same identity multiple times (across submissions). + Doing so ensures that we don't create multiple assembly symbols within the same chain of script compilations + for the same implicitly resolved identity. Failure to do so results in cast errors like "can't convert T to T". + + The method only records successful resolution results by updating . + Failures are only recorded after all resolution attempts have been completed. + + This approach addresses the following scenario. Consider a script: + + #r "dir1\a.dll" + #r "dir2\b.dll" + + where both a.dll and b.dll reference x.dll, which is present only in dir2. Let's assume the resolver first + attempts to resolve "x" referenced from "dir1\a.dll". The resolver may fail to find the dependency if it only + looks up the directory containing the referencing assembly (dir1). If we recorded and this failure immediately + we would not call the resolver to resolve "x" within the context of "dir2\b.dll" (or any other referencing assembly). + + This behavior would ensure consistency and if the types from x.dll do leak thru to the script compilation, but it + would result in a missing assembly error. By recording the failure after all resolution attempts are complete + we also achieve a consistent behavior but are able to bind the reference to "x.dll". Besides, this approach + also avoids dependency on the order in which we evaluate the assembly references in the scenario above. + In general, the result of the resolution may still depend on the order of #r - if there are different assemblies + of the same identity in different directories. + + + + + Determines if it is possible that gives internals + access to assembly . It does not make a conclusive + determination of visibility because the compilation's strong name key is not supplied. + + + + + Compute AssemblySymbols referenced by the input AssemblySymbol and fill in with the result. + The AssemblySymbols must correspond + to the AssemblyNames returned by AssemblyData.AssemblyReferences property. If reference is not + resolved, null reference should be returned in the corresponding item. + + The target AssemblySymbol instance. + A list which will be filled in with + AssemblySymbols referenced by the input AssemblySymbol. The caller is expected to clear + the list before calling this method. + Implementer may not cache the list; the caller may mutate it. + + + + Return collection of assemblies involved in canonical type resolution of + NoPia local types defined within target assembly. In other words, all + references used by previous compilation referencing the target assembly. + + + + + Assembly is /l-ed by compilation that is using it as a reference. + + + + + Get Assembly used as COR library for the candidate. + + + + + Checks if the properties of are compatible with properties of . + Reports inconsistencies to the given diagnostic bag. + + True if the properties are compatible and hence merged, false if the duplicate reference should not merge it's properties with primary reference. + + + + Called to compare two weakly named identities with the same name. + + + + + Aliases that should be applied to the referenced assembly. + Empty array means {"global"} (all namespaces and types in the global namespace of the assembly are accessible without qualification). + Null if not applicable (the reference only has recursive aliases). + + + + + Aliases that should be applied recursively to all dependent assemblies. + Empty array means {"global"} (all namespaces and types in the global namespace of the assembly are accessible without qualification). + Null if not applicable (the reference only has simple aliases). + + + + + default() is considered skipped. + + + + + Index into an array of assemblies (not including the assembly being built) or an array of modules, depending on . + + + + + non-negative: Index into the array of all (explicitly and implicitly) referenced assemblies. + negative: ExplicitlyReferencedAssemblies.Count + RelativeAssemblyIndex is an index into the array of assemblies. + + + + + Resolves given metadata references to assemblies and modules. + + The compilation whose references are being resolved. + + Used to filter out assemblies that have the same strong or weak identity. + Maps simple name to a list of identities. The highest version of each name is the first. + + List where to store resolved references. References from #r directives will follow references passed to the compilation constructor. + Maps #r values to successfully resolved metadata references. Does not contain values that failed to resolve. + Unique metadata references resolved from #r directives. + List where to store information about resolved assemblies to. + List where to store information about resolved modules to. + Diagnostic bag where to report resolution errors. + + Maps index to to an index of a resolved assembly or module in or , respectively. + + + + + Creates or gets metadata for PE reference. + + + If any of the following exceptions: , , , + are thrown while reading the metadata file, the exception is caught and an appropriate diagnostic stored in . + + + + + Determines whether references are the same. Compilation references are the same if they refer to the same compilation. + Otherwise, references are represented by their object identities. + + + + + Merges aliases of the first observed reference () with aliases specified for an equivalent reference (). + Empty alias list is considered to be the same as a list containing "global", since in both cases C# allows unqualified access to the symbols. + + + + + Caller is responsible for freeing any allocated ArrayBuilders. + + + + + Caller is responsible for freeing any allocated ArrayBuilders. + + + + + Returns null if an assembly of an equivalent identity has not been added previously, otherwise returns the reference that added it. + Two identities are considered equivalent if + - both assembly names are strong (have keys) and are either equal or FX unified + - both assembly names are weak (no keys) and have the same simple name. + + + + + For each given directive return a bound PE reference, or null if the binding fails. + + + + + Used to match AssemblyRef with AssemblyDef. + + Array of definition identities to match against. + An index of the first definition to consider, preceding this index are ignored. + Reference identity to resolve. + Assembly identity comparer. + + Returns an index the reference is bound. + + + + + If the compilation being built represents an assembly its assembly name. + If the compilation being built represents a module, the name of the + containing assembly or + if not specified (/moduleassemblyname command line option). + + + + + Used to compares assembly identities. + May implement unification and portability policies specific to the target platform. + + + + + Metadata observed by the compiler. + May be shared across multiple Reference Managers. + Access only under lock(). + + + + + Once this is non-zero the state of the manager is fully initialized and immutable. + + + + + True if the compilation has a reference that refers back to the assembly being compiled. + + + If we have a circular reference the bound references can't be shared with other compilations. + + + + + A map from a metadata reference to an index to array. Do not access + directly, use property instead. + + + + + A map from a net-module metadata reference to the index of the corresponding module + symbol in the source assembly symbol for the current compilation. + + + Subtract one from the index (for the manifest module) to find the corresponding elements + of and . + + + + + Maps (containing syntax tree file name, reference string) of #r directive to a resolved metadata reference. + If multiple #r's in the same tree use the same value as a reference the resolved metadata reference is the same as well. + + + + + Array of unique bound #r references. + + + The references are in the order they appear in syntax trees. This order is currently preserved + as syntax trees are added or removed, but we might decide to share reference manager between compilations + with different order of #r's. It doesn't seem this would be an issue since all #r's within the compilation + have the same "priority" with respect to each other. + + + + + Stores the results of implicit reference resolutions. + If is true the reference manager attempts to resolve assembly identities, + that do not match any explicit metadata references passed to the compilation (or specified via #r directive). + For each such assembly identity is called + and its result is captured in this map. + The map also stores failures - the reference is null if the assembly of the given identity is not found by the resolver. + This is important to maintain consistency, especially across multiple submissions (e.g. the reference is not found during compilation of the first submission + but then it is available when the second submission is compiled). + + + + + Diagnostics produced during reference resolution and binding. + + + When reporting diagnostics be sure not to include any information that can't be shared among + compilations that share the same reference manager (such as full identity of the compilation, + simple assembly name is ok). + + + + + COR library symbol, or null if the compilation itself is the COR library. + + + If the compilation being built is the COR library we don't want to store its source assembly symbol + here since we wouldn't be able to share the state among subsequent compilations that are derived from it + (each of them has its own source assembly symbol). + + + + + Standalone modules referenced by the compilation (doesn't include the manifest module of the compilation). + + + [i] corresponds to [i]. + + + + + References of standalone modules referenced by the compilation (doesn't include the manifest module of the compilation). + + + [i] corresponds to [i]. + + + + + Assemblies referenced directly by the source module of the compilation. + + + + + Aliases used by assemblies referenced directly by the source module of the compilation. + + + Aliases [i] are of an assembly [i]. + + + + + A map capturing s that were "merged" to a single referenced assembly + associated with a key in the map. + The keys are a subset of keys from . + + + + + Unified assemblies referenced directly by the source module of the compilation. + + + + + Call only while holding . + + + + + Call only while holding . + + + + + Global namespaces of assembly references that have been superseded by an assembly reference with a higher version are + hidden behind to avoid ambiguity when they are accessed from source. + All existing aliases of a superseded assembly are discarded. + + + + + Calculates map from the identities of specified symbols to the corresponding identities in the original EnC baseline metadata. + The map only includes an entry for identities that differ, i.e. for symbols representing assembly references of the current compilation that have different identities + than the corresponding identity in baseline metadata AssemblyRef table. The key comparer of the map ignores build and revision parts of the version number, + since these might change if the original version included wildcard. + + Assembly symbols for references of the current compilation. + Identities in the baseline. [i] corresponds to [i]. + + + + Gets the that corresponds to the assembly symbol. + + + + + Must be acquired whenever the following data are about to be modified: + - Compilation.lazyAssemblySymbol + - Compilation.referenceManager + - ReferenceManager state + - + - + + All the above data should be updated at once while holding this lock. + Once lazyAssemblySymbol is set the Compilation.referenceManager field and ReferenceManager + state should not change. + + + + + Enumerates all referenced assemblies. + + + + + Enumerates all referenced assemblies and their aliases. + + + + + Adds aliases of a specified reference to the merged set of aliases. + Consider the following special cases: + + o {} + {} = {} + If neither reference has any aliases then the result has no aliases. + + o {A} + {} = {A, global} + {} + {A} = {A, global} + + If one and only one of the references has aliases we add the global alias since the + referenced declarations should now be accessible both via existing aliases + as well as unqualified. + + o {A, A} + {A, B, B} = {A, A, B, B} + We preserve dups in each alias array, but avoid making more dups when merging. + + + + + A record of the assemblies referenced by a module (their identities, symbols, and unification). + + + + + Identities of referenced assemblies (those that are or will be emitted to metadata). + + + Names[i] is the identity of assembly Symbols[i]. + + + + + Assembly symbols that the identities are resolved against. + + + Names[i] is the identity of assembly Symbols[i]. + Unresolved references are represented as MissingAssemblySymbols. + + + + + A subset of that correspond to references with non-matching (unified) + version along with unification details. + + + + + Assembly symbol referenced by a AssemblyRef for which we couldn't find a matching + compilation reference but we found one that differs in version. + Created only for assemblies that require runtime binding redirection policy, + i.e. not for Framework assemblies. + + + + + Original reference that was unified to the identity of the . + + + + + Representation of a resource whose contents are to be embedded in the output assembly. + + + + + Creates a representation of a resource whose contents are to be embedded in the output assembly. + + Resource name. + The callers will dispose the result after use. + This allows the resources to be opened and read one at a time. + + True if the resource is public. + + Returns a stream of the data to embed. + + + + + Creates a representation of a resource whose file name will be recorded in the assembly. + + Resource name. + File name with an extension to be stored in metadata. + The callers will dispose the result after use. + This allows the resources to be opened and read one at a time. + + True if the resource is public. + + Function returning a stream of the resource content (used to calculate hash). + + + + + Represents errors that occur while parsing RuleSet files. + + + + + Represents a set of rules as specified in a ruleset file. + + + + + The file path of the ruleset file. + + + + + The global option specified by the IncludeAll tag. + + + + + Individual rule ids and their associated actions. + + + + + List of rulesets included by this ruleset. + + + + + Create a RuleSet. + + + + + Create a RuleSet with a global effective action applied on it. + + + + + Get the effective ruleset after resolving all the included rulesets. + + + + + Get all the files involved in resolving this ruleset. + + + + + Returns true if the action1 is stricter than action2. + + + + + Load the ruleset from the specified file. This ruleset will contain + all the rules resolved from the includes specified in the ruleset file + as well. See also: . + + + A ruleset that contains resolved rules or null if there were errors. + + + + + Get the paths to all files contributing rules to the ruleset from the specified file. + See also: . + + + The full paths to included files, or an empty array if there were errors. + + + + + Parses the ruleset file at the given and returns the following diagnostic options from the parsed file: + 1) A map of from rule ID to option. + 2) A global option for all rules in the ruleset file. + + + + + Represents a Include tag in a RuleSet file. + + + + + The path of the included file. + + + + + The effective action to apply on this included ruleset. + + + + + Create a RuleSetInclude given the include path and the effective action. + + + + + Gets the RuleSet associated with this ruleset include + + The parent of this ruleset include + + + + Returns a full path to the include file. Relative paths are expanded relative to the current rule set file. + + The parent of this rule set include + + + + This type is responsible for parsing a ruleset xml file and producing a object. + + + + + Creates and loads the rule set from a file + + The file path to load the rule set + + + + Load the rule set from the XML node + + The rule set node from which to create a rule set object + The file path to the rule set file + A rule set object with data from the given XML node + + + + Load the rules from the XML node + + The rules node from which to loop through each child rule node + A list of rule objects with data from the given XML node + + + + Load the rule from the XML node + + The rule node from which to create a rule object + The analyzer this rule belongs to + The namespace this rule belongs to + A rule object with data from the given XML node + + + + Load the included rule set from the XML node + + The include node from which to create a RuleSetInclude object + A RuleSetInclude object with data from the given XML node + + + + Reads the action from the given node + + The node to read the action, it can be a rule node or an include node. + Whether or not the default value is allowed. + The rule action + + + + Load the IncludedAll from the XML node + + The IncludeAll node from which to create a IncludeAll object + A IncludeAll object with data from the given XML node + + + + Reads an attribute from a node and validates that it is not empty. + + The XML node that contains the attribute + The name of the attribute to read + The attribute value + + + + Gets the default settings to read the ruleset xml file. + + + + + Specifies the C# or VB source code kind. + + + + + No scripting. Used for .cs/.vb file parsing. + + + + + Allows top-level statements, declarations, and optional trailing expression. + Used for parsing .csx/.vbx and interactive submissions. + + + + + The same as . + + + + + Resolves references to source files specified in source code. + + + + + A source text created by an + + + + + A syntax tree created by a + + + + + Adapts an ISourceGenerator to an incremental generator that + by providing an execution environment that matches the old one + + + + + Place this attribute onto a type to cause it to be considered a source generator + + + + + The source languages to which this generator applies. See . + + + + + Attribute constructor used to specify the attached class is a source generator that provides CSharp sources. + + + + + Attribute constructor used to specify the attached class is a source generator and indicate which language(s) it supports. + + One language to which the generator applies. + Additional languages to which the generator applies. See . + + + + Context passed to a source generator when is called + + + + + Get the current at the time of execution. + + + This compilation contains only the user supplied code; other generated code is not + available. As user code can depend on the results of generation, it is possible that + this compilation will contain errors. + + + + + Get the that will be used to parse any added sources. + + + + + A set of additional non-code text files that can be used by generators. + + + + + Allows access to options provided by an analyzer config + + + + + If the generator registered an during initialization, this will be the instance created for this generation pass. + + + + + If the generator registered an during initialization, this will be the instance created for this generation pass. + + + + + A that can be checked to see if the generation should be cancelled. + + + + + Adds source code in the form of a to the compilation. + + An identifier that can be used to reference this source text, must be unique within this generator + The source code to add to the compilation + + + + Adds a to the compilation + + An identifier that can be used to reference this source text, must be unique within this generator + The to add to the compilation + + + + Adds a to the users compilation + + The diagnostic that should be added to the compilation + + The severity of the diagnostic may cause the compilation to fail, depending on the settings. + + + + + Context passed to a source generator when is called + + + + + A that can be checked to see if the initialization should be cancelled. + + + + + Register a for this generator, which can be used to create an instance of an . + + + This method allows generators to be 'syntax aware'. Before each generation the will be invoked to create + an instance of . This receiver will have its + invoked for each syntax node in the compilation, allowing the receiver to build up information about the compilation before generation occurs. + + During the generator can obtain the instance that was + created by accessing the property. Any information that was collected by the receiver can be + used to generate the final output. + + A new instance of is created per-generation, meaning there is no need to manage the lifetime of the + receiver or its contents. + + A that can be invoked to create an instance of + + + + Register a for this generator, which can be used to create an instance of an . + + + This method allows generators to be 'syntax aware'. Before each generation the will be invoked to create + an instance of . This receiver will have its + invoked for each syntax node in the compilation, allowing the receiver to build up information about the compilation before generation occurs. + + During the generator can obtain the instance that was + created by accessing the property. Any information that was collected by the receiver can be + used to generate the final output. + + A new instance of is created prior to every call to , + meaning there is no need to manage the lifetime of the receiver or its contents. + + A that can be invoked to create an instance of + + + + Register a callback that is invoked after initialization. + + + This method allows a generator to opt-in to an extra phase in the generator lifecycle called PostInitialization. After being initialized + any generators that have opted in will have their provided callback invoked with a instance + that can be used to alter the compilation that is provided to subsequent generator phases. + + For example a generator may choose to add sources during PostInitialization. These will be added to the compilation before execution and + will be visited by a registered and available for semantic analysis as part of the + + Note that any sources added during PostInitialization will be visible to the later phases of other generators operating on the compilation. + + An that accepts a that will be invoked after initialization. + + + + Context passed to an when is called + + + + + The currently being visited + + + + + The that can be queried to obtain information about . + + + + + Context passed to a source generator when it has opted-in to PostInitialization via + + + + + A that can be checked to see if the PostInitialization should be cancelled. + + + + + Adds source code in the form of a to the compilation that will be available during subsequent phases + + An identifier that can be used to reference this source text, must be unique within this generator + The source code to add to the compilation + + + + Adds a to the compilation that will be available during subsequent phases + + An identifier that can be used to reference this source text, must be unique within this generator + The to add to the compilation + + + + Responsible for orchestrating a source generation pass + + + GeneratorDriver is an immutable class that can be manipulated by returning a mutated copy of itself. + In the compiler we only ever create a single instance and ignore the mutated copy. The IDE may perform + multiple edits, or generation passes of the same driver, re-using the state as needed. + + + + + Attempts to find a driver based on . If a matching driver is found in the + cache, or explicitly passed via , the cache is updated so that it is at the + head of the list. + + The key to lookup the driver by in the cache + An optional driver that should be cached, if not already found in the cache + + + + + Options passed to a during creation + + + + + The set of s associated with this state. + + + This is the set of generators that will run on next generation. + If there are any states present in , they were produced by a subset of these generators. + + + + + The set of s associated with this state. + + + This is the 'internal' representation of the collection. There is a 1-to-1 mapping + where each entry is either the unwrapped incremental generator or a wrapped + + + + + The last run state of each generator, by the generator that created it + + + There will be a 1-to-1 mapping for each generator. If a generator has yet to + be initialized or failed during initialization it's state will be default(GeneratorState) + + + + + The set of s available to source generators during a run + + + + + Gets a provider for analyzer options + + + + + ParseOptions to use when parsing generator provided source. + + + + + A bit field containing the output kinds that should not be produced by this generator driver. + + + + + Tracks if the have been changed meaning post init trees will need to be re-parsed. + + + + + Returns the underlying type of a given generator + + + For s a wrapper is created that also implements + . This method will unwrap and return the underlying type + in those cases. + + The generator to get the type of + The underlying generator type + + + + Converts an into an object that can be used when constructing a + + The incremental generator to wrap + A wrapped generator that can be passed to a generator driver + + + + Represents the current state of a generator + + + + + Creates a new generator state that contains information, constant trees and an execution pipeline + + + + + Simple wrapper class around an immutable array so we can have the value-semantics needed for the incremental + generator to know when a change actually happened and it should run later transform stages. + + + + + The base interface required to implement an incremental generator + + + The lifetime of a generator is controlled by the compiler. + State should not be stored directly on the generator, as there + is no guarantee that the same instance will be used on a + subsequent generation pass. + + + + + Called to initialize the generator and register generation steps via callbacks + on the + + The to register callbacks on + + + + Context passed to an incremental generator when is called + + + + + Context passed to an incremental generator when it has registered an output via + + + + + A that can be checked to see if the PostInitialization should be cancelled. + + + + + Adds source code in the form of a to the compilation that will be available during subsequent phases + + An identifier that can be used to reference this source text, must be unique within this generator + The source code to add to the compilation + + + + Adds a to the compilation that will be available during subsequent phases + + An identifier that can be used to reference this source text, must be unique within this generator + The to add to the compilation + + + + Context passed to an incremental generator when it has registered an output via + + + + + Adds source code in the form of a to the compilation. + + An identifier that can be used to reference this source text, must be unique within this generator + The source code to add to the compilation + + + + Adds a to the compilation + + An identifier that can be used to reference this source text, must be unique within this generator + The to add to the compilation + + + + Adds a to the users compilation + + The diagnostic that should be added to the compilation + + The severity of the diagnostic may cause the compilation to fail, depending on the settings. + + + + + A description of a step of an incremental generator that was executed. + + + + + The state of the output of a given executed incremental source generator step. + + + + + The output of this step is a new output produced from a new input. + + + + + The input to this step was modified from a previous run, and it produced a different value than the previous run. + + + + + The input to this step was modified from a previous run, but it produced an equal value to the previous run. + + + + + The output of this step was pulled from this step's cache since the inputs was unchanged from the previous run. + + + + + The input that this output is generated from was removed from the input step's outputs, so this value will be removed from the output step results. + + + + + Represents a provider of a single value that can be transformed as part of constructing an execution pipeline + + + This is an opaque type that cannot be used directly. Instead an + will receive a set of value providers when constructing its execution pipeline. A set of extension methods + are then used to create transforms over the data that creates the actual pipeline. + + The type of value that this source provides access to + + + + Represents a provider of multiple values that can be transformed to construct an execution pipeline + + + This is an opaque type that cannot be used directly. Instead an + will receive a set of value providers when constructing its execution pipeline. A set of extension methods + are then used to create transforms over the data that creates the actual pipeline. + + The type of value that this source provides access to + + + + Wraps an incremental generator in a dummy interface. + + + Allows us to treat both generator types as ISourceGenerator externally and not change the public API. + Inside the driver we unwrap and use the actual generator instance. + + + + + The base interface required to implement a source generator + + + The lifetime of a generator is controlled by the compiler. + State should not be stored directly on the generator, as there + is no guarantee that the same instance will be used on a + subsequent generation pass. + + + + + Called before generation occurs. A generator can use the + to register callbacks required to perform generation. + + The to register callbacks on + + + + Called to perform source generation. A generator can use the + to add source files via the + method. + + The to add source to + + This call represents the main generation step. It is called after a is + created that contains the user written code. + + A generator can use the property to + discover information about the users compilation and make decisions on what source to + provide. + + + + + must be a compilation unit or namespace block. + + + + + Receives notifications of each in the compilation before generation runs + + + A can provide an instance of + via a . + + The compiler will invoke the prior to generation to + obtain an instance of . This instance will have its + called for every syntax node in the compilation. + + The can record any information about the nodes visited. During + the generator can obtain the + created instance via the property. The + information contained can be used to perform final generation. + + A new instance of is created per-generation, meaning the instance + is free to store state without worrying about lifetime or reuse. + + An may provide only a single or + , not both. + + + + + Called for each in the compilation + + The current being visited + + + + Allows a generator to provide instances of an + + An instance of an + + + + Receives notifications of each in the compilation, along with a + that can be queried to obtain more information, before generation + runs. + + + A can provide an instance of + via a . + + The compiler will invoke the prior to generation to + obtain an instance of . This instance will have its + called for every syntax node + in the compilation. + + The can record any information about the nodes visited. + During the generator can obtain the + created instance via the property. The + information contained can be used to perform final generation. + + A new instance of is created per-generation, meaning the instance + is free to store state without worrying about lifetime or reuse. + + An may provide only a single or + , not both. + + + + + Allows a generator to provide instances of an + + An instance of an + + + + Represents a node in the execution pipeline of an incremental generator + + The type of value this step operates on + + + + Internal representation of an incremental output + + + + + Represents the various output kinds of an . + + + Can be passed as a bit field when creating a to selectively disable outputs. + + + + + Represents no output kinds. Can be used when creating a driver to indicate that no outputs should be disabled. + + + + + A regular source output, registered via + or + + + + + A post-initialization output, which will be visible to later phases, registered via + + + + + An Implementation only source output, registered via + or + + + + + Input nodes are the 'root' nodes in the graph, and get their values from the inputs of the driver state table + + The type of the input + + + + A data structure that tracks the inputs and output of an execution node + + The type of the items tracked by this table + + + + Indicates if every entry in this table has a state of + + + + + Represents the corresponding state of each item in , or contains a single state when + is populated or when every state of has the same value. + + + + + Holds input nodes that are shared between generators and always exist + + + + + Allows a user to create Syntax based input nodes for incremental generation + + + + + Creates an that can provide a transform over s + + The type of the value the syntax node is transformed into + A function that determines if the given should be transformed + A function that performs the transform, when returns true for a given node + An that provides the results of the transformation + + + + Creates a syntax receiver input node. Only used for back compat in + + + + + Creates an that can provide a transform over all s if that node has an attribute on it that binds to a with the + same fully-qualified metadata as the provided . should be the fully-qualified, metadata name of the attribute, including the + Attribute suffix. For example "System.CLSCompliantAttribute for . + + A function that determines if the given attribute target () should be transformed. Nodes that do not pass this + predicate will not have their attributes looked at at all. + A function that performs the transform. This will only be passed nodes that return for and which have a matching whose + has the same fully qualified, metadata name as . + + + + Returns all syntax nodes of that match if that node has an attribute on it that + could possibly bind to the provided . should be the + simple, non-qualified, name of the attribute, including the Attribute suffix, and not containing any + generics, containing types, or namespaces. For example CLSCompliantAttribute for . + This provider understands (Import in Visual Basic) aliases and will find + matches even when the attribute references an alias name. For example, given: + + using XAttribute = System.CLSCompliantAttribute; + [X] + class C { } + + Then + context.SyntaxProvider.CreateSyntaxProviderForAttribute(nameof(CLSCompliantAttribute), (node, c) => node is ClassDeclarationSyntax) + will find the C class. + + + Note: a 'Values'-provider of arrays are returned. Each array provides all the matching nodes from a single . + + + + + The syntax node the attribute is attached to. For example, with [CLSCompliant] class C { } this would + the class declaration node. + + + + + The symbol that the attribute is attached to. For example, with [CLSCompliant] class C { } this would be + the for "C". + + + + + Semantic model for the file that is contained within. + + + + + s for any matching attributes on . Always non-empty. All + these attributes will have an whose fully qualified name metadata + name matches the name requested in . + + To get the entire list of attributes, use on . + + + + + + Represents the results of running a generation pass over a set of s. + + + + + The individual result of each that was run in this generator pass, one per generator. + + + + + The wall clock time that this generator pass took to execute. + + + + + The s produced by all generators run during this generation pass. + + + This is equivalent to the union of all in . + + + + + The s produced during this generation pass by parsing each added by each generator. + + + This is equivalent to the union of all s in each in each + + + + + Represents the results of a single generation pass. + + + + + The that produced this result. + + + + + The sources that were added by during the generation pass this result represents. + + + + + A collection of s reported by + + + When generation fails due to an being thrown, a single diagnostic is added + to represent the failure. Any generator reported diagnostics up to the failure point are not included. + + + + + An instance that was thrown by the generator, or null if the generator completed without error. + + + When this property has a value, property is guaranteed to be empty, and the + collection will contain a single diagnostic indicating that the generator failed. + + + + + The wall clock time that elapsed while this generator was running. + + + + + A collection of the named incremental steps executed during the generator pass this result represents. + + + + + A collection of the named incremental steps executed during the generator pass this result represents. + + + + + Represents the results of an calling . + + + This contains the original added by the generator, along with the parsed representation of that text in . + + + + + The that was produced from parsing the . + + + + + The that was added by the generator. + + + + + An identifier provided by the generator that identifies the added . + + + + + Contains timing information for a full generation pass. + + + + + The wall clock time that the entire generation pass took. + + + This can be more than the sum of times in as it includes other costs such as setup. + + + + + Individual timings per generator. + + + + + Contains timing information for a single generator. + + + + + The that was running during the recorded time. + + + + + The wall clock time the generator spent running. + + + + + Wraps an in an + + + + + Gets the adjustment to wall clock time that should be applied for a set of input nodes. + + + The syntax store updates all input nodes in parallel the first time an input node is asked to update, + so that it can share the semantic model between multiple nodes and improve perf. + + Unfortunately that means that the first generator to request the results of a syntax node will incorrectly + have its wall clock time contain the time of all other syntax nodes. And conversely other input nodes will + not have the true time taken. + + This method gets the adjustment that should be applied to the wall clock time for a set of input nodes + so that the correct time is attributed to each. + + + + + Well known incremental generator input step names. + + + + + Well known incremental generator output step names. + + + + + Specifies the Ids of special runtime types. + + + Only types explicitly mentioned in "Co-located core types" spec + (https://github.com/dotnet/roslyn/blob/main/docs/compilers/Co-located%20core%20types.md) + can be in this enum. + The following things should be in sync: + 1) SpecialType enum + 2) names in SpecialTypes.EmittedNames array. + + + + + Indicates a non-special type (default value). + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is . + + + + + Indicates that the type is System.Runtime.CompilerServices.RuntimeFeature. + + + + + An attribute that is placed on each method with a 'methodimpl" aka ".override" in metadata. + + + + + Count of special types. This is not a count of enum members. + + + + + Checks if a type is considered a "built-in integral" by CLR. + + + + + Checks if a type is a primitive of a fixed size. + + + + + These special types are structs that contain fields of the same type + (e.g. System.Int32 contains a field of type System.Int32). + + + + + Checks if a type is considered a "built-in integral" by CLR. + + + + + For signed integer types return number of bits for their representation minus 1. + I.e. 7 for Int8, 31 for Int32, etc. + Used for checking loop end condition for VB for loop. + + + + + Array of names for types from Cor Library. + The names should correspond to ids from TypeId enum so + that we could use ids to index into the array + + + + + + Gets the name of the special type as it would appear in metadata. + + + + + Try to retrieve the public key from a crypto blob. + + + Can be either a PUBLICKEYBLOB or PRIVATEKEYBLOB. The BLOB must be unencrypted. + + + + + Helper for RsaCryptoServiceProvider.ExportParameters() + Copied from https://github.com/dotnet/corefx/blob/5fe5f9aae7b2987adc7082f90712b265bee5eefc/src/System.Security.Cryptography.Csp/src/System/Security/Cryptography/CapiHelper.Shared.cs + + + + + Helper for converting a UInt32 exponent to bytes. + Copied from https://github.com/dotnet/corefx/blob/5fe5f9aae7b2987adc7082f90712b265bee5eefc/src/System.Security.Cryptography.Csp/src/System/Security/Cryptography/CapiHelper.Shared.cs + + + + + Read in a byte array in reverse order. + Copied from https://github.com/dotnet/corefx/blob/5fe5f9aae7b2987adc7082f90712b265bee5eefc/src/System.Security.Cryptography.Csp/src/System/Security/Cryptography/CapiHelper.Shared.cs + + + + + Provides strong name and signs source assemblies. + + + + + Creates an instance of . + + Path to use for any temporary file generation. + An ordered set of fully qualified paths which are searched when locating a cryptographic key file. + + + + Resolves assembly strong name key file path. + + Normalized key file path or null if not found. + + + + + + + This is an abstraction over the file system which allows for us to do more thorough unit testing. + + + + + The strong name key associated with the identity of this assembly. + This contains the contents of the user-supplied key file exactly as extracted. + + + + + Determines source assembly identity. + + + + + The Private key information that will exist if it was a private key file that was parsed. + + + + + A diagnostic created in the process of determining the key. + + + + + The CSP key container containing the public key used to produce the key, + or null if the key was retrieved from . + + + The original value as specified by or + . + + + + + Original key file path, or null if the key is provided by the . + + + The original value as specified by or + + + + + + True when the assembly contains a value + and hence signing requires counter signature verification. + + + + + True if the compilation can be signed using these keys. + + + + + True if a strong name can be created for the compilation using these keys. + + + + + Provides strong name and signs source assemblies. + + + + + Signs the value using . + + + + + Signs the contents of using and . + + + + + Create a for the provided information. + + + + + Contains helper methods for switch statement label constants + + + + + Method used to compare ConstantValues for switch statement case labels + + + + A value that indicates the relative order of the objects being compared. The return value has these meanings: + Less than zero: first instance precedes second in the sort order. + Zero: first instance occurs in the same position in the sort order as second. + Greater than zero: first instance follows second in the sort order. + + + + + Append a default argument (i.e. the default argument of an optional parameter). + Assumed to be non-null. + + + + + Check if the given type is an enum with System.FlagsAttribute. + + + TODO: Can/should this be done using WellKnownAttributes? + + + + + This class associates a symbol with particular format for display. + It can be passed as an argument for an error message in place where symbol display should go, + which allows to defer building strings and doing many other things (like loading metadata) + associated with that until the error message is actually requested. + + + + + Determines if a flag is set on the enum. + + The value to check. + An enum field that specifies the flag. + Whether the is set on the . + + + + Specifies the options for how generics are displayed in the description of a symbol. + + + + + Format object using default options. + + + + + In C#, include the numeric code point before character literals. + + + + + Whether or not to include type suffix for applicable integral literals. + + + + + Whether or not to display integral literals in hexadecimal. + + + + + Whether or not to quote character and string literals. + + + + + In C#, replace non-printable (e.g. control) characters with dedicated (e.g. \t) or unicode (\u0001) escape sequences. + In Visual Basic, replace non-printable characters with calls to ChrW and vb* constants. + + + + + None + + + + + ".ctor" instead of "Goo" + + + + + "List`1" instead of "List<T>" ("List(of T)" in VB). Overrides GenericsOptions on + types. + + + + + Append "[Missing]" to missing Metadata types (for testing). + + + + + Include the Script type when qualifying type names. + + + + + Include custom modifiers (e.g. modopt([mscorlib]System.Runtime.CompilerServices.IsConst)) on + the member (return) type and parameters. + + + CONSIDER: custom modifiers are part of the public API, so we might want to move this to SymbolDisplayMemberOptions. + + + + + For a type written as "int[][,]" in C#, then + a) setting this option will produce "int[,][]", and + b) not setting this option will produce "int[][,]". + + + + + Display `System.ValueTuple` instead of tuple syntax `(...)`. + + + + + Display `System.[U]IntPtr` instead of `n[u]int`. + + + + + Separate out nested types from containing types using + instead of . (dot). + + + + + Includes the scoped keyword. + + + + + Display `MyType@File.cs` instead of `MyType`. + + + + + Specifies how to display delegates (just the name or the name with the signature). + + + + + Shows only the name of the delegate (e.g. "SomeDelegate"). + + + + + Shows the name and the parameters of the delegate (e.g. "SomeDelegate(int x)"). + + The format of the parameters will be determined by the other flags passed. + + + + + + Shows the name and the signature of the delegate (e.g. "void SomeDelegate(int x)"). + + The format of the signature will be determined by the other flags passed. + + + + + + Specifies how to display extension methods. + + + + + Displays the extension method based on its . + + + + + Displays the extension method in the form of an instance method. + For example, IEnumerable<TSource>.ElementAt<TSource>(int index). + + + + + Displays the extension method as a static method. + For example, Enumerable.ElementAt<TSource>(this IEnumerable<TSource> source, int index). + + + + + Exposes extension methods for displaying symbol descriptions. + + + + + Converts an immutable array of s to a string. + + The array of parts. + The concatenation of the parts into a single string. + + + + Determines if a flag is set on the enum. + + The value to check. + An enum field that specifies the flag. + Whether the is set on the . + + + + Determines if a flag is set on the enum. + + The value to check. + An enum field that specifies the flag. + Whether the is set on the . + + + + Determines if a flag is set on the enum. + + The value to check. + An enum field that specifies the flag. + Whether the is set on the . + + + + Determines if a flag is set on the enum. + + The value to check. + An enum field that specifies the flag. + Whether the is set on the . + + + + Determines if a flag is set on the enum. + + The value to check. + An enum field that specifies the flag. + Whether the is set on the . + + + + Determines if a flag is set on the enum. + + The value to check. + An enum field that specifies the flag. + Whether the is set on the . + + + + Determines if a flag is set on the enum. + + The value to check. + An enum field that specifies the flag. + Whether the is set on the . + + + + Describes the formatting rules that should be used when displaying symbols. + + + + + Formats a symbol description as in a C# compiler error message. + + + + + Formats a symbol description as in a C# compiler short error message. + + + + + Formats a symbol description as in a Visual Basic compiler error message. + + + + + Formats a symbol description as in a Visual Basic compiler short error message. + + + + + Formats the names of all types and namespaces in a fully qualified style (including the global alias). + + + The current behavior will not output the fully qualified style as expected for member symbols (such as properties) because memberOptions is not set. + For example, MyNamespace.MyClass.MyPublicProperty will return as MyPublicProperty. + The current behavior displayed here will be maintained for backwards compatibility. + + + + + Formats a symbol description in a form that suits . + + + + + A verbose format for displaying symbols (useful for testing). + + + + + A verbose format for displaying symbols (useful for testing). + + + + + this.QualifiedNameOnly = containingSymbol.QualifiedNameOnly + "." + this.Name + + + + + this.QualifiedNameArity = containingSymbol.QualifiedNameArity + "." + this.Name + "`" + this.Arity + + + + + A succinct format for displaying symbols. + + + + + The format used for displaying symbols when visualizing IL. + + + + + Used to normalize explicit interface implementation member names. + Only expected to be applied to interface types (and their type arguments). + + + + + Determines how the global namespace is displayed. + + + + + Determines how types are qualified (e.g. Nested vs Containing.Nested vs Namespace.Containing.Nested). + + + + + Determines how generics (on types and methods) should be described (i.e. the level of detail). + + + + + Determines how fields, properties, events, and methods are displayed. + + + + + Determines how parameters (of methods, properties/indexers, and delegates) are displayed. + + + + + Determines how delegates are displayed (e.g. name vs full signature). + + + + + Determines how extension methods are displayed. + + + + + Determines how properties are displayed. + For example, "Prop" vs "Prop { get; set; }" in C# or "Prop" vs. "ReadOnly Prop" in Visual Basic. + + + + + Determines how local variables are displayed. + + + + + Determines which kind keywords should be included when displaying symbols. + + + + + Determines other characteristics of how symbols are displayed. + + + + + Flags that can only be set within the compiler. + + + + + Constructs a new instance of accepting a variety of optional parameters. + + + The settings that determine how the global namespace is displayed. + + + The settings that determine how types are qualified (e.g. Nested vs Containing.Nested vs Namespace.Containing.Nested). + + + The settings that determine how generics (on types and methods) should be described (i.e. the level of detail). + + + The settings that determine how fields, properties, events, and methods are displayed. + + + The settings that determine how delegates are displayed (e.g. name vs full signature). + + + The settings that determine how extension methods are displayed. + + + The settings that determine how parameters (of methods, properties/indexers, and delegates) are displayed. + + + The settings that determine how properties are displayed. + For example, "Prop" vs "Prop { get; set; }" in C# or "Prop" vs. "ReadOnly Prop" in Visual Basic. + + + The settings that determine how local variables are displayed. + + + The settings that determine which kind keywords should be included when displaying symbols. + + + The settings that determine other characteristics of how symbols are displayed. + + + + + This version also accepts . + + + + + Creates a copy of the SymbolDisplayFormat but with replaced set of . + + + An object representing how miscellaneous symbols will be formatted. + + A duplicate of the SymbolDisplayFormat, with a replaced set of . + + + + Creates a copy of the SymbolDisplayFormat but with an additional set of . + + + An object specifying additional parameters for how miscellaneous symbols will be formatted. + + A duplicate of the SymbolDisplayFormat, with an additional set of . + + + + Creates a copy of the SymbolDisplayFormat without the specified . + + + An object specifying which parameters should not be applied to how miscellaneous symbols will be formatted. + + A duplicate of the SymbolDisplayFormat, without the specified . + + + + Creates a copy of the SymbolDisplayFormat but with replaced set of . + + + An object specifying how generic symbols will be formatted. + + A duplicate of the SymbolDisplayFormat, with a replaced set of . + + + + Creates a copy of the SymbolDisplayFormat but with an additional set of . + + + An object specifying additional parameters for how generic symbols will be formatted. + + A duplicate of the SymbolDisplayFormat, with an additional set of . + + + + Creates a copy of the SymbolDisplayFormat but with a set of stripped away from the original object. + + + An object specifying which parameters should not be applied to how generic symbols will be formatted. + + + A duplicate of the SymbolDisplayFormat, with a set of stripped away from the original object. + + + + + Creates a copy of the SymbolDisplayFormat but with replaced set of . + + + An object specifying how members will be formatted. + + A duplicate of the SymbolDisplayFormat, with a replaced set of . + + + + Creates a copy of the SymbolDisplayFormat but with an additional set of . + + + An object specifying additional parameters for how members will be formatted. + + + A duplicate of the SymbolDisplayFormat, with an additional set of . + + + + + Creates a copy of the SymbolDisplayFormat but with a set of stripped away from the original object. + + + An object specifying which parameters should not be applied to how members will be formatted. + + + A duplicate of the SymbolDisplayFormat, with a set of stripped away from the original object. + + + + + Creates a copy of the SymbolDisplayFormat but with replaced set of . + + + An object specifying parameters with which symbols belonging to kind keywords should be formatted. + + + A duplicate of the SymbolDisplayFormat, with a replaced set of . + + + + + Creates a copy of the SymbolDisplayFormat but with an additional set of . + + + An object specifying additional parameters with which symbols belonging to kind keywords should be formatted. + + + A duplicate of the SymbolDisplayFormat, with an additional set of . + + + + + Creates a copy of the SymbolDisplayFormat but with a set of stripped away from the original object. + + + The settings that determine other characteristics of how symbols are displayed. + + + A duplicate of the SymbolDisplayFormat, with a set of stripped away from the original object. + + + + + Creates a copy of the SymbolDisplayFormat but with replaced set of . + + + An object specifying how parameters should be formatted. + + A duplicate of the SymbolDisplayFormat, with a replaced set of . + + + + Creates a copy of the SymbolDisplayFormat but with an additional set of . + + + An object specifying additional parameters on how parameters should be formatted. + + + A duplicate of the SymbolDisplayFormat, with an additional set of . + + + + + Creates a copy of the SymbolDisplayFormat but with a set of stripped away from the original object. + + + An object specifying parameters that should not be applied when formatting parameters. + + + A duplicate of the SymbolDisplayFormat, with a set of stripped away from the original object. + + + + + Creates a copy of the SymbolDisplayFormat but with replaced . + + + An object specifying parameters on how namespace symbols should be formatted. + + A duplicate of the SymbolDisplayFormat, with a replaced set of . + + + + Creates a copy of the SymbolDisplayFormat but with replaced set of . + + + An object specifying parameters on how symbols belonging to locals should be formatted. + + A duplicate of the SymbolDisplayFormat, with a replaced set of . + + + + Creates a copy of the SymbolDisplayFormat but with an additional set of . + + + An object specifying additional parameters on how symbols belonging to locals should be formatted. + + + A duplicate of the SymbolDisplayFormat, with an additional set of . + + + + + Creates a copy of the SymbolDisplayFormat but with a set of stripped away from the original object. + + + An object specifying parameters that should not be applied when formatting symbols belonging to locals. + + + A duplicate of the SymbolDisplayFormat, with a set of stripped away from the original object. + + + + + Creates a copy of the SymbolDisplayFormat but with added set of . + + + + + Creates a copy of the SymbolDisplayFormat but with replaced set of . + + + + + Specifies the options for how generics are displayed in the description of a symbol. + + + + + Omits the type parameter list entirely. + + + + + Includes the type parameters. + For example, "Goo<T>" in C# or "Goo(Of T)" in Visual Basic. + + + + + Includes type parameters and constraints. + For example, "where T : new()" in C# or "Of T as New" in Visual Basic. + + + + + Includes in or out keywords before variant type parameters. + For example, "Goo<out T>" in C# or (Goo Of Out T" in Visual Basic. + + + + + Specifies the options for how to display the global namespace in the description of a symbol. + + + Any of these styles may be overridden by . + + + + + Omits the global namespace, unconditionally. + + + + + Omits the global namespace if it is being displayed as a containing symbol (i.e. not on its own). + + + + + Include the global namespace, unconditionally. + + + + + Specifies which kind keywords should be included when displaying symbols. + + + + + Omits all kind keywords. + + + + + Includes the namespace keyword before namespaces. + For example, "namespace System", rather than "System". + + + + + Includes the type keyword before types. + For example, "class C" in C# or "Structure S" in Visual Basic. + + + + + Include the member keyword before members (if one exists). + For example, "event D E" in C# or "Function MyFun()" in Visual Basic. + + + + + Specifies the options for how locals are displayed in the description of a symbol. + + + + + Shows only the name of the local. + For example, "x". + + + + + Shows the type of the local in addition to its name. + For example, "int x" in C# or "x As Integer" in Visual Basic. + + + + + Shows the constant value of the local, if there is one, in addition to its name. + For example "x = 1". + + + + + Includes the ref keyword for ref-locals. + + + + + Specifies the options for how members are displayed in the description of a symbol. + + + + + Includes only the name of the member. + + + + + Includes the (return) type of the method/field/property/event. + + + + + Includes the modifiers of the member. For example, "static readonly" in C# or "Shared ReadOnly" in Visual Basic. + + Accessibility modifiers are controlled separately by . + + + + + + Includes the accessibility modifiers of the member. For example, "public" in C# or "Public" in Visual Basic. + + + + + Includes the name of corresponding interface on members that explicitly implement interface members. For example, "IGoo.Bar { get; }". + + This option has no effect in Visual Basic. + + + + + + Includes the parameters of methods and properties/indexers. + + See for finer-grained settings. + + + + + + Includes the name of the type containing the member. + + The format of the containing type is determined by . + + + + + + Includes the value of the member if is a constant. + + + + + Includes the ref, ref readonly, ByRef keywords for ref-returning methods and properties/indexers. + Also includes the readonly keyword on methods, properties/indexers, and events due to the keyword + changing the this parameter's ref kind from ref to ref readonly. + + + + + Specifies miscellaneous options about the format of symbol descriptions. + + + + + Specifies that no miscellaneous options should be applied. + + + + + Uses keywords for predefined types. + For example, "int" instead of "System.Int32" in C# + or "Integer" instead of "System.Integer" in Visual Basic. + + + + + Escapes identifiers that are also keywords. + For example, "@true" instead of "true" in C# or + "[True]" instead of "True" in Visual Basic. + + + + + Displays asterisks between commas in multi-dimensional arrays. + For example, "int[][*,*]" instead of "int[][,]" in C# or + "Integer()(*,*)" instead of "Integer()(*,*) in Visual Basic. + + + + + Displays "?" for erroneous types that lack names (perhaps due to faulty metadata). + + + + + Displays attributes names without the "Attribute" suffix, if possible. + + Has no effect outside and only applies + if the context location is one where an attribute ca be referenced without the suffix. + + + + + + Displays as a normal generic type, rather than with + the special question mark syntax. + + + + + Append '?' to nullable reference types. + + + + + Allow the use of default instead of default(T) where applicable. + + + + + Append '!' to non-nullable reference types. + + + + + Insert a tuple into the display parts as a single part instead of multiple parts (similar + to how anonymous types are inserted). + + + + + Specifies how parameters are displayed in the description of a (member, property/indexer, or delegate) symbol. + + + + + Omits parameters from symbol descriptions. + + If this option is combined with , then only + the parentheses will be shown (e.g. M()). + + + + + + Includes the this keyword before the first parameter of an extension method in C#. + + This option has no effect in Visual Basic. + + + + + + Includes the params, ref, in, out, ByRef, ByVal keywords before parameters. + + + + + Includes parameter types in symbol descriptions. + + + + + Includes parameter names in symbol descriptions. + + + + + Includes parameter default values in symbol descriptions. + Ignored if is not set. + + + + + + Includes square brackets around optional parameters. + + + + + A single element of a symbol description. For example, a keyword, a punctuation character or + a class name. + + + + + + + + Gets the kind of this display part. + + + + + Gets the symbol associated with this display part, if there is one. + For example, the associated with a class name. + + + + + + Construct a non-formattable (i.e. with a fixed string value). + + The kind of the display part. + An optional associated symbol. + The fixed string value of the part. + + + + Returns the string value of this symbol display part. + + + + + Specifies the kinds of a piece of classified text (SymbolDisplayPart). + + + + The name of an alias. + + + The name of an assembly. + + + The name of a class. + + + The name of a delegate. + + + The name of an enum. + + + The name of an error type. + + + + The name of an event. + + + The name of a field. + + + The name of an interface. + + + A language keyword. + + + The name of a label. + + + A line-break (i.e. whitespace). + + + A numeric literal. + Typically for the default values of parameters and the constant values of fields. + + + + + A string literal. + Typically for the default values of parameters and the constant values of fields. + + + + + The name of a local. + + + The name of a method. + + + The name of a module. + + + The name of a namespace. + + + The symbol of an operator (e.g. "+"). + + + The name of a parameter. + + + The name of a property. + + + A punctuation character (e.g. "(", ".", ",") other than an . + + + A single space character. + + + The name of a struct (structure in Visual Basic). + + + A keyword-like part for anonymous types (not actually a keyword). + + + An unclassified part. + Never returned - only set in user-constructed parts. + + + + + The name of a type parameter. + + + The name of a query range variable. + + + The name of an enum member. + + + The name of a reduced extension method. + + When an extension method is in it's non-reduced form it will be will be marked as MethodName. + + + + + The name of a field or local constant. + + + The name of a record class. + + + The name of a record struct. + + + + Specifies the options for how properties are displayed in symbol descriptions. + + + + + Shows only the names of properties. + + + + + + Indicates whether the property is readable and/or writable. + In C#, this is accomplished by including accessors. + In Visual Basic, this is accomplished by including the ReadOnly or WriteOnly + keyword, as appropriate. + + + + + Specifies how much qualification is used in symbol descriptions. + + + + + Shows only the name of the symbol. + + + + + Shows the name of the symbol and the names of all containing types. + + + + + Shows the name of the symbol the names of all containing types and namespaces. + + + + + Enumeration for common accessibility combinations. + + + + + No accessibility specified. + + + + + Only accessible where both protected and internal members are accessible + (more restrictive than , and ). + + + + + Only accessible where both protected and friend members are accessible + (more restrictive than , and ). + + + + + Accessible wherever either protected or internal members are accessible + (less restrictive than , and ). + + + + + Accessible wherever either protected or friend members are accessible + (less restrictive than , and ). + + + + + We should not see new anonymous types from source after we finished emit phase. + If this field is true, the collection is sealed; in DEBUG it also is used to check the assertion. + + + + + Collection of anonymous type templates is sealed + + + + + Gets the name of this assembly. + + + + + Returns true if this field was declared as "volatile". + + + + + True if the method is a source method implemented as an iterator. + + + + + Returns true if this method is an async method + + + + + Returns a constructed method given its type arguments. + + The immediate type arguments to be replaced for type + parameters in the method. + + + + For enum types, gets the underlying type. Returns null on all other + kinds of types. + + + + + Returns whether this namespace is the unnamed, global namespace that is + at the root of all namespaces. + + + + + The contents of the AssemblySignatureKeyAttribute + + + + + Interface implemented by the compiler's internal representation of a symbol. + An object implementing this interface might also implement (as is done in VB), + or the compiler's symbols might be wrapped to implement ISymbol (as is done in C#). + + + + + Gets the indicating what kind of symbol it is. + + + + + Gets the symbol name. Returns the empty string if unnamed. + + + + + Allows a symbol to support comparisons that involve child type symbols + + + Because TypeSymbol equality can differ based on e.g. nullability, any symbols that contain TypeSymbols can also differ in the same way + This call allows the symbol to accept a comparison kind that should be used when comparing its contained types + + + + + Gets the for the immediately containing symbol. + + + + + Gets the for the containing assembly. Returns null if the + symbol is shared across multiple assemblies. + + + + + Gets the for the containing module. Returns null if the + symbol is shared across multiple modules. + + + + + Gets the for the containing type. Returns null if the + symbol is not contained within a type. + + + + + Gets the for the nearest enclosing namespace. Returns null if the + symbol isn't contained in a namespace. + + + + + Gets a value indicating whether the symbol is the original definition. Returns false + if the symbol is derived from another symbol, by type substitution for instance. + + + + + Gets the locations where the symbol was originally defined, either in source or + metadata. Some symbols (for example, partial classes) may be defined in more than one + location. + + + + + Returns true if this symbol was automatically created by the compiler, and does not have + an explicit corresponding source code declaration. + + + This is intended for symbols that are ordinary symbols in the language sense, and may be + used by code, but that are simply declared implicitly rather than with explicit language + syntax. + + + Examples include (this list is not exhaustive): + + The default constructor for a class or struct that is created if one is not provided. + The BeginInvoke/Invoke/EndInvoke methods for a delegate. + The generated backing field for an auto property or a field-like event. + The "this" parameter for non-static methods. + The "value" parameter for a property setter. + The parameters on indexer accessor methods (not on the indexer itself). + Methods in anonymous types. + + + + + + + Gets a indicating the declared accessibility for the symbol. + Returns NotApplicable if no accessibility is declared. + + + + + Gets a value indicating whether the symbol is static. + + + + + Gets a value indicating whether the symbol is virtual. + + + + + Gets a value indicating whether the symbol is an override of a base class symbol. + + + + + Gets a value indicating whether the symbol is abstract. + + + + + Returns an instance associated with this symbol. + + + + + Returns an instance associated with this symbol. + In general, this API is not safe to use. Transition from symbols to Cci interfaces + should be handled by PEModuleBuilder translation layer. One relatively safe scenario + is to use it on a symbol that is a definition. + + + + + Synthesized symbol that implements a method body feature (iterator, async, lambda, etc.) + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The symbol whose body lowering produced this synthesized symbol, + or null if the symbol is synthesized based on declaration. + + + + + True if this symbol body needs to be updated when the body is updated. + False if is null. + + + + + An enumerated value that identifies whether this type is an array, pointer, enum, and so on. + + + + + An enumerated value that identifies certain 'special' types such as . + Returns if the type is not special. + + + + + True if this type is known to be a reference type. It is never the case that + and both return true. However, for an unconstrained type + parameter, and will both return false. + + + + + True if this type is known to be a value type. It is never the case that + and both return true. However, for an unconstrained type + parameter, and will both return false. + + + + + Returns an instance associated with this symbol. + This API and should return the same object. + + + + + Default attribute usage for attribute types: + (a) Valid targets: AttributeTargets.All + (b) AllowMultiple: false + (c) Inherited: true + + + + + Information decoded from well-known custom attributes applied on an assembly. + + + + + Raw assembly version as specified in the AssemblyVersionAttribute, or Nothing if none specified. + If the string passed to AssemblyVersionAttribute contains * the version build and/or revision numbers are set to . + + + + + Returns data decoded from security attributes or null if there are no security attributes. + + + + + The attribute class. + + + + + The constructor on the attribute class. + + + + + Constructor arguments on the attribute. + + + + + Named (property value) arguments on the attribute. + + + + + Attribute is conditionally omitted if it is a source attribute and both the following are true: + (a) It has at least one applied conditional attribute AND + (b) None of conditional symbols are true at the attribute source location. + + + + + Checks if an applied attribute with the given attributeType matches the namespace name and type name of the given early attribute's description + and the attribute description has a signature with parameter count equal to the given attributeArgCount. + NOTE: We don't allow early decoded attributes to have optional parameters. + + + + + Returns the value of a constructor argument as type . + Throws if no constructor argument exists or the argument cannot be converted to the type. + + + + + Returns named attribute argument with the given as type . + If there is more than one named argument with this name, it returns the last one. + If no named argument is found then the is returned. + + The metadata property or field name. This name is case sensitive (both VB and C#). + SpecialType of the named argument. + Default value for the named argument. + + For user defined attributes VB allows duplicate named arguments and uses the last value. + Dev11 reports an error for pseudo-custom attributes when emitting metadata. We don't. + + + + + Decode the arguments to ObsoleteAttribute. ObsoleteAttribute can have 0, 1 or 2 arguments. + + + + + Decode the arguments to DeprecatedAttribute. DeprecatedAttribute can have 3 or 4 arguments. + + + + + Decode the arguments to ExperimentalAttribute. ExperimentalAttribute has 0 arguments. + + + + + Used to determine if two instances are identical, + i.e. they have the same attribute type, attribute constructor and have identical arguments. + + + + + Information decoded from early well-known custom attributes applied on an event. + + + + + Information decoded from well-known custom attributes applied on an event. + + + + + Information decoded from early well-known custom attributes applied on a field. + + + + + Information decoded from well-known custom attributes applied on a field. + + + + + Returns marshalling data or null of MarshalAs attribute isn't applied on the field. + + + + + Information decoded from early well-known custom attributes applied on a method. + + + + + Information decoded from well-known custom attributes applied on a method. + + + + + Returns data decoded from security attributes or null if there are no security attributes. + + + + + Information decoded from well-known custom attributes applied on a module. + + + + + Information decoded from early well-known custom attributes applied on a parameter. + + + + + Information decoded from well-known custom attributes applied on a parameter. + + + + + Returns marshalling data or null of MarshalAs attribute isn't applied on the parameter. + + + + + Information decoded from early well-known custom attributes applied on a property. + + + + + Information decoded from well-known custom attributes applied on a property. + + + + + Information decoded from well-known custom attributes applied on a method return value. + + + + + Returns marshalling data or null of MarshalAs attribute isn't applied on the return value. + + + + + Information decoded from early well-known custom attributes applied on a type. + + + + + Information decoded from well-known custom attributes applied on a type. + + + + + Returns data decoded from security attributes or null if there are no security attributes. + + + + + Represents a bag of custom attributes and the associated decoded well-known attribute data. + + + + + Instance representing sealed custom attribute bag with no attributes. + + + + + Returns a non-sealed custom attribute bag with null initialized , null initialized and uninitialized . + + + + + Sets the early decoded well-known attribute data on the bag in a thread safe manner. + Stored early decoded data is immutable and cannot be updated further. + + Returns true if early decoded data were stored into the bag on this thread. + + + + Sets the decoded well-known attribute data (except the early data) on the bag in a thread safe manner. + Stored decoded data is immutable and cannot be updated further. + + Returns true if decoded data were stored into the bag on this thread. + + + + Sets the bound attributes on the bag in a thread safe manner. + If store succeeds, it seals the bag and makes the bag immutable. + + Returns true if bound attributes were stored into the bag on this thread. + + + + Gets the stored bound attributes in the bag. + + This property can only be accessed on a sealed bag. + + + + Gets the decoded well-known attribute data (except the early data) in the bag. + + This property can only be accessed on the bag after has been invoked. + + + + Gets the early decoded well-known attribute data in the bag. + + This property can only be accessed on the bag after has been invoked. + + + + Return whether early decoded attribute data has been computed and stored on the bag and it is safe to access from this bag. + Return value of true doesn't guarantee that bound attributes or remaining decoded attribute data has also been initialized. + + + + + Return whether all decoded attribute data has been computed and stored on the bag and it is safe to access from this bag. + Return value of true doesn't guarantee that bound attributes have also been initialized. + + + + + Enum representing the current state of attribute binding/decoding for a corresponding CustomAttributeBag. + + + + + Bag has been created, but no decoded data or attributes have been stored. + CustomAttributeBag is in this state during early decoding phase. + + + + + Early decoded attribute data has been computed and stored on the bag, but bound attributes or remaining decoded attribute data is not stored. + Only can be accessed from this bag. + + + + + All decoded attribute data has been computed and stored on the bag, but bound attributes are not yet stored. + Both and can be accessed from this bag. + + + + + Bound attributes have been computed and stored on this bag. + + + + + CustomAttributeBag is completely initialized and immutable. + + + + + Contains common arguments to Symbol.DecodeWellKnownAttribute method in both the language compilers. + + + + + Object to store the decoded data from bound well-known attributes. + Created lazily only when some decoded data needs to be stored, null otherwise. + + + + + Gets or creates the decoded data object. + + + This method must be called only when some decoded data will be stored into it subsequently. + + + + + Returns true if some decoded data has been stored into . + + + + + Gets the stored decoded data. + + + Assumes is true. + + + + + Syntax of the attribute to decode. Might be null when the attribute information is not coming + from syntax. For example, an assembly attribute propagated from added module to the resulting assembly. + + + + + Bound attribute to decode. + + + + + The index of the attribute in the list of attributes to decode. + + + + + Total count of attributes to decode. + + + + + Diagnostic bag. + + + + + Specific part of the symbol to which the attributes apply, or AttributeLocation.None if the attributes apply to the symbol itself. + Used e.g. for return type attributes of a method symbol. + + + + + Contains common arguments to Symbol.EarlyDecodeWellKnownAttribute method in both the language compilers. + + + + + Object to store the decoded data from early bound well-known attributes. + Created lazily only when some decoded data needs to be stored, null otherwise. + + + + + Gets or creates the decoded data object. + + + This method must be called only when some decoded data will be stored into it subsequently. + + + + + Returns true if some decoded data has been stored into . + + + + + Gets the stored decoded data. + + + Assumes is true. + + + + + Binder to bind early well-known attributes. + + + + + Bound type of the attribute to decode. + + + + + Syntax of the attribute to decode. + + + + + Specific part of the symbol to which the attributes apply, or AttributeLocation.None if the attributes apply to the symbol itself. + Used e.g. for return type attributes of a method symbol. + + + + + Base class for storing information decoded from early well-known custom attributes. + + + CONSIDER: Should we remove this class and let the sub-classes derived from WellKnownAttributeData? + + + + + Information decoded from . + + + + + Returns an instance of with all types replaced by types returned by specified translator. + Returns this instance if it doesn't hold on any types. + + + + + Information decoded from . + + + + + True if an error should be thrown for the . Default is false in which case + a warning is thrown. + + + + + The message that will be shown when an error/warning is created for . + + + + + The custom diagnostic ID to use for obsolete diagnostics. + If null, diagnostics are produced using the compiler default diagnostic IDs. + + + + + + The custom help URL format string for obsolete diagnostics. + Expected to contain zero or one format items. + + + When specified, the obsolete diagnostic's will be produced + by formatting this string using the as the single argument. + + + + e.g. with a value "TEST1", + and a value ,
+ the diagnostic will have the HelpLinkUri
. +
+
+
+ + + Information decoded from security attributes, i.e. attributes derived from well-known SecurityAttribute, applied on a method/type/assembly. + + + + + Used for retrieving applied source security attributes, i.e. attributes derived from well-known SecurityAttribute. + + + + + Base class for storing information decoded from well-known custom attributes. + + + + + Used to distinguish cases when attribute is applied with null value and when attribute is not applied. + For some well-known attributes, the latter case will return string stored in + field. + + + + + If true, a language may use the modified storage location without + being aware of the meaning of the modification, modopt vs. modreq. + + + + + A type used as a tag that indicates which type of modification applies. + + + + + Represents a using alias (Imports alias in Visual Basic). + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Gets the for the + namespace or type referenced by the alias. + + + + + Represents an array. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Gets the number of dimensions of this array. A regular single-dimensional array + has rank 1, a two-dimensional array has rank 2, etc. + + + + + Is this a zero-based one-dimensional array, i.e. SZArray in CLR terms. + SZArray is an array type encoded in metadata with ELEMENT_TYPE_SZARRAY (always single-dim array with 0 lower bound). + Non-SZArray type is encoded in metadata with ELEMENT_TYPE_ARRAY and with optional sizes and lower bounds. Even though + non-SZArray can also be a single-dim array with 0 lower bound, the encoding of these types in metadata is distinct. + + + + + Specified lower bounds for dimensions, by position. The length can be less than , + meaning that some trailing dimensions don't have the lower bound specified. + The most common case is all dimensions are zero bound - a default (Nothing in VB) array is returned in this case. + + + + + Specified sizes for dimensions, by position. The length can be less than , + meaning that some trailing dimensions don't have the size specified. + The most common case is none of the dimensions have the size specified - an empty array is returned. + + + + + Gets the type of the elements stored in the array. + + + + + Gets the top-level nullability of the elements stored in the array. + + + + + Custom modifiers associated with the array type, or an empty array if there are none. + + + + + Represents a .NET assembly, consisting of one or more modules. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + True if the assembly contains interactive code. + + + + + Gets the name of this assembly. + + + + + Gets the merged root namespace that contains all namespaces and types defined in the modules + of this assembly. If there is just one module in this assembly, this property just returns the + GlobalNamespace of that module. + + + + + Gets the modules in this assembly. (There must be at least one.) The first one is the main module + that holds the assembly manifest. + + + + + Gets the set of type identifiers from this assembly. + + + + + Gets the set of namespace names from this assembly. + + + + + Gets a value indicating whether this assembly gives + access to internal symbols + + + + Lookup a type within the assembly using the canonical CLR metadata name of the type. + + Type name. + Symbol for the type or null if type cannot be found or is ambiguous. + + + + Determines if the assembly might contain extension methods. + If false, the assembly does not contain extension methods. + + + + + Returns the type symbol for a forwarded type based its canonical CLR metadata name. + The name should refer to a non-nested type. If type with this name is not forwarded, + null is returned. + + + + + Returns type symbols for top-level (non-nested) types forwarded by this assembly. + + + + + If this symbol represents a metadata assembly returns the underlying . + + Otherwise, this returns . + + + + + A symbol representing a discarded value, e.g. a symbol in the result of + GetSymbolInfo for _ in M(out _) or (x, _) = e. + + + + + The type of the discarded value. + + + + + The top-level nullability of the discarded value. + + + + + Represents the 'dynamic' type in C#. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + An IErrorTypeSymbol is used when the compiler cannot determine a symbol object to return because + of an error. For example, if a field is declared "Goo x;", and the type "Goo" cannot be + found, an IErrorTypeSymbol is returned when asking the field "x" what it's type is. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + When constructing this type, there may have been symbols that seemed to + be what the user intended, but were unsuitable. For example, a type might have been + inaccessible, or ambiguous. This property returns the possible symbols that the user + might have intended. It will return no symbols if no possible symbols were found. + See the CandidateReason property to understand why the symbols were unsuitable. + + + This only applies if this INamedTypeSymbol has TypeKind TypeKind.Error. + If not, an empty ImmutableArray is returned. + + + + + If CandidateSymbols returns one or more symbols, returns the reason that those + symbols were not chosen. Otherwise, returns None. + + + + + Represents an event. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The type of the event. + + + + + The top-level nullability of the event. + + + + + Returns true if the event is a WinRT type event. + + + + + The 'add' accessor of the event. Null only in error scenarios. + + + + + The 'remove' accessor of the event. Null only in error scenarios. + + + + + The 'raise' accessor of the event. Null if there is no raise method. + + + + + The original definition of the event. If the event is constructed from another + symbol by type substitution, OriginalDefinition gets the original symbol, as it was + defined in source or metadata. + + + + + Returns the overridden event, or null. + + + + + Returns interface properties explicitly implemented by this event. + + + Properties imported from metadata can explicitly implement more than one event. + + + + + Represents a field in a class, struct or enum. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + If this field serves as a backing variable for an automatically generated + property or a field-like event, returns that + property/event. Otherwise returns null. + Note, the set of possible associated symbols might be expanded in the future to + reflect changes in the languages. + + + + + Returns true if this field was declared as "const" (i.e. is a constant declaration). + Also returns true for an enum member. + + + + + Returns true if this field was declared as "readonly". + + + + + Returns true if this field was declared as "volatile". + + + + + True if this field is required to be set in an object initializer during construction. + + + + + Returns true if this field was declared as "fixed". + Note that for a fixed-size buffer declaration, this.Type will be a pointer type, of which + the pointed-to type will be the declared element type of the fixed-size buffer. + + + + + If IsFixedSizeBuffer is true, the value between brackets in the fixed-size-buffer declaration. + If IsFixedSizeBuffer is false or there is an error (such as a bad constant value in source), FixedSize is 0. + Note that for fixed-size buffer declaration, this.Type will be a pointer type, of which + the pointed-to type will be the declared element type of the fixed-size buffer. + + + + + Returns the RefKind of the field. + + + + + Custom modifiers associated with the ref modifier, or an empty array if there are none. + + + + + Gets the type of this field. + + + + + Gets the top-level nullability of this field. + + + + + Returns false if the field wasn't declared as "const", or constant value was omitted or erroneous. + True otherwise. + + + + + Gets the constant value of this field + + + + + Returns custom modifiers associated with the field, or an empty array if there are none. + + + + + Get the original definition of this symbol. If this symbol is derived from another + symbol by (say) type substitution, this gets the original symbol, as it was defined in + source or metadata. + + + + + If this field represents a tuple element, returns a corresponding default element field. + Otherwise returns null. + + + A tuple type will always have default elements such as Item1, Item2, Item3... + This API allows matching a field that represents a named element, such as "Alice" + to the corresponding default element field such as "Item1" + + + + + Returns true if this field represents a tuple element which was given an explicit name. + + + + + Represents a function pointer type such as "delegate*<void>". + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Gets the signature of the function pointed to by an instance of the function pointer type. + + + + + Represents a label in method body + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Gets the immediately containing of this . + + + + + Represents a local variable in method body. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Gets the type of this local variable. + + + + + Gets the top-level nullability of this local variable. + + + + + Returns true if this local variable was declared as "const" (i.e. is a constant declaration). + Also returns true for an enum member. + + + + + Returns true if this local is a ref local or a ref readonly local. + Use to get more detailed information. + + + + + Whether the variable is a ref or ref readonly local. + + + + + Returns the scoped kind of the local. + + + + + Returns false if the local variable wasn't declared as "const", or constant value was omitted or erroneous. + True otherwise. + + + + + Gets the constant value of this local variable. + + + + + Returns true if this local variable is function return variable whose name is the function's name, + whose type is the return type of the function and whose initial value is the default of its type. + + + Is always false for the C# local variable + + + + + Returns true if the local variable is declared with fixed-pointer-initializer (in unsafe context). + + + + + Returns true if this local variable is declared as iteration variable + + + + + Returns true if the local variable is declared in resource-acquisition of a 'using statement'; + otherwise false + + + + using (var localVariable = new StreamReader(path)) { ... } + + + + + + Represents a method or method-like symbol (including constructor, + destructor, operator, or property/event accessor). + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Gets what kind of method this is. There are several different kinds of things in the + C# language that are represented as methods. This property allow distinguishing those things + without having to decode the name of the method. + + + + + Returns the arity of this method, or the number of type parameters it takes. + A non-generic method has zero arity. + + + + + Returns whether this method is generic; i.e., does it have any type parameters? + + + + + Returns true if this method is an extension method. + + + + + Returns true if this method is an async method + + + + + Returns whether this method is using CLI VARARG calling convention. This is used for + C-style variable argument lists. This is used extremely rarely in C# code and is + represented using the undocumented "__arglist" keyword. + + Note that methods with "params" on the last parameter are indicated with the "IsParams" + property on ParameterSymbol, and are not represented with this property. + + + + + Returns whether this built-in operator checks for integer overflow. + + + + + Returns true if this method hides base methods by name. This cannot be specified directly + in the C# language, but can be true for methods defined in other languages imported from + metadata. The equivalent of the "hidebyname" flag in metadata. + + + + + Returns true if this method has no return type; i.e., returns "void". + + + + + Returns true if this method returns by reference. + + + + + Returns true if this method returns by ref readonly. + + + + + Returns the RefKind of the method. + + + + + Gets the return type of the method. + + + + + Gets the top-level nullability of the return type of the method. + + + + + Returns the type arguments that have been substituted for the type parameters. + If nothing has been substituted for a given type parameter, + then the type parameter itself is consider the type argument. + + + + + Returns the top-level nullability of the type arguments that have been substituted + for the type parameters. If nothing has been substituted for a given type parameter, + then is returned. + + + + + Get the type parameters on this method. If the method has not generic, + returns an empty list. + + + + + Gets the parameters of this method. If this method has no parameters, returns + an empty list. + + + + + Returns the method symbol that this method was constructed from. The resulting + method symbol + has the same containing type (if any), but has type arguments that are the same + as the type parameters (although its containing type might not). + + + + + Indicates whether the method is readonly, + i.e. whether the 'this' receiver parameter is 'ref readonly'. + Returns true for readonly instance methods and accessors + and for reduced extension methods with a 'this in' parameter. + + + + + Returns true for 'init' set accessors, and false otherwise. + + + + + Get the original definition of this symbol. If this symbol is derived from another + symbol by (say) type substitution, this gets the original symbol, as it was defined in + source or metadata. + + + + + If this method overrides another method (because it both had the override modifier + and there correctly was a method to override), returns the overridden method. + + + + + If this method can be applied to an object, returns the type of object it is applied to. + + + + + If this method can be applied to an object, returns the top-level nullability of the object it is applied to. + + + + + If this method is a reduced extension method, returns the definition of extension + method from which this was reduced. Otherwise, returns null. + + + + + If this method is a reduced extension method, returns a type inferred during reduction process for the type parameter. + + Type parameter of the corresponding method. + Inferred type or Nothing if nothing was inferred. + If this is not a reduced extension method. + If is null. + If doesn't belong to the corresponding method. + + + + If this is an extension method that can be applied to a receiver of the given type, + returns a reduced extension method symbol thus formed. Otherwise, returns null. + + + + + Returns interface methods explicitly implemented by this method. + + + Methods imported from metadata can explicitly implement more than one method, + that is why return type is ImmutableArray. + + + + + Returns the list of custom modifiers, if any, associated with the return type. + + + + + Custom modifiers associated with the ref modifier, or an empty array if there are none. + + + + + Returns the list of custom attributes, if any, associated with the returned value. + + + + + The calling convention enum of the method symbol. + + + + + Modifier types that are considered part of the calling convention of this method, if the is + and the is . If this is not a function pointer signature or the calling convention is + not unmanaged, this is an empty array. Order and duplication of these modifiers reflect source/metadata order and duplication, whichever this symbol came from. + + + + + Returns a symbol (e.g. property, event, etc.) associated with the method. + + + If this method has of or , + returns the property that this method is the getter or setter for. + If this method has of or , + returns the event that this method is the adder or remover for. + Note, the set of possible associated symbols might be expanded in the future to + reflect changes in the languages. + + + + + Returns a constructed method given its type arguments. + + The immediate type arguments to be replaced for type + parameters in the method. + + + + Returns a constructed method given its type arguments and type argument nullable annotations. + + + + + If this is a partial method implementation part, returns the corresponding + definition part. Otherwise null. + + + + + If this is a partial method declaration without a body, and the method is + implemented with a body, returns that implementing definition. Otherwise + null. + + + + + Returns the implementation flags for the given method symbol. + + + + + Return true if this is a partial method definition without a body. If there + is an implementing body, it can be retrieved with . + + + + + Platform invoke information, or null if the method isn't a P/Invoke. + + + + + If this method is a Lambda method (MethodKind = MethodKind.LambdaMethod) and + there is an anonymous delegate associated with it, returns this delegate. + + Returns null if the symbol is not a lambda or if it does not have an + anonymous delegate associated with it. + + + + + Returns a flag indicating whether this symbol has at least one applied/inherited conditional attribute. + + + + + Represents a module within an assembly. Every assembly contains one or more modules. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Returns a NamespaceSymbol representing the global (root) namespace, with + module extent, that can be used to browse all of the symbols defined in this module. + + + + + Given a namespace symbol, returns the corresponding module specific namespace symbol + + + + + Returns an array of assembly identities for assemblies referenced by this module. + Items at the same position from ReferencedAssemblies and from ReferencedAssemblySymbols + correspond to each other. + + + + + Returns an array of AssemblySymbol objects corresponding to assemblies referenced + by this module. Items at the same position from ReferencedAssemblies and + from ReferencedAssemblySymbols correspond to each other. + + + + + If this symbol represents a metadata module returns the underlying . + + Otherwise, this returns . + + + + + Represents a type other than an array, a pointer, a type parameter. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Returns the arity of this type, or the number of type parameters it takes. + A non-generic type has zero arity. + + + + + True if this type or some containing type has type parameters. + + + + + True if this is a reference to an unbound generic type. A generic type is + considered unbound if all of the type argument lists in its fully qualified + name are empty. Note that the type arguments of an unbound generic type will be + returned as error types because they do not really have type arguments. An unbound + generic type yields null for its BaseType and an empty result for its Interfaces. + + + + + Returns true if the type is a Script class. + It might be an interactive submission class or a Script class in a csx file. + + + + + Returns true if the type is the implicit class that holds onto invalid global members (like methods or + statements in a non script file). + + + + + Specifies that the class or interface is imported from another module. See + and + + + + + Indicates the type is declared in source and is only visible in the file it is declared in. + + + + + Returns collection of names of members declared within this type. + + + + + Returns the type parameters that this type has. If this is a non-generic type, + returns an empty ImmutableArray. + + + + + Returns the type arguments that have been substituted for the type parameters. + If nothing has been substituted for a given type parameter, + then the type parameter itself is considered the type argument. + + + + + Returns the top-level nullability of the type arguments that have been substituted + for the type parameters. If nothing has been substituted for a given type parameter, + then is returned for that type argument. + + + + + Returns custom modifiers for the type argument that has been substituted for the type parameter. + The modifiers correspond to the type argument at the same ordinal within the + array. Returns an empty array if there are no modifiers. + + + + + Get the original definition of this type symbol. If this symbol is derived from another + symbol by (say) type substitution, this gets the original symbol, as it was defined in + source or metadata. + + + + + For delegate types, gets the delegate's invoke method. Returns null on + all other kinds of types. Note that it is possible to have an ill-formed + delegate type imported from metadata which does not have an Invoke method. + Such a type will be classified as a delegate but its DelegateInvokeMethod + would be null. + + + + + For enum types, gets the underlying type. Returns null on all other + kinds of types. + + + + + Returns the type symbol that this type was constructed from. This type symbol + has the same containing type (if any), but has type arguments that are the same + as the type parameters (although its containing type might not). + + + + + Returns a constructed type given its type arguments. + + The immediate type arguments to be replaced for type + parameters in the type. + + + + Returns a constructed type given its type arguments and type argument nullable annotations. + + + + + Returns an unbound generic type of this named type. + + + + + Get the instance constructors for this type. + + + + + Get the static constructors for this type. + + + + + Get the both instance and static constructors for this type. + + + + + For implicitly declared delegate types returns the EventSymbol that caused this + delegate type to be generated. + For all other types returns null. + Note, the set of possible associated symbols might be expanded in the future to + reflect changes in the languages. + + + + + Determines if the symbol might contain extension methods. + If false, the symbol does not contain extension methods. + + + + + If this is a tuple type with element names, returns the symbol for the tuple type without names. + Otherwise, returns null. + The type argument corresponding to the type of the extension field (VT[8].Rest), + which is at the 8th (one based) position is always a symbol for another tuple, + rather than its underlying type. + + + + + Returns fields that represent tuple elements for types that are tuples. + + If this type is not a tuple, then returns default. + + + + + True if the type is serializable (has Serializable metadata flag). + + + + + If this is a native integer, returns the symbol for the underlying type, + either or . + Otherwise, returns null. + + + + + Represents either a namespace or a type. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Get all the members of this symbol. + + An ImmutableArray containing all the members of this symbol. If this symbol has no members, + returns an empty ImmutableArray. Never returns Null. + + + + Get all the members of this symbol that have a particular name. + + An ImmutableArray containing all the members of this symbol with the given name. If there are + no members with this name, returns an empty ImmutableArray. Never returns Null. + + + + Get all the members of this symbol that are types. + + An ImmutableArray containing all the types that are members of this symbol. If this symbol has no type members, + returns an empty ImmutableArray. Never returns null. + + + + Get all the members of this symbol that are types that have a particular name, of any arity. + + An ImmutableArray containing all the types that are members of this symbol with the given name. + If this symbol has no type members with this name, + returns an empty ImmutableArray. Never returns null. + + + + Get all the members of this symbol that are types that have a particular name and arity + + An ImmutableArray containing all the types that are members of this symbol with the given name and arity. + If this symbol has no type members with this name and arity, + returns an empty ImmutableArray. Never returns null. + + + + Returns true if this symbol is a namespace. If it is not a namespace, it must be a type. + + + + + Returns true if this symbols is a type. If it is not a type, it must be a namespace. + + + + + Represents a namespace. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Get all the members of this symbol. + + + + + Get all the members of this symbol that have a particular name. + + + + + Get all the members of this symbol that are namespaces. + + + + + Returns whether this namespace is the unnamed, global namespace that is + at the root of all namespaces. + + + + + The kind of namespace: Module, Assembly or Compilation. + Module namespaces contain only members from the containing module that share the same namespace name. + Assembly namespaces contain members for all modules in the containing assembly that share the same namespace name. + Compilation namespaces contain all members, from source or referenced metadata (assemblies and modules) that share the same namespace name. + + + + + The containing compilation for compilation namespaces. + + + + + If a namespace is an assembly or compilation namespace, it may be composed of multiple + namespaces that are merged together. If so, ConstituentNamespaces returns + all the namespaces that were merged. If this namespace was not merged, returns + an array containing only this namespace. + + + + + Represents a parameter of a method or property. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Whether the parameter passed by value or by reference. + + + + + Returns the scoped kind of the parameter. + + + + + Returns true if the parameter was declared as a parameter array. + + + + + Returns true if the parameter is optional. + + + + + Returns true if the parameter is the hidden 'this' ('Me' in Visual Basic) parameter. + + + + + Returns true if the parameter is a discard parameter. + + + + + Gets the type of the parameter. + + + + + Gets the top-level nullability of the parameter. + + + + + Custom modifiers associated with the parameter type, or an empty array if there are none. + + + + + Custom modifiers associated with the ref modifier, or an empty array if there are none. + + + + + Gets the ordinal position of the parameter. The first parameter has ordinal zero. + The 'this' parameter ('Me' in Visual Basic) has ordinal -1. + + + + + Returns true if the parameter specifies a default value to be passed + when no value is provided as an argument to a call. The default value + can be obtained with the property. + + + + + Returns the default value of the parameter. + + + Returns null if the parameter type is a struct and the default value of the parameter + is the default value of the struct type. + + The parameter has no default value. + + + + Get the original definition of this symbol. If this symbol is derived from another + symbol by (say) type substitution, this gets the original symbol, as it was defined in + source or metadata. + + + + + Represents a pointer type such as "int *". Pointer types + are used only in unsafe code. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Gets the type of the storage location that an instance of the pointer type points to. + + + + + Custom modifiers associated with the pointer type, or an empty array if there are none. + + + Some managed languages may represent special information about the pointer type + as a custom modifier on either the pointer type or the element type, or + both. + + + + + Represents a preprocessing conditional compilation symbol. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents a property or indexer. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Returns whether the property is really an indexer. + + + + + True if this is a read-only property; that is, a property with no set accessor. + + + + + True if this is a write-only property; that is, a property with no get accessor. + + + + + True if this property is required to be set in an object initializer during construction. + + + + + Returns true if this property is an auto-created WithEvents property that takes place of + a field member when the field is marked as WithEvents. + + + + + Returns true if this property returns by reference. + + + + + Returns true if this property returns by reference a readonly variable. + + + + + Returns the RefKind of the property. + + + + + The type of the property. + + + + + The parameters of this property. If this property has no parameters, returns + an empty list. Parameters are only present on indexers, or on some properties + imported from a COM interface. + + + + + The 'get' accessor of the property, or null if the property is write-only. + + + + + The 'set' accessor of the property, or null if the property is read-only. + + + + + The original definition of the property. If the property is constructed from another + symbol by type substitution, OriginalDefinition gets the original symbol, as it was + defined in source or metadata. + + + + + Returns the overridden property, or null. + + + + + Returns interface properties explicitly implemented by this property. + + + Properties imported from metadata can explicitly implement more than one property. + + + + + Custom modifiers associated with the ref modifier, or an empty array if there are none. + + + + + The list of custom modifiers, if any, associated with the type of the property. + + + + + Represents a range variable in a query expression. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents a source assembly symbol exposed by the compiler. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Represents a symbol (namespace, class, method, parameter, etc.) + exposed by the compiler. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + Gets the indicating what kind of symbol it is. + + + + + Gets the source language ("C#" or "Visual Basic"). + + + + + Gets the symbol name. Returns the empty string if unnamed. + + + + + Gets the name of a symbol as it appears in metadata. Most of the time, this + is the same as the Name property, with the following exceptions: + + + The metadata name of generic types includes the "`1", "`2" etc. suffix that + indicates the number of type parameters (it does not include, however, names of + containing types or namespaces). + + + The metadata name of explicit interface names have spaces removed, compared to + the name property. + + + The length of names is limited to not exceed metadata restrictions. + + + + + + + Gets the metadata token associated with this symbol, or 0 if the symbol is not loaded from metadata. + + + + + Gets the for the immediately containing symbol. + + + + + Gets the for the containing assembly. Returns null if the + symbol is shared across multiple assemblies. + + + + + Gets the for the containing module. Returns null if the + symbol is shared across multiple modules. + + + + + Gets the for the containing type. Returns null if the + symbol is not contained within a type. + + + + + Gets the for the nearest enclosing namespace. Returns null if the + symbol isn't contained in a namespace. + + + + + Gets a value indicating whether the symbol is the original definition. Returns false + if the symbol is derived from another symbol, by type substitution for instance. + + + + + Gets a value indicating whether the symbol is static. + + + + + Gets a value indicating whether the symbol is virtual. + + + + + Gets a value indicating whether the symbol is an override of a base class symbol. + + + + + Gets a value indicating whether the symbol is abstract. + + + + + Gets a value indicating whether the symbol is sealed. + + + + + Gets a value indicating whether the symbol is defined externally. + + + + + Returns true if this symbol was automatically created by the compiler, and does not have + an explicit corresponding source code declaration. + + + This is intended for symbols that are ordinary symbols in the language sense, and may be + used by code, but that are simply declared implicitly rather than with explicit language + syntax. + + + Examples include (this list is not exhaustive): + + The default constructor for a class or struct that is created if one is not provided. + The BeginInvoke/Invoke/EndInvoke methods for a delegate. + The generated backing field for an auto property or a field-like event. + The "this" parameter for non-static methods. + The "value" parameter for a property setter. + The parameters on indexer accessor methods (not on the indexer itself). + Methods in anonymous types. + + + + The class and entry point method for top-level statements are not considered as implicitly declared. + + + + + + Returns true if this symbol can be referenced by its name in code. + + + + + Gets the locations where the symbol was originally defined, either in source or + metadata. Some symbols (for example, partial classes) may be defined in more than one + location. + + + + + Get the syntax node(s) where this symbol was declared in source. Some symbols (for example, + partial classes) may be defined in more than one location. This property should return + one or more syntax nodes only if the symbol was declared in source code and also was + not implicitly declared (see the IsImplicitlyDeclared property). + + + Note that for namespace symbol, the declaring syntax might be declaring a nested namespace. + For example, the declaring syntax node for N1 in "namespace N1.N2 {...}" is the entire + NamespaceDeclarationSyntax for N1.N2. For the global namespace, the declaring syntax will + be the CompilationUnitSyntax. + + + + The syntax node(s) that declared the symbol. If the symbol was declared in metadata + or was implicitly declared, returns an empty read-only array. + + + + + Gets the attributes for the symbol. Returns an empty + if there are no attributes. + + + + + Gets a indicating the declared accessibility for the symbol. + Returns NotApplicable if no accessibility is declared. + + + + + Gets the for the original definition of the symbol. + If this symbol is derived from another symbol, by type substitution for instance, + this gets the original symbol, as it was defined in source or metadata. + + + + + Returns the Documentation Comment ID for the symbol, or null if the symbol doesn't + support documentation comments. + + + + + Gets the XML (as text) for the comment associated with the symbol. + + Preferred culture or null for the default. + Optionally, expand <include> elements. No impact on non-source documentation comments. + Token allowing cancellation of request. + The XML that would be written to the documentation file for the symbol. + + + + Converts the symbol to a string representation. + + Format or null for the default. + A formatted string representation of the symbol. + + + + Convert a symbol to an array of string parts, each of which has a kind. Useful for + colorizing the display string. + + Formatting rules - null implies + SymbolDisplayFormat.ErrorMessageFormat. + A read-only array of string parts. + + + + Convert a symbol to a string that can be displayed to the user. May be tailored to a + specific location in the source code. + + Binding information (for determining names appropriate to + the context). + A position in the source code (context). + Formatting rules - null implies + SymbolDisplayFormat.MinimallyQualifiedFormat. + A formatted string that can be displayed to the user. + + + + Convert a symbol to an array of string parts, each of which has a kind. May be tailored + to a specific location in the source code. Useful for colorizing the display string. + + Binding information (for determining names appropriate to + the context). + A position in the source code (context). + Formatting rules - null implies + SymbolDisplayFormat.MinimallyQualifiedFormat. + A read-only array of string parts. + + + + Indicates that this symbol uses metadata that cannot be supported by the language. + + + Examples include: + + Pointer types in VB + ByRef return type + Required custom modifiers + + + + + This is distinguished from, for example, references to metadata symbols defined in assemblies that weren't referenced. + Symbols where this returns true can never be used successfully, and thus should never appear in any IDE feature. + + + + This is set for metadata symbols, as follows: + + Type - if a type is unsupported (for example, a pointer type) + Method - parameter or return type is unsupported + Field - type is unsupported + Event - type is unsupported + Property - type is unsupported + Parameter - type is unsupported + + + + + + + Determines if this symbol is equal to another, according to the rules of the provided + + The other symbol to compare against + The to use when comparing symbols + True if the symbols are equivalent. + + + + Returns the constructed form of the ReducedFrom property, + including the type arguments that were either inferred during reduction or supplied at the call site. + + + + + Returns true if a given field is a default tuple element + + + + + Returns true if a given field is a tuple element + + + + + Return the name of the field if the field is an explicitly named tuple element. + Otherwise returns null. + + + Note that it is possible for an element to be both "Default" and to have a user provided name. + That could happen if the provided name matches the default name such as "Item10" + + + + + Given that an assembly with identity assemblyGrantingAccessIdentity granted access to assemblyWantingAccess, + check the public keys to ensure the internals-visible-to check should succeed. This is used by both the + C# and VB implementations as a helper to implement `bool IAssemblySymbol.GivesAccessTo(IAssemblySymbol toAssembly)`. + + + + + Represents a type parameter in a generic type or generic method. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + The ordinal position of the type parameter in the parameter list which declares + it. The first type parameter has ordinal zero. + + + + + The variance annotation, if any, of the type parameter declaration. Type parameters may be + declared as covariant (out), contravariant (in), or neither. + + + + + The type parameter kind of this type parameter. + + + + + The method that declares the type parameter, or null. + + + + + The type that declares the type parameter, or null. + + + + + True if the reference type constraint (class) was specified for the type parameter. + + + + + If is true, returns the top-level nullability of the + class constraint that was specified for the type parameter. If there was no class + constraint, this returns . + + + + + True if the value type constraint (struct) was specified for the type parameter. + + + + + True if the value type constraint (unmanaged) was specified for the type parameter. + + + + + True if the notnull constraint (notnull) was specified for the type parameter. + + + + + True if the parameterless constructor constraint (new()) was specified for the type parameter. + + + + + The types that were directly specified as constraints on the type parameter. + + + + + The top-level nullabilities that were directly specified as constraints on the + constraint types. + + + + + Get the original definition of this type symbol. If this symbol is derived from another + symbol by (say) type substitution, this gets the original symbol, as it was defined in + source or metadata. + + + + + If this is a type parameter of a reduced extension method, gets the type parameter definition that + this type parameter was reduced from. Otherwise, returns Nothing. + + + + + Represents a type. + + + This interface is reserved for implementation by its associated APIs. We reserve the right to + change it in the future. + + + + + An enumerated value that identifies whether this type is an array, pointer, enum, and so on. + + + + + The declared base type of this type, or null. The object type, interface types, + and pointer types do not have a base type. The base type of a type parameter + is its effective base class. + + + + + Gets the set of interfaces that this type directly implements. This set does not include + interfaces that are base interfaces of directly implemented interfaces. This does + include the interfaces declared as constraints on type parameters. + + + + + The list of all interfaces of which this type is a declared subtype, excluding this type + itself. This includes all declared base interfaces, all declared base interfaces of base + types, and all declared base interfaces of those results (recursively). This also is the effective + interface set of a type parameter. Each result + appears exactly once in the list. This list is topologically sorted by the inheritance + relationship: if interface type A extends interface type B, then A precedes B in the + list. This is not quite the same as "all interfaces of which this type is a proper + subtype" because it does not take into account variance: AllInterfaces for + IEnumerable<string> will not include IEnumerable<object>. + + + + + True if this type is known to be a reference type. It is never the case that + and both return true. However, for an unconstrained type + parameter, and will both return false. + + + + + True if this type is known to be a value type. It is never the case that + and both return true. However, for an unconstrained type + parameter, and will both return false. + + + + + Is this a symbol for an anonymous type (including anonymous VB delegate). + + + + + Is this a symbol for a tuple . + + + + + True if the type represents a native integer. In C#, the types represented + by language keywords 'nint' and 'nuint'. + + + + + The original definition of this symbol. If this symbol is constructed from another + symbol by type substitution then gets the original symbol as it was defined in + source or metadata. + + + + + An enumerated value that identifies certain 'special' types such as . + Returns if the type is not special. + + + + + Returns the corresponding symbol in this type or a base type that implements + interfaceMember (either implicitly or explicitly), or null if no such symbol exists + (which might be either because this type doesn't implement the container of + interfaceMember, or this type doesn't supply a member that successfully implements + interfaceMember). + + + Must be a non-null interface property, method, or event. + + + + + True if the type is ref-like, meaning it follows rules similar to CLR by-ref variables. False if the type + is not ref-like or if the language has no concept of ref-like types. + + + is a commonly used ref-like type. + + + + + True if the type is unmanaged according to language rules. False if managed or if the language + has no concept of unmanaged types. + + + + + True if the type is readonly. + + + + + True if the type is a record. + + + + + Converts an ITypeSymbol and a nullable flow state to a string representation. + + The top-level nullability to use for formatting. + Format or null for the default. + A formatted string representation of the symbol with the given nullability. + + + + Converts a symbol to an array of string parts, each of which has a kind. Useful + for colorizing the display string. + + The top-level nullability to use for formatting. + Format or null for the default. + A read-only array of string parts. + + + + Converts a symbol to a string that can be displayed to the user. May be tailored to a + specific location in the source code. + + Binding information (for determining names appropriate to + the context). + The top-level nullability to use for formatting. + A position in the source code (context). + Formatting rules - null implies + A formatted string that can be displayed to the user. + + + + Convert a symbol to an array of string parts, each of which has a kind. May be tailored + to a specific location in the source code. Useful for colorizing the display string. + + Binding information (for determining names appropriate to + the context). + The top-level nullability to use for formatting. + A position in the source code (context). + Formatting rules - null implies + A read-only array of string parts. + + + + Nullable annotation associated with the type, or if there are none. + + + + + Returns the same type as this type but with the given nullable annotation. + + The nullable annotation to use + + + + A class that provides constants for common language names. + + + + + The common name used for the C# language. + + + + + The common name used for the Visual Basic language. + + + + + The common name used for the F# language. + + + F# is not a supported compile target for the Roslyn compiler. + + + + + Enumeration of the possible "degrees of managed" for a type. + + + + + Enumeration for possible kinds of method symbols. + + + + + An anonymous method or lambda expression + + + + + + + + + + Method is a constructor. + + + + + Method is a conversion. + + + + + Method is a delegate invoke. + + + + + Method is a destructor. + + + + + Method is an event add. + + + + + Method is an event raise. + + + + + Method is an event remove. + + + + + Method is an explicit interface implementation. + + + + + Method is an operator. + + + + + Method is an ordinary method. + + + + + Method is a property get. + + + + + Method is a property set. + + + + + An extension method with the "this" parameter removed. + + + + + Method is a static constructor. + + + + + + + + + + A built-in operator. + + + + + Declare Sub or Function. + + + + + Method is declared inside of another method. + + + + + Method represents the signature of a function pointer type. + + + + + Describes the kind of the namespace extent. + + + + + The nullable annotation of the expression represented by the syntax node. This represents + the nullability of expressions that can be assigned to this expression, if this expression + can be used as an lvalue. + + + + + The nullable flow state of the expression represented by the syntax node. This represents + the compiler's understanding of whether this expression can currently contain null, if + this expression can be used as an rvalue. + + + + + Represents the nullability of values that can be assigned + to an expression used as an lvalue. + + + + + The expression has not been analyzed, or the syntax is + not an expression (such as a statement). + There are a few different reasons the expression could have not been analyzed: + + + The symbol producing the expression comes from a method that has not been annotated, such as invoking a C# 7.3 or earlier method, or a method in this compilation that is in a disabled context. + Nullable is completely disabled in this compilation. + + + + + + The expression is not annotated (does not have a ?). + + + + + The expression is annotated (does have a ?). + + + + + Represents the compiler's analysis of whether an expression may be null + + + + + Syntax is not an expression, or was not analyzed. + + + + + Expression is not null. + + + + + Expression may be null. + + + + + This method directly converts a to a , + ignoring the to which it is attached. It should only be used when converting + an RValue flow state to an RValue annotation for returning via the public API. For general use, please + use Microsoft.CodeAnalysis.CSharp.Symbols.TypeWithState.ToTypeWithAnnotations. + + + + + Information that describes how a method from the underlying Platform is to be invoked. + + + + + Module name. Null if value specified in the attribute is not valid. + + + + + Name of the native entry point or null if not specified (the effective name is the same as the name of the target method). + + + + + Controls whether the field causes the common language runtime + to search an unmanaged DLL for entry-point names other than the one specified. + + + + + Indicates how to marshal string parameters and controls name mangling. + + + + + Indicates whether the callee calls the SetLastError Win32 API function before returning from the attributed method. + + + + + Indicates the calling convention of an entry point. + + + + + Enables or disables best-fit mapping behavior when converting Unicode characters to ANSI characters. + Null if not specified (the setting for the containing type or assembly should be used, ). + + + + + Enables or disables the throwing of an exception on an unmappable Unicode character that is converted to an ANSI "?" character. + Null if not specified. + + + + + Denotes the kind of reference. + + + + + Indicates a "value" parameter or return type. + + + + + Indicates a "ref" parameter or return type. + + + + + Indicates an "out" parameter. + + + + + Indicates an "in" parameter. + + + + + Indicates a "ref readonly" return type. + + + + + Enumeration for kinds of scoped modifiers. + + + + + Not scoped. + + + + + A ref scoped to the enclosing block or method. + + + + + A value scoped to the enclosing block or method. + + + + + Allows for the comparison of two instances + + + + + Compares two instances based on the default comparison rules, equivalent to calling . + + + Comparing string and string? will return equal. Use if you don't want them to be considered equal. + + + + + Compares two instances, considering that a reference type and the same nullable reference type are not equal. + + + Comparing string and string? will not return equal. Use if you want them to be considered equal. + + + + + Determines if two instances are equal according to the rules of this comparer + + The first symbol to compare + The second symbol to compare + True if the symbols are equivalent + + + + Specifies the possible kinds of symbols. + + + + + Symbol is an alias. + + + + + Symbol is an array type. + + + + + Symbol is an assembly. + + + + + Symbol is a dynamic type. + + + + + Symbol that represents an error + + + + + Symbol is an Event. + + + + + Symbol is a field. + + + + + Symbol is a label. + + + + + Symbol is a local. + + + + + Symbol is a method. + + + + + Symbol is a netmodule. + + + + + Symbol is a named type (e.g. class). + + + + + Symbol is a namespace. + + + + + Symbol is a parameter. + + + + + Symbol is a pointer type. + + + + + Symbol is a property. + + + + + Symbol is a range variable of a query expression. + + + + + Symbol is a type parameter. + + + + + Symbol is a preprocessing/conditional compilation constant. + + + + + Symbol represents a value that is discarded, e.g. in M(out _) + + + + + Symbol represents a function pointer type + + + + + Internal Symbol representing the inferred signature of + a lambda expression or method group. + + + + + Specifies the different kinds of comparison between types. + + + + + Represents a constant value used as an argument to a custom attribute. + + + + + The kind of the constant. + + + + + Returns the of the constant, + or null if the type can't be determined (error). + + + + + True if the constant represents a null reference. + + + + + The value for a non-array constant. + + + + + Unlike returns when the value is a symbol. + + + + + The value for a array. + + + + + TypedConstant isn't computing its own kind from the type symbol because it doesn't + have a way to recognize the well-known type System.Type. + + + + + Represents the kind of a TypedConstant. + + + + + Represents a simple value or a read-only array of . + + + + + True if the constant represents a null literal. + + + + + Enumeration for possible kinds of type symbols. + + + + + Type's kind is undefined. + + + + + Type is an array type. + + + + + Type is a class. + + + + + Type is a delegate. + + + + + Type is dynamic. + + + + + Type is an enumeration. + + + + + Type is an error type. + + + + + Type is an interface. + + + + + Type is a module. + + + + + Type is a pointer. + + + + + Type is a C# struct or VB Structure + + + + + Type is a C# struct or VB Structure + + + + + Type is a type parameter. + + + + + Type is an interactive submission. + + + + + Type is a function pointer. + + + + + Internal Symbol representing the inferred signature of + a lambda expression or method group. + + + + + Type layout information. + + + + + Layout kind (Layout flags in metadata). + + + + + Field alignment (PackingSize field in metadata). + + + + + Size of the type. + + + + + Represents the different kinds of type parameters. + + + + + Type parameter of a named type. For example: T in ]]>. + + + + + Type parameter of a method. For example: T in ()]]>. + + + + + Type parameter in a cref attribute in XML documentation comments. For example: T in ]]>. + + + + + An enumeration declaring the kinds of variance supported for generic type parameters. + + + + + Invariant. + + + + + Covariant (out). + + + + + Contravariant (in). + + + + + Specifies the member names known to the compiler (such as .ctor or op_Explicit). + + + + + Name of the enum backing field. + + + + + The name assigned to an instance constructor. + + + + + The name assigned to the static constructor. + + + + + The symbol name assigned to all indexers, other than explicit interface implementations. + + + Will not correspond to the name that appears in metadata. + + + + + The name assigned to the destructor. + + + + + The name assigned to the delegate Invoke method. + + + + + The name assigned to the delegate BeginInvoke method. + + + + + The name assigned to the delegate EndInvoke method. + + + + + The name of an entry point method. + + + + + The default fully qualified name of a Script class. + + + + + The name assigned to Object.ToString method. + + + + + The name assigned to Object.Equals method. + + + + + The name assigned to Object.GetHashCode method. + + + + + The name assigned to an implicit (widening) conversion. + + + + + The name assigned to an explicit (narrowing) conversion. + + + + + The name assigned to a checked explicit (narrowing) conversion. + + + + + The name assigned to the Addition operator. + + + + + The name assigned to the checked Addition operator. + + + + + The name assigned to the BitwiseAnd operator. + + + + + The name assigned to the BitwiseOr operator. + + + + + The name assigned to the Decrement operator. + + + + + The name assigned to the checked Decrement operator. + + + + + The name assigned to the Division operator. + + + + + The name assigned to the checked Division operator. + + + + + The name assigned to the Equality operator. + + + + + The name assigned to the ExclusiveOr operator. + + + + + The name assigned to the False operator. + + + + + The name assigned to the GreaterThan operator. + + + + + The name assigned to the GreaterThanOrEqual operator. + + + + + The name assigned to the Increment operator. + + + + + The name assigned to the checked Increment operator. + + + + + The name assigned to the Inequality operator. + + + + + The name assigned to the LeftShift operator. + + + + + The name assigned to the UnsignedLeftShift operator. + + + + + The name assigned to the LessThan operator. + + + + + The name assigned to the LessThanOrEqual operator. + + + + + The name assigned to the LogicalNot operator. + + + + + The name assigned to the LogicalOr operator. + + + + + The name assigned to the LogicalAnd operator. + + + + + The name assigned to the Modulus operator. + + + + + The name assigned to the Multiply operator. + + + + + The name assigned to the checked Multiply operator. + + + + + The name assigned to the OnesComplement operator. + + + + + The name assigned to the RightShift operator. + + + + + The name assigned to the UnsignedRightShift operator. + + + + + The name assigned to the Subtraction operator. + + + + + The name assigned to the checked Subtraction operator. + + + + + The name assigned to the True operator. + + + + + The name assigned to the UnaryNegation operator. + + + + + The name assigned to the checked UnaryNegation operator. + + + + + The name assigned to the UnaryPlus operator. + + + + + The name assigned to the Concatenate operator. + + + + + The name assigned to the Exponent operator. + + + + + The name assigned to the IntegerDivision operator. + + + + + The name assigned to the Like operator. + + + + + The required name for the GetEnumerator method used in a ForEach statement. + + + + + The required name for the GetAsyncEnumerator method used in a ForEach statement. + + + + + The required name for the MoveNextAsync method used in a ForEach-await statement. + + + + + The required name for the Deconstruct method used in a deconstruction. + + + + + The required name for the MoveNext method used in a ForEach statement. + + + + + The required name for the Current property used in a ForEach statement. + + + + + The required name for the property used in + a ForEach statement when the collection is a nullable struct. + + + + + The name for the Add method to be invoked for each element in a collection initializer expression + (see C# Specification, §7.6.10.3 Collection initializers). + + + + + The required name for the GetAwaiter method used to obtain an awaiter for a task + (see C# Specification, §7.7.7.1 Awaitable expressions). + + + + + The required name for the IsCompleted property used to determine if a task is already complete + (see C# Specification, §7.7.7.1 Awaitable expressions). + + + + + The required name for the GetResult method used to obtain the outcome of a task once it is complete + (see C# Specification, §7.7.7.1 Awaitable expressions). + + + + + The name of the method used to register a resumption delegate + (see C# Specification, §7.7.7.1 Awaitable expressions). + + + + + The required name for the Dispose method used in a Using statement. + + + + + The required name for the DisposeAsync method used in an await using statement. + + + + + The required name for the Count property used in a pattern-based Index or Range indexer. + + + + + The required name for the Length property used in a pattern-based Index or Range indexer. + + + + + The required name for the Slice method used in a pattern-based Range indexer. + + + + + The required name for the PrintMembers method that is synthesized in a record. + + + + + The name of an entry point method synthesized for top-level statements. + + + + + The name of a type synthesized for a top-level statements entry point method. + + + + + List of entries sorted in source order, each of which captures a + position in the supplied syntax tree and the set of diagnostics (warnings) + whose reporting should either be suppressed or enabled at this position. + + + + + Returns list of entries sorted in source order, each of which captures a + position in the supplied syntax tree and the set of diagnostics (warnings) + whose reporting should either be suppressed or enabled at this position. + + + + + Returns the reporting state for the supplied diagnostic id at the supplied position + in the associated syntax tree. + + + + + Gets the entry with the largest position less than or equal to supplied position. + + + + + Struct that represents an entry in the warning state map. Sorts by position in the associated syntax tree. + + + + + Gets the separator at the given index in this list. + + The index. + + + + + WARN WARN WARN: This should be used with extreme caution - the underlying builder does + not give any indication that it is from a separated syntax list but the constraints + (node, token, node, token, ...) should still be maintained. + + + In order to avoid creating a separate pool of SeparatedSyntaxListBuilders, we expose + our underlying SyntaxListBuilder to SyntaxListPool. + + + + + Find the slot that contains the given offset. + + The target offset. Must be between 0 and . + The slot index of the slot containing the given offset. + + This implementation uses a binary search to find the first slot that contains + the given offset. + + + + + Adds to the end of this builder. No change happens if is + passed in. + + + + + Provides caching functionality for green nonterminals with up to 3 children. + Example: + When constructing a node with given kind, flags, child1 and child2, we can look up + in the cache whether we already have a node that contains same kind, flags, + child1 and child2 and use that. + + For the purpose of children comparison, reference equality is used as a much cheaper + alternative to the structural/recursive equality. This implies that in order to de-duplicate + a node to a cache node, the children of two nodes must be already de-duplicated. + When adding a node to the cache we verify that cache does contain node's children, + since otherwise there is no reason for the node to be used. + Tokens/nulls are for this purpose considered deduplicated. Indeed most of the tokens + are deduplicated via quick-scanner caching, so we just assume they all are. + + As a result of above, "fat" nodes with 4 or more children or their recursive parents + will never be in the cache. This naturally limits the typical single cache item to be + a relatively simple expression. We do not want the cache to be completely unbounded + on the item size. + While it still may be possible to store a gigantic nested binary expression, + it should be a rare occurrence. + + We only consider "normal" nodes to be cacheable. + Nodes with diagnostics/annotations/directives/skipped, etc... have more complicated identity + and are not likely to be repetitive. + + + + + + This is a SyntaxReference implementation that lazily translates the result (SyntaxNode) of the + original syntax reference to another one. + + + + + Creates a new node identical to this node with the specified annotations attached. + + Original node. + Annotations to be added to the new node. + + + + Creates a new node identical to this node with the specified annotations attached. + + Original node. + Annotations to be added to the new node. + + + + Creates a new node identical to this node with the specified annotations removed. + + Original node. + Annotations to be removed from the new node. + + + + Creates a new node identical to this node with the specified annotations removed. + + Original node. + Annotations to be removed from the new node. + + + + Creates a new node identical to this node with the annotations of the specified kind removed. + + Original node. + The kind of annotation to remove. + + + + Gets the number of children contained in the . + + + + Gets the child at the specified index. + The zero-based index of the child to get. + + is less than 0.-or- is equal to or greater than . + + + + internal indexer that does not verify index. + Used when caller has already ensured that index is within bounds. + + + + + Locate the node or token that is a child of the given and contains the given position. + + The to search. + The position. + The node or token that spans the given position. + + Assumes that is within the span of . + + + + + internal indexer that does not verify index. + Used when caller has already ensured that index is within bounds. + + + + + Returns the first child in the list. + + The first child in the list. + The list is empty. + + + + Returns the last child in the list. + + The last child in the list. + The list is empty. + + + + Returns a list which contains all children of in reversed order. + + which contains all children of in reversed order + + + Returns an enumerator that iterates through the . + A for the . + + + Determines whether the specified object is equal to the current instance. + true if the specified object is a structure and is equal to the current instance; otherwise, false. + The object to be compared with the current instance. + + + Determines whether the specified structure is equal to the current instance. + true if the specified structure is equal to the current instance; otherwise, false. + The structure to be compared with the current instance. + + + Returns the hash code for the current instance. + A 32-bit signed integer hash code. + + + Indicates whether two structures are equal. + true if is equal to ; otherwise, false. + The structure on the left side of the equality operator. + The structure on the right side of the equality operator. + + + Indicates whether two structures are unequal. + true if is equal to ; otherwise, false. + The structure on the left side of the inequality operator. + The structure on the right side of the inequality operator. + + + Enumerates the elements of a . + + + Advances the enumerator to the next element of the . + true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection. + + + Gets the element at the current position of the enumerator. + The element in the at the current position of the enumerator. + + + Sets the enumerator to its initial position, which is before the first element in the collection. + + + + Gets the element in the collection at the current position of the enumerator. + + + The element in the collection at the current position of the enumerator. + + + + + Gets the element in the collection at the current position of the enumerator. + + + The element in the collection at the current position of the enumerator. + + + + + Advances the enumerator to the next element of the collection. + + + true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection. + + + + + Sets the enumerator to its initial position, which is before the first element in the collection. + + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Gets the element in the collection at the current position of the enumerator. + + + The element in the collection at the current position of the enumerator. + + + + + Gets the element in the collection at the current position of the enumerator. + + + The element in the collection at the current position of the enumerator. + + + + + Advances the enumerator to the next element of the collection. + + + true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection. + + The collection was modified after the enumerator was created. + + + + Sets the enumerator to its initial position, which is before the first element in the collection. + + The collection was modified after the enumerator was created. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + Enumerates all nodes of the tree rooted by this node (including this node). + + + + + Find the slot that contains the given offset. + + The target offset. Must be between 0 and . + The slot index of the slot containing the given offset. + + The base implementation is a linear search. This should be overridden + if a derived class can implement it more efficiently. + + + + + Add an error to the given node, creating a new node that is the same except it has no parent, + and has the given error attached to it. The error span is the entire span of this node. + + The error to attach to this node + A new node, with no parent, that has this error added to it. + Since nodes are immutable, the only way to create nodes with errors attached is to create a node without an error, + then add an error with this method to create another node. + + + + Interface implemented by any node that is the root 'CompilationUnit' of a . i.e. + any node returned by where + is will implement this interface. + + This interface provides a common way to both easily find the root of a + given any , as well as a common way for handling the special + that is needed to store all final trivia in a + that is not owned by any other . + + + + + Represents the end of the source file. This may have + (whitespace, comments, directives) attached to it. + + + + + Represents structured trivia that contains skipped tokens. This is implemented by + and + . + + + + + Represents the root node of a structured trivia tree (for example, a preprocessor directive + or a documentation comment). From this root node you can traverse back up to the containing + trivia in the outer tree that contains it. + + + + + Returns the parent trivia syntax for this structured trivia syntax. + + The parent trivia syntax for this structured trivia syntax. + + + + The LineDirectiveMap is created to enable translating positions, using the #line directives + in a file. The basic implementation creates an ordered array of line mapping entries, one + for each #line directive in the file (plus one at the beginning). If the file has no + directives, then the array has just one element in it. To map line numbers, a binary search + of the mapping entries is done and nearest line mapping is applied. + + + + + Determines whether the position is considered to be hidden from the debugger or not. + + + + + Combines TranslateSpan and IsHiddenPosition to not search the entries twice when emitting sequence points + + + + + Are there any hidden regions in the map? + + True if there's at least one hidden region in the map. + + + + The caller is expected to not call this if is empty. + + + + + Enum that describes the state related to the #line or #externalsource directives at a position in source. + + + + + Used in VB when the position is not hidden, but it's not known yet that there is a (nonempty) #ExternalSource + following. + + + + + Used in C# for spans preceding the first #line directive (if any) and for #line default spans + + + + + Used in C# for spans inside of #line linenumber directive + + + + + Used in C# for spans inside of #line (startLine, startChar) - (endLine, endChar) charOffset directive + + + + + Used in VB for spans inside of a #ExternalSource directive that followed an unknown span + + + + + Used in VB for spans inside of a #ExternalSource directive that followed a hidden span + + + + + Used in C# and VB for spans that are inside of #line hidden (C#) or outside of #ExternalSource (VB) + directives + + + + + Represents a line mapping defined by a single line mapping directive (#line in C# or #ExternalSource in VB). + + + + + The span in the syntax tree containing the line mapping directive. + + + + + The optional offset in the syntax tree for the line immediately following an enhanced #line directive in C#. + + + + + If the line mapping directive maps the span into an explicitly specified file the is true. + If the path is not mapped is empty and is false. + If the line mapping directive marks hidden code is false. + + + + + True if the line mapping marks hidden code. + + + + + The state of the visibility of a line. + + + + + The line is located before any #line directive and there is at least one #line directive present in this syntax tree. + This enum value is used for C# only to enable the consumer to define how to interpret the lines before the first + line directive. + + + + + The line is following a #line hidden directive. + + + + + The line is following a #line default directive or a #line directive with at least a line number. + If there is no line directive at all, Visible is returned for all lines. + + + + + Gets the separator at the given index in this list. + + The index. + + + + + Returns the sequence of just the separator tokens. + + + + + The absolute span of the list elements in characters, including the leading and trailing trivia of the first and last elements. + + + + + The absolute span of the list elements in characters, not including the leading and trailing trivia of the first and last elements. + + + + + Returns the string representation of the nodes in this list including separators but not including + the first node's leading trivia and the last node or token's trailing trivia. + + + The string representation of the nodes in this list including separators but not including + the first node's leading trivia and the last node or token's trailing trivia. + + + + + Returns the full string representation of the nodes in this list including separators, + the first node's leading trivia, and the last node or token's trailing trivia. + + + The full string representation of the nodes in this list including separators including separators, + the first node's leading trivia, and the last node or token's trailing trivia. + + + + + Creates a new list with the specified node added to the end. + + The node to add. + + + + Creates a new list with the specified nodes added to the end. + + The nodes to add. + + + + Creates a new list with the specified node inserted at the index. + + The index to insert at. + The node to insert. + + + + Creates a new list with the specified nodes inserted at the index. + + The index to insert at. + The nodes to insert. + + + + Creates a new list with the element at the specified index removed. + + The index of the element to remove. + + + + Creates a new list with specified element removed. + + The element to remove. + + + + Creates a new list with the specified element replaced by the new node. + + The element to replace. + The new node. + + + + Creates a new list with the specified element replaced by the new nodes. + + The element to replace. + The new nodes. + + + + Creates a new list with the specified separator token replaced with the new separator. + + The separator token to be replaced. + The new separator token. + + + + A SyntaxAnnotation is used to annotate syntax elements with additional information. + + Since syntax elements are immutable, annotating them requires creating new instances of them + with the annotations attached. + + + + + A predefined syntax annotation that indicates whether the syntax element has elastic trivia. + + + + + A list of . + + + + + Creates a singleton list of syntax nodes. + + The single element node. + + + + Creates a list of syntax nodes. + + A sequence of element nodes. + + + + The number of nodes in the list. + + + + + Gets the node at the specified index. + + The zero-based index of the node to get or set. + The node at the specified index. + + + + The absolute span of the list elements in characters, including the leading and trailing trivia of the first and last elements. + + + + + The absolute span of the list elements in characters, not including the leading and trailing trivia of the first and last elements. + + + + + Returns the string representation of the nodes in this list, not including + the first node's leading trivia and the last node's trailing trivia. + + + The string representation of the nodes in this list, not including + the first node's leading trivia and the last node's trailing trivia. + + + + + Returns the full string representation of the nodes in this list including + the first node's leading trivia and the last node's trailing trivia. + + + The full string representation of the nodes in this list including + the first node's leading trivia and the last node's trailing trivia. + + + + + Creates a new list with the specified node added at the end. + + The node to add. + + + + Creates a new list with the specified nodes added at the end. + + The nodes to add. + + + + Creates a new list with the specified node inserted at the index. + + The index to insert at. + The node to insert. + + + + Creates a new list with the specified nodes inserted at the index. + + The index to insert at. + The nodes to insert. + + + + Creates a new list with the element at specified index removed. + + The index of the element to remove. + + + + Creates a new list with the element removed. + + The element to remove. + + + + Creates a new list with the specified element replaced with the new node. + + The element to replace. + The new node. + + + + Creates a new list with the specified element replaced with new nodes. + + The element to replace. + The new nodes. + + + + The first node in the list. + + + + + The first node in the list or default if the list is empty. + + + + + The last node in the list. + + + + + The last node in the list or default if the list is empty. + + + + + True if the list has at least one node. + + + + + Get's the enumerator for this list. + + + + + The index of the node in this list, or -1 if the node is not in the list. + + + + + Represents a non-terminal node in the syntax tree. This is the language agnostic equivalent of and . + + + + + Used by structured trivia which has "parent == null", and therefore must know its + SyntaxTree explicitly when created. + + + + + An integer representing the language specific kind of this node. + + + + + The language name that this node is syntax of. + + + + + Returns SyntaxTree that owns the node or null if node does not belong to a + SyntaxTree + + + + + The absolute span of this node in characters, including its leading and trailing trivia. + + + + + The absolute span of this node in characters, not including its leading and trailing trivia. + + + + + Same as accessing on . + + + Slight performance improvement. + + + + + The width of the node in characters, not including leading and trailing trivia. + + + The Width property returns the same value as Span.Length, but is somewhat more efficient. + + + + + The complete width of the node in characters, including leading and trailing trivia. + + The FullWidth property returns the same value as FullSpan.Length, but is + somewhat more efficient. + + + + This works the same as GetRed, but intended to be used in lists + The only difference is that the public parent of the node is not the list, + but the list's parent. (element's grand parent). + + + + + special cased helper for 2 and 3 children lists where child #1 may map to a token + + + + + Returns the string representation of this node, not including its leading and trailing trivia. + + The string representation of this node, not including its leading and trailing trivia. + The length of the returned string is always the same as Span.Length + + + + Returns full string representation of this node including its leading and trailing trivia. + + The full string representation of this node including its leading and trailing trivia. + The length of the returned string is always the same as FullSpan.Length + + + + Writes the full text of this node to the specified . + + + + + Gets the full text of this node as a new instance. + + + Encoding of the file that the text was read from or is going to be saved to. + null if the encoding is unspecified. + If the encoding is not specified the isn't debuggable. + If an encoding-less is written to a file a shall be used as a default. + + + Hash algorithm to use to calculate checksum of the text that's saved to PDB. + + is not supported. + + + + Determine whether this node is structurally equivalent to another. + + + + + Returns true if these two nodes are considered "incrementally identical". An incrementally identical node + occurs when a is incrementally parsed using + and the incremental parser is able to take the node from the original tree and use it in its entirety in the + new tree. In this case, the of each node will be the same, though + they could have different parents, and may occur at different positions in their respective trees. If two nodes are + incrementally identical, all children of each node will be incrementally identical as well. + + + Incrementally identical nodes can also appear within the same syntax tree, or syntax trees that did not arise + from . This can happen as the parser is allowed to construct parse + trees from shared nodes for efficiency. In all these cases though, it will still remain true that the incrementally + identical nodes could have different parents and may occur at different positions in their respective trees. + + + + + Determines whether the node represents a language construct that was actually parsed + from the source code. Missing nodes are generated by the parser in error scenarios to + represent constructs that should have been present in the source code in order to + compile successfully but were actually missing. + + + + + Determines whether this node is a descendant of a structured trivia. + + + + + Determines whether this node represents a structured trivia. + + + + + Determines whether a descendant trivia of this node is structured. + + + + + Determines whether this node has any descendant skipped text. + + + + + Determines whether this node has any descendant preprocessor directives. + + + + + Determines whether this node or any of its descendant nodes, tokens or trivia have any diagnostics on them. + + + + + Determines if the specified node is a descendant of this node. + Returns true for current node. + + + + + Determines whether this node has any leading trivia. + + + + + Determines whether this node has any trailing trivia. + + + + + Gets a node at given node index without forcing its creation. + If node was not created it would return null. + + + + + This function calculates the offset of a child at given position. It is very common that + some children to the left of the given index already know their positions so we first + check if that is the case. In a worst case the cost is O(n), but it is not generally an + issue because number of children in regular nodes is fixed and small. In a case where + the number of children could be large (lists) this function is overridden with more + efficient implementations. + + + + + Gets a list of all the diagnostics in the sub tree that has this node as its root. + This method does not filter diagnostics based on #pragmas and compiler options + like nowarn, warnaserror etc. + + + + + Gets a for this syntax node. CommonSyntaxReferences can be used to + regain access to a syntax node without keeping the entire tree and source text in + memory. + + + + + The node that contains this node in its collection. + + + + + The list of child nodes and tokens of this node, where each element is a SyntaxNodeOrToken instance. + + + + + Gets node at given node index. + This WILL force node creation if node has not yet been created. + Can still return null for invalid slot numbers + + + + + Gets a list of the child nodes in prefix document order. + + + + + Gets a list of ancestor nodes + + + + + Gets a list of ancestor nodes (including this node) + + + + + Gets the first node of type TNode that matches the predicate. + + + + + Gets the first node of type TNode that matches the predicate. + + + + + Gets a list of descendant nodes in prefix document order. + + An optional function that determines if the search descends into the argument node's children. + Determines if nodes that are part of structured trivia are included in the list. + + + + Gets a list of descendant nodes in prefix document order. + + The span the node's full span must intersect. + An optional function that determines if the search descends into the argument node's children. + Determines if nodes that are part of structured trivia are included in the list. + + + + Gets a list of descendant nodes (including this node) in prefix document order. + + An optional function that determines if the search descends into the argument node's children. + Determines if nodes that are part of structured trivia are included in the list. + + + + Gets a list of descendant nodes (including this node) in prefix document order. + + The span the node's full span must intersect. + An optional function that determines if the search descends into the argument node's children. + Determines if nodes that are part of structured trivia are included in the list. + + + + Gets a list of descendant nodes and tokens in prefix document order. + + An optional function that determines if the search descends into the argument node's children. + Determines if nodes that are part of structured trivia are included in the list. + + + + Gets a list of the descendant nodes and tokens in prefix document order. + + The span the node's full span must intersect. + An optional function that determines if the search descends into the argument node's children. + Determines if nodes that are part of structured trivia are included in the list. + + + + Gets a list of descendant nodes and tokens (including this node) in prefix document order. + + An optional function that determines if the search descends into the argument node's children. + Determines if nodes that are part of structured trivia are included in the list. + + + + Gets a list of the descendant nodes and tokens (including this node) in prefix document order. + + The span the node's full span must intersect. + An optional function that determines if the search descends into the argument node's children. + Determines if nodes that are part of structured trivia are included in the list. + + + + Finds the node with the smallest that contains . + is used to determine the behavior in case of a tie (i.e. a node having the same span as its parent). + If is true, then it returns lowest descending node encompassing the given . + Otherwise, it returns the outermost node encompassing the given . + + + TODO: This should probably be reimplemented with + + This exception is thrown if doesn't contain the given span. + + + + Finds a descendant token of this node whose span includes the supplied position. + + The character position of the token relative to the beginning of the file. + + True to return tokens that are part of trivia. If false finds the token whose full span (including trivia) + includes the position. + + + + + Gets the first token of the tree rooted by this node. Skips zero-width tokens. + + The first token or default(SyntaxToken) if it doesn't exist. + + + + Gets the last token of the tree rooted by this node. Skips zero-width tokens. + + The last token or default(SyntaxToken) if it doesn't exist. + + + + Gets a list of the direct child tokens of this node. + + + + + Gets a list of all the tokens in the span of this node. + + + + + Gets a list of all the tokens in the full span of this node. + + + + + The list of trivia that appears before this node in the source code and are attached to a token that is a + descendant of this node. + + + + + The list of trivia that appears after this node in the source code and are attached to a token that is a + descendant of this node. + + + + + Finds a descendant trivia of this node whose span includes the supplied position. + + The character position of the trivia relative to the beginning of the file. + + True to return tokens that are part of trivia. If false finds the token whose full span (including trivia) + includes the position. + + + + + Finds a descendant trivia of this node at the specified position, where the position is + within the span of the node. + + The character position of the trivia relative to the beginning of + the file. + Specifies a function that determines per trivia node, whether to + descend into structured trivia of that node. + + + + + Get a list of all the trivia associated with the descendant nodes and tokens. + + + + + Get a list of all the trivia associated with the descendant nodes and tokens. + + + + + Determines whether this node or any sub node, token or trivia has annotations. + + + + + Determines whether this node has any annotations with the specific annotation kind. + + + + + Determines whether this node has any annotations with any of the specific annotation kinds. + + + + + Determines whether this node has the specific annotation. + + + + + Gets all the annotations with the specified annotation kind. + + + + + Gets all the annotations with the specified annotation kinds. + + + + + Gets all nodes and tokens with an annotation of the specified annotation kind. + + + + + Gets all nodes and tokens with an annotation of the specified annotation kinds. + + + + + Gets all nodes and tokens with the specified annotation. + + + + + Gets all nodes with the specified annotation. + + + + + Gets all nodes with the specified annotation kind. + + + + + + + Gets all tokens with the specified annotation. + + + + + Gets all tokens with the specified annotation kind. + + + + + Gets all trivia with an annotation of the specified annotation kind. + + + + + Gets all trivia with an annotation of the specified annotation kinds. + + + + + Gets all trivia with the specified annotation. + + + + + Copies all SyntaxAnnotations, if any, from this SyntaxNode instance and attaches them to a new instance based on . + + + + If no annotations are copied, just returns . + + + It can also be used manually to preserve annotations in a more complex tree + modification, even if the type of a node changes. + + + + + + Determines if two nodes are the same, disregarding trivia differences. + + The node to compare against. + If true then the nodes are equivalent if the contained nodes and + tokens declaring metadata visible symbolic information are equivalent, ignoring any + differences of nodes inside method bodies or initializer expressions, otherwise all + nodes and tokens must be equivalent. + + + + + Serializes the node to the given . + Leaves the open for further writes. + + + + + Determine if this node is structurally equivalent to another. + + + + + Returns SyntaxTree that owns the node. If the node does not belong to a tree then + one will be generated. + + + + + Finds a descendant token of this node whose span includes the supplied position. + + The character position of the token relative to the beginning of the file. + + True to return tokens that are part of trivia. + If false finds the token whose full span (including trivia) includes the position. + + + + + Finds a descendant token of this node whose span includes the supplied position. + + The character position of the token relative to the beginning of the file. + + Applied on every structured trivia. Return false if the tokens included in the trivia should be skipped. + Pass null to skip all structured trivia. + + + + + Finds a descendant trivia of this node whose span includes the supplied position. + + The character position of the trivia relative to the beginning of the file. + Whether to search inside structured trivia. + + + + Creates a new tree of nodes with the specified nodes, tokens or trivia replaced. + + + + + Creates a new tree of nodes with the specified node removed. + + + + + Determines if two nodes are the same, disregarding trivia differences. + + The node to compare against. + If true then the nodes are equivalent if the contained nodes and + tokens declaring metadata visible symbolic information are equivalent, ignoring any + differences of nodes inside method bodies or initializer expressions, otherwise all + nodes and tokens must be equivalent. + + + + + Whether or not this parent node wants its child SyntaxList node to be + converted to a Weak-SyntaxList when creating the red-node equivalent. + For example, in C# the statements of a Block-Node that is parented by a + MethodDeclaration will be held weakly. + + + + + Creates a clone of a red node that can be used as a root of given syntaxTree. + New node has no parents, position == 0, and syntaxTree as specified. + + + + + Creates a new tree of nodes with the specified nodes, tokens and trivia replaced. + + The type of the root node. + The root node of the tree of nodes. + The nodes to be replaced. + A function that computes a replacement node for the + argument nodes. The first argument is the original node. The second argument is the same + node potentially rewritten with replaced descendants. + The tokens to be replaced. + A function that computes a replacement token for + the argument tokens. The first argument is the original token. The second argument is + the same token potentially rewritten with replaced trivia. + The trivia to be replaced. + A function that computes replacement trivia for + the specified arguments. The first argument is the original trivia. The second argument is + the same trivia with potentially rewritten sub structure. + + + + Creates a new tree of nodes with the specified old node replaced with a new node. + + The type of the root node. + The type of the nodes being replaced. + The root node of the tree of nodes. + The nodes to be replaced; descendants of the root node. + A function that computes a replacement node for the + argument nodes. The first argument is the original node. The second argument is the same + node potentially rewritten with replaced descendants. + + + + Creates a new tree of nodes with the specified old node replaced with a new node. + + The type of the root node. + The root node of the tree of nodes. + The node to be replaced; a descendant of the root node. + The new node to use in the new tree in place of the old node. + + + + Creates a new tree of nodes with specified old node replaced with a new nodes. + + The type of the root node. + The root of the tree of nodes. + The node to be replaced; a descendant of the root node and an element of a list member. + A sequence of nodes to use in the tree in place of the old node. + + + + Creates a new tree of nodes with new nodes inserted before the specified node. + + The type of the root node. + The root of the tree of nodes. + The node to insert before; a descendant of the root node an element of a list member. + A sequence of nodes to insert into the tree immediately before the specified node. + + + + Creates a new tree of nodes with new nodes inserted after the specified node. + + The type of the root node. + The root of the tree of nodes. + The node to insert after; a descendant of the root node an element of a list member. + A sequence of nodes to insert into the tree immediately after the specified node. + + + + Creates a new tree of nodes with the specified old token replaced with new tokens. + + The type of the root node. + The root of the tree of nodes. + The token to be replaced; a descendant of the root node and an element of a list member. + A sequence of tokens to use in the tree in place of the specified token. + + + + Creates a new tree of nodes with new tokens inserted before the specified token. + + The type of the root node. + The root of the tree of nodes. + The token to insert before; a descendant of the root node and an element of a list member. + A sequence of tokens to insert into the tree immediately before the specified token. + + + + Creates a new tree of nodes with new tokens inserted after the specified token. + + The type of the root node. + The root of the tree of nodes. + The token to insert after; a descendant of the root node and an element of a list member. + A sequence of tokens to insert into the tree immediately after the specified token. + + + + Creates a new tree of nodes with the specified old trivia replaced with new trivia. + + The type of the root node. + The root of the tree of nodes. + The trivia to be replaced; a descendant of the root node. + A sequence of trivia to use in the tree in place of the specified trivia. + + + + Creates a new tree of nodes with new trivia inserted before the specified trivia. + + The type of the root node. + The root of the tree of nodes. + The trivia to insert before; a descendant of the root node. + A sequence of trivia to insert into the tree immediately before the specified trivia. + + + + Creates a new tree of nodes with new trivia inserted after the specified trivia. + + The type of the root node. + The root of the tree of nodes. + The trivia to insert after; a descendant of the root node. + A sequence of trivia to insert into the tree immediately after the specified trivia. + + + + Creates a new tree of nodes with the specified old node replaced with a new node. + + The type of the root node. + The root node of the tree of nodes. + The token to be replaced; descendants of the root node. + A function that computes a replacement token for + the argument tokens. The first argument is the original token. The second argument is + the same token potentially rewritten with replaced trivia. + + + + Creates a new tree of nodes with the specified old token replaced with a new token. + + The type of the root node. + The root node of the tree of nodes. + The token to be replaced. + The new token to use in the new tree in place of the old + token. + + + + Creates a new tree of nodes with the specified trivia replaced with new trivia. + + The type of the root node. + The root node of the tree of nodes. + The trivia to be replaced; descendants of the root node. + A function that computes replacement trivia for + the specified arguments. The first argument is the original trivia. The second argument is + the same trivia with potentially rewritten sub structure. + + + + Creates a new tree of nodes with the specified trivia replaced with new trivia. + + The type of the root node. + The root node of the tree of nodes. + The trivia to be replaced. + The new trivia to use in the new tree in place of the old trivia. + + + + Creates a new tree of nodes with the specified node removed. + + The type of the root node. + The root node from which to remove a descendant node from. + The node to remove. + Options that determine how the node's trivia is treated. + New root or null if the root node itself is removed. + + + + Creates a new tree of nodes with the specified nodes removed. + + The type of the root node. + The root node from which to remove a descendant node from. + The nodes to remove. + Options that determine how the nodes' trivia is treated. + + + + Creates a new syntax node with all whitespace and end of line trivia replaced with + regularly formatted trivia. + + The type of the node. + The node to format. + A sequence of whitespace characters that defines a single level of indentation. + If true the replaced trivia is elastic trivia. + + + + Creates a new syntax node with all whitespace and end of line trivia replaced with + regularly formatted trivia. + + The type of the node. + The node to format. + An optional sequence of whitespace characters that defines a single level of indentation. + An optional sequence of whitespace characters used for end of line. + If true the replaced trivia is elastic trivia. + + + + Creates a new node from this node with both the leading and trailing trivia of the specified node. + + + + + Creates a new node from this node without leading or trailing trivia. + + + + + Creates a new token from this token without leading or trailing trivia. + + + + + Creates a new node from this node with the leading trivia replaced. + + + + + Creates a new node from this node with the leading trivia replaced. + + + + + Creates a new node from this node with the leading trivia removed. + + + + + Creates a new node from this node with the leading trivia replaced. + + + + + Creates a new node from this node with the trailing trivia replaced. + + + + + Creates a new node from this node with the trailing trivia replaced. + + + + + Creates a new node from this node with the trailing trivia removed. + + + + + Creates a new node from this node with the trailing trivia replaced. + + + + + Attaches the node to a SyntaxTree that the same options as + + + + + Creates a new tree of nodes with the specified nodes being tracked. + + Use GetCurrentNode on the subtree resulting from this operation, or any transformation of it, + to get the current node corresponding to the original tracked node. + + The root of the subtree containing the nodes to be tracked. + One or more nodes that are descendants of the root node. + + + + Creates a new tree of nodes with the specified nodes being tracked. + + Use GetCurrentNode on the subtree resulting from this operation, or any transformation of it, + to get the current node corresponding to the original tracked node. + + The root of the subtree containing the nodes to be tracked. + One or more nodes that are descendants of the root node. + + + + Gets the nodes within the subtree corresponding to the original tracked node. + Use TrackNodes to start tracking nodes. + + The root of the subtree containing the current node corresponding to the original tracked node. + The node instance originally tracked. + + + + Gets the node within the subtree corresponding to the original tracked node. + Use TrackNodes to start tracking nodes. + + The root of the subtree containing the current node corresponding to the original tracked node. + The node instance originally tracked. + + + + Gets the nodes within the subtree corresponding to the original tracked nodes. + Use TrackNodes to start tracking nodes. + + The root of the subtree containing the current nodes corresponding to the original tracked nodes. + One or more node instances originally tracked. + + + + A wrapper for either a syntax node () or a syntax token (). + + + Note that we do not store the token directly, we just store enough information to reconstruct it. + This allows us to reuse nodeOrToken as a token's parent. + + + + + An integer representing the language specific kind of the underlying node or token. + + + + + The language name that this node or token is syntax of. + + + + + Determines whether the underlying node or token represents a language construct that was actually parsed + from source code. Missing nodes and tokens are typically generated by the parser in error scenarios to + represent constructs that should have been present in the source code for the source code to compile + successfully but were actually missing. + + + + + The node that contains the underlying node or token in its Children collection. + + + + + Determines whether this is wrapping a token. + + + + + Determines whether this is wrapping a node. + + + + + Returns the underlying token if this is wrapping a + token. + + + The underlying token if this is wrapping a token. + + + + + Returns the underlying node if this is wrapping a + node. + + + The underlying node if this is wrapping a node. + + + + + The list of child nodes and tokens of the underlying node or token. + + + + + The absolute span of the underlying node or token in characters, not including its leading and trailing + trivia. + + + + + Same as accessing on . + + + Slight performance improvement. + + + + + The absolute span of the underlying node or token in characters, including its leading and trailing trivia. + + + + + Returns the string representation of this node or token, not including its leading and trailing + trivia. + + + The string representation of this node or token, not including its leading and trailing trivia. + + The length of the returned string is always the same as Span.Length + + + + Returns the full string representation of this node or token including its leading and trailing trivia. + + The full string representation of this node or token including its leading and trailing + trivia. + The length of the returned string is always the same as FullSpan.Length + + + + Writes the full text of this node or token to the specified TextWriter. + + + + + Determines whether the underlying node or token has any leading trivia. + + + + + The list of trivia that appear before the underlying node or token in the source code and are attached to a + token that is a descendant of the underlying node or token. + + + + + Determines whether the underlying node or token has any trailing trivia. + + + + + The list of trivia that appear after the underlying node or token in the source code and are attached to a + token that is a descendant of the underlying node or token. + + + + + Determines whether the underlying node or token or any of its descendant nodes, tokens or trivia have any + diagnostics on them. + + + + + Gets a list of all the diagnostics in either the sub tree that has this node as its root or + associated with this token and its related trivia. + This method does not filter diagnostics based on #pragmas and compiler options + like nowarn, warnaserror etc. + + + + + Determines whether the underlying node or token has any descendant preprocessor directives. + + + + + Determines whether this node or token (or any sub node, token or trivia) as annotations. + + + + + Determines whether this node or token has annotations of the specified kind. + + + + + Determines whether this node or token has annotations of the specified kind. + + + + + Determines if this node or token has the specific annotation. + + + + + Gets all annotations of the specified annotation kind. + + + + + Gets all annotations of the specified annotation kind. + + + + + Creates a new node or token identical to this one with the specified annotations. + + + + + Creates a new node or token identical to this one with the specified annotations. + + + + + Creates a new node or token identical to this one without the specified annotations. + + + + + Creates a new node or token identical to this one without the specified annotations. + + + + + Creates a new node or token identical to this one without annotations of the specified kind. + + + + + Determines whether the supplied is equal to this + . + + + + + Determines whether two s are equal. + + + + + Determines whether two s are unequal. + + + + + Determines whether the supplied is equal to this + . + + + + + Serves as hash function for . + + + + + Determines if the two nodes or tokens are equivalent. + + + + + See and . + + + + + Returns a new that wraps the supplied token. + + The input token. + + A that wraps the supplied token. + + + + + Returns the underlying token wrapped by the supplied . + + + The input . + + + The underlying token wrapped by the supplied . + + + + + Returns a new that wraps the supplied node. + + The input node. + + A that wraps the supplied node. + + + + + Returns the underlying node wrapped by the supplied . + + + The input . + + + The underlying node wrapped by the supplied . + + + + + SyntaxTree which contains current SyntaxNodeOrToken. + + + + + Get the location of this node or token. + + + + + A list of structures. + + + + + The underlying field + + + + + The index from the parent's children list of this node. + + + + + Initializes a new instance of the structure. + + The underlying syntax node. + The index. + + + + Create a from a sequence of . + + The sequence of nodes and tokens + + + + Create a from one or more . + + The nodes and tokens + + + + Gets the underlying syntax node. + + + + + Gets the count of nodes in this list + + + + + Gets the at the specified index. + + is out of range. + + + + The absolute span of the list elements in characters, including the leading and trailing trivia of the first and last elements. + + + + + The absolute span of the list elements in characters, not including the leading and trailing trivia of the first and last elements. + + + + + Returns the string representation of the nodes and tokens in this list, not including the first node or token's leading trivia + and the last node or token's trailing trivia. + + + The string representation of the nodes and tokens in this list, not including the first node or token's leading trivia + and the last node or token's trailing trivia. + + + + + Returns the full string representation of the nodes and tokens in this list including the first node or token's leading trivia + and the last node or token's trailing trivia. + + + The full string representation of the nodes and tokens in this list including the first node or token's leading trivia + and the last node or token's trailing trivia. + + + + + Gets the first SyntaxNodeOrToken structure from this list. + + + + + Gets the first SyntaxNodeOrToken structure from this list if present, else default(SyntaxNodeOrToken). + + + + + Gets the last SyntaxNodeOrToken structure from this list. + + + + + Gets the last SyntaxNodeOrToken structure from this list if present, else default(SyntaxNodeOrToken). + + + + + Returns the index from the list for the given . + + The node or token to search for in the list. + The index of the found nodeOrToken, or -1 if it wasn't found + + + + Indicates whether there is any element in the list. + + true if there are any elements in the list, else false. + + + + Copies a given count of elements into the given array at specified offsets. + + The offset to start copying from. + The array to copy the elements into. + The array offset to start writing to. + The count of elements to copy. + + + + Creates a new with the specified node or token added to the end. + + The node or token to add. + + + + Creates a new with the specified nodes or tokens added to the end. + + The nodes or tokens to add. + + + + Creates a new with the specified node or token inserted at the index. + + The index to insert at. + The node or token to insert. + + + + Creates a new with the specified nodes or tokens inserted at the index. + + The index to insert at. + The nodes or tokens to insert. + + + + Creates a new with the element at the specified index removed. + + The index of the element to remove. + + + + Creates a new with the specified element removed. + + The element to remove. + + + + Creates a new with the specified element replaced with a new node or token. + + The element to replace. + The new node or token. + + + + Creates a new with the specified element replaced with a new nodes and tokens. + + The element to replace. + The new nodes and tokens. + + + + Gets the enumerator. + + + + + Returns an enumerator that iterates through the collection. + + + A that can be used to iterate through the collection. + + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Implements the operator ==. + + The left SyntaxNodeOrTokenList + The right SyntaxNodeOrTokenList + + true if both lists equal, else false. + + + + + Implements the operator !=. + + The left SyntaxNodeOrTokenList + The right SyntaxNodeOrTokenList + + true if both lists not equal, else false. + + + + + Indicates whether the current object is equal to another object of the same type. + + An object to compare with this object. + + true if the current object is equal to the parameter; otherwise, + false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Enumerator for lists of SyntaxNodeOrToken structs. + + + + + Advances the enumerator to the next element of the collection. + + + true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection. + + The collection was modified after the enumerator was created. + + + + Gets the struct that this enumerator instance is currently pointing to. + + + + + Gets the struct that this enumerator instance is currently pointing to. + + + + + Sets the enumerator to its initial position, which is before the first element in the collection. + + The collection was modified after the enumerator was created. + + + + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + + + + + A reference to a syntax node. + + + + + The syntax tree that this references a node within. + + + + + The span of the node referenced. + + + + + Retrieves the original referenced syntax node. + This action may cause a parse to happen to recover the syntax node. + + The original referenced syntax node. + + + + Retrieves the original referenced syntax node. + This action may cause a parse to happen to recover the syntax node. + + The original referenced syntax node. + + + + The location of this syntax reference. + + The location of this syntax reference. + + More performant than GetSyntax().GetLocation(). + + + + + None of the trivia associated with the node or token is kept. + + + + + The leading trivia associated with the node or token is kept. + + + + + The trailing trivia associated with the node or token is kept. + + + + + The leading and trailing trivia associated with the node or token is kept. + + + + + Any directives that would become unbalanced are kept. + + + + + All directives are kept + + + + + Ensure that at least one EndOfLine trivia is kept if one was present + + + + + Adds elastic marker trivia + + + + + Represents a token in the syntax tree. This is the language agnostic equivalent of and . + + + + + An integer representing the language specific kind of this token. + + + + + The language name that this token is syntax of. + + + + + The kind of token, given its position in the syntax. This differs from when a contextual keyword is used in a place in the syntax that gives it + its keyword meaning. + + + The ContextualKind is relevant only on contextual keyword tokens. ContextualKind differs + from Kind when a token is used in context where the token should be interpreted as a + keyword. + + + + + The node that contains this token in its Children collection. + + + + + The width of the token in characters, not including its leading and trailing trivia. + + + + + The complete width of the token in characters including its leading and trailing trivia. + + + + + The absolute span of this token in characters, not including its leading and trailing trivia. + + + + + Same as accessing on . + + + Slight performance improvement. + + + + + The absolute span of this token in characters, including its leading and trailing trivia. + + + + + Determines whether this token represents a language construct that was actually parsed from source code. + Missing tokens are typically generated by the parser in error scenarios to represent constructs that should + have been present in the source code for the source code to compile successfully but were actually missing. + + + + + Returns the value of the token. For example, if the token represents an integer literal, then this property + would return the actual integer. + + + + + Returns the text representation of the value of the token. For example, if the token represents an integer + literal, then this property would return a string representing the integer. + + + + + Returns the string representation of this token, not including its leading and trailing trivia. + + The string representation of this token, not including its leading and trailing trivia. + The length of the returned string is always the same as Span.Length + + + + Returns the full string representation of this token including its leading and trailing trivia. + + The full string representation of this token including its leading and trailing trivia. + The length of the returned string is always the same as FullSpan.Length + + + + Writes the full text of this token to the specified . + + + + + Writes the text of this token to the specified TextWriter, optionally including trivia. + + + + + Determines whether this token has any leading trivia. + + + + + Determines whether this token has any trailing trivia. + + + + + Full width of the leading trivia of this token. + + + + + Full width of the trailing trivia of this token. + + + + + Determines whether this token or any of its descendant trivia have any diagnostics on them. + + + + + Determines whether this token has any descendant preprocessor directives. + + + + + Determines whether this token is a descendant of a structured trivia. + + + + + Determines whether any of this token's trivia is structured. + + + + + True if this token or its trivia has any annotations. + + + + + True if this token has annotations of the specified annotation kind. + + + + + True if this token has annotations of the specified annotation kinds. + + + + + True if this token has the specified annotation. + + + + + Gets all the annotations of the specified annotation kind. + + + + + Gets all the annotations of the specified annotation kind. + + + + + Gets all the annotations of the specified annotation kind. + + + + + Adds this annotation to a given syntax token, creating a new syntax token of the same type with the + annotation on it. + + + + + Adds this annotation to a given syntax token, creating a new syntax token of the same type with the + annotation on it. + + + + + Creates a new syntax token identical to this one without the specified annotations. + + + + + Creates a new syntax token identical to this one without the specified annotations. + + + + + Creates a new syntax token identical to this one without annotations of the specified kind. + + + + + Copies all SyntaxAnnotations, if any, from this SyntaxToken instance and attaches them to a new instance based on . + + + If no annotations are copied, just returns . + + + + + The list of trivia that appear before this token in the source code. + + + + + The list of trivia that appear after this token in the source code and are attached to this token or any of + its descendants. + + + + + Creates a new token from this token with the leading and trailing trivia from the specified token. + + + + + Creates a new token from this token with the leading trivia specified. + + + + + Creates a new token from this token with the leading trivia specified.. + + + + + Creates a new token from this token with the leading trivia specified. + + + + + Creates a new token from this token with the trailing trivia specified. + + + + + Creates a new token from this token with the trailing trivia specified. + + + + + Creates a new token from this token with the trailing trivia specified. + + + + + Gets a list of all the trivia (both leading and trailing) for this token. + + + + + Determines whether two s are equal. + + + + + Determines whether two s are unequal. + + + + + Determines whether the supplied is equal to this + . + + + + + Determines whether the supplied is equal to this + . + + + + + Serves as hash function for . + + + + + Gets the token that follows this token in the syntax tree. + + The token that follows this token in the syntax tree. + + + + Returns the token after this token in the syntax tree. + + Delegate applied to each token. The token is returned if the predicate returns + true. + Delegate applied to trivia. If this delegate is present then trailing trivia is + included in the search. + + + + Gets the token that precedes this token in the syntax tree. + + The previous token that precedes this token in the syntax tree. + + + + Returns the token before this token in the syntax tree. + + Delegate applied to each token. The token is returned if the predicate returns + true. + Delegate applied to trivia. If this delegate is present then trailing trivia is + included in the search. + + + + The SyntaxTree that contains this token. + + + + + Gets the location for this token. + + + + + Gets a list of all the diagnostics associated with this token and any related trivia. + This method does not filter diagnostics based on #pragmas and compiler options + like nowarn, warnaserror etc. + + + + + Determines if this token is equivalent to the specified token. + + + + + Returns true if these two tokens are considered "incrementally identical". An incrementally identical token + occurs when a is incrementally parsed using + and the incremental parser is able to take the token from the original tree and use it in its entirety in the + new tree. In this case, the of each token will be the same, though + they could have different parents, and may occur at different positions in the respective trees. If two tokens are + incrementally identical, all trivial of each node will be incrementally identical as well. + + + Incrementally identical tokens can also appear within the same syntax tree, or syntax trees that did not arise + from . This can happen as the parser is allowed to construct parse + trees using shared tokens for efficiency. In all these cases though, it will still remain true that the incrementally + identical tokens could have different parents and may occur at different positions in their respective trees. + + + + + Represents a read-only list of . + + + Represents a read-only list of s. + + + + + Creates a list of tokens. + + An array of tokens. + + + + Creates a list of tokens. + + + + + Returns the number of tokens in the list. + + + + + Gets the token at the specified index. + + The zero-based index of the token to get. + The token at the specified index. + + is less than 0.-or- is equal to or greater than . + + + + The absolute span of the list elements in characters, including the leading and trailing trivia of the first and last elements. + + + + + The absolute span of the list elements in characters, not including the leading and trailing trivia of the first and last elements. + + + + + Returns the string representation of the tokens in this list, not including + the first token's leading trivia and the last token's trailing trivia. + + + The string representation of the tokens in this list, not including + the first token's leading trivia and the last token's trailing trivia. + + + + + Returns the full string representation of the tokens in this list including + the first token's leading trivia and the last token's trailing trivia. + + + The full string representation of the tokens in this list including + the first token's leading trivia and the last token's trailing trivia. + + + + + Returns the first token in the list. + + The first token in the list. + The list is empty. + + + + Returns the last token in the list. + + The last token in the list. + The list is empty. + + + + Tests whether the list is non-empty. + + True if the list contains any tokens. + + + + Returns a list which contains all elements of in reversed order. + + which contains all elements of in reversed order + + + + get the green node at the given slot + + + + + get the green node at the given slot + + + + + Creates a new with the specified token added to the end. + + The token to add. + + + + Creates a new with the specified tokens added to the end. + + The tokens to add. + + + + Creates a new with the specified token insert at the index. + + The index to insert the new token. + The token to insert. + + + + Creates a new with the specified tokens insert at the index. + + The index to insert the new tokens. + The tokens to insert. + + + + Creates a new with the token at the specified index removed. + + The index of the token to remove. + + + + Creates a new with the specified token removed. + + The token to remove. + + + + Creates a new with the specified token replaced with a new token. + + The token to replace. + The new token. + + + + Creates a new with the specified token replaced with new tokens. + + The token to replace. + The new tokens. + + + + Returns an enumerator for the tokens in the + + + + + Compares and for equality. + + + + True if the two s are equal. + + + + Compares and for inequality. + + + + True if the two s are not equal. + + + + Compares this with the for equality. + + True if the two objects are equal. + + + + Serves as a hash function for the + + + + + Create a new Token List + + Element of the return Token List + + + + A structure for enumerating a + + + + + Advances the enumerator to the next token in the collection. + + true if the enumerator was successfully advanced to the next element; false if the enumerator + has passed the end of the collection. + + + + Gets the current element in the collection. + + + + + Reversed enumerable. + + + + + The parsed representation of a source document. + + + + + Cached value for empty . + + + + + The path of the source document file. + + + If this syntax tree is not associated with a file, this value can be empty. + The path shall not be null. + + The file doesn't need to exist on disk. The path is opaque to the compiler. + The only requirement on the path format is that the implementations of + , and + passed to the compilation that contains the tree understand it. + + Clients must also not assume that the values of this property are unique + within a Compilation. + + The path is used as follows: + - When debug information is emitted, this path is embedded in the debug information. + - When resolving and normalizing relative paths in #r, #load, #line/#ExternalSource, + #pragma checksum, #ExternalChecksum directives, XML doc comment include elements, etc. + + + + + Returns true if this syntax tree has a root with SyntaxKind "CompilationUnit". + + + + + The options used by the parser to produce the syntax tree. + + + + + The options used by the parser to produce the syntax tree. + + + + + Option to specify custom behavior for each warning in this tree. + + + A map from diagnostic ID to diagnostic reporting level. The diagnostic + ID string may be case insensitive depending on the language. + + + + + The length of the text of the syntax tree. + + + + + Gets the syntax tree's text if it is available. + + + + + Gets the text of the source document. + + + + + The text encoding of the source document. + + + + + Useful information about this tree that is stored for source-generator scenarios. Allows the incremental + generation framework to compute and cache data once against a tree so it does not have to go back to source + for untouched trees when other trees in the compilation are modified. + + + + + Gets the text of the source document asynchronously. + + + By default, the work associated with this method will be executed immediately on the current thread. + Implementations that wish to schedule this work differently should override . + + + + + Gets the root of the syntax tree if it is available. + + + + + Gets the root of the syntax tree if it is available. + + + + + Gets the root node of the syntax tree, causing computation if necessary. + + + + + Gets the root node of the syntax tree, causing computation if necessary. + + + + + Gets the root node of the syntax tree asynchronously. + + + + + Gets the root node of the syntax tree asynchronously. + + + + + Create a new syntax tree based off this tree using a new source text. + + If the new source text is a minor change from the current source text an incremental + parse will occur reusing most of the current syntax tree internal data. Otherwise, a + full parse will occur using the new source text. + + + + + Gets a list of all the diagnostics in the syntax tree. + This method does not filter diagnostics based on #pragmas and compiler options + like nowarn, warnaserror etc. + + + + + Gets a list of all the diagnostics in the sub tree that has the specified node as its root. + This method does not filter diagnostics based on #pragmas and compiler options + like nowarn, warnaserror etc. + + + + + Gets a list of all the diagnostics associated with the token and any related trivia. + This method does not filter diagnostics based on #pragmas and compiler options + like nowarn, warnaserror etc. + + + + + Gets a list of all the diagnostics associated with the trivia. + This method does not filter diagnostics based on #pragmas and compiler options + like nowarn, warnaserror etc. + + + + + Gets a list of all the diagnostics in either the sub tree that has the specified node as its root or + associated with the token and its related trivia. + This method does not filter diagnostics based on #pragmas and compiler options + like nowarn, warnaserror etc. + + + + + Gets the location in terms of path, line and column for a given span. + + Span within the tree. + Cancellation token. + + A valid that contains path, line and column information. + The values are not affected by line mapping directives (#line). + + + + + Gets the location in terms of path, line and column after applying source line mapping directives + (#line in C# or #ExternalSource in VB). + + Span within the tree. + Cancellation token. + + A valid that contains path, line and column information. + + If the location path is mapped the resulting path is the path specified in the corresponding #line, + otherwise it's . + + A location path is considered mapped if it is preceded by a line mapping directive that + either specifies an explicit file path or is #line default. + + + + + Returns empty sequence if there are no line mapping directives in the tree. + Otherwise, returns a sequence of pairs of spans: each describing a mapping of a span of the tree between two consecutive #line directives. + If the first directive is not on the first line the first pair describes mapping of the span preceding the first directive. + The last pair of the sequence describes mapping of the span following the last #line directive. + + + Empty sequence if the tree does not contain a line mapping directive. + Otherwise a non-empty sequence of . + + + + + Returns the visibility for the line at the given position. + + The position to check. + The cancellation token. + + + + Gets a FileLinePositionSpan for a TextSpan and the information whether this span is considered to be hidden or not. + FileLinePositionSpans are used primarily for diagnostics and source locations. + This method combines a call to GetLineSpan and IsHiddenPosition. + + + Returns a boolean indicating whether this span is considered hidden or not. + This function is being called only in the context of sequence point creation and therefore interprets the + LineVisibility accordingly (BeforeFirstRemappingDirective -> Visible). + + + + Returns a path for particular location in source that is presented to the user. + + + Used for implementation of + or for embedding source paths in error messages. + + Unlike Dev12 we do account for #line and #ExternalSource directives when determining value for + . + + + + + Returns a line number for particular location in source that is presented to the user. + + + Used for implementation of + or for embedding source line numbers in error messages. + + Unlike Dev12 we do account for #line and #ExternalSource directives when determining value for + . + + + + + Are there any hidden regions in the tree? + + True if there is at least one hidden region. + + + + Returns a list of the changed regions between this tree and the specified tree. The list is conservative for + performance reasons. It may return larger regions than what has actually changed. + + + + + Gets a location for the specified text span. + + + + + Determines if two trees are the same, disregarding trivia differences. + + The tree to compare against. + If true then the trees are equivalent if the contained nodes and tokens declaring + metadata visible symbolic information are equivalent, ignoring any differences of nodes inside method bodies + or initializer expressions, otherwise all nodes and tokens must be equivalent. + + + + + Gets a SyntaxReference for a specified syntax node. SyntaxReferences can be used to + regain access to a syntax node without keeping the entire tree and source text in + memory. + + + + + Gets a list of text changes that when applied to the old tree produce this tree. + + The old tree. + The list of changes may be different than the original changes that produced + this tree. + + + + Gets the checksum + algorithm id to use in the PDB. + + + + + Returns a new tree whose root and options are as specified and other properties are copied from the current tree. + + + + + Returns a new tree whose is the specified node and other properties are copied from the current tree. + + + + + Returns a new tree whose are the specified value and other properties are copied + from the current tree. + + + A mapping from diagnostic id to diagnostic reporting level. The diagnostic ID may be case-sensitive depending + on the language. + + + + + Returns a that represents the entire source text of this . + + + + + Verify nodes match source. + + + + + Return the index of the first difference between + the two strings, or -1 if the strings are the same. + + + + + Returns true if the provided position is in a hidden region inaccessible to the user. + + + + + Represents a trivia in the syntax tree. + + + + + An integer representing the language specific kind of this trivia. + + + + + The language name that this trivia is syntax of. + + + + + The parent token that contains this token in its LeadingTrivia or TrailingTrivia collection. + + + + + The width of this trivia in characters. If this trivia is a structured trivia then the returned width will + not include the widths of any leading or trailing trivia present on the child non-terminal node of this + trivia. + + + + + The width of this trivia in characters. If this trivia is a structured trivia then the returned width will + include the widths of any leading or trailing trivia present on the child non-terminal node of this trivia. + + + + + The absolute span of this trivia in characters. If this trivia is a structured trivia then the returned span + will not include spans of any leading or trailing trivia present on the child non-terminal node of this + trivia. + + + + + Same as accessing on . + + + Slight performance improvement. + + + + + The absolute span of this trivia in characters. If this trivia is a structured trivia then the returned span + will include spans of any leading or trailing trivia present on the child non-terminal node of this trivia. + + + + + Determines whether this trivia has any diagnostics on it. If this trivia is a structured trivia then the + returned value will indicate whether this trivia or any of its descendant nodes, tokens or trivia have any + diagnostics on them. + > + + + + Determines whether this trivia is a structured trivia. + + + + + Determines whether this trivia is a descendant of a structured trivia. + + + + + Determines whether this trivia or any of its structure has annotations. + + + + + Determines where this trivia has annotations of the specified annotation kind. + + + + + Determines where this trivia has any annotations of the specified annotation kinds. + + + + + Determines whether this trivia has the specific annotation. + + + + + Get all the annotations of the specified annotation kind. + + + + + Get all the annotations of the specified annotation kinds. + + + + + Determines whether this trivia represents a preprocessor directive. + + + + + Returns the child non-terminal node representing the syntax tree structure under this structured trivia. + + The child non-terminal node representing the syntax tree structure under this structured + trivia. + + + + Returns the string representation of this trivia. If this trivia is structured trivia then the returned string + will not include any leading or trailing trivia present on the StructuredTriviaSyntax node of this trivia. + + The string representation of this trivia. + The length of the returned string is always the same as Span.Length + + + + Returns the full string representation of this trivia. If this trivia is structured trivia then the returned string will + include any leading or trailing trivia present on the StructuredTriviaSyntax node of this trivia. + + The full string representation of this trivia. + The length of the returned string is always the same as FullSpan.Length + + + + Writes the full text of this trivia to the specified TextWriter. + + + + + Determines whether two s are equal. + + + + + Determines whether two s are unequal. + + + + + Determines whether the supplied is equal to this + . + + + + + Determines whether the supplied is equal to this + . + + + + + Serves as hash function for . + + + + + Creates a new SyntaxTrivia with the specified annotations. + + + + + Creates a new SyntaxTrivia with the specified annotations. + + + + + Creates a new SyntaxTrivia without the specified annotations. + + + + + Creates a new SyntaxTrivia without the specified annotations. + + + + + Creates a new SyntaxTrivia without annotations of the specified kind. + + + + + Copies all SyntaxAnnotations, if any, from this SyntaxTrivia instance and attaches them to a new instance based on . + + + + + SyntaxTree which contains current SyntaxTrivia. + + + + + Get the location of this trivia. + + + + + Gets a list of all the diagnostics associated with this trivia. + This method does not filter diagnostics based on #pragmas and compiler options + like nowarn, warnaserror etc. + + + + + Determines if this trivia is equivalent to the specified trivia. + + + + + Represents a read-only list of . + + + + + Creates a list of trivia. + + An array of trivia. + + + + Creates a list of trivia. + + A sequence of trivia. + + + + Gets the trivia at the specified index. + + The zero-based index of the trivia to get. + The token at the specified index. + + is less than 0.-or- is equal to or greater than . + + + + The absolute span of the list elements in characters, including the leading and trailing trivia of the first and last elements. + + + + + The absolute span of the list elements in characters, not including the leading and trailing trivia of the first and last elements. + + + + + Returns the first trivia in the list. + + The first trivia in the list. + The list is empty. + + + + Returns the last trivia in the list. + + The last trivia in the list. + The list is empty. + + + + Does this list have any items. + + + + + Returns a list which contains all elements of in reversed order. + + which contains all elements of in reversed order + + + + Creates a new with the specified trivia added to the end. + + The trivia to add. + + + + Creates a new with the specified trivia added to the end. + + The trivia to add. + + + + Creates a new with the specified trivia inserted at the index. + + The index in the list to insert the trivia at. + The trivia to insert. + + + + Creates a new with the specified trivia inserted at the index. + + The index in the list to insert the trivia at. + The trivia to insert. + + + + Creates a new with the element at the specified index removed. + + The index identifying the element to remove. + + + + Creates a new with the specified element removed. + + The trivia element to remove. + + + + Creates a new with the specified element replaced with new trivia. + + The trivia element to replace. + The trivia to replace the element with. + + + + Creates a new with the specified element replaced with new trivia. + + The trivia element to replace. + The trivia to replace the element with. + + + + get the green node at the specific slot + + + + + Copy number of items starting at from this list into starting at . + + + + + Reversed enumerable. + + + + + Walks the syntax tree, allowing subclasses to operate on all nodes, token and trivia. The + walker will perform a depth first walk of the tree. + + + + + Syntax the should descend into. + + + + + Creates a new walker instance. + + Syntax the should descend into. + + + + Called when the walker visits a node. This method may be overridden if subclasses want + to handle the node. Overrides should call back into this base method if they want the + children of this node to be visited. + + The current node that the walker is visiting. + + + + Called when the walker visits a token. This method may be overridden if subclasses want + to handle the token. Overrides should call back into this base method if they want the + trivia of this token to be visited. + + The current token that the walker is visiting. + + + + Called when the walker visits a trivia syntax. This method may be overridden if + subclasses want to handle the token. Overrides should call back into this base method if + they want the children of this trivia syntax to be visited. + + The current trivia syntax that the walker is visiting. + + + + Syntax the should descend into. + + + + + descend into only nodes + + + + + descend into nodes and tokens + + + + + descend into nodes, tokens and trivia + + + + + descend into everything + + + + + Kind of a synthesized local variable. + + + Synthesized local variables are either + 1) Short-lived (temporary) + The lifespan of a temporary variable shall not cross a statement boundary (a PDB sequence point). + These variables are not tracked by EnC and don't have names. Only values less than 0 are considered + short-lived: new short-lived kinds should have a negative value. + + 2) Long-lived + All variables whose lifespan might cross a statement boundary (include a PDB sequence point) + must be named in a build configuration that supports EnC. Some of them might need to be named in release, to support EE. + The kind of such local must be encoded in the name, so that we can retrieve it from debug metadata during EnC. + + The integer value of the kind must match corresponding Dev11/12 TEMP_KIND enum values for + compatibility with assemblies generated by the native compiler. + + Long-lived local variables must be assigned slots in source order. + + + + + Temp created for caching "this". + Technically it is long-lived, but will happen only in optimized code. + + + + + Temp variable created by the optimizer. + + + + + Temp variable created during lowering. + + + + + Temp variable created by the emitter. + + + + + The variable is not synthesized (C#, VB). Note that SynthesizedLocalKind values + greater than or equal to this are considered long-lived; + see . + + + + + Local variable that stores value of an expression consumed by a subsequent conditional branch instruction that might jump across PDB sequence points. + The value needs to be preserved when remapping the IL offset from old method body to new method body during EnC. + A hidden sequence point also needs to be inserted at the offset where this variable is loaded to be consumed by the branch instruction. + (VB, C#). + + + + + Boolean passed to Monitor.Enter (C#, VB). + + + + + Variable holding on the object being locked while the execution is within the block of the lock statement (C#) or SyncLock statement (VB). + + + + + Local variable that stores the resources to be disposed at the end of using statement (C#, VB). + + + + + Local variable that stores the enumerator instance (C#, VB). + + + + + Local variable that stores the array instance (C#, VB?). + + + + + Local variables that store upper bound of multi-dimensional array, for each dimension (C#, VB?). + + + + + Local variables that store the current index, for each dimension (C#, VB?). + + + + + Local variable that holds a pinned handle of a managed reference passed to a fixed statement (C#). + + + + + Local variable that holds the object passed to With statement (VB). + + + + + Local variable used to store the value of Select Case during the execution of Case statements. + + + + + Local variable that stores the return value of an async method. + + + + + VB: Stores the return value of a function that is not accessible from user code (e.g. operator, lambda, async, iterator). + C#: Stores the return value of a method/lambda with a block body, so that we can put a sequence point on the closing brace of the body. + + + + + Very special corner case involving filters, await and lambdas. + + + + + Local variable that stores the current state of the state machine while MoveNext method is executing. + Used to avoid race conditions due to multiple reads from the lifted state. + + + + + Local that stores an expression value which needs to be spilled. + Such a local arises from the translation of an await or switch expression, + and might be hoisted to an async state machine if it remains alive + after an await expression. + + + + + Local variable that holds on the display class instance. + + + + + Local variable used to cache a delegate that is used in inner block (possibly a loop), + and can be reused for all iterations of the loop. + + + + + Local variable that stores the result of an await expression (the awaiter object). + The variable is assigned the result of a call to await-expression.GetAwaiter() and subsequently used + to check whether the task completed. Eventually the value is stored in an awaiter field. + + The value assigned to the variable needs to be preserved when remapping the IL offset from old method body + to new method body during EnC. If the awaiter expression is contained in an active statement and the + containing MoveNext method changes the debugger finds the next sequence point that follows the await expression + and transfers the execution to the new method version. This sequence point is placed by the compiler at + the immediately after the stloc instruction that stores the awaiter object to this variable. + The subsequent ldloc then restores it in the new method version. + + (VB, C#). + + + + + Stores a dynamic analysis instrumentation payload array. The value is initialized in + synthesized method prologue code and referred to throughout the method body. + + + + + Temp created for pattern matching by type. This holds the value of an input value provisionally + converted to the type against which it is being matched. + + + + + All values have to be less than or equal to + () + + + + + An awaiter in async method. + Never actually created as a local variable, immediately lifted to a state machine field. + Not serialized to . + + + + + The receiver of a delegate relaxation stub. + Created as a local variable but always lifted to a relaxation display class field. + We never emit debug info for hoisted relaxation variable. + TODO: Avoid using lambdas and display classes for implementation of relaxation stubs and remove this kind. + + + + + This is ONLY used id BoundNode.cs Debug method - Dump() + + + + + This is ONLY used for debugging purpose + + + + + Parses a version string of the form "major [ '.' minor [ '.' build [ '.' revision ] ] ]". + + The version string to parse. + If parsing succeeds, the parsed version. Otherwise a version that represents as much of the input as could be parsed successfully. + True when parsing succeeds completely (i.e. every character in the string was consumed), false otherwise. + + + + Parses a version string of the form "major [ '.' minor [ '.' ( '*' | ( build [ '.' ( '*' | revision ) ] ) ) ] ]" + as accepted by System.Reflection.AssemblyVersionAttribute. + + The version string to parse. + Indicates whether or not a wildcard is accepted as the terminal component. + + If parsing succeeded, the parsed version. Otherwise a version instance with all parts set to zero. + If contains * the version build and/or revision numbers are set to . + + True when parsing succeeds completely (i.e. every character in the string was consumed), false otherwise. + + + + Parses a version string of the form "major [ '.' minor [ '.' ( '*' | ( build [ '.' ( '*' | revision ) ] ) ) ] ]" + as accepted by System.Reflection.AssemblyVersionAttribute. + + The version string to parse. + Indicates whether or not we're parsing an assembly version string. If so, wildcards are accepted and each component must be less than 65535. + The maximum value that a version component may have. + Allow the parsing of version elements where invalid characters exist. e.g. 1.2.2a.1 + + If parsing succeeded, the parsed version. When is true a version with values up to the first invalid character set. Otherwise a version with all parts set to zero. + If contains * and wildcard is allowed the version build and/or revision numbers are set to . + + True when parsing succeeds completely (i.e. every character in the string was consumed), false otherwise. + + + + If build and/or revision numbers are 65535 they are replaced with time-based values. + + + + + This function defines whether an attribute is optional or not. + + The attribute member. + + + + Ids of well known runtime types. + Values should not intersect with SpecialType enum! + + + + + + Number of well known types in WellKnownType enum + + + + + Array of names for types. + The names should correspond to ids from WellKnownType enum so + that we could use ids to index into the array + + + + + + Resolves references to XML files specified in the source. + + + + + Resolves XML document file path. + + + Value of the "file" attribute of an <include> documentation comment element. + + + Path of the source file () or XML document that contains the . + If not null used as a base path of , if is relative. + If is relative is used as the base path of . + + Normalized XML document file path or null if not found. + + + + The XmlCharType class is used for quick character type recognition + which is optimized for the first 127 ascii characters. + + + + + start >= value <= end + + + + + Struct containing information about a source declaration. + + + + + Topmost syntax node for this declaration. + + + + + Syntax nodes for executable code blocks (method body, initializers, etc.) associated with this declaration. + + + + + Symbol declared by this declaration. + + + + + Realizes the array. + + + + + Realizes the array and clears the collection. + + + + + Write to slot . + Fills in unallocated slots preceding the , if any. + + + + + Realizes the array. + + + + + Realizes the array, downcasting each element to a derived type. + + + + + Realizes the array and disposes the builder in one operation. + + + + + struct enumerator used in foreach. + + + + + Generic implementation of object pooling pattern with predefined pool size limit. The main + purpose is that limited number of frequently used objects can be kept in the pool for + further recycling. + + Notes: + 1) it is not the goal to keep all returned objects. Pool is not meant for storage. If there + is no space in the pool, extra returned objects will be dropped. + + 2) it is implied that if object was obtained from a pool, the caller will return it back in + a relatively short time. Keeping checked out objects for long durations is ok, but + reduces usefulness of pooling. Just new up your own. + + Not returning objects to the pool in not detrimental to the pool's work, but is a bad practice. + Rationale: + If there is no intent for reusing the object, do not use pool - just use "new". + + + + + Not using System.Func{T} because this file is linked into the (debugger) Formatter, + which does not have that type (since it compiles against .NET 2.0). + + + + + Produces an instance. + + + Search strategy is a simple linear probing which is chosen for it cache-friendliness. + Note that Free will try to store recycled objects close to the start thus statistically + reducing how far we will typically search. + + + + + Returns objects to the pool. + + + Search strategy is a simple linear probing which is chosen for it cache-friendliness. + Note that Free will try to store recycled objects close to the start thus statistically + reducing how far we will typically search in Allocate. + + + + + Removes an object from leak tracking. + + This is called when an object is returned to the pool. It may also be explicitly + called if an object allocated from the pool is intentionally not being returned + to the pool. This can be of use with pooled arrays if the consumer wants to + return a larger array to the pool than was originally allocated. + + + + + Provides pooled delegate instances to help avoid closure allocations for delegates that require a state argument + with APIs that do not provide appropriate overloads with state arguments. + + + + + Gets an delegate, which calls with the specified + . The resulting may be called any number of times + until the returned is disposed. + + + The following example shows the use of a capturing delegate for a callback action that requires an + argument: + + + int x = 3; + RunWithActionCallback(() => this.DoSomething(x)); + + + The following example shows the use of a pooled delegate to avoid capturing allocations for the same + callback action: + + + int x = 3; + using var _ = GetPooledAction(arg => arg.self.DoSomething(arg.x), (self: this, x), out Action action); + RunWithActionCallback(action); + + + The type of argument to pass to . + The unbound action delegate. + The argument to pass to the unbound action delegate. + A delegate which calls with the specified + . + A disposable which returns the object to the delegate pool. + + + + Gets an delegate, which calls with the specified + . The resulting may be called any number of times + until the returned is disposed. + + + The following example shows the use of a capturing delegate for a callback action that requires an + argument: + + + int x = 3; + RunWithActionCallback(a => this.DoSomething(a, x)); + + + The following example shows the use of a pooled delegate to avoid capturing allocations for the same + callback action: + + + int x = 3; + using var _ = GetPooledAction((a, arg) => arg.self.DoSomething(a, arg.x), (self: this, x), out Action<int> action); + RunWithActionCallback(action); + + + The type of the first parameter of the bound action. + The type of argument to pass to . + The unbound action delegate. + The argument to pass to the unbound action delegate. + A delegate which calls with the specified + . + A disposable which returns the object to the delegate pool. + + + + Gets an delegate, which calls with the specified + . The resulting may be called any number of times + until the returned is disposed. + + + The following example shows the use of a capturing delegate for a callback action that requires an + argument: + + + int x = 3; + RunWithActionCallback((a, b) => this.DoSomething(a, b, x)); + + + The following example shows the use of a pooled delegate to avoid capturing allocations for the same + callback action: + + + int x = 3; + using var _ = GetPooledAction((a, b, arg) => arg.self.DoSomething(a, b, arg.x), (self: this, x), out Action<int, int> action); + RunWithActionCallback(action); + + + The type of the first parameter of the bound action. + The type of the second parameter of the bound action. + The type of argument to pass to . + The unbound action delegate. + The argument to pass to the unbound action delegate. + A delegate which calls with the specified + . + A disposable which returns the object to the delegate pool. + + + + Gets an delegate, which calls with the specified + . The resulting may be called any number of times + until the returned is disposed. + + + The following example shows the use of a capturing delegate for a callback action that requires an + argument: + + + int x = 3; + RunWithActionCallback((a, b, c) => this.DoSomething(a, b, c, x)); + + + The following example shows the use of a pooled delegate to avoid capturing allocations for the same + callback action: + + + int x = 3; + using var _ = GetPooledAction((a, b, c, arg) => arg.self.DoSomething(a, b, c, arg.x), (self: this, x), out Action<int, int, int> action); + RunWithActionCallback(action); + + + The type of the first parameter of the bound action. + The type of the second parameter of the bound action. + The type of the third parameter of the bound action. + The type of argument to pass to . + The unbound action delegate. + The argument to pass to the unbound action delegate. + A delegate which calls with the specified + . + A disposable which returns the object to the delegate pool. + + + + Gets a delegate, which calls with the + specified . The resulting may be called any + number of times until the returned is disposed. + + + The following example shows the use of a capturing delegate for a predicate that requires an + argument: + + + int x = 3; + RunWithPredicate(() => this.IsSomething(x)); + + + The following example shows the use of a pooled delegate to avoid capturing allocations for the same + predicate: + + + int x = 3; + using var _ = GetPooledFunction(arg => arg.self.IsSomething(arg.x), (self: this, x), out Func<bool> predicate); + RunWithPredicate(predicate); + + + The type of argument to pass to . + The type of the return value of the function. + The unbound function delegate. + The argument to pass to the unbound function delegate. + A delegate which calls with the specified + . + A disposable which returns the object to the delegate pool. + + + + Gets a delegate, which calls with the + specified . The resulting may be called any + number of times until the returned is disposed. + + + The following example shows the use of a capturing delegate for a predicate that requires an + argument: + + + int x = 3; + RunWithPredicate(a => this.IsSomething(a, x)); + + + The following example shows the use of a pooled delegate to avoid capturing allocations for the same + predicate: + + + int x = 3; + using var _ = GetPooledFunction((a, arg) => arg.self.IsSomething(a, arg.x), (self: this, x), out Func<int, bool> predicate); + RunWithPredicate(predicate); + + + The type of the first parameter of the bound function. + The type of argument to pass to . + The type of the return value of the function. + The unbound function delegate. + The argument to pass to the unbound function delegate. + A delegate which calls with the specified + . + A disposable which returns the object to the delegate pool. + + + + Gets a delegate, which calls with the + specified . The resulting may be called any + number of times until the returned is disposed. + + + The following example shows the use of a capturing delegate for a predicate that requires an + argument: + + + int x = 3; + RunWithPredicate((a, b) => this.IsSomething(a, b, x)); + + + The following example shows the use of a pooled delegate to avoid capturing allocations for the same + predicate: + + + int x = 3; + using var _ = GetPooledFunction((a, b, arg) => arg.self.IsSomething(a, b, arg.x), (self: this, x), out Func<int, int, bool> predicate); + RunWithPredicate(predicate); + + + The type of the first parameter of the bound function. + The type of the second parameter of the bound function. + The type of argument to pass to . + The type of the return value of the function. + The unbound function delegate. + The argument to pass to the unbound function delegate. + A delegate which calls with the specified + . + A disposable which returns the object to the delegate pool. + + + + Gets a delegate, which calls with the + specified . The resulting may be called any + number of times until the returned is disposed. + + + The following example shows the use of a capturing delegate for a predicate that requires an + argument: + + + int x = 3; + RunWithPredicate((a, b, c) => this.IsSomething(a, b, c, x)); + + + The following example shows the use of a pooled delegate to avoid capturing allocations for the same + predicate: + + + int x = 3; + using var _ = GetPooledFunction((a, b, c, arg) => arg.self.IsSomething(a, b, c, arg.x), (self: this, x), out Func<int, int, int, bool> predicate); + RunWithPredicate(predicate); + + + The type of the first parameter of the bound function. + The type of the second parameter of the bound function. + The type of the third parameter of the bound function. + The type of argument to pass to . + The type of the return value of the function. + The unbound function delegate. + The argument to pass to the unbound function delegate. + A delegate which calls with the specified + . + A disposable which returns the object to the delegate pool. + + + + A releaser for a pooled delegate. + + + This type is intended for use as the resource of a using statement. When used in this manner, + should not be called explicitly. + + If used without a using statement, calling is optional. If the call is + omitted, the object will not be returned to the pool. The behavior of this type if is + called multiple times is undefined. + + + + + The usage is: + var inst = PooledStringBuilder.GetInstance(); + var sb = inst.builder; + ... Do Stuff... + ... sb.ToString() ... + inst.Free(); + + + + + If someone need to create a private pool + + The size of the pool. + + + + Output kind not supported. + + + Path returned by {0}.ResolveMetadataFile must be absolute: '{1}' + + + Assembly must have at least one module. + + + Module copy can't be used to create an assembly metadata. + + + Unresolved: + + + assembly + + + class + + + constructor + + + delegate + + + enum + + + event + + + field + + + type parameter + + + interface + + + method + + + module + + + parameter + + + property, indexer + + + return + + + struct + + + Can't create a reference to a submission. + + + Can't create a reference to a module. + + + <in-memory assembly> + + + <in-memory module> + + + Size has to be positive. + + + Assembly file not found + + + Can't embed interop types from module. + + + Can't alias a module. + + + Invalid alias. + + + {0}.GetMetadata() must return an instance of {1}. + + + Value too large to be represented as a 30 bit unsigned integer. + + + Arrays with more than one dimension cannot be serialized. + + + Invalid assembly name: '{0}' + + + Absolute path expected. + + + A key in the pathMap is empty. + + + A value in the pathMap is null. + + + Compilation options must not have errors. + + + Return type can't be a value type, pointer, by-ref or open generic type + + + Return type can't be void, by-ref or open generic type + + + Type must be same as host object type of previous submission. + + + Previous submission has errors. + + + Invalid output kind for submission. DynamicallyLinkedLibrary expected. + + + Invalid compilation options -- submission can't be signed. + + + Resource stream provider should return non-null stream. + + + Reference resolver should return readable non-null stream. + + + Empty or invalid resource name + + + Empty or invalid file name + + + Resource data provider should return non-null stream + + + File not found. + + + Path returned by {0}.ResolveStrongNameKeyFile must be absolute: '{1}' + + + type must be a subclass of SyntaxAnnotation. + + + Invalid module name specified in metadata module '{0}': '{1}' + + + File size exceeds maximum allowed size of a valid metadata file. + + + Name cannot be null. + + + Name cannot be empty. + + + Name cannot start with whitespace. + + + Name contains invalid characters. + + + The span does not include the start of a line. + + + The span does not include the end of a line. + + + 'start' must not be negative + + + 'end' must not be less than 'start' + + + Invalid content type + + + Expected non-empty public key + + + Invalid size of public key token. + + + Invalid characters in assembly name + + + Invalid characters in assembly culture name + + + Stream must support read and seek operations. + + + Stream must be readable. + + + Stream must be writable. + + + PDB stream should not be given when embedding PDB into the PE stream. + + + PDB stream should not be given when emitting metadata only. + + + Metadata PE stream should not be given when emitting metadata only. + + + Including private members should not be used when emitting to the secondary assembly output. + + + Must include private members unless emitting a ref assembly. + + + Embedding PDB is not allowed when emitting metadata. + + + Cannot target net module when emitting ref assembly. + + + Invalid hash. + + + Unsupported hash algorithm. + + + Inconsistent language versions + + + Win32 resources, assumed to be in COFF object format, have one or more invalid relocation header values. + + + Win32 resources, assumed to be in COFF object format, have an invalid section size. + + + Win32 resources, assumed to be in COFF object format, have one or more invalid symbol values. + + + Win32 resources, assumed to be in COFF object format, are missing one or both of sections '.rsrc$01' and '.rsrc$02' + + + Icon stream is not in the expected format. + + + Invalid culture name: '{0}' + + + WindowsRuntime identity can't be retargetable + + + PE image not available. + + + Assembly signing not supported. + + + References to XML documents are not supported. + + + Could not locate the rule set file '{0}'. + + + An error occurred while loading the included rule set file {0} - {1} + + + Analyzer Failure + + + Analyzer '{0}' threw an exception of type '{1}' with message '{2}'. + {3} + + + Analyzer '{0}' threw the following exception: + '{1}'. + + + Analyzer Driver Failure + + + Analyzer driver threw an exception of type '{0}' with message '{1}'. + + + Analyzer driver threw the following exception: + '{0}'. + + + PE image doesn't contain managed metadata. + + + The changes must not overlap. + + + A DiagnosticDescriptor must have an Id that is neither null nor an empty string nor a string that only contains white space. + + + A SuppressionDescriptor must have an Id that is neither null nor an empty string nor a string that only contains white space. + + + The rule set file has duplicate rules for '{0}' with differing actions '{1}' and '{2}'. + + + Can't create a module reference to an assembly. + + + Can't create a metadata reference to a dynamic assembly. + + + Can't create a metadata reference to an assembly without location. + + + Argument cannot be empty. + + + Argument cannot have a null element. + + + Reported diagnostic with ID '{0}' is not supported by the analyzer. + + + Reported suppression with ID '{0}' is not supported by the suppressor. + + + Suppressed diagnostic ID '{0}' does not match suppressable ID '{1}' for the given suppression descriptor. + + + Non-reported diagnostic with ID '{0}' cannot be suppressed. + + + Reported diagnostic has an ID '{0}', which is not a valid identifier. + + + Reported diagnostic '{0}' has a source location in file '{1}', which is not part of the compilation being analyzed. + + + Analyzer '{0}' contains a null descriptor in its 'SupportedDiagnostics'. + + + Analyzer '{0}' contains a null descriptor in its 'SupportedSuppressions'. + + + The type '{0}' is not understood by the serialization binder. + + + Cannot deserialize type '{0}'. + + + Cannot serialize type '{0}'. + + + Node to track is not a descendant of the root. + + + A node or token is out of sequence. + + + A node in the list is not of the expected type. + + + The item specified is not the element of a list. + + + Invalid public key. + + + Invalid public key token. + + + Invalid data at offset {0}: {1}{2}*{3}{4} + + + Windows PDB writer doesn't support deterministic compilation: '{0}' + + + The version of Windows PDB writer is older than required: '{0}' + + + Windows PDB writer doesn't support SourceLink feature: '{0}' + + + The attribute {0} has an invalid value of {1}. + + + The element {0} is missing an attribute named {1}. + + + Argument to '/keepalive' option is not a 32-bit integer. + + + Arguments to '/keepalive' option below -1 are invalid. + + + '/keepalive' option is only valid with '/shared' option. + + + Roslyn compiler server reports different protocol version than build task. + + + Missing argument for '/keepalive' option. + + + Total analyzer execution time: {0} seconds. + + + NOTE: Elapsed time may be less than analyzer execution time because analyzers can run concurrently. + + + Time (s) + + + Analyzer + + + No analyzers found + + + Argument contains duplicate analyzer instances. + + + Argument contains an analyzer instance that does not belong to the 'Analyzers' for this CompilationWithAnalyzers instance. + + + Syntax tree doesn't belong to the underlying 'Compilation'. + + + Additional file doesn't belong to the underlying 'CompilationWithAnalyzers'. + + + Resource stream ended at {0} bytes, expected {1} bytes. + + + Value for argument '/shared:' must not be empty + + + Exception occurred with following context: + {0} + + + {0} and {1} must have the same length. + + + {0} must either be 'default' or have the same length as {1}. + + + Inconsistent syntax tree features + + + Reference of type '{0}' is not valid for this compilation. + + + MetadataReference '{0}' not found to remove. + + + If tuple element names are specified, the number of element names must match the cardinality of the tuple. + + + Tuple element name cannot be an empty string. + + + If tuple element locations are specified, the number of locations must match the cardinality of the tuple. + + + If tuple element nullable annotations are specified, the number of annotations must match the cardinality of the tuple. + + + Tuples must have at least two elements. + + + The compilation references multiple assemblies whose versions only differ in auto-generated build and/or revision numbers. + + + The underlying type for a tuple must be tuple-compatible. + + + Unrecognized resource file format. + + + SourceText cannot be embedded. Provide encoding or canBeEmbedded=true at construction. + + + Stream is too long. + + + Embedded texts are only supported when emitting a PDB. + + + The stream cannot be written to. + + + element is expected + + + separator is expected + + + The stream cannot be read from. + + + Deserialization reader for '{0}' read incorrect number of values. + + + Stream contains invalid data + + + Reported diagnostic '{0}' has a source location '{1}' in file '{2}', which is outside of the given file. + + + Warning: Could not enable multicore JIT due to exception: {0}. + + + Given operation has a non-null parent. + + + Given operation has a null semantic model. + + + Given operation block does not belong to the current analysis context. + + + Parameter '{0}' must be an 'INamedTypeSymbol' or an 'IAssemblySymbol'. + + + Parameter '{0}' must be a symbol from this compilation or some referenced assembly. + + + The provided operation must not be part of a Control Flow Graph. + + + A language name cannot be specified for this option. + + + A language name must be specified for this option. + + + The diagnostic '{0}' was given an invalid severity '{1}' in the analyzer config file at '{2}'. + + + Invalid severity in analyzer config file. + + + Programmatic suppression of an analyzer diagnostic + + + Diagnostic '{0}: {1}' was programmatically suppressed by a DiagnosticSuppressor with suppression ID '{2}' and justification '{3}' + + + Module has invalid attributes. + + + Unable to determine specific cause of the failure. + + + Changing the version of an assembly reference is not allowed during debugging: '{0}' changed version to '{1}'. + + + Suppress the following diagnostics to disable this analyzer: {0} + + + Only a single {0} can be registered per generator. + + + Multiple global analyzer config files set the same key '{0}' in section '{1}'. It has been unset. Key was set by the following files: '{2}' + + + Multiple global analyzer config files set the same key. It has been unset. + + + The hintName '{0}' of the added source file must be unique within a generator. + + + The hintName '{0}' contains an invalid character '{1}' at position {2}. + + + The SourceText with hintName '{0}' must have an explicit encoding set. + + + The assembly containing type '{0}' references .NET Framework, which is not supported. + + + Global analyzer config section name '{0}' is invalid as it is not an absolute path. Section will be ignored. Section was declared in file: '{1}' + + + Global analyzer config section name is invalid as it is not an absolute path. Section will be ignored. + + + Changes must be within bounds of SourceText + + + Edit and Continue can't resume suspended asynchronous method since the corresponding await expression has been deleted + + + Edit and Continue can't resume suspended iterator since the corresponding yield return statement has been deleted + + + Generator + + + Total generator execution time: {0} seconds. + + + Illegal built-in operator name '{0}' + + + Unsupported built-in operator: {0} + + + '{0}' was not a valid built-in operator name + + + + Resolves type reference. + + The TypeRef metadata token to return the referenced type information for. + The IID of the interface to return in scope. Typically, this would be IID_IMetaDataImport. + An interface to the module scope in which the referenced type is defined. + A pointer to a TypeDef token that represents the referenced type. + + TypeDefs define a type within a scope. TypeRefs refer to type-defs in other scopes + and allow you to import a type from another scope. This function attempts to determine + which type-def a type-ref points to. + + This resolve (type-ref, this cope) --> (type-def=*ptd, other scope=*ppIScope) + + However, this resolution requires knowing what modules have been loaded, which is not decided + until runtime via loader / fusion policy. Thus this interface can't possibly be correct since + it doesn't have that knowledge. Furthermore, when inspecting metadata from another process + (such as a debugger inspecting the debuggee's metadata), this API can be truly misleading. + + This API usage should be avoided. + + + + + Minimal implementation of IMetadataImport that implements APIs used by SymReader and SymWriter. + + + + + A COM IStream implementation over memory. Supports just enough for DiaSymReader's PDB writing. + Also tuned for performance: + 1. SetSize (and Seek beyond the length) is very fast and doesn't re-allocate the underlying memory. + 2. Read and Write are optimized to avoid copying (see ) + 3. Allocates in chunks instead of a contiguous buffer to avoid re-alloc and copy costs when growing. + + + + + This is a re-definition of COM's IStream interface. The important change is that + the Read and Write methods take an instead of a byte[] to avoid the + allocation cost when called from native code. + + + + + Adds compiler version number and name. + + + + + The highest version of the interface available on Desktop FX 4.0+. + + + + + has type , rather than , + so that we can do custom marshalling of . Unfortunately, .NET marshals + s as the number of days since 1899/12/30, whereas the native VB compiler + marshalled them as the number of ticks since the Unix epoch (i.e. a much, much larger number). + + + + + Open a special custom data section to emit token to source span mapping information into. + Opening this section while a method is already open or vice versa is an error. + + + + + Close the special custom data section for token to source span mapping + information. Once it is closed no more mapping information can be added. + + + + + Maps the given metadata token to the given source line span in the specified source file. + Must be called between calls to and . + + + + + The highest version of the interface available in Microsoft.DiaSymReader.Native. + + + + + A struct with the same size and layout as the native VARIANT type: + 2 bytes for a discriminator (i.e. which type of variant it is). + 6 bytes of padding + 8 or 16 bytes of data + + + + + This field determines the size of the struct + (16 bytes on 32-bit platforms, 24 bytes on 64-bit platforms). + + + + + This type is 8 bytes on a 32-bit platforms and 16 bytes on 64-bit platforms. + + + + + Windows PDB writer. + + + + + Disposes the writer. + + + + + Gets the raw data blobs that comprise the written PDB content so far. + + + + + Writes the PDB data to specified stream. Once called no more changes to the data can be made using this writer. + May be called multiple times. Always writes the same data. + + Stream to write PDB data to. + Error occurred while writing data to the stream. + + + + The capacity of document table. + + + Whenever a document is defined an entry is added to this table. + If the number of documents is known upfront setting this value may reduce memory consumption. + + + + + Defines a source document. + + Object has been disposed. + Writes are not allowed to the underlying stream. + Error occurred while writing PDB data. + + + + Defines sequence points. + + Object has been disposed. + Writes are not allowed to the underlying stream. + Error occurred while writing PDB data. + + + + Opens a method. + + Object has been disposed. + Writes are not allowed to the underlying stream. + Error occurred while writing PDB data. + + + + Closes a method previously open using . + + Object has been disposed. + Writes are not allowed to the underlying stream. + Error occurred while writing PDB data. + + + + Opens a local scope. + + Object has been disposed. + Writes are not allowed to the underlying stream. + + + + Closes a local scope previously open using . + + Object has been disposed. + Writes are not allowed to the underlying stream. + Error occurred while writing PDB data. + + + + Defines a local variable. + + Object has been disposed. + Writes are not allowed to the underlying stream. + Error occurred while writing PDB data. + + + + Defines a local constant. + + Name of the constant. + Value. + Standalone signature token encoding the static type of the constant. + False if the constant representation is too long (e.g. long string). + Object has been disposed. + Writes are not allowed to the underlying stream. + Error occurred while writing PDB data. + is null + + + + Adds namespace import. + + Object has been disposed. + Writes are not allowed to the underlying stream. + Error occurred while writing PDB data. + is null + + + + Sets method async information. + + Object has been disposed. + Writes are not allowed to the underlying stream. + Error occurred while writing PDB data. + or is null + or differ in length. + + + + Associates custom debug information blob with the current method. + + Object has been disposed. + Writes are not allowed to the underlying stream. + Error occurred while writing PDB data. + is null + + + + Designates specified method as an entry point. + + Object has been disposed. + Writes are not allowed to the underlying stream. + Error occurred while writing PDB data. + + + + Updates the current PDB signature. + + Object has been disposed. + Writes are not allowed to the underlying stream. + Error occurred while writing PDB data. + + + + Gets the current PDB signature. + + Object has been disposed. + Error occurred while writing PDB data. + + + + Sets source server data blob (srcsvr stream). + + Object has been disposed. + Writes are not allowed to the underlying stream. + Error occurred while writing PDB data. + is null + + + + Sets source link data blob (sourcelink stream). + + Object has been disposed. + Writes are not allowed to the underlying stream. + Error occurred while writing PDB data. + is null + + + + Opens a map of tokens to source spans. + + Object has been disposed. + Writes are not allowed to the underlying stream. + Error occurred while writing PDB data. + + + + Maps specified token to a source span. + + Object has been disposed. + Writes are not allowed to the underlying stream. + Error occurred while writing PDB data. + doesn't correspond to any defined document. + + + + Closes map of tokens to source spans previously opened using . + + Object has been disposed. + Writes are not allowed to the underlying stream. + Error occurred while writing PDB data. + + + + Writes compiler version and name to the PDB. + + Major version + Minor version + Build + Revision + Compiler name + Object has been disposed. + Error occurred while writing PDB data. + The PDB writer does not support adding compiler info. + is null. + + + + creation options. + + + + + Default options. + + + + + Use environment variable MICROSOFT_DIASYMREADER_NATIVE_ALT_LOAD_PATH to locate Microsoft.DiaSymReader.Native.{platform}.dll. + + + + + Use COM registry to locate an implementation of the writer. + + + + + Create a deterministic PDB writer. + + + + + Exception reported when PDB write operation fails. + + + + + The name of the module that implements the underlying PDB writer (e.g. diasymreader.dll), or null if not available. + + + + + Creates a Windows PDB writer. + + implementation. + Options. + + Tries to load the implementation of the PDB writer from Microsoft.DiaSymReader.Native.{platform}.dll library first. + It searches for this library in the directory Microsoft.DiaSymReader.dll is loaded from, + the application directory, the %WinDir%\System32 directory, and user directories in the DLL search path, in this order. + If not found in the above locations and option is specified + the directory specified by MICROSOFT_DIASYMREADER_NATIVE_ALT_LOAD_PATH environment variable is also searched. + If the Microsoft.DiaSymReader.Native.{platform}.dll library can't be found and + option is specified checks if the PDB reader is available from a globally registered COM object. This COM object is provided + by .NET Framework and has limited functionality (features like determinism and source link are not supported). + + is null. + The SymWriter implementation is not available or failed to load. + Error creating the PDB writer. See inner exception for root cause. + + + + Writes the content to the given stream. The writer is disposed and can't be used for further writing. + + + + + This class is used to store the module serialization properties for a compilation. + + + + + The alignment factor (in bytes) that is used to align the raw data of sections in the image file. + The value should be a power of 2 between 512 and 64K, inclusive. The default is 512. + + + + + The alignment (in bytes) of sections when they are loaded into memory. + It must be greater than or equal to . + The default is the page size for the architecture. + + + + + Identifies the version of the CLR that is required to load this module or assembly. + + + + + Specifies the target CPU. means AnyCPU. + + + + + A globally unique persistent identifier for this module. + + + + + The preferred memory address at which the module is to be loaded at runtime. + + + + + The size of the virtual memory to reserve for the initial process heap. + Must fit into 32 bits if the target platform is 32 bit. + + + + + The size of the virtual memory initially committed for the initial process heap. + Must fit into 32 bits if the target platform is 32 bit. + + + + + The size of the virtual memory to reserve for the initial thread's stack. + Must fit into 32 bits if the target platform is 32 bit. + + + + + The first part of a two part version number indicating the version of the linker that produced this module. For example, the 8 in 8.0. + + + + + The first part of a two part version number indicating the version of the linker that produced this module. For example, the 0 in 8.0. + + + + + Flags that control the behavior of the target operating system. CLI implementations are supposed to ignore this, but some operating system pay attention. + + + + + Write document entries for all debug documents that do not yet have an entry. + + + This is done after serializing method debug info to ensure that we embed all requested + text even if there are no corresponding sequence points. + + + + + Represents an assembly reference with an alias (C# only, /r:Name=Reference on command line). + + + + + An alias for the global namespace of the assembly. + + + + + The assembly reference. + + + + + Names for compilation options that get embedded as debug information + in the PDB as key-value pairs. + + + REMOVAL OR CHANGES TO EXISTING VALUES IS CONSIDERED A BREAKING CHANGE FOR PDB FORMAT + + + + + System.Runtime.InteropServices.VarEnum is obsolete. + + + + + An object corresponding to a metadata entity such as a type or a field. + + + + + An object corresponding to reference to a metadata entity such as a type or a field. + + + + + A collection of metadata custom attributes that are associated with this definition. + + + + + Calls the visitor.Visit(T) method where T is the most derived object model node interface type implemented by the concrete type + of the object implementing IDefinition. The dispatch method does not invoke Dispatch on any child objects. If child traversal + is desired, the implementations of the Visit methods should do the subsequent dispatching. + + + + + Gets the definition object corresponding to this reference within the given context, + or null if the referenced entity isn't defined in the context. + + + + + Returns underlying internal symbol object, if any. + + + + + Returns true if the namespace scope for this method should be forwarded to another method. + Returns non-null if the forwarding should be done directly via UsingNamespace, + null if the forwarding is done via custom debug info. + + + + + Use to create a document when checksum is computed based on actual source stream. + + + + + Use to create a document when checksum is suggested via external checksum pragma/directive + + + + + returns true when checksum was computed base on an actual source stream + as opposed to be suggested via a checksum directive/pragma + + + + + Represents the portion of a that are derived + from the source document content, and which can be computed asynchronously. + + + + + The ID of the hash algorithm used. + + + + + The hash of the document content. + + + + + The source text to embed in the PDB. (If any, otherwise default.) + + + + + A region representing an exception handler clause. The region exposes the type (catch or + finally) and the bounds of the try block and catch or finally block as needed by + + + + + Label instruction corresponding to the start of try block + + + + + Label instruction corresponding to the end of try block + + + + + Label instruction corresponding to the start of handler block + + + + + Label instruction corresponding to the end of handler block + + + + + Handler kind for this SEH info + + + + + If HandlerKind == HandlerKind.Catch, this is the type of exception to catch. If HandlerKind == HandlerKind.Filter, this is System.Object. + Otherwise this is a Dummy.TypeReference. + + + + + Label instruction corresponding to the start of filter decision block + + + + + Info needed when emitting ExportedType table entry. + + + + + The target type reference. + + + + + True if this represents a type forwarder definition, + false if it represents a type from a linked netmodule. + + + + + If is a nested type defined in a linked netmodule, + the index of the entry that represents the enclosing type. + + + + + An expression that can be represented directly in metadata. + + + + + Calls the visitor.Visit(T) method where T is the most derived object model node interface type implemented by the concrete type + of the object implementing IStatement. The dispatch method does not invoke Dispatch on any child objects. If child traversal + is desired, the implementations of the Visit methods should do the subsequent dispatching. + + + + + The type of value the expression represents. + + + + + An expression that represents a (name, value) pair and that is typically used in method calls, custom attributes and object initializers. + + + + + The name of the parameter or property or field that corresponds to the argument. + + + + + The value of the argument. + + + + + True if the named argument provides the value of a field. + + + + + This PEBuilder adds an .mvid section. + + + + + A metadata custom attribute. + + + + + Zero or more positional arguments for the attribute constructor. + + + + + A reference to the constructor that will be used to instantiate this custom attribute during execution (if the attribute is inspected via Reflection). + + + + + Zero or more named arguments that specify values for fields and properties of the attribute. + + + + + The number of positional arguments. + + + + + The number of named arguments. + + + + + The type of the attribute. For example System.AttributeUsageAttribute. + + + + + Whether attribute allows multiple. + + + + + Represents a file referenced by an assembly. + + + + + True if the file has metadata. + + + + + File name with extension. + + + + + A hash of the file contents. + + + + + Represents a lexical scope that declares imports. + + + + + Zero or more used namespaces. These correspond to using directives in C# or Imports syntax in VB. + Multiple invocations return the same array instance. + + + + + Parent import scope, or null. + + + + + A range of CLR IL operations that comprise a lexical scope. + + + + + The offset of the first operation in the scope. + + + + + The offset of the first operation outside of the scope, or the method body length. + + + + + Returns zero or more local constant definitions that are local to the given scope. + + + + + Returns zero or more local variable definitions that are local to the given scope. + + + + + streamProvider callers will dispose result after use. + and are mutually exclusive. + + + + + Specifies how the caller passes parameters to the callee and who cleans up the stack. + + + + + C/C++ style calling convention for unmanaged methods. The call stack is cleaned up by the caller, + which makes this convention suitable for calling methods that accept extra arguments. + + + + + The convention for calling managed methods with a fixed number of arguments. + + + + + The convention for calling managed methods that accept extra arguments. + + + + + Arguments are passed in registers when possible. This calling convention is not yet supported. + + + + + Win32 API calling convention for calling unmanaged methods via PlatformInvoke. The call stack is cleaned up by the callee. + + + + + C++ member unmanaged method (non-vararg) calling convention. The callee cleans the stack and the this pointer is pushed on the stack last. + + + + + Extensible calling convention protocol. This represents either the union of calling convention modopts after the paramcount specifier + in IL, or platform default if none are present + + + + + The convention for calling a generic method. + + + + + The convention for calling an instance method with an implicit this parameter (the method does not have an explicit parameter definition for this). + + + + + The convention for calling an instance method that explicitly declares its first parameter to correspond to the this instance. + + + + + Compares calling conventions, ignoring calling convention attributes. + + + + + An event is a member that enables an object or class to provide notifications. Clients can attach executable code for events by supplying event handlers. + This interface models the metadata representation of an event. + + + + + A list of methods that are associated with the event. + + + + + The method used to add a handler to the event. + + + + + The method used to call the event handlers when the event occurs. May be null. + + + + + True if the event gets special treatment from the runtime. + + + + + This event is special in some way, as specified by the name. + + + + + The method used to add a handler to the event. + + + + + The (delegate) type of the handlers that will handle the event. + + + + + A field is a member that represents a variable associated with an object or class. + This interface models the metadata representation of a field. + + + + + The compile time value of the field. This value should be used directly in IL, rather than a reference to the field. + If the field does not have a valid compile time value, Dummy.Constant is returned. + + + + + Mapped field data, or null if the field is not mapped. + + + + + This field is a compile-time constant. The field has no runtime location and cannot be directly addressed from IL. + + + + + This field has associated field marshalling information. + + + + + The field does not have to be serialized when its containing instance is serialized. + + + + + This field can only be read. Initialization takes place in a constructor. + + + + + True if the field gets special treatment from the runtime. + + + + + This field is special in some way, as specified by the name. + + + + + This field is static (shared by all instances of its declaring type). + + + + + Specifies how this field is marshalled when it is accessed from unmanaged code. + + + + + Checked if IsMarshalledExplicitly == true and MarshallingInformation is null + + + + + Offset of the field. + + + + + A reference to a field. + + + + + The type of value that is stored in this field. + + + + + The list of custom modifiers, if any, associated with the ref modifier. + + + + + True if the field contains a managed pointer. + + + + + The Field being referred to. + + + + + True, if field is an IContextualNamedEntity, even if field reference implements the interface, + doesn't mean it is contextual. + + + + + An object that represents a local variable or constant. + + + + + The compile time value of the definition, if it is a local constant. + + + + + Custom modifiers associated with local variable definition. + + + + + TODO: use instead. + True if the value referenced by the local must not be moved by the actions of the garbage collector. + + + + + TODO: use instead. + True if the local contains a managed pointer (for example a reference to a local variable or a reference to a field of an object). + + + + + Each local has an attributes field in the PDB. To match the native compiler, + we emit for locals that should + definitely not bind in the debugger and + for all other locals. + + + A value of is a sufficient, but not a necessary, condition for hiding the + local in the debugger. Locals with value may also be hidden. + + Hidden locals must still be emitted because they participate in evaluation. + + + + + The synthesized dynamic attributes of the local definition if any, or empty. + + + + + The tuple element names of the local definition if any, or empty. + + + + + The type of the local. + + + + + Location for reporting diagnostics about the local. + + + Use rather than null. + + + + + Slot index or -1 if not applicable. + + + + + Optional serialized local signature. + + + + + Local id, or if this is a local constant, short-lived temp variable, + or we are not emitting local variable ids (release builds). + + + + + A metadata (IL) level representation of the body of a method or of a property/event accessor. + + + + + A list exception data within the method body IL. + + + + + True if the locals are initialized by zeroing the stack upon method entry. + + + + + True if there's a stackalloc somewhere in the method. + + + + + The local variables of the method. + + + + + The definition of the method whose body this is. + If this is the body of an event or property accessor, this will hold the corresponding adder/remover/setter or getter method. + + + + + Debugging information associated with a MoveNext method of a state machine. + + + + + The maximum number of elements on the evaluation stack during the execution of the method. + + + + + Returns true if there is at least one dynamic local within the MethodBody + + + + + Returns zero or more local (block) scopes into which the CLR IL operations in the given method body is organized. + + + + + Returns an import scope the method is declared within, or null if there is none + (e.g. the method doesn't contain user code). + + + The chain is a spine of a tree in a forest of import scopes. A tree of import scopes is created by the language for each source file + based on namespace declarations. In VB each tree is trivial single-node tree that declares the imports of a file. + In C# the tree copies the nesting of namespace declarations in the file. There is a separate scope for each dotted component in + the namespace type name. For instance namespace type x.y.z will have two namespace scopes, the first is for the x and the second + is for the y. + + + + + Returns debug information for local variables hoisted to state machine fields, + or null if this method isn't MoveNext method of a state machine. + + + Returns zero or more local (block) scopes, each defining an IL range in which an iterator local is defined. + The scopes are returned for the MoveNext method of the object returned by the iterator method. + The index of the scope corresponds to the index of the local. Specifically local scope i corresponds + to the local stored in a field named <localName>5__i of the class used to store the local values in + between calls to MoveNext, where localName is the original name of the local variable. For example, if + the first local to be moved into the class is named "xyzzy", it will be stored in a field named + "<xyzzy>5__1", and the ILocalScope returned from this method at index 1 (i.e. the second one) will + have the scope information for where that variable is in scope. + + + + + The name of the state machine generated for the method, + or null if the method isn't the kickoff method of a state machine. + + + + + Returns information relevant to EnC on slots of local variables hoisted to state machine fields, + or null if the method isn't the kickoff method of a state machine. + + + + + Returns types of awaiter slots allocated on the state machine, + or null if the method isn't the kickoff method of a state machine. + + + + + This interface models the metadata representation of a method. + + + + + A container for a list of IL instructions providing the implementation (if any) of this method. + + + When emitting metadata-only assemblies this returns null even if returns true. + + + + + If the method is generic then this list contains the type parameters. + + + + + True if this method has a non empty collection of SecurityAttributes or the System.Security.SuppressUnmanagedCodeSecurityAttribute. + + + + + True if the method does not provide an implementation. + + + + + True if the method can only be overridden when it is also accessible. + + + + + True if the method is a constructor. + + + + + True if the method has an external implementation (i.e. not supplied by this definition). + + + If the method is not external and not abstract it has to provide an IL body. + + + + + True if this method is hidden if a derived type declares a method with the same name and signature. + If false, any method with the same name hides this method. This flag is ignored by the runtime and is only used by compilers. + + + + + The method always gets a new slot in the virtual method table. + This means the method will hide (not override) a base type method with the same name and signature. + + + + + True if the method is implemented via the invocation of an underlying platform method. + + + + + True if the method gets special treatment from the runtime. For example, it might be a constructor. + + + + + True if the method may not be overridden. + + + + + True if the method is special in some way for tools. For example, it might be a property getter or setter. + + + + + True if the method does not require an instance of its declaring type as its first argument. + + + + + True if the method may be overridden (or if it is an override). + + + + + Implementation flags. + + + + + The parameters forming part of this signature. + + + + + Detailed information about the PInvoke stub. Identifies which method to call, which module has the method and the calling convention among other things. + + + + + True if the method calls another method containing security code. If this flag is set, the method + should have System.Security.DynamicSecurityMethodAttribute present in its list of custom attributes. + + + + + Custom attributes associated with the method's return value. + + + + + The return value has associated marshalling information. + + + + + Specifies how the return value is marshalled when the method is called from unmanaged code. + + + + + Checked if ReturnValueIsMarshalledExplicitly == true and ReturnValueMarshallingInformation is null + + + + + Declarative security actions for this method. + + + + + Namespace containing this method. + TODO: Ideally we would expose INamespace on INamespaceTypeDefinition. Right now we can only get the qualified namespace name. + + + + + This interface models the metadata representation of a method or property parameter. + + + + + A compile time constant value that should be supplied as the corresponding argument value by callers that do not explicitly specify an argument value for this parameter. + Null if the parameter doesn't have default value. + + + + + True if the parameter has a default value that should be supplied as the argument value by a caller for which the argument value has not been explicitly specified. + + + + + True if the argument value must be included in the marshalled arguments passed to a remote callee. + + + + + This parameter has associated marshalling information. + + + + + True if the argument value must be included in the marshalled arguments passed to a remote callee only if it is different from the default value (if there is one). + + + + + True if the final value assigned to the parameter will be marshalled with the return values passed back from a remote callee. + + + + + Specifies how this parameter is marshalled when it is accessed from unmanaged code. + + + + + Checked if IsMarshalledExplicitly == true and MarshallingInformation is null + + + + + A property is a member that provides access to an attribute of an object or a class. + This interface models the metadata representation of a property. + + + + + A list of methods that are associated with the property. + + + + + A compile time constant value that provides the default value for the property. (Who uses this and why?) + + + + + The method used to get the value of this property. May be absent (null). + + + + + True if this property has a compile time constant associated with that serves as a default value for the property. (Who uses this and why?) + + + + + True if this property gets special treatment from the runtime. + + + + + True if this property is special in some way, as specified by the name. + + + + + The parameters forming part of this signature. + + + + + The method used to set the value of this property. May be absent (null). + + + + + The parameters and return type that makes up a method or property signature. + This interface models the metadata representation of a signature. + + + + + Calling convention of the signature. + + + + + The number of required parameters of the signature. + + + + + The parameters forming part of this signature. + + + + + Returns the list of custom modifiers, if any, associated with the return type. + + + + + Returns the list of custom modifiers, if any, associated with the ref modifier. + + + + + True if the return value is passed by reference (using a managed pointer). + + + + + The return type of the method or type of the property. + + + + + A member of a type definition, such as a field or a method. + This interface models the metadata representation of a type member. + + + + + The type definition that contains this member. + + + + + Indicates if the member is public or confined to its containing type, derived types and/or declaring assembly. + + + + + A reference to a member of a type, such as a field or a method. + This interface models the metadata representation of a type member reference. + + + + + A reference to the containing type of the referenced type member. + + + + + Represents the specialized event definition. + + + + + The event that has been specialized to obtain this event. When the containing type is an instance of type which is itself a specialized member (i.e. it is a nested + type of a generic type instance), then the unspecialized member refers to a member from the unspecialized containing type. (I.e. the unspecialized member always + corresponds to a definition that is not obtained via specialization.) + + + + + Represents reference specialized field. + + + + + A reference to the field definition that has been specialized to obtain the field definition referred to by this field reference. + When the containing type of the referenced specialized field definition is itself a specialized nested type of a generic type instance, + then the unspecialized field reference refers to the corresponding field definition from the unspecialized containing type definition. + (I.e. the unspecialized field reference always refers to a field definition that is not obtained via specialization.) + + + + + Represents reference specialized method. + + + + + A reference to the method definition that has been specialized to obtain the method definition referred to by this method reference. + When the containing type of the referenced specialized method definition is itself a specialized nested type of a generic type instance, + then the unspecialized method reference refers to the corresponding method definition from the unspecialized containing type definition. + (I.e. the unspecialized method reference always refers to a method definition that is not obtained via specialization.) + + + + + Represents the specialized property definition. + + + + + The property that has been specialized to obtain this property. When the containing type is an instance of type which is itself a specialized member (i.e. it is a nested + type of a generic type instance), then the unspecialized member refers to a member from the unspecialized containing type. (I.e. the unspecialized member always + corresponds to a definition that is not obtained via specialization.) + + + + + A reference to a method. + + + + + True if the call sites that references the method with this object supply extra arguments. + + + + + The number of generic parameters of the method. Zero if the referenced method is not generic. + + + + + True if the method has generic parameters; + + + + + The method being referred to. + + + + + Information about this types of the extra arguments supplied at the call sites that references the method with this object. + + + + + A reference to generic method instantiated with a list of type arguments. + + + + + The type arguments that were used to instantiate this.GenericMethod in order to create this method. + + + + + Returns the generic method of which this method is an instance. + + + + + Represents a global field in symbol table. + + + + + Represents a global method in symbol table. + + + + + The name of the method. + + + + + When emitting ref assemblies, some members will not be included. + + + + + A visitor base class that traverses the object model in depth first, left to right order. + + + + + Use this routine, rather than ITypeReference.Dispatch, to call the appropriate derived overload of an ITypeReference. + The former routine will call Visit(INamespaceTypeDefinition) rather than Visit(INamespaceTypeReference), etc., + in the case where a definition is used as a reference to itself. + + A reference to a type definition. Note that a type definition can serve as a reference to itself. + + + + Use this routine, rather than IUnitReference.Dispatch, to call the appropriate derived overload of an IUnitReference. + The former routine will call Visit(IAssembly) rather than Visit(IAssemblyReference), etc. + in the case where a definition is used as the reference to itself. + + A reference to a unit. Note that a unit can serve as a reference to itself. + + + + This is the maximum length of a type or member name in metadata, assuming + the name is in UTF-8 format and not (yet) null-terminated. + + + Source names may have to be shorter still to accommodate mangling. + Used for event names, field names, property names, field names, method def names, + member ref names, type def (full) names, type ref (full) names, exported type + (full) names, parameter names, manifest resource names, and unmanaged method names + (ImplMap table). + + See CLI Part II, section 22. + + + + + This is the maximum length of a path in metadata, assuming the path is in UTF-8 + format and not (yet) null-terminated. + + + Used for file names, module names, and module ref names. + + See CLI Part II, section 22. + + + + + This is the maximum length of a string in the PDB, assuming it is in UTF-8 format + and not (yet) null-terminated. + + + Used for import strings, locals, and local constants. + + + + + Returns true if writing full metadata, false if writing delta. + + + + + True if writing delta metadata in a minimal format. + + + + + NetModules and EnC deltas don't have AssemblyDef record. + We don't emit it for EnC deltas since assembly identity has to be preserved across generations (CLR/debugger get confused otherwise). + + + + + Returns metadata generation ordinal. Zero for + full metadata and non-zero for delta. + + + + + Returns unique Guid for this delta, or default(Guid) + if full metadata. + + + + + Returns Guid of previous delta, or default(Guid) + if full metadata or generation 1 delta. + + + + + Returns true and full metadata handle of the type definition + if the type definition is recognized. Otherwise returns false. + + + + + Get full metadata handle of the type definition. + + + + + The type definition corresponding to full metadata type handle. + Deltas are only required to support indexing into current generation. + + + + + The type definitions to be emitted, in row order. These + are just the type definitions from the current generation. + + + + + Get full metadata handle of the event definition. + + + + + The event definitions to be emitted, in row order. These + are just the event definitions from the current generation. + + + + + Get full metadata handle of the field definition. + + + + + The field definitions to be emitted, in row order. These + are just the field definitions from the current generation. + + + + + Returns true and handle of the method definition + if the method definition is recognized. Otherwise returns false. + The index is into the full metadata. + + + + + Get full metadata handle of the method definition. + + + + + The method definition corresponding to full metadata method handle. + Deltas are only required to support indexing into current generation. + + + + + The method definitions to be emitted, in row order. These + are just the method definitions from the current generation. + + + + + Get full metadata handle of the property definition. + + + + + The property definitions to be emitted, in row order. These + are just the property definitions from the current generation. + + + + + The full metadata handle of the parameter definition. + + + + + The parameter definitions to be emitted, in row order. These + are just the parameter definitions from the current generation. + + + + + The generic parameter definitions to be emitted, in row order. These + are just the generic parameter definitions from the current generation. + + + + + The handle of the first field of the type. + + + + + The handle of the first method of the type. + + + + + The handle of the first parameter of the method. + + + + + Return full metadata handle of the assembly reference, adding + the reference to the index for this generation if missing. + Deltas are not required to return rows from previous generations. + + + + + The assembly references to be emitted, in row order. These + are just the assembly references from the current generation. + + + + + Return full metadata handle of the module reference, adding + the reference to the index for this generation if missing. + Deltas are not required to return rows from previous generations. + + + + + The module references to be emitted, in row order. These + are just the module references from the current generation. + + + + + Return full metadata handle of the member reference, adding + the reference to the index for this generation if missing. + Deltas are not required to return rows from previous generations. + + + + + The member references to be emitted, in row order. These + are just the member references from the current generation. + + + + + Return full metadata handle of the method spec, adding + the spec to the index for this generation if missing. + Deltas are not required to return rows from previous generations. + + + + + The method specs to be emitted, in row order. These + are just the method specs from the current generation. + + + + + The greatest index given to any method definition. + + + + + Return true and full metadata handle of the type reference + if the reference is available in the current generation. + Deltas are not required to return rows from previous generations. + + + + + Return full metadata handle of the type reference, adding + the reference to the index for this generation if missing. + Deltas are not required to return rows from previous generations. + + + + + The type references to be emitted, in row order. These + are just the type references from the current generation. + + + + + Returns full metadata handle of the type spec, adding + the spec to the index for this generation if missing. + Deltas are not required to return rows from previous generations. + + + + + The type specs to be emitted, in row order. These + are just the type specs from the current generation. + + + + + Returns full metadata handle the standalone signature, adding + the signature to the index for this generation if missing. + Deltas are not required to return rows from previous generations. + + + + + The signature blob handles to be emitted, in row order. These + are just the signature indices from the current generation. + + + + + Return a visitor for traversing all references to be emitted. + + + + + Populate EventMap table. + + + + + Populate PropertyMap table. + + + + + Returns a reference to the unit that defines the given referenced type. If the referenced type is a structural type, such as a pointer or a generic type instance, + then the result is null. + + + + + The Microsoft CLR requires that {namespace} + "." + {name} fit in MAX_CLASS_NAME + (even though the name and namespace are stored separately in the Microsoft + implementation). Note that the namespace name of a nested type is always blank + (since comes from the container). + + We're trying to add the containing namespace of this type to the string heap. + Namespace names are never used on their own - this is the type that is adding the namespace name. + Used only for length checking. + + + + Test the given name to see if it fits in metadata. + + String to test (non-null). + Max length for name. (Expected to be at least 5.) + True if the name is too long. + Internal for test purposes. + + + + Serialize the method local signature to the blob. + + Standalone signature token + + + + Computes the string representing the strong name of the given assembly reference. + + + + + Import scopes are associated with binders (in C#) and thus multiple instances might be created for a single set of imports. + We consider scopes with the same parent and the same imports the same. + Internal for testing. + + + + + Write string as UTF-8 with null terminator. + + + + + Add document entries for all debug documents that do not yet have an entry. + + + This is done after serializing method debug info to ensure that we embed all requested + text even if there are no corresponding sequence points. + + + + The version of the compilation options schema to be written to the PDB. + + + + Capture the set of compilation options to allow a compilation + to be reconstructed from the pdb + + + + + Writes information about metadata references to the pdb so the same + reference can be found on sourcelink to create the compilation again + + + + + A container for static helper methods that are used for manipulating and computing iterators. + + + + + True if the given enumerable is not null and contains at least one element. + + + + + True if the given enumerable is null or contains no elements + + + + + Returns the number of elements in the given enumerable. A null enumerable is allowed and results in 0. + + + + + A declarative specification of a security action applied to a set of permissions. Used by the CLR loader to enforce security restrictions. + Each security attribute represents a serialized permission or permission set for a specified security action. + The union of the security attributes with identical security action, define the permission set to which the security action applies. + + + + + Information about how values of managed types should be marshalled to and from unmanaged types. + + + + + or a string (usually a fully-qualified type name of a type implementing the custom marshaller, but Dev11 allows any string). + + + + + An argument string (cookie) passed to the custom marshaller at run time. + + + + + The unmanaged element type of the unmanaged array. + -1 if it should be omitted from the marshal blob. + + + + + Specifies the index of the parameter that contains the value of the Interface Identifier (IID) of the marshalled object. + -1 if it should be omitted from the marshal blob. + + + + + The unmanaged type to which the managed type will be marshalled. This can be UnmanagedType.CustomMarshaler, in which case the unmanaged type + is decided at runtime. + + + + + The number of elements in the fixed size portion of the unmanaged array. + -1 if it should be omitted from the marshal blob. + + + + + The zero based index of the parameter in the unmanaged method that contains the number of elements in the variable portion of unmanaged array. + If -1, the variable portion is of size zero, or the caller conveys the size of the variable portion of the array to the unmanaged method in some other way. + + + + + The type to which the variant values of all elements of the safe array must belong. See also SafeArrayElementUserDefinedSubtype. + (The element type of a safe array is VARIANT. The "sub type" specifies the value of all of the tag fields (vt) of the element values. ) + -1 if it should be omitted from the marshal blob. + + + + + A reference to the user defined type to which the variant values of all elements of the safe array must belong. + (The element type of a safe array is VARIANT. The tag fields will all be either VT_DISPATCH or VT_UNKNOWN or VT_RECORD. + The "user defined sub type" specifies the type of value the ppdispVal/ppunkVal/pvRecord fields of the element values may point to.) + + + + + Implemented by any entity that has a name. + + + + + The name of the entity. + + + + + The name of the entity depends on other metadata (tokens, signatures) originated from + PeWriter. + + + + + Method must be called before calling INamedEntity.Name. + + + + + Implemented by an entity that is always a member of a particular parameter list, such as an IParameterDefinition. + Provides a way to determine the position where the entity appears in the parameter list. + + + + + The position in the parameter list where this instance can be found. + + + + + Information that describes how a method from the underlying Platform is to be invoked. + + + + + Module providing the method/field. + + + + + Name of the method providing the implementation. + + + + + Flags that determine marshalling behavior. + + + + + A resource file formatted according to Win32 API conventions and typically obtained from a Portable Executable (PE) file. + See the Win32 UpdateResource method for more details. + + + + + A string that identifies what type of resource this is. Only valid if this.TypeId < 0. + + + + + An integer tag that identifies what type of resource this is. If the value is less than 0, this.TypeName should be used instead. + + + + + The name of the resource. Only valid if this.Id < 0. + + + + + An integer tag that identifies this resource. If the value is less than 0, this.Name should be used instead. + + + + + The language for which this resource is appropriate. + + + + + The code page for which this resource is appropriate. + + + + + The data of the resource. + + + + + Special type <Module> + + + + + Allows for the comparison of two instances or two + instances based on underlying symbols, if any. + + + + + Strip off *, &, and []. + + + + + Qualified name of namespace. + e.g. "A.B.C" + + + + + Visitor to force translation of all symbols that will be referred to + in metadata. Allows us to build the set of types that must be embedded + as local types (for NoPia). + + + + + This interface models the metadata representation of an array type reference. + + + + + The type of the elements of this array. + + + + + This type of array is a single dimensional array with zero lower bound for index values. + + + + + A possibly empty list of lower bounds for dimension indices. When not explicitly specified, a lower bound defaults to zero. + The first lower bound in the list corresponds to the first dimension. Dimensions cannot be skipped. + + + + + The number of array dimensions. + + + + + A possible empty list of upper bounds for dimension indices. + The first upper bound in the list corresponds to the first dimension. Dimensions cannot be skipped. + An unspecified upper bound means that instances of this type can have an arbitrary upper bound for that dimension. + + + + + Modifies the set of allowed values for a type, or the semantics of operations allowed on those values. + Custom modifiers are not associated directly with types, but rather with typed storage locations for values. + + + + + If true, a language may use the modified storage location without being aware of the meaning of the modification. + + + + + A type used as a tag that indicates which type of modification applies to the storage location. + + + + + Information that describes a method or property parameter, but does not include all the information in a IParameterDefinition. + + + + + The list of custom modifiers, if any, associated with the parameter type. + + + + + The list of custom modifiers, if any, associated with the ref modifier. + + + + + True if the parameter is passed by reference (using a managed pointer). + + + + + The type of argument value that corresponds to this parameter. + + + + + The definition of a type parameter of a generic type or method. + + + + + A list of classes or interfaces. All type arguments matching this parameter must be derived from all of the classes and implement all of the interfaces. + + + + + True if all type arguments matching this parameter are constrained to be reference types. + + + + + True if all type arguments matching this parameter are constrained to be value types. + + + + + True if all type arguments matching this parameter are constrained to be value types or concrete classes with visible default constructors. + + + + + Indicates if the generic type or method with this type parameter is co-, contra-, or non variant with respect to this type parameter. + + + + + A reference to the definition of a type parameter of a generic type or method. + + + + + The definition of a type parameter of a generic method. + + + + + The generic method that defines this type parameter. + + + + + A reference to a type parameter of a generic method. + + + + + A reference to the generic method that defines the referenced type parameter. + + + + + A generic type instantiated with a list of type arguments + + + + + The type arguments that were used to instantiate this.GenericType in order to create this type. + + + + + Returns the generic type of which this type is an instance. + Equivalent to Symbol.OriginalDefinition + + + + + The definition of a type parameter of a generic type. + + + + + The generic type that defines this type parameter. + + + + + A reference to a type parameter of a generic type. + + + + + A reference to the generic type that defines the referenced type parameter. + + + + + A reference to a named type, such as an INamespaceTypeReference or an INestedTypeReference. + + + + + The number of generic parameters. Zero if the type is not generic. + + + + + If true, the persisted type name is mangled by appending "`n" where n is the number of type parameters, if the number of type parameters is greater than 0. + + + + Indicates that the type is scoped to the file it is declared in. Used as a prefix for the metadata name. + + + + A named type definition, such as an INamespaceTypeDefinition or an INestedTypeDefinition. + + + + + A type definition that is a member of a namespace definition. + + + + + True if the type can be accessed from other assemblies. + + + + + Represents a namespace. + + + + + Containing namespace or null if this namespace is global. + + + + + Returns underlying internal symbol object, if any. + + + + + A reference to a type definition that is a member of a namespace definition. + + + + + A reference to the unit that defines the referenced type. + + + + + Fully qualified name of the containing namespace. + + + + + A type definition that is a member of another type definition. + + + + + A type definition that is a member of another type definition. + + + + + A reference to a type definition that is a specialized nested type. + + + + + A reference to the nested type that has been specialized to obtain this nested type reference. When the containing type is an instance of type which is itself a specialized member (i.e. it is a nested + type of a generic type instance), then the unspecialized member refers to a member from the unspecialized containing type. (I.e. the unspecialized member always + corresponds to a definition that is not obtained via specialization.) + + + + + Models an explicit implementation or override of a base class virtual method or an explicit implementation of an interface method. + + + + + The type that is explicitly implementing or overriding the base class virtual method or explicitly implementing an interface method. + + + + + A reference to the method that provides the implementation. + + + + + The type that is explicitly implementing or overriding the base class virtual method or explicitly implementing an interface method. + + + + + A type reference that has custom modifiers associated with it. For example a reference to the target type of a managed pointer to a constant. + + + + + Returns the list of custom modifiers associated with the type reference. + + + + + An unmodified type reference. + + + + + This interface models the metadata representation of a pointer to a location in unmanaged memory. + + + + + The type of value stored at the target memory location. + + + + + This interface models the metadata representation of a pointer to a function in unmanaged memory. + + + + + The signature of the function located at the target memory address. + + + + + A type ref with attributes attached directly to the type reference + itself. Unlike a + will never provide attributes + for the "pointed at" declaration, and all attributes will be emitted + directly on the type ref, rather than the declaration. + + + + + The type reference. + + + + + The attributes on the type reference itself. + + + + + This interface models the metadata representation of a type. + + + + + The byte alignment that values of the given type ought to have. Must be a power of 2. If zero, the alignment is decided at runtime. + + + + + Returns null for interfaces and System.Object. + + + + + Zero or more events defined by this type. + + + + + Zero or more implementation overrides provided by the class. + + + + + Zero or more fields defined by this type. + + + + + Zero or more parameters that can be used as type annotations. + + + + + The number of generic parameters. Zero if the type is not generic. + + + + + True if this type has a non empty collection of SecurityAttributes or the System.Security.SuppressUnmanagedCodeSecurityAttribute. + + + + + Zero or more interfaces implemented by this type. + + + + + True if the type may not be instantiated. + + + + + Is type initialized anytime before first access to static field + + + + + Is this imported from COM type library + + + + + True if this type is parameterized (this.GenericParameters is a non empty collection). + + + + + True if the type is an interface. + + + + + True if the type is a delegate. + + + + + True if this type gets special treatment from the runtime. + + + + + True if this type is serializable. + + + + + True if the type has special name. + + + + + True if the type is a Windows runtime type. + + + A type can me marked as a Windows runtime type in source by applying the WindowsRuntimeImportAttribute. + WindowsRuntimeImportAttribute is a pseudo custom attribute defined as an internal class in System.Runtime.InteropServices.WindowsRuntime namespace. + This is needed to mark Windows runtime types which are redefined in mscorlib.dll and System.Runtime.WindowsRuntime.dll. + These two assemblies are special as they implement the CLR's support for WinRT. + + + + + True if the type may not be subtyped. + + + + + Layout of the type. + + + + + Zero or more methods defined by this type. + + + + + Zero or more nested types defined by this type. + + + + + Zero or more properties defined by this type. + + + + + Declarative security actions for this type. Will be empty if this.HasSecurity is false. + + + + + Size of an object of this type. In bytes. If zero, the size is unspecified and will be determined at runtime. + + + + + Default marshalling of the Strings in this class. + + + + + A reference to a type. + + + + + True if the type is an enumeration (it extends System.Enum and is sealed). Corresponds to C# enum. + + + + + True if the type is a value type. + Value types are sealed and extend System.ValueType or System.Enum. + A type parameter for which MustBeValueType (the struct constraint in C#) is true also returns true for this property. + + + + + The type definition being referred to. + + + + + Unless the value of TypeCode is PrimitiveTypeCode.NotPrimitive, the type corresponds to a "primitive" CLR type (such as System.Int32) and + the type code identifies which of the primitive types it corresponds to. + + + + + TypeDefs defined in modules linked to the assembly being emitted are listed in the ExportedTypes table. + + + + + A enumeration of all of the value types that are built into the Runtime (and thus have specialized IL instructions that manipulate them). + + + + + A single bit. + + + + + An unsigned 16 bit integer representing a Unicode UTF16 code point. + + + + + A signed 8 bit integer. + + + + + A 32 bit IEEE floating point number. + + + + + A 64 bit IEEE floating point number. + + + + + A signed 16 bit integer. + + + + + A signed 32 bit integer. + + + + + A signed 64 bit integer. + + + + + A signed 32 bit integer or 64 bit integer, depending on the native word size of the underlying processor. + + + + + A pointer to fixed or unmanaged memory. + + + + + A reference to managed memory. + + + + + A string. + + + + + An unsigned 8 bit integer. + + + + + An unsigned 16 bit integer. + + + + + An unsigned 32 bit integer. + + + + + An unsigned 64 bit integer. + + + + + An unsigned 32 bit integer or 64 bit integer, depending on the native word size of the underlying processor. + + + + + A type that denotes the absence of a value. + + + + + Not a primitive type. + + + + + A pointer to a function in fixed or managed memory. + + + + + Type is a dummy type. + + + + + Enumerates the different kinds of levels of visibility a type member can have. + + + + + The member is visible only within its own type. + + + + + The member is visible only within the intersection of its family (its own type and any subtypes) and assembly. + + + + + The member is visible only within its own assembly. + + + + + The member is visible only within its own type and any subtypes. + + + + + The member is visible only within the union of its family and assembly. + + + + + The member is visible everywhere its declaring type is visible. + + + + + Enumerates the different kinds of variance a generic method or generic type parameter may have. + + + + + Two type or method instances are compatible only if they have exactly the same type argument for this parameter. + + + + + A type or method instance will match another instance if it has a type for this parameter that is the same or a subtype of the type the + other instance has for this parameter. + + + + + A type or method instance will match another instance if it has a type for this parameter that is the same or a supertype of the type the + other instance has for this parameter. + + + + + A reference to a .NET assembly. + + + + + A reference to a .NET module. + + + + + The Assembly that contains this module. May be null if the module is not part of an assembly. + + + + + A unit of metadata stored as a single artifact and potentially produced and revised independently from other units. + Examples of units include .NET assemblies and modules, as well C++ object files and compiled headers. + + + + + A reference to a instance of . + + + + + Represents a single using directive (Imports clause). + + + + + Given a path to an assembly, identifies files in the same directory + that could satisfy the assembly's dependencies. May throw. + + + Dependencies are identified by simply checking the name of an assembly + reference against a file name; if they match the file is considered a + dependency. Other factors, such as version, culture, public key, etc., + are not considered, and so the returned collection may include items that + cannot in fact satisfy the original assembly's dependencies. + + If the file at does not exist or cannot be accessed. + If the file is not an assembly or is somehow corrupted. + + + + Given a path to an assembly, returns its MVID (Module Version ID). + May throw. + + If the file at does not exist or cannot be accessed. + If the file is not an assembly or is somehow corrupted. + + + + Given a path to an assembly, finds the paths to all of its satellite + assemblies. + + If the file at does not exist or cannot be accessed. + If the file is not an assembly or is somehow corrupted. + + + + Given a path to an assembly and a set of paths to possible dependencies, + identifies which of the assembly's references are missing. May throw. + + If the files does not exist or cannot be accessed. + If one of the files is not an assembly or is somehow corrupted. + + + + Given a path to an assembly, returns the for the assembly. + May throw. + + If the file at does not exist or cannot be accessed. + If the file is not an assembly or is somehow corrupted. + + + + Full case-insensitive path. + + + + + Last write time (UTC). + + + + + Constructor. + + Full path. + Last write time (UTC). + + + + + + + Resolves relative path and returns absolute path. + The method depends only on values of its parameters and their implementation (for fileExists). + It doesn't itself depend on the state of the current process (namely on the current drive directories) or + the state of file system. + + + Path to resolve. + + + Base file path to resolve CWD-relative paths against. Null if not available. + + + Base directory to resolve CWD-relative paths against if isn't specified. + Must be absolute path. + Null if not available. + + + Sequence of paths used to search for unqualified relative paths. + + + Method that tests existence of a file. + + + The resolved path or null if the path can't be resolved or does not exist. + + + + + Normalizes an absolute path. + + Path to normalize. + + Normalized path. + + + + Used to create a file given a path specified by the user. + paramName - Provided by the Public surface APIs to have a clearer message. Internal API just rethrow the exception + + + + + + + + + + + Abstraction over the file system that is useful for test hooks + + + + + Open a file and ensure common exception types are wrapped to . + + + + + Null or empty. + + + + + "file" + + + + + ".\file" + + + + + "..\file" + + + + + "\dir\file" + + + + + "C:dir\file" + + + + + "C:\file" or "\\machine" (UNC). + + + + + True if the character is the platform directory separator character or the alternate directory separator. + + + + + True if the character is any recognized directory separator character. + + + + + Removes trailing directory separator characters + + + This will trim the root directory separator: + "C:\" maps to "C:", and "/" maps to "" + + + + + Ensures a trailing directory separator character + + + + + Get directory name from path. + + + Unlike it doesn't check for invalid path characters + + Prefix of path that represents a directory + + + + Gets the root part of the path. + + + + + Gets the specific kind of relative or absolute path. + + + + + True if the path is an absolute path (rooted to drive or network share) + + + + + Returns true if given path is absolute and starts with a drive specification ("C:\"). + + + + + Combines an absolute path with a relative. + + Absolute root path. + Relative path. + + An absolute combined path, or null if is + absolute (e.g. "C:\abc", "\\machine\share\abc"), + relative to the current root (e.g. "\abc"), + or relative to a drive directory (e.g. "C:abc\def"). + + + + + + Combine two paths, the first of which may be absolute. + + First path: absolute, relative, or null. + Second path: relative and non-null. + null, if is null; a combined path, otherwise. + + + + + Combines paths with the same semantics as + but does not throw on null paths or paths with invalid characters. + + First path: absolute, relative, or null. + Second path: absolute, relative, or null. + + The combined paths. If contains an absolute path, returns . + + + Relative and absolute paths treated the same as . + + + + + Determines whether an assembly reference is considered an assembly file path or an assembly name. + used, for example, on values of /r and #r. + + + + + Determines if "path" contains 'component' within itself. + i.e. asking if the path "c:\goo\bar\baz" has component "bar" would return 'true'. + On the other hand, if you had "c:\goo\bar1\baz" then it would not have "bar" as a + component. + + A path contains a component if any file name or directory name in the path + matches 'component'. As such, if you had something like "\\goo" then that would + not have "goo" as a component. That's because here "goo" is the server name portion + of the UNC path, and not an actual directory or file name. + + + + + Gets a path relative to a directory. + + + + + True if the child path is a child of the parent path. + + + + + True if the two paths are the same. + + + + + True if the two paths are the same. (but only up to the specified length) + + + + + Unfortunately, we cannot depend on Path.GetInvalidPathChars() or Path.GetInvalidFileNameChars() + From MSDN: The array returned from this method is not guaranteed to contain the complete set of characters + that are invalid in file and directory names. The full set of invalid characters can vary by file system. + https://msdn.microsoft.com/en-us/library/system.io.path.getinvalidfilenamechars.aspx + + Additionally, Path.GetInvalidPathChars() doesn't include "?" or "*" which are invalid characters, + and Path.GetInvalidFileNameChars() includes ":" and "\" which are valid characters. + + The more accurate way is to let the framework parse the path and throw on any errors. + + + + + If the current environment uses the '\' directory separator, replaces all uses of '\' + in the given string with '/'. Otherwise, returns the string. + + + This method is equivalent to Microsoft.CodeAnalysis.BuildTasks.GenerateMSBuildEditorConfig.NormalizeWithForwardSlash + Both methods should be kept in sync. + + + + + Takes an absolute path and attempts to expand any '..' or '.' into their equivalent representation. + + An equivalent path that does not contain any '..' or '.' path parts, or the original path. + + This method handles unix and windows drive rooted absolute paths only (i.e /a/b or x:\a\b). Passing any other kind of path + including relative, drive relative, unc, or windows device paths will simply return the original input. + + + + + Search a sorted integer array for the target value in O(log N) time. + + The array of integers which must be sorted in ascending order. + The target value. + An index in the array pointing to the position where should be + inserted in order to maintain the sorted order. All values to the right of this position will be + strictly greater than . Note that this may return a position off the end + of the array if all elements are less than or equal to . + + + + A write-only memory stream backed by a . + + + + + The chunk size to be used by the underlying BlobBuilder. + + + The current single use case for this type is embedded sources in PDBs. + + 32 KB is: + + * Large enough to handle 99.6% all VB and C# files in Roslyn and CoreFX + without allocating additional chunks. + + * Small enough to avoid the large object heap. + + * Large enough to handle the files in the 0.4% case without allocating tons + of small chunks. Very large source files are often generated in build + (e.g. Syntax.xml.Generated.vb is 390KB compressed!) and those are actually + attractive candidates for embedding, so we don't want to discount the large + case too heavily.) + + * We pool the outer BlobBuildingStream but only retain the first allocated chunk. + + + + + Provide structural equality for ReadOnlyMemory{char} instances. + + + + + Split a command line by the same rules as Main would get the commands except the original + state of backslashes and quotes are preserved. For example in normal Windows command line + parsing the following command lines would produce equivalent Main arguments: + + - /r:a,b + - /r:"a,b" + + This method will differ as the latter will have the quotes preserved. The only case where + quotes are removed is when the entire argument is surrounded by quotes without any inner + quotes. + + + Rules for command line parsing, according to MSDN: + + Arguments are delimited by white space, which is either a space or a tab. + + A string surrounded by double quotation marks ("string") is interpreted + as a single argument, regardless of white space contained within. + A quoted string can be embedded in an argument. + + A double quotation mark preceded by a backslash (\") is interpreted as a + literal double quotation mark character ("). + + Backslashes are interpreted literally, unless they immediately precede a + double quotation mark. + + If an even number of backslashes is followed by a double quotation mark, + one backslash is placed in the argv array for every pair of backslashes, + and the double quotation mark is interpreted as a string delimiter. + + If an odd number of backslashes is followed by a double quotation mark, + one backslash is placed in the argv array for every pair of backslashes, + and the double quotation mark is "escaped" by the remaining backslash, + causing a literal double quotation mark (") to be placed in argv. + + + + + Parse the value provided to an MSBuild Feature option into a list of entries. This will + leave name=value in their raw form. + + + + + NOTE!!! adding duplicates will result in exceptions. + Being concurrent only allows accessing the dictionary without taking locks. + Duplicate keys are still not allowed in the hashtable. + If unsure about adding unique items use APIs such as TryAdd, GetOrAdd, etc... + + + + + A concurrent, simplified HashSet. + + + + + The default concurrency level is 2. That means the collection can cope with up to two + threads making simultaneous modifications without blocking. + Note ConcurrentDictionary's default concurrency level is dynamic, scaling according to + the number of processors. + + + + + Taken from ConcurrentDictionary.DEFAULT_CAPACITY + + + + + The backing dictionary. The values are never used; just the keys. + + + + + Construct a concurrent set with the default concurrency level. + + + + + Construct a concurrent set using the specified equality comparer. + + The equality comparer for values in the set. + + + + Obtain the number of elements in the set. + + The number of elements in the set. + + + + Determine whether the set is empty. + true if the set is empty; otherwise, false. + + + + Determine whether the given value is in the set. + + The value to test. + true if the set contains the specified value; otherwise, false. + + + + Attempts to add a value to the set. + + The value to add. + true if the value was added to the set. If the value already exists, this method returns false. + + + + Attempts to remove a value from the set. + + The value to remove. + true if the value was removed successfully; otherwise false. + + + + Clear the set + + + + + Obtain an enumerator that iterates through the elements in the set. + + An enumerator for the set. + + + + A custom awaiter that supports for + . + + + + + a simple Lisp-like immutable list. Good to use when lists are always accessed from the head. + + + + + + + + + + + Generally is a sufficient method for enforcing DEBUG + only invariants in our code. When it triggers that provides a nice stack trace for + investigation. Generally that is enough. + + There are cases for which a stack is not enough and we need a full heap dump to + investigate the failure. This method takes care of that. The behavior is that when running + in our CI environment if the assert triggers we will rudely crash the process and + produce a heap dump for investigation. + + + + + Names of well-known XML attributes and elements. + + + + + Very cheap trivial comparer that never matches the keys, + should only be used in empty dictionaries. + + + + + Get maximum char count needed to decode the entire stream. + + Stream is so big that max char count can't fit in . + + + + This method is necessary to avoid an ambiguity between and . + + + + + This method is necessary to avoid an ambiguity between and . + + + + + Maps an immutable array through a function that returns ValueTask, returning the new ImmutableArray. + + + + + Maps an immutable array through a function that returns ValueTask, returning the new ImmutableArray. + + + + + Returns the only element of specified sequence if it has exactly one, and default(TSource) otherwise. + Unlike doesn't throw if there is more than one element in the sequence. + + + + + Cached versions of commonly used delegates. + + + + + + Cached versions of commonly used delegates. + + + + + + Convert a boxed primitive (generally of the backing type of an enum) into a ulong. + + + + + + + Creates an with information about an unexpected value. + + The unexpected value. + The , which should be thrown by the caller. + + + + Determine if an exception was an , and that the provided token caused the cancellation. + + The exception to test. + Checked to see if the provided token was cancelled. + if the exception was an and the token was canceled. + + + + Implements a few file name utilities that are needed by the compiler. + In general the compiler is not supposed to understand the format of the paths. + In rare cases it needs to check if a string is a valid file name or change the extension + (embedded resources, netmodules, output name). + The APIs are intentionally limited to cover just these rare cases. Do not add more APIs. + + + + + Returns true if the string represents an unqualified file name. + The name may contain any characters but directory and volume separators. + + Path. + + True if is a simple file name, false if it is null or includes a directory specification. + + + + + Returns the offset in where the dot that starts an extension is, or -1 if the path doesn't have an extension. + + + Returns 0 for path ".goo". + Returns -1 for path "goo.". + + + + + Returns an extension of the specified path string. + + + The same functionality as but doesn't throw an exception + if there are invalid characters in the path. + + + + + Removes extension from path. + + + Returns "goo" for path "goo.". + Returns "goo.." for path "goo...". + + + + + Returns path with the extension changed to . + + + Equivalent of + + If is null, returns null. + If path does not end with an extension, the new extension is appended to the path. + If extension is null, equivalent to . + + + + + Returns the position in given path where the file name starts. + + -1 if path is null. + + + + Get file name from path. + + Unlike doesn't check for invalid path characters. + + + + This is how VB Anonymous Types combine hash values for fields. + + + + + This is how VB Anonymous Types combine hash values for fields. + PERF: Do not use with enum types because that involves multiple + unnecessary boxing operations. Unfortunately, we can't constrain + T to "non-enum", so we'll use a more restrictive constraint. + + + + + The offset bias value used in the FNV-1a algorithm + See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + + + + + The generative factor used in the FNV-1a algorithm + See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + + + + + Compute the FNV-1a hash of a sequence of bytes + See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + + The sequence of bytes + The FNV-1a hash of + + + + Compute the FNV-1a hash of a sequence of bytes and determines if the byte + sequence is valid ASCII and hence the hash code matches a char sequence + encoding the same text. + See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + + The sequence of bytes that are likely to be ASCII text. + True if the sequence contains only characters in the ASCII range. + The FNV-1a hash of + + + + Compute the FNV-1a hash of a sequence of bytes + See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + + The sequence of bytes + The FNV-1a hash of + + + + Compute the hashcode of a sub-string using FNV-1a + See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + Note: FNV-1a was developed and tuned for 8-bit sequences. We're using it here + for 16-bit Unicode chars on the understanding that the majority of chars will + fit into 8-bits and, therefore, the algorithm will retain its desirable traits + for generating hash codes. + + + + + Compute the hashcode of a sub-string using FNV-1a + See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + Note: FNV-1a was developed and tuned for 8-bit sequences. We're using it here + for 16-bit Unicode chars on the understanding that the majority of chars will + fit into 8-bits and, therefore, the algorithm will retain its desirable traits + for generating hash codes. + + The input string + The start index of the first character to hash + The number of characters, beginning with to hash + The FNV-1a hash code of the substring beginning at and ending after characters. + + + + Compute the hashcode of a sub-string using FNV-1a + See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + + The input string + The start index of the first character to hash + The FNV-1a hash code of the substring beginning at and ending at the end of the string. + + + + Compute the hashcode of a string using FNV-1a + See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + + The input string + The FNV-1a hash code of + + + + Compute the hashcode of a string using FNV-1a + See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + + The input string + The FNV-1a hash code of + + + + Compute the hashcode of a sub string using FNV-1a + See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + + The input string as a char array + The start index of the first character to hash + The number of characters, beginning with to hash + The FNV-1a hash code of the substring beginning at and ending after characters. + + + + Compute the hashcode of a single character using the FNV-1a algorithm + See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + Note: In general, this isn't any more useful than "char.GetHashCode". However, + it may be needed if you need to generate the same hash code as a string or + substring with just a single character. + + The character to hash + The FNV-1a hash code of the character. + + + + Combine a string with an existing FNV-1a hash code + See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + + The accumulated hash code + The string to combine + The result of combining with using the FNV-1a algorithm + + + + Combine a char with an existing FNV-1a hash code + See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + + The accumulated hash code + The new character to combine + The result of combining with using the FNV-1a algorithm + + + + Initialize the value referenced by in a thread-safe manner. + The value is changed to only if the current value is null. + + Type of value. + Reference to the target location. + The value to use if the target is currently null. + The new value referenced by . Note that this is + nearly always more useful than the usual return from + because it saves another read to . + + + + Initialize the value referenced by in a thread-safe manner. + The value is changed to only if the current value + is . + + Type of value. + Reference to the target location. + The value to use if the target is currently uninitialized. + The uninitialized value. + The new value referenced by . Note that this is + nearly always more useful than the usual return from + because it saves another read to . + + + + Initialize the immutable array referenced by in a thread-safe manner. + + Elemental type of the array. + Reference to the target location. + The value to use if the target is currently uninitialized (default). + The new value referenced by . Note that this is + nearly always more useful than the usual return from + because it saves another read to . + + + + A simple, forward-only JSON writer to avoid adding dependencies to the compiler. + Used to generate /errorlogger output. + + Does not guarantee well-formed JSON if misused. It is the caller's responsibility + to balance array/object start/end, to only write key-value pairs to objects and + elements to arrays, etc. + + Takes ownership of the given at construction and handles its disposal. + + + + + Catches exceptions thrown during disposal of the underlying stream and + writes them to the given . Check + after disposal to see if any + exceptions were thrown during disposal. + + + + + Underlying stream + + + + + True if and only if an exception was thrown during a call to + + + + + Represents a single item or many items (including none). + + + Used when a collection usually contains a single item but sometimes might contain multiple. + + + + + This class provides simple properties for determining whether the current platform is Windows or Unix-based. + We intentionally do not use System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(...) because + it incorrectly reports 'true' for 'Windows' in desktop builds running on Unix-based platforms via Mono. + + + + + Are we running on .NET 5 or later using the Mono runtime? + Will also return true when running on Mono itself; if necessary + we can use IsRunningOnMono to distinguish. + + + + + Compares objects based upon their reference identity. + + + + + Find a instance by first probing the contract name and then the name as it + would exist in mscorlib. This helps satisfy both the CoreCLR and Desktop scenarios. + + + + + + + + + + + + + + + + + + + + + + + + + + A set that returns the inserted values in insertion order. + The mutation operations are not thread-safe. + + + + + Attempts to read all of the requested bytes from the stream into the buffer + + + The number of bytes read. Less than will + only be returned if the end of stream is reached before all bytes can be read. + + + Unlike it is not guaranteed that + the stream position or the output buffer will be unchanged if an exception is + returned. + + + + + Reads all bytes from the current position of the given stream to its end. + + + + + Checks if the given name is a sequence of valid CLR names separated by a dot. + + + + + Remove one set of leading and trailing double quote characters, if both are present. + + + + + Compares string based upon their ordinal equality. + We use this comparer for string identifiers because it does exactly what we need and nothing more + The StringComparer.Ordinal as implemented by StringComparer is more complex to support + case sensitive and insensitive compares depending on flags. + It also defers to the default string hash function that might not be the best for our scenarios. + + + + + This is basically a lossy cache of strings that is searchable by + strings, string sub ranges, character array ranges or string-builder. + + + + + Merges the new change ranges into the old change ranges, adjusting the new ranges to be with respect to the original text + (with neither old or new changes applied) instead of with respect to the original text after "old changes" are applied. + + This may require splitting, concatenation, etc. of individual change ranges. + + + Both `oldChanges` and `newChanges` must contain non-overlapping spans in ascending order. + + + + + Represents a new change being processed by . + Such a new change must be adjusted before being added to the result list. + + + A value of this type may represent the intermediate state of merging of an old change into an unadjusted new change, + resulting in a temporary unadjusted new change whose is negative (not valid) until it is adjusted. + This tends to happen when we need to merge an old change deletion into a new change near the beginning of the text. (see TextChangeTests.Fuzz_4) + + + + + Defines a set of helper methods to classify Unicode characters. + + + + + Returns true if the Unicode character can be a part of an identifier. + + The Unicode character. + + + + Check that the name is a valid Unicode identifier. + + + + + Returns true if the Unicode character is a formatting character (Unicode class Cf). + + The Unicode character. + + + + Returns true if the Unicode character is a formatting character (Unicode class Cf). + + The Unicode character. + + + + Implements and static members that are only available in .NET 5. + + + + + Explicitly indicates result is void + + + + + Represents an ordered sequence of weak references. + + + + + Copies all live references from to . + Assumes that all references prior are alive. + + + + + Returns the number of weak references in this list. + Note that some of them might not point to live objects anymore. + + + + + Implements ConfigureAwait(bool) for . The resulting behavior in asynchronous code + is the same as one would expect for . + + The awaitable provided by . + + An object used to await this yield. + + + + Objects that implement this interface know how to write their contents to an , + so they can be reconstructed later by an . + + + + + Returns 'true' when the same instance could be used more than once. + Instances that return 'false' should not be tracked for the purpose + of de-duplication while serializing/deserializing. + + + + + is a registry that maps between arbitrary s and + the 'reader' function used to deserialize serialized instances of those types. Registration + must happen ahead of time using the method. + + + + + Lock for all data in this type. + + + + + Last created snapshot of our data. We hand this out instead of exposing our raw + data so that and do not need to + take any locks while processing. + + + + + Map from a to the corresponding index in and + . will write out the index into + the stream, and will use that index to get the reader used + for deserialization. + + + + + Gets an immutable copy of the state of this binder. This copy does not need to be + locked while it is used. + + + + + An that deserializes objects from a byte stream. + + + + + We start the version at something reasonably random. That way an older file, with + some random start-bytes, has little chance of matching our version. When incrementing + this version, just change VersionByte2. + + + + + Map of reference id's to deserialized objects. + + + + + Copy of the global binder data that maps from Types to the appropriate reading-function + for that type. Types register functions directly with , but + that means that is both static and locked. This gives us + local copy we can work with without needing to worry about anyone else mutating. + + + + + Creates a new instance of a . + + The stream to read objects from. + True to leave the open after the is disposed. + + + + + Attempts to create a from the provided . + If the does not start with a valid header, then will + be returned. + + + + + Creates an from the provided . + Unlike , it requires the version + of the data in the stream to exactly match the current format version. + Should only be used to read data written by the same version of Roslyn. + + + + + A reference-id to object map, that can share base data efficiently. + + + + + An that serializes objects to a byte stream. + + + + + Map of serialized object's reference ids. The object-reference-map uses reference equality + for performance. While the string-reference-map uses value-equality for greater cache hits + and reuse. + + These are not readonly because they're structs and we mutate them. + + When we write out objects/strings we give each successive, unique, item a monotonically + increasing integral ID starting at 0. I.e. the first object gets ID-0, the next gets + ID-1 and so on and so forth. We do *not* include these IDs with the object when it is + written out. We only include the ID if we hit the object *again* while writing. + + During reading, the reader knows to give each object it reads the same monotonically + increasing integral value. i.e. the first object it reads is put into an array at position + 0, the next at position 1, and so on. Then, when the reader reads in an object-reference + it can just retrieved it directly from that array. + + In other words, writing and reading take advantage of the fact that they know they will + write and read objects in the exact same order. So they only need the IDs for references + and not the objects themselves because the ID is inferred from the order the object is + written or read in. + + + + + Copy of the global binder data that maps from Types to the appropriate reading-function + for that type. Types register functions directly with , but + that means that is both static and locked. This gives us + local copy we can work with without needing to worry about anyone else mutating. + + + + + Creates a new instance of a . + + The stream to write to. + True to leave the open after the is disposed. + Cancellation token. + + + + Used so we can easily grab the low/high 64bits of a guid for serialization. + + + + + Write an array of bytes. The array data is provided as a + ReadOnlySpan<>, and deserialized to a byte array. + + The array data. + + + + An object reference to reference-id map, that can share base data efficiently. + + + + + Indexed by EncodingKind. + + + + + byte marker mask for encoding compressed uint + + + + + byte marker bits for uint encoded in 1 byte. + + + + + byte marker bits for uint encoded in 2 bytes. + + + + + byte marker bits for uint encoded in 4 bytes. + + + + + The null value + + + + + A type + + + + + An object with member values encoded as variants + + + + + An object reference with the id encoded as 1 byte. + + + + + An object reference with the id encode as 2 bytes. + + + + + An object reference with the id encoded as 4 bytes. + + + + + A string encoded as UTF-8 (using BinaryWriter.Write(string)) + + + + + A string encoded as UTF16 (as array of UInt16 values) + + + + + A reference to a string with the id encoded as 1 byte. + + + + + A reference to a string with the id encoded as 2 bytes. + + + + + A reference to a string with the id encoded as 4 bytes. + + + + + The boolean value true. + + + + + The boolean value char. + + + + + A character value encoded as 2 bytes. + + + + + An Int8 value encoded as 1 byte. + + + + + An Int16 value encoded as 2 bytes. + + + + + An Int32 value encoded as 4 bytes. + + + + + An Int32 value encoded as 1 byte. + + + + + An Int32 value encoded as 2 bytes. + + + + + The Int32 value 0 + + + + + The Int32 value 1 + + + + + The Int32 value 2 + + + + + The Int32 value 3 + + + + + The Int32 value 4 + + + + + The Int32 value 5 + + + + + The Int32 value 6 + + + + + The Int32 value 7 + + + + + The Int32 value 8 + + + + + The Int32 value 9 + + + + + The Int32 value 10 + + + + + An Int64 value encoded as 8 bytes + + + + + A UInt8 value encoded as 1 byte. + + + + + A UIn16 value encoded as 2 bytes. + + + + + A UInt32 value encoded as 4 bytes. + + + + + A UInt32 value encoded as 1 byte. + + + + + A UInt32 value encoded as 2 bytes. + + + + + The UInt32 value 0 + + + + + The UInt32 value 1 + + + + + The UInt32 value 2 + + + + + The UInt32 value 3 + + + + + The UInt32 value 4 + + + + + The UInt32 value 5 + + + + + The UInt32 value 6 + + + + + The UInt32 value 7 + + + + + The UInt32 value 8 + + + + + The UInt32 value 9 + + + + + The UInt32 value 10 + + + + + A UInt64 value encoded as 8 bytes. + + + + + A float value encoded as 4 bytes. + + + + + A double value encoded as 8 bytes. + + + + + A decimal value encoded as 12 bytes. + + + + + A DateTime value + + + + + An array with length encoded as compressed uint + + + + + An array with zero elements + + + + + An array with one element + + + + + An array with 2 elements + + + + + An array with 3 elements + + + + + The boolean type + + + + + The string type + + + + + Encoding serialized as . + + + + + Naive thread pool focused on reducing the latency to execution of chunky work items as much as possible. + If a thread is ready to process a work item the moment a work item is queued, it's used, otherwise + a new thread is created. This is meant as a stop-gap measure for workloads that would otherwise be + creating a new thread for every work item. + + + This class is derived from dotnet/machinelearning. + + + + How long should threads wait around for additional work items before retiring themselves. + + + The queue of work items. Also used as a lock to protect all relevant state. + + + The number of threads currently waiting in tryDequeue for work to arrive. + + + + Queues a delegate to be executed immediately on another thread, + and returns a that represents its eventual completion. The task will + always end in the state; if the delegate throws + an exception, it'll be allowed to propagate on the thread, crashing the process. + + + + + Queues a delegate and associated state to be executed immediately on + another thread, and returns a that represents its eventual completion. + + + + + Indicates that a code element is performance sensitive under a known scenario. + + + When applying this attribute, only explicitly set the values for properties specifically indicated by the + test/measurement technique described in the associated . + + + + + Gets the location where the original problem is documented, likely with steps to reproduce the issue and/or + validate performance related to a change in the method. + + + + + Gets or sets a description of the constraint imposed by the original performance issue. + + + Constraints are normally specified by other specific properties that allow automated validation of the + constraint. This property supports documenting constraints which cannot be described in terms of other + constraint properties. + + + + + Gets or sets a value indicating whether captures are allowed. + + + + + Gets or sets a value indicating whether implicit boxing of value types is allowed. + + + + + Gets or sets a value indicating whether enumeration of a generic + is allowed. + + + + + Gets or sets a value indicating whether locks are allowed. + + + + + Gets or sets a value indicating whether the asynchronous state machine typically completes synchronously. + + + When , validation of this performance constraint typically involves analyzing + the method to ensure synchronous completion of the state machine does not require the allocation of a + , either through caching the result or by using + . + + + + + Gets or sets a value indicating whether this is an entry point to a parallel algorithm. + + + Parallelization APIs and algorithms, e.g. Parallel.ForEach, may be efficient for parallel entry + points (few direct calls but large amounts of iterative work), but are problematic when called inside the + iterations themselves. Performance-sensitive code should avoid the use of heavy parallelization APIs except + for known entry points to the parallel portion of code. + + + + + This is a marker attribute that can be put on an interface to denote that only internal implementations + of that interface should exist. + + + + Indicates which arguments to a method involving an interpolated string handler should be passed to that handler. + + + Initializes a new instance of the class. + The name of the argument that should be passed to the handler. + may be used as the name of the receiver in an instance method. + + + Initializes a new instance of the class. + The names of the arguments that should be passed to the handler. + may be used as the name of the receiver in an instance method. + + + Gets the names of the arguments that should be passed to the handler. + may be used as the name of the receiver in an instance method. + + + Indicates the attributed type is to be used as an interpolated string handler. + + + Initializes the . + + + + Reserved to be used by the compiler for tracking metadata. + This class should not be used by developers in source code. + + + + + Declare the following extension methods in System.Linq namespace to avoid accidental boxing of ImmutableArray{T} that implements IEnumerable{T}. + The boxing would occur if the methods were defined in Roslyn.Utilities and the file calling these methods has using Roslyn.Utilities + but not using System.Linq. + + + + + + + Specifies that the method or property will ensure that the listed field and property members have not-null values. + + + Initializes the attribute with a field or property member. + + The field or property member that is promised to be not-null. + + + + Initializes the attribute with the list of field and property members. + + The list of field and property members that are promised to be not-null. + + + + Gets field or property member names. + + + Specifies that the method or property will ensure that the listed field and property members have not-null values when returning with the specified return value condition. + + + Initializes the attribute with the specified return value condition and a field or property member. + + The return value condition. If the method returns this value, the associated parameter will not be null. + + + The field or property member that is promised to be not-null. + + + + Initializes the attribute with the specified return value condition and list of field and property members. + + The return value condition. If the method returns this value, the associated parameter will not be null. + + + The list of field and property members that are promised to be not-null. + + + + Gets the return value condition. + + + Gets field or property member names. + +
+
diff --git a/Source/Platforms/DotNet/Microsoft.VisualStudio.Setup.Configuration.Interop.dll b/Source/Platforms/DotNet/Microsoft.VisualStudio.Setup.Configuration.Interop.dll index 993fcb2f3..fbbba57a5 100644 --- a/Source/Platforms/DotNet/Microsoft.VisualStudio.Setup.Configuration.Interop.dll +++ b/Source/Platforms/DotNet/Microsoft.VisualStudio.Setup.Configuration.Interop.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:839f15d54bbbe5a3c297c9b46b62f69f6e09694b694be3bb9b1450b012403168 -size 28992 +oid sha256:6f1e8f9f551bd39474ab7bc25b5c78d2cb9acaf4869d79da6ffd0f0f458e6bde +size 21888 diff --git a/Source/Platforms/DotNet/Microsoft.VisualStudio.Setup.Configuration.Interop.xml b/Source/Platforms/DotNet/Microsoft.VisualStudio.Setup.Configuration.Interop.xml index 20bdc0763..8e5dc5eb9 100644 --- a/Source/Platforms/DotNet/Microsoft.VisualStudio.Setup.Configuration.Interop.xml +++ b/Source/Platforms/DotNet/Microsoft.VisualStudio.Setup.Configuration.Interop.xml @@ -4,6 +4,137 @@ Microsoft.VisualStudio.Setup.Configuration.Interop + + + An enumerator of installed objects. + + + + + Retrieves the next set of product instances in the enumeration sequence. + + The number of product instances to retrieve. + A pointer to an array of . + A pointer to the number of product instances retrieved. If is 1 this parameter may be NULL. + + + + Skips the next set of product instances in the enumeration sequence. + + The number of product instances to skip. + + + + Resets the enumeration sequence to the beginning. + + + + + Creates a new enumeration object in the same state as the current enumeration object: the new object points to the same place in the enumeration sequence. + + A pointer to a pointer to a new interface. If the method fails, this parameter is undefined. + + + + The state of an . + + + + + The instance state has not been determined. + + + + + The instance installation path exists. + + + + + A product is registered to the instance. + + + + + No reboot is required for the instance. + + + + + No errors were reported for the instance. + + + + + The instance represents a complete install. + + + + + Gets information about product instances installed on the machine. + + + + + Enumerates all launchable product instances installed. + + An enumeration of installed product instances. + + + + Gets the instance for the current process path. + + The instance for the current process path. + + The returned instance may not be launchable. + + + + + Gets the instance for the given path. + + Path used to determine instance + The instance for the given path. + + The returned instance may not be launchable. + + + + + Gets information about product instances set up on the machine. + + + + + Enumerates all launchable product instances installed. + + An enumeration of installed product instances. + + + + Gets the instance for the current process path. + + The instance for the current process path. + + The returned instance may not be launchable. + + + + + Gets the instance for the given path. + + Path used to determine instance + The instance for the given path. + + The returned instance may not be launchable. + + + + + Enumerates all product instances. + + An enumeration of all product instances. + Information about errors that occured during install of an instance. @@ -30,6 +161,52 @@ The error message. + + + Information about the error state of an instance. + + + + + Gets an array of failed package references. + + An array of failed package references. + + + + Gets an array of skipped package references. + + An array of skipped package references. + + + + Information about the error state of an instance. + + + + + Gets an array of failed package references. + + An array of failed package references. + + + + Gets an array of skipped package references. + + An array of skipped package references. + + + + Gets the path to the error log. + + The path to the error log. + + + + Gets the path to the main setup log. + + The path to the main setup log. + Information about the error state of an instance. @@ -65,6 +242,148 @@ The runtime error that occured during install of an instance. + + + A reference to a failed package. + + + You can enumerate all properties of basic types by casting to an . + + + + + Gets the general package identifier. + + The general package identifier. + + + + Gets the version of the package. + + The version of the package. + + + + Gets the target process architecture of the package. + + The target process architecture of the package. + + + + Gets the language and optional region identifier. + + The language and optional region identifier. + + + + Gets the build branch of the package. + + The build branch of the package. + + + + Gets the type of the package. + + The type of the package. + + + + Gets the unique identifier consisting of all defined tokens. + + The unique identifier consisting of all defined tokens. + + + + Gets a value indicating whether the package refers to an external extension. + + A value indicating whether the package refers to an external extension. + + + + A reference to a failed package. + + + You can enumerate all properties of basic types by casting to an . + + + + + Gets the general package identifier. + + The general package identifier. + + + + Gets the version of the package. + + The version of the package. + + + + Gets the target process architecture of the package. + + The target process architecture of the package. + + + + Gets the language and optional region identifier. + + The language and optional region identifier. + + + + Gets the build branch of the package. + + The build branch of the package. + + + + Gets the type of the package. + + The type of the package. + + + + Gets the unique identifier consisting of all defined tokens. + + The unique identifier consisting of all defined tokens. + + + + Gets a value indicating whether the package refers to an external extension. + + A value indicating whether the package refers to an external extension. + + + + Gets the path to the optional package log. + + The path to the optional package log. + + + + Gets the description of the package failure. + + The description of the package failure. + + + + Gets the signature to use for feedback reporting. + + The signature to use for feedback reporting. + + + + Gets the array of details for this package failure. + + An array of details for this package failure. + + + + Gets an array of packages affected by this package failure. + + An array of packages affected by this package failure. This may be null. + A reference to a failed package. @@ -163,361 +482,6 @@ The return code. - - - A reference to a failed package. - - - You can enumerate all properties of basic types by casting to an . - - - - - Gets the general package identifier. - - The general package identifier. - - - - Gets the version of the package. - - The version of the package. - - - - Gets the target process architecture of the package. - - The target process architecture of the package. - - - - Gets the language and optional region identifier. - - The language and optional region identifier. - - - - Gets the build branch of the package. - - The build branch of the package. - - - - Gets the type of the package. - - The type of the package. - - - - Gets the unique identifier consisting of all defined tokens. - - The unique identifier consisting of all defined tokens. - - - - Gets a value indicating whether the package refers to an external extension. - - A value indicating whether the package refers to an external extension. - - - - Gets the path to the optional package log. - - The path to the optional package log. - - - - Gets the description of the package failure. - - The description of the package failure. - - - - Gets the signature to use for feedback reporting. - - The signature to use for feedback reporting. - - - - Gets the array of details for this package failure. - - An array of details for this package failure. - - - - Gets an array of packages affected by this package failure. - - An array of packages affected by this package failure. This may be null. - - - - An enumerator of installed objects. - - - - - Retrieves the next set of product instances in the enumeration sequence. - - The number of product instances to retrieve. - A pointer to an array of . - A pointer to the number of product instances retrieved. If is 1 this parameter may be NULL. - - - - Skips the next set of product instances in the enumeration sequence. - - The number of product instances to skip. - - - - Resets the enumeration sequence to the beginning. - - - - - Creates a new enumeration object in the same state as the current enumeration object: the new object points to the same place in the enumeration sequence. - - A pointer to a pointer to a new interface. If the method fails, this parameter is undefined. - - - - Information about a catalog used to install an instance. - - - - - Gets catalog information properties. - - An containing catalog information properties. - The property is not defined or invalid. - - - - Gets a value indicating whether the catalog is a prerelease. - - A value indicating whether the catalog is a prerelease. - The property is not defined or invalid. - - - - Provides localized properties of an instance of a product. - - - - - Gets localized product-specific properties. - - An of localized product-specific properties, or null if no properties are defined. - - - - Gets localized channel-specific properties. - - An of localized channel-specific properties, or null if no properties are defined. - - - - The state of an . - - - - - The instance state has not been determined. - - - - - The instance installation path exists. - - - - - A product is registered to the instance. - - - - - No reboot is required for the instance. - - - - - No errors were reported for the instance. - - - - - The instance represents a complete install. - - - - - Gets information about product instances set up on the machine. - - - - - Enumerates all launchable product instances installed. - - An enumeration of installed product instances. - - - - Gets the instance for the current process path. - - The instance for the current process path. - - The returned instance may not be launchable. - - - - - Gets the instance for the given path. - - Path used to determine instance - The instance for the given path. - - The returned instance may not be launchable. - - - - - Enumerates all product instances. - - An enumeration of all product instances. - - - - Gets information about product instances installed on the machine. - - - - - Enumerates all launchable product instances installed. - - An enumeration of installed product instances. - - - - Gets the instance for the current process path. - - The instance for the current process path. - - The returned instance may not be launchable. - - - - - Gets the instance for the given path. - - Path used to determine instance - The instance for the given path. - - The returned instance may not be launchable. - - - - - Information about the error state of an instance. - - - - - Gets an array of failed package references. - - An array of failed package references. - - - - Gets an array of skipped package references. - - An array of skipped package references. - - - - Information about the error state of an instance. - - - - - Gets an array of failed package references. - - An array of failed package references. - - - - Gets an array of skipped package references. - - An array of skipped package references. - - - - Gets the path to the error log. - - The path to the error log. - - - - Gets the path to the main setup log. - - The path to the main setup log. - - - - A reference to a failed package. - - - You can enumerate all properties of basic types by casting to an . - - - - - Gets the general package identifier. - - The general package identifier. - - - - Gets the version of the package. - - The version of the package. - - - - Gets the target process architecture of the package. - - The target process architecture of the package. - - - - Gets the language and optional region identifier. - - The language and optional region identifier. - - - - Gets the build branch of the package. - - The build branch of the package. - - - - Gets the type of the package. - - The type of the package. - - - - Gets the unique identifier consisting of all defined tokens. - - The unique identifier consisting of all defined tokens. - - - - Gets a value indicating whether the package refers to an external extension. - - A value indicating whether the package refers to an external extension. - Helper functions. @@ -538,6 +502,65 @@ A 64-bit unsigned integer representing the minimum version, which may be 0. You can compare this to other versions. A 64-bit unsigned integer representing the maximum version, which may be MAXULONGLONG. You can compare this to other versions. + + + Information about an instance of a product. + + + You can enumerate all properties of basic types by casting to an . + + + + + Gets the instance identifier (should match the name of the parent instance directory). + + The instance identifier. + + + + Gets the local date and time when the installation was originally installed. + + The local date and time when the installation was originally installed. + + + + Gets the unique name of the installation, often indicating the branch and other information used for telemetry. + + The unique name of the installation, often indicating the branch and other information used for telemetry. + + + + Gets the path to the installation root of the product. + + The path to the installation root of the product. + + + + Gets the version of the product installed in this instance. + + The version of the product installed in this instance. + + + + Gets the display name (title) of the product installed in this instance. + + The LCID for the display name. + The display name (title) of the product installed in this instance. + + + + Gets the description of the product installed in this instance. + + The LCID for the description. + The description of the product installed in this instance. + + + + Resolves the optional relative path to the root path of the instance. + + A relative path within the instance to resolve, or NULL to get the root path. + The full path to the optional relative path within the instance. If the relative path is NULL, the root path will always terminate in a backslash. + Information about an instance of a product. @@ -657,64 +680,41 @@ The directory path to the setup engine that installed the instance. - + - Information about an instance of a product. + Information about a catalog used to install an instance. - - You can enumerate all properties of basic types by casting to an . - - + - Gets the instance identifier (should match the name of the parent instance directory). + Gets catalog information properties. - The instance identifier. + An containing catalog information properties. + The property is not defined or invalid. - + - Gets the local date and time when the installation was originally installed. + Gets a value indicating whether the catalog is a prerelease. - The local date and time when the installation was originally installed. + A value indicating whether the catalog is a prerelease. + The property is not defined or invalid. - + - Gets the unique name of the installation, often indicating the branch and other information used for telemetry. + Provides localized properties of an instance of a product. - The unique name of the installation, often indicating the branch and other information used for telemetry. - + - Gets the path to the installation root of the product. + Gets localized product-specific properties. - The path to the installation root of the product. + An of localized product-specific properties, or null if no properties are defined. - + - Gets the version of the product installed in this instance. + Gets localized channel-specific properties. - The version of the product installed in this instance. - - - - Gets the display name (title) of the product installed in this instance. - - The LCID for the display name. - The display name (title) of the product installed in this instance. - - - - Gets the description of the product installed in this instance. - - The LCID for the description. - The description of the product installed in this instance. - - - - Resolves the optional relative path to the root path of the instance. - - A relative path within the instance to resolve, or NULL to get the root path. - The full path to the optional relative path within the instance. If the relative path is NULL, the root path will always terminate in a backslash. + An of localized channel-specific properties, or null if no properties are defined. @@ -792,6 +792,25 @@ A value indicating whether the package refers to an external extension. + + + Gets setup policy values. + + + + + Gets the value of the SharedInstallationPath policy. + + The value of the SharedInstallationPath policy. + + + + Gets the value of a named policy. + + The name of the policy to get. + The value of the named policy. + COM failure, including E_NOTSUPPORT (0x80070032) if the named policy is not supported by this implementation. + A reference to a product package. @@ -851,6 +870,71 @@ A value indicating whether the product package is installed. + + + A reference to a product package. + + + + + Gets the general package identifier. + + The general package identifier. + + + + Gets the version of the package. + + The version of the package. + + + + Gets the target process architecture of the package. + + The target process architecture of the package. + + + + Gets the language and optional region identifier. + + The language and optional region identifier. + + + + Gets the build branch of the package. + + The build branch of the package. + + + + Gets the type of the package. + + The type of the package. + + + + Gets the unique identifier consisting of all defined tokens. + + The unique identifier consisting of all defined tokens. + + + + Gets a value indicating whether the package refers to an external extension. + + A value indicating whether the package refers to an external extension. + + + + Gets a value indicating whether the product package is installed. + + A value indicating whether the product package is installed. + + + + Gets a value indicating whether the product supports extensions. + + A value indicating whether the product supports extensions. + Provides named properties. diff --git a/Source/Platforms/DotNet/Mono.Cecil.dll b/Source/Platforms/DotNet/Mono.Cecil.dll index e14dd37ce..d1abcaf03 100644 --- a/Source/Platforms/DotNet/Mono.Cecil.dll +++ b/Source/Platforms/DotNet/Mono.Cecil.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bf98db6182162915571b114eedb4dcc2c3130564b389719cfb0eb76ce46fc4f9 -size 358400 +oid sha256:769a59793d4b8885bbbfbc5aee8f57a0d4e34d275c56c60c03994309b87f67e9 +size 356864 diff --git a/Source/Platforms/DotNet/Mono.Cecil.pdb b/Source/Platforms/DotNet/Mono.Cecil.pdb index 458e14b7a..f13d13ef0 100644 --- a/Source/Platforms/DotNet/Mono.Cecil.pdb +++ b/Source/Platforms/DotNet/Mono.Cecil.pdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e3ac01c6e32ddb22a52b60fa29f75d2d2e8ff07ab60e0dcacb3400226a24b0a1 -size 184440 +oid sha256:ce46ae50496385a291aeac1bf86b7bf972d9b48172fb021cfe2175ca423fd52b +size 189608 diff --git a/Source/Platforms/DotNet/NUnit/NOTICES.txt b/Source/Platforms/DotNet/NUnit/NOTICES.txt deleted file mode 100644 index 02f3f84d6..000000000 --- a/Source/Platforms/DotNet/NUnit/NOTICES.txt +++ /dev/null @@ -1,5 +0,0 @@ -NUnit 3.0 is based on earlier versions of NUnit, with Portions - -Copyright (c) 2002-2014 Charlie Poole or -Copyright (c) 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov or -Copyright (c) 2000-2002 Philip A. Craig diff --git a/Source/Platforms/DotNet/NUnit/agents/net40/nunit-agent.exe b/Source/Platforms/DotNet/NUnit/agents/net40/nunit-agent.exe deleted file mode 100644 index 7bc50563f..000000000 --- a/Source/Platforms/DotNet/NUnit/agents/net40/nunit-agent.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8a26526f2be945e95f4265f7fc18de2f88a2de24562273e69dba98790dd2dd1 -size 73216 diff --git a/Source/Platforms/DotNet/NUnit/agents/net40/nunit-agent.exe.config b/Source/Platforms/DotNet/NUnit/agents/net40/nunit-agent.exe.config deleted file mode 100644 index f72511441..000000000 --- a/Source/Platforms/DotNet/NUnit/agents/net40/nunit-agent.exe.config +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/DotNet/NUnit/agents/net40/nunit.engine.api.dll b/Source/Platforms/DotNet/NUnit/agents/net40/nunit.engine.api.dll deleted file mode 100644 index 10ebce4cf..000000000 --- a/Source/Platforms/DotNet/NUnit/agents/net40/nunit.engine.api.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20a0a64fb8bc3c178bb9671bc5195194652506c8a2322446f54f9e1d0a14d6ba -size 18432 diff --git a/Source/Platforms/DotNet/NUnit/agents/net40/nunit.engine.core.dll b/Source/Platforms/DotNet/NUnit/agents/net40/nunit.engine.core.dll deleted file mode 100644 index 8eff3bb65..000000000 --- a/Source/Platforms/DotNet/NUnit/agents/net40/nunit.engine.core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f886039e18809ae43587d2fbcb6f6bc7d308b4d49e595f5e4fcb253938eb160 -size 108032 diff --git a/Source/Platforms/DotNet/NUnit/agents/net40/testcentric.engine.metadata.dll b/Source/Platforms/DotNet/NUnit/agents/net40/testcentric.engine.metadata.dll deleted file mode 100644 index 8d16a9559..000000000 --- a/Source/Platforms/DotNet/NUnit/agents/net40/testcentric.engine.metadata.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b08bf44fd3270243def47673d606959915ba723db7e694e58cb44a92145b0ebb -size 176640 diff --git a/Source/Platforms/DotNet/NUnit/agents/net462/nunit-agent.exe b/Source/Platforms/DotNet/NUnit/agents/net462/nunit-agent.exe deleted file mode 100644 index b58f57419..000000000 --- a/Source/Platforms/DotNet/NUnit/agents/net462/nunit-agent.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2850e815cd4d4fb57de86e18e5556b64e8f76dd02685eb647d7ef14939024cc -size 73216 diff --git a/Source/Platforms/DotNet/NUnit/agents/net462/nunit-agent.exe.config b/Source/Platforms/DotNet/NUnit/agents/net462/nunit-agent.exe.config deleted file mode 100644 index f72511441..000000000 --- a/Source/Platforms/DotNet/NUnit/agents/net462/nunit-agent.exe.config +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/DotNet/NUnit/agents/net462/nunit.engine.api.dll b/Source/Platforms/DotNet/NUnit/agents/net462/nunit.engine.api.dll deleted file mode 100644 index 8097fec02..000000000 --- a/Source/Platforms/DotNet/NUnit/agents/net462/nunit.engine.api.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:695191d3cc03eea28fee47cc265d977a8cb884bf0a8e8403a8006c0141edbca1 -size 18432 diff --git a/Source/Platforms/DotNet/NUnit/agents/net462/nunit.engine.core.dll b/Source/Platforms/DotNet/NUnit/agents/net462/nunit.engine.core.dll deleted file mode 100644 index e70119fd5..000000000 --- a/Source/Platforms/DotNet/NUnit/agents/net462/nunit.engine.core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56d27370c602bf1b6f4cb1d14ac634e71d693c7cea3e256d6d578f057509c0fa -size 111616 diff --git a/Source/Platforms/DotNet/NUnit/agents/net462/testcentric.engine.metadata.dll b/Source/Platforms/DotNet/NUnit/agents/net462/testcentric.engine.metadata.dll deleted file mode 100644 index 8d16a9559..000000000 --- a/Source/Platforms/DotNet/NUnit/agents/net462/testcentric.engine.metadata.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b08bf44fd3270243def47673d606959915ba723db7e694e58cb44a92145b0ebb -size 176640 diff --git a/Source/Platforms/DotNet/NUnit/build/NUnit.props b/Source/Platforms/DotNet/NUnit/build/NUnit.props deleted file mode 100644 index 79c80b821..000000000 --- a/Source/Platforms/DotNet/NUnit/build/NUnit.props +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Source/Platforms/DotNet/NUnit/build/nunit.framework.dll b/Source/Platforms/DotNet/NUnit/build/nunit.framework.dll deleted file mode 100644 index 5c31bf1bc..000000000 --- a/Source/Platforms/DotNet/NUnit/build/nunit.framework.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d41bf7061cf3ee4f7efafeafd9ca889ce0e4b476e36151ca5e023e22c0020768 -size 482816 diff --git a/Source/Platforms/DotNet/NUnit/framework/nunit.framework.deps.json b/Source/Platforms/DotNet/NUnit/framework/nunit.framework.deps.json new file mode 100644 index 000000000..3ce708a17 --- /dev/null +++ b/Source/Platforms/DotNet/NUnit/framework/nunit.framework.deps.json @@ -0,0 +1,258 @@ +{ + "runtimeTarget": { + "name": ".NETStandard,Version=v2.0/", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETStandard,Version=v2.0": {}, + ".NETStandard,Version=v2.0/": { + "nunit.framework/1.0.0": { + "dependencies": { + "DotNetAnalyzers.DocumentationAnalyzers": "1.0.0-beta.59", + "Microsoft.NETFramework.ReferenceAssemblies": "1.0.0", + "Microsoft.SourceLink.GitHub": "1.0.0", + "Microsoft.Win32.Registry": "4.5.0", + "NETStandard.Library": "2.0.3", + "System.Runtime": "4.3.1", + "jnm2.ReferenceAssemblies.net35": "1.0.1" + }, + "runtime": { + "nunit.framework.dll": {} + } + }, + "DotNetAnalyzers.DocumentationAnalyzers/1.0.0-beta.59": { + "dependencies": { + "DotNetAnalyzers.DocumentationAnalyzers.Unstable": "1.0.0.59" + } + }, + "DotNetAnalyzers.DocumentationAnalyzers.Unstable/1.0.0.59": {}, + "jnm2.ReferenceAssemblies.net35/1.0.1": {}, + "Microsoft.Build.Tasks.Git/1.0.0": {}, + "Microsoft.NETCore.Platforms/1.1.1": {}, + "Microsoft.NETCore.Targets/1.1.3": {}, + "Microsoft.NETFramework.ReferenceAssemblies/1.0.0": {}, + "Microsoft.SourceLink.Common/1.0.0": {}, + "Microsoft.SourceLink.GitHub/1.0.0": { + "dependencies": { + "Microsoft.Build.Tasks.Git": "1.0.0", + "Microsoft.SourceLink.Common": "1.0.0" + } + }, + "Microsoft.Win32.Registry/4.5.0": { + "dependencies": { + "System.Buffers": "4.4.0", + "System.Memory": "4.5.0", + "System.Security.AccessControl": "4.5.0", + "System.Security.Principal.Windows": "4.5.0" + }, + "runtime": { + "lib/netstandard2.0/Microsoft.Win32.Registry.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.26515.6" + } + } + }, + "NETStandard.Library/2.0.3": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.1" + } + }, + "System.Buffers/4.4.0": { + "runtime": { + "lib/netstandard2.0/System.Buffers.dll": { + "assemblyVersion": "4.0.2.0", + "fileVersion": "4.6.25519.3" + } + } + }, + "System.Memory/4.5.0": { + "dependencies": { + "System.Buffers": "4.4.0", + "System.Numerics.Vectors": "4.4.0", + "System.Runtime.CompilerServices.Unsafe": "4.5.0" + }, + "runtime": { + "lib/netstandard2.0/System.Memory.dll": { + "assemblyVersion": "4.0.1.0", + "fileVersion": "4.6.26515.6" + } + } + }, + "System.Numerics.Vectors/4.4.0": { + "runtime": { + "lib/netstandard2.0/System.Numerics.Vectors.dll": { + "assemblyVersion": "4.1.3.0", + "fileVersion": "4.6.25519.3" + } + } + }, + "System.Runtime/4.3.1": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.1", + "Microsoft.NETCore.Targets": "1.1.3" + } + }, + "System.Runtime.CompilerServices.Unsafe/4.5.0": { + "runtime": { + "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": { + "assemblyVersion": "4.0.4.0", + "fileVersion": "0.0.0.0" + } + } + }, + "System.Security.AccessControl/4.5.0": { + "dependencies": { + "System.Security.Principal.Windows": "4.5.0" + }, + "runtime": { + "lib/netstandard2.0/System.Security.AccessControl.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.26515.6" + } + } + }, + "System.Security.Principal.Windows/4.5.0": { + "runtime": { + "lib/netstandard2.0/System.Security.Principal.Windows.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.26515.6" + } + } + } + } + }, + "libraries": { + "nunit.framework/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "DotNetAnalyzers.DocumentationAnalyzers/1.0.0-beta.59": { + "type": "package", + "serviceable": true, + "sha512": "sha512-+cjn5bzar9cqDABF2SUsMEof8yoMXSNdHYdpCVNnj/M/cRACbKYHzYpgilSEvFlHGuolzJJ2WN++/EXwBzSsYQ==", + "path": "dotnetanalyzers.documentationanalyzers/1.0.0-beta.59", + "hashPath": "dotnetanalyzers.documentationanalyzers.1.0.0-beta.59.nupkg.sha512" + }, + "DotNetAnalyzers.DocumentationAnalyzers.Unstable/1.0.0.59": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ekGYoPsAGTJs5cFbRdzfHKX2n2DzEATZyowGw3QJnozelzmhQ5tGCJhyolN5NWDq1p/GkBPKgRcQ5QGTKxaGrA==", + "path": "dotnetanalyzers.documentationanalyzers.unstable/1.0.0.59", + "hashPath": "dotnetanalyzers.documentationanalyzers.unstable.1.0.0.59.nupkg.sha512" + }, + "jnm2.ReferenceAssemblies.net35/1.0.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-v0inupvZNhNKp4ZiZjOm12dj/JLLOeFmtnXRP8qTWT/3SkJknXYgUosL2HRzYeVy7fXpX3WZq76BYEGrmIFc5w==", + "path": "jnm2.referenceassemblies.net35/1.0.1", + "hashPath": "jnm2.referenceassemblies.net35.1.0.1.nupkg.sha512" + }, + "Microsoft.Build.Tasks.Git/1.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-z2fpmmt+1Jfl+ZnBki9nSP08S1/tbEOxFdsK1rSR+LBehIJz1Xv9/6qOOoGNqlwnAGGVGis1Oj6S8Kt9COEYlQ==", + "path": "microsoft.build.tasks.git/1.0.0", + "hashPath": "microsoft.build.tasks.git.1.0.0.nupkg.sha512" + }, + "Microsoft.NETCore.Platforms/1.1.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-TMBuzAHpTenGbGgk0SMTwyEkyijY/Eae4ZGsFNYJvAr/LDn1ku3Etp3FPxChmDp5HHF3kzJuoaa08N0xjqAJfQ==", + "path": "microsoft.netcore.platforms/1.1.1", + "hashPath": "microsoft.netcore.platforms.1.1.1.nupkg.sha512" + }, + "Microsoft.NETCore.Targets/1.1.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3Wrmi0kJDzClwAC+iBdUBpEKmEle8FQNsCs77fkiOIw/9oYA07bL1EZNX0kQ2OMN3xpwvl0vAtOCYY3ndDNlhQ==", + "path": "microsoft.netcore.targets/1.1.3", + "hashPath": "microsoft.netcore.targets.1.1.3.nupkg.sha512" + }, + "Microsoft.NETFramework.ReferenceAssemblies/1.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-7D2TMufjGiowmt0E941kVoTIS+GTNzaPopuzM1/1LSaJAdJdBrVP0SkZW7AgDd0a2U1DjsIeaKG1wxGVBNLDMw==", + "path": "microsoft.netframework.referenceassemblies/1.0.0", + "hashPath": "microsoft.netframework.referenceassemblies.1.0.0.nupkg.sha512" + }, + "Microsoft.SourceLink.Common/1.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-G8DuQY8/DK5NN+3jm5wcMcd9QYD90UV7MiLmdljSJixi3U/vNaeBKmmXUqI4DJCOeWizIUEh4ALhSt58mR+5eg==", + "path": "microsoft.sourcelink.common/1.0.0", + "hashPath": "microsoft.sourcelink.common.1.0.0.nupkg.sha512" + }, + "Microsoft.SourceLink.GitHub/1.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-aZyGyGg2nFSxix+xMkPmlmZSsnGQ3w+mIG23LTxJZHN+GPwTQ5FpPgDo7RMOq+Kcf5D4hFWfXkGhoGstawX13Q==", + "path": "microsoft.sourcelink.github/1.0.0", + "hashPath": "microsoft.sourcelink.github.1.0.0.nupkg.sha512" + }, + "Microsoft.Win32.Registry/4.5.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-+FWlwd//+Tt56316p00hVePBCouXyEzT86Jb3+AuRotTND0IYn0OO3obs1gnQEs/txEnt+rF2JBGLItTG+Be6A==", + "path": "microsoft.win32.registry/4.5.0", + "hashPath": "microsoft.win32.registry.4.5.0.nupkg.sha512" + }, + "NETStandard.Library/2.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "path": "netstandard.library/2.0.3", + "hashPath": "netstandard.library.2.0.3.nupkg.sha512" + }, + "System.Buffers/4.4.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-AwarXzzoDwX6BgrhjoJsk6tUezZEozOT5Y9QKF94Gl4JK91I4PIIBkBco9068Y9/Dra8Dkbie99kXB8+1BaYKw==", + "path": "system.buffers/4.4.0", + "hashPath": "system.buffers.4.4.0.nupkg.sha512" + }, + "System.Memory/4.5.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-m0psCSpUxTGfvwyO0i03ajXVhgBqyXlibXz0Mo1dtKGjaHrXFLnuQ8rNBTmWRqbfRjr4eC6Wah4X5FfuFDu5og==", + "path": "system.memory/4.5.0", + "hashPath": "system.memory.4.5.0.nupkg.sha512" + }, + "System.Numerics.Vectors/4.4.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==", + "path": "system.numerics.vectors/4.4.0", + "hashPath": "system.numerics.vectors.4.4.0.nupkg.sha512" + }, + "System.Runtime/4.3.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-abhfv1dTK6NXOmu4bgHIONxHyEqFjW8HwXPmpY9gmll+ix9UNo4XDcmzJn6oLooftxNssVHdJC1pGT9jkSynQg==", + "path": "system.runtime/4.3.1", + "hashPath": "system.runtime.4.3.1.nupkg.sha512" + }, + "System.Runtime.CompilerServices.Unsafe/4.5.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-YrzNWduCDHhUaSRBxHxL11UkM2fD6y8hITHis4/LbQZ6vj3vdRjoH3IoPWWC9uDXK2wHIqn+b5gv1Np/VKyM1g==", + "path": "system.runtime.compilerservices.unsafe/4.5.0", + "hashPath": "system.runtime.compilerservices.unsafe.4.5.0.nupkg.sha512" + }, + "System.Security.AccessControl/4.5.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-vW8Eoq0TMyz5vAG/6ce483x/CP83fgm4SJe5P8Tb1tZaobcvPrbMEL7rhH1DRdrYbbb6F0vq3OlzmK0Pkwks5A==", + "path": "system.security.accesscontrol/4.5.0", + "hashPath": "system.security.accesscontrol.4.5.0.nupkg.sha512" + }, + "System.Security.Principal.Windows/4.5.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-U77HfRXlZlOeIXd//Yoj6Jnk8AXlbeisf1oq1os+hxOGVnuG+lGSfGqTwTZBoORFF6j/0q7HXIl8cqwQ9aUGqQ==", + "path": "system.security.principal.windows/4.5.0", + "hashPath": "system.security.principal.windows.4.5.0.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/Source/Platforms/DotNet/NUnit/framework/nunit.framework.dll b/Source/Platforms/DotNet/NUnit/framework/nunit.framework.dll new file mode 100644 index 000000000..4148f3c15 --- /dev/null +++ b/Source/Platforms/DotNet/NUnit/framework/nunit.framework.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8209dde828b2fd6bb89afff760916208fb8c0c3d91732676c3213e46c94aade0 +size 486912 diff --git a/Source/Platforms/DotNet/NUnit/framework/nunit.framework.xml b/Source/Platforms/DotNet/NUnit/framework/nunit.framework.xml new file mode 100644 index 000000000..ddd3e72a3 --- /dev/null +++ b/Source/Platforms/DotNet/NUnit/framework/nunit.framework.xml @@ -0,0 +1,21295 @@ + + + + nunit.framework + + + + + The different targets a test action attribute can be applied to + + + + + Default target, which is determined by where the action attribute is attached + + + + + Target a individual test case + + + + + Target a suite of test cases + + + + + DefaultTestAssemblyBuilder loads a single assembly and builds a TestSuite + containing test fixtures present in the assembly. + + + + + The default suite builder used by the test assembly builder. + + + + + Initializes a new instance of the class. + + + + + Build a suite of tests from a provided assembly + + The assembly from which tests are to be built + A dictionary of options to use in building the suite + + A TestSuite containing the tests found in the assembly + + + + + Build a suite of tests given the name or the location of an assembly + + The name or the location of the assembly. + A dictionary of options to use in building the suite + + A TestSuite containing the tests found in the assembly + + + + + FrameworkController provides a facade for use in loading, browsing + and running tests without requiring a reference to the NUnit + framework. All calls are encapsulated in constructors for + this class and its nested classes, which only require the + types of the Common Type System as arguments. + + The controller supports four actions: Load, Explore, Count and Run. + They are intended to be called by a driver, which should allow for + proper sequencing of calls. Load must be called before any of the + other actions. The driver may support other actions, such as + reload on run, by combining these calls. + + + + + Construct a FrameworkController using the default builder and runner. + + The AssemblyName or path to the test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests + + + + Construct a FrameworkController using the default builder and runner. + + The test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests + + + + Construct a FrameworkController, specifying the types to be used + for the runner and builder. This constructor is provided for + purposes of development. + + The full AssemblyName or the path to the test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests + The Type of the test runner + The Type of the test builder + + + + Construct a FrameworkController, specifying the types to be used + for the runner and builder. This constructor is provided for + purposes of development. + + The test assembly + A prefix used for all test ids created under this controller. + A Dictionary of settings to use in loading and running the tests + The Type of the test runner + The Type of the test builder + + + + Gets the ITestAssemblyBuilder used by this controller instance. + + The builder. + + + + Gets the ITestAssemblyRunner used by this controller instance. + + The runner. + + + + Gets the AssemblyName or the path for which this FrameworkController was created + + + + + Gets the Assembly for which this + + + + + Gets a dictionary of settings for the FrameworkController + + + + + Loads the tests in the assembly + + + + + + Returns info about the tests in an assembly + + A string containing the XML representation of the filter to use + The XML result of exploring the tests + + + + Runs the tests in an assembly + + A string containing the XML representation of the filter to use + The XML result of the test run + + + + Runs the tests in an assembly synchronously reporting back the test results through the callback + or through the return value + + The callback that receives the test results + A string containing the XML representation of the filter to use + The XML result of the test run + + + + Runs the tests in an assembly asynchronously reporting back the test results through the callback + + The callback that receives the test results + A string containing the XML representation of the filter to use + + + + Stops the test run + + True to force the stop, false for a cooperative stop + + + + Counts the number of test cases in the loaded TestSuite + + A string containing the XML representation of the filter to use + The number of tests + + + + Inserts the environment and settings elements + + Target node + The updated target node + + + + Inserts environment element + + Target node + The new node + + + + Inserts settings element + + Target node + Settings dictionary + The new node + + + + FrameworkControllerAction is the base class for all actions + performed against a FrameworkController. + + + + + LoadTestsAction loads a test into the FrameworkController + + + + + LoadTestsAction loads the tests in an assembly. + + The controller. + The callback handler. + + + + ExploreTestsAction returns info about the tests in an assembly + + + + + Initializes a new instance of the class. + + The controller for which this action is being performed. + Filter used to control which tests are included (NYI) + The callback handler. + + + + CountTestsAction counts the number of test cases in the loaded TestSuite + held by the FrameworkController. + + + + + Construct a CountsTestAction and perform the count of test cases. + + A FrameworkController holding the TestSuite whose cases are to be counted + A string containing the XML representation of the filter to use + A callback handler used to report results + + + + RunTestsAction runs the loaded TestSuite held by the FrameworkController. + + + + + Construct a RunTestsAction and run all tests in the loaded TestSuite. + + A FrameworkController holding the TestSuite to run + A string containing the XML representation of the filter to use + A callback handler used to report results + + + + RunAsyncAction initiates an asynchronous test run, returning immediately + + + + + Construct a RunAsyncAction and run all tests in the loaded TestSuite. + + A FrameworkController holding the TestSuite to run + A string containing the XML representation of the filter to use + A callback handler used to report results + + + + StopRunAction stops an ongoing run. + + + + + Construct a StopRunAction and stop any ongoing run. If no + run is in process, no error is raised. + + The FrameworkController for which a run is to be stopped. + True the stop should be forced, false for a cooperative stop. + >A callback handler used to report results + A forced stop will cause threads and processes to be killed as needed. + + + + The ITestAssemblyBuilder interface is implemented by a class + that is able to build a suite of tests given an assembly or + an assembly filename. + + + + + Build a suite of tests from a provided assembly + + The assembly from which tests are to be built + A dictionary of options to use in building the suite + A TestSuite containing the tests found in the assembly + + + + Build a suite of tests given the filename of an assembly + + The filename of the assembly from which tests are to be built + A dictionary of options to use in building the suite + A TestSuite containing the tests found in the assembly + + + + The ITestAssemblyRunner interface is implemented by classes + that are able to execute a suite of tests loaded + from an assembly. + + + + + Gets the tree of loaded tests, or null if + no tests have been loaded. + + + + + Gets the tree of test results, if the test + run is completed, otherwise null. + + + + + Indicates whether a test has been loaded + + + + + Indicates whether a test is currently running + + + + + Indicates whether a test run is complete + + + + + Loads the tests found in an Assembly, returning an + indication of whether or not the load succeeded. + + File name of the assembly to load + Dictionary of options to use in loading the test + An ITest representing the loaded tests + + + + Loads the tests found in an Assembly, returning an + indication of whether or not the load succeeded. + + The assembly to load + Dictionary of options to use in loading the test + An ITest representing the loaded tests + + + + Count Test Cases using a filter + + The filter to apply + The number of test cases found + + + + Explore the test cases using a filter + + The filter to apply + Test Assembly with test cases that matches the filter + + + + Run selected tests and return a test result. The test is run synchronously, + and the listener interface is notified as it progresses. + + Interface to receive ITestListener notifications. + A test filter used to select tests to be run + + + + Run selected tests asynchronously, notifying the listener interface as it progresses. + + Interface to receive EventListener notifications. + A test filter used to select tests to be run + + + + Wait for the ongoing run to complete. + + Time to wait in milliseconds + True if the run completed, otherwise false + + + + Signal any test run that is in process to stop. Return without error if no test is running. + + If true, kill any test-running threads + + + + Implementation of ITestAssemblyRunner + + + + + Initializes a new instance of the class. + + The builder. + + + + Gets the default level of parallel execution (worker threads) + + + + + The tree of tests that was loaded by the builder + + + + + The test result, if a run has completed + + + + + Indicates whether a test is loaded + + + + + Indicates whether a test is running + + + + + Indicates whether a test run is complete + + + + + Our settings, specified when loading the assembly + + + + + The top level WorkItem created for the assembly as a whole + + + + + The TestExecutionContext for the top level WorkItem + + + + + Loads the tests found in an Assembly + + File name or path of the assembly to load + Dictionary of option settings for loading the assembly + A Test Assembly containing all loaded tests + + + + Loads the tests found in an Assembly + + The assembly to load + Dictionary of option settings for loading the assembly + A Test Assembly containing all loaded tests + + + + Count Test Cases using a filter + + The filter to apply + The number of test cases found + + + + Explore the test cases using a filter + + The filter to apply + Test Assembly with test cases that matches the filter + + + + Run selected tests and return a test result. The test is run synchronously, + and the listener interface is notified as it progresses. + + Interface to receive EventListener notifications. + A test filter used to select tests to be run + The test results from the run + + + + Run selected tests asynchronously, notifying the listener interface as it progresses. + + Interface to receive EventListener notifications. + A test filter used to select tests to be run + + RunAsync is a template method, calling various abstract and + virtual methods to be overridden by derived classes. + + + + + Wait for the ongoing run to complete. + + Time to wait in milliseconds + True if the run completed, otherwise false + + + + Signal any test run that is in process to stop. Return without error if no test is running. + + If true, kill any tests that are currently running + + + + Initiate the test run. + + + + + Create the initial TestExecutionContext used to run tests + + The ITestListener specified in the RunAsync call + + + + Handle the Completed event for the top level work item + + + + + This method is a no-op in .NET Standard builds. + + + + + The Assert class contains a collection of static methods that + implement the most common assertions used in NUnit. + + + The Assert class contains a collection of static methods that + implement the most common assertions used in NUnit. + + + + + Verifies that the first int is greater than the second + int. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first int is greater than the second + int. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is greater than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be greater + The second value, expected to be less + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the first value is less than or equal to the second + value. If it is not, then an + is thrown. + + The first value, expected to be less + The second value, expected to be greater + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + The evaluated condition + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + The evaluated condition + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + The evaluated condition + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + The evaluated condition + + + + Asserts that a condition is false. Returns without throwing an exception when inside a multiple assert + block. + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. Returns without throwing an exception when inside a multiple assert + block. + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. Returns without throwing an exception when inside a multiple assert block. + + The evaluated condition + + + + Asserts that a condition is false. Returns without throwing an exception when inside a multiple assert + block. + + The evaluated condition + + + + Asserts that a condition is false. Returns without throwing an exception when inside a multiple assert + block. + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. Returns without throwing an exception when inside a multiple assert + block. + + The evaluated condition + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a condition is false. Returns without throwing an exception when inside a multiple assert + block. + + The evaluated condition + + + + Asserts that a condition is false. Returns without throwing an exception when inside a multiple assert + block. + + The evaluated condition + + + + Verifies that the object that is passed in is not equal to . Returns without throwing an + exception when inside a multiple assert block. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is not equal to . Returns without throwing an + exception when inside a multiple assert block. + + The object that is to be tested + + + + Verifies that the object that is passed in is not equal to . Returns without throwing an + exception when inside a multiple assert block. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is not equal to . Returns without throwing an + exception when inside a multiple assert block. + + The object that is to be tested + + + + Verifies that the object that is passed in is equal to . Returns without throwing an + exception when inside a multiple assert block. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is equal to . Returns without throwing an + exception when inside a multiple assert block. + + The object that is to be tested + + + + Verifies that the object that is passed in is equal to . Returns without throwing an + exception when inside a multiple assert block. + + The object that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the object that is passed in is equal to . Returns without throwing an + exception when inside a multiple assert block. + + The object that is to be tested + + + + Verifies that the double that is passed in is an NaN. Returns without throwing an + exception when inside a multiple assert block. + + The value that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the double that is passed in is an NaN value. Returns without throwing an + exception when inside a multiple assert block. + + The value that is to be tested + + + + Verifies that the double that is passed in is an NaN value. Returns without throwing an + exception when inside a multiple assert block. + + The value that is to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that the double that is passed in is an NaN value. Returns without throwing an + exception when inside a multiple assert block. + + The value that is to be tested + + + + Assert that a string is empty. Returns without throwing an exception when inside a multiple assert block. + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is empty. Returns without throwing an exception when inside a multiple assert block. + + The string to be tested + + + + Assert that an array, list or other collection is empty. Returns without throwing an exception when inside a + multiple assert block. + + An array, list or other collection implementing ICollection + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that an array, list or other collection is empty. Returns without throwing an exception when inside a + multiple assert block. + + An array, list or other collection implementing ICollection + + + + Assert that a string is not empty. Returns without throwing an exception when inside a multiple assert + block. + + The string to be tested + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that a string is not empty. Returns without throwing an exception when inside a multiple assert + block. + + The string to be tested + + + + Assert that an array, list or other collection is not empty. Returns without throwing an exception when + inside a multiple assert block. + + An array, list or other collection implementing ICollection + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Assert that an array, list or other collection is not empty. Returns without throwing an exception when + inside a multiple assert block. + + An array, list or other collection implementing ICollection + + + + Asserts that an int is zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + + + + Asserts that an int is zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned int is zero. Returns without throwing an exception when inside a multiple assert + block. + + The number to be examined + + + + Asserts that an unsigned int is zero. Returns without throwing an exception when inside a multiple assert + block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a Long is zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + + + + Asserts that a Long is zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned Long is zero. Returns without throwing an exception when inside a multiple assert + block. + + The number to be examined + + + + Asserts that an unsigned Long is zero. Returns without throwing an exception when inside a multiple assert + block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a decimal is zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + + + + Asserts that a decimal is zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a double is zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + + + + Asserts that a double is zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a float is zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + + + + Asserts that a float is zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an int is not zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + + + + Asserts that an int is not zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned int is not zero. Returns without throwing an exception when inside a multiple + assert block. + + The number to be examined + + + + Asserts that an unsigned int is not zero. Returns without throwing an exception when inside a multiple + assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a Long is not zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + + + + Asserts that a Long is not zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned Long is not zero. Returns without throwing an exception when inside a multiple + assert block. + + The number to be examined + + + + Asserts that an unsigned Long is not zero. Returns without throwing an exception when inside a multiple + assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a decimal is zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + + + + Asserts that a decimal is zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a double is zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + + + + Asserts that a double is zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a float is zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + + + + Asserts that a float is zero. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an int is positive. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + + + + Asserts that an int is positive. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned int is positive. Returns without throwing an exception when inside a multiple + assert block. + + The number to be examined + + + + Asserts that an unsigned int is positive. Returns without throwing an exception when inside a multiple + assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a Long is positive. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + + + + Asserts that a Long is positive. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned Long is positive. Returns without throwing an exception when inside a multiple + assert block. + + The number to be examined + + + + Asserts that an unsigned Long is positive. Returns without throwing an exception when inside a multiple + assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a decimal is positive. Returns without throwing an exception when inside a multiple assert + block. + + The number to be examined + + + + Asserts that a decimal is positive. Returns without throwing an exception when inside a multiple assert + block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a double is positive. Returns without throwing an exception when inside a multiple assert + block. + + The number to be examined + + + + Asserts that a double is positive. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a float is positive. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + + + + Asserts that a float is positive. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an int is negative. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + + + + Asserts that an int is negative. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned int is negative. Returns without throwing an exception when inside a multiple + assert block. + + The number to be examined + + + + Asserts that an unsigned int is negative. Returns without throwing an exception when inside a multiple + assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a Long is negative. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + + + + Asserts that a Long is negative. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an unsigned Long is negative. Returns without throwing an exception when inside a multiple + assert block. + + The number to be examined + + + + Asserts that an unsigned Long is negative. Returns without throwing an exception when inside a multiple + assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a decimal is negative. Returns without throwing an exception when inside a multiple assert + block. + + The number to be examined + + + + Asserts that a decimal is negative. Returns without throwing an exception when inside a multiple assert + block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a double is negative. Returns without throwing an exception when inside a multiple assert + block. + + The number to be examined + + + + Asserts that a double is negative. Returns without throwing an exception when inside a multiple assert + block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that a float is negative. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + + + + Asserts that a float is negative. Returns without throwing an exception when inside a multiple assert block. + + The number to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + DO NOT USE! Use Assert.AreEqual(...) instead. + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + The message to initialize the with. + + + + Throws a with the message and arguments + that are passed in. This allows a test to be cut short, with a result + of success returned to NUnit. + + + + + Marks the test as failed with the message and arguments that are passed in. Returns without throwing an + exception when inside a multiple assert block. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Marks the test as failed with the message that is passed in. Returns without throwing an exception when + inside a multiple assert block. + + The message to initialize the with. + + + + Marks the test as failed. Returns without throwing an exception when inside a multiple assert block. + + + + + Issues a warning using the message and arguments provided. + + The message to display. + Arguments to be used in formatting the message + + + + Issues a warning using the message provided. + + The message to display. + + + + Throws an with the message and arguments + that are passed in. This causes the test to be reported as ignored. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws an with the message that is + passed in. This causes the test to be reported as ignored. + + The message to initialize the with. + + + + Throws an . + This causes the test to be reported as ignored. + + + + + Throws an with the message and arguments + that are passed in. This causes the test to be reported as inconclusive. + + The message to initialize the with. + Arguments to be used in formatting the message + + + + Throws an with the message that is + passed in. This causes the test to be reported as inconclusive. + + The message to initialize the with. + + + + Throws an . + This causes the test to be reported as Inconclusive. + + + + + Asserts that an object is contained in a collection. Returns without throwing an exception when inside a + multiple assert block. + + The expected object + The collection to be examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is contained in a collection. Returns without throwing an exception when inside a + multiple assert block. + + The expected object + The collection to be examined + + + + Wraps code containing a series of assertions, which should all + be executed, even if they fail. Failed results are saved and + reported at the end of the code block. + + A TestDelegate to be executed in Multiple Assertion mode. + + + + Wraps code containing a series of assertions, which should all + be executed, even if they fail. Failed results are saved and + reported at the end of the code block. + + A TestDelegate to be executed in Multiple Assertion mode. + + + + If throws, returns "SomeException was thrown by the + Environment.StackTrace property." See also . + + + + + Verifies that two doubles are equal considering a delta. If the expected value is infinity then the delta + value is ignored. Returns without throwing an exception when inside a multiple assert block. + + The expected value + The actual value + The maximum acceptable difference between the the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two doubles are equal considering a delta. If the expected value is infinity then the delta + value is ignored. Returns without throwing an exception when inside a multiple assert block. + + The expected value + The actual value + The maximum acceptable difference between the the expected and the actual + + + + Verifies that two doubles are equal considering a delta. If the expected value is infinity then the delta + value is ignored. Returns without throwing an exception when inside a multiple assert block. + + The expected value + The actual value + The maximum acceptable difference between the the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two doubles are equal considering a delta. If the expected value is infinity then the delta + value is ignored. Returns without throwing an exception when inside a multiple assert block. + + The expected value + The actual value + The maximum acceptable difference between the the expected and the actual + + + + Verifies that two objects are equal. Two objects are considered equal if both are null, or if both have the + same value. NUnit has special semantics for some object types. Returns without throwing an exception when + inside a multiple assert block. + + The value that is expected + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two objects are equal. Two objects are considered equal if both are null, or if both have the + same value. NUnit has special semantics for some object types. Returns without throwing an exception when + inside a multiple assert block. + + The value that is expected + The actual value + + + + Verifies that two objects are not equal. Two objects are considered equal if both are null, or if both have + the same value. NUnit has special semantics for some object types. Returns without throwing an exception + when inside a multiple assert block. + + The value that is expected + The actual value + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that two objects are not equal. Two objects are considered equal if both are null, or if both have + the same value. NUnit has special semantics for some object types. Returns without throwing an exception + when inside a multiple assert block. + + The value that is expected + The actual value + + + + Asserts that two objects refer to the same object. Returns without throwing an exception when inside a + multiple assert block. + + The expected object + The actual object + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that two objects refer to the same object. Returns without throwing an exception when inside a + multiple assert block. + + The expected object + The actual object + + + + Asserts that two objects do not refer to the same object. Returns without throwing an exception when inside + a multiple assert block. + + The expected object + The actual object + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that two objects do not refer to the same object. Returns without throwing an exception when inside + a multiple assert block. + + The expected object + The actual object + + + + Helper for Assert.AreEqual(double expected, double actual, ...) + allowing code generation to work consistently. + + The expected value + The actual value + The maximum acceptable difference between the + the expected and the actual + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Verifies that an async delegate throws a particular exception when called. The returned exception may be + when inside a multiple assert block. + + A constraint to be satisfied by the exception + A TestSnippet delegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate throws a particular exception when called. The returned exception may be + when inside a multiple assert block. + + A constraint to be satisfied by the exception + A TestSnippet delegate + + + + Verifies that an async delegate throws a particular exception when called. The returned exception may be + when inside a multiple assert block. + + The exception Type expected + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate throws a particular exception when called. The returned exception may be + when inside a multiple assert block. + + The exception Type expected + A TestDelegate + + + + Verifies that an async delegate throws a particular exception when called. The returned exception may be + when inside a multiple assert block. + + Type of the expected exception + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate throws a particular exception when called. The returned exception may be + when inside a multiple assert block. + + Type of the expected exception + A TestDelegate + + + + Verifies that an async delegate throws an exception when called and returns it. The returned exception may + be when inside a multiple assert block. + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate throws an exception when called and returns it. The returned exception may + be when inside a multiple assert block. + + A TestDelegate + + + + Verifies that an async delegate throws an exception of a certain Type or one derived from it when called and + returns it. The returned exception may be when inside a multiple assert block. + + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate throws an exception of a certain Type or one derived from it when called and + returns it. The returned exception may be when inside a multiple assert block. + + The expected Exception Type + A TestDelegate + + + + Verifies that an async delegate throws an exception of a certain Type or one derived from it when called and + returns it. The returned exception may be when inside a multiple assert block. + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate throws an exception of a certain Type or one derived from it when called and + returns it. The returned exception may be when inside a multiple assert block. + + A TestDelegate + + + + Verifies that an async delegate does not throw an exception + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that an async delegate does not throw an exception. + + A TestDelegate + + + + Verifies that a delegate throws a particular exception when called. The returned exception may be when inside a multiple assert block. + + A constraint to be satisfied by the exception + A TestSnippet delegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. The returned exception may be when inside a multiple assert block. + + A constraint to be satisfied by the exception + A TestSnippet delegate + + + + Verifies that a delegate throws a particular exception when called. The returned exception may be when inside a multiple assert block. + + The exception Type expected + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. The returned exception may be when inside a multiple assert block. + + The exception Type expected + A TestDelegate + + + + Verifies that a delegate throws a particular exception when called. The returned exception may be when inside a multiple assert block. + + Type of the expected exception + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws a particular exception when called. The returned exception may be when inside a multiple assert block. + + Type of the expected exception + A TestDelegate + + + + Verifies that a delegate throws an exception when called and returns it. The returned exception may be when inside a multiple assert block. + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception when called and returns it. The returned exception may be when inside a multiple assert block. + + A TestDelegate + + + + Verifies that a delegate throws an exception of a certain Type or one derived from it when called and + returns it. The returned exception may be when inside a multiple assert block. + + The expected Exception Type + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception of a certain Type or one derived from it when called and + returns it. The returned exception may be when inside a multiple assert block. + + The expected Exception Type + A TestDelegate + + + + Verifies that a delegate throws an exception of a certain Type or one derived from it when called and + returns it. The returned exception may be when inside a multiple assert block. + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate throws an exception of a certain Type or one derived from it when called and + returns it. The returned exception may be when inside a multiple assert block. + + A TestDelegate + + + + Verifies that a delegate does not throw an exception + + A TestDelegate + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Verifies that a delegate does not throw an exception. + + A TestDelegate + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + The evaluated condition + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + The evaluated condition + A function to build the message included with the Exception + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + A lambda that returns a Boolean + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + A lambda that returns a Boolean + + + + Asserts that a condition is true. Returns without throwing an exception when inside a multiple assert block. + + A lambda that returns a Boolean + A function to build the message included with the Exception + + + + Apply a constraint to a delegate. Returns without throwing an exception when inside a multiple assert block. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + + + + Apply a constraint to a delegate. Returns without throwing an exception when inside a multiple assert block. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to a delegate. Returns without throwing an exception when inside a multiple assert block. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Apply a constraint to a delegate. Returns without throwing an exception when inside a multiple assert block. + + A TestDelegate to be executed + A Constraint expression to be applied + + + + Apply a constraint to a delegate. Returns without throwing an exception when inside a multiple assert block. + + A TestDelegate to be executed + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to a delegate. Returns without throwing an exception when inside a multiple assert block. + + A TestDelegate to be executed + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Apply a constraint to an actual value. Returns without throwing an exception when inside a multiple assert + block. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + + + + Apply a constraint to an actual value. Returns without throwing an exception when inside a multiple assert + block. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value. Returns without throwing an exception when inside a multiple assert + block. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Apply a constraint to an actual value. Returns without throwing an exception when inside a multiple assert + block. Used as a synonym for That in rare cases where a private setter causes a Visual Basic compilation + error. + + The actual value to test + A Constraint expression to be applied + + + + Apply a constraint to an actual value. Returns without throwing an exception when inside a multiple assert + block. Used as a synonym for That in rare cases where a private setter causes a Visual Basic compilation + error. + + + This method is provided for use by VB developers needing to test the value of properties with private + setters. + + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that an object may be assigned a value of a given Type. Returns without throwing an exception when + inside a multiple assert block. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may be assigned a value of a given Type. Returns without throwing an exception when + inside a multiple assert block. + + The expected Type. + The object under examination + + + + Asserts that an object may be assigned a value of a given Type. Returns without throwing an exception when + inside a multiple assert block. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may be assigned a value of a given Type. Returns without throwing an exception when + inside a multiple assert block. + + The expected Type. + The object under examination + + + + Asserts that an object may not be assigned a value of a given Type. Returns without throwing an exception + when inside a multiple assert block. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may not be assigned a value of a given Type. Returns without throwing an exception + when inside a multiple assert block. + + The expected Type. + The object under examination + + + + Asserts that an object may not be assigned a value of a given Type. Returns without throwing an exception + when inside a multiple assert block. + + The expected Type. + The object under examination + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object may not be assigned a value of a given Type. Returns without throwing an exception + when inside a multiple assert block. + + The expected Type. + The object under examination + + + + Asserts that an object is an instance of a given type. Returns without throwing an exception when inside a + multiple assert block. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is an instance of a given type. Returns without throwing an exception when inside a + multiple assert block. + + The expected Type + The object being examined + + + + Asserts that an object is an instance of a given type. Returns without throwing an exception when inside a + multiple assert block. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is an instance of a given type. Returns without throwing an exception when inside a + multiple assert block. + + The expected Type + The object being examined + + + + Asserts that an object is not an instance of a given type. Returns without throwing an exception when inside + a multiple assert block. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is not an instance of a given type. Returns without throwing an exception when inside + a multiple assert block. + + The expected Type + The object being examined + + + + Asserts that an object is not an instance of a given type. Returns without throwing an exception when inside + a multiple assert block. + + The expected Type + The object being examined + The message to display in case of failure + Array of objects to be used in formatting the message + + + + Asserts that an object is not an instance of a given type. Returns without throwing an exception when inside + a multiple assert block. + + The expected Type + The object being examined + + + + Delegate used by tests that execute code and + capture any thrown exception. + + + + + Delegate used by tests that execute async code and + capture any thrown exception. + + + + + AssertionHelper is an optional base class for user tests, + allowing the use of shorter names in making asserts. + + + + + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically to + . + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false the method throws + an . Works Identically to . + + The evaluated condition + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + An ActualValueDelegate returning the value to be tested + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A Constraint expression to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + The actual value to test + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an assertion exception on failure. + + A Constraint expression to be applied + The actual value to test + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Returns a ListMapper based on a collection. + + The original collection + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. + + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for a positive value + + + + + Returns a constraint that tests for a negative value + + + + + Returns a constraint that tests for equality with zero + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in binary format. + + + + + Returns a constraint that tests whether an object graph is serializable in XML format. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a superset of the collection supplied as an argument. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + Returns a new checking for the + presence of a particular object in the collection. + + + + + + Returns a new checking for the + presence of a particular object in the collection. + + + To search for a substring instead of a collection element, use the + overload. + + + + + + + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + + + To search for a collection element instead of a substring, use the + overload. + + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that fails if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that fails if the actual + value matches the pattern supplied as an argument. + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is a subpath of the expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + within a specified range. + + + + + Provides static methods to express the assumptions + that must be met for a test to give a meaningful + result. If an assumption is not met, the test + should produce an inconclusive result. + + + + + DO NOT USE! + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + The left object. + The right object. + Not applicable + + + + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + The left object. + The right object. + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Asserts that a condition is true. If the condition is false, the method throws + an . + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false, the + method throws an . + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false, the method throws + an . + + The evaluated condition + A function to build the message included with the Exception + + + + Asserts that a condition is true. If the condition is false, the method throws + an . + + A lambda that returns a Boolean + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false, the method throws + an . + + A lambda that returns a Boolean + + + + Asserts that a condition is true. If the condition is false, the method throws + an . + + A lambda that returns a Boolean + A function to build the message included with the Exception + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A ThrowsConstraint used in the test + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and throwing an InconclusiveException on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Marks a test as needing to be run in a particular threading apartment state. This will cause it + to run in a separate thread if necessary. + + + + + Construct an ApartmentAttribute + + The apartment state that this test must be run under. You must pass in a valid apartment state. + + + + Provides the author of a test or test fixture. + + + + + Initializes a new instance of the class. + + The name of the author. + + + + Initializes a new instance of the class. + + The name of the author. + The email address of the author. + + + + Applies a category to a test + + + + + The name of the category + + + + + Construct attribute for a given category based on + a name. The name may not contain the characters ',', + '+', '-' or '!'. However, this is not checked in the + constructor since it would cause an error to arise at + as the test was loaded without giving a clear indication + of where the problem is located. The error is handled + in NUnitFramework.cs by marking the test as not + runnable. + + The name of the category + + + + Protected constructor uses the Type name as the name + of the category. + + + + + The name of the category + + + + + Modifies a test by adding a category to it. + + The test to modify + + + + Marks a test to use a combinatorial join of any argument data provided. + Since this is the default, the attribute is optional. + + + + + Default constructor + + + + + Marks a test as using a particular CombiningStrategy to join any supplied parameter data. + Since this is the default, the attribute is optional. + + + + + Construct a CombiningStrategyAttribute incorporating an + ICombiningStrategy and an IParameterDataProvider. + + Combining strategy to be used in combining data + An IParameterDataProvider to supply data + + + + Construct a CombiningStrategyAttribute incorporating an object + that implements ICombiningStrategy and an IParameterDataProvider. + This constructor is provided for CLS compliance. + + Combining strategy to be used in combining data + An IParameterDataProvider to supply data + + + + Builds any number of tests from the specified method and context. + + The MethodInfo for which tests are to be constructed. + The suite to which the tests will be added. + + + + Modify the test by adding the name of the combining strategy + to the properties. + + The test to modify + + + + Marks an assembly, test fixture or test method as applying to a specific Culture. + + + + + Constructor with no cultures specified, for use + with named property syntax. + + + + + Constructor taking one or more cultures + + Comma-delimited list of cultures + + + + Causes a test to be skipped if this CultureAttribute is not satisfied. + + The test to modify + + + + Tests to determine if the current culture is supported + based on the properties of this attribute. + + True, if the current culture is supported + + + + Test to determine if the a particular culture or comma- + delimited set of cultures is in use. + + Name of the culture or comma-separated list of culture ids + True if the culture is in use on the system + + + + Test to determine if one of a collection of cultures + is being used currently. + + + + + + + Abstract base class for all data-providing attributes defined by NUnit. + Used to select all data sources for a method, class or parameter. + + + + + Default constructor + + + + + Marks a field for use as a datapoint when executing a theory within + the same fixture that requires an argument of the field's Type. + + + + + Marks a field, property or method as providing a set of datapoints for use + in executing any theories within the same fixture that require an argument of + the provided Type. The data source may provide an array of the required Type + or an . Synonymous with . + + + + + Marks a field, property or method as providing a set of datapoints for use + in executing any theories within the same fixture that require an argument + of the provided type. The data source may provide an array of the required + Type or an . Synonymous with . + + + + + Sets the tolerance used by default when checking the equality of floating point values + within the test assembly, fixture or method. + + + + + Construct specifying an amount + + + + + + Apply changes to the TestExecutionContext + + The TestExecutionContext + + + + Provides the descriptive text relating to the assembly, test fixture or test method. + + + + + Construct a description Attribute + + The text of the description + + + + Marks an assembly, test fixture or test method such that it will only run if explicitly + executed from the GUI, command line or included within a test filter. + The test will not be run simply because an enclosing suite is run. + + + + + Default constructor + + + + + Constructor with a reason + + The reason test is marked explicit + + + + Modifies a test by marking it as explicit. + + The test to modify + + + + Specify the life cycle of a Fixture + + + + + Construct a FixtureLifeCycleAttribute with a specified . + + + + + Defines the life cycle for this test fixture or assembly. + + + + + Overridden to set a TestFixture's . + + + + + Marks an assembly, test fixture or test method as being ignored. Ignored tests result in a warning message when the tests are run. + + + + + Constructs the attribute giving a reason for ignoring the test + + The reason for ignoring the test + + + + The date in the future to stop ignoring the test as a string in UTC time. + For example for a date and time, "2014-12-25 08:10:00Z" or for just a date, + "2014-12-25". If just a date is given, the Ignore will expire at midnight UTC. + + + Once the ignore until date has passed, the test will be marked + as runnable. Tests with an ignore until date will have an IgnoreUntilDate + property set which will appear in the test results. + + The string does not contain a valid string representation of a date and time. + + + + Modifies a test by marking it as Ignored. + + The test to modify + + + + Abstract base for attributes that are used to include tests in + the test run based on environmental settings. + + + + + Constructor with no included items specified, for use + with named property syntax. + + + + + Constructor taking one or more included items + + Comma-delimited list of included items + + + + Name of the item that is needed in order for + a test to run. Multiple items may be given, + separated by a comma. + + + + + Name of the item to be excluded. Multiple items + may be given, separated by a comma. + + + + + The reason for including or excluding the test + + + + + Sets the number of worker threads that may be allocated by the framework + for running tests. + + + + + Construct a LevelOfParallelismAttribute. + + The number of worker threads to be created by the framework. + + + + Specifies the life cycle for a test fixture. + + + + + A single instance is created and shared for all test cases. + + + + + A new instance is created for each test case. + + + + + Specifies the maximum time (in milliseconds) for a test case to succeed. + + + + + Construct a MaxTimeAttribute, given a time in milliseconds. + + The maximum elapsed time in milliseconds + + + + Marks tests that should NOT be run in parallel. + + + + + Construct a NonParallelizableAttribute. + + + + + Used by third-party frameworks, or other software, that reference + the NUnit framework but do not contain any tests. Applying the + attribute indicates that the assembly is not a test assembly and + may prevent errors if certain runners attempt to load the assembly. + Note that recognition of the attribute depends on each individual runner. + + + + + Abstract base class for all custom attributes defined by NUnit. + + + + + Default constructor + + + + + Identifies a method that is called once to perform setup before any child tests are run. + + + + + Identifies a method to be called once after all the child tests have run. + The method is guaranteed to be called, even if an exception is thrown. + + + + + Defines the order that the test will run in + + + + + Defines the order that the test will run in + + + + + Defines the order that the test will run in + + + + + + Modifies a test as defined for the specific attribute. + + The test to modify + + + + Marks a test as using a pairwise join of any supplied argument data. Arguments will be + combined in such a way that all possible pairs of arguments are used. + + + + + Default constructor + + + + + Marks a test assembly, fixture or method that may be run in parallel. + + + + + Construct a ParallelizableAttribute using default ParallelScope.Self. + + + + + Construct a ParallelizableAttribute with a specified scope. + + The ParallelScope associated with this attribute. + + + + Defines the degree to which this test and its descendants may be run in parallel + + + + + Overridden to check for invalid combinations of settings + + + + + + Modify the context to be used for child tests + + The current TestExecutionContext + + + + Specifies the degree to which a test, and its descendants, + may be run in parallel. + + + + + No ParallelScope was specified on the test + + + + + The test may be run in parallel with others at the same level. + Valid on classes and methods but has no effect on assemblies. + + + + + Test may not be run in parallel with any others. Valid on + classes and methods but not assemblies. + + + + + Mask used to extract the flags that apply to the item on which a + ParallelizableAttribute has been placed, as opposed to descendants. + + + + + Descendants of the test may be run in parallel with one another. + Valid on assemblies and classes but not on non-parameterized methods. + + + + + Descendants of the test down to the level of TestFixtures may be + run in parallel with one another. Valid on assemblies and classes + but not on methods. + + + + + Mask used to extract all the flags that impact descendants of a + test and place them in the TestExecutionContext. + + + + + The test and its descendants may be run in parallel with others at + the same level. Valid on classes and parameterized methods. + For assemblies it is recommended to use + instead, as has no effect on assemblies. + + + + + Marks an assembly, test fixture or test method as applying to a specific platform. + + + + + Constructor with no platforms specified, for use + with named property syntax. + + + + + Constructor taking one or more platforms + + Comma-delimited list of platforms + + + + Causes a test to be skipped if this PlatformAttribute is not satisfied. + + The test to modify + + + + Attaches information to a test assembly, fixture or method as a name/value pair. + + + + + Construct a PropertyAttribute with a name and string value + + The name of the property + The property value + + + + Construct a PropertyAttribute with a name and int value + + The name of the property + The property value + + + + Construct a PropertyAttribute with a name and double value + + The name of the property + The property value + + + + Constructor for derived classes that set the + property dictionary directly. + + + + + Constructor for use by derived classes that use the + name of the type as the property name. Derived classes + must ensure that the Type of the property value is + a standard type supported by the BCL. Any custom + types will cause a serialization Exception when + in the client. + + + + + Gets the property dictionary for this attribute + + + + + Modifies a test by adding properties to it. + + The test to modify + + + + Supplies a set of random values to a single parameter of a parameterized test. + + + + + If true, no value will be repeated. + + + + + Construct a random set of values appropriate for the Type of the + parameter on which the attribute appears, specifying only the count. + + + + + + Generates values within a specified range. + + + + + Generates values within a specified range. + + + + + Generates values within a specified range. + + + + + Generates values within a specified range. + + + + + Generates values within a specified range. + + + + + Generates values within a specified range. + + + + + Generates values within a specified range. + + + + + Generates values within a specified range. + + + + + Generates values within a specified range. + + + + + Generates values within a specified range. + + + + + Retrieves a list of arguments which can be passed to the specified parameter. + + The parameter of a parameterized test. + + + + Supplies a range of values to an individual parameter of a parameterized test. + + + + + Constructs a range of values using the default step of 1. + + + + + Constructs a range of values with the specified step size. + + + + + Constructs a range of values using the default step of 1. + + + + + Constructs a range of values with the specified step size. + + + + + Constructs a range of values using a default step of 1. + + + + + Constructs a range of values with the specified step size. + + + + + Constructs a range of values using the default step of 1. + + + + + Constructs a range of values with the specified step size. + + + + + Constructs a range of values with the specified step size. + + + + + Constructs a range of values with the specified step size. + + + + + Retrieves a list of arguments which can be passed to the specified parameter. + + The parameter of a parameterized test. + + + Returns a string that represents the current object. + + + + Specifies that a test should be run multiple times. + + + + + Construct a RepeatAttribute + + The number of times to run the test + + + + Wrap a command and return the result. + + The command to be wrapped + The wrapped command + + + + The test command for the RepeatAttribute + + + + + Initializes a new instance of the class. + + The inner command. + The number of repetitions + + + + Runs the test, saving a TestResult in the supplied TestExecutionContext. + + The context in which the test should run. + A TestResult + + + + Marks a test that must run on a separate thread. + + + + + Construct a RequiresThreadAttribute + + + + + Construct a RequiresThreadAttribute, specifying the apartment + + + + + Specifies that a test method should be rerun on failure up to the specified + maximum number of times. + + + + + Construct a + + The maximum number of times the test should be run if it fails + + + + Wrap a command and return the result. + + The command to be wrapped + The wrapped command + + + + The test command for the + + + + + Initializes a new instance of the class. + + The inner command. + The maximum number of repetitions + + + + Runs the test, saving a TestResult in the supplied TestExecutionContext. + + The context in which the test should run. + A TestResult + + + + Marks a test to use a sequential join of any provided argument data. + Arguments will be combined into test cases, taking the next value of + each argument until all are used. + + + + + Default constructor + + + + + Sets the current Culture on an assembly, test fixture or test method for + the duration of a test. The culture remains set until the test or fixture + completes and is then reset to its original value. + + + + + + Construct given the name of a culture + + + + + + Sets the current UI Culture on an assembly, test fixture or test method + for the duration of a test. The UI culture remains set until the test or + fixture completes and is then reset to its original value. + + + + + + Construct given the name of a culture + + + + + + Identifies a method to be called immediately before each test is run. + + + + + Identifies a class as containing or + methods for all the test fixtures + under a given namespace. + + + + + Builds a from the specified type. + + The type info of the fixture to be used. + + + + Marks a test fixture as requiring all child tests to be run on the + same thread as the OneTimeSetUp and OneTimeTearDown. A flag in the + is set forcing all child tests + to be run sequentially on the current thread. + Any setting is ignored. + + + + + Apply changes to the TestExecutionContext + + The TestExecutionContext + + + + Identifies a method to be called immediately after each test is run. + The method is guaranteed to be called, even if an exception is thrown. + + + + + Abstract attribute providing actions to execute before and after tests. + + + + + Executed before each test is run + + The test that is going to be run. + + + + Executed after each test is run + + The test that has just been run. + + + + Provides the target for the action attribute + + + + + Marks a test assembly as needing a special assembly resolution hook that will + explicitly search the test assembly's directory for dependent assemblies. + This works around a conflict between mixed-mode assembly initialization and + tests running in their own AppDomain in some cases. + + + + + Marks the method as callable from the NUnit test runner. + + + + [TestFixture] + public class Fixture + { + [Test] + public void MethodToTest() + {} + + [Test(Description = "more detailed description")] + public void TestDescriptionMethod() + {} + } + + + + + + Descriptive text for this test + + + + + The author of this test + + + + + The type that this test is testing + + + + + Gets or sets the expected result. Not valid if the test + method has parameters. + + The result. + + + + Modifies a test by adding a description, if not already set. + + The test to modify + + + + Builds a single test from the specified method and context. + + The method for which a test is to be constructed. + The suite to which the test will be added. + + + + Marks a method as a parameterized test suite and provides arguments for each test case. + + + + + Construct a TestCaseAttribute with a list of arguments. + This constructor is not CLS-Compliant + + + + + + Construct a TestCaseAttribute with a single argument + + + + + + Construct a TestCaseAttribute with a two arguments + + + + + + + Construct a TestCaseAttribute with a three arguments + + + + + + + + Gets or sets the name of the test. + + The name of the test. + + + + Gets or sets the RunState of this test case. + + + + + Gets the list of arguments to a test case + + + + + Gets the properties of the test case + + + + + Gets or sets the expected result. + + The result. + + + + Returns true if the expected result has been set + + + + + Gets or sets the description. + + The description. + + + + The author of this test + + + + + The type that this test is testing + + + + + Gets or sets the reason for ignoring the test + + + + + Gets or sets a value indicating whether this is explicit. + + + if explicit; otherwise, . + + + + + Gets or sets the reason for not running the test. + + The reason. + + + + Gets or sets the ignore reason. When set to a non-null + non-empty value, the test is marked as ignored. + + The ignore reason. + + + + Comma-delimited list of platforms to run the test for + + + + + Comma-delimited list of platforms to not run the test for + + + + + Gets and sets the category for this test case. + May be a comma-separated list of categories. + + + + + Gets and sets the ignore until date for this test case. + + + + + Performs several special conversions allowed by NUnit in order to + permit arguments with types that cannot be used in the constructor + of an Attribute such as TestCaseAttribute or to simplify their use. + + The arguments to be converted + The ParameterInfo array for the method + + + + Builds a single test from the specified method and context. + + The MethodInfo for which tests are to be constructed. + The suite to which the tests will be added. + + + + Indicates the source to be used to provide test fixture instances for a test class. + + + + + Construct with the name of the method, property or field that will provide data + + The name of a static method, property or field that will provide data. + + + + Construct with a Type and name + + The Type that will provide data + The name of a static method, property or field that will provide data. + A set of parameters passed to the method, works only if the Source Name is a method. + If the source name is a field or property has no effect. + + + + Construct with a Type and name + + The Type that will provide data + The name of a static method, property or field that will provide data. + + + + Construct with a name + + The name of a static method, property or field that will provide data. + A set of parameters passed to the method, works only if the Source Name is a method. + If the source name is a field or property has no effect. + + + + Construct with a Type + + The type that will provide data + + + + A set of parameters passed to the method, works only if the Source Name is a method. + If the source name is a field or property has no effect. + + + + + The name of a the method, property or field to be used as a source + + + + + A Type to be used as a source + + + + + Gets or sets the category associated with every fixture created from + this attribute. May be a single category or a comma-separated list. + + + + + Builds any number of tests from the specified method and context. + + The IMethod for which tests are to be constructed. + The suite to which the tests will be added. + + + + Marks the class as a TestFixture. + + + + + Default constructor + + + + + Construct with a object[] representing a set of arguments. + The arguments may later be separated into type arguments and constructor arguments. + + + + + + Gets or sets the name of the test. + + The name of the test. + + + + Gets or sets the RunState of this test fixture. + + + + + The arguments originally provided to the attribute + + + + + Properties pertaining to this fixture + + + + + Get or set the type arguments. If not set + explicitly, any leading arguments that are + Types are taken as type arguments. + + + + + Descriptive text for this fixture + + + + + The author of this fixture + + + + + The type that this fixture is testing + + + + + Gets or sets the ignore reason. May set RunState as a side effect. + + The ignore reason. + + + + Gets or sets the reason for not running the fixture. + + The reason. + + + + Gets or sets the ignore reason. When set to a non-null + non-empty value, the test is marked as ignored. + + The ignore reason. + + + + Gets or sets a value indicating whether this is explicit. + + + if explicit; otherwise, . + + + + + Gets and sets the category for this fixture. + May be a comma-separated list of categories. + + + + + Builds a single test fixture from the specified type. + + + + + Builds a single test fixture from the specified type. + + The type info of the fixture to be used. + Filter used to select methods as tests. + + + + Identifies the source used to provide test fixture instances for a test class. + + + + + Error message string is public so the tests can use it + + + + + Construct with the name of the method, property or field that will provide data + + The name of a static method, property or field that will provide data. + + + + Construct with a Type and name + + The Type that will provide data + The name of a static method, property or field that will provide data. + + + + Construct with a Type + + The type that will provide data + + + + The name of a the method, property or field to be used as a source + + + + + A Type to be used as a source + + + + + Gets or sets the category associated with every fixture created from + this attribute. May be a single category or a comma-separated list. + + + + + Builds any number of test fixtures from the specified type. + + The TypeInfo for which fixtures are to be constructed. + + + + Builds any number of test fixtures from the specified type. + + The TypeInfo for which fixtures are to be constructed. + PreFilter used to select methods as tests. + + + + Returns a set of ITestFixtureData items for use as arguments + to a parameterized test fixture. + + The type for which data is needed. + + + + + Indicates the method or class the assembly, test fixture or test method is testing. + + + + + Initializes a new instance of the class. + + The type that is being tested. + + + + Initializes a new instance of the class. + + The type that is being tested. + + + + Adding this attribute to a method within a + class makes the method callable from the NUnit test runner. There is a property + called Description which is optional which you can provide a more detailed test + description. This class cannot be inherited. + + + + [TestFixture] + public class Fixture + { + [Test] + public void MethodToTest() + {} + + [Test(Description = "more detailed description")] + public void TestDescriptionMethod() + {} + } + + + + + + Construct the attribute, specifying a combining strategy and source of parameter data. + + + + + Applies a timeout in milliseconds to a test. + When applied to a method, the test is cancelled if the timeout is exceeded. + When applied to a class or assembly, the default timeout is set for all contained test methods. + + + + + Construct a TimeoutAttribute given a time in milliseconds + + The timeout value in milliseconds + + + + Provides literal arguments for an individual parameter of a test. + + + + + The collection of data to be returned. Must + be set by any derived attribute classes. + We use an object[] so that the individual + elements may have their type changed in GetData + if necessary + + + + + Constructs for use with an Enum parameter. Will pass every enum + value in to the test. + + + + + Construct with one argument + + + + + + Construct with two arguments + + + + + + + Construct with three arguments + + + + + + + + Construct with an array of arguments + + + + + + Retrieves a list of arguments which can be passed to the specified parameter. + + The parameter of a parameterized test. + + + + To generate data for Values attribute, in case no data is provided. + + + + + To Check if type is nullable enum. + + + + + Indicates the source used to provide data for one parameter of a test method. + + + + + Construct with the name of the factory - for use with languages + that don't support params arrays. + + The name of a static method, property or field that will provide data. + + + + Construct with a Type and name - for use with languages + that don't support params arrays. + + The Type that will provide data + The name of a static method, property or field that will provide data. + + + + The name of a the method, property or field to be used as a source + + + + + A Type to be used as a source + + + + + Retrieves a list of arguments which can be passed to the specified parameter. + + The parameter of a parameterized test. + + + + A set of Assert methods operating on one or more collections + + + + + DO NOT USE! Use CollectionAssert.AreEqual(...) instead. + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + Asserts that all items contained in collection are of the type specified by expectedType. + + IEnumerable containing objects to be considered + System.Type that all objects in collection must be instances of + + + + Asserts that all items contained in collection are of the type specified by expectedType. + + IEnumerable containing objects to be considered + System.Type that all objects in collection must be instances of + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that all items contained in collection are not equal to null. + + IEnumerable containing objects to be considered + + + + Asserts that all items contained in collection are not equal to null. + + IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Ensures that every object contained in collection exists within the collection + once and only once. + + IEnumerable of objects to be considered + + + + Ensures that every object contained in collection exists within the collection + once and only once. + + IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are exactly equal. The collections must have the same count, + and contain the exact same objects in the same order. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are equivalent, containing the same objects but the match may be in any order. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are not exactly equal. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + + + + Asserts that expected and actual are not exactly equal. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are not exactly equal. + If comparer is not null then it will be used to compare the objects. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The IComparer to use in comparing objects from each IEnumerable + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that expected and actual are not equivalent. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + + + + Asserts that expected and actual are not equivalent. + + The first IEnumerable of objects to be considered + The second IEnumerable of objects to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that collection contains actual as an item. + + IEnumerable of objects to be considered + Object to be found within collection + + + + Asserts that collection contains actual as an item. + + IEnumerable of objects to be considered + Object to be found within collection + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that collection does not contain actual as an item. + + IEnumerable of objects to be considered + Object that cannot exist within collection + + + + Asserts that collection does not contain actual as an item. + + IEnumerable of objects to be considered + Object that cannot exist within collection + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the superset does not contain the subset + + The IEnumerable subset to be considered + The IEnumerable superset to be considered + + + + Asserts that the superset does not contain the subset + + The IEnumerable subset to be considered + The IEnumerable superset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the superset contains the subset. + + The IEnumerable subset to be considered + The IEnumerable superset to be considered + + + + Asserts that the superset contains the subset. + + The IEnumerable subset to be considered + The IEnumerable superset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the subset does not contain the superset + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + + + + Asserts that the subset does not contain the superset + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Asserts that the subset contains the superset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + + + + Asserts that the subset contains the superset. + + The IEnumerable superset to be considered + The IEnumerable subset to be considered + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array,list or other collection is empty + + An array, list or other collection implementing IEnumerable + + + + Assert that an array, list or other collection is empty + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array,list or other collection is empty + + An array, list or other collection implementing IEnumerable + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + A custom comparer to perform the comparisons + The message to be displayed on failure + Arguments to be used in formatting the message + + + + Assert that an array, list or other collection is ordered + + An array, list or other collection implementing IEnumerable + A custom comparer to perform the comparisons + + + + AllItemsConstraint applies another constraint to each + item in a collection, succeeding if they all succeed. + + + + + Construct an AllItemsConstraint on top of an existing constraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Apply the item constraint to each item in the collection, + failing if any item fails. + + + + + + + AndConstraint succeeds only if both members succeed. + + + + + Create an AndConstraint from two other constraints + + The first constraint + The second constraint + + + + Gets text describing a constraint + + + + + Apply both member constraints to an actual value, succeeding + succeeding only if both of them succeed. + + The actual value + True if the constraints both succeeded + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + is used to determine whether the value is equal to any of the expected values. + + + + + Construct a + + Collection of expected values + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether item is present in expected collection + + Actual item type + Actual item + + + + Flag the constraint to ignore case and return self. + + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + + + + Flag the constraint to use the supplied Comparison object. + + The Comparison object to use. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IEqualityComparer object to use. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + + + + Flag the constraint to use the supplied boolean-returning delegate. + + The supplied boolean-returning delegate to use. + + + + AssignableFromConstraint is used to test that an object + can be assigned from a given Type. + + + + + Construct an AssignableFromConstraint for the type provided + + + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + AssignableToConstraint is used to test that an object + can be assigned to a given Type. + + + + + Construct an AssignableToConstraint for the type provided + + + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + AttributeConstraint tests that a specified attribute is present + on a Type or other provider and that the value of the attribute + satisfies some other constraint. + + + + + Constructs an AttributeConstraint for a specified attribute + Type and base constraint. + + + + + + + Determines whether the Type or other provider has the + expected attribute and if its value matches the + additional constraint specified. + + + + + Returns a string representation of the constraint. + + + + + AttributeExistsConstraint tests for the presence of a + specified attribute on a Type. + + + + + Constructs an AttributeExistsConstraint for a specific attribute Type + + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Tests whether the object provides the expected attribute. + + A Type, MethodInfo, or other ICustomAttributeProvider + True if the expected attribute is present, otherwise false + + + + BinaryConstraint is the abstract base of all constraints + that combine two other constraints in some fashion. + + + + + The first constraint being combined + + + + + The second constraint being combined + + + + + Construct a BinaryConstraint from two other constraints + + The first constraint + The second constraint + + + + BinarySerializableConstraint tests whether + an object is serializable in binary format. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Returns the string representation + + + + + CollectionConstraint is the abstract base class for + constraints that operate on collections. + + + + + Construct an empty CollectionConstraint + + + + + Construct a CollectionConstraint + + + + + + Determines whether the specified enumerable is empty. + + The enumerable. + + if the specified enumerable is empty; otherwise, . + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Protected method to be implemented by derived classes + + + + + + + CollectionContainsConstraint is used to test whether a collection + contains an expected object as a member. + + + + + Construct a CollectionContainsConstraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Gets the expected object + + + + + Test whether the expected item is contained in the collection + + + + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + Self. + + + + CollectionEquivalentConstraint is used to determine whether two + collections are equivalent. + + + + The result of the from the collections + under comparison. + + + Construct a CollectionEquivalentConstraint + Expected collection. + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether two collections are equivalent + + + + + + + Test whether the collection is equivalent to the expected. + + + Actual collection type. + + + Actual collection to compare. + + + A indicating whether or not + the two collections are equivalent. + + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + Self. + + + Provides a for the . + + + Result of a of the collections to compare for equivalence. + + + Construct a using a . + Source . + Result of the collection comparison. + Actual collection to compare. + Whether or not the succeeded. + + + Write any additional lines (following Expected: and But was:) for a failing constraint. + The to write the failure message to. + + + + CollectionItemsEqualConstraint is the abstract base class for all + collection constraints that apply some notion of item equality + as a part of their operation. + + + + + The NUnitEqualityComparer in use for this constraint + + + + + Construct an empty CollectionConstraint + + + + + Construct a CollectionConstraint + + + + + + Get a flag indicating whether the user requested us to ignore case. + + + + + Get a flag indicating whether any external comparers are in use. + + + + + Flag the constraint to ignore case and return self. + + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + + + + Flag the constraint to use the supplied Comparison object. + + The Comparison object to use. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + + + + Flag the constraint to use the supplied boolean-returning delegate. + + The supplied boolean-returning delegate to use. + + + + Compares two collection members for equality + + + + + Return a new CollectionTally for use in making tests + + The collection to be included in the tally + + + + CollectionOrderedConstraint is used to test whether a collection is ordered. + + + + + Construct a CollectionOrderedConstraint + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + If used performs a default ascending comparison + + + + + If used performs a reverse comparison + + + + + Modifies the constraint to use an and returns self. + + + + + Modifies the constraint to use an and returns self. + + + + + Modifies the constraint to use a and returns self. + + + + + Modifies the constraint to test ordering by the value of + a specified property and returns self. + + + + + Then signals a break between two ordering steps + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Test whether the collection is ordered + + + + + Returns the string representation of the constraint. + + + + + + An OrderingStep represents one stage of the sort + + + + + Constructor for success result. + + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + + + + Constructor for failure result. + + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + Index at which collection order breaks. + Value at which collection order breaks. + + + + CollectionSubsetConstraint is used to determine whether + one collection is a subset of another + + + + + Construct a CollectionSubsetConstraint + + The collection that the actual value is expected to be a subset of + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the actual collection is a subset of + the expected collection provided. + + + + + + + Test whether the constraint is satisfied by a given value. + + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + Self. + + + + CollectionSupersetConstraint is used to determine whether + one collection is a superset of another + + + + + Construct a CollectionSupersetConstraint + + The collection that the actual value is expected to be a superset of + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the actual collection is a superset of + the expected collection provided. + + + + + + + Test whether the constraint is satisfied by a given value. + + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + Self. + + + counts (tallies) the number of occurrences + of each object in one or more enumerations. + + + The result of a . + + + Items that were not in the expected collection. + + + Items that were not accounted for in the expected collection. + + + Initializes a new instance of the class with the given fields. + + + The result of the comparison between the two collections. + + + Construct a CollectionTally object from a comparer and a collection. + The comparer to use for equality. + The expected collection to compare against. + + + Try to remove an object from the tally. + The object to remove. + + + Try to remove a set of objects from the tally. + The objects to remove. + + + + Comparator for two s. + + + + + Comparator for two s. + + + + + Flag indicating whether or not this is the top level comparison. + + + + + A list of tracked comparisons + + + + + Comparator for two s. + + + + + Comparator for two s. + + + + + Comparator for two s. + + + + + Comparator for two s. + + + + + Comparator for two s. + + + + + Comparator for two types related by . + + + + + Interface for comparing two s. + + + + + Method for comparing two objects with a tolerance. + + The first object to compare. + The second object to compare. + The tolerance to use when comparing the objects. + The evaluation state of the comparison. + + if the objects cannot be compared using the method. + Otherwise the result of the comparison is returned. + + + + + Comparator for two s. + + + + + Comparator for two s. + + + + + Comparator for two s. + + + + + Comparator for two s. + + + + + Comparator for two types related by . + + + + + Comparator for two s or s. + + + + + Comparator for two Tuples. + + + + + Base class for comparators for tuples (both regular Tuples and ValueTuples). + + + + + Comparator for two ValueTuples. + + + + + ComparisonAdapter class centralizes all comparisons of + values in NUnit, adapting to the use of any provided + , + or . + + + + + Gets the default ComparisonAdapter, which wraps an + NUnitComparer object. + + + + + Returns a ComparisonAdapter that wraps an + + + + + Returns a ComparisonAdapter that wraps an + + + + + Returns a ComparisonAdapter that wraps a + + + + + Compares two objects + + + + + Construct a default ComparisonAdapter + + + + + Construct a ComparisonAdapter for an + + + + + Compares two objects + + + + + + + + ComparerAdapter extends and + allows use of an or + to actually perform the comparison. + + + + + Construct a ComparisonAdapter for an + + + + + Compare a Type T to an object + + + + + Construct a ComparisonAdapter for a + + + + + Compare a Type T to an object + + + + + Abstract base class for constraints that compare values to + determine if one is greater than, equal to or less than + the other. + + + + + The value against which a comparison is to be made + + + + + Tolerance used in making the comparison + + + + + ComparisonAdapter to be used in making the comparison + + + + + Initializes a new instance of the class. + + The value against which to make a comparison. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + A ConstraintResult + + + + Protected function overridden by derived class to actually perform the comparison + + + + + Modifies the constraint to use an and returns self + + The comparer used for comparison tests + A constraint modified to use the given comparer + + + + Modifies the constraint to use an and returns self + + The comparer used for comparison tests + A constraint modified to use the given comparer + + + + Modifies the constraint to use a and returns self + + The comparer used for comparison tests + A constraint modified to use the given comparer + + + + Set the tolerance for use in this comparison + + + + + Switches the .Within() modifier to interpret its tolerance as + a percentage that the actual values is allowed to deviate from + the expected value. + + Self + + + + Provides standard description of what the constraint tests + based on comparison text. + + Describes the comparison being tested, throws + if null + Is thrown when null passed to a method + + + + Delegate used to delay evaluation of the actual value + to be used in evaluating a constraint + + + + + The Constraint class is the base of all built-in constraints + within NUnit. It provides the operator overloads used to combine + constraints. + + + + + Construct a constraint with optional arguments + + Arguments to be saved + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Arguments provided to this Constraint, for use in + formatting the description. + + + + + The ConstraintBuilder holding this constraint + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + Applies the constraint to an ActualValueDelegate that returns + the value to be tested. The default implementation simply evaluates + the delegate but derived classes may override it to provide for + delayed processing. + + An ActualValueDelegate + A ConstraintResult + + + + Test whether the constraint is satisfied by a given reference. + The default implementation simply dereferences the value but + derived classes may override it to provide for delayed processing. + + A reference to the value to be tested + A ConstraintResult + + + + Retrieves the value to be tested from an ActualValueDelegate. + The default implementation simply evaluates the delegate but derived + classes may override it to provide for delayed processing. + + An ActualValueDelegate + Delegate evaluation result + + + + Default override of ToString returns the constraint DisplayName + followed by any arguments within angle brackets. + + + + + + Returns the string representation of this constraint + + + + + This operator creates a constraint that is satisfied only if both + argument constraints are satisfied. + + + + + This operator creates a constraint that is satisfied if either + of the argument constraints is satisfied. + + + + + This operator creates a constraint that is satisfied if the + argument constraint is not satisfied. + + + + + Returns a ConstraintExpression by appending And + to the current constraint. + + + + + Returns a ConstraintExpression by appending And + to the current constraint. + + + + + Returns a ConstraintExpression by appending Or + to the current constraint. + + + + + Returns a DelayedConstraint.WithRawDelayInterval with the specified delay time. + + The delay, which defaults to milliseconds. + + + + + Returns a DelayedConstraint with the specified delay time + and polling interval. + + The delay in milliseconds. + The interval at which to test the constraint. + + + + + Resolves any pending operators and returns the resolved constraint. + + + + + ConstraintBuilder maintains the stacks that are used in + processing a ConstraintExpression. An OperatorStack + is used to hold operators that are waiting for their + operands to be reorganized. a ConstraintStack holds + input constraints as well as the results of each + operator applied. + + + + + OperatorStack is a type-safe stack for holding ConstraintOperators + + + + + Initializes a new instance of the class. + + The ConstraintBuilder using this stack. + + + + Gets a value indicating whether this is empty. + + if empty; otherwise, . + + + + Gets the topmost operator without modifying the stack. + + + + + Pushes the specified operator onto the stack. + + The operator to put onto the stack. + + + + Pops the topmost operator from the stack. + + The topmost operator on the stack + + + + ConstraintStack is a type-safe stack for holding Constraints + + + + + Initializes a new instance of the class. + + The ConstraintBuilder using this stack. + + + + Gets a value indicating whether this is empty. + + if empty; otherwise, . + + + + Pushes the specified constraint. As a side effect, + the constraint's Builder field is set to the + ConstraintBuilder owning this stack. + + The constraint to put onto the stack + + + + Pops this topmost constraint from the stack. + As a side effect, the constraint's Builder + field is set to null. + + The topmost constraint on the stack + + + + Initializes a new instance of the class. + + + + + Appends the specified operator to the expression by first + reducing the operator stack and then pushing the new + operator on the stack. + + The operator to push. + + + + Appends the specified constraint to the expression by pushing + it on the constraint stack. + + The constraint to push. + + + + Sets the top operator right context. + + The right context. + + + + Reduces the operator stack until the topmost item + precedence is greater than or equal to the target precedence. + + The target precedence. + + + + Resolves this instance, returning a Constraint. If the Builder + is not currently in a resolvable state, an exception is thrown. + + The resolved constraint + + + + Gets a value indicating whether this instance is resolvable. + + + if this instance is resolvable; otherwise, . + + + + + ConstraintExpression represents a compound constraint in the + process of being constructed from a series of syntactic elements. + + Individual elements are appended to the expression as they are + reorganized. When a constraint is appended, it is returned as the + value of the operation so that modifiers may be applied. However, + any partially built expression is attached to the constraint for + later resolution. When an operator is appended, the partial + expression is returned. If it's a self-resolving operator, then + a ResolvableConstraintExpression is returned. + + + + + The ConstraintBuilder holding the elements recognized so far + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the + class passing in a ConstraintBuilder, which may be pre-populated. + + The builder. + + + + Returns a string representation of the expression as it + currently stands. This should only be used for testing, + since it has the side-effect of resolving the expression. + + + + + + Appends an operator to the expression and returns the + resulting expression itself. + + + + + Appends a self-resolving operator to the expression and + returns a new ResolvableConstraintExpression. + + + + + Appends a constraint to the expression and returns that + constraint, which is associated with the current state + of the expression being built. Note that the constraint + is not reduced at this time. For example, if there + is a NotOperator on the stack we don't reduce and + return a NotConstraint. The original constraint must + be returned because it may support modifiers that + are yet to be applied. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. + + + + + Returns a , which will + apply the following constraint to a collection of length one, succeeding + only if exactly one of them succeeds. + + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + With is currently a NOP - reserved for future use. + + + + + Returns the constraint provided as an argument - used to allow custom + custom constraints to easily participate in the syntax. + + + + + Returns the constraint provided as an argument - used to allow custom + custom constraints to easily participate in the syntax. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for a positive value + + + + + Returns a constraint that tests for a negative value + + + + + Returns a constraint that tests if item is equal to zero + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in binary format. + + + + + Returns a constraint that tests whether an object graph is serializable in XML format. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a superset of the collection supplied as an argument. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + Returns a new checking for the + presence of a particular object in the collection. + + + + + + Returns a new checking for the + presence of a particular object in the collection. + + + To search for a substring instead of a collection element, use the + overload. + + + + + + + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + + + To search for a collection element instead of a substring, use the + overload. + + + + + + Returns a new checking for the + presence of a particular object in the collection. + + + + + Returns a new ContainsConstraint. This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. + + + + + Returns a new DictionaryContainsKeyConstraint checking for the + presence of a particular key in the Dictionary key collection. + + The key to be matched in the Dictionary key collection + + + + Returns a new DictionaryContainsValueConstraint checking for the + presence of a particular value in the Dictionary value collection. + + The value to be matched in the Dictionary value collection + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the a subpath of the expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + inclusively within a specified range. + + Inclusive beginning of the range. + Inclusive end of the range. + + + + Returns a constraint that succeeds if the value + is a file or directory and it exists. + + + + + Returns a constraint that tests if an item is equal to any of parameters + + Expected values + + + + Returns a new IndexerConstraintExpression, which will + apply any following constraint to that indexer value. + + Index accessor values. + + + + ConstraintStatus represents the status of a ConstraintResult + returned by a Constraint being applied to an actual value. + + + + + The status has not yet been set + + + + + The constraint succeeded + + + + + The constraint failed + + + + + An error occurred in applying the constraint (reserved for future use) + + + + + Contains the result of matching a against an actual value. + + + + + Constructs a for a particular . + + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + + + + Constructs a for a particular . + + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + The status of the new ConstraintResult. + + + + Constructs a for a particular . + + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + If true, applies a status of Success to the result, otherwise Failure. + + + + The actual value that was passed to the method. + + + + + Gets and sets the ResultStatus for this result. + + + + + True if actual value meets the Constraint criteria otherwise false. + + + + + Display friendly name of the constraint. + + + + + Description of the constraint may be affected by the state the constraint had + when was performed against the actual value. + + + + + Write the failure message to the MessageWriter provided + as an argument. The default implementation simply passes + the result and the actual value to the writer, which + then displays the constraint description and the value. + + Constraints that need to provide additional details, + such as where the error occurred, can override this. + + The MessageWriter on which to display the message + + + + Write some additional failure message. + + The MessageWriter on which to display the message + + + + Write the actual value for a failing constraint test to a + MessageWriter. The default implementation simply writes + the raw value of actual, leaving it to the writer to + perform any formatting. + + The writer on which the actual value is displayed + + + + ContainsConstraint tests a whether a string contains a substring + or a collection contains an object. It postpones the decision of + which test to use until the type of the actual argument is known. + This allows testing whether a string is contained in a collection + or as a substring of another string using the same syntax. + + + + + Initializes a new instance of the class. + + The expected value contained within the string/collection. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Flag the constraint to ignore case and return self. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + CountZeroConstraint tests whether an instance has a property .Count with value zero. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Checks if the specified has a int Count property. + + Type to check. + when has a 'int Count' property, otherwise. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + The DateTimes class contains common operations on Date and Time values. + + + + + Applies a delay to the match so that a match can be evaluated in the future. + + + + + Allows only changing the time dimension of delay interval and setting a polling interval of a DelayedConstraint + + + + + Creates a new DelayedConstraint.WithRawDelayInterval + + Parent DelayedConstraint on which delay interval dimension is required to be set + + + + Changes delay interval dimension to minutes + + + + + Changes delay interval dimension to seconds + + + + + Changes delay interval dimension to milliseconds + + + + + Set polling interval, in milliseconds + + A time interval, in milliseconds + + + + + Allows only setting the polling interval of a DelayedConstraint + + + + + Creates a new DelayedConstraint.WithDimensionedDelayInterval + + Parent DelayedConstraint on which polling interval is required to be set + + + + Set polling interval, in milliseconds + + A time interval, in milliseconds + + + + + Allows only changing the time dimension of the polling interval of a DelayedConstraint + + + + + Creates a new DelayedConstraint.WithRawPollingInterval + + Parent DelayedConstraint on which polling dimension is required to be set + + + + Changes polling interval dimension to minutes + + + + + Changes polling interval dimension to seconds + + + + + Changes polling interval dimension to milliseconds + + + + + Delay value store as an Interval object + + + + + Polling value stored as an Interval object + + + + + Creates a new DelayedConstraint + + The inner constraint to decorate + The time interval after which the match is performed + If the value of is less than 0 + + + + Creates a new DelayedConstraint + + The inner constraint to decorate + The time interval after which the match is performed, in milliseconds + The time interval used for polling, in milliseconds + If the value of is less than 0 + + + + Gets text describing a constraint + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for if the base constraint fails, false if it succeeds + + + + Test whether the constraint is satisfied by a delegate + + The delegate whose value is to be tested + A ConstraintResult + + + + Test whether the constraint is satisfied by a given reference. + Overridden to wait for the specified delay period before + calling the base constraint with the dereferenced value. + + A reference to the value to be tested + True for success, false for failure + + + + Returns the string representation of the constraint. + + + + + Adjusts a Timestamp by a given TimeSpan + + + + + + + + Returns the difference between two Timestamps as a TimeSpan + + + + + + + + DictionaryContainsKeyConstraint is used to test whether a dictionary + contains an expected object as a key. + + + + + Construct a DictionaryContainsKeyConstraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Gets the expected object + + + + + Returns a new DictionaryContainsKeyValuePairConstraint checking for the + presence of a particular key-value-pair in the dictionary. + + + + + Flag the constraint to ignore case and return self. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + + + + Test whether the expected key is contained in the dictionary + + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + + + + Flag the constraint to use the supplied Comparison object. + + The Comparison object to use. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + + + + Flag the constraint to use the supplied boolean-returning delegate. + + The supplied boolean-returning delegate to use. + + + + DictionaryContainsKeyValuePairConstraint is used to test whether a dictionary + contains an expected object as a key-value-pair. + + + + + Construct a DictionaryContainsKeyValuePairConstraint + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + + + + Test whether the expected key is contained in the dictionary + + + + + DictionaryContainsValueConstraint is used to test whether a dictionary + contains an expected object as a value. + + + + + Construct a DictionaryContainsValueConstraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Gets the expected object + + + + + Test whether the expected value is contained in the dictionary + + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + Self. + + + + Provides a for the constraints + that are applied to each item in the collection + + + + + Constructs a for a particular + Only used for Failure + + The Constraint to which this result applies + The actual value to which the Constraint was applied + Actual item that does not match expected condition + Non matching item index + + + + Write constraint description, actual items, and non-matching item + + The MessageWriter on which to display the message + + + + EmptyCollectionConstraint tests whether a collection is empty. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Check that the collection is empty + + + + + + + EmptyConstraint tests a whether a string or collection is empty, + postponing the decision about which test is applied until the + type of the actual argument is known. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + EmptyDirectoryConstraint is used to test that a directory is empty + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + EmptyGuidConstraint tests whether a Guid is empty. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + EmptyStringConstraint tests whether a string is empty. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + EndsWithConstraint can test whether a string ends + with an expected substring. + + + + + Initializes a new instance of the class. + + The expected string + + + + Test whether the constraint is matched by the actual value. + This is a template method, which calls the IsMatch method + of the derived class. + + + + + + + EqualConstraint is able to compare an actual value with the + expected value provided in its constructor. Two objects are + considered equal if both are null, or if both have the same + value. NUnit has special semantics for some object types. + + + + + NUnitEqualityComparer used to test equality. + + + + + Initializes a new instance of the class. + + The expected value. + + + + Gets the tolerance for this comparison. + + + The tolerance. + + + + + Gets a value indicating whether to compare case insensitive. + + + if comparing case insensitive; otherwise, . + + + + + Gets a value indicating whether or not to clip strings. + + + if set to clip strings otherwise, . + + + + + Gets the failure points. + + + The failure points. + + + + + Flag the constraint to ignore case and return self. + + + + + Flag the constraint to suppress string clipping + and return self. + + + + + Flag the constraint to compare arrays as collections + and return self. + + + + + Flag the constraint to use a tolerance when determining equality. + + Tolerance value to be used + Self. + + + + Flags the constraint to include + property in comparison of two values. + + + Using this modifier does not allow to use the + constraint modifier. + + + + + Switches the .Within() modifier to interpret its tolerance as + a distance in representable values (see remarks). + + Self. + + Ulp stands for "unit in the last place" and describes the minimum + amount a given value can change. For any integers, an ulp is 1 whole + digit. For floating point values, the accuracy of which is better + for smaller numbers and worse for larger numbers, an ulp depends + on the size of the number. Using ulps for comparison of floating + point results instead of fixed tolerances is safer because it will + automatically compensate for the added inaccuracy of larger numbers. + + + + + Switches the .Within() modifier to interpret its tolerance as + a percentage that the actual values is allowed to deviate from + the expected value. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in days. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in hours. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in minutes. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in seconds. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in milliseconds. + + Self + + + + Causes the tolerance to be interpreted as a TimeSpan in clock ticks. + + Self + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied boolean-returning delegate. + + The boolean-returning delegate to use. + Self. + + + + Flag the constraint to use the supplied Comparison object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied IEqualityComparer object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied predicate function + + The comparison function to use. + Self. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + The EqualConstraintResult class is tailored for formatting + and displaying the result of an EqualConstraint. + + + + + Construct an EqualConstraintResult + + + + + Write a failure message. Overridden to provide custom + failure messages for EqualConstraint. + + The MessageWriter to write to + + + + Display the failure information for two collections that did not match. + + The MessageWriter on which to display + The expected collection. + The actual collection + The depth of this failure in a set of nested collections + + + + Displays a single line showing the types and sizes of the expected + and actual collections or arrays. If both are identical, the value is + only shown once. + + The MessageWriter on which to display + The expected collection or array + The actual collection or array + The indentation level for the message line + + + + Displays a single line showing the point in the expected and actual + arrays at which the comparison failed. If the arrays have different + structures or dimensions, both values are shown. + + The MessageWriter on which to display + The expected array + The actual array + Index of the failure point in the underlying collections + The indentation level for the message line + + + + Display the failure information for two IEnumerables that did not match. + + The MessageWriter on which to display + The expected enumeration. + The actual enumeration + The depth of this failure in a set of nested collections + + + + EqualityAdapter class handles all equality comparisons + that use an , + or a . + + + + + Compares two objects, returning true if they are equal + + + + + Returns true if the two objects can be compared by this adapter. + The base adapter cannot handle IEnumerables except for strings. + + + + + Returns an that wraps an . + + + + + that wraps an . + + + + + Returns an that wraps an . + + + + + Returns an EqualityAdapter that uses a predicate function for items comparison. + + + + + + + + + Returns true if the two objects can be compared by this adapter. + The base adapter cannot handle IEnumerables except for strings. + + + + + Compares two objects, returning true if they are equal + + + + + Returns true if the two objects can be compared by this adapter. + Generic adapter requires objects of the specified type. + + + + + Returns an that wraps an . + + + + + Returns an that wraps an . + + + + + that wraps an . + + + + + Returns an that wraps a . + + + + + ExactCountConstraint applies another constraint to each + item in a collection, succeeding only if a specified + number of items succeed. + + + + + Construct a standalone ExactCountConstraint + + + + + + Construct an ExactCountConstraint on top of an existing constraint + + + + + + + Apply the item constraint to each item in the collection, + succeeding only if the expected number of items pass. + + The value to be tested + A ConstraintResult + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Contain the result of matching a against an actual value. + + + + + The count of matched items of the + + + + + A list with maximum count (+1) of items of the + + + + + Constructs a for a . + + The Constraint to which this result applies. + The actual value to which the Constraint was applied. + If true, applies a status of Success to the result, otherwise Failure. + Count of matched items of the + A list with maximum count (+1) of items of the + + + + Write the actual value for a failing constraint test to a MessageWriter. + + The writer on which the actual value is displayed + + + + ExactTypeConstraint is used to test that an object + is of the exact type provided in the constructor + + + + + Construct an ExactTypeConstraint for a given Type + + The expected Type. + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + ExceptionTypeConstraint is a special version of ExactTypeConstraint + used to provided detailed info about the exception thrown in + an error message. + + + + + Constructs an ExceptionTypeConstraint + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + FalseConstraint tests that the actual value is false + + + + + Initializes a new instance of the class. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + FileExistsConstraint is used to determine if a file exists + + + + + Initializes a new instance of the class. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + FileOrDirectoryExistsConstraint is used to determine if a file or directory exists + + + + + If true, the constraint will only check if files exist, not directories + + + + + If true, the constraint will only check if directories exist, not files + + + + + Initializes a new instance of the class that + will check files and directories. + + + + + Initializes a new instance of the class that + will only check files if ignoreDirectories is true. + + if set to [ignore directories]. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + Helper routines for working with floating point numbers + + + The floating point comparison code is based on this excellent article: + https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ + + + "ULP" means Unit in the Last Place and in the context of this library refers to + the distance between two adjacent floating point numbers. IEEE floating point + numbers can only represent a finite subset of natural numbers, with greater + accuracy for smaller numbers and lower accuracy for very large numbers. + + + If a comparison is allowed "2 ulps" of deviation, that means the values are + allowed to deviate by up to 2 adjacent floating point values, which might be + as low as 0.0000001 for small numbers or as high as 10.0 for large numbers. + + + + + Union of a floating point variable and an integer + + + The union's value as a floating point variable + + + The union's value as an integer + + + The union's value as an unsigned integer + + + Union of a double precision floating point variable and a long + + + The union's value as a double precision floating point variable + + + The union's value as a long + + + The union's value as an unsigned long + + + Compares two floating point values for equality + First floating point value to be compared + Second floating point value t be compared + + Maximum number of representable floating point values that are allowed to + be between the left and the right floating point values + + True if both numbers are equal or close to being equal + + + Floating point values can only represent a finite subset of natural numbers. + For example, the values 2.00000000 and 2.00000024 can be stored in a float, + but nothing between them. + + + This comparison will count how many possible floating point values are between + the left and the right number. If the number of possible values between both + numbers is less than or equal to maxUlps, then the numbers are considered as + being equal. + + + Implementation partially follows the code outlined here: + http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ + + + + + Compares two double precision floating point values for equality + First double precision floating point value to be compared + Second double precision floating point value t be compared + + Maximum number of representable double precision floating point values that are + allowed to be between the left and the right double precision floating point values + + True if both numbers are equal or close to being equal + + + Double precision floating point values can only represent a limited series of + natural numbers. For example, the values 2.0000000000000000 and 2.0000000000000004 + can be stored in a double, but nothing between them. + + + This comparison will count how many possible double precision floating point + values are between the left and the right number. If the number of possible + values between both numbers is less than or equal to maxUlps, then the numbers + are considered as being equal. + + + Implementation partially follows the code outlined here: + http://www.anttirt.net/2007/08/19/proper-floating-point-comparisons/ + + + + + + Tests whether a value is greater than the value supplied to its constructor + + + + + Initializes a new instance of the class. + + The expected value. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Perform the comparison + + + + + Tests whether a value is greater than or equal to the value supplied to its constructor + + + + + Initializes a new instance of the class. + + The expected value. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Perform the comparison + + + + + Interface for all constraints + + + + + The display name of this Constraint for use by ToString(). + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Arguments provided to this Constraint, for use in + formatting the description. + + + + + The ConstraintBuilder holding this constraint + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + Applies the constraint to an ActualValueDelegate that returns + the value to be tested. The default implementation simply evaluates + the delegate but derived classes may override it to provide for + delayed processing. + + An ActualValueDelegate + A ConstraintResult + + + + Test whether the constraint is satisfied by a given reference. + The default implementation simply dereferences the value but + derived classes may override it to provide for delayed processing. + + A reference to the value to be tested + A ConstraintResult + + + + IndexerConstraint extracts a named property and uses + its value as the actual value for a chained constraint. + + + + + Initializes a new instance of the class. + + The argument list for the indexer. + The constraint to apply to the indexer. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + + + + Returns the string representation of the constraint. + + + + + InstanceOfTypeConstraint is used to test that an object + is of the same type provided or derived from it. + + + + + Construct an InstanceOfTypeConstraint for the type provided + + The expected Type + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + Keeps track of an interval time which can be represented in + Minutes, Seconds or Milliseconds + + + + + Constructs a interval given an value in milliseconds + + + + + Gets Interval value represented as a TimeSpan object + + + + + Returns the interval with the current value as a number of minutes. + + + + + Returns the interval with the current value as a number of seconds. + + + + + Returns the interval with the current value as a number of milliseconds. + + + + + Is true for intervals created with a non-zero value + + + + + Returns a string that represents the current object. + + + A string that represents the current object. + + + + + IntervalUnit provides the semantics to the value stored in Interval class. + + + + + Unit representing an Interval in minutes + + + + + Unit representing an Interval in seconds + + + + + Unit representing an Interval in milliseconds + + + + + The IResolveConstraint interface is implemented by all + complete and resolvable constraints and expressions. + + + + + Return the top-level constraint for this expression + + + + + + An extension of ResolvableConstraintExpression that adds a no-op Items property for readability. + + + + + Create a new instance of ItemsConstraintExpression + + + + + Create a new instance of ResolvableConstraintExpression, + passing in a pre-populated ConstraintBuilder. + + + + + + No-op property for readability. + + + + + Tests whether a value is less than the value supplied to its constructor + + + + + Initializes a new instance of the class. + + The expected value. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Perform the comparison + + + + + Tests whether a value is less than or equal to the value supplied to its constructor + + + + + Initializes a new instance of the class. + + The expected value. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Perform the comparison + + + + + MessageWriter is the abstract base for classes that write + constraint descriptions and messages in some form. The + class has separate methods for writing various components + of a message, allowing implementations to tailor the + presentation as needed. + + + + + Construct a MessageWriter given a culture + + + + + Abstract method to get the max line length + + + + + Method to write single line message with optional args, usually + written to precede the general failure message. + + The message to be written + Any arguments used in formatting the message + + + + Method to write single line message with optional args, usually + written to precede the general failure message, at a given + indentation level. + + The indentation level of the message + The message to be written + Any arguments used in formatting the message + + + + Display Expected and Actual lines for a constraint. This + is called by MessageWriter's default implementation of + WriteMessageTo and provides the generic two-line display. + + The failing constraint result + + + + Display Expected and Actual lines for given values. This + method may be called by constraints that need more control over + the display of actual and expected values than is provided + by the default implementation. + + The expected value + The actual value causing the failure + + + + Display Expected and Actual lines for given values, including + a tolerance value on the Expected line. + + The expected value + The actual value causing the failure + The tolerance within which the test was made + + + + Display the expected and actual string values on separate lines. + If the mismatch parameter is >=0, an additional line is displayed + line containing a caret that points to the mismatch point. + + The expected string value + The actual string value + The point at which the strings don't match or -1 + If true, case is ignored in locating the point where the strings differ + If true, the strings should be clipped to fit the line + + + + Writes the text for an actual value. + + The actual value. + + + + Writes the text for a generalized value. + + The value. + + + + Writes the text for a collection value, + starting at a particular point, to a max length + + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write + + + + Custom value formatter function + + The value + + + + + Custom value formatter factory function + + The next formatter function + ValueFormatter + If the given formatter is unable to handle a certain format, it must call the next formatter in the chain + + + + Static methods used in creating messages + + + + + Default amount of items used by method. + + + + + Static string used when strings are clipped + + + + + Formatting strings used for expected and actual values + + + + + Current head of chain of value formatters. Public for testing. + + + + + Add a formatter to the chain of responsibility. + + + + + + Formats text to represent a generalized value. + + The value + The formatted text + + + + Formats text for a collection value, + starting at a particular point, to a max length + + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write + + + + Returns the representation of a type as used in NUnitLite. + This is the same as Type.ToString() except for arrays, + which are displayed with their declared sizes. + + + + + + + Converts any control characters in a string + to their escaped representation. + + The string to be converted + The converted string + + + + Converts any null characters in a string + to their escaped representation. + + The string to be converted + The converted string + + + + Return the a string representation for a set of indices into an array + + Array of indices for which a string is needed + + + + Get an array of indices representing the point in a collection or + array corresponding to a single int index into the collection. + + The collection to which the indices apply + Index in the collection + Array of indices + + + + Clip a string to a given length, starting at a particular offset, returning the clipped + string with ellipses representing the removed parts + + The string to be clipped + The maximum permitted length of the result string + The point at which to start clipping + The clipped string + + + + Clip the expected and actual strings in a coordinated fashion, + so that they may be displayed together. + + + + + + + + + Shows the position two strings start to differ. Comparison + starts at the start index. + + The expected string + The actual string + The index in the strings at which comparison should start + Boolean indicating whether case should be ignored + -1 if no mismatch found, or the index where mismatch found + + + + NaNConstraint tests that the actual value is a double or float NaN + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test that the actual value is an NaN + + + + + + + NoItemConstraint applies another constraint to each + item in a collection, failing if any of them succeeds. + + + + + Construct a SomeItemsConstraint on top of an existing constraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Apply the item constraint to each item in the collection, + failing if any item fails. + + + + + + + NotConstraint negates the effect of some other constraint + + + + + Initializes a new instance of the class. + + The base constraint to be negated. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for if the base constraint fails, false if it succeeds + + + + NullConstraint tests that the actual value is null + + + + + Initializes a new instance of the class. + + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + The Numerics class contains common operations on numeric values. + + + + + Checks the type of the object, returning true if + the object is a numeric type. + + The object to check + true if the object is a numeric type + + + + Checks the type of the object, returning true if + the object is a floating point numeric type. + + The object to check + true if the object is a floating point numeric type + + + + Checks the type of the object, returning true if + the object is a fixed point numeric type. + + The object to check + true if the object is a fixed point numeric type + + + + Test two numeric values for equality, performing the usual numeric + conversions and using a provided or default tolerance. If the tolerance + provided is Empty, this method may set it to a default tolerance. + + The expected value + The actual value + A reference to the tolerance in effect + True if the values are equal + + + + Compare two numeric values, performing the usual numeric conversions. + + The expected value + The actual value + The relationship of the values to each other + + + + Calculates the difference between 2 values in absolute/percent mode. + + The expected value + The actual value + Tolerance mode to specify difference representation + The difference between the values + + + + NUnitComparer encapsulates NUnit's default behavior + in comparing two objects. + + + + + Returns the default NUnitComparer. + + + + + Compares two objects + + + + + + + + NUnitEqualityComparer encapsulates NUnit's handling of + equality tests between objects. + + + + + If true, all string comparisons will ignore case + + + + + If true, arrays will be treated as collections, allowing + those of different dimensions to be compared + + + + + Comparison objects used in comparisons for some constraints. + + + + + List of points at which a failure occurred. + + + + + List of comparers used to compare pairs of objects. + + + + + Initializes a new instance of the class. + + + + + Returns the default NUnitEqualityComparer + + + + + Gets and sets a flag indicating whether case should + be ignored in determining equality. + + + + + Gets and sets a flag indicating that arrays should be + compared as collections, without regard to their shape. + + + + + Gets the list of external comparers to be used to + test for equality. They are applied to members of + collections, in place of NUnit's own logic. + + + + + Gets the list of failure points for the last Match performed. + The list consists of objects to be interpreted by the caller. + This generally means that the caller may only make use of + objects it has placed on the list at a particular depth. + + + + + Flags the comparer to include + property in comparison of two values. + + + Using this modifier does not allow to use the + modifier. + + + + + Compares two objects for equality within a tolerance. + + + + + Compares two objects for equality within a tolerance. + + + + + FailurePoint class represents one point of failure + in an equality test. + + + + + The location of the failure + + + + + The expected value + + + + + The actual value + + + + + Indicates whether the expected value is valid + + + + + Indicates whether the actual value is valid + + + + + Represents a constraint that succeeds if all the + members of a collection match a base constraint. + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + they all succeed. + + + + + Operator that requires both its arguments to succeed + + + + + Construct an AndOperator + + + + + Apply the operator to produce an AndConstraint + + + + + Operator that tests for the presence of a particular attribute + on a type and optionally applies further tests to the attribute. + + + + + Construct an AttributeOperator for a particular Type + + The Type of attribute tested + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + Abstract base class for all binary operators + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Gets the left precedence of the operator + + + + + Gets the right precedence of the operator + + + + + Abstract method that produces a constraint by applying + the operator to its left and right constraint arguments. + + + + + Abstract base for operators that indicate how to + apply a constraint to items in a collection. + + + + + Constructs a CollectionOperator + + + + + The ConstraintOperator class is used internally by a + ConstraintBuilder to represent an operator that + modifies or combines constraints. + + Constraint operators use left and right precedence + values to determine whether the top operator on the + stack should be reduced before pushing a new operator. + + + + + The precedence value used when the operator + is about to be pushed to the stack. + + + + + The precedence value used when the operator + is on the top of the stack. + + + + + The syntax element preceding this operator + + + + + The syntax element following this operator + + + + + The precedence value used when the operator + is about to be pushed to the stack. + + + + + The precedence value used when the operator + is on the top of the stack. + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Represents a constraint that succeeds if the specified + count of members of a collection match a base constraint. + + + + + Construct an ExactCountOperator for a specified count + + The expected count + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Operator used to test for the presence of a Indexer + on an object and optionally apply further tests to the + value of that indexer. + + + + + Constructs a IndexerOperator for a particular set of indexer + parameters + + + + + Returns a IndexerConstraint applied to its argument. + + + + + Represents a constraint that succeeds if none of the + members of a collection match a base constraint. + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + none of them succeed. + + + + + Negates the test of the constraint it wraps. + + + + + Constructs a new NotOperator + + + + + Returns a NotConstraint applied to its argument. + + + + + Operator that requires at least one of its arguments to succeed + + + + + Construct an OrOperator + + + + + Apply the operator to produce an OrConstraint + + + + + PrefixOperator takes a single constraint and modifies + its action in some way. + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Returns the constraint created by applying this + prefix to another constraint. + + + + + + + Operator used to test for the presence of a named Property + on an object and optionally apply further tests to the + value of that property. + + + + + Gets the name of the property to which the operator applies + + + + + Constructs a PropOperator for a particular named property + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + + Abstract base class for operators that are able to reduce to a + constraint whether or not another syntactic element follows. + + + + + Represents a constraint that succeeds if any of the + members of a collection match a base constraint. + + + + + Returns a constraint that will apply the argument + to the members of a collection, succeeding if + any of them succeed. + + + + + Operator that tests that an exception is thrown and + optionally applies further tests to the exception. + + + + + Construct a ThrowsOperator + + + + + Reduce produces a constraint from the operator and + any arguments. It takes the arguments from the constraint + stack and pushes the resulting constraint on it. + + + + + Represents a constraint that simply wraps the + constraint provided as an argument, without any + further functionality, but which modifies the + order of evaluation because of its precedence. + + + + + Constructor for the WithOperator + + + + + Returns a constraint that wraps its argument + + + + + OrConstraint succeeds if either member succeeds + + + + + Create an OrConstraint from two other constraints + + The first constraint + The second constraint + + + + Gets text describing a constraint + + + + + Apply the member constraints to an actual value, succeeding + succeeding as soon as one of them succeeds. + + The actual value + True if either constraint succeeded + + + + PathConstraint serves as the abstract base of constraints + that operate on paths and provides several helper methods. + + + + + Construct a PathConstraint for a give expected path + + The expected path + + + + Modifies the current instance to be case-sensitive + and returns it. + + + + + Returns the string representation of this constraint + + + + + Canonicalize the provided path + + + The path in standardized form + + + + Test whether one path in canonical form is a subpath of another path + + The first path - supposed to be the parent path + The second path - supposed to be the child path + + + + + Predicate constraint wraps a Predicate in a constraint, + returning success if the predicate is true. + + + + + Construct a PredicateConstraint from a predicate + + + + + Gets text describing a constraint + + + + + Determines whether the predicate succeeds when applied + to the actual value. + + + + + Abstract base class used for prefixes + + + + + The base constraint + + + + + Prefix used in forming the constraint description + + + + + Construct given a base constraint + + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Formats a prefix constraint's description. + + + + + PropertyConstraint extracts a named property and uses + its value as the actual value for a chained constraint. + + + + + Initializes a new instance of the class. + + The name. + The constraint to apply to the property. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + + + + Returns the string representation of the constraint. + + + + + Contains the result of matching a against an actual value. + + + + + Constructs a for a particular . + + The Constraint to which this result applies. + The base result with actual value to which the Constraint was applied. + + + + Write the additional failure message for a failing constraint to a + MessageWriter. + + The writer on which the actual value is displayed + + + + PropertyExistsConstraint tests that a named property + exists on the object provided through Match. + + Originally, PropertyConstraint provided this feature + in addition to making optional tests on the value + of the property. The two constraints are now separate. + + + + + Initializes a new instance of the class. + + The name of the property. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the property exists for a given object + + The object to be tested + True for success, false for failure + + + + Returns the string representation of the constraint. + + + + + + RangeConstraint tests whether two values are within a + specified range. + + + + + Initializes a new instance of the class. + + Inclusive beginning of the range. + Inclusive end of the range. + + + + Gets text describing a constraint + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Modifies the constraint to use an and returns self. + + + + + Modifies the constraint to use an and returns self. + + + + + Modifies the constraint to use a and returns self. + + + + + RegexConstraint can test whether a string matches + the pattern provided. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Initializes a new instance of the class. + + The pattern. + + + + Initializes a new instance of the class. + + The Regex pattern object. + + + + Modify the constraint to ignore case in matching. + + + + + Applies the regex constraint to an actual value, returning a ConstraintResult. + + The string to be tested. + True for success, false for failure. + + + + ResolvableConstraintExpression is used to represent a compound + constraint being constructed at a point where the last operator + may either terminate the expression or may have additional + qualifying constraints added to it. + + It is used, for example, for a Property element or for + an Exception element, either of which may be optionally + followed by constraints that apply to the property or + exception. + + + + + Create a new instance of ResolvableConstraintExpression + + + + + Create a new instance of ResolvableConstraintExpression, + passing in a pre-populated ConstraintBuilder. + + + + + Appends an And Operator to the expression + + + + + Appends an Or operator to the expression. + + + + + Resolve the current expression to a Constraint + + + + + ReusableConstraint wraps a constraint expression after + resolving it so that it can be reused consistently. + + + + + Construct a ReusableConstraint from a constraint expression + + The expression to be resolved and reused + + + + Converts a constraint to a ReusableConstraint + + The constraint to be converted + A ReusableConstraint + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Return the top-level constraint for this expression + + + + + + SameAsConstraint tests whether an object is identical to + the object passed to its constructor + + + + + Initializes a new instance of the class. + + The expected object. + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Summary description for SamePathConstraint. + + + + + Initializes a new instance of the class. + + The expected path + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + SamePathOrUnderConstraint tests that one path is under another + + + + + Initializes a new instance of the class. + + The expected path + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + SomeItemsConstraint applies another constraint to each + item in a collection, succeeding if any of them succeeds. + + + + + Construct a SomeItemsConstraint on top of an existing constraint + + + + + + The display name of this Constraint for use by ToString(). + The default value is the name of the constraint with + trailing "Constraint" removed. Derived classes may set + this to another name in their constructors. + + + + + Apply the item constraint to each item in the collection, + succeeding if any item succeeds. + + + + + + + Flag the constraint to use the supplied object. + + The type of the elements in the collection. + The type of the member. + The comparison function to use. + Self. + + + + Flag the constraint to use the supplied object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied object. + + The IComparer object to use. + Self. + + + + Flag the constraint to use the supplied object. + + The IComparer object to use. + Self. + + + + StartsWithConstraint can test whether a string starts + with an expected substring. + + + + + Initializes a new instance of the class. + + The expected string + + + + Test whether the constraint is matched by the actual value. + This is a template method, which calls the IsMatch method + of the derived class. + + + + + + + StringConstraint is the abstract base for constraints + that operate on strings. It supports the IgnoreCase + modifier for string operations. + + + + + The expected value + + + + + Indicates whether tests should be case-insensitive + + + + + Description of this constraint + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Constructs a StringConstraint without an expected value + + + + + Constructs a StringConstraint given an expected value + + The expected value + + + + Modify the constraint to ignore case in matching. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Test whether the constraint is satisfied by a given string + + The string to be tested + True for success, false for failure + + + + SubPathConstraint tests that the actual path is under the expected path + + + + + Initializes a new instance of the class. + + The expected path + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + SubstringConstraint can test whether a string contains + the expected substring. + + + + + Initializes a new instance of the class. + + The expected. + + + + Modify the constraint to ignore case in matching. + This will call Using(StringComparison.CurrentCultureIgnoreCase). + + Thrown when a comparison type different + than was already set. + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Modify the constraint to the specified comparison. + + Thrown when a comparison type different + than was already set. + + + + ThrowsConstraint is used to test the exception thrown by + a delegate by applying a constraint to it. + + + + + Initializes a new instance of the class, + using a constraint to be applied to the exception. + + A constraint to apply to the caught exception. + + + + Get the actual exception thrown - used by Assert.Throws. + + + + + Gets text describing a constraint + + + + + Executes the code of the delegate and captures any exception. + If a non-null base constraint was provided, it applies that + constraint to the exception. + + A delegate representing the code to be tested + True if an exception is thrown and the constraint succeeds, otherwise false + + + + Converts an ActualValueDelegate to a TestDelegate + before calling the primary overload. + + + + + + + Write the actual value for a failing constraint test to a + MessageWriter. This override only handles the special message + used when an exception is expected but none is thrown. + + The writer on which the actual value is displayed + + + + ThrowsExceptionConstraint tests that an exception has + been thrown, without any further tests. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Executes the code and returns success if an exception is thrown. + + A delegate representing the code to be tested + True if an exception is thrown, otherwise false + + + + Applies the constraint to an ActualValueDelegate that returns + the value to be tested. The default implementation simply evaluates + the delegate but derived classes may override it to provide for + delayed processing. + + + + + ThrowsNothingConstraint tests that a delegate does not + throw an exception. + + + + + Gets text describing a constraint + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True if no exception is thrown, otherwise false + + + + Applies the constraint to an ActualValueDelegate that returns + the value to be tested. The default implementation simply evaluates + the delegate but derived classes may override it to provide for + delayed processing. + + An ActualValueDelegate + A ConstraintResult + + + + The Tolerance class generalizes the notion of a tolerance + within which an equality test succeeds. Normally, it is + used with numeric types, but it can be used with any + type that supports taking a difference between two + objects and comparing that difference to a value. + + + + + Returns a default Tolerance object, equivalent to an exact match. + + + + + Returns an empty Tolerance object, equivalent to an exact match. + + + + + Constructs a linear tolerance of a specified amount + + + + + Constructs a tolerance given an amount and + + + + + Returns a new tolerance, using the current amount as a percentage. + + + + + Returns a new tolerance, using the current amount in Ulps + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of days. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of hours. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of minutes. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of seconds. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of milliseconds. + + + + + Returns a new tolerance with a as the amount, using + the current amount as a number of clock ticks. + + + + + Gets the for the current Tolerance + + + + + Gets the magnitude of the current Tolerance instance. + + + + + Returns true if the current tolerance has not been set or is using the . + + + + + Apply the tolerance to an expected value and return + a Tolerance.Range that represents the acceptable values. + + + + + Tests that the current Tolerance is linear with a + numeric value, throwing an exception if it is not. + + + + + Tolerance.Range represents the range of values that match + a specific tolerance, when applied to a specific value. + + + + + The lower bound of the range + + + + + The upper bound of the range + + + + + Constructs a range + + + + + Modes in which the tolerance value for a comparison can be interpreted. + + + + + The tolerance was created with a value, without specifying + how the value would be used. This is used to prevent setting + the mode more than once and is generally changed to Linear + upon execution of the test. + + + + + The tolerance is used as a numeric range within which + two compared values are considered to be equal. + + + + + Interprets the tolerance as the percentage by which + the two compared values my deviate from each other. + + + + + Compares two values based in their distance in + representable numbers. + + + + + TrueConstraint tests that the actual value is true + + + + + Initializes a new instance of the class. + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + TypeConstraint is the abstract base for constraints + that take a Type as their expected value. + + + + + The expected Type used by the constraint + + + + + The type of the actual argument to which the constraint was applied + + + + + Construct a TypeConstraint for a given Type + + The expected type for the constraint + Prefix used in forming the constraint description + + + + Applies the constraint to an actual value, returning a ConstraintResult. + + The value to be tested + A ConstraintResult + + + + Apply the constraint to an actual value, returning true if it succeeds + + The actual argument + True if the constraint succeeds, otherwise false. + + + + UniqueItemsConstraint tests whether all the items in a + collection are unique. + + + + + The Description of what this constraint tests, for + use in messages and in the ConstraintResult. + + + + + Check that all items are unique. + + + + + + + + + + XmlSerializableConstraint tests whether + an object is serializable in XML format. + + + + + Gets text describing a constraint + + + + + Test whether the constraint is satisfied by a given value + + The value to be tested + True for success, false for failure + + + + Returns the string representation of this constraint + + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a new checking for the + presence of a particular object in the collection. + + + + + Returns a new DictionaryContainsKeyConstraint checking for the + presence of a particular key in the dictionary. + + + + + Returns a new DictionaryContainsValueConstraint checking for the + presence of a particular value in the dictionary. + + + + + Returns a constraint that succeeds if the actual + value contains the substring supplied as an argument. + + + + + Asserts on Directories + + + + + DO NOT USE! Use DirectoryAssert.AreEqual(...) instead. + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both point to the same directory. + If they are not equal an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if the directories are not equal + Arguments to be used in formatting the message + + + + Verifies that two directories are equal. Two directories are considered + equal if both are null, or if both point to the same directory. + If they are not equal an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that two directories are not equal. If they are equal + an is thrown. + + A directory containing the value that is expected + A directory containing the actual value + + + + Asserts that the directory exists. If it does not exist + an is thrown. + + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory exists. If it does not exist + an is thrown. + + A directory containing the actual value + + + + Asserts that the directory exists. If it does not exist + an is thrown. + + The path to a directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory exists. If it does not exist + an is thrown. + + The path to a directory containing the actual value + + + + Asserts that the directory does not exist. If it does exist + an is thrown. + + A directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory does not exist. If it does exist + an is thrown. + + A directory containing the actual value + + + + Asserts that the directory does not exist. If it does exist + an is thrown. + + The path to a directory containing the actual value + The message to display if directories are not equal + Arguments to be used in formatting the message + + + + Asserts that the directory does not exist. If it does exist + an is thrown. + + The path to a directory containing the actual value + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a constraint that succeeds if the value + is a file or directory and it exists. + + + + + Returns a new checking for the + presence of a particular object in the collection. + + + + + Returns a new . This constraint + will, in turn, make use of the appropriate second-level + constraint, depending on the type of the actual argument. + This overload is only used if the item sought is a string, + since any other type implies that we are looking for a + collection member. + + + + + Returns a new DictionaryContainsKeyConstraint checking for the + presence of a particular key in the Dictionary key collection. + + The key to be matched in the Dictionary key collection + + + + Returns a new DictionaryContainsValueConstraint checking for the + presence of a particular value in the Dictionary value collection. + + The value to be matched in the Dictionary value collection + + + + Returns a constraint that succeeds if the actual + value starts with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value ends with the substring supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + Returns a constraint that succeeds if the actual + value matches the regular expression supplied as an argument. + + + + + If throws, returns "SomeException was thrown by the Exception.StackTrace + property." See also . + + + + + If throws, returns "SomeException was thrown by the Exception.Message + property." + + + + + If throws, returns "SomeException was thrown by the Exception.Data property." + + + + + Thrown when an assertion failed. + + + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + Thrown when an assertion failed. + + + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + Thrown when a test executes inconclusively. + + + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + Thrown when an assertion failed. + + + + + Construct based on the TestResult so far. This is the constructor + used normally, when exiting the multiple assert block with failures. + Not used internally but provided to facilitate debugging. + + + The current result, up to this point. The result is not used + internally by NUnit but is provided to facilitate debugging. + + + + + Serialization Constructor + + + + + Gets the provided by this exception. + + + + + Gets the of this test at the point the exception was thrown, + + + + + Abstract base for Exceptions that terminate a test and provide a ResultState. + + + + The error message that explains + the reason for the exception + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + Thrown when an assertion failed. + + + + + + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Gets the ResultState provided by this exception + + + + + Contains extension methods that do not require a special using directive. + + + + + Asserts on Files + + + + + DO NOT USE! Use FileAssert.AreEqual(...) instead. + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + Verifies that two Streams are equal. Two Streams are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The expected Stream + The actual Stream + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Verifies that two Streams are equal. Two Streams are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The expected Stream + The actual Stream + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A file containing the value that is expected + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + A file containing the value that is expected + A file containing the actual value + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Verifies that two files are equal. Two files are considered + equal if both are null, or if both have the same value byte for byte. + If they are not equal an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + + + + Asserts that two Streams are not equal. If they are equal + an is thrown. + + The expected Stream + The actual Stream + The message to be displayed when the two Stream are the same. + Arguments to be used in formatting the message + + + + Asserts that two Streams are not equal. If they are equal + an is thrown. + + The expected Stream + The actual Stream + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + A file containing the value that is expected + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + A file containing the value that is expected + A file containing the actual value + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that two files are not equal. If they are equal + an is thrown. + + The path to a file containing the value that is expected + The path to a file containing the actual value + + + + Asserts that the file exists. If it does not exist + an is thrown. + + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that the file exists. If it does not exist + an is thrown. + + A file containing the actual value + + + + Asserts that the file exists. If it does not exist + an is thrown. + + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that the file exists. If it does not exist + an is thrown. + + The path to a file containing the actual value + + + + Asserts that the file does not exist. If it does exist + an is thrown. + + A file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that the file does not exist. If it does exist + an is thrown. + + A file containing the actual value + + + + Asserts that the file does not exist. If it does exist + an is thrown. + + The path to a file containing the actual value + The message to display if Streams are not equal + Arguments to be used in formatting the message + + + + Asserts that the file does not exist. If it does exist + an is thrown. + + The path to a file containing the actual value + + + + Class used to guard against unexpected argument values + or operations by throwing an appropriate exception. + + + + + Throws an exception if an argument is null + + The value to be tested + The name of the argument + + + + Throws an exception if a string argument is null or empty + + The value to be tested + The name of the argument + + + + Throws an ArgumentOutOfRangeException if the specified condition is not met. + + The condition that must be met + The exception message to be used + The name of the argument + + + + Throws an ArgumentException if the specified condition is not met. + + The condition that must be met + The exception message to be used + The name of the argument + + + + Throws an InvalidOperationException if the specified condition is not met. + + The condition that must be met + The exception message to be used + + + + Throws an if the specified delegate is async void. + + + + + Throws an if the specified delegate is async void. + + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if at least one of them succeeds. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them fail. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding only if a specified number of them succeed. + + + + + Returns a which will apply + the following constraint to only one member of the collection, + and fail if none or more than one match occurs. + + + + + Returns a new PropertyConstraintExpression, which will either + test for the existence of the named property on the object + being tested or apply any following constraint to that property. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Length property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Count property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the Message property of the object being tested. + + + + + Returns a new ConstraintExpression, which will apply the following + constraint to the InnerException property of the object being tested. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new AttributeConstraint checking for the + presence of a particular attribute on an object. + + + + + Returns a new checking for the + presence of a particular object in the collection. + + + + + Returns a new IndexerConstraintExpression, which will + apply any following constraint to that indexer value. + + Index accessor values. + + + + The AssertionResult class represents the result of a single assertion. + + + + + Construct an AssertionResult + + + + The pass/fail status of the assertion + + + The message produced by the assertion, or null + + + The stack trace associated with the assertion, or null + + + Determines whether the specified object is equal to the current object. + The object to compare with the current object. + + + Indicates whether the current object is equal to another object of the same type. + An object to compare with this object. + + + Serves as the default hash function. + + + + ToString Override + + + + + AssertionStatus enumeration represents the possible outcomes of an assertion. + The order of definition is significant, higher level values override lower + ones in determining the overall result of a test. + + + + + An assumption failed + + + + + The assertion succeeded + + + + + A warning message was issued + + + + + The assertion failed + + + + + An unexpected exception was thrown + + + + + The IApplyToContext interface is implemented by attributes + that want to make changes to the execution context before + a test is run. + + + + + Apply changes to the execution context + + The execution context + + + + The IApplyToTest interface is implemented by self-applying + attributes that modify the state of a test in some way. + + + + + Modifies a test as defined for the specific attribute. + + The test to modify + + + + CombiningStrategy is the abstract base for classes that + know how to combine values provided for individual test + parameters to create a set of test cases. + + + + + Gets the test cases generated by the CombiningStrategy. + + The test cases. + + + + ICommandWrapper is implemented by attributes and other + objects able to wrap a TestCommand with another command. + + + Attributes or other objects should implement one of the + derived interfaces, rather than this one, since they + indicate in which part of the command chain the wrapper + should be applied. + + + + + Wrap a command and return the result. + + The command to be wrapped + The wrapped command + + + + Objects implementing this interface are used to wrap + the TestMethodCommand itself. They apply after SetUp + has been run and before TearDown. + + + + + Objects implementing this interface are used to wrap + the entire test, including SetUp and TearDown. + + + + + Objects implementing this interface are used to wrap + tests that can repeat. The implementing command is run once, + invoking the chained commands any number of times. + + + + + Any ITest that implements this interface is at a level that the implementing + class should be disposed at the end of the test run + + + + + The IFixtureBuilder interface is exposed by a class that knows how to + build test fixtures from a specified type. In general, it is exposed + by an attribute, but it may be implemented in a helper class used by the + attribute in some cases. + + + + + Builds any number of test fixtures from the specified type. + + The type info of the fixture to be used. + + + + The IFixtureBuilder2 interface extends IFixtureBuilder by allowing + use of a PreFilter, which is used to select methods as test cases. + + + + + Builds any number of test fixtures from the specified type. + + The type info of the fixture to be used. + PreFilter to be used to select methods. + + + + IImplyFixture is an empty marker interface used by attributes like + TestAttribute that cause the class where they are used to be treated + as a TestFixture even without a TestFixtureAttribute. + + Marker interfaces are not usually considered a good practice, but + we use it here to avoid cluttering the attribute hierarchy with + classes that don't contain any extra implementation. + + + + + The IMethodInfo class is used to encapsulate information + about a method in a platform-independent manner. + + + + + Gets the Type from which this method was reflected. + + + + + Gets the MethodInfo for this method. + + + + + Gets the name of the method. + + + + + Gets a value indicating whether the method is abstract. + + + + + Gets a value indicating whether the method is public. + + + + + Gets a value indicating whether the method is static. + + + + + Gets a value indicating whether the method contains unassigned generic type parameters. + + + + + Gets a value indicating whether the method is a generic method. + + + + + Gets a value indicating whether the MethodInfo represents the definition of a generic method. + + + + + Gets the return Type of the method. + + + + + Gets the parameters of the method. + + + + + + Returns the Type arguments of a generic method or the Type parameters of a generic method definition. + + + + + Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. + + The type arguments to be used + A new IMethodInfo with the type arguments replaced + + + + Invokes the method, converting any TargetInvocationException to an NUnitException. + + The object on which to invoke the method + The argument list for the method + The return value from the invoked method + + + + Provides data for a single test parameter. + + + + + Determines whether any data is available for a parameter. + + The parameter of a parameterized test. + + + + Retrieves a list of arguments which can be passed to the specified parameter. + + The parameter of a parameterized test. + + + + Provides data for a single test parameter. + + + + + Retrieves a list of arguments which can be passed to the specified parameter. + + The parameter of a parameterized test. + + + + The IParameterInfo interface is an abstraction of a .NET parameter. + + + + + Gets a value indicating whether the parameter is optional + + + + + Gets an IMethodInfo representing the method for which this is a parameter + + + + + Gets the underlying .NET ParameterInfo + + + + + Gets the Type of the parameter + + + + + Implemented by filters for use in deciding which + Types and Methods should be used to generate tests. + + + + + Use the filter on a Type, returning true if the type matches the filter + and should therefore be included in the discovery process. + + + + + Use the filter on a Type, returning true if the type matches the filter + and should therefore be included in the discovery process. + + + + + A PropertyBag represents a collection of name/value pairs + that allows duplicate entries with the same key. Methods + are provided for adding a new pair as well as for setting + a key to a single value. All keys are strings but values + may be of any type. Null values are not permitted, since + a null entry represents the absence of the key. + + The entries in a PropertyBag are of two kinds: those that + take a single value and those that take multiple values. + However, the PropertyBag has no knowledge of which entries + fall into each category and the distinction is entirely + up to the code using the PropertyBag. + + When working with multi-valued properties, client code + should use the Add method to add name/value pairs and + indexing to retrieve a list of all values for a given + key. For example: + + bag.Add("Tag", "one"); + bag.Add("Tag", "two"); + Assert.That(bag["Tag"], + Is.EqualTo(new string[] { "one", "two" })); + + When working with single-valued properties, client code + should use the Set method to set the value and Get to + retrieve the value. The GetSetting methods may also be + used to retrieve the value in a type-safe manner while + also providing default. For example: + + bag.Set("Priority", "low"); + bag.Set("Priority", "high"); // replaces value + Assert.That(bag.Get("Priority"), + Is.EqualTo("high")); + Assert.That(bag.GetSetting("Priority", "low"), + Is.EqualTo("high")); + + + + + Adds a key/value pair to the property bag + + The key + The value + + + + Sets the value for a key, removing any other + values that are already in the property set. + + + + + + + Gets a single value for a key, using the first + one if multiple values are present and returning + null if the value is not found. + + + + + Gets a flag indicating whether the specified key has + any entries in the property set. + + The key to be checked + True if their are values present, otherwise false + + + + Gets or sets the list of values for a particular key + + The key for which the values are to be retrieved or set + + + + Gets a collection containing all the keys in the property set + + + + + The IReflectionInfo interface is implemented by NUnit wrapper objects that perform reflection. + + + + + Returns an array of custom attributes of the specified type applied to this object + + + + + Returns a value indicating whether an attribute of the specified type is defined on this object. + + + + + The ISimpleTestBuilder interface is exposed by a class that knows how to + build a single tests from a specified method. In general, + it is exposed by an attribute, but it may be implemented in a helper class + used by the attribute in some cases. + + + + + Builds a single test from the specified method and context. + + The method to be used as a test + The TestSuite to which the method will be added + + + + The ISuiteBuilder interface is exposed by a class that knows how to + build a single test suite from a specified type. + + + + + Examine the type and determine if it is suitable for + this builder to use in building a TestSuite. + + Note that returning false will cause the type to be ignored + in loading the tests. If it is desired to load the suite + but label it as non-runnable, ignored, etc., then this + method must return true. + + The type of the fixture to be used + + + + Builds a single test suite from the specified type. + + The type of the fixture to be used + + + + Builds a single test suite from the specified type, subject + to a filter that decides which methods are included. + + The type of the fixture to be used + A PreFilter for selecting methods. + + + + Common interface supported by all representations + of a test. Only includes informational fields. + The Run method is specifically excluded to allow + for data-only representations of a test. + + + + + Gets the id of the test + + + + + Gets the name of the test + + + + + Gets the type of the test + + + + + Gets the fully qualified name of the test + + + + + Gets the name of the class containing this test. Returns + null if the test is not associated with a class. + + + + + Gets the name of the method implementing this test. + Returns null if the test is not implemented as a method. + + + + + Gets the Type of the test fixture, if applicable, or + null if no fixture type is associated with this test. + + + + + Gets the method which declares the test, or + if no method is associated with this test. + + + + + Gets the RunState of the test, indicating whether it can be run. + + + + + Count of the test cases ( 1 if this is a test case ) + + + + + Gets the properties of the test + + + + + Gets the parent test, if any. + + The parent test or null if none exists. + + + + Returns true if this is a test suite + + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Gets this test's child tests + + A list of child tests + + + + Gets a fixture object for running this test. + + + + + The arguments to use in creating the test or empty array if none are required. + + + + + The ITestBuilder interface is exposed by a class that knows how to + build tests from a specified method. In general, it is exposed + by an attribute which has additional information available to provide + the necessary test parameters to distinguish the test cases built. + + + + + Builds any number of tests from the specified method and context. + + The method to be used as a test + The TestSuite to which the method will be added + + + + The ITestCaseBuilder interface is exposed by a class that knows how to + build a test from a specified method, possibly containing child test cases. + + + + + Examine the method and determine if it is suitable for + this builder to use in building a TestCase to be + included in the suite being populated. + + Note that returning false will cause the method to be ignored + in loading the tests. If it is desired to load the method + but label it as non-runnable, ignored, etc., then this + method must return true. + + The test method to examine + The suite being populated + + + + Builds a single test from the specified method and context, + possibly containing child test cases. + + The method to be used as a test case + The test suite being populated, or null + + + + The ITestCaseData interface is implemented by a class + that is able to return complete test cases for use by + a parameterized test method. + + + + + Gets the expected result of the test case + + + + + Returns true if an expected result has been set + + + + + The ITestData interface is implemented by a class that + represents a single instance of a parameterized test. + + + + + Gets the name to be used for the test + + + + + Gets the RunState for this test case. + + + + + Gets the argument list to be provided to the test + + + + + Gets the property dictionary for the test case + + + + + Interface to be implemented by filters applied to tests. + The filter applies when running the test, after it has been + loaded, since this is the only time an ITest exists. + + + + + Determine if a particular test passes the filter criteria. Pass + may examine the parents and/or descendants of a test, depending + on the semantics of the particular filter + + The test to which the filter is applied + True if the test passes the filter, otherwise false + + + + Determine if a test matches the filter explicitly. That is, it must + be a direct match of the test itself or one of its children. + + The test to which the filter is applied + True if the test matches the filter explicitly, otherwise false + + + + The ITestCaseData interface is implemented by a class + that is able to return the data required to create an + instance of a parameterized test fixture. + + + + + Get the TypeArgs if separately set + + + + + The ITestListener interface is used internally to receive + notifications of significant events while a test is being + run. The events are propagated to clients by means of an + AsyncCallback. NUnit extensions may also monitor these events. + + + + + Called when a test has just started + + The test that is starting + + + + Called when a test has finished + + The result of the test + + + + Called when a test produces output for immediate display + + A TestOutput object containing the text to display + + + + Called when a test produces a message to be sent to listeners + + A object containing the text to send + + + + The ITestResult interface represents the result of a test. + + + + + Gets the ResultState of the test result, which + indicates the success or failure of the test. + + + + + Gets the name of the test result + + + + + Gets the full name of the test result + + + + + Gets the elapsed time for running the test in seconds + + + + + Gets or sets the time the test started running. + + + + + Gets or sets the time the test finished running. + + + + + Gets the message associated with a test + failure or with not running the test + + + + + Gets any stack trace associated with an + error or failure. + + + + Gets the total number of tests executed + when running the test and all its children. + + + + + Gets the number of asserts executed + when running the test and all its children. + + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that had warnings + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + Accessing HasChildren should not force creation of the + Children collection in classes implementing this interface. + + + + + Gets the collection of child results. + + + + + Gets the Test to which this result applies. + + + + + Gets any text output written to this result. + + + + + Gets a list of AssertionResults associated with the test + + + + + Gets the collection of files attached to the test + + + + + The ITypeInfo interface is an abstraction of a .NET Type + + + + + Gets the underlying Type on which this ITypeInfo is based + + + + + Gets the base type of this type as an ITypeInfo + + + + + Returns true if the Type wrapped is equal to the argument + + + + + Gets the name of the Type + + + + + Gets the full name of the Type + + + + + Gets the assembly in which the type is declared + + + + + Gets the namespace of the Type + + + + + Gets a value indicating whether the type is abstract. + + + + + Gets a value indicating whether the Type is a generic Type + + + + + Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. + + + + + Gets a value indicating whether the Type is a generic Type definition + + + + + Gets a value indicating whether the type is sealed. + + + + + Gets a value indicating whether this type is a static class. + + + + + Get the display name for this typeInfo. + + + + + Get the display name for an object of this type, constructed with specific arguments + + + + + Returns a Type representing a generic type definition from which this Type can be constructed. + + + + + Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments + + + + + Returns a value indicating whether this type has a method with a specified public attribute + + + + + Returns an array of IMethodInfos for methods of this Type + that match the specified flags. + + + + + Gets the public constructor taking the specified argument Types + + + + + Returns a value indicating whether this Type has a public constructor taking the specified argument Types. + + + + + Construct an object of this Type, using the specified arguments. + + + + + Returns all methods declared by this type that have the specified attribute, optionally + including base classes. Methods from a base class are always returned before methods from a class that + inherits from it. + + Specifies whether to search the fixture type inheritance chain. + + + + An object implementing IXmlNodeBuilder is able to build + an XML representation of itself and any children. + + + + + Returns a TNode representing the current object. + + If true, children are included where applicable + A TNode representing the result + + + + Returns a TNode representing the current object after + adding it as a child of the supplied parent node. + + The parent node. + If true, children are included, where applicable + + + + + The ResultState class represents the outcome of running a test. + It contains two pieces of information. The Status of the test + is an enum indicating whether the test passed, failed, was + skipped or was inconclusive. The Label provides a more + detailed breakdown for use by client runners. + + + + + Initializes a new instance of the class. + + The TestStatus. + + + + Initializes a new instance of the class. + + The TestStatus. + The label. + + + + Initializes a new instance of the class. + + The TestStatus. + The stage at which the result was produced + + + + Initializes a new instance of the class. + + The TestStatus. + The label. + The stage at which the result was produced + + + + The result is inconclusive + + + + + The test has been skipped. + + + + + The test has been ignored. + + + + + The test was skipped because it is explicit + + + + + The test succeeded + + + + + The test issued a warning + + + + + The test failed + + + + + The test encountered an unexpected exception + + + + + The test was cancelled by the user + + + + + The test was not runnable. + + + + + A suite failed because one or more child tests failed or had errors + + + + + A suite failed because one or more child tests had warnings + + + + + A suite is marked ignored because one or more child tests were ignored + + + + + A suite failed in its OneTimeSetUp + + + + + A suite had an unexpected exception in its OneTimeSetUp + + + + + A suite had an unexpected exception in its OneTimeDown + + + + + Gets the TestStatus for the test. + + The status. + + + + Gets the label under which this test result is + categorized, or if none. + + + + + Gets the stage of test execution in which + the failure or other result took place. + + + + + Get a new ResultState, which is the same as the current + one but with the FailureSite set to the specified value. + + The FailureSite to use + A new ResultState + + + + Test whether this ResultState has the same Status and Label + as another one. In other words, the whether two are equal + ignoring the Site. + + + + + + Determines whether the specified object is equal to the current object. + The object to compare with the current object. + + + Indicates whether the current object is equal to another object of the same type. + An object to compare with this object. + + + Serves as the default hash function. + + + + Overload == operator for ResultStates + + + + + Overload != operator for ResultStates + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + The FailureSite enum indicates the stage of a test + in which an error or failure occurred. + + + + + Failure in the test itself + + + + + Failure in the SetUp method + + + + + Failure in the TearDown method + + + + + Failure of a parent test + + + + + Failure of a child test + + + + + The RunState enum indicates whether a test can be executed. + + + + + The test is not runnable. + + + + + The test is runnable. + + + + + The test can only be run explicitly + + + + + The test has been skipped. This value may + appear on a Test when certain attributes + are used to skip the test. + + + + + The test has been ignored. May appear on + a Test, when the IgnoreAttribute is used. + + + + + The TestAttachment class represents a file attached to a TestResult, + with an optional description. + + + + + Absolute file path to attachment file + + + + + User specified description of attachment. May be null. + + + + + Creates a TestAttachment class to represent a file attached to a test result. + + Absolute file path to attachment file + User specified description of attachment. May be null. + + + + The class holds a message sent by a test to all listeners + + + + + Construct with text, destination type and + the name of the test that produced the message. + + Destination of the message + Text to be sent + ID of the test that produced the message + + + + Converts object to string + + + + + The message to send to listeners + + + + + The Destination of the message. + + + + + The ID of the test that sent the message + + + + + Returns the XML representation of the object. + + + + + The TestOutput class holds a unit of output from + a test to a specific output stream + + + + + Construct with text, output destination type and + the name of the test that produced the output. + + Text to be output + Name of the stream or channel to which the text should be written + Id of the test that produced the output + FullName of test that produced the output + + + + Return string representation of the object for debugging + + + + + + Get the text + + + + + Get the output type + + + + + Get the name of the test that created the output + + + + + Get the id of the test that created the output + + + + + Convert the TestOutput object to an XML string + + + + + The TestStatus enum indicates the result of running a test + + + + + The test was inconclusive + + + + + The test has skipped + + + + + The test succeeded + + + + + There was a warning + + + + + The test failed + + + + + TNode represents a single node in the XML representation + of a Test or TestResult. It replaces System.Xml.XmlNode and + System.Xml.Linq.XElement, providing a minimal set of methods + for operating on the XML in a platform-independent manner. + + + + + Constructs a new instance of TNode + + The name of the node + + + + Constructs a new instance of TNode with a value + + The name of the node + The text content of the node + + + + Constructs a new instance of TNode with a value + + The name of the node + The text content of the node + Flag indicating whether to use CDATA when writing the text + + + + Gets the name of the node + + + + + Gets the value of the node + + + + + Gets a flag indicating whether the value should be output using CDATA. + + + + + Gets the dictionary of attributes + + + + + Gets a list of child nodes + + + + + Gets the first ChildNode + + + + + Gets the XML representation of this node. + + + + + Create a TNode from its XML text representation + + The XML text to be parsed + A TNode + + + + Adds a new element as a child of the current node and returns it. + + The element name. + The newly created child element + + + + Adds a new element with a value as a child of the current node and returns it. + + The element name + The text content of the new element + The newly created child element + + + + Adds a new element with a value as a child of the current node and returns it. + The value will be output using a CDATA section. + + The element name + The text content of the new element + The newly created child element + + + + Adds an attribute with a specified name and value to the XmlNode. + + The name of the attribute. + The value of the attribute. + + + + Finds a single descendant of this node matching an XPath + specification. The format of the specification is + limited to what is needed by NUnit and its tests. + + + + + + + Finds all descendants of this node matching an XPath + specification. The format of the specification is + limited to what is needed by NUnit and its tests. + + + + + Writes the XML representation of the node to an XmlWriter + + + + + + Class used to represent a list of XmlResults + + + + + Class used to represent the attributes of a node + + + + + Gets or sets the value associated with the specified key. + Overridden to return null if attribute is not found. + + The key. + Value of the attribute or null + + + + A production implementation that delegates directly to .NET's . + + + + + Returns whether a debugger is currently attached to the process + + + + + A layer of abstraction around to facilitate testing. + + + + + Whether a debugger is currently attached to the process. + + + + + AssemblyHelper provides static methods for working + with assemblies. + + + + + Gets the path from which an assembly was loaded. + For builds where this is not possible, returns + the name of the assembly. + + The assembly. + The path. + + + + Gets the path to the directory from which an assembly was loaded. + + The assembly. + The path. + + + + Gets the AssemblyName of an assembly. + + The assembly + An AssemblyName + + + + Loads an assembly given a string, which is the AssemblyName + + + + + Gets the assembly path from code base. + + Public for testing purposes + The code base. + + + + + Adapts various styles of asynchronous waiting to a common API. + + + + + CombinatorialStrategy creates test cases by using all possible + combinations of the parameter data. + + + + + Gets the test cases generated by the CombiningStrategy. + + The test cases. + + + + Provides data from fields marked with the DatapointAttribute or the + DatapointsAttribute. + + + + + Determines whether any data is available for a parameter. + + The parameter of a parameterized test + + + + Retrieves data for use with the supplied parameter. + + The parameter of a parameterized test + + + + Built-in SuiteBuilder for all types of test classes. + + + + + Examine the type and determine if it is suitable for + this builder to use in building a TestSuite. + + Note that returning false will cause the type to be ignored + in loading the tests. If it is desired to load the suite + but label it as non-runnable, ignored, etc., then this + method must return true. + + The fixture type to check + + + + Builds a single test suite from the specified type. + + The fixture type to build + + + + Builds a single test suite from the specified type, subject + to a filter that decides which methods are included. + + The fixture type to build + A PreFilter for selecting methods. + + + + We look for attributes implementing IFixtureBuilder at one level + of inheritance at a time. Attributes on base classes are not used + unless there are no fixture builder attributes at all on the derived + class. This is by design. + + The type being examined for attributes + + + + Class to build ether a parameterized or a normal NUnitTestMethod. + There are four cases that the builder must deal with: + 1. The method needs no params and none are provided + 2. The method needs params and they are provided + 3. The method needs no params but they are provided in error + 4. The method needs params but they are not provided + This could have been done using two different builders, but it + turned out to be simpler to have just one. The BuildFrom method + takes a different branch depending on whether any parameters are + provided, but all four cases are dealt with in lower-level methods + + + + + Determines if the method can be used to build an NUnit test + test method of some kind. The method must normally be marked + with an identifying attribute for this to be true. + + Note that this method does not check that the signature + of the method for validity. If we did that here, any + test methods with invalid signatures would be passed + over in silence in the test run. Since we want such + methods to be reported, the check for validity is made + in BuildFrom rather than here. + + An IMethodInfo for the method being used as a test method + + + + Builds a single test from the specified method and context, + possibly containing child test cases. + + The method for which a test is to be built + + + + Determines if the method can be used to build an NUnit test + test method of some kind. The method must normally be marked + with an identifying attribute for this to be true. + + Note that this method does not check that the signature + of the method for validity. If we did that here, any + test methods with invalid signatures would be passed + over in silence in the test run. Since we want such + methods to be reported, the check for validity is made + in BuildFrom rather than here. + + An IMethodInfo for the method being used as a test method + The test suite being built, to which the new test would be added + + + + Builds a single test from the specified method and context, + possibly containing child test cases. + + The method for which a test is to be built + The test fixture being populated, or null + + + + Builds a ParameterizedMethodSuite containing individual test cases. + + The method for which a test is to be built. + The list of test cases to include. + + + + Build a simple, non-parameterized TestMethod for this method. + + The MethodInfo for which a test is to be built + The test suite for which the method is being built + + + + Caches static information for IMethodInfo to reduce re-calculations and memory allocations from reflection. + + + + + Returns cached metadata for method instance. + + + + + Memoization of TestMethod information to reduce subsequent allocations from parameter and attribute information. + + + + + Class that can build a tree of automatic namespace + suites from a group of fixtures. + + + + + NamespaceDictionary of all test suites we have created to represent + namespaces. Used to locate namespace parent suites for fixtures. + + + + + Point in the tree where items in the global namespace are added + + + + + Initializes a new instance of the class. + + The root suite. + + + + Gets the root entry in the tree created by the NamespaceTreeBuilder. + + The root suite. + + + + Adds the specified fixtures to the tree. + + The fixtures to be added. + + + + Adds the specified fixture to the tree. + + The fixture to be added. + + + + NUnitTestCaseBuilder is a utility class used by attributes + that build test cases. + + + + + Constructs an + + + + + Builds a single NUnitTestMethod, either as a child of the fixture + or as one of a set of test cases under a ParameterizedTestMethodSuite. + + The MethodInfo from which to construct the TestMethod + The suite or fixture to which the new test will be added + The ParameterSet to be used, or null + + + + Checks to see if we have valid combinations of attributes. + + The TestMethod to be checked. If it + is found to be non-runnable, it will be modified. + Metadata for this TestMethod. + True if the method signature is valid, false if not + + + + Helper method that checks the signature of a TestMethod and + any supplied parameters to determine if the test is valid. + + Currently, NUnitTestMethods are required to be public, + non-abstract methods, either static or instance, + returning void. They may take arguments but the values must + be provided or the TestMethod is not considered runnable. + + Methods not meeting these criteria will be marked as + non-runnable and the method will return false in that case. + + The TestMethod to be checked. If it + is found to be non-runnable, it will be modified. + Metadata for this TestMethod. + Parameters to be used for this test, or null + True if the method signature is valid, false if not + + The return value is no longer used internally, but is retained + for testing purposes. + + + + + NUnitTestFixtureBuilder is able to build a fixture given + a class marked with a TestFixtureAttribute or an unmarked + class containing test methods. In the first case, it is + called by the attribute and in the second directly by + NUnitSuiteBuilder. + + + + + Build a TestFixture from type provided. A non-null TestSuite + must always be returned, since the method is generally called + because the user has marked the target class as a fixture. + If something prevents the fixture from being used, it should + be returned nonetheless, labeled as non-runnable. + + An ITypeInfo for the fixture to be used. + Filter used to select methods as tests. + A TestSuite object or one derived from TestSuite. + + + + Overload of BuildFrom called by tests that have arguments. + Builds a fixture using the provided type and information + in the ITestFixtureData object. + + The TypeInfo for which to construct a fixture. + Filter used to select methods as tests. + An object implementing ITestFixtureData or null. + + + + + Method to add test cases to the newly constructed fixture. + + + + + Method to create a test case from a MethodInfo and add + it to the fixture being built. It first checks to see if + any global TestCaseBuilder addin wants to build the + test case. If not, it uses the internal builder + collection maintained by this fixture builder. + + The default implementation has no test case builders. + Derived classes should add builders to the collection + in their constructor. + + The method for which a test is to be created + The test suite being built. + A newly constructed Test + + + + PairwiseStrategy creates test cases by combining the parameter + data so that all possible pairs of data items are used. + + + + The number of test cases that cover all possible pairs of test function + parameters values is significantly less than the number of test cases + that cover all possible combination of test function parameters values. + And because different studies show that most of software failures are + caused by combination of no more than two parameters, pairwise testing + can be an effective ways to test the system when it's impossible to test + all combinations of parameters. + + + The PairwiseStrategy code is based on "jenny" tool by Bob Jenkins: + https://burtleburtle.net/bob/math/jenny.html + + + + + + FleaRand is a pseudo-random number generator developed by Bob Jenkins: + https://burtleburtle.net/bob/rand/talksmall.html#flea + + + + + Initializes a new instance of the FleaRand class. + + The seed. + + + + FeatureInfo represents coverage of a single value of test function + parameter, represented as a pair of indices, Dimension and Feature. In + terms of unit testing, Dimension is the index of the test parameter and + Feature is the index of the supplied value in that parameter's list of + sources. + + + + + Initializes a new instance of FeatureInfo class. + + Index of a dimension. + Index of a feature. + + + + A FeatureTuple represents a combination of features, one per test + parameter, which should be covered by a test case. In the + PairwiseStrategy, we are only trying to cover pairs of features, so the + tuples actually may contain only single feature or pair of features, but + the algorithm itself works with triplets, quadruples and so on. + + + + + Initializes a new instance of FeatureTuple class for a single feature. + + Single feature. + + + + Initializes a new instance of FeatureTuple class for a pair of features. + + First feature. + Second feature. + + + + TestCase represents a single test case covering a list of features. + + + + + Initializes a new instance of TestCaseInfo class. + + A number of features in the test case. + + + + PairwiseTestCaseGenerator class implements an algorithm which generates + a set of test cases which covers all pairs of possible values of test + function. + + + + The algorithm starts with creating a set of all feature tuples which we + will try to cover (see method). This set + includes every single feature and all possible pairs of features. We + store feature tuples in the 3-D collection (where axes are "dimension", + "feature", and "all combinations which includes this feature"), and for + every two feature (e.g. "A" and "B") we generate both ("A", "B") and + ("B", "A") pairs. This data structure extremely reduces the amount of + time needed to calculate coverage for a single test case (this + calculation is the most time-consuming part of the algorithm). + + + Then the algorithm picks one tuple from the uncovered tuple, creates a + test case that covers this tuple, and then removes this tuple and all + other tuples covered by this test case from the collection of uncovered + tuples. + + + Picking a tuple to cover + + + There are no any special rules defined for picking tuples to cover. We + just pick them one by one, in the order they were generated. + + + Test generation + + + Test generation starts from creating a completely random test case which + covers, nevertheless, previously selected tuple. Then the algorithm + tries to maximize number of tuples which this test covers. + + + Test generation and maximization process repeats seven times for every + selected tuple and then the algorithm picks the best test case ("seven" + is a magic number which provides good results in acceptable time). + + Maximizing test coverage + + To maximize tests coverage, the algorithm walks through the list of mutable + dimensions (mutable dimension is a dimension that are not included in + the previously selected tuple). Then for every dimension, the algorithm + walks through the list of features and checks if this feature provides + better coverage than randomly selected feature, and if yes keeps this + feature. + + + This process repeats while it shows progress. If the last iteration + doesn't improve coverage, the process ends. + + + In addition, for better results, before start every iteration, the + algorithm "scrambles" dimensions - so for every iteration dimension + probes in a different order. + + + + + + Creates a set of test cases for specified dimensions. + + + An array which contains information about dimensions. Each element of + this array represents a number of features in the specific dimension. + + + A set of test cases. + + + + + Gets the test cases generated by this strategy instance. + + A set of test cases. + + + + The ParameterDataProvider class implements IParameterDataProvider + and hosts one or more individual providers. + + + + + Construct with a collection of individual providers + + + + + Determines whether any data is available for a parameter. + + The parameter of a parameterized test + + + + Retrieves data for use with the supplied parameter. + + The parameter of a parameterized test + + + + ParameterDataSourceProvider supplies individual argument values for + single parameters using attributes implementing IParameterDataSource. + + + + + Determines whether any data is available for a parameter. + + The parameter of a parameterized test + + + + Retrieves data for use with the supplied parameter. + + The parameter of a parameterized test + + + + SequentialStrategy creates test cases by using all of the + parameter data sources in parallel, substituting + when any of them run out of data. + + + + + Gets the test cases generated by the CombiningStrategy. + + The test cases. + + + + TestActionAfterCommand handles the AfterTest method of a single + TestActionItem, provided the items BeforeTest has been run. + + + + + Initializes a new instance of the class. + + The inner command. + The TestActionItem to run before the inner command. + + + + AfterCommand is a DelegatingTestCommand that performs some + specific action after the inner command is run. + + + + + Construct an AfterCommand + + + + + Execute the command + + + + + Set this to perform action after the inner command. + + + + + ContextSettingsCommand applies specified changes to the + TestExecutionContext prior to running a test. No special + action is needed after the test runs, since the prior + context will be restored automatically. + + + + + TestActionCommand handles a single ITestAction applied + to a test. It runs the BeforeTest method, then runs the + test and finally runs the AfterTest method. + + + + + Initializes a new instance of the class. + + The inner command. + + + + Runs the test, saving a TestResult in the supplied TestExecutionContext. + + The context in which the test should run. + A TestResult + + + + Perform the before test action + + + + + Perform the after test action + + + + + TestActionBeforeCommand handles the BeforeTest method of a single + TestActionItem, relying on the item to remember it has been run. + + + + + Initializes a new instance of the class. + + The inner command. + The TestActionItem to run before the inner command. + + + + BeforeTestCommand is a DelegatingTestCommand that performs some + specific action before the inner command is run. + + + + + Construct a BeforeCommand + + + + + Execute the command + + + + + Action to perform before the inner command. + + + + + ConstructFixtureCommand constructs the user test object if necessary. + + + + + Constructs a OneTimeSetUpCommand for a suite + + The inner command to which the command applies + + + + DelegatingTestCommand wraps an inner TestCommand. + Derived classes may do what they like before or + after running the inner command. + + + + TODO: Documentation needed for field + + + + Initializes a new instance of the class. + + The inner command. + + + + Runs the test with exception handling. + + + + + OneTimeTearDownCommand performs any teardown actions + specified for a suite and calls Dispose on the user + test object, if any. + + + + + Construct a OneTimeTearDownCommand + + The command wrapped by this command + + + + EmptyTestCommand is a TestCommand that does nothing. It simply + returns the current result from the context when executed. We + use it to avoid testing for null when executing a chain of + DelegatingTestCommands. + + + + + Construct a NullCommand for a test + + + + + Execute the command + + + + + ConstructFixtureCommand constructs the user test object if necessary. + + + + + Handles the construction and disposement of a fixture per test case + + The inner command to which the command applies + + + + adjusts the result of a successful test + to a failure if the elapsed time has exceeded the specified maximum + time allowed. + + + + + Initializes a new instance of the class. + + The inner command. + The max time allowed in milliseconds + + + + OneTimeSetUpCommand runs any one-time setup methods for a suite, + constructing the user test object if necessary. + + + + + Constructs a OneTimeSetUpCommand for a suite + + The inner command to which the command applies + A SetUpTearDownList for use by the command + + + + OneTimeTearDownCommand performs any teardown actions + specified for a suite and calls Dispose on the user + test object, if any. + + + + + Construct a OneTimeTearDownCommand + + The command wrapped by this command + A SetUpTearDownList for use by the command + + + + SetUpTearDownCommand runs SetUp methods for a suite, + runs the test and then runs TearDown methods. + + + + + Initializes a new instance of the class. + + The inner command. + List of setup/teardown items + + + + SetUpTearDownItem holds the setup and teardown methods + for a single level of the inheritance hierarchy. + + + + + Construct a SetUpTearDownNode + + A list of setup methods for this level + A list teardown methods for this level + A method validator to validate each method before calling. + + + + Returns true if this level has any methods at all. + This flag is used to discard levels that do nothing. + + + + + Run SetUp on this level. + + The execution context to use for running. + + + + Run TearDown for this level. + + + + + + TODO: Documentation needed for class + + + + + Initializes a new instance of the class. + + The test being skipped. + + + + Overridden to simply set the CurrentResult to the + appropriate Skipped state. + + The execution context for the test + A TestResult + + + + TestActionCommand handles a single ITestAction applied + to a test. It runs the BeforeTest method, then runs the + test and finally runs the AfterTest method. + + + + + Initializes a new instance of the class. + + The inner command. + The TestAction with which to wrap the inner command. + + + + TestActionItem wraps a single execution of an ITestAction. + Its primary purpose is to track whether the BeforeTest + method has been called and suppress calling the + AfterTest method if it has not. This is necessary when + ITestActions are used before and after a CompositeWorkItem, + since the OneTimeSetUpCommand and OneTimeTearDownCommand + are separate command chains. By sharing a TestActionItem + between the setup and teardown chains, the two calls can + be coordinated. + + + + + Construct a TestActionItem + + The ITestAction to be included + + + + Get flag indicating if the BeforeTest entry was already called. + + + + + Run the BeforeTest method of the action and remember that it has been run. + + The test to which the action applies + + + + Run the AfterTest action, but only if the BeforeTest + action was actually run. + + The test to which the action applies + + + + TestCommand is the abstract base class for all test commands + in the framework. A TestCommand represents a single stage in + the execution of a test, e.g.: SetUp/TearDown, checking for + Timeout, verifying the returned result from a method, etc. + + TestCommands may decorate other test commands so that the + execution of a lower-level command is nested within that + of a higher level command. All nested commands are executed + synchronously, as a single unit. Scheduling test execution + on separate threads is handled at a higher level, using the + task dispatcher. + + + + + Construct a TestCommand for a test. + + The test to be executed + + + + Gets the test associated with this command. + + + + + Runs the test in a specified context, returning a TestResult. + + The TestExecutionContext to be used for running the test. + A TestResult + + + + TestMethodCommand is the lowest level concrete command + used to run actual test cases. + + + + + Initializes a new instance of the class. + + The test. + + + + Runs the test, saving a TestResult in the execution context, as + well as returning it. If the test has an expected result, it + is asserts on that value. Since failed tests and errors throw + an exception, this command must be wrapped in an outer command, + will handle that exception and records the failure. This role + is usually played by the SetUpTearDown command. + + The execution context + + + + TheoryResultCommand adjusts the result of a Theory so that + it fails if all the results were inconclusive. + + + + + Constructs a TheoryResultCommand + + The command to be wrapped by this one + + + + creates a timer in order to cancel + a test if it exceeds a specified time and adjusts + the test result if it did time out. + + + + + Initializes a new instance of the class. + + The inner command + Timeout value + + + + Initializes a new instance of the class. + + The inner command + Timeout value + An instance + + + + Runs the test, saving a TestResult in the supplied TestExecutionContext. + + The context in which the test should run. + A TestResult + + + + Provides methods to support consistent checking in constraints. + + + + + Requires that the provided object is actually of the type required. + + The object to verify. + Name of the parameter as passed into the checking method. + + If and can be null, returns null rather than throwing when is null. + If cannot be null, this parameter is ignored. + The type to require. + + + + CultureDetector is a helper class used by NUnit to determine + whether a test should be run based on the current culture. + + + + + Default constructor uses the current culture. + + + + + Construct a CultureDetector for a particular culture for testing. + + The culture to be used + + + + Test to determine if one of a collection of cultures + is being used currently. + + + + + + + Tests to determine if the current culture is supported + based on a culture attribute. + + The attribute to examine + + + + + Test to determine if the a particular culture or comma- + delimited set of cultures is in use. + + Name of the culture or comma-separated list of culture ids + True if the culture is in use on the system + + + + Return the last failure reason. Results are not + defined if called before IsSupported( Attribute ) + is called. + + + + + Useful when wrapping awaiters whose GetResult method does not block until complete. + Contains a default mechanism to implement + via and . + + + + + ExceptionHelper provides static methods for working with exceptions + + + + + Rethrows an exception, preserving its stack trace + + The exception to rethrow + + + + Builds up a message, using the Message field of the specified exception + as well as any InnerExceptions. Optionally excludes exception names, + creating a more readable message. + + The exception. + Flag indicating whether exception names should be excluded. + A combined message string. + + + + Builds up a message, using the Message field of the specified exception + as well as any InnerExceptions. + + The exception. + A combined stack trace. + + + + Executes a parameterless synchronous or async delegate and returns the exception it throws, if any. + + + + + A CompositeWorkItem represents a test suite and + encapsulates the execution of the suite as well + as all its child tests. + + + + + List of Child WorkItems + + + + + Indicates whether this work item should use a separate dispatcher. + + + + + Construct a CompositeWorkItem for executing a test suite + using a filter to select child tests. + + The TestSuite to be executed + A filter used to select child tests + + + + Method that actually performs the work. Overridden + in CompositeWorkItem to do one-time setup, run all child + items and then dispatch the one-time teardown work item. + + + + + + + + + + Cancel (abort or stop) a CompositeWorkItem and all of its children + + true if the CompositeWorkItem and all of its children should be aborted, false if it should allow all currently running tests to complete + + + + OneTimeTearDownWorkItem represents the cleanup + and one-time teardown phase of a CompositeWorkItem + + + + + Construct a OneTimeTearDownWOrkItem wrapping a CompositeWorkItem + + The CompositeWorkItem being wrapped + + + + The WorkItem name, overridden to indicate this is the teardown. + + + + + The ExecutionStrategy for use in running this work item + + + + + + + + + + PerformWork is not used in CompositeWorkItem + + + + + WorkItemCancelled is called directly by the parallel dispatcher + when a test suite is left hanging after a forced StopRun. We + simulate WorkItemComplete() but without the ripple effect to + higher level suites, since we are controlling it all directly. + + + + + EventListenerTextWriter sends text output to the currently active + ITestEventListener in the form of a TestOutput object. If no event + listener is active in the context, or if there is no context, + the output is forwarded to the supplied default writer. + + + + + Construct an EventListenerTextWriter + + The name of the stream to use for events + The default writer to use if no listener is available + + + + Get the Encoding for this TextWriter + + + + + Write formatted string + + + + + Write formatted string + + + + + Write formatted string + + + + + Write an object + + + + + Write a string + + + + + Write a decimal + + + + + Write a double + + + + + Write formatted string + + + + + Write a ulong + + + + + Write a long + + + + + Write a uint + + + + + Write an int + + + + + Write a char + + + + + Write a boolean + + + + + Write chars + + + + + Write chars + + + + + Write a float + + + + + Write a string with newline + + + + + Write an object with newline + + + + + Write formatted string with newline + + + + + Write formatted string with newline + + + + + Write formatted string with newline + + + + + Write a decimal with newline + + + + + Write a formatted string with newline + + + + + Write a double with newline + + + + + Write a uint with newline + + + + + Write a ulong with newline + + + + + Write a long with newline + + + + + Write an int with newline + + + + + Write a bool with newline + + + + + Write chars with newline + + + + + Write chars with newline + + + + + Write a char with newline + + + + + Write a float with newline + + + + + Write newline + + + + + The EventPumpState enum represents the state of an + EventPump. + + + + + The pump is stopped + + + + + The pump is pumping events with no stop requested + + + + + The pump is pumping events but a stop has been requested + + + + + EventPump pulls events out of an EventQueue and sends + them to a listener. It is used to send events back to + the client without using the CallContext of the test + runner thread. + + + + + The downstream listener to which we send events + + + + + The queue that holds our events + + + + + Thread to do the pumping + + + + + The current state of the event pump + + + + + Constructor + + The EventListener to receive events + The event queue to pull events from + + + + Gets or sets the current state of the pump + + + + + Gets or sets the name of this EventPump + (used only internally and for testing). + + + + + Dispose stops the pump + Disposes the used WaitHandle, too. + + + + + Start the pump + + + + + Tell the pump to stop after emptying the queue. + + + + + Our thread proc for removing items from the event + queue and sending them on. Note that this would + need to do more locking if any other thread were + removing events from the queue. + + + + + NUnit.Core.Event is the abstract base for all stored events. + An Event is the stored representation of a call to the + ITestListener interface and is used to record such calls + or to queue them for forwarding on another thread or at + a later time. + + + + + The Send method is implemented by derived classes to send the event to the specified listener. + + The listener. + + + + TestStartedEvent holds information needed to call the TestStarted method. + + + + + Initializes a new instance of the class. + + The test. + + + + Calls TestStarted on the specified listener. + + The listener. + + + + TestFinishedEvent holds information needed to call the TestFinished method. + + + + + Initializes a new instance of the class. + + The result. + + + + Calls TestFinished on the specified listener. + + The listener. + + + + TestOutputEvent holds information needed to call the TestOutput method. + + + + + Initializes a new instance of the class. + + The output object. + + + + Calls TestOutput on the specified listener. + + The listener. + + + + TestMessageEvent holds information needed to call the SendMessage method. + + + + + Initializes a new instance of the class. + + The test message object. + + + + Calls on the specified listener. + + The listener. + + + + Holds object for sending to all listeners + + + + + Implements a queue of work items each of which + is queued as a WaitCallback. + + + + + Gets the count of items in the queue. + + + + + Enqueues the specified event + + The event to enqueue. + + + + Removes the first element from the queue and returns it (or ). + + + If and the queue is empty, the calling thread is blocked until + either an element is enqueued, or is called. + + + + + If the queue not empty + the first element. + + + otherwise, if == + or has been called + . + + + + + + + Stop processing of the queue + + + + + Validates method to execute. + + + + + Determines whether a method is allowed to execute and throws an exception otherwise. + + The method to validate. + + + + An IWorkItemDispatcher handles execution of work items. + + + + + The level of parallelism supported. Zero if not supported. + + + + + Start execution, performing any initialization. Sets + the top level work item and dispatches it. + + + + + Dispatch a single work item for execution. The first + work item dispatched is saved as the top-level + work item and used when stopping the run. + + The item to dispatch + + + + Cancel the ongoing run completely. + If no run is in process, the call has no effect. + + true if the IWorkItemDispatcher should abort all currently running WorkItems, false if it should allow all currently running WorkItems to complete + + + + MainThreadWorkItemDispatcher handles execution of WorkItems by + directly executing them on the main thread. This is different + from the SimpleWorkItemDispatcher where the work item is dispatched + onto its own thread. + + + + + The level of parallelism supported + + + + + Start execution, dispatching the top level + work into the main thread. + + + + + Dispatch a single work item for execution by + executing it directly. + + The item to dispatch + + + + This method is not supported for + this dispatcher. Using it will throw a + NotSupportedException. + + Not used + If used, it will always throw this. + + + + Enumeration representing the strategy to follow in executing a work item. + The value is only relevant when running under the parallel dispatcher. + + + + + Run directly on same thread + + + + + Enqueue for parallel execution + + + + + Enqueue for non-parallel execution + + + + + ParallelWorkItemDispatcher handles execution of work items by + queuing them for worker threads to process. + + + + + Event raised whenever a shift is starting. + + + + + Event raised whenever a shift has ended. + + + + + Construct a ParallelWorkItemDispatcher + + Number of workers to use + + + + Number of parallel worker threads + + + + + Enumerates all the shifts supported by the dispatcher + + + + + Enumerates all the Queues supported by the dispatcher + + + + + Start execution, setting the top level work, + enqueuing it and starting a shift to execute it. + + + + + Dispatch a single work item for execution. The first + work item dispatched is saved as the top-level + work item and used when stopping the run. + + The item to dispatch + + + + Cancel the ongoing run completely. + If no run is in process, the call has no effect. + + + + + Save the state of the queues and create a new isolated set + + + + + Try to remove isolated queues and restore old ones + + + + + QueuingEventListener uses an EventQueue to store any + events received on its EventListener interface. + + + + + The EventQueue created and filled by this listener + + + + + Construct a QueuingEventListener + + + + + A test has started + + The test that is starting + + + + A test case finished + + Result of the test case + + + + Called when a test produces output for immediate display + + A TestOutput object containing the text to display + + + + Called when a test produces a message to be sent to listeners + + A object containing the text to send + + + + A SimpleWorkItem represents a single test case and is + marked as completed immediately upon execution. This + class is also used for skipped or ignored test suites. + + + + + Construct a simple work item for a test. + + The test to be executed + The filter used to select this test + + + + Construct a simple work item for a test. + + The test to be executed + The filter used to select this test + An instance + + + + Method that performs actually performs the work. + + + + + Creates a test command for use in running this test. + + A TestCommand + + + + SimpleWorkItemDispatcher handles execution of WorkItems by + directly executing them. It is provided so that a dispatcher + is always available in the context, thereby simplifying the + code needed to run child tests. + + + + + The level of parallelism supported + + + + + Start execution, creating the execution thread, + setting the top level work and dispatching it. + + + + + Dispatch a single work item for execution by + executing it directly. + + The item to dispatch + + + + Cancel (abort or stop) the ongoing run. + If no run is in process, the call has no effect. + + true if the run should be aborted, false if it should allow its currently running test to complete + + + + Checks whether the method to execute is static. + + + + + Construct a StaticMethodValidator. + + The error message to output in case the validation fails. + + + + Determines whether a method to execute is static and throws an InvalidOperationException otherwise. + + The method to validate. + + + + A TestWorker pulls work items from a queue + and executes them. + + + + + Event handler for TestWorker events + + The TestWorker sending the event + The WorkItem that caused the event + + + + Event signaled immediately before executing a WorkItem + + + + + Event signaled immediately after executing a WorkItem + + + + + Construct a new TestWorker. + + The queue from which to pull work items + The name of this worker + + + + The WorkItemQueue from which this worker pulls WorkItems + + + + + The name of this worker - also used for the thread + + + + + Indicates whether the worker thread is running + + + + + Our ThreadProc, which pulls and runs tests in a loop + + + + + Create thread and start processing work items. + + + + + Stop the thread, either immediately or after finishing the current WorkItem + + true if the thread should be aborted, false if it should allow the currently running test to complete + + + + The TextCapture class intercepts console output and writes it + to the current execution context, if one is present on the thread. + If no execution context is found, the output is written to a + default destination, normally the original destination of the + intercepted output. + + + + + Construct a TextCapture object + + The default destination for non-intercepted output + + + + Gets the Encoding in use by this TextWriter + + + + + Writes a single character + + The char to write + + + + Writes a string + + The string to write + + + + Writes a string followed by a line terminator + + The string to write + + + + A WorkItem may be an individual test case, a fixture or + a higher level grouping of tests. All WorkItems inherit + from the abstract WorkItem class, which uses the template + pattern to allow derived classes to perform work in + whatever way is needed. + + A WorkItem is created with a particular TestExecutionContext + and is responsible for re-establishing that context in the + current thread before it begins or resumes execution. + + + + + Construct a WorkItem for a particular test. + + The test that the WorkItem will run + Filter used to include or exclude child items + + + + Construct a work Item that wraps another work Item. + Wrapper items are used to represent independently + dispatched tasks, which form part of the execution + of a single test, such as OneTimeTearDown. + + The WorkItem being wrapped + + + + Initialize the TestExecutionContext. This must be done + before executing the WorkItem. + + + Originally, the context was provided in the constructor + but delaying initialization of the context until the item + is about to be dispatched allows changes in the parent + context during OneTimeSetUp to be reflected in the child. + + The TestExecutionContext to use + + + + Event triggered when the item is complete + + + + + Gets the current state of the WorkItem + + + + + The test being executed by the work item + + + + + The name of the work item - defaults to the Test name. + + + + + Filter used to include or exclude child tests + + + + + The execution context + + + + + The worker executing this item. + + + + + The ParallelExecutionStrategy to use for this work item + + + + + Indicates whether this work item should use a separate dispatcher. + + + + + The test result + + + + + Gets the ParallelScope associated with the test, if any, + otherwise returning ParallelScope.Default; + + + + + Execute the current work item, including any + child work items. + + + + + Wait until the execution of this item is complete + + + + + Marks the WorkItem as NotRunnable. + + Reason for test being NotRunnable. + + + + Cancel (abort or stop) a WorkItem + + true if the WorkItem should be aborted, false if it should run to completion + + + + Standard Dispose + + + + + Method that performs actually performs the work. It should + set the State to WorkItemState.Complete when done. + + + + + Method called by the derived class when all work is complete + + + + + Builds the set up tear down list. + + Unsorted array of setup MethodInfos. + Unsorted array of teardown MethodInfos. + Method validator used before each method execution. + A list of SetUpTearDownItems + + + + Changes the result of the test, logging the old and new states + + The new ResultState + The new message + + + + Recursively walks up the test hierarchy to see if the + has been set on any of the parent tests. + + + + + WorkItemBuilder class knows how to build a tree of work items from a tree of tests + + + + + Creates a work item. + + The test for which this WorkItem is being created. + The filter to be used in selecting any child Tests. + True if child work items should be created and added. + + + + + Creates a work item. + + The test for which this WorkItem is being created. + The filter to be used in selecting any child Tests. + An instance. + True if child work items should be created and added. + if work item needs to be created unconditionally, if will be returned for tests that don't match the filter. + + + + + Compares two objects and returns a value indicating whether one is less than, equal to, or greater than the other. + + + A signed integer that indicates the relative values of and , as shown in the following table.Value Meaning Less than zero is less than .Zero equals .Greater than zero is greater than . + + The first object to compare.The second object to compare. + + + + WorkItemQueueState indicates the current state of a WorkItemQueue + + + + + The queue is paused + + + + + The queue is running + + + + + The queue is stopped + + + + + A WorkItemQueue holds work items that are ready to + be run, either initially or after some dependency + has been satisfied. + + + + + Initializes a new instance of the class. + + The name of the queue. + Flag indicating whether this is a parallel queue + ApartmentState to use for items on this queue + + + + Gets the name of the work item queue. + + + + + Gets a flag indicating whether this queue is used for parallel execution + + + + + Gets the target ApartmentState for work items on this queue + + + + + Gets the total number of items processed so far + + + + + Gets the current state of the queue + + + + + Get a bool indicating whether the queue is empty. + + + + + Enqueue a WorkItem to be processed + + The WorkItem to process + + + + Enqueue a WorkItem to be processed - internal for testing + + The WorkItem to process + The priority at which to process the item + + + + Dequeue a WorkItem for processing + + A WorkItem or null if the queue has stopped + + + + Start or restart processing of items from the queue + + + + + Signal the queue to stop + + + + + Pause the queue for restarting later + + + + + Save the current inner queue and create new ones for use by + a non-parallel fixture with parallel children. + + + + + Restore the inner queue that was previously saved + + + + + The current state of a work item + + + + + Ready to run or continue + + + + + Work Item is executing + + + + + Complete + + + + + Handler for ShiftChange events. + + The shift that is starting or ending. + + + + The dispatcher needs to do different things at different, + non-overlapped times. For example, non-parallel tests may + not be run at the same time as parallel tests. We model + this using the metaphor of a working shift. The WorkShift + class associates one or more WorkItemQueues with one or + more TestWorkers. + + Work in the queues is processed until all queues are empty + and all workers are idle. Both tests are needed because a + worker that is busy may end up adding more work to one of + the queues. At that point, the shift is over and another + shift may begin. This cycle continues until all the tests + have been run. + + + + + Construct a WorkShift + + + + + Event that fires when the shift has ended + + + + + The Name of this shift + + + + + Gets a flag indicating whether the shift is currently active + + + + + Gets a bool indicating whether this shift has any work to do + + + + + Gets a list of the queues associated with this shift. + + Internal for testing - immutable once initialized + + + + Gets the list of workers associated with this shift. + + Internal for testing - immutable once initialized + + + + Add a WorkItemQueue to the shift, starting it if the + shift is currently active. + + + + + Assign a worker to the shift. + + + + + + Start or restart processing for the shift + + + + + End the shift, pausing all queues and raising + the EndOfShift event. + + + + + Shut down the shift. + + + + + Cancel (abort or stop) the shift without completing all work + + true if the WorkShift should be aborted, false if it should allow its currently running tests to complete + + + + TextMessageWriter writes constraint descriptions and messages + in displayable form as a text stream. It tailors the display + of individual message components to form the standard message + format of NUnit assertion failure messages. + + + + + Prefix used for the expected value line of a message + + + + + Prefix used for the actual value line of a message + + + + + Prefix used for the actual difference between actual and expected values if compared with a tolerance + + + + + Length of a message prefix + + + + + Construct a TextMessageWriter + + + + + Construct a TextMessageWriter, specifying a user message + and optional formatting arguments. + + + + + + + Gets or sets the maximum line length for this writer + + + + + Method to write single line message with optional args, usually + written to precede the general failure message, at a given + indentation level. + + The indentation level of the message + The message to be written + Any arguments used in formatting the message + + + + Display Expected and Actual lines for a constraint. This + is called by MessageWriter's default implementation of + WriteMessageTo and provides the generic two-line display. + + The result of the constraint that failed + + + + Gets the unique type name between expected and actual. + + The expected value + The actual value causing the failure + Output of the unique type name for expected + Output of the unique type name for actual + + + + Display Expected and Actual lines for given values. This + method may be called by constraints that need more control over + the display of actual and expected values than is provided + by the default implementation. + + The expected value + The actual value causing the failure + + + + Display Expected and Actual lines for given values, including + a tolerance value on the expected line. + + The expected value + The actual value causing the failure + The tolerance within which the test was made + + + + Display the expected and actual string values on separate lines. + If the mismatch parameter is >=0, an additional line is displayed + line containing a caret that points to the mismatch point. + + The expected string value + The actual string value + The point at which the strings don't match or -1 + If true, case is ignored in string comparisons + If true, clip the strings to fit the max line length + + + + Writes the text for an actual value. + + The actual value. + + + + Writes the text for a generalized value. + + The value. + + + + Writes the text for a collection value, + starting at a particular point, to a max length + + The collection containing elements to write. + The starting point of the elements to write + The maximum number of elements to write + + + + Write the generic 'Expected' line for a constraint + + The constraint that failed + + + + Write the generic 'Expected' line for a given value + and tolerance. + + The expected value + The tolerance within which the test was made + + + + Write the generic 'Actual' line for a constraint + + The ConstraintResult for which the actual value is to be written + + + + Write the generic 'Actual' line for a given value + + The actual value causing a failure + + + + Extensions to . + + + + + Adds the skip reason to tests that are ignored until a specific date. + + The test properties to add the skip reason to + The date that the test is being ignored until + The reason the test is being ignored until that date + + + + Combines multiple filters so that a test must pass all + of them in order to pass this filter. + + + + + Constructs an empty AndFilter + + + + + Constructs an AndFilter from an array of filters + + + + + + Checks whether the AndFilter is matched by a test + + The test to be matched + If set to we are carrying a negation through + True if all the component filters pass, otherwise false + + + + Checks whether the AndFilter is matched by a test + + The test to be matched + True if all the component filters match, otherwise false + + + + Checks whether the AndFilter is explicit matched by a test. + + The test to be matched + True if all the component filters explicit match, otherwise false + + + + Gets the element name + + Element name + + + + CategoryFilter is able to select or exclude tests + based on their categories. + + + + + Construct a CategoryFilter using a single category name + + A category name + + + + Check whether the filter matches a test + + The test to be matched + + + + + Gets the element name + + Element name + + + + ClassName filter selects tests based on the class FullName + + + + + Construct a FullNameFilter for a single name + + The name the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + A base class for multi-part filters + + + + + Constructs an empty CompositeFilter + + + + + Constructs a CompositeFilter from an array of filters + + + + + + Return a list of the composing filters. + + + + + Checks whether the CompositeFilter is matched by a test. + + The test to be matched + If set to we are carrying a negation through + + + + Checks whether the CompositeFilter is matched by a test. + + The test to be matched + + + + Checks whether the CompositeFilter is explicit matched by a test. + + The test to be matched + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Gets the element name + + Element name + + + + FullName filter selects tests based on their FullName + + + + + Construct a FullNameFilter for a single name + + The name the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + IdFilter selects tests based on their id + + + + + Construct an IdFilter for a single value + + The id the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + Optimized filter to check in condition using HashSet. + + + + + Constructs new InFilter. + + Selector to get value to check. + Valid values for the filter. + The XML element name the original filter used. + + + + Tries to optimize OrFilter into InFilter if contained filters are all same and non-regex. + + + + + FullName filter selects tests based on their FullName + + + + + Construct a MethodNameFilter for a single name + + The name the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + ClassName filter selects tests based on the class FullName + + + + + Construct a NamespaceFilter for a single namespace + + The namespace the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + NotFilter negates the operation of another filter + + + + + Construct a not filter on another filter + + The filter to be negated + + + + Gets the base filter + + + + + Determine if a particular test passes the filter criteria. + + The test to which the filter is applied + If set to we are carrying a negation through + True if the test passes the filter, otherwise false + + + + Check whether the filter matches a test + + The test to be matched + True if it matches, otherwise false + + + + Determine if a test matches the filter explicitly. That is, it must + be a direct match of the test itself or one of its children. + + The test to which the filter is applied + True if the test matches the filter explicitly, otherwise false + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Combines multiple filters so that a test must pass one + of them in order to pass this filter. + + + + + Constructs an empty OrFilter + + + + + Constructs an OrFilter from an array of filters + + + + + + Checks whether the OrFilter is matched by a test + + The test to be matched + If set to we are carrying a negation through + True if any of the component filters pass, otherwise false + + + + Checks whether the OrFilter is matched by a test + + The test to be matched + True if any of the component filters match, otherwise false + + + + Checks whether the OrFilter is explicit matched by a test + + The test to be matched + True if any of the component filters explicit match, otherwise false + + + + Gets the element name + + Element name + + + + PropertyFilter is able to select or exclude tests + based on their properties. + + + + + Construct a PropertyFilter using a property name and expected value + + A property name + The expected value of the property + + + + Check whether the filter matches a test + + The test to be matched + + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Gets the element name + + Element name + + + + TestName filter selects tests based on their Name + + + + + Construct a TestNameFilter for a single name + + The name the filter will recognize. + + + + Match a test against a single value. + + + + + Gets the element name + + Element name + + + + ValueMatchFilter selects tests based on some value, which + is expected to be contained in the test. + + + + + Returns the value matched by the filter - used for testing + + + + + Indicates whether the value is a regular expression + + + + + Construct a ValueMatchFilter for a single value. + + The value to be included. + + + + Match the input provided by the derived class + + The value to be matched + True for a match, false otherwise. + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + Gets the element name + + Element name + + + + GenericMethodHelper is able to deduce the Type arguments for + a generic method from the actual arguments provided. + + + + + A special value, which is used to indicate that BestCommonType() method + was unable to find a common type for the specified arguments. + + + + + Construct a GenericMethodHelper for a method + + MethodInfo for the method to examine + + + + Return the type arguments for the method, deducing them + from the arguments actually provided. + + The arguments to the method + If successful, an array of type arguments. + + + + A minimalistic implementation of an immutable stack. Add members as needed. + + + + + Represents an empty stack. may be used instead. + + + + + Returns a new immutable stack which begins with the specified value and continues with the values in the + current stack. + + The beginning value of the new stack. + + + + InvalidTestFixtureException is thrown when an appropriate test + fixture constructor using the provided arguments cannot be found. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Serialization Constructor + + + + + InvalidPlatformException is thrown when the platform name supplied + to a test is not recognized. + + + + + Instantiates a new instance of the class. + + + + + Instantiates a new instance of the class + + The message. + + + + Instantiates a new instance of the class + + The message. + The inner. + + + + Serialization constructor for the class + + + + + InvalidTestFixtureException is thrown when an appropriate test + fixture constructor using the provided arguments cannot be found. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Serialization Constructor + + + + + Interface for logging within the engine + + + + + Logs the specified message at the error level. + + The message. + + + + Logs the specified message at the error level. + + The message. + The arguments. + + + + Logs the specified message at the warning level. + + The message. + + + + Logs the specified message at the warning level. + + The message. + The arguments. + + + + Logs the specified message at the info level. + + The message. + + + + Logs the specified message at the info level. + + The message. + The arguments. + + + + Logs the specified message at the debug level. + + The message. + + + + Logs the specified message at the debug level. + + The message. + The arguments. + + + + InternalTrace provides facilities for tracing the execution + of the NUnit framework. Tests and classes under test may make use + of Console writes, System.Diagnostics.Trace or various loggers and + NUnit itself traps and processes each of them. For that reason, a + separate internal trace is needed. + + Note: + InternalTrace uses a global lock to allow multiple threads to write + trace messages. This can easily make it a bottleneck so it must be + used sparingly. Keep the trace Level as low as possible and only + insert InternalTrace writes where they are needed. + TODO: add some buffering and a separate writer thread as an option. + TODO: figure out a way to turn on trace in specific classes only. + + + + + Gets a flag indicating whether the InternalTrace is initialized + + + + + Initialize the internal trace facility using the name of the log + to be written to and the trace level. + + The log name + The trace level + + + + Initialize the internal trace using a provided TextWriter and level + + A TextWriter + The InternalTraceLevel + + + + Get a named Logger + + + + + + Get a logger named for a particular Type. + + + + + InternalTraceLevel is an enumeration controlling the + level of detailed presented in the internal log. + + + + + Use the default settings as specified by the user. + + + + + Do not display any trace messages + + + + + Display Error messages only + + + + + Display Warning level and higher messages + + + + + Display informational and higher messages + + + + + Display debug messages and higher - i.e. all messages + + + + + Display debug messages and higher - i.e. all messages + + + + + A trace listener that writes to a separate file per domain + and process using it. + + + + + Construct an InternalTraceWriter that writes to a file. + + Path to the file to use + + + + Construct an InternalTraceWriter that writes to a + TextWriter provided by the caller. + + + + + + Returns the character encoding in which the output is written. + + The character encoding in which the output is written. + + + + Writes a character to the text string or stream. + + The character to write to the text stream. + + + + Writes a string to the text string or stream. + + The string to write. + + + + Writes a string followed by a line terminator to the text string or stream. + + The string to write. If is null, only the line terminator is written. + + + + Releases the unmanaged resources used by the and optionally releases the managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Clears all buffers for the current writer and causes any buffered data to be written to the underlying device. + + + + + Provides internal logging to the NUnit framework + + + + + Initializes a new instance of the class. + + The name. + The log level. + The writer where logs are sent. + + + + Logs the message at error level. + + The message. + + + + Logs the message at error level. + + The message. + The message arguments. + + + + Logs the message at warm level. + + The message. + + + + Logs the message at warning level. + + The message. + The message arguments. + + + + Logs the message at info level. + + The message. + + + + Logs the message at info level. + + The message. + The message arguments. + + + + Logs the message at debug level. + + The message. + + + + Logs the message at debug level. + + The message. + The message arguments. + + + + The MethodWrapper class wraps a MethodInfo so that it may + be used in a platform-independent manner. + + + + + Construct a MethodWrapper for a Type and a MethodInfo. + + + + + Construct a MethodInfo for a given Type and method name. + + + + + Gets the Type from which this method was reflected. + + + + + Gets the MethodInfo for this method. + + + + + Gets the name of the method. + + + + + Gets a value indicating whether the method is abstract. + + + + + Gets a value indicating whether the method is public. + + + + + Gets a value indicating whether the method is static. + + + + + Gets a value indicating whether the method contains unassigned generic type parameters. + + + + + Gets a value indicating whether the method is a generic method. + + + + + Gets a value indicating whether the MethodInfo represents the definition of a generic method. + + + + + Gets the return Type of the method. + + + + + Gets the parameters of the method. + + + + + + Returns the Type arguments of a generic method or the Type parameters of a generic method definition. + + + + + Replaces the type parameters of the method with the array of types provided and returns a new IMethodInfo. + + The type arguments to be used + A new IMethodInfo with the type arguments replaced + + + + Returns an array of custom attributes of the specified type applied to this method + + + + + Gets a value indicating whether one or more attributes of the specified type are defined on the method. + + + + + Invokes the method, converting any TargetInvocationException to an NUnitException. + + The object on which to invoke the method + The argument list for the method + The return value from the invoked method + + + + Override ToString() so that error messages in NUnit's own tests make sense + + + + + + + + + + + + + + Thrown when an assertion failed. Here to preserve the inner + exception and hence its stack trace. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The error message that explains + the reason for the exception + + + + Initializes a new instance of the class. + + The error message that explains + the reason for the exception + The exception that caused the + current exception + + + + Serialization Constructor + + + + + Enables the syntax. + + + + + Wraps an action so that it is executed when the returned object is disposed. + This disposal is thread-safe and the action will be executed at most once. + + + + + OSPlatform represents a particular operating system platform + + + + + Platform ID for Unix as defined by .NET + + + + + Platform ID for Unix as defined by Mono + + + + + Platform ID for XBox as defined by .NET and Mono + + + + + Platform ID for MacOSX as defined by .NET and Mono + + + + + Get the OSPlatform under which we are currently running + + + + + Gets the actual OS Version, not the incorrect value that might be + returned for Win 8.1 and Win 10 + + + If an application is not manifested as Windows 8.1 or Windows 10, + the version returned from Environment.OSVersion will not be 6.3 and 10.0 + respectively, but will be 6.2 and 6.3. The correct value can be found in + the registry. + + The original version + The correct OS version + + + + Product Type Enumeration used for Windows + + + + + Product type is unknown or unspecified + + + + + Product type is Workstation + + + + + Product type is Domain Controller + + + + + Product type is Server + + + + + Construct from a platform ID and version + + + + + Construct from a platform ID, version and product type + + + + + Get the platform ID of this instance + + + + + Implemented to use in place of Environment.OSVersion.ToString() + + A representation of the platform ID and version in an approximation of the format used by Environment.OSVersion.ToString() + + + + Get the Version of this instance + + + + + Get the Product Type of this instance + + + + + Return true if this is a windows platform + + + + + Return true if this is a Unix or Linux platform + + + + + Return true if the platform is Win32S + + + + + Return true if the platform is Win32Windows + + + + + Return true if the platform is Win32NT + + + + + Return true if the platform is Windows CE + + + + + Return true if the platform is Xbox + + + + + Return true if the platform is MacOSX + + + + + Return true if the platform is Windows 95 + + + + + Return true if the platform is Windows 98 + + + + + Return true if the platform is Windows ME + + + + + Return true if the platform is NT 3 + + + + + Return true if the platform is NT 4 + + + + + Return true if the platform is NT 5 + + + + + Return true if the platform is Windows 2000 + + + + + Return true if the platform is Windows XP + + + + + Return true if the platform is Windows 2003 Server + + + + + Return true if the platform is NT 6 + + + + + Return true if the platform is NT 6.0 + + + + + Return true if the platform is NT 6.1 + + + + + Return true if the platform is NT 6.2 + + + + + Return true if the platform is NT 6.3 + + + + + Return true if the platform is Vista + + + + + Return true if the platform is Windows 2008 Server (original or R2) + + + + + Return true if the platform is Windows 2008 Server (original) + + + + + Return true if the platform is Windows 2008 Server R2 + + + + + Return true if the platform is Windows 2012 Server (original or R2) + + + + + Return true if the platform is Windows 2012 Server (original) + + + + + Return true if the platform is Windows 2012 Server R2 + + + + + Return true if the platform is Windows 7 + + + + + Return true if the platform is Windows 8 + + + + + Return true if the platform is Windows 8.1 + + + + + Return true if the platform is Windows 10 + + + + + Return true if the platform is Windows Server. This is named Windows + Server 10 to distinguish it from previous versions of Windows Server. + + + + + + Examines an attribute argument and tries to simulate what that value would have been if the literal syntax + which might have defined the value in C# had instead been used as an argument to a given method parameter in a direct call. + + + For example, since you can’t apply attributes using arguments, we allow the C# syntax + 10 ( value) or 0.1 ( value) to be specified. + NUnit then converts it to match the method’s parameters, just as if you were actually + using the syntax TestMethod(10) or TestMethod(0.1). + + + For another example, you might have written the syntax 10 and picked up the attribute + constructor overload; however, the test method for which this value is intended only has a + signature. Again, NUnit simulates what would have happened if the inferred C# syntax was transplanted + and you were actually using the syntax TestMethod(10). + + + + + + Converts an array of objects to the , if it is supported. + + + + + Converts a single value to the , if it is supported. + + + + + Performs several special conversions allowed by NUnit in order to + permit arguments with types that cannot be used in the constructor + of an Attribute such as TestCaseAttribute or to simplify their use. + + The value to be converted + The target in which the should be converted + If conversion was successfully applied, the converted into + + if was converted and should be used; + is no conversion was applied and should be ignored + + + + + The ParameterWrapper class wraps a ParameterInfo so that it may + be used in a platform-independent manner. + + + + + Construct a ParameterWrapper for a given method and parameter + + + + + + + Gets a value indicating whether the parameter is optional + + + + + Gets an IMethodInfo representing the method for which this is a parameter. + + + + + Gets the underlying ParameterInfo + + + + + Gets the Type of the parameter + + + + + Returns an array of custom attributes of the specified type applied to this method + + + + + Gets a value indicating whether one or more attributes of the specified type are defined on the parameter. + + + + + PlatformHelper class is used by the PlatformAttribute class to + determine whether a platform is supported. + + + + + Comma-delimited list of all supported OS platform constants + + + + + Comma-delimited list of all supported Runtime platform constants + + + + + Default constructor uses the operating system and + common language runtime of the system. + + + + + Construct a PlatformHelper for a particular operating + system and common language runtime. Used in testing. + + RuntimeFramework to be used + OperatingSystem to be used + + + + Test to determine if one of a collection of platforms + is being used currently. + + + + + + + Tests to determine if the current platform is supported + based on a platform attribute. + + The attribute to examine + + + + + Tests to determine if the current platform is supported + based on a platform attribute. + + The attribute to examine + + + + + Test to determine if a particular platform or comma-delimited set of platforms is in use. + + Name of the platform or comma-separated list of platform ids + True if the platform is in use on the system + + + + Return the last failure reason. Results are not + defined if called before IsSupported( Attribute ) + is called. + + + + + Implements a simplified filter for use in deciding which + Types and Methods should be used to generate tests. It is constructed with a + list of strings, each of which may end up being interpreted in various ways. + + + + + Return a new PreFilter, without elements, which is considered + empty and always matches. + + + + + Return true if the filter is empty, in which case it + always succeeds. Technically, this is just a filter and + you can add elements but it's best to use Empty when + you need an empty filter and new when you plan to add. + + + + + Add a new filter element to the filter + + + + + + Use the filter on a Type, returning true if the type matches the filter + and should therefore be included in the discovery process. + + + + + Use the filter on a Type, returning true if the type matches the filter + and should therefore be included in the discovery process. + + + + + A PropertyBag represents a collection of name value pairs + that allows duplicate entries with the same key. Methods + are provided for adding a new pair as well as for setting + a key to a single value. All keys are strings but values + may be of any type. Null values are not permitted, since + a null entry represents the absence of the key. + + + + + Adds a key/value pair to the property set + + The key + The value + + + + Sets the value for a key, removing any other + values that are already in the property set. + + + + + + + Gets a single value for a key, using the first + one if multiple values are present and returning + null if the value is not found. + + + + + + + Gets a flag indicating whether the specified key has + any entries in the property set. + + The key to be checked + + True if their are values present, otherwise false + + + + + Gets a collection containing all the keys in the property set + + + + + + Gets or sets the list of values for a particular key + + + + + Returns an XmlNode representing the current PropertyBag. + + Not used + An XmlNode representing the PropertyBag + + + + Returns an XmlNode representing the PropertyBag after + adding it as a child of the supplied parent node. + + The parent node. + Not used + + + + + The PropertyNames class provides static constants for the + standard property ids that NUnit uses on tests. + + + + + The FriendlyName of the AppDomain in which the assembly is running + + + + + The selected strategy for joining parameter data into test cases + + + + + The process ID of the executing assembly + + + + + The stack trace from any data provider that threw + an exception. + + + + + The reason a test was not run + + + + + The author of the tests + + + + + The ApartmentState required for running the test + + + + + The categories applying to a test + + + + + The Description of a test + + + + + The number of threads to be used in running tests + + + + + The maximum time in ms, above which the test is considered to have failed + + + + + The ParallelScope associated with a test + + + + + The number of times the test should be repeated + + + + + Indicates that the test should be run on a separate thread + + + + + The culture to be set for a test + + + + + The UI culture to be set for a test + + + + + The type that is under test + + + + + The timeout value for the test + + + + + The test will be ignored until the given date + + + + + The optional Order the test will run in + + + + + Randomizer returns a set of random values in a repeatable + way, to allow re-running of tests if necessary. It extends + the .NET Random class, providing random values for a much + wider range of types. + + The class is used internally by the framework to generate + test case data and is also exposed for use by users through + the TestContext.Random property. + + + For consistency with the underlying Random Type, methods + returning a single value use the prefix "Next..." Those + without an argument return a non-negative value up to + the full positive range of the Type. Overloads are provided + for specifying a maximum or a range. Methods that return + arrays or strings use the prefix "Get..." to avoid + confusion with the single-value methods. + + + + + Initial seed used to create randomizers for this run + + + + + Get a Randomizer for a particular member, returning + one that has already been created if it exists. + This ensures that the same values are generated + each time the tests are reloaded. + + + + + Get a randomizer for a particular parameter, returning + one that has already been created if it exists. + This ensures that the same values are generated + each time the tests are reloaded. + + + + + Create a new Randomizer using the next seed + available to ensure that each randomizer gives + a unique sequence of values. + + + + + + Default constructor + + + + + Construct based on seed value + + + + + + Returns a random unsigned int. + + + + + Returns a random unsigned int less than the specified maximum. + + + + + Returns a random unsigned int within a specified range. + + + + + Returns a non-negative random short. + + + + + Returns a non-negative random short less than the specified maximum. + + + + + Returns a non-negative random short within a specified range. + + + + + Returns a random unsigned short. + + + + + Returns a random unsigned short less than the specified maximum. + + + + + Returns a random unsigned short within a specified range. + + + + + Returns a random long. + + + + + Returns a random long less than the specified maximum. + + + + + Returns a non-negative random long within a specified range. + + + + + Returns a random ulong. + + + + + Returns a random ulong less than the specified maximum. + + + + + Returns a non-negative random long within a specified range. + + + + + Returns a random Byte + + + + + Returns a random Byte less than the specified maximum. + + + + + Returns a random Byte within a specified range + + + + + Returns a random SByte + + + + + Returns a random sbyte less than the specified maximum. + + + + + Returns a random sbyte within a specified range + + + + + Returns a random bool + + + + + Returns a random bool based on the probability a true result + + + + + Returns a random double between 0.0 and the specified maximum. + + + + + Returns a random double within a specified range. + + + + + Returns a random float. + + + + + Returns a random float between 0.0 and the specified maximum. + + + + + Returns a random float within a specified range. + + + + + Returns a random enum value of the specified Type as an object. + + + + + Returns a random enum value of the specified Type. + + + + + Default characters for random functions. + + Default characters are the English alphabet (uppercase & lowercase), Arabic numerals, and underscore + + + + Generate a random string based on the characters from the input string. + + desired length of output string. + string representing the set of characters from which to construct the resulting string + A random string of arbitrary length + + + + Generate a random string based on the characters from the input string. + + desired length of output string. + A random string of arbitrary length + Uses DefaultStringChars as the input character set + + + + Generate a random string based on the characters from the input string. + + A random string of the default length + Uses DefaultStringChars as the input character set + + + + Returns a random decimal. + + + + + Returns a random decimal between positive zero and the specified maximum. + + + + + Returns a random decimal within a specified range, which is not + permitted to exceed decimal.MaxVal in the current implementation. + + + A limitation of this implementation is that the range from min + to max must not exceed decimal.MaxVal. + + + + + Generates a valid version 4 . + + + + + Helper methods for inspecting a type by reflection. + + Many of these methods take ICustomAttributeProvider as an + argument to avoid duplication, even though certain attributes can + only appear on specific types of members, like MethodInfo or Type. + + In the case where a type is being examined for the presence of + an attribute, interface or named member, the Reflect methods + operate with the full name of the member being sought. This + removes the necessity of the caller having a reference to the + assembly that defines the item being sought and allows the + NUnit core to inspect assemblies that reference an older + version of the NUnit framework. + + + + + Examine a fixture type and return true if it has a method with + a particular attribute. + + The type to examine + The attribute Type to look for + True if found, otherwise false + + + + Invoke the default constructor on a Type + + The Type to be constructed + An instance of the Type + + + + Invoke a constructor on a Type with arguments + + The Type to be constructed + Arguments to the constructor + An instance of the Type + + + + Returns an array of types from an array of objects. + Differs from by returning + for null elements rather than throwing . + + + + + Gets the constructors to which the specified argument types can be coerced. + + + + + Determines if the given types can be coerced to match the given parameters. + + + + + Determines whether the current type can be implicitly converted to the specified type. + + + + + Invoke a parameterless method returning void on an object. + + A MethodInfo for the method to be invoked + The object on which to invoke the method + + + + Invoke a method, converting any TargetInvocationException to an NUnitException. + + A MethodInfo for the method to be invoked + The object on which to invoke the method + The argument list for the method + The return value from the invoked method + + + + + Selects the ultimate shadowing property just like dynamic would, + rather than throwing + for properties that shadow properties of a different property type + which is what does. + + + If you request both public and nonpublic properties, every public property is preferred + over every nonpublic property. It would violate the principle of least surprise for a + derived class’s implementation detail to be chosen over the public API for a type. + + + See . + See . + See . + + + + Same as GetMethod(, | + , , , + ) except that it also chooses only non-generic methods. + Useful for avoiding the you can have with GetMethod. + + + + + Returns the get accessor for the indexer. + + Type to reflect on for the indexer. + List of indexer types that matches the indexer type order. + The Get accessor + + + + Searches for the specified members, using the specified binding constraints. + + + Similar to but also finds private static members from the base class. + + The type to find the members from. + The string containing the name of the members to get. + A bitwise combination of the enumeration values that specify how the search is conducted. + + + + + Represents the result of running a single test case. + + + + + Construct a TestCaseResult based on a TestMethod + + A TestMethod to which the result applies. + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that executed + when running the test and all its children. + + + + + Gets the number of test cases that had warnings + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + + + + + Gets the collection of child results. + + + + + The TestResult class represents the result of a test. + + + + + Error message for when child tests have errors + + + + + Error message for when child tests have warnings + + + + + Error message for when child tests are ignored + + + + + Error message for when user has cancelled the test run + + + + + The minimum duration for tests + + + + + Aggregate assertion count + + + + + ReaderWriterLock + + + + + Construct a test result given a Test + + The test to be used + + + + Gets the test with which this result is associated. + + + + + Gets the ResultState of the test result, which + indicates the success or failure of the test. + + + + + Gets the name of the test result + + + + + Gets the full name of the test result + + + + + Gets or sets the elapsed time for running the test in seconds + + + + + Gets or sets the time the test started running. + + + + + Gets or sets the time the test finished running. + + + + + Adds a test attachment to the test result + + The TestAttachment object to attach + + + + Gets the collection of files attached to the test + + + + + Gets the message associated with a test + failure or with not running the test + + + + + Gets any stack trace associated with an + error or failure. + + + + + Gets or sets the count of asserts executed + when running the test. + + + + + Gets the number of test cases executed + when running the test and all its children. + + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that had warnings + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + + + + + Gets the collection of child results. + + + + + Gets a TextWriter, which will write output to be included in the result. + + + + + Gets any text output written to this result. + + + + + Gets a list of assertion results associated with the test. + + + + + Returns the XML representation of the result. + + If true, descendant results are included + An XmlNode representing the result + + + + Adds the XML representation of the result as a child of the + supplied parent node.. + + The parent node. + If true, descendant results are included + + + + + Gets a count of pending failures (from Multiple Assert) + + + + + Gets the worst assertion status (highest enum) in all the assertion results + + + + + Set the result of the test + + The ResultState to use in the result + + + + Set the result of the test + + The ResultState to use in the result + A message associated with the result state + + + + Set the result of the test + + The ResultState to use in the result + A message associated with the result state + Stack trace giving the location of the command + + + + Set the test result based on the type of exception thrown + + The exception that was thrown + + + + Set the test result based on the type of exception thrown + + The exception that was thrown + The FailureSite to use in the result + + + + RecordTearDownException appends the message and stack trace + from an exception arising during teardown of the test + to any previously recorded information, so that any + earlier failure information is not lost. Note that + calling Assert.Ignore, Assert.Inconclusive, etc. during + teardown is treated as an error. If the current result + represents a suite, it may show a teardown error even + though all contained tests passed. + + The Exception to be recorded + + + + Update overall test result, including legacy Message, based + on AssertionResults that have been saved to this point. + + + + + Record an assertion result + + + + + Record an assertion result + + + + + Record an assertion result + + + + + Creates a failure message incorporating failures + from a Multiple Assert block for use by runners + that don't know about AssertionResults. + + Message as a string + + + + Adds a failure element to a node and returns it. + + The target node. + The new failure element. + + + + Adds an attachments element to a node and returns it. + + The target node. + The new attachments element. + + + + Represents the result of running a test suite + + + + + Construct a TestSuiteResult base on a TestSuite + + The TestSuite to which the result applies + + + + Gets the number of test cases that executed + when running the test and all its children. + + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + Indicates whether this result has any child results. + + + + + Gets the collection of child results. + + + + + Adds a child result to this result, setting this result's + ResultState to Failure if the child result failed. + + The result to be added + + + + RuntimeFramework represents a particular version + of a common language runtime implementation. + + + + + DefaultVersion is an empty Version, used to indicate that + NUnit should select the CLR version to use for the test. + + + + + Construct from a runtime type and version. If the version has + two parts, it is taken as a framework version. If it has three + or more, it is taken as a CLR version. In either case, the other + version is deduced based on the runtime type and provided version. + + The runtime type of the framework + The version of the framework + + + + Static method to return a RuntimeFramework object + for the framework that is currently in use. + + + + + The type of this runtime framework + + + + + The framework version for this runtime framework + + + + + The CLR version for this runtime framework + + + + + Return true if any CLR version may be used in + matching this RuntimeFramework object. + + + + + Returns the Display name for this framework + + + + + Parses a string representing a RuntimeFramework. + The string may be just a RuntimeType name or just + a Version or a hyphenated RuntimeType-Version or + a Version prefixed by 'versionString'. + + + + + + + Overridden to return the short name of the framework + + + + + + Returns true if the current framework matches the + one supplied as an argument. Two frameworks match + if their runtime types are the same or either one + is RuntimeType.Any and all specified version components + are equal. Negative (i.e. unspecified) version + components are ignored. + + The RuntimeFramework to be matched. + True on match, otherwise false + + + + Enumeration identifying a common language + runtime implementation. + + + + Any supported runtime framework + + + Microsoft .NET Framework + + + Microsoft .NET Framework + + + Microsoft Shared Source CLI + + + Mono + + + MonoTouch + + + Microsoft .NET Core, including .NET 5+ + + + + Holds thread state which is captured and restored in order to sandbox user code. + + + + + Thread principal. + This will be null on platforms that don't support . + + + + + Captures a snapshot of the tracked state of the current thread to be restored later. + + + + + Restores the tracked state of the current thread to the previously captured state. + + + + + Returns a copy with the specified culture. + + + + + Returns a copy with the specified UI culture. + + + + + Returns a copy with the specified principal. + + + + + May be called from any thread. + + + + + May be called from any thread. + + + + + May be called from any thread. + + + + + May be called from any thread, but may only be called once. + + + + + StackFilter class is used to remove internal NUnit + entries from a stack trace so that the resulting + trace provides better information about the test. + + + + + Single instance of our default filter + + + + + Construct a stack filter instance + + Regex pattern used to delete lines from the top of the stack + Regex pattern used to delete lines from the bottom of the stack + + + + Construct a stack filter instance + + Regex pattern used to delete lines from the top of the stack + + + + Construct a stack filter instance + + + + + Filters a raw stack trace and returns the result. + + The original stack trace + A filtered stack trace + + + + Provides methods to support legacy string comparison methods. + + + + + Compares two strings for equality, ignoring case if requested. + + The first string. + The second string.. + if set to , the case of the letters in the strings is ignored. + Zero if the strings are equivalent, a negative number if strA is sorted first, a positive number if + strB is sorted first + + + + Compares two strings for equality, ignoring case if requested. + + The first string. + The second string.. + if set to , the case of the letters in the strings is ignored. + True if the strings are equivalent, false if not. + + + + The TestCaseParameters class encapsulates method arguments and + other selected parameters needed for constructing + a parameterized test case. + + + + + The expected result to be returned + + + + + Default Constructor creates an empty parameter set + + + + + Construct a non-runnable ParameterSet, specifying + the provider exception that made it invalid. + + + + + Construct a parameter set with a list of arguments + + + + + + Construct a ParameterSet from an object implementing ITestCaseData + + + + + + The expected result of the test, which + must match the method return type. + + + + + Gets a value indicating whether an expected result was specified. + + + + + TestCaseTimeoutException is thrown when a test running directly + on a TestWorker thread is cancelled due to timeout. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Serialization Constructor + + + + + Helper class used to save and restore certain static or + singleton settings in the environment that affect tests + or which might be changed by the user tests. + + + + + Link to a prior saved context + + + + + Indicates that a stop has been requested + + + + + The event listener currently receiving notifications + + + + + The number of assertions for the current test + + + + + The current test result + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + An existing instance of TestExecutionContext. + + + + Gets and sets the current context. + + + + + Gets or sets the current test + + + + + The time the current test started execution + + + + + The time the current test started in Ticks + + + + + Gets the elapsed time for running the test in seconds + + + + + Gets or sets the current test result + + + + + Gets a TextWriter that will send output to the current test result. + + + + + The current test object - that is the user fixture + object on which tests are being executed. + + + + + Get or set indicator that run should stop on the first error + + + + + Gets an enum indicating whether a stop has been requested. + + + + + The current test event listener + + + + + The current WorkItemDispatcher. Made public for + use by nunitlite.tests + + + + + The ParallelScope to be used by tests running in this context. + For builds with out the parallel feature, it has no effect. + + + + + Default tolerance value used for floating point equality + when no other tolerance is specified. + + + + + The worker that spawned the context. + For builds without the parallel feature, it is null. + + + + + Gets the RandomGenerator specific to this Test + + + + + Gets the assert count. + + The assert count. + + + + The current nesting level of multiple assert blocks + + + + + Gets or sets the test case timeout value + + + + + Gets a list of ITestActions set by upstream tests + + + + + Saves or restores the CurrentCulture + + + + + Saves or restores the CurrentUICulture + + + + + Gets or sets the current for the Thread. + + + + + The current head of the ValueFormatter chain, copied from MsgUtils.ValueFormatter + + + + + If true, all tests must run on the same thread. No new thread may be spawned. + + + + + The number of times the current test has been scheduled for execution. + Currently only being executed in a test using the + + + + + Record any changes in the environment made by + the test code in the execution context so it + will be passed on to lower level tests. + + + + + Set up the execution environment to match a context. + Note that we may be running on the same thread where the + context was initially created or on a different thread. + + + + + Increments the assert count by one. + + + + + Increments the assert count by a specified amount. + + + + + Adds a new ValueFormatterFactory to the chain of formatters + + The new factory + + + + Sends a message from test to listeners. This message is not kind of test output and doesn't go to test result. + + A name recognized by the intended listeners. + A message to be sent + + + + Obtain lifetime service object + + + + + + An IsolatedContext is used when running code + that may effect the current result in ways that + should not impact the final result of the test. + A new TestExecutionContext is created with an + initially clear result, which is discarded on + exiting the context. + + + using (new TestExecutionContext.IsolatedContext()) + { + // Code that should not impact the result + } + + + + + Save the original current TestExecutionContext and + make a new isolated context current. + + + + + Restore the original TestExecutionContext. + + + + + An AdhocTestExecutionContext is created whenever a context is needed + but not available in CurrentContext. This happens when tests are run + on an ad-hoc basis or Asserts are used outside of tests. + + + + + Construct an AdhocTestExecutionContext, which is used + whenever the current TestExecutionContext is found to be null. + + + + + Enumeration indicating whether the tests are + running normally or being cancelled. + + + + + Running normally with no stop requested + + + + + A graceful stop has been requested + + + + + A forced stop has been requested + + + + + Interface to be implemented by filters applied to tests. + The filter applies when running the test, after it has been + loaded, since this is the only time an ITest exists. + + + + + Unique Empty filter. + + + + + Indicates whether this is the EmptyFilter + + + + + Indicates whether this is a top-level filter, + not contained in any other filter. + + + + + Determine if a particular test passes the filter criteria. The default + implementation checks the test itself, its parents and any descendants. + + Derived classes may override this method or any of the Match methods + to change the behavior of the filter. + + The test to which the filter is applied + True if the test passes the filter, otherwise false + + + + Determine if a particular test passes the filter criteria. The default + implementation checks the test itself, its parents and any descendants. + + Derived classes may override this method or any of the Match methods + to change the behavior of the filter. + + The test to which the filter is applied + If set to we are carrying a negation through + True if the test passes the filter, otherwise false + + + + Determine if a test matches the filter explicitly. That is, it must + be a direct match of the test itself or one of its children. + + The test to which the filter is applied + True if the test matches the filter explicitly, otherwise false + + + + Determine whether the test itself matches the filter criteria, without + examining either parents or descendants. This is overridden by each + different type of filter to perform the necessary tests. + + The test to which the filter is applied + True if the filter matches the any parent of the test + + + + Determine whether any ancestor of the test matches the filter criteria + + The test to which the filter is applied + True if the filter matches the an ancestor of the test + + + + Determine whether any descendant of the test matches the filter criteria. + + The test to be matched + True if at least one descendant matches the filter criteria + + + + Create a TestFilter instance from an XML representation. + + + + + Create a TestFilter from its TNode representation + + + + + Nested class provides an empty filter - one that always + returns true when called. It never matches explicitly. + + + + + Adds an XML node + + True if recursive + The added XML node + + + + Adds an XML node + + Parent node + True if recursive + The added XML node + + + + The TestCaseParameters class encapsulates method arguments and + other selected parameters needed for constructing + a parameterized test case. + + + + + Default Constructor creates an empty parameter set + + + + + Construct a non-runnable ParameterSet, specifying + the provider exception that made it invalid. + + + + + Construct a parameter set with a list of arguments + + + + + + Construct a ParameterSet from an object implementing ITestCaseData + + + + + + Type arguments used to create a generic fixture instance + + + + + TestListener provides an implementation of ITestListener that + does nothing. It is used only through its NULL property. + + + + + Called when a test has just started + + The test that is starting + + + + Called when a test case has finished + + The result of the test + + + + Called when a test produces output for immediate display + + A TestOutput object containing the text to display + + + + Called when a test produces a message to be sent to listeners + + A object containing the message to send + + + + Construct a new TestListener - private so it may not be used. + + + + + Get a listener that does nothing + + + + + TestNameGenerator is able to create test names according to + a coded pattern. + + + + + Default pattern used to generate names + + + + + Construct a TestNameGenerator + + + + + Construct a TestNameGenerator + + The pattern used by this generator. + + + + Get the display name for a TestMethod and its arguments + + A TestMethod + The display name + + + + Get the display name for a TestMethod and its arguments + + A TestMethod + Arguments to be used + The display name + + + + Checks if string contains any character that might need escaping. + + + + + Checks whether given char *might* need escaping. + + False when absolutely no escaping is needed, otherwise true. + + + + TestParameters is the abstract base class for all classes + that know how to provide data for constructing a test. + + + + + Default Constructor creates an empty parameter set + + + + + Construct a parameter set with a list of arguments + + + + + + Construct a non-runnable ParameterSet, specifying + the provider exception that made it invalid. + + + + + Construct a ParameterSet from an object implementing ITestData + + + + + + The RunState for this set of parameters. + + + + + The arguments to be used in running the test, + which must match the method signature. + + + + + A name to be used for this test case in lieu + of the standard generated name containing + the argument list. + + + + + Gets the property dictionary for this test + + + + + Applies ParameterSet values to the test itself. + + A test. + + + + The original arguments provided by the user, + used for display purposes. + + + + + The list of display names to use as the parameters in the test name. + + + + + TestProgressReporter translates ITestListener events into + the async callbacks that are used to inform the client + software about the progress of a test run. + + + + + Initializes a new instance of the class. + + The callback handler to be used for reporting progress. + + + + Called when a test has just started + + The test that is starting + + + + Called when a test has finished. Sends a result summary to the callback. + to + + The result of the test + + + + Called when a test produces output for immediate display + + A TestOutput object containing the text to display + + + + Called when a test produces a message to be sent to listeners + + A object containing the text to send + + + + Returns the parent test item for the target test item if it exists + + + parent test item + + + + Makes a string safe for use as an attribute, replacing + characters that can't be used with their + corresponding XML representations. + + The string to be used + A new string with the values replaced + + + + ParameterizedFixtureSuite serves as a container for the set of test + fixtures created from a given Type using various parameters. + + + + + Initializes a new instance of the class. + + The ITypeInfo for the type that represents the suite. + + + + Creates a copy of the given suite with only the descendants that pass the specified filter. + + The to copy. + Determines which descendants are copied. + + + + Gets a string representing the type of test + + + + + Creates a filtered copy of the test suite. + + Determines which descendants are copied. + + + + ParameterizedMethodSuite holds a collection of individual + TestMethods with their arguments applied. + + + + + Initializes a new instance of the class. + + + + + Creates a copy of the given suite with only the descendants that pass the specified filter. + + The to copy. + Determines which descendants are copied. + + + + Gets a MethodInfo for the method implementing this test. + + + + + Gets a string representing the type of test + + + + + Creates a filtered copy of the test suite. + + Determines which descendants are copied. + + + + SetUpFixture extends TestSuite and supports + Setup and TearDown methods. + + + + + Initializes a new instance of the class. + + + + + Creates a copy of the given suite with only the descendants that pass the specified filter. + + The to copy. + Determines which descendants are copied. + + + + Gets the TypeInfo of the fixture used in running this test. + + + + + Creates a filtered copy of the test suite. + + Determines which descendants are copied. + + + + The Test abstract class represents a test within the framework. + + + + + Static value to seed ids. It's started at 1000 so any + uninitialized ids will stand out. + + + + + Used to cache the declaring type for this MethodInfo + + + + + Method property backing field + + + + + Constructs a test given its name + + The name of the test + + + + Constructs a test given the path through the + test hierarchy to its parent and a name. + + The parent tests full name + The name of the test + + + + Constructs a test for a specific type. + + + + + Constructs a test for a specific method. + + + + + Gets or sets the id of the test + + + + + + Gets or sets the name of the test + + + + + Gets or sets the fully qualified name of the test + + + + + + Gets the name of the class where this test was declared. + Returns null if the test is not associated with a class. + + + + + Gets the name of the method implementing this test. + Returns null if the test is not implemented as a method. + + + + + The arguments to use in creating the test or empty array if none required. + + + + + Gets the TypeInfo of the fixture used in running this test + or null if no fixture type is associated with it. + + + + + Gets a MethodInfo for the method implementing this test. + Returns null if the test is not implemented as a method. + + + + + Whether or not the test should be run + + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + Gets a string representing the type of test. Used as an attribute + value in the XML representation of a test and has no other + function in the framework. + + + + + Gets a count of test cases represented by + or contained under this test. + + + + + Gets the properties for this test + + + + + Returns true if this is a TestSuite + + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Gets the parent as a Test object. + Used by the core to set the parent. + + + + + Gets this test's child tests + + A list of child tests + + + + Gets or sets a fixture object for running this test. + + + + + Static prefix used for ids in this AppDomain. + Set by FrameworkController. + + + + + Gets or Sets the Int value representing the seed for the RandomGenerator + + + + + + The SetUp methods. + + + + + The teardown methods + + + + + Creates a TestResult for this test. + + A TestResult suitable for this type of test. + + + + Modify a newly constructed test by applying any of NUnit's common + attributes, based on a supplied , which is + usually the reflection element from which the test was constructed, + but may not be in some instances. The attributes retrieved are + saved for use in subsequent operations. + + + + + Mark the test as Invalid (not runnable) specifying a reason + + The reason the test is not runnable + + + + Get custom attributes applied to a test + + + + + Add standard attributes and members to a test node. + + + + + + + Returns the XML representation of the test + + If true, include child tests recursively + + + + + Returns an XmlNode representing the current result after + adding it as a child of the supplied parent node. + + The parent node. + If true, descendant results are included + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + An object to compare with this instance. + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + An object to compare with this instance. + + + + TestAssembly is a TestSuite that represents the execution + of tests in a managed assembly. + + + + + Initializes a new instance of the class + specifying the Assembly and the suite name. + + The assembly this test represents. + + This becomes the full name of the suite and the filename part is used as the suite name. + + + + + Initializes a new instance of the class + specifying the suite name for an assembly that could not be loaded. + + + This becomes the full name of the suite and the filename part is used as the suite name. + + + + + Creates a copy of the given assembly with only the descendants that pass the specified filter. + + The to copy. + Determines which descendants are copied. + + + + Gets the Assembly represented by this instance. + + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + Get custom attributes specified on the assembly + + + + + Creates a filtered copy of the test suite. + + Determines which descendants are copied. + + + + TestFixture is a surrogate for a user test fixture class, + containing one or more tests. + + + + + The life cycle specified for the current test fixture. + + + + + Initializes a new instance of the class. + + Type of the fixture. + Arguments used to instantiate the test fixture, or null if none used + + + + Creates a copy of the given suite with only the descendants that pass the specified filter. + + The to copy. + Determines which descendants are copied. + + + + Gets the TypeInfo of the fixture used in running this test. + + + + + Creates a filtered copy of the test suite. + + Determines which descendants are copied. + + + + The TestMethod class represents a Test implemented as a method. + + + + + The ParameterSet used to create this test method + + + + + Initializes a new instance of the class. + + The method to be used as a test. + + + + Initializes a new instance of the class. + + The method to be used as a test. + The suite or fixture to which the new test will be added + + + + Gets a MethodInfo for the method implementing this test. + + + + + The arguments to use in executing the test method, or empty array if none are provided. + + + + + Overridden to return a TestCaseResult. + + A TestResult for this test. + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Returns a TNode representing the current result after + adding it as a child of the supplied parent node. + + The parent node. + If true, descendant results are included + + + + + Gets this test's child tests + + A list of child tests + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + Returns the name of the method + + + + + TestSuite represents a composite test, which contains other tests. + + + + + Our collection of child tests + + + + + Initializes a new instance of the class. + + The name of the suite. + + + + Initializes a new instance of the class. + + Name of the parent suite. + The name of the suite. + + + + Initializes a new instance of the class. + + Type of the fixture. + Arguments used to instantiate the test fixture, or null if none used. + + + + Initializes a new instance of the class. + + Type of the fixture. + + + + Creates a copy of the given suite with only the descendants that pass the specified filter. + + The to copy. + Determines which descendants are copied. + + + + Sorts tests under this suite. + + + + + Adds a test to the suite. + + The test. + + + + Creates a filtered copy of the test suite. + + Determines which descendants are copied. + + + + Gets this test's child tests + + The list of child tests + + + + Gets a count of test cases represented by + or contained under this test. + + + + + + The arguments to use in creating the fixture, or empty array if none are provided. + + + + + Set to true to suppress sorting this suite's contents + + + + + OneTimeSetUp methods for this suite + + + + + OneTimeTearDown methods for this suite + + + + + Overridden to return a TestSuiteResult. + + A TestResult for this test. + + + + Gets a bool indicating whether the current test + has any descendant tests. + + + + + Gets the name used for the top-level element in the + XML representation of this test + + + + + Returns an XmlNode representing the current result after + adding it as a child of the supplied parent node. + + The parent node. + If true, descendant results are included + + + + + Check that setup and teardown methods marked by certain attributes + meet NUnit's requirements and mark the tests not runnable otherwise. + + + + + ThreadUtility provides a set of static methods convenient + for working with threads. + + + + Gets or if the current platform does not support it. + + + Sets if current platform supports it. + Value to set. If the current platform does not support then the only allowed value is . + + + + TypeHelper provides static methods that operate on Types. + + + + + Gets the display name for a Type as used by NUnit. + + The Type for which a display name is needed. + The display name for the Type + + + + Gets the display name for a Type as used by NUnit. + + The Type for which a display name is needed. + The arglist provided. + The display name for the Type + + + + Returns the best fit for a common type to be used in + matching actual arguments to a methods Type parameters. + + + + + Determines whether the specified type is numeric. + + The type to be examined. + + if the specified type is numeric; otherwise, . + + + + + Convert an argument list to the required parameter types. + Currently, only widening numeric conversions are performed. + + An array of args to be converted + A ParameterInfo[] whose types will be used as targets + + + + Determines whether this instance can deduce type args for a generic type from the supplied arguments. + + The type to be examined. + The arglist. + The type args to be used. + + if this the provided args give sufficient information to determine the type args to be used; otherwise, . + + + + + Return the interfaces implemented by a Type. + + The Type to be examined. + An array of Types for the interfaces. + + + + Return whether or not the given type is a ValueTuple. + + Type. + Whether or not the given type is a ValueTuple. + + + + Return whether or not the given type is a Tuple. + + Type. + Whether or not the given type is a Tuple. + + + + Determines whether the cast to the given type would succeed. + If is and + can be , the cast succeeds just like the C# language feature. + + The object to cast. + + + + Casts to a value of the given type if possible. + If is and + can be , the cast succeeds just like the C# language feature. + + The object to cast. + The value of the object, if the cast succeeded. + + + + Used for resolving the type difference between objects. + + + + + Gets the shortened type name difference between and . + + The expected object. + The actual object. + Output of the unique type name for the expected object. + Output of the unique type name for actual object. + + + + Gets the shortened type name difference between and . + + The expected object . + The actual object . + Output of the unique type name for the expected object. + Output of the unique type name for actual object. + + + + Obtain the shortened generic template parameters of the given and , + if they are generic. + + The expected . + The actual . + Shortened generic parameters of the expected . + Shortened generic parameters of the actual . + + + + Obtain a shortened name of the given . + + + + + Shorten the given names by only including the relevant differing namespaces/types, if they differ. + + The expected . + The actual . + The shortened expected name. + The shortened actual name. + + + + Returns whether or not the is generic. + + + + + Returns the fully qualified generic name of a given . + + + + + Reconstruct a generic type name using the provided generic type name, and a + of the template parameters. + + The name of the generic type, including the number of template parameters expected. + A of names of the template parameters of the provided generic type. + + + + Obtain the shortened generic names of the given expected and actual s. + + The expected . + The actual . + The shortened expected generic name. + The shortened actual generic name. + + + + The TypeWrapper class wraps a Type so it may be used in + a platform-independent manner. + + + + + Construct a TypeWrapper for a specified Type. + + + + + Gets the underlying Type on which this TypeWrapper is based. + + + + + Gets the base type of this type as an ITypeInfo + + + + + Gets the Name of the Type + + + + + Gets the FullName of the Type + + + + + Gets the assembly in which the type is declared + + + + + Gets the namespace of the Type + + + + + Gets a value indicating whether the type is abstract. + + + + + Gets a value indicating whether the Type is a generic Type + + + + + Returns true if the Type wrapped is T + + + + + Gets a value indicating whether the Type has generic parameters that have not been replaced by specific Types. + + + + + Gets a value indicating whether the Type is a generic Type definition + + + + + Gets a value indicating whether the type is sealed. + + + + + Gets a value indicating whether this type represents a static class. + + + + + Get the display name for this type + + + + + Get the display name for an object of this type, constructed with the specified args. + + + + + Returns a new ITypeInfo representing an instance of this generic Type using the supplied Type arguments + + + + + Returns a Type representing a generic type definition from which this Type can be constructed. + + + + + Returns an array of custom attributes of the specified type applied to this type + + + + + Returns a value indicating whether the type has an attribute of the specified type. + + + + + + + + Returns a flag indicating whether this type has a method with an attribute of the specified type. + + + + + + + Returns an array of IMethodInfos for methods of this Type + that match the specified flags. + + + + + Gets the public constructor taking the specified argument Types + + + + + Returns a value indicating whether this Type has a public constructor taking the specified argument Types. + + + + + Construct an object of this Type, using the specified arguments. + + + + + Override ToString() so that error messages in NUnit's own tests make sense + + + + + Returns all methods declared by this type that have the specified attribute, optionally + including base classes. Methods from a base class are always returned before methods from a class that + inherits from it. + + Specifies whether to search the fixture type inheritance chain. + + + + Encapsulates the ability to increment a value by an amount which may be of a different type. + + + + + Creates a from the specified value if the current instance is able to + use it to increment the on values which it operates. If the creation fails, + is thrown. + + + + + + Creates a from the specified value if the current instance is able to + use it to increment values on which it operates. A return value indicates + whether the creation succeeded. + + + + + Provides a convenient shorthand when is + and the default value of represents zero. + + + + + Initializes a new instance of the class. + + The amount by which to increment each time this step is applied. + + Must increment the given value and return the result. + If the result is outside the range representable by , + must throw . If the result does not change due to lack + of precision representable by , must throw . + + + + + Increments the given value and returns the result. + If the result is outside the range representable by , + throws . If the result does not change due to lack + of precision representable by , throws . + + + + + + + Encapsulates the ability to increment a value by an amount + which may be of a different type. + + + + + Increments the given value and returns the result. + If the result is outside the range representable by , + throws . If the result does not change due to lack + of precision representable by , throws . + + + + + + + Creates a from the specified value if the current instance is able to + use it to increment values of type . If the creation fails, + is thrown. + + + + + + Creates a from the specified value if the current instance is able to + use it to increment values of type . A return value indicates + whether the creation succeeded. + + + + + The IgnoredTestCaseData class represents a ignored TestCaseData. It adds + the ability to set a date until which the test will be ignored. + + + + + The previous RunState + + + + + Set the date that the test is being ignored until + + The date that the test is being ignored until + A modified TestCaseData. + + + + Helper class with properties and methods that supply + a number of constraints used in Asserts. + + + + + Returns a ConstraintExpression that negates any + following constraint. + + + + + Returns a ConstraintExpression, which will apply + the following constraint to all members of a collection, + succeeding if all of them succeed. + + + + + Returns a constraint that tests for null + + + + + Returns a constraint that tests for True + + + + + Returns a constraint that tests for False + + + + + Returns a constraint that tests for a positive value + + + + + Returns a constraint that tests for a negative value + + + + + Returns a constraint that tests for equality with zero + + + + + Returns a constraint that tests for NaN + + + + + Returns a constraint that tests for empty + + + + + Returns a constraint that tests whether a collection + contains all unique items. + + + + + Returns a constraint that tests whether an object graph is serializable in binary format. + + + + + Returns a constraint that tests whether an object graph is serializable in XML format. + + + + + Returns a constraint that tests two items for equality + + + + + Returns a constraint that tests that two references are the same object + + + + + Returns a constraint that tests whether the + actual value is greater than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is greater than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the + actual value is less than or equal to the supplied argument + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual + value is of the exact type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is of the type supplied as an argument or a derived type. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable from the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable to the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is assignable to the type supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a collection containing the same elements as the + collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a subset of the collection supplied as an argument. + + + + + Returns a constraint that tests whether the actual value + is a superset of the collection supplied as an argument. + + + + + Returns a constraint that tests whether a collection is ordered + + + + + Returns a constraint that tests whether the path provided + is the same as an expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is a subpath of the expected path after canonicalization. + + + + + Returns a constraint that tests whether the path provided + is the same path or under an expected path after canonicalization. + + + + + Returns a constraint that tests whether the actual value falls + inclusively within a specified range. + + Inclusive beginning of the range. + Inclusive end of the range. + + + + + Returns a constraint that tests if an item is equal to any of parameters + + Expected values + + + + When implemented by an attribute, this interface implemented to provide actions to execute before and after tests. + + + + + Executed before each test is run + + The test that is going to be run. + + + + Executed after each test is run + + The test that has just been run. + + + + Provides the target for the action attribute + + The target for the action attribute + + + + The Iz class is a synonym for Is intended for use in VB, + which regards Is as a keyword. + + + + + The List class is a helper class with properties and methods + that supply a number of constraints used with lists and collections. + + + + + List.Map returns a ListMapper, which can be used to map + the original collection to another collection. + + + + + + + ListMapper is used to transform a collection used as an actual argument + producing another collection to be used in the assertion. + + + + + Construct a ListMapper based on a collection + + The collection to be transformed + + + + Produces a collection containing all the values of a property + + The collection of property values + + + + + Basic Asserts on strings. + + + + + DO NOT USE! Use StringAssert.AreEqualIgnoringCase(...) or Assert.AreEqual(...) instead. + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + + + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + + + + Asserts that a string is not found within another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string is found within another string. + + The expected string + The string to be examined + + + + Asserts that a string starts with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string starts with another string. + + The expected string + The string to be examined + + + + Asserts that a string does not start with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string does not start with another string. + + The expected string + The string to be examined + + + + Asserts that a string ends with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string ends with another string. + + The expected string + The string to be examined + + + + Asserts that a string does not end with another string. + + The expected string + The string to be examined + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string does not end with another string. + + The expected string + The string to be examined + + + + Asserts that two strings are equal, without regard to case. + + The expected string + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that two strings are equal, without regard to case. + + The expected string + The actual string + + + + Asserts that two strings are not equal, without regard to case. + + The expected string + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that two strings are not equal, without regard to case. + + The expected string + The actual string + + + + Asserts that a string matches an expected regular expression pattern. + + The regex pattern to be matched + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string matches an expected regular expression pattern. + + The regex pattern to be matched + The actual string + + + + Asserts that a string does not match an expected regular expression pattern. + + The regex pattern to be used + The actual string + The message to display in case of failure + Arguments used in formatting the message + + + + Asserts that a string does not match an expected regular expression pattern. + + The regex pattern to be used + The actual string + + + + The TestCaseData class represents a set of arguments + and other parameter info to be used for a parameterized + test case. It is derived from TestCaseParameters and adds a + fluent syntax for use in initializing the test case. + + + + + Initializes a new instance of the class. + + The arguments. + + + + Initializes a new instance of the class. + + The argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + The third argument. + + + + Sets the expected result for the test + + The expected result + A modified TestCaseData + + + + Sets the name of the test case + + The modified TestCaseData instance + + + + Sets the list of display names to use as the parameters in the test name. + + + + + Sets the description for the test case + being constructed. + + The description. + The modified TestCaseData instance. + + + + Applies a category to the test + + + + + + + Applies a named property to the test + + + + + + + + Applies a named property to the test + + + + + + + + Applies a named property to the test + + + + + + + + Marks the test case as explicit. + + + + + Marks the test case as explicit, specifying the reason. + + + + + Ignores this TestCase, specifying the reason. + + The reason. + + + + + Provide the context information of the current test. + This is an adapter for the internal ExecutionContext + class, hiding the internals from the user test. + + + + + Construct a TestContext for an ExecutionContext + + The ExecutionContext to adapt + + + + Get the current test context. This is created + as needed. The user may save the context for + use within a test, but it should not be used + outside the test for which it is created. + + + + + Gets a TextWriter that will send output to the current test result. + + + + + Gets a TextWriter that will send output directly to Console.Error + + + + + Gets a TextWriter for use in displaying immediate progress messages + + + + + TestParameters object holds parameters for the test run, if any are specified + + + + + Static DefaultWorkDirectory is now used as the source + of the public instance property WorkDirectory. This is + a bit odd but necessary to avoid breaking user tests. + + + + + Get a representation of the current test. + + + + + Gets a Representation of the TestResult for the current test. + + + + + Gets the unique name of the Worker that is executing this test. + + + + + Gets the directory containing the current test assembly. + + + + + Gets the directory to be used for outputting files created + by this test run. + + + + + Gets the random generator. + + + The random generator. + + + + + Gets the number of assertions executed + up to this point in the test. + + + + + Get the number of times the current Test has been repeated + when using the or . + + + + Write the string representation of a boolean value to the current result + + + Write a char to the current result + + + Write a char array to the current result + + + Write the string representation of a double to the current result + + + Write the string representation of an Int32 value to the current result + + + Write the string representation of an Int64 value to the current result + + + Write the string representation of a decimal value to the current result + + + Write the string representation of an object to the current result + + + Write the string representation of a Single value to the current result + + + Write a string to the current result + + + Write the string representation of a UInt32 value to the current result + + + Write the string representation of a UInt64 value to the current result + + + Write a formatted string to the current result + + + Write a formatted string to the current result + + + Write a formatted string to the current result + + + Write a formatted string to the current result + + + Write a line terminator to the current result + + + Write the string representation of a boolean value to the current result followed by a line terminator + + + Write a char to the current result followed by a line terminator + + + Write a char array to the current result followed by a line terminator + + + Write the string representation of a double to the current result followed by a line terminator + + + Write the string representation of an Int32 value to the current result followed by a line terminator + + + Write the string representation of an Int64 value to the current result followed by a line terminator + + + Write the string representation of a decimal value to the current result followed by a line terminator + + + Write the string representation of an object to the current result followed by a line terminator + + + Write the string representation of a Single value to the current result followed by a line terminator + + + Write a string to the current result followed by a line terminator + + + Write the string representation of a UInt32 value to the current result followed by a line terminator + + + Write the string representation of a UInt64 value to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + + Write a formatted string to the current result followed by a line terminator + + + + This method adds the a new ValueFormatterFactory to the + chain of responsibility used for formatting values in messages. + The scope of the change is the current TestContext. + + The factory delegate + + + + Attach a file to the current test result + + Relative or absolute file path to attachment + Optional description of attachment + + + + This method provides a simplified way to add a ValueFormatter + delegate to the chain of responsibility, creating the factory + delegate internally. It is useful when the Type of the object + is the only criterion for selection of the formatter, since + it can be used without getting involved with a compound function. + + The type supported by this formatter + The ValueFormatter delegate + + + + TestAdapter adapts a Test for consumption by + the user test code. + + + + + Construct a TestAdapter for a Test + + The Test to be adapted + + + + Gets the unique Id of a test + + + + + The name of the test, which may or may not be + the same as the method name. + + + + + The name of the method representing the test. + + + + + The FullName of the test + + + + + The ClassName of the test + + + + + A shallow copy of the properties of the test. + + + + + The arguments to use in creating the test or empty array if none are required. + + + + + ResultAdapter adapts a TestResult for consumption by + the user test code. + + + + + Construct a ResultAdapter for a TestResult + + The TestResult to be adapted + + + + Gets a ResultState representing the outcome of the test + up to this point in its execution. + + + + + Gets a list of the assertion results generated + up to this point in the test. + + + + + Gets the message associated with a test + failure or with not running the test + + + + + Gets any stack trace associated with an + error or failure. + + + + + Gets the number of test cases that failed + when running the test and all its children. + + + + + Gets the number of test cases that had warnings + when running the test and all its children. + + + + + Gets the number of test cases that passed + when running the test and all its children. + + + + + Gets the number of test cases that were skipped + when running the test and all its children. + + + + + Gets the number of test cases that were inconclusive + when running the test and all its children. + + + + + adapts an + for consumption by the user. + + + + + Construct a from a source + . + + + + + Get the first property with the given , if it can be found, otherwise + returns null. + + + + + Indicates whether is found in this + . + + + + + Returns a collection of properties + with the given . + + + + + Returns the count of elements with the given . + + + + + Returns a collection of the property keys. + + + + + The TestFixtureData class represents a set of arguments + and other parameter info to be used for a parameterized + fixture. It is derived from TestFixtureParameters and adds a + fluent syntax for use in initializing the fixture. + + + + + Initializes a new instance of the class. + + The arguments. + + + + Initializes a new instance of the class. + + The argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + + + + Initializes a new instance of the class. + + The first argument. + The second argument. + The third argument. + + + + Sets the name of the test fixture + + The modified TestFixtureData instance + + + + Sets the list of display names to use as the parameters in the test name. + + + + + Marks the test fixture as explicit. + + + + + Marks the test fixture as explicit, specifying the reason. + + + + + Ignores this TestFixture, specifying the reason. + + The reason. + + + + + TestParameters class holds any named parameters supplied to the test run + + + + + Gets the number of test parameters + + + + + Gets a collection of the test parameter names + + + + + Gets a flag indicating whether a parameter with the specified name exists. + + Name of the parameter + True if it exists, otherwise false + + + + Indexer provides access to the internal dictionary + + Name of the parameter + Value of the parameter or null if not present + + + + Get method is a simple alternative to the indexer + + Name of the parameter + Value of the parameter or null if not present + + + + Get the value of a parameter or a default string + + Name of the parameter + Default value of the parameter + Value of the parameter or default value if not present + + + + Get the value of a parameter or return a default + + The return Type + Name of the parameter + Default value of the parameter + Value of the parameter or default value if not present + + + + Adds a parameter to the list + + Name of the parameter + Value of the parameter + + + + Helper class with properties and methods that supply + constraints that operate on exceptions. + + + + + Creates a constraint specifying an expected exception + + + + + Creates a constraint specifying an exception with a given InnerException + + + + + Creates a constraint specifying an expected TargetInvocationException + + + + + Creates a constraint specifying an expected ArgumentException + + + + + Creates a constraint specifying an expected ArgumentNullException + + + + + Creates a constraint specifying an expected InvalidOperationException + + + + + Creates a constraint specifying that no exception is thrown + + + + + Creates a constraint specifying the exact type of exception expected + + + + + Creates a constraint specifying the exact type of exception expected + + + + + Creates a constraint specifying the type of exception expected + + + + + Creates a constraint specifying the type of exception expected + + + + + Provides static methods to express conditions + that must be met for the test to succeed. If + any test fails, a warning is issued. + + + + + DO NOT USE! + The Equals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + The left object. + The right object. + Not applicable + + + + DO NOT USE! + The ReferenceEquals method throws an InvalidOperationException. This is done + to make sure there is no mistake by calling this function. + + The left object. + The right object. + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Asserts that a condition is true. If the condition is false, a warning is issued. + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false, a warning is issued. + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false, a warning is issued. + + The evaluated condition + A function to build the message included with the Exception + + + + Asserts that a condition is true. If the condition is false, a warning is issued. + + A lambda that returns a Boolean + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false, a warning is issued. + + A lambda that returns a Boolean + + + + Asserts that a condition is true. If the condition is false, a warning is issued. + + A lambda that returns a Boolean + A function to build the message included with the Exception + + + + Asserts that the code represented by a delegate throws an exception + that satisfies the constraint provided. + + A TestDelegate to be executed + A Constraint expression to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning on success. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning on success. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning on failure. + + The Type being compared. + An ActualValueDelegate returning the value to be tested + A Constraint expression to be applied + A function to build the message included with the Exception + + + + Asserts that a condition is true. If the condition is false, a warning is issued. + + The evaluated condition + The message to display if the condition is false + Arguments to be used in formatting the message + + + + Asserts that a condition is true. If the condition is false, a warning is issued. + + The evaluated condition + + + + Asserts that a condition is true. If the condition is false, a warning is issued. + + The evaluated condition + A function to build the message included with the Exception + + + + Asserts that a condition is false. If the condition is true a warning is issued. + + A lambda that returns a Boolean + The message to display if the condition is true + Arguments to be used in formatting the message + + + + Asserts that a condition is false. If the condition is true a warning is issued. + + A lambda that returns a Boolean + + + + Asserts that a condition is false. If the condition is true a warning is issued. + + A lambda that returns a Boolean + A function to build the message included with the Exception + + + + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning if it succeeds. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + + + + Apply a constraint to an actual value, succeeding if the constraint + fails and issuing a warning if it succeeds. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + The message that will be displayed on failure + Arguments to be used in formatting the message + + + + Apply a constraint to an actual value, succeeding if the constraint + is satisfied and issuing a warning on failure. + + The Type being compared. + The actual value to test + A Constraint expression to be applied + A function to build the message included with the Exception + + + + FrameworkPackageSettings is a static class containing constant values that + are used as keys in setting up a TestPackage. These values are used in + the framework, and set in the runner. Setting values may be a string, int or bool. + + + + + Flag (bool) indicating whether tests are being debugged. + + + + + Flag (bool) indicating whether to pause execution of tests to allow + the user to attach a debugger. + + + + + The InternalTraceLevel for this run. Values are: "Default", + "Off", "Error", "Warning", "Info", "Debug", "Verbose". + Default is "Off". "Debug" and "Verbose" are synonyms. + + + + + Full path of the directory to be used for work and result files. + This path is provided to tests by the framework TestContext. + + + + + Integer value in milliseconds for the default timeout value + for test cases. If not specified, there is no timeout except + as specified by attributes on the tests themselves. + + + + + A string representing the default thread culture to be used for + running tests. String should be a valid BCP-47 culture name. If + culture is unset, tests run on the machine's default culture. + + + + + A string representing the default thread UI culture to be used for + running tests. String should be a valid BCP-47 culture name. If + culture is unset, tests run on the machine's default culture. + + + + + A TextWriter to which the internal trace will be sent. + + + + + A list of tests to be loaded. + + + + + The number of test threads to run for the assembly. If set to + 1, a single queue is used. If set to 0, tests are executed + directly, without queuing. + + + + + The random seed to be used for this assembly. If specified + as the value reported from a prior run, the framework should + generate identical random values for tests as were used for + that run, provided that no change has been made to the test + assembly. Default is a random value itself. + + + + + If true, execution stops after the first error or failure. + + + + + If true, use of the event queue is suppressed and test events are synchronous. + + + + + The default naming pattern used in generating test names + + + + + Parameters to be passed on to the tests, serialized to a single string which needs parsing. Obsoleted by ; kept for backward compatibility. + + + + + Parameters to be passed on to the tests, already parsed into an IDictionary<string, string>. Replaces . + + + + + If true, the tests will run on the same thread as the NUnit runner itself + + + + + Provides a platform-independent methods for getting attributes + for use by AttributeConstraint and AttributeExistsConstraint. + + + + + Gets the custom attributes from the given object. + + The actual. + Type of the attribute. + if set to [inherit]. + A list of the given attribute on the given object. + + + + A MarshalByRefObject that lives forever + + + + + Obtains a lifetime service object to control the lifetime policy for this instance. + + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + Specifies that null is disallowed as an input even if the corresponding type allows it. + + + Specifies that an output may be null even if the corresponding type disallows it. + + + Specifies that an output will not be null even if the corresponding type allows it. Specifies that an input argument was not null when the call returns. + + + Specifies that when a method returns , the parameter may be null even if the corresponding type disallows it. + + + Initializes the attribute with the specified return value condition. + + The return value condition. If the method returns this value, the associated parameter may be null. + + + + Gets the return value condition. + + + Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it. + + + Initializes the attribute with the specified return value condition. + + The return value condition. If the method returns this value, the associated parameter will not be null. + + + + Gets the return value condition. + + + Specifies that the output will be non-null if the named parameter is non-null. + + + Initializes the attribute with the associated parameter name. + + The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null. + + + + Gets the associated parameter name. + + + Applied to a method that will never return under any circumstance. + + + Specifies that the method will not return if the associated Boolean parameter is passed the specified value. + + + Initializes the attribute with the specified parameter value. + + The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to + the associated parameter matches this value. + + + + Gets the condition parameter value. + + + + A shim of the .NET interface for platforms that do not support it. + Used to indicate that a control can be the target of a callback event on the server. + + + + + Processes a callback event that targets a control. + + + + + + Returns the results of a callback event that targets a control. + + + + + diff --git a/Source/Platforms/DotNet/NUnit/nunit.console.nuget.addins b/Source/Platforms/DotNet/NUnit/nunit.console.nuget.addins deleted file mode 100644 index c5495ff20..000000000 --- a/Source/Platforms/DotNet/NUnit/nunit.console.nuget.addins +++ /dev/null @@ -1,6 +0,0 @@ -../../NUnit.Extension.*/**/tools/ # nuget v2 layout -../../../NUnit.Extension.*/**/tools/ # nuget v3 layout -../../../../NUnit.Extension.*/**/tools/ -../../nunit.extension.*/**/tools/ # nuget v2 layout -../../../nunit.extension.*/**/tools/ # nuget v3 layout -../../../../nunit.extension.*/**/tools/ diff --git a/Source/Platforms/DotNet/NUnit/nunit.engine.api.dll b/Source/Platforms/DotNet/NUnit/nunit.engine.api.dll deleted file mode 100644 index 8097fec02..000000000 --- a/Source/Platforms/DotNet/NUnit/nunit.engine.api.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:695191d3cc03eea28fee47cc265d977a8cb884bf0a8e8403a8006c0141edbca1 -size 18432 diff --git a/Source/Platforms/DotNet/NUnit/nunit.engine.core.dll b/Source/Platforms/DotNet/NUnit/nunit.engine.core.dll deleted file mode 100644 index e70119fd5..000000000 --- a/Source/Platforms/DotNet/NUnit/nunit.engine.core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56d27370c602bf1b6f4cb1d14ac634e71d693c7cea3e256d6d578f057509c0fa -size 111616 diff --git a/Source/Platforms/DotNet/NUnit/nunit.engine.dll b/Source/Platforms/DotNet/NUnit/nunit.engine.dll deleted file mode 100644 index efe00b34b..000000000 --- a/Source/Platforms/DotNet/NUnit/nunit.engine.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c4873d02f61aa83738c9265b6f11a5ea13b0620fa2fb331a40e3ceb2e191599 -size 65024 diff --git a/Source/Platforms/DotNet/NUnit/nunit3-console.exe b/Source/Platforms/DotNet/NUnit/nunit3-console.exe deleted file mode 100644 index f17d502cb..000000000 --- a/Source/Platforms/DotNet/NUnit/nunit3-console.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a83a53495d68679a5edb1b8ca72fc8ca44e571d6754015bd74d82ed69ee88d4 -size 165376 diff --git a/Source/Platforms/DotNet/NUnit/nunit3-console.exe.config b/Source/Platforms/DotNet/NUnit/nunit3-console.exe.config deleted file mode 100644 index bf784cbb9..000000000 --- a/Source/Platforms/DotNet/NUnit/nunit3-console.exe.config +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/DotNet/NUnit/testcentric.engine.metadata.dll b/Source/Platforms/DotNet/NUnit/testcentric.engine.metadata.dll deleted file mode 100644 index 8d16a9559..000000000 --- a/Source/Platforms/DotNet/NUnit/testcentric.engine.metadata.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b08bf44fd3270243def47673d606959915ba723db7e694e58cb44a92145b0ebb -size 176640 diff --git a/Source/Platforms/DotNet/Newtonsoft.Json.dll b/Source/Platforms/DotNet/Newtonsoft.Json.dll index 5008fe379..db1ecd531 100644 --- a/Source/Platforms/DotNet/Newtonsoft.Json.dll +++ b/Source/Platforms/DotNet/Newtonsoft.Json.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ae7735f3860c48469e742c58db938e07296e64980fe8d41c553611779588ca36 -size 641536 +oid sha256:cf0320e0e2e754a77d7cbeeaed16fc6c4e0dfac9953e258b86a09edbe93627d3 +size 604160 diff --git a/Source/Platforms/DotNet/Newtonsoft.Json.pdb b/Source/Platforms/DotNet/Newtonsoft.Json.pdb index 668e4498d..b3feda587 100644 --- a/Source/Platforms/DotNet/Newtonsoft.Json.pdb +++ b/Source/Platforms/DotNet/Newtonsoft.Json.pdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f02fcabf8a74dd70f1dcf9d53c4db95c69f44e236e2a2d1530e54aa4bdfb1cc8 -size 252212 +oid sha256:ca10fa9bd4f681410afd8c935930826511d98b33c729b721c0dba818239208bf +size 239532 diff --git a/Source/Platforms/DotNet/Newtonsoft.Json.xml b/Source/Platforms/DotNet/Newtonsoft.Json.xml index 316a82975..042a33d2f 100644 --- a/Source/Platforms/DotNet/Newtonsoft.Json.xml +++ b/Source/Platforms/DotNet/Newtonsoft.Json.xml @@ -463,6 +463,70 @@ true if this instance can convert the specified object type; otherwise, false. + + + Converts a F# discriminated union type to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an Entity Framework to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + Converts an to and from JSON. @@ -643,12 +707,18 @@ true if the written enum text will be camel case; otherwise, false. + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + - Gets or sets a value indicating whether integer values are allowed when deserializing. + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. The default value is true. - true if integers are allowed when deserializing; otherwise, false. + true if integers are allowed when serializing and deserializing; otherwise, false. @@ -661,6 +731,44 @@ true if the written enum text will be camel case; otherwise, false. + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + Writes the JSON representation of the object. @@ -693,6 +801,32 @@ Converts a to and from Unix epoch time + + + Gets or sets a value indicating whether the dates before Unix epoch + should converted to and from JSON. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + Writes the JSON representation of the object. @@ -743,65 +877,6 @@ true if this instance can convert the specified object type; otherwise, false. - - - Converts XML to and from JSON. - - - - - Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. - - The name of the deserialized root element. - - - - Gets or sets a flag to indicate whether to write the Json.NET array attribute. - This attribute helps preserve arrays when converting the written XML back to JSON. - - true if the array attribute is written to the XML; otherwise, false. - - - - Gets or sets a value indicating whether to write the root JSON object. - - true if the JSON root object is omitted; otherwise, false. - - - - Writes the JSON representation of the object. - - The to write to. - The calling serializer. - The value. - - - - Reads the JSON representation of the object. - - The to read from. - Type of the object. - The existing value of object being read. - The calling serializer. - The object value. - - - - Checks if the is a namespace attribute. - - Attribute name to test. - The attribute name prefix if it has one, otherwise an empty string. - true if attribute name is for a namespace attribute, otherwise false. - - - - Determines whether this instance can convert the specified value type. - - Type of the value. - - true if this instance can convert the specified value type; otherwise, false. - - Specifies how dates are formatted when writing JSON text. @@ -829,12 +904,12 @@ - Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . - Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . @@ -863,6 +938,33 @@ Time zone information should be preserved when converting. + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + Specifies default value handling options for the . @@ -1306,7 +1408,7 @@ Converts the to its JSON string representation. The value to convert. - A JSON string representation of the . + A JSON string representation of the . @@ -1574,110 +1676,6 @@ If this is null, default serialization settings will be used. - - - Serializes the to a JSON string. - - The node to serialize. - A JSON string of the . - - - - Serializes the to a JSON string using formatting. - - The node to serialize. - Indicates how the output should be formatted. - A JSON string of the . - - - - Serializes the to a JSON string using formatting and omits the root object if is true. - - The node to serialize. - Indicates how the output should be formatted. - Omits writing the root object. - A JSON string of the . - - - - Deserializes the from a JSON string. - - The JSON string. - The deserialized . - - - - Deserializes the from a JSON string nested in a root element specified by . - - The JSON string. - The name of the root element to append when deserializing. - The deserialized . - - - - Deserializes the from a JSON string nested in a root element specified by - and writes a Json.NET array attribute for collections. - - The JSON string. - The name of the root element to append when deserializing. - - A flag to indicate whether to write the Json.NET array attribute. - This attribute helps preserve arrays when converting the written XML back to JSON. - - The deserialized . - - - - Serializes the to a JSON string. - - The node to convert to JSON. - A JSON string of the . - - - - Serializes the to a JSON string using formatting. - - The node to convert to JSON. - Indicates how the output should be formatted. - A JSON string of the . - - - - Serializes the to a JSON string using formatting and omits the root object if is true. - - The node to serialize. - Indicates how the output should be formatted. - Omits writing the root object. - A JSON string of the . - - - - Deserializes the from a JSON string. - - The JSON string. - The deserialized . - - - - Deserializes the from a JSON string nested in a root element specified by . - - The JSON string. - The name of the root element to append when deserializing. - The deserialized . - - - - Deserializes the from a JSON string nested in a root element specified by - and writes a Json.NET array attribute for collections. - - The JSON string. - The name of the root element to append when deserializing. - - A flag to indicate whether to write the Json.NET array attribute. - This attribute helps preserve arrays when converting the written XML back to JSON. - - The deserialized . - Converts an object to and from JSON. @@ -1906,6 +1904,20 @@ Instructs the not to serialize the public field or public read/write property value. + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + Instructs the how to serialize the object. @@ -1917,6 +1929,12 @@ The member serialization. + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + Gets or sets how the object's properties with null values are handled during serialization and deserialization. @@ -1955,9 +1973,9 @@ - Gets or sets the used when serializing the property's collection items. + Gets or sets the type used when serializing the property's collection items. - The collection's items . + The collection's items type. @@ -2302,6 +2320,8 @@ Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. @@ -2510,6 +2530,24 @@ The exception thrown when an error occurs during JSON serialization or deserialization. + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + Initializes a new instance of the class. @@ -2539,6 +2577,17 @@ The parameter is null. The class name is null or is zero (0). + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + Serializes and deserializes objects into and from the JSON format. @@ -2580,7 +2629,7 @@ Gets or sets how a type name assembly is written and resolved by the serializer. - The default value is . + The default value is . The type name assembly format. @@ -2714,7 +2763,7 @@ Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . A null value means there is no maximum. - The default value is null. + The default value is 64. @@ -2790,14 +2839,14 @@ Populates the JSON values onto the target object. - The that contains the JSON structure to reader values from. + The that contains the JSON structure to read values from. The target object to populate values onto. Populates the JSON values onto the target object. - The that contains the JSON structure to reader values from. + The that contains the JSON structure to read values from. The target object to populate values onto. @@ -2809,7 +2858,7 @@ - Deserializes the JSON structure contained by the specified + Deserializes the JSON structure contained by the specified into an instance of the specified type. The containing the object. @@ -2994,7 +3043,7 @@ Gets or sets how a type name assembly is written and resolved by the serializer. - The default value is . + The default value is . The type name assembly format. @@ -3053,7 +3102,7 @@ Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . A null value means there is no maximum. - The default value is null. + The default value is 64. @@ -3120,6 +3169,12 @@ Initializes a new instance of the class. + + + Initializes a new instance of the class + using values copied from the passed in . + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. @@ -3221,6 +3276,11 @@ The containing the JSON data to read. + + + Gets or sets the reader's property name table. + + Gets or sets the reader's character buffer pool. @@ -4251,139 +4311,6 @@ Byte data. - - - - Represents a reader that provides validation. - - - JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. - - - - - - Sets an event handler for receiving schema validation errors. - - - - - Gets the text value of the current JSON token. - - - - - - Gets the depth of the current token in the JSON document. - - The depth of the current token in the JSON document. - - - - Gets the path of the current JSON token. - - - - - Gets the quotation mark character used to enclose the value of a string. - - - - - - Gets the type of the current JSON token. - - - - - - Gets the .NET type for the current JSON token. - - - - - - Initializes a new instance of the class that - validates the content returned from the given . - - The to read from while validating. - - - - Gets or sets the schema. - - The schema. - - - - Gets the used to construct this . - - The specified in the constructor. - - - - Changes the reader's state to . - If is set to true, the underlying is also closed. - - - - - Reads the next JSON token from the underlying as a of . - - A of . - - - - Reads the next JSON token from the underlying as a []. - - - A [] or null if the next JSON token is null. - - - - - Reads the next JSON token from the underlying as a of . - - A of . - - - - Reads the next JSON token from the underlying as a of . - - A of . - - - - Reads the next JSON token from the underlying as a of . - - A of . - - - - Reads the next JSON token from the underlying as a . - - A . This method will return null at the end of an array. - - - - Reads the next JSON token from the underlying as a of . - - A of . This method will return null at the end of an array. - - - - Reads the next JSON token from the underlying as a of . - - A of . - - - - Reads the next JSON token from the underlying . - - - true if the next token was read successfully; false if there are no more tokens to read. - - Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. @@ -5551,6 +5478,26 @@ Load comments as a with type . + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + Contains the LINQ to JSON extension methods. @@ -6028,16 +5975,6 @@ Represents a token that can contain other tokens. - - - Occurs when the list changes or an item in the list changes. - - - - - Occurs before an item is added to the collection. - - Occurs when the items list of the collection has changed, or the collection is reset. @@ -6049,18 +5986,6 @@ The container's children tokens. - - - Raises the event. - - The instance containing the event data. - - - - Raises the event. - - The instance containing the event data. - Raises the event. @@ -6317,11 +6242,21 @@ - Gets a the specified name. + Gets a with the specified name. The property name. A with the specified name or null. + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + Gets a of of this object's property values. @@ -6599,93 +6534,6 @@ If this is null, default load settings will be used. A that contains the JSON that was read from the specified . - - - Represents a view of a . - - - - - Initializes a new instance of the class. - - The name. - - - - When overridden in a derived class, returns whether resetting an object changes its value. - - - true if resetting the component changes its value; otherwise, false. - - The component to test for reset capability. - - - - When overridden in a derived class, gets the current value of the property on a component. - - - The value of a property for a given component. - - The component with the property for which to retrieve the value. - - - - When overridden in a derived class, resets the value for this property of the component to the default value. - - The component with the property value that is to be reset to the default value. - - - - When overridden in a derived class, sets the value of the component to a different value. - - The component with the property value that is to be set. - The new value. - - - - When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. - - - true if the property should be persisted; otherwise, false. - - The component with the property to be examined for persistence. - - - - When overridden in a derived class, gets the type of the component this property is bound to. - - - A that represents the type of component this property is bound to. - When the or - - methods are invoked, the object specified might be an instance of this type. - - - - - When overridden in a derived class, gets a value indicating whether this property is read-only. - - - true if the property is read-only; otherwise, false. - - - - - When overridden in a derived class, gets the type of the property. - - - A that represents the type of the property. - - - - - Gets the hash code for the name of the member. - - - - The hash code for the name of the member. - - Represents a raw JSON string. @@ -6719,6 +6567,25 @@ The reader. An instance of with the content of the reader's current token. + + + Specifies the settings used when cloning JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag that indicates whether to copy annotations when cloning a . + The default value is true. + + + A flag that indicates whether to copy annotations when cloning a . + + Specifies the settings used when loading JSON. @@ -6732,20 +6599,34 @@ Gets or sets how JSON comments are handled when loading JSON. + The default value is . The JSON comment handling. Gets or sets how JSON line info is handled when loading JSON. + The default value is . The JSON line info handling. + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + Specifies the settings used when merging JSON. + + + Initializes a new instance of the class. + + Gets or sets the method used when merging JSON arrays. @@ -6758,6 +6639,35 @@ How null value properties are merged. + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Specifies the settings used when selecting JSON. + + + + + Gets or sets a timeout that will be used when executing regular expressions. + + The timeout that will be used when executing regular expressions. + + + + Gets or sets a flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + A flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + Represents an abstract JSON token. @@ -6999,6 +6909,10 @@ Returns the indented JSON for this token. + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + The indented JSON for this token. @@ -7632,42 +7546,62 @@ - Selects a using a JPath expression. Selects the token that matches the object path. + Selects a using a JSONPath expression. Selects the token that matches the object path. - A that contains a JPath expression. + A that contains a JSONPath expression. A , or null. - Selects a using a JPath expression. Selects the token that matches the object path. + Selects a using a JSONPath expression. Selects the token that matches the object path. - A that contains a JPath expression. + A that contains a JSONPath expression. A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. A . - + - Selects a collection of elements using a JPath expression. + Selects a using a JSONPath expression. Selects the token that matches the object path. - A that contains a JPath expression. + A that contains a JSONPath expression. + + The used to select tokens. + A . + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. An of that contains the selected elements. - Selects a collection of elements using a JPath expression. + Selects a collection of elements using a JSONPath expression. - A that contains a JPath expression. + A that contains a JSONPath expression. A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. An of that contains the selected elements. + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + The used to select tokens. + An of that contains the selected elements. + Returns the responsible for binding operations performed on this object. @@ -7692,6 +7626,13 @@ A new instance of the . + + + Creates a new instance of the . All child tokens are recursively cloned. + + A object to configure cloning settings. + A new instance of the . + Adds an object to the annotation list of this . @@ -7777,6 +7718,13 @@ The token to read from. + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + Reads the next JSON token from the underlying . @@ -8290,6 +8238,10 @@ Returns a that represents this instance. + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + A that represents this instance. @@ -8570,590 +8522,6 @@ The property is not required but it cannot be a null value. - - - - Contains the JSON schema extension methods. - - - JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. - - - - - - - Determines whether the is valid. - - - JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. - - - The source to test. - The schema to test with. - - true if the specified is valid; otherwise, false. - - - - - - Determines whether the is valid. - - - JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. - - - The source to test. - The schema to test with. - When this method returns, contains any error messages generated while validating. - - true if the specified is valid; otherwise, false. - - - - - - Validates the specified . - - - JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. - - - The source to test. - The schema to test with. - - - - - Validates the specified . - - - JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. - - - The source to test. - The schema to test with. - The validation event handler. - - - - - An in-memory representation of a JSON Schema. - - - JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. - - - - - - Gets or sets the id. - - - - - Gets or sets the title. - - - - - Gets or sets whether the object is required. - - - - - Gets or sets whether the object is read-only. - - - - - Gets or sets whether the object is visible to users. - - - - - Gets or sets whether the object is transient. - - - - - Gets or sets the description of the object. - - - - - Gets or sets the types of values allowed by the object. - - The type. - - - - Gets or sets the pattern. - - The pattern. - - - - Gets or sets the minimum length. - - The minimum length. - - - - Gets or sets the maximum length. - - The maximum length. - - - - Gets or sets a number that the value should be divisible by. - - A number that the value should be divisible by. - - - - Gets or sets the minimum. - - The minimum. - - - - Gets or sets the maximum. - - The maximum. - - - - Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). - - A flag indicating whether the value can not equal the number defined by the minimum attribute (). - - - - Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). - - A flag indicating whether the value can not equal the number defined by the maximum attribute (). - - - - Gets or sets the minimum number of items. - - The minimum number of items. - - - - Gets or sets the maximum number of items. - - The maximum number of items. - - - - Gets or sets the of items. - - The of items. - - - - Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . - - - true if items are validated using their array position; otherwise, false. - - - - - Gets or sets the of additional items. - - The of additional items. - - - - Gets or sets a value indicating whether additional items are allowed. - - - true if additional items are allowed; otherwise, false. - - - - - Gets or sets whether the array items must be unique. - - - - - Gets or sets the of properties. - - The of properties. - - - - Gets or sets the of additional properties. - - The of additional properties. - - - - Gets or sets the pattern properties. - - The pattern properties. - - - - Gets or sets a value indicating whether additional properties are allowed. - - - true if additional properties are allowed; otherwise, false. - - - - - Gets or sets the required property if this property is present. - - The required property if this property is present. - - - - Gets or sets the a collection of valid enum values allowed. - - A collection of valid enum values allowed. - - - - Gets or sets disallowed types. - - The disallowed types. - - - - Gets or sets the default value. - - The default value. - - - - Gets or sets the collection of that this schema extends. - - The collection of that this schema extends. - - - - Gets or sets the format. - - The format. - - - - Initializes a new instance of the class. - - - - - Reads a from the specified . - - The containing the JSON Schema to read. - The object representing the JSON Schema. - - - - Reads a from the specified . - - The containing the JSON Schema to read. - The to use when resolving schema references. - The object representing the JSON Schema. - - - - Load a from a string that contains JSON Schema. - - A that contains JSON Schema. - A populated from the string that contains JSON Schema. - - - - Load a from a string that contains JSON Schema using the specified . - - A that contains JSON Schema. - The resolver. - A populated from the string that contains JSON Schema. - - - - Writes this schema to a . - - A into which this method will write. - - - - Writes this schema to a using the specified . - - A into which this method will write. - The resolver used. - - - - Returns a that represents the current . - - - A that represents the current . - - - - - - Returns detailed information about the schema exception. - - - JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. - - - - - - Gets the line number indicating where the error occurred. - - The line number indicating where the error occurred. - - - - Gets the line position indicating where the error occurred. - - The line position indicating where the error occurred. - - - - Gets the path to the JSON where the error occurred. - - The path to the JSON where the error occurred. - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class - with a specified error message. - - The error message that explains the reason for the exception. - - - - Initializes a new instance of the class - with a specified error message and a reference to the inner exception that is the cause of this exception. - - The error message that explains the reason for the exception. - The exception that is the cause of the current exception, or null if no inner exception is specified. - - - - Initializes a new instance of the class. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - The parameter is null. - The class name is null or is zero (0). - - - - - Generates a from a specified . - - - JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. - - - - - - Gets or sets how undefined schemas are handled by the serializer. - - - - - Gets or sets the contract resolver. - - The contract resolver. - - - - Generate a from the specified type. - - The type to generate a from. - A generated from the specified type. - - - - Generate a from the specified type. - - The type to generate a from. - The used to resolve schema references. - A generated from the specified type. - - - - Generate a from the specified type. - - The type to generate a from. - Specify whether the generated root will be nullable. - A generated from the specified type. - - - - Generate a from the specified type. - - The type to generate a from. - The used to resolve schema references. - Specify whether the generated root will be nullable. - A generated from the specified type. - - - - - Resolves from an id. - - - JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. - - - - - - Gets or sets the loaded schemas. - - The loaded schemas. - - - - Initializes a new instance of the class. - - - - - Gets a for the specified reference. - - The id. - A for the specified reference. - - - - - The value types allowed by the . - - - JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. - - - - - - No type specified. - - - - - String type. - - - - - Float type. - - - - - Integer type. - - - - - Boolean type. - - - - - Object type. - - - - - Array type. - - - - - Null type. - - - - - Any type. - - - - - - Specifies undefined schema Id handling options for the . - - - JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. - - - - - - Do not infer a schema Id. - - - - - Use the .NET type name as the schema Id. - - - - - Use the assembly qualified .NET type name as the schema Id. - - - - - - Returns detailed information related to the . - - - JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. - - - - - - Gets the associated with the validation error. - - The JsonSchemaException associated with the validation error. - - - - Gets the path of the JSON location where the validation error occurred. - - The path of the JSON location where the validation error occurred. - - - - Gets the text description corresponding to the validation error. - - The text description. - - - - - Represents the callback method that will handle JSON schema validation events and the . - - - JSON Schema validation has been moved to its own package. See http://www.newtonsoft.com/jsonschema for more details. - - - A camel case naming strategy. @@ -9829,6 +9197,13 @@ The converter. + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + Gets or sets all methods called immediately after deserialization of the object. @@ -9974,6 +9349,12 @@ The member object serialization. + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + Gets or sets a value that indicates whether the object's properties are required. @@ -10140,6 +9521,11 @@ A value indicating whether this is required. + + + Gets a value indicating whether has a value specified. + + Gets or sets a value indicating whether this property preserves object references. @@ -10302,9 +9688,53 @@ Lookup and create an instance of the type described by the argument. The type to create. - Optional arguments to pass to an initializing constructor of the JsonConverter. + Optional arguments to pass to an initializing constructor of the JsonConverter. If null, the default constructor is used. + + + A kebab case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + A base class for resolving how property names and dictionary keys are serialized. @@ -10358,6 +9788,26 @@ The property name to resolve. The resolved property name. + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + Represents a method that constructs an object. @@ -10604,20 +10054,7 @@ Helper utilities. - - - Compares two objects data. - - The object a. - The object b. - True if both objects are equal, otherwise false. - - - - The custom value comparision callback. - - - + The default implementation of the values comparision function. @@ -10639,15 +10076,6 @@ The member. The underlying type of the member. - - - Determines whether the member is an indexed property. - - The member. - - true if the member is an indexed property; otherwise, false. - - Determines whether the property is an indexed property. diff --git a/Source/Platforms/DotNet/System.Text.Encoding.CodePages.dll b/Source/Platforms/DotNet/System.Text.Encoding.CodePages.dll new file mode 100644 index 000000000..b874cda32 --- /dev/null +++ b/Source/Platforms/DotNet/System.Text.Encoding.CodePages.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:086cdd51afaa43b2bdc9db17585d988f8bf0df481b1974974422d6b4aa920eaa +size 740496 diff --git a/Source/Platforms/DotNet/System.Text.Encoding.CodePages.xml b/Source/Platforms/DotNet/System.Text.Encoding.CodePages.xml new file mode 100644 index 000000000..292222845 --- /dev/null +++ b/Source/Platforms/DotNet/System.Text.Encoding.CodePages.xml @@ -0,0 +1,29 @@ + + + + System.Text.Encoding.CodePages + + + + Provides access to an encoding provider for code pages that otherwise are available only in the desktop .NET Framework. + + + Returns the encoding associated with the specified code page identifier. + The code page identifier of the preferred encoding which the encoding provider may support. + The encoding associated with the specified code page identifier, or if the provider does not support the requested codepage encoding. + + + Returns the encoding associated with the specified code page name. + The code page name of the preferred encoding which the encoding provider may support. + The encoding associated with the specified code page, or if the provider does not support the requested encoding. + + + Returns an array that contains all the encodings that are supported by the . + An array that contains all the supported encodings. + + + Gets an encoding provider for code pages supported in the desktop .NET Framework but not in the current .NET Framework platform. + An encoding provider that allows access to encodings not supported on the current .NET Framework platform. + + + \ No newline at end of file diff --git a/Source/Platforms/Editor/Linux/Mono/bin/mono b/Source/Platforms/Editor/Linux/Mono/bin/mono deleted file mode 100755 index f9b3e942b..000000000 Binary files a/Source/Platforms/Editor/Linux/Mono/bin/mono and /dev/null differ diff --git a/Source/Platforms/Editor/Linux/Mono/etc/mono/2.0/Browsers/Compat.browser b/Source/Platforms/Editor/Linux/Mono/etc/mono/2.0/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Editor/Linux/Mono/etc/mono/2.0/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Editor/Linux/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Editor/Linux/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Editor/Linux/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Editor/Linux/Mono/etc/mono/2.0/machine.config b/Source/Platforms/Editor/Linux/Mono/etc/mono/2.0/machine.config deleted file mode 100644 index 2577c81dd..000000000 --- a/Source/Platforms/Editor/Linux/Mono/etc/mono/2.0/machine.config +++ /dev/null @@ -1,280 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
- - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/etc/mono/2.0/settings.map b/Source/Platforms/Editor/Linux/Mono/etc/mono/2.0/settings.map deleted file mode 100644 index 9a52ccc02..000000000 --- a/Source/Platforms/Editor/Linux/Mono/etc/mono/2.0/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/etc/mono/2.0/web.config b/Source/Platforms/Editor/Linux/Mono/etc/mono/2.0/web.config deleted file mode 100644 index e1428f8c3..000000000 --- a/Source/Platforms/Editor/Linux/Mono/etc/mono/2.0/web.config +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.0/Browsers/Compat.browser b/Source/Platforms/Editor/Linux/Mono/etc/mono/4.0/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.0/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Editor/Linux/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.0/machine.config b/Source/Platforms/Editor/Linux/Mono/etc/mono/4.0/machine.config deleted file mode 100644 index f3b71c43c..000000000 --- a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.0/machine.config +++ /dev/null @@ -1,307 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - - -
- -
-
-
-
- - - - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
-
-
-
- - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.0/settings.map b/Source/Platforms/Editor/Linux/Mono/etc/mono/4.0/settings.map deleted file mode 100644 index 4c53aca67..000000000 --- a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.0/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.0/web.config b/Source/Platforms/Editor/Linux/Mono/etc/mono/4.0/web.config deleted file mode 100644 index 2a7dfd2ed..000000000 --- a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.0/web.config +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.5/Browsers/Compat.browser b/Source/Platforms/Editor/Linux/Mono/etc/mono/4.5/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.5/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Editor/Linux/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.5/machine.config b/Source/Platforms/Editor/Linux/Mono/etc/mono/4.5/machine.config deleted file mode 100644 index 455709536..000000000 --- a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.5/machine.config +++ /dev/null @@ -1,310 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
- - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - - -
- -
-
-
-
- - - - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
-
-
-
- - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.5/settings.map b/Source/Platforms/Editor/Linux/Mono/etc/mono/4.5/settings.map deleted file mode 100644 index 4c53aca67..000000000 --- a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.5/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.5/web.config b/Source/Platforms/Editor/Linux/Mono/etc/mono/4.5/web.config deleted file mode 100644 index 324c529f0..000000000 --- a/Source/Platforms/Editor/Linux/Mono/etc/mono/4.5/web.config +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/etc/mono/browscap.ini b/Source/Platforms/Editor/Linux/Mono/etc/mono/browscap.ini deleted file mode 100644 index 1267e1deb..000000000 --- a/Source/Platforms/Editor/Linux/Mono/etc/mono/browscap.ini +++ /dev/null @@ -1,16979 +0,0 @@ -;;; Provided courtesy of http://browsers.garykeith.com -;;; Created on Wednesday, June 17, 2009 at 6:30 AM GMT - -[GJK_Browscap_Version] -Version=4476 -Released=Wed, 17 Jun 2009 06:30:21 -0000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DefaultProperties - -[DefaultProperties] -Browser=DefaultProperties -Version=0 -MajorVer=0 -MinorVer=0 -Platform=unknown -Alpha=false -Beta=false -Win16=false -Win32=false -Win64=false -Frames=false -IFrames=false -Tables=false -Cookies=false -BackgroundSounds=false -CDF=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -isBanned=false -isMobileDevice=false -isSyndicationReader=false -Crawler=false -CssVersion=0 -supportsCSS=false -AOL=false -aolVersion=0 -ECMAScriptVersion=0.0 -W3CDOMVersion=0.0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ask - -[Ask] -Parent=DefaultProperties -Browser=Ask -Frames=true -Tables=true -Crawler=true - -[Mozilla/?.0 (compatible; Ask Jeeves/Teoma*)] -Parent=Ask -Browser=Teoma - -[Mozilla/2.0 (compatible; Ask Jeeves)] -Parent=Ask -Browser=AskJeeves - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Baidu - -[Baidu] -Parent=DefaultProperties -Browser=Baidu -Frames=true -Tables=true -Crawler=true - -[BaiduImageSpider*] -Parent=Baidu -Browser=BaiduImageSpider - -[Baiduspider*] -Parent=Baidu -Browser=BaiDu - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google - -[Google] -Parent=DefaultProperties -Browser=Google -Frames=true -IFrames=true -Tables=true -JavaScript=true -Crawler=true - -[* (compatible; Googlebot-Mobile/2.1; *http://www.google.com/bot.html)] -Parent=Google -Browser=Googlebot-Mobile -Frames=false -IFrames=false -Tables=false - -[*Google Wireless Transcoder*] -Parent=Google -Browser=Google Wireless Transcoder - -[AdsBot-Google (?http://www.google.com/adsbot.html)] -Parent=Google -Browser=AdsBot-Google - -[Feedfetcher-Google-iGoogleGadgets;*] -Parent=Google -Browser=iGoogleGadgets -isBanned=true -isSyndicationReader=true - -[Feedfetcher-Google;*] -Parent=Google -Browser=Feedfetcher-Google -isBanned=true -isSyndicationReader=true - -[Google OpenSocial agent (http://www.google.com/feedfetcher.html)] -Parent=Google -Browser=Google OpenSocial - -[Google-Site-Verification/1.0] -Parent=Google -Browser=Google-Site-Verification - -[Google-Sitemaps/*] -Parent=Google -Browser=Google-Sitemaps - -[Googlebot-Image/*] -Parent=Google -Browser=Googlebot-Image -CDF=true - -[googlebot-urlconsole] -Parent=Google -Browser=googlebot-urlconsole - -[Googlebot-Video/1.0] -Parent=Google -Browser=Google-Video - -[Googlebot/2.1 (?http://www.google.com/bot.html)] -Parent=Google -Browser=Googlebot - -[Googlebot/2.1 (?http://www.googlebot.com/bot.html)] -Parent=Google -Browser=Googlebot - -[Googlebot/Test*] -Parent=Google -Browser=Googlebot/Test - -[gsa-crawler*] -Parent=Google -Browser=Google Search Appliance -isBanned=true - -[Mediapartners-Google*] -Parent=Google -Browser=Mediapartners-Google - -[Mozilla/4.0 (compatible; Google Desktop)] -Parent=Google -Browser=Google Desktop - -[Mozilla/4.0 (compatible; GoogleToolbar*)] -Parent=Google -Browser=Google Toolbar -isBanned=true - -[Mozilla/5.0 (compatible; Google Keyword Tool;*)] -Parent=Google -Browser=Google Keyword Tool - -[Mozilla/5.0 (compatible; Googlebot/2.1; ?http://www.google.com/bot.html)] -Parent=Google -Browser=Google Webmaster Tools - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Inktomi - -[Inktomi] -Parent=DefaultProperties -Browser=Inktomi -Frames=true -Tables=true -Crawler=true - -[* (compatible;YahooSeeker/M1A1-R2D2; *)] -Parent=Inktomi -Browser=YahooSeeker-Mobile -Frames=false -Tables=false - -[Mozilla/4.0] -Parent=Inktomi - -[Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)] -Parent=Inktomi -Win32=true - -[Mozilla/4.0 (compatible; Yahoo Japan; for robot study; kasugiya)] -Parent=Inktomi -Browser=Yahoo! RobotStudy -isBanned=true - -[Mozilla/5.0 (compatible; BMC/1.0 (Y!J-AGENT))] -Parent=Inktomi -Browser=Y!J-AGENT/BMC - -[Mozilla/5.0 (compatible; BMF/1.0 (Y!J-AGENT))] -Parent=Inktomi -Browser=Y!J-AGENT/BMF - -[Mozilla/5.0 (compatible; BMI/1.0 (Y!J-AGENT; 1.0))] -Parent=Inktomi -Browser=Y!J-AGENT/BMI - -[Mozilla/5.0 (compatible; Yahoo! DE Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Directory Engine - -[Mozilla/5.0 (compatible; Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html)] -Parent=Inktomi -Browser=Yahoo! Slurp China - -[Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Slurp -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Slurp - -[Mozilla/5.0 (compatible; Yahoo! Verifier/1.1)] -Parent=Inktomi -Browser=Yahoo! Verifier -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Slurp/cat; slurp@inktomi.com; http://www.inktomi.com/slurp.html)] -Parent=Inktomi -Browser=Slurp/cat - -[Mozilla/5.0 (Slurp/si; slurp@inktomi.com; http://www.inktomi.com/slurp.html)] -Parent=Inktomi - -[Mozilla/5.0 (Yahoo-MMCrawler/4.0; mailto:vertical-crawl-support@yahoo-inc.com)] -Parent=Inktomi -Browser=Yahoo-MMCrawler -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Scooter/*] -Parent=Inktomi -Browser=Scooter - -[Scooter/3.3Y!CrawlX] -Parent=Inktomi -Browser=Scooter/3.3Y!CrawlX -Version=3.3 -MajorVer=3 -MinorVer=3 - -[slurp] -Parent=Inktomi -Browser=slurp - -[Y!J-BSC/1.0*] -Parent=Inktomi -Browser=Y!J-BSC -Version=1.0 -MajorVer=1 -MinorVer=0 -isBanned=true - -[Y!J-SRD/1.0] -Parent=Inktomi -Browser=Y!J-SRD -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Yahoo Mindset] -Parent=Inktomi -Browser=Yahoo Mindset - -[Yahoo Pipes*] -Parent=Inktomi -Browser=Yahoo Pipes - -[Yahoo! Mindset] -Parent=Inktomi -Browser=Yahoo! Mindset - -[Yahoo! Slurp/Site Explorer] -Parent=Inktomi -Browser=Yahoo! Site Explorer - -[Yahoo-Blogs/*] -Parent=Inktomi -Browser=Yahoo-Blogs - -[Yahoo-MMAudVid*] -Parent=Inktomi -Browser=Yahoo-MMAudVid - -[Yahoo-MMCrawler*] -Parent=Inktomi -Browser=Yahoo-MMCrawler -isBanned=true - -[YahooFeedSeeker*] -Parent=Inktomi -Browser=YahooFeedSeeker -isSyndicationReader=true -Crawler=false - -[YahooSeeker/*] -Parent=Inktomi -Browser=YahooSeeker -isMobileDevice=true - -[YahooSeeker/CafeKelsa (compatible; Konqueror/3.2; FreeBSD*) (KHTML, like Gecko)] -Parent=Inktomi -Browser=YahooSeeker/CafeKelsa - -[YahooSeeker/CafeKelsa-dev (compatible; Konqueror/3.2; FreeBSD*) (KHTML, like Gecko)] -Parent=Inktomi - -[YahooVideoSearch*] -Parent=Inktomi -Browser=YahooVideoSearch - -[YahooYSMcm*] -Parent=Inktomi -Browser=YahooYSMcm - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN - -[MSN] -Parent=DefaultProperties -Browser=MSN -Frames=true -Tables=true -Crawler=true - -[adidxbot/1.1 (?http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=adidxbot - -[librabot/1.0 (*)] -Parent=MSN -Browser=librabot - -[llssbot/1.0] -Parent=MSN -Browser=llssbot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MSMOBOT/1.1*] -Parent=MSN -Browser=msnbot-mobile -Version=1.1 -MajorVer=1 -MinorVer=1 - -[MSNBot-Academic/1.0*] -Parent=MSN -Browser=MSNBot-Academic -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot-media/1.0*] -Parent=MSN -Browser=msnbot-media -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot-media/1.1*] -Parent=MSN -Browser=msnbot-media -Version=1.1 -MajorVer=1 -MinorVer=1 - -[MSNBot-News/1.0*] -Parent=MSN -Browser=MSNBot-News -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MSNBot-NewsBlogs/1.0*] -Parent=MSN -Browser=MSNBot-NewsBlogs -Version=1 -MajorVer=1 -MinorVer=0 - -[msnbot-products] -Parent=MSN -Browser=msnbot-products - -[msnbot-webmaster/1.0 (*http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=msnbot-webmaster tools - -[msnbot/1.0*] -Parent=MSN -Browser=msnbot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot/1.1*] -Parent=MSN -Browser=msnbot -Version=1.1 -MajorVer=1 -MinorVer=1 - -[msnbot/2.0b*] -Parent=MSN -Version=2.0 -MajorVer=2 -MinorVer=0 -Beta=true - -[MSR-ISRCCrawler] -Parent=MSN -Browser=MSR-ISRCCrawler - -[renlifangbot/1.0 (?http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=renlifangbot - -[T-Mobile Dash Mozilla/4.0 (*) MSNBOT-MOBILE/1.1 (*)] -Parent=MSN -Browser=msnbot-mobile - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yahoo - -[Yahoo] -Parent=DefaultProperties -Browser=Yahoo -Frames=true -Tables=true -Crawler=true - -[Mozilla/4.0 (compatible; Y!J; for robot study*)] -Parent=Yahoo -Browser=Y!J - -[Mozilla/5.0 (Yahoo-Test/4.0*)] -Parent=Yahoo -Browser=Yahoo-Test -Version=4.0 -MajorVer=4 -MinorVer=0 - -[mp3Spider cn-search-devel at yahoo-inc dot com] -Parent=Yahoo -Browser=Yahoo! Media -isBanned=true - -[My Browser] -Parent=Yahoo -Browser=Yahoo! My Browser - -[Y!OASIS/*] -Parent=Yahoo -Browser=Y!OASIS -isBanned=true - -[YahooYSMcm/2.0.0] -Parent=Yahoo -Browser=YahooYSMcm -Version=2.0 -MajorVer=2 -MinorVer=0 -isBanned=true - -[YRL_ODP_CRAWLER] -Parent=Yahoo -Browser=YRL_ODP_CRAWLER -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yandex - -[Yandex] -Parent=DefaultProperties -Browser=Yandex -Frames=true -IFrames=true -Tables=true -Cookies=true -Crawler=true - -[Mozilla/4.0 (compatible; MSIE 5.0; YANDEX)] -Parent=Yandex - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9) Gecko VisualParser/3.0] -Parent=Yandex -Browser=VisualParser -isBanned=true - -[YaDirectBot/*] -Parent=Yandex -Browser=YaDirectBot - -[Yandex/*] -Parent=Yandex - -[YandexBlog/*] -Parent=Yandex -Browser=YandexBlog -isSyndicationReader=true - -[YandexSomething/*] -Parent=Yandex -Browser=YandexSomething -isSyndicationReader=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Best of the Web - -[Best of the Web] -Parent=DefaultProperties -Browser=Best of the Web -Frames=true -Tables=true - -[Mozilla/4.0 (compatible; BOTW Feed Grabber; *http://botw.org)] -Parent=Best of the Web -Browser=BOTW Feed Grabber -isSyndicationReader=true -Crawler=false - -[Mozilla/4.0 (compatible; BOTW Spider; *http://botw.org)] -Parent=Best of the Web -Browser=BOTW Spider -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Boitho - -[Boitho] -Parent=DefaultProperties -Browser=Boitho -Frames=true -Tables=true -Crawler=true - -[boitho.com-dc/*] -Parent=Boitho -Browser=boitho.com-dc - -[boitho.com-robot/*] -Parent=Boitho -Browser=boitho.com-robot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Convera - -[Convera] -Parent=DefaultProperties -Browser=Convera -Frames=true -Tables=true -Crawler=true - -[ConveraCrawler/*] -Parent=Convera -Browser=ConveraCrawler - -[ConveraMultiMediaCrawler/0.1*] -Parent=Convera -Browser=ConveraMultiMediaCrawler -Version=0.1 -MajorVer=0 -MinorVer=1 - -[CrawlConvera*] -Parent=Convera -Browser=CrawlConvera - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DotBot - -[DotBot] -Parent=DefaultProperties -Browser=DotBot -Frames=true -Tables=true -isBanned=true -Crawler=true - -[DotBot/* (http://www.dotnetdotcom.org/*)] -Parent=DotBot - -[Mozilla/5.0 (compatible; DotBot/*; http://www.dotnetdotcom.org/*)] -Parent=DotBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Entireweb - -[Entireweb] -Parent=DefaultProperties -Browser=Entireweb -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[Mozilla/4.0 (compatible; SpeedySpider; www.entireweb.com)] -Parent=Entireweb - -[Speedy Spider (*Beta/*)] -Parent=Entireweb - -[Speedy?Spider?(http://www.entireweb.com*)] -Parent=Entireweb - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Envolk - -[Envolk] -Parent=DefaultProperties -Browser=Envolk -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[envolk/* (?http://www.envolk.com/envolk*)] -Parent=Envolk - -[envolk?ITS?spider/* (?http://www.envolk.com/envolk*)] -Parent=Envolk - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Exalead - -[Exalead] -Parent=DefaultProperties -Browser=Exalead -Frames=true -Tables=true -isBanned=true -Crawler=true - -[Exabot-Images/1.0] -Parent=Exalead -Browser=Exabot-Images -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Exabot-Test/*] -Parent=Exalead -Browser=Exabot-Test - -[Exabot/2.0] -Parent=Exalead -Browser=Exabot - -[Exabot/3.0] -Parent=Exalead -Browser=Exabot -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Liberate - -[Exalead NG/*] -Parent=Exalead -Browser=Exalead NG -isBanned=true - -[Mozilla/5.0 (compatible; Exabot-Images/3.0;*)] -Parent=Exalead -Browser=Exabot-Images - -[Mozilla/5.0 (compatible; Exabot/3.0 (BiggerBetter/tests);*)] -Parent=Exalead -Browser=Exabot/BiggerBetter/tests - -[Mozilla/5.0 (compatible; Exabot/3.0;*)] -Parent=Exalead -Browser=Exabot -isBanned=false - -[Mozilla/5.0 (compatible; NGBot/*)] -Parent=Exalead - -[ng/*] -Parent=Exalead -Browser=Exalead Previewer -Version=1.0 -MajorVer=1 -MinorVer=0 -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fast/AllTheWeb - -[Fast/AllTheWeb] -Parent=DefaultProperties -Browser=Fast/AllTheWeb -Alpha=true -Beta=true -Win16=true -Win32=true -Win64=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -isBanned=true -isMobileDevice=true -isSyndicationReader=true -Crawler=true - -[*FAST Enterprise Crawler*] -Parent=Fast/AllTheWeb -Browser=FAST Enterprise Crawler - -[FAST Data Search Document Retriever/4.0*] -Parent=Fast/AllTheWeb -Browser=FAST Data Search Document Retriever - -[FAST MetaWeb Crawler (helpdesk at fastsearch dot com)] -Parent=Fast/AllTheWeb -Browser=FAST MetaWeb Crawler - -[Fast PartnerSite Crawler*] -Parent=Fast/AllTheWeb -Browser=FAST PartnerSite - -[FAST-WebCrawler/*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler - -[FAST-WebCrawler/*/FirstPage*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/FirstPage - -[FAST-WebCrawler/*/Fresh*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/Fresh - -[FAST-WebCrawler/*/PartnerSite*] -Parent=Fast/AllTheWeb -Browser=FAST PartnerSite - -[FAST-WebCrawler/*?Multimedia*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/Multimedia - -[FastSearch Web Crawler for*] -Parent=Fast/AllTheWeb -Browser=FastSearch Web Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Gigabot - -[Gigabot] -Parent=DefaultProperties -Browser=Gigabot -Frames=true -IFrames=true -Tables=true -Crawler=true - -[Gigabot*] -Parent=Gigabot - -[GigabotSiteSearch/*] -Parent=Gigabot -Browser=GigabotSiteSearch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ilse - -[Ilse] -Parent=DefaultProperties -Browser=Ilse -Frames=true -Tables=true -Crawler=true - -[IlseBot/*] -Parent=Ilse - -[INGRID/?.0*] -Parent=Ilse -Browser=Ilse - -[Mozilla/3.0 (INGRID/*] -Parent=Ilse -Browser=Ilse - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iVia Project - -[iVia Project] -Parent=DefaultProperties -Browser=iVia Project -Frames=true -IFrames=true -Tables=true -Crawler=true - -[DataFountains/DMOZ Downloader*] -Parent=iVia Project -Browser=DataFountains/DMOZ Downloader -isBanned=true - -[DataFountains/DMOZ Feature Vector Corpus Creator*] -Parent=iVia Project -Browser=DataFountains/DMOZ Feature Vector Corpus - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Jayde Online - -[Jayde Online] -Parent=DefaultProperties -Browser=Jayde Online -Frames=true -Tables=true -Crawler=true - -[ExactSeek Crawler/*] -Parent=Jayde Online -Browser=ExactSeek Crawler - -[exactseek-pagereaper-* (crawler@exactseek.com)] -Parent=Jayde Online -Browser=exactseek-pagereaper -isBanned=true - -[exactseek.com] -Parent=Jayde Online -Browser=exactseek.com - -[Jayde Crawler*] -Parent=Jayde Online -Browser=Jayde Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycos - -[Lycos] -Parent=DefaultProperties -Browser=Lycos -Frames=true -Tables=true -Crawler=true - -[Lycos*] -Parent=Lycos -Browser=Lycos - -[Lycos-Proxy] -Parent=Lycos -Browser=Lycos-Proxy - -[Lycos-Spider_(modspider)] -Parent=Lycos -Browser=Lycos-Spider_(modspider) - -[Lycos-Spider_(T-Rex)] -Parent=Lycos -Browser=Lycos-Spider_(T-Rex) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Naver - -[Naver] -Parent=DefaultProperties -Browser=Naver -isBanned=true -Crawler=true - -[Cowbot-* (NHN Corp*naver.com)] -Parent=Naver -Browser=Naver Cowbot - -[Mozilla/4.0 (compatible; NaverBot/*; *)] -Parent=Naver - -[Mozilla/4.0 (compatible; NaverBot/*; nhnbot@naver.com)] -Parent=Naver -Browser=Naver NaverBot - -[NaverBot-* (NHN Corp*naver.com)] -Parent=Naver -Browser=Naver NHN Corp - -[Yeti/*] -Parent=Naver -Browser=Yeti - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Snap - -[Snap] -Parent=DefaultProperties -Browser=Snap -isBanned=true -Crawler=true - -[Mozilla/5.0 (SnapPreviewBot) Gecko/* Firefox/*] -Parent=Snap - -[Snapbot/*] -Parent=Snap - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sogou - -[Sogou] -Parent=DefaultProperties -Browser=Sogou -Frames=true -Tables=true -isBanned=true -Crawler=true - -[shaboyi spider] -Parent=Sogou -Browser=Sogou/Shaboyi Spider - -[Sogou develop spider/*] -Parent=Sogou -Browser=Sogou Develop Spider - -[Sogou head spider*] -Parent=Sogou -Browser=Sogou/HEAD Spider - -[sogou js robot(*)] -Parent=Sogou - -[Sogou Orion spider/*] -Parent=Sogou -Browser=Sogou Orion spider - -[Sogou Pic Agent] -Parent=Sogou -Browser=Sogou/Image Crawler - -[Sogou Pic Spider] -Parent=Sogou -Browser=Sogou Pic Spider - -[Sogou Push Spider/*] -Parent=Sogou -Browser=Sogou Push Spider - -[sogou spider] -Parent=Sogou -Browser=Sogou/Spider - -[sogou web spider*] -Parent=Sogou -Browser=sogou web spider - -[Sogou-Test-Spider/*] -Parent=Sogou -Browser=Sogou-Test-Spider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; YodaoBot - -[YodaoBot] -Parent=DefaultProperties -Browser=YodaoBot -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[Mozilla/5.0 (compatible; YodaoBot/1.*)] -Parent=YodaoBot - -[Mozilla/5.0 (compatible;YodaoBot-Image/1.*)] -Parent=YodaoBot -Browser=YodaoBot-Image - -[WAP_Browser/5.0 (compatible; YodaoBot/1.*)] -Parent=YodaoBot - -[YodaoBot/1.* (*)] -Parent=YodaoBot - -[Best Whois (http://www.bestwhois.net/)] -Parent=DNS Tools -Browser=Best Whois - -[DNSGroup/*] -Parent=DNS Tools -Browser=DNS Group Crawler - -[NG-Search/*] -Parent=Exalead -Browser=NG-SearchBot - -[TouchStone] -Parent=Feeds Syndicators -Browser=TouchStone -isSyndicationReader=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; General Crawlers - -[General Crawlers] -Parent=DefaultProperties -Browser=General Crawlers -Crawler=true - -[A .NET Web Crawler] -Parent=General Crawlers -isBanned=true - -[BabalooSpider/1.*] -Parent=General Crawlers -Browser=BabalooSpider - -[BilgiBot/*] -Parent=General Crawlers -Browser=BilgiBot -isBanned=true - -[bot/* (bot; *bot@bot.bot)] -Parent=General Crawlers -Browser=bot -isBanned=true - -[CyberPatrol*] -Parent=General Crawlers -Browser=CyberPatrol -isBanned=true - -[Cynthia 1.0] -Parent=General Crawlers -Browser=Cynthia -Version=1.0 -MajorVer=1 -MinorVer=0 - -[ddetailsbot (http://www.displaydetails.com)] -Parent=General Crawlers -Browser=ddetailsbot - -[DomainCrawler/1.0 (info@domaincrawler.com; http://www.domaincrawler.com/domains/view/*)] -Parent=General Crawlers -Browser=DomainCrawler - -[DomainsBotBot/1.*] -Parent=General Crawlers -Browser=DomainsBotBot -isBanned=true - -[DomainsDB.net MetaCrawler*] -Parent=General Crawlers -Browser=DomainsDB - -[Drupal (*)] -Parent=General Crawlers -Browser=Drupal - -[Dumbot (version *)*] -Parent=General Crawlers -Browser=Dumbfind - -[EuripBot/*] -Parent=General Crawlers -Browser=Europe Internet Portal - -[eventax/*] -Parent=General Crawlers -Browser=eventax - -[FANGCrawl/*] -Parent=General Crawlers -Browser=Safe-t.net Web Filtering Service -isBanned=true - -[favorstarbot/*] -Parent=General Crawlers -Browser=favorstarbot -isBanned=true - -[FollowSite.com (*)] -Parent=General Crawlers -Browser=FollowSite -isBanned=true - -[Gaisbot*] -Parent=General Crawlers -Browser=Gaisbot - -[Healthbot/Health_and_Longevity_Project_(HealthHaven.com) ] -Parent=General Crawlers -Browser=Healthbot -isBanned=true - -[hitcrawler_0.*] -Parent=General Crawlers -Browser=hitcrawler -isBanned=true - -[htdig/*] -Parent=General Crawlers -Browser=ht://Dig - -[http://hilfe.acont.de/bot.html ACONTBOT] -Parent=General Crawlers -Browser=ACONTBOT -isBanned=true - -[JetBrains*] -Parent=General Crawlers -Browser=Omea Pro - -[KakleBot - www.kakle.com/0.1] -Parent=General Crawlers -Browser=KakleBot - -[KBeeBot/0.*] -Parent=General Crawlers -Browser=KBeeBot -isBanned=true - -[Keyword Density/*] -Parent=General Crawlers -Browser=Keyword Density - -[LetsCrawl.com/1.0*] -Parent=General Crawlers -Browser=LetsCrawl.com -isBanned=true - -[Lincoln State Web Browser] -Parent=General Crawlers -Browser=Lincoln State Web Browser -isBanned=true - -[Links4US-Crawler,*] -Parent=General Crawlers -Browser=Links4US-Crawler -isBanned=true - -[Lorkyll *.* -- lorkyll@444.net] -Parent=General Crawlers -Browser=Lorkyll -isBanned=true - -[Lsearch/sondeur] -Parent=General Crawlers -Browser=Lsearch/sondeur -isBanned=true - -[LucidMedia ClickSense/4.?] -Parent=General Crawlers -Browser=LucidMedia-ClickSense -isBanned=true - -[MapoftheInternet.com?(?http://MapoftheInternet.com)] -Parent=General Crawlers -Browser=MapoftheInternet -isBanned=true - -[Marvin v0.3] -Parent=General Crawlers -Browser=MedHunt -Version=0.3 -MajorVer=0 -MinorVer=3 - -[masidani_bot_v0.6*] -Parent=General Crawlers -Browser=masidani_bot - -[Metaspinner/0.01 (Metaspinner; http://www.meta-spinner.de/; support@meta-spinner.de/)] -Parent=General Crawlers -Browser=Metaspinner/0.01 -Version=0.01 -MajorVer=0 -MinorVer=01 - -[metatagsdir/*] -Parent=General Crawlers -Browser=metatagsdir -isBanned=true - -[Microsoft Windows Network Diagnostics] -Parent=General Crawlers -Browser=Microsoft Windows Network Diagnostics -isBanned=true - -[Miva (AlgoFeedback@miva.com)] -Parent=General Crawlers -Browser=Miva - -[moget/*] -Parent=General Crawlers -Browser=Goo - -[Mozdex/0.7.2*] -Parent=General Crawlers -Browser=Mozdex - -[Mozilla Compatible (MS IE 3.01 WinNT)] -Parent=General Crawlers -isBanned=true - -[Mozilla/* (compatible; WebCapture*)] -Parent=General Crawlers -Browser=WebCapture - -[Mozilla/4.0 (compatible; DepSpid/*)] -Parent=General Crawlers -Browser=DepSpid - -[Mozilla/4.0 (compatible; MSIE *; Windows NT *; SV1)] -Parent=General Crawlers -Browser=AVG - -[Mozilla/4.0 (compatible; MSIE 4.01; Vonna.com b o t)] -Parent=General Crawlers -Browser=Vonna.com -isBanned=true - -[Mozilla/4.0 (compatible; MSIE 4.01; Windows95)] -Parent=General Crawlers -Win32=true - -[Mozilla/4.0 (compatible; MSIE 4.5; Windows 98; )] -Parent=General Crawlers -Win32=true - -[Mozilla/4.0 (compatible; MyFamilyBot/*)] -Parent=General Crawlers -Browser=MyFamilyBot - -[Mozilla/4.0 (compatible; N-Stealth)] -Parent=General Crawlers -Browser=N-Stealth - -[Mozilla/4.0 (compatible; Scumbot/*; Linux/*)] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.0 (compatible; Spider; Linux)] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.0 (compatible; Win32)] -Parent=General Crawlers -Browser=Unknown Crawler -isBanned=true - -[Mozilla/4.1] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.5] -Parent=General Crawlers -isBanned=true - -[Mozilla/5.0 (*http://gnomit.com/) Gecko/* Gnomit/1.0] -Parent=General Crawlers -Browser=Gnomit -isBanned=true - -[Mozilla/5.0 (compatible; AboutUsBot/*)] -Parent=General Crawlers -Browser=AboutUsBot -isBanned=true - -[Mozilla/5.0 (compatible; BuzzRankingBot/*)] -Parent=General Crawlers -Browser=BuzzRankingBot -isBanned=true - -[Mozilla/5.0 (compatible; Diffbot/0.1; http://www.diffbot.com)] -Parent=General Crawlers -Browser=Diffbot - -[Mozilla/5.0 (compatible; FirstSearchBot/1.0; *)] -Parent=General Crawlers -Browser=FirstSearchBot - -[mozilla/5.0 (compatible; genevabot http://www.healthdash.com)] -Parent=General Crawlers -Browser=Healthdash - -[Mozilla/5.0 (compatible; JadynAveBot; *http://www.jadynave.com/robot*] -Parent=General Crawlers -Browser=JadynAveBot -isBanned=true - -[Mozilla/5.0 (compatible; Kyluka crawl; http://www.kyluka.com/crawl.html; crawl@kyluka.com)] -Parent=General Crawlers -Browser=Kyluka - -[Mozilla/5.0 (compatible; MJ12bot/v1.2.*; http://www.majestic12.co.uk/bot.php*)] -Parent=General Crawlers -Browser=MJ12bot -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (compatible; MSIE 7.0 ?http://www.europarchive.org)] -Parent=General Crawlers -Browser=Europe Web Archive - -[Mozilla/5.0 (compatible; Seznam screenshot-generator 2.0;*)] -Parent=General Crawlers -Browser=Seznam screenshot-generator -isBanned=true - -[Mozilla/5.0 (compatible; Twingly Recon; http://www.twingly.com/)] -Parent=General Crawlers -Browser=Twingly Recon - -[Mozilla/5.0 (compatible; unwrapbot/2.*; http://www.unwrap.jp*)] -Parent=General Crawlers -Browser=UnWrap - -[Mozilla/5.0 (compatible; Vermut*)] -Parent=General Crawlers -Browser=Vermut - -[Mozilla/5.0 (compatible; Webbot/*)] -Parent=General Crawlers -Browser=Webbot.ru -isBanned=true - -[n4p_bot*] -Parent=General Crawlers -Browser=n4p_bot - -[nabot*] -Parent=General Crawlers -Browser=Nabot - -[NetCarta_WebMapper/*] -Parent=General Crawlers -Browser=NetCarta_WebMapper -isBanned=true - -[NetID.com Bot*] -Parent=General Crawlers -Browser=NetID.com Bot -isBanned=true - -[neTVision AG andreas.heidoetting@thomson-webcast.net] -Parent=General Crawlers -Browser=neTVision - -[NextopiaBOT*] -Parent=General Crawlers -Browser=NextopiaBOT - -[nicebot] -Parent=General Crawlers -Browser=nicebot -isBanned=true - -[niXXieBot?Foster*] -Parent=General Crawlers -Browser=niXXiebot-Foster - -[Nozilla/P.N (Just for IDS woring)] -Parent=General Crawlers -Browser=Nozilla/P.N -isBanned=true - -[Nudelsalat/*] -Parent=General Crawlers -Browser=Nudelsalat -isBanned=true - -[NV32ts] -Parent=General Crawlers -Browser=NV32ts -isBanned=true - -[Ocelli/*] -Parent=General Crawlers -Browser=Ocelli - -[OpenTaggerBot (http://www.opentagger.com/opentaggerbot.htm)] -Parent=General Crawlers -Browser=OpenTaggerBot - -[Oracle Enterprise Search] -Parent=General Crawlers -Browser=Oracle Enterprise Search -isBanned=true - -[Oracle Ultra Search] -Parent=General Crawlers -Browser=Oracle Ultra Search - -[Pajaczek/*] -Parent=General Crawlers -Browser=Pajaczek -isBanned=true - -[panscient.com] -Parent=General Crawlers -Browser=panscient.com -isBanned=true - -[Patwebbot (http://www.herz-power.de/technik.html)] -Parent=General Crawlers -Browser=Patwebbot - -[PDFBot (crawler@pdfind.com)] -Parent=General Crawlers -Browser=PDFBot - -[Pete-Spider/1.*] -Parent=General Crawlers -Browser=Pete-Spider -isBanned=true - -[PhpDig/*] -Parent=General Crawlers -Browser=PhpDig - -[PlantyNet_WebRobot*] -Parent=General Crawlers -Browser=PlantyNet -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PluckIt - -[PluckItCrawler/1.0 (*)] -Parent=General Crawlers -isMobileDevice=true - -[PMAFind] -Parent=General Crawlers -Browser=PMAFind -isBanned=true - -[Poodle_predictor_1.0] -Parent=General Crawlers -Browser=Poodle Predictor - -[QuickFinder Crawler] -Parent=General Crawlers -Browser=QuickFinder -isBanned=true - -[Radiation Retriever*] -Parent=General Crawlers -Browser=Radiation Retriever -isBanned=true - -[RedCarpet/*] -Parent=General Crawlers -Browser=RedCarpet -isBanned=true - -[RixBot (http://babelserver.org/rix)] -Parent=General Crawlers -Browser=RixBot - -[Rome Client (http://tinyurl.com/64t5n) Ver: 0.*] -Parent=General Crawlers -Browser=TinyURL - -[SBIder/*] -Parent=General Crawlers -Browser=SiteSell - -[ScollSpider/2.*] -Parent=General Crawlers -Browser=ScollSpider -isBanned=true - -[Search Fst] -Parent=General Crawlers -Browser=Search Fst - -[searchbot admin@google.com] -Parent=General Crawlers -Browser=searchbot -isBanned=true - -[Seeker.lookseek.com] -Parent=General Crawlers -Browser=LookSeek -isBanned=true - -[semanticdiscovery/*] -Parent=General Crawlers -Browser=Semantic Discovery - -[SeznamBot/*] -Parent=General Crawlers -Browser=SeznamBot -isBanned=true - -[Shelob (shelob@gmx.net)] -Parent=General Crawlers -Browser=Shelob -isBanned=true - -[shelob v1.*] -Parent=General Crawlers -Browser=shelob -isBanned=true - -[ShopWiki/1.0*] -Parent=General Crawlers -Browser=ShopWiki -Version=1.0 -MajorVer=1 -MinorVer=0 - -[ShowXML/1.0 libwww/5.4.0] -Parent=General Crawlers -Browser=ShowXML -isBanned=true - -[sitecheck.internetseer.com*] -Parent=General Crawlers -Browser=Internetseer - -[SMBot/*] -Parent=General Crawlers -Browser=SMBot - -[sohu*] -Parent=General Crawlers -Browser=sohu-search -isBanned=true - -[SpankBot*] -Parent=General Crawlers -Browser=SpankBot -isBanned=true - -[spider (tspyyp@tom.com)] -Parent=General Crawlers -Browser=spider (tspyyp@tom.com) -isBanned=true - -[Sunrise/0.*] -Parent=General Crawlers -Browser=Sunrise -isBanned=true - -[Superpages URL Verification Engine] -Parent=General Crawlers -Browser=Superpages - -[Surf Knight] -Parent=General Crawlers -Browser=Surf Knight -isBanned=true - -[SurveyBot/*] -Parent=General Crawlers -Browser=SurveyBot -isBanned=true - -[SynapticSearch/AI Crawler 1.?] -Parent=General Crawlers -Browser=SynapticSearch -isBanned=true - -[SyncMgr] -Parent=General Crawlers -Browser=SyncMgr - -[Tagyu Agent/1.0] -Parent=General Crawlers -Browser=Tagyu - -[Talkro Web-Shot/*] -Parent=General Crawlers -Browser=Talkro Web-Shot -isBanned=true - -[Tecomi Bot (http://www.tecomi.com/bot.htm)] -Parent=General Crawlers -Browser=Tecomi - -[TheInformant*] -Parent=General Crawlers -Browser=TheInformant -isBanned=true - -[Toata dragostea*] -Parent=General Crawlers -Browser=Toata dragostea -isBanned=true - -[Tutorial Crawler*] -Parent=General Crawlers -isBanned=true - -[UbiCrawler/*] -Parent=General Crawlers -Browser=UbiCrawler - -[UCmore] -Parent=General Crawlers -Browser=UCmore - -[User*Agent:*] -Parent=General Crawlers -isBanned=true - -[USER_AGENT] -Parent=General Crawlers -Browser=USER_AGENT -isBanned=true - -[VadixBot] -Parent=General Crawlers -Browser=VadixBot - -[VengaBot/*] -Parent=General Crawlers -Browser=VengaBot -isBanned=true - -[Visicom Toolbar] -Parent=General Crawlers -Browser=Visicom Toolbar - -[W3C-WebCon/*] -Parent=General Crawlers -Browser=W3C-WebCon - -[Webclipping.com] -Parent=General Crawlers -Browser=Webclipping.com -isBanned=true - -[webcollage/*] -Parent=General Crawlers -Browser=WebCollage -isBanned=true - -[WebCrawler_1.*] -Parent=General Crawlers -Browser=WebCrawler - -[WebFilter Robot*] -Parent=General Crawlers -Browser=WebFilter Robot - -[WeBoX/*] -Parent=General Crawlers -Browser=WeBoX - -[WebTrends/*] -Parent=General Crawlers -Browser=WebTrends - -[West Wind Internet Protocols*] -Parent=General Crawlers -Browser=Versatel -isBanned=true - -[WhizBang] -Parent=General Crawlers -Browser=WhizBang - -[Willow Internet Crawler by Twotrees V*] -Parent=General Crawlers -Browser=Willow Internet Crawler - -[WIRE/* (Linux; i686; Bot,Robot,Spider,Crawler)] -Parent=General Crawlers -Browser=WIRE -isBanned=true - -[www.fi crawler, contact crawler@www.fi] -Parent=General Crawlers -Browser=www.fi crawler - -[Xerka WebBot v1.*] -Parent=General Crawlers -Browser=Xerka -isBanned=true - -[XML Sitemaps Generator*] -Parent=General Crawlers -Browser=XML Sitemaps Generator - -[XSpider*] -Parent=General Crawlers -Browser=XSpider -isBanned=true - -[YooW!/* (?http://www.yoow.eu)] -Parent=General Crawlers -Browser=YooW! -isBanned=true - -[HiddenMarket-*] -Parent=General RSS -Browser=HiddenMarket -isBanned=true - -[FOTOCHECKER] -Parent=Image Crawlers -Browser=FOTOCHECKER -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Search Engines - -[Search Engines] -Parent=DefaultProperties -Browser=Search Engines -Crawler=true - -[*FDSE robot*] -Parent=Search Engines -Browser=FDSE Robot - -[*Fluffy the spider*] -Parent=Search Engines -Browser=SearchHippo - -[Abacho*] -Parent=Search Engines -Browser=Abacho - -[ah-ha.com crawler (crawler@ah-ha.com)] -Parent=Search Engines -Browser=Ah-Ha - -[AIBOT/*] -Parent=Search Engines -Browser=21Seek.Com - -[ALeadSoftbot/*] -Parent=Search Engines -Browser=ALeadSoftbot - -[Amfibibot/*] -Parent=Search Engines -Browser=Amfibi - -[AnswerBus (http://www.answerbus.com/)] -Parent=Search Engines - -[antibot-V*] -Parent=Search Engines -Browser=antibot - -[appie*(www.walhello.com)] -Parent=Search Engines -Browser=Walhello - -[ASPSeek/*] -Parent=Search Engines -Browser=ASPSeek - -[BigCliqueBOT/*] -Parent=Search Engines -Browser=BigClique.com/BigClic.com - -[Blaiz-Bee/*] -Parent=Search Engines -Browser=RawGrunt - -[btbot/*] -Parent=Search Engines -Browser=Bit Torrent Search Engine - -[Busiversebot/v1.0 (http://www.busiverse.com/bot.php)] -Parent=Search Engines -Browser=Busiversebot -isBanned=true - -[CatchBot/*; http://www.catchbot.com] -Parent=Search Engines -Browser=CatchBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[CipinetBot (http://www.cipinet.com/bot.html)] -Parent=Search Engines -Browser=CipinetBot - -[Cogentbot/1.?*] -Parent=Search Engines -Browser=Cogentbot - -[compatible; Mozilla 4.0; MSIE 5.5; (SqwidgeBot v1.01 - http://www.sqwidge.com/bot/)] -Parent=Search Engines -Browser=SqwidgeBot - -[cosmos*] -Parent=Search Engines -Browser=Xyleme - -[Deepindex] -Parent=Search Engines -Browser=Deepindex - -[DiamondBot] -Parent=Search Engines -Browser=DiamondBot - -[Dumbot*] -Parent=Search Engines -Browser=Dumbot -Version=0.2 -MajorVer=0 -MinorVer=2 -Beta=true - -[Eule?Robot*] -Parent=Search Engines -Browser=Eule-Robot - -[Faxobot/*] -Parent=Search Engines -Browser=Faxo - -[Filangy/*] -Parent=Search Engines -Browser=Filangy - -[flatlandbot/*] -Parent=Search Engines -Browser=Flatland - -[Fooky.com/ScorpionBot/ScoutOut;*] -Parent=Search Engines -Browser=ScorpionBot -isBanned=true - -[FyberSpider*] -Parent=Search Engines -Browser=FyberSpider -isBanned=true - -[Gaisbot/*] -Parent=Search Engines -Browser=Gaisbot - -[gazz/*(gazz@nttr.co.jp)] -Parent=Search Engines -Browser=gazz - -[geniebot*] -Parent=Search Engines -Browser=GenieKnows - -[GOFORITBOT (?http://www.goforit.com/about/?)] -Parent=Search Engines -Browser=GoForIt - -[GoGuidesBot/*] -Parent=Search Engines -Browser=GoGuidesBot - -[GroschoBot/*] -Parent=Search Engines -Browser=GroschoBot - -[GurujiBot/1.*] -Parent=Search Engines -Browser=GurujiBot -isBanned=true - -[HenryTheMiragoRobot*] -Parent=Search Engines -Browser=Mirago - -[HolmesBot (http://holmes.ge)] -Parent=Search Engines -Browser=HolmesBot - -[Hotzonu/*] -Parent=Search Engines -Browser=Hotzonu - -[HyperEstraier/*] -Parent=Search Engines -Browser=HyperEstraier -isBanned=true - -[i1searchbot/*] -Parent=Search Engines -Browser=i1searchbot - -[IIITBOT/1.*] -Parent=Search Engines -Browser=Indian Language Web Search Engine - -[Iltrovatore-?etaccio/*] -Parent=Search Engines -Browser=Iltrovatore-Setaccio - -[InfociousBot (?http://corp.infocious.com/tech_crawler.php)] -Parent=Search Engines -Browser=InfociousBot -isBanned=true - -[Infoseek SideWinder/*] -Parent=Search Engines -Browser=Infoseek - -[iSEEKbot/*] -Parent=Search Engines -Browser=iSEEKbot - -[Knight/0.? (Zook Knight; http://knight.zook.in/; knight@zook.in)] -Parent=Search Engines -Browser=Knight - -[Kolinka Forum Search (www.kolinka.com)] -Parent=Search Engines -Browser=Kolinka Forum Search -isBanned=true - -[KRetrieve/] -Parent=Search Engines -Browser=KRetrieve -isBanned=true - -[LapozzBot/*] -Parent=Search Engines -Browser=LapozzBot - -[Linknzbot*] -Parent=Search Engines -Browser=Linknzbot - -[LocalcomBot/*] -Parent=Search Engines -Browser=LocalcomBot - -[Mail.Ru/1.0] -Parent=Search Engines -Browser=Mail.Ru - -[MaSagool/*] -Parent=Search Engines -Browser=Sagoo -Version=1.0 -MajorVer=1 -MinorVer=0 - -[miniRank/*] -Parent=Search Engines -Browser=miniRank - -[Mnogosearch*] -Parent=Search Engines -Browser=Mnogosearch - -[Mozilla/0.9* no dos :) (Linux)] -Parent=Search Engines -Browser=goliat -isBanned=true - -[Mozilla/4.0 (compatible; Arachmo)] -Parent=Search Engines -Browser=Arachmo - -[Mozilla/4.0 (compatible; http://search.thunderstone.com/texis/websearch/about.html)] -Parent=Search Engines -Browser=ThunderStone -isBanned=true - -[Mozilla/4.0 (compatible; MSIE *; Windows NT; Girafabot; girafabot at girafa dot com; http://www.girafa.com)] -Parent=Search Engines -Browser=Girafabot -Win32=true - -[Mozilla/4.0 (compatible; Vagabondo/*; webcrawler at wise-guys dot nl; *)] -Parent=Search Engines -Browser=Vagabondo - -[Mozilla/4.0(?compatible; MSIE 6.0; Qihoo *)] -Parent=Search Engines -Browser=Qihoo - -[Mozilla/4.7 (compatible; WhizBang; http://www.whizbang.com/crawler)] -Parent=Search Engines -Browser=Inxight Software - -[Mozilla/5.0 (*) VoilaBot*] -Parent=Search Engines -Browser=VoilaBot -isBanned=true - -[Mozilla/5.0 (compatible; ActiveTouristBot*; http://www.activetourist.com)] -Parent=Search Engines -Browser=ActiveTouristBot - -[Mozilla/5.0 (compatible; Butterfly/1.0; *)*] -Parent=Search Engines -Browser=Butterfly - -[Mozilla/5.0 (compatible; Charlotte/*; *)] -Parent=Search Engines -Browser=Charlotte -Beta=true -isBanned=true - -[Mozilla/5.0 (compatible; CXL-FatAssANT*)] -Parent=Search Engines -Browser=FatAssANT - -[Mozilla/5.0 (compatible; DBLBot/1.0; ?http://www.dontbuylists.com/)] -Parent=Search Engines -Browser=DBLBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (compatible; EARTHCOM.info/*)] -Parent=Search Engines -Browser=EARTHCOM - -[Mozilla/5.0 (compatible; Lipperhey Spider; http://www.lipperhey.com/)] -Parent=Search Engines -Browser=Lipperhey Spider - -[Mozilla/5.0 (compatible; MojeekBot/*; http://www.mojeek.com/bot.html)] -Parent=Search Engines -Browser=MojeekBot - -[Mozilla/5.0 (compatible; NLCrawler/*] -Parent=Search Engines -Browser=Northern Light Web Search - -[Mozilla/5.0 (compatible; OsO;*] -Parent=Search Engines -Browser=Octopodus -isBanned=true - -[Mozilla/5.0 (compatible; Pogodak.*)] -Parent=Search Engines -Browser=Pogodak - -[Mozilla/5.0 (compatible; Quantcastbot/1.*)] -Parent=Search Engines -Browser=Quantcastbot - -[Mozilla/5.0 (compatible; ScoutJet; *http://www.scoutjet.com/)] -Parent=Search Engines -Browser=ScoutJet - -[Mozilla/5.0 (compatible; Scrubby/*; http://www.scrubtheweb.com/abs/meta-check.html)] -Parent=Search Engines -Browser=Scrubby -isBanned=true - -[Mozilla/5.0 (compatible; YoudaoBot/1.*; http://www.youdao.com/help/webmaster/spider/*)] -Parent=Search Engines -Browser=YoudaoBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Twiceler*)] -Parent=Search Engines -Browser=Twiceler -isBanned=true - -[Mozilla/5.0 CostaCider Search*] -Parent=Search Engines -Browser=CostaCider Search - -[Mozilla/5.0 GurujiBot/1.0 (*)] -Parent=Search Engines -Browser=GurujiBot - -[NavissoBot] -Parent=Search Engines -Browser=NavissoBot - -[NextGenSearchBot*(for information visit *)] -Parent=Search Engines -Browser=ZoomInfo -isBanned=true - -[Norbert the Spider(Burf.com)] -Parent=Search Engines -Browser=Norbert the Spider - -[NuSearch Spider*] -Parent=Search Engines -Browser=nuSearch - -[ObjectsSearch/*] -Parent=Search Engines -Browser=ObjectsSearch - -[OpenISearch/1.*] -Parent=Search Engines -Browser=OpenISearch (Amazon) - -[Pagebull http://www.pagebull.com/] -Parent=Search Engines -Browser=Pagebull - -[PEERbot*] -Parent=Search Engines -Browser=PEERbot - -[Pompos/*] -Parent=Search Engines -Browser=Pompos - -[Popdexter/*] -Parent=Search Engines -Browser=Popdex - -[Qweery*] -Parent=Search Engines -Browser=QweeryBot - -[RedCell/* (*)] -Parent=Search Engines -Browser=RedCell - -[Scrubby/*] -Parent=Search Engines -Browser=Scrub The Web - -[Search-10/*] -Parent=Search Engines -Browser=Search-10 - -[search.ch*] -Parent=Search Engines -Browser=Swiss Search Engine - -[Searchmee! Spider*] -Parent=Search Engines -Browser=Searchmee! - -[Seekbot/*] -Parent=Search Engines -Browser=Seekbot - -[SiteSpider (http://www.SiteSpider.com/)] -Parent=Search Engines -Browser=SiteSpider - -[Spinne/*] -Parent=Search Engines -Browser=Spinne - -[sproose/*] -Parent=Search Engines -Browser=Sproose - -[Sqeobot/0.*] -Parent=Search Engines -Browser=Branzel -isBanned=true - -[SquigglebotBot/*] -Parent=Search Engines -Browser=SquigglebotBot -isBanned=true - -[StackRambler/*] -Parent=Search Engines -Browser=StackRambler - -[SygolBot*] -Parent=Search Engines -Browser=SygolBot - -[SynoBot] -Parent=Search Engines -Browser=SynoBot - -[Szukacz/*] -Parent=Search Engines -Browser=Szukacz - -[Tarantula/*] -Parent=Search Engines -Browser=Tarantula -isBanned=true - -[TerrawizBot/*] -Parent=Search Engines -Browser=TerrawizBot -isBanned=true - -[Tkensaku/*] -Parent=Search Engines -Browser=Tkensaku - -[TMCrawler] -Parent=Search Engines -Browser=TMCrawler -isBanned=true - -[Twingly Recon] -Parent=Search Engines -Browser=Twingly Recon -isBanned=true - -[updated/*] -Parent=Search Engines -Browser=Updated! - -[URL Spider Pro/*] -Parent=Search Engines -Browser=URL Spider Pro - -[URL Spider SQL*] -Parent=Search Engines -Browser=Innerprise Enterprise Search - -[VMBot/*] -Parent=Search Engines -Browser=VMBot - -[voyager/2.0 (http://www.kosmix.com/html/crawler.html)] -Parent=Search Engines -Browser=Voyager - -[wadaino.jp-crawler*] -Parent=Search Engines -Browser=wadaino.jp -isBanned=true - -[WebAlta Crawler/*] -Parent=Search Engines -Browser=WebAlta Crawler -isBanned=true - -[WebCorp/*] -Parent=Search Engines -Browser=WebCorp -isBanned=true - -[webcrawl.net] -Parent=Search Engines -Browser=webcrawl.net - -[WISEbot/*] -Parent=Search Engines -Browser=WISEbot -isBanned=true - -[Wotbox/*] -Parent=Search Engines -Browser=Wotbox - -[www.zatka.com] -Parent=Search Engines -Browser=Zatka - -[WWWeasel Robot v*] -Parent=Search Engines -Browser=World Wide Weasel - -[YadowsCrawler*] -Parent=Search Engines -Browser=YadowsCrawler - -[YodaoBot/*] -Parent=Search Engines -Browser=YodaoBot -isBanned=true - -[ZeBot_www.ze.bz*] -Parent=Search Engines -Browser=ZE.bz - -[zibber-v*] -Parent=Search Engines -Browser=Zibb - -[ZipppBot/*] -Parent=Search Engines -Browser=ZipppBot - -[ATA-Translation-Service] -Parent=Translators -Browser=ATA-Translation-Service - -[GJK_Browser_Check] -Parent=Version Checkers -Browser=GJK_Browser_Check - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Hatena - -[Hatena] -Parent=DefaultProperties -Browser=Hatena -isBanned=true -Crawler=true - -[Feed::Find/*] -Parent=Hatena -Browser=Feed Find -isSyndicationReader=true - -[Hatena Antenna/*] -Parent=Hatena -Browser=Hatena Antenna - -[Hatena Bookmark/*] -Parent=Hatena -Browser=Hatena Bookmark - -[Hatena RSS/*] -Parent=Hatena -Browser=Hatena RSS -isSyndicationReader=true - -[Hatena::Crawler/*] -Parent=Hatena -Browser=Hatena Crawler - -[HatenaScreenshot*] -Parent=Hatena -Browser=HatenaScreenshot - -[URI::Fetch/*] -Parent=Hatena -Browser=URI::Fetch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Internet Archive - -[Internet Archive] -Parent=DefaultProperties -Browser=Internet Archive -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*heritrix*] -Parent=Internet Archive -Browser=Heritrix -isBanned=true - -[ia_archiver*] -Parent=Internet Archive -Browser=Internet Archive - -[InternetArchive/*] -Parent=Internet Archive -Browser=InternetArchive - -[Mozilla/5.0 (compatible; archive.org_bot/1.*)] -Parent=Internet Archive - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nutch - -[Nutch] -Parent=DefaultProperties -Browser=Nutch -isBanned=true -Crawler=true - -[*Nutch*] -Parent=Nutch -isBanned=true - -[CazoodleBot/*] -Parent=Nutch -Browser=CazoodleBot - -[LOOQ/0.1*] -Parent=Nutch -Browser=LOOQ - -[Nutch/0.? (OpenX Spider)] -Parent=Nutch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Webaroo - -[Webaroo] -Parent=DefaultProperties -Browser=Webaroo - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Webaroo/*)] -Parent=Webaroo -Browser=Webaroo - -[Mozilla/5.0 (Windows; U; Windows *; *; rv:*) Gecko/* Firefox/* webaroo/*] -Parent=Webaroo -Browser=Webaroo - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Word Press - -[Word Press] -Parent=DefaultProperties -Browser=Word Press -Alpha=true -Beta=true -Win16=true -Win32=true -Win64=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -isBanned=true -isMobileDevice=true -isSyndicationReader=true -Crawler=true - -[WordPress-B-/2.*] -Parent=Word Press -Browser=WordPress-B - -[WordPress-Do-P-/2.*] -Parent=Word Press -Browser=WordPress-Do-P - -[BlueCoat ProxySG] -Parent=Blue Coat Systems -Browser=BlueCoat ProxySG - -[CerberianDrtrs/*] -Parent=Blue Coat Systems -Browser=Cerberian - -[Inne: Mozilla/4.0 (compatible; Cerberian Drtrs*)] -Parent=Blue Coat Systems -Browser=Cerberian - -[Mozilla/4.0 (compatible; Cerberian Drtrs*)] -Parent=Blue Coat Systems -Browser=Cerberian - -[Mozilla/4.0 (compatible; MSIE 6.0; Bluecoat DRTR)] -Parent=Blue Coat Systems -Browser=Bluecoat - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Copyright/Plagiarism - -[Copyright/Plagiarism] -Parent=DefaultProperties -Browser=Copyright/Plagiarism -isBanned=true -Crawler=true - -[BDFetch] -Parent=Copyright/Plagiarism -Browser=BDFetch - -[copyright sheriff (*)] -Parent=Copyright/Plagiarism -Browser=copyright sheriff - -[CopyRightCheck*] -Parent=Copyright/Plagiarism -Browser=CopyRightCheck - -[FairAd Client*] -Parent=Copyright/Plagiarism -Browser=FairAd Client - -[iCopyright Conductor*] -Parent=Copyright/Plagiarism -Browser=iCopyright Conductor - -[IPiumBot laurion(dot)com] -Parent=Copyright/Plagiarism -Browser=IPiumBot - -[IWAgent/*] -Parent=Copyright/Plagiarism -Browser=Brand Protect - -[Mozilla/5.0 (compatible; DKIMRepBot/*)] -Parent=Copyright/Plagiarism -Browser=DKIMRepBot - -[oBot] -Parent=Copyright/Plagiarism -Browser=oBot - -[SlySearch/*] -Parent=Copyright/Plagiarism -Browser=SlySearch - -[TurnitinBot/*] -Parent=Copyright/Plagiarism -Browser=TurnitinBot - -[TutorGigBot/*] -Parent=Copyright/Plagiarism -Browser=TutorGig - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DNS Tools - -[DNS Tools] -Parent=DefaultProperties -Browser=DNS Tools -Crawler=true - -[Domain Dossier utility*] -Parent=DNS Tools -Browser=Domain Dossier - -[Mozilla/5.0 (compatible; DNS-Digger/*)] -Parent=DNS Tools -Browser=DNS-Digger - -[OpenDNS Domain Crawler noc@opendns.com] -Parent=DNS Tools -Browser=OpenDNS Domain Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Download Managers - -[Download Managers] -Parent=DefaultProperties -Browser=Download Managers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[AndroidDownloadManager] -Parent=Download Managers -Browser=Android Download Manager - -[AutoMate5] -Parent=Download Managers -Browser=AutoMate5 - -[Beamer*] -Parent=Download Managers -Browser=Beamer - -[BitBeamer/*] -Parent=Download Managers -Browser=BitBeamer - -[BitTorrent/*] -Parent=Download Managers -Browser=BitTorrent - -[DA *] -Parent=Download Managers -Browser=Download Accelerator - -[Download Demon*] -Parent=Download Managers -Browser=Download Demon - -[Download Express*] -Parent=Download Managers -Browser=Download Express - -[Download Master*] -Parent=Download Managers -Browser=Download Master - -[Download Ninja*] -Parent=Download Managers -Browser=Download Ninja - -[Download Wonder*] -Parent=Download Managers -Browser=Download Wonder - -[DownloadSession*] -Parent=Download Managers -Browser=DownloadSession - -[EasyDL/*] -Parent=Download Managers -Browser=EasyDL - -[FDM 1.x] -Parent=Download Managers -Browser=Free Download Manager - -[FlashGet] -Parent=Download Managers -Browser=FlashGet - -[FreshDownload/*] -Parent=Download Managers -Browser=FreshDownload - -[GetRight/*] -Parent=Download Managers -Browser=GetRight - -[GetRightPro/*] -Parent=Download Managers -Browser=GetRightPro - -[GetSmart/*] -Parent=Download Managers -Browser=GetSmart - -[Go!Zilla*] -Parent=Download Managers -Browser=GoZilla - -[Gozilla/*] -Parent=Download Managers -Browser=Gozilla - -[Internet Ninja*] -Parent=Download Managers -Browser=Internet Ninja - -[Kontiki Client*] -Parent=Download Managers -Browser=Kontiki Client - -[lftp/3.2.1] -Parent=Download Managers -Browser=lftp - -[LightningDownload/*] -Parent=Download Managers -Browser=LightningDownload - -[LMQueueBot/*] -Parent=Download Managers -Browser=LMQueueBot - -[MetaProducts Download Express/*] -Parent=Download Managers -Browser=Download Express - -[Mozilla/4.0 (compatible; Getleft*)] -Parent=Download Managers -Browser=Getleft - -[Myzilla] -Parent=Download Managers -Browser=Myzilla - -[Net Vampire/*] -Parent=Download Managers -Browser=Net Vampire - -[Net_Vampire*] -Parent=Download Managers -Browser=Net_Vampire - -[NetAnts*] -Parent=Download Managers -Browser=NetAnts - -[NetPumper*] -Parent=Download Managers -Browser=NetPumper - -[NetSucker*] -Parent=Download Managers -Browser=NetSucker - -[NetZip Downloader*] -Parent=Download Managers -Browser=NetZip Downloader - -[NexTools WebAgent*] -Parent=Download Managers -Browser=NexTools WebAgent - -[Offline Downloader*] -Parent=Download Managers -Browser=Offline Downloader - -[P3P Client] -Parent=Download Managers -Browser=P3P Client - -[PageDown*] -Parent=Download Managers -Browser=PageDown - -[PicaLoader*] -Parent=Download Managers -Browser=PicaLoader - -[Prozilla*] -Parent=Download Managers -Browser=Prozilla - -[RealDownload/*] -Parent=Download Managers -Browser=RealDownload - -[sEasyDL/*] -Parent=Download Managers -Browser=EasyDL - -[shareaza*] -Parent=Download Managers -Browser=shareaza - -[SmartDownload/*] -Parent=Download Managers -Browser=SmartDownload - -[SpeedDownload/*] -Parent=Download Managers -Browser=Speed Download - -[Star*Downloader/*] -Parent=Download Managers -Browser=StarDownloader - -[STEROID Download] -Parent=Download Managers -Browser=STEROID Download - -[SuperBot/*] -Parent=Download Managers -Browser=SuperBot - -[Vegas95/*] -Parent=Download Managers -Browser=Vegas95 - -[WebZIP*] -Parent=Download Managers -Browser=WebZIP - -[Wget*] -Parent=Download Managers -Browser=Wget - -[WinTools] -Parent=Download Managers -Browser=WinTools - -[Xaldon WebSpider*] -Parent=Download Managers -Browser=Xaldon WebSpider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; E-Mail Harvesters - -[E-Mail Harvesters] -Parent=DefaultProperties -Browser=E-Mail Harvesters -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*E-Mail Address Extractor*] -Parent=E-Mail Harvesters -Browser=E-Mail Address Extractor - -[*Larbin*] -Parent=E-Mail Harvesters -Browser=Larbin - -[*www4mail/*] -Parent=E-Mail Harvesters -Browser=www4mail - -[8484 Boston Project*] -Parent=E-Mail Harvesters -Browser=8484 Boston Project - -[CherryPicker*/*] -Parent=E-Mail Harvesters -Browser=CherryPickerElite - -[Chilkat/*] -Parent=E-Mail Harvesters -Browser=Chilkat - -[ContactBot/*] -Parent=E-Mail Harvesters -Browser=ContactBot - -[eCatch*] -Parent=E-Mail Harvesters -Browser=eCatch - -[EmailCollector*] -Parent=E-Mail Harvesters -Browser=E-Mail Collector - -[EMAILsearcher] -Parent=E-Mail Harvesters -Browser=EMAILsearcher - -[EmailSiphon*] -Parent=E-Mail Harvesters -Browser=E-Mail Siphon - -[EmailWolf*] -Parent=E-Mail Harvesters -Browser=EMailWolf - -[Epsilon SoftWorks' MailMunky] -Parent=E-Mail Harvesters -Browser=MailMunky - -[ExtractorPro*] -Parent=E-Mail Harvesters -Browser=ExtractorPro - -[Franklin Locator*] -Parent=E-Mail Harvesters -Browser=Franklin Locator - -[Missigua Locator*] -Parent=E-Mail Harvesters -Browser=Missigua Locator - -[Mozilla/4.0 (compatible; Advanced Email Extractor*)] -Parent=E-Mail Harvesters -Browser=Advanced Email Extractor - -[Netprospector*] -Parent=E-Mail Harvesters -Browser=Netprospector - -[ProWebWalker*] -Parent=E-Mail Harvesters -Browser=ProWebWalker - -[sna-0.0.*] -Parent=E-Mail Harvesters -Browser=Mike Elliott's E-Mail Harvester - -[WebEnhancer*] -Parent=E-Mail Harvesters -Browser=WebEnhancer - -[WebMiner*] -Parent=E-Mail Harvesters -Browser=WebMiner - -[ZIBB Crawler (email address / WWW address)] -Parent=E-Mail Harvesters -Browser=ZIBB Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Feeds Blogs - -[Feeds Blogs] -Parent=DefaultProperties -Browser=Feeds Blogs -isSyndicationReader=true -Crawler=true - -[Bloglines Title Fetch/*] -Parent=Feeds Blogs -Browser=Bloglines Title Fetch - -[Bloglines/* (http://www.bloglines.com*)] -Parent=Feeds Blogs -Browser=BlogLines Web - -[BlogPulseLive (support@blogpulse.com)] -Parent=Feeds Blogs -Browser=BlogPulseLive - -[blogsearchbot-pumpkin-2] -Parent=Feeds Blogs -Browser=blogsearchbot-pumpkin -isSyndicationReader=false - -[Irish Blogs Aggregator/*1.0*] -Parent=Feeds Blogs -Browser=Irish Blogs Aggregator -Version=1.0 -MajorVer=1 -MinorVer=0 - -[kinjabot (http://www.kinja.com; *)] -Parent=Feeds Blogs -Browser=kinjabot - -[Net::Trackback/*] -Parent=Feeds Blogs -Browser=Net::Trackback - -[Reblog*] -Parent=Feeds Blogs -Browser=Reblog - -[WordPress/*] -Parent=Feeds Blogs -Browser=WordPress - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Feeds Syndicators - -[Feeds Syndicators] -Parent=DefaultProperties -Browser=Feeds Syndicators -isSyndicationReader=true - -[*LinkLint*] -Parent=Feeds Syndicators -Browser=LinkLint - -[*NetNewsWire/*] -Parent=Feeds Syndicators - -[*NetVisualize*] -Parent=Feeds Syndicators -Browser=NetVisualize - -[AideRSS 2.* (postrank.com)] -Parent=Feeds Syndicators -Browser=AideRSS - -[AideRSS/2.0 (aiderss.com)] -Parent=Feeds Syndicators -Browser=AideRSS -isBanned=true - -[Akregator/*] -Parent=Feeds Syndicators -Browser=Akregator - -[AppleSyndication/*] -Parent=Feeds Syndicators -Browser=Safari RSS -Platform=MacOSX - -[Cocoal.icio.us/* (*)*] -Parent=Feeds Syndicators -Browser=Cocoal.icio.us -isBanned=true - -[Feed43 Proxy/* (*)] -Parent=Feeds Syndicators -Browser=Feed For Free - -[FeedBurner/*] -Parent=Feeds Syndicators -Browser=FeedBurner - -[FeedDemon/* (*)] -Parent=Feeds Syndicators -Browser=FeedDemon -Platform=Win32 - -[FeedDigest/* (*)] -Parent=Feeds Syndicators -Browser=FeedDigest - -[FeedGhost/1.*] -Parent=Feeds Syndicators -Browser=FeedGhost -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedOnFeeds/0.1.* ( http://minutillo.com/steve/feedonfeeds/)] -Parent=Feeds Syndicators -Browser=FeedOnFeeds -Version=0.1 -MajorVer=0 -MinorVer=1 - -[Feedreader * (Powered by Newsbrain)] -Parent=Feeds Syndicators -Browser=Newsbrain - -[Feedshow/* (*)] -Parent=Feeds Syndicators -Browser=Feedshow - -[Feedster Crawler/?.0; Feedster, Inc.] -Parent=Feeds Syndicators -Browser=Feedster - -[GreatNews/1.0] -Parent=Feeds Syndicators -Browser=GreatNews -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Gregarius/*] -Parent=Feeds Syndicators -Browser=Gregarius - -[intraVnews/*] -Parent=Feeds Syndicators -Browser=intraVnews - -[JetBrains Omea Reader*] -Parent=Feeds Syndicators -Browser=Omea Reader -isBanned=true - -[Liferea/1.5* (Linux; *; http://liferea.sf.net/)] -Parent=Feeds Syndicators -Browser=Liferea -isBanned=true - -[livedoor FeedFetcher/0.0* (http://reader.livedoor.com/;*)] -Parent=Feeds Syndicators -Browser=FeedFetcher -Version=0.0 -MajorVer=0 -MinorVer=0 - -[MagpieRSS/* (*)] -Parent=Feeds Syndicators -Browser=MagpieRSS - -[Mobitype * (compatible; Mozilla/*; MSIE *.*; Windows *)] -Parent=Feeds Syndicators -Browser=Mobitype -Platform=Win32 - -[Mozilla/5.0 (*; Rojo *; http://www.rojo.com/corporate/help/agg; *)*] -Parent=Feeds Syndicators -Browser=Rojo - -[Mozilla/5.0 (*aggregator:TailRank; http://tailrank.com/robot)*] -Parent=Feeds Syndicators -Browser=TailRank - -[Mozilla/5.0 (compatible; MSIE 6.0; Podtech Network; crawler_admin@podtech.net)] -Parent=Feeds Syndicators -Browser=Podtech Network - -[Mozilla/5.0 (compatible; Newz Crawler *; http://www.newzcrawler.com/?)] -Parent=Feeds Syndicators -Browser=Newz Crawler - -[Mozilla/5.0 (compatible; RSSMicro.com RSS/Atom Feed Robot)] -Parent=Feeds Syndicators -Browser=RSSMicro - -[Mozilla/5.0 (compatible;*newstin.com;*)] -Parent=Feeds Syndicators -Browser=NewsTin - -[Mozilla/5.0 (RSS Reader Panel)] -Parent=Feeds Syndicators -Browser=RSS Reader Panel - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:FeedParser; *) Gecko/*] -Parent=Feeds Syndicators -Browser=FeedParser - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:NewsMonster; *) Gecko/*] -Parent=Feeds Syndicators -Browser=NewsMonster - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:Rojo; *) Gecko/*] -Parent=Feeds Syndicators -Browser=Rojo - -[Netvibes (*)] -Parent=Feeds Syndicators -Browser=Netvibes - -[NewsAlloy/* (*)] -Parent=Feeds Syndicators -Browser=NewsAlloy - -[Omnipelagos*] -Parent=Feeds Syndicators -Browser=Omnipelagos - -[Particls] -Parent=Feeds Syndicators -Browser=Particls - -[Protopage/* (*)] -Parent=Feeds Syndicators -Browser=Protopage - -[PubSub-RSS-Reader/* (*)] -Parent=Feeds Syndicators -Browser=PubSub-RSS-Reader - -[RSS Menu/*] -Parent=Feeds Syndicators -Browser=RSS Menu - -[RssBandit/*] -Parent=Feeds Syndicators -Browser=RssBandit - -[RssBar/1.2*] -Parent=Feeds Syndicators -Browser=RssBar -Version=1.2 -MajorVer=1 -MinorVer=2 - -[SharpReader/*] -Parent=Feeds Syndicators -Browser=SharpReader - -[SimplePie/*] -Parent=Feeds Syndicators -Browser=SimplePie - -[Strategic Board Bot (?http://www.strategicboard.com)] -Parent=Feeds Syndicators -Browser=Strategic Board Bot -isBanned=true - -[TargetYourNews.com bot] -Parent=Feeds Syndicators -Browser=TargetYourNews - -[Technoratibot/*] -Parent=Feeds Syndicators -Browser=Technoratibot - -[Tumblr/* RSS syndication ( http://www.tumblr.com/) (support@tumblr.com)] -Parent=Feeds Syndicators -Browser=Tumblr RSS syndication - -[Windows-RSS-Platform/1.0*] -Parent=Feeds Syndicators -Browser=Windows-RSS-Platform -Version=1.0 -MajorVer=1 -MinorVer=0 -Win32=true - -[Wizz RSS News Reader] -Parent=Feeds Syndicators -Browser=Wizz - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; General RSS - -[General RSS] -Parent=DefaultProperties -Browser=General RSS -isSyndicationReader=true - -[AideRSS/1.0 (aiderss.com); * subscribers] -Parent=General RSS -Browser=AideRSS -Version=1.0 -MajorVer=1 -MinorVer=0 - -[CC Metadata Scaper http://wiki.creativecommons.org/Metadata_Scraper] -Parent=General RSS -Browser=CC Metadata Scaper - -[Mozilla/5.0 (compatible) GM RSS Panel] -Parent=General RSS -Browser=RSS Panel - -[Mozilla/5.0 http://www.inclue.com; graeme@inclue.com] -Parent=General RSS -Browser=Inclue - -[Runnk online rss reader : http://www.runnk.com/ : RSS favorites : RSS ranking : RSS aggregator*] -Parent=General RSS -Browser=Ruunk - -[Windows-RSS-Platform/2.0 (MSIE 8.0; Windows NT 6.0)] -Parent=General RSS -Browser=Windows-RSS-Platform -Platform=WinVista - -[Mozilla/5.0 (X11; ?; Linux; *) AppleWebKit/* (KHTML, like Gecko, Safari/*) Arora/0.4] -Parent=Google Code -Browser=Arora -Version=0.4 -MajorVer=0 -MinorVer=4 -Platform=Linux -CssVersion=2 -supportsCSS=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Validation Checkers - -[HTML Validators] -Parent=DefaultProperties -Browser=HTML Validators -Frames=true -IFrames=true -Tables=true -Crawler=true - -[(HTML Validator http://www.searchengineworld.com/validator/)] -Parent=HTML Validators -Browser=Search Engine World HTML Validator - -[FeedValidator/1.3] -Parent=HTML Validators -Browser=FeedValidator -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Jigsaw/* W3C_CSS_Validator_JFouffa/*] -Parent=HTML Validators -Browser=Jigsaw CSS Validator - -[Search Engine World Robots.txt Validator*] -Parent=HTML Validators -Browser=Search Engine World Robots.txt Validator - -[W3C_Validator/*] -Parent=HTML Validators -Browser=W3C Validator - -[W3CLineMode/*] -Parent=HTML Validators -Browser=W3C Line Mode - -[Weblide/2.? beta*] -Parent=HTML Validators -Browser=Weblide -Version=2.0 -MajorVer=2 -MinorVer=0 -Beta=true - -[WebmasterWorld StickyMail Server Header Checker*] -Parent=HTML Validators -Browser=WebmasterWorld Server Header Checker - -[WWWC/*] -Parent=HTML Validators - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Image Crawlers - -[Image Crawlers] -Parent=DefaultProperties -Browser=Image Crawlers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*CFNetwork*] -Parent=Image Crawlers -Browser=CFNetwork - -[*PhotoStickies/*] -Parent=Image Crawlers -Browser=PhotoStickies - -[Camcrawler*] -Parent=Image Crawlers -Browser=Camcrawler - -[CydralSpider/*] -Parent=Image Crawlers -Browser=Cydral Web Image Search -isBanned=true - -[Der gro\xdfe BilderSauger*] -Parent=Image Crawlers -Browser=Gallery Grabber - -[Extreme Picture Finder] -Parent=Image Crawlers -Browser=Extreme Picture Finder - -[FLATARTS_FAVICO] -Parent=Image Crawlers -Browser=FlatArts Favorites Icon Tool - -[HTML2JPG Blackbox, http://www.html2jpg.com] -Parent=Image Crawlers -Browser=HTML2JPG - -[IconSurf/2.*] -Parent=Image Crawlers -Browser=IconSurf - -[kalooga/KaloogaBot*] -Parent=Image Crawlers -Browser=KaloogaBot - -[Mister PIX*] -Parent=Image Crawlers -Browser=Mister PIX - -[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/* (*) Pandora/2.*] -Parent=Image Crawlers -Browser=Pandora - -[naoFavicon4IE*] -Parent=Image Crawlers -Browser=naoFavicon4IE - -[pixfinder/*] -Parent=Image Crawlers -Browser=pixfinder - -[rssImagesBot/0.1 (*http://herbert.groot.jebbink.nl/?app=rssImages)] -Parent=Image Crawlers -Browser=rssImagesBot - -[Web Image Collector*] -Parent=Image Crawlers -Browser=Web Image Collector - -[WebImages * (?http://herbert.groot.jebbink.nl/?app=WebImages?)] -Parent=Image Crawlers -Browser=WebImages - -[WebPix*] -Parent=Image Crawlers -Browser=Custo - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Link Checkers - -[Link Checkers] -Parent=DefaultProperties -Browser=Link Checkers -Frames=true -IFrames=true -Tables=true -Crawler=true - -[!Susie (http://www.sync2it.com/susie)] -Parent=Link Checkers -Browser=!Susie - -[*AgentName/*] -Parent=Link Checkers -Browser=AgentName - -[*Linkman*] -Parent=Link Checkers -Browser=Linkman - -[*LinksManager.com*] -Parent=Link Checkers -Browser=LinksManager - -[*Powermarks/*] -Parent=Link Checkers -Browser=Powermarks - -[*W3C-checklink/*] -Parent=Link Checkers -Browser=W3C Link Checker - -[*Web Link Validator*] -Parent=Link Checkers -Browser=Web Link Validator - -[*Zeus*] -Parent=Link Checkers -Browser=Zeus -isBanned=true - -[ActiveBookmark *] -Parent=Link Checkers -Browser=ActiveBookmark - -[Bookdog/*] -Parent=Link Checkers -Browser=Bookdog - -[Bookmark Buddy*] -Parent=Link Checkers -Browser=Bookmark Buddy - -[Bookmark Renewal Check Agent*] -Parent=Link Checkers -Browser=Bookmark Renewal Check Agent - -[Bookmark search tool*] -Parent=Link Checkers -Browser=Bookmark search tool - -[Bookmark-Manager] -Parent=Link Checkers -Browser=Bookmark-Manager - -[Checkbot*] -Parent=Link Checkers -Browser=Checkbot - -[CheckLinks/*] -Parent=Link Checkers -Browser=CheckLinks - -[CyberSpyder Link Test/*] -Parent=Link Checkers -Browser=CyberSpyder Link Test - -[DLC/*] -Parent=Link Checkers -Browser=DLC - -[DocWeb Link Crawler (http://doc.php.net)] -Parent=Link Checkers -Browser=DocWeb Link Crawler - -[FavOrg] -Parent=Link Checkers -Browser=FavOrg - -[Favorites Sweeper v.3.*] -Parent=Link Checkers -Browser=Favorites Sweeper - -[FindLinks/*] -Parent=Link Checkers -Browser=FindLinks - -[Funnel Web Profiler*] -Parent=Link Checkers -Browser=Funnel Web Profiler - -[Html Link Validator (www.lithopssoft.com)] -Parent=Link Checkers -Browser=HTML Link Validator - -[IECheck] -Parent=Link Checkers -Browser=IECheck - -[JCheckLinks/*] -Parent=Link Checkers -Browser=JCheckLinks - -[JRTwine Software Check Favorites Utility] -Parent=Link Checkers -Browser=JRTwine - -[Link Valet Online*] -Parent=Link Checkers -Browser=Link Valet -isBanned=true - -[LinkAlarm/*] -Parent=Link Checkers -Browser=LinkAlarm - -[Linkbot*] -Parent=Link Checkers -Browser=Linkbot - -[LinkChecker/*] -Parent=Link Checkers -Browser=LinkChecker - -[LinkextractorPro*] -Parent=Link Checkers -Browser=LinkextractorPro -isBanned=true - -[LinkLint-checkonly/*] -Parent=Link Checkers -Browser=LinkLint - -[LinkScan/*] -Parent=Link Checkers -Browser=LinkScan - -[LinkSweeper/*] -Parent=Link Checkers -Browser=LinkSweeper - -[LinkWalker*] -Parent=Link Checkers -Browser=LinkWalker - -[MetaGer-LinkChecker] -Parent=Link Checkers -Browser=MetaGer-LinkChecker - -[Mozilla/* (compatible; linktiger/*; *http://www.linktiger.com*)] -Parent=Link Checkers -Browser=LinkTiger -isBanned=true - -[Mozilla/4.0 (Compatible); URLBase*] -Parent=Link Checkers -Browser=URLBase - -[Mozilla/4.0 (compatible; Link Utility; http://net-promoter.com)] -Parent=Link Checkers -Browser=NetPromoter Link Utility - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98) Web Link Validator*] -Parent=Link Checkers -Browser=Web Link Validator -Win32=true - -[Mozilla/4.0 (compatible; MSIE 7.0; Win32) Link Commander 3.0] -Parent=Link Checkers -Browser=Link Commander -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Win32 - -[Mozilla/4.0 (compatible; smartBot/1.*; checking links; *)] -Parent=Link Checkers -Browser=smartBot - -[Mozilla/4.0 (compatible; SuperCleaner*;*)] -Parent=Link Checkers -Browser=SuperCleaner - -[Mozilla/5.0 gURLChecker/*] -Parent=Link Checkers -Browser=gURLChecker -isBanned=true - -[Newsgroupreporter LinkCheck] -Parent=Link Checkers -Browser=Newsgroupreporter LinkCheck - -[onCHECK Linkchecker von www.scientec.de fuer www.onsinn.de] -Parent=Link Checkers -Browser=onCHECK Linkchecker - -[online link validator (http://www.dead-links.com/)] -Parent=Link Checkers -Browser=Dead-Links.com -isBanned=true - -[REL Link Checker*] -Parent=Link Checkers -Browser=REL Link Checker - -[RLinkCheker*] -Parent=Link Checkers -Browser=RLinkCheker - -[Robozilla/*] -Parent=Link Checkers -Browser=Robozilla - -[RPT-HTTPClient/*] -Parent=Link Checkers -Browser=RPT-HTTPClient -isBanned=true - -[SafariBookmarkChecker*(?http://www.coriolis.ch/)] -Parent=Link Checkers -Browser=SafariBookmarkChecker -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[Simpy/* (Simpy; http://www.simpy.com/?ref=bot; feedback at simpy dot com)] -Parent=Link Checkers -Browser=Simpy - -[SiteBar/*] -Parent=Link Checkers -Browser=SiteBar - -[Susie (http://www.sync2it.com/bms/susie.php] -Parent=Link Checkers -Browser=Susie - -[URLBase/6.*] -Parent=Link Checkers - -[VSE/*] -Parent=Link Checkers -Browser=VSE Link Tester - -[WebTrends Link Analyzer] -Parent=Link Checkers -Browser=WebTrends Link Analyzer - -[WorQmada/*] -Parent=Link Checkers -Browser=WorQmada - -[Xenu* Link Sleuth*] -Parent=Link Checkers -Browser=Xenu's Link Sleuth -isBanned=true - -[Z-Add Link Checker*] -Parent=Link Checkers -Browser=Z-Add Link Checker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Microsoft - -[Microsoft] -Parent=DefaultProperties -Browser=Microsoft -isBanned=true - -[Live (http://www.live.com/)] -Parent=Microsoft -Browser=Microsoft Live -isBanned=false -isSyndicationReader=true - -[MFC Foundation Class Library*] -Parent=Microsoft -Browser=MFC Foundation Class Library - -[MFHttpScan] -Parent=Microsoft -Browser=MFHttpScan - -[Microsoft BITS/*] -Parent=Microsoft -Browser=BITS - -[Microsoft Data Access Internet Publishing Provider Cache Manager] -Parent=Microsoft -Browser=MS IPP - -[Microsoft Data Access Internet Publishing Provider DAV*] -Parent=Microsoft -Browser=MS IPP DAV - -[Microsoft Data Access Internet Publishing Provider Protocol Discovery] -Parent=Microsoft -Browser=MS IPPPD - -[Microsoft Internet Explorer] -Parent=Microsoft -Browser=Fake IE - -[Microsoft Office Existence Discovery] -Parent=Microsoft -Browser=Microsoft Office Existence Discovery - -[Microsoft Office Protocol Discovery] -Parent=Microsoft -Browser=MS OPD - -[Microsoft Office/* (*Picture Manager*)] -Parent=Microsoft -Browser=Microsoft Office Picture Manager - -[Microsoft URL Control*] -Parent=Microsoft -Browser=Microsoft URL Control - -[Microsoft Visio MSIE] -Parent=Microsoft -Browser=Microsoft Visio - -[Microsoft-WebDAV-MiniRedir/*] -Parent=Microsoft -Browser=Microsoft-WebDAV - -[Mozilla/5.0 (Macintosh; Intel Mac OS X) Excel/12.*] -Parent=Microsoft -Browser=Microsoft Excel -Version=12.0 -MajorVer=12 -MinorVer=0 -Platform=MacOSX - -[MSN Feed Manager] -Parent=Microsoft -Browser=MSN Feed Manager -isBanned=false -isSyndicationReader=true - -[MSProxy/*] -Parent=Microsoft -Browser=MS Proxy - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Miscellaneous Browsers - -[Miscellaneous Browsers] -Parent=DefaultProperties -Browser=Miscellaneous Browsers -Frames=true -Tables=true -Cookies=true - -[*Amiga*] -Parent=Miscellaneous Browsers -Browser=Amiga -Platform=Amiga - -[*avantbrowser*] -Parent=Miscellaneous Browsers -Browser=Avant Browser - -[12345] -Parent=Miscellaneous Browsers -Browser=12345 -isBanned=true - -[Ace Explorer] -Parent=Miscellaneous Browsers -Browser=Ace Explorer - -[Enigma Browser*] -Parent=Miscellaneous Browsers -Browser=Enigma Browser - -[EVE-minibrowser/*] -Parent=Miscellaneous Browsers -Browser=EVE-minibrowser -IFrames=false -Tables=false -BackgroundSounds=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -isBanned=false -Crawler=false - -[Godzilla/* (Basic*; *; Commodore C=64; *; rv:1.*)*] -Parent=Miscellaneous Browsers -Browser=Godzilla - -[GreenBrowser] -Parent=Miscellaneous Browsers -Browser=GreenBrowser -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Kopiczek/* (WyderOS*; *)] -Parent=Miscellaneous Browsers -Browser=Kopiczek -Platform=WyderOS -IFrames=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (*) - BrowseX (*)] -Parent=Miscellaneous Browsers -Browser=BrowseX - -[Mozilla/* (Win32;*Escape?*; ?)] -Parent=Miscellaneous Browsers -Browser=Escape -Platform=Win32 - -[Mozilla/4.0 (compatible; ibisBrowser)] -Parent=Miscellaneous Browsers -Browser=ibisBrowser - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) AppleWebKit/* (*) HistoryHound/*] -Parent=Miscellaneous Browsers -Browser=HistoryHound - -[NetRecorder*] -Parent=Miscellaneous Browsers -Browser=NetRecorder - -[NetSurfer*] -Parent=Miscellaneous Browsers -Browser=NetSurfer - -[ogeb browser , Version 1.1.0] -Parent=Miscellaneous Browsers -Browser=ogeb browser -Version=1.1 -MajorVer=1 -MinorVer=1 - -[SCEJ PSP BROWSER 0102pspNavigator] -Parent=Miscellaneous Browsers -Browser=Wipeout Pure - -[SlimBrowser] -Parent=Miscellaneous Browsers -Browser=SlimBrowser - -[WWW_Browser/*] -Parent=Miscellaneous Browsers -Browser=WWW Browser -Version=1.69 -MajorVer=1 -MinorVer=69 -Platform=Win16 -CssVersion=3 -supportsCSS=true - -[*Netcraft Webserver Survey*] -Parent=Netcraft -Browser=Netcraft Webserver Survey -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Offline Browsers - -[Offline Browsers] -Parent=DefaultProperties -Browser=Offline Browsers -Frames=true -Tables=true -Cookies=true -isBanned=true -Crawler=true - -[*Check&Get*] -Parent=Offline Browsers -Browser=Check&Get - -[*HTTrack*] -Parent=Offline Browsers -Browser=HTTrack - -[*MSIECrawler*] -Parent=Offline Browsers -Browser=IE Offline Browser - -[*TweakMASTER*] -Parent=Offline Browsers -Browser=TweakMASTER - -[BackStreet Browser *] -Parent=Offline Browsers -Browser=BackStreet Browser - -[Go-Ahead-Got-It*] -Parent=Offline Browsers -Browser=Go Ahead Got-It - -[iGetter/*] -Parent=Offline Browsers -Browser=iGetter - -[Teleport*] -Parent=Offline Browsers -Browser=Teleport - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Online Scanners - -[Online Scanners] -Parent=DefaultProperties -Browser=Online Scanners -isBanned=true - -[JoeDog/* (X11; I; Siege *)] -Parent=Online Scanners -Browser=JoeDog -isBanned=false - -[Morfeus Fucking Scanner] -Parent=Online Scanners -Browser=Morfeus Fucking Scanner - -[Mozilla/4.0 (compatible; Trend Micro tmdr 1.*] -Parent=Online Scanners -Browser=Trend Micro - -[Titanium 2005 (4.02.01)] -Parent=Online Scanners -Browser=Panda Antivirus Titanium - -[virus_detector*] -Parent=Online Scanners -Browser=Secure Computing Corporation - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Proxy Servers - -[Proxy Servers] -Parent=DefaultProperties -Browser=Proxy Servers -isBanned=true - -[*squid*] -Parent=Proxy Servers -Browser=Squid - -[Anonymisiert*] -Parent=Proxy Servers -Browser=Anonymizied - -[Anonymizer/*] -Parent=Proxy Servers -Browser=Anonymizer - -[Anonymizied*] -Parent=Proxy Servers -Browser=Anonymizied - -[Anonymous*] -Parent=Proxy Servers -Browser=Anonymous - -[Anonymous/*] -Parent=Proxy Servers -Browser=Anonymous - -[CE-Preload] -Parent=Proxy Servers -Browser=CE-Preload - -[http://Anonymouse.org/*] -Parent=Proxy Servers -Browser=Anonymouse - -[IE/6.01 (CP/M; 8-bit*)] -Parent=Proxy Servers -Browser=Squid - -[Mozilla/* (TuringOS; Turing Machine; 0.0)] -Parent=Proxy Servers -Browser=Anonymizer - -[Mozilla/4.0 (compatible; MSIE ?.0; SaferSurf*)] -Parent=Proxy Servers -Browser=SaferSurf - -[Mozilla/5.0 (compatible; del.icio.us-thumbnails/*; *) KHTML/* (like Gecko)] -Parent=Proxy Servers -Browser=Yahoo! -isBanned=true -Crawler=true - -[Nutscrape] -Parent=Proxy Servers -Browser=Squid - -[Nutscrape/* (CP/M; 8-bit*)] -Parent=Proxy Servers -Browser=Squid - -[Privoxy/*] -Parent=Proxy Servers -Browser=Privoxy - -[ProxyTester*] -Parent=Proxy Servers -Browser=ProxyTester -isBanned=true -Crawler=true - -[SilentSurf*] -Parent=Proxy Servers -Browser=SilentSurf - -[SmallProxy*] -Parent=Proxy Servers -Browser=SmallProxy - -[Space*Bison/*] -Parent=Proxy Servers -Browser=Proxomitron - -[Sqworm/*] -Parent=Proxy Servers -Browser=Websense - -[SurfControl] -Parent=Proxy Servers -Browser=SurfControl - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Research Projects - -[Research Projects] -Parent=DefaultProperties -Browser=Research Projects -isBanned=true -Crawler=true - -[*research*] -Parent=Research Projects - -[AcadiaUniversityWebCensusClient] -Parent=Research Projects -Browser=AcadiaUniversityWebCensusClient - -[Amico Alpha * (*) Gecko/* AmicoAlpha/*] -Parent=Research Projects -Browser=Amico Alpha - -[annotate_google; http://ponderer.org/*] -Parent=Research Projects -Browser=Annotate Google - -[CMS crawler (?http://buytaert.net/crawler/)] -Parent=Research Projects - -[e-SocietyRobot(http://www.yama.info.waseda.ac.jp/~yamana/es/)] -Parent=Research Projects -Browser=e-SocietyRobot - -[Forschungsportal/*] -Parent=Research Projects -Browser=Forschungsportal - -[Gulper Web *] -Parent=Research Projects -Browser=Gulper Web Bot - -[HooWWWer/*] -Parent=Research Projects -Browser=HooWWWer - -[http://buytaert.net/crawler] -Parent=Research Projects - -[inetbot/* (?http://www.inetbot.com/bot.html)] -Parent=Research Projects -Browser=inetbot - -[IRLbot/*] -Parent=Research Projects -Browser=IRLbot - -[Lachesis] -Parent=Research Projects -Browser=Lachesis - -[Mozilla/5.0 (compatible; nextthing.org/*)] -Parent=Research Projects -Browser=nextthing.org -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (compatible; Theophrastus/*)] -Parent=Research Projects -Browser=Theophrastus - -[Mozilla/5.0 (compatible; Webscan v0.*; http://otc.dyndns.org/webscan/)] -Parent=Research Projects -Browser=Webscan - -[MQbot*] -Parent=Research Projects -Browser=MQbot - -[OutfoxBot/*] -Parent=Research Projects -Browser=OutfoxBot - -[polybot?*] -Parent=Research Projects -Browser=Polybot - -[Shim?Crawler*] -Parent=Research Projects -Browser=Shim Crawler - -[Steeler/*] -Parent=Research Projects -Browser=Steeler - -[Taiga web spider] -Parent=Research Projects -Browser=Taiga - -[Theme Spider*] -Parent=Research Projects -Browser=Theme Spider - -[UofTDB_experiment* (leehyun@cs.toronto.edu)] -Parent=Research Projects -Browser=UofTDB Experiment - -[USyd-NLP-Spider*] -Parent=Research Projects -Browser=USyd-NLP-Spider - -[woriobot*] -Parent=Research Projects -Browser=woriobot - -[wwwster/* (Beta, mailto:gue@cis.uni-muenchen.de)] -Parent=Research Projects -Browser=wwwster -Beta=true - -[Zao-Crawler] -Parent=Research Projects -Browser=Zao-Crawler - -[Zao/*] -Parent=Research Projects -Browser=Zao - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Rippers - -[Rippers] -Parent=DefaultProperties -Browser=Rippers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*grub*] -Parent=Rippers -Browser=grub - -[*ickHTTP*] -Parent=Rippers -Browser=IP*Works - -[*java*] -Parent=Rippers - -[*libwww-perl*] -Parent=Rippers -Browser=libwww-perl - -[*WebGrabber*] -Parent=Rippers - -[*WinHttpRequest*] -Parent=Rippers -Browser=WinHttp - -[3D-FTP/*] -Parent=Rippers -Browser=3D-FTP - -[3wGet/*] -Parent=Rippers -Browser=3wGet - -[ActiveRefresh*] -Parent=Rippers -Browser=ActiveRefresh - -[Artera (Version *)] -Parent=Rippers -Browser=Artera - -[AutoHotkey] -Parent=Rippers -Browser=AutoHotkey - -[b2w/*] -Parent=Rippers -Browser=b2w - -[BasicHTTP/*] -Parent=Rippers -Browser=BasicHTTP - -[BlockNote.Net] -Parent=Rippers -Browser=BlockNote.Net - -[CAST] -Parent=Rippers -Browser=CAST - -[CFNetwork/*] -Parent=Rippers -Browser=CFNetwork - -[CFSCHEDULE*] -Parent=Rippers -Browser=ColdFusion Task Scheduler - -[CobWeb/*] -Parent=Rippers -Browser=CobWeb - -[ColdFusion*] -Parent=Rippers -Browser=ColdFusion - -[Crawl_Application] -Parent=Rippers -Browser=Crawl_Application - -[curl/*] -Parent=Rippers -Browser=cURL - -[Custo*] -Parent=Rippers -Browser=Custo - -[DataCha0s/*] -Parent=Rippers -Browser=DataCha0s - -[DeepIndexer*] -Parent=Rippers -Browser=DeepIndexer - -[DISCo Pump *] -Parent=Rippers -Browser=DISCo Pump - -[eStyleSearch * (compatible; MSIE 6.0; Windows NT 5.0)] -Parent=Rippers -Browser=eStyleSearch -Win32=true - -[ezic.com http agent *] -Parent=Rippers -Browser=Ezic.com - -[fetch libfetch/*] -Parent=Rippers - -[FGet*] -Parent=Rippers -Browser=FGet - -[Flaming AttackBot*] -Parent=Rippers -Browser=Flaming AttackBot - -[Foobot*] -Parent=Rippers -Browser=Foobot - -[GameSpyHTTP/*] -Parent=Rippers -Browser=GameSpyHTTP - -[gnome-vfs/*] -Parent=Rippers -Browser=gnome-vfs - -[Harvest/*] -Parent=Rippers -Browser=Harvest - -[hcat/*] -Parent=Rippers -Browser=hcat - -[HLoader] -Parent=Rippers -Browser=HLoader - -[Holmes/*] -Parent=Rippers -Browser=Holmes - -[HTMLParser/*] -Parent=Rippers -Browser=HTMLParser - -[http generic] -Parent=Rippers -Browser=http generic - -[httpclient*] -Parent=Rippers - -[httperf/*] -Parent=Rippers -Browser=httperf - -[HTTPFetch/*] -Parent=Rippers -Browser=HTTPFetch - -[HTTPGrab] -Parent=Rippers -Browser=HTTPGrab - -[HttpSession] -Parent=Rippers -Browser=HttpSession - -[httpunit/*] -Parent=Rippers -Browser=HttpUnit - -[ICE_GetFile] -Parent=Rippers -Browser=ICE_GetFile - -[iexplore.exe] -Parent=Rippers - -[Inet - Eureka App] -Parent=Rippers -Browser=Inet - Eureka App - -[INetURL/*] -Parent=Rippers -Browser=INetURL - -[InetURL:/*] -Parent=Rippers -Browser=InetURL - -[Internet Exploiter/*] -Parent=Rippers - -[Internet Explore *] -Parent=Rippers -Browser=Fake IE - -[Internet Explorer *] -Parent=Rippers -Browser=Fake IE - -[IP*Works!*/*] -Parent=Rippers -Browser=IP*Works! - -[IrssiUrlLog/*] -Parent=Rippers -Browser=IrssiUrlLog - -[JPluck/*] -Parent=Rippers -Browser=JPluck - -[Kapere (http://www.kapere.com)] -Parent=Rippers -Browser=Kapere - -[LeechFTP] -Parent=Rippers -Browser=LeechFTP - -[LeechGet*] -Parent=Rippers -Browser=LeechGet - -[libcurl-agent/*] -Parent=Rippers -Browser=libcurl - -[libWeb/clsHTTP*] -Parent=Rippers -Browser=libWeb/clsHTTP - -[lwp*] -Parent=Rippers - -[MFC_Tear_Sample] -Parent=Rippers -Browser=MFC_Tear_Sample - -[Moozilla] -Parent=Rippers -Browser=Moozilla - -[MovableType/*] -Parent=Rippers -Browser=MovableType Web Log - -[Mozilla/2.0 (compatible; NEWT ActiveX; Win32)] -Parent=Rippers -Browser=NEWT ActiveX -Platform=Win32 - -[Mozilla/3.0 (compatible)] -Parent=Rippers - -[Mozilla/3.0 (compatible; Indy Library)] -Parent=Rippers -Cookies=true - -[Mozilla/3.01 (compatible;)] -Parent=Rippers - -[Mozilla/4.0 (compatible; BorderManager*)] -Parent=Rippers -Browser=Novell BorderManager - -[Mozilla/4.0 (compatible;)] -Parent=Rippers - -[Mozilla/5.0 (compatible; IPCheck Server Monitor*)] -Parent=Rippers -Browser=IPCheck Server Monitor - -[OCN-SOC/*] -Parent=Rippers -Browser=OCN-SOC - -[Offline Explorer*] -Parent=Rippers -Browser=Offline Explorer - -[Open Web Analytics Bot*] -Parent=Rippers -Browser=Open Web Analytics Bot - -[OSSProxy*] -Parent=Rippers -Browser=OSSProxy - -[Pageload*] -Parent=Rippers -Browser=PageLoad - -[PageNest/*] -Parent=Rippers -Browser=PageNest - -[pavuk/*] -Parent=Rippers -Browser=Pavuk - -[PEAR HTTP_Request*] -Parent=Rippers -Browser=PEAR-PHP - -[PHP*] -Parent=Rippers -Browser=PHP - -[PigBlock (Windows NT 5.1; U)*] -Parent=Rippers -Browser=PigBlock -Win32=true - -[Pockey*] -Parent=Rippers -Browser=Pockey-GetHTML - -[POE-Component-Client-HTTP/*] -Parent=Rippers -Browser=POE-Component-Client-HTTP - -[PycURL/*] -Parent=Rippers -Browser=PycURL - -[Python*] -Parent=Rippers -Browser=Python - -[RepoMonkey*] -Parent=Rippers -Browser=RepoMonkey - -[SBL-BOT*] -Parent=Rippers -Browser=BlackWidow - -[ScoutAbout*] -Parent=Rippers -Browser=ScoutAbout - -[sherlock/*] -Parent=Rippers -Browser=Sherlock - -[SiteParser/*] -Parent=Rippers -Browser=SiteParser - -[SiteSnagger*] -Parent=Rippers -Browser=SiteSnagger - -[SiteSucker/*] -Parent=Rippers -Browser=SiteSucker - -[SiteWinder*] -Parent=Rippers -Browser=SiteWinder - -[Snoopy*] -Parent=Rippers -Browser=Snoopy - -[SOFTWING_TEAR_AGENT*] -Parent=Rippers -Browser=AspTear - -[SuperHTTP/*] -Parent=Rippers -Browser=SuperHTTP - -[Tcl http client package*] -Parent=Rippers -Browser=Tcl http client package - -[Twisted PageGetter] -Parent=Rippers -Browser=Twisted PageGetter - -[URL2File/*] -Parent=Rippers -Browser=URL2File - -[UtilMind HTTPGet] -Parent=Rippers -Browser=UtilMind HTTPGet - -[VCI WebViewer*] -Parent=Rippers -Browser=VCI WebViewer - -[W3CRobot/*] -Parent=Rippers -Browser=W3CRobot - -[Web Downloader*] -Parent=Rippers -Browser=Web Downloader - -[Web Downloader/*] -Parent=Rippers -Browser=Web Downloader - -[Web Magnet*] -Parent=Rippers -Browser=Web Magnet - -[WebAuto/*] -Parent=Rippers - -[webbandit/*] -Parent=Rippers -Browser=webbandit - -[WebCopier*] -Parent=Rippers -Browser=WebCopier - -[WebDownloader*] -Parent=Rippers -Browser=WebDownloader - -[WebFetch] -Parent=Rippers -Browser=WebFetch - -[webfetch/*] -Parent=Rippers -Browser=WebFetch - -[WebGatherer*] -Parent=Rippers -Browser=WebGatherer - -[WebGet] -Parent=Rippers -Browser=WebGet - -[WebReaper*] -Parent=Rippers -Browser=WebReaper - -[WebRipper] -Parent=Rippers -Browser=WebRipper - -[WebSauger*] -Parent=Rippers -Browser=WebSauger - -[Website Downloader*] -Parent=Rippers -Browser=Website Downloader - -[Website eXtractor*] -Parent=Rippers -Browser=Website eXtractor - -[Website Quester] -Parent=Rippers -Browser=Website Quester - -[WebsiteExtractor*] -Parent=Rippers -Browser=Website eXtractor - -[WebSnatcher*] -Parent=Rippers -Browser=WebSnatcher - -[Webster Pro*] -Parent=Rippers -Browser=Webster Pro - -[WebStripper*] -Parent=Rippers -Browser=WebStripper - -[WebWhacker*] -Parent=Rippers -Browser=WebWhacker - -[WinScripter iNet Tools] -Parent=Rippers -Browser=WinScripter iNet Tools - -[WWW-Mechanize/*] -Parent=Rippers -Browser=WWW-Mechanize - -[Zend_Http_Client] -Parent=Rippers -Browser=Zend_Http_Client - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Site Monitors - -[Site Monitors] -Parent=DefaultProperties -Browser=Site Monitors -Cookies=true -isBanned=true -Crawler=true - -[*EasyRider*] -Parent=Site Monitors -Browser=EasyRider - -[*maxamine.com--robot*] -Parent=Site Monitors -Browser=maxamine.com--robot -isBanned=true - -[*WebMon ?.*] -Parent=Site Monitors -Browser=WebMon - -[Kenjin Spider*] -Parent=Site Monitors -Browser=Kenjin Spider - -[Kevin http://*] -Parent=Site Monitors -Browser=Kevin -isBanned=true - -[Mozilla/4.0 (compatible; ChangeDetection/*] -Parent=Site Monitors -Browser=ChangeDetection - -[Myst Monitor Service v*] -Parent=Site Monitors -Browser=Myst Monitor Service - -[Net Probe] -Parent=Site Monitors -Browser=Net Probe - -[NetMechanic*] -Parent=Site Monitors -Browser=NetMechanic - -[NetReality*] -Parent=Site Monitors -Browser=NetReality - -[Pingdom GIGRIB*] -Parent=Site Monitors -Browser=Pingdom - -[Site Valet Online*] -Parent=Site Monitors -Browser=Site Valet -isBanned=true - -[SITECHECKER] -Parent=Site Monitors -Browser=SITECHECKER - -[sitemonitor@dnsvr.com/*] -Parent=Site Monitors -Browser=ZoneEdit Failover Monitor -isBanned=false - -[UpTime Checker*] -Parent=Site Monitors -Browser=UpTime Checker - -[URL Control*] -Parent=Site Monitors -Browser=URL Control - -[URL_Access/*] -Parent=Site Monitors - -[URLCHECK] -Parent=Site Monitors -Browser=URLCHECK - -[URLy Warning*] -Parent=Site Monitors -Browser=URLy Warning - -[Webcheck *] -Parent=Site Monitors -Browser=Webcheck -Version=1.0 -MajorVer=1 -MinorVer=0 - -[WebPatrol/*] -Parent=Site Monitors -Browser=WebPatrol - -[websitepulse checker/*] -Parent=Site Monitors -Browser=websitepulse checker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Social Bookmarkers - -[Social Bookmarkers] -Parent=DefaultProperties -Browser=Social Bookmarkers -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[BookmarkBase(2/;http://bookmarkbase.com)] -Parent=Social Bookmarkers -Browser=BookmarkBase - -[Cocoal.icio.us/1.0 (v43) (Mac OS X; http://www.scifihifi.com/cocoalicious)] -Parent=Social Bookmarkers -Browser=Cocoalicious - -[Mozilla/5.0 (compatible; FriendFeedBot/0.*; Http://friendfeed.com/about/bot)] -Parent=Social Bookmarkers -Browser=FriendFeedBot - -[Twitturly*] -Parent=Social Bookmarkers -Browser=Twitturly - -[WinkBot/*] -Parent=Social Bookmarkers -Browser=WinkBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Translators - -[Translators] -Parent=DefaultProperties -Browser=Translators -Frames=true -Tables=true -Cookies=true - -[Seram Server] -Parent=Translators -Browser=Seram Server - -[TeragramWebcrawler/*] -Parent=Translators -Browser=TeragramWebcrawler -Version=1.0 -MajorVer=1 -MinorVer=0 - -[WebIndexer/* (Web Indexer; *)] -Parent=Translators -Browser=WorldLingo - -[WebTrans] -Parent=Translators -Browser=WebTrans - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Version Checkers - -[Version Checkers] -Parent=DefaultProperties -Browser=Version Checkers -Crawler=true - -[Automated Browscap.ini Updater. To report issues contact us at http://www.skycomp.ca] -Parent=Version Checkers -Browser=Automated Browscap.ini Updater - -[BMC Link Validator (http://www.briansmodelcars.com/links/)] -Parent=Version Checkers -Browser=BMC Link Validator -MajorVer=1 -MinorVer=0 -Platform=Win2000 - -[Browscap updater] -Parent=Version Checkers -Browser=Browscap updater - -[BrowscapUpdater1.0] -Parent=Version Checkers - -[Browser Capabilities Project (http://browsers.garykeith.com; http://browsers.garykeith.com/sitemail/contact-me.asp)] -Parent=Version Checkers -Browser=Gary Keith's Version Checker - -[Browser Capabilities Project AutoDownloader] -Parent=Version Checkers -Browser=TKC AutoDownloader - -[browsers.garykeith.com browscap.ini bot BETA] -Parent=Version Checkers - -[Code Sample Web Client] -Parent=Version Checkers -Browser=Code Sample Web Client - -[Desktop Sidebar*] -Parent=Version Checkers -Browser=Desktop Sidebar -isBanned=true - -[Mono Browser Capabilities Updater*] -Parent=Version Checkers -Browser=Mono Browser Capabilities Updater -isBanned=true - -[Rewmi/*] -Parent=Version Checkers -isBanned=true - -[Subtext Version 1.9* - http://subtextproject.com/ (Microsoft Windows NT 5.2.*)] -Parent=Version Checkers -Browser=Subtext - -[TherapeuticResearch] -Parent=Version Checkers -Browser=TherapeuticResearch - -[UpdateBrowscap*] -Parent=Version Checkers -Browser=UpdateBrowscap - -[www.garykeith.com browscap.ini bot*] -Parent=Version Checkers -Browser=clarkson.edu - -[www.substancia.com AutoHTTPAgent (ver *)] -Parent=Version Checkers -Browser=Substância - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Become - -[Become] -Parent=DefaultProperties -Browser=Become -Frames=true -Tables=true -isSyndicationReader=true -Crawler=true - -[*BecomeBot/*] -Parent=Become -Browser=BecomeBot - -[*BecomeBot@exava.com*] -Parent=Become -Browser=BecomeBot - -[*Exabot@exava.com*] -Parent=Become -Browser=Exabot - -[MonkeyCrawl/*] -Parent=Become -Browser=MonkeyCrawl - -[Mozilla/5.0 (compatible; BecomeJPBot/2.3; *)] -Parent=Become -Browser=BecomeJPBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Blue Coat Systems - -[Blue Coat Systems] -Parent=DefaultProperties -Browser=Blue Coat Systems -isBanned=true -Crawler=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Browscap Abusers - -[Browscap Abusers] -Parent=DefaultProperties -Browser=Browscap Abusers -isBanned=true - -[Apple-PubSub/*] -Parent=Browscap Abusers -Browser=Apple-PubSub - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FeedHub - -[FeedHub] -Parent=DefaultProperties -Browser=FeedHub -isSyndicationReader=true - -[FeedHub FeedDiscovery/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub FeedDiscovery -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedHub FeedFetcher/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub FeedFetcher -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedHub MetaDataFetcher/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub MetaDataFetcher -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Internet Content Rating Association] -Parent=DefaultProperties -Browser= -Frames=true -IFrames=true -Tables=true -Cookies=true -Crawler=true - -[ICRA_label_generator/1.?] -Parent=Internet Content Rating Association -Browser=ICRA_label_generator - -[ICRA_Semantic_spider/0.?] -Parent=Internet Content Rating Association -Browser=ICRA_Semantic_spider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NameProtect - -[NameProtect] -Parent=DefaultProperties -Browser=NameProtect -isBanned=true -Crawler=true - -[abot/*] -Parent=NameProtect -Browser=NameProtect - -[NP/*] -Parent=NameProtect -Browser=NameProtect - -[NPBot*] -Parent=NameProtect -Browser=NameProtect - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netcraft - -[Netcraft] -Parent=DefaultProperties -Browser=Netcraft -isBanned=true -Crawler=true - -[*Netcraft Web Server Survey*] -Parent=Netcraft -Browser=Netcraft Webserver Survey -isBanned=true - -[Mozilla/5.0 (compatible; NetcraftSurveyAgent/1.0; info@netcraft.com)] -Parent=Netcraft -Browser=NetcraftSurveyAgent - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NewsGator - -[NewsGator] -Parent=DefaultProperties -Browser=NewsGator -isSyndicationReader=true - -[MarsEdit*] -Parent=NewsGator -Browser=MarsEdit - -[NetNewsWire*/*] -Parent=NewsGator -Browser=NetNewsWire -Platform=MacOSX - -[NewsFire/*] -Parent=NewsGator -Browser=NewsFire - -[NewsGator FetchLinks extension/*] -Parent=NewsGator -Browser=NewsGator FetchLinks - -[NewsGator/*] -Parent=NewsGator -Browser=NewsGator -isBanned=true - -[NewsGatorOnline/*] -Parent=NewsGator -Browser=NewsGatorOnline - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.2 - -[Chrome 0.2] -Parent=DefaultProperties -Browser=Chrome -Version=0.2 -MinorVer=2 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.3 - -[Chrome 0.3] -Parent=DefaultProperties -Browser=Chrome -Version=0.3 -MinorVer=3 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.4 - -[Chrome 0.4] -Parent=DefaultProperties -Browser=Chrome -Version=0.4 -MinorVer=4 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.5 - -[Chrome 0.5] -Parent=DefaultProperties -Browser=Chrome -Version=0.5 -MinorVer=5 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 1.0 - -[Chrome 1.0] -Parent=DefaultProperties -Browser=Chrome -Version=1.0 -MajorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 2.0 - -[Chrome 2.0] -Parent=DefaultProperties -Browser=Chrome -Version=2.0 -MajorVer=2 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 3.0 - -[Chrome 3.0] -Parent=DefaultProperties -Browser=Chrome -Version=3.0 -MajorVer=3 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google Code - -[Google Code] -Parent=DefaultProperties -Browser=Google Code -Tables=true -Cookies=true -JavaApplets=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.2 - -[Iron 0.2] -Parent=DefaultProperties -Browser=Iron -Version=0.2 -MinorVer=2 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.3 - -[Iron 0.3] -Parent=DefaultProperties -Browser=Iron -Version=0.3 -MinorVer=3 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.4 - -[Iron 0.4] -Parent=DefaultProperties -Browser=Iron -Version=0.4 -MinorVer=4 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iPod - -[iPod] -Parent=DefaultProperties -Browser=iPod -Platform=iPhone OSX -isMobileDevice=true - -[Mozilla/5.0 (iPod; U; *Mac OS X; *) AppleWebKit/* (*) Version/3.0 Mobile/* Safari/*] -Parent=iPod -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX - -[Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2 like Mac OS X; en-us) AppleWebKit/* (KHTML, like Gecko) Mobile/*] -Parent=iPod - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iTunes - -[iTunes] -Parent=DefaultProperties -Browser=iTunes -Platform=iPhone OSX - -[iTunes/* (Windows; ?)] -Parent=iTunes -Browser=iTunes -Platform=Win32 -Win32=true - -[MOT-* iTunes/* MIB/* Profile/MIDP-* Configuration/CLDC-* UP.Link/*] -Parent=iTunes - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Media Players - -[Media Players] -Parent=DefaultProperties -Browser=Media Players -Cookies=true - -[Microsoft NetShow(TM) Player with RealVideo(R)] -Parent=Media Players -Browser=Microsoft NetShow - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; *) AppleWebKit/* RealPlayer] -Parent=Media Players -Browser=RealPlayer -Platform=MacOSX - -[MPlayer 0.9*] -Parent=Media Players -Browser=MPlayer -Version=0.9 -MajorVer=0 -MinorVer=9 - -[MPlayer 1.*] -Parent=Media Players -Browser=MPlayer -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MPlayer HEAD CVS] -Parent=Media Players -Browser=MPlayer - -[RealPlayer*] -Parent=Media Players -Browser=RealPlayer - -[RMA/*] -Parent=Media Players -Browser=RMA - -[VLC media player*] -Parent=Media Players -Browser=VLC - -[vobsub] -Parent=Media Players -Browser=vobsub -isBanned=true - -[WinampMPEG/*] -Parent=Media Players -Browser=WinAmp - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nintendo - -[Nintendo Wii] -Parent=DefaultProperties -Browser= -isMobileDevice=true - -[Opera/* (Nintendo DSi; Opera/*; *; *)] -Parent=Nintendo Wii -Browser=DSi - -[Opera/* (Nintendo Wii; U; *)] -Parent=Nintendo Wii -Browser=Wii - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Windows Media Player - -[Windows Media Player] -Parent=DefaultProperties -Browser=Windows Media Player -Cookies=true - -[NSPlayer/10.*] -Parent=Windows Media Player -Version=10.0 -MajorVer=10 -MinorVer=0 - -[NSPlayer/11.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=11.0 -MajorVer=11 -MinorVer=0 - -[NSPlayer/4.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=4.0 -MajorVer=4 -MinorVer=0 - -[NSPlayer/7.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=7.0 -MajorVer=7 -MinorVer=0 - -[NSPlayer/8.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=8.0 -MajorVer=8 -MinorVer=0 - -[NSPlayer/9.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=9.0 -MajorVer=9 -MinorVer=0 - -[Windows-Media-Player/10.*] -Parent=Windows Media Player -Browser=Windows-Media-Player -Version=10.0 -MajorVer=10 -MinorVer=0 -Win32=true - -[Windows-Media-Player/11.*] -Parent=Windows Media Player -Version=11.0 -MajorVer=11 -MinorVer=0 -Win32=true - -[Windows-Media-Player/7.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=7.0 -MajorVer=7 -MinorVer=0 -Win32=true - -[Windows-Media-Player/8.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=8.0 -MajorVer=8 -MinorVer=0 -Win32=true - -[Windows-Media-Player/9.*] -Parent=Windows Media Player -Version=9.0 -MajorVer=9 -MinorVer=0 -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Zune - -[Zune] -Parent=DefaultProperties -Browser=Zune -Cookies=true - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 2.0*)*] -Parent=Zune -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 2.5*)*] -Parent=Zune -Version=2.5 -MajorVer=2 -MinorVer=5 - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 3.0*)*] -Parent=Zune -Version=3.0 -MajorVer=3 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.0 - -[QuickTime 7.0] -Parent=DefaultProperties -Browser=QuickTime -Version=7.0 -MajorVer=7 -Cookies=true - -[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.0 -Platform=MacOSX - -[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.0 -Platform=MacPPC - -[QuickTime (qtver=7.0*;os=Windows 95*)] -Parent=QuickTime 7.0 -Platform=Win95 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows 98*)] -Parent=QuickTime 7.0 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows Me*)] -Parent=QuickTime 7.0 -Platform=WinME -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 4.0*)] -Parent=QuickTime 7.0 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.0*)] -Parent=QuickTime 7.0 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.1*)] -Parent=QuickTime 7.0 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.2*)] -Parent=QuickTime 7.0 -Platform=Win2003 -Win32=true - -[QuickTime/7.0.* (qtver=7.0.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.0 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.1 - -[QuickTime 7.1] -Parent=DefaultProperties -Browser=QuickTime -Version=7.1 -MajorVer=7 -MinorVer=1 -Cookies=true - -[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.1 -Platform=MacOSX - -[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.1 -Platform=MacPPC - -[QuickTime (qtver=7.1*;os=Windows 98*)] -Parent=QuickTime 7.1 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 4.0*)] -Parent=QuickTime 7.1 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.0*)] -Parent=QuickTime 7.1 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.1*)] -Parent=QuickTime 7.1 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.2*)] -Parent=QuickTime 7.1 -Platform=Win2003 -Win32=true - -[QuickTime/7.1.* (qtver=7.1.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.1 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.2 - -[QuickTime 7.2] -Parent=DefaultProperties -Browser=QuickTime -Version=7.2 -MajorVer=7 -MinorVer=2 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.2*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.2 -Platform=MacOSX - -[QuickTime (qtver=7.2*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.2 -Platform=MacPPC - -[QuickTime (qtver=7.2*;os=Windows 98*)] -Parent=QuickTime 7.2 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 4.0*)] -Parent=QuickTime 7.2 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.0*)] -Parent=QuickTime 7.2 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.1*)] -Parent=QuickTime 7.2 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.2*)] -Parent=QuickTime 7.2 -Platform=Win2003 -Win32=true - -[QuickTime/7.2.* (qtver=7.2.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.2 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.3 - -[QuickTime 7.3] -Parent=DefaultProperties -Browser=QuickTime -Version=7.3 -MajorVer=7 -MinorVer=3 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.3*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.3 -Platform=MacOSX - -[QuickTime (qtver=7.3*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.3 -Platform=MacPPC - -[QuickTime (qtver=7.3*;os=Windows 98*)] -Parent=QuickTime 7.3 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 4.0*)] -Parent=QuickTime 7.3 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.0*)] -Parent=QuickTime 7.3 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.1*)] -Parent=QuickTime 7.3 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.2*)] -Parent=QuickTime 7.3 -Platform=Win2003 -Win32=true - -[QuickTime/7.3.* (qtver=7.3.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.3 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.4 - -[QuickTime 7.4] -Parent=DefaultProperties -Browser=QuickTime -Version=7.4 -MajorVer=7 -MinorVer=4 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.4*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.4 -Platform=MacOSX - -[QuickTime (qtver=7.4*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.4 -Platform=MacPPC - -[QuickTime (qtver=7.4*;os=Windows 98*)] -Parent=QuickTime 7.4 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 4.0*)] -Parent=QuickTime 7.4 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.0*)] -Parent=QuickTime 7.4 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.1*)] -Parent=QuickTime 7.4 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.2*)] -Parent=QuickTime 7.4 -Platform=Win2003 -Win32=true - -[QuickTime/7.4.* (qtver=7.4.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.4 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google Android - -[Android] -Parent=DefaultProperties -Browser=Android -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[Mozilla/5.0 (Linux; U; Android *; *) AppleWebKit/* (KHTML, like Gecko) Safari/*] -Parent=Android -Browser=Android -Platform=Linux -isMobileDevice=true - -[Mozilla/5.0 (Linux; U; Android *; *) AppleWebKit/* (KHTML, like Gecko) Version/3.0.* Mobile Safari/*] -Parent=Android -Browser=Android -Platform=Linux -isMobileDevice=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BlackBerry - -[BlackBerry] -Parent=DefaultProperties -Browser=BlackBerry -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[*BlackBerry*] -Parent=BlackBerry - -[*BlackBerrySimulator/*] -Parent=BlackBerry - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Handspring Blazer - -[Blazer] -Parent=DefaultProperties -Browser=Handspring Blazer -Platform=Palm -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 95; PalmSource; Blazer 3.0) 16;160x160] -Parent=Blazer -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.0) 16;320x448] -Parent=Blazer -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.1) 16;320x320] -Parent=Blazer -Version=4.1 -MajorVer=4 -MinorVer=1 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.2) 16;320x320] -Parent=Blazer -Version=4.2 -MajorVer=4 -MinorVer=2 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.4) 16;320x320] -Parent=Blazer -Version=4.4 -MajorVer=4 -MinorVer=4 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.5) 16;320x320] -Parent=Blazer -Version=4.5 -MajorVer=4 -MinorVer=5 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DoCoMo - -[DoCoMo] -Parent=DefaultProperties -Browser=DoCoMo -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[DoCoMo/1.0*] -Parent=DoCoMo -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WAP - -[DoCoMo/2.0*] -Parent=DoCoMo -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=WAP - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IEMobile - -[IEMobile] -Parent=DefaultProperties -Browser=IEMobile -Platform=WinCE -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -VBScript=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.*)*] -Parent=IEMobile -Version=6.0 -MajorVer=6 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.*)*] -Parent=IEMobile -Version=7.0 -MajorVer=7 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iPhone - -[iPhone] -Parent=DefaultProperties -Browser=iPhone -Platform=iPhone OSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -isMobileDevice=true -CssVersion=3 -supportsCSS=true - -[Mozilla/4.0 (iPhone; *)] -Parent=iPhone - -[Mozilla/4.0 (iPhone; U; CPU like Mac OS X; *)] -Parent=iPhone - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_0_1 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_1 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko)] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0_2 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_1 like Mac OS X; *)*] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_2_1 like Mac OS X; *)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.0 Mobile/* Safari/*] -Parent=iPhone -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/5.0 (iPod; U; *Mac OS X; *) AppleWebKit/* (*) Version/* Mobile/*] -Parent=iPhone -Browser=iTouch - -[Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2* like Mac OS X; *)*] -Parent=iPhone -Browser=iTouch -Version=2.2 -MajorVer=2 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KDDI - -[KDDI] -Parent=DefaultProperties -Browser=KDDI -Frames=true -Tables=true -Cookies=true -BackgroundSounds=true -VBScript=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[KDDI-* UP.Browser/* (GUI) MMP/*] -Parent=KDDI - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Miscellaneous Mobile - -[Miscellaneous Mobile] -Parent=DefaultProperties -Browser= -IFrames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; *; CentOS; *) AppleWebKit/* (KHTML, like Gecko) Bolt/0.* Version/3.0 Safari/*] -Parent=Miscellaneous Mobile -Browser=Bolt - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Motorola Internet Browser - -[Motorola Internet Browser] -Parent=DefaultProperties -Browser=Motorola Internet Browser -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[MOT-*/*] -Parent=Motorola Internet Browser - -[MOT-1*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-8700_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-0A/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-2B/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-88/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-C???/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-GATW_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-L6/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-L7/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-M*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-MP*/* Mozilla/* (compatible; MSIE *; Windows CE; *)] -Parent=Motorola Internet Browser -Win32=true - -[MOT-MP*/* Mozilla/4.0 (compatible; MSIE *; Windows CE; *)] -Parent=Motorola Internet Browser -Win32=true - -[MOT-SAP4_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-T*/*] -Parent=Motorola Internet Browser - -[MOT-T7*/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-T721*] -Parent=Motorola Internet Browser - -[MOT-TA02/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V*/*] -Parent=Motorola Internet Browser - -[MOT-V*/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-V3/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V4*/* MIB/*] -Parent=Motorola Internet Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN Mobile Proxy - -[MSN Mobile Proxy] -Parent=DefaultProperties -Browser=MSN Mobile Proxy -Win32=true -Frames=true -Tables=true -Cookies=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true - -[Mozilla/* (compatible; MSIE *; Windows*; MSN Mobile Proxy)] -Parent=MSN Mobile Proxy - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetFront - -[NetFront] -Parent=DefaultProperties -Browser=NetFront -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[*NetFront/*] -Parent=NetFront - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nokia - -[Nokia] -Parent=DefaultProperties -Browser=Nokia -Tables=true -Cookies=true -isMobileDevice=true - -[*Nokia*/*] -Parent=Nokia - -[Mozilla/* (SymbianOS/*; ?; *) AppleWebKit/* (KHTML, like Gecko) Safari/*] -Parent=Nokia -Platform=SymbianOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Openwave Mobile Browser - -[Openwave Mobile Browser] -Parent=DefaultProperties -Browser=Openwave Mobile Browser -Alpha=true -Win32=true -Win64=true -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[*UP.Browser/*] -Parent=Openwave Mobile Browser - -[*UP.Link/*] -Parent=Openwave Mobile Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera Mini - -[Opera Mini] -Parent=DefaultProperties -Browser=Opera Mini -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[Opera/* (J2ME/MIDP; Opera Mini/1.0*)*] -Parent=Opera Mini -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/1.1*)*] -Parent=Opera Mini -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/1.2*)*] -Parent=Opera Mini -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Opera/* (J2ME/MIDP; Opera Mini/2.0*)*] -Parent=Opera Mini -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/3.0*)*] -Parent=Opera Mini -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/3.1*)*] -Parent=Opera Mini -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/4.0*)*] -Parent=Opera Mini -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/4.1*)*] -Parent=Opera Mini -Version=4.1 -MajorVer=4 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/4.2*)*] -Parent=Opera Mini -Version=4.2 -MajorVer=4 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera Mobile - -[Opera Mobile] -Parent=DefaultProperties -Browser=Opera Mobi -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Opera/9.5 (Microsoft Windows; PPC; *Opera Mobile/*)] -Parent=Opera Mobile -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Opera/9.5 (Microsoft Windows; PPC; Opera Mobi/*)] -Parent=Opera Mobile -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Opera/9.51 Beta (Microsoft Windows; PPC; Opera Mobi/*)*] -Parent=Opera Mobile -Version=9.51 -MajorVer=9 -MinorVer=51 -Beta=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Playstation - -[Playstation] -Parent=DefaultProperties -Browser=Playstation -Platform=WAP -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Mozilla/* (PLAYSTATION *; *)] -Parent=Playstation -Browser=PlayStation 3 -Frames=false - -[Mozilla/* (PSP (PlayStation Portable); *)] -Parent=Playstation - -[Sony PS2 (Linux)] -Parent=Playstation -Browser=Sony PS2 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Pocket PC - -[Pocket PC] -Parent=DefaultProperties -Browser=Pocket PC -Platform=WinCE -Win32=true -Frames=true -Tables=true -Cookies=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*(compatible; MSIE *.*; Windows CE; PPC; *)] -Parent=Pocket PC - -[HTC-*/* Mozilla/* (compatible; MSIE *.*; Windows CE*)*] -Parent=Pocket PC -Win32=true - -[Mozilla/* (compatible; MSPIE *.*; *Windows CE*)*] -Parent=Pocket PC -Win32=true - -[T-Mobile* Mozilla/* (compatible; MSIE *.*; Windows CE; *)] -Parent=Pocket PC - -[Vodafone* Mozilla/* (compatible; MSIE *.*; Windows CE; *)*] -Parent=Pocket PC - -[Windows CE (Pocket PC) - Version *.*] -Parent=Pocket PC -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SEMC Browser - -[SEMC Browser] -Parent=DefaultProperties -Browser=SEMC Browser -Platform=JAVA -Tables=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*SEMC-Browser/*] -Parent=SEMC Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SonyEricsson - -[SonyEricsson] -Parent=DefaultProperties -Browser=SonyEricsson -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*Ericsson*] -Parent=SonyEricsson - -[*SonyEricsson*] -Parent=SonyEricsson - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netbox - -[Netbox] -Parent=DefaultProperties -Browser=Netbox -Frames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/3.01 (compatible; Netbox/*; Linux*)] -Parent=Netbox -Browser=Netbox -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PowerTV - -[PowerTV] -Parent=DefaultProperties -Browser=PowerTV -Platform=PowerTV -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/4.0 PowerTV/1.5 (Compatible; Spyglass DM 3.2.1, EXPLORER)] -Parent=PowerTV -Version=1.5 -MajorVer=1 -MinorVer=5 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WebTV/MSNTV - -[WebTV] -Parent=DefaultProperties -Browser=WebTV/MSNTV -Platform=WebTV -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/3.0 WebTV/1.*(compatible; MSIE 2.0)] -Parent=WebTV -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/4.0 WebTV/2.0*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/4.0 WebTV/2.1*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/4.0 WebTV/2.2*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Mozilla/4.0 WebTV/2.3*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.3 -MajorVer=2 -MinorVer=3 - -[Mozilla/4.0 WebTV/2.4*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.4 -MajorVer=2 -MinorVer=4 - -[Mozilla/4.0 WebTV/2.5*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.5 -MajorVer=2 -MinorVer=5 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.6*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.6 -MajorVer=2 -MinorVer=6 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.7*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.7 -MajorVer=2 -MinorVer=7 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.8*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.8 -MajorVer=2 -MinorVer=8 -JavaApplets=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.9*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.9 -MajorVer=2 -MinorVer=9 -JavaApplets=true -CssVersion=1 -supportsCSS=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Amaya - -[Amaya] -Parent=DefaultProperties -Browser=Amaya -Tables=true -Cookies=true - -[amaya/7.*] -Parent=Amaya -Version=7.0 -MajorVer=7 -MinorVer=0 - -[amaya/8.0*] -Parent=Amaya -Version=8.0 -MajorVer=8 -MinorVer=0 -CssVersion=2 -supportsCSS=true - -[amaya/8.1*] -Parent=Amaya -Version=8.1 -MajorVer=8 -MinorVer=1 -CssVersion=2 -supportsCSS=true - -[amaya/8.2*] -Parent=Amaya -Version=8.2 -MajorVer=8 -MinorVer=2 -CssVersion=2 -supportsCSS=true - -[amaya/8.3*] -Parent=Amaya -Version=8.3 -MajorVer=8 -MinorVer=3 -CssVersion=2 -supportsCSS=true - -[amaya/8.4*] -Parent=Amaya -Version=8.4 -MajorVer=8 -MinorVer=4 -CssVersion=2 -supportsCSS=true - -[amaya/8.5*] -Parent=Amaya -Version=8.5 -MajorVer=8 -MinorVer=5 -CssVersion=2 -supportsCSS=true - -[amaya/8.6*] -Parent=Amaya -Version=8.6 -MajorVer=8 -MinorVer=6 -CssVersion=2 -supportsCSS=true - -[amaya/8.7*] -Parent=Amaya -Version=8.7 -MajorVer=8 -MinorVer=7 -CssVersion=2 -supportsCSS=true - -[amaya/8.8*] -Parent=Amaya -Version=8.8 -MajorVer=8 -MinorVer=8 -CssVersion=2 -supportsCSS=true - -[amaya/8.9*] -Parent=Amaya -Version=8.9 -MajorVer=8 -MinorVer=9 -CssVersion=2 -supportsCSS=true - -[amaya/9.0*] -Parent=Amaya -Version=9.0 -MajorVer=8 -MinorVer=0 -CssVersion=2 -supportsCSS=true - -[amaya/9.1*] -Parent=Amaya -Version=9.1 -MajorVer=9 -MinorVer=1 -CssVersion=2 -supportsCSS=true - -[amaya/9.2*] -Parent=Amaya -Version=9.2 -MajorVer=9 -MinorVer=2 -CssVersion=2 -supportsCSS=true - -[amaya/9.3*] -Parent=Amaya -Version=9.3 -MajorVer=9 -MinorVer=3 - -[amaya/9.4*] -Parent=Amaya -Version=9.4 -MajorVer=9 -MinorVer=4 - -[amaya/9.5*] -Parent=Amaya -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Emacs-w3m/*] -Parent=Emacs/W3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Links - -[Links] -Parent=DefaultProperties -Browser=Links -Frames=true -Tables=true - -[Links (0.9*; CYGWIN_NT-5.1*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=WinXP - -[Links (0.9*; Darwin*)] -Parent=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=MacPPC - -[Links (0.9*; FreeBSD*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=FreeBSD - -[Links (0.9*; Linux*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Linux - -[Links (0.9*; OS/2*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=OS/2 - -[Links (0.9*; Unix*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Unix - -[Links (0.9*; Win32*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Win32 -Win32=true - -[Links (1.0*; CYGWIN_NT-5.1*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP - -[Links (1.0*; FreeBSD*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=FreeBSD - -[Links (1.0*; Linux*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Linux - -[Links (1.0*; OS/2*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=OS/2 - -[Links (1.0*; Unix*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Unix - -[Links (1.0*; Win32*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win32 -Win32=true - -[Links (2.0*; Linux*)] -Parent=Links -Browser=Links -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Linux - -[Links (2.1*; FreeBSD*)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=FreeBSD - -[Links (2.1*; Linux *)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=Linux - -[Links (2.1*; OpenBSD*)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=OpenBSD - -[Links (2.2*; FreeBSD*)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=FreeBSD - -[Links (2.2*; Linux *)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=Linux - -[Links (2.2*; OpenBSD*)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=OpenBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lynx - -[Lynx] -Parent=DefaultProperties -Browser=Lynx -Frames=true -Tables=true - -[Lynx *] -Parent=Lynx -Browser=Lynx - -[Lynx/2.3*] -Parent=Lynx -Browser=Lynx -Version=2.3 -MajorVer=2 -MinorVer=3 - -[Lynx/2.4*] -Parent=Lynx -Browser=Lynx -Version=2.4 -MajorVer=2 -MinorVer=4 - -[Lynx/2.5*] -Parent=Lynx -Browser=Lynx -Version=2.5 -MajorVer=2 -MinorVer=5 - -[Lynx/2.6*] -Parent=Lynx -Browser=Lynx -Version=2.6 -MajorVer=2 -MinorVer=6 - -[Lynx/2.7*] -Parent=Lynx -Browser=Lynx -Version=2.7 -MajorVer=2 -MinorVer=7 - -[Lynx/2.8*] -Parent=Lynx -Browser=Lynx -Version=2.8 -MajorVer=2 -MinorVer=8 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NCSA Mosaic - -[Mosaic] -Parent=DefaultProperties -Browser=Mosaic - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; w3m - -[w3m] -Parent=DefaultProperties -Browser=w3m -Frames=true -Tables=true - -[w3m/0.1*] -Parent=w3m -Browser=w3m -Version=0.1 -MajorVer=0 -MinorVer=1 - -[w3m/0.2*] -Parent=w3m -Browser=w3m -Version=0.2 -MajorVer=0 -MinorVer=2 - -[w3m/0.3*] -Parent=w3m -Browser=w3m -Version=0.3 -MajorVer=0 -MinorVer=3 - -[w3m/0.4*] -Parent=w3m -Browser=w3m -Version=0.4 -MajorVer=0 -MinorVer=4 -Cookies=true - -[w3m/0.5*] -Parent=w3m -Browser=w3m -Version=0.5 -MajorVer=0 -MinorVer=5 -Cookies=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.10 - -[ELinks 0.10] -Parent=DefaultProperties -Browser=ELinks -Version=0.10 -MinorVer=10 -Frames=true -Tables=true - -[ELinks (0.10*; *AIX*)] -Parent=ELinks 0.10 -Platform=AIX - -[ELinks (0.10*; *BeOS*)] -Parent=ELinks 0.10 -Platform=BeOS - -[ELinks (0.10*; *CygWin*)] -Parent=ELinks 0.10 -Platform=CygWin - -[ELinks (0.10*; *Darwin*)] -Parent=ELinks 0.10 -Platform=Darwin - -[ELinks (0.10*; *Digital Unix*)] -Parent=ELinks 0.10 -Platform=Digital Unix - -[ELinks (0.10*; *FreeBSD*)] -Parent=ELinks 0.10 -Platform=FreeBSD - -[ELinks (0.10*; *HPUX*)] -Parent=ELinks 0.10 -Platform=HP-UX - -[ELinks (0.10*; *IRIX*)] -Parent=ELinks 0.10 -Platform=IRIX - -[ELinks (0.10*; *Linux*)] -Parent=ELinks 0.10 -Platform=Linux - -[ELinks (0.10*; *NetBSD*)] -Parent=ELinks 0.10 -Platform=NetBSD - -[ELinks (0.10*; *OpenBSD*)] -Parent=ELinks 0.10 -Platform=OpenBSD - -[ELinks (0.10*; *OS/2*)] -Parent=ELinks 0.10 -Platform=OS/2 - -[ELinks (0.10*; *RISC*)] -Parent=ELinks 0.10 -Platform=RISC OS - -[ELinks (0.10*; *Solaris*)] -Parent=ELinks 0.10 -Platform=Solaris - -[ELinks (0.10*; *Unix*)] -Parent=ELinks 0.10 -Platform=Unix - -[ELinks/0.10* (*AIX*)] -Parent=ELinks 0.10 -Platform=AIX - -[ELinks/0.10* (*BeOS*)] -Parent=ELinks 0.10 -Platform=BeOS - -[ELinks/0.10* (*CygWin*)] -Parent=ELinks 0.10 -Platform=CygWin - -[ELinks/0.10* (*Darwin*)] -Parent=ELinks 0.10 -Platform=Darwin - -[ELinks/0.10* (*Digital Unix*)] -Parent=ELinks 0.10 -Platform=Digital Unix - -[ELinks/0.10* (*FreeBSD*)] -Parent=ELinks 0.10 -Platform=FreeBSD - -[ELinks/0.10* (*HPUX*)] -Parent=ELinks 0.10 -Platform=HP-UX - -[ELinks/0.10* (*IRIX*)] -Parent=ELinks 0.10 -Platform=IRIX - -[ELinks/0.10* (*Linux*)] -Parent=ELinks 0.10 -Platform=Linux - -[ELinks/0.10* (*NetBSD*)] -Parent=ELinks 0.10 -Platform=NetBSD - -[ELinks/0.10* (*OpenBSD*)] -Parent=ELinks 0.10 -Platform=OpenBSD - -[ELinks/0.10* (*OS/2*)] -Parent=ELinks 0.10 -Platform=OS/2 - -[ELinks/0.10* (*RISC*)] -Parent=ELinks 0.10 -Platform=RISC OS - -[ELinks/0.10* (*Solaris*)] -Parent=ELinks 0.10 -Platform=Solaris - -[ELinks/0.10* (*Unix*)] -Parent=ELinks 0.10 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.11 - -[ELinks 0.11] -Parent=DefaultProperties -Browser=ELinks -Version=0.11 -MinorVer=11 -Frames=true -Tables=true - -[ELinks (0.11*; *AIX*)] -Parent=ELinks 0.11 -Platform=AIX - -[ELinks (0.11*; *BeOS*)] -Parent=ELinks 0.11 -Platform=BeOS - -[ELinks (0.11*; *CygWin*)] -Parent=ELinks 0.11 -Platform=CygWin - -[ELinks (0.11*; *Darwin*)] -Parent=ELinks 0.11 -Platform=Darwin - -[ELinks (0.11*; *Digital Unix*)] -Parent=ELinks 0.11 -Platform=Digital Unix - -[ELinks (0.11*; *FreeBSD*)] -Parent=ELinks 0.11 -Platform=FreeBSD - -[ELinks (0.11*; *HPUX*)] -Parent=ELinks 0.11 -Platform=HP-UX - -[ELinks (0.11*; *IRIX*)] -Parent=ELinks 0.11 -Platform=IRIX - -[ELinks (0.11*; *Linux*)] -Parent=ELinks 0.11 -Platform=Linux - -[ELinks (0.11*; *NetBSD*)] -Parent=ELinks 0.11 -Platform=NetBSD - -[ELinks (0.11*; *OpenBSD*)] -Parent=ELinks 0.11 -Platform=OpenBSD - -[ELinks (0.11*; *OS/2*)] -Parent=ELinks 0.11 -Platform=OS/2 - -[ELinks (0.11*; *RISC*)] -Parent=ELinks 0.11 -Platform=RISC OS - -[ELinks (0.11*; *Solaris*)] -Parent=ELinks 0.11 -Platform=Solaris - -[ELinks (0.11*; *Unix*)] -Parent=ELinks 0.11 -Platform=Unix - -[ELinks/0.11* (*AIX*)] -Parent=ELinks 0.11 -Platform=AIX - -[ELinks/0.11* (*BeOS*)] -Parent=ELinks 0.11 -Platform=BeOS - -[ELinks/0.11* (*CygWin*)] -Parent=ELinks 0.11 -Platform=CygWin - -[ELinks/0.11* (*Darwin*)] -Parent=ELinks 0.11 -Platform=Darwin - -[ELinks/0.11* (*Digital Unix*)] -Parent=ELinks 0.11 -Platform=Digital Unix - -[ELinks/0.11* (*FreeBSD*)] -Parent=ELinks 0.11 -Platform=FreeBSD - -[ELinks/0.11* (*HPUX*)] -Parent=ELinks 0.11 -Platform=HP-UX - -[ELinks/0.11* (*IRIX*)] -Parent=ELinks 0.11 -Platform=IRIX - -[ELinks/0.11* (*Linux*)] -Parent=ELinks 0.11 -Platform=Linux - -[ELinks/0.11* (*NetBSD*)] -Parent=ELinks 0.11 -Platform=NetBSD - -[ELinks/0.11* (*OpenBSD*)] -Parent=ELinks 0.11 -Platform=OpenBSD - -[ELinks/0.11* (*OS/2*)] -Parent=ELinks 0.11 -Platform=OS/2 - -[ELinks/0.11* (*RISC*)] -Parent=ELinks 0.11 -Platform=RISC OS - -[ELinks/0.11* (*Solaris*)] -Parent=ELinks 0.11 -Platform=Solaris - -[ELinks/0.11* (*Unix*)] -Parent=ELinks 0.11 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.12 - -[ELinks 0.12] -Parent=DefaultProperties -Browser=ELinks -Version=0.12 -MinorVer=12 -Frames=true -Tables=true - -[ELinks (0.12*; *AIX*)] -Parent=ELinks 0.12 -Platform=AIX - -[ELinks (0.12*; *BeOS*)] -Parent=ELinks 0.12 -Platform=BeOS - -[ELinks (0.12*; *CygWin*)] -Parent=ELinks 0.12 -Platform=CygWin - -[ELinks (0.12*; *Darwin*)] -Parent=ELinks 0.12 -Platform=Darwin - -[ELinks (0.12*; *Digital Unix*)] -Parent=ELinks 0.12 -Platform=Digital Unix - -[ELinks (0.12*; *FreeBSD*)] -Parent=ELinks 0.12 -Platform=FreeBSD - -[ELinks (0.12*; *HPUX*)] -Parent=ELinks 0.12 -Platform=HP-UX - -[ELinks (0.12*; *IRIX*)] -Parent=ELinks 0.12 -Platform=IRIX - -[ELinks (0.12*; *Linux*)] -Parent=ELinks 0.12 -Platform=Linux - -[ELinks (0.12*; *NetBSD*)] -Parent=ELinks 0.12 -Platform=NetBSD - -[ELinks (0.12*; *OpenBSD*)] -Parent=ELinks 0.12 -Platform=OpenBSD - -[ELinks (0.12*; *OS/2*)] -Parent=ELinks 0.12 -Platform=OS/2 - -[ELinks (0.12*; *RISC*)] -Parent=ELinks 0.12 -Platform=RISC OS - -[ELinks (0.12*; *Solaris*)] -Parent=ELinks 0.12 -Platform=Solaris - -[ELinks (0.12*; *Unix*)] -Parent=ELinks 0.12 -Platform=Unix - -[ELinks/0.12* (*AIX*)] -Parent=ELinks 0.12 -Platform=AIX - -[ELinks/0.12* (*BeOS*)] -Parent=ELinks 0.12 -Platform=BeOS - -[ELinks/0.12* (*CygWin*)] -Parent=ELinks 0.12 -Platform=CygWin - -[ELinks/0.12* (*Darwin*)] -Parent=ELinks 0.12 -Platform=Darwin - -[ELinks/0.12* (*Digital Unix*)] -Parent=ELinks 0.12 -Platform=Digital Unix - -[ELinks/0.12* (*FreeBSD*)] -Parent=ELinks 0.12 -Platform=FreeBSD - -[ELinks/0.12* (*HPUX*)] -Parent=ELinks 0.12 -Platform=HP-UX - -[ELinks/0.12* (*IRIX*)] -Parent=ELinks 0.12 -Platform=IRIX - -[ELinks/0.12* (*Linux*)] -Parent=ELinks 0.12 -Platform=Linux - -[ELinks/0.12* (*NetBSD*)] -Parent=ELinks 0.12 -Platform=NetBSD - -[ELinks/0.12* (*OpenBSD*)] -Parent=ELinks 0.12 -Platform=OpenBSD - -[ELinks/0.12* (*OS/2*)] -Parent=ELinks 0.12 -Platform=OS/2 - -[ELinks/0.12* (*RISC*)] -Parent=ELinks 0.12 -Platform=RISC OS - -[ELinks/0.12* (*Solaris*)] -Parent=ELinks 0.12 -Platform=Solaris - -[ELinks/0.12* (*Unix*)] -Parent=ELinks 0.12 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.9 - -[ELinks 0.9] -Parent=DefaultProperties -Browser=ELinks -Version=0.9 -MinorVer=9 -Frames=true -Tables=true - -[ELinks (0.9*; *AIX*)] -Parent=ELinks 0.9 -Platform=AIX - -[ELinks (0.9*; *BeOS*)] -Parent=ELinks 0.9 -Platform=BeOS - -[ELinks (0.9*; *CygWin*)] -Parent=ELinks 0.9 -Platform=CygWin - -[ELinks (0.9*; *Darwin*)] -Parent=ELinks 0.9 -Platform=Darwin - -[ELinks (0.9*; *Digital Unix*)] -Parent=ELinks 0.9 -Platform=Digital Unix - -[ELinks (0.9*; *FreeBSD*)] -Parent=ELinks 0.9 -Platform=FreeBSD - -[ELinks (0.9*; *HPUX*)] -Parent=ELinks 0.9 -Platform=HP-UX - -[ELinks (0.9*; *IRIX*)] -Parent=ELinks 0.9 -Platform=IRIX - -[ELinks (0.9*; *Linux*)] -Parent=ELinks 0.9 -Platform=Linux - -[ELinks (0.9*; *NetBSD*)] -Parent=ELinks 0.9 -Platform=NetBSD - -[ELinks (0.9*; *OpenBSD*)] -Parent=ELinks 0.9 -Platform=OpenBSD - -[ELinks (0.9*; *OS/2*)] -Parent=ELinks 0.9 -Platform=OS/2 - -[ELinks (0.9*; *RISC*)] -Parent=ELinks 0.9 -Platform=RISC OS - -[ELinks (0.9*; *Solaris*)] -Parent=ELinks 0.9 -Platform=Solaris - -[ELinks (0.9*; *Unix*)] -Parent=ELinks 0.9 -Platform=Unix - -[ELinks/0.9* (*AIX*)] -Parent=ELinks 0.9 -Platform=AIX - -[ELinks/0.9* (*BeOS*)] -Parent=ELinks 0.9 -Platform=BeOS - -[ELinks/0.9* (*CygWin*)] -Parent=ELinks 0.9 -Platform=CygWin - -[ELinks/0.9* (*Darwin*)] -Parent=ELinks 0.9 -Platform=Darwin - -[ELinks/0.9* (*Digital Unix*)] -Parent=ELinks 0.9 -Platform=Digital Unix - -[ELinks/0.9* (*FreeBSD*)] -Parent=ELinks 0.9 -Platform=FreeBSD - -[ELinks/0.9* (*HPUX*)] -Parent=ELinks 0.9 -Platform=HP-UX - -[ELinks/0.9* (*IRIX*)] -Parent=ELinks 0.9 -Platform=IRIX - -[ELinks/0.9* (*Linux*)] -Parent=ELinks 0.9 -Platform=Linux - -[ELinks/0.9* (*NetBSD*)] -Parent=ELinks 0.9 -Platform=NetBSD - -[ELinks/0.9* (*OpenBSD*)] -Parent=ELinks 0.9 -Platform=OpenBSD - -[ELinks/0.9* (*OS/2*)] -Parent=ELinks 0.9 -Platform=OS/2 - -[ELinks/0.9* (*RISC*)] -Parent=ELinks 0.9 -Platform=RISC OS - -[ELinks/0.9* (*Solaris*)] -Parent=ELinks 0.9 -Platform=Solaris - -[ELinks/0.9* (*Unix*)] -Parent=ELinks 0.9 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AppleWebKit - -[AppleWebKit] -Parent=DefaultProperties -Browser=AppleWebKit -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (KHTML, like Gecko)] -Parent=AppleWebKit - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Camino - -[Camino] -Parent=DefaultProperties -Browser=Camino -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.7*] -Parent=Camino -Version=0.7 -MajorVer=0 -MinorVer=7 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.8*] -Parent=Camino -Version=0.8 -MajorVer=0 -MinorVer=8 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.9*] -Parent=Camino -Version=0.9 -MajorVer=0 -MinorVer=9 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.0*] -Parent=Camino -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.2*] -Parent=Camino -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.3*] -Parent=Camino -Version=1.3 -MajorVer=1 -MinorVer=3 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.4*] -Parent=Camino -Version=1.4 -MajorVer=1 -MinorVer=4 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.5*] -Parent=Camino -Version=1.5 -MajorVer=1 -MinorVer=5 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.6*] -Parent=Camino -Version=1.6 -MajorVer=1 -MinorVer=6 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chimera - -[Chimera] -Parent=DefaultProperties -Browser=Chimera -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Chimera/*] -Parent=Chimera -Platform=MacOSX - -[Mozilla/5.0 Gecko/* Chimera/*] -Parent=Chimera - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Dillo - -[Dillo] -Parent=DefaultProperties -Browser=Dillo -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -CssVersion=2 -supportsCSS=true - -[Dillo/0.6*] -Parent=Dillo -Version=0.6 -MajorVer=0 -MinorVer=6 - -[Dillo/0.7*] -Parent=Dillo -Version=0.7 -MajorVer=0 -MinorVer=7 - -[Dillo/0.8*] -Parent=Dillo -Version=0.8 -MajorVer=0 -MinorVer=8 - -[Dillo/2.0] -Parent=Dillo -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Emacs/W3 - -[Emacs/W3] -Parent=DefaultProperties -Browser=Emacs/W3 -Frames=true -Tables=true -Cookies=true - -[Emacs/W3/2.* (Unix*] -Parent=Emacs/W3 -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Unix - -[Emacs/W3/2.* (X11*] -Parent=Emacs/W3 -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Linux - -[Emacs/W3/3.* (Unix*] -Parent=Emacs/W3 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Unix - -[Emacs/W3/3.* (X11*] -Parent=Emacs/W3 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Linux - -[Emacs/W3/4.* (Unix*] -Parent=Emacs/W3 -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Unix - -[Emacs/W3/4.* (X11*] -Parent=Emacs/W3 -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; fantomas - -[fantomas] -Parent=DefaultProperties -Browser=fantomas -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/4.0 (cloakBrowser)] -Parent=fantomas -Browser=fantomas cloakBrowser - -[Mozilla/4.0 (fantomas shadowMaker Browser)] -Parent=fantomas -Browser=fantomas shadowMaker Browser - -[Mozilla/4.0 (fantomBrowser)] -Parent=fantomas -Browser=fantomas fantomBrowser - -[Mozilla/4.0 (fantomCrew Browser)] -Parent=fantomas -Browser=fantomas fantomCrew Browser - -[Mozilla/4.0 (stealthBrowser)] -Parent=fantomas -Browser=fantomas stealthBrowser - -[multiBlocker browser*] -Parent=fantomas -Browser=fantomas multiBlocker browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FrontPage - -[FrontPage] -Parent=DefaultProperties -Browser=FrontPage -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/?* (compatible; MS FrontPage*)] -Parent=FrontPage - -[MSFrontPage/*] -Parent=FrontPage - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Galeon - -[Galeon] -Parent=DefaultProperties -Browser=Galeon -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/1.*] -Parent=Galeon -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/2.*] -Parent=Galeon -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 Galeon/1.* (X11; Linux*)*] -Parent=Galeon -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 Galeon/2.* (X11; Linux*)*] -Parent=Galeon -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HP Secure Web Browser - -[HP Secure Web Browser] -Parent=DefaultProperties -Browser=HP Secure Web Browser -Platform=OpenVMS -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.0*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.1*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.2*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.3*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.4*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.4 -MajorVer=1 -MinorVer=4 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.5*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.5 -MajorVer=1 -MinorVer=5 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.6*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.6 -MajorVer=1 -MinorVer=6 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.7*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.7 -MajorVer=1 -MinorVer=7 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.8*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.8 -MajorVer=1 -MinorVer=8 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IBrowse - -[IBrowse] -Parent=DefaultProperties -Browser=IBrowse -Platform=Amiga -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Arexx (compatible; MSIE 6.0; AmigaOS5.0) IBrowse 4.0] -Parent=IBrowse -Version=4.0 -MajorVer=4 -MinorVer=0 - -[IBrowse/1.22 (AmigaOS *)] -Parent=IBrowse -Version=1.22 -MajorVer=1 -MinorVer=22 - -[IBrowse/2.1 (AmigaOS *)] -Parent=IBrowse -Version=2.1 -MajorVer=2 -MinorVer=1 - -[IBrowse/2.2 (AmigaOS *)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=2 - -[IBrowse/2.3 (AmigaOS *)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=3 - -[Mozilla/* (Win98; I) IBrowse/2.1 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/* (Win98; I) IBrowse/2.2 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Mozilla/* (Win98; I) IBrowse/2.3 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.3 -MajorVer=2 -MinorVer=3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iCab - -[iCab] -Parent=DefaultProperties -Browser=iCab -Frames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[iCab/2.7* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=Mac68K - -[iCab/2.7* (Macintosh; ?; PPC*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=MacPPC - -[iCab/2.8* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacOSX - -[iCab/2.8* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=Mac68K - -[iCab/2.8* (Macintosh; ?; PPC)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacPPC - -[iCab/2.9* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacOSX - -[iCab/2.9* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=Mac68K - -[iCab/2.9* (Macintosh; ?; PPC*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacPPC - -[iCab/3.0* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[iCab/3.0* (Macintosh; ?; PPC*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacPPC -CssVersion=2 -supportsCSS=true - -[iCab/4.0 (Macintosh; U; *Mac OS X)] -Parent=iCab -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (compatible; iCab 3.0*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; iCab 3.0*; Macintosh; ?; PPC*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacPPC -CssVersion=2 -supportsCSS=true - -[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; 68K*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=Mac68K - -[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacOSX - -[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacOSX - -[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 4.2*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iSiloX - -[iSiloX] -Parent=DefaultProperties -Browser=iSiloX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -Crawler=true -CssVersion=2 -supportsCSS=true - -[iSiloX/4.0* MacOS] -Parent=iSiloX -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacPPC - -[iSiloX/4.0* Windows/32] -Parent=iSiloX -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Win32 -Win32=true - -[iSiloX/4.1* MacOS] -Parent=iSiloX -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=MacPPC - -[iSiloX/4.1* Windows/32] -Parent=iSiloX -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=Win32 -Win32=true - -[iSiloX/4.2* MacOS] -Parent=iSiloX -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=MacPPC - -[iSiloX/4.2* Windows/32] -Parent=iSiloX -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=Win32 -Win32=true - -[iSiloX/4.3* MacOS] -Parent=iSiloX -Version=4.3 -MajorVer=4 -MinorVer=4 -Platform=MacOSX - -[iSiloX/4.3* Windows/32] -Parent=iSiloX -Version=4.3 -MajorVer=4 -MinorVer=3 -Platform=Win32 -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycoris Desktop/LX - -[Lycoris Desktop/LX] -Parent=DefaultProperties -Browser=Lycoris Desktop/LX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -Crawler=true - -[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*: Desktop/LX Amethyst) Gecko/*] -Parent=Lycoris Desktop/LX -Version=1.1 -MajorVer=1 -MinorVer=1 -Platform=Linux - -[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*; Desktop/LX Amethyst) Gecko/*] -Parent=Lycoris Desktop/LX -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mosaic - -[Mosaic] -Parent=DefaultProperties -Browser=Mosaic -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[Mozilla/4.0 (VMS_Mosaic)] -Parent=Mosaic -Platform=OpenVMS - -[VMS_Mosaic/3.7*] -Parent=Mosaic -Version=3.7 -MajorVer=3 -MinorVer=7 -Platform=OpenVMS - -[VMS_Mosaic/3.8*] -Parent=Mosaic -Version=3.8 -MajorVer=3 -MinorVer=8 -Platform=OpenVMS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetPositive - -[NetPositive] -Parent=DefaultProperties -Browser=NetPositive -Platform=BeOS -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[*NetPositive/2.2*] -Parent=NetPositive -Version=2.2 -MajorVer=2 -MinorVer=2 - -[*NetPositive/2.2*BeOS*] -Parent=NetPositive -Version=2.2 -MajorVer=2 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OmniWeb - -[OmniWeb] -Parent=DefaultProperties -Browser=OmniWeb -Platform=MacOSX -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v4*] -Parent=OmniWeb -Version=4.5 -MajorVer=4 -MinorVer=5 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v5*] -Parent=OmniWeb -Version=5. -MajorVer=5 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v6*] -Parent=OmniWeb -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/4*] -Parent=OmniWeb -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacPPC - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/5*] -Parent=OmniWeb -Version=5.0 -MajorVer=5 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/6*] -Parent=OmniWeb -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=MacPPC - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.34] -Parent=OmniWeb -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.34] -Parent=OmniWeb -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v607] -Parent=OmniWeb -Version=5.5 -MajorVer=5 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v607] -Parent=OmniWeb -Version=5.5 -MajorVer=5 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/522+ (KHTML, like Gecko, Safari/522) OmniWeb/v613] -Parent=OmniWeb -Version=5.6 -MajorVer=5 -MinorVer=6 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/522+ (KHTML, like Gecko, Safari/522) OmniWeb/v613] -Parent=OmniWeb -Version=5.6 -MajorVer=5 -MinorVer=6 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v496] -Parent=OmniWeb -Version=4.5 -MajorVer=4 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558.36 ] -Parent=OmniWeb -Version=5.0 -MajorVer=5 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Shiira - -[Shiira] -Parent=DefaultProperties -Browser=Shiira -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/0.9*] -Parent=Shiira -Version=0.9 -MajorVer=0 -MinorVer=9 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.0*] -Parent=Shiira -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.1*] -Parent=Shiira -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.2*] -Parent=Shiira -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/2.1*] -Parent=Shiira -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/2.2*] -Parent=Shiira -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Windows Maker] -Parent=DefaultProperties -Browser=WMaker -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -VBScript=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[WMaker*] -Parent=Windows Maker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.0 - -[K-Meleon 1.0] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.0 -MajorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.1 - -[K-Meleon 1.1] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.1 -MajorVer=1 -MinorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.5 - -[K-Meleon 1.5] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.5 -MajorVer=1 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Platform=WinVista - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 3.0 - -[Konqueror 3.0] -Parent=DefaultProperties -Browser=Konqueror -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[*Konqueror/3.0*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -IFrames=false - -[*Konqueror/3.0*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=FreeBSD -IFrames=false - -[*Konqueror/3.0*Linux*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Linux -IFrames=false - -[*Konqueror/3.1*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 - -[*Konqueror/3.1*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 -Platform=FreeBSD - -[*Konqueror/3.1*Linux*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 - -[*Konqueror/3.2*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 - -[*Konqueror/3.2*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 -Platform=FreeBSD - -[*Konqueror/3.2*Linux*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 -Platform=Linux - -[*Konqueror/3.3*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 - -[*Konqueror/3.3*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=FreeBSD - -[*Konqueror/3.3*Linux*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=Linux - -[*Konqueror/3.3*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=OpenBSD - -[*Konqueror/3.4*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 - -[*Konqueror/3.4*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=FreeBSD - -[*Konqueror/3.4*Linux*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=Linux - -[*Konqueror/3.4*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=OpenBSD - -[*Konqueror/3.5*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 - -[*Konqueror/3.5*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=FreeBSD - -[*Konqueror/3.5*Linux*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=Linux - -[*Konqueror/3.5*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=OpenBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.0 - -[Konqueror 4.0] -Parent=DefaultProperties -Browser=Konqueror -Version=4.0 -MajorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.0*; Debian) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; *Linux) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; FreeBSD) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; NetBSD) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.1 - -[Konqueror 4.1] -Parent=DefaultProperties -Browser=Konqueror -Version=4.1 -MajorVer=4 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.1*; *Linux*) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.1*; Debian) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.1*; FreeBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.1*; NetBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.2 - -[Konqueror 4.2] -Parent=DefaultProperties -Browser=Konqueror -Version=4.2 -MajorVer=4 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.2*; *Linux*) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.2*; Debian) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.2*; FreeBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.2*; NetBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari - -[Safari] -Parent=DefaultProperties -Browser=Safari -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/100*] -Parent=Safari -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/125*] -Parent=Safari -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/312*] -Parent=Safari -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/412*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/416*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/417*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/418*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/419*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/52*] -Parent=Safari -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/85*] -Parent=Safari -Version=1.0 -MajorVer=1 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.0 - -[Safari 3.0] -Parent=DefaultProperties -Browser=Safari -Version=3.0 -MajorVer=3 -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.1 - -[Safari 3.1] -Parent=DefaultProperties -Browser=Safari -Version=3.1 -MajorVer=3 -MinorVer=1 -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.2 - -[Safari 3.2] -Parent=DefaultProperties -Browser=Safari -Version=3.2 -MajorVer=3 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 4.0 - -[Safari 4.0] -Parent=DefaultProperties -Browser=Safari -Version=4.0 -MajorVer=4 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *) AppleWebKit/* (KHTML, like Gecko) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *) AppleWebKit/* (KHTML, like Gecko) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 7.0; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 7.0; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 10.0 - -[Opera 10.0] -Parent=DefaultProperties -Browser=Opera -Version=10.0 -MajorVer=10 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 10.0*] -Parent=Opera 10.0 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 10.0*] -Parent=Opera 10.0 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (Linux*)*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (Macintosh; *Mac OS X;*)*] -Parent=Opera 10.0 -Platform=MacOSX - -[Opera/10.0* (Windows 95*)*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Opera/10.0* (Windows 98*)*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Opera/10.0* (Windows CE*)*] -Parent=Opera 10.0 -Platform=WinCE -Win32=true - -[Opera/10.0* (Windows ME*)*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Opera/10.0* (Windows NT 4.0*)*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Opera/10.0* (Windows NT 5.0*)*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Opera/10.0* (Windows NT 5.1*)*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Opera/10.0* (Windows NT 5.2*)*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Opera/10.0* (Windows NT 6.0*)*] -Parent=Opera 10.0 -Platform=WinVista -Win32=true - -[Opera/10.0* (Windows NT 6.1*)*] -Parent=Opera 10.0 -Platform=Win7 - -[Opera/10.0* (Windows XP*)*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Opera/10.0* (X11; FreeBSD*)*] -Parent=Opera 10.0 -Platform=FreeBSD - -[Opera/10.0* (X11; Linux*)*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (X11; SunOS*)*] -Parent=Opera 10.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.0 - -[Opera 7.0] -Parent=DefaultProperties -Browser=Opera -Version=7.0 -MajorVer=7 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/3.0 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/3.0 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/3.0 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/3.0 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/3.0 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/3.0 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 2000) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 95) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 98) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows ME) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 4.0) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.0) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows XP) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.78 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.78 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/4.78 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/4.78 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/4.78 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/4.78 (Windows NT 5.1; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.78 (Windows Windows NT 5.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.78 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows NT 5.1; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Opera/7.0* (Windows 2000; ?)*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Opera/7.0* (Windows 95; ?)*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Opera/7.0* (Windows 98; ?)*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Opera/7.0* (Windows ME; ?)*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Opera/7.0* (Windows NT 4.0; ?)*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Opera/7.0* (Windows NT 5.0; ?)*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Opera/7.0* (Windows NT 5.1; ?)*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Opera/7.0* (Windows XP; ?)*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.1 - -[Opera 7.1] -Parent=DefaultProperties -Browser=Opera -Version=7.1 -MajorVer=7 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows 2000; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Opera/7.1* (Linux*; ?)*] -Parent=Opera 7.1 -Platform=Linux - -[Opera/7.1* (Windows 95; ?)*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Opera/7.1* (Windows 98; ?)*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Opera/7.1* (Windows ME; ?)*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Opera/7.1* (Windows NT 4.0; ?)*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Opera/7.1* (Windows NT 5.0; ?)*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Opera/7.1* (Windows NT 5.1; ?)*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Opera/7.1* (Windows XP; ?)*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.2 - -[Opera 7.2] -Parent=DefaultProperties -Browser=Opera -Version=7.2 -MajorVer=7 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.2*] -Parent=Opera 7.2 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows 2000; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Opera/7.2* (Linux*; ?)*] -Parent=Opera 7.2 -Platform=Linux - -[Opera/7.2* (Windows 95; ?)*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Opera/7.2* (Windows 98; ?)*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Opera/7.2* (Windows ME; ?)*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Opera/7.2* (Windows NT 4.0; ?)*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Opera/7.2* (Windows NT 5.0; ?)*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Opera/7.2* (Windows NT 5.1; ?)*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Opera/7.2* (Windows NT 5.2; ?)*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Opera/7.2* (Windows XP; ?)*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Opera/7.2* (X11; FreeBSD*; ?)*] -Parent=Opera 7.2 -Platform=FreeBSD - -[Opera/7.2* (X11; Linux*; ?)*] -Parent=Opera 7.2 -Platform=Linux - -[Opera/7.2* (X11; SunOS*)*] -Parent=Opera 7.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.5 - -[Opera 7.5] -Parent=DefaultProperties -Browser=Opera -Version=7.5 -MajorVer=7 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.5*] -Parent=Opera 7.5 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Opera/7.5* (Linux*; ?)*] -Parent=Opera 7.5 -Platform=Linux - -[Opera/7.5* (Macintosh; *Mac OS X; ?)*] -Parent=Opera 7.5 -Platform=MacOSX - -[Opera/7.5* (Windows 95; ?)*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Opera/7.5* (Windows 98; ?)*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Opera/7.5* (Windows ME; ?)*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Opera/7.5* (Windows NT 4.0; ?)*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Opera/7.5* (Windows NT 5.0; ?)*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Opera/7.5* (Windows NT 5.1; ?)*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Opera/7.5* (Windows NT 5.2; ?)*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Opera/7.5* (Windows XP; ?)*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Opera/7.5* (X11; FreeBSD*; ?)*] -Parent=Opera 7.5 -Platform=FreeBSD - -[Opera/7.5* (X11; Linux*; ?)*] -Parent=Opera 7.5 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.6 - -[Opera 7.6] -Parent=DefaultProperties -Browser=Opera -Version=7.6 -MajorVer=7 -MinorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.6*] -Parent=Opera 7.6 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Opera/7.6* (Linux*)*] -Parent=Opera 7.6 -Platform=Linux - -[Opera/7.6* (Macintosh; *Mac OS X; ?)*] -Parent=Opera 7.6 -Platform=MacOSX - -[Opera/7.6* (Windows 95*)*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Opera/7.6* (Windows 98*)*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Opera/7.6* (Windows ME*)*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Opera/7.6* (Windows NT 4.0*)*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Opera/7.6* (Windows NT 5.0*)*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Opera/7.6* (Windows NT 5.1*)*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Opera/7.6* (Windows NT 5.2*)*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Opera/7.6* (Windows XP*)*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Opera/7.6* (X11; FreeBSD*)*] -Parent=Opera 7.6 -Platform=FreeBSD - -[Opera/7.6* (X11; Linux*)*] -Parent=Opera 7.6 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.0 - -[Opera 8.0] -Parent=DefaultProperties -Browser=Opera -Version=8.0 -MajorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacOSX - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.0*] -Parent=Opera 8.0 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Opera/8.0* (Linux*)*] -Parent=Opera 8.0 -Platform=Linux - -[Opera/8.0* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.0 -Platform=MacOSX - -[Opera/8.0* (Windows 95*)*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Opera/8.0* (Windows 98*)*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Opera/8.0* (Windows CE*)*] -Parent=Opera 8.0 -Platform=WinCE -Win32=true - -[Opera/8.0* (Windows ME*)*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Opera/8.0* (Windows NT 4.0*)*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Opera/8.0* (Windows NT 5.0*)*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Opera/8.0* (Windows NT 5.1*)*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Opera/8.0* (Windows NT 5.2*)*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Opera/8.0* (Windows XP*)*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Opera/8.0* (X11; FreeBSD*)*] -Parent=Opera 8.0 -Platform=FreeBSD - -[Opera/8.0* (X11; Linux*)*] -Parent=Opera 8.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.1 - -[Opera 8.1] -Parent=DefaultProperties -Browser=Opera -Version=8.1 -MajorVer=8 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.1*] -Parent=Opera 8.1 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.1*] -Parent=Opera 8.1 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.1*] -Parent=Opera 8.1 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Opera/8.1* (Linux*)*] -Parent=Opera 8.1 -Platform=Linux - -[Opera/8.1* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.1 -Platform=MacOSX - -[Opera/8.1* (Windows 95*)*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Opera/8.1* (Windows 98*)*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Opera/8.1* (Windows CE*)*] -Parent=Opera 8.1 -Platform=WinCE -Win32=true - -[Opera/8.1* (Windows ME*)*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Opera/8.1* (Windows NT 4.0*)*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Opera/8.1* (Windows NT 5.0*)*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Opera/8.1* (Windows NT 5.1*)*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Opera/8.1* (Windows NT 5.2*)*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Opera/8.1* (Windows XP*)*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Opera/8.1* (X11; FreeBSD*)*] -Parent=Opera 8.1 -Platform=FreeBSD - -[Opera/8.1* (X11; Linux*)*] -Parent=Opera 8.1 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.5 - -[Opera 8.5] -Parent=DefaultProperties -Browser=Opera -Version=8.5 -MajorVer=8 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X;*) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.5*] -Parent=Opera 8.5 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (Macintosh; PPC Mac OS X;*) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Opera/8.5* (Linux*)*] -Parent=Opera 8.5 -Platform=Linux - -[Opera/8.5* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.5 -Platform=MacOSX - -[Opera/8.5* (Windows 95*)*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Opera/8.5* (Windows 98*)*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Opera/8.5* (Windows CE*)*] -Parent=Opera 8.5 -Platform=WinCE -Win32=true - -[Opera/8.5* (Windows ME*)*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Opera/8.5* (Windows NT 4.0*)*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Opera/8.5* (Windows NT 5.0*)*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Opera/8.5* (Windows NT 5.1*)*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Opera/8.5* (Windows NT 5.2*)*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Opera/8.5* (Windows XP*)*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Opera/8.5* (X11; FreeBSD*)*] -Parent=Opera 8.5 -Platform=FreeBSD - -[Opera/8.5* (X11; Linux*)*] -Parent=Opera 8.5 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.0 - -[Opera 9.0] -Parent=DefaultProperties -Browser=Opera -Version=9.0 -MajorVer=9 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.0*] -Parent=Opera 9.0 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.0*] -Parent=Opera 9.0 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (X11; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Opera/9.0* (Linux*)*] -Parent=Opera 9.0 -Platform=Linux - -[Opera/9.0* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.0 -Platform=MacOSX - -[Opera/9.0* (Windows 95*)*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Opera/9.0* (Windows 98*)*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Opera/9.0* (Windows CE*)*] -Parent=Opera 9.0 -Platform=WinCE -Win32=true - -[Opera/9.0* (Windows ME*)*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Opera/9.0* (Windows NT 4.0*)*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Opera/9.0* (Windows NT 5.0*)*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Opera/9.0* (Windows NT 5.1*)*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Opera/9.0* (Windows NT 5.2*)*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Opera/9.0* (Windows NT 6.0*)*] -Parent=Opera 9.0 -Platform=WinVista -Win32=true - -[Opera/9.0* (Windows XP*)*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Opera/9.0* (X11; FreeBSD*)*] -Parent=Opera 9.0 -Platform=FreeBSD - -[Opera/9.0* (X11; Linux*)*] -Parent=Opera 9.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.1 - -[Opera 9.1] -Parent=DefaultProperties -Browser=Opera -Version=9.1 -MajorVer=9 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.1*] -Parent=Opera 9.1 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.1*] -Parent=Opera 9.1 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Mozilla/* (X11; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (Linux*)*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.1 -Platform=MacOSX - -[Opera/9.1* (Windows 95*)*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Opera/9.1* (Windows 98*)*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Opera/9.1* (Windows CE*)*] -Parent=Opera 9.1 -Platform=WinCE -Win32=true - -[Opera/9.1* (Windows ME*)*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Opera/9.1* (Windows NT 4.0*)*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Opera/9.1* (Windows NT 5.0*)*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Opera/9.1* (Windows NT 5.1*)*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Opera/9.1* (Windows NT 5.2*)*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Opera/9.1* (Windows NT 6.0*)*] -Parent=Opera 9.1 -Platform=WinVista -Win32=true - -[Opera/9.1* (Windows XP*)*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Opera/9.1* (X11; FreeBSD*)*] -Parent=Opera 9.1 -Platform=FreeBSD - -[Opera/9.1* (X11; Linux*)*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (X11; SunOS*)*] -Parent=Opera 9.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.2 - -[Opera 9.2] -Parent=DefaultProperties -Browser=Opera -Version=9.2 -MajorVer=9 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.2*] -Parent=Opera 9.2 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.2*] -Parent=Opera 9.2 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (Linux*)*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.2 -Platform=MacOSX - -[Opera/9.2* (Windows 95*)*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Opera/9.2* (Windows 98*)*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Opera/9.2* (Windows CE*)*] -Parent=Opera 9.2 -Platform=WinCE -Win32=true - -[Opera/9.2* (Windows ME*)*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Opera/9.2* (Windows NT 4.0*)*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Opera/9.2* (Windows NT 5.0*)*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Opera/9.2* (Windows NT 5.1*)*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Opera/9.2* (Windows NT 5.2*)*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Opera/9.2* (Windows NT 6.0*)*] -Parent=Opera 9.2 -Platform=WinVista -Win32=true - -[Opera/9.2* (Windows NT 6.1*)*] -Parent=Opera 9.2 -Platform=Win7 - -[Opera/9.2* (Windows XP*)*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Opera/9.2* (X11; FreeBSD*)*] -Parent=Opera 9.2 -Platform=FreeBSD - -[Opera/9.2* (X11; Linux*)*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (X11; SunOS*)*] -Parent=Opera 9.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.3 - -[Opera 9.3] -Parent=DefaultProperties -Browser=Opera -Version=9.3 -MajorVer=9 -MinorVer=3 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.3*] -Parent=Opera 9.3 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.3*] -Parent=Opera 9.3 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (Linux*)*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.3 -Platform=MacOSX - -[Opera/9.3* (Windows 95*)*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Opera/9.3* (Windows 98*)*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Opera/9.3* (Windows CE*)*] -Parent=Opera 9.3 -Platform=WinCE -Win32=true - -[Opera/9.3* (Windows ME*)*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Opera/9.3* (Windows NT 4.0*)*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Opera/9.3* (Windows NT 5.0*)*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Opera/9.3* (Windows NT 5.1*)*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Opera/9.3* (Windows NT 5.2*)*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Opera/9.3* (Windows NT 6.0*)*] -Parent=Opera 9.3 -Platform=WinVista -Win32=true - -[Opera/9.3* (Windows NT 6.1*)*] -Parent=Opera 9.3 -Platform=Win7 - -[Opera/9.3* (Windows XP*)*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Opera/9.3* (X11; FreeBSD*)*] -Parent=Opera 9.3 -Platform=FreeBSD - -[Opera/9.3* (X11; Linux*)*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (X11; SunOS*)*] -Parent=Opera 9.3 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.4 - -[Opera 9.4] -Parent=DefaultProperties -Browser=Opera -Version=9.4 -MajorVer=9 -MinorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.4*] -Parent=Opera 9.4 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.4*] -Parent=Opera 9.4 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (Linux*)*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.4 -Platform=MacOSX - -[Opera/9.4* (Windows 95*)*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Opera/9.4* (Windows 98*)*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Opera/9.4* (Windows CE*)*] -Parent=Opera 9.4 -Platform=WinCE -Win32=true - -[Opera/9.4* (Windows ME*)*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Opera/9.4* (Windows NT 4.0*)*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Opera/9.4* (Windows NT 5.0*)*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Opera/9.4* (Windows NT 5.1*)*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Opera/9.4* (Windows NT 5.2*)*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Opera/9.4* (Windows NT 6.0*)*] -Parent=Opera 9.4 -Platform=WinVista -Win32=true - -[Opera/9.4* (Windows NT 6.1*)*] -Parent=Opera 9.4 -Platform=Win7 - -[Opera/9.4* (Windows XP*)*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Opera/9.4* (X11; FreeBSD*)*] -Parent=Opera 9.4 -Platform=FreeBSD - -[Opera/9.4* (X11; Linux*)*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (X11; SunOS*)*] -Parent=Opera 9.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.5 - -[Opera 9.5] -Parent=DefaultProperties -Browser=Opera -Version=9.5 -MajorVer=9 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.5*] -Parent=Opera 9.5 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.5*] -Parent=Opera 9.5 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (Linux*)*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.5 -Platform=MacOSX - -[Opera/9.5* (Windows 95*)*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Opera/9.5* (Windows 98*)*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Opera/9.5* (Windows CE*)*] -Parent=Opera 9.5 -Platform=WinCE -Win32=true - -[Opera/9.5* (Windows ME*)*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Opera/9.5* (Windows NT 4.0*)*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Opera/9.5* (Windows NT 5.0*)*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Opera/9.5* (Windows NT 5.1*)*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Opera/9.5* (Windows NT 5.2*)*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Opera/9.5* (Windows NT 6.0*)*] -Parent=Opera 9.5 -Platform=WinVista -Win32=true - -[Opera/9.5* (Windows NT 6.1*)*] -Parent=Opera 9.5 -Platform=Win7 - -[Opera/9.5* (Windows XP*)*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Opera/9.5* (X11; FreeBSD*)*] -Parent=Opera 9.5 -Platform=FreeBSD - -[Opera/9.5* (X11; Linux*)*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (X11; SunOS*)*] -Parent=Opera 9.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.6 - -[Opera 9.6] -Parent=DefaultProperties -Browser=Opera -Version=9.6 -MajorVer=9 -MinorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.6*] -Parent=Opera 9.6 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.6*] -Parent=Opera 9.6 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (Linux*)*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.6 -Platform=MacOSX - -[Opera/9.6* (Windows 95*)*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Opera/9.6* (Windows 98*)*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Opera/9.6* (Windows CE*)*] -Parent=Opera 9.6 -Platform=WinCE -Win32=true - -[Opera/9.6* (Windows ME*)*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Opera/9.6* (Windows NT 4.0*)*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Opera/9.6* (Windows NT 5.0*)*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Opera/9.6* (Windows NT 5.1*)*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Opera/9.6* (Windows NT 5.2*)*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Opera/9.6* (Windows NT 6.0*)*] -Parent=Opera 9.6 -Platform=WinVista -Win32=true - -[Opera/9.6* (Windows NT 6.1*)*] -Parent=Opera 9.6 -Platform=Win7 - -[Opera/9.6* (Windows XP*)*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Opera/9.6* (X11; FreeBSD*)*] -Parent=Opera 9.6 -Platform=FreeBSD - -[Opera/9.6* (X11; Linux*)*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (X11; SunOS*)*] -Parent=Opera 9.6 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.0 - -[Netscape 4.0] -Parent=DefaultProperties -Browser=Netscape -Version=4.0 -MajorVer=4 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0*(Macintosh*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=MacPPC - -[Mozilla/4.0*(Win95;*] -Parent=Netscape 4.0 -Platform=Win95 - -[Mozilla/4.0*(Win98;*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=Win98 - -[Mozilla/4.0*(WinNT*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=WinNT - -[Mozilla/4.0*(X11;*)] -Parent=Netscape 4.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.5 - -[Netscape 4.5] -Parent=DefaultProperties -Browser=Netscape -Version=4.5 -MajorVer=4 -MinorVer=5 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.5*(Macintosh; ?; PPC)] -Parent=Netscape 4.5 -Platform=MacPPC - -[Mozilla/4.5*(Win2000; ?)] -Parent=Netscape 4.5 -Platform=Win2000 - -[Mozilla/4.5*(Win95; ?)] -Parent=Netscape 4.5 -Platform=Win95 - -[Mozilla/4.5*(Win98; ?)] -Parent=Netscape 4.5 -Platform=Win98 - -[Mozilla/4.5*(WinME; ?)] -Parent=Netscape 4.5 -Platform=WinME - -[Mozilla/4.5*(WinNT; ?)] -Parent=Netscape 4.5 -Platform=WinNT - -[Mozilla/4.5*(WinXP; ?)] -Parent=Netscape 4.5 -Platform=WinXP - -[Mozilla/4.5*(X11*)] -Parent=Netscape 4.5 -Platform=Linux - -[Mozilla/4.51*(Macintosh; ?; PPC)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 - -[Mozilla/4.51*(Win2000; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win2000 - -[Mozilla/4.51*(Win95; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win95 - -[Mozilla/4.51*(Win98; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win98 - -[Mozilla/4.51*(WinME; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinME - -[Mozilla/4.51*(WinNT; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinNT - -[Mozilla/4.51*(WinXP; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinXP - -[Mozilla/4.51*(X11*)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.6 - -[Netscape 4.6] -Parent=DefaultProperties -Browser=Netscape -Version=4.6 -MajorVer=4 -MinorVer=6 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.6 * (OS/2; ?)] -Parent=Netscape 4.6 -Platform=OS/2 - -[Mozilla/4.6*(Macintosh; ?; PPC)] -Parent=Netscape 4.6 -Platform=MacPPC - -[Mozilla/4.6*(Win95; ?)] -Parent=Netscape 4.6 -Platform=Win95 - -[Mozilla/4.6*(Win98; ?)] -Parent=Netscape 4.6 -Platform=Win98 - -[Mozilla/4.6*(WinNT; ?)] -Parent=Netscape 4.6 -Platform=WinNT - -[Mozilla/4.61*(Macintosh; ?; PPC)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=MacPPC - -[Mozilla/4.61*(OS/2; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=OS/2 - -[Mozilla/4.61*(Win95; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=Win95 - -[Mozilla/4.61*(Win98; ?)] -Parent=Netscape 4.6 -Version=4.61 -Platform=Win98 - -[Mozilla/4.61*(WinNT; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=WinNT - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.7 - -[Netscape 4.7] -Parent=DefaultProperties -Browser=Netscape -Version=4.7 -MajorVer=4 -MinorVer=7 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.7 * (Win2000; ?)] -Parent=Netscape 4.7 -Platform=Win2000 - -[Mozilla/4.7*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=MacPPC - -[Mozilla/4.7*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win95 - -[Mozilla/4.7*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win98 - -[Mozilla/4.7*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=WinNT -Win32=true - -[Mozilla/4.7*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win2000 -Win32=true - -[Mozilla/4.7*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=WinXP -Win32=true - -[Mozilla/4.7*(WinNT; ?)*] -Parent=Netscape 4.7 -Platform=WinNT - -[Mozilla/4.7*(X11*)*] -Parent=Netscape 4.7 -Platform=Linux - -[Mozilla/4.7*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Platform=SunOS - -[Mozilla/4.71*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=MacPPC - -[Mozilla/4.71*(Win95; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win95 - -[Mozilla/4.71*(Win98; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win98 - -[Mozilla/4.71*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinNT -Win32=true - -[Mozilla/4.71*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win2000 -Win32=true - -[Mozilla/4.71*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinXP -Win32=true - -[Mozilla/4.71*(WinNT; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinNT - -[Mozilla/4.71*(X11*)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Linux - -[Mozilla/4.71*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=SunOS - -[Mozilla/4.72*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=MacPPC - -[Mozilla/4.72*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win95 - -[Mozilla/4.72*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win98 - -[Mozilla/4.72*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinNT -Win32=true - -[Mozilla/4.72*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win2000 -Win32=true - -[Mozilla/4.72*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinXP -Win32=true - -[Mozilla/4.72*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinNT - -[Mozilla/4.72*(X11*)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Linux - -[Mozilla/4.72*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=SunOS - -[Mozilla/4.73*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=MacPPC - -[Mozilla/4.73*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win95 - -[Mozilla/4.73*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win98 - -[Mozilla/4.73*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinNT -Win32=true - -[Mozilla/4.73*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win2000 -Win32=true - -[Mozilla/4.73*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinXP -Win32=true - -[Mozilla/4.73*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinNT - -[Mozilla/4.73*(X11*)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Linux - -[Mozilla/4.73*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=SunOS - -[Mozilla/4.74*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=MacPPC - -[Mozilla/4.74*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win95 - -[Mozilla/4.74*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win98 - -[Mozilla/4.74*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinNT -Win32=true - -[Mozilla/4.74*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win2000 -Win32=true - -[Mozilla/4.74*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinXP -Win32=true - -[Mozilla/4.74*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinNT - -[Mozilla/4.74*(X11*)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Linux - -[Mozilla/4.74*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=SunOS - -[Mozilla/4.75*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=MacPPC - -[Mozilla/4.75*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win95 - -[Mozilla/4.75*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win98 - -[Mozilla/4.75*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinNT -Win32=true - -[Mozilla/4.75*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win2000 -Win32=true - -[Mozilla/4.75*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinXP -Win32=true - -[Mozilla/4.75*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinNT - -[Mozilla/4.75*(X11*)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Linux - -[Mozilla/4.75*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=SunOS - -[Mozilla/4.76*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=MacPPC - -[Mozilla/4.76*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win95 - -[Mozilla/4.76*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win98 - -[Mozilla/4.76*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinNT -Win32=true - -[Mozilla/4.76*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win2000 -Win32=true - -[Mozilla/4.76*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinXP -Win32=true - -[Mozilla/4.76*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinNT - -[Mozilla/4.76*(X11*)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Linux - -[Mozilla/4.76*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=SunOS - -[Mozilla/4.77*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=MacPPC - -[Mozilla/4.77*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win95 - -[Mozilla/4.77*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win98 - -[Mozilla/4.77*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinNT -Win32=true - -[Mozilla/4.77*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win2000 -Win32=true - -[Mozilla/4.77*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinXP -Win32=true - -[Mozilla/4.77*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinNT - -[Mozilla/4.77*(X11*)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Linux - -[Mozilla/4.77*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=SunOS - -[Mozilla/4.78*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=MacPPC - -[Mozilla/4.78*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win95 - -[Mozilla/4.78*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win98 - -[Mozilla/4.78*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinNT -Win32=true - -[Mozilla/4.78*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win2000 -Win32=true - -[Mozilla/4.78*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinXP -Win32=true - -[Mozilla/4.78*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinNT - -[Mozilla/4.78*(X11*)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Linux - -[Mozilla/4.78*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=SunOS - -[Mozilla/4.79*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=MacPPC - -[Mozilla/4.79*(Win95; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win95 - -[Mozilla/4.79*(Win98; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win98 - -[Mozilla/4.79*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinNT -Win32=true - -[Mozilla/4.79*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win2000 -Win32=true - -[Mozilla/4.79*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinXP -Win32=true - -[Mozilla/4.79*(WinNT; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinNT - -[Mozilla/4.79*(X11*)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Linux - -[Mozilla/4.79*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.8 - -[Netscape 4.8] -Parent=DefaultProperties -Browser=Netscape -Version=4.8 -MajorVer=4 -MinorVer=8 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.8*(Macintosh; ?; MacPPC)*] -Parent=Netscape 4.8 -Platform=MacPPC - -[Mozilla/4.8*(Macintosh; ?; PPC Mac OS X*] -Parent=Netscape 4.8 -Platform=MacOSX - -[Mozilla/4.8*(Macintosh; ?; PPC)*] -Parent=Netscape 4.8 -Platform=MacPPC - -[Mozilla/4.8*(Win95; *)*] -Parent=Netscape 4.8 - -[Mozilla/4.8*(Win98; *)*] -Parent=Netscape 4.8 -Platform=Win98 - -[Mozilla/4.8*(Windows NT 4.0; *)*] -Parent=Netscape 4.8 -Platform=WinNT -Win32=true - -[Mozilla/4.8*(Windows NT 5.0; *)*] -Parent=Netscape 4.8 -Platform=Win2000 -Win32=true - -[Mozilla/4.8*(Windows NT 5.1; *)*] -Parent=Netscape 4.8 -Platform=WinXP -Win32=true - -[Mozilla/4.8*(WinNT; *)*] -Parent=Netscape 4.8 -Platform=WinNT - -[Mozilla/4.8*(X11; *)*] -Parent=Netscape 4.8 -Platform=Linux - -[Mozilla/4.8*(X11; *SunOS*)*] -Parent=Netscape 4.8 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.0 - -[Netscape 6.0] -Parent=DefaultProperties -Browser=Netscape -Version=6.0 -MajorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.1 - -[Netscape 6.1] -Parent=DefaultProperties -Browser=Netscape -Version=6.1 -MajorVer=6 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.2 - -[Netscape 6.2] -Parent=DefaultProperties -Browser=Netscape -Version=6.2 -MajorVer=6 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.0 - -[Netscape 7.0] -Parent=DefaultProperties -Browser=Netscape -Version=7.0 -MajorVer=7 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win*9x 4.90; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.1 - -[Netscape 7.1] -Parent=DefaultProperties -Browser=Netscape -Version=7.1 -MajorVer=7 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/7.1] -Parent=Netscape 7.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.2 - -[Netscape 7.2] -Parent=DefaultProperties -Browser=Netscape -Version=7.2 -MajorVer=7 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 8.0 - -[Netscape 8.0] -Parent=DefaultProperties -Browser=Netscape -Version=8.0 -MajorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 8.1 - -[Netscape 8.1] -Parent=DefaultProperties -Browser=Netscape -Version=8.1 -MajorVer=8 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.0 - -[SeaMonkey 1.0] -Parent=DefaultProperties -Browser=SeaMonkey -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.8*) Gecko/20060221 SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.1 - -[SeaMonkey 1.1] -Parent=DefaultProperties -Browser=SeaMonkey -Version=1.1 -MajorVer=1 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.8*) Gecko/20060221 SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 2.0 - -[SeaMonkey 2.0] -Parent=DefaultProperties -Browser=SeaMonkey -Version=2.0 -MajorVer=2 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.9*) Gecko/20060221 SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Flock 1.0 - -[Flock 1.0] -Parent=DefaultProperties -Browser=Flock -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; U; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinME - -[Mozilla/5.0 (Windows; U; Windows NT 5.0*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; U; Windows NT 5.1*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Flock 2.0 - -[Flock 2.0] -Parent=DefaultProperties -Browser=Flock -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; U; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinME - -[Mozilla/5.0 (Windows; U; Windows NT 5.0*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; U; Windows NT 5.1*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sleipnir 2.0 - -[Sleipnir] -Parent=DefaultProperties -Browser=Sleipnir -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.0*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.1*) Sleipnir/2.*] -Parent=Sleipnir -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.2*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 6.0*) Sleipnir/2.*] -Parent=Sleipnir -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 6.1*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win7 - -[Sleipnir*] -Parent=Sleipnir - -[Sleipnir/2.*] -Parent=Sleipnir - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fennec 1.0 - -[Fennec 1.0] -Parent=DefaultProperties -Browser=Firefox Mobile -Version=1.0 -MajorVer=1 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firebird - -[Firebird] -Parent=DefaultProperties -Browser=Firebird -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Linux; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird Browser/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; IRIX*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox - -[Firefox] -Parent=DefaultProperties -Browser=Firefox -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (OS/2; *; Warp*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (Windows NT 5.?; ?; rv:1.*) Gecko/* Firefox] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.*; *; rv:1.*) Gecko/* Deer Park/Alpha*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firefox/10.5] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; FreeBSD*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; HP-UX*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; Linux*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.0 - -[Firefox 1.0] -Parent=DefaultProperties -Browser=Firefox -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=MacPPC - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; *Linux*; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; DragonFly*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.4 - -[Firefox 1.4] -Parent=DefaultProperties -Browser=Firefox -Version=1.4 -MajorVer=1 -MinorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.5 - -[Firefox 1.5] -Parent=DefaultProperties -Browser=Firefox -Version=1.5 -MajorVer=1 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=OS/2 - -[Mozilla/5.0 (rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2 x64; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 2.0 - -[Firefox 2.0] -Parent=DefaultProperties -Browser=Firefox -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.0 - -[Firefox 3.0] -Parent=DefaultProperties -Browser=Firefox -Version=3.0 -MajorVer=3 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.1 - -[Firefox 3.1] -Parent=DefaultProperties -Browser=Firefox -Version=3.1 -MajorVer=3 -MinorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.5 - -[Firefox 3.5] -Parent=DefaultProperties -Browser=Firefox -Version=3.5 -MajorVer=3 -MinorVer=5 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Phoenix - -[Phoenix] -Parent=DefaultProperties -Browser=Phoenix -Version=0.5 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iceweasel - -[Iceweasel] -Parent=DefaultProperties -Browser=Iceweasel -Platform=Linux -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.8*) Gecko/* Iceweasel/2.0* (Debian-*)] -Parent=Iceweasel -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.0 - -[Mozilla 1.0] -Parent=DefaultProperties -Browser=Mozilla -Version=1.0 -MajorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.0.*) Gecko/*] -Parent=Mozilla 1.0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.1 - -[Mozilla 1.1] -Parent=DefaultProperties -Browser=Mozilla -Version=1.1 -MajorVer=1 -MinorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.1.*) Gecko/*] -Parent=Mozilla 1.1 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.2 - -[Mozilla 1.2] -Parent=DefaultProperties -Browser=Mozilla -Version=1.2 -MajorVer=1 -MinorVer=2 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.2.*) Gecko/*] -Parent=Mozilla 1.2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.3 - -[Mozilla 1.3] -Parent=DefaultProperties -Browser=Mozilla -Version=1.3 -MajorVer=1 -MinorVer=3 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.3.*) Gecko/*] -Parent=Mozilla 1.3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.4 - -[Mozilla 1.4] -Parent=DefaultProperties -Browser=Mozilla -Version=1.4 -MajorVer=1 -MinorVer=4 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.5 - -[Mozilla 1.5] -Parent=DefaultProperties -Browser=Mozilla -Version=1.5 -MajorVer=1 -MinorVer=5 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.6 - -[Mozilla 1.6] -Parent=DefaultProperties -Browser=Mozilla -Version=1.6 -MajorVer=1 -MinorVer=6 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.7 - -[Mozilla 1.7] -Parent=DefaultProperties -Browser=Mozilla -Version=1.7 -MajorVer=1 -MinorVer=7 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (*rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.8 - -[Mozilla 1.8] -Parent=DefaultProperties -Browser=Mozilla -Version=1.8 -MajorVer=1 -MinorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (*rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.9 - -[Mozilla 1.9] -Parent=DefaultProperties -Browser=Mozilla -Version=1.9 -MajorVer=1 -MinorVer=9 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE Mac - -[IE Mac] -Parent=DefaultProperties -Browser=IE -Platform=MacPPC -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/?.? (compatible; MSIE 4.0*; *Mac_PowerPC*] -Parent=IE Mac -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Mozilla/?.? (compatible; MSIE 4.5*; *Mac_PowerPC*] -Parent=IE Mac -Version=4.5 -MajorVer=4 -MinorVer=5 - -[Mozilla/?.? (compatible; MSIE 5.0*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.0 -MajorVer=5 -MinorVer=0 - -[Mozilla/?.? (compatible; MSIE 5.1*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/?.? (compatible; MSIE 5.2*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.2 -MajorVer=5 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 5.5 - -[AOL 9.0/IE 5.5] -Parent=DefaultProperties -Browser=AOL -Version=5.5 -MajorVer=5 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 5.5; *AOL 9.0*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 6.0 - -[AOL 9.0/IE 6.0] -Parent=DefaultProperties -Browser=AOL -Version=6.0 -MajorVer=6 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 6.0; *AOL 9.0*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 7.0 - -[AOL 9.0/IE 7.0] -Parent=DefaultProperties -Browser=AOL -Version=7.0 -MajorVer=7 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 - -[Mozilla/?.* (?compatible; *MSIE 7.0; *AOL 9.0*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Avant Browser - -[Avant Browser] -Parent=DefaultProperties -Browser=Avant Browser -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Advanced Browser (http://www.avantbrowser.com)] -Parent=Avant Browser - -[Avant Browser*] -Parent=Avant Browser - -[Avant Browser/*] -Parent=Avant Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 4.01 - -[IE 4.01] -Parent=DefaultProperties -Browser=IE -Version=4.01 -MajorVer=4 -MinorVer=01 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 4.01*)*] -Parent=IE 4.01 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 95*)*] -Parent=IE 4.01 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 98*)*] -Parent=IE 4.01 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 4.01 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 4.0*)*] -Parent=IE 4.01 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.0*)*] -Parent=IE 4.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.01*)*] -Parent=IE 4.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 4.01; Windows NT)] -Parent=IE 4.01 -Platform=WinNT - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.0 - -[IE 5.0] -Parent=DefaultProperties -Browser=IE -Version=5.0 -MajorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 5.0*)*] -Parent=IE 5.0 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 95*)*] -Parent=IE 5.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98*)*] -Parent=IE 5.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 5.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 4.0*)*] -Parent=IE 5.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.0*)*] -Parent=IE 5.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.01*)*] -Parent=IE 5.0 -Platform=Win2000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.01 - -[IE 5.01] -Parent=DefaultProperties -Browser=IE -Version=5.01 -MajorVer=5 -MinorVer=01 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 5.01*)*] -Parent=IE 5.01 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 95*)*] -Parent=IE 5.01 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98*)*] -Parent=IE 5.01 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 5.01 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 4.0*)*] -Parent=IE 5.01 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.0*)*] -Parent=IE 5.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.01*)*] -Parent=IE 5.01 -Platform=Win2000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.5 - -[IE 5.5] -Parent=DefaultProperties -Browser=IE -Version=5.5 -MajorVer=5 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 5.5*)*] -Parent=IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 95*)*] -Parent=IE 5.5 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98*)*] -Parent=IE 5.5 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98; Win 9x 4.90*)*] -Parent=IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 4.0*)*] -Parent=IE 5.5 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.0*)*] -Parent=IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.01*)*] -Parent=IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.1*)*] -Parent=IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.2*)*] -Parent=IE 5.5 -Platform=Win2003 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 6.0 - -[IE 6.0] -Parent=DefaultProperties -Browser=IE -Version=6.0 -MajorVer=6 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -w3cdomversion=1.0 -msdomversion=6.0 - -[Mozilla/?.* (?compatible; *MSIE 6.0*)*] -Parent=IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 95*)*] -Parent=IE 6.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98*)*] -Parent=IE 6.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98; Win 9x 4.90*)*] -Parent=IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 4.0*)*] -Parent=IE 6.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.0*)*] -Parent=IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.01*)*] -Parent=IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.1*)*] -Parent=IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2*)*] -Parent=IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*Win64;*)*] -Parent=IE 6.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*WOW64;*)*] -Parent=IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 6.0*)*] -Parent=IE 6.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 7.0 - -[IE 7.0] -Parent=DefaultProperties -Browser=IE -Version=7.0 -MajorVer=7 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -msdomversion=7.0 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 7.0*)*] -Parent=IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98*)*] -Parent=IE 7.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 4.0*)*] -Parent=IE 7.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.0*)*] -Parent=IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.01*)*] -Parent=IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.1*)*] -Parent=IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2*)*] -Parent=IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*Win64;*)*] -Parent=IE 7.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*WOW64;*)*] -Parent=IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.0*)*] -Parent=IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.1*)*] -Parent=IE 7.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; *)*] -Parent=IE 7.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 8.0 - -[IE 8.0] -Parent=DefaultProperties -Browser=IE -Version=8.0 -MajorVer=8 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=3 -supportsCSS=true -ecmascriptversion=1.2 -msdomversion=8.0 -w3cdomversion=1.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Win32*)*] -Parent=IE 8.0 -Platform=Win32 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0*)*] -Parent=IE 8.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1*)*] -Parent=IE 8.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2*)*] -Parent=IE 8.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Win64; x64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista -Win64=false - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1*)*] -Parent=IE 8.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 -Win64=false - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 7.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Default Browser - -[*] -Browser=Default Browser -Version=0 -MajorVer=0 -MinorVer=0 -Platform=unknown -Alpha=false -Beta=false -Win16=false -Win32=false -Win64=false -Frames=true -IFrames=false -Tables=true -Cookies=false -BackgroundSounds=false -CDF=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -Stripper=false -isBanned=false -isMobileDevice=false -isSyndicationReader=false -Crawler=false -CssVersion=0 -supportsCSS=false -AOL=false -aolVersion=0 -AuthenticodeUpdate=0 -CSS=0 -WAP=false -netCLR=false -ClrVersion=0 -ECMAScriptVersion=0.0 -W3CDOMVersion=0.0 diff --git a/Source/Platforms/Editor/Linux/Mono/etc/mono/config b/Source/Platforms/Editor/Linux/Mono/etc/mono/config deleted file mode 100644 index 385128f74..000000000 --- a/Source/Platforms/Editor/Linux/Mono/etc/mono/config +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/etc/mono/mconfig/config.xml b/Source/Platforms/Editor/Linux/Mono/etc/mono/mconfig/config.xml deleted file mode 100644 index a3df3b5e9..000000000 --- a/Source/Platforms/Editor/Linux/Mono/etc/mono/mconfig/config.xml +++ /dev/null @@ -1,616 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - - -]]> - - - - - - -
-
-
- - - - - -
- -
-
-
-
- - - -]]> - - - - - -
-
-
-
-
-
-
- - - - - -]]> - - - - - -
-
-
-
-
-
-
- - - - - - - - -]]> - - - - - -
-
-
-
-
- - - - - - - -]]> - - - - - -
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
- - - - - - - - - - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - - - - - -]]> - - - - - - - -
-
-
- - - - - -
- -
-
-
- - - - ]]> - - - - - -
-
-
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
- - - - - - - -]]> - - - - - -
-
-
-
-
- - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - -]]> - - - - - - -
-
-
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
-
-
- - - - - - - - - - - -]]> - - - - - -
-
-
-
-
- - - - -]]> - - - - - - - - ]]> - - - - - - ]]> - - - - - - ]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - -
-
-
-
-
-
- - diff --git a/Source/Platforms/Editor/Linux/Mono/lib/libMonoPosixHelper.so b/Source/Platforms/Editor/Linux/Mono/lib/libMonoPosixHelper.so deleted file mode 100755 index 09ccce98c..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/libMonoPosixHelper.so +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f7e3cc08554aeec9cd731493c685e054fdc369fdcb99671b3fc791ddb449754 -size 953416 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/libmono-native.so b/Source/Platforms/Editor/Linux/Mono/lib/libmono-native.so deleted file mode 100644 index b2f93e404..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/libmono-native.so +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c398b22f122c52e8554af5560e9788648941f0f9598df5c430fdda676413db2 -size 181240 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/libmono-native.so.0.0.0 b/Source/Platforms/Editor/Linux/Mono/lib/libmono-native.so.0.0.0 deleted file mode 100755 index 888a82c8c..000000000 Binary files a/Source/Platforms/Editor/Linux/Mono/lib/libmono-native.so.0.0.0 and /dev/null differ diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/Accessibility.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/Accessibility.dll deleted file mode 100755 index 6a19d88c6..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/Accessibility.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f418319d6c6c3407828125fd3577b5751f0bac92e666d02ee52f5f83ca86af16 -size 9216 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/Mono.Posix.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/Mono.Posix.dll deleted file mode 100755 index 9d42676f7..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/Mono.Posix.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a65ab5a8d236bceb0a92f231df3360d9213f68dc9e106ae925fe5570b34d0f1 -size 91648 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/Mono.Security.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/Mono.Security.dll deleted file mode 100755 index fa3ecc844..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/Mono.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:143b73d95cfb381fc6f56f1a5fcf6ce288589e753e00205fca6863442f3cceb2 -size 76800 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ComponentModel.Composition.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ComponentModel.Composition.dll deleted file mode 100755 index 2ee210da3..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ComponentModel.Composition.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00668aceeb5932b303da50390234b60ab394be3cfd94a85473bee4d43242f8f8 -size 30208 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ComponentModel.DataAnnotations.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ComponentModel.DataAnnotations.dll deleted file mode 100755 index 5d03c6a14..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ComponentModel.DataAnnotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eab8975998fd91680c7e69b7fa6a7c97317e236696c73044da4d7b4eb1e0a147 -size 17920 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Configuration.Install.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Configuration.Install.dll deleted file mode 100755 index cc1288b4f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Configuration.Install.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a0dd81759186bd5d2b828bfed9d285aebc4ac3192dc83aafa4e6f27535226db -size 13824 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Configuration.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Configuration.dll deleted file mode 100755 index 235192de5..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Configuration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b83f740bb35cab7e2becafca96d06e34045dce958f8c87bab9b02f713411c3dc -size 46592 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Core.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Core.dll deleted file mode 100755 index fa3f647b2..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b779f0d6f3f069982e55cefd5b24a2e991cb5b66b3effc8dd346329827c5e6e -size 151552 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.DataSetExtensions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.DataSetExtensions.dll deleted file mode 100755 index 90da83068..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.DataSetExtensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e4d0e95d191686bf8db25a4bf05ecfce35e09794b569abf96c26cf4276212077 -size 9216 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.Entity.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.Entity.dll deleted file mode 100755 index 944e3b2fc..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.Entity.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0596d5d898f588fa00456868ff14ca71852dec09f38cb8ac30027a3d8b3d66d8 -size 237056 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.Linq.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.Linq.dll deleted file mode 100755 index 53d4b43c8..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ee6fe97abcc2f76c3016f05c7a1a3b9300de7b74ad8c798edab9c191c18f294 -size 36352 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.OracleClient.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.OracleClient.dll deleted file mode 100755 index 720ebf9ed..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.OracleClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:314a0eabe221715ac452c7cc39089b51e95fde04a4f21761dcae043f529af86d -size 39936 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.Services.Client.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.Services.Client.dll deleted file mode 100755 index 64e136022..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.Services.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80f609548a9ea24d5c194e5a69d948fe204f21a241d15b6b4f882929e16a73d9 -size 20992 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.Services.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.Services.dll deleted file mode 100755 index 7adbf0c4f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e9b8c59aa08eb580079cdbe0a3f5aaf5175dc97b6f719506a88fe3e171184d4 -size 39936 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.dll deleted file mode 100755 index 8740597c7..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c44d04706a708407c5289ed225b5afb25206aebbece74133c575ba43dff4e58 -size 193024 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Design.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Design.dll deleted file mode 100755 index 6b26c7dc3..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Design.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b8cc471f954883c5b173b088f7534df2b212feb4ec150899a96ca7d54a6437a -size 145920 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.DirectoryServices.Protocols.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.DirectoryServices.Protocols.dll deleted file mode 100755 index 5b2c7b18d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.DirectoryServices.Protocols.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be0fc9993294dc85f8b640ad6c5b0f9381b98c98fd0075ad41b788a015d7aa05 -size 40960 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.DirectoryServices.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.DirectoryServices.dll deleted file mode 100755 index 21b179b50..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.DirectoryServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ea0320dd6a9ce2a72e452ac39bae7f5549542a0736086eb5779deab821ea955 -size 72704 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Drawing.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Drawing.dll deleted file mode 100755 index 6d82028b3..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Drawing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:10fd5f9c7e846597dc902721565fe73ecb2c28bbdb3532338e719465480ef2f6 -size 140288 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Dynamic.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Dynamic.dll deleted file mode 100755 index 7b771bd42..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Dynamic.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20f4a2772e3ab1868b74c780e82140ccd2107d7a0b67ac7097a7ba71c104f06c -size 6144 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.EnterpriseServices.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.EnterpriseServices.dll deleted file mode 100755 index 23acdb5a5..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.EnterpriseServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a503b0361835e1bca720ff10810a3d2c3f940b4f1a22044dcef4df981c12f590 -size 35840 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.IO.Compression.FileSystem.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.IO.Compression.FileSystem.dll deleted file mode 100755 index 155d64c57..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.IO.Compression.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e47dc79fa563627ac47665b1c12e84cca70ba3a0511ba5e622ecce41e3c927fc -size 6656 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.IO.Compression.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.IO.Compression.dll deleted file mode 100755 index 39e2b3c2a..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.IO.Compression.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6afd5d113510fdc41dafb5e2e97f2306edd842c954415161cedbac2cc54140eb -size 7168 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.IdentityModel.Selectors.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.IdentityModel.Selectors.dll deleted file mode 100755 index e1ac3c28a..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.IdentityModel.Selectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae3c31cb8546ccd45583338db934cf6126c9911c2b2794ac7e61c31f4c577f0b -size 8704 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.IdentityModel.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.IdentityModel.dll deleted file mode 100755 index aff1d266a..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.IdentityModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0d1803e02c073b7d08122064d99e8181d22a90a836ac3b8dbe26f7fbb518c33 -size 138752 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Json.Microsoft.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Json.Microsoft.dll deleted file mode 100755 index 9e24068df..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Json.Microsoft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82500f979119736e0b9e6b381a91e6465f91b033e6fbf37eb95f20bb775bb0d4 -size 13312 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Json.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Json.dll deleted file mode 100755 index 984cedb44..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:862ad38f55710c88b5fcd75fa2358cf7de0384dd6eb5c935890279dd629933a9 -size 9728 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Management.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Management.dll deleted file mode 100755 index 5610d336a..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:245006b4dea9ac1244b437a3775ed3b52e1e5c32e32165f2ed5fb6113d397c70 -size 38912 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Messaging.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Messaging.dll deleted file mode 100755 index ec95be06b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:877a107807a6c05f1fcd6c0738825105b5d89e2a87c4a20fbe1c759ee626e52b -size 45568 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Net.Http.Formatting.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Net.Http.Formatting.dll deleted file mode 100755 index e2bc345df..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Net.Http.Formatting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d695096fce1eff031f13b4ca689d0d0b5961538934999acbeeddcef8e944442a -size 19456 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Net.Http.WebRequest.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Net.Http.WebRequest.dll deleted file mode 100755 index 32dcdcae2..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Net.Http.WebRequest.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d480aea7d03b22ed7fefc205c595792f488da2e501ba2c6d437ed2ccb263c193 -size 7168 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Net.Http.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Net.Http.dll deleted file mode 100755 index f840d72c7..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Net.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14cd23c05bba6303041d8de9a576f1fa944ca50a1f4d98358ad343d8be98d166 -size 30208 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Net.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Net.dll deleted file mode 100755 index e026f87a5..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Net.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1d7b996114150d80d462eebec77b72240f4fa20e802cdc7f1433f8cd96aeb97 -size 30208 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Numerics.Vectors.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Numerics.Vectors.dll deleted file mode 100755 index bd449ea8d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Numerics.Vectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e482bef161ba12bcb5989a901fb21e90162041827feed23f90e22f0474c82c43 -size 5632 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Numerics.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Numerics.dll deleted file mode 100755 index ae7d8c2b9..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b47b6661f2168b47d18e645b1b12548ba86dc5787be24862286a1f838b4be59 -size 11776 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Core.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Core.dll deleted file mode 100755 index 824927786..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f7ca64eb13c3576b50b63cef8130a717f3e7d774731ea8f15ae17a63d13f369 -size 22528 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Debugger.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Debugger.dll deleted file mode 100755 index c8929afe2..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Debugger.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e26bcf1fdcc249eab6d538f79432c0b9a478506c374d4eb0ed7bd521f610456 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Experimental.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Experimental.dll deleted file mode 100755 index 325b07a9b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Experimental.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7c56c7dc413fa222b1926c38f00222a7da1badee9718cc54c57450c01abe09a -size 9216 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Interfaces.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Interfaces.dll deleted file mode 100755 index 6898dacde..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Interfaces.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c12b395ce6caa4eee69a73f00fff7c66aa2a5695660c23ab241088e24c12c489 -size 7680 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Linq.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Linq.dll deleted file mode 100755 index 567b2185a..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:595bd82812ec34b94afa4ad07258098e0fa456afde6f80586f3c670f3cb2b6c5 -size 72704 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Observable.Aliases.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Observable.Aliases.dll deleted file mode 100755 index 5492c7f91..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Observable.Aliases.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e20a9ea5d5b009058b4b41b5d8bbcc958a9b0606829b3466140859bce708724 -size 8704 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.PlatformServices.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.PlatformServices.dll deleted file mode 100755 index bc69ac002..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.PlatformServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57414c47cc7a8b002dd4f21a81bea522bce6993d8f71836352d35501aa0d173f -size 7168 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Providers.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Providers.dll deleted file mode 100755 index 0dccfa8f1..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Providers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41cd43ed2ea280662b871e7f00c6ccbc413d05d782b6f3cd21f2892a0bcf3047 -size 68096 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Runtime.Remoting.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Runtime.Remoting.dll deleted file mode 100755 index 07983cf3a..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c82eec64bd4c842129becf8d7c8bf5493e00b00b359eb0787a6ab4bb394b0f5 -size 5632 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Windows.Forms.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Windows.Forms.dll deleted file mode 100755 index 8f761c230..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d6198c1332e4a2f199579566634273d995a770fe81023c42557875617071f93 -size 6144 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Windows.Threading.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Windows.Threading.dll deleted file mode 100755 index 971cbb95b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Reactive.Windows.Threading.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fef7bbe9630fb0cac28e79fcba6403b729922723f20e99516be6707b44e06114 -size 7168 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Runtime.Caching.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Runtime.Caching.dll deleted file mode 100755 index f03d95b7f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Runtime.Caching.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d4b23dc6a1bf423545575b98a5ed7830795ebe87473e2fc9ea7230ab3ddddfd -size 16896 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Runtime.DurableInstancing.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Runtime.DurableInstancing.dll deleted file mode 100755 index 4b639dcbe..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Runtime.DurableInstancing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2feb72896932b115c43379c3b84ba1ffb9a456139999c7b59411215a6cbabe6a -size 29184 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Runtime.Remoting.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Runtime.Remoting.dll deleted file mode 100755 index e70574aba..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6cae8b048e6ad843cbe754245493c83c6ce1a9b3a3aa3cee52db4cd0312dc5e1 -size 20480 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Runtime.Serialization.Formatters.Soap.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Runtime.Serialization.Formatters.Soap.dll deleted file mode 100755 index 293037e51..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Runtime.Serialization.Formatters.Soap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f303338dafa6113fce8b0d411c95e5bbfc9d6a9f49321df67cc61a9fb48531bb -size 7168 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Runtime.Serialization.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Runtime.Serialization.dll deleted file mode 100755 index 3aebe2f8d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Runtime.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e279ef544156ac22b7b7a6f1cf8136c8921555e3677dd2909b1c44c8b1cd5c1 -size 38912 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Security.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Security.dll deleted file mode 100755 index bdf0cada6..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9a63d5fee59f2504c4b424c0bcef6cba26f58c0822b99df89a6edbd031e57f6 -size 41472 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceModel.Activation.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceModel.Activation.dll deleted file mode 100755 index 04ef50028..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceModel.Activation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11068d7488aeb17ad239f797216e967ae10aee3aebc827e15088a099825ae68e -size 7680 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceModel.Discovery.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceModel.Discovery.dll deleted file mode 100755 index 63bb2bebc..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceModel.Discovery.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7c7f43e289c68df96db8f9eea38233706dc1ceed1e70be2d7e892501c4360c0 -size 36864 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceModel.Internals.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceModel.Internals.dll deleted file mode 100755 index 2c12f6888..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceModel.Internals.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:edae786715d120534ae5d66942723030a2eaa7cdc07a196fedc59869527da4a2 -size 18432 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceModel.Routing.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceModel.Routing.dll deleted file mode 100755 index fd3657a00..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceModel.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fed98c0430e9f486281ccfb60c955c881ad66f6c27ccc4364a9a7f5366eda41b -size 20480 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceModel.Web.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceModel.Web.dll deleted file mode 100755 index f35d63230..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceModel.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3122bd3e254bd77d17ad63ad7061a30ea31440a3431d96d030b074eb7c851cf0 -size 39424 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceModel.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceModel.dll deleted file mode 100755 index a9d1cbb41..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8607a197d53e798f8db553f9bcf9b56353a89555f9036b6ce93ebfa7e8231309 -size 551424 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceProcess.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceProcess.dll deleted file mode 100755 index a19edf597..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.ServiceProcess.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d76d89b226f886c007ee6d3ded7e16c3e037b9d3bac9255cb295d6fd8e0d4008 -size 17408 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Threading.Tasks.Dataflow.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Threading.Tasks.Dataflow.dll deleted file mode 100755 index 4ea1a88ef..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Threading.Tasks.Dataflow.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5a3a8d78926413c4a39a95ea2b4969d329a914b02b078499f2040a0178db5d4 -size 22016 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Transactions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Transactions.dll deleted file mode 100755 index cc8486b86..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Transactions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc70ac58220952bcbf3a80d2d8a0215df0d462c1f5a16938709b230f3d4a3361 -size 16384 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Abstractions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Abstractions.dll deleted file mode 100755 index cc0048359..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Abstractions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5075b0145363b7e45a1b041fdbcb80e67aeddf3dcb4bea04f18ce3fedfafc76d -size 6656 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.ApplicationServices.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.ApplicationServices.dll deleted file mode 100755 index edd2d0c71..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.ApplicationServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dcef740e267ddee487319afeb2bb65a706421ce96e3781222eba59445c538544 -size 13824 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.DynamicData.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.DynamicData.dll deleted file mode 100755 index 8618bf102..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.DynamicData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b5c084082f2df92014d345537bdc4f1d877416a2120db464310f460f71ef143 -size 36864 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Extensions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Extensions.dll deleted file mode 100755 index eb37c5e78..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:baa7603b9decee107df353502c3cff1bd420ba4eac11c4e516fdab58761adabc -size 98304 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Http.SelfHost.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Http.SelfHost.dll deleted file mode 100755 index bae32f55b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Http.SelfHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d62561aefc96c3c852e4ba34ceffa9da1575ff9ab1bd172ff5c3513e875c061a -size 9216 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Http.WebHost.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Http.WebHost.dll deleted file mode 100755 index c18a95dee..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Http.WebHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c096053c7ecbc52145881c04663c55ee13e58d3db70788291decbe2df93164b3 -size 7680 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Http.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Http.dll deleted file mode 100755 index 9dcb7f105..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a0366e666f6fa6c2759a68b88a95c0db4cd019d9623ffa129b760d4bea89151 -size 56320 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Mvc.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Mvc.dll deleted file mode 100755 index 48d2d1675..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Mvc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b89b7488afdddfa20f75d7eb72398d30ff21eb996f62335aaf57d31c7cf24178 -size 100864 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Razor.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Razor.dll deleted file mode 100755 index 8117fee52..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f27acfd4469e514e19615b8cd4770114cca563bf8031df807802297064d4a43 -size 60928 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Routing.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Routing.dll deleted file mode 100755 index 40ffdc4c2..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:392ecf2fa81d60e2e9b46eebee1cacc68f5cdd32fb73975266a1a61c044a5ae2 -size 6656 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Services.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Services.dll deleted file mode 100755 index 04664d5fb..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72be2ede82989fa51f1eaf5ac56c9838ffafc0129d216dd37a512daf48038f85 -size 80384 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.WebPages.Deployment.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.WebPages.Deployment.dll deleted file mode 100755 index bcfa7da97..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.WebPages.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2dd91160769f23ee0ffa7fe7e48d961c76c0181bbc442bc097d3b53eba03a03 -size 6144 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.WebPages.Razor.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.WebPages.Razor.dll deleted file mode 100755 index ed6d0ddcc..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.WebPages.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23053ef0a76dbb6e07d7d00ccaf1961af81b0934f5716b522e26634d548496dc -size 10752 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.WebPages.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.WebPages.dll deleted file mode 100755 index 6bfa18eb0..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.WebPages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:690a64f6ce4d5fb465114c78eb7ad55ccab1f06d1ade331eb1aa9ea43a93b2ac -size 35328 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.dll deleted file mode 100755 index 9f1e56bd3..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:85b82ea5215471276157f9b310300fc6c6a4fdc6820e68551ac176014df80e42 -size 913920 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Windows.Forms.DataVisualization.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Windows.Forms.DataVisualization.dll deleted file mode 100755 index 3b614a192..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Windows.Forms.DataVisualization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e82eca4263c69bf4c02841cbbd81e246777554cd6cd07380ded1143ac670878 -size 101888 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Windows.Forms.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Windows.Forms.dll deleted file mode 100755 index f98b428f2..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c93e17749f507b677b811a572e7de7a93e99d2532273a14261eb20927211e0eb -size 751616 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Windows.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Windows.dll deleted file mode 100755 index f1015ae64..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Windows.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b6b28979fdba11693c2e72b7855dac112420e821693cdd9376b00eff9858079 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Xaml.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Xaml.dll deleted file mode 100755 index 3bef8218d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Xaml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76f22594e51872517df1b9bfb9e3ae21c600d75472dd31eda70b09aa089e8c27 -size 46592 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Xml.Linq.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Xml.Linq.dll deleted file mode 100755 index 6aac055f2..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Xml.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d9b6bd7973c9d66659468e38bfb99c551fac1d92b71fd1c5701fbb54869aefc -size 22528 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Xml.Serialization.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Xml.Serialization.dll deleted file mode 100755 index cda7cfbbc..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Xml.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e73314602086cf1aac4d06177d8e3277a219d1ca9119f07d9baae4e3d83a79d2 -size 5632 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Xml.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Xml.dll deleted file mode 100755 index 51fa02da6..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1683fc53de62017fe812b9afeeefb8ac097d61a68bbb637714412594fcfeea1b -size 155648 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.dll deleted file mode 100755 index 450f3f28a..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/System.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ddedcd3eea73801d789ffd69abd8cdedb5999b8c1824cf7f24620fac6a8b5eb1 -size 495616 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/WindowsBase.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/WindowsBase.dll deleted file mode 100755 index dd81a697d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/WindowsBase.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9aba66826546888ae8b68e64db6254ad2879339928c8444533dc9b049ac29c10 -size 82944 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/mscorlib.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/mscorlib.dll deleted file mode 100755 index 4f435f25d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5-api/mscorlib.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22fea24e2681a3f38a2ff4ad7fdbb9227c6e7b7e88e786bfedc0171456b9451b -size 829440 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Accessibility.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Accessibility.dll deleted file mode 100644 index ec03d154b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Accessibility.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad0831c5a0384a5f0d1e1034568de54dacf581b5f6f54eaaa53b4ba76d4a0ecb -size 12288 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Primitives.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Primitives.dll deleted file mode 100755 index d61a5ae27..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ecf18f218ef39cd6b48c37a3ddfa8b1762405c830d7dba28266efed219bdb5ed -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Registry.AccessControl.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Registry.AccessControl.dll deleted file mode 100755 index a413e0e52..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Registry.AccessControl.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6187997334164f406999e479a049bfb6a8e39ad5b691064928abb709b920f558 -size 5632 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Registry.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Registry.dll deleted file mode 100755 index 5d5c09930..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Registry.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c963b7d5e10ece8b1c4749e9697c15dd8a0b4a63d9a2745fe2db6db6d8c86aa -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.AppContext.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.AppContext.dll deleted file mode 100755 index 6f1825282..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.AppContext.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21d59dc6c476cb5b6046d2aabb1c546d2316d037800babeac4b3bd593b2e0f24 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Collections.Concurrent.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Collections.Concurrent.dll deleted file mode 100755 index 5751d62f3..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Collections.Concurrent.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f4d1ab088c05cc65e1ca8b5cbcacf8847b879e3a26ef0eb4c4c05e17248f860 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Collections.NonGeneric.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Collections.NonGeneric.dll deleted file mode 100755 index 94952c4d3..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Collections.NonGeneric.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8fb21d60f04e06bbac36682cbc0d4d92fb2ad749af0a2a3380410dbf2ae29432 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Collections.Specialized.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Collections.Specialized.dll deleted file mode 100755 index 87f61fffd..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Collections.Specialized.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36561f5d20732afa1575b2c0dcf6a5f410476e1e82043a63dcc632bda1815195 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Collections.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Collections.dll deleted file mode 100755 index 14a27a56c..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Collections.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b7e08d59a9546943dc06cc2cec224bab0ea02c73a7ea4a69c6a740cf243350a -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ComponentModel.Annotations.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ComponentModel.Annotations.dll deleted file mode 100755 index a214ea20a..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ComponentModel.Annotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42a1cd0d87ad65415e0662771edb761ab40e9d1bc9b7e845cfeb99dbda4da930 -size 6144 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ComponentModel.EventBasedAsync.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ComponentModel.EventBasedAsync.dll deleted file mode 100755 index 2eb2170ff..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ComponentModel.EventBasedAsync.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8117fb0c8e3395c1399f22d93ba4b0984034f96eb5daa2e323c3f9aff07deb1e -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ComponentModel.Primitives.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ComponentModel.Primitives.dll deleted file mode 100755 index 9561a3908..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ComponentModel.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20a5dd35bb565e7baf6cba4d80b161dd46088d349f323f58088cbe8f95f7d053 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ComponentModel.TypeConverter.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ComponentModel.TypeConverter.dll deleted file mode 100755 index d882c2d5f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ComponentModel.TypeConverter.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d1267c20427cca76cc39c909dc130ceb5525ee57f4a256c9b76db099db9dd5a -size 6144 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ComponentModel.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ComponentModel.dll deleted file mode 100755 index 9454d5ce5..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ComponentModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e2d221a9f4577828e29d53236149bf4bc624594aaef75d478d2b46ee482fff4 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Console.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Console.dll deleted file mode 100755 index 55c4048b3..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Console.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de8f340cc4b79a39d9082f66ff1267adbcb94a3deb4cf2486c90be9ff0a84b51 -size 4096 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Data.Common.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Data.Common.dll deleted file mode 100755 index a16a505b5..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Data.Common.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e10fa60ffb1f2d0416e6d4b32ef4256514322859624d3b2fa4c16036daa64e9b -size 9728 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Data.SqlClient.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Data.SqlClient.dll deleted file mode 100755 index eb89df4ea..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Data.SqlClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e461922ab23a60a9ccc3a3298adff8f0d0136dc93d14deea246b664fc751fbb4 -size 6144 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.Contracts.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.Contracts.dll deleted file mode 100755 index b3546ed8b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.Contracts.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b07e1b3851be552690e01d37dd3b76dc7ecbcf4d21280be48edf5c095175e349 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.Debug.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.Debug.dll deleted file mode 100755 index 07cbecf06..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.Debug.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8acc99f91a463abe106f06f6f5d2bf5dd5fdb755ea5745c52872365122bc5e26 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.FileVersionInfo.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.FileVersionInfo.dll deleted file mode 100755 index b7d4a88c5..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.FileVersionInfo.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18cbb06e7fa6268063f32ad6147581edc65c876ea7bb8bfedcda8167bc147efd -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.Process.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.Process.dll deleted file mode 100755 index 19cc70897..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.Process.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ee60191fbb93926a540556af13896a9bbffdc8f05712bc1a20f177dfae714ba -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.StackTrace.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.StackTrace.dll deleted file mode 100755 index 1c5143fa0..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.StackTrace.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2956ecf2b31d4a971e76d9a777c7ea60491c3bd108b7e6c1bd66578e3d19f0a -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.TextWriterTraceListener.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.TextWriterTraceListener.dll deleted file mode 100755 index b03de9763..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.TextWriterTraceListener.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30751101f4f31bd3d3c8023a412deada10875c0735ac6f31596e112d9f8fb7d1 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.Tools.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.Tools.dll deleted file mode 100755 index f33a83738..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.Tools.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff2f1df9e1feb016a595424f48af1c1820bda4630680e5e1b6f178ab6bc83da0 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.TraceEvent.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.TraceEvent.dll deleted file mode 100755 index 931ed645f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.TraceEvent.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d71212943eece9dbf5bd6c464b01ad20677dd233dabeea7a8035c2f54e83654b -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.TraceSource.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.TraceSource.dll deleted file mode 100755 index 01eb2646f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.TraceSource.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91efe8bdfcffabac4c71df60ac8f515668b41fc70d695835847b8810895b282f -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.Tracing.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.Tracing.dll deleted file mode 100755 index 7500ed9a2..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Diagnostics.Tracing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:263dfdd40d6701753a843fc13ccd7303e60e53ffbdcb1088fbbf240298edfd48 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Drawing.Primitives.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Drawing.Primitives.dll deleted file mode 100755 index 8e2c066a6..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Drawing.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6188e64b0802a7a8805f63689f4a1f70f45d8fb85ce5d5338dfdb4ea599aab7 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Dynamic.Runtime.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Dynamic.Runtime.dll deleted file mode 100755 index 5a8af43b6..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Dynamic.Runtime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:312f44cde35ee6b4327e1c0d7eb13e13ff400b98cdc2f1df4c2dbf652db141b3 -size 5632 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Globalization.Calendars.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Globalization.Calendars.dll deleted file mode 100755 index 938a32b8b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Globalization.Calendars.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:628e49f6a8cf333f0af9e702d00c720ed248c9a3332f750cb2fcfbb095f46ab1 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Globalization.Extensions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Globalization.Extensions.dll deleted file mode 100755 index 732f9f128..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Globalization.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae8b233a1265ad27479389ce76936f5664523bdb46d9ba1e94a328ddf6832e03 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Globalization.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Globalization.dll deleted file mode 100755 index 8b297f35b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Globalization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bfb79022e27b9c079b36a5920b82501416aea0b6e81536fb0b499119faaf9143 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.Compression.ZipFile.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.Compression.ZipFile.dll deleted file mode 100755 index dcfa03b79..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.Compression.ZipFile.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d505ea219c25aa42a89647bb15ccc172a669ac79d46345b7ec7ef7e3a91aa88c -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.AccessControl.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.AccessControl.dll deleted file mode 100755 index 38fa02416..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.AccessControl.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19d1bd3d0bd9693b4f1639eddbcc9bbcc998ad6eb094310627d4313fe5201ce9 -size 5632 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.DriveInfo.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.DriveInfo.dll deleted file mode 100755 index 7167768f3..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.DriveInfo.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64e662b61483b1e1804eb78b70b62051371da6c5de0c0f193771173b97ed8b06 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.Primitives.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.Primitives.dll deleted file mode 100755 index e54adcfe2..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fafef8c0fce6a5f824880453e99060165b7612fa55d3d339a83d2111012d1997 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.Watcher.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.Watcher.dll deleted file mode 100755 index 9d38fb401..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.Watcher.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6aaff752b377337f4437629fe8fe6d79fe6bea2d84082f3e0f8eefb9cd7b352e -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.dll deleted file mode 100755 index 583106521..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82c4619f4af237058a1e7bd5742bb7481d3350602bc80747d60ad60aa973a151 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.IsolatedStorage.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.IsolatedStorage.dll deleted file mode 100755 index f4eebb935..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.IsolatedStorage.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6490e1e1c18d44835a1e9190abd32b73744c250a71f7c9eaab78dbc39a80a97 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.MemoryMappedFiles.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.MemoryMappedFiles.dll deleted file mode 100755 index 6d32fc521..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.MemoryMappedFiles.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eac40bd86fcc58f0cc8ddde8fd2aa273031fb27496a0f9438e428f0e450914fe -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.Pipes.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.Pipes.dll deleted file mode 100755 index 63519cff1..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.Pipes.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ffe28de895b19cd48fb88245a3247b389970e62792297977fbf203278beb6ef6 -size 4096 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.UnmanagedMemoryStream.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.UnmanagedMemoryStream.dll deleted file mode 100755 index 831a777dc..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.UnmanagedMemoryStream.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6067b6388a1fb7e0d47a51cc3c1e2b04b87f5025c404fe8fd2770808bd863ec8 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.dll deleted file mode 100755 index ee5a6cedf..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.IO.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:358d6a28aaae259a51e52a3f0933fa8f36cd10f96e6e6594232ec2faf567d483 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Linq.Expressions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Linq.Expressions.dll deleted file mode 100755 index 05936d034..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Linq.Expressions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91aea8c6652e052bfec8ba5a4eed91a4d424921dd53c0606ab3620bacb5e08ba -size 6656 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Linq.Parallel.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Linq.Parallel.dll deleted file mode 100755 index 0024df3cb..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Linq.Parallel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b458212adbfe1f2644ab0837cfa31297733c1d0af15718767f4986346a2935f9 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Linq.Queryable.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Linq.Queryable.dll deleted file mode 100755 index b8e08ef71..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Linq.Queryable.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7a37fe6c1c9c1716aedd5e93f3768c16ef78d96a52622960f1c396e1b3fb165 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Linq.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Linq.dll deleted file mode 100755 index 999fb0b88..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:61781d47caedf8005848828abced6399758244e78df2c643bc71552ceb31c0d3 -size 4096 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.AuthenticationManager.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.AuthenticationManager.dll deleted file mode 100755 index 03d195f45..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.AuthenticationManager.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28332ac4638e8e0a4a0fbf1f8cf7f007b1152aa57fa4d1373eaa2d862433fcbe -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Cache.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Cache.dll deleted file mode 100755 index 69f83689e..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Cache.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:336d6cd56d78dc97a65a4f999d2498e7a4a58cf9e1c02247f44e433f4bd0b51f -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Http.Rtc.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Http.Rtc.dll deleted file mode 100755 index 3c3754130..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Http.Rtc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cffc2dd5c81e8acd65dc093ad72a771950d1152556c96613ca729782bc21e330 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.HttpListener.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.HttpListener.dll deleted file mode 100755 index 2db9a9e16..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.HttpListener.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f547e7c407379b45774bde0f538a05deacaabac0219cf2c66754c95371affee7 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Mail.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Mail.dll deleted file mode 100755 index a0ebbd7b8..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Mail.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e612c7aaae3f072106a62c7194169af8eafd89884899f7b29fc241bb95ee9729 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.NameResolution.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.NameResolution.dll deleted file mode 100755 index 5ee785a06..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.NameResolution.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0fa3e0f3c298a853ed275a40ec2a34da9f5655077cd031dc3075b93472fd575a -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.NetworkInformation.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.NetworkInformation.dll deleted file mode 100755 index 3854653c1..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.NetworkInformation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89d31821d201378aebc741fc0339ad34287cc821cf6f448b259c4b60d18e8599 -size 5632 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Ping.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Ping.dll deleted file mode 100755 index b45010c24..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Ping.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f3af7546e3ecca213b9dd88880501788f9b19ccf13fe681e1d72fb8feb81c1d -size 4096 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Primitives.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Primitives.dll deleted file mode 100755 index 4c83ccfd8..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:793d91aea6911134d73151e81fe9868d68d01e1960e84d451fad53394550e856 -size 5632 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Requests.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Requests.dll deleted file mode 100755 index bea85508a..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Requests.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b1179f9dceb80b46e396330fc0b70ebc16b872498e141647c2bc3b10a84416a -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Security.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Security.dll deleted file mode 100755 index 86207849e..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9fee979b315e2933193b730a4450cb8c30832725367308265c91dee3ed484dd -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.ServicePoint.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.ServicePoint.dll deleted file mode 100755 index 252866103..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.ServicePoint.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:071eac5408a5a8a78d949a132a3bc3a926ea3b1bd553bb85e7f946e3249601ac -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Sockets.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Sockets.dll deleted file mode 100755 index 073d2c8f4..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Sockets.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1333ed119afc6431fe36c0463bd68cdb4b822a8cb386fa8e8b19f65415d7ef5b -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Utilities.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Utilities.dll deleted file mode 100755 index d1c20ed34..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.Utilities.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22bfe1d6e8df6935b1c848715a9ae894bb33b239a158b313866dd17094187199 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.WebHeaderCollection.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.WebHeaderCollection.dll deleted file mode 100755 index db712a658..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.WebHeaderCollection.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0a5c10b3678dcf43a07bad958c5a4c175c2a2040591d6c7b3f162a05c6be726 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.WebSockets.Client.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.WebSockets.Client.dll deleted file mode 100755 index bced53dfd..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.WebSockets.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:94e3303942342a38fd29b44ee2ba5223cdf311fb7ee613684b932cd596ce8e4a -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.WebSockets.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.WebSockets.dll deleted file mode 100755 index 6e703b166..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Net.WebSockets.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:400088263656217475f07a9a8a51e681d1bb75c347405b672decabbda3ea29e1 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ObjectModel.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ObjectModel.dll deleted file mode 100755 index 680771fc0..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ObjectModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b53e91dea97bb30d1562fbbc328103a742056574c9a421262db26413a118bc5 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.ILGeneration.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.ILGeneration.dll deleted file mode 100755 index c19b41c56..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.ILGeneration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c062cf871c125ca000930fcd2729afa111dff71203c500e000a0934a90d7a55d -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.Lightweight.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.Lightweight.dll deleted file mode 100755 index e0f35eaf5..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.Lightweight.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:08924131f3a0e433ae7eeb7fda17e6fc0bf1df283ed935fb5363304d15db05af -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.dll deleted file mode 100755 index a130071a8..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a150682dab01b4aaba3a3764376f6a827f017f0c899a8b80a2f3677b8c8833a -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.Extensions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.Extensions.dll deleted file mode 100755 index 5425cdd1d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff87f7ef817b3d5ccb4505a0a296e361e22a0c6c85e216c5b39ca6b9d1add77d -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.Primitives.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.Primitives.dll deleted file mode 100755 index aa0da2f86..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd85a9c9d4a35485558f8f18d21a57d7a1ff87f4c318f96041733059f3ab1880 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.TypeExtensions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.TypeExtensions.dll deleted file mode 100755 index f037740ee..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.TypeExtensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f0098267b0392d40649e8938529ee604655be216e11be461d6f262637f2bf2ed -size 9728 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.dll deleted file mode 100755 index 38503348f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Reflection.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:add0c7788b57ed229a9bf6c2f13cfdbcd30a86aa593a4c871a7c03959db65e7a -size 5632 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Resources.Reader.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Resources.Reader.dll deleted file mode 100755 index 5d859469d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Resources.Reader.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4491b52b947cce0c71761f9ef92f58dffbc3abdaf1e9795f813b076fff6fd333 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Resources.ReaderWriter.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Resources.ReaderWriter.dll deleted file mode 100755 index 1d931510c..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Resources.ReaderWriter.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99fc4a443302268d3b01e95abde264aa7c772327aff5e8ad9150caca07c8578c -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Resources.ResourceManager.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Resources.ResourceManager.dll deleted file mode 100755 index 64960f06b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Resources.ResourceManager.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3077ef49a12e491102e8630e8e419ef255d32a767024097e1c7377804cbdae0e -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Resources.Writer.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Resources.Writer.dll deleted file mode 100755 index f7563a2e0..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Resources.Writer.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd3ea287d61f2ca9e36639b2fcf1863ad96b23d6cd797e4a2993d64b7bcfdcd5 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.CompilerServices.VisualC.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.CompilerServices.VisualC.dll deleted file mode 100755 index be4af110f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.CompilerServices.VisualC.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e07b95b1a6374fa2a4c71690213509a8cbe0f9a2a57606dccb27bff1f5f26519 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Extensions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Extensions.dll deleted file mode 100755 index b2039ab7b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:13525a02ae75462cc3817721457789fbd5a5e58c9ebf6e1d903b6b52c846e4c6 -size 6656 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Handles.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Handles.dll deleted file mode 100755 index 8f1a20560..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Handles.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b6cf0896b399ec99b3b56757a6c818c7abbe30b9b93267896f5fae54dae4cd2 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.RuntimeInformation.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.RuntimeInformation.dll deleted file mode 100755 index f21049139..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.RuntimeInformation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40cd19bdfcc27dd36b75224162cfa5154c1dbf6248333fa751ead8adeff269c3 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.WindowsRuntime.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.WindowsRuntime.dll deleted file mode 100755 index e2466e877..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.WindowsRuntime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:933d853950379c3f8e5e3ecf54b692599537f95e227320996e4c7477239e9ad9 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.dll deleted file mode 100755 index 980cfc654..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:542763d139c13f3b1e01bbf9993ec178024789853fa0715d7a7a3c347eab99f5 -size 7680 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Numerics.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Numerics.dll deleted file mode 100755 index 43f776d85..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42c072774bfbf30cdb9fe47a23a1ea1d51fb04d2b4396961dfc286ea81aaea02 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Formatters.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Formatters.dll deleted file mode 100755 index c5246c00e..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Formatters.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ab9329d5571c53175cf96be3a65b62ef048196579ed7dff5fb3fab06591d4a38 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Json.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Json.dll deleted file mode 100755 index 16f51cf5a..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee5bd9cd1edaee9a7919cbecdec55d23094c3d03c6049f3bbdd70e3dac14bd91 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Primitives.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Primitives.dll deleted file mode 100755 index 360b181f8..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:849e8b2591a3c28a9ffe9ff50d4d06453ce3b270083f47b3d8703ec88630b696 -size 5632 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Xml.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Xml.dll deleted file mode 100755 index 2a3df15dc..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42ab3a4bdde68f87b754abb34af78009349be135bb96c3923f33caa2a89b02d5 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.dll deleted file mode 100755 index 96e2966d7..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Runtime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00ac5330dd40c7e75f7a3c8a0b5d0edd83fe331bf22589d70d3dacc21f432a99 -size 22528 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.AccessControl.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.AccessControl.dll deleted file mode 100755 index f7316a34f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.AccessControl.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e354dc2d4c66071b36e8005e1f178d9ed82679aca4d7fa91d50f4d4c28d755a -size 5632 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Claims.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Claims.dll deleted file mode 100755 index 8c10f1e0f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Claims.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de37aa2802a659d99b2e40959a73a97b7f541283cf825b869bac01d4d21d7409 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Algorithms.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Algorithms.dll deleted file mode 100755 index d15092632..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Algorithms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:736bffff3a1bd3981833abf793826a7b6e54c83ec4ce40f7de7f0b31820f3f95 -size 6144 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Csp.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Csp.dll deleted file mode 100755 index fc08637ea..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Csp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5942c805a45c40d7673f713f620083abb47a723417eb497739d3a1ac0f879258 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.DeriveBytes.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.DeriveBytes.dll deleted file mode 100755 index e7512ba02..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.DeriveBytes.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82797662651d9c77fd23f369555b8d0ea5adf9aac04cb6785768288f840b5ada -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encoding.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encoding.dll deleted file mode 100755 index 619ce04ca..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encoding.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba58bca1e32aae58145a20bf15b67c0eb7b96d56f2dc419ea9131ab00e1b6415 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.Aes.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.Aes.dll deleted file mode 100755 index 8ca07a64b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.Aes.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8827414767dc78d032e92caf620bf743e3dede67bbd145935e7e57e93ea4553b -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.ECDiffieHellman.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.ECDiffieHellman.dll deleted file mode 100755 index d94185ba9..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.ECDiffieHellman.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb3b87b189eb332695f7c976db23884cd9e6dafc1c85c11ded4415296f848fa1 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.ECDsa.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.ECDsa.dll deleted file mode 100755 index b11bdd630..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.ECDsa.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e72099f69bdd5dc9e057ff4ca3c521bdd32c55613fded02d3e14f1c3406d37a -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.dll deleted file mode 100755 index 31c995e85..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50c94403c539664ce962658b2e335eaadb42e2ab5b91afd3c5c6d34f8a12adba -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Hashing.Algorithms.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Hashing.Algorithms.dll deleted file mode 100755 index b7e58e00d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Hashing.Algorithms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:222ce7be0ea905a53ba10ac76a24c9eb3ac0494ad48a83c0a1462c3c20b9d135 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Hashing.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Hashing.dll deleted file mode 100755 index 9d2ec3b89..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Hashing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e2ae83f75eec5fa99df393a4fb6cc13c22da6cfbc2296f5bd60edf4a5bffbb4 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Primitives.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Primitives.dll deleted file mode 100755 index a5424c90b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:269b0ca96a7cf92cc56c2fd8a0849c26ed912dd6c7bdd07c59b00976eac8fcf3 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.ProtectedData.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.ProtectedData.dll deleted file mode 100755 index 26a3707b3..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.ProtectedData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e9c76559acf84ff7b1fe2d2183b9625cea2d4b44d53ac1f04f9e007daf3b03d4 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.RSA.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.RSA.dll deleted file mode 100755 index b6bc56bbc..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.RSA.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c75b6bd23375a62216fa12dcb633a3847534f4314cf1f3022be1007e5499e28d -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.RandomNumberGenerator.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.RandomNumberGenerator.dll deleted file mode 100755 index 889dd4477..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.RandomNumberGenerator.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f536bfc046095caf235cfc702800d3b9bf24547084d9f520f03056c80aed1db3 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.X509Certificates.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.X509Certificates.dll deleted file mode 100755 index b250ae90f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.X509Certificates.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e20e85011e4d1f1bb6d83768ba2400e703a85e3948a3d5a2904b80a5bc2fdcc1 -size 6144 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Principal.Windows.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Principal.Windows.dll deleted file mode 100755 index 6175f95cb..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Principal.Windows.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73534745a7ef6ec8008263993d62fd82e2c0ca537af02d7adad866846f03a51d -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Principal.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Principal.dll deleted file mode 100755 index ef19f6daa..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.Principal.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d1fe2d68f59d40a4d832504277e26bea9fd1008303edb72dc7eabefc4cf32d08 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.SecureString.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.SecureString.dll deleted file mode 100755 index c27de770d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Security.SecureString.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93608df9f07bc31b76b50b5c9bbabcbb5318163975cc8f9d6f5a60be05771b33 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ServiceModel.Duplex.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ServiceModel.Duplex.dll deleted file mode 100755 index 2b786eaa0..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ServiceModel.Duplex.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c772f86f4f1e84662152344b4a8647b6da82aeaa2ccf1941b8e64d34039d8d6 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ServiceModel.Http.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ServiceModel.Http.dll deleted file mode 100755 index 54fa39c92..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ServiceModel.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c08f5686a3e581add444875e0d7c299b8928e3f98556bed78ab75bc08061d2d -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ServiceModel.NetTcp.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ServiceModel.NetTcp.dll deleted file mode 100755 index 7559e59f8..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ServiceModel.NetTcp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59562d37b24364dfeb886e37629d32d08caf160832c0cd48cf20266a09eeb59b -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ServiceModel.Primitives.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ServiceModel.Primitives.dll deleted file mode 100755 index 43a99f991..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ServiceModel.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf8b5fd4e892a2bad40909dbc5c15ee729e9eec830b67ac052a3ec6b94fab780 -size 10240 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ServiceModel.Security.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ServiceModel.Security.dll deleted file mode 100755 index f77865fac..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ServiceModel.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b44707098a4f052a063a947cd1482c6de42a08fa0d17ae847c35037ef694a109 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ServiceProcess.ServiceController.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ServiceProcess.ServiceController.dll deleted file mode 100755 index 0e40d3956..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ServiceProcess.ServiceController.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42fdac68c513cce7233a89e9b9543f0cb9ac92370510f070b959beb07805a620 -size 5632 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Text.Encoding.CodePages.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Text.Encoding.CodePages.dll deleted file mode 100755 index 8c36ca12b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Text.Encoding.CodePages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:939cee1465cc84530547c1ae2adefe4c914f195a12707ff6b4035453312d4dcb -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Text.Encoding.Extensions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Text.Encoding.Extensions.dll deleted file mode 100755 index eb78733ea..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Text.Encoding.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dfcd01c9b609d0b9d1cb1b0cb4cbdb07415292d2f3c1a57d816bc49c7e643868 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Text.Encoding.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Text.Encoding.dll deleted file mode 100755 index 368f2a29a..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Text.Encoding.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a26b2a2564c872c242cf36907bcbd5aadf0350fc17f6e5cf1836294d433b2505 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Text.RegularExpressions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Text.RegularExpressions.dll deleted file mode 100755 index 2c6031927..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Text.RegularExpressions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f614cc87abed9ead104ce142cc5ddfc3fc64cb2424e835016cd45860f047c51c -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.AccessControl.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.AccessControl.dll deleted file mode 100755 index e3bf47340..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.AccessControl.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74de40c21c5af9c09a510956fd3c6e920ed203fda2d73b23dad7c10cde75d535 -size 5632 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.Overlapped.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.Overlapped.dll deleted file mode 100755 index 0af3f61c9..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.Overlapped.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb13340cf72614a725afc8d93cdf98052ad4c8dc85fbd222e68b9da893b88693 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.Tasks.Parallel.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.Tasks.Parallel.dll deleted file mode 100755 index 48efc3a71..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.Tasks.Parallel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a9dcbd5a3b6d0737395023d032db270f915381f9901f4dbc0fe111811893061 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.Tasks.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.Tasks.dll deleted file mode 100755 index 0f69e2cdc..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.Tasks.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1af5b9e36367c94913ffec8d880d9613f671b6d40e850db5e0482e2ec9136c08 -size 5632 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.Thread.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.Thread.dll deleted file mode 100755 index 33518d181..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.Thread.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d303ca5ac9f2ed29abf5738cce3d49ec360bbd2087e80f91c357f5cb64493758 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.ThreadPool.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.ThreadPool.dll deleted file mode 100755 index 216f00406..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.ThreadPool.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eed57206b648eb4c47289b17a9a4b2db852a0b93eb160f57a943d061cde84ca8 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.Timer.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.Timer.dll deleted file mode 100755 index d8b9df2ef..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.Timer.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e4faef06dc0b413a3c31db4a13bbaa9f02388242e78b56f86f46d0e7ca1d240 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.dll deleted file mode 100755 index 4052fd63d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Threading.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76212a15859dad4c7f69fac2bdadce26a379e009d42d78a098960e111647df36 -size 5632 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ValueTuple.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ValueTuple.dll deleted file mode 100755 index ab8549725..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.ValueTuple.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4a5887f5ee33e62e0147a00090661f24564e15fd455c842c3578405d0b1d453 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.ReaderWriter.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.ReaderWriter.dll deleted file mode 100755 index 10b211f2d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.ReaderWriter.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc0f6366022916eaa428bd34d32f14a47785fde29474e3bf9c9e9949ed2da4a2 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.XDocument.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.XDocument.dll deleted file mode 100755 index aaf1e4f8a..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.XDocument.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b91d4fde13a591aa3f6c8dca04f893cb69c81a930f611f3447879e7fa5d373e6 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.XPath.XDocument.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.XPath.XDocument.dll deleted file mode 100755 index c4f130e14..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.XPath.XDocument.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:35edcdc0e6cb9a247138e90493a90dd65200f83561e9d3b5f64af48b96fc0d62 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.XPath.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.XPath.dll deleted file mode 100755 index 2a97346a4..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.XPath.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4939decbbff9e70d21e3c2adfb14df49a6e94e554c211d53e2d2b0378a6dfeec -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.XmlDocument.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.XmlDocument.dll deleted file mode 100755 index a4a48d51f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.XmlDocument.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4bfe0ce7f99b319d79dd48d7b74ea51b4875a90a5273f3eb19d58494897a3fb -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.XmlSerializer.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.XmlSerializer.dll deleted file mode 100755 index d7961229f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.XmlSerializer.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8cc223efdd551d548a548e97f3301f316820b08bd18fac80b148978592276fec -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.Xsl.Primitives.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.Xsl.Primitives.dll deleted file mode 100755 index 88efd713c..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/System.Xml.Xsl.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f86a09515e53eac33bccad037fbbb6bc8ce94b8530062c575d31ca454e5e418 -size 4608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/netstandard.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/netstandard.dll deleted file mode 100755 index bf7dc5105..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Facades/netstandard.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a329d92917e7bd78925e8771bb19523fc95f26d55fd36345b79eb445fae3669 -size 84992 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Microsoft.CSharp.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Microsoft.CSharp.dll deleted file mode 100644 index a88bc5c17..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Microsoft.CSharp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc2634d2e3d6566b1216503b543aaf9f0902d061f3d9c1e5825832175f3eaf53 -size 300544 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.CSharp.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.CSharp.dll deleted file mode 100755 index ecc41d125..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.CSharp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad48fc93e7d3164f490e0a80230d2953b2f7120d9940e0af6d4ec17f3e4d5e97 -size 4681136 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.dll deleted file mode 100755 index 635806e5b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:478fa2f04a64256955f9682b8114a2f72f4a9e22de60fe5a15b2d846b6e2d6db -size 2414512 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Mono.Posix.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Mono.Posix.dll deleted file mode 100644 index 1e70186be..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Mono.Posix.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be99bf1ad3d7903078e16721bff9de6e424b603b35207a36701030e2e008eb5e -size 212480 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Mono.Security.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Mono.Security.dll deleted file mode 100644 index f07d7590f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/Mono.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c885141881da78fb1fef25e86dc26c15bb9259ca646efaab59adf51bf19326e -size 314368 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Collections.Immutable.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Collections.Immutable.dll deleted file mode 100755 index 5b30d134d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Collections.Immutable.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8e9ce5d4db1897a939e60860154617300b0dfa4c4d3e10341f21af0de4bbfd5 -size 244432 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll deleted file mode 100644 index ed978d2af..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aaa3265a5541345cbb0a6f0f072c290411ffd07bb07fedef945a4818caeb681b -size 259072 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll deleted file mode 100644 index 2ff74f81a..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f8980666889449bbb1e0c2de21f400a9423f29367a0028aa5797b483e8d3ddb8 -size 84992 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Configuration.Install.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Configuration.Install.dll deleted file mode 100644 index 43770a8f1..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Configuration.Install.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47063a3aa980cd976d83305daca6fc8e56460f72021b44c56c87728b45733ee0 -size 24064 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Configuration.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Configuration.dll deleted file mode 100644 index c88213e05..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Configuration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bcd2d64ad1f45b174158004790f7c64f6fba5d159f4f95b56b91fa746cc40369 -size 122880 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Core.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Core.dll deleted file mode 100644 index e32c07403..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6c8c6c3806730a2929e93982038e1d974288c01a968f226926c0446a04355fa -size 1065472 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll deleted file mode 100644 index 7e4028919..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d8070ba80ebb439fb9e0814c80444cde62e404cbf99137dbbbc77b27ebac5f9 -size 29696 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.Entity.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.Entity.dll deleted file mode 100644 index a4766e882..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.Entity.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59ce7a6e2e2c76861367189d9f9414750ad3f6453afd17583b1457c5ef22e4a0 -size 3339264 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.Linq.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.Linq.dll deleted file mode 100644 index 19372a634..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bbb8e4fd87f93b9f664e30bd0b4f8d607d27808b229d4168252e6d184b466dff -size 493568 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.OracleClient.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.OracleClient.dll deleted file mode 100644 index a9fe8d448..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.OracleClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1108ccabf3473a31bb5a9cc00330636eae518fe11d92d2699a5e8744570127a8 -size 173056 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.Services.Client.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.Services.Client.dll deleted file mode 100644 index 45cdc98d8..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.Services.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eecdfed100c9b12f3f4517673898583f8d5954e69c92070d195dff97239522c9 -size 418816 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.Services.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.Services.dll deleted file mode 100644 index 6cc7be948..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bfc477a2ddad68546c9f848954bad584791acf8bac015682f27cd4cc780637a6 -size 56320 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.dll deleted file mode 100644 index f6dc4f6cc..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7fc75a2c6dba89a00b6e7d92ddf8e877456263582b8eb36c7efce9393e63ed3d -size 2119680 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Deployment.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Deployment.dll deleted file mode 100644 index 14f9ef74d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7939e391e7aaf1998d34326075d321a7a3728e07f095ce34d3cfe900017aa90a -size 11776 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Design.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Design.dll deleted file mode 100644 index 2585e5cd1..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Design.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e86b0efd908a90a27a5015cbcea77e9c94649cab224b05c8a937361e36c5e10f -size 274944 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll deleted file mode 100644 index 57cf03400..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6fbee48c805fd754ead8cec06766258c1a1f3dd9be0a8ee9e408c1ccdbaa7af6 -size 61952 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.DirectoryServices.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.DirectoryServices.dll deleted file mode 100644 index efbedbbc0..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.DirectoryServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18627f929f6ce1b9f9a20faaed5fc68fd13706013b3ea0aa3c0f24ba6fa63585 -size 94208 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Drawing.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Drawing.dll deleted file mode 100644 index cad09c7f6..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Drawing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:165cee5d60a2af6754803e9c57084957bb9787a513f431953d96c802df9df57a -size 482816 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Dynamic.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Dynamic.dll deleted file mode 100644 index 0a035a81a..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Dynamic.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c1f2c1412802cb9ecfe3abd3b2936d687289bdfa96af98be730726cd8e0e5da -size 87040 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.EnterpriseServices.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.EnterpriseServices.dll deleted file mode 100644 index 4e6aba4af..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.EnterpriseServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f15fadd2236839ac016f59fa019450f1032c1058802590b6bd7c0d0b69293599 -size 46592 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll deleted file mode 100644 index 58f6399eb..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4aaf8f27188828ef81422afba2870cc5d02e435a458a24bf77bfa9813e0200ec -size 18432 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.IO.Compression.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.IO.Compression.dll deleted file mode 100644 index 5ea09fb1b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.IO.Compression.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe4056a11db7cba8d19869dbf93cd53e0c783057edcbe32c72d28f8fa0e9e785 -size 99840 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll deleted file mode 100644 index c1c710901..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2bfaa4db71a2fabcf1d77f263096ec085882b761b21d6259b90f9d538022a4e -size 17408 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.IdentityModel.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.IdentityModel.dll deleted file mode 100644 index 49d1cd051..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.IdentityModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64f0b1fad23f6afc8f5068cf9605293555fddd92c5a2f6cdf6dffcf8eba737f6 -size 139776 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Json.Microsoft.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Json.Microsoft.dll deleted file mode 100644 index a57ecefc2..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Json.Microsoft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ccc44d40f001796f41b2099c51b6784683a82d7381e5f8989ae4a9ccfbea2b8 -size 54784 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Json.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Json.dll deleted file mode 100644 index 99b07041a..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7cfc9b1e8c8ea9d607bd453f25cf6391eef8f8910b2e2773113f33b04a8e53fd -size 32768 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Management.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Management.dll deleted file mode 100644 index 793dadc34..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec66b1441d7310f0e3b53ace2f79e4818acec382e88a30b842c4a62fc7a1ce8c -size 49152 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Messaging.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Messaging.dll deleted file mode 100644 index b3c79dd93..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ad58270f68a9fb1e605b1622a71994bef9fcfc17bbc499dc06da5c9f13843c6 -size 75776 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll deleted file mode 100644 index 4f1e6b6f2..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e77e902ca5738dd40d971e1b1cd15eb249553e505e3f3d87cdae45b9e0853083 -size 519168 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll deleted file mode 100644 index ff948af08..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2bd78be0ad1da7978d770d5a83b36724ab7a4de5e1267c3b889b82ead959fb7f -size 8704 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Net.Http.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Net.Http.dll deleted file mode 100644 index f4cba1a7f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Net.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d0a132ad58a0824ac4fe2b8aa92006801a8b3919fdaac85982bad44ce62f0a3 -size 115712 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Net.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Net.dll deleted file mode 100644 index 79053c279..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Net.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd91fe86c3b9dfe133798dcefdfea6783e49b51bb06cb8fed7ebc4d8f396d2ae -size 13312 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Numerics.Vectors.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Numerics.Vectors.dll deleted file mode 100644 index f953fbe02..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Numerics.Vectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:327bb7192029181411207531c2a3df61713e3d1d876fde4a5d18daf9be7bec9f -size 12288 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Numerics.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Numerics.dll deleted file mode 100644 index ab83bebb5..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d17db0e4643049bbf7b6da9e585b90f89b1d53ab376659832cf914788ac1d81b -size 119296 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Core.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Core.dll deleted file mode 100644 index e65755ad7..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73c1e029955066e3b0f29a742d4cdceffc244776a54104df4d5f19478b151038 -size 96256 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Debugger.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Debugger.dll deleted file mode 100644 index 077ee0eda..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Debugger.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3bb7f5472cdc389dcae0bde2256e99a522cead1fea83b58ae9380aa3990e17f9 -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Experimental.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Experimental.dll deleted file mode 100644 index 4e596b4a3..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Experimental.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd6f5f9acc1fa8bf35ea7d9ba14bf94c75b24baa402b24b55afb961a3e6eb589 -size 28672 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll deleted file mode 100644 index 1ee2df114..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7816749b43433fe537ab5c72e19250bc760c94e873da93f0251553ae7a3da32 -size 7680 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Linq.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Linq.dll deleted file mode 100644 index 128031ced..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e701260b1f47b0fbfce2814ebcef425c75b3843c26a18976baa4b97eb6d7ab18 -size 683008 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll deleted file mode 100644 index 381037347..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d824ce684921823958b34e6c1ac81c1a457c740c8009d130150b17b7439d300 -size 9728 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll deleted file mode 100644 index 25bf82fa0..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d754b1f51da7ec7c47a0e25fbcd075c30c922d986349bd942ec22dcbb8a0e56 -size 22528 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Providers.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Providers.dll deleted file mode 100644 index fa09cefd2..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Providers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11290fa51fac7db92cb346adefc5747bb8aa072e98cee9a6eef1f55fc43256e0 -size 243200 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll deleted file mode 100644 index bc06e7261..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d06d3f065efc3944c488652ff6bce3cfc7e6afc9fb1cd599fd08fbb963721ea -size 9216 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll deleted file mode 100644 index 05a28b343..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c695404aafade412ae59c4b3b3b27c7cbf545aa5b28bb54e8fc5d1b1936edced -size 9728 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll deleted file mode 100644 index c02f6c29c..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd8c31bd739c1e52c40fccc367366a6cec5345c816752b9a7aad873d1ddbf9ba -size 12800 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reflection.Context.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reflection.Context.dll deleted file mode 100644 index 21dd8389c..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reflection.Context.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7bb97432fd16b14c6624dc00786272f2a99755c397035a87c420f589a576a535 -size 13312 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reflection.Metadata.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reflection.Metadata.dll deleted file mode 100755 index 31031cd34..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Reflection.Metadata.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:652ded0ce5e153b85154ac65d00244aafb49e0fe8a958e2afb9c5bea83a957c0 -size 465104 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Runtime.Caching.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Runtime.Caching.dll deleted file mode 100644 index 863e19aa4..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Runtime.Caching.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f61e57e195594f5bbfc64b0feeb09282919e1398c52e31b8e1194af1e571a294 -size 72192 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll deleted file mode 100644 index 58bf84075..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8279842618b28d8057d63eb7fed6047b04bb4bedf7c1f08749328618562104d -size 107008 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Runtime.Remoting.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Runtime.Remoting.dll deleted file mode 100644 index 62c4a0141..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce33a874ad0ac5241313871cebe9338bf736552b8c9c8711a4671e4d6109224f -size 119808 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll deleted file mode 100644 index 6abe07886..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00f496bba35e509f6685742533663e651edb6863d296945c64e1568c16cf8b0d -size 38912 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Runtime.Serialization.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Runtime.Serialization.dll deleted file mode 100644 index 9ddb4d77d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Runtime.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67a67cac418b28640ca0bb0332ab4759f4d959f5e79579b94d2cf52593a56131 -size 933888 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Security.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Security.dll deleted file mode 100644 index d9d9112a6..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a278e67dea886ed972b54d906a1ce8ee08637544be31e1eef29d827b635d653 -size 276992 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll deleted file mode 100644 index 6cfed22aa..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be1969c2714f1f2b4515ab59813d8ebe80fa1a8e446fa8255989ef36416cf264 -size 13312 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll deleted file mode 100644 index 37ccab98e..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f9b16e4412543c29e1bb1f43f5f948b9d3584292b51256b756a41cb7e9177ff -size 141312 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll deleted file mode 100644 index 6a3b20539..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:191f6bd4e6bef05f8341a8ec5ebc9fe32dfd9af93faac3870492c0548d5cc432 -size 214528 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll deleted file mode 100644 index 92c6af8fa..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4373b6cec4335f6eeedda163481de26c0b605fc4be7df34b67adbd9e3d5d3088 -size 37376 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceModel.Web.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceModel.Web.dll deleted file mode 100644 index 9d0d016a0..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceModel.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce70b06b13bbee55f8cf8f4a042c5d06b98af03e338995ced18266fb2067fa98 -size 79360 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceModel.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceModel.dll deleted file mode 100644 index ad0ccc3a3..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9b5dc2076bd4bad19c75ed4aac57ca001a9a8ead911e9a9f1cdb2ca8b11cf841 -size 1426944 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceProcess.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceProcess.dll deleted file mode 100644 index 2654ab094..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.ServiceProcess.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f26af126176f7cf3e5192113bd52ba37519d55dabd997e95d05284350d30105b -size 47616 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll deleted file mode 100644 index 36df064c4..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1587a5886355c2f52d3285ac6771314825ee1750ccff7d402cb774ec0ee0f6db -size 168960 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Transactions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Transactions.dll deleted file mode 100644 index d5d35b11b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Transactions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dbfe036ebfe14548a14a2e35590d6be0b234e75905a3634287ab11be7fa3a724 -size 34304 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Abstractions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Abstractions.dll deleted file mode 100644 index 9dbf84fb9..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Abstractions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79af7b24f4dfa913e8cc62b0e8ab783d70e80e14f92c4f4b1dd8f676cabd5bd6 -size 12800 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll deleted file mode 100644 index 698d01f48..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60aa2cc4a3844cfcc7e97d79d7503bf92ada14e4903e938a9a7fa38edc74f1d4 -size 33792 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.DynamicData.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.DynamicData.dll deleted file mode 100644 index 1f1ca5dbe..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.DynamicData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2a8f70e2d53d85c4788d0b2c1b51d2c81740a5e2705623e4dd78628bd9136d0 -size 69120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Extensions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Extensions.dll deleted file mode 100644 index efb92cfb3..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d63706586e4a3891dc6ec8cb0ddd2cc28bb1c7ded93bbd9e5d521db84862b80d -size 745984 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll deleted file mode 100644 index 336188f9b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b0e83ec65e855b620331a69fd8ab98b6a3c69eb0954bb54d92875c0cdf02349b -size 88064 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll deleted file mode 100644 index 872cc5e3d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa9e924cf38f248eacb2e07d1a2300f190aae8bdb607e076670963ee7cfbaecd -size 56320 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Http.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Http.dll deleted file mode 100644 index 260063642..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3a2fb46704a5cbafc5586792d07dd9bbbf9ffb2c454f5e24ba80cca1742aed8 -size 326144 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Mobile.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Mobile.dll deleted file mode 100644 index 7e3198616..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Mobile.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac45a498b0da25cdd3e0ab4f42544df9d9ebcf1809ceba628338cd81fa83b77f -size 11776 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Mvc.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Mvc.dll deleted file mode 100644 index 86e7fa24b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Mvc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0969b6e8b7287456d662c1d344cc7c8a255fa732d85a3b64d27f76163dcc324a -size 420352 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Razor.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Razor.dll deleted file mode 100644 index bd2249fc4..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb045ea1943f02caabc6c41866a8d177594824544428297b3b6b657e521aba50 -size 254976 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll deleted file mode 100644 index 90978b66d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0cc7c72c13f3e577e879a604163175899febea04928fa3a29a050a3972a253ae -size 11776 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Routing.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Routing.dll deleted file mode 100644 index 158951a44..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c1100acec1edaa3a3928ecdbf8750a9c5734f2fa4bd7f738060f9ff9e0f1b75 -size 12288 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Services.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Services.dll deleted file mode 100644 index 4fee3677c..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91f41a7e7c511c7c4da948fe133c16f45aadd9cfdb0d88eb4765b938a6e56ef0 -size 732160 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll deleted file mode 100644 index 476913830..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76ae55cab184ff725100cfdc606914a7b12c70adc6a31c715bce4fb32c44aeb8 -size 39424 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll deleted file mode 100644 index 03e61396e..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6adcc0ed2a3f111bef78eac5ffff4cf779930f611adf618e2da08085607397a -size 38400 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.WebPages.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.WebPages.dll deleted file mode 100644 index 952b7772b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.WebPages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:06bf34f5dbf43e912c0a2a3a44670668b93a143eb32a491fe4a5a1a5891c2cad -size 196608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.dll deleted file mode 100644 index dafac2621..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9d637c3696bbed5c18fddd22181bd4bee9d6a371df66f1ea3e6af8c24267c887 -size 3026944 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll deleted file mode 100644 index 04e0ff316..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b069c55850d60b364db3e03062da85878a393e3c673531672f3fa75e146cf58 -size 145920 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Windows.Forms.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Windows.Forms.dll deleted file mode 100644 index 767803f77..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:733bfcb7a997f5beade2fba8d36f45440d4bcf6c2f13aa5208d2ed361c7023d3 -size 2898432 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Windows.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Windows.dll deleted file mode 100644 index a0d16168d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Windows.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec90da3e05d35fa76a1d576a9c14e0fb95e9c5016305352607029ff080a4bc1a -size 11776 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Workflow.Activities.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Workflow.Activities.dll deleted file mode 100644 index 504a7a91e..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Workflow.Activities.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7b9eca28b05230c95d521b08649a668cbc14f7ae4cfadf0543566d219f35b40 -size 11776 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll deleted file mode 100644 index b393d0f8c..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9714061a4c64ae21395db81320b63cd3e4b44f148513e6beee07cba63d73e174 -size 11776 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Workflow.Runtime.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Workflow.Runtime.dll deleted file mode 100644 index 096912c49..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Workflow.Runtime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be9d80852b082e960164614ac77814669abefe253ea410f35af9881361bcac1b -size 11776 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Xaml.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Xaml.dll deleted file mode 100644 index a61935ea2..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Xaml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a7deb84bba590d7f734fe699878970fd92758954f65d418594eb345d8b27ba4 -size 188928 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Xml.Linq.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Xml.Linq.dll deleted file mode 100644 index 23d02da6d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Xml.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:502b289eba6bb10dd66a3c3f33256c8396ac6b1a37bf90924c8508d7f75a311f -size 137216 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Xml.Serialization.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Xml.Serialization.dll deleted file mode 100644 index 71501bb82..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Xml.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d51a04521acc7d37047913b82a2973edcaf6db96ce74f2e3fe3fa506d1b0b70 -size 11776 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Xml.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Xml.dll deleted file mode 100644 index 1a3f9f3c4..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:49cebbc89e6c46080c9741c3b0917e51cf9de81d6c8a064d48d57febc0d4d907 -size 3174912 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.dll deleted file mode 100644 index e3ff6916d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/System.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25c957f4535cb2f72865fee3de0637439b7db947cfcf6b71bcbdb35b2a6f3802 -size 2566144 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/WindowsBase.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/WindowsBase.dll deleted file mode 100644 index 8c9fabf5f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/WindowsBase.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e334cb9cb54d69fdce5a39269ec1860581e01d78a9fcbc492b7a8a9bcf444f2 -size 161792 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/csc.exe b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/csc.exe deleted file mode 100755 index 876727d78..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/csc.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f87824757de30ff92ca8dba1049c01855c0664f94d48980ce782b95fce7bb0e5 -size 49584 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/mscorlib.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/mscorlib.dll deleted file mode 100755 index fb24014e2..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/4.5/mscorlib.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b583f9412db1b688f0320e709eee1d77b428c0d66408a9d4a69f4bb1f0d75202 -size 4494848 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll deleted file mode 100644 index 01200aeea..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7908292f952dfb43c613d382804d471099dc214e967d5b9c576d20f1426b670d -size 12288 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll deleted file mode 100644 index 71fcc330d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58636d961acd7124632e47dbe76c31e266b941c74a1af6ef614812a40cfb0631 -size 212480 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll deleted file mode 100644 index 72d96b0f4..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d9eeafad9481db1050c13e1fb323517a8fa38f8e7d92e736dfbbdb81d07efe14 -size 314368 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ComponentModel.Composition/4.0.0.0__b77a5c561934e089/System.ComponentModel.Composition.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ComponentModel.Composition/4.0.0.0__b77a5c561934e089/System.ComponentModel.Composition.dll deleted file mode 100644 index 160555926..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ComponentModel.Composition/4.0.0.0__b77a5c561934e089/System.ComponentModel.Composition.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d9892265e9020fe89907ab812c5a5bbac5d552f13e3131296be59f1101343602 -size 258560 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll deleted file mode 100644 index fff03e9ff..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ca1a6ef39cc2784f35191b9ad56055dbe7d782bc91080f53006af4bda7551d0 -size 84992 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll deleted file mode 100644 index d6227ac98..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6dede71ccef0bf01ae0bd9c81c9643dda1a1c82291841722184f3c9d999dc8c -size 24064 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll deleted file mode 100644 index db365d4fc..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00f5f5c6fd07dcf673d068420d8769593f44b9ec1dae911bea094cc4bdb682d3 -size 122880 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll deleted file mode 100644 index ff7b07a2b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d5ac6330d485d61567bde7e8c938c898abd8bf39886f91c2035e5f19dfb3b778 -size 1086464 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data.DataSetExtensions/4.0.0.0__b77a5c561934e089/System.Data.DataSetExtensions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data.DataSetExtensions/4.0.0.0__b77a5c561934e089/System.Data.DataSetExtensions.dll deleted file mode 100644 index 6391b0240..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data.DataSetExtensions/4.0.0.0__b77a5c561934e089/System.Data.DataSetExtensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4fa1f2bddce63019b30b2502ff5560bcf831327a3536d5529d033217194fb350 -size 29696 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data.Entity/4.0.0.0__b77a5c561934e089/System.Data.Entity.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data.Entity/4.0.0.0__b77a5c561934e089/System.Data.Entity.dll deleted file mode 100644 index 5974f6518..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data.Entity/4.0.0.0__b77a5c561934e089/System.Data.Entity.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1520112348648a0a739e6cb8c33b4830b805971c28a28f0f98a527b1588d6519 -size 3338240 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll deleted file mode 100644 index a60532ab8..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b47c88f097deb13c222a41c2d8f28e5043469b2a929dd5f8f4643fd4139f503 -size 652800 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll deleted file mode 100644 index f2accdd2a..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5210222768ba1527ac1969b3ce3315f216a8642876ce82f640f83ce71a9ae4b -size 173056 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data.Services.Client/4.0.0.0__b77a5c561934e089/System.Data.Services.Client.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data.Services.Client/4.0.0.0__b77a5c561934e089/System.Data.Services.Client.dll deleted file mode 100644 index e811ed567..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data.Services.Client/4.0.0.0__b77a5c561934e089/System.Data.Services.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40607bf6200b75a815989aa2efbeb2565f4a1f13bc2d698b26563f0b6e2460ce -size 418816 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data.Services/4.0.0.0__b77a5c561934e089/System.Data.Services.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data.Services/4.0.0.0__b77a5c561934e089/System.Data.Services.dll deleted file mode 100644 index a2da8a705..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data.Services/4.0.0.0__b77a5c561934e089/System.Data.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db29aa8d934516bf72cdbc872b6d109cc01a205b7724e27dbe4ee1b2210734af -size 56320 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll deleted file mode 100644 index ebd63046f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c7cc52d2fe5c020852ec0595635dd5a30341d98d2b7f66fac694a6d77044c6f -size 2102272 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll.config b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll.config deleted file mode 100644 index c33c1db25..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Deployment/4.0.0.0__b03f5f7f11d50a3a/System.Deployment.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Deployment/4.0.0.0__b03f5f7f11d50a3a/System.Deployment.dll deleted file mode 100644 index e0ef53bdf..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Deployment/4.0.0.0__b03f5f7f11d50a3a/System.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:008f2b1b8ebc389a4a59e2f11c4a21b84649c7f47e2a9bdc856c5662ddcf80c1 -size 11264 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.DirectoryServices.Protocols/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.Protocols.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.DirectoryServices.Protocols/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.Protocols.dll deleted file mode 100644 index 984942ada..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.DirectoryServices.Protocols/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.Protocols.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:303b6205b1d759b7f5c0503a7e401da3fd59c38aac7a93084aa9d379c85bc920 -size 61952 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll deleted file mode 100644 index 3f294ae19..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a42c80c4473800bd4faa7a86a20f5f5cac5aa4f9abb1f38375c2947c693f0ca -size 94208 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll deleted file mode 100644 index e5d792384..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c74e44a0455c266fc4a641f6cb7fe13731cac7ef984a8ca90ac54faff759b44b -size 491008 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.config b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.config deleted file mode 100644 index fbd1d8941..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Dynamic/4.0.0.0__b03f5f7f11d50a3a/System.Dynamic.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Dynamic/4.0.0.0__b03f5f7f11d50a3a/System.Dynamic.dll deleted file mode 100644 index a10dcb17d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Dynamic/4.0.0.0__b03f5f7f11d50a3a/System.Dynamic.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:caaaf916eeee6eaf20c3f8d706444a928c94d4e2b71fd48eb421242f91255475 -size 87040 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll deleted file mode 100644 index 635a2f78b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53724ebb898911c6da4233704514c2604afdbec11a9c807e31bf82b7558313a1 -size 46592 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll deleted file mode 100644 index d22bdd7af..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:180a3e041a0261030fa7ca05ba06823000cf455c1367f6a4004b59be3e406767 -size 18432 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll deleted file mode 100644 index e1ea2b78d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b279eea9c15eb42a82f3ae4f0d73b1de46512912638e8f22c943d929692d773f -size 115200 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll deleted file mode 100644 index 56424367c..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f72d56255bd489b759dd21ab39fce38a05a74e17c1b812eeda11296e992ab3d -size 17408 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll deleted file mode 100644 index 550b8add5..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91ffe031a24bc0ea3329687fcfaac106f84ab9175abb5b1fc6e0fe610560e85b -size 139776 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Json.Microsoft/4.0.0.0__31bf3856ad364e35/System.Json.Microsoft.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Json.Microsoft/4.0.0.0__31bf3856ad364e35/System.Json.Microsoft.dll deleted file mode 100644 index 330f89327..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Json.Microsoft/4.0.0.0__31bf3856ad364e35/System.Json.Microsoft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:568235cb7ad12d348aaeceaa096b994bdf91a0f0fe82922e81756d00267b781a -size 54784 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Json/4.0.0.0__31bf3856ad364e35/System.Json.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Json/4.0.0.0__31bf3856ad364e35/System.Json.dll deleted file mode 100644 index 41b314d50..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Json/4.0.0.0__31bf3856ad364e35/System.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5571a40b9f4491e910fe1e8920b22dd06ae1eecc8751339ad29c259282426383 -size 32768 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll deleted file mode 100644 index d7c43d154..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:085868e4b698e55881c8fdcaf6579cccfa24894f3eeb4fc353539d485bcecb9f -size 49152 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll deleted file mode 100644 index c39bf9fe9..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f0fc119551feefe672a3a3bf2c6011e7789c026f1fd00f7d68f2b02982be88e -size 75776 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll deleted file mode 100644 index 370af3a67..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:301f258b1ad7ec5c7fb77626d54584c9ee97f61f5e32e18e91df8157d25a35f6 -size 518656 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll deleted file mode 100644 index f14fe244c..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae92b4f84ed4ce8c1063be896c3ed5b47c264014b64fa03a12e1cb0db8f104ad -size 27136 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll deleted file mode 100644 index 530c0c8c0..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d77438cf927f8aef02dff89c233fa1507461660518417647d77547676a9ded04 -size 281088 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll deleted file mode 100644 index 7b675a90b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75c950bdc72d4cdd5e792ad79714264d0418b47de3c69b578b5c072898992427 -size 13312 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll deleted file mode 100644 index dc333045d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:996ffb6885ee0d5a2ccba34439df1a67bf8016fc05603adf08e42c691bc8eed0 -size 12288 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll deleted file mode 100644 index f4b0cb9fa..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c9679f30c684c16ec6c88a078cd10ad7d5814b72d2a7ce8a144507e2fedae746 -size 119808 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Core/2.2.0.0__31bf3856ad364e35/System.Reactive.Core.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Core/2.2.0.0__31bf3856ad364e35/System.Reactive.Core.dll deleted file mode 100644 index 6f017dd6a..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Core/2.2.0.0__31bf3856ad364e35/System.Reactive.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9fc263d0b2a584b19237c024ef6c7f0b7ebbf5c9b788faf1beae5b9d13100b06 -size 95744 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Debugger/2.2.0.0__31bf3856ad364e35/System.Reactive.Debugger.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Debugger/2.2.0.0__31bf3856ad364e35/System.Reactive.Debugger.dll deleted file mode 100644 index 0ec7ce0c4..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Debugger/2.2.0.0__31bf3856ad364e35/System.Reactive.Debugger.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73848bb977fa46e1bc518c3ef397b8364094dfa84fe4adbbdaba3f324842e8ba -size 5120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Experimental/2.2.0.0__31bf3856ad364e35/System.Reactive.Experimental.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Experimental/2.2.0.0__31bf3856ad364e35/System.Reactive.Experimental.dll deleted file mode 100644 index 03a75dd66..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Experimental/2.2.0.0__31bf3856ad364e35/System.Reactive.Experimental.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e75f52a62e044c40e2cc73daa0d6bf635a3568e091a3288eab1a759506c46d3 -size 28672 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Interfaces/2.2.0.0__31bf3856ad364e35/System.Reactive.Interfaces.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Interfaces/2.2.0.0__31bf3856ad364e35/System.Reactive.Interfaces.dll deleted file mode 100644 index ff9931d26..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Interfaces/2.2.0.0__31bf3856ad364e35/System.Reactive.Interfaces.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80f4b79f0ac6cb348dc3bc8d1e1c7ff947620719bc8a3700c8c24f8a869bbee7 -size 7680 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Linq/2.2.0.0__31bf3856ad364e35/System.Reactive.Linq.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Linq/2.2.0.0__31bf3856ad364e35/System.Reactive.Linq.dll deleted file mode 100644 index 6d3c458a9..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Linq/2.2.0.0__31bf3856ad364e35/System.Reactive.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b30f026869aa2be2c0a350c0458f39a81dce9aa1f5af172a7205b97f945c1bc4 -size 683008 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Observable.Aliases/0.0.0.0__31bf3856ad364e35/System.Reactive.Observable.Aliases.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Observable.Aliases/0.0.0.0__31bf3856ad364e35/System.Reactive.Observable.Aliases.dll deleted file mode 100644 index b9b2f253a..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Observable.Aliases/0.0.0.0__31bf3856ad364e35/System.Reactive.Observable.Aliases.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:318371120960ce15500798fe61a71c9bd96fa490d9746e942fd6b82eb4fd08a1 -size 9728 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.PlatformServices/2.2.0.0__31bf3856ad364e35/System.Reactive.PlatformServices.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.PlatformServices/2.2.0.0__31bf3856ad364e35/System.Reactive.PlatformServices.dll deleted file mode 100644 index cca6cdffc..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.PlatformServices/2.2.0.0__31bf3856ad364e35/System.Reactive.PlatformServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:816347965b0825548cfddef3b7da75f4e6c6fe268965554cadc0ee1456cd87ae -size 22528 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Providers/2.2.0.0__31bf3856ad364e35/System.Reactive.Providers.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Providers/2.2.0.0__31bf3856ad364e35/System.Reactive.Providers.dll deleted file mode 100644 index 48188c63d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Providers/2.2.0.0__31bf3856ad364e35/System.Reactive.Providers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:145ac53ae98c80ef2a71711877f440c87112b545fd3bbee10508056f6c251c92 -size 243200 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Runtime.Remoting/2.2.0.0__31bf3856ad364e35/System.Reactive.Runtime.Remoting.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Runtime.Remoting/2.2.0.0__31bf3856ad364e35/System.Reactive.Runtime.Remoting.dll deleted file mode 100644 index 58a658ee2..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Runtime.Remoting/2.2.0.0__31bf3856ad364e35/System.Reactive.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64eaa2ed52011844537552a3681337081bfd2779e32029ade82c389873289bc7 -size 9216 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Windows.Forms/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Forms.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Windows.Forms/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Forms.dll deleted file mode 100644 index b30d7c6cd..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Windows.Forms/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5199e3009306940807d88912ffda5c72359ade4aac5134a5bca29573b162101 -size 9728 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Windows.Threading/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Threading.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Windows.Threading/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Threading.dll deleted file mode 100644 index d3c27798d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reactive.Windows.Threading/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Threading.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f55a6654f734c5c4a9099a62c12b6138e9f4aca4f7717ab3ed2e67e21a292e9 -size 12800 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reflection.Context/4.0.0.0__b77a5c561934e089/System.Reflection.Context.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reflection.Context/4.0.0.0__b77a5c561934e089/System.Reflection.Context.dll deleted file mode 100644 index 3d087600f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Reflection.Context/4.0.0.0__b77a5c561934e089/System.Reflection.Context.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2ed7f7b821c9c09b3c51d9ea9fa5962961c8d022d61d4f283d3373071d43305 -size 13312 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll deleted file mode 100644 index b8a99178b..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d48e180e328d20ee492f5059f646d6d7d42bc64ff3e24d612fd0bd8295fbfaa -size 72192 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll deleted file mode 100644 index b8ce6d6d2..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b5c58a203c458c7439e91b15289ebf9670f0da0ff17381f4199958cbed88e4b6 -size 107008 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll deleted file mode 100644 index 37c6f3a83..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:928ffdef7e659f2500f2b8c1da5d6923f0adf1edc46240572c7495a5954df5cf -size 119808 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll deleted file mode 100644 index 3e88e2c86..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b47eb8ef8bd4dc99ad4c6965bcdc07719315e3851801cf7c2e50a7e1a9e1d5b8 -size 38912 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll deleted file mode 100644 index d8fe912e9..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0fd7051973a7a53c21fd6f4222dcee9c5abd701aeba9cfadc1d57302d4afa98 -size 933888 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll deleted file mode 100644 index 1e703b621..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dddc7dc788c2d91583cd5a59cb33cbc9e3dcd15a44654ec97a4e5312057e1fab -size 308224 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll deleted file mode 100644 index d033390a3..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d10a5850c9a676b691ac248b07235dbe33b49984fb2bc0b0142fb27584a684f -size 13312 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll deleted file mode 100644 index 861414124..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a21a6986d03cbf7b13e58f8d7a078df7ee03fe8b253c28dee8eb04a41eaed1e7 -size 141312 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll deleted file mode 100644 index a431a82bb..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60dace8025fa37d1a8112ada8f3e860857530298db56c2bbf427a3a39b812890 -size 214528 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll deleted file mode 100644 index 58217d8ee..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:240a392b274b1001f236062c008db650976742d3b021bc9fc509131ba72bedbd -size 37376 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll deleted file mode 100644 index 205e012d9..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:367141e8a7b0683218a43cb7007af0c53178b3b64728a378b76bbfb5c70d8668 -size 79360 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll deleted file mode 100644 index 6aed36c4e..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dbbef0cb9e0d57e38d096027879f3d0c0e18877f207ead9fe8bc937661ce6fe4 -size 1427456 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll deleted file mode 100644 index 4162bffe8..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3684d576acd24b707080585b4f1e75f565dbadbb9a37147a6682f028ad10550b -size 47104 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Threading.Tasks.Dataflow/4.0.0.0__b77a5c561934e089/System.Threading.Tasks.Dataflow.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Threading.Tasks.Dataflow/4.0.0.0__b77a5c561934e089/System.Threading.Tasks.Dataflow.dll deleted file mode 100644 index 248a05d01..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Threading.Tasks.Dataflow/4.0.0.0__b77a5c561934e089/System.Threading.Tasks.Dataflow.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b115157bc8139e47eb5b2e0d24c0c25c9971ab61b56b6ef0d839d36ff91f9984 -size 169472 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll deleted file mode 100644 index 31a179d05..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c4cf806987a94916a21e67cfbaf7f43801e3934f3e86302bbecdbba7bb4bda00 -size 34304 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll deleted file mode 100644 index d9a1f59c5..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:255a1ac548667aad9095d1c62b95177ac3337cd9d6b2e45698c3440eeb09829d -size 12800 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll deleted file mode 100644 index 100e11662..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c343612d28c4789b729646b8c2423822cbf0fd62ed9ac17ceb1a31ffd811ccc8 -size 33792 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll deleted file mode 100644 index 7bffde2c4..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41950b097714196611281ba6f5022700ee48521507f87730dea245a5fad0e41d -size 69120 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll deleted file mode 100644 index ce66e27bc..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2595deafb28ebe010bcdf7afe98d3d0778764d69cf4e8216da61f3b50496cfb -size 745984 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll deleted file mode 100644 index bdc096f36..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:792457aee4c76de5736342970ff888109d8ad93a0d6714d2e655cd6664069c61 -size 88064 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll deleted file mode 100644 index ef7baf251..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e2b1e327990f16601370539cd9dfec106f60f4d253b538a7c667cd962f4b384 -size 56320 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll deleted file mode 100644 index b52e15ac1..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ed47fe2c89507588c581c541b15cc29898ccd2c91acd3ddd3ad4890a9fdbd78e -size 326144 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Mobile/4.0.0.0__b03f5f7f11d50a3a/System.Web.Mobile.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Mobile/4.0.0.0__b03f5f7f11d50a3a/System.Web.Mobile.dll deleted file mode 100644 index 1717e4028..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Mobile/4.0.0.0__b03f5f7f11d50a3a/System.Web.Mobile.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:137ce52a4a40d473fc5a6399cfe3f7a3246564883e9e6632e9fd3ea1864e8336 -size 11264 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll deleted file mode 100644 index 3dddb1d7c..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ab0d5fe0f3fdc32bc9e8845525c961f0760e11f355082d07e2fe71b63cf1eb30 -size 419840 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll deleted file mode 100644 index 45cf57928..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:826430dada228195ebf1f89ae62bb436559a467cd42ed439ac128a8f19f7eae9 -size 254976 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.RegularExpressions/4.0.0.0__b03f5f7f11d50a3a/System.Web.RegularExpressions.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.RegularExpressions/4.0.0.0__b03f5f7f11d50a3a/System.Web.RegularExpressions.dll deleted file mode 100644 index ec9e91bed..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.RegularExpressions/4.0.0.0__b03f5f7f11d50a3a/System.Web.RegularExpressions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:110c17aaeec51e39c46404d407ddc2676cb177e613ac308f3a19376a2c401afc -size 11776 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll deleted file mode 100644 index fa12bcf31..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc348e583396e2233e0852e294fd447c586704645e33ad8f07a282dc83d13854 -size 12288 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll deleted file mode 100644 index a0e407ccd..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:294c0bc5d8332e59f1868a2caf7b0efa89f73a9531622362effa29806622f272 -size 787456 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll deleted file mode 100644 index b8b7f9156..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73241534c0c3cdd58518e8f44c6242560991da8f512ce6b8153fc998970e9079 -size 39424 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll deleted file mode 100644 index c89c8bfc6..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7dec6b96e26d2e9a4a1fb04d538b767ae52e7e6af4f97d2702158b861315e0a9 -size 38400 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll deleted file mode 100644 index 22a21998d..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87f90aaf716a0ceef7c984b277338998be1fc5b900dbe832df535b3c154dc251 -size 196608 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll deleted file mode 100644 index 61922d08f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b79ce024e9efdd1cd7d37f76a9c6bb817a28f631b8d9ca81d4ddda15812fbe0 -size 3028992 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Windows.Forms.DataVisualization/4.0.0.0__31bf3856ad364e35/System.Windows.Forms.DataVisualization.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Windows.Forms.DataVisualization/4.0.0.0__31bf3856ad364e35/System.Windows.Forms.DataVisualization.dll deleted file mode 100644 index 2a070e257..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Windows.Forms.DataVisualization/4.0.0.0__31bf3856ad364e35/System.Windows.Forms.DataVisualization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ba9ddba411040b752a84c2ce491797b2b19034299eaf95fd111f8414232e06d -size 145920 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll deleted file mode 100644 index 315200899..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:916cd054c0636fd0807ec0382a1560e01db44f066fd8ca2ad4c4d3ece255f93e -size 2899968 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.config b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.config deleted file mode 100644 index 54c6fd39c..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Windows/4.0.0.0__b03f5f7f11d50a3a/System.Windows.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Windows/4.0.0.0__b03f5f7f11d50a3a/System.Windows.dll deleted file mode 100644 index b50adfabf..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Windows/4.0.0.0__b03f5f7f11d50a3a/System.Windows.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9dd8b000c13af004af3a053874d5c6841c30191285cb12169666de5e2af83096 -size 11776 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Workflow.Activities/4.0.0.0__31bf3856ad364e35/System.Workflow.Activities.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Workflow.Activities/4.0.0.0__31bf3856ad364e35/System.Workflow.Activities.dll deleted file mode 100644 index fca6386e2..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Workflow.Activities/4.0.0.0__31bf3856ad364e35/System.Workflow.Activities.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70380dbe9bb2f7f5579f53c46b18b1c8ac85b6a0b36113933e26bfaf1aeeb444 -size 11776 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Workflow.ComponentModel/4.0.0.0__31bf3856ad364e35/System.Workflow.ComponentModel.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Workflow.ComponentModel/4.0.0.0__31bf3856ad364e35/System.Workflow.ComponentModel.dll deleted file mode 100644 index 990b915ba..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Workflow.ComponentModel/4.0.0.0__31bf3856ad364e35/System.Workflow.ComponentModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5fb47a521d6edbd862a36f20e30c6ed7275a3179bb02a94f79c23c5244e8448f -size 11776 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Workflow.Runtime/4.0.0.0__31bf3856ad364e35/System.Workflow.Runtime.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Workflow.Runtime/4.0.0.0__31bf3856ad364e35/System.Workflow.Runtime.dll deleted file mode 100644 index 08ea70034..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Workflow.Runtime/4.0.0.0__31bf3856ad364e35/System.Workflow.Runtime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dcbf098fc2d8b45fcea56a8201ff87eef64d89619d93eca75f7b861636ddec8b -size 11264 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll deleted file mode 100644 index 2783d9369..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:424fc16dc7a4fad5c73212806b6fe43d49e20c76773e0dca1e076fc7a292e516 -size 188928 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll deleted file mode 100644 index 527d2a1d9..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f77fa2719801869c15b10054d69aa548138483e154bc9f09e3d97083729f1e5 -size 137216 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Xml.Serialization/4.0.0.0__b77a5c561934e089/System.Xml.Serialization.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Xml.Serialization/4.0.0.0__b77a5c561934e089/System.Xml.Serialization.dll deleted file mode 100644 index 45d70b5ae..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Xml.Serialization/4.0.0.0__b77a5c561934e089/System.Xml.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f56b44f5f88ed426881eed8694e9d9cca2fc9fe26fd976bcaf39eb78b66faa7 -size 11776 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll deleted file mode 100644 index f760b3b24..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93d2f7ea513070bb935c3bfe3ed4dbab4ba076d200b96d24da4d2ebc40132254 -size 3174400 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll deleted file mode 100644 index eaea89586..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a26701ea88189483c5c55726ba3569c095fed4dfa4695d4e1eb83f0cf51c881 -size 2566144 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll deleted file mode 100644 index 3b16b367e..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6868231ce3d2f2ab831ced917274c1053d9da8002245b05c8e9353b1d72dd9db -size 161792 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild-frameworks/.NETFramework/v4.5/RedistList/FrameworkList.xml b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild-frameworks/.NETFramework/v4.5/RedistList/FrameworkList.xml deleted file mode 100644 index 2741a7830..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild-frameworks/.NETFramework/v4.5/RedistList/FrameworkList.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/Imports/Microsoft.Common.props/ImportBefore/Microsoft.NuGet.ImportBefore.props b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/Imports/Microsoft.Common.props/ImportBefore/Microsoft.NuGet.ImportBefore.props deleted file mode 100644 index 0dea8c03f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/Imports/Microsoft.Common.props/ImportBefore/Microsoft.NuGet.ImportBefore.props +++ /dev/null @@ -1,17 +0,0 @@ - - - - $(MSBuildExtensionsPath)\Microsoft\NuGet\Microsoft.NuGet.props - - - diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/Microsoft.Common.props b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/Microsoft.Common.props deleted file mode 100644 index 6c4d33cda..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/Microsoft.Common.props +++ /dev/null @@ -1,16 +0,0 @@ - - - true - true - - - - - - true - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/Microsoft.Common.targets/ImportAfter/Microsoft.NuGet.ImportAfter.targets b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/Microsoft.Common.targets/ImportAfter/Microsoft.NuGet.ImportAfter.targets deleted file mode 100644 index 71b454796..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/Microsoft.Common.targets/ImportAfter/Microsoft.NuGet.ImportAfter.targets +++ /dev/null @@ -1,17 +0,0 @@ - - - - $(MSBuildExtensionsPath)\Microsoft\NuGet\Microsoft.NuGet.targets - - - diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/MSBuild/Microsoft.Build.CommonTypes.xsd b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/MSBuild/Microsoft.Build.CommonTypes.xsd deleted file mode 100644 index 148f6bf4f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/MSBuild/Microsoft.Build.CommonTypes.xsd +++ /dev/null @@ -1,1581 +0,0 @@ - - - - - - - - - - - Reference to an assembly - - - - - - - - - Relative or absolute path to the assembly (optional) - - - - - Friendly display name (optional) - - - - - Fusion name of the assembly (optional) - - - - - Whether only the version in the fusion name should be referenced (optional, boolean) - - - - - Aliases for the reference (optional) - - - - - Whether the reference should be copied to the output folder (optional, boolean) - - - - - - - - Assembly name or filename - - - - - - - - - Reference to a COM component - - - - - - - - - Friendly display name (optional) - - - - - GUID in the form {00000000-0000-0000-0000-000000000000} - - - - - Major part of the version number - - - - - Minor part of the version number - - - - - Locale ID - - - - - Wrapper tool, such as tlbimp - - - - - Is it isolated (boolean) - - - - - - - - COM component name - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path to native reference - - - - - - - - - Reference to another project - - - - - - - - - Friendly display name (optional) - - - - - Project GUID, in the form {00000000-0000-0000-0000-000000000000} - - - - - - - - - Path to project file - - - - - - - - - Source files for compiler - - - - - - - - - - - Whether file was generated from another file (boolean) - - - - - - Notional path within project to display if the file is physically located outside of the project file's cone (optional) - - - - - - Display in user interface (optional, boolean) - - - - - - - - Semi-colon separated list of source files (wildcards are allowed) - - - - - - - - - Resources to be embedded in the generated assembly - - - - - - - - - - Name of any file generator that is run on this item - - - - - File that was created by any file generator that was run on this item - - - - - Namespace into which any file generator that is run on this item should create code - - - - - Notional path within project to display if the file is physically located outside of the project file's cone (optional) - - - - - Display in user interface (optional, boolean) - - - - - - - - - Semi-colon separated list of resource files (wildcards are allowed) - - - - - - - - - Files that are not compiled, but may be embedded or published - - - - - - - - - - Name of any file generator that is run on this item - - - - - - - Notional path within project to display if the file is physically located outside of the project file's cone (optional) - - - - - - Default, Included, Excluded, DataFile, or Prerequisite - - - - - - Display in user interface (optional, boolean) - - - - - - Copy file to output directory (optional, boolean, default false) - - - - - - - - Semi-colon separated list of content files (wildcards are allowed) - - - - - - - - - Files that should have no role in the build process - - - - - - - - - - - Name of any file generator that is run on this item - - - - - - - Notional path within project to display if the file is physically located outside of the project file's cone (optional) - - - - - Display in user interface (optional, boolean) - - - - - - - - - - - Folder on disk - - - - - Assemblies whose namespaces should be imported by the Visual Basic compiler - - - - - - Name of Web References folder to display in user interface - - - - - Represents a reference to a web service - - - - - - - - - - - - - - - - - - - URL to web service - - - - - - - - - - - - - - - Display in user interface (optional, boolean) - - - - - - - - - - - - - - - - - - - Display in user interface (optional, boolean) - - - - - - (boolean) - - - - - Default, Included, Excluded, DataFile, or Prerequisite - - - - - - - - - - - - - - - integer - - - - - Matches the expression "\d\.\d\.\d\.(\d|\*)" - - - - - Name of folder for Application Designer - - - - - - - Name of output assembly - - - - - - - - - boolean - - - - - - HomeSite, Relative, or Absolute - - - - - - boolean - - - - - - - - - boolean - - - - - - Whether to emit symbols (boolean) - - - - - none, pdbonly, or full - - - - - - - - - Whether DEBUG is defined (boolean) - - - - - Whether TRACE is defined (boolean) - - - - - - - boolean - - - - - - - - - - - - - - - - - - - - - - - - Web, Unc, or Disk - - - - - - - - - - - boolean - - - - - Matches the expression "\d\.\d\.\d\.\d" - - - - - - - - Whether standard libraries (such as mscorlib) should be referenced automatically (boolean) - - - - - Comma separated list of disabled warnings - - - - - boolean - - - - - Should compiler optimize output (boolean) - - - - - Option Compare setting (Text or Binary) - - - - - Should Option Explicit be set (On or Off) - - - - - Should Option Strict be set (On or Off) - - - - - - Path to output folder, with trailing slash - - - - - Type of output to generate (WinExe, Exe, or Library) - - - - - - - - - Command line to be run at the end of build - - - - - Command line to be run at the start of build - - - - - - - - - - - - - Semi-colon separated list of folders to search during reference resolution - - - - - - - - - - - - - - - - - - - - - - - - Type that contains the main entry point - - - - - - - - - boolean - - - - - - boolean - - - - - - Hours, Days, or Weeks - - - - - Foreground or Background - - - - - boolean - - - - - boolean - - - - - - - - - integer between 0 and 4 inclusive - - - - - Comma separated list of warning numbers to treat as errors - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/MSBuild/Microsoft.Build.Core.xsd b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/MSBuild/Microsoft.Build.Core.xsd deleted file mode 100644 index c8f2aacb1..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/MSBuild/Microsoft.Build.Core.xsd +++ /dev/null @@ -1,390 +0,0 @@ - - - - - - - - - - - - - - Optional semi-colon separated list of one or more targets that will be built if no targets are otherwise specified - - - - - - - - - - - - - Logs an Error event - - - - - Logs a Warning event - - - - - - - - - - - - - - - - Logs an Error event - - - - - Logs a Warning event - - - - - - - - - - - - - - - - - - - - Groups tasks into a section of the build process - - - - - - - - - - - Name of the target - - - - - Optional semi-colon separated list of targets that should be run before this target - - - - - Optional semi-colon separated list of files that form inputs into this target. Their timestamps will be compared with the timestamps of files in Outputs to determine whether the Target is up to date - - - - - Optional semi-colon separated list of files that form outputs into this target. Their timestamps will be compared with the timestamps of files in Inputs to determine whether the Target is up to date - - - - - Optional expression evaluated to determine whether the Target and the targets it depends on should be run - - - - - - - Groups property definitions - - - - - - - Optional expression evaluated to determine whether the PropertyGroup should be used - - - - - - - Groups item list definitions - - - - - - - Optional expression evaluated to determine whether the ItemGroup should be used - - - - - - - Groups When and Otherwise elements - - - - - - - - - - Groups PropertyGroup and/or ItemGroup elements - - - - - - - - - - - Optional expression evaluated to determine whether the child PropertyGroups and/or ItemGroups should be used - - - - - - - Groups PropertyGroup and/or ItemGroup elements that are used if no Conditions on sibling When elements evaluate to true - - - - - - - - - - - - - Specifies targets to execute in the event of a recoverable error - - - - Optional expression evaluated to determine whether the targets should be executed - - - - - Semi-colon separated list of targets to execute - - - - - - - Logs an informational Message event, with an optional Importance - - - - Optional expression evaluated to determine whether the Message should be logged - - - - - Optional priority level. Allowed values are Low, Normal (default), and High - - - - - Text to log - - - - - - - - Optional expression evaluated to determine whether the text should be logged - - - - - Text to log - - - - - - - Declares where to load a task that will be used in the project - - - - Optional expression evaluated to determine whether the declaration should be evaluated - - - - - Optional name of assembly containing the task. Either AssemblyName or AssemblyFile must be used - - - - - Optional path to assembly containing the task. Either AssemblyName or AssemblyFile must be used - - - - - Name of task class in the assembly - - - - - - - Declares that the contents of another project file should be inserted at this location - - - - Optional expression evaluated to determine whether the import should occur - - - - - Project file to import - - - - - - - Optional section used by MSBuild hosts, that may contain arbitrary XML content that is ignored by MSBuild itself - - - - - - - - - - - - - Optional expression evaluated to determine whether the items should be evaluated - - - - - Semi-colon separated list of files (wildcards are allowed) or other item names to include in this item list - - - - - Semi-colon separated list of files (wildcards are allowed) or other item names to exclude from the Include list - - - - - - - - - - - - - - - - - - - - - - - - - Optional expression evaluated to determine whether the property should be evaluated - - - - - - - - - - - - - - Optional expression evaluated to determine whether the property should be evaluated - - - - - - - - - - - Optional element specifying a specific task output to be gathered - - - - - Task parameter to gather. Matches the name of a .NET Property on the task class that has an [Output] attribute - - - - - Optional name of an item list to put the gathered outputs into. Either ItemName or PropertyName must be specified - - - - - Optional name of a property to put the gathered output into. Either PropertyName or ItemName must be specified - - - - - Optional expression evaluated to determine whether the output should be gathered - - - - - - - - Optional expression evaluated to determine whether the task should be executed - - - - - Optional boolean indicating whether a recoverable task error should be ignored. Default false - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Engine.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Engine.dll deleted file mode 100644 index c7eeb3666..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Engine.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dcac953e14c5d04627e28305d6b72a0016482acff4076ed3e5fa8fa7444db28d -size 236032 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Framework.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Framework.dll deleted file mode 100644 index 78e669561..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Framework.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b50929bd7ed0404c2e837836c39638d0a3d5a2ad5f76d940560932fb49b5454 -size 32768 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Tasks.Core.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Tasks.Core.dll deleted file mode 100644 index 61a411f43..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Tasks.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:351982fb9159b0f98a6fb65a6251243432b46d97b2ffaf0d73366f4172f85aff -size 175104 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Utilities.Core.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Utilities.Core.dll deleted file mode 100644 index 27ab335d6..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Utilities.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:283695895c4138f193ff3329ec9eb59b853d057d5e93256e863e73d022b7536a -size 56320 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.dll deleted file mode 100644 index da127e37f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31bf6e0193a48615b2dcf3e19eea5a827a7ba8ccc1430359c322fa246a8fcb7c -size 280064 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.xsd b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.xsd deleted file mode 100644 index e88f00f0f..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.xsd +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.CSharp.targets b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.CSharp.targets deleted file mode 100644 index 2cd20a10c..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.CSharp.targets +++ /dev/null @@ -1,142 +0,0 @@ - - - .cs - C# - - - - false - - - - - - - - $(MSBuildAllProjects);$(MSBuildToolsPath)\Microsoft.CSharp.targets - - - - true - - - - - - - - - - <_ExplicitReference Include="@(_TargetFrameworkDirectories->'%(FullPath)\mscorlib.dll')" Condition="Exists('%(FullPath)\mscorlib.dll')"> - false - - - - <_ExplicitMSCorlibPath>$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToStandardLibraries ('$(TargetFrameworkIdentifier)', '$(TargetFrameworkVersion)', '$(TargetFrameworkProfile)'))\mscorlib.dll - - - <_ExplicitReference Include="@(_TargetFrameworkDirectories->'%(FullPath)\mscorlib.dll')" Condition="Exists('%(FullPath)\mscorlib.dll')"> - false - - - - <_ExplicitReference Include="$(_ExplicitMSCorlibPath)" Condition="Exists('$(_ExplicitMSCorlibPath)')"> - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(ResolveAssemblyReferencesDependsOn);_AddCorlibReference - - - - -// <autogenerated /> -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute("$(TargetFrameworkMoniker)", FrameworkDisplayName = "$(TargetFrameworkMonikerDisplayName)")] - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Common.targets b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Common.targets deleted file mode 100644 index 43e416188..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Common.targets +++ /dev/null @@ -1,961 +0,0 @@ - - - - - true - true - - - - - - - - Exe - .exe - .exe - .dll - .netmodule - - - - $(MSBuildProjectDirectory)\ - - - - - 14.0 - - - - $(MSBuildProjectName) - $(OutputPath)\ - bin\Debug\ - - .NETFramework - v4.0 - - $(TargetFrameworkIdentifier),Version=$(TargetFrameworkVersion),Profile=$(TargetFrameworkProfile) - $(TargetFrameworkIdentifier),Version=$(TargetFrameworkVersion) - - - - $(OutputPath) - $(OutDir)\ - - <_OriginalConfiguration>$(Configuration) - Debug - $(Configuration) - - <_OriginalPlatform>$(Platform) - AnyCPU - $(Platform) - - - - - true - System.Core;$(AdditionalExplicitAssemblyReferences) - - - - true - - - - obj\ - $(BaseIntermediateOutputPath)\ - $(MSBuildProjectFile).FilesWrittenAbsolute.txt - - - - $(BaseIntermediateOutputPath)$(Configuration)\ - $(BaseIntermediateOutputPath)$(PlatformName)\$(Configuration)\ - - - - $(IntermediateOutputPath)\ - - - - - - - <_OutDirItem Include="$(OutDir)"/> - - - - $(AssemblyName) - $(TargetName)$(TargetExt) - @(_OutDirItem->'%(FullPath)') - @(_OutDirItem->'%(FullPath)\$(TargetFileName)') - $(MSBuildAllProjects);$(MSBuildProjectFullPath);$(MSBuildToolsPath)\Microsoft.Common.targets - $(AssemblyOriginatorKeyFile) - true - - - - - - - - - - - - - AssignLinkMetadata - - - - - - - - - - - - - - - - - - - - - - - - - <_EmbeddedResourceWithLinkAssigned Remove="@(_EmbeddedResourceWithLinkAssigned)" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <_TargetFrameworkDirectories Include="$(_TargetFrameworkDirectories);$(TargetFrameworkDirectory)" KeepDuplicates="false" /> - - - @(_TargetFrameworkDirectories) - - - - - - <_DesignTimeFacadeAssemblies Include="%(DesignTimeFacadeDirectories.Identity)\*.dll"/> - - - - $(TargetFrameworkDirectory);@(DesignTimeFacadeDirectories) - - - - - - - .exe; - .dll - - - - .exe.mdb; - .dll.mdb; - .pdb; - .xml - - - - {CandidateAssemblyFiles}; - $(ReferencePath); - @(AdditionalReferencePath); - {HintPathFromItem}; - {TargetFrameworkDirectory}; - {PkgConfig}; - {GAC}; - {RawFileName}; - $(OutDir) - - - - BeforeResolveReferences; - ResolveProjectReferences; - ResolveAssemblyReferences; - AfterResolveReferences - - - - GetFrameworkPaths; - GetReferenceAssemblyPaths; - PrepareForBuild - - - - - $(IntermediateOutputPath)$(TargetFrameworkMoniker).AssemblyAttribute$(DefaultLanguageSourceExtension) - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BuildOnlySettings; - BeforeBuild; - CoreBuild; - AfterBuild - - - - - - - - - - - - PrepareForBuild; - GetFrameworkPaths; - GetReferenceAssemblyPaths; - PreBuildEvent; - ResolveReferences; - CopyFilesMarkedCopyLocal; - PrepareResources; - Compile; - PrepareForRun; - DeployOutputFiles; - _RecordCleanFile; - PostBuildEvent - - - - - - - - - - - - - ResolveReferences; - GenerateTargetFrameworkMonikerAttribute; - BeforeCompile; - _TimestampBeforeCompile; - CoreCompile; - _TimestampAfterCompile; - AfterCompile - - - - - - - - - - - DeployOutputFiles - - - - - - - AssignTargetPaths; - SplitResourcesByCulture; - CreateManifestResourceNames; - CopyNonResxEmbeddedResources; - GenerateResources; - GenerateSatelliteAssemblies; - CompileLicxFiles - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BeforeRebuild; - Clean; - $(MSBuildProjectDefaultTargets); - AfterRebuild; - - - - BeforeRebuild; - Clean; - Build; - AfterRebuild; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BeforeClean; - CleanReferencedProjects; - CoreClean; - AfterClean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - $(ResolveReferencesDependsOn); - ImplicitlyExpandDesignTimeFacades - - - - $(ImplicitlyExpandDesignTimeFacadesDependsOn); - GetReferenceAssemblyPaths - - - - - - - - <_HasReferenceToSystemRuntime Condition="'$(DependsOnSystemRuntime)' == 'true' or '%(_ResolvedProjectReferencePaths.TargetPlatformIdentifier)' == 'Portable'">true - - - - - - - false - false - ImplicitlyExpandDesignTimeFacades - - <_ResolveAssemblyReferenceResolvedFiles Include="@(ReferencePath)" Condition="'%(ReferencePath.ResolvedFrom)' == 'ImplicitlyExpandDesignTimeFacades'" /> - - - - - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Common.tasks b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Common.tasks deleted file mode 100644 index 54d9caab7..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Common.tasks +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.VisualBasic.targets b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.VisualBasic.targets deleted file mode 100644 index cf35f8251..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Microsoft.VisualBasic.targets +++ /dev/null @@ -1,120 +0,0 @@ - - - .vb - VB - - - - - - - - CONFIG="$(Configuration)" - $(FinalDefineConstants),DEBUG=-1 - $(FinalDefineConstants),TRACE=-1 - $(FinalDefineConstants),_MyType="$(MyType)" - $(FinalDefineConstants),PLATFORM="$(Platform)" - $(FinalDefineConstants),PLATFORM="AnyCPU" - $(FinalDefineConstants),$(DefineConstants) - - <_NoWarnings Condition=" '$(WarningLevel)' == '0' ">true - <_NoWarnings Condition=" '$(WarningLevel)' == '1' ">false - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - vbnc.exe - - - diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Mono.XBuild.Tasks.dll b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Mono.XBuild.Tasks.dll deleted file mode 100644 index 4b33c7fe9..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/Mono.XBuild.Tasks.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:944dde2c70e9724c6a62c0d4db43ba1843f4461e7758d12a272d86ad361c6fba -size 36864 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/xbuild.exe b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/xbuild.exe deleted file mode 100755 index 39019318c..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/xbuild.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75d27683cb28b9585330d289ecc5f61cb57e32f35858f313f753f6a8dc8959d3 -size 62976 diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/xbuild.exe.config b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/xbuild.exe.config deleted file mode 100644 index a1efcc318..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/xbuild.exe.config +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/xbuild.rsp b/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/xbuild.rsp deleted file mode 100644 index 9b9ce7087..000000000 --- a/Source/Platforms/Editor/Linux/Mono/lib/mono/xbuild/14.0/bin/xbuild.rsp +++ /dev/null @@ -1,3 +0,0 @@ -# xbuild command line options specified here will be used -# by xbuild on every build, unless /noautoresponse is passed -# on the command line. diff --git a/Source/Platforms/Editor/Mac/.gitignore b/Source/Platforms/Editor/Mac/.gitignore deleted file mode 100644 index 00be8b280..000000000 --- a/Source/Platforms/Editor/Mac/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -!Binaries/ -!bin/ -!*.* -*.DS_Store diff --git a/Source/Platforms/Editor/Mac/Mono/bin/mono b/Source/Platforms/Editor/Mac/Mono/bin/mono deleted file mode 100755 index 6a7ec4749..000000000 Binary files a/Source/Platforms/Editor/Mac/Mono/bin/mono and /dev/null differ diff --git a/Source/Platforms/Editor/Mac/Mono/etc/mono/2.0/Browsers/Compat.browser b/Source/Platforms/Editor/Mac/Mono/etc/mono/2.0/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Editor/Mac/Mono/etc/mono/2.0/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Editor/Mac/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Editor/Mac/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Editor/Mac/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Editor/Mac/Mono/etc/mono/2.0/machine.config b/Source/Platforms/Editor/Mac/Mono/etc/mono/2.0/machine.config deleted file mode 100644 index 2577c81dd..000000000 --- a/Source/Platforms/Editor/Mac/Mono/etc/mono/2.0/machine.config +++ /dev/null @@ -1,280 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
- - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Mac/Mono/etc/mono/2.0/settings.map b/Source/Platforms/Editor/Mac/Mono/etc/mono/2.0/settings.map deleted file mode 100644 index 9a52ccc02..000000000 --- a/Source/Platforms/Editor/Mac/Mono/etc/mono/2.0/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Mac/Mono/etc/mono/2.0/web.config b/Source/Platforms/Editor/Mac/Mono/etc/mono/2.0/web.config deleted file mode 100644 index e1428f8c3..000000000 --- a/Source/Platforms/Editor/Mac/Mono/etc/mono/2.0/web.config +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.0/Browsers/Compat.browser b/Source/Platforms/Editor/Mac/Mono/etc/mono/4.0/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.0/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Editor/Mac/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.0/machine.config b/Source/Platforms/Editor/Mac/Mono/etc/mono/4.0/machine.config deleted file mode 100644 index f3b71c43c..000000000 --- a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.0/machine.config +++ /dev/null @@ -1,307 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - - -
- -
-
-
-
- - - - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
-
-
-
- - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.0/settings.map b/Source/Platforms/Editor/Mac/Mono/etc/mono/4.0/settings.map deleted file mode 100644 index 4c53aca67..000000000 --- a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.0/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.0/web.config b/Source/Platforms/Editor/Mac/Mono/etc/mono/4.0/web.config deleted file mode 100644 index 2a7dfd2ed..000000000 --- a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.0/web.config +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.5/Browsers/Compat.browser b/Source/Platforms/Editor/Mac/Mono/etc/mono/4.5/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.5/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Editor/Mac/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.5/machine.config b/Source/Platforms/Editor/Mac/Mono/etc/mono/4.5/machine.config deleted file mode 100644 index 455709536..000000000 --- a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.5/machine.config +++ /dev/null @@ -1,310 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
- - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - - -
- -
-
-
-
- - - - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
-
-
-
- - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.5/settings.map b/Source/Platforms/Editor/Mac/Mono/etc/mono/4.5/settings.map deleted file mode 100644 index 4c53aca67..000000000 --- a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.5/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.5/web.config b/Source/Platforms/Editor/Mac/Mono/etc/mono/4.5/web.config deleted file mode 100644 index 324c529f0..000000000 --- a/Source/Platforms/Editor/Mac/Mono/etc/mono/4.5/web.config +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Mac/Mono/etc/mono/browscap.ini b/Source/Platforms/Editor/Mac/Mono/etc/mono/browscap.ini deleted file mode 100644 index 1267e1deb..000000000 --- a/Source/Platforms/Editor/Mac/Mono/etc/mono/browscap.ini +++ /dev/null @@ -1,16979 +0,0 @@ -;;; Provided courtesy of http://browsers.garykeith.com -;;; Created on Wednesday, June 17, 2009 at 6:30 AM GMT - -[GJK_Browscap_Version] -Version=4476 -Released=Wed, 17 Jun 2009 06:30:21 -0000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DefaultProperties - -[DefaultProperties] -Browser=DefaultProperties -Version=0 -MajorVer=0 -MinorVer=0 -Platform=unknown -Alpha=false -Beta=false -Win16=false -Win32=false -Win64=false -Frames=false -IFrames=false -Tables=false -Cookies=false -BackgroundSounds=false -CDF=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -isBanned=false -isMobileDevice=false -isSyndicationReader=false -Crawler=false -CssVersion=0 -supportsCSS=false -AOL=false -aolVersion=0 -ECMAScriptVersion=0.0 -W3CDOMVersion=0.0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ask - -[Ask] -Parent=DefaultProperties -Browser=Ask -Frames=true -Tables=true -Crawler=true - -[Mozilla/?.0 (compatible; Ask Jeeves/Teoma*)] -Parent=Ask -Browser=Teoma - -[Mozilla/2.0 (compatible; Ask Jeeves)] -Parent=Ask -Browser=AskJeeves - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Baidu - -[Baidu] -Parent=DefaultProperties -Browser=Baidu -Frames=true -Tables=true -Crawler=true - -[BaiduImageSpider*] -Parent=Baidu -Browser=BaiduImageSpider - -[Baiduspider*] -Parent=Baidu -Browser=BaiDu - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google - -[Google] -Parent=DefaultProperties -Browser=Google -Frames=true -IFrames=true -Tables=true -JavaScript=true -Crawler=true - -[* (compatible; Googlebot-Mobile/2.1; *http://www.google.com/bot.html)] -Parent=Google -Browser=Googlebot-Mobile -Frames=false -IFrames=false -Tables=false - -[*Google Wireless Transcoder*] -Parent=Google -Browser=Google Wireless Transcoder - -[AdsBot-Google (?http://www.google.com/adsbot.html)] -Parent=Google -Browser=AdsBot-Google - -[Feedfetcher-Google-iGoogleGadgets;*] -Parent=Google -Browser=iGoogleGadgets -isBanned=true -isSyndicationReader=true - -[Feedfetcher-Google;*] -Parent=Google -Browser=Feedfetcher-Google -isBanned=true -isSyndicationReader=true - -[Google OpenSocial agent (http://www.google.com/feedfetcher.html)] -Parent=Google -Browser=Google OpenSocial - -[Google-Site-Verification/1.0] -Parent=Google -Browser=Google-Site-Verification - -[Google-Sitemaps/*] -Parent=Google -Browser=Google-Sitemaps - -[Googlebot-Image/*] -Parent=Google -Browser=Googlebot-Image -CDF=true - -[googlebot-urlconsole] -Parent=Google -Browser=googlebot-urlconsole - -[Googlebot-Video/1.0] -Parent=Google -Browser=Google-Video - -[Googlebot/2.1 (?http://www.google.com/bot.html)] -Parent=Google -Browser=Googlebot - -[Googlebot/2.1 (?http://www.googlebot.com/bot.html)] -Parent=Google -Browser=Googlebot - -[Googlebot/Test*] -Parent=Google -Browser=Googlebot/Test - -[gsa-crawler*] -Parent=Google -Browser=Google Search Appliance -isBanned=true - -[Mediapartners-Google*] -Parent=Google -Browser=Mediapartners-Google - -[Mozilla/4.0 (compatible; Google Desktop)] -Parent=Google -Browser=Google Desktop - -[Mozilla/4.0 (compatible; GoogleToolbar*)] -Parent=Google -Browser=Google Toolbar -isBanned=true - -[Mozilla/5.0 (compatible; Google Keyword Tool;*)] -Parent=Google -Browser=Google Keyword Tool - -[Mozilla/5.0 (compatible; Googlebot/2.1; ?http://www.google.com/bot.html)] -Parent=Google -Browser=Google Webmaster Tools - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Inktomi - -[Inktomi] -Parent=DefaultProperties -Browser=Inktomi -Frames=true -Tables=true -Crawler=true - -[* (compatible;YahooSeeker/M1A1-R2D2; *)] -Parent=Inktomi -Browser=YahooSeeker-Mobile -Frames=false -Tables=false - -[Mozilla/4.0] -Parent=Inktomi - -[Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)] -Parent=Inktomi -Win32=true - -[Mozilla/4.0 (compatible; Yahoo Japan; for robot study; kasugiya)] -Parent=Inktomi -Browser=Yahoo! RobotStudy -isBanned=true - -[Mozilla/5.0 (compatible; BMC/1.0 (Y!J-AGENT))] -Parent=Inktomi -Browser=Y!J-AGENT/BMC - -[Mozilla/5.0 (compatible; BMF/1.0 (Y!J-AGENT))] -Parent=Inktomi -Browser=Y!J-AGENT/BMF - -[Mozilla/5.0 (compatible; BMI/1.0 (Y!J-AGENT; 1.0))] -Parent=Inktomi -Browser=Y!J-AGENT/BMI - -[Mozilla/5.0 (compatible; Yahoo! DE Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Directory Engine - -[Mozilla/5.0 (compatible; Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html)] -Parent=Inktomi -Browser=Yahoo! Slurp China - -[Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Slurp -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Slurp - -[Mozilla/5.0 (compatible; Yahoo! Verifier/1.1)] -Parent=Inktomi -Browser=Yahoo! Verifier -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Slurp/cat; slurp@inktomi.com; http://www.inktomi.com/slurp.html)] -Parent=Inktomi -Browser=Slurp/cat - -[Mozilla/5.0 (Slurp/si; slurp@inktomi.com; http://www.inktomi.com/slurp.html)] -Parent=Inktomi - -[Mozilla/5.0 (Yahoo-MMCrawler/4.0; mailto:vertical-crawl-support@yahoo-inc.com)] -Parent=Inktomi -Browser=Yahoo-MMCrawler -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Scooter/*] -Parent=Inktomi -Browser=Scooter - -[Scooter/3.3Y!CrawlX] -Parent=Inktomi -Browser=Scooter/3.3Y!CrawlX -Version=3.3 -MajorVer=3 -MinorVer=3 - -[slurp] -Parent=Inktomi -Browser=slurp - -[Y!J-BSC/1.0*] -Parent=Inktomi -Browser=Y!J-BSC -Version=1.0 -MajorVer=1 -MinorVer=0 -isBanned=true - -[Y!J-SRD/1.0] -Parent=Inktomi -Browser=Y!J-SRD -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Yahoo Mindset] -Parent=Inktomi -Browser=Yahoo Mindset - -[Yahoo Pipes*] -Parent=Inktomi -Browser=Yahoo Pipes - -[Yahoo! Mindset] -Parent=Inktomi -Browser=Yahoo! Mindset - -[Yahoo! Slurp/Site Explorer] -Parent=Inktomi -Browser=Yahoo! Site Explorer - -[Yahoo-Blogs/*] -Parent=Inktomi -Browser=Yahoo-Blogs - -[Yahoo-MMAudVid*] -Parent=Inktomi -Browser=Yahoo-MMAudVid - -[Yahoo-MMCrawler*] -Parent=Inktomi -Browser=Yahoo-MMCrawler -isBanned=true - -[YahooFeedSeeker*] -Parent=Inktomi -Browser=YahooFeedSeeker -isSyndicationReader=true -Crawler=false - -[YahooSeeker/*] -Parent=Inktomi -Browser=YahooSeeker -isMobileDevice=true - -[YahooSeeker/CafeKelsa (compatible; Konqueror/3.2; FreeBSD*) (KHTML, like Gecko)] -Parent=Inktomi -Browser=YahooSeeker/CafeKelsa - -[YahooSeeker/CafeKelsa-dev (compatible; Konqueror/3.2; FreeBSD*) (KHTML, like Gecko)] -Parent=Inktomi - -[YahooVideoSearch*] -Parent=Inktomi -Browser=YahooVideoSearch - -[YahooYSMcm*] -Parent=Inktomi -Browser=YahooYSMcm - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN - -[MSN] -Parent=DefaultProperties -Browser=MSN -Frames=true -Tables=true -Crawler=true - -[adidxbot/1.1 (?http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=adidxbot - -[librabot/1.0 (*)] -Parent=MSN -Browser=librabot - -[llssbot/1.0] -Parent=MSN -Browser=llssbot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MSMOBOT/1.1*] -Parent=MSN -Browser=msnbot-mobile -Version=1.1 -MajorVer=1 -MinorVer=1 - -[MSNBot-Academic/1.0*] -Parent=MSN -Browser=MSNBot-Academic -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot-media/1.0*] -Parent=MSN -Browser=msnbot-media -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot-media/1.1*] -Parent=MSN -Browser=msnbot-media -Version=1.1 -MajorVer=1 -MinorVer=1 - -[MSNBot-News/1.0*] -Parent=MSN -Browser=MSNBot-News -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MSNBot-NewsBlogs/1.0*] -Parent=MSN -Browser=MSNBot-NewsBlogs -Version=1 -MajorVer=1 -MinorVer=0 - -[msnbot-products] -Parent=MSN -Browser=msnbot-products - -[msnbot-webmaster/1.0 (*http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=msnbot-webmaster tools - -[msnbot/1.0*] -Parent=MSN -Browser=msnbot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot/1.1*] -Parent=MSN -Browser=msnbot -Version=1.1 -MajorVer=1 -MinorVer=1 - -[msnbot/2.0b*] -Parent=MSN -Version=2.0 -MajorVer=2 -MinorVer=0 -Beta=true - -[MSR-ISRCCrawler] -Parent=MSN -Browser=MSR-ISRCCrawler - -[renlifangbot/1.0 (?http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=renlifangbot - -[T-Mobile Dash Mozilla/4.0 (*) MSNBOT-MOBILE/1.1 (*)] -Parent=MSN -Browser=msnbot-mobile - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yahoo - -[Yahoo] -Parent=DefaultProperties -Browser=Yahoo -Frames=true -Tables=true -Crawler=true - -[Mozilla/4.0 (compatible; Y!J; for robot study*)] -Parent=Yahoo -Browser=Y!J - -[Mozilla/5.0 (Yahoo-Test/4.0*)] -Parent=Yahoo -Browser=Yahoo-Test -Version=4.0 -MajorVer=4 -MinorVer=0 - -[mp3Spider cn-search-devel at yahoo-inc dot com] -Parent=Yahoo -Browser=Yahoo! Media -isBanned=true - -[My Browser] -Parent=Yahoo -Browser=Yahoo! My Browser - -[Y!OASIS/*] -Parent=Yahoo -Browser=Y!OASIS -isBanned=true - -[YahooYSMcm/2.0.0] -Parent=Yahoo -Browser=YahooYSMcm -Version=2.0 -MajorVer=2 -MinorVer=0 -isBanned=true - -[YRL_ODP_CRAWLER] -Parent=Yahoo -Browser=YRL_ODP_CRAWLER -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yandex - -[Yandex] -Parent=DefaultProperties -Browser=Yandex -Frames=true -IFrames=true -Tables=true -Cookies=true -Crawler=true - -[Mozilla/4.0 (compatible; MSIE 5.0; YANDEX)] -Parent=Yandex - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9) Gecko VisualParser/3.0] -Parent=Yandex -Browser=VisualParser -isBanned=true - -[YaDirectBot/*] -Parent=Yandex -Browser=YaDirectBot - -[Yandex/*] -Parent=Yandex - -[YandexBlog/*] -Parent=Yandex -Browser=YandexBlog -isSyndicationReader=true - -[YandexSomething/*] -Parent=Yandex -Browser=YandexSomething -isSyndicationReader=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Best of the Web - -[Best of the Web] -Parent=DefaultProperties -Browser=Best of the Web -Frames=true -Tables=true - -[Mozilla/4.0 (compatible; BOTW Feed Grabber; *http://botw.org)] -Parent=Best of the Web -Browser=BOTW Feed Grabber -isSyndicationReader=true -Crawler=false - -[Mozilla/4.0 (compatible; BOTW Spider; *http://botw.org)] -Parent=Best of the Web -Browser=BOTW Spider -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Boitho - -[Boitho] -Parent=DefaultProperties -Browser=Boitho -Frames=true -Tables=true -Crawler=true - -[boitho.com-dc/*] -Parent=Boitho -Browser=boitho.com-dc - -[boitho.com-robot/*] -Parent=Boitho -Browser=boitho.com-robot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Convera - -[Convera] -Parent=DefaultProperties -Browser=Convera -Frames=true -Tables=true -Crawler=true - -[ConveraCrawler/*] -Parent=Convera -Browser=ConveraCrawler - -[ConveraMultiMediaCrawler/0.1*] -Parent=Convera -Browser=ConveraMultiMediaCrawler -Version=0.1 -MajorVer=0 -MinorVer=1 - -[CrawlConvera*] -Parent=Convera -Browser=CrawlConvera - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DotBot - -[DotBot] -Parent=DefaultProperties -Browser=DotBot -Frames=true -Tables=true -isBanned=true -Crawler=true - -[DotBot/* (http://www.dotnetdotcom.org/*)] -Parent=DotBot - -[Mozilla/5.0 (compatible; DotBot/*; http://www.dotnetdotcom.org/*)] -Parent=DotBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Entireweb - -[Entireweb] -Parent=DefaultProperties -Browser=Entireweb -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[Mozilla/4.0 (compatible; SpeedySpider; www.entireweb.com)] -Parent=Entireweb - -[Speedy Spider (*Beta/*)] -Parent=Entireweb - -[Speedy?Spider?(http://www.entireweb.com*)] -Parent=Entireweb - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Envolk - -[Envolk] -Parent=DefaultProperties -Browser=Envolk -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[envolk/* (?http://www.envolk.com/envolk*)] -Parent=Envolk - -[envolk?ITS?spider/* (?http://www.envolk.com/envolk*)] -Parent=Envolk - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Exalead - -[Exalead] -Parent=DefaultProperties -Browser=Exalead -Frames=true -Tables=true -isBanned=true -Crawler=true - -[Exabot-Images/1.0] -Parent=Exalead -Browser=Exabot-Images -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Exabot-Test/*] -Parent=Exalead -Browser=Exabot-Test - -[Exabot/2.0] -Parent=Exalead -Browser=Exabot - -[Exabot/3.0] -Parent=Exalead -Browser=Exabot -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Liberate - -[Exalead NG/*] -Parent=Exalead -Browser=Exalead NG -isBanned=true - -[Mozilla/5.0 (compatible; Exabot-Images/3.0;*)] -Parent=Exalead -Browser=Exabot-Images - -[Mozilla/5.0 (compatible; Exabot/3.0 (BiggerBetter/tests);*)] -Parent=Exalead -Browser=Exabot/BiggerBetter/tests - -[Mozilla/5.0 (compatible; Exabot/3.0;*)] -Parent=Exalead -Browser=Exabot -isBanned=false - -[Mozilla/5.0 (compatible; NGBot/*)] -Parent=Exalead - -[ng/*] -Parent=Exalead -Browser=Exalead Previewer -Version=1.0 -MajorVer=1 -MinorVer=0 -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fast/AllTheWeb - -[Fast/AllTheWeb] -Parent=DefaultProperties -Browser=Fast/AllTheWeb -Alpha=true -Beta=true -Win16=true -Win32=true -Win64=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -isBanned=true -isMobileDevice=true -isSyndicationReader=true -Crawler=true - -[*FAST Enterprise Crawler*] -Parent=Fast/AllTheWeb -Browser=FAST Enterprise Crawler - -[FAST Data Search Document Retriever/4.0*] -Parent=Fast/AllTheWeb -Browser=FAST Data Search Document Retriever - -[FAST MetaWeb Crawler (helpdesk at fastsearch dot com)] -Parent=Fast/AllTheWeb -Browser=FAST MetaWeb Crawler - -[Fast PartnerSite Crawler*] -Parent=Fast/AllTheWeb -Browser=FAST PartnerSite - -[FAST-WebCrawler/*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler - -[FAST-WebCrawler/*/FirstPage*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/FirstPage - -[FAST-WebCrawler/*/Fresh*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/Fresh - -[FAST-WebCrawler/*/PartnerSite*] -Parent=Fast/AllTheWeb -Browser=FAST PartnerSite - -[FAST-WebCrawler/*?Multimedia*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/Multimedia - -[FastSearch Web Crawler for*] -Parent=Fast/AllTheWeb -Browser=FastSearch Web Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Gigabot - -[Gigabot] -Parent=DefaultProperties -Browser=Gigabot -Frames=true -IFrames=true -Tables=true -Crawler=true - -[Gigabot*] -Parent=Gigabot - -[GigabotSiteSearch/*] -Parent=Gigabot -Browser=GigabotSiteSearch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ilse - -[Ilse] -Parent=DefaultProperties -Browser=Ilse -Frames=true -Tables=true -Crawler=true - -[IlseBot/*] -Parent=Ilse - -[INGRID/?.0*] -Parent=Ilse -Browser=Ilse - -[Mozilla/3.0 (INGRID/*] -Parent=Ilse -Browser=Ilse - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iVia Project - -[iVia Project] -Parent=DefaultProperties -Browser=iVia Project -Frames=true -IFrames=true -Tables=true -Crawler=true - -[DataFountains/DMOZ Downloader*] -Parent=iVia Project -Browser=DataFountains/DMOZ Downloader -isBanned=true - -[DataFountains/DMOZ Feature Vector Corpus Creator*] -Parent=iVia Project -Browser=DataFountains/DMOZ Feature Vector Corpus - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Jayde Online - -[Jayde Online] -Parent=DefaultProperties -Browser=Jayde Online -Frames=true -Tables=true -Crawler=true - -[ExactSeek Crawler/*] -Parent=Jayde Online -Browser=ExactSeek Crawler - -[exactseek-pagereaper-* (crawler@exactseek.com)] -Parent=Jayde Online -Browser=exactseek-pagereaper -isBanned=true - -[exactseek.com] -Parent=Jayde Online -Browser=exactseek.com - -[Jayde Crawler*] -Parent=Jayde Online -Browser=Jayde Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycos - -[Lycos] -Parent=DefaultProperties -Browser=Lycos -Frames=true -Tables=true -Crawler=true - -[Lycos*] -Parent=Lycos -Browser=Lycos - -[Lycos-Proxy] -Parent=Lycos -Browser=Lycos-Proxy - -[Lycos-Spider_(modspider)] -Parent=Lycos -Browser=Lycos-Spider_(modspider) - -[Lycos-Spider_(T-Rex)] -Parent=Lycos -Browser=Lycos-Spider_(T-Rex) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Naver - -[Naver] -Parent=DefaultProperties -Browser=Naver -isBanned=true -Crawler=true - -[Cowbot-* (NHN Corp*naver.com)] -Parent=Naver -Browser=Naver Cowbot - -[Mozilla/4.0 (compatible; NaverBot/*; *)] -Parent=Naver - -[Mozilla/4.0 (compatible; NaverBot/*; nhnbot@naver.com)] -Parent=Naver -Browser=Naver NaverBot - -[NaverBot-* (NHN Corp*naver.com)] -Parent=Naver -Browser=Naver NHN Corp - -[Yeti/*] -Parent=Naver -Browser=Yeti - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Snap - -[Snap] -Parent=DefaultProperties -Browser=Snap -isBanned=true -Crawler=true - -[Mozilla/5.0 (SnapPreviewBot) Gecko/* Firefox/*] -Parent=Snap - -[Snapbot/*] -Parent=Snap - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sogou - -[Sogou] -Parent=DefaultProperties -Browser=Sogou -Frames=true -Tables=true -isBanned=true -Crawler=true - -[shaboyi spider] -Parent=Sogou -Browser=Sogou/Shaboyi Spider - -[Sogou develop spider/*] -Parent=Sogou -Browser=Sogou Develop Spider - -[Sogou head spider*] -Parent=Sogou -Browser=Sogou/HEAD Spider - -[sogou js robot(*)] -Parent=Sogou - -[Sogou Orion spider/*] -Parent=Sogou -Browser=Sogou Orion spider - -[Sogou Pic Agent] -Parent=Sogou -Browser=Sogou/Image Crawler - -[Sogou Pic Spider] -Parent=Sogou -Browser=Sogou Pic Spider - -[Sogou Push Spider/*] -Parent=Sogou -Browser=Sogou Push Spider - -[sogou spider] -Parent=Sogou -Browser=Sogou/Spider - -[sogou web spider*] -Parent=Sogou -Browser=sogou web spider - -[Sogou-Test-Spider/*] -Parent=Sogou -Browser=Sogou-Test-Spider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; YodaoBot - -[YodaoBot] -Parent=DefaultProperties -Browser=YodaoBot -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[Mozilla/5.0 (compatible; YodaoBot/1.*)] -Parent=YodaoBot - -[Mozilla/5.0 (compatible;YodaoBot-Image/1.*)] -Parent=YodaoBot -Browser=YodaoBot-Image - -[WAP_Browser/5.0 (compatible; YodaoBot/1.*)] -Parent=YodaoBot - -[YodaoBot/1.* (*)] -Parent=YodaoBot - -[Best Whois (http://www.bestwhois.net/)] -Parent=DNS Tools -Browser=Best Whois - -[DNSGroup/*] -Parent=DNS Tools -Browser=DNS Group Crawler - -[NG-Search/*] -Parent=Exalead -Browser=NG-SearchBot - -[TouchStone] -Parent=Feeds Syndicators -Browser=TouchStone -isSyndicationReader=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; General Crawlers - -[General Crawlers] -Parent=DefaultProperties -Browser=General Crawlers -Crawler=true - -[A .NET Web Crawler] -Parent=General Crawlers -isBanned=true - -[BabalooSpider/1.*] -Parent=General Crawlers -Browser=BabalooSpider - -[BilgiBot/*] -Parent=General Crawlers -Browser=BilgiBot -isBanned=true - -[bot/* (bot; *bot@bot.bot)] -Parent=General Crawlers -Browser=bot -isBanned=true - -[CyberPatrol*] -Parent=General Crawlers -Browser=CyberPatrol -isBanned=true - -[Cynthia 1.0] -Parent=General Crawlers -Browser=Cynthia -Version=1.0 -MajorVer=1 -MinorVer=0 - -[ddetailsbot (http://www.displaydetails.com)] -Parent=General Crawlers -Browser=ddetailsbot - -[DomainCrawler/1.0 (info@domaincrawler.com; http://www.domaincrawler.com/domains/view/*)] -Parent=General Crawlers -Browser=DomainCrawler - -[DomainsBotBot/1.*] -Parent=General Crawlers -Browser=DomainsBotBot -isBanned=true - -[DomainsDB.net MetaCrawler*] -Parent=General Crawlers -Browser=DomainsDB - -[Drupal (*)] -Parent=General Crawlers -Browser=Drupal - -[Dumbot (version *)*] -Parent=General Crawlers -Browser=Dumbfind - -[EuripBot/*] -Parent=General Crawlers -Browser=Europe Internet Portal - -[eventax/*] -Parent=General Crawlers -Browser=eventax - -[FANGCrawl/*] -Parent=General Crawlers -Browser=Safe-t.net Web Filtering Service -isBanned=true - -[favorstarbot/*] -Parent=General Crawlers -Browser=favorstarbot -isBanned=true - -[FollowSite.com (*)] -Parent=General Crawlers -Browser=FollowSite -isBanned=true - -[Gaisbot*] -Parent=General Crawlers -Browser=Gaisbot - -[Healthbot/Health_and_Longevity_Project_(HealthHaven.com) ] -Parent=General Crawlers -Browser=Healthbot -isBanned=true - -[hitcrawler_0.*] -Parent=General Crawlers -Browser=hitcrawler -isBanned=true - -[htdig/*] -Parent=General Crawlers -Browser=ht://Dig - -[http://hilfe.acont.de/bot.html ACONTBOT] -Parent=General Crawlers -Browser=ACONTBOT -isBanned=true - -[JetBrains*] -Parent=General Crawlers -Browser=Omea Pro - -[KakleBot - www.kakle.com/0.1] -Parent=General Crawlers -Browser=KakleBot - -[KBeeBot/0.*] -Parent=General Crawlers -Browser=KBeeBot -isBanned=true - -[Keyword Density/*] -Parent=General Crawlers -Browser=Keyword Density - -[LetsCrawl.com/1.0*] -Parent=General Crawlers -Browser=LetsCrawl.com -isBanned=true - -[Lincoln State Web Browser] -Parent=General Crawlers -Browser=Lincoln State Web Browser -isBanned=true - -[Links4US-Crawler,*] -Parent=General Crawlers -Browser=Links4US-Crawler -isBanned=true - -[Lorkyll *.* -- lorkyll@444.net] -Parent=General Crawlers -Browser=Lorkyll -isBanned=true - -[Lsearch/sondeur] -Parent=General Crawlers -Browser=Lsearch/sondeur -isBanned=true - -[LucidMedia ClickSense/4.?] -Parent=General Crawlers -Browser=LucidMedia-ClickSense -isBanned=true - -[MapoftheInternet.com?(?http://MapoftheInternet.com)] -Parent=General Crawlers -Browser=MapoftheInternet -isBanned=true - -[Marvin v0.3] -Parent=General Crawlers -Browser=MedHunt -Version=0.3 -MajorVer=0 -MinorVer=3 - -[masidani_bot_v0.6*] -Parent=General Crawlers -Browser=masidani_bot - -[Metaspinner/0.01 (Metaspinner; http://www.meta-spinner.de/; support@meta-spinner.de/)] -Parent=General Crawlers -Browser=Metaspinner/0.01 -Version=0.01 -MajorVer=0 -MinorVer=01 - -[metatagsdir/*] -Parent=General Crawlers -Browser=metatagsdir -isBanned=true - -[Microsoft Windows Network Diagnostics] -Parent=General Crawlers -Browser=Microsoft Windows Network Diagnostics -isBanned=true - -[Miva (AlgoFeedback@miva.com)] -Parent=General Crawlers -Browser=Miva - -[moget/*] -Parent=General Crawlers -Browser=Goo - -[Mozdex/0.7.2*] -Parent=General Crawlers -Browser=Mozdex - -[Mozilla Compatible (MS IE 3.01 WinNT)] -Parent=General Crawlers -isBanned=true - -[Mozilla/* (compatible; WebCapture*)] -Parent=General Crawlers -Browser=WebCapture - -[Mozilla/4.0 (compatible; DepSpid/*)] -Parent=General Crawlers -Browser=DepSpid - -[Mozilla/4.0 (compatible; MSIE *; Windows NT *; SV1)] -Parent=General Crawlers -Browser=AVG - -[Mozilla/4.0 (compatible; MSIE 4.01; Vonna.com b o t)] -Parent=General Crawlers -Browser=Vonna.com -isBanned=true - -[Mozilla/4.0 (compatible; MSIE 4.01; Windows95)] -Parent=General Crawlers -Win32=true - -[Mozilla/4.0 (compatible; MSIE 4.5; Windows 98; )] -Parent=General Crawlers -Win32=true - -[Mozilla/4.0 (compatible; MyFamilyBot/*)] -Parent=General Crawlers -Browser=MyFamilyBot - -[Mozilla/4.0 (compatible; N-Stealth)] -Parent=General Crawlers -Browser=N-Stealth - -[Mozilla/4.0 (compatible; Scumbot/*; Linux/*)] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.0 (compatible; Spider; Linux)] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.0 (compatible; Win32)] -Parent=General Crawlers -Browser=Unknown Crawler -isBanned=true - -[Mozilla/4.1] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.5] -Parent=General Crawlers -isBanned=true - -[Mozilla/5.0 (*http://gnomit.com/) Gecko/* Gnomit/1.0] -Parent=General Crawlers -Browser=Gnomit -isBanned=true - -[Mozilla/5.0 (compatible; AboutUsBot/*)] -Parent=General Crawlers -Browser=AboutUsBot -isBanned=true - -[Mozilla/5.0 (compatible; BuzzRankingBot/*)] -Parent=General Crawlers -Browser=BuzzRankingBot -isBanned=true - -[Mozilla/5.0 (compatible; Diffbot/0.1; http://www.diffbot.com)] -Parent=General Crawlers -Browser=Diffbot - -[Mozilla/5.0 (compatible; FirstSearchBot/1.0; *)] -Parent=General Crawlers -Browser=FirstSearchBot - -[mozilla/5.0 (compatible; genevabot http://www.healthdash.com)] -Parent=General Crawlers -Browser=Healthdash - -[Mozilla/5.0 (compatible; JadynAveBot; *http://www.jadynave.com/robot*] -Parent=General Crawlers -Browser=JadynAveBot -isBanned=true - -[Mozilla/5.0 (compatible; Kyluka crawl; http://www.kyluka.com/crawl.html; crawl@kyluka.com)] -Parent=General Crawlers -Browser=Kyluka - -[Mozilla/5.0 (compatible; MJ12bot/v1.2.*; http://www.majestic12.co.uk/bot.php*)] -Parent=General Crawlers -Browser=MJ12bot -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (compatible; MSIE 7.0 ?http://www.europarchive.org)] -Parent=General Crawlers -Browser=Europe Web Archive - -[Mozilla/5.0 (compatible; Seznam screenshot-generator 2.0;*)] -Parent=General Crawlers -Browser=Seznam screenshot-generator -isBanned=true - -[Mozilla/5.0 (compatible; Twingly Recon; http://www.twingly.com/)] -Parent=General Crawlers -Browser=Twingly Recon - -[Mozilla/5.0 (compatible; unwrapbot/2.*; http://www.unwrap.jp*)] -Parent=General Crawlers -Browser=UnWrap - -[Mozilla/5.0 (compatible; Vermut*)] -Parent=General Crawlers -Browser=Vermut - -[Mozilla/5.0 (compatible; Webbot/*)] -Parent=General Crawlers -Browser=Webbot.ru -isBanned=true - -[n4p_bot*] -Parent=General Crawlers -Browser=n4p_bot - -[nabot*] -Parent=General Crawlers -Browser=Nabot - -[NetCarta_WebMapper/*] -Parent=General Crawlers -Browser=NetCarta_WebMapper -isBanned=true - -[NetID.com Bot*] -Parent=General Crawlers -Browser=NetID.com Bot -isBanned=true - -[neTVision AG andreas.heidoetting@thomson-webcast.net] -Parent=General Crawlers -Browser=neTVision - -[NextopiaBOT*] -Parent=General Crawlers -Browser=NextopiaBOT - -[nicebot] -Parent=General Crawlers -Browser=nicebot -isBanned=true - -[niXXieBot?Foster*] -Parent=General Crawlers -Browser=niXXiebot-Foster - -[Nozilla/P.N (Just for IDS woring)] -Parent=General Crawlers -Browser=Nozilla/P.N -isBanned=true - -[Nudelsalat/*] -Parent=General Crawlers -Browser=Nudelsalat -isBanned=true - -[NV32ts] -Parent=General Crawlers -Browser=NV32ts -isBanned=true - -[Ocelli/*] -Parent=General Crawlers -Browser=Ocelli - -[OpenTaggerBot (http://www.opentagger.com/opentaggerbot.htm)] -Parent=General Crawlers -Browser=OpenTaggerBot - -[Oracle Enterprise Search] -Parent=General Crawlers -Browser=Oracle Enterprise Search -isBanned=true - -[Oracle Ultra Search] -Parent=General Crawlers -Browser=Oracle Ultra Search - -[Pajaczek/*] -Parent=General Crawlers -Browser=Pajaczek -isBanned=true - -[panscient.com] -Parent=General Crawlers -Browser=panscient.com -isBanned=true - -[Patwebbot (http://www.herz-power.de/technik.html)] -Parent=General Crawlers -Browser=Patwebbot - -[PDFBot (crawler@pdfind.com)] -Parent=General Crawlers -Browser=PDFBot - -[Pete-Spider/1.*] -Parent=General Crawlers -Browser=Pete-Spider -isBanned=true - -[PhpDig/*] -Parent=General Crawlers -Browser=PhpDig - -[PlantyNet_WebRobot*] -Parent=General Crawlers -Browser=PlantyNet -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PluckIt - -[PluckItCrawler/1.0 (*)] -Parent=General Crawlers -isMobileDevice=true - -[PMAFind] -Parent=General Crawlers -Browser=PMAFind -isBanned=true - -[Poodle_predictor_1.0] -Parent=General Crawlers -Browser=Poodle Predictor - -[QuickFinder Crawler] -Parent=General Crawlers -Browser=QuickFinder -isBanned=true - -[Radiation Retriever*] -Parent=General Crawlers -Browser=Radiation Retriever -isBanned=true - -[RedCarpet/*] -Parent=General Crawlers -Browser=RedCarpet -isBanned=true - -[RixBot (http://babelserver.org/rix)] -Parent=General Crawlers -Browser=RixBot - -[Rome Client (http://tinyurl.com/64t5n) Ver: 0.*] -Parent=General Crawlers -Browser=TinyURL - -[SBIder/*] -Parent=General Crawlers -Browser=SiteSell - -[ScollSpider/2.*] -Parent=General Crawlers -Browser=ScollSpider -isBanned=true - -[Search Fst] -Parent=General Crawlers -Browser=Search Fst - -[searchbot admin@google.com] -Parent=General Crawlers -Browser=searchbot -isBanned=true - -[Seeker.lookseek.com] -Parent=General Crawlers -Browser=LookSeek -isBanned=true - -[semanticdiscovery/*] -Parent=General Crawlers -Browser=Semantic Discovery - -[SeznamBot/*] -Parent=General Crawlers -Browser=SeznamBot -isBanned=true - -[Shelob (shelob@gmx.net)] -Parent=General Crawlers -Browser=Shelob -isBanned=true - -[shelob v1.*] -Parent=General Crawlers -Browser=shelob -isBanned=true - -[ShopWiki/1.0*] -Parent=General Crawlers -Browser=ShopWiki -Version=1.0 -MajorVer=1 -MinorVer=0 - -[ShowXML/1.0 libwww/5.4.0] -Parent=General Crawlers -Browser=ShowXML -isBanned=true - -[sitecheck.internetseer.com*] -Parent=General Crawlers -Browser=Internetseer - -[SMBot/*] -Parent=General Crawlers -Browser=SMBot - -[sohu*] -Parent=General Crawlers -Browser=sohu-search -isBanned=true - -[SpankBot*] -Parent=General Crawlers -Browser=SpankBot -isBanned=true - -[spider (tspyyp@tom.com)] -Parent=General Crawlers -Browser=spider (tspyyp@tom.com) -isBanned=true - -[Sunrise/0.*] -Parent=General Crawlers -Browser=Sunrise -isBanned=true - -[Superpages URL Verification Engine] -Parent=General Crawlers -Browser=Superpages - -[Surf Knight] -Parent=General Crawlers -Browser=Surf Knight -isBanned=true - -[SurveyBot/*] -Parent=General Crawlers -Browser=SurveyBot -isBanned=true - -[SynapticSearch/AI Crawler 1.?] -Parent=General Crawlers -Browser=SynapticSearch -isBanned=true - -[SyncMgr] -Parent=General Crawlers -Browser=SyncMgr - -[Tagyu Agent/1.0] -Parent=General Crawlers -Browser=Tagyu - -[Talkro Web-Shot/*] -Parent=General Crawlers -Browser=Talkro Web-Shot -isBanned=true - -[Tecomi Bot (http://www.tecomi.com/bot.htm)] -Parent=General Crawlers -Browser=Tecomi - -[TheInformant*] -Parent=General Crawlers -Browser=TheInformant -isBanned=true - -[Toata dragostea*] -Parent=General Crawlers -Browser=Toata dragostea -isBanned=true - -[Tutorial Crawler*] -Parent=General Crawlers -isBanned=true - -[UbiCrawler/*] -Parent=General Crawlers -Browser=UbiCrawler - -[UCmore] -Parent=General Crawlers -Browser=UCmore - -[User*Agent:*] -Parent=General Crawlers -isBanned=true - -[USER_AGENT] -Parent=General Crawlers -Browser=USER_AGENT -isBanned=true - -[VadixBot] -Parent=General Crawlers -Browser=VadixBot - -[VengaBot/*] -Parent=General Crawlers -Browser=VengaBot -isBanned=true - -[Visicom Toolbar] -Parent=General Crawlers -Browser=Visicom Toolbar - -[W3C-WebCon/*] -Parent=General Crawlers -Browser=W3C-WebCon - -[Webclipping.com] -Parent=General Crawlers -Browser=Webclipping.com -isBanned=true - -[webcollage/*] -Parent=General Crawlers -Browser=WebCollage -isBanned=true - -[WebCrawler_1.*] -Parent=General Crawlers -Browser=WebCrawler - -[WebFilter Robot*] -Parent=General Crawlers -Browser=WebFilter Robot - -[WeBoX/*] -Parent=General Crawlers -Browser=WeBoX - -[WebTrends/*] -Parent=General Crawlers -Browser=WebTrends - -[West Wind Internet Protocols*] -Parent=General Crawlers -Browser=Versatel -isBanned=true - -[WhizBang] -Parent=General Crawlers -Browser=WhizBang - -[Willow Internet Crawler by Twotrees V*] -Parent=General Crawlers -Browser=Willow Internet Crawler - -[WIRE/* (Linux; i686; Bot,Robot,Spider,Crawler)] -Parent=General Crawlers -Browser=WIRE -isBanned=true - -[www.fi crawler, contact crawler@www.fi] -Parent=General Crawlers -Browser=www.fi crawler - -[Xerka WebBot v1.*] -Parent=General Crawlers -Browser=Xerka -isBanned=true - -[XML Sitemaps Generator*] -Parent=General Crawlers -Browser=XML Sitemaps Generator - -[XSpider*] -Parent=General Crawlers -Browser=XSpider -isBanned=true - -[YooW!/* (?http://www.yoow.eu)] -Parent=General Crawlers -Browser=YooW! -isBanned=true - -[HiddenMarket-*] -Parent=General RSS -Browser=HiddenMarket -isBanned=true - -[FOTOCHECKER] -Parent=Image Crawlers -Browser=FOTOCHECKER -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Search Engines - -[Search Engines] -Parent=DefaultProperties -Browser=Search Engines -Crawler=true - -[*FDSE robot*] -Parent=Search Engines -Browser=FDSE Robot - -[*Fluffy the spider*] -Parent=Search Engines -Browser=SearchHippo - -[Abacho*] -Parent=Search Engines -Browser=Abacho - -[ah-ha.com crawler (crawler@ah-ha.com)] -Parent=Search Engines -Browser=Ah-Ha - -[AIBOT/*] -Parent=Search Engines -Browser=21Seek.Com - -[ALeadSoftbot/*] -Parent=Search Engines -Browser=ALeadSoftbot - -[Amfibibot/*] -Parent=Search Engines -Browser=Amfibi - -[AnswerBus (http://www.answerbus.com/)] -Parent=Search Engines - -[antibot-V*] -Parent=Search Engines -Browser=antibot - -[appie*(www.walhello.com)] -Parent=Search Engines -Browser=Walhello - -[ASPSeek/*] -Parent=Search Engines -Browser=ASPSeek - -[BigCliqueBOT/*] -Parent=Search Engines -Browser=BigClique.com/BigClic.com - -[Blaiz-Bee/*] -Parent=Search Engines -Browser=RawGrunt - -[btbot/*] -Parent=Search Engines -Browser=Bit Torrent Search Engine - -[Busiversebot/v1.0 (http://www.busiverse.com/bot.php)] -Parent=Search Engines -Browser=Busiversebot -isBanned=true - -[CatchBot/*; http://www.catchbot.com] -Parent=Search Engines -Browser=CatchBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[CipinetBot (http://www.cipinet.com/bot.html)] -Parent=Search Engines -Browser=CipinetBot - -[Cogentbot/1.?*] -Parent=Search Engines -Browser=Cogentbot - -[compatible; Mozilla 4.0; MSIE 5.5; (SqwidgeBot v1.01 - http://www.sqwidge.com/bot/)] -Parent=Search Engines -Browser=SqwidgeBot - -[cosmos*] -Parent=Search Engines -Browser=Xyleme - -[Deepindex] -Parent=Search Engines -Browser=Deepindex - -[DiamondBot] -Parent=Search Engines -Browser=DiamondBot - -[Dumbot*] -Parent=Search Engines -Browser=Dumbot -Version=0.2 -MajorVer=0 -MinorVer=2 -Beta=true - -[Eule?Robot*] -Parent=Search Engines -Browser=Eule-Robot - -[Faxobot/*] -Parent=Search Engines -Browser=Faxo - -[Filangy/*] -Parent=Search Engines -Browser=Filangy - -[flatlandbot/*] -Parent=Search Engines -Browser=Flatland - -[Fooky.com/ScorpionBot/ScoutOut;*] -Parent=Search Engines -Browser=ScorpionBot -isBanned=true - -[FyberSpider*] -Parent=Search Engines -Browser=FyberSpider -isBanned=true - -[Gaisbot/*] -Parent=Search Engines -Browser=Gaisbot - -[gazz/*(gazz@nttr.co.jp)] -Parent=Search Engines -Browser=gazz - -[geniebot*] -Parent=Search Engines -Browser=GenieKnows - -[GOFORITBOT (?http://www.goforit.com/about/?)] -Parent=Search Engines -Browser=GoForIt - -[GoGuidesBot/*] -Parent=Search Engines -Browser=GoGuidesBot - -[GroschoBot/*] -Parent=Search Engines -Browser=GroschoBot - -[GurujiBot/1.*] -Parent=Search Engines -Browser=GurujiBot -isBanned=true - -[HenryTheMiragoRobot*] -Parent=Search Engines -Browser=Mirago - -[HolmesBot (http://holmes.ge)] -Parent=Search Engines -Browser=HolmesBot - -[Hotzonu/*] -Parent=Search Engines -Browser=Hotzonu - -[HyperEstraier/*] -Parent=Search Engines -Browser=HyperEstraier -isBanned=true - -[i1searchbot/*] -Parent=Search Engines -Browser=i1searchbot - -[IIITBOT/1.*] -Parent=Search Engines -Browser=Indian Language Web Search Engine - -[Iltrovatore-?etaccio/*] -Parent=Search Engines -Browser=Iltrovatore-Setaccio - -[InfociousBot (?http://corp.infocious.com/tech_crawler.php)] -Parent=Search Engines -Browser=InfociousBot -isBanned=true - -[Infoseek SideWinder/*] -Parent=Search Engines -Browser=Infoseek - -[iSEEKbot/*] -Parent=Search Engines -Browser=iSEEKbot - -[Knight/0.? (Zook Knight; http://knight.zook.in/; knight@zook.in)] -Parent=Search Engines -Browser=Knight - -[Kolinka Forum Search (www.kolinka.com)] -Parent=Search Engines -Browser=Kolinka Forum Search -isBanned=true - -[KRetrieve/] -Parent=Search Engines -Browser=KRetrieve -isBanned=true - -[LapozzBot/*] -Parent=Search Engines -Browser=LapozzBot - -[Linknzbot*] -Parent=Search Engines -Browser=Linknzbot - -[LocalcomBot/*] -Parent=Search Engines -Browser=LocalcomBot - -[Mail.Ru/1.0] -Parent=Search Engines -Browser=Mail.Ru - -[MaSagool/*] -Parent=Search Engines -Browser=Sagoo -Version=1.0 -MajorVer=1 -MinorVer=0 - -[miniRank/*] -Parent=Search Engines -Browser=miniRank - -[Mnogosearch*] -Parent=Search Engines -Browser=Mnogosearch - -[Mozilla/0.9* no dos :) (Linux)] -Parent=Search Engines -Browser=goliat -isBanned=true - -[Mozilla/4.0 (compatible; Arachmo)] -Parent=Search Engines -Browser=Arachmo - -[Mozilla/4.0 (compatible; http://search.thunderstone.com/texis/websearch/about.html)] -Parent=Search Engines -Browser=ThunderStone -isBanned=true - -[Mozilla/4.0 (compatible; MSIE *; Windows NT; Girafabot; girafabot at girafa dot com; http://www.girafa.com)] -Parent=Search Engines -Browser=Girafabot -Win32=true - -[Mozilla/4.0 (compatible; Vagabondo/*; webcrawler at wise-guys dot nl; *)] -Parent=Search Engines -Browser=Vagabondo - -[Mozilla/4.0(?compatible; MSIE 6.0; Qihoo *)] -Parent=Search Engines -Browser=Qihoo - -[Mozilla/4.7 (compatible; WhizBang; http://www.whizbang.com/crawler)] -Parent=Search Engines -Browser=Inxight Software - -[Mozilla/5.0 (*) VoilaBot*] -Parent=Search Engines -Browser=VoilaBot -isBanned=true - -[Mozilla/5.0 (compatible; ActiveTouristBot*; http://www.activetourist.com)] -Parent=Search Engines -Browser=ActiveTouristBot - -[Mozilla/5.0 (compatible; Butterfly/1.0; *)*] -Parent=Search Engines -Browser=Butterfly - -[Mozilla/5.0 (compatible; Charlotte/*; *)] -Parent=Search Engines -Browser=Charlotte -Beta=true -isBanned=true - -[Mozilla/5.0 (compatible; CXL-FatAssANT*)] -Parent=Search Engines -Browser=FatAssANT - -[Mozilla/5.0 (compatible; DBLBot/1.0; ?http://www.dontbuylists.com/)] -Parent=Search Engines -Browser=DBLBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (compatible; EARTHCOM.info/*)] -Parent=Search Engines -Browser=EARTHCOM - -[Mozilla/5.0 (compatible; Lipperhey Spider; http://www.lipperhey.com/)] -Parent=Search Engines -Browser=Lipperhey Spider - -[Mozilla/5.0 (compatible; MojeekBot/*; http://www.mojeek.com/bot.html)] -Parent=Search Engines -Browser=MojeekBot - -[Mozilla/5.0 (compatible; NLCrawler/*] -Parent=Search Engines -Browser=Northern Light Web Search - -[Mozilla/5.0 (compatible; OsO;*] -Parent=Search Engines -Browser=Octopodus -isBanned=true - -[Mozilla/5.0 (compatible; Pogodak.*)] -Parent=Search Engines -Browser=Pogodak - -[Mozilla/5.0 (compatible; Quantcastbot/1.*)] -Parent=Search Engines -Browser=Quantcastbot - -[Mozilla/5.0 (compatible; ScoutJet; *http://www.scoutjet.com/)] -Parent=Search Engines -Browser=ScoutJet - -[Mozilla/5.0 (compatible; Scrubby/*; http://www.scrubtheweb.com/abs/meta-check.html)] -Parent=Search Engines -Browser=Scrubby -isBanned=true - -[Mozilla/5.0 (compatible; YoudaoBot/1.*; http://www.youdao.com/help/webmaster/spider/*)] -Parent=Search Engines -Browser=YoudaoBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Twiceler*)] -Parent=Search Engines -Browser=Twiceler -isBanned=true - -[Mozilla/5.0 CostaCider Search*] -Parent=Search Engines -Browser=CostaCider Search - -[Mozilla/5.0 GurujiBot/1.0 (*)] -Parent=Search Engines -Browser=GurujiBot - -[NavissoBot] -Parent=Search Engines -Browser=NavissoBot - -[NextGenSearchBot*(for information visit *)] -Parent=Search Engines -Browser=ZoomInfo -isBanned=true - -[Norbert the Spider(Burf.com)] -Parent=Search Engines -Browser=Norbert the Spider - -[NuSearch Spider*] -Parent=Search Engines -Browser=nuSearch - -[ObjectsSearch/*] -Parent=Search Engines -Browser=ObjectsSearch - -[OpenISearch/1.*] -Parent=Search Engines -Browser=OpenISearch (Amazon) - -[Pagebull http://www.pagebull.com/] -Parent=Search Engines -Browser=Pagebull - -[PEERbot*] -Parent=Search Engines -Browser=PEERbot - -[Pompos/*] -Parent=Search Engines -Browser=Pompos - -[Popdexter/*] -Parent=Search Engines -Browser=Popdex - -[Qweery*] -Parent=Search Engines -Browser=QweeryBot - -[RedCell/* (*)] -Parent=Search Engines -Browser=RedCell - -[Scrubby/*] -Parent=Search Engines -Browser=Scrub The Web - -[Search-10/*] -Parent=Search Engines -Browser=Search-10 - -[search.ch*] -Parent=Search Engines -Browser=Swiss Search Engine - -[Searchmee! Spider*] -Parent=Search Engines -Browser=Searchmee! - -[Seekbot/*] -Parent=Search Engines -Browser=Seekbot - -[SiteSpider (http://www.SiteSpider.com/)] -Parent=Search Engines -Browser=SiteSpider - -[Spinne/*] -Parent=Search Engines -Browser=Spinne - -[sproose/*] -Parent=Search Engines -Browser=Sproose - -[Sqeobot/0.*] -Parent=Search Engines -Browser=Branzel -isBanned=true - -[SquigglebotBot/*] -Parent=Search Engines -Browser=SquigglebotBot -isBanned=true - -[StackRambler/*] -Parent=Search Engines -Browser=StackRambler - -[SygolBot*] -Parent=Search Engines -Browser=SygolBot - -[SynoBot] -Parent=Search Engines -Browser=SynoBot - -[Szukacz/*] -Parent=Search Engines -Browser=Szukacz - -[Tarantula/*] -Parent=Search Engines -Browser=Tarantula -isBanned=true - -[TerrawizBot/*] -Parent=Search Engines -Browser=TerrawizBot -isBanned=true - -[Tkensaku/*] -Parent=Search Engines -Browser=Tkensaku - -[TMCrawler] -Parent=Search Engines -Browser=TMCrawler -isBanned=true - -[Twingly Recon] -Parent=Search Engines -Browser=Twingly Recon -isBanned=true - -[updated/*] -Parent=Search Engines -Browser=Updated! - -[URL Spider Pro/*] -Parent=Search Engines -Browser=URL Spider Pro - -[URL Spider SQL*] -Parent=Search Engines -Browser=Innerprise Enterprise Search - -[VMBot/*] -Parent=Search Engines -Browser=VMBot - -[voyager/2.0 (http://www.kosmix.com/html/crawler.html)] -Parent=Search Engines -Browser=Voyager - -[wadaino.jp-crawler*] -Parent=Search Engines -Browser=wadaino.jp -isBanned=true - -[WebAlta Crawler/*] -Parent=Search Engines -Browser=WebAlta Crawler -isBanned=true - -[WebCorp/*] -Parent=Search Engines -Browser=WebCorp -isBanned=true - -[webcrawl.net] -Parent=Search Engines -Browser=webcrawl.net - -[WISEbot/*] -Parent=Search Engines -Browser=WISEbot -isBanned=true - -[Wotbox/*] -Parent=Search Engines -Browser=Wotbox - -[www.zatka.com] -Parent=Search Engines -Browser=Zatka - -[WWWeasel Robot v*] -Parent=Search Engines -Browser=World Wide Weasel - -[YadowsCrawler*] -Parent=Search Engines -Browser=YadowsCrawler - -[YodaoBot/*] -Parent=Search Engines -Browser=YodaoBot -isBanned=true - -[ZeBot_www.ze.bz*] -Parent=Search Engines -Browser=ZE.bz - -[zibber-v*] -Parent=Search Engines -Browser=Zibb - -[ZipppBot/*] -Parent=Search Engines -Browser=ZipppBot - -[ATA-Translation-Service] -Parent=Translators -Browser=ATA-Translation-Service - -[GJK_Browser_Check] -Parent=Version Checkers -Browser=GJK_Browser_Check - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Hatena - -[Hatena] -Parent=DefaultProperties -Browser=Hatena -isBanned=true -Crawler=true - -[Feed::Find/*] -Parent=Hatena -Browser=Feed Find -isSyndicationReader=true - -[Hatena Antenna/*] -Parent=Hatena -Browser=Hatena Antenna - -[Hatena Bookmark/*] -Parent=Hatena -Browser=Hatena Bookmark - -[Hatena RSS/*] -Parent=Hatena -Browser=Hatena RSS -isSyndicationReader=true - -[Hatena::Crawler/*] -Parent=Hatena -Browser=Hatena Crawler - -[HatenaScreenshot*] -Parent=Hatena -Browser=HatenaScreenshot - -[URI::Fetch/*] -Parent=Hatena -Browser=URI::Fetch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Internet Archive - -[Internet Archive] -Parent=DefaultProperties -Browser=Internet Archive -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*heritrix*] -Parent=Internet Archive -Browser=Heritrix -isBanned=true - -[ia_archiver*] -Parent=Internet Archive -Browser=Internet Archive - -[InternetArchive/*] -Parent=Internet Archive -Browser=InternetArchive - -[Mozilla/5.0 (compatible; archive.org_bot/1.*)] -Parent=Internet Archive - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nutch - -[Nutch] -Parent=DefaultProperties -Browser=Nutch -isBanned=true -Crawler=true - -[*Nutch*] -Parent=Nutch -isBanned=true - -[CazoodleBot/*] -Parent=Nutch -Browser=CazoodleBot - -[LOOQ/0.1*] -Parent=Nutch -Browser=LOOQ - -[Nutch/0.? (OpenX Spider)] -Parent=Nutch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Webaroo - -[Webaroo] -Parent=DefaultProperties -Browser=Webaroo - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Webaroo/*)] -Parent=Webaroo -Browser=Webaroo - -[Mozilla/5.0 (Windows; U; Windows *; *; rv:*) Gecko/* Firefox/* webaroo/*] -Parent=Webaroo -Browser=Webaroo - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Word Press - -[Word Press] -Parent=DefaultProperties -Browser=Word Press -Alpha=true -Beta=true -Win16=true -Win32=true -Win64=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -isBanned=true -isMobileDevice=true -isSyndicationReader=true -Crawler=true - -[WordPress-B-/2.*] -Parent=Word Press -Browser=WordPress-B - -[WordPress-Do-P-/2.*] -Parent=Word Press -Browser=WordPress-Do-P - -[BlueCoat ProxySG] -Parent=Blue Coat Systems -Browser=BlueCoat ProxySG - -[CerberianDrtrs/*] -Parent=Blue Coat Systems -Browser=Cerberian - -[Inne: Mozilla/4.0 (compatible; Cerberian Drtrs*)] -Parent=Blue Coat Systems -Browser=Cerberian - -[Mozilla/4.0 (compatible; Cerberian Drtrs*)] -Parent=Blue Coat Systems -Browser=Cerberian - -[Mozilla/4.0 (compatible; MSIE 6.0; Bluecoat DRTR)] -Parent=Blue Coat Systems -Browser=Bluecoat - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Copyright/Plagiarism - -[Copyright/Plagiarism] -Parent=DefaultProperties -Browser=Copyright/Plagiarism -isBanned=true -Crawler=true - -[BDFetch] -Parent=Copyright/Plagiarism -Browser=BDFetch - -[copyright sheriff (*)] -Parent=Copyright/Plagiarism -Browser=copyright sheriff - -[CopyRightCheck*] -Parent=Copyright/Plagiarism -Browser=CopyRightCheck - -[FairAd Client*] -Parent=Copyright/Plagiarism -Browser=FairAd Client - -[iCopyright Conductor*] -Parent=Copyright/Plagiarism -Browser=iCopyright Conductor - -[IPiumBot laurion(dot)com] -Parent=Copyright/Plagiarism -Browser=IPiumBot - -[IWAgent/*] -Parent=Copyright/Plagiarism -Browser=Brand Protect - -[Mozilla/5.0 (compatible; DKIMRepBot/*)] -Parent=Copyright/Plagiarism -Browser=DKIMRepBot - -[oBot] -Parent=Copyright/Plagiarism -Browser=oBot - -[SlySearch/*] -Parent=Copyright/Plagiarism -Browser=SlySearch - -[TurnitinBot/*] -Parent=Copyright/Plagiarism -Browser=TurnitinBot - -[TutorGigBot/*] -Parent=Copyright/Plagiarism -Browser=TutorGig - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DNS Tools - -[DNS Tools] -Parent=DefaultProperties -Browser=DNS Tools -Crawler=true - -[Domain Dossier utility*] -Parent=DNS Tools -Browser=Domain Dossier - -[Mozilla/5.0 (compatible; DNS-Digger/*)] -Parent=DNS Tools -Browser=DNS-Digger - -[OpenDNS Domain Crawler noc@opendns.com] -Parent=DNS Tools -Browser=OpenDNS Domain Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Download Managers - -[Download Managers] -Parent=DefaultProperties -Browser=Download Managers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[AndroidDownloadManager] -Parent=Download Managers -Browser=Android Download Manager - -[AutoMate5] -Parent=Download Managers -Browser=AutoMate5 - -[Beamer*] -Parent=Download Managers -Browser=Beamer - -[BitBeamer/*] -Parent=Download Managers -Browser=BitBeamer - -[BitTorrent/*] -Parent=Download Managers -Browser=BitTorrent - -[DA *] -Parent=Download Managers -Browser=Download Accelerator - -[Download Demon*] -Parent=Download Managers -Browser=Download Demon - -[Download Express*] -Parent=Download Managers -Browser=Download Express - -[Download Master*] -Parent=Download Managers -Browser=Download Master - -[Download Ninja*] -Parent=Download Managers -Browser=Download Ninja - -[Download Wonder*] -Parent=Download Managers -Browser=Download Wonder - -[DownloadSession*] -Parent=Download Managers -Browser=DownloadSession - -[EasyDL/*] -Parent=Download Managers -Browser=EasyDL - -[FDM 1.x] -Parent=Download Managers -Browser=Free Download Manager - -[FlashGet] -Parent=Download Managers -Browser=FlashGet - -[FreshDownload/*] -Parent=Download Managers -Browser=FreshDownload - -[GetRight/*] -Parent=Download Managers -Browser=GetRight - -[GetRightPro/*] -Parent=Download Managers -Browser=GetRightPro - -[GetSmart/*] -Parent=Download Managers -Browser=GetSmart - -[Go!Zilla*] -Parent=Download Managers -Browser=GoZilla - -[Gozilla/*] -Parent=Download Managers -Browser=Gozilla - -[Internet Ninja*] -Parent=Download Managers -Browser=Internet Ninja - -[Kontiki Client*] -Parent=Download Managers -Browser=Kontiki Client - -[lftp/3.2.1] -Parent=Download Managers -Browser=lftp - -[LightningDownload/*] -Parent=Download Managers -Browser=LightningDownload - -[LMQueueBot/*] -Parent=Download Managers -Browser=LMQueueBot - -[MetaProducts Download Express/*] -Parent=Download Managers -Browser=Download Express - -[Mozilla/4.0 (compatible; Getleft*)] -Parent=Download Managers -Browser=Getleft - -[Myzilla] -Parent=Download Managers -Browser=Myzilla - -[Net Vampire/*] -Parent=Download Managers -Browser=Net Vampire - -[Net_Vampire*] -Parent=Download Managers -Browser=Net_Vampire - -[NetAnts*] -Parent=Download Managers -Browser=NetAnts - -[NetPumper*] -Parent=Download Managers -Browser=NetPumper - -[NetSucker*] -Parent=Download Managers -Browser=NetSucker - -[NetZip Downloader*] -Parent=Download Managers -Browser=NetZip Downloader - -[NexTools WebAgent*] -Parent=Download Managers -Browser=NexTools WebAgent - -[Offline Downloader*] -Parent=Download Managers -Browser=Offline Downloader - -[P3P Client] -Parent=Download Managers -Browser=P3P Client - -[PageDown*] -Parent=Download Managers -Browser=PageDown - -[PicaLoader*] -Parent=Download Managers -Browser=PicaLoader - -[Prozilla*] -Parent=Download Managers -Browser=Prozilla - -[RealDownload/*] -Parent=Download Managers -Browser=RealDownload - -[sEasyDL/*] -Parent=Download Managers -Browser=EasyDL - -[shareaza*] -Parent=Download Managers -Browser=shareaza - -[SmartDownload/*] -Parent=Download Managers -Browser=SmartDownload - -[SpeedDownload/*] -Parent=Download Managers -Browser=Speed Download - -[Star*Downloader/*] -Parent=Download Managers -Browser=StarDownloader - -[STEROID Download] -Parent=Download Managers -Browser=STEROID Download - -[SuperBot/*] -Parent=Download Managers -Browser=SuperBot - -[Vegas95/*] -Parent=Download Managers -Browser=Vegas95 - -[WebZIP*] -Parent=Download Managers -Browser=WebZIP - -[Wget*] -Parent=Download Managers -Browser=Wget - -[WinTools] -Parent=Download Managers -Browser=WinTools - -[Xaldon WebSpider*] -Parent=Download Managers -Browser=Xaldon WebSpider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; E-Mail Harvesters - -[E-Mail Harvesters] -Parent=DefaultProperties -Browser=E-Mail Harvesters -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*E-Mail Address Extractor*] -Parent=E-Mail Harvesters -Browser=E-Mail Address Extractor - -[*Larbin*] -Parent=E-Mail Harvesters -Browser=Larbin - -[*www4mail/*] -Parent=E-Mail Harvesters -Browser=www4mail - -[8484 Boston Project*] -Parent=E-Mail Harvesters -Browser=8484 Boston Project - -[CherryPicker*/*] -Parent=E-Mail Harvesters -Browser=CherryPickerElite - -[Chilkat/*] -Parent=E-Mail Harvesters -Browser=Chilkat - -[ContactBot/*] -Parent=E-Mail Harvesters -Browser=ContactBot - -[eCatch*] -Parent=E-Mail Harvesters -Browser=eCatch - -[EmailCollector*] -Parent=E-Mail Harvesters -Browser=E-Mail Collector - -[EMAILsearcher] -Parent=E-Mail Harvesters -Browser=EMAILsearcher - -[EmailSiphon*] -Parent=E-Mail Harvesters -Browser=E-Mail Siphon - -[EmailWolf*] -Parent=E-Mail Harvesters -Browser=EMailWolf - -[Epsilon SoftWorks' MailMunky] -Parent=E-Mail Harvesters -Browser=MailMunky - -[ExtractorPro*] -Parent=E-Mail Harvesters -Browser=ExtractorPro - -[Franklin Locator*] -Parent=E-Mail Harvesters -Browser=Franklin Locator - -[Missigua Locator*] -Parent=E-Mail Harvesters -Browser=Missigua Locator - -[Mozilla/4.0 (compatible; Advanced Email Extractor*)] -Parent=E-Mail Harvesters -Browser=Advanced Email Extractor - -[Netprospector*] -Parent=E-Mail Harvesters -Browser=Netprospector - -[ProWebWalker*] -Parent=E-Mail Harvesters -Browser=ProWebWalker - -[sna-0.0.*] -Parent=E-Mail Harvesters -Browser=Mike Elliott's E-Mail Harvester - -[WebEnhancer*] -Parent=E-Mail Harvesters -Browser=WebEnhancer - -[WebMiner*] -Parent=E-Mail Harvesters -Browser=WebMiner - -[ZIBB Crawler (email address / WWW address)] -Parent=E-Mail Harvesters -Browser=ZIBB Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Feeds Blogs - -[Feeds Blogs] -Parent=DefaultProperties -Browser=Feeds Blogs -isSyndicationReader=true -Crawler=true - -[Bloglines Title Fetch/*] -Parent=Feeds Blogs -Browser=Bloglines Title Fetch - -[Bloglines/* (http://www.bloglines.com*)] -Parent=Feeds Blogs -Browser=BlogLines Web - -[BlogPulseLive (support@blogpulse.com)] -Parent=Feeds Blogs -Browser=BlogPulseLive - -[blogsearchbot-pumpkin-2] -Parent=Feeds Blogs -Browser=blogsearchbot-pumpkin -isSyndicationReader=false - -[Irish Blogs Aggregator/*1.0*] -Parent=Feeds Blogs -Browser=Irish Blogs Aggregator -Version=1.0 -MajorVer=1 -MinorVer=0 - -[kinjabot (http://www.kinja.com; *)] -Parent=Feeds Blogs -Browser=kinjabot - -[Net::Trackback/*] -Parent=Feeds Blogs -Browser=Net::Trackback - -[Reblog*] -Parent=Feeds Blogs -Browser=Reblog - -[WordPress/*] -Parent=Feeds Blogs -Browser=WordPress - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Feeds Syndicators - -[Feeds Syndicators] -Parent=DefaultProperties -Browser=Feeds Syndicators -isSyndicationReader=true - -[*LinkLint*] -Parent=Feeds Syndicators -Browser=LinkLint - -[*NetNewsWire/*] -Parent=Feeds Syndicators - -[*NetVisualize*] -Parent=Feeds Syndicators -Browser=NetVisualize - -[AideRSS 2.* (postrank.com)] -Parent=Feeds Syndicators -Browser=AideRSS - -[AideRSS/2.0 (aiderss.com)] -Parent=Feeds Syndicators -Browser=AideRSS -isBanned=true - -[Akregator/*] -Parent=Feeds Syndicators -Browser=Akregator - -[AppleSyndication/*] -Parent=Feeds Syndicators -Browser=Safari RSS -Platform=MacOSX - -[Cocoal.icio.us/* (*)*] -Parent=Feeds Syndicators -Browser=Cocoal.icio.us -isBanned=true - -[Feed43 Proxy/* (*)] -Parent=Feeds Syndicators -Browser=Feed For Free - -[FeedBurner/*] -Parent=Feeds Syndicators -Browser=FeedBurner - -[FeedDemon/* (*)] -Parent=Feeds Syndicators -Browser=FeedDemon -Platform=Win32 - -[FeedDigest/* (*)] -Parent=Feeds Syndicators -Browser=FeedDigest - -[FeedGhost/1.*] -Parent=Feeds Syndicators -Browser=FeedGhost -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedOnFeeds/0.1.* ( http://minutillo.com/steve/feedonfeeds/)] -Parent=Feeds Syndicators -Browser=FeedOnFeeds -Version=0.1 -MajorVer=0 -MinorVer=1 - -[Feedreader * (Powered by Newsbrain)] -Parent=Feeds Syndicators -Browser=Newsbrain - -[Feedshow/* (*)] -Parent=Feeds Syndicators -Browser=Feedshow - -[Feedster Crawler/?.0; Feedster, Inc.] -Parent=Feeds Syndicators -Browser=Feedster - -[GreatNews/1.0] -Parent=Feeds Syndicators -Browser=GreatNews -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Gregarius/*] -Parent=Feeds Syndicators -Browser=Gregarius - -[intraVnews/*] -Parent=Feeds Syndicators -Browser=intraVnews - -[JetBrains Omea Reader*] -Parent=Feeds Syndicators -Browser=Omea Reader -isBanned=true - -[Liferea/1.5* (Linux; *; http://liferea.sf.net/)] -Parent=Feeds Syndicators -Browser=Liferea -isBanned=true - -[livedoor FeedFetcher/0.0* (http://reader.livedoor.com/;*)] -Parent=Feeds Syndicators -Browser=FeedFetcher -Version=0.0 -MajorVer=0 -MinorVer=0 - -[MagpieRSS/* (*)] -Parent=Feeds Syndicators -Browser=MagpieRSS - -[Mobitype * (compatible; Mozilla/*; MSIE *.*; Windows *)] -Parent=Feeds Syndicators -Browser=Mobitype -Platform=Win32 - -[Mozilla/5.0 (*; Rojo *; http://www.rojo.com/corporate/help/agg; *)*] -Parent=Feeds Syndicators -Browser=Rojo - -[Mozilla/5.0 (*aggregator:TailRank; http://tailrank.com/robot)*] -Parent=Feeds Syndicators -Browser=TailRank - -[Mozilla/5.0 (compatible; MSIE 6.0; Podtech Network; crawler_admin@podtech.net)] -Parent=Feeds Syndicators -Browser=Podtech Network - -[Mozilla/5.0 (compatible; Newz Crawler *; http://www.newzcrawler.com/?)] -Parent=Feeds Syndicators -Browser=Newz Crawler - -[Mozilla/5.0 (compatible; RSSMicro.com RSS/Atom Feed Robot)] -Parent=Feeds Syndicators -Browser=RSSMicro - -[Mozilla/5.0 (compatible;*newstin.com;*)] -Parent=Feeds Syndicators -Browser=NewsTin - -[Mozilla/5.0 (RSS Reader Panel)] -Parent=Feeds Syndicators -Browser=RSS Reader Panel - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:FeedParser; *) Gecko/*] -Parent=Feeds Syndicators -Browser=FeedParser - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:NewsMonster; *) Gecko/*] -Parent=Feeds Syndicators -Browser=NewsMonster - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:Rojo; *) Gecko/*] -Parent=Feeds Syndicators -Browser=Rojo - -[Netvibes (*)] -Parent=Feeds Syndicators -Browser=Netvibes - -[NewsAlloy/* (*)] -Parent=Feeds Syndicators -Browser=NewsAlloy - -[Omnipelagos*] -Parent=Feeds Syndicators -Browser=Omnipelagos - -[Particls] -Parent=Feeds Syndicators -Browser=Particls - -[Protopage/* (*)] -Parent=Feeds Syndicators -Browser=Protopage - -[PubSub-RSS-Reader/* (*)] -Parent=Feeds Syndicators -Browser=PubSub-RSS-Reader - -[RSS Menu/*] -Parent=Feeds Syndicators -Browser=RSS Menu - -[RssBandit/*] -Parent=Feeds Syndicators -Browser=RssBandit - -[RssBar/1.2*] -Parent=Feeds Syndicators -Browser=RssBar -Version=1.2 -MajorVer=1 -MinorVer=2 - -[SharpReader/*] -Parent=Feeds Syndicators -Browser=SharpReader - -[SimplePie/*] -Parent=Feeds Syndicators -Browser=SimplePie - -[Strategic Board Bot (?http://www.strategicboard.com)] -Parent=Feeds Syndicators -Browser=Strategic Board Bot -isBanned=true - -[TargetYourNews.com bot] -Parent=Feeds Syndicators -Browser=TargetYourNews - -[Technoratibot/*] -Parent=Feeds Syndicators -Browser=Technoratibot - -[Tumblr/* RSS syndication ( http://www.tumblr.com/) (support@tumblr.com)] -Parent=Feeds Syndicators -Browser=Tumblr RSS syndication - -[Windows-RSS-Platform/1.0*] -Parent=Feeds Syndicators -Browser=Windows-RSS-Platform -Version=1.0 -MajorVer=1 -MinorVer=0 -Win32=true - -[Wizz RSS News Reader] -Parent=Feeds Syndicators -Browser=Wizz - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; General RSS - -[General RSS] -Parent=DefaultProperties -Browser=General RSS -isSyndicationReader=true - -[AideRSS/1.0 (aiderss.com); * subscribers] -Parent=General RSS -Browser=AideRSS -Version=1.0 -MajorVer=1 -MinorVer=0 - -[CC Metadata Scaper http://wiki.creativecommons.org/Metadata_Scraper] -Parent=General RSS -Browser=CC Metadata Scaper - -[Mozilla/5.0 (compatible) GM RSS Panel] -Parent=General RSS -Browser=RSS Panel - -[Mozilla/5.0 http://www.inclue.com; graeme@inclue.com] -Parent=General RSS -Browser=Inclue - -[Runnk online rss reader : http://www.runnk.com/ : RSS favorites : RSS ranking : RSS aggregator*] -Parent=General RSS -Browser=Ruunk - -[Windows-RSS-Platform/2.0 (MSIE 8.0; Windows NT 6.0)] -Parent=General RSS -Browser=Windows-RSS-Platform -Platform=WinVista - -[Mozilla/5.0 (X11; ?; Linux; *) AppleWebKit/* (KHTML, like Gecko, Safari/*) Arora/0.4] -Parent=Google Code -Browser=Arora -Version=0.4 -MajorVer=0 -MinorVer=4 -Platform=Linux -CssVersion=2 -supportsCSS=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Validation Checkers - -[HTML Validators] -Parent=DefaultProperties -Browser=HTML Validators -Frames=true -IFrames=true -Tables=true -Crawler=true - -[(HTML Validator http://www.searchengineworld.com/validator/)] -Parent=HTML Validators -Browser=Search Engine World HTML Validator - -[FeedValidator/1.3] -Parent=HTML Validators -Browser=FeedValidator -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Jigsaw/* W3C_CSS_Validator_JFouffa/*] -Parent=HTML Validators -Browser=Jigsaw CSS Validator - -[Search Engine World Robots.txt Validator*] -Parent=HTML Validators -Browser=Search Engine World Robots.txt Validator - -[W3C_Validator/*] -Parent=HTML Validators -Browser=W3C Validator - -[W3CLineMode/*] -Parent=HTML Validators -Browser=W3C Line Mode - -[Weblide/2.? beta*] -Parent=HTML Validators -Browser=Weblide -Version=2.0 -MajorVer=2 -MinorVer=0 -Beta=true - -[WebmasterWorld StickyMail Server Header Checker*] -Parent=HTML Validators -Browser=WebmasterWorld Server Header Checker - -[WWWC/*] -Parent=HTML Validators - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Image Crawlers - -[Image Crawlers] -Parent=DefaultProperties -Browser=Image Crawlers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*CFNetwork*] -Parent=Image Crawlers -Browser=CFNetwork - -[*PhotoStickies/*] -Parent=Image Crawlers -Browser=PhotoStickies - -[Camcrawler*] -Parent=Image Crawlers -Browser=Camcrawler - -[CydralSpider/*] -Parent=Image Crawlers -Browser=Cydral Web Image Search -isBanned=true - -[Der gro\xdfe BilderSauger*] -Parent=Image Crawlers -Browser=Gallery Grabber - -[Extreme Picture Finder] -Parent=Image Crawlers -Browser=Extreme Picture Finder - -[FLATARTS_FAVICO] -Parent=Image Crawlers -Browser=FlatArts Favorites Icon Tool - -[HTML2JPG Blackbox, http://www.html2jpg.com] -Parent=Image Crawlers -Browser=HTML2JPG - -[IconSurf/2.*] -Parent=Image Crawlers -Browser=IconSurf - -[kalooga/KaloogaBot*] -Parent=Image Crawlers -Browser=KaloogaBot - -[Mister PIX*] -Parent=Image Crawlers -Browser=Mister PIX - -[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/* (*) Pandora/2.*] -Parent=Image Crawlers -Browser=Pandora - -[naoFavicon4IE*] -Parent=Image Crawlers -Browser=naoFavicon4IE - -[pixfinder/*] -Parent=Image Crawlers -Browser=pixfinder - -[rssImagesBot/0.1 (*http://herbert.groot.jebbink.nl/?app=rssImages)] -Parent=Image Crawlers -Browser=rssImagesBot - -[Web Image Collector*] -Parent=Image Crawlers -Browser=Web Image Collector - -[WebImages * (?http://herbert.groot.jebbink.nl/?app=WebImages?)] -Parent=Image Crawlers -Browser=WebImages - -[WebPix*] -Parent=Image Crawlers -Browser=Custo - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Link Checkers - -[Link Checkers] -Parent=DefaultProperties -Browser=Link Checkers -Frames=true -IFrames=true -Tables=true -Crawler=true - -[!Susie (http://www.sync2it.com/susie)] -Parent=Link Checkers -Browser=!Susie - -[*AgentName/*] -Parent=Link Checkers -Browser=AgentName - -[*Linkman*] -Parent=Link Checkers -Browser=Linkman - -[*LinksManager.com*] -Parent=Link Checkers -Browser=LinksManager - -[*Powermarks/*] -Parent=Link Checkers -Browser=Powermarks - -[*W3C-checklink/*] -Parent=Link Checkers -Browser=W3C Link Checker - -[*Web Link Validator*] -Parent=Link Checkers -Browser=Web Link Validator - -[*Zeus*] -Parent=Link Checkers -Browser=Zeus -isBanned=true - -[ActiveBookmark *] -Parent=Link Checkers -Browser=ActiveBookmark - -[Bookdog/*] -Parent=Link Checkers -Browser=Bookdog - -[Bookmark Buddy*] -Parent=Link Checkers -Browser=Bookmark Buddy - -[Bookmark Renewal Check Agent*] -Parent=Link Checkers -Browser=Bookmark Renewal Check Agent - -[Bookmark search tool*] -Parent=Link Checkers -Browser=Bookmark search tool - -[Bookmark-Manager] -Parent=Link Checkers -Browser=Bookmark-Manager - -[Checkbot*] -Parent=Link Checkers -Browser=Checkbot - -[CheckLinks/*] -Parent=Link Checkers -Browser=CheckLinks - -[CyberSpyder Link Test/*] -Parent=Link Checkers -Browser=CyberSpyder Link Test - -[DLC/*] -Parent=Link Checkers -Browser=DLC - -[DocWeb Link Crawler (http://doc.php.net)] -Parent=Link Checkers -Browser=DocWeb Link Crawler - -[FavOrg] -Parent=Link Checkers -Browser=FavOrg - -[Favorites Sweeper v.3.*] -Parent=Link Checkers -Browser=Favorites Sweeper - -[FindLinks/*] -Parent=Link Checkers -Browser=FindLinks - -[Funnel Web Profiler*] -Parent=Link Checkers -Browser=Funnel Web Profiler - -[Html Link Validator (www.lithopssoft.com)] -Parent=Link Checkers -Browser=HTML Link Validator - -[IECheck] -Parent=Link Checkers -Browser=IECheck - -[JCheckLinks/*] -Parent=Link Checkers -Browser=JCheckLinks - -[JRTwine Software Check Favorites Utility] -Parent=Link Checkers -Browser=JRTwine - -[Link Valet Online*] -Parent=Link Checkers -Browser=Link Valet -isBanned=true - -[LinkAlarm/*] -Parent=Link Checkers -Browser=LinkAlarm - -[Linkbot*] -Parent=Link Checkers -Browser=Linkbot - -[LinkChecker/*] -Parent=Link Checkers -Browser=LinkChecker - -[LinkextractorPro*] -Parent=Link Checkers -Browser=LinkextractorPro -isBanned=true - -[LinkLint-checkonly/*] -Parent=Link Checkers -Browser=LinkLint - -[LinkScan/*] -Parent=Link Checkers -Browser=LinkScan - -[LinkSweeper/*] -Parent=Link Checkers -Browser=LinkSweeper - -[LinkWalker*] -Parent=Link Checkers -Browser=LinkWalker - -[MetaGer-LinkChecker] -Parent=Link Checkers -Browser=MetaGer-LinkChecker - -[Mozilla/* (compatible; linktiger/*; *http://www.linktiger.com*)] -Parent=Link Checkers -Browser=LinkTiger -isBanned=true - -[Mozilla/4.0 (Compatible); URLBase*] -Parent=Link Checkers -Browser=URLBase - -[Mozilla/4.0 (compatible; Link Utility; http://net-promoter.com)] -Parent=Link Checkers -Browser=NetPromoter Link Utility - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98) Web Link Validator*] -Parent=Link Checkers -Browser=Web Link Validator -Win32=true - -[Mozilla/4.0 (compatible; MSIE 7.0; Win32) Link Commander 3.0] -Parent=Link Checkers -Browser=Link Commander -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Win32 - -[Mozilla/4.0 (compatible; smartBot/1.*; checking links; *)] -Parent=Link Checkers -Browser=smartBot - -[Mozilla/4.0 (compatible; SuperCleaner*;*)] -Parent=Link Checkers -Browser=SuperCleaner - -[Mozilla/5.0 gURLChecker/*] -Parent=Link Checkers -Browser=gURLChecker -isBanned=true - -[Newsgroupreporter LinkCheck] -Parent=Link Checkers -Browser=Newsgroupreporter LinkCheck - -[onCHECK Linkchecker von www.scientec.de fuer www.onsinn.de] -Parent=Link Checkers -Browser=onCHECK Linkchecker - -[online link validator (http://www.dead-links.com/)] -Parent=Link Checkers -Browser=Dead-Links.com -isBanned=true - -[REL Link Checker*] -Parent=Link Checkers -Browser=REL Link Checker - -[RLinkCheker*] -Parent=Link Checkers -Browser=RLinkCheker - -[Robozilla/*] -Parent=Link Checkers -Browser=Robozilla - -[RPT-HTTPClient/*] -Parent=Link Checkers -Browser=RPT-HTTPClient -isBanned=true - -[SafariBookmarkChecker*(?http://www.coriolis.ch/)] -Parent=Link Checkers -Browser=SafariBookmarkChecker -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[Simpy/* (Simpy; http://www.simpy.com/?ref=bot; feedback at simpy dot com)] -Parent=Link Checkers -Browser=Simpy - -[SiteBar/*] -Parent=Link Checkers -Browser=SiteBar - -[Susie (http://www.sync2it.com/bms/susie.php] -Parent=Link Checkers -Browser=Susie - -[URLBase/6.*] -Parent=Link Checkers - -[VSE/*] -Parent=Link Checkers -Browser=VSE Link Tester - -[WebTrends Link Analyzer] -Parent=Link Checkers -Browser=WebTrends Link Analyzer - -[WorQmada/*] -Parent=Link Checkers -Browser=WorQmada - -[Xenu* Link Sleuth*] -Parent=Link Checkers -Browser=Xenu's Link Sleuth -isBanned=true - -[Z-Add Link Checker*] -Parent=Link Checkers -Browser=Z-Add Link Checker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Microsoft - -[Microsoft] -Parent=DefaultProperties -Browser=Microsoft -isBanned=true - -[Live (http://www.live.com/)] -Parent=Microsoft -Browser=Microsoft Live -isBanned=false -isSyndicationReader=true - -[MFC Foundation Class Library*] -Parent=Microsoft -Browser=MFC Foundation Class Library - -[MFHttpScan] -Parent=Microsoft -Browser=MFHttpScan - -[Microsoft BITS/*] -Parent=Microsoft -Browser=BITS - -[Microsoft Data Access Internet Publishing Provider Cache Manager] -Parent=Microsoft -Browser=MS IPP - -[Microsoft Data Access Internet Publishing Provider DAV*] -Parent=Microsoft -Browser=MS IPP DAV - -[Microsoft Data Access Internet Publishing Provider Protocol Discovery] -Parent=Microsoft -Browser=MS IPPPD - -[Microsoft Internet Explorer] -Parent=Microsoft -Browser=Fake IE - -[Microsoft Office Existence Discovery] -Parent=Microsoft -Browser=Microsoft Office Existence Discovery - -[Microsoft Office Protocol Discovery] -Parent=Microsoft -Browser=MS OPD - -[Microsoft Office/* (*Picture Manager*)] -Parent=Microsoft -Browser=Microsoft Office Picture Manager - -[Microsoft URL Control*] -Parent=Microsoft -Browser=Microsoft URL Control - -[Microsoft Visio MSIE] -Parent=Microsoft -Browser=Microsoft Visio - -[Microsoft-WebDAV-MiniRedir/*] -Parent=Microsoft -Browser=Microsoft-WebDAV - -[Mozilla/5.0 (Macintosh; Intel Mac OS X) Excel/12.*] -Parent=Microsoft -Browser=Microsoft Excel -Version=12.0 -MajorVer=12 -MinorVer=0 -Platform=MacOSX - -[MSN Feed Manager] -Parent=Microsoft -Browser=MSN Feed Manager -isBanned=false -isSyndicationReader=true - -[MSProxy/*] -Parent=Microsoft -Browser=MS Proxy - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Miscellaneous Browsers - -[Miscellaneous Browsers] -Parent=DefaultProperties -Browser=Miscellaneous Browsers -Frames=true -Tables=true -Cookies=true - -[*Amiga*] -Parent=Miscellaneous Browsers -Browser=Amiga -Platform=Amiga - -[*avantbrowser*] -Parent=Miscellaneous Browsers -Browser=Avant Browser - -[12345] -Parent=Miscellaneous Browsers -Browser=12345 -isBanned=true - -[Ace Explorer] -Parent=Miscellaneous Browsers -Browser=Ace Explorer - -[Enigma Browser*] -Parent=Miscellaneous Browsers -Browser=Enigma Browser - -[EVE-minibrowser/*] -Parent=Miscellaneous Browsers -Browser=EVE-minibrowser -IFrames=false -Tables=false -BackgroundSounds=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -isBanned=false -Crawler=false - -[Godzilla/* (Basic*; *; Commodore C=64; *; rv:1.*)*] -Parent=Miscellaneous Browsers -Browser=Godzilla - -[GreenBrowser] -Parent=Miscellaneous Browsers -Browser=GreenBrowser -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Kopiczek/* (WyderOS*; *)] -Parent=Miscellaneous Browsers -Browser=Kopiczek -Platform=WyderOS -IFrames=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (*) - BrowseX (*)] -Parent=Miscellaneous Browsers -Browser=BrowseX - -[Mozilla/* (Win32;*Escape?*; ?)] -Parent=Miscellaneous Browsers -Browser=Escape -Platform=Win32 - -[Mozilla/4.0 (compatible; ibisBrowser)] -Parent=Miscellaneous Browsers -Browser=ibisBrowser - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) AppleWebKit/* (*) HistoryHound/*] -Parent=Miscellaneous Browsers -Browser=HistoryHound - -[NetRecorder*] -Parent=Miscellaneous Browsers -Browser=NetRecorder - -[NetSurfer*] -Parent=Miscellaneous Browsers -Browser=NetSurfer - -[ogeb browser , Version 1.1.0] -Parent=Miscellaneous Browsers -Browser=ogeb browser -Version=1.1 -MajorVer=1 -MinorVer=1 - -[SCEJ PSP BROWSER 0102pspNavigator] -Parent=Miscellaneous Browsers -Browser=Wipeout Pure - -[SlimBrowser] -Parent=Miscellaneous Browsers -Browser=SlimBrowser - -[WWW_Browser/*] -Parent=Miscellaneous Browsers -Browser=WWW Browser -Version=1.69 -MajorVer=1 -MinorVer=69 -Platform=Win16 -CssVersion=3 -supportsCSS=true - -[*Netcraft Webserver Survey*] -Parent=Netcraft -Browser=Netcraft Webserver Survey -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Offline Browsers - -[Offline Browsers] -Parent=DefaultProperties -Browser=Offline Browsers -Frames=true -Tables=true -Cookies=true -isBanned=true -Crawler=true - -[*Check&Get*] -Parent=Offline Browsers -Browser=Check&Get - -[*HTTrack*] -Parent=Offline Browsers -Browser=HTTrack - -[*MSIECrawler*] -Parent=Offline Browsers -Browser=IE Offline Browser - -[*TweakMASTER*] -Parent=Offline Browsers -Browser=TweakMASTER - -[BackStreet Browser *] -Parent=Offline Browsers -Browser=BackStreet Browser - -[Go-Ahead-Got-It*] -Parent=Offline Browsers -Browser=Go Ahead Got-It - -[iGetter/*] -Parent=Offline Browsers -Browser=iGetter - -[Teleport*] -Parent=Offline Browsers -Browser=Teleport - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Online Scanners - -[Online Scanners] -Parent=DefaultProperties -Browser=Online Scanners -isBanned=true - -[JoeDog/* (X11; I; Siege *)] -Parent=Online Scanners -Browser=JoeDog -isBanned=false - -[Morfeus Fucking Scanner] -Parent=Online Scanners -Browser=Morfeus Fucking Scanner - -[Mozilla/4.0 (compatible; Trend Micro tmdr 1.*] -Parent=Online Scanners -Browser=Trend Micro - -[Titanium 2005 (4.02.01)] -Parent=Online Scanners -Browser=Panda Antivirus Titanium - -[virus_detector*] -Parent=Online Scanners -Browser=Secure Computing Corporation - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Proxy Servers - -[Proxy Servers] -Parent=DefaultProperties -Browser=Proxy Servers -isBanned=true - -[*squid*] -Parent=Proxy Servers -Browser=Squid - -[Anonymisiert*] -Parent=Proxy Servers -Browser=Anonymizied - -[Anonymizer/*] -Parent=Proxy Servers -Browser=Anonymizer - -[Anonymizied*] -Parent=Proxy Servers -Browser=Anonymizied - -[Anonymous*] -Parent=Proxy Servers -Browser=Anonymous - -[Anonymous/*] -Parent=Proxy Servers -Browser=Anonymous - -[CE-Preload] -Parent=Proxy Servers -Browser=CE-Preload - -[http://Anonymouse.org/*] -Parent=Proxy Servers -Browser=Anonymouse - -[IE/6.01 (CP/M; 8-bit*)] -Parent=Proxy Servers -Browser=Squid - -[Mozilla/* (TuringOS; Turing Machine; 0.0)] -Parent=Proxy Servers -Browser=Anonymizer - -[Mozilla/4.0 (compatible; MSIE ?.0; SaferSurf*)] -Parent=Proxy Servers -Browser=SaferSurf - -[Mozilla/5.0 (compatible; del.icio.us-thumbnails/*; *) KHTML/* (like Gecko)] -Parent=Proxy Servers -Browser=Yahoo! -isBanned=true -Crawler=true - -[Nutscrape] -Parent=Proxy Servers -Browser=Squid - -[Nutscrape/* (CP/M; 8-bit*)] -Parent=Proxy Servers -Browser=Squid - -[Privoxy/*] -Parent=Proxy Servers -Browser=Privoxy - -[ProxyTester*] -Parent=Proxy Servers -Browser=ProxyTester -isBanned=true -Crawler=true - -[SilentSurf*] -Parent=Proxy Servers -Browser=SilentSurf - -[SmallProxy*] -Parent=Proxy Servers -Browser=SmallProxy - -[Space*Bison/*] -Parent=Proxy Servers -Browser=Proxomitron - -[Sqworm/*] -Parent=Proxy Servers -Browser=Websense - -[SurfControl] -Parent=Proxy Servers -Browser=SurfControl - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Research Projects - -[Research Projects] -Parent=DefaultProperties -Browser=Research Projects -isBanned=true -Crawler=true - -[*research*] -Parent=Research Projects - -[AcadiaUniversityWebCensusClient] -Parent=Research Projects -Browser=AcadiaUniversityWebCensusClient - -[Amico Alpha * (*) Gecko/* AmicoAlpha/*] -Parent=Research Projects -Browser=Amico Alpha - -[annotate_google; http://ponderer.org/*] -Parent=Research Projects -Browser=Annotate Google - -[CMS crawler (?http://buytaert.net/crawler/)] -Parent=Research Projects - -[e-SocietyRobot(http://www.yama.info.waseda.ac.jp/~yamana/es/)] -Parent=Research Projects -Browser=e-SocietyRobot - -[Forschungsportal/*] -Parent=Research Projects -Browser=Forschungsportal - -[Gulper Web *] -Parent=Research Projects -Browser=Gulper Web Bot - -[HooWWWer/*] -Parent=Research Projects -Browser=HooWWWer - -[http://buytaert.net/crawler] -Parent=Research Projects - -[inetbot/* (?http://www.inetbot.com/bot.html)] -Parent=Research Projects -Browser=inetbot - -[IRLbot/*] -Parent=Research Projects -Browser=IRLbot - -[Lachesis] -Parent=Research Projects -Browser=Lachesis - -[Mozilla/5.0 (compatible; nextthing.org/*)] -Parent=Research Projects -Browser=nextthing.org -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (compatible; Theophrastus/*)] -Parent=Research Projects -Browser=Theophrastus - -[Mozilla/5.0 (compatible; Webscan v0.*; http://otc.dyndns.org/webscan/)] -Parent=Research Projects -Browser=Webscan - -[MQbot*] -Parent=Research Projects -Browser=MQbot - -[OutfoxBot/*] -Parent=Research Projects -Browser=OutfoxBot - -[polybot?*] -Parent=Research Projects -Browser=Polybot - -[Shim?Crawler*] -Parent=Research Projects -Browser=Shim Crawler - -[Steeler/*] -Parent=Research Projects -Browser=Steeler - -[Taiga web spider] -Parent=Research Projects -Browser=Taiga - -[Theme Spider*] -Parent=Research Projects -Browser=Theme Spider - -[UofTDB_experiment* (leehyun@cs.toronto.edu)] -Parent=Research Projects -Browser=UofTDB Experiment - -[USyd-NLP-Spider*] -Parent=Research Projects -Browser=USyd-NLP-Spider - -[woriobot*] -Parent=Research Projects -Browser=woriobot - -[wwwster/* (Beta, mailto:gue@cis.uni-muenchen.de)] -Parent=Research Projects -Browser=wwwster -Beta=true - -[Zao-Crawler] -Parent=Research Projects -Browser=Zao-Crawler - -[Zao/*] -Parent=Research Projects -Browser=Zao - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Rippers - -[Rippers] -Parent=DefaultProperties -Browser=Rippers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*grub*] -Parent=Rippers -Browser=grub - -[*ickHTTP*] -Parent=Rippers -Browser=IP*Works - -[*java*] -Parent=Rippers - -[*libwww-perl*] -Parent=Rippers -Browser=libwww-perl - -[*WebGrabber*] -Parent=Rippers - -[*WinHttpRequest*] -Parent=Rippers -Browser=WinHttp - -[3D-FTP/*] -Parent=Rippers -Browser=3D-FTP - -[3wGet/*] -Parent=Rippers -Browser=3wGet - -[ActiveRefresh*] -Parent=Rippers -Browser=ActiveRefresh - -[Artera (Version *)] -Parent=Rippers -Browser=Artera - -[AutoHotkey] -Parent=Rippers -Browser=AutoHotkey - -[b2w/*] -Parent=Rippers -Browser=b2w - -[BasicHTTP/*] -Parent=Rippers -Browser=BasicHTTP - -[BlockNote.Net] -Parent=Rippers -Browser=BlockNote.Net - -[CAST] -Parent=Rippers -Browser=CAST - -[CFNetwork/*] -Parent=Rippers -Browser=CFNetwork - -[CFSCHEDULE*] -Parent=Rippers -Browser=ColdFusion Task Scheduler - -[CobWeb/*] -Parent=Rippers -Browser=CobWeb - -[ColdFusion*] -Parent=Rippers -Browser=ColdFusion - -[Crawl_Application] -Parent=Rippers -Browser=Crawl_Application - -[curl/*] -Parent=Rippers -Browser=cURL - -[Custo*] -Parent=Rippers -Browser=Custo - -[DataCha0s/*] -Parent=Rippers -Browser=DataCha0s - -[DeepIndexer*] -Parent=Rippers -Browser=DeepIndexer - -[DISCo Pump *] -Parent=Rippers -Browser=DISCo Pump - -[eStyleSearch * (compatible; MSIE 6.0; Windows NT 5.0)] -Parent=Rippers -Browser=eStyleSearch -Win32=true - -[ezic.com http agent *] -Parent=Rippers -Browser=Ezic.com - -[fetch libfetch/*] -Parent=Rippers - -[FGet*] -Parent=Rippers -Browser=FGet - -[Flaming AttackBot*] -Parent=Rippers -Browser=Flaming AttackBot - -[Foobot*] -Parent=Rippers -Browser=Foobot - -[GameSpyHTTP/*] -Parent=Rippers -Browser=GameSpyHTTP - -[gnome-vfs/*] -Parent=Rippers -Browser=gnome-vfs - -[Harvest/*] -Parent=Rippers -Browser=Harvest - -[hcat/*] -Parent=Rippers -Browser=hcat - -[HLoader] -Parent=Rippers -Browser=HLoader - -[Holmes/*] -Parent=Rippers -Browser=Holmes - -[HTMLParser/*] -Parent=Rippers -Browser=HTMLParser - -[http generic] -Parent=Rippers -Browser=http generic - -[httpclient*] -Parent=Rippers - -[httperf/*] -Parent=Rippers -Browser=httperf - -[HTTPFetch/*] -Parent=Rippers -Browser=HTTPFetch - -[HTTPGrab] -Parent=Rippers -Browser=HTTPGrab - -[HttpSession] -Parent=Rippers -Browser=HttpSession - -[httpunit/*] -Parent=Rippers -Browser=HttpUnit - -[ICE_GetFile] -Parent=Rippers -Browser=ICE_GetFile - -[iexplore.exe] -Parent=Rippers - -[Inet - Eureka App] -Parent=Rippers -Browser=Inet - Eureka App - -[INetURL/*] -Parent=Rippers -Browser=INetURL - -[InetURL:/*] -Parent=Rippers -Browser=InetURL - -[Internet Exploiter/*] -Parent=Rippers - -[Internet Explore *] -Parent=Rippers -Browser=Fake IE - -[Internet Explorer *] -Parent=Rippers -Browser=Fake IE - -[IP*Works!*/*] -Parent=Rippers -Browser=IP*Works! - -[IrssiUrlLog/*] -Parent=Rippers -Browser=IrssiUrlLog - -[JPluck/*] -Parent=Rippers -Browser=JPluck - -[Kapere (http://www.kapere.com)] -Parent=Rippers -Browser=Kapere - -[LeechFTP] -Parent=Rippers -Browser=LeechFTP - -[LeechGet*] -Parent=Rippers -Browser=LeechGet - -[libcurl-agent/*] -Parent=Rippers -Browser=libcurl - -[libWeb/clsHTTP*] -Parent=Rippers -Browser=libWeb/clsHTTP - -[lwp*] -Parent=Rippers - -[MFC_Tear_Sample] -Parent=Rippers -Browser=MFC_Tear_Sample - -[Moozilla] -Parent=Rippers -Browser=Moozilla - -[MovableType/*] -Parent=Rippers -Browser=MovableType Web Log - -[Mozilla/2.0 (compatible; NEWT ActiveX; Win32)] -Parent=Rippers -Browser=NEWT ActiveX -Platform=Win32 - -[Mozilla/3.0 (compatible)] -Parent=Rippers - -[Mozilla/3.0 (compatible; Indy Library)] -Parent=Rippers -Cookies=true - -[Mozilla/3.01 (compatible;)] -Parent=Rippers - -[Mozilla/4.0 (compatible; BorderManager*)] -Parent=Rippers -Browser=Novell BorderManager - -[Mozilla/4.0 (compatible;)] -Parent=Rippers - -[Mozilla/5.0 (compatible; IPCheck Server Monitor*)] -Parent=Rippers -Browser=IPCheck Server Monitor - -[OCN-SOC/*] -Parent=Rippers -Browser=OCN-SOC - -[Offline Explorer*] -Parent=Rippers -Browser=Offline Explorer - -[Open Web Analytics Bot*] -Parent=Rippers -Browser=Open Web Analytics Bot - -[OSSProxy*] -Parent=Rippers -Browser=OSSProxy - -[Pageload*] -Parent=Rippers -Browser=PageLoad - -[PageNest/*] -Parent=Rippers -Browser=PageNest - -[pavuk/*] -Parent=Rippers -Browser=Pavuk - -[PEAR HTTP_Request*] -Parent=Rippers -Browser=PEAR-PHP - -[PHP*] -Parent=Rippers -Browser=PHP - -[PigBlock (Windows NT 5.1; U)*] -Parent=Rippers -Browser=PigBlock -Win32=true - -[Pockey*] -Parent=Rippers -Browser=Pockey-GetHTML - -[POE-Component-Client-HTTP/*] -Parent=Rippers -Browser=POE-Component-Client-HTTP - -[PycURL/*] -Parent=Rippers -Browser=PycURL - -[Python*] -Parent=Rippers -Browser=Python - -[RepoMonkey*] -Parent=Rippers -Browser=RepoMonkey - -[SBL-BOT*] -Parent=Rippers -Browser=BlackWidow - -[ScoutAbout*] -Parent=Rippers -Browser=ScoutAbout - -[sherlock/*] -Parent=Rippers -Browser=Sherlock - -[SiteParser/*] -Parent=Rippers -Browser=SiteParser - -[SiteSnagger*] -Parent=Rippers -Browser=SiteSnagger - -[SiteSucker/*] -Parent=Rippers -Browser=SiteSucker - -[SiteWinder*] -Parent=Rippers -Browser=SiteWinder - -[Snoopy*] -Parent=Rippers -Browser=Snoopy - -[SOFTWING_TEAR_AGENT*] -Parent=Rippers -Browser=AspTear - -[SuperHTTP/*] -Parent=Rippers -Browser=SuperHTTP - -[Tcl http client package*] -Parent=Rippers -Browser=Tcl http client package - -[Twisted PageGetter] -Parent=Rippers -Browser=Twisted PageGetter - -[URL2File/*] -Parent=Rippers -Browser=URL2File - -[UtilMind HTTPGet] -Parent=Rippers -Browser=UtilMind HTTPGet - -[VCI WebViewer*] -Parent=Rippers -Browser=VCI WebViewer - -[W3CRobot/*] -Parent=Rippers -Browser=W3CRobot - -[Web Downloader*] -Parent=Rippers -Browser=Web Downloader - -[Web Downloader/*] -Parent=Rippers -Browser=Web Downloader - -[Web Magnet*] -Parent=Rippers -Browser=Web Magnet - -[WebAuto/*] -Parent=Rippers - -[webbandit/*] -Parent=Rippers -Browser=webbandit - -[WebCopier*] -Parent=Rippers -Browser=WebCopier - -[WebDownloader*] -Parent=Rippers -Browser=WebDownloader - -[WebFetch] -Parent=Rippers -Browser=WebFetch - -[webfetch/*] -Parent=Rippers -Browser=WebFetch - -[WebGatherer*] -Parent=Rippers -Browser=WebGatherer - -[WebGet] -Parent=Rippers -Browser=WebGet - -[WebReaper*] -Parent=Rippers -Browser=WebReaper - -[WebRipper] -Parent=Rippers -Browser=WebRipper - -[WebSauger*] -Parent=Rippers -Browser=WebSauger - -[Website Downloader*] -Parent=Rippers -Browser=Website Downloader - -[Website eXtractor*] -Parent=Rippers -Browser=Website eXtractor - -[Website Quester] -Parent=Rippers -Browser=Website Quester - -[WebsiteExtractor*] -Parent=Rippers -Browser=Website eXtractor - -[WebSnatcher*] -Parent=Rippers -Browser=WebSnatcher - -[Webster Pro*] -Parent=Rippers -Browser=Webster Pro - -[WebStripper*] -Parent=Rippers -Browser=WebStripper - -[WebWhacker*] -Parent=Rippers -Browser=WebWhacker - -[WinScripter iNet Tools] -Parent=Rippers -Browser=WinScripter iNet Tools - -[WWW-Mechanize/*] -Parent=Rippers -Browser=WWW-Mechanize - -[Zend_Http_Client] -Parent=Rippers -Browser=Zend_Http_Client - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Site Monitors - -[Site Monitors] -Parent=DefaultProperties -Browser=Site Monitors -Cookies=true -isBanned=true -Crawler=true - -[*EasyRider*] -Parent=Site Monitors -Browser=EasyRider - -[*maxamine.com--robot*] -Parent=Site Monitors -Browser=maxamine.com--robot -isBanned=true - -[*WebMon ?.*] -Parent=Site Monitors -Browser=WebMon - -[Kenjin Spider*] -Parent=Site Monitors -Browser=Kenjin Spider - -[Kevin http://*] -Parent=Site Monitors -Browser=Kevin -isBanned=true - -[Mozilla/4.0 (compatible; ChangeDetection/*] -Parent=Site Monitors -Browser=ChangeDetection - -[Myst Monitor Service v*] -Parent=Site Monitors -Browser=Myst Monitor Service - -[Net Probe] -Parent=Site Monitors -Browser=Net Probe - -[NetMechanic*] -Parent=Site Monitors -Browser=NetMechanic - -[NetReality*] -Parent=Site Monitors -Browser=NetReality - -[Pingdom GIGRIB*] -Parent=Site Monitors -Browser=Pingdom - -[Site Valet Online*] -Parent=Site Monitors -Browser=Site Valet -isBanned=true - -[SITECHECKER] -Parent=Site Monitors -Browser=SITECHECKER - -[sitemonitor@dnsvr.com/*] -Parent=Site Monitors -Browser=ZoneEdit Failover Monitor -isBanned=false - -[UpTime Checker*] -Parent=Site Monitors -Browser=UpTime Checker - -[URL Control*] -Parent=Site Monitors -Browser=URL Control - -[URL_Access/*] -Parent=Site Monitors - -[URLCHECK] -Parent=Site Monitors -Browser=URLCHECK - -[URLy Warning*] -Parent=Site Monitors -Browser=URLy Warning - -[Webcheck *] -Parent=Site Monitors -Browser=Webcheck -Version=1.0 -MajorVer=1 -MinorVer=0 - -[WebPatrol/*] -Parent=Site Monitors -Browser=WebPatrol - -[websitepulse checker/*] -Parent=Site Monitors -Browser=websitepulse checker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Social Bookmarkers - -[Social Bookmarkers] -Parent=DefaultProperties -Browser=Social Bookmarkers -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[BookmarkBase(2/;http://bookmarkbase.com)] -Parent=Social Bookmarkers -Browser=BookmarkBase - -[Cocoal.icio.us/1.0 (v43) (Mac OS X; http://www.scifihifi.com/cocoalicious)] -Parent=Social Bookmarkers -Browser=Cocoalicious - -[Mozilla/5.0 (compatible; FriendFeedBot/0.*; Http://friendfeed.com/about/bot)] -Parent=Social Bookmarkers -Browser=FriendFeedBot - -[Twitturly*] -Parent=Social Bookmarkers -Browser=Twitturly - -[WinkBot/*] -Parent=Social Bookmarkers -Browser=WinkBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Translators - -[Translators] -Parent=DefaultProperties -Browser=Translators -Frames=true -Tables=true -Cookies=true - -[Seram Server] -Parent=Translators -Browser=Seram Server - -[TeragramWebcrawler/*] -Parent=Translators -Browser=TeragramWebcrawler -Version=1.0 -MajorVer=1 -MinorVer=0 - -[WebIndexer/* (Web Indexer; *)] -Parent=Translators -Browser=WorldLingo - -[WebTrans] -Parent=Translators -Browser=WebTrans - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Version Checkers - -[Version Checkers] -Parent=DefaultProperties -Browser=Version Checkers -Crawler=true - -[Automated Browscap.ini Updater. To report issues contact us at http://www.skycomp.ca] -Parent=Version Checkers -Browser=Automated Browscap.ini Updater - -[BMC Link Validator (http://www.briansmodelcars.com/links/)] -Parent=Version Checkers -Browser=BMC Link Validator -MajorVer=1 -MinorVer=0 -Platform=Win2000 - -[Browscap updater] -Parent=Version Checkers -Browser=Browscap updater - -[BrowscapUpdater1.0] -Parent=Version Checkers - -[Browser Capabilities Project (http://browsers.garykeith.com; http://browsers.garykeith.com/sitemail/contact-me.asp)] -Parent=Version Checkers -Browser=Gary Keith's Version Checker - -[Browser Capabilities Project AutoDownloader] -Parent=Version Checkers -Browser=TKC AutoDownloader - -[browsers.garykeith.com browscap.ini bot BETA] -Parent=Version Checkers - -[Code Sample Web Client] -Parent=Version Checkers -Browser=Code Sample Web Client - -[Desktop Sidebar*] -Parent=Version Checkers -Browser=Desktop Sidebar -isBanned=true - -[Mono Browser Capabilities Updater*] -Parent=Version Checkers -Browser=Mono Browser Capabilities Updater -isBanned=true - -[Rewmi/*] -Parent=Version Checkers -isBanned=true - -[Subtext Version 1.9* - http://subtextproject.com/ (Microsoft Windows NT 5.2.*)] -Parent=Version Checkers -Browser=Subtext - -[TherapeuticResearch] -Parent=Version Checkers -Browser=TherapeuticResearch - -[UpdateBrowscap*] -Parent=Version Checkers -Browser=UpdateBrowscap - -[www.garykeith.com browscap.ini bot*] -Parent=Version Checkers -Browser=clarkson.edu - -[www.substancia.com AutoHTTPAgent (ver *)] -Parent=Version Checkers -Browser=Substância - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Become - -[Become] -Parent=DefaultProperties -Browser=Become -Frames=true -Tables=true -isSyndicationReader=true -Crawler=true - -[*BecomeBot/*] -Parent=Become -Browser=BecomeBot - -[*BecomeBot@exava.com*] -Parent=Become -Browser=BecomeBot - -[*Exabot@exava.com*] -Parent=Become -Browser=Exabot - -[MonkeyCrawl/*] -Parent=Become -Browser=MonkeyCrawl - -[Mozilla/5.0 (compatible; BecomeJPBot/2.3; *)] -Parent=Become -Browser=BecomeJPBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Blue Coat Systems - -[Blue Coat Systems] -Parent=DefaultProperties -Browser=Blue Coat Systems -isBanned=true -Crawler=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Browscap Abusers - -[Browscap Abusers] -Parent=DefaultProperties -Browser=Browscap Abusers -isBanned=true - -[Apple-PubSub/*] -Parent=Browscap Abusers -Browser=Apple-PubSub - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FeedHub - -[FeedHub] -Parent=DefaultProperties -Browser=FeedHub -isSyndicationReader=true - -[FeedHub FeedDiscovery/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub FeedDiscovery -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedHub FeedFetcher/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub FeedFetcher -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedHub MetaDataFetcher/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub MetaDataFetcher -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Internet Content Rating Association] -Parent=DefaultProperties -Browser= -Frames=true -IFrames=true -Tables=true -Cookies=true -Crawler=true - -[ICRA_label_generator/1.?] -Parent=Internet Content Rating Association -Browser=ICRA_label_generator - -[ICRA_Semantic_spider/0.?] -Parent=Internet Content Rating Association -Browser=ICRA_Semantic_spider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NameProtect - -[NameProtect] -Parent=DefaultProperties -Browser=NameProtect -isBanned=true -Crawler=true - -[abot/*] -Parent=NameProtect -Browser=NameProtect - -[NP/*] -Parent=NameProtect -Browser=NameProtect - -[NPBot*] -Parent=NameProtect -Browser=NameProtect - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netcraft - -[Netcraft] -Parent=DefaultProperties -Browser=Netcraft -isBanned=true -Crawler=true - -[*Netcraft Web Server Survey*] -Parent=Netcraft -Browser=Netcraft Webserver Survey -isBanned=true - -[Mozilla/5.0 (compatible; NetcraftSurveyAgent/1.0; info@netcraft.com)] -Parent=Netcraft -Browser=NetcraftSurveyAgent - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NewsGator - -[NewsGator] -Parent=DefaultProperties -Browser=NewsGator -isSyndicationReader=true - -[MarsEdit*] -Parent=NewsGator -Browser=MarsEdit - -[NetNewsWire*/*] -Parent=NewsGator -Browser=NetNewsWire -Platform=MacOSX - -[NewsFire/*] -Parent=NewsGator -Browser=NewsFire - -[NewsGator FetchLinks extension/*] -Parent=NewsGator -Browser=NewsGator FetchLinks - -[NewsGator/*] -Parent=NewsGator -Browser=NewsGator -isBanned=true - -[NewsGatorOnline/*] -Parent=NewsGator -Browser=NewsGatorOnline - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.2 - -[Chrome 0.2] -Parent=DefaultProperties -Browser=Chrome -Version=0.2 -MinorVer=2 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.3 - -[Chrome 0.3] -Parent=DefaultProperties -Browser=Chrome -Version=0.3 -MinorVer=3 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.4 - -[Chrome 0.4] -Parent=DefaultProperties -Browser=Chrome -Version=0.4 -MinorVer=4 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.5 - -[Chrome 0.5] -Parent=DefaultProperties -Browser=Chrome -Version=0.5 -MinorVer=5 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 1.0 - -[Chrome 1.0] -Parent=DefaultProperties -Browser=Chrome -Version=1.0 -MajorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 2.0 - -[Chrome 2.0] -Parent=DefaultProperties -Browser=Chrome -Version=2.0 -MajorVer=2 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 3.0 - -[Chrome 3.0] -Parent=DefaultProperties -Browser=Chrome -Version=3.0 -MajorVer=3 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google Code - -[Google Code] -Parent=DefaultProperties -Browser=Google Code -Tables=true -Cookies=true -JavaApplets=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.2 - -[Iron 0.2] -Parent=DefaultProperties -Browser=Iron -Version=0.2 -MinorVer=2 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.3 - -[Iron 0.3] -Parent=DefaultProperties -Browser=Iron -Version=0.3 -MinorVer=3 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.4 - -[Iron 0.4] -Parent=DefaultProperties -Browser=Iron -Version=0.4 -MinorVer=4 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iPod - -[iPod] -Parent=DefaultProperties -Browser=iPod -Platform=iPhone OSX -isMobileDevice=true - -[Mozilla/5.0 (iPod; U; *Mac OS X; *) AppleWebKit/* (*) Version/3.0 Mobile/* Safari/*] -Parent=iPod -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX - -[Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2 like Mac OS X; en-us) AppleWebKit/* (KHTML, like Gecko) Mobile/*] -Parent=iPod - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iTunes - -[iTunes] -Parent=DefaultProperties -Browser=iTunes -Platform=iPhone OSX - -[iTunes/* (Windows; ?)] -Parent=iTunes -Browser=iTunes -Platform=Win32 -Win32=true - -[MOT-* iTunes/* MIB/* Profile/MIDP-* Configuration/CLDC-* UP.Link/*] -Parent=iTunes - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Media Players - -[Media Players] -Parent=DefaultProperties -Browser=Media Players -Cookies=true - -[Microsoft NetShow(TM) Player with RealVideo(R)] -Parent=Media Players -Browser=Microsoft NetShow - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; *) AppleWebKit/* RealPlayer] -Parent=Media Players -Browser=RealPlayer -Platform=MacOSX - -[MPlayer 0.9*] -Parent=Media Players -Browser=MPlayer -Version=0.9 -MajorVer=0 -MinorVer=9 - -[MPlayer 1.*] -Parent=Media Players -Browser=MPlayer -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MPlayer HEAD CVS] -Parent=Media Players -Browser=MPlayer - -[RealPlayer*] -Parent=Media Players -Browser=RealPlayer - -[RMA/*] -Parent=Media Players -Browser=RMA - -[VLC media player*] -Parent=Media Players -Browser=VLC - -[vobsub] -Parent=Media Players -Browser=vobsub -isBanned=true - -[WinampMPEG/*] -Parent=Media Players -Browser=WinAmp - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nintendo - -[Nintendo Wii] -Parent=DefaultProperties -Browser= -isMobileDevice=true - -[Opera/* (Nintendo DSi; Opera/*; *; *)] -Parent=Nintendo Wii -Browser=DSi - -[Opera/* (Nintendo Wii; U; *)] -Parent=Nintendo Wii -Browser=Wii - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Windows Media Player - -[Windows Media Player] -Parent=DefaultProperties -Browser=Windows Media Player -Cookies=true - -[NSPlayer/10.*] -Parent=Windows Media Player -Version=10.0 -MajorVer=10 -MinorVer=0 - -[NSPlayer/11.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=11.0 -MajorVer=11 -MinorVer=0 - -[NSPlayer/4.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=4.0 -MajorVer=4 -MinorVer=0 - -[NSPlayer/7.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=7.0 -MajorVer=7 -MinorVer=0 - -[NSPlayer/8.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=8.0 -MajorVer=8 -MinorVer=0 - -[NSPlayer/9.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=9.0 -MajorVer=9 -MinorVer=0 - -[Windows-Media-Player/10.*] -Parent=Windows Media Player -Browser=Windows-Media-Player -Version=10.0 -MajorVer=10 -MinorVer=0 -Win32=true - -[Windows-Media-Player/11.*] -Parent=Windows Media Player -Version=11.0 -MajorVer=11 -MinorVer=0 -Win32=true - -[Windows-Media-Player/7.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=7.0 -MajorVer=7 -MinorVer=0 -Win32=true - -[Windows-Media-Player/8.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=8.0 -MajorVer=8 -MinorVer=0 -Win32=true - -[Windows-Media-Player/9.*] -Parent=Windows Media Player -Version=9.0 -MajorVer=9 -MinorVer=0 -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Zune - -[Zune] -Parent=DefaultProperties -Browser=Zune -Cookies=true - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 2.0*)*] -Parent=Zune -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 2.5*)*] -Parent=Zune -Version=2.5 -MajorVer=2 -MinorVer=5 - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 3.0*)*] -Parent=Zune -Version=3.0 -MajorVer=3 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.0 - -[QuickTime 7.0] -Parent=DefaultProperties -Browser=QuickTime -Version=7.0 -MajorVer=7 -Cookies=true - -[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.0 -Platform=MacOSX - -[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.0 -Platform=MacPPC - -[QuickTime (qtver=7.0*;os=Windows 95*)] -Parent=QuickTime 7.0 -Platform=Win95 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows 98*)] -Parent=QuickTime 7.0 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows Me*)] -Parent=QuickTime 7.0 -Platform=WinME -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 4.0*)] -Parent=QuickTime 7.0 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.0*)] -Parent=QuickTime 7.0 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.1*)] -Parent=QuickTime 7.0 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.2*)] -Parent=QuickTime 7.0 -Platform=Win2003 -Win32=true - -[QuickTime/7.0.* (qtver=7.0.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.0 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.1 - -[QuickTime 7.1] -Parent=DefaultProperties -Browser=QuickTime -Version=7.1 -MajorVer=7 -MinorVer=1 -Cookies=true - -[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.1 -Platform=MacOSX - -[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.1 -Platform=MacPPC - -[QuickTime (qtver=7.1*;os=Windows 98*)] -Parent=QuickTime 7.1 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 4.0*)] -Parent=QuickTime 7.1 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.0*)] -Parent=QuickTime 7.1 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.1*)] -Parent=QuickTime 7.1 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.2*)] -Parent=QuickTime 7.1 -Platform=Win2003 -Win32=true - -[QuickTime/7.1.* (qtver=7.1.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.1 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.2 - -[QuickTime 7.2] -Parent=DefaultProperties -Browser=QuickTime -Version=7.2 -MajorVer=7 -MinorVer=2 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.2*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.2 -Platform=MacOSX - -[QuickTime (qtver=7.2*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.2 -Platform=MacPPC - -[QuickTime (qtver=7.2*;os=Windows 98*)] -Parent=QuickTime 7.2 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 4.0*)] -Parent=QuickTime 7.2 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.0*)] -Parent=QuickTime 7.2 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.1*)] -Parent=QuickTime 7.2 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.2*)] -Parent=QuickTime 7.2 -Platform=Win2003 -Win32=true - -[QuickTime/7.2.* (qtver=7.2.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.2 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.3 - -[QuickTime 7.3] -Parent=DefaultProperties -Browser=QuickTime -Version=7.3 -MajorVer=7 -MinorVer=3 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.3*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.3 -Platform=MacOSX - -[QuickTime (qtver=7.3*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.3 -Platform=MacPPC - -[QuickTime (qtver=7.3*;os=Windows 98*)] -Parent=QuickTime 7.3 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 4.0*)] -Parent=QuickTime 7.3 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.0*)] -Parent=QuickTime 7.3 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.1*)] -Parent=QuickTime 7.3 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.2*)] -Parent=QuickTime 7.3 -Platform=Win2003 -Win32=true - -[QuickTime/7.3.* (qtver=7.3.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.3 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.4 - -[QuickTime 7.4] -Parent=DefaultProperties -Browser=QuickTime -Version=7.4 -MajorVer=7 -MinorVer=4 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.4*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.4 -Platform=MacOSX - -[QuickTime (qtver=7.4*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.4 -Platform=MacPPC - -[QuickTime (qtver=7.4*;os=Windows 98*)] -Parent=QuickTime 7.4 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 4.0*)] -Parent=QuickTime 7.4 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.0*)] -Parent=QuickTime 7.4 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.1*)] -Parent=QuickTime 7.4 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.2*)] -Parent=QuickTime 7.4 -Platform=Win2003 -Win32=true - -[QuickTime/7.4.* (qtver=7.4.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.4 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google Android - -[Android] -Parent=DefaultProperties -Browser=Android -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[Mozilla/5.0 (Linux; U; Android *; *) AppleWebKit/* (KHTML, like Gecko) Safari/*] -Parent=Android -Browser=Android -Platform=Linux -isMobileDevice=true - -[Mozilla/5.0 (Linux; U; Android *; *) AppleWebKit/* (KHTML, like Gecko) Version/3.0.* Mobile Safari/*] -Parent=Android -Browser=Android -Platform=Linux -isMobileDevice=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BlackBerry - -[BlackBerry] -Parent=DefaultProperties -Browser=BlackBerry -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[*BlackBerry*] -Parent=BlackBerry - -[*BlackBerrySimulator/*] -Parent=BlackBerry - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Handspring Blazer - -[Blazer] -Parent=DefaultProperties -Browser=Handspring Blazer -Platform=Palm -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 95; PalmSource; Blazer 3.0) 16;160x160] -Parent=Blazer -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.0) 16;320x448] -Parent=Blazer -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.1) 16;320x320] -Parent=Blazer -Version=4.1 -MajorVer=4 -MinorVer=1 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.2) 16;320x320] -Parent=Blazer -Version=4.2 -MajorVer=4 -MinorVer=2 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.4) 16;320x320] -Parent=Blazer -Version=4.4 -MajorVer=4 -MinorVer=4 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.5) 16;320x320] -Parent=Blazer -Version=4.5 -MajorVer=4 -MinorVer=5 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DoCoMo - -[DoCoMo] -Parent=DefaultProperties -Browser=DoCoMo -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[DoCoMo/1.0*] -Parent=DoCoMo -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WAP - -[DoCoMo/2.0*] -Parent=DoCoMo -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=WAP - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IEMobile - -[IEMobile] -Parent=DefaultProperties -Browser=IEMobile -Platform=WinCE -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -VBScript=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.*)*] -Parent=IEMobile -Version=6.0 -MajorVer=6 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.*)*] -Parent=IEMobile -Version=7.0 -MajorVer=7 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iPhone - -[iPhone] -Parent=DefaultProperties -Browser=iPhone -Platform=iPhone OSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -isMobileDevice=true -CssVersion=3 -supportsCSS=true - -[Mozilla/4.0 (iPhone; *)] -Parent=iPhone - -[Mozilla/4.0 (iPhone; U; CPU like Mac OS X; *)] -Parent=iPhone - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_0_1 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_1 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko)] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0_2 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_1 like Mac OS X; *)*] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_2_1 like Mac OS X; *)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.0 Mobile/* Safari/*] -Parent=iPhone -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/5.0 (iPod; U; *Mac OS X; *) AppleWebKit/* (*) Version/* Mobile/*] -Parent=iPhone -Browser=iTouch - -[Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2* like Mac OS X; *)*] -Parent=iPhone -Browser=iTouch -Version=2.2 -MajorVer=2 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KDDI - -[KDDI] -Parent=DefaultProperties -Browser=KDDI -Frames=true -Tables=true -Cookies=true -BackgroundSounds=true -VBScript=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[KDDI-* UP.Browser/* (GUI) MMP/*] -Parent=KDDI - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Miscellaneous Mobile - -[Miscellaneous Mobile] -Parent=DefaultProperties -Browser= -IFrames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; *; CentOS; *) AppleWebKit/* (KHTML, like Gecko) Bolt/0.* Version/3.0 Safari/*] -Parent=Miscellaneous Mobile -Browser=Bolt - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Motorola Internet Browser - -[Motorola Internet Browser] -Parent=DefaultProperties -Browser=Motorola Internet Browser -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[MOT-*/*] -Parent=Motorola Internet Browser - -[MOT-1*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-8700_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-0A/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-2B/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-88/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-C???/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-GATW_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-L6/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-L7/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-M*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-MP*/* Mozilla/* (compatible; MSIE *; Windows CE; *)] -Parent=Motorola Internet Browser -Win32=true - -[MOT-MP*/* Mozilla/4.0 (compatible; MSIE *; Windows CE; *)] -Parent=Motorola Internet Browser -Win32=true - -[MOT-SAP4_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-T*/*] -Parent=Motorola Internet Browser - -[MOT-T7*/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-T721*] -Parent=Motorola Internet Browser - -[MOT-TA02/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V*/*] -Parent=Motorola Internet Browser - -[MOT-V*/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-V3/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V4*/* MIB/*] -Parent=Motorola Internet Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN Mobile Proxy - -[MSN Mobile Proxy] -Parent=DefaultProperties -Browser=MSN Mobile Proxy -Win32=true -Frames=true -Tables=true -Cookies=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true - -[Mozilla/* (compatible; MSIE *; Windows*; MSN Mobile Proxy)] -Parent=MSN Mobile Proxy - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetFront - -[NetFront] -Parent=DefaultProperties -Browser=NetFront -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[*NetFront/*] -Parent=NetFront - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nokia - -[Nokia] -Parent=DefaultProperties -Browser=Nokia -Tables=true -Cookies=true -isMobileDevice=true - -[*Nokia*/*] -Parent=Nokia - -[Mozilla/* (SymbianOS/*; ?; *) AppleWebKit/* (KHTML, like Gecko) Safari/*] -Parent=Nokia -Platform=SymbianOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Openwave Mobile Browser - -[Openwave Mobile Browser] -Parent=DefaultProperties -Browser=Openwave Mobile Browser -Alpha=true -Win32=true -Win64=true -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[*UP.Browser/*] -Parent=Openwave Mobile Browser - -[*UP.Link/*] -Parent=Openwave Mobile Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera Mini - -[Opera Mini] -Parent=DefaultProperties -Browser=Opera Mini -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[Opera/* (J2ME/MIDP; Opera Mini/1.0*)*] -Parent=Opera Mini -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/1.1*)*] -Parent=Opera Mini -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/1.2*)*] -Parent=Opera Mini -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Opera/* (J2ME/MIDP; Opera Mini/2.0*)*] -Parent=Opera Mini -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/3.0*)*] -Parent=Opera Mini -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/3.1*)*] -Parent=Opera Mini -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/4.0*)*] -Parent=Opera Mini -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/4.1*)*] -Parent=Opera Mini -Version=4.1 -MajorVer=4 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/4.2*)*] -Parent=Opera Mini -Version=4.2 -MajorVer=4 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera Mobile - -[Opera Mobile] -Parent=DefaultProperties -Browser=Opera Mobi -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Opera/9.5 (Microsoft Windows; PPC; *Opera Mobile/*)] -Parent=Opera Mobile -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Opera/9.5 (Microsoft Windows; PPC; Opera Mobi/*)] -Parent=Opera Mobile -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Opera/9.51 Beta (Microsoft Windows; PPC; Opera Mobi/*)*] -Parent=Opera Mobile -Version=9.51 -MajorVer=9 -MinorVer=51 -Beta=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Playstation - -[Playstation] -Parent=DefaultProperties -Browser=Playstation -Platform=WAP -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Mozilla/* (PLAYSTATION *; *)] -Parent=Playstation -Browser=PlayStation 3 -Frames=false - -[Mozilla/* (PSP (PlayStation Portable); *)] -Parent=Playstation - -[Sony PS2 (Linux)] -Parent=Playstation -Browser=Sony PS2 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Pocket PC - -[Pocket PC] -Parent=DefaultProperties -Browser=Pocket PC -Platform=WinCE -Win32=true -Frames=true -Tables=true -Cookies=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*(compatible; MSIE *.*; Windows CE; PPC; *)] -Parent=Pocket PC - -[HTC-*/* Mozilla/* (compatible; MSIE *.*; Windows CE*)*] -Parent=Pocket PC -Win32=true - -[Mozilla/* (compatible; MSPIE *.*; *Windows CE*)*] -Parent=Pocket PC -Win32=true - -[T-Mobile* Mozilla/* (compatible; MSIE *.*; Windows CE; *)] -Parent=Pocket PC - -[Vodafone* Mozilla/* (compatible; MSIE *.*; Windows CE; *)*] -Parent=Pocket PC - -[Windows CE (Pocket PC) - Version *.*] -Parent=Pocket PC -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SEMC Browser - -[SEMC Browser] -Parent=DefaultProperties -Browser=SEMC Browser -Platform=JAVA -Tables=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*SEMC-Browser/*] -Parent=SEMC Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SonyEricsson - -[SonyEricsson] -Parent=DefaultProperties -Browser=SonyEricsson -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*Ericsson*] -Parent=SonyEricsson - -[*SonyEricsson*] -Parent=SonyEricsson - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netbox - -[Netbox] -Parent=DefaultProperties -Browser=Netbox -Frames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/3.01 (compatible; Netbox/*; Linux*)] -Parent=Netbox -Browser=Netbox -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PowerTV - -[PowerTV] -Parent=DefaultProperties -Browser=PowerTV -Platform=PowerTV -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/4.0 PowerTV/1.5 (Compatible; Spyglass DM 3.2.1, EXPLORER)] -Parent=PowerTV -Version=1.5 -MajorVer=1 -MinorVer=5 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WebTV/MSNTV - -[WebTV] -Parent=DefaultProperties -Browser=WebTV/MSNTV -Platform=WebTV -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/3.0 WebTV/1.*(compatible; MSIE 2.0)] -Parent=WebTV -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/4.0 WebTV/2.0*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/4.0 WebTV/2.1*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/4.0 WebTV/2.2*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Mozilla/4.0 WebTV/2.3*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.3 -MajorVer=2 -MinorVer=3 - -[Mozilla/4.0 WebTV/2.4*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.4 -MajorVer=2 -MinorVer=4 - -[Mozilla/4.0 WebTV/2.5*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.5 -MajorVer=2 -MinorVer=5 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.6*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.6 -MajorVer=2 -MinorVer=6 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.7*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.7 -MajorVer=2 -MinorVer=7 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.8*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.8 -MajorVer=2 -MinorVer=8 -JavaApplets=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.9*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.9 -MajorVer=2 -MinorVer=9 -JavaApplets=true -CssVersion=1 -supportsCSS=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Amaya - -[Amaya] -Parent=DefaultProperties -Browser=Amaya -Tables=true -Cookies=true - -[amaya/7.*] -Parent=Amaya -Version=7.0 -MajorVer=7 -MinorVer=0 - -[amaya/8.0*] -Parent=Amaya -Version=8.0 -MajorVer=8 -MinorVer=0 -CssVersion=2 -supportsCSS=true - -[amaya/8.1*] -Parent=Amaya -Version=8.1 -MajorVer=8 -MinorVer=1 -CssVersion=2 -supportsCSS=true - -[amaya/8.2*] -Parent=Amaya -Version=8.2 -MajorVer=8 -MinorVer=2 -CssVersion=2 -supportsCSS=true - -[amaya/8.3*] -Parent=Amaya -Version=8.3 -MajorVer=8 -MinorVer=3 -CssVersion=2 -supportsCSS=true - -[amaya/8.4*] -Parent=Amaya -Version=8.4 -MajorVer=8 -MinorVer=4 -CssVersion=2 -supportsCSS=true - -[amaya/8.5*] -Parent=Amaya -Version=8.5 -MajorVer=8 -MinorVer=5 -CssVersion=2 -supportsCSS=true - -[amaya/8.6*] -Parent=Amaya -Version=8.6 -MajorVer=8 -MinorVer=6 -CssVersion=2 -supportsCSS=true - -[amaya/8.7*] -Parent=Amaya -Version=8.7 -MajorVer=8 -MinorVer=7 -CssVersion=2 -supportsCSS=true - -[amaya/8.8*] -Parent=Amaya -Version=8.8 -MajorVer=8 -MinorVer=8 -CssVersion=2 -supportsCSS=true - -[amaya/8.9*] -Parent=Amaya -Version=8.9 -MajorVer=8 -MinorVer=9 -CssVersion=2 -supportsCSS=true - -[amaya/9.0*] -Parent=Amaya -Version=9.0 -MajorVer=8 -MinorVer=0 -CssVersion=2 -supportsCSS=true - -[amaya/9.1*] -Parent=Amaya -Version=9.1 -MajorVer=9 -MinorVer=1 -CssVersion=2 -supportsCSS=true - -[amaya/9.2*] -Parent=Amaya -Version=9.2 -MajorVer=9 -MinorVer=2 -CssVersion=2 -supportsCSS=true - -[amaya/9.3*] -Parent=Amaya -Version=9.3 -MajorVer=9 -MinorVer=3 - -[amaya/9.4*] -Parent=Amaya -Version=9.4 -MajorVer=9 -MinorVer=4 - -[amaya/9.5*] -Parent=Amaya -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Emacs-w3m/*] -Parent=Emacs/W3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Links - -[Links] -Parent=DefaultProperties -Browser=Links -Frames=true -Tables=true - -[Links (0.9*; CYGWIN_NT-5.1*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=WinXP - -[Links (0.9*; Darwin*)] -Parent=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=MacPPC - -[Links (0.9*; FreeBSD*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=FreeBSD - -[Links (0.9*; Linux*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Linux - -[Links (0.9*; OS/2*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=OS/2 - -[Links (0.9*; Unix*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Unix - -[Links (0.9*; Win32*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Win32 -Win32=true - -[Links (1.0*; CYGWIN_NT-5.1*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP - -[Links (1.0*; FreeBSD*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=FreeBSD - -[Links (1.0*; Linux*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Linux - -[Links (1.0*; OS/2*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=OS/2 - -[Links (1.0*; Unix*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Unix - -[Links (1.0*; Win32*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win32 -Win32=true - -[Links (2.0*; Linux*)] -Parent=Links -Browser=Links -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Linux - -[Links (2.1*; FreeBSD*)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=FreeBSD - -[Links (2.1*; Linux *)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=Linux - -[Links (2.1*; OpenBSD*)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=OpenBSD - -[Links (2.2*; FreeBSD*)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=FreeBSD - -[Links (2.2*; Linux *)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=Linux - -[Links (2.2*; OpenBSD*)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=OpenBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lynx - -[Lynx] -Parent=DefaultProperties -Browser=Lynx -Frames=true -Tables=true - -[Lynx *] -Parent=Lynx -Browser=Lynx - -[Lynx/2.3*] -Parent=Lynx -Browser=Lynx -Version=2.3 -MajorVer=2 -MinorVer=3 - -[Lynx/2.4*] -Parent=Lynx -Browser=Lynx -Version=2.4 -MajorVer=2 -MinorVer=4 - -[Lynx/2.5*] -Parent=Lynx -Browser=Lynx -Version=2.5 -MajorVer=2 -MinorVer=5 - -[Lynx/2.6*] -Parent=Lynx -Browser=Lynx -Version=2.6 -MajorVer=2 -MinorVer=6 - -[Lynx/2.7*] -Parent=Lynx -Browser=Lynx -Version=2.7 -MajorVer=2 -MinorVer=7 - -[Lynx/2.8*] -Parent=Lynx -Browser=Lynx -Version=2.8 -MajorVer=2 -MinorVer=8 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NCSA Mosaic - -[Mosaic] -Parent=DefaultProperties -Browser=Mosaic - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; w3m - -[w3m] -Parent=DefaultProperties -Browser=w3m -Frames=true -Tables=true - -[w3m/0.1*] -Parent=w3m -Browser=w3m -Version=0.1 -MajorVer=0 -MinorVer=1 - -[w3m/0.2*] -Parent=w3m -Browser=w3m -Version=0.2 -MajorVer=0 -MinorVer=2 - -[w3m/0.3*] -Parent=w3m -Browser=w3m -Version=0.3 -MajorVer=0 -MinorVer=3 - -[w3m/0.4*] -Parent=w3m -Browser=w3m -Version=0.4 -MajorVer=0 -MinorVer=4 -Cookies=true - -[w3m/0.5*] -Parent=w3m -Browser=w3m -Version=0.5 -MajorVer=0 -MinorVer=5 -Cookies=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.10 - -[ELinks 0.10] -Parent=DefaultProperties -Browser=ELinks -Version=0.10 -MinorVer=10 -Frames=true -Tables=true - -[ELinks (0.10*; *AIX*)] -Parent=ELinks 0.10 -Platform=AIX - -[ELinks (0.10*; *BeOS*)] -Parent=ELinks 0.10 -Platform=BeOS - -[ELinks (0.10*; *CygWin*)] -Parent=ELinks 0.10 -Platform=CygWin - -[ELinks (0.10*; *Darwin*)] -Parent=ELinks 0.10 -Platform=Darwin - -[ELinks (0.10*; *Digital Unix*)] -Parent=ELinks 0.10 -Platform=Digital Unix - -[ELinks (0.10*; *FreeBSD*)] -Parent=ELinks 0.10 -Platform=FreeBSD - -[ELinks (0.10*; *HPUX*)] -Parent=ELinks 0.10 -Platform=HP-UX - -[ELinks (0.10*; *IRIX*)] -Parent=ELinks 0.10 -Platform=IRIX - -[ELinks (0.10*; *Linux*)] -Parent=ELinks 0.10 -Platform=Linux - -[ELinks (0.10*; *NetBSD*)] -Parent=ELinks 0.10 -Platform=NetBSD - -[ELinks (0.10*; *OpenBSD*)] -Parent=ELinks 0.10 -Platform=OpenBSD - -[ELinks (0.10*; *OS/2*)] -Parent=ELinks 0.10 -Platform=OS/2 - -[ELinks (0.10*; *RISC*)] -Parent=ELinks 0.10 -Platform=RISC OS - -[ELinks (0.10*; *Solaris*)] -Parent=ELinks 0.10 -Platform=Solaris - -[ELinks (0.10*; *Unix*)] -Parent=ELinks 0.10 -Platform=Unix - -[ELinks/0.10* (*AIX*)] -Parent=ELinks 0.10 -Platform=AIX - -[ELinks/0.10* (*BeOS*)] -Parent=ELinks 0.10 -Platform=BeOS - -[ELinks/0.10* (*CygWin*)] -Parent=ELinks 0.10 -Platform=CygWin - -[ELinks/0.10* (*Darwin*)] -Parent=ELinks 0.10 -Platform=Darwin - -[ELinks/0.10* (*Digital Unix*)] -Parent=ELinks 0.10 -Platform=Digital Unix - -[ELinks/0.10* (*FreeBSD*)] -Parent=ELinks 0.10 -Platform=FreeBSD - -[ELinks/0.10* (*HPUX*)] -Parent=ELinks 0.10 -Platform=HP-UX - -[ELinks/0.10* (*IRIX*)] -Parent=ELinks 0.10 -Platform=IRIX - -[ELinks/0.10* (*Linux*)] -Parent=ELinks 0.10 -Platform=Linux - -[ELinks/0.10* (*NetBSD*)] -Parent=ELinks 0.10 -Platform=NetBSD - -[ELinks/0.10* (*OpenBSD*)] -Parent=ELinks 0.10 -Platform=OpenBSD - -[ELinks/0.10* (*OS/2*)] -Parent=ELinks 0.10 -Platform=OS/2 - -[ELinks/0.10* (*RISC*)] -Parent=ELinks 0.10 -Platform=RISC OS - -[ELinks/0.10* (*Solaris*)] -Parent=ELinks 0.10 -Platform=Solaris - -[ELinks/0.10* (*Unix*)] -Parent=ELinks 0.10 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.11 - -[ELinks 0.11] -Parent=DefaultProperties -Browser=ELinks -Version=0.11 -MinorVer=11 -Frames=true -Tables=true - -[ELinks (0.11*; *AIX*)] -Parent=ELinks 0.11 -Platform=AIX - -[ELinks (0.11*; *BeOS*)] -Parent=ELinks 0.11 -Platform=BeOS - -[ELinks (0.11*; *CygWin*)] -Parent=ELinks 0.11 -Platform=CygWin - -[ELinks (0.11*; *Darwin*)] -Parent=ELinks 0.11 -Platform=Darwin - -[ELinks (0.11*; *Digital Unix*)] -Parent=ELinks 0.11 -Platform=Digital Unix - -[ELinks (0.11*; *FreeBSD*)] -Parent=ELinks 0.11 -Platform=FreeBSD - -[ELinks (0.11*; *HPUX*)] -Parent=ELinks 0.11 -Platform=HP-UX - -[ELinks (0.11*; *IRIX*)] -Parent=ELinks 0.11 -Platform=IRIX - -[ELinks (0.11*; *Linux*)] -Parent=ELinks 0.11 -Platform=Linux - -[ELinks (0.11*; *NetBSD*)] -Parent=ELinks 0.11 -Platform=NetBSD - -[ELinks (0.11*; *OpenBSD*)] -Parent=ELinks 0.11 -Platform=OpenBSD - -[ELinks (0.11*; *OS/2*)] -Parent=ELinks 0.11 -Platform=OS/2 - -[ELinks (0.11*; *RISC*)] -Parent=ELinks 0.11 -Platform=RISC OS - -[ELinks (0.11*; *Solaris*)] -Parent=ELinks 0.11 -Platform=Solaris - -[ELinks (0.11*; *Unix*)] -Parent=ELinks 0.11 -Platform=Unix - -[ELinks/0.11* (*AIX*)] -Parent=ELinks 0.11 -Platform=AIX - -[ELinks/0.11* (*BeOS*)] -Parent=ELinks 0.11 -Platform=BeOS - -[ELinks/0.11* (*CygWin*)] -Parent=ELinks 0.11 -Platform=CygWin - -[ELinks/0.11* (*Darwin*)] -Parent=ELinks 0.11 -Platform=Darwin - -[ELinks/0.11* (*Digital Unix*)] -Parent=ELinks 0.11 -Platform=Digital Unix - -[ELinks/0.11* (*FreeBSD*)] -Parent=ELinks 0.11 -Platform=FreeBSD - -[ELinks/0.11* (*HPUX*)] -Parent=ELinks 0.11 -Platform=HP-UX - -[ELinks/0.11* (*IRIX*)] -Parent=ELinks 0.11 -Platform=IRIX - -[ELinks/0.11* (*Linux*)] -Parent=ELinks 0.11 -Platform=Linux - -[ELinks/0.11* (*NetBSD*)] -Parent=ELinks 0.11 -Platform=NetBSD - -[ELinks/0.11* (*OpenBSD*)] -Parent=ELinks 0.11 -Platform=OpenBSD - -[ELinks/0.11* (*OS/2*)] -Parent=ELinks 0.11 -Platform=OS/2 - -[ELinks/0.11* (*RISC*)] -Parent=ELinks 0.11 -Platform=RISC OS - -[ELinks/0.11* (*Solaris*)] -Parent=ELinks 0.11 -Platform=Solaris - -[ELinks/0.11* (*Unix*)] -Parent=ELinks 0.11 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.12 - -[ELinks 0.12] -Parent=DefaultProperties -Browser=ELinks -Version=0.12 -MinorVer=12 -Frames=true -Tables=true - -[ELinks (0.12*; *AIX*)] -Parent=ELinks 0.12 -Platform=AIX - -[ELinks (0.12*; *BeOS*)] -Parent=ELinks 0.12 -Platform=BeOS - -[ELinks (0.12*; *CygWin*)] -Parent=ELinks 0.12 -Platform=CygWin - -[ELinks (0.12*; *Darwin*)] -Parent=ELinks 0.12 -Platform=Darwin - -[ELinks (0.12*; *Digital Unix*)] -Parent=ELinks 0.12 -Platform=Digital Unix - -[ELinks (0.12*; *FreeBSD*)] -Parent=ELinks 0.12 -Platform=FreeBSD - -[ELinks (0.12*; *HPUX*)] -Parent=ELinks 0.12 -Platform=HP-UX - -[ELinks (0.12*; *IRIX*)] -Parent=ELinks 0.12 -Platform=IRIX - -[ELinks (0.12*; *Linux*)] -Parent=ELinks 0.12 -Platform=Linux - -[ELinks (0.12*; *NetBSD*)] -Parent=ELinks 0.12 -Platform=NetBSD - -[ELinks (0.12*; *OpenBSD*)] -Parent=ELinks 0.12 -Platform=OpenBSD - -[ELinks (0.12*; *OS/2*)] -Parent=ELinks 0.12 -Platform=OS/2 - -[ELinks (0.12*; *RISC*)] -Parent=ELinks 0.12 -Platform=RISC OS - -[ELinks (0.12*; *Solaris*)] -Parent=ELinks 0.12 -Platform=Solaris - -[ELinks (0.12*; *Unix*)] -Parent=ELinks 0.12 -Platform=Unix - -[ELinks/0.12* (*AIX*)] -Parent=ELinks 0.12 -Platform=AIX - -[ELinks/0.12* (*BeOS*)] -Parent=ELinks 0.12 -Platform=BeOS - -[ELinks/0.12* (*CygWin*)] -Parent=ELinks 0.12 -Platform=CygWin - -[ELinks/0.12* (*Darwin*)] -Parent=ELinks 0.12 -Platform=Darwin - -[ELinks/0.12* (*Digital Unix*)] -Parent=ELinks 0.12 -Platform=Digital Unix - -[ELinks/0.12* (*FreeBSD*)] -Parent=ELinks 0.12 -Platform=FreeBSD - -[ELinks/0.12* (*HPUX*)] -Parent=ELinks 0.12 -Platform=HP-UX - -[ELinks/0.12* (*IRIX*)] -Parent=ELinks 0.12 -Platform=IRIX - -[ELinks/0.12* (*Linux*)] -Parent=ELinks 0.12 -Platform=Linux - -[ELinks/0.12* (*NetBSD*)] -Parent=ELinks 0.12 -Platform=NetBSD - -[ELinks/0.12* (*OpenBSD*)] -Parent=ELinks 0.12 -Platform=OpenBSD - -[ELinks/0.12* (*OS/2*)] -Parent=ELinks 0.12 -Platform=OS/2 - -[ELinks/0.12* (*RISC*)] -Parent=ELinks 0.12 -Platform=RISC OS - -[ELinks/0.12* (*Solaris*)] -Parent=ELinks 0.12 -Platform=Solaris - -[ELinks/0.12* (*Unix*)] -Parent=ELinks 0.12 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.9 - -[ELinks 0.9] -Parent=DefaultProperties -Browser=ELinks -Version=0.9 -MinorVer=9 -Frames=true -Tables=true - -[ELinks (0.9*; *AIX*)] -Parent=ELinks 0.9 -Platform=AIX - -[ELinks (0.9*; *BeOS*)] -Parent=ELinks 0.9 -Platform=BeOS - -[ELinks (0.9*; *CygWin*)] -Parent=ELinks 0.9 -Platform=CygWin - -[ELinks (0.9*; *Darwin*)] -Parent=ELinks 0.9 -Platform=Darwin - -[ELinks (0.9*; *Digital Unix*)] -Parent=ELinks 0.9 -Platform=Digital Unix - -[ELinks (0.9*; *FreeBSD*)] -Parent=ELinks 0.9 -Platform=FreeBSD - -[ELinks (0.9*; *HPUX*)] -Parent=ELinks 0.9 -Platform=HP-UX - -[ELinks (0.9*; *IRIX*)] -Parent=ELinks 0.9 -Platform=IRIX - -[ELinks (0.9*; *Linux*)] -Parent=ELinks 0.9 -Platform=Linux - -[ELinks (0.9*; *NetBSD*)] -Parent=ELinks 0.9 -Platform=NetBSD - -[ELinks (0.9*; *OpenBSD*)] -Parent=ELinks 0.9 -Platform=OpenBSD - -[ELinks (0.9*; *OS/2*)] -Parent=ELinks 0.9 -Platform=OS/2 - -[ELinks (0.9*; *RISC*)] -Parent=ELinks 0.9 -Platform=RISC OS - -[ELinks (0.9*; *Solaris*)] -Parent=ELinks 0.9 -Platform=Solaris - -[ELinks (0.9*; *Unix*)] -Parent=ELinks 0.9 -Platform=Unix - -[ELinks/0.9* (*AIX*)] -Parent=ELinks 0.9 -Platform=AIX - -[ELinks/0.9* (*BeOS*)] -Parent=ELinks 0.9 -Platform=BeOS - -[ELinks/0.9* (*CygWin*)] -Parent=ELinks 0.9 -Platform=CygWin - -[ELinks/0.9* (*Darwin*)] -Parent=ELinks 0.9 -Platform=Darwin - -[ELinks/0.9* (*Digital Unix*)] -Parent=ELinks 0.9 -Platform=Digital Unix - -[ELinks/0.9* (*FreeBSD*)] -Parent=ELinks 0.9 -Platform=FreeBSD - -[ELinks/0.9* (*HPUX*)] -Parent=ELinks 0.9 -Platform=HP-UX - -[ELinks/0.9* (*IRIX*)] -Parent=ELinks 0.9 -Platform=IRIX - -[ELinks/0.9* (*Linux*)] -Parent=ELinks 0.9 -Platform=Linux - -[ELinks/0.9* (*NetBSD*)] -Parent=ELinks 0.9 -Platform=NetBSD - -[ELinks/0.9* (*OpenBSD*)] -Parent=ELinks 0.9 -Platform=OpenBSD - -[ELinks/0.9* (*OS/2*)] -Parent=ELinks 0.9 -Platform=OS/2 - -[ELinks/0.9* (*RISC*)] -Parent=ELinks 0.9 -Platform=RISC OS - -[ELinks/0.9* (*Solaris*)] -Parent=ELinks 0.9 -Platform=Solaris - -[ELinks/0.9* (*Unix*)] -Parent=ELinks 0.9 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AppleWebKit - -[AppleWebKit] -Parent=DefaultProperties -Browser=AppleWebKit -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (KHTML, like Gecko)] -Parent=AppleWebKit - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Camino - -[Camino] -Parent=DefaultProperties -Browser=Camino -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.7*] -Parent=Camino -Version=0.7 -MajorVer=0 -MinorVer=7 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.8*] -Parent=Camino -Version=0.8 -MajorVer=0 -MinorVer=8 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.9*] -Parent=Camino -Version=0.9 -MajorVer=0 -MinorVer=9 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.0*] -Parent=Camino -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.2*] -Parent=Camino -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.3*] -Parent=Camino -Version=1.3 -MajorVer=1 -MinorVer=3 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.4*] -Parent=Camino -Version=1.4 -MajorVer=1 -MinorVer=4 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.5*] -Parent=Camino -Version=1.5 -MajorVer=1 -MinorVer=5 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.6*] -Parent=Camino -Version=1.6 -MajorVer=1 -MinorVer=6 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chimera - -[Chimera] -Parent=DefaultProperties -Browser=Chimera -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Chimera/*] -Parent=Chimera -Platform=MacOSX - -[Mozilla/5.0 Gecko/* Chimera/*] -Parent=Chimera - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Dillo - -[Dillo] -Parent=DefaultProperties -Browser=Dillo -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -CssVersion=2 -supportsCSS=true - -[Dillo/0.6*] -Parent=Dillo -Version=0.6 -MajorVer=0 -MinorVer=6 - -[Dillo/0.7*] -Parent=Dillo -Version=0.7 -MajorVer=0 -MinorVer=7 - -[Dillo/0.8*] -Parent=Dillo -Version=0.8 -MajorVer=0 -MinorVer=8 - -[Dillo/2.0] -Parent=Dillo -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Emacs/W3 - -[Emacs/W3] -Parent=DefaultProperties -Browser=Emacs/W3 -Frames=true -Tables=true -Cookies=true - -[Emacs/W3/2.* (Unix*] -Parent=Emacs/W3 -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Unix - -[Emacs/W3/2.* (X11*] -Parent=Emacs/W3 -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Linux - -[Emacs/W3/3.* (Unix*] -Parent=Emacs/W3 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Unix - -[Emacs/W3/3.* (X11*] -Parent=Emacs/W3 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Linux - -[Emacs/W3/4.* (Unix*] -Parent=Emacs/W3 -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Unix - -[Emacs/W3/4.* (X11*] -Parent=Emacs/W3 -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; fantomas - -[fantomas] -Parent=DefaultProperties -Browser=fantomas -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/4.0 (cloakBrowser)] -Parent=fantomas -Browser=fantomas cloakBrowser - -[Mozilla/4.0 (fantomas shadowMaker Browser)] -Parent=fantomas -Browser=fantomas shadowMaker Browser - -[Mozilla/4.0 (fantomBrowser)] -Parent=fantomas -Browser=fantomas fantomBrowser - -[Mozilla/4.0 (fantomCrew Browser)] -Parent=fantomas -Browser=fantomas fantomCrew Browser - -[Mozilla/4.0 (stealthBrowser)] -Parent=fantomas -Browser=fantomas stealthBrowser - -[multiBlocker browser*] -Parent=fantomas -Browser=fantomas multiBlocker browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FrontPage - -[FrontPage] -Parent=DefaultProperties -Browser=FrontPage -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/?* (compatible; MS FrontPage*)] -Parent=FrontPage - -[MSFrontPage/*] -Parent=FrontPage - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Galeon - -[Galeon] -Parent=DefaultProperties -Browser=Galeon -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/1.*] -Parent=Galeon -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/2.*] -Parent=Galeon -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 Galeon/1.* (X11; Linux*)*] -Parent=Galeon -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 Galeon/2.* (X11; Linux*)*] -Parent=Galeon -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HP Secure Web Browser - -[HP Secure Web Browser] -Parent=DefaultProperties -Browser=HP Secure Web Browser -Platform=OpenVMS -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.0*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.1*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.2*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.3*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.4*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.4 -MajorVer=1 -MinorVer=4 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.5*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.5 -MajorVer=1 -MinorVer=5 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.6*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.6 -MajorVer=1 -MinorVer=6 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.7*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.7 -MajorVer=1 -MinorVer=7 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.8*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.8 -MajorVer=1 -MinorVer=8 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IBrowse - -[IBrowse] -Parent=DefaultProperties -Browser=IBrowse -Platform=Amiga -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Arexx (compatible; MSIE 6.0; AmigaOS5.0) IBrowse 4.0] -Parent=IBrowse -Version=4.0 -MajorVer=4 -MinorVer=0 - -[IBrowse/1.22 (AmigaOS *)] -Parent=IBrowse -Version=1.22 -MajorVer=1 -MinorVer=22 - -[IBrowse/2.1 (AmigaOS *)] -Parent=IBrowse -Version=2.1 -MajorVer=2 -MinorVer=1 - -[IBrowse/2.2 (AmigaOS *)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=2 - -[IBrowse/2.3 (AmigaOS *)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=3 - -[Mozilla/* (Win98; I) IBrowse/2.1 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/* (Win98; I) IBrowse/2.2 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Mozilla/* (Win98; I) IBrowse/2.3 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.3 -MajorVer=2 -MinorVer=3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iCab - -[iCab] -Parent=DefaultProperties -Browser=iCab -Frames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[iCab/2.7* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=Mac68K - -[iCab/2.7* (Macintosh; ?; PPC*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=MacPPC - -[iCab/2.8* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacOSX - -[iCab/2.8* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=Mac68K - -[iCab/2.8* (Macintosh; ?; PPC)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacPPC - -[iCab/2.9* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacOSX - -[iCab/2.9* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=Mac68K - -[iCab/2.9* (Macintosh; ?; PPC*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacPPC - -[iCab/3.0* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[iCab/3.0* (Macintosh; ?; PPC*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacPPC -CssVersion=2 -supportsCSS=true - -[iCab/4.0 (Macintosh; U; *Mac OS X)] -Parent=iCab -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (compatible; iCab 3.0*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; iCab 3.0*; Macintosh; ?; PPC*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacPPC -CssVersion=2 -supportsCSS=true - -[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; 68K*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=Mac68K - -[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacOSX - -[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacOSX - -[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 4.2*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iSiloX - -[iSiloX] -Parent=DefaultProperties -Browser=iSiloX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -Crawler=true -CssVersion=2 -supportsCSS=true - -[iSiloX/4.0* MacOS] -Parent=iSiloX -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacPPC - -[iSiloX/4.0* Windows/32] -Parent=iSiloX -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Win32 -Win32=true - -[iSiloX/4.1* MacOS] -Parent=iSiloX -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=MacPPC - -[iSiloX/4.1* Windows/32] -Parent=iSiloX -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=Win32 -Win32=true - -[iSiloX/4.2* MacOS] -Parent=iSiloX -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=MacPPC - -[iSiloX/4.2* Windows/32] -Parent=iSiloX -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=Win32 -Win32=true - -[iSiloX/4.3* MacOS] -Parent=iSiloX -Version=4.3 -MajorVer=4 -MinorVer=4 -Platform=MacOSX - -[iSiloX/4.3* Windows/32] -Parent=iSiloX -Version=4.3 -MajorVer=4 -MinorVer=3 -Platform=Win32 -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycoris Desktop/LX - -[Lycoris Desktop/LX] -Parent=DefaultProperties -Browser=Lycoris Desktop/LX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -Crawler=true - -[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*: Desktop/LX Amethyst) Gecko/*] -Parent=Lycoris Desktop/LX -Version=1.1 -MajorVer=1 -MinorVer=1 -Platform=Linux - -[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*; Desktop/LX Amethyst) Gecko/*] -Parent=Lycoris Desktop/LX -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mosaic - -[Mosaic] -Parent=DefaultProperties -Browser=Mosaic -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[Mozilla/4.0 (VMS_Mosaic)] -Parent=Mosaic -Platform=OpenVMS - -[VMS_Mosaic/3.7*] -Parent=Mosaic -Version=3.7 -MajorVer=3 -MinorVer=7 -Platform=OpenVMS - -[VMS_Mosaic/3.8*] -Parent=Mosaic -Version=3.8 -MajorVer=3 -MinorVer=8 -Platform=OpenVMS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetPositive - -[NetPositive] -Parent=DefaultProperties -Browser=NetPositive -Platform=BeOS -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[*NetPositive/2.2*] -Parent=NetPositive -Version=2.2 -MajorVer=2 -MinorVer=2 - -[*NetPositive/2.2*BeOS*] -Parent=NetPositive -Version=2.2 -MajorVer=2 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OmniWeb - -[OmniWeb] -Parent=DefaultProperties -Browser=OmniWeb -Platform=MacOSX -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v4*] -Parent=OmniWeb -Version=4.5 -MajorVer=4 -MinorVer=5 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v5*] -Parent=OmniWeb -Version=5. -MajorVer=5 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v6*] -Parent=OmniWeb -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/4*] -Parent=OmniWeb -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacPPC - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/5*] -Parent=OmniWeb -Version=5.0 -MajorVer=5 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/6*] -Parent=OmniWeb -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=MacPPC - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.34] -Parent=OmniWeb -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.34] -Parent=OmniWeb -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v607] -Parent=OmniWeb -Version=5.5 -MajorVer=5 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v607] -Parent=OmniWeb -Version=5.5 -MajorVer=5 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/522+ (KHTML, like Gecko, Safari/522) OmniWeb/v613] -Parent=OmniWeb -Version=5.6 -MajorVer=5 -MinorVer=6 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/522+ (KHTML, like Gecko, Safari/522) OmniWeb/v613] -Parent=OmniWeb -Version=5.6 -MajorVer=5 -MinorVer=6 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v496] -Parent=OmniWeb -Version=4.5 -MajorVer=4 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558.36 ] -Parent=OmniWeb -Version=5.0 -MajorVer=5 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Shiira - -[Shiira] -Parent=DefaultProperties -Browser=Shiira -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/0.9*] -Parent=Shiira -Version=0.9 -MajorVer=0 -MinorVer=9 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.0*] -Parent=Shiira -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.1*] -Parent=Shiira -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.2*] -Parent=Shiira -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/2.1*] -Parent=Shiira -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/2.2*] -Parent=Shiira -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Windows Maker] -Parent=DefaultProperties -Browser=WMaker -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -VBScript=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[WMaker*] -Parent=Windows Maker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.0 - -[K-Meleon 1.0] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.0 -MajorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.1 - -[K-Meleon 1.1] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.1 -MajorVer=1 -MinorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.5 - -[K-Meleon 1.5] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.5 -MajorVer=1 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Platform=WinVista - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 3.0 - -[Konqueror 3.0] -Parent=DefaultProperties -Browser=Konqueror -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[*Konqueror/3.0*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -IFrames=false - -[*Konqueror/3.0*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=FreeBSD -IFrames=false - -[*Konqueror/3.0*Linux*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Linux -IFrames=false - -[*Konqueror/3.1*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 - -[*Konqueror/3.1*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 -Platform=FreeBSD - -[*Konqueror/3.1*Linux*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 - -[*Konqueror/3.2*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 - -[*Konqueror/3.2*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 -Platform=FreeBSD - -[*Konqueror/3.2*Linux*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 -Platform=Linux - -[*Konqueror/3.3*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 - -[*Konqueror/3.3*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=FreeBSD - -[*Konqueror/3.3*Linux*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=Linux - -[*Konqueror/3.3*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=OpenBSD - -[*Konqueror/3.4*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 - -[*Konqueror/3.4*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=FreeBSD - -[*Konqueror/3.4*Linux*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=Linux - -[*Konqueror/3.4*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=OpenBSD - -[*Konqueror/3.5*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 - -[*Konqueror/3.5*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=FreeBSD - -[*Konqueror/3.5*Linux*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=Linux - -[*Konqueror/3.5*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=OpenBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.0 - -[Konqueror 4.0] -Parent=DefaultProperties -Browser=Konqueror -Version=4.0 -MajorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.0*; Debian) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; *Linux) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; FreeBSD) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; NetBSD) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.1 - -[Konqueror 4.1] -Parent=DefaultProperties -Browser=Konqueror -Version=4.1 -MajorVer=4 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.1*; *Linux*) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.1*; Debian) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.1*; FreeBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.1*; NetBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.2 - -[Konqueror 4.2] -Parent=DefaultProperties -Browser=Konqueror -Version=4.2 -MajorVer=4 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.2*; *Linux*) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.2*; Debian) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.2*; FreeBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.2*; NetBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari - -[Safari] -Parent=DefaultProperties -Browser=Safari -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/100*] -Parent=Safari -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/125*] -Parent=Safari -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/312*] -Parent=Safari -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/412*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/416*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/417*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/418*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/419*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/52*] -Parent=Safari -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/85*] -Parent=Safari -Version=1.0 -MajorVer=1 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.0 - -[Safari 3.0] -Parent=DefaultProperties -Browser=Safari -Version=3.0 -MajorVer=3 -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.1 - -[Safari 3.1] -Parent=DefaultProperties -Browser=Safari -Version=3.1 -MajorVer=3 -MinorVer=1 -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.2 - -[Safari 3.2] -Parent=DefaultProperties -Browser=Safari -Version=3.2 -MajorVer=3 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 4.0 - -[Safari 4.0] -Parent=DefaultProperties -Browser=Safari -Version=4.0 -MajorVer=4 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *) AppleWebKit/* (KHTML, like Gecko) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *) AppleWebKit/* (KHTML, like Gecko) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 7.0; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 7.0; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 10.0 - -[Opera 10.0] -Parent=DefaultProperties -Browser=Opera -Version=10.0 -MajorVer=10 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 10.0*] -Parent=Opera 10.0 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 10.0*] -Parent=Opera 10.0 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (Linux*)*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (Macintosh; *Mac OS X;*)*] -Parent=Opera 10.0 -Platform=MacOSX - -[Opera/10.0* (Windows 95*)*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Opera/10.0* (Windows 98*)*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Opera/10.0* (Windows CE*)*] -Parent=Opera 10.0 -Platform=WinCE -Win32=true - -[Opera/10.0* (Windows ME*)*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Opera/10.0* (Windows NT 4.0*)*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Opera/10.0* (Windows NT 5.0*)*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Opera/10.0* (Windows NT 5.1*)*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Opera/10.0* (Windows NT 5.2*)*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Opera/10.0* (Windows NT 6.0*)*] -Parent=Opera 10.0 -Platform=WinVista -Win32=true - -[Opera/10.0* (Windows NT 6.1*)*] -Parent=Opera 10.0 -Platform=Win7 - -[Opera/10.0* (Windows XP*)*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Opera/10.0* (X11; FreeBSD*)*] -Parent=Opera 10.0 -Platform=FreeBSD - -[Opera/10.0* (X11; Linux*)*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (X11; SunOS*)*] -Parent=Opera 10.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.0 - -[Opera 7.0] -Parent=DefaultProperties -Browser=Opera -Version=7.0 -MajorVer=7 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/3.0 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/3.0 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/3.0 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/3.0 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/3.0 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/3.0 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 2000) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 95) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 98) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows ME) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 4.0) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.0) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows XP) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.78 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.78 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/4.78 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/4.78 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/4.78 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/4.78 (Windows NT 5.1; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.78 (Windows Windows NT 5.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.78 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows NT 5.1; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Opera/7.0* (Windows 2000; ?)*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Opera/7.0* (Windows 95; ?)*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Opera/7.0* (Windows 98; ?)*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Opera/7.0* (Windows ME; ?)*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Opera/7.0* (Windows NT 4.0; ?)*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Opera/7.0* (Windows NT 5.0; ?)*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Opera/7.0* (Windows NT 5.1; ?)*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Opera/7.0* (Windows XP; ?)*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.1 - -[Opera 7.1] -Parent=DefaultProperties -Browser=Opera -Version=7.1 -MajorVer=7 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows 2000; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Opera/7.1* (Linux*; ?)*] -Parent=Opera 7.1 -Platform=Linux - -[Opera/7.1* (Windows 95; ?)*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Opera/7.1* (Windows 98; ?)*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Opera/7.1* (Windows ME; ?)*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Opera/7.1* (Windows NT 4.0; ?)*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Opera/7.1* (Windows NT 5.0; ?)*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Opera/7.1* (Windows NT 5.1; ?)*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Opera/7.1* (Windows XP; ?)*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.2 - -[Opera 7.2] -Parent=DefaultProperties -Browser=Opera -Version=7.2 -MajorVer=7 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.2*] -Parent=Opera 7.2 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows 2000; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Opera/7.2* (Linux*; ?)*] -Parent=Opera 7.2 -Platform=Linux - -[Opera/7.2* (Windows 95; ?)*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Opera/7.2* (Windows 98; ?)*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Opera/7.2* (Windows ME; ?)*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Opera/7.2* (Windows NT 4.0; ?)*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Opera/7.2* (Windows NT 5.0; ?)*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Opera/7.2* (Windows NT 5.1; ?)*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Opera/7.2* (Windows NT 5.2; ?)*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Opera/7.2* (Windows XP; ?)*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Opera/7.2* (X11; FreeBSD*; ?)*] -Parent=Opera 7.2 -Platform=FreeBSD - -[Opera/7.2* (X11; Linux*; ?)*] -Parent=Opera 7.2 -Platform=Linux - -[Opera/7.2* (X11; SunOS*)*] -Parent=Opera 7.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.5 - -[Opera 7.5] -Parent=DefaultProperties -Browser=Opera -Version=7.5 -MajorVer=7 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.5*] -Parent=Opera 7.5 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Opera/7.5* (Linux*; ?)*] -Parent=Opera 7.5 -Platform=Linux - -[Opera/7.5* (Macintosh; *Mac OS X; ?)*] -Parent=Opera 7.5 -Platform=MacOSX - -[Opera/7.5* (Windows 95; ?)*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Opera/7.5* (Windows 98; ?)*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Opera/7.5* (Windows ME; ?)*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Opera/7.5* (Windows NT 4.0; ?)*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Opera/7.5* (Windows NT 5.0; ?)*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Opera/7.5* (Windows NT 5.1; ?)*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Opera/7.5* (Windows NT 5.2; ?)*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Opera/7.5* (Windows XP; ?)*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Opera/7.5* (X11; FreeBSD*; ?)*] -Parent=Opera 7.5 -Platform=FreeBSD - -[Opera/7.5* (X11; Linux*; ?)*] -Parent=Opera 7.5 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.6 - -[Opera 7.6] -Parent=DefaultProperties -Browser=Opera -Version=7.6 -MajorVer=7 -MinorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.6*] -Parent=Opera 7.6 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Opera/7.6* (Linux*)*] -Parent=Opera 7.6 -Platform=Linux - -[Opera/7.6* (Macintosh; *Mac OS X; ?)*] -Parent=Opera 7.6 -Platform=MacOSX - -[Opera/7.6* (Windows 95*)*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Opera/7.6* (Windows 98*)*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Opera/7.6* (Windows ME*)*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Opera/7.6* (Windows NT 4.0*)*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Opera/7.6* (Windows NT 5.0*)*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Opera/7.6* (Windows NT 5.1*)*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Opera/7.6* (Windows NT 5.2*)*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Opera/7.6* (Windows XP*)*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Opera/7.6* (X11; FreeBSD*)*] -Parent=Opera 7.6 -Platform=FreeBSD - -[Opera/7.6* (X11; Linux*)*] -Parent=Opera 7.6 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.0 - -[Opera 8.0] -Parent=DefaultProperties -Browser=Opera -Version=8.0 -MajorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacOSX - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.0*] -Parent=Opera 8.0 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Opera/8.0* (Linux*)*] -Parent=Opera 8.0 -Platform=Linux - -[Opera/8.0* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.0 -Platform=MacOSX - -[Opera/8.0* (Windows 95*)*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Opera/8.0* (Windows 98*)*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Opera/8.0* (Windows CE*)*] -Parent=Opera 8.0 -Platform=WinCE -Win32=true - -[Opera/8.0* (Windows ME*)*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Opera/8.0* (Windows NT 4.0*)*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Opera/8.0* (Windows NT 5.0*)*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Opera/8.0* (Windows NT 5.1*)*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Opera/8.0* (Windows NT 5.2*)*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Opera/8.0* (Windows XP*)*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Opera/8.0* (X11; FreeBSD*)*] -Parent=Opera 8.0 -Platform=FreeBSD - -[Opera/8.0* (X11; Linux*)*] -Parent=Opera 8.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.1 - -[Opera 8.1] -Parent=DefaultProperties -Browser=Opera -Version=8.1 -MajorVer=8 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.1*] -Parent=Opera 8.1 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.1*] -Parent=Opera 8.1 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.1*] -Parent=Opera 8.1 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Opera/8.1* (Linux*)*] -Parent=Opera 8.1 -Platform=Linux - -[Opera/8.1* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.1 -Platform=MacOSX - -[Opera/8.1* (Windows 95*)*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Opera/8.1* (Windows 98*)*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Opera/8.1* (Windows CE*)*] -Parent=Opera 8.1 -Platform=WinCE -Win32=true - -[Opera/8.1* (Windows ME*)*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Opera/8.1* (Windows NT 4.0*)*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Opera/8.1* (Windows NT 5.0*)*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Opera/8.1* (Windows NT 5.1*)*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Opera/8.1* (Windows NT 5.2*)*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Opera/8.1* (Windows XP*)*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Opera/8.1* (X11; FreeBSD*)*] -Parent=Opera 8.1 -Platform=FreeBSD - -[Opera/8.1* (X11; Linux*)*] -Parent=Opera 8.1 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.5 - -[Opera 8.5] -Parent=DefaultProperties -Browser=Opera -Version=8.5 -MajorVer=8 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X;*) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.5*] -Parent=Opera 8.5 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (Macintosh; PPC Mac OS X;*) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Opera/8.5* (Linux*)*] -Parent=Opera 8.5 -Platform=Linux - -[Opera/8.5* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.5 -Platform=MacOSX - -[Opera/8.5* (Windows 95*)*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Opera/8.5* (Windows 98*)*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Opera/8.5* (Windows CE*)*] -Parent=Opera 8.5 -Platform=WinCE -Win32=true - -[Opera/8.5* (Windows ME*)*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Opera/8.5* (Windows NT 4.0*)*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Opera/8.5* (Windows NT 5.0*)*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Opera/8.5* (Windows NT 5.1*)*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Opera/8.5* (Windows NT 5.2*)*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Opera/8.5* (Windows XP*)*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Opera/8.5* (X11; FreeBSD*)*] -Parent=Opera 8.5 -Platform=FreeBSD - -[Opera/8.5* (X11; Linux*)*] -Parent=Opera 8.5 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.0 - -[Opera 9.0] -Parent=DefaultProperties -Browser=Opera -Version=9.0 -MajorVer=9 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.0*] -Parent=Opera 9.0 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.0*] -Parent=Opera 9.0 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (X11; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Opera/9.0* (Linux*)*] -Parent=Opera 9.0 -Platform=Linux - -[Opera/9.0* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.0 -Platform=MacOSX - -[Opera/9.0* (Windows 95*)*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Opera/9.0* (Windows 98*)*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Opera/9.0* (Windows CE*)*] -Parent=Opera 9.0 -Platform=WinCE -Win32=true - -[Opera/9.0* (Windows ME*)*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Opera/9.0* (Windows NT 4.0*)*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Opera/9.0* (Windows NT 5.0*)*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Opera/9.0* (Windows NT 5.1*)*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Opera/9.0* (Windows NT 5.2*)*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Opera/9.0* (Windows NT 6.0*)*] -Parent=Opera 9.0 -Platform=WinVista -Win32=true - -[Opera/9.0* (Windows XP*)*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Opera/9.0* (X11; FreeBSD*)*] -Parent=Opera 9.0 -Platform=FreeBSD - -[Opera/9.0* (X11; Linux*)*] -Parent=Opera 9.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.1 - -[Opera 9.1] -Parent=DefaultProperties -Browser=Opera -Version=9.1 -MajorVer=9 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.1*] -Parent=Opera 9.1 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.1*] -Parent=Opera 9.1 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Mozilla/* (X11; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (Linux*)*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.1 -Platform=MacOSX - -[Opera/9.1* (Windows 95*)*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Opera/9.1* (Windows 98*)*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Opera/9.1* (Windows CE*)*] -Parent=Opera 9.1 -Platform=WinCE -Win32=true - -[Opera/9.1* (Windows ME*)*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Opera/9.1* (Windows NT 4.0*)*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Opera/9.1* (Windows NT 5.0*)*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Opera/9.1* (Windows NT 5.1*)*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Opera/9.1* (Windows NT 5.2*)*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Opera/9.1* (Windows NT 6.0*)*] -Parent=Opera 9.1 -Platform=WinVista -Win32=true - -[Opera/9.1* (Windows XP*)*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Opera/9.1* (X11; FreeBSD*)*] -Parent=Opera 9.1 -Platform=FreeBSD - -[Opera/9.1* (X11; Linux*)*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (X11; SunOS*)*] -Parent=Opera 9.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.2 - -[Opera 9.2] -Parent=DefaultProperties -Browser=Opera -Version=9.2 -MajorVer=9 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.2*] -Parent=Opera 9.2 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.2*] -Parent=Opera 9.2 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (Linux*)*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.2 -Platform=MacOSX - -[Opera/9.2* (Windows 95*)*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Opera/9.2* (Windows 98*)*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Opera/9.2* (Windows CE*)*] -Parent=Opera 9.2 -Platform=WinCE -Win32=true - -[Opera/9.2* (Windows ME*)*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Opera/9.2* (Windows NT 4.0*)*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Opera/9.2* (Windows NT 5.0*)*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Opera/9.2* (Windows NT 5.1*)*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Opera/9.2* (Windows NT 5.2*)*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Opera/9.2* (Windows NT 6.0*)*] -Parent=Opera 9.2 -Platform=WinVista -Win32=true - -[Opera/9.2* (Windows NT 6.1*)*] -Parent=Opera 9.2 -Platform=Win7 - -[Opera/9.2* (Windows XP*)*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Opera/9.2* (X11; FreeBSD*)*] -Parent=Opera 9.2 -Platform=FreeBSD - -[Opera/9.2* (X11; Linux*)*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (X11; SunOS*)*] -Parent=Opera 9.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.3 - -[Opera 9.3] -Parent=DefaultProperties -Browser=Opera -Version=9.3 -MajorVer=9 -MinorVer=3 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.3*] -Parent=Opera 9.3 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.3*] -Parent=Opera 9.3 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (Linux*)*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.3 -Platform=MacOSX - -[Opera/9.3* (Windows 95*)*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Opera/9.3* (Windows 98*)*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Opera/9.3* (Windows CE*)*] -Parent=Opera 9.3 -Platform=WinCE -Win32=true - -[Opera/9.3* (Windows ME*)*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Opera/9.3* (Windows NT 4.0*)*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Opera/9.3* (Windows NT 5.0*)*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Opera/9.3* (Windows NT 5.1*)*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Opera/9.3* (Windows NT 5.2*)*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Opera/9.3* (Windows NT 6.0*)*] -Parent=Opera 9.3 -Platform=WinVista -Win32=true - -[Opera/9.3* (Windows NT 6.1*)*] -Parent=Opera 9.3 -Platform=Win7 - -[Opera/9.3* (Windows XP*)*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Opera/9.3* (X11; FreeBSD*)*] -Parent=Opera 9.3 -Platform=FreeBSD - -[Opera/9.3* (X11; Linux*)*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (X11; SunOS*)*] -Parent=Opera 9.3 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.4 - -[Opera 9.4] -Parent=DefaultProperties -Browser=Opera -Version=9.4 -MajorVer=9 -MinorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.4*] -Parent=Opera 9.4 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.4*] -Parent=Opera 9.4 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (Linux*)*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.4 -Platform=MacOSX - -[Opera/9.4* (Windows 95*)*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Opera/9.4* (Windows 98*)*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Opera/9.4* (Windows CE*)*] -Parent=Opera 9.4 -Platform=WinCE -Win32=true - -[Opera/9.4* (Windows ME*)*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Opera/9.4* (Windows NT 4.0*)*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Opera/9.4* (Windows NT 5.0*)*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Opera/9.4* (Windows NT 5.1*)*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Opera/9.4* (Windows NT 5.2*)*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Opera/9.4* (Windows NT 6.0*)*] -Parent=Opera 9.4 -Platform=WinVista -Win32=true - -[Opera/9.4* (Windows NT 6.1*)*] -Parent=Opera 9.4 -Platform=Win7 - -[Opera/9.4* (Windows XP*)*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Opera/9.4* (X11; FreeBSD*)*] -Parent=Opera 9.4 -Platform=FreeBSD - -[Opera/9.4* (X11; Linux*)*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (X11; SunOS*)*] -Parent=Opera 9.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.5 - -[Opera 9.5] -Parent=DefaultProperties -Browser=Opera -Version=9.5 -MajorVer=9 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.5*] -Parent=Opera 9.5 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.5*] -Parent=Opera 9.5 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (Linux*)*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.5 -Platform=MacOSX - -[Opera/9.5* (Windows 95*)*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Opera/9.5* (Windows 98*)*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Opera/9.5* (Windows CE*)*] -Parent=Opera 9.5 -Platform=WinCE -Win32=true - -[Opera/9.5* (Windows ME*)*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Opera/9.5* (Windows NT 4.0*)*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Opera/9.5* (Windows NT 5.0*)*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Opera/9.5* (Windows NT 5.1*)*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Opera/9.5* (Windows NT 5.2*)*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Opera/9.5* (Windows NT 6.0*)*] -Parent=Opera 9.5 -Platform=WinVista -Win32=true - -[Opera/9.5* (Windows NT 6.1*)*] -Parent=Opera 9.5 -Platform=Win7 - -[Opera/9.5* (Windows XP*)*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Opera/9.5* (X11; FreeBSD*)*] -Parent=Opera 9.5 -Platform=FreeBSD - -[Opera/9.5* (X11; Linux*)*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (X11; SunOS*)*] -Parent=Opera 9.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.6 - -[Opera 9.6] -Parent=DefaultProperties -Browser=Opera -Version=9.6 -MajorVer=9 -MinorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.6*] -Parent=Opera 9.6 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.6*] -Parent=Opera 9.6 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (Linux*)*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.6 -Platform=MacOSX - -[Opera/9.6* (Windows 95*)*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Opera/9.6* (Windows 98*)*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Opera/9.6* (Windows CE*)*] -Parent=Opera 9.6 -Platform=WinCE -Win32=true - -[Opera/9.6* (Windows ME*)*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Opera/9.6* (Windows NT 4.0*)*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Opera/9.6* (Windows NT 5.0*)*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Opera/9.6* (Windows NT 5.1*)*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Opera/9.6* (Windows NT 5.2*)*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Opera/9.6* (Windows NT 6.0*)*] -Parent=Opera 9.6 -Platform=WinVista -Win32=true - -[Opera/9.6* (Windows NT 6.1*)*] -Parent=Opera 9.6 -Platform=Win7 - -[Opera/9.6* (Windows XP*)*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Opera/9.6* (X11; FreeBSD*)*] -Parent=Opera 9.6 -Platform=FreeBSD - -[Opera/9.6* (X11; Linux*)*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (X11; SunOS*)*] -Parent=Opera 9.6 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.0 - -[Netscape 4.0] -Parent=DefaultProperties -Browser=Netscape -Version=4.0 -MajorVer=4 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0*(Macintosh*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=MacPPC - -[Mozilla/4.0*(Win95;*] -Parent=Netscape 4.0 -Platform=Win95 - -[Mozilla/4.0*(Win98;*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=Win98 - -[Mozilla/4.0*(WinNT*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=WinNT - -[Mozilla/4.0*(X11;*)] -Parent=Netscape 4.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.5 - -[Netscape 4.5] -Parent=DefaultProperties -Browser=Netscape -Version=4.5 -MajorVer=4 -MinorVer=5 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.5*(Macintosh; ?; PPC)] -Parent=Netscape 4.5 -Platform=MacPPC - -[Mozilla/4.5*(Win2000; ?)] -Parent=Netscape 4.5 -Platform=Win2000 - -[Mozilla/4.5*(Win95; ?)] -Parent=Netscape 4.5 -Platform=Win95 - -[Mozilla/4.5*(Win98; ?)] -Parent=Netscape 4.5 -Platform=Win98 - -[Mozilla/4.5*(WinME; ?)] -Parent=Netscape 4.5 -Platform=WinME - -[Mozilla/4.5*(WinNT; ?)] -Parent=Netscape 4.5 -Platform=WinNT - -[Mozilla/4.5*(WinXP; ?)] -Parent=Netscape 4.5 -Platform=WinXP - -[Mozilla/4.5*(X11*)] -Parent=Netscape 4.5 -Platform=Linux - -[Mozilla/4.51*(Macintosh; ?; PPC)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 - -[Mozilla/4.51*(Win2000; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win2000 - -[Mozilla/4.51*(Win95; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win95 - -[Mozilla/4.51*(Win98; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win98 - -[Mozilla/4.51*(WinME; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinME - -[Mozilla/4.51*(WinNT; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinNT - -[Mozilla/4.51*(WinXP; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinXP - -[Mozilla/4.51*(X11*)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.6 - -[Netscape 4.6] -Parent=DefaultProperties -Browser=Netscape -Version=4.6 -MajorVer=4 -MinorVer=6 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.6 * (OS/2; ?)] -Parent=Netscape 4.6 -Platform=OS/2 - -[Mozilla/4.6*(Macintosh; ?; PPC)] -Parent=Netscape 4.6 -Platform=MacPPC - -[Mozilla/4.6*(Win95; ?)] -Parent=Netscape 4.6 -Platform=Win95 - -[Mozilla/4.6*(Win98; ?)] -Parent=Netscape 4.6 -Platform=Win98 - -[Mozilla/4.6*(WinNT; ?)] -Parent=Netscape 4.6 -Platform=WinNT - -[Mozilla/4.61*(Macintosh; ?; PPC)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=MacPPC - -[Mozilla/4.61*(OS/2; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=OS/2 - -[Mozilla/4.61*(Win95; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=Win95 - -[Mozilla/4.61*(Win98; ?)] -Parent=Netscape 4.6 -Version=4.61 -Platform=Win98 - -[Mozilla/4.61*(WinNT; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=WinNT - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.7 - -[Netscape 4.7] -Parent=DefaultProperties -Browser=Netscape -Version=4.7 -MajorVer=4 -MinorVer=7 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.7 * (Win2000; ?)] -Parent=Netscape 4.7 -Platform=Win2000 - -[Mozilla/4.7*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=MacPPC - -[Mozilla/4.7*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win95 - -[Mozilla/4.7*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win98 - -[Mozilla/4.7*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=WinNT -Win32=true - -[Mozilla/4.7*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win2000 -Win32=true - -[Mozilla/4.7*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=WinXP -Win32=true - -[Mozilla/4.7*(WinNT; ?)*] -Parent=Netscape 4.7 -Platform=WinNT - -[Mozilla/4.7*(X11*)*] -Parent=Netscape 4.7 -Platform=Linux - -[Mozilla/4.7*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Platform=SunOS - -[Mozilla/4.71*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=MacPPC - -[Mozilla/4.71*(Win95; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win95 - -[Mozilla/4.71*(Win98; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win98 - -[Mozilla/4.71*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinNT -Win32=true - -[Mozilla/4.71*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win2000 -Win32=true - -[Mozilla/4.71*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinXP -Win32=true - -[Mozilla/4.71*(WinNT; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinNT - -[Mozilla/4.71*(X11*)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Linux - -[Mozilla/4.71*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=SunOS - -[Mozilla/4.72*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=MacPPC - -[Mozilla/4.72*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win95 - -[Mozilla/4.72*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win98 - -[Mozilla/4.72*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinNT -Win32=true - -[Mozilla/4.72*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win2000 -Win32=true - -[Mozilla/4.72*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinXP -Win32=true - -[Mozilla/4.72*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinNT - -[Mozilla/4.72*(X11*)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Linux - -[Mozilla/4.72*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=SunOS - -[Mozilla/4.73*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=MacPPC - -[Mozilla/4.73*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win95 - -[Mozilla/4.73*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win98 - -[Mozilla/4.73*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinNT -Win32=true - -[Mozilla/4.73*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win2000 -Win32=true - -[Mozilla/4.73*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinXP -Win32=true - -[Mozilla/4.73*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinNT - -[Mozilla/4.73*(X11*)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Linux - -[Mozilla/4.73*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=SunOS - -[Mozilla/4.74*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=MacPPC - -[Mozilla/4.74*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win95 - -[Mozilla/4.74*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win98 - -[Mozilla/4.74*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinNT -Win32=true - -[Mozilla/4.74*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win2000 -Win32=true - -[Mozilla/4.74*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinXP -Win32=true - -[Mozilla/4.74*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinNT - -[Mozilla/4.74*(X11*)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Linux - -[Mozilla/4.74*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=SunOS - -[Mozilla/4.75*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=MacPPC - -[Mozilla/4.75*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win95 - -[Mozilla/4.75*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win98 - -[Mozilla/4.75*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinNT -Win32=true - -[Mozilla/4.75*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win2000 -Win32=true - -[Mozilla/4.75*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinXP -Win32=true - -[Mozilla/4.75*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinNT - -[Mozilla/4.75*(X11*)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Linux - -[Mozilla/4.75*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=SunOS - -[Mozilla/4.76*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=MacPPC - -[Mozilla/4.76*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win95 - -[Mozilla/4.76*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win98 - -[Mozilla/4.76*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinNT -Win32=true - -[Mozilla/4.76*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win2000 -Win32=true - -[Mozilla/4.76*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinXP -Win32=true - -[Mozilla/4.76*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinNT - -[Mozilla/4.76*(X11*)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Linux - -[Mozilla/4.76*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=SunOS - -[Mozilla/4.77*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=MacPPC - -[Mozilla/4.77*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win95 - -[Mozilla/4.77*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win98 - -[Mozilla/4.77*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinNT -Win32=true - -[Mozilla/4.77*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win2000 -Win32=true - -[Mozilla/4.77*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinXP -Win32=true - -[Mozilla/4.77*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinNT - -[Mozilla/4.77*(X11*)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Linux - -[Mozilla/4.77*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=SunOS - -[Mozilla/4.78*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=MacPPC - -[Mozilla/4.78*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win95 - -[Mozilla/4.78*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win98 - -[Mozilla/4.78*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinNT -Win32=true - -[Mozilla/4.78*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win2000 -Win32=true - -[Mozilla/4.78*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinXP -Win32=true - -[Mozilla/4.78*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinNT - -[Mozilla/4.78*(X11*)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Linux - -[Mozilla/4.78*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=SunOS - -[Mozilla/4.79*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=MacPPC - -[Mozilla/4.79*(Win95; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win95 - -[Mozilla/4.79*(Win98; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win98 - -[Mozilla/4.79*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinNT -Win32=true - -[Mozilla/4.79*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win2000 -Win32=true - -[Mozilla/4.79*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinXP -Win32=true - -[Mozilla/4.79*(WinNT; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinNT - -[Mozilla/4.79*(X11*)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Linux - -[Mozilla/4.79*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.8 - -[Netscape 4.8] -Parent=DefaultProperties -Browser=Netscape -Version=4.8 -MajorVer=4 -MinorVer=8 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.8*(Macintosh; ?; MacPPC)*] -Parent=Netscape 4.8 -Platform=MacPPC - -[Mozilla/4.8*(Macintosh; ?; PPC Mac OS X*] -Parent=Netscape 4.8 -Platform=MacOSX - -[Mozilla/4.8*(Macintosh; ?; PPC)*] -Parent=Netscape 4.8 -Platform=MacPPC - -[Mozilla/4.8*(Win95; *)*] -Parent=Netscape 4.8 - -[Mozilla/4.8*(Win98; *)*] -Parent=Netscape 4.8 -Platform=Win98 - -[Mozilla/4.8*(Windows NT 4.0; *)*] -Parent=Netscape 4.8 -Platform=WinNT -Win32=true - -[Mozilla/4.8*(Windows NT 5.0; *)*] -Parent=Netscape 4.8 -Platform=Win2000 -Win32=true - -[Mozilla/4.8*(Windows NT 5.1; *)*] -Parent=Netscape 4.8 -Platform=WinXP -Win32=true - -[Mozilla/4.8*(WinNT; *)*] -Parent=Netscape 4.8 -Platform=WinNT - -[Mozilla/4.8*(X11; *)*] -Parent=Netscape 4.8 -Platform=Linux - -[Mozilla/4.8*(X11; *SunOS*)*] -Parent=Netscape 4.8 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.0 - -[Netscape 6.0] -Parent=DefaultProperties -Browser=Netscape -Version=6.0 -MajorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.1 - -[Netscape 6.1] -Parent=DefaultProperties -Browser=Netscape -Version=6.1 -MajorVer=6 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.2 - -[Netscape 6.2] -Parent=DefaultProperties -Browser=Netscape -Version=6.2 -MajorVer=6 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.0 - -[Netscape 7.0] -Parent=DefaultProperties -Browser=Netscape -Version=7.0 -MajorVer=7 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win*9x 4.90; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.1 - -[Netscape 7.1] -Parent=DefaultProperties -Browser=Netscape -Version=7.1 -MajorVer=7 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/7.1] -Parent=Netscape 7.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.2 - -[Netscape 7.2] -Parent=DefaultProperties -Browser=Netscape -Version=7.2 -MajorVer=7 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 8.0 - -[Netscape 8.0] -Parent=DefaultProperties -Browser=Netscape -Version=8.0 -MajorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 8.1 - -[Netscape 8.1] -Parent=DefaultProperties -Browser=Netscape -Version=8.1 -MajorVer=8 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.0 - -[SeaMonkey 1.0] -Parent=DefaultProperties -Browser=SeaMonkey -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.8*) Gecko/20060221 SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.1 - -[SeaMonkey 1.1] -Parent=DefaultProperties -Browser=SeaMonkey -Version=1.1 -MajorVer=1 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.8*) Gecko/20060221 SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 2.0 - -[SeaMonkey 2.0] -Parent=DefaultProperties -Browser=SeaMonkey -Version=2.0 -MajorVer=2 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.9*) Gecko/20060221 SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Flock 1.0 - -[Flock 1.0] -Parent=DefaultProperties -Browser=Flock -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; U; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinME - -[Mozilla/5.0 (Windows; U; Windows NT 5.0*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; U; Windows NT 5.1*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Flock 2.0 - -[Flock 2.0] -Parent=DefaultProperties -Browser=Flock -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; U; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinME - -[Mozilla/5.0 (Windows; U; Windows NT 5.0*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; U; Windows NT 5.1*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sleipnir 2.0 - -[Sleipnir] -Parent=DefaultProperties -Browser=Sleipnir -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.0*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.1*) Sleipnir/2.*] -Parent=Sleipnir -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.2*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 6.0*) Sleipnir/2.*] -Parent=Sleipnir -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 6.1*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win7 - -[Sleipnir*] -Parent=Sleipnir - -[Sleipnir/2.*] -Parent=Sleipnir - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fennec 1.0 - -[Fennec 1.0] -Parent=DefaultProperties -Browser=Firefox Mobile -Version=1.0 -MajorVer=1 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firebird - -[Firebird] -Parent=DefaultProperties -Browser=Firebird -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Linux; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird Browser/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; IRIX*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox - -[Firefox] -Parent=DefaultProperties -Browser=Firefox -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (OS/2; *; Warp*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (Windows NT 5.?; ?; rv:1.*) Gecko/* Firefox] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.*; *; rv:1.*) Gecko/* Deer Park/Alpha*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firefox/10.5] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; FreeBSD*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; HP-UX*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; Linux*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.0 - -[Firefox 1.0] -Parent=DefaultProperties -Browser=Firefox -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=MacPPC - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; *Linux*; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; DragonFly*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.4 - -[Firefox 1.4] -Parent=DefaultProperties -Browser=Firefox -Version=1.4 -MajorVer=1 -MinorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.5 - -[Firefox 1.5] -Parent=DefaultProperties -Browser=Firefox -Version=1.5 -MajorVer=1 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=OS/2 - -[Mozilla/5.0 (rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2 x64; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 2.0 - -[Firefox 2.0] -Parent=DefaultProperties -Browser=Firefox -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.0 - -[Firefox 3.0] -Parent=DefaultProperties -Browser=Firefox -Version=3.0 -MajorVer=3 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.1 - -[Firefox 3.1] -Parent=DefaultProperties -Browser=Firefox -Version=3.1 -MajorVer=3 -MinorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.5 - -[Firefox 3.5] -Parent=DefaultProperties -Browser=Firefox -Version=3.5 -MajorVer=3 -MinorVer=5 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Phoenix - -[Phoenix] -Parent=DefaultProperties -Browser=Phoenix -Version=0.5 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iceweasel - -[Iceweasel] -Parent=DefaultProperties -Browser=Iceweasel -Platform=Linux -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.8*) Gecko/* Iceweasel/2.0* (Debian-*)] -Parent=Iceweasel -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.0 - -[Mozilla 1.0] -Parent=DefaultProperties -Browser=Mozilla -Version=1.0 -MajorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.0.*) Gecko/*] -Parent=Mozilla 1.0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.1 - -[Mozilla 1.1] -Parent=DefaultProperties -Browser=Mozilla -Version=1.1 -MajorVer=1 -MinorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.1.*) Gecko/*] -Parent=Mozilla 1.1 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.2 - -[Mozilla 1.2] -Parent=DefaultProperties -Browser=Mozilla -Version=1.2 -MajorVer=1 -MinorVer=2 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.2.*) Gecko/*] -Parent=Mozilla 1.2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.3 - -[Mozilla 1.3] -Parent=DefaultProperties -Browser=Mozilla -Version=1.3 -MajorVer=1 -MinorVer=3 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.3.*) Gecko/*] -Parent=Mozilla 1.3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.4 - -[Mozilla 1.4] -Parent=DefaultProperties -Browser=Mozilla -Version=1.4 -MajorVer=1 -MinorVer=4 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.5 - -[Mozilla 1.5] -Parent=DefaultProperties -Browser=Mozilla -Version=1.5 -MajorVer=1 -MinorVer=5 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.6 - -[Mozilla 1.6] -Parent=DefaultProperties -Browser=Mozilla -Version=1.6 -MajorVer=1 -MinorVer=6 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.7 - -[Mozilla 1.7] -Parent=DefaultProperties -Browser=Mozilla -Version=1.7 -MajorVer=1 -MinorVer=7 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (*rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.8 - -[Mozilla 1.8] -Parent=DefaultProperties -Browser=Mozilla -Version=1.8 -MajorVer=1 -MinorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (*rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.9 - -[Mozilla 1.9] -Parent=DefaultProperties -Browser=Mozilla -Version=1.9 -MajorVer=1 -MinorVer=9 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE Mac - -[IE Mac] -Parent=DefaultProperties -Browser=IE -Platform=MacPPC -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/?.? (compatible; MSIE 4.0*; *Mac_PowerPC*] -Parent=IE Mac -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Mozilla/?.? (compatible; MSIE 4.5*; *Mac_PowerPC*] -Parent=IE Mac -Version=4.5 -MajorVer=4 -MinorVer=5 - -[Mozilla/?.? (compatible; MSIE 5.0*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.0 -MajorVer=5 -MinorVer=0 - -[Mozilla/?.? (compatible; MSIE 5.1*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/?.? (compatible; MSIE 5.2*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.2 -MajorVer=5 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 5.5 - -[AOL 9.0/IE 5.5] -Parent=DefaultProperties -Browser=AOL -Version=5.5 -MajorVer=5 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 5.5; *AOL 9.0*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 6.0 - -[AOL 9.0/IE 6.0] -Parent=DefaultProperties -Browser=AOL -Version=6.0 -MajorVer=6 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 6.0; *AOL 9.0*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 7.0 - -[AOL 9.0/IE 7.0] -Parent=DefaultProperties -Browser=AOL -Version=7.0 -MajorVer=7 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 - -[Mozilla/?.* (?compatible; *MSIE 7.0; *AOL 9.0*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Avant Browser - -[Avant Browser] -Parent=DefaultProperties -Browser=Avant Browser -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Advanced Browser (http://www.avantbrowser.com)] -Parent=Avant Browser - -[Avant Browser*] -Parent=Avant Browser - -[Avant Browser/*] -Parent=Avant Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 4.01 - -[IE 4.01] -Parent=DefaultProperties -Browser=IE -Version=4.01 -MajorVer=4 -MinorVer=01 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 4.01*)*] -Parent=IE 4.01 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 95*)*] -Parent=IE 4.01 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 98*)*] -Parent=IE 4.01 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 4.01 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 4.0*)*] -Parent=IE 4.01 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.0*)*] -Parent=IE 4.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.01*)*] -Parent=IE 4.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 4.01; Windows NT)] -Parent=IE 4.01 -Platform=WinNT - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.0 - -[IE 5.0] -Parent=DefaultProperties -Browser=IE -Version=5.0 -MajorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 5.0*)*] -Parent=IE 5.0 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 95*)*] -Parent=IE 5.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98*)*] -Parent=IE 5.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 5.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 4.0*)*] -Parent=IE 5.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.0*)*] -Parent=IE 5.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.01*)*] -Parent=IE 5.0 -Platform=Win2000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.01 - -[IE 5.01] -Parent=DefaultProperties -Browser=IE -Version=5.01 -MajorVer=5 -MinorVer=01 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 5.01*)*] -Parent=IE 5.01 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 95*)*] -Parent=IE 5.01 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98*)*] -Parent=IE 5.01 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 5.01 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 4.0*)*] -Parent=IE 5.01 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.0*)*] -Parent=IE 5.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.01*)*] -Parent=IE 5.01 -Platform=Win2000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.5 - -[IE 5.5] -Parent=DefaultProperties -Browser=IE -Version=5.5 -MajorVer=5 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 5.5*)*] -Parent=IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 95*)*] -Parent=IE 5.5 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98*)*] -Parent=IE 5.5 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98; Win 9x 4.90*)*] -Parent=IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 4.0*)*] -Parent=IE 5.5 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.0*)*] -Parent=IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.01*)*] -Parent=IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.1*)*] -Parent=IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.2*)*] -Parent=IE 5.5 -Platform=Win2003 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 6.0 - -[IE 6.0] -Parent=DefaultProperties -Browser=IE -Version=6.0 -MajorVer=6 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -w3cdomversion=1.0 -msdomversion=6.0 - -[Mozilla/?.* (?compatible; *MSIE 6.0*)*] -Parent=IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 95*)*] -Parent=IE 6.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98*)*] -Parent=IE 6.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98; Win 9x 4.90*)*] -Parent=IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 4.0*)*] -Parent=IE 6.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.0*)*] -Parent=IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.01*)*] -Parent=IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.1*)*] -Parent=IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2*)*] -Parent=IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*Win64;*)*] -Parent=IE 6.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*WOW64;*)*] -Parent=IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 6.0*)*] -Parent=IE 6.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 7.0 - -[IE 7.0] -Parent=DefaultProperties -Browser=IE -Version=7.0 -MajorVer=7 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -msdomversion=7.0 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 7.0*)*] -Parent=IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98*)*] -Parent=IE 7.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 4.0*)*] -Parent=IE 7.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.0*)*] -Parent=IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.01*)*] -Parent=IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.1*)*] -Parent=IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2*)*] -Parent=IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*Win64;*)*] -Parent=IE 7.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*WOW64;*)*] -Parent=IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.0*)*] -Parent=IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.1*)*] -Parent=IE 7.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; *)*] -Parent=IE 7.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 8.0 - -[IE 8.0] -Parent=DefaultProperties -Browser=IE -Version=8.0 -MajorVer=8 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=3 -supportsCSS=true -ecmascriptversion=1.2 -msdomversion=8.0 -w3cdomversion=1.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Win32*)*] -Parent=IE 8.0 -Platform=Win32 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0*)*] -Parent=IE 8.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1*)*] -Parent=IE 8.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2*)*] -Parent=IE 8.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Win64; x64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista -Win64=false - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1*)*] -Parent=IE 8.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 -Win64=false - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 7.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Default Browser - -[*] -Browser=Default Browser -Version=0 -MajorVer=0 -MinorVer=0 -Platform=unknown -Alpha=false -Beta=false -Win16=false -Win32=false -Win64=false -Frames=true -IFrames=false -Tables=true -Cookies=false -BackgroundSounds=false -CDF=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -Stripper=false -isBanned=false -isMobileDevice=false -isSyndicationReader=false -Crawler=false -CssVersion=0 -supportsCSS=false -AOL=false -aolVersion=0 -AuthenticodeUpdate=0 -CSS=0 -WAP=false -netCLR=false -ClrVersion=0 -ECMAScriptVersion=0.0 -W3CDOMVersion=0.0 diff --git a/Source/Platforms/Editor/Mac/Mono/etc/mono/config b/Source/Platforms/Editor/Mac/Mono/etc/mono/config deleted file mode 100644 index c9fe722be..000000000 --- a/Source/Platforms/Editor/Mac/Mono/etc/mono/config +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Mac/Mono/lib/libMonoPosixHelper.dylib b/Source/Platforms/Editor/Mac/Mono/lib/libMonoPosixHelper.dylib deleted file mode 100755 index f171b9953..000000000 Binary files a/Source/Platforms/Editor/Mac/Mono/lib/libMonoPosixHelper.dylib and /dev/null differ diff --git a/Source/Platforms/Editor/Mac/Mono/lib/libmono-btls-shared.dylib b/Source/Platforms/Editor/Mac/Mono/lib/libmono-btls-shared.dylib deleted file mode 100755 index e64e9f742..000000000 Binary files a/Source/Platforms/Editor/Mac/Mono/lib/libmono-btls-shared.dylib and /dev/null differ diff --git a/Source/Platforms/Editor/Mac/Mono/lib/libmono-native.dylib b/Source/Platforms/Editor/Mac/Mono/lib/libmono-native.dylib deleted file mode 100755 index d3c3fd4b7..000000000 Binary files a/Source/Platforms/Editor/Mac/Mono/lib/libmono-native.dylib and /dev/null differ diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Accessibility.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Accessibility.dll deleted file mode 100755 index 6a19d88c6..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Accessibility.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f418319d6c6c3407828125fd3577b5751f0bac92e666d02ee52f5f83ca86af16 -size 9216 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Commons.Xml.Relaxng.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Commons.Xml.Relaxng.dll deleted file mode 100755 index b87011ac0..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Commons.Xml.Relaxng.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9aeb15995631d18a2ab128accaaef89634b08ccc6b1c21440f977f170974f24 -size 36352 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/CustomMarshalers.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/CustomMarshalers.dll deleted file mode 100755 index ad554a2b7..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/CustomMarshalers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:609293e5578b4d6fcf7eab4f89c988db668aeadaae1dcaa01c88974005fe55da -size 6656 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/I18N.CJK.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/I18N.CJK.dll deleted file mode 100755 index d79dc6936..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/I18N.CJK.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9fbaada4ff44519f9bd4f3737eae111c935472a361661d1f290f13dce5d5135 -size 7168 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/I18N.MidEast.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/I18N.MidEast.dll deleted file mode 100755 index f7bef3811..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/I18N.MidEast.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81c35dad090f37debe208b073293dfcf3ee1aff57425c1eb9aa301c537dbe758 -size 6144 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/I18N.Other.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/I18N.Other.dll deleted file mode 100755 index 6fbdee529..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/I18N.Other.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c7a25aa2944ec1908f0f99bd63f92b54bf46e365ad92903598c34159f7fb4b8 -size 7680 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/I18N.Rare.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/I18N.Rare.dll deleted file mode 100755 index 69ba1b3f0..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/I18N.Rare.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f0b85ae2b8fd7041e4c8877ede197e24776f97a8a0aa41423c20470968bacc5 -size 13312 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/I18N.West.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/I18N.West.dll deleted file mode 100755 index 73ba915b1..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/I18N.West.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f70fd3a9e78999fcde826a9b1bb65cb84892bbf76f31e5fd1895884da3bcff34 -size 7680 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/I18N.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/I18N.dll deleted file mode 100755 index de064ab12..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/I18N.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6af5fc5d46e95cee7dd36b856169081dff4125bb1d3273ce25adca727105b38d -size 9728 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/IBM.Data.DB2.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/IBM.Data.DB2.dll deleted file mode 100755 index e768bfe0b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/IBM.Data.DB2.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12b2768f8ab211bca8a27091a0b15d45dfcbb6e4d54fa29ccf11fa54fcaaa5fe -size 18432 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/ICSharpCode.SharpZipLib.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/ICSharpCode.SharpZipLib.dll deleted file mode 100755 index 33dc68940..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/ICSharpCode.SharpZipLib.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:52c4cce8c458164c1e9d8eeb8fb3c8324e2eeb761afc7b0c58241acf3b5ca6eb -size 34304 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.Build.Engine.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.Build.Engine.dll deleted file mode 100755 index 2daa3df1b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.Build.Engine.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58278230b270f1d30cc31b01b94b1e3c9335cb46f7c2d7facf21c932fb976e26 -size 26112 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.Build.Framework.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.Build.Framework.dll deleted file mode 100755 index 7fb974e01..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.Build.Framework.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b8b3a0ab7b8583d83b4687c20478cb11399cd7a679a3f7b060f0303d31095adf -size 35840 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.Build.Tasks.v4.0.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.Build.Tasks.v4.0.dll deleted file mode 100755 index cea4a4b75..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.Build.Tasks.v4.0.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:837ae27645a72e534958388c0b034e6f07b53d41ee7c5a28fc293db44a1e7e45 -size 107008 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.Build.Utilities.v4.0.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.Build.Utilities.v4.0.dll deleted file mode 100755 index 5487b4405..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.Build.Utilities.v4.0.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eeb812f108e2086a71c68a794573895a6c5c6dbabaee090761339421c8cb1465 -size 29696 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.Build.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.Build.dll deleted file mode 100755 index 316d8038a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.Build.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bffdabcc22c3828886be0cc8d14cf835f915e000390fd840c2ad1ccff8604df7 -size 58880 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.CSharp.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.CSharp.dll deleted file mode 100755 index 669f620e5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.CSharp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:adf7400f82cbb1cdcfc11807a16a8df9631f7db124644a8a32deab0168070ae3 -size 8192 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.VisualBasic.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.VisualBasic.dll deleted file mode 100755 index 2d876e083..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.VisualBasic.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd7c08530e1429106c13b5ca82842ae9c17f03412c3d757bef518fc1ef8e4e83 -size 65536 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.VisualC.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.VisualC.dll deleted file mode 100755 index 3214cb27d..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.VisualC.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a7bb113c295c80d806d906cd65d2f52365a881f5d2af171f539dd3be0c474152 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.Web.Infrastructure.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.Web.Infrastructure.dll deleted file mode 100755 index afc38e2cf..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Microsoft.Web.Infrastructure.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e65f473381f45e6b3f11ff14335de14cdac12c1cce0db1cccc1391fd0b7157ba -size 6656 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.C5.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.C5.dll deleted file mode 100755 index 04a00746b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.C5.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad20d595c1f265d05fbbe96eb1267ad27359850af372b9ec9f7b84d45ec21660 -size 70144 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.CSharp.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.CSharp.dll deleted file mode 100755 index e60c4cfd9..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.CSharp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:03b52309d71bc32cbdfb5b0f082bc7916fecd594a23272d6492f2089c6773869 -size 228352 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Cairo.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Cairo.dll deleted file mode 100755 index ee898afd3..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Cairo.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:afccb350a2612de276321f84cf95aa2e67f7f654c30dd128089598068fc17f35 -size 24576 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.CodeContracts.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.CodeContracts.dll deleted file mode 100755 index 558dd4599..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.CodeContracts.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:253866617fdc5d907e9be9121c16fd3246863bef917082065b21d63aa07b8f68 -size 20992 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.CompilerServices.SymbolWriter.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.CompilerServices.SymbolWriter.dll deleted file mode 100755 index 0e341bc80..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.CompilerServices.SymbolWriter.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:90a90ad5ac054d5ad89bd3dc4715751d68f903ef38f3fd5e6a8b926b3f8f6de5 -size 14336 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Data.Sqlite.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Data.Sqlite.dll deleted file mode 100755 index 88e27f5da..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Data.Sqlite.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5101edb78c959eff227c7669e78b488b77141bb6cc16298d31be859f37bb8bcb -size 27648 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Data.Tds.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Data.Tds.dll deleted file mode 100755 index 6a7ab0c8a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Data.Tds.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fbbc6e345cadf4f128835b0654da2cc10f3c591180d09c1f3bb67f2868e0a606 -size 25088 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Debugger.Soft.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Debugger.Soft.dll deleted file mode 100755 index 118d82e6b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Debugger.Soft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc749a0aecfb16d887568c4be6b3fcf9eca0b630d4337e85a5ae9ae4717478b9 -size 33280 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Http.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Http.dll deleted file mode 100755 index 0eff9beb5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8513ffa15160eb182e3abea0bde643b60c713a0706f9813193dcb09881d778a8 -size 9216 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Management.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Management.dll deleted file mode 100755 index 0e2fd95da..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12fc168b83a4811042b1c55b62646285405d266c3f54489022d1726883791bba -size 4096 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Messaging.RabbitMQ.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Messaging.RabbitMQ.dll deleted file mode 100755 index f0e7f61aa..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Messaging.RabbitMQ.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c4676044715e06435dcc6de975588f7dc388c2357da048ec4308993a30cd8c6 -size 12800 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Messaging.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Messaging.dll deleted file mode 100755 index 9ba4b32ec..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b4f639d07823ddd3d812393d55a58ec866367d8b4f15d85aa4099a9f53043ed -size 18944 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Options.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Options.dll deleted file mode 100755 index 2debd5626..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Options.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bfc6d43316545905d6641902bb9097e90f0e6644630fd0724a4a413759fe735a -size 11776 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Parallel.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Parallel.dll deleted file mode 100755 index b10db6668..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Parallel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c0ffb599f9f2d28161468b2dac55272d1252eaa50d2e6ee328e880ded1ffb0e -size 7680 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Posix.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Posix.dll deleted file mode 100755 index 9d42676f7..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Posix.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a65ab5a8d236bceb0a92f231df3360d9213f68dc9e106ae925fe5570b34d0f1 -size 91648 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Security.Win32.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Security.Win32.dll deleted file mode 100755 index c08f697f7..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Security.Win32.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d6c970faf3fa851c1ca792f899d79bc81f166fbac0e92a675f06622cd37f720 -size 6656 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Security.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Security.dll deleted file mode 100755 index fa3ecc844..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:143b73d95cfb381fc6f56f1a5fcf6ce288589e753e00205fca6863442f3cceb2 -size 76800 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Simd.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Simd.dll deleted file mode 100755 index bbcfbe2e4..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Simd.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77e7e7f803e013f9b44d2c2767ea7615485f512c4a898ec9554504418f22e57a -size 34304 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Tasklets.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Tasklets.dll deleted file mode 100755 index 897e40d5a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.Tasklets.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c82c09050e37c308ddcb745443fa0ae91324ba2eb3dc6b46fda22fb909a1a83 -size 4096 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.WebBrowser.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.WebBrowser.dll deleted file mode 100755 index 8e8df6ac7..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Mono.WebBrowser.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d80a0e9f469097f0f1c42f3f2a12a41d8acc5da6984c6784a8b4eedc7f9a2e37 -size 23552 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Novell.Directory.Ldap.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Novell.Directory.Ldap.dll deleted file mode 100755 index 519a23576..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/Novell.Directory.Ldap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42da3b42b8de35d8ce99d4d65c8f0f342c15433a419a8ceb6572b705519ec0bb -size 93184 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/PEAPI.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/PEAPI.dll deleted file mode 100755 index 1a9a33026..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/PEAPI.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60c3da99a3ca5f2f797adb2e621301278798979ec004429eb3a41db88a2d7c3b -size 31232 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/RabbitMQ.Client.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/RabbitMQ.Client.dll deleted file mode 100755 index 3757d7dae..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/RabbitMQ.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20cdede0c968c80b81ac0c0063b69e66693e199e0dd2cdff7ac63a7820cfaae9 -size 321536 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/SMDiagnostics.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/SMDiagnostics.dll deleted file mode 100755 index 5e38dd5ea..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/SMDiagnostics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5616d2a53012b862f7ea8dd355570a89be376304f3793d8e9eac5d4bd00a92f3 -size 4096 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ComponentModel.Composition.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ComponentModel.Composition.dll deleted file mode 100755 index 2ee210da3..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ComponentModel.Composition.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00668aceeb5932b303da50390234b60ab394be3cfd94a85473bee4d43242f8f8 -size 30208 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ComponentModel.DataAnnotations.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ComponentModel.DataAnnotations.dll deleted file mode 100755 index 5d03c6a14..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ComponentModel.DataAnnotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eab8975998fd91680c7e69b7fa6a7c97317e236696c73044da4d7b4eb1e0a147 -size 17920 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Configuration.Install.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Configuration.Install.dll deleted file mode 100755 index cc1288b4f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Configuration.Install.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a0dd81759186bd5d2b828bfed9d285aebc4ac3192dc83aafa4e6f27535226db -size 13824 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Configuration.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Configuration.dll deleted file mode 100755 index 235192de5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Configuration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b83f740bb35cab7e2becafca96d06e34045dce958f8c87bab9b02f713411c3dc -size 46592 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Core.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Core.dll deleted file mode 100755 index fa3f647b2..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b779f0d6f3f069982e55cefd5b24a2e991cb5b66b3effc8dd346329827c5e6e -size 151552 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.DataSetExtensions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.DataSetExtensions.dll deleted file mode 100755 index 90da83068..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.DataSetExtensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e4d0e95d191686bf8db25a4bf05ecfce35e09794b569abf96c26cf4276212077 -size 9216 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.Entity.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.Entity.dll deleted file mode 100755 index 944e3b2fc..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.Entity.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0596d5d898f588fa00456868ff14ca71852dec09f38cb8ac30027a3d8b3d66d8 -size 237056 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.Linq.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.Linq.dll deleted file mode 100755 index 53d4b43c8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ee6fe97abcc2f76c3016f05c7a1a3b9300de7b74ad8c798edab9c191c18f294 -size 36352 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.OracleClient.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.OracleClient.dll deleted file mode 100755 index 720ebf9ed..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.OracleClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:314a0eabe221715ac452c7cc39089b51e95fde04a4f21761dcae043f529af86d -size 39936 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.Services.Client.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.Services.Client.dll deleted file mode 100755 index 64e136022..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.Services.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80f609548a9ea24d5c194e5a69d948fe204f21a241d15b6b4f882929e16a73d9 -size 20992 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.Services.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.Services.dll deleted file mode 100755 index 7adbf0c4f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e9b8c59aa08eb580079cdbe0a3f5aaf5175dc97b6f719506a88fe3e171184d4 -size 39936 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.dll deleted file mode 100755 index 8740597c7..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c44d04706a708407c5289ed225b5afb25206aebbece74133c575ba43dff4e58 -size 193024 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Design.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Design.dll deleted file mode 100755 index 6b26c7dc3..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Design.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b8cc471f954883c5b173b088f7534df2b212feb4ec150899a96ca7d54a6437a -size 145920 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.DirectoryServices.Protocols.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.DirectoryServices.Protocols.dll deleted file mode 100755 index 5b2c7b18d..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.DirectoryServices.Protocols.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be0fc9993294dc85f8b640ad6c5b0f9381b98c98fd0075ad41b788a015d7aa05 -size 40960 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.DirectoryServices.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.DirectoryServices.dll deleted file mode 100755 index 21b179b50..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.DirectoryServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ea0320dd6a9ce2a72e452ac39bae7f5549542a0736086eb5779deab821ea955 -size 72704 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Drawing.Design.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Drawing.Design.dll deleted file mode 100755 index 92d1d9838..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Drawing.Design.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:52f23218e1c70652eeda2aace3062425080598480249ceee432fcce253d662c8 -size 12800 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Drawing.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Drawing.dll deleted file mode 100755 index 6d82028b3..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Drawing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:10fd5f9c7e846597dc902721565fe73ecb2c28bbdb3532338e719465480ef2f6 -size 140288 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Dynamic.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Dynamic.dll deleted file mode 100755 index 7b771bd42..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Dynamic.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20f4a2772e3ab1868b74c780e82140ccd2107d7a0b67ac7097a7ba71c104f06c -size 6144 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.EnterpriseServices.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.EnterpriseServices.dll deleted file mode 100755 index 23acdb5a5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.EnterpriseServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a503b0361835e1bca720ff10810a3d2c3f940b4f1a22044dcef4df981c12f590 -size 35840 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.IO.Compression.FileSystem.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.IO.Compression.FileSystem.dll deleted file mode 100755 index 155d64c57..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.IO.Compression.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e47dc79fa563627ac47665b1c12e84cca70ba3a0511ba5e622ecce41e3c927fc -size 6656 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.IO.Compression.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.IO.Compression.dll deleted file mode 100755 index 39e2b3c2a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.IO.Compression.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6afd5d113510fdc41dafb5e2e97f2306edd842c954415161cedbac2cc54140eb -size 7168 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.IdentityModel.Selectors.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.IdentityModel.Selectors.dll deleted file mode 100755 index e1ac3c28a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.IdentityModel.Selectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae3c31cb8546ccd45583338db934cf6126c9911c2b2794ac7e61c31f4c577f0b -size 8704 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.IdentityModel.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.IdentityModel.dll deleted file mode 100755 index aff1d266a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.IdentityModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0d1803e02c073b7d08122064d99e8181d22a90a836ac3b8dbe26f7fbb518c33 -size 138752 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Json.Microsoft.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Json.Microsoft.dll deleted file mode 100755 index 9e24068df..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Json.Microsoft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82500f979119736e0b9e6b381a91e6465f91b033e6fbf37eb95f20bb775bb0d4 -size 13312 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Json.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Json.dll deleted file mode 100755 index 984cedb44..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:862ad38f55710c88b5fcd75fa2358cf7de0384dd6eb5c935890279dd629933a9 -size 9728 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Management.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Management.dll deleted file mode 100755 index 5610d336a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:245006b4dea9ac1244b437a3775ed3b52e1e5c32e32165f2ed5fb6113d397c70 -size 38912 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Messaging.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Messaging.dll deleted file mode 100755 index ec95be06b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:877a107807a6c05f1fcd6c0738825105b5d89e2a87c4a20fbe1c759ee626e52b -size 45568 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Net.Http.Formatting.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Net.Http.Formatting.dll deleted file mode 100755 index e2bc345df..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Net.Http.Formatting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d695096fce1eff031f13b4ca689d0d0b5961538934999acbeeddcef8e944442a -size 19456 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Net.Http.WebRequest.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Net.Http.WebRequest.dll deleted file mode 100755 index 32dcdcae2..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Net.Http.WebRequest.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d480aea7d03b22ed7fefc205c595792f488da2e501ba2c6d437ed2ccb263c193 -size 7168 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Net.Http.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Net.Http.dll deleted file mode 100755 index f840d72c7..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Net.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14cd23c05bba6303041d8de9a576f1fa944ca50a1f4d98358ad343d8be98d166 -size 30208 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Net.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Net.dll deleted file mode 100755 index e026f87a5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Net.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1d7b996114150d80d462eebec77b72240f4fa20e802cdc7f1433f8cd96aeb97 -size 30208 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Numerics.Vectors.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Numerics.Vectors.dll deleted file mode 100755 index bd449ea8d..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Numerics.Vectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e482bef161ba12bcb5989a901fb21e90162041827feed23f90e22f0474c82c43 -size 5632 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Numerics.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Numerics.dll deleted file mode 100755 index ae7d8c2b9..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b47b6661f2168b47d18e645b1b12548ba86dc5787be24862286a1f838b4be59 -size 11776 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Core.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Core.dll deleted file mode 100755 index 824927786..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f7ca64eb13c3576b50b63cef8130a717f3e7d774731ea8f15ae17a63d13f369 -size 22528 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Debugger.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Debugger.dll deleted file mode 100755 index c8929afe2..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Debugger.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e26bcf1fdcc249eab6d538f79432c0b9a478506c374d4eb0ed7bd521f610456 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Experimental.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Experimental.dll deleted file mode 100755 index 325b07a9b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Experimental.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7c56c7dc413fa222b1926c38f00222a7da1badee9718cc54c57450c01abe09a -size 9216 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Interfaces.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Interfaces.dll deleted file mode 100755 index 6898dacde..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Interfaces.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c12b395ce6caa4eee69a73f00fff7c66aa2a5695660c23ab241088e24c12c489 -size 7680 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Linq.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Linq.dll deleted file mode 100755 index 567b2185a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:595bd82812ec34b94afa4ad07258098e0fa456afde6f80586f3c670f3cb2b6c5 -size 72704 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Observable.Aliases.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Observable.Aliases.dll deleted file mode 100755 index 5492c7f91..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Observable.Aliases.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e20a9ea5d5b009058b4b41b5d8bbcc958a9b0606829b3466140859bce708724 -size 8704 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.PlatformServices.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.PlatformServices.dll deleted file mode 100755 index bc69ac002..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.PlatformServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57414c47cc7a8b002dd4f21a81bea522bce6993d8f71836352d35501aa0d173f -size 7168 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Providers.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Providers.dll deleted file mode 100755 index 0dccfa8f1..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Providers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41cd43ed2ea280662b871e7f00c6ccbc413d05d782b6f3cd21f2892a0bcf3047 -size 68096 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Runtime.Remoting.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Runtime.Remoting.dll deleted file mode 100755 index 07983cf3a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c82eec64bd4c842129becf8d7c8bf5493e00b00b359eb0787a6ab4bb394b0f5 -size 5632 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Windows.Forms.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Windows.Forms.dll deleted file mode 100755 index 8f761c230..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d6198c1332e4a2f199579566634273d995a770fe81023c42557875617071f93 -size 6144 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Windows.Threading.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Windows.Threading.dll deleted file mode 100755 index 971cbb95b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Reactive.Windows.Threading.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fef7bbe9630fb0cac28e79fcba6403b729922723f20e99516be6707b44e06114 -size 7168 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Runtime.Caching.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Runtime.Caching.dll deleted file mode 100755 index f03d95b7f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Runtime.Caching.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d4b23dc6a1bf423545575b98a5ed7830795ebe87473e2fc9ea7230ab3ddddfd -size 16896 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Runtime.DurableInstancing.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Runtime.DurableInstancing.dll deleted file mode 100755 index 4b639dcbe..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Runtime.DurableInstancing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2feb72896932b115c43379c3b84ba1ffb9a456139999c7b59411215a6cbabe6a -size 29184 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Runtime.Remoting.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Runtime.Remoting.dll deleted file mode 100755 index e70574aba..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6cae8b048e6ad843cbe754245493c83c6ce1a9b3a3aa3cee52db4cd0312dc5e1 -size 20480 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Runtime.Serialization.Formatters.Soap.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Runtime.Serialization.Formatters.Soap.dll deleted file mode 100755 index 293037e51..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Runtime.Serialization.Formatters.Soap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f303338dafa6113fce8b0d411c95e5bbfc9d6a9f49321df67cc61a9fb48531bb -size 7168 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Runtime.Serialization.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Runtime.Serialization.dll deleted file mode 100755 index 3aebe2f8d..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Runtime.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e279ef544156ac22b7b7a6f1cf8136c8921555e3677dd2909b1c44c8b1cd5c1 -size 38912 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Security.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Security.dll deleted file mode 100755 index bdf0cada6..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9a63d5fee59f2504c4b424c0bcef6cba26f58c0822b99df89a6edbd031e57f6 -size 41472 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceModel.Activation.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceModel.Activation.dll deleted file mode 100755 index 04ef50028..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceModel.Activation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11068d7488aeb17ad239f797216e967ae10aee3aebc827e15088a099825ae68e -size 7680 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceModel.Discovery.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceModel.Discovery.dll deleted file mode 100755 index 63bb2bebc..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceModel.Discovery.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7c7f43e289c68df96db8f9eea38233706dc1ceed1e70be2d7e892501c4360c0 -size 36864 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceModel.Internals.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceModel.Internals.dll deleted file mode 100755 index 2c12f6888..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceModel.Internals.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:edae786715d120534ae5d66942723030a2eaa7cdc07a196fedc59869527da4a2 -size 18432 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceModel.Routing.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceModel.Routing.dll deleted file mode 100755 index fd3657a00..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceModel.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fed98c0430e9f486281ccfb60c955c881ad66f6c27ccc4364a9a7f5366eda41b -size 20480 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceModel.Web.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceModel.Web.dll deleted file mode 100755 index f35d63230..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceModel.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3122bd3e254bd77d17ad63ad7061a30ea31440a3431d96d030b074eb7c851cf0 -size 39424 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceModel.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceModel.dll deleted file mode 100755 index a9d1cbb41..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8607a197d53e798f8db553f9bcf9b56353a89555f9036b6ce93ebfa7e8231309 -size 551424 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceProcess.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceProcess.dll deleted file mode 100755 index a19edf597..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.ServiceProcess.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d76d89b226f886c007ee6d3ded7e16c3e037b9d3bac9255cb295d6fd8e0d4008 -size 17408 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Threading.Tasks.Dataflow.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Threading.Tasks.Dataflow.dll deleted file mode 100755 index 4ea1a88ef..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Threading.Tasks.Dataflow.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5a3a8d78926413c4a39a95ea2b4969d329a914b02b078499f2040a0178db5d4 -size 22016 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Transactions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Transactions.dll deleted file mode 100755 index cc8486b86..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Transactions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc70ac58220952bcbf3a80d2d8a0215df0d462c1f5a16938709b230f3d4a3361 -size 16384 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Abstractions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Abstractions.dll deleted file mode 100755 index cc0048359..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Abstractions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5075b0145363b7e45a1b041fdbcb80e67aeddf3dcb4bea04f18ce3fedfafc76d -size 6656 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.ApplicationServices.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.ApplicationServices.dll deleted file mode 100755 index edd2d0c71..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.ApplicationServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dcef740e267ddee487319afeb2bb65a706421ce96e3781222eba59445c538544 -size 13824 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.DynamicData.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.DynamicData.dll deleted file mode 100755 index 8618bf102..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.DynamicData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b5c084082f2df92014d345537bdc4f1d877416a2120db464310f460f71ef143 -size 36864 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Extensions.Design.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Extensions.Design.dll deleted file mode 100755 index 1491f18b6..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Extensions.Design.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ea09d84819a14806f3a616af085b5b80903ce62aa0e18fab93a6366baff1feb -size 13312 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Extensions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Extensions.dll deleted file mode 100755 index eb37c5e78..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:baa7603b9decee107df353502c3cff1bd420ba4eac11c4e516fdab58761adabc -size 98304 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Http.SelfHost.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Http.SelfHost.dll deleted file mode 100755 index bae32f55b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Http.SelfHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d62561aefc96c3c852e4ba34ceffa9da1575ff9ab1bd172ff5c3513e875c061a -size 9216 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Http.WebHost.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Http.WebHost.dll deleted file mode 100755 index c18a95dee..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Http.WebHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c096053c7ecbc52145881c04663c55ee13e58d3db70788291decbe2df93164b3 -size 7680 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Http.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Http.dll deleted file mode 100755 index 9dcb7f105..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a0366e666f6fa6c2759a68b88a95c0db4cd019d9623ffa129b760d4bea89151 -size 56320 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Mvc.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Mvc.dll deleted file mode 100755 index 48d2d1675..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Mvc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b89b7488afdddfa20f75d7eb72398d30ff21eb996f62335aaf57d31c7cf24178 -size 100864 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Razor.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Razor.dll deleted file mode 100755 index 8117fee52..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f27acfd4469e514e19615b8cd4770114cca563bf8031df807802297064d4a43 -size 60928 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Routing.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Routing.dll deleted file mode 100755 index 40ffdc4c2..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:392ecf2fa81d60e2e9b46eebee1cacc68f5cdd32fb73975266a1a61c044a5ae2 -size 6656 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Services.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Services.dll deleted file mode 100755 index 04664d5fb..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72be2ede82989fa51f1eaf5ac56c9838ffafc0129d216dd37a512daf48038f85 -size 80384 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.WebPages.Deployment.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.WebPages.Deployment.dll deleted file mode 100755 index bcfa7da97..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.WebPages.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2dd91160769f23ee0ffa7fe7e48d961c76c0181bbc442bc097d3b53eba03a03 -size 6144 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.WebPages.Razor.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.WebPages.Razor.dll deleted file mode 100755 index ed6d0ddcc..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.WebPages.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23053ef0a76dbb6e07d7d00ccaf1961af81b0934f5716b522e26634d548496dc -size 10752 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.WebPages.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.WebPages.dll deleted file mode 100755 index 6bfa18eb0..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.WebPages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:690a64f6ce4d5fb465114c78eb7ad55ccab1f06d1ade331eb1aa9ea43a93b2ac -size 35328 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.dll deleted file mode 100755 index 9f1e56bd3..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:85b82ea5215471276157f9b310300fc6c6a4fdc6820e68551ac176014df80e42 -size 913920 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Windows.Forms.DataVisualization.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Windows.Forms.DataVisualization.dll deleted file mode 100755 index 3b614a192..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Windows.Forms.DataVisualization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e82eca4263c69bf4c02841cbbd81e246777554cd6cd07380ded1143ac670878 -size 101888 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Windows.Forms.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Windows.Forms.dll deleted file mode 100755 index f98b428f2..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c93e17749f507b677b811a572e7de7a93e99d2532273a14261eb20927211e0eb -size 751616 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Windows.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Windows.dll deleted file mode 100755 index f1015ae64..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Windows.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b6b28979fdba11693c2e72b7855dac112420e821693cdd9376b00eff9858079 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Xaml.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Xaml.dll deleted file mode 100755 index 3bef8218d..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Xaml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76f22594e51872517df1b9bfb9e3ae21c600d75472dd31eda70b09aa089e8c27 -size 46592 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Xml.Linq.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Xml.Linq.dll deleted file mode 100755 index 6aac055f2..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Xml.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d9b6bd7973c9d66659468e38bfb99c551fac1d92b71fd1c5701fbb54869aefc -size 22528 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Xml.Serialization.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Xml.Serialization.dll deleted file mode 100755 index cda7cfbbc..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Xml.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e73314602086cf1aac4d06177d8e3277a219d1ca9119f07d9baae4e3d83a79d2 -size 5632 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Xml.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Xml.dll deleted file mode 100755 index 51fa02da6..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1683fc53de62017fe812b9afeeefb8ac097d61a68bbb637714412594fcfeea1b -size 155648 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.dll deleted file mode 100755 index 450f3f28a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/System.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ddedcd3eea73801d789ffd69abd8cdedb5999b8c1824cf7f24620fac6a8b5eb1 -size 495616 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/WebMatrix.Data.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/WebMatrix.Data.dll deleted file mode 100755 index c1e8a1f43..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/WebMatrix.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0322b654cb25d0063d4f6a7fffdf1e61dc79a46fd2ba81879ec61e0d83590c9d -size 6656 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/WindowsBase.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/WindowsBase.dll deleted file mode 100755 index dd81a697d..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/WindowsBase.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9aba66826546888ae8b68e64db6254ad2879339928c8444533dc9b049ac29c10 -size 82944 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/cscompmgd.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/cscompmgd.dll deleted file mode 100755 index 865186fc8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/cscompmgd.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d35151028cd27cfcdf5ae987a93a870922fb4d87292afab85d129dcc42fd2958 -size 6144 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/mscorlib.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/mscorlib.dll deleted file mode 100755 index 4f435f25d..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5-api/mscorlib.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22fea24e2681a3f38a2ff4ad7fdbb9227c6e7b7e88e786bfedc0171456b9451b -size 829440 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Accessibility.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Accessibility.dll deleted file mode 100644 index 1f281b0c5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Accessibility.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38077916ef2a1fb4506b13d34370a940d47c288dd4a8d59c156cf4dd0485777a -size 12800 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Commons.Xml.Relaxng.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Commons.Xml.Relaxng.dll deleted file mode 100644 index 2f8bf7c42..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Commons.Xml.Relaxng.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:acefc14f5dfbdbd3cf26000a4e32722966f57d525cc0620dbb48ca3d291f14d6 -size 231424 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/CustomMarshalers.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/CustomMarshalers.dll deleted file mode 100644 index 9a8b37e58..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/CustomMarshalers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02921dffac128db4f713f4ccb2da029937f2eb20888406e1797d10e4dd56ab47 -size 14848 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Primitives.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Primitives.dll deleted file mode 100755 index d61a5ae27..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ecf18f218ef39cd6b48c37a3ddfa8b1762405c830d7dba28266efed219bdb5ed -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Registry.AccessControl.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Registry.AccessControl.dll deleted file mode 100755 index f3e5ef241..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Registry.AccessControl.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72bcf422d93dec8e365b867e0d01e2b51f302b7a755d39fe44689ccaf29eff85 -size 5632 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Registry.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Registry.dll deleted file mode 100755 index 5d5c09930..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Registry.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c963b7d5e10ece8b1c4749e9697c15dd8a0b4a63d9a2745fe2db6db6d8c86aa -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.AppContext.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.AppContext.dll deleted file mode 100755 index 6f1825282..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.AppContext.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21d59dc6c476cb5b6046d2aabb1c546d2316d037800babeac4b3bd593b2e0f24 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Collections.Concurrent.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Collections.Concurrent.dll deleted file mode 100755 index 5751d62f3..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Collections.Concurrent.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f4d1ab088c05cc65e1ca8b5cbcacf8847b879e3a26ef0eb4c4c05e17248f860 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Collections.NonGeneric.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Collections.NonGeneric.dll deleted file mode 100755 index 94952c4d3..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Collections.NonGeneric.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8fb21d60f04e06bbac36682cbc0d4d92fb2ad749af0a2a3380410dbf2ae29432 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Collections.Specialized.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Collections.Specialized.dll deleted file mode 100755 index 87f61fffd..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Collections.Specialized.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36561f5d20732afa1575b2c0dcf6a5f410476e1e82043a63dcc632bda1815195 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Collections.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Collections.dll deleted file mode 100755 index 512a03145..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Collections.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:94c00fe7de522736c664e1182d77ad7be14dafd77a988b700f546a53dab3788c -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ComponentModel.Annotations.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ComponentModel.Annotations.dll deleted file mode 100755 index a214ea20a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ComponentModel.Annotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42a1cd0d87ad65415e0662771edb761ab40e9d1bc9b7e845cfeb99dbda4da930 -size 6144 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ComponentModel.EventBasedAsync.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ComponentModel.EventBasedAsync.dll deleted file mode 100755 index 2eb2170ff..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ComponentModel.EventBasedAsync.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8117fb0c8e3395c1399f22d93ba4b0984034f96eb5daa2e323c3f9aff07deb1e -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ComponentModel.Primitives.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ComponentModel.Primitives.dll deleted file mode 100755 index f0d2c3e00..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ComponentModel.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bfc9bba844f4e1307e4852a9f8dd937ab535e87339c04f729d8416f837ee90f3 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ComponentModel.TypeConverter.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ComponentModel.TypeConverter.dll deleted file mode 100755 index e0c529830..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ComponentModel.TypeConverter.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d9afdaabddb41796adf22f3a1478baaf0e5694e7d778d7d71517994a6b0797a6 -size 6656 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ComponentModel.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ComponentModel.dll deleted file mode 100755 index 9454d5ce5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ComponentModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e2d221a9f4577828e29d53236149bf4bc624594aaef75d478d2b46ee482fff4 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Console.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Console.dll deleted file mode 100755 index 55c4048b3..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Console.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de8f340cc4b79a39d9082f66ff1267adbcb94a3deb4cf2486c90be9ff0a84b51 -size 4096 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Data.Common.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Data.Common.dll deleted file mode 100755 index a16a505b5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Data.Common.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e10fa60ffb1f2d0416e6d4b32ef4256514322859624d3b2fa4c16036daa64e9b -size 9728 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Data.SqlClient.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Data.SqlClient.dll deleted file mode 100755 index eb89df4ea..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Data.SqlClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e461922ab23a60a9ccc3a3298adff8f0d0136dc93d14deea246b664fc751fbb4 -size 6144 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.Contracts.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.Contracts.dll deleted file mode 100755 index b3546ed8b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.Contracts.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b07e1b3851be552690e01d37dd3b76dc7ecbcf4d21280be48edf5c095175e349 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.Debug.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.Debug.dll deleted file mode 100755 index 07cbecf06..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.Debug.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8acc99f91a463abe106f06f6f5d2bf5dd5fdb755ea5745c52872365122bc5e26 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.FileVersionInfo.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.FileVersionInfo.dll deleted file mode 100755 index b7d4a88c5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.FileVersionInfo.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18cbb06e7fa6268063f32ad6147581edc65c876ea7bb8bfedcda8167bc147efd -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.Process.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.Process.dll deleted file mode 100755 index 19cc70897..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.Process.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ee60191fbb93926a540556af13896a9bbffdc8f05712bc1a20f177dfae714ba -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.StackTrace.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.StackTrace.dll deleted file mode 100755 index 1c5143fa0..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.StackTrace.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2956ecf2b31d4a971e76d9a777c7ea60491c3bd108b7e6c1bd66578e3d19f0a -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.TextWriterTraceListener.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.TextWriterTraceListener.dll deleted file mode 100755 index b03de9763..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.TextWriterTraceListener.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30751101f4f31bd3d3c8023a412deada10875c0735ac6f31596e112d9f8fb7d1 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.Tools.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.Tools.dll deleted file mode 100755 index f33a83738..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.Tools.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff2f1df9e1feb016a595424f48af1c1820bda4630680e5e1b6f178ab6bc83da0 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.TraceEvent.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.TraceEvent.dll deleted file mode 100755 index 931ed645f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.TraceEvent.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d71212943eece9dbf5bd6c464b01ad20677dd233dabeea7a8035c2f54e83654b -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.TraceSource.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.TraceSource.dll deleted file mode 100755 index 01eb2646f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.TraceSource.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91efe8bdfcffabac4c71df60ac8f515668b41fc70d695835847b8810895b282f -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.Tracing.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.Tracing.dll deleted file mode 100755 index 7500ed9a2..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Diagnostics.Tracing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:263dfdd40d6701753a843fc13ccd7303e60e53ffbdcb1088fbbf240298edfd48 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Drawing.Primitives.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Drawing.Primitives.dll deleted file mode 100755 index 8e2c066a6..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Drawing.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6188e64b0802a7a8805f63689f4a1f70f45d8fb85ce5d5338dfdb4ea599aab7 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Dynamic.Runtime.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Dynamic.Runtime.dll deleted file mode 100755 index 5a8af43b6..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Dynamic.Runtime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:312f44cde35ee6b4327e1c0d7eb13e13ff400b98cdc2f1df4c2dbf652db141b3 -size 5632 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Globalization.Calendars.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Globalization.Calendars.dll deleted file mode 100755 index 938a32b8b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Globalization.Calendars.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:628e49f6a8cf333f0af9e702d00c720ed248c9a3332f750cb2fcfbb095f46ab1 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Globalization.Extensions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Globalization.Extensions.dll deleted file mode 100755 index 732f9f128..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Globalization.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae8b233a1265ad27479389ce76936f5664523bdb46d9ba1e94a328ddf6832e03 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Globalization.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Globalization.dll deleted file mode 100755 index 2b060cb3a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Globalization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:662e1fe6113809b666c41ae61ec210bd4afef58c090cc2add92c94154a26550f -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.Compression.ZipFile.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.Compression.ZipFile.dll deleted file mode 100755 index dcfa03b79..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.Compression.ZipFile.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d505ea219c25aa42a89647bb15ccc172a669ac79d46345b7ec7ef7e3a91aa88c -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.AccessControl.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.AccessControl.dll deleted file mode 100755 index e95a3f775..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.AccessControl.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd777f42f84373a1fbf0ea5057574184749d29db21ad671001844685d0c8c1a8 -size 5632 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.DriveInfo.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.DriveInfo.dll deleted file mode 100755 index 7167768f3..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.DriveInfo.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64e662b61483b1e1804eb78b70b62051371da6c5de0c0f193771173b97ed8b06 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.Primitives.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.Primitives.dll deleted file mode 100755 index e54adcfe2..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fafef8c0fce6a5f824880453e99060165b7612fa55d3d339a83d2111012d1997 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.Watcher.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.Watcher.dll deleted file mode 100755 index 9d38fb401..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.Watcher.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6aaff752b377337f4437629fe8fe6d79fe6bea2d84082f3e0f8eefb9cd7b352e -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.dll deleted file mode 100755 index f846c6ac6..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:da0940530dffbfe9fe6a5962b499b0daed10ca09c231930e8fc897f5330710fa -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.IsolatedStorage.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.IsolatedStorage.dll deleted file mode 100755 index f4eebb935..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.IsolatedStorage.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6490e1e1c18d44835a1e9190abd32b73744c250a71f7c9eaab78dbc39a80a97 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.MemoryMappedFiles.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.MemoryMappedFiles.dll deleted file mode 100755 index 6d32fc521..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.MemoryMappedFiles.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eac40bd86fcc58f0cc8ddde8fd2aa273031fb27496a0f9438e428f0e450914fe -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.Pipes.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.Pipes.dll deleted file mode 100755 index 63519cff1..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.Pipes.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ffe28de895b19cd48fb88245a3247b389970e62792297977fbf203278beb6ef6 -size 4096 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.UnmanagedMemoryStream.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.UnmanagedMemoryStream.dll deleted file mode 100755 index 831a777dc..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.UnmanagedMemoryStream.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6067b6388a1fb7e0d47a51cc3c1e2b04b87f5025c404fe8fd2770808bd863ec8 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.dll deleted file mode 100755 index e2d4257db..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.IO.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c4108cb7ebbb288d1de785d580db6574f48be7618d1153e82eccef8aebb61ecc -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Linq.Expressions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Linq.Expressions.dll deleted file mode 100755 index 05936d034..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Linq.Expressions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91aea8c6652e052bfec8ba5a4eed91a4d424921dd53c0606ab3620bacb5e08ba -size 6656 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Linq.Parallel.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Linq.Parallel.dll deleted file mode 100755 index 0024df3cb..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Linq.Parallel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b458212adbfe1f2644ab0837cfa31297733c1d0af15718767f4986346a2935f9 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Linq.Queryable.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Linq.Queryable.dll deleted file mode 100755 index b8e08ef71..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Linq.Queryable.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7a37fe6c1c9c1716aedd5e93f3768c16ef78d96a52622960f1c396e1b3fb165 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Linq.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Linq.dll deleted file mode 100755 index 999fb0b88..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:61781d47caedf8005848828abced6399758244e78df2c643bc71552ceb31c0d3 -size 4096 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.AuthenticationManager.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.AuthenticationManager.dll deleted file mode 100755 index 03d195f45..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.AuthenticationManager.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28332ac4638e8e0a4a0fbf1f8cf7f007b1152aa57fa4d1373eaa2d862433fcbe -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Cache.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Cache.dll deleted file mode 100755 index 69f83689e..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Cache.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:336d6cd56d78dc97a65a4f999d2498e7a4a58cf9e1c02247f44e433f4bd0b51f -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Http.Rtc.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Http.Rtc.dll deleted file mode 100755 index 3c3754130..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Http.Rtc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cffc2dd5c81e8acd65dc093ad72a771950d1152556c96613ca729782bc21e330 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.HttpListener.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.HttpListener.dll deleted file mode 100755 index 2db9a9e16..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.HttpListener.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f547e7c407379b45774bde0f538a05deacaabac0219cf2c66754c95371affee7 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Mail.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Mail.dll deleted file mode 100755 index a0ebbd7b8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Mail.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e612c7aaae3f072106a62c7194169af8eafd89884899f7b29fc241bb95ee9729 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.NameResolution.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.NameResolution.dll deleted file mode 100755 index 5ee785a06..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.NameResolution.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0fa3e0f3c298a853ed275a40ec2a34da9f5655077cd031dc3075b93472fd575a -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.NetworkInformation.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.NetworkInformation.dll deleted file mode 100755 index 3854653c1..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.NetworkInformation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89d31821d201378aebc741fc0339ad34287cc821cf6f448b259c4b60d18e8599 -size 5632 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Ping.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Ping.dll deleted file mode 100755 index b45010c24..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Ping.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f3af7546e3ecca213b9dd88880501788f9b19ccf13fe681e1d72fb8feb81c1d -size 4096 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Primitives.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Primitives.dll deleted file mode 100755 index 4c83ccfd8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:793d91aea6911134d73151e81fe9868d68d01e1960e84d451fad53394550e856 -size 5632 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Requests.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Requests.dll deleted file mode 100755 index bea85508a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Requests.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b1179f9dceb80b46e396330fc0b70ebc16b872498e141647c2bc3b10a84416a -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Security.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Security.dll deleted file mode 100755 index 86207849e..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9fee979b315e2933193b730a4450cb8c30832725367308265c91dee3ed484dd -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.ServicePoint.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.ServicePoint.dll deleted file mode 100755 index 252866103..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.ServicePoint.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:071eac5408a5a8a78d949a132a3bc3a926ea3b1bd553bb85e7f946e3249601ac -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Sockets.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Sockets.dll deleted file mode 100755 index 073d2c8f4..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Sockets.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1333ed119afc6431fe36c0463bd68cdb4b822a8cb386fa8e8b19f65415d7ef5b -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Utilities.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Utilities.dll deleted file mode 100755 index d1c20ed34..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.Utilities.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22bfe1d6e8df6935b1c848715a9ae894bb33b239a158b313866dd17094187199 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.WebHeaderCollection.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.WebHeaderCollection.dll deleted file mode 100755 index db712a658..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.WebHeaderCollection.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0a5c10b3678dcf43a07bad958c5a4c175c2a2040591d6c7b3f162a05c6be726 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.WebSockets.Client.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.WebSockets.Client.dll deleted file mode 100755 index bced53dfd..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.WebSockets.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:94e3303942342a38fd29b44ee2ba5223cdf311fb7ee613684b932cd596ce8e4a -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.WebSockets.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.WebSockets.dll deleted file mode 100755 index 6e703b166..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Net.WebSockets.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:400088263656217475f07a9a8a51e681d1bb75c347405b672decabbda3ea29e1 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ObjectModel.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ObjectModel.dll deleted file mode 100755 index 680771fc0..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ObjectModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b53e91dea97bb30d1562fbbc328103a742056574c9a421262db26413a118bc5 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.ILGeneration.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.ILGeneration.dll deleted file mode 100755 index c19b41c56..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.ILGeneration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c062cf871c125ca000930fcd2729afa111dff71203c500e000a0934a90d7a55d -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.Lightweight.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.Lightweight.dll deleted file mode 100755 index e0f35eaf5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.Lightweight.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:08924131f3a0e433ae7eeb7fda17e6fc0bf1df283ed935fb5363304d15db05af -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.dll deleted file mode 100755 index a130071a8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a150682dab01b4aaba3a3764376f6a827f017f0c899a8b80a2f3677b8c8833a -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.Extensions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.Extensions.dll deleted file mode 100755 index 5425cdd1d..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff87f7ef817b3d5ccb4505a0a296e361e22a0c6c85e216c5b39ca6b9d1add77d -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.Primitives.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.Primitives.dll deleted file mode 100755 index aa0da2f86..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd85a9c9d4a35485558f8f18d21a57d7a1ff87f4c318f96041733059f3ab1880 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.TypeExtensions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.TypeExtensions.dll deleted file mode 100755 index 1997fcd83..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.TypeExtensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b815bdca6afcecca021cd4b97abbcdc424a7e4b62f122fa6461b0d1beec61af5 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.dll deleted file mode 100755 index baa673a88..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Reflection.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5aff24063e185dfde3c988f068154059ca6fb303fd3183587373df91388df8c6 -size 5632 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Resources.Reader.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Resources.Reader.dll deleted file mode 100755 index 5d859469d..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Resources.Reader.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4491b52b947cce0c71761f9ef92f58dffbc3abdaf1e9795f813b076fff6fd333 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Resources.ReaderWriter.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Resources.ReaderWriter.dll deleted file mode 100755 index 1d931510c..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Resources.ReaderWriter.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99fc4a443302268d3b01e95abde264aa7c772327aff5e8ad9150caca07c8578c -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Resources.ResourceManager.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Resources.ResourceManager.dll deleted file mode 100755 index 64960f06b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Resources.ResourceManager.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3077ef49a12e491102e8630e8e419ef255d32a767024097e1c7377804cbdae0e -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Resources.Writer.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Resources.Writer.dll deleted file mode 100755 index f7563a2e0..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Resources.Writer.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd3ea287d61f2ca9e36639b2fcf1863ad96b23d6cd797e4a2993d64b7bcfdcd5 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.CompilerServices.VisualC.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.CompilerServices.VisualC.dll deleted file mode 100755 index be4af110f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.CompilerServices.VisualC.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e07b95b1a6374fa2a4c71690213509a8cbe0f9a2a57606dccb27bff1f5f26519 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Extensions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Extensions.dll deleted file mode 100755 index b2039ab7b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:13525a02ae75462cc3817721457789fbd5a5e58c9ebf6e1d903b6b52c846e4c6 -size 6656 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Handles.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Handles.dll deleted file mode 100755 index 8f1a20560..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Handles.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b6cf0896b399ec99b3b56757a6c818c7abbe30b9b93267896f5fae54dae4cd2 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.RuntimeInformation.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.RuntimeInformation.dll deleted file mode 100755 index f21049139..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.RuntimeInformation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40cd19bdfcc27dd36b75224162cfa5154c1dbf6248333fa751ead8adeff269c3 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.WindowsRuntime.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.WindowsRuntime.dll deleted file mode 100755 index e2466e877..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.WindowsRuntime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:933d853950379c3f8e5e3ecf54b692599537f95e227320996e4c7477239e9ad9 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.dll deleted file mode 100755 index a4b5c4790..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:06d2f1bf3cf353fbe7c2a6b7d9ae2a77e712eaf7be2257cd01538d7a44cb2d8d -size 7680 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Numerics.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Numerics.dll deleted file mode 100755 index 43f776d85..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42c072774bfbf30cdb9fe47a23a1ea1d51fb04d2b4396961dfc286ea81aaea02 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Formatters.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Formatters.dll deleted file mode 100755 index c5246c00e..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Formatters.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ab9329d5571c53175cf96be3a65b62ef048196579ed7dff5fb3fab06591d4a38 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Json.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Json.dll deleted file mode 100755 index 16f51cf5a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee5bd9cd1edaee9a7919cbecdec55d23094c3d03c6049f3bbdd70e3dac14bd91 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Primitives.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Primitives.dll deleted file mode 100755 index 360b181f8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:849e8b2591a3c28a9ffe9ff50d4d06453ce3b270083f47b3d8703ec88630b696 -size 5632 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Xml.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Xml.dll deleted file mode 100755 index 2a3df15dc..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42ab3a4bdde68f87b754abb34af78009349be135bb96c3923f33caa2a89b02d5 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.dll deleted file mode 100755 index 20ec5e9bb..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Runtime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c057e1b56160025b948ef0b4b2980a98ca93ef49a5d2f78a279d079e1d7d9623 -size 22016 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.AccessControl.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.AccessControl.dll deleted file mode 100755 index f7316a34f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.AccessControl.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e354dc2d4c66071b36e8005e1f178d9ed82679aca4d7fa91d50f4d4c28d755a -size 5632 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Claims.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Claims.dll deleted file mode 100755 index 8c10f1e0f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Claims.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de37aa2802a659d99b2e40959a73a97b7f541283cf825b869bac01d4d21d7409 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Algorithms.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Algorithms.dll deleted file mode 100755 index d15092632..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Algorithms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:736bffff3a1bd3981833abf793826a7b6e54c83ec4ce40f7de7f0b31820f3f95 -size 6144 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Csp.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Csp.dll deleted file mode 100755 index fc08637ea..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Csp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5942c805a45c40d7673f713f620083abb47a723417eb497739d3a1ac0f879258 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.DeriveBytes.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.DeriveBytes.dll deleted file mode 100755 index e7512ba02..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.DeriveBytes.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82797662651d9c77fd23f369555b8d0ea5adf9aac04cb6785768288f840b5ada -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encoding.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encoding.dll deleted file mode 100755 index 619ce04ca..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encoding.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba58bca1e32aae58145a20bf15b67c0eb7b96d56f2dc419ea9131ab00e1b6415 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.Aes.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.Aes.dll deleted file mode 100755 index 8ca07a64b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.Aes.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8827414767dc78d032e92caf620bf743e3dede67bbd145935e7e57e93ea4553b -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.ECDiffieHellman.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.ECDiffieHellman.dll deleted file mode 100755 index d94185ba9..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.ECDiffieHellman.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb3b87b189eb332695f7c976db23884cd9e6dafc1c85c11ded4415296f848fa1 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.ECDsa.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.ECDsa.dll deleted file mode 100755 index b11bdd630..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.ECDsa.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e72099f69bdd5dc9e057ff4ca3c521bdd32c55613fded02d3e14f1c3406d37a -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.dll deleted file mode 100755 index 31c995e85..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50c94403c539664ce962658b2e335eaadb42e2ab5b91afd3c5c6d34f8a12adba -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Hashing.Algorithms.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Hashing.Algorithms.dll deleted file mode 100755 index b7e58e00d..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Hashing.Algorithms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:222ce7be0ea905a53ba10ac76a24c9eb3ac0494ad48a83c0a1462c3c20b9d135 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Hashing.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Hashing.dll deleted file mode 100755 index 9d2ec3b89..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Hashing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e2ae83f75eec5fa99df393a4fb6cc13c22da6cfbc2296f5bd60edf4a5bffbb4 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Primitives.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Primitives.dll deleted file mode 100755 index a5424c90b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:269b0ca96a7cf92cc56c2fd8a0849c26ed912dd6c7bdd07c59b00976eac8fcf3 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.ProtectedData.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.ProtectedData.dll deleted file mode 100755 index 26a3707b3..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.ProtectedData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e9c76559acf84ff7b1fe2d2183b9625cea2d4b44d53ac1f04f9e007daf3b03d4 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.RSA.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.RSA.dll deleted file mode 100755 index b6bc56bbc..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.RSA.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c75b6bd23375a62216fa12dcb633a3847534f4314cf1f3022be1007e5499e28d -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.RandomNumberGenerator.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.RandomNumberGenerator.dll deleted file mode 100755 index 889dd4477..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.RandomNumberGenerator.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f536bfc046095caf235cfc702800d3b9bf24547084d9f520f03056c80aed1db3 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.X509Certificates.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.X509Certificates.dll deleted file mode 100755 index b250ae90f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.X509Certificates.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e20e85011e4d1f1bb6d83768ba2400e703a85e3948a3d5a2904b80a5bc2fdcc1 -size 6144 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Principal.Windows.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Principal.Windows.dll deleted file mode 100755 index 6175f95cb..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Principal.Windows.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73534745a7ef6ec8008263993d62fd82e2c0ca537af02d7adad866846f03a51d -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Principal.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Principal.dll deleted file mode 100755 index ef19f6daa..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.Principal.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d1fe2d68f59d40a4d832504277e26bea9fd1008303edb72dc7eabefc4cf32d08 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.SecureString.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.SecureString.dll deleted file mode 100755 index c27de770d..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Security.SecureString.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93608df9f07bc31b76b50b5c9bbabcbb5318163975cc8f9d6f5a60be05771b33 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ServiceModel.Duplex.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ServiceModel.Duplex.dll deleted file mode 100755 index 2b786eaa0..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ServiceModel.Duplex.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c772f86f4f1e84662152344b4a8647b6da82aeaa2ccf1941b8e64d34039d8d6 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ServiceModel.Http.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ServiceModel.Http.dll deleted file mode 100755 index 54fa39c92..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ServiceModel.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c08f5686a3e581add444875e0d7c299b8928e3f98556bed78ab75bc08061d2d -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ServiceModel.NetTcp.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ServiceModel.NetTcp.dll deleted file mode 100755 index 7559e59f8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ServiceModel.NetTcp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59562d37b24364dfeb886e37629d32d08caf160832c0cd48cf20266a09eeb59b -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ServiceModel.Primitives.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ServiceModel.Primitives.dll deleted file mode 100755 index 43a99f991..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ServiceModel.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf8b5fd4e892a2bad40909dbc5c15ee729e9eec830b67ac052a3ec6b94fab780 -size 10240 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ServiceModel.Security.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ServiceModel.Security.dll deleted file mode 100755 index f77865fac..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ServiceModel.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b44707098a4f052a063a947cd1482c6de42a08fa0d17ae847c35037ef694a109 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ServiceProcess.ServiceController.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ServiceProcess.ServiceController.dll deleted file mode 100755 index 4f86bc10f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ServiceProcess.ServiceController.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f66818f4cd48acd9351d58a59bb9d1498b7e03fa1d3b6e50ce34cae6148d1d69 -size 5632 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Text.Encoding.CodePages.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Text.Encoding.CodePages.dll deleted file mode 100755 index 8c47acfea..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Text.Encoding.CodePages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd45ae1c2342978d0d5115f49f0bfe1a855c7c41779361f9cbc28c31ad160311 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Text.Encoding.Extensions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Text.Encoding.Extensions.dll deleted file mode 100755 index eb78733ea..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Text.Encoding.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dfcd01c9b609d0b9d1cb1b0cb4cbdb07415292d2f3c1a57d816bc49c7e643868 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Text.Encoding.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Text.Encoding.dll deleted file mode 100755 index 368f2a29a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Text.Encoding.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a26b2a2564c872c242cf36907bcbd5aadf0350fc17f6e5cf1836294d433b2505 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Text.RegularExpressions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Text.RegularExpressions.dll deleted file mode 100755 index 2c6031927..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Text.RegularExpressions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f614cc87abed9ead104ce142cc5ddfc3fc64cb2424e835016cd45860f047c51c -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.AccessControl.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.AccessControl.dll deleted file mode 100755 index 96d9990cb..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.AccessControl.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f09dbd84167c90ddc7fea9b18832781942d01da9a193d86b137600ee25b0561 -size 5632 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.Overlapped.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.Overlapped.dll deleted file mode 100755 index 0af3f61c9..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.Overlapped.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb13340cf72614a725afc8d93cdf98052ad4c8dc85fbd222e68b9da893b88693 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.Tasks.Parallel.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.Tasks.Parallel.dll deleted file mode 100755 index 48efc3a71..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.Tasks.Parallel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a9dcbd5a3b6d0737395023d032db270f915381f9901f4dbc0fe111811893061 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.Tasks.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.Tasks.dll deleted file mode 100755 index 0f69e2cdc..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.Tasks.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1af5b9e36367c94913ffec8d880d9613f671b6d40e850db5e0482e2ec9136c08 -size 5632 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.Thread.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.Thread.dll deleted file mode 100755 index 33518d181..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.Thread.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d303ca5ac9f2ed29abf5738cce3d49ec360bbd2087e80f91c357f5cb64493758 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.ThreadPool.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.ThreadPool.dll deleted file mode 100755 index 216f00406..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.ThreadPool.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eed57206b648eb4c47289b17a9a4b2db852a0b93eb160f57a943d061cde84ca8 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.Timer.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.Timer.dll deleted file mode 100755 index d8b9df2ef..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.Timer.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e4faef06dc0b413a3c31db4a13bbaa9f02388242e78b56f86f46d0e7ca1d240 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.dll deleted file mode 100755 index 4052fd63d..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Threading.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76212a15859dad4c7f69fac2bdadce26a379e009d42d78a098960e111647df36 -size 5632 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ValueTuple.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ValueTuple.dll deleted file mode 100755 index ab8549725..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.ValueTuple.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4a5887f5ee33e62e0147a00090661f24564e15fd455c842c3578405d0b1d453 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.ReaderWriter.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.ReaderWriter.dll deleted file mode 100755 index 10b211f2d..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.ReaderWriter.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc0f6366022916eaa428bd34d32f14a47785fde29474e3bf9c9e9949ed2da4a2 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.XDocument.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.XDocument.dll deleted file mode 100755 index aaf1e4f8a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.XDocument.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b91d4fde13a591aa3f6c8dca04f893cb69c81a930f611f3447879e7fa5d373e6 -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.XPath.XDocument.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.XPath.XDocument.dll deleted file mode 100755 index c4f130e14..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.XPath.XDocument.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:35edcdc0e6cb9a247138e90493a90dd65200f83561e9d3b5f64af48b96fc0d62 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.XPath.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.XPath.dll deleted file mode 100755 index 2a97346a4..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.XPath.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4939decbbff9e70d21e3c2adfb14df49a6e94e554c211d53e2d2b0378a6dfeec -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.XmlDocument.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.XmlDocument.dll deleted file mode 100755 index a4a48d51f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.XmlDocument.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4bfe0ce7f99b319d79dd48d7b74ea51b4875a90a5273f3eb19d58494897a3fb -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.XmlSerializer.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.XmlSerializer.dll deleted file mode 100755 index d7961229f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.XmlSerializer.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8cc223efdd551d548a548e97f3301f316820b08bd18fac80b148978592276fec -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.Xsl.Primitives.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.Xsl.Primitives.dll deleted file mode 100755 index 88efd713c..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/System.Xml.Xsl.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f86a09515e53eac33bccad037fbbb6bc8ce94b8530062c575d31ca454e5e418 -size 4608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/netstandard.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/netstandard.dll deleted file mode 100755 index 8e12413c6..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Facades/netstandard.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe949f1b2c26fd594509f289478ac8a1510eae639b27c0f4127d18d397ea3100 -size 89600 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/I18N.CJK.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/I18N.CJK.dll deleted file mode 100644 index 0c74cbbb8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/I18N.CJK.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc0d75a484a23716084be32c70b4669c15ac984c8ca57b8766917579ad763315 -size 679936 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/I18N.MidEast.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/I18N.MidEast.dll deleted file mode 100644 index 6e063de93..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/I18N.MidEast.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4eb81f05a1bb04077bf22cf14de97f792baa37e9ae69ce6940d74b49845e5a00 -size 32256 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/I18N.Other.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/I18N.Other.dll deleted file mode 100644 index 3db27e742..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/I18N.Other.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4dfdc87dde21bce3b918dbea485edc8ea0b77d1764aa05ad88b20ebcb4592e3d -size 36352 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/I18N.Rare.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/I18N.Rare.dll deleted file mode 100644 index 041f2792e..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/I18N.Rare.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12f8857b8275ede4205cfebbf2c14220a188d921dff630cc4c1ed32b350d4b96 -size 192000 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/I18N.West.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/I18N.West.dll deleted file mode 100644 index 9b9abbc31..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/I18N.West.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bda25073b142b7ecffc84d2d904832a5f308a396fa03066b530fa7a710346378 -size 72192 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/I18N.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/I18N.dll deleted file mode 100644 index d0a0e3074..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/I18N.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7b1751c0b83ad11befc6089275d6b94062633f51da242273de92d8d51b70a41 -size 39424 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/IBM.Data.DB2.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/IBM.Data.DB2.dll deleted file mode 100644 index 80ca4e06f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/IBM.Data.DB2.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d36c975b32a20f9f4822e4b3c8dc35f686d6a4f421e9ad9f8950b35be90f2ebf -size 72192 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/ICSharpCode.SharpZipLib.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/ICSharpCode.SharpZipLib.dll deleted file mode 100644 index 3867e2457..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/ICSharpCode.SharpZipLib.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1ce584cb5061d6acdc50018af5ed6c8f782e3302d07ea83990772ed8f7c08ec -size 124928 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.Build.Engine.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.Build.Engine.dll deleted file mode 100644 index b75fd38d5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.Build.Engine.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32b73c919bc1686e43ca2f1c1ea2075baef482d77f80cbaba49968acedd7023e -size 236032 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.Build.Framework.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.Build.Framework.dll deleted file mode 100644 index fdf8e1b29..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.Build.Framework.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d41b8feb08b065707f8611313417256cfbec4ced45f575c334e060a1c4c2893f -size 32768 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.Build.Tasks.v4.0.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.Build.Tasks.v4.0.dll deleted file mode 100644 index b7b0c9067..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.Build.Tasks.v4.0.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:542b0be634577e9600c24bd5d3a10f0bc5d3e9606491795b54ed8ad4de082bef -size 174080 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.Build.Utilities.v4.0.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.Build.Utilities.v4.0.dll deleted file mode 100644 index 40d922a0c..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.Build.Utilities.v4.0.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b835963f60602ee8df5b1ff223788743760e79ed25c4e546ec6180777e8b192 -size 56320 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.Build.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.Build.dll deleted file mode 100644 index 59b07915e..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.Build.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:632c4237c5f0b93df7efabc3080eff26546462305b9281f602355e39aba85526 -size 280064 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.CSharp.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.CSharp.dll deleted file mode 100644 index a5773519c..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.CSharp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e71b7b997b3eaada1810000ee4284f00d57096f8455266d6bbf8969dc610b19 -size 300544 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.CSharp.Scripting.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.CSharp.Scripting.dll deleted file mode 100755 index d6fc08e33..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.CSharp.Scripting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ae612ab02b6d0babd91d6664ead7702d1ad47f1a0dd918d8a3e4f7080d25585 -size 31096 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.CSharp.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.CSharp.dll deleted file mode 100755 index 2c01257d7..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.CSharp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0144eb8f2bf7a73350590ab6e46c549960bb0c791cb186be49b5a4ed290adc3 -size 5218168 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.Scripting.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.Scripting.dll deleted file mode 100755 index 9878502d3..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.Scripting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8e23b9d08c502ed0f1138854dabf362893aa707590fd053b5dac6ccfdaf6923 -size 133496 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.VisualBasic.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.VisualBasic.dll deleted file mode 100755 index 7e92de2d7..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.VisualBasic.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db50ae8e4a8bff665af20ef643763cc9d56249551440260d7a93fe7551c2c67f -size 5171576 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.dll deleted file mode 100755 index a762bf1f7..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f46392911ce9740de23f4cf4bc4a526d2633eacb6d3dbd90d18048b5c2d1d39 -size 2496376 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.VisualC.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.VisualC.dll deleted file mode 100644 index 8cefbf9bf..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.VisualC.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:faf8ca3cb87f27f49e2bdc081c63f443fa9164b979b55ddf43fab832985716cf -size 11264 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.Web.Infrastructure.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.Web.Infrastructure.dll deleted file mode 100644 index 3877e34a5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Microsoft.Web.Infrastructure.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d4e756527545ee2deada56ec255c6c433d15cf9237bd8cbe2c12cb01451edb5 -size 16896 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Btls.Interface.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Btls.Interface.dll deleted file mode 100644 index 58b5012ad..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Btls.Interface.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa07a66bebf088cba7c34b0821c56eac9b9bbe39ead30f2c862d29f99b881c0f -size 22528 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.CSharp.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.CSharp.dll deleted file mode 100644 index 1ae4f3c79..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.CSharp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8ae2f11fcfd1de8dbd5efd26cab4338f30048328c6d874045b6f344d12c4e7b -size 1354752 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Cairo.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Cairo.dll deleted file mode 100644 index 232cf84bd..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Cairo.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c3bbfb9c6520d68eae80611c84e3178cc71d5175b63a43c6cc4b1a83fa3c460 -size 62464 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.CodeContracts.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.CodeContracts.dll deleted file mode 100644 index f9e136c40..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.CodeContracts.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11bc150ef7dc4a475b3dddc6e464780c0221fa921282660060ad55bbcf6e9891 -size 660992 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.CompilerServices.SymbolWriter.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.CompilerServices.SymbolWriter.dll deleted file mode 100644 index ca7cbdf57..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.CompilerServices.SymbolWriter.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ec053bb41a645f3cf64a31f7cd189c36f02dee8f14bc0d14b76a0a9946a6dea -size 44032 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Data.Sqlite.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Data.Sqlite.dll deleted file mode 100644 index 8cb4c423b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Data.Sqlite.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ada04dec59c366f49378cf3ce6da279cf1997ac5de777d17dfd95b67b5a2c7c7 -size 166912 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Data.Tds.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Data.Tds.dll deleted file mode 100644 index e298ed465..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Data.Tds.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ae8ef64d246d74e96b04e0c7b994012820f6d781a050196ee29effb65b93dfb -size 100352 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Debugger.Soft.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Debugger.Soft.dll deleted file mode 100644 index 630e819aa..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Debugger.Soft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2729b3f9b086f78a113bea78e7c1df6d3266f31cfaf3c8876b63854953e14da2 -size 160256 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Http.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Http.dll deleted file mode 100644 index 30f19926b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b96c42a802ad1d73bf3616c12fba78ecaa7025963ddf2061eb5c319107215080 -size 27136 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Management.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Management.dll deleted file mode 100644 index 69bdcd103..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19f2dc7746c9ac600a73e4572ed0ab788a2369b511ec59c8d913481b9ca358ea -size 13312 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Messaging.RabbitMQ.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Messaging.RabbitMQ.dll deleted file mode 100644 index 63a04d977..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Messaging.RabbitMQ.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f4f818a729f4b08a579a9a7e37a83063b614f3ef825996d5510ac7690be60a6 -size 34816 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Messaging.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Messaging.dll deleted file mode 100644 index 769804709..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d03356f0fa9c87e43150720035c208eb79332f34dcce699f7a5ff044464fe1c1 -size 34816 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Parallel.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Parallel.dll deleted file mode 100644 index 9c6a7c260..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Parallel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:081dbfde1426446d660ceb70802971d18d58574ea5a25d1d0a965209d769d81b -size 29696 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Posix.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Posix.dll deleted file mode 100644 index 8380a87e1..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Posix.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:71b816db8f70a78f2db6ac9bbf5d28aa66cdd251c01b9da66fc3184bb0b0ceff -size 212480 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Profiler.Log.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Profiler.Log.dll deleted file mode 100644 index 46e741b19..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Profiler.Log.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8e77d62b69e0fc00b212b995a943797b6a2d69737e82be6dc18510768ef5a87 -size 70144 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Security.Win32.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Security.Win32.dll deleted file mode 100644 index f555388c2..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Security.Win32.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62de7cac51f30c760c39724fc8f437fb67d5381824bcd35f7ed5f655a34b02c0 -size 18432 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Security.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Security.dll deleted file mode 100644 index c39d1e799..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea4bd65d2261f1c5f3c22b592734b3079270365e827f4ca785853b9c38b291bd -size 314368 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Simd.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Simd.dll deleted file mode 100644 index 31d492f84..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Simd.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a21917597c63580bf1b61d72bc25470c02db980e4e7944b3d1fb4a00044ae603 -size 67072 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Tasklets.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Tasklets.dll deleted file mode 100644 index 7796e9cc4..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.Tasklets.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb2b392cf61e9c087ca675ad20941891d0859ab79a615502194c3a8571f5d76d -size 11264 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.WebBrowser.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.WebBrowser.dll deleted file mode 100644 index db8880016..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.WebBrowser.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:162bb5bdf3dfe9e8a6efb36db0de18fae43acbe99841bae92c487716b4771a09 -size 166912 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.XBuild.Tasks.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.XBuild.Tasks.dll deleted file mode 100644 index 57eb89681..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Mono.XBuild.Tasks.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de470b4e692d36fdccea87f48dee0fd33e59c1dc5d345d52f537075a4b7e8904 -size 36864 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Novell.Directory.Ldap.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Novell.Directory.Ldap.dll deleted file mode 100644 index c67722acb..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/Novell.Directory.Ldap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6299f3d85b0d92aac586261adf9b5b60ab837d048331334bda5183f292d9eee -size 246272 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/PEAPI.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/PEAPI.dll deleted file mode 100644 index 31e36da0a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/PEAPI.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c0717febe06ddf8109f918399d1338e4b67c1541337990f329ca586b1f44f07 -size 100352 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/RabbitMQ.Client.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/RabbitMQ.Client.dll deleted file mode 100644 index 18084533d..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/RabbitMQ.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74adc6becdc480899c9b5c53ccb6fa887c8d71f94ee79c7f593fc359e3d8dd2d -size 464896 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/SMDiagnostics.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/SMDiagnostics.dll deleted file mode 100644 index b545b0efd..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/SMDiagnostics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:37dc880fad77b9c2ab3532f255967e39495269fdb968053b2ab8f20882aeb14f -size 38912 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Collections.Immutable.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Collections.Immutable.dll deleted file mode 100755 index 0c5a57915..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Collections.Immutable.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f05a2c489c2d30a6cca346d4ce184323d70eb4f5afa6bed34d5800274444e57 -size 302216 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll deleted file mode 100644 index 53350aee0..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4465b575ef4d6fe795b43a50aac57f9c424cf6702b7239f58d2d3d419ecc9123 -size 258560 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll deleted file mode 100644 index f44584c27..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f458322c97eecffc8d640cbf09f43d85703f704680354c635bec7bbd024dc026 -size 84992 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Configuration.Install.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Configuration.Install.dll deleted file mode 100644 index af20838c3..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Configuration.Install.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac791e97c0838233dc8d02e07ec9e68f07fca6315b8a7bbf33dda5888d89fa65 -size 24064 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Configuration.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Configuration.dll deleted file mode 100644 index 762529ae6..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Configuration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:171d837d86c3fa9758beb58acbc2b3a81832be3708fbd9591cdbbcb98c21d2bd -size 122880 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Core.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Core.dll deleted file mode 100644 index 32dcd2569..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:841df1b9cde9dca76d04a9e2d19e56a537d588da58dafe8ee8028cb9bb94eb52 -size 1086464 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll deleted file mode 100644 index 7f14bcd76..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f53416e9f368fae8a7e0d5cab0171fda85ffabf42ed7b66e8cac43a183f993ab -size 29696 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.Entity.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.Entity.dll deleted file mode 100644 index df00cf9af..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.Entity.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63402941a9194a3814caf8824aed5ee300766ce755cdc3263b611ca90e2bd2ef -size 3338240 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.Linq.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.Linq.dll deleted file mode 100644 index 936ce24d5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f6ef57342af0458e475ccf9e85db2f21bf127107bcb70a5848269ce808c5ed5 -size 652800 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.OracleClient.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.OracleClient.dll deleted file mode 100644 index c9cbf3fe4..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.OracleClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a0d0f0bf49fab0e2c960fcecf47448043a73c41be42d10fb9ff8d3b71e99616 -size 173056 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.Services.Client.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.Services.Client.dll deleted file mode 100644 index bd7c50ddf..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.Services.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d27cb2bac0c4be5f3fed2355578030511c0463518ab90f6b720c5ba994c1671e -size 418816 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.Services.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.Services.dll deleted file mode 100644 index b402a7cd4..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56e07612b65efb0f666efdcb6d9573baebacf69b54234a53bbcb87838c0cee77 -size 56320 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.dll deleted file mode 100644 index b9b38cb69..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:042c179d7474f1a4ebcdce43ac162140da7ad8be28c3e760895e9f83fe352773 -size 2103296 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Deployment.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Deployment.dll deleted file mode 100644 index 910bff681..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8acfe355db2d152012bae3ee223985a848d3fa79daa7e37e770114ca187f297d -size 11776 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Design.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Design.dll deleted file mode 100644 index 7c4481f3c..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Design.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:297db3332c96905892a6efe632bf5af20a590528691ccd6873ff9987250b3729 -size 275456 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll deleted file mode 100644 index dfdd376fc..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ade44df93a20aecf69fd697d8102b918a7b6f203a5016bf93122f84f681efdd5 -size 61952 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.DirectoryServices.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.DirectoryServices.dll deleted file mode 100644 index f65db3960..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.DirectoryServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6bebc99eea99d8f15188efb2e4ff67186a3ec64765b0753dddbbea3cde10628 -size 94208 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Drawing.Design.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Drawing.Design.dll deleted file mode 100644 index 7dcd85f8e..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Drawing.Design.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9eba5ba47dd1638d766cd8c937ddd254d10444160473cc37f1d12498f307a251 -size 30720 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Drawing.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Drawing.dll deleted file mode 100644 index f524217ba..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Drawing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20723d7993a578a0a9b7696b0b265cb6a6967be42b73f3bf52a3d4ae4e219dc2 -size 491008 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Dynamic.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Dynamic.dll deleted file mode 100644 index a13e8fce8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Dynamic.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea820d11c9294f8a77eb41ead5c0b6a678620b61c953e91401f99d64ee77c3f9 -size 87040 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.EnterpriseServices.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.EnterpriseServices.dll deleted file mode 100644 index 523c73020..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.EnterpriseServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5f4fde63006fd55f9d74bc01f70014317b22e1ba0bb7f9b2634f8d451e614e6 -size 46592 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll deleted file mode 100644 index 8b07d9c1b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38fd6e8e53b39b5eb0be5bbf87d2beff289b4cad5b20feada41a5017ee1fe61b -size 18432 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.IO.Compression.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.IO.Compression.dll deleted file mode 100644 index c425363a6..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.IO.Compression.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6de4d1ae3396938358d2bfc8b14478041fa913d616f55fc75b6d909ece05b5f7 -size 115200 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll deleted file mode 100644 index 83b8460f5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:978998b92f9d876064187943fec584cd4af3d8dd6c796054432fce1173c429f0 -size 17408 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.IdentityModel.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.IdentityModel.dll deleted file mode 100644 index 5e2f85eb2..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.IdentityModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3df48b930d479a7f15c5eb6533d6d4d84fbe6b612aec602a57cabbd72e33165c -size 139776 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Json.Microsoft.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Json.Microsoft.dll deleted file mode 100644 index e0edb056c..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Json.Microsoft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bbffd2577e2c06733e5a5b063f5fdf8777855898c642c7e3931014b7803025f2 -size 54784 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Json.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Json.dll deleted file mode 100644 index 5166a307d..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4914bb59f5d08229d38a024c34c4cc35ed4fbdfffa3f427ec4aebb3bb2e70fbc -size 32768 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Management.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Management.dll deleted file mode 100644 index 96e108ab6..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f083379005761ac1b31b1235a893dfff36febd8df0253a3b2b66013abd8b3098 -size 49664 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Memory.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Memory.dll deleted file mode 100755 index 0f4395de1..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Memory.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41b5e1a4c59abdb1ce1467f58c3d9fd06d39dff4fc61d500a2410fece8037f4b -size 148760 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Messaging.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Messaging.dll deleted file mode 100644 index e4d47e2f2..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b82dd8058f7a203f9eba6eedbbf27e1bc20bede8e3544a8e0975c49cf221f33e -size 75776 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll deleted file mode 100644 index 7182a3519..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e535958942e02364cedf0b04e35cbef5f1e29317fb87dd77577f73277f5ba6e -size 518656 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll deleted file mode 100644 index 984c9c016..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b4b7015332cb523299a7587f1c6e3e52db99b9588bae6123dad9dd016173b28 -size 27136 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Net.Http.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Net.Http.dll deleted file mode 100644 index 39f8b22c1..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Net.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5de962cf057f3cf2ee4cf0fb19e8ea11c45eeb790caa7afcad6bfcb8faaf334 -size 281088 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Net.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Net.dll deleted file mode 100644 index 8d8be1c5a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Net.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7798088c72df4263dfdeb0de6ecdea151cfbb14e8c95a40ea577f9c6b4a3ae63 -size 13312 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Numerics.Vectors.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Numerics.Vectors.dll deleted file mode 100644 index 9ffe05fdc..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Numerics.Vectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5d537d6b04a4fa0ad752522553319c72f248e913f5cd6e6eac920e98d39de20 -size 12288 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Numerics.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Numerics.dll deleted file mode 100644 index b258d94ff..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7983522e6cfe1c69dae2a7c287788ff7c966543dd89c790a9a09846b1ec1e149 -size 119808 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Core.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Core.dll deleted file mode 100644 index 89ecd73b0..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fbaf3cbf422168ecfcb0a743ce66774b475fd52a02dd3a9ae9be4f73ece92fc -size 95744 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Debugger.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Debugger.dll deleted file mode 100644 index 26d40e90e..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Debugger.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:416f892f39f496532202e68b18b6fde5d896e8301c27886b40e350ce80e253ae -size 5120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Experimental.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Experimental.dll deleted file mode 100644 index a46d9c8e4..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Experimental.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60288106456e7586983698a091ae9fa7021a68d9a0abdb4608e5cb0a742d4a9c -size 28672 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll deleted file mode 100644 index 605512f2a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:707a4066589b59e4e734dc295f7b8e564e0f43361cf5c36adf31eb2c7930989e -size 7680 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Linq.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Linq.dll deleted file mode 100644 index 40a60715f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67b2ea4234dd4fb89ee4325ad9bdd37276ef05275e0280dfaf8cb97372151886 -size 683008 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll deleted file mode 100644 index f3cacd681..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:460a9fdc8e3a94a9c5b701a99f7a37281ae336dac4fa5c7cfcd4daa34d8f62f0 -size 9728 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll deleted file mode 100644 index 1dfea8a1b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57e8be600fc7fb70ae23e4decc12949fd2ae2b4c8e23f490be7bde422dc3c210 -size 22528 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Providers.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Providers.dll deleted file mode 100644 index b9dd874b6..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Providers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:27705a38c48c203eabc1c13dc87fcbf4616e18a8c3a6242301a5902929ab0eb4 -size 243200 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll deleted file mode 100644 index a81c44f36..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac32f644c0a88a5c789f732d375ef70bed29da56451570de514afbfd51bc83cd -size 9216 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll deleted file mode 100644 index b7c7a2b23..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21eba9b6ab7cf93cb817ce2c3ab1416659c7d46e0ac1602809f909486de70e96 -size 9728 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll deleted file mode 100644 index 2543b7e63..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0f6bd34deec9e5daccf33d8773cb7db8790bd7d0a175853c5684b3a8d3f6f55 -size 12800 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reflection.Context.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reflection.Context.dll deleted file mode 100644 index 345217201..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reflection.Context.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:467c1c751d09cb9887771f7c1117f9ddd2b88b271034f660b1c5cea3ae6b4bc3 -size 13312 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reflection.Metadata.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reflection.Metadata.dll deleted file mode 100755 index 5ab21e78b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Reflection.Metadata.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e180767f1415cb5bbed14450e1d4003cf56a9da6aeaf91ce969a4b9d2a54314 -size 576144 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Runtime.Caching.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Runtime.Caching.dll deleted file mode 100644 index 8fad976d2..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Runtime.Caching.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75089c6efdf7783f6a32e6f07a88b2db22cb7ac7c03bbe27600df40c72764136 -size 72192 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Runtime.CompilerServices.Unsafe.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Runtime.CompilerServices.Unsafe.dll deleted file mode 100755 index 19ad4e23b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Runtime.CompilerServices.Unsafe.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ad2dd7225d5162a0fd3a3b337a1949448520e3130a4bc8e010ec02f76097500 -size 23600 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll deleted file mode 100644 index c3ac14b98..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:540b736958f2ec82503870fa37dfe9f1483cbf3ee488ddc20b2fddc450a1a439 -size 107520 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Runtime.Remoting.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Runtime.Remoting.dll deleted file mode 100644 index 02d050742..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9fdbaec0c35ab7695edda6dbf056b575971ab62110109a2063f728b6ac727539 -size 119808 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll deleted file mode 100644 index f542d736d..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f3d6559dde02956fec32b85e524b90c08eb7e49327eb805e6ee7ddf8de29d8bd -size 38912 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Runtime.Serialization.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Runtime.Serialization.dll deleted file mode 100644 index a13995f3e..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Runtime.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7dba5fee490e094d299f0a353de920e2cc59c95b47bb3dc62243261200a6e8c3 -size 933888 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Security.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Security.dll deleted file mode 100644 index f26668df8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c7b696f0cf3925d47544194da48849e2bbbe828d417ffb855d9000f612fcfc7 -size 308224 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll deleted file mode 100644 index 7dba3b614..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f879fc8feb15132b1d5abb381b6e75b07311ba3cf0aadd62fec8f6caf40b8aa9 -size 13312 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll deleted file mode 100644 index 01a8182b0..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c5daa3a9c85ef83c90ffa836e80a13629ada71b3fa50c97042e3c1575838be2 -size 141312 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll deleted file mode 100644 index 5174ecc87..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30c0b4cab4a456300587aa1160cbdcd28cf7f914d5bb5dd41017965ace26b53b -size 215040 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll deleted file mode 100644 index e31805117..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef364e6e464451d33f779a62b406a990656236f9e1f2c45aa2a259a228c7984c -size 37376 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceModel.Web.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceModel.Web.dll deleted file mode 100644 index e63adfa9c..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceModel.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa78021c3462174d441e63af7df80d7833013e0a2db32cb0f825aa6a7ef9c4e6 -size 79360 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceModel.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceModel.dll deleted file mode 100644 index 7ffb3e5e5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68e05e15abfdd316ff2fddb1a256f47a571c5c7bfdc21f88434db8839791f114 -size 1427456 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceProcess.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceProcess.dll deleted file mode 100644 index c85b50f20..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.ServiceProcess.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e24043ad6c15be45eab0669aec7fb2b145fbc35b4142637850567bc3ae1b774 -size 47616 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll deleted file mode 100644 index d9c206bbb..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56aa1d4295e61a9d2c20e73ca52c122caa693643319f3fe3c0dca4bad61632c4 -size 169472 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Threading.Tasks.Extensions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Threading.Tasks.Extensions.dll deleted file mode 100755 index 393652b40..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Threading.Tasks.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f54718bbab6e7a649e460f5097ed444f33452b1451841f67e2e194641d5fccd -size 33048 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Transactions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Transactions.dll deleted file mode 100644 index 5c702d264..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Transactions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce7ab1ca45149be5d51c27feb3fd807c8ab30d31b3cf392a413684ef00305102 -size 34304 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Abstractions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Abstractions.dll deleted file mode 100644 index 6c41ad996..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Abstractions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b88d4770f40c8ca84baa9a2927c2c93d9f52137e12fe77007535e97a1ee27162 -size 12800 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll deleted file mode 100644 index 88a5642e8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:431c9a1572b254894f94ecbafb90f30576c504808b7c98b0a40b7ca41042ef58 -size 33792 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.DynamicData.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.DynamicData.dll deleted file mode 100644 index 30291b487..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.DynamicData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28f104232217e8b3c7244c9b045b87eec1cb3164472d521b31c885d0cf2f7770 -size 69120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Extensions.Design.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Extensions.Design.dll deleted file mode 100644 index b84978722..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Extensions.Design.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3148c19c2f3e8bb987309029a41f4d9c2c279ee43d55114f000703cad97afa8d -size 15360 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Extensions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Extensions.dll deleted file mode 100644 index 48525b557..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ab2086183488192f048f416fb0b54e021f368c84a52a60f91a23463f4bd22a8 -size 745984 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll deleted file mode 100644 index 1d682e1df..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d147cf27b3c69eff9ca5394fff06e5971e4640d21bf7c2ac0249b2dc4781a24 -size 88064 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll deleted file mode 100644 index 2419c1290..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19f1175c6fe95bfc6faebde9846e8800b8d2df627d38bf0b69b1b227045b0899 -size 56832 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Http.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Http.dll deleted file mode 100644 index af59162d8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c587182797071e50c9a4638cbaf989867f84c32a726fe8bb9b3eb6736b7dc0d -size 326144 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Mobile.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Mobile.dll deleted file mode 100644 index 8d69778a3..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Mobile.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3dbd20654603d5ff484dbaa1a5a6cbec80dddbafd8e834963015e01c857e8a5 -size 11776 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Mvc.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Mvc.dll deleted file mode 100644 index 87d13add9..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Mvc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5cf41fb40c84a5adfc175da9f5dd8d751cd79dc3e30db2db78c9223054ec5400 -size 419840 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Razor.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Razor.dll deleted file mode 100644 index 8c209f4f8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a8dff7c71574d21c940ed549e70ed7871638a171151ead31a6940ffd24571c7 -size 254976 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll deleted file mode 100644 index 5bf67f16f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6531106d57c67fcdf32d62eb9d73f9de7107d485671217fcd99bbf1bb8e6fee -size 11776 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Routing.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Routing.dll deleted file mode 100644 index fe56843fa..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:277d420160bb4a403c5d09efca1c124024df59bc965fa9623e7859668579695f -size 12288 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Services.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Services.dll deleted file mode 100644 index 7b8c930e8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba086c0b92f897513e461d8f2a51825b1502c3de19c70f68dec9ec0357fdd012 -size 787456 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll deleted file mode 100644 index bd7835766..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:000649acd357461c3be7c150d46f401a4990ea57358c60920e8b214bba8deb70 -size 39424 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll deleted file mode 100644 index 45ffe3d6d..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2632b11dd1ac054c4cc1fb2a5d77def4ec4ad4f421c32f16652efe7c2f68a1bb -size 38400 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.WebPages.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.WebPages.dll deleted file mode 100644 index df926edac..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.WebPages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd9acef3550c397174d37ac7b8fb1b178e0abb61da7f5bab03841dc1242e98b1 -size 196608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.dll deleted file mode 100644 index 2990b56bd..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5496200edae4f96376df62c259d98ca4c992dae6c53a7bb5335c9f9d5ed6883b -size 3028992 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll deleted file mode 100644 index 4b1f00a61..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2de81878034e9129578ba071a47a7a0f194c418dcb15c15a9c3ed941cfb331aa -size 145920 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Windows.Forms.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Windows.Forms.dll deleted file mode 100644 index e2e973d06..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e05d2da77f22b7d291ee4a86871e26ca63d414e3f0425f184bf48cf0f1ed554a -size 2899968 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Windows.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Windows.dll deleted file mode 100644 index 7fe36e190..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Windows.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a95172b118693f53b49d40984ad431b357202cd1f5db292898514908c16cc507 -size 11776 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Workflow.Activities.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Workflow.Activities.dll deleted file mode 100644 index 52d9f6ba7..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Workflow.Activities.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6be6cd81705e0e54c949eb74e7590768c572595998c22f74a62ed4a4bcba2276 -size 11776 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll deleted file mode 100644 index cd7310881..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2cfaedcf003e13107b26b27e31aefb2d93e6cbc2f05b6d2f1d887f39f251c926 -size 11776 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Workflow.Runtime.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Workflow.Runtime.dll deleted file mode 100644 index bf880d66e..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Workflow.Runtime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5f147fc082a208f0c270cdf222e68dbbb5526d5e55b788096cb4e1c3c9167d4 -size 11776 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Xaml.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Xaml.dll deleted file mode 100644 index 53e99a4d0..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Xaml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f1718df6b2e47a13f7f04092ddf1e3de63e57df3a3ac600f6da16abf46ce0d1 -size 188928 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Xml.Linq.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Xml.Linq.dll deleted file mode 100644 index 66dcb0849..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Xml.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89153954aeb08c417dc01a9b83640f7115ca7a7c0a7db5e2819d0990a2c4c1a4 -size 137728 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Xml.Serialization.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Xml.Serialization.dll deleted file mode 100644 index 79f06d41f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Xml.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0ea428cbed8cf10c319d2a87e4ff54c8baa63eb4a681d26b1f023ccb09170a7 -size 11776 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Xml.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Xml.dll deleted file mode 100644 index 9863a3987..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8cbd08fb24fecba4e19b0bc86020d320413a35fbb4054db9e99e7e5bcbdf51b5 -size 3174400 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.dll deleted file mode 100644 index 10ac90392..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/System.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:012cd3b4a43b9b91d9dfbf04931d827ce1586fd2f1b26c97b524a0ecbf7c1484 -size 2665984 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/WebMatrix.Data.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/WebMatrix.Data.dll deleted file mode 100644 index 6a1e9bd41..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/WebMatrix.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6d75ab8a21b64f83a8a958979dc6875f79dbbe7367d995aed79cc5900e8c650 -size 17920 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/WindowsBase.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/WindowsBase.dll deleted file mode 100644 index 2e43ab76f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/WindowsBase.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d764a633c03b1c51ddc8a9fc222db464f6da5cc556eba5fb998fb5093554d5e1 -size 161792 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/csc.exe b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/csc.exe deleted file mode 100755 index 75804b3df..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/csc.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95ac92a7eea4d32a456637349dda0275ac146b72f21aca4c69d569adc0a7b520 -size 56176 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/cscompmgd.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/cscompmgd.dll deleted file mode 100644 index 71ef8812b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/cscompmgd.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a065cdd5b278031e79051ea982d4f3b606c71c812680f8b253b49bb5467b490c -size 18432 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/mscorlib.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/mscorlib.dll deleted file mode 100755 index 6420389e3..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/4.5/mscorlib.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:92a509dc6132ae7b73610e579ff9c871b9f89b387e13870a7c35846b527c7a5a -size 4616704 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll deleted file mode 100644 index 1f281b0c5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38077916ef2a1fb4506b13d34370a940d47c288dd4a8d59c156cf4dd0485777a -size 12800 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Commons.Xml.Relaxng/4.0.0.0__0738eb9f132ed756/Commons.Xml.Relaxng.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Commons.Xml.Relaxng/4.0.0.0__0738eb9f132ed756/Commons.Xml.Relaxng.dll deleted file mode 100644 index 2f8bf7c42..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Commons.Xml.Relaxng/4.0.0.0__0738eb9f132ed756/Commons.Xml.Relaxng.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:acefc14f5dfbdbd3cf26000a4e32722966f57d525cc0620dbb48ca3d291f14d6 -size 231424 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/CustomMarshalers/4.0.0.0__b03f5f7f11d50a3a/CustomMarshalers.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/CustomMarshalers/4.0.0.0__b03f5f7f11d50a3a/CustomMarshalers.dll deleted file mode 100644 index 9a8b37e58..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/CustomMarshalers/4.0.0.0__b03f5f7f11d50a3a/CustomMarshalers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02921dffac128db4f713f4ccb2da029937f2eb20888406e1797d10e4dd56ab47 -size 14848 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/I18N.CJK/4.0.0.0__0738eb9f132ed756/I18N.CJK.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/I18N.CJK/4.0.0.0__0738eb9f132ed756/I18N.CJK.dll deleted file mode 100644 index 0c74cbbb8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/I18N.CJK/4.0.0.0__0738eb9f132ed756/I18N.CJK.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc0d75a484a23716084be32c70b4669c15ac984c8ca57b8766917579ad763315 -size 679936 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/I18N.MidEast/4.0.0.0__0738eb9f132ed756/I18N.MidEast.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/I18N.MidEast/4.0.0.0__0738eb9f132ed756/I18N.MidEast.dll deleted file mode 100644 index 6e063de93..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/I18N.MidEast/4.0.0.0__0738eb9f132ed756/I18N.MidEast.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4eb81f05a1bb04077bf22cf14de97f792baa37e9ae69ce6940d74b49845e5a00 -size 32256 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/I18N.Other/4.0.0.0__0738eb9f132ed756/I18N.Other.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/I18N.Other/4.0.0.0__0738eb9f132ed756/I18N.Other.dll deleted file mode 100644 index 3db27e742..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/I18N.Other/4.0.0.0__0738eb9f132ed756/I18N.Other.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4dfdc87dde21bce3b918dbea485edc8ea0b77d1764aa05ad88b20ebcb4592e3d -size 36352 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/I18N.Rare/4.0.0.0__0738eb9f132ed756/I18N.Rare.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/I18N.Rare/4.0.0.0__0738eb9f132ed756/I18N.Rare.dll deleted file mode 100644 index 041f2792e..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/I18N.Rare/4.0.0.0__0738eb9f132ed756/I18N.Rare.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12f8857b8275ede4205cfebbf2c14220a188d921dff630cc4c1ed32b350d4b96 -size 192000 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/I18N.West/4.0.0.0__0738eb9f132ed756/I18N.West.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/I18N.West/4.0.0.0__0738eb9f132ed756/I18N.West.dll deleted file mode 100644 index 9b9abbc31..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/I18N.West/4.0.0.0__0738eb9f132ed756/I18N.West.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bda25073b142b7ecffc84d2d904832a5f308a396fa03066b530fa7a710346378 -size 72192 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/I18N/4.0.0.0__0738eb9f132ed756/I18N.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/I18N/4.0.0.0__0738eb9f132ed756/I18N.dll deleted file mode 100644 index d0a0e3074..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/I18N/4.0.0.0__0738eb9f132ed756/I18N.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7b1751c0b83ad11befc6089275d6b94062633f51da242273de92d8d51b70a41 -size 39424 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/IBM.Data.DB2/1.0.0.0__7c307b91aa13d208/IBM.Data.DB2.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/IBM.Data.DB2/1.0.0.0__7c307b91aa13d208/IBM.Data.DB2.dll deleted file mode 100644 index 80ca4e06f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/IBM.Data.DB2/1.0.0.0__7c307b91aa13d208/IBM.Data.DB2.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d36c975b32a20f9f4822e4b3c8dc35f686d6a4f421e9ad9f8950b35be90f2ebf -size 72192 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/ICSharpCode.SharpZipLib/4.84.0.0__1b03e6acf1164f73/ICSharpCode.SharpZipLib.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/ICSharpCode.SharpZipLib/4.84.0.0__1b03e6acf1164f73/ICSharpCode.SharpZipLib.dll deleted file mode 100644 index 3867e2457..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/ICSharpCode.SharpZipLib/4.84.0.0__1b03e6acf1164f73/ICSharpCode.SharpZipLib.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1ce584cb5061d6acdc50018af5ed6c8f782e3302d07ea83990772ed8f7c08ec -size 124928 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Microsoft.CSharp/4.0.0.0__b03f5f7f11d50a3a/Microsoft.CSharp.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Microsoft.CSharp/4.0.0.0__b03f5f7f11d50a3a/Microsoft.CSharp.dll deleted file mode 100644 index a5773519c..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Microsoft.CSharp/4.0.0.0__b03f5f7f11d50a3a/Microsoft.CSharp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e71b7b997b3eaada1810000ee4284f00d57096f8455266d6bbf8969dc610b19 -size 300544 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Microsoft.Web.Infrastructure/1.0.0.0__31bf3856ad364e35/Microsoft.Web.Infrastructure.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Microsoft.Web.Infrastructure/1.0.0.0__31bf3856ad364e35/Microsoft.Web.Infrastructure.dll deleted file mode 100644 index 3877e34a5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Microsoft.Web.Infrastructure/1.0.0.0__31bf3856ad364e35/Microsoft.Web.Infrastructure.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d4e756527545ee2deada56ec255c6c433d15cf9237bd8cbe2c12cb01451edb5 -size 16896 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Btls.Interface/4.0.0.0__0738eb9f132ed756/Mono.Btls.Interface.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Btls.Interface/4.0.0.0__0738eb9f132ed756/Mono.Btls.Interface.dll deleted file mode 100644 index 58b5012ad..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Btls.Interface/4.0.0.0__0738eb9f132ed756/Mono.Btls.Interface.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa07a66bebf088cba7c34b0821c56eac9b9bbe39ead30f2c862d29f99b881c0f -size 22528 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.CSharp/4.0.0.0__0738eb9f132ed756/Mono.CSharp.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.CSharp/4.0.0.0__0738eb9f132ed756/Mono.CSharp.dll deleted file mode 100644 index 1ae4f3c79..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.CSharp/4.0.0.0__0738eb9f132ed756/Mono.CSharp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8ae2f11fcfd1de8dbd5efd26cab4338f30048328c6d874045b6f344d12c4e7b -size 1354752 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Cairo/4.0.0.0__0738eb9f132ed756/Mono.Cairo.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Cairo/4.0.0.0__0738eb9f132ed756/Mono.Cairo.dll deleted file mode 100644 index 232cf84bd..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Cairo/4.0.0.0__0738eb9f132ed756/Mono.Cairo.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c3bbfb9c6520d68eae80611c84e3178cc71d5175b63a43c6cc4b1a83fa3c460 -size 62464 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Cecil/0.11.0.0__0738eb9f132ed756/Mono.Cecil.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Cecil/0.11.0.0__0738eb9f132ed756/Mono.Cecil.dll deleted file mode 100644 index 2543d56b1..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Cecil/0.11.0.0__0738eb9f132ed756/Mono.Cecil.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4bc5a5e26874d888cb920443c522e7b7cef8d0af3b0294f535e752e78cb40d45 -size 342528 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.CompilerServices.SymbolWriter/4.0.0.0__0738eb9f132ed756/Mono.CompilerServices.SymbolWriter.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.CompilerServices.SymbolWriter/4.0.0.0__0738eb9f132ed756/Mono.CompilerServices.SymbolWriter.dll deleted file mode 100644 index ca7cbdf57..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.CompilerServices.SymbolWriter/4.0.0.0__0738eb9f132ed756/Mono.CompilerServices.SymbolWriter.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ec053bb41a645f3cf64a31f7cd189c36f02dee8f14bc0d14b76a0a9946a6dea -size 44032 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Data.Sqlite/4.0.0.0__0738eb9f132ed756/Mono.Data.Sqlite.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Data.Sqlite/4.0.0.0__0738eb9f132ed756/Mono.Data.Sqlite.dll deleted file mode 100644 index 8cb4c423b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Data.Sqlite/4.0.0.0__0738eb9f132ed756/Mono.Data.Sqlite.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ada04dec59c366f49378cf3ce6da279cf1997ac5de777d17dfd95b67b5a2c7c7 -size 166912 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Debugger.Soft/4.0.0.0__0738eb9f132ed756/Mono.Debugger.Soft.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Debugger.Soft/4.0.0.0__0738eb9f132ed756/Mono.Debugger.Soft.dll deleted file mode 100644 index 630e819aa..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Debugger.Soft/4.0.0.0__0738eb9f132ed756/Mono.Debugger.Soft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2729b3f9b086f78a113bea78e7c1df6d3266f31cfaf3c8876b63854953e14da2 -size 160256 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Http/4.0.0.0__0738eb9f132ed756/Mono.Http.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Http/4.0.0.0__0738eb9f132ed756/Mono.Http.dll deleted file mode 100644 index 30f19926b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Http/4.0.0.0__0738eb9f132ed756/Mono.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b96c42a802ad1d73bf3616c12fba78ecaa7025963ddf2061eb5c319107215080 -size 27136 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Management/4.0.0.0__0738eb9f132ed756/Mono.Management.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Management/4.0.0.0__0738eb9f132ed756/Mono.Management.dll deleted file mode 100644 index 69bdcd103..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Management/4.0.0.0__0738eb9f132ed756/Mono.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19f2dc7746c9ac600a73e4572ed0ab788a2369b511ec59c8d913481b9ca358ea -size 13312 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Messaging/4.0.0.0__0738eb9f132ed756/Mono.Messaging.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Messaging/4.0.0.0__0738eb9f132ed756/Mono.Messaging.dll deleted file mode 100644 index 769804709..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Messaging/4.0.0.0__0738eb9f132ed756/Mono.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d03356f0fa9c87e43150720035c208eb79332f34dcce699f7a5ff044464fe1c1 -size 34816 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll deleted file mode 100644 index 8380a87e1..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:71b816db8f70a78f2db6ac9bbf5d28aa66cdd251c01b9da66fc3184bb0b0ceff -size 212480 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll deleted file mode 100644 index c39d1e799..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea4bd65d2261f1c5f3c22b592734b3079270365e827f4ca785853b9c38b291bd -size 314368 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Simd/4.0.0.0__0738eb9f132ed756/Mono.Simd.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Simd/4.0.0.0__0738eb9f132ed756/Mono.Simd.dll deleted file mode 100644 index 31d492f84..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Simd/4.0.0.0__0738eb9f132ed756/Mono.Simd.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a21917597c63580bf1b61d72bc25470c02db980e4e7944b3d1fb4a00044ae603 -size 67072 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Tasklets/4.0.0.0__0738eb9f132ed756/Mono.Tasklets.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Tasklets/4.0.0.0__0738eb9f132ed756/Mono.Tasklets.dll deleted file mode 100644 index 7796e9cc4..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.Tasklets/4.0.0.0__0738eb9f132ed756/Mono.Tasklets.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb2b392cf61e9c087ca675ad20941891d0859ab79a615502194c3a8571f5d76d -size 11264 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.WebBrowser/4.0.0.0__0738eb9f132ed756/Mono.WebBrowser.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.WebBrowser/4.0.0.0__0738eb9f132ed756/Mono.WebBrowser.dll deleted file mode 100644 index db8880016..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Mono.WebBrowser/4.0.0.0__0738eb9f132ed756/Mono.WebBrowser.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:162bb5bdf3dfe9e8a6efb36db0de18fae43acbe99841bae92c487716b4771a09 -size 166912 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Novell.Directory.Ldap/4.0.0.0__0738eb9f132ed756/Novell.Directory.Ldap.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Novell.Directory.Ldap/4.0.0.0__0738eb9f132ed756/Novell.Directory.Ldap.dll deleted file mode 100644 index c67722acb..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/Novell.Directory.Ldap/4.0.0.0__0738eb9f132ed756/Novell.Directory.Ldap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6299f3d85b0d92aac586261adf9b5b60ab837d048331334bda5183f292d9eee -size 246272 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/PEAPI/4.0.0.0__0738eb9f132ed756/PEAPI.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/PEAPI/4.0.0.0__0738eb9f132ed756/PEAPI.dll deleted file mode 100644 index 31e36da0a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/PEAPI/4.0.0.0__0738eb9f132ed756/PEAPI.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c0717febe06ddf8109f918399d1338e4b67c1541337990f329ca586b1f44f07 -size 100352 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/SMDiagnostics/0.0.0.0__b77a5c561934e089/SMDiagnostics.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/SMDiagnostics/0.0.0.0__b77a5c561934e089/SMDiagnostics.dll deleted file mode 100644 index b545b0efd..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/SMDiagnostics/0.0.0.0__b77a5c561934e089/SMDiagnostics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:37dc880fad77b9c2ab3532f255967e39495269fdb968053b2ab8f20882aeb14f -size 38912 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll deleted file mode 100644 index f44584c27..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f458322c97eecffc8d640cbf09f43d85703f704680354c635bec7bbd024dc026 -size 84992 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll deleted file mode 100644 index af20838c3..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac791e97c0838233dc8d02e07ec9e68f07fca6315b8a7bbf33dda5888d89fa65 -size 24064 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll deleted file mode 100644 index 762529ae6..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:171d837d86c3fa9758beb58acbc2b3a81832be3708fbd9591cdbbcb98c21d2bd -size 122880 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll deleted file mode 100644 index 32dcd2569..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:841df1b9cde9dca76d04a9e2d19e56a537d588da58dafe8ee8028cb9bb94eb52 -size 1086464 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll deleted file mode 100644 index 936ce24d5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f6ef57342af0458e475ccf9e85db2f21bf127107bcb70a5848269ce808c5ed5 -size 652800 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll deleted file mode 100644 index c9cbf3fe4..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a0d0f0bf49fab0e2c960fcecf47448043a73c41be42d10fb9ff8d3b71e99616 -size 173056 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll deleted file mode 100644 index b9b38cb69..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:042c179d7474f1a4ebcdce43ac162140da7ad8be28c3e760895e9f83fe352773 -size 2103296 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Design/4.0.0.0__b03f5f7f11d50a3a/System.Design.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Design/4.0.0.0__b03f5f7f11d50a3a/System.Design.dll deleted file mode 100644 index 7c4481f3c..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Design/4.0.0.0__b03f5f7f11d50a3a/System.Design.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:297db3332c96905892a6efe632bf5af20a590528691ccd6873ff9987250b3729 -size 275456 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll deleted file mode 100644 index f65db3960..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6bebc99eea99d8f15188efb2e4ff67186a3ec64765b0753dddbbea3cde10628 -size 94208 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Drawing.Design/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.Design.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Drawing.Design/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.Design.dll deleted file mode 100644 index 7dcd85f8e..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Drawing.Design/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.Design.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9eba5ba47dd1638d766cd8c937ddd254d10444160473cc37f1d12498f307a251 -size 30720 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll deleted file mode 100644 index f524217ba..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20723d7993a578a0a9b7696b0b265cb6a6967be42b73f3bf52a3d4ae4e219dc2 -size 491008 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll deleted file mode 100644 index 523c73020..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5f4fde63006fd55f9d74bc01f70014317b22e1ba0bb7f9b2634f8d451e614e6 -size 46592 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll deleted file mode 100644 index 8b07d9c1b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38fd6e8e53b39b5eb0be5bbf87d2beff289b4cad5b20feada41a5017ee1fe61b -size 18432 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll deleted file mode 100644 index c425363a6..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6de4d1ae3396938358d2bfc8b14478041fa913d616f55fc75b6d909ece05b5f7 -size 115200 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll deleted file mode 100644 index 83b8460f5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:978998b92f9d876064187943fec584cd4af3d8dd6c796054432fce1173c429f0 -size 17408 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll deleted file mode 100644 index 5e2f85eb2..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3df48b930d479a7f15c5eb6533d6d4d84fbe6b612aec602a57cabbd72e33165c -size 139776 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll deleted file mode 100644 index 96e108ab6..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f083379005761ac1b31b1235a893dfff36febd8df0253a3b2b66013abd8b3098 -size 49664 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll deleted file mode 100644 index e4d47e2f2..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b82dd8058f7a203f9eba6eedbbf27e1bc20bede8e3544a8e0975c49cf221f33e -size 75776 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll deleted file mode 100644 index 7182a3519..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e535958942e02364cedf0b04e35cbef5f1e29317fb87dd77577f73277f5ba6e -size 518656 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll deleted file mode 100644 index 984c9c016..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b4b7015332cb523299a7587f1c6e3e52db99b9588bae6123dad9dd016173b28 -size 27136 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll deleted file mode 100644 index 39f8b22c1..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5de962cf057f3cf2ee4cf0fb19e8ea11c45eeb790caa7afcad6bfcb8faaf334 -size 281088 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll deleted file mode 100644 index 8d8be1c5a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7798088c72df4263dfdeb0de6ecdea151cfbb14e8c95a40ea577f9c6b4a3ae63 -size 13312 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll deleted file mode 100644 index 9ffe05fdc..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5d537d6b04a4fa0ad752522553319c72f248e913f5cd6e6eac920e98d39de20 -size 12288 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll deleted file mode 100644 index b258d94ff..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7983522e6cfe1c69dae2a7c287788ff7c966543dd89c790a9a09846b1ec1e149 -size 119808 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll deleted file mode 100644 index 8fad976d2..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75089c6efdf7783f6a32e6f07a88b2db22cb7ac7c03bbe27600df40c72764136 -size 72192 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll deleted file mode 100644 index c3ac14b98..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:540b736958f2ec82503870fa37dfe9f1483cbf3ee488ddc20b2fddc450a1a439 -size 107520 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll deleted file mode 100644 index 02d050742..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9fdbaec0c35ab7695edda6dbf056b575971ab62110109a2063f728b6ac727539 -size 119808 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll deleted file mode 100644 index f542d736d..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f3d6559dde02956fec32b85e524b90c08eb7e49327eb805e6ee7ddf8de29d8bd -size 38912 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll deleted file mode 100644 index a13995f3e..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7dba5fee490e094d299f0a353de920e2cc59c95b47bb3dc62243261200a6e8c3 -size 933888 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll deleted file mode 100644 index f26668df8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c7b696f0cf3925d47544194da48849e2bbbe828d417ffb855d9000f612fcfc7 -size 308224 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll deleted file mode 100644 index 7dba3b614..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f879fc8feb15132b1d5abb381b6e75b07311ba3cf0aadd62fec8f6caf40b8aa9 -size 13312 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll deleted file mode 100644 index 01a8182b0..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c5daa3a9c85ef83c90ffa836e80a13629ada71b3fa50c97042e3c1575838be2 -size 141312 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll deleted file mode 100644 index 5174ecc87..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30c0b4cab4a456300587aa1160cbdcd28cf7f914d5bb5dd41017965ace26b53b -size 215040 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll deleted file mode 100644 index e31805117..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef364e6e464451d33f779a62b406a990656236f9e1f2c45aa2a259a228c7984c -size 37376 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll deleted file mode 100644 index e63adfa9c..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa78021c3462174d441e63af7df80d7833013e0a2db32cb0f825aa6a7ef9c4e6 -size 79360 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll deleted file mode 100644 index 7ffb3e5e5..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68e05e15abfdd316ff2fddb1a256f47a571c5c7bfdc21f88434db8839791f114 -size 1427456 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll deleted file mode 100644 index c85b50f20..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e24043ad6c15be45eab0669aec7fb2b145fbc35b4142637850567bc3ae1b774 -size 47616 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll deleted file mode 100644 index 5c702d264..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce7ab1ca45149be5d51c27feb3fd807c8ab30d31b3cf392a413684ef00305102 -size 34304 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll deleted file mode 100644 index 6c41ad996..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b88d4770f40c8ca84baa9a2927c2c93d9f52137e12fe77007535e97a1ee27162 -size 12800 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll deleted file mode 100644 index 88a5642e8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:431c9a1572b254894f94ecbafb90f30576c504808b7c98b0a40b7ca41042ef58 -size 33792 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll deleted file mode 100644 index 30291b487..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28f104232217e8b3c7244c9b045b87eec1cb3164472d521b31c885d0cf2f7770 -size 69120 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Extensions.Design/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.Design.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Extensions.Design/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.Design.dll deleted file mode 100644 index b84978722..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Extensions.Design/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.Design.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3148c19c2f3e8bb987309029a41f4d9c2c279ee43d55114f000703cad97afa8d -size 15360 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll deleted file mode 100644 index 48525b557..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ab2086183488192f048f416fb0b54e021f368c84a52a60f91a23463f4bd22a8 -size 745984 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll deleted file mode 100644 index 1d682e1df..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d147cf27b3c69eff9ca5394fff06e5971e4640d21bf7c2ac0249b2dc4781a24 -size 88064 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll deleted file mode 100644 index 2419c1290..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19f1175c6fe95bfc6faebde9846e8800b8d2df627d38bf0b69b1b227045b0899 -size 56832 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll deleted file mode 100644 index af59162d8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c587182797071e50c9a4638cbaf989867f84c32a726fe8bb9b3eb6736b7dc0d -size 326144 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll deleted file mode 100644 index 87d13add9..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5cf41fb40c84a5adfc175da9f5dd8d751cd79dc3e30db2db78c9223054ec5400 -size 419840 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll deleted file mode 100644 index 8c209f4f8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a8dff7c71574d21c940ed549e70ed7871638a171151ead31a6940ffd24571c7 -size 254976 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll deleted file mode 100644 index fe56843fa..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:277d420160bb4a403c5d09efca1c124024df59bc965fa9623e7859668579695f -size 12288 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll deleted file mode 100644 index 7b8c930e8..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba086c0b92f897513e461d8f2a51825b1502c3de19c70f68dec9ec0357fdd012 -size 787456 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll deleted file mode 100644 index bd7835766..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:000649acd357461c3be7c150d46f401a4990ea57358c60920e8b214bba8deb70 -size 39424 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll deleted file mode 100644 index 45ffe3d6d..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2632b11dd1ac054c4cc1fb2a5d77def4ec4ad4f421c32f16652efe7c2f68a1bb -size 38400 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll deleted file mode 100644 index df926edac..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd9acef3550c397174d37ac7b8fb1b178e0abb61da7f5bab03841dc1242e98b1 -size 196608 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll deleted file mode 100644 index 2990b56bd..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5496200edae4f96376df62c259d98ca4c992dae6c53a7bb5335c9f9d5ed6883b -size 3028992 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll deleted file mode 100644 index e2e973d06..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e05d2da77f22b7d291ee4a86871e26ca63d414e3f0425f184bf48cf0f1ed554a -size 2899968 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll deleted file mode 100644 index 53e99a4d0..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f1718df6b2e47a13f7f04092ddf1e3de63e57df3a3ac600f6da16abf46ce0d1 -size 188928 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll deleted file mode 100644 index 66dcb0849..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89153954aeb08c417dc01a9b83640f7115ca7a7c0a7db5e2819d0990a2c4c1a4 -size 137728 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll deleted file mode 100644 index 9863a3987..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8cbd08fb24fecba4e19b0bc86020d320413a35fbb4054db9e99e7e5bcbdf51b5 -size 3174400 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll deleted file mode 100644 index 10ac90392..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:012cd3b4a43b9b91d9dfbf04931d827ce1586fd2f1b26c97b524a0ecbf7c1484 -size 2665984 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll deleted file mode 100644 index 2e43ab76f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d764a633c03b1c51ddc8a9fc222db464f6da5cc556eba5fb998fb5093554d5e1 -size 161792 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/cscompmgd/0.0.0.0__b03f5f7f11d50a3a/cscompmgd.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/cscompmgd/0.0.0.0__b03f5f7f11d50a3a/cscompmgd.dll deleted file mode 100644 index 71ef8812b..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/gac/cscompmgd/0.0.0.0__b03f5f7f11d50a3a/cscompmgd.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a065cdd5b278031e79051ea982d4f3b606c71c812680f8b253b49bb5467b490c -size 18432 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild-frameworks/.NETFramework/v4.5/RedistList/FrameworkList.xml b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild-frameworks/.NETFramework/v4.5/RedistList/FrameworkList.xml deleted file mode 100644 index 2741a7830..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild-frameworks/.NETFramework/v4.5/RedistList/FrameworkList.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/Imports/Microsoft.Common.props/ImportBefore/Microsoft.NuGet.ImportBefore.props b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/Imports/Microsoft.Common.props/ImportBefore/Microsoft.NuGet.ImportBefore.props deleted file mode 100644 index 0dea8c03f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/Imports/Microsoft.Common.props/ImportBefore/Microsoft.NuGet.ImportBefore.props +++ /dev/null @@ -1,17 +0,0 @@ - - - - $(MSBuildExtensionsPath)\Microsoft\NuGet\Microsoft.NuGet.props - - - diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/Microsoft.Common.props b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/Microsoft.Common.props deleted file mode 100644 index 6c4d33cda..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/Microsoft.Common.props +++ /dev/null @@ -1,16 +0,0 @@ - - - true - true - - - - - - true - - - - diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/Microsoft.Common.targets/ImportAfter/Microsoft.NuGet.ImportAfter.targets b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/Microsoft.Common.targets/ImportAfter/Microsoft.NuGet.ImportAfter.targets deleted file mode 100644 index 71b454796..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/Microsoft.Common.targets/ImportAfter/Microsoft.NuGet.ImportAfter.targets +++ /dev/null @@ -1,17 +0,0 @@ - - - - $(MSBuildExtensionsPath)\Microsoft\NuGet\Microsoft.NuGet.targets - - - diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/MSBuild/Microsoft.Build.CommonTypes.xsd b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/MSBuild/Microsoft.Build.CommonTypes.xsd deleted file mode 100644 index 148f6bf4f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/MSBuild/Microsoft.Build.CommonTypes.xsd +++ /dev/null @@ -1,1581 +0,0 @@ - - - - - - - - - - - Reference to an assembly - - - - - - - - - Relative or absolute path to the assembly (optional) - - - - - Friendly display name (optional) - - - - - Fusion name of the assembly (optional) - - - - - Whether only the version in the fusion name should be referenced (optional, boolean) - - - - - Aliases for the reference (optional) - - - - - Whether the reference should be copied to the output folder (optional, boolean) - - - - - - - - Assembly name or filename - - - - - - - - - Reference to a COM component - - - - - - - - - Friendly display name (optional) - - - - - GUID in the form {00000000-0000-0000-0000-000000000000} - - - - - Major part of the version number - - - - - Minor part of the version number - - - - - Locale ID - - - - - Wrapper tool, such as tlbimp - - - - - Is it isolated (boolean) - - - - - - - - COM component name - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path to native reference - - - - - - - - - Reference to another project - - - - - - - - - Friendly display name (optional) - - - - - Project GUID, in the form {00000000-0000-0000-0000-000000000000} - - - - - - - - - Path to project file - - - - - - - - - Source files for compiler - - - - - - - - - - - Whether file was generated from another file (boolean) - - - - - - Notional path within project to display if the file is physically located outside of the project file's cone (optional) - - - - - - Display in user interface (optional, boolean) - - - - - - - - Semi-colon separated list of source files (wildcards are allowed) - - - - - - - - - Resources to be embedded in the generated assembly - - - - - - - - - - Name of any file generator that is run on this item - - - - - File that was created by any file generator that was run on this item - - - - - Namespace into which any file generator that is run on this item should create code - - - - - Notional path within project to display if the file is physically located outside of the project file's cone (optional) - - - - - Display in user interface (optional, boolean) - - - - - - - - - Semi-colon separated list of resource files (wildcards are allowed) - - - - - - - - - Files that are not compiled, but may be embedded or published - - - - - - - - - - Name of any file generator that is run on this item - - - - - - - Notional path within project to display if the file is physically located outside of the project file's cone (optional) - - - - - - Default, Included, Excluded, DataFile, or Prerequisite - - - - - - Display in user interface (optional, boolean) - - - - - - Copy file to output directory (optional, boolean, default false) - - - - - - - - Semi-colon separated list of content files (wildcards are allowed) - - - - - - - - - Files that should have no role in the build process - - - - - - - - - - - Name of any file generator that is run on this item - - - - - - - Notional path within project to display if the file is physically located outside of the project file's cone (optional) - - - - - Display in user interface (optional, boolean) - - - - - - - - - - - Folder on disk - - - - - Assemblies whose namespaces should be imported by the Visual Basic compiler - - - - - - Name of Web References folder to display in user interface - - - - - Represents a reference to a web service - - - - - - - - - - - - - - - - - - - URL to web service - - - - - - - - - - - - - - - Display in user interface (optional, boolean) - - - - - - - - - - - - - - - - - - - Display in user interface (optional, boolean) - - - - - - (boolean) - - - - - Default, Included, Excluded, DataFile, or Prerequisite - - - - - - - - - - - - - - - integer - - - - - Matches the expression "\d\.\d\.\d\.(\d|\*)" - - - - - Name of folder for Application Designer - - - - - - - Name of output assembly - - - - - - - - - boolean - - - - - - HomeSite, Relative, or Absolute - - - - - - boolean - - - - - - - - - boolean - - - - - - Whether to emit symbols (boolean) - - - - - none, pdbonly, or full - - - - - - - - - Whether DEBUG is defined (boolean) - - - - - Whether TRACE is defined (boolean) - - - - - - - boolean - - - - - - - - - - - - - - - - - - - - - - - - Web, Unc, or Disk - - - - - - - - - - - boolean - - - - - Matches the expression "\d\.\d\.\d\.\d" - - - - - - - - Whether standard libraries (such as mscorlib) should be referenced automatically (boolean) - - - - - Comma separated list of disabled warnings - - - - - boolean - - - - - Should compiler optimize output (boolean) - - - - - Option Compare setting (Text or Binary) - - - - - Should Option Explicit be set (On or Off) - - - - - Should Option Strict be set (On or Off) - - - - - - Path to output folder, with trailing slash - - - - - Type of output to generate (WinExe, Exe, or Library) - - - - - - - - - Command line to be run at the end of build - - - - - Command line to be run at the start of build - - - - - - - - - - - - - Semi-colon separated list of folders to search during reference resolution - - - - - - - - - - - - - - - - - - - - - - - - Type that contains the main entry point - - - - - - - - - boolean - - - - - - boolean - - - - - - Hours, Days, or Weeks - - - - - Foreground or Background - - - - - boolean - - - - - boolean - - - - - - - - - integer between 0 and 4 inclusive - - - - - Comma separated list of warning numbers to treat as errors - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/MSBuild/Microsoft.Build.Core.xsd b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/MSBuild/Microsoft.Build.Core.xsd deleted file mode 100644 index c8f2aacb1..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/MSBuild/Microsoft.Build.Core.xsd +++ /dev/null @@ -1,390 +0,0 @@ - - - - - - - - - - - - - - Optional semi-colon separated list of one or more targets that will be built if no targets are otherwise specified - - - - - - - - - - - - - Logs an Error event - - - - - Logs a Warning event - - - - - - - - - - - - - - - - Logs an Error event - - - - - Logs a Warning event - - - - - - - - - - - - - - - - - - - - Groups tasks into a section of the build process - - - - - - - - - - - Name of the target - - - - - Optional semi-colon separated list of targets that should be run before this target - - - - - Optional semi-colon separated list of files that form inputs into this target. Their timestamps will be compared with the timestamps of files in Outputs to determine whether the Target is up to date - - - - - Optional semi-colon separated list of files that form outputs into this target. Their timestamps will be compared with the timestamps of files in Inputs to determine whether the Target is up to date - - - - - Optional expression evaluated to determine whether the Target and the targets it depends on should be run - - - - - - - Groups property definitions - - - - - - - Optional expression evaluated to determine whether the PropertyGroup should be used - - - - - - - Groups item list definitions - - - - - - - Optional expression evaluated to determine whether the ItemGroup should be used - - - - - - - Groups When and Otherwise elements - - - - - - - - - - Groups PropertyGroup and/or ItemGroup elements - - - - - - - - - - - Optional expression evaluated to determine whether the child PropertyGroups and/or ItemGroups should be used - - - - - - - Groups PropertyGroup and/or ItemGroup elements that are used if no Conditions on sibling When elements evaluate to true - - - - - - - - - - - - - Specifies targets to execute in the event of a recoverable error - - - - Optional expression evaluated to determine whether the targets should be executed - - - - - Semi-colon separated list of targets to execute - - - - - - - Logs an informational Message event, with an optional Importance - - - - Optional expression evaluated to determine whether the Message should be logged - - - - - Optional priority level. Allowed values are Low, Normal (default), and High - - - - - Text to log - - - - - - - - Optional expression evaluated to determine whether the text should be logged - - - - - Text to log - - - - - - - Declares where to load a task that will be used in the project - - - - Optional expression evaluated to determine whether the declaration should be evaluated - - - - - Optional name of assembly containing the task. Either AssemblyName or AssemblyFile must be used - - - - - Optional path to assembly containing the task. Either AssemblyName or AssemblyFile must be used - - - - - Name of task class in the assembly - - - - - - - Declares that the contents of another project file should be inserted at this location - - - - Optional expression evaluated to determine whether the import should occur - - - - - Project file to import - - - - - - - Optional section used by MSBuild hosts, that may contain arbitrary XML content that is ignored by MSBuild itself - - - - - - - - - - - - - Optional expression evaluated to determine whether the items should be evaluated - - - - - Semi-colon separated list of files (wildcards are allowed) or other item names to include in this item list - - - - - Semi-colon separated list of files (wildcards are allowed) or other item names to exclude from the Include list - - - - - - - - - - - - - - - - - - - - - - - - - Optional expression evaluated to determine whether the property should be evaluated - - - - - - - - - - - - - - Optional expression evaluated to determine whether the property should be evaluated - - - - - - - - - - - Optional element specifying a specific task output to be gathered - - - - - Task parameter to gather. Matches the name of a .NET Property on the task class that has an [Output] attribute - - - - - Optional name of an item list to put the gathered outputs into. Either ItemName or PropertyName must be specified - - - - - Optional name of a property to put the gathered output into. Either PropertyName or ItemName must be specified - - - - - Optional expression evaluated to determine whether the output should be gathered - - - - - - - - Optional expression evaluated to determine whether the task should be executed - - - - - Optional boolean indicating whether a recoverable task error should be ignored. Default false - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Engine.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Engine.dll deleted file mode 100644 index bafffcdad..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Engine.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:61ecb05653a5eb27409cd039be6bddf47402413cbb4d373aa02bded45b80b9a4 -size 236544 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Framework.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Framework.dll deleted file mode 100644 index b370f5e6a..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Framework.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd4c5235e698524278df716dae77b49e344c67e54ed17f8751f9f09a27cf0c3c -size 32768 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Tasks.Core.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Tasks.Core.dll deleted file mode 100644 index b095cc01e..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Tasks.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:61b48531d4091b14c254f9bfd3633fa0ba50f83556953d0bf82ec63d9538bd0a -size 175104 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Utilities.Core.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Utilities.Core.dll deleted file mode 100644 index e1210af51..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Utilities.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:496c80ad21aaadd684f2dbdb931a827cc1b7b1fbf2c87dbf515fbc470dc40116 -size 56832 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.dll deleted file mode 100644 index 48e400be9..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:34e8af50006c709d7324c89e814a780fe2f48e541149203a126ee5755bfd4046 -size 280576 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.xsd b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.xsd deleted file mode 100644 index e88f00f0f..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.xsd +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.CSharp.targets b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.CSharp.targets deleted file mode 100644 index 2cd20a10c..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.CSharp.targets +++ /dev/null @@ -1,142 +0,0 @@ - - - .cs - C# - - - - false - - - - - - - - $(MSBuildAllProjects);$(MSBuildToolsPath)\Microsoft.CSharp.targets - - - - true - - - - - - - - - - <_ExplicitReference Include="@(_TargetFrameworkDirectories->'%(FullPath)\mscorlib.dll')" Condition="Exists('%(FullPath)\mscorlib.dll')"> - false - - - - <_ExplicitMSCorlibPath>$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToStandardLibraries ('$(TargetFrameworkIdentifier)', '$(TargetFrameworkVersion)', '$(TargetFrameworkProfile)'))\mscorlib.dll - - - <_ExplicitReference Include="@(_TargetFrameworkDirectories->'%(FullPath)\mscorlib.dll')" Condition="Exists('%(FullPath)\mscorlib.dll')"> - false - - - - <_ExplicitReference Include="$(_ExplicitMSCorlibPath)" Condition="Exists('$(_ExplicitMSCorlibPath)')"> - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(ResolveAssemblyReferencesDependsOn);_AddCorlibReference - - - - -// <autogenerated /> -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute("$(TargetFrameworkMoniker)", FrameworkDisplayName = "$(TargetFrameworkMonikerDisplayName)")] - - - - diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Common.targets b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Common.targets deleted file mode 100644 index 43e416188..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Common.targets +++ /dev/null @@ -1,961 +0,0 @@ - - - - - true - true - - - - - - - - Exe - .exe - .exe - .dll - .netmodule - - - - $(MSBuildProjectDirectory)\ - - - - - 14.0 - - - - $(MSBuildProjectName) - $(OutputPath)\ - bin\Debug\ - - .NETFramework - v4.0 - - $(TargetFrameworkIdentifier),Version=$(TargetFrameworkVersion),Profile=$(TargetFrameworkProfile) - $(TargetFrameworkIdentifier),Version=$(TargetFrameworkVersion) - - - - $(OutputPath) - $(OutDir)\ - - <_OriginalConfiguration>$(Configuration) - Debug - $(Configuration) - - <_OriginalPlatform>$(Platform) - AnyCPU - $(Platform) - - - - - true - System.Core;$(AdditionalExplicitAssemblyReferences) - - - - true - - - - obj\ - $(BaseIntermediateOutputPath)\ - $(MSBuildProjectFile).FilesWrittenAbsolute.txt - - - - $(BaseIntermediateOutputPath)$(Configuration)\ - $(BaseIntermediateOutputPath)$(PlatformName)\$(Configuration)\ - - - - $(IntermediateOutputPath)\ - - - - - - - <_OutDirItem Include="$(OutDir)"/> - - - - $(AssemblyName) - $(TargetName)$(TargetExt) - @(_OutDirItem->'%(FullPath)') - @(_OutDirItem->'%(FullPath)\$(TargetFileName)') - $(MSBuildAllProjects);$(MSBuildProjectFullPath);$(MSBuildToolsPath)\Microsoft.Common.targets - $(AssemblyOriginatorKeyFile) - true - - - - - - - - - - - - - AssignLinkMetadata - - - - - - - - - - - - - - - - - - - - - - - - - <_EmbeddedResourceWithLinkAssigned Remove="@(_EmbeddedResourceWithLinkAssigned)" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <_TargetFrameworkDirectories Include="$(_TargetFrameworkDirectories);$(TargetFrameworkDirectory)" KeepDuplicates="false" /> - - - @(_TargetFrameworkDirectories) - - - - - - <_DesignTimeFacadeAssemblies Include="%(DesignTimeFacadeDirectories.Identity)\*.dll"/> - - - - $(TargetFrameworkDirectory);@(DesignTimeFacadeDirectories) - - - - - - - .exe; - .dll - - - - .exe.mdb; - .dll.mdb; - .pdb; - .xml - - - - {CandidateAssemblyFiles}; - $(ReferencePath); - @(AdditionalReferencePath); - {HintPathFromItem}; - {TargetFrameworkDirectory}; - {PkgConfig}; - {GAC}; - {RawFileName}; - $(OutDir) - - - - BeforeResolveReferences; - ResolveProjectReferences; - ResolveAssemblyReferences; - AfterResolveReferences - - - - GetFrameworkPaths; - GetReferenceAssemblyPaths; - PrepareForBuild - - - - - $(IntermediateOutputPath)$(TargetFrameworkMoniker).AssemblyAttribute$(DefaultLanguageSourceExtension) - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BuildOnlySettings; - BeforeBuild; - CoreBuild; - AfterBuild - - - - - - - - - - - - PrepareForBuild; - GetFrameworkPaths; - GetReferenceAssemblyPaths; - PreBuildEvent; - ResolveReferences; - CopyFilesMarkedCopyLocal; - PrepareResources; - Compile; - PrepareForRun; - DeployOutputFiles; - _RecordCleanFile; - PostBuildEvent - - - - - - - - - - - - - ResolveReferences; - GenerateTargetFrameworkMonikerAttribute; - BeforeCompile; - _TimestampBeforeCompile; - CoreCompile; - _TimestampAfterCompile; - AfterCompile - - - - - - - - - - - DeployOutputFiles - - - - - - - AssignTargetPaths; - SplitResourcesByCulture; - CreateManifestResourceNames; - CopyNonResxEmbeddedResources; - GenerateResources; - GenerateSatelliteAssemblies; - CompileLicxFiles - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BeforeRebuild; - Clean; - $(MSBuildProjectDefaultTargets); - AfterRebuild; - - - - BeforeRebuild; - Clean; - Build; - AfterRebuild; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BeforeClean; - CleanReferencedProjects; - CoreClean; - AfterClean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - $(ResolveReferencesDependsOn); - ImplicitlyExpandDesignTimeFacades - - - - $(ImplicitlyExpandDesignTimeFacadesDependsOn); - GetReferenceAssemblyPaths - - - - - - - - <_HasReferenceToSystemRuntime Condition="'$(DependsOnSystemRuntime)' == 'true' or '%(_ResolvedProjectReferencePaths.TargetPlatformIdentifier)' == 'Portable'">true - - - - - - - false - false - ImplicitlyExpandDesignTimeFacades - - <_ResolveAssemblyReferenceResolvedFiles Include="@(ReferencePath)" Condition="'%(ReferencePath.ResolvedFrom)' == 'ImplicitlyExpandDesignTimeFacades'" /> - - - - - - - - diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Common.tasks b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Common.tasks deleted file mode 100644 index 54d9caab7..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Common.tasks +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.VisualBasic.targets b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.VisualBasic.targets deleted file mode 100644 index cf35f8251..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Microsoft.VisualBasic.targets +++ /dev/null @@ -1,120 +0,0 @@ - - - .vb - VB - - - - - - - - CONFIG="$(Configuration)" - $(FinalDefineConstants),DEBUG=-1 - $(FinalDefineConstants),TRACE=-1 - $(FinalDefineConstants),_MyType="$(MyType)" - $(FinalDefineConstants),PLATFORM="$(Platform)" - $(FinalDefineConstants),PLATFORM="AnyCPU" - $(FinalDefineConstants),$(DefineConstants) - - <_NoWarnings Condition=" '$(WarningLevel)' == '0' ">true - <_NoWarnings Condition=" '$(WarningLevel)' == '1' ">false - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - vbnc.exe - - - diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Mono.XBuild.Tasks.dll b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Mono.XBuild.Tasks.dll deleted file mode 100644 index e7ee82a60..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/Mono.XBuild.Tasks.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:525e811fe28a5c2d296ff8af255cc90a918b30752543d029bcd7b38bcc21dc7e -size 36864 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/xbuild.exe b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/xbuild.exe deleted file mode 100755 index 0fd881462..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/xbuild.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c676c758a58d7e3fbd7a0b3c2de90b8b0c0acc4236a51a7c0ed5d748d50b19b7 -size 62976 diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/xbuild.exe.config b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/xbuild.exe.config deleted file mode 100644 index a1efcc318..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/xbuild.exe.config +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/xbuild.rsp b/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/xbuild.rsp deleted file mode 100644 index 9b9ce7087..000000000 --- a/Source/Platforms/Editor/Mac/Mono/lib/mono/xbuild/14.0/bin/xbuild.rsp +++ /dev/null @@ -1,3 +0,0 @@ -# xbuild command line options specified here will be used -# by xbuild on every build, unless /noautoresponse is passed -# on the command line. diff --git a/Source/Platforms/Editor/Windows/.gitignore b/Source/Platforms/Editor/Windows/.gitignore deleted file mode 100644 index 00be8b280..000000000 --- a/Source/Platforms/Editor/Windows/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -!Binaries/ -!bin/ -!*.* -*.DS_Store diff --git a/Source/Platforms/Editor/Windows/Mono/bin/csc.bat b/Source/Platforms/Editor/Windows/Mono/bin/csc.bat deleted file mode 100644 index 56fc6823d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/bin/csc.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -"%~dp0\mono.exe" %MONO_OPTIONS% "%~dp0\..\lib\mono\4.5\csc.exe" %* diff --git a/Source/Platforms/Editor/Windows/Mono/bin/mono-2.0-sgen.dll b/Source/Platforms/Editor/Windows/Mono/bin/mono-2.0-sgen.dll deleted file mode 100644 index 241309269..000000000 --- a/Source/Platforms/Editor/Windows/Mono/bin/mono-2.0-sgen.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:589c52b67e95becffe8ee2283907e612cd212c991eb19e76ecb625c745a77e31 -size 5994496 diff --git a/Source/Platforms/Editor/Windows/Mono/bin/mono.exe b/Source/Platforms/Editor/Windows/Mono/bin/mono.exe deleted file mode 100644 index 8288bd168..000000000 --- a/Source/Platforms/Editor/Windows/Mono/bin/mono.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:feff5cbd757e6fb535ce3c13307a5a2172a6aee8aa49dbb6425a4796988c92c4 -size 156160 diff --git a/Source/Platforms/Editor/Windows/Mono/etc/mono/2.0/Browsers/Compat.browser b/Source/Platforms/Editor/Windows/Mono/etc/mono/2.0/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Editor/Windows/Mono/etc/mono/2.0/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Editor/Windows/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Editor/Windows/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Editor/Windows/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Editor/Windows/Mono/etc/mono/2.0/machine.config b/Source/Platforms/Editor/Windows/Mono/etc/mono/2.0/machine.config deleted file mode 100644 index 2577c81dd..000000000 --- a/Source/Platforms/Editor/Windows/Mono/etc/mono/2.0/machine.config +++ /dev/null @@ -1,280 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
- - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Windows/Mono/etc/mono/2.0/settings.map b/Source/Platforms/Editor/Windows/Mono/etc/mono/2.0/settings.map deleted file mode 100644 index 9a52ccc02..000000000 --- a/Source/Platforms/Editor/Windows/Mono/etc/mono/2.0/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Windows/Mono/etc/mono/2.0/web.config b/Source/Platforms/Editor/Windows/Mono/etc/mono/2.0/web.config deleted file mode 100644 index e1428f8c3..000000000 --- a/Source/Platforms/Editor/Windows/Mono/etc/mono/2.0/web.config +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.0/Browsers/Compat.browser b/Source/Platforms/Editor/Windows/Mono/etc/mono/4.0/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.0/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Editor/Windows/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.0/machine.config b/Source/Platforms/Editor/Windows/Mono/etc/mono/4.0/machine.config deleted file mode 100644 index f3b71c43c..000000000 --- a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.0/machine.config +++ /dev/null @@ -1,307 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - - -
- -
-
-
-
- - - - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
-
-
-
- - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.0/settings.map b/Source/Platforms/Editor/Windows/Mono/etc/mono/4.0/settings.map deleted file mode 100644 index 4c53aca67..000000000 --- a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.0/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.0/web.config b/Source/Platforms/Editor/Windows/Mono/etc/mono/4.0/web.config deleted file mode 100644 index 2a7dfd2ed..000000000 --- a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.0/web.config +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.5/Browsers/Compat.browser b/Source/Platforms/Editor/Windows/Mono/etc/mono/4.5/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.5/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Editor/Windows/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.5/machine.config b/Source/Platforms/Editor/Windows/Mono/etc/mono/4.5/machine.config deleted file mode 100644 index 455709536..000000000 --- a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.5/machine.config +++ /dev/null @@ -1,310 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
- - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - - -
- -
-
-
-
- - - - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
-
-
-
- - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.5/settings.map b/Source/Platforms/Editor/Windows/Mono/etc/mono/4.5/settings.map deleted file mode 100644 index 4c53aca67..000000000 --- a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.5/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.5/web.config b/Source/Platforms/Editor/Windows/Mono/etc/mono/4.5/web.config deleted file mode 100644 index 324c529f0..000000000 --- a/Source/Platforms/Editor/Windows/Mono/etc/mono/4.5/web.config +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Windows/Mono/etc/mono/browscap.ini b/Source/Platforms/Editor/Windows/Mono/etc/mono/browscap.ini deleted file mode 100644 index 1267e1deb..000000000 --- a/Source/Platforms/Editor/Windows/Mono/etc/mono/browscap.ini +++ /dev/null @@ -1,16979 +0,0 @@ -;;; Provided courtesy of http://browsers.garykeith.com -;;; Created on Wednesday, June 17, 2009 at 6:30 AM GMT - -[GJK_Browscap_Version] -Version=4476 -Released=Wed, 17 Jun 2009 06:30:21 -0000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DefaultProperties - -[DefaultProperties] -Browser=DefaultProperties -Version=0 -MajorVer=0 -MinorVer=0 -Platform=unknown -Alpha=false -Beta=false -Win16=false -Win32=false -Win64=false -Frames=false -IFrames=false -Tables=false -Cookies=false -BackgroundSounds=false -CDF=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -isBanned=false -isMobileDevice=false -isSyndicationReader=false -Crawler=false -CssVersion=0 -supportsCSS=false -AOL=false -aolVersion=0 -ECMAScriptVersion=0.0 -W3CDOMVersion=0.0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ask - -[Ask] -Parent=DefaultProperties -Browser=Ask -Frames=true -Tables=true -Crawler=true - -[Mozilla/?.0 (compatible; Ask Jeeves/Teoma*)] -Parent=Ask -Browser=Teoma - -[Mozilla/2.0 (compatible; Ask Jeeves)] -Parent=Ask -Browser=AskJeeves - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Baidu - -[Baidu] -Parent=DefaultProperties -Browser=Baidu -Frames=true -Tables=true -Crawler=true - -[BaiduImageSpider*] -Parent=Baidu -Browser=BaiduImageSpider - -[Baiduspider*] -Parent=Baidu -Browser=BaiDu - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google - -[Google] -Parent=DefaultProperties -Browser=Google -Frames=true -IFrames=true -Tables=true -JavaScript=true -Crawler=true - -[* (compatible; Googlebot-Mobile/2.1; *http://www.google.com/bot.html)] -Parent=Google -Browser=Googlebot-Mobile -Frames=false -IFrames=false -Tables=false - -[*Google Wireless Transcoder*] -Parent=Google -Browser=Google Wireless Transcoder - -[AdsBot-Google (?http://www.google.com/adsbot.html)] -Parent=Google -Browser=AdsBot-Google - -[Feedfetcher-Google-iGoogleGadgets;*] -Parent=Google -Browser=iGoogleGadgets -isBanned=true -isSyndicationReader=true - -[Feedfetcher-Google;*] -Parent=Google -Browser=Feedfetcher-Google -isBanned=true -isSyndicationReader=true - -[Google OpenSocial agent (http://www.google.com/feedfetcher.html)] -Parent=Google -Browser=Google OpenSocial - -[Google-Site-Verification/1.0] -Parent=Google -Browser=Google-Site-Verification - -[Google-Sitemaps/*] -Parent=Google -Browser=Google-Sitemaps - -[Googlebot-Image/*] -Parent=Google -Browser=Googlebot-Image -CDF=true - -[googlebot-urlconsole] -Parent=Google -Browser=googlebot-urlconsole - -[Googlebot-Video/1.0] -Parent=Google -Browser=Google-Video - -[Googlebot/2.1 (?http://www.google.com/bot.html)] -Parent=Google -Browser=Googlebot - -[Googlebot/2.1 (?http://www.googlebot.com/bot.html)] -Parent=Google -Browser=Googlebot - -[Googlebot/Test*] -Parent=Google -Browser=Googlebot/Test - -[gsa-crawler*] -Parent=Google -Browser=Google Search Appliance -isBanned=true - -[Mediapartners-Google*] -Parent=Google -Browser=Mediapartners-Google - -[Mozilla/4.0 (compatible; Google Desktop)] -Parent=Google -Browser=Google Desktop - -[Mozilla/4.0 (compatible; GoogleToolbar*)] -Parent=Google -Browser=Google Toolbar -isBanned=true - -[Mozilla/5.0 (compatible; Google Keyword Tool;*)] -Parent=Google -Browser=Google Keyword Tool - -[Mozilla/5.0 (compatible; Googlebot/2.1; ?http://www.google.com/bot.html)] -Parent=Google -Browser=Google Webmaster Tools - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Inktomi - -[Inktomi] -Parent=DefaultProperties -Browser=Inktomi -Frames=true -Tables=true -Crawler=true - -[* (compatible;YahooSeeker/M1A1-R2D2; *)] -Parent=Inktomi -Browser=YahooSeeker-Mobile -Frames=false -Tables=false - -[Mozilla/4.0] -Parent=Inktomi - -[Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)] -Parent=Inktomi -Win32=true - -[Mozilla/4.0 (compatible; Yahoo Japan; for robot study; kasugiya)] -Parent=Inktomi -Browser=Yahoo! RobotStudy -isBanned=true - -[Mozilla/5.0 (compatible; BMC/1.0 (Y!J-AGENT))] -Parent=Inktomi -Browser=Y!J-AGENT/BMC - -[Mozilla/5.0 (compatible; BMF/1.0 (Y!J-AGENT))] -Parent=Inktomi -Browser=Y!J-AGENT/BMF - -[Mozilla/5.0 (compatible; BMI/1.0 (Y!J-AGENT; 1.0))] -Parent=Inktomi -Browser=Y!J-AGENT/BMI - -[Mozilla/5.0 (compatible; Yahoo! DE Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Directory Engine - -[Mozilla/5.0 (compatible; Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html)] -Parent=Inktomi -Browser=Yahoo! Slurp China - -[Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Slurp -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Slurp - -[Mozilla/5.0 (compatible; Yahoo! Verifier/1.1)] -Parent=Inktomi -Browser=Yahoo! Verifier -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Slurp/cat; slurp@inktomi.com; http://www.inktomi.com/slurp.html)] -Parent=Inktomi -Browser=Slurp/cat - -[Mozilla/5.0 (Slurp/si; slurp@inktomi.com; http://www.inktomi.com/slurp.html)] -Parent=Inktomi - -[Mozilla/5.0 (Yahoo-MMCrawler/4.0; mailto:vertical-crawl-support@yahoo-inc.com)] -Parent=Inktomi -Browser=Yahoo-MMCrawler -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Scooter/*] -Parent=Inktomi -Browser=Scooter - -[Scooter/3.3Y!CrawlX] -Parent=Inktomi -Browser=Scooter/3.3Y!CrawlX -Version=3.3 -MajorVer=3 -MinorVer=3 - -[slurp] -Parent=Inktomi -Browser=slurp - -[Y!J-BSC/1.0*] -Parent=Inktomi -Browser=Y!J-BSC -Version=1.0 -MajorVer=1 -MinorVer=0 -isBanned=true - -[Y!J-SRD/1.0] -Parent=Inktomi -Browser=Y!J-SRD -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Yahoo Mindset] -Parent=Inktomi -Browser=Yahoo Mindset - -[Yahoo Pipes*] -Parent=Inktomi -Browser=Yahoo Pipes - -[Yahoo! Mindset] -Parent=Inktomi -Browser=Yahoo! Mindset - -[Yahoo! Slurp/Site Explorer] -Parent=Inktomi -Browser=Yahoo! Site Explorer - -[Yahoo-Blogs/*] -Parent=Inktomi -Browser=Yahoo-Blogs - -[Yahoo-MMAudVid*] -Parent=Inktomi -Browser=Yahoo-MMAudVid - -[Yahoo-MMCrawler*] -Parent=Inktomi -Browser=Yahoo-MMCrawler -isBanned=true - -[YahooFeedSeeker*] -Parent=Inktomi -Browser=YahooFeedSeeker -isSyndicationReader=true -Crawler=false - -[YahooSeeker/*] -Parent=Inktomi -Browser=YahooSeeker -isMobileDevice=true - -[YahooSeeker/CafeKelsa (compatible; Konqueror/3.2; FreeBSD*) (KHTML, like Gecko)] -Parent=Inktomi -Browser=YahooSeeker/CafeKelsa - -[YahooSeeker/CafeKelsa-dev (compatible; Konqueror/3.2; FreeBSD*) (KHTML, like Gecko)] -Parent=Inktomi - -[YahooVideoSearch*] -Parent=Inktomi -Browser=YahooVideoSearch - -[YahooYSMcm*] -Parent=Inktomi -Browser=YahooYSMcm - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN - -[MSN] -Parent=DefaultProperties -Browser=MSN -Frames=true -Tables=true -Crawler=true - -[adidxbot/1.1 (?http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=adidxbot - -[librabot/1.0 (*)] -Parent=MSN -Browser=librabot - -[llssbot/1.0] -Parent=MSN -Browser=llssbot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MSMOBOT/1.1*] -Parent=MSN -Browser=msnbot-mobile -Version=1.1 -MajorVer=1 -MinorVer=1 - -[MSNBot-Academic/1.0*] -Parent=MSN -Browser=MSNBot-Academic -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot-media/1.0*] -Parent=MSN -Browser=msnbot-media -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot-media/1.1*] -Parent=MSN -Browser=msnbot-media -Version=1.1 -MajorVer=1 -MinorVer=1 - -[MSNBot-News/1.0*] -Parent=MSN -Browser=MSNBot-News -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MSNBot-NewsBlogs/1.0*] -Parent=MSN -Browser=MSNBot-NewsBlogs -Version=1 -MajorVer=1 -MinorVer=0 - -[msnbot-products] -Parent=MSN -Browser=msnbot-products - -[msnbot-webmaster/1.0 (*http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=msnbot-webmaster tools - -[msnbot/1.0*] -Parent=MSN -Browser=msnbot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot/1.1*] -Parent=MSN -Browser=msnbot -Version=1.1 -MajorVer=1 -MinorVer=1 - -[msnbot/2.0b*] -Parent=MSN -Version=2.0 -MajorVer=2 -MinorVer=0 -Beta=true - -[MSR-ISRCCrawler] -Parent=MSN -Browser=MSR-ISRCCrawler - -[renlifangbot/1.0 (?http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=renlifangbot - -[T-Mobile Dash Mozilla/4.0 (*) MSNBOT-MOBILE/1.1 (*)] -Parent=MSN -Browser=msnbot-mobile - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yahoo - -[Yahoo] -Parent=DefaultProperties -Browser=Yahoo -Frames=true -Tables=true -Crawler=true - -[Mozilla/4.0 (compatible; Y!J; for robot study*)] -Parent=Yahoo -Browser=Y!J - -[Mozilla/5.0 (Yahoo-Test/4.0*)] -Parent=Yahoo -Browser=Yahoo-Test -Version=4.0 -MajorVer=4 -MinorVer=0 - -[mp3Spider cn-search-devel at yahoo-inc dot com] -Parent=Yahoo -Browser=Yahoo! Media -isBanned=true - -[My Browser] -Parent=Yahoo -Browser=Yahoo! My Browser - -[Y!OASIS/*] -Parent=Yahoo -Browser=Y!OASIS -isBanned=true - -[YahooYSMcm/2.0.0] -Parent=Yahoo -Browser=YahooYSMcm -Version=2.0 -MajorVer=2 -MinorVer=0 -isBanned=true - -[YRL_ODP_CRAWLER] -Parent=Yahoo -Browser=YRL_ODP_CRAWLER -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yandex - -[Yandex] -Parent=DefaultProperties -Browser=Yandex -Frames=true -IFrames=true -Tables=true -Cookies=true -Crawler=true - -[Mozilla/4.0 (compatible; MSIE 5.0; YANDEX)] -Parent=Yandex - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9) Gecko VisualParser/3.0] -Parent=Yandex -Browser=VisualParser -isBanned=true - -[YaDirectBot/*] -Parent=Yandex -Browser=YaDirectBot - -[Yandex/*] -Parent=Yandex - -[YandexBlog/*] -Parent=Yandex -Browser=YandexBlog -isSyndicationReader=true - -[YandexSomething/*] -Parent=Yandex -Browser=YandexSomething -isSyndicationReader=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Best of the Web - -[Best of the Web] -Parent=DefaultProperties -Browser=Best of the Web -Frames=true -Tables=true - -[Mozilla/4.0 (compatible; BOTW Feed Grabber; *http://botw.org)] -Parent=Best of the Web -Browser=BOTW Feed Grabber -isSyndicationReader=true -Crawler=false - -[Mozilla/4.0 (compatible; BOTW Spider; *http://botw.org)] -Parent=Best of the Web -Browser=BOTW Spider -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Boitho - -[Boitho] -Parent=DefaultProperties -Browser=Boitho -Frames=true -Tables=true -Crawler=true - -[boitho.com-dc/*] -Parent=Boitho -Browser=boitho.com-dc - -[boitho.com-robot/*] -Parent=Boitho -Browser=boitho.com-robot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Convera - -[Convera] -Parent=DefaultProperties -Browser=Convera -Frames=true -Tables=true -Crawler=true - -[ConveraCrawler/*] -Parent=Convera -Browser=ConveraCrawler - -[ConveraMultiMediaCrawler/0.1*] -Parent=Convera -Browser=ConveraMultiMediaCrawler -Version=0.1 -MajorVer=0 -MinorVer=1 - -[CrawlConvera*] -Parent=Convera -Browser=CrawlConvera - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DotBot - -[DotBot] -Parent=DefaultProperties -Browser=DotBot -Frames=true -Tables=true -isBanned=true -Crawler=true - -[DotBot/* (http://www.dotnetdotcom.org/*)] -Parent=DotBot - -[Mozilla/5.0 (compatible; DotBot/*; http://www.dotnetdotcom.org/*)] -Parent=DotBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Entireweb - -[Entireweb] -Parent=DefaultProperties -Browser=Entireweb -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[Mozilla/4.0 (compatible; SpeedySpider; www.entireweb.com)] -Parent=Entireweb - -[Speedy Spider (*Beta/*)] -Parent=Entireweb - -[Speedy?Spider?(http://www.entireweb.com*)] -Parent=Entireweb - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Envolk - -[Envolk] -Parent=DefaultProperties -Browser=Envolk -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[envolk/* (?http://www.envolk.com/envolk*)] -Parent=Envolk - -[envolk?ITS?spider/* (?http://www.envolk.com/envolk*)] -Parent=Envolk - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Exalead - -[Exalead] -Parent=DefaultProperties -Browser=Exalead -Frames=true -Tables=true -isBanned=true -Crawler=true - -[Exabot-Images/1.0] -Parent=Exalead -Browser=Exabot-Images -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Exabot-Test/*] -Parent=Exalead -Browser=Exabot-Test - -[Exabot/2.0] -Parent=Exalead -Browser=Exabot - -[Exabot/3.0] -Parent=Exalead -Browser=Exabot -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Liberate - -[Exalead NG/*] -Parent=Exalead -Browser=Exalead NG -isBanned=true - -[Mozilla/5.0 (compatible; Exabot-Images/3.0;*)] -Parent=Exalead -Browser=Exabot-Images - -[Mozilla/5.0 (compatible; Exabot/3.0 (BiggerBetter/tests);*)] -Parent=Exalead -Browser=Exabot/BiggerBetter/tests - -[Mozilla/5.0 (compatible; Exabot/3.0;*)] -Parent=Exalead -Browser=Exabot -isBanned=false - -[Mozilla/5.0 (compatible; NGBot/*)] -Parent=Exalead - -[ng/*] -Parent=Exalead -Browser=Exalead Previewer -Version=1.0 -MajorVer=1 -MinorVer=0 -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fast/AllTheWeb - -[Fast/AllTheWeb] -Parent=DefaultProperties -Browser=Fast/AllTheWeb -Alpha=true -Beta=true -Win16=true -Win32=true -Win64=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -isBanned=true -isMobileDevice=true -isSyndicationReader=true -Crawler=true - -[*FAST Enterprise Crawler*] -Parent=Fast/AllTheWeb -Browser=FAST Enterprise Crawler - -[FAST Data Search Document Retriever/4.0*] -Parent=Fast/AllTheWeb -Browser=FAST Data Search Document Retriever - -[FAST MetaWeb Crawler (helpdesk at fastsearch dot com)] -Parent=Fast/AllTheWeb -Browser=FAST MetaWeb Crawler - -[Fast PartnerSite Crawler*] -Parent=Fast/AllTheWeb -Browser=FAST PartnerSite - -[FAST-WebCrawler/*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler - -[FAST-WebCrawler/*/FirstPage*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/FirstPage - -[FAST-WebCrawler/*/Fresh*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/Fresh - -[FAST-WebCrawler/*/PartnerSite*] -Parent=Fast/AllTheWeb -Browser=FAST PartnerSite - -[FAST-WebCrawler/*?Multimedia*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/Multimedia - -[FastSearch Web Crawler for*] -Parent=Fast/AllTheWeb -Browser=FastSearch Web Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Gigabot - -[Gigabot] -Parent=DefaultProperties -Browser=Gigabot -Frames=true -IFrames=true -Tables=true -Crawler=true - -[Gigabot*] -Parent=Gigabot - -[GigabotSiteSearch/*] -Parent=Gigabot -Browser=GigabotSiteSearch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ilse - -[Ilse] -Parent=DefaultProperties -Browser=Ilse -Frames=true -Tables=true -Crawler=true - -[IlseBot/*] -Parent=Ilse - -[INGRID/?.0*] -Parent=Ilse -Browser=Ilse - -[Mozilla/3.0 (INGRID/*] -Parent=Ilse -Browser=Ilse - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iVia Project - -[iVia Project] -Parent=DefaultProperties -Browser=iVia Project -Frames=true -IFrames=true -Tables=true -Crawler=true - -[DataFountains/DMOZ Downloader*] -Parent=iVia Project -Browser=DataFountains/DMOZ Downloader -isBanned=true - -[DataFountains/DMOZ Feature Vector Corpus Creator*] -Parent=iVia Project -Browser=DataFountains/DMOZ Feature Vector Corpus - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Jayde Online - -[Jayde Online] -Parent=DefaultProperties -Browser=Jayde Online -Frames=true -Tables=true -Crawler=true - -[ExactSeek Crawler/*] -Parent=Jayde Online -Browser=ExactSeek Crawler - -[exactseek-pagereaper-* (crawler@exactseek.com)] -Parent=Jayde Online -Browser=exactseek-pagereaper -isBanned=true - -[exactseek.com] -Parent=Jayde Online -Browser=exactseek.com - -[Jayde Crawler*] -Parent=Jayde Online -Browser=Jayde Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycos - -[Lycos] -Parent=DefaultProperties -Browser=Lycos -Frames=true -Tables=true -Crawler=true - -[Lycos*] -Parent=Lycos -Browser=Lycos - -[Lycos-Proxy] -Parent=Lycos -Browser=Lycos-Proxy - -[Lycos-Spider_(modspider)] -Parent=Lycos -Browser=Lycos-Spider_(modspider) - -[Lycos-Spider_(T-Rex)] -Parent=Lycos -Browser=Lycos-Spider_(T-Rex) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Naver - -[Naver] -Parent=DefaultProperties -Browser=Naver -isBanned=true -Crawler=true - -[Cowbot-* (NHN Corp*naver.com)] -Parent=Naver -Browser=Naver Cowbot - -[Mozilla/4.0 (compatible; NaverBot/*; *)] -Parent=Naver - -[Mozilla/4.0 (compatible; NaverBot/*; nhnbot@naver.com)] -Parent=Naver -Browser=Naver NaverBot - -[NaverBot-* (NHN Corp*naver.com)] -Parent=Naver -Browser=Naver NHN Corp - -[Yeti/*] -Parent=Naver -Browser=Yeti - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Snap - -[Snap] -Parent=DefaultProperties -Browser=Snap -isBanned=true -Crawler=true - -[Mozilla/5.0 (SnapPreviewBot) Gecko/* Firefox/*] -Parent=Snap - -[Snapbot/*] -Parent=Snap - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sogou - -[Sogou] -Parent=DefaultProperties -Browser=Sogou -Frames=true -Tables=true -isBanned=true -Crawler=true - -[shaboyi spider] -Parent=Sogou -Browser=Sogou/Shaboyi Spider - -[Sogou develop spider/*] -Parent=Sogou -Browser=Sogou Develop Spider - -[Sogou head spider*] -Parent=Sogou -Browser=Sogou/HEAD Spider - -[sogou js robot(*)] -Parent=Sogou - -[Sogou Orion spider/*] -Parent=Sogou -Browser=Sogou Orion spider - -[Sogou Pic Agent] -Parent=Sogou -Browser=Sogou/Image Crawler - -[Sogou Pic Spider] -Parent=Sogou -Browser=Sogou Pic Spider - -[Sogou Push Spider/*] -Parent=Sogou -Browser=Sogou Push Spider - -[sogou spider] -Parent=Sogou -Browser=Sogou/Spider - -[sogou web spider*] -Parent=Sogou -Browser=sogou web spider - -[Sogou-Test-Spider/*] -Parent=Sogou -Browser=Sogou-Test-Spider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; YodaoBot - -[YodaoBot] -Parent=DefaultProperties -Browser=YodaoBot -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[Mozilla/5.0 (compatible; YodaoBot/1.*)] -Parent=YodaoBot - -[Mozilla/5.0 (compatible;YodaoBot-Image/1.*)] -Parent=YodaoBot -Browser=YodaoBot-Image - -[WAP_Browser/5.0 (compatible; YodaoBot/1.*)] -Parent=YodaoBot - -[YodaoBot/1.* (*)] -Parent=YodaoBot - -[Best Whois (http://www.bestwhois.net/)] -Parent=DNS Tools -Browser=Best Whois - -[DNSGroup/*] -Parent=DNS Tools -Browser=DNS Group Crawler - -[NG-Search/*] -Parent=Exalead -Browser=NG-SearchBot - -[TouchStone] -Parent=Feeds Syndicators -Browser=TouchStone -isSyndicationReader=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; General Crawlers - -[General Crawlers] -Parent=DefaultProperties -Browser=General Crawlers -Crawler=true - -[A .NET Web Crawler] -Parent=General Crawlers -isBanned=true - -[BabalooSpider/1.*] -Parent=General Crawlers -Browser=BabalooSpider - -[BilgiBot/*] -Parent=General Crawlers -Browser=BilgiBot -isBanned=true - -[bot/* (bot; *bot@bot.bot)] -Parent=General Crawlers -Browser=bot -isBanned=true - -[CyberPatrol*] -Parent=General Crawlers -Browser=CyberPatrol -isBanned=true - -[Cynthia 1.0] -Parent=General Crawlers -Browser=Cynthia -Version=1.0 -MajorVer=1 -MinorVer=0 - -[ddetailsbot (http://www.displaydetails.com)] -Parent=General Crawlers -Browser=ddetailsbot - -[DomainCrawler/1.0 (info@domaincrawler.com; http://www.domaincrawler.com/domains/view/*)] -Parent=General Crawlers -Browser=DomainCrawler - -[DomainsBotBot/1.*] -Parent=General Crawlers -Browser=DomainsBotBot -isBanned=true - -[DomainsDB.net MetaCrawler*] -Parent=General Crawlers -Browser=DomainsDB - -[Drupal (*)] -Parent=General Crawlers -Browser=Drupal - -[Dumbot (version *)*] -Parent=General Crawlers -Browser=Dumbfind - -[EuripBot/*] -Parent=General Crawlers -Browser=Europe Internet Portal - -[eventax/*] -Parent=General Crawlers -Browser=eventax - -[FANGCrawl/*] -Parent=General Crawlers -Browser=Safe-t.net Web Filtering Service -isBanned=true - -[favorstarbot/*] -Parent=General Crawlers -Browser=favorstarbot -isBanned=true - -[FollowSite.com (*)] -Parent=General Crawlers -Browser=FollowSite -isBanned=true - -[Gaisbot*] -Parent=General Crawlers -Browser=Gaisbot - -[Healthbot/Health_and_Longevity_Project_(HealthHaven.com) ] -Parent=General Crawlers -Browser=Healthbot -isBanned=true - -[hitcrawler_0.*] -Parent=General Crawlers -Browser=hitcrawler -isBanned=true - -[htdig/*] -Parent=General Crawlers -Browser=ht://Dig - -[http://hilfe.acont.de/bot.html ACONTBOT] -Parent=General Crawlers -Browser=ACONTBOT -isBanned=true - -[JetBrains*] -Parent=General Crawlers -Browser=Omea Pro - -[KakleBot - www.kakle.com/0.1] -Parent=General Crawlers -Browser=KakleBot - -[KBeeBot/0.*] -Parent=General Crawlers -Browser=KBeeBot -isBanned=true - -[Keyword Density/*] -Parent=General Crawlers -Browser=Keyword Density - -[LetsCrawl.com/1.0*] -Parent=General Crawlers -Browser=LetsCrawl.com -isBanned=true - -[Lincoln State Web Browser] -Parent=General Crawlers -Browser=Lincoln State Web Browser -isBanned=true - -[Links4US-Crawler,*] -Parent=General Crawlers -Browser=Links4US-Crawler -isBanned=true - -[Lorkyll *.* -- lorkyll@444.net] -Parent=General Crawlers -Browser=Lorkyll -isBanned=true - -[Lsearch/sondeur] -Parent=General Crawlers -Browser=Lsearch/sondeur -isBanned=true - -[LucidMedia ClickSense/4.?] -Parent=General Crawlers -Browser=LucidMedia-ClickSense -isBanned=true - -[MapoftheInternet.com?(?http://MapoftheInternet.com)] -Parent=General Crawlers -Browser=MapoftheInternet -isBanned=true - -[Marvin v0.3] -Parent=General Crawlers -Browser=MedHunt -Version=0.3 -MajorVer=0 -MinorVer=3 - -[masidani_bot_v0.6*] -Parent=General Crawlers -Browser=masidani_bot - -[Metaspinner/0.01 (Metaspinner; http://www.meta-spinner.de/; support@meta-spinner.de/)] -Parent=General Crawlers -Browser=Metaspinner/0.01 -Version=0.01 -MajorVer=0 -MinorVer=01 - -[metatagsdir/*] -Parent=General Crawlers -Browser=metatagsdir -isBanned=true - -[Microsoft Windows Network Diagnostics] -Parent=General Crawlers -Browser=Microsoft Windows Network Diagnostics -isBanned=true - -[Miva (AlgoFeedback@miva.com)] -Parent=General Crawlers -Browser=Miva - -[moget/*] -Parent=General Crawlers -Browser=Goo - -[Mozdex/0.7.2*] -Parent=General Crawlers -Browser=Mozdex - -[Mozilla Compatible (MS IE 3.01 WinNT)] -Parent=General Crawlers -isBanned=true - -[Mozilla/* (compatible; WebCapture*)] -Parent=General Crawlers -Browser=WebCapture - -[Mozilla/4.0 (compatible; DepSpid/*)] -Parent=General Crawlers -Browser=DepSpid - -[Mozilla/4.0 (compatible; MSIE *; Windows NT *; SV1)] -Parent=General Crawlers -Browser=AVG - -[Mozilla/4.0 (compatible; MSIE 4.01; Vonna.com b o t)] -Parent=General Crawlers -Browser=Vonna.com -isBanned=true - -[Mozilla/4.0 (compatible; MSIE 4.01; Windows95)] -Parent=General Crawlers -Win32=true - -[Mozilla/4.0 (compatible; MSIE 4.5; Windows 98; )] -Parent=General Crawlers -Win32=true - -[Mozilla/4.0 (compatible; MyFamilyBot/*)] -Parent=General Crawlers -Browser=MyFamilyBot - -[Mozilla/4.0 (compatible; N-Stealth)] -Parent=General Crawlers -Browser=N-Stealth - -[Mozilla/4.0 (compatible; Scumbot/*; Linux/*)] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.0 (compatible; Spider; Linux)] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.0 (compatible; Win32)] -Parent=General Crawlers -Browser=Unknown Crawler -isBanned=true - -[Mozilla/4.1] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.5] -Parent=General Crawlers -isBanned=true - -[Mozilla/5.0 (*http://gnomit.com/) Gecko/* Gnomit/1.0] -Parent=General Crawlers -Browser=Gnomit -isBanned=true - -[Mozilla/5.0 (compatible; AboutUsBot/*)] -Parent=General Crawlers -Browser=AboutUsBot -isBanned=true - -[Mozilla/5.0 (compatible; BuzzRankingBot/*)] -Parent=General Crawlers -Browser=BuzzRankingBot -isBanned=true - -[Mozilla/5.0 (compatible; Diffbot/0.1; http://www.diffbot.com)] -Parent=General Crawlers -Browser=Diffbot - -[Mozilla/5.0 (compatible; FirstSearchBot/1.0; *)] -Parent=General Crawlers -Browser=FirstSearchBot - -[mozilla/5.0 (compatible; genevabot http://www.healthdash.com)] -Parent=General Crawlers -Browser=Healthdash - -[Mozilla/5.0 (compatible; JadynAveBot; *http://www.jadynave.com/robot*] -Parent=General Crawlers -Browser=JadynAveBot -isBanned=true - -[Mozilla/5.0 (compatible; Kyluka crawl; http://www.kyluka.com/crawl.html; crawl@kyluka.com)] -Parent=General Crawlers -Browser=Kyluka - -[Mozilla/5.0 (compatible; MJ12bot/v1.2.*; http://www.majestic12.co.uk/bot.php*)] -Parent=General Crawlers -Browser=MJ12bot -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (compatible; MSIE 7.0 ?http://www.europarchive.org)] -Parent=General Crawlers -Browser=Europe Web Archive - -[Mozilla/5.0 (compatible; Seznam screenshot-generator 2.0;*)] -Parent=General Crawlers -Browser=Seznam screenshot-generator -isBanned=true - -[Mozilla/5.0 (compatible; Twingly Recon; http://www.twingly.com/)] -Parent=General Crawlers -Browser=Twingly Recon - -[Mozilla/5.0 (compatible; unwrapbot/2.*; http://www.unwrap.jp*)] -Parent=General Crawlers -Browser=UnWrap - -[Mozilla/5.0 (compatible; Vermut*)] -Parent=General Crawlers -Browser=Vermut - -[Mozilla/5.0 (compatible; Webbot/*)] -Parent=General Crawlers -Browser=Webbot.ru -isBanned=true - -[n4p_bot*] -Parent=General Crawlers -Browser=n4p_bot - -[nabot*] -Parent=General Crawlers -Browser=Nabot - -[NetCarta_WebMapper/*] -Parent=General Crawlers -Browser=NetCarta_WebMapper -isBanned=true - -[NetID.com Bot*] -Parent=General Crawlers -Browser=NetID.com Bot -isBanned=true - -[neTVision AG andreas.heidoetting@thomson-webcast.net] -Parent=General Crawlers -Browser=neTVision - -[NextopiaBOT*] -Parent=General Crawlers -Browser=NextopiaBOT - -[nicebot] -Parent=General Crawlers -Browser=nicebot -isBanned=true - -[niXXieBot?Foster*] -Parent=General Crawlers -Browser=niXXiebot-Foster - -[Nozilla/P.N (Just for IDS woring)] -Parent=General Crawlers -Browser=Nozilla/P.N -isBanned=true - -[Nudelsalat/*] -Parent=General Crawlers -Browser=Nudelsalat -isBanned=true - -[NV32ts] -Parent=General Crawlers -Browser=NV32ts -isBanned=true - -[Ocelli/*] -Parent=General Crawlers -Browser=Ocelli - -[OpenTaggerBot (http://www.opentagger.com/opentaggerbot.htm)] -Parent=General Crawlers -Browser=OpenTaggerBot - -[Oracle Enterprise Search] -Parent=General Crawlers -Browser=Oracle Enterprise Search -isBanned=true - -[Oracle Ultra Search] -Parent=General Crawlers -Browser=Oracle Ultra Search - -[Pajaczek/*] -Parent=General Crawlers -Browser=Pajaczek -isBanned=true - -[panscient.com] -Parent=General Crawlers -Browser=panscient.com -isBanned=true - -[Patwebbot (http://www.herz-power.de/technik.html)] -Parent=General Crawlers -Browser=Patwebbot - -[PDFBot (crawler@pdfind.com)] -Parent=General Crawlers -Browser=PDFBot - -[Pete-Spider/1.*] -Parent=General Crawlers -Browser=Pete-Spider -isBanned=true - -[PhpDig/*] -Parent=General Crawlers -Browser=PhpDig - -[PlantyNet_WebRobot*] -Parent=General Crawlers -Browser=PlantyNet -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PluckIt - -[PluckItCrawler/1.0 (*)] -Parent=General Crawlers -isMobileDevice=true - -[PMAFind] -Parent=General Crawlers -Browser=PMAFind -isBanned=true - -[Poodle_predictor_1.0] -Parent=General Crawlers -Browser=Poodle Predictor - -[QuickFinder Crawler] -Parent=General Crawlers -Browser=QuickFinder -isBanned=true - -[Radiation Retriever*] -Parent=General Crawlers -Browser=Radiation Retriever -isBanned=true - -[RedCarpet/*] -Parent=General Crawlers -Browser=RedCarpet -isBanned=true - -[RixBot (http://babelserver.org/rix)] -Parent=General Crawlers -Browser=RixBot - -[Rome Client (http://tinyurl.com/64t5n) Ver: 0.*] -Parent=General Crawlers -Browser=TinyURL - -[SBIder/*] -Parent=General Crawlers -Browser=SiteSell - -[ScollSpider/2.*] -Parent=General Crawlers -Browser=ScollSpider -isBanned=true - -[Search Fst] -Parent=General Crawlers -Browser=Search Fst - -[searchbot admin@google.com] -Parent=General Crawlers -Browser=searchbot -isBanned=true - -[Seeker.lookseek.com] -Parent=General Crawlers -Browser=LookSeek -isBanned=true - -[semanticdiscovery/*] -Parent=General Crawlers -Browser=Semantic Discovery - -[SeznamBot/*] -Parent=General Crawlers -Browser=SeznamBot -isBanned=true - -[Shelob (shelob@gmx.net)] -Parent=General Crawlers -Browser=Shelob -isBanned=true - -[shelob v1.*] -Parent=General Crawlers -Browser=shelob -isBanned=true - -[ShopWiki/1.0*] -Parent=General Crawlers -Browser=ShopWiki -Version=1.0 -MajorVer=1 -MinorVer=0 - -[ShowXML/1.0 libwww/5.4.0] -Parent=General Crawlers -Browser=ShowXML -isBanned=true - -[sitecheck.internetseer.com*] -Parent=General Crawlers -Browser=Internetseer - -[SMBot/*] -Parent=General Crawlers -Browser=SMBot - -[sohu*] -Parent=General Crawlers -Browser=sohu-search -isBanned=true - -[SpankBot*] -Parent=General Crawlers -Browser=SpankBot -isBanned=true - -[spider (tspyyp@tom.com)] -Parent=General Crawlers -Browser=spider (tspyyp@tom.com) -isBanned=true - -[Sunrise/0.*] -Parent=General Crawlers -Browser=Sunrise -isBanned=true - -[Superpages URL Verification Engine] -Parent=General Crawlers -Browser=Superpages - -[Surf Knight] -Parent=General Crawlers -Browser=Surf Knight -isBanned=true - -[SurveyBot/*] -Parent=General Crawlers -Browser=SurveyBot -isBanned=true - -[SynapticSearch/AI Crawler 1.?] -Parent=General Crawlers -Browser=SynapticSearch -isBanned=true - -[SyncMgr] -Parent=General Crawlers -Browser=SyncMgr - -[Tagyu Agent/1.0] -Parent=General Crawlers -Browser=Tagyu - -[Talkro Web-Shot/*] -Parent=General Crawlers -Browser=Talkro Web-Shot -isBanned=true - -[Tecomi Bot (http://www.tecomi.com/bot.htm)] -Parent=General Crawlers -Browser=Tecomi - -[TheInformant*] -Parent=General Crawlers -Browser=TheInformant -isBanned=true - -[Toata dragostea*] -Parent=General Crawlers -Browser=Toata dragostea -isBanned=true - -[Tutorial Crawler*] -Parent=General Crawlers -isBanned=true - -[UbiCrawler/*] -Parent=General Crawlers -Browser=UbiCrawler - -[UCmore] -Parent=General Crawlers -Browser=UCmore - -[User*Agent:*] -Parent=General Crawlers -isBanned=true - -[USER_AGENT] -Parent=General Crawlers -Browser=USER_AGENT -isBanned=true - -[VadixBot] -Parent=General Crawlers -Browser=VadixBot - -[VengaBot/*] -Parent=General Crawlers -Browser=VengaBot -isBanned=true - -[Visicom Toolbar] -Parent=General Crawlers -Browser=Visicom Toolbar - -[W3C-WebCon/*] -Parent=General Crawlers -Browser=W3C-WebCon - -[Webclipping.com] -Parent=General Crawlers -Browser=Webclipping.com -isBanned=true - -[webcollage/*] -Parent=General Crawlers -Browser=WebCollage -isBanned=true - -[WebCrawler_1.*] -Parent=General Crawlers -Browser=WebCrawler - -[WebFilter Robot*] -Parent=General Crawlers -Browser=WebFilter Robot - -[WeBoX/*] -Parent=General Crawlers -Browser=WeBoX - -[WebTrends/*] -Parent=General Crawlers -Browser=WebTrends - -[West Wind Internet Protocols*] -Parent=General Crawlers -Browser=Versatel -isBanned=true - -[WhizBang] -Parent=General Crawlers -Browser=WhizBang - -[Willow Internet Crawler by Twotrees V*] -Parent=General Crawlers -Browser=Willow Internet Crawler - -[WIRE/* (Linux; i686; Bot,Robot,Spider,Crawler)] -Parent=General Crawlers -Browser=WIRE -isBanned=true - -[www.fi crawler, contact crawler@www.fi] -Parent=General Crawlers -Browser=www.fi crawler - -[Xerka WebBot v1.*] -Parent=General Crawlers -Browser=Xerka -isBanned=true - -[XML Sitemaps Generator*] -Parent=General Crawlers -Browser=XML Sitemaps Generator - -[XSpider*] -Parent=General Crawlers -Browser=XSpider -isBanned=true - -[YooW!/* (?http://www.yoow.eu)] -Parent=General Crawlers -Browser=YooW! -isBanned=true - -[HiddenMarket-*] -Parent=General RSS -Browser=HiddenMarket -isBanned=true - -[FOTOCHECKER] -Parent=Image Crawlers -Browser=FOTOCHECKER -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Search Engines - -[Search Engines] -Parent=DefaultProperties -Browser=Search Engines -Crawler=true - -[*FDSE robot*] -Parent=Search Engines -Browser=FDSE Robot - -[*Fluffy the spider*] -Parent=Search Engines -Browser=SearchHippo - -[Abacho*] -Parent=Search Engines -Browser=Abacho - -[ah-ha.com crawler (crawler@ah-ha.com)] -Parent=Search Engines -Browser=Ah-Ha - -[AIBOT/*] -Parent=Search Engines -Browser=21Seek.Com - -[ALeadSoftbot/*] -Parent=Search Engines -Browser=ALeadSoftbot - -[Amfibibot/*] -Parent=Search Engines -Browser=Amfibi - -[AnswerBus (http://www.answerbus.com/)] -Parent=Search Engines - -[antibot-V*] -Parent=Search Engines -Browser=antibot - -[appie*(www.walhello.com)] -Parent=Search Engines -Browser=Walhello - -[ASPSeek/*] -Parent=Search Engines -Browser=ASPSeek - -[BigCliqueBOT/*] -Parent=Search Engines -Browser=BigClique.com/BigClic.com - -[Blaiz-Bee/*] -Parent=Search Engines -Browser=RawGrunt - -[btbot/*] -Parent=Search Engines -Browser=Bit Torrent Search Engine - -[Busiversebot/v1.0 (http://www.busiverse.com/bot.php)] -Parent=Search Engines -Browser=Busiversebot -isBanned=true - -[CatchBot/*; http://www.catchbot.com] -Parent=Search Engines -Browser=CatchBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[CipinetBot (http://www.cipinet.com/bot.html)] -Parent=Search Engines -Browser=CipinetBot - -[Cogentbot/1.?*] -Parent=Search Engines -Browser=Cogentbot - -[compatible; Mozilla 4.0; MSIE 5.5; (SqwidgeBot v1.01 - http://www.sqwidge.com/bot/)] -Parent=Search Engines -Browser=SqwidgeBot - -[cosmos*] -Parent=Search Engines -Browser=Xyleme - -[Deepindex] -Parent=Search Engines -Browser=Deepindex - -[DiamondBot] -Parent=Search Engines -Browser=DiamondBot - -[Dumbot*] -Parent=Search Engines -Browser=Dumbot -Version=0.2 -MajorVer=0 -MinorVer=2 -Beta=true - -[Eule?Robot*] -Parent=Search Engines -Browser=Eule-Robot - -[Faxobot/*] -Parent=Search Engines -Browser=Faxo - -[Filangy/*] -Parent=Search Engines -Browser=Filangy - -[flatlandbot/*] -Parent=Search Engines -Browser=Flatland - -[Fooky.com/ScorpionBot/ScoutOut;*] -Parent=Search Engines -Browser=ScorpionBot -isBanned=true - -[FyberSpider*] -Parent=Search Engines -Browser=FyberSpider -isBanned=true - -[Gaisbot/*] -Parent=Search Engines -Browser=Gaisbot - -[gazz/*(gazz@nttr.co.jp)] -Parent=Search Engines -Browser=gazz - -[geniebot*] -Parent=Search Engines -Browser=GenieKnows - -[GOFORITBOT (?http://www.goforit.com/about/?)] -Parent=Search Engines -Browser=GoForIt - -[GoGuidesBot/*] -Parent=Search Engines -Browser=GoGuidesBot - -[GroschoBot/*] -Parent=Search Engines -Browser=GroschoBot - -[GurujiBot/1.*] -Parent=Search Engines -Browser=GurujiBot -isBanned=true - -[HenryTheMiragoRobot*] -Parent=Search Engines -Browser=Mirago - -[HolmesBot (http://holmes.ge)] -Parent=Search Engines -Browser=HolmesBot - -[Hotzonu/*] -Parent=Search Engines -Browser=Hotzonu - -[HyperEstraier/*] -Parent=Search Engines -Browser=HyperEstraier -isBanned=true - -[i1searchbot/*] -Parent=Search Engines -Browser=i1searchbot - -[IIITBOT/1.*] -Parent=Search Engines -Browser=Indian Language Web Search Engine - -[Iltrovatore-?etaccio/*] -Parent=Search Engines -Browser=Iltrovatore-Setaccio - -[InfociousBot (?http://corp.infocious.com/tech_crawler.php)] -Parent=Search Engines -Browser=InfociousBot -isBanned=true - -[Infoseek SideWinder/*] -Parent=Search Engines -Browser=Infoseek - -[iSEEKbot/*] -Parent=Search Engines -Browser=iSEEKbot - -[Knight/0.? (Zook Knight; http://knight.zook.in/; knight@zook.in)] -Parent=Search Engines -Browser=Knight - -[Kolinka Forum Search (www.kolinka.com)] -Parent=Search Engines -Browser=Kolinka Forum Search -isBanned=true - -[KRetrieve/] -Parent=Search Engines -Browser=KRetrieve -isBanned=true - -[LapozzBot/*] -Parent=Search Engines -Browser=LapozzBot - -[Linknzbot*] -Parent=Search Engines -Browser=Linknzbot - -[LocalcomBot/*] -Parent=Search Engines -Browser=LocalcomBot - -[Mail.Ru/1.0] -Parent=Search Engines -Browser=Mail.Ru - -[MaSagool/*] -Parent=Search Engines -Browser=Sagoo -Version=1.0 -MajorVer=1 -MinorVer=0 - -[miniRank/*] -Parent=Search Engines -Browser=miniRank - -[Mnogosearch*] -Parent=Search Engines -Browser=Mnogosearch - -[Mozilla/0.9* no dos :) (Linux)] -Parent=Search Engines -Browser=goliat -isBanned=true - -[Mozilla/4.0 (compatible; Arachmo)] -Parent=Search Engines -Browser=Arachmo - -[Mozilla/4.0 (compatible; http://search.thunderstone.com/texis/websearch/about.html)] -Parent=Search Engines -Browser=ThunderStone -isBanned=true - -[Mozilla/4.0 (compatible; MSIE *; Windows NT; Girafabot; girafabot at girafa dot com; http://www.girafa.com)] -Parent=Search Engines -Browser=Girafabot -Win32=true - -[Mozilla/4.0 (compatible; Vagabondo/*; webcrawler at wise-guys dot nl; *)] -Parent=Search Engines -Browser=Vagabondo - -[Mozilla/4.0(?compatible; MSIE 6.0; Qihoo *)] -Parent=Search Engines -Browser=Qihoo - -[Mozilla/4.7 (compatible; WhizBang; http://www.whizbang.com/crawler)] -Parent=Search Engines -Browser=Inxight Software - -[Mozilla/5.0 (*) VoilaBot*] -Parent=Search Engines -Browser=VoilaBot -isBanned=true - -[Mozilla/5.0 (compatible; ActiveTouristBot*; http://www.activetourist.com)] -Parent=Search Engines -Browser=ActiveTouristBot - -[Mozilla/5.0 (compatible; Butterfly/1.0; *)*] -Parent=Search Engines -Browser=Butterfly - -[Mozilla/5.0 (compatible; Charlotte/*; *)] -Parent=Search Engines -Browser=Charlotte -Beta=true -isBanned=true - -[Mozilla/5.0 (compatible; CXL-FatAssANT*)] -Parent=Search Engines -Browser=FatAssANT - -[Mozilla/5.0 (compatible; DBLBot/1.0; ?http://www.dontbuylists.com/)] -Parent=Search Engines -Browser=DBLBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (compatible; EARTHCOM.info/*)] -Parent=Search Engines -Browser=EARTHCOM - -[Mozilla/5.0 (compatible; Lipperhey Spider; http://www.lipperhey.com/)] -Parent=Search Engines -Browser=Lipperhey Spider - -[Mozilla/5.0 (compatible; MojeekBot/*; http://www.mojeek.com/bot.html)] -Parent=Search Engines -Browser=MojeekBot - -[Mozilla/5.0 (compatible; NLCrawler/*] -Parent=Search Engines -Browser=Northern Light Web Search - -[Mozilla/5.0 (compatible; OsO;*] -Parent=Search Engines -Browser=Octopodus -isBanned=true - -[Mozilla/5.0 (compatible; Pogodak.*)] -Parent=Search Engines -Browser=Pogodak - -[Mozilla/5.0 (compatible; Quantcastbot/1.*)] -Parent=Search Engines -Browser=Quantcastbot - -[Mozilla/5.0 (compatible; ScoutJet; *http://www.scoutjet.com/)] -Parent=Search Engines -Browser=ScoutJet - -[Mozilla/5.0 (compatible; Scrubby/*; http://www.scrubtheweb.com/abs/meta-check.html)] -Parent=Search Engines -Browser=Scrubby -isBanned=true - -[Mozilla/5.0 (compatible; YoudaoBot/1.*; http://www.youdao.com/help/webmaster/spider/*)] -Parent=Search Engines -Browser=YoudaoBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Twiceler*)] -Parent=Search Engines -Browser=Twiceler -isBanned=true - -[Mozilla/5.0 CostaCider Search*] -Parent=Search Engines -Browser=CostaCider Search - -[Mozilla/5.0 GurujiBot/1.0 (*)] -Parent=Search Engines -Browser=GurujiBot - -[NavissoBot] -Parent=Search Engines -Browser=NavissoBot - -[NextGenSearchBot*(for information visit *)] -Parent=Search Engines -Browser=ZoomInfo -isBanned=true - -[Norbert the Spider(Burf.com)] -Parent=Search Engines -Browser=Norbert the Spider - -[NuSearch Spider*] -Parent=Search Engines -Browser=nuSearch - -[ObjectsSearch/*] -Parent=Search Engines -Browser=ObjectsSearch - -[OpenISearch/1.*] -Parent=Search Engines -Browser=OpenISearch (Amazon) - -[Pagebull http://www.pagebull.com/] -Parent=Search Engines -Browser=Pagebull - -[PEERbot*] -Parent=Search Engines -Browser=PEERbot - -[Pompos/*] -Parent=Search Engines -Browser=Pompos - -[Popdexter/*] -Parent=Search Engines -Browser=Popdex - -[Qweery*] -Parent=Search Engines -Browser=QweeryBot - -[RedCell/* (*)] -Parent=Search Engines -Browser=RedCell - -[Scrubby/*] -Parent=Search Engines -Browser=Scrub The Web - -[Search-10/*] -Parent=Search Engines -Browser=Search-10 - -[search.ch*] -Parent=Search Engines -Browser=Swiss Search Engine - -[Searchmee! Spider*] -Parent=Search Engines -Browser=Searchmee! - -[Seekbot/*] -Parent=Search Engines -Browser=Seekbot - -[SiteSpider (http://www.SiteSpider.com/)] -Parent=Search Engines -Browser=SiteSpider - -[Spinne/*] -Parent=Search Engines -Browser=Spinne - -[sproose/*] -Parent=Search Engines -Browser=Sproose - -[Sqeobot/0.*] -Parent=Search Engines -Browser=Branzel -isBanned=true - -[SquigglebotBot/*] -Parent=Search Engines -Browser=SquigglebotBot -isBanned=true - -[StackRambler/*] -Parent=Search Engines -Browser=StackRambler - -[SygolBot*] -Parent=Search Engines -Browser=SygolBot - -[SynoBot] -Parent=Search Engines -Browser=SynoBot - -[Szukacz/*] -Parent=Search Engines -Browser=Szukacz - -[Tarantula/*] -Parent=Search Engines -Browser=Tarantula -isBanned=true - -[TerrawizBot/*] -Parent=Search Engines -Browser=TerrawizBot -isBanned=true - -[Tkensaku/*] -Parent=Search Engines -Browser=Tkensaku - -[TMCrawler] -Parent=Search Engines -Browser=TMCrawler -isBanned=true - -[Twingly Recon] -Parent=Search Engines -Browser=Twingly Recon -isBanned=true - -[updated/*] -Parent=Search Engines -Browser=Updated! - -[URL Spider Pro/*] -Parent=Search Engines -Browser=URL Spider Pro - -[URL Spider SQL*] -Parent=Search Engines -Browser=Innerprise Enterprise Search - -[VMBot/*] -Parent=Search Engines -Browser=VMBot - -[voyager/2.0 (http://www.kosmix.com/html/crawler.html)] -Parent=Search Engines -Browser=Voyager - -[wadaino.jp-crawler*] -Parent=Search Engines -Browser=wadaino.jp -isBanned=true - -[WebAlta Crawler/*] -Parent=Search Engines -Browser=WebAlta Crawler -isBanned=true - -[WebCorp/*] -Parent=Search Engines -Browser=WebCorp -isBanned=true - -[webcrawl.net] -Parent=Search Engines -Browser=webcrawl.net - -[WISEbot/*] -Parent=Search Engines -Browser=WISEbot -isBanned=true - -[Wotbox/*] -Parent=Search Engines -Browser=Wotbox - -[www.zatka.com] -Parent=Search Engines -Browser=Zatka - -[WWWeasel Robot v*] -Parent=Search Engines -Browser=World Wide Weasel - -[YadowsCrawler*] -Parent=Search Engines -Browser=YadowsCrawler - -[YodaoBot/*] -Parent=Search Engines -Browser=YodaoBot -isBanned=true - -[ZeBot_www.ze.bz*] -Parent=Search Engines -Browser=ZE.bz - -[zibber-v*] -Parent=Search Engines -Browser=Zibb - -[ZipppBot/*] -Parent=Search Engines -Browser=ZipppBot - -[ATA-Translation-Service] -Parent=Translators -Browser=ATA-Translation-Service - -[GJK_Browser_Check] -Parent=Version Checkers -Browser=GJK_Browser_Check - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Hatena - -[Hatena] -Parent=DefaultProperties -Browser=Hatena -isBanned=true -Crawler=true - -[Feed::Find/*] -Parent=Hatena -Browser=Feed Find -isSyndicationReader=true - -[Hatena Antenna/*] -Parent=Hatena -Browser=Hatena Antenna - -[Hatena Bookmark/*] -Parent=Hatena -Browser=Hatena Bookmark - -[Hatena RSS/*] -Parent=Hatena -Browser=Hatena RSS -isSyndicationReader=true - -[Hatena::Crawler/*] -Parent=Hatena -Browser=Hatena Crawler - -[HatenaScreenshot*] -Parent=Hatena -Browser=HatenaScreenshot - -[URI::Fetch/*] -Parent=Hatena -Browser=URI::Fetch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Internet Archive - -[Internet Archive] -Parent=DefaultProperties -Browser=Internet Archive -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*heritrix*] -Parent=Internet Archive -Browser=Heritrix -isBanned=true - -[ia_archiver*] -Parent=Internet Archive -Browser=Internet Archive - -[InternetArchive/*] -Parent=Internet Archive -Browser=InternetArchive - -[Mozilla/5.0 (compatible; archive.org_bot/1.*)] -Parent=Internet Archive - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nutch - -[Nutch] -Parent=DefaultProperties -Browser=Nutch -isBanned=true -Crawler=true - -[*Nutch*] -Parent=Nutch -isBanned=true - -[CazoodleBot/*] -Parent=Nutch -Browser=CazoodleBot - -[LOOQ/0.1*] -Parent=Nutch -Browser=LOOQ - -[Nutch/0.? (OpenX Spider)] -Parent=Nutch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Webaroo - -[Webaroo] -Parent=DefaultProperties -Browser=Webaroo - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Webaroo/*)] -Parent=Webaroo -Browser=Webaroo - -[Mozilla/5.0 (Windows; U; Windows *; *; rv:*) Gecko/* Firefox/* webaroo/*] -Parent=Webaroo -Browser=Webaroo - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Word Press - -[Word Press] -Parent=DefaultProperties -Browser=Word Press -Alpha=true -Beta=true -Win16=true -Win32=true -Win64=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -isBanned=true -isMobileDevice=true -isSyndicationReader=true -Crawler=true - -[WordPress-B-/2.*] -Parent=Word Press -Browser=WordPress-B - -[WordPress-Do-P-/2.*] -Parent=Word Press -Browser=WordPress-Do-P - -[BlueCoat ProxySG] -Parent=Blue Coat Systems -Browser=BlueCoat ProxySG - -[CerberianDrtrs/*] -Parent=Blue Coat Systems -Browser=Cerberian - -[Inne: Mozilla/4.0 (compatible; Cerberian Drtrs*)] -Parent=Blue Coat Systems -Browser=Cerberian - -[Mozilla/4.0 (compatible; Cerberian Drtrs*)] -Parent=Blue Coat Systems -Browser=Cerberian - -[Mozilla/4.0 (compatible; MSIE 6.0; Bluecoat DRTR)] -Parent=Blue Coat Systems -Browser=Bluecoat - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Copyright/Plagiarism - -[Copyright/Plagiarism] -Parent=DefaultProperties -Browser=Copyright/Plagiarism -isBanned=true -Crawler=true - -[BDFetch] -Parent=Copyright/Plagiarism -Browser=BDFetch - -[copyright sheriff (*)] -Parent=Copyright/Plagiarism -Browser=copyright sheriff - -[CopyRightCheck*] -Parent=Copyright/Plagiarism -Browser=CopyRightCheck - -[FairAd Client*] -Parent=Copyright/Plagiarism -Browser=FairAd Client - -[iCopyright Conductor*] -Parent=Copyright/Plagiarism -Browser=iCopyright Conductor - -[IPiumBot laurion(dot)com] -Parent=Copyright/Plagiarism -Browser=IPiumBot - -[IWAgent/*] -Parent=Copyright/Plagiarism -Browser=Brand Protect - -[Mozilla/5.0 (compatible; DKIMRepBot/*)] -Parent=Copyright/Plagiarism -Browser=DKIMRepBot - -[oBot] -Parent=Copyright/Plagiarism -Browser=oBot - -[SlySearch/*] -Parent=Copyright/Plagiarism -Browser=SlySearch - -[TurnitinBot/*] -Parent=Copyright/Plagiarism -Browser=TurnitinBot - -[TutorGigBot/*] -Parent=Copyright/Plagiarism -Browser=TutorGig - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DNS Tools - -[DNS Tools] -Parent=DefaultProperties -Browser=DNS Tools -Crawler=true - -[Domain Dossier utility*] -Parent=DNS Tools -Browser=Domain Dossier - -[Mozilla/5.0 (compatible; DNS-Digger/*)] -Parent=DNS Tools -Browser=DNS-Digger - -[OpenDNS Domain Crawler noc@opendns.com] -Parent=DNS Tools -Browser=OpenDNS Domain Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Download Managers - -[Download Managers] -Parent=DefaultProperties -Browser=Download Managers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[AndroidDownloadManager] -Parent=Download Managers -Browser=Android Download Manager - -[AutoMate5] -Parent=Download Managers -Browser=AutoMate5 - -[Beamer*] -Parent=Download Managers -Browser=Beamer - -[BitBeamer/*] -Parent=Download Managers -Browser=BitBeamer - -[BitTorrent/*] -Parent=Download Managers -Browser=BitTorrent - -[DA *] -Parent=Download Managers -Browser=Download Accelerator - -[Download Demon*] -Parent=Download Managers -Browser=Download Demon - -[Download Express*] -Parent=Download Managers -Browser=Download Express - -[Download Master*] -Parent=Download Managers -Browser=Download Master - -[Download Ninja*] -Parent=Download Managers -Browser=Download Ninja - -[Download Wonder*] -Parent=Download Managers -Browser=Download Wonder - -[DownloadSession*] -Parent=Download Managers -Browser=DownloadSession - -[EasyDL/*] -Parent=Download Managers -Browser=EasyDL - -[FDM 1.x] -Parent=Download Managers -Browser=Free Download Manager - -[FlashGet] -Parent=Download Managers -Browser=FlashGet - -[FreshDownload/*] -Parent=Download Managers -Browser=FreshDownload - -[GetRight/*] -Parent=Download Managers -Browser=GetRight - -[GetRightPro/*] -Parent=Download Managers -Browser=GetRightPro - -[GetSmart/*] -Parent=Download Managers -Browser=GetSmart - -[Go!Zilla*] -Parent=Download Managers -Browser=GoZilla - -[Gozilla/*] -Parent=Download Managers -Browser=Gozilla - -[Internet Ninja*] -Parent=Download Managers -Browser=Internet Ninja - -[Kontiki Client*] -Parent=Download Managers -Browser=Kontiki Client - -[lftp/3.2.1] -Parent=Download Managers -Browser=lftp - -[LightningDownload/*] -Parent=Download Managers -Browser=LightningDownload - -[LMQueueBot/*] -Parent=Download Managers -Browser=LMQueueBot - -[MetaProducts Download Express/*] -Parent=Download Managers -Browser=Download Express - -[Mozilla/4.0 (compatible; Getleft*)] -Parent=Download Managers -Browser=Getleft - -[Myzilla] -Parent=Download Managers -Browser=Myzilla - -[Net Vampire/*] -Parent=Download Managers -Browser=Net Vampire - -[Net_Vampire*] -Parent=Download Managers -Browser=Net_Vampire - -[NetAnts*] -Parent=Download Managers -Browser=NetAnts - -[NetPumper*] -Parent=Download Managers -Browser=NetPumper - -[NetSucker*] -Parent=Download Managers -Browser=NetSucker - -[NetZip Downloader*] -Parent=Download Managers -Browser=NetZip Downloader - -[NexTools WebAgent*] -Parent=Download Managers -Browser=NexTools WebAgent - -[Offline Downloader*] -Parent=Download Managers -Browser=Offline Downloader - -[P3P Client] -Parent=Download Managers -Browser=P3P Client - -[PageDown*] -Parent=Download Managers -Browser=PageDown - -[PicaLoader*] -Parent=Download Managers -Browser=PicaLoader - -[Prozilla*] -Parent=Download Managers -Browser=Prozilla - -[RealDownload/*] -Parent=Download Managers -Browser=RealDownload - -[sEasyDL/*] -Parent=Download Managers -Browser=EasyDL - -[shareaza*] -Parent=Download Managers -Browser=shareaza - -[SmartDownload/*] -Parent=Download Managers -Browser=SmartDownload - -[SpeedDownload/*] -Parent=Download Managers -Browser=Speed Download - -[Star*Downloader/*] -Parent=Download Managers -Browser=StarDownloader - -[STEROID Download] -Parent=Download Managers -Browser=STEROID Download - -[SuperBot/*] -Parent=Download Managers -Browser=SuperBot - -[Vegas95/*] -Parent=Download Managers -Browser=Vegas95 - -[WebZIP*] -Parent=Download Managers -Browser=WebZIP - -[Wget*] -Parent=Download Managers -Browser=Wget - -[WinTools] -Parent=Download Managers -Browser=WinTools - -[Xaldon WebSpider*] -Parent=Download Managers -Browser=Xaldon WebSpider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; E-Mail Harvesters - -[E-Mail Harvesters] -Parent=DefaultProperties -Browser=E-Mail Harvesters -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*E-Mail Address Extractor*] -Parent=E-Mail Harvesters -Browser=E-Mail Address Extractor - -[*Larbin*] -Parent=E-Mail Harvesters -Browser=Larbin - -[*www4mail/*] -Parent=E-Mail Harvesters -Browser=www4mail - -[8484 Boston Project*] -Parent=E-Mail Harvesters -Browser=8484 Boston Project - -[CherryPicker*/*] -Parent=E-Mail Harvesters -Browser=CherryPickerElite - -[Chilkat/*] -Parent=E-Mail Harvesters -Browser=Chilkat - -[ContactBot/*] -Parent=E-Mail Harvesters -Browser=ContactBot - -[eCatch*] -Parent=E-Mail Harvesters -Browser=eCatch - -[EmailCollector*] -Parent=E-Mail Harvesters -Browser=E-Mail Collector - -[EMAILsearcher] -Parent=E-Mail Harvesters -Browser=EMAILsearcher - -[EmailSiphon*] -Parent=E-Mail Harvesters -Browser=E-Mail Siphon - -[EmailWolf*] -Parent=E-Mail Harvesters -Browser=EMailWolf - -[Epsilon SoftWorks' MailMunky] -Parent=E-Mail Harvesters -Browser=MailMunky - -[ExtractorPro*] -Parent=E-Mail Harvesters -Browser=ExtractorPro - -[Franklin Locator*] -Parent=E-Mail Harvesters -Browser=Franklin Locator - -[Missigua Locator*] -Parent=E-Mail Harvesters -Browser=Missigua Locator - -[Mozilla/4.0 (compatible; Advanced Email Extractor*)] -Parent=E-Mail Harvesters -Browser=Advanced Email Extractor - -[Netprospector*] -Parent=E-Mail Harvesters -Browser=Netprospector - -[ProWebWalker*] -Parent=E-Mail Harvesters -Browser=ProWebWalker - -[sna-0.0.*] -Parent=E-Mail Harvesters -Browser=Mike Elliott's E-Mail Harvester - -[WebEnhancer*] -Parent=E-Mail Harvesters -Browser=WebEnhancer - -[WebMiner*] -Parent=E-Mail Harvesters -Browser=WebMiner - -[ZIBB Crawler (email address / WWW address)] -Parent=E-Mail Harvesters -Browser=ZIBB Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Feeds Blogs - -[Feeds Blogs] -Parent=DefaultProperties -Browser=Feeds Blogs -isSyndicationReader=true -Crawler=true - -[Bloglines Title Fetch/*] -Parent=Feeds Blogs -Browser=Bloglines Title Fetch - -[Bloglines/* (http://www.bloglines.com*)] -Parent=Feeds Blogs -Browser=BlogLines Web - -[BlogPulseLive (support@blogpulse.com)] -Parent=Feeds Blogs -Browser=BlogPulseLive - -[blogsearchbot-pumpkin-2] -Parent=Feeds Blogs -Browser=blogsearchbot-pumpkin -isSyndicationReader=false - -[Irish Blogs Aggregator/*1.0*] -Parent=Feeds Blogs -Browser=Irish Blogs Aggregator -Version=1.0 -MajorVer=1 -MinorVer=0 - -[kinjabot (http://www.kinja.com; *)] -Parent=Feeds Blogs -Browser=kinjabot - -[Net::Trackback/*] -Parent=Feeds Blogs -Browser=Net::Trackback - -[Reblog*] -Parent=Feeds Blogs -Browser=Reblog - -[WordPress/*] -Parent=Feeds Blogs -Browser=WordPress - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Feeds Syndicators - -[Feeds Syndicators] -Parent=DefaultProperties -Browser=Feeds Syndicators -isSyndicationReader=true - -[*LinkLint*] -Parent=Feeds Syndicators -Browser=LinkLint - -[*NetNewsWire/*] -Parent=Feeds Syndicators - -[*NetVisualize*] -Parent=Feeds Syndicators -Browser=NetVisualize - -[AideRSS 2.* (postrank.com)] -Parent=Feeds Syndicators -Browser=AideRSS - -[AideRSS/2.0 (aiderss.com)] -Parent=Feeds Syndicators -Browser=AideRSS -isBanned=true - -[Akregator/*] -Parent=Feeds Syndicators -Browser=Akregator - -[AppleSyndication/*] -Parent=Feeds Syndicators -Browser=Safari RSS -Platform=MacOSX - -[Cocoal.icio.us/* (*)*] -Parent=Feeds Syndicators -Browser=Cocoal.icio.us -isBanned=true - -[Feed43 Proxy/* (*)] -Parent=Feeds Syndicators -Browser=Feed For Free - -[FeedBurner/*] -Parent=Feeds Syndicators -Browser=FeedBurner - -[FeedDemon/* (*)] -Parent=Feeds Syndicators -Browser=FeedDemon -Platform=Win32 - -[FeedDigest/* (*)] -Parent=Feeds Syndicators -Browser=FeedDigest - -[FeedGhost/1.*] -Parent=Feeds Syndicators -Browser=FeedGhost -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedOnFeeds/0.1.* ( http://minutillo.com/steve/feedonfeeds/)] -Parent=Feeds Syndicators -Browser=FeedOnFeeds -Version=0.1 -MajorVer=0 -MinorVer=1 - -[Feedreader * (Powered by Newsbrain)] -Parent=Feeds Syndicators -Browser=Newsbrain - -[Feedshow/* (*)] -Parent=Feeds Syndicators -Browser=Feedshow - -[Feedster Crawler/?.0; Feedster, Inc.] -Parent=Feeds Syndicators -Browser=Feedster - -[GreatNews/1.0] -Parent=Feeds Syndicators -Browser=GreatNews -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Gregarius/*] -Parent=Feeds Syndicators -Browser=Gregarius - -[intraVnews/*] -Parent=Feeds Syndicators -Browser=intraVnews - -[JetBrains Omea Reader*] -Parent=Feeds Syndicators -Browser=Omea Reader -isBanned=true - -[Liferea/1.5* (Linux; *; http://liferea.sf.net/)] -Parent=Feeds Syndicators -Browser=Liferea -isBanned=true - -[livedoor FeedFetcher/0.0* (http://reader.livedoor.com/;*)] -Parent=Feeds Syndicators -Browser=FeedFetcher -Version=0.0 -MajorVer=0 -MinorVer=0 - -[MagpieRSS/* (*)] -Parent=Feeds Syndicators -Browser=MagpieRSS - -[Mobitype * (compatible; Mozilla/*; MSIE *.*; Windows *)] -Parent=Feeds Syndicators -Browser=Mobitype -Platform=Win32 - -[Mozilla/5.0 (*; Rojo *; http://www.rojo.com/corporate/help/agg; *)*] -Parent=Feeds Syndicators -Browser=Rojo - -[Mozilla/5.0 (*aggregator:TailRank; http://tailrank.com/robot)*] -Parent=Feeds Syndicators -Browser=TailRank - -[Mozilla/5.0 (compatible; MSIE 6.0; Podtech Network; crawler_admin@podtech.net)] -Parent=Feeds Syndicators -Browser=Podtech Network - -[Mozilla/5.0 (compatible; Newz Crawler *; http://www.newzcrawler.com/?)] -Parent=Feeds Syndicators -Browser=Newz Crawler - -[Mozilla/5.0 (compatible; RSSMicro.com RSS/Atom Feed Robot)] -Parent=Feeds Syndicators -Browser=RSSMicro - -[Mozilla/5.0 (compatible;*newstin.com;*)] -Parent=Feeds Syndicators -Browser=NewsTin - -[Mozilla/5.0 (RSS Reader Panel)] -Parent=Feeds Syndicators -Browser=RSS Reader Panel - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:FeedParser; *) Gecko/*] -Parent=Feeds Syndicators -Browser=FeedParser - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:NewsMonster; *) Gecko/*] -Parent=Feeds Syndicators -Browser=NewsMonster - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:Rojo; *) Gecko/*] -Parent=Feeds Syndicators -Browser=Rojo - -[Netvibes (*)] -Parent=Feeds Syndicators -Browser=Netvibes - -[NewsAlloy/* (*)] -Parent=Feeds Syndicators -Browser=NewsAlloy - -[Omnipelagos*] -Parent=Feeds Syndicators -Browser=Omnipelagos - -[Particls] -Parent=Feeds Syndicators -Browser=Particls - -[Protopage/* (*)] -Parent=Feeds Syndicators -Browser=Protopage - -[PubSub-RSS-Reader/* (*)] -Parent=Feeds Syndicators -Browser=PubSub-RSS-Reader - -[RSS Menu/*] -Parent=Feeds Syndicators -Browser=RSS Menu - -[RssBandit/*] -Parent=Feeds Syndicators -Browser=RssBandit - -[RssBar/1.2*] -Parent=Feeds Syndicators -Browser=RssBar -Version=1.2 -MajorVer=1 -MinorVer=2 - -[SharpReader/*] -Parent=Feeds Syndicators -Browser=SharpReader - -[SimplePie/*] -Parent=Feeds Syndicators -Browser=SimplePie - -[Strategic Board Bot (?http://www.strategicboard.com)] -Parent=Feeds Syndicators -Browser=Strategic Board Bot -isBanned=true - -[TargetYourNews.com bot] -Parent=Feeds Syndicators -Browser=TargetYourNews - -[Technoratibot/*] -Parent=Feeds Syndicators -Browser=Technoratibot - -[Tumblr/* RSS syndication ( http://www.tumblr.com/) (support@tumblr.com)] -Parent=Feeds Syndicators -Browser=Tumblr RSS syndication - -[Windows-RSS-Platform/1.0*] -Parent=Feeds Syndicators -Browser=Windows-RSS-Platform -Version=1.0 -MajorVer=1 -MinorVer=0 -Win32=true - -[Wizz RSS News Reader] -Parent=Feeds Syndicators -Browser=Wizz - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; General RSS - -[General RSS] -Parent=DefaultProperties -Browser=General RSS -isSyndicationReader=true - -[AideRSS/1.0 (aiderss.com); * subscribers] -Parent=General RSS -Browser=AideRSS -Version=1.0 -MajorVer=1 -MinorVer=0 - -[CC Metadata Scaper http://wiki.creativecommons.org/Metadata_Scraper] -Parent=General RSS -Browser=CC Metadata Scaper - -[Mozilla/5.0 (compatible) GM RSS Panel] -Parent=General RSS -Browser=RSS Panel - -[Mozilla/5.0 http://www.inclue.com; graeme@inclue.com] -Parent=General RSS -Browser=Inclue - -[Runnk online rss reader : http://www.runnk.com/ : RSS favorites : RSS ranking : RSS aggregator*] -Parent=General RSS -Browser=Ruunk - -[Windows-RSS-Platform/2.0 (MSIE 8.0; Windows NT 6.0)] -Parent=General RSS -Browser=Windows-RSS-Platform -Platform=WinVista - -[Mozilla/5.0 (X11; ?; Linux; *) AppleWebKit/* (KHTML, like Gecko, Safari/*) Arora/0.4] -Parent=Google Code -Browser=Arora -Version=0.4 -MajorVer=0 -MinorVer=4 -Platform=Linux -CssVersion=2 -supportsCSS=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Validation Checkers - -[HTML Validators] -Parent=DefaultProperties -Browser=HTML Validators -Frames=true -IFrames=true -Tables=true -Crawler=true - -[(HTML Validator http://www.searchengineworld.com/validator/)] -Parent=HTML Validators -Browser=Search Engine World HTML Validator - -[FeedValidator/1.3] -Parent=HTML Validators -Browser=FeedValidator -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Jigsaw/* W3C_CSS_Validator_JFouffa/*] -Parent=HTML Validators -Browser=Jigsaw CSS Validator - -[Search Engine World Robots.txt Validator*] -Parent=HTML Validators -Browser=Search Engine World Robots.txt Validator - -[W3C_Validator/*] -Parent=HTML Validators -Browser=W3C Validator - -[W3CLineMode/*] -Parent=HTML Validators -Browser=W3C Line Mode - -[Weblide/2.? beta*] -Parent=HTML Validators -Browser=Weblide -Version=2.0 -MajorVer=2 -MinorVer=0 -Beta=true - -[WebmasterWorld StickyMail Server Header Checker*] -Parent=HTML Validators -Browser=WebmasterWorld Server Header Checker - -[WWWC/*] -Parent=HTML Validators - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Image Crawlers - -[Image Crawlers] -Parent=DefaultProperties -Browser=Image Crawlers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*CFNetwork*] -Parent=Image Crawlers -Browser=CFNetwork - -[*PhotoStickies/*] -Parent=Image Crawlers -Browser=PhotoStickies - -[Camcrawler*] -Parent=Image Crawlers -Browser=Camcrawler - -[CydralSpider/*] -Parent=Image Crawlers -Browser=Cydral Web Image Search -isBanned=true - -[Der gro\xdfe BilderSauger*] -Parent=Image Crawlers -Browser=Gallery Grabber - -[Extreme Picture Finder] -Parent=Image Crawlers -Browser=Extreme Picture Finder - -[FLATARTS_FAVICO] -Parent=Image Crawlers -Browser=FlatArts Favorites Icon Tool - -[HTML2JPG Blackbox, http://www.html2jpg.com] -Parent=Image Crawlers -Browser=HTML2JPG - -[IconSurf/2.*] -Parent=Image Crawlers -Browser=IconSurf - -[kalooga/KaloogaBot*] -Parent=Image Crawlers -Browser=KaloogaBot - -[Mister PIX*] -Parent=Image Crawlers -Browser=Mister PIX - -[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/* (*) Pandora/2.*] -Parent=Image Crawlers -Browser=Pandora - -[naoFavicon4IE*] -Parent=Image Crawlers -Browser=naoFavicon4IE - -[pixfinder/*] -Parent=Image Crawlers -Browser=pixfinder - -[rssImagesBot/0.1 (*http://herbert.groot.jebbink.nl/?app=rssImages)] -Parent=Image Crawlers -Browser=rssImagesBot - -[Web Image Collector*] -Parent=Image Crawlers -Browser=Web Image Collector - -[WebImages * (?http://herbert.groot.jebbink.nl/?app=WebImages?)] -Parent=Image Crawlers -Browser=WebImages - -[WebPix*] -Parent=Image Crawlers -Browser=Custo - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Link Checkers - -[Link Checkers] -Parent=DefaultProperties -Browser=Link Checkers -Frames=true -IFrames=true -Tables=true -Crawler=true - -[!Susie (http://www.sync2it.com/susie)] -Parent=Link Checkers -Browser=!Susie - -[*AgentName/*] -Parent=Link Checkers -Browser=AgentName - -[*Linkman*] -Parent=Link Checkers -Browser=Linkman - -[*LinksManager.com*] -Parent=Link Checkers -Browser=LinksManager - -[*Powermarks/*] -Parent=Link Checkers -Browser=Powermarks - -[*W3C-checklink/*] -Parent=Link Checkers -Browser=W3C Link Checker - -[*Web Link Validator*] -Parent=Link Checkers -Browser=Web Link Validator - -[*Zeus*] -Parent=Link Checkers -Browser=Zeus -isBanned=true - -[ActiveBookmark *] -Parent=Link Checkers -Browser=ActiveBookmark - -[Bookdog/*] -Parent=Link Checkers -Browser=Bookdog - -[Bookmark Buddy*] -Parent=Link Checkers -Browser=Bookmark Buddy - -[Bookmark Renewal Check Agent*] -Parent=Link Checkers -Browser=Bookmark Renewal Check Agent - -[Bookmark search tool*] -Parent=Link Checkers -Browser=Bookmark search tool - -[Bookmark-Manager] -Parent=Link Checkers -Browser=Bookmark-Manager - -[Checkbot*] -Parent=Link Checkers -Browser=Checkbot - -[CheckLinks/*] -Parent=Link Checkers -Browser=CheckLinks - -[CyberSpyder Link Test/*] -Parent=Link Checkers -Browser=CyberSpyder Link Test - -[DLC/*] -Parent=Link Checkers -Browser=DLC - -[DocWeb Link Crawler (http://doc.php.net)] -Parent=Link Checkers -Browser=DocWeb Link Crawler - -[FavOrg] -Parent=Link Checkers -Browser=FavOrg - -[Favorites Sweeper v.3.*] -Parent=Link Checkers -Browser=Favorites Sweeper - -[FindLinks/*] -Parent=Link Checkers -Browser=FindLinks - -[Funnel Web Profiler*] -Parent=Link Checkers -Browser=Funnel Web Profiler - -[Html Link Validator (www.lithopssoft.com)] -Parent=Link Checkers -Browser=HTML Link Validator - -[IECheck] -Parent=Link Checkers -Browser=IECheck - -[JCheckLinks/*] -Parent=Link Checkers -Browser=JCheckLinks - -[JRTwine Software Check Favorites Utility] -Parent=Link Checkers -Browser=JRTwine - -[Link Valet Online*] -Parent=Link Checkers -Browser=Link Valet -isBanned=true - -[LinkAlarm/*] -Parent=Link Checkers -Browser=LinkAlarm - -[Linkbot*] -Parent=Link Checkers -Browser=Linkbot - -[LinkChecker/*] -Parent=Link Checkers -Browser=LinkChecker - -[LinkextractorPro*] -Parent=Link Checkers -Browser=LinkextractorPro -isBanned=true - -[LinkLint-checkonly/*] -Parent=Link Checkers -Browser=LinkLint - -[LinkScan/*] -Parent=Link Checkers -Browser=LinkScan - -[LinkSweeper/*] -Parent=Link Checkers -Browser=LinkSweeper - -[LinkWalker*] -Parent=Link Checkers -Browser=LinkWalker - -[MetaGer-LinkChecker] -Parent=Link Checkers -Browser=MetaGer-LinkChecker - -[Mozilla/* (compatible; linktiger/*; *http://www.linktiger.com*)] -Parent=Link Checkers -Browser=LinkTiger -isBanned=true - -[Mozilla/4.0 (Compatible); URLBase*] -Parent=Link Checkers -Browser=URLBase - -[Mozilla/4.0 (compatible; Link Utility; http://net-promoter.com)] -Parent=Link Checkers -Browser=NetPromoter Link Utility - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98) Web Link Validator*] -Parent=Link Checkers -Browser=Web Link Validator -Win32=true - -[Mozilla/4.0 (compatible; MSIE 7.0; Win32) Link Commander 3.0] -Parent=Link Checkers -Browser=Link Commander -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Win32 - -[Mozilla/4.0 (compatible; smartBot/1.*; checking links; *)] -Parent=Link Checkers -Browser=smartBot - -[Mozilla/4.0 (compatible; SuperCleaner*;*)] -Parent=Link Checkers -Browser=SuperCleaner - -[Mozilla/5.0 gURLChecker/*] -Parent=Link Checkers -Browser=gURLChecker -isBanned=true - -[Newsgroupreporter LinkCheck] -Parent=Link Checkers -Browser=Newsgroupreporter LinkCheck - -[onCHECK Linkchecker von www.scientec.de fuer www.onsinn.de] -Parent=Link Checkers -Browser=onCHECK Linkchecker - -[online link validator (http://www.dead-links.com/)] -Parent=Link Checkers -Browser=Dead-Links.com -isBanned=true - -[REL Link Checker*] -Parent=Link Checkers -Browser=REL Link Checker - -[RLinkCheker*] -Parent=Link Checkers -Browser=RLinkCheker - -[Robozilla/*] -Parent=Link Checkers -Browser=Robozilla - -[RPT-HTTPClient/*] -Parent=Link Checkers -Browser=RPT-HTTPClient -isBanned=true - -[SafariBookmarkChecker*(?http://www.coriolis.ch/)] -Parent=Link Checkers -Browser=SafariBookmarkChecker -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[Simpy/* (Simpy; http://www.simpy.com/?ref=bot; feedback at simpy dot com)] -Parent=Link Checkers -Browser=Simpy - -[SiteBar/*] -Parent=Link Checkers -Browser=SiteBar - -[Susie (http://www.sync2it.com/bms/susie.php] -Parent=Link Checkers -Browser=Susie - -[URLBase/6.*] -Parent=Link Checkers - -[VSE/*] -Parent=Link Checkers -Browser=VSE Link Tester - -[WebTrends Link Analyzer] -Parent=Link Checkers -Browser=WebTrends Link Analyzer - -[WorQmada/*] -Parent=Link Checkers -Browser=WorQmada - -[Xenu* Link Sleuth*] -Parent=Link Checkers -Browser=Xenu's Link Sleuth -isBanned=true - -[Z-Add Link Checker*] -Parent=Link Checkers -Browser=Z-Add Link Checker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Microsoft - -[Microsoft] -Parent=DefaultProperties -Browser=Microsoft -isBanned=true - -[Live (http://www.live.com/)] -Parent=Microsoft -Browser=Microsoft Live -isBanned=false -isSyndicationReader=true - -[MFC Foundation Class Library*] -Parent=Microsoft -Browser=MFC Foundation Class Library - -[MFHttpScan] -Parent=Microsoft -Browser=MFHttpScan - -[Microsoft BITS/*] -Parent=Microsoft -Browser=BITS - -[Microsoft Data Access Internet Publishing Provider Cache Manager] -Parent=Microsoft -Browser=MS IPP - -[Microsoft Data Access Internet Publishing Provider DAV*] -Parent=Microsoft -Browser=MS IPP DAV - -[Microsoft Data Access Internet Publishing Provider Protocol Discovery] -Parent=Microsoft -Browser=MS IPPPD - -[Microsoft Internet Explorer] -Parent=Microsoft -Browser=Fake IE - -[Microsoft Office Existence Discovery] -Parent=Microsoft -Browser=Microsoft Office Existence Discovery - -[Microsoft Office Protocol Discovery] -Parent=Microsoft -Browser=MS OPD - -[Microsoft Office/* (*Picture Manager*)] -Parent=Microsoft -Browser=Microsoft Office Picture Manager - -[Microsoft URL Control*] -Parent=Microsoft -Browser=Microsoft URL Control - -[Microsoft Visio MSIE] -Parent=Microsoft -Browser=Microsoft Visio - -[Microsoft-WebDAV-MiniRedir/*] -Parent=Microsoft -Browser=Microsoft-WebDAV - -[Mozilla/5.0 (Macintosh; Intel Mac OS X) Excel/12.*] -Parent=Microsoft -Browser=Microsoft Excel -Version=12.0 -MajorVer=12 -MinorVer=0 -Platform=MacOSX - -[MSN Feed Manager] -Parent=Microsoft -Browser=MSN Feed Manager -isBanned=false -isSyndicationReader=true - -[MSProxy/*] -Parent=Microsoft -Browser=MS Proxy - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Miscellaneous Browsers - -[Miscellaneous Browsers] -Parent=DefaultProperties -Browser=Miscellaneous Browsers -Frames=true -Tables=true -Cookies=true - -[*Amiga*] -Parent=Miscellaneous Browsers -Browser=Amiga -Platform=Amiga - -[*avantbrowser*] -Parent=Miscellaneous Browsers -Browser=Avant Browser - -[12345] -Parent=Miscellaneous Browsers -Browser=12345 -isBanned=true - -[Ace Explorer] -Parent=Miscellaneous Browsers -Browser=Ace Explorer - -[Enigma Browser*] -Parent=Miscellaneous Browsers -Browser=Enigma Browser - -[EVE-minibrowser/*] -Parent=Miscellaneous Browsers -Browser=EVE-minibrowser -IFrames=false -Tables=false -BackgroundSounds=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -isBanned=false -Crawler=false - -[Godzilla/* (Basic*; *; Commodore C=64; *; rv:1.*)*] -Parent=Miscellaneous Browsers -Browser=Godzilla - -[GreenBrowser] -Parent=Miscellaneous Browsers -Browser=GreenBrowser -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Kopiczek/* (WyderOS*; *)] -Parent=Miscellaneous Browsers -Browser=Kopiczek -Platform=WyderOS -IFrames=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (*) - BrowseX (*)] -Parent=Miscellaneous Browsers -Browser=BrowseX - -[Mozilla/* (Win32;*Escape?*; ?)] -Parent=Miscellaneous Browsers -Browser=Escape -Platform=Win32 - -[Mozilla/4.0 (compatible; ibisBrowser)] -Parent=Miscellaneous Browsers -Browser=ibisBrowser - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) AppleWebKit/* (*) HistoryHound/*] -Parent=Miscellaneous Browsers -Browser=HistoryHound - -[NetRecorder*] -Parent=Miscellaneous Browsers -Browser=NetRecorder - -[NetSurfer*] -Parent=Miscellaneous Browsers -Browser=NetSurfer - -[ogeb browser , Version 1.1.0] -Parent=Miscellaneous Browsers -Browser=ogeb browser -Version=1.1 -MajorVer=1 -MinorVer=1 - -[SCEJ PSP BROWSER 0102pspNavigator] -Parent=Miscellaneous Browsers -Browser=Wipeout Pure - -[SlimBrowser] -Parent=Miscellaneous Browsers -Browser=SlimBrowser - -[WWW_Browser/*] -Parent=Miscellaneous Browsers -Browser=WWW Browser -Version=1.69 -MajorVer=1 -MinorVer=69 -Platform=Win16 -CssVersion=3 -supportsCSS=true - -[*Netcraft Webserver Survey*] -Parent=Netcraft -Browser=Netcraft Webserver Survey -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Offline Browsers - -[Offline Browsers] -Parent=DefaultProperties -Browser=Offline Browsers -Frames=true -Tables=true -Cookies=true -isBanned=true -Crawler=true - -[*Check&Get*] -Parent=Offline Browsers -Browser=Check&Get - -[*HTTrack*] -Parent=Offline Browsers -Browser=HTTrack - -[*MSIECrawler*] -Parent=Offline Browsers -Browser=IE Offline Browser - -[*TweakMASTER*] -Parent=Offline Browsers -Browser=TweakMASTER - -[BackStreet Browser *] -Parent=Offline Browsers -Browser=BackStreet Browser - -[Go-Ahead-Got-It*] -Parent=Offline Browsers -Browser=Go Ahead Got-It - -[iGetter/*] -Parent=Offline Browsers -Browser=iGetter - -[Teleport*] -Parent=Offline Browsers -Browser=Teleport - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Online Scanners - -[Online Scanners] -Parent=DefaultProperties -Browser=Online Scanners -isBanned=true - -[JoeDog/* (X11; I; Siege *)] -Parent=Online Scanners -Browser=JoeDog -isBanned=false - -[Morfeus Fucking Scanner] -Parent=Online Scanners -Browser=Morfeus Fucking Scanner - -[Mozilla/4.0 (compatible; Trend Micro tmdr 1.*] -Parent=Online Scanners -Browser=Trend Micro - -[Titanium 2005 (4.02.01)] -Parent=Online Scanners -Browser=Panda Antivirus Titanium - -[virus_detector*] -Parent=Online Scanners -Browser=Secure Computing Corporation - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Proxy Servers - -[Proxy Servers] -Parent=DefaultProperties -Browser=Proxy Servers -isBanned=true - -[*squid*] -Parent=Proxy Servers -Browser=Squid - -[Anonymisiert*] -Parent=Proxy Servers -Browser=Anonymizied - -[Anonymizer/*] -Parent=Proxy Servers -Browser=Anonymizer - -[Anonymizied*] -Parent=Proxy Servers -Browser=Anonymizied - -[Anonymous*] -Parent=Proxy Servers -Browser=Anonymous - -[Anonymous/*] -Parent=Proxy Servers -Browser=Anonymous - -[CE-Preload] -Parent=Proxy Servers -Browser=CE-Preload - -[http://Anonymouse.org/*] -Parent=Proxy Servers -Browser=Anonymouse - -[IE/6.01 (CP/M; 8-bit*)] -Parent=Proxy Servers -Browser=Squid - -[Mozilla/* (TuringOS; Turing Machine; 0.0)] -Parent=Proxy Servers -Browser=Anonymizer - -[Mozilla/4.0 (compatible; MSIE ?.0; SaferSurf*)] -Parent=Proxy Servers -Browser=SaferSurf - -[Mozilla/5.0 (compatible; del.icio.us-thumbnails/*; *) KHTML/* (like Gecko)] -Parent=Proxy Servers -Browser=Yahoo! -isBanned=true -Crawler=true - -[Nutscrape] -Parent=Proxy Servers -Browser=Squid - -[Nutscrape/* (CP/M; 8-bit*)] -Parent=Proxy Servers -Browser=Squid - -[Privoxy/*] -Parent=Proxy Servers -Browser=Privoxy - -[ProxyTester*] -Parent=Proxy Servers -Browser=ProxyTester -isBanned=true -Crawler=true - -[SilentSurf*] -Parent=Proxy Servers -Browser=SilentSurf - -[SmallProxy*] -Parent=Proxy Servers -Browser=SmallProxy - -[Space*Bison/*] -Parent=Proxy Servers -Browser=Proxomitron - -[Sqworm/*] -Parent=Proxy Servers -Browser=Websense - -[SurfControl] -Parent=Proxy Servers -Browser=SurfControl - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Research Projects - -[Research Projects] -Parent=DefaultProperties -Browser=Research Projects -isBanned=true -Crawler=true - -[*research*] -Parent=Research Projects - -[AcadiaUniversityWebCensusClient] -Parent=Research Projects -Browser=AcadiaUniversityWebCensusClient - -[Amico Alpha * (*) Gecko/* AmicoAlpha/*] -Parent=Research Projects -Browser=Amico Alpha - -[annotate_google; http://ponderer.org/*] -Parent=Research Projects -Browser=Annotate Google - -[CMS crawler (?http://buytaert.net/crawler/)] -Parent=Research Projects - -[e-SocietyRobot(http://www.yama.info.waseda.ac.jp/~yamana/es/)] -Parent=Research Projects -Browser=e-SocietyRobot - -[Forschungsportal/*] -Parent=Research Projects -Browser=Forschungsportal - -[Gulper Web *] -Parent=Research Projects -Browser=Gulper Web Bot - -[HooWWWer/*] -Parent=Research Projects -Browser=HooWWWer - -[http://buytaert.net/crawler] -Parent=Research Projects - -[inetbot/* (?http://www.inetbot.com/bot.html)] -Parent=Research Projects -Browser=inetbot - -[IRLbot/*] -Parent=Research Projects -Browser=IRLbot - -[Lachesis] -Parent=Research Projects -Browser=Lachesis - -[Mozilla/5.0 (compatible; nextthing.org/*)] -Parent=Research Projects -Browser=nextthing.org -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (compatible; Theophrastus/*)] -Parent=Research Projects -Browser=Theophrastus - -[Mozilla/5.0 (compatible; Webscan v0.*; http://otc.dyndns.org/webscan/)] -Parent=Research Projects -Browser=Webscan - -[MQbot*] -Parent=Research Projects -Browser=MQbot - -[OutfoxBot/*] -Parent=Research Projects -Browser=OutfoxBot - -[polybot?*] -Parent=Research Projects -Browser=Polybot - -[Shim?Crawler*] -Parent=Research Projects -Browser=Shim Crawler - -[Steeler/*] -Parent=Research Projects -Browser=Steeler - -[Taiga web spider] -Parent=Research Projects -Browser=Taiga - -[Theme Spider*] -Parent=Research Projects -Browser=Theme Spider - -[UofTDB_experiment* (leehyun@cs.toronto.edu)] -Parent=Research Projects -Browser=UofTDB Experiment - -[USyd-NLP-Spider*] -Parent=Research Projects -Browser=USyd-NLP-Spider - -[woriobot*] -Parent=Research Projects -Browser=woriobot - -[wwwster/* (Beta, mailto:gue@cis.uni-muenchen.de)] -Parent=Research Projects -Browser=wwwster -Beta=true - -[Zao-Crawler] -Parent=Research Projects -Browser=Zao-Crawler - -[Zao/*] -Parent=Research Projects -Browser=Zao - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Rippers - -[Rippers] -Parent=DefaultProperties -Browser=Rippers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*grub*] -Parent=Rippers -Browser=grub - -[*ickHTTP*] -Parent=Rippers -Browser=IP*Works - -[*java*] -Parent=Rippers - -[*libwww-perl*] -Parent=Rippers -Browser=libwww-perl - -[*WebGrabber*] -Parent=Rippers - -[*WinHttpRequest*] -Parent=Rippers -Browser=WinHttp - -[3D-FTP/*] -Parent=Rippers -Browser=3D-FTP - -[3wGet/*] -Parent=Rippers -Browser=3wGet - -[ActiveRefresh*] -Parent=Rippers -Browser=ActiveRefresh - -[Artera (Version *)] -Parent=Rippers -Browser=Artera - -[AutoHotkey] -Parent=Rippers -Browser=AutoHotkey - -[b2w/*] -Parent=Rippers -Browser=b2w - -[BasicHTTP/*] -Parent=Rippers -Browser=BasicHTTP - -[BlockNote.Net] -Parent=Rippers -Browser=BlockNote.Net - -[CAST] -Parent=Rippers -Browser=CAST - -[CFNetwork/*] -Parent=Rippers -Browser=CFNetwork - -[CFSCHEDULE*] -Parent=Rippers -Browser=ColdFusion Task Scheduler - -[CobWeb/*] -Parent=Rippers -Browser=CobWeb - -[ColdFusion*] -Parent=Rippers -Browser=ColdFusion - -[Crawl_Application] -Parent=Rippers -Browser=Crawl_Application - -[curl/*] -Parent=Rippers -Browser=cURL - -[Custo*] -Parent=Rippers -Browser=Custo - -[DataCha0s/*] -Parent=Rippers -Browser=DataCha0s - -[DeepIndexer*] -Parent=Rippers -Browser=DeepIndexer - -[DISCo Pump *] -Parent=Rippers -Browser=DISCo Pump - -[eStyleSearch * (compatible; MSIE 6.0; Windows NT 5.0)] -Parent=Rippers -Browser=eStyleSearch -Win32=true - -[ezic.com http agent *] -Parent=Rippers -Browser=Ezic.com - -[fetch libfetch/*] -Parent=Rippers - -[FGet*] -Parent=Rippers -Browser=FGet - -[Flaming AttackBot*] -Parent=Rippers -Browser=Flaming AttackBot - -[Foobot*] -Parent=Rippers -Browser=Foobot - -[GameSpyHTTP/*] -Parent=Rippers -Browser=GameSpyHTTP - -[gnome-vfs/*] -Parent=Rippers -Browser=gnome-vfs - -[Harvest/*] -Parent=Rippers -Browser=Harvest - -[hcat/*] -Parent=Rippers -Browser=hcat - -[HLoader] -Parent=Rippers -Browser=HLoader - -[Holmes/*] -Parent=Rippers -Browser=Holmes - -[HTMLParser/*] -Parent=Rippers -Browser=HTMLParser - -[http generic] -Parent=Rippers -Browser=http generic - -[httpclient*] -Parent=Rippers - -[httperf/*] -Parent=Rippers -Browser=httperf - -[HTTPFetch/*] -Parent=Rippers -Browser=HTTPFetch - -[HTTPGrab] -Parent=Rippers -Browser=HTTPGrab - -[HttpSession] -Parent=Rippers -Browser=HttpSession - -[httpunit/*] -Parent=Rippers -Browser=HttpUnit - -[ICE_GetFile] -Parent=Rippers -Browser=ICE_GetFile - -[iexplore.exe] -Parent=Rippers - -[Inet - Eureka App] -Parent=Rippers -Browser=Inet - Eureka App - -[INetURL/*] -Parent=Rippers -Browser=INetURL - -[InetURL:/*] -Parent=Rippers -Browser=InetURL - -[Internet Exploiter/*] -Parent=Rippers - -[Internet Explore *] -Parent=Rippers -Browser=Fake IE - -[Internet Explorer *] -Parent=Rippers -Browser=Fake IE - -[IP*Works!*/*] -Parent=Rippers -Browser=IP*Works! - -[IrssiUrlLog/*] -Parent=Rippers -Browser=IrssiUrlLog - -[JPluck/*] -Parent=Rippers -Browser=JPluck - -[Kapere (http://www.kapere.com)] -Parent=Rippers -Browser=Kapere - -[LeechFTP] -Parent=Rippers -Browser=LeechFTP - -[LeechGet*] -Parent=Rippers -Browser=LeechGet - -[libcurl-agent/*] -Parent=Rippers -Browser=libcurl - -[libWeb/clsHTTP*] -Parent=Rippers -Browser=libWeb/clsHTTP - -[lwp*] -Parent=Rippers - -[MFC_Tear_Sample] -Parent=Rippers -Browser=MFC_Tear_Sample - -[Moozilla] -Parent=Rippers -Browser=Moozilla - -[MovableType/*] -Parent=Rippers -Browser=MovableType Web Log - -[Mozilla/2.0 (compatible; NEWT ActiveX; Win32)] -Parent=Rippers -Browser=NEWT ActiveX -Platform=Win32 - -[Mozilla/3.0 (compatible)] -Parent=Rippers - -[Mozilla/3.0 (compatible; Indy Library)] -Parent=Rippers -Cookies=true - -[Mozilla/3.01 (compatible;)] -Parent=Rippers - -[Mozilla/4.0 (compatible; BorderManager*)] -Parent=Rippers -Browser=Novell BorderManager - -[Mozilla/4.0 (compatible;)] -Parent=Rippers - -[Mozilla/5.0 (compatible; IPCheck Server Monitor*)] -Parent=Rippers -Browser=IPCheck Server Monitor - -[OCN-SOC/*] -Parent=Rippers -Browser=OCN-SOC - -[Offline Explorer*] -Parent=Rippers -Browser=Offline Explorer - -[Open Web Analytics Bot*] -Parent=Rippers -Browser=Open Web Analytics Bot - -[OSSProxy*] -Parent=Rippers -Browser=OSSProxy - -[Pageload*] -Parent=Rippers -Browser=PageLoad - -[PageNest/*] -Parent=Rippers -Browser=PageNest - -[pavuk/*] -Parent=Rippers -Browser=Pavuk - -[PEAR HTTP_Request*] -Parent=Rippers -Browser=PEAR-PHP - -[PHP*] -Parent=Rippers -Browser=PHP - -[PigBlock (Windows NT 5.1; U)*] -Parent=Rippers -Browser=PigBlock -Win32=true - -[Pockey*] -Parent=Rippers -Browser=Pockey-GetHTML - -[POE-Component-Client-HTTP/*] -Parent=Rippers -Browser=POE-Component-Client-HTTP - -[PycURL/*] -Parent=Rippers -Browser=PycURL - -[Python*] -Parent=Rippers -Browser=Python - -[RepoMonkey*] -Parent=Rippers -Browser=RepoMonkey - -[SBL-BOT*] -Parent=Rippers -Browser=BlackWidow - -[ScoutAbout*] -Parent=Rippers -Browser=ScoutAbout - -[sherlock/*] -Parent=Rippers -Browser=Sherlock - -[SiteParser/*] -Parent=Rippers -Browser=SiteParser - -[SiteSnagger*] -Parent=Rippers -Browser=SiteSnagger - -[SiteSucker/*] -Parent=Rippers -Browser=SiteSucker - -[SiteWinder*] -Parent=Rippers -Browser=SiteWinder - -[Snoopy*] -Parent=Rippers -Browser=Snoopy - -[SOFTWING_TEAR_AGENT*] -Parent=Rippers -Browser=AspTear - -[SuperHTTP/*] -Parent=Rippers -Browser=SuperHTTP - -[Tcl http client package*] -Parent=Rippers -Browser=Tcl http client package - -[Twisted PageGetter] -Parent=Rippers -Browser=Twisted PageGetter - -[URL2File/*] -Parent=Rippers -Browser=URL2File - -[UtilMind HTTPGet] -Parent=Rippers -Browser=UtilMind HTTPGet - -[VCI WebViewer*] -Parent=Rippers -Browser=VCI WebViewer - -[W3CRobot/*] -Parent=Rippers -Browser=W3CRobot - -[Web Downloader*] -Parent=Rippers -Browser=Web Downloader - -[Web Downloader/*] -Parent=Rippers -Browser=Web Downloader - -[Web Magnet*] -Parent=Rippers -Browser=Web Magnet - -[WebAuto/*] -Parent=Rippers - -[webbandit/*] -Parent=Rippers -Browser=webbandit - -[WebCopier*] -Parent=Rippers -Browser=WebCopier - -[WebDownloader*] -Parent=Rippers -Browser=WebDownloader - -[WebFetch] -Parent=Rippers -Browser=WebFetch - -[webfetch/*] -Parent=Rippers -Browser=WebFetch - -[WebGatherer*] -Parent=Rippers -Browser=WebGatherer - -[WebGet] -Parent=Rippers -Browser=WebGet - -[WebReaper*] -Parent=Rippers -Browser=WebReaper - -[WebRipper] -Parent=Rippers -Browser=WebRipper - -[WebSauger*] -Parent=Rippers -Browser=WebSauger - -[Website Downloader*] -Parent=Rippers -Browser=Website Downloader - -[Website eXtractor*] -Parent=Rippers -Browser=Website eXtractor - -[Website Quester] -Parent=Rippers -Browser=Website Quester - -[WebsiteExtractor*] -Parent=Rippers -Browser=Website eXtractor - -[WebSnatcher*] -Parent=Rippers -Browser=WebSnatcher - -[Webster Pro*] -Parent=Rippers -Browser=Webster Pro - -[WebStripper*] -Parent=Rippers -Browser=WebStripper - -[WebWhacker*] -Parent=Rippers -Browser=WebWhacker - -[WinScripter iNet Tools] -Parent=Rippers -Browser=WinScripter iNet Tools - -[WWW-Mechanize/*] -Parent=Rippers -Browser=WWW-Mechanize - -[Zend_Http_Client] -Parent=Rippers -Browser=Zend_Http_Client - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Site Monitors - -[Site Monitors] -Parent=DefaultProperties -Browser=Site Monitors -Cookies=true -isBanned=true -Crawler=true - -[*EasyRider*] -Parent=Site Monitors -Browser=EasyRider - -[*maxamine.com--robot*] -Parent=Site Monitors -Browser=maxamine.com--robot -isBanned=true - -[*WebMon ?.*] -Parent=Site Monitors -Browser=WebMon - -[Kenjin Spider*] -Parent=Site Monitors -Browser=Kenjin Spider - -[Kevin http://*] -Parent=Site Monitors -Browser=Kevin -isBanned=true - -[Mozilla/4.0 (compatible; ChangeDetection/*] -Parent=Site Monitors -Browser=ChangeDetection - -[Myst Monitor Service v*] -Parent=Site Monitors -Browser=Myst Monitor Service - -[Net Probe] -Parent=Site Monitors -Browser=Net Probe - -[NetMechanic*] -Parent=Site Monitors -Browser=NetMechanic - -[NetReality*] -Parent=Site Monitors -Browser=NetReality - -[Pingdom GIGRIB*] -Parent=Site Monitors -Browser=Pingdom - -[Site Valet Online*] -Parent=Site Monitors -Browser=Site Valet -isBanned=true - -[SITECHECKER] -Parent=Site Monitors -Browser=SITECHECKER - -[sitemonitor@dnsvr.com/*] -Parent=Site Monitors -Browser=ZoneEdit Failover Monitor -isBanned=false - -[UpTime Checker*] -Parent=Site Monitors -Browser=UpTime Checker - -[URL Control*] -Parent=Site Monitors -Browser=URL Control - -[URL_Access/*] -Parent=Site Monitors - -[URLCHECK] -Parent=Site Monitors -Browser=URLCHECK - -[URLy Warning*] -Parent=Site Monitors -Browser=URLy Warning - -[Webcheck *] -Parent=Site Monitors -Browser=Webcheck -Version=1.0 -MajorVer=1 -MinorVer=0 - -[WebPatrol/*] -Parent=Site Monitors -Browser=WebPatrol - -[websitepulse checker/*] -Parent=Site Monitors -Browser=websitepulse checker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Social Bookmarkers - -[Social Bookmarkers] -Parent=DefaultProperties -Browser=Social Bookmarkers -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[BookmarkBase(2/;http://bookmarkbase.com)] -Parent=Social Bookmarkers -Browser=BookmarkBase - -[Cocoal.icio.us/1.0 (v43) (Mac OS X; http://www.scifihifi.com/cocoalicious)] -Parent=Social Bookmarkers -Browser=Cocoalicious - -[Mozilla/5.0 (compatible; FriendFeedBot/0.*; Http://friendfeed.com/about/bot)] -Parent=Social Bookmarkers -Browser=FriendFeedBot - -[Twitturly*] -Parent=Social Bookmarkers -Browser=Twitturly - -[WinkBot/*] -Parent=Social Bookmarkers -Browser=WinkBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Translators - -[Translators] -Parent=DefaultProperties -Browser=Translators -Frames=true -Tables=true -Cookies=true - -[Seram Server] -Parent=Translators -Browser=Seram Server - -[TeragramWebcrawler/*] -Parent=Translators -Browser=TeragramWebcrawler -Version=1.0 -MajorVer=1 -MinorVer=0 - -[WebIndexer/* (Web Indexer; *)] -Parent=Translators -Browser=WorldLingo - -[WebTrans] -Parent=Translators -Browser=WebTrans - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Version Checkers - -[Version Checkers] -Parent=DefaultProperties -Browser=Version Checkers -Crawler=true - -[Automated Browscap.ini Updater. To report issues contact us at http://www.skycomp.ca] -Parent=Version Checkers -Browser=Automated Browscap.ini Updater - -[BMC Link Validator (http://www.briansmodelcars.com/links/)] -Parent=Version Checkers -Browser=BMC Link Validator -MajorVer=1 -MinorVer=0 -Platform=Win2000 - -[Browscap updater] -Parent=Version Checkers -Browser=Browscap updater - -[BrowscapUpdater1.0] -Parent=Version Checkers - -[Browser Capabilities Project (http://browsers.garykeith.com; http://browsers.garykeith.com/sitemail/contact-me.asp)] -Parent=Version Checkers -Browser=Gary Keith's Version Checker - -[Browser Capabilities Project AutoDownloader] -Parent=Version Checkers -Browser=TKC AutoDownloader - -[browsers.garykeith.com browscap.ini bot BETA] -Parent=Version Checkers - -[Code Sample Web Client] -Parent=Version Checkers -Browser=Code Sample Web Client - -[Desktop Sidebar*] -Parent=Version Checkers -Browser=Desktop Sidebar -isBanned=true - -[Mono Browser Capabilities Updater*] -Parent=Version Checkers -Browser=Mono Browser Capabilities Updater -isBanned=true - -[Rewmi/*] -Parent=Version Checkers -isBanned=true - -[Subtext Version 1.9* - http://subtextproject.com/ (Microsoft Windows NT 5.2.*)] -Parent=Version Checkers -Browser=Subtext - -[TherapeuticResearch] -Parent=Version Checkers -Browser=TherapeuticResearch - -[UpdateBrowscap*] -Parent=Version Checkers -Browser=UpdateBrowscap - -[www.garykeith.com browscap.ini bot*] -Parent=Version Checkers -Browser=clarkson.edu - -[www.substancia.com AutoHTTPAgent (ver *)] -Parent=Version Checkers -Browser=Substância - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Become - -[Become] -Parent=DefaultProperties -Browser=Become -Frames=true -Tables=true -isSyndicationReader=true -Crawler=true - -[*BecomeBot/*] -Parent=Become -Browser=BecomeBot - -[*BecomeBot@exava.com*] -Parent=Become -Browser=BecomeBot - -[*Exabot@exava.com*] -Parent=Become -Browser=Exabot - -[MonkeyCrawl/*] -Parent=Become -Browser=MonkeyCrawl - -[Mozilla/5.0 (compatible; BecomeJPBot/2.3; *)] -Parent=Become -Browser=BecomeJPBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Blue Coat Systems - -[Blue Coat Systems] -Parent=DefaultProperties -Browser=Blue Coat Systems -isBanned=true -Crawler=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Browscap Abusers - -[Browscap Abusers] -Parent=DefaultProperties -Browser=Browscap Abusers -isBanned=true - -[Apple-PubSub/*] -Parent=Browscap Abusers -Browser=Apple-PubSub - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FeedHub - -[FeedHub] -Parent=DefaultProperties -Browser=FeedHub -isSyndicationReader=true - -[FeedHub FeedDiscovery/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub FeedDiscovery -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedHub FeedFetcher/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub FeedFetcher -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedHub MetaDataFetcher/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub MetaDataFetcher -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Internet Content Rating Association] -Parent=DefaultProperties -Browser= -Frames=true -IFrames=true -Tables=true -Cookies=true -Crawler=true - -[ICRA_label_generator/1.?] -Parent=Internet Content Rating Association -Browser=ICRA_label_generator - -[ICRA_Semantic_spider/0.?] -Parent=Internet Content Rating Association -Browser=ICRA_Semantic_spider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NameProtect - -[NameProtect] -Parent=DefaultProperties -Browser=NameProtect -isBanned=true -Crawler=true - -[abot/*] -Parent=NameProtect -Browser=NameProtect - -[NP/*] -Parent=NameProtect -Browser=NameProtect - -[NPBot*] -Parent=NameProtect -Browser=NameProtect - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netcraft - -[Netcraft] -Parent=DefaultProperties -Browser=Netcraft -isBanned=true -Crawler=true - -[*Netcraft Web Server Survey*] -Parent=Netcraft -Browser=Netcraft Webserver Survey -isBanned=true - -[Mozilla/5.0 (compatible; NetcraftSurveyAgent/1.0; info@netcraft.com)] -Parent=Netcraft -Browser=NetcraftSurveyAgent - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NewsGator - -[NewsGator] -Parent=DefaultProperties -Browser=NewsGator -isSyndicationReader=true - -[MarsEdit*] -Parent=NewsGator -Browser=MarsEdit - -[NetNewsWire*/*] -Parent=NewsGator -Browser=NetNewsWire -Platform=MacOSX - -[NewsFire/*] -Parent=NewsGator -Browser=NewsFire - -[NewsGator FetchLinks extension/*] -Parent=NewsGator -Browser=NewsGator FetchLinks - -[NewsGator/*] -Parent=NewsGator -Browser=NewsGator -isBanned=true - -[NewsGatorOnline/*] -Parent=NewsGator -Browser=NewsGatorOnline - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.2 - -[Chrome 0.2] -Parent=DefaultProperties -Browser=Chrome -Version=0.2 -MinorVer=2 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.3 - -[Chrome 0.3] -Parent=DefaultProperties -Browser=Chrome -Version=0.3 -MinorVer=3 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.4 - -[Chrome 0.4] -Parent=DefaultProperties -Browser=Chrome -Version=0.4 -MinorVer=4 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.5 - -[Chrome 0.5] -Parent=DefaultProperties -Browser=Chrome -Version=0.5 -MinorVer=5 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 1.0 - -[Chrome 1.0] -Parent=DefaultProperties -Browser=Chrome -Version=1.0 -MajorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 2.0 - -[Chrome 2.0] -Parent=DefaultProperties -Browser=Chrome -Version=2.0 -MajorVer=2 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 3.0 - -[Chrome 3.0] -Parent=DefaultProperties -Browser=Chrome -Version=3.0 -MajorVer=3 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google Code - -[Google Code] -Parent=DefaultProperties -Browser=Google Code -Tables=true -Cookies=true -JavaApplets=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.2 - -[Iron 0.2] -Parent=DefaultProperties -Browser=Iron -Version=0.2 -MinorVer=2 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.3 - -[Iron 0.3] -Parent=DefaultProperties -Browser=Iron -Version=0.3 -MinorVer=3 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.4 - -[Iron 0.4] -Parent=DefaultProperties -Browser=Iron -Version=0.4 -MinorVer=4 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iPod - -[iPod] -Parent=DefaultProperties -Browser=iPod -Platform=iPhone OSX -isMobileDevice=true - -[Mozilla/5.0 (iPod; U; *Mac OS X; *) AppleWebKit/* (*) Version/3.0 Mobile/* Safari/*] -Parent=iPod -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX - -[Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2 like Mac OS X; en-us) AppleWebKit/* (KHTML, like Gecko) Mobile/*] -Parent=iPod - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iTunes - -[iTunes] -Parent=DefaultProperties -Browser=iTunes -Platform=iPhone OSX - -[iTunes/* (Windows; ?)] -Parent=iTunes -Browser=iTunes -Platform=Win32 -Win32=true - -[MOT-* iTunes/* MIB/* Profile/MIDP-* Configuration/CLDC-* UP.Link/*] -Parent=iTunes - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Media Players - -[Media Players] -Parent=DefaultProperties -Browser=Media Players -Cookies=true - -[Microsoft NetShow(TM) Player with RealVideo(R)] -Parent=Media Players -Browser=Microsoft NetShow - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; *) AppleWebKit/* RealPlayer] -Parent=Media Players -Browser=RealPlayer -Platform=MacOSX - -[MPlayer 0.9*] -Parent=Media Players -Browser=MPlayer -Version=0.9 -MajorVer=0 -MinorVer=9 - -[MPlayer 1.*] -Parent=Media Players -Browser=MPlayer -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MPlayer HEAD CVS] -Parent=Media Players -Browser=MPlayer - -[RealPlayer*] -Parent=Media Players -Browser=RealPlayer - -[RMA/*] -Parent=Media Players -Browser=RMA - -[VLC media player*] -Parent=Media Players -Browser=VLC - -[vobsub] -Parent=Media Players -Browser=vobsub -isBanned=true - -[WinampMPEG/*] -Parent=Media Players -Browser=WinAmp - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nintendo - -[Nintendo Wii] -Parent=DefaultProperties -Browser= -isMobileDevice=true - -[Opera/* (Nintendo DSi; Opera/*; *; *)] -Parent=Nintendo Wii -Browser=DSi - -[Opera/* (Nintendo Wii; U; *)] -Parent=Nintendo Wii -Browser=Wii - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Windows Media Player - -[Windows Media Player] -Parent=DefaultProperties -Browser=Windows Media Player -Cookies=true - -[NSPlayer/10.*] -Parent=Windows Media Player -Version=10.0 -MajorVer=10 -MinorVer=0 - -[NSPlayer/11.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=11.0 -MajorVer=11 -MinorVer=0 - -[NSPlayer/4.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=4.0 -MajorVer=4 -MinorVer=0 - -[NSPlayer/7.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=7.0 -MajorVer=7 -MinorVer=0 - -[NSPlayer/8.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=8.0 -MajorVer=8 -MinorVer=0 - -[NSPlayer/9.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=9.0 -MajorVer=9 -MinorVer=0 - -[Windows-Media-Player/10.*] -Parent=Windows Media Player -Browser=Windows-Media-Player -Version=10.0 -MajorVer=10 -MinorVer=0 -Win32=true - -[Windows-Media-Player/11.*] -Parent=Windows Media Player -Version=11.0 -MajorVer=11 -MinorVer=0 -Win32=true - -[Windows-Media-Player/7.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=7.0 -MajorVer=7 -MinorVer=0 -Win32=true - -[Windows-Media-Player/8.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=8.0 -MajorVer=8 -MinorVer=0 -Win32=true - -[Windows-Media-Player/9.*] -Parent=Windows Media Player -Version=9.0 -MajorVer=9 -MinorVer=0 -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Zune - -[Zune] -Parent=DefaultProperties -Browser=Zune -Cookies=true - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 2.0*)*] -Parent=Zune -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 2.5*)*] -Parent=Zune -Version=2.5 -MajorVer=2 -MinorVer=5 - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 3.0*)*] -Parent=Zune -Version=3.0 -MajorVer=3 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.0 - -[QuickTime 7.0] -Parent=DefaultProperties -Browser=QuickTime -Version=7.0 -MajorVer=7 -Cookies=true - -[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.0 -Platform=MacOSX - -[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.0 -Platform=MacPPC - -[QuickTime (qtver=7.0*;os=Windows 95*)] -Parent=QuickTime 7.0 -Platform=Win95 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows 98*)] -Parent=QuickTime 7.0 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows Me*)] -Parent=QuickTime 7.0 -Platform=WinME -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 4.0*)] -Parent=QuickTime 7.0 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.0*)] -Parent=QuickTime 7.0 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.1*)] -Parent=QuickTime 7.0 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.2*)] -Parent=QuickTime 7.0 -Platform=Win2003 -Win32=true - -[QuickTime/7.0.* (qtver=7.0.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.0 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.1 - -[QuickTime 7.1] -Parent=DefaultProperties -Browser=QuickTime -Version=7.1 -MajorVer=7 -MinorVer=1 -Cookies=true - -[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.1 -Platform=MacOSX - -[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.1 -Platform=MacPPC - -[QuickTime (qtver=7.1*;os=Windows 98*)] -Parent=QuickTime 7.1 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 4.0*)] -Parent=QuickTime 7.1 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.0*)] -Parent=QuickTime 7.1 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.1*)] -Parent=QuickTime 7.1 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.2*)] -Parent=QuickTime 7.1 -Platform=Win2003 -Win32=true - -[QuickTime/7.1.* (qtver=7.1.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.1 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.2 - -[QuickTime 7.2] -Parent=DefaultProperties -Browser=QuickTime -Version=7.2 -MajorVer=7 -MinorVer=2 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.2*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.2 -Platform=MacOSX - -[QuickTime (qtver=7.2*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.2 -Platform=MacPPC - -[QuickTime (qtver=7.2*;os=Windows 98*)] -Parent=QuickTime 7.2 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 4.0*)] -Parent=QuickTime 7.2 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.0*)] -Parent=QuickTime 7.2 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.1*)] -Parent=QuickTime 7.2 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.2*)] -Parent=QuickTime 7.2 -Platform=Win2003 -Win32=true - -[QuickTime/7.2.* (qtver=7.2.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.2 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.3 - -[QuickTime 7.3] -Parent=DefaultProperties -Browser=QuickTime -Version=7.3 -MajorVer=7 -MinorVer=3 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.3*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.3 -Platform=MacOSX - -[QuickTime (qtver=7.3*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.3 -Platform=MacPPC - -[QuickTime (qtver=7.3*;os=Windows 98*)] -Parent=QuickTime 7.3 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 4.0*)] -Parent=QuickTime 7.3 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.0*)] -Parent=QuickTime 7.3 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.1*)] -Parent=QuickTime 7.3 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.2*)] -Parent=QuickTime 7.3 -Platform=Win2003 -Win32=true - -[QuickTime/7.3.* (qtver=7.3.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.3 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.4 - -[QuickTime 7.4] -Parent=DefaultProperties -Browser=QuickTime -Version=7.4 -MajorVer=7 -MinorVer=4 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.4*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.4 -Platform=MacOSX - -[QuickTime (qtver=7.4*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.4 -Platform=MacPPC - -[QuickTime (qtver=7.4*;os=Windows 98*)] -Parent=QuickTime 7.4 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 4.0*)] -Parent=QuickTime 7.4 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.0*)] -Parent=QuickTime 7.4 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.1*)] -Parent=QuickTime 7.4 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.2*)] -Parent=QuickTime 7.4 -Platform=Win2003 -Win32=true - -[QuickTime/7.4.* (qtver=7.4.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.4 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google Android - -[Android] -Parent=DefaultProperties -Browser=Android -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[Mozilla/5.0 (Linux; U; Android *; *) AppleWebKit/* (KHTML, like Gecko) Safari/*] -Parent=Android -Browser=Android -Platform=Linux -isMobileDevice=true - -[Mozilla/5.0 (Linux; U; Android *; *) AppleWebKit/* (KHTML, like Gecko) Version/3.0.* Mobile Safari/*] -Parent=Android -Browser=Android -Platform=Linux -isMobileDevice=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BlackBerry - -[BlackBerry] -Parent=DefaultProperties -Browser=BlackBerry -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[*BlackBerry*] -Parent=BlackBerry - -[*BlackBerrySimulator/*] -Parent=BlackBerry - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Handspring Blazer - -[Blazer] -Parent=DefaultProperties -Browser=Handspring Blazer -Platform=Palm -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 95; PalmSource; Blazer 3.0) 16;160x160] -Parent=Blazer -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.0) 16;320x448] -Parent=Blazer -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.1) 16;320x320] -Parent=Blazer -Version=4.1 -MajorVer=4 -MinorVer=1 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.2) 16;320x320] -Parent=Blazer -Version=4.2 -MajorVer=4 -MinorVer=2 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.4) 16;320x320] -Parent=Blazer -Version=4.4 -MajorVer=4 -MinorVer=4 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.5) 16;320x320] -Parent=Blazer -Version=4.5 -MajorVer=4 -MinorVer=5 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DoCoMo - -[DoCoMo] -Parent=DefaultProperties -Browser=DoCoMo -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[DoCoMo/1.0*] -Parent=DoCoMo -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WAP - -[DoCoMo/2.0*] -Parent=DoCoMo -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=WAP - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IEMobile - -[IEMobile] -Parent=DefaultProperties -Browser=IEMobile -Platform=WinCE -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -VBScript=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.*)*] -Parent=IEMobile -Version=6.0 -MajorVer=6 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.*)*] -Parent=IEMobile -Version=7.0 -MajorVer=7 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iPhone - -[iPhone] -Parent=DefaultProperties -Browser=iPhone -Platform=iPhone OSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -isMobileDevice=true -CssVersion=3 -supportsCSS=true - -[Mozilla/4.0 (iPhone; *)] -Parent=iPhone - -[Mozilla/4.0 (iPhone; U; CPU like Mac OS X; *)] -Parent=iPhone - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_0_1 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_1 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko)] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0_2 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_1 like Mac OS X; *)*] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_2_1 like Mac OS X; *)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.0 Mobile/* Safari/*] -Parent=iPhone -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/5.0 (iPod; U; *Mac OS X; *) AppleWebKit/* (*) Version/* Mobile/*] -Parent=iPhone -Browser=iTouch - -[Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2* like Mac OS X; *)*] -Parent=iPhone -Browser=iTouch -Version=2.2 -MajorVer=2 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KDDI - -[KDDI] -Parent=DefaultProperties -Browser=KDDI -Frames=true -Tables=true -Cookies=true -BackgroundSounds=true -VBScript=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[KDDI-* UP.Browser/* (GUI) MMP/*] -Parent=KDDI - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Miscellaneous Mobile - -[Miscellaneous Mobile] -Parent=DefaultProperties -Browser= -IFrames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; *; CentOS; *) AppleWebKit/* (KHTML, like Gecko) Bolt/0.* Version/3.0 Safari/*] -Parent=Miscellaneous Mobile -Browser=Bolt - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Motorola Internet Browser - -[Motorola Internet Browser] -Parent=DefaultProperties -Browser=Motorola Internet Browser -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[MOT-*/*] -Parent=Motorola Internet Browser - -[MOT-1*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-8700_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-0A/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-2B/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-88/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-C???/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-GATW_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-L6/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-L7/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-M*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-MP*/* Mozilla/* (compatible; MSIE *; Windows CE; *)] -Parent=Motorola Internet Browser -Win32=true - -[MOT-MP*/* Mozilla/4.0 (compatible; MSIE *; Windows CE; *)] -Parent=Motorola Internet Browser -Win32=true - -[MOT-SAP4_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-T*/*] -Parent=Motorola Internet Browser - -[MOT-T7*/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-T721*] -Parent=Motorola Internet Browser - -[MOT-TA02/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V*/*] -Parent=Motorola Internet Browser - -[MOT-V*/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-V3/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V4*/* MIB/*] -Parent=Motorola Internet Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN Mobile Proxy - -[MSN Mobile Proxy] -Parent=DefaultProperties -Browser=MSN Mobile Proxy -Win32=true -Frames=true -Tables=true -Cookies=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true - -[Mozilla/* (compatible; MSIE *; Windows*; MSN Mobile Proxy)] -Parent=MSN Mobile Proxy - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetFront - -[NetFront] -Parent=DefaultProperties -Browser=NetFront -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[*NetFront/*] -Parent=NetFront - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nokia - -[Nokia] -Parent=DefaultProperties -Browser=Nokia -Tables=true -Cookies=true -isMobileDevice=true - -[*Nokia*/*] -Parent=Nokia - -[Mozilla/* (SymbianOS/*; ?; *) AppleWebKit/* (KHTML, like Gecko) Safari/*] -Parent=Nokia -Platform=SymbianOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Openwave Mobile Browser - -[Openwave Mobile Browser] -Parent=DefaultProperties -Browser=Openwave Mobile Browser -Alpha=true -Win32=true -Win64=true -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[*UP.Browser/*] -Parent=Openwave Mobile Browser - -[*UP.Link/*] -Parent=Openwave Mobile Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera Mini - -[Opera Mini] -Parent=DefaultProperties -Browser=Opera Mini -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[Opera/* (J2ME/MIDP; Opera Mini/1.0*)*] -Parent=Opera Mini -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/1.1*)*] -Parent=Opera Mini -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/1.2*)*] -Parent=Opera Mini -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Opera/* (J2ME/MIDP; Opera Mini/2.0*)*] -Parent=Opera Mini -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/3.0*)*] -Parent=Opera Mini -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/3.1*)*] -Parent=Opera Mini -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/4.0*)*] -Parent=Opera Mini -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/4.1*)*] -Parent=Opera Mini -Version=4.1 -MajorVer=4 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/4.2*)*] -Parent=Opera Mini -Version=4.2 -MajorVer=4 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera Mobile - -[Opera Mobile] -Parent=DefaultProperties -Browser=Opera Mobi -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Opera/9.5 (Microsoft Windows; PPC; *Opera Mobile/*)] -Parent=Opera Mobile -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Opera/9.5 (Microsoft Windows; PPC; Opera Mobi/*)] -Parent=Opera Mobile -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Opera/9.51 Beta (Microsoft Windows; PPC; Opera Mobi/*)*] -Parent=Opera Mobile -Version=9.51 -MajorVer=9 -MinorVer=51 -Beta=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Playstation - -[Playstation] -Parent=DefaultProperties -Browser=Playstation -Platform=WAP -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Mozilla/* (PLAYSTATION *; *)] -Parent=Playstation -Browser=PlayStation 3 -Frames=false - -[Mozilla/* (PSP (PlayStation Portable); *)] -Parent=Playstation - -[Sony PS2 (Linux)] -Parent=Playstation -Browser=Sony PS2 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Pocket PC - -[Pocket PC] -Parent=DefaultProperties -Browser=Pocket PC -Platform=WinCE -Win32=true -Frames=true -Tables=true -Cookies=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*(compatible; MSIE *.*; Windows CE; PPC; *)] -Parent=Pocket PC - -[HTC-*/* Mozilla/* (compatible; MSIE *.*; Windows CE*)*] -Parent=Pocket PC -Win32=true - -[Mozilla/* (compatible; MSPIE *.*; *Windows CE*)*] -Parent=Pocket PC -Win32=true - -[T-Mobile* Mozilla/* (compatible; MSIE *.*; Windows CE; *)] -Parent=Pocket PC - -[Vodafone* Mozilla/* (compatible; MSIE *.*; Windows CE; *)*] -Parent=Pocket PC - -[Windows CE (Pocket PC) - Version *.*] -Parent=Pocket PC -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SEMC Browser - -[SEMC Browser] -Parent=DefaultProperties -Browser=SEMC Browser -Platform=JAVA -Tables=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*SEMC-Browser/*] -Parent=SEMC Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SonyEricsson - -[SonyEricsson] -Parent=DefaultProperties -Browser=SonyEricsson -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*Ericsson*] -Parent=SonyEricsson - -[*SonyEricsson*] -Parent=SonyEricsson - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netbox - -[Netbox] -Parent=DefaultProperties -Browser=Netbox -Frames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/3.01 (compatible; Netbox/*; Linux*)] -Parent=Netbox -Browser=Netbox -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PowerTV - -[PowerTV] -Parent=DefaultProperties -Browser=PowerTV -Platform=PowerTV -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/4.0 PowerTV/1.5 (Compatible; Spyglass DM 3.2.1, EXPLORER)] -Parent=PowerTV -Version=1.5 -MajorVer=1 -MinorVer=5 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WebTV/MSNTV - -[WebTV] -Parent=DefaultProperties -Browser=WebTV/MSNTV -Platform=WebTV -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/3.0 WebTV/1.*(compatible; MSIE 2.0)] -Parent=WebTV -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/4.0 WebTV/2.0*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/4.0 WebTV/2.1*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/4.0 WebTV/2.2*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Mozilla/4.0 WebTV/2.3*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.3 -MajorVer=2 -MinorVer=3 - -[Mozilla/4.0 WebTV/2.4*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.4 -MajorVer=2 -MinorVer=4 - -[Mozilla/4.0 WebTV/2.5*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.5 -MajorVer=2 -MinorVer=5 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.6*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.6 -MajorVer=2 -MinorVer=6 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.7*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.7 -MajorVer=2 -MinorVer=7 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.8*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.8 -MajorVer=2 -MinorVer=8 -JavaApplets=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.9*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.9 -MajorVer=2 -MinorVer=9 -JavaApplets=true -CssVersion=1 -supportsCSS=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Amaya - -[Amaya] -Parent=DefaultProperties -Browser=Amaya -Tables=true -Cookies=true - -[amaya/7.*] -Parent=Amaya -Version=7.0 -MajorVer=7 -MinorVer=0 - -[amaya/8.0*] -Parent=Amaya -Version=8.0 -MajorVer=8 -MinorVer=0 -CssVersion=2 -supportsCSS=true - -[amaya/8.1*] -Parent=Amaya -Version=8.1 -MajorVer=8 -MinorVer=1 -CssVersion=2 -supportsCSS=true - -[amaya/8.2*] -Parent=Amaya -Version=8.2 -MajorVer=8 -MinorVer=2 -CssVersion=2 -supportsCSS=true - -[amaya/8.3*] -Parent=Amaya -Version=8.3 -MajorVer=8 -MinorVer=3 -CssVersion=2 -supportsCSS=true - -[amaya/8.4*] -Parent=Amaya -Version=8.4 -MajorVer=8 -MinorVer=4 -CssVersion=2 -supportsCSS=true - -[amaya/8.5*] -Parent=Amaya -Version=8.5 -MajorVer=8 -MinorVer=5 -CssVersion=2 -supportsCSS=true - -[amaya/8.6*] -Parent=Amaya -Version=8.6 -MajorVer=8 -MinorVer=6 -CssVersion=2 -supportsCSS=true - -[amaya/8.7*] -Parent=Amaya -Version=8.7 -MajorVer=8 -MinorVer=7 -CssVersion=2 -supportsCSS=true - -[amaya/8.8*] -Parent=Amaya -Version=8.8 -MajorVer=8 -MinorVer=8 -CssVersion=2 -supportsCSS=true - -[amaya/8.9*] -Parent=Amaya -Version=8.9 -MajorVer=8 -MinorVer=9 -CssVersion=2 -supportsCSS=true - -[amaya/9.0*] -Parent=Amaya -Version=9.0 -MajorVer=8 -MinorVer=0 -CssVersion=2 -supportsCSS=true - -[amaya/9.1*] -Parent=Amaya -Version=9.1 -MajorVer=9 -MinorVer=1 -CssVersion=2 -supportsCSS=true - -[amaya/9.2*] -Parent=Amaya -Version=9.2 -MajorVer=9 -MinorVer=2 -CssVersion=2 -supportsCSS=true - -[amaya/9.3*] -Parent=Amaya -Version=9.3 -MajorVer=9 -MinorVer=3 - -[amaya/9.4*] -Parent=Amaya -Version=9.4 -MajorVer=9 -MinorVer=4 - -[amaya/9.5*] -Parent=Amaya -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Emacs-w3m/*] -Parent=Emacs/W3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Links - -[Links] -Parent=DefaultProperties -Browser=Links -Frames=true -Tables=true - -[Links (0.9*; CYGWIN_NT-5.1*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=WinXP - -[Links (0.9*; Darwin*)] -Parent=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=MacPPC - -[Links (0.9*; FreeBSD*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=FreeBSD - -[Links (0.9*; Linux*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Linux - -[Links (0.9*; OS/2*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=OS/2 - -[Links (0.9*; Unix*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Unix - -[Links (0.9*; Win32*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Win32 -Win32=true - -[Links (1.0*; CYGWIN_NT-5.1*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP - -[Links (1.0*; FreeBSD*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=FreeBSD - -[Links (1.0*; Linux*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Linux - -[Links (1.0*; OS/2*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=OS/2 - -[Links (1.0*; Unix*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Unix - -[Links (1.0*; Win32*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win32 -Win32=true - -[Links (2.0*; Linux*)] -Parent=Links -Browser=Links -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Linux - -[Links (2.1*; FreeBSD*)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=FreeBSD - -[Links (2.1*; Linux *)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=Linux - -[Links (2.1*; OpenBSD*)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=OpenBSD - -[Links (2.2*; FreeBSD*)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=FreeBSD - -[Links (2.2*; Linux *)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=Linux - -[Links (2.2*; OpenBSD*)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=OpenBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lynx - -[Lynx] -Parent=DefaultProperties -Browser=Lynx -Frames=true -Tables=true - -[Lynx *] -Parent=Lynx -Browser=Lynx - -[Lynx/2.3*] -Parent=Lynx -Browser=Lynx -Version=2.3 -MajorVer=2 -MinorVer=3 - -[Lynx/2.4*] -Parent=Lynx -Browser=Lynx -Version=2.4 -MajorVer=2 -MinorVer=4 - -[Lynx/2.5*] -Parent=Lynx -Browser=Lynx -Version=2.5 -MajorVer=2 -MinorVer=5 - -[Lynx/2.6*] -Parent=Lynx -Browser=Lynx -Version=2.6 -MajorVer=2 -MinorVer=6 - -[Lynx/2.7*] -Parent=Lynx -Browser=Lynx -Version=2.7 -MajorVer=2 -MinorVer=7 - -[Lynx/2.8*] -Parent=Lynx -Browser=Lynx -Version=2.8 -MajorVer=2 -MinorVer=8 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NCSA Mosaic - -[Mosaic] -Parent=DefaultProperties -Browser=Mosaic - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; w3m - -[w3m] -Parent=DefaultProperties -Browser=w3m -Frames=true -Tables=true - -[w3m/0.1*] -Parent=w3m -Browser=w3m -Version=0.1 -MajorVer=0 -MinorVer=1 - -[w3m/0.2*] -Parent=w3m -Browser=w3m -Version=0.2 -MajorVer=0 -MinorVer=2 - -[w3m/0.3*] -Parent=w3m -Browser=w3m -Version=0.3 -MajorVer=0 -MinorVer=3 - -[w3m/0.4*] -Parent=w3m -Browser=w3m -Version=0.4 -MajorVer=0 -MinorVer=4 -Cookies=true - -[w3m/0.5*] -Parent=w3m -Browser=w3m -Version=0.5 -MajorVer=0 -MinorVer=5 -Cookies=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.10 - -[ELinks 0.10] -Parent=DefaultProperties -Browser=ELinks -Version=0.10 -MinorVer=10 -Frames=true -Tables=true - -[ELinks (0.10*; *AIX*)] -Parent=ELinks 0.10 -Platform=AIX - -[ELinks (0.10*; *BeOS*)] -Parent=ELinks 0.10 -Platform=BeOS - -[ELinks (0.10*; *CygWin*)] -Parent=ELinks 0.10 -Platform=CygWin - -[ELinks (0.10*; *Darwin*)] -Parent=ELinks 0.10 -Platform=Darwin - -[ELinks (0.10*; *Digital Unix*)] -Parent=ELinks 0.10 -Platform=Digital Unix - -[ELinks (0.10*; *FreeBSD*)] -Parent=ELinks 0.10 -Platform=FreeBSD - -[ELinks (0.10*; *HPUX*)] -Parent=ELinks 0.10 -Platform=HP-UX - -[ELinks (0.10*; *IRIX*)] -Parent=ELinks 0.10 -Platform=IRIX - -[ELinks (0.10*; *Linux*)] -Parent=ELinks 0.10 -Platform=Linux - -[ELinks (0.10*; *NetBSD*)] -Parent=ELinks 0.10 -Platform=NetBSD - -[ELinks (0.10*; *OpenBSD*)] -Parent=ELinks 0.10 -Platform=OpenBSD - -[ELinks (0.10*; *OS/2*)] -Parent=ELinks 0.10 -Platform=OS/2 - -[ELinks (0.10*; *RISC*)] -Parent=ELinks 0.10 -Platform=RISC OS - -[ELinks (0.10*; *Solaris*)] -Parent=ELinks 0.10 -Platform=Solaris - -[ELinks (0.10*; *Unix*)] -Parent=ELinks 0.10 -Platform=Unix - -[ELinks/0.10* (*AIX*)] -Parent=ELinks 0.10 -Platform=AIX - -[ELinks/0.10* (*BeOS*)] -Parent=ELinks 0.10 -Platform=BeOS - -[ELinks/0.10* (*CygWin*)] -Parent=ELinks 0.10 -Platform=CygWin - -[ELinks/0.10* (*Darwin*)] -Parent=ELinks 0.10 -Platform=Darwin - -[ELinks/0.10* (*Digital Unix*)] -Parent=ELinks 0.10 -Platform=Digital Unix - -[ELinks/0.10* (*FreeBSD*)] -Parent=ELinks 0.10 -Platform=FreeBSD - -[ELinks/0.10* (*HPUX*)] -Parent=ELinks 0.10 -Platform=HP-UX - -[ELinks/0.10* (*IRIX*)] -Parent=ELinks 0.10 -Platform=IRIX - -[ELinks/0.10* (*Linux*)] -Parent=ELinks 0.10 -Platform=Linux - -[ELinks/0.10* (*NetBSD*)] -Parent=ELinks 0.10 -Platform=NetBSD - -[ELinks/0.10* (*OpenBSD*)] -Parent=ELinks 0.10 -Platform=OpenBSD - -[ELinks/0.10* (*OS/2*)] -Parent=ELinks 0.10 -Platform=OS/2 - -[ELinks/0.10* (*RISC*)] -Parent=ELinks 0.10 -Platform=RISC OS - -[ELinks/0.10* (*Solaris*)] -Parent=ELinks 0.10 -Platform=Solaris - -[ELinks/0.10* (*Unix*)] -Parent=ELinks 0.10 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.11 - -[ELinks 0.11] -Parent=DefaultProperties -Browser=ELinks -Version=0.11 -MinorVer=11 -Frames=true -Tables=true - -[ELinks (0.11*; *AIX*)] -Parent=ELinks 0.11 -Platform=AIX - -[ELinks (0.11*; *BeOS*)] -Parent=ELinks 0.11 -Platform=BeOS - -[ELinks (0.11*; *CygWin*)] -Parent=ELinks 0.11 -Platform=CygWin - -[ELinks (0.11*; *Darwin*)] -Parent=ELinks 0.11 -Platform=Darwin - -[ELinks (0.11*; *Digital Unix*)] -Parent=ELinks 0.11 -Platform=Digital Unix - -[ELinks (0.11*; *FreeBSD*)] -Parent=ELinks 0.11 -Platform=FreeBSD - -[ELinks (0.11*; *HPUX*)] -Parent=ELinks 0.11 -Platform=HP-UX - -[ELinks (0.11*; *IRIX*)] -Parent=ELinks 0.11 -Platform=IRIX - -[ELinks (0.11*; *Linux*)] -Parent=ELinks 0.11 -Platform=Linux - -[ELinks (0.11*; *NetBSD*)] -Parent=ELinks 0.11 -Platform=NetBSD - -[ELinks (0.11*; *OpenBSD*)] -Parent=ELinks 0.11 -Platform=OpenBSD - -[ELinks (0.11*; *OS/2*)] -Parent=ELinks 0.11 -Platform=OS/2 - -[ELinks (0.11*; *RISC*)] -Parent=ELinks 0.11 -Platform=RISC OS - -[ELinks (0.11*; *Solaris*)] -Parent=ELinks 0.11 -Platform=Solaris - -[ELinks (0.11*; *Unix*)] -Parent=ELinks 0.11 -Platform=Unix - -[ELinks/0.11* (*AIX*)] -Parent=ELinks 0.11 -Platform=AIX - -[ELinks/0.11* (*BeOS*)] -Parent=ELinks 0.11 -Platform=BeOS - -[ELinks/0.11* (*CygWin*)] -Parent=ELinks 0.11 -Platform=CygWin - -[ELinks/0.11* (*Darwin*)] -Parent=ELinks 0.11 -Platform=Darwin - -[ELinks/0.11* (*Digital Unix*)] -Parent=ELinks 0.11 -Platform=Digital Unix - -[ELinks/0.11* (*FreeBSD*)] -Parent=ELinks 0.11 -Platform=FreeBSD - -[ELinks/0.11* (*HPUX*)] -Parent=ELinks 0.11 -Platform=HP-UX - -[ELinks/0.11* (*IRIX*)] -Parent=ELinks 0.11 -Platform=IRIX - -[ELinks/0.11* (*Linux*)] -Parent=ELinks 0.11 -Platform=Linux - -[ELinks/0.11* (*NetBSD*)] -Parent=ELinks 0.11 -Platform=NetBSD - -[ELinks/0.11* (*OpenBSD*)] -Parent=ELinks 0.11 -Platform=OpenBSD - -[ELinks/0.11* (*OS/2*)] -Parent=ELinks 0.11 -Platform=OS/2 - -[ELinks/0.11* (*RISC*)] -Parent=ELinks 0.11 -Platform=RISC OS - -[ELinks/0.11* (*Solaris*)] -Parent=ELinks 0.11 -Platform=Solaris - -[ELinks/0.11* (*Unix*)] -Parent=ELinks 0.11 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.12 - -[ELinks 0.12] -Parent=DefaultProperties -Browser=ELinks -Version=0.12 -MinorVer=12 -Frames=true -Tables=true - -[ELinks (0.12*; *AIX*)] -Parent=ELinks 0.12 -Platform=AIX - -[ELinks (0.12*; *BeOS*)] -Parent=ELinks 0.12 -Platform=BeOS - -[ELinks (0.12*; *CygWin*)] -Parent=ELinks 0.12 -Platform=CygWin - -[ELinks (0.12*; *Darwin*)] -Parent=ELinks 0.12 -Platform=Darwin - -[ELinks (0.12*; *Digital Unix*)] -Parent=ELinks 0.12 -Platform=Digital Unix - -[ELinks (0.12*; *FreeBSD*)] -Parent=ELinks 0.12 -Platform=FreeBSD - -[ELinks (0.12*; *HPUX*)] -Parent=ELinks 0.12 -Platform=HP-UX - -[ELinks (0.12*; *IRIX*)] -Parent=ELinks 0.12 -Platform=IRIX - -[ELinks (0.12*; *Linux*)] -Parent=ELinks 0.12 -Platform=Linux - -[ELinks (0.12*; *NetBSD*)] -Parent=ELinks 0.12 -Platform=NetBSD - -[ELinks (0.12*; *OpenBSD*)] -Parent=ELinks 0.12 -Platform=OpenBSD - -[ELinks (0.12*; *OS/2*)] -Parent=ELinks 0.12 -Platform=OS/2 - -[ELinks (0.12*; *RISC*)] -Parent=ELinks 0.12 -Platform=RISC OS - -[ELinks (0.12*; *Solaris*)] -Parent=ELinks 0.12 -Platform=Solaris - -[ELinks (0.12*; *Unix*)] -Parent=ELinks 0.12 -Platform=Unix - -[ELinks/0.12* (*AIX*)] -Parent=ELinks 0.12 -Platform=AIX - -[ELinks/0.12* (*BeOS*)] -Parent=ELinks 0.12 -Platform=BeOS - -[ELinks/0.12* (*CygWin*)] -Parent=ELinks 0.12 -Platform=CygWin - -[ELinks/0.12* (*Darwin*)] -Parent=ELinks 0.12 -Platform=Darwin - -[ELinks/0.12* (*Digital Unix*)] -Parent=ELinks 0.12 -Platform=Digital Unix - -[ELinks/0.12* (*FreeBSD*)] -Parent=ELinks 0.12 -Platform=FreeBSD - -[ELinks/0.12* (*HPUX*)] -Parent=ELinks 0.12 -Platform=HP-UX - -[ELinks/0.12* (*IRIX*)] -Parent=ELinks 0.12 -Platform=IRIX - -[ELinks/0.12* (*Linux*)] -Parent=ELinks 0.12 -Platform=Linux - -[ELinks/0.12* (*NetBSD*)] -Parent=ELinks 0.12 -Platform=NetBSD - -[ELinks/0.12* (*OpenBSD*)] -Parent=ELinks 0.12 -Platform=OpenBSD - -[ELinks/0.12* (*OS/2*)] -Parent=ELinks 0.12 -Platform=OS/2 - -[ELinks/0.12* (*RISC*)] -Parent=ELinks 0.12 -Platform=RISC OS - -[ELinks/0.12* (*Solaris*)] -Parent=ELinks 0.12 -Platform=Solaris - -[ELinks/0.12* (*Unix*)] -Parent=ELinks 0.12 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.9 - -[ELinks 0.9] -Parent=DefaultProperties -Browser=ELinks -Version=0.9 -MinorVer=9 -Frames=true -Tables=true - -[ELinks (0.9*; *AIX*)] -Parent=ELinks 0.9 -Platform=AIX - -[ELinks (0.9*; *BeOS*)] -Parent=ELinks 0.9 -Platform=BeOS - -[ELinks (0.9*; *CygWin*)] -Parent=ELinks 0.9 -Platform=CygWin - -[ELinks (0.9*; *Darwin*)] -Parent=ELinks 0.9 -Platform=Darwin - -[ELinks (0.9*; *Digital Unix*)] -Parent=ELinks 0.9 -Platform=Digital Unix - -[ELinks (0.9*; *FreeBSD*)] -Parent=ELinks 0.9 -Platform=FreeBSD - -[ELinks (0.9*; *HPUX*)] -Parent=ELinks 0.9 -Platform=HP-UX - -[ELinks (0.9*; *IRIX*)] -Parent=ELinks 0.9 -Platform=IRIX - -[ELinks (0.9*; *Linux*)] -Parent=ELinks 0.9 -Platform=Linux - -[ELinks (0.9*; *NetBSD*)] -Parent=ELinks 0.9 -Platform=NetBSD - -[ELinks (0.9*; *OpenBSD*)] -Parent=ELinks 0.9 -Platform=OpenBSD - -[ELinks (0.9*; *OS/2*)] -Parent=ELinks 0.9 -Platform=OS/2 - -[ELinks (0.9*; *RISC*)] -Parent=ELinks 0.9 -Platform=RISC OS - -[ELinks (0.9*; *Solaris*)] -Parent=ELinks 0.9 -Platform=Solaris - -[ELinks (0.9*; *Unix*)] -Parent=ELinks 0.9 -Platform=Unix - -[ELinks/0.9* (*AIX*)] -Parent=ELinks 0.9 -Platform=AIX - -[ELinks/0.9* (*BeOS*)] -Parent=ELinks 0.9 -Platform=BeOS - -[ELinks/0.9* (*CygWin*)] -Parent=ELinks 0.9 -Platform=CygWin - -[ELinks/0.9* (*Darwin*)] -Parent=ELinks 0.9 -Platform=Darwin - -[ELinks/0.9* (*Digital Unix*)] -Parent=ELinks 0.9 -Platform=Digital Unix - -[ELinks/0.9* (*FreeBSD*)] -Parent=ELinks 0.9 -Platform=FreeBSD - -[ELinks/0.9* (*HPUX*)] -Parent=ELinks 0.9 -Platform=HP-UX - -[ELinks/0.9* (*IRIX*)] -Parent=ELinks 0.9 -Platform=IRIX - -[ELinks/0.9* (*Linux*)] -Parent=ELinks 0.9 -Platform=Linux - -[ELinks/0.9* (*NetBSD*)] -Parent=ELinks 0.9 -Platform=NetBSD - -[ELinks/0.9* (*OpenBSD*)] -Parent=ELinks 0.9 -Platform=OpenBSD - -[ELinks/0.9* (*OS/2*)] -Parent=ELinks 0.9 -Platform=OS/2 - -[ELinks/0.9* (*RISC*)] -Parent=ELinks 0.9 -Platform=RISC OS - -[ELinks/0.9* (*Solaris*)] -Parent=ELinks 0.9 -Platform=Solaris - -[ELinks/0.9* (*Unix*)] -Parent=ELinks 0.9 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AppleWebKit - -[AppleWebKit] -Parent=DefaultProperties -Browser=AppleWebKit -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (KHTML, like Gecko)] -Parent=AppleWebKit - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Camino - -[Camino] -Parent=DefaultProperties -Browser=Camino -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.7*] -Parent=Camino -Version=0.7 -MajorVer=0 -MinorVer=7 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.8*] -Parent=Camino -Version=0.8 -MajorVer=0 -MinorVer=8 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.9*] -Parent=Camino -Version=0.9 -MajorVer=0 -MinorVer=9 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.0*] -Parent=Camino -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.2*] -Parent=Camino -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.3*] -Parent=Camino -Version=1.3 -MajorVer=1 -MinorVer=3 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.4*] -Parent=Camino -Version=1.4 -MajorVer=1 -MinorVer=4 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.5*] -Parent=Camino -Version=1.5 -MajorVer=1 -MinorVer=5 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.6*] -Parent=Camino -Version=1.6 -MajorVer=1 -MinorVer=6 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chimera - -[Chimera] -Parent=DefaultProperties -Browser=Chimera -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Chimera/*] -Parent=Chimera -Platform=MacOSX - -[Mozilla/5.0 Gecko/* Chimera/*] -Parent=Chimera - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Dillo - -[Dillo] -Parent=DefaultProperties -Browser=Dillo -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -CssVersion=2 -supportsCSS=true - -[Dillo/0.6*] -Parent=Dillo -Version=0.6 -MajorVer=0 -MinorVer=6 - -[Dillo/0.7*] -Parent=Dillo -Version=0.7 -MajorVer=0 -MinorVer=7 - -[Dillo/0.8*] -Parent=Dillo -Version=0.8 -MajorVer=0 -MinorVer=8 - -[Dillo/2.0] -Parent=Dillo -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Emacs/W3 - -[Emacs/W3] -Parent=DefaultProperties -Browser=Emacs/W3 -Frames=true -Tables=true -Cookies=true - -[Emacs/W3/2.* (Unix*] -Parent=Emacs/W3 -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Unix - -[Emacs/W3/2.* (X11*] -Parent=Emacs/W3 -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Linux - -[Emacs/W3/3.* (Unix*] -Parent=Emacs/W3 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Unix - -[Emacs/W3/3.* (X11*] -Parent=Emacs/W3 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Linux - -[Emacs/W3/4.* (Unix*] -Parent=Emacs/W3 -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Unix - -[Emacs/W3/4.* (X11*] -Parent=Emacs/W3 -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; fantomas - -[fantomas] -Parent=DefaultProperties -Browser=fantomas -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/4.0 (cloakBrowser)] -Parent=fantomas -Browser=fantomas cloakBrowser - -[Mozilla/4.0 (fantomas shadowMaker Browser)] -Parent=fantomas -Browser=fantomas shadowMaker Browser - -[Mozilla/4.0 (fantomBrowser)] -Parent=fantomas -Browser=fantomas fantomBrowser - -[Mozilla/4.0 (fantomCrew Browser)] -Parent=fantomas -Browser=fantomas fantomCrew Browser - -[Mozilla/4.0 (stealthBrowser)] -Parent=fantomas -Browser=fantomas stealthBrowser - -[multiBlocker browser*] -Parent=fantomas -Browser=fantomas multiBlocker browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FrontPage - -[FrontPage] -Parent=DefaultProperties -Browser=FrontPage -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/?* (compatible; MS FrontPage*)] -Parent=FrontPage - -[MSFrontPage/*] -Parent=FrontPage - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Galeon - -[Galeon] -Parent=DefaultProperties -Browser=Galeon -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/1.*] -Parent=Galeon -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/2.*] -Parent=Galeon -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 Galeon/1.* (X11; Linux*)*] -Parent=Galeon -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 Galeon/2.* (X11; Linux*)*] -Parent=Galeon -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HP Secure Web Browser - -[HP Secure Web Browser] -Parent=DefaultProperties -Browser=HP Secure Web Browser -Platform=OpenVMS -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.0*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.1*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.2*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.3*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.4*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.4 -MajorVer=1 -MinorVer=4 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.5*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.5 -MajorVer=1 -MinorVer=5 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.6*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.6 -MajorVer=1 -MinorVer=6 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.7*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.7 -MajorVer=1 -MinorVer=7 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.8*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.8 -MajorVer=1 -MinorVer=8 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IBrowse - -[IBrowse] -Parent=DefaultProperties -Browser=IBrowse -Platform=Amiga -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Arexx (compatible; MSIE 6.0; AmigaOS5.0) IBrowse 4.0] -Parent=IBrowse -Version=4.0 -MajorVer=4 -MinorVer=0 - -[IBrowse/1.22 (AmigaOS *)] -Parent=IBrowse -Version=1.22 -MajorVer=1 -MinorVer=22 - -[IBrowse/2.1 (AmigaOS *)] -Parent=IBrowse -Version=2.1 -MajorVer=2 -MinorVer=1 - -[IBrowse/2.2 (AmigaOS *)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=2 - -[IBrowse/2.3 (AmigaOS *)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=3 - -[Mozilla/* (Win98; I) IBrowse/2.1 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/* (Win98; I) IBrowse/2.2 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Mozilla/* (Win98; I) IBrowse/2.3 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.3 -MajorVer=2 -MinorVer=3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iCab - -[iCab] -Parent=DefaultProperties -Browser=iCab -Frames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[iCab/2.7* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=Mac68K - -[iCab/2.7* (Macintosh; ?; PPC*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=MacPPC - -[iCab/2.8* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacOSX - -[iCab/2.8* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=Mac68K - -[iCab/2.8* (Macintosh; ?; PPC)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacPPC - -[iCab/2.9* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacOSX - -[iCab/2.9* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=Mac68K - -[iCab/2.9* (Macintosh; ?; PPC*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacPPC - -[iCab/3.0* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[iCab/3.0* (Macintosh; ?; PPC*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacPPC -CssVersion=2 -supportsCSS=true - -[iCab/4.0 (Macintosh; U; *Mac OS X)] -Parent=iCab -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (compatible; iCab 3.0*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; iCab 3.0*; Macintosh; ?; PPC*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacPPC -CssVersion=2 -supportsCSS=true - -[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; 68K*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=Mac68K - -[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacOSX - -[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacOSX - -[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 4.2*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iSiloX - -[iSiloX] -Parent=DefaultProperties -Browser=iSiloX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -Crawler=true -CssVersion=2 -supportsCSS=true - -[iSiloX/4.0* MacOS] -Parent=iSiloX -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacPPC - -[iSiloX/4.0* Windows/32] -Parent=iSiloX -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Win32 -Win32=true - -[iSiloX/4.1* MacOS] -Parent=iSiloX -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=MacPPC - -[iSiloX/4.1* Windows/32] -Parent=iSiloX -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=Win32 -Win32=true - -[iSiloX/4.2* MacOS] -Parent=iSiloX -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=MacPPC - -[iSiloX/4.2* Windows/32] -Parent=iSiloX -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=Win32 -Win32=true - -[iSiloX/4.3* MacOS] -Parent=iSiloX -Version=4.3 -MajorVer=4 -MinorVer=4 -Platform=MacOSX - -[iSiloX/4.3* Windows/32] -Parent=iSiloX -Version=4.3 -MajorVer=4 -MinorVer=3 -Platform=Win32 -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycoris Desktop/LX - -[Lycoris Desktop/LX] -Parent=DefaultProperties -Browser=Lycoris Desktop/LX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -Crawler=true - -[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*: Desktop/LX Amethyst) Gecko/*] -Parent=Lycoris Desktop/LX -Version=1.1 -MajorVer=1 -MinorVer=1 -Platform=Linux - -[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*; Desktop/LX Amethyst) Gecko/*] -Parent=Lycoris Desktop/LX -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mosaic - -[Mosaic] -Parent=DefaultProperties -Browser=Mosaic -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[Mozilla/4.0 (VMS_Mosaic)] -Parent=Mosaic -Platform=OpenVMS - -[VMS_Mosaic/3.7*] -Parent=Mosaic -Version=3.7 -MajorVer=3 -MinorVer=7 -Platform=OpenVMS - -[VMS_Mosaic/3.8*] -Parent=Mosaic -Version=3.8 -MajorVer=3 -MinorVer=8 -Platform=OpenVMS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetPositive - -[NetPositive] -Parent=DefaultProperties -Browser=NetPositive -Platform=BeOS -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[*NetPositive/2.2*] -Parent=NetPositive -Version=2.2 -MajorVer=2 -MinorVer=2 - -[*NetPositive/2.2*BeOS*] -Parent=NetPositive -Version=2.2 -MajorVer=2 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OmniWeb - -[OmniWeb] -Parent=DefaultProperties -Browser=OmniWeb -Platform=MacOSX -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v4*] -Parent=OmniWeb -Version=4.5 -MajorVer=4 -MinorVer=5 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v5*] -Parent=OmniWeb -Version=5. -MajorVer=5 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v6*] -Parent=OmniWeb -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/4*] -Parent=OmniWeb -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacPPC - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/5*] -Parent=OmniWeb -Version=5.0 -MajorVer=5 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/6*] -Parent=OmniWeb -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=MacPPC - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.34] -Parent=OmniWeb -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.34] -Parent=OmniWeb -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v607] -Parent=OmniWeb -Version=5.5 -MajorVer=5 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v607] -Parent=OmniWeb -Version=5.5 -MajorVer=5 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/522+ (KHTML, like Gecko, Safari/522) OmniWeb/v613] -Parent=OmniWeb -Version=5.6 -MajorVer=5 -MinorVer=6 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/522+ (KHTML, like Gecko, Safari/522) OmniWeb/v613] -Parent=OmniWeb -Version=5.6 -MajorVer=5 -MinorVer=6 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v496] -Parent=OmniWeb -Version=4.5 -MajorVer=4 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558.36 ] -Parent=OmniWeb -Version=5.0 -MajorVer=5 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Shiira - -[Shiira] -Parent=DefaultProperties -Browser=Shiira -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/0.9*] -Parent=Shiira -Version=0.9 -MajorVer=0 -MinorVer=9 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.0*] -Parent=Shiira -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.1*] -Parent=Shiira -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.2*] -Parent=Shiira -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/2.1*] -Parent=Shiira -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/2.2*] -Parent=Shiira -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Windows Maker] -Parent=DefaultProperties -Browser=WMaker -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -VBScript=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[WMaker*] -Parent=Windows Maker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.0 - -[K-Meleon 1.0] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.0 -MajorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.1 - -[K-Meleon 1.1] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.1 -MajorVer=1 -MinorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.5 - -[K-Meleon 1.5] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.5 -MajorVer=1 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Platform=WinVista - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 3.0 - -[Konqueror 3.0] -Parent=DefaultProperties -Browser=Konqueror -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[*Konqueror/3.0*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -IFrames=false - -[*Konqueror/3.0*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=FreeBSD -IFrames=false - -[*Konqueror/3.0*Linux*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Linux -IFrames=false - -[*Konqueror/3.1*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 - -[*Konqueror/3.1*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 -Platform=FreeBSD - -[*Konqueror/3.1*Linux*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 - -[*Konqueror/3.2*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 - -[*Konqueror/3.2*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 -Platform=FreeBSD - -[*Konqueror/3.2*Linux*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 -Platform=Linux - -[*Konqueror/3.3*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 - -[*Konqueror/3.3*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=FreeBSD - -[*Konqueror/3.3*Linux*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=Linux - -[*Konqueror/3.3*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=OpenBSD - -[*Konqueror/3.4*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 - -[*Konqueror/3.4*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=FreeBSD - -[*Konqueror/3.4*Linux*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=Linux - -[*Konqueror/3.4*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=OpenBSD - -[*Konqueror/3.5*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 - -[*Konqueror/3.5*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=FreeBSD - -[*Konqueror/3.5*Linux*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=Linux - -[*Konqueror/3.5*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=OpenBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.0 - -[Konqueror 4.0] -Parent=DefaultProperties -Browser=Konqueror -Version=4.0 -MajorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.0*; Debian) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; *Linux) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; FreeBSD) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; NetBSD) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.1 - -[Konqueror 4.1] -Parent=DefaultProperties -Browser=Konqueror -Version=4.1 -MajorVer=4 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.1*; *Linux*) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.1*; Debian) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.1*; FreeBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.1*; NetBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.2 - -[Konqueror 4.2] -Parent=DefaultProperties -Browser=Konqueror -Version=4.2 -MajorVer=4 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.2*; *Linux*) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.2*; Debian) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.2*; FreeBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.2*; NetBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari - -[Safari] -Parent=DefaultProperties -Browser=Safari -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/100*] -Parent=Safari -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/125*] -Parent=Safari -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/312*] -Parent=Safari -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/412*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/416*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/417*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/418*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/419*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/52*] -Parent=Safari -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/85*] -Parent=Safari -Version=1.0 -MajorVer=1 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.0 - -[Safari 3.0] -Parent=DefaultProperties -Browser=Safari -Version=3.0 -MajorVer=3 -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.1 - -[Safari 3.1] -Parent=DefaultProperties -Browser=Safari -Version=3.1 -MajorVer=3 -MinorVer=1 -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.2 - -[Safari 3.2] -Parent=DefaultProperties -Browser=Safari -Version=3.2 -MajorVer=3 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 4.0 - -[Safari 4.0] -Parent=DefaultProperties -Browser=Safari -Version=4.0 -MajorVer=4 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *) AppleWebKit/* (KHTML, like Gecko) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *) AppleWebKit/* (KHTML, like Gecko) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 7.0; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 7.0; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 10.0 - -[Opera 10.0] -Parent=DefaultProperties -Browser=Opera -Version=10.0 -MajorVer=10 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 10.0*] -Parent=Opera 10.0 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 10.0*] -Parent=Opera 10.0 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (Linux*)*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (Macintosh; *Mac OS X;*)*] -Parent=Opera 10.0 -Platform=MacOSX - -[Opera/10.0* (Windows 95*)*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Opera/10.0* (Windows 98*)*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Opera/10.0* (Windows CE*)*] -Parent=Opera 10.0 -Platform=WinCE -Win32=true - -[Opera/10.0* (Windows ME*)*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Opera/10.0* (Windows NT 4.0*)*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Opera/10.0* (Windows NT 5.0*)*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Opera/10.0* (Windows NT 5.1*)*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Opera/10.0* (Windows NT 5.2*)*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Opera/10.0* (Windows NT 6.0*)*] -Parent=Opera 10.0 -Platform=WinVista -Win32=true - -[Opera/10.0* (Windows NT 6.1*)*] -Parent=Opera 10.0 -Platform=Win7 - -[Opera/10.0* (Windows XP*)*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Opera/10.0* (X11; FreeBSD*)*] -Parent=Opera 10.0 -Platform=FreeBSD - -[Opera/10.0* (X11; Linux*)*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (X11; SunOS*)*] -Parent=Opera 10.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.0 - -[Opera 7.0] -Parent=DefaultProperties -Browser=Opera -Version=7.0 -MajorVer=7 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/3.0 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/3.0 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/3.0 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/3.0 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/3.0 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/3.0 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 2000) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 95) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 98) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows ME) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 4.0) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.0) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows XP) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.78 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.78 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/4.78 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/4.78 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/4.78 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/4.78 (Windows NT 5.1; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.78 (Windows Windows NT 5.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.78 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows NT 5.1; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Opera/7.0* (Windows 2000; ?)*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Opera/7.0* (Windows 95; ?)*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Opera/7.0* (Windows 98; ?)*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Opera/7.0* (Windows ME; ?)*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Opera/7.0* (Windows NT 4.0; ?)*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Opera/7.0* (Windows NT 5.0; ?)*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Opera/7.0* (Windows NT 5.1; ?)*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Opera/7.0* (Windows XP; ?)*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.1 - -[Opera 7.1] -Parent=DefaultProperties -Browser=Opera -Version=7.1 -MajorVer=7 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows 2000; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Opera/7.1* (Linux*; ?)*] -Parent=Opera 7.1 -Platform=Linux - -[Opera/7.1* (Windows 95; ?)*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Opera/7.1* (Windows 98; ?)*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Opera/7.1* (Windows ME; ?)*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Opera/7.1* (Windows NT 4.0; ?)*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Opera/7.1* (Windows NT 5.0; ?)*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Opera/7.1* (Windows NT 5.1; ?)*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Opera/7.1* (Windows XP; ?)*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.2 - -[Opera 7.2] -Parent=DefaultProperties -Browser=Opera -Version=7.2 -MajorVer=7 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.2*] -Parent=Opera 7.2 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows 2000; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Opera/7.2* (Linux*; ?)*] -Parent=Opera 7.2 -Platform=Linux - -[Opera/7.2* (Windows 95; ?)*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Opera/7.2* (Windows 98; ?)*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Opera/7.2* (Windows ME; ?)*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Opera/7.2* (Windows NT 4.0; ?)*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Opera/7.2* (Windows NT 5.0; ?)*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Opera/7.2* (Windows NT 5.1; ?)*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Opera/7.2* (Windows NT 5.2; ?)*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Opera/7.2* (Windows XP; ?)*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Opera/7.2* (X11; FreeBSD*; ?)*] -Parent=Opera 7.2 -Platform=FreeBSD - -[Opera/7.2* (X11; Linux*; ?)*] -Parent=Opera 7.2 -Platform=Linux - -[Opera/7.2* (X11; SunOS*)*] -Parent=Opera 7.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.5 - -[Opera 7.5] -Parent=DefaultProperties -Browser=Opera -Version=7.5 -MajorVer=7 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.5*] -Parent=Opera 7.5 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Opera/7.5* (Linux*; ?)*] -Parent=Opera 7.5 -Platform=Linux - -[Opera/7.5* (Macintosh; *Mac OS X; ?)*] -Parent=Opera 7.5 -Platform=MacOSX - -[Opera/7.5* (Windows 95; ?)*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Opera/7.5* (Windows 98; ?)*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Opera/7.5* (Windows ME; ?)*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Opera/7.5* (Windows NT 4.0; ?)*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Opera/7.5* (Windows NT 5.0; ?)*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Opera/7.5* (Windows NT 5.1; ?)*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Opera/7.5* (Windows NT 5.2; ?)*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Opera/7.5* (Windows XP; ?)*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Opera/7.5* (X11; FreeBSD*; ?)*] -Parent=Opera 7.5 -Platform=FreeBSD - -[Opera/7.5* (X11; Linux*; ?)*] -Parent=Opera 7.5 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.6 - -[Opera 7.6] -Parent=DefaultProperties -Browser=Opera -Version=7.6 -MajorVer=7 -MinorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.6*] -Parent=Opera 7.6 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Opera/7.6* (Linux*)*] -Parent=Opera 7.6 -Platform=Linux - -[Opera/7.6* (Macintosh; *Mac OS X; ?)*] -Parent=Opera 7.6 -Platform=MacOSX - -[Opera/7.6* (Windows 95*)*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Opera/7.6* (Windows 98*)*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Opera/7.6* (Windows ME*)*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Opera/7.6* (Windows NT 4.0*)*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Opera/7.6* (Windows NT 5.0*)*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Opera/7.6* (Windows NT 5.1*)*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Opera/7.6* (Windows NT 5.2*)*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Opera/7.6* (Windows XP*)*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Opera/7.6* (X11; FreeBSD*)*] -Parent=Opera 7.6 -Platform=FreeBSD - -[Opera/7.6* (X11; Linux*)*] -Parent=Opera 7.6 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.0 - -[Opera 8.0] -Parent=DefaultProperties -Browser=Opera -Version=8.0 -MajorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacOSX - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.0*] -Parent=Opera 8.0 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Opera/8.0* (Linux*)*] -Parent=Opera 8.0 -Platform=Linux - -[Opera/8.0* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.0 -Platform=MacOSX - -[Opera/8.0* (Windows 95*)*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Opera/8.0* (Windows 98*)*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Opera/8.0* (Windows CE*)*] -Parent=Opera 8.0 -Platform=WinCE -Win32=true - -[Opera/8.0* (Windows ME*)*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Opera/8.0* (Windows NT 4.0*)*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Opera/8.0* (Windows NT 5.0*)*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Opera/8.0* (Windows NT 5.1*)*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Opera/8.0* (Windows NT 5.2*)*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Opera/8.0* (Windows XP*)*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Opera/8.0* (X11; FreeBSD*)*] -Parent=Opera 8.0 -Platform=FreeBSD - -[Opera/8.0* (X11; Linux*)*] -Parent=Opera 8.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.1 - -[Opera 8.1] -Parent=DefaultProperties -Browser=Opera -Version=8.1 -MajorVer=8 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.1*] -Parent=Opera 8.1 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.1*] -Parent=Opera 8.1 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.1*] -Parent=Opera 8.1 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Opera/8.1* (Linux*)*] -Parent=Opera 8.1 -Platform=Linux - -[Opera/8.1* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.1 -Platform=MacOSX - -[Opera/8.1* (Windows 95*)*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Opera/8.1* (Windows 98*)*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Opera/8.1* (Windows CE*)*] -Parent=Opera 8.1 -Platform=WinCE -Win32=true - -[Opera/8.1* (Windows ME*)*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Opera/8.1* (Windows NT 4.0*)*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Opera/8.1* (Windows NT 5.0*)*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Opera/8.1* (Windows NT 5.1*)*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Opera/8.1* (Windows NT 5.2*)*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Opera/8.1* (Windows XP*)*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Opera/8.1* (X11; FreeBSD*)*] -Parent=Opera 8.1 -Platform=FreeBSD - -[Opera/8.1* (X11; Linux*)*] -Parent=Opera 8.1 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.5 - -[Opera 8.5] -Parent=DefaultProperties -Browser=Opera -Version=8.5 -MajorVer=8 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X;*) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.5*] -Parent=Opera 8.5 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (Macintosh; PPC Mac OS X;*) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Opera/8.5* (Linux*)*] -Parent=Opera 8.5 -Platform=Linux - -[Opera/8.5* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.5 -Platform=MacOSX - -[Opera/8.5* (Windows 95*)*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Opera/8.5* (Windows 98*)*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Opera/8.5* (Windows CE*)*] -Parent=Opera 8.5 -Platform=WinCE -Win32=true - -[Opera/8.5* (Windows ME*)*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Opera/8.5* (Windows NT 4.0*)*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Opera/8.5* (Windows NT 5.0*)*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Opera/8.5* (Windows NT 5.1*)*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Opera/8.5* (Windows NT 5.2*)*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Opera/8.5* (Windows XP*)*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Opera/8.5* (X11; FreeBSD*)*] -Parent=Opera 8.5 -Platform=FreeBSD - -[Opera/8.5* (X11; Linux*)*] -Parent=Opera 8.5 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.0 - -[Opera 9.0] -Parent=DefaultProperties -Browser=Opera -Version=9.0 -MajorVer=9 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.0*] -Parent=Opera 9.0 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.0*] -Parent=Opera 9.0 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (X11; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Opera/9.0* (Linux*)*] -Parent=Opera 9.0 -Platform=Linux - -[Opera/9.0* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.0 -Platform=MacOSX - -[Opera/9.0* (Windows 95*)*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Opera/9.0* (Windows 98*)*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Opera/9.0* (Windows CE*)*] -Parent=Opera 9.0 -Platform=WinCE -Win32=true - -[Opera/9.0* (Windows ME*)*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Opera/9.0* (Windows NT 4.0*)*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Opera/9.0* (Windows NT 5.0*)*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Opera/9.0* (Windows NT 5.1*)*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Opera/9.0* (Windows NT 5.2*)*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Opera/9.0* (Windows NT 6.0*)*] -Parent=Opera 9.0 -Platform=WinVista -Win32=true - -[Opera/9.0* (Windows XP*)*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Opera/9.0* (X11; FreeBSD*)*] -Parent=Opera 9.0 -Platform=FreeBSD - -[Opera/9.0* (X11; Linux*)*] -Parent=Opera 9.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.1 - -[Opera 9.1] -Parent=DefaultProperties -Browser=Opera -Version=9.1 -MajorVer=9 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.1*] -Parent=Opera 9.1 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.1*] -Parent=Opera 9.1 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Mozilla/* (X11; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (Linux*)*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.1 -Platform=MacOSX - -[Opera/9.1* (Windows 95*)*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Opera/9.1* (Windows 98*)*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Opera/9.1* (Windows CE*)*] -Parent=Opera 9.1 -Platform=WinCE -Win32=true - -[Opera/9.1* (Windows ME*)*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Opera/9.1* (Windows NT 4.0*)*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Opera/9.1* (Windows NT 5.0*)*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Opera/9.1* (Windows NT 5.1*)*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Opera/9.1* (Windows NT 5.2*)*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Opera/9.1* (Windows NT 6.0*)*] -Parent=Opera 9.1 -Platform=WinVista -Win32=true - -[Opera/9.1* (Windows XP*)*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Opera/9.1* (X11; FreeBSD*)*] -Parent=Opera 9.1 -Platform=FreeBSD - -[Opera/9.1* (X11; Linux*)*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (X11; SunOS*)*] -Parent=Opera 9.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.2 - -[Opera 9.2] -Parent=DefaultProperties -Browser=Opera -Version=9.2 -MajorVer=9 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.2*] -Parent=Opera 9.2 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.2*] -Parent=Opera 9.2 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (Linux*)*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.2 -Platform=MacOSX - -[Opera/9.2* (Windows 95*)*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Opera/9.2* (Windows 98*)*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Opera/9.2* (Windows CE*)*] -Parent=Opera 9.2 -Platform=WinCE -Win32=true - -[Opera/9.2* (Windows ME*)*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Opera/9.2* (Windows NT 4.0*)*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Opera/9.2* (Windows NT 5.0*)*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Opera/9.2* (Windows NT 5.1*)*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Opera/9.2* (Windows NT 5.2*)*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Opera/9.2* (Windows NT 6.0*)*] -Parent=Opera 9.2 -Platform=WinVista -Win32=true - -[Opera/9.2* (Windows NT 6.1*)*] -Parent=Opera 9.2 -Platform=Win7 - -[Opera/9.2* (Windows XP*)*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Opera/9.2* (X11; FreeBSD*)*] -Parent=Opera 9.2 -Platform=FreeBSD - -[Opera/9.2* (X11; Linux*)*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (X11; SunOS*)*] -Parent=Opera 9.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.3 - -[Opera 9.3] -Parent=DefaultProperties -Browser=Opera -Version=9.3 -MajorVer=9 -MinorVer=3 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.3*] -Parent=Opera 9.3 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.3*] -Parent=Opera 9.3 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (Linux*)*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.3 -Platform=MacOSX - -[Opera/9.3* (Windows 95*)*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Opera/9.3* (Windows 98*)*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Opera/9.3* (Windows CE*)*] -Parent=Opera 9.3 -Platform=WinCE -Win32=true - -[Opera/9.3* (Windows ME*)*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Opera/9.3* (Windows NT 4.0*)*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Opera/9.3* (Windows NT 5.0*)*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Opera/9.3* (Windows NT 5.1*)*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Opera/9.3* (Windows NT 5.2*)*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Opera/9.3* (Windows NT 6.0*)*] -Parent=Opera 9.3 -Platform=WinVista -Win32=true - -[Opera/9.3* (Windows NT 6.1*)*] -Parent=Opera 9.3 -Platform=Win7 - -[Opera/9.3* (Windows XP*)*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Opera/9.3* (X11; FreeBSD*)*] -Parent=Opera 9.3 -Platform=FreeBSD - -[Opera/9.3* (X11; Linux*)*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (X11; SunOS*)*] -Parent=Opera 9.3 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.4 - -[Opera 9.4] -Parent=DefaultProperties -Browser=Opera -Version=9.4 -MajorVer=9 -MinorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.4*] -Parent=Opera 9.4 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.4*] -Parent=Opera 9.4 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (Linux*)*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.4 -Platform=MacOSX - -[Opera/9.4* (Windows 95*)*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Opera/9.4* (Windows 98*)*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Opera/9.4* (Windows CE*)*] -Parent=Opera 9.4 -Platform=WinCE -Win32=true - -[Opera/9.4* (Windows ME*)*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Opera/9.4* (Windows NT 4.0*)*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Opera/9.4* (Windows NT 5.0*)*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Opera/9.4* (Windows NT 5.1*)*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Opera/9.4* (Windows NT 5.2*)*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Opera/9.4* (Windows NT 6.0*)*] -Parent=Opera 9.4 -Platform=WinVista -Win32=true - -[Opera/9.4* (Windows NT 6.1*)*] -Parent=Opera 9.4 -Platform=Win7 - -[Opera/9.4* (Windows XP*)*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Opera/9.4* (X11; FreeBSD*)*] -Parent=Opera 9.4 -Platform=FreeBSD - -[Opera/9.4* (X11; Linux*)*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (X11; SunOS*)*] -Parent=Opera 9.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.5 - -[Opera 9.5] -Parent=DefaultProperties -Browser=Opera -Version=9.5 -MajorVer=9 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.5*] -Parent=Opera 9.5 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.5*] -Parent=Opera 9.5 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (Linux*)*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.5 -Platform=MacOSX - -[Opera/9.5* (Windows 95*)*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Opera/9.5* (Windows 98*)*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Opera/9.5* (Windows CE*)*] -Parent=Opera 9.5 -Platform=WinCE -Win32=true - -[Opera/9.5* (Windows ME*)*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Opera/9.5* (Windows NT 4.0*)*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Opera/9.5* (Windows NT 5.0*)*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Opera/9.5* (Windows NT 5.1*)*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Opera/9.5* (Windows NT 5.2*)*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Opera/9.5* (Windows NT 6.0*)*] -Parent=Opera 9.5 -Platform=WinVista -Win32=true - -[Opera/9.5* (Windows NT 6.1*)*] -Parent=Opera 9.5 -Platform=Win7 - -[Opera/9.5* (Windows XP*)*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Opera/9.5* (X11; FreeBSD*)*] -Parent=Opera 9.5 -Platform=FreeBSD - -[Opera/9.5* (X11; Linux*)*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (X11; SunOS*)*] -Parent=Opera 9.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.6 - -[Opera 9.6] -Parent=DefaultProperties -Browser=Opera -Version=9.6 -MajorVer=9 -MinorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.6*] -Parent=Opera 9.6 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.6*] -Parent=Opera 9.6 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (Linux*)*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.6 -Platform=MacOSX - -[Opera/9.6* (Windows 95*)*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Opera/9.6* (Windows 98*)*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Opera/9.6* (Windows CE*)*] -Parent=Opera 9.6 -Platform=WinCE -Win32=true - -[Opera/9.6* (Windows ME*)*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Opera/9.6* (Windows NT 4.0*)*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Opera/9.6* (Windows NT 5.0*)*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Opera/9.6* (Windows NT 5.1*)*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Opera/9.6* (Windows NT 5.2*)*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Opera/9.6* (Windows NT 6.0*)*] -Parent=Opera 9.6 -Platform=WinVista -Win32=true - -[Opera/9.6* (Windows NT 6.1*)*] -Parent=Opera 9.6 -Platform=Win7 - -[Opera/9.6* (Windows XP*)*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Opera/9.6* (X11; FreeBSD*)*] -Parent=Opera 9.6 -Platform=FreeBSD - -[Opera/9.6* (X11; Linux*)*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (X11; SunOS*)*] -Parent=Opera 9.6 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.0 - -[Netscape 4.0] -Parent=DefaultProperties -Browser=Netscape -Version=4.0 -MajorVer=4 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0*(Macintosh*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=MacPPC - -[Mozilla/4.0*(Win95;*] -Parent=Netscape 4.0 -Platform=Win95 - -[Mozilla/4.0*(Win98;*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=Win98 - -[Mozilla/4.0*(WinNT*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=WinNT - -[Mozilla/4.0*(X11;*)] -Parent=Netscape 4.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.5 - -[Netscape 4.5] -Parent=DefaultProperties -Browser=Netscape -Version=4.5 -MajorVer=4 -MinorVer=5 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.5*(Macintosh; ?; PPC)] -Parent=Netscape 4.5 -Platform=MacPPC - -[Mozilla/4.5*(Win2000; ?)] -Parent=Netscape 4.5 -Platform=Win2000 - -[Mozilla/4.5*(Win95; ?)] -Parent=Netscape 4.5 -Platform=Win95 - -[Mozilla/4.5*(Win98; ?)] -Parent=Netscape 4.5 -Platform=Win98 - -[Mozilla/4.5*(WinME; ?)] -Parent=Netscape 4.5 -Platform=WinME - -[Mozilla/4.5*(WinNT; ?)] -Parent=Netscape 4.5 -Platform=WinNT - -[Mozilla/4.5*(WinXP; ?)] -Parent=Netscape 4.5 -Platform=WinXP - -[Mozilla/4.5*(X11*)] -Parent=Netscape 4.5 -Platform=Linux - -[Mozilla/4.51*(Macintosh; ?; PPC)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 - -[Mozilla/4.51*(Win2000; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win2000 - -[Mozilla/4.51*(Win95; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win95 - -[Mozilla/4.51*(Win98; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win98 - -[Mozilla/4.51*(WinME; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinME - -[Mozilla/4.51*(WinNT; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinNT - -[Mozilla/4.51*(WinXP; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinXP - -[Mozilla/4.51*(X11*)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.6 - -[Netscape 4.6] -Parent=DefaultProperties -Browser=Netscape -Version=4.6 -MajorVer=4 -MinorVer=6 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.6 * (OS/2; ?)] -Parent=Netscape 4.6 -Platform=OS/2 - -[Mozilla/4.6*(Macintosh; ?; PPC)] -Parent=Netscape 4.6 -Platform=MacPPC - -[Mozilla/4.6*(Win95; ?)] -Parent=Netscape 4.6 -Platform=Win95 - -[Mozilla/4.6*(Win98; ?)] -Parent=Netscape 4.6 -Platform=Win98 - -[Mozilla/4.6*(WinNT; ?)] -Parent=Netscape 4.6 -Platform=WinNT - -[Mozilla/4.61*(Macintosh; ?; PPC)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=MacPPC - -[Mozilla/4.61*(OS/2; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=OS/2 - -[Mozilla/4.61*(Win95; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=Win95 - -[Mozilla/4.61*(Win98; ?)] -Parent=Netscape 4.6 -Version=4.61 -Platform=Win98 - -[Mozilla/4.61*(WinNT; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=WinNT - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.7 - -[Netscape 4.7] -Parent=DefaultProperties -Browser=Netscape -Version=4.7 -MajorVer=4 -MinorVer=7 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.7 * (Win2000; ?)] -Parent=Netscape 4.7 -Platform=Win2000 - -[Mozilla/4.7*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=MacPPC - -[Mozilla/4.7*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win95 - -[Mozilla/4.7*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win98 - -[Mozilla/4.7*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=WinNT -Win32=true - -[Mozilla/4.7*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win2000 -Win32=true - -[Mozilla/4.7*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=WinXP -Win32=true - -[Mozilla/4.7*(WinNT; ?)*] -Parent=Netscape 4.7 -Platform=WinNT - -[Mozilla/4.7*(X11*)*] -Parent=Netscape 4.7 -Platform=Linux - -[Mozilla/4.7*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Platform=SunOS - -[Mozilla/4.71*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=MacPPC - -[Mozilla/4.71*(Win95; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win95 - -[Mozilla/4.71*(Win98; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win98 - -[Mozilla/4.71*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinNT -Win32=true - -[Mozilla/4.71*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win2000 -Win32=true - -[Mozilla/4.71*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinXP -Win32=true - -[Mozilla/4.71*(WinNT; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinNT - -[Mozilla/4.71*(X11*)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Linux - -[Mozilla/4.71*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=SunOS - -[Mozilla/4.72*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=MacPPC - -[Mozilla/4.72*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win95 - -[Mozilla/4.72*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win98 - -[Mozilla/4.72*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinNT -Win32=true - -[Mozilla/4.72*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win2000 -Win32=true - -[Mozilla/4.72*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinXP -Win32=true - -[Mozilla/4.72*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinNT - -[Mozilla/4.72*(X11*)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Linux - -[Mozilla/4.72*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=SunOS - -[Mozilla/4.73*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=MacPPC - -[Mozilla/4.73*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win95 - -[Mozilla/4.73*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win98 - -[Mozilla/4.73*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinNT -Win32=true - -[Mozilla/4.73*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win2000 -Win32=true - -[Mozilla/4.73*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinXP -Win32=true - -[Mozilla/4.73*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinNT - -[Mozilla/4.73*(X11*)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Linux - -[Mozilla/4.73*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=SunOS - -[Mozilla/4.74*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=MacPPC - -[Mozilla/4.74*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win95 - -[Mozilla/4.74*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win98 - -[Mozilla/4.74*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinNT -Win32=true - -[Mozilla/4.74*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win2000 -Win32=true - -[Mozilla/4.74*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinXP -Win32=true - -[Mozilla/4.74*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinNT - -[Mozilla/4.74*(X11*)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Linux - -[Mozilla/4.74*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=SunOS - -[Mozilla/4.75*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=MacPPC - -[Mozilla/4.75*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win95 - -[Mozilla/4.75*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win98 - -[Mozilla/4.75*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinNT -Win32=true - -[Mozilla/4.75*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win2000 -Win32=true - -[Mozilla/4.75*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinXP -Win32=true - -[Mozilla/4.75*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinNT - -[Mozilla/4.75*(X11*)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Linux - -[Mozilla/4.75*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=SunOS - -[Mozilla/4.76*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=MacPPC - -[Mozilla/4.76*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win95 - -[Mozilla/4.76*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win98 - -[Mozilla/4.76*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinNT -Win32=true - -[Mozilla/4.76*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win2000 -Win32=true - -[Mozilla/4.76*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinXP -Win32=true - -[Mozilla/4.76*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinNT - -[Mozilla/4.76*(X11*)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Linux - -[Mozilla/4.76*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=SunOS - -[Mozilla/4.77*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=MacPPC - -[Mozilla/4.77*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win95 - -[Mozilla/4.77*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win98 - -[Mozilla/4.77*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinNT -Win32=true - -[Mozilla/4.77*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win2000 -Win32=true - -[Mozilla/4.77*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinXP -Win32=true - -[Mozilla/4.77*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinNT - -[Mozilla/4.77*(X11*)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Linux - -[Mozilla/4.77*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=SunOS - -[Mozilla/4.78*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=MacPPC - -[Mozilla/4.78*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win95 - -[Mozilla/4.78*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win98 - -[Mozilla/4.78*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinNT -Win32=true - -[Mozilla/4.78*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win2000 -Win32=true - -[Mozilla/4.78*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinXP -Win32=true - -[Mozilla/4.78*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinNT - -[Mozilla/4.78*(X11*)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Linux - -[Mozilla/4.78*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=SunOS - -[Mozilla/4.79*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=MacPPC - -[Mozilla/4.79*(Win95; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win95 - -[Mozilla/4.79*(Win98; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win98 - -[Mozilla/4.79*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinNT -Win32=true - -[Mozilla/4.79*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win2000 -Win32=true - -[Mozilla/4.79*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinXP -Win32=true - -[Mozilla/4.79*(WinNT; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinNT - -[Mozilla/4.79*(X11*)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Linux - -[Mozilla/4.79*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.8 - -[Netscape 4.8] -Parent=DefaultProperties -Browser=Netscape -Version=4.8 -MajorVer=4 -MinorVer=8 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.8*(Macintosh; ?; MacPPC)*] -Parent=Netscape 4.8 -Platform=MacPPC - -[Mozilla/4.8*(Macintosh; ?; PPC Mac OS X*] -Parent=Netscape 4.8 -Platform=MacOSX - -[Mozilla/4.8*(Macintosh; ?; PPC)*] -Parent=Netscape 4.8 -Platform=MacPPC - -[Mozilla/4.8*(Win95; *)*] -Parent=Netscape 4.8 - -[Mozilla/4.8*(Win98; *)*] -Parent=Netscape 4.8 -Platform=Win98 - -[Mozilla/4.8*(Windows NT 4.0; *)*] -Parent=Netscape 4.8 -Platform=WinNT -Win32=true - -[Mozilla/4.8*(Windows NT 5.0; *)*] -Parent=Netscape 4.8 -Platform=Win2000 -Win32=true - -[Mozilla/4.8*(Windows NT 5.1; *)*] -Parent=Netscape 4.8 -Platform=WinXP -Win32=true - -[Mozilla/4.8*(WinNT; *)*] -Parent=Netscape 4.8 -Platform=WinNT - -[Mozilla/4.8*(X11; *)*] -Parent=Netscape 4.8 -Platform=Linux - -[Mozilla/4.8*(X11; *SunOS*)*] -Parent=Netscape 4.8 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.0 - -[Netscape 6.0] -Parent=DefaultProperties -Browser=Netscape -Version=6.0 -MajorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.1 - -[Netscape 6.1] -Parent=DefaultProperties -Browser=Netscape -Version=6.1 -MajorVer=6 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.2 - -[Netscape 6.2] -Parent=DefaultProperties -Browser=Netscape -Version=6.2 -MajorVer=6 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.0 - -[Netscape 7.0] -Parent=DefaultProperties -Browser=Netscape -Version=7.0 -MajorVer=7 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win*9x 4.90; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.1 - -[Netscape 7.1] -Parent=DefaultProperties -Browser=Netscape -Version=7.1 -MajorVer=7 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/7.1] -Parent=Netscape 7.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.2 - -[Netscape 7.2] -Parent=DefaultProperties -Browser=Netscape -Version=7.2 -MajorVer=7 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 8.0 - -[Netscape 8.0] -Parent=DefaultProperties -Browser=Netscape -Version=8.0 -MajorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 8.1 - -[Netscape 8.1] -Parent=DefaultProperties -Browser=Netscape -Version=8.1 -MajorVer=8 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.0 - -[SeaMonkey 1.0] -Parent=DefaultProperties -Browser=SeaMonkey -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.8*) Gecko/20060221 SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.1 - -[SeaMonkey 1.1] -Parent=DefaultProperties -Browser=SeaMonkey -Version=1.1 -MajorVer=1 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.8*) Gecko/20060221 SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 2.0 - -[SeaMonkey 2.0] -Parent=DefaultProperties -Browser=SeaMonkey -Version=2.0 -MajorVer=2 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.9*) Gecko/20060221 SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Flock 1.0 - -[Flock 1.0] -Parent=DefaultProperties -Browser=Flock -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; U; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinME - -[Mozilla/5.0 (Windows; U; Windows NT 5.0*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; U; Windows NT 5.1*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Flock 2.0 - -[Flock 2.0] -Parent=DefaultProperties -Browser=Flock -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; U; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinME - -[Mozilla/5.0 (Windows; U; Windows NT 5.0*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; U; Windows NT 5.1*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sleipnir 2.0 - -[Sleipnir] -Parent=DefaultProperties -Browser=Sleipnir -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.0*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.1*) Sleipnir/2.*] -Parent=Sleipnir -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.2*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 6.0*) Sleipnir/2.*] -Parent=Sleipnir -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 6.1*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win7 - -[Sleipnir*] -Parent=Sleipnir - -[Sleipnir/2.*] -Parent=Sleipnir - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fennec 1.0 - -[Fennec 1.0] -Parent=DefaultProperties -Browser=Firefox Mobile -Version=1.0 -MajorVer=1 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firebird - -[Firebird] -Parent=DefaultProperties -Browser=Firebird -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Linux; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird Browser/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; IRIX*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox - -[Firefox] -Parent=DefaultProperties -Browser=Firefox -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (OS/2; *; Warp*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (Windows NT 5.?; ?; rv:1.*) Gecko/* Firefox] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.*; *; rv:1.*) Gecko/* Deer Park/Alpha*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firefox/10.5] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; FreeBSD*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; HP-UX*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; Linux*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.0 - -[Firefox 1.0] -Parent=DefaultProperties -Browser=Firefox -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=MacPPC - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; *Linux*; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; DragonFly*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.4 - -[Firefox 1.4] -Parent=DefaultProperties -Browser=Firefox -Version=1.4 -MajorVer=1 -MinorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.5 - -[Firefox 1.5] -Parent=DefaultProperties -Browser=Firefox -Version=1.5 -MajorVer=1 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=OS/2 - -[Mozilla/5.0 (rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2 x64; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 2.0 - -[Firefox 2.0] -Parent=DefaultProperties -Browser=Firefox -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.0 - -[Firefox 3.0] -Parent=DefaultProperties -Browser=Firefox -Version=3.0 -MajorVer=3 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.1 - -[Firefox 3.1] -Parent=DefaultProperties -Browser=Firefox -Version=3.1 -MajorVer=3 -MinorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.5 - -[Firefox 3.5] -Parent=DefaultProperties -Browser=Firefox -Version=3.5 -MajorVer=3 -MinorVer=5 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Phoenix - -[Phoenix] -Parent=DefaultProperties -Browser=Phoenix -Version=0.5 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iceweasel - -[Iceweasel] -Parent=DefaultProperties -Browser=Iceweasel -Platform=Linux -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.8*) Gecko/* Iceweasel/2.0* (Debian-*)] -Parent=Iceweasel -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.0 - -[Mozilla 1.0] -Parent=DefaultProperties -Browser=Mozilla -Version=1.0 -MajorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.0.*) Gecko/*] -Parent=Mozilla 1.0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.1 - -[Mozilla 1.1] -Parent=DefaultProperties -Browser=Mozilla -Version=1.1 -MajorVer=1 -MinorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.1.*) Gecko/*] -Parent=Mozilla 1.1 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.2 - -[Mozilla 1.2] -Parent=DefaultProperties -Browser=Mozilla -Version=1.2 -MajorVer=1 -MinorVer=2 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.2.*) Gecko/*] -Parent=Mozilla 1.2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.3 - -[Mozilla 1.3] -Parent=DefaultProperties -Browser=Mozilla -Version=1.3 -MajorVer=1 -MinorVer=3 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.3.*) Gecko/*] -Parent=Mozilla 1.3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.4 - -[Mozilla 1.4] -Parent=DefaultProperties -Browser=Mozilla -Version=1.4 -MajorVer=1 -MinorVer=4 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.5 - -[Mozilla 1.5] -Parent=DefaultProperties -Browser=Mozilla -Version=1.5 -MajorVer=1 -MinorVer=5 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.6 - -[Mozilla 1.6] -Parent=DefaultProperties -Browser=Mozilla -Version=1.6 -MajorVer=1 -MinorVer=6 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.7 - -[Mozilla 1.7] -Parent=DefaultProperties -Browser=Mozilla -Version=1.7 -MajorVer=1 -MinorVer=7 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (*rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.8 - -[Mozilla 1.8] -Parent=DefaultProperties -Browser=Mozilla -Version=1.8 -MajorVer=1 -MinorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (*rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.9 - -[Mozilla 1.9] -Parent=DefaultProperties -Browser=Mozilla -Version=1.9 -MajorVer=1 -MinorVer=9 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE Mac - -[IE Mac] -Parent=DefaultProperties -Browser=IE -Platform=MacPPC -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/?.? (compatible; MSIE 4.0*; *Mac_PowerPC*] -Parent=IE Mac -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Mozilla/?.? (compatible; MSIE 4.5*; *Mac_PowerPC*] -Parent=IE Mac -Version=4.5 -MajorVer=4 -MinorVer=5 - -[Mozilla/?.? (compatible; MSIE 5.0*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.0 -MajorVer=5 -MinorVer=0 - -[Mozilla/?.? (compatible; MSIE 5.1*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/?.? (compatible; MSIE 5.2*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.2 -MajorVer=5 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 5.5 - -[AOL 9.0/IE 5.5] -Parent=DefaultProperties -Browser=AOL -Version=5.5 -MajorVer=5 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 5.5; *AOL 9.0*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 6.0 - -[AOL 9.0/IE 6.0] -Parent=DefaultProperties -Browser=AOL -Version=6.0 -MajorVer=6 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 6.0; *AOL 9.0*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 7.0 - -[AOL 9.0/IE 7.0] -Parent=DefaultProperties -Browser=AOL -Version=7.0 -MajorVer=7 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 - -[Mozilla/?.* (?compatible; *MSIE 7.0; *AOL 9.0*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Avant Browser - -[Avant Browser] -Parent=DefaultProperties -Browser=Avant Browser -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Advanced Browser (http://www.avantbrowser.com)] -Parent=Avant Browser - -[Avant Browser*] -Parent=Avant Browser - -[Avant Browser/*] -Parent=Avant Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 4.01 - -[IE 4.01] -Parent=DefaultProperties -Browser=IE -Version=4.01 -MajorVer=4 -MinorVer=01 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 4.01*)*] -Parent=IE 4.01 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 95*)*] -Parent=IE 4.01 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 98*)*] -Parent=IE 4.01 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 4.01 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 4.0*)*] -Parent=IE 4.01 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.0*)*] -Parent=IE 4.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.01*)*] -Parent=IE 4.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 4.01; Windows NT)] -Parent=IE 4.01 -Platform=WinNT - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.0 - -[IE 5.0] -Parent=DefaultProperties -Browser=IE -Version=5.0 -MajorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 5.0*)*] -Parent=IE 5.0 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 95*)*] -Parent=IE 5.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98*)*] -Parent=IE 5.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 5.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 4.0*)*] -Parent=IE 5.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.0*)*] -Parent=IE 5.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.01*)*] -Parent=IE 5.0 -Platform=Win2000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.01 - -[IE 5.01] -Parent=DefaultProperties -Browser=IE -Version=5.01 -MajorVer=5 -MinorVer=01 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 5.01*)*] -Parent=IE 5.01 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 95*)*] -Parent=IE 5.01 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98*)*] -Parent=IE 5.01 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 5.01 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 4.0*)*] -Parent=IE 5.01 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.0*)*] -Parent=IE 5.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.01*)*] -Parent=IE 5.01 -Platform=Win2000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.5 - -[IE 5.5] -Parent=DefaultProperties -Browser=IE -Version=5.5 -MajorVer=5 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 5.5*)*] -Parent=IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 95*)*] -Parent=IE 5.5 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98*)*] -Parent=IE 5.5 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98; Win 9x 4.90*)*] -Parent=IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 4.0*)*] -Parent=IE 5.5 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.0*)*] -Parent=IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.01*)*] -Parent=IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.1*)*] -Parent=IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.2*)*] -Parent=IE 5.5 -Platform=Win2003 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 6.0 - -[IE 6.0] -Parent=DefaultProperties -Browser=IE -Version=6.0 -MajorVer=6 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -w3cdomversion=1.0 -msdomversion=6.0 - -[Mozilla/?.* (?compatible; *MSIE 6.0*)*] -Parent=IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 95*)*] -Parent=IE 6.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98*)*] -Parent=IE 6.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98; Win 9x 4.90*)*] -Parent=IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 4.0*)*] -Parent=IE 6.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.0*)*] -Parent=IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.01*)*] -Parent=IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.1*)*] -Parent=IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2*)*] -Parent=IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*Win64;*)*] -Parent=IE 6.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*WOW64;*)*] -Parent=IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 6.0*)*] -Parent=IE 6.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 7.0 - -[IE 7.0] -Parent=DefaultProperties -Browser=IE -Version=7.0 -MajorVer=7 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -msdomversion=7.0 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 7.0*)*] -Parent=IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98*)*] -Parent=IE 7.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 4.0*)*] -Parent=IE 7.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.0*)*] -Parent=IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.01*)*] -Parent=IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.1*)*] -Parent=IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2*)*] -Parent=IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*Win64;*)*] -Parent=IE 7.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*WOW64;*)*] -Parent=IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.0*)*] -Parent=IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.1*)*] -Parent=IE 7.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; *)*] -Parent=IE 7.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 8.0 - -[IE 8.0] -Parent=DefaultProperties -Browser=IE -Version=8.0 -MajorVer=8 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=3 -supportsCSS=true -ecmascriptversion=1.2 -msdomversion=8.0 -w3cdomversion=1.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Win32*)*] -Parent=IE 8.0 -Platform=Win32 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0*)*] -Parent=IE 8.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1*)*] -Parent=IE 8.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2*)*] -Parent=IE 8.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Win64; x64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista -Win64=false - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1*)*] -Parent=IE 8.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 -Win64=false - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 7.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Default Browser - -[*] -Browser=Default Browser -Version=0 -MajorVer=0 -MinorVer=0 -Platform=unknown -Alpha=false -Beta=false -Win16=false -Win32=false -Win64=false -Frames=true -IFrames=false -Tables=true -Cookies=false -BackgroundSounds=false -CDF=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -Stripper=false -isBanned=false -isMobileDevice=false -isSyndicationReader=false -Crawler=false -CssVersion=0 -supportsCSS=false -AOL=false -aolVersion=0 -AuthenticodeUpdate=0 -CSS=0 -WAP=false -netCLR=false -ClrVersion=0 -ECMAScriptVersion=0.0 -W3CDOMVersion=0.0 diff --git a/Source/Platforms/Editor/Windows/Mono/etc/mono/config b/Source/Platforms/Editor/Windows/Mono/etc/mono/config deleted file mode 100644 index 385128f74..000000000 --- a/Source/Platforms/Editor/Windows/Mono/etc/mono/config +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Windows/Mono/etc/mono/mconfig/config.xml b/Source/Platforms/Editor/Windows/Mono/etc/mono/mconfig/config.xml deleted file mode 100644 index a3df3b5e9..000000000 --- a/Source/Platforms/Editor/Windows/Mono/etc/mono/mconfig/config.xml +++ /dev/null @@ -1,616 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - - -]]> - - - - - - -
-
-
- - - - - -
- -
-
-
-
- - - -]]> - - - - - -
-
-
-
-
-
-
- - - - - -]]> - - - - - -
-
-
-
-
-
-
- - - - - - - - -]]> - - - - - -
-
-
-
-
- - - - - - - -]]> - - - - - -
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
- - - - - - - - - - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - - - - - -]]> - - - - - - - -
-
-
- - - - - -
- -
-
-
- - - - ]]> - - - - - -
-
-
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
- - - - - - - -]]> - - - - - -
-
-
-
-
- - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - -]]> - - - - - - -
-
-
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
-
-
- - - - - - - - - - - -]]> - - - - - -
-
-
-
-
- - - - -]]> - - - - - - - - ]]> - - - - - - ]]> - - - - - - ]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - -
-
-
-
-
-
- - diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/Accessibility.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/Accessibility.dll deleted file mode 100644 index 6a19d88c6..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/Accessibility.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f418319d6c6c3407828125fd3577b5751f0bac92e666d02ee52f5f83ca86af16 -size 9216 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/Mono.Posix.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/Mono.Posix.dll deleted file mode 100644 index 9d42676f7..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/Mono.Posix.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a65ab5a8d236bceb0a92f231df3360d9213f68dc9e106ae925fe5570b34d0f1 -size 91648 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/Mono.Security.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/Mono.Security.dll deleted file mode 100644 index fa3ecc844..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/Mono.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:143b73d95cfb381fc6f56f1a5fcf6ce288589e753e00205fca6863442f3cceb2 -size 76800 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ComponentModel.Composition.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ComponentModel.Composition.dll deleted file mode 100644 index 2ee210da3..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ComponentModel.Composition.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00668aceeb5932b303da50390234b60ab394be3cfd94a85473bee4d43242f8f8 -size 30208 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ComponentModel.DataAnnotations.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ComponentModel.DataAnnotations.dll deleted file mode 100644 index 5d03c6a14..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ComponentModel.DataAnnotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eab8975998fd91680c7e69b7fa6a7c97317e236696c73044da4d7b4eb1e0a147 -size 17920 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Configuration.Install.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Configuration.Install.dll deleted file mode 100644 index cc1288b4f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Configuration.Install.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a0dd81759186bd5d2b828bfed9d285aebc4ac3192dc83aafa4e6f27535226db -size 13824 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Configuration.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Configuration.dll deleted file mode 100644 index 235192de5..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Configuration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b83f740bb35cab7e2becafca96d06e34045dce958f8c87bab9b02f713411c3dc -size 46592 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Core.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Core.dll deleted file mode 100644 index 48bcc500a..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02bb7140dde0f0717cc6836c1b461fd655f860fac0c811e75fbd3acbf334a308 -size 151552 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.DataSetExtensions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.DataSetExtensions.dll deleted file mode 100644 index 90da83068..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.DataSetExtensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e4d0e95d191686bf8db25a4bf05ecfce35e09794b569abf96c26cf4276212077 -size 9216 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.Entity.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.Entity.dll deleted file mode 100644 index 944e3b2fc..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.Entity.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0596d5d898f588fa00456868ff14ca71852dec09f38cb8ac30027a3d8b3d66d8 -size 237056 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.Linq.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.Linq.dll deleted file mode 100644 index 53d4b43c8..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ee6fe97abcc2f76c3016f05c7a1a3b9300de7b74ad8c798edab9c191c18f294 -size 36352 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.OracleClient.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.OracleClient.dll deleted file mode 100644 index 720ebf9ed..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.OracleClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:314a0eabe221715ac452c7cc39089b51e95fde04a4f21761dcae043f529af86d -size 39936 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.Services.Client.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.Services.Client.dll deleted file mode 100644 index 64e136022..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.Services.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80f609548a9ea24d5c194e5a69d948fe204f21a241d15b6b4f882929e16a73d9 -size 20992 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.Services.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.Services.dll deleted file mode 100644 index 7adbf0c4f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e9b8c59aa08eb580079cdbe0a3f5aaf5175dc97b6f719506a88fe3e171184d4 -size 39936 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.dll deleted file mode 100644 index 8740597c7..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c44d04706a708407c5289ed225b5afb25206aebbece74133c575ba43dff4e58 -size 193024 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.DirectoryServices.Protocols.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.DirectoryServices.Protocols.dll deleted file mode 100644 index 5b2c7b18d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.DirectoryServices.Protocols.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be0fc9993294dc85f8b640ad6c5b0f9381b98c98fd0075ad41b788a015d7aa05 -size 40960 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.DirectoryServices.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.DirectoryServices.dll deleted file mode 100644 index 21b179b50..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.DirectoryServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ea0320dd6a9ce2a72e452ac39bae7f5549542a0736086eb5779deab821ea955 -size 72704 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Drawing.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Drawing.dll deleted file mode 100644 index 6d82028b3..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Drawing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:10fd5f9c7e846597dc902721565fe73ecb2c28bbdb3532338e719465480ef2f6 -size 140288 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Dynamic.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Dynamic.dll deleted file mode 100644 index 7b771bd42..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Dynamic.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20f4a2772e3ab1868b74c780e82140ccd2107d7a0b67ac7097a7ba71c104f06c -size 6144 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.EnterpriseServices.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.EnterpriseServices.dll deleted file mode 100644 index 23acdb5a5..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.EnterpriseServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a503b0361835e1bca720ff10810a3d2c3f940b4f1a22044dcef4df981c12f590 -size 35840 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.IO.Compression.FileSystem.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.IO.Compression.FileSystem.dll deleted file mode 100644 index 155d64c57..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.IO.Compression.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e47dc79fa563627ac47665b1c12e84cca70ba3a0511ba5e622ecce41e3c927fc -size 6656 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.IO.Compression.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.IO.Compression.dll deleted file mode 100644 index 39e2b3c2a..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.IO.Compression.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6afd5d113510fdc41dafb5e2e97f2306edd842c954415161cedbac2cc54140eb -size 7168 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.IdentityModel.Selectors.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.IdentityModel.Selectors.dll deleted file mode 100644 index e1ac3c28a..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.IdentityModel.Selectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae3c31cb8546ccd45583338db934cf6126c9911c2b2794ac7e61c31f4c577f0b -size 8704 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.IdentityModel.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.IdentityModel.dll deleted file mode 100644 index aff1d266a..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.IdentityModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0d1803e02c073b7d08122064d99e8181d22a90a836ac3b8dbe26f7fbb518c33 -size 138752 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Json.Microsoft.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Json.Microsoft.dll deleted file mode 100644 index 9e24068df..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Json.Microsoft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82500f979119736e0b9e6b381a91e6465f91b033e6fbf37eb95f20bb775bb0d4 -size 13312 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Json.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Json.dll deleted file mode 100644 index 984cedb44..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:862ad38f55710c88b5fcd75fa2358cf7de0384dd6eb5c935890279dd629933a9 -size 9728 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Management.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Management.dll deleted file mode 100644 index 5610d336a..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:245006b4dea9ac1244b437a3775ed3b52e1e5c32e32165f2ed5fb6113d397c70 -size 38912 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Messaging.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Messaging.dll deleted file mode 100644 index ec95be06b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:877a107807a6c05f1fcd6c0738825105b5d89e2a87c4a20fbe1c759ee626e52b -size 45568 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Net.Http.Formatting.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Net.Http.Formatting.dll deleted file mode 100644 index e2bc345df..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Net.Http.Formatting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d695096fce1eff031f13b4ca689d0d0b5961538934999acbeeddcef8e944442a -size 19456 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Net.Http.WebRequest.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Net.Http.WebRequest.dll deleted file mode 100644 index 32dcdcae2..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Net.Http.WebRequest.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d480aea7d03b22ed7fefc205c595792f488da2e501ba2c6d437ed2ccb263c193 -size 7168 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Net.Http.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Net.Http.dll deleted file mode 100644 index f840d72c7..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Net.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14cd23c05bba6303041d8de9a576f1fa944ca50a1f4d98358ad343d8be98d166 -size 30208 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Net.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Net.dll deleted file mode 100644 index e026f87a5..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Net.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1d7b996114150d80d462eebec77b72240f4fa20e802cdc7f1433f8cd96aeb97 -size 30208 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Numerics.Vectors.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Numerics.Vectors.dll deleted file mode 100644 index bd449ea8d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Numerics.Vectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e482bef161ba12bcb5989a901fb21e90162041827feed23f90e22f0474c82c43 -size 5632 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Numerics.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Numerics.dll deleted file mode 100644 index ae7d8c2b9..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b47b6661f2168b47d18e645b1b12548ba86dc5787be24862286a1f838b4be59 -size 11776 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Core.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Core.dll deleted file mode 100644 index 824927786..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f7ca64eb13c3576b50b63cef8130a717f3e7d774731ea8f15ae17a63d13f369 -size 22528 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Debugger.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Debugger.dll deleted file mode 100644 index c8929afe2..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Debugger.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e26bcf1fdcc249eab6d538f79432c0b9a478506c374d4eb0ed7bd521f610456 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Experimental.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Experimental.dll deleted file mode 100644 index 325b07a9b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Experimental.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7c56c7dc413fa222b1926c38f00222a7da1badee9718cc54c57450c01abe09a -size 9216 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Interfaces.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Interfaces.dll deleted file mode 100644 index 6898dacde..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Interfaces.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c12b395ce6caa4eee69a73f00fff7c66aa2a5695660c23ab241088e24c12c489 -size 7680 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Linq.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Linq.dll deleted file mode 100644 index 567b2185a..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:595bd82812ec34b94afa4ad07258098e0fa456afde6f80586f3c670f3cb2b6c5 -size 72704 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Observable.Aliases.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Observable.Aliases.dll deleted file mode 100644 index 5492c7f91..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Observable.Aliases.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e20a9ea5d5b009058b4b41b5d8bbcc958a9b0606829b3466140859bce708724 -size 8704 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.PlatformServices.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.PlatformServices.dll deleted file mode 100644 index bc69ac002..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.PlatformServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57414c47cc7a8b002dd4f21a81bea522bce6993d8f71836352d35501aa0d173f -size 7168 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Providers.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Providers.dll deleted file mode 100644 index 0dccfa8f1..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Providers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41cd43ed2ea280662b871e7f00c6ccbc413d05d782b6f3cd21f2892a0bcf3047 -size 68096 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Runtime.Remoting.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Runtime.Remoting.dll deleted file mode 100644 index 07983cf3a..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c82eec64bd4c842129becf8d7c8bf5493e00b00b359eb0787a6ab4bb394b0f5 -size 5632 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Windows.Forms.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Windows.Forms.dll deleted file mode 100644 index 8f761c230..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d6198c1332e4a2f199579566634273d995a770fe81023c42557875617071f93 -size 6144 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Windows.Threading.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Windows.Threading.dll deleted file mode 100644 index 971cbb95b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Reactive.Windows.Threading.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fef7bbe9630fb0cac28e79fcba6403b729922723f20e99516be6707b44e06114 -size 7168 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Runtime.Caching.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Runtime.Caching.dll deleted file mode 100644 index f03d95b7f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Runtime.Caching.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d4b23dc6a1bf423545575b98a5ed7830795ebe87473e2fc9ea7230ab3ddddfd -size 16896 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Runtime.DurableInstancing.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Runtime.DurableInstancing.dll deleted file mode 100644 index 4b639dcbe..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Runtime.DurableInstancing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2feb72896932b115c43379c3b84ba1ffb9a456139999c7b59411215a6cbabe6a -size 29184 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Runtime.Remoting.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Runtime.Remoting.dll deleted file mode 100644 index e70574aba..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6cae8b048e6ad843cbe754245493c83c6ce1a9b3a3aa3cee52db4cd0312dc5e1 -size 20480 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Runtime.Serialization.Formatters.Soap.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Runtime.Serialization.Formatters.Soap.dll deleted file mode 100644 index 293037e51..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Runtime.Serialization.Formatters.Soap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f303338dafa6113fce8b0d411c95e5bbfc9d6a9f49321df67cc61a9fb48531bb -size 7168 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Runtime.Serialization.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Runtime.Serialization.dll deleted file mode 100644 index 3aebe2f8d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Runtime.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e279ef544156ac22b7b7a6f1cf8136c8921555e3677dd2909b1c44c8b1cd5c1 -size 38912 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Security.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Security.dll deleted file mode 100644 index e348a8aa1..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b8ab41e7c190b247569d9d74cee53771d8d2f7fb87234df2d60b8f103d53609f -size 41472 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceModel.Activation.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceModel.Activation.dll deleted file mode 100644 index 04ef50028..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceModel.Activation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11068d7488aeb17ad239f797216e967ae10aee3aebc827e15088a099825ae68e -size 7680 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceModel.Discovery.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceModel.Discovery.dll deleted file mode 100644 index 63bb2bebc..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceModel.Discovery.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7c7f43e289c68df96db8f9eea38233706dc1ceed1e70be2d7e892501c4360c0 -size 36864 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceModel.Internals.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceModel.Internals.dll deleted file mode 100644 index 2c12f6888..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceModel.Internals.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:edae786715d120534ae5d66942723030a2eaa7cdc07a196fedc59869527da4a2 -size 18432 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceModel.Routing.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceModel.Routing.dll deleted file mode 100644 index fd3657a00..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceModel.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fed98c0430e9f486281ccfb60c955c881ad66f6c27ccc4364a9a7f5366eda41b -size 20480 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceModel.Web.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceModel.Web.dll deleted file mode 100644 index f35d63230..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceModel.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3122bd3e254bd77d17ad63ad7061a30ea31440a3431d96d030b074eb7c851cf0 -size 39424 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceModel.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceModel.dll deleted file mode 100644 index a9d1cbb41..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8607a197d53e798f8db553f9bcf9b56353a89555f9036b6ce93ebfa7e8231309 -size 551424 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceProcess.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceProcess.dll deleted file mode 100644 index a19edf597..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.ServiceProcess.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d76d89b226f886c007ee6d3ded7e16c3e037b9d3bac9255cb295d6fd8e0d4008 -size 17408 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Threading.Tasks.Dataflow.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Threading.Tasks.Dataflow.dll deleted file mode 100644 index 4ea1a88ef..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Threading.Tasks.Dataflow.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5a3a8d78926413c4a39a95ea2b4969d329a914b02b078499f2040a0178db5d4 -size 22016 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Transactions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Transactions.dll deleted file mode 100644 index cc8486b86..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Transactions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc70ac58220952bcbf3a80d2d8a0215df0d462c1f5a16938709b230f3d4a3361 -size 16384 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Abstractions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Abstractions.dll deleted file mode 100644 index cc0048359..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Abstractions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5075b0145363b7e45a1b041fdbcb80e67aeddf3dcb4bea04f18ce3fedfafc76d -size 6656 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.ApplicationServices.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.ApplicationServices.dll deleted file mode 100644 index edd2d0c71..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.ApplicationServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dcef740e267ddee487319afeb2bb65a706421ce96e3781222eba59445c538544 -size 13824 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.DynamicData.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.DynamicData.dll deleted file mode 100644 index 8618bf102..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.DynamicData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b5c084082f2df92014d345537bdc4f1d877416a2120db464310f460f71ef143 -size 36864 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Extensions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Extensions.dll deleted file mode 100644 index eb37c5e78..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:baa7603b9decee107df353502c3cff1bd420ba4eac11c4e516fdab58761adabc -size 98304 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Http.SelfHost.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Http.SelfHost.dll deleted file mode 100644 index bae32f55b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Http.SelfHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d62561aefc96c3c852e4ba34ceffa9da1575ff9ab1bd172ff5c3513e875c061a -size 9216 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Http.WebHost.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Http.WebHost.dll deleted file mode 100644 index c18a95dee..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Http.WebHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c096053c7ecbc52145881c04663c55ee13e58d3db70788291decbe2df93164b3 -size 7680 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Http.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Http.dll deleted file mode 100644 index 9dcb7f105..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a0366e666f6fa6c2759a68b88a95c0db4cd019d9623ffa129b760d4bea89151 -size 56320 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Mvc.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Mvc.dll deleted file mode 100644 index 48d2d1675..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Mvc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b89b7488afdddfa20f75d7eb72398d30ff21eb996f62335aaf57d31c7cf24178 -size 100864 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Razor.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Razor.dll deleted file mode 100644 index 8117fee52..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f27acfd4469e514e19615b8cd4770114cca563bf8031df807802297064d4a43 -size 60928 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Routing.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Routing.dll deleted file mode 100644 index 40ffdc4c2..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:392ecf2fa81d60e2e9b46eebee1cacc68f5cdd32fb73975266a1a61c044a5ae2 -size 6656 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Services.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Services.dll deleted file mode 100644 index 04664d5fb..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72be2ede82989fa51f1eaf5ac56c9838ffafc0129d216dd37a512daf48038f85 -size 80384 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.WebPages.Deployment.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.WebPages.Deployment.dll deleted file mode 100644 index bcfa7da97..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.WebPages.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2dd91160769f23ee0ffa7fe7e48d961c76c0181bbc442bc097d3b53eba03a03 -size 6144 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.WebPages.Razor.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.WebPages.Razor.dll deleted file mode 100644 index ed6d0ddcc..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.WebPages.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23053ef0a76dbb6e07d7d00ccaf1961af81b0934f5716b522e26634d548496dc -size 10752 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.WebPages.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.WebPages.dll deleted file mode 100644 index 6bfa18eb0..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.WebPages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:690a64f6ce4d5fb465114c78eb7ad55ccab1f06d1ade331eb1aa9ea43a93b2ac -size 35328 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.dll deleted file mode 100644 index 9f1e56bd3..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:85b82ea5215471276157f9b310300fc6c6a4fdc6820e68551ac176014df80e42 -size 913920 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Windows.Forms.DataVisualization.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Windows.Forms.DataVisualization.dll deleted file mode 100644 index 3b614a192..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Windows.Forms.DataVisualization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e82eca4263c69bf4c02841cbbd81e246777554cd6cd07380ded1143ac670878 -size 101888 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Windows.Forms.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Windows.Forms.dll deleted file mode 100644 index f98b428f2..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c93e17749f507b677b811a572e7de7a93e99d2532273a14261eb20927211e0eb -size 751616 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Windows.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Windows.dll deleted file mode 100644 index f1015ae64..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Windows.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b6b28979fdba11693c2e72b7855dac112420e821693cdd9376b00eff9858079 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Xaml.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Xaml.dll deleted file mode 100644 index 3bef8218d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Xaml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76f22594e51872517df1b9bfb9e3ae21c600d75472dd31eda70b09aa089e8c27 -size 46592 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Xml.Linq.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Xml.Linq.dll deleted file mode 100644 index 6aac055f2..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Xml.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d9b6bd7973c9d66659468e38bfb99c551fac1d92b71fd1c5701fbb54869aefc -size 22528 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Xml.Serialization.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Xml.Serialization.dll deleted file mode 100644 index cda7cfbbc..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Xml.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e73314602086cf1aac4d06177d8e3277a219d1ca9119f07d9baae4e3d83a79d2 -size 5632 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Xml.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Xml.dll deleted file mode 100644 index 51fa02da6..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1683fc53de62017fe812b9afeeefb8ac097d61a68bbb637714412594fcfeea1b -size 155648 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.dll deleted file mode 100644 index 450f3f28a..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/System.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ddedcd3eea73801d789ffd69abd8cdedb5999b8c1824cf7f24620fac6a8b5eb1 -size 495616 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/WindowsBase.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/WindowsBase.dll deleted file mode 100644 index dd81a697d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/WindowsBase.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9aba66826546888ae8b68e64db6254ad2879339928c8444533dc9b049ac29c10 -size 82944 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/mscorlib.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/mscorlib.dll deleted file mode 100644 index 75cfc4c5f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5-api/mscorlib.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:27be711f6c6d736712696b220775ecb2f49f12662718106462482adcd6768e9f -size 831488 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Accessibility.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Accessibility.dll deleted file mode 100644 index 853d3c046..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Accessibility.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0912a0bebc016e611e4900d99485713fbf0e013f496afc8fc837be08611723e -size 12288 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Primitives.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Primitives.dll deleted file mode 100644 index d61a5ae27..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ecf18f218ef39cd6b48c37a3ddfa8b1762405c830d7dba28266efed219bdb5ed -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Registry.AccessControl.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Registry.AccessControl.dll deleted file mode 100644 index ad6bbd82c..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Registry.AccessControl.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:528de8d05a5a36a9def0aacbe654ee029a2e22e658622407dfed8c0039f7f2eb -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Registry.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Registry.dll deleted file mode 100644 index 5d5c09930..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/Microsoft.Win32.Registry.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c963b7d5e10ece8b1c4749e9697c15dd8a0b4a63d9a2745fe2db6db6d8c86aa -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.AppContext.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.AppContext.dll deleted file mode 100644 index 6f1825282..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.AppContext.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21d59dc6c476cb5b6046d2aabb1c546d2316d037800babeac4b3bd593b2e0f24 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Collections.Concurrent.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Collections.Concurrent.dll deleted file mode 100644 index 5751d62f3..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Collections.Concurrent.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f4d1ab088c05cc65e1ca8b5cbcacf8847b879e3a26ef0eb4c4c05e17248f860 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Collections.NonGeneric.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Collections.NonGeneric.dll deleted file mode 100644 index 94952c4d3..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Collections.NonGeneric.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8fb21d60f04e06bbac36682cbc0d4d92fb2ad749af0a2a3380410dbf2ae29432 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Collections.Specialized.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Collections.Specialized.dll deleted file mode 100644 index 87f61fffd..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Collections.Specialized.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36561f5d20732afa1575b2c0dcf6a5f410476e1e82043a63dcc632bda1815195 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Collections.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Collections.dll deleted file mode 100644 index 14a27a56c..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Collections.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b7e08d59a9546943dc06cc2cec224bab0ea02c73a7ea4a69c6a740cf243350a -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ComponentModel.Annotations.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ComponentModel.Annotations.dll deleted file mode 100644 index a214ea20a..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ComponentModel.Annotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42a1cd0d87ad65415e0662771edb761ab40e9d1bc9b7e845cfeb99dbda4da930 -size 6144 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ComponentModel.EventBasedAsync.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ComponentModel.EventBasedAsync.dll deleted file mode 100644 index 2eb2170ff..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ComponentModel.EventBasedAsync.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8117fb0c8e3395c1399f22d93ba4b0984034f96eb5daa2e323c3f9aff07deb1e -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ComponentModel.Primitives.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ComponentModel.Primitives.dll deleted file mode 100644 index 9561a3908..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ComponentModel.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20a5dd35bb565e7baf6cba4d80b161dd46088d349f323f58088cbe8f95f7d053 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ComponentModel.TypeConverter.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ComponentModel.TypeConverter.dll deleted file mode 100644 index d882c2d5f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ComponentModel.TypeConverter.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d1267c20427cca76cc39c909dc130ceb5525ee57f4a256c9b76db099db9dd5a -size 6144 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ComponentModel.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ComponentModel.dll deleted file mode 100644 index 9454d5ce5..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ComponentModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e2d221a9f4577828e29d53236149bf4bc624594aaef75d478d2b46ee482fff4 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Console.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Console.dll deleted file mode 100644 index 55c4048b3..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Console.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de8f340cc4b79a39d9082f66ff1267adbcb94a3deb4cf2486c90be9ff0a84b51 -size 4096 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Data.Common.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Data.Common.dll deleted file mode 100644 index a16a505b5..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Data.Common.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e10fa60ffb1f2d0416e6d4b32ef4256514322859624d3b2fa4c16036daa64e9b -size 9728 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Data.SqlClient.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Data.SqlClient.dll deleted file mode 100644 index eb89df4ea..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Data.SqlClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e461922ab23a60a9ccc3a3298adff8f0d0136dc93d14deea246b664fc751fbb4 -size 6144 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.Contracts.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.Contracts.dll deleted file mode 100644 index b3546ed8b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.Contracts.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b07e1b3851be552690e01d37dd3b76dc7ecbcf4d21280be48edf5c095175e349 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.Debug.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.Debug.dll deleted file mode 100644 index 07cbecf06..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.Debug.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8acc99f91a463abe106f06f6f5d2bf5dd5fdb755ea5745c52872365122bc5e26 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.FileVersionInfo.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.FileVersionInfo.dll deleted file mode 100644 index b7d4a88c5..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.FileVersionInfo.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18cbb06e7fa6268063f32ad6147581edc65c876ea7bb8bfedcda8167bc147efd -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.Process.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.Process.dll deleted file mode 100644 index 19cc70897..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.Process.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ee60191fbb93926a540556af13896a9bbffdc8f05712bc1a20f177dfae714ba -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.StackTrace.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.StackTrace.dll deleted file mode 100644 index 1c5143fa0..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.StackTrace.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2956ecf2b31d4a971e76d9a777c7ea60491c3bd108b7e6c1bd66578e3d19f0a -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.TextWriterTraceListener.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.TextWriterTraceListener.dll deleted file mode 100644 index b03de9763..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.TextWriterTraceListener.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30751101f4f31bd3d3c8023a412deada10875c0735ac6f31596e112d9f8fb7d1 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.Tools.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.Tools.dll deleted file mode 100644 index f33a83738..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.Tools.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff2f1df9e1feb016a595424f48af1c1820bda4630680e5e1b6f178ab6bc83da0 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.TraceEvent.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.TraceEvent.dll deleted file mode 100644 index 931ed645f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.TraceEvent.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d71212943eece9dbf5bd6c464b01ad20677dd233dabeea7a8035c2f54e83654b -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.TraceSource.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.TraceSource.dll deleted file mode 100644 index 01eb2646f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.TraceSource.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91efe8bdfcffabac4c71df60ac8f515668b41fc70d695835847b8810895b282f -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.Tracing.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.Tracing.dll deleted file mode 100644 index 7500ed9a2..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Diagnostics.Tracing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:263dfdd40d6701753a843fc13ccd7303e60e53ffbdcb1088fbbf240298edfd48 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Drawing.Primitives.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Drawing.Primitives.dll deleted file mode 100644 index 8e2c066a6..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Drawing.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6188e64b0802a7a8805f63689f4a1f70f45d8fb85ce5d5338dfdb4ea599aab7 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Dynamic.Runtime.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Dynamic.Runtime.dll deleted file mode 100644 index 5a8af43b6..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Dynamic.Runtime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:312f44cde35ee6b4327e1c0d7eb13e13ff400b98cdc2f1df4c2dbf652db141b3 -size 5632 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Globalization.Calendars.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Globalization.Calendars.dll deleted file mode 100644 index 938a32b8b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Globalization.Calendars.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:628e49f6a8cf333f0af9e702d00c720ed248c9a3332f750cb2fcfbb095f46ab1 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Globalization.Extensions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Globalization.Extensions.dll deleted file mode 100644 index 732f9f128..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Globalization.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae8b233a1265ad27479389ce76936f5664523bdb46d9ba1e94a328ddf6832e03 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Globalization.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Globalization.dll deleted file mode 100644 index 8b297f35b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Globalization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bfb79022e27b9c079b36a5920b82501416aea0b6e81536fb0b499119faaf9143 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.Compression.ZipFile.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.Compression.ZipFile.dll deleted file mode 100644 index dcfa03b79..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.Compression.ZipFile.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d505ea219c25aa42a89647bb15ccc172a669ac79d46345b7ec7ef7e3a91aa88c -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.AccessControl.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.AccessControl.dll deleted file mode 100644 index fd422b20f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.AccessControl.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a1f94e9c3aacb10624121982b0a29d35b11126a3a2eacfd5a5ccd4dc4a71da72 -size 5632 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.DriveInfo.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.DriveInfo.dll deleted file mode 100644 index 7167768f3..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.DriveInfo.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64e662b61483b1e1804eb78b70b62051371da6c5de0c0f193771173b97ed8b06 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.Primitives.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.Primitives.dll deleted file mode 100644 index e54adcfe2..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fafef8c0fce6a5f824880453e99060165b7612fa55d3d339a83d2111012d1997 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.Watcher.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.Watcher.dll deleted file mode 100644 index 9d38fb401..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.Watcher.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6aaff752b377337f4437629fe8fe6d79fe6bea2d84082f3e0f8eefb9cd7b352e -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.dll deleted file mode 100644 index 583106521..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82c4619f4af237058a1e7bd5742bb7481d3350602bc80747d60ad60aa973a151 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.IsolatedStorage.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.IsolatedStorage.dll deleted file mode 100644 index f4eebb935..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.IsolatedStorage.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6490e1e1c18d44835a1e9190abd32b73744c250a71f7c9eaab78dbc39a80a97 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.MemoryMappedFiles.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.MemoryMappedFiles.dll deleted file mode 100644 index 6d32fc521..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.MemoryMappedFiles.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eac40bd86fcc58f0cc8ddde8fd2aa273031fb27496a0f9438e428f0e450914fe -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.Pipes.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.Pipes.dll deleted file mode 100644 index 368e659a8..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.Pipes.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74e892c5cca371cd24b931dbea6a03fc11dcc495ab3d318386c4b78184b63161 -size 4096 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.UnmanagedMemoryStream.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.UnmanagedMemoryStream.dll deleted file mode 100644 index 831a777dc..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.UnmanagedMemoryStream.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6067b6388a1fb7e0d47a51cc3c1e2b04b87f5025c404fe8fd2770808bd863ec8 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.dll deleted file mode 100644 index ee5a6cedf..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.IO.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:358d6a28aaae259a51e52a3f0933fa8f36cd10f96e6e6594232ec2faf567d483 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Linq.Expressions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Linq.Expressions.dll deleted file mode 100644 index 05936d034..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Linq.Expressions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91aea8c6652e052bfec8ba5a4eed91a4d424921dd53c0606ab3620bacb5e08ba -size 6656 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Linq.Parallel.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Linq.Parallel.dll deleted file mode 100644 index 0024df3cb..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Linq.Parallel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b458212adbfe1f2644ab0837cfa31297733c1d0af15718767f4986346a2935f9 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Linq.Queryable.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Linq.Queryable.dll deleted file mode 100644 index b8e08ef71..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Linq.Queryable.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7a37fe6c1c9c1716aedd5e93f3768c16ef78d96a52622960f1c396e1b3fb165 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Linq.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Linq.dll deleted file mode 100644 index 999fb0b88..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:61781d47caedf8005848828abced6399758244e78df2c643bc71552ceb31c0d3 -size 4096 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.AuthenticationManager.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.AuthenticationManager.dll deleted file mode 100644 index 03d195f45..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.AuthenticationManager.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28332ac4638e8e0a4a0fbf1f8cf7f007b1152aa57fa4d1373eaa2d862433fcbe -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Cache.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Cache.dll deleted file mode 100644 index 69f83689e..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Cache.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:336d6cd56d78dc97a65a4f999d2498e7a4a58cf9e1c02247f44e433f4bd0b51f -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Http.Rtc.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Http.Rtc.dll deleted file mode 100644 index 3c3754130..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Http.Rtc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cffc2dd5c81e8acd65dc093ad72a771950d1152556c96613ca729782bc21e330 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.HttpListener.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.HttpListener.dll deleted file mode 100644 index 2db9a9e16..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.HttpListener.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f547e7c407379b45774bde0f538a05deacaabac0219cf2c66754c95371affee7 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Mail.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Mail.dll deleted file mode 100644 index a0ebbd7b8..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Mail.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e612c7aaae3f072106a62c7194169af8eafd89884899f7b29fc241bb95ee9729 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.NameResolution.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.NameResolution.dll deleted file mode 100644 index 5ee785a06..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.NameResolution.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0fa3e0f3c298a853ed275a40ec2a34da9f5655077cd031dc3075b93472fd575a -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.NetworkInformation.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.NetworkInformation.dll deleted file mode 100644 index 3854653c1..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.NetworkInformation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89d31821d201378aebc741fc0339ad34287cc821cf6f448b259c4b60d18e8599 -size 5632 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Ping.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Ping.dll deleted file mode 100644 index b45010c24..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Ping.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f3af7546e3ecca213b9dd88880501788f9b19ccf13fe681e1d72fb8feb81c1d -size 4096 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Primitives.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Primitives.dll deleted file mode 100644 index 4c83ccfd8..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:793d91aea6911134d73151e81fe9868d68d01e1960e84d451fad53394550e856 -size 5632 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Requests.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Requests.dll deleted file mode 100644 index bea85508a..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Requests.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b1179f9dceb80b46e396330fc0b70ebc16b872498e141647c2bc3b10a84416a -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Security.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Security.dll deleted file mode 100644 index 86207849e..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9fee979b315e2933193b730a4450cb8c30832725367308265c91dee3ed484dd -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.ServicePoint.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.ServicePoint.dll deleted file mode 100644 index 252866103..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.ServicePoint.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:071eac5408a5a8a78d949a132a3bc3a926ea3b1bd553bb85e7f946e3249601ac -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Sockets.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Sockets.dll deleted file mode 100644 index 073d2c8f4..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Sockets.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1333ed119afc6431fe36c0463bd68cdb4b822a8cb386fa8e8b19f65415d7ef5b -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Utilities.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Utilities.dll deleted file mode 100644 index d1c20ed34..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.Utilities.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22bfe1d6e8df6935b1c848715a9ae894bb33b239a158b313866dd17094187199 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.WebHeaderCollection.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.WebHeaderCollection.dll deleted file mode 100644 index db712a658..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.WebHeaderCollection.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0a5c10b3678dcf43a07bad958c5a4c175c2a2040591d6c7b3f162a05c6be726 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.WebSockets.Client.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.WebSockets.Client.dll deleted file mode 100644 index bced53dfd..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.WebSockets.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:94e3303942342a38fd29b44ee2ba5223cdf311fb7ee613684b932cd596ce8e4a -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.WebSockets.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.WebSockets.dll deleted file mode 100644 index 6e703b166..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Net.WebSockets.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:400088263656217475f07a9a8a51e681d1bb75c347405b672decabbda3ea29e1 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ObjectModel.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ObjectModel.dll deleted file mode 100644 index 680771fc0..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ObjectModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b53e91dea97bb30d1562fbbc328103a742056574c9a421262db26413a118bc5 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.ILGeneration.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.ILGeneration.dll deleted file mode 100644 index c19b41c56..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.ILGeneration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c062cf871c125ca000930fcd2729afa111dff71203c500e000a0934a90d7a55d -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.Lightweight.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.Lightweight.dll deleted file mode 100644 index e0f35eaf5..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.Lightweight.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:08924131f3a0e433ae7eeb7fda17e6fc0bf1df283ed935fb5363304d15db05af -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.dll deleted file mode 100644 index a130071a8..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.Emit.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a150682dab01b4aaba3a3764376f6a827f017f0c899a8b80a2f3677b8c8833a -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.Extensions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.Extensions.dll deleted file mode 100644 index 5425cdd1d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff87f7ef817b3d5ccb4505a0a296e361e22a0c6c85e216c5b39ca6b9d1add77d -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.Primitives.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.Primitives.dll deleted file mode 100644 index aa0da2f86..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd85a9c9d4a35485558f8f18d21a57d7a1ff87f4c318f96041733059f3ab1880 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.TypeExtensions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.TypeExtensions.dll deleted file mode 100644 index ef2196372..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.TypeExtensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b49fd40b0541635e8cb916d0297612874da03eca1babf47a8f09d6a49e89aed3 -size 9728 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.dll deleted file mode 100644 index 38503348f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Reflection.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:add0c7788b57ed229a9bf6c2f13cfdbcd30a86aa593a4c871a7c03959db65e7a -size 5632 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Resources.Reader.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Resources.Reader.dll deleted file mode 100644 index 5d859469d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Resources.Reader.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4491b52b947cce0c71761f9ef92f58dffbc3abdaf1e9795f813b076fff6fd333 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Resources.ReaderWriter.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Resources.ReaderWriter.dll deleted file mode 100644 index 1d931510c..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Resources.ReaderWriter.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99fc4a443302268d3b01e95abde264aa7c772327aff5e8ad9150caca07c8578c -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Resources.ResourceManager.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Resources.ResourceManager.dll deleted file mode 100644 index 64960f06b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Resources.ResourceManager.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3077ef49a12e491102e8630e8e419ef255d32a767024097e1c7377804cbdae0e -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Resources.Writer.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Resources.Writer.dll deleted file mode 100644 index f7563a2e0..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Resources.Writer.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd3ea287d61f2ca9e36639b2fcf1863ad96b23d6cd797e4a2993d64b7bcfdcd5 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.CompilerServices.VisualC.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.CompilerServices.VisualC.dll deleted file mode 100644 index be4af110f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.CompilerServices.VisualC.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e07b95b1a6374fa2a4c71690213509a8cbe0f9a2a57606dccb27bff1f5f26519 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Extensions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Extensions.dll deleted file mode 100644 index b2039ab7b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:13525a02ae75462cc3817721457789fbd5a5e58c9ebf6e1d903b6b52c846e4c6 -size 6656 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Handles.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Handles.dll deleted file mode 100644 index 8f1a20560..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Handles.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b6cf0896b399ec99b3b56757a6c818c7abbe30b9b93267896f5fae54dae4cd2 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.RuntimeInformation.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.RuntimeInformation.dll deleted file mode 100644 index f21049139..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.RuntimeInformation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40cd19bdfcc27dd36b75224162cfa5154c1dbf6248333fa751ead8adeff269c3 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.WindowsRuntime.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.WindowsRuntime.dll deleted file mode 100644 index e2466e877..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.WindowsRuntime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:933d853950379c3f8e5e3ecf54b692599537f95e227320996e4c7477239e9ad9 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.dll deleted file mode 100644 index 980cfc654..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.InteropServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:542763d139c13f3b1e01bbf9993ec178024789853fa0715d7a7a3c347eab99f5 -size 7680 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Numerics.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Numerics.dll deleted file mode 100644 index 43f776d85..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42c072774bfbf30cdb9fe47a23a1ea1d51fb04d2b4396961dfc286ea81aaea02 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Formatters.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Formatters.dll deleted file mode 100644 index c5246c00e..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Formatters.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ab9329d5571c53175cf96be3a65b62ef048196579ed7dff5fb3fab06591d4a38 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Json.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Json.dll deleted file mode 100644 index 16f51cf5a..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee5bd9cd1edaee9a7919cbecdec55d23094c3d03c6049f3bbdd70e3dac14bd91 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Primitives.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Primitives.dll deleted file mode 100644 index 360b181f8..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:849e8b2591a3c28a9ffe9ff50d4d06453ce3b270083f47b3d8703ec88630b696 -size 5632 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Xml.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Xml.dll deleted file mode 100644 index 2a3df15dc..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.Serialization.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42ab3a4bdde68f87b754abb34af78009349be135bb96c3923f33caa2a89b02d5 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.dll deleted file mode 100644 index 96e2966d7..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Runtime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00ac5330dd40c7e75f7a3c8a0b5d0edd83fe331bf22589d70d3dacc21f432a99 -size 22528 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.AccessControl.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.AccessControl.dll deleted file mode 100644 index f7316a34f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.AccessControl.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e354dc2d4c66071b36e8005e1f178d9ed82679aca4d7fa91d50f4d4c28d755a -size 5632 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Claims.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Claims.dll deleted file mode 100644 index 8c10f1e0f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Claims.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de37aa2802a659d99b2e40959a73a97b7f541283cf825b869bac01d4d21d7409 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Algorithms.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Algorithms.dll deleted file mode 100644 index d15092632..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Algorithms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:736bffff3a1bd3981833abf793826a7b6e54c83ec4ce40f7de7f0b31820f3f95 -size 6144 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Csp.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Csp.dll deleted file mode 100644 index fc08637ea..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Csp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5942c805a45c40d7673f713f620083abb47a723417eb497739d3a1ac0f879258 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.DeriveBytes.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.DeriveBytes.dll deleted file mode 100644 index e7512ba02..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.DeriveBytes.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82797662651d9c77fd23f369555b8d0ea5adf9aac04cb6785768288f840b5ada -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encoding.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encoding.dll deleted file mode 100644 index 619ce04ca..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encoding.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba58bca1e32aae58145a20bf15b67c0eb7b96d56f2dc419ea9131ab00e1b6415 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.Aes.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.Aes.dll deleted file mode 100644 index 8ca07a64b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.Aes.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8827414767dc78d032e92caf620bf743e3dede67bbd145935e7e57e93ea4553b -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.ECDiffieHellman.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.ECDiffieHellman.dll deleted file mode 100644 index d94185ba9..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.ECDiffieHellman.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb3b87b189eb332695f7c976db23884cd9e6dafc1c85c11ded4415296f848fa1 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.ECDsa.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.ECDsa.dll deleted file mode 100644 index b11bdd630..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.ECDsa.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e72099f69bdd5dc9e057ff4ca3c521bdd32c55613fded02d3e14f1c3406d37a -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.dll deleted file mode 100644 index 31c995e85..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Encryption.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50c94403c539664ce962658b2e335eaadb42e2ab5b91afd3c5c6d34f8a12adba -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Hashing.Algorithms.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Hashing.Algorithms.dll deleted file mode 100644 index b7e58e00d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Hashing.Algorithms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:222ce7be0ea905a53ba10ac76a24c9eb3ac0494ad48a83c0a1462c3c20b9d135 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Hashing.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Hashing.dll deleted file mode 100644 index 9d2ec3b89..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Hashing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e2ae83f75eec5fa99df393a4fb6cc13c22da6cfbc2296f5bd60edf4a5bffbb4 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Primitives.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Primitives.dll deleted file mode 100644 index a5424c90b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:269b0ca96a7cf92cc56c2fd8a0849c26ed912dd6c7bdd07c59b00976eac8fcf3 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.ProtectedData.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.ProtectedData.dll deleted file mode 100644 index 26a3707b3..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.ProtectedData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e9c76559acf84ff7b1fe2d2183b9625cea2d4b44d53ac1f04f9e007daf3b03d4 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.RSA.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.RSA.dll deleted file mode 100644 index b6bc56bbc..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.RSA.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c75b6bd23375a62216fa12dcb633a3847534f4314cf1f3022be1007e5499e28d -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.RandomNumberGenerator.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.RandomNumberGenerator.dll deleted file mode 100644 index 889dd4477..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.RandomNumberGenerator.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f536bfc046095caf235cfc702800d3b9bf24547084d9f520f03056c80aed1db3 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.X509Certificates.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.X509Certificates.dll deleted file mode 100644 index b250ae90f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Cryptography.X509Certificates.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e20e85011e4d1f1bb6d83768ba2400e703a85e3948a3d5a2904b80a5bc2fdcc1 -size 6144 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Principal.Windows.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Principal.Windows.dll deleted file mode 100644 index 6175f95cb..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Principal.Windows.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73534745a7ef6ec8008263993d62fd82e2c0ca537af02d7adad866846f03a51d -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Principal.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Principal.dll deleted file mode 100644 index ef19f6daa..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.Principal.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d1fe2d68f59d40a4d832504277e26bea9fd1008303edb72dc7eabefc4cf32d08 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.SecureString.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.SecureString.dll deleted file mode 100644 index c27de770d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Security.SecureString.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93608df9f07bc31b76b50b5c9bbabcbb5318163975cc8f9d6f5a60be05771b33 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ServiceModel.Duplex.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ServiceModel.Duplex.dll deleted file mode 100644 index 2b786eaa0..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ServiceModel.Duplex.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c772f86f4f1e84662152344b4a8647b6da82aeaa2ccf1941b8e64d34039d8d6 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ServiceModel.Http.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ServiceModel.Http.dll deleted file mode 100644 index 54fa39c92..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ServiceModel.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c08f5686a3e581add444875e0d7c299b8928e3f98556bed78ab75bc08061d2d -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ServiceModel.NetTcp.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ServiceModel.NetTcp.dll deleted file mode 100644 index 7559e59f8..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ServiceModel.NetTcp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59562d37b24364dfeb886e37629d32d08caf160832c0cd48cf20266a09eeb59b -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ServiceModel.Primitives.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ServiceModel.Primitives.dll deleted file mode 100644 index 43a99f991..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ServiceModel.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf8b5fd4e892a2bad40909dbc5c15ee729e9eec830b67ac052a3ec6b94fab780 -size 10240 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ServiceModel.Security.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ServiceModel.Security.dll deleted file mode 100644 index f77865fac..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ServiceModel.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b44707098a4f052a063a947cd1482c6de42a08fa0d17ae847c35037ef694a109 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ServiceProcess.ServiceController.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ServiceProcess.ServiceController.dll deleted file mode 100644 index 836223f80..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ServiceProcess.ServiceController.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:401180ba787134671a4ec2c276755749d58e7e623b47e515cebba74e28d725ec -size 5632 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Text.Encoding.CodePages.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Text.Encoding.CodePages.dll deleted file mode 100644 index f8c8d4e10..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Text.Encoding.CodePages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d5adfac5e9cc4353f4f06eca0d53c0517205710e32aa829e805ce0187a9b09b -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Text.Encoding.Extensions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Text.Encoding.Extensions.dll deleted file mode 100644 index eb78733ea..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Text.Encoding.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dfcd01c9b609d0b9d1cb1b0cb4cbdb07415292d2f3c1a57d816bc49c7e643868 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Text.Encoding.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Text.Encoding.dll deleted file mode 100644 index 368f2a29a..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Text.Encoding.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a26b2a2564c872c242cf36907bcbd5aadf0350fc17f6e5cf1836294d433b2505 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Text.RegularExpressions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Text.RegularExpressions.dll deleted file mode 100644 index 2c6031927..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Text.RegularExpressions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f614cc87abed9ead104ce142cc5ddfc3fc64cb2424e835016cd45860f047c51c -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.AccessControl.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.AccessControl.dll deleted file mode 100644 index 10082194c..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.AccessControl.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33dfc1c63a7aa2a2a61b98cc36b59d71a534dda8b577cf416c6565cc38c1f288 -size 5632 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.Overlapped.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.Overlapped.dll deleted file mode 100644 index 0af3f61c9..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.Overlapped.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb13340cf72614a725afc8d93cdf98052ad4c8dc85fbd222e68b9da893b88693 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.Tasks.Parallel.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.Tasks.Parallel.dll deleted file mode 100644 index 48efc3a71..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.Tasks.Parallel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a9dcbd5a3b6d0737395023d032db270f915381f9901f4dbc0fe111811893061 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.Tasks.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.Tasks.dll deleted file mode 100644 index 0f69e2cdc..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.Tasks.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1af5b9e36367c94913ffec8d880d9613f671b6d40e850db5e0482e2ec9136c08 -size 5632 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.Thread.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.Thread.dll deleted file mode 100644 index 33518d181..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.Thread.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d303ca5ac9f2ed29abf5738cce3d49ec360bbd2087e80f91c357f5cb64493758 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.ThreadPool.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.ThreadPool.dll deleted file mode 100644 index 216f00406..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.ThreadPool.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eed57206b648eb4c47289b17a9a4b2db852a0b93eb160f57a943d061cde84ca8 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.Timer.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.Timer.dll deleted file mode 100644 index d8b9df2ef..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.Timer.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e4faef06dc0b413a3c31db4a13bbaa9f02388242e78b56f86f46d0e7ca1d240 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.dll deleted file mode 100644 index 4052fd63d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Threading.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76212a15859dad4c7f69fac2bdadce26a379e009d42d78a098960e111647df36 -size 5632 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ValueTuple.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ValueTuple.dll deleted file mode 100644 index ab8549725..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.ValueTuple.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4a5887f5ee33e62e0147a00090661f24564e15fd455c842c3578405d0b1d453 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.ReaderWriter.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.ReaderWriter.dll deleted file mode 100644 index 10b211f2d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.ReaderWriter.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc0f6366022916eaa428bd34d32f14a47785fde29474e3bf9c9e9949ed2da4a2 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.XDocument.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.XDocument.dll deleted file mode 100644 index aaf1e4f8a..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.XDocument.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b91d4fde13a591aa3f6c8dca04f893cb69c81a930f611f3447879e7fa5d373e6 -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.XPath.XDocument.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.XPath.XDocument.dll deleted file mode 100644 index c4f130e14..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.XPath.XDocument.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:35edcdc0e6cb9a247138e90493a90dd65200f83561e9d3b5f64af48b96fc0d62 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.XPath.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.XPath.dll deleted file mode 100644 index 2a97346a4..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.XPath.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4939decbbff9e70d21e3c2adfb14df49a6e94e554c211d53e2d2b0378a6dfeec -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.XmlDocument.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.XmlDocument.dll deleted file mode 100644 index a4a48d51f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.XmlDocument.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4bfe0ce7f99b319d79dd48d7b74ea51b4875a90a5273f3eb19d58494897a3fb -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.XmlSerializer.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.XmlSerializer.dll deleted file mode 100644 index d7961229f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.XmlSerializer.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8cc223efdd551d548a548e97f3301f316820b08bd18fac80b148978592276fec -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.Xsl.Primitives.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.Xsl.Primitives.dll deleted file mode 100644 index 88efd713c..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/System.Xml.Xsl.Primitives.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f86a09515e53eac33bccad037fbbb6bc8ce94b8530062c575d31ca454e5e418 -size 4608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/netstandard.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/netstandard.dll deleted file mode 100644 index 2cd9d7d83..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Facades/netstandard.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:86aa1915e27de0fcdad675b686424f22945951a5317c7ef35753cafdbfa0a182 -size 84992 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Microsoft.CSharp.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Microsoft.CSharp.dll deleted file mode 100644 index 538fa6bf4..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Microsoft.CSharp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c386383de3ae9e895f4e3702e7f44cf7b9b2b759f0859eba5f1c6cd1915b7d67 -size 300544 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.CSharp.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.CSharp.dll deleted file mode 100644 index ecc41d125..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.CSharp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad48fc93e7d3164f490e0a80230d2953b2f7120d9940e0af6d4ec17f3e4d5e97 -size 4681136 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.dll deleted file mode 100644 index 635806e5b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:478fa2f04a64256955f9682b8114a2f72f4a9e22de60fe5a15b2d846b6e2d6db -size 2414512 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Mono.Posix.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Mono.Posix.dll deleted file mode 100644 index 24e19fd94..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Mono.Posix.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:808439c9d7c076eb2522fdfe2ce1098abae6f6e285d6abc55d97ddb6d0d26e08 -size 212480 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Mono.Security.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Mono.Security.dll deleted file mode 100644 index 951b0bfae..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/Mono.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3f217f4a364c34d7f49936cf260433f45611a04429a2e3984b323a59f830589 -size 314368 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Collections.Immutable.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Collections.Immutable.dll deleted file mode 100644 index 5b30d134d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Collections.Immutable.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8e9ce5d4db1897a939e60860154617300b0dfa4c4d3e10341f21af0de4bbfd5 -size 244432 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll deleted file mode 100644 index 8bfd1a09b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2383b6b3a6b26d1087085b36c870f0ec9bbdea2b1bdbc84a0fae1199c748b7bc -size 259072 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll deleted file mode 100644 index ab6ebc5e5..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eba35e43d95ab785e49df375698e0d16dc96c01913f122d8e28037ede27a352d -size 84992 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Configuration.Install.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Configuration.Install.dll deleted file mode 100644 index 466defc1b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Configuration.Install.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:252e5a4efb637836e095d3b548f260a5f102e1d9a7ab60d6e86f1d037fd5a9a9 -size 24064 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Configuration.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Configuration.dll deleted file mode 100644 index b527bebb0..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Configuration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b80cf5be3c7057d75a8316656c2908fee6c42c56db496a3cd7360fd7f7ef1a8 -size 122880 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Core.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Core.dll deleted file mode 100644 index 800084cbe..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cbbbec2664d3db5ba45968309567fd8f1a40e2b7f850f105f65542ee2e6a120b -size 1060864 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll deleted file mode 100644 index 20c4a229d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47d6066206c902291116777a12866baaf14047881b2a81c1581043da98f87d33 -size 29696 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.Entity.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.Entity.dll deleted file mode 100644 index 89a341f3d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.Entity.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60d64c82a582aa890534cc712d433821054e06410bde58064e93d5e018c42863 -size 3339264 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.Linq.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.Linq.dll deleted file mode 100644 index 3b46bead2..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17a0d35c1ad7d7b08a1b587cf356642afbfa79c7dedce2a7f45233b4484ec0ab -size 493568 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.OracleClient.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.OracleClient.dll deleted file mode 100644 index 305c96c77..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.OracleClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d505d83165e22e7ab370453cf9a18df8719c85275f7ff14b66c3345cfae0a07 -size 173056 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.Services.Client.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.Services.Client.dll deleted file mode 100644 index 7a63dfefe..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.Services.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c36d770c293ee54ffc024ccd306ed52b0b1c673e938e70d2d545366e93b1fbf -size 418816 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.Services.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.Services.dll deleted file mode 100644 index 0289c8cba..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7eb71c131eb85bd425da257dc16f33eae51f4860d3acd6cc4b6012cad61feb6b -size 56320 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.dll deleted file mode 100644 index 03c392621..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3b1ff22e881e7942f699a47baf8b19a4c130e06f979d5f040b38a083bd3c80f -size 2176000 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Deployment.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Deployment.dll deleted file mode 100644 index 9ae5b7f34..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db9299957f72f26dc76cc3d99a2eed9cc2dfdcedf3e5d3b7126040a61df404bb -size 11264 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll deleted file mode 100644 index cc9ac46dc..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0e27e7d6f334d21a0d79d5590a2910d7aea644f7c8f4ad3b8d95978d97bd287 -size 61952 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.DirectoryServices.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.DirectoryServices.dll deleted file mode 100644 index b8ac625bc..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.DirectoryServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4a7f98fb1e80e5d337bbc4836d8fa3545bb9c5da96de9bf5ee0fbbb8b4c2ef0 -size 94208 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Drawing.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Drawing.dll deleted file mode 100644 index 71fb58128..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Drawing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:032e72d1767859c9e9de20117b3ca2823e29d79a545608eb5fa4f0e432c95be9 -size 482816 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Dynamic.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Dynamic.dll deleted file mode 100644 index 19d37807a..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Dynamic.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:faeabe9ab6fb8c6c6f7401440b61f50742d6337422dbe877ffbd2863f8ed7f14 -size 87040 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.EnterpriseServices.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.EnterpriseServices.dll deleted file mode 100644 index 1bd5a2168..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.EnterpriseServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bab34e6aee689697f3de11997bf78d708ca9f388ebd8b4ef8444a72ad146b435 -size 46592 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll deleted file mode 100644 index f0a3d2170..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07509ad8d972a949d23f28182f1014493827c522c0a05c362a322194dcc958d7 -size 18432 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.IO.Compression.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.IO.Compression.dll deleted file mode 100644 index 72c2b69a4..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.IO.Compression.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:854d4c3792cb38bdd150587483a4546ec00402c15ef800fbf9710e769bc6a858 -size 99840 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll deleted file mode 100644 index 2e27836a5..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b10311f5e74a932b53bf5246cb8c5d0870c8abb86b44f346b42d944e0d5aa4cc -size 17408 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.IdentityModel.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.IdentityModel.dll deleted file mode 100644 index fdc4af3ba..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.IdentityModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af5babdd0ed1f293f34cdb5de60990bbbff29b7210ec33b88216d1bcd6690c9f -size 139776 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Json.Microsoft.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Json.Microsoft.dll deleted file mode 100644 index 7fd728f75..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Json.Microsoft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8db90c030ac969ffb0eff96c588b48e687f6578de07dd501c5285adb38d52dc6 -size 54784 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Json.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Json.dll deleted file mode 100644 index d2b1ea8b4..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63b117af842abfd437b9a12d05b5e46eb893128e63d435a3945411a2c5f2c3be -size 32768 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Management.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Management.dll deleted file mode 100644 index 6d5b77cf6..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:167f222464d487e2e1fc3c3e650c8709ef69843e13b396b54832fef13fd2f17f -size 49152 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Messaging.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Messaging.dll deleted file mode 100644 index f1832234a..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23f29e2f9611bf7f723fbcbf8093ea76fa69e7c95f52af11e13ae9c524e36309 -size 75776 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll deleted file mode 100644 index 3bae6b653..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2a0a7ef44aa32beb43360c15276c97d3d2f43fded9b49059ec4b5cd7375eef0 -size 519168 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll deleted file mode 100644 index 486b58b3f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:056222d594bd4d6d66778e2bbeb13fb60d67ec3bb8132d299b768f528e2b59dc -size 8704 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Net.Http.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Net.Http.dll deleted file mode 100644 index 9ed326fe0..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Net.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c622434b946190b68d1a06c9c4cbb255a335ceb7951ca3c95264f7134d962a89 -size 115712 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Net.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Net.dll deleted file mode 100644 index d5e539cc0..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Net.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:794e311e903861dc9c1fd58ca94d1020e69d2082ec57868ce9b057f0c7febed7 -size 13312 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Numerics.Vectors.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Numerics.Vectors.dll deleted file mode 100644 index 3832659b8..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Numerics.Vectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8605dc6f36efaa5caae780981ef26eb0f1e0991214b6fcc78b65b02de24d57d -size 12288 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Numerics.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Numerics.dll deleted file mode 100644 index 0712c5db6..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a34de47b07a11476d320e8bc90839497666a672dede5f0d89fdaddef9da7fb92 -size 119296 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Core.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Core.dll deleted file mode 100644 index 71a460cff..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4de31ce3baff183fd92197bf54538ef856c48d11aa6e09415fbaa2731b152c2c -size 96256 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Debugger.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Debugger.dll deleted file mode 100644 index 017efea9d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Debugger.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8d86f058f7449f9562487d55fc6f6d8c48d1ae392031693c412027ab8c725dc -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Experimental.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Experimental.dll deleted file mode 100644 index 8cd931a90..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Experimental.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:270fc54fffab856dc39c59f4b8f36c3ea100077d277f8376b38c0defc4ca7106 -size 28672 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll deleted file mode 100644 index cd36c3941..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d9455be0e328fb04c676c098ddbdaae2ec502c3c0c40e5fa8df55eea934be88 -size 7680 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Linq.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Linq.dll deleted file mode 100644 index 896df65a1..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c3d59871c8372fe66118ad949fb63e27d1c9a5224411ca8ea6ff72e7810ce97 -size 683008 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll deleted file mode 100644 index ca13cac26..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d5c4c8215b336d46a9c0c2c17eb7e5b5f0cd1fd4dcb000c078c4e04eaceebf5 -size 9728 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll deleted file mode 100644 index 5d81b4873..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79083f313b2f5e3b20faa88e49205aece830c554e2fc7166d2163aa6367378bd -size 22528 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Providers.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Providers.dll deleted file mode 100644 index 6baa78665..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Providers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6cca58ace28725eab8be54c5ce63f38226e00491e6f18e870f2c4de955f7eb1 -size 243200 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll deleted file mode 100644 index a76d185f1..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1de1731d7fb418f4d190d8bfb4a82c9fa98a7ed2dfb87c9f090b86f5859df9e3 -size 9216 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll deleted file mode 100644 index 9732542ef..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a45b23e876eaa89da807f8e569d4310b7837b15e8c1fa5d7f96b0cfc102a4e9a -size 9728 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll deleted file mode 100644 index c7d365f14..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4bab7f093518c414085258a5ed9da770be284b6a0fd50717d7890ec743e7ec7 -size 12800 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reflection.Context.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reflection.Context.dll deleted file mode 100644 index 35115a643..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reflection.Context.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd06d517d0d44a2f2c0b9ef30212f54f3c36b0db8c6efacab98a4685b1f64dea -size 13312 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reflection.Metadata.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reflection.Metadata.dll deleted file mode 100644 index 31031cd34..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Reflection.Metadata.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:652ded0ce5e153b85154ac65d00244aafb49e0fe8a958e2afb9c5bea83a957c0 -size 465104 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Runtime.Caching.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Runtime.Caching.dll deleted file mode 100644 index fc7961035..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Runtime.Caching.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44472e1daf4804d9cbb27570a33637f8fff7baaf2a34cb1b0265ec0ce126560a -size 72192 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll deleted file mode 100644 index d8deafe7b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a602889eb1f44c67e0f007302b60cc597cebbe1497602251b72aead641b0b30 -size 107008 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Runtime.Remoting.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Runtime.Remoting.dll deleted file mode 100644 index 739ba99fb..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f969cb59d10e32c8ca64315202d9b7f4c281f90644eb3def96043630db93cea1 -size 119808 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll deleted file mode 100644 index fd8edb333..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11095119a3bb3e90062f5d945ee84cafd9f5d398b3469b7dea93226a8969f597 -size 38912 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Runtime.Serialization.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Runtime.Serialization.dll deleted file mode 100644 index 86d9f24ec..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Runtime.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e79e892dd359575db05e94540e258abd7d00d866537884b08f40496b8324bda1 -size 934400 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Security.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Security.dll deleted file mode 100644 index e9f767348..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3aa7e023a1603b1b8a75238fd90d84404270f4d0e1e19f4b990d516da69c4ae5 -size 281600 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll deleted file mode 100644 index 0549bdb6d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f469c217afd60fcb81a9a74465cbf0354d8e67d1d2e7092a0e58868a0048c8d9 -size 13312 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll deleted file mode 100644 index 91210a18c..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99fe4cfa49222d8d6c8a1168e42be676574dd035040b1bbe4528c32b215e2c8f -size 141312 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll deleted file mode 100644 index 3c8004057..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a89bf31e08fee2d8922b534387b5e1b73f66de4aaff8ef3267574c55dfa8b099 -size 214528 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll deleted file mode 100644 index 7f7a47794..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3f2ebe00b9ce96573985d158625c77d67fddf9ffb9c6932f88b094f01dfd68f -size 37376 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceModel.Web.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceModel.Web.dll deleted file mode 100644 index 40e3cc005..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceModel.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60bbb932cfd6740d5f33eb1606f5f37c84177dc690b0621a369015eb1c039cfa -size 79360 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceModel.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceModel.dll deleted file mode 100644 index 963c03d04..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5a0ac8df58b6ec822693e7560d99bdf18390c653255b32c944b15b6a3444ec4 -size 1426944 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceProcess.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceProcess.dll deleted file mode 100644 index 7f7f8abc4..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.ServiceProcess.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c4a73a29be261f5ccb86488ffe10f0a39e89da06bd79dfb14a8fcfa9220ab0d -size 47104 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll deleted file mode 100644 index 4e93ddc2f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0cb9c05d93e946fb60be318c84f8f160b9a629a419932ec5a7d15caaaf684f8f -size 168960 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Transactions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Transactions.dll deleted file mode 100644 index 5a32ec0ad..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Transactions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c42f2468cda39b9a52b122dcd18d0377220c396cb69b2b493ce7f8754fc1f1d -size 34304 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Abstractions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Abstractions.dll deleted file mode 100644 index 98eb8573f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Abstractions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c3f86f31d8a6ae98982e2d3dac1fd8f25b1ebb58f1206edfb118a41e9ffd319 -size 12800 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll deleted file mode 100644 index fdca73577..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fabe15ee190b3d1c4ffaa467cd76bfeeb174c26e85f9324b30a5ffaab13d5bf -size 33792 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.DynamicData.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.DynamicData.dll deleted file mode 100644 index ef466b724..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.DynamicData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66a107c6d94a6f4811240d1fde552d9fdac32b4a0cb985766e6c5570e1661002 -size 69120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Extensions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Extensions.dll deleted file mode 100644 index 7b6226fef..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0162659ab054c3969ae150f0e05368b57e45518c49ac3ceb97c5d55a6c529cf9 -size 746496 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll deleted file mode 100644 index 74f0a27c1..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53b4ec85036c686ffac982c7bdfe9991ac25fb6e316a341a5a07ce96e9513e55 -size 88064 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll deleted file mode 100644 index fc0cbcc1e..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4cc0e41b1640296696ed6d3a6940acdb0746e45549f97809ea634444eadbca72 -size 56320 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Http.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Http.dll deleted file mode 100644 index c11535639..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d3314f0fd4caab1d63c2349c30ef557c74ae3ff2719a7998873b62180261f52 -size 326144 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Mobile.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Mobile.dll deleted file mode 100644 index 2f83ca253..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Mobile.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a836e3e93e5828736088cde47e28512c5cc57a2009db9805a797516e70245b7 -size 11264 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Mvc.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Mvc.dll deleted file mode 100644 index 985161adf..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Mvc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e16b3608d9d80935dfb5d7fee7c52ff010313177c336e699e197521f57a776e -size 420352 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Razor.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Razor.dll deleted file mode 100644 index dbcb53418..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c880284f07b77730ff6f403c404165de5bfc6cef7c114015f357f375b59200d9 -size 254976 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll deleted file mode 100644 index 8e64c7e1d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ac0e21ae2a3806a9b4022003e34c8fec95764b41de2b1c22053a5a4210b99f5 -size 11776 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Routing.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Routing.dll deleted file mode 100644 index 84a86a1ff..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f77a573dbf24e8d4c97b10ac1db02006a3a10b59fcf00f491a48d95e08f2d9a5 -size 12288 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Services.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Services.dll deleted file mode 100644 index 684f807d8..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e6957762acf08a660d95f8f53360b0f5d5f964faff1e8883a0a05d17d088181 -size 736256 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll deleted file mode 100644 index 217074c81..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3b155c702b203bd92bb000674ecbb17268c1f286d862456420a07fb06aea296 -size 39424 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll deleted file mode 100644 index 9c180770d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1935aae7b622b37295665235e0ec74a8821b3c010c20f558b3d13be42d1e77c6 -size 38400 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.WebPages.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.WebPages.dll deleted file mode 100644 index bc5c14264..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.WebPages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5cb446d04971bbd2b6e911b9751c953f95d41f2c1d86291d683caf62644c613 -size 196608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.dll deleted file mode 100644 index 76076e618..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5edaae59667f870f05981d83c31ff25de85a56bcac1c3c21b2a3536439ef6930 -size 3030016 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll deleted file mode 100644 index 23fa3775b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8313360d08f86b6c805df0a3576a2dc2f5d253241ba22a868e65b09d947343bf -size 145920 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Windows.Forms.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Windows.Forms.dll deleted file mode 100644 index 3ff3435d4..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2cb88a463f0f8e7025b6e6988ee2e3d4001ce0b7cf5a37560e1002e325bb0eb -size 2898432 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Windows.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Windows.dll deleted file mode 100644 index a0d16168d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Windows.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec90da3e05d35fa76a1d576a9c14e0fb95e9c5016305352607029ff080a4bc1a -size 11776 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Workflow.Activities.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Workflow.Activities.dll deleted file mode 100644 index 159d8a7e5..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Workflow.Activities.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ffda734f630f52c7aabf9b6dfbb1cfd43be266f5761f8df8e1ae1b9e5f7dcc1 -size 11776 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll deleted file mode 100644 index 2547b6648..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c0c81efccdd49d67ba923bb9f96e7b095ae0c5726620ab0e98ecaab65dc299b -size 11776 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Workflow.Runtime.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Workflow.Runtime.dll deleted file mode 100644 index 2c2b17854..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Workflow.Runtime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b09dd31624af27363fab179b4b0a2dae32e698eb4284f187742a3129f1f44e9 -size 11776 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Xaml.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Xaml.dll deleted file mode 100644 index 9d4b1802f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Xaml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:610a9d1d412a1785d2d04be3549e8b708977ddcfb3cd73241a659afa5039a381 -size 188928 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Xml.Linq.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Xml.Linq.dll deleted file mode 100644 index 07bb029db..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Xml.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74e12d93dc79b18aef8241d4dbfc7a5ab4a2457ec94f087ab280809dde3cb9b0 -size 137216 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Xml.Serialization.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Xml.Serialization.dll deleted file mode 100644 index 71501bb82..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Xml.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d51a04521acc7d37047913b82a2973edcaf6db96ce74f2e3fe3fa506d1b0b70 -size 11776 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Xml.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Xml.dll deleted file mode 100644 index 88dfe5ae7..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58196401c5c8f3323e0912b4422137612bd7eb2a3821cb53c4ac74fb7b26dda1 -size 3174912 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.dll deleted file mode 100644 index 997f34981..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/System.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb1d7b4b87422c0cd8f0aa847c382cbcb1bad88872f013ef164eaaf0ed76a5fc -size 2456064 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/WindowsBase.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/WindowsBase.dll deleted file mode 100644 index 345f59f24..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/WindowsBase.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:445e763848380e33861eda9af9b2d871237c12f4799603f32b0c42abf9875a7c -size 161792 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/csc.exe b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/csc.exe deleted file mode 100644 index 876727d78..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/csc.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f87824757de30ff92ca8dba1049c01855c0664f94d48980ce782b95fce7bb0e5 -size 49584 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/mscorlib.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/mscorlib.dll deleted file mode 100644 index 7b6afe057..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/4.5/mscorlib.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1945a39b4cc3ff3d16d1ed359fca1399248b54dc41da14c51db37ace45eddf9 -size 4498432 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll deleted file mode 100644 index 853d3c046..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0912a0bebc016e611e4900d99485713fbf0e013f496afc8fc837be08611723e -size 12288 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll deleted file mode 100644 index 24e19fd94..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:808439c9d7c076eb2522fdfe2ce1098abae6f6e285d6abc55d97ddb6d0d26e08 -size 212480 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll deleted file mode 100644 index 951b0bfae..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3f217f4a364c34d7f49936cf260433f45611a04429a2e3984b323a59f830589 -size 314368 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ComponentModel.Composition/4.0.0.0__b77a5c561934e089/System.ComponentModel.Composition.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ComponentModel.Composition/4.0.0.0__b77a5c561934e089/System.ComponentModel.Composition.dll deleted file mode 100644 index 8bfd1a09b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ComponentModel.Composition/4.0.0.0__b77a5c561934e089/System.ComponentModel.Composition.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2383b6b3a6b26d1087085b36c870f0ec9bbdea2b1bdbc84a0fae1199c748b7bc -size 259072 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll deleted file mode 100644 index ab6ebc5e5..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eba35e43d95ab785e49df375698e0d16dc96c01913f122d8e28037ede27a352d -size 84992 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll deleted file mode 100644 index 466defc1b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:252e5a4efb637836e095d3b548f260a5f102e1d9a7ab60d6e86f1d037fd5a9a9 -size 24064 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll deleted file mode 100644 index b527bebb0..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b80cf5be3c7057d75a8316656c2908fee6c42c56db496a3cd7360fd7f7ef1a8 -size 122880 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll deleted file mode 100644 index 800084cbe..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cbbbec2664d3db5ba45968309567fd8f1a40e2b7f850f105f65542ee2e6a120b -size 1060864 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data.DataSetExtensions/4.0.0.0__b77a5c561934e089/System.Data.DataSetExtensions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data.DataSetExtensions/4.0.0.0__b77a5c561934e089/System.Data.DataSetExtensions.dll deleted file mode 100644 index 20c4a229d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data.DataSetExtensions/4.0.0.0__b77a5c561934e089/System.Data.DataSetExtensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47d6066206c902291116777a12866baaf14047881b2a81c1581043da98f87d33 -size 29696 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data.Entity/4.0.0.0__b77a5c561934e089/System.Data.Entity.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data.Entity/4.0.0.0__b77a5c561934e089/System.Data.Entity.dll deleted file mode 100644 index 89a341f3d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data.Entity/4.0.0.0__b77a5c561934e089/System.Data.Entity.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60d64c82a582aa890534cc712d433821054e06410bde58064e93d5e018c42863 -size 3339264 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll deleted file mode 100644 index 3b46bead2..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17a0d35c1ad7d7b08a1b587cf356642afbfa79c7dedce2a7f45233b4484ec0ab -size 493568 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll deleted file mode 100644 index 305c96c77..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d505d83165e22e7ab370453cf9a18df8719c85275f7ff14b66c3345cfae0a07 -size 173056 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data.Services.Client/4.0.0.0__b77a5c561934e089/System.Data.Services.Client.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data.Services.Client/4.0.0.0__b77a5c561934e089/System.Data.Services.Client.dll deleted file mode 100644 index 7a63dfefe..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data.Services.Client/4.0.0.0__b77a5c561934e089/System.Data.Services.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c36d770c293ee54ffc024ccd306ed52b0b1c673e938e70d2d545366e93b1fbf -size 418816 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data.Services/4.0.0.0__b77a5c561934e089/System.Data.Services.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data.Services/4.0.0.0__b77a5c561934e089/System.Data.Services.dll deleted file mode 100644 index 0289c8cba..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data.Services/4.0.0.0__b77a5c561934e089/System.Data.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7eb71c131eb85bd425da257dc16f33eae51f4860d3acd6cc4b6012cad61feb6b -size 56320 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll deleted file mode 100644 index 03c392621..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3b1ff22e881e7942f699a47baf8b19a4c130e06f979d5f040b38a083bd3c80f -size 2176000 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Deployment/4.0.0.0__b03f5f7f11d50a3a/System.Deployment.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Deployment/4.0.0.0__b03f5f7f11d50a3a/System.Deployment.dll deleted file mode 100644 index 9ae5b7f34..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Deployment/4.0.0.0__b03f5f7f11d50a3a/System.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db9299957f72f26dc76cc3d99a2eed9cc2dfdcedf3e5d3b7126040a61df404bb -size 11264 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.DirectoryServices.Protocols/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.Protocols.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.DirectoryServices.Protocols/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.Protocols.dll deleted file mode 100644 index cc9ac46dc..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.DirectoryServices.Protocols/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.Protocols.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0e27e7d6f334d21a0d79d5590a2910d7aea644f7c8f4ad3b8d95978d97bd287 -size 61952 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll deleted file mode 100644 index b8ac625bc..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4a7f98fb1e80e5d337bbc4836d8fa3545bb9c5da96de9bf5ee0fbbb8b4c2ef0 -size 94208 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll deleted file mode 100644 index 71fb58128..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:032e72d1767859c9e9de20117b3ca2823e29d79a545608eb5fa4f0e432c95be9 -size 482816 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Dynamic/4.0.0.0__b03f5f7f11d50a3a/System.Dynamic.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Dynamic/4.0.0.0__b03f5f7f11d50a3a/System.Dynamic.dll deleted file mode 100644 index 19d37807a..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Dynamic/4.0.0.0__b03f5f7f11d50a3a/System.Dynamic.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:faeabe9ab6fb8c6c6f7401440b61f50742d6337422dbe877ffbd2863f8ed7f14 -size 87040 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll deleted file mode 100644 index 1bd5a2168..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bab34e6aee689697f3de11997bf78d708ca9f388ebd8b4ef8444a72ad146b435 -size 46592 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll deleted file mode 100644 index f0a3d2170..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07509ad8d972a949d23f28182f1014493827c522c0a05c362a322194dcc958d7 -size 18432 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll deleted file mode 100644 index 72c2b69a4..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:854d4c3792cb38bdd150587483a4546ec00402c15ef800fbf9710e769bc6a858 -size 99840 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll deleted file mode 100644 index 2e27836a5..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b10311f5e74a932b53bf5246cb8c5d0870c8abb86b44f346b42d944e0d5aa4cc -size 17408 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll deleted file mode 100644 index fdc4af3ba..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af5babdd0ed1f293f34cdb5de60990bbbff29b7210ec33b88216d1bcd6690c9f -size 139776 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Json.Microsoft/4.0.0.0__31bf3856ad364e35/System.Json.Microsoft.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Json.Microsoft/4.0.0.0__31bf3856ad364e35/System.Json.Microsoft.dll deleted file mode 100644 index 7fd728f75..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Json.Microsoft/4.0.0.0__31bf3856ad364e35/System.Json.Microsoft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8db90c030ac969ffb0eff96c588b48e687f6578de07dd501c5285adb38d52dc6 -size 54784 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Json/4.0.0.0__31bf3856ad364e35/System.Json.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Json/4.0.0.0__31bf3856ad364e35/System.Json.dll deleted file mode 100644 index d2b1ea8b4..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Json/4.0.0.0__31bf3856ad364e35/System.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63b117af842abfd437b9a12d05b5e46eb893128e63d435a3945411a2c5f2c3be -size 32768 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll deleted file mode 100644 index 6d5b77cf6..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:167f222464d487e2e1fc3c3e650c8709ef69843e13b396b54832fef13fd2f17f -size 49152 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll deleted file mode 100644 index f1832234a..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23f29e2f9611bf7f723fbcbf8093ea76fa69e7c95f52af11e13ae9c524e36309 -size 75776 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll deleted file mode 100644 index 3bae6b653..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2a0a7ef44aa32beb43360c15276c97d3d2f43fded9b49059ec4b5cd7375eef0 -size 519168 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll deleted file mode 100644 index 486b58b3f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:056222d594bd4d6d66778e2bbeb13fb60d67ec3bb8132d299b768f528e2b59dc -size 8704 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll deleted file mode 100644 index 9ed326fe0..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c622434b946190b68d1a06c9c4cbb255a335ceb7951ca3c95264f7134d962a89 -size 115712 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll deleted file mode 100644 index d5e539cc0..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:794e311e903861dc9c1fd58ca94d1020e69d2082ec57868ce9b057f0c7febed7 -size 13312 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll deleted file mode 100644 index 3832659b8..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8605dc6f36efaa5caae780981ef26eb0f1e0991214b6fcc78b65b02de24d57d -size 12288 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll deleted file mode 100644 index 0712c5db6..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a34de47b07a11476d320e8bc90839497666a672dede5f0d89fdaddef9da7fb92 -size 119296 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Core/2.2.0.0__31bf3856ad364e35/System.Reactive.Core.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Core/2.2.0.0__31bf3856ad364e35/System.Reactive.Core.dll deleted file mode 100644 index 71a460cff..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Core/2.2.0.0__31bf3856ad364e35/System.Reactive.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4de31ce3baff183fd92197bf54538ef856c48d11aa6e09415fbaa2731b152c2c -size 96256 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Debugger/2.2.0.0__31bf3856ad364e35/System.Reactive.Debugger.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Debugger/2.2.0.0__31bf3856ad364e35/System.Reactive.Debugger.dll deleted file mode 100644 index 017efea9d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Debugger/2.2.0.0__31bf3856ad364e35/System.Reactive.Debugger.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8d86f058f7449f9562487d55fc6f6d8c48d1ae392031693c412027ab8c725dc -size 5120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Experimental/2.2.0.0__31bf3856ad364e35/System.Reactive.Experimental.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Experimental/2.2.0.0__31bf3856ad364e35/System.Reactive.Experimental.dll deleted file mode 100644 index 8cd931a90..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Experimental/2.2.0.0__31bf3856ad364e35/System.Reactive.Experimental.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:270fc54fffab856dc39c59f4b8f36c3ea100077d277f8376b38c0defc4ca7106 -size 28672 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Interfaces/2.2.0.0__31bf3856ad364e35/System.Reactive.Interfaces.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Interfaces/2.2.0.0__31bf3856ad364e35/System.Reactive.Interfaces.dll deleted file mode 100644 index cd36c3941..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Interfaces/2.2.0.0__31bf3856ad364e35/System.Reactive.Interfaces.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d9455be0e328fb04c676c098ddbdaae2ec502c3c0c40e5fa8df55eea934be88 -size 7680 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Linq/2.2.0.0__31bf3856ad364e35/System.Reactive.Linq.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Linq/2.2.0.0__31bf3856ad364e35/System.Reactive.Linq.dll deleted file mode 100644 index 896df65a1..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Linq/2.2.0.0__31bf3856ad364e35/System.Reactive.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c3d59871c8372fe66118ad949fb63e27d1c9a5224411ca8ea6ff72e7810ce97 -size 683008 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Observable.Aliases/0.0.0.0__31bf3856ad364e35/System.Reactive.Observable.Aliases.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Observable.Aliases/0.0.0.0__31bf3856ad364e35/System.Reactive.Observable.Aliases.dll deleted file mode 100644 index ca13cac26..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Observable.Aliases/0.0.0.0__31bf3856ad364e35/System.Reactive.Observable.Aliases.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d5c4c8215b336d46a9c0c2c17eb7e5b5f0cd1fd4dcb000c078c4e04eaceebf5 -size 9728 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.PlatformServices/2.2.0.0__31bf3856ad364e35/System.Reactive.PlatformServices.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.PlatformServices/2.2.0.0__31bf3856ad364e35/System.Reactive.PlatformServices.dll deleted file mode 100644 index 5d81b4873..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.PlatformServices/2.2.0.0__31bf3856ad364e35/System.Reactive.PlatformServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79083f313b2f5e3b20faa88e49205aece830c554e2fc7166d2163aa6367378bd -size 22528 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Providers/2.2.0.0__31bf3856ad364e35/System.Reactive.Providers.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Providers/2.2.0.0__31bf3856ad364e35/System.Reactive.Providers.dll deleted file mode 100644 index 6baa78665..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Providers/2.2.0.0__31bf3856ad364e35/System.Reactive.Providers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6cca58ace28725eab8be54c5ce63f38226e00491e6f18e870f2c4de955f7eb1 -size 243200 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Runtime.Remoting/2.2.0.0__31bf3856ad364e35/System.Reactive.Runtime.Remoting.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Runtime.Remoting/2.2.0.0__31bf3856ad364e35/System.Reactive.Runtime.Remoting.dll deleted file mode 100644 index a76d185f1..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Runtime.Remoting/2.2.0.0__31bf3856ad364e35/System.Reactive.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1de1731d7fb418f4d190d8bfb4a82c9fa98a7ed2dfb87c9f090b86f5859df9e3 -size 9216 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Windows.Forms/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Forms.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Windows.Forms/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Forms.dll deleted file mode 100644 index 9732542ef..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Windows.Forms/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a45b23e876eaa89da807f8e569d4310b7837b15e8c1fa5d7f96b0cfc102a4e9a -size 9728 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Windows.Threading/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Threading.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Windows.Threading/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Threading.dll deleted file mode 100644 index c7d365f14..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reactive.Windows.Threading/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Threading.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4bab7f093518c414085258a5ed9da770be284b6a0fd50717d7890ec743e7ec7 -size 12800 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reflection.Context/4.0.0.0__b77a5c561934e089/System.Reflection.Context.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reflection.Context/4.0.0.0__b77a5c561934e089/System.Reflection.Context.dll deleted file mode 100644 index 35115a643..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Reflection.Context/4.0.0.0__b77a5c561934e089/System.Reflection.Context.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd06d517d0d44a2f2c0b9ef30212f54f3c36b0db8c6efacab98a4685b1f64dea -size 13312 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll deleted file mode 100644 index fc7961035..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44472e1daf4804d9cbb27570a33637f8fff7baaf2a34cb1b0265ec0ce126560a -size 72192 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll deleted file mode 100644 index d8deafe7b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a602889eb1f44c67e0f007302b60cc597cebbe1497602251b72aead641b0b30 -size 107008 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll deleted file mode 100644 index 739ba99fb..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f969cb59d10e32c8ca64315202d9b7f4c281f90644eb3def96043630db93cea1 -size 119808 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll deleted file mode 100644 index fd8edb333..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11095119a3bb3e90062f5d945ee84cafd9f5d398b3469b7dea93226a8969f597 -size 38912 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll deleted file mode 100644 index 86d9f24ec..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e79e892dd359575db05e94540e258abd7d00d866537884b08f40496b8324bda1 -size 934400 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll deleted file mode 100644 index e9f767348..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3aa7e023a1603b1b8a75238fd90d84404270f4d0e1e19f4b990d516da69c4ae5 -size 281600 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll deleted file mode 100644 index 0549bdb6d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f469c217afd60fcb81a9a74465cbf0354d8e67d1d2e7092a0e58868a0048c8d9 -size 13312 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll deleted file mode 100644 index 91210a18c..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99fe4cfa49222d8d6c8a1168e42be676574dd035040b1bbe4528c32b215e2c8f -size 141312 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll deleted file mode 100644 index 3c8004057..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a89bf31e08fee2d8922b534387b5e1b73f66de4aaff8ef3267574c55dfa8b099 -size 214528 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll deleted file mode 100644 index 7f7a47794..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3f2ebe00b9ce96573985d158625c77d67fddf9ffb9c6932f88b094f01dfd68f -size 37376 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll deleted file mode 100644 index 40e3cc005..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60bbb932cfd6740d5f33eb1606f5f37c84177dc690b0621a369015eb1c039cfa -size 79360 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll deleted file mode 100644 index 963c03d04..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5a0ac8df58b6ec822693e7560d99bdf18390c653255b32c944b15b6a3444ec4 -size 1426944 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll deleted file mode 100644 index 7f7f8abc4..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c4a73a29be261f5ccb86488ffe10f0a39e89da06bd79dfb14a8fcfa9220ab0d -size 47104 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Threading.Tasks.Dataflow/4.0.0.0__b77a5c561934e089/System.Threading.Tasks.Dataflow.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Threading.Tasks.Dataflow/4.0.0.0__b77a5c561934e089/System.Threading.Tasks.Dataflow.dll deleted file mode 100644 index 4e93ddc2f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Threading.Tasks.Dataflow/4.0.0.0__b77a5c561934e089/System.Threading.Tasks.Dataflow.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0cb9c05d93e946fb60be318c84f8f160b9a629a419932ec5a7d15caaaf684f8f -size 168960 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll deleted file mode 100644 index 5a32ec0ad..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c42f2468cda39b9a52b122dcd18d0377220c396cb69b2b493ce7f8754fc1f1d -size 34304 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll deleted file mode 100644 index 98eb8573f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c3f86f31d8a6ae98982e2d3dac1fd8f25b1ebb58f1206edfb118a41e9ffd319 -size 12800 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll deleted file mode 100644 index fdca73577..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fabe15ee190b3d1c4ffaa467cd76bfeeb174c26e85f9324b30a5ffaab13d5bf -size 33792 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll deleted file mode 100644 index ef466b724..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66a107c6d94a6f4811240d1fde552d9fdac32b4a0cb985766e6c5570e1661002 -size 69120 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll deleted file mode 100644 index 7b6226fef..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0162659ab054c3969ae150f0e05368b57e45518c49ac3ceb97c5d55a6c529cf9 -size 746496 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll deleted file mode 100644 index 74f0a27c1..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53b4ec85036c686ffac982c7bdfe9991ac25fb6e316a341a5a07ce96e9513e55 -size 88064 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll deleted file mode 100644 index fc0cbcc1e..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4cc0e41b1640296696ed6d3a6940acdb0746e45549f97809ea634444eadbca72 -size 56320 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll deleted file mode 100644 index c11535639..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d3314f0fd4caab1d63c2349c30ef557c74ae3ff2719a7998873b62180261f52 -size 326144 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Mobile/4.0.0.0__b03f5f7f11d50a3a/System.Web.Mobile.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Mobile/4.0.0.0__b03f5f7f11d50a3a/System.Web.Mobile.dll deleted file mode 100644 index 2f83ca253..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Mobile/4.0.0.0__b03f5f7f11d50a3a/System.Web.Mobile.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a836e3e93e5828736088cde47e28512c5cc57a2009db9805a797516e70245b7 -size 11264 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll deleted file mode 100644 index 985161adf..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e16b3608d9d80935dfb5d7fee7c52ff010313177c336e699e197521f57a776e -size 420352 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll deleted file mode 100644 index dbcb53418..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c880284f07b77730ff6f403c404165de5bfc6cef7c114015f357f375b59200d9 -size 254976 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.RegularExpressions/4.0.0.0__b03f5f7f11d50a3a/System.Web.RegularExpressions.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.RegularExpressions/4.0.0.0__b03f5f7f11d50a3a/System.Web.RegularExpressions.dll deleted file mode 100644 index 8e64c7e1d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.RegularExpressions/4.0.0.0__b03f5f7f11d50a3a/System.Web.RegularExpressions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ac0e21ae2a3806a9b4022003e34c8fec95764b41de2b1c22053a5a4210b99f5 -size 11776 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll deleted file mode 100644 index 84a86a1ff..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f77a573dbf24e8d4c97b10ac1db02006a3a10b59fcf00f491a48d95e08f2d9a5 -size 12288 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll deleted file mode 100644 index 684f807d8..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e6957762acf08a660d95f8f53360b0f5d5f964faff1e8883a0a05d17d088181 -size 736256 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll deleted file mode 100644 index 217074c81..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3b155c702b203bd92bb000674ecbb17268c1f286d862456420a07fb06aea296 -size 39424 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll deleted file mode 100644 index 9c180770d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1935aae7b622b37295665235e0ec74a8821b3c010c20f558b3d13be42d1e77c6 -size 38400 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll deleted file mode 100644 index bc5c14264..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5cb446d04971bbd2b6e911b9751c953f95d41f2c1d86291d683caf62644c613 -size 196608 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll deleted file mode 100644 index 76076e618..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5edaae59667f870f05981d83c31ff25de85a56bcac1c3c21b2a3536439ef6930 -size 3030016 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Windows.Forms.DataVisualization/4.0.0.0__31bf3856ad364e35/System.Windows.Forms.DataVisualization.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Windows.Forms.DataVisualization/4.0.0.0__31bf3856ad364e35/System.Windows.Forms.DataVisualization.dll deleted file mode 100644 index 23fa3775b..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Windows.Forms.DataVisualization/4.0.0.0__31bf3856ad364e35/System.Windows.Forms.DataVisualization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8313360d08f86b6c805df0a3576a2dc2f5d253241ba22a868e65b09d947343bf -size 145920 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll deleted file mode 100644 index 3ff3435d4..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2cb88a463f0f8e7025b6e6988ee2e3d4001ce0b7cf5a37560e1002e325bb0eb -size 2898432 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Windows/4.0.0.0__b03f5f7f11d50a3a/System.Windows.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Windows/4.0.0.0__b03f5f7f11d50a3a/System.Windows.dll deleted file mode 100644 index a0d16168d..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Windows/4.0.0.0__b03f5f7f11d50a3a/System.Windows.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec90da3e05d35fa76a1d576a9c14e0fb95e9c5016305352607029ff080a4bc1a -size 11776 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Workflow.Activities/4.0.0.0__31bf3856ad364e35/System.Workflow.Activities.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Workflow.Activities/4.0.0.0__31bf3856ad364e35/System.Workflow.Activities.dll deleted file mode 100644 index 159d8a7e5..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Workflow.Activities/4.0.0.0__31bf3856ad364e35/System.Workflow.Activities.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ffda734f630f52c7aabf9b6dfbb1cfd43be266f5761f8df8e1ae1b9e5f7dcc1 -size 11776 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Workflow.ComponentModel/4.0.0.0__31bf3856ad364e35/System.Workflow.ComponentModel.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Workflow.ComponentModel/4.0.0.0__31bf3856ad364e35/System.Workflow.ComponentModel.dll deleted file mode 100644 index 2547b6648..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Workflow.ComponentModel/4.0.0.0__31bf3856ad364e35/System.Workflow.ComponentModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c0c81efccdd49d67ba923bb9f96e7b095ae0c5726620ab0e98ecaab65dc299b -size 11776 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Workflow.Runtime/4.0.0.0__31bf3856ad364e35/System.Workflow.Runtime.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Workflow.Runtime/4.0.0.0__31bf3856ad364e35/System.Workflow.Runtime.dll deleted file mode 100644 index 2c2b17854..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Workflow.Runtime/4.0.0.0__31bf3856ad364e35/System.Workflow.Runtime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b09dd31624af27363fab179b4b0a2dae32e698eb4284f187742a3129f1f44e9 -size 11776 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll deleted file mode 100644 index 9d4b1802f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:610a9d1d412a1785d2d04be3549e8b708977ddcfb3cd73241a659afa5039a381 -size 188928 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll deleted file mode 100644 index 07bb029db..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74e12d93dc79b18aef8241d4dbfc7a5ab4a2457ec94f087ab280809dde3cb9b0 -size 137216 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Xml.Serialization/4.0.0.0__b77a5c561934e089/System.Xml.Serialization.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Xml.Serialization/4.0.0.0__b77a5c561934e089/System.Xml.Serialization.dll deleted file mode 100644 index 71501bb82..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Xml.Serialization/4.0.0.0__b77a5c561934e089/System.Xml.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d51a04521acc7d37047913b82a2973edcaf6db96ce74f2e3fe3fa506d1b0b70 -size 11776 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll deleted file mode 100644 index 88dfe5ae7..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58196401c5c8f3323e0912b4422137612bd7eb2a3821cb53c4ac74fb7b26dda1 -size 3174912 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll deleted file mode 100644 index 997f34981..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb1d7b4b87422c0cd8f0aa847c382cbcb1bad88872f013ef164eaaf0ed76a5fc -size 2456064 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll deleted file mode 100644 index 345f59f24..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:445e763848380e33861eda9af9b2d871237c12f4799603f32b0c42abf9875a7c -size 161792 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild-frameworks/.NETFramework/v4.5/RedistList/FrameworkList.xml b/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild-frameworks/.NETFramework/v4.5/RedistList/FrameworkList.xml deleted file mode 100644 index 2741a7830..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild-frameworks/.NETFramework/v4.5/RedistList/FrameworkList.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/Imports/Microsoft.Common.props/ImportBefore/Microsoft.NuGet.ImportBefore.props b/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/Imports/Microsoft.Common.props/ImportBefore/Microsoft.NuGet.ImportBefore.props deleted file mode 100644 index 0dea8c03f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/Imports/Microsoft.Common.props/ImportBefore/Microsoft.NuGet.ImportBefore.props +++ /dev/null @@ -1,17 +0,0 @@ - - - - $(MSBuildExtensionsPath)\Microsoft\NuGet\Microsoft.NuGet.props - - - diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/Microsoft.Common.props b/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/Microsoft.Common.props deleted file mode 100644 index 6c4d33cda..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/Microsoft.Common.props +++ /dev/null @@ -1,16 +0,0 @@ - - - true - true - - - - - - true - - - - diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/Microsoft.Common.targets/ImportAfter/Microsoft.NuGet.ImportAfter.targets b/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/Microsoft.Common.targets/ImportAfter/Microsoft.NuGet.ImportAfter.targets deleted file mode 100644 index 71b454796..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/Microsoft.Common.targets/ImportAfter/Microsoft.NuGet.ImportAfter.targets +++ /dev/null @@ -1,17 +0,0 @@ - - - - $(MSBuildExtensionsPath)\Microsoft\NuGet\Microsoft.NuGet.targets - - - diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/MSBuild/Microsoft.Build.CommonTypes.xsd b/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/MSBuild/Microsoft.Build.CommonTypes.xsd deleted file mode 100644 index 148f6bf4f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/MSBuild/Microsoft.Build.CommonTypes.xsd +++ /dev/null @@ -1,1581 +0,0 @@ - - - - - - - - - - - Reference to an assembly - - - - - - - - - Relative or absolute path to the assembly (optional) - - - - - Friendly display name (optional) - - - - - Fusion name of the assembly (optional) - - - - - Whether only the version in the fusion name should be referenced (optional, boolean) - - - - - Aliases for the reference (optional) - - - - - Whether the reference should be copied to the output folder (optional, boolean) - - - - - - - - Assembly name or filename - - - - - - - - - Reference to a COM component - - - - - - - - - Friendly display name (optional) - - - - - GUID in the form {00000000-0000-0000-0000-000000000000} - - - - - Major part of the version number - - - - - Minor part of the version number - - - - - Locale ID - - - - - Wrapper tool, such as tlbimp - - - - - Is it isolated (boolean) - - - - - - - - COM component name - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Path to native reference - - - - - - - - - Reference to another project - - - - - - - - - Friendly display name (optional) - - - - - Project GUID, in the form {00000000-0000-0000-0000-000000000000} - - - - - - - - - Path to project file - - - - - - - - - Source files for compiler - - - - - - - - - - - Whether file was generated from another file (boolean) - - - - - - Notional path within project to display if the file is physically located outside of the project file's cone (optional) - - - - - - Display in user interface (optional, boolean) - - - - - - - - Semi-colon separated list of source files (wildcards are allowed) - - - - - - - - - Resources to be embedded in the generated assembly - - - - - - - - - - Name of any file generator that is run on this item - - - - - File that was created by any file generator that was run on this item - - - - - Namespace into which any file generator that is run on this item should create code - - - - - Notional path within project to display if the file is physically located outside of the project file's cone (optional) - - - - - Display in user interface (optional, boolean) - - - - - - - - - Semi-colon separated list of resource files (wildcards are allowed) - - - - - - - - - Files that are not compiled, but may be embedded or published - - - - - - - - - - Name of any file generator that is run on this item - - - - - - - Notional path within project to display if the file is physically located outside of the project file's cone (optional) - - - - - - Default, Included, Excluded, DataFile, or Prerequisite - - - - - - Display in user interface (optional, boolean) - - - - - - Copy file to output directory (optional, boolean, default false) - - - - - - - - Semi-colon separated list of content files (wildcards are allowed) - - - - - - - - - Files that should have no role in the build process - - - - - - - - - - - Name of any file generator that is run on this item - - - - - - - Notional path within project to display if the file is physically located outside of the project file's cone (optional) - - - - - Display in user interface (optional, boolean) - - - - - - - - - - - Folder on disk - - - - - Assemblies whose namespaces should be imported by the Visual Basic compiler - - - - - - Name of Web References folder to display in user interface - - - - - Represents a reference to a web service - - - - - - - - - - - - - - - - - - - URL to web service - - - - - - - - - - - - - - - Display in user interface (optional, boolean) - - - - - - - - - - - - - - - - - - - Display in user interface (optional, boolean) - - - - - - (boolean) - - - - - Default, Included, Excluded, DataFile, or Prerequisite - - - - - - - - - - - - - - - integer - - - - - Matches the expression "\d\.\d\.\d\.(\d|\*)" - - - - - Name of folder for Application Designer - - - - - - - Name of output assembly - - - - - - - - - boolean - - - - - - HomeSite, Relative, or Absolute - - - - - - boolean - - - - - - - - - boolean - - - - - - Whether to emit symbols (boolean) - - - - - none, pdbonly, or full - - - - - - - - - Whether DEBUG is defined (boolean) - - - - - Whether TRACE is defined (boolean) - - - - - - - boolean - - - - - - - - - - - - - - - - - - - - - - - - Web, Unc, or Disk - - - - - - - - - - - boolean - - - - - Matches the expression "\d\.\d\.\d\.\d" - - - - - - - - Whether standard libraries (such as mscorlib) should be referenced automatically (boolean) - - - - - Comma separated list of disabled warnings - - - - - boolean - - - - - Should compiler optimize output (boolean) - - - - - Option Compare setting (Text or Binary) - - - - - Should Option Explicit be set (On or Off) - - - - - Should Option Strict be set (On or Off) - - - - - - Path to output folder, with trailing slash - - - - - Type of output to generate (WinExe, Exe, or Library) - - - - - - - - - Command line to be run at the end of build - - - - - Command line to be run at the start of build - - - - - - - - - - - - - Semi-colon separated list of folders to search during reference resolution - - - - - - - - - - - - - - - - - - - - - - - - Type that contains the main entry point - - - - - - - - - boolean - - - - - - boolean - - - - - - Hours, Days, or Weeks - - - - - Foreground or Background - - - - - boolean - - - - - boolean - - - - - - - - - integer between 0 and 4 inclusive - - - - - Comma separated list of warning numbers to treat as errors - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/MSBuild/Microsoft.Build.Core.xsd b/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/MSBuild/Microsoft.Build.Core.xsd deleted file mode 100644 index c8f2aacb1..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/MSBuild/Microsoft.Build.Core.xsd +++ /dev/null @@ -1,390 +0,0 @@ - - - - - - - - - - - - - - Optional semi-colon separated list of one or more targets that will be built if no targets are otherwise specified - - - - - - - - - - - - - Logs an Error event - - - - - Logs a Warning event - - - - - - - - - - - - - - - - Logs an Error event - - - - - Logs a Warning event - - - - - - - - - - - - - - - - - - - - Groups tasks into a section of the build process - - - - - - - - - - - Name of the target - - - - - Optional semi-colon separated list of targets that should be run before this target - - - - - Optional semi-colon separated list of files that form inputs into this target. Their timestamps will be compared with the timestamps of files in Outputs to determine whether the Target is up to date - - - - - Optional semi-colon separated list of files that form outputs into this target. Their timestamps will be compared with the timestamps of files in Inputs to determine whether the Target is up to date - - - - - Optional expression evaluated to determine whether the Target and the targets it depends on should be run - - - - - - - Groups property definitions - - - - - - - Optional expression evaluated to determine whether the PropertyGroup should be used - - - - - - - Groups item list definitions - - - - - - - Optional expression evaluated to determine whether the ItemGroup should be used - - - - - - - Groups When and Otherwise elements - - - - - - - - - - Groups PropertyGroup and/or ItemGroup elements - - - - - - - - - - - Optional expression evaluated to determine whether the child PropertyGroups and/or ItemGroups should be used - - - - - - - Groups PropertyGroup and/or ItemGroup elements that are used if no Conditions on sibling When elements evaluate to true - - - - - - - - - - - - - Specifies targets to execute in the event of a recoverable error - - - - Optional expression evaluated to determine whether the targets should be executed - - - - - Semi-colon separated list of targets to execute - - - - - - - Logs an informational Message event, with an optional Importance - - - - Optional expression evaluated to determine whether the Message should be logged - - - - - Optional priority level. Allowed values are Low, Normal (default), and High - - - - - Text to log - - - - - - - - Optional expression evaluated to determine whether the text should be logged - - - - - Text to log - - - - - - - Declares where to load a task that will be used in the project - - - - Optional expression evaluated to determine whether the declaration should be evaluated - - - - - Optional name of assembly containing the task. Either AssemblyName or AssemblyFile must be used - - - - - Optional path to assembly containing the task. Either AssemblyName or AssemblyFile must be used - - - - - Name of task class in the assembly - - - - - - - Declares that the contents of another project file should be inserted at this location - - - - Optional expression evaluated to determine whether the import should occur - - - - - Project file to import - - - - - - - Optional section used by MSBuild hosts, that may contain arbitrary XML content that is ignored by MSBuild itself - - - - - - - - - - - - - Optional expression evaluated to determine whether the items should be evaluated - - - - - Semi-colon separated list of files (wildcards are allowed) or other item names to include in this item list - - - - - Semi-colon separated list of files (wildcards are allowed) or other item names to exclude from the Include list - - - - - - - - - - - - - - - - - - - - - - - - - Optional expression evaluated to determine whether the property should be evaluated - - - - - - - - - - - - - - Optional expression evaluated to determine whether the property should be evaluated - - - - - - - - - - - Optional element specifying a specific task output to be gathered - - - - - Task parameter to gather. Matches the name of a .NET Property on the task class that has an [Output] attribute - - - - - Optional name of an item list to put the gathered outputs into. Either ItemName or PropertyName must be specified - - - - - Optional name of a property to put the gathered output into. Either PropertyName or ItemName must be specified - - - - - Optional expression evaluated to determine whether the output should be gathered - - - - - - - - Optional expression evaluated to determine whether the task should be executed - - - - - Optional boolean indicating whether a recoverable task error should be ignored. Default false - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Engine.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Engine.dll deleted file mode 100644 index 1da4ca5f3..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Engine.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fff94779f14b8c572827d5f29875468845f6bec02819ad27469285b36ae94148 -size 236032 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Framework.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Framework.dll deleted file mode 100644 index d2264a892..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Framework.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:207a2c1a8d325c779c835f69958b4f9949c3ac7d96ce88042630db628ac411c3 -size 32768 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Tasks.Core.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Tasks.Core.dll deleted file mode 100644 index b289db861..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Tasks.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:defb193bab8fe89d4c9db2323832bb0c72ed73911fefc31861614670d4f1561c -size 175104 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Utilities.Core.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Utilities.Core.dll deleted file mode 100644 index 35045a234..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.Utilities.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:866441dda8e12c27ec285f4fa313d72065e73d467dbf91aa31bdf37e1cf7ccb9 -size 56320 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.dll deleted file mode 100644 index 968c3488f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb20011c56c4b60e2027199a4740123d4ad528486fe778145e22e37c753bf47d -size 280064 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.xsd b/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.xsd deleted file mode 100644 index e88f00f0f..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Build.xsd +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.CSharp.targets b/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.CSharp.targets deleted file mode 100644 index 2cd20a10c..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.CSharp.targets +++ /dev/null @@ -1,142 +0,0 @@ - - - .cs - C# - - - - false - - - - - - - - $(MSBuildAllProjects);$(MSBuildToolsPath)\Microsoft.CSharp.targets - - - - true - - - - - - - - - - <_ExplicitReference Include="@(_TargetFrameworkDirectories->'%(FullPath)\mscorlib.dll')" Condition="Exists('%(FullPath)\mscorlib.dll')"> - false - - - - <_ExplicitMSCorlibPath>$([Microsoft.Build.Utilities.ToolLocationHelper]::GetPathToStandardLibraries ('$(TargetFrameworkIdentifier)', '$(TargetFrameworkVersion)', '$(TargetFrameworkProfile)'))\mscorlib.dll - - - <_ExplicitReference Include="@(_TargetFrameworkDirectories->'%(FullPath)\mscorlib.dll')" Condition="Exists('%(FullPath)\mscorlib.dll')"> - false - - - - <_ExplicitReference Include="$(_ExplicitMSCorlibPath)" Condition="Exists('$(_ExplicitMSCorlibPath)')"> - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(ResolveAssemblyReferencesDependsOn);_AddCorlibReference - - - - -// <autogenerated /> -[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute("$(TargetFrameworkMoniker)", FrameworkDisplayName = "$(TargetFrameworkMonikerDisplayName)")] - - - - diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Common.targets b/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Common.targets deleted file mode 100644 index 43e416188..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Common.targets +++ /dev/null @@ -1,961 +0,0 @@ - - - - - true - true - - - - - - - - Exe - .exe - .exe - .dll - .netmodule - - - - $(MSBuildProjectDirectory)\ - - - - - 14.0 - - - - $(MSBuildProjectName) - $(OutputPath)\ - bin\Debug\ - - .NETFramework - v4.0 - - $(TargetFrameworkIdentifier),Version=$(TargetFrameworkVersion),Profile=$(TargetFrameworkProfile) - $(TargetFrameworkIdentifier),Version=$(TargetFrameworkVersion) - - - - $(OutputPath) - $(OutDir)\ - - <_OriginalConfiguration>$(Configuration) - Debug - $(Configuration) - - <_OriginalPlatform>$(Platform) - AnyCPU - $(Platform) - - - - - true - System.Core;$(AdditionalExplicitAssemblyReferences) - - - - true - - - - obj\ - $(BaseIntermediateOutputPath)\ - $(MSBuildProjectFile).FilesWrittenAbsolute.txt - - - - $(BaseIntermediateOutputPath)$(Configuration)\ - $(BaseIntermediateOutputPath)$(PlatformName)\$(Configuration)\ - - - - $(IntermediateOutputPath)\ - - - - - - - <_OutDirItem Include="$(OutDir)"/> - - - - $(AssemblyName) - $(TargetName)$(TargetExt) - @(_OutDirItem->'%(FullPath)') - @(_OutDirItem->'%(FullPath)\$(TargetFileName)') - $(MSBuildAllProjects);$(MSBuildProjectFullPath);$(MSBuildToolsPath)\Microsoft.Common.targets - $(AssemblyOriginatorKeyFile) - true - - - - - - - - - - - - - AssignLinkMetadata - - - - - - - - - - - - - - - - - - - - - - - - - <_EmbeddedResourceWithLinkAssigned Remove="@(_EmbeddedResourceWithLinkAssigned)" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <_TargetFrameworkDirectories Include="$(_TargetFrameworkDirectories);$(TargetFrameworkDirectory)" KeepDuplicates="false" /> - - - @(_TargetFrameworkDirectories) - - - - - - <_DesignTimeFacadeAssemblies Include="%(DesignTimeFacadeDirectories.Identity)\*.dll"/> - - - - $(TargetFrameworkDirectory);@(DesignTimeFacadeDirectories) - - - - - - - .exe; - .dll - - - - .exe.mdb; - .dll.mdb; - .pdb; - .xml - - - - {CandidateAssemblyFiles}; - $(ReferencePath); - @(AdditionalReferencePath); - {HintPathFromItem}; - {TargetFrameworkDirectory}; - {PkgConfig}; - {GAC}; - {RawFileName}; - $(OutDir) - - - - BeforeResolveReferences; - ResolveProjectReferences; - ResolveAssemblyReferences; - AfterResolveReferences - - - - GetFrameworkPaths; - GetReferenceAssemblyPaths; - PrepareForBuild - - - - - $(IntermediateOutputPath)$(TargetFrameworkMoniker).AssemblyAttribute$(DefaultLanguageSourceExtension) - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BuildOnlySettings; - BeforeBuild; - CoreBuild; - AfterBuild - - - - - - - - - - - - PrepareForBuild; - GetFrameworkPaths; - GetReferenceAssemblyPaths; - PreBuildEvent; - ResolveReferences; - CopyFilesMarkedCopyLocal; - PrepareResources; - Compile; - PrepareForRun; - DeployOutputFiles; - _RecordCleanFile; - PostBuildEvent - - - - - - - - - - - - - ResolveReferences; - GenerateTargetFrameworkMonikerAttribute; - BeforeCompile; - _TimestampBeforeCompile; - CoreCompile; - _TimestampAfterCompile; - AfterCompile - - - - - - - - - - - DeployOutputFiles - - - - - - - AssignTargetPaths; - SplitResourcesByCulture; - CreateManifestResourceNames; - CopyNonResxEmbeddedResources; - GenerateResources; - GenerateSatelliteAssemblies; - CompileLicxFiles - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BeforeRebuild; - Clean; - $(MSBuildProjectDefaultTargets); - AfterRebuild; - - - - BeforeRebuild; - Clean; - Build; - AfterRebuild; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BeforeClean; - CleanReferencedProjects; - CoreClean; - AfterClean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - $(ResolveReferencesDependsOn); - ImplicitlyExpandDesignTimeFacades - - - - $(ImplicitlyExpandDesignTimeFacadesDependsOn); - GetReferenceAssemblyPaths - - - - - - - - <_HasReferenceToSystemRuntime Condition="'$(DependsOnSystemRuntime)' == 'true' or '%(_ResolvedProjectReferencePaths.TargetPlatformIdentifier)' == 'Portable'">true - - - - - - - false - false - ImplicitlyExpandDesignTimeFacades - - <_ResolveAssemblyReferenceResolvedFiles Include="@(ReferencePath)" Condition="'%(ReferencePath.ResolvedFrom)' == 'ImplicitlyExpandDesignTimeFacades'" /> - - - - - - - - diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Common.tasks b/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Common.tasks deleted file mode 100644 index 54d9caab7..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.Common.tasks +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.VisualBasic.targets b/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.VisualBasic.targets deleted file mode 100644 index cf35f8251..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Microsoft.VisualBasic.targets +++ /dev/null @@ -1,120 +0,0 @@ - - - .vb - VB - - - - - - - - CONFIG="$(Configuration)" - $(FinalDefineConstants),DEBUG=-1 - $(FinalDefineConstants),TRACE=-1 - $(FinalDefineConstants),_MyType="$(MyType)" - $(FinalDefineConstants),PLATFORM="$(Platform)" - $(FinalDefineConstants),PLATFORM="AnyCPU" - $(FinalDefineConstants),$(DefineConstants) - - <_NoWarnings Condition=" '$(WarningLevel)' == '0' ">true - <_NoWarnings Condition=" '$(WarningLevel)' == '1' ">false - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - vbnc.exe - - - diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Mono.XBuild.Tasks.dll b/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Mono.XBuild.Tasks.dll deleted file mode 100644 index 10ba057b7..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/Mono.XBuild.Tasks.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:429c79e7de73424cb957a8ab7ad802c4ec4190c53ade5e3d779f5e52db197715 -size 36864 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/xbuild.exe b/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/xbuild.exe deleted file mode 100644 index ddcbdf1e3..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/xbuild.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53c130a08b01a8d4ac99eea796fa71f4029ff26f2e3e394f27f019f2bbe96a7e -size 62976 diff --git a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/xbuild.rsp b/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/xbuild.rsp deleted file mode 100644 index 9b9ce7087..000000000 --- a/Source/Platforms/Editor/Windows/Mono/lib/mono/xbuild/14.0/bin/xbuild.rsp +++ /dev/null @@ -1,3 +0,0 @@ -# xbuild command line options specified here will be used -# by xbuild on every build, unless /noautoresponse is passed -# on the command line. diff --git a/Source/Platforms/Linux/Binaries/Mono/etc/mono/2.0/Browsers/Compat.browser b/Source/Platforms/Linux/Binaries/Mono/etc/mono/2.0/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/etc/mono/2.0/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Linux/Binaries/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Linux/Binaries/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Linux/Binaries/Mono/etc/mono/2.0/machine.config b/Source/Platforms/Linux/Binaries/Mono/etc/mono/2.0/machine.config deleted file mode 100644 index 2577c81dd..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/etc/mono/2.0/machine.config +++ /dev/null @@ -1,280 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
- - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Linux/Binaries/Mono/etc/mono/2.0/settings.map b/Source/Platforms/Linux/Binaries/Mono/etc/mono/2.0/settings.map deleted file mode 100644 index 9a52ccc02..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/etc/mono/2.0/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Linux/Binaries/Mono/etc/mono/2.0/web.config b/Source/Platforms/Linux/Binaries/Mono/etc/mono/2.0/web.config deleted file mode 100644 index e1428f8c3..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/etc/mono/2.0/web.config +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.0/Browsers/Compat.browser b/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.0/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.0/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.0/machine.config b/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.0/machine.config deleted file mode 100644 index f3b71c43c..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.0/machine.config +++ /dev/null @@ -1,307 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - - -
- -
-
-
-
- - - - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
-
-
-
- - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.0/settings.map b/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.0/settings.map deleted file mode 100644 index 4c53aca67..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.0/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.0/web.config b/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.0/web.config deleted file mode 100644 index 2a7dfd2ed..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.0/web.config +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.5/Browsers/Compat.browser b/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.5/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.5/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.5/machine.config b/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.5/machine.config deleted file mode 100644 index 455709536..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.5/machine.config +++ /dev/null @@ -1,310 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
- - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - - -
- -
-
-
-
- - - - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
-
-
-
- - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.5/settings.map b/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.5/settings.map deleted file mode 100644 index 4c53aca67..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.5/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.5/web.config b/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.5/web.config deleted file mode 100644 index 324c529f0..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/etc/mono/4.5/web.config +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Linux/Binaries/Mono/etc/mono/browscap.ini b/Source/Platforms/Linux/Binaries/Mono/etc/mono/browscap.ini deleted file mode 100644 index 1267e1deb..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/etc/mono/browscap.ini +++ /dev/null @@ -1,16979 +0,0 @@ -;;; Provided courtesy of http://browsers.garykeith.com -;;; Created on Wednesday, June 17, 2009 at 6:30 AM GMT - -[GJK_Browscap_Version] -Version=4476 -Released=Wed, 17 Jun 2009 06:30:21 -0000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DefaultProperties - -[DefaultProperties] -Browser=DefaultProperties -Version=0 -MajorVer=0 -MinorVer=0 -Platform=unknown -Alpha=false -Beta=false -Win16=false -Win32=false -Win64=false -Frames=false -IFrames=false -Tables=false -Cookies=false -BackgroundSounds=false -CDF=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -isBanned=false -isMobileDevice=false -isSyndicationReader=false -Crawler=false -CssVersion=0 -supportsCSS=false -AOL=false -aolVersion=0 -ECMAScriptVersion=0.0 -W3CDOMVersion=0.0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ask - -[Ask] -Parent=DefaultProperties -Browser=Ask -Frames=true -Tables=true -Crawler=true - -[Mozilla/?.0 (compatible; Ask Jeeves/Teoma*)] -Parent=Ask -Browser=Teoma - -[Mozilla/2.0 (compatible; Ask Jeeves)] -Parent=Ask -Browser=AskJeeves - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Baidu - -[Baidu] -Parent=DefaultProperties -Browser=Baidu -Frames=true -Tables=true -Crawler=true - -[BaiduImageSpider*] -Parent=Baidu -Browser=BaiduImageSpider - -[Baiduspider*] -Parent=Baidu -Browser=BaiDu - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google - -[Google] -Parent=DefaultProperties -Browser=Google -Frames=true -IFrames=true -Tables=true -JavaScript=true -Crawler=true - -[* (compatible; Googlebot-Mobile/2.1; *http://www.google.com/bot.html)] -Parent=Google -Browser=Googlebot-Mobile -Frames=false -IFrames=false -Tables=false - -[*Google Wireless Transcoder*] -Parent=Google -Browser=Google Wireless Transcoder - -[AdsBot-Google (?http://www.google.com/adsbot.html)] -Parent=Google -Browser=AdsBot-Google - -[Feedfetcher-Google-iGoogleGadgets;*] -Parent=Google -Browser=iGoogleGadgets -isBanned=true -isSyndicationReader=true - -[Feedfetcher-Google;*] -Parent=Google -Browser=Feedfetcher-Google -isBanned=true -isSyndicationReader=true - -[Google OpenSocial agent (http://www.google.com/feedfetcher.html)] -Parent=Google -Browser=Google OpenSocial - -[Google-Site-Verification/1.0] -Parent=Google -Browser=Google-Site-Verification - -[Google-Sitemaps/*] -Parent=Google -Browser=Google-Sitemaps - -[Googlebot-Image/*] -Parent=Google -Browser=Googlebot-Image -CDF=true - -[googlebot-urlconsole] -Parent=Google -Browser=googlebot-urlconsole - -[Googlebot-Video/1.0] -Parent=Google -Browser=Google-Video - -[Googlebot/2.1 (?http://www.google.com/bot.html)] -Parent=Google -Browser=Googlebot - -[Googlebot/2.1 (?http://www.googlebot.com/bot.html)] -Parent=Google -Browser=Googlebot - -[Googlebot/Test*] -Parent=Google -Browser=Googlebot/Test - -[gsa-crawler*] -Parent=Google -Browser=Google Search Appliance -isBanned=true - -[Mediapartners-Google*] -Parent=Google -Browser=Mediapartners-Google - -[Mozilla/4.0 (compatible; Google Desktop)] -Parent=Google -Browser=Google Desktop - -[Mozilla/4.0 (compatible; GoogleToolbar*)] -Parent=Google -Browser=Google Toolbar -isBanned=true - -[Mozilla/5.0 (compatible; Google Keyword Tool;*)] -Parent=Google -Browser=Google Keyword Tool - -[Mozilla/5.0 (compatible; Googlebot/2.1; ?http://www.google.com/bot.html)] -Parent=Google -Browser=Google Webmaster Tools - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Inktomi - -[Inktomi] -Parent=DefaultProperties -Browser=Inktomi -Frames=true -Tables=true -Crawler=true - -[* (compatible;YahooSeeker/M1A1-R2D2; *)] -Parent=Inktomi -Browser=YahooSeeker-Mobile -Frames=false -Tables=false - -[Mozilla/4.0] -Parent=Inktomi - -[Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)] -Parent=Inktomi -Win32=true - -[Mozilla/4.0 (compatible; Yahoo Japan; for robot study; kasugiya)] -Parent=Inktomi -Browser=Yahoo! RobotStudy -isBanned=true - -[Mozilla/5.0 (compatible; BMC/1.0 (Y!J-AGENT))] -Parent=Inktomi -Browser=Y!J-AGENT/BMC - -[Mozilla/5.0 (compatible; BMF/1.0 (Y!J-AGENT))] -Parent=Inktomi -Browser=Y!J-AGENT/BMF - -[Mozilla/5.0 (compatible; BMI/1.0 (Y!J-AGENT; 1.0))] -Parent=Inktomi -Browser=Y!J-AGENT/BMI - -[Mozilla/5.0 (compatible; Yahoo! DE Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Directory Engine - -[Mozilla/5.0 (compatible; Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html)] -Parent=Inktomi -Browser=Yahoo! Slurp China - -[Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Slurp -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Slurp - -[Mozilla/5.0 (compatible; Yahoo! Verifier/1.1)] -Parent=Inktomi -Browser=Yahoo! Verifier -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Slurp/cat; slurp@inktomi.com; http://www.inktomi.com/slurp.html)] -Parent=Inktomi -Browser=Slurp/cat - -[Mozilla/5.0 (Slurp/si; slurp@inktomi.com; http://www.inktomi.com/slurp.html)] -Parent=Inktomi - -[Mozilla/5.0 (Yahoo-MMCrawler/4.0; mailto:vertical-crawl-support@yahoo-inc.com)] -Parent=Inktomi -Browser=Yahoo-MMCrawler -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Scooter/*] -Parent=Inktomi -Browser=Scooter - -[Scooter/3.3Y!CrawlX] -Parent=Inktomi -Browser=Scooter/3.3Y!CrawlX -Version=3.3 -MajorVer=3 -MinorVer=3 - -[slurp] -Parent=Inktomi -Browser=slurp - -[Y!J-BSC/1.0*] -Parent=Inktomi -Browser=Y!J-BSC -Version=1.0 -MajorVer=1 -MinorVer=0 -isBanned=true - -[Y!J-SRD/1.0] -Parent=Inktomi -Browser=Y!J-SRD -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Yahoo Mindset] -Parent=Inktomi -Browser=Yahoo Mindset - -[Yahoo Pipes*] -Parent=Inktomi -Browser=Yahoo Pipes - -[Yahoo! Mindset] -Parent=Inktomi -Browser=Yahoo! Mindset - -[Yahoo! Slurp/Site Explorer] -Parent=Inktomi -Browser=Yahoo! Site Explorer - -[Yahoo-Blogs/*] -Parent=Inktomi -Browser=Yahoo-Blogs - -[Yahoo-MMAudVid*] -Parent=Inktomi -Browser=Yahoo-MMAudVid - -[Yahoo-MMCrawler*] -Parent=Inktomi -Browser=Yahoo-MMCrawler -isBanned=true - -[YahooFeedSeeker*] -Parent=Inktomi -Browser=YahooFeedSeeker -isSyndicationReader=true -Crawler=false - -[YahooSeeker/*] -Parent=Inktomi -Browser=YahooSeeker -isMobileDevice=true - -[YahooSeeker/CafeKelsa (compatible; Konqueror/3.2; FreeBSD*) (KHTML, like Gecko)] -Parent=Inktomi -Browser=YahooSeeker/CafeKelsa - -[YahooSeeker/CafeKelsa-dev (compatible; Konqueror/3.2; FreeBSD*) (KHTML, like Gecko)] -Parent=Inktomi - -[YahooVideoSearch*] -Parent=Inktomi -Browser=YahooVideoSearch - -[YahooYSMcm*] -Parent=Inktomi -Browser=YahooYSMcm - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN - -[MSN] -Parent=DefaultProperties -Browser=MSN -Frames=true -Tables=true -Crawler=true - -[adidxbot/1.1 (?http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=adidxbot - -[librabot/1.0 (*)] -Parent=MSN -Browser=librabot - -[llssbot/1.0] -Parent=MSN -Browser=llssbot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MSMOBOT/1.1*] -Parent=MSN -Browser=msnbot-mobile -Version=1.1 -MajorVer=1 -MinorVer=1 - -[MSNBot-Academic/1.0*] -Parent=MSN -Browser=MSNBot-Academic -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot-media/1.0*] -Parent=MSN -Browser=msnbot-media -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot-media/1.1*] -Parent=MSN -Browser=msnbot-media -Version=1.1 -MajorVer=1 -MinorVer=1 - -[MSNBot-News/1.0*] -Parent=MSN -Browser=MSNBot-News -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MSNBot-NewsBlogs/1.0*] -Parent=MSN -Browser=MSNBot-NewsBlogs -Version=1 -MajorVer=1 -MinorVer=0 - -[msnbot-products] -Parent=MSN -Browser=msnbot-products - -[msnbot-webmaster/1.0 (*http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=msnbot-webmaster tools - -[msnbot/1.0*] -Parent=MSN -Browser=msnbot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot/1.1*] -Parent=MSN -Browser=msnbot -Version=1.1 -MajorVer=1 -MinorVer=1 - -[msnbot/2.0b*] -Parent=MSN -Version=2.0 -MajorVer=2 -MinorVer=0 -Beta=true - -[MSR-ISRCCrawler] -Parent=MSN -Browser=MSR-ISRCCrawler - -[renlifangbot/1.0 (?http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=renlifangbot - -[T-Mobile Dash Mozilla/4.0 (*) MSNBOT-MOBILE/1.1 (*)] -Parent=MSN -Browser=msnbot-mobile - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yahoo - -[Yahoo] -Parent=DefaultProperties -Browser=Yahoo -Frames=true -Tables=true -Crawler=true - -[Mozilla/4.0 (compatible; Y!J; for robot study*)] -Parent=Yahoo -Browser=Y!J - -[Mozilla/5.0 (Yahoo-Test/4.0*)] -Parent=Yahoo -Browser=Yahoo-Test -Version=4.0 -MajorVer=4 -MinorVer=0 - -[mp3Spider cn-search-devel at yahoo-inc dot com] -Parent=Yahoo -Browser=Yahoo! Media -isBanned=true - -[My Browser] -Parent=Yahoo -Browser=Yahoo! My Browser - -[Y!OASIS/*] -Parent=Yahoo -Browser=Y!OASIS -isBanned=true - -[YahooYSMcm/2.0.0] -Parent=Yahoo -Browser=YahooYSMcm -Version=2.0 -MajorVer=2 -MinorVer=0 -isBanned=true - -[YRL_ODP_CRAWLER] -Parent=Yahoo -Browser=YRL_ODP_CRAWLER -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yandex - -[Yandex] -Parent=DefaultProperties -Browser=Yandex -Frames=true -IFrames=true -Tables=true -Cookies=true -Crawler=true - -[Mozilla/4.0 (compatible; MSIE 5.0; YANDEX)] -Parent=Yandex - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9) Gecko VisualParser/3.0] -Parent=Yandex -Browser=VisualParser -isBanned=true - -[YaDirectBot/*] -Parent=Yandex -Browser=YaDirectBot - -[Yandex/*] -Parent=Yandex - -[YandexBlog/*] -Parent=Yandex -Browser=YandexBlog -isSyndicationReader=true - -[YandexSomething/*] -Parent=Yandex -Browser=YandexSomething -isSyndicationReader=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Best of the Web - -[Best of the Web] -Parent=DefaultProperties -Browser=Best of the Web -Frames=true -Tables=true - -[Mozilla/4.0 (compatible; BOTW Feed Grabber; *http://botw.org)] -Parent=Best of the Web -Browser=BOTW Feed Grabber -isSyndicationReader=true -Crawler=false - -[Mozilla/4.0 (compatible; BOTW Spider; *http://botw.org)] -Parent=Best of the Web -Browser=BOTW Spider -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Boitho - -[Boitho] -Parent=DefaultProperties -Browser=Boitho -Frames=true -Tables=true -Crawler=true - -[boitho.com-dc/*] -Parent=Boitho -Browser=boitho.com-dc - -[boitho.com-robot/*] -Parent=Boitho -Browser=boitho.com-robot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Convera - -[Convera] -Parent=DefaultProperties -Browser=Convera -Frames=true -Tables=true -Crawler=true - -[ConveraCrawler/*] -Parent=Convera -Browser=ConveraCrawler - -[ConveraMultiMediaCrawler/0.1*] -Parent=Convera -Browser=ConveraMultiMediaCrawler -Version=0.1 -MajorVer=0 -MinorVer=1 - -[CrawlConvera*] -Parent=Convera -Browser=CrawlConvera - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DotBot - -[DotBot] -Parent=DefaultProperties -Browser=DotBot -Frames=true -Tables=true -isBanned=true -Crawler=true - -[DotBot/* (http://www.dotnetdotcom.org/*)] -Parent=DotBot - -[Mozilla/5.0 (compatible; DotBot/*; http://www.dotnetdotcom.org/*)] -Parent=DotBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Entireweb - -[Entireweb] -Parent=DefaultProperties -Browser=Entireweb -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[Mozilla/4.0 (compatible; SpeedySpider; www.entireweb.com)] -Parent=Entireweb - -[Speedy Spider (*Beta/*)] -Parent=Entireweb - -[Speedy?Spider?(http://www.entireweb.com*)] -Parent=Entireweb - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Envolk - -[Envolk] -Parent=DefaultProperties -Browser=Envolk -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[envolk/* (?http://www.envolk.com/envolk*)] -Parent=Envolk - -[envolk?ITS?spider/* (?http://www.envolk.com/envolk*)] -Parent=Envolk - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Exalead - -[Exalead] -Parent=DefaultProperties -Browser=Exalead -Frames=true -Tables=true -isBanned=true -Crawler=true - -[Exabot-Images/1.0] -Parent=Exalead -Browser=Exabot-Images -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Exabot-Test/*] -Parent=Exalead -Browser=Exabot-Test - -[Exabot/2.0] -Parent=Exalead -Browser=Exabot - -[Exabot/3.0] -Parent=Exalead -Browser=Exabot -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Liberate - -[Exalead NG/*] -Parent=Exalead -Browser=Exalead NG -isBanned=true - -[Mozilla/5.0 (compatible; Exabot-Images/3.0;*)] -Parent=Exalead -Browser=Exabot-Images - -[Mozilla/5.0 (compatible; Exabot/3.0 (BiggerBetter/tests);*)] -Parent=Exalead -Browser=Exabot/BiggerBetter/tests - -[Mozilla/5.0 (compatible; Exabot/3.0;*)] -Parent=Exalead -Browser=Exabot -isBanned=false - -[Mozilla/5.0 (compatible; NGBot/*)] -Parent=Exalead - -[ng/*] -Parent=Exalead -Browser=Exalead Previewer -Version=1.0 -MajorVer=1 -MinorVer=0 -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fast/AllTheWeb - -[Fast/AllTheWeb] -Parent=DefaultProperties -Browser=Fast/AllTheWeb -Alpha=true -Beta=true -Win16=true -Win32=true -Win64=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -isBanned=true -isMobileDevice=true -isSyndicationReader=true -Crawler=true - -[*FAST Enterprise Crawler*] -Parent=Fast/AllTheWeb -Browser=FAST Enterprise Crawler - -[FAST Data Search Document Retriever/4.0*] -Parent=Fast/AllTheWeb -Browser=FAST Data Search Document Retriever - -[FAST MetaWeb Crawler (helpdesk at fastsearch dot com)] -Parent=Fast/AllTheWeb -Browser=FAST MetaWeb Crawler - -[Fast PartnerSite Crawler*] -Parent=Fast/AllTheWeb -Browser=FAST PartnerSite - -[FAST-WebCrawler/*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler - -[FAST-WebCrawler/*/FirstPage*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/FirstPage - -[FAST-WebCrawler/*/Fresh*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/Fresh - -[FAST-WebCrawler/*/PartnerSite*] -Parent=Fast/AllTheWeb -Browser=FAST PartnerSite - -[FAST-WebCrawler/*?Multimedia*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/Multimedia - -[FastSearch Web Crawler for*] -Parent=Fast/AllTheWeb -Browser=FastSearch Web Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Gigabot - -[Gigabot] -Parent=DefaultProperties -Browser=Gigabot -Frames=true -IFrames=true -Tables=true -Crawler=true - -[Gigabot*] -Parent=Gigabot - -[GigabotSiteSearch/*] -Parent=Gigabot -Browser=GigabotSiteSearch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ilse - -[Ilse] -Parent=DefaultProperties -Browser=Ilse -Frames=true -Tables=true -Crawler=true - -[IlseBot/*] -Parent=Ilse - -[INGRID/?.0*] -Parent=Ilse -Browser=Ilse - -[Mozilla/3.0 (INGRID/*] -Parent=Ilse -Browser=Ilse - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iVia Project - -[iVia Project] -Parent=DefaultProperties -Browser=iVia Project -Frames=true -IFrames=true -Tables=true -Crawler=true - -[DataFountains/DMOZ Downloader*] -Parent=iVia Project -Browser=DataFountains/DMOZ Downloader -isBanned=true - -[DataFountains/DMOZ Feature Vector Corpus Creator*] -Parent=iVia Project -Browser=DataFountains/DMOZ Feature Vector Corpus - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Jayde Online - -[Jayde Online] -Parent=DefaultProperties -Browser=Jayde Online -Frames=true -Tables=true -Crawler=true - -[ExactSeek Crawler/*] -Parent=Jayde Online -Browser=ExactSeek Crawler - -[exactseek-pagereaper-* (crawler@exactseek.com)] -Parent=Jayde Online -Browser=exactseek-pagereaper -isBanned=true - -[exactseek.com] -Parent=Jayde Online -Browser=exactseek.com - -[Jayde Crawler*] -Parent=Jayde Online -Browser=Jayde Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycos - -[Lycos] -Parent=DefaultProperties -Browser=Lycos -Frames=true -Tables=true -Crawler=true - -[Lycos*] -Parent=Lycos -Browser=Lycos - -[Lycos-Proxy] -Parent=Lycos -Browser=Lycos-Proxy - -[Lycos-Spider_(modspider)] -Parent=Lycos -Browser=Lycos-Spider_(modspider) - -[Lycos-Spider_(T-Rex)] -Parent=Lycos -Browser=Lycos-Spider_(T-Rex) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Naver - -[Naver] -Parent=DefaultProperties -Browser=Naver -isBanned=true -Crawler=true - -[Cowbot-* (NHN Corp*naver.com)] -Parent=Naver -Browser=Naver Cowbot - -[Mozilla/4.0 (compatible; NaverBot/*; *)] -Parent=Naver - -[Mozilla/4.0 (compatible; NaverBot/*; nhnbot@naver.com)] -Parent=Naver -Browser=Naver NaverBot - -[NaverBot-* (NHN Corp*naver.com)] -Parent=Naver -Browser=Naver NHN Corp - -[Yeti/*] -Parent=Naver -Browser=Yeti - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Snap - -[Snap] -Parent=DefaultProperties -Browser=Snap -isBanned=true -Crawler=true - -[Mozilla/5.0 (SnapPreviewBot) Gecko/* Firefox/*] -Parent=Snap - -[Snapbot/*] -Parent=Snap - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sogou - -[Sogou] -Parent=DefaultProperties -Browser=Sogou -Frames=true -Tables=true -isBanned=true -Crawler=true - -[shaboyi spider] -Parent=Sogou -Browser=Sogou/Shaboyi Spider - -[Sogou develop spider/*] -Parent=Sogou -Browser=Sogou Develop Spider - -[Sogou head spider*] -Parent=Sogou -Browser=Sogou/HEAD Spider - -[sogou js robot(*)] -Parent=Sogou - -[Sogou Orion spider/*] -Parent=Sogou -Browser=Sogou Orion spider - -[Sogou Pic Agent] -Parent=Sogou -Browser=Sogou/Image Crawler - -[Sogou Pic Spider] -Parent=Sogou -Browser=Sogou Pic Spider - -[Sogou Push Spider/*] -Parent=Sogou -Browser=Sogou Push Spider - -[sogou spider] -Parent=Sogou -Browser=Sogou/Spider - -[sogou web spider*] -Parent=Sogou -Browser=sogou web spider - -[Sogou-Test-Spider/*] -Parent=Sogou -Browser=Sogou-Test-Spider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; YodaoBot - -[YodaoBot] -Parent=DefaultProperties -Browser=YodaoBot -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[Mozilla/5.0 (compatible; YodaoBot/1.*)] -Parent=YodaoBot - -[Mozilla/5.0 (compatible;YodaoBot-Image/1.*)] -Parent=YodaoBot -Browser=YodaoBot-Image - -[WAP_Browser/5.0 (compatible; YodaoBot/1.*)] -Parent=YodaoBot - -[YodaoBot/1.* (*)] -Parent=YodaoBot - -[Best Whois (http://www.bestwhois.net/)] -Parent=DNS Tools -Browser=Best Whois - -[DNSGroup/*] -Parent=DNS Tools -Browser=DNS Group Crawler - -[NG-Search/*] -Parent=Exalead -Browser=NG-SearchBot - -[TouchStone] -Parent=Feeds Syndicators -Browser=TouchStone -isSyndicationReader=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; General Crawlers - -[General Crawlers] -Parent=DefaultProperties -Browser=General Crawlers -Crawler=true - -[A .NET Web Crawler] -Parent=General Crawlers -isBanned=true - -[BabalooSpider/1.*] -Parent=General Crawlers -Browser=BabalooSpider - -[BilgiBot/*] -Parent=General Crawlers -Browser=BilgiBot -isBanned=true - -[bot/* (bot; *bot@bot.bot)] -Parent=General Crawlers -Browser=bot -isBanned=true - -[CyberPatrol*] -Parent=General Crawlers -Browser=CyberPatrol -isBanned=true - -[Cynthia 1.0] -Parent=General Crawlers -Browser=Cynthia -Version=1.0 -MajorVer=1 -MinorVer=0 - -[ddetailsbot (http://www.displaydetails.com)] -Parent=General Crawlers -Browser=ddetailsbot - -[DomainCrawler/1.0 (info@domaincrawler.com; http://www.domaincrawler.com/domains/view/*)] -Parent=General Crawlers -Browser=DomainCrawler - -[DomainsBotBot/1.*] -Parent=General Crawlers -Browser=DomainsBotBot -isBanned=true - -[DomainsDB.net MetaCrawler*] -Parent=General Crawlers -Browser=DomainsDB - -[Drupal (*)] -Parent=General Crawlers -Browser=Drupal - -[Dumbot (version *)*] -Parent=General Crawlers -Browser=Dumbfind - -[EuripBot/*] -Parent=General Crawlers -Browser=Europe Internet Portal - -[eventax/*] -Parent=General Crawlers -Browser=eventax - -[FANGCrawl/*] -Parent=General Crawlers -Browser=Safe-t.net Web Filtering Service -isBanned=true - -[favorstarbot/*] -Parent=General Crawlers -Browser=favorstarbot -isBanned=true - -[FollowSite.com (*)] -Parent=General Crawlers -Browser=FollowSite -isBanned=true - -[Gaisbot*] -Parent=General Crawlers -Browser=Gaisbot - -[Healthbot/Health_and_Longevity_Project_(HealthHaven.com) ] -Parent=General Crawlers -Browser=Healthbot -isBanned=true - -[hitcrawler_0.*] -Parent=General Crawlers -Browser=hitcrawler -isBanned=true - -[htdig/*] -Parent=General Crawlers -Browser=ht://Dig - -[http://hilfe.acont.de/bot.html ACONTBOT] -Parent=General Crawlers -Browser=ACONTBOT -isBanned=true - -[JetBrains*] -Parent=General Crawlers -Browser=Omea Pro - -[KakleBot - www.kakle.com/0.1] -Parent=General Crawlers -Browser=KakleBot - -[KBeeBot/0.*] -Parent=General Crawlers -Browser=KBeeBot -isBanned=true - -[Keyword Density/*] -Parent=General Crawlers -Browser=Keyword Density - -[LetsCrawl.com/1.0*] -Parent=General Crawlers -Browser=LetsCrawl.com -isBanned=true - -[Lincoln State Web Browser] -Parent=General Crawlers -Browser=Lincoln State Web Browser -isBanned=true - -[Links4US-Crawler,*] -Parent=General Crawlers -Browser=Links4US-Crawler -isBanned=true - -[Lorkyll *.* -- lorkyll@444.net] -Parent=General Crawlers -Browser=Lorkyll -isBanned=true - -[Lsearch/sondeur] -Parent=General Crawlers -Browser=Lsearch/sondeur -isBanned=true - -[LucidMedia ClickSense/4.?] -Parent=General Crawlers -Browser=LucidMedia-ClickSense -isBanned=true - -[MapoftheInternet.com?(?http://MapoftheInternet.com)] -Parent=General Crawlers -Browser=MapoftheInternet -isBanned=true - -[Marvin v0.3] -Parent=General Crawlers -Browser=MedHunt -Version=0.3 -MajorVer=0 -MinorVer=3 - -[masidani_bot_v0.6*] -Parent=General Crawlers -Browser=masidani_bot - -[Metaspinner/0.01 (Metaspinner; http://www.meta-spinner.de/; support@meta-spinner.de/)] -Parent=General Crawlers -Browser=Metaspinner/0.01 -Version=0.01 -MajorVer=0 -MinorVer=01 - -[metatagsdir/*] -Parent=General Crawlers -Browser=metatagsdir -isBanned=true - -[Microsoft Windows Network Diagnostics] -Parent=General Crawlers -Browser=Microsoft Windows Network Diagnostics -isBanned=true - -[Miva (AlgoFeedback@miva.com)] -Parent=General Crawlers -Browser=Miva - -[moget/*] -Parent=General Crawlers -Browser=Goo - -[Mozdex/0.7.2*] -Parent=General Crawlers -Browser=Mozdex - -[Mozilla Compatible (MS IE 3.01 WinNT)] -Parent=General Crawlers -isBanned=true - -[Mozilla/* (compatible; WebCapture*)] -Parent=General Crawlers -Browser=WebCapture - -[Mozilla/4.0 (compatible; DepSpid/*)] -Parent=General Crawlers -Browser=DepSpid - -[Mozilla/4.0 (compatible; MSIE *; Windows NT *; SV1)] -Parent=General Crawlers -Browser=AVG - -[Mozilla/4.0 (compatible; MSIE 4.01; Vonna.com b o t)] -Parent=General Crawlers -Browser=Vonna.com -isBanned=true - -[Mozilla/4.0 (compatible; MSIE 4.01; Windows95)] -Parent=General Crawlers -Win32=true - -[Mozilla/4.0 (compatible; MSIE 4.5; Windows 98; )] -Parent=General Crawlers -Win32=true - -[Mozilla/4.0 (compatible; MyFamilyBot/*)] -Parent=General Crawlers -Browser=MyFamilyBot - -[Mozilla/4.0 (compatible; N-Stealth)] -Parent=General Crawlers -Browser=N-Stealth - -[Mozilla/4.0 (compatible; Scumbot/*; Linux/*)] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.0 (compatible; Spider; Linux)] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.0 (compatible; Win32)] -Parent=General Crawlers -Browser=Unknown Crawler -isBanned=true - -[Mozilla/4.1] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.5] -Parent=General Crawlers -isBanned=true - -[Mozilla/5.0 (*http://gnomit.com/) Gecko/* Gnomit/1.0] -Parent=General Crawlers -Browser=Gnomit -isBanned=true - -[Mozilla/5.0 (compatible; AboutUsBot/*)] -Parent=General Crawlers -Browser=AboutUsBot -isBanned=true - -[Mozilla/5.0 (compatible; BuzzRankingBot/*)] -Parent=General Crawlers -Browser=BuzzRankingBot -isBanned=true - -[Mozilla/5.0 (compatible; Diffbot/0.1; http://www.diffbot.com)] -Parent=General Crawlers -Browser=Diffbot - -[Mozilla/5.0 (compatible; FirstSearchBot/1.0; *)] -Parent=General Crawlers -Browser=FirstSearchBot - -[mozilla/5.0 (compatible; genevabot http://www.healthdash.com)] -Parent=General Crawlers -Browser=Healthdash - -[Mozilla/5.0 (compatible; JadynAveBot; *http://www.jadynave.com/robot*] -Parent=General Crawlers -Browser=JadynAveBot -isBanned=true - -[Mozilla/5.0 (compatible; Kyluka crawl; http://www.kyluka.com/crawl.html; crawl@kyluka.com)] -Parent=General Crawlers -Browser=Kyluka - -[Mozilla/5.0 (compatible; MJ12bot/v1.2.*; http://www.majestic12.co.uk/bot.php*)] -Parent=General Crawlers -Browser=MJ12bot -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (compatible; MSIE 7.0 ?http://www.europarchive.org)] -Parent=General Crawlers -Browser=Europe Web Archive - -[Mozilla/5.0 (compatible; Seznam screenshot-generator 2.0;*)] -Parent=General Crawlers -Browser=Seznam screenshot-generator -isBanned=true - -[Mozilla/5.0 (compatible; Twingly Recon; http://www.twingly.com/)] -Parent=General Crawlers -Browser=Twingly Recon - -[Mozilla/5.0 (compatible; unwrapbot/2.*; http://www.unwrap.jp*)] -Parent=General Crawlers -Browser=UnWrap - -[Mozilla/5.0 (compatible; Vermut*)] -Parent=General Crawlers -Browser=Vermut - -[Mozilla/5.0 (compatible; Webbot/*)] -Parent=General Crawlers -Browser=Webbot.ru -isBanned=true - -[n4p_bot*] -Parent=General Crawlers -Browser=n4p_bot - -[nabot*] -Parent=General Crawlers -Browser=Nabot - -[NetCarta_WebMapper/*] -Parent=General Crawlers -Browser=NetCarta_WebMapper -isBanned=true - -[NetID.com Bot*] -Parent=General Crawlers -Browser=NetID.com Bot -isBanned=true - -[neTVision AG andreas.heidoetting@thomson-webcast.net] -Parent=General Crawlers -Browser=neTVision - -[NextopiaBOT*] -Parent=General Crawlers -Browser=NextopiaBOT - -[nicebot] -Parent=General Crawlers -Browser=nicebot -isBanned=true - -[niXXieBot?Foster*] -Parent=General Crawlers -Browser=niXXiebot-Foster - -[Nozilla/P.N (Just for IDS woring)] -Parent=General Crawlers -Browser=Nozilla/P.N -isBanned=true - -[Nudelsalat/*] -Parent=General Crawlers -Browser=Nudelsalat -isBanned=true - -[NV32ts] -Parent=General Crawlers -Browser=NV32ts -isBanned=true - -[Ocelli/*] -Parent=General Crawlers -Browser=Ocelli - -[OpenTaggerBot (http://www.opentagger.com/opentaggerbot.htm)] -Parent=General Crawlers -Browser=OpenTaggerBot - -[Oracle Enterprise Search] -Parent=General Crawlers -Browser=Oracle Enterprise Search -isBanned=true - -[Oracle Ultra Search] -Parent=General Crawlers -Browser=Oracle Ultra Search - -[Pajaczek/*] -Parent=General Crawlers -Browser=Pajaczek -isBanned=true - -[panscient.com] -Parent=General Crawlers -Browser=panscient.com -isBanned=true - -[Patwebbot (http://www.herz-power.de/technik.html)] -Parent=General Crawlers -Browser=Patwebbot - -[PDFBot (crawler@pdfind.com)] -Parent=General Crawlers -Browser=PDFBot - -[Pete-Spider/1.*] -Parent=General Crawlers -Browser=Pete-Spider -isBanned=true - -[PhpDig/*] -Parent=General Crawlers -Browser=PhpDig - -[PlantyNet_WebRobot*] -Parent=General Crawlers -Browser=PlantyNet -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PluckIt - -[PluckItCrawler/1.0 (*)] -Parent=General Crawlers -isMobileDevice=true - -[PMAFind] -Parent=General Crawlers -Browser=PMAFind -isBanned=true - -[Poodle_predictor_1.0] -Parent=General Crawlers -Browser=Poodle Predictor - -[QuickFinder Crawler] -Parent=General Crawlers -Browser=QuickFinder -isBanned=true - -[Radiation Retriever*] -Parent=General Crawlers -Browser=Radiation Retriever -isBanned=true - -[RedCarpet/*] -Parent=General Crawlers -Browser=RedCarpet -isBanned=true - -[RixBot (http://babelserver.org/rix)] -Parent=General Crawlers -Browser=RixBot - -[Rome Client (http://tinyurl.com/64t5n) Ver: 0.*] -Parent=General Crawlers -Browser=TinyURL - -[SBIder/*] -Parent=General Crawlers -Browser=SiteSell - -[ScollSpider/2.*] -Parent=General Crawlers -Browser=ScollSpider -isBanned=true - -[Search Fst] -Parent=General Crawlers -Browser=Search Fst - -[searchbot admin@google.com] -Parent=General Crawlers -Browser=searchbot -isBanned=true - -[Seeker.lookseek.com] -Parent=General Crawlers -Browser=LookSeek -isBanned=true - -[semanticdiscovery/*] -Parent=General Crawlers -Browser=Semantic Discovery - -[SeznamBot/*] -Parent=General Crawlers -Browser=SeznamBot -isBanned=true - -[Shelob (shelob@gmx.net)] -Parent=General Crawlers -Browser=Shelob -isBanned=true - -[shelob v1.*] -Parent=General Crawlers -Browser=shelob -isBanned=true - -[ShopWiki/1.0*] -Parent=General Crawlers -Browser=ShopWiki -Version=1.0 -MajorVer=1 -MinorVer=0 - -[ShowXML/1.0 libwww/5.4.0] -Parent=General Crawlers -Browser=ShowXML -isBanned=true - -[sitecheck.internetseer.com*] -Parent=General Crawlers -Browser=Internetseer - -[SMBot/*] -Parent=General Crawlers -Browser=SMBot - -[sohu*] -Parent=General Crawlers -Browser=sohu-search -isBanned=true - -[SpankBot*] -Parent=General Crawlers -Browser=SpankBot -isBanned=true - -[spider (tspyyp@tom.com)] -Parent=General Crawlers -Browser=spider (tspyyp@tom.com) -isBanned=true - -[Sunrise/0.*] -Parent=General Crawlers -Browser=Sunrise -isBanned=true - -[Superpages URL Verification Engine] -Parent=General Crawlers -Browser=Superpages - -[Surf Knight] -Parent=General Crawlers -Browser=Surf Knight -isBanned=true - -[SurveyBot/*] -Parent=General Crawlers -Browser=SurveyBot -isBanned=true - -[SynapticSearch/AI Crawler 1.?] -Parent=General Crawlers -Browser=SynapticSearch -isBanned=true - -[SyncMgr] -Parent=General Crawlers -Browser=SyncMgr - -[Tagyu Agent/1.0] -Parent=General Crawlers -Browser=Tagyu - -[Talkro Web-Shot/*] -Parent=General Crawlers -Browser=Talkro Web-Shot -isBanned=true - -[Tecomi Bot (http://www.tecomi.com/bot.htm)] -Parent=General Crawlers -Browser=Tecomi - -[TheInformant*] -Parent=General Crawlers -Browser=TheInformant -isBanned=true - -[Toata dragostea*] -Parent=General Crawlers -Browser=Toata dragostea -isBanned=true - -[Tutorial Crawler*] -Parent=General Crawlers -isBanned=true - -[UbiCrawler/*] -Parent=General Crawlers -Browser=UbiCrawler - -[UCmore] -Parent=General Crawlers -Browser=UCmore - -[User*Agent:*] -Parent=General Crawlers -isBanned=true - -[USER_AGENT] -Parent=General Crawlers -Browser=USER_AGENT -isBanned=true - -[VadixBot] -Parent=General Crawlers -Browser=VadixBot - -[VengaBot/*] -Parent=General Crawlers -Browser=VengaBot -isBanned=true - -[Visicom Toolbar] -Parent=General Crawlers -Browser=Visicom Toolbar - -[W3C-WebCon/*] -Parent=General Crawlers -Browser=W3C-WebCon - -[Webclipping.com] -Parent=General Crawlers -Browser=Webclipping.com -isBanned=true - -[webcollage/*] -Parent=General Crawlers -Browser=WebCollage -isBanned=true - -[WebCrawler_1.*] -Parent=General Crawlers -Browser=WebCrawler - -[WebFilter Robot*] -Parent=General Crawlers -Browser=WebFilter Robot - -[WeBoX/*] -Parent=General Crawlers -Browser=WeBoX - -[WebTrends/*] -Parent=General Crawlers -Browser=WebTrends - -[West Wind Internet Protocols*] -Parent=General Crawlers -Browser=Versatel -isBanned=true - -[WhizBang] -Parent=General Crawlers -Browser=WhizBang - -[Willow Internet Crawler by Twotrees V*] -Parent=General Crawlers -Browser=Willow Internet Crawler - -[WIRE/* (Linux; i686; Bot,Robot,Spider,Crawler)] -Parent=General Crawlers -Browser=WIRE -isBanned=true - -[www.fi crawler, contact crawler@www.fi] -Parent=General Crawlers -Browser=www.fi crawler - -[Xerka WebBot v1.*] -Parent=General Crawlers -Browser=Xerka -isBanned=true - -[XML Sitemaps Generator*] -Parent=General Crawlers -Browser=XML Sitemaps Generator - -[XSpider*] -Parent=General Crawlers -Browser=XSpider -isBanned=true - -[YooW!/* (?http://www.yoow.eu)] -Parent=General Crawlers -Browser=YooW! -isBanned=true - -[HiddenMarket-*] -Parent=General RSS -Browser=HiddenMarket -isBanned=true - -[FOTOCHECKER] -Parent=Image Crawlers -Browser=FOTOCHECKER -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Search Engines - -[Search Engines] -Parent=DefaultProperties -Browser=Search Engines -Crawler=true - -[*FDSE robot*] -Parent=Search Engines -Browser=FDSE Robot - -[*Fluffy the spider*] -Parent=Search Engines -Browser=SearchHippo - -[Abacho*] -Parent=Search Engines -Browser=Abacho - -[ah-ha.com crawler (crawler@ah-ha.com)] -Parent=Search Engines -Browser=Ah-Ha - -[AIBOT/*] -Parent=Search Engines -Browser=21Seek.Com - -[ALeadSoftbot/*] -Parent=Search Engines -Browser=ALeadSoftbot - -[Amfibibot/*] -Parent=Search Engines -Browser=Amfibi - -[AnswerBus (http://www.answerbus.com/)] -Parent=Search Engines - -[antibot-V*] -Parent=Search Engines -Browser=antibot - -[appie*(www.walhello.com)] -Parent=Search Engines -Browser=Walhello - -[ASPSeek/*] -Parent=Search Engines -Browser=ASPSeek - -[BigCliqueBOT/*] -Parent=Search Engines -Browser=BigClique.com/BigClic.com - -[Blaiz-Bee/*] -Parent=Search Engines -Browser=RawGrunt - -[btbot/*] -Parent=Search Engines -Browser=Bit Torrent Search Engine - -[Busiversebot/v1.0 (http://www.busiverse.com/bot.php)] -Parent=Search Engines -Browser=Busiversebot -isBanned=true - -[CatchBot/*; http://www.catchbot.com] -Parent=Search Engines -Browser=CatchBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[CipinetBot (http://www.cipinet.com/bot.html)] -Parent=Search Engines -Browser=CipinetBot - -[Cogentbot/1.?*] -Parent=Search Engines -Browser=Cogentbot - -[compatible; Mozilla 4.0; MSIE 5.5; (SqwidgeBot v1.01 - http://www.sqwidge.com/bot/)] -Parent=Search Engines -Browser=SqwidgeBot - -[cosmos*] -Parent=Search Engines -Browser=Xyleme - -[Deepindex] -Parent=Search Engines -Browser=Deepindex - -[DiamondBot] -Parent=Search Engines -Browser=DiamondBot - -[Dumbot*] -Parent=Search Engines -Browser=Dumbot -Version=0.2 -MajorVer=0 -MinorVer=2 -Beta=true - -[Eule?Robot*] -Parent=Search Engines -Browser=Eule-Robot - -[Faxobot/*] -Parent=Search Engines -Browser=Faxo - -[Filangy/*] -Parent=Search Engines -Browser=Filangy - -[flatlandbot/*] -Parent=Search Engines -Browser=Flatland - -[Fooky.com/ScorpionBot/ScoutOut;*] -Parent=Search Engines -Browser=ScorpionBot -isBanned=true - -[FyberSpider*] -Parent=Search Engines -Browser=FyberSpider -isBanned=true - -[Gaisbot/*] -Parent=Search Engines -Browser=Gaisbot - -[gazz/*(gazz@nttr.co.jp)] -Parent=Search Engines -Browser=gazz - -[geniebot*] -Parent=Search Engines -Browser=GenieKnows - -[GOFORITBOT (?http://www.goforit.com/about/?)] -Parent=Search Engines -Browser=GoForIt - -[GoGuidesBot/*] -Parent=Search Engines -Browser=GoGuidesBot - -[GroschoBot/*] -Parent=Search Engines -Browser=GroschoBot - -[GurujiBot/1.*] -Parent=Search Engines -Browser=GurujiBot -isBanned=true - -[HenryTheMiragoRobot*] -Parent=Search Engines -Browser=Mirago - -[HolmesBot (http://holmes.ge)] -Parent=Search Engines -Browser=HolmesBot - -[Hotzonu/*] -Parent=Search Engines -Browser=Hotzonu - -[HyperEstraier/*] -Parent=Search Engines -Browser=HyperEstraier -isBanned=true - -[i1searchbot/*] -Parent=Search Engines -Browser=i1searchbot - -[IIITBOT/1.*] -Parent=Search Engines -Browser=Indian Language Web Search Engine - -[Iltrovatore-?etaccio/*] -Parent=Search Engines -Browser=Iltrovatore-Setaccio - -[InfociousBot (?http://corp.infocious.com/tech_crawler.php)] -Parent=Search Engines -Browser=InfociousBot -isBanned=true - -[Infoseek SideWinder/*] -Parent=Search Engines -Browser=Infoseek - -[iSEEKbot/*] -Parent=Search Engines -Browser=iSEEKbot - -[Knight/0.? (Zook Knight; http://knight.zook.in/; knight@zook.in)] -Parent=Search Engines -Browser=Knight - -[Kolinka Forum Search (www.kolinka.com)] -Parent=Search Engines -Browser=Kolinka Forum Search -isBanned=true - -[KRetrieve/] -Parent=Search Engines -Browser=KRetrieve -isBanned=true - -[LapozzBot/*] -Parent=Search Engines -Browser=LapozzBot - -[Linknzbot*] -Parent=Search Engines -Browser=Linknzbot - -[LocalcomBot/*] -Parent=Search Engines -Browser=LocalcomBot - -[Mail.Ru/1.0] -Parent=Search Engines -Browser=Mail.Ru - -[MaSagool/*] -Parent=Search Engines -Browser=Sagoo -Version=1.0 -MajorVer=1 -MinorVer=0 - -[miniRank/*] -Parent=Search Engines -Browser=miniRank - -[Mnogosearch*] -Parent=Search Engines -Browser=Mnogosearch - -[Mozilla/0.9* no dos :) (Linux)] -Parent=Search Engines -Browser=goliat -isBanned=true - -[Mozilla/4.0 (compatible; Arachmo)] -Parent=Search Engines -Browser=Arachmo - -[Mozilla/4.0 (compatible; http://search.thunderstone.com/texis/websearch/about.html)] -Parent=Search Engines -Browser=ThunderStone -isBanned=true - -[Mozilla/4.0 (compatible; MSIE *; Windows NT; Girafabot; girafabot at girafa dot com; http://www.girafa.com)] -Parent=Search Engines -Browser=Girafabot -Win32=true - -[Mozilla/4.0 (compatible; Vagabondo/*; webcrawler at wise-guys dot nl; *)] -Parent=Search Engines -Browser=Vagabondo - -[Mozilla/4.0(?compatible; MSIE 6.0; Qihoo *)] -Parent=Search Engines -Browser=Qihoo - -[Mozilla/4.7 (compatible; WhizBang; http://www.whizbang.com/crawler)] -Parent=Search Engines -Browser=Inxight Software - -[Mozilla/5.0 (*) VoilaBot*] -Parent=Search Engines -Browser=VoilaBot -isBanned=true - -[Mozilla/5.0 (compatible; ActiveTouristBot*; http://www.activetourist.com)] -Parent=Search Engines -Browser=ActiveTouristBot - -[Mozilla/5.0 (compatible; Butterfly/1.0; *)*] -Parent=Search Engines -Browser=Butterfly - -[Mozilla/5.0 (compatible; Charlotte/*; *)] -Parent=Search Engines -Browser=Charlotte -Beta=true -isBanned=true - -[Mozilla/5.0 (compatible; CXL-FatAssANT*)] -Parent=Search Engines -Browser=FatAssANT - -[Mozilla/5.0 (compatible; DBLBot/1.0; ?http://www.dontbuylists.com/)] -Parent=Search Engines -Browser=DBLBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (compatible; EARTHCOM.info/*)] -Parent=Search Engines -Browser=EARTHCOM - -[Mozilla/5.0 (compatible; Lipperhey Spider; http://www.lipperhey.com/)] -Parent=Search Engines -Browser=Lipperhey Spider - -[Mozilla/5.0 (compatible; MojeekBot/*; http://www.mojeek.com/bot.html)] -Parent=Search Engines -Browser=MojeekBot - -[Mozilla/5.0 (compatible; NLCrawler/*] -Parent=Search Engines -Browser=Northern Light Web Search - -[Mozilla/5.0 (compatible; OsO;*] -Parent=Search Engines -Browser=Octopodus -isBanned=true - -[Mozilla/5.0 (compatible; Pogodak.*)] -Parent=Search Engines -Browser=Pogodak - -[Mozilla/5.0 (compatible; Quantcastbot/1.*)] -Parent=Search Engines -Browser=Quantcastbot - -[Mozilla/5.0 (compatible; ScoutJet; *http://www.scoutjet.com/)] -Parent=Search Engines -Browser=ScoutJet - -[Mozilla/5.0 (compatible; Scrubby/*; http://www.scrubtheweb.com/abs/meta-check.html)] -Parent=Search Engines -Browser=Scrubby -isBanned=true - -[Mozilla/5.0 (compatible; YoudaoBot/1.*; http://www.youdao.com/help/webmaster/spider/*)] -Parent=Search Engines -Browser=YoudaoBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Twiceler*)] -Parent=Search Engines -Browser=Twiceler -isBanned=true - -[Mozilla/5.0 CostaCider Search*] -Parent=Search Engines -Browser=CostaCider Search - -[Mozilla/5.0 GurujiBot/1.0 (*)] -Parent=Search Engines -Browser=GurujiBot - -[NavissoBot] -Parent=Search Engines -Browser=NavissoBot - -[NextGenSearchBot*(for information visit *)] -Parent=Search Engines -Browser=ZoomInfo -isBanned=true - -[Norbert the Spider(Burf.com)] -Parent=Search Engines -Browser=Norbert the Spider - -[NuSearch Spider*] -Parent=Search Engines -Browser=nuSearch - -[ObjectsSearch/*] -Parent=Search Engines -Browser=ObjectsSearch - -[OpenISearch/1.*] -Parent=Search Engines -Browser=OpenISearch (Amazon) - -[Pagebull http://www.pagebull.com/] -Parent=Search Engines -Browser=Pagebull - -[PEERbot*] -Parent=Search Engines -Browser=PEERbot - -[Pompos/*] -Parent=Search Engines -Browser=Pompos - -[Popdexter/*] -Parent=Search Engines -Browser=Popdex - -[Qweery*] -Parent=Search Engines -Browser=QweeryBot - -[RedCell/* (*)] -Parent=Search Engines -Browser=RedCell - -[Scrubby/*] -Parent=Search Engines -Browser=Scrub The Web - -[Search-10/*] -Parent=Search Engines -Browser=Search-10 - -[search.ch*] -Parent=Search Engines -Browser=Swiss Search Engine - -[Searchmee! Spider*] -Parent=Search Engines -Browser=Searchmee! - -[Seekbot/*] -Parent=Search Engines -Browser=Seekbot - -[SiteSpider (http://www.SiteSpider.com/)] -Parent=Search Engines -Browser=SiteSpider - -[Spinne/*] -Parent=Search Engines -Browser=Spinne - -[sproose/*] -Parent=Search Engines -Browser=Sproose - -[Sqeobot/0.*] -Parent=Search Engines -Browser=Branzel -isBanned=true - -[SquigglebotBot/*] -Parent=Search Engines -Browser=SquigglebotBot -isBanned=true - -[StackRambler/*] -Parent=Search Engines -Browser=StackRambler - -[SygolBot*] -Parent=Search Engines -Browser=SygolBot - -[SynoBot] -Parent=Search Engines -Browser=SynoBot - -[Szukacz/*] -Parent=Search Engines -Browser=Szukacz - -[Tarantula/*] -Parent=Search Engines -Browser=Tarantula -isBanned=true - -[TerrawizBot/*] -Parent=Search Engines -Browser=TerrawizBot -isBanned=true - -[Tkensaku/*] -Parent=Search Engines -Browser=Tkensaku - -[TMCrawler] -Parent=Search Engines -Browser=TMCrawler -isBanned=true - -[Twingly Recon] -Parent=Search Engines -Browser=Twingly Recon -isBanned=true - -[updated/*] -Parent=Search Engines -Browser=Updated! - -[URL Spider Pro/*] -Parent=Search Engines -Browser=URL Spider Pro - -[URL Spider SQL*] -Parent=Search Engines -Browser=Innerprise Enterprise Search - -[VMBot/*] -Parent=Search Engines -Browser=VMBot - -[voyager/2.0 (http://www.kosmix.com/html/crawler.html)] -Parent=Search Engines -Browser=Voyager - -[wadaino.jp-crawler*] -Parent=Search Engines -Browser=wadaino.jp -isBanned=true - -[WebAlta Crawler/*] -Parent=Search Engines -Browser=WebAlta Crawler -isBanned=true - -[WebCorp/*] -Parent=Search Engines -Browser=WebCorp -isBanned=true - -[webcrawl.net] -Parent=Search Engines -Browser=webcrawl.net - -[WISEbot/*] -Parent=Search Engines -Browser=WISEbot -isBanned=true - -[Wotbox/*] -Parent=Search Engines -Browser=Wotbox - -[www.zatka.com] -Parent=Search Engines -Browser=Zatka - -[WWWeasel Robot v*] -Parent=Search Engines -Browser=World Wide Weasel - -[YadowsCrawler*] -Parent=Search Engines -Browser=YadowsCrawler - -[YodaoBot/*] -Parent=Search Engines -Browser=YodaoBot -isBanned=true - -[ZeBot_www.ze.bz*] -Parent=Search Engines -Browser=ZE.bz - -[zibber-v*] -Parent=Search Engines -Browser=Zibb - -[ZipppBot/*] -Parent=Search Engines -Browser=ZipppBot - -[ATA-Translation-Service] -Parent=Translators -Browser=ATA-Translation-Service - -[GJK_Browser_Check] -Parent=Version Checkers -Browser=GJK_Browser_Check - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Hatena - -[Hatena] -Parent=DefaultProperties -Browser=Hatena -isBanned=true -Crawler=true - -[Feed::Find/*] -Parent=Hatena -Browser=Feed Find -isSyndicationReader=true - -[Hatena Antenna/*] -Parent=Hatena -Browser=Hatena Antenna - -[Hatena Bookmark/*] -Parent=Hatena -Browser=Hatena Bookmark - -[Hatena RSS/*] -Parent=Hatena -Browser=Hatena RSS -isSyndicationReader=true - -[Hatena::Crawler/*] -Parent=Hatena -Browser=Hatena Crawler - -[HatenaScreenshot*] -Parent=Hatena -Browser=HatenaScreenshot - -[URI::Fetch/*] -Parent=Hatena -Browser=URI::Fetch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Internet Archive - -[Internet Archive] -Parent=DefaultProperties -Browser=Internet Archive -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*heritrix*] -Parent=Internet Archive -Browser=Heritrix -isBanned=true - -[ia_archiver*] -Parent=Internet Archive -Browser=Internet Archive - -[InternetArchive/*] -Parent=Internet Archive -Browser=InternetArchive - -[Mozilla/5.0 (compatible; archive.org_bot/1.*)] -Parent=Internet Archive - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nutch - -[Nutch] -Parent=DefaultProperties -Browser=Nutch -isBanned=true -Crawler=true - -[*Nutch*] -Parent=Nutch -isBanned=true - -[CazoodleBot/*] -Parent=Nutch -Browser=CazoodleBot - -[LOOQ/0.1*] -Parent=Nutch -Browser=LOOQ - -[Nutch/0.? (OpenX Spider)] -Parent=Nutch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Webaroo - -[Webaroo] -Parent=DefaultProperties -Browser=Webaroo - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Webaroo/*)] -Parent=Webaroo -Browser=Webaroo - -[Mozilla/5.0 (Windows; U; Windows *; *; rv:*) Gecko/* Firefox/* webaroo/*] -Parent=Webaroo -Browser=Webaroo - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Word Press - -[Word Press] -Parent=DefaultProperties -Browser=Word Press -Alpha=true -Beta=true -Win16=true -Win32=true -Win64=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -isBanned=true -isMobileDevice=true -isSyndicationReader=true -Crawler=true - -[WordPress-B-/2.*] -Parent=Word Press -Browser=WordPress-B - -[WordPress-Do-P-/2.*] -Parent=Word Press -Browser=WordPress-Do-P - -[BlueCoat ProxySG] -Parent=Blue Coat Systems -Browser=BlueCoat ProxySG - -[CerberianDrtrs/*] -Parent=Blue Coat Systems -Browser=Cerberian - -[Inne: Mozilla/4.0 (compatible; Cerberian Drtrs*)] -Parent=Blue Coat Systems -Browser=Cerberian - -[Mozilla/4.0 (compatible; Cerberian Drtrs*)] -Parent=Blue Coat Systems -Browser=Cerberian - -[Mozilla/4.0 (compatible; MSIE 6.0; Bluecoat DRTR)] -Parent=Blue Coat Systems -Browser=Bluecoat - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Copyright/Plagiarism - -[Copyright/Plagiarism] -Parent=DefaultProperties -Browser=Copyright/Plagiarism -isBanned=true -Crawler=true - -[BDFetch] -Parent=Copyright/Plagiarism -Browser=BDFetch - -[copyright sheriff (*)] -Parent=Copyright/Plagiarism -Browser=copyright sheriff - -[CopyRightCheck*] -Parent=Copyright/Plagiarism -Browser=CopyRightCheck - -[FairAd Client*] -Parent=Copyright/Plagiarism -Browser=FairAd Client - -[iCopyright Conductor*] -Parent=Copyright/Plagiarism -Browser=iCopyright Conductor - -[IPiumBot laurion(dot)com] -Parent=Copyright/Plagiarism -Browser=IPiumBot - -[IWAgent/*] -Parent=Copyright/Plagiarism -Browser=Brand Protect - -[Mozilla/5.0 (compatible; DKIMRepBot/*)] -Parent=Copyright/Plagiarism -Browser=DKIMRepBot - -[oBot] -Parent=Copyright/Plagiarism -Browser=oBot - -[SlySearch/*] -Parent=Copyright/Plagiarism -Browser=SlySearch - -[TurnitinBot/*] -Parent=Copyright/Plagiarism -Browser=TurnitinBot - -[TutorGigBot/*] -Parent=Copyright/Plagiarism -Browser=TutorGig - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DNS Tools - -[DNS Tools] -Parent=DefaultProperties -Browser=DNS Tools -Crawler=true - -[Domain Dossier utility*] -Parent=DNS Tools -Browser=Domain Dossier - -[Mozilla/5.0 (compatible; DNS-Digger/*)] -Parent=DNS Tools -Browser=DNS-Digger - -[OpenDNS Domain Crawler noc@opendns.com] -Parent=DNS Tools -Browser=OpenDNS Domain Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Download Managers - -[Download Managers] -Parent=DefaultProperties -Browser=Download Managers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[AndroidDownloadManager] -Parent=Download Managers -Browser=Android Download Manager - -[AutoMate5] -Parent=Download Managers -Browser=AutoMate5 - -[Beamer*] -Parent=Download Managers -Browser=Beamer - -[BitBeamer/*] -Parent=Download Managers -Browser=BitBeamer - -[BitTorrent/*] -Parent=Download Managers -Browser=BitTorrent - -[DA *] -Parent=Download Managers -Browser=Download Accelerator - -[Download Demon*] -Parent=Download Managers -Browser=Download Demon - -[Download Express*] -Parent=Download Managers -Browser=Download Express - -[Download Master*] -Parent=Download Managers -Browser=Download Master - -[Download Ninja*] -Parent=Download Managers -Browser=Download Ninja - -[Download Wonder*] -Parent=Download Managers -Browser=Download Wonder - -[DownloadSession*] -Parent=Download Managers -Browser=DownloadSession - -[EasyDL/*] -Parent=Download Managers -Browser=EasyDL - -[FDM 1.x] -Parent=Download Managers -Browser=Free Download Manager - -[FlashGet] -Parent=Download Managers -Browser=FlashGet - -[FreshDownload/*] -Parent=Download Managers -Browser=FreshDownload - -[GetRight/*] -Parent=Download Managers -Browser=GetRight - -[GetRightPro/*] -Parent=Download Managers -Browser=GetRightPro - -[GetSmart/*] -Parent=Download Managers -Browser=GetSmart - -[Go!Zilla*] -Parent=Download Managers -Browser=GoZilla - -[Gozilla/*] -Parent=Download Managers -Browser=Gozilla - -[Internet Ninja*] -Parent=Download Managers -Browser=Internet Ninja - -[Kontiki Client*] -Parent=Download Managers -Browser=Kontiki Client - -[lftp/3.2.1] -Parent=Download Managers -Browser=lftp - -[LightningDownload/*] -Parent=Download Managers -Browser=LightningDownload - -[LMQueueBot/*] -Parent=Download Managers -Browser=LMQueueBot - -[MetaProducts Download Express/*] -Parent=Download Managers -Browser=Download Express - -[Mozilla/4.0 (compatible; Getleft*)] -Parent=Download Managers -Browser=Getleft - -[Myzilla] -Parent=Download Managers -Browser=Myzilla - -[Net Vampire/*] -Parent=Download Managers -Browser=Net Vampire - -[Net_Vampire*] -Parent=Download Managers -Browser=Net_Vampire - -[NetAnts*] -Parent=Download Managers -Browser=NetAnts - -[NetPumper*] -Parent=Download Managers -Browser=NetPumper - -[NetSucker*] -Parent=Download Managers -Browser=NetSucker - -[NetZip Downloader*] -Parent=Download Managers -Browser=NetZip Downloader - -[NexTools WebAgent*] -Parent=Download Managers -Browser=NexTools WebAgent - -[Offline Downloader*] -Parent=Download Managers -Browser=Offline Downloader - -[P3P Client] -Parent=Download Managers -Browser=P3P Client - -[PageDown*] -Parent=Download Managers -Browser=PageDown - -[PicaLoader*] -Parent=Download Managers -Browser=PicaLoader - -[Prozilla*] -Parent=Download Managers -Browser=Prozilla - -[RealDownload/*] -Parent=Download Managers -Browser=RealDownload - -[sEasyDL/*] -Parent=Download Managers -Browser=EasyDL - -[shareaza*] -Parent=Download Managers -Browser=shareaza - -[SmartDownload/*] -Parent=Download Managers -Browser=SmartDownload - -[SpeedDownload/*] -Parent=Download Managers -Browser=Speed Download - -[Star*Downloader/*] -Parent=Download Managers -Browser=StarDownloader - -[STEROID Download] -Parent=Download Managers -Browser=STEROID Download - -[SuperBot/*] -Parent=Download Managers -Browser=SuperBot - -[Vegas95/*] -Parent=Download Managers -Browser=Vegas95 - -[WebZIP*] -Parent=Download Managers -Browser=WebZIP - -[Wget*] -Parent=Download Managers -Browser=Wget - -[WinTools] -Parent=Download Managers -Browser=WinTools - -[Xaldon WebSpider*] -Parent=Download Managers -Browser=Xaldon WebSpider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; E-Mail Harvesters - -[E-Mail Harvesters] -Parent=DefaultProperties -Browser=E-Mail Harvesters -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*E-Mail Address Extractor*] -Parent=E-Mail Harvesters -Browser=E-Mail Address Extractor - -[*Larbin*] -Parent=E-Mail Harvesters -Browser=Larbin - -[*www4mail/*] -Parent=E-Mail Harvesters -Browser=www4mail - -[8484 Boston Project*] -Parent=E-Mail Harvesters -Browser=8484 Boston Project - -[CherryPicker*/*] -Parent=E-Mail Harvesters -Browser=CherryPickerElite - -[Chilkat/*] -Parent=E-Mail Harvesters -Browser=Chilkat - -[ContactBot/*] -Parent=E-Mail Harvesters -Browser=ContactBot - -[eCatch*] -Parent=E-Mail Harvesters -Browser=eCatch - -[EmailCollector*] -Parent=E-Mail Harvesters -Browser=E-Mail Collector - -[EMAILsearcher] -Parent=E-Mail Harvesters -Browser=EMAILsearcher - -[EmailSiphon*] -Parent=E-Mail Harvesters -Browser=E-Mail Siphon - -[EmailWolf*] -Parent=E-Mail Harvesters -Browser=EMailWolf - -[Epsilon SoftWorks' MailMunky] -Parent=E-Mail Harvesters -Browser=MailMunky - -[ExtractorPro*] -Parent=E-Mail Harvesters -Browser=ExtractorPro - -[Franklin Locator*] -Parent=E-Mail Harvesters -Browser=Franklin Locator - -[Missigua Locator*] -Parent=E-Mail Harvesters -Browser=Missigua Locator - -[Mozilla/4.0 (compatible; Advanced Email Extractor*)] -Parent=E-Mail Harvesters -Browser=Advanced Email Extractor - -[Netprospector*] -Parent=E-Mail Harvesters -Browser=Netprospector - -[ProWebWalker*] -Parent=E-Mail Harvesters -Browser=ProWebWalker - -[sna-0.0.*] -Parent=E-Mail Harvesters -Browser=Mike Elliott's E-Mail Harvester - -[WebEnhancer*] -Parent=E-Mail Harvesters -Browser=WebEnhancer - -[WebMiner*] -Parent=E-Mail Harvesters -Browser=WebMiner - -[ZIBB Crawler (email address / WWW address)] -Parent=E-Mail Harvesters -Browser=ZIBB Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Feeds Blogs - -[Feeds Blogs] -Parent=DefaultProperties -Browser=Feeds Blogs -isSyndicationReader=true -Crawler=true - -[Bloglines Title Fetch/*] -Parent=Feeds Blogs -Browser=Bloglines Title Fetch - -[Bloglines/* (http://www.bloglines.com*)] -Parent=Feeds Blogs -Browser=BlogLines Web - -[BlogPulseLive (support@blogpulse.com)] -Parent=Feeds Blogs -Browser=BlogPulseLive - -[blogsearchbot-pumpkin-2] -Parent=Feeds Blogs -Browser=blogsearchbot-pumpkin -isSyndicationReader=false - -[Irish Blogs Aggregator/*1.0*] -Parent=Feeds Blogs -Browser=Irish Blogs Aggregator -Version=1.0 -MajorVer=1 -MinorVer=0 - -[kinjabot (http://www.kinja.com; *)] -Parent=Feeds Blogs -Browser=kinjabot - -[Net::Trackback/*] -Parent=Feeds Blogs -Browser=Net::Trackback - -[Reblog*] -Parent=Feeds Blogs -Browser=Reblog - -[WordPress/*] -Parent=Feeds Blogs -Browser=WordPress - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Feeds Syndicators - -[Feeds Syndicators] -Parent=DefaultProperties -Browser=Feeds Syndicators -isSyndicationReader=true - -[*LinkLint*] -Parent=Feeds Syndicators -Browser=LinkLint - -[*NetNewsWire/*] -Parent=Feeds Syndicators - -[*NetVisualize*] -Parent=Feeds Syndicators -Browser=NetVisualize - -[AideRSS 2.* (postrank.com)] -Parent=Feeds Syndicators -Browser=AideRSS - -[AideRSS/2.0 (aiderss.com)] -Parent=Feeds Syndicators -Browser=AideRSS -isBanned=true - -[Akregator/*] -Parent=Feeds Syndicators -Browser=Akregator - -[AppleSyndication/*] -Parent=Feeds Syndicators -Browser=Safari RSS -Platform=MacOSX - -[Cocoal.icio.us/* (*)*] -Parent=Feeds Syndicators -Browser=Cocoal.icio.us -isBanned=true - -[Feed43 Proxy/* (*)] -Parent=Feeds Syndicators -Browser=Feed For Free - -[FeedBurner/*] -Parent=Feeds Syndicators -Browser=FeedBurner - -[FeedDemon/* (*)] -Parent=Feeds Syndicators -Browser=FeedDemon -Platform=Win32 - -[FeedDigest/* (*)] -Parent=Feeds Syndicators -Browser=FeedDigest - -[FeedGhost/1.*] -Parent=Feeds Syndicators -Browser=FeedGhost -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedOnFeeds/0.1.* ( http://minutillo.com/steve/feedonfeeds/)] -Parent=Feeds Syndicators -Browser=FeedOnFeeds -Version=0.1 -MajorVer=0 -MinorVer=1 - -[Feedreader * (Powered by Newsbrain)] -Parent=Feeds Syndicators -Browser=Newsbrain - -[Feedshow/* (*)] -Parent=Feeds Syndicators -Browser=Feedshow - -[Feedster Crawler/?.0; Feedster, Inc.] -Parent=Feeds Syndicators -Browser=Feedster - -[GreatNews/1.0] -Parent=Feeds Syndicators -Browser=GreatNews -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Gregarius/*] -Parent=Feeds Syndicators -Browser=Gregarius - -[intraVnews/*] -Parent=Feeds Syndicators -Browser=intraVnews - -[JetBrains Omea Reader*] -Parent=Feeds Syndicators -Browser=Omea Reader -isBanned=true - -[Liferea/1.5* (Linux; *; http://liferea.sf.net/)] -Parent=Feeds Syndicators -Browser=Liferea -isBanned=true - -[livedoor FeedFetcher/0.0* (http://reader.livedoor.com/;*)] -Parent=Feeds Syndicators -Browser=FeedFetcher -Version=0.0 -MajorVer=0 -MinorVer=0 - -[MagpieRSS/* (*)] -Parent=Feeds Syndicators -Browser=MagpieRSS - -[Mobitype * (compatible; Mozilla/*; MSIE *.*; Windows *)] -Parent=Feeds Syndicators -Browser=Mobitype -Platform=Win32 - -[Mozilla/5.0 (*; Rojo *; http://www.rojo.com/corporate/help/agg; *)*] -Parent=Feeds Syndicators -Browser=Rojo - -[Mozilla/5.0 (*aggregator:TailRank; http://tailrank.com/robot)*] -Parent=Feeds Syndicators -Browser=TailRank - -[Mozilla/5.0 (compatible; MSIE 6.0; Podtech Network; crawler_admin@podtech.net)] -Parent=Feeds Syndicators -Browser=Podtech Network - -[Mozilla/5.0 (compatible; Newz Crawler *; http://www.newzcrawler.com/?)] -Parent=Feeds Syndicators -Browser=Newz Crawler - -[Mozilla/5.0 (compatible; RSSMicro.com RSS/Atom Feed Robot)] -Parent=Feeds Syndicators -Browser=RSSMicro - -[Mozilla/5.0 (compatible;*newstin.com;*)] -Parent=Feeds Syndicators -Browser=NewsTin - -[Mozilla/5.0 (RSS Reader Panel)] -Parent=Feeds Syndicators -Browser=RSS Reader Panel - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:FeedParser; *) Gecko/*] -Parent=Feeds Syndicators -Browser=FeedParser - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:NewsMonster; *) Gecko/*] -Parent=Feeds Syndicators -Browser=NewsMonster - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:Rojo; *) Gecko/*] -Parent=Feeds Syndicators -Browser=Rojo - -[Netvibes (*)] -Parent=Feeds Syndicators -Browser=Netvibes - -[NewsAlloy/* (*)] -Parent=Feeds Syndicators -Browser=NewsAlloy - -[Omnipelagos*] -Parent=Feeds Syndicators -Browser=Omnipelagos - -[Particls] -Parent=Feeds Syndicators -Browser=Particls - -[Protopage/* (*)] -Parent=Feeds Syndicators -Browser=Protopage - -[PubSub-RSS-Reader/* (*)] -Parent=Feeds Syndicators -Browser=PubSub-RSS-Reader - -[RSS Menu/*] -Parent=Feeds Syndicators -Browser=RSS Menu - -[RssBandit/*] -Parent=Feeds Syndicators -Browser=RssBandit - -[RssBar/1.2*] -Parent=Feeds Syndicators -Browser=RssBar -Version=1.2 -MajorVer=1 -MinorVer=2 - -[SharpReader/*] -Parent=Feeds Syndicators -Browser=SharpReader - -[SimplePie/*] -Parent=Feeds Syndicators -Browser=SimplePie - -[Strategic Board Bot (?http://www.strategicboard.com)] -Parent=Feeds Syndicators -Browser=Strategic Board Bot -isBanned=true - -[TargetYourNews.com bot] -Parent=Feeds Syndicators -Browser=TargetYourNews - -[Technoratibot/*] -Parent=Feeds Syndicators -Browser=Technoratibot - -[Tumblr/* RSS syndication ( http://www.tumblr.com/) (support@tumblr.com)] -Parent=Feeds Syndicators -Browser=Tumblr RSS syndication - -[Windows-RSS-Platform/1.0*] -Parent=Feeds Syndicators -Browser=Windows-RSS-Platform -Version=1.0 -MajorVer=1 -MinorVer=0 -Win32=true - -[Wizz RSS News Reader] -Parent=Feeds Syndicators -Browser=Wizz - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; General RSS - -[General RSS] -Parent=DefaultProperties -Browser=General RSS -isSyndicationReader=true - -[AideRSS/1.0 (aiderss.com); * subscribers] -Parent=General RSS -Browser=AideRSS -Version=1.0 -MajorVer=1 -MinorVer=0 - -[CC Metadata Scaper http://wiki.creativecommons.org/Metadata_Scraper] -Parent=General RSS -Browser=CC Metadata Scaper - -[Mozilla/5.0 (compatible) GM RSS Panel] -Parent=General RSS -Browser=RSS Panel - -[Mozilla/5.0 http://www.inclue.com; graeme@inclue.com] -Parent=General RSS -Browser=Inclue - -[Runnk online rss reader : http://www.runnk.com/ : RSS favorites : RSS ranking : RSS aggregator*] -Parent=General RSS -Browser=Ruunk - -[Windows-RSS-Platform/2.0 (MSIE 8.0; Windows NT 6.0)] -Parent=General RSS -Browser=Windows-RSS-Platform -Platform=WinVista - -[Mozilla/5.0 (X11; ?; Linux; *) AppleWebKit/* (KHTML, like Gecko, Safari/*) Arora/0.4] -Parent=Google Code -Browser=Arora -Version=0.4 -MajorVer=0 -MinorVer=4 -Platform=Linux -CssVersion=2 -supportsCSS=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Validation Checkers - -[HTML Validators] -Parent=DefaultProperties -Browser=HTML Validators -Frames=true -IFrames=true -Tables=true -Crawler=true - -[(HTML Validator http://www.searchengineworld.com/validator/)] -Parent=HTML Validators -Browser=Search Engine World HTML Validator - -[FeedValidator/1.3] -Parent=HTML Validators -Browser=FeedValidator -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Jigsaw/* W3C_CSS_Validator_JFouffa/*] -Parent=HTML Validators -Browser=Jigsaw CSS Validator - -[Search Engine World Robots.txt Validator*] -Parent=HTML Validators -Browser=Search Engine World Robots.txt Validator - -[W3C_Validator/*] -Parent=HTML Validators -Browser=W3C Validator - -[W3CLineMode/*] -Parent=HTML Validators -Browser=W3C Line Mode - -[Weblide/2.? beta*] -Parent=HTML Validators -Browser=Weblide -Version=2.0 -MajorVer=2 -MinorVer=0 -Beta=true - -[WebmasterWorld StickyMail Server Header Checker*] -Parent=HTML Validators -Browser=WebmasterWorld Server Header Checker - -[WWWC/*] -Parent=HTML Validators - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Image Crawlers - -[Image Crawlers] -Parent=DefaultProperties -Browser=Image Crawlers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*CFNetwork*] -Parent=Image Crawlers -Browser=CFNetwork - -[*PhotoStickies/*] -Parent=Image Crawlers -Browser=PhotoStickies - -[Camcrawler*] -Parent=Image Crawlers -Browser=Camcrawler - -[CydralSpider/*] -Parent=Image Crawlers -Browser=Cydral Web Image Search -isBanned=true - -[Der gro\xdfe BilderSauger*] -Parent=Image Crawlers -Browser=Gallery Grabber - -[Extreme Picture Finder] -Parent=Image Crawlers -Browser=Extreme Picture Finder - -[FLATARTS_FAVICO] -Parent=Image Crawlers -Browser=FlatArts Favorites Icon Tool - -[HTML2JPG Blackbox, http://www.html2jpg.com] -Parent=Image Crawlers -Browser=HTML2JPG - -[IconSurf/2.*] -Parent=Image Crawlers -Browser=IconSurf - -[kalooga/KaloogaBot*] -Parent=Image Crawlers -Browser=KaloogaBot - -[Mister PIX*] -Parent=Image Crawlers -Browser=Mister PIX - -[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/* (*) Pandora/2.*] -Parent=Image Crawlers -Browser=Pandora - -[naoFavicon4IE*] -Parent=Image Crawlers -Browser=naoFavicon4IE - -[pixfinder/*] -Parent=Image Crawlers -Browser=pixfinder - -[rssImagesBot/0.1 (*http://herbert.groot.jebbink.nl/?app=rssImages)] -Parent=Image Crawlers -Browser=rssImagesBot - -[Web Image Collector*] -Parent=Image Crawlers -Browser=Web Image Collector - -[WebImages * (?http://herbert.groot.jebbink.nl/?app=WebImages?)] -Parent=Image Crawlers -Browser=WebImages - -[WebPix*] -Parent=Image Crawlers -Browser=Custo - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Link Checkers - -[Link Checkers] -Parent=DefaultProperties -Browser=Link Checkers -Frames=true -IFrames=true -Tables=true -Crawler=true - -[!Susie (http://www.sync2it.com/susie)] -Parent=Link Checkers -Browser=!Susie - -[*AgentName/*] -Parent=Link Checkers -Browser=AgentName - -[*Linkman*] -Parent=Link Checkers -Browser=Linkman - -[*LinksManager.com*] -Parent=Link Checkers -Browser=LinksManager - -[*Powermarks/*] -Parent=Link Checkers -Browser=Powermarks - -[*W3C-checklink/*] -Parent=Link Checkers -Browser=W3C Link Checker - -[*Web Link Validator*] -Parent=Link Checkers -Browser=Web Link Validator - -[*Zeus*] -Parent=Link Checkers -Browser=Zeus -isBanned=true - -[ActiveBookmark *] -Parent=Link Checkers -Browser=ActiveBookmark - -[Bookdog/*] -Parent=Link Checkers -Browser=Bookdog - -[Bookmark Buddy*] -Parent=Link Checkers -Browser=Bookmark Buddy - -[Bookmark Renewal Check Agent*] -Parent=Link Checkers -Browser=Bookmark Renewal Check Agent - -[Bookmark search tool*] -Parent=Link Checkers -Browser=Bookmark search tool - -[Bookmark-Manager] -Parent=Link Checkers -Browser=Bookmark-Manager - -[Checkbot*] -Parent=Link Checkers -Browser=Checkbot - -[CheckLinks/*] -Parent=Link Checkers -Browser=CheckLinks - -[CyberSpyder Link Test/*] -Parent=Link Checkers -Browser=CyberSpyder Link Test - -[DLC/*] -Parent=Link Checkers -Browser=DLC - -[DocWeb Link Crawler (http://doc.php.net)] -Parent=Link Checkers -Browser=DocWeb Link Crawler - -[FavOrg] -Parent=Link Checkers -Browser=FavOrg - -[Favorites Sweeper v.3.*] -Parent=Link Checkers -Browser=Favorites Sweeper - -[FindLinks/*] -Parent=Link Checkers -Browser=FindLinks - -[Funnel Web Profiler*] -Parent=Link Checkers -Browser=Funnel Web Profiler - -[Html Link Validator (www.lithopssoft.com)] -Parent=Link Checkers -Browser=HTML Link Validator - -[IECheck] -Parent=Link Checkers -Browser=IECheck - -[JCheckLinks/*] -Parent=Link Checkers -Browser=JCheckLinks - -[JRTwine Software Check Favorites Utility] -Parent=Link Checkers -Browser=JRTwine - -[Link Valet Online*] -Parent=Link Checkers -Browser=Link Valet -isBanned=true - -[LinkAlarm/*] -Parent=Link Checkers -Browser=LinkAlarm - -[Linkbot*] -Parent=Link Checkers -Browser=Linkbot - -[LinkChecker/*] -Parent=Link Checkers -Browser=LinkChecker - -[LinkextractorPro*] -Parent=Link Checkers -Browser=LinkextractorPro -isBanned=true - -[LinkLint-checkonly/*] -Parent=Link Checkers -Browser=LinkLint - -[LinkScan/*] -Parent=Link Checkers -Browser=LinkScan - -[LinkSweeper/*] -Parent=Link Checkers -Browser=LinkSweeper - -[LinkWalker*] -Parent=Link Checkers -Browser=LinkWalker - -[MetaGer-LinkChecker] -Parent=Link Checkers -Browser=MetaGer-LinkChecker - -[Mozilla/* (compatible; linktiger/*; *http://www.linktiger.com*)] -Parent=Link Checkers -Browser=LinkTiger -isBanned=true - -[Mozilla/4.0 (Compatible); URLBase*] -Parent=Link Checkers -Browser=URLBase - -[Mozilla/4.0 (compatible; Link Utility; http://net-promoter.com)] -Parent=Link Checkers -Browser=NetPromoter Link Utility - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98) Web Link Validator*] -Parent=Link Checkers -Browser=Web Link Validator -Win32=true - -[Mozilla/4.0 (compatible; MSIE 7.0; Win32) Link Commander 3.0] -Parent=Link Checkers -Browser=Link Commander -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Win32 - -[Mozilla/4.0 (compatible; smartBot/1.*; checking links; *)] -Parent=Link Checkers -Browser=smartBot - -[Mozilla/4.0 (compatible; SuperCleaner*;*)] -Parent=Link Checkers -Browser=SuperCleaner - -[Mozilla/5.0 gURLChecker/*] -Parent=Link Checkers -Browser=gURLChecker -isBanned=true - -[Newsgroupreporter LinkCheck] -Parent=Link Checkers -Browser=Newsgroupreporter LinkCheck - -[onCHECK Linkchecker von www.scientec.de fuer www.onsinn.de] -Parent=Link Checkers -Browser=onCHECK Linkchecker - -[online link validator (http://www.dead-links.com/)] -Parent=Link Checkers -Browser=Dead-Links.com -isBanned=true - -[REL Link Checker*] -Parent=Link Checkers -Browser=REL Link Checker - -[RLinkCheker*] -Parent=Link Checkers -Browser=RLinkCheker - -[Robozilla/*] -Parent=Link Checkers -Browser=Robozilla - -[RPT-HTTPClient/*] -Parent=Link Checkers -Browser=RPT-HTTPClient -isBanned=true - -[SafariBookmarkChecker*(?http://www.coriolis.ch/)] -Parent=Link Checkers -Browser=SafariBookmarkChecker -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[Simpy/* (Simpy; http://www.simpy.com/?ref=bot; feedback at simpy dot com)] -Parent=Link Checkers -Browser=Simpy - -[SiteBar/*] -Parent=Link Checkers -Browser=SiteBar - -[Susie (http://www.sync2it.com/bms/susie.php] -Parent=Link Checkers -Browser=Susie - -[URLBase/6.*] -Parent=Link Checkers - -[VSE/*] -Parent=Link Checkers -Browser=VSE Link Tester - -[WebTrends Link Analyzer] -Parent=Link Checkers -Browser=WebTrends Link Analyzer - -[WorQmada/*] -Parent=Link Checkers -Browser=WorQmada - -[Xenu* Link Sleuth*] -Parent=Link Checkers -Browser=Xenu's Link Sleuth -isBanned=true - -[Z-Add Link Checker*] -Parent=Link Checkers -Browser=Z-Add Link Checker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Microsoft - -[Microsoft] -Parent=DefaultProperties -Browser=Microsoft -isBanned=true - -[Live (http://www.live.com/)] -Parent=Microsoft -Browser=Microsoft Live -isBanned=false -isSyndicationReader=true - -[MFC Foundation Class Library*] -Parent=Microsoft -Browser=MFC Foundation Class Library - -[MFHttpScan] -Parent=Microsoft -Browser=MFHttpScan - -[Microsoft BITS/*] -Parent=Microsoft -Browser=BITS - -[Microsoft Data Access Internet Publishing Provider Cache Manager] -Parent=Microsoft -Browser=MS IPP - -[Microsoft Data Access Internet Publishing Provider DAV*] -Parent=Microsoft -Browser=MS IPP DAV - -[Microsoft Data Access Internet Publishing Provider Protocol Discovery] -Parent=Microsoft -Browser=MS IPPPD - -[Microsoft Internet Explorer] -Parent=Microsoft -Browser=Fake IE - -[Microsoft Office Existence Discovery] -Parent=Microsoft -Browser=Microsoft Office Existence Discovery - -[Microsoft Office Protocol Discovery] -Parent=Microsoft -Browser=MS OPD - -[Microsoft Office/* (*Picture Manager*)] -Parent=Microsoft -Browser=Microsoft Office Picture Manager - -[Microsoft URL Control*] -Parent=Microsoft -Browser=Microsoft URL Control - -[Microsoft Visio MSIE] -Parent=Microsoft -Browser=Microsoft Visio - -[Microsoft-WebDAV-MiniRedir/*] -Parent=Microsoft -Browser=Microsoft-WebDAV - -[Mozilla/5.0 (Macintosh; Intel Mac OS X) Excel/12.*] -Parent=Microsoft -Browser=Microsoft Excel -Version=12.0 -MajorVer=12 -MinorVer=0 -Platform=MacOSX - -[MSN Feed Manager] -Parent=Microsoft -Browser=MSN Feed Manager -isBanned=false -isSyndicationReader=true - -[MSProxy/*] -Parent=Microsoft -Browser=MS Proxy - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Miscellaneous Browsers - -[Miscellaneous Browsers] -Parent=DefaultProperties -Browser=Miscellaneous Browsers -Frames=true -Tables=true -Cookies=true - -[*Amiga*] -Parent=Miscellaneous Browsers -Browser=Amiga -Platform=Amiga - -[*avantbrowser*] -Parent=Miscellaneous Browsers -Browser=Avant Browser - -[12345] -Parent=Miscellaneous Browsers -Browser=12345 -isBanned=true - -[Ace Explorer] -Parent=Miscellaneous Browsers -Browser=Ace Explorer - -[Enigma Browser*] -Parent=Miscellaneous Browsers -Browser=Enigma Browser - -[EVE-minibrowser/*] -Parent=Miscellaneous Browsers -Browser=EVE-minibrowser -IFrames=false -Tables=false -BackgroundSounds=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -isBanned=false -Crawler=false - -[Godzilla/* (Basic*; *; Commodore C=64; *; rv:1.*)*] -Parent=Miscellaneous Browsers -Browser=Godzilla - -[GreenBrowser] -Parent=Miscellaneous Browsers -Browser=GreenBrowser -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Kopiczek/* (WyderOS*; *)] -Parent=Miscellaneous Browsers -Browser=Kopiczek -Platform=WyderOS -IFrames=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (*) - BrowseX (*)] -Parent=Miscellaneous Browsers -Browser=BrowseX - -[Mozilla/* (Win32;*Escape?*; ?)] -Parent=Miscellaneous Browsers -Browser=Escape -Platform=Win32 - -[Mozilla/4.0 (compatible; ibisBrowser)] -Parent=Miscellaneous Browsers -Browser=ibisBrowser - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) AppleWebKit/* (*) HistoryHound/*] -Parent=Miscellaneous Browsers -Browser=HistoryHound - -[NetRecorder*] -Parent=Miscellaneous Browsers -Browser=NetRecorder - -[NetSurfer*] -Parent=Miscellaneous Browsers -Browser=NetSurfer - -[ogeb browser , Version 1.1.0] -Parent=Miscellaneous Browsers -Browser=ogeb browser -Version=1.1 -MajorVer=1 -MinorVer=1 - -[SCEJ PSP BROWSER 0102pspNavigator] -Parent=Miscellaneous Browsers -Browser=Wipeout Pure - -[SlimBrowser] -Parent=Miscellaneous Browsers -Browser=SlimBrowser - -[WWW_Browser/*] -Parent=Miscellaneous Browsers -Browser=WWW Browser -Version=1.69 -MajorVer=1 -MinorVer=69 -Platform=Win16 -CssVersion=3 -supportsCSS=true - -[*Netcraft Webserver Survey*] -Parent=Netcraft -Browser=Netcraft Webserver Survey -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Offline Browsers - -[Offline Browsers] -Parent=DefaultProperties -Browser=Offline Browsers -Frames=true -Tables=true -Cookies=true -isBanned=true -Crawler=true - -[*Check&Get*] -Parent=Offline Browsers -Browser=Check&Get - -[*HTTrack*] -Parent=Offline Browsers -Browser=HTTrack - -[*MSIECrawler*] -Parent=Offline Browsers -Browser=IE Offline Browser - -[*TweakMASTER*] -Parent=Offline Browsers -Browser=TweakMASTER - -[BackStreet Browser *] -Parent=Offline Browsers -Browser=BackStreet Browser - -[Go-Ahead-Got-It*] -Parent=Offline Browsers -Browser=Go Ahead Got-It - -[iGetter/*] -Parent=Offline Browsers -Browser=iGetter - -[Teleport*] -Parent=Offline Browsers -Browser=Teleport - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Online Scanners - -[Online Scanners] -Parent=DefaultProperties -Browser=Online Scanners -isBanned=true - -[JoeDog/* (X11; I; Siege *)] -Parent=Online Scanners -Browser=JoeDog -isBanned=false - -[Morfeus Fucking Scanner] -Parent=Online Scanners -Browser=Morfeus Fucking Scanner - -[Mozilla/4.0 (compatible; Trend Micro tmdr 1.*] -Parent=Online Scanners -Browser=Trend Micro - -[Titanium 2005 (4.02.01)] -Parent=Online Scanners -Browser=Panda Antivirus Titanium - -[virus_detector*] -Parent=Online Scanners -Browser=Secure Computing Corporation - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Proxy Servers - -[Proxy Servers] -Parent=DefaultProperties -Browser=Proxy Servers -isBanned=true - -[*squid*] -Parent=Proxy Servers -Browser=Squid - -[Anonymisiert*] -Parent=Proxy Servers -Browser=Anonymizied - -[Anonymizer/*] -Parent=Proxy Servers -Browser=Anonymizer - -[Anonymizied*] -Parent=Proxy Servers -Browser=Anonymizied - -[Anonymous*] -Parent=Proxy Servers -Browser=Anonymous - -[Anonymous/*] -Parent=Proxy Servers -Browser=Anonymous - -[CE-Preload] -Parent=Proxy Servers -Browser=CE-Preload - -[http://Anonymouse.org/*] -Parent=Proxy Servers -Browser=Anonymouse - -[IE/6.01 (CP/M; 8-bit*)] -Parent=Proxy Servers -Browser=Squid - -[Mozilla/* (TuringOS; Turing Machine; 0.0)] -Parent=Proxy Servers -Browser=Anonymizer - -[Mozilla/4.0 (compatible; MSIE ?.0; SaferSurf*)] -Parent=Proxy Servers -Browser=SaferSurf - -[Mozilla/5.0 (compatible; del.icio.us-thumbnails/*; *) KHTML/* (like Gecko)] -Parent=Proxy Servers -Browser=Yahoo! -isBanned=true -Crawler=true - -[Nutscrape] -Parent=Proxy Servers -Browser=Squid - -[Nutscrape/* (CP/M; 8-bit*)] -Parent=Proxy Servers -Browser=Squid - -[Privoxy/*] -Parent=Proxy Servers -Browser=Privoxy - -[ProxyTester*] -Parent=Proxy Servers -Browser=ProxyTester -isBanned=true -Crawler=true - -[SilentSurf*] -Parent=Proxy Servers -Browser=SilentSurf - -[SmallProxy*] -Parent=Proxy Servers -Browser=SmallProxy - -[Space*Bison/*] -Parent=Proxy Servers -Browser=Proxomitron - -[Sqworm/*] -Parent=Proxy Servers -Browser=Websense - -[SurfControl] -Parent=Proxy Servers -Browser=SurfControl - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Research Projects - -[Research Projects] -Parent=DefaultProperties -Browser=Research Projects -isBanned=true -Crawler=true - -[*research*] -Parent=Research Projects - -[AcadiaUniversityWebCensusClient] -Parent=Research Projects -Browser=AcadiaUniversityWebCensusClient - -[Amico Alpha * (*) Gecko/* AmicoAlpha/*] -Parent=Research Projects -Browser=Amico Alpha - -[annotate_google; http://ponderer.org/*] -Parent=Research Projects -Browser=Annotate Google - -[CMS crawler (?http://buytaert.net/crawler/)] -Parent=Research Projects - -[e-SocietyRobot(http://www.yama.info.waseda.ac.jp/~yamana/es/)] -Parent=Research Projects -Browser=e-SocietyRobot - -[Forschungsportal/*] -Parent=Research Projects -Browser=Forschungsportal - -[Gulper Web *] -Parent=Research Projects -Browser=Gulper Web Bot - -[HooWWWer/*] -Parent=Research Projects -Browser=HooWWWer - -[http://buytaert.net/crawler] -Parent=Research Projects - -[inetbot/* (?http://www.inetbot.com/bot.html)] -Parent=Research Projects -Browser=inetbot - -[IRLbot/*] -Parent=Research Projects -Browser=IRLbot - -[Lachesis] -Parent=Research Projects -Browser=Lachesis - -[Mozilla/5.0 (compatible; nextthing.org/*)] -Parent=Research Projects -Browser=nextthing.org -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (compatible; Theophrastus/*)] -Parent=Research Projects -Browser=Theophrastus - -[Mozilla/5.0 (compatible; Webscan v0.*; http://otc.dyndns.org/webscan/)] -Parent=Research Projects -Browser=Webscan - -[MQbot*] -Parent=Research Projects -Browser=MQbot - -[OutfoxBot/*] -Parent=Research Projects -Browser=OutfoxBot - -[polybot?*] -Parent=Research Projects -Browser=Polybot - -[Shim?Crawler*] -Parent=Research Projects -Browser=Shim Crawler - -[Steeler/*] -Parent=Research Projects -Browser=Steeler - -[Taiga web spider] -Parent=Research Projects -Browser=Taiga - -[Theme Spider*] -Parent=Research Projects -Browser=Theme Spider - -[UofTDB_experiment* (leehyun@cs.toronto.edu)] -Parent=Research Projects -Browser=UofTDB Experiment - -[USyd-NLP-Spider*] -Parent=Research Projects -Browser=USyd-NLP-Spider - -[woriobot*] -Parent=Research Projects -Browser=woriobot - -[wwwster/* (Beta, mailto:gue@cis.uni-muenchen.de)] -Parent=Research Projects -Browser=wwwster -Beta=true - -[Zao-Crawler] -Parent=Research Projects -Browser=Zao-Crawler - -[Zao/*] -Parent=Research Projects -Browser=Zao - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Rippers - -[Rippers] -Parent=DefaultProperties -Browser=Rippers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*grub*] -Parent=Rippers -Browser=grub - -[*ickHTTP*] -Parent=Rippers -Browser=IP*Works - -[*java*] -Parent=Rippers - -[*libwww-perl*] -Parent=Rippers -Browser=libwww-perl - -[*WebGrabber*] -Parent=Rippers - -[*WinHttpRequest*] -Parent=Rippers -Browser=WinHttp - -[3D-FTP/*] -Parent=Rippers -Browser=3D-FTP - -[3wGet/*] -Parent=Rippers -Browser=3wGet - -[ActiveRefresh*] -Parent=Rippers -Browser=ActiveRefresh - -[Artera (Version *)] -Parent=Rippers -Browser=Artera - -[AutoHotkey] -Parent=Rippers -Browser=AutoHotkey - -[b2w/*] -Parent=Rippers -Browser=b2w - -[BasicHTTP/*] -Parent=Rippers -Browser=BasicHTTP - -[BlockNote.Net] -Parent=Rippers -Browser=BlockNote.Net - -[CAST] -Parent=Rippers -Browser=CAST - -[CFNetwork/*] -Parent=Rippers -Browser=CFNetwork - -[CFSCHEDULE*] -Parent=Rippers -Browser=ColdFusion Task Scheduler - -[CobWeb/*] -Parent=Rippers -Browser=CobWeb - -[ColdFusion*] -Parent=Rippers -Browser=ColdFusion - -[Crawl_Application] -Parent=Rippers -Browser=Crawl_Application - -[curl/*] -Parent=Rippers -Browser=cURL - -[Custo*] -Parent=Rippers -Browser=Custo - -[DataCha0s/*] -Parent=Rippers -Browser=DataCha0s - -[DeepIndexer*] -Parent=Rippers -Browser=DeepIndexer - -[DISCo Pump *] -Parent=Rippers -Browser=DISCo Pump - -[eStyleSearch * (compatible; MSIE 6.0; Windows NT 5.0)] -Parent=Rippers -Browser=eStyleSearch -Win32=true - -[ezic.com http agent *] -Parent=Rippers -Browser=Ezic.com - -[fetch libfetch/*] -Parent=Rippers - -[FGet*] -Parent=Rippers -Browser=FGet - -[Flaming AttackBot*] -Parent=Rippers -Browser=Flaming AttackBot - -[Foobot*] -Parent=Rippers -Browser=Foobot - -[GameSpyHTTP/*] -Parent=Rippers -Browser=GameSpyHTTP - -[gnome-vfs/*] -Parent=Rippers -Browser=gnome-vfs - -[Harvest/*] -Parent=Rippers -Browser=Harvest - -[hcat/*] -Parent=Rippers -Browser=hcat - -[HLoader] -Parent=Rippers -Browser=HLoader - -[Holmes/*] -Parent=Rippers -Browser=Holmes - -[HTMLParser/*] -Parent=Rippers -Browser=HTMLParser - -[http generic] -Parent=Rippers -Browser=http generic - -[httpclient*] -Parent=Rippers - -[httperf/*] -Parent=Rippers -Browser=httperf - -[HTTPFetch/*] -Parent=Rippers -Browser=HTTPFetch - -[HTTPGrab] -Parent=Rippers -Browser=HTTPGrab - -[HttpSession] -Parent=Rippers -Browser=HttpSession - -[httpunit/*] -Parent=Rippers -Browser=HttpUnit - -[ICE_GetFile] -Parent=Rippers -Browser=ICE_GetFile - -[iexplore.exe] -Parent=Rippers - -[Inet - Eureka App] -Parent=Rippers -Browser=Inet - Eureka App - -[INetURL/*] -Parent=Rippers -Browser=INetURL - -[InetURL:/*] -Parent=Rippers -Browser=InetURL - -[Internet Exploiter/*] -Parent=Rippers - -[Internet Explore *] -Parent=Rippers -Browser=Fake IE - -[Internet Explorer *] -Parent=Rippers -Browser=Fake IE - -[IP*Works!*/*] -Parent=Rippers -Browser=IP*Works! - -[IrssiUrlLog/*] -Parent=Rippers -Browser=IrssiUrlLog - -[JPluck/*] -Parent=Rippers -Browser=JPluck - -[Kapere (http://www.kapere.com)] -Parent=Rippers -Browser=Kapere - -[LeechFTP] -Parent=Rippers -Browser=LeechFTP - -[LeechGet*] -Parent=Rippers -Browser=LeechGet - -[libcurl-agent/*] -Parent=Rippers -Browser=libcurl - -[libWeb/clsHTTP*] -Parent=Rippers -Browser=libWeb/clsHTTP - -[lwp*] -Parent=Rippers - -[MFC_Tear_Sample] -Parent=Rippers -Browser=MFC_Tear_Sample - -[Moozilla] -Parent=Rippers -Browser=Moozilla - -[MovableType/*] -Parent=Rippers -Browser=MovableType Web Log - -[Mozilla/2.0 (compatible; NEWT ActiveX; Win32)] -Parent=Rippers -Browser=NEWT ActiveX -Platform=Win32 - -[Mozilla/3.0 (compatible)] -Parent=Rippers - -[Mozilla/3.0 (compatible; Indy Library)] -Parent=Rippers -Cookies=true - -[Mozilla/3.01 (compatible;)] -Parent=Rippers - -[Mozilla/4.0 (compatible; BorderManager*)] -Parent=Rippers -Browser=Novell BorderManager - -[Mozilla/4.0 (compatible;)] -Parent=Rippers - -[Mozilla/5.0 (compatible; IPCheck Server Monitor*)] -Parent=Rippers -Browser=IPCheck Server Monitor - -[OCN-SOC/*] -Parent=Rippers -Browser=OCN-SOC - -[Offline Explorer*] -Parent=Rippers -Browser=Offline Explorer - -[Open Web Analytics Bot*] -Parent=Rippers -Browser=Open Web Analytics Bot - -[OSSProxy*] -Parent=Rippers -Browser=OSSProxy - -[Pageload*] -Parent=Rippers -Browser=PageLoad - -[PageNest/*] -Parent=Rippers -Browser=PageNest - -[pavuk/*] -Parent=Rippers -Browser=Pavuk - -[PEAR HTTP_Request*] -Parent=Rippers -Browser=PEAR-PHP - -[PHP*] -Parent=Rippers -Browser=PHP - -[PigBlock (Windows NT 5.1; U)*] -Parent=Rippers -Browser=PigBlock -Win32=true - -[Pockey*] -Parent=Rippers -Browser=Pockey-GetHTML - -[POE-Component-Client-HTTP/*] -Parent=Rippers -Browser=POE-Component-Client-HTTP - -[PycURL/*] -Parent=Rippers -Browser=PycURL - -[Python*] -Parent=Rippers -Browser=Python - -[RepoMonkey*] -Parent=Rippers -Browser=RepoMonkey - -[SBL-BOT*] -Parent=Rippers -Browser=BlackWidow - -[ScoutAbout*] -Parent=Rippers -Browser=ScoutAbout - -[sherlock/*] -Parent=Rippers -Browser=Sherlock - -[SiteParser/*] -Parent=Rippers -Browser=SiteParser - -[SiteSnagger*] -Parent=Rippers -Browser=SiteSnagger - -[SiteSucker/*] -Parent=Rippers -Browser=SiteSucker - -[SiteWinder*] -Parent=Rippers -Browser=SiteWinder - -[Snoopy*] -Parent=Rippers -Browser=Snoopy - -[SOFTWING_TEAR_AGENT*] -Parent=Rippers -Browser=AspTear - -[SuperHTTP/*] -Parent=Rippers -Browser=SuperHTTP - -[Tcl http client package*] -Parent=Rippers -Browser=Tcl http client package - -[Twisted PageGetter] -Parent=Rippers -Browser=Twisted PageGetter - -[URL2File/*] -Parent=Rippers -Browser=URL2File - -[UtilMind HTTPGet] -Parent=Rippers -Browser=UtilMind HTTPGet - -[VCI WebViewer*] -Parent=Rippers -Browser=VCI WebViewer - -[W3CRobot/*] -Parent=Rippers -Browser=W3CRobot - -[Web Downloader*] -Parent=Rippers -Browser=Web Downloader - -[Web Downloader/*] -Parent=Rippers -Browser=Web Downloader - -[Web Magnet*] -Parent=Rippers -Browser=Web Magnet - -[WebAuto/*] -Parent=Rippers - -[webbandit/*] -Parent=Rippers -Browser=webbandit - -[WebCopier*] -Parent=Rippers -Browser=WebCopier - -[WebDownloader*] -Parent=Rippers -Browser=WebDownloader - -[WebFetch] -Parent=Rippers -Browser=WebFetch - -[webfetch/*] -Parent=Rippers -Browser=WebFetch - -[WebGatherer*] -Parent=Rippers -Browser=WebGatherer - -[WebGet] -Parent=Rippers -Browser=WebGet - -[WebReaper*] -Parent=Rippers -Browser=WebReaper - -[WebRipper] -Parent=Rippers -Browser=WebRipper - -[WebSauger*] -Parent=Rippers -Browser=WebSauger - -[Website Downloader*] -Parent=Rippers -Browser=Website Downloader - -[Website eXtractor*] -Parent=Rippers -Browser=Website eXtractor - -[Website Quester] -Parent=Rippers -Browser=Website Quester - -[WebsiteExtractor*] -Parent=Rippers -Browser=Website eXtractor - -[WebSnatcher*] -Parent=Rippers -Browser=WebSnatcher - -[Webster Pro*] -Parent=Rippers -Browser=Webster Pro - -[WebStripper*] -Parent=Rippers -Browser=WebStripper - -[WebWhacker*] -Parent=Rippers -Browser=WebWhacker - -[WinScripter iNet Tools] -Parent=Rippers -Browser=WinScripter iNet Tools - -[WWW-Mechanize/*] -Parent=Rippers -Browser=WWW-Mechanize - -[Zend_Http_Client] -Parent=Rippers -Browser=Zend_Http_Client - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Site Monitors - -[Site Monitors] -Parent=DefaultProperties -Browser=Site Monitors -Cookies=true -isBanned=true -Crawler=true - -[*EasyRider*] -Parent=Site Monitors -Browser=EasyRider - -[*maxamine.com--robot*] -Parent=Site Monitors -Browser=maxamine.com--robot -isBanned=true - -[*WebMon ?.*] -Parent=Site Monitors -Browser=WebMon - -[Kenjin Spider*] -Parent=Site Monitors -Browser=Kenjin Spider - -[Kevin http://*] -Parent=Site Monitors -Browser=Kevin -isBanned=true - -[Mozilla/4.0 (compatible; ChangeDetection/*] -Parent=Site Monitors -Browser=ChangeDetection - -[Myst Monitor Service v*] -Parent=Site Monitors -Browser=Myst Monitor Service - -[Net Probe] -Parent=Site Monitors -Browser=Net Probe - -[NetMechanic*] -Parent=Site Monitors -Browser=NetMechanic - -[NetReality*] -Parent=Site Monitors -Browser=NetReality - -[Pingdom GIGRIB*] -Parent=Site Monitors -Browser=Pingdom - -[Site Valet Online*] -Parent=Site Monitors -Browser=Site Valet -isBanned=true - -[SITECHECKER] -Parent=Site Monitors -Browser=SITECHECKER - -[sitemonitor@dnsvr.com/*] -Parent=Site Monitors -Browser=ZoneEdit Failover Monitor -isBanned=false - -[UpTime Checker*] -Parent=Site Monitors -Browser=UpTime Checker - -[URL Control*] -Parent=Site Monitors -Browser=URL Control - -[URL_Access/*] -Parent=Site Monitors - -[URLCHECK] -Parent=Site Monitors -Browser=URLCHECK - -[URLy Warning*] -Parent=Site Monitors -Browser=URLy Warning - -[Webcheck *] -Parent=Site Monitors -Browser=Webcheck -Version=1.0 -MajorVer=1 -MinorVer=0 - -[WebPatrol/*] -Parent=Site Monitors -Browser=WebPatrol - -[websitepulse checker/*] -Parent=Site Monitors -Browser=websitepulse checker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Social Bookmarkers - -[Social Bookmarkers] -Parent=DefaultProperties -Browser=Social Bookmarkers -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[BookmarkBase(2/;http://bookmarkbase.com)] -Parent=Social Bookmarkers -Browser=BookmarkBase - -[Cocoal.icio.us/1.0 (v43) (Mac OS X; http://www.scifihifi.com/cocoalicious)] -Parent=Social Bookmarkers -Browser=Cocoalicious - -[Mozilla/5.0 (compatible; FriendFeedBot/0.*; Http://friendfeed.com/about/bot)] -Parent=Social Bookmarkers -Browser=FriendFeedBot - -[Twitturly*] -Parent=Social Bookmarkers -Browser=Twitturly - -[WinkBot/*] -Parent=Social Bookmarkers -Browser=WinkBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Translators - -[Translators] -Parent=DefaultProperties -Browser=Translators -Frames=true -Tables=true -Cookies=true - -[Seram Server] -Parent=Translators -Browser=Seram Server - -[TeragramWebcrawler/*] -Parent=Translators -Browser=TeragramWebcrawler -Version=1.0 -MajorVer=1 -MinorVer=0 - -[WebIndexer/* (Web Indexer; *)] -Parent=Translators -Browser=WorldLingo - -[WebTrans] -Parent=Translators -Browser=WebTrans - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Version Checkers - -[Version Checkers] -Parent=DefaultProperties -Browser=Version Checkers -Crawler=true - -[Automated Browscap.ini Updater. To report issues contact us at http://www.skycomp.ca] -Parent=Version Checkers -Browser=Automated Browscap.ini Updater - -[BMC Link Validator (http://www.briansmodelcars.com/links/)] -Parent=Version Checkers -Browser=BMC Link Validator -MajorVer=1 -MinorVer=0 -Platform=Win2000 - -[Browscap updater] -Parent=Version Checkers -Browser=Browscap updater - -[BrowscapUpdater1.0] -Parent=Version Checkers - -[Browser Capabilities Project (http://browsers.garykeith.com; http://browsers.garykeith.com/sitemail/contact-me.asp)] -Parent=Version Checkers -Browser=Gary Keith's Version Checker - -[Browser Capabilities Project AutoDownloader] -Parent=Version Checkers -Browser=TKC AutoDownloader - -[browsers.garykeith.com browscap.ini bot BETA] -Parent=Version Checkers - -[Code Sample Web Client] -Parent=Version Checkers -Browser=Code Sample Web Client - -[Desktop Sidebar*] -Parent=Version Checkers -Browser=Desktop Sidebar -isBanned=true - -[Mono Browser Capabilities Updater*] -Parent=Version Checkers -Browser=Mono Browser Capabilities Updater -isBanned=true - -[Rewmi/*] -Parent=Version Checkers -isBanned=true - -[Subtext Version 1.9* - http://subtextproject.com/ (Microsoft Windows NT 5.2.*)] -Parent=Version Checkers -Browser=Subtext - -[TherapeuticResearch] -Parent=Version Checkers -Browser=TherapeuticResearch - -[UpdateBrowscap*] -Parent=Version Checkers -Browser=UpdateBrowscap - -[www.garykeith.com browscap.ini bot*] -Parent=Version Checkers -Browser=clarkson.edu - -[www.substancia.com AutoHTTPAgent (ver *)] -Parent=Version Checkers -Browser=Substância - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Become - -[Become] -Parent=DefaultProperties -Browser=Become -Frames=true -Tables=true -isSyndicationReader=true -Crawler=true - -[*BecomeBot/*] -Parent=Become -Browser=BecomeBot - -[*BecomeBot@exava.com*] -Parent=Become -Browser=BecomeBot - -[*Exabot@exava.com*] -Parent=Become -Browser=Exabot - -[MonkeyCrawl/*] -Parent=Become -Browser=MonkeyCrawl - -[Mozilla/5.0 (compatible; BecomeJPBot/2.3; *)] -Parent=Become -Browser=BecomeJPBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Blue Coat Systems - -[Blue Coat Systems] -Parent=DefaultProperties -Browser=Blue Coat Systems -isBanned=true -Crawler=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Browscap Abusers - -[Browscap Abusers] -Parent=DefaultProperties -Browser=Browscap Abusers -isBanned=true - -[Apple-PubSub/*] -Parent=Browscap Abusers -Browser=Apple-PubSub - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FeedHub - -[FeedHub] -Parent=DefaultProperties -Browser=FeedHub -isSyndicationReader=true - -[FeedHub FeedDiscovery/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub FeedDiscovery -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedHub FeedFetcher/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub FeedFetcher -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedHub MetaDataFetcher/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub MetaDataFetcher -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Internet Content Rating Association] -Parent=DefaultProperties -Browser= -Frames=true -IFrames=true -Tables=true -Cookies=true -Crawler=true - -[ICRA_label_generator/1.?] -Parent=Internet Content Rating Association -Browser=ICRA_label_generator - -[ICRA_Semantic_spider/0.?] -Parent=Internet Content Rating Association -Browser=ICRA_Semantic_spider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NameProtect - -[NameProtect] -Parent=DefaultProperties -Browser=NameProtect -isBanned=true -Crawler=true - -[abot/*] -Parent=NameProtect -Browser=NameProtect - -[NP/*] -Parent=NameProtect -Browser=NameProtect - -[NPBot*] -Parent=NameProtect -Browser=NameProtect - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netcraft - -[Netcraft] -Parent=DefaultProperties -Browser=Netcraft -isBanned=true -Crawler=true - -[*Netcraft Web Server Survey*] -Parent=Netcraft -Browser=Netcraft Webserver Survey -isBanned=true - -[Mozilla/5.0 (compatible; NetcraftSurveyAgent/1.0; info@netcraft.com)] -Parent=Netcraft -Browser=NetcraftSurveyAgent - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NewsGator - -[NewsGator] -Parent=DefaultProperties -Browser=NewsGator -isSyndicationReader=true - -[MarsEdit*] -Parent=NewsGator -Browser=MarsEdit - -[NetNewsWire*/*] -Parent=NewsGator -Browser=NetNewsWire -Platform=MacOSX - -[NewsFire/*] -Parent=NewsGator -Browser=NewsFire - -[NewsGator FetchLinks extension/*] -Parent=NewsGator -Browser=NewsGator FetchLinks - -[NewsGator/*] -Parent=NewsGator -Browser=NewsGator -isBanned=true - -[NewsGatorOnline/*] -Parent=NewsGator -Browser=NewsGatorOnline - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.2 - -[Chrome 0.2] -Parent=DefaultProperties -Browser=Chrome -Version=0.2 -MinorVer=2 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.3 - -[Chrome 0.3] -Parent=DefaultProperties -Browser=Chrome -Version=0.3 -MinorVer=3 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.4 - -[Chrome 0.4] -Parent=DefaultProperties -Browser=Chrome -Version=0.4 -MinorVer=4 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.5 - -[Chrome 0.5] -Parent=DefaultProperties -Browser=Chrome -Version=0.5 -MinorVer=5 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 1.0 - -[Chrome 1.0] -Parent=DefaultProperties -Browser=Chrome -Version=1.0 -MajorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 2.0 - -[Chrome 2.0] -Parent=DefaultProperties -Browser=Chrome -Version=2.0 -MajorVer=2 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 3.0 - -[Chrome 3.0] -Parent=DefaultProperties -Browser=Chrome -Version=3.0 -MajorVer=3 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google Code - -[Google Code] -Parent=DefaultProperties -Browser=Google Code -Tables=true -Cookies=true -JavaApplets=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.2 - -[Iron 0.2] -Parent=DefaultProperties -Browser=Iron -Version=0.2 -MinorVer=2 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.3 - -[Iron 0.3] -Parent=DefaultProperties -Browser=Iron -Version=0.3 -MinorVer=3 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.4 - -[Iron 0.4] -Parent=DefaultProperties -Browser=Iron -Version=0.4 -MinorVer=4 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iPod - -[iPod] -Parent=DefaultProperties -Browser=iPod -Platform=iPhone OSX -isMobileDevice=true - -[Mozilla/5.0 (iPod; U; *Mac OS X; *) AppleWebKit/* (*) Version/3.0 Mobile/* Safari/*] -Parent=iPod -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX - -[Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2 like Mac OS X; en-us) AppleWebKit/* (KHTML, like Gecko) Mobile/*] -Parent=iPod - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iTunes - -[iTunes] -Parent=DefaultProperties -Browser=iTunes -Platform=iPhone OSX - -[iTunes/* (Windows; ?)] -Parent=iTunes -Browser=iTunes -Platform=Win32 -Win32=true - -[MOT-* iTunes/* MIB/* Profile/MIDP-* Configuration/CLDC-* UP.Link/*] -Parent=iTunes - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Media Players - -[Media Players] -Parent=DefaultProperties -Browser=Media Players -Cookies=true - -[Microsoft NetShow(TM) Player with RealVideo(R)] -Parent=Media Players -Browser=Microsoft NetShow - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; *) AppleWebKit/* RealPlayer] -Parent=Media Players -Browser=RealPlayer -Platform=MacOSX - -[MPlayer 0.9*] -Parent=Media Players -Browser=MPlayer -Version=0.9 -MajorVer=0 -MinorVer=9 - -[MPlayer 1.*] -Parent=Media Players -Browser=MPlayer -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MPlayer HEAD CVS] -Parent=Media Players -Browser=MPlayer - -[RealPlayer*] -Parent=Media Players -Browser=RealPlayer - -[RMA/*] -Parent=Media Players -Browser=RMA - -[VLC media player*] -Parent=Media Players -Browser=VLC - -[vobsub] -Parent=Media Players -Browser=vobsub -isBanned=true - -[WinampMPEG/*] -Parent=Media Players -Browser=WinAmp - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nintendo - -[Nintendo Wii] -Parent=DefaultProperties -Browser= -isMobileDevice=true - -[Opera/* (Nintendo DSi; Opera/*; *; *)] -Parent=Nintendo Wii -Browser=DSi - -[Opera/* (Nintendo Wii; U; *)] -Parent=Nintendo Wii -Browser=Wii - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Windows Media Player - -[Windows Media Player] -Parent=DefaultProperties -Browser=Windows Media Player -Cookies=true - -[NSPlayer/10.*] -Parent=Windows Media Player -Version=10.0 -MajorVer=10 -MinorVer=0 - -[NSPlayer/11.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=11.0 -MajorVer=11 -MinorVer=0 - -[NSPlayer/4.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=4.0 -MajorVer=4 -MinorVer=0 - -[NSPlayer/7.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=7.0 -MajorVer=7 -MinorVer=0 - -[NSPlayer/8.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=8.0 -MajorVer=8 -MinorVer=0 - -[NSPlayer/9.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=9.0 -MajorVer=9 -MinorVer=0 - -[Windows-Media-Player/10.*] -Parent=Windows Media Player -Browser=Windows-Media-Player -Version=10.0 -MajorVer=10 -MinorVer=0 -Win32=true - -[Windows-Media-Player/11.*] -Parent=Windows Media Player -Version=11.0 -MajorVer=11 -MinorVer=0 -Win32=true - -[Windows-Media-Player/7.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=7.0 -MajorVer=7 -MinorVer=0 -Win32=true - -[Windows-Media-Player/8.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=8.0 -MajorVer=8 -MinorVer=0 -Win32=true - -[Windows-Media-Player/9.*] -Parent=Windows Media Player -Version=9.0 -MajorVer=9 -MinorVer=0 -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Zune - -[Zune] -Parent=DefaultProperties -Browser=Zune -Cookies=true - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 2.0*)*] -Parent=Zune -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 2.5*)*] -Parent=Zune -Version=2.5 -MajorVer=2 -MinorVer=5 - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 3.0*)*] -Parent=Zune -Version=3.0 -MajorVer=3 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.0 - -[QuickTime 7.0] -Parent=DefaultProperties -Browser=QuickTime -Version=7.0 -MajorVer=7 -Cookies=true - -[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.0 -Platform=MacOSX - -[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.0 -Platform=MacPPC - -[QuickTime (qtver=7.0*;os=Windows 95*)] -Parent=QuickTime 7.0 -Platform=Win95 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows 98*)] -Parent=QuickTime 7.0 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows Me*)] -Parent=QuickTime 7.0 -Platform=WinME -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 4.0*)] -Parent=QuickTime 7.0 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.0*)] -Parent=QuickTime 7.0 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.1*)] -Parent=QuickTime 7.0 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.2*)] -Parent=QuickTime 7.0 -Platform=Win2003 -Win32=true - -[QuickTime/7.0.* (qtver=7.0.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.0 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.1 - -[QuickTime 7.1] -Parent=DefaultProperties -Browser=QuickTime -Version=7.1 -MajorVer=7 -MinorVer=1 -Cookies=true - -[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.1 -Platform=MacOSX - -[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.1 -Platform=MacPPC - -[QuickTime (qtver=7.1*;os=Windows 98*)] -Parent=QuickTime 7.1 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 4.0*)] -Parent=QuickTime 7.1 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.0*)] -Parent=QuickTime 7.1 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.1*)] -Parent=QuickTime 7.1 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.2*)] -Parent=QuickTime 7.1 -Platform=Win2003 -Win32=true - -[QuickTime/7.1.* (qtver=7.1.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.1 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.2 - -[QuickTime 7.2] -Parent=DefaultProperties -Browser=QuickTime -Version=7.2 -MajorVer=7 -MinorVer=2 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.2*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.2 -Platform=MacOSX - -[QuickTime (qtver=7.2*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.2 -Platform=MacPPC - -[QuickTime (qtver=7.2*;os=Windows 98*)] -Parent=QuickTime 7.2 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 4.0*)] -Parent=QuickTime 7.2 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.0*)] -Parent=QuickTime 7.2 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.1*)] -Parent=QuickTime 7.2 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.2*)] -Parent=QuickTime 7.2 -Platform=Win2003 -Win32=true - -[QuickTime/7.2.* (qtver=7.2.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.2 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.3 - -[QuickTime 7.3] -Parent=DefaultProperties -Browser=QuickTime -Version=7.3 -MajorVer=7 -MinorVer=3 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.3*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.3 -Platform=MacOSX - -[QuickTime (qtver=7.3*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.3 -Platform=MacPPC - -[QuickTime (qtver=7.3*;os=Windows 98*)] -Parent=QuickTime 7.3 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 4.0*)] -Parent=QuickTime 7.3 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.0*)] -Parent=QuickTime 7.3 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.1*)] -Parent=QuickTime 7.3 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.2*)] -Parent=QuickTime 7.3 -Platform=Win2003 -Win32=true - -[QuickTime/7.3.* (qtver=7.3.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.3 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.4 - -[QuickTime 7.4] -Parent=DefaultProperties -Browser=QuickTime -Version=7.4 -MajorVer=7 -MinorVer=4 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.4*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.4 -Platform=MacOSX - -[QuickTime (qtver=7.4*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.4 -Platform=MacPPC - -[QuickTime (qtver=7.4*;os=Windows 98*)] -Parent=QuickTime 7.4 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 4.0*)] -Parent=QuickTime 7.4 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.0*)] -Parent=QuickTime 7.4 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.1*)] -Parent=QuickTime 7.4 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.2*)] -Parent=QuickTime 7.4 -Platform=Win2003 -Win32=true - -[QuickTime/7.4.* (qtver=7.4.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.4 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google Android - -[Android] -Parent=DefaultProperties -Browser=Android -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[Mozilla/5.0 (Linux; U; Android *; *) AppleWebKit/* (KHTML, like Gecko) Safari/*] -Parent=Android -Browser=Android -Platform=Linux -isMobileDevice=true - -[Mozilla/5.0 (Linux; U; Android *; *) AppleWebKit/* (KHTML, like Gecko) Version/3.0.* Mobile Safari/*] -Parent=Android -Browser=Android -Platform=Linux -isMobileDevice=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BlackBerry - -[BlackBerry] -Parent=DefaultProperties -Browser=BlackBerry -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[*BlackBerry*] -Parent=BlackBerry - -[*BlackBerrySimulator/*] -Parent=BlackBerry - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Handspring Blazer - -[Blazer] -Parent=DefaultProperties -Browser=Handspring Blazer -Platform=Palm -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 95; PalmSource; Blazer 3.0) 16;160x160] -Parent=Blazer -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.0) 16;320x448] -Parent=Blazer -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.1) 16;320x320] -Parent=Blazer -Version=4.1 -MajorVer=4 -MinorVer=1 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.2) 16;320x320] -Parent=Blazer -Version=4.2 -MajorVer=4 -MinorVer=2 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.4) 16;320x320] -Parent=Blazer -Version=4.4 -MajorVer=4 -MinorVer=4 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.5) 16;320x320] -Parent=Blazer -Version=4.5 -MajorVer=4 -MinorVer=5 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DoCoMo - -[DoCoMo] -Parent=DefaultProperties -Browser=DoCoMo -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[DoCoMo/1.0*] -Parent=DoCoMo -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WAP - -[DoCoMo/2.0*] -Parent=DoCoMo -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=WAP - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IEMobile - -[IEMobile] -Parent=DefaultProperties -Browser=IEMobile -Platform=WinCE -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -VBScript=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.*)*] -Parent=IEMobile -Version=6.0 -MajorVer=6 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.*)*] -Parent=IEMobile -Version=7.0 -MajorVer=7 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iPhone - -[iPhone] -Parent=DefaultProperties -Browser=iPhone -Platform=iPhone OSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -isMobileDevice=true -CssVersion=3 -supportsCSS=true - -[Mozilla/4.0 (iPhone; *)] -Parent=iPhone - -[Mozilla/4.0 (iPhone; U; CPU like Mac OS X; *)] -Parent=iPhone - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_0_1 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_1 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko)] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0_2 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_1 like Mac OS X; *)*] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_2_1 like Mac OS X; *)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.0 Mobile/* Safari/*] -Parent=iPhone -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/5.0 (iPod; U; *Mac OS X; *) AppleWebKit/* (*) Version/* Mobile/*] -Parent=iPhone -Browser=iTouch - -[Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2* like Mac OS X; *)*] -Parent=iPhone -Browser=iTouch -Version=2.2 -MajorVer=2 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KDDI - -[KDDI] -Parent=DefaultProperties -Browser=KDDI -Frames=true -Tables=true -Cookies=true -BackgroundSounds=true -VBScript=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[KDDI-* UP.Browser/* (GUI) MMP/*] -Parent=KDDI - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Miscellaneous Mobile - -[Miscellaneous Mobile] -Parent=DefaultProperties -Browser= -IFrames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; *; CentOS; *) AppleWebKit/* (KHTML, like Gecko) Bolt/0.* Version/3.0 Safari/*] -Parent=Miscellaneous Mobile -Browser=Bolt - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Motorola Internet Browser - -[Motorola Internet Browser] -Parent=DefaultProperties -Browser=Motorola Internet Browser -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[MOT-*/*] -Parent=Motorola Internet Browser - -[MOT-1*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-8700_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-0A/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-2B/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-88/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-C???/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-GATW_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-L6/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-L7/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-M*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-MP*/* Mozilla/* (compatible; MSIE *; Windows CE; *)] -Parent=Motorola Internet Browser -Win32=true - -[MOT-MP*/* Mozilla/4.0 (compatible; MSIE *; Windows CE; *)] -Parent=Motorola Internet Browser -Win32=true - -[MOT-SAP4_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-T*/*] -Parent=Motorola Internet Browser - -[MOT-T7*/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-T721*] -Parent=Motorola Internet Browser - -[MOT-TA02/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V*/*] -Parent=Motorola Internet Browser - -[MOT-V*/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-V3/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V4*/* MIB/*] -Parent=Motorola Internet Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN Mobile Proxy - -[MSN Mobile Proxy] -Parent=DefaultProperties -Browser=MSN Mobile Proxy -Win32=true -Frames=true -Tables=true -Cookies=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true - -[Mozilla/* (compatible; MSIE *; Windows*; MSN Mobile Proxy)] -Parent=MSN Mobile Proxy - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetFront - -[NetFront] -Parent=DefaultProperties -Browser=NetFront -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[*NetFront/*] -Parent=NetFront - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nokia - -[Nokia] -Parent=DefaultProperties -Browser=Nokia -Tables=true -Cookies=true -isMobileDevice=true - -[*Nokia*/*] -Parent=Nokia - -[Mozilla/* (SymbianOS/*; ?; *) AppleWebKit/* (KHTML, like Gecko) Safari/*] -Parent=Nokia -Platform=SymbianOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Openwave Mobile Browser - -[Openwave Mobile Browser] -Parent=DefaultProperties -Browser=Openwave Mobile Browser -Alpha=true -Win32=true -Win64=true -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[*UP.Browser/*] -Parent=Openwave Mobile Browser - -[*UP.Link/*] -Parent=Openwave Mobile Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera Mini - -[Opera Mini] -Parent=DefaultProperties -Browser=Opera Mini -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[Opera/* (J2ME/MIDP; Opera Mini/1.0*)*] -Parent=Opera Mini -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/1.1*)*] -Parent=Opera Mini -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/1.2*)*] -Parent=Opera Mini -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Opera/* (J2ME/MIDP; Opera Mini/2.0*)*] -Parent=Opera Mini -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/3.0*)*] -Parent=Opera Mini -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/3.1*)*] -Parent=Opera Mini -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/4.0*)*] -Parent=Opera Mini -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/4.1*)*] -Parent=Opera Mini -Version=4.1 -MajorVer=4 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/4.2*)*] -Parent=Opera Mini -Version=4.2 -MajorVer=4 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera Mobile - -[Opera Mobile] -Parent=DefaultProperties -Browser=Opera Mobi -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Opera/9.5 (Microsoft Windows; PPC; *Opera Mobile/*)] -Parent=Opera Mobile -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Opera/9.5 (Microsoft Windows; PPC; Opera Mobi/*)] -Parent=Opera Mobile -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Opera/9.51 Beta (Microsoft Windows; PPC; Opera Mobi/*)*] -Parent=Opera Mobile -Version=9.51 -MajorVer=9 -MinorVer=51 -Beta=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Playstation - -[Playstation] -Parent=DefaultProperties -Browser=Playstation -Platform=WAP -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Mozilla/* (PLAYSTATION *; *)] -Parent=Playstation -Browser=PlayStation 3 -Frames=false - -[Mozilla/* (PSP (PlayStation Portable); *)] -Parent=Playstation - -[Sony PS2 (Linux)] -Parent=Playstation -Browser=Sony PS2 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Pocket PC - -[Pocket PC] -Parent=DefaultProperties -Browser=Pocket PC -Platform=WinCE -Win32=true -Frames=true -Tables=true -Cookies=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*(compatible; MSIE *.*; Windows CE; PPC; *)] -Parent=Pocket PC - -[HTC-*/* Mozilla/* (compatible; MSIE *.*; Windows CE*)*] -Parent=Pocket PC -Win32=true - -[Mozilla/* (compatible; MSPIE *.*; *Windows CE*)*] -Parent=Pocket PC -Win32=true - -[T-Mobile* Mozilla/* (compatible; MSIE *.*; Windows CE; *)] -Parent=Pocket PC - -[Vodafone* Mozilla/* (compatible; MSIE *.*; Windows CE; *)*] -Parent=Pocket PC - -[Windows CE (Pocket PC) - Version *.*] -Parent=Pocket PC -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SEMC Browser - -[SEMC Browser] -Parent=DefaultProperties -Browser=SEMC Browser -Platform=JAVA -Tables=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*SEMC-Browser/*] -Parent=SEMC Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SonyEricsson - -[SonyEricsson] -Parent=DefaultProperties -Browser=SonyEricsson -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*Ericsson*] -Parent=SonyEricsson - -[*SonyEricsson*] -Parent=SonyEricsson - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netbox - -[Netbox] -Parent=DefaultProperties -Browser=Netbox -Frames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/3.01 (compatible; Netbox/*; Linux*)] -Parent=Netbox -Browser=Netbox -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PowerTV - -[PowerTV] -Parent=DefaultProperties -Browser=PowerTV -Platform=PowerTV -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/4.0 PowerTV/1.5 (Compatible; Spyglass DM 3.2.1, EXPLORER)] -Parent=PowerTV -Version=1.5 -MajorVer=1 -MinorVer=5 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WebTV/MSNTV - -[WebTV] -Parent=DefaultProperties -Browser=WebTV/MSNTV -Platform=WebTV -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/3.0 WebTV/1.*(compatible; MSIE 2.0)] -Parent=WebTV -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/4.0 WebTV/2.0*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/4.0 WebTV/2.1*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/4.0 WebTV/2.2*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Mozilla/4.0 WebTV/2.3*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.3 -MajorVer=2 -MinorVer=3 - -[Mozilla/4.0 WebTV/2.4*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.4 -MajorVer=2 -MinorVer=4 - -[Mozilla/4.0 WebTV/2.5*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.5 -MajorVer=2 -MinorVer=5 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.6*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.6 -MajorVer=2 -MinorVer=6 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.7*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.7 -MajorVer=2 -MinorVer=7 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.8*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.8 -MajorVer=2 -MinorVer=8 -JavaApplets=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.9*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.9 -MajorVer=2 -MinorVer=9 -JavaApplets=true -CssVersion=1 -supportsCSS=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Amaya - -[Amaya] -Parent=DefaultProperties -Browser=Amaya -Tables=true -Cookies=true - -[amaya/7.*] -Parent=Amaya -Version=7.0 -MajorVer=7 -MinorVer=0 - -[amaya/8.0*] -Parent=Amaya -Version=8.0 -MajorVer=8 -MinorVer=0 -CssVersion=2 -supportsCSS=true - -[amaya/8.1*] -Parent=Amaya -Version=8.1 -MajorVer=8 -MinorVer=1 -CssVersion=2 -supportsCSS=true - -[amaya/8.2*] -Parent=Amaya -Version=8.2 -MajorVer=8 -MinorVer=2 -CssVersion=2 -supportsCSS=true - -[amaya/8.3*] -Parent=Amaya -Version=8.3 -MajorVer=8 -MinorVer=3 -CssVersion=2 -supportsCSS=true - -[amaya/8.4*] -Parent=Amaya -Version=8.4 -MajorVer=8 -MinorVer=4 -CssVersion=2 -supportsCSS=true - -[amaya/8.5*] -Parent=Amaya -Version=8.5 -MajorVer=8 -MinorVer=5 -CssVersion=2 -supportsCSS=true - -[amaya/8.6*] -Parent=Amaya -Version=8.6 -MajorVer=8 -MinorVer=6 -CssVersion=2 -supportsCSS=true - -[amaya/8.7*] -Parent=Amaya -Version=8.7 -MajorVer=8 -MinorVer=7 -CssVersion=2 -supportsCSS=true - -[amaya/8.8*] -Parent=Amaya -Version=8.8 -MajorVer=8 -MinorVer=8 -CssVersion=2 -supportsCSS=true - -[amaya/8.9*] -Parent=Amaya -Version=8.9 -MajorVer=8 -MinorVer=9 -CssVersion=2 -supportsCSS=true - -[amaya/9.0*] -Parent=Amaya -Version=9.0 -MajorVer=8 -MinorVer=0 -CssVersion=2 -supportsCSS=true - -[amaya/9.1*] -Parent=Amaya -Version=9.1 -MajorVer=9 -MinorVer=1 -CssVersion=2 -supportsCSS=true - -[amaya/9.2*] -Parent=Amaya -Version=9.2 -MajorVer=9 -MinorVer=2 -CssVersion=2 -supportsCSS=true - -[amaya/9.3*] -Parent=Amaya -Version=9.3 -MajorVer=9 -MinorVer=3 - -[amaya/9.4*] -Parent=Amaya -Version=9.4 -MajorVer=9 -MinorVer=4 - -[amaya/9.5*] -Parent=Amaya -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Emacs-w3m/*] -Parent=Emacs/W3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Links - -[Links] -Parent=DefaultProperties -Browser=Links -Frames=true -Tables=true - -[Links (0.9*; CYGWIN_NT-5.1*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=WinXP - -[Links (0.9*; Darwin*)] -Parent=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=MacPPC - -[Links (0.9*; FreeBSD*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=FreeBSD - -[Links (0.9*; Linux*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Linux - -[Links (0.9*; OS/2*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=OS/2 - -[Links (0.9*; Unix*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Unix - -[Links (0.9*; Win32*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Win32 -Win32=true - -[Links (1.0*; CYGWIN_NT-5.1*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP - -[Links (1.0*; FreeBSD*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=FreeBSD - -[Links (1.0*; Linux*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Linux - -[Links (1.0*; OS/2*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=OS/2 - -[Links (1.0*; Unix*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Unix - -[Links (1.0*; Win32*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win32 -Win32=true - -[Links (2.0*; Linux*)] -Parent=Links -Browser=Links -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Linux - -[Links (2.1*; FreeBSD*)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=FreeBSD - -[Links (2.1*; Linux *)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=Linux - -[Links (2.1*; OpenBSD*)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=OpenBSD - -[Links (2.2*; FreeBSD*)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=FreeBSD - -[Links (2.2*; Linux *)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=Linux - -[Links (2.2*; OpenBSD*)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=OpenBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lynx - -[Lynx] -Parent=DefaultProperties -Browser=Lynx -Frames=true -Tables=true - -[Lynx *] -Parent=Lynx -Browser=Lynx - -[Lynx/2.3*] -Parent=Lynx -Browser=Lynx -Version=2.3 -MajorVer=2 -MinorVer=3 - -[Lynx/2.4*] -Parent=Lynx -Browser=Lynx -Version=2.4 -MajorVer=2 -MinorVer=4 - -[Lynx/2.5*] -Parent=Lynx -Browser=Lynx -Version=2.5 -MajorVer=2 -MinorVer=5 - -[Lynx/2.6*] -Parent=Lynx -Browser=Lynx -Version=2.6 -MajorVer=2 -MinorVer=6 - -[Lynx/2.7*] -Parent=Lynx -Browser=Lynx -Version=2.7 -MajorVer=2 -MinorVer=7 - -[Lynx/2.8*] -Parent=Lynx -Browser=Lynx -Version=2.8 -MajorVer=2 -MinorVer=8 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NCSA Mosaic - -[Mosaic] -Parent=DefaultProperties -Browser=Mosaic - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; w3m - -[w3m] -Parent=DefaultProperties -Browser=w3m -Frames=true -Tables=true - -[w3m/0.1*] -Parent=w3m -Browser=w3m -Version=0.1 -MajorVer=0 -MinorVer=1 - -[w3m/0.2*] -Parent=w3m -Browser=w3m -Version=0.2 -MajorVer=0 -MinorVer=2 - -[w3m/0.3*] -Parent=w3m -Browser=w3m -Version=0.3 -MajorVer=0 -MinorVer=3 - -[w3m/0.4*] -Parent=w3m -Browser=w3m -Version=0.4 -MajorVer=0 -MinorVer=4 -Cookies=true - -[w3m/0.5*] -Parent=w3m -Browser=w3m -Version=0.5 -MajorVer=0 -MinorVer=5 -Cookies=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.10 - -[ELinks 0.10] -Parent=DefaultProperties -Browser=ELinks -Version=0.10 -MinorVer=10 -Frames=true -Tables=true - -[ELinks (0.10*; *AIX*)] -Parent=ELinks 0.10 -Platform=AIX - -[ELinks (0.10*; *BeOS*)] -Parent=ELinks 0.10 -Platform=BeOS - -[ELinks (0.10*; *CygWin*)] -Parent=ELinks 0.10 -Platform=CygWin - -[ELinks (0.10*; *Darwin*)] -Parent=ELinks 0.10 -Platform=Darwin - -[ELinks (0.10*; *Digital Unix*)] -Parent=ELinks 0.10 -Platform=Digital Unix - -[ELinks (0.10*; *FreeBSD*)] -Parent=ELinks 0.10 -Platform=FreeBSD - -[ELinks (0.10*; *HPUX*)] -Parent=ELinks 0.10 -Platform=HP-UX - -[ELinks (0.10*; *IRIX*)] -Parent=ELinks 0.10 -Platform=IRIX - -[ELinks (0.10*; *Linux*)] -Parent=ELinks 0.10 -Platform=Linux - -[ELinks (0.10*; *NetBSD*)] -Parent=ELinks 0.10 -Platform=NetBSD - -[ELinks (0.10*; *OpenBSD*)] -Parent=ELinks 0.10 -Platform=OpenBSD - -[ELinks (0.10*; *OS/2*)] -Parent=ELinks 0.10 -Platform=OS/2 - -[ELinks (0.10*; *RISC*)] -Parent=ELinks 0.10 -Platform=RISC OS - -[ELinks (0.10*; *Solaris*)] -Parent=ELinks 0.10 -Platform=Solaris - -[ELinks (0.10*; *Unix*)] -Parent=ELinks 0.10 -Platform=Unix - -[ELinks/0.10* (*AIX*)] -Parent=ELinks 0.10 -Platform=AIX - -[ELinks/0.10* (*BeOS*)] -Parent=ELinks 0.10 -Platform=BeOS - -[ELinks/0.10* (*CygWin*)] -Parent=ELinks 0.10 -Platform=CygWin - -[ELinks/0.10* (*Darwin*)] -Parent=ELinks 0.10 -Platform=Darwin - -[ELinks/0.10* (*Digital Unix*)] -Parent=ELinks 0.10 -Platform=Digital Unix - -[ELinks/0.10* (*FreeBSD*)] -Parent=ELinks 0.10 -Platform=FreeBSD - -[ELinks/0.10* (*HPUX*)] -Parent=ELinks 0.10 -Platform=HP-UX - -[ELinks/0.10* (*IRIX*)] -Parent=ELinks 0.10 -Platform=IRIX - -[ELinks/0.10* (*Linux*)] -Parent=ELinks 0.10 -Platform=Linux - -[ELinks/0.10* (*NetBSD*)] -Parent=ELinks 0.10 -Platform=NetBSD - -[ELinks/0.10* (*OpenBSD*)] -Parent=ELinks 0.10 -Platform=OpenBSD - -[ELinks/0.10* (*OS/2*)] -Parent=ELinks 0.10 -Platform=OS/2 - -[ELinks/0.10* (*RISC*)] -Parent=ELinks 0.10 -Platform=RISC OS - -[ELinks/0.10* (*Solaris*)] -Parent=ELinks 0.10 -Platform=Solaris - -[ELinks/0.10* (*Unix*)] -Parent=ELinks 0.10 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.11 - -[ELinks 0.11] -Parent=DefaultProperties -Browser=ELinks -Version=0.11 -MinorVer=11 -Frames=true -Tables=true - -[ELinks (0.11*; *AIX*)] -Parent=ELinks 0.11 -Platform=AIX - -[ELinks (0.11*; *BeOS*)] -Parent=ELinks 0.11 -Platform=BeOS - -[ELinks (0.11*; *CygWin*)] -Parent=ELinks 0.11 -Platform=CygWin - -[ELinks (0.11*; *Darwin*)] -Parent=ELinks 0.11 -Platform=Darwin - -[ELinks (0.11*; *Digital Unix*)] -Parent=ELinks 0.11 -Platform=Digital Unix - -[ELinks (0.11*; *FreeBSD*)] -Parent=ELinks 0.11 -Platform=FreeBSD - -[ELinks (0.11*; *HPUX*)] -Parent=ELinks 0.11 -Platform=HP-UX - -[ELinks (0.11*; *IRIX*)] -Parent=ELinks 0.11 -Platform=IRIX - -[ELinks (0.11*; *Linux*)] -Parent=ELinks 0.11 -Platform=Linux - -[ELinks (0.11*; *NetBSD*)] -Parent=ELinks 0.11 -Platform=NetBSD - -[ELinks (0.11*; *OpenBSD*)] -Parent=ELinks 0.11 -Platform=OpenBSD - -[ELinks (0.11*; *OS/2*)] -Parent=ELinks 0.11 -Platform=OS/2 - -[ELinks (0.11*; *RISC*)] -Parent=ELinks 0.11 -Platform=RISC OS - -[ELinks (0.11*; *Solaris*)] -Parent=ELinks 0.11 -Platform=Solaris - -[ELinks (0.11*; *Unix*)] -Parent=ELinks 0.11 -Platform=Unix - -[ELinks/0.11* (*AIX*)] -Parent=ELinks 0.11 -Platform=AIX - -[ELinks/0.11* (*BeOS*)] -Parent=ELinks 0.11 -Platform=BeOS - -[ELinks/0.11* (*CygWin*)] -Parent=ELinks 0.11 -Platform=CygWin - -[ELinks/0.11* (*Darwin*)] -Parent=ELinks 0.11 -Platform=Darwin - -[ELinks/0.11* (*Digital Unix*)] -Parent=ELinks 0.11 -Platform=Digital Unix - -[ELinks/0.11* (*FreeBSD*)] -Parent=ELinks 0.11 -Platform=FreeBSD - -[ELinks/0.11* (*HPUX*)] -Parent=ELinks 0.11 -Platform=HP-UX - -[ELinks/0.11* (*IRIX*)] -Parent=ELinks 0.11 -Platform=IRIX - -[ELinks/0.11* (*Linux*)] -Parent=ELinks 0.11 -Platform=Linux - -[ELinks/0.11* (*NetBSD*)] -Parent=ELinks 0.11 -Platform=NetBSD - -[ELinks/0.11* (*OpenBSD*)] -Parent=ELinks 0.11 -Platform=OpenBSD - -[ELinks/0.11* (*OS/2*)] -Parent=ELinks 0.11 -Platform=OS/2 - -[ELinks/0.11* (*RISC*)] -Parent=ELinks 0.11 -Platform=RISC OS - -[ELinks/0.11* (*Solaris*)] -Parent=ELinks 0.11 -Platform=Solaris - -[ELinks/0.11* (*Unix*)] -Parent=ELinks 0.11 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.12 - -[ELinks 0.12] -Parent=DefaultProperties -Browser=ELinks -Version=0.12 -MinorVer=12 -Frames=true -Tables=true - -[ELinks (0.12*; *AIX*)] -Parent=ELinks 0.12 -Platform=AIX - -[ELinks (0.12*; *BeOS*)] -Parent=ELinks 0.12 -Platform=BeOS - -[ELinks (0.12*; *CygWin*)] -Parent=ELinks 0.12 -Platform=CygWin - -[ELinks (0.12*; *Darwin*)] -Parent=ELinks 0.12 -Platform=Darwin - -[ELinks (0.12*; *Digital Unix*)] -Parent=ELinks 0.12 -Platform=Digital Unix - -[ELinks (0.12*; *FreeBSD*)] -Parent=ELinks 0.12 -Platform=FreeBSD - -[ELinks (0.12*; *HPUX*)] -Parent=ELinks 0.12 -Platform=HP-UX - -[ELinks (0.12*; *IRIX*)] -Parent=ELinks 0.12 -Platform=IRIX - -[ELinks (0.12*; *Linux*)] -Parent=ELinks 0.12 -Platform=Linux - -[ELinks (0.12*; *NetBSD*)] -Parent=ELinks 0.12 -Platform=NetBSD - -[ELinks (0.12*; *OpenBSD*)] -Parent=ELinks 0.12 -Platform=OpenBSD - -[ELinks (0.12*; *OS/2*)] -Parent=ELinks 0.12 -Platform=OS/2 - -[ELinks (0.12*; *RISC*)] -Parent=ELinks 0.12 -Platform=RISC OS - -[ELinks (0.12*; *Solaris*)] -Parent=ELinks 0.12 -Platform=Solaris - -[ELinks (0.12*; *Unix*)] -Parent=ELinks 0.12 -Platform=Unix - -[ELinks/0.12* (*AIX*)] -Parent=ELinks 0.12 -Platform=AIX - -[ELinks/0.12* (*BeOS*)] -Parent=ELinks 0.12 -Platform=BeOS - -[ELinks/0.12* (*CygWin*)] -Parent=ELinks 0.12 -Platform=CygWin - -[ELinks/0.12* (*Darwin*)] -Parent=ELinks 0.12 -Platform=Darwin - -[ELinks/0.12* (*Digital Unix*)] -Parent=ELinks 0.12 -Platform=Digital Unix - -[ELinks/0.12* (*FreeBSD*)] -Parent=ELinks 0.12 -Platform=FreeBSD - -[ELinks/0.12* (*HPUX*)] -Parent=ELinks 0.12 -Platform=HP-UX - -[ELinks/0.12* (*IRIX*)] -Parent=ELinks 0.12 -Platform=IRIX - -[ELinks/0.12* (*Linux*)] -Parent=ELinks 0.12 -Platform=Linux - -[ELinks/0.12* (*NetBSD*)] -Parent=ELinks 0.12 -Platform=NetBSD - -[ELinks/0.12* (*OpenBSD*)] -Parent=ELinks 0.12 -Platform=OpenBSD - -[ELinks/0.12* (*OS/2*)] -Parent=ELinks 0.12 -Platform=OS/2 - -[ELinks/0.12* (*RISC*)] -Parent=ELinks 0.12 -Platform=RISC OS - -[ELinks/0.12* (*Solaris*)] -Parent=ELinks 0.12 -Platform=Solaris - -[ELinks/0.12* (*Unix*)] -Parent=ELinks 0.12 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.9 - -[ELinks 0.9] -Parent=DefaultProperties -Browser=ELinks -Version=0.9 -MinorVer=9 -Frames=true -Tables=true - -[ELinks (0.9*; *AIX*)] -Parent=ELinks 0.9 -Platform=AIX - -[ELinks (0.9*; *BeOS*)] -Parent=ELinks 0.9 -Platform=BeOS - -[ELinks (0.9*; *CygWin*)] -Parent=ELinks 0.9 -Platform=CygWin - -[ELinks (0.9*; *Darwin*)] -Parent=ELinks 0.9 -Platform=Darwin - -[ELinks (0.9*; *Digital Unix*)] -Parent=ELinks 0.9 -Platform=Digital Unix - -[ELinks (0.9*; *FreeBSD*)] -Parent=ELinks 0.9 -Platform=FreeBSD - -[ELinks (0.9*; *HPUX*)] -Parent=ELinks 0.9 -Platform=HP-UX - -[ELinks (0.9*; *IRIX*)] -Parent=ELinks 0.9 -Platform=IRIX - -[ELinks (0.9*; *Linux*)] -Parent=ELinks 0.9 -Platform=Linux - -[ELinks (0.9*; *NetBSD*)] -Parent=ELinks 0.9 -Platform=NetBSD - -[ELinks (0.9*; *OpenBSD*)] -Parent=ELinks 0.9 -Platform=OpenBSD - -[ELinks (0.9*; *OS/2*)] -Parent=ELinks 0.9 -Platform=OS/2 - -[ELinks (0.9*; *RISC*)] -Parent=ELinks 0.9 -Platform=RISC OS - -[ELinks (0.9*; *Solaris*)] -Parent=ELinks 0.9 -Platform=Solaris - -[ELinks (0.9*; *Unix*)] -Parent=ELinks 0.9 -Platform=Unix - -[ELinks/0.9* (*AIX*)] -Parent=ELinks 0.9 -Platform=AIX - -[ELinks/0.9* (*BeOS*)] -Parent=ELinks 0.9 -Platform=BeOS - -[ELinks/0.9* (*CygWin*)] -Parent=ELinks 0.9 -Platform=CygWin - -[ELinks/0.9* (*Darwin*)] -Parent=ELinks 0.9 -Platform=Darwin - -[ELinks/0.9* (*Digital Unix*)] -Parent=ELinks 0.9 -Platform=Digital Unix - -[ELinks/0.9* (*FreeBSD*)] -Parent=ELinks 0.9 -Platform=FreeBSD - -[ELinks/0.9* (*HPUX*)] -Parent=ELinks 0.9 -Platform=HP-UX - -[ELinks/0.9* (*IRIX*)] -Parent=ELinks 0.9 -Platform=IRIX - -[ELinks/0.9* (*Linux*)] -Parent=ELinks 0.9 -Platform=Linux - -[ELinks/0.9* (*NetBSD*)] -Parent=ELinks 0.9 -Platform=NetBSD - -[ELinks/0.9* (*OpenBSD*)] -Parent=ELinks 0.9 -Platform=OpenBSD - -[ELinks/0.9* (*OS/2*)] -Parent=ELinks 0.9 -Platform=OS/2 - -[ELinks/0.9* (*RISC*)] -Parent=ELinks 0.9 -Platform=RISC OS - -[ELinks/0.9* (*Solaris*)] -Parent=ELinks 0.9 -Platform=Solaris - -[ELinks/0.9* (*Unix*)] -Parent=ELinks 0.9 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AppleWebKit - -[AppleWebKit] -Parent=DefaultProperties -Browser=AppleWebKit -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (KHTML, like Gecko)] -Parent=AppleWebKit - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Camino - -[Camino] -Parent=DefaultProperties -Browser=Camino -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.7*] -Parent=Camino -Version=0.7 -MajorVer=0 -MinorVer=7 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.8*] -Parent=Camino -Version=0.8 -MajorVer=0 -MinorVer=8 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.9*] -Parent=Camino -Version=0.9 -MajorVer=0 -MinorVer=9 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.0*] -Parent=Camino -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.2*] -Parent=Camino -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.3*] -Parent=Camino -Version=1.3 -MajorVer=1 -MinorVer=3 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.4*] -Parent=Camino -Version=1.4 -MajorVer=1 -MinorVer=4 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.5*] -Parent=Camino -Version=1.5 -MajorVer=1 -MinorVer=5 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.6*] -Parent=Camino -Version=1.6 -MajorVer=1 -MinorVer=6 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chimera - -[Chimera] -Parent=DefaultProperties -Browser=Chimera -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Chimera/*] -Parent=Chimera -Platform=MacOSX - -[Mozilla/5.0 Gecko/* Chimera/*] -Parent=Chimera - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Dillo - -[Dillo] -Parent=DefaultProperties -Browser=Dillo -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -CssVersion=2 -supportsCSS=true - -[Dillo/0.6*] -Parent=Dillo -Version=0.6 -MajorVer=0 -MinorVer=6 - -[Dillo/0.7*] -Parent=Dillo -Version=0.7 -MajorVer=0 -MinorVer=7 - -[Dillo/0.8*] -Parent=Dillo -Version=0.8 -MajorVer=0 -MinorVer=8 - -[Dillo/2.0] -Parent=Dillo -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Emacs/W3 - -[Emacs/W3] -Parent=DefaultProperties -Browser=Emacs/W3 -Frames=true -Tables=true -Cookies=true - -[Emacs/W3/2.* (Unix*] -Parent=Emacs/W3 -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Unix - -[Emacs/W3/2.* (X11*] -Parent=Emacs/W3 -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Linux - -[Emacs/W3/3.* (Unix*] -Parent=Emacs/W3 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Unix - -[Emacs/W3/3.* (X11*] -Parent=Emacs/W3 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Linux - -[Emacs/W3/4.* (Unix*] -Parent=Emacs/W3 -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Unix - -[Emacs/W3/4.* (X11*] -Parent=Emacs/W3 -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; fantomas - -[fantomas] -Parent=DefaultProperties -Browser=fantomas -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/4.0 (cloakBrowser)] -Parent=fantomas -Browser=fantomas cloakBrowser - -[Mozilla/4.0 (fantomas shadowMaker Browser)] -Parent=fantomas -Browser=fantomas shadowMaker Browser - -[Mozilla/4.0 (fantomBrowser)] -Parent=fantomas -Browser=fantomas fantomBrowser - -[Mozilla/4.0 (fantomCrew Browser)] -Parent=fantomas -Browser=fantomas fantomCrew Browser - -[Mozilla/4.0 (stealthBrowser)] -Parent=fantomas -Browser=fantomas stealthBrowser - -[multiBlocker browser*] -Parent=fantomas -Browser=fantomas multiBlocker browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FrontPage - -[FrontPage] -Parent=DefaultProperties -Browser=FrontPage -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/?* (compatible; MS FrontPage*)] -Parent=FrontPage - -[MSFrontPage/*] -Parent=FrontPage - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Galeon - -[Galeon] -Parent=DefaultProperties -Browser=Galeon -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/1.*] -Parent=Galeon -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/2.*] -Parent=Galeon -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 Galeon/1.* (X11; Linux*)*] -Parent=Galeon -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 Galeon/2.* (X11; Linux*)*] -Parent=Galeon -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HP Secure Web Browser - -[HP Secure Web Browser] -Parent=DefaultProperties -Browser=HP Secure Web Browser -Platform=OpenVMS -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.0*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.1*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.2*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.3*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.4*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.4 -MajorVer=1 -MinorVer=4 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.5*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.5 -MajorVer=1 -MinorVer=5 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.6*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.6 -MajorVer=1 -MinorVer=6 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.7*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.7 -MajorVer=1 -MinorVer=7 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.8*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.8 -MajorVer=1 -MinorVer=8 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IBrowse - -[IBrowse] -Parent=DefaultProperties -Browser=IBrowse -Platform=Amiga -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Arexx (compatible; MSIE 6.0; AmigaOS5.0) IBrowse 4.0] -Parent=IBrowse -Version=4.0 -MajorVer=4 -MinorVer=0 - -[IBrowse/1.22 (AmigaOS *)] -Parent=IBrowse -Version=1.22 -MajorVer=1 -MinorVer=22 - -[IBrowse/2.1 (AmigaOS *)] -Parent=IBrowse -Version=2.1 -MajorVer=2 -MinorVer=1 - -[IBrowse/2.2 (AmigaOS *)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=2 - -[IBrowse/2.3 (AmigaOS *)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=3 - -[Mozilla/* (Win98; I) IBrowse/2.1 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/* (Win98; I) IBrowse/2.2 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Mozilla/* (Win98; I) IBrowse/2.3 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.3 -MajorVer=2 -MinorVer=3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iCab - -[iCab] -Parent=DefaultProperties -Browser=iCab -Frames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[iCab/2.7* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=Mac68K - -[iCab/2.7* (Macintosh; ?; PPC*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=MacPPC - -[iCab/2.8* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacOSX - -[iCab/2.8* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=Mac68K - -[iCab/2.8* (Macintosh; ?; PPC)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacPPC - -[iCab/2.9* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacOSX - -[iCab/2.9* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=Mac68K - -[iCab/2.9* (Macintosh; ?; PPC*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacPPC - -[iCab/3.0* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[iCab/3.0* (Macintosh; ?; PPC*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacPPC -CssVersion=2 -supportsCSS=true - -[iCab/4.0 (Macintosh; U; *Mac OS X)] -Parent=iCab -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (compatible; iCab 3.0*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; iCab 3.0*; Macintosh; ?; PPC*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacPPC -CssVersion=2 -supportsCSS=true - -[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; 68K*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=Mac68K - -[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacOSX - -[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacOSX - -[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 4.2*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iSiloX - -[iSiloX] -Parent=DefaultProperties -Browser=iSiloX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -Crawler=true -CssVersion=2 -supportsCSS=true - -[iSiloX/4.0* MacOS] -Parent=iSiloX -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacPPC - -[iSiloX/4.0* Windows/32] -Parent=iSiloX -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Win32 -Win32=true - -[iSiloX/4.1* MacOS] -Parent=iSiloX -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=MacPPC - -[iSiloX/4.1* Windows/32] -Parent=iSiloX -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=Win32 -Win32=true - -[iSiloX/4.2* MacOS] -Parent=iSiloX -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=MacPPC - -[iSiloX/4.2* Windows/32] -Parent=iSiloX -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=Win32 -Win32=true - -[iSiloX/4.3* MacOS] -Parent=iSiloX -Version=4.3 -MajorVer=4 -MinorVer=4 -Platform=MacOSX - -[iSiloX/4.3* Windows/32] -Parent=iSiloX -Version=4.3 -MajorVer=4 -MinorVer=3 -Platform=Win32 -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycoris Desktop/LX - -[Lycoris Desktop/LX] -Parent=DefaultProperties -Browser=Lycoris Desktop/LX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -Crawler=true - -[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*: Desktop/LX Amethyst) Gecko/*] -Parent=Lycoris Desktop/LX -Version=1.1 -MajorVer=1 -MinorVer=1 -Platform=Linux - -[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*; Desktop/LX Amethyst) Gecko/*] -Parent=Lycoris Desktop/LX -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mosaic - -[Mosaic] -Parent=DefaultProperties -Browser=Mosaic -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[Mozilla/4.0 (VMS_Mosaic)] -Parent=Mosaic -Platform=OpenVMS - -[VMS_Mosaic/3.7*] -Parent=Mosaic -Version=3.7 -MajorVer=3 -MinorVer=7 -Platform=OpenVMS - -[VMS_Mosaic/3.8*] -Parent=Mosaic -Version=3.8 -MajorVer=3 -MinorVer=8 -Platform=OpenVMS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetPositive - -[NetPositive] -Parent=DefaultProperties -Browser=NetPositive -Platform=BeOS -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[*NetPositive/2.2*] -Parent=NetPositive -Version=2.2 -MajorVer=2 -MinorVer=2 - -[*NetPositive/2.2*BeOS*] -Parent=NetPositive -Version=2.2 -MajorVer=2 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OmniWeb - -[OmniWeb] -Parent=DefaultProperties -Browser=OmniWeb -Platform=MacOSX -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v4*] -Parent=OmniWeb -Version=4.5 -MajorVer=4 -MinorVer=5 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v5*] -Parent=OmniWeb -Version=5. -MajorVer=5 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v6*] -Parent=OmniWeb -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/4*] -Parent=OmniWeb -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacPPC - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/5*] -Parent=OmniWeb -Version=5.0 -MajorVer=5 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/6*] -Parent=OmniWeb -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=MacPPC - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.34] -Parent=OmniWeb -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.34] -Parent=OmniWeb -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v607] -Parent=OmniWeb -Version=5.5 -MajorVer=5 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v607] -Parent=OmniWeb -Version=5.5 -MajorVer=5 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/522+ (KHTML, like Gecko, Safari/522) OmniWeb/v613] -Parent=OmniWeb -Version=5.6 -MajorVer=5 -MinorVer=6 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/522+ (KHTML, like Gecko, Safari/522) OmniWeb/v613] -Parent=OmniWeb -Version=5.6 -MajorVer=5 -MinorVer=6 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v496] -Parent=OmniWeb -Version=4.5 -MajorVer=4 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558.36 ] -Parent=OmniWeb -Version=5.0 -MajorVer=5 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Shiira - -[Shiira] -Parent=DefaultProperties -Browser=Shiira -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/0.9*] -Parent=Shiira -Version=0.9 -MajorVer=0 -MinorVer=9 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.0*] -Parent=Shiira -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.1*] -Parent=Shiira -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.2*] -Parent=Shiira -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/2.1*] -Parent=Shiira -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/2.2*] -Parent=Shiira -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Windows Maker] -Parent=DefaultProperties -Browser=WMaker -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -VBScript=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[WMaker*] -Parent=Windows Maker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.0 - -[K-Meleon 1.0] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.0 -MajorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.1 - -[K-Meleon 1.1] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.1 -MajorVer=1 -MinorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.5 - -[K-Meleon 1.5] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.5 -MajorVer=1 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Platform=WinVista - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 3.0 - -[Konqueror 3.0] -Parent=DefaultProperties -Browser=Konqueror -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[*Konqueror/3.0*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -IFrames=false - -[*Konqueror/3.0*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=FreeBSD -IFrames=false - -[*Konqueror/3.0*Linux*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Linux -IFrames=false - -[*Konqueror/3.1*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 - -[*Konqueror/3.1*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 -Platform=FreeBSD - -[*Konqueror/3.1*Linux*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 - -[*Konqueror/3.2*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 - -[*Konqueror/3.2*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 -Platform=FreeBSD - -[*Konqueror/3.2*Linux*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 -Platform=Linux - -[*Konqueror/3.3*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 - -[*Konqueror/3.3*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=FreeBSD - -[*Konqueror/3.3*Linux*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=Linux - -[*Konqueror/3.3*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=OpenBSD - -[*Konqueror/3.4*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 - -[*Konqueror/3.4*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=FreeBSD - -[*Konqueror/3.4*Linux*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=Linux - -[*Konqueror/3.4*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=OpenBSD - -[*Konqueror/3.5*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 - -[*Konqueror/3.5*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=FreeBSD - -[*Konqueror/3.5*Linux*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=Linux - -[*Konqueror/3.5*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=OpenBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.0 - -[Konqueror 4.0] -Parent=DefaultProperties -Browser=Konqueror -Version=4.0 -MajorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.0*; Debian) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; *Linux) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; FreeBSD) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; NetBSD) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.1 - -[Konqueror 4.1] -Parent=DefaultProperties -Browser=Konqueror -Version=4.1 -MajorVer=4 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.1*; *Linux*) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.1*; Debian) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.1*; FreeBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.1*; NetBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.2 - -[Konqueror 4.2] -Parent=DefaultProperties -Browser=Konqueror -Version=4.2 -MajorVer=4 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.2*; *Linux*) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.2*; Debian) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.2*; FreeBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.2*; NetBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari - -[Safari] -Parent=DefaultProperties -Browser=Safari -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/100*] -Parent=Safari -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/125*] -Parent=Safari -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/312*] -Parent=Safari -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/412*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/416*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/417*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/418*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/419*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/52*] -Parent=Safari -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/85*] -Parent=Safari -Version=1.0 -MajorVer=1 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.0 - -[Safari 3.0] -Parent=DefaultProperties -Browser=Safari -Version=3.0 -MajorVer=3 -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.1 - -[Safari 3.1] -Parent=DefaultProperties -Browser=Safari -Version=3.1 -MajorVer=3 -MinorVer=1 -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.2 - -[Safari 3.2] -Parent=DefaultProperties -Browser=Safari -Version=3.2 -MajorVer=3 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 4.0 - -[Safari 4.0] -Parent=DefaultProperties -Browser=Safari -Version=4.0 -MajorVer=4 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *) AppleWebKit/* (KHTML, like Gecko) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *) AppleWebKit/* (KHTML, like Gecko) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 7.0; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 7.0; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 10.0 - -[Opera 10.0] -Parent=DefaultProperties -Browser=Opera -Version=10.0 -MajorVer=10 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 10.0*] -Parent=Opera 10.0 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 10.0*] -Parent=Opera 10.0 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (Linux*)*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (Macintosh; *Mac OS X;*)*] -Parent=Opera 10.0 -Platform=MacOSX - -[Opera/10.0* (Windows 95*)*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Opera/10.0* (Windows 98*)*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Opera/10.0* (Windows CE*)*] -Parent=Opera 10.0 -Platform=WinCE -Win32=true - -[Opera/10.0* (Windows ME*)*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Opera/10.0* (Windows NT 4.0*)*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Opera/10.0* (Windows NT 5.0*)*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Opera/10.0* (Windows NT 5.1*)*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Opera/10.0* (Windows NT 5.2*)*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Opera/10.0* (Windows NT 6.0*)*] -Parent=Opera 10.0 -Platform=WinVista -Win32=true - -[Opera/10.0* (Windows NT 6.1*)*] -Parent=Opera 10.0 -Platform=Win7 - -[Opera/10.0* (Windows XP*)*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Opera/10.0* (X11; FreeBSD*)*] -Parent=Opera 10.0 -Platform=FreeBSD - -[Opera/10.0* (X11; Linux*)*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (X11; SunOS*)*] -Parent=Opera 10.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.0 - -[Opera 7.0] -Parent=DefaultProperties -Browser=Opera -Version=7.0 -MajorVer=7 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/3.0 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/3.0 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/3.0 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/3.0 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/3.0 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/3.0 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 2000) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 95) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 98) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows ME) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 4.0) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.0) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows XP) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.78 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.78 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/4.78 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/4.78 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/4.78 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/4.78 (Windows NT 5.1; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.78 (Windows Windows NT 5.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.78 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows NT 5.1; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Opera/7.0* (Windows 2000; ?)*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Opera/7.0* (Windows 95; ?)*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Opera/7.0* (Windows 98; ?)*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Opera/7.0* (Windows ME; ?)*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Opera/7.0* (Windows NT 4.0; ?)*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Opera/7.0* (Windows NT 5.0; ?)*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Opera/7.0* (Windows NT 5.1; ?)*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Opera/7.0* (Windows XP; ?)*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.1 - -[Opera 7.1] -Parent=DefaultProperties -Browser=Opera -Version=7.1 -MajorVer=7 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows 2000; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Opera/7.1* (Linux*; ?)*] -Parent=Opera 7.1 -Platform=Linux - -[Opera/7.1* (Windows 95; ?)*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Opera/7.1* (Windows 98; ?)*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Opera/7.1* (Windows ME; ?)*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Opera/7.1* (Windows NT 4.0; ?)*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Opera/7.1* (Windows NT 5.0; ?)*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Opera/7.1* (Windows NT 5.1; ?)*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Opera/7.1* (Windows XP; ?)*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.2 - -[Opera 7.2] -Parent=DefaultProperties -Browser=Opera -Version=7.2 -MajorVer=7 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.2*] -Parent=Opera 7.2 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows 2000; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Opera/7.2* (Linux*; ?)*] -Parent=Opera 7.2 -Platform=Linux - -[Opera/7.2* (Windows 95; ?)*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Opera/7.2* (Windows 98; ?)*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Opera/7.2* (Windows ME; ?)*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Opera/7.2* (Windows NT 4.0; ?)*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Opera/7.2* (Windows NT 5.0; ?)*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Opera/7.2* (Windows NT 5.1; ?)*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Opera/7.2* (Windows NT 5.2; ?)*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Opera/7.2* (Windows XP; ?)*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Opera/7.2* (X11; FreeBSD*; ?)*] -Parent=Opera 7.2 -Platform=FreeBSD - -[Opera/7.2* (X11; Linux*; ?)*] -Parent=Opera 7.2 -Platform=Linux - -[Opera/7.2* (X11; SunOS*)*] -Parent=Opera 7.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.5 - -[Opera 7.5] -Parent=DefaultProperties -Browser=Opera -Version=7.5 -MajorVer=7 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.5*] -Parent=Opera 7.5 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Opera/7.5* (Linux*; ?)*] -Parent=Opera 7.5 -Platform=Linux - -[Opera/7.5* (Macintosh; *Mac OS X; ?)*] -Parent=Opera 7.5 -Platform=MacOSX - -[Opera/7.5* (Windows 95; ?)*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Opera/7.5* (Windows 98; ?)*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Opera/7.5* (Windows ME; ?)*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Opera/7.5* (Windows NT 4.0; ?)*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Opera/7.5* (Windows NT 5.0; ?)*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Opera/7.5* (Windows NT 5.1; ?)*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Opera/7.5* (Windows NT 5.2; ?)*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Opera/7.5* (Windows XP; ?)*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Opera/7.5* (X11; FreeBSD*; ?)*] -Parent=Opera 7.5 -Platform=FreeBSD - -[Opera/7.5* (X11; Linux*; ?)*] -Parent=Opera 7.5 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.6 - -[Opera 7.6] -Parent=DefaultProperties -Browser=Opera -Version=7.6 -MajorVer=7 -MinorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.6*] -Parent=Opera 7.6 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Opera/7.6* (Linux*)*] -Parent=Opera 7.6 -Platform=Linux - -[Opera/7.6* (Macintosh; *Mac OS X; ?)*] -Parent=Opera 7.6 -Platform=MacOSX - -[Opera/7.6* (Windows 95*)*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Opera/7.6* (Windows 98*)*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Opera/7.6* (Windows ME*)*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Opera/7.6* (Windows NT 4.0*)*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Opera/7.6* (Windows NT 5.0*)*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Opera/7.6* (Windows NT 5.1*)*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Opera/7.6* (Windows NT 5.2*)*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Opera/7.6* (Windows XP*)*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Opera/7.6* (X11; FreeBSD*)*] -Parent=Opera 7.6 -Platform=FreeBSD - -[Opera/7.6* (X11; Linux*)*] -Parent=Opera 7.6 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.0 - -[Opera 8.0] -Parent=DefaultProperties -Browser=Opera -Version=8.0 -MajorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacOSX - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.0*] -Parent=Opera 8.0 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Opera/8.0* (Linux*)*] -Parent=Opera 8.0 -Platform=Linux - -[Opera/8.0* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.0 -Platform=MacOSX - -[Opera/8.0* (Windows 95*)*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Opera/8.0* (Windows 98*)*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Opera/8.0* (Windows CE*)*] -Parent=Opera 8.0 -Platform=WinCE -Win32=true - -[Opera/8.0* (Windows ME*)*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Opera/8.0* (Windows NT 4.0*)*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Opera/8.0* (Windows NT 5.0*)*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Opera/8.0* (Windows NT 5.1*)*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Opera/8.0* (Windows NT 5.2*)*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Opera/8.0* (Windows XP*)*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Opera/8.0* (X11; FreeBSD*)*] -Parent=Opera 8.0 -Platform=FreeBSD - -[Opera/8.0* (X11; Linux*)*] -Parent=Opera 8.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.1 - -[Opera 8.1] -Parent=DefaultProperties -Browser=Opera -Version=8.1 -MajorVer=8 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.1*] -Parent=Opera 8.1 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.1*] -Parent=Opera 8.1 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.1*] -Parent=Opera 8.1 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Opera/8.1* (Linux*)*] -Parent=Opera 8.1 -Platform=Linux - -[Opera/8.1* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.1 -Platform=MacOSX - -[Opera/8.1* (Windows 95*)*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Opera/8.1* (Windows 98*)*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Opera/8.1* (Windows CE*)*] -Parent=Opera 8.1 -Platform=WinCE -Win32=true - -[Opera/8.1* (Windows ME*)*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Opera/8.1* (Windows NT 4.0*)*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Opera/8.1* (Windows NT 5.0*)*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Opera/8.1* (Windows NT 5.1*)*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Opera/8.1* (Windows NT 5.2*)*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Opera/8.1* (Windows XP*)*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Opera/8.1* (X11; FreeBSD*)*] -Parent=Opera 8.1 -Platform=FreeBSD - -[Opera/8.1* (X11; Linux*)*] -Parent=Opera 8.1 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.5 - -[Opera 8.5] -Parent=DefaultProperties -Browser=Opera -Version=8.5 -MajorVer=8 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X;*) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.5*] -Parent=Opera 8.5 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (Macintosh; PPC Mac OS X;*) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Opera/8.5* (Linux*)*] -Parent=Opera 8.5 -Platform=Linux - -[Opera/8.5* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.5 -Platform=MacOSX - -[Opera/8.5* (Windows 95*)*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Opera/8.5* (Windows 98*)*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Opera/8.5* (Windows CE*)*] -Parent=Opera 8.5 -Platform=WinCE -Win32=true - -[Opera/8.5* (Windows ME*)*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Opera/8.5* (Windows NT 4.0*)*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Opera/8.5* (Windows NT 5.0*)*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Opera/8.5* (Windows NT 5.1*)*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Opera/8.5* (Windows NT 5.2*)*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Opera/8.5* (Windows XP*)*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Opera/8.5* (X11; FreeBSD*)*] -Parent=Opera 8.5 -Platform=FreeBSD - -[Opera/8.5* (X11; Linux*)*] -Parent=Opera 8.5 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.0 - -[Opera 9.0] -Parent=DefaultProperties -Browser=Opera -Version=9.0 -MajorVer=9 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.0*] -Parent=Opera 9.0 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.0*] -Parent=Opera 9.0 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (X11; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Opera/9.0* (Linux*)*] -Parent=Opera 9.0 -Platform=Linux - -[Opera/9.0* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.0 -Platform=MacOSX - -[Opera/9.0* (Windows 95*)*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Opera/9.0* (Windows 98*)*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Opera/9.0* (Windows CE*)*] -Parent=Opera 9.0 -Platform=WinCE -Win32=true - -[Opera/9.0* (Windows ME*)*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Opera/9.0* (Windows NT 4.0*)*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Opera/9.0* (Windows NT 5.0*)*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Opera/9.0* (Windows NT 5.1*)*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Opera/9.0* (Windows NT 5.2*)*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Opera/9.0* (Windows NT 6.0*)*] -Parent=Opera 9.0 -Platform=WinVista -Win32=true - -[Opera/9.0* (Windows XP*)*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Opera/9.0* (X11; FreeBSD*)*] -Parent=Opera 9.0 -Platform=FreeBSD - -[Opera/9.0* (X11; Linux*)*] -Parent=Opera 9.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.1 - -[Opera 9.1] -Parent=DefaultProperties -Browser=Opera -Version=9.1 -MajorVer=9 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.1*] -Parent=Opera 9.1 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.1*] -Parent=Opera 9.1 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Mozilla/* (X11; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (Linux*)*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.1 -Platform=MacOSX - -[Opera/9.1* (Windows 95*)*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Opera/9.1* (Windows 98*)*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Opera/9.1* (Windows CE*)*] -Parent=Opera 9.1 -Platform=WinCE -Win32=true - -[Opera/9.1* (Windows ME*)*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Opera/9.1* (Windows NT 4.0*)*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Opera/9.1* (Windows NT 5.0*)*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Opera/9.1* (Windows NT 5.1*)*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Opera/9.1* (Windows NT 5.2*)*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Opera/9.1* (Windows NT 6.0*)*] -Parent=Opera 9.1 -Platform=WinVista -Win32=true - -[Opera/9.1* (Windows XP*)*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Opera/9.1* (X11; FreeBSD*)*] -Parent=Opera 9.1 -Platform=FreeBSD - -[Opera/9.1* (X11; Linux*)*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (X11; SunOS*)*] -Parent=Opera 9.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.2 - -[Opera 9.2] -Parent=DefaultProperties -Browser=Opera -Version=9.2 -MajorVer=9 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.2*] -Parent=Opera 9.2 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.2*] -Parent=Opera 9.2 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (Linux*)*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.2 -Platform=MacOSX - -[Opera/9.2* (Windows 95*)*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Opera/9.2* (Windows 98*)*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Opera/9.2* (Windows CE*)*] -Parent=Opera 9.2 -Platform=WinCE -Win32=true - -[Opera/9.2* (Windows ME*)*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Opera/9.2* (Windows NT 4.0*)*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Opera/9.2* (Windows NT 5.0*)*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Opera/9.2* (Windows NT 5.1*)*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Opera/9.2* (Windows NT 5.2*)*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Opera/9.2* (Windows NT 6.0*)*] -Parent=Opera 9.2 -Platform=WinVista -Win32=true - -[Opera/9.2* (Windows NT 6.1*)*] -Parent=Opera 9.2 -Platform=Win7 - -[Opera/9.2* (Windows XP*)*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Opera/9.2* (X11; FreeBSD*)*] -Parent=Opera 9.2 -Platform=FreeBSD - -[Opera/9.2* (X11; Linux*)*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (X11; SunOS*)*] -Parent=Opera 9.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.3 - -[Opera 9.3] -Parent=DefaultProperties -Browser=Opera -Version=9.3 -MajorVer=9 -MinorVer=3 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.3*] -Parent=Opera 9.3 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.3*] -Parent=Opera 9.3 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (Linux*)*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.3 -Platform=MacOSX - -[Opera/9.3* (Windows 95*)*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Opera/9.3* (Windows 98*)*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Opera/9.3* (Windows CE*)*] -Parent=Opera 9.3 -Platform=WinCE -Win32=true - -[Opera/9.3* (Windows ME*)*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Opera/9.3* (Windows NT 4.0*)*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Opera/9.3* (Windows NT 5.0*)*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Opera/9.3* (Windows NT 5.1*)*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Opera/9.3* (Windows NT 5.2*)*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Opera/9.3* (Windows NT 6.0*)*] -Parent=Opera 9.3 -Platform=WinVista -Win32=true - -[Opera/9.3* (Windows NT 6.1*)*] -Parent=Opera 9.3 -Platform=Win7 - -[Opera/9.3* (Windows XP*)*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Opera/9.3* (X11; FreeBSD*)*] -Parent=Opera 9.3 -Platform=FreeBSD - -[Opera/9.3* (X11; Linux*)*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (X11; SunOS*)*] -Parent=Opera 9.3 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.4 - -[Opera 9.4] -Parent=DefaultProperties -Browser=Opera -Version=9.4 -MajorVer=9 -MinorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.4*] -Parent=Opera 9.4 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.4*] -Parent=Opera 9.4 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (Linux*)*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.4 -Platform=MacOSX - -[Opera/9.4* (Windows 95*)*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Opera/9.4* (Windows 98*)*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Opera/9.4* (Windows CE*)*] -Parent=Opera 9.4 -Platform=WinCE -Win32=true - -[Opera/9.4* (Windows ME*)*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Opera/9.4* (Windows NT 4.0*)*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Opera/9.4* (Windows NT 5.0*)*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Opera/9.4* (Windows NT 5.1*)*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Opera/9.4* (Windows NT 5.2*)*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Opera/9.4* (Windows NT 6.0*)*] -Parent=Opera 9.4 -Platform=WinVista -Win32=true - -[Opera/9.4* (Windows NT 6.1*)*] -Parent=Opera 9.4 -Platform=Win7 - -[Opera/9.4* (Windows XP*)*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Opera/9.4* (X11; FreeBSD*)*] -Parent=Opera 9.4 -Platform=FreeBSD - -[Opera/9.4* (X11; Linux*)*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (X11; SunOS*)*] -Parent=Opera 9.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.5 - -[Opera 9.5] -Parent=DefaultProperties -Browser=Opera -Version=9.5 -MajorVer=9 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.5*] -Parent=Opera 9.5 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.5*] -Parent=Opera 9.5 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (Linux*)*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.5 -Platform=MacOSX - -[Opera/9.5* (Windows 95*)*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Opera/9.5* (Windows 98*)*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Opera/9.5* (Windows CE*)*] -Parent=Opera 9.5 -Platform=WinCE -Win32=true - -[Opera/9.5* (Windows ME*)*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Opera/9.5* (Windows NT 4.0*)*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Opera/9.5* (Windows NT 5.0*)*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Opera/9.5* (Windows NT 5.1*)*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Opera/9.5* (Windows NT 5.2*)*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Opera/9.5* (Windows NT 6.0*)*] -Parent=Opera 9.5 -Platform=WinVista -Win32=true - -[Opera/9.5* (Windows NT 6.1*)*] -Parent=Opera 9.5 -Platform=Win7 - -[Opera/9.5* (Windows XP*)*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Opera/9.5* (X11; FreeBSD*)*] -Parent=Opera 9.5 -Platform=FreeBSD - -[Opera/9.5* (X11; Linux*)*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (X11; SunOS*)*] -Parent=Opera 9.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.6 - -[Opera 9.6] -Parent=DefaultProperties -Browser=Opera -Version=9.6 -MajorVer=9 -MinorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.6*] -Parent=Opera 9.6 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.6*] -Parent=Opera 9.6 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (Linux*)*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.6 -Platform=MacOSX - -[Opera/9.6* (Windows 95*)*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Opera/9.6* (Windows 98*)*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Opera/9.6* (Windows CE*)*] -Parent=Opera 9.6 -Platform=WinCE -Win32=true - -[Opera/9.6* (Windows ME*)*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Opera/9.6* (Windows NT 4.0*)*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Opera/9.6* (Windows NT 5.0*)*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Opera/9.6* (Windows NT 5.1*)*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Opera/9.6* (Windows NT 5.2*)*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Opera/9.6* (Windows NT 6.0*)*] -Parent=Opera 9.6 -Platform=WinVista -Win32=true - -[Opera/9.6* (Windows NT 6.1*)*] -Parent=Opera 9.6 -Platform=Win7 - -[Opera/9.6* (Windows XP*)*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Opera/9.6* (X11; FreeBSD*)*] -Parent=Opera 9.6 -Platform=FreeBSD - -[Opera/9.6* (X11; Linux*)*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (X11; SunOS*)*] -Parent=Opera 9.6 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.0 - -[Netscape 4.0] -Parent=DefaultProperties -Browser=Netscape -Version=4.0 -MajorVer=4 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0*(Macintosh*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=MacPPC - -[Mozilla/4.0*(Win95;*] -Parent=Netscape 4.0 -Platform=Win95 - -[Mozilla/4.0*(Win98;*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=Win98 - -[Mozilla/4.0*(WinNT*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=WinNT - -[Mozilla/4.0*(X11;*)] -Parent=Netscape 4.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.5 - -[Netscape 4.5] -Parent=DefaultProperties -Browser=Netscape -Version=4.5 -MajorVer=4 -MinorVer=5 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.5*(Macintosh; ?; PPC)] -Parent=Netscape 4.5 -Platform=MacPPC - -[Mozilla/4.5*(Win2000; ?)] -Parent=Netscape 4.5 -Platform=Win2000 - -[Mozilla/4.5*(Win95; ?)] -Parent=Netscape 4.5 -Platform=Win95 - -[Mozilla/4.5*(Win98; ?)] -Parent=Netscape 4.5 -Platform=Win98 - -[Mozilla/4.5*(WinME; ?)] -Parent=Netscape 4.5 -Platform=WinME - -[Mozilla/4.5*(WinNT; ?)] -Parent=Netscape 4.5 -Platform=WinNT - -[Mozilla/4.5*(WinXP; ?)] -Parent=Netscape 4.5 -Platform=WinXP - -[Mozilla/4.5*(X11*)] -Parent=Netscape 4.5 -Platform=Linux - -[Mozilla/4.51*(Macintosh; ?; PPC)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 - -[Mozilla/4.51*(Win2000; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win2000 - -[Mozilla/4.51*(Win95; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win95 - -[Mozilla/4.51*(Win98; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win98 - -[Mozilla/4.51*(WinME; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinME - -[Mozilla/4.51*(WinNT; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinNT - -[Mozilla/4.51*(WinXP; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinXP - -[Mozilla/4.51*(X11*)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.6 - -[Netscape 4.6] -Parent=DefaultProperties -Browser=Netscape -Version=4.6 -MajorVer=4 -MinorVer=6 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.6 * (OS/2; ?)] -Parent=Netscape 4.6 -Platform=OS/2 - -[Mozilla/4.6*(Macintosh; ?; PPC)] -Parent=Netscape 4.6 -Platform=MacPPC - -[Mozilla/4.6*(Win95; ?)] -Parent=Netscape 4.6 -Platform=Win95 - -[Mozilla/4.6*(Win98; ?)] -Parent=Netscape 4.6 -Platform=Win98 - -[Mozilla/4.6*(WinNT; ?)] -Parent=Netscape 4.6 -Platform=WinNT - -[Mozilla/4.61*(Macintosh; ?; PPC)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=MacPPC - -[Mozilla/4.61*(OS/2; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=OS/2 - -[Mozilla/4.61*(Win95; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=Win95 - -[Mozilla/4.61*(Win98; ?)] -Parent=Netscape 4.6 -Version=4.61 -Platform=Win98 - -[Mozilla/4.61*(WinNT; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=WinNT - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.7 - -[Netscape 4.7] -Parent=DefaultProperties -Browser=Netscape -Version=4.7 -MajorVer=4 -MinorVer=7 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.7 * (Win2000; ?)] -Parent=Netscape 4.7 -Platform=Win2000 - -[Mozilla/4.7*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=MacPPC - -[Mozilla/4.7*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win95 - -[Mozilla/4.7*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win98 - -[Mozilla/4.7*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=WinNT -Win32=true - -[Mozilla/4.7*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win2000 -Win32=true - -[Mozilla/4.7*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=WinXP -Win32=true - -[Mozilla/4.7*(WinNT; ?)*] -Parent=Netscape 4.7 -Platform=WinNT - -[Mozilla/4.7*(X11*)*] -Parent=Netscape 4.7 -Platform=Linux - -[Mozilla/4.7*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Platform=SunOS - -[Mozilla/4.71*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=MacPPC - -[Mozilla/4.71*(Win95; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win95 - -[Mozilla/4.71*(Win98; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win98 - -[Mozilla/4.71*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinNT -Win32=true - -[Mozilla/4.71*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win2000 -Win32=true - -[Mozilla/4.71*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinXP -Win32=true - -[Mozilla/4.71*(WinNT; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinNT - -[Mozilla/4.71*(X11*)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Linux - -[Mozilla/4.71*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=SunOS - -[Mozilla/4.72*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=MacPPC - -[Mozilla/4.72*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win95 - -[Mozilla/4.72*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win98 - -[Mozilla/4.72*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinNT -Win32=true - -[Mozilla/4.72*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win2000 -Win32=true - -[Mozilla/4.72*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinXP -Win32=true - -[Mozilla/4.72*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinNT - -[Mozilla/4.72*(X11*)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Linux - -[Mozilla/4.72*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=SunOS - -[Mozilla/4.73*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=MacPPC - -[Mozilla/4.73*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win95 - -[Mozilla/4.73*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win98 - -[Mozilla/4.73*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinNT -Win32=true - -[Mozilla/4.73*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win2000 -Win32=true - -[Mozilla/4.73*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinXP -Win32=true - -[Mozilla/4.73*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinNT - -[Mozilla/4.73*(X11*)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Linux - -[Mozilla/4.73*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=SunOS - -[Mozilla/4.74*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=MacPPC - -[Mozilla/4.74*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win95 - -[Mozilla/4.74*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win98 - -[Mozilla/4.74*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinNT -Win32=true - -[Mozilla/4.74*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win2000 -Win32=true - -[Mozilla/4.74*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinXP -Win32=true - -[Mozilla/4.74*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinNT - -[Mozilla/4.74*(X11*)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Linux - -[Mozilla/4.74*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=SunOS - -[Mozilla/4.75*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=MacPPC - -[Mozilla/4.75*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win95 - -[Mozilla/4.75*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win98 - -[Mozilla/4.75*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinNT -Win32=true - -[Mozilla/4.75*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win2000 -Win32=true - -[Mozilla/4.75*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinXP -Win32=true - -[Mozilla/4.75*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinNT - -[Mozilla/4.75*(X11*)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Linux - -[Mozilla/4.75*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=SunOS - -[Mozilla/4.76*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=MacPPC - -[Mozilla/4.76*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win95 - -[Mozilla/4.76*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win98 - -[Mozilla/4.76*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinNT -Win32=true - -[Mozilla/4.76*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win2000 -Win32=true - -[Mozilla/4.76*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinXP -Win32=true - -[Mozilla/4.76*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinNT - -[Mozilla/4.76*(X11*)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Linux - -[Mozilla/4.76*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=SunOS - -[Mozilla/4.77*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=MacPPC - -[Mozilla/4.77*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win95 - -[Mozilla/4.77*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win98 - -[Mozilla/4.77*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinNT -Win32=true - -[Mozilla/4.77*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win2000 -Win32=true - -[Mozilla/4.77*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinXP -Win32=true - -[Mozilla/4.77*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinNT - -[Mozilla/4.77*(X11*)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Linux - -[Mozilla/4.77*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=SunOS - -[Mozilla/4.78*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=MacPPC - -[Mozilla/4.78*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win95 - -[Mozilla/4.78*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win98 - -[Mozilla/4.78*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinNT -Win32=true - -[Mozilla/4.78*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win2000 -Win32=true - -[Mozilla/4.78*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinXP -Win32=true - -[Mozilla/4.78*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinNT - -[Mozilla/4.78*(X11*)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Linux - -[Mozilla/4.78*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=SunOS - -[Mozilla/4.79*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=MacPPC - -[Mozilla/4.79*(Win95; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win95 - -[Mozilla/4.79*(Win98; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win98 - -[Mozilla/4.79*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinNT -Win32=true - -[Mozilla/4.79*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win2000 -Win32=true - -[Mozilla/4.79*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinXP -Win32=true - -[Mozilla/4.79*(WinNT; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinNT - -[Mozilla/4.79*(X11*)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Linux - -[Mozilla/4.79*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.8 - -[Netscape 4.8] -Parent=DefaultProperties -Browser=Netscape -Version=4.8 -MajorVer=4 -MinorVer=8 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.8*(Macintosh; ?; MacPPC)*] -Parent=Netscape 4.8 -Platform=MacPPC - -[Mozilla/4.8*(Macintosh; ?; PPC Mac OS X*] -Parent=Netscape 4.8 -Platform=MacOSX - -[Mozilla/4.8*(Macintosh; ?; PPC)*] -Parent=Netscape 4.8 -Platform=MacPPC - -[Mozilla/4.8*(Win95; *)*] -Parent=Netscape 4.8 - -[Mozilla/4.8*(Win98; *)*] -Parent=Netscape 4.8 -Platform=Win98 - -[Mozilla/4.8*(Windows NT 4.0; *)*] -Parent=Netscape 4.8 -Platform=WinNT -Win32=true - -[Mozilla/4.8*(Windows NT 5.0; *)*] -Parent=Netscape 4.8 -Platform=Win2000 -Win32=true - -[Mozilla/4.8*(Windows NT 5.1; *)*] -Parent=Netscape 4.8 -Platform=WinXP -Win32=true - -[Mozilla/4.8*(WinNT; *)*] -Parent=Netscape 4.8 -Platform=WinNT - -[Mozilla/4.8*(X11; *)*] -Parent=Netscape 4.8 -Platform=Linux - -[Mozilla/4.8*(X11; *SunOS*)*] -Parent=Netscape 4.8 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.0 - -[Netscape 6.0] -Parent=DefaultProperties -Browser=Netscape -Version=6.0 -MajorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.1 - -[Netscape 6.1] -Parent=DefaultProperties -Browser=Netscape -Version=6.1 -MajorVer=6 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.2 - -[Netscape 6.2] -Parent=DefaultProperties -Browser=Netscape -Version=6.2 -MajorVer=6 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.0 - -[Netscape 7.0] -Parent=DefaultProperties -Browser=Netscape -Version=7.0 -MajorVer=7 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win*9x 4.90; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.1 - -[Netscape 7.1] -Parent=DefaultProperties -Browser=Netscape -Version=7.1 -MajorVer=7 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/7.1] -Parent=Netscape 7.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.2 - -[Netscape 7.2] -Parent=DefaultProperties -Browser=Netscape -Version=7.2 -MajorVer=7 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 8.0 - -[Netscape 8.0] -Parent=DefaultProperties -Browser=Netscape -Version=8.0 -MajorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 8.1 - -[Netscape 8.1] -Parent=DefaultProperties -Browser=Netscape -Version=8.1 -MajorVer=8 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.0 - -[SeaMonkey 1.0] -Parent=DefaultProperties -Browser=SeaMonkey -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.8*) Gecko/20060221 SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.1 - -[SeaMonkey 1.1] -Parent=DefaultProperties -Browser=SeaMonkey -Version=1.1 -MajorVer=1 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.8*) Gecko/20060221 SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 2.0 - -[SeaMonkey 2.0] -Parent=DefaultProperties -Browser=SeaMonkey -Version=2.0 -MajorVer=2 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.9*) Gecko/20060221 SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Flock 1.0 - -[Flock 1.0] -Parent=DefaultProperties -Browser=Flock -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; U; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinME - -[Mozilla/5.0 (Windows; U; Windows NT 5.0*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; U; Windows NT 5.1*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Flock 2.0 - -[Flock 2.0] -Parent=DefaultProperties -Browser=Flock -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; U; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinME - -[Mozilla/5.0 (Windows; U; Windows NT 5.0*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; U; Windows NT 5.1*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sleipnir 2.0 - -[Sleipnir] -Parent=DefaultProperties -Browser=Sleipnir -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.0*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.1*) Sleipnir/2.*] -Parent=Sleipnir -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.2*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 6.0*) Sleipnir/2.*] -Parent=Sleipnir -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 6.1*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win7 - -[Sleipnir*] -Parent=Sleipnir - -[Sleipnir/2.*] -Parent=Sleipnir - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fennec 1.0 - -[Fennec 1.0] -Parent=DefaultProperties -Browser=Firefox Mobile -Version=1.0 -MajorVer=1 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firebird - -[Firebird] -Parent=DefaultProperties -Browser=Firebird -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Linux; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird Browser/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; IRIX*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox - -[Firefox] -Parent=DefaultProperties -Browser=Firefox -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (OS/2; *; Warp*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (Windows NT 5.?; ?; rv:1.*) Gecko/* Firefox] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.*; *; rv:1.*) Gecko/* Deer Park/Alpha*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firefox/10.5] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; FreeBSD*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; HP-UX*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; Linux*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.0 - -[Firefox 1.0] -Parent=DefaultProperties -Browser=Firefox -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=MacPPC - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; *Linux*; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; DragonFly*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.4 - -[Firefox 1.4] -Parent=DefaultProperties -Browser=Firefox -Version=1.4 -MajorVer=1 -MinorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.5 - -[Firefox 1.5] -Parent=DefaultProperties -Browser=Firefox -Version=1.5 -MajorVer=1 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=OS/2 - -[Mozilla/5.0 (rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2 x64; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 2.0 - -[Firefox 2.0] -Parent=DefaultProperties -Browser=Firefox -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.0 - -[Firefox 3.0] -Parent=DefaultProperties -Browser=Firefox -Version=3.0 -MajorVer=3 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.1 - -[Firefox 3.1] -Parent=DefaultProperties -Browser=Firefox -Version=3.1 -MajorVer=3 -MinorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.5 - -[Firefox 3.5] -Parent=DefaultProperties -Browser=Firefox -Version=3.5 -MajorVer=3 -MinorVer=5 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Phoenix - -[Phoenix] -Parent=DefaultProperties -Browser=Phoenix -Version=0.5 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iceweasel - -[Iceweasel] -Parent=DefaultProperties -Browser=Iceweasel -Platform=Linux -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.8*) Gecko/* Iceweasel/2.0* (Debian-*)] -Parent=Iceweasel -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.0 - -[Mozilla 1.0] -Parent=DefaultProperties -Browser=Mozilla -Version=1.0 -MajorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.0.*) Gecko/*] -Parent=Mozilla 1.0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.1 - -[Mozilla 1.1] -Parent=DefaultProperties -Browser=Mozilla -Version=1.1 -MajorVer=1 -MinorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.1.*) Gecko/*] -Parent=Mozilla 1.1 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.2 - -[Mozilla 1.2] -Parent=DefaultProperties -Browser=Mozilla -Version=1.2 -MajorVer=1 -MinorVer=2 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.2.*) Gecko/*] -Parent=Mozilla 1.2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.3 - -[Mozilla 1.3] -Parent=DefaultProperties -Browser=Mozilla -Version=1.3 -MajorVer=1 -MinorVer=3 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.3.*) Gecko/*] -Parent=Mozilla 1.3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.4 - -[Mozilla 1.4] -Parent=DefaultProperties -Browser=Mozilla -Version=1.4 -MajorVer=1 -MinorVer=4 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.5 - -[Mozilla 1.5] -Parent=DefaultProperties -Browser=Mozilla -Version=1.5 -MajorVer=1 -MinorVer=5 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.6 - -[Mozilla 1.6] -Parent=DefaultProperties -Browser=Mozilla -Version=1.6 -MajorVer=1 -MinorVer=6 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.7 - -[Mozilla 1.7] -Parent=DefaultProperties -Browser=Mozilla -Version=1.7 -MajorVer=1 -MinorVer=7 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (*rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.8 - -[Mozilla 1.8] -Parent=DefaultProperties -Browser=Mozilla -Version=1.8 -MajorVer=1 -MinorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (*rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.9 - -[Mozilla 1.9] -Parent=DefaultProperties -Browser=Mozilla -Version=1.9 -MajorVer=1 -MinorVer=9 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE Mac - -[IE Mac] -Parent=DefaultProperties -Browser=IE -Platform=MacPPC -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/?.? (compatible; MSIE 4.0*; *Mac_PowerPC*] -Parent=IE Mac -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Mozilla/?.? (compatible; MSIE 4.5*; *Mac_PowerPC*] -Parent=IE Mac -Version=4.5 -MajorVer=4 -MinorVer=5 - -[Mozilla/?.? (compatible; MSIE 5.0*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.0 -MajorVer=5 -MinorVer=0 - -[Mozilla/?.? (compatible; MSIE 5.1*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/?.? (compatible; MSIE 5.2*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.2 -MajorVer=5 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 5.5 - -[AOL 9.0/IE 5.5] -Parent=DefaultProperties -Browser=AOL -Version=5.5 -MajorVer=5 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 5.5; *AOL 9.0*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 6.0 - -[AOL 9.0/IE 6.0] -Parent=DefaultProperties -Browser=AOL -Version=6.0 -MajorVer=6 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 6.0; *AOL 9.0*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 7.0 - -[AOL 9.0/IE 7.0] -Parent=DefaultProperties -Browser=AOL -Version=7.0 -MajorVer=7 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 - -[Mozilla/?.* (?compatible; *MSIE 7.0; *AOL 9.0*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Avant Browser - -[Avant Browser] -Parent=DefaultProperties -Browser=Avant Browser -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Advanced Browser (http://www.avantbrowser.com)] -Parent=Avant Browser - -[Avant Browser*] -Parent=Avant Browser - -[Avant Browser/*] -Parent=Avant Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 4.01 - -[IE 4.01] -Parent=DefaultProperties -Browser=IE -Version=4.01 -MajorVer=4 -MinorVer=01 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 4.01*)*] -Parent=IE 4.01 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 95*)*] -Parent=IE 4.01 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 98*)*] -Parent=IE 4.01 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 4.01 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 4.0*)*] -Parent=IE 4.01 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.0*)*] -Parent=IE 4.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.01*)*] -Parent=IE 4.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 4.01; Windows NT)] -Parent=IE 4.01 -Platform=WinNT - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.0 - -[IE 5.0] -Parent=DefaultProperties -Browser=IE -Version=5.0 -MajorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 5.0*)*] -Parent=IE 5.0 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 95*)*] -Parent=IE 5.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98*)*] -Parent=IE 5.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 5.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 4.0*)*] -Parent=IE 5.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.0*)*] -Parent=IE 5.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.01*)*] -Parent=IE 5.0 -Platform=Win2000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.01 - -[IE 5.01] -Parent=DefaultProperties -Browser=IE -Version=5.01 -MajorVer=5 -MinorVer=01 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 5.01*)*] -Parent=IE 5.01 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 95*)*] -Parent=IE 5.01 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98*)*] -Parent=IE 5.01 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 5.01 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 4.0*)*] -Parent=IE 5.01 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.0*)*] -Parent=IE 5.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.01*)*] -Parent=IE 5.01 -Platform=Win2000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.5 - -[IE 5.5] -Parent=DefaultProperties -Browser=IE -Version=5.5 -MajorVer=5 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 5.5*)*] -Parent=IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 95*)*] -Parent=IE 5.5 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98*)*] -Parent=IE 5.5 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98; Win 9x 4.90*)*] -Parent=IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 4.0*)*] -Parent=IE 5.5 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.0*)*] -Parent=IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.01*)*] -Parent=IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.1*)*] -Parent=IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.2*)*] -Parent=IE 5.5 -Platform=Win2003 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 6.0 - -[IE 6.0] -Parent=DefaultProperties -Browser=IE -Version=6.0 -MajorVer=6 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -w3cdomversion=1.0 -msdomversion=6.0 - -[Mozilla/?.* (?compatible; *MSIE 6.0*)*] -Parent=IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 95*)*] -Parent=IE 6.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98*)*] -Parent=IE 6.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98; Win 9x 4.90*)*] -Parent=IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 4.0*)*] -Parent=IE 6.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.0*)*] -Parent=IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.01*)*] -Parent=IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.1*)*] -Parent=IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2*)*] -Parent=IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*Win64;*)*] -Parent=IE 6.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*WOW64;*)*] -Parent=IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 6.0*)*] -Parent=IE 6.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 7.0 - -[IE 7.0] -Parent=DefaultProperties -Browser=IE -Version=7.0 -MajorVer=7 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -msdomversion=7.0 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 7.0*)*] -Parent=IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98*)*] -Parent=IE 7.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 4.0*)*] -Parent=IE 7.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.0*)*] -Parent=IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.01*)*] -Parent=IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.1*)*] -Parent=IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2*)*] -Parent=IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*Win64;*)*] -Parent=IE 7.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*WOW64;*)*] -Parent=IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.0*)*] -Parent=IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.1*)*] -Parent=IE 7.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; *)*] -Parent=IE 7.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 8.0 - -[IE 8.0] -Parent=DefaultProperties -Browser=IE -Version=8.0 -MajorVer=8 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=3 -supportsCSS=true -ecmascriptversion=1.2 -msdomversion=8.0 -w3cdomversion=1.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Win32*)*] -Parent=IE 8.0 -Platform=Win32 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0*)*] -Parent=IE 8.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1*)*] -Parent=IE 8.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2*)*] -Parent=IE 8.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Win64; x64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista -Win64=false - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1*)*] -Parent=IE 8.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 -Win64=false - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 7.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Default Browser - -[*] -Browser=Default Browser -Version=0 -MajorVer=0 -MinorVer=0 -Platform=unknown -Alpha=false -Beta=false -Win16=false -Win32=false -Win64=false -Frames=true -IFrames=false -Tables=true -Cookies=false -BackgroundSounds=false -CDF=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -Stripper=false -isBanned=false -isMobileDevice=false -isSyndicationReader=false -Crawler=false -CssVersion=0 -supportsCSS=false -AOL=false -aolVersion=0 -AuthenticodeUpdate=0 -CSS=0 -WAP=false -netCLR=false -ClrVersion=0 -ECMAScriptVersion=0.0 -W3CDOMVersion=0.0 diff --git a/Source/Platforms/Linux/Binaries/Mono/etc/mono/config b/Source/Platforms/Linux/Binaries/Mono/etc/mono/config deleted file mode 100644 index 385128f74..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/etc/mono/config +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Linux/Binaries/Mono/etc/mono/mconfig/config.xml b/Source/Platforms/Linux/Binaries/Mono/etc/mono/mconfig/config.xml deleted file mode 100644 index a3df3b5e9..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/etc/mono/mconfig/config.xml +++ /dev/null @@ -1,616 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - - -]]> - - - - - - -
-
-
- - - - - -
- -
-
-
-
- - - -]]> - - - - - -
-
-
-
-
-
-
- - - - - -]]> - - - - - -
-
-
-
-
-
-
- - - - - - - - -]]> - - - - - -
-
-
-
-
- - - - - - - -]]> - - - - - -
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
- - - - - - - - - - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - - - - - -]]> - - - - - - - -
-
-
- - - - - -
- -
-
-
- - - - ]]> - - - - - -
-
-
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
- - - - - - - -]]> - - - - - -
-
-
-
-
- - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - -]]> - - - - - - -
-
-
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
-
-
- - - - - - - - - - - -]]> - - - - - -
-
-
-
-
- - - - -]]> - - - - - - - - ]]> - - - - - - ]]> - - - - - - ]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - -
-
-
-
-
-
- - diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/libMonoPosixHelper.so b/Source/Platforms/Linux/Binaries/Mono/lib/libMonoPosixHelper.so deleted file mode 100755 index 09ccce98c..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/libMonoPosixHelper.so +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f7e3cc08554aeec9cd731493c685e054fdc369fdcb99671b3fc791ddb449754 -size 953416 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/libmono-native.so b/Source/Platforms/Linux/Binaries/Mono/lib/libmono-native.so deleted file mode 100644 index b2f93e404..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/libmono-native.so +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c398b22f122c52e8554af5560e9788648941f0f9598df5c430fdda676413db2 -size 181240 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/libmono-native.so.0.0.0 b/Source/Platforms/Linux/Binaries/Mono/lib/libmono-native.so.0.0.0 deleted file mode 100755 index 888a82c8c..000000000 Binary files a/Source/Platforms/Linux/Binaries/Mono/lib/libmono-native.so.0.0.0 and /dev/null differ diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/Accessibility.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/Accessibility.dll deleted file mode 100644 index ec03d154b..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/Accessibility.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad0831c5a0384a5f0d1e1034568de54dacf581b5f6f54eaaa53b4ba76d4a0ecb -size 12288 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/Mono.Posix.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/Mono.Posix.dll deleted file mode 100644 index 1e70186be..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/Mono.Posix.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be99bf1ad3d7903078e16721bff9de6e424b603b35207a36701030e2e008eb5e -size 212480 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/Mono.Security.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/Mono.Security.dll deleted file mode 100644 index f07d7590f..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/Mono.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c885141881da78fb1fef25e86dc26c15bb9259ca646efaab59adf51bf19326e -size 314368 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll deleted file mode 100644 index ed978d2af..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aaa3265a5541345cbb0a6f0f072c290411ffd07bb07fedef945a4818caeb681b -size 259072 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll deleted file mode 100644 index 2ff74f81a..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f8980666889449bbb1e0c2de21f400a9423f29367a0028aa5797b483e8d3ddb8 -size 84992 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Configuration.Install.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Configuration.Install.dll deleted file mode 100644 index 43770a8f1..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Configuration.Install.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47063a3aa980cd976d83305daca6fc8e56460f72021b44c56c87728b45733ee0 -size 24064 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Configuration.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Configuration.dll deleted file mode 100644 index c88213e05..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Configuration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bcd2d64ad1f45b174158004790f7c64f6fba5d159f4f95b56b91fa746cc40369 -size 122880 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Core.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Core.dll deleted file mode 100644 index e32c07403..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6c8c6c3806730a2929e93982038e1d974288c01a968f226926c0446a04355fa -size 1065472 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll deleted file mode 100644 index 7e4028919..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d8070ba80ebb439fb9e0814c80444cde62e404cbf99137dbbbc77b27ebac5f9 -size 29696 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.Entity.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.Entity.dll deleted file mode 100644 index a4766e882..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.Entity.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59ce7a6e2e2c76861367189d9f9414750ad3f6453afd17583b1457c5ef22e4a0 -size 3339264 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.Linq.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.Linq.dll deleted file mode 100644 index 19372a634..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bbb8e4fd87f93b9f664e30bd0b4f8d607d27808b229d4168252e6d184b466dff -size 493568 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.OracleClient.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.OracleClient.dll deleted file mode 100644 index a9fe8d448..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.OracleClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1108ccabf3473a31bb5a9cc00330636eae518fe11d92d2699a5e8744570127a8 -size 173056 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.Services.Client.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.Services.Client.dll deleted file mode 100644 index 45cdc98d8..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.Services.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eecdfed100c9b12f3f4517673898583f8d5954e69c92070d195dff97239522c9 -size 418816 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.Services.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.Services.dll deleted file mode 100644 index 6cc7be948..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bfc477a2ddad68546c9f848954bad584791acf8bac015682f27cd4cc780637a6 -size 56320 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.dll deleted file mode 100644 index f6dc4f6cc..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7fc75a2c6dba89a00b6e7d92ddf8e877456263582b8eb36c7efce9393e63ed3d -size 2119680 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Deployment.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Deployment.dll deleted file mode 100644 index 14f9ef74d..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7939e391e7aaf1998d34326075d321a7a3728e07f095ce34d3cfe900017aa90a -size 11776 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll deleted file mode 100644 index 57cf03400..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6fbee48c805fd754ead8cec06766258c1a1f3dd9be0a8ee9e408c1ccdbaa7af6 -size 61952 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.dll deleted file mode 100644 index efbedbbc0..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18627f929f6ce1b9f9a20faaed5fc68fd13706013b3ea0aa3c0f24ba6fa63585 -size 94208 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Drawing.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Drawing.dll deleted file mode 100644 index cad09c7f6..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Drawing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:165cee5d60a2af6754803e9c57084957bb9787a513f431953d96c802df9df57a -size 482816 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Dynamic.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Dynamic.dll deleted file mode 100644 index 0a035a81a..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Dynamic.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c1f2c1412802cb9ecfe3abd3b2936d687289bdfa96af98be730726cd8e0e5da -size 87040 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.EnterpriseServices.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.EnterpriseServices.dll deleted file mode 100644 index 4e6aba4af..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.EnterpriseServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f15fadd2236839ac016f59fa019450f1032c1058802590b6bd7c0d0b69293599 -size 46592 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll deleted file mode 100644 index 58f6399eb..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4aaf8f27188828ef81422afba2870cc5d02e435a458a24bf77bfa9813e0200ec -size 18432 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.IO.Compression.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.IO.Compression.dll deleted file mode 100644 index 5ea09fb1b..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.IO.Compression.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe4056a11db7cba8d19869dbf93cd53e0c783057edcbe32c72d28f8fa0e9e785 -size 99840 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll deleted file mode 100644 index c1c710901..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2bfaa4db71a2fabcf1d77f263096ec085882b761b21d6259b90f9d538022a4e -size 17408 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.IdentityModel.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.IdentityModel.dll deleted file mode 100644 index 49d1cd051..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.IdentityModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64f0b1fad23f6afc8f5068cf9605293555fddd92c5a2f6cdf6dffcf8eba737f6 -size 139776 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Json.Microsoft.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Json.Microsoft.dll deleted file mode 100644 index a57ecefc2..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Json.Microsoft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ccc44d40f001796f41b2099c51b6784683a82d7381e5f8989ae4a9ccfbea2b8 -size 54784 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Json.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Json.dll deleted file mode 100644 index 99b07041a..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7cfc9b1e8c8ea9d607bd453f25cf6391eef8f8910b2e2773113f33b04a8e53fd -size 32768 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Management.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Management.dll deleted file mode 100644 index 793dadc34..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec66b1441d7310f0e3b53ace2f79e4818acec382e88a30b842c4a62fc7a1ce8c -size 49152 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Messaging.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Messaging.dll deleted file mode 100644 index b3c79dd93..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ad58270f68a9fb1e605b1622a71994bef9fcfc17bbc499dc06da5c9f13843c6 -size 75776 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll deleted file mode 100644 index 4f1e6b6f2..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e77e902ca5738dd40d971e1b1cd15eb249553e505e3f3d87cdae45b9e0853083 -size 519168 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll deleted file mode 100644 index ff948af08..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2bd78be0ad1da7978d770d5a83b36724ab7a4de5e1267c3b889b82ead959fb7f -size 8704 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Net.Http.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Net.Http.dll deleted file mode 100644 index f4cba1a7f..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Net.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d0a132ad58a0824ac4fe2b8aa92006801a8b3919fdaac85982bad44ce62f0a3 -size 115712 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Net.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Net.dll deleted file mode 100644 index 79053c279..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Net.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd91fe86c3b9dfe133798dcefdfea6783e49b51bb06cb8fed7ebc4d8f396d2ae -size 13312 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Numerics.Vectors.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Numerics.Vectors.dll deleted file mode 100644 index f953fbe02..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Numerics.Vectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:327bb7192029181411207531c2a3df61713e3d1d876fde4a5d18daf9be7bec9f -size 12288 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Numerics.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Numerics.dll deleted file mode 100644 index ab83bebb5..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d17db0e4643049bbf7b6da9e585b90f89b1d53ab376659832cf914788ac1d81b -size 119296 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Core.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Core.dll deleted file mode 100644 index e65755ad7..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73c1e029955066e3b0f29a742d4cdceffc244776a54104df4d5f19478b151038 -size 96256 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Debugger.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Debugger.dll deleted file mode 100644 index 077ee0eda..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Debugger.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3bb7f5472cdc389dcae0bde2256e99a522cead1fea83b58ae9380aa3990e17f9 -size 5120 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Experimental.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Experimental.dll deleted file mode 100644 index 4e596b4a3..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Experimental.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd6f5f9acc1fa8bf35ea7d9ba14bf94c75b24baa402b24b55afb961a3e6eb589 -size 28672 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll deleted file mode 100644 index 1ee2df114..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7816749b43433fe537ab5c72e19250bc760c94e873da93f0251553ae7a3da32 -size 7680 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Linq.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Linq.dll deleted file mode 100644 index 128031ced..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e701260b1f47b0fbfce2814ebcef425c75b3843c26a18976baa4b97eb6d7ab18 -size 683008 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll deleted file mode 100644 index 381037347..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d824ce684921823958b34e6c1ac81c1a457c740c8009d130150b17b7439d300 -size 9728 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll deleted file mode 100644 index 25bf82fa0..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d754b1f51da7ec7c47a0e25fbcd075c30c922d986349bd942ec22dcbb8a0e56 -size 22528 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Providers.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Providers.dll deleted file mode 100644 index fa09cefd2..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Providers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11290fa51fac7db92cb346adefc5747bb8aa072e98cee9a6eef1f55fc43256e0 -size 243200 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll deleted file mode 100644 index bc06e7261..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d06d3f065efc3944c488652ff6bce3cfc7e6afc9fb1cd599fd08fbb963721ea -size 9216 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll deleted file mode 100644 index 05a28b343..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c695404aafade412ae59c4b3b3b27c7cbf545aa5b28bb54e8fc5d1b1936edced -size 9728 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll deleted file mode 100644 index c02f6c29c..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd8c31bd739c1e52c40fccc367366a6cec5345c816752b9a7aad873d1ddbf9ba -size 12800 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reflection.Context.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reflection.Context.dll deleted file mode 100644 index 21dd8389c..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Reflection.Context.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7bb97432fd16b14c6624dc00786272f2a99755c397035a87c420f589a576a535 -size 13312 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Runtime.Caching.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Runtime.Caching.dll deleted file mode 100644 index 863e19aa4..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Runtime.Caching.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f61e57e195594f5bbfc64b0feeb09282919e1398c52e31b8e1194af1e571a294 -size 72192 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll deleted file mode 100644 index 58bf84075..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8279842618b28d8057d63eb7fed6047b04bb4bedf7c1f08749328618562104d -size 107008 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Runtime.Remoting.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Runtime.Remoting.dll deleted file mode 100644 index 62c4a0141..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce33a874ad0ac5241313871cebe9338bf736552b8c9c8711a4671e4d6109224f -size 119808 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll deleted file mode 100644 index 6abe07886..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00f496bba35e509f6685742533663e651edb6863d296945c64e1568c16cf8b0d -size 38912 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.dll deleted file mode 100644 index 9ddb4d77d..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67a67cac418b28640ca0bb0332ab4759f4d959f5e79579b94d2cf52593a56131 -size 933888 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Security.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Security.dll deleted file mode 100644 index d9d9112a6..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a278e67dea886ed972b54d906a1ce8ee08637544be31e1eef29d827b635d653 -size 276992 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll deleted file mode 100644 index 6cfed22aa..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be1969c2714f1f2b4515ab59813d8ebe80fa1a8e446fa8255989ef36416cf264 -size 13312 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll deleted file mode 100644 index 37ccab98e..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f9b16e4412543c29e1bb1f43f5f948b9d3584292b51256b756a41cb7e9177ff -size 141312 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll deleted file mode 100644 index 6a3b20539..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:191f6bd4e6bef05f8341a8ec5ebc9fe32dfd9af93faac3870492c0548d5cc432 -size 214528 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll deleted file mode 100644 index 92c6af8fa..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4373b6cec4335f6eeedda163481de26c0b605fc4be7df34b67adbd9e3d5d3088 -size 37376 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Web.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Web.dll deleted file mode 100644 index 9d0d016a0..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce70b06b13bbee55f8cf8f4a042c5d06b98af03e338995ced18266fb2067fa98 -size 79360 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceModel.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceModel.dll deleted file mode 100644 index ad0ccc3a3..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9b5dc2076bd4bad19c75ed4aac57ca001a9a8ead911e9a9f1cdb2ca8b11cf841 -size 1426944 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceProcess.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceProcess.dll deleted file mode 100644 index 2654ab094..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.ServiceProcess.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f26af126176f7cf3e5192113bd52ba37519d55dabd997e95d05284350d30105b -size 47616 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll deleted file mode 100644 index 36df064c4..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1587a5886355c2f52d3285ac6771314825ee1750ccff7d402cb774ec0ee0f6db -size 168960 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Transactions.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Transactions.dll deleted file mode 100644 index d5d35b11b..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Transactions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dbfe036ebfe14548a14a2e35590d6be0b234e75905a3634287ab11be7fa3a724 -size 34304 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Abstractions.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Abstractions.dll deleted file mode 100644 index 9dbf84fb9..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Abstractions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79af7b24f4dfa913e8cc62b0e8ab783d70e80e14f92c4f4b1dd8f676cabd5bd6 -size 12800 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll deleted file mode 100644 index 698d01f48..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60aa2cc4a3844cfcc7e97d79d7503bf92ada14e4903e938a9a7fa38edc74f1d4 -size 33792 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.DynamicData.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.DynamicData.dll deleted file mode 100644 index 1f1ca5dbe..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.DynamicData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2a8f70e2d53d85c4788d0b2c1b51d2c81740a5e2705623e4dd78628bd9136d0 -size 69120 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Extensions.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Extensions.dll deleted file mode 100644 index efb92cfb3..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d63706586e4a3891dc6ec8cb0ddd2cc28bb1c7ded93bbd9e5d521db84862b80d -size 745984 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll deleted file mode 100644 index 336188f9b..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b0e83ec65e855b620331a69fd8ab98b6a3c69eb0954bb54d92875c0cdf02349b -size 88064 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll deleted file mode 100644 index 872cc5e3d..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa9e924cf38f248eacb2e07d1a2300f190aae8bdb607e076670963ee7cfbaecd -size 56320 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Http.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Http.dll deleted file mode 100644 index 260063642..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3a2fb46704a5cbafc5586792d07dd9bbbf9ffb2c454f5e24ba80cca1742aed8 -size 326144 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Mobile.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Mobile.dll deleted file mode 100644 index 7e3198616..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Mobile.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac45a498b0da25cdd3e0ab4f42544df9d9ebcf1809ceba628338cd81fa83b77f -size 11776 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Mvc.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Mvc.dll deleted file mode 100644 index 86e7fa24b..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Mvc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0969b6e8b7287456d662c1d344cc7c8a255fa732d85a3b64d27f76163dcc324a -size 420352 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Razor.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Razor.dll deleted file mode 100644 index bd2249fc4..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb045ea1943f02caabc6c41866a8d177594824544428297b3b6b657e521aba50 -size 254976 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll deleted file mode 100644 index 90978b66d..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0cc7c72c13f3e577e879a604163175899febea04928fa3a29a050a3972a253ae -size 11776 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Routing.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Routing.dll deleted file mode 100644 index 158951a44..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c1100acec1edaa3a3928ecdbf8750a9c5734f2fa4bd7f738060f9ff9e0f1b75 -size 12288 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Services.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Services.dll deleted file mode 100644 index 4fee3677c..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91f41a7e7c511c7c4da948fe133c16f45aadd9cfdb0d88eb4765b938a6e56ef0 -size 732160 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll deleted file mode 100644 index 476913830..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76ae55cab184ff725100cfdc606914a7b12c70adc6a31c715bce4fb32c44aeb8 -size 39424 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll deleted file mode 100644 index 03e61396e..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6adcc0ed2a3f111bef78eac5ffff4cf779930f611adf618e2da08085607397a -size 38400 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.dll deleted file mode 100644 index 952b7772b..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:06bf34f5dbf43e912c0a2a3a44670668b93a143eb32a491fe4a5a1a5891c2cad -size 196608 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.dll deleted file mode 100644 index dafac2621..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9d637c3696bbed5c18fddd22181bd4bee9d6a371df66f1ea3e6af8c24267c887 -size 3026944 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll deleted file mode 100644 index 04e0ff316..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b069c55850d60b364db3e03062da85878a393e3c673531672f3fa75e146cf58 -size 145920 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.dll deleted file mode 100644 index 767803f77..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:733bfcb7a997f5beade2fba8d36f45440d4bcf6c2f13aa5208d2ed361c7023d3 -size 2898432 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Windows.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Windows.dll deleted file mode 100644 index a0d16168d..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Windows.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec90da3e05d35fa76a1d576a9c14e0fb95e9c5016305352607029ff080a4bc1a -size 11776 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Workflow.Activities.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Workflow.Activities.dll deleted file mode 100644 index 504a7a91e..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Workflow.Activities.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7b9eca28b05230c95d521b08649a668cbc14f7ae4cfadf0543566d219f35b40 -size 11776 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll deleted file mode 100644 index b393d0f8c..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9714061a4c64ae21395db81320b63cd3e4b44f148513e6beee07cba63d73e174 -size 11776 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Workflow.Runtime.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Workflow.Runtime.dll deleted file mode 100644 index 096912c49..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Workflow.Runtime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be9d80852b082e960164614ac77814669abefe253ea410f35af9881361bcac1b -size 11776 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Xaml.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Xaml.dll deleted file mode 100644 index a61935ea2..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Xaml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a7deb84bba590d7f734fe699878970fd92758954f65d418594eb345d8b27ba4 -size 188928 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Xml.Linq.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Xml.Linq.dll deleted file mode 100644 index 23d02da6d..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Xml.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:502b289eba6bb10dd66a3c3f33256c8396ac6b1a37bf90924c8508d7f75a311f -size 137216 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Xml.Serialization.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Xml.Serialization.dll deleted file mode 100644 index 71501bb82..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Xml.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d51a04521acc7d37047913b82a2973edcaf6db96ce74f2e3fe3fa506d1b0b70 -size 11776 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Xml.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Xml.dll deleted file mode 100644 index 1a3f9f3c4..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:49cebbc89e6c46080c9741c3b0917e51cf9de81d6c8a064d48d57febc0d4d907 -size 3174912 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.dll deleted file mode 100644 index e3ff6916d..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/System.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25c957f4535cb2f72865fee3de0637439b7db947cfcf6b71bcbdb35b2a6f3802 -size 2566144 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/WindowsBase.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/WindowsBase.dll deleted file mode 100644 index 8c9fabf5f..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/WindowsBase.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e334cb9cb54d69fdce5a39269ec1860581e01d78a9fcbc492b7a8a9bcf444f2 -size 161792 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/mscorlib.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/mscorlib.dll deleted file mode 100755 index fb24014e2..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/4.5/mscorlib.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b583f9412db1b688f0320e709eee1d77b428c0d66408a9d4a69f4bb1f0d75202 -size 4494848 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll deleted file mode 100644 index 01200aeea..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7908292f952dfb43c613d382804d471099dc214e967d5b9c576d20f1426b670d -size 12288 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll deleted file mode 100644 index 71fcc330d..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58636d961acd7124632e47dbe76c31e266b941c74a1af6ef614812a40cfb0631 -size 212480 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll deleted file mode 100644 index 72d96b0f4..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d9eeafad9481db1050c13e1fb323517a8fa38f8e7d92e736dfbbdb81d07efe14 -size 314368 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ComponentModel.Composition/4.0.0.0__b77a5c561934e089/System.ComponentModel.Composition.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ComponentModel.Composition/4.0.0.0__b77a5c561934e089/System.ComponentModel.Composition.dll deleted file mode 100644 index 160555926..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ComponentModel.Composition/4.0.0.0__b77a5c561934e089/System.ComponentModel.Composition.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d9892265e9020fe89907ab812c5a5bbac5d552f13e3131296be59f1101343602 -size 258560 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll deleted file mode 100644 index fff03e9ff..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ca1a6ef39cc2784f35191b9ad56055dbe7d782bc91080f53006af4bda7551d0 -size 84992 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll deleted file mode 100644 index d6227ac98..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6dede71ccef0bf01ae0bd9c81c9643dda1a1c82291841722184f3c9d999dc8c -size 24064 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll deleted file mode 100644 index db365d4fc..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00f5f5c6fd07dcf673d068420d8769593f44b9ec1dae911bea094cc4bdb682d3 -size 122880 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll deleted file mode 100644 index ff7b07a2b..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d5ac6330d485d61567bde7e8c938c898abd8bf39886f91c2035e5f19dfb3b778 -size 1086464 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data.DataSetExtensions/4.0.0.0__b77a5c561934e089/System.Data.DataSetExtensions.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data.DataSetExtensions/4.0.0.0__b77a5c561934e089/System.Data.DataSetExtensions.dll deleted file mode 100644 index 6391b0240..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data.DataSetExtensions/4.0.0.0__b77a5c561934e089/System.Data.DataSetExtensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4fa1f2bddce63019b30b2502ff5560bcf831327a3536d5529d033217194fb350 -size 29696 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data.Entity/4.0.0.0__b77a5c561934e089/System.Data.Entity.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data.Entity/4.0.0.0__b77a5c561934e089/System.Data.Entity.dll deleted file mode 100644 index 5974f6518..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data.Entity/4.0.0.0__b77a5c561934e089/System.Data.Entity.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1520112348648a0a739e6cb8c33b4830b805971c28a28f0f98a527b1588d6519 -size 3338240 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll deleted file mode 100644 index a60532ab8..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b47c88f097deb13c222a41c2d8f28e5043469b2a929dd5f8f4643fd4139f503 -size 652800 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll deleted file mode 100644 index f2accdd2a..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5210222768ba1527ac1969b3ce3315f216a8642876ce82f640f83ce71a9ae4b -size 173056 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data.Services.Client/4.0.0.0__b77a5c561934e089/System.Data.Services.Client.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data.Services.Client/4.0.0.0__b77a5c561934e089/System.Data.Services.Client.dll deleted file mode 100644 index e811ed567..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data.Services.Client/4.0.0.0__b77a5c561934e089/System.Data.Services.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40607bf6200b75a815989aa2efbeb2565f4a1f13bc2d698b26563f0b6e2460ce -size 418816 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data.Services/4.0.0.0__b77a5c561934e089/System.Data.Services.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data.Services/4.0.0.0__b77a5c561934e089/System.Data.Services.dll deleted file mode 100644 index a2da8a705..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data.Services/4.0.0.0__b77a5c561934e089/System.Data.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db29aa8d934516bf72cdbc872b6d109cc01a205b7724e27dbe4ee1b2210734af -size 56320 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll deleted file mode 100644 index ebd63046f..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c7cc52d2fe5c020852ec0595635dd5a30341d98d2b7f66fac694a6d77044c6f -size 2102272 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll.config b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll.config deleted file mode 100644 index c33c1db25..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Deployment/4.0.0.0__b03f5f7f11d50a3a/System.Deployment.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Deployment/4.0.0.0__b03f5f7f11d50a3a/System.Deployment.dll deleted file mode 100644 index e0ef53bdf..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Deployment/4.0.0.0__b03f5f7f11d50a3a/System.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:008f2b1b8ebc389a4a59e2f11c4a21b84649c7f47e2a9bdc856c5662ddcf80c1 -size 11264 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.DirectoryServices.Protocols/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.Protocols.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.DirectoryServices.Protocols/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.Protocols.dll deleted file mode 100644 index 984942ada..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.DirectoryServices.Protocols/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.Protocols.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:303b6205b1d759b7f5c0503a7e401da3fd59c38aac7a93084aa9d379c85bc920 -size 61952 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll deleted file mode 100644 index 3f294ae19..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a42c80c4473800bd4faa7a86a20f5f5cac5aa4f9abb1f38375c2947c693f0ca -size 94208 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll deleted file mode 100644 index e5d792384..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c74e44a0455c266fc4a641f6cb7fe13731cac7ef984a8ca90ac54faff759b44b -size 491008 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.config b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.config deleted file mode 100644 index fbd1d8941..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Dynamic/4.0.0.0__b03f5f7f11d50a3a/System.Dynamic.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Dynamic/4.0.0.0__b03f5f7f11d50a3a/System.Dynamic.dll deleted file mode 100644 index a10dcb17d..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Dynamic/4.0.0.0__b03f5f7f11d50a3a/System.Dynamic.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:caaaf916eeee6eaf20c3f8d706444a928c94d4e2b71fd48eb421242f91255475 -size 87040 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll deleted file mode 100644 index 635a2f78b..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53724ebb898911c6da4233704514c2604afdbec11a9c807e31bf82b7558313a1 -size 46592 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll deleted file mode 100644 index d22bdd7af..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:180a3e041a0261030fa7ca05ba06823000cf455c1367f6a4004b59be3e406767 -size 18432 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll deleted file mode 100644 index e1ea2b78d..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b279eea9c15eb42a82f3ae4f0d73b1de46512912638e8f22c943d929692d773f -size 115200 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll deleted file mode 100644 index 56424367c..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f72d56255bd489b759dd21ab39fce38a05a74e17c1b812eeda11296e992ab3d -size 17408 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll deleted file mode 100644 index 550b8add5..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91ffe031a24bc0ea3329687fcfaac106f84ab9175abb5b1fc6e0fe610560e85b -size 139776 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Json.Microsoft/4.0.0.0__31bf3856ad364e35/System.Json.Microsoft.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Json.Microsoft/4.0.0.0__31bf3856ad364e35/System.Json.Microsoft.dll deleted file mode 100644 index 330f89327..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Json.Microsoft/4.0.0.0__31bf3856ad364e35/System.Json.Microsoft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:568235cb7ad12d348aaeceaa096b994bdf91a0f0fe82922e81756d00267b781a -size 54784 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Json/4.0.0.0__31bf3856ad364e35/System.Json.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Json/4.0.0.0__31bf3856ad364e35/System.Json.dll deleted file mode 100644 index 41b314d50..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Json/4.0.0.0__31bf3856ad364e35/System.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5571a40b9f4491e910fe1e8920b22dd06ae1eecc8751339ad29c259282426383 -size 32768 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll deleted file mode 100644 index d7c43d154..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:085868e4b698e55881c8fdcaf6579cccfa24894f3eeb4fc353539d485bcecb9f -size 49152 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll deleted file mode 100644 index c39bf9fe9..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f0fc119551feefe672a3a3bf2c6011e7789c026f1fd00f7d68f2b02982be88e -size 75776 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll deleted file mode 100644 index 370af3a67..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:301f258b1ad7ec5c7fb77626d54584c9ee97f61f5e32e18e91df8157d25a35f6 -size 518656 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll deleted file mode 100644 index f14fe244c..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae92b4f84ed4ce8c1063be896c3ed5b47c264014b64fa03a12e1cb0db8f104ad -size 27136 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll deleted file mode 100644 index 530c0c8c0..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d77438cf927f8aef02dff89c233fa1507461660518417647d77547676a9ded04 -size 281088 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll deleted file mode 100644 index 7b675a90b..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75c950bdc72d4cdd5e792ad79714264d0418b47de3c69b578b5c072898992427 -size 13312 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll deleted file mode 100644 index dc333045d..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:996ffb6885ee0d5a2ccba34439df1a67bf8016fc05603adf08e42c691bc8eed0 -size 12288 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll deleted file mode 100644 index f4b0cb9fa..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c9679f30c684c16ec6c88a078cd10ad7d5814b72d2a7ce8a144507e2fedae746 -size 119808 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Core/2.2.0.0__31bf3856ad364e35/System.Reactive.Core.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Core/2.2.0.0__31bf3856ad364e35/System.Reactive.Core.dll deleted file mode 100644 index 6f017dd6a..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Core/2.2.0.0__31bf3856ad364e35/System.Reactive.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9fc263d0b2a584b19237c024ef6c7f0b7ebbf5c9b788faf1beae5b9d13100b06 -size 95744 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Debugger/2.2.0.0__31bf3856ad364e35/System.Reactive.Debugger.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Debugger/2.2.0.0__31bf3856ad364e35/System.Reactive.Debugger.dll deleted file mode 100644 index 0ec7ce0c4..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Debugger/2.2.0.0__31bf3856ad364e35/System.Reactive.Debugger.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73848bb977fa46e1bc518c3ef397b8364094dfa84fe4adbbdaba3f324842e8ba -size 5120 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Experimental/2.2.0.0__31bf3856ad364e35/System.Reactive.Experimental.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Experimental/2.2.0.0__31bf3856ad364e35/System.Reactive.Experimental.dll deleted file mode 100644 index 03a75dd66..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Experimental/2.2.0.0__31bf3856ad364e35/System.Reactive.Experimental.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e75f52a62e044c40e2cc73daa0d6bf635a3568e091a3288eab1a759506c46d3 -size 28672 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Interfaces/2.2.0.0__31bf3856ad364e35/System.Reactive.Interfaces.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Interfaces/2.2.0.0__31bf3856ad364e35/System.Reactive.Interfaces.dll deleted file mode 100644 index ff9931d26..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Interfaces/2.2.0.0__31bf3856ad364e35/System.Reactive.Interfaces.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80f4b79f0ac6cb348dc3bc8d1e1c7ff947620719bc8a3700c8c24f8a869bbee7 -size 7680 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Linq/2.2.0.0__31bf3856ad364e35/System.Reactive.Linq.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Linq/2.2.0.0__31bf3856ad364e35/System.Reactive.Linq.dll deleted file mode 100644 index 6d3c458a9..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Linq/2.2.0.0__31bf3856ad364e35/System.Reactive.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b30f026869aa2be2c0a350c0458f39a81dce9aa1f5af172a7205b97f945c1bc4 -size 683008 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Observable.Aliases/0.0.0.0__31bf3856ad364e35/System.Reactive.Observable.Aliases.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Observable.Aliases/0.0.0.0__31bf3856ad364e35/System.Reactive.Observable.Aliases.dll deleted file mode 100644 index b9b2f253a..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Observable.Aliases/0.0.0.0__31bf3856ad364e35/System.Reactive.Observable.Aliases.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:318371120960ce15500798fe61a71c9bd96fa490d9746e942fd6b82eb4fd08a1 -size 9728 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.PlatformServices/2.2.0.0__31bf3856ad364e35/System.Reactive.PlatformServices.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.PlatformServices/2.2.0.0__31bf3856ad364e35/System.Reactive.PlatformServices.dll deleted file mode 100644 index cca6cdffc..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.PlatformServices/2.2.0.0__31bf3856ad364e35/System.Reactive.PlatformServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:816347965b0825548cfddef3b7da75f4e6c6fe268965554cadc0ee1456cd87ae -size 22528 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Providers/2.2.0.0__31bf3856ad364e35/System.Reactive.Providers.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Providers/2.2.0.0__31bf3856ad364e35/System.Reactive.Providers.dll deleted file mode 100644 index 48188c63d..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Providers/2.2.0.0__31bf3856ad364e35/System.Reactive.Providers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:145ac53ae98c80ef2a71711877f440c87112b545fd3bbee10508056f6c251c92 -size 243200 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Runtime.Remoting/2.2.0.0__31bf3856ad364e35/System.Reactive.Runtime.Remoting.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Runtime.Remoting/2.2.0.0__31bf3856ad364e35/System.Reactive.Runtime.Remoting.dll deleted file mode 100644 index 58a658ee2..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Runtime.Remoting/2.2.0.0__31bf3856ad364e35/System.Reactive.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64eaa2ed52011844537552a3681337081bfd2779e32029ade82c389873289bc7 -size 9216 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Windows.Forms/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Forms.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Windows.Forms/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Forms.dll deleted file mode 100644 index b30d7c6cd..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Windows.Forms/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5199e3009306940807d88912ffda5c72359ade4aac5134a5bca29573b162101 -size 9728 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Windows.Threading/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Threading.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Windows.Threading/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Threading.dll deleted file mode 100644 index d3c27798d..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reactive.Windows.Threading/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Threading.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f55a6654f734c5c4a9099a62c12b6138e9f4aca4f7717ab3ed2e67e21a292e9 -size 12800 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reflection.Context/4.0.0.0__b77a5c561934e089/System.Reflection.Context.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reflection.Context/4.0.0.0__b77a5c561934e089/System.Reflection.Context.dll deleted file mode 100644 index 3d087600f..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Reflection.Context/4.0.0.0__b77a5c561934e089/System.Reflection.Context.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2ed7f7b821c9c09b3c51d9ea9fa5962961c8d022d61d4f283d3373071d43305 -size 13312 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll deleted file mode 100644 index b8a99178b..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d48e180e328d20ee492f5059f646d6d7d42bc64ff3e24d612fd0bd8295fbfaa -size 72192 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll deleted file mode 100644 index b8ce6d6d2..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b5c58a203c458c7439e91b15289ebf9670f0da0ff17381f4199958cbed88e4b6 -size 107008 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll deleted file mode 100644 index 37c6f3a83..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:928ffdef7e659f2500f2b8c1da5d6923f0adf1edc46240572c7495a5954df5cf -size 119808 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll deleted file mode 100644 index 3e88e2c86..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b47eb8ef8bd4dc99ad4c6965bcdc07719315e3851801cf7c2e50a7e1a9e1d5b8 -size 38912 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll deleted file mode 100644 index d8fe912e9..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0fd7051973a7a53c21fd6f4222dcee9c5abd701aeba9cfadc1d57302d4afa98 -size 933888 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll deleted file mode 100644 index 1e703b621..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dddc7dc788c2d91583cd5a59cb33cbc9e3dcd15a44654ec97a4e5312057e1fab -size 308224 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll deleted file mode 100644 index d033390a3..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d10a5850c9a676b691ac248b07235dbe33b49984fb2bc0b0142fb27584a684f -size 13312 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll deleted file mode 100644 index 861414124..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a21a6986d03cbf7b13e58f8d7a078df7ee03fe8b253c28dee8eb04a41eaed1e7 -size 141312 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll deleted file mode 100644 index a431a82bb..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60dace8025fa37d1a8112ada8f3e860857530298db56c2bbf427a3a39b812890 -size 214528 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll deleted file mode 100644 index 58217d8ee..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:240a392b274b1001f236062c008db650976742d3b021bc9fc509131ba72bedbd -size 37376 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll deleted file mode 100644 index 205e012d9..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:367141e8a7b0683218a43cb7007af0c53178b3b64728a378b76bbfb5c70d8668 -size 79360 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll deleted file mode 100644 index 6aed36c4e..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dbbef0cb9e0d57e38d096027879f3d0c0e18877f207ead9fe8bc937661ce6fe4 -size 1427456 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll deleted file mode 100644 index 4162bffe8..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3684d576acd24b707080585b4f1e75f565dbadbb9a37147a6682f028ad10550b -size 47104 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Threading.Tasks.Dataflow/4.0.0.0__b77a5c561934e089/System.Threading.Tasks.Dataflow.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Threading.Tasks.Dataflow/4.0.0.0__b77a5c561934e089/System.Threading.Tasks.Dataflow.dll deleted file mode 100644 index 248a05d01..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Threading.Tasks.Dataflow/4.0.0.0__b77a5c561934e089/System.Threading.Tasks.Dataflow.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b115157bc8139e47eb5b2e0d24c0c25c9971ab61b56b6ef0d839d36ff91f9984 -size 169472 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll deleted file mode 100644 index 31a179d05..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c4cf806987a94916a21e67cfbaf7f43801e3934f3e86302bbecdbba7bb4bda00 -size 34304 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll deleted file mode 100644 index d9a1f59c5..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:255a1ac548667aad9095d1c62b95177ac3337cd9d6b2e45698c3440eeb09829d -size 12800 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll deleted file mode 100644 index 100e11662..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c343612d28c4789b729646b8c2423822cbf0fd62ed9ac17ceb1a31ffd811ccc8 -size 33792 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll deleted file mode 100644 index 7bffde2c4..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41950b097714196611281ba6f5022700ee48521507f87730dea245a5fad0e41d -size 69120 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll deleted file mode 100644 index ce66e27bc..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2595deafb28ebe010bcdf7afe98d3d0778764d69cf4e8216da61f3b50496cfb -size 745984 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll deleted file mode 100644 index bdc096f36..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:792457aee4c76de5736342970ff888109d8ad93a0d6714d2e655cd6664069c61 -size 88064 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll deleted file mode 100644 index ef7baf251..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e2b1e327990f16601370539cd9dfec106f60f4d253b538a7c667cd962f4b384 -size 56320 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll deleted file mode 100644 index b52e15ac1..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ed47fe2c89507588c581c541b15cc29898ccd2c91acd3ddd3ad4890a9fdbd78e -size 326144 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Mobile/4.0.0.0__b03f5f7f11d50a3a/System.Web.Mobile.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Mobile/4.0.0.0__b03f5f7f11d50a3a/System.Web.Mobile.dll deleted file mode 100644 index 1717e4028..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Mobile/4.0.0.0__b03f5f7f11d50a3a/System.Web.Mobile.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:137ce52a4a40d473fc5a6399cfe3f7a3246564883e9e6632e9fd3ea1864e8336 -size 11264 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll deleted file mode 100644 index 3dddb1d7c..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ab0d5fe0f3fdc32bc9e8845525c961f0760e11f355082d07e2fe71b63cf1eb30 -size 419840 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll deleted file mode 100644 index 45cf57928..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:826430dada228195ebf1f89ae62bb436559a467cd42ed439ac128a8f19f7eae9 -size 254976 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.RegularExpressions/4.0.0.0__b03f5f7f11d50a3a/System.Web.RegularExpressions.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.RegularExpressions/4.0.0.0__b03f5f7f11d50a3a/System.Web.RegularExpressions.dll deleted file mode 100644 index ec9e91bed..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.RegularExpressions/4.0.0.0__b03f5f7f11d50a3a/System.Web.RegularExpressions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:110c17aaeec51e39c46404d407ddc2676cb177e613ac308f3a19376a2c401afc -size 11776 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll deleted file mode 100644 index fa12bcf31..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc348e583396e2233e0852e294fd447c586704645e33ad8f07a282dc83d13854 -size 12288 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll deleted file mode 100644 index a0e407ccd..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:294c0bc5d8332e59f1868a2caf7b0efa89f73a9531622362effa29806622f272 -size 787456 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll deleted file mode 100644 index b8b7f9156..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73241534c0c3cdd58518e8f44c6242560991da8f512ce6b8153fc998970e9079 -size 39424 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll deleted file mode 100644 index c89c8bfc6..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7dec6b96e26d2e9a4a1fb04d538b767ae52e7e6af4f97d2702158b861315e0a9 -size 38400 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll deleted file mode 100644 index 22a21998d..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87f90aaf716a0ceef7c984b277338998be1fc5b900dbe832df535b3c154dc251 -size 196608 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll deleted file mode 100644 index 61922d08f..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b79ce024e9efdd1cd7d37f76a9c6bb817a28f631b8d9ca81d4ddda15812fbe0 -size 3028992 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Windows.Forms.DataVisualization/4.0.0.0__31bf3856ad364e35/System.Windows.Forms.DataVisualization.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Windows.Forms.DataVisualization/4.0.0.0__31bf3856ad364e35/System.Windows.Forms.DataVisualization.dll deleted file mode 100644 index 2a070e257..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Windows.Forms.DataVisualization/4.0.0.0__31bf3856ad364e35/System.Windows.Forms.DataVisualization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ba9ddba411040b752a84c2ce491797b2b19034299eaf95fd111f8414232e06d -size 145920 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll deleted file mode 100644 index 315200899..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:916cd054c0636fd0807ec0382a1560e01db44f066fd8ca2ad4c4d3ece255f93e -size 2899968 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.config b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.config deleted file mode 100644 index 54c6fd39c..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Windows/4.0.0.0__b03f5f7f11d50a3a/System.Windows.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Windows/4.0.0.0__b03f5f7f11d50a3a/System.Windows.dll deleted file mode 100644 index b50adfabf..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Windows/4.0.0.0__b03f5f7f11d50a3a/System.Windows.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9dd8b000c13af004af3a053874d5c6841c30191285cb12169666de5e2af83096 -size 11776 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Workflow.Activities/4.0.0.0__31bf3856ad364e35/System.Workflow.Activities.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Workflow.Activities/4.0.0.0__31bf3856ad364e35/System.Workflow.Activities.dll deleted file mode 100644 index fca6386e2..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Workflow.Activities/4.0.0.0__31bf3856ad364e35/System.Workflow.Activities.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70380dbe9bb2f7f5579f53c46b18b1c8ac85b6a0b36113933e26bfaf1aeeb444 -size 11776 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Workflow.ComponentModel/4.0.0.0__31bf3856ad364e35/System.Workflow.ComponentModel.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Workflow.ComponentModel/4.0.0.0__31bf3856ad364e35/System.Workflow.ComponentModel.dll deleted file mode 100644 index 990b915ba..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Workflow.ComponentModel/4.0.0.0__31bf3856ad364e35/System.Workflow.ComponentModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5fb47a521d6edbd862a36f20e30c6ed7275a3179bb02a94f79c23c5244e8448f -size 11776 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Workflow.Runtime/4.0.0.0__31bf3856ad364e35/System.Workflow.Runtime.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Workflow.Runtime/4.0.0.0__31bf3856ad364e35/System.Workflow.Runtime.dll deleted file mode 100644 index 08ea70034..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Workflow.Runtime/4.0.0.0__31bf3856ad364e35/System.Workflow.Runtime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dcbf098fc2d8b45fcea56a8201ff87eef64d89619d93eca75f7b861636ddec8b -size 11264 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll deleted file mode 100644 index 2783d9369..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:424fc16dc7a4fad5c73212806b6fe43d49e20c76773e0dca1e076fc7a292e516 -size 188928 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll deleted file mode 100644 index 527d2a1d9..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f77fa2719801869c15b10054d69aa548138483e154bc9f09e3d97083729f1e5 -size 137216 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Xml.Serialization/4.0.0.0__b77a5c561934e089/System.Xml.Serialization.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Xml.Serialization/4.0.0.0__b77a5c561934e089/System.Xml.Serialization.dll deleted file mode 100644 index 45d70b5ae..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Xml.Serialization/4.0.0.0__b77a5c561934e089/System.Xml.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f56b44f5f88ed426881eed8694e9d9cca2fc9fe26fd976bcaf39eb78b66faa7 -size 11776 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll deleted file mode 100644 index f760b3b24..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93d2f7ea513070bb935c3bfe3ed4dbab4ba076d200b96d24da4d2ebc40132254 -size 3174400 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll deleted file mode 100644 index eaea89586..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a26701ea88189483c5c55726ba3569c095fed4dfa4695d4e1eb83f0cf51c881 -size 2566144 diff --git a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll b/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll deleted file mode 100644 index 3b16b367e..000000000 --- a/Source/Platforms/Linux/Binaries/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6868231ce3d2f2ab831ced917274c1053d9da8002245b05c8e9353b1d72dd9db -size 161792 diff --git a/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXCharacterKinematic_static_64.a b/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXCharacterKinematic_static_64.a index c0dad1db7..98a4a8286 100644 --- a/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXCharacterKinematic_static_64.a +++ b/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXCharacterKinematic_static_64.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:00b720d5334a37b789279ef6b722ae7caab196e81c7aa87c631d42f10a1b00ad -size 275100 +oid sha256:a9cf1125a7e1d0f2fb1a12b6f04537228cd37e3322cf818696a2d3446f97b953 +size 278626 diff --git a/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXCommon_static_64.a b/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXCommon_static_64.a index f375e25b2..242c33ca5 100644 --- a/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXCommon_static_64.a +++ b/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXCommon_static_64.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:06746bc2ab705240b02acb57343c04d300ab631764284e6d739ad18f68e9c5e8 -size 3427120 +oid sha256:19d0245e6dce80bb596ed10a154a5e18a5902df6c3e95c087e856fa6ca25f6f6 +size 4596892 diff --git a/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXCooking_static_64.a b/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXCooking_static_64.a index 1d53a5a11..e7d99ad1f 100644 --- a/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXCooking_static_64.a +++ b/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXCooking_static_64.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:763898108b13a0b9a893116fabf9b19fd965cff562b53cfb2efa5065e260e042 -size 472564 +oid sha256:3d44653d8526acb4fd631cf007941a656ab054552b9406cf54199abf7bfab98c +size 28284 diff --git a/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXExtensions_static_64.a b/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXExtensions_static_64.a index ca3082211..150fe2099 100644 --- a/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXExtensions_static_64.a +++ b/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXExtensions_static_64.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a59c674702234d870023cff9116d8efb28a46909fda667131b86c673ef4d77f9 -size 2695786 +oid sha256:0667c4d6515bb6c95c9ce5072edc56da7da45b6691eba2d3332f6b1db27c7511 +size 4081244 diff --git a/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXFoundation_static_64.a b/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXFoundation_static_64.a index 32454526c..94622de79 100644 --- a/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXFoundation_static_64.a +++ b/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXFoundation_static_64.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8d67b436ca3aae026cab321a7903d9129edfaee0e505445daf177c291bebd93c -size 124634 +oid sha256:db06448b20f3d0b14780730e7e884cb18be4b546dc228b84c0ad8d33b088dcd4 +size 121148 diff --git a/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXPvdSDK_static_64.a b/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXPvdSDK_static_64.a index 6bdc9ed2a..e49794ebc 100644 --- a/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXPvdSDK_static_64.a +++ b/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXPvdSDK_static_64.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:57ed89feefb710a61a1cf7febdfa841702b49a786e3fb9dc4cb56e6f8b14565d -size 522950 +oid sha256:419c688357cf3c4b781fa3cae601906be8e46d1de9d1238f8acb482166b5f837 +size 503210 diff --git a/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXVehicle2_static_64.a b/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXVehicle2_static_64.a new file mode 100644 index 000000000..2da3cad95 --- /dev/null +++ b/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXVehicle2_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5559f869db603d979003f6d8d3d35179db5193974f39481bc2ee821af27faf3 +size 195454 diff --git a/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXVehicle_static_64.a b/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXVehicle_static_64.a index 76f988461..abcca2a9a 100644 --- a/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXVehicle_static_64.a +++ b/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysXVehicle_static_64.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3fa5897e9bdd806ba15c372caed3d4c2e095305584af19a8a4ad159010159c63 -size 1180008 +oid sha256:427613612343bd0ea40d523ea0c7458a6ed927357fe4a277428d4ee0228bad95 +size 1209552 diff --git a/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysX_static_64.a b/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysX_static_64.a index 33641cf8b..12db8e2e6 100644 --- a/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysX_static_64.a +++ b/Source/Platforms/Linux/Binaries/ThirdParty/x64/libPhysX_static_64.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:87c0afbb01ce9d8fba8073e16c757c7d23b422d3298c481ee1ebe1fd5398c5c7 -size 6304412 +oid sha256:2b606e398be2f9772da1c0dd0f1b9aead20974cf03eeaa7a2df1a477eb6caff9 +size 6360866 diff --git a/Source/Platforms/Mac/Binaries/Mono/etc/mono/2.0/Browsers/Compat.browser b/Source/Platforms/Mac/Binaries/Mono/etc/mono/2.0/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/etc/mono/2.0/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Mac/Binaries/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Mac/Binaries/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Mac/Binaries/Mono/etc/mono/2.0/machine.config b/Source/Platforms/Mac/Binaries/Mono/etc/mono/2.0/machine.config deleted file mode 100644 index 2577c81dd..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/etc/mono/2.0/machine.config +++ /dev/null @@ -1,280 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
- - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Mac/Binaries/Mono/etc/mono/2.0/settings.map b/Source/Platforms/Mac/Binaries/Mono/etc/mono/2.0/settings.map deleted file mode 100644 index 9a52ccc02..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/etc/mono/2.0/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Mac/Binaries/Mono/etc/mono/2.0/web.config b/Source/Platforms/Mac/Binaries/Mono/etc/mono/2.0/web.config deleted file mode 100644 index e1428f8c3..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/etc/mono/2.0/web.config +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.0/Browsers/Compat.browser b/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.0/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.0/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.0/machine.config b/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.0/machine.config deleted file mode 100644 index f3b71c43c..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.0/machine.config +++ /dev/null @@ -1,307 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - - -
- -
-
-
-
- - - - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
-
-
-
- - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.0/settings.map b/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.0/settings.map deleted file mode 100644 index 4c53aca67..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.0/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.0/web.config b/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.0/web.config deleted file mode 100644 index 2a7dfd2ed..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.0/web.config +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.5/Browsers/Compat.browser b/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.5/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.5/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.5/machine.config b/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.5/machine.config deleted file mode 100644 index 455709536..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.5/machine.config +++ /dev/null @@ -1,310 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
- - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - - -
- -
-
-
-
- - - - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
-
-
-
- - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.5/settings.map b/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.5/settings.map deleted file mode 100644 index 4c53aca67..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.5/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.5/web.config b/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.5/web.config deleted file mode 100644 index 324c529f0..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/etc/mono/4.5/web.config +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Mac/Binaries/Mono/etc/mono/browscap.ini b/Source/Platforms/Mac/Binaries/Mono/etc/mono/browscap.ini deleted file mode 100644 index 1267e1deb..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/etc/mono/browscap.ini +++ /dev/null @@ -1,16979 +0,0 @@ -;;; Provided courtesy of http://browsers.garykeith.com -;;; Created on Wednesday, June 17, 2009 at 6:30 AM GMT - -[GJK_Browscap_Version] -Version=4476 -Released=Wed, 17 Jun 2009 06:30:21 -0000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DefaultProperties - -[DefaultProperties] -Browser=DefaultProperties -Version=0 -MajorVer=0 -MinorVer=0 -Platform=unknown -Alpha=false -Beta=false -Win16=false -Win32=false -Win64=false -Frames=false -IFrames=false -Tables=false -Cookies=false -BackgroundSounds=false -CDF=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -isBanned=false -isMobileDevice=false -isSyndicationReader=false -Crawler=false -CssVersion=0 -supportsCSS=false -AOL=false -aolVersion=0 -ECMAScriptVersion=0.0 -W3CDOMVersion=0.0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ask - -[Ask] -Parent=DefaultProperties -Browser=Ask -Frames=true -Tables=true -Crawler=true - -[Mozilla/?.0 (compatible; Ask Jeeves/Teoma*)] -Parent=Ask -Browser=Teoma - -[Mozilla/2.0 (compatible; Ask Jeeves)] -Parent=Ask -Browser=AskJeeves - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Baidu - -[Baidu] -Parent=DefaultProperties -Browser=Baidu -Frames=true -Tables=true -Crawler=true - -[BaiduImageSpider*] -Parent=Baidu -Browser=BaiduImageSpider - -[Baiduspider*] -Parent=Baidu -Browser=BaiDu - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google - -[Google] -Parent=DefaultProperties -Browser=Google -Frames=true -IFrames=true -Tables=true -JavaScript=true -Crawler=true - -[* (compatible; Googlebot-Mobile/2.1; *http://www.google.com/bot.html)] -Parent=Google -Browser=Googlebot-Mobile -Frames=false -IFrames=false -Tables=false - -[*Google Wireless Transcoder*] -Parent=Google -Browser=Google Wireless Transcoder - -[AdsBot-Google (?http://www.google.com/adsbot.html)] -Parent=Google -Browser=AdsBot-Google - -[Feedfetcher-Google-iGoogleGadgets;*] -Parent=Google -Browser=iGoogleGadgets -isBanned=true -isSyndicationReader=true - -[Feedfetcher-Google;*] -Parent=Google -Browser=Feedfetcher-Google -isBanned=true -isSyndicationReader=true - -[Google OpenSocial agent (http://www.google.com/feedfetcher.html)] -Parent=Google -Browser=Google OpenSocial - -[Google-Site-Verification/1.0] -Parent=Google -Browser=Google-Site-Verification - -[Google-Sitemaps/*] -Parent=Google -Browser=Google-Sitemaps - -[Googlebot-Image/*] -Parent=Google -Browser=Googlebot-Image -CDF=true - -[googlebot-urlconsole] -Parent=Google -Browser=googlebot-urlconsole - -[Googlebot-Video/1.0] -Parent=Google -Browser=Google-Video - -[Googlebot/2.1 (?http://www.google.com/bot.html)] -Parent=Google -Browser=Googlebot - -[Googlebot/2.1 (?http://www.googlebot.com/bot.html)] -Parent=Google -Browser=Googlebot - -[Googlebot/Test*] -Parent=Google -Browser=Googlebot/Test - -[gsa-crawler*] -Parent=Google -Browser=Google Search Appliance -isBanned=true - -[Mediapartners-Google*] -Parent=Google -Browser=Mediapartners-Google - -[Mozilla/4.0 (compatible; Google Desktop)] -Parent=Google -Browser=Google Desktop - -[Mozilla/4.0 (compatible; GoogleToolbar*)] -Parent=Google -Browser=Google Toolbar -isBanned=true - -[Mozilla/5.0 (compatible; Google Keyword Tool;*)] -Parent=Google -Browser=Google Keyword Tool - -[Mozilla/5.0 (compatible; Googlebot/2.1; ?http://www.google.com/bot.html)] -Parent=Google -Browser=Google Webmaster Tools - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Inktomi - -[Inktomi] -Parent=DefaultProperties -Browser=Inktomi -Frames=true -Tables=true -Crawler=true - -[* (compatible;YahooSeeker/M1A1-R2D2; *)] -Parent=Inktomi -Browser=YahooSeeker-Mobile -Frames=false -Tables=false - -[Mozilla/4.0] -Parent=Inktomi - -[Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)] -Parent=Inktomi -Win32=true - -[Mozilla/4.0 (compatible; Yahoo Japan; for robot study; kasugiya)] -Parent=Inktomi -Browser=Yahoo! RobotStudy -isBanned=true - -[Mozilla/5.0 (compatible; BMC/1.0 (Y!J-AGENT))] -Parent=Inktomi -Browser=Y!J-AGENT/BMC - -[Mozilla/5.0 (compatible; BMF/1.0 (Y!J-AGENT))] -Parent=Inktomi -Browser=Y!J-AGENT/BMF - -[Mozilla/5.0 (compatible; BMI/1.0 (Y!J-AGENT; 1.0))] -Parent=Inktomi -Browser=Y!J-AGENT/BMI - -[Mozilla/5.0 (compatible; Yahoo! DE Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Directory Engine - -[Mozilla/5.0 (compatible; Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html)] -Parent=Inktomi -Browser=Yahoo! Slurp China - -[Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Slurp -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Slurp - -[Mozilla/5.0 (compatible; Yahoo! Verifier/1.1)] -Parent=Inktomi -Browser=Yahoo! Verifier -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Slurp/cat; slurp@inktomi.com; http://www.inktomi.com/slurp.html)] -Parent=Inktomi -Browser=Slurp/cat - -[Mozilla/5.0 (Slurp/si; slurp@inktomi.com; http://www.inktomi.com/slurp.html)] -Parent=Inktomi - -[Mozilla/5.0 (Yahoo-MMCrawler/4.0; mailto:vertical-crawl-support@yahoo-inc.com)] -Parent=Inktomi -Browser=Yahoo-MMCrawler -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Scooter/*] -Parent=Inktomi -Browser=Scooter - -[Scooter/3.3Y!CrawlX] -Parent=Inktomi -Browser=Scooter/3.3Y!CrawlX -Version=3.3 -MajorVer=3 -MinorVer=3 - -[slurp] -Parent=Inktomi -Browser=slurp - -[Y!J-BSC/1.0*] -Parent=Inktomi -Browser=Y!J-BSC -Version=1.0 -MajorVer=1 -MinorVer=0 -isBanned=true - -[Y!J-SRD/1.0] -Parent=Inktomi -Browser=Y!J-SRD -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Yahoo Mindset] -Parent=Inktomi -Browser=Yahoo Mindset - -[Yahoo Pipes*] -Parent=Inktomi -Browser=Yahoo Pipes - -[Yahoo! Mindset] -Parent=Inktomi -Browser=Yahoo! Mindset - -[Yahoo! Slurp/Site Explorer] -Parent=Inktomi -Browser=Yahoo! Site Explorer - -[Yahoo-Blogs/*] -Parent=Inktomi -Browser=Yahoo-Blogs - -[Yahoo-MMAudVid*] -Parent=Inktomi -Browser=Yahoo-MMAudVid - -[Yahoo-MMCrawler*] -Parent=Inktomi -Browser=Yahoo-MMCrawler -isBanned=true - -[YahooFeedSeeker*] -Parent=Inktomi -Browser=YahooFeedSeeker -isSyndicationReader=true -Crawler=false - -[YahooSeeker/*] -Parent=Inktomi -Browser=YahooSeeker -isMobileDevice=true - -[YahooSeeker/CafeKelsa (compatible; Konqueror/3.2; FreeBSD*) (KHTML, like Gecko)] -Parent=Inktomi -Browser=YahooSeeker/CafeKelsa - -[YahooSeeker/CafeKelsa-dev (compatible; Konqueror/3.2; FreeBSD*) (KHTML, like Gecko)] -Parent=Inktomi - -[YahooVideoSearch*] -Parent=Inktomi -Browser=YahooVideoSearch - -[YahooYSMcm*] -Parent=Inktomi -Browser=YahooYSMcm - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN - -[MSN] -Parent=DefaultProperties -Browser=MSN -Frames=true -Tables=true -Crawler=true - -[adidxbot/1.1 (?http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=adidxbot - -[librabot/1.0 (*)] -Parent=MSN -Browser=librabot - -[llssbot/1.0] -Parent=MSN -Browser=llssbot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MSMOBOT/1.1*] -Parent=MSN -Browser=msnbot-mobile -Version=1.1 -MajorVer=1 -MinorVer=1 - -[MSNBot-Academic/1.0*] -Parent=MSN -Browser=MSNBot-Academic -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot-media/1.0*] -Parent=MSN -Browser=msnbot-media -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot-media/1.1*] -Parent=MSN -Browser=msnbot-media -Version=1.1 -MajorVer=1 -MinorVer=1 - -[MSNBot-News/1.0*] -Parent=MSN -Browser=MSNBot-News -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MSNBot-NewsBlogs/1.0*] -Parent=MSN -Browser=MSNBot-NewsBlogs -Version=1 -MajorVer=1 -MinorVer=0 - -[msnbot-products] -Parent=MSN -Browser=msnbot-products - -[msnbot-webmaster/1.0 (*http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=msnbot-webmaster tools - -[msnbot/1.0*] -Parent=MSN -Browser=msnbot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot/1.1*] -Parent=MSN -Browser=msnbot -Version=1.1 -MajorVer=1 -MinorVer=1 - -[msnbot/2.0b*] -Parent=MSN -Version=2.0 -MajorVer=2 -MinorVer=0 -Beta=true - -[MSR-ISRCCrawler] -Parent=MSN -Browser=MSR-ISRCCrawler - -[renlifangbot/1.0 (?http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=renlifangbot - -[T-Mobile Dash Mozilla/4.0 (*) MSNBOT-MOBILE/1.1 (*)] -Parent=MSN -Browser=msnbot-mobile - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yahoo - -[Yahoo] -Parent=DefaultProperties -Browser=Yahoo -Frames=true -Tables=true -Crawler=true - -[Mozilla/4.0 (compatible; Y!J; for robot study*)] -Parent=Yahoo -Browser=Y!J - -[Mozilla/5.0 (Yahoo-Test/4.0*)] -Parent=Yahoo -Browser=Yahoo-Test -Version=4.0 -MajorVer=4 -MinorVer=0 - -[mp3Spider cn-search-devel at yahoo-inc dot com] -Parent=Yahoo -Browser=Yahoo! Media -isBanned=true - -[My Browser] -Parent=Yahoo -Browser=Yahoo! My Browser - -[Y!OASIS/*] -Parent=Yahoo -Browser=Y!OASIS -isBanned=true - -[YahooYSMcm/2.0.0] -Parent=Yahoo -Browser=YahooYSMcm -Version=2.0 -MajorVer=2 -MinorVer=0 -isBanned=true - -[YRL_ODP_CRAWLER] -Parent=Yahoo -Browser=YRL_ODP_CRAWLER -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yandex - -[Yandex] -Parent=DefaultProperties -Browser=Yandex -Frames=true -IFrames=true -Tables=true -Cookies=true -Crawler=true - -[Mozilla/4.0 (compatible; MSIE 5.0; YANDEX)] -Parent=Yandex - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9) Gecko VisualParser/3.0] -Parent=Yandex -Browser=VisualParser -isBanned=true - -[YaDirectBot/*] -Parent=Yandex -Browser=YaDirectBot - -[Yandex/*] -Parent=Yandex - -[YandexBlog/*] -Parent=Yandex -Browser=YandexBlog -isSyndicationReader=true - -[YandexSomething/*] -Parent=Yandex -Browser=YandexSomething -isSyndicationReader=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Best of the Web - -[Best of the Web] -Parent=DefaultProperties -Browser=Best of the Web -Frames=true -Tables=true - -[Mozilla/4.0 (compatible; BOTW Feed Grabber; *http://botw.org)] -Parent=Best of the Web -Browser=BOTW Feed Grabber -isSyndicationReader=true -Crawler=false - -[Mozilla/4.0 (compatible; BOTW Spider; *http://botw.org)] -Parent=Best of the Web -Browser=BOTW Spider -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Boitho - -[Boitho] -Parent=DefaultProperties -Browser=Boitho -Frames=true -Tables=true -Crawler=true - -[boitho.com-dc/*] -Parent=Boitho -Browser=boitho.com-dc - -[boitho.com-robot/*] -Parent=Boitho -Browser=boitho.com-robot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Convera - -[Convera] -Parent=DefaultProperties -Browser=Convera -Frames=true -Tables=true -Crawler=true - -[ConveraCrawler/*] -Parent=Convera -Browser=ConveraCrawler - -[ConveraMultiMediaCrawler/0.1*] -Parent=Convera -Browser=ConveraMultiMediaCrawler -Version=0.1 -MajorVer=0 -MinorVer=1 - -[CrawlConvera*] -Parent=Convera -Browser=CrawlConvera - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DotBot - -[DotBot] -Parent=DefaultProperties -Browser=DotBot -Frames=true -Tables=true -isBanned=true -Crawler=true - -[DotBot/* (http://www.dotnetdotcom.org/*)] -Parent=DotBot - -[Mozilla/5.0 (compatible; DotBot/*; http://www.dotnetdotcom.org/*)] -Parent=DotBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Entireweb - -[Entireweb] -Parent=DefaultProperties -Browser=Entireweb -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[Mozilla/4.0 (compatible; SpeedySpider; www.entireweb.com)] -Parent=Entireweb - -[Speedy Spider (*Beta/*)] -Parent=Entireweb - -[Speedy?Spider?(http://www.entireweb.com*)] -Parent=Entireweb - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Envolk - -[Envolk] -Parent=DefaultProperties -Browser=Envolk -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[envolk/* (?http://www.envolk.com/envolk*)] -Parent=Envolk - -[envolk?ITS?spider/* (?http://www.envolk.com/envolk*)] -Parent=Envolk - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Exalead - -[Exalead] -Parent=DefaultProperties -Browser=Exalead -Frames=true -Tables=true -isBanned=true -Crawler=true - -[Exabot-Images/1.0] -Parent=Exalead -Browser=Exabot-Images -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Exabot-Test/*] -Parent=Exalead -Browser=Exabot-Test - -[Exabot/2.0] -Parent=Exalead -Browser=Exabot - -[Exabot/3.0] -Parent=Exalead -Browser=Exabot -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Liberate - -[Exalead NG/*] -Parent=Exalead -Browser=Exalead NG -isBanned=true - -[Mozilla/5.0 (compatible; Exabot-Images/3.0;*)] -Parent=Exalead -Browser=Exabot-Images - -[Mozilla/5.0 (compatible; Exabot/3.0 (BiggerBetter/tests);*)] -Parent=Exalead -Browser=Exabot/BiggerBetter/tests - -[Mozilla/5.0 (compatible; Exabot/3.0;*)] -Parent=Exalead -Browser=Exabot -isBanned=false - -[Mozilla/5.0 (compatible; NGBot/*)] -Parent=Exalead - -[ng/*] -Parent=Exalead -Browser=Exalead Previewer -Version=1.0 -MajorVer=1 -MinorVer=0 -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fast/AllTheWeb - -[Fast/AllTheWeb] -Parent=DefaultProperties -Browser=Fast/AllTheWeb -Alpha=true -Beta=true -Win16=true -Win32=true -Win64=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -isBanned=true -isMobileDevice=true -isSyndicationReader=true -Crawler=true - -[*FAST Enterprise Crawler*] -Parent=Fast/AllTheWeb -Browser=FAST Enterprise Crawler - -[FAST Data Search Document Retriever/4.0*] -Parent=Fast/AllTheWeb -Browser=FAST Data Search Document Retriever - -[FAST MetaWeb Crawler (helpdesk at fastsearch dot com)] -Parent=Fast/AllTheWeb -Browser=FAST MetaWeb Crawler - -[Fast PartnerSite Crawler*] -Parent=Fast/AllTheWeb -Browser=FAST PartnerSite - -[FAST-WebCrawler/*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler - -[FAST-WebCrawler/*/FirstPage*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/FirstPage - -[FAST-WebCrawler/*/Fresh*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/Fresh - -[FAST-WebCrawler/*/PartnerSite*] -Parent=Fast/AllTheWeb -Browser=FAST PartnerSite - -[FAST-WebCrawler/*?Multimedia*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/Multimedia - -[FastSearch Web Crawler for*] -Parent=Fast/AllTheWeb -Browser=FastSearch Web Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Gigabot - -[Gigabot] -Parent=DefaultProperties -Browser=Gigabot -Frames=true -IFrames=true -Tables=true -Crawler=true - -[Gigabot*] -Parent=Gigabot - -[GigabotSiteSearch/*] -Parent=Gigabot -Browser=GigabotSiteSearch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ilse - -[Ilse] -Parent=DefaultProperties -Browser=Ilse -Frames=true -Tables=true -Crawler=true - -[IlseBot/*] -Parent=Ilse - -[INGRID/?.0*] -Parent=Ilse -Browser=Ilse - -[Mozilla/3.0 (INGRID/*] -Parent=Ilse -Browser=Ilse - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iVia Project - -[iVia Project] -Parent=DefaultProperties -Browser=iVia Project -Frames=true -IFrames=true -Tables=true -Crawler=true - -[DataFountains/DMOZ Downloader*] -Parent=iVia Project -Browser=DataFountains/DMOZ Downloader -isBanned=true - -[DataFountains/DMOZ Feature Vector Corpus Creator*] -Parent=iVia Project -Browser=DataFountains/DMOZ Feature Vector Corpus - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Jayde Online - -[Jayde Online] -Parent=DefaultProperties -Browser=Jayde Online -Frames=true -Tables=true -Crawler=true - -[ExactSeek Crawler/*] -Parent=Jayde Online -Browser=ExactSeek Crawler - -[exactseek-pagereaper-* (crawler@exactseek.com)] -Parent=Jayde Online -Browser=exactseek-pagereaper -isBanned=true - -[exactseek.com] -Parent=Jayde Online -Browser=exactseek.com - -[Jayde Crawler*] -Parent=Jayde Online -Browser=Jayde Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycos - -[Lycos] -Parent=DefaultProperties -Browser=Lycos -Frames=true -Tables=true -Crawler=true - -[Lycos*] -Parent=Lycos -Browser=Lycos - -[Lycos-Proxy] -Parent=Lycos -Browser=Lycos-Proxy - -[Lycos-Spider_(modspider)] -Parent=Lycos -Browser=Lycos-Spider_(modspider) - -[Lycos-Spider_(T-Rex)] -Parent=Lycos -Browser=Lycos-Spider_(T-Rex) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Naver - -[Naver] -Parent=DefaultProperties -Browser=Naver -isBanned=true -Crawler=true - -[Cowbot-* (NHN Corp*naver.com)] -Parent=Naver -Browser=Naver Cowbot - -[Mozilla/4.0 (compatible; NaverBot/*; *)] -Parent=Naver - -[Mozilla/4.0 (compatible; NaverBot/*; nhnbot@naver.com)] -Parent=Naver -Browser=Naver NaverBot - -[NaverBot-* (NHN Corp*naver.com)] -Parent=Naver -Browser=Naver NHN Corp - -[Yeti/*] -Parent=Naver -Browser=Yeti - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Snap - -[Snap] -Parent=DefaultProperties -Browser=Snap -isBanned=true -Crawler=true - -[Mozilla/5.0 (SnapPreviewBot) Gecko/* Firefox/*] -Parent=Snap - -[Snapbot/*] -Parent=Snap - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sogou - -[Sogou] -Parent=DefaultProperties -Browser=Sogou -Frames=true -Tables=true -isBanned=true -Crawler=true - -[shaboyi spider] -Parent=Sogou -Browser=Sogou/Shaboyi Spider - -[Sogou develop spider/*] -Parent=Sogou -Browser=Sogou Develop Spider - -[Sogou head spider*] -Parent=Sogou -Browser=Sogou/HEAD Spider - -[sogou js robot(*)] -Parent=Sogou - -[Sogou Orion spider/*] -Parent=Sogou -Browser=Sogou Orion spider - -[Sogou Pic Agent] -Parent=Sogou -Browser=Sogou/Image Crawler - -[Sogou Pic Spider] -Parent=Sogou -Browser=Sogou Pic Spider - -[Sogou Push Spider/*] -Parent=Sogou -Browser=Sogou Push Spider - -[sogou spider] -Parent=Sogou -Browser=Sogou/Spider - -[sogou web spider*] -Parent=Sogou -Browser=sogou web spider - -[Sogou-Test-Spider/*] -Parent=Sogou -Browser=Sogou-Test-Spider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; YodaoBot - -[YodaoBot] -Parent=DefaultProperties -Browser=YodaoBot -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[Mozilla/5.0 (compatible; YodaoBot/1.*)] -Parent=YodaoBot - -[Mozilla/5.0 (compatible;YodaoBot-Image/1.*)] -Parent=YodaoBot -Browser=YodaoBot-Image - -[WAP_Browser/5.0 (compatible; YodaoBot/1.*)] -Parent=YodaoBot - -[YodaoBot/1.* (*)] -Parent=YodaoBot - -[Best Whois (http://www.bestwhois.net/)] -Parent=DNS Tools -Browser=Best Whois - -[DNSGroup/*] -Parent=DNS Tools -Browser=DNS Group Crawler - -[NG-Search/*] -Parent=Exalead -Browser=NG-SearchBot - -[TouchStone] -Parent=Feeds Syndicators -Browser=TouchStone -isSyndicationReader=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; General Crawlers - -[General Crawlers] -Parent=DefaultProperties -Browser=General Crawlers -Crawler=true - -[A .NET Web Crawler] -Parent=General Crawlers -isBanned=true - -[BabalooSpider/1.*] -Parent=General Crawlers -Browser=BabalooSpider - -[BilgiBot/*] -Parent=General Crawlers -Browser=BilgiBot -isBanned=true - -[bot/* (bot; *bot@bot.bot)] -Parent=General Crawlers -Browser=bot -isBanned=true - -[CyberPatrol*] -Parent=General Crawlers -Browser=CyberPatrol -isBanned=true - -[Cynthia 1.0] -Parent=General Crawlers -Browser=Cynthia -Version=1.0 -MajorVer=1 -MinorVer=0 - -[ddetailsbot (http://www.displaydetails.com)] -Parent=General Crawlers -Browser=ddetailsbot - -[DomainCrawler/1.0 (info@domaincrawler.com; http://www.domaincrawler.com/domains/view/*)] -Parent=General Crawlers -Browser=DomainCrawler - -[DomainsBotBot/1.*] -Parent=General Crawlers -Browser=DomainsBotBot -isBanned=true - -[DomainsDB.net MetaCrawler*] -Parent=General Crawlers -Browser=DomainsDB - -[Drupal (*)] -Parent=General Crawlers -Browser=Drupal - -[Dumbot (version *)*] -Parent=General Crawlers -Browser=Dumbfind - -[EuripBot/*] -Parent=General Crawlers -Browser=Europe Internet Portal - -[eventax/*] -Parent=General Crawlers -Browser=eventax - -[FANGCrawl/*] -Parent=General Crawlers -Browser=Safe-t.net Web Filtering Service -isBanned=true - -[favorstarbot/*] -Parent=General Crawlers -Browser=favorstarbot -isBanned=true - -[FollowSite.com (*)] -Parent=General Crawlers -Browser=FollowSite -isBanned=true - -[Gaisbot*] -Parent=General Crawlers -Browser=Gaisbot - -[Healthbot/Health_and_Longevity_Project_(HealthHaven.com) ] -Parent=General Crawlers -Browser=Healthbot -isBanned=true - -[hitcrawler_0.*] -Parent=General Crawlers -Browser=hitcrawler -isBanned=true - -[htdig/*] -Parent=General Crawlers -Browser=ht://Dig - -[http://hilfe.acont.de/bot.html ACONTBOT] -Parent=General Crawlers -Browser=ACONTBOT -isBanned=true - -[JetBrains*] -Parent=General Crawlers -Browser=Omea Pro - -[KakleBot - www.kakle.com/0.1] -Parent=General Crawlers -Browser=KakleBot - -[KBeeBot/0.*] -Parent=General Crawlers -Browser=KBeeBot -isBanned=true - -[Keyword Density/*] -Parent=General Crawlers -Browser=Keyword Density - -[LetsCrawl.com/1.0*] -Parent=General Crawlers -Browser=LetsCrawl.com -isBanned=true - -[Lincoln State Web Browser] -Parent=General Crawlers -Browser=Lincoln State Web Browser -isBanned=true - -[Links4US-Crawler,*] -Parent=General Crawlers -Browser=Links4US-Crawler -isBanned=true - -[Lorkyll *.* -- lorkyll@444.net] -Parent=General Crawlers -Browser=Lorkyll -isBanned=true - -[Lsearch/sondeur] -Parent=General Crawlers -Browser=Lsearch/sondeur -isBanned=true - -[LucidMedia ClickSense/4.?] -Parent=General Crawlers -Browser=LucidMedia-ClickSense -isBanned=true - -[MapoftheInternet.com?(?http://MapoftheInternet.com)] -Parent=General Crawlers -Browser=MapoftheInternet -isBanned=true - -[Marvin v0.3] -Parent=General Crawlers -Browser=MedHunt -Version=0.3 -MajorVer=0 -MinorVer=3 - -[masidani_bot_v0.6*] -Parent=General Crawlers -Browser=masidani_bot - -[Metaspinner/0.01 (Metaspinner; http://www.meta-spinner.de/; support@meta-spinner.de/)] -Parent=General Crawlers -Browser=Metaspinner/0.01 -Version=0.01 -MajorVer=0 -MinorVer=01 - -[metatagsdir/*] -Parent=General Crawlers -Browser=metatagsdir -isBanned=true - -[Microsoft Windows Network Diagnostics] -Parent=General Crawlers -Browser=Microsoft Windows Network Diagnostics -isBanned=true - -[Miva (AlgoFeedback@miva.com)] -Parent=General Crawlers -Browser=Miva - -[moget/*] -Parent=General Crawlers -Browser=Goo - -[Mozdex/0.7.2*] -Parent=General Crawlers -Browser=Mozdex - -[Mozilla Compatible (MS IE 3.01 WinNT)] -Parent=General Crawlers -isBanned=true - -[Mozilla/* (compatible; WebCapture*)] -Parent=General Crawlers -Browser=WebCapture - -[Mozilla/4.0 (compatible; DepSpid/*)] -Parent=General Crawlers -Browser=DepSpid - -[Mozilla/4.0 (compatible; MSIE *; Windows NT *; SV1)] -Parent=General Crawlers -Browser=AVG - -[Mozilla/4.0 (compatible; MSIE 4.01; Vonna.com b o t)] -Parent=General Crawlers -Browser=Vonna.com -isBanned=true - -[Mozilla/4.0 (compatible; MSIE 4.01; Windows95)] -Parent=General Crawlers -Win32=true - -[Mozilla/4.0 (compatible; MSIE 4.5; Windows 98; )] -Parent=General Crawlers -Win32=true - -[Mozilla/4.0 (compatible; MyFamilyBot/*)] -Parent=General Crawlers -Browser=MyFamilyBot - -[Mozilla/4.0 (compatible; N-Stealth)] -Parent=General Crawlers -Browser=N-Stealth - -[Mozilla/4.0 (compatible; Scumbot/*; Linux/*)] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.0 (compatible; Spider; Linux)] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.0 (compatible; Win32)] -Parent=General Crawlers -Browser=Unknown Crawler -isBanned=true - -[Mozilla/4.1] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.5] -Parent=General Crawlers -isBanned=true - -[Mozilla/5.0 (*http://gnomit.com/) Gecko/* Gnomit/1.0] -Parent=General Crawlers -Browser=Gnomit -isBanned=true - -[Mozilla/5.0 (compatible; AboutUsBot/*)] -Parent=General Crawlers -Browser=AboutUsBot -isBanned=true - -[Mozilla/5.0 (compatible; BuzzRankingBot/*)] -Parent=General Crawlers -Browser=BuzzRankingBot -isBanned=true - -[Mozilla/5.0 (compatible; Diffbot/0.1; http://www.diffbot.com)] -Parent=General Crawlers -Browser=Diffbot - -[Mozilla/5.0 (compatible; FirstSearchBot/1.0; *)] -Parent=General Crawlers -Browser=FirstSearchBot - -[mozilla/5.0 (compatible; genevabot http://www.healthdash.com)] -Parent=General Crawlers -Browser=Healthdash - -[Mozilla/5.0 (compatible; JadynAveBot; *http://www.jadynave.com/robot*] -Parent=General Crawlers -Browser=JadynAveBot -isBanned=true - -[Mozilla/5.0 (compatible; Kyluka crawl; http://www.kyluka.com/crawl.html; crawl@kyluka.com)] -Parent=General Crawlers -Browser=Kyluka - -[Mozilla/5.0 (compatible; MJ12bot/v1.2.*; http://www.majestic12.co.uk/bot.php*)] -Parent=General Crawlers -Browser=MJ12bot -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (compatible; MSIE 7.0 ?http://www.europarchive.org)] -Parent=General Crawlers -Browser=Europe Web Archive - -[Mozilla/5.0 (compatible; Seznam screenshot-generator 2.0;*)] -Parent=General Crawlers -Browser=Seznam screenshot-generator -isBanned=true - -[Mozilla/5.0 (compatible; Twingly Recon; http://www.twingly.com/)] -Parent=General Crawlers -Browser=Twingly Recon - -[Mozilla/5.0 (compatible; unwrapbot/2.*; http://www.unwrap.jp*)] -Parent=General Crawlers -Browser=UnWrap - -[Mozilla/5.0 (compatible; Vermut*)] -Parent=General Crawlers -Browser=Vermut - -[Mozilla/5.0 (compatible; Webbot/*)] -Parent=General Crawlers -Browser=Webbot.ru -isBanned=true - -[n4p_bot*] -Parent=General Crawlers -Browser=n4p_bot - -[nabot*] -Parent=General Crawlers -Browser=Nabot - -[NetCarta_WebMapper/*] -Parent=General Crawlers -Browser=NetCarta_WebMapper -isBanned=true - -[NetID.com Bot*] -Parent=General Crawlers -Browser=NetID.com Bot -isBanned=true - -[neTVision AG andreas.heidoetting@thomson-webcast.net] -Parent=General Crawlers -Browser=neTVision - -[NextopiaBOT*] -Parent=General Crawlers -Browser=NextopiaBOT - -[nicebot] -Parent=General Crawlers -Browser=nicebot -isBanned=true - -[niXXieBot?Foster*] -Parent=General Crawlers -Browser=niXXiebot-Foster - -[Nozilla/P.N (Just for IDS woring)] -Parent=General Crawlers -Browser=Nozilla/P.N -isBanned=true - -[Nudelsalat/*] -Parent=General Crawlers -Browser=Nudelsalat -isBanned=true - -[NV32ts] -Parent=General Crawlers -Browser=NV32ts -isBanned=true - -[Ocelli/*] -Parent=General Crawlers -Browser=Ocelli - -[OpenTaggerBot (http://www.opentagger.com/opentaggerbot.htm)] -Parent=General Crawlers -Browser=OpenTaggerBot - -[Oracle Enterprise Search] -Parent=General Crawlers -Browser=Oracle Enterprise Search -isBanned=true - -[Oracle Ultra Search] -Parent=General Crawlers -Browser=Oracle Ultra Search - -[Pajaczek/*] -Parent=General Crawlers -Browser=Pajaczek -isBanned=true - -[panscient.com] -Parent=General Crawlers -Browser=panscient.com -isBanned=true - -[Patwebbot (http://www.herz-power.de/technik.html)] -Parent=General Crawlers -Browser=Patwebbot - -[PDFBot (crawler@pdfind.com)] -Parent=General Crawlers -Browser=PDFBot - -[Pete-Spider/1.*] -Parent=General Crawlers -Browser=Pete-Spider -isBanned=true - -[PhpDig/*] -Parent=General Crawlers -Browser=PhpDig - -[PlantyNet_WebRobot*] -Parent=General Crawlers -Browser=PlantyNet -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PluckIt - -[PluckItCrawler/1.0 (*)] -Parent=General Crawlers -isMobileDevice=true - -[PMAFind] -Parent=General Crawlers -Browser=PMAFind -isBanned=true - -[Poodle_predictor_1.0] -Parent=General Crawlers -Browser=Poodle Predictor - -[QuickFinder Crawler] -Parent=General Crawlers -Browser=QuickFinder -isBanned=true - -[Radiation Retriever*] -Parent=General Crawlers -Browser=Radiation Retriever -isBanned=true - -[RedCarpet/*] -Parent=General Crawlers -Browser=RedCarpet -isBanned=true - -[RixBot (http://babelserver.org/rix)] -Parent=General Crawlers -Browser=RixBot - -[Rome Client (http://tinyurl.com/64t5n) Ver: 0.*] -Parent=General Crawlers -Browser=TinyURL - -[SBIder/*] -Parent=General Crawlers -Browser=SiteSell - -[ScollSpider/2.*] -Parent=General Crawlers -Browser=ScollSpider -isBanned=true - -[Search Fst] -Parent=General Crawlers -Browser=Search Fst - -[searchbot admin@google.com] -Parent=General Crawlers -Browser=searchbot -isBanned=true - -[Seeker.lookseek.com] -Parent=General Crawlers -Browser=LookSeek -isBanned=true - -[semanticdiscovery/*] -Parent=General Crawlers -Browser=Semantic Discovery - -[SeznamBot/*] -Parent=General Crawlers -Browser=SeznamBot -isBanned=true - -[Shelob (shelob@gmx.net)] -Parent=General Crawlers -Browser=Shelob -isBanned=true - -[shelob v1.*] -Parent=General Crawlers -Browser=shelob -isBanned=true - -[ShopWiki/1.0*] -Parent=General Crawlers -Browser=ShopWiki -Version=1.0 -MajorVer=1 -MinorVer=0 - -[ShowXML/1.0 libwww/5.4.0] -Parent=General Crawlers -Browser=ShowXML -isBanned=true - -[sitecheck.internetseer.com*] -Parent=General Crawlers -Browser=Internetseer - -[SMBot/*] -Parent=General Crawlers -Browser=SMBot - -[sohu*] -Parent=General Crawlers -Browser=sohu-search -isBanned=true - -[SpankBot*] -Parent=General Crawlers -Browser=SpankBot -isBanned=true - -[spider (tspyyp@tom.com)] -Parent=General Crawlers -Browser=spider (tspyyp@tom.com) -isBanned=true - -[Sunrise/0.*] -Parent=General Crawlers -Browser=Sunrise -isBanned=true - -[Superpages URL Verification Engine] -Parent=General Crawlers -Browser=Superpages - -[Surf Knight] -Parent=General Crawlers -Browser=Surf Knight -isBanned=true - -[SurveyBot/*] -Parent=General Crawlers -Browser=SurveyBot -isBanned=true - -[SynapticSearch/AI Crawler 1.?] -Parent=General Crawlers -Browser=SynapticSearch -isBanned=true - -[SyncMgr] -Parent=General Crawlers -Browser=SyncMgr - -[Tagyu Agent/1.0] -Parent=General Crawlers -Browser=Tagyu - -[Talkro Web-Shot/*] -Parent=General Crawlers -Browser=Talkro Web-Shot -isBanned=true - -[Tecomi Bot (http://www.tecomi.com/bot.htm)] -Parent=General Crawlers -Browser=Tecomi - -[TheInformant*] -Parent=General Crawlers -Browser=TheInformant -isBanned=true - -[Toata dragostea*] -Parent=General Crawlers -Browser=Toata dragostea -isBanned=true - -[Tutorial Crawler*] -Parent=General Crawlers -isBanned=true - -[UbiCrawler/*] -Parent=General Crawlers -Browser=UbiCrawler - -[UCmore] -Parent=General Crawlers -Browser=UCmore - -[User*Agent:*] -Parent=General Crawlers -isBanned=true - -[USER_AGENT] -Parent=General Crawlers -Browser=USER_AGENT -isBanned=true - -[VadixBot] -Parent=General Crawlers -Browser=VadixBot - -[VengaBot/*] -Parent=General Crawlers -Browser=VengaBot -isBanned=true - -[Visicom Toolbar] -Parent=General Crawlers -Browser=Visicom Toolbar - -[W3C-WebCon/*] -Parent=General Crawlers -Browser=W3C-WebCon - -[Webclipping.com] -Parent=General Crawlers -Browser=Webclipping.com -isBanned=true - -[webcollage/*] -Parent=General Crawlers -Browser=WebCollage -isBanned=true - -[WebCrawler_1.*] -Parent=General Crawlers -Browser=WebCrawler - -[WebFilter Robot*] -Parent=General Crawlers -Browser=WebFilter Robot - -[WeBoX/*] -Parent=General Crawlers -Browser=WeBoX - -[WebTrends/*] -Parent=General Crawlers -Browser=WebTrends - -[West Wind Internet Protocols*] -Parent=General Crawlers -Browser=Versatel -isBanned=true - -[WhizBang] -Parent=General Crawlers -Browser=WhizBang - -[Willow Internet Crawler by Twotrees V*] -Parent=General Crawlers -Browser=Willow Internet Crawler - -[WIRE/* (Linux; i686; Bot,Robot,Spider,Crawler)] -Parent=General Crawlers -Browser=WIRE -isBanned=true - -[www.fi crawler, contact crawler@www.fi] -Parent=General Crawlers -Browser=www.fi crawler - -[Xerka WebBot v1.*] -Parent=General Crawlers -Browser=Xerka -isBanned=true - -[XML Sitemaps Generator*] -Parent=General Crawlers -Browser=XML Sitemaps Generator - -[XSpider*] -Parent=General Crawlers -Browser=XSpider -isBanned=true - -[YooW!/* (?http://www.yoow.eu)] -Parent=General Crawlers -Browser=YooW! -isBanned=true - -[HiddenMarket-*] -Parent=General RSS -Browser=HiddenMarket -isBanned=true - -[FOTOCHECKER] -Parent=Image Crawlers -Browser=FOTOCHECKER -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Search Engines - -[Search Engines] -Parent=DefaultProperties -Browser=Search Engines -Crawler=true - -[*FDSE robot*] -Parent=Search Engines -Browser=FDSE Robot - -[*Fluffy the spider*] -Parent=Search Engines -Browser=SearchHippo - -[Abacho*] -Parent=Search Engines -Browser=Abacho - -[ah-ha.com crawler (crawler@ah-ha.com)] -Parent=Search Engines -Browser=Ah-Ha - -[AIBOT/*] -Parent=Search Engines -Browser=21Seek.Com - -[ALeadSoftbot/*] -Parent=Search Engines -Browser=ALeadSoftbot - -[Amfibibot/*] -Parent=Search Engines -Browser=Amfibi - -[AnswerBus (http://www.answerbus.com/)] -Parent=Search Engines - -[antibot-V*] -Parent=Search Engines -Browser=antibot - -[appie*(www.walhello.com)] -Parent=Search Engines -Browser=Walhello - -[ASPSeek/*] -Parent=Search Engines -Browser=ASPSeek - -[BigCliqueBOT/*] -Parent=Search Engines -Browser=BigClique.com/BigClic.com - -[Blaiz-Bee/*] -Parent=Search Engines -Browser=RawGrunt - -[btbot/*] -Parent=Search Engines -Browser=Bit Torrent Search Engine - -[Busiversebot/v1.0 (http://www.busiverse.com/bot.php)] -Parent=Search Engines -Browser=Busiversebot -isBanned=true - -[CatchBot/*; http://www.catchbot.com] -Parent=Search Engines -Browser=CatchBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[CipinetBot (http://www.cipinet.com/bot.html)] -Parent=Search Engines -Browser=CipinetBot - -[Cogentbot/1.?*] -Parent=Search Engines -Browser=Cogentbot - -[compatible; Mozilla 4.0; MSIE 5.5; (SqwidgeBot v1.01 - http://www.sqwidge.com/bot/)] -Parent=Search Engines -Browser=SqwidgeBot - -[cosmos*] -Parent=Search Engines -Browser=Xyleme - -[Deepindex] -Parent=Search Engines -Browser=Deepindex - -[DiamondBot] -Parent=Search Engines -Browser=DiamondBot - -[Dumbot*] -Parent=Search Engines -Browser=Dumbot -Version=0.2 -MajorVer=0 -MinorVer=2 -Beta=true - -[Eule?Robot*] -Parent=Search Engines -Browser=Eule-Robot - -[Faxobot/*] -Parent=Search Engines -Browser=Faxo - -[Filangy/*] -Parent=Search Engines -Browser=Filangy - -[flatlandbot/*] -Parent=Search Engines -Browser=Flatland - -[Fooky.com/ScorpionBot/ScoutOut;*] -Parent=Search Engines -Browser=ScorpionBot -isBanned=true - -[FyberSpider*] -Parent=Search Engines -Browser=FyberSpider -isBanned=true - -[Gaisbot/*] -Parent=Search Engines -Browser=Gaisbot - -[gazz/*(gazz@nttr.co.jp)] -Parent=Search Engines -Browser=gazz - -[geniebot*] -Parent=Search Engines -Browser=GenieKnows - -[GOFORITBOT (?http://www.goforit.com/about/?)] -Parent=Search Engines -Browser=GoForIt - -[GoGuidesBot/*] -Parent=Search Engines -Browser=GoGuidesBot - -[GroschoBot/*] -Parent=Search Engines -Browser=GroschoBot - -[GurujiBot/1.*] -Parent=Search Engines -Browser=GurujiBot -isBanned=true - -[HenryTheMiragoRobot*] -Parent=Search Engines -Browser=Mirago - -[HolmesBot (http://holmes.ge)] -Parent=Search Engines -Browser=HolmesBot - -[Hotzonu/*] -Parent=Search Engines -Browser=Hotzonu - -[HyperEstraier/*] -Parent=Search Engines -Browser=HyperEstraier -isBanned=true - -[i1searchbot/*] -Parent=Search Engines -Browser=i1searchbot - -[IIITBOT/1.*] -Parent=Search Engines -Browser=Indian Language Web Search Engine - -[Iltrovatore-?etaccio/*] -Parent=Search Engines -Browser=Iltrovatore-Setaccio - -[InfociousBot (?http://corp.infocious.com/tech_crawler.php)] -Parent=Search Engines -Browser=InfociousBot -isBanned=true - -[Infoseek SideWinder/*] -Parent=Search Engines -Browser=Infoseek - -[iSEEKbot/*] -Parent=Search Engines -Browser=iSEEKbot - -[Knight/0.? (Zook Knight; http://knight.zook.in/; knight@zook.in)] -Parent=Search Engines -Browser=Knight - -[Kolinka Forum Search (www.kolinka.com)] -Parent=Search Engines -Browser=Kolinka Forum Search -isBanned=true - -[KRetrieve/] -Parent=Search Engines -Browser=KRetrieve -isBanned=true - -[LapozzBot/*] -Parent=Search Engines -Browser=LapozzBot - -[Linknzbot*] -Parent=Search Engines -Browser=Linknzbot - -[LocalcomBot/*] -Parent=Search Engines -Browser=LocalcomBot - -[Mail.Ru/1.0] -Parent=Search Engines -Browser=Mail.Ru - -[MaSagool/*] -Parent=Search Engines -Browser=Sagoo -Version=1.0 -MajorVer=1 -MinorVer=0 - -[miniRank/*] -Parent=Search Engines -Browser=miniRank - -[Mnogosearch*] -Parent=Search Engines -Browser=Mnogosearch - -[Mozilla/0.9* no dos :) (Linux)] -Parent=Search Engines -Browser=goliat -isBanned=true - -[Mozilla/4.0 (compatible; Arachmo)] -Parent=Search Engines -Browser=Arachmo - -[Mozilla/4.0 (compatible; http://search.thunderstone.com/texis/websearch/about.html)] -Parent=Search Engines -Browser=ThunderStone -isBanned=true - -[Mozilla/4.0 (compatible; MSIE *; Windows NT; Girafabot; girafabot at girafa dot com; http://www.girafa.com)] -Parent=Search Engines -Browser=Girafabot -Win32=true - -[Mozilla/4.0 (compatible; Vagabondo/*; webcrawler at wise-guys dot nl; *)] -Parent=Search Engines -Browser=Vagabondo - -[Mozilla/4.0(?compatible; MSIE 6.0; Qihoo *)] -Parent=Search Engines -Browser=Qihoo - -[Mozilla/4.7 (compatible; WhizBang; http://www.whizbang.com/crawler)] -Parent=Search Engines -Browser=Inxight Software - -[Mozilla/5.0 (*) VoilaBot*] -Parent=Search Engines -Browser=VoilaBot -isBanned=true - -[Mozilla/5.0 (compatible; ActiveTouristBot*; http://www.activetourist.com)] -Parent=Search Engines -Browser=ActiveTouristBot - -[Mozilla/5.0 (compatible; Butterfly/1.0; *)*] -Parent=Search Engines -Browser=Butterfly - -[Mozilla/5.0 (compatible; Charlotte/*; *)] -Parent=Search Engines -Browser=Charlotte -Beta=true -isBanned=true - -[Mozilla/5.0 (compatible; CXL-FatAssANT*)] -Parent=Search Engines -Browser=FatAssANT - -[Mozilla/5.0 (compatible; DBLBot/1.0; ?http://www.dontbuylists.com/)] -Parent=Search Engines -Browser=DBLBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (compatible; EARTHCOM.info/*)] -Parent=Search Engines -Browser=EARTHCOM - -[Mozilla/5.0 (compatible; Lipperhey Spider; http://www.lipperhey.com/)] -Parent=Search Engines -Browser=Lipperhey Spider - -[Mozilla/5.0 (compatible; MojeekBot/*; http://www.mojeek.com/bot.html)] -Parent=Search Engines -Browser=MojeekBot - -[Mozilla/5.0 (compatible; NLCrawler/*] -Parent=Search Engines -Browser=Northern Light Web Search - -[Mozilla/5.0 (compatible; OsO;*] -Parent=Search Engines -Browser=Octopodus -isBanned=true - -[Mozilla/5.0 (compatible; Pogodak.*)] -Parent=Search Engines -Browser=Pogodak - -[Mozilla/5.0 (compatible; Quantcastbot/1.*)] -Parent=Search Engines -Browser=Quantcastbot - -[Mozilla/5.0 (compatible; ScoutJet; *http://www.scoutjet.com/)] -Parent=Search Engines -Browser=ScoutJet - -[Mozilla/5.0 (compatible; Scrubby/*; http://www.scrubtheweb.com/abs/meta-check.html)] -Parent=Search Engines -Browser=Scrubby -isBanned=true - -[Mozilla/5.0 (compatible; YoudaoBot/1.*; http://www.youdao.com/help/webmaster/spider/*)] -Parent=Search Engines -Browser=YoudaoBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Twiceler*)] -Parent=Search Engines -Browser=Twiceler -isBanned=true - -[Mozilla/5.0 CostaCider Search*] -Parent=Search Engines -Browser=CostaCider Search - -[Mozilla/5.0 GurujiBot/1.0 (*)] -Parent=Search Engines -Browser=GurujiBot - -[NavissoBot] -Parent=Search Engines -Browser=NavissoBot - -[NextGenSearchBot*(for information visit *)] -Parent=Search Engines -Browser=ZoomInfo -isBanned=true - -[Norbert the Spider(Burf.com)] -Parent=Search Engines -Browser=Norbert the Spider - -[NuSearch Spider*] -Parent=Search Engines -Browser=nuSearch - -[ObjectsSearch/*] -Parent=Search Engines -Browser=ObjectsSearch - -[OpenISearch/1.*] -Parent=Search Engines -Browser=OpenISearch (Amazon) - -[Pagebull http://www.pagebull.com/] -Parent=Search Engines -Browser=Pagebull - -[PEERbot*] -Parent=Search Engines -Browser=PEERbot - -[Pompos/*] -Parent=Search Engines -Browser=Pompos - -[Popdexter/*] -Parent=Search Engines -Browser=Popdex - -[Qweery*] -Parent=Search Engines -Browser=QweeryBot - -[RedCell/* (*)] -Parent=Search Engines -Browser=RedCell - -[Scrubby/*] -Parent=Search Engines -Browser=Scrub The Web - -[Search-10/*] -Parent=Search Engines -Browser=Search-10 - -[search.ch*] -Parent=Search Engines -Browser=Swiss Search Engine - -[Searchmee! Spider*] -Parent=Search Engines -Browser=Searchmee! - -[Seekbot/*] -Parent=Search Engines -Browser=Seekbot - -[SiteSpider (http://www.SiteSpider.com/)] -Parent=Search Engines -Browser=SiteSpider - -[Spinne/*] -Parent=Search Engines -Browser=Spinne - -[sproose/*] -Parent=Search Engines -Browser=Sproose - -[Sqeobot/0.*] -Parent=Search Engines -Browser=Branzel -isBanned=true - -[SquigglebotBot/*] -Parent=Search Engines -Browser=SquigglebotBot -isBanned=true - -[StackRambler/*] -Parent=Search Engines -Browser=StackRambler - -[SygolBot*] -Parent=Search Engines -Browser=SygolBot - -[SynoBot] -Parent=Search Engines -Browser=SynoBot - -[Szukacz/*] -Parent=Search Engines -Browser=Szukacz - -[Tarantula/*] -Parent=Search Engines -Browser=Tarantula -isBanned=true - -[TerrawizBot/*] -Parent=Search Engines -Browser=TerrawizBot -isBanned=true - -[Tkensaku/*] -Parent=Search Engines -Browser=Tkensaku - -[TMCrawler] -Parent=Search Engines -Browser=TMCrawler -isBanned=true - -[Twingly Recon] -Parent=Search Engines -Browser=Twingly Recon -isBanned=true - -[updated/*] -Parent=Search Engines -Browser=Updated! - -[URL Spider Pro/*] -Parent=Search Engines -Browser=URL Spider Pro - -[URL Spider SQL*] -Parent=Search Engines -Browser=Innerprise Enterprise Search - -[VMBot/*] -Parent=Search Engines -Browser=VMBot - -[voyager/2.0 (http://www.kosmix.com/html/crawler.html)] -Parent=Search Engines -Browser=Voyager - -[wadaino.jp-crawler*] -Parent=Search Engines -Browser=wadaino.jp -isBanned=true - -[WebAlta Crawler/*] -Parent=Search Engines -Browser=WebAlta Crawler -isBanned=true - -[WebCorp/*] -Parent=Search Engines -Browser=WebCorp -isBanned=true - -[webcrawl.net] -Parent=Search Engines -Browser=webcrawl.net - -[WISEbot/*] -Parent=Search Engines -Browser=WISEbot -isBanned=true - -[Wotbox/*] -Parent=Search Engines -Browser=Wotbox - -[www.zatka.com] -Parent=Search Engines -Browser=Zatka - -[WWWeasel Robot v*] -Parent=Search Engines -Browser=World Wide Weasel - -[YadowsCrawler*] -Parent=Search Engines -Browser=YadowsCrawler - -[YodaoBot/*] -Parent=Search Engines -Browser=YodaoBot -isBanned=true - -[ZeBot_www.ze.bz*] -Parent=Search Engines -Browser=ZE.bz - -[zibber-v*] -Parent=Search Engines -Browser=Zibb - -[ZipppBot/*] -Parent=Search Engines -Browser=ZipppBot - -[ATA-Translation-Service] -Parent=Translators -Browser=ATA-Translation-Service - -[GJK_Browser_Check] -Parent=Version Checkers -Browser=GJK_Browser_Check - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Hatena - -[Hatena] -Parent=DefaultProperties -Browser=Hatena -isBanned=true -Crawler=true - -[Feed::Find/*] -Parent=Hatena -Browser=Feed Find -isSyndicationReader=true - -[Hatena Antenna/*] -Parent=Hatena -Browser=Hatena Antenna - -[Hatena Bookmark/*] -Parent=Hatena -Browser=Hatena Bookmark - -[Hatena RSS/*] -Parent=Hatena -Browser=Hatena RSS -isSyndicationReader=true - -[Hatena::Crawler/*] -Parent=Hatena -Browser=Hatena Crawler - -[HatenaScreenshot*] -Parent=Hatena -Browser=HatenaScreenshot - -[URI::Fetch/*] -Parent=Hatena -Browser=URI::Fetch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Internet Archive - -[Internet Archive] -Parent=DefaultProperties -Browser=Internet Archive -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*heritrix*] -Parent=Internet Archive -Browser=Heritrix -isBanned=true - -[ia_archiver*] -Parent=Internet Archive -Browser=Internet Archive - -[InternetArchive/*] -Parent=Internet Archive -Browser=InternetArchive - -[Mozilla/5.0 (compatible; archive.org_bot/1.*)] -Parent=Internet Archive - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nutch - -[Nutch] -Parent=DefaultProperties -Browser=Nutch -isBanned=true -Crawler=true - -[*Nutch*] -Parent=Nutch -isBanned=true - -[CazoodleBot/*] -Parent=Nutch -Browser=CazoodleBot - -[LOOQ/0.1*] -Parent=Nutch -Browser=LOOQ - -[Nutch/0.? (OpenX Spider)] -Parent=Nutch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Webaroo - -[Webaroo] -Parent=DefaultProperties -Browser=Webaroo - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Webaroo/*)] -Parent=Webaroo -Browser=Webaroo - -[Mozilla/5.0 (Windows; U; Windows *; *; rv:*) Gecko/* Firefox/* webaroo/*] -Parent=Webaroo -Browser=Webaroo - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Word Press - -[Word Press] -Parent=DefaultProperties -Browser=Word Press -Alpha=true -Beta=true -Win16=true -Win32=true -Win64=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -isBanned=true -isMobileDevice=true -isSyndicationReader=true -Crawler=true - -[WordPress-B-/2.*] -Parent=Word Press -Browser=WordPress-B - -[WordPress-Do-P-/2.*] -Parent=Word Press -Browser=WordPress-Do-P - -[BlueCoat ProxySG] -Parent=Blue Coat Systems -Browser=BlueCoat ProxySG - -[CerberianDrtrs/*] -Parent=Blue Coat Systems -Browser=Cerberian - -[Inne: Mozilla/4.0 (compatible; Cerberian Drtrs*)] -Parent=Blue Coat Systems -Browser=Cerberian - -[Mozilla/4.0 (compatible; Cerberian Drtrs*)] -Parent=Blue Coat Systems -Browser=Cerberian - -[Mozilla/4.0 (compatible; MSIE 6.0; Bluecoat DRTR)] -Parent=Blue Coat Systems -Browser=Bluecoat - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Copyright/Plagiarism - -[Copyright/Plagiarism] -Parent=DefaultProperties -Browser=Copyright/Plagiarism -isBanned=true -Crawler=true - -[BDFetch] -Parent=Copyright/Plagiarism -Browser=BDFetch - -[copyright sheriff (*)] -Parent=Copyright/Plagiarism -Browser=copyright sheriff - -[CopyRightCheck*] -Parent=Copyright/Plagiarism -Browser=CopyRightCheck - -[FairAd Client*] -Parent=Copyright/Plagiarism -Browser=FairAd Client - -[iCopyright Conductor*] -Parent=Copyright/Plagiarism -Browser=iCopyright Conductor - -[IPiumBot laurion(dot)com] -Parent=Copyright/Plagiarism -Browser=IPiumBot - -[IWAgent/*] -Parent=Copyright/Plagiarism -Browser=Brand Protect - -[Mozilla/5.0 (compatible; DKIMRepBot/*)] -Parent=Copyright/Plagiarism -Browser=DKIMRepBot - -[oBot] -Parent=Copyright/Plagiarism -Browser=oBot - -[SlySearch/*] -Parent=Copyright/Plagiarism -Browser=SlySearch - -[TurnitinBot/*] -Parent=Copyright/Plagiarism -Browser=TurnitinBot - -[TutorGigBot/*] -Parent=Copyright/Plagiarism -Browser=TutorGig - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DNS Tools - -[DNS Tools] -Parent=DefaultProperties -Browser=DNS Tools -Crawler=true - -[Domain Dossier utility*] -Parent=DNS Tools -Browser=Domain Dossier - -[Mozilla/5.0 (compatible; DNS-Digger/*)] -Parent=DNS Tools -Browser=DNS-Digger - -[OpenDNS Domain Crawler noc@opendns.com] -Parent=DNS Tools -Browser=OpenDNS Domain Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Download Managers - -[Download Managers] -Parent=DefaultProperties -Browser=Download Managers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[AndroidDownloadManager] -Parent=Download Managers -Browser=Android Download Manager - -[AutoMate5] -Parent=Download Managers -Browser=AutoMate5 - -[Beamer*] -Parent=Download Managers -Browser=Beamer - -[BitBeamer/*] -Parent=Download Managers -Browser=BitBeamer - -[BitTorrent/*] -Parent=Download Managers -Browser=BitTorrent - -[DA *] -Parent=Download Managers -Browser=Download Accelerator - -[Download Demon*] -Parent=Download Managers -Browser=Download Demon - -[Download Express*] -Parent=Download Managers -Browser=Download Express - -[Download Master*] -Parent=Download Managers -Browser=Download Master - -[Download Ninja*] -Parent=Download Managers -Browser=Download Ninja - -[Download Wonder*] -Parent=Download Managers -Browser=Download Wonder - -[DownloadSession*] -Parent=Download Managers -Browser=DownloadSession - -[EasyDL/*] -Parent=Download Managers -Browser=EasyDL - -[FDM 1.x] -Parent=Download Managers -Browser=Free Download Manager - -[FlashGet] -Parent=Download Managers -Browser=FlashGet - -[FreshDownload/*] -Parent=Download Managers -Browser=FreshDownload - -[GetRight/*] -Parent=Download Managers -Browser=GetRight - -[GetRightPro/*] -Parent=Download Managers -Browser=GetRightPro - -[GetSmart/*] -Parent=Download Managers -Browser=GetSmart - -[Go!Zilla*] -Parent=Download Managers -Browser=GoZilla - -[Gozilla/*] -Parent=Download Managers -Browser=Gozilla - -[Internet Ninja*] -Parent=Download Managers -Browser=Internet Ninja - -[Kontiki Client*] -Parent=Download Managers -Browser=Kontiki Client - -[lftp/3.2.1] -Parent=Download Managers -Browser=lftp - -[LightningDownload/*] -Parent=Download Managers -Browser=LightningDownload - -[LMQueueBot/*] -Parent=Download Managers -Browser=LMQueueBot - -[MetaProducts Download Express/*] -Parent=Download Managers -Browser=Download Express - -[Mozilla/4.0 (compatible; Getleft*)] -Parent=Download Managers -Browser=Getleft - -[Myzilla] -Parent=Download Managers -Browser=Myzilla - -[Net Vampire/*] -Parent=Download Managers -Browser=Net Vampire - -[Net_Vampire*] -Parent=Download Managers -Browser=Net_Vampire - -[NetAnts*] -Parent=Download Managers -Browser=NetAnts - -[NetPumper*] -Parent=Download Managers -Browser=NetPumper - -[NetSucker*] -Parent=Download Managers -Browser=NetSucker - -[NetZip Downloader*] -Parent=Download Managers -Browser=NetZip Downloader - -[NexTools WebAgent*] -Parent=Download Managers -Browser=NexTools WebAgent - -[Offline Downloader*] -Parent=Download Managers -Browser=Offline Downloader - -[P3P Client] -Parent=Download Managers -Browser=P3P Client - -[PageDown*] -Parent=Download Managers -Browser=PageDown - -[PicaLoader*] -Parent=Download Managers -Browser=PicaLoader - -[Prozilla*] -Parent=Download Managers -Browser=Prozilla - -[RealDownload/*] -Parent=Download Managers -Browser=RealDownload - -[sEasyDL/*] -Parent=Download Managers -Browser=EasyDL - -[shareaza*] -Parent=Download Managers -Browser=shareaza - -[SmartDownload/*] -Parent=Download Managers -Browser=SmartDownload - -[SpeedDownload/*] -Parent=Download Managers -Browser=Speed Download - -[Star*Downloader/*] -Parent=Download Managers -Browser=StarDownloader - -[STEROID Download] -Parent=Download Managers -Browser=STEROID Download - -[SuperBot/*] -Parent=Download Managers -Browser=SuperBot - -[Vegas95/*] -Parent=Download Managers -Browser=Vegas95 - -[WebZIP*] -Parent=Download Managers -Browser=WebZIP - -[Wget*] -Parent=Download Managers -Browser=Wget - -[WinTools] -Parent=Download Managers -Browser=WinTools - -[Xaldon WebSpider*] -Parent=Download Managers -Browser=Xaldon WebSpider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; E-Mail Harvesters - -[E-Mail Harvesters] -Parent=DefaultProperties -Browser=E-Mail Harvesters -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*E-Mail Address Extractor*] -Parent=E-Mail Harvesters -Browser=E-Mail Address Extractor - -[*Larbin*] -Parent=E-Mail Harvesters -Browser=Larbin - -[*www4mail/*] -Parent=E-Mail Harvesters -Browser=www4mail - -[8484 Boston Project*] -Parent=E-Mail Harvesters -Browser=8484 Boston Project - -[CherryPicker*/*] -Parent=E-Mail Harvesters -Browser=CherryPickerElite - -[Chilkat/*] -Parent=E-Mail Harvesters -Browser=Chilkat - -[ContactBot/*] -Parent=E-Mail Harvesters -Browser=ContactBot - -[eCatch*] -Parent=E-Mail Harvesters -Browser=eCatch - -[EmailCollector*] -Parent=E-Mail Harvesters -Browser=E-Mail Collector - -[EMAILsearcher] -Parent=E-Mail Harvesters -Browser=EMAILsearcher - -[EmailSiphon*] -Parent=E-Mail Harvesters -Browser=E-Mail Siphon - -[EmailWolf*] -Parent=E-Mail Harvesters -Browser=EMailWolf - -[Epsilon SoftWorks' MailMunky] -Parent=E-Mail Harvesters -Browser=MailMunky - -[ExtractorPro*] -Parent=E-Mail Harvesters -Browser=ExtractorPro - -[Franklin Locator*] -Parent=E-Mail Harvesters -Browser=Franklin Locator - -[Missigua Locator*] -Parent=E-Mail Harvesters -Browser=Missigua Locator - -[Mozilla/4.0 (compatible; Advanced Email Extractor*)] -Parent=E-Mail Harvesters -Browser=Advanced Email Extractor - -[Netprospector*] -Parent=E-Mail Harvesters -Browser=Netprospector - -[ProWebWalker*] -Parent=E-Mail Harvesters -Browser=ProWebWalker - -[sna-0.0.*] -Parent=E-Mail Harvesters -Browser=Mike Elliott's E-Mail Harvester - -[WebEnhancer*] -Parent=E-Mail Harvesters -Browser=WebEnhancer - -[WebMiner*] -Parent=E-Mail Harvesters -Browser=WebMiner - -[ZIBB Crawler (email address / WWW address)] -Parent=E-Mail Harvesters -Browser=ZIBB Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Feeds Blogs - -[Feeds Blogs] -Parent=DefaultProperties -Browser=Feeds Blogs -isSyndicationReader=true -Crawler=true - -[Bloglines Title Fetch/*] -Parent=Feeds Blogs -Browser=Bloglines Title Fetch - -[Bloglines/* (http://www.bloglines.com*)] -Parent=Feeds Blogs -Browser=BlogLines Web - -[BlogPulseLive (support@blogpulse.com)] -Parent=Feeds Blogs -Browser=BlogPulseLive - -[blogsearchbot-pumpkin-2] -Parent=Feeds Blogs -Browser=blogsearchbot-pumpkin -isSyndicationReader=false - -[Irish Blogs Aggregator/*1.0*] -Parent=Feeds Blogs -Browser=Irish Blogs Aggregator -Version=1.0 -MajorVer=1 -MinorVer=0 - -[kinjabot (http://www.kinja.com; *)] -Parent=Feeds Blogs -Browser=kinjabot - -[Net::Trackback/*] -Parent=Feeds Blogs -Browser=Net::Trackback - -[Reblog*] -Parent=Feeds Blogs -Browser=Reblog - -[WordPress/*] -Parent=Feeds Blogs -Browser=WordPress - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Feeds Syndicators - -[Feeds Syndicators] -Parent=DefaultProperties -Browser=Feeds Syndicators -isSyndicationReader=true - -[*LinkLint*] -Parent=Feeds Syndicators -Browser=LinkLint - -[*NetNewsWire/*] -Parent=Feeds Syndicators - -[*NetVisualize*] -Parent=Feeds Syndicators -Browser=NetVisualize - -[AideRSS 2.* (postrank.com)] -Parent=Feeds Syndicators -Browser=AideRSS - -[AideRSS/2.0 (aiderss.com)] -Parent=Feeds Syndicators -Browser=AideRSS -isBanned=true - -[Akregator/*] -Parent=Feeds Syndicators -Browser=Akregator - -[AppleSyndication/*] -Parent=Feeds Syndicators -Browser=Safari RSS -Platform=MacOSX - -[Cocoal.icio.us/* (*)*] -Parent=Feeds Syndicators -Browser=Cocoal.icio.us -isBanned=true - -[Feed43 Proxy/* (*)] -Parent=Feeds Syndicators -Browser=Feed For Free - -[FeedBurner/*] -Parent=Feeds Syndicators -Browser=FeedBurner - -[FeedDemon/* (*)] -Parent=Feeds Syndicators -Browser=FeedDemon -Platform=Win32 - -[FeedDigest/* (*)] -Parent=Feeds Syndicators -Browser=FeedDigest - -[FeedGhost/1.*] -Parent=Feeds Syndicators -Browser=FeedGhost -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedOnFeeds/0.1.* ( http://minutillo.com/steve/feedonfeeds/)] -Parent=Feeds Syndicators -Browser=FeedOnFeeds -Version=0.1 -MajorVer=0 -MinorVer=1 - -[Feedreader * (Powered by Newsbrain)] -Parent=Feeds Syndicators -Browser=Newsbrain - -[Feedshow/* (*)] -Parent=Feeds Syndicators -Browser=Feedshow - -[Feedster Crawler/?.0; Feedster, Inc.] -Parent=Feeds Syndicators -Browser=Feedster - -[GreatNews/1.0] -Parent=Feeds Syndicators -Browser=GreatNews -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Gregarius/*] -Parent=Feeds Syndicators -Browser=Gregarius - -[intraVnews/*] -Parent=Feeds Syndicators -Browser=intraVnews - -[JetBrains Omea Reader*] -Parent=Feeds Syndicators -Browser=Omea Reader -isBanned=true - -[Liferea/1.5* (Linux; *; http://liferea.sf.net/)] -Parent=Feeds Syndicators -Browser=Liferea -isBanned=true - -[livedoor FeedFetcher/0.0* (http://reader.livedoor.com/;*)] -Parent=Feeds Syndicators -Browser=FeedFetcher -Version=0.0 -MajorVer=0 -MinorVer=0 - -[MagpieRSS/* (*)] -Parent=Feeds Syndicators -Browser=MagpieRSS - -[Mobitype * (compatible; Mozilla/*; MSIE *.*; Windows *)] -Parent=Feeds Syndicators -Browser=Mobitype -Platform=Win32 - -[Mozilla/5.0 (*; Rojo *; http://www.rojo.com/corporate/help/agg; *)*] -Parent=Feeds Syndicators -Browser=Rojo - -[Mozilla/5.0 (*aggregator:TailRank; http://tailrank.com/robot)*] -Parent=Feeds Syndicators -Browser=TailRank - -[Mozilla/5.0 (compatible; MSIE 6.0; Podtech Network; crawler_admin@podtech.net)] -Parent=Feeds Syndicators -Browser=Podtech Network - -[Mozilla/5.0 (compatible; Newz Crawler *; http://www.newzcrawler.com/?)] -Parent=Feeds Syndicators -Browser=Newz Crawler - -[Mozilla/5.0 (compatible; RSSMicro.com RSS/Atom Feed Robot)] -Parent=Feeds Syndicators -Browser=RSSMicro - -[Mozilla/5.0 (compatible;*newstin.com;*)] -Parent=Feeds Syndicators -Browser=NewsTin - -[Mozilla/5.0 (RSS Reader Panel)] -Parent=Feeds Syndicators -Browser=RSS Reader Panel - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:FeedParser; *) Gecko/*] -Parent=Feeds Syndicators -Browser=FeedParser - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:NewsMonster; *) Gecko/*] -Parent=Feeds Syndicators -Browser=NewsMonster - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:Rojo; *) Gecko/*] -Parent=Feeds Syndicators -Browser=Rojo - -[Netvibes (*)] -Parent=Feeds Syndicators -Browser=Netvibes - -[NewsAlloy/* (*)] -Parent=Feeds Syndicators -Browser=NewsAlloy - -[Omnipelagos*] -Parent=Feeds Syndicators -Browser=Omnipelagos - -[Particls] -Parent=Feeds Syndicators -Browser=Particls - -[Protopage/* (*)] -Parent=Feeds Syndicators -Browser=Protopage - -[PubSub-RSS-Reader/* (*)] -Parent=Feeds Syndicators -Browser=PubSub-RSS-Reader - -[RSS Menu/*] -Parent=Feeds Syndicators -Browser=RSS Menu - -[RssBandit/*] -Parent=Feeds Syndicators -Browser=RssBandit - -[RssBar/1.2*] -Parent=Feeds Syndicators -Browser=RssBar -Version=1.2 -MajorVer=1 -MinorVer=2 - -[SharpReader/*] -Parent=Feeds Syndicators -Browser=SharpReader - -[SimplePie/*] -Parent=Feeds Syndicators -Browser=SimplePie - -[Strategic Board Bot (?http://www.strategicboard.com)] -Parent=Feeds Syndicators -Browser=Strategic Board Bot -isBanned=true - -[TargetYourNews.com bot] -Parent=Feeds Syndicators -Browser=TargetYourNews - -[Technoratibot/*] -Parent=Feeds Syndicators -Browser=Technoratibot - -[Tumblr/* RSS syndication ( http://www.tumblr.com/) (support@tumblr.com)] -Parent=Feeds Syndicators -Browser=Tumblr RSS syndication - -[Windows-RSS-Platform/1.0*] -Parent=Feeds Syndicators -Browser=Windows-RSS-Platform -Version=1.0 -MajorVer=1 -MinorVer=0 -Win32=true - -[Wizz RSS News Reader] -Parent=Feeds Syndicators -Browser=Wizz - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; General RSS - -[General RSS] -Parent=DefaultProperties -Browser=General RSS -isSyndicationReader=true - -[AideRSS/1.0 (aiderss.com); * subscribers] -Parent=General RSS -Browser=AideRSS -Version=1.0 -MajorVer=1 -MinorVer=0 - -[CC Metadata Scaper http://wiki.creativecommons.org/Metadata_Scraper] -Parent=General RSS -Browser=CC Metadata Scaper - -[Mozilla/5.0 (compatible) GM RSS Panel] -Parent=General RSS -Browser=RSS Panel - -[Mozilla/5.0 http://www.inclue.com; graeme@inclue.com] -Parent=General RSS -Browser=Inclue - -[Runnk online rss reader : http://www.runnk.com/ : RSS favorites : RSS ranking : RSS aggregator*] -Parent=General RSS -Browser=Ruunk - -[Windows-RSS-Platform/2.0 (MSIE 8.0; Windows NT 6.0)] -Parent=General RSS -Browser=Windows-RSS-Platform -Platform=WinVista - -[Mozilla/5.0 (X11; ?; Linux; *) AppleWebKit/* (KHTML, like Gecko, Safari/*) Arora/0.4] -Parent=Google Code -Browser=Arora -Version=0.4 -MajorVer=0 -MinorVer=4 -Platform=Linux -CssVersion=2 -supportsCSS=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Validation Checkers - -[HTML Validators] -Parent=DefaultProperties -Browser=HTML Validators -Frames=true -IFrames=true -Tables=true -Crawler=true - -[(HTML Validator http://www.searchengineworld.com/validator/)] -Parent=HTML Validators -Browser=Search Engine World HTML Validator - -[FeedValidator/1.3] -Parent=HTML Validators -Browser=FeedValidator -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Jigsaw/* W3C_CSS_Validator_JFouffa/*] -Parent=HTML Validators -Browser=Jigsaw CSS Validator - -[Search Engine World Robots.txt Validator*] -Parent=HTML Validators -Browser=Search Engine World Robots.txt Validator - -[W3C_Validator/*] -Parent=HTML Validators -Browser=W3C Validator - -[W3CLineMode/*] -Parent=HTML Validators -Browser=W3C Line Mode - -[Weblide/2.? beta*] -Parent=HTML Validators -Browser=Weblide -Version=2.0 -MajorVer=2 -MinorVer=0 -Beta=true - -[WebmasterWorld StickyMail Server Header Checker*] -Parent=HTML Validators -Browser=WebmasterWorld Server Header Checker - -[WWWC/*] -Parent=HTML Validators - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Image Crawlers - -[Image Crawlers] -Parent=DefaultProperties -Browser=Image Crawlers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*CFNetwork*] -Parent=Image Crawlers -Browser=CFNetwork - -[*PhotoStickies/*] -Parent=Image Crawlers -Browser=PhotoStickies - -[Camcrawler*] -Parent=Image Crawlers -Browser=Camcrawler - -[CydralSpider/*] -Parent=Image Crawlers -Browser=Cydral Web Image Search -isBanned=true - -[Der gro\xdfe BilderSauger*] -Parent=Image Crawlers -Browser=Gallery Grabber - -[Extreme Picture Finder] -Parent=Image Crawlers -Browser=Extreme Picture Finder - -[FLATARTS_FAVICO] -Parent=Image Crawlers -Browser=FlatArts Favorites Icon Tool - -[HTML2JPG Blackbox, http://www.html2jpg.com] -Parent=Image Crawlers -Browser=HTML2JPG - -[IconSurf/2.*] -Parent=Image Crawlers -Browser=IconSurf - -[kalooga/KaloogaBot*] -Parent=Image Crawlers -Browser=KaloogaBot - -[Mister PIX*] -Parent=Image Crawlers -Browser=Mister PIX - -[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/* (*) Pandora/2.*] -Parent=Image Crawlers -Browser=Pandora - -[naoFavicon4IE*] -Parent=Image Crawlers -Browser=naoFavicon4IE - -[pixfinder/*] -Parent=Image Crawlers -Browser=pixfinder - -[rssImagesBot/0.1 (*http://herbert.groot.jebbink.nl/?app=rssImages)] -Parent=Image Crawlers -Browser=rssImagesBot - -[Web Image Collector*] -Parent=Image Crawlers -Browser=Web Image Collector - -[WebImages * (?http://herbert.groot.jebbink.nl/?app=WebImages?)] -Parent=Image Crawlers -Browser=WebImages - -[WebPix*] -Parent=Image Crawlers -Browser=Custo - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Link Checkers - -[Link Checkers] -Parent=DefaultProperties -Browser=Link Checkers -Frames=true -IFrames=true -Tables=true -Crawler=true - -[!Susie (http://www.sync2it.com/susie)] -Parent=Link Checkers -Browser=!Susie - -[*AgentName/*] -Parent=Link Checkers -Browser=AgentName - -[*Linkman*] -Parent=Link Checkers -Browser=Linkman - -[*LinksManager.com*] -Parent=Link Checkers -Browser=LinksManager - -[*Powermarks/*] -Parent=Link Checkers -Browser=Powermarks - -[*W3C-checklink/*] -Parent=Link Checkers -Browser=W3C Link Checker - -[*Web Link Validator*] -Parent=Link Checkers -Browser=Web Link Validator - -[*Zeus*] -Parent=Link Checkers -Browser=Zeus -isBanned=true - -[ActiveBookmark *] -Parent=Link Checkers -Browser=ActiveBookmark - -[Bookdog/*] -Parent=Link Checkers -Browser=Bookdog - -[Bookmark Buddy*] -Parent=Link Checkers -Browser=Bookmark Buddy - -[Bookmark Renewal Check Agent*] -Parent=Link Checkers -Browser=Bookmark Renewal Check Agent - -[Bookmark search tool*] -Parent=Link Checkers -Browser=Bookmark search tool - -[Bookmark-Manager] -Parent=Link Checkers -Browser=Bookmark-Manager - -[Checkbot*] -Parent=Link Checkers -Browser=Checkbot - -[CheckLinks/*] -Parent=Link Checkers -Browser=CheckLinks - -[CyberSpyder Link Test/*] -Parent=Link Checkers -Browser=CyberSpyder Link Test - -[DLC/*] -Parent=Link Checkers -Browser=DLC - -[DocWeb Link Crawler (http://doc.php.net)] -Parent=Link Checkers -Browser=DocWeb Link Crawler - -[FavOrg] -Parent=Link Checkers -Browser=FavOrg - -[Favorites Sweeper v.3.*] -Parent=Link Checkers -Browser=Favorites Sweeper - -[FindLinks/*] -Parent=Link Checkers -Browser=FindLinks - -[Funnel Web Profiler*] -Parent=Link Checkers -Browser=Funnel Web Profiler - -[Html Link Validator (www.lithopssoft.com)] -Parent=Link Checkers -Browser=HTML Link Validator - -[IECheck] -Parent=Link Checkers -Browser=IECheck - -[JCheckLinks/*] -Parent=Link Checkers -Browser=JCheckLinks - -[JRTwine Software Check Favorites Utility] -Parent=Link Checkers -Browser=JRTwine - -[Link Valet Online*] -Parent=Link Checkers -Browser=Link Valet -isBanned=true - -[LinkAlarm/*] -Parent=Link Checkers -Browser=LinkAlarm - -[Linkbot*] -Parent=Link Checkers -Browser=Linkbot - -[LinkChecker/*] -Parent=Link Checkers -Browser=LinkChecker - -[LinkextractorPro*] -Parent=Link Checkers -Browser=LinkextractorPro -isBanned=true - -[LinkLint-checkonly/*] -Parent=Link Checkers -Browser=LinkLint - -[LinkScan/*] -Parent=Link Checkers -Browser=LinkScan - -[LinkSweeper/*] -Parent=Link Checkers -Browser=LinkSweeper - -[LinkWalker*] -Parent=Link Checkers -Browser=LinkWalker - -[MetaGer-LinkChecker] -Parent=Link Checkers -Browser=MetaGer-LinkChecker - -[Mozilla/* (compatible; linktiger/*; *http://www.linktiger.com*)] -Parent=Link Checkers -Browser=LinkTiger -isBanned=true - -[Mozilla/4.0 (Compatible); URLBase*] -Parent=Link Checkers -Browser=URLBase - -[Mozilla/4.0 (compatible; Link Utility; http://net-promoter.com)] -Parent=Link Checkers -Browser=NetPromoter Link Utility - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98) Web Link Validator*] -Parent=Link Checkers -Browser=Web Link Validator -Win32=true - -[Mozilla/4.0 (compatible; MSIE 7.0; Win32) Link Commander 3.0] -Parent=Link Checkers -Browser=Link Commander -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Win32 - -[Mozilla/4.0 (compatible; smartBot/1.*; checking links; *)] -Parent=Link Checkers -Browser=smartBot - -[Mozilla/4.0 (compatible; SuperCleaner*;*)] -Parent=Link Checkers -Browser=SuperCleaner - -[Mozilla/5.0 gURLChecker/*] -Parent=Link Checkers -Browser=gURLChecker -isBanned=true - -[Newsgroupreporter LinkCheck] -Parent=Link Checkers -Browser=Newsgroupreporter LinkCheck - -[onCHECK Linkchecker von www.scientec.de fuer www.onsinn.de] -Parent=Link Checkers -Browser=onCHECK Linkchecker - -[online link validator (http://www.dead-links.com/)] -Parent=Link Checkers -Browser=Dead-Links.com -isBanned=true - -[REL Link Checker*] -Parent=Link Checkers -Browser=REL Link Checker - -[RLinkCheker*] -Parent=Link Checkers -Browser=RLinkCheker - -[Robozilla/*] -Parent=Link Checkers -Browser=Robozilla - -[RPT-HTTPClient/*] -Parent=Link Checkers -Browser=RPT-HTTPClient -isBanned=true - -[SafariBookmarkChecker*(?http://www.coriolis.ch/)] -Parent=Link Checkers -Browser=SafariBookmarkChecker -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[Simpy/* (Simpy; http://www.simpy.com/?ref=bot; feedback at simpy dot com)] -Parent=Link Checkers -Browser=Simpy - -[SiteBar/*] -Parent=Link Checkers -Browser=SiteBar - -[Susie (http://www.sync2it.com/bms/susie.php] -Parent=Link Checkers -Browser=Susie - -[URLBase/6.*] -Parent=Link Checkers - -[VSE/*] -Parent=Link Checkers -Browser=VSE Link Tester - -[WebTrends Link Analyzer] -Parent=Link Checkers -Browser=WebTrends Link Analyzer - -[WorQmada/*] -Parent=Link Checkers -Browser=WorQmada - -[Xenu* Link Sleuth*] -Parent=Link Checkers -Browser=Xenu's Link Sleuth -isBanned=true - -[Z-Add Link Checker*] -Parent=Link Checkers -Browser=Z-Add Link Checker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Microsoft - -[Microsoft] -Parent=DefaultProperties -Browser=Microsoft -isBanned=true - -[Live (http://www.live.com/)] -Parent=Microsoft -Browser=Microsoft Live -isBanned=false -isSyndicationReader=true - -[MFC Foundation Class Library*] -Parent=Microsoft -Browser=MFC Foundation Class Library - -[MFHttpScan] -Parent=Microsoft -Browser=MFHttpScan - -[Microsoft BITS/*] -Parent=Microsoft -Browser=BITS - -[Microsoft Data Access Internet Publishing Provider Cache Manager] -Parent=Microsoft -Browser=MS IPP - -[Microsoft Data Access Internet Publishing Provider DAV*] -Parent=Microsoft -Browser=MS IPP DAV - -[Microsoft Data Access Internet Publishing Provider Protocol Discovery] -Parent=Microsoft -Browser=MS IPPPD - -[Microsoft Internet Explorer] -Parent=Microsoft -Browser=Fake IE - -[Microsoft Office Existence Discovery] -Parent=Microsoft -Browser=Microsoft Office Existence Discovery - -[Microsoft Office Protocol Discovery] -Parent=Microsoft -Browser=MS OPD - -[Microsoft Office/* (*Picture Manager*)] -Parent=Microsoft -Browser=Microsoft Office Picture Manager - -[Microsoft URL Control*] -Parent=Microsoft -Browser=Microsoft URL Control - -[Microsoft Visio MSIE] -Parent=Microsoft -Browser=Microsoft Visio - -[Microsoft-WebDAV-MiniRedir/*] -Parent=Microsoft -Browser=Microsoft-WebDAV - -[Mozilla/5.0 (Macintosh; Intel Mac OS X) Excel/12.*] -Parent=Microsoft -Browser=Microsoft Excel -Version=12.0 -MajorVer=12 -MinorVer=0 -Platform=MacOSX - -[MSN Feed Manager] -Parent=Microsoft -Browser=MSN Feed Manager -isBanned=false -isSyndicationReader=true - -[MSProxy/*] -Parent=Microsoft -Browser=MS Proxy - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Miscellaneous Browsers - -[Miscellaneous Browsers] -Parent=DefaultProperties -Browser=Miscellaneous Browsers -Frames=true -Tables=true -Cookies=true - -[*Amiga*] -Parent=Miscellaneous Browsers -Browser=Amiga -Platform=Amiga - -[*avantbrowser*] -Parent=Miscellaneous Browsers -Browser=Avant Browser - -[12345] -Parent=Miscellaneous Browsers -Browser=12345 -isBanned=true - -[Ace Explorer] -Parent=Miscellaneous Browsers -Browser=Ace Explorer - -[Enigma Browser*] -Parent=Miscellaneous Browsers -Browser=Enigma Browser - -[EVE-minibrowser/*] -Parent=Miscellaneous Browsers -Browser=EVE-minibrowser -IFrames=false -Tables=false -BackgroundSounds=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -isBanned=false -Crawler=false - -[Godzilla/* (Basic*; *; Commodore C=64; *; rv:1.*)*] -Parent=Miscellaneous Browsers -Browser=Godzilla - -[GreenBrowser] -Parent=Miscellaneous Browsers -Browser=GreenBrowser -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Kopiczek/* (WyderOS*; *)] -Parent=Miscellaneous Browsers -Browser=Kopiczek -Platform=WyderOS -IFrames=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (*) - BrowseX (*)] -Parent=Miscellaneous Browsers -Browser=BrowseX - -[Mozilla/* (Win32;*Escape?*; ?)] -Parent=Miscellaneous Browsers -Browser=Escape -Platform=Win32 - -[Mozilla/4.0 (compatible; ibisBrowser)] -Parent=Miscellaneous Browsers -Browser=ibisBrowser - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) AppleWebKit/* (*) HistoryHound/*] -Parent=Miscellaneous Browsers -Browser=HistoryHound - -[NetRecorder*] -Parent=Miscellaneous Browsers -Browser=NetRecorder - -[NetSurfer*] -Parent=Miscellaneous Browsers -Browser=NetSurfer - -[ogeb browser , Version 1.1.0] -Parent=Miscellaneous Browsers -Browser=ogeb browser -Version=1.1 -MajorVer=1 -MinorVer=1 - -[SCEJ PSP BROWSER 0102pspNavigator] -Parent=Miscellaneous Browsers -Browser=Wipeout Pure - -[SlimBrowser] -Parent=Miscellaneous Browsers -Browser=SlimBrowser - -[WWW_Browser/*] -Parent=Miscellaneous Browsers -Browser=WWW Browser -Version=1.69 -MajorVer=1 -MinorVer=69 -Platform=Win16 -CssVersion=3 -supportsCSS=true - -[*Netcraft Webserver Survey*] -Parent=Netcraft -Browser=Netcraft Webserver Survey -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Offline Browsers - -[Offline Browsers] -Parent=DefaultProperties -Browser=Offline Browsers -Frames=true -Tables=true -Cookies=true -isBanned=true -Crawler=true - -[*Check&Get*] -Parent=Offline Browsers -Browser=Check&Get - -[*HTTrack*] -Parent=Offline Browsers -Browser=HTTrack - -[*MSIECrawler*] -Parent=Offline Browsers -Browser=IE Offline Browser - -[*TweakMASTER*] -Parent=Offline Browsers -Browser=TweakMASTER - -[BackStreet Browser *] -Parent=Offline Browsers -Browser=BackStreet Browser - -[Go-Ahead-Got-It*] -Parent=Offline Browsers -Browser=Go Ahead Got-It - -[iGetter/*] -Parent=Offline Browsers -Browser=iGetter - -[Teleport*] -Parent=Offline Browsers -Browser=Teleport - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Online Scanners - -[Online Scanners] -Parent=DefaultProperties -Browser=Online Scanners -isBanned=true - -[JoeDog/* (X11; I; Siege *)] -Parent=Online Scanners -Browser=JoeDog -isBanned=false - -[Morfeus Fucking Scanner] -Parent=Online Scanners -Browser=Morfeus Fucking Scanner - -[Mozilla/4.0 (compatible; Trend Micro tmdr 1.*] -Parent=Online Scanners -Browser=Trend Micro - -[Titanium 2005 (4.02.01)] -Parent=Online Scanners -Browser=Panda Antivirus Titanium - -[virus_detector*] -Parent=Online Scanners -Browser=Secure Computing Corporation - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Proxy Servers - -[Proxy Servers] -Parent=DefaultProperties -Browser=Proxy Servers -isBanned=true - -[*squid*] -Parent=Proxy Servers -Browser=Squid - -[Anonymisiert*] -Parent=Proxy Servers -Browser=Anonymizied - -[Anonymizer/*] -Parent=Proxy Servers -Browser=Anonymizer - -[Anonymizied*] -Parent=Proxy Servers -Browser=Anonymizied - -[Anonymous*] -Parent=Proxy Servers -Browser=Anonymous - -[Anonymous/*] -Parent=Proxy Servers -Browser=Anonymous - -[CE-Preload] -Parent=Proxy Servers -Browser=CE-Preload - -[http://Anonymouse.org/*] -Parent=Proxy Servers -Browser=Anonymouse - -[IE/6.01 (CP/M; 8-bit*)] -Parent=Proxy Servers -Browser=Squid - -[Mozilla/* (TuringOS; Turing Machine; 0.0)] -Parent=Proxy Servers -Browser=Anonymizer - -[Mozilla/4.0 (compatible; MSIE ?.0; SaferSurf*)] -Parent=Proxy Servers -Browser=SaferSurf - -[Mozilla/5.0 (compatible; del.icio.us-thumbnails/*; *) KHTML/* (like Gecko)] -Parent=Proxy Servers -Browser=Yahoo! -isBanned=true -Crawler=true - -[Nutscrape] -Parent=Proxy Servers -Browser=Squid - -[Nutscrape/* (CP/M; 8-bit*)] -Parent=Proxy Servers -Browser=Squid - -[Privoxy/*] -Parent=Proxy Servers -Browser=Privoxy - -[ProxyTester*] -Parent=Proxy Servers -Browser=ProxyTester -isBanned=true -Crawler=true - -[SilentSurf*] -Parent=Proxy Servers -Browser=SilentSurf - -[SmallProxy*] -Parent=Proxy Servers -Browser=SmallProxy - -[Space*Bison/*] -Parent=Proxy Servers -Browser=Proxomitron - -[Sqworm/*] -Parent=Proxy Servers -Browser=Websense - -[SurfControl] -Parent=Proxy Servers -Browser=SurfControl - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Research Projects - -[Research Projects] -Parent=DefaultProperties -Browser=Research Projects -isBanned=true -Crawler=true - -[*research*] -Parent=Research Projects - -[AcadiaUniversityWebCensusClient] -Parent=Research Projects -Browser=AcadiaUniversityWebCensusClient - -[Amico Alpha * (*) Gecko/* AmicoAlpha/*] -Parent=Research Projects -Browser=Amico Alpha - -[annotate_google; http://ponderer.org/*] -Parent=Research Projects -Browser=Annotate Google - -[CMS crawler (?http://buytaert.net/crawler/)] -Parent=Research Projects - -[e-SocietyRobot(http://www.yama.info.waseda.ac.jp/~yamana/es/)] -Parent=Research Projects -Browser=e-SocietyRobot - -[Forschungsportal/*] -Parent=Research Projects -Browser=Forschungsportal - -[Gulper Web *] -Parent=Research Projects -Browser=Gulper Web Bot - -[HooWWWer/*] -Parent=Research Projects -Browser=HooWWWer - -[http://buytaert.net/crawler] -Parent=Research Projects - -[inetbot/* (?http://www.inetbot.com/bot.html)] -Parent=Research Projects -Browser=inetbot - -[IRLbot/*] -Parent=Research Projects -Browser=IRLbot - -[Lachesis] -Parent=Research Projects -Browser=Lachesis - -[Mozilla/5.0 (compatible; nextthing.org/*)] -Parent=Research Projects -Browser=nextthing.org -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (compatible; Theophrastus/*)] -Parent=Research Projects -Browser=Theophrastus - -[Mozilla/5.0 (compatible; Webscan v0.*; http://otc.dyndns.org/webscan/)] -Parent=Research Projects -Browser=Webscan - -[MQbot*] -Parent=Research Projects -Browser=MQbot - -[OutfoxBot/*] -Parent=Research Projects -Browser=OutfoxBot - -[polybot?*] -Parent=Research Projects -Browser=Polybot - -[Shim?Crawler*] -Parent=Research Projects -Browser=Shim Crawler - -[Steeler/*] -Parent=Research Projects -Browser=Steeler - -[Taiga web spider] -Parent=Research Projects -Browser=Taiga - -[Theme Spider*] -Parent=Research Projects -Browser=Theme Spider - -[UofTDB_experiment* (leehyun@cs.toronto.edu)] -Parent=Research Projects -Browser=UofTDB Experiment - -[USyd-NLP-Spider*] -Parent=Research Projects -Browser=USyd-NLP-Spider - -[woriobot*] -Parent=Research Projects -Browser=woriobot - -[wwwster/* (Beta, mailto:gue@cis.uni-muenchen.de)] -Parent=Research Projects -Browser=wwwster -Beta=true - -[Zao-Crawler] -Parent=Research Projects -Browser=Zao-Crawler - -[Zao/*] -Parent=Research Projects -Browser=Zao - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Rippers - -[Rippers] -Parent=DefaultProperties -Browser=Rippers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*grub*] -Parent=Rippers -Browser=grub - -[*ickHTTP*] -Parent=Rippers -Browser=IP*Works - -[*java*] -Parent=Rippers - -[*libwww-perl*] -Parent=Rippers -Browser=libwww-perl - -[*WebGrabber*] -Parent=Rippers - -[*WinHttpRequest*] -Parent=Rippers -Browser=WinHttp - -[3D-FTP/*] -Parent=Rippers -Browser=3D-FTP - -[3wGet/*] -Parent=Rippers -Browser=3wGet - -[ActiveRefresh*] -Parent=Rippers -Browser=ActiveRefresh - -[Artera (Version *)] -Parent=Rippers -Browser=Artera - -[AutoHotkey] -Parent=Rippers -Browser=AutoHotkey - -[b2w/*] -Parent=Rippers -Browser=b2w - -[BasicHTTP/*] -Parent=Rippers -Browser=BasicHTTP - -[BlockNote.Net] -Parent=Rippers -Browser=BlockNote.Net - -[CAST] -Parent=Rippers -Browser=CAST - -[CFNetwork/*] -Parent=Rippers -Browser=CFNetwork - -[CFSCHEDULE*] -Parent=Rippers -Browser=ColdFusion Task Scheduler - -[CobWeb/*] -Parent=Rippers -Browser=CobWeb - -[ColdFusion*] -Parent=Rippers -Browser=ColdFusion - -[Crawl_Application] -Parent=Rippers -Browser=Crawl_Application - -[curl/*] -Parent=Rippers -Browser=cURL - -[Custo*] -Parent=Rippers -Browser=Custo - -[DataCha0s/*] -Parent=Rippers -Browser=DataCha0s - -[DeepIndexer*] -Parent=Rippers -Browser=DeepIndexer - -[DISCo Pump *] -Parent=Rippers -Browser=DISCo Pump - -[eStyleSearch * (compatible; MSIE 6.0; Windows NT 5.0)] -Parent=Rippers -Browser=eStyleSearch -Win32=true - -[ezic.com http agent *] -Parent=Rippers -Browser=Ezic.com - -[fetch libfetch/*] -Parent=Rippers - -[FGet*] -Parent=Rippers -Browser=FGet - -[Flaming AttackBot*] -Parent=Rippers -Browser=Flaming AttackBot - -[Foobot*] -Parent=Rippers -Browser=Foobot - -[GameSpyHTTP/*] -Parent=Rippers -Browser=GameSpyHTTP - -[gnome-vfs/*] -Parent=Rippers -Browser=gnome-vfs - -[Harvest/*] -Parent=Rippers -Browser=Harvest - -[hcat/*] -Parent=Rippers -Browser=hcat - -[HLoader] -Parent=Rippers -Browser=HLoader - -[Holmes/*] -Parent=Rippers -Browser=Holmes - -[HTMLParser/*] -Parent=Rippers -Browser=HTMLParser - -[http generic] -Parent=Rippers -Browser=http generic - -[httpclient*] -Parent=Rippers - -[httperf/*] -Parent=Rippers -Browser=httperf - -[HTTPFetch/*] -Parent=Rippers -Browser=HTTPFetch - -[HTTPGrab] -Parent=Rippers -Browser=HTTPGrab - -[HttpSession] -Parent=Rippers -Browser=HttpSession - -[httpunit/*] -Parent=Rippers -Browser=HttpUnit - -[ICE_GetFile] -Parent=Rippers -Browser=ICE_GetFile - -[iexplore.exe] -Parent=Rippers - -[Inet - Eureka App] -Parent=Rippers -Browser=Inet - Eureka App - -[INetURL/*] -Parent=Rippers -Browser=INetURL - -[InetURL:/*] -Parent=Rippers -Browser=InetURL - -[Internet Exploiter/*] -Parent=Rippers - -[Internet Explore *] -Parent=Rippers -Browser=Fake IE - -[Internet Explorer *] -Parent=Rippers -Browser=Fake IE - -[IP*Works!*/*] -Parent=Rippers -Browser=IP*Works! - -[IrssiUrlLog/*] -Parent=Rippers -Browser=IrssiUrlLog - -[JPluck/*] -Parent=Rippers -Browser=JPluck - -[Kapere (http://www.kapere.com)] -Parent=Rippers -Browser=Kapere - -[LeechFTP] -Parent=Rippers -Browser=LeechFTP - -[LeechGet*] -Parent=Rippers -Browser=LeechGet - -[libcurl-agent/*] -Parent=Rippers -Browser=libcurl - -[libWeb/clsHTTP*] -Parent=Rippers -Browser=libWeb/clsHTTP - -[lwp*] -Parent=Rippers - -[MFC_Tear_Sample] -Parent=Rippers -Browser=MFC_Tear_Sample - -[Moozilla] -Parent=Rippers -Browser=Moozilla - -[MovableType/*] -Parent=Rippers -Browser=MovableType Web Log - -[Mozilla/2.0 (compatible; NEWT ActiveX; Win32)] -Parent=Rippers -Browser=NEWT ActiveX -Platform=Win32 - -[Mozilla/3.0 (compatible)] -Parent=Rippers - -[Mozilla/3.0 (compatible; Indy Library)] -Parent=Rippers -Cookies=true - -[Mozilla/3.01 (compatible;)] -Parent=Rippers - -[Mozilla/4.0 (compatible; BorderManager*)] -Parent=Rippers -Browser=Novell BorderManager - -[Mozilla/4.0 (compatible;)] -Parent=Rippers - -[Mozilla/5.0 (compatible; IPCheck Server Monitor*)] -Parent=Rippers -Browser=IPCheck Server Monitor - -[OCN-SOC/*] -Parent=Rippers -Browser=OCN-SOC - -[Offline Explorer*] -Parent=Rippers -Browser=Offline Explorer - -[Open Web Analytics Bot*] -Parent=Rippers -Browser=Open Web Analytics Bot - -[OSSProxy*] -Parent=Rippers -Browser=OSSProxy - -[Pageload*] -Parent=Rippers -Browser=PageLoad - -[PageNest/*] -Parent=Rippers -Browser=PageNest - -[pavuk/*] -Parent=Rippers -Browser=Pavuk - -[PEAR HTTP_Request*] -Parent=Rippers -Browser=PEAR-PHP - -[PHP*] -Parent=Rippers -Browser=PHP - -[PigBlock (Windows NT 5.1; U)*] -Parent=Rippers -Browser=PigBlock -Win32=true - -[Pockey*] -Parent=Rippers -Browser=Pockey-GetHTML - -[POE-Component-Client-HTTP/*] -Parent=Rippers -Browser=POE-Component-Client-HTTP - -[PycURL/*] -Parent=Rippers -Browser=PycURL - -[Python*] -Parent=Rippers -Browser=Python - -[RepoMonkey*] -Parent=Rippers -Browser=RepoMonkey - -[SBL-BOT*] -Parent=Rippers -Browser=BlackWidow - -[ScoutAbout*] -Parent=Rippers -Browser=ScoutAbout - -[sherlock/*] -Parent=Rippers -Browser=Sherlock - -[SiteParser/*] -Parent=Rippers -Browser=SiteParser - -[SiteSnagger*] -Parent=Rippers -Browser=SiteSnagger - -[SiteSucker/*] -Parent=Rippers -Browser=SiteSucker - -[SiteWinder*] -Parent=Rippers -Browser=SiteWinder - -[Snoopy*] -Parent=Rippers -Browser=Snoopy - -[SOFTWING_TEAR_AGENT*] -Parent=Rippers -Browser=AspTear - -[SuperHTTP/*] -Parent=Rippers -Browser=SuperHTTP - -[Tcl http client package*] -Parent=Rippers -Browser=Tcl http client package - -[Twisted PageGetter] -Parent=Rippers -Browser=Twisted PageGetter - -[URL2File/*] -Parent=Rippers -Browser=URL2File - -[UtilMind HTTPGet] -Parent=Rippers -Browser=UtilMind HTTPGet - -[VCI WebViewer*] -Parent=Rippers -Browser=VCI WebViewer - -[W3CRobot/*] -Parent=Rippers -Browser=W3CRobot - -[Web Downloader*] -Parent=Rippers -Browser=Web Downloader - -[Web Downloader/*] -Parent=Rippers -Browser=Web Downloader - -[Web Magnet*] -Parent=Rippers -Browser=Web Magnet - -[WebAuto/*] -Parent=Rippers - -[webbandit/*] -Parent=Rippers -Browser=webbandit - -[WebCopier*] -Parent=Rippers -Browser=WebCopier - -[WebDownloader*] -Parent=Rippers -Browser=WebDownloader - -[WebFetch] -Parent=Rippers -Browser=WebFetch - -[webfetch/*] -Parent=Rippers -Browser=WebFetch - -[WebGatherer*] -Parent=Rippers -Browser=WebGatherer - -[WebGet] -Parent=Rippers -Browser=WebGet - -[WebReaper*] -Parent=Rippers -Browser=WebReaper - -[WebRipper] -Parent=Rippers -Browser=WebRipper - -[WebSauger*] -Parent=Rippers -Browser=WebSauger - -[Website Downloader*] -Parent=Rippers -Browser=Website Downloader - -[Website eXtractor*] -Parent=Rippers -Browser=Website eXtractor - -[Website Quester] -Parent=Rippers -Browser=Website Quester - -[WebsiteExtractor*] -Parent=Rippers -Browser=Website eXtractor - -[WebSnatcher*] -Parent=Rippers -Browser=WebSnatcher - -[Webster Pro*] -Parent=Rippers -Browser=Webster Pro - -[WebStripper*] -Parent=Rippers -Browser=WebStripper - -[WebWhacker*] -Parent=Rippers -Browser=WebWhacker - -[WinScripter iNet Tools] -Parent=Rippers -Browser=WinScripter iNet Tools - -[WWW-Mechanize/*] -Parent=Rippers -Browser=WWW-Mechanize - -[Zend_Http_Client] -Parent=Rippers -Browser=Zend_Http_Client - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Site Monitors - -[Site Monitors] -Parent=DefaultProperties -Browser=Site Monitors -Cookies=true -isBanned=true -Crawler=true - -[*EasyRider*] -Parent=Site Monitors -Browser=EasyRider - -[*maxamine.com--robot*] -Parent=Site Monitors -Browser=maxamine.com--robot -isBanned=true - -[*WebMon ?.*] -Parent=Site Monitors -Browser=WebMon - -[Kenjin Spider*] -Parent=Site Monitors -Browser=Kenjin Spider - -[Kevin http://*] -Parent=Site Monitors -Browser=Kevin -isBanned=true - -[Mozilla/4.0 (compatible; ChangeDetection/*] -Parent=Site Monitors -Browser=ChangeDetection - -[Myst Monitor Service v*] -Parent=Site Monitors -Browser=Myst Monitor Service - -[Net Probe] -Parent=Site Monitors -Browser=Net Probe - -[NetMechanic*] -Parent=Site Monitors -Browser=NetMechanic - -[NetReality*] -Parent=Site Monitors -Browser=NetReality - -[Pingdom GIGRIB*] -Parent=Site Monitors -Browser=Pingdom - -[Site Valet Online*] -Parent=Site Monitors -Browser=Site Valet -isBanned=true - -[SITECHECKER] -Parent=Site Monitors -Browser=SITECHECKER - -[sitemonitor@dnsvr.com/*] -Parent=Site Monitors -Browser=ZoneEdit Failover Monitor -isBanned=false - -[UpTime Checker*] -Parent=Site Monitors -Browser=UpTime Checker - -[URL Control*] -Parent=Site Monitors -Browser=URL Control - -[URL_Access/*] -Parent=Site Monitors - -[URLCHECK] -Parent=Site Monitors -Browser=URLCHECK - -[URLy Warning*] -Parent=Site Monitors -Browser=URLy Warning - -[Webcheck *] -Parent=Site Monitors -Browser=Webcheck -Version=1.0 -MajorVer=1 -MinorVer=0 - -[WebPatrol/*] -Parent=Site Monitors -Browser=WebPatrol - -[websitepulse checker/*] -Parent=Site Monitors -Browser=websitepulse checker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Social Bookmarkers - -[Social Bookmarkers] -Parent=DefaultProperties -Browser=Social Bookmarkers -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[BookmarkBase(2/;http://bookmarkbase.com)] -Parent=Social Bookmarkers -Browser=BookmarkBase - -[Cocoal.icio.us/1.0 (v43) (Mac OS X; http://www.scifihifi.com/cocoalicious)] -Parent=Social Bookmarkers -Browser=Cocoalicious - -[Mozilla/5.0 (compatible; FriendFeedBot/0.*; Http://friendfeed.com/about/bot)] -Parent=Social Bookmarkers -Browser=FriendFeedBot - -[Twitturly*] -Parent=Social Bookmarkers -Browser=Twitturly - -[WinkBot/*] -Parent=Social Bookmarkers -Browser=WinkBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Translators - -[Translators] -Parent=DefaultProperties -Browser=Translators -Frames=true -Tables=true -Cookies=true - -[Seram Server] -Parent=Translators -Browser=Seram Server - -[TeragramWebcrawler/*] -Parent=Translators -Browser=TeragramWebcrawler -Version=1.0 -MajorVer=1 -MinorVer=0 - -[WebIndexer/* (Web Indexer; *)] -Parent=Translators -Browser=WorldLingo - -[WebTrans] -Parent=Translators -Browser=WebTrans - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Version Checkers - -[Version Checkers] -Parent=DefaultProperties -Browser=Version Checkers -Crawler=true - -[Automated Browscap.ini Updater. To report issues contact us at http://www.skycomp.ca] -Parent=Version Checkers -Browser=Automated Browscap.ini Updater - -[BMC Link Validator (http://www.briansmodelcars.com/links/)] -Parent=Version Checkers -Browser=BMC Link Validator -MajorVer=1 -MinorVer=0 -Platform=Win2000 - -[Browscap updater] -Parent=Version Checkers -Browser=Browscap updater - -[BrowscapUpdater1.0] -Parent=Version Checkers - -[Browser Capabilities Project (http://browsers.garykeith.com; http://browsers.garykeith.com/sitemail/contact-me.asp)] -Parent=Version Checkers -Browser=Gary Keith's Version Checker - -[Browser Capabilities Project AutoDownloader] -Parent=Version Checkers -Browser=TKC AutoDownloader - -[browsers.garykeith.com browscap.ini bot BETA] -Parent=Version Checkers - -[Code Sample Web Client] -Parent=Version Checkers -Browser=Code Sample Web Client - -[Desktop Sidebar*] -Parent=Version Checkers -Browser=Desktop Sidebar -isBanned=true - -[Mono Browser Capabilities Updater*] -Parent=Version Checkers -Browser=Mono Browser Capabilities Updater -isBanned=true - -[Rewmi/*] -Parent=Version Checkers -isBanned=true - -[Subtext Version 1.9* - http://subtextproject.com/ (Microsoft Windows NT 5.2.*)] -Parent=Version Checkers -Browser=Subtext - -[TherapeuticResearch] -Parent=Version Checkers -Browser=TherapeuticResearch - -[UpdateBrowscap*] -Parent=Version Checkers -Browser=UpdateBrowscap - -[www.garykeith.com browscap.ini bot*] -Parent=Version Checkers -Browser=clarkson.edu - -[www.substancia.com AutoHTTPAgent (ver *)] -Parent=Version Checkers -Browser=Substância - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Become - -[Become] -Parent=DefaultProperties -Browser=Become -Frames=true -Tables=true -isSyndicationReader=true -Crawler=true - -[*BecomeBot/*] -Parent=Become -Browser=BecomeBot - -[*BecomeBot@exava.com*] -Parent=Become -Browser=BecomeBot - -[*Exabot@exava.com*] -Parent=Become -Browser=Exabot - -[MonkeyCrawl/*] -Parent=Become -Browser=MonkeyCrawl - -[Mozilla/5.0 (compatible; BecomeJPBot/2.3; *)] -Parent=Become -Browser=BecomeJPBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Blue Coat Systems - -[Blue Coat Systems] -Parent=DefaultProperties -Browser=Blue Coat Systems -isBanned=true -Crawler=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Browscap Abusers - -[Browscap Abusers] -Parent=DefaultProperties -Browser=Browscap Abusers -isBanned=true - -[Apple-PubSub/*] -Parent=Browscap Abusers -Browser=Apple-PubSub - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FeedHub - -[FeedHub] -Parent=DefaultProperties -Browser=FeedHub -isSyndicationReader=true - -[FeedHub FeedDiscovery/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub FeedDiscovery -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedHub FeedFetcher/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub FeedFetcher -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedHub MetaDataFetcher/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub MetaDataFetcher -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Internet Content Rating Association] -Parent=DefaultProperties -Browser= -Frames=true -IFrames=true -Tables=true -Cookies=true -Crawler=true - -[ICRA_label_generator/1.?] -Parent=Internet Content Rating Association -Browser=ICRA_label_generator - -[ICRA_Semantic_spider/0.?] -Parent=Internet Content Rating Association -Browser=ICRA_Semantic_spider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NameProtect - -[NameProtect] -Parent=DefaultProperties -Browser=NameProtect -isBanned=true -Crawler=true - -[abot/*] -Parent=NameProtect -Browser=NameProtect - -[NP/*] -Parent=NameProtect -Browser=NameProtect - -[NPBot*] -Parent=NameProtect -Browser=NameProtect - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netcraft - -[Netcraft] -Parent=DefaultProperties -Browser=Netcraft -isBanned=true -Crawler=true - -[*Netcraft Web Server Survey*] -Parent=Netcraft -Browser=Netcraft Webserver Survey -isBanned=true - -[Mozilla/5.0 (compatible; NetcraftSurveyAgent/1.0; info@netcraft.com)] -Parent=Netcraft -Browser=NetcraftSurveyAgent - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NewsGator - -[NewsGator] -Parent=DefaultProperties -Browser=NewsGator -isSyndicationReader=true - -[MarsEdit*] -Parent=NewsGator -Browser=MarsEdit - -[NetNewsWire*/*] -Parent=NewsGator -Browser=NetNewsWire -Platform=MacOSX - -[NewsFire/*] -Parent=NewsGator -Browser=NewsFire - -[NewsGator FetchLinks extension/*] -Parent=NewsGator -Browser=NewsGator FetchLinks - -[NewsGator/*] -Parent=NewsGator -Browser=NewsGator -isBanned=true - -[NewsGatorOnline/*] -Parent=NewsGator -Browser=NewsGatorOnline - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.2 - -[Chrome 0.2] -Parent=DefaultProperties -Browser=Chrome -Version=0.2 -MinorVer=2 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.3 - -[Chrome 0.3] -Parent=DefaultProperties -Browser=Chrome -Version=0.3 -MinorVer=3 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.4 - -[Chrome 0.4] -Parent=DefaultProperties -Browser=Chrome -Version=0.4 -MinorVer=4 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.5 - -[Chrome 0.5] -Parent=DefaultProperties -Browser=Chrome -Version=0.5 -MinorVer=5 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 1.0 - -[Chrome 1.0] -Parent=DefaultProperties -Browser=Chrome -Version=1.0 -MajorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 2.0 - -[Chrome 2.0] -Parent=DefaultProperties -Browser=Chrome -Version=2.0 -MajorVer=2 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 3.0 - -[Chrome 3.0] -Parent=DefaultProperties -Browser=Chrome -Version=3.0 -MajorVer=3 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google Code - -[Google Code] -Parent=DefaultProperties -Browser=Google Code -Tables=true -Cookies=true -JavaApplets=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.2 - -[Iron 0.2] -Parent=DefaultProperties -Browser=Iron -Version=0.2 -MinorVer=2 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.3 - -[Iron 0.3] -Parent=DefaultProperties -Browser=Iron -Version=0.3 -MinorVer=3 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.4 - -[Iron 0.4] -Parent=DefaultProperties -Browser=Iron -Version=0.4 -MinorVer=4 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iPod - -[iPod] -Parent=DefaultProperties -Browser=iPod -Platform=iPhone OSX -isMobileDevice=true - -[Mozilla/5.0 (iPod; U; *Mac OS X; *) AppleWebKit/* (*) Version/3.0 Mobile/* Safari/*] -Parent=iPod -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX - -[Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2 like Mac OS X; en-us) AppleWebKit/* (KHTML, like Gecko) Mobile/*] -Parent=iPod - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iTunes - -[iTunes] -Parent=DefaultProperties -Browser=iTunes -Platform=iPhone OSX - -[iTunes/* (Windows; ?)] -Parent=iTunes -Browser=iTunes -Platform=Win32 -Win32=true - -[MOT-* iTunes/* MIB/* Profile/MIDP-* Configuration/CLDC-* UP.Link/*] -Parent=iTunes - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Media Players - -[Media Players] -Parent=DefaultProperties -Browser=Media Players -Cookies=true - -[Microsoft NetShow(TM) Player with RealVideo(R)] -Parent=Media Players -Browser=Microsoft NetShow - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; *) AppleWebKit/* RealPlayer] -Parent=Media Players -Browser=RealPlayer -Platform=MacOSX - -[MPlayer 0.9*] -Parent=Media Players -Browser=MPlayer -Version=0.9 -MajorVer=0 -MinorVer=9 - -[MPlayer 1.*] -Parent=Media Players -Browser=MPlayer -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MPlayer HEAD CVS] -Parent=Media Players -Browser=MPlayer - -[RealPlayer*] -Parent=Media Players -Browser=RealPlayer - -[RMA/*] -Parent=Media Players -Browser=RMA - -[VLC media player*] -Parent=Media Players -Browser=VLC - -[vobsub] -Parent=Media Players -Browser=vobsub -isBanned=true - -[WinampMPEG/*] -Parent=Media Players -Browser=WinAmp - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nintendo - -[Nintendo Wii] -Parent=DefaultProperties -Browser= -isMobileDevice=true - -[Opera/* (Nintendo DSi; Opera/*; *; *)] -Parent=Nintendo Wii -Browser=DSi - -[Opera/* (Nintendo Wii; U; *)] -Parent=Nintendo Wii -Browser=Wii - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Windows Media Player - -[Windows Media Player] -Parent=DefaultProperties -Browser=Windows Media Player -Cookies=true - -[NSPlayer/10.*] -Parent=Windows Media Player -Version=10.0 -MajorVer=10 -MinorVer=0 - -[NSPlayer/11.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=11.0 -MajorVer=11 -MinorVer=0 - -[NSPlayer/4.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=4.0 -MajorVer=4 -MinorVer=0 - -[NSPlayer/7.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=7.0 -MajorVer=7 -MinorVer=0 - -[NSPlayer/8.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=8.0 -MajorVer=8 -MinorVer=0 - -[NSPlayer/9.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=9.0 -MajorVer=9 -MinorVer=0 - -[Windows-Media-Player/10.*] -Parent=Windows Media Player -Browser=Windows-Media-Player -Version=10.0 -MajorVer=10 -MinorVer=0 -Win32=true - -[Windows-Media-Player/11.*] -Parent=Windows Media Player -Version=11.0 -MajorVer=11 -MinorVer=0 -Win32=true - -[Windows-Media-Player/7.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=7.0 -MajorVer=7 -MinorVer=0 -Win32=true - -[Windows-Media-Player/8.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=8.0 -MajorVer=8 -MinorVer=0 -Win32=true - -[Windows-Media-Player/9.*] -Parent=Windows Media Player -Version=9.0 -MajorVer=9 -MinorVer=0 -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Zune - -[Zune] -Parent=DefaultProperties -Browser=Zune -Cookies=true - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 2.0*)*] -Parent=Zune -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 2.5*)*] -Parent=Zune -Version=2.5 -MajorVer=2 -MinorVer=5 - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 3.0*)*] -Parent=Zune -Version=3.0 -MajorVer=3 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.0 - -[QuickTime 7.0] -Parent=DefaultProperties -Browser=QuickTime -Version=7.0 -MajorVer=7 -Cookies=true - -[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.0 -Platform=MacOSX - -[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.0 -Platform=MacPPC - -[QuickTime (qtver=7.0*;os=Windows 95*)] -Parent=QuickTime 7.0 -Platform=Win95 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows 98*)] -Parent=QuickTime 7.0 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows Me*)] -Parent=QuickTime 7.0 -Platform=WinME -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 4.0*)] -Parent=QuickTime 7.0 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.0*)] -Parent=QuickTime 7.0 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.1*)] -Parent=QuickTime 7.0 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.2*)] -Parent=QuickTime 7.0 -Platform=Win2003 -Win32=true - -[QuickTime/7.0.* (qtver=7.0.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.0 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.1 - -[QuickTime 7.1] -Parent=DefaultProperties -Browser=QuickTime -Version=7.1 -MajorVer=7 -MinorVer=1 -Cookies=true - -[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.1 -Platform=MacOSX - -[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.1 -Platform=MacPPC - -[QuickTime (qtver=7.1*;os=Windows 98*)] -Parent=QuickTime 7.1 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 4.0*)] -Parent=QuickTime 7.1 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.0*)] -Parent=QuickTime 7.1 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.1*)] -Parent=QuickTime 7.1 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.2*)] -Parent=QuickTime 7.1 -Platform=Win2003 -Win32=true - -[QuickTime/7.1.* (qtver=7.1.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.1 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.2 - -[QuickTime 7.2] -Parent=DefaultProperties -Browser=QuickTime -Version=7.2 -MajorVer=7 -MinorVer=2 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.2*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.2 -Platform=MacOSX - -[QuickTime (qtver=7.2*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.2 -Platform=MacPPC - -[QuickTime (qtver=7.2*;os=Windows 98*)] -Parent=QuickTime 7.2 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 4.0*)] -Parent=QuickTime 7.2 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.0*)] -Parent=QuickTime 7.2 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.1*)] -Parent=QuickTime 7.2 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.2*)] -Parent=QuickTime 7.2 -Platform=Win2003 -Win32=true - -[QuickTime/7.2.* (qtver=7.2.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.2 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.3 - -[QuickTime 7.3] -Parent=DefaultProperties -Browser=QuickTime -Version=7.3 -MajorVer=7 -MinorVer=3 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.3*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.3 -Platform=MacOSX - -[QuickTime (qtver=7.3*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.3 -Platform=MacPPC - -[QuickTime (qtver=7.3*;os=Windows 98*)] -Parent=QuickTime 7.3 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 4.0*)] -Parent=QuickTime 7.3 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.0*)] -Parent=QuickTime 7.3 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.1*)] -Parent=QuickTime 7.3 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.2*)] -Parent=QuickTime 7.3 -Platform=Win2003 -Win32=true - -[QuickTime/7.3.* (qtver=7.3.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.3 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.4 - -[QuickTime 7.4] -Parent=DefaultProperties -Browser=QuickTime -Version=7.4 -MajorVer=7 -MinorVer=4 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.4*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.4 -Platform=MacOSX - -[QuickTime (qtver=7.4*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.4 -Platform=MacPPC - -[QuickTime (qtver=7.4*;os=Windows 98*)] -Parent=QuickTime 7.4 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 4.0*)] -Parent=QuickTime 7.4 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.0*)] -Parent=QuickTime 7.4 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.1*)] -Parent=QuickTime 7.4 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.2*)] -Parent=QuickTime 7.4 -Platform=Win2003 -Win32=true - -[QuickTime/7.4.* (qtver=7.4.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.4 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google Android - -[Android] -Parent=DefaultProperties -Browser=Android -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[Mozilla/5.0 (Linux; U; Android *; *) AppleWebKit/* (KHTML, like Gecko) Safari/*] -Parent=Android -Browser=Android -Platform=Linux -isMobileDevice=true - -[Mozilla/5.0 (Linux; U; Android *; *) AppleWebKit/* (KHTML, like Gecko) Version/3.0.* Mobile Safari/*] -Parent=Android -Browser=Android -Platform=Linux -isMobileDevice=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BlackBerry - -[BlackBerry] -Parent=DefaultProperties -Browser=BlackBerry -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[*BlackBerry*] -Parent=BlackBerry - -[*BlackBerrySimulator/*] -Parent=BlackBerry - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Handspring Blazer - -[Blazer] -Parent=DefaultProperties -Browser=Handspring Blazer -Platform=Palm -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 95; PalmSource; Blazer 3.0) 16;160x160] -Parent=Blazer -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.0) 16;320x448] -Parent=Blazer -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.1) 16;320x320] -Parent=Blazer -Version=4.1 -MajorVer=4 -MinorVer=1 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.2) 16;320x320] -Parent=Blazer -Version=4.2 -MajorVer=4 -MinorVer=2 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.4) 16;320x320] -Parent=Blazer -Version=4.4 -MajorVer=4 -MinorVer=4 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.5) 16;320x320] -Parent=Blazer -Version=4.5 -MajorVer=4 -MinorVer=5 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DoCoMo - -[DoCoMo] -Parent=DefaultProperties -Browser=DoCoMo -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[DoCoMo/1.0*] -Parent=DoCoMo -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WAP - -[DoCoMo/2.0*] -Parent=DoCoMo -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=WAP - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IEMobile - -[IEMobile] -Parent=DefaultProperties -Browser=IEMobile -Platform=WinCE -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -VBScript=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.*)*] -Parent=IEMobile -Version=6.0 -MajorVer=6 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.*)*] -Parent=IEMobile -Version=7.0 -MajorVer=7 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iPhone - -[iPhone] -Parent=DefaultProperties -Browser=iPhone -Platform=iPhone OSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -isMobileDevice=true -CssVersion=3 -supportsCSS=true - -[Mozilla/4.0 (iPhone; *)] -Parent=iPhone - -[Mozilla/4.0 (iPhone; U; CPU like Mac OS X; *)] -Parent=iPhone - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_0_1 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_1 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko)] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0_2 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_1 like Mac OS X; *)*] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_2_1 like Mac OS X; *)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.0 Mobile/* Safari/*] -Parent=iPhone -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/5.0 (iPod; U; *Mac OS X; *) AppleWebKit/* (*) Version/* Mobile/*] -Parent=iPhone -Browser=iTouch - -[Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2* like Mac OS X; *)*] -Parent=iPhone -Browser=iTouch -Version=2.2 -MajorVer=2 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KDDI - -[KDDI] -Parent=DefaultProperties -Browser=KDDI -Frames=true -Tables=true -Cookies=true -BackgroundSounds=true -VBScript=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[KDDI-* UP.Browser/* (GUI) MMP/*] -Parent=KDDI - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Miscellaneous Mobile - -[Miscellaneous Mobile] -Parent=DefaultProperties -Browser= -IFrames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; *; CentOS; *) AppleWebKit/* (KHTML, like Gecko) Bolt/0.* Version/3.0 Safari/*] -Parent=Miscellaneous Mobile -Browser=Bolt - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Motorola Internet Browser - -[Motorola Internet Browser] -Parent=DefaultProperties -Browser=Motorola Internet Browser -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[MOT-*/*] -Parent=Motorola Internet Browser - -[MOT-1*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-8700_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-0A/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-2B/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-88/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-C???/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-GATW_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-L6/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-L7/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-M*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-MP*/* Mozilla/* (compatible; MSIE *; Windows CE; *)] -Parent=Motorola Internet Browser -Win32=true - -[MOT-MP*/* Mozilla/4.0 (compatible; MSIE *; Windows CE; *)] -Parent=Motorola Internet Browser -Win32=true - -[MOT-SAP4_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-T*/*] -Parent=Motorola Internet Browser - -[MOT-T7*/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-T721*] -Parent=Motorola Internet Browser - -[MOT-TA02/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V*/*] -Parent=Motorola Internet Browser - -[MOT-V*/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-V3/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V4*/* MIB/*] -Parent=Motorola Internet Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN Mobile Proxy - -[MSN Mobile Proxy] -Parent=DefaultProperties -Browser=MSN Mobile Proxy -Win32=true -Frames=true -Tables=true -Cookies=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true - -[Mozilla/* (compatible; MSIE *; Windows*; MSN Mobile Proxy)] -Parent=MSN Mobile Proxy - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetFront - -[NetFront] -Parent=DefaultProperties -Browser=NetFront -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[*NetFront/*] -Parent=NetFront - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nokia - -[Nokia] -Parent=DefaultProperties -Browser=Nokia -Tables=true -Cookies=true -isMobileDevice=true - -[*Nokia*/*] -Parent=Nokia - -[Mozilla/* (SymbianOS/*; ?; *) AppleWebKit/* (KHTML, like Gecko) Safari/*] -Parent=Nokia -Platform=SymbianOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Openwave Mobile Browser - -[Openwave Mobile Browser] -Parent=DefaultProperties -Browser=Openwave Mobile Browser -Alpha=true -Win32=true -Win64=true -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[*UP.Browser/*] -Parent=Openwave Mobile Browser - -[*UP.Link/*] -Parent=Openwave Mobile Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera Mini - -[Opera Mini] -Parent=DefaultProperties -Browser=Opera Mini -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[Opera/* (J2ME/MIDP; Opera Mini/1.0*)*] -Parent=Opera Mini -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/1.1*)*] -Parent=Opera Mini -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/1.2*)*] -Parent=Opera Mini -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Opera/* (J2ME/MIDP; Opera Mini/2.0*)*] -Parent=Opera Mini -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/3.0*)*] -Parent=Opera Mini -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/3.1*)*] -Parent=Opera Mini -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/4.0*)*] -Parent=Opera Mini -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/4.1*)*] -Parent=Opera Mini -Version=4.1 -MajorVer=4 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/4.2*)*] -Parent=Opera Mini -Version=4.2 -MajorVer=4 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera Mobile - -[Opera Mobile] -Parent=DefaultProperties -Browser=Opera Mobi -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Opera/9.5 (Microsoft Windows; PPC; *Opera Mobile/*)] -Parent=Opera Mobile -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Opera/9.5 (Microsoft Windows; PPC; Opera Mobi/*)] -Parent=Opera Mobile -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Opera/9.51 Beta (Microsoft Windows; PPC; Opera Mobi/*)*] -Parent=Opera Mobile -Version=9.51 -MajorVer=9 -MinorVer=51 -Beta=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Playstation - -[Playstation] -Parent=DefaultProperties -Browser=Playstation -Platform=WAP -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Mozilla/* (PLAYSTATION *; *)] -Parent=Playstation -Browser=PlayStation 3 -Frames=false - -[Mozilla/* (PSP (PlayStation Portable); *)] -Parent=Playstation - -[Sony PS2 (Linux)] -Parent=Playstation -Browser=Sony PS2 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Pocket PC - -[Pocket PC] -Parent=DefaultProperties -Browser=Pocket PC -Platform=WinCE -Win32=true -Frames=true -Tables=true -Cookies=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*(compatible; MSIE *.*; Windows CE; PPC; *)] -Parent=Pocket PC - -[HTC-*/* Mozilla/* (compatible; MSIE *.*; Windows CE*)*] -Parent=Pocket PC -Win32=true - -[Mozilla/* (compatible; MSPIE *.*; *Windows CE*)*] -Parent=Pocket PC -Win32=true - -[T-Mobile* Mozilla/* (compatible; MSIE *.*; Windows CE; *)] -Parent=Pocket PC - -[Vodafone* Mozilla/* (compatible; MSIE *.*; Windows CE; *)*] -Parent=Pocket PC - -[Windows CE (Pocket PC) - Version *.*] -Parent=Pocket PC -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SEMC Browser - -[SEMC Browser] -Parent=DefaultProperties -Browser=SEMC Browser -Platform=JAVA -Tables=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*SEMC-Browser/*] -Parent=SEMC Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SonyEricsson - -[SonyEricsson] -Parent=DefaultProperties -Browser=SonyEricsson -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*Ericsson*] -Parent=SonyEricsson - -[*SonyEricsson*] -Parent=SonyEricsson - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netbox - -[Netbox] -Parent=DefaultProperties -Browser=Netbox -Frames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/3.01 (compatible; Netbox/*; Linux*)] -Parent=Netbox -Browser=Netbox -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PowerTV - -[PowerTV] -Parent=DefaultProperties -Browser=PowerTV -Platform=PowerTV -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/4.0 PowerTV/1.5 (Compatible; Spyglass DM 3.2.1, EXPLORER)] -Parent=PowerTV -Version=1.5 -MajorVer=1 -MinorVer=5 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WebTV/MSNTV - -[WebTV] -Parent=DefaultProperties -Browser=WebTV/MSNTV -Platform=WebTV -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/3.0 WebTV/1.*(compatible; MSIE 2.0)] -Parent=WebTV -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/4.0 WebTV/2.0*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/4.0 WebTV/2.1*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/4.0 WebTV/2.2*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Mozilla/4.0 WebTV/2.3*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.3 -MajorVer=2 -MinorVer=3 - -[Mozilla/4.0 WebTV/2.4*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.4 -MajorVer=2 -MinorVer=4 - -[Mozilla/4.0 WebTV/2.5*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.5 -MajorVer=2 -MinorVer=5 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.6*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.6 -MajorVer=2 -MinorVer=6 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.7*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.7 -MajorVer=2 -MinorVer=7 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.8*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.8 -MajorVer=2 -MinorVer=8 -JavaApplets=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.9*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.9 -MajorVer=2 -MinorVer=9 -JavaApplets=true -CssVersion=1 -supportsCSS=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Amaya - -[Amaya] -Parent=DefaultProperties -Browser=Amaya -Tables=true -Cookies=true - -[amaya/7.*] -Parent=Amaya -Version=7.0 -MajorVer=7 -MinorVer=0 - -[amaya/8.0*] -Parent=Amaya -Version=8.0 -MajorVer=8 -MinorVer=0 -CssVersion=2 -supportsCSS=true - -[amaya/8.1*] -Parent=Amaya -Version=8.1 -MajorVer=8 -MinorVer=1 -CssVersion=2 -supportsCSS=true - -[amaya/8.2*] -Parent=Amaya -Version=8.2 -MajorVer=8 -MinorVer=2 -CssVersion=2 -supportsCSS=true - -[amaya/8.3*] -Parent=Amaya -Version=8.3 -MajorVer=8 -MinorVer=3 -CssVersion=2 -supportsCSS=true - -[amaya/8.4*] -Parent=Amaya -Version=8.4 -MajorVer=8 -MinorVer=4 -CssVersion=2 -supportsCSS=true - -[amaya/8.5*] -Parent=Amaya -Version=8.5 -MajorVer=8 -MinorVer=5 -CssVersion=2 -supportsCSS=true - -[amaya/8.6*] -Parent=Amaya -Version=8.6 -MajorVer=8 -MinorVer=6 -CssVersion=2 -supportsCSS=true - -[amaya/8.7*] -Parent=Amaya -Version=8.7 -MajorVer=8 -MinorVer=7 -CssVersion=2 -supportsCSS=true - -[amaya/8.8*] -Parent=Amaya -Version=8.8 -MajorVer=8 -MinorVer=8 -CssVersion=2 -supportsCSS=true - -[amaya/8.9*] -Parent=Amaya -Version=8.9 -MajorVer=8 -MinorVer=9 -CssVersion=2 -supportsCSS=true - -[amaya/9.0*] -Parent=Amaya -Version=9.0 -MajorVer=8 -MinorVer=0 -CssVersion=2 -supportsCSS=true - -[amaya/9.1*] -Parent=Amaya -Version=9.1 -MajorVer=9 -MinorVer=1 -CssVersion=2 -supportsCSS=true - -[amaya/9.2*] -Parent=Amaya -Version=9.2 -MajorVer=9 -MinorVer=2 -CssVersion=2 -supportsCSS=true - -[amaya/9.3*] -Parent=Amaya -Version=9.3 -MajorVer=9 -MinorVer=3 - -[amaya/9.4*] -Parent=Amaya -Version=9.4 -MajorVer=9 -MinorVer=4 - -[amaya/9.5*] -Parent=Amaya -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Emacs-w3m/*] -Parent=Emacs/W3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Links - -[Links] -Parent=DefaultProperties -Browser=Links -Frames=true -Tables=true - -[Links (0.9*; CYGWIN_NT-5.1*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=WinXP - -[Links (0.9*; Darwin*)] -Parent=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=MacPPC - -[Links (0.9*; FreeBSD*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=FreeBSD - -[Links (0.9*; Linux*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Linux - -[Links (0.9*; OS/2*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=OS/2 - -[Links (0.9*; Unix*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Unix - -[Links (0.9*; Win32*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Win32 -Win32=true - -[Links (1.0*; CYGWIN_NT-5.1*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP - -[Links (1.0*; FreeBSD*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=FreeBSD - -[Links (1.0*; Linux*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Linux - -[Links (1.0*; OS/2*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=OS/2 - -[Links (1.0*; Unix*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Unix - -[Links (1.0*; Win32*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win32 -Win32=true - -[Links (2.0*; Linux*)] -Parent=Links -Browser=Links -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Linux - -[Links (2.1*; FreeBSD*)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=FreeBSD - -[Links (2.1*; Linux *)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=Linux - -[Links (2.1*; OpenBSD*)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=OpenBSD - -[Links (2.2*; FreeBSD*)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=FreeBSD - -[Links (2.2*; Linux *)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=Linux - -[Links (2.2*; OpenBSD*)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=OpenBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lynx - -[Lynx] -Parent=DefaultProperties -Browser=Lynx -Frames=true -Tables=true - -[Lynx *] -Parent=Lynx -Browser=Lynx - -[Lynx/2.3*] -Parent=Lynx -Browser=Lynx -Version=2.3 -MajorVer=2 -MinorVer=3 - -[Lynx/2.4*] -Parent=Lynx -Browser=Lynx -Version=2.4 -MajorVer=2 -MinorVer=4 - -[Lynx/2.5*] -Parent=Lynx -Browser=Lynx -Version=2.5 -MajorVer=2 -MinorVer=5 - -[Lynx/2.6*] -Parent=Lynx -Browser=Lynx -Version=2.6 -MajorVer=2 -MinorVer=6 - -[Lynx/2.7*] -Parent=Lynx -Browser=Lynx -Version=2.7 -MajorVer=2 -MinorVer=7 - -[Lynx/2.8*] -Parent=Lynx -Browser=Lynx -Version=2.8 -MajorVer=2 -MinorVer=8 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NCSA Mosaic - -[Mosaic] -Parent=DefaultProperties -Browser=Mosaic - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; w3m - -[w3m] -Parent=DefaultProperties -Browser=w3m -Frames=true -Tables=true - -[w3m/0.1*] -Parent=w3m -Browser=w3m -Version=0.1 -MajorVer=0 -MinorVer=1 - -[w3m/0.2*] -Parent=w3m -Browser=w3m -Version=0.2 -MajorVer=0 -MinorVer=2 - -[w3m/0.3*] -Parent=w3m -Browser=w3m -Version=0.3 -MajorVer=0 -MinorVer=3 - -[w3m/0.4*] -Parent=w3m -Browser=w3m -Version=0.4 -MajorVer=0 -MinorVer=4 -Cookies=true - -[w3m/0.5*] -Parent=w3m -Browser=w3m -Version=0.5 -MajorVer=0 -MinorVer=5 -Cookies=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.10 - -[ELinks 0.10] -Parent=DefaultProperties -Browser=ELinks -Version=0.10 -MinorVer=10 -Frames=true -Tables=true - -[ELinks (0.10*; *AIX*)] -Parent=ELinks 0.10 -Platform=AIX - -[ELinks (0.10*; *BeOS*)] -Parent=ELinks 0.10 -Platform=BeOS - -[ELinks (0.10*; *CygWin*)] -Parent=ELinks 0.10 -Platform=CygWin - -[ELinks (0.10*; *Darwin*)] -Parent=ELinks 0.10 -Platform=Darwin - -[ELinks (0.10*; *Digital Unix*)] -Parent=ELinks 0.10 -Platform=Digital Unix - -[ELinks (0.10*; *FreeBSD*)] -Parent=ELinks 0.10 -Platform=FreeBSD - -[ELinks (0.10*; *HPUX*)] -Parent=ELinks 0.10 -Platform=HP-UX - -[ELinks (0.10*; *IRIX*)] -Parent=ELinks 0.10 -Platform=IRIX - -[ELinks (0.10*; *Linux*)] -Parent=ELinks 0.10 -Platform=Linux - -[ELinks (0.10*; *NetBSD*)] -Parent=ELinks 0.10 -Platform=NetBSD - -[ELinks (0.10*; *OpenBSD*)] -Parent=ELinks 0.10 -Platform=OpenBSD - -[ELinks (0.10*; *OS/2*)] -Parent=ELinks 0.10 -Platform=OS/2 - -[ELinks (0.10*; *RISC*)] -Parent=ELinks 0.10 -Platform=RISC OS - -[ELinks (0.10*; *Solaris*)] -Parent=ELinks 0.10 -Platform=Solaris - -[ELinks (0.10*; *Unix*)] -Parent=ELinks 0.10 -Platform=Unix - -[ELinks/0.10* (*AIX*)] -Parent=ELinks 0.10 -Platform=AIX - -[ELinks/0.10* (*BeOS*)] -Parent=ELinks 0.10 -Platform=BeOS - -[ELinks/0.10* (*CygWin*)] -Parent=ELinks 0.10 -Platform=CygWin - -[ELinks/0.10* (*Darwin*)] -Parent=ELinks 0.10 -Platform=Darwin - -[ELinks/0.10* (*Digital Unix*)] -Parent=ELinks 0.10 -Platform=Digital Unix - -[ELinks/0.10* (*FreeBSD*)] -Parent=ELinks 0.10 -Platform=FreeBSD - -[ELinks/0.10* (*HPUX*)] -Parent=ELinks 0.10 -Platform=HP-UX - -[ELinks/0.10* (*IRIX*)] -Parent=ELinks 0.10 -Platform=IRIX - -[ELinks/0.10* (*Linux*)] -Parent=ELinks 0.10 -Platform=Linux - -[ELinks/0.10* (*NetBSD*)] -Parent=ELinks 0.10 -Platform=NetBSD - -[ELinks/0.10* (*OpenBSD*)] -Parent=ELinks 0.10 -Platform=OpenBSD - -[ELinks/0.10* (*OS/2*)] -Parent=ELinks 0.10 -Platform=OS/2 - -[ELinks/0.10* (*RISC*)] -Parent=ELinks 0.10 -Platform=RISC OS - -[ELinks/0.10* (*Solaris*)] -Parent=ELinks 0.10 -Platform=Solaris - -[ELinks/0.10* (*Unix*)] -Parent=ELinks 0.10 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.11 - -[ELinks 0.11] -Parent=DefaultProperties -Browser=ELinks -Version=0.11 -MinorVer=11 -Frames=true -Tables=true - -[ELinks (0.11*; *AIX*)] -Parent=ELinks 0.11 -Platform=AIX - -[ELinks (0.11*; *BeOS*)] -Parent=ELinks 0.11 -Platform=BeOS - -[ELinks (0.11*; *CygWin*)] -Parent=ELinks 0.11 -Platform=CygWin - -[ELinks (0.11*; *Darwin*)] -Parent=ELinks 0.11 -Platform=Darwin - -[ELinks (0.11*; *Digital Unix*)] -Parent=ELinks 0.11 -Platform=Digital Unix - -[ELinks (0.11*; *FreeBSD*)] -Parent=ELinks 0.11 -Platform=FreeBSD - -[ELinks (0.11*; *HPUX*)] -Parent=ELinks 0.11 -Platform=HP-UX - -[ELinks (0.11*; *IRIX*)] -Parent=ELinks 0.11 -Platform=IRIX - -[ELinks (0.11*; *Linux*)] -Parent=ELinks 0.11 -Platform=Linux - -[ELinks (0.11*; *NetBSD*)] -Parent=ELinks 0.11 -Platform=NetBSD - -[ELinks (0.11*; *OpenBSD*)] -Parent=ELinks 0.11 -Platform=OpenBSD - -[ELinks (0.11*; *OS/2*)] -Parent=ELinks 0.11 -Platform=OS/2 - -[ELinks (0.11*; *RISC*)] -Parent=ELinks 0.11 -Platform=RISC OS - -[ELinks (0.11*; *Solaris*)] -Parent=ELinks 0.11 -Platform=Solaris - -[ELinks (0.11*; *Unix*)] -Parent=ELinks 0.11 -Platform=Unix - -[ELinks/0.11* (*AIX*)] -Parent=ELinks 0.11 -Platform=AIX - -[ELinks/0.11* (*BeOS*)] -Parent=ELinks 0.11 -Platform=BeOS - -[ELinks/0.11* (*CygWin*)] -Parent=ELinks 0.11 -Platform=CygWin - -[ELinks/0.11* (*Darwin*)] -Parent=ELinks 0.11 -Platform=Darwin - -[ELinks/0.11* (*Digital Unix*)] -Parent=ELinks 0.11 -Platform=Digital Unix - -[ELinks/0.11* (*FreeBSD*)] -Parent=ELinks 0.11 -Platform=FreeBSD - -[ELinks/0.11* (*HPUX*)] -Parent=ELinks 0.11 -Platform=HP-UX - -[ELinks/0.11* (*IRIX*)] -Parent=ELinks 0.11 -Platform=IRIX - -[ELinks/0.11* (*Linux*)] -Parent=ELinks 0.11 -Platform=Linux - -[ELinks/0.11* (*NetBSD*)] -Parent=ELinks 0.11 -Platform=NetBSD - -[ELinks/0.11* (*OpenBSD*)] -Parent=ELinks 0.11 -Platform=OpenBSD - -[ELinks/0.11* (*OS/2*)] -Parent=ELinks 0.11 -Platform=OS/2 - -[ELinks/0.11* (*RISC*)] -Parent=ELinks 0.11 -Platform=RISC OS - -[ELinks/0.11* (*Solaris*)] -Parent=ELinks 0.11 -Platform=Solaris - -[ELinks/0.11* (*Unix*)] -Parent=ELinks 0.11 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.12 - -[ELinks 0.12] -Parent=DefaultProperties -Browser=ELinks -Version=0.12 -MinorVer=12 -Frames=true -Tables=true - -[ELinks (0.12*; *AIX*)] -Parent=ELinks 0.12 -Platform=AIX - -[ELinks (0.12*; *BeOS*)] -Parent=ELinks 0.12 -Platform=BeOS - -[ELinks (0.12*; *CygWin*)] -Parent=ELinks 0.12 -Platform=CygWin - -[ELinks (0.12*; *Darwin*)] -Parent=ELinks 0.12 -Platform=Darwin - -[ELinks (0.12*; *Digital Unix*)] -Parent=ELinks 0.12 -Platform=Digital Unix - -[ELinks (0.12*; *FreeBSD*)] -Parent=ELinks 0.12 -Platform=FreeBSD - -[ELinks (0.12*; *HPUX*)] -Parent=ELinks 0.12 -Platform=HP-UX - -[ELinks (0.12*; *IRIX*)] -Parent=ELinks 0.12 -Platform=IRIX - -[ELinks (0.12*; *Linux*)] -Parent=ELinks 0.12 -Platform=Linux - -[ELinks (0.12*; *NetBSD*)] -Parent=ELinks 0.12 -Platform=NetBSD - -[ELinks (0.12*; *OpenBSD*)] -Parent=ELinks 0.12 -Platform=OpenBSD - -[ELinks (0.12*; *OS/2*)] -Parent=ELinks 0.12 -Platform=OS/2 - -[ELinks (0.12*; *RISC*)] -Parent=ELinks 0.12 -Platform=RISC OS - -[ELinks (0.12*; *Solaris*)] -Parent=ELinks 0.12 -Platform=Solaris - -[ELinks (0.12*; *Unix*)] -Parent=ELinks 0.12 -Platform=Unix - -[ELinks/0.12* (*AIX*)] -Parent=ELinks 0.12 -Platform=AIX - -[ELinks/0.12* (*BeOS*)] -Parent=ELinks 0.12 -Platform=BeOS - -[ELinks/0.12* (*CygWin*)] -Parent=ELinks 0.12 -Platform=CygWin - -[ELinks/0.12* (*Darwin*)] -Parent=ELinks 0.12 -Platform=Darwin - -[ELinks/0.12* (*Digital Unix*)] -Parent=ELinks 0.12 -Platform=Digital Unix - -[ELinks/0.12* (*FreeBSD*)] -Parent=ELinks 0.12 -Platform=FreeBSD - -[ELinks/0.12* (*HPUX*)] -Parent=ELinks 0.12 -Platform=HP-UX - -[ELinks/0.12* (*IRIX*)] -Parent=ELinks 0.12 -Platform=IRIX - -[ELinks/0.12* (*Linux*)] -Parent=ELinks 0.12 -Platform=Linux - -[ELinks/0.12* (*NetBSD*)] -Parent=ELinks 0.12 -Platform=NetBSD - -[ELinks/0.12* (*OpenBSD*)] -Parent=ELinks 0.12 -Platform=OpenBSD - -[ELinks/0.12* (*OS/2*)] -Parent=ELinks 0.12 -Platform=OS/2 - -[ELinks/0.12* (*RISC*)] -Parent=ELinks 0.12 -Platform=RISC OS - -[ELinks/0.12* (*Solaris*)] -Parent=ELinks 0.12 -Platform=Solaris - -[ELinks/0.12* (*Unix*)] -Parent=ELinks 0.12 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.9 - -[ELinks 0.9] -Parent=DefaultProperties -Browser=ELinks -Version=0.9 -MinorVer=9 -Frames=true -Tables=true - -[ELinks (0.9*; *AIX*)] -Parent=ELinks 0.9 -Platform=AIX - -[ELinks (0.9*; *BeOS*)] -Parent=ELinks 0.9 -Platform=BeOS - -[ELinks (0.9*; *CygWin*)] -Parent=ELinks 0.9 -Platform=CygWin - -[ELinks (0.9*; *Darwin*)] -Parent=ELinks 0.9 -Platform=Darwin - -[ELinks (0.9*; *Digital Unix*)] -Parent=ELinks 0.9 -Platform=Digital Unix - -[ELinks (0.9*; *FreeBSD*)] -Parent=ELinks 0.9 -Platform=FreeBSD - -[ELinks (0.9*; *HPUX*)] -Parent=ELinks 0.9 -Platform=HP-UX - -[ELinks (0.9*; *IRIX*)] -Parent=ELinks 0.9 -Platform=IRIX - -[ELinks (0.9*; *Linux*)] -Parent=ELinks 0.9 -Platform=Linux - -[ELinks (0.9*; *NetBSD*)] -Parent=ELinks 0.9 -Platform=NetBSD - -[ELinks (0.9*; *OpenBSD*)] -Parent=ELinks 0.9 -Platform=OpenBSD - -[ELinks (0.9*; *OS/2*)] -Parent=ELinks 0.9 -Platform=OS/2 - -[ELinks (0.9*; *RISC*)] -Parent=ELinks 0.9 -Platform=RISC OS - -[ELinks (0.9*; *Solaris*)] -Parent=ELinks 0.9 -Platform=Solaris - -[ELinks (0.9*; *Unix*)] -Parent=ELinks 0.9 -Platform=Unix - -[ELinks/0.9* (*AIX*)] -Parent=ELinks 0.9 -Platform=AIX - -[ELinks/0.9* (*BeOS*)] -Parent=ELinks 0.9 -Platform=BeOS - -[ELinks/0.9* (*CygWin*)] -Parent=ELinks 0.9 -Platform=CygWin - -[ELinks/0.9* (*Darwin*)] -Parent=ELinks 0.9 -Platform=Darwin - -[ELinks/0.9* (*Digital Unix*)] -Parent=ELinks 0.9 -Platform=Digital Unix - -[ELinks/0.9* (*FreeBSD*)] -Parent=ELinks 0.9 -Platform=FreeBSD - -[ELinks/0.9* (*HPUX*)] -Parent=ELinks 0.9 -Platform=HP-UX - -[ELinks/0.9* (*IRIX*)] -Parent=ELinks 0.9 -Platform=IRIX - -[ELinks/0.9* (*Linux*)] -Parent=ELinks 0.9 -Platform=Linux - -[ELinks/0.9* (*NetBSD*)] -Parent=ELinks 0.9 -Platform=NetBSD - -[ELinks/0.9* (*OpenBSD*)] -Parent=ELinks 0.9 -Platform=OpenBSD - -[ELinks/0.9* (*OS/2*)] -Parent=ELinks 0.9 -Platform=OS/2 - -[ELinks/0.9* (*RISC*)] -Parent=ELinks 0.9 -Platform=RISC OS - -[ELinks/0.9* (*Solaris*)] -Parent=ELinks 0.9 -Platform=Solaris - -[ELinks/0.9* (*Unix*)] -Parent=ELinks 0.9 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AppleWebKit - -[AppleWebKit] -Parent=DefaultProperties -Browser=AppleWebKit -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (KHTML, like Gecko)] -Parent=AppleWebKit - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Camino - -[Camino] -Parent=DefaultProperties -Browser=Camino -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.7*] -Parent=Camino -Version=0.7 -MajorVer=0 -MinorVer=7 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.8*] -Parent=Camino -Version=0.8 -MajorVer=0 -MinorVer=8 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.9*] -Parent=Camino -Version=0.9 -MajorVer=0 -MinorVer=9 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.0*] -Parent=Camino -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.2*] -Parent=Camino -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.3*] -Parent=Camino -Version=1.3 -MajorVer=1 -MinorVer=3 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.4*] -Parent=Camino -Version=1.4 -MajorVer=1 -MinorVer=4 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.5*] -Parent=Camino -Version=1.5 -MajorVer=1 -MinorVer=5 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.6*] -Parent=Camino -Version=1.6 -MajorVer=1 -MinorVer=6 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chimera - -[Chimera] -Parent=DefaultProperties -Browser=Chimera -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Chimera/*] -Parent=Chimera -Platform=MacOSX - -[Mozilla/5.0 Gecko/* Chimera/*] -Parent=Chimera - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Dillo - -[Dillo] -Parent=DefaultProperties -Browser=Dillo -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -CssVersion=2 -supportsCSS=true - -[Dillo/0.6*] -Parent=Dillo -Version=0.6 -MajorVer=0 -MinorVer=6 - -[Dillo/0.7*] -Parent=Dillo -Version=0.7 -MajorVer=0 -MinorVer=7 - -[Dillo/0.8*] -Parent=Dillo -Version=0.8 -MajorVer=0 -MinorVer=8 - -[Dillo/2.0] -Parent=Dillo -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Emacs/W3 - -[Emacs/W3] -Parent=DefaultProperties -Browser=Emacs/W3 -Frames=true -Tables=true -Cookies=true - -[Emacs/W3/2.* (Unix*] -Parent=Emacs/W3 -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Unix - -[Emacs/W3/2.* (X11*] -Parent=Emacs/W3 -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Linux - -[Emacs/W3/3.* (Unix*] -Parent=Emacs/W3 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Unix - -[Emacs/W3/3.* (X11*] -Parent=Emacs/W3 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Linux - -[Emacs/W3/4.* (Unix*] -Parent=Emacs/W3 -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Unix - -[Emacs/W3/4.* (X11*] -Parent=Emacs/W3 -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; fantomas - -[fantomas] -Parent=DefaultProperties -Browser=fantomas -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/4.0 (cloakBrowser)] -Parent=fantomas -Browser=fantomas cloakBrowser - -[Mozilla/4.0 (fantomas shadowMaker Browser)] -Parent=fantomas -Browser=fantomas shadowMaker Browser - -[Mozilla/4.0 (fantomBrowser)] -Parent=fantomas -Browser=fantomas fantomBrowser - -[Mozilla/4.0 (fantomCrew Browser)] -Parent=fantomas -Browser=fantomas fantomCrew Browser - -[Mozilla/4.0 (stealthBrowser)] -Parent=fantomas -Browser=fantomas stealthBrowser - -[multiBlocker browser*] -Parent=fantomas -Browser=fantomas multiBlocker browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FrontPage - -[FrontPage] -Parent=DefaultProperties -Browser=FrontPage -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/?* (compatible; MS FrontPage*)] -Parent=FrontPage - -[MSFrontPage/*] -Parent=FrontPage - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Galeon - -[Galeon] -Parent=DefaultProperties -Browser=Galeon -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/1.*] -Parent=Galeon -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/2.*] -Parent=Galeon -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 Galeon/1.* (X11; Linux*)*] -Parent=Galeon -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 Galeon/2.* (X11; Linux*)*] -Parent=Galeon -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HP Secure Web Browser - -[HP Secure Web Browser] -Parent=DefaultProperties -Browser=HP Secure Web Browser -Platform=OpenVMS -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.0*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.1*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.2*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.3*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.4*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.4 -MajorVer=1 -MinorVer=4 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.5*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.5 -MajorVer=1 -MinorVer=5 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.6*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.6 -MajorVer=1 -MinorVer=6 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.7*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.7 -MajorVer=1 -MinorVer=7 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.8*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.8 -MajorVer=1 -MinorVer=8 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IBrowse - -[IBrowse] -Parent=DefaultProperties -Browser=IBrowse -Platform=Amiga -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Arexx (compatible; MSIE 6.0; AmigaOS5.0) IBrowse 4.0] -Parent=IBrowse -Version=4.0 -MajorVer=4 -MinorVer=0 - -[IBrowse/1.22 (AmigaOS *)] -Parent=IBrowse -Version=1.22 -MajorVer=1 -MinorVer=22 - -[IBrowse/2.1 (AmigaOS *)] -Parent=IBrowse -Version=2.1 -MajorVer=2 -MinorVer=1 - -[IBrowse/2.2 (AmigaOS *)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=2 - -[IBrowse/2.3 (AmigaOS *)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=3 - -[Mozilla/* (Win98; I) IBrowse/2.1 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/* (Win98; I) IBrowse/2.2 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Mozilla/* (Win98; I) IBrowse/2.3 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.3 -MajorVer=2 -MinorVer=3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iCab - -[iCab] -Parent=DefaultProperties -Browser=iCab -Frames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[iCab/2.7* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=Mac68K - -[iCab/2.7* (Macintosh; ?; PPC*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=MacPPC - -[iCab/2.8* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacOSX - -[iCab/2.8* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=Mac68K - -[iCab/2.8* (Macintosh; ?; PPC)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacPPC - -[iCab/2.9* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacOSX - -[iCab/2.9* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=Mac68K - -[iCab/2.9* (Macintosh; ?; PPC*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacPPC - -[iCab/3.0* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[iCab/3.0* (Macintosh; ?; PPC*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacPPC -CssVersion=2 -supportsCSS=true - -[iCab/4.0 (Macintosh; U; *Mac OS X)] -Parent=iCab -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (compatible; iCab 3.0*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; iCab 3.0*; Macintosh; ?; PPC*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacPPC -CssVersion=2 -supportsCSS=true - -[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; 68K*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=Mac68K - -[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacOSX - -[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacOSX - -[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 4.2*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iSiloX - -[iSiloX] -Parent=DefaultProperties -Browser=iSiloX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -Crawler=true -CssVersion=2 -supportsCSS=true - -[iSiloX/4.0* MacOS] -Parent=iSiloX -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacPPC - -[iSiloX/4.0* Windows/32] -Parent=iSiloX -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Win32 -Win32=true - -[iSiloX/4.1* MacOS] -Parent=iSiloX -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=MacPPC - -[iSiloX/4.1* Windows/32] -Parent=iSiloX -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=Win32 -Win32=true - -[iSiloX/4.2* MacOS] -Parent=iSiloX -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=MacPPC - -[iSiloX/4.2* Windows/32] -Parent=iSiloX -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=Win32 -Win32=true - -[iSiloX/4.3* MacOS] -Parent=iSiloX -Version=4.3 -MajorVer=4 -MinorVer=4 -Platform=MacOSX - -[iSiloX/4.3* Windows/32] -Parent=iSiloX -Version=4.3 -MajorVer=4 -MinorVer=3 -Platform=Win32 -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycoris Desktop/LX - -[Lycoris Desktop/LX] -Parent=DefaultProperties -Browser=Lycoris Desktop/LX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -Crawler=true - -[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*: Desktop/LX Amethyst) Gecko/*] -Parent=Lycoris Desktop/LX -Version=1.1 -MajorVer=1 -MinorVer=1 -Platform=Linux - -[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*; Desktop/LX Amethyst) Gecko/*] -Parent=Lycoris Desktop/LX -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mosaic - -[Mosaic] -Parent=DefaultProperties -Browser=Mosaic -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[Mozilla/4.0 (VMS_Mosaic)] -Parent=Mosaic -Platform=OpenVMS - -[VMS_Mosaic/3.7*] -Parent=Mosaic -Version=3.7 -MajorVer=3 -MinorVer=7 -Platform=OpenVMS - -[VMS_Mosaic/3.8*] -Parent=Mosaic -Version=3.8 -MajorVer=3 -MinorVer=8 -Platform=OpenVMS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetPositive - -[NetPositive] -Parent=DefaultProperties -Browser=NetPositive -Platform=BeOS -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[*NetPositive/2.2*] -Parent=NetPositive -Version=2.2 -MajorVer=2 -MinorVer=2 - -[*NetPositive/2.2*BeOS*] -Parent=NetPositive -Version=2.2 -MajorVer=2 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OmniWeb - -[OmniWeb] -Parent=DefaultProperties -Browser=OmniWeb -Platform=MacOSX -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v4*] -Parent=OmniWeb -Version=4.5 -MajorVer=4 -MinorVer=5 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v5*] -Parent=OmniWeb -Version=5. -MajorVer=5 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v6*] -Parent=OmniWeb -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/4*] -Parent=OmniWeb -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacPPC - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/5*] -Parent=OmniWeb -Version=5.0 -MajorVer=5 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/6*] -Parent=OmniWeb -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=MacPPC - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.34] -Parent=OmniWeb -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.34] -Parent=OmniWeb -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v607] -Parent=OmniWeb -Version=5.5 -MajorVer=5 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v607] -Parent=OmniWeb -Version=5.5 -MajorVer=5 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/522+ (KHTML, like Gecko, Safari/522) OmniWeb/v613] -Parent=OmniWeb -Version=5.6 -MajorVer=5 -MinorVer=6 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/522+ (KHTML, like Gecko, Safari/522) OmniWeb/v613] -Parent=OmniWeb -Version=5.6 -MajorVer=5 -MinorVer=6 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v496] -Parent=OmniWeb -Version=4.5 -MajorVer=4 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558.36 ] -Parent=OmniWeb -Version=5.0 -MajorVer=5 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Shiira - -[Shiira] -Parent=DefaultProperties -Browser=Shiira -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/0.9*] -Parent=Shiira -Version=0.9 -MajorVer=0 -MinorVer=9 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.0*] -Parent=Shiira -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.1*] -Parent=Shiira -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.2*] -Parent=Shiira -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/2.1*] -Parent=Shiira -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/2.2*] -Parent=Shiira -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Windows Maker] -Parent=DefaultProperties -Browser=WMaker -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -VBScript=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[WMaker*] -Parent=Windows Maker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.0 - -[K-Meleon 1.0] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.0 -MajorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.1 - -[K-Meleon 1.1] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.1 -MajorVer=1 -MinorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.5 - -[K-Meleon 1.5] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.5 -MajorVer=1 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Platform=WinVista - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 3.0 - -[Konqueror 3.0] -Parent=DefaultProperties -Browser=Konqueror -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[*Konqueror/3.0*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -IFrames=false - -[*Konqueror/3.0*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=FreeBSD -IFrames=false - -[*Konqueror/3.0*Linux*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Linux -IFrames=false - -[*Konqueror/3.1*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 - -[*Konqueror/3.1*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 -Platform=FreeBSD - -[*Konqueror/3.1*Linux*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 - -[*Konqueror/3.2*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 - -[*Konqueror/3.2*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 -Platform=FreeBSD - -[*Konqueror/3.2*Linux*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 -Platform=Linux - -[*Konqueror/3.3*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 - -[*Konqueror/3.3*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=FreeBSD - -[*Konqueror/3.3*Linux*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=Linux - -[*Konqueror/3.3*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=OpenBSD - -[*Konqueror/3.4*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 - -[*Konqueror/3.4*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=FreeBSD - -[*Konqueror/3.4*Linux*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=Linux - -[*Konqueror/3.4*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=OpenBSD - -[*Konqueror/3.5*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 - -[*Konqueror/3.5*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=FreeBSD - -[*Konqueror/3.5*Linux*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=Linux - -[*Konqueror/3.5*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=OpenBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.0 - -[Konqueror 4.0] -Parent=DefaultProperties -Browser=Konqueror -Version=4.0 -MajorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.0*; Debian) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; *Linux) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; FreeBSD) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; NetBSD) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.1 - -[Konqueror 4.1] -Parent=DefaultProperties -Browser=Konqueror -Version=4.1 -MajorVer=4 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.1*; *Linux*) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.1*; Debian) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.1*; FreeBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.1*; NetBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.2 - -[Konqueror 4.2] -Parent=DefaultProperties -Browser=Konqueror -Version=4.2 -MajorVer=4 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.2*; *Linux*) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.2*; Debian) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.2*; FreeBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.2*; NetBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari - -[Safari] -Parent=DefaultProperties -Browser=Safari -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/100*] -Parent=Safari -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/125*] -Parent=Safari -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/312*] -Parent=Safari -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/412*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/416*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/417*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/418*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/419*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/52*] -Parent=Safari -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/85*] -Parent=Safari -Version=1.0 -MajorVer=1 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.0 - -[Safari 3.0] -Parent=DefaultProperties -Browser=Safari -Version=3.0 -MajorVer=3 -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.1 - -[Safari 3.1] -Parent=DefaultProperties -Browser=Safari -Version=3.1 -MajorVer=3 -MinorVer=1 -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.2 - -[Safari 3.2] -Parent=DefaultProperties -Browser=Safari -Version=3.2 -MajorVer=3 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 4.0 - -[Safari 4.0] -Parent=DefaultProperties -Browser=Safari -Version=4.0 -MajorVer=4 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *) AppleWebKit/* (KHTML, like Gecko) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *) AppleWebKit/* (KHTML, like Gecko) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 7.0; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 7.0; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 10.0 - -[Opera 10.0] -Parent=DefaultProperties -Browser=Opera -Version=10.0 -MajorVer=10 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 10.0*] -Parent=Opera 10.0 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 10.0*] -Parent=Opera 10.0 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (Linux*)*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (Macintosh; *Mac OS X;*)*] -Parent=Opera 10.0 -Platform=MacOSX - -[Opera/10.0* (Windows 95*)*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Opera/10.0* (Windows 98*)*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Opera/10.0* (Windows CE*)*] -Parent=Opera 10.0 -Platform=WinCE -Win32=true - -[Opera/10.0* (Windows ME*)*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Opera/10.0* (Windows NT 4.0*)*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Opera/10.0* (Windows NT 5.0*)*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Opera/10.0* (Windows NT 5.1*)*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Opera/10.0* (Windows NT 5.2*)*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Opera/10.0* (Windows NT 6.0*)*] -Parent=Opera 10.0 -Platform=WinVista -Win32=true - -[Opera/10.0* (Windows NT 6.1*)*] -Parent=Opera 10.0 -Platform=Win7 - -[Opera/10.0* (Windows XP*)*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Opera/10.0* (X11; FreeBSD*)*] -Parent=Opera 10.0 -Platform=FreeBSD - -[Opera/10.0* (X11; Linux*)*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (X11; SunOS*)*] -Parent=Opera 10.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.0 - -[Opera 7.0] -Parent=DefaultProperties -Browser=Opera -Version=7.0 -MajorVer=7 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/3.0 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/3.0 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/3.0 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/3.0 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/3.0 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/3.0 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 2000) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 95) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 98) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows ME) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 4.0) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.0) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows XP) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.78 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.78 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/4.78 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/4.78 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/4.78 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/4.78 (Windows NT 5.1; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.78 (Windows Windows NT 5.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.78 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows NT 5.1; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Opera/7.0* (Windows 2000; ?)*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Opera/7.0* (Windows 95; ?)*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Opera/7.0* (Windows 98; ?)*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Opera/7.0* (Windows ME; ?)*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Opera/7.0* (Windows NT 4.0; ?)*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Opera/7.0* (Windows NT 5.0; ?)*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Opera/7.0* (Windows NT 5.1; ?)*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Opera/7.0* (Windows XP; ?)*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.1 - -[Opera 7.1] -Parent=DefaultProperties -Browser=Opera -Version=7.1 -MajorVer=7 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows 2000; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Opera/7.1* (Linux*; ?)*] -Parent=Opera 7.1 -Platform=Linux - -[Opera/7.1* (Windows 95; ?)*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Opera/7.1* (Windows 98; ?)*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Opera/7.1* (Windows ME; ?)*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Opera/7.1* (Windows NT 4.0; ?)*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Opera/7.1* (Windows NT 5.0; ?)*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Opera/7.1* (Windows NT 5.1; ?)*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Opera/7.1* (Windows XP; ?)*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.2 - -[Opera 7.2] -Parent=DefaultProperties -Browser=Opera -Version=7.2 -MajorVer=7 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.2*] -Parent=Opera 7.2 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows 2000; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Opera/7.2* (Linux*; ?)*] -Parent=Opera 7.2 -Platform=Linux - -[Opera/7.2* (Windows 95; ?)*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Opera/7.2* (Windows 98; ?)*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Opera/7.2* (Windows ME; ?)*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Opera/7.2* (Windows NT 4.0; ?)*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Opera/7.2* (Windows NT 5.0; ?)*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Opera/7.2* (Windows NT 5.1; ?)*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Opera/7.2* (Windows NT 5.2; ?)*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Opera/7.2* (Windows XP; ?)*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Opera/7.2* (X11; FreeBSD*; ?)*] -Parent=Opera 7.2 -Platform=FreeBSD - -[Opera/7.2* (X11; Linux*; ?)*] -Parent=Opera 7.2 -Platform=Linux - -[Opera/7.2* (X11; SunOS*)*] -Parent=Opera 7.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.5 - -[Opera 7.5] -Parent=DefaultProperties -Browser=Opera -Version=7.5 -MajorVer=7 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.5*] -Parent=Opera 7.5 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Opera/7.5* (Linux*; ?)*] -Parent=Opera 7.5 -Platform=Linux - -[Opera/7.5* (Macintosh; *Mac OS X; ?)*] -Parent=Opera 7.5 -Platform=MacOSX - -[Opera/7.5* (Windows 95; ?)*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Opera/7.5* (Windows 98; ?)*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Opera/7.5* (Windows ME; ?)*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Opera/7.5* (Windows NT 4.0; ?)*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Opera/7.5* (Windows NT 5.0; ?)*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Opera/7.5* (Windows NT 5.1; ?)*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Opera/7.5* (Windows NT 5.2; ?)*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Opera/7.5* (Windows XP; ?)*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Opera/7.5* (X11; FreeBSD*; ?)*] -Parent=Opera 7.5 -Platform=FreeBSD - -[Opera/7.5* (X11; Linux*; ?)*] -Parent=Opera 7.5 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.6 - -[Opera 7.6] -Parent=DefaultProperties -Browser=Opera -Version=7.6 -MajorVer=7 -MinorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.6*] -Parent=Opera 7.6 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Opera/7.6* (Linux*)*] -Parent=Opera 7.6 -Platform=Linux - -[Opera/7.6* (Macintosh; *Mac OS X; ?)*] -Parent=Opera 7.6 -Platform=MacOSX - -[Opera/7.6* (Windows 95*)*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Opera/7.6* (Windows 98*)*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Opera/7.6* (Windows ME*)*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Opera/7.6* (Windows NT 4.0*)*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Opera/7.6* (Windows NT 5.0*)*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Opera/7.6* (Windows NT 5.1*)*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Opera/7.6* (Windows NT 5.2*)*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Opera/7.6* (Windows XP*)*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Opera/7.6* (X11; FreeBSD*)*] -Parent=Opera 7.6 -Platform=FreeBSD - -[Opera/7.6* (X11; Linux*)*] -Parent=Opera 7.6 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.0 - -[Opera 8.0] -Parent=DefaultProperties -Browser=Opera -Version=8.0 -MajorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacOSX - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.0*] -Parent=Opera 8.0 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Opera/8.0* (Linux*)*] -Parent=Opera 8.0 -Platform=Linux - -[Opera/8.0* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.0 -Platform=MacOSX - -[Opera/8.0* (Windows 95*)*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Opera/8.0* (Windows 98*)*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Opera/8.0* (Windows CE*)*] -Parent=Opera 8.0 -Platform=WinCE -Win32=true - -[Opera/8.0* (Windows ME*)*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Opera/8.0* (Windows NT 4.0*)*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Opera/8.0* (Windows NT 5.0*)*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Opera/8.0* (Windows NT 5.1*)*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Opera/8.0* (Windows NT 5.2*)*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Opera/8.0* (Windows XP*)*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Opera/8.0* (X11; FreeBSD*)*] -Parent=Opera 8.0 -Platform=FreeBSD - -[Opera/8.0* (X11; Linux*)*] -Parent=Opera 8.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.1 - -[Opera 8.1] -Parent=DefaultProperties -Browser=Opera -Version=8.1 -MajorVer=8 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.1*] -Parent=Opera 8.1 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.1*] -Parent=Opera 8.1 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.1*] -Parent=Opera 8.1 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Opera/8.1* (Linux*)*] -Parent=Opera 8.1 -Platform=Linux - -[Opera/8.1* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.1 -Platform=MacOSX - -[Opera/8.1* (Windows 95*)*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Opera/8.1* (Windows 98*)*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Opera/8.1* (Windows CE*)*] -Parent=Opera 8.1 -Platform=WinCE -Win32=true - -[Opera/8.1* (Windows ME*)*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Opera/8.1* (Windows NT 4.0*)*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Opera/8.1* (Windows NT 5.0*)*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Opera/8.1* (Windows NT 5.1*)*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Opera/8.1* (Windows NT 5.2*)*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Opera/8.1* (Windows XP*)*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Opera/8.1* (X11; FreeBSD*)*] -Parent=Opera 8.1 -Platform=FreeBSD - -[Opera/8.1* (X11; Linux*)*] -Parent=Opera 8.1 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.5 - -[Opera 8.5] -Parent=DefaultProperties -Browser=Opera -Version=8.5 -MajorVer=8 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X;*) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.5*] -Parent=Opera 8.5 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (Macintosh; PPC Mac OS X;*) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Opera/8.5* (Linux*)*] -Parent=Opera 8.5 -Platform=Linux - -[Opera/8.5* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.5 -Platform=MacOSX - -[Opera/8.5* (Windows 95*)*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Opera/8.5* (Windows 98*)*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Opera/8.5* (Windows CE*)*] -Parent=Opera 8.5 -Platform=WinCE -Win32=true - -[Opera/8.5* (Windows ME*)*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Opera/8.5* (Windows NT 4.0*)*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Opera/8.5* (Windows NT 5.0*)*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Opera/8.5* (Windows NT 5.1*)*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Opera/8.5* (Windows NT 5.2*)*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Opera/8.5* (Windows XP*)*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Opera/8.5* (X11; FreeBSD*)*] -Parent=Opera 8.5 -Platform=FreeBSD - -[Opera/8.5* (X11; Linux*)*] -Parent=Opera 8.5 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.0 - -[Opera 9.0] -Parent=DefaultProperties -Browser=Opera -Version=9.0 -MajorVer=9 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.0*] -Parent=Opera 9.0 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.0*] -Parent=Opera 9.0 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (X11; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Opera/9.0* (Linux*)*] -Parent=Opera 9.0 -Platform=Linux - -[Opera/9.0* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.0 -Platform=MacOSX - -[Opera/9.0* (Windows 95*)*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Opera/9.0* (Windows 98*)*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Opera/9.0* (Windows CE*)*] -Parent=Opera 9.0 -Platform=WinCE -Win32=true - -[Opera/9.0* (Windows ME*)*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Opera/9.0* (Windows NT 4.0*)*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Opera/9.0* (Windows NT 5.0*)*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Opera/9.0* (Windows NT 5.1*)*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Opera/9.0* (Windows NT 5.2*)*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Opera/9.0* (Windows NT 6.0*)*] -Parent=Opera 9.0 -Platform=WinVista -Win32=true - -[Opera/9.0* (Windows XP*)*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Opera/9.0* (X11; FreeBSD*)*] -Parent=Opera 9.0 -Platform=FreeBSD - -[Opera/9.0* (X11; Linux*)*] -Parent=Opera 9.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.1 - -[Opera 9.1] -Parent=DefaultProperties -Browser=Opera -Version=9.1 -MajorVer=9 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.1*] -Parent=Opera 9.1 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.1*] -Parent=Opera 9.1 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Mozilla/* (X11; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (Linux*)*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.1 -Platform=MacOSX - -[Opera/9.1* (Windows 95*)*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Opera/9.1* (Windows 98*)*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Opera/9.1* (Windows CE*)*] -Parent=Opera 9.1 -Platform=WinCE -Win32=true - -[Opera/9.1* (Windows ME*)*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Opera/9.1* (Windows NT 4.0*)*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Opera/9.1* (Windows NT 5.0*)*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Opera/9.1* (Windows NT 5.1*)*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Opera/9.1* (Windows NT 5.2*)*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Opera/9.1* (Windows NT 6.0*)*] -Parent=Opera 9.1 -Platform=WinVista -Win32=true - -[Opera/9.1* (Windows XP*)*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Opera/9.1* (X11; FreeBSD*)*] -Parent=Opera 9.1 -Platform=FreeBSD - -[Opera/9.1* (X11; Linux*)*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (X11; SunOS*)*] -Parent=Opera 9.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.2 - -[Opera 9.2] -Parent=DefaultProperties -Browser=Opera -Version=9.2 -MajorVer=9 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.2*] -Parent=Opera 9.2 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.2*] -Parent=Opera 9.2 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (Linux*)*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.2 -Platform=MacOSX - -[Opera/9.2* (Windows 95*)*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Opera/9.2* (Windows 98*)*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Opera/9.2* (Windows CE*)*] -Parent=Opera 9.2 -Platform=WinCE -Win32=true - -[Opera/9.2* (Windows ME*)*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Opera/9.2* (Windows NT 4.0*)*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Opera/9.2* (Windows NT 5.0*)*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Opera/9.2* (Windows NT 5.1*)*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Opera/9.2* (Windows NT 5.2*)*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Opera/9.2* (Windows NT 6.0*)*] -Parent=Opera 9.2 -Platform=WinVista -Win32=true - -[Opera/9.2* (Windows NT 6.1*)*] -Parent=Opera 9.2 -Platform=Win7 - -[Opera/9.2* (Windows XP*)*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Opera/9.2* (X11; FreeBSD*)*] -Parent=Opera 9.2 -Platform=FreeBSD - -[Opera/9.2* (X11; Linux*)*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (X11; SunOS*)*] -Parent=Opera 9.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.3 - -[Opera 9.3] -Parent=DefaultProperties -Browser=Opera -Version=9.3 -MajorVer=9 -MinorVer=3 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.3*] -Parent=Opera 9.3 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.3*] -Parent=Opera 9.3 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (Linux*)*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.3 -Platform=MacOSX - -[Opera/9.3* (Windows 95*)*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Opera/9.3* (Windows 98*)*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Opera/9.3* (Windows CE*)*] -Parent=Opera 9.3 -Platform=WinCE -Win32=true - -[Opera/9.3* (Windows ME*)*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Opera/9.3* (Windows NT 4.0*)*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Opera/9.3* (Windows NT 5.0*)*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Opera/9.3* (Windows NT 5.1*)*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Opera/9.3* (Windows NT 5.2*)*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Opera/9.3* (Windows NT 6.0*)*] -Parent=Opera 9.3 -Platform=WinVista -Win32=true - -[Opera/9.3* (Windows NT 6.1*)*] -Parent=Opera 9.3 -Platform=Win7 - -[Opera/9.3* (Windows XP*)*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Opera/9.3* (X11; FreeBSD*)*] -Parent=Opera 9.3 -Platform=FreeBSD - -[Opera/9.3* (X11; Linux*)*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (X11; SunOS*)*] -Parent=Opera 9.3 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.4 - -[Opera 9.4] -Parent=DefaultProperties -Browser=Opera -Version=9.4 -MajorVer=9 -MinorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.4*] -Parent=Opera 9.4 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.4*] -Parent=Opera 9.4 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (Linux*)*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.4 -Platform=MacOSX - -[Opera/9.4* (Windows 95*)*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Opera/9.4* (Windows 98*)*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Opera/9.4* (Windows CE*)*] -Parent=Opera 9.4 -Platform=WinCE -Win32=true - -[Opera/9.4* (Windows ME*)*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Opera/9.4* (Windows NT 4.0*)*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Opera/9.4* (Windows NT 5.0*)*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Opera/9.4* (Windows NT 5.1*)*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Opera/9.4* (Windows NT 5.2*)*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Opera/9.4* (Windows NT 6.0*)*] -Parent=Opera 9.4 -Platform=WinVista -Win32=true - -[Opera/9.4* (Windows NT 6.1*)*] -Parent=Opera 9.4 -Platform=Win7 - -[Opera/9.4* (Windows XP*)*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Opera/9.4* (X11; FreeBSD*)*] -Parent=Opera 9.4 -Platform=FreeBSD - -[Opera/9.4* (X11; Linux*)*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (X11; SunOS*)*] -Parent=Opera 9.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.5 - -[Opera 9.5] -Parent=DefaultProperties -Browser=Opera -Version=9.5 -MajorVer=9 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.5*] -Parent=Opera 9.5 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.5*] -Parent=Opera 9.5 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (Linux*)*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.5 -Platform=MacOSX - -[Opera/9.5* (Windows 95*)*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Opera/9.5* (Windows 98*)*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Opera/9.5* (Windows CE*)*] -Parent=Opera 9.5 -Platform=WinCE -Win32=true - -[Opera/9.5* (Windows ME*)*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Opera/9.5* (Windows NT 4.0*)*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Opera/9.5* (Windows NT 5.0*)*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Opera/9.5* (Windows NT 5.1*)*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Opera/9.5* (Windows NT 5.2*)*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Opera/9.5* (Windows NT 6.0*)*] -Parent=Opera 9.5 -Platform=WinVista -Win32=true - -[Opera/9.5* (Windows NT 6.1*)*] -Parent=Opera 9.5 -Platform=Win7 - -[Opera/9.5* (Windows XP*)*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Opera/9.5* (X11; FreeBSD*)*] -Parent=Opera 9.5 -Platform=FreeBSD - -[Opera/9.5* (X11; Linux*)*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (X11; SunOS*)*] -Parent=Opera 9.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.6 - -[Opera 9.6] -Parent=DefaultProperties -Browser=Opera -Version=9.6 -MajorVer=9 -MinorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.6*] -Parent=Opera 9.6 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.6*] -Parent=Opera 9.6 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (Linux*)*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.6 -Platform=MacOSX - -[Opera/9.6* (Windows 95*)*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Opera/9.6* (Windows 98*)*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Opera/9.6* (Windows CE*)*] -Parent=Opera 9.6 -Platform=WinCE -Win32=true - -[Opera/9.6* (Windows ME*)*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Opera/9.6* (Windows NT 4.0*)*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Opera/9.6* (Windows NT 5.0*)*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Opera/9.6* (Windows NT 5.1*)*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Opera/9.6* (Windows NT 5.2*)*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Opera/9.6* (Windows NT 6.0*)*] -Parent=Opera 9.6 -Platform=WinVista -Win32=true - -[Opera/9.6* (Windows NT 6.1*)*] -Parent=Opera 9.6 -Platform=Win7 - -[Opera/9.6* (Windows XP*)*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Opera/9.6* (X11; FreeBSD*)*] -Parent=Opera 9.6 -Platform=FreeBSD - -[Opera/9.6* (X11; Linux*)*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (X11; SunOS*)*] -Parent=Opera 9.6 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.0 - -[Netscape 4.0] -Parent=DefaultProperties -Browser=Netscape -Version=4.0 -MajorVer=4 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0*(Macintosh*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=MacPPC - -[Mozilla/4.0*(Win95;*] -Parent=Netscape 4.0 -Platform=Win95 - -[Mozilla/4.0*(Win98;*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=Win98 - -[Mozilla/4.0*(WinNT*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=WinNT - -[Mozilla/4.0*(X11;*)] -Parent=Netscape 4.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.5 - -[Netscape 4.5] -Parent=DefaultProperties -Browser=Netscape -Version=4.5 -MajorVer=4 -MinorVer=5 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.5*(Macintosh; ?; PPC)] -Parent=Netscape 4.5 -Platform=MacPPC - -[Mozilla/4.5*(Win2000; ?)] -Parent=Netscape 4.5 -Platform=Win2000 - -[Mozilla/4.5*(Win95; ?)] -Parent=Netscape 4.5 -Platform=Win95 - -[Mozilla/4.5*(Win98; ?)] -Parent=Netscape 4.5 -Platform=Win98 - -[Mozilla/4.5*(WinME; ?)] -Parent=Netscape 4.5 -Platform=WinME - -[Mozilla/4.5*(WinNT; ?)] -Parent=Netscape 4.5 -Platform=WinNT - -[Mozilla/4.5*(WinXP; ?)] -Parent=Netscape 4.5 -Platform=WinXP - -[Mozilla/4.5*(X11*)] -Parent=Netscape 4.5 -Platform=Linux - -[Mozilla/4.51*(Macintosh; ?; PPC)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 - -[Mozilla/4.51*(Win2000; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win2000 - -[Mozilla/4.51*(Win95; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win95 - -[Mozilla/4.51*(Win98; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win98 - -[Mozilla/4.51*(WinME; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinME - -[Mozilla/4.51*(WinNT; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinNT - -[Mozilla/4.51*(WinXP; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinXP - -[Mozilla/4.51*(X11*)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.6 - -[Netscape 4.6] -Parent=DefaultProperties -Browser=Netscape -Version=4.6 -MajorVer=4 -MinorVer=6 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.6 * (OS/2; ?)] -Parent=Netscape 4.6 -Platform=OS/2 - -[Mozilla/4.6*(Macintosh; ?; PPC)] -Parent=Netscape 4.6 -Platform=MacPPC - -[Mozilla/4.6*(Win95; ?)] -Parent=Netscape 4.6 -Platform=Win95 - -[Mozilla/4.6*(Win98; ?)] -Parent=Netscape 4.6 -Platform=Win98 - -[Mozilla/4.6*(WinNT; ?)] -Parent=Netscape 4.6 -Platform=WinNT - -[Mozilla/4.61*(Macintosh; ?; PPC)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=MacPPC - -[Mozilla/4.61*(OS/2; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=OS/2 - -[Mozilla/4.61*(Win95; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=Win95 - -[Mozilla/4.61*(Win98; ?)] -Parent=Netscape 4.6 -Version=4.61 -Platform=Win98 - -[Mozilla/4.61*(WinNT; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=WinNT - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.7 - -[Netscape 4.7] -Parent=DefaultProperties -Browser=Netscape -Version=4.7 -MajorVer=4 -MinorVer=7 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.7 * (Win2000; ?)] -Parent=Netscape 4.7 -Platform=Win2000 - -[Mozilla/4.7*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=MacPPC - -[Mozilla/4.7*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win95 - -[Mozilla/4.7*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win98 - -[Mozilla/4.7*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=WinNT -Win32=true - -[Mozilla/4.7*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win2000 -Win32=true - -[Mozilla/4.7*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=WinXP -Win32=true - -[Mozilla/4.7*(WinNT; ?)*] -Parent=Netscape 4.7 -Platform=WinNT - -[Mozilla/4.7*(X11*)*] -Parent=Netscape 4.7 -Platform=Linux - -[Mozilla/4.7*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Platform=SunOS - -[Mozilla/4.71*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=MacPPC - -[Mozilla/4.71*(Win95; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win95 - -[Mozilla/4.71*(Win98; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win98 - -[Mozilla/4.71*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinNT -Win32=true - -[Mozilla/4.71*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win2000 -Win32=true - -[Mozilla/4.71*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinXP -Win32=true - -[Mozilla/4.71*(WinNT; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinNT - -[Mozilla/4.71*(X11*)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Linux - -[Mozilla/4.71*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=SunOS - -[Mozilla/4.72*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=MacPPC - -[Mozilla/4.72*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win95 - -[Mozilla/4.72*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win98 - -[Mozilla/4.72*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinNT -Win32=true - -[Mozilla/4.72*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win2000 -Win32=true - -[Mozilla/4.72*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinXP -Win32=true - -[Mozilla/4.72*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinNT - -[Mozilla/4.72*(X11*)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Linux - -[Mozilla/4.72*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=SunOS - -[Mozilla/4.73*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=MacPPC - -[Mozilla/4.73*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win95 - -[Mozilla/4.73*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win98 - -[Mozilla/4.73*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinNT -Win32=true - -[Mozilla/4.73*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win2000 -Win32=true - -[Mozilla/4.73*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinXP -Win32=true - -[Mozilla/4.73*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinNT - -[Mozilla/4.73*(X11*)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Linux - -[Mozilla/4.73*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=SunOS - -[Mozilla/4.74*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=MacPPC - -[Mozilla/4.74*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win95 - -[Mozilla/4.74*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win98 - -[Mozilla/4.74*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinNT -Win32=true - -[Mozilla/4.74*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win2000 -Win32=true - -[Mozilla/4.74*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinXP -Win32=true - -[Mozilla/4.74*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinNT - -[Mozilla/4.74*(X11*)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Linux - -[Mozilla/4.74*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=SunOS - -[Mozilla/4.75*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=MacPPC - -[Mozilla/4.75*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win95 - -[Mozilla/4.75*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win98 - -[Mozilla/4.75*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinNT -Win32=true - -[Mozilla/4.75*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win2000 -Win32=true - -[Mozilla/4.75*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinXP -Win32=true - -[Mozilla/4.75*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinNT - -[Mozilla/4.75*(X11*)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Linux - -[Mozilla/4.75*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=SunOS - -[Mozilla/4.76*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=MacPPC - -[Mozilla/4.76*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win95 - -[Mozilla/4.76*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win98 - -[Mozilla/4.76*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinNT -Win32=true - -[Mozilla/4.76*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win2000 -Win32=true - -[Mozilla/4.76*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinXP -Win32=true - -[Mozilla/4.76*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinNT - -[Mozilla/4.76*(X11*)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Linux - -[Mozilla/4.76*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=SunOS - -[Mozilla/4.77*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=MacPPC - -[Mozilla/4.77*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win95 - -[Mozilla/4.77*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win98 - -[Mozilla/4.77*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinNT -Win32=true - -[Mozilla/4.77*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win2000 -Win32=true - -[Mozilla/4.77*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinXP -Win32=true - -[Mozilla/4.77*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinNT - -[Mozilla/4.77*(X11*)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Linux - -[Mozilla/4.77*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=SunOS - -[Mozilla/4.78*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=MacPPC - -[Mozilla/4.78*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win95 - -[Mozilla/4.78*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win98 - -[Mozilla/4.78*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinNT -Win32=true - -[Mozilla/4.78*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win2000 -Win32=true - -[Mozilla/4.78*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinXP -Win32=true - -[Mozilla/4.78*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinNT - -[Mozilla/4.78*(X11*)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Linux - -[Mozilla/4.78*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=SunOS - -[Mozilla/4.79*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=MacPPC - -[Mozilla/4.79*(Win95; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win95 - -[Mozilla/4.79*(Win98; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win98 - -[Mozilla/4.79*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinNT -Win32=true - -[Mozilla/4.79*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win2000 -Win32=true - -[Mozilla/4.79*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinXP -Win32=true - -[Mozilla/4.79*(WinNT; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinNT - -[Mozilla/4.79*(X11*)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Linux - -[Mozilla/4.79*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.8 - -[Netscape 4.8] -Parent=DefaultProperties -Browser=Netscape -Version=4.8 -MajorVer=4 -MinorVer=8 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.8*(Macintosh; ?; MacPPC)*] -Parent=Netscape 4.8 -Platform=MacPPC - -[Mozilla/4.8*(Macintosh; ?; PPC Mac OS X*] -Parent=Netscape 4.8 -Platform=MacOSX - -[Mozilla/4.8*(Macintosh; ?; PPC)*] -Parent=Netscape 4.8 -Platform=MacPPC - -[Mozilla/4.8*(Win95; *)*] -Parent=Netscape 4.8 - -[Mozilla/4.8*(Win98; *)*] -Parent=Netscape 4.8 -Platform=Win98 - -[Mozilla/4.8*(Windows NT 4.0; *)*] -Parent=Netscape 4.8 -Platform=WinNT -Win32=true - -[Mozilla/4.8*(Windows NT 5.0; *)*] -Parent=Netscape 4.8 -Platform=Win2000 -Win32=true - -[Mozilla/4.8*(Windows NT 5.1; *)*] -Parent=Netscape 4.8 -Platform=WinXP -Win32=true - -[Mozilla/4.8*(WinNT; *)*] -Parent=Netscape 4.8 -Platform=WinNT - -[Mozilla/4.8*(X11; *)*] -Parent=Netscape 4.8 -Platform=Linux - -[Mozilla/4.8*(X11; *SunOS*)*] -Parent=Netscape 4.8 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.0 - -[Netscape 6.0] -Parent=DefaultProperties -Browser=Netscape -Version=6.0 -MajorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.1 - -[Netscape 6.1] -Parent=DefaultProperties -Browser=Netscape -Version=6.1 -MajorVer=6 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.2 - -[Netscape 6.2] -Parent=DefaultProperties -Browser=Netscape -Version=6.2 -MajorVer=6 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.0 - -[Netscape 7.0] -Parent=DefaultProperties -Browser=Netscape -Version=7.0 -MajorVer=7 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win*9x 4.90; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.1 - -[Netscape 7.1] -Parent=DefaultProperties -Browser=Netscape -Version=7.1 -MajorVer=7 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/7.1] -Parent=Netscape 7.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.2 - -[Netscape 7.2] -Parent=DefaultProperties -Browser=Netscape -Version=7.2 -MajorVer=7 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 8.0 - -[Netscape 8.0] -Parent=DefaultProperties -Browser=Netscape -Version=8.0 -MajorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 8.1 - -[Netscape 8.1] -Parent=DefaultProperties -Browser=Netscape -Version=8.1 -MajorVer=8 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.0 - -[SeaMonkey 1.0] -Parent=DefaultProperties -Browser=SeaMonkey -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.8*) Gecko/20060221 SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.1 - -[SeaMonkey 1.1] -Parent=DefaultProperties -Browser=SeaMonkey -Version=1.1 -MajorVer=1 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.8*) Gecko/20060221 SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 2.0 - -[SeaMonkey 2.0] -Parent=DefaultProperties -Browser=SeaMonkey -Version=2.0 -MajorVer=2 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.9*) Gecko/20060221 SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Flock 1.0 - -[Flock 1.0] -Parent=DefaultProperties -Browser=Flock -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; U; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinME - -[Mozilla/5.0 (Windows; U; Windows NT 5.0*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; U; Windows NT 5.1*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Flock 2.0 - -[Flock 2.0] -Parent=DefaultProperties -Browser=Flock -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; U; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinME - -[Mozilla/5.0 (Windows; U; Windows NT 5.0*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; U; Windows NT 5.1*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sleipnir 2.0 - -[Sleipnir] -Parent=DefaultProperties -Browser=Sleipnir -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.0*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.1*) Sleipnir/2.*] -Parent=Sleipnir -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.2*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 6.0*) Sleipnir/2.*] -Parent=Sleipnir -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 6.1*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win7 - -[Sleipnir*] -Parent=Sleipnir - -[Sleipnir/2.*] -Parent=Sleipnir - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fennec 1.0 - -[Fennec 1.0] -Parent=DefaultProperties -Browser=Firefox Mobile -Version=1.0 -MajorVer=1 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firebird - -[Firebird] -Parent=DefaultProperties -Browser=Firebird -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Linux; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird Browser/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; IRIX*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox - -[Firefox] -Parent=DefaultProperties -Browser=Firefox -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (OS/2; *; Warp*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (Windows NT 5.?; ?; rv:1.*) Gecko/* Firefox] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.*; *; rv:1.*) Gecko/* Deer Park/Alpha*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firefox/10.5] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; FreeBSD*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; HP-UX*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; Linux*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.0 - -[Firefox 1.0] -Parent=DefaultProperties -Browser=Firefox -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=MacPPC - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; *Linux*; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; DragonFly*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.4 - -[Firefox 1.4] -Parent=DefaultProperties -Browser=Firefox -Version=1.4 -MajorVer=1 -MinorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.5 - -[Firefox 1.5] -Parent=DefaultProperties -Browser=Firefox -Version=1.5 -MajorVer=1 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=OS/2 - -[Mozilla/5.0 (rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2 x64; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 2.0 - -[Firefox 2.0] -Parent=DefaultProperties -Browser=Firefox -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.0 - -[Firefox 3.0] -Parent=DefaultProperties -Browser=Firefox -Version=3.0 -MajorVer=3 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.1 - -[Firefox 3.1] -Parent=DefaultProperties -Browser=Firefox -Version=3.1 -MajorVer=3 -MinorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.5 - -[Firefox 3.5] -Parent=DefaultProperties -Browser=Firefox -Version=3.5 -MajorVer=3 -MinorVer=5 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Phoenix - -[Phoenix] -Parent=DefaultProperties -Browser=Phoenix -Version=0.5 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iceweasel - -[Iceweasel] -Parent=DefaultProperties -Browser=Iceweasel -Platform=Linux -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.8*) Gecko/* Iceweasel/2.0* (Debian-*)] -Parent=Iceweasel -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.0 - -[Mozilla 1.0] -Parent=DefaultProperties -Browser=Mozilla -Version=1.0 -MajorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.0.*) Gecko/*] -Parent=Mozilla 1.0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.1 - -[Mozilla 1.1] -Parent=DefaultProperties -Browser=Mozilla -Version=1.1 -MajorVer=1 -MinorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.1.*) Gecko/*] -Parent=Mozilla 1.1 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.2 - -[Mozilla 1.2] -Parent=DefaultProperties -Browser=Mozilla -Version=1.2 -MajorVer=1 -MinorVer=2 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.2.*) Gecko/*] -Parent=Mozilla 1.2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.3 - -[Mozilla 1.3] -Parent=DefaultProperties -Browser=Mozilla -Version=1.3 -MajorVer=1 -MinorVer=3 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.3.*) Gecko/*] -Parent=Mozilla 1.3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.4 - -[Mozilla 1.4] -Parent=DefaultProperties -Browser=Mozilla -Version=1.4 -MajorVer=1 -MinorVer=4 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.5 - -[Mozilla 1.5] -Parent=DefaultProperties -Browser=Mozilla -Version=1.5 -MajorVer=1 -MinorVer=5 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.6 - -[Mozilla 1.6] -Parent=DefaultProperties -Browser=Mozilla -Version=1.6 -MajorVer=1 -MinorVer=6 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.7 - -[Mozilla 1.7] -Parent=DefaultProperties -Browser=Mozilla -Version=1.7 -MajorVer=1 -MinorVer=7 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (*rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.8 - -[Mozilla 1.8] -Parent=DefaultProperties -Browser=Mozilla -Version=1.8 -MajorVer=1 -MinorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (*rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.9 - -[Mozilla 1.9] -Parent=DefaultProperties -Browser=Mozilla -Version=1.9 -MajorVer=1 -MinorVer=9 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE Mac - -[IE Mac] -Parent=DefaultProperties -Browser=IE -Platform=MacPPC -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/?.? (compatible; MSIE 4.0*; *Mac_PowerPC*] -Parent=IE Mac -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Mozilla/?.? (compatible; MSIE 4.5*; *Mac_PowerPC*] -Parent=IE Mac -Version=4.5 -MajorVer=4 -MinorVer=5 - -[Mozilla/?.? (compatible; MSIE 5.0*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.0 -MajorVer=5 -MinorVer=0 - -[Mozilla/?.? (compatible; MSIE 5.1*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/?.? (compatible; MSIE 5.2*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.2 -MajorVer=5 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 5.5 - -[AOL 9.0/IE 5.5] -Parent=DefaultProperties -Browser=AOL -Version=5.5 -MajorVer=5 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 5.5; *AOL 9.0*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 6.0 - -[AOL 9.0/IE 6.0] -Parent=DefaultProperties -Browser=AOL -Version=6.0 -MajorVer=6 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 6.0; *AOL 9.0*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 7.0 - -[AOL 9.0/IE 7.0] -Parent=DefaultProperties -Browser=AOL -Version=7.0 -MajorVer=7 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 - -[Mozilla/?.* (?compatible; *MSIE 7.0; *AOL 9.0*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Avant Browser - -[Avant Browser] -Parent=DefaultProperties -Browser=Avant Browser -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Advanced Browser (http://www.avantbrowser.com)] -Parent=Avant Browser - -[Avant Browser*] -Parent=Avant Browser - -[Avant Browser/*] -Parent=Avant Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 4.01 - -[IE 4.01] -Parent=DefaultProperties -Browser=IE -Version=4.01 -MajorVer=4 -MinorVer=01 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 4.01*)*] -Parent=IE 4.01 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 95*)*] -Parent=IE 4.01 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 98*)*] -Parent=IE 4.01 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 4.01 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 4.0*)*] -Parent=IE 4.01 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.0*)*] -Parent=IE 4.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.01*)*] -Parent=IE 4.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 4.01; Windows NT)] -Parent=IE 4.01 -Platform=WinNT - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.0 - -[IE 5.0] -Parent=DefaultProperties -Browser=IE -Version=5.0 -MajorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 5.0*)*] -Parent=IE 5.0 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 95*)*] -Parent=IE 5.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98*)*] -Parent=IE 5.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 5.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 4.0*)*] -Parent=IE 5.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.0*)*] -Parent=IE 5.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.01*)*] -Parent=IE 5.0 -Platform=Win2000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.01 - -[IE 5.01] -Parent=DefaultProperties -Browser=IE -Version=5.01 -MajorVer=5 -MinorVer=01 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 5.01*)*] -Parent=IE 5.01 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 95*)*] -Parent=IE 5.01 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98*)*] -Parent=IE 5.01 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 5.01 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 4.0*)*] -Parent=IE 5.01 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.0*)*] -Parent=IE 5.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.01*)*] -Parent=IE 5.01 -Platform=Win2000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.5 - -[IE 5.5] -Parent=DefaultProperties -Browser=IE -Version=5.5 -MajorVer=5 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 5.5*)*] -Parent=IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 95*)*] -Parent=IE 5.5 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98*)*] -Parent=IE 5.5 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98; Win 9x 4.90*)*] -Parent=IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 4.0*)*] -Parent=IE 5.5 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.0*)*] -Parent=IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.01*)*] -Parent=IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.1*)*] -Parent=IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.2*)*] -Parent=IE 5.5 -Platform=Win2003 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 6.0 - -[IE 6.0] -Parent=DefaultProperties -Browser=IE -Version=6.0 -MajorVer=6 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -w3cdomversion=1.0 -msdomversion=6.0 - -[Mozilla/?.* (?compatible; *MSIE 6.0*)*] -Parent=IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 95*)*] -Parent=IE 6.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98*)*] -Parent=IE 6.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98; Win 9x 4.90*)*] -Parent=IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 4.0*)*] -Parent=IE 6.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.0*)*] -Parent=IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.01*)*] -Parent=IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.1*)*] -Parent=IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2*)*] -Parent=IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*Win64;*)*] -Parent=IE 6.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*WOW64;*)*] -Parent=IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 6.0*)*] -Parent=IE 6.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 7.0 - -[IE 7.0] -Parent=DefaultProperties -Browser=IE -Version=7.0 -MajorVer=7 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -msdomversion=7.0 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 7.0*)*] -Parent=IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98*)*] -Parent=IE 7.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 4.0*)*] -Parent=IE 7.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.0*)*] -Parent=IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.01*)*] -Parent=IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.1*)*] -Parent=IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2*)*] -Parent=IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*Win64;*)*] -Parent=IE 7.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*WOW64;*)*] -Parent=IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.0*)*] -Parent=IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.1*)*] -Parent=IE 7.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; *)*] -Parent=IE 7.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 8.0 - -[IE 8.0] -Parent=DefaultProperties -Browser=IE -Version=8.0 -MajorVer=8 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=3 -supportsCSS=true -ecmascriptversion=1.2 -msdomversion=8.0 -w3cdomversion=1.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Win32*)*] -Parent=IE 8.0 -Platform=Win32 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0*)*] -Parent=IE 8.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1*)*] -Parent=IE 8.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2*)*] -Parent=IE 8.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Win64; x64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista -Win64=false - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1*)*] -Parent=IE 8.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 -Win64=false - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 7.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Default Browser - -[*] -Browser=Default Browser -Version=0 -MajorVer=0 -MinorVer=0 -Platform=unknown -Alpha=false -Beta=false -Win16=false -Win32=false -Win64=false -Frames=true -IFrames=false -Tables=true -Cookies=false -BackgroundSounds=false -CDF=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -Stripper=false -isBanned=false -isMobileDevice=false -isSyndicationReader=false -Crawler=false -CssVersion=0 -supportsCSS=false -AOL=false -aolVersion=0 -AuthenticodeUpdate=0 -CSS=0 -WAP=false -netCLR=false -ClrVersion=0 -ECMAScriptVersion=0.0 -W3CDOMVersion=0.0 diff --git a/Source/Platforms/Mac/Binaries/Mono/etc/mono/config b/Source/Platforms/Mac/Binaries/Mono/etc/mono/config deleted file mode 100644 index c9fe722be..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/etc/mono/config +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/libMonoPosixHelper.dylib b/Source/Platforms/Mac/Binaries/Mono/lib/libMonoPosixHelper.dylib deleted file mode 100755 index f171b9953..000000000 Binary files a/Source/Platforms/Mac/Binaries/Mono/lib/libMonoPosixHelper.dylib and /dev/null differ diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/libmono-btls-shared.dylib b/Source/Platforms/Mac/Binaries/Mono/lib/libmono-btls-shared.dylib deleted file mode 100755 index e64e9f742..000000000 Binary files a/Source/Platforms/Mac/Binaries/Mono/lib/libmono-btls-shared.dylib and /dev/null differ diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/libmono-native.dylib b/Source/Platforms/Mac/Binaries/Mono/lib/libmono-native.dylib deleted file mode 100755 index d3c3fd4b7..000000000 Binary files a/Source/Platforms/Mac/Binaries/Mono/lib/libmono-native.dylib and /dev/null differ diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Accessibility.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Accessibility.dll deleted file mode 100644 index 1f281b0c5..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Accessibility.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38077916ef2a1fb4506b13d34370a940d47c288dd4a8d59c156cf4dd0485777a -size 12800 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Commons.Xml.Relaxng.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Commons.Xml.Relaxng.dll deleted file mode 100644 index 2f8bf7c42..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Commons.Xml.Relaxng.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:acefc14f5dfbdbd3cf26000a4e32722966f57d525cc0620dbb48ca3d291f14d6 -size 231424 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/CustomMarshalers.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/CustomMarshalers.dll deleted file mode 100644 index 9a8b37e58..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/CustomMarshalers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02921dffac128db4f713f4ccb2da029937f2eb20888406e1797d10e4dd56ab47 -size 14848 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/I18N.CJK.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/I18N.CJK.dll deleted file mode 100644 index 0c74cbbb8..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/I18N.CJK.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc0d75a484a23716084be32c70b4669c15ac984c8ca57b8766917579ad763315 -size 679936 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/I18N.MidEast.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/I18N.MidEast.dll deleted file mode 100644 index 6e063de93..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/I18N.MidEast.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4eb81f05a1bb04077bf22cf14de97f792baa37e9ae69ce6940d74b49845e5a00 -size 32256 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/I18N.Other.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/I18N.Other.dll deleted file mode 100644 index 3db27e742..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/I18N.Other.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4dfdc87dde21bce3b918dbea485edc8ea0b77d1764aa05ad88b20ebcb4592e3d -size 36352 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/I18N.Rare.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/I18N.Rare.dll deleted file mode 100644 index 041f2792e..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/I18N.Rare.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12f8857b8275ede4205cfebbf2c14220a188d921dff630cc4c1ed32b350d4b96 -size 192000 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/I18N.West.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/I18N.West.dll deleted file mode 100644 index 9b9abbc31..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/I18N.West.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bda25073b142b7ecffc84d2d904832a5f308a396fa03066b530fa7a710346378 -size 72192 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/I18N.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/I18N.dll deleted file mode 100644 index d0a0e3074..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/I18N.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7b1751c0b83ad11befc6089275d6b94062633f51da242273de92d8d51b70a41 -size 39424 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/IBM.Data.DB2.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/IBM.Data.DB2.dll deleted file mode 100644 index 80ca4e06f..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/IBM.Data.DB2.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d36c975b32a20f9f4822e4b3c8dc35f686d6a4f421e9ad9f8950b35be90f2ebf -size 72192 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/ICSharpCode.SharpZipLib.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/ICSharpCode.SharpZipLib.dll deleted file mode 100644 index 3867e2457..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/ICSharpCode.SharpZipLib.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1ce584cb5061d6acdc50018af5ed6c8f782e3302d07ea83990772ed8f7c08ec -size 124928 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.Build.Engine.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.Build.Engine.dll deleted file mode 100644 index b75fd38d5..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.Build.Engine.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32b73c919bc1686e43ca2f1c1ea2075baef482d77f80cbaba49968acedd7023e -size 236032 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.Build.Framework.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.Build.Framework.dll deleted file mode 100644 index fdf8e1b29..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.Build.Framework.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d41b8feb08b065707f8611313417256cfbec4ced45f575c334e060a1c4c2893f -size 32768 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.Build.Tasks.v4.0.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.Build.Tasks.v4.0.dll deleted file mode 100644 index b7b0c9067..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.Build.Tasks.v4.0.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:542b0be634577e9600c24bd5d3a10f0bc5d3e9606491795b54ed8ad4de082bef -size 174080 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.Build.Utilities.v4.0.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.Build.Utilities.v4.0.dll deleted file mode 100644 index 40d922a0c..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.Build.Utilities.v4.0.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b835963f60602ee8df5b1ff223788743760e79ed25c4e546ec6180777e8b192 -size 56320 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.Build.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.Build.dll deleted file mode 100644 index 59b07915e..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.Build.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:632c4237c5f0b93df7efabc3080eff26546462305b9281f602355e39aba85526 -size 280064 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.CSharp.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.CSharp.dll deleted file mode 100644 index a5773519c..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.CSharp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e71b7b997b3eaada1810000ee4284f00d57096f8455266d6bbf8969dc610b19 -size 300544 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.CSharp.Scripting.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.CSharp.Scripting.dll deleted file mode 100755 index d6fc08e33..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.CSharp.Scripting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ae612ab02b6d0babd91d6664ead7702d1ad47f1a0dd918d8a3e4f7080d25585 -size 31096 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.CSharp.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.CSharp.dll deleted file mode 100755 index 2c01257d7..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.CSharp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0144eb8f2bf7a73350590ab6e46c549960bb0c791cb186be49b5a4ed290adc3 -size 5218168 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.Scripting.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.Scripting.dll deleted file mode 100755 index 9878502d3..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.Scripting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8e23b9d08c502ed0f1138854dabf362893aa707590fd053b5dac6ccfdaf6923 -size 133496 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.VisualBasic.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.VisualBasic.dll deleted file mode 100755 index 7e92de2d7..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.VisualBasic.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db50ae8e4a8bff665af20ef643763cc9d56249551440260d7a93fe7551c2c67f -size 5171576 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.dll deleted file mode 100755 index a762bf1f7..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.CodeAnalysis.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f46392911ce9740de23f4cf4bc4a526d2633eacb6d3dbd90d18048b5c2d1d39 -size 2496376 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.VisualC.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.VisualC.dll deleted file mode 100644 index 8cefbf9bf..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.VisualC.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:faf8ca3cb87f27f49e2bdc081c63f443fa9164b979b55ddf43fab832985716cf -size 11264 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.Web.Infrastructure.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.Web.Infrastructure.dll deleted file mode 100644 index 3877e34a5..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Microsoft.Web.Infrastructure.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d4e756527545ee2deada56ec255c6c433d15cf9237bd8cbe2c12cb01451edb5 -size 16896 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Btls.Interface.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Btls.Interface.dll deleted file mode 100644 index 58b5012ad..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Btls.Interface.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa07a66bebf088cba7c34b0821c56eac9b9bbe39ead30f2c862d29f99b881c0f -size 22528 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.CSharp.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.CSharp.dll deleted file mode 100644 index 1ae4f3c79..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.CSharp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8ae2f11fcfd1de8dbd5efd26cab4338f30048328c6d874045b6f344d12c4e7b -size 1354752 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Cairo.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Cairo.dll deleted file mode 100644 index 232cf84bd..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Cairo.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c3bbfb9c6520d68eae80611c84e3178cc71d5175b63a43c6cc4b1a83fa3c460 -size 62464 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.CodeContracts.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.CodeContracts.dll deleted file mode 100644 index f9e136c40..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.CodeContracts.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11bc150ef7dc4a475b3dddc6e464780c0221fa921282660060ad55bbcf6e9891 -size 660992 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.CompilerServices.SymbolWriter.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.CompilerServices.SymbolWriter.dll deleted file mode 100644 index ca7cbdf57..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.CompilerServices.SymbolWriter.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ec053bb41a645f3cf64a31f7cd189c36f02dee8f14bc0d14b76a0a9946a6dea -size 44032 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Data.Sqlite.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Data.Sqlite.dll deleted file mode 100644 index 8cb4c423b..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Data.Sqlite.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ada04dec59c366f49378cf3ce6da279cf1997ac5de777d17dfd95b67b5a2c7c7 -size 166912 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Data.Tds.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Data.Tds.dll deleted file mode 100644 index e298ed465..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Data.Tds.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ae8ef64d246d74e96b04e0c7b994012820f6d781a050196ee29effb65b93dfb -size 100352 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Debugger.Soft.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Debugger.Soft.dll deleted file mode 100644 index 630e819aa..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Debugger.Soft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2729b3f9b086f78a113bea78e7c1df6d3266f31cfaf3c8876b63854953e14da2 -size 160256 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Http.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Http.dll deleted file mode 100644 index 30f19926b..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b96c42a802ad1d73bf3616c12fba78ecaa7025963ddf2061eb5c319107215080 -size 27136 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Management.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Management.dll deleted file mode 100644 index 69bdcd103..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19f2dc7746c9ac600a73e4572ed0ab788a2369b511ec59c8d913481b9ca358ea -size 13312 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Messaging.RabbitMQ.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Messaging.RabbitMQ.dll deleted file mode 100644 index 63a04d977..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Messaging.RabbitMQ.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f4f818a729f4b08a579a9a7e37a83063b614f3ef825996d5510ac7690be60a6 -size 34816 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Messaging.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Messaging.dll deleted file mode 100644 index 769804709..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d03356f0fa9c87e43150720035c208eb79332f34dcce699f7a5ff044464fe1c1 -size 34816 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Parallel.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Parallel.dll deleted file mode 100644 index 9c6a7c260..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Parallel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:081dbfde1426446d660ceb70802971d18d58574ea5a25d1d0a965209d769d81b -size 29696 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Posix.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Posix.dll deleted file mode 100644 index 8380a87e1..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Posix.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:71b816db8f70a78f2db6ac9bbf5d28aa66cdd251c01b9da66fc3184bb0b0ceff -size 212480 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Profiler.Log.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Profiler.Log.dll deleted file mode 100644 index 46e741b19..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Profiler.Log.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8e77d62b69e0fc00b212b995a943797b6a2d69737e82be6dc18510768ef5a87 -size 70144 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Security.Win32.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Security.Win32.dll deleted file mode 100644 index f555388c2..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Security.Win32.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62de7cac51f30c760c39724fc8f437fb67d5381824bcd35f7ed5f655a34b02c0 -size 18432 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Security.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Security.dll deleted file mode 100644 index c39d1e799..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea4bd65d2261f1c5f3c22b592734b3079270365e827f4ca785853b9c38b291bd -size 314368 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Simd.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Simd.dll deleted file mode 100644 index 31d492f84..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Simd.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a21917597c63580bf1b61d72bc25470c02db980e4e7944b3d1fb4a00044ae603 -size 67072 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Tasklets.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Tasklets.dll deleted file mode 100644 index 7796e9cc4..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.Tasklets.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb2b392cf61e9c087ca675ad20941891d0859ab79a615502194c3a8571f5d76d -size 11264 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.WebBrowser.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.WebBrowser.dll deleted file mode 100644 index db8880016..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.WebBrowser.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:162bb5bdf3dfe9e8a6efb36db0de18fae43acbe99841bae92c487716b4771a09 -size 166912 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.XBuild.Tasks.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.XBuild.Tasks.dll deleted file mode 100644 index 57eb89681..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Mono.XBuild.Tasks.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de470b4e692d36fdccea87f48dee0fd33e59c1dc5d345d52f537075a4b7e8904 -size 36864 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Novell.Directory.Ldap.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Novell.Directory.Ldap.dll deleted file mode 100644 index c67722acb..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/Novell.Directory.Ldap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6299f3d85b0d92aac586261adf9b5b60ab837d048331334bda5183f292d9eee -size 246272 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/PEAPI.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/PEAPI.dll deleted file mode 100644 index 31e36da0a..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/PEAPI.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c0717febe06ddf8109f918399d1338e4b67c1541337990f329ca586b1f44f07 -size 100352 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/RabbitMQ.Client.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/RabbitMQ.Client.dll deleted file mode 100644 index 18084533d..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/RabbitMQ.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74adc6becdc480899c9b5c53ccb6fa887c8d71f94ee79c7f593fc359e3d8dd2d -size 464896 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/SMDiagnostics.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/SMDiagnostics.dll deleted file mode 100644 index b545b0efd..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/SMDiagnostics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:37dc880fad77b9c2ab3532f255967e39495269fdb968053b2ab8f20882aeb14f -size 38912 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Collections.Immutable.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Collections.Immutable.dll deleted file mode 100755 index 0c5a57915..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Collections.Immutable.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f05a2c489c2d30a6cca346d4ce184323d70eb4f5afa6bed34d5800274444e57 -size 302216 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll deleted file mode 100644 index 53350aee0..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4465b575ef4d6fe795b43a50aac57f9c424cf6702b7239f58d2d3d419ecc9123 -size 258560 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll deleted file mode 100644 index f44584c27..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f458322c97eecffc8d640cbf09f43d85703f704680354c635bec7bbd024dc026 -size 84992 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Configuration.Install.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Configuration.Install.dll deleted file mode 100644 index af20838c3..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Configuration.Install.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac791e97c0838233dc8d02e07ec9e68f07fca6315b8a7bbf33dda5888d89fa65 -size 24064 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Configuration.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Configuration.dll deleted file mode 100644 index 762529ae6..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Configuration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:171d837d86c3fa9758beb58acbc2b3a81832be3708fbd9591cdbbcb98c21d2bd -size 122880 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Core.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Core.dll deleted file mode 100644 index 32dcd2569..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:841df1b9cde9dca76d04a9e2d19e56a537d588da58dafe8ee8028cb9bb94eb52 -size 1086464 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll deleted file mode 100644 index 7f14bcd76..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f53416e9f368fae8a7e0d5cab0171fda85ffabf42ed7b66e8cac43a183f993ab -size 29696 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.Entity.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.Entity.dll deleted file mode 100644 index df00cf9af..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.Entity.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63402941a9194a3814caf8824aed5ee300766ce755cdc3263b611ca90e2bd2ef -size 3338240 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.Linq.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.Linq.dll deleted file mode 100644 index 936ce24d5..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f6ef57342af0458e475ccf9e85db2f21bf127107bcb70a5848269ce808c5ed5 -size 652800 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.OracleClient.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.OracleClient.dll deleted file mode 100644 index c9cbf3fe4..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.OracleClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a0d0f0bf49fab0e2c960fcecf47448043a73c41be42d10fb9ff8d3b71e99616 -size 173056 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.Services.Client.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.Services.Client.dll deleted file mode 100644 index bd7c50ddf..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.Services.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d27cb2bac0c4be5f3fed2355578030511c0463518ab90f6b720c5ba994c1671e -size 418816 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.Services.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.Services.dll deleted file mode 100644 index b402a7cd4..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56e07612b65efb0f666efdcb6d9573baebacf69b54234a53bbcb87838c0cee77 -size 56320 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.dll deleted file mode 100644 index b9b38cb69..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:042c179d7474f1a4ebcdce43ac162140da7ad8be28c3e760895e9f83fe352773 -size 2103296 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Deployment.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Deployment.dll deleted file mode 100644 index 910bff681..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8acfe355db2d152012bae3ee223985a848d3fa79daa7e37e770114ca187f297d -size 11776 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Design.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Design.dll deleted file mode 100644 index 7c4481f3c..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Design.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:297db3332c96905892a6efe632bf5af20a590528691ccd6873ff9987250b3729 -size 275456 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll deleted file mode 100644 index dfdd376fc..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ade44df93a20aecf69fd697d8102b918a7b6f203a5016bf93122f84f681efdd5 -size 61952 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.dll deleted file mode 100644 index f65db3960..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6bebc99eea99d8f15188efb2e4ff67186a3ec64765b0753dddbbea3cde10628 -size 94208 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Drawing.Design.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Drawing.Design.dll deleted file mode 100644 index 7dcd85f8e..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Drawing.Design.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9eba5ba47dd1638d766cd8c937ddd254d10444160473cc37f1d12498f307a251 -size 30720 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Drawing.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Drawing.dll deleted file mode 100644 index f524217ba..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Drawing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20723d7993a578a0a9b7696b0b265cb6a6967be42b73f3bf52a3d4ae4e219dc2 -size 491008 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Dynamic.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Dynamic.dll deleted file mode 100644 index a13e8fce8..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Dynamic.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea820d11c9294f8a77eb41ead5c0b6a678620b61c953e91401f99d64ee77c3f9 -size 87040 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.EnterpriseServices.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.EnterpriseServices.dll deleted file mode 100644 index 523c73020..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.EnterpriseServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5f4fde63006fd55f9d74bc01f70014317b22e1ba0bb7f9b2634f8d451e614e6 -size 46592 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll deleted file mode 100644 index 8b07d9c1b..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38fd6e8e53b39b5eb0be5bbf87d2beff289b4cad5b20feada41a5017ee1fe61b -size 18432 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.IO.Compression.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.IO.Compression.dll deleted file mode 100644 index c425363a6..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.IO.Compression.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6de4d1ae3396938358d2bfc8b14478041fa913d616f55fc75b6d909ece05b5f7 -size 115200 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll deleted file mode 100644 index 83b8460f5..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:978998b92f9d876064187943fec584cd4af3d8dd6c796054432fce1173c429f0 -size 17408 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.IdentityModel.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.IdentityModel.dll deleted file mode 100644 index 5e2f85eb2..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.IdentityModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3df48b930d479a7f15c5eb6533d6d4d84fbe6b612aec602a57cabbd72e33165c -size 139776 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Json.Microsoft.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Json.Microsoft.dll deleted file mode 100644 index e0edb056c..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Json.Microsoft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bbffd2577e2c06733e5a5b063f5fdf8777855898c642c7e3931014b7803025f2 -size 54784 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Json.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Json.dll deleted file mode 100644 index 5166a307d..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4914bb59f5d08229d38a024c34c4cc35ed4fbdfffa3f427ec4aebb3bb2e70fbc -size 32768 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Management.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Management.dll deleted file mode 100644 index 96e108ab6..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f083379005761ac1b31b1235a893dfff36febd8df0253a3b2b66013abd8b3098 -size 49664 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Memory.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Memory.dll deleted file mode 100755 index 0f4395de1..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Memory.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41b5e1a4c59abdb1ce1467f58c3d9fd06d39dff4fc61d500a2410fece8037f4b -size 148760 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Messaging.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Messaging.dll deleted file mode 100644 index e4d47e2f2..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b82dd8058f7a203f9eba6eedbbf27e1bc20bede8e3544a8e0975c49cf221f33e -size 75776 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll deleted file mode 100644 index 7182a3519..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e535958942e02364cedf0b04e35cbef5f1e29317fb87dd77577f73277f5ba6e -size 518656 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll deleted file mode 100644 index 984c9c016..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b4b7015332cb523299a7587f1c6e3e52db99b9588bae6123dad9dd016173b28 -size 27136 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Net.Http.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Net.Http.dll deleted file mode 100644 index 39f8b22c1..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Net.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5de962cf057f3cf2ee4cf0fb19e8ea11c45eeb790caa7afcad6bfcb8faaf334 -size 281088 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Net.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Net.dll deleted file mode 100644 index 8d8be1c5a..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Net.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7798088c72df4263dfdeb0de6ecdea151cfbb14e8c95a40ea577f9c6b4a3ae63 -size 13312 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Numerics.Vectors.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Numerics.Vectors.dll deleted file mode 100644 index 9ffe05fdc..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Numerics.Vectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5d537d6b04a4fa0ad752522553319c72f248e913f5cd6e6eac920e98d39de20 -size 12288 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Numerics.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Numerics.dll deleted file mode 100644 index b258d94ff..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7983522e6cfe1c69dae2a7c287788ff7c966543dd89c790a9a09846b1ec1e149 -size 119808 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Core.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Core.dll deleted file mode 100644 index 89ecd73b0..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fbaf3cbf422168ecfcb0a743ce66774b475fd52a02dd3a9ae9be4f73ece92fc -size 95744 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Debugger.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Debugger.dll deleted file mode 100644 index 26d40e90e..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Debugger.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:416f892f39f496532202e68b18b6fde5d896e8301c27886b40e350ce80e253ae -size 5120 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Experimental.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Experimental.dll deleted file mode 100644 index a46d9c8e4..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Experimental.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60288106456e7586983698a091ae9fa7021a68d9a0abdb4608e5cb0a742d4a9c -size 28672 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll deleted file mode 100644 index 605512f2a..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:707a4066589b59e4e734dc295f7b8e564e0f43361cf5c36adf31eb2c7930989e -size 7680 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Linq.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Linq.dll deleted file mode 100644 index 40a60715f..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67b2ea4234dd4fb89ee4325ad9bdd37276ef05275e0280dfaf8cb97372151886 -size 683008 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll deleted file mode 100644 index f3cacd681..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:460a9fdc8e3a94a9c5b701a99f7a37281ae336dac4fa5c7cfcd4daa34d8f62f0 -size 9728 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll deleted file mode 100644 index 1dfea8a1b..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57e8be600fc7fb70ae23e4decc12949fd2ae2b4c8e23f490be7bde422dc3c210 -size 22528 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Providers.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Providers.dll deleted file mode 100644 index b9dd874b6..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Providers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:27705a38c48c203eabc1c13dc87fcbf4616e18a8c3a6242301a5902929ab0eb4 -size 243200 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll deleted file mode 100644 index a81c44f36..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac32f644c0a88a5c789f732d375ef70bed29da56451570de514afbfd51bc83cd -size 9216 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll deleted file mode 100644 index b7c7a2b23..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21eba9b6ab7cf93cb817ce2c3ab1416659c7d46e0ac1602809f909486de70e96 -size 9728 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll deleted file mode 100644 index 2543b7e63..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0f6bd34deec9e5daccf33d8773cb7db8790bd7d0a175853c5684b3a8d3f6f55 -size 12800 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reflection.Context.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reflection.Context.dll deleted file mode 100644 index 345217201..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reflection.Context.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:467c1c751d09cb9887771f7c1117f9ddd2b88b271034f660b1c5cea3ae6b4bc3 -size 13312 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reflection.Metadata.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reflection.Metadata.dll deleted file mode 100755 index 5ab21e78b..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Reflection.Metadata.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e180767f1415cb5bbed14450e1d4003cf56a9da6aeaf91ce969a4b9d2a54314 -size 576144 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Runtime.Caching.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Runtime.Caching.dll deleted file mode 100644 index 8fad976d2..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Runtime.Caching.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75089c6efdf7783f6a32e6f07a88b2db22cb7ac7c03bbe27600df40c72764136 -size 72192 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Runtime.CompilerServices.Unsafe.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Runtime.CompilerServices.Unsafe.dll deleted file mode 100755 index 19ad4e23b..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Runtime.CompilerServices.Unsafe.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ad2dd7225d5162a0fd3a3b337a1949448520e3130a4bc8e010ec02f76097500 -size 23600 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll deleted file mode 100644 index c3ac14b98..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:540b736958f2ec82503870fa37dfe9f1483cbf3ee488ddc20b2fddc450a1a439 -size 107520 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Runtime.Remoting.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Runtime.Remoting.dll deleted file mode 100644 index 02d050742..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9fdbaec0c35ab7695edda6dbf056b575971ab62110109a2063f728b6ac727539 -size 119808 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll deleted file mode 100644 index f542d736d..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f3d6559dde02956fec32b85e524b90c08eb7e49327eb805e6ee7ddf8de29d8bd -size 38912 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.dll deleted file mode 100644 index a13995f3e..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7dba5fee490e094d299f0a353de920e2cc59c95b47bb3dc62243261200a6e8c3 -size 933888 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Security.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Security.dll deleted file mode 100644 index f26668df8..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c7b696f0cf3925d47544194da48849e2bbbe828d417ffb855d9000f612fcfc7 -size 308224 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll deleted file mode 100644 index 7dba3b614..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f879fc8feb15132b1d5abb381b6e75b07311ba3cf0aadd62fec8f6caf40b8aa9 -size 13312 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll deleted file mode 100644 index 01a8182b0..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c5daa3a9c85ef83c90ffa836e80a13629ada71b3fa50c97042e3c1575838be2 -size 141312 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll deleted file mode 100644 index 5174ecc87..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30c0b4cab4a456300587aa1160cbdcd28cf7f914d5bb5dd41017965ace26b53b -size 215040 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll deleted file mode 100644 index e31805117..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef364e6e464451d33f779a62b406a990656236f9e1f2c45aa2a259a228c7984c -size 37376 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Web.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Web.dll deleted file mode 100644 index e63adfa9c..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa78021c3462174d441e63af7df80d7833013e0a2db32cb0f825aa6a7ef9c4e6 -size 79360 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceModel.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceModel.dll deleted file mode 100644 index 7ffb3e5e5..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68e05e15abfdd316ff2fddb1a256f47a571c5c7bfdc21f88434db8839791f114 -size 1427456 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceProcess.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceProcess.dll deleted file mode 100644 index c85b50f20..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.ServiceProcess.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e24043ad6c15be45eab0669aec7fb2b145fbc35b4142637850567bc3ae1b774 -size 47616 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll deleted file mode 100644 index d9c206bbb..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56aa1d4295e61a9d2c20e73ca52c122caa693643319f3fe3c0dca4bad61632c4 -size 169472 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Threading.Tasks.Extensions.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Threading.Tasks.Extensions.dll deleted file mode 100755 index 393652b40..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Threading.Tasks.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f54718bbab6e7a649e460f5097ed444f33452b1451841f67e2e194641d5fccd -size 33048 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Transactions.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Transactions.dll deleted file mode 100644 index 5c702d264..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Transactions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce7ab1ca45149be5d51c27feb3fd807c8ab30d31b3cf392a413684ef00305102 -size 34304 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Abstractions.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Abstractions.dll deleted file mode 100644 index 6c41ad996..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Abstractions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b88d4770f40c8ca84baa9a2927c2c93d9f52137e12fe77007535e97a1ee27162 -size 12800 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll deleted file mode 100644 index 88a5642e8..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:431c9a1572b254894f94ecbafb90f30576c504808b7c98b0a40b7ca41042ef58 -size 33792 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.DynamicData.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.DynamicData.dll deleted file mode 100644 index 30291b487..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.DynamicData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28f104232217e8b3c7244c9b045b87eec1cb3164472d521b31c885d0cf2f7770 -size 69120 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Extensions.Design.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Extensions.Design.dll deleted file mode 100644 index b84978722..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Extensions.Design.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3148c19c2f3e8bb987309029a41f4d9c2c279ee43d55114f000703cad97afa8d -size 15360 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Extensions.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Extensions.dll deleted file mode 100644 index 48525b557..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ab2086183488192f048f416fb0b54e021f368c84a52a60f91a23463f4bd22a8 -size 745984 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll deleted file mode 100644 index 1d682e1df..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d147cf27b3c69eff9ca5394fff06e5971e4640d21bf7c2ac0249b2dc4781a24 -size 88064 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll deleted file mode 100644 index 2419c1290..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19f1175c6fe95bfc6faebde9846e8800b8d2df627d38bf0b69b1b227045b0899 -size 56832 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Http.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Http.dll deleted file mode 100644 index af59162d8..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c587182797071e50c9a4638cbaf989867f84c32a726fe8bb9b3eb6736b7dc0d -size 326144 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Mobile.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Mobile.dll deleted file mode 100644 index 8d69778a3..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Mobile.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3dbd20654603d5ff484dbaa1a5a6cbec80dddbafd8e834963015e01c857e8a5 -size 11776 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Mvc.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Mvc.dll deleted file mode 100644 index 87d13add9..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Mvc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5cf41fb40c84a5adfc175da9f5dd8d751cd79dc3e30db2db78c9223054ec5400 -size 419840 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Razor.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Razor.dll deleted file mode 100644 index 8c209f4f8..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a8dff7c71574d21c940ed549e70ed7871638a171151ead31a6940ffd24571c7 -size 254976 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll deleted file mode 100644 index 5bf67f16f..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6531106d57c67fcdf32d62eb9d73f9de7107d485671217fcd99bbf1bb8e6fee -size 11776 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Routing.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Routing.dll deleted file mode 100644 index fe56843fa..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:277d420160bb4a403c5d09efca1c124024df59bc965fa9623e7859668579695f -size 12288 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Services.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Services.dll deleted file mode 100644 index 7b8c930e8..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba086c0b92f897513e461d8f2a51825b1502c3de19c70f68dec9ec0357fdd012 -size 787456 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll deleted file mode 100644 index bd7835766..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:000649acd357461c3be7c150d46f401a4990ea57358c60920e8b214bba8deb70 -size 39424 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll deleted file mode 100644 index 45ffe3d6d..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2632b11dd1ac054c4cc1fb2a5d77def4ec4ad4f421c32f16652efe7c2f68a1bb -size 38400 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.dll deleted file mode 100644 index df926edac..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd9acef3550c397174d37ac7b8fb1b178e0abb61da7f5bab03841dc1242e98b1 -size 196608 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.dll deleted file mode 100644 index 2990b56bd..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5496200edae4f96376df62c259d98ca4c992dae6c53a7bb5335c9f9d5ed6883b -size 3028992 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll deleted file mode 100644 index 4b1f00a61..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2de81878034e9129578ba071a47a7a0f194c418dcb15c15a9c3ed941cfb331aa -size 145920 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.dll deleted file mode 100644 index e2e973d06..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e05d2da77f22b7d291ee4a86871e26ca63d414e3f0425f184bf48cf0f1ed554a -size 2899968 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Windows.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Windows.dll deleted file mode 100644 index 7fe36e190..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Windows.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a95172b118693f53b49d40984ad431b357202cd1f5db292898514908c16cc507 -size 11776 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Workflow.Activities.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Workflow.Activities.dll deleted file mode 100644 index 52d9f6ba7..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Workflow.Activities.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6be6cd81705e0e54c949eb74e7590768c572595998c22f74a62ed4a4bcba2276 -size 11776 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll deleted file mode 100644 index cd7310881..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2cfaedcf003e13107b26b27e31aefb2d93e6cbc2f05b6d2f1d887f39f251c926 -size 11776 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Workflow.Runtime.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Workflow.Runtime.dll deleted file mode 100644 index bf880d66e..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Workflow.Runtime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5f147fc082a208f0c270cdf222e68dbbb5526d5e55b788096cb4e1c3c9167d4 -size 11776 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Xaml.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Xaml.dll deleted file mode 100644 index 53e99a4d0..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Xaml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f1718df6b2e47a13f7f04092ddf1e3de63e57df3a3ac600f6da16abf46ce0d1 -size 188928 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Xml.Linq.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Xml.Linq.dll deleted file mode 100644 index 66dcb0849..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Xml.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89153954aeb08c417dc01a9b83640f7115ca7a7c0a7db5e2819d0990a2c4c1a4 -size 137728 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Xml.Serialization.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Xml.Serialization.dll deleted file mode 100644 index 79f06d41f..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Xml.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0ea428cbed8cf10c319d2a87e4ff54c8baa63eb4a681d26b1f023ccb09170a7 -size 11776 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Xml.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Xml.dll deleted file mode 100644 index 9863a3987..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8cbd08fb24fecba4e19b0bc86020d320413a35fbb4054db9e99e7e5bcbdf51b5 -size 3174400 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.dll deleted file mode 100644 index 10ac90392..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/System.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:012cd3b4a43b9b91d9dfbf04931d827ce1586fd2f1b26c97b524a0ecbf7c1484 -size 2665984 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/WebMatrix.Data.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/WebMatrix.Data.dll deleted file mode 100644 index 6a1e9bd41..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/WebMatrix.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6d75ab8a21b64f83a8a958979dc6875f79dbbe7367d995aed79cc5900e8c650 -size 17920 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/WindowsBase.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/WindowsBase.dll deleted file mode 100644 index 2e43ab76f..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/WindowsBase.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d764a633c03b1c51ddc8a9fc222db464f6da5cc556eba5fb998fb5093554d5e1 -size 161792 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/cscompmgd.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/cscompmgd.dll deleted file mode 100644 index 71ef8812b..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/cscompmgd.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a065cdd5b278031e79051ea982d4f3b606c71c812680f8b253b49bb5467b490c -size 18432 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/mscorlib.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/mscorlib.dll deleted file mode 100755 index 6420389e3..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/4.5/mscorlib.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:92a509dc6132ae7b73610e579ff9c871b9f89b387e13870a7c35846b527c7a5a -size 4616704 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll deleted file mode 100644 index 1f281b0c5..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38077916ef2a1fb4506b13d34370a940d47c288dd4a8d59c156cf4dd0485777a -size 12800 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Commons.Xml.Relaxng/4.0.0.0__0738eb9f132ed756/Commons.Xml.Relaxng.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Commons.Xml.Relaxng/4.0.0.0__0738eb9f132ed756/Commons.Xml.Relaxng.dll deleted file mode 100644 index 2f8bf7c42..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Commons.Xml.Relaxng/4.0.0.0__0738eb9f132ed756/Commons.Xml.Relaxng.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:acefc14f5dfbdbd3cf26000a4e32722966f57d525cc0620dbb48ca3d291f14d6 -size 231424 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/CustomMarshalers/4.0.0.0__b03f5f7f11d50a3a/CustomMarshalers.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/CustomMarshalers/4.0.0.0__b03f5f7f11d50a3a/CustomMarshalers.dll deleted file mode 100644 index 9a8b37e58..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/CustomMarshalers/4.0.0.0__b03f5f7f11d50a3a/CustomMarshalers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02921dffac128db4f713f4ccb2da029937f2eb20888406e1797d10e4dd56ab47 -size 14848 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/I18N.CJK/4.0.0.0__0738eb9f132ed756/I18N.CJK.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/I18N.CJK/4.0.0.0__0738eb9f132ed756/I18N.CJK.dll deleted file mode 100644 index 0c74cbbb8..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/I18N.CJK/4.0.0.0__0738eb9f132ed756/I18N.CJK.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc0d75a484a23716084be32c70b4669c15ac984c8ca57b8766917579ad763315 -size 679936 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/I18N.MidEast/4.0.0.0__0738eb9f132ed756/I18N.MidEast.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/I18N.MidEast/4.0.0.0__0738eb9f132ed756/I18N.MidEast.dll deleted file mode 100644 index 6e063de93..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/I18N.MidEast/4.0.0.0__0738eb9f132ed756/I18N.MidEast.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4eb81f05a1bb04077bf22cf14de97f792baa37e9ae69ce6940d74b49845e5a00 -size 32256 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/I18N.Other/4.0.0.0__0738eb9f132ed756/I18N.Other.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/I18N.Other/4.0.0.0__0738eb9f132ed756/I18N.Other.dll deleted file mode 100644 index 3db27e742..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/I18N.Other/4.0.0.0__0738eb9f132ed756/I18N.Other.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4dfdc87dde21bce3b918dbea485edc8ea0b77d1764aa05ad88b20ebcb4592e3d -size 36352 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/I18N.Rare/4.0.0.0__0738eb9f132ed756/I18N.Rare.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/I18N.Rare/4.0.0.0__0738eb9f132ed756/I18N.Rare.dll deleted file mode 100644 index 041f2792e..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/I18N.Rare/4.0.0.0__0738eb9f132ed756/I18N.Rare.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12f8857b8275ede4205cfebbf2c14220a188d921dff630cc4c1ed32b350d4b96 -size 192000 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/I18N.West/4.0.0.0__0738eb9f132ed756/I18N.West.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/I18N.West/4.0.0.0__0738eb9f132ed756/I18N.West.dll deleted file mode 100644 index 9b9abbc31..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/I18N.West/4.0.0.0__0738eb9f132ed756/I18N.West.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bda25073b142b7ecffc84d2d904832a5f308a396fa03066b530fa7a710346378 -size 72192 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/I18N/4.0.0.0__0738eb9f132ed756/I18N.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/I18N/4.0.0.0__0738eb9f132ed756/I18N.dll deleted file mode 100644 index d0a0e3074..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/I18N/4.0.0.0__0738eb9f132ed756/I18N.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7b1751c0b83ad11befc6089275d6b94062633f51da242273de92d8d51b70a41 -size 39424 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/IBM.Data.DB2/1.0.0.0__7c307b91aa13d208/IBM.Data.DB2.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/IBM.Data.DB2/1.0.0.0__7c307b91aa13d208/IBM.Data.DB2.dll deleted file mode 100644 index 80ca4e06f..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/IBM.Data.DB2/1.0.0.0__7c307b91aa13d208/IBM.Data.DB2.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d36c975b32a20f9f4822e4b3c8dc35f686d6a4f421e9ad9f8950b35be90f2ebf -size 72192 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/ICSharpCode.SharpZipLib/4.84.0.0__1b03e6acf1164f73/ICSharpCode.SharpZipLib.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/ICSharpCode.SharpZipLib/4.84.0.0__1b03e6acf1164f73/ICSharpCode.SharpZipLib.dll deleted file mode 100644 index 3867e2457..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/ICSharpCode.SharpZipLib/4.84.0.0__1b03e6acf1164f73/ICSharpCode.SharpZipLib.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1ce584cb5061d6acdc50018af5ed6c8f782e3302d07ea83990772ed8f7c08ec -size 124928 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Microsoft.CSharp/4.0.0.0__b03f5f7f11d50a3a/Microsoft.CSharp.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Microsoft.CSharp/4.0.0.0__b03f5f7f11d50a3a/Microsoft.CSharp.dll deleted file mode 100644 index a5773519c..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Microsoft.CSharp/4.0.0.0__b03f5f7f11d50a3a/Microsoft.CSharp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e71b7b997b3eaada1810000ee4284f00d57096f8455266d6bbf8969dc610b19 -size 300544 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Microsoft.Web.Infrastructure/1.0.0.0__31bf3856ad364e35/Microsoft.Web.Infrastructure.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Microsoft.Web.Infrastructure/1.0.0.0__31bf3856ad364e35/Microsoft.Web.Infrastructure.dll deleted file mode 100644 index 3877e34a5..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Microsoft.Web.Infrastructure/1.0.0.0__31bf3856ad364e35/Microsoft.Web.Infrastructure.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d4e756527545ee2deada56ec255c6c433d15cf9237bd8cbe2c12cb01451edb5 -size 16896 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Btls.Interface/4.0.0.0__0738eb9f132ed756/Mono.Btls.Interface.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Btls.Interface/4.0.0.0__0738eb9f132ed756/Mono.Btls.Interface.dll deleted file mode 100644 index 58b5012ad..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Btls.Interface/4.0.0.0__0738eb9f132ed756/Mono.Btls.Interface.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa07a66bebf088cba7c34b0821c56eac9b9bbe39ead30f2c862d29f99b881c0f -size 22528 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.CSharp/4.0.0.0__0738eb9f132ed756/Mono.CSharp.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.CSharp/4.0.0.0__0738eb9f132ed756/Mono.CSharp.dll deleted file mode 100644 index 1ae4f3c79..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.CSharp/4.0.0.0__0738eb9f132ed756/Mono.CSharp.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8ae2f11fcfd1de8dbd5efd26cab4338f30048328c6d874045b6f344d12c4e7b -size 1354752 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Cairo/4.0.0.0__0738eb9f132ed756/Mono.Cairo.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Cairo/4.0.0.0__0738eb9f132ed756/Mono.Cairo.dll deleted file mode 100644 index 232cf84bd..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Cairo/4.0.0.0__0738eb9f132ed756/Mono.Cairo.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c3bbfb9c6520d68eae80611c84e3178cc71d5175b63a43c6cc4b1a83fa3c460 -size 62464 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Cecil/0.11.0.0__0738eb9f132ed756/Mono.Cecil.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Cecil/0.11.0.0__0738eb9f132ed756/Mono.Cecil.dll deleted file mode 100644 index 2543d56b1..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Cecil/0.11.0.0__0738eb9f132ed756/Mono.Cecil.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4bc5a5e26874d888cb920443c522e7b7cef8d0af3b0294f535e752e78cb40d45 -size 342528 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.CompilerServices.SymbolWriter/4.0.0.0__0738eb9f132ed756/Mono.CompilerServices.SymbolWriter.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.CompilerServices.SymbolWriter/4.0.0.0__0738eb9f132ed756/Mono.CompilerServices.SymbolWriter.dll deleted file mode 100644 index ca7cbdf57..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.CompilerServices.SymbolWriter/4.0.0.0__0738eb9f132ed756/Mono.CompilerServices.SymbolWriter.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ec053bb41a645f3cf64a31f7cd189c36f02dee8f14bc0d14b76a0a9946a6dea -size 44032 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Data.Sqlite/4.0.0.0__0738eb9f132ed756/Mono.Data.Sqlite.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Data.Sqlite/4.0.0.0__0738eb9f132ed756/Mono.Data.Sqlite.dll deleted file mode 100644 index 8cb4c423b..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Data.Sqlite/4.0.0.0__0738eb9f132ed756/Mono.Data.Sqlite.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ada04dec59c366f49378cf3ce6da279cf1997ac5de777d17dfd95b67b5a2c7c7 -size 166912 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Debugger.Soft/4.0.0.0__0738eb9f132ed756/Mono.Debugger.Soft.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Debugger.Soft/4.0.0.0__0738eb9f132ed756/Mono.Debugger.Soft.dll deleted file mode 100644 index 630e819aa..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Debugger.Soft/4.0.0.0__0738eb9f132ed756/Mono.Debugger.Soft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2729b3f9b086f78a113bea78e7c1df6d3266f31cfaf3c8876b63854953e14da2 -size 160256 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Http/4.0.0.0__0738eb9f132ed756/Mono.Http.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Http/4.0.0.0__0738eb9f132ed756/Mono.Http.dll deleted file mode 100644 index 30f19926b..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Http/4.0.0.0__0738eb9f132ed756/Mono.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b96c42a802ad1d73bf3616c12fba78ecaa7025963ddf2061eb5c319107215080 -size 27136 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Management/4.0.0.0__0738eb9f132ed756/Mono.Management.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Management/4.0.0.0__0738eb9f132ed756/Mono.Management.dll deleted file mode 100644 index 69bdcd103..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Management/4.0.0.0__0738eb9f132ed756/Mono.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19f2dc7746c9ac600a73e4572ed0ab788a2369b511ec59c8d913481b9ca358ea -size 13312 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Messaging/4.0.0.0__0738eb9f132ed756/Mono.Messaging.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Messaging/4.0.0.0__0738eb9f132ed756/Mono.Messaging.dll deleted file mode 100644 index 769804709..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Messaging/4.0.0.0__0738eb9f132ed756/Mono.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d03356f0fa9c87e43150720035c208eb79332f34dcce699f7a5ff044464fe1c1 -size 34816 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll deleted file mode 100644 index 8380a87e1..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:71b816db8f70a78f2db6ac9bbf5d28aa66cdd251c01b9da66fc3184bb0b0ceff -size 212480 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll deleted file mode 100644 index c39d1e799..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea4bd65d2261f1c5f3c22b592734b3079270365e827f4ca785853b9c38b291bd -size 314368 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Simd/4.0.0.0__0738eb9f132ed756/Mono.Simd.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Simd/4.0.0.0__0738eb9f132ed756/Mono.Simd.dll deleted file mode 100644 index 31d492f84..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Simd/4.0.0.0__0738eb9f132ed756/Mono.Simd.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a21917597c63580bf1b61d72bc25470c02db980e4e7944b3d1fb4a00044ae603 -size 67072 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Tasklets/4.0.0.0__0738eb9f132ed756/Mono.Tasklets.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Tasklets/4.0.0.0__0738eb9f132ed756/Mono.Tasklets.dll deleted file mode 100644 index 7796e9cc4..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.Tasklets/4.0.0.0__0738eb9f132ed756/Mono.Tasklets.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb2b392cf61e9c087ca675ad20941891d0859ab79a615502194c3a8571f5d76d -size 11264 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.WebBrowser/4.0.0.0__0738eb9f132ed756/Mono.WebBrowser.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.WebBrowser/4.0.0.0__0738eb9f132ed756/Mono.WebBrowser.dll deleted file mode 100644 index db8880016..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Mono.WebBrowser/4.0.0.0__0738eb9f132ed756/Mono.WebBrowser.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:162bb5bdf3dfe9e8a6efb36db0de18fae43acbe99841bae92c487716b4771a09 -size 166912 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Novell.Directory.Ldap/4.0.0.0__0738eb9f132ed756/Novell.Directory.Ldap.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Novell.Directory.Ldap/4.0.0.0__0738eb9f132ed756/Novell.Directory.Ldap.dll deleted file mode 100644 index c67722acb..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/Novell.Directory.Ldap/4.0.0.0__0738eb9f132ed756/Novell.Directory.Ldap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6299f3d85b0d92aac586261adf9b5b60ab837d048331334bda5183f292d9eee -size 246272 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/PEAPI/4.0.0.0__0738eb9f132ed756/PEAPI.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/PEAPI/4.0.0.0__0738eb9f132ed756/PEAPI.dll deleted file mode 100644 index 31e36da0a..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/PEAPI/4.0.0.0__0738eb9f132ed756/PEAPI.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c0717febe06ddf8109f918399d1338e4b67c1541337990f329ca586b1f44f07 -size 100352 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/SMDiagnostics/0.0.0.0__b77a5c561934e089/SMDiagnostics.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/SMDiagnostics/0.0.0.0__b77a5c561934e089/SMDiagnostics.dll deleted file mode 100644 index b545b0efd..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/SMDiagnostics/0.0.0.0__b77a5c561934e089/SMDiagnostics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:37dc880fad77b9c2ab3532f255967e39495269fdb968053b2ab8f20882aeb14f -size 38912 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll deleted file mode 100644 index f44584c27..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f458322c97eecffc8d640cbf09f43d85703f704680354c635bec7bbd024dc026 -size 84992 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll deleted file mode 100644 index af20838c3..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac791e97c0838233dc8d02e07ec9e68f07fca6315b8a7bbf33dda5888d89fa65 -size 24064 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll deleted file mode 100644 index 762529ae6..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:171d837d86c3fa9758beb58acbc2b3a81832be3708fbd9591cdbbcb98c21d2bd -size 122880 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll deleted file mode 100644 index 32dcd2569..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:841df1b9cde9dca76d04a9e2d19e56a537d588da58dafe8ee8028cb9bb94eb52 -size 1086464 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll deleted file mode 100644 index 936ce24d5..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f6ef57342af0458e475ccf9e85db2f21bf127107bcb70a5848269ce808c5ed5 -size 652800 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll deleted file mode 100644 index c9cbf3fe4..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a0d0f0bf49fab0e2c960fcecf47448043a73c41be42d10fb9ff8d3b71e99616 -size 173056 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll deleted file mode 100644 index b9b38cb69..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:042c179d7474f1a4ebcdce43ac162140da7ad8be28c3e760895e9f83fe352773 -size 2103296 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Design/4.0.0.0__b03f5f7f11d50a3a/System.Design.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Design/4.0.0.0__b03f5f7f11d50a3a/System.Design.dll deleted file mode 100644 index 7c4481f3c..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Design/4.0.0.0__b03f5f7f11d50a3a/System.Design.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:297db3332c96905892a6efe632bf5af20a590528691ccd6873ff9987250b3729 -size 275456 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll deleted file mode 100644 index f65db3960..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6bebc99eea99d8f15188efb2e4ff67186a3ec64765b0753dddbbea3cde10628 -size 94208 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Drawing.Design/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.Design.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Drawing.Design/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.Design.dll deleted file mode 100644 index 7dcd85f8e..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Drawing.Design/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.Design.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9eba5ba47dd1638d766cd8c937ddd254d10444160473cc37f1d12498f307a251 -size 30720 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll deleted file mode 100644 index f524217ba..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20723d7993a578a0a9b7696b0b265cb6a6967be42b73f3bf52a3d4ae4e219dc2 -size 491008 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll deleted file mode 100644 index 523c73020..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5f4fde63006fd55f9d74bc01f70014317b22e1ba0bb7f9b2634f8d451e614e6 -size 46592 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll deleted file mode 100644 index 8b07d9c1b..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38fd6e8e53b39b5eb0be5bbf87d2beff289b4cad5b20feada41a5017ee1fe61b -size 18432 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll deleted file mode 100644 index c425363a6..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6de4d1ae3396938358d2bfc8b14478041fa913d616f55fc75b6d909ece05b5f7 -size 115200 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll deleted file mode 100644 index 83b8460f5..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:978998b92f9d876064187943fec584cd4af3d8dd6c796054432fce1173c429f0 -size 17408 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll deleted file mode 100644 index 5e2f85eb2..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3df48b930d479a7f15c5eb6533d6d4d84fbe6b612aec602a57cabbd72e33165c -size 139776 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll deleted file mode 100644 index 96e108ab6..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f083379005761ac1b31b1235a893dfff36febd8df0253a3b2b66013abd8b3098 -size 49664 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll deleted file mode 100644 index e4d47e2f2..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b82dd8058f7a203f9eba6eedbbf27e1bc20bede8e3544a8e0975c49cf221f33e -size 75776 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll deleted file mode 100644 index 7182a3519..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e535958942e02364cedf0b04e35cbef5f1e29317fb87dd77577f73277f5ba6e -size 518656 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll deleted file mode 100644 index 984c9c016..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b4b7015332cb523299a7587f1c6e3e52db99b9588bae6123dad9dd016173b28 -size 27136 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll deleted file mode 100644 index 39f8b22c1..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5de962cf057f3cf2ee4cf0fb19e8ea11c45eeb790caa7afcad6bfcb8faaf334 -size 281088 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll deleted file mode 100644 index 8d8be1c5a..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7798088c72df4263dfdeb0de6ecdea151cfbb14e8c95a40ea577f9c6b4a3ae63 -size 13312 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll deleted file mode 100644 index 9ffe05fdc..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5d537d6b04a4fa0ad752522553319c72f248e913f5cd6e6eac920e98d39de20 -size 12288 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll deleted file mode 100644 index b258d94ff..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7983522e6cfe1c69dae2a7c287788ff7c966543dd89c790a9a09846b1ec1e149 -size 119808 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll deleted file mode 100644 index 8fad976d2..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75089c6efdf7783f6a32e6f07a88b2db22cb7ac7c03bbe27600df40c72764136 -size 72192 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll deleted file mode 100644 index c3ac14b98..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:540b736958f2ec82503870fa37dfe9f1483cbf3ee488ddc20b2fddc450a1a439 -size 107520 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll deleted file mode 100644 index 02d050742..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9fdbaec0c35ab7695edda6dbf056b575971ab62110109a2063f728b6ac727539 -size 119808 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll deleted file mode 100644 index f542d736d..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f3d6559dde02956fec32b85e524b90c08eb7e49327eb805e6ee7ddf8de29d8bd -size 38912 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll deleted file mode 100644 index a13995f3e..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7dba5fee490e094d299f0a353de920e2cc59c95b47bb3dc62243261200a6e8c3 -size 933888 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll deleted file mode 100644 index f26668df8..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c7b696f0cf3925d47544194da48849e2bbbe828d417ffb855d9000f612fcfc7 -size 308224 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll deleted file mode 100644 index 7dba3b614..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f879fc8feb15132b1d5abb381b6e75b07311ba3cf0aadd62fec8f6caf40b8aa9 -size 13312 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll deleted file mode 100644 index 01a8182b0..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c5daa3a9c85ef83c90ffa836e80a13629ada71b3fa50c97042e3c1575838be2 -size 141312 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll deleted file mode 100644 index 5174ecc87..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30c0b4cab4a456300587aa1160cbdcd28cf7f914d5bb5dd41017965ace26b53b -size 215040 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll deleted file mode 100644 index e31805117..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef364e6e464451d33f779a62b406a990656236f9e1f2c45aa2a259a228c7984c -size 37376 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll deleted file mode 100644 index e63adfa9c..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa78021c3462174d441e63af7df80d7833013e0a2db32cb0f825aa6a7ef9c4e6 -size 79360 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll deleted file mode 100644 index 7ffb3e5e5..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68e05e15abfdd316ff2fddb1a256f47a571c5c7bfdc21f88434db8839791f114 -size 1427456 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll deleted file mode 100644 index c85b50f20..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e24043ad6c15be45eab0669aec7fb2b145fbc35b4142637850567bc3ae1b774 -size 47616 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll deleted file mode 100644 index 5c702d264..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce7ab1ca45149be5d51c27feb3fd807c8ab30d31b3cf392a413684ef00305102 -size 34304 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll deleted file mode 100644 index 6c41ad996..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b88d4770f40c8ca84baa9a2927c2c93d9f52137e12fe77007535e97a1ee27162 -size 12800 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll deleted file mode 100644 index 88a5642e8..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:431c9a1572b254894f94ecbafb90f30576c504808b7c98b0a40b7ca41042ef58 -size 33792 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll deleted file mode 100644 index 30291b487..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28f104232217e8b3c7244c9b045b87eec1cb3164472d521b31c885d0cf2f7770 -size 69120 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Extensions.Design/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.Design.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Extensions.Design/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.Design.dll deleted file mode 100644 index b84978722..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Extensions.Design/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.Design.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3148c19c2f3e8bb987309029a41f4d9c2c279ee43d55114f000703cad97afa8d -size 15360 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll deleted file mode 100644 index 48525b557..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ab2086183488192f048f416fb0b54e021f368c84a52a60f91a23463f4bd22a8 -size 745984 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll deleted file mode 100644 index 1d682e1df..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d147cf27b3c69eff9ca5394fff06e5971e4640d21bf7c2ac0249b2dc4781a24 -size 88064 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll deleted file mode 100644 index 2419c1290..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19f1175c6fe95bfc6faebde9846e8800b8d2df627d38bf0b69b1b227045b0899 -size 56832 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll deleted file mode 100644 index af59162d8..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c587182797071e50c9a4638cbaf989867f84c32a726fe8bb9b3eb6736b7dc0d -size 326144 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll deleted file mode 100644 index 87d13add9..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5cf41fb40c84a5adfc175da9f5dd8d751cd79dc3e30db2db78c9223054ec5400 -size 419840 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll deleted file mode 100644 index 8c209f4f8..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a8dff7c71574d21c940ed549e70ed7871638a171151ead31a6940ffd24571c7 -size 254976 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll deleted file mode 100644 index fe56843fa..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:277d420160bb4a403c5d09efca1c124024df59bc965fa9623e7859668579695f -size 12288 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll deleted file mode 100644 index 7b8c930e8..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba086c0b92f897513e461d8f2a51825b1502c3de19c70f68dec9ec0357fdd012 -size 787456 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll deleted file mode 100644 index bd7835766..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:000649acd357461c3be7c150d46f401a4990ea57358c60920e8b214bba8deb70 -size 39424 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll deleted file mode 100644 index 45ffe3d6d..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2632b11dd1ac054c4cc1fb2a5d77def4ec4ad4f421c32f16652efe7c2f68a1bb -size 38400 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll deleted file mode 100644 index df926edac..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd9acef3550c397174d37ac7b8fb1b178e0abb61da7f5bab03841dc1242e98b1 -size 196608 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll deleted file mode 100644 index 2990b56bd..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5496200edae4f96376df62c259d98ca4c992dae6c53a7bb5335c9f9d5ed6883b -size 3028992 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll deleted file mode 100644 index e2e973d06..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e05d2da77f22b7d291ee4a86871e26ca63d414e3f0425f184bf48cf0f1ed554a -size 2899968 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll deleted file mode 100644 index 53e99a4d0..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f1718df6b2e47a13f7f04092ddf1e3de63e57df3a3ac600f6da16abf46ce0d1 -size 188928 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll deleted file mode 100644 index 66dcb0849..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89153954aeb08c417dc01a9b83640f7115ca7a7c0a7db5e2819d0990a2c4c1a4 -size 137728 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll deleted file mode 100644 index 9863a3987..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8cbd08fb24fecba4e19b0bc86020d320413a35fbb4054db9e99e7e5bcbdf51b5 -size 3174400 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll deleted file mode 100644 index 10ac90392..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:012cd3b4a43b9b91d9dfbf04931d827ce1586fd2f1b26c97b524a0ecbf7c1484 -size 2665984 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll deleted file mode 100644 index 2e43ab76f..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d764a633c03b1c51ddc8a9fc222db464f6da5cc556eba5fb998fb5093554d5e1 -size 161792 diff --git a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/cscompmgd/0.0.0.0__b03f5f7f11d50a3a/cscompmgd.dll b/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/cscompmgd/0.0.0.0__b03f5f7f11d50a3a/cscompmgd.dll deleted file mode 100644 index 71ef8812b..000000000 --- a/Source/Platforms/Mac/Binaries/Mono/lib/mono/gac/cscompmgd/0.0.0.0__b03f5f7f11d50a3a/cscompmgd.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a065cdd5b278031e79051ea982d4f3b606c71c812680f8b253b49bb5467b490c -size 18432 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libGenericCodeGen.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libGenericCodeGen.a new file mode 100644 index 000000000..b926a937e --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libGenericCodeGen.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0115536b7188af69c7125b92886ca77a04e23aec240ee9bb47731df579ff8c94 +size 11672 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libHLSL.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libHLSL.a new file mode 100644 index 000000000..c735cf5ea --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libHLSL.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e40cf2c8f5dce7763f1c09fcee454d3fb6b312c954e175bfbd1caf664136213 +size 496 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libIrrXML.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libIrrXML.a new file mode 100644 index 000000000..6bcd58a96 --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libIrrXML.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6aa0849de08ac7f7332c63941b6ed028c329971b7d0ce9de44580e46b7560f2d +size 519048 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libMachineIndependent.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libMachineIndependent.a new file mode 100644 index 000000000..bc8024197 --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libMachineIndependent.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f32c3476df04dde228b42f1cd7e26af6a724a1de58601c310ccd01ed9624f4a2 +size 3240520 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libOGLCompiler.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libOGLCompiler.a new file mode 100644 index 000000000..61d8157d6 --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libOGLCompiler.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e4945e2f608c5a5197de0df5cbc0f291d819d2085f40f1b1a7c9ddb7a0d56f5 +size 2072 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libOSDependent.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libOSDependent.a new file mode 100644 index 000000000..64a321f39 --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libOSDependent.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23680a612b619e436e94c120474389093bca5f8d4322414f94f43aed8a7de72c +size 2912 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXCharacterKinematic_static_64.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXCharacterKinematic_static_64.a new file mode 100644 index 000000000..21ed251bf --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXCharacterKinematic_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8cbdef34e59d57d3f6b9bc5e0b393e4c8992636ac901f55a3ce5ea0584be146 +size 156744 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXCommon_static_64.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXCommon_static_64.a new file mode 100644 index 000000000..740940a1f --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXCommon_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:429cb2fc283a3214e8a37694e0eb1248b2ea123b0e6f771de4d4ea5657a71aba +size 2983552 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXCooking_static_64.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXCooking_static_64.a new file mode 100644 index 000000000..d357ac48d --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXCooking_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e2b9f417c63a5d63f8ad6b20a57b5ef033c289670ec239d2d3c34d7833eeb2b +size 19576 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXExtensions_static_64.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXExtensions_static_64.a new file mode 100644 index 000000000..bd749149c --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXExtensions_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25c34a55361581939bea4f0ba6af1bb5a80d22a049a27df19c623de1f11cbdb5 +size 2586152 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXFoundation_static_64.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXFoundation_static_64.a new file mode 100644 index 000000000..505162f8d --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXFoundation_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9eab61d204438fbeda4afb358e0130936c11a3b8bd95b594a0fc7b50f7ad221c +size 60928 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXPvdSDK_static_64.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXPvdSDK_static_64.a new file mode 100644 index 000000000..393a297d3 --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXPvdSDK_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4280cac0d432972aa4e65d353aaa281d5f0d2645d961a302cfd901706e732f22 +size 295960 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXVehicle2_static_64.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXVehicle2_static_64.a new file mode 100644 index 000000000..30c480794 --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXVehicle2_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29efa3e19887030493da5ac7c87fe31de44c45355b558802007c297a7d16085f +size 122328 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXVehicle_static_64.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXVehicle_static_64.a new file mode 100644 index 000000000..593a87b1d --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysXVehicle_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a382342d8883b632682041400a27ec82040a7cb9f0cbb49b801573db8feeb74 +size 807784 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysX_static_64.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysX_static_64.a new file mode 100644 index 000000000..b4b5254d4 --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libPhysX_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c8e5fee01eafef0830329affcfe902ab007a3d4c31b1dd34bb39fe89d19bd2bd +size 3488152 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libSPIRV-Tools-opt.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libSPIRV-Tools-opt.a new file mode 100644 index 000000000..5d7781897 --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libSPIRV-Tools-opt.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:445b4b289982a7eb26eff14c8dca8349308b9a382f478de3cbe0a7bfa821ef7c +size 5320568 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libSPIRV-Tools.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libSPIRV-Tools.a new file mode 100644 index 000000000..2fa7106dc --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libSPIRV-Tools.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:468aa044894e9e79199dd0fc24d88f2e26d2e958eebfeaafe0f757a763089048 +size 2059768 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libSPIRV.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libSPIRV.a new file mode 100644 index 000000000..77fc416f3 --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libSPIRV.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:831f77515304bc22e2e7d4e9e6ac9f2ecaada062d3cbe28806b3166a2caeac91 +size 701864 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libassimp.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libassimp.a new file mode 100644 index 000000000..622b54e48 --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libassimp.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05ed7fbba9701903c4d488eebda74ff71316af984bda5b125ff4822e53c05f3a +size 66547240 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libcurl.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libcurl.a new file mode 100644 index 000000000..55ced1e45 --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libcurl.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:43793fb70a86f66e74f1dff9a0ae7d86089722ca3681189972e8e209756845f2 +size 489872 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libfreetype.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libfreetype.a new file mode 100644 index 000000000..e31bd6708 --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libfreetype.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0da8c77495ea68ee3a2b79cb51ee11910821645e2403a75fe3bc962dad7c63f3 +size 887200 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libglslang.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libglslang.a new file mode 100644 index 000000000..7e88c80ce --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libglslang.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59b13c4642da4bf6ee20647fafaaa0aa1fdce34a5f58ec92822974f28fcc100b +size 24368 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libogg.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libogg.a new file mode 100644 index 000000000..ed83ad02b --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libogg.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:793df4efc051d1f7b84cf091187f6664c6c1b573c0b9ae7d9d1e17bff40d849b +size 22504 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libopenal.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libopenal.a new file mode 100644 index 000000000..50e16252f --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libopenal.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b94c2ea831342ad274ec95aba3161dceba1334d36a6d620ec015e9f26170bc58 +size 1133976 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libvorbis.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libvorbis.a new file mode 100644 index 000000000..534706c4f --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libvorbis.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d3fdf83d67105870b4143a7e2411994fe937d1476646bc31ffe82f066a007a30 +size 222048 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libvorbisenc.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libvorbisenc.a new file mode 100644 index 000000000..70313d8d1 --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libvorbisenc.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:871c3d05c5803553b7b80d2f5e1619daa388cf2763d1bc21adbd5daa2097cb4a +size 688272 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libvorbisfile.a b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libvorbisfile.a new file mode 100644 index 000000000..b716bc0ec --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/ARM64/libvorbisfile.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:882d43670bbfdef7a1c12ca103ab6db89ea7e256dec22e24dd9e3a523c0cab70 +size 30608 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXCharacterKinematic_static_64.a b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXCharacterKinematic_static_64.a index 1d3731f16..b38a117c0 100644 --- a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXCharacterKinematic_static_64.a +++ b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXCharacterKinematic_static_64.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2cf7081f324d5bf8e967c8d48c4da241c08ba66445f748bd015047777f3445f4 -size 215640 +oid sha256:6201f28cb20c10f93698f55a6f01454a6a398a09aa896732c8b3bd37c0da19e1 +size 217064 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXCommon_static_64.a b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXCommon_static_64.a index 4fc99bdb5..07254dca5 100644 --- a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXCommon_static_64.a +++ b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXCommon_static_64.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4ec2a657d5477a68001a50e9aefe72f6d841aaba821dbb93a43d616977f88977 -size 2753520 +oid sha256:0e9a2122958ba9ce4b5ca0ea6fdddace71d266a4c37a014438fbb42163a301ac +size 3877848 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXCooking_static_64.a b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXCooking_static_64.a index 5657e7133..527267e56 100644 --- a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXCooking_static_64.a +++ b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXCooking_static_64.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f4086238bce0ad9af66b138a73985791527d93d1bc9d9704446850aaf8ea7a7c -size 368640 +oid sha256:ec3b8c11e2db5229c51b6351d153be9bd4f3de0fc778803cd54ba1b3d2c97090 +size 27312 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXExtensions_static_64.a b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXExtensions_static_64.a index e0c15aee3..44dce49fa 100644 --- a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXExtensions_static_64.a +++ b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXExtensions_static_64.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:30ad63973d25d799e8e3dcd35442a277fa71ba7f7cd77f30ef261b186bc42c1f -size 2072848 +oid sha256:df99a1b67e819ddcdb310fbd3aecf465f6cb0ed1f189c79a881c9c972cb67a10 +size 3113488 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXFoundation_static_64.a b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXFoundation_static_64.a index 891dda9f0..5c9c7f3cc 100644 --- a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXFoundation_static_64.a +++ b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXFoundation_static_64.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bd337d353b0a27b8ef7931540f00abb033fdaaa3199d02fbc09165bd0ebe990e -size 95112 +oid sha256:485841f6d7617bc2f9088978bf1ec50ca7941d36d3d80fc55ea027f0a577b3ed +size 91816 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXPvdSDK_static_64.a b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXPvdSDK_static_64.a index 1baf0d321..a2580d580 100644 --- a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXPvdSDK_static_64.a +++ b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXPvdSDK_static_64.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1ce7094a88ae99a4f0376d10a3c6350b63528c8c434bbf6ea4e840950082113e -size 383880 +oid sha256:92f922b47f99c8921f3a86ea36d635d0e98b13bd9287fed621e91cc9722ae7bf +size 380176 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXVehicle2_static_64.a b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXVehicle2_static_64.a new file mode 100644 index 000000000..d20c3206d --- /dev/null +++ b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXVehicle2_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:601168ea8753ce0db0123c097cd006ce40a79abafd7515c717744fa976fc3bc6 +size 165824 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXVehicle_static_64.a b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXVehicle_static_64.a index 55093ddad..ed3d321d4 100644 --- a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXVehicle_static_64.a +++ b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysXVehicle_static_64.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ceedf1ee2493bcbffe2ffbad59344df064613bc751e897d33d2af725b98b3eea -size 960504 +oid sha256:f7dc8d1820726a3a5f760c36fe5c2d670b2671a8c9fee94b720368365d7936f5 +size 973520 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysX_static_64.a b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysX_static_64.a index bfaf1a4fa..254b2f202 100644 --- a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysX_static_64.a +++ b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libPhysX_static_64.a @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a01e2f6a00c434fac09608791fad9bbcc0bdfbcf3ab6c4b33fca466f765c1f7f -size 4919264 +oid sha256:bdbb1284e3916dac1e31f20bd54003f6cda7ab47ad5c267c3c89c7235f8bb29a +size 4666008 diff --git a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libmonosgen-2.0.1.dylib b/Source/Platforms/Mac/Binaries/ThirdParty/x64/libmonosgen-2.0.1.dylib deleted file mode 100755 index 2d5bdca90..000000000 Binary files a/Source/Platforms/Mac/Binaries/ThirdParty/x64/libmonosgen-2.0.1.dylib and /dev/null differ diff --git a/Source/Platforms/UWP/Binaries/Mono/etc/mono/2.0/Browsers/Compat.browser b/Source/Platforms/UWP/Binaries/Mono/etc/mono/2.0/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/etc/mono/2.0/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/UWP/Binaries/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/UWP/Binaries/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/UWP/Binaries/Mono/etc/mono/2.0/machine.config b/Source/Platforms/UWP/Binaries/Mono/etc/mono/2.0/machine.config deleted file mode 100644 index 2577c81dd..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/etc/mono/2.0/machine.config +++ /dev/null @@ -1,280 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
- - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/UWP/Binaries/Mono/etc/mono/2.0/settings.map b/Source/Platforms/UWP/Binaries/Mono/etc/mono/2.0/settings.map deleted file mode 100644 index 9a52ccc02..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/etc/mono/2.0/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/UWP/Binaries/Mono/etc/mono/2.0/web.config b/Source/Platforms/UWP/Binaries/Mono/etc/mono/2.0/web.config deleted file mode 100644 index e1428f8c3..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/etc/mono/2.0/web.config +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.0/Browsers/Compat.browser b/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.0/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.0/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.0/machine.config b/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.0/machine.config deleted file mode 100644 index f3b71c43c..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.0/machine.config +++ /dev/null @@ -1,307 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - - -
- -
-
-
-
- - - - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
-
-
-
- - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.0/settings.map b/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.0/settings.map deleted file mode 100644 index 4c53aca67..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.0/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.0/web.config b/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.0/web.config deleted file mode 100644 index 2a7dfd2ed..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.0/web.config +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.5/Browsers/Compat.browser b/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.5/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.5/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.5/machine.config b/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.5/machine.config deleted file mode 100644 index 455709536..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.5/machine.config +++ /dev/null @@ -1,310 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
- - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - - -
- -
-
-
-
- - - - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
-
-
-
- - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.5/settings.map b/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.5/settings.map deleted file mode 100644 index 4c53aca67..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.5/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.5/web.config b/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.5/web.config deleted file mode 100644 index 324c529f0..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/etc/mono/4.5/web.config +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/UWP/Binaries/Mono/etc/mono/browscap.ini b/Source/Platforms/UWP/Binaries/Mono/etc/mono/browscap.ini deleted file mode 100644 index 1267e1deb..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/etc/mono/browscap.ini +++ /dev/null @@ -1,16979 +0,0 @@ -;;; Provided courtesy of http://browsers.garykeith.com -;;; Created on Wednesday, June 17, 2009 at 6:30 AM GMT - -[GJK_Browscap_Version] -Version=4476 -Released=Wed, 17 Jun 2009 06:30:21 -0000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DefaultProperties - -[DefaultProperties] -Browser=DefaultProperties -Version=0 -MajorVer=0 -MinorVer=0 -Platform=unknown -Alpha=false -Beta=false -Win16=false -Win32=false -Win64=false -Frames=false -IFrames=false -Tables=false -Cookies=false -BackgroundSounds=false -CDF=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -isBanned=false -isMobileDevice=false -isSyndicationReader=false -Crawler=false -CssVersion=0 -supportsCSS=false -AOL=false -aolVersion=0 -ECMAScriptVersion=0.0 -W3CDOMVersion=0.0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ask - -[Ask] -Parent=DefaultProperties -Browser=Ask -Frames=true -Tables=true -Crawler=true - -[Mozilla/?.0 (compatible; Ask Jeeves/Teoma*)] -Parent=Ask -Browser=Teoma - -[Mozilla/2.0 (compatible; Ask Jeeves)] -Parent=Ask -Browser=AskJeeves - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Baidu - -[Baidu] -Parent=DefaultProperties -Browser=Baidu -Frames=true -Tables=true -Crawler=true - -[BaiduImageSpider*] -Parent=Baidu -Browser=BaiduImageSpider - -[Baiduspider*] -Parent=Baidu -Browser=BaiDu - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google - -[Google] -Parent=DefaultProperties -Browser=Google -Frames=true -IFrames=true -Tables=true -JavaScript=true -Crawler=true - -[* (compatible; Googlebot-Mobile/2.1; *http://www.google.com/bot.html)] -Parent=Google -Browser=Googlebot-Mobile -Frames=false -IFrames=false -Tables=false - -[*Google Wireless Transcoder*] -Parent=Google -Browser=Google Wireless Transcoder - -[AdsBot-Google (?http://www.google.com/adsbot.html)] -Parent=Google -Browser=AdsBot-Google - -[Feedfetcher-Google-iGoogleGadgets;*] -Parent=Google -Browser=iGoogleGadgets -isBanned=true -isSyndicationReader=true - -[Feedfetcher-Google;*] -Parent=Google -Browser=Feedfetcher-Google -isBanned=true -isSyndicationReader=true - -[Google OpenSocial agent (http://www.google.com/feedfetcher.html)] -Parent=Google -Browser=Google OpenSocial - -[Google-Site-Verification/1.0] -Parent=Google -Browser=Google-Site-Verification - -[Google-Sitemaps/*] -Parent=Google -Browser=Google-Sitemaps - -[Googlebot-Image/*] -Parent=Google -Browser=Googlebot-Image -CDF=true - -[googlebot-urlconsole] -Parent=Google -Browser=googlebot-urlconsole - -[Googlebot-Video/1.0] -Parent=Google -Browser=Google-Video - -[Googlebot/2.1 (?http://www.google.com/bot.html)] -Parent=Google -Browser=Googlebot - -[Googlebot/2.1 (?http://www.googlebot.com/bot.html)] -Parent=Google -Browser=Googlebot - -[Googlebot/Test*] -Parent=Google -Browser=Googlebot/Test - -[gsa-crawler*] -Parent=Google -Browser=Google Search Appliance -isBanned=true - -[Mediapartners-Google*] -Parent=Google -Browser=Mediapartners-Google - -[Mozilla/4.0 (compatible; Google Desktop)] -Parent=Google -Browser=Google Desktop - -[Mozilla/4.0 (compatible; GoogleToolbar*)] -Parent=Google -Browser=Google Toolbar -isBanned=true - -[Mozilla/5.0 (compatible; Google Keyword Tool;*)] -Parent=Google -Browser=Google Keyword Tool - -[Mozilla/5.0 (compatible; Googlebot/2.1; ?http://www.google.com/bot.html)] -Parent=Google -Browser=Google Webmaster Tools - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Inktomi - -[Inktomi] -Parent=DefaultProperties -Browser=Inktomi -Frames=true -Tables=true -Crawler=true - -[* (compatible;YahooSeeker/M1A1-R2D2; *)] -Parent=Inktomi -Browser=YahooSeeker-Mobile -Frames=false -Tables=false - -[Mozilla/4.0] -Parent=Inktomi - -[Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)] -Parent=Inktomi -Win32=true - -[Mozilla/4.0 (compatible; Yahoo Japan; for robot study; kasugiya)] -Parent=Inktomi -Browser=Yahoo! RobotStudy -isBanned=true - -[Mozilla/5.0 (compatible; BMC/1.0 (Y!J-AGENT))] -Parent=Inktomi -Browser=Y!J-AGENT/BMC - -[Mozilla/5.0 (compatible; BMF/1.0 (Y!J-AGENT))] -Parent=Inktomi -Browser=Y!J-AGENT/BMF - -[Mozilla/5.0 (compatible; BMI/1.0 (Y!J-AGENT; 1.0))] -Parent=Inktomi -Browser=Y!J-AGENT/BMI - -[Mozilla/5.0 (compatible; Yahoo! DE Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Directory Engine - -[Mozilla/5.0 (compatible; Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html)] -Parent=Inktomi -Browser=Yahoo! Slurp China - -[Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Slurp -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Slurp - -[Mozilla/5.0 (compatible; Yahoo! Verifier/1.1)] -Parent=Inktomi -Browser=Yahoo! Verifier -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Slurp/cat; slurp@inktomi.com; http://www.inktomi.com/slurp.html)] -Parent=Inktomi -Browser=Slurp/cat - -[Mozilla/5.0 (Slurp/si; slurp@inktomi.com; http://www.inktomi.com/slurp.html)] -Parent=Inktomi - -[Mozilla/5.0 (Yahoo-MMCrawler/4.0; mailto:vertical-crawl-support@yahoo-inc.com)] -Parent=Inktomi -Browser=Yahoo-MMCrawler -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Scooter/*] -Parent=Inktomi -Browser=Scooter - -[Scooter/3.3Y!CrawlX] -Parent=Inktomi -Browser=Scooter/3.3Y!CrawlX -Version=3.3 -MajorVer=3 -MinorVer=3 - -[slurp] -Parent=Inktomi -Browser=slurp - -[Y!J-BSC/1.0*] -Parent=Inktomi -Browser=Y!J-BSC -Version=1.0 -MajorVer=1 -MinorVer=0 -isBanned=true - -[Y!J-SRD/1.0] -Parent=Inktomi -Browser=Y!J-SRD -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Yahoo Mindset] -Parent=Inktomi -Browser=Yahoo Mindset - -[Yahoo Pipes*] -Parent=Inktomi -Browser=Yahoo Pipes - -[Yahoo! Mindset] -Parent=Inktomi -Browser=Yahoo! Mindset - -[Yahoo! Slurp/Site Explorer] -Parent=Inktomi -Browser=Yahoo! Site Explorer - -[Yahoo-Blogs/*] -Parent=Inktomi -Browser=Yahoo-Blogs - -[Yahoo-MMAudVid*] -Parent=Inktomi -Browser=Yahoo-MMAudVid - -[Yahoo-MMCrawler*] -Parent=Inktomi -Browser=Yahoo-MMCrawler -isBanned=true - -[YahooFeedSeeker*] -Parent=Inktomi -Browser=YahooFeedSeeker -isSyndicationReader=true -Crawler=false - -[YahooSeeker/*] -Parent=Inktomi -Browser=YahooSeeker -isMobileDevice=true - -[YahooSeeker/CafeKelsa (compatible; Konqueror/3.2; FreeBSD*) (KHTML, like Gecko)] -Parent=Inktomi -Browser=YahooSeeker/CafeKelsa - -[YahooSeeker/CafeKelsa-dev (compatible; Konqueror/3.2; FreeBSD*) (KHTML, like Gecko)] -Parent=Inktomi - -[YahooVideoSearch*] -Parent=Inktomi -Browser=YahooVideoSearch - -[YahooYSMcm*] -Parent=Inktomi -Browser=YahooYSMcm - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN - -[MSN] -Parent=DefaultProperties -Browser=MSN -Frames=true -Tables=true -Crawler=true - -[adidxbot/1.1 (?http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=adidxbot - -[librabot/1.0 (*)] -Parent=MSN -Browser=librabot - -[llssbot/1.0] -Parent=MSN -Browser=llssbot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MSMOBOT/1.1*] -Parent=MSN -Browser=msnbot-mobile -Version=1.1 -MajorVer=1 -MinorVer=1 - -[MSNBot-Academic/1.0*] -Parent=MSN -Browser=MSNBot-Academic -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot-media/1.0*] -Parent=MSN -Browser=msnbot-media -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot-media/1.1*] -Parent=MSN -Browser=msnbot-media -Version=1.1 -MajorVer=1 -MinorVer=1 - -[MSNBot-News/1.0*] -Parent=MSN -Browser=MSNBot-News -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MSNBot-NewsBlogs/1.0*] -Parent=MSN -Browser=MSNBot-NewsBlogs -Version=1 -MajorVer=1 -MinorVer=0 - -[msnbot-products] -Parent=MSN -Browser=msnbot-products - -[msnbot-webmaster/1.0 (*http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=msnbot-webmaster tools - -[msnbot/1.0*] -Parent=MSN -Browser=msnbot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot/1.1*] -Parent=MSN -Browser=msnbot -Version=1.1 -MajorVer=1 -MinorVer=1 - -[msnbot/2.0b*] -Parent=MSN -Version=2.0 -MajorVer=2 -MinorVer=0 -Beta=true - -[MSR-ISRCCrawler] -Parent=MSN -Browser=MSR-ISRCCrawler - -[renlifangbot/1.0 (?http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=renlifangbot - -[T-Mobile Dash Mozilla/4.0 (*) MSNBOT-MOBILE/1.1 (*)] -Parent=MSN -Browser=msnbot-mobile - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yahoo - -[Yahoo] -Parent=DefaultProperties -Browser=Yahoo -Frames=true -Tables=true -Crawler=true - -[Mozilla/4.0 (compatible; Y!J; for robot study*)] -Parent=Yahoo -Browser=Y!J - -[Mozilla/5.0 (Yahoo-Test/4.0*)] -Parent=Yahoo -Browser=Yahoo-Test -Version=4.0 -MajorVer=4 -MinorVer=0 - -[mp3Spider cn-search-devel at yahoo-inc dot com] -Parent=Yahoo -Browser=Yahoo! Media -isBanned=true - -[My Browser] -Parent=Yahoo -Browser=Yahoo! My Browser - -[Y!OASIS/*] -Parent=Yahoo -Browser=Y!OASIS -isBanned=true - -[YahooYSMcm/2.0.0] -Parent=Yahoo -Browser=YahooYSMcm -Version=2.0 -MajorVer=2 -MinorVer=0 -isBanned=true - -[YRL_ODP_CRAWLER] -Parent=Yahoo -Browser=YRL_ODP_CRAWLER -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yandex - -[Yandex] -Parent=DefaultProperties -Browser=Yandex -Frames=true -IFrames=true -Tables=true -Cookies=true -Crawler=true - -[Mozilla/4.0 (compatible; MSIE 5.0; YANDEX)] -Parent=Yandex - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9) Gecko VisualParser/3.0] -Parent=Yandex -Browser=VisualParser -isBanned=true - -[YaDirectBot/*] -Parent=Yandex -Browser=YaDirectBot - -[Yandex/*] -Parent=Yandex - -[YandexBlog/*] -Parent=Yandex -Browser=YandexBlog -isSyndicationReader=true - -[YandexSomething/*] -Parent=Yandex -Browser=YandexSomething -isSyndicationReader=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Best of the Web - -[Best of the Web] -Parent=DefaultProperties -Browser=Best of the Web -Frames=true -Tables=true - -[Mozilla/4.0 (compatible; BOTW Feed Grabber; *http://botw.org)] -Parent=Best of the Web -Browser=BOTW Feed Grabber -isSyndicationReader=true -Crawler=false - -[Mozilla/4.0 (compatible; BOTW Spider; *http://botw.org)] -Parent=Best of the Web -Browser=BOTW Spider -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Boitho - -[Boitho] -Parent=DefaultProperties -Browser=Boitho -Frames=true -Tables=true -Crawler=true - -[boitho.com-dc/*] -Parent=Boitho -Browser=boitho.com-dc - -[boitho.com-robot/*] -Parent=Boitho -Browser=boitho.com-robot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Convera - -[Convera] -Parent=DefaultProperties -Browser=Convera -Frames=true -Tables=true -Crawler=true - -[ConveraCrawler/*] -Parent=Convera -Browser=ConveraCrawler - -[ConveraMultiMediaCrawler/0.1*] -Parent=Convera -Browser=ConveraMultiMediaCrawler -Version=0.1 -MajorVer=0 -MinorVer=1 - -[CrawlConvera*] -Parent=Convera -Browser=CrawlConvera - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DotBot - -[DotBot] -Parent=DefaultProperties -Browser=DotBot -Frames=true -Tables=true -isBanned=true -Crawler=true - -[DotBot/* (http://www.dotnetdotcom.org/*)] -Parent=DotBot - -[Mozilla/5.0 (compatible; DotBot/*; http://www.dotnetdotcom.org/*)] -Parent=DotBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Entireweb - -[Entireweb] -Parent=DefaultProperties -Browser=Entireweb -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[Mozilla/4.0 (compatible; SpeedySpider; www.entireweb.com)] -Parent=Entireweb - -[Speedy Spider (*Beta/*)] -Parent=Entireweb - -[Speedy?Spider?(http://www.entireweb.com*)] -Parent=Entireweb - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Envolk - -[Envolk] -Parent=DefaultProperties -Browser=Envolk -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[envolk/* (?http://www.envolk.com/envolk*)] -Parent=Envolk - -[envolk?ITS?spider/* (?http://www.envolk.com/envolk*)] -Parent=Envolk - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Exalead - -[Exalead] -Parent=DefaultProperties -Browser=Exalead -Frames=true -Tables=true -isBanned=true -Crawler=true - -[Exabot-Images/1.0] -Parent=Exalead -Browser=Exabot-Images -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Exabot-Test/*] -Parent=Exalead -Browser=Exabot-Test - -[Exabot/2.0] -Parent=Exalead -Browser=Exabot - -[Exabot/3.0] -Parent=Exalead -Browser=Exabot -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Liberate - -[Exalead NG/*] -Parent=Exalead -Browser=Exalead NG -isBanned=true - -[Mozilla/5.0 (compatible; Exabot-Images/3.0;*)] -Parent=Exalead -Browser=Exabot-Images - -[Mozilla/5.0 (compatible; Exabot/3.0 (BiggerBetter/tests);*)] -Parent=Exalead -Browser=Exabot/BiggerBetter/tests - -[Mozilla/5.0 (compatible; Exabot/3.0;*)] -Parent=Exalead -Browser=Exabot -isBanned=false - -[Mozilla/5.0 (compatible; NGBot/*)] -Parent=Exalead - -[ng/*] -Parent=Exalead -Browser=Exalead Previewer -Version=1.0 -MajorVer=1 -MinorVer=0 -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fast/AllTheWeb - -[Fast/AllTheWeb] -Parent=DefaultProperties -Browser=Fast/AllTheWeb -Alpha=true -Beta=true -Win16=true -Win32=true -Win64=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -isBanned=true -isMobileDevice=true -isSyndicationReader=true -Crawler=true - -[*FAST Enterprise Crawler*] -Parent=Fast/AllTheWeb -Browser=FAST Enterprise Crawler - -[FAST Data Search Document Retriever/4.0*] -Parent=Fast/AllTheWeb -Browser=FAST Data Search Document Retriever - -[FAST MetaWeb Crawler (helpdesk at fastsearch dot com)] -Parent=Fast/AllTheWeb -Browser=FAST MetaWeb Crawler - -[Fast PartnerSite Crawler*] -Parent=Fast/AllTheWeb -Browser=FAST PartnerSite - -[FAST-WebCrawler/*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler - -[FAST-WebCrawler/*/FirstPage*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/FirstPage - -[FAST-WebCrawler/*/Fresh*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/Fresh - -[FAST-WebCrawler/*/PartnerSite*] -Parent=Fast/AllTheWeb -Browser=FAST PartnerSite - -[FAST-WebCrawler/*?Multimedia*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/Multimedia - -[FastSearch Web Crawler for*] -Parent=Fast/AllTheWeb -Browser=FastSearch Web Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Gigabot - -[Gigabot] -Parent=DefaultProperties -Browser=Gigabot -Frames=true -IFrames=true -Tables=true -Crawler=true - -[Gigabot*] -Parent=Gigabot - -[GigabotSiteSearch/*] -Parent=Gigabot -Browser=GigabotSiteSearch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ilse - -[Ilse] -Parent=DefaultProperties -Browser=Ilse -Frames=true -Tables=true -Crawler=true - -[IlseBot/*] -Parent=Ilse - -[INGRID/?.0*] -Parent=Ilse -Browser=Ilse - -[Mozilla/3.0 (INGRID/*] -Parent=Ilse -Browser=Ilse - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iVia Project - -[iVia Project] -Parent=DefaultProperties -Browser=iVia Project -Frames=true -IFrames=true -Tables=true -Crawler=true - -[DataFountains/DMOZ Downloader*] -Parent=iVia Project -Browser=DataFountains/DMOZ Downloader -isBanned=true - -[DataFountains/DMOZ Feature Vector Corpus Creator*] -Parent=iVia Project -Browser=DataFountains/DMOZ Feature Vector Corpus - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Jayde Online - -[Jayde Online] -Parent=DefaultProperties -Browser=Jayde Online -Frames=true -Tables=true -Crawler=true - -[ExactSeek Crawler/*] -Parent=Jayde Online -Browser=ExactSeek Crawler - -[exactseek-pagereaper-* (crawler@exactseek.com)] -Parent=Jayde Online -Browser=exactseek-pagereaper -isBanned=true - -[exactseek.com] -Parent=Jayde Online -Browser=exactseek.com - -[Jayde Crawler*] -Parent=Jayde Online -Browser=Jayde Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycos - -[Lycos] -Parent=DefaultProperties -Browser=Lycos -Frames=true -Tables=true -Crawler=true - -[Lycos*] -Parent=Lycos -Browser=Lycos - -[Lycos-Proxy] -Parent=Lycos -Browser=Lycos-Proxy - -[Lycos-Spider_(modspider)] -Parent=Lycos -Browser=Lycos-Spider_(modspider) - -[Lycos-Spider_(T-Rex)] -Parent=Lycos -Browser=Lycos-Spider_(T-Rex) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Naver - -[Naver] -Parent=DefaultProperties -Browser=Naver -isBanned=true -Crawler=true - -[Cowbot-* (NHN Corp*naver.com)] -Parent=Naver -Browser=Naver Cowbot - -[Mozilla/4.0 (compatible; NaverBot/*; *)] -Parent=Naver - -[Mozilla/4.0 (compatible; NaverBot/*; nhnbot@naver.com)] -Parent=Naver -Browser=Naver NaverBot - -[NaverBot-* (NHN Corp*naver.com)] -Parent=Naver -Browser=Naver NHN Corp - -[Yeti/*] -Parent=Naver -Browser=Yeti - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Snap - -[Snap] -Parent=DefaultProperties -Browser=Snap -isBanned=true -Crawler=true - -[Mozilla/5.0 (SnapPreviewBot) Gecko/* Firefox/*] -Parent=Snap - -[Snapbot/*] -Parent=Snap - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sogou - -[Sogou] -Parent=DefaultProperties -Browser=Sogou -Frames=true -Tables=true -isBanned=true -Crawler=true - -[shaboyi spider] -Parent=Sogou -Browser=Sogou/Shaboyi Spider - -[Sogou develop spider/*] -Parent=Sogou -Browser=Sogou Develop Spider - -[Sogou head spider*] -Parent=Sogou -Browser=Sogou/HEAD Spider - -[sogou js robot(*)] -Parent=Sogou - -[Sogou Orion spider/*] -Parent=Sogou -Browser=Sogou Orion spider - -[Sogou Pic Agent] -Parent=Sogou -Browser=Sogou/Image Crawler - -[Sogou Pic Spider] -Parent=Sogou -Browser=Sogou Pic Spider - -[Sogou Push Spider/*] -Parent=Sogou -Browser=Sogou Push Spider - -[sogou spider] -Parent=Sogou -Browser=Sogou/Spider - -[sogou web spider*] -Parent=Sogou -Browser=sogou web spider - -[Sogou-Test-Spider/*] -Parent=Sogou -Browser=Sogou-Test-Spider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; YodaoBot - -[YodaoBot] -Parent=DefaultProperties -Browser=YodaoBot -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[Mozilla/5.0 (compatible; YodaoBot/1.*)] -Parent=YodaoBot - -[Mozilla/5.0 (compatible;YodaoBot-Image/1.*)] -Parent=YodaoBot -Browser=YodaoBot-Image - -[WAP_Browser/5.0 (compatible; YodaoBot/1.*)] -Parent=YodaoBot - -[YodaoBot/1.* (*)] -Parent=YodaoBot - -[Best Whois (http://www.bestwhois.net/)] -Parent=DNS Tools -Browser=Best Whois - -[DNSGroup/*] -Parent=DNS Tools -Browser=DNS Group Crawler - -[NG-Search/*] -Parent=Exalead -Browser=NG-SearchBot - -[TouchStone] -Parent=Feeds Syndicators -Browser=TouchStone -isSyndicationReader=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; General Crawlers - -[General Crawlers] -Parent=DefaultProperties -Browser=General Crawlers -Crawler=true - -[A .NET Web Crawler] -Parent=General Crawlers -isBanned=true - -[BabalooSpider/1.*] -Parent=General Crawlers -Browser=BabalooSpider - -[BilgiBot/*] -Parent=General Crawlers -Browser=BilgiBot -isBanned=true - -[bot/* (bot; *bot@bot.bot)] -Parent=General Crawlers -Browser=bot -isBanned=true - -[CyberPatrol*] -Parent=General Crawlers -Browser=CyberPatrol -isBanned=true - -[Cynthia 1.0] -Parent=General Crawlers -Browser=Cynthia -Version=1.0 -MajorVer=1 -MinorVer=0 - -[ddetailsbot (http://www.displaydetails.com)] -Parent=General Crawlers -Browser=ddetailsbot - -[DomainCrawler/1.0 (info@domaincrawler.com; http://www.domaincrawler.com/domains/view/*)] -Parent=General Crawlers -Browser=DomainCrawler - -[DomainsBotBot/1.*] -Parent=General Crawlers -Browser=DomainsBotBot -isBanned=true - -[DomainsDB.net MetaCrawler*] -Parent=General Crawlers -Browser=DomainsDB - -[Drupal (*)] -Parent=General Crawlers -Browser=Drupal - -[Dumbot (version *)*] -Parent=General Crawlers -Browser=Dumbfind - -[EuripBot/*] -Parent=General Crawlers -Browser=Europe Internet Portal - -[eventax/*] -Parent=General Crawlers -Browser=eventax - -[FANGCrawl/*] -Parent=General Crawlers -Browser=Safe-t.net Web Filtering Service -isBanned=true - -[favorstarbot/*] -Parent=General Crawlers -Browser=favorstarbot -isBanned=true - -[FollowSite.com (*)] -Parent=General Crawlers -Browser=FollowSite -isBanned=true - -[Gaisbot*] -Parent=General Crawlers -Browser=Gaisbot - -[Healthbot/Health_and_Longevity_Project_(HealthHaven.com) ] -Parent=General Crawlers -Browser=Healthbot -isBanned=true - -[hitcrawler_0.*] -Parent=General Crawlers -Browser=hitcrawler -isBanned=true - -[htdig/*] -Parent=General Crawlers -Browser=ht://Dig - -[http://hilfe.acont.de/bot.html ACONTBOT] -Parent=General Crawlers -Browser=ACONTBOT -isBanned=true - -[JetBrains*] -Parent=General Crawlers -Browser=Omea Pro - -[KakleBot - www.kakle.com/0.1] -Parent=General Crawlers -Browser=KakleBot - -[KBeeBot/0.*] -Parent=General Crawlers -Browser=KBeeBot -isBanned=true - -[Keyword Density/*] -Parent=General Crawlers -Browser=Keyword Density - -[LetsCrawl.com/1.0*] -Parent=General Crawlers -Browser=LetsCrawl.com -isBanned=true - -[Lincoln State Web Browser] -Parent=General Crawlers -Browser=Lincoln State Web Browser -isBanned=true - -[Links4US-Crawler,*] -Parent=General Crawlers -Browser=Links4US-Crawler -isBanned=true - -[Lorkyll *.* -- lorkyll@444.net] -Parent=General Crawlers -Browser=Lorkyll -isBanned=true - -[Lsearch/sondeur] -Parent=General Crawlers -Browser=Lsearch/sondeur -isBanned=true - -[LucidMedia ClickSense/4.?] -Parent=General Crawlers -Browser=LucidMedia-ClickSense -isBanned=true - -[MapoftheInternet.com?(?http://MapoftheInternet.com)] -Parent=General Crawlers -Browser=MapoftheInternet -isBanned=true - -[Marvin v0.3] -Parent=General Crawlers -Browser=MedHunt -Version=0.3 -MajorVer=0 -MinorVer=3 - -[masidani_bot_v0.6*] -Parent=General Crawlers -Browser=masidani_bot - -[Metaspinner/0.01 (Metaspinner; http://www.meta-spinner.de/; support@meta-spinner.de/)] -Parent=General Crawlers -Browser=Metaspinner/0.01 -Version=0.01 -MajorVer=0 -MinorVer=01 - -[metatagsdir/*] -Parent=General Crawlers -Browser=metatagsdir -isBanned=true - -[Microsoft Windows Network Diagnostics] -Parent=General Crawlers -Browser=Microsoft Windows Network Diagnostics -isBanned=true - -[Miva (AlgoFeedback@miva.com)] -Parent=General Crawlers -Browser=Miva - -[moget/*] -Parent=General Crawlers -Browser=Goo - -[Mozdex/0.7.2*] -Parent=General Crawlers -Browser=Mozdex - -[Mozilla Compatible (MS IE 3.01 WinNT)] -Parent=General Crawlers -isBanned=true - -[Mozilla/* (compatible; WebCapture*)] -Parent=General Crawlers -Browser=WebCapture - -[Mozilla/4.0 (compatible; DepSpid/*)] -Parent=General Crawlers -Browser=DepSpid - -[Mozilla/4.0 (compatible; MSIE *; Windows NT *; SV1)] -Parent=General Crawlers -Browser=AVG - -[Mozilla/4.0 (compatible; MSIE 4.01; Vonna.com b o t)] -Parent=General Crawlers -Browser=Vonna.com -isBanned=true - -[Mozilla/4.0 (compatible; MSIE 4.01; Windows95)] -Parent=General Crawlers -Win32=true - -[Mozilla/4.0 (compatible; MSIE 4.5; Windows 98; )] -Parent=General Crawlers -Win32=true - -[Mozilla/4.0 (compatible; MyFamilyBot/*)] -Parent=General Crawlers -Browser=MyFamilyBot - -[Mozilla/4.0 (compatible; N-Stealth)] -Parent=General Crawlers -Browser=N-Stealth - -[Mozilla/4.0 (compatible; Scumbot/*; Linux/*)] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.0 (compatible; Spider; Linux)] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.0 (compatible; Win32)] -Parent=General Crawlers -Browser=Unknown Crawler -isBanned=true - -[Mozilla/4.1] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.5] -Parent=General Crawlers -isBanned=true - -[Mozilla/5.0 (*http://gnomit.com/) Gecko/* Gnomit/1.0] -Parent=General Crawlers -Browser=Gnomit -isBanned=true - -[Mozilla/5.0 (compatible; AboutUsBot/*)] -Parent=General Crawlers -Browser=AboutUsBot -isBanned=true - -[Mozilla/5.0 (compatible; BuzzRankingBot/*)] -Parent=General Crawlers -Browser=BuzzRankingBot -isBanned=true - -[Mozilla/5.0 (compatible; Diffbot/0.1; http://www.diffbot.com)] -Parent=General Crawlers -Browser=Diffbot - -[Mozilla/5.0 (compatible; FirstSearchBot/1.0; *)] -Parent=General Crawlers -Browser=FirstSearchBot - -[mozilla/5.0 (compatible; genevabot http://www.healthdash.com)] -Parent=General Crawlers -Browser=Healthdash - -[Mozilla/5.0 (compatible; JadynAveBot; *http://www.jadynave.com/robot*] -Parent=General Crawlers -Browser=JadynAveBot -isBanned=true - -[Mozilla/5.0 (compatible; Kyluka crawl; http://www.kyluka.com/crawl.html; crawl@kyluka.com)] -Parent=General Crawlers -Browser=Kyluka - -[Mozilla/5.0 (compatible; MJ12bot/v1.2.*; http://www.majestic12.co.uk/bot.php*)] -Parent=General Crawlers -Browser=MJ12bot -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (compatible; MSIE 7.0 ?http://www.europarchive.org)] -Parent=General Crawlers -Browser=Europe Web Archive - -[Mozilla/5.0 (compatible; Seznam screenshot-generator 2.0;*)] -Parent=General Crawlers -Browser=Seznam screenshot-generator -isBanned=true - -[Mozilla/5.0 (compatible; Twingly Recon; http://www.twingly.com/)] -Parent=General Crawlers -Browser=Twingly Recon - -[Mozilla/5.0 (compatible; unwrapbot/2.*; http://www.unwrap.jp*)] -Parent=General Crawlers -Browser=UnWrap - -[Mozilla/5.0 (compatible; Vermut*)] -Parent=General Crawlers -Browser=Vermut - -[Mozilla/5.0 (compatible; Webbot/*)] -Parent=General Crawlers -Browser=Webbot.ru -isBanned=true - -[n4p_bot*] -Parent=General Crawlers -Browser=n4p_bot - -[nabot*] -Parent=General Crawlers -Browser=Nabot - -[NetCarta_WebMapper/*] -Parent=General Crawlers -Browser=NetCarta_WebMapper -isBanned=true - -[NetID.com Bot*] -Parent=General Crawlers -Browser=NetID.com Bot -isBanned=true - -[neTVision AG andreas.heidoetting@thomson-webcast.net] -Parent=General Crawlers -Browser=neTVision - -[NextopiaBOT*] -Parent=General Crawlers -Browser=NextopiaBOT - -[nicebot] -Parent=General Crawlers -Browser=nicebot -isBanned=true - -[niXXieBot?Foster*] -Parent=General Crawlers -Browser=niXXiebot-Foster - -[Nozilla/P.N (Just for IDS woring)] -Parent=General Crawlers -Browser=Nozilla/P.N -isBanned=true - -[Nudelsalat/*] -Parent=General Crawlers -Browser=Nudelsalat -isBanned=true - -[NV32ts] -Parent=General Crawlers -Browser=NV32ts -isBanned=true - -[Ocelli/*] -Parent=General Crawlers -Browser=Ocelli - -[OpenTaggerBot (http://www.opentagger.com/opentaggerbot.htm)] -Parent=General Crawlers -Browser=OpenTaggerBot - -[Oracle Enterprise Search] -Parent=General Crawlers -Browser=Oracle Enterprise Search -isBanned=true - -[Oracle Ultra Search] -Parent=General Crawlers -Browser=Oracle Ultra Search - -[Pajaczek/*] -Parent=General Crawlers -Browser=Pajaczek -isBanned=true - -[panscient.com] -Parent=General Crawlers -Browser=panscient.com -isBanned=true - -[Patwebbot (http://www.herz-power.de/technik.html)] -Parent=General Crawlers -Browser=Patwebbot - -[PDFBot (crawler@pdfind.com)] -Parent=General Crawlers -Browser=PDFBot - -[Pete-Spider/1.*] -Parent=General Crawlers -Browser=Pete-Spider -isBanned=true - -[PhpDig/*] -Parent=General Crawlers -Browser=PhpDig - -[PlantyNet_WebRobot*] -Parent=General Crawlers -Browser=PlantyNet -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PluckIt - -[PluckItCrawler/1.0 (*)] -Parent=General Crawlers -isMobileDevice=true - -[PMAFind] -Parent=General Crawlers -Browser=PMAFind -isBanned=true - -[Poodle_predictor_1.0] -Parent=General Crawlers -Browser=Poodle Predictor - -[QuickFinder Crawler] -Parent=General Crawlers -Browser=QuickFinder -isBanned=true - -[Radiation Retriever*] -Parent=General Crawlers -Browser=Radiation Retriever -isBanned=true - -[RedCarpet/*] -Parent=General Crawlers -Browser=RedCarpet -isBanned=true - -[RixBot (http://babelserver.org/rix)] -Parent=General Crawlers -Browser=RixBot - -[Rome Client (http://tinyurl.com/64t5n) Ver: 0.*] -Parent=General Crawlers -Browser=TinyURL - -[SBIder/*] -Parent=General Crawlers -Browser=SiteSell - -[ScollSpider/2.*] -Parent=General Crawlers -Browser=ScollSpider -isBanned=true - -[Search Fst] -Parent=General Crawlers -Browser=Search Fst - -[searchbot admin@google.com] -Parent=General Crawlers -Browser=searchbot -isBanned=true - -[Seeker.lookseek.com] -Parent=General Crawlers -Browser=LookSeek -isBanned=true - -[semanticdiscovery/*] -Parent=General Crawlers -Browser=Semantic Discovery - -[SeznamBot/*] -Parent=General Crawlers -Browser=SeznamBot -isBanned=true - -[Shelob (shelob@gmx.net)] -Parent=General Crawlers -Browser=Shelob -isBanned=true - -[shelob v1.*] -Parent=General Crawlers -Browser=shelob -isBanned=true - -[ShopWiki/1.0*] -Parent=General Crawlers -Browser=ShopWiki -Version=1.0 -MajorVer=1 -MinorVer=0 - -[ShowXML/1.0 libwww/5.4.0] -Parent=General Crawlers -Browser=ShowXML -isBanned=true - -[sitecheck.internetseer.com*] -Parent=General Crawlers -Browser=Internetseer - -[SMBot/*] -Parent=General Crawlers -Browser=SMBot - -[sohu*] -Parent=General Crawlers -Browser=sohu-search -isBanned=true - -[SpankBot*] -Parent=General Crawlers -Browser=SpankBot -isBanned=true - -[spider (tspyyp@tom.com)] -Parent=General Crawlers -Browser=spider (tspyyp@tom.com) -isBanned=true - -[Sunrise/0.*] -Parent=General Crawlers -Browser=Sunrise -isBanned=true - -[Superpages URL Verification Engine] -Parent=General Crawlers -Browser=Superpages - -[Surf Knight] -Parent=General Crawlers -Browser=Surf Knight -isBanned=true - -[SurveyBot/*] -Parent=General Crawlers -Browser=SurveyBot -isBanned=true - -[SynapticSearch/AI Crawler 1.?] -Parent=General Crawlers -Browser=SynapticSearch -isBanned=true - -[SyncMgr] -Parent=General Crawlers -Browser=SyncMgr - -[Tagyu Agent/1.0] -Parent=General Crawlers -Browser=Tagyu - -[Talkro Web-Shot/*] -Parent=General Crawlers -Browser=Talkro Web-Shot -isBanned=true - -[Tecomi Bot (http://www.tecomi.com/bot.htm)] -Parent=General Crawlers -Browser=Tecomi - -[TheInformant*] -Parent=General Crawlers -Browser=TheInformant -isBanned=true - -[Toata dragostea*] -Parent=General Crawlers -Browser=Toata dragostea -isBanned=true - -[Tutorial Crawler*] -Parent=General Crawlers -isBanned=true - -[UbiCrawler/*] -Parent=General Crawlers -Browser=UbiCrawler - -[UCmore] -Parent=General Crawlers -Browser=UCmore - -[User*Agent:*] -Parent=General Crawlers -isBanned=true - -[USER_AGENT] -Parent=General Crawlers -Browser=USER_AGENT -isBanned=true - -[VadixBot] -Parent=General Crawlers -Browser=VadixBot - -[VengaBot/*] -Parent=General Crawlers -Browser=VengaBot -isBanned=true - -[Visicom Toolbar] -Parent=General Crawlers -Browser=Visicom Toolbar - -[W3C-WebCon/*] -Parent=General Crawlers -Browser=W3C-WebCon - -[Webclipping.com] -Parent=General Crawlers -Browser=Webclipping.com -isBanned=true - -[webcollage/*] -Parent=General Crawlers -Browser=WebCollage -isBanned=true - -[WebCrawler_1.*] -Parent=General Crawlers -Browser=WebCrawler - -[WebFilter Robot*] -Parent=General Crawlers -Browser=WebFilter Robot - -[WeBoX/*] -Parent=General Crawlers -Browser=WeBoX - -[WebTrends/*] -Parent=General Crawlers -Browser=WebTrends - -[West Wind Internet Protocols*] -Parent=General Crawlers -Browser=Versatel -isBanned=true - -[WhizBang] -Parent=General Crawlers -Browser=WhizBang - -[Willow Internet Crawler by Twotrees V*] -Parent=General Crawlers -Browser=Willow Internet Crawler - -[WIRE/* (Linux; i686; Bot,Robot,Spider,Crawler)] -Parent=General Crawlers -Browser=WIRE -isBanned=true - -[www.fi crawler, contact crawler@www.fi] -Parent=General Crawlers -Browser=www.fi crawler - -[Xerka WebBot v1.*] -Parent=General Crawlers -Browser=Xerka -isBanned=true - -[XML Sitemaps Generator*] -Parent=General Crawlers -Browser=XML Sitemaps Generator - -[XSpider*] -Parent=General Crawlers -Browser=XSpider -isBanned=true - -[YooW!/* (?http://www.yoow.eu)] -Parent=General Crawlers -Browser=YooW! -isBanned=true - -[HiddenMarket-*] -Parent=General RSS -Browser=HiddenMarket -isBanned=true - -[FOTOCHECKER] -Parent=Image Crawlers -Browser=FOTOCHECKER -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Search Engines - -[Search Engines] -Parent=DefaultProperties -Browser=Search Engines -Crawler=true - -[*FDSE robot*] -Parent=Search Engines -Browser=FDSE Robot - -[*Fluffy the spider*] -Parent=Search Engines -Browser=SearchHippo - -[Abacho*] -Parent=Search Engines -Browser=Abacho - -[ah-ha.com crawler (crawler@ah-ha.com)] -Parent=Search Engines -Browser=Ah-Ha - -[AIBOT/*] -Parent=Search Engines -Browser=21Seek.Com - -[ALeadSoftbot/*] -Parent=Search Engines -Browser=ALeadSoftbot - -[Amfibibot/*] -Parent=Search Engines -Browser=Amfibi - -[AnswerBus (http://www.answerbus.com/)] -Parent=Search Engines - -[antibot-V*] -Parent=Search Engines -Browser=antibot - -[appie*(www.walhello.com)] -Parent=Search Engines -Browser=Walhello - -[ASPSeek/*] -Parent=Search Engines -Browser=ASPSeek - -[BigCliqueBOT/*] -Parent=Search Engines -Browser=BigClique.com/BigClic.com - -[Blaiz-Bee/*] -Parent=Search Engines -Browser=RawGrunt - -[btbot/*] -Parent=Search Engines -Browser=Bit Torrent Search Engine - -[Busiversebot/v1.0 (http://www.busiverse.com/bot.php)] -Parent=Search Engines -Browser=Busiversebot -isBanned=true - -[CatchBot/*; http://www.catchbot.com] -Parent=Search Engines -Browser=CatchBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[CipinetBot (http://www.cipinet.com/bot.html)] -Parent=Search Engines -Browser=CipinetBot - -[Cogentbot/1.?*] -Parent=Search Engines -Browser=Cogentbot - -[compatible; Mozilla 4.0; MSIE 5.5; (SqwidgeBot v1.01 - http://www.sqwidge.com/bot/)] -Parent=Search Engines -Browser=SqwidgeBot - -[cosmos*] -Parent=Search Engines -Browser=Xyleme - -[Deepindex] -Parent=Search Engines -Browser=Deepindex - -[DiamondBot] -Parent=Search Engines -Browser=DiamondBot - -[Dumbot*] -Parent=Search Engines -Browser=Dumbot -Version=0.2 -MajorVer=0 -MinorVer=2 -Beta=true - -[Eule?Robot*] -Parent=Search Engines -Browser=Eule-Robot - -[Faxobot/*] -Parent=Search Engines -Browser=Faxo - -[Filangy/*] -Parent=Search Engines -Browser=Filangy - -[flatlandbot/*] -Parent=Search Engines -Browser=Flatland - -[Fooky.com/ScorpionBot/ScoutOut;*] -Parent=Search Engines -Browser=ScorpionBot -isBanned=true - -[FyberSpider*] -Parent=Search Engines -Browser=FyberSpider -isBanned=true - -[Gaisbot/*] -Parent=Search Engines -Browser=Gaisbot - -[gazz/*(gazz@nttr.co.jp)] -Parent=Search Engines -Browser=gazz - -[geniebot*] -Parent=Search Engines -Browser=GenieKnows - -[GOFORITBOT (?http://www.goforit.com/about/?)] -Parent=Search Engines -Browser=GoForIt - -[GoGuidesBot/*] -Parent=Search Engines -Browser=GoGuidesBot - -[GroschoBot/*] -Parent=Search Engines -Browser=GroschoBot - -[GurujiBot/1.*] -Parent=Search Engines -Browser=GurujiBot -isBanned=true - -[HenryTheMiragoRobot*] -Parent=Search Engines -Browser=Mirago - -[HolmesBot (http://holmes.ge)] -Parent=Search Engines -Browser=HolmesBot - -[Hotzonu/*] -Parent=Search Engines -Browser=Hotzonu - -[HyperEstraier/*] -Parent=Search Engines -Browser=HyperEstraier -isBanned=true - -[i1searchbot/*] -Parent=Search Engines -Browser=i1searchbot - -[IIITBOT/1.*] -Parent=Search Engines -Browser=Indian Language Web Search Engine - -[Iltrovatore-?etaccio/*] -Parent=Search Engines -Browser=Iltrovatore-Setaccio - -[InfociousBot (?http://corp.infocious.com/tech_crawler.php)] -Parent=Search Engines -Browser=InfociousBot -isBanned=true - -[Infoseek SideWinder/*] -Parent=Search Engines -Browser=Infoseek - -[iSEEKbot/*] -Parent=Search Engines -Browser=iSEEKbot - -[Knight/0.? (Zook Knight; http://knight.zook.in/; knight@zook.in)] -Parent=Search Engines -Browser=Knight - -[Kolinka Forum Search (www.kolinka.com)] -Parent=Search Engines -Browser=Kolinka Forum Search -isBanned=true - -[KRetrieve/] -Parent=Search Engines -Browser=KRetrieve -isBanned=true - -[LapozzBot/*] -Parent=Search Engines -Browser=LapozzBot - -[Linknzbot*] -Parent=Search Engines -Browser=Linknzbot - -[LocalcomBot/*] -Parent=Search Engines -Browser=LocalcomBot - -[Mail.Ru/1.0] -Parent=Search Engines -Browser=Mail.Ru - -[MaSagool/*] -Parent=Search Engines -Browser=Sagoo -Version=1.0 -MajorVer=1 -MinorVer=0 - -[miniRank/*] -Parent=Search Engines -Browser=miniRank - -[Mnogosearch*] -Parent=Search Engines -Browser=Mnogosearch - -[Mozilla/0.9* no dos :) (Linux)] -Parent=Search Engines -Browser=goliat -isBanned=true - -[Mozilla/4.0 (compatible; Arachmo)] -Parent=Search Engines -Browser=Arachmo - -[Mozilla/4.0 (compatible; http://search.thunderstone.com/texis/websearch/about.html)] -Parent=Search Engines -Browser=ThunderStone -isBanned=true - -[Mozilla/4.0 (compatible; MSIE *; Windows NT; Girafabot; girafabot at girafa dot com; http://www.girafa.com)] -Parent=Search Engines -Browser=Girafabot -Win32=true - -[Mozilla/4.0 (compatible; Vagabondo/*; webcrawler at wise-guys dot nl; *)] -Parent=Search Engines -Browser=Vagabondo - -[Mozilla/4.0(?compatible; MSIE 6.0; Qihoo *)] -Parent=Search Engines -Browser=Qihoo - -[Mozilla/4.7 (compatible; WhizBang; http://www.whizbang.com/crawler)] -Parent=Search Engines -Browser=Inxight Software - -[Mozilla/5.0 (*) VoilaBot*] -Parent=Search Engines -Browser=VoilaBot -isBanned=true - -[Mozilla/5.0 (compatible; ActiveTouristBot*; http://www.activetourist.com)] -Parent=Search Engines -Browser=ActiveTouristBot - -[Mozilla/5.0 (compatible; Butterfly/1.0; *)*] -Parent=Search Engines -Browser=Butterfly - -[Mozilla/5.0 (compatible; Charlotte/*; *)] -Parent=Search Engines -Browser=Charlotte -Beta=true -isBanned=true - -[Mozilla/5.0 (compatible; CXL-FatAssANT*)] -Parent=Search Engines -Browser=FatAssANT - -[Mozilla/5.0 (compatible; DBLBot/1.0; ?http://www.dontbuylists.com/)] -Parent=Search Engines -Browser=DBLBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (compatible; EARTHCOM.info/*)] -Parent=Search Engines -Browser=EARTHCOM - -[Mozilla/5.0 (compatible; Lipperhey Spider; http://www.lipperhey.com/)] -Parent=Search Engines -Browser=Lipperhey Spider - -[Mozilla/5.0 (compatible; MojeekBot/*; http://www.mojeek.com/bot.html)] -Parent=Search Engines -Browser=MojeekBot - -[Mozilla/5.0 (compatible; NLCrawler/*] -Parent=Search Engines -Browser=Northern Light Web Search - -[Mozilla/5.0 (compatible; OsO;*] -Parent=Search Engines -Browser=Octopodus -isBanned=true - -[Mozilla/5.0 (compatible; Pogodak.*)] -Parent=Search Engines -Browser=Pogodak - -[Mozilla/5.0 (compatible; Quantcastbot/1.*)] -Parent=Search Engines -Browser=Quantcastbot - -[Mozilla/5.0 (compatible; ScoutJet; *http://www.scoutjet.com/)] -Parent=Search Engines -Browser=ScoutJet - -[Mozilla/5.0 (compatible; Scrubby/*; http://www.scrubtheweb.com/abs/meta-check.html)] -Parent=Search Engines -Browser=Scrubby -isBanned=true - -[Mozilla/5.0 (compatible; YoudaoBot/1.*; http://www.youdao.com/help/webmaster/spider/*)] -Parent=Search Engines -Browser=YoudaoBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Twiceler*)] -Parent=Search Engines -Browser=Twiceler -isBanned=true - -[Mozilla/5.0 CostaCider Search*] -Parent=Search Engines -Browser=CostaCider Search - -[Mozilla/5.0 GurujiBot/1.0 (*)] -Parent=Search Engines -Browser=GurujiBot - -[NavissoBot] -Parent=Search Engines -Browser=NavissoBot - -[NextGenSearchBot*(for information visit *)] -Parent=Search Engines -Browser=ZoomInfo -isBanned=true - -[Norbert the Spider(Burf.com)] -Parent=Search Engines -Browser=Norbert the Spider - -[NuSearch Spider*] -Parent=Search Engines -Browser=nuSearch - -[ObjectsSearch/*] -Parent=Search Engines -Browser=ObjectsSearch - -[OpenISearch/1.*] -Parent=Search Engines -Browser=OpenISearch (Amazon) - -[Pagebull http://www.pagebull.com/] -Parent=Search Engines -Browser=Pagebull - -[PEERbot*] -Parent=Search Engines -Browser=PEERbot - -[Pompos/*] -Parent=Search Engines -Browser=Pompos - -[Popdexter/*] -Parent=Search Engines -Browser=Popdex - -[Qweery*] -Parent=Search Engines -Browser=QweeryBot - -[RedCell/* (*)] -Parent=Search Engines -Browser=RedCell - -[Scrubby/*] -Parent=Search Engines -Browser=Scrub The Web - -[Search-10/*] -Parent=Search Engines -Browser=Search-10 - -[search.ch*] -Parent=Search Engines -Browser=Swiss Search Engine - -[Searchmee! Spider*] -Parent=Search Engines -Browser=Searchmee! - -[Seekbot/*] -Parent=Search Engines -Browser=Seekbot - -[SiteSpider (http://www.SiteSpider.com/)] -Parent=Search Engines -Browser=SiteSpider - -[Spinne/*] -Parent=Search Engines -Browser=Spinne - -[sproose/*] -Parent=Search Engines -Browser=Sproose - -[Sqeobot/0.*] -Parent=Search Engines -Browser=Branzel -isBanned=true - -[SquigglebotBot/*] -Parent=Search Engines -Browser=SquigglebotBot -isBanned=true - -[StackRambler/*] -Parent=Search Engines -Browser=StackRambler - -[SygolBot*] -Parent=Search Engines -Browser=SygolBot - -[SynoBot] -Parent=Search Engines -Browser=SynoBot - -[Szukacz/*] -Parent=Search Engines -Browser=Szukacz - -[Tarantula/*] -Parent=Search Engines -Browser=Tarantula -isBanned=true - -[TerrawizBot/*] -Parent=Search Engines -Browser=TerrawizBot -isBanned=true - -[Tkensaku/*] -Parent=Search Engines -Browser=Tkensaku - -[TMCrawler] -Parent=Search Engines -Browser=TMCrawler -isBanned=true - -[Twingly Recon] -Parent=Search Engines -Browser=Twingly Recon -isBanned=true - -[updated/*] -Parent=Search Engines -Browser=Updated! - -[URL Spider Pro/*] -Parent=Search Engines -Browser=URL Spider Pro - -[URL Spider SQL*] -Parent=Search Engines -Browser=Innerprise Enterprise Search - -[VMBot/*] -Parent=Search Engines -Browser=VMBot - -[voyager/2.0 (http://www.kosmix.com/html/crawler.html)] -Parent=Search Engines -Browser=Voyager - -[wadaino.jp-crawler*] -Parent=Search Engines -Browser=wadaino.jp -isBanned=true - -[WebAlta Crawler/*] -Parent=Search Engines -Browser=WebAlta Crawler -isBanned=true - -[WebCorp/*] -Parent=Search Engines -Browser=WebCorp -isBanned=true - -[webcrawl.net] -Parent=Search Engines -Browser=webcrawl.net - -[WISEbot/*] -Parent=Search Engines -Browser=WISEbot -isBanned=true - -[Wotbox/*] -Parent=Search Engines -Browser=Wotbox - -[www.zatka.com] -Parent=Search Engines -Browser=Zatka - -[WWWeasel Robot v*] -Parent=Search Engines -Browser=World Wide Weasel - -[YadowsCrawler*] -Parent=Search Engines -Browser=YadowsCrawler - -[YodaoBot/*] -Parent=Search Engines -Browser=YodaoBot -isBanned=true - -[ZeBot_www.ze.bz*] -Parent=Search Engines -Browser=ZE.bz - -[zibber-v*] -Parent=Search Engines -Browser=Zibb - -[ZipppBot/*] -Parent=Search Engines -Browser=ZipppBot - -[ATA-Translation-Service] -Parent=Translators -Browser=ATA-Translation-Service - -[GJK_Browser_Check] -Parent=Version Checkers -Browser=GJK_Browser_Check - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Hatena - -[Hatena] -Parent=DefaultProperties -Browser=Hatena -isBanned=true -Crawler=true - -[Feed::Find/*] -Parent=Hatena -Browser=Feed Find -isSyndicationReader=true - -[Hatena Antenna/*] -Parent=Hatena -Browser=Hatena Antenna - -[Hatena Bookmark/*] -Parent=Hatena -Browser=Hatena Bookmark - -[Hatena RSS/*] -Parent=Hatena -Browser=Hatena RSS -isSyndicationReader=true - -[Hatena::Crawler/*] -Parent=Hatena -Browser=Hatena Crawler - -[HatenaScreenshot*] -Parent=Hatena -Browser=HatenaScreenshot - -[URI::Fetch/*] -Parent=Hatena -Browser=URI::Fetch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Internet Archive - -[Internet Archive] -Parent=DefaultProperties -Browser=Internet Archive -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*heritrix*] -Parent=Internet Archive -Browser=Heritrix -isBanned=true - -[ia_archiver*] -Parent=Internet Archive -Browser=Internet Archive - -[InternetArchive/*] -Parent=Internet Archive -Browser=InternetArchive - -[Mozilla/5.0 (compatible; archive.org_bot/1.*)] -Parent=Internet Archive - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nutch - -[Nutch] -Parent=DefaultProperties -Browser=Nutch -isBanned=true -Crawler=true - -[*Nutch*] -Parent=Nutch -isBanned=true - -[CazoodleBot/*] -Parent=Nutch -Browser=CazoodleBot - -[LOOQ/0.1*] -Parent=Nutch -Browser=LOOQ - -[Nutch/0.? (OpenX Spider)] -Parent=Nutch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Webaroo - -[Webaroo] -Parent=DefaultProperties -Browser=Webaroo - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Webaroo/*)] -Parent=Webaroo -Browser=Webaroo - -[Mozilla/5.0 (Windows; U; Windows *; *; rv:*) Gecko/* Firefox/* webaroo/*] -Parent=Webaroo -Browser=Webaroo - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Word Press - -[Word Press] -Parent=DefaultProperties -Browser=Word Press -Alpha=true -Beta=true -Win16=true -Win32=true -Win64=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -isBanned=true -isMobileDevice=true -isSyndicationReader=true -Crawler=true - -[WordPress-B-/2.*] -Parent=Word Press -Browser=WordPress-B - -[WordPress-Do-P-/2.*] -Parent=Word Press -Browser=WordPress-Do-P - -[BlueCoat ProxySG] -Parent=Blue Coat Systems -Browser=BlueCoat ProxySG - -[CerberianDrtrs/*] -Parent=Blue Coat Systems -Browser=Cerberian - -[Inne: Mozilla/4.0 (compatible; Cerberian Drtrs*)] -Parent=Blue Coat Systems -Browser=Cerberian - -[Mozilla/4.0 (compatible; Cerberian Drtrs*)] -Parent=Blue Coat Systems -Browser=Cerberian - -[Mozilla/4.0 (compatible; MSIE 6.0; Bluecoat DRTR)] -Parent=Blue Coat Systems -Browser=Bluecoat - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Copyright/Plagiarism - -[Copyright/Plagiarism] -Parent=DefaultProperties -Browser=Copyright/Plagiarism -isBanned=true -Crawler=true - -[BDFetch] -Parent=Copyright/Plagiarism -Browser=BDFetch - -[copyright sheriff (*)] -Parent=Copyright/Plagiarism -Browser=copyright sheriff - -[CopyRightCheck*] -Parent=Copyright/Plagiarism -Browser=CopyRightCheck - -[FairAd Client*] -Parent=Copyright/Plagiarism -Browser=FairAd Client - -[iCopyright Conductor*] -Parent=Copyright/Plagiarism -Browser=iCopyright Conductor - -[IPiumBot laurion(dot)com] -Parent=Copyright/Plagiarism -Browser=IPiumBot - -[IWAgent/*] -Parent=Copyright/Plagiarism -Browser=Brand Protect - -[Mozilla/5.0 (compatible; DKIMRepBot/*)] -Parent=Copyright/Plagiarism -Browser=DKIMRepBot - -[oBot] -Parent=Copyright/Plagiarism -Browser=oBot - -[SlySearch/*] -Parent=Copyright/Plagiarism -Browser=SlySearch - -[TurnitinBot/*] -Parent=Copyright/Plagiarism -Browser=TurnitinBot - -[TutorGigBot/*] -Parent=Copyright/Plagiarism -Browser=TutorGig - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DNS Tools - -[DNS Tools] -Parent=DefaultProperties -Browser=DNS Tools -Crawler=true - -[Domain Dossier utility*] -Parent=DNS Tools -Browser=Domain Dossier - -[Mozilla/5.0 (compatible; DNS-Digger/*)] -Parent=DNS Tools -Browser=DNS-Digger - -[OpenDNS Domain Crawler noc@opendns.com] -Parent=DNS Tools -Browser=OpenDNS Domain Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Download Managers - -[Download Managers] -Parent=DefaultProperties -Browser=Download Managers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[AndroidDownloadManager] -Parent=Download Managers -Browser=Android Download Manager - -[AutoMate5] -Parent=Download Managers -Browser=AutoMate5 - -[Beamer*] -Parent=Download Managers -Browser=Beamer - -[BitBeamer/*] -Parent=Download Managers -Browser=BitBeamer - -[BitTorrent/*] -Parent=Download Managers -Browser=BitTorrent - -[DA *] -Parent=Download Managers -Browser=Download Accelerator - -[Download Demon*] -Parent=Download Managers -Browser=Download Demon - -[Download Express*] -Parent=Download Managers -Browser=Download Express - -[Download Master*] -Parent=Download Managers -Browser=Download Master - -[Download Ninja*] -Parent=Download Managers -Browser=Download Ninja - -[Download Wonder*] -Parent=Download Managers -Browser=Download Wonder - -[DownloadSession*] -Parent=Download Managers -Browser=DownloadSession - -[EasyDL/*] -Parent=Download Managers -Browser=EasyDL - -[FDM 1.x] -Parent=Download Managers -Browser=Free Download Manager - -[FlashGet] -Parent=Download Managers -Browser=FlashGet - -[FreshDownload/*] -Parent=Download Managers -Browser=FreshDownload - -[GetRight/*] -Parent=Download Managers -Browser=GetRight - -[GetRightPro/*] -Parent=Download Managers -Browser=GetRightPro - -[GetSmart/*] -Parent=Download Managers -Browser=GetSmart - -[Go!Zilla*] -Parent=Download Managers -Browser=GoZilla - -[Gozilla/*] -Parent=Download Managers -Browser=Gozilla - -[Internet Ninja*] -Parent=Download Managers -Browser=Internet Ninja - -[Kontiki Client*] -Parent=Download Managers -Browser=Kontiki Client - -[lftp/3.2.1] -Parent=Download Managers -Browser=lftp - -[LightningDownload/*] -Parent=Download Managers -Browser=LightningDownload - -[LMQueueBot/*] -Parent=Download Managers -Browser=LMQueueBot - -[MetaProducts Download Express/*] -Parent=Download Managers -Browser=Download Express - -[Mozilla/4.0 (compatible; Getleft*)] -Parent=Download Managers -Browser=Getleft - -[Myzilla] -Parent=Download Managers -Browser=Myzilla - -[Net Vampire/*] -Parent=Download Managers -Browser=Net Vampire - -[Net_Vampire*] -Parent=Download Managers -Browser=Net_Vampire - -[NetAnts*] -Parent=Download Managers -Browser=NetAnts - -[NetPumper*] -Parent=Download Managers -Browser=NetPumper - -[NetSucker*] -Parent=Download Managers -Browser=NetSucker - -[NetZip Downloader*] -Parent=Download Managers -Browser=NetZip Downloader - -[NexTools WebAgent*] -Parent=Download Managers -Browser=NexTools WebAgent - -[Offline Downloader*] -Parent=Download Managers -Browser=Offline Downloader - -[P3P Client] -Parent=Download Managers -Browser=P3P Client - -[PageDown*] -Parent=Download Managers -Browser=PageDown - -[PicaLoader*] -Parent=Download Managers -Browser=PicaLoader - -[Prozilla*] -Parent=Download Managers -Browser=Prozilla - -[RealDownload/*] -Parent=Download Managers -Browser=RealDownload - -[sEasyDL/*] -Parent=Download Managers -Browser=EasyDL - -[shareaza*] -Parent=Download Managers -Browser=shareaza - -[SmartDownload/*] -Parent=Download Managers -Browser=SmartDownload - -[SpeedDownload/*] -Parent=Download Managers -Browser=Speed Download - -[Star*Downloader/*] -Parent=Download Managers -Browser=StarDownloader - -[STEROID Download] -Parent=Download Managers -Browser=STEROID Download - -[SuperBot/*] -Parent=Download Managers -Browser=SuperBot - -[Vegas95/*] -Parent=Download Managers -Browser=Vegas95 - -[WebZIP*] -Parent=Download Managers -Browser=WebZIP - -[Wget*] -Parent=Download Managers -Browser=Wget - -[WinTools] -Parent=Download Managers -Browser=WinTools - -[Xaldon WebSpider*] -Parent=Download Managers -Browser=Xaldon WebSpider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; E-Mail Harvesters - -[E-Mail Harvesters] -Parent=DefaultProperties -Browser=E-Mail Harvesters -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*E-Mail Address Extractor*] -Parent=E-Mail Harvesters -Browser=E-Mail Address Extractor - -[*Larbin*] -Parent=E-Mail Harvesters -Browser=Larbin - -[*www4mail/*] -Parent=E-Mail Harvesters -Browser=www4mail - -[8484 Boston Project*] -Parent=E-Mail Harvesters -Browser=8484 Boston Project - -[CherryPicker*/*] -Parent=E-Mail Harvesters -Browser=CherryPickerElite - -[Chilkat/*] -Parent=E-Mail Harvesters -Browser=Chilkat - -[ContactBot/*] -Parent=E-Mail Harvesters -Browser=ContactBot - -[eCatch*] -Parent=E-Mail Harvesters -Browser=eCatch - -[EmailCollector*] -Parent=E-Mail Harvesters -Browser=E-Mail Collector - -[EMAILsearcher] -Parent=E-Mail Harvesters -Browser=EMAILsearcher - -[EmailSiphon*] -Parent=E-Mail Harvesters -Browser=E-Mail Siphon - -[EmailWolf*] -Parent=E-Mail Harvesters -Browser=EMailWolf - -[Epsilon SoftWorks' MailMunky] -Parent=E-Mail Harvesters -Browser=MailMunky - -[ExtractorPro*] -Parent=E-Mail Harvesters -Browser=ExtractorPro - -[Franklin Locator*] -Parent=E-Mail Harvesters -Browser=Franklin Locator - -[Missigua Locator*] -Parent=E-Mail Harvesters -Browser=Missigua Locator - -[Mozilla/4.0 (compatible; Advanced Email Extractor*)] -Parent=E-Mail Harvesters -Browser=Advanced Email Extractor - -[Netprospector*] -Parent=E-Mail Harvesters -Browser=Netprospector - -[ProWebWalker*] -Parent=E-Mail Harvesters -Browser=ProWebWalker - -[sna-0.0.*] -Parent=E-Mail Harvesters -Browser=Mike Elliott's E-Mail Harvester - -[WebEnhancer*] -Parent=E-Mail Harvesters -Browser=WebEnhancer - -[WebMiner*] -Parent=E-Mail Harvesters -Browser=WebMiner - -[ZIBB Crawler (email address / WWW address)] -Parent=E-Mail Harvesters -Browser=ZIBB Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Feeds Blogs - -[Feeds Blogs] -Parent=DefaultProperties -Browser=Feeds Blogs -isSyndicationReader=true -Crawler=true - -[Bloglines Title Fetch/*] -Parent=Feeds Blogs -Browser=Bloglines Title Fetch - -[Bloglines/* (http://www.bloglines.com*)] -Parent=Feeds Blogs -Browser=BlogLines Web - -[BlogPulseLive (support@blogpulse.com)] -Parent=Feeds Blogs -Browser=BlogPulseLive - -[blogsearchbot-pumpkin-2] -Parent=Feeds Blogs -Browser=blogsearchbot-pumpkin -isSyndicationReader=false - -[Irish Blogs Aggregator/*1.0*] -Parent=Feeds Blogs -Browser=Irish Blogs Aggregator -Version=1.0 -MajorVer=1 -MinorVer=0 - -[kinjabot (http://www.kinja.com; *)] -Parent=Feeds Blogs -Browser=kinjabot - -[Net::Trackback/*] -Parent=Feeds Blogs -Browser=Net::Trackback - -[Reblog*] -Parent=Feeds Blogs -Browser=Reblog - -[WordPress/*] -Parent=Feeds Blogs -Browser=WordPress - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Feeds Syndicators - -[Feeds Syndicators] -Parent=DefaultProperties -Browser=Feeds Syndicators -isSyndicationReader=true - -[*LinkLint*] -Parent=Feeds Syndicators -Browser=LinkLint - -[*NetNewsWire/*] -Parent=Feeds Syndicators - -[*NetVisualize*] -Parent=Feeds Syndicators -Browser=NetVisualize - -[AideRSS 2.* (postrank.com)] -Parent=Feeds Syndicators -Browser=AideRSS - -[AideRSS/2.0 (aiderss.com)] -Parent=Feeds Syndicators -Browser=AideRSS -isBanned=true - -[Akregator/*] -Parent=Feeds Syndicators -Browser=Akregator - -[AppleSyndication/*] -Parent=Feeds Syndicators -Browser=Safari RSS -Platform=MacOSX - -[Cocoal.icio.us/* (*)*] -Parent=Feeds Syndicators -Browser=Cocoal.icio.us -isBanned=true - -[Feed43 Proxy/* (*)] -Parent=Feeds Syndicators -Browser=Feed For Free - -[FeedBurner/*] -Parent=Feeds Syndicators -Browser=FeedBurner - -[FeedDemon/* (*)] -Parent=Feeds Syndicators -Browser=FeedDemon -Platform=Win32 - -[FeedDigest/* (*)] -Parent=Feeds Syndicators -Browser=FeedDigest - -[FeedGhost/1.*] -Parent=Feeds Syndicators -Browser=FeedGhost -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedOnFeeds/0.1.* ( http://minutillo.com/steve/feedonfeeds/)] -Parent=Feeds Syndicators -Browser=FeedOnFeeds -Version=0.1 -MajorVer=0 -MinorVer=1 - -[Feedreader * (Powered by Newsbrain)] -Parent=Feeds Syndicators -Browser=Newsbrain - -[Feedshow/* (*)] -Parent=Feeds Syndicators -Browser=Feedshow - -[Feedster Crawler/?.0; Feedster, Inc.] -Parent=Feeds Syndicators -Browser=Feedster - -[GreatNews/1.0] -Parent=Feeds Syndicators -Browser=GreatNews -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Gregarius/*] -Parent=Feeds Syndicators -Browser=Gregarius - -[intraVnews/*] -Parent=Feeds Syndicators -Browser=intraVnews - -[JetBrains Omea Reader*] -Parent=Feeds Syndicators -Browser=Omea Reader -isBanned=true - -[Liferea/1.5* (Linux; *; http://liferea.sf.net/)] -Parent=Feeds Syndicators -Browser=Liferea -isBanned=true - -[livedoor FeedFetcher/0.0* (http://reader.livedoor.com/;*)] -Parent=Feeds Syndicators -Browser=FeedFetcher -Version=0.0 -MajorVer=0 -MinorVer=0 - -[MagpieRSS/* (*)] -Parent=Feeds Syndicators -Browser=MagpieRSS - -[Mobitype * (compatible; Mozilla/*; MSIE *.*; Windows *)] -Parent=Feeds Syndicators -Browser=Mobitype -Platform=Win32 - -[Mozilla/5.0 (*; Rojo *; http://www.rojo.com/corporate/help/agg; *)*] -Parent=Feeds Syndicators -Browser=Rojo - -[Mozilla/5.0 (*aggregator:TailRank; http://tailrank.com/robot)*] -Parent=Feeds Syndicators -Browser=TailRank - -[Mozilla/5.0 (compatible; MSIE 6.0; Podtech Network; crawler_admin@podtech.net)] -Parent=Feeds Syndicators -Browser=Podtech Network - -[Mozilla/5.0 (compatible; Newz Crawler *; http://www.newzcrawler.com/?)] -Parent=Feeds Syndicators -Browser=Newz Crawler - -[Mozilla/5.0 (compatible; RSSMicro.com RSS/Atom Feed Robot)] -Parent=Feeds Syndicators -Browser=RSSMicro - -[Mozilla/5.0 (compatible;*newstin.com;*)] -Parent=Feeds Syndicators -Browser=NewsTin - -[Mozilla/5.0 (RSS Reader Panel)] -Parent=Feeds Syndicators -Browser=RSS Reader Panel - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:FeedParser; *) Gecko/*] -Parent=Feeds Syndicators -Browser=FeedParser - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:NewsMonster; *) Gecko/*] -Parent=Feeds Syndicators -Browser=NewsMonster - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:Rojo; *) Gecko/*] -Parent=Feeds Syndicators -Browser=Rojo - -[Netvibes (*)] -Parent=Feeds Syndicators -Browser=Netvibes - -[NewsAlloy/* (*)] -Parent=Feeds Syndicators -Browser=NewsAlloy - -[Omnipelagos*] -Parent=Feeds Syndicators -Browser=Omnipelagos - -[Particls] -Parent=Feeds Syndicators -Browser=Particls - -[Protopage/* (*)] -Parent=Feeds Syndicators -Browser=Protopage - -[PubSub-RSS-Reader/* (*)] -Parent=Feeds Syndicators -Browser=PubSub-RSS-Reader - -[RSS Menu/*] -Parent=Feeds Syndicators -Browser=RSS Menu - -[RssBandit/*] -Parent=Feeds Syndicators -Browser=RssBandit - -[RssBar/1.2*] -Parent=Feeds Syndicators -Browser=RssBar -Version=1.2 -MajorVer=1 -MinorVer=2 - -[SharpReader/*] -Parent=Feeds Syndicators -Browser=SharpReader - -[SimplePie/*] -Parent=Feeds Syndicators -Browser=SimplePie - -[Strategic Board Bot (?http://www.strategicboard.com)] -Parent=Feeds Syndicators -Browser=Strategic Board Bot -isBanned=true - -[TargetYourNews.com bot] -Parent=Feeds Syndicators -Browser=TargetYourNews - -[Technoratibot/*] -Parent=Feeds Syndicators -Browser=Technoratibot - -[Tumblr/* RSS syndication ( http://www.tumblr.com/) (support@tumblr.com)] -Parent=Feeds Syndicators -Browser=Tumblr RSS syndication - -[Windows-RSS-Platform/1.0*] -Parent=Feeds Syndicators -Browser=Windows-RSS-Platform -Version=1.0 -MajorVer=1 -MinorVer=0 -Win32=true - -[Wizz RSS News Reader] -Parent=Feeds Syndicators -Browser=Wizz - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; General RSS - -[General RSS] -Parent=DefaultProperties -Browser=General RSS -isSyndicationReader=true - -[AideRSS/1.0 (aiderss.com); * subscribers] -Parent=General RSS -Browser=AideRSS -Version=1.0 -MajorVer=1 -MinorVer=0 - -[CC Metadata Scaper http://wiki.creativecommons.org/Metadata_Scraper] -Parent=General RSS -Browser=CC Metadata Scaper - -[Mozilla/5.0 (compatible) GM RSS Panel] -Parent=General RSS -Browser=RSS Panel - -[Mozilla/5.0 http://www.inclue.com; graeme@inclue.com] -Parent=General RSS -Browser=Inclue - -[Runnk online rss reader : http://www.runnk.com/ : RSS favorites : RSS ranking : RSS aggregator*] -Parent=General RSS -Browser=Ruunk - -[Windows-RSS-Platform/2.0 (MSIE 8.0; Windows NT 6.0)] -Parent=General RSS -Browser=Windows-RSS-Platform -Platform=WinVista - -[Mozilla/5.0 (X11; ?; Linux; *) AppleWebKit/* (KHTML, like Gecko, Safari/*) Arora/0.4] -Parent=Google Code -Browser=Arora -Version=0.4 -MajorVer=0 -MinorVer=4 -Platform=Linux -CssVersion=2 -supportsCSS=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Validation Checkers - -[HTML Validators] -Parent=DefaultProperties -Browser=HTML Validators -Frames=true -IFrames=true -Tables=true -Crawler=true - -[(HTML Validator http://www.searchengineworld.com/validator/)] -Parent=HTML Validators -Browser=Search Engine World HTML Validator - -[FeedValidator/1.3] -Parent=HTML Validators -Browser=FeedValidator -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Jigsaw/* W3C_CSS_Validator_JFouffa/*] -Parent=HTML Validators -Browser=Jigsaw CSS Validator - -[Search Engine World Robots.txt Validator*] -Parent=HTML Validators -Browser=Search Engine World Robots.txt Validator - -[W3C_Validator/*] -Parent=HTML Validators -Browser=W3C Validator - -[W3CLineMode/*] -Parent=HTML Validators -Browser=W3C Line Mode - -[Weblide/2.? beta*] -Parent=HTML Validators -Browser=Weblide -Version=2.0 -MajorVer=2 -MinorVer=0 -Beta=true - -[WebmasterWorld StickyMail Server Header Checker*] -Parent=HTML Validators -Browser=WebmasterWorld Server Header Checker - -[WWWC/*] -Parent=HTML Validators - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Image Crawlers - -[Image Crawlers] -Parent=DefaultProperties -Browser=Image Crawlers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*CFNetwork*] -Parent=Image Crawlers -Browser=CFNetwork - -[*PhotoStickies/*] -Parent=Image Crawlers -Browser=PhotoStickies - -[Camcrawler*] -Parent=Image Crawlers -Browser=Camcrawler - -[CydralSpider/*] -Parent=Image Crawlers -Browser=Cydral Web Image Search -isBanned=true - -[Der gro\xdfe BilderSauger*] -Parent=Image Crawlers -Browser=Gallery Grabber - -[Extreme Picture Finder] -Parent=Image Crawlers -Browser=Extreme Picture Finder - -[FLATARTS_FAVICO] -Parent=Image Crawlers -Browser=FlatArts Favorites Icon Tool - -[HTML2JPG Blackbox, http://www.html2jpg.com] -Parent=Image Crawlers -Browser=HTML2JPG - -[IconSurf/2.*] -Parent=Image Crawlers -Browser=IconSurf - -[kalooga/KaloogaBot*] -Parent=Image Crawlers -Browser=KaloogaBot - -[Mister PIX*] -Parent=Image Crawlers -Browser=Mister PIX - -[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/* (*) Pandora/2.*] -Parent=Image Crawlers -Browser=Pandora - -[naoFavicon4IE*] -Parent=Image Crawlers -Browser=naoFavicon4IE - -[pixfinder/*] -Parent=Image Crawlers -Browser=pixfinder - -[rssImagesBot/0.1 (*http://herbert.groot.jebbink.nl/?app=rssImages)] -Parent=Image Crawlers -Browser=rssImagesBot - -[Web Image Collector*] -Parent=Image Crawlers -Browser=Web Image Collector - -[WebImages * (?http://herbert.groot.jebbink.nl/?app=WebImages?)] -Parent=Image Crawlers -Browser=WebImages - -[WebPix*] -Parent=Image Crawlers -Browser=Custo - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Link Checkers - -[Link Checkers] -Parent=DefaultProperties -Browser=Link Checkers -Frames=true -IFrames=true -Tables=true -Crawler=true - -[!Susie (http://www.sync2it.com/susie)] -Parent=Link Checkers -Browser=!Susie - -[*AgentName/*] -Parent=Link Checkers -Browser=AgentName - -[*Linkman*] -Parent=Link Checkers -Browser=Linkman - -[*LinksManager.com*] -Parent=Link Checkers -Browser=LinksManager - -[*Powermarks/*] -Parent=Link Checkers -Browser=Powermarks - -[*W3C-checklink/*] -Parent=Link Checkers -Browser=W3C Link Checker - -[*Web Link Validator*] -Parent=Link Checkers -Browser=Web Link Validator - -[*Zeus*] -Parent=Link Checkers -Browser=Zeus -isBanned=true - -[ActiveBookmark *] -Parent=Link Checkers -Browser=ActiveBookmark - -[Bookdog/*] -Parent=Link Checkers -Browser=Bookdog - -[Bookmark Buddy*] -Parent=Link Checkers -Browser=Bookmark Buddy - -[Bookmark Renewal Check Agent*] -Parent=Link Checkers -Browser=Bookmark Renewal Check Agent - -[Bookmark search tool*] -Parent=Link Checkers -Browser=Bookmark search tool - -[Bookmark-Manager] -Parent=Link Checkers -Browser=Bookmark-Manager - -[Checkbot*] -Parent=Link Checkers -Browser=Checkbot - -[CheckLinks/*] -Parent=Link Checkers -Browser=CheckLinks - -[CyberSpyder Link Test/*] -Parent=Link Checkers -Browser=CyberSpyder Link Test - -[DLC/*] -Parent=Link Checkers -Browser=DLC - -[DocWeb Link Crawler (http://doc.php.net)] -Parent=Link Checkers -Browser=DocWeb Link Crawler - -[FavOrg] -Parent=Link Checkers -Browser=FavOrg - -[Favorites Sweeper v.3.*] -Parent=Link Checkers -Browser=Favorites Sweeper - -[FindLinks/*] -Parent=Link Checkers -Browser=FindLinks - -[Funnel Web Profiler*] -Parent=Link Checkers -Browser=Funnel Web Profiler - -[Html Link Validator (www.lithopssoft.com)] -Parent=Link Checkers -Browser=HTML Link Validator - -[IECheck] -Parent=Link Checkers -Browser=IECheck - -[JCheckLinks/*] -Parent=Link Checkers -Browser=JCheckLinks - -[JRTwine Software Check Favorites Utility] -Parent=Link Checkers -Browser=JRTwine - -[Link Valet Online*] -Parent=Link Checkers -Browser=Link Valet -isBanned=true - -[LinkAlarm/*] -Parent=Link Checkers -Browser=LinkAlarm - -[Linkbot*] -Parent=Link Checkers -Browser=Linkbot - -[LinkChecker/*] -Parent=Link Checkers -Browser=LinkChecker - -[LinkextractorPro*] -Parent=Link Checkers -Browser=LinkextractorPro -isBanned=true - -[LinkLint-checkonly/*] -Parent=Link Checkers -Browser=LinkLint - -[LinkScan/*] -Parent=Link Checkers -Browser=LinkScan - -[LinkSweeper/*] -Parent=Link Checkers -Browser=LinkSweeper - -[LinkWalker*] -Parent=Link Checkers -Browser=LinkWalker - -[MetaGer-LinkChecker] -Parent=Link Checkers -Browser=MetaGer-LinkChecker - -[Mozilla/* (compatible; linktiger/*; *http://www.linktiger.com*)] -Parent=Link Checkers -Browser=LinkTiger -isBanned=true - -[Mozilla/4.0 (Compatible); URLBase*] -Parent=Link Checkers -Browser=URLBase - -[Mozilla/4.0 (compatible; Link Utility; http://net-promoter.com)] -Parent=Link Checkers -Browser=NetPromoter Link Utility - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98) Web Link Validator*] -Parent=Link Checkers -Browser=Web Link Validator -Win32=true - -[Mozilla/4.0 (compatible; MSIE 7.0; Win32) Link Commander 3.0] -Parent=Link Checkers -Browser=Link Commander -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Win32 - -[Mozilla/4.0 (compatible; smartBot/1.*; checking links; *)] -Parent=Link Checkers -Browser=smartBot - -[Mozilla/4.0 (compatible; SuperCleaner*;*)] -Parent=Link Checkers -Browser=SuperCleaner - -[Mozilla/5.0 gURLChecker/*] -Parent=Link Checkers -Browser=gURLChecker -isBanned=true - -[Newsgroupreporter LinkCheck] -Parent=Link Checkers -Browser=Newsgroupreporter LinkCheck - -[onCHECK Linkchecker von www.scientec.de fuer www.onsinn.de] -Parent=Link Checkers -Browser=onCHECK Linkchecker - -[online link validator (http://www.dead-links.com/)] -Parent=Link Checkers -Browser=Dead-Links.com -isBanned=true - -[REL Link Checker*] -Parent=Link Checkers -Browser=REL Link Checker - -[RLinkCheker*] -Parent=Link Checkers -Browser=RLinkCheker - -[Robozilla/*] -Parent=Link Checkers -Browser=Robozilla - -[RPT-HTTPClient/*] -Parent=Link Checkers -Browser=RPT-HTTPClient -isBanned=true - -[SafariBookmarkChecker*(?http://www.coriolis.ch/)] -Parent=Link Checkers -Browser=SafariBookmarkChecker -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[Simpy/* (Simpy; http://www.simpy.com/?ref=bot; feedback at simpy dot com)] -Parent=Link Checkers -Browser=Simpy - -[SiteBar/*] -Parent=Link Checkers -Browser=SiteBar - -[Susie (http://www.sync2it.com/bms/susie.php] -Parent=Link Checkers -Browser=Susie - -[URLBase/6.*] -Parent=Link Checkers - -[VSE/*] -Parent=Link Checkers -Browser=VSE Link Tester - -[WebTrends Link Analyzer] -Parent=Link Checkers -Browser=WebTrends Link Analyzer - -[WorQmada/*] -Parent=Link Checkers -Browser=WorQmada - -[Xenu* Link Sleuth*] -Parent=Link Checkers -Browser=Xenu's Link Sleuth -isBanned=true - -[Z-Add Link Checker*] -Parent=Link Checkers -Browser=Z-Add Link Checker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Microsoft - -[Microsoft] -Parent=DefaultProperties -Browser=Microsoft -isBanned=true - -[Live (http://www.live.com/)] -Parent=Microsoft -Browser=Microsoft Live -isBanned=false -isSyndicationReader=true - -[MFC Foundation Class Library*] -Parent=Microsoft -Browser=MFC Foundation Class Library - -[MFHttpScan] -Parent=Microsoft -Browser=MFHttpScan - -[Microsoft BITS/*] -Parent=Microsoft -Browser=BITS - -[Microsoft Data Access Internet Publishing Provider Cache Manager] -Parent=Microsoft -Browser=MS IPP - -[Microsoft Data Access Internet Publishing Provider DAV*] -Parent=Microsoft -Browser=MS IPP DAV - -[Microsoft Data Access Internet Publishing Provider Protocol Discovery] -Parent=Microsoft -Browser=MS IPPPD - -[Microsoft Internet Explorer] -Parent=Microsoft -Browser=Fake IE - -[Microsoft Office Existence Discovery] -Parent=Microsoft -Browser=Microsoft Office Existence Discovery - -[Microsoft Office Protocol Discovery] -Parent=Microsoft -Browser=MS OPD - -[Microsoft Office/* (*Picture Manager*)] -Parent=Microsoft -Browser=Microsoft Office Picture Manager - -[Microsoft URL Control*] -Parent=Microsoft -Browser=Microsoft URL Control - -[Microsoft Visio MSIE] -Parent=Microsoft -Browser=Microsoft Visio - -[Microsoft-WebDAV-MiniRedir/*] -Parent=Microsoft -Browser=Microsoft-WebDAV - -[Mozilla/5.0 (Macintosh; Intel Mac OS X) Excel/12.*] -Parent=Microsoft -Browser=Microsoft Excel -Version=12.0 -MajorVer=12 -MinorVer=0 -Platform=MacOSX - -[MSN Feed Manager] -Parent=Microsoft -Browser=MSN Feed Manager -isBanned=false -isSyndicationReader=true - -[MSProxy/*] -Parent=Microsoft -Browser=MS Proxy - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Miscellaneous Browsers - -[Miscellaneous Browsers] -Parent=DefaultProperties -Browser=Miscellaneous Browsers -Frames=true -Tables=true -Cookies=true - -[*Amiga*] -Parent=Miscellaneous Browsers -Browser=Amiga -Platform=Amiga - -[*avantbrowser*] -Parent=Miscellaneous Browsers -Browser=Avant Browser - -[12345] -Parent=Miscellaneous Browsers -Browser=12345 -isBanned=true - -[Ace Explorer] -Parent=Miscellaneous Browsers -Browser=Ace Explorer - -[Enigma Browser*] -Parent=Miscellaneous Browsers -Browser=Enigma Browser - -[EVE-minibrowser/*] -Parent=Miscellaneous Browsers -Browser=EVE-minibrowser -IFrames=false -Tables=false -BackgroundSounds=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -isBanned=false -Crawler=false - -[Godzilla/* (Basic*; *; Commodore C=64; *; rv:1.*)*] -Parent=Miscellaneous Browsers -Browser=Godzilla - -[GreenBrowser] -Parent=Miscellaneous Browsers -Browser=GreenBrowser -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Kopiczek/* (WyderOS*; *)] -Parent=Miscellaneous Browsers -Browser=Kopiczek -Platform=WyderOS -IFrames=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (*) - BrowseX (*)] -Parent=Miscellaneous Browsers -Browser=BrowseX - -[Mozilla/* (Win32;*Escape?*; ?)] -Parent=Miscellaneous Browsers -Browser=Escape -Platform=Win32 - -[Mozilla/4.0 (compatible; ibisBrowser)] -Parent=Miscellaneous Browsers -Browser=ibisBrowser - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) AppleWebKit/* (*) HistoryHound/*] -Parent=Miscellaneous Browsers -Browser=HistoryHound - -[NetRecorder*] -Parent=Miscellaneous Browsers -Browser=NetRecorder - -[NetSurfer*] -Parent=Miscellaneous Browsers -Browser=NetSurfer - -[ogeb browser , Version 1.1.0] -Parent=Miscellaneous Browsers -Browser=ogeb browser -Version=1.1 -MajorVer=1 -MinorVer=1 - -[SCEJ PSP BROWSER 0102pspNavigator] -Parent=Miscellaneous Browsers -Browser=Wipeout Pure - -[SlimBrowser] -Parent=Miscellaneous Browsers -Browser=SlimBrowser - -[WWW_Browser/*] -Parent=Miscellaneous Browsers -Browser=WWW Browser -Version=1.69 -MajorVer=1 -MinorVer=69 -Platform=Win16 -CssVersion=3 -supportsCSS=true - -[*Netcraft Webserver Survey*] -Parent=Netcraft -Browser=Netcraft Webserver Survey -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Offline Browsers - -[Offline Browsers] -Parent=DefaultProperties -Browser=Offline Browsers -Frames=true -Tables=true -Cookies=true -isBanned=true -Crawler=true - -[*Check&Get*] -Parent=Offline Browsers -Browser=Check&Get - -[*HTTrack*] -Parent=Offline Browsers -Browser=HTTrack - -[*MSIECrawler*] -Parent=Offline Browsers -Browser=IE Offline Browser - -[*TweakMASTER*] -Parent=Offline Browsers -Browser=TweakMASTER - -[BackStreet Browser *] -Parent=Offline Browsers -Browser=BackStreet Browser - -[Go-Ahead-Got-It*] -Parent=Offline Browsers -Browser=Go Ahead Got-It - -[iGetter/*] -Parent=Offline Browsers -Browser=iGetter - -[Teleport*] -Parent=Offline Browsers -Browser=Teleport - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Online Scanners - -[Online Scanners] -Parent=DefaultProperties -Browser=Online Scanners -isBanned=true - -[JoeDog/* (X11; I; Siege *)] -Parent=Online Scanners -Browser=JoeDog -isBanned=false - -[Morfeus Fucking Scanner] -Parent=Online Scanners -Browser=Morfeus Fucking Scanner - -[Mozilla/4.0 (compatible; Trend Micro tmdr 1.*] -Parent=Online Scanners -Browser=Trend Micro - -[Titanium 2005 (4.02.01)] -Parent=Online Scanners -Browser=Panda Antivirus Titanium - -[virus_detector*] -Parent=Online Scanners -Browser=Secure Computing Corporation - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Proxy Servers - -[Proxy Servers] -Parent=DefaultProperties -Browser=Proxy Servers -isBanned=true - -[*squid*] -Parent=Proxy Servers -Browser=Squid - -[Anonymisiert*] -Parent=Proxy Servers -Browser=Anonymizied - -[Anonymizer/*] -Parent=Proxy Servers -Browser=Anonymizer - -[Anonymizied*] -Parent=Proxy Servers -Browser=Anonymizied - -[Anonymous*] -Parent=Proxy Servers -Browser=Anonymous - -[Anonymous/*] -Parent=Proxy Servers -Browser=Anonymous - -[CE-Preload] -Parent=Proxy Servers -Browser=CE-Preload - -[http://Anonymouse.org/*] -Parent=Proxy Servers -Browser=Anonymouse - -[IE/6.01 (CP/M; 8-bit*)] -Parent=Proxy Servers -Browser=Squid - -[Mozilla/* (TuringOS; Turing Machine; 0.0)] -Parent=Proxy Servers -Browser=Anonymizer - -[Mozilla/4.0 (compatible; MSIE ?.0; SaferSurf*)] -Parent=Proxy Servers -Browser=SaferSurf - -[Mozilla/5.0 (compatible; del.icio.us-thumbnails/*; *) KHTML/* (like Gecko)] -Parent=Proxy Servers -Browser=Yahoo! -isBanned=true -Crawler=true - -[Nutscrape] -Parent=Proxy Servers -Browser=Squid - -[Nutscrape/* (CP/M; 8-bit*)] -Parent=Proxy Servers -Browser=Squid - -[Privoxy/*] -Parent=Proxy Servers -Browser=Privoxy - -[ProxyTester*] -Parent=Proxy Servers -Browser=ProxyTester -isBanned=true -Crawler=true - -[SilentSurf*] -Parent=Proxy Servers -Browser=SilentSurf - -[SmallProxy*] -Parent=Proxy Servers -Browser=SmallProxy - -[Space*Bison/*] -Parent=Proxy Servers -Browser=Proxomitron - -[Sqworm/*] -Parent=Proxy Servers -Browser=Websense - -[SurfControl] -Parent=Proxy Servers -Browser=SurfControl - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Research Projects - -[Research Projects] -Parent=DefaultProperties -Browser=Research Projects -isBanned=true -Crawler=true - -[*research*] -Parent=Research Projects - -[AcadiaUniversityWebCensusClient] -Parent=Research Projects -Browser=AcadiaUniversityWebCensusClient - -[Amico Alpha * (*) Gecko/* AmicoAlpha/*] -Parent=Research Projects -Browser=Amico Alpha - -[annotate_google; http://ponderer.org/*] -Parent=Research Projects -Browser=Annotate Google - -[CMS crawler (?http://buytaert.net/crawler/)] -Parent=Research Projects - -[e-SocietyRobot(http://www.yama.info.waseda.ac.jp/~yamana/es/)] -Parent=Research Projects -Browser=e-SocietyRobot - -[Forschungsportal/*] -Parent=Research Projects -Browser=Forschungsportal - -[Gulper Web *] -Parent=Research Projects -Browser=Gulper Web Bot - -[HooWWWer/*] -Parent=Research Projects -Browser=HooWWWer - -[http://buytaert.net/crawler] -Parent=Research Projects - -[inetbot/* (?http://www.inetbot.com/bot.html)] -Parent=Research Projects -Browser=inetbot - -[IRLbot/*] -Parent=Research Projects -Browser=IRLbot - -[Lachesis] -Parent=Research Projects -Browser=Lachesis - -[Mozilla/5.0 (compatible; nextthing.org/*)] -Parent=Research Projects -Browser=nextthing.org -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (compatible; Theophrastus/*)] -Parent=Research Projects -Browser=Theophrastus - -[Mozilla/5.0 (compatible; Webscan v0.*; http://otc.dyndns.org/webscan/)] -Parent=Research Projects -Browser=Webscan - -[MQbot*] -Parent=Research Projects -Browser=MQbot - -[OutfoxBot/*] -Parent=Research Projects -Browser=OutfoxBot - -[polybot?*] -Parent=Research Projects -Browser=Polybot - -[Shim?Crawler*] -Parent=Research Projects -Browser=Shim Crawler - -[Steeler/*] -Parent=Research Projects -Browser=Steeler - -[Taiga web spider] -Parent=Research Projects -Browser=Taiga - -[Theme Spider*] -Parent=Research Projects -Browser=Theme Spider - -[UofTDB_experiment* (leehyun@cs.toronto.edu)] -Parent=Research Projects -Browser=UofTDB Experiment - -[USyd-NLP-Spider*] -Parent=Research Projects -Browser=USyd-NLP-Spider - -[woriobot*] -Parent=Research Projects -Browser=woriobot - -[wwwster/* (Beta, mailto:gue@cis.uni-muenchen.de)] -Parent=Research Projects -Browser=wwwster -Beta=true - -[Zao-Crawler] -Parent=Research Projects -Browser=Zao-Crawler - -[Zao/*] -Parent=Research Projects -Browser=Zao - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Rippers - -[Rippers] -Parent=DefaultProperties -Browser=Rippers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*grub*] -Parent=Rippers -Browser=grub - -[*ickHTTP*] -Parent=Rippers -Browser=IP*Works - -[*java*] -Parent=Rippers - -[*libwww-perl*] -Parent=Rippers -Browser=libwww-perl - -[*WebGrabber*] -Parent=Rippers - -[*WinHttpRequest*] -Parent=Rippers -Browser=WinHttp - -[3D-FTP/*] -Parent=Rippers -Browser=3D-FTP - -[3wGet/*] -Parent=Rippers -Browser=3wGet - -[ActiveRefresh*] -Parent=Rippers -Browser=ActiveRefresh - -[Artera (Version *)] -Parent=Rippers -Browser=Artera - -[AutoHotkey] -Parent=Rippers -Browser=AutoHotkey - -[b2w/*] -Parent=Rippers -Browser=b2w - -[BasicHTTP/*] -Parent=Rippers -Browser=BasicHTTP - -[BlockNote.Net] -Parent=Rippers -Browser=BlockNote.Net - -[CAST] -Parent=Rippers -Browser=CAST - -[CFNetwork/*] -Parent=Rippers -Browser=CFNetwork - -[CFSCHEDULE*] -Parent=Rippers -Browser=ColdFusion Task Scheduler - -[CobWeb/*] -Parent=Rippers -Browser=CobWeb - -[ColdFusion*] -Parent=Rippers -Browser=ColdFusion - -[Crawl_Application] -Parent=Rippers -Browser=Crawl_Application - -[curl/*] -Parent=Rippers -Browser=cURL - -[Custo*] -Parent=Rippers -Browser=Custo - -[DataCha0s/*] -Parent=Rippers -Browser=DataCha0s - -[DeepIndexer*] -Parent=Rippers -Browser=DeepIndexer - -[DISCo Pump *] -Parent=Rippers -Browser=DISCo Pump - -[eStyleSearch * (compatible; MSIE 6.0; Windows NT 5.0)] -Parent=Rippers -Browser=eStyleSearch -Win32=true - -[ezic.com http agent *] -Parent=Rippers -Browser=Ezic.com - -[fetch libfetch/*] -Parent=Rippers - -[FGet*] -Parent=Rippers -Browser=FGet - -[Flaming AttackBot*] -Parent=Rippers -Browser=Flaming AttackBot - -[Foobot*] -Parent=Rippers -Browser=Foobot - -[GameSpyHTTP/*] -Parent=Rippers -Browser=GameSpyHTTP - -[gnome-vfs/*] -Parent=Rippers -Browser=gnome-vfs - -[Harvest/*] -Parent=Rippers -Browser=Harvest - -[hcat/*] -Parent=Rippers -Browser=hcat - -[HLoader] -Parent=Rippers -Browser=HLoader - -[Holmes/*] -Parent=Rippers -Browser=Holmes - -[HTMLParser/*] -Parent=Rippers -Browser=HTMLParser - -[http generic] -Parent=Rippers -Browser=http generic - -[httpclient*] -Parent=Rippers - -[httperf/*] -Parent=Rippers -Browser=httperf - -[HTTPFetch/*] -Parent=Rippers -Browser=HTTPFetch - -[HTTPGrab] -Parent=Rippers -Browser=HTTPGrab - -[HttpSession] -Parent=Rippers -Browser=HttpSession - -[httpunit/*] -Parent=Rippers -Browser=HttpUnit - -[ICE_GetFile] -Parent=Rippers -Browser=ICE_GetFile - -[iexplore.exe] -Parent=Rippers - -[Inet - Eureka App] -Parent=Rippers -Browser=Inet - Eureka App - -[INetURL/*] -Parent=Rippers -Browser=INetURL - -[InetURL:/*] -Parent=Rippers -Browser=InetURL - -[Internet Exploiter/*] -Parent=Rippers - -[Internet Explore *] -Parent=Rippers -Browser=Fake IE - -[Internet Explorer *] -Parent=Rippers -Browser=Fake IE - -[IP*Works!*/*] -Parent=Rippers -Browser=IP*Works! - -[IrssiUrlLog/*] -Parent=Rippers -Browser=IrssiUrlLog - -[JPluck/*] -Parent=Rippers -Browser=JPluck - -[Kapere (http://www.kapere.com)] -Parent=Rippers -Browser=Kapere - -[LeechFTP] -Parent=Rippers -Browser=LeechFTP - -[LeechGet*] -Parent=Rippers -Browser=LeechGet - -[libcurl-agent/*] -Parent=Rippers -Browser=libcurl - -[libWeb/clsHTTP*] -Parent=Rippers -Browser=libWeb/clsHTTP - -[lwp*] -Parent=Rippers - -[MFC_Tear_Sample] -Parent=Rippers -Browser=MFC_Tear_Sample - -[Moozilla] -Parent=Rippers -Browser=Moozilla - -[MovableType/*] -Parent=Rippers -Browser=MovableType Web Log - -[Mozilla/2.0 (compatible; NEWT ActiveX; Win32)] -Parent=Rippers -Browser=NEWT ActiveX -Platform=Win32 - -[Mozilla/3.0 (compatible)] -Parent=Rippers - -[Mozilla/3.0 (compatible; Indy Library)] -Parent=Rippers -Cookies=true - -[Mozilla/3.01 (compatible;)] -Parent=Rippers - -[Mozilla/4.0 (compatible; BorderManager*)] -Parent=Rippers -Browser=Novell BorderManager - -[Mozilla/4.0 (compatible;)] -Parent=Rippers - -[Mozilla/5.0 (compatible; IPCheck Server Monitor*)] -Parent=Rippers -Browser=IPCheck Server Monitor - -[OCN-SOC/*] -Parent=Rippers -Browser=OCN-SOC - -[Offline Explorer*] -Parent=Rippers -Browser=Offline Explorer - -[Open Web Analytics Bot*] -Parent=Rippers -Browser=Open Web Analytics Bot - -[OSSProxy*] -Parent=Rippers -Browser=OSSProxy - -[Pageload*] -Parent=Rippers -Browser=PageLoad - -[PageNest/*] -Parent=Rippers -Browser=PageNest - -[pavuk/*] -Parent=Rippers -Browser=Pavuk - -[PEAR HTTP_Request*] -Parent=Rippers -Browser=PEAR-PHP - -[PHP*] -Parent=Rippers -Browser=PHP - -[PigBlock (Windows NT 5.1; U)*] -Parent=Rippers -Browser=PigBlock -Win32=true - -[Pockey*] -Parent=Rippers -Browser=Pockey-GetHTML - -[POE-Component-Client-HTTP/*] -Parent=Rippers -Browser=POE-Component-Client-HTTP - -[PycURL/*] -Parent=Rippers -Browser=PycURL - -[Python*] -Parent=Rippers -Browser=Python - -[RepoMonkey*] -Parent=Rippers -Browser=RepoMonkey - -[SBL-BOT*] -Parent=Rippers -Browser=BlackWidow - -[ScoutAbout*] -Parent=Rippers -Browser=ScoutAbout - -[sherlock/*] -Parent=Rippers -Browser=Sherlock - -[SiteParser/*] -Parent=Rippers -Browser=SiteParser - -[SiteSnagger*] -Parent=Rippers -Browser=SiteSnagger - -[SiteSucker/*] -Parent=Rippers -Browser=SiteSucker - -[SiteWinder*] -Parent=Rippers -Browser=SiteWinder - -[Snoopy*] -Parent=Rippers -Browser=Snoopy - -[SOFTWING_TEAR_AGENT*] -Parent=Rippers -Browser=AspTear - -[SuperHTTP/*] -Parent=Rippers -Browser=SuperHTTP - -[Tcl http client package*] -Parent=Rippers -Browser=Tcl http client package - -[Twisted PageGetter] -Parent=Rippers -Browser=Twisted PageGetter - -[URL2File/*] -Parent=Rippers -Browser=URL2File - -[UtilMind HTTPGet] -Parent=Rippers -Browser=UtilMind HTTPGet - -[VCI WebViewer*] -Parent=Rippers -Browser=VCI WebViewer - -[W3CRobot/*] -Parent=Rippers -Browser=W3CRobot - -[Web Downloader*] -Parent=Rippers -Browser=Web Downloader - -[Web Downloader/*] -Parent=Rippers -Browser=Web Downloader - -[Web Magnet*] -Parent=Rippers -Browser=Web Magnet - -[WebAuto/*] -Parent=Rippers - -[webbandit/*] -Parent=Rippers -Browser=webbandit - -[WebCopier*] -Parent=Rippers -Browser=WebCopier - -[WebDownloader*] -Parent=Rippers -Browser=WebDownloader - -[WebFetch] -Parent=Rippers -Browser=WebFetch - -[webfetch/*] -Parent=Rippers -Browser=WebFetch - -[WebGatherer*] -Parent=Rippers -Browser=WebGatherer - -[WebGet] -Parent=Rippers -Browser=WebGet - -[WebReaper*] -Parent=Rippers -Browser=WebReaper - -[WebRipper] -Parent=Rippers -Browser=WebRipper - -[WebSauger*] -Parent=Rippers -Browser=WebSauger - -[Website Downloader*] -Parent=Rippers -Browser=Website Downloader - -[Website eXtractor*] -Parent=Rippers -Browser=Website eXtractor - -[Website Quester] -Parent=Rippers -Browser=Website Quester - -[WebsiteExtractor*] -Parent=Rippers -Browser=Website eXtractor - -[WebSnatcher*] -Parent=Rippers -Browser=WebSnatcher - -[Webster Pro*] -Parent=Rippers -Browser=Webster Pro - -[WebStripper*] -Parent=Rippers -Browser=WebStripper - -[WebWhacker*] -Parent=Rippers -Browser=WebWhacker - -[WinScripter iNet Tools] -Parent=Rippers -Browser=WinScripter iNet Tools - -[WWW-Mechanize/*] -Parent=Rippers -Browser=WWW-Mechanize - -[Zend_Http_Client] -Parent=Rippers -Browser=Zend_Http_Client - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Site Monitors - -[Site Monitors] -Parent=DefaultProperties -Browser=Site Monitors -Cookies=true -isBanned=true -Crawler=true - -[*EasyRider*] -Parent=Site Monitors -Browser=EasyRider - -[*maxamine.com--robot*] -Parent=Site Monitors -Browser=maxamine.com--robot -isBanned=true - -[*WebMon ?.*] -Parent=Site Monitors -Browser=WebMon - -[Kenjin Spider*] -Parent=Site Monitors -Browser=Kenjin Spider - -[Kevin http://*] -Parent=Site Monitors -Browser=Kevin -isBanned=true - -[Mozilla/4.0 (compatible; ChangeDetection/*] -Parent=Site Monitors -Browser=ChangeDetection - -[Myst Monitor Service v*] -Parent=Site Monitors -Browser=Myst Monitor Service - -[Net Probe] -Parent=Site Monitors -Browser=Net Probe - -[NetMechanic*] -Parent=Site Monitors -Browser=NetMechanic - -[NetReality*] -Parent=Site Monitors -Browser=NetReality - -[Pingdom GIGRIB*] -Parent=Site Monitors -Browser=Pingdom - -[Site Valet Online*] -Parent=Site Monitors -Browser=Site Valet -isBanned=true - -[SITECHECKER] -Parent=Site Monitors -Browser=SITECHECKER - -[sitemonitor@dnsvr.com/*] -Parent=Site Monitors -Browser=ZoneEdit Failover Monitor -isBanned=false - -[UpTime Checker*] -Parent=Site Monitors -Browser=UpTime Checker - -[URL Control*] -Parent=Site Monitors -Browser=URL Control - -[URL_Access/*] -Parent=Site Monitors - -[URLCHECK] -Parent=Site Monitors -Browser=URLCHECK - -[URLy Warning*] -Parent=Site Monitors -Browser=URLy Warning - -[Webcheck *] -Parent=Site Monitors -Browser=Webcheck -Version=1.0 -MajorVer=1 -MinorVer=0 - -[WebPatrol/*] -Parent=Site Monitors -Browser=WebPatrol - -[websitepulse checker/*] -Parent=Site Monitors -Browser=websitepulse checker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Social Bookmarkers - -[Social Bookmarkers] -Parent=DefaultProperties -Browser=Social Bookmarkers -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[BookmarkBase(2/;http://bookmarkbase.com)] -Parent=Social Bookmarkers -Browser=BookmarkBase - -[Cocoal.icio.us/1.0 (v43) (Mac OS X; http://www.scifihifi.com/cocoalicious)] -Parent=Social Bookmarkers -Browser=Cocoalicious - -[Mozilla/5.0 (compatible; FriendFeedBot/0.*; Http://friendfeed.com/about/bot)] -Parent=Social Bookmarkers -Browser=FriendFeedBot - -[Twitturly*] -Parent=Social Bookmarkers -Browser=Twitturly - -[WinkBot/*] -Parent=Social Bookmarkers -Browser=WinkBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Translators - -[Translators] -Parent=DefaultProperties -Browser=Translators -Frames=true -Tables=true -Cookies=true - -[Seram Server] -Parent=Translators -Browser=Seram Server - -[TeragramWebcrawler/*] -Parent=Translators -Browser=TeragramWebcrawler -Version=1.0 -MajorVer=1 -MinorVer=0 - -[WebIndexer/* (Web Indexer; *)] -Parent=Translators -Browser=WorldLingo - -[WebTrans] -Parent=Translators -Browser=WebTrans - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Version Checkers - -[Version Checkers] -Parent=DefaultProperties -Browser=Version Checkers -Crawler=true - -[Automated Browscap.ini Updater. To report issues contact us at http://www.skycomp.ca] -Parent=Version Checkers -Browser=Automated Browscap.ini Updater - -[BMC Link Validator (http://www.briansmodelcars.com/links/)] -Parent=Version Checkers -Browser=BMC Link Validator -MajorVer=1 -MinorVer=0 -Platform=Win2000 - -[Browscap updater] -Parent=Version Checkers -Browser=Browscap updater - -[BrowscapUpdater1.0] -Parent=Version Checkers - -[Browser Capabilities Project (http://browsers.garykeith.com; http://browsers.garykeith.com/sitemail/contact-me.asp)] -Parent=Version Checkers -Browser=Gary Keith's Version Checker - -[Browser Capabilities Project AutoDownloader] -Parent=Version Checkers -Browser=TKC AutoDownloader - -[browsers.garykeith.com browscap.ini bot BETA] -Parent=Version Checkers - -[Code Sample Web Client] -Parent=Version Checkers -Browser=Code Sample Web Client - -[Desktop Sidebar*] -Parent=Version Checkers -Browser=Desktop Sidebar -isBanned=true - -[Mono Browser Capabilities Updater*] -Parent=Version Checkers -Browser=Mono Browser Capabilities Updater -isBanned=true - -[Rewmi/*] -Parent=Version Checkers -isBanned=true - -[Subtext Version 1.9* - http://subtextproject.com/ (Microsoft Windows NT 5.2.*)] -Parent=Version Checkers -Browser=Subtext - -[TherapeuticResearch] -Parent=Version Checkers -Browser=TherapeuticResearch - -[UpdateBrowscap*] -Parent=Version Checkers -Browser=UpdateBrowscap - -[www.garykeith.com browscap.ini bot*] -Parent=Version Checkers -Browser=clarkson.edu - -[www.substancia.com AutoHTTPAgent (ver *)] -Parent=Version Checkers -Browser=Substância - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Become - -[Become] -Parent=DefaultProperties -Browser=Become -Frames=true -Tables=true -isSyndicationReader=true -Crawler=true - -[*BecomeBot/*] -Parent=Become -Browser=BecomeBot - -[*BecomeBot@exava.com*] -Parent=Become -Browser=BecomeBot - -[*Exabot@exava.com*] -Parent=Become -Browser=Exabot - -[MonkeyCrawl/*] -Parent=Become -Browser=MonkeyCrawl - -[Mozilla/5.0 (compatible; BecomeJPBot/2.3; *)] -Parent=Become -Browser=BecomeJPBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Blue Coat Systems - -[Blue Coat Systems] -Parent=DefaultProperties -Browser=Blue Coat Systems -isBanned=true -Crawler=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Browscap Abusers - -[Browscap Abusers] -Parent=DefaultProperties -Browser=Browscap Abusers -isBanned=true - -[Apple-PubSub/*] -Parent=Browscap Abusers -Browser=Apple-PubSub - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FeedHub - -[FeedHub] -Parent=DefaultProperties -Browser=FeedHub -isSyndicationReader=true - -[FeedHub FeedDiscovery/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub FeedDiscovery -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedHub FeedFetcher/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub FeedFetcher -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedHub MetaDataFetcher/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub MetaDataFetcher -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Internet Content Rating Association] -Parent=DefaultProperties -Browser= -Frames=true -IFrames=true -Tables=true -Cookies=true -Crawler=true - -[ICRA_label_generator/1.?] -Parent=Internet Content Rating Association -Browser=ICRA_label_generator - -[ICRA_Semantic_spider/0.?] -Parent=Internet Content Rating Association -Browser=ICRA_Semantic_spider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NameProtect - -[NameProtect] -Parent=DefaultProperties -Browser=NameProtect -isBanned=true -Crawler=true - -[abot/*] -Parent=NameProtect -Browser=NameProtect - -[NP/*] -Parent=NameProtect -Browser=NameProtect - -[NPBot*] -Parent=NameProtect -Browser=NameProtect - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netcraft - -[Netcraft] -Parent=DefaultProperties -Browser=Netcraft -isBanned=true -Crawler=true - -[*Netcraft Web Server Survey*] -Parent=Netcraft -Browser=Netcraft Webserver Survey -isBanned=true - -[Mozilla/5.0 (compatible; NetcraftSurveyAgent/1.0; info@netcraft.com)] -Parent=Netcraft -Browser=NetcraftSurveyAgent - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NewsGator - -[NewsGator] -Parent=DefaultProperties -Browser=NewsGator -isSyndicationReader=true - -[MarsEdit*] -Parent=NewsGator -Browser=MarsEdit - -[NetNewsWire*/*] -Parent=NewsGator -Browser=NetNewsWire -Platform=MacOSX - -[NewsFire/*] -Parent=NewsGator -Browser=NewsFire - -[NewsGator FetchLinks extension/*] -Parent=NewsGator -Browser=NewsGator FetchLinks - -[NewsGator/*] -Parent=NewsGator -Browser=NewsGator -isBanned=true - -[NewsGatorOnline/*] -Parent=NewsGator -Browser=NewsGatorOnline - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.2 - -[Chrome 0.2] -Parent=DefaultProperties -Browser=Chrome -Version=0.2 -MinorVer=2 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.3 - -[Chrome 0.3] -Parent=DefaultProperties -Browser=Chrome -Version=0.3 -MinorVer=3 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.4 - -[Chrome 0.4] -Parent=DefaultProperties -Browser=Chrome -Version=0.4 -MinorVer=4 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.5 - -[Chrome 0.5] -Parent=DefaultProperties -Browser=Chrome -Version=0.5 -MinorVer=5 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 1.0 - -[Chrome 1.0] -Parent=DefaultProperties -Browser=Chrome -Version=1.0 -MajorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 2.0 - -[Chrome 2.0] -Parent=DefaultProperties -Browser=Chrome -Version=2.0 -MajorVer=2 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 3.0 - -[Chrome 3.0] -Parent=DefaultProperties -Browser=Chrome -Version=3.0 -MajorVer=3 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google Code - -[Google Code] -Parent=DefaultProperties -Browser=Google Code -Tables=true -Cookies=true -JavaApplets=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.2 - -[Iron 0.2] -Parent=DefaultProperties -Browser=Iron -Version=0.2 -MinorVer=2 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.3 - -[Iron 0.3] -Parent=DefaultProperties -Browser=Iron -Version=0.3 -MinorVer=3 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.4 - -[Iron 0.4] -Parent=DefaultProperties -Browser=Iron -Version=0.4 -MinorVer=4 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iPod - -[iPod] -Parent=DefaultProperties -Browser=iPod -Platform=iPhone OSX -isMobileDevice=true - -[Mozilla/5.0 (iPod; U; *Mac OS X; *) AppleWebKit/* (*) Version/3.0 Mobile/* Safari/*] -Parent=iPod -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX - -[Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2 like Mac OS X; en-us) AppleWebKit/* (KHTML, like Gecko) Mobile/*] -Parent=iPod - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iTunes - -[iTunes] -Parent=DefaultProperties -Browser=iTunes -Platform=iPhone OSX - -[iTunes/* (Windows; ?)] -Parent=iTunes -Browser=iTunes -Platform=Win32 -Win32=true - -[MOT-* iTunes/* MIB/* Profile/MIDP-* Configuration/CLDC-* UP.Link/*] -Parent=iTunes - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Media Players - -[Media Players] -Parent=DefaultProperties -Browser=Media Players -Cookies=true - -[Microsoft NetShow(TM) Player with RealVideo(R)] -Parent=Media Players -Browser=Microsoft NetShow - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; *) AppleWebKit/* RealPlayer] -Parent=Media Players -Browser=RealPlayer -Platform=MacOSX - -[MPlayer 0.9*] -Parent=Media Players -Browser=MPlayer -Version=0.9 -MajorVer=0 -MinorVer=9 - -[MPlayer 1.*] -Parent=Media Players -Browser=MPlayer -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MPlayer HEAD CVS] -Parent=Media Players -Browser=MPlayer - -[RealPlayer*] -Parent=Media Players -Browser=RealPlayer - -[RMA/*] -Parent=Media Players -Browser=RMA - -[VLC media player*] -Parent=Media Players -Browser=VLC - -[vobsub] -Parent=Media Players -Browser=vobsub -isBanned=true - -[WinampMPEG/*] -Parent=Media Players -Browser=WinAmp - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nintendo - -[Nintendo Wii] -Parent=DefaultProperties -Browser= -isMobileDevice=true - -[Opera/* (Nintendo DSi; Opera/*; *; *)] -Parent=Nintendo Wii -Browser=DSi - -[Opera/* (Nintendo Wii; U; *)] -Parent=Nintendo Wii -Browser=Wii - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Windows Media Player - -[Windows Media Player] -Parent=DefaultProperties -Browser=Windows Media Player -Cookies=true - -[NSPlayer/10.*] -Parent=Windows Media Player -Version=10.0 -MajorVer=10 -MinorVer=0 - -[NSPlayer/11.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=11.0 -MajorVer=11 -MinorVer=0 - -[NSPlayer/4.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=4.0 -MajorVer=4 -MinorVer=0 - -[NSPlayer/7.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=7.0 -MajorVer=7 -MinorVer=0 - -[NSPlayer/8.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=8.0 -MajorVer=8 -MinorVer=0 - -[NSPlayer/9.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=9.0 -MajorVer=9 -MinorVer=0 - -[Windows-Media-Player/10.*] -Parent=Windows Media Player -Browser=Windows-Media-Player -Version=10.0 -MajorVer=10 -MinorVer=0 -Win32=true - -[Windows-Media-Player/11.*] -Parent=Windows Media Player -Version=11.0 -MajorVer=11 -MinorVer=0 -Win32=true - -[Windows-Media-Player/7.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=7.0 -MajorVer=7 -MinorVer=0 -Win32=true - -[Windows-Media-Player/8.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=8.0 -MajorVer=8 -MinorVer=0 -Win32=true - -[Windows-Media-Player/9.*] -Parent=Windows Media Player -Version=9.0 -MajorVer=9 -MinorVer=0 -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Zune - -[Zune] -Parent=DefaultProperties -Browser=Zune -Cookies=true - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 2.0*)*] -Parent=Zune -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 2.5*)*] -Parent=Zune -Version=2.5 -MajorVer=2 -MinorVer=5 - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 3.0*)*] -Parent=Zune -Version=3.0 -MajorVer=3 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.0 - -[QuickTime 7.0] -Parent=DefaultProperties -Browser=QuickTime -Version=7.0 -MajorVer=7 -Cookies=true - -[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.0 -Platform=MacOSX - -[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.0 -Platform=MacPPC - -[QuickTime (qtver=7.0*;os=Windows 95*)] -Parent=QuickTime 7.0 -Platform=Win95 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows 98*)] -Parent=QuickTime 7.0 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows Me*)] -Parent=QuickTime 7.0 -Platform=WinME -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 4.0*)] -Parent=QuickTime 7.0 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.0*)] -Parent=QuickTime 7.0 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.1*)] -Parent=QuickTime 7.0 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.2*)] -Parent=QuickTime 7.0 -Platform=Win2003 -Win32=true - -[QuickTime/7.0.* (qtver=7.0.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.0 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.1 - -[QuickTime 7.1] -Parent=DefaultProperties -Browser=QuickTime -Version=7.1 -MajorVer=7 -MinorVer=1 -Cookies=true - -[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.1 -Platform=MacOSX - -[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.1 -Platform=MacPPC - -[QuickTime (qtver=7.1*;os=Windows 98*)] -Parent=QuickTime 7.1 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 4.0*)] -Parent=QuickTime 7.1 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.0*)] -Parent=QuickTime 7.1 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.1*)] -Parent=QuickTime 7.1 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.2*)] -Parent=QuickTime 7.1 -Platform=Win2003 -Win32=true - -[QuickTime/7.1.* (qtver=7.1.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.1 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.2 - -[QuickTime 7.2] -Parent=DefaultProperties -Browser=QuickTime -Version=7.2 -MajorVer=7 -MinorVer=2 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.2*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.2 -Platform=MacOSX - -[QuickTime (qtver=7.2*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.2 -Platform=MacPPC - -[QuickTime (qtver=7.2*;os=Windows 98*)] -Parent=QuickTime 7.2 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 4.0*)] -Parent=QuickTime 7.2 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.0*)] -Parent=QuickTime 7.2 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.1*)] -Parent=QuickTime 7.2 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.2*)] -Parent=QuickTime 7.2 -Platform=Win2003 -Win32=true - -[QuickTime/7.2.* (qtver=7.2.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.2 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.3 - -[QuickTime 7.3] -Parent=DefaultProperties -Browser=QuickTime -Version=7.3 -MajorVer=7 -MinorVer=3 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.3*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.3 -Platform=MacOSX - -[QuickTime (qtver=7.3*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.3 -Platform=MacPPC - -[QuickTime (qtver=7.3*;os=Windows 98*)] -Parent=QuickTime 7.3 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 4.0*)] -Parent=QuickTime 7.3 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.0*)] -Parent=QuickTime 7.3 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.1*)] -Parent=QuickTime 7.3 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.2*)] -Parent=QuickTime 7.3 -Platform=Win2003 -Win32=true - -[QuickTime/7.3.* (qtver=7.3.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.3 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.4 - -[QuickTime 7.4] -Parent=DefaultProperties -Browser=QuickTime -Version=7.4 -MajorVer=7 -MinorVer=4 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.4*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.4 -Platform=MacOSX - -[QuickTime (qtver=7.4*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.4 -Platform=MacPPC - -[QuickTime (qtver=7.4*;os=Windows 98*)] -Parent=QuickTime 7.4 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 4.0*)] -Parent=QuickTime 7.4 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.0*)] -Parent=QuickTime 7.4 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.1*)] -Parent=QuickTime 7.4 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.2*)] -Parent=QuickTime 7.4 -Platform=Win2003 -Win32=true - -[QuickTime/7.4.* (qtver=7.4.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.4 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google Android - -[Android] -Parent=DefaultProperties -Browser=Android -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[Mozilla/5.0 (Linux; U; Android *; *) AppleWebKit/* (KHTML, like Gecko) Safari/*] -Parent=Android -Browser=Android -Platform=Linux -isMobileDevice=true - -[Mozilla/5.0 (Linux; U; Android *; *) AppleWebKit/* (KHTML, like Gecko) Version/3.0.* Mobile Safari/*] -Parent=Android -Browser=Android -Platform=Linux -isMobileDevice=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BlackBerry - -[BlackBerry] -Parent=DefaultProperties -Browser=BlackBerry -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[*BlackBerry*] -Parent=BlackBerry - -[*BlackBerrySimulator/*] -Parent=BlackBerry - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Handspring Blazer - -[Blazer] -Parent=DefaultProperties -Browser=Handspring Blazer -Platform=Palm -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 95; PalmSource; Blazer 3.0) 16;160x160] -Parent=Blazer -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.0) 16;320x448] -Parent=Blazer -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.1) 16;320x320] -Parent=Blazer -Version=4.1 -MajorVer=4 -MinorVer=1 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.2) 16;320x320] -Parent=Blazer -Version=4.2 -MajorVer=4 -MinorVer=2 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.4) 16;320x320] -Parent=Blazer -Version=4.4 -MajorVer=4 -MinorVer=4 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.5) 16;320x320] -Parent=Blazer -Version=4.5 -MajorVer=4 -MinorVer=5 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DoCoMo - -[DoCoMo] -Parent=DefaultProperties -Browser=DoCoMo -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[DoCoMo/1.0*] -Parent=DoCoMo -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WAP - -[DoCoMo/2.0*] -Parent=DoCoMo -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=WAP - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IEMobile - -[IEMobile] -Parent=DefaultProperties -Browser=IEMobile -Platform=WinCE -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -VBScript=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.*)*] -Parent=IEMobile -Version=6.0 -MajorVer=6 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.*)*] -Parent=IEMobile -Version=7.0 -MajorVer=7 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iPhone - -[iPhone] -Parent=DefaultProperties -Browser=iPhone -Platform=iPhone OSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -isMobileDevice=true -CssVersion=3 -supportsCSS=true - -[Mozilla/4.0 (iPhone; *)] -Parent=iPhone - -[Mozilla/4.0 (iPhone; U; CPU like Mac OS X; *)] -Parent=iPhone - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_0_1 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_1 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko)] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0_2 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_1 like Mac OS X; *)*] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_2_1 like Mac OS X; *)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.0 Mobile/* Safari/*] -Parent=iPhone -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/5.0 (iPod; U; *Mac OS X; *) AppleWebKit/* (*) Version/* Mobile/*] -Parent=iPhone -Browser=iTouch - -[Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2* like Mac OS X; *)*] -Parent=iPhone -Browser=iTouch -Version=2.2 -MajorVer=2 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KDDI - -[KDDI] -Parent=DefaultProperties -Browser=KDDI -Frames=true -Tables=true -Cookies=true -BackgroundSounds=true -VBScript=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[KDDI-* UP.Browser/* (GUI) MMP/*] -Parent=KDDI - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Miscellaneous Mobile - -[Miscellaneous Mobile] -Parent=DefaultProperties -Browser= -IFrames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; *; CentOS; *) AppleWebKit/* (KHTML, like Gecko) Bolt/0.* Version/3.0 Safari/*] -Parent=Miscellaneous Mobile -Browser=Bolt - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Motorola Internet Browser - -[Motorola Internet Browser] -Parent=DefaultProperties -Browser=Motorola Internet Browser -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[MOT-*/*] -Parent=Motorola Internet Browser - -[MOT-1*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-8700_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-0A/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-2B/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-88/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-C???/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-GATW_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-L6/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-L7/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-M*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-MP*/* Mozilla/* (compatible; MSIE *; Windows CE; *)] -Parent=Motorola Internet Browser -Win32=true - -[MOT-MP*/* Mozilla/4.0 (compatible; MSIE *; Windows CE; *)] -Parent=Motorola Internet Browser -Win32=true - -[MOT-SAP4_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-T*/*] -Parent=Motorola Internet Browser - -[MOT-T7*/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-T721*] -Parent=Motorola Internet Browser - -[MOT-TA02/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V*/*] -Parent=Motorola Internet Browser - -[MOT-V*/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-V3/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V4*/* MIB/*] -Parent=Motorola Internet Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN Mobile Proxy - -[MSN Mobile Proxy] -Parent=DefaultProperties -Browser=MSN Mobile Proxy -Win32=true -Frames=true -Tables=true -Cookies=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true - -[Mozilla/* (compatible; MSIE *; Windows*; MSN Mobile Proxy)] -Parent=MSN Mobile Proxy - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetFront - -[NetFront] -Parent=DefaultProperties -Browser=NetFront -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[*NetFront/*] -Parent=NetFront - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nokia - -[Nokia] -Parent=DefaultProperties -Browser=Nokia -Tables=true -Cookies=true -isMobileDevice=true - -[*Nokia*/*] -Parent=Nokia - -[Mozilla/* (SymbianOS/*; ?; *) AppleWebKit/* (KHTML, like Gecko) Safari/*] -Parent=Nokia -Platform=SymbianOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Openwave Mobile Browser - -[Openwave Mobile Browser] -Parent=DefaultProperties -Browser=Openwave Mobile Browser -Alpha=true -Win32=true -Win64=true -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[*UP.Browser/*] -Parent=Openwave Mobile Browser - -[*UP.Link/*] -Parent=Openwave Mobile Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera Mini - -[Opera Mini] -Parent=DefaultProperties -Browser=Opera Mini -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[Opera/* (J2ME/MIDP; Opera Mini/1.0*)*] -Parent=Opera Mini -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/1.1*)*] -Parent=Opera Mini -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/1.2*)*] -Parent=Opera Mini -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Opera/* (J2ME/MIDP; Opera Mini/2.0*)*] -Parent=Opera Mini -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/3.0*)*] -Parent=Opera Mini -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/3.1*)*] -Parent=Opera Mini -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/4.0*)*] -Parent=Opera Mini -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/4.1*)*] -Parent=Opera Mini -Version=4.1 -MajorVer=4 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/4.2*)*] -Parent=Opera Mini -Version=4.2 -MajorVer=4 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera Mobile - -[Opera Mobile] -Parent=DefaultProperties -Browser=Opera Mobi -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Opera/9.5 (Microsoft Windows; PPC; *Opera Mobile/*)] -Parent=Opera Mobile -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Opera/9.5 (Microsoft Windows; PPC; Opera Mobi/*)] -Parent=Opera Mobile -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Opera/9.51 Beta (Microsoft Windows; PPC; Opera Mobi/*)*] -Parent=Opera Mobile -Version=9.51 -MajorVer=9 -MinorVer=51 -Beta=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Playstation - -[Playstation] -Parent=DefaultProperties -Browser=Playstation -Platform=WAP -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Mozilla/* (PLAYSTATION *; *)] -Parent=Playstation -Browser=PlayStation 3 -Frames=false - -[Mozilla/* (PSP (PlayStation Portable); *)] -Parent=Playstation - -[Sony PS2 (Linux)] -Parent=Playstation -Browser=Sony PS2 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Pocket PC - -[Pocket PC] -Parent=DefaultProperties -Browser=Pocket PC -Platform=WinCE -Win32=true -Frames=true -Tables=true -Cookies=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*(compatible; MSIE *.*; Windows CE; PPC; *)] -Parent=Pocket PC - -[HTC-*/* Mozilla/* (compatible; MSIE *.*; Windows CE*)*] -Parent=Pocket PC -Win32=true - -[Mozilla/* (compatible; MSPIE *.*; *Windows CE*)*] -Parent=Pocket PC -Win32=true - -[T-Mobile* Mozilla/* (compatible; MSIE *.*; Windows CE; *)] -Parent=Pocket PC - -[Vodafone* Mozilla/* (compatible; MSIE *.*; Windows CE; *)*] -Parent=Pocket PC - -[Windows CE (Pocket PC) - Version *.*] -Parent=Pocket PC -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SEMC Browser - -[SEMC Browser] -Parent=DefaultProperties -Browser=SEMC Browser -Platform=JAVA -Tables=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*SEMC-Browser/*] -Parent=SEMC Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SonyEricsson - -[SonyEricsson] -Parent=DefaultProperties -Browser=SonyEricsson -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*Ericsson*] -Parent=SonyEricsson - -[*SonyEricsson*] -Parent=SonyEricsson - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netbox - -[Netbox] -Parent=DefaultProperties -Browser=Netbox -Frames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/3.01 (compatible; Netbox/*; Linux*)] -Parent=Netbox -Browser=Netbox -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PowerTV - -[PowerTV] -Parent=DefaultProperties -Browser=PowerTV -Platform=PowerTV -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/4.0 PowerTV/1.5 (Compatible; Spyglass DM 3.2.1, EXPLORER)] -Parent=PowerTV -Version=1.5 -MajorVer=1 -MinorVer=5 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WebTV/MSNTV - -[WebTV] -Parent=DefaultProperties -Browser=WebTV/MSNTV -Platform=WebTV -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/3.0 WebTV/1.*(compatible; MSIE 2.0)] -Parent=WebTV -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/4.0 WebTV/2.0*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/4.0 WebTV/2.1*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/4.0 WebTV/2.2*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Mozilla/4.0 WebTV/2.3*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.3 -MajorVer=2 -MinorVer=3 - -[Mozilla/4.0 WebTV/2.4*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.4 -MajorVer=2 -MinorVer=4 - -[Mozilla/4.0 WebTV/2.5*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.5 -MajorVer=2 -MinorVer=5 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.6*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.6 -MajorVer=2 -MinorVer=6 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.7*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.7 -MajorVer=2 -MinorVer=7 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.8*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.8 -MajorVer=2 -MinorVer=8 -JavaApplets=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.9*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.9 -MajorVer=2 -MinorVer=9 -JavaApplets=true -CssVersion=1 -supportsCSS=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Amaya - -[Amaya] -Parent=DefaultProperties -Browser=Amaya -Tables=true -Cookies=true - -[amaya/7.*] -Parent=Amaya -Version=7.0 -MajorVer=7 -MinorVer=0 - -[amaya/8.0*] -Parent=Amaya -Version=8.0 -MajorVer=8 -MinorVer=0 -CssVersion=2 -supportsCSS=true - -[amaya/8.1*] -Parent=Amaya -Version=8.1 -MajorVer=8 -MinorVer=1 -CssVersion=2 -supportsCSS=true - -[amaya/8.2*] -Parent=Amaya -Version=8.2 -MajorVer=8 -MinorVer=2 -CssVersion=2 -supportsCSS=true - -[amaya/8.3*] -Parent=Amaya -Version=8.3 -MajorVer=8 -MinorVer=3 -CssVersion=2 -supportsCSS=true - -[amaya/8.4*] -Parent=Amaya -Version=8.4 -MajorVer=8 -MinorVer=4 -CssVersion=2 -supportsCSS=true - -[amaya/8.5*] -Parent=Amaya -Version=8.5 -MajorVer=8 -MinorVer=5 -CssVersion=2 -supportsCSS=true - -[amaya/8.6*] -Parent=Amaya -Version=8.6 -MajorVer=8 -MinorVer=6 -CssVersion=2 -supportsCSS=true - -[amaya/8.7*] -Parent=Amaya -Version=8.7 -MajorVer=8 -MinorVer=7 -CssVersion=2 -supportsCSS=true - -[amaya/8.8*] -Parent=Amaya -Version=8.8 -MajorVer=8 -MinorVer=8 -CssVersion=2 -supportsCSS=true - -[amaya/8.9*] -Parent=Amaya -Version=8.9 -MajorVer=8 -MinorVer=9 -CssVersion=2 -supportsCSS=true - -[amaya/9.0*] -Parent=Amaya -Version=9.0 -MajorVer=8 -MinorVer=0 -CssVersion=2 -supportsCSS=true - -[amaya/9.1*] -Parent=Amaya -Version=9.1 -MajorVer=9 -MinorVer=1 -CssVersion=2 -supportsCSS=true - -[amaya/9.2*] -Parent=Amaya -Version=9.2 -MajorVer=9 -MinorVer=2 -CssVersion=2 -supportsCSS=true - -[amaya/9.3*] -Parent=Amaya -Version=9.3 -MajorVer=9 -MinorVer=3 - -[amaya/9.4*] -Parent=Amaya -Version=9.4 -MajorVer=9 -MinorVer=4 - -[amaya/9.5*] -Parent=Amaya -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Emacs-w3m/*] -Parent=Emacs/W3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Links - -[Links] -Parent=DefaultProperties -Browser=Links -Frames=true -Tables=true - -[Links (0.9*; CYGWIN_NT-5.1*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=WinXP - -[Links (0.9*; Darwin*)] -Parent=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=MacPPC - -[Links (0.9*; FreeBSD*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=FreeBSD - -[Links (0.9*; Linux*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Linux - -[Links (0.9*; OS/2*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=OS/2 - -[Links (0.9*; Unix*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Unix - -[Links (0.9*; Win32*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Win32 -Win32=true - -[Links (1.0*; CYGWIN_NT-5.1*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP - -[Links (1.0*; FreeBSD*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=FreeBSD - -[Links (1.0*; Linux*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Linux - -[Links (1.0*; OS/2*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=OS/2 - -[Links (1.0*; Unix*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Unix - -[Links (1.0*; Win32*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win32 -Win32=true - -[Links (2.0*; Linux*)] -Parent=Links -Browser=Links -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Linux - -[Links (2.1*; FreeBSD*)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=FreeBSD - -[Links (2.1*; Linux *)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=Linux - -[Links (2.1*; OpenBSD*)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=OpenBSD - -[Links (2.2*; FreeBSD*)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=FreeBSD - -[Links (2.2*; Linux *)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=Linux - -[Links (2.2*; OpenBSD*)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=OpenBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lynx - -[Lynx] -Parent=DefaultProperties -Browser=Lynx -Frames=true -Tables=true - -[Lynx *] -Parent=Lynx -Browser=Lynx - -[Lynx/2.3*] -Parent=Lynx -Browser=Lynx -Version=2.3 -MajorVer=2 -MinorVer=3 - -[Lynx/2.4*] -Parent=Lynx -Browser=Lynx -Version=2.4 -MajorVer=2 -MinorVer=4 - -[Lynx/2.5*] -Parent=Lynx -Browser=Lynx -Version=2.5 -MajorVer=2 -MinorVer=5 - -[Lynx/2.6*] -Parent=Lynx -Browser=Lynx -Version=2.6 -MajorVer=2 -MinorVer=6 - -[Lynx/2.7*] -Parent=Lynx -Browser=Lynx -Version=2.7 -MajorVer=2 -MinorVer=7 - -[Lynx/2.8*] -Parent=Lynx -Browser=Lynx -Version=2.8 -MajorVer=2 -MinorVer=8 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NCSA Mosaic - -[Mosaic] -Parent=DefaultProperties -Browser=Mosaic - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; w3m - -[w3m] -Parent=DefaultProperties -Browser=w3m -Frames=true -Tables=true - -[w3m/0.1*] -Parent=w3m -Browser=w3m -Version=0.1 -MajorVer=0 -MinorVer=1 - -[w3m/0.2*] -Parent=w3m -Browser=w3m -Version=0.2 -MajorVer=0 -MinorVer=2 - -[w3m/0.3*] -Parent=w3m -Browser=w3m -Version=0.3 -MajorVer=0 -MinorVer=3 - -[w3m/0.4*] -Parent=w3m -Browser=w3m -Version=0.4 -MajorVer=0 -MinorVer=4 -Cookies=true - -[w3m/0.5*] -Parent=w3m -Browser=w3m -Version=0.5 -MajorVer=0 -MinorVer=5 -Cookies=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.10 - -[ELinks 0.10] -Parent=DefaultProperties -Browser=ELinks -Version=0.10 -MinorVer=10 -Frames=true -Tables=true - -[ELinks (0.10*; *AIX*)] -Parent=ELinks 0.10 -Platform=AIX - -[ELinks (0.10*; *BeOS*)] -Parent=ELinks 0.10 -Platform=BeOS - -[ELinks (0.10*; *CygWin*)] -Parent=ELinks 0.10 -Platform=CygWin - -[ELinks (0.10*; *Darwin*)] -Parent=ELinks 0.10 -Platform=Darwin - -[ELinks (0.10*; *Digital Unix*)] -Parent=ELinks 0.10 -Platform=Digital Unix - -[ELinks (0.10*; *FreeBSD*)] -Parent=ELinks 0.10 -Platform=FreeBSD - -[ELinks (0.10*; *HPUX*)] -Parent=ELinks 0.10 -Platform=HP-UX - -[ELinks (0.10*; *IRIX*)] -Parent=ELinks 0.10 -Platform=IRIX - -[ELinks (0.10*; *Linux*)] -Parent=ELinks 0.10 -Platform=Linux - -[ELinks (0.10*; *NetBSD*)] -Parent=ELinks 0.10 -Platform=NetBSD - -[ELinks (0.10*; *OpenBSD*)] -Parent=ELinks 0.10 -Platform=OpenBSD - -[ELinks (0.10*; *OS/2*)] -Parent=ELinks 0.10 -Platform=OS/2 - -[ELinks (0.10*; *RISC*)] -Parent=ELinks 0.10 -Platform=RISC OS - -[ELinks (0.10*; *Solaris*)] -Parent=ELinks 0.10 -Platform=Solaris - -[ELinks (0.10*; *Unix*)] -Parent=ELinks 0.10 -Platform=Unix - -[ELinks/0.10* (*AIX*)] -Parent=ELinks 0.10 -Platform=AIX - -[ELinks/0.10* (*BeOS*)] -Parent=ELinks 0.10 -Platform=BeOS - -[ELinks/0.10* (*CygWin*)] -Parent=ELinks 0.10 -Platform=CygWin - -[ELinks/0.10* (*Darwin*)] -Parent=ELinks 0.10 -Platform=Darwin - -[ELinks/0.10* (*Digital Unix*)] -Parent=ELinks 0.10 -Platform=Digital Unix - -[ELinks/0.10* (*FreeBSD*)] -Parent=ELinks 0.10 -Platform=FreeBSD - -[ELinks/0.10* (*HPUX*)] -Parent=ELinks 0.10 -Platform=HP-UX - -[ELinks/0.10* (*IRIX*)] -Parent=ELinks 0.10 -Platform=IRIX - -[ELinks/0.10* (*Linux*)] -Parent=ELinks 0.10 -Platform=Linux - -[ELinks/0.10* (*NetBSD*)] -Parent=ELinks 0.10 -Platform=NetBSD - -[ELinks/0.10* (*OpenBSD*)] -Parent=ELinks 0.10 -Platform=OpenBSD - -[ELinks/0.10* (*OS/2*)] -Parent=ELinks 0.10 -Platform=OS/2 - -[ELinks/0.10* (*RISC*)] -Parent=ELinks 0.10 -Platform=RISC OS - -[ELinks/0.10* (*Solaris*)] -Parent=ELinks 0.10 -Platform=Solaris - -[ELinks/0.10* (*Unix*)] -Parent=ELinks 0.10 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.11 - -[ELinks 0.11] -Parent=DefaultProperties -Browser=ELinks -Version=0.11 -MinorVer=11 -Frames=true -Tables=true - -[ELinks (0.11*; *AIX*)] -Parent=ELinks 0.11 -Platform=AIX - -[ELinks (0.11*; *BeOS*)] -Parent=ELinks 0.11 -Platform=BeOS - -[ELinks (0.11*; *CygWin*)] -Parent=ELinks 0.11 -Platform=CygWin - -[ELinks (0.11*; *Darwin*)] -Parent=ELinks 0.11 -Platform=Darwin - -[ELinks (0.11*; *Digital Unix*)] -Parent=ELinks 0.11 -Platform=Digital Unix - -[ELinks (0.11*; *FreeBSD*)] -Parent=ELinks 0.11 -Platform=FreeBSD - -[ELinks (0.11*; *HPUX*)] -Parent=ELinks 0.11 -Platform=HP-UX - -[ELinks (0.11*; *IRIX*)] -Parent=ELinks 0.11 -Platform=IRIX - -[ELinks (0.11*; *Linux*)] -Parent=ELinks 0.11 -Platform=Linux - -[ELinks (0.11*; *NetBSD*)] -Parent=ELinks 0.11 -Platform=NetBSD - -[ELinks (0.11*; *OpenBSD*)] -Parent=ELinks 0.11 -Platform=OpenBSD - -[ELinks (0.11*; *OS/2*)] -Parent=ELinks 0.11 -Platform=OS/2 - -[ELinks (0.11*; *RISC*)] -Parent=ELinks 0.11 -Platform=RISC OS - -[ELinks (0.11*; *Solaris*)] -Parent=ELinks 0.11 -Platform=Solaris - -[ELinks (0.11*; *Unix*)] -Parent=ELinks 0.11 -Platform=Unix - -[ELinks/0.11* (*AIX*)] -Parent=ELinks 0.11 -Platform=AIX - -[ELinks/0.11* (*BeOS*)] -Parent=ELinks 0.11 -Platform=BeOS - -[ELinks/0.11* (*CygWin*)] -Parent=ELinks 0.11 -Platform=CygWin - -[ELinks/0.11* (*Darwin*)] -Parent=ELinks 0.11 -Platform=Darwin - -[ELinks/0.11* (*Digital Unix*)] -Parent=ELinks 0.11 -Platform=Digital Unix - -[ELinks/0.11* (*FreeBSD*)] -Parent=ELinks 0.11 -Platform=FreeBSD - -[ELinks/0.11* (*HPUX*)] -Parent=ELinks 0.11 -Platform=HP-UX - -[ELinks/0.11* (*IRIX*)] -Parent=ELinks 0.11 -Platform=IRIX - -[ELinks/0.11* (*Linux*)] -Parent=ELinks 0.11 -Platform=Linux - -[ELinks/0.11* (*NetBSD*)] -Parent=ELinks 0.11 -Platform=NetBSD - -[ELinks/0.11* (*OpenBSD*)] -Parent=ELinks 0.11 -Platform=OpenBSD - -[ELinks/0.11* (*OS/2*)] -Parent=ELinks 0.11 -Platform=OS/2 - -[ELinks/0.11* (*RISC*)] -Parent=ELinks 0.11 -Platform=RISC OS - -[ELinks/0.11* (*Solaris*)] -Parent=ELinks 0.11 -Platform=Solaris - -[ELinks/0.11* (*Unix*)] -Parent=ELinks 0.11 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.12 - -[ELinks 0.12] -Parent=DefaultProperties -Browser=ELinks -Version=0.12 -MinorVer=12 -Frames=true -Tables=true - -[ELinks (0.12*; *AIX*)] -Parent=ELinks 0.12 -Platform=AIX - -[ELinks (0.12*; *BeOS*)] -Parent=ELinks 0.12 -Platform=BeOS - -[ELinks (0.12*; *CygWin*)] -Parent=ELinks 0.12 -Platform=CygWin - -[ELinks (0.12*; *Darwin*)] -Parent=ELinks 0.12 -Platform=Darwin - -[ELinks (0.12*; *Digital Unix*)] -Parent=ELinks 0.12 -Platform=Digital Unix - -[ELinks (0.12*; *FreeBSD*)] -Parent=ELinks 0.12 -Platform=FreeBSD - -[ELinks (0.12*; *HPUX*)] -Parent=ELinks 0.12 -Platform=HP-UX - -[ELinks (0.12*; *IRIX*)] -Parent=ELinks 0.12 -Platform=IRIX - -[ELinks (0.12*; *Linux*)] -Parent=ELinks 0.12 -Platform=Linux - -[ELinks (0.12*; *NetBSD*)] -Parent=ELinks 0.12 -Platform=NetBSD - -[ELinks (0.12*; *OpenBSD*)] -Parent=ELinks 0.12 -Platform=OpenBSD - -[ELinks (0.12*; *OS/2*)] -Parent=ELinks 0.12 -Platform=OS/2 - -[ELinks (0.12*; *RISC*)] -Parent=ELinks 0.12 -Platform=RISC OS - -[ELinks (0.12*; *Solaris*)] -Parent=ELinks 0.12 -Platform=Solaris - -[ELinks (0.12*; *Unix*)] -Parent=ELinks 0.12 -Platform=Unix - -[ELinks/0.12* (*AIX*)] -Parent=ELinks 0.12 -Platform=AIX - -[ELinks/0.12* (*BeOS*)] -Parent=ELinks 0.12 -Platform=BeOS - -[ELinks/0.12* (*CygWin*)] -Parent=ELinks 0.12 -Platform=CygWin - -[ELinks/0.12* (*Darwin*)] -Parent=ELinks 0.12 -Platform=Darwin - -[ELinks/0.12* (*Digital Unix*)] -Parent=ELinks 0.12 -Platform=Digital Unix - -[ELinks/0.12* (*FreeBSD*)] -Parent=ELinks 0.12 -Platform=FreeBSD - -[ELinks/0.12* (*HPUX*)] -Parent=ELinks 0.12 -Platform=HP-UX - -[ELinks/0.12* (*IRIX*)] -Parent=ELinks 0.12 -Platform=IRIX - -[ELinks/0.12* (*Linux*)] -Parent=ELinks 0.12 -Platform=Linux - -[ELinks/0.12* (*NetBSD*)] -Parent=ELinks 0.12 -Platform=NetBSD - -[ELinks/0.12* (*OpenBSD*)] -Parent=ELinks 0.12 -Platform=OpenBSD - -[ELinks/0.12* (*OS/2*)] -Parent=ELinks 0.12 -Platform=OS/2 - -[ELinks/0.12* (*RISC*)] -Parent=ELinks 0.12 -Platform=RISC OS - -[ELinks/0.12* (*Solaris*)] -Parent=ELinks 0.12 -Platform=Solaris - -[ELinks/0.12* (*Unix*)] -Parent=ELinks 0.12 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.9 - -[ELinks 0.9] -Parent=DefaultProperties -Browser=ELinks -Version=0.9 -MinorVer=9 -Frames=true -Tables=true - -[ELinks (0.9*; *AIX*)] -Parent=ELinks 0.9 -Platform=AIX - -[ELinks (0.9*; *BeOS*)] -Parent=ELinks 0.9 -Platform=BeOS - -[ELinks (0.9*; *CygWin*)] -Parent=ELinks 0.9 -Platform=CygWin - -[ELinks (0.9*; *Darwin*)] -Parent=ELinks 0.9 -Platform=Darwin - -[ELinks (0.9*; *Digital Unix*)] -Parent=ELinks 0.9 -Platform=Digital Unix - -[ELinks (0.9*; *FreeBSD*)] -Parent=ELinks 0.9 -Platform=FreeBSD - -[ELinks (0.9*; *HPUX*)] -Parent=ELinks 0.9 -Platform=HP-UX - -[ELinks (0.9*; *IRIX*)] -Parent=ELinks 0.9 -Platform=IRIX - -[ELinks (0.9*; *Linux*)] -Parent=ELinks 0.9 -Platform=Linux - -[ELinks (0.9*; *NetBSD*)] -Parent=ELinks 0.9 -Platform=NetBSD - -[ELinks (0.9*; *OpenBSD*)] -Parent=ELinks 0.9 -Platform=OpenBSD - -[ELinks (0.9*; *OS/2*)] -Parent=ELinks 0.9 -Platform=OS/2 - -[ELinks (0.9*; *RISC*)] -Parent=ELinks 0.9 -Platform=RISC OS - -[ELinks (0.9*; *Solaris*)] -Parent=ELinks 0.9 -Platform=Solaris - -[ELinks (0.9*; *Unix*)] -Parent=ELinks 0.9 -Platform=Unix - -[ELinks/0.9* (*AIX*)] -Parent=ELinks 0.9 -Platform=AIX - -[ELinks/0.9* (*BeOS*)] -Parent=ELinks 0.9 -Platform=BeOS - -[ELinks/0.9* (*CygWin*)] -Parent=ELinks 0.9 -Platform=CygWin - -[ELinks/0.9* (*Darwin*)] -Parent=ELinks 0.9 -Platform=Darwin - -[ELinks/0.9* (*Digital Unix*)] -Parent=ELinks 0.9 -Platform=Digital Unix - -[ELinks/0.9* (*FreeBSD*)] -Parent=ELinks 0.9 -Platform=FreeBSD - -[ELinks/0.9* (*HPUX*)] -Parent=ELinks 0.9 -Platform=HP-UX - -[ELinks/0.9* (*IRIX*)] -Parent=ELinks 0.9 -Platform=IRIX - -[ELinks/0.9* (*Linux*)] -Parent=ELinks 0.9 -Platform=Linux - -[ELinks/0.9* (*NetBSD*)] -Parent=ELinks 0.9 -Platform=NetBSD - -[ELinks/0.9* (*OpenBSD*)] -Parent=ELinks 0.9 -Platform=OpenBSD - -[ELinks/0.9* (*OS/2*)] -Parent=ELinks 0.9 -Platform=OS/2 - -[ELinks/0.9* (*RISC*)] -Parent=ELinks 0.9 -Platform=RISC OS - -[ELinks/0.9* (*Solaris*)] -Parent=ELinks 0.9 -Platform=Solaris - -[ELinks/0.9* (*Unix*)] -Parent=ELinks 0.9 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AppleWebKit - -[AppleWebKit] -Parent=DefaultProperties -Browser=AppleWebKit -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (KHTML, like Gecko)] -Parent=AppleWebKit - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Camino - -[Camino] -Parent=DefaultProperties -Browser=Camino -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.7*] -Parent=Camino -Version=0.7 -MajorVer=0 -MinorVer=7 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.8*] -Parent=Camino -Version=0.8 -MajorVer=0 -MinorVer=8 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.9*] -Parent=Camino -Version=0.9 -MajorVer=0 -MinorVer=9 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.0*] -Parent=Camino -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.2*] -Parent=Camino -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.3*] -Parent=Camino -Version=1.3 -MajorVer=1 -MinorVer=3 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.4*] -Parent=Camino -Version=1.4 -MajorVer=1 -MinorVer=4 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.5*] -Parent=Camino -Version=1.5 -MajorVer=1 -MinorVer=5 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.6*] -Parent=Camino -Version=1.6 -MajorVer=1 -MinorVer=6 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chimera - -[Chimera] -Parent=DefaultProperties -Browser=Chimera -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Chimera/*] -Parent=Chimera -Platform=MacOSX - -[Mozilla/5.0 Gecko/* Chimera/*] -Parent=Chimera - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Dillo - -[Dillo] -Parent=DefaultProperties -Browser=Dillo -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -CssVersion=2 -supportsCSS=true - -[Dillo/0.6*] -Parent=Dillo -Version=0.6 -MajorVer=0 -MinorVer=6 - -[Dillo/0.7*] -Parent=Dillo -Version=0.7 -MajorVer=0 -MinorVer=7 - -[Dillo/0.8*] -Parent=Dillo -Version=0.8 -MajorVer=0 -MinorVer=8 - -[Dillo/2.0] -Parent=Dillo -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Emacs/W3 - -[Emacs/W3] -Parent=DefaultProperties -Browser=Emacs/W3 -Frames=true -Tables=true -Cookies=true - -[Emacs/W3/2.* (Unix*] -Parent=Emacs/W3 -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Unix - -[Emacs/W3/2.* (X11*] -Parent=Emacs/W3 -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Linux - -[Emacs/W3/3.* (Unix*] -Parent=Emacs/W3 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Unix - -[Emacs/W3/3.* (X11*] -Parent=Emacs/W3 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Linux - -[Emacs/W3/4.* (Unix*] -Parent=Emacs/W3 -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Unix - -[Emacs/W3/4.* (X11*] -Parent=Emacs/W3 -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; fantomas - -[fantomas] -Parent=DefaultProperties -Browser=fantomas -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/4.0 (cloakBrowser)] -Parent=fantomas -Browser=fantomas cloakBrowser - -[Mozilla/4.0 (fantomas shadowMaker Browser)] -Parent=fantomas -Browser=fantomas shadowMaker Browser - -[Mozilla/4.0 (fantomBrowser)] -Parent=fantomas -Browser=fantomas fantomBrowser - -[Mozilla/4.0 (fantomCrew Browser)] -Parent=fantomas -Browser=fantomas fantomCrew Browser - -[Mozilla/4.0 (stealthBrowser)] -Parent=fantomas -Browser=fantomas stealthBrowser - -[multiBlocker browser*] -Parent=fantomas -Browser=fantomas multiBlocker browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FrontPage - -[FrontPage] -Parent=DefaultProperties -Browser=FrontPage -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/?* (compatible; MS FrontPage*)] -Parent=FrontPage - -[MSFrontPage/*] -Parent=FrontPage - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Galeon - -[Galeon] -Parent=DefaultProperties -Browser=Galeon -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/1.*] -Parent=Galeon -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/2.*] -Parent=Galeon -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 Galeon/1.* (X11; Linux*)*] -Parent=Galeon -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 Galeon/2.* (X11; Linux*)*] -Parent=Galeon -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HP Secure Web Browser - -[HP Secure Web Browser] -Parent=DefaultProperties -Browser=HP Secure Web Browser -Platform=OpenVMS -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.0*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.1*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.2*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.3*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.4*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.4 -MajorVer=1 -MinorVer=4 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.5*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.5 -MajorVer=1 -MinorVer=5 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.6*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.6 -MajorVer=1 -MinorVer=6 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.7*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.7 -MajorVer=1 -MinorVer=7 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.8*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.8 -MajorVer=1 -MinorVer=8 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IBrowse - -[IBrowse] -Parent=DefaultProperties -Browser=IBrowse -Platform=Amiga -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Arexx (compatible; MSIE 6.0; AmigaOS5.0) IBrowse 4.0] -Parent=IBrowse -Version=4.0 -MajorVer=4 -MinorVer=0 - -[IBrowse/1.22 (AmigaOS *)] -Parent=IBrowse -Version=1.22 -MajorVer=1 -MinorVer=22 - -[IBrowse/2.1 (AmigaOS *)] -Parent=IBrowse -Version=2.1 -MajorVer=2 -MinorVer=1 - -[IBrowse/2.2 (AmigaOS *)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=2 - -[IBrowse/2.3 (AmigaOS *)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=3 - -[Mozilla/* (Win98; I) IBrowse/2.1 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/* (Win98; I) IBrowse/2.2 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Mozilla/* (Win98; I) IBrowse/2.3 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.3 -MajorVer=2 -MinorVer=3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iCab - -[iCab] -Parent=DefaultProperties -Browser=iCab -Frames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[iCab/2.7* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=Mac68K - -[iCab/2.7* (Macintosh; ?; PPC*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=MacPPC - -[iCab/2.8* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacOSX - -[iCab/2.8* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=Mac68K - -[iCab/2.8* (Macintosh; ?; PPC)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacPPC - -[iCab/2.9* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacOSX - -[iCab/2.9* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=Mac68K - -[iCab/2.9* (Macintosh; ?; PPC*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacPPC - -[iCab/3.0* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[iCab/3.0* (Macintosh; ?; PPC*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacPPC -CssVersion=2 -supportsCSS=true - -[iCab/4.0 (Macintosh; U; *Mac OS X)] -Parent=iCab -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (compatible; iCab 3.0*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; iCab 3.0*; Macintosh; ?; PPC*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacPPC -CssVersion=2 -supportsCSS=true - -[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; 68K*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=Mac68K - -[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacOSX - -[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacOSX - -[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 4.2*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iSiloX - -[iSiloX] -Parent=DefaultProperties -Browser=iSiloX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -Crawler=true -CssVersion=2 -supportsCSS=true - -[iSiloX/4.0* MacOS] -Parent=iSiloX -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacPPC - -[iSiloX/4.0* Windows/32] -Parent=iSiloX -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Win32 -Win32=true - -[iSiloX/4.1* MacOS] -Parent=iSiloX -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=MacPPC - -[iSiloX/4.1* Windows/32] -Parent=iSiloX -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=Win32 -Win32=true - -[iSiloX/4.2* MacOS] -Parent=iSiloX -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=MacPPC - -[iSiloX/4.2* Windows/32] -Parent=iSiloX -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=Win32 -Win32=true - -[iSiloX/4.3* MacOS] -Parent=iSiloX -Version=4.3 -MajorVer=4 -MinorVer=4 -Platform=MacOSX - -[iSiloX/4.3* Windows/32] -Parent=iSiloX -Version=4.3 -MajorVer=4 -MinorVer=3 -Platform=Win32 -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycoris Desktop/LX - -[Lycoris Desktop/LX] -Parent=DefaultProperties -Browser=Lycoris Desktop/LX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -Crawler=true - -[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*: Desktop/LX Amethyst) Gecko/*] -Parent=Lycoris Desktop/LX -Version=1.1 -MajorVer=1 -MinorVer=1 -Platform=Linux - -[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*; Desktop/LX Amethyst) Gecko/*] -Parent=Lycoris Desktop/LX -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mosaic - -[Mosaic] -Parent=DefaultProperties -Browser=Mosaic -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[Mozilla/4.0 (VMS_Mosaic)] -Parent=Mosaic -Platform=OpenVMS - -[VMS_Mosaic/3.7*] -Parent=Mosaic -Version=3.7 -MajorVer=3 -MinorVer=7 -Platform=OpenVMS - -[VMS_Mosaic/3.8*] -Parent=Mosaic -Version=3.8 -MajorVer=3 -MinorVer=8 -Platform=OpenVMS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetPositive - -[NetPositive] -Parent=DefaultProperties -Browser=NetPositive -Platform=BeOS -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[*NetPositive/2.2*] -Parent=NetPositive -Version=2.2 -MajorVer=2 -MinorVer=2 - -[*NetPositive/2.2*BeOS*] -Parent=NetPositive -Version=2.2 -MajorVer=2 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OmniWeb - -[OmniWeb] -Parent=DefaultProperties -Browser=OmniWeb -Platform=MacOSX -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v4*] -Parent=OmniWeb -Version=4.5 -MajorVer=4 -MinorVer=5 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v5*] -Parent=OmniWeb -Version=5. -MajorVer=5 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v6*] -Parent=OmniWeb -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/4*] -Parent=OmniWeb -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacPPC - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/5*] -Parent=OmniWeb -Version=5.0 -MajorVer=5 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/6*] -Parent=OmniWeb -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=MacPPC - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.34] -Parent=OmniWeb -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.34] -Parent=OmniWeb -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v607] -Parent=OmniWeb -Version=5.5 -MajorVer=5 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v607] -Parent=OmniWeb -Version=5.5 -MajorVer=5 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/522+ (KHTML, like Gecko, Safari/522) OmniWeb/v613] -Parent=OmniWeb -Version=5.6 -MajorVer=5 -MinorVer=6 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/522+ (KHTML, like Gecko, Safari/522) OmniWeb/v613] -Parent=OmniWeb -Version=5.6 -MajorVer=5 -MinorVer=6 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v496] -Parent=OmniWeb -Version=4.5 -MajorVer=4 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558.36 ] -Parent=OmniWeb -Version=5.0 -MajorVer=5 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Shiira - -[Shiira] -Parent=DefaultProperties -Browser=Shiira -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/0.9*] -Parent=Shiira -Version=0.9 -MajorVer=0 -MinorVer=9 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.0*] -Parent=Shiira -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.1*] -Parent=Shiira -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.2*] -Parent=Shiira -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/2.1*] -Parent=Shiira -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/2.2*] -Parent=Shiira -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Windows Maker] -Parent=DefaultProperties -Browser=WMaker -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -VBScript=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[WMaker*] -Parent=Windows Maker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.0 - -[K-Meleon 1.0] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.0 -MajorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.1 - -[K-Meleon 1.1] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.1 -MajorVer=1 -MinorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.5 - -[K-Meleon 1.5] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.5 -MajorVer=1 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Platform=WinVista - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 3.0 - -[Konqueror 3.0] -Parent=DefaultProperties -Browser=Konqueror -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[*Konqueror/3.0*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -IFrames=false - -[*Konqueror/3.0*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=FreeBSD -IFrames=false - -[*Konqueror/3.0*Linux*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Linux -IFrames=false - -[*Konqueror/3.1*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 - -[*Konqueror/3.1*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 -Platform=FreeBSD - -[*Konqueror/3.1*Linux*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 - -[*Konqueror/3.2*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 - -[*Konqueror/3.2*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 -Platform=FreeBSD - -[*Konqueror/3.2*Linux*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 -Platform=Linux - -[*Konqueror/3.3*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 - -[*Konqueror/3.3*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=FreeBSD - -[*Konqueror/3.3*Linux*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=Linux - -[*Konqueror/3.3*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=OpenBSD - -[*Konqueror/3.4*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 - -[*Konqueror/3.4*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=FreeBSD - -[*Konqueror/3.4*Linux*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=Linux - -[*Konqueror/3.4*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=OpenBSD - -[*Konqueror/3.5*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 - -[*Konqueror/3.5*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=FreeBSD - -[*Konqueror/3.5*Linux*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=Linux - -[*Konqueror/3.5*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=OpenBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.0 - -[Konqueror 4.0] -Parent=DefaultProperties -Browser=Konqueror -Version=4.0 -MajorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.0*; Debian) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; *Linux) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; FreeBSD) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; NetBSD) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.1 - -[Konqueror 4.1] -Parent=DefaultProperties -Browser=Konqueror -Version=4.1 -MajorVer=4 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.1*; *Linux*) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.1*; Debian) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.1*; FreeBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.1*; NetBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.2 - -[Konqueror 4.2] -Parent=DefaultProperties -Browser=Konqueror -Version=4.2 -MajorVer=4 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.2*; *Linux*) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.2*; Debian) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.2*; FreeBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.2*; NetBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari - -[Safari] -Parent=DefaultProperties -Browser=Safari -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/100*] -Parent=Safari -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/125*] -Parent=Safari -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/312*] -Parent=Safari -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/412*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/416*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/417*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/418*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/419*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/52*] -Parent=Safari -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/85*] -Parent=Safari -Version=1.0 -MajorVer=1 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.0 - -[Safari 3.0] -Parent=DefaultProperties -Browser=Safari -Version=3.0 -MajorVer=3 -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.1 - -[Safari 3.1] -Parent=DefaultProperties -Browser=Safari -Version=3.1 -MajorVer=3 -MinorVer=1 -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.2 - -[Safari 3.2] -Parent=DefaultProperties -Browser=Safari -Version=3.2 -MajorVer=3 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 4.0 - -[Safari 4.0] -Parent=DefaultProperties -Browser=Safari -Version=4.0 -MajorVer=4 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *) AppleWebKit/* (KHTML, like Gecko) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *) AppleWebKit/* (KHTML, like Gecko) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 7.0; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 7.0; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 10.0 - -[Opera 10.0] -Parent=DefaultProperties -Browser=Opera -Version=10.0 -MajorVer=10 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 10.0*] -Parent=Opera 10.0 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 10.0*] -Parent=Opera 10.0 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (Linux*)*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (Macintosh; *Mac OS X;*)*] -Parent=Opera 10.0 -Platform=MacOSX - -[Opera/10.0* (Windows 95*)*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Opera/10.0* (Windows 98*)*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Opera/10.0* (Windows CE*)*] -Parent=Opera 10.0 -Platform=WinCE -Win32=true - -[Opera/10.0* (Windows ME*)*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Opera/10.0* (Windows NT 4.0*)*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Opera/10.0* (Windows NT 5.0*)*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Opera/10.0* (Windows NT 5.1*)*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Opera/10.0* (Windows NT 5.2*)*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Opera/10.0* (Windows NT 6.0*)*] -Parent=Opera 10.0 -Platform=WinVista -Win32=true - -[Opera/10.0* (Windows NT 6.1*)*] -Parent=Opera 10.0 -Platform=Win7 - -[Opera/10.0* (Windows XP*)*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Opera/10.0* (X11; FreeBSD*)*] -Parent=Opera 10.0 -Platform=FreeBSD - -[Opera/10.0* (X11; Linux*)*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (X11; SunOS*)*] -Parent=Opera 10.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.0 - -[Opera 7.0] -Parent=DefaultProperties -Browser=Opera -Version=7.0 -MajorVer=7 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/3.0 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/3.0 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/3.0 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/3.0 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/3.0 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/3.0 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 2000) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 95) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 98) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows ME) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 4.0) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.0) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows XP) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.78 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.78 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/4.78 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/4.78 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/4.78 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/4.78 (Windows NT 5.1; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.78 (Windows Windows NT 5.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.78 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows NT 5.1; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Opera/7.0* (Windows 2000; ?)*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Opera/7.0* (Windows 95; ?)*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Opera/7.0* (Windows 98; ?)*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Opera/7.0* (Windows ME; ?)*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Opera/7.0* (Windows NT 4.0; ?)*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Opera/7.0* (Windows NT 5.0; ?)*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Opera/7.0* (Windows NT 5.1; ?)*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Opera/7.0* (Windows XP; ?)*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.1 - -[Opera 7.1] -Parent=DefaultProperties -Browser=Opera -Version=7.1 -MajorVer=7 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows 2000; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Opera/7.1* (Linux*; ?)*] -Parent=Opera 7.1 -Platform=Linux - -[Opera/7.1* (Windows 95; ?)*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Opera/7.1* (Windows 98; ?)*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Opera/7.1* (Windows ME; ?)*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Opera/7.1* (Windows NT 4.0; ?)*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Opera/7.1* (Windows NT 5.0; ?)*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Opera/7.1* (Windows NT 5.1; ?)*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Opera/7.1* (Windows XP; ?)*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.2 - -[Opera 7.2] -Parent=DefaultProperties -Browser=Opera -Version=7.2 -MajorVer=7 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.2*] -Parent=Opera 7.2 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows 2000; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Opera/7.2* (Linux*; ?)*] -Parent=Opera 7.2 -Platform=Linux - -[Opera/7.2* (Windows 95; ?)*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Opera/7.2* (Windows 98; ?)*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Opera/7.2* (Windows ME; ?)*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Opera/7.2* (Windows NT 4.0; ?)*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Opera/7.2* (Windows NT 5.0; ?)*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Opera/7.2* (Windows NT 5.1; ?)*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Opera/7.2* (Windows NT 5.2; ?)*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Opera/7.2* (Windows XP; ?)*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Opera/7.2* (X11; FreeBSD*; ?)*] -Parent=Opera 7.2 -Platform=FreeBSD - -[Opera/7.2* (X11; Linux*; ?)*] -Parent=Opera 7.2 -Platform=Linux - -[Opera/7.2* (X11; SunOS*)*] -Parent=Opera 7.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.5 - -[Opera 7.5] -Parent=DefaultProperties -Browser=Opera -Version=7.5 -MajorVer=7 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.5*] -Parent=Opera 7.5 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Opera/7.5* (Linux*; ?)*] -Parent=Opera 7.5 -Platform=Linux - -[Opera/7.5* (Macintosh; *Mac OS X; ?)*] -Parent=Opera 7.5 -Platform=MacOSX - -[Opera/7.5* (Windows 95; ?)*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Opera/7.5* (Windows 98; ?)*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Opera/7.5* (Windows ME; ?)*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Opera/7.5* (Windows NT 4.0; ?)*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Opera/7.5* (Windows NT 5.0; ?)*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Opera/7.5* (Windows NT 5.1; ?)*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Opera/7.5* (Windows NT 5.2; ?)*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Opera/7.5* (Windows XP; ?)*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Opera/7.5* (X11; FreeBSD*; ?)*] -Parent=Opera 7.5 -Platform=FreeBSD - -[Opera/7.5* (X11; Linux*; ?)*] -Parent=Opera 7.5 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.6 - -[Opera 7.6] -Parent=DefaultProperties -Browser=Opera -Version=7.6 -MajorVer=7 -MinorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.6*] -Parent=Opera 7.6 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Opera/7.6* (Linux*)*] -Parent=Opera 7.6 -Platform=Linux - -[Opera/7.6* (Macintosh; *Mac OS X; ?)*] -Parent=Opera 7.6 -Platform=MacOSX - -[Opera/7.6* (Windows 95*)*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Opera/7.6* (Windows 98*)*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Opera/7.6* (Windows ME*)*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Opera/7.6* (Windows NT 4.0*)*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Opera/7.6* (Windows NT 5.0*)*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Opera/7.6* (Windows NT 5.1*)*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Opera/7.6* (Windows NT 5.2*)*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Opera/7.6* (Windows XP*)*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Opera/7.6* (X11; FreeBSD*)*] -Parent=Opera 7.6 -Platform=FreeBSD - -[Opera/7.6* (X11; Linux*)*] -Parent=Opera 7.6 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.0 - -[Opera 8.0] -Parent=DefaultProperties -Browser=Opera -Version=8.0 -MajorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacOSX - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.0*] -Parent=Opera 8.0 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Opera/8.0* (Linux*)*] -Parent=Opera 8.0 -Platform=Linux - -[Opera/8.0* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.0 -Platform=MacOSX - -[Opera/8.0* (Windows 95*)*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Opera/8.0* (Windows 98*)*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Opera/8.0* (Windows CE*)*] -Parent=Opera 8.0 -Platform=WinCE -Win32=true - -[Opera/8.0* (Windows ME*)*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Opera/8.0* (Windows NT 4.0*)*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Opera/8.0* (Windows NT 5.0*)*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Opera/8.0* (Windows NT 5.1*)*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Opera/8.0* (Windows NT 5.2*)*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Opera/8.0* (Windows XP*)*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Opera/8.0* (X11; FreeBSD*)*] -Parent=Opera 8.0 -Platform=FreeBSD - -[Opera/8.0* (X11; Linux*)*] -Parent=Opera 8.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.1 - -[Opera 8.1] -Parent=DefaultProperties -Browser=Opera -Version=8.1 -MajorVer=8 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.1*] -Parent=Opera 8.1 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.1*] -Parent=Opera 8.1 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.1*] -Parent=Opera 8.1 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Opera/8.1* (Linux*)*] -Parent=Opera 8.1 -Platform=Linux - -[Opera/8.1* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.1 -Platform=MacOSX - -[Opera/8.1* (Windows 95*)*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Opera/8.1* (Windows 98*)*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Opera/8.1* (Windows CE*)*] -Parent=Opera 8.1 -Platform=WinCE -Win32=true - -[Opera/8.1* (Windows ME*)*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Opera/8.1* (Windows NT 4.0*)*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Opera/8.1* (Windows NT 5.0*)*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Opera/8.1* (Windows NT 5.1*)*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Opera/8.1* (Windows NT 5.2*)*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Opera/8.1* (Windows XP*)*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Opera/8.1* (X11; FreeBSD*)*] -Parent=Opera 8.1 -Platform=FreeBSD - -[Opera/8.1* (X11; Linux*)*] -Parent=Opera 8.1 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.5 - -[Opera 8.5] -Parent=DefaultProperties -Browser=Opera -Version=8.5 -MajorVer=8 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X;*) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.5*] -Parent=Opera 8.5 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (Macintosh; PPC Mac OS X;*) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Opera/8.5* (Linux*)*] -Parent=Opera 8.5 -Platform=Linux - -[Opera/8.5* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.5 -Platform=MacOSX - -[Opera/8.5* (Windows 95*)*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Opera/8.5* (Windows 98*)*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Opera/8.5* (Windows CE*)*] -Parent=Opera 8.5 -Platform=WinCE -Win32=true - -[Opera/8.5* (Windows ME*)*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Opera/8.5* (Windows NT 4.0*)*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Opera/8.5* (Windows NT 5.0*)*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Opera/8.5* (Windows NT 5.1*)*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Opera/8.5* (Windows NT 5.2*)*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Opera/8.5* (Windows XP*)*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Opera/8.5* (X11; FreeBSD*)*] -Parent=Opera 8.5 -Platform=FreeBSD - -[Opera/8.5* (X11; Linux*)*] -Parent=Opera 8.5 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.0 - -[Opera 9.0] -Parent=DefaultProperties -Browser=Opera -Version=9.0 -MajorVer=9 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.0*] -Parent=Opera 9.0 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.0*] -Parent=Opera 9.0 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (X11; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Opera/9.0* (Linux*)*] -Parent=Opera 9.0 -Platform=Linux - -[Opera/9.0* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.0 -Platform=MacOSX - -[Opera/9.0* (Windows 95*)*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Opera/9.0* (Windows 98*)*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Opera/9.0* (Windows CE*)*] -Parent=Opera 9.0 -Platform=WinCE -Win32=true - -[Opera/9.0* (Windows ME*)*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Opera/9.0* (Windows NT 4.0*)*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Opera/9.0* (Windows NT 5.0*)*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Opera/9.0* (Windows NT 5.1*)*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Opera/9.0* (Windows NT 5.2*)*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Opera/9.0* (Windows NT 6.0*)*] -Parent=Opera 9.0 -Platform=WinVista -Win32=true - -[Opera/9.0* (Windows XP*)*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Opera/9.0* (X11; FreeBSD*)*] -Parent=Opera 9.0 -Platform=FreeBSD - -[Opera/9.0* (X11; Linux*)*] -Parent=Opera 9.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.1 - -[Opera 9.1] -Parent=DefaultProperties -Browser=Opera -Version=9.1 -MajorVer=9 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.1*] -Parent=Opera 9.1 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.1*] -Parent=Opera 9.1 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Mozilla/* (X11; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (Linux*)*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.1 -Platform=MacOSX - -[Opera/9.1* (Windows 95*)*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Opera/9.1* (Windows 98*)*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Opera/9.1* (Windows CE*)*] -Parent=Opera 9.1 -Platform=WinCE -Win32=true - -[Opera/9.1* (Windows ME*)*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Opera/9.1* (Windows NT 4.0*)*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Opera/9.1* (Windows NT 5.0*)*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Opera/9.1* (Windows NT 5.1*)*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Opera/9.1* (Windows NT 5.2*)*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Opera/9.1* (Windows NT 6.0*)*] -Parent=Opera 9.1 -Platform=WinVista -Win32=true - -[Opera/9.1* (Windows XP*)*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Opera/9.1* (X11; FreeBSD*)*] -Parent=Opera 9.1 -Platform=FreeBSD - -[Opera/9.1* (X11; Linux*)*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (X11; SunOS*)*] -Parent=Opera 9.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.2 - -[Opera 9.2] -Parent=DefaultProperties -Browser=Opera -Version=9.2 -MajorVer=9 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.2*] -Parent=Opera 9.2 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.2*] -Parent=Opera 9.2 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (Linux*)*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.2 -Platform=MacOSX - -[Opera/9.2* (Windows 95*)*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Opera/9.2* (Windows 98*)*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Opera/9.2* (Windows CE*)*] -Parent=Opera 9.2 -Platform=WinCE -Win32=true - -[Opera/9.2* (Windows ME*)*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Opera/9.2* (Windows NT 4.0*)*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Opera/9.2* (Windows NT 5.0*)*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Opera/9.2* (Windows NT 5.1*)*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Opera/9.2* (Windows NT 5.2*)*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Opera/9.2* (Windows NT 6.0*)*] -Parent=Opera 9.2 -Platform=WinVista -Win32=true - -[Opera/9.2* (Windows NT 6.1*)*] -Parent=Opera 9.2 -Platform=Win7 - -[Opera/9.2* (Windows XP*)*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Opera/9.2* (X11; FreeBSD*)*] -Parent=Opera 9.2 -Platform=FreeBSD - -[Opera/9.2* (X11; Linux*)*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (X11; SunOS*)*] -Parent=Opera 9.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.3 - -[Opera 9.3] -Parent=DefaultProperties -Browser=Opera -Version=9.3 -MajorVer=9 -MinorVer=3 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.3*] -Parent=Opera 9.3 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.3*] -Parent=Opera 9.3 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (Linux*)*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.3 -Platform=MacOSX - -[Opera/9.3* (Windows 95*)*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Opera/9.3* (Windows 98*)*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Opera/9.3* (Windows CE*)*] -Parent=Opera 9.3 -Platform=WinCE -Win32=true - -[Opera/9.3* (Windows ME*)*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Opera/9.3* (Windows NT 4.0*)*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Opera/9.3* (Windows NT 5.0*)*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Opera/9.3* (Windows NT 5.1*)*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Opera/9.3* (Windows NT 5.2*)*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Opera/9.3* (Windows NT 6.0*)*] -Parent=Opera 9.3 -Platform=WinVista -Win32=true - -[Opera/9.3* (Windows NT 6.1*)*] -Parent=Opera 9.3 -Platform=Win7 - -[Opera/9.3* (Windows XP*)*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Opera/9.3* (X11; FreeBSD*)*] -Parent=Opera 9.3 -Platform=FreeBSD - -[Opera/9.3* (X11; Linux*)*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (X11; SunOS*)*] -Parent=Opera 9.3 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.4 - -[Opera 9.4] -Parent=DefaultProperties -Browser=Opera -Version=9.4 -MajorVer=9 -MinorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.4*] -Parent=Opera 9.4 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.4*] -Parent=Opera 9.4 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (Linux*)*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.4 -Platform=MacOSX - -[Opera/9.4* (Windows 95*)*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Opera/9.4* (Windows 98*)*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Opera/9.4* (Windows CE*)*] -Parent=Opera 9.4 -Platform=WinCE -Win32=true - -[Opera/9.4* (Windows ME*)*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Opera/9.4* (Windows NT 4.0*)*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Opera/9.4* (Windows NT 5.0*)*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Opera/9.4* (Windows NT 5.1*)*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Opera/9.4* (Windows NT 5.2*)*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Opera/9.4* (Windows NT 6.0*)*] -Parent=Opera 9.4 -Platform=WinVista -Win32=true - -[Opera/9.4* (Windows NT 6.1*)*] -Parent=Opera 9.4 -Platform=Win7 - -[Opera/9.4* (Windows XP*)*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Opera/9.4* (X11; FreeBSD*)*] -Parent=Opera 9.4 -Platform=FreeBSD - -[Opera/9.4* (X11; Linux*)*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (X11; SunOS*)*] -Parent=Opera 9.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.5 - -[Opera 9.5] -Parent=DefaultProperties -Browser=Opera -Version=9.5 -MajorVer=9 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.5*] -Parent=Opera 9.5 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.5*] -Parent=Opera 9.5 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (Linux*)*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.5 -Platform=MacOSX - -[Opera/9.5* (Windows 95*)*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Opera/9.5* (Windows 98*)*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Opera/9.5* (Windows CE*)*] -Parent=Opera 9.5 -Platform=WinCE -Win32=true - -[Opera/9.5* (Windows ME*)*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Opera/9.5* (Windows NT 4.0*)*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Opera/9.5* (Windows NT 5.0*)*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Opera/9.5* (Windows NT 5.1*)*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Opera/9.5* (Windows NT 5.2*)*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Opera/9.5* (Windows NT 6.0*)*] -Parent=Opera 9.5 -Platform=WinVista -Win32=true - -[Opera/9.5* (Windows NT 6.1*)*] -Parent=Opera 9.5 -Platform=Win7 - -[Opera/9.5* (Windows XP*)*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Opera/9.5* (X11; FreeBSD*)*] -Parent=Opera 9.5 -Platform=FreeBSD - -[Opera/9.5* (X11; Linux*)*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (X11; SunOS*)*] -Parent=Opera 9.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.6 - -[Opera 9.6] -Parent=DefaultProperties -Browser=Opera -Version=9.6 -MajorVer=9 -MinorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.6*] -Parent=Opera 9.6 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.6*] -Parent=Opera 9.6 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (Linux*)*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.6 -Platform=MacOSX - -[Opera/9.6* (Windows 95*)*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Opera/9.6* (Windows 98*)*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Opera/9.6* (Windows CE*)*] -Parent=Opera 9.6 -Platform=WinCE -Win32=true - -[Opera/9.6* (Windows ME*)*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Opera/9.6* (Windows NT 4.0*)*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Opera/9.6* (Windows NT 5.0*)*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Opera/9.6* (Windows NT 5.1*)*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Opera/9.6* (Windows NT 5.2*)*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Opera/9.6* (Windows NT 6.0*)*] -Parent=Opera 9.6 -Platform=WinVista -Win32=true - -[Opera/9.6* (Windows NT 6.1*)*] -Parent=Opera 9.6 -Platform=Win7 - -[Opera/9.6* (Windows XP*)*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Opera/9.6* (X11; FreeBSD*)*] -Parent=Opera 9.6 -Platform=FreeBSD - -[Opera/9.6* (X11; Linux*)*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (X11; SunOS*)*] -Parent=Opera 9.6 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.0 - -[Netscape 4.0] -Parent=DefaultProperties -Browser=Netscape -Version=4.0 -MajorVer=4 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0*(Macintosh*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=MacPPC - -[Mozilla/4.0*(Win95;*] -Parent=Netscape 4.0 -Platform=Win95 - -[Mozilla/4.0*(Win98;*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=Win98 - -[Mozilla/4.0*(WinNT*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=WinNT - -[Mozilla/4.0*(X11;*)] -Parent=Netscape 4.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.5 - -[Netscape 4.5] -Parent=DefaultProperties -Browser=Netscape -Version=4.5 -MajorVer=4 -MinorVer=5 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.5*(Macintosh; ?; PPC)] -Parent=Netscape 4.5 -Platform=MacPPC - -[Mozilla/4.5*(Win2000; ?)] -Parent=Netscape 4.5 -Platform=Win2000 - -[Mozilla/4.5*(Win95; ?)] -Parent=Netscape 4.5 -Platform=Win95 - -[Mozilla/4.5*(Win98; ?)] -Parent=Netscape 4.5 -Platform=Win98 - -[Mozilla/4.5*(WinME; ?)] -Parent=Netscape 4.5 -Platform=WinME - -[Mozilla/4.5*(WinNT; ?)] -Parent=Netscape 4.5 -Platform=WinNT - -[Mozilla/4.5*(WinXP; ?)] -Parent=Netscape 4.5 -Platform=WinXP - -[Mozilla/4.5*(X11*)] -Parent=Netscape 4.5 -Platform=Linux - -[Mozilla/4.51*(Macintosh; ?; PPC)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 - -[Mozilla/4.51*(Win2000; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win2000 - -[Mozilla/4.51*(Win95; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win95 - -[Mozilla/4.51*(Win98; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win98 - -[Mozilla/4.51*(WinME; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinME - -[Mozilla/4.51*(WinNT; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinNT - -[Mozilla/4.51*(WinXP; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinXP - -[Mozilla/4.51*(X11*)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.6 - -[Netscape 4.6] -Parent=DefaultProperties -Browser=Netscape -Version=4.6 -MajorVer=4 -MinorVer=6 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.6 * (OS/2; ?)] -Parent=Netscape 4.6 -Platform=OS/2 - -[Mozilla/4.6*(Macintosh; ?; PPC)] -Parent=Netscape 4.6 -Platform=MacPPC - -[Mozilla/4.6*(Win95; ?)] -Parent=Netscape 4.6 -Platform=Win95 - -[Mozilla/4.6*(Win98; ?)] -Parent=Netscape 4.6 -Platform=Win98 - -[Mozilla/4.6*(WinNT; ?)] -Parent=Netscape 4.6 -Platform=WinNT - -[Mozilla/4.61*(Macintosh; ?; PPC)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=MacPPC - -[Mozilla/4.61*(OS/2; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=OS/2 - -[Mozilla/4.61*(Win95; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=Win95 - -[Mozilla/4.61*(Win98; ?)] -Parent=Netscape 4.6 -Version=4.61 -Platform=Win98 - -[Mozilla/4.61*(WinNT; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=WinNT - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.7 - -[Netscape 4.7] -Parent=DefaultProperties -Browser=Netscape -Version=4.7 -MajorVer=4 -MinorVer=7 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.7 * (Win2000; ?)] -Parent=Netscape 4.7 -Platform=Win2000 - -[Mozilla/4.7*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=MacPPC - -[Mozilla/4.7*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win95 - -[Mozilla/4.7*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win98 - -[Mozilla/4.7*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=WinNT -Win32=true - -[Mozilla/4.7*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win2000 -Win32=true - -[Mozilla/4.7*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=WinXP -Win32=true - -[Mozilla/4.7*(WinNT; ?)*] -Parent=Netscape 4.7 -Platform=WinNT - -[Mozilla/4.7*(X11*)*] -Parent=Netscape 4.7 -Platform=Linux - -[Mozilla/4.7*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Platform=SunOS - -[Mozilla/4.71*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=MacPPC - -[Mozilla/4.71*(Win95; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win95 - -[Mozilla/4.71*(Win98; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win98 - -[Mozilla/4.71*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinNT -Win32=true - -[Mozilla/4.71*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win2000 -Win32=true - -[Mozilla/4.71*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinXP -Win32=true - -[Mozilla/4.71*(WinNT; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinNT - -[Mozilla/4.71*(X11*)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Linux - -[Mozilla/4.71*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=SunOS - -[Mozilla/4.72*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=MacPPC - -[Mozilla/4.72*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win95 - -[Mozilla/4.72*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win98 - -[Mozilla/4.72*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinNT -Win32=true - -[Mozilla/4.72*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win2000 -Win32=true - -[Mozilla/4.72*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinXP -Win32=true - -[Mozilla/4.72*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinNT - -[Mozilla/4.72*(X11*)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Linux - -[Mozilla/4.72*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=SunOS - -[Mozilla/4.73*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=MacPPC - -[Mozilla/4.73*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win95 - -[Mozilla/4.73*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win98 - -[Mozilla/4.73*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinNT -Win32=true - -[Mozilla/4.73*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win2000 -Win32=true - -[Mozilla/4.73*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinXP -Win32=true - -[Mozilla/4.73*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinNT - -[Mozilla/4.73*(X11*)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Linux - -[Mozilla/4.73*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=SunOS - -[Mozilla/4.74*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=MacPPC - -[Mozilla/4.74*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win95 - -[Mozilla/4.74*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win98 - -[Mozilla/4.74*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinNT -Win32=true - -[Mozilla/4.74*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win2000 -Win32=true - -[Mozilla/4.74*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinXP -Win32=true - -[Mozilla/4.74*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinNT - -[Mozilla/4.74*(X11*)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Linux - -[Mozilla/4.74*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=SunOS - -[Mozilla/4.75*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=MacPPC - -[Mozilla/4.75*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win95 - -[Mozilla/4.75*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win98 - -[Mozilla/4.75*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinNT -Win32=true - -[Mozilla/4.75*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win2000 -Win32=true - -[Mozilla/4.75*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinXP -Win32=true - -[Mozilla/4.75*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinNT - -[Mozilla/4.75*(X11*)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Linux - -[Mozilla/4.75*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=SunOS - -[Mozilla/4.76*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=MacPPC - -[Mozilla/4.76*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win95 - -[Mozilla/4.76*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win98 - -[Mozilla/4.76*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinNT -Win32=true - -[Mozilla/4.76*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win2000 -Win32=true - -[Mozilla/4.76*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinXP -Win32=true - -[Mozilla/4.76*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinNT - -[Mozilla/4.76*(X11*)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Linux - -[Mozilla/4.76*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=SunOS - -[Mozilla/4.77*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=MacPPC - -[Mozilla/4.77*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win95 - -[Mozilla/4.77*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win98 - -[Mozilla/4.77*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinNT -Win32=true - -[Mozilla/4.77*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win2000 -Win32=true - -[Mozilla/4.77*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinXP -Win32=true - -[Mozilla/4.77*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinNT - -[Mozilla/4.77*(X11*)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Linux - -[Mozilla/4.77*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=SunOS - -[Mozilla/4.78*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=MacPPC - -[Mozilla/4.78*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win95 - -[Mozilla/4.78*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win98 - -[Mozilla/4.78*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinNT -Win32=true - -[Mozilla/4.78*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win2000 -Win32=true - -[Mozilla/4.78*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinXP -Win32=true - -[Mozilla/4.78*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinNT - -[Mozilla/4.78*(X11*)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Linux - -[Mozilla/4.78*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=SunOS - -[Mozilla/4.79*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=MacPPC - -[Mozilla/4.79*(Win95; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win95 - -[Mozilla/4.79*(Win98; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win98 - -[Mozilla/4.79*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinNT -Win32=true - -[Mozilla/4.79*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win2000 -Win32=true - -[Mozilla/4.79*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinXP -Win32=true - -[Mozilla/4.79*(WinNT; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinNT - -[Mozilla/4.79*(X11*)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Linux - -[Mozilla/4.79*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.8 - -[Netscape 4.8] -Parent=DefaultProperties -Browser=Netscape -Version=4.8 -MajorVer=4 -MinorVer=8 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.8*(Macintosh; ?; MacPPC)*] -Parent=Netscape 4.8 -Platform=MacPPC - -[Mozilla/4.8*(Macintosh; ?; PPC Mac OS X*] -Parent=Netscape 4.8 -Platform=MacOSX - -[Mozilla/4.8*(Macintosh; ?; PPC)*] -Parent=Netscape 4.8 -Platform=MacPPC - -[Mozilla/4.8*(Win95; *)*] -Parent=Netscape 4.8 - -[Mozilla/4.8*(Win98; *)*] -Parent=Netscape 4.8 -Platform=Win98 - -[Mozilla/4.8*(Windows NT 4.0; *)*] -Parent=Netscape 4.8 -Platform=WinNT -Win32=true - -[Mozilla/4.8*(Windows NT 5.0; *)*] -Parent=Netscape 4.8 -Platform=Win2000 -Win32=true - -[Mozilla/4.8*(Windows NT 5.1; *)*] -Parent=Netscape 4.8 -Platform=WinXP -Win32=true - -[Mozilla/4.8*(WinNT; *)*] -Parent=Netscape 4.8 -Platform=WinNT - -[Mozilla/4.8*(X11; *)*] -Parent=Netscape 4.8 -Platform=Linux - -[Mozilla/4.8*(X11; *SunOS*)*] -Parent=Netscape 4.8 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.0 - -[Netscape 6.0] -Parent=DefaultProperties -Browser=Netscape -Version=6.0 -MajorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.1 - -[Netscape 6.1] -Parent=DefaultProperties -Browser=Netscape -Version=6.1 -MajorVer=6 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.2 - -[Netscape 6.2] -Parent=DefaultProperties -Browser=Netscape -Version=6.2 -MajorVer=6 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.0 - -[Netscape 7.0] -Parent=DefaultProperties -Browser=Netscape -Version=7.0 -MajorVer=7 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win*9x 4.90; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.1 - -[Netscape 7.1] -Parent=DefaultProperties -Browser=Netscape -Version=7.1 -MajorVer=7 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/7.1] -Parent=Netscape 7.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.2 - -[Netscape 7.2] -Parent=DefaultProperties -Browser=Netscape -Version=7.2 -MajorVer=7 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 8.0 - -[Netscape 8.0] -Parent=DefaultProperties -Browser=Netscape -Version=8.0 -MajorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 8.1 - -[Netscape 8.1] -Parent=DefaultProperties -Browser=Netscape -Version=8.1 -MajorVer=8 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.0 - -[SeaMonkey 1.0] -Parent=DefaultProperties -Browser=SeaMonkey -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.8*) Gecko/20060221 SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.1 - -[SeaMonkey 1.1] -Parent=DefaultProperties -Browser=SeaMonkey -Version=1.1 -MajorVer=1 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.8*) Gecko/20060221 SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 2.0 - -[SeaMonkey 2.0] -Parent=DefaultProperties -Browser=SeaMonkey -Version=2.0 -MajorVer=2 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.9*) Gecko/20060221 SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Flock 1.0 - -[Flock 1.0] -Parent=DefaultProperties -Browser=Flock -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; U; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinME - -[Mozilla/5.0 (Windows; U; Windows NT 5.0*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; U; Windows NT 5.1*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Flock 2.0 - -[Flock 2.0] -Parent=DefaultProperties -Browser=Flock -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; U; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinME - -[Mozilla/5.0 (Windows; U; Windows NT 5.0*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; U; Windows NT 5.1*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sleipnir 2.0 - -[Sleipnir] -Parent=DefaultProperties -Browser=Sleipnir -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.0*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.1*) Sleipnir/2.*] -Parent=Sleipnir -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.2*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 6.0*) Sleipnir/2.*] -Parent=Sleipnir -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 6.1*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win7 - -[Sleipnir*] -Parent=Sleipnir - -[Sleipnir/2.*] -Parent=Sleipnir - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fennec 1.0 - -[Fennec 1.0] -Parent=DefaultProperties -Browser=Firefox Mobile -Version=1.0 -MajorVer=1 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firebird - -[Firebird] -Parent=DefaultProperties -Browser=Firebird -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Linux; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird Browser/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; IRIX*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox - -[Firefox] -Parent=DefaultProperties -Browser=Firefox -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (OS/2; *; Warp*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (Windows NT 5.?; ?; rv:1.*) Gecko/* Firefox] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.*; *; rv:1.*) Gecko/* Deer Park/Alpha*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firefox/10.5] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; FreeBSD*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; HP-UX*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; Linux*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.0 - -[Firefox 1.0] -Parent=DefaultProperties -Browser=Firefox -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=MacPPC - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; *Linux*; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; DragonFly*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.4 - -[Firefox 1.4] -Parent=DefaultProperties -Browser=Firefox -Version=1.4 -MajorVer=1 -MinorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.5 - -[Firefox 1.5] -Parent=DefaultProperties -Browser=Firefox -Version=1.5 -MajorVer=1 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=OS/2 - -[Mozilla/5.0 (rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2 x64; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 2.0 - -[Firefox 2.0] -Parent=DefaultProperties -Browser=Firefox -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.0 - -[Firefox 3.0] -Parent=DefaultProperties -Browser=Firefox -Version=3.0 -MajorVer=3 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.1 - -[Firefox 3.1] -Parent=DefaultProperties -Browser=Firefox -Version=3.1 -MajorVer=3 -MinorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.5 - -[Firefox 3.5] -Parent=DefaultProperties -Browser=Firefox -Version=3.5 -MajorVer=3 -MinorVer=5 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Phoenix - -[Phoenix] -Parent=DefaultProperties -Browser=Phoenix -Version=0.5 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iceweasel - -[Iceweasel] -Parent=DefaultProperties -Browser=Iceweasel -Platform=Linux -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.8*) Gecko/* Iceweasel/2.0* (Debian-*)] -Parent=Iceweasel -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.0 - -[Mozilla 1.0] -Parent=DefaultProperties -Browser=Mozilla -Version=1.0 -MajorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.0.*) Gecko/*] -Parent=Mozilla 1.0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.1 - -[Mozilla 1.1] -Parent=DefaultProperties -Browser=Mozilla -Version=1.1 -MajorVer=1 -MinorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.1.*) Gecko/*] -Parent=Mozilla 1.1 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.2 - -[Mozilla 1.2] -Parent=DefaultProperties -Browser=Mozilla -Version=1.2 -MajorVer=1 -MinorVer=2 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.2.*) Gecko/*] -Parent=Mozilla 1.2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.3 - -[Mozilla 1.3] -Parent=DefaultProperties -Browser=Mozilla -Version=1.3 -MajorVer=1 -MinorVer=3 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.3.*) Gecko/*] -Parent=Mozilla 1.3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.4 - -[Mozilla 1.4] -Parent=DefaultProperties -Browser=Mozilla -Version=1.4 -MajorVer=1 -MinorVer=4 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.5 - -[Mozilla 1.5] -Parent=DefaultProperties -Browser=Mozilla -Version=1.5 -MajorVer=1 -MinorVer=5 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.6 - -[Mozilla 1.6] -Parent=DefaultProperties -Browser=Mozilla -Version=1.6 -MajorVer=1 -MinorVer=6 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.7 - -[Mozilla 1.7] -Parent=DefaultProperties -Browser=Mozilla -Version=1.7 -MajorVer=1 -MinorVer=7 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (*rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.8 - -[Mozilla 1.8] -Parent=DefaultProperties -Browser=Mozilla -Version=1.8 -MajorVer=1 -MinorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (*rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.9 - -[Mozilla 1.9] -Parent=DefaultProperties -Browser=Mozilla -Version=1.9 -MajorVer=1 -MinorVer=9 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE Mac - -[IE Mac] -Parent=DefaultProperties -Browser=IE -Platform=MacPPC -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/?.? (compatible; MSIE 4.0*; *Mac_PowerPC*] -Parent=IE Mac -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Mozilla/?.? (compatible; MSIE 4.5*; *Mac_PowerPC*] -Parent=IE Mac -Version=4.5 -MajorVer=4 -MinorVer=5 - -[Mozilla/?.? (compatible; MSIE 5.0*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.0 -MajorVer=5 -MinorVer=0 - -[Mozilla/?.? (compatible; MSIE 5.1*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/?.? (compatible; MSIE 5.2*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.2 -MajorVer=5 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 5.5 - -[AOL 9.0/IE 5.5] -Parent=DefaultProperties -Browser=AOL -Version=5.5 -MajorVer=5 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 5.5; *AOL 9.0*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 6.0 - -[AOL 9.0/IE 6.0] -Parent=DefaultProperties -Browser=AOL -Version=6.0 -MajorVer=6 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 6.0; *AOL 9.0*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 7.0 - -[AOL 9.0/IE 7.0] -Parent=DefaultProperties -Browser=AOL -Version=7.0 -MajorVer=7 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 - -[Mozilla/?.* (?compatible; *MSIE 7.0; *AOL 9.0*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Avant Browser - -[Avant Browser] -Parent=DefaultProperties -Browser=Avant Browser -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Advanced Browser (http://www.avantbrowser.com)] -Parent=Avant Browser - -[Avant Browser*] -Parent=Avant Browser - -[Avant Browser/*] -Parent=Avant Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 4.01 - -[IE 4.01] -Parent=DefaultProperties -Browser=IE -Version=4.01 -MajorVer=4 -MinorVer=01 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 4.01*)*] -Parent=IE 4.01 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 95*)*] -Parent=IE 4.01 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 98*)*] -Parent=IE 4.01 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 4.01 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 4.0*)*] -Parent=IE 4.01 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.0*)*] -Parent=IE 4.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.01*)*] -Parent=IE 4.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 4.01; Windows NT)] -Parent=IE 4.01 -Platform=WinNT - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.0 - -[IE 5.0] -Parent=DefaultProperties -Browser=IE -Version=5.0 -MajorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 5.0*)*] -Parent=IE 5.0 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 95*)*] -Parent=IE 5.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98*)*] -Parent=IE 5.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 5.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 4.0*)*] -Parent=IE 5.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.0*)*] -Parent=IE 5.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.01*)*] -Parent=IE 5.0 -Platform=Win2000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.01 - -[IE 5.01] -Parent=DefaultProperties -Browser=IE -Version=5.01 -MajorVer=5 -MinorVer=01 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 5.01*)*] -Parent=IE 5.01 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 95*)*] -Parent=IE 5.01 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98*)*] -Parent=IE 5.01 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 5.01 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 4.0*)*] -Parent=IE 5.01 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.0*)*] -Parent=IE 5.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.01*)*] -Parent=IE 5.01 -Platform=Win2000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.5 - -[IE 5.5] -Parent=DefaultProperties -Browser=IE -Version=5.5 -MajorVer=5 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 5.5*)*] -Parent=IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 95*)*] -Parent=IE 5.5 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98*)*] -Parent=IE 5.5 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98; Win 9x 4.90*)*] -Parent=IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 4.0*)*] -Parent=IE 5.5 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.0*)*] -Parent=IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.01*)*] -Parent=IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.1*)*] -Parent=IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.2*)*] -Parent=IE 5.5 -Platform=Win2003 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 6.0 - -[IE 6.0] -Parent=DefaultProperties -Browser=IE -Version=6.0 -MajorVer=6 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -w3cdomversion=1.0 -msdomversion=6.0 - -[Mozilla/?.* (?compatible; *MSIE 6.0*)*] -Parent=IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 95*)*] -Parent=IE 6.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98*)*] -Parent=IE 6.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98; Win 9x 4.90*)*] -Parent=IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 4.0*)*] -Parent=IE 6.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.0*)*] -Parent=IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.01*)*] -Parent=IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.1*)*] -Parent=IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2*)*] -Parent=IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*Win64;*)*] -Parent=IE 6.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*WOW64;*)*] -Parent=IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 6.0*)*] -Parent=IE 6.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 7.0 - -[IE 7.0] -Parent=DefaultProperties -Browser=IE -Version=7.0 -MajorVer=7 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -msdomversion=7.0 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 7.0*)*] -Parent=IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98*)*] -Parent=IE 7.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 4.0*)*] -Parent=IE 7.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.0*)*] -Parent=IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.01*)*] -Parent=IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.1*)*] -Parent=IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2*)*] -Parent=IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*Win64;*)*] -Parent=IE 7.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*WOW64;*)*] -Parent=IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.0*)*] -Parent=IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.1*)*] -Parent=IE 7.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; *)*] -Parent=IE 7.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 8.0 - -[IE 8.0] -Parent=DefaultProperties -Browser=IE -Version=8.0 -MajorVer=8 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=3 -supportsCSS=true -ecmascriptversion=1.2 -msdomversion=8.0 -w3cdomversion=1.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Win32*)*] -Parent=IE 8.0 -Platform=Win32 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0*)*] -Parent=IE 8.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1*)*] -Parent=IE 8.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2*)*] -Parent=IE 8.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Win64; x64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista -Win64=false - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1*)*] -Parent=IE 8.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 -Win64=false - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 7.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Default Browser - -[*] -Browser=Default Browser -Version=0 -MajorVer=0 -MinorVer=0 -Platform=unknown -Alpha=false -Beta=false -Win16=false -Win32=false -Win64=false -Frames=true -IFrames=false -Tables=true -Cookies=false -BackgroundSounds=false -CDF=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -Stripper=false -isBanned=false -isMobileDevice=false -isSyndicationReader=false -Crawler=false -CssVersion=0 -supportsCSS=false -AOL=false -aolVersion=0 -AuthenticodeUpdate=0 -CSS=0 -WAP=false -netCLR=false -ClrVersion=0 -ECMAScriptVersion=0.0 -W3CDOMVersion=0.0 diff --git a/Source/Platforms/UWP/Binaries/Mono/etc/mono/config b/Source/Platforms/UWP/Binaries/Mono/etc/mono/config deleted file mode 100644 index 385128f74..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/etc/mono/config +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/UWP/Binaries/Mono/etc/mono/mconfig/config.xml b/Source/Platforms/UWP/Binaries/Mono/etc/mono/mconfig/config.xml deleted file mode 100644 index a3df3b5e9..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/etc/mono/mconfig/config.xml +++ /dev/null @@ -1,616 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - - -]]> - - - - - - -
-
-
- - - - - -
- -
-
-
-
- - - -]]> - - - - - -
-
-
-
-
-
-
- - - - - -]]> - - - - - -
-
-
-
-
-
-
- - - - - - - - -]]> - - - - - -
-
-
-
-
- - - - - - - -]]> - - - - - -
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
- - - - - - - - - - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - - - - - -]]> - - - - - - - -
-
-
- - - - - -
- -
-
-
- - - - ]]> - - - - - -
-
-
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
- - - - - - - -]]> - - - - - -
-
-
-
-
- - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - -]]> - - - - - - -
-
-
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
-
-
- - - - - - - - - - - -]]> - - - - - -
-
-
-
-
- - - - -]]> - - - - - - - - ]]> - - - - - - ]]> - - - - - - ]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - -
-
-
-
-
-
- - diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/Accessibility.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/Accessibility.dll deleted file mode 100644 index 853d3c046..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/Accessibility.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0912a0bebc016e611e4900d99485713fbf0e013f496afc8fc837be08611723e -size 12288 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/Mono.Posix.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/Mono.Posix.dll deleted file mode 100644 index 24e19fd94..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/Mono.Posix.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:808439c9d7c076eb2522fdfe2ce1098abae6f6e285d6abc55d97ddb6d0d26e08 -size 212480 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/Mono.Security.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/Mono.Security.dll deleted file mode 100644 index 951b0bfae..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/Mono.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3f217f4a364c34d7f49936cf260433f45611a04429a2e3984b323a59f830589 -size 314368 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll deleted file mode 100644 index 8bfd1a09b..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2383b6b3a6b26d1087085b36c870f0ec9bbdea2b1bdbc84a0fae1199c748b7bc -size 259072 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll deleted file mode 100644 index ab6ebc5e5..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eba35e43d95ab785e49df375698e0d16dc96c01913f122d8e28037ede27a352d -size 84992 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Configuration.Install.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Configuration.Install.dll deleted file mode 100644 index 466defc1b..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Configuration.Install.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:252e5a4efb637836e095d3b548f260a5f102e1d9a7ab60d6e86f1d037fd5a9a9 -size 24064 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Configuration.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Configuration.dll deleted file mode 100644 index b527bebb0..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Configuration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b80cf5be3c7057d75a8316656c2908fee6c42c56db496a3cd7360fd7f7ef1a8 -size 122880 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Core.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Core.dll deleted file mode 100644 index 800084cbe..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cbbbec2664d3db5ba45968309567fd8f1a40e2b7f850f105f65542ee2e6a120b -size 1060864 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll deleted file mode 100644 index 20c4a229d..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47d6066206c902291116777a12866baaf14047881b2a81c1581043da98f87d33 -size 29696 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.Entity.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.Entity.dll deleted file mode 100644 index 89a341f3d..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.Entity.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60d64c82a582aa890534cc712d433821054e06410bde58064e93d5e018c42863 -size 3339264 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.Linq.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.Linq.dll deleted file mode 100644 index 3b46bead2..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17a0d35c1ad7d7b08a1b587cf356642afbfa79c7dedce2a7f45233b4484ec0ab -size 493568 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.OracleClient.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.OracleClient.dll deleted file mode 100644 index 305c96c77..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.OracleClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d505d83165e22e7ab370453cf9a18df8719c85275f7ff14b66c3345cfae0a07 -size 173056 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.Services.Client.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.Services.Client.dll deleted file mode 100644 index 7a63dfefe..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.Services.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c36d770c293ee54ffc024ccd306ed52b0b1c673e938e70d2d545366e93b1fbf -size 418816 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.Services.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.Services.dll deleted file mode 100644 index 0289c8cba..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7eb71c131eb85bd425da257dc16f33eae51f4860d3acd6cc4b6012cad61feb6b -size 56320 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.dll deleted file mode 100644 index 03c392621..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3b1ff22e881e7942f699a47baf8b19a4c130e06f979d5f040b38a083bd3c80f -size 2176000 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Deployment.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Deployment.dll deleted file mode 100644 index 9ae5b7f34..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db9299957f72f26dc76cc3d99a2eed9cc2dfdcedf3e5d3b7126040a61df404bb -size 11264 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll deleted file mode 100644 index cc9ac46dc..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0e27e7d6f334d21a0d79d5590a2910d7aea644f7c8f4ad3b8d95978d97bd287 -size 61952 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.dll deleted file mode 100644 index b8ac625bc..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4a7f98fb1e80e5d337bbc4836d8fa3545bb9c5da96de9bf5ee0fbbb8b4c2ef0 -size 94208 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Drawing.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Drawing.dll deleted file mode 100644 index 71fb58128..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Drawing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:032e72d1767859c9e9de20117b3ca2823e29d79a545608eb5fa4f0e432c95be9 -size 482816 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Dynamic.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Dynamic.dll deleted file mode 100644 index 19d37807a..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Dynamic.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:faeabe9ab6fb8c6c6f7401440b61f50742d6337422dbe877ffbd2863f8ed7f14 -size 87040 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.EnterpriseServices.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.EnterpriseServices.dll deleted file mode 100644 index 1bd5a2168..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.EnterpriseServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bab34e6aee689697f3de11997bf78d708ca9f388ebd8b4ef8444a72ad146b435 -size 46592 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll deleted file mode 100644 index f0a3d2170..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07509ad8d972a949d23f28182f1014493827c522c0a05c362a322194dcc958d7 -size 18432 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.IO.Compression.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.IO.Compression.dll deleted file mode 100644 index 72c2b69a4..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.IO.Compression.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:854d4c3792cb38bdd150587483a4546ec00402c15ef800fbf9710e769bc6a858 -size 99840 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll deleted file mode 100644 index 2e27836a5..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b10311f5e74a932b53bf5246cb8c5d0870c8abb86b44f346b42d944e0d5aa4cc -size 17408 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.IdentityModel.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.IdentityModel.dll deleted file mode 100644 index fdc4af3ba..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.IdentityModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af5babdd0ed1f293f34cdb5de60990bbbff29b7210ec33b88216d1bcd6690c9f -size 139776 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Json.Microsoft.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Json.Microsoft.dll deleted file mode 100644 index 7fd728f75..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Json.Microsoft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8db90c030ac969ffb0eff96c588b48e687f6578de07dd501c5285adb38d52dc6 -size 54784 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Json.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Json.dll deleted file mode 100644 index d2b1ea8b4..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63b117af842abfd437b9a12d05b5e46eb893128e63d435a3945411a2c5f2c3be -size 32768 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Management.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Management.dll deleted file mode 100644 index 6d5b77cf6..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:167f222464d487e2e1fc3c3e650c8709ef69843e13b396b54832fef13fd2f17f -size 49152 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Messaging.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Messaging.dll deleted file mode 100644 index f1832234a..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23f29e2f9611bf7f723fbcbf8093ea76fa69e7c95f52af11e13ae9c524e36309 -size 75776 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll deleted file mode 100644 index 3bae6b653..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2a0a7ef44aa32beb43360c15276c97d3d2f43fded9b49059ec4b5cd7375eef0 -size 519168 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll deleted file mode 100644 index 486b58b3f..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:056222d594bd4d6d66778e2bbeb13fb60d67ec3bb8132d299b768f528e2b59dc -size 8704 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Net.Http.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Net.Http.dll deleted file mode 100644 index 9ed326fe0..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Net.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c622434b946190b68d1a06c9c4cbb255a335ceb7951ca3c95264f7134d962a89 -size 115712 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Net.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Net.dll deleted file mode 100644 index d5e539cc0..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Net.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:794e311e903861dc9c1fd58ca94d1020e69d2082ec57868ce9b057f0c7febed7 -size 13312 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Numerics.Vectors.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Numerics.Vectors.dll deleted file mode 100644 index 3832659b8..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Numerics.Vectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8605dc6f36efaa5caae780981ef26eb0f1e0991214b6fcc78b65b02de24d57d -size 12288 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Numerics.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Numerics.dll deleted file mode 100644 index 0712c5db6..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a34de47b07a11476d320e8bc90839497666a672dede5f0d89fdaddef9da7fb92 -size 119296 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Core.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Core.dll deleted file mode 100644 index 71a460cff..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4de31ce3baff183fd92197bf54538ef856c48d11aa6e09415fbaa2731b152c2c -size 96256 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Debugger.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Debugger.dll deleted file mode 100644 index 017efea9d..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Debugger.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8d86f058f7449f9562487d55fc6f6d8c48d1ae392031693c412027ab8c725dc -size 5120 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Experimental.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Experimental.dll deleted file mode 100644 index 8cd931a90..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Experimental.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:270fc54fffab856dc39c59f4b8f36c3ea100077d277f8376b38c0defc4ca7106 -size 28672 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll deleted file mode 100644 index cd36c3941..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d9455be0e328fb04c676c098ddbdaae2ec502c3c0c40e5fa8df55eea934be88 -size 7680 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Linq.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Linq.dll deleted file mode 100644 index 896df65a1..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c3d59871c8372fe66118ad949fb63e27d1c9a5224411ca8ea6ff72e7810ce97 -size 683008 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll deleted file mode 100644 index ca13cac26..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d5c4c8215b336d46a9c0c2c17eb7e5b5f0cd1fd4dcb000c078c4e04eaceebf5 -size 9728 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll deleted file mode 100644 index 5d81b4873..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79083f313b2f5e3b20faa88e49205aece830c554e2fc7166d2163aa6367378bd -size 22528 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Providers.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Providers.dll deleted file mode 100644 index 6baa78665..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Providers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6cca58ace28725eab8be54c5ce63f38226e00491e6f18e870f2c4de955f7eb1 -size 243200 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll deleted file mode 100644 index a76d185f1..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1de1731d7fb418f4d190d8bfb4a82c9fa98a7ed2dfb87c9f090b86f5859df9e3 -size 9216 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll deleted file mode 100644 index 9732542ef..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a45b23e876eaa89da807f8e569d4310b7837b15e8c1fa5d7f96b0cfc102a4e9a -size 9728 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll deleted file mode 100644 index c7d365f14..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4bab7f093518c414085258a5ed9da770be284b6a0fd50717d7890ec743e7ec7 -size 12800 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reflection.Context.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reflection.Context.dll deleted file mode 100644 index 35115a643..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Reflection.Context.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd06d517d0d44a2f2c0b9ef30212f54f3c36b0db8c6efacab98a4685b1f64dea -size 13312 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Runtime.Caching.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Runtime.Caching.dll deleted file mode 100644 index fc7961035..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Runtime.Caching.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44472e1daf4804d9cbb27570a33637f8fff7baaf2a34cb1b0265ec0ce126560a -size 72192 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll deleted file mode 100644 index d8deafe7b..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a602889eb1f44c67e0f007302b60cc597cebbe1497602251b72aead641b0b30 -size 107008 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Runtime.Remoting.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Runtime.Remoting.dll deleted file mode 100644 index 739ba99fb..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f969cb59d10e32c8ca64315202d9b7f4c281f90644eb3def96043630db93cea1 -size 119808 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll deleted file mode 100644 index fd8edb333..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11095119a3bb3e90062f5d945ee84cafd9f5d398b3469b7dea93226a8969f597 -size 38912 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.dll deleted file mode 100644 index 86d9f24ec..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e79e892dd359575db05e94540e258abd7d00d866537884b08f40496b8324bda1 -size 934400 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Security.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Security.dll deleted file mode 100644 index e9f767348..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3aa7e023a1603b1b8a75238fd90d84404270f4d0e1e19f4b990d516da69c4ae5 -size 281600 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll deleted file mode 100644 index 0549bdb6d..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f469c217afd60fcb81a9a74465cbf0354d8e67d1d2e7092a0e58868a0048c8d9 -size 13312 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll deleted file mode 100644 index 91210a18c..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99fe4cfa49222d8d6c8a1168e42be676574dd035040b1bbe4528c32b215e2c8f -size 141312 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll deleted file mode 100644 index 3c8004057..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a89bf31e08fee2d8922b534387b5e1b73f66de4aaff8ef3267574c55dfa8b099 -size 214528 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll deleted file mode 100644 index 7f7a47794..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3f2ebe00b9ce96573985d158625c77d67fddf9ffb9c6932f88b094f01dfd68f -size 37376 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Web.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Web.dll deleted file mode 100644 index 40e3cc005..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60bbb932cfd6740d5f33eb1606f5f37c84177dc690b0621a369015eb1c039cfa -size 79360 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceModel.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceModel.dll deleted file mode 100644 index 963c03d04..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5a0ac8df58b6ec822693e7560d99bdf18390c653255b32c944b15b6a3444ec4 -size 1426944 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceProcess.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceProcess.dll deleted file mode 100644 index 7f7f8abc4..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.ServiceProcess.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c4a73a29be261f5ccb86488ffe10f0a39e89da06bd79dfb14a8fcfa9220ab0d -size 47104 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll deleted file mode 100644 index 4e93ddc2f..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0cb9c05d93e946fb60be318c84f8f160b9a629a419932ec5a7d15caaaf684f8f -size 168960 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Transactions.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Transactions.dll deleted file mode 100644 index 5a32ec0ad..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Transactions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c42f2468cda39b9a52b122dcd18d0377220c396cb69b2b493ce7f8754fc1f1d -size 34304 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Abstractions.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Abstractions.dll deleted file mode 100644 index 98eb8573f..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Abstractions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c3f86f31d8a6ae98982e2d3dac1fd8f25b1ebb58f1206edfb118a41e9ffd319 -size 12800 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll deleted file mode 100644 index fdca73577..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fabe15ee190b3d1c4ffaa467cd76bfeeb174c26e85f9324b30a5ffaab13d5bf -size 33792 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.DynamicData.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.DynamicData.dll deleted file mode 100644 index ef466b724..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.DynamicData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66a107c6d94a6f4811240d1fde552d9fdac32b4a0cb985766e6c5570e1661002 -size 69120 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Extensions.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Extensions.dll deleted file mode 100644 index 7b6226fef..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0162659ab054c3969ae150f0e05368b57e45518c49ac3ceb97c5d55a6c529cf9 -size 746496 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll deleted file mode 100644 index 74f0a27c1..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53b4ec85036c686ffac982c7bdfe9991ac25fb6e316a341a5a07ce96e9513e55 -size 88064 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll deleted file mode 100644 index fc0cbcc1e..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4cc0e41b1640296696ed6d3a6940acdb0746e45549f97809ea634444eadbca72 -size 56320 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Http.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Http.dll deleted file mode 100644 index c11535639..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d3314f0fd4caab1d63c2349c30ef557c74ae3ff2719a7998873b62180261f52 -size 326144 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Mobile.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Mobile.dll deleted file mode 100644 index 2f83ca253..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Mobile.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a836e3e93e5828736088cde47e28512c5cc57a2009db9805a797516e70245b7 -size 11264 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Mvc.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Mvc.dll deleted file mode 100644 index 985161adf..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Mvc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e16b3608d9d80935dfb5d7fee7c52ff010313177c336e699e197521f57a776e -size 420352 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Razor.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Razor.dll deleted file mode 100644 index dbcb53418..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c880284f07b77730ff6f403c404165de5bfc6cef7c114015f357f375b59200d9 -size 254976 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll deleted file mode 100644 index 8e64c7e1d..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ac0e21ae2a3806a9b4022003e34c8fec95764b41de2b1c22053a5a4210b99f5 -size 11776 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Routing.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Routing.dll deleted file mode 100644 index 84a86a1ff..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f77a573dbf24e8d4c97b10ac1db02006a3a10b59fcf00f491a48d95e08f2d9a5 -size 12288 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Services.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Services.dll deleted file mode 100644 index 684f807d8..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e6957762acf08a660d95f8f53360b0f5d5f964faff1e8883a0a05d17d088181 -size 736256 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll deleted file mode 100644 index 217074c81..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3b155c702b203bd92bb000674ecbb17268c1f286d862456420a07fb06aea296 -size 39424 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll deleted file mode 100644 index 9c180770d..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1935aae7b622b37295665235e0ec74a8821b3c010c20f558b3d13be42d1e77c6 -size 38400 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.dll deleted file mode 100644 index bc5c14264..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5cb446d04971bbd2b6e911b9751c953f95d41f2c1d86291d683caf62644c613 -size 196608 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.dll deleted file mode 100644 index 76076e618..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5edaae59667f870f05981d83c31ff25de85a56bcac1c3c21b2a3536439ef6930 -size 3030016 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll deleted file mode 100644 index 23fa3775b..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8313360d08f86b6c805df0a3576a2dc2f5d253241ba22a868e65b09d947343bf -size 145920 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.dll deleted file mode 100644 index 3ff3435d4..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2cb88a463f0f8e7025b6e6988ee2e3d4001ce0b7cf5a37560e1002e325bb0eb -size 2898432 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Windows.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Windows.dll deleted file mode 100644 index a0d16168d..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Windows.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec90da3e05d35fa76a1d576a9c14e0fb95e9c5016305352607029ff080a4bc1a -size 11776 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Workflow.Activities.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Workflow.Activities.dll deleted file mode 100644 index 159d8a7e5..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Workflow.Activities.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ffda734f630f52c7aabf9b6dfbb1cfd43be266f5761f8df8e1ae1b9e5f7dcc1 -size 11776 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll deleted file mode 100644 index 2547b6648..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c0c81efccdd49d67ba923bb9f96e7b095ae0c5726620ab0e98ecaab65dc299b -size 11776 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Workflow.Runtime.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Workflow.Runtime.dll deleted file mode 100644 index 2c2b17854..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Workflow.Runtime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b09dd31624af27363fab179b4b0a2dae32e698eb4284f187742a3129f1f44e9 -size 11776 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Xaml.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Xaml.dll deleted file mode 100644 index 9d4b1802f..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Xaml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:610a9d1d412a1785d2d04be3549e8b708977ddcfb3cd73241a659afa5039a381 -size 188928 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Xml.Linq.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Xml.Linq.dll deleted file mode 100644 index 07bb029db..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Xml.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74e12d93dc79b18aef8241d4dbfc7a5ab4a2457ec94f087ab280809dde3cb9b0 -size 137216 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Xml.Serialization.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Xml.Serialization.dll deleted file mode 100644 index 71501bb82..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Xml.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d51a04521acc7d37047913b82a2973edcaf6db96ce74f2e3fe3fa506d1b0b70 -size 11776 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Xml.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Xml.dll deleted file mode 100644 index 88dfe5ae7..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58196401c5c8f3323e0912b4422137612bd7eb2a3821cb53c4ac74fb7b26dda1 -size 3174912 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.dll deleted file mode 100644 index 997f34981..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/System.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb1d7b4b87422c0cd8f0aa847c382cbcb1bad88872f013ef164eaaf0ed76a5fc -size 2456064 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/WindowsBase.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/WindowsBase.dll deleted file mode 100644 index 345f59f24..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/WindowsBase.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:445e763848380e33861eda9af9b2d871237c12f4799603f32b0c42abf9875a7c -size 161792 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/mscorlib.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/mscorlib.dll deleted file mode 100644 index 7b6afe057..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/4.5/mscorlib.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1945a39b4cc3ff3d16d1ed359fca1399248b54dc41da14c51db37ace45eddf9 -size 4498432 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll deleted file mode 100644 index 853d3c046..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0912a0bebc016e611e4900d99485713fbf0e013f496afc8fc837be08611723e -size 12288 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll deleted file mode 100644 index 24e19fd94..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:808439c9d7c076eb2522fdfe2ce1098abae6f6e285d6abc55d97ddb6d0d26e08 -size 212480 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll deleted file mode 100644 index 951b0bfae..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3f217f4a364c34d7f49936cf260433f45611a04429a2e3984b323a59f830589 -size 314368 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ComponentModel.Composition/4.0.0.0__b77a5c561934e089/System.ComponentModel.Composition.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ComponentModel.Composition/4.0.0.0__b77a5c561934e089/System.ComponentModel.Composition.dll deleted file mode 100644 index 8bfd1a09b..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ComponentModel.Composition/4.0.0.0__b77a5c561934e089/System.ComponentModel.Composition.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2383b6b3a6b26d1087085b36c870f0ec9bbdea2b1bdbc84a0fae1199c748b7bc -size 259072 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll deleted file mode 100644 index ab6ebc5e5..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eba35e43d95ab785e49df375698e0d16dc96c01913f122d8e28037ede27a352d -size 84992 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll deleted file mode 100644 index 466defc1b..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:252e5a4efb637836e095d3b548f260a5f102e1d9a7ab60d6e86f1d037fd5a9a9 -size 24064 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll deleted file mode 100644 index b527bebb0..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b80cf5be3c7057d75a8316656c2908fee6c42c56db496a3cd7360fd7f7ef1a8 -size 122880 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll deleted file mode 100644 index 800084cbe..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cbbbec2664d3db5ba45968309567fd8f1a40e2b7f850f105f65542ee2e6a120b -size 1060864 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data.DataSetExtensions/4.0.0.0__b77a5c561934e089/System.Data.DataSetExtensions.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data.DataSetExtensions/4.0.0.0__b77a5c561934e089/System.Data.DataSetExtensions.dll deleted file mode 100644 index 20c4a229d..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data.DataSetExtensions/4.0.0.0__b77a5c561934e089/System.Data.DataSetExtensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47d6066206c902291116777a12866baaf14047881b2a81c1581043da98f87d33 -size 29696 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data.Entity/4.0.0.0__b77a5c561934e089/System.Data.Entity.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data.Entity/4.0.0.0__b77a5c561934e089/System.Data.Entity.dll deleted file mode 100644 index 89a341f3d..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data.Entity/4.0.0.0__b77a5c561934e089/System.Data.Entity.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60d64c82a582aa890534cc712d433821054e06410bde58064e93d5e018c42863 -size 3339264 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll deleted file mode 100644 index 3b46bead2..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17a0d35c1ad7d7b08a1b587cf356642afbfa79c7dedce2a7f45233b4484ec0ab -size 493568 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll deleted file mode 100644 index 305c96c77..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d505d83165e22e7ab370453cf9a18df8719c85275f7ff14b66c3345cfae0a07 -size 173056 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data.Services.Client/4.0.0.0__b77a5c561934e089/System.Data.Services.Client.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data.Services.Client/4.0.0.0__b77a5c561934e089/System.Data.Services.Client.dll deleted file mode 100644 index 7a63dfefe..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data.Services.Client/4.0.0.0__b77a5c561934e089/System.Data.Services.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c36d770c293ee54ffc024ccd306ed52b0b1c673e938e70d2d545366e93b1fbf -size 418816 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data.Services/4.0.0.0__b77a5c561934e089/System.Data.Services.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data.Services/4.0.0.0__b77a5c561934e089/System.Data.Services.dll deleted file mode 100644 index 0289c8cba..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data.Services/4.0.0.0__b77a5c561934e089/System.Data.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7eb71c131eb85bd425da257dc16f33eae51f4860d3acd6cc4b6012cad61feb6b -size 56320 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll deleted file mode 100644 index 03c392621..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3b1ff22e881e7942f699a47baf8b19a4c130e06f979d5f040b38a083bd3c80f -size 2176000 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Deployment/4.0.0.0__b03f5f7f11d50a3a/System.Deployment.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Deployment/4.0.0.0__b03f5f7f11d50a3a/System.Deployment.dll deleted file mode 100644 index 9ae5b7f34..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Deployment/4.0.0.0__b03f5f7f11d50a3a/System.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db9299957f72f26dc76cc3d99a2eed9cc2dfdcedf3e5d3b7126040a61df404bb -size 11264 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.DirectoryServices.Protocols/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.Protocols.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.DirectoryServices.Protocols/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.Protocols.dll deleted file mode 100644 index cc9ac46dc..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.DirectoryServices.Protocols/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.Protocols.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0e27e7d6f334d21a0d79d5590a2910d7aea644f7c8f4ad3b8d95978d97bd287 -size 61952 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll deleted file mode 100644 index b8ac625bc..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4a7f98fb1e80e5d337bbc4836d8fa3545bb9c5da96de9bf5ee0fbbb8b4c2ef0 -size 94208 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll deleted file mode 100644 index 71fb58128..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:032e72d1767859c9e9de20117b3ca2823e29d79a545608eb5fa4f0e432c95be9 -size 482816 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Dynamic/4.0.0.0__b03f5f7f11d50a3a/System.Dynamic.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Dynamic/4.0.0.0__b03f5f7f11d50a3a/System.Dynamic.dll deleted file mode 100644 index 19d37807a..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Dynamic/4.0.0.0__b03f5f7f11d50a3a/System.Dynamic.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:faeabe9ab6fb8c6c6f7401440b61f50742d6337422dbe877ffbd2863f8ed7f14 -size 87040 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll deleted file mode 100644 index 1bd5a2168..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bab34e6aee689697f3de11997bf78d708ca9f388ebd8b4ef8444a72ad146b435 -size 46592 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll deleted file mode 100644 index f0a3d2170..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07509ad8d972a949d23f28182f1014493827c522c0a05c362a322194dcc958d7 -size 18432 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll deleted file mode 100644 index 72c2b69a4..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:854d4c3792cb38bdd150587483a4546ec00402c15ef800fbf9710e769bc6a858 -size 99840 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll deleted file mode 100644 index 2e27836a5..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b10311f5e74a932b53bf5246cb8c5d0870c8abb86b44f346b42d944e0d5aa4cc -size 17408 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll deleted file mode 100644 index fdc4af3ba..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af5babdd0ed1f293f34cdb5de60990bbbff29b7210ec33b88216d1bcd6690c9f -size 139776 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Json.Microsoft/4.0.0.0__31bf3856ad364e35/System.Json.Microsoft.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Json.Microsoft/4.0.0.0__31bf3856ad364e35/System.Json.Microsoft.dll deleted file mode 100644 index 7fd728f75..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Json.Microsoft/4.0.0.0__31bf3856ad364e35/System.Json.Microsoft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8db90c030ac969ffb0eff96c588b48e687f6578de07dd501c5285adb38d52dc6 -size 54784 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Json/4.0.0.0__31bf3856ad364e35/System.Json.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Json/4.0.0.0__31bf3856ad364e35/System.Json.dll deleted file mode 100644 index d2b1ea8b4..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Json/4.0.0.0__31bf3856ad364e35/System.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63b117af842abfd437b9a12d05b5e46eb893128e63d435a3945411a2c5f2c3be -size 32768 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll deleted file mode 100644 index 6d5b77cf6..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:167f222464d487e2e1fc3c3e650c8709ef69843e13b396b54832fef13fd2f17f -size 49152 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll deleted file mode 100644 index f1832234a..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23f29e2f9611bf7f723fbcbf8093ea76fa69e7c95f52af11e13ae9c524e36309 -size 75776 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll deleted file mode 100644 index 3bae6b653..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2a0a7ef44aa32beb43360c15276c97d3d2f43fded9b49059ec4b5cd7375eef0 -size 519168 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll deleted file mode 100644 index 486b58b3f..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:056222d594bd4d6d66778e2bbeb13fb60d67ec3bb8132d299b768f528e2b59dc -size 8704 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll deleted file mode 100644 index 9ed326fe0..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c622434b946190b68d1a06c9c4cbb255a335ceb7951ca3c95264f7134d962a89 -size 115712 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll deleted file mode 100644 index d5e539cc0..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:794e311e903861dc9c1fd58ca94d1020e69d2082ec57868ce9b057f0c7febed7 -size 13312 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll deleted file mode 100644 index 3832659b8..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8605dc6f36efaa5caae780981ef26eb0f1e0991214b6fcc78b65b02de24d57d -size 12288 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll deleted file mode 100644 index 0712c5db6..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a34de47b07a11476d320e8bc90839497666a672dede5f0d89fdaddef9da7fb92 -size 119296 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Core/2.2.0.0__31bf3856ad364e35/System.Reactive.Core.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Core/2.2.0.0__31bf3856ad364e35/System.Reactive.Core.dll deleted file mode 100644 index 71a460cff..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Core/2.2.0.0__31bf3856ad364e35/System.Reactive.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4de31ce3baff183fd92197bf54538ef856c48d11aa6e09415fbaa2731b152c2c -size 96256 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Debugger/2.2.0.0__31bf3856ad364e35/System.Reactive.Debugger.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Debugger/2.2.0.0__31bf3856ad364e35/System.Reactive.Debugger.dll deleted file mode 100644 index 017efea9d..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Debugger/2.2.0.0__31bf3856ad364e35/System.Reactive.Debugger.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8d86f058f7449f9562487d55fc6f6d8c48d1ae392031693c412027ab8c725dc -size 5120 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Experimental/2.2.0.0__31bf3856ad364e35/System.Reactive.Experimental.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Experimental/2.2.0.0__31bf3856ad364e35/System.Reactive.Experimental.dll deleted file mode 100644 index 8cd931a90..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Experimental/2.2.0.0__31bf3856ad364e35/System.Reactive.Experimental.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:270fc54fffab856dc39c59f4b8f36c3ea100077d277f8376b38c0defc4ca7106 -size 28672 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Interfaces/2.2.0.0__31bf3856ad364e35/System.Reactive.Interfaces.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Interfaces/2.2.0.0__31bf3856ad364e35/System.Reactive.Interfaces.dll deleted file mode 100644 index cd36c3941..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Interfaces/2.2.0.0__31bf3856ad364e35/System.Reactive.Interfaces.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d9455be0e328fb04c676c098ddbdaae2ec502c3c0c40e5fa8df55eea934be88 -size 7680 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Linq/2.2.0.0__31bf3856ad364e35/System.Reactive.Linq.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Linq/2.2.0.0__31bf3856ad364e35/System.Reactive.Linq.dll deleted file mode 100644 index 896df65a1..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Linq/2.2.0.0__31bf3856ad364e35/System.Reactive.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c3d59871c8372fe66118ad949fb63e27d1c9a5224411ca8ea6ff72e7810ce97 -size 683008 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Observable.Aliases/0.0.0.0__31bf3856ad364e35/System.Reactive.Observable.Aliases.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Observable.Aliases/0.0.0.0__31bf3856ad364e35/System.Reactive.Observable.Aliases.dll deleted file mode 100644 index ca13cac26..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Observable.Aliases/0.0.0.0__31bf3856ad364e35/System.Reactive.Observable.Aliases.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d5c4c8215b336d46a9c0c2c17eb7e5b5f0cd1fd4dcb000c078c4e04eaceebf5 -size 9728 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.PlatformServices/2.2.0.0__31bf3856ad364e35/System.Reactive.PlatformServices.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.PlatformServices/2.2.0.0__31bf3856ad364e35/System.Reactive.PlatformServices.dll deleted file mode 100644 index 5d81b4873..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.PlatformServices/2.2.0.0__31bf3856ad364e35/System.Reactive.PlatformServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79083f313b2f5e3b20faa88e49205aece830c554e2fc7166d2163aa6367378bd -size 22528 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Providers/2.2.0.0__31bf3856ad364e35/System.Reactive.Providers.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Providers/2.2.0.0__31bf3856ad364e35/System.Reactive.Providers.dll deleted file mode 100644 index 6baa78665..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Providers/2.2.0.0__31bf3856ad364e35/System.Reactive.Providers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6cca58ace28725eab8be54c5ce63f38226e00491e6f18e870f2c4de955f7eb1 -size 243200 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Runtime.Remoting/2.2.0.0__31bf3856ad364e35/System.Reactive.Runtime.Remoting.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Runtime.Remoting/2.2.0.0__31bf3856ad364e35/System.Reactive.Runtime.Remoting.dll deleted file mode 100644 index a76d185f1..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Runtime.Remoting/2.2.0.0__31bf3856ad364e35/System.Reactive.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1de1731d7fb418f4d190d8bfb4a82c9fa98a7ed2dfb87c9f090b86f5859df9e3 -size 9216 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Windows.Forms/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Forms.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Windows.Forms/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Forms.dll deleted file mode 100644 index 9732542ef..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Windows.Forms/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a45b23e876eaa89da807f8e569d4310b7837b15e8c1fa5d7f96b0cfc102a4e9a -size 9728 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Windows.Threading/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Threading.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Windows.Threading/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Threading.dll deleted file mode 100644 index c7d365f14..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reactive.Windows.Threading/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Threading.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4bab7f093518c414085258a5ed9da770be284b6a0fd50717d7890ec743e7ec7 -size 12800 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reflection.Context/4.0.0.0__b77a5c561934e089/System.Reflection.Context.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reflection.Context/4.0.0.0__b77a5c561934e089/System.Reflection.Context.dll deleted file mode 100644 index 35115a643..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Reflection.Context/4.0.0.0__b77a5c561934e089/System.Reflection.Context.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd06d517d0d44a2f2c0b9ef30212f54f3c36b0db8c6efacab98a4685b1f64dea -size 13312 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll deleted file mode 100644 index fc7961035..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44472e1daf4804d9cbb27570a33637f8fff7baaf2a34cb1b0265ec0ce126560a -size 72192 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll deleted file mode 100644 index d8deafe7b..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a602889eb1f44c67e0f007302b60cc597cebbe1497602251b72aead641b0b30 -size 107008 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll deleted file mode 100644 index 739ba99fb..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f969cb59d10e32c8ca64315202d9b7f4c281f90644eb3def96043630db93cea1 -size 119808 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll deleted file mode 100644 index fd8edb333..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11095119a3bb3e90062f5d945ee84cafd9f5d398b3469b7dea93226a8969f597 -size 38912 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll deleted file mode 100644 index 86d9f24ec..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e79e892dd359575db05e94540e258abd7d00d866537884b08f40496b8324bda1 -size 934400 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll deleted file mode 100644 index e9f767348..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3aa7e023a1603b1b8a75238fd90d84404270f4d0e1e19f4b990d516da69c4ae5 -size 281600 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll deleted file mode 100644 index 0549bdb6d..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f469c217afd60fcb81a9a74465cbf0354d8e67d1d2e7092a0e58868a0048c8d9 -size 13312 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll deleted file mode 100644 index 91210a18c..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99fe4cfa49222d8d6c8a1168e42be676574dd035040b1bbe4528c32b215e2c8f -size 141312 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll deleted file mode 100644 index 3c8004057..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a89bf31e08fee2d8922b534387b5e1b73f66de4aaff8ef3267574c55dfa8b099 -size 214528 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll deleted file mode 100644 index 7f7a47794..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3f2ebe00b9ce96573985d158625c77d67fddf9ffb9c6932f88b094f01dfd68f -size 37376 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll deleted file mode 100644 index 40e3cc005..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60bbb932cfd6740d5f33eb1606f5f37c84177dc690b0621a369015eb1c039cfa -size 79360 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll deleted file mode 100644 index 963c03d04..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5a0ac8df58b6ec822693e7560d99bdf18390c653255b32c944b15b6a3444ec4 -size 1426944 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll deleted file mode 100644 index 7f7f8abc4..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c4a73a29be261f5ccb86488ffe10f0a39e89da06bd79dfb14a8fcfa9220ab0d -size 47104 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Threading.Tasks.Dataflow/4.0.0.0__b77a5c561934e089/System.Threading.Tasks.Dataflow.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Threading.Tasks.Dataflow/4.0.0.0__b77a5c561934e089/System.Threading.Tasks.Dataflow.dll deleted file mode 100644 index 4e93ddc2f..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Threading.Tasks.Dataflow/4.0.0.0__b77a5c561934e089/System.Threading.Tasks.Dataflow.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0cb9c05d93e946fb60be318c84f8f160b9a629a419932ec5a7d15caaaf684f8f -size 168960 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll deleted file mode 100644 index 5a32ec0ad..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c42f2468cda39b9a52b122dcd18d0377220c396cb69b2b493ce7f8754fc1f1d -size 34304 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll deleted file mode 100644 index 98eb8573f..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c3f86f31d8a6ae98982e2d3dac1fd8f25b1ebb58f1206edfb118a41e9ffd319 -size 12800 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll deleted file mode 100644 index fdca73577..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fabe15ee190b3d1c4ffaa467cd76bfeeb174c26e85f9324b30a5ffaab13d5bf -size 33792 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll deleted file mode 100644 index ef466b724..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66a107c6d94a6f4811240d1fde552d9fdac32b4a0cb985766e6c5570e1661002 -size 69120 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll deleted file mode 100644 index 7b6226fef..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0162659ab054c3969ae150f0e05368b57e45518c49ac3ceb97c5d55a6c529cf9 -size 746496 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll deleted file mode 100644 index 74f0a27c1..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53b4ec85036c686ffac982c7bdfe9991ac25fb6e316a341a5a07ce96e9513e55 -size 88064 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll deleted file mode 100644 index fc0cbcc1e..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4cc0e41b1640296696ed6d3a6940acdb0746e45549f97809ea634444eadbca72 -size 56320 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll deleted file mode 100644 index c11535639..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d3314f0fd4caab1d63c2349c30ef557c74ae3ff2719a7998873b62180261f52 -size 326144 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Mobile/4.0.0.0__b03f5f7f11d50a3a/System.Web.Mobile.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Mobile/4.0.0.0__b03f5f7f11d50a3a/System.Web.Mobile.dll deleted file mode 100644 index 2f83ca253..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Mobile/4.0.0.0__b03f5f7f11d50a3a/System.Web.Mobile.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a836e3e93e5828736088cde47e28512c5cc57a2009db9805a797516e70245b7 -size 11264 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll deleted file mode 100644 index 985161adf..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e16b3608d9d80935dfb5d7fee7c52ff010313177c336e699e197521f57a776e -size 420352 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll deleted file mode 100644 index dbcb53418..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c880284f07b77730ff6f403c404165de5bfc6cef7c114015f357f375b59200d9 -size 254976 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.RegularExpressions/4.0.0.0__b03f5f7f11d50a3a/System.Web.RegularExpressions.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.RegularExpressions/4.0.0.0__b03f5f7f11d50a3a/System.Web.RegularExpressions.dll deleted file mode 100644 index 8e64c7e1d..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.RegularExpressions/4.0.0.0__b03f5f7f11d50a3a/System.Web.RegularExpressions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ac0e21ae2a3806a9b4022003e34c8fec95764b41de2b1c22053a5a4210b99f5 -size 11776 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll deleted file mode 100644 index 84a86a1ff..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f77a573dbf24e8d4c97b10ac1db02006a3a10b59fcf00f491a48d95e08f2d9a5 -size 12288 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll deleted file mode 100644 index 684f807d8..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e6957762acf08a660d95f8f53360b0f5d5f964faff1e8883a0a05d17d088181 -size 736256 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll deleted file mode 100644 index 217074c81..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3b155c702b203bd92bb000674ecbb17268c1f286d862456420a07fb06aea296 -size 39424 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll deleted file mode 100644 index 9c180770d..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1935aae7b622b37295665235e0ec74a8821b3c010c20f558b3d13be42d1e77c6 -size 38400 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll deleted file mode 100644 index bc5c14264..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5cb446d04971bbd2b6e911b9751c953f95d41f2c1d86291d683caf62644c613 -size 196608 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll deleted file mode 100644 index 76076e618..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5edaae59667f870f05981d83c31ff25de85a56bcac1c3c21b2a3536439ef6930 -size 3030016 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Windows.Forms.DataVisualization/4.0.0.0__31bf3856ad364e35/System.Windows.Forms.DataVisualization.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Windows.Forms.DataVisualization/4.0.0.0__31bf3856ad364e35/System.Windows.Forms.DataVisualization.dll deleted file mode 100644 index 23fa3775b..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Windows.Forms.DataVisualization/4.0.0.0__31bf3856ad364e35/System.Windows.Forms.DataVisualization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8313360d08f86b6c805df0a3576a2dc2f5d253241ba22a868e65b09d947343bf -size 145920 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll deleted file mode 100644 index 3ff3435d4..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2cb88a463f0f8e7025b6e6988ee2e3d4001ce0b7cf5a37560e1002e325bb0eb -size 2898432 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Windows/4.0.0.0__b03f5f7f11d50a3a/System.Windows.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Windows/4.0.0.0__b03f5f7f11d50a3a/System.Windows.dll deleted file mode 100644 index a0d16168d..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Windows/4.0.0.0__b03f5f7f11d50a3a/System.Windows.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec90da3e05d35fa76a1d576a9c14e0fb95e9c5016305352607029ff080a4bc1a -size 11776 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Workflow.Activities/4.0.0.0__31bf3856ad364e35/System.Workflow.Activities.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Workflow.Activities/4.0.0.0__31bf3856ad364e35/System.Workflow.Activities.dll deleted file mode 100644 index 159d8a7e5..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Workflow.Activities/4.0.0.0__31bf3856ad364e35/System.Workflow.Activities.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ffda734f630f52c7aabf9b6dfbb1cfd43be266f5761f8df8e1ae1b9e5f7dcc1 -size 11776 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Workflow.ComponentModel/4.0.0.0__31bf3856ad364e35/System.Workflow.ComponentModel.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Workflow.ComponentModel/4.0.0.0__31bf3856ad364e35/System.Workflow.ComponentModel.dll deleted file mode 100644 index 2547b6648..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Workflow.ComponentModel/4.0.0.0__31bf3856ad364e35/System.Workflow.ComponentModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c0c81efccdd49d67ba923bb9f96e7b095ae0c5726620ab0e98ecaab65dc299b -size 11776 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Workflow.Runtime/4.0.0.0__31bf3856ad364e35/System.Workflow.Runtime.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Workflow.Runtime/4.0.0.0__31bf3856ad364e35/System.Workflow.Runtime.dll deleted file mode 100644 index 2c2b17854..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Workflow.Runtime/4.0.0.0__31bf3856ad364e35/System.Workflow.Runtime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b09dd31624af27363fab179b4b0a2dae32e698eb4284f187742a3129f1f44e9 -size 11776 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll deleted file mode 100644 index 9d4b1802f..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:610a9d1d412a1785d2d04be3549e8b708977ddcfb3cd73241a659afa5039a381 -size 188928 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll deleted file mode 100644 index 07bb029db..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74e12d93dc79b18aef8241d4dbfc7a5ab4a2457ec94f087ab280809dde3cb9b0 -size 137216 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Xml.Serialization/4.0.0.0__b77a5c561934e089/System.Xml.Serialization.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Xml.Serialization/4.0.0.0__b77a5c561934e089/System.Xml.Serialization.dll deleted file mode 100644 index 71501bb82..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Xml.Serialization/4.0.0.0__b77a5c561934e089/System.Xml.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d51a04521acc7d37047913b82a2973edcaf6db96ce74f2e3fe3fa506d1b0b70 -size 11776 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll deleted file mode 100644 index 88dfe5ae7..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58196401c5c8f3323e0912b4422137612bd7eb2a3821cb53c4ac74fb7b26dda1 -size 3174912 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll deleted file mode 100644 index 997f34981..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb1d7b4b87422c0cd8f0aa847c382cbcb1bad88872f013ef164eaaf0ed76a5fc -size 2456064 diff --git a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll b/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll deleted file mode 100644 index 345f59f24..000000000 --- a/Source/Platforms/UWP/Binaries/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:445e763848380e33861eda9af9b2d871237c12f4799603f32b0c42abf9875a7c -size 161792 diff --git a/Source/Platforms/UWP/Binaries/Newtonsoft.Json.dll b/Source/Platforms/UWP/Binaries/Newtonsoft.Json.dll deleted file mode 100644 index 1b8e69d5f..000000000 --- a/Source/Platforms/UWP/Binaries/Newtonsoft.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32df88b715d10a5562a6a75ba061c3b1c3f32f88ca74c995b82f103cfb9a9000 -size 635392 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/MonoPosixHelper.dll b/Source/Platforms/UWP/Binaries/ThirdParty/x64/MonoPosixHelper.dll deleted file mode 100644 index 6c2777d69..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/MonoPosixHelper.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9229b614fc385ef8301d2aef81ed5858a9d57231dc05d754ca516bdcc8a84cec -size 160256 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXCharacterKinematic_static_64.lib b/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXCharacterKinematic_static_64.lib deleted file mode 100644 index c888ffd30..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXCharacterKinematic_static_64.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0571528452727fee3a549ed5af34e8e490f2fc110242c31c9e2d7ddc83233994 -size 1160130 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXCharacterKinematic_static_64.pdb b/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXCharacterKinematic_static_64.pdb deleted file mode 100644 index 435dfa81b..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXCharacterKinematic_static_64.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b161b975752a45a3f2962253e60acd1d6dfc537fc1eb79901dc816ea46b52a98 -size 602112 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXCommon_static_64.lib b/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXCommon_static_64.lib deleted file mode 100644 index 5f72568a4..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXCommon_static_64.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d87ec531014f81cb37b856c1dee7d6aaceefb0fc0df845bad11a684c760ebb9e -size 17406032 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXCommon_static_64.pdb b/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXCommon_static_64.pdb deleted file mode 100644 index 623b3dee2..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXCommon_static_64.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0a565064744bca4e999549a7c4ff9c4b409c95323499386b2dbf9f471119ccf -size 1052672 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXCooking_static_64.lib b/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXCooking_static_64.lib deleted file mode 100644 index b5ecda9d7..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXCooking_static_64.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4829f63d35c4a13fb74b76434034ce5c31088a1d20962f6a3ace8da48195c908 -size 1895882 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXCooking_static_64.pdb b/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXCooking_static_64.pdb deleted file mode 100644 index 5cb4419ab..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXCooking_static_64.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c6c8f83a948442b243dfe964f441e235c0c7b9a82d5eb66c51e0c3e0b39d8bf -size 634880 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXExtensions_static_64.lib b/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXExtensions_static_64.lib deleted file mode 100644 index 8498518d4..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXExtensions_static_64.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7827629e569c2fecb9a8297540e2fd96a0096cfe7e11021f39b094220416e82e -size 9502710 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXExtensions_static_64.pdb b/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXExtensions_static_64.pdb deleted file mode 100644 index 5e4f7f7bd..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXExtensions_static_64.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23b4209baa69da95ed349b29a09cb40cc58bd1dcc107ec7eba2c4c5a59c0e285 -size 3461120 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXFoundation_static_64.lib b/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXFoundation_static_64.lib deleted file mode 100644 index 7793462ae..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXFoundation_static_64.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29ceab6e7982a7eee1fcb08bcbd14da2c5eb5db2cf2baf3e7b3f3877ea2af6f8 -size 953572 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXFoundation_static_64.pdb b/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXFoundation_static_64.pdb deleted file mode 100644 index d0e993c4e..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXFoundation_static_64.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b5776536edb32d48cb260715bc300cf62bbb3cd633422c28f89f8bbdc9b0bef -size 397312 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXPvdSDK_static_64.lib b/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXPvdSDK_static_64.lib deleted file mode 100644 index 04a12cc7d..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXPvdSDK_static_64.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1abc62ab207c381493d527ade096ca18bd5fdfb95de261cb3a786c93d475abd -size 1940572 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXPvdSDK_static_64.pdb b/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXPvdSDK_static_64.pdb deleted file mode 100644 index e791352df..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXPvdSDK_static_64.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b216451e6c8709b8cfbe9c4500fc8c99cafea96e79c5977fa464f7f92eeb4543 -size 921600 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXVehicle_static_64.lib b/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXVehicle_static_64.lib deleted file mode 100644 index f03c17fb7..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXVehicle_static_64.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ac6081bd15cc37822b7cf9bf3cb7e58ece2855d28ced1fff400d11943e951ce -size 5114896 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXVehicle_static_64.pdb b/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXVehicle_static_64.pdb deleted file mode 100644 index f638c05a1..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysXVehicle_static_64.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09fd3bab5ff2ee97a29e0ba3f926874afe2498ba2093c4b872b1c4adf5f904cd -size 3125248 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysX_static_64.lib b/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysX_static_64.lib deleted file mode 100644 index ce8e79f48..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysX_static_64.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23f9743ffe79198c2f477de893d2c858d328f401e6f59ed1e93fce136bf84e48 -size 28750814 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysX_static_64.pdb b/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysX_static_64.pdb deleted file mode 100644 index 831c56eb0..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/PhysX_static_64.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:92c07fb1ddd180374be99bd9e119600afd5e38639f43a78c9e40d818f18e39d4 -size 3518464 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/eglib.pdb b/Source/Platforms/UWP/Binaries/ThirdParty/x64/eglib.pdb deleted file mode 100644 index 8c0341eb8..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/eglib.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4412227ccccf4a2c4e42f6211aeeecfe3f12b205e2819bc200b0e23a695f40db -size 159744 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/libgcmonosgen.pdb b/Source/Platforms/UWP/Binaries/ThirdParty/x64/libgcmonosgen.pdb deleted file mode 100644 index 7aa31f99a..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/libgcmonosgen.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8de524af2b8a1c29e5187b78cf7536a06c91c905558e7a3fc8f444e58b2d4f57 -size 331776 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/libmini.pdb b/Source/Platforms/UWP/Binaries/ThirdParty/x64/libmini.pdb deleted file mode 100644 index 578d1edb0..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/libmini.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:234139c59328296d06669c4e88f36220da33490f4da355be8bf6d5bf8c5ff376 -size 864256 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/libmono-static.lib b/Source/Platforms/UWP/Binaries/ThirdParty/x64/libmono-static.lib deleted file mode 100644 index 0d5d85095..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/libmono-static.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c84bbda568d52415ca408e9cf9f31ffae68c48654a103d194f7d285d8bed03fe -size 22747622 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/libmonoruntime.pdb b/Source/Platforms/UWP/Binaries/ThirdParty/x64/libmonoruntime.pdb deleted file mode 100644 index 0d923338d..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/libmonoruntime.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e97918bf5bf9583b7567c0edc89c3ff8db5946429083bfba26990c64ac83ae04 -size 1249280 diff --git a/Source/Platforms/UWP/Binaries/ThirdParty/x64/libmonoutils.pdb b/Source/Platforms/UWP/Binaries/ThirdParty/x64/libmonoutils.pdb deleted file mode 100644 index f29e0d256..000000000 --- a/Source/Platforms/UWP/Binaries/ThirdParty/x64/libmonoutils.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bad5a80520d7cc717830d08a53e7b9f36f68bfb567cbd9a2a66f079674c9ba31 -size 348160 diff --git a/Source/Platforms/UWP/Binaries/Tools/clang.exe b/Source/Platforms/UWP/Binaries/Tools/clang.exe deleted file mode 100644 index beb09b0e0..000000000 --- a/Source/Platforms/UWP/Binaries/Tools/clang.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:832d7963da0760a0bcce55c778c735289eba50983f1faa29176b4510a3cc6841 -size 37653272 diff --git a/Source/Platforms/UWP/Binaries/Tools/link.exe b/Source/Platforms/UWP/Binaries/Tools/link.exe deleted file mode 100644 index a78eec640..000000000 --- a/Source/Platforms/UWP/Binaries/Tools/link.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4def50fac505213ea0e722450437f740804856108cc1849ef86f4f5222b04c76 -size 1747552 diff --git a/Source/Platforms/UWP/Binaries/Tools/mono-2.0-sgen.dll b/Source/Platforms/UWP/Binaries/Tools/mono-2.0-sgen.dll deleted file mode 100644 index 241309269..000000000 --- a/Source/Platforms/UWP/Binaries/Tools/mono-2.0-sgen.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:589c52b67e95becffe8ee2283907e612cd212c991eb19e76ecb625c745a77e31 -size 5994496 diff --git a/Source/Platforms/UWP/Binaries/Tools/mono.exe b/Source/Platforms/UWP/Binaries/Tools/mono.exe deleted file mode 100644 index 8288bd168..000000000 --- a/Source/Platforms/UWP/Binaries/Tools/mono.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:feff5cbd757e6fb535ce3c13307a5a2172a6aee8aa49dbb6425a4796988c92c4 -size 156160 diff --git a/Source/Platforms/UWP/Binaries/Tools/msobj140.dll b/Source/Platforms/UWP/Binaries/Tools/msobj140.dll deleted file mode 100644 index 4d8d547dc..000000000 --- a/Source/Platforms/UWP/Binaries/Tools/msobj140.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28fea8ab5a2b8fd082ad1479ce9b0a9c415bb3dc8039a18907693baf377fb69a -size 141968 diff --git a/Source/Platforms/UWP/Binaries/Tools/mspdbcore.dll b/Source/Platforms/UWP/Binaries/Tools/mspdbcore.dll deleted file mode 100644 index 901463d9f..000000000 --- a/Source/Platforms/UWP/Binaries/Tools/mspdbcore.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0339235ca81ed7322fca3186fdddcad6d76f7ffeb72b0d07dcda2adaa809ed5b -size 631440 diff --git a/Source/Platforms/Windows/Binaries/Mono/etc/mono/2.0/Browsers/Compat.browser b/Source/Platforms/Windows/Binaries/Mono/etc/mono/2.0/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/etc/mono/2.0/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Windows/Binaries/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Windows/Binaries/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/etc/mono/2.0/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Windows/Binaries/Mono/etc/mono/2.0/machine.config b/Source/Platforms/Windows/Binaries/Mono/etc/mono/2.0/machine.config deleted file mode 100644 index 2577c81dd..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/etc/mono/2.0/machine.config +++ /dev/null @@ -1,280 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
- - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Windows/Binaries/Mono/etc/mono/2.0/settings.map b/Source/Platforms/Windows/Binaries/Mono/etc/mono/2.0/settings.map deleted file mode 100644 index 9a52ccc02..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/etc/mono/2.0/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Windows/Binaries/Mono/etc/mono/2.0/web.config b/Source/Platforms/Windows/Binaries/Mono/etc/mono/2.0/web.config deleted file mode 100644 index e1428f8c3..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/etc/mono/2.0/web.config +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.0/Browsers/Compat.browser b/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.0/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.0/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.0/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.0/machine.config b/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.0/machine.config deleted file mode 100644 index f3b71c43c..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.0/machine.config +++ /dev/null @@ -1,307 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - - -
- -
-
-
-
- - - - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
-
-
-
- - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.0/settings.map b/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.0/settings.map deleted file mode 100644 index 4c53aca67..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.0/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.0/web.config b/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.0/web.config deleted file mode 100644 index 2a7dfd2ed..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.0/web.config +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.5/Browsers/Compat.browser b/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.5/Browsers/Compat.browser deleted file mode 100644 index dcedf7f73..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.5/Browsers/Compat.browser +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx b/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx deleted file mode 100644 index f4d74bff7..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.5/DefaultWsdlHelpGenerator.aspx +++ /dev/null @@ -1,1901 +0,0 @@ -<%-- -// -// DefaultWsdlHelpGenerator.aspx: -// -// Author: -// Lluis Sanchez Gual (lluis@ximian.com) -// -// (C) 2003 Ximian, Inc. http://www.ximian.com -// ---%> - -<%@ Import Namespace="System.Collections" %> -<%@ Import Namespace="System.Collections.Generic" %> -<%@ Import Namespace="System.IO" %> -<%@ Import Namespace="System.Xml.Serialization" %> -<%@ Import Namespace="System.Xml" %> -<%@ Import Namespace="System.Xml.Schema" %> -<%@ Import Namespace="System.Web.Services" %> -<%@ Import Namespace="System.Web.Services.Description" %> -<%@ Import Namespace="System.Web.Services.Configuration" %> -<%@ Import Namespace="System.Web.Configuration" %> -<%@ Import Namespace="System" %> -<%@ Import Namespace="System.Net" %> -<%@ Import Namespace="System.Globalization" %> -<%@ Import Namespace="System.Resources" %> -<%@ Import Namespace="System.Diagnostics" %> -<%@ Import Namespace="System.CodeDom" %> -<%@ Import Namespace="System.CodeDom.Compiler" %> -<%@ Import Namespace="Microsoft.CSharp" %> -<%@ Import Namespace="Microsoft.VisualBasic" %> -<%@ Import Namespace="System.Text" %> -<%@ Import Namespace="System.Text.RegularExpressions" %> -<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %> -<%@ Assembly name="System.Web.Services" %> -<%@ Page debug="true" %> - - - - - - <% - Response.Write (""); - %> - <%=WebServiceName%> Web Service - - - - - - - -
-Web Service
-<%=WebServiceName%> -
- - - - - - - - -
-
-Overview
-
-Service Description -
-Client proxy -

- - - <%#FormatBindingName(DataBinder.Eval(Container.DataItem, "Name").ToString())%> - - - op=<%#GetOpName(Container.DataItem)%>&bnd=<%#DataBinder.Eval(Container.DataItem, "Binding.Name")%>"><%#GetOpName(Container.DataItem)%> -
-
-
-
-
-
- -
- -<% if (CurrentPage == "main") {%> - - - -

Web Service Overview

- <%=WebServiceDescription%> -

- <% if (ProfileViolations != null && ProfileViolations.Count > 0) { %> -

Basic Profile Conformance

- This web service does not conform to WS-I Basic Profile v1.1 - <% - Response.Write ("
    "); - foreach (BasicProfileViolation vio in ProfileViolations) { - Response.Write ("
  • " + vio.NormativeStatement + ": " + vio.Details); - Response.Write ("
      "); - foreach (string ele in vio.Elements) - Response.Write ("
    • " + ele + "
    • "); - Response.Write ("
    "); - Response.Write ("
  • "); - } - Response.Write ("
"); - }%> - -<%} if (DefaultBinding == null) {%> -This service does not contain any public web method. -<%} else if (CurrentPage == "op") {%> - - - - <%=CurrentOperationName%> -

- <% WriteTabs (); %> -


- - <% if (CurrentTab == "main") { %> - Input Parameters -
- <% if (InParams.Count == 0) { %> - No input parameters
- <% } else { %> - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
- <% } %> -
- - <% if (OutParams.Count > 0) { %> - Output Parameters -
- - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%><%#DataBinder.Eval(Container.DataItem, "Type")%>
-
- <% } %> - - Remarks -
- <%=OperationDocumentation%> -

- Technical information -
- Format: <%=CurrentOperationFormat%> -
Supported protocols: <%=CurrentOperationProtocols%> - <% } %> - - - - <% if (CurrentTab == "test") { - if (CurrentOperationSupportsTest) {%> - Enter values for the parameters and click the 'Invoke' button to test this method:

-
- - - - - - - - - - - - - - - -
<%#DataBinder.Eval(Container.DataItem, "Name")%>: ">
 
-
-
"> - The web service returned the following result:

-
-
- -
- <% } else {%> - The test form is not available for this operation because it has parameters with a complex structure. - <% } %> - <% } %> - - - - <% if (CurrentTab == "msg") { %> - - The following are sample SOAP requests and responses for each protocol supported by this method: -

- - <% if (IsOperationSupported ("Soap")) { %> - Soap -

-
<%=GenerateOperationMessages ("Soap", true)%>
-
-
<%=GenerateOperationMessages ("Soap", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpGet")) { %> - HTTP Get -

-
<%=GenerateOperationMessages ("HttpGet", true)%>
-
-
<%=GenerateOperationMessages ("HttpGet", false)%>
-
- <% } %> - <% if (IsOperationSupported ("HttpPost")) { %> - HTTP Post -

-
<%=GenerateOperationMessages ("HttpPost", true)%>
-
-
<%=GenerateOperationMessages ("HttpPost", false)%>
-
- <% } %> - - <% } %> -<%} else if (CurrentPage == "proxy") {%> - -
- Select the language for which you want to generate a proxy -   - -    -
-
- <%=CurrentProxytName%>    - Download -

-
-
<%=GetProxyCode ()%>
-
-<%} else if (CurrentPage == "wsdl") {%> - - <% if (descriptions.Count > 1 || schemas.Count > 1) {%> - The description of this web service is composed by several documents. Click on the document you want to see: - - - - <%} else {%> - <%}%> -
- <%=CurrentDocumentName%>    - Download -

-
-
<%=GenerateDocument ()%>
-
- -<%}%> - -














-
- - diff --git a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.5/machine.config b/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.5/machine.config deleted file mode 100644 index 455709536..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.5/machine.config +++ /dev/null @@ -1,310 +0,0 @@ - - - - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
- - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
- -
- - - -
- -
-
-
-
- - - - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
-
-
-
-
-
-
- - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.5/settings.map b/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.5/settings.map deleted file mode 100644 index 4c53aca67..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.5/settings.map +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.5/web.config b/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.5/web.config deleted file mode 100644 index 324c529f0..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/etc/mono/4.5/web.config +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Windows/Binaries/Mono/etc/mono/browscap.ini b/Source/Platforms/Windows/Binaries/Mono/etc/mono/browscap.ini deleted file mode 100644 index 1267e1deb..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/etc/mono/browscap.ini +++ /dev/null @@ -1,16979 +0,0 @@ -;;; Provided courtesy of http://browsers.garykeith.com -;;; Created on Wednesday, June 17, 2009 at 6:30 AM GMT - -[GJK_Browscap_Version] -Version=4476 -Released=Wed, 17 Jun 2009 06:30:21 -0000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DefaultProperties - -[DefaultProperties] -Browser=DefaultProperties -Version=0 -MajorVer=0 -MinorVer=0 -Platform=unknown -Alpha=false -Beta=false -Win16=false -Win32=false -Win64=false -Frames=false -IFrames=false -Tables=false -Cookies=false -BackgroundSounds=false -CDF=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -isBanned=false -isMobileDevice=false -isSyndicationReader=false -Crawler=false -CssVersion=0 -supportsCSS=false -AOL=false -aolVersion=0 -ECMAScriptVersion=0.0 -W3CDOMVersion=0.0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ask - -[Ask] -Parent=DefaultProperties -Browser=Ask -Frames=true -Tables=true -Crawler=true - -[Mozilla/?.0 (compatible; Ask Jeeves/Teoma*)] -Parent=Ask -Browser=Teoma - -[Mozilla/2.0 (compatible; Ask Jeeves)] -Parent=Ask -Browser=AskJeeves - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Baidu - -[Baidu] -Parent=DefaultProperties -Browser=Baidu -Frames=true -Tables=true -Crawler=true - -[BaiduImageSpider*] -Parent=Baidu -Browser=BaiduImageSpider - -[Baiduspider*] -Parent=Baidu -Browser=BaiDu - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google - -[Google] -Parent=DefaultProperties -Browser=Google -Frames=true -IFrames=true -Tables=true -JavaScript=true -Crawler=true - -[* (compatible; Googlebot-Mobile/2.1; *http://www.google.com/bot.html)] -Parent=Google -Browser=Googlebot-Mobile -Frames=false -IFrames=false -Tables=false - -[*Google Wireless Transcoder*] -Parent=Google -Browser=Google Wireless Transcoder - -[AdsBot-Google (?http://www.google.com/adsbot.html)] -Parent=Google -Browser=AdsBot-Google - -[Feedfetcher-Google-iGoogleGadgets;*] -Parent=Google -Browser=iGoogleGadgets -isBanned=true -isSyndicationReader=true - -[Feedfetcher-Google;*] -Parent=Google -Browser=Feedfetcher-Google -isBanned=true -isSyndicationReader=true - -[Google OpenSocial agent (http://www.google.com/feedfetcher.html)] -Parent=Google -Browser=Google OpenSocial - -[Google-Site-Verification/1.0] -Parent=Google -Browser=Google-Site-Verification - -[Google-Sitemaps/*] -Parent=Google -Browser=Google-Sitemaps - -[Googlebot-Image/*] -Parent=Google -Browser=Googlebot-Image -CDF=true - -[googlebot-urlconsole] -Parent=Google -Browser=googlebot-urlconsole - -[Googlebot-Video/1.0] -Parent=Google -Browser=Google-Video - -[Googlebot/2.1 (?http://www.google.com/bot.html)] -Parent=Google -Browser=Googlebot - -[Googlebot/2.1 (?http://www.googlebot.com/bot.html)] -Parent=Google -Browser=Googlebot - -[Googlebot/Test*] -Parent=Google -Browser=Googlebot/Test - -[gsa-crawler*] -Parent=Google -Browser=Google Search Appliance -isBanned=true - -[Mediapartners-Google*] -Parent=Google -Browser=Mediapartners-Google - -[Mozilla/4.0 (compatible; Google Desktop)] -Parent=Google -Browser=Google Desktop - -[Mozilla/4.0 (compatible; GoogleToolbar*)] -Parent=Google -Browser=Google Toolbar -isBanned=true - -[Mozilla/5.0 (compatible; Google Keyword Tool;*)] -Parent=Google -Browser=Google Keyword Tool - -[Mozilla/5.0 (compatible; Googlebot/2.1; ?http://www.google.com/bot.html)] -Parent=Google -Browser=Google Webmaster Tools - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Inktomi - -[Inktomi] -Parent=DefaultProperties -Browser=Inktomi -Frames=true -Tables=true -Crawler=true - -[* (compatible;YahooSeeker/M1A1-R2D2; *)] -Parent=Inktomi -Browser=YahooSeeker-Mobile -Frames=false -Tables=false - -[Mozilla/4.0] -Parent=Inktomi - -[Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)] -Parent=Inktomi -Win32=true - -[Mozilla/4.0 (compatible; Yahoo Japan; for robot study; kasugiya)] -Parent=Inktomi -Browser=Yahoo! RobotStudy -isBanned=true - -[Mozilla/5.0 (compatible; BMC/1.0 (Y!J-AGENT))] -Parent=Inktomi -Browser=Y!J-AGENT/BMC - -[Mozilla/5.0 (compatible; BMF/1.0 (Y!J-AGENT))] -Parent=Inktomi -Browser=Y!J-AGENT/BMF - -[Mozilla/5.0 (compatible; BMI/1.0 (Y!J-AGENT; 1.0))] -Parent=Inktomi -Browser=Y!J-AGENT/BMI - -[Mozilla/5.0 (compatible; Yahoo! DE Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Directory Engine - -[Mozilla/5.0 (compatible; Yahoo! Slurp China; http://misc.yahoo.com.cn/help.html)] -Parent=Inktomi -Browser=Yahoo! Slurp China - -[Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Slurp -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)] -Parent=Inktomi -Browser=Yahoo! Slurp - -[Mozilla/5.0 (compatible; Yahoo! Verifier/1.1)] -Parent=Inktomi -Browser=Yahoo! Verifier -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Slurp/cat; slurp@inktomi.com; http://www.inktomi.com/slurp.html)] -Parent=Inktomi -Browser=Slurp/cat - -[Mozilla/5.0 (Slurp/si; slurp@inktomi.com; http://www.inktomi.com/slurp.html)] -Parent=Inktomi - -[Mozilla/5.0 (Yahoo-MMCrawler/4.0; mailto:vertical-crawl-support@yahoo-inc.com)] -Parent=Inktomi -Browser=Yahoo-MMCrawler -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Scooter/*] -Parent=Inktomi -Browser=Scooter - -[Scooter/3.3Y!CrawlX] -Parent=Inktomi -Browser=Scooter/3.3Y!CrawlX -Version=3.3 -MajorVer=3 -MinorVer=3 - -[slurp] -Parent=Inktomi -Browser=slurp - -[Y!J-BSC/1.0*] -Parent=Inktomi -Browser=Y!J-BSC -Version=1.0 -MajorVer=1 -MinorVer=0 -isBanned=true - -[Y!J-SRD/1.0] -Parent=Inktomi -Browser=Y!J-SRD -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Yahoo Mindset] -Parent=Inktomi -Browser=Yahoo Mindset - -[Yahoo Pipes*] -Parent=Inktomi -Browser=Yahoo Pipes - -[Yahoo! Mindset] -Parent=Inktomi -Browser=Yahoo! Mindset - -[Yahoo! Slurp/Site Explorer] -Parent=Inktomi -Browser=Yahoo! Site Explorer - -[Yahoo-Blogs/*] -Parent=Inktomi -Browser=Yahoo-Blogs - -[Yahoo-MMAudVid*] -Parent=Inktomi -Browser=Yahoo-MMAudVid - -[Yahoo-MMCrawler*] -Parent=Inktomi -Browser=Yahoo-MMCrawler -isBanned=true - -[YahooFeedSeeker*] -Parent=Inktomi -Browser=YahooFeedSeeker -isSyndicationReader=true -Crawler=false - -[YahooSeeker/*] -Parent=Inktomi -Browser=YahooSeeker -isMobileDevice=true - -[YahooSeeker/CafeKelsa (compatible; Konqueror/3.2; FreeBSD*) (KHTML, like Gecko)] -Parent=Inktomi -Browser=YahooSeeker/CafeKelsa - -[YahooSeeker/CafeKelsa-dev (compatible; Konqueror/3.2; FreeBSD*) (KHTML, like Gecko)] -Parent=Inktomi - -[YahooVideoSearch*] -Parent=Inktomi -Browser=YahooVideoSearch - -[YahooYSMcm*] -Parent=Inktomi -Browser=YahooYSMcm - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN - -[MSN] -Parent=DefaultProperties -Browser=MSN -Frames=true -Tables=true -Crawler=true - -[adidxbot/1.1 (?http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=adidxbot - -[librabot/1.0 (*)] -Parent=MSN -Browser=librabot - -[llssbot/1.0] -Parent=MSN -Browser=llssbot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MSMOBOT/1.1*] -Parent=MSN -Browser=msnbot-mobile -Version=1.1 -MajorVer=1 -MinorVer=1 - -[MSNBot-Academic/1.0*] -Parent=MSN -Browser=MSNBot-Academic -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot-media/1.0*] -Parent=MSN -Browser=msnbot-media -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot-media/1.1*] -Parent=MSN -Browser=msnbot-media -Version=1.1 -MajorVer=1 -MinorVer=1 - -[MSNBot-News/1.0*] -Parent=MSN -Browser=MSNBot-News -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MSNBot-NewsBlogs/1.0*] -Parent=MSN -Browser=MSNBot-NewsBlogs -Version=1 -MajorVer=1 -MinorVer=0 - -[msnbot-products] -Parent=MSN -Browser=msnbot-products - -[msnbot-webmaster/1.0 (*http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=msnbot-webmaster tools - -[msnbot/1.0*] -Parent=MSN -Browser=msnbot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[msnbot/1.1*] -Parent=MSN -Browser=msnbot -Version=1.1 -MajorVer=1 -MinorVer=1 - -[msnbot/2.0b*] -Parent=MSN -Version=2.0 -MajorVer=2 -MinorVer=0 -Beta=true - -[MSR-ISRCCrawler] -Parent=MSN -Browser=MSR-ISRCCrawler - -[renlifangbot/1.0 (?http://search.msn.com/msnbot.htm)] -Parent=MSN -Browser=renlifangbot - -[T-Mobile Dash Mozilla/4.0 (*) MSNBOT-MOBILE/1.1 (*)] -Parent=MSN -Browser=msnbot-mobile - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yahoo - -[Yahoo] -Parent=DefaultProperties -Browser=Yahoo -Frames=true -Tables=true -Crawler=true - -[Mozilla/4.0 (compatible; Y!J; for robot study*)] -Parent=Yahoo -Browser=Y!J - -[Mozilla/5.0 (Yahoo-Test/4.0*)] -Parent=Yahoo -Browser=Yahoo-Test -Version=4.0 -MajorVer=4 -MinorVer=0 - -[mp3Spider cn-search-devel at yahoo-inc dot com] -Parent=Yahoo -Browser=Yahoo! Media -isBanned=true - -[My Browser] -Parent=Yahoo -Browser=Yahoo! My Browser - -[Y!OASIS/*] -Parent=Yahoo -Browser=Y!OASIS -isBanned=true - -[YahooYSMcm/2.0.0] -Parent=Yahoo -Browser=YahooYSMcm -Version=2.0 -MajorVer=2 -MinorVer=0 -isBanned=true - -[YRL_ODP_CRAWLER] -Parent=Yahoo -Browser=YRL_ODP_CRAWLER -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Yandex - -[Yandex] -Parent=DefaultProperties -Browser=Yandex -Frames=true -IFrames=true -Tables=true -Cookies=true -Crawler=true - -[Mozilla/4.0 (compatible; MSIE 5.0; YANDEX)] -Parent=Yandex - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9) Gecko VisualParser/3.0] -Parent=Yandex -Browser=VisualParser -isBanned=true - -[YaDirectBot/*] -Parent=Yandex -Browser=YaDirectBot - -[Yandex/*] -Parent=Yandex - -[YandexBlog/*] -Parent=Yandex -Browser=YandexBlog -isSyndicationReader=true - -[YandexSomething/*] -Parent=Yandex -Browser=YandexSomething -isSyndicationReader=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Best of the Web - -[Best of the Web] -Parent=DefaultProperties -Browser=Best of the Web -Frames=true -Tables=true - -[Mozilla/4.0 (compatible; BOTW Feed Grabber; *http://botw.org)] -Parent=Best of the Web -Browser=BOTW Feed Grabber -isSyndicationReader=true -Crawler=false - -[Mozilla/4.0 (compatible; BOTW Spider; *http://botw.org)] -Parent=Best of the Web -Browser=BOTW Spider -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Boitho - -[Boitho] -Parent=DefaultProperties -Browser=Boitho -Frames=true -Tables=true -Crawler=true - -[boitho.com-dc/*] -Parent=Boitho -Browser=boitho.com-dc - -[boitho.com-robot/*] -Parent=Boitho -Browser=boitho.com-robot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Convera - -[Convera] -Parent=DefaultProperties -Browser=Convera -Frames=true -Tables=true -Crawler=true - -[ConveraCrawler/*] -Parent=Convera -Browser=ConveraCrawler - -[ConveraMultiMediaCrawler/0.1*] -Parent=Convera -Browser=ConveraMultiMediaCrawler -Version=0.1 -MajorVer=0 -MinorVer=1 - -[CrawlConvera*] -Parent=Convera -Browser=CrawlConvera - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DotBot - -[DotBot] -Parent=DefaultProperties -Browser=DotBot -Frames=true -Tables=true -isBanned=true -Crawler=true - -[DotBot/* (http://www.dotnetdotcom.org/*)] -Parent=DotBot - -[Mozilla/5.0 (compatible; DotBot/*; http://www.dotnetdotcom.org/*)] -Parent=DotBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Entireweb - -[Entireweb] -Parent=DefaultProperties -Browser=Entireweb -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[Mozilla/4.0 (compatible; SpeedySpider; www.entireweb.com)] -Parent=Entireweb - -[Speedy Spider (*Beta/*)] -Parent=Entireweb - -[Speedy?Spider?(http://www.entireweb.com*)] -Parent=Entireweb - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Envolk - -[Envolk] -Parent=DefaultProperties -Browser=Envolk -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[envolk/* (?http://www.envolk.com/envolk*)] -Parent=Envolk - -[envolk?ITS?spider/* (?http://www.envolk.com/envolk*)] -Parent=Envolk - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Exalead - -[Exalead] -Parent=DefaultProperties -Browser=Exalead -Frames=true -Tables=true -isBanned=true -Crawler=true - -[Exabot-Images/1.0] -Parent=Exalead -Browser=Exabot-Images -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Exabot-Test/*] -Parent=Exalead -Browser=Exabot-Test - -[Exabot/2.0] -Parent=Exalead -Browser=Exabot - -[Exabot/3.0] -Parent=Exalead -Browser=Exabot -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Liberate - -[Exalead NG/*] -Parent=Exalead -Browser=Exalead NG -isBanned=true - -[Mozilla/5.0 (compatible; Exabot-Images/3.0;*)] -Parent=Exalead -Browser=Exabot-Images - -[Mozilla/5.0 (compatible; Exabot/3.0 (BiggerBetter/tests);*)] -Parent=Exalead -Browser=Exabot/BiggerBetter/tests - -[Mozilla/5.0 (compatible; Exabot/3.0;*)] -Parent=Exalead -Browser=Exabot -isBanned=false - -[Mozilla/5.0 (compatible; NGBot/*)] -Parent=Exalead - -[ng/*] -Parent=Exalead -Browser=Exalead Previewer -Version=1.0 -MajorVer=1 -MinorVer=0 -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fast/AllTheWeb - -[Fast/AllTheWeb] -Parent=DefaultProperties -Browser=Fast/AllTheWeb -Alpha=true -Beta=true -Win16=true -Win32=true -Win64=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -isBanned=true -isMobileDevice=true -isSyndicationReader=true -Crawler=true - -[*FAST Enterprise Crawler*] -Parent=Fast/AllTheWeb -Browser=FAST Enterprise Crawler - -[FAST Data Search Document Retriever/4.0*] -Parent=Fast/AllTheWeb -Browser=FAST Data Search Document Retriever - -[FAST MetaWeb Crawler (helpdesk at fastsearch dot com)] -Parent=Fast/AllTheWeb -Browser=FAST MetaWeb Crawler - -[Fast PartnerSite Crawler*] -Parent=Fast/AllTheWeb -Browser=FAST PartnerSite - -[FAST-WebCrawler/*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler - -[FAST-WebCrawler/*/FirstPage*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/FirstPage - -[FAST-WebCrawler/*/Fresh*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/Fresh - -[FAST-WebCrawler/*/PartnerSite*] -Parent=Fast/AllTheWeb -Browser=FAST PartnerSite - -[FAST-WebCrawler/*?Multimedia*] -Parent=Fast/AllTheWeb -Browser=FAST-WebCrawler/Multimedia - -[FastSearch Web Crawler for*] -Parent=Fast/AllTheWeb -Browser=FastSearch Web Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Gigabot - -[Gigabot] -Parent=DefaultProperties -Browser=Gigabot -Frames=true -IFrames=true -Tables=true -Crawler=true - -[Gigabot*] -Parent=Gigabot - -[GigabotSiteSearch/*] -Parent=Gigabot -Browser=GigabotSiteSearch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Ilse - -[Ilse] -Parent=DefaultProperties -Browser=Ilse -Frames=true -Tables=true -Crawler=true - -[IlseBot/*] -Parent=Ilse - -[INGRID/?.0*] -Parent=Ilse -Browser=Ilse - -[Mozilla/3.0 (INGRID/*] -Parent=Ilse -Browser=Ilse - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iVia Project - -[iVia Project] -Parent=DefaultProperties -Browser=iVia Project -Frames=true -IFrames=true -Tables=true -Crawler=true - -[DataFountains/DMOZ Downloader*] -Parent=iVia Project -Browser=DataFountains/DMOZ Downloader -isBanned=true - -[DataFountains/DMOZ Feature Vector Corpus Creator*] -Parent=iVia Project -Browser=DataFountains/DMOZ Feature Vector Corpus - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Jayde Online - -[Jayde Online] -Parent=DefaultProperties -Browser=Jayde Online -Frames=true -Tables=true -Crawler=true - -[ExactSeek Crawler/*] -Parent=Jayde Online -Browser=ExactSeek Crawler - -[exactseek-pagereaper-* (crawler@exactseek.com)] -Parent=Jayde Online -Browser=exactseek-pagereaper -isBanned=true - -[exactseek.com] -Parent=Jayde Online -Browser=exactseek.com - -[Jayde Crawler*] -Parent=Jayde Online -Browser=Jayde Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycos - -[Lycos] -Parent=DefaultProperties -Browser=Lycos -Frames=true -Tables=true -Crawler=true - -[Lycos*] -Parent=Lycos -Browser=Lycos - -[Lycos-Proxy] -Parent=Lycos -Browser=Lycos-Proxy - -[Lycos-Spider_(modspider)] -Parent=Lycos -Browser=Lycos-Spider_(modspider) - -[Lycos-Spider_(T-Rex)] -Parent=Lycos -Browser=Lycos-Spider_(T-Rex) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Naver - -[Naver] -Parent=DefaultProperties -Browser=Naver -isBanned=true -Crawler=true - -[Cowbot-* (NHN Corp*naver.com)] -Parent=Naver -Browser=Naver Cowbot - -[Mozilla/4.0 (compatible; NaverBot/*; *)] -Parent=Naver - -[Mozilla/4.0 (compatible; NaverBot/*; nhnbot@naver.com)] -Parent=Naver -Browser=Naver NaverBot - -[NaverBot-* (NHN Corp*naver.com)] -Parent=Naver -Browser=Naver NHN Corp - -[Yeti/*] -Parent=Naver -Browser=Yeti - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Snap - -[Snap] -Parent=DefaultProperties -Browser=Snap -isBanned=true -Crawler=true - -[Mozilla/5.0 (SnapPreviewBot) Gecko/* Firefox/*] -Parent=Snap - -[Snapbot/*] -Parent=Snap - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sogou - -[Sogou] -Parent=DefaultProperties -Browser=Sogou -Frames=true -Tables=true -isBanned=true -Crawler=true - -[shaboyi spider] -Parent=Sogou -Browser=Sogou/Shaboyi Spider - -[Sogou develop spider/*] -Parent=Sogou -Browser=Sogou Develop Spider - -[Sogou head spider*] -Parent=Sogou -Browser=Sogou/HEAD Spider - -[sogou js robot(*)] -Parent=Sogou - -[Sogou Orion spider/*] -Parent=Sogou -Browser=Sogou Orion spider - -[Sogou Pic Agent] -Parent=Sogou -Browser=Sogou/Image Crawler - -[Sogou Pic Spider] -Parent=Sogou -Browser=Sogou Pic Spider - -[Sogou Push Spider/*] -Parent=Sogou -Browser=Sogou Push Spider - -[sogou spider] -Parent=Sogou -Browser=Sogou/Spider - -[sogou web spider*] -Parent=Sogou -Browser=sogou web spider - -[Sogou-Test-Spider/*] -Parent=Sogou -Browser=Sogou-Test-Spider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; YodaoBot - -[YodaoBot] -Parent=DefaultProperties -Browser=YodaoBot -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[Mozilla/5.0 (compatible; YodaoBot/1.*)] -Parent=YodaoBot - -[Mozilla/5.0 (compatible;YodaoBot-Image/1.*)] -Parent=YodaoBot -Browser=YodaoBot-Image - -[WAP_Browser/5.0 (compatible; YodaoBot/1.*)] -Parent=YodaoBot - -[YodaoBot/1.* (*)] -Parent=YodaoBot - -[Best Whois (http://www.bestwhois.net/)] -Parent=DNS Tools -Browser=Best Whois - -[DNSGroup/*] -Parent=DNS Tools -Browser=DNS Group Crawler - -[NG-Search/*] -Parent=Exalead -Browser=NG-SearchBot - -[TouchStone] -Parent=Feeds Syndicators -Browser=TouchStone -isSyndicationReader=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; General Crawlers - -[General Crawlers] -Parent=DefaultProperties -Browser=General Crawlers -Crawler=true - -[A .NET Web Crawler] -Parent=General Crawlers -isBanned=true - -[BabalooSpider/1.*] -Parent=General Crawlers -Browser=BabalooSpider - -[BilgiBot/*] -Parent=General Crawlers -Browser=BilgiBot -isBanned=true - -[bot/* (bot; *bot@bot.bot)] -Parent=General Crawlers -Browser=bot -isBanned=true - -[CyberPatrol*] -Parent=General Crawlers -Browser=CyberPatrol -isBanned=true - -[Cynthia 1.0] -Parent=General Crawlers -Browser=Cynthia -Version=1.0 -MajorVer=1 -MinorVer=0 - -[ddetailsbot (http://www.displaydetails.com)] -Parent=General Crawlers -Browser=ddetailsbot - -[DomainCrawler/1.0 (info@domaincrawler.com; http://www.domaincrawler.com/domains/view/*)] -Parent=General Crawlers -Browser=DomainCrawler - -[DomainsBotBot/1.*] -Parent=General Crawlers -Browser=DomainsBotBot -isBanned=true - -[DomainsDB.net MetaCrawler*] -Parent=General Crawlers -Browser=DomainsDB - -[Drupal (*)] -Parent=General Crawlers -Browser=Drupal - -[Dumbot (version *)*] -Parent=General Crawlers -Browser=Dumbfind - -[EuripBot/*] -Parent=General Crawlers -Browser=Europe Internet Portal - -[eventax/*] -Parent=General Crawlers -Browser=eventax - -[FANGCrawl/*] -Parent=General Crawlers -Browser=Safe-t.net Web Filtering Service -isBanned=true - -[favorstarbot/*] -Parent=General Crawlers -Browser=favorstarbot -isBanned=true - -[FollowSite.com (*)] -Parent=General Crawlers -Browser=FollowSite -isBanned=true - -[Gaisbot*] -Parent=General Crawlers -Browser=Gaisbot - -[Healthbot/Health_and_Longevity_Project_(HealthHaven.com) ] -Parent=General Crawlers -Browser=Healthbot -isBanned=true - -[hitcrawler_0.*] -Parent=General Crawlers -Browser=hitcrawler -isBanned=true - -[htdig/*] -Parent=General Crawlers -Browser=ht://Dig - -[http://hilfe.acont.de/bot.html ACONTBOT] -Parent=General Crawlers -Browser=ACONTBOT -isBanned=true - -[JetBrains*] -Parent=General Crawlers -Browser=Omea Pro - -[KakleBot - www.kakle.com/0.1] -Parent=General Crawlers -Browser=KakleBot - -[KBeeBot/0.*] -Parent=General Crawlers -Browser=KBeeBot -isBanned=true - -[Keyword Density/*] -Parent=General Crawlers -Browser=Keyword Density - -[LetsCrawl.com/1.0*] -Parent=General Crawlers -Browser=LetsCrawl.com -isBanned=true - -[Lincoln State Web Browser] -Parent=General Crawlers -Browser=Lincoln State Web Browser -isBanned=true - -[Links4US-Crawler,*] -Parent=General Crawlers -Browser=Links4US-Crawler -isBanned=true - -[Lorkyll *.* -- lorkyll@444.net] -Parent=General Crawlers -Browser=Lorkyll -isBanned=true - -[Lsearch/sondeur] -Parent=General Crawlers -Browser=Lsearch/sondeur -isBanned=true - -[LucidMedia ClickSense/4.?] -Parent=General Crawlers -Browser=LucidMedia-ClickSense -isBanned=true - -[MapoftheInternet.com?(?http://MapoftheInternet.com)] -Parent=General Crawlers -Browser=MapoftheInternet -isBanned=true - -[Marvin v0.3] -Parent=General Crawlers -Browser=MedHunt -Version=0.3 -MajorVer=0 -MinorVer=3 - -[masidani_bot_v0.6*] -Parent=General Crawlers -Browser=masidani_bot - -[Metaspinner/0.01 (Metaspinner; http://www.meta-spinner.de/; support@meta-spinner.de/)] -Parent=General Crawlers -Browser=Metaspinner/0.01 -Version=0.01 -MajorVer=0 -MinorVer=01 - -[metatagsdir/*] -Parent=General Crawlers -Browser=metatagsdir -isBanned=true - -[Microsoft Windows Network Diagnostics] -Parent=General Crawlers -Browser=Microsoft Windows Network Diagnostics -isBanned=true - -[Miva (AlgoFeedback@miva.com)] -Parent=General Crawlers -Browser=Miva - -[moget/*] -Parent=General Crawlers -Browser=Goo - -[Mozdex/0.7.2*] -Parent=General Crawlers -Browser=Mozdex - -[Mozilla Compatible (MS IE 3.01 WinNT)] -Parent=General Crawlers -isBanned=true - -[Mozilla/* (compatible; WebCapture*)] -Parent=General Crawlers -Browser=WebCapture - -[Mozilla/4.0 (compatible; DepSpid/*)] -Parent=General Crawlers -Browser=DepSpid - -[Mozilla/4.0 (compatible; MSIE *; Windows NT *; SV1)] -Parent=General Crawlers -Browser=AVG - -[Mozilla/4.0 (compatible; MSIE 4.01; Vonna.com b o t)] -Parent=General Crawlers -Browser=Vonna.com -isBanned=true - -[Mozilla/4.0 (compatible; MSIE 4.01; Windows95)] -Parent=General Crawlers -Win32=true - -[Mozilla/4.0 (compatible; MSIE 4.5; Windows 98; )] -Parent=General Crawlers -Win32=true - -[Mozilla/4.0 (compatible; MyFamilyBot/*)] -Parent=General Crawlers -Browser=MyFamilyBot - -[Mozilla/4.0 (compatible; N-Stealth)] -Parent=General Crawlers -Browser=N-Stealth - -[Mozilla/4.0 (compatible; Scumbot/*; Linux/*)] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.0 (compatible; Spider; Linux)] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.0 (compatible; Win32)] -Parent=General Crawlers -Browser=Unknown Crawler -isBanned=true - -[Mozilla/4.1] -Parent=General Crawlers -isBanned=true - -[Mozilla/4.5] -Parent=General Crawlers -isBanned=true - -[Mozilla/5.0 (*http://gnomit.com/) Gecko/* Gnomit/1.0] -Parent=General Crawlers -Browser=Gnomit -isBanned=true - -[Mozilla/5.0 (compatible; AboutUsBot/*)] -Parent=General Crawlers -Browser=AboutUsBot -isBanned=true - -[Mozilla/5.0 (compatible; BuzzRankingBot/*)] -Parent=General Crawlers -Browser=BuzzRankingBot -isBanned=true - -[Mozilla/5.0 (compatible; Diffbot/0.1; http://www.diffbot.com)] -Parent=General Crawlers -Browser=Diffbot - -[Mozilla/5.0 (compatible; FirstSearchBot/1.0; *)] -Parent=General Crawlers -Browser=FirstSearchBot - -[mozilla/5.0 (compatible; genevabot http://www.healthdash.com)] -Parent=General Crawlers -Browser=Healthdash - -[Mozilla/5.0 (compatible; JadynAveBot; *http://www.jadynave.com/robot*] -Parent=General Crawlers -Browser=JadynAveBot -isBanned=true - -[Mozilla/5.0 (compatible; Kyluka crawl; http://www.kyluka.com/crawl.html; crawl@kyluka.com)] -Parent=General Crawlers -Browser=Kyluka - -[Mozilla/5.0 (compatible; MJ12bot/v1.2.*; http://www.majestic12.co.uk/bot.php*)] -Parent=General Crawlers -Browser=MJ12bot -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (compatible; MSIE 7.0 ?http://www.europarchive.org)] -Parent=General Crawlers -Browser=Europe Web Archive - -[Mozilla/5.0 (compatible; Seznam screenshot-generator 2.0;*)] -Parent=General Crawlers -Browser=Seznam screenshot-generator -isBanned=true - -[Mozilla/5.0 (compatible; Twingly Recon; http://www.twingly.com/)] -Parent=General Crawlers -Browser=Twingly Recon - -[Mozilla/5.0 (compatible; unwrapbot/2.*; http://www.unwrap.jp*)] -Parent=General Crawlers -Browser=UnWrap - -[Mozilla/5.0 (compatible; Vermut*)] -Parent=General Crawlers -Browser=Vermut - -[Mozilla/5.0 (compatible; Webbot/*)] -Parent=General Crawlers -Browser=Webbot.ru -isBanned=true - -[n4p_bot*] -Parent=General Crawlers -Browser=n4p_bot - -[nabot*] -Parent=General Crawlers -Browser=Nabot - -[NetCarta_WebMapper/*] -Parent=General Crawlers -Browser=NetCarta_WebMapper -isBanned=true - -[NetID.com Bot*] -Parent=General Crawlers -Browser=NetID.com Bot -isBanned=true - -[neTVision AG andreas.heidoetting@thomson-webcast.net] -Parent=General Crawlers -Browser=neTVision - -[NextopiaBOT*] -Parent=General Crawlers -Browser=NextopiaBOT - -[nicebot] -Parent=General Crawlers -Browser=nicebot -isBanned=true - -[niXXieBot?Foster*] -Parent=General Crawlers -Browser=niXXiebot-Foster - -[Nozilla/P.N (Just for IDS woring)] -Parent=General Crawlers -Browser=Nozilla/P.N -isBanned=true - -[Nudelsalat/*] -Parent=General Crawlers -Browser=Nudelsalat -isBanned=true - -[NV32ts] -Parent=General Crawlers -Browser=NV32ts -isBanned=true - -[Ocelli/*] -Parent=General Crawlers -Browser=Ocelli - -[OpenTaggerBot (http://www.opentagger.com/opentaggerbot.htm)] -Parent=General Crawlers -Browser=OpenTaggerBot - -[Oracle Enterprise Search] -Parent=General Crawlers -Browser=Oracle Enterprise Search -isBanned=true - -[Oracle Ultra Search] -Parent=General Crawlers -Browser=Oracle Ultra Search - -[Pajaczek/*] -Parent=General Crawlers -Browser=Pajaczek -isBanned=true - -[panscient.com] -Parent=General Crawlers -Browser=panscient.com -isBanned=true - -[Patwebbot (http://www.herz-power.de/technik.html)] -Parent=General Crawlers -Browser=Patwebbot - -[PDFBot (crawler@pdfind.com)] -Parent=General Crawlers -Browser=PDFBot - -[Pete-Spider/1.*] -Parent=General Crawlers -Browser=Pete-Spider -isBanned=true - -[PhpDig/*] -Parent=General Crawlers -Browser=PhpDig - -[PlantyNet_WebRobot*] -Parent=General Crawlers -Browser=PlantyNet -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PluckIt - -[PluckItCrawler/1.0 (*)] -Parent=General Crawlers -isMobileDevice=true - -[PMAFind] -Parent=General Crawlers -Browser=PMAFind -isBanned=true - -[Poodle_predictor_1.0] -Parent=General Crawlers -Browser=Poodle Predictor - -[QuickFinder Crawler] -Parent=General Crawlers -Browser=QuickFinder -isBanned=true - -[Radiation Retriever*] -Parent=General Crawlers -Browser=Radiation Retriever -isBanned=true - -[RedCarpet/*] -Parent=General Crawlers -Browser=RedCarpet -isBanned=true - -[RixBot (http://babelserver.org/rix)] -Parent=General Crawlers -Browser=RixBot - -[Rome Client (http://tinyurl.com/64t5n) Ver: 0.*] -Parent=General Crawlers -Browser=TinyURL - -[SBIder/*] -Parent=General Crawlers -Browser=SiteSell - -[ScollSpider/2.*] -Parent=General Crawlers -Browser=ScollSpider -isBanned=true - -[Search Fst] -Parent=General Crawlers -Browser=Search Fst - -[searchbot admin@google.com] -Parent=General Crawlers -Browser=searchbot -isBanned=true - -[Seeker.lookseek.com] -Parent=General Crawlers -Browser=LookSeek -isBanned=true - -[semanticdiscovery/*] -Parent=General Crawlers -Browser=Semantic Discovery - -[SeznamBot/*] -Parent=General Crawlers -Browser=SeznamBot -isBanned=true - -[Shelob (shelob@gmx.net)] -Parent=General Crawlers -Browser=Shelob -isBanned=true - -[shelob v1.*] -Parent=General Crawlers -Browser=shelob -isBanned=true - -[ShopWiki/1.0*] -Parent=General Crawlers -Browser=ShopWiki -Version=1.0 -MajorVer=1 -MinorVer=0 - -[ShowXML/1.0 libwww/5.4.0] -Parent=General Crawlers -Browser=ShowXML -isBanned=true - -[sitecheck.internetseer.com*] -Parent=General Crawlers -Browser=Internetseer - -[SMBot/*] -Parent=General Crawlers -Browser=SMBot - -[sohu*] -Parent=General Crawlers -Browser=sohu-search -isBanned=true - -[SpankBot*] -Parent=General Crawlers -Browser=SpankBot -isBanned=true - -[spider (tspyyp@tom.com)] -Parent=General Crawlers -Browser=spider (tspyyp@tom.com) -isBanned=true - -[Sunrise/0.*] -Parent=General Crawlers -Browser=Sunrise -isBanned=true - -[Superpages URL Verification Engine] -Parent=General Crawlers -Browser=Superpages - -[Surf Knight] -Parent=General Crawlers -Browser=Surf Knight -isBanned=true - -[SurveyBot/*] -Parent=General Crawlers -Browser=SurveyBot -isBanned=true - -[SynapticSearch/AI Crawler 1.?] -Parent=General Crawlers -Browser=SynapticSearch -isBanned=true - -[SyncMgr] -Parent=General Crawlers -Browser=SyncMgr - -[Tagyu Agent/1.0] -Parent=General Crawlers -Browser=Tagyu - -[Talkro Web-Shot/*] -Parent=General Crawlers -Browser=Talkro Web-Shot -isBanned=true - -[Tecomi Bot (http://www.tecomi.com/bot.htm)] -Parent=General Crawlers -Browser=Tecomi - -[TheInformant*] -Parent=General Crawlers -Browser=TheInformant -isBanned=true - -[Toata dragostea*] -Parent=General Crawlers -Browser=Toata dragostea -isBanned=true - -[Tutorial Crawler*] -Parent=General Crawlers -isBanned=true - -[UbiCrawler/*] -Parent=General Crawlers -Browser=UbiCrawler - -[UCmore] -Parent=General Crawlers -Browser=UCmore - -[User*Agent:*] -Parent=General Crawlers -isBanned=true - -[USER_AGENT] -Parent=General Crawlers -Browser=USER_AGENT -isBanned=true - -[VadixBot] -Parent=General Crawlers -Browser=VadixBot - -[VengaBot/*] -Parent=General Crawlers -Browser=VengaBot -isBanned=true - -[Visicom Toolbar] -Parent=General Crawlers -Browser=Visicom Toolbar - -[W3C-WebCon/*] -Parent=General Crawlers -Browser=W3C-WebCon - -[Webclipping.com] -Parent=General Crawlers -Browser=Webclipping.com -isBanned=true - -[webcollage/*] -Parent=General Crawlers -Browser=WebCollage -isBanned=true - -[WebCrawler_1.*] -Parent=General Crawlers -Browser=WebCrawler - -[WebFilter Robot*] -Parent=General Crawlers -Browser=WebFilter Robot - -[WeBoX/*] -Parent=General Crawlers -Browser=WeBoX - -[WebTrends/*] -Parent=General Crawlers -Browser=WebTrends - -[West Wind Internet Protocols*] -Parent=General Crawlers -Browser=Versatel -isBanned=true - -[WhizBang] -Parent=General Crawlers -Browser=WhizBang - -[Willow Internet Crawler by Twotrees V*] -Parent=General Crawlers -Browser=Willow Internet Crawler - -[WIRE/* (Linux; i686; Bot,Robot,Spider,Crawler)] -Parent=General Crawlers -Browser=WIRE -isBanned=true - -[www.fi crawler, contact crawler@www.fi] -Parent=General Crawlers -Browser=www.fi crawler - -[Xerka WebBot v1.*] -Parent=General Crawlers -Browser=Xerka -isBanned=true - -[XML Sitemaps Generator*] -Parent=General Crawlers -Browser=XML Sitemaps Generator - -[XSpider*] -Parent=General Crawlers -Browser=XSpider -isBanned=true - -[YooW!/* (?http://www.yoow.eu)] -Parent=General Crawlers -Browser=YooW! -isBanned=true - -[HiddenMarket-*] -Parent=General RSS -Browser=HiddenMarket -isBanned=true - -[FOTOCHECKER] -Parent=Image Crawlers -Browser=FOTOCHECKER -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Search Engines - -[Search Engines] -Parent=DefaultProperties -Browser=Search Engines -Crawler=true - -[*FDSE robot*] -Parent=Search Engines -Browser=FDSE Robot - -[*Fluffy the spider*] -Parent=Search Engines -Browser=SearchHippo - -[Abacho*] -Parent=Search Engines -Browser=Abacho - -[ah-ha.com crawler (crawler@ah-ha.com)] -Parent=Search Engines -Browser=Ah-Ha - -[AIBOT/*] -Parent=Search Engines -Browser=21Seek.Com - -[ALeadSoftbot/*] -Parent=Search Engines -Browser=ALeadSoftbot - -[Amfibibot/*] -Parent=Search Engines -Browser=Amfibi - -[AnswerBus (http://www.answerbus.com/)] -Parent=Search Engines - -[antibot-V*] -Parent=Search Engines -Browser=antibot - -[appie*(www.walhello.com)] -Parent=Search Engines -Browser=Walhello - -[ASPSeek/*] -Parent=Search Engines -Browser=ASPSeek - -[BigCliqueBOT/*] -Parent=Search Engines -Browser=BigClique.com/BigClic.com - -[Blaiz-Bee/*] -Parent=Search Engines -Browser=RawGrunt - -[btbot/*] -Parent=Search Engines -Browser=Bit Torrent Search Engine - -[Busiversebot/v1.0 (http://www.busiverse.com/bot.php)] -Parent=Search Engines -Browser=Busiversebot -isBanned=true - -[CatchBot/*; http://www.catchbot.com] -Parent=Search Engines -Browser=CatchBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[CipinetBot (http://www.cipinet.com/bot.html)] -Parent=Search Engines -Browser=CipinetBot - -[Cogentbot/1.?*] -Parent=Search Engines -Browser=Cogentbot - -[compatible; Mozilla 4.0; MSIE 5.5; (SqwidgeBot v1.01 - http://www.sqwidge.com/bot/)] -Parent=Search Engines -Browser=SqwidgeBot - -[cosmos*] -Parent=Search Engines -Browser=Xyleme - -[Deepindex] -Parent=Search Engines -Browser=Deepindex - -[DiamondBot] -Parent=Search Engines -Browser=DiamondBot - -[Dumbot*] -Parent=Search Engines -Browser=Dumbot -Version=0.2 -MajorVer=0 -MinorVer=2 -Beta=true - -[Eule?Robot*] -Parent=Search Engines -Browser=Eule-Robot - -[Faxobot/*] -Parent=Search Engines -Browser=Faxo - -[Filangy/*] -Parent=Search Engines -Browser=Filangy - -[flatlandbot/*] -Parent=Search Engines -Browser=Flatland - -[Fooky.com/ScorpionBot/ScoutOut;*] -Parent=Search Engines -Browser=ScorpionBot -isBanned=true - -[FyberSpider*] -Parent=Search Engines -Browser=FyberSpider -isBanned=true - -[Gaisbot/*] -Parent=Search Engines -Browser=Gaisbot - -[gazz/*(gazz@nttr.co.jp)] -Parent=Search Engines -Browser=gazz - -[geniebot*] -Parent=Search Engines -Browser=GenieKnows - -[GOFORITBOT (?http://www.goforit.com/about/?)] -Parent=Search Engines -Browser=GoForIt - -[GoGuidesBot/*] -Parent=Search Engines -Browser=GoGuidesBot - -[GroschoBot/*] -Parent=Search Engines -Browser=GroschoBot - -[GurujiBot/1.*] -Parent=Search Engines -Browser=GurujiBot -isBanned=true - -[HenryTheMiragoRobot*] -Parent=Search Engines -Browser=Mirago - -[HolmesBot (http://holmes.ge)] -Parent=Search Engines -Browser=HolmesBot - -[Hotzonu/*] -Parent=Search Engines -Browser=Hotzonu - -[HyperEstraier/*] -Parent=Search Engines -Browser=HyperEstraier -isBanned=true - -[i1searchbot/*] -Parent=Search Engines -Browser=i1searchbot - -[IIITBOT/1.*] -Parent=Search Engines -Browser=Indian Language Web Search Engine - -[Iltrovatore-?etaccio/*] -Parent=Search Engines -Browser=Iltrovatore-Setaccio - -[InfociousBot (?http://corp.infocious.com/tech_crawler.php)] -Parent=Search Engines -Browser=InfociousBot -isBanned=true - -[Infoseek SideWinder/*] -Parent=Search Engines -Browser=Infoseek - -[iSEEKbot/*] -Parent=Search Engines -Browser=iSEEKbot - -[Knight/0.? (Zook Knight; http://knight.zook.in/; knight@zook.in)] -Parent=Search Engines -Browser=Knight - -[Kolinka Forum Search (www.kolinka.com)] -Parent=Search Engines -Browser=Kolinka Forum Search -isBanned=true - -[KRetrieve/] -Parent=Search Engines -Browser=KRetrieve -isBanned=true - -[LapozzBot/*] -Parent=Search Engines -Browser=LapozzBot - -[Linknzbot*] -Parent=Search Engines -Browser=Linknzbot - -[LocalcomBot/*] -Parent=Search Engines -Browser=LocalcomBot - -[Mail.Ru/1.0] -Parent=Search Engines -Browser=Mail.Ru - -[MaSagool/*] -Parent=Search Engines -Browser=Sagoo -Version=1.0 -MajorVer=1 -MinorVer=0 - -[miniRank/*] -Parent=Search Engines -Browser=miniRank - -[Mnogosearch*] -Parent=Search Engines -Browser=Mnogosearch - -[Mozilla/0.9* no dos :) (Linux)] -Parent=Search Engines -Browser=goliat -isBanned=true - -[Mozilla/4.0 (compatible; Arachmo)] -Parent=Search Engines -Browser=Arachmo - -[Mozilla/4.0 (compatible; http://search.thunderstone.com/texis/websearch/about.html)] -Parent=Search Engines -Browser=ThunderStone -isBanned=true - -[Mozilla/4.0 (compatible; MSIE *; Windows NT; Girafabot; girafabot at girafa dot com; http://www.girafa.com)] -Parent=Search Engines -Browser=Girafabot -Win32=true - -[Mozilla/4.0 (compatible; Vagabondo/*; webcrawler at wise-guys dot nl; *)] -Parent=Search Engines -Browser=Vagabondo - -[Mozilla/4.0(?compatible; MSIE 6.0; Qihoo *)] -Parent=Search Engines -Browser=Qihoo - -[Mozilla/4.7 (compatible; WhizBang; http://www.whizbang.com/crawler)] -Parent=Search Engines -Browser=Inxight Software - -[Mozilla/5.0 (*) VoilaBot*] -Parent=Search Engines -Browser=VoilaBot -isBanned=true - -[Mozilla/5.0 (compatible; ActiveTouristBot*; http://www.activetourist.com)] -Parent=Search Engines -Browser=ActiveTouristBot - -[Mozilla/5.0 (compatible; Butterfly/1.0; *)*] -Parent=Search Engines -Browser=Butterfly - -[Mozilla/5.0 (compatible; Charlotte/*; *)] -Parent=Search Engines -Browser=Charlotte -Beta=true -isBanned=true - -[Mozilla/5.0 (compatible; CXL-FatAssANT*)] -Parent=Search Engines -Browser=FatAssANT - -[Mozilla/5.0 (compatible; DBLBot/1.0; ?http://www.dontbuylists.com/)] -Parent=Search Engines -Browser=DBLBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (compatible; EARTHCOM.info/*)] -Parent=Search Engines -Browser=EARTHCOM - -[Mozilla/5.0 (compatible; Lipperhey Spider; http://www.lipperhey.com/)] -Parent=Search Engines -Browser=Lipperhey Spider - -[Mozilla/5.0 (compatible; MojeekBot/*; http://www.mojeek.com/bot.html)] -Parent=Search Engines -Browser=MojeekBot - -[Mozilla/5.0 (compatible; NLCrawler/*] -Parent=Search Engines -Browser=Northern Light Web Search - -[Mozilla/5.0 (compatible; OsO;*] -Parent=Search Engines -Browser=Octopodus -isBanned=true - -[Mozilla/5.0 (compatible; Pogodak.*)] -Parent=Search Engines -Browser=Pogodak - -[Mozilla/5.0 (compatible; Quantcastbot/1.*)] -Parent=Search Engines -Browser=Quantcastbot - -[Mozilla/5.0 (compatible; ScoutJet; *http://www.scoutjet.com/)] -Parent=Search Engines -Browser=ScoutJet - -[Mozilla/5.0 (compatible; Scrubby/*; http://www.scrubtheweb.com/abs/meta-check.html)] -Parent=Search Engines -Browser=Scrubby -isBanned=true - -[Mozilla/5.0 (compatible; YoudaoBot/1.*; http://www.youdao.com/help/webmaster/spider/*)] -Parent=Search Engines -Browser=YoudaoBot -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Twiceler*)] -Parent=Search Engines -Browser=Twiceler -isBanned=true - -[Mozilla/5.0 CostaCider Search*] -Parent=Search Engines -Browser=CostaCider Search - -[Mozilla/5.0 GurujiBot/1.0 (*)] -Parent=Search Engines -Browser=GurujiBot - -[NavissoBot] -Parent=Search Engines -Browser=NavissoBot - -[NextGenSearchBot*(for information visit *)] -Parent=Search Engines -Browser=ZoomInfo -isBanned=true - -[Norbert the Spider(Burf.com)] -Parent=Search Engines -Browser=Norbert the Spider - -[NuSearch Spider*] -Parent=Search Engines -Browser=nuSearch - -[ObjectsSearch/*] -Parent=Search Engines -Browser=ObjectsSearch - -[OpenISearch/1.*] -Parent=Search Engines -Browser=OpenISearch (Amazon) - -[Pagebull http://www.pagebull.com/] -Parent=Search Engines -Browser=Pagebull - -[PEERbot*] -Parent=Search Engines -Browser=PEERbot - -[Pompos/*] -Parent=Search Engines -Browser=Pompos - -[Popdexter/*] -Parent=Search Engines -Browser=Popdex - -[Qweery*] -Parent=Search Engines -Browser=QweeryBot - -[RedCell/* (*)] -Parent=Search Engines -Browser=RedCell - -[Scrubby/*] -Parent=Search Engines -Browser=Scrub The Web - -[Search-10/*] -Parent=Search Engines -Browser=Search-10 - -[search.ch*] -Parent=Search Engines -Browser=Swiss Search Engine - -[Searchmee! Spider*] -Parent=Search Engines -Browser=Searchmee! - -[Seekbot/*] -Parent=Search Engines -Browser=Seekbot - -[SiteSpider (http://www.SiteSpider.com/)] -Parent=Search Engines -Browser=SiteSpider - -[Spinne/*] -Parent=Search Engines -Browser=Spinne - -[sproose/*] -Parent=Search Engines -Browser=Sproose - -[Sqeobot/0.*] -Parent=Search Engines -Browser=Branzel -isBanned=true - -[SquigglebotBot/*] -Parent=Search Engines -Browser=SquigglebotBot -isBanned=true - -[StackRambler/*] -Parent=Search Engines -Browser=StackRambler - -[SygolBot*] -Parent=Search Engines -Browser=SygolBot - -[SynoBot] -Parent=Search Engines -Browser=SynoBot - -[Szukacz/*] -Parent=Search Engines -Browser=Szukacz - -[Tarantula/*] -Parent=Search Engines -Browser=Tarantula -isBanned=true - -[TerrawizBot/*] -Parent=Search Engines -Browser=TerrawizBot -isBanned=true - -[Tkensaku/*] -Parent=Search Engines -Browser=Tkensaku - -[TMCrawler] -Parent=Search Engines -Browser=TMCrawler -isBanned=true - -[Twingly Recon] -Parent=Search Engines -Browser=Twingly Recon -isBanned=true - -[updated/*] -Parent=Search Engines -Browser=Updated! - -[URL Spider Pro/*] -Parent=Search Engines -Browser=URL Spider Pro - -[URL Spider SQL*] -Parent=Search Engines -Browser=Innerprise Enterprise Search - -[VMBot/*] -Parent=Search Engines -Browser=VMBot - -[voyager/2.0 (http://www.kosmix.com/html/crawler.html)] -Parent=Search Engines -Browser=Voyager - -[wadaino.jp-crawler*] -Parent=Search Engines -Browser=wadaino.jp -isBanned=true - -[WebAlta Crawler/*] -Parent=Search Engines -Browser=WebAlta Crawler -isBanned=true - -[WebCorp/*] -Parent=Search Engines -Browser=WebCorp -isBanned=true - -[webcrawl.net] -Parent=Search Engines -Browser=webcrawl.net - -[WISEbot/*] -Parent=Search Engines -Browser=WISEbot -isBanned=true - -[Wotbox/*] -Parent=Search Engines -Browser=Wotbox - -[www.zatka.com] -Parent=Search Engines -Browser=Zatka - -[WWWeasel Robot v*] -Parent=Search Engines -Browser=World Wide Weasel - -[YadowsCrawler*] -Parent=Search Engines -Browser=YadowsCrawler - -[YodaoBot/*] -Parent=Search Engines -Browser=YodaoBot -isBanned=true - -[ZeBot_www.ze.bz*] -Parent=Search Engines -Browser=ZE.bz - -[zibber-v*] -Parent=Search Engines -Browser=Zibb - -[ZipppBot/*] -Parent=Search Engines -Browser=ZipppBot - -[ATA-Translation-Service] -Parent=Translators -Browser=ATA-Translation-Service - -[GJK_Browser_Check] -Parent=Version Checkers -Browser=GJK_Browser_Check - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Hatena - -[Hatena] -Parent=DefaultProperties -Browser=Hatena -isBanned=true -Crawler=true - -[Feed::Find/*] -Parent=Hatena -Browser=Feed Find -isSyndicationReader=true - -[Hatena Antenna/*] -Parent=Hatena -Browser=Hatena Antenna - -[Hatena Bookmark/*] -Parent=Hatena -Browser=Hatena Bookmark - -[Hatena RSS/*] -Parent=Hatena -Browser=Hatena RSS -isSyndicationReader=true - -[Hatena::Crawler/*] -Parent=Hatena -Browser=Hatena Crawler - -[HatenaScreenshot*] -Parent=Hatena -Browser=HatenaScreenshot - -[URI::Fetch/*] -Parent=Hatena -Browser=URI::Fetch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Internet Archive - -[Internet Archive] -Parent=DefaultProperties -Browser=Internet Archive -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*heritrix*] -Parent=Internet Archive -Browser=Heritrix -isBanned=true - -[ia_archiver*] -Parent=Internet Archive -Browser=Internet Archive - -[InternetArchive/*] -Parent=Internet Archive -Browser=InternetArchive - -[Mozilla/5.0 (compatible; archive.org_bot/1.*)] -Parent=Internet Archive - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nutch - -[Nutch] -Parent=DefaultProperties -Browser=Nutch -isBanned=true -Crawler=true - -[*Nutch*] -Parent=Nutch -isBanned=true - -[CazoodleBot/*] -Parent=Nutch -Browser=CazoodleBot - -[LOOQ/0.1*] -Parent=Nutch -Browser=LOOQ - -[Nutch/0.? (OpenX Spider)] -Parent=Nutch - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Webaroo - -[Webaroo] -Parent=DefaultProperties -Browser=Webaroo - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Webaroo/*)] -Parent=Webaroo -Browser=Webaroo - -[Mozilla/5.0 (Windows; U; Windows *; *; rv:*) Gecko/* Firefox/* webaroo/*] -Parent=Webaroo -Browser=Webaroo - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Word Press - -[Word Press] -Parent=DefaultProperties -Browser=Word Press -Alpha=true -Beta=true -Win16=true -Win32=true -Win64=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -isBanned=true -isMobileDevice=true -isSyndicationReader=true -Crawler=true - -[WordPress-B-/2.*] -Parent=Word Press -Browser=WordPress-B - -[WordPress-Do-P-/2.*] -Parent=Word Press -Browser=WordPress-Do-P - -[BlueCoat ProxySG] -Parent=Blue Coat Systems -Browser=BlueCoat ProxySG - -[CerberianDrtrs/*] -Parent=Blue Coat Systems -Browser=Cerberian - -[Inne: Mozilla/4.0 (compatible; Cerberian Drtrs*)] -Parent=Blue Coat Systems -Browser=Cerberian - -[Mozilla/4.0 (compatible; Cerberian Drtrs*)] -Parent=Blue Coat Systems -Browser=Cerberian - -[Mozilla/4.0 (compatible; MSIE 6.0; Bluecoat DRTR)] -Parent=Blue Coat Systems -Browser=Bluecoat - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Copyright/Plagiarism - -[Copyright/Plagiarism] -Parent=DefaultProperties -Browser=Copyright/Plagiarism -isBanned=true -Crawler=true - -[BDFetch] -Parent=Copyright/Plagiarism -Browser=BDFetch - -[copyright sheriff (*)] -Parent=Copyright/Plagiarism -Browser=copyright sheriff - -[CopyRightCheck*] -Parent=Copyright/Plagiarism -Browser=CopyRightCheck - -[FairAd Client*] -Parent=Copyright/Plagiarism -Browser=FairAd Client - -[iCopyright Conductor*] -Parent=Copyright/Plagiarism -Browser=iCopyright Conductor - -[IPiumBot laurion(dot)com] -Parent=Copyright/Plagiarism -Browser=IPiumBot - -[IWAgent/*] -Parent=Copyright/Plagiarism -Browser=Brand Protect - -[Mozilla/5.0 (compatible; DKIMRepBot/*)] -Parent=Copyright/Plagiarism -Browser=DKIMRepBot - -[oBot] -Parent=Copyright/Plagiarism -Browser=oBot - -[SlySearch/*] -Parent=Copyright/Plagiarism -Browser=SlySearch - -[TurnitinBot/*] -Parent=Copyright/Plagiarism -Browser=TurnitinBot - -[TutorGigBot/*] -Parent=Copyright/Plagiarism -Browser=TutorGig - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DNS Tools - -[DNS Tools] -Parent=DefaultProperties -Browser=DNS Tools -Crawler=true - -[Domain Dossier utility*] -Parent=DNS Tools -Browser=Domain Dossier - -[Mozilla/5.0 (compatible; DNS-Digger/*)] -Parent=DNS Tools -Browser=DNS-Digger - -[OpenDNS Domain Crawler noc@opendns.com] -Parent=DNS Tools -Browser=OpenDNS Domain Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Download Managers - -[Download Managers] -Parent=DefaultProperties -Browser=Download Managers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[AndroidDownloadManager] -Parent=Download Managers -Browser=Android Download Manager - -[AutoMate5] -Parent=Download Managers -Browser=AutoMate5 - -[Beamer*] -Parent=Download Managers -Browser=Beamer - -[BitBeamer/*] -Parent=Download Managers -Browser=BitBeamer - -[BitTorrent/*] -Parent=Download Managers -Browser=BitTorrent - -[DA *] -Parent=Download Managers -Browser=Download Accelerator - -[Download Demon*] -Parent=Download Managers -Browser=Download Demon - -[Download Express*] -Parent=Download Managers -Browser=Download Express - -[Download Master*] -Parent=Download Managers -Browser=Download Master - -[Download Ninja*] -Parent=Download Managers -Browser=Download Ninja - -[Download Wonder*] -Parent=Download Managers -Browser=Download Wonder - -[DownloadSession*] -Parent=Download Managers -Browser=DownloadSession - -[EasyDL/*] -Parent=Download Managers -Browser=EasyDL - -[FDM 1.x] -Parent=Download Managers -Browser=Free Download Manager - -[FlashGet] -Parent=Download Managers -Browser=FlashGet - -[FreshDownload/*] -Parent=Download Managers -Browser=FreshDownload - -[GetRight/*] -Parent=Download Managers -Browser=GetRight - -[GetRightPro/*] -Parent=Download Managers -Browser=GetRightPro - -[GetSmart/*] -Parent=Download Managers -Browser=GetSmart - -[Go!Zilla*] -Parent=Download Managers -Browser=GoZilla - -[Gozilla/*] -Parent=Download Managers -Browser=Gozilla - -[Internet Ninja*] -Parent=Download Managers -Browser=Internet Ninja - -[Kontiki Client*] -Parent=Download Managers -Browser=Kontiki Client - -[lftp/3.2.1] -Parent=Download Managers -Browser=lftp - -[LightningDownload/*] -Parent=Download Managers -Browser=LightningDownload - -[LMQueueBot/*] -Parent=Download Managers -Browser=LMQueueBot - -[MetaProducts Download Express/*] -Parent=Download Managers -Browser=Download Express - -[Mozilla/4.0 (compatible; Getleft*)] -Parent=Download Managers -Browser=Getleft - -[Myzilla] -Parent=Download Managers -Browser=Myzilla - -[Net Vampire/*] -Parent=Download Managers -Browser=Net Vampire - -[Net_Vampire*] -Parent=Download Managers -Browser=Net_Vampire - -[NetAnts*] -Parent=Download Managers -Browser=NetAnts - -[NetPumper*] -Parent=Download Managers -Browser=NetPumper - -[NetSucker*] -Parent=Download Managers -Browser=NetSucker - -[NetZip Downloader*] -Parent=Download Managers -Browser=NetZip Downloader - -[NexTools WebAgent*] -Parent=Download Managers -Browser=NexTools WebAgent - -[Offline Downloader*] -Parent=Download Managers -Browser=Offline Downloader - -[P3P Client] -Parent=Download Managers -Browser=P3P Client - -[PageDown*] -Parent=Download Managers -Browser=PageDown - -[PicaLoader*] -Parent=Download Managers -Browser=PicaLoader - -[Prozilla*] -Parent=Download Managers -Browser=Prozilla - -[RealDownload/*] -Parent=Download Managers -Browser=RealDownload - -[sEasyDL/*] -Parent=Download Managers -Browser=EasyDL - -[shareaza*] -Parent=Download Managers -Browser=shareaza - -[SmartDownload/*] -Parent=Download Managers -Browser=SmartDownload - -[SpeedDownload/*] -Parent=Download Managers -Browser=Speed Download - -[Star*Downloader/*] -Parent=Download Managers -Browser=StarDownloader - -[STEROID Download] -Parent=Download Managers -Browser=STEROID Download - -[SuperBot/*] -Parent=Download Managers -Browser=SuperBot - -[Vegas95/*] -Parent=Download Managers -Browser=Vegas95 - -[WebZIP*] -Parent=Download Managers -Browser=WebZIP - -[Wget*] -Parent=Download Managers -Browser=Wget - -[WinTools] -Parent=Download Managers -Browser=WinTools - -[Xaldon WebSpider*] -Parent=Download Managers -Browser=Xaldon WebSpider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; E-Mail Harvesters - -[E-Mail Harvesters] -Parent=DefaultProperties -Browser=E-Mail Harvesters -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*E-Mail Address Extractor*] -Parent=E-Mail Harvesters -Browser=E-Mail Address Extractor - -[*Larbin*] -Parent=E-Mail Harvesters -Browser=Larbin - -[*www4mail/*] -Parent=E-Mail Harvesters -Browser=www4mail - -[8484 Boston Project*] -Parent=E-Mail Harvesters -Browser=8484 Boston Project - -[CherryPicker*/*] -Parent=E-Mail Harvesters -Browser=CherryPickerElite - -[Chilkat/*] -Parent=E-Mail Harvesters -Browser=Chilkat - -[ContactBot/*] -Parent=E-Mail Harvesters -Browser=ContactBot - -[eCatch*] -Parent=E-Mail Harvesters -Browser=eCatch - -[EmailCollector*] -Parent=E-Mail Harvesters -Browser=E-Mail Collector - -[EMAILsearcher] -Parent=E-Mail Harvesters -Browser=EMAILsearcher - -[EmailSiphon*] -Parent=E-Mail Harvesters -Browser=E-Mail Siphon - -[EmailWolf*] -Parent=E-Mail Harvesters -Browser=EMailWolf - -[Epsilon SoftWorks' MailMunky] -Parent=E-Mail Harvesters -Browser=MailMunky - -[ExtractorPro*] -Parent=E-Mail Harvesters -Browser=ExtractorPro - -[Franklin Locator*] -Parent=E-Mail Harvesters -Browser=Franklin Locator - -[Missigua Locator*] -Parent=E-Mail Harvesters -Browser=Missigua Locator - -[Mozilla/4.0 (compatible; Advanced Email Extractor*)] -Parent=E-Mail Harvesters -Browser=Advanced Email Extractor - -[Netprospector*] -Parent=E-Mail Harvesters -Browser=Netprospector - -[ProWebWalker*] -Parent=E-Mail Harvesters -Browser=ProWebWalker - -[sna-0.0.*] -Parent=E-Mail Harvesters -Browser=Mike Elliott's E-Mail Harvester - -[WebEnhancer*] -Parent=E-Mail Harvesters -Browser=WebEnhancer - -[WebMiner*] -Parent=E-Mail Harvesters -Browser=WebMiner - -[ZIBB Crawler (email address / WWW address)] -Parent=E-Mail Harvesters -Browser=ZIBB Crawler - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Feeds Blogs - -[Feeds Blogs] -Parent=DefaultProperties -Browser=Feeds Blogs -isSyndicationReader=true -Crawler=true - -[Bloglines Title Fetch/*] -Parent=Feeds Blogs -Browser=Bloglines Title Fetch - -[Bloglines/* (http://www.bloglines.com*)] -Parent=Feeds Blogs -Browser=BlogLines Web - -[BlogPulseLive (support@blogpulse.com)] -Parent=Feeds Blogs -Browser=BlogPulseLive - -[blogsearchbot-pumpkin-2] -Parent=Feeds Blogs -Browser=blogsearchbot-pumpkin -isSyndicationReader=false - -[Irish Blogs Aggregator/*1.0*] -Parent=Feeds Blogs -Browser=Irish Blogs Aggregator -Version=1.0 -MajorVer=1 -MinorVer=0 - -[kinjabot (http://www.kinja.com; *)] -Parent=Feeds Blogs -Browser=kinjabot - -[Net::Trackback/*] -Parent=Feeds Blogs -Browser=Net::Trackback - -[Reblog*] -Parent=Feeds Blogs -Browser=Reblog - -[WordPress/*] -Parent=Feeds Blogs -Browser=WordPress - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Feeds Syndicators - -[Feeds Syndicators] -Parent=DefaultProperties -Browser=Feeds Syndicators -isSyndicationReader=true - -[*LinkLint*] -Parent=Feeds Syndicators -Browser=LinkLint - -[*NetNewsWire/*] -Parent=Feeds Syndicators - -[*NetVisualize*] -Parent=Feeds Syndicators -Browser=NetVisualize - -[AideRSS 2.* (postrank.com)] -Parent=Feeds Syndicators -Browser=AideRSS - -[AideRSS/2.0 (aiderss.com)] -Parent=Feeds Syndicators -Browser=AideRSS -isBanned=true - -[Akregator/*] -Parent=Feeds Syndicators -Browser=Akregator - -[AppleSyndication/*] -Parent=Feeds Syndicators -Browser=Safari RSS -Platform=MacOSX - -[Cocoal.icio.us/* (*)*] -Parent=Feeds Syndicators -Browser=Cocoal.icio.us -isBanned=true - -[Feed43 Proxy/* (*)] -Parent=Feeds Syndicators -Browser=Feed For Free - -[FeedBurner/*] -Parent=Feeds Syndicators -Browser=FeedBurner - -[FeedDemon/* (*)] -Parent=Feeds Syndicators -Browser=FeedDemon -Platform=Win32 - -[FeedDigest/* (*)] -Parent=Feeds Syndicators -Browser=FeedDigest - -[FeedGhost/1.*] -Parent=Feeds Syndicators -Browser=FeedGhost -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedOnFeeds/0.1.* ( http://minutillo.com/steve/feedonfeeds/)] -Parent=Feeds Syndicators -Browser=FeedOnFeeds -Version=0.1 -MajorVer=0 -MinorVer=1 - -[Feedreader * (Powered by Newsbrain)] -Parent=Feeds Syndicators -Browser=Newsbrain - -[Feedshow/* (*)] -Parent=Feeds Syndicators -Browser=Feedshow - -[Feedster Crawler/?.0; Feedster, Inc.] -Parent=Feeds Syndicators -Browser=Feedster - -[GreatNews/1.0] -Parent=Feeds Syndicators -Browser=GreatNews -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Gregarius/*] -Parent=Feeds Syndicators -Browser=Gregarius - -[intraVnews/*] -Parent=Feeds Syndicators -Browser=intraVnews - -[JetBrains Omea Reader*] -Parent=Feeds Syndicators -Browser=Omea Reader -isBanned=true - -[Liferea/1.5* (Linux; *; http://liferea.sf.net/)] -Parent=Feeds Syndicators -Browser=Liferea -isBanned=true - -[livedoor FeedFetcher/0.0* (http://reader.livedoor.com/;*)] -Parent=Feeds Syndicators -Browser=FeedFetcher -Version=0.0 -MajorVer=0 -MinorVer=0 - -[MagpieRSS/* (*)] -Parent=Feeds Syndicators -Browser=MagpieRSS - -[Mobitype * (compatible; Mozilla/*; MSIE *.*; Windows *)] -Parent=Feeds Syndicators -Browser=Mobitype -Platform=Win32 - -[Mozilla/5.0 (*; Rojo *; http://www.rojo.com/corporate/help/agg; *)*] -Parent=Feeds Syndicators -Browser=Rojo - -[Mozilla/5.0 (*aggregator:TailRank; http://tailrank.com/robot)*] -Parent=Feeds Syndicators -Browser=TailRank - -[Mozilla/5.0 (compatible; MSIE 6.0; Podtech Network; crawler_admin@podtech.net)] -Parent=Feeds Syndicators -Browser=Podtech Network - -[Mozilla/5.0 (compatible; Newz Crawler *; http://www.newzcrawler.com/?)] -Parent=Feeds Syndicators -Browser=Newz Crawler - -[Mozilla/5.0 (compatible; RSSMicro.com RSS/Atom Feed Robot)] -Parent=Feeds Syndicators -Browser=RSSMicro - -[Mozilla/5.0 (compatible;*newstin.com;*)] -Parent=Feeds Syndicators -Browser=NewsTin - -[Mozilla/5.0 (RSS Reader Panel)] -Parent=Feeds Syndicators -Browser=RSS Reader Panel - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:FeedParser; *) Gecko/*] -Parent=Feeds Syndicators -Browser=FeedParser - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:NewsMonster; *) Gecko/*] -Parent=Feeds Syndicators -Browser=NewsMonster - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.*; aggregator:Rojo; *) Gecko/*] -Parent=Feeds Syndicators -Browser=Rojo - -[Netvibes (*)] -Parent=Feeds Syndicators -Browser=Netvibes - -[NewsAlloy/* (*)] -Parent=Feeds Syndicators -Browser=NewsAlloy - -[Omnipelagos*] -Parent=Feeds Syndicators -Browser=Omnipelagos - -[Particls] -Parent=Feeds Syndicators -Browser=Particls - -[Protopage/* (*)] -Parent=Feeds Syndicators -Browser=Protopage - -[PubSub-RSS-Reader/* (*)] -Parent=Feeds Syndicators -Browser=PubSub-RSS-Reader - -[RSS Menu/*] -Parent=Feeds Syndicators -Browser=RSS Menu - -[RssBandit/*] -Parent=Feeds Syndicators -Browser=RssBandit - -[RssBar/1.2*] -Parent=Feeds Syndicators -Browser=RssBar -Version=1.2 -MajorVer=1 -MinorVer=2 - -[SharpReader/*] -Parent=Feeds Syndicators -Browser=SharpReader - -[SimplePie/*] -Parent=Feeds Syndicators -Browser=SimplePie - -[Strategic Board Bot (?http://www.strategicboard.com)] -Parent=Feeds Syndicators -Browser=Strategic Board Bot -isBanned=true - -[TargetYourNews.com bot] -Parent=Feeds Syndicators -Browser=TargetYourNews - -[Technoratibot/*] -Parent=Feeds Syndicators -Browser=Technoratibot - -[Tumblr/* RSS syndication ( http://www.tumblr.com/) (support@tumblr.com)] -Parent=Feeds Syndicators -Browser=Tumblr RSS syndication - -[Windows-RSS-Platform/1.0*] -Parent=Feeds Syndicators -Browser=Windows-RSS-Platform -Version=1.0 -MajorVer=1 -MinorVer=0 -Win32=true - -[Wizz RSS News Reader] -Parent=Feeds Syndicators -Browser=Wizz - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; General RSS - -[General RSS] -Parent=DefaultProperties -Browser=General RSS -isSyndicationReader=true - -[AideRSS/1.0 (aiderss.com); * subscribers] -Parent=General RSS -Browser=AideRSS -Version=1.0 -MajorVer=1 -MinorVer=0 - -[CC Metadata Scaper http://wiki.creativecommons.org/Metadata_Scraper] -Parent=General RSS -Browser=CC Metadata Scaper - -[Mozilla/5.0 (compatible) GM RSS Panel] -Parent=General RSS -Browser=RSS Panel - -[Mozilla/5.0 http://www.inclue.com; graeme@inclue.com] -Parent=General RSS -Browser=Inclue - -[Runnk online rss reader : http://www.runnk.com/ : RSS favorites : RSS ranking : RSS aggregator*] -Parent=General RSS -Browser=Ruunk - -[Windows-RSS-Platform/2.0 (MSIE 8.0; Windows NT 6.0)] -Parent=General RSS -Browser=Windows-RSS-Platform -Platform=WinVista - -[Mozilla/5.0 (X11; ?; Linux; *) AppleWebKit/* (KHTML, like Gecko, Safari/*) Arora/0.4] -Parent=Google Code -Browser=Arora -Version=0.4 -MajorVer=0 -MinorVer=4 -Platform=Linux -CssVersion=2 -supportsCSS=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Validation Checkers - -[HTML Validators] -Parent=DefaultProperties -Browser=HTML Validators -Frames=true -IFrames=true -Tables=true -Crawler=true - -[(HTML Validator http://www.searchengineworld.com/validator/)] -Parent=HTML Validators -Browser=Search Engine World HTML Validator - -[FeedValidator/1.3] -Parent=HTML Validators -Browser=FeedValidator -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Jigsaw/* W3C_CSS_Validator_JFouffa/*] -Parent=HTML Validators -Browser=Jigsaw CSS Validator - -[Search Engine World Robots.txt Validator*] -Parent=HTML Validators -Browser=Search Engine World Robots.txt Validator - -[W3C_Validator/*] -Parent=HTML Validators -Browser=W3C Validator - -[W3CLineMode/*] -Parent=HTML Validators -Browser=W3C Line Mode - -[Weblide/2.? beta*] -Parent=HTML Validators -Browser=Weblide -Version=2.0 -MajorVer=2 -MinorVer=0 -Beta=true - -[WebmasterWorld StickyMail Server Header Checker*] -Parent=HTML Validators -Browser=WebmasterWorld Server Header Checker - -[WWWC/*] -Parent=HTML Validators - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Image Crawlers - -[Image Crawlers] -Parent=DefaultProperties -Browser=Image Crawlers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*CFNetwork*] -Parent=Image Crawlers -Browser=CFNetwork - -[*PhotoStickies/*] -Parent=Image Crawlers -Browser=PhotoStickies - -[Camcrawler*] -Parent=Image Crawlers -Browser=Camcrawler - -[CydralSpider/*] -Parent=Image Crawlers -Browser=Cydral Web Image Search -isBanned=true - -[Der gro\xdfe BilderSauger*] -Parent=Image Crawlers -Browser=Gallery Grabber - -[Extreme Picture Finder] -Parent=Image Crawlers -Browser=Extreme Picture Finder - -[FLATARTS_FAVICO] -Parent=Image Crawlers -Browser=FlatArts Favorites Icon Tool - -[HTML2JPG Blackbox, http://www.html2jpg.com] -Parent=Image Crawlers -Browser=HTML2JPG - -[IconSurf/2.*] -Parent=Image Crawlers -Browser=IconSurf - -[kalooga/KaloogaBot*] -Parent=Image Crawlers -Browser=KaloogaBot - -[Mister PIX*] -Parent=Image Crawlers -Browser=Mister PIX - -[Mozilla/5.0 (Macintosh; U; *Mac OS X; *) AppleWebKit/* (*) Pandora/2.*] -Parent=Image Crawlers -Browser=Pandora - -[naoFavicon4IE*] -Parent=Image Crawlers -Browser=naoFavicon4IE - -[pixfinder/*] -Parent=Image Crawlers -Browser=pixfinder - -[rssImagesBot/0.1 (*http://herbert.groot.jebbink.nl/?app=rssImages)] -Parent=Image Crawlers -Browser=rssImagesBot - -[Web Image Collector*] -Parent=Image Crawlers -Browser=Web Image Collector - -[WebImages * (?http://herbert.groot.jebbink.nl/?app=WebImages?)] -Parent=Image Crawlers -Browser=WebImages - -[WebPix*] -Parent=Image Crawlers -Browser=Custo - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Link Checkers - -[Link Checkers] -Parent=DefaultProperties -Browser=Link Checkers -Frames=true -IFrames=true -Tables=true -Crawler=true - -[!Susie (http://www.sync2it.com/susie)] -Parent=Link Checkers -Browser=!Susie - -[*AgentName/*] -Parent=Link Checkers -Browser=AgentName - -[*Linkman*] -Parent=Link Checkers -Browser=Linkman - -[*LinksManager.com*] -Parent=Link Checkers -Browser=LinksManager - -[*Powermarks/*] -Parent=Link Checkers -Browser=Powermarks - -[*W3C-checklink/*] -Parent=Link Checkers -Browser=W3C Link Checker - -[*Web Link Validator*] -Parent=Link Checkers -Browser=Web Link Validator - -[*Zeus*] -Parent=Link Checkers -Browser=Zeus -isBanned=true - -[ActiveBookmark *] -Parent=Link Checkers -Browser=ActiveBookmark - -[Bookdog/*] -Parent=Link Checkers -Browser=Bookdog - -[Bookmark Buddy*] -Parent=Link Checkers -Browser=Bookmark Buddy - -[Bookmark Renewal Check Agent*] -Parent=Link Checkers -Browser=Bookmark Renewal Check Agent - -[Bookmark search tool*] -Parent=Link Checkers -Browser=Bookmark search tool - -[Bookmark-Manager] -Parent=Link Checkers -Browser=Bookmark-Manager - -[Checkbot*] -Parent=Link Checkers -Browser=Checkbot - -[CheckLinks/*] -Parent=Link Checkers -Browser=CheckLinks - -[CyberSpyder Link Test/*] -Parent=Link Checkers -Browser=CyberSpyder Link Test - -[DLC/*] -Parent=Link Checkers -Browser=DLC - -[DocWeb Link Crawler (http://doc.php.net)] -Parent=Link Checkers -Browser=DocWeb Link Crawler - -[FavOrg] -Parent=Link Checkers -Browser=FavOrg - -[Favorites Sweeper v.3.*] -Parent=Link Checkers -Browser=Favorites Sweeper - -[FindLinks/*] -Parent=Link Checkers -Browser=FindLinks - -[Funnel Web Profiler*] -Parent=Link Checkers -Browser=Funnel Web Profiler - -[Html Link Validator (www.lithopssoft.com)] -Parent=Link Checkers -Browser=HTML Link Validator - -[IECheck] -Parent=Link Checkers -Browser=IECheck - -[JCheckLinks/*] -Parent=Link Checkers -Browser=JCheckLinks - -[JRTwine Software Check Favorites Utility] -Parent=Link Checkers -Browser=JRTwine - -[Link Valet Online*] -Parent=Link Checkers -Browser=Link Valet -isBanned=true - -[LinkAlarm/*] -Parent=Link Checkers -Browser=LinkAlarm - -[Linkbot*] -Parent=Link Checkers -Browser=Linkbot - -[LinkChecker/*] -Parent=Link Checkers -Browser=LinkChecker - -[LinkextractorPro*] -Parent=Link Checkers -Browser=LinkextractorPro -isBanned=true - -[LinkLint-checkonly/*] -Parent=Link Checkers -Browser=LinkLint - -[LinkScan/*] -Parent=Link Checkers -Browser=LinkScan - -[LinkSweeper/*] -Parent=Link Checkers -Browser=LinkSweeper - -[LinkWalker*] -Parent=Link Checkers -Browser=LinkWalker - -[MetaGer-LinkChecker] -Parent=Link Checkers -Browser=MetaGer-LinkChecker - -[Mozilla/* (compatible; linktiger/*; *http://www.linktiger.com*)] -Parent=Link Checkers -Browser=LinkTiger -isBanned=true - -[Mozilla/4.0 (Compatible); URLBase*] -Parent=Link Checkers -Browser=URLBase - -[Mozilla/4.0 (compatible; Link Utility; http://net-promoter.com)] -Parent=Link Checkers -Browser=NetPromoter Link Utility - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98) Web Link Validator*] -Parent=Link Checkers -Browser=Web Link Validator -Win32=true - -[Mozilla/4.0 (compatible; MSIE 7.0; Win32) Link Commander 3.0] -Parent=Link Checkers -Browser=Link Commander -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Win32 - -[Mozilla/4.0 (compatible; smartBot/1.*; checking links; *)] -Parent=Link Checkers -Browser=smartBot - -[Mozilla/4.0 (compatible; SuperCleaner*;*)] -Parent=Link Checkers -Browser=SuperCleaner - -[Mozilla/5.0 gURLChecker/*] -Parent=Link Checkers -Browser=gURLChecker -isBanned=true - -[Newsgroupreporter LinkCheck] -Parent=Link Checkers -Browser=Newsgroupreporter LinkCheck - -[onCHECK Linkchecker von www.scientec.de fuer www.onsinn.de] -Parent=Link Checkers -Browser=onCHECK Linkchecker - -[online link validator (http://www.dead-links.com/)] -Parent=Link Checkers -Browser=Dead-Links.com -isBanned=true - -[REL Link Checker*] -Parent=Link Checkers -Browser=REL Link Checker - -[RLinkCheker*] -Parent=Link Checkers -Browser=RLinkCheker - -[Robozilla/*] -Parent=Link Checkers -Browser=Robozilla - -[RPT-HTTPClient/*] -Parent=Link Checkers -Browser=RPT-HTTPClient -isBanned=true - -[SafariBookmarkChecker*(?http://www.coriolis.ch/)] -Parent=Link Checkers -Browser=SafariBookmarkChecker -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[Simpy/* (Simpy; http://www.simpy.com/?ref=bot; feedback at simpy dot com)] -Parent=Link Checkers -Browser=Simpy - -[SiteBar/*] -Parent=Link Checkers -Browser=SiteBar - -[Susie (http://www.sync2it.com/bms/susie.php] -Parent=Link Checkers -Browser=Susie - -[URLBase/6.*] -Parent=Link Checkers - -[VSE/*] -Parent=Link Checkers -Browser=VSE Link Tester - -[WebTrends Link Analyzer] -Parent=Link Checkers -Browser=WebTrends Link Analyzer - -[WorQmada/*] -Parent=Link Checkers -Browser=WorQmada - -[Xenu* Link Sleuth*] -Parent=Link Checkers -Browser=Xenu's Link Sleuth -isBanned=true - -[Z-Add Link Checker*] -Parent=Link Checkers -Browser=Z-Add Link Checker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Microsoft - -[Microsoft] -Parent=DefaultProperties -Browser=Microsoft -isBanned=true - -[Live (http://www.live.com/)] -Parent=Microsoft -Browser=Microsoft Live -isBanned=false -isSyndicationReader=true - -[MFC Foundation Class Library*] -Parent=Microsoft -Browser=MFC Foundation Class Library - -[MFHttpScan] -Parent=Microsoft -Browser=MFHttpScan - -[Microsoft BITS/*] -Parent=Microsoft -Browser=BITS - -[Microsoft Data Access Internet Publishing Provider Cache Manager] -Parent=Microsoft -Browser=MS IPP - -[Microsoft Data Access Internet Publishing Provider DAV*] -Parent=Microsoft -Browser=MS IPP DAV - -[Microsoft Data Access Internet Publishing Provider Protocol Discovery] -Parent=Microsoft -Browser=MS IPPPD - -[Microsoft Internet Explorer] -Parent=Microsoft -Browser=Fake IE - -[Microsoft Office Existence Discovery] -Parent=Microsoft -Browser=Microsoft Office Existence Discovery - -[Microsoft Office Protocol Discovery] -Parent=Microsoft -Browser=MS OPD - -[Microsoft Office/* (*Picture Manager*)] -Parent=Microsoft -Browser=Microsoft Office Picture Manager - -[Microsoft URL Control*] -Parent=Microsoft -Browser=Microsoft URL Control - -[Microsoft Visio MSIE] -Parent=Microsoft -Browser=Microsoft Visio - -[Microsoft-WebDAV-MiniRedir/*] -Parent=Microsoft -Browser=Microsoft-WebDAV - -[Mozilla/5.0 (Macintosh; Intel Mac OS X) Excel/12.*] -Parent=Microsoft -Browser=Microsoft Excel -Version=12.0 -MajorVer=12 -MinorVer=0 -Platform=MacOSX - -[MSN Feed Manager] -Parent=Microsoft -Browser=MSN Feed Manager -isBanned=false -isSyndicationReader=true - -[MSProxy/*] -Parent=Microsoft -Browser=MS Proxy - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Miscellaneous Browsers - -[Miscellaneous Browsers] -Parent=DefaultProperties -Browser=Miscellaneous Browsers -Frames=true -Tables=true -Cookies=true - -[*Amiga*] -Parent=Miscellaneous Browsers -Browser=Amiga -Platform=Amiga - -[*avantbrowser*] -Parent=Miscellaneous Browsers -Browser=Avant Browser - -[12345] -Parent=Miscellaneous Browsers -Browser=12345 -isBanned=true - -[Ace Explorer] -Parent=Miscellaneous Browsers -Browser=Ace Explorer - -[Enigma Browser*] -Parent=Miscellaneous Browsers -Browser=Enigma Browser - -[EVE-minibrowser/*] -Parent=Miscellaneous Browsers -Browser=EVE-minibrowser -IFrames=false -Tables=false -BackgroundSounds=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -isBanned=false -Crawler=false - -[Godzilla/* (Basic*; *; Commodore C=64; *; rv:1.*)*] -Parent=Miscellaneous Browsers -Browser=Godzilla - -[GreenBrowser] -Parent=Miscellaneous Browsers -Browser=GreenBrowser -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Kopiczek/* (WyderOS*; *)] -Parent=Miscellaneous Browsers -Browser=Kopiczek -Platform=WyderOS -IFrames=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (*) - BrowseX (*)] -Parent=Miscellaneous Browsers -Browser=BrowseX - -[Mozilla/* (Win32;*Escape?*; ?)] -Parent=Miscellaneous Browsers -Browser=Escape -Platform=Win32 - -[Mozilla/4.0 (compatible; ibisBrowser)] -Parent=Miscellaneous Browsers -Browser=ibisBrowser - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) AppleWebKit/* (*) HistoryHound/*] -Parent=Miscellaneous Browsers -Browser=HistoryHound - -[NetRecorder*] -Parent=Miscellaneous Browsers -Browser=NetRecorder - -[NetSurfer*] -Parent=Miscellaneous Browsers -Browser=NetSurfer - -[ogeb browser , Version 1.1.0] -Parent=Miscellaneous Browsers -Browser=ogeb browser -Version=1.1 -MajorVer=1 -MinorVer=1 - -[SCEJ PSP BROWSER 0102pspNavigator] -Parent=Miscellaneous Browsers -Browser=Wipeout Pure - -[SlimBrowser] -Parent=Miscellaneous Browsers -Browser=SlimBrowser - -[WWW_Browser/*] -Parent=Miscellaneous Browsers -Browser=WWW Browser -Version=1.69 -MajorVer=1 -MinorVer=69 -Platform=Win16 -CssVersion=3 -supportsCSS=true - -[*Netcraft Webserver Survey*] -Parent=Netcraft -Browser=Netcraft Webserver Survey -isBanned=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Offline Browsers - -[Offline Browsers] -Parent=DefaultProperties -Browser=Offline Browsers -Frames=true -Tables=true -Cookies=true -isBanned=true -Crawler=true - -[*Check&Get*] -Parent=Offline Browsers -Browser=Check&Get - -[*HTTrack*] -Parent=Offline Browsers -Browser=HTTrack - -[*MSIECrawler*] -Parent=Offline Browsers -Browser=IE Offline Browser - -[*TweakMASTER*] -Parent=Offline Browsers -Browser=TweakMASTER - -[BackStreet Browser *] -Parent=Offline Browsers -Browser=BackStreet Browser - -[Go-Ahead-Got-It*] -Parent=Offline Browsers -Browser=Go Ahead Got-It - -[iGetter/*] -Parent=Offline Browsers -Browser=iGetter - -[Teleport*] -Parent=Offline Browsers -Browser=Teleport - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Online Scanners - -[Online Scanners] -Parent=DefaultProperties -Browser=Online Scanners -isBanned=true - -[JoeDog/* (X11; I; Siege *)] -Parent=Online Scanners -Browser=JoeDog -isBanned=false - -[Morfeus Fucking Scanner] -Parent=Online Scanners -Browser=Morfeus Fucking Scanner - -[Mozilla/4.0 (compatible; Trend Micro tmdr 1.*] -Parent=Online Scanners -Browser=Trend Micro - -[Titanium 2005 (4.02.01)] -Parent=Online Scanners -Browser=Panda Antivirus Titanium - -[virus_detector*] -Parent=Online Scanners -Browser=Secure Computing Corporation - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Proxy Servers - -[Proxy Servers] -Parent=DefaultProperties -Browser=Proxy Servers -isBanned=true - -[*squid*] -Parent=Proxy Servers -Browser=Squid - -[Anonymisiert*] -Parent=Proxy Servers -Browser=Anonymizied - -[Anonymizer/*] -Parent=Proxy Servers -Browser=Anonymizer - -[Anonymizied*] -Parent=Proxy Servers -Browser=Anonymizied - -[Anonymous*] -Parent=Proxy Servers -Browser=Anonymous - -[Anonymous/*] -Parent=Proxy Servers -Browser=Anonymous - -[CE-Preload] -Parent=Proxy Servers -Browser=CE-Preload - -[http://Anonymouse.org/*] -Parent=Proxy Servers -Browser=Anonymouse - -[IE/6.01 (CP/M; 8-bit*)] -Parent=Proxy Servers -Browser=Squid - -[Mozilla/* (TuringOS; Turing Machine; 0.0)] -Parent=Proxy Servers -Browser=Anonymizer - -[Mozilla/4.0 (compatible; MSIE ?.0; SaferSurf*)] -Parent=Proxy Servers -Browser=SaferSurf - -[Mozilla/5.0 (compatible; del.icio.us-thumbnails/*; *) KHTML/* (like Gecko)] -Parent=Proxy Servers -Browser=Yahoo! -isBanned=true -Crawler=true - -[Nutscrape] -Parent=Proxy Servers -Browser=Squid - -[Nutscrape/* (CP/M; 8-bit*)] -Parent=Proxy Servers -Browser=Squid - -[Privoxy/*] -Parent=Proxy Servers -Browser=Privoxy - -[ProxyTester*] -Parent=Proxy Servers -Browser=ProxyTester -isBanned=true -Crawler=true - -[SilentSurf*] -Parent=Proxy Servers -Browser=SilentSurf - -[SmallProxy*] -Parent=Proxy Servers -Browser=SmallProxy - -[Space*Bison/*] -Parent=Proxy Servers -Browser=Proxomitron - -[Sqworm/*] -Parent=Proxy Servers -Browser=Websense - -[SurfControl] -Parent=Proxy Servers -Browser=SurfControl - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Research Projects - -[Research Projects] -Parent=DefaultProperties -Browser=Research Projects -isBanned=true -Crawler=true - -[*research*] -Parent=Research Projects - -[AcadiaUniversityWebCensusClient] -Parent=Research Projects -Browser=AcadiaUniversityWebCensusClient - -[Amico Alpha * (*) Gecko/* AmicoAlpha/*] -Parent=Research Projects -Browser=Amico Alpha - -[annotate_google; http://ponderer.org/*] -Parent=Research Projects -Browser=Annotate Google - -[CMS crawler (?http://buytaert.net/crawler/)] -Parent=Research Projects - -[e-SocietyRobot(http://www.yama.info.waseda.ac.jp/~yamana/es/)] -Parent=Research Projects -Browser=e-SocietyRobot - -[Forschungsportal/*] -Parent=Research Projects -Browser=Forschungsportal - -[Gulper Web *] -Parent=Research Projects -Browser=Gulper Web Bot - -[HooWWWer/*] -Parent=Research Projects -Browser=HooWWWer - -[http://buytaert.net/crawler] -Parent=Research Projects - -[inetbot/* (?http://www.inetbot.com/bot.html)] -Parent=Research Projects -Browser=inetbot - -[IRLbot/*] -Parent=Research Projects -Browser=IRLbot - -[Lachesis] -Parent=Research Projects -Browser=Lachesis - -[Mozilla/5.0 (compatible; nextthing.org/*)] -Parent=Research Projects -Browser=nextthing.org -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (compatible; Theophrastus/*)] -Parent=Research Projects -Browser=Theophrastus - -[Mozilla/5.0 (compatible; Webscan v0.*; http://otc.dyndns.org/webscan/)] -Parent=Research Projects -Browser=Webscan - -[MQbot*] -Parent=Research Projects -Browser=MQbot - -[OutfoxBot/*] -Parent=Research Projects -Browser=OutfoxBot - -[polybot?*] -Parent=Research Projects -Browser=Polybot - -[Shim?Crawler*] -Parent=Research Projects -Browser=Shim Crawler - -[Steeler/*] -Parent=Research Projects -Browser=Steeler - -[Taiga web spider] -Parent=Research Projects -Browser=Taiga - -[Theme Spider*] -Parent=Research Projects -Browser=Theme Spider - -[UofTDB_experiment* (leehyun@cs.toronto.edu)] -Parent=Research Projects -Browser=UofTDB Experiment - -[USyd-NLP-Spider*] -Parent=Research Projects -Browser=USyd-NLP-Spider - -[woriobot*] -Parent=Research Projects -Browser=woriobot - -[wwwster/* (Beta, mailto:gue@cis.uni-muenchen.de)] -Parent=Research Projects -Browser=wwwster -Beta=true - -[Zao-Crawler] -Parent=Research Projects -Browser=Zao-Crawler - -[Zao/*] -Parent=Research Projects -Browser=Zao - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Rippers - -[Rippers] -Parent=DefaultProperties -Browser=Rippers -Frames=true -IFrames=true -Tables=true -isBanned=true -Crawler=true - -[*grub*] -Parent=Rippers -Browser=grub - -[*ickHTTP*] -Parent=Rippers -Browser=IP*Works - -[*java*] -Parent=Rippers - -[*libwww-perl*] -Parent=Rippers -Browser=libwww-perl - -[*WebGrabber*] -Parent=Rippers - -[*WinHttpRequest*] -Parent=Rippers -Browser=WinHttp - -[3D-FTP/*] -Parent=Rippers -Browser=3D-FTP - -[3wGet/*] -Parent=Rippers -Browser=3wGet - -[ActiveRefresh*] -Parent=Rippers -Browser=ActiveRefresh - -[Artera (Version *)] -Parent=Rippers -Browser=Artera - -[AutoHotkey] -Parent=Rippers -Browser=AutoHotkey - -[b2w/*] -Parent=Rippers -Browser=b2w - -[BasicHTTP/*] -Parent=Rippers -Browser=BasicHTTP - -[BlockNote.Net] -Parent=Rippers -Browser=BlockNote.Net - -[CAST] -Parent=Rippers -Browser=CAST - -[CFNetwork/*] -Parent=Rippers -Browser=CFNetwork - -[CFSCHEDULE*] -Parent=Rippers -Browser=ColdFusion Task Scheduler - -[CobWeb/*] -Parent=Rippers -Browser=CobWeb - -[ColdFusion*] -Parent=Rippers -Browser=ColdFusion - -[Crawl_Application] -Parent=Rippers -Browser=Crawl_Application - -[curl/*] -Parent=Rippers -Browser=cURL - -[Custo*] -Parent=Rippers -Browser=Custo - -[DataCha0s/*] -Parent=Rippers -Browser=DataCha0s - -[DeepIndexer*] -Parent=Rippers -Browser=DeepIndexer - -[DISCo Pump *] -Parent=Rippers -Browser=DISCo Pump - -[eStyleSearch * (compatible; MSIE 6.0; Windows NT 5.0)] -Parent=Rippers -Browser=eStyleSearch -Win32=true - -[ezic.com http agent *] -Parent=Rippers -Browser=Ezic.com - -[fetch libfetch/*] -Parent=Rippers - -[FGet*] -Parent=Rippers -Browser=FGet - -[Flaming AttackBot*] -Parent=Rippers -Browser=Flaming AttackBot - -[Foobot*] -Parent=Rippers -Browser=Foobot - -[GameSpyHTTP/*] -Parent=Rippers -Browser=GameSpyHTTP - -[gnome-vfs/*] -Parent=Rippers -Browser=gnome-vfs - -[Harvest/*] -Parent=Rippers -Browser=Harvest - -[hcat/*] -Parent=Rippers -Browser=hcat - -[HLoader] -Parent=Rippers -Browser=HLoader - -[Holmes/*] -Parent=Rippers -Browser=Holmes - -[HTMLParser/*] -Parent=Rippers -Browser=HTMLParser - -[http generic] -Parent=Rippers -Browser=http generic - -[httpclient*] -Parent=Rippers - -[httperf/*] -Parent=Rippers -Browser=httperf - -[HTTPFetch/*] -Parent=Rippers -Browser=HTTPFetch - -[HTTPGrab] -Parent=Rippers -Browser=HTTPGrab - -[HttpSession] -Parent=Rippers -Browser=HttpSession - -[httpunit/*] -Parent=Rippers -Browser=HttpUnit - -[ICE_GetFile] -Parent=Rippers -Browser=ICE_GetFile - -[iexplore.exe] -Parent=Rippers - -[Inet - Eureka App] -Parent=Rippers -Browser=Inet - Eureka App - -[INetURL/*] -Parent=Rippers -Browser=INetURL - -[InetURL:/*] -Parent=Rippers -Browser=InetURL - -[Internet Exploiter/*] -Parent=Rippers - -[Internet Explore *] -Parent=Rippers -Browser=Fake IE - -[Internet Explorer *] -Parent=Rippers -Browser=Fake IE - -[IP*Works!*/*] -Parent=Rippers -Browser=IP*Works! - -[IrssiUrlLog/*] -Parent=Rippers -Browser=IrssiUrlLog - -[JPluck/*] -Parent=Rippers -Browser=JPluck - -[Kapere (http://www.kapere.com)] -Parent=Rippers -Browser=Kapere - -[LeechFTP] -Parent=Rippers -Browser=LeechFTP - -[LeechGet*] -Parent=Rippers -Browser=LeechGet - -[libcurl-agent/*] -Parent=Rippers -Browser=libcurl - -[libWeb/clsHTTP*] -Parent=Rippers -Browser=libWeb/clsHTTP - -[lwp*] -Parent=Rippers - -[MFC_Tear_Sample] -Parent=Rippers -Browser=MFC_Tear_Sample - -[Moozilla] -Parent=Rippers -Browser=Moozilla - -[MovableType/*] -Parent=Rippers -Browser=MovableType Web Log - -[Mozilla/2.0 (compatible; NEWT ActiveX; Win32)] -Parent=Rippers -Browser=NEWT ActiveX -Platform=Win32 - -[Mozilla/3.0 (compatible)] -Parent=Rippers - -[Mozilla/3.0 (compatible; Indy Library)] -Parent=Rippers -Cookies=true - -[Mozilla/3.01 (compatible;)] -Parent=Rippers - -[Mozilla/4.0 (compatible; BorderManager*)] -Parent=Rippers -Browser=Novell BorderManager - -[Mozilla/4.0 (compatible;)] -Parent=Rippers - -[Mozilla/5.0 (compatible; IPCheck Server Monitor*)] -Parent=Rippers -Browser=IPCheck Server Monitor - -[OCN-SOC/*] -Parent=Rippers -Browser=OCN-SOC - -[Offline Explorer*] -Parent=Rippers -Browser=Offline Explorer - -[Open Web Analytics Bot*] -Parent=Rippers -Browser=Open Web Analytics Bot - -[OSSProxy*] -Parent=Rippers -Browser=OSSProxy - -[Pageload*] -Parent=Rippers -Browser=PageLoad - -[PageNest/*] -Parent=Rippers -Browser=PageNest - -[pavuk/*] -Parent=Rippers -Browser=Pavuk - -[PEAR HTTP_Request*] -Parent=Rippers -Browser=PEAR-PHP - -[PHP*] -Parent=Rippers -Browser=PHP - -[PigBlock (Windows NT 5.1; U)*] -Parent=Rippers -Browser=PigBlock -Win32=true - -[Pockey*] -Parent=Rippers -Browser=Pockey-GetHTML - -[POE-Component-Client-HTTP/*] -Parent=Rippers -Browser=POE-Component-Client-HTTP - -[PycURL/*] -Parent=Rippers -Browser=PycURL - -[Python*] -Parent=Rippers -Browser=Python - -[RepoMonkey*] -Parent=Rippers -Browser=RepoMonkey - -[SBL-BOT*] -Parent=Rippers -Browser=BlackWidow - -[ScoutAbout*] -Parent=Rippers -Browser=ScoutAbout - -[sherlock/*] -Parent=Rippers -Browser=Sherlock - -[SiteParser/*] -Parent=Rippers -Browser=SiteParser - -[SiteSnagger*] -Parent=Rippers -Browser=SiteSnagger - -[SiteSucker/*] -Parent=Rippers -Browser=SiteSucker - -[SiteWinder*] -Parent=Rippers -Browser=SiteWinder - -[Snoopy*] -Parent=Rippers -Browser=Snoopy - -[SOFTWING_TEAR_AGENT*] -Parent=Rippers -Browser=AspTear - -[SuperHTTP/*] -Parent=Rippers -Browser=SuperHTTP - -[Tcl http client package*] -Parent=Rippers -Browser=Tcl http client package - -[Twisted PageGetter] -Parent=Rippers -Browser=Twisted PageGetter - -[URL2File/*] -Parent=Rippers -Browser=URL2File - -[UtilMind HTTPGet] -Parent=Rippers -Browser=UtilMind HTTPGet - -[VCI WebViewer*] -Parent=Rippers -Browser=VCI WebViewer - -[W3CRobot/*] -Parent=Rippers -Browser=W3CRobot - -[Web Downloader*] -Parent=Rippers -Browser=Web Downloader - -[Web Downloader/*] -Parent=Rippers -Browser=Web Downloader - -[Web Magnet*] -Parent=Rippers -Browser=Web Magnet - -[WebAuto/*] -Parent=Rippers - -[webbandit/*] -Parent=Rippers -Browser=webbandit - -[WebCopier*] -Parent=Rippers -Browser=WebCopier - -[WebDownloader*] -Parent=Rippers -Browser=WebDownloader - -[WebFetch] -Parent=Rippers -Browser=WebFetch - -[webfetch/*] -Parent=Rippers -Browser=WebFetch - -[WebGatherer*] -Parent=Rippers -Browser=WebGatherer - -[WebGet] -Parent=Rippers -Browser=WebGet - -[WebReaper*] -Parent=Rippers -Browser=WebReaper - -[WebRipper] -Parent=Rippers -Browser=WebRipper - -[WebSauger*] -Parent=Rippers -Browser=WebSauger - -[Website Downloader*] -Parent=Rippers -Browser=Website Downloader - -[Website eXtractor*] -Parent=Rippers -Browser=Website eXtractor - -[Website Quester] -Parent=Rippers -Browser=Website Quester - -[WebsiteExtractor*] -Parent=Rippers -Browser=Website eXtractor - -[WebSnatcher*] -Parent=Rippers -Browser=WebSnatcher - -[Webster Pro*] -Parent=Rippers -Browser=Webster Pro - -[WebStripper*] -Parent=Rippers -Browser=WebStripper - -[WebWhacker*] -Parent=Rippers -Browser=WebWhacker - -[WinScripter iNet Tools] -Parent=Rippers -Browser=WinScripter iNet Tools - -[WWW-Mechanize/*] -Parent=Rippers -Browser=WWW-Mechanize - -[Zend_Http_Client] -Parent=Rippers -Browser=Zend_Http_Client - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Site Monitors - -[Site Monitors] -Parent=DefaultProperties -Browser=Site Monitors -Cookies=true -isBanned=true -Crawler=true - -[*EasyRider*] -Parent=Site Monitors -Browser=EasyRider - -[*maxamine.com--robot*] -Parent=Site Monitors -Browser=maxamine.com--robot -isBanned=true - -[*WebMon ?.*] -Parent=Site Monitors -Browser=WebMon - -[Kenjin Spider*] -Parent=Site Monitors -Browser=Kenjin Spider - -[Kevin http://*] -Parent=Site Monitors -Browser=Kevin -isBanned=true - -[Mozilla/4.0 (compatible; ChangeDetection/*] -Parent=Site Monitors -Browser=ChangeDetection - -[Myst Monitor Service v*] -Parent=Site Monitors -Browser=Myst Monitor Service - -[Net Probe] -Parent=Site Monitors -Browser=Net Probe - -[NetMechanic*] -Parent=Site Monitors -Browser=NetMechanic - -[NetReality*] -Parent=Site Monitors -Browser=NetReality - -[Pingdom GIGRIB*] -Parent=Site Monitors -Browser=Pingdom - -[Site Valet Online*] -Parent=Site Monitors -Browser=Site Valet -isBanned=true - -[SITECHECKER] -Parent=Site Monitors -Browser=SITECHECKER - -[sitemonitor@dnsvr.com/*] -Parent=Site Monitors -Browser=ZoneEdit Failover Monitor -isBanned=false - -[UpTime Checker*] -Parent=Site Monitors -Browser=UpTime Checker - -[URL Control*] -Parent=Site Monitors -Browser=URL Control - -[URL_Access/*] -Parent=Site Monitors - -[URLCHECK] -Parent=Site Monitors -Browser=URLCHECK - -[URLy Warning*] -Parent=Site Monitors -Browser=URLy Warning - -[Webcheck *] -Parent=Site Monitors -Browser=Webcheck -Version=1.0 -MajorVer=1 -MinorVer=0 - -[WebPatrol/*] -Parent=Site Monitors -Browser=WebPatrol - -[websitepulse checker/*] -Parent=Site Monitors -Browser=websitepulse checker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Social Bookmarkers - -[Social Bookmarkers] -Parent=DefaultProperties -Browser=Social Bookmarkers -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[BookmarkBase(2/;http://bookmarkbase.com)] -Parent=Social Bookmarkers -Browser=BookmarkBase - -[Cocoal.icio.us/1.0 (v43) (Mac OS X; http://www.scifihifi.com/cocoalicious)] -Parent=Social Bookmarkers -Browser=Cocoalicious - -[Mozilla/5.0 (compatible; FriendFeedBot/0.*; Http://friendfeed.com/about/bot)] -Parent=Social Bookmarkers -Browser=FriendFeedBot - -[Twitturly*] -Parent=Social Bookmarkers -Browser=Twitturly - -[WinkBot/*] -Parent=Social Bookmarkers -Browser=WinkBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Translators - -[Translators] -Parent=DefaultProperties -Browser=Translators -Frames=true -Tables=true -Cookies=true - -[Seram Server] -Parent=Translators -Browser=Seram Server - -[TeragramWebcrawler/*] -Parent=Translators -Browser=TeragramWebcrawler -Version=1.0 -MajorVer=1 -MinorVer=0 - -[WebIndexer/* (Web Indexer; *)] -Parent=Translators -Browser=WorldLingo - -[WebTrans] -Parent=Translators -Browser=WebTrans - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Version Checkers - -[Version Checkers] -Parent=DefaultProperties -Browser=Version Checkers -Crawler=true - -[Automated Browscap.ini Updater. To report issues contact us at http://www.skycomp.ca] -Parent=Version Checkers -Browser=Automated Browscap.ini Updater - -[BMC Link Validator (http://www.briansmodelcars.com/links/)] -Parent=Version Checkers -Browser=BMC Link Validator -MajorVer=1 -MinorVer=0 -Platform=Win2000 - -[Browscap updater] -Parent=Version Checkers -Browser=Browscap updater - -[BrowscapUpdater1.0] -Parent=Version Checkers - -[Browser Capabilities Project (http://browsers.garykeith.com; http://browsers.garykeith.com/sitemail/contact-me.asp)] -Parent=Version Checkers -Browser=Gary Keith's Version Checker - -[Browser Capabilities Project AutoDownloader] -Parent=Version Checkers -Browser=TKC AutoDownloader - -[browsers.garykeith.com browscap.ini bot BETA] -Parent=Version Checkers - -[Code Sample Web Client] -Parent=Version Checkers -Browser=Code Sample Web Client - -[Desktop Sidebar*] -Parent=Version Checkers -Browser=Desktop Sidebar -isBanned=true - -[Mono Browser Capabilities Updater*] -Parent=Version Checkers -Browser=Mono Browser Capabilities Updater -isBanned=true - -[Rewmi/*] -Parent=Version Checkers -isBanned=true - -[Subtext Version 1.9* - http://subtextproject.com/ (Microsoft Windows NT 5.2.*)] -Parent=Version Checkers -Browser=Subtext - -[TherapeuticResearch] -Parent=Version Checkers -Browser=TherapeuticResearch - -[UpdateBrowscap*] -Parent=Version Checkers -Browser=UpdateBrowscap - -[www.garykeith.com browscap.ini bot*] -Parent=Version Checkers -Browser=clarkson.edu - -[www.substancia.com AutoHTTPAgent (ver *)] -Parent=Version Checkers -Browser=Substância - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Become - -[Become] -Parent=DefaultProperties -Browser=Become -Frames=true -Tables=true -isSyndicationReader=true -Crawler=true - -[*BecomeBot/*] -Parent=Become -Browser=BecomeBot - -[*BecomeBot@exava.com*] -Parent=Become -Browser=BecomeBot - -[*Exabot@exava.com*] -Parent=Become -Browser=Exabot - -[MonkeyCrawl/*] -Parent=Become -Browser=MonkeyCrawl - -[Mozilla/5.0 (compatible; BecomeJPBot/2.3; *)] -Parent=Become -Browser=BecomeJPBot - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Blue Coat Systems - -[Blue Coat Systems] -Parent=DefaultProperties -Browser=Blue Coat Systems -isBanned=true -Crawler=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Browscap Abusers - -[Browscap Abusers] -Parent=DefaultProperties -Browser=Browscap Abusers -isBanned=true - -[Apple-PubSub/*] -Parent=Browscap Abusers -Browser=Apple-PubSub - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FeedHub - -[FeedHub] -Parent=DefaultProperties -Browser=FeedHub -isSyndicationReader=true - -[FeedHub FeedDiscovery/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub FeedDiscovery -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedHub FeedFetcher/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub FeedFetcher -Version=1.0 -MajorVer=1 -MinorVer=0 - -[FeedHub MetaDataFetcher/1.0 (http://www.feedhub.com)] -Parent=FeedHub -Browser=FeedHub MetaDataFetcher -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Internet Content Rating Association] -Parent=DefaultProperties -Browser= -Frames=true -IFrames=true -Tables=true -Cookies=true -Crawler=true - -[ICRA_label_generator/1.?] -Parent=Internet Content Rating Association -Browser=ICRA_label_generator - -[ICRA_Semantic_spider/0.?] -Parent=Internet Content Rating Association -Browser=ICRA_Semantic_spider - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NameProtect - -[NameProtect] -Parent=DefaultProperties -Browser=NameProtect -isBanned=true -Crawler=true - -[abot/*] -Parent=NameProtect -Browser=NameProtect - -[NP/*] -Parent=NameProtect -Browser=NameProtect - -[NPBot*] -Parent=NameProtect -Browser=NameProtect - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netcraft - -[Netcraft] -Parent=DefaultProperties -Browser=Netcraft -isBanned=true -Crawler=true - -[*Netcraft Web Server Survey*] -Parent=Netcraft -Browser=Netcraft Webserver Survey -isBanned=true - -[Mozilla/5.0 (compatible; NetcraftSurveyAgent/1.0; info@netcraft.com)] -Parent=Netcraft -Browser=NetcraftSurveyAgent - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NewsGator - -[NewsGator] -Parent=DefaultProperties -Browser=NewsGator -isSyndicationReader=true - -[MarsEdit*] -Parent=NewsGator -Browser=MarsEdit - -[NetNewsWire*/*] -Parent=NewsGator -Browser=NetNewsWire -Platform=MacOSX - -[NewsFire/*] -Parent=NewsGator -Browser=NewsFire - -[NewsGator FetchLinks extension/*] -Parent=NewsGator -Browser=NewsGator FetchLinks - -[NewsGator/*] -Parent=NewsGator -Browser=NewsGator -isBanned=true - -[NewsGatorOnline/*] -Parent=NewsGator -Browser=NewsGatorOnline - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.2 - -[Chrome 0.2] -Parent=DefaultProperties -Browser=Chrome -Version=0.2 -MinorVer=2 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.2.* Safari/*] -Parent=Chrome 0.2 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.3 - -[Chrome 0.3] -Parent=DefaultProperties -Browser=Chrome -Version=0.3 -MinorVer=3 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.3.* Safari/*] -Parent=Chrome 0.3 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.4 - -[Chrome 0.4] -Parent=DefaultProperties -Browser=Chrome -Version=0.4 -MinorVer=4 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.4.* Safari/*] -Parent=Chrome 0.4 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 0.5 - -[Chrome 0.5] -Parent=DefaultProperties -Browser=Chrome -Version=0.5 -MinorVer=5 -Beta=true -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/0.5.* Safari/*] -Parent=Chrome 0.5 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 1.0 - -[Chrome 1.0] -Parent=DefaultProperties -Browser=Chrome -Version=1.0 -MajorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/1.0.* Safari/*] -Parent=Chrome 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 2.0 - -[Chrome 2.0] -Parent=DefaultProperties -Browser=Chrome -Version=2.0 -MajorVer=2 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/2.0.* Safari/*] -Parent=Chrome 2.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chrome 3.0 - -[Chrome 3.0] -Parent=DefaultProperties -Browser=Chrome -Version=3.0 -MajorVer=3 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; U; Windows NT 7.0; *) AppleWebKit/* (KHTML, like Gecko) Chrome/3.0.* Safari/*] -Parent=Chrome 3.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google Code - -[Google Code] -Parent=DefaultProperties -Browser=Google Code -Tables=true -Cookies=true -JavaApplets=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.2 - -[Iron 0.2] -Parent=DefaultProperties -Browser=Iron -Version=0.2 -MinorVer=2 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.2.* Safari/*] -Parent=Iron 0.2 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.3 - -[Iron 0.3] -Parent=DefaultProperties -Browser=Iron -Version=0.3 -MinorVer=3 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.3.* Safari/*] -Parent=Iron 0.3 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iron 0.4 - -[Iron 0.4] -Parent=DefaultProperties -Browser=Iron -Version=0.4 -MinorVer=4 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *) AppleWebKit/* (KHTML, like Gecko) Iron/0.4.* Safari/*] -Parent=Iron 0.4 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iPod - -[iPod] -Parent=DefaultProperties -Browser=iPod -Platform=iPhone OSX -isMobileDevice=true - -[Mozilla/5.0 (iPod; U; *Mac OS X; *) AppleWebKit/* (*) Version/3.0 Mobile/* Safari/*] -Parent=iPod -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX - -[Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2 like Mac OS X; en-us) AppleWebKit/* (KHTML, like Gecko) Mobile/*] -Parent=iPod - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iTunes - -[iTunes] -Parent=DefaultProperties -Browser=iTunes -Platform=iPhone OSX - -[iTunes/* (Windows; ?)] -Parent=iTunes -Browser=iTunes -Platform=Win32 -Win32=true - -[MOT-* iTunes/* MIB/* Profile/MIDP-* Configuration/CLDC-* UP.Link/*] -Parent=iTunes - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Media Players - -[Media Players] -Parent=DefaultProperties -Browser=Media Players -Cookies=true - -[Microsoft NetShow(TM) Player with RealVideo(R)] -Parent=Media Players -Browser=Microsoft NetShow - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; *) AppleWebKit/* RealPlayer] -Parent=Media Players -Browser=RealPlayer -Platform=MacOSX - -[MPlayer 0.9*] -Parent=Media Players -Browser=MPlayer -Version=0.9 -MajorVer=0 -MinorVer=9 - -[MPlayer 1.*] -Parent=Media Players -Browser=MPlayer -Version=1.0 -MajorVer=1 -MinorVer=0 - -[MPlayer HEAD CVS] -Parent=Media Players -Browser=MPlayer - -[RealPlayer*] -Parent=Media Players -Browser=RealPlayer - -[RMA/*] -Parent=Media Players -Browser=RMA - -[VLC media player*] -Parent=Media Players -Browser=VLC - -[vobsub] -Parent=Media Players -Browser=vobsub -isBanned=true - -[WinampMPEG/*] -Parent=Media Players -Browser=WinAmp - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nintendo - -[Nintendo Wii] -Parent=DefaultProperties -Browser= -isMobileDevice=true - -[Opera/* (Nintendo DSi; Opera/*; *; *)] -Parent=Nintendo Wii -Browser=DSi - -[Opera/* (Nintendo Wii; U; *)] -Parent=Nintendo Wii -Browser=Wii - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Windows Media Player - -[Windows Media Player] -Parent=DefaultProperties -Browser=Windows Media Player -Cookies=true - -[NSPlayer/10.*] -Parent=Windows Media Player -Version=10.0 -MajorVer=10 -MinorVer=0 - -[NSPlayer/11.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=11.0 -MajorVer=11 -MinorVer=0 - -[NSPlayer/4.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=4.0 -MajorVer=4 -MinorVer=0 - -[NSPlayer/7.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=7.0 -MajorVer=7 -MinorVer=0 - -[NSPlayer/8.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=8.0 -MajorVer=8 -MinorVer=0 - -[NSPlayer/9.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=9.0 -MajorVer=9 -MinorVer=0 - -[Windows-Media-Player/10.*] -Parent=Windows Media Player -Browser=Windows-Media-Player -Version=10.0 -MajorVer=10 -MinorVer=0 -Win32=true - -[Windows-Media-Player/11.*] -Parent=Windows Media Player -Version=11.0 -MajorVer=11 -MinorVer=0 -Win32=true - -[Windows-Media-Player/7.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=7.0 -MajorVer=7 -MinorVer=0 -Win32=true - -[Windows-Media-Player/8.*] -Parent=Windows Media Player -Browser=Windows Media Player -Version=8.0 -MajorVer=8 -MinorVer=0 -Win32=true - -[Windows-Media-Player/9.*] -Parent=Windows Media Player -Version=9.0 -MajorVer=9 -MinorVer=0 -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Zune - -[Zune] -Parent=DefaultProperties -Browser=Zune -Cookies=true - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 2.0*)*] -Parent=Zune -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 2.5*)*] -Parent=Zune -Version=2.5 -MajorVer=2 -MinorVer=5 - -[Mozilla/4.0 (compatible; MSIE ?.0; *Zune 3.0*)*] -Parent=Zune -Version=3.0 -MajorVer=3 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.0 - -[QuickTime 7.0] -Parent=DefaultProperties -Browser=QuickTime -Version=7.0 -MajorVer=7 -Cookies=true - -[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.0 -Platform=MacOSX - -[QuickTime (qtver=7.0*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.0 -Platform=MacPPC - -[QuickTime (qtver=7.0*;os=Windows 95*)] -Parent=QuickTime 7.0 -Platform=Win95 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows 98*)] -Parent=QuickTime 7.0 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows Me*)] -Parent=QuickTime 7.0 -Platform=WinME -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 4.0*)] -Parent=QuickTime 7.0 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.0*)] -Parent=QuickTime 7.0 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.1*)] -Parent=QuickTime 7.0 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.0*;os=Windows NT 5.2*)] -Parent=QuickTime 7.0 -Platform=Win2003 -Win32=true - -[QuickTime/7.0.* (qtver=7.0.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.0 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.1 - -[QuickTime 7.1] -Parent=DefaultProperties -Browser=QuickTime -Version=7.1 -MajorVer=7 -MinorVer=1 -Cookies=true - -[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.1 -Platform=MacOSX - -[QuickTime (qtver=7.1*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.1 -Platform=MacPPC - -[QuickTime (qtver=7.1*;os=Windows 98*)] -Parent=QuickTime 7.1 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 4.0*)] -Parent=QuickTime 7.1 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.0*)] -Parent=QuickTime 7.1 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.1*)] -Parent=QuickTime 7.1 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.1*;os=Windows NT 5.2*)] -Parent=QuickTime 7.1 -Platform=Win2003 -Win32=true - -[QuickTime/7.1.* (qtver=7.1.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.1 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.2 - -[QuickTime 7.2] -Parent=DefaultProperties -Browser=QuickTime -Version=7.2 -MajorVer=7 -MinorVer=2 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.2*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.2 -Platform=MacOSX - -[QuickTime (qtver=7.2*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.2 -Platform=MacPPC - -[QuickTime (qtver=7.2*;os=Windows 98*)] -Parent=QuickTime 7.2 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 4.0*)] -Parent=QuickTime 7.2 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.0*)] -Parent=QuickTime 7.2 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.1*)] -Parent=QuickTime 7.2 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.2*;os=Windows NT 5.2*)] -Parent=QuickTime 7.2 -Platform=Win2003 -Win32=true - -[QuickTime/7.2.* (qtver=7.2.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.2 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.3 - -[QuickTime 7.3] -Parent=DefaultProperties -Browser=QuickTime -Version=7.3 -MajorVer=7 -MinorVer=3 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.3*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.3 -Platform=MacOSX - -[QuickTime (qtver=7.3*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.3 -Platform=MacPPC - -[QuickTime (qtver=7.3*;os=Windows 98*)] -Parent=QuickTime 7.3 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 4.0*)] -Parent=QuickTime 7.3 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.0*)] -Parent=QuickTime 7.3 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.1*)] -Parent=QuickTime 7.3 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.3*;os=Windows NT 5.2*)] -Parent=QuickTime 7.3 -Platform=Win2003 -Win32=true - -[QuickTime/7.3.* (qtver=7.3.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.3 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; QuickTime 7.4 - -[QuickTime 7.4] -Parent=DefaultProperties -Browser=QuickTime -Version=7.4 -MajorVer=7 -MinorVer=4 -Platform=MacOSX -Cookies=true - -[QuickTime (qtver=7.4*;cpu=PPC;os=Mac 10.*)] -Parent=QuickTime 7.4 -Platform=MacOSX - -[QuickTime (qtver=7.4*;cpu=PPC;os=Mac 9.*)] -Parent=QuickTime 7.4 -Platform=MacPPC - -[QuickTime (qtver=7.4*;os=Windows 98*)] -Parent=QuickTime 7.4 -Platform=Win98 -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 4.0*)] -Parent=QuickTime 7.4 -Platform=WinNT -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.0*)] -Parent=QuickTime 7.4 -Platform=Win2000 -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.1*)] -Parent=QuickTime 7.4 -Platform=WinXP -Win32=true - -[QuickTime (qtver=7.4*;os=Windows NT 5.2*)] -Parent=QuickTime 7.4 -Platform=Win2003 -Win32=true - -[QuickTime/7.4.* (qtver=7.4.*;*;os=Mac 10.*)*] -Parent=QuickTime 7.4 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Google Android - -[Android] -Parent=DefaultProperties -Browser=Android -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[Mozilla/5.0 (Linux; U; Android *; *) AppleWebKit/* (KHTML, like Gecko) Safari/*] -Parent=Android -Browser=Android -Platform=Linux -isMobileDevice=true - -[Mozilla/5.0 (Linux; U; Android *; *) AppleWebKit/* (KHTML, like Gecko) Version/3.0.* Mobile Safari/*] -Parent=Android -Browser=Android -Platform=Linux -isMobileDevice=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BlackBerry - -[BlackBerry] -Parent=DefaultProperties -Browser=BlackBerry -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[*BlackBerry*] -Parent=BlackBerry - -[*BlackBerrySimulator/*] -Parent=BlackBerry - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Handspring Blazer - -[Blazer] -Parent=DefaultProperties -Browser=Handspring Blazer -Platform=Palm -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 95; PalmSource; Blazer 3.0) 16;160x160] -Parent=Blazer -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.0) 16;320x448] -Parent=Blazer -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.1) 16;320x320] -Parent=Blazer -Version=4.1 -MajorVer=4 -MinorVer=1 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.2) 16;320x320] -Parent=Blazer -Version=4.2 -MajorVer=4 -MinorVer=2 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.4) 16;320x320] -Parent=Blazer -Version=4.4 -MajorVer=4 -MinorVer=4 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/*; Blazer/4.5) 16;320x320] -Parent=Blazer -Version=4.5 -MajorVer=4 -MinorVer=5 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DoCoMo - -[DoCoMo] -Parent=DefaultProperties -Browser=DoCoMo -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[DoCoMo/1.0*] -Parent=DoCoMo -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WAP - -[DoCoMo/2.0*] -Parent=DoCoMo -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=WAP - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IEMobile - -[IEMobile] -Parent=DefaultProperties -Browser=IEMobile -Platform=WinCE -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -VBScript=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.*)*] -Parent=IEMobile -Version=6.0 -MajorVer=6 -MinorVer=0 - -[Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.*)*] -Parent=IEMobile -Version=7.0 -MajorVer=7 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iPhone - -[iPhone] -Parent=DefaultProperties -Browser=iPhone -Platform=iPhone OSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -isMobileDevice=true -CssVersion=3 -supportsCSS=true - -[Mozilla/4.0 (iPhone; *)] -Parent=iPhone - -[Mozilla/4.0 (iPhone; U; CPU like Mac OS X; *)] -Parent=iPhone - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_0_1 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone Simulator; U; CPU iPhone OS 2_1 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Browser=iPhone Simulator -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko)] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0* like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.1* Mobile/* Safari/*] -Parent=iPhone -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0_2 like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_1 like Mac OS X; *)*] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_2_1 like Mac OS X; *)] -Parent=iPhone - -[Mozilla/5.0 (iPhone; U; CPU like Mac OS X; *) AppleWebKit/* (KHTML, like Gecko) Version/3.0 Mobile/* Safari/*] -Parent=iPhone -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Mozilla/5.0 (iPod; U; *Mac OS X; *) AppleWebKit/* (*) Version/* Mobile/*] -Parent=iPhone -Browser=iTouch - -[Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2* like Mac OS X; *)*] -Parent=iPhone -Browser=iTouch -Version=2.2 -MajorVer=2 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; KDDI - -[KDDI] -Parent=DefaultProperties -Browser=KDDI -Frames=true -Tables=true -Cookies=true -BackgroundSounds=true -VBScript=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[KDDI-* UP.Browser/* (GUI) MMP/*] -Parent=KDDI - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Miscellaneous Mobile - -[Miscellaneous Mobile] -Parent=DefaultProperties -Browser= -IFrames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; *; CentOS; *) AppleWebKit/* (KHTML, like Gecko) Bolt/0.* Version/3.0 Safari/*] -Parent=Miscellaneous Mobile -Browser=Bolt - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Motorola Internet Browser - -[Motorola Internet Browser] -Parent=DefaultProperties -Browser=Motorola Internet Browser -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[MOT-*/*] -Parent=Motorola Internet Browser - -[MOT-1*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-8700_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-0A/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-2B/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-A-88/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-C???/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-GATW_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-L6/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-L7/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-M*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-MP*/* Mozilla/* (compatible; MSIE *; Windows CE; *)] -Parent=Motorola Internet Browser -Win32=true - -[MOT-MP*/* Mozilla/4.0 (compatible; MSIE *; Windows CE; *)] -Parent=Motorola Internet Browser -Win32=true - -[MOT-SAP4_/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-T*/*] -Parent=Motorola Internet Browser - -[MOT-T7*/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-T721*] -Parent=Motorola Internet Browser - -[MOT-TA02/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V*/*] -Parent=Motorola Internet Browser - -[MOT-V*/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V*/* UP.Browser/*] -Parent=Motorola Internet Browser - -[MOT-V3/* MIB/*] -Parent=Motorola Internet Browser - -[MOT-V4*/* MIB/*] -Parent=Motorola Internet Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSN Mobile Proxy - -[MSN Mobile Proxy] -Parent=DefaultProperties -Browser=MSN Mobile Proxy -Win32=true -Frames=true -Tables=true -Cookies=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true - -[Mozilla/* (compatible; MSIE *; Windows*; MSN Mobile Proxy)] -Parent=MSN Mobile Proxy - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetFront - -[NetFront] -Parent=DefaultProperties -Browser=NetFront -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[*NetFront/*] -Parent=NetFront - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Nokia - -[Nokia] -Parent=DefaultProperties -Browser=Nokia -Tables=true -Cookies=true -isMobileDevice=true - -[*Nokia*/*] -Parent=Nokia - -[Mozilla/* (SymbianOS/*; ?; *) AppleWebKit/* (KHTML, like Gecko) Safari/*] -Parent=Nokia -Platform=SymbianOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Openwave Mobile Browser - -[Openwave Mobile Browser] -Parent=DefaultProperties -Browser=Openwave Mobile Browser -Alpha=true -Win32=true -Win64=true -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[*UP.Browser/*] -Parent=Openwave Mobile Browser - -[*UP.Link/*] -Parent=Openwave Mobile Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera Mini - -[Opera Mini] -Parent=DefaultProperties -Browser=Opera Mini -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true - -[Opera/* (J2ME/MIDP; Opera Mini/1.0*)*] -Parent=Opera Mini -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/1.1*)*] -Parent=Opera Mini -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/1.2*)*] -Parent=Opera Mini -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Opera/* (J2ME/MIDP; Opera Mini/2.0*)*] -Parent=Opera Mini -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/3.0*)*] -Parent=Opera Mini -Version=3.0 -MajorVer=3 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/3.1*)*] -Parent=Opera Mini -Version=3.1 -MajorVer=3 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/4.0*)*] -Parent=Opera Mini -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Opera/* (J2ME/MIDP; Opera Mini/4.1*)*] -Parent=Opera Mini -Version=4.1 -MajorVer=4 -MinorVer=1 - -[Opera/* (J2ME/MIDP; Opera Mini/4.2*)*] -Parent=Opera Mini -Version=4.2 -MajorVer=4 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera Mobile - -[Opera Mobile] -Parent=DefaultProperties -Browser=Opera Mobi -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Opera/9.5 (Microsoft Windows; PPC; *Opera Mobile/*)] -Parent=Opera Mobile -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Opera/9.5 (Microsoft Windows; PPC; Opera Mobi/*)] -Parent=Opera Mobile -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Opera/9.51 Beta (Microsoft Windows; PPC; Opera Mobi/*)*] -Parent=Opera Mobile -Version=9.51 -MajorVer=9 -MinorVer=51 -Beta=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Playstation - -[Playstation] -Parent=DefaultProperties -Browser=Playstation -Platform=WAP -Frames=true -Tables=true -Cookies=true -isMobileDevice=true - -[Mozilla/* (PLAYSTATION *; *)] -Parent=Playstation -Browser=PlayStation 3 -Frames=false - -[Mozilla/* (PSP (PlayStation Portable); *)] -Parent=Playstation - -[Sony PS2 (Linux)] -Parent=Playstation -Browser=Sony PS2 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Pocket PC - -[Pocket PC] -Parent=DefaultProperties -Browser=Pocket PC -Platform=WinCE -Win32=true -Frames=true -Tables=true -Cookies=true -JavaScript=true -ActiveXControls=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*(compatible; MSIE *.*; Windows CE; PPC; *)] -Parent=Pocket PC - -[HTC-*/* Mozilla/* (compatible; MSIE *.*; Windows CE*)*] -Parent=Pocket PC -Win32=true - -[Mozilla/* (compatible; MSPIE *.*; *Windows CE*)*] -Parent=Pocket PC -Win32=true - -[T-Mobile* Mozilla/* (compatible; MSIE *.*; Windows CE; *)] -Parent=Pocket PC - -[Vodafone* Mozilla/* (compatible; MSIE *.*; Windows CE; *)*] -Parent=Pocket PC - -[Windows CE (Pocket PC) - Version *.*] -Parent=Pocket PC -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SEMC Browser - -[SEMC Browser] -Parent=DefaultProperties -Browser=SEMC Browser -Platform=JAVA -Tables=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*SEMC-Browser/*] -Parent=SEMC Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SonyEricsson - -[SonyEricsson] -Parent=DefaultProperties -Browser=SonyEricsson -Frames=true -Tables=true -Cookies=true -JavaScript=true -isMobileDevice=true -CssVersion=1 -supportsCSS=true - -[*Ericsson*] -Parent=SonyEricsson - -[*SonyEricsson*] -Parent=SonyEricsson - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netbox - -[Netbox] -Parent=DefaultProperties -Browser=Netbox -Frames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/3.01 (compatible; Netbox/*; Linux*)] -Parent=Netbox -Browser=Netbox -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; PowerTV - -[PowerTV] -Parent=DefaultProperties -Browser=PowerTV -Platform=PowerTV -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/4.0 PowerTV/1.5 (Compatible; Spyglass DM 3.2.1, EXPLORER)] -Parent=PowerTV -Version=1.5 -MajorVer=1 -MinorVer=5 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WebTV/MSNTV - -[WebTV] -Parent=DefaultProperties -Browser=WebTV/MSNTV -Platform=WebTV -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/3.0 WebTV/1.*(compatible; MSIE 2.0)] -Parent=WebTV -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/4.0 WebTV/2.0*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/4.0 WebTV/2.1*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/4.0 WebTV/2.2*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Mozilla/4.0 WebTV/2.3*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.3 -MajorVer=2 -MinorVer=3 - -[Mozilla/4.0 WebTV/2.4*(compatible; MSIE 3.0)] -Parent=WebTV -Version=2.4 -MajorVer=2 -MinorVer=4 - -[Mozilla/4.0 WebTV/2.5*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.5 -MajorVer=2 -MinorVer=5 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.6*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.6 -MajorVer=2 -MinorVer=6 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.7*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.7 -MajorVer=2 -MinorVer=7 -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.8*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.8 -MajorVer=2 -MinorVer=8 -JavaApplets=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0 WebTV/2.9*(compatible; MSIE 4.0)] -Parent=WebTV -Version=2.9 -MajorVer=2 -MinorVer=9 -JavaApplets=true -CssVersion=1 -supportsCSS=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Amaya - -[Amaya] -Parent=DefaultProperties -Browser=Amaya -Tables=true -Cookies=true - -[amaya/7.*] -Parent=Amaya -Version=7.0 -MajorVer=7 -MinorVer=0 - -[amaya/8.0*] -Parent=Amaya -Version=8.0 -MajorVer=8 -MinorVer=0 -CssVersion=2 -supportsCSS=true - -[amaya/8.1*] -Parent=Amaya -Version=8.1 -MajorVer=8 -MinorVer=1 -CssVersion=2 -supportsCSS=true - -[amaya/8.2*] -Parent=Amaya -Version=8.2 -MajorVer=8 -MinorVer=2 -CssVersion=2 -supportsCSS=true - -[amaya/8.3*] -Parent=Amaya -Version=8.3 -MajorVer=8 -MinorVer=3 -CssVersion=2 -supportsCSS=true - -[amaya/8.4*] -Parent=Amaya -Version=8.4 -MajorVer=8 -MinorVer=4 -CssVersion=2 -supportsCSS=true - -[amaya/8.5*] -Parent=Amaya -Version=8.5 -MajorVer=8 -MinorVer=5 -CssVersion=2 -supportsCSS=true - -[amaya/8.6*] -Parent=Amaya -Version=8.6 -MajorVer=8 -MinorVer=6 -CssVersion=2 -supportsCSS=true - -[amaya/8.7*] -Parent=Amaya -Version=8.7 -MajorVer=8 -MinorVer=7 -CssVersion=2 -supportsCSS=true - -[amaya/8.8*] -Parent=Amaya -Version=8.8 -MajorVer=8 -MinorVer=8 -CssVersion=2 -supportsCSS=true - -[amaya/8.9*] -Parent=Amaya -Version=8.9 -MajorVer=8 -MinorVer=9 -CssVersion=2 -supportsCSS=true - -[amaya/9.0*] -Parent=Amaya -Version=9.0 -MajorVer=8 -MinorVer=0 -CssVersion=2 -supportsCSS=true - -[amaya/9.1*] -Parent=Amaya -Version=9.1 -MajorVer=9 -MinorVer=1 -CssVersion=2 -supportsCSS=true - -[amaya/9.2*] -Parent=Amaya -Version=9.2 -MajorVer=9 -MinorVer=2 -CssVersion=2 -supportsCSS=true - -[amaya/9.3*] -Parent=Amaya -Version=9.3 -MajorVer=9 -MinorVer=3 - -[amaya/9.4*] -Parent=Amaya -Version=9.4 -MajorVer=9 -MinorVer=4 - -[amaya/9.5*] -Parent=Amaya -Version=9.5 -MajorVer=9 -MinorVer=5 - -[Emacs-w3m/*] -Parent=Emacs/W3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Links - -[Links] -Parent=DefaultProperties -Browser=Links -Frames=true -Tables=true - -[Links (0.9*; CYGWIN_NT-5.1*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=WinXP - -[Links (0.9*; Darwin*)] -Parent=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=MacPPC - -[Links (0.9*; FreeBSD*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=FreeBSD - -[Links (0.9*; Linux*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Linux - -[Links (0.9*; OS/2*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=OS/2 - -[Links (0.9*; Unix*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Unix - -[Links (0.9*; Win32*)] -Parent=Links -Browser=Links -Version=0.9 -MajorVer=0 -MinorVer=9 -Platform=Win32 -Win32=true - -[Links (1.0*; CYGWIN_NT-5.1*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP - -[Links (1.0*; FreeBSD*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=FreeBSD - -[Links (1.0*; Linux*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Linux - -[Links (1.0*; OS/2*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=OS/2 - -[Links (1.0*; Unix*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Unix - -[Links (1.0*; Win32*)] -Parent=Links -Browser=Links -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win32 -Win32=true - -[Links (2.0*; Linux*)] -Parent=Links -Browser=Links -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Linux - -[Links (2.1*; FreeBSD*)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=FreeBSD - -[Links (2.1*; Linux *)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=Linux - -[Links (2.1*; OpenBSD*)] -Parent=Links -Browser=Links -Version=2.1 -MajorVer=2 -MinorVer=1 -Platform=OpenBSD - -[Links (2.2*; FreeBSD*)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=FreeBSD - -[Links (2.2*; Linux *)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=Linux - -[Links (2.2*; OpenBSD*)] -Parent=Links -Version=2.2 -MajorVer=2 -MinorVer=2 -Platform=OpenBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lynx - -[Lynx] -Parent=DefaultProperties -Browser=Lynx -Frames=true -Tables=true - -[Lynx *] -Parent=Lynx -Browser=Lynx - -[Lynx/2.3*] -Parent=Lynx -Browser=Lynx -Version=2.3 -MajorVer=2 -MinorVer=3 - -[Lynx/2.4*] -Parent=Lynx -Browser=Lynx -Version=2.4 -MajorVer=2 -MinorVer=4 - -[Lynx/2.5*] -Parent=Lynx -Browser=Lynx -Version=2.5 -MajorVer=2 -MinorVer=5 - -[Lynx/2.6*] -Parent=Lynx -Browser=Lynx -Version=2.6 -MajorVer=2 -MinorVer=6 - -[Lynx/2.7*] -Parent=Lynx -Browser=Lynx -Version=2.7 -MajorVer=2 -MinorVer=7 - -[Lynx/2.8*] -Parent=Lynx -Browser=Lynx -Version=2.8 -MajorVer=2 -MinorVer=8 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NCSA Mosaic - -[Mosaic] -Parent=DefaultProperties -Browser=Mosaic - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; w3m - -[w3m] -Parent=DefaultProperties -Browser=w3m -Frames=true -Tables=true - -[w3m/0.1*] -Parent=w3m -Browser=w3m -Version=0.1 -MajorVer=0 -MinorVer=1 - -[w3m/0.2*] -Parent=w3m -Browser=w3m -Version=0.2 -MajorVer=0 -MinorVer=2 - -[w3m/0.3*] -Parent=w3m -Browser=w3m -Version=0.3 -MajorVer=0 -MinorVer=3 - -[w3m/0.4*] -Parent=w3m -Browser=w3m -Version=0.4 -MajorVer=0 -MinorVer=4 -Cookies=true - -[w3m/0.5*] -Parent=w3m -Browser=w3m -Version=0.5 -MajorVer=0 -MinorVer=5 -Cookies=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.10 - -[ELinks 0.10] -Parent=DefaultProperties -Browser=ELinks -Version=0.10 -MinorVer=10 -Frames=true -Tables=true - -[ELinks (0.10*; *AIX*)] -Parent=ELinks 0.10 -Platform=AIX - -[ELinks (0.10*; *BeOS*)] -Parent=ELinks 0.10 -Platform=BeOS - -[ELinks (0.10*; *CygWin*)] -Parent=ELinks 0.10 -Platform=CygWin - -[ELinks (0.10*; *Darwin*)] -Parent=ELinks 0.10 -Platform=Darwin - -[ELinks (0.10*; *Digital Unix*)] -Parent=ELinks 0.10 -Platform=Digital Unix - -[ELinks (0.10*; *FreeBSD*)] -Parent=ELinks 0.10 -Platform=FreeBSD - -[ELinks (0.10*; *HPUX*)] -Parent=ELinks 0.10 -Platform=HP-UX - -[ELinks (0.10*; *IRIX*)] -Parent=ELinks 0.10 -Platform=IRIX - -[ELinks (0.10*; *Linux*)] -Parent=ELinks 0.10 -Platform=Linux - -[ELinks (0.10*; *NetBSD*)] -Parent=ELinks 0.10 -Platform=NetBSD - -[ELinks (0.10*; *OpenBSD*)] -Parent=ELinks 0.10 -Platform=OpenBSD - -[ELinks (0.10*; *OS/2*)] -Parent=ELinks 0.10 -Platform=OS/2 - -[ELinks (0.10*; *RISC*)] -Parent=ELinks 0.10 -Platform=RISC OS - -[ELinks (0.10*; *Solaris*)] -Parent=ELinks 0.10 -Platform=Solaris - -[ELinks (0.10*; *Unix*)] -Parent=ELinks 0.10 -Platform=Unix - -[ELinks/0.10* (*AIX*)] -Parent=ELinks 0.10 -Platform=AIX - -[ELinks/0.10* (*BeOS*)] -Parent=ELinks 0.10 -Platform=BeOS - -[ELinks/0.10* (*CygWin*)] -Parent=ELinks 0.10 -Platform=CygWin - -[ELinks/0.10* (*Darwin*)] -Parent=ELinks 0.10 -Platform=Darwin - -[ELinks/0.10* (*Digital Unix*)] -Parent=ELinks 0.10 -Platform=Digital Unix - -[ELinks/0.10* (*FreeBSD*)] -Parent=ELinks 0.10 -Platform=FreeBSD - -[ELinks/0.10* (*HPUX*)] -Parent=ELinks 0.10 -Platform=HP-UX - -[ELinks/0.10* (*IRIX*)] -Parent=ELinks 0.10 -Platform=IRIX - -[ELinks/0.10* (*Linux*)] -Parent=ELinks 0.10 -Platform=Linux - -[ELinks/0.10* (*NetBSD*)] -Parent=ELinks 0.10 -Platform=NetBSD - -[ELinks/0.10* (*OpenBSD*)] -Parent=ELinks 0.10 -Platform=OpenBSD - -[ELinks/0.10* (*OS/2*)] -Parent=ELinks 0.10 -Platform=OS/2 - -[ELinks/0.10* (*RISC*)] -Parent=ELinks 0.10 -Platform=RISC OS - -[ELinks/0.10* (*Solaris*)] -Parent=ELinks 0.10 -Platform=Solaris - -[ELinks/0.10* (*Unix*)] -Parent=ELinks 0.10 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.11 - -[ELinks 0.11] -Parent=DefaultProperties -Browser=ELinks -Version=0.11 -MinorVer=11 -Frames=true -Tables=true - -[ELinks (0.11*; *AIX*)] -Parent=ELinks 0.11 -Platform=AIX - -[ELinks (0.11*; *BeOS*)] -Parent=ELinks 0.11 -Platform=BeOS - -[ELinks (0.11*; *CygWin*)] -Parent=ELinks 0.11 -Platform=CygWin - -[ELinks (0.11*; *Darwin*)] -Parent=ELinks 0.11 -Platform=Darwin - -[ELinks (0.11*; *Digital Unix*)] -Parent=ELinks 0.11 -Platform=Digital Unix - -[ELinks (0.11*; *FreeBSD*)] -Parent=ELinks 0.11 -Platform=FreeBSD - -[ELinks (0.11*; *HPUX*)] -Parent=ELinks 0.11 -Platform=HP-UX - -[ELinks (0.11*; *IRIX*)] -Parent=ELinks 0.11 -Platform=IRIX - -[ELinks (0.11*; *Linux*)] -Parent=ELinks 0.11 -Platform=Linux - -[ELinks (0.11*; *NetBSD*)] -Parent=ELinks 0.11 -Platform=NetBSD - -[ELinks (0.11*; *OpenBSD*)] -Parent=ELinks 0.11 -Platform=OpenBSD - -[ELinks (0.11*; *OS/2*)] -Parent=ELinks 0.11 -Platform=OS/2 - -[ELinks (0.11*; *RISC*)] -Parent=ELinks 0.11 -Platform=RISC OS - -[ELinks (0.11*; *Solaris*)] -Parent=ELinks 0.11 -Platform=Solaris - -[ELinks (0.11*; *Unix*)] -Parent=ELinks 0.11 -Platform=Unix - -[ELinks/0.11* (*AIX*)] -Parent=ELinks 0.11 -Platform=AIX - -[ELinks/0.11* (*BeOS*)] -Parent=ELinks 0.11 -Platform=BeOS - -[ELinks/0.11* (*CygWin*)] -Parent=ELinks 0.11 -Platform=CygWin - -[ELinks/0.11* (*Darwin*)] -Parent=ELinks 0.11 -Platform=Darwin - -[ELinks/0.11* (*Digital Unix*)] -Parent=ELinks 0.11 -Platform=Digital Unix - -[ELinks/0.11* (*FreeBSD*)] -Parent=ELinks 0.11 -Platform=FreeBSD - -[ELinks/0.11* (*HPUX*)] -Parent=ELinks 0.11 -Platform=HP-UX - -[ELinks/0.11* (*IRIX*)] -Parent=ELinks 0.11 -Platform=IRIX - -[ELinks/0.11* (*Linux*)] -Parent=ELinks 0.11 -Platform=Linux - -[ELinks/0.11* (*NetBSD*)] -Parent=ELinks 0.11 -Platform=NetBSD - -[ELinks/0.11* (*OpenBSD*)] -Parent=ELinks 0.11 -Platform=OpenBSD - -[ELinks/0.11* (*OS/2*)] -Parent=ELinks 0.11 -Platform=OS/2 - -[ELinks/0.11* (*RISC*)] -Parent=ELinks 0.11 -Platform=RISC OS - -[ELinks/0.11* (*Solaris*)] -Parent=ELinks 0.11 -Platform=Solaris - -[ELinks/0.11* (*Unix*)] -Parent=ELinks 0.11 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.12 - -[ELinks 0.12] -Parent=DefaultProperties -Browser=ELinks -Version=0.12 -MinorVer=12 -Frames=true -Tables=true - -[ELinks (0.12*; *AIX*)] -Parent=ELinks 0.12 -Platform=AIX - -[ELinks (0.12*; *BeOS*)] -Parent=ELinks 0.12 -Platform=BeOS - -[ELinks (0.12*; *CygWin*)] -Parent=ELinks 0.12 -Platform=CygWin - -[ELinks (0.12*; *Darwin*)] -Parent=ELinks 0.12 -Platform=Darwin - -[ELinks (0.12*; *Digital Unix*)] -Parent=ELinks 0.12 -Platform=Digital Unix - -[ELinks (0.12*; *FreeBSD*)] -Parent=ELinks 0.12 -Platform=FreeBSD - -[ELinks (0.12*; *HPUX*)] -Parent=ELinks 0.12 -Platform=HP-UX - -[ELinks (0.12*; *IRIX*)] -Parent=ELinks 0.12 -Platform=IRIX - -[ELinks (0.12*; *Linux*)] -Parent=ELinks 0.12 -Platform=Linux - -[ELinks (0.12*; *NetBSD*)] -Parent=ELinks 0.12 -Platform=NetBSD - -[ELinks (0.12*; *OpenBSD*)] -Parent=ELinks 0.12 -Platform=OpenBSD - -[ELinks (0.12*; *OS/2*)] -Parent=ELinks 0.12 -Platform=OS/2 - -[ELinks (0.12*; *RISC*)] -Parent=ELinks 0.12 -Platform=RISC OS - -[ELinks (0.12*; *Solaris*)] -Parent=ELinks 0.12 -Platform=Solaris - -[ELinks (0.12*; *Unix*)] -Parent=ELinks 0.12 -Platform=Unix - -[ELinks/0.12* (*AIX*)] -Parent=ELinks 0.12 -Platform=AIX - -[ELinks/0.12* (*BeOS*)] -Parent=ELinks 0.12 -Platform=BeOS - -[ELinks/0.12* (*CygWin*)] -Parent=ELinks 0.12 -Platform=CygWin - -[ELinks/0.12* (*Darwin*)] -Parent=ELinks 0.12 -Platform=Darwin - -[ELinks/0.12* (*Digital Unix*)] -Parent=ELinks 0.12 -Platform=Digital Unix - -[ELinks/0.12* (*FreeBSD*)] -Parent=ELinks 0.12 -Platform=FreeBSD - -[ELinks/0.12* (*HPUX*)] -Parent=ELinks 0.12 -Platform=HP-UX - -[ELinks/0.12* (*IRIX*)] -Parent=ELinks 0.12 -Platform=IRIX - -[ELinks/0.12* (*Linux*)] -Parent=ELinks 0.12 -Platform=Linux - -[ELinks/0.12* (*NetBSD*)] -Parent=ELinks 0.12 -Platform=NetBSD - -[ELinks/0.12* (*OpenBSD*)] -Parent=ELinks 0.12 -Platform=OpenBSD - -[ELinks/0.12* (*OS/2*)] -Parent=ELinks 0.12 -Platform=OS/2 - -[ELinks/0.12* (*RISC*)] -Parent=ELinks 0.12 -Platform=RISC OS - -[ELinks/0.12* (*Solaris*)] -Parent=ELinks 0.12 -Platform=Solaris - -[ELinks/0.12* (*Unix*)] -Parent=ELinks 0.12 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ELinks 0.9 - -[ELinks 0.9] -Parent=DefaultProperties -Browser=ELinks -Version=0.9 -MinorVer=9 -Frames=true -Tables=true - -[ELinks (0.9*; *AIX*)] -Parent=ELinks 0.9 -Platform=AIX - -[ELinks (0.9*; *BeOS*)] -Parent=ELinks 0.9 -Platform=BeOS - -[ELinks (0.9*; *CygWin*)] -Parent=ELinks 0.9 -Platform=CygWin - -[ELinks (0.9*; *Darwin*)] -Parent=ELinks 0.9 -Platform=Darwin - -[ELinks (0.9*; *Digital Unix*)] -Parent=ELinks 0.9 -Platform=Digital Unix - -[ELinks (0.9*; *FreeBSD*)] -Parent=ELinks 0.9 -Platform=FreeBSD - -[ELinks (0.9*; *HPUX*)] -Parent=ELinks 0.9 -Platform=HP-UX - -[ELinks (0.9*; *IRIX*)] -Parent=ELinks 0.9 -Platform=IRIX - -[ELinks (0.9*; *Linux*)] -Parent=ELinks 0.9 -Platform=Linux - -[ELinks (0.9*; *NetBSD*)] -Parent=ELinks 0.9 -Platform=NetBSD - -[ELinks (0.9*; *OpenBSD*)] -Parent=ELinks 0.9 -Platform=OpenBSD - -[ELinks (0.9*; *OS/2*)] -Parent=ELinks 0.9 -Platform=OS/2 - -[ELinks (0.9*; *RISC*)] -Parent=ELinks 0.9 -Platform=RISC OS - -[ELinks (0.9*; *Solaris*)] -Parent=ELinks 0.9 -Platform=Solaris - -[ELinks (0.9*; *Unix*)] -Parent=ELinks 0.9 -Platform=Unix - -[ELinks/0.9* (*AIX*)] -Parent=ELinks 0.9 -Platform=AIX - -[ELinks/0.9* (*BeOS*)] -Parent=ELinks 0.9 -Platform=BeOS - -[ELinks/0.9* (*CygWin*)] -Parent=ELinks 0.9 -Platform=CygWin - -[ELinks/0.9* (*Darwin*)] -Parent=ELinks 0.9 -Platform=Darwin - -[ELinks/0.9* (*Digital Unix*)] -Parent=ELinks 0.9 -Platform=Digital Unix - -[ELinks/0.9* (*FreeBSD*)] -Parent=ELinks 0.9 -Platform=FreeBSD - -[ELinks/0.9* (*HPUX*)] -Parent=ELinks 0.9 -Platform=HP-UX - -[ELinks/0.9* (*IRIX*)] -Parent=ELinks 0.9 -Platform=IRIX - -[ELinks/0.9* (*Linux*)] -Parent=ELinks 0.9 -Platform=Linux - -[ELinks/0.9* (*NetBSD*)] -Parent=ELinks 0.9 -Platform=NetBSD - -[ELinks/0.9* (*OpenBSD*)] -Parent=ELinks 0.9 -Platform=OpenBSD - -[ELinks/0.9* (*OS/2*)] -Parent=ELinks 0.9 -Platform=OS/2 - -[ELinks/0.9* (*RISC*)] -Parent=ELinks 0.9 -Platform=RISC OS - -[ELinks/0.9* (*Solaris*)] -Parent=ELinks 0.9 -Platform=Solaris - -[ELinks/0.9* (*Unix*)] -Parent=ELinks 0.9 -Platform=Unix - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AppleWebKit - -[AppleWebKit] -Parent=DefaultProperties -Browser=AppleWebKit -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (KHTML, like Gecko)] -Parent=AppleWebKit - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Camino - -[Camino] -Parent=DefaultProperties -Browser=Camino -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.7*] -Parent=Camino -Version=0.7 -MajorVer=0 -MinorVer=7 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.8*] -Parent=Camino -Version=0.8 -MajorVer=0 -MinorVer=8 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/0.9*] -Parent=Camino -Version=0.9 -MajorVer=0 -MinorVer=9 -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.0*] -Parent=Camino -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.2*] -Parent=Camino -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.3*] -Parent=Camino -Version=1.3 -MajorVer=1 -MinorVer=3 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.4*] -Parent=Camino -Version=1.4 -MajorVer=1 -MinorVer=4 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.5*] -Parent=Camino -Version=1.5 -MajorVer=1 -MinorVer=5 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *Mac OS X*) Gecko/* Camino/1.6*] -Parent=Camino -Version=1.6 -MajorVer=1 -MinorVer=6 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Chimera - -[Chimera] -Parent=DefaultProperties -Browser=Chimera -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Chimera/*] -Parent=Chimera -Platform=MacOSX - -[Mozilla/5.0 Gecko/* Chimera/*] -Parent=Chimera - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Dillo - -[Dillo] -Parent=DefaultProperties -Browser=Dillo -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -CssVersion=2 -supportsCSS=true - -[Dillo/0.6*] -Parent=Dillo -Version=0.6 -MajorVer=0 -MinorVer=6 - -[Dillo/0.7*] -Parent=Dillo -Version=0.7 -MajorVer=0 -MinorVer=7 - -[Dillo/0.8*] -Parent=Dillo -Version=0.8 -MajorVer=0 -MinorVer=8 - -[Dillo/2.0] -Parent=Dillo -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Emacs/W3 - -[Emacs/W3] -Parent=DefaultProperties -Browser=Emacs/W3 -Frames=true -Tables=true -Cookies=true - -[Emacs/W3/2.* (Unix*] -Parent=Emacs/W3 -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Unix - -[Emacs/W3/2.* (X11*] -Parent=Emacs/W3 -Version=2.0 -MajorVer=2 -MinorVer=0 -Platform=Linux - -[Emacs/W3/3.* (Unix*] -Parent=Emacs/W3 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Unix - -[Emacs/W3/3.* (X11*] -Parent=Emacs/W3 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Linux - -[Emacs/W3/4.* (Unix*] -Parent=Emacs/W3 -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Unix - -[Emacs/W3/4.* (X11*] -Parent=Emacs/W3 -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; fantomas - -[fantomas] -Parent=DefaultProperties -Browser=fantomas -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/4.0 (cloakBrowser)] -Parent=fantomas -Browser=fantomas cloakBrowser - -[Mozilla/4.0 (fantomas shadowMaker Browser)] -Parent=fantomas -Browser=fantomas shadowMaker Browser - -[Mozilla/4.0 (fantomBrowser)] -Parent=fantomas -Browser=fantomas fantomBrowser - -[Mozilla/4.0 (fantomCrew Browser)] -Parent=fantomas -Browser=fantomas fantomCrew Browser - -[Mozilla/4.0 (stealthBrowser)] -Parent=fantomas -Browser=fantomas stealthBrowser - -[multiBlocker browser*] -Parent=fantomas -Browser=fantomas multiBlocker browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FrontPage - -[FrontPage] -Parent=DefaultProperties -Browser=FrontPage -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true - -[Mozilla/?* (compatible; MS FrontPage*)] -Parent=FrontPage - -[MSFrontPage/*] -Parent=FrontPage - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Galeon - -[Galeon] -Parent=DefaultProperties -Browser=Galeon -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/1.*] -Parent=Galeon -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (X11; U; Linux*) Gecko/* Galeon/2.*] -Parent=Galeon -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 Galeon/1.* (X11; Linux*)*] -Parent=Galeon -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 Galeon/2.* (X11; Linux*)*] -Parent=Galeon -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HP Secure Web Browser - -[HP Secure Web Browser] -Parent=DefaultProperties -Browser=HP Secure Web Browser -Platform=OpenVMS -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.0*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.1*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.2*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.3*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.4*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.4 -MajorVer=1 -MinorVer=4 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.5*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.5 -MajorVer=1 -MinorVer=5 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.6*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.6 -MajorVer=1 -MinorVer=6 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.7*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.7 -MajorVer=1 -MinorVer=7 - -[Mozilla/5.0 (X11; U; OpenVMS*; *; rv:1.8*) Gecko/*] -Parent=HP Secure Web Browser -Version=1.8 -MajorVer=1 -MinorVer=8 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IBrowse - -[IBrowse] -Parent=DefaultProperties -Browser=IBrowse -Platform=Amiga -Frames=true -Tables=true -Cookies=true -JavaScript=true - -[Arexx (compatible; MSIE 6.0; AmigaOS5.0) IBrowse 4.0] -Parent=IBrowse -Version=4.0 -MajorVer=4 -MinorVer=0 - -[IBrowse/1.22 (AmigaOS *)] -Parent=IBrowse -Version=1.22 -MajorVer=1 -MinorVer=22 - -[IBrowse/2.1 (AmigaOS *)] -Parent=IBrowse -Version=2.1 -MajorVer=2 -MinorVer=1 - -[IBrowse/2.2 (AmigaOS *)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=2 - -[IBrowse/2.3 (AmigaOS *)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=3 - -[Mozilla/* (Win98; I) IBrowse/2.1 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/* (Win98; I) IBrowse/2.2 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Mozilla/* (Win98; I) IBrowse/2.3 (AmigaOS 3.1)] -Parent=IBrowse -Version=2.3 -MajorVer=2 -MinorVer=3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iCab - -[iCab] -Parent=DefaultProperties -Browser=iCab -Frames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[iCab/2.7* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=Mac68K - -[iCab/2.7* (Macintosh; ?; PPC*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=MacPPC - -[iCab/2.8* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacOSX - -[iCab/2.8* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=Mac68K - -[iCab/2.8* (Macintosh; ?; PPC)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacPPC - -[iCab/2.9* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacOSX - -[iCab/2.9* (Macintosh; ?; 68K*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=Mac68K - -[iCab/2.9* (Macintosh; ?; PPC*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacPPC - -[iCab/3.0* (Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[iCab/3.0* (Macintosh; ?; PPC*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacPPC -CssVersion=2 -supportsCSS=true - -[iCab/4.0 (Macintosh; U; *Mac OS X)] -Parent=iCab -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (compatible; iCab 3.0*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacOSX -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; iCab 3.0*; Macintosh; ?; PPC*)] -Parent=iCab -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=MacPPC -CssVersion=2 -supportsCSS=true - -[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; 68K*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=Mac68K - -[Mozilla/4.5 (compatible; iCab 2.7*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.7 -MajorVer=2 -MinorVer=7 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; *Mac OS X*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacOSX - -[Mozilla/4.5 (compatible; iCab 2.8*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.8 -MajorVer=2 -MinorVer=8 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacOSX - -[Mozilla/4.5 (compatible; iCab 2.9*; Macintosh; ?; PPC*)] -Parent=iCab -Version=2.9 -MajorVer=2 -MinorVer=9 -Platform=MacPPC - -[Mozilla/4.5 (compatible; iCab 4.2*; Macintosh; *Mac OS X*)] -Parent=iCab -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=MacOSX - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; iSiloX - -[iSiloX] -Parent=DefaultProperties -Browser=iSiloX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -Crawler=true -CssVersion=2 -supportsCSS=true - -[iSiloX/4.0* MacOS] -Parent=iSiloX -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacPPC - -[iSiloX/4.0* Windows/32] -Parent=iSiloX -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=Win32 -Win32=true - -[iSiloX/4.1* MacOS] -Parent=iSiloX -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=MacPPC - -[iSiloX/4.1* Windows/32] -Parent=iSiloX -Version=4.1 -MajorVer=4 -MinorVer=1 -Platform=Win32 -Win32=true - -[iSiloX/4.2* MacOS] -Parent=iSiloX -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=MacPPC - -[iSiloX/4.2* Windows/32] -Parent=iSiloX -Version=4.2 -MajorVer=4 -MinorVer=2 -Platform=Win32 -Win32=true - -[iSiloX/4.3* MacOS] -Parent=iSiloX -Version=4.3 -MajorVer=4 -MinorVer=4 -Platform=MacOSX - -[iSiloX/4.3* Windows/32] -Parent=iSiloX -Version=4.3 -MajorVer=4 -MinorVer=3 -Platform=Win32 -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Lycoris Desktop/LX - -[Lycoris Desktop/LX] -Parent=DefaultProperties -Browser=Lycoris Desktop/LX -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -Crawler=true - -[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*: Desktop/LX Amethyst) Gecko/*] -Parent=Lycoris Desktop/LX -Version=1.1 -MajorVer=1 -MinorVer=1 -Platform=Linux - -[Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.*; Desktop/LX Amethyst) Gecko/*] -Parent=Lycoris Desktop/LX -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mosaic - -[Mosaic] -Parent=DefaultProperties -Browser=Mosaic -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[Mozilla/4.0 (VMS_Mosaic)] -Parent=Mosaic -Platform=OpenVMS - -[VMS_Mosaic/3.7*] -Parent=Mosaic -Version=3.7 -MajorVer=3 -MinorVer=7 -Platform=OpenVMS - -[VMS_Mosaic/3.8*] -Parent=Mosaic -Version=3.8 -MajorVer=3 -MinorVer=8 -Platform=OpenVMS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NetPositive - -[NetPositive] -Parent=DefaultProperties -Browser=NetPositive -Platform=BeOS -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true - -[*NetPositive/2.2*] -Parent=NetPositive -Version=2.2 -MajorVer=2 -MinorVer=2 - -[*NetPositive/2.2*BeOS*] -Parent=NetPositive -Version=2.2 -MajorVer=2 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OmniWeb - -[OmniWeb] -Parent=DefaultProperties -Browser=OmniWeb -Platform=MacOSX -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -isMobileDevice=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v4*] -Parent=OmniWeb -Version=4.5 -MajorVer=4 -MinorVer=5 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v5*] -Parent=OmniWeb -Version=5. -MajorVer=5 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; *Mac OS X; *) AppleWebKit/* (*) OmniWeb/v6*] -Parent=OmniWeb -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/4*] -Parent=OmniWeb -Version=4.0 -MajorVer=4 -MinorVer=0 -Platform=MacPPC - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/5*] -Parent=OmniWeb -Version=5.0 -MajorVer=5 -MinorVer=0 -Platform=MacOSX - -[Mozilla/* (Macintosh; ?; PPC) OmniWeb/6*] -Parent=OmniWeb -Version=6.0 -MajorVer=6 -MinorVer=0 -Platform=MacPPC - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.34] -Parent=OmniWeb -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.34] -Parent=OmniWeb -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v607] -Parent=OmniWeb -Version=5.5 -MajorVer=5 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/420+ (KHTML, like Gecko, Safari/420) OmniWeb/v607] -Parent=OmniWeb -Version=5.5 -MajorVer=5 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/522+ (KHTML, like Gecko, Safari/522) OmniWeb/v613] -Parent=OmniWeb -Version=5.6 -MajorVer=5 -MinorVer=6 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/522+ (KHTML, like Gecko, Safari/522) OmniWeb/v613] -Parent=OmniWeb -Version=5.6 -MajorVer=5 -MinorVer=6 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v496] -Parent=OmniWeb -Version=4.5 -MajorVer=4 -MinorVer=5 - -[Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558.36 ] -Parent=OmniWeb -Version=5.0 -MajorVer=5 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Shiira - -[Shiira] -Parent=DefaultProperties -Browser=Shiira -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/0.9*] -Parent=Shiira -Version=0.9 -MajorVer=0 -MinorVer=9 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.0*] -Parent=Shiira -Version=1.0 -MajorVer=1 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.1*] -Parent=Shiira -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/1.2*] -Parent=Shiira -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/2.1*] -Parent=Shiira -Version=2.1 -MajorVer=2 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Shiira/2.2*] -Parent=Shiira -Version=2.2 -MajorVer=2 -MinorVer=2 - -[Windows Maker] -Parent=DefaultProperties -Browser=WMaker -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -VBScript=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[WMaker*] -Parent=Windows Maker - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.0 - -[K-Meleon 1.0] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.0 -MajorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.0*] -Parent=K-Meleon 1.0 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.1 - -[K-Meleon 1.1] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.1 -MajorVer=1 -MinorVer=1 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.1*] -Parent=K-Meleon 1.1 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; K-Meleon 1.5 - -[K-Meleon 1.5] -Parent=DefaultProperties -Browser=K-Meleon -Version=1.5 -MajorVer=1 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* K-Meleon?1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Platform=WinVista - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* K-Meleon/1.5*] -Parent=K-Meleon 1.5 -Version=1.0 -MajorVer=1 -MinorVer=0 -Platform=WinNT -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 3.0 - -[Konqueror 3.0] -Parent=DefaultProperties -Browser=Konqueror -Platform=Linux -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[*Konqueror/3.0*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -IFrames=false - -[*Konqueror/3.0*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=FreeBSD -IFrames=false - -[*Konqueror/3.0*Linux*] -Parent=Konqueror 3.0 -Version=3.0 -MajorVer=3 -MinorVer=0 -Platform=Linux -IFrames=false - -[*Konqueror/3.1*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 - -[*Konqueror/3.1*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 -Platform=FreeBSD - -[*Konqueror/3.1*Linux*] -Parent=Konqueror 3.0 -Version=3.1 -MajorVer=3 -MinorVer=1 - -[*Konqueror/3.2*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 - -[*Konqueror/3.2*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 -Platform=FreeBSD - -[*Konqueror/3.2*Linux*] -Parent=Konqueror 3.0 -Version=3.2 -MajorVer=3 -MinorVer=2 -Platform=Linux - -[*Konqueror/3.3*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 - -[*Konqueror/3.3*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=FreeBSD - -[*Konqueror/3.3*Linux*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=Linux - -[*Konqueror/3.3*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.3 -MajorVer=3 -MinorVer=3 -Platform=OpenBSD - -[*Konqueror/3.4*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 - -[*Konqueror/3.4*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=FreeBSD - -[*Konqueror/3.4*Linux*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=Linux - -[*Konqueror/3.4*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.4 -MajorVer=3 -MinorVer=4 -Platform=OpenBSD - -[*Konqueror/3.5*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 - -[*Konqueror/3.5*FreeBSD*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=FreeBSD - -[*Konqueror/3.5*Linux*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=Linux - -[*Konqueror/3.5*OpenBSD*] -Parent=Konqueror 3.0 -Version=3.5 -MajorVer=3 -MinorVer=5 -Platform=OpenBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.0 - -[Konqueror 4.0] -Parent=DefaultProperties -Browser=Konqueror -Version=4.0 -MajorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.0*; Debian) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; *Linux) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; FreeBSD) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.0.*; NetBSD) KHTML/4.* (like Gecko)] -Parent=Konqueror 4.0 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.1 - -[Konqueror 4.1] -Parent=DefaultProperties -Browser=Konqueror -Version=4.1 -MajorVer=4 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.1*; *Linux*) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.1*; Debian) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.1*; FreeBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.1*; NetBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.1 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Konqueror 4.2 - -[Konqueror 4.2] -Parent=DefaultProperties -Browser=Konqueror -Version=4.2 -MajorVer=4 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (compatible; Konqueror/4.2*; *Linux*) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=Linux - -[Mozilla/5.0 (compatible; Konqueror/4.2*; Debian) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=Debian - -[Mozilla/5.0 (compatible; Konqueror/4.2*; FreeBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=FreeBSD - -[Mozilla/5.0 (compatible; Konqueror/4.2*; NetBSD) KHTML/4.* (like Gecko)*] -Parent=Konqueror 4.2 -Platform=NetBSD - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari - -[Safari] -Parent=DefaultProperties -Browser=Safari -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/100*] -Parent=Safari -Version=1.1 -MajorVer=1 -MinorVer=1 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/125*] -Parent=Safari -Version=1.2 -MajorVer=1 -MinorVer=2 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/312*] -Parent=Safari -Version=1.3 -MajorVer=1 -MinorVer=3 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/412*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/416*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/417*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/418*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/419*] -Parent=Safari -Version=2.0 -MajorVer=2 -MinorVer=0 - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/52*] -Parent=Safari -Beta=true - -[Mozilla/5.0 (Macintosh; *Mac OS X*) AppleWebKit/* (*) Safari/85*] -Parent=Safari -Version=1.0 -MajorVer=1 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.0 - -[Safari 3.0] -Parent=DefaultProperties -Browser=Safari -Version=3.0 -MajorVer=3 -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.0* Safari/*] -Parent=Safari 3.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.1 - -[Safari 3.1] -Parent=DefaultProperties -Browser=Safari -Version=3.1 -MajorVer=3 -MinorVer=1 -Platform=MacOSX -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.1* Safari/*] -Parent=Safari 3.1 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 3.2 - -[Safari 3.2] -Parent=DefaultProperties -Browser=Safari -Version=3.2 -MajorVer=3 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/3.2* Safari/*] -Parent=Safari 3.2 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Safari 4.0 - -[Safari 4.0] -Parent=DefaultProperties -Browser=Safari -Version=4.0 -MajorVer=4 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *) AppleWebKit/* (KHTML, like Gecko) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *) AppleWebKit/* (KHTML, like Gecko) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 7.0; *) AppleWebKit/* (*) Version/4 Public Beta Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; Windows NT 7.0; *) AppleWebKit/* (*) Version/4.0* Safari/*] -Parent=Safari 4.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 10.0 - -[Opera 10.0] -Parent=DefaultProperties -Browser=Opera -Version=10.0 -MajorVer=10 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 10.0*] -Parent=Opera 10.0 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 10.0*] -Parent=Opera 10.0 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 10.0*] -Parent=Opera 10.0 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 10.0*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (Linux*)*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (Macintosh; *Mac OS X;*)*] -Parent=Opera 10.0 -Platform=MacOSX - -[Opera/10.0* (Windows 95*)*] -Parent=Opera 10.0 -Platform=Win95 -Win32=true - -[Opera/10.0* (Windows 98*)*] -Parent=Opera 10.0 -Platform=Win98 -Win32=true - -[Opera/10.0* (Windows CE*)*] -Parent=Opera 10.0 -Platform=WinCE -Win32=true - -[Opera/10.0* (Windows ME*)*] -Parent=Opera 10.0 -Platform=WinME -Win32=true - -[Opera/10.0* (Windows NT 4.0*)*] -Parent=Opera 10.0 -Platform=WinNT -Win32=true - -[Opera/10.0* (Windows NT 5.0*)*] -Parent=Opera 10.0 -Platform=Win2000 -Win32=true - -[Opera/10.0* (Windows NT 5.1*)*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Opera/10.0* (Windows NT 5.2*)*] -Parent=Opera 10.0 -Platform=Win2003 -Win32=true - -[Opera/10.0* (Windows NT 6.0*)*] -Parent=Opera 10.0 -Platform=WinVista -Win32=true - -[Opera/10.0* (Windows NT 6.1*)*] -Parent=Opera 10.0 -Platform=Win7 - -[Opera/10.0* (Windows XP*)*] -Parent=Opera 10.0 -Platform=WinXP -Win32=true - -[Opera/10.0* (X11; FreeBSD*)*] -Parent=Opera 10.0 -Platform=FreeBSD - -[Opera/10.0* (X11; Linux*)*] -Parent=Opera 10.0 -Platform=Linux - -[Opera/10.0* (X11; SunOS*)*] -Parent=Opera 10.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.0 - -[Opera 7.0] -Parent=DefaultProperties -Browser=Opera -Version=7.0 -MajorVer=7 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/3.0 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/3.0 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/3.0 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/3.0 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/3.0 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/3.0 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 2000) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 95) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows 98) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows ME) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 4.0) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.0) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows XP) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.78 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.78 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/4.78 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/4.78 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/4.78 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/4.78 (Windows NT 5.1; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/4.78 (Windows Windows NT 5.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/4.78 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows 2000; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows 95; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows 98; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows ME; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows NT 4.0; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows NT 5.1; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows XP; ?) Opera 7.0*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Opera/7.0* (Windows 2000; ?)*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Opera/7.0* (Windows 95; ?)*] -Parent=Opera 7.0 -Platform=Win95 -Win32=true - -[Opera/7.0* (Windows 98; ?)*] -Parent=Opera 7.0 -Platform=Win98 -Win32=true - -[Opera/7.0* (Windows ME; ?)*] -Parent=Opera 7.0 -Platform=WinME -Win32=true - -[Opera/7.0* (Windows NT 4.0; ?)*] -Parent=Opera 7.0 -Platform=WinNT -Win32=true - -[Opera/7.0* (Windows NT 5.0; ?)*] -Parent=Opera 7.0 -Platform=Win2000 -Win32=true - -[Opera/7.0* (Windows NT 5.1; ?)*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -[Opera/7.0* (Windows XP; ?)*] -Parent=Opera 7.0 -Platform=WinXP -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.1 - -[Opera 7.1] -Parent=DefaultProperties -Browser=Opera -Version=7.1 -MajorVer=7 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows 2000; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.1*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.1*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Opera/7.1* (Linux*; ?)*] -Parent=Opera 7.1 -Platform=Linux - -[Opera/7.1* (Windows 95; ?)*] -Parent=Opera 7.1 -Platform=Win95 -Win32=true - -[Opera/7.1* (Windows 98; ?)*] -Parent=Opera 7.1 -Platform=Win98 -Win32=true - -[Opera/7.1* (Windows ME; ?)*] -Parent=Opera 7.1 -Platform=WinME -Win32=true - -[Opera/7.1* (Windows NT 4.0; ?)*] -Parent=Opera 7.1 -Platform=WinNT -Win32=true - -[Opera/7.1* (Windows NT 5.0; ?)*] -Parent=Opera 7.1 -Platform=Win2000 -Win32=true - -[Opera/7.1* (Windows NT 5.1; ?)*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -[Opera/7.1* (Windows XP; ?)*] -Parent=Opera 7.1 -Platform=WinXP -Win32=true - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.2 - -[Opera 7.2] -Parent=DefaultProperties -Browser=Opera -Version=7.2 -MajorVer=7 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.2*] -Parent=Opera 7.2 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows 2000; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.2*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Opera/7.2* (Linux*; ?)*] -Parent=Opera 7.2 -Platform=Linux - -[Opera/7.2* (Windows 95; ?)*] -Parent=Opera 7.2 -Platform=Win95 -Win32=true - -[Opera/7.2* (Windows 98; ?)*] -Parent=Opera 7.2 -Platform=Win98 -Win32=true - -[Opera/7.2* (Windows ME; ?)*] -Parent=Opera 7.2 -Platform=WinME -Win32=true - -[Opera/7.2* (Windows NT 4.0; ?)*] -Parent=Opera 7.2 -Platform=WinNT -Win32=true - -[Opera/7.2* (Windows NT 5.0; ?)*] -Parent=Opera 7.2 -Platform=Win2000 -Win32=true - -[Opera/7.2* (Windows NT 5.1; ?)*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Opera/7.2* (Windows NT 5.2; ?)*] -Parent=Opera 7.2 -Platform=Win2003 -Win32=true - -[Opera/7.2* (Windows XP; ?)*] -Parent=Opera 7.2 -Platform=WinXP -Win32=true - -[Opera/7.2* (X11; FreeBSD*; ?)*] -Parent=Opera 7.2 -Platform=FreeBSD - -[Opera/7.2* (X11; Linux*; ?)*] -Parent=Opera 7.2 -Platform=Linux - -[Opera/7.2* (X11; SunOS*)*] -Parent=Opera 7.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.5 - -[Opera 7.5] -Parent=DefaultProperties -Browser=Opera -Version=7.5 -MajorVer=7 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.5*] -Parent=Opera 7.5 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; ?) Opera 7.5*] -Parent=Opera 7.5 -Platform=Linux - -[Opera/7.5* (Linux*; ?)*] -Parent=Opera 7.5 -Platform=Linux - -[Opera/7.5* (Macintosh; *Mac OS X; ?)*] -Parent=Opera 7.5 -Platform=MacOSX - -[Opera/7.5* (Windows 95; ?)*] -Parent=Opera 7.5 -Platform=Win95 -Win32=true - -[Opera/7.5* (Windows 98; ?)*] -Parent=Opera 7.5 -Platform=Win98 -Win32=true - -[Opera/7.5* (Windows ME; ?)*] -Parent=Opera 7.5 -Platform=WinME -Win32=true - -[Opera/7.5* (Windows NT 4.0; ?)*] -Parent=Opera 7.5 -Platform=WinNT -Win32=true - -[Opera/7.5* (Windows NT 5.0; ?)*] -Parent=Opera 7.5 -Platform=Win2000 -Win32=true - -[Opera/7.5* (Windows NT 5.1; ?)*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Opera/7.5* (Windows NT 5.2; ?)*] -Parent=Opera 7.5 -Platform=Win2003 -Win32=true - -[Opera/7.5* (Windows XP; ?)*] -Parent=Opera 7.5 -Platform=WinXP -Win32=true - -[Opera/7.5* (X11; FreeBSD*; ?)*] -Parent=Opera 7.5 -Platform=FreeBSD - -[Opera/7.5* (X11; Linux*; ?)*] -Parent=Opera 7.5 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 7.6 - -[Opera 7.6] -Parent=DefaultProperties -Browser=Opera -Version=7.6 -MajorVer=7 -MinorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 7.6*] -Parent=Opera 7.6 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; U) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; U) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; ?) Opera 7.6*] -Parent=Opera 7.6 -Platform=Linux - -[Opera/7.6* (Linux*)*] -Parent=Opera 7.6 -Platform=Linux - -[Opera/7.6* (Macintosh; *Mac OS X; ?)*] -Parent=Opera 7.6 -Platform=MacOSX - -[Opera/7.6* (Windows 95*)*] -Parent=Opera 7.6 -Platform=Win95 -Win32=true - -[Opera/7.6* (Windows 98*)*] -Parent=Opera 7.6 -Platform=Win98 -Win32=true - -[Opera/7.6* (Windows ME*)*] -Parent=Opera 7.6 -Platform=WinME -Win32=true - -[Opera/7.6* (Windows NT 4.0*)*] -Parent=Opera 7.6 -Platform=WinNT -Win32=true - -[Opera/7.6* (Windows NT 5.0*)*] -Parent=Opera 7.6 -Platform=Win2000 -Win32=true - -[Opera/7.6* (Windows NT 5.1*)*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Opera/7.6* (Windows NT 5.2*)*] -Parent=Opera 7.6 -Platform=Win2003 -Win32=true - -[Opera/7.6* (Windows XP*)*] -Parent=Opera 7.6 -Platform=WinXP -Win32=true - -[Opera/7.6* (X11; FreeBSD*)*] -Parent=Opera 7.6 -Platform=FreeBSD - -[Opera/7.6* (X11; Linux*)*] -Parent=Opera 7.6 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.0 - -[Opera 8.0] -Parent=DefaultProperties -Browser=Opera -Version=8.0 -MajorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacOSX - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.0*] -Parent=Opera 8.0 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.0*] -Parent=Opera 8.0 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.0*] -Parent=Opera 8.0 -Platform=Linux - -[Opera/8.0* (Linux*)*] -Parent=Opera 8.0 -Platform=Linux - -[Opera/8.0* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.0 -Platform=MacOSX - -[Opera/8.0* (Windows 95*)*] -Parent=Opera 8.0 -Platform=Win95 -Win32=true - -[Opera/8.0* (Windows 98*)*] -Parent=Opera 8.0 -Platform=Win98 -Win32=true - -[Opera/8.0* (Windows CE*)*] -Parent=Opera 8.0 -Platform=WinCE -Win32=true - -[Opera/8.0* (Windows ME*)*] -Parent=Opera 8.0 -Platform=WinME -Win32=true - -[Opera/8.0* (Windows NT 4.0*)*] -Parent=Opera 8.0 -Platform=WinNT -Win32=true - -[Opera/8.0* (Windows NT 5.0*)*] -Parent=Opera 8.0 -Platform=Win2000 -Win32=true - -[Opera/8.0* (Windows NT 5.1*)*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Opera/8.0* (Windows NT 5.2*)*] -Parent=Opera 8.0 -Platform=Win2003 -Win32=true - -[Opera/8.0* (Windows XP*)*] -Parent=Opera 8.0 -Platform=WinXP -Win32=true - -[Opera/8.0* (X11; FreeBSD*)*] -Parent=Opera 8.0 -Platform=FreeBSD - -[Opera/8.0* (X11; Linux*)*] -Parent=Opera 8.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.1 - -[Opera 8.1] -Parent=DefaultProperties -Browser=Opera -Version=8.1 -MajorVer=8 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.1*] -Parent=Opera 8.1 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.1*] -Parent=Opera 8.1 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.1*] -Parent=Opera 8.1 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.1*] -Parent=Opera 8.1 -Platform=Linux - -[Opera/8.1* (Linux*)*] -Parent=Opera 8.1 -Platform=Linux - -[Opera/8.1* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.1 -Platform=MacOSX - -[Opera/8.1* (Windows 95*)*] -Parent=Opera 8.1 -Platform=Win95 -Win32=true - -[Opera/8.1* (Windows 98*)*] -Parent=Opera 8.1 -Platform=Win98 -Win32=true - -[Opera/8.1* (Windows CE*)*] -Parent=Opera 8.1 -Platform=WinCE -Win32=true - -[Opera/8.1* (Windows ME*)*] -Parent=Opera 8.1 -Platform=WinME -Win32=true - -[Opera/8.1* (Windows NT 4.0*)*] -Parent=Opera 8.1 -Platform=WinNT -Win32=true - -[Opera/8.1* (Windows NT 5.0*)*] -Parent=Opera 8.1 -Platform=Win2000 -Win32=true - -[Opera/8.1* (Windows NT 5.1*)*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Opera/8.1* (Windows NT 5.2*)*] -Parent=Opera 8.1 -Platform=Win2003 -Win32=true - -[Opera/8.1* (Windows XP*)*] -Parent=Opera 8.1 -Platform=WinXP -Win32=true - -[Opera/8.1* (X11; FreeBSD*)*] -Parent=Opera 8.1 -Platform=FreeBSD - -[Opera/8.1* (X11; Linux*)*] -Parent=Opera 8.1 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 8.5 - -[Opera 8.5] -Parent=DefaultProperties -Browser=Opera -Version=8.5 -MajorVer=8 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (compatible; MSIE ?.*; Linux*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC Mac OS X;*) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (compatible; MSIE ?.*; Mac_PowerPC) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacPPC - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 2000*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 95*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows 98*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows CE) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinCE -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows ME*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 4.0*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.0*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.1*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows NT 5.2*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; Windows XP*) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (compatible; MSIE ?.*; X11; FreeBSD*) Opera 8.5*] -Parent=Opera 8.5 -Platform=FreeBSD - -[Mozilla/?.* (compatible; MSIE ?.*; X11; Linux*) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Mozilla/?.* (Macintosh; *Mac OS X; ?) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (Macintosh; PPC Mac OS X;*) Opera 8.5*] -Parent=Opera 8.5 -Platform=MacOSX - -[Mozilla/?.* (Windows 2000; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows 95; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Mozilla/?.* (Windows 98; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Mozilla/?.* (Windows ME; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Mozilla/?.* (Windows NT 4.0; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Mozilla/?.* (Windows NT 5.0; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Mozilla/?.* (Windows NT 5.1; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Mozilla/?.* (Windows NT 5.2; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Mozilla/?.* (X11; Linux*; *) Opera 8.5*] -Parent=Opera 8.5 -Platform=Linux - -[Opera/8.5* (Linux*)*] -Parent=Opera 8.5 -Platform=Linux - -[Opera/8.5* (Macintosh; *Mac OS X; *)*] -Parent=Opera 8.5 -Platform=MacOSX - -[Opera/8.5* (Windows 95*)*] -Parent=Opera 8.5 -Platform=Win95 -Win32=true - -[Opera/8.5* (Windows 98*)*] -Parent=Opera 8.5 -Platform=Win98 -Win32=true - -[Opera/8.5* (Windows CE*)*] -Parent=Opera 8.5 -Platform=WinCE -Win32=true - -[Opera/8.5* (Windows ME*)*] -Parent=Opera 8.5 -Platform=WinME -Win32=true - -[Opera/8.5* (Windows NT 4.0*)*] -Parent=Opera 8.5 -Platform=WinNT -Win32=true - -[Opera/8.5* (Windows NT 5.0*)*] -Parent=Opera 8.5 -Platform=Win2000 -Win32=true - -[Opera/8.5* (Windows NT 5.1*)*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Opera/8.5* (Windows NT 5.2*)*] -Parent=Opera 8.5 -Platform=Win2003 -Win32=true - -[Opera/8.5* (Windows XP*)*] -Parent=Opera 8.5 -Platform=WinXP -Win32=true - -[Opera/8.5* (X11; FreeBSD*)*] -Parent=Opera 8.5 -Platform=FreeBSD - -[Opera/8.5* (X11; Linux*)*] -Parent=Opera 8.5 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.0 - -[Opera 9.0] -Parent=DefaultProperties -Browser=Opera -Version=9.0 -MajorVer=9 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.0*] -Parent=Opera 9.0 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.0*] -Parent=Opera 9.0 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.0*] -Parent=Opera 9.0 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Mozilla/* (X11; Linux*) Opera 9.0*] -Parent=Opera 9.0 -Platform=Linux - -[Opera/9.0* (Linux*)*] -Parent=Opera 9.0 -Platform=Linux - -[Opera/9.0* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.0 -Platform=MacOSX - -[Opera/9.0* (Windows 95*)*] -Parent=Opera 9.0 -Platform=Win95 -Win32=true - -[Opera/9.0* (Windows 98*)*] -Parent=Opera 9.0 -Platform=Win98 -Win32=true - -[Opera/9.0* (Windows CE*)*] -Parent=Opera 9.0 -Platform=WinCE -Win32=true - -[Opera/9.0* (Windows ME*)*] -Parent=Opera 9.0 -Platform=WinME -Win32=true - -[Opera/9.0* (Windows NT 4.0*)*] -Parent=Opera 9.0 -Platform=WinNT -Win32=true - -[Opera/9.0* (Windows NT 5.0*)*] -Parent=Opera 9.0 -Platform=Win2000 -Win32=true - -[Opera/9.0* (Windows NT 5.1*)*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Opera/9.0* (Windows NT 5.2*)*] -Parent=Opera 9.0 -Platform=Win2003 -Win32=true - -[Opera/9.0* (Windows NT 6.0*)*] -Parent=Opera 9.0 -Platform=WinVista -Win32=true - -[Opera/9.0* (Windows XP*)*] -Parent=Opera 9.0 -Platform=WinXP -Win32=true - -[Opera/9.0* (X11; FreeBSD*)*] -Parent=Opera 9.0 -Platform=FreeBSD - -[Opera/9.0* (X11; Linux*)*] -Parent=Opera 9.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.1 - -[Opera 9.1] -Parent=DefaultProperties -Browser=Opera -Version=9.1 -MajorVer=9 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.1*] -Parent=Opera 9.1 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.1*] -Parent=Opera 9.1 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.1*] -Parent=Opera 9.1 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Mozilla/* (X11; Linux*) Opera 9.1*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (Linux*)*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.1 -Platform=MacOSX - -[Opera/9.1* (Windows 95*)*] -Parent=Opera 9.1 -Platform=Win95 -Win32=true - -[Opera/9.1* (Windows 98*)*] -Parent=Opera 9.1 -Platform=Win98 -Win32=true - -[Opera/9.1* (Windows CE*)*] -Parent=Opera 9.1 -Platform=WinCE -Win32=true - -[Opera/9.1* (Windows ME*)*] -Parent=Opera 9.1 -Platform=WinME -Win32=true - -[Opera/9.1* (Windows NT 4.0*)*] -Parent=Opera 9.1 -Platform=WinNT -Win32=true - -[Opera/9.1* (Windows NT 5.0*)*] -Parent=Opera 9.1 -Platform=Win2000 -Win32=true - -[Opera/9.1* (Windows NT 5.1*)*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Opera/9.1* (Windows NT 5.2*)*] -Parent=Opera 9.1 -Platform=Win2003 -Win32=true - -[Opera/9.1* (Windows NT 6.0*)*] -Parent=Opera 9.1 -Platform=WinVista -Win32=true - -[Opera/9.1* (Windows XP*)*] -Parent=Opera 9.1 -Platform=WinXP -Win32=true - -[Opera/9.1* (X11; FreeBSD*)*] -Parent=Opera 9.1 -Platform=FreeBSD - -[Opera/9.1* (X11; Linux*)*] -Parent=Opera 9.1 -Platform=Linux - -[Opera/9.1* (X11; SunOS*)*] -Parent=Opera 9.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.2 - -[Opera 9.2] -Parent=DefaultProperties -Browser=Opera -Version=9.2 -MajorVer=9 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.2*] -Parent=Opera 9.2 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.2*] -Parent=Opera 9.2 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.2*] -Parent=Opera 9.2 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.2*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (Linux*)*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.2 -Platform=MacOSX - -[Opera/9.2* (Windows 95*)*] -Parent=Opera 9.2 -Platform=Win95 -Win32=true - -[Opera/9.2* (Windows 98*)*] -Parent=Opera 9.2 -Platform=Win98 -Win32=true - -[Opera/9.2* (Windows CE*)*] -Parent=Opera 9.2 -Platform=WinCE -Win32=true - -[Opera/9.2* (Windows ME*)*] -Parent=Opera 9.2 -Platform=WinME -Win32=true - -[Opera/9.2* (Windows NT 4.0*)*] -Parent=Opera 9.2 -Platform=WinNT -Win32=true - -[Opera/9.2* (Windows NT 5.0*)*] -Parent=Opera 9.2 -Platform=Win2000 -Win32=true - -[Opera/9.2* (Windows NT 5.1*)*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Opera/9.2* (Windows NT 5.2*)*] -Parent=Opera 9.2 -Platform=Win2003 -Win32=true - -[Opera/9.2* (Windows NT 6.0*)*] -Parent=Opera 9.2 -Platform=WinVista -Win32=true - -[Opera/9.2* (Windows NT 6.1*)*] -Parent=Opera 9.2 -Platform=Win7 - -[Opera/9.2* (Windows XP*)*] -Parent=Opera 9.2 -Platform=WinXP -Win32=true - -[Opera/9.2* (X11; FreeBSD*)*] -Parent=Opera 9.2 -Platform=FreeBSD - -[Opera/9.2* (X11; Linux*)*] -Parent=Opera 9.2 -Platform=Linux - -[Opera/9.2* (X11; SunOS*)*] -Parent=Opera 9.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.3 - -[Opera 9.3] -Parent=DefaultProperties -Browser=Opera -Version=9.3 -MajorVer=9 -MinorVer=3 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.3*] -Parent=Opera 9.3 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.3*] -Parent=Opera 9.3 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.3*] -Parent=Opera 9.3 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.3*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (Linux*)*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.3 -Platform=MacOSX - -[Opera/9.3* (Windows 95*)*] -Parent=Opera 9.3 -Platform=Win95 -Win32=true - -[Opera/9.3* (Windows 98*)*] -Parent=Opera 9.3 -Platform=Win98 -Win32=true - -[Opera/9.3* (Windows CE*)*] -Parent=Opera 9.3 -Platform=WinCE -Win32=true - -[Opera/9.3* (Windows ME*)*] -Parent=Opera 9.3 -Platform=WinME -Win32=true - -[Opera/9.3* (Windows NT 4.0*)*] -Parent=Opera 9.3 -Platform=WinNT -Win32=true - -[Opera/9.3* (Windows NT 5.0*)*] -Parent=Opera 9.3 -Platform=Win2000 -Win32=true - -[Opera/9.3* (Windows NT 5.1*)*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Opera/9.3* (Windows NT 5.2*)*] -Parent=Opera 9.3 -Platform=Win2003 -Win32=true - -[Opera/9.3* (Windows NT 6.0*)*] -Parent=Opera 9.3 -Platform=WinVista -Win32=true - -[Opera/9.3* (Windows NT 6.1*)*] -Parent=Opera 9.3 -Platform=Win7 - -[Opera/9.3* (Windows XP*)*] -Parent=Opera 9.3 -Platform=WinXP -Win32=true - -[Opera/9.3* (X11; FreeBSD*)*] -Parent=Opera 9.3 -Platform=FreeBSD - -[Opera/9.3* (X11; Linux*)*] -Parent=Opera 9.3 -Platform=Linux - -[Opera/9.3* (X11; SunOS*)*] -Parent=Opera 9.3 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.4 - -[Opera 9.4] -Parent=DefaultProperties -Browser=Opera -Version=9.4 -MajorVer=9 -MinorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.4*] -Parent=Opera 9.4 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.4*] -Parent=Opera 9.4 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.4*] -Parent=Opera 9.4 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.4*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (Linux*)*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.4 -Platform=MacOSX - -[Opera/9.4* (Windows 95*)*] -Parent=Opera 9.4 -Platform=Win95 -Win32=true - -[Opera/9.4* (Windows 98*)*] -Parent=Opera 9.4 -Platform=Win98 -Win32=true - -[Opera/9.4* (Windows CE*)*] -Parent=Opera 9.4 -Platform=WinCE -Win32=true - -[Opera/9.4* (Windows ME*)*] -Parent=Opera 9.4 -Platform=WinME -Win32=true - -[Opera/9.4* (Windows NT 4.0*)*] -Parent=Opera 9.4 -Platform=WinNT -Win32=true - -[Opera/9.4* (Windows NT 5.0*)*] -Parent=Opera 9.4 -Platform=Win2000 -Win32=true - -[Opera/9.4* (Windows NT 5.1*)*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Opera/9.4* (Windows NT 5.2*)*] -Parent=Opera 9.4 -Platform=Win2003 -Win32=true - -[Opera/9.4* (Windows NT 6.0*)*] -Parent=Opera 9.4 -Platform=WinVista -Win32=true - -[Opera/9.4* (Windows NT 6.1*)*] -Parent=Opera 9.4 -Platform=Win7 - -[Opera/9.4* (Windows XP*)*] -Parent=Opera 9.4 -Platform=WinXP -Win32=true - -[Opera/9.4* (X11; FreeBSD*)*] -Parent=Opera 9.4 -Platform=FreeBSD - -[Opera/9.4* (X11; Linux*)*] -Parent=Opera 9.4 -Platform=Linux - -[Opera/9.4* (X11; SunOS*)*] -Parent=Opera 9.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.5 - -[Opera 9.5] -Parent=DefaultProperties -Browser=Opera -Version=9.5 -MajorVer=9 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.5*] -Parent=Opera 9.5 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.5*] -Parent=Opera 9.5 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.5*] -Parent=Opera 9.5 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.5*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (Linux*)*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.5 -Platform=MacOSX - -[Opera/9.5* (Windows 95*)*] -Parent=Opera 9.5 -Platform=Win95 -Win32=true - -[Opera/9.5* (Windows 98*)*] -Parent=Opera 9.5 -Platform=Win98 -Win32=true - -[Opera/9.5* (Windows CE*)*] -Parent=Opera 9.5 -Platform=WinCE -Win32=true - -[Opera/9.5* (Windows ME*)*] -Parent=Opera 9.5 -Platform=WinME -Win32=true - -[Opera/9.5* (Windows NT 4.0*)*] -Parent=Opera 9.5 -Platform=WinNT -Win32=true - -[Opera/9.5* (Windows NT 5.0*)*] -Parent=Opera 9.5 -Platform=Win2000 -Win32=true - -[Opera/9.5* (Windows NT 5.1*)*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Opera/9.5* (Windows NT 5.2*)*] -Parent=Opera 9.5 -Platform=Win2003 -Win32=true - -[Opera/9.5* (Windows NT 6.0*)*] -Parent=Opera 9.5 -Platform=WinVista -Win32=true - -[Opera/9.5* (Windows NT 6.1*)*] -Parent=Opera 9.5 -Platform=Win7 - -[Opera/9.5* (Windows XP*)*] -Parent=Opera 9.5 -Platform=WinXP -Win32=true - -[Opera/9.5* (X11; FreeBSD*)*] -Parent=Opera 9.5 -Platform=FreeBSD - -[Opera/9.5* (X11; Linux*)*] -Parent=Opera 9.5 -Platform=Linux - -[Opera/9.5* (X11; SunOS*)*] -Parent=Opera 9.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Opera 9.6 - -[Opera 9.6] -Parent=DefaultProperties -Browser=Opera -Version=9.6 -MajorVer=9 -MinorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/* (compatible; MSIE*; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC Mac OS X;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacOSX - -[Mozilla/* (compatible; MSIE*; Mac_PowerPC) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacPPC - -[Mozilla/* (compatible; MSIE*; Windows 2000*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 95*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows 98*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows CE*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinCE -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows ME*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 4.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.1*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 5.2*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.0*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinVista -Win32=true - -[Mozilla/* (compatible; MSIE*; Windows NT 6.1*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win7 - -[Mozilla/* (compatible; MSIE*; Windows XP*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (compatible; MSIE*; X11; FreeBSD*) Opera 9.6*] -Parent=Opera 9.6 -Platform=FreeBSD - -[Mozilla/* (compatible; MSIE*; X11; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Mozilla/* (compatible; MSIE*; X11; SunOS*) Opera 9.6*] -Parent=Opera 9.6 -Platform=SunOS - -[Mozilla/* (Macintosh; *Mac OS X; ?) Opera 9.6*] -Parent=Opera 9.6 -Platform=MacOSX - -[Mozilla/* (Windows 2000;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows 95;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Mozilla/* (Windows 98;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Mozilla/* (Windows ME;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Mozilla/* (Windows NT 4.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Mozilla/* (Windows NT 5.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Mozilla/* (Windows NT 5.1;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Mozilla/* (Windows NT 5.2;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Mozilla/* (Windows NT 6.0;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=WinVista - -[Mozilla/* (Windows NT 6.1;*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Win7 - -[Mozilla/* (X11; Linux*) Opera 9.6*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (Linux*)*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (Macintosh; *Mac OS X;*)*] -Parent=Opera 9.6 -Platform=MacOSX - -[Opera/9.6* (Windows 95*)*] -Parent=Opera 9.6 -Platform=Win95 -Win32=true - -[Opera/9.6* (Windows 98*)*] -Parent=Opera 9.6 -Platform=Win98 -Win32=true - -[Opera/9.6* (Windows CE*)*] -Parent=Opera 9.6 -Platform=WinCE -Win32=true - -[Opera/9.6* (Windows ME*)*] -Parent=Opera 9.6 -Platform=WinME -Win32=true - -[Opera/9.6* (Windows NT 4.0*)*] -Parent=Opera 9.6 -Platform=WinNT -Win32=true - -[Opera/9.6* (Windows NT 5.0*)*] -Parent=Opera 9.6 -Platform=Win2000 -Win32=true - -[Opera/9.6* (Windows NT 5.1*)*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Opera/9.6* (Windows NT 5.2*)*] -Parent=Opera 9.6 -Platform=Win2003 -Win32=true - -[Opera/9.6* (Windows NT 6.0*)*] -Parent=Opera 9.6 -Platform=WinVista -Win32=true - -[Opera/9.6* (Windows NT 6.1*)*] -Parent=Opera 9.6 -Platform=Win7 - -[Opera/9.6* (Windows XP*)*] -Parent=Opera 9.6 -Platform=WinXP -Win32=true - -[Opera/9.6* (X11; FreeBSD*)*] -Parent=Opera 9.6 -Platform=FreeBSD - -[Opera/9.6* (X11; Linux*)*] -Parent=Opera 9.6 -Platform=Linux - -[Opera/9.6* (X11; SunOS*)*] -Parent=Opera 9.6 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.0 - -[Netscape 4.0] -Parent=DefaultProperties -Browser=Netscape -Version=4.0 -MajorVer=4 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.0*(Macintosh*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=MacPPC - -[Mozilla/4.0*(Win95;*] -Parent=Netscape 4.0 -Platform=Win95 - -[Mozilla/4.0*(Win98;*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=Win98 - -[Mozilla/4.0*(WinNT*] -Parent=Netscape 4.0 -Version=4.03 -MinorVer=03 -Platform=WinNT - -[Mozilla/4.0*(X11;*)] -Parent=Netscape 4.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.5 - -[Netscape 4.5] -Parent=DefaultProperties -Browser=Netscape -Version=4.5 -MajorVer=4 -MinorVer=5 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.5*(Macintosh; ?; PPC)] -Parent=Netscape 4.5 -Platform=MacPPC - -[Mozilla/4.5*(Win2000; ?)] -Parent=Netscape 4.5 -Platform=Win2000 - -[Mozilla/4.5*(Win95; ?)] -Parent=Netscape 4.5 -Platform=Win95 - -[Mozilla/4.5*(Win98; ?)] -Parent=Netscape 4.5 -Platform=Win98 - -[Mozilla/4.5*(WinME; ?)] -Parent=Netscape 4.5 -Platform=WinME - -[Mozilla/4.5*(WinNT; ?)] -Parent=Netscape 4.5 -Platform=WinNT - -[Mozilla/4.5*(WinXP; ?)] -Parent=Netscape 4.5 -Platform=WinXP - -[Mozilla/4.5*(X11*)] -Parent=Netscape 4.5 -Platform=Linux - -[Mozilla/4.51*(Macintosh; ?; PPC)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 - -[Mozilla/4.51*(Win2000; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win2000 - -[Mozilla/4.51*(Win95; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win95 - -[Mozilla/4.51*(Win98; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Win98 - -[Mozilla/4.51*(WinME; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinME - -[Mozilla/4.51*(WinNT; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinNT - -[Mozilla/4.51*(WinXP; ?)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=WinXP - -[Mozilla/4.51*(X11*)] -Parent=Netscape 4.5 -Version=4.51 -MinorVer=51 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.6 - -[Netscape 4.6] -Parent=DefaultProperties -Browser=Netscape -Version=4.6 -MajorVer=4 -MinorVer=6 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.6 * (OS/2; ?)] -Parent=Netscape 4.6 -Platform=OS/2 - -[Mozilla/4.6*(Macintosh; ?; PPC)] -Parent=Netscape 4.6 -Platform=MacPPC - -[Mozilla/4.6*(Win95; ?)] -Parent=Netscape 4.6 -Platform=Win95 - -[Mozilla/4.6*(Win98; ?)] -Parent=Netscape 4.6 -Platform=Win98 - -[Mozilla/4.6*(WinNT; ?)] -Parent=Netscape 4.6 -Platform=WinNT - -[Mozilla/4.61*(Macintosh; ?; PPC)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=MacPPC - -[Mozilla/4.61*(OS/2; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=OS/2 - -[Mozilla/4.61*(Win95; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=Win95 - -[Mozilla/4.61*(Win98; ?)] -Parent=Netscape 4.6 -Version=4.61 -Platform=Win98 - -[Mozilla/4.61*(WinNT; ?)] -Parent=Netscape 4.6 -Version=4.61 -MajorVer=4 -MinorVer=61 -Platform=WinNT - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.7 - -[Netscape 4.7] -Parent=DefaultProperties -Browser=Netscape -Version=4.7 -MajorVer=4 -MinorVer=7 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.7 * (Win2000; ?)] -Parent=Netscape 4.7 -Platform=Win2000 - -[Mozilla/4.7*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=MacPPC - -[Mozilla/4.7*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win95 - -[Mozilla/4.7*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win98 - -[Mozilla/4.7*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=WinNT -Win32=true - -[Mozilla/4.7*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=Win2000 -Win32=true - -[Mozilla/4.7*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=7 -Platform=WinXP -Win32=true - -[Mozilla/4.7*(WinNT; ?)*] -Parent=Netscape 4.7 -Platform=WinNT - -[Mozilla/4.7*(X11*)*] -Parent=Netscape 4.7 -Platform=Linux - -[Mozilla/4.7*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Platform=SunOS - -[Mozilla/4.71*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=MacPPC - -[Mozilla/4.71*(Win95; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win95 - -[Mozilla/4.71*(Win98; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win98 - -[Mozilla/4.71*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinNT -Win32=true - -[Mozilla/4.71*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Win2000 -Win32=true - -[Mozilla/4.71*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinXP -Win32=true - -[Mozilla/4.71*(WinNT; ?)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=WinNT - -[Mozilla/4.71*(X11*)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=Linux - -[Mozilla/4.71*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Version=4.71 -MinorVer=71 -Platform=SunOS - -[Mozilla/4.72*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=MacPPC - -[Mozilla/4.72*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win95 - -[Mozilla/4.72*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win98 - -[Mozilla/4.72*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinNT -Win32=true - -[Mozilla/4.72*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Win2000 -Win32=true - -[Mozilla/4.72*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinXP -Win32=true - -[Mozilla/4.72*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=WinNT - -[Mozilla/4.72*(X11*)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=Linux - -[Mozilla/4.72*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=72 -Platform=SunOS - -[Mozilla/4.73*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=MacPPC - -[Mozilla/4.73*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win95 - -[Mozilla/4.73*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win98 - -[Mozilla/4.73*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinNT -Win32=true - -[Mozilla/4.73*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Win2000 -Win32=true - -[Mozilla/4.73*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinXP -Win32=true - -[Mozilla/4.73*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=WinNT - -[Mozilla/4.73*(X11*)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=Linux - -[Mozilla/4.73*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=73 -Platform=SunOS - -[Mozilla/4.74*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=MacPPC - -[Mozilla/4.74*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win95 - -[Mozilla/4.74*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win98 - -[Mozilla/4.74*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinNT -Win32=true - -[Mozilla/4.74*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Win2000 -Win32=true - -[Mozilla/4.74*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinXP -Win32=true - -[Mozilla/4.74*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=WinNT - -[Mozilla/4.74*(X11*)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=Linux - -[Mozilla/4.74*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=74 -Platform=SunOS - -[Mozilla/4.75*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=MacPPC - -[Mozilla/4.75*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win95 - -[Mozilla/4.75*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win98 - -[Mozilla/4.75*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinNT -Win32=true - -[Mozilla/4.75*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Win2000 -Win32=true - -[Mozilla/4.75*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinXP -Win32=true - -[Mozilla/4.75*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=WinNT - -[Mozilla/4.75*(X11*)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=Linux - -[Mozilla/4.75*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=75 -Platform=SunOS - -[Mozilla/4.76*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=MacPPC - -[Mozilla/4.76*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win95 - -[Mozilla/4.76*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win98 - -[Mozilla/4.76*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinNT -Win32=true - -[Mozilla/4.76*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Win2000 -Win32=true - -[Mozilla/4.76*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinXP -Win32=true - -[Mozilla/4.76*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=WinNT - -[Mozilla/4.76*(X11*)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=Linux - -[Mozilla/4.76*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=76 -Platform=SunOS - -[Mozilla/4.77*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=MacPPC - -[Mozilla/4.77*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win95 - -[Mozilla/4.77*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win98 - -[Mozilla/4.77*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinNT -Win32=true - -[Mozilla/4.77*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Win2000 -Win32=true - -[Mozilla/4.77*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinXP -Win32=true - -[Mozilla/4.77*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=WinNT - -[Mozilla/4.77*(X11*)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=Linux - -[Mozilla/4.77*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=77 -Platform=SunOS - -[Mozilla/4.78*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=MacPPC - -[Mozilla/4.78*(Win95; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win95 - -[Mozilla/4.78*(Win98; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win98 - -[Mozilla/4.78*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinNT -Win32=true - -[Mozilla/4.78*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Win2000 -Win32=true - -[Mozilla/4.78*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinXP -Win32=true - -[Mozilla/4.78*(WinNT; ?)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=WinNT - -[Mozilla/4.78*(X11*)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=Linux - -[Mozilla/4.78*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -MinorVer=78 -Platform=SunOS - -[Mozilla/4.79*(Macintosh; ?; PPC)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=MacPPC - -[Mozilla/4.79*(Win95; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win95 - -[Mozilla/4.79*(Win98; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win98 - -[Mozilla/4.79*(Windows NT 4.0; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinNT -Win32=true - -[Mozilla/4.79*(Windows NT 5.0; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Win2000 -Win32=true - -[Mozilla/4.79*(Windows NT 5.1; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinXP -Win32=true - -[Mozilla/4.79*(WinNT; ?)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=WinNT - -[Mozilla/4.79*(X11*)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=Linux - -[Mozilla/4.79*(X11; ?; SunOS*)*] -Parent=Netscape 4.7 -Version=4.79 -MinorVer=79 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 4.8 - -[Netscape 4.8] -Parent=DefaultProperties -Browser=Netscape -Version=4.8 -MajorVer=4 -MinorVer=8 -Frames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/4.8*(Macintosh; ?; MacPPC)*] -Parent=Netscape 4.8 -Platform=MacPPC - -[Mozilla/4.8*(Macintosh; ?; PPC Mac OS X*] -Parent=Netscape 4.8 -Platform=MacOSX - -[Mozilla/4.8*(Macintosh; ?; PPC)*] -Parent=Netscape 4.8 -Platform=MacPPC - -[Mozilla/4.8*(Win95; *)*] -Parent=Netscape 4.8 - -[Mozilla/4.8*(Win98; *)*] -Parent=Netscape 4.8 -Platform=Win98 - -[Mozilla/4.8*(Windows NT 4.0; *)*] -Parent=Netscape 4.8 -Platform=WinNT -Win32=true - -[Mozilla/4.8*(Windows NT 5.0; *)*] -Parent=Netscape 4.8 -Platform=Win2000 -Win32=true - -[Mozilla/4.8*(Windows NT 5.1; *)*] -Parent=Netscape 4.8 -Platform=WinXP -Win32=true - -[Mozilla/4.8*(WinNT; *)*] -Parent=Netscape 4.8 -Platform=WinNT - -[Mozilla/4.8*(X11; *)*] -Parent=Netscape 4.8 -Platform=Linux - -[Mozilla/4.8*(X11; *SunOS*)*] -Parent=Netscape 4.8 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.0 - -[Netscape 6.0] -Parent=DefaultProperties -Browser=Netscape -Version=6.0 -MajorVer=6 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.0*] -Parent=Netscape 6.0 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.1 - -[Netscape 6.1] -Parent=DefaultProperties -Browser=Netscape -Version=6.1 -MajorVer=6 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.1*] -Parent=Netscape 6.1 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 6.2 - -[Netscape 6.2] -Parent=DefaultProperties -Browser=Netscape -Version=6.2 -MajorVer=6 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape6/6.2*] -Parent=Netscape 6.2 -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.0 - -[Netscape 7.0] -Parent=DefaultProperties -Browser=Netscape -Version=7.0 -MajorVer=7 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win*9x 4.90; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.0*] -Parent=Netscape 7.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.1 - -[Netscape 7.1] -Parent=DefaultProperties -Browser=Netscape -Version=7.1 -MajorVer=7 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/7.1] -Parent=Netscape 7.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.1*] -Parent=Netscape 7.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 7.2 - -[Netscape 7.2] -Parent=DefaultProperties -Browser=Netscape -Version=7.2 -MajorVer=7 -MinorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/7.2*] -Parent=Netscape 7.2 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 8.0 - -[Netscape 8.0] -Parent=DefaultProperties -Browser=Netscape -Version=8.0 -MajorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X Mach-O; *; rv:*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC Mac OS X;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/8.0*] -Parent=Netscape 8.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Netscape 8.1 - -[Netscape 8.1] -Parent=DefaultProperties -Browser=Netscape -Version=8.1 -MajorVer=8 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; ?; PPC;*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=MacPPC - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95;*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win9x 4.90; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 4.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT5.2; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.0; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT6.1; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; *) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*) Gecko/* Netscape*/8.1*] -Parent=Netscape 8.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.0 - -[SeaMonkey 1.0] -Parent=DefaultProperties -Browser=SeaMonkey -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.8*) Gecko/20060221 SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.8*) Gecko/* SeaMonkey/1.0*] -Parent=SeaMonkey 1.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 1.1 - -[SeaMonkey 1.1] -Parent=DefaultProperties -Browser=SeaMonkey -Version=1.1 -MajorVer=1 -MinorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.8*) Gecko/20060221 SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.8*) Gecko/* SeaMonkey/1.1*] -Parent=SeaMonkey 1.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SeaMonkey 2.0 - -[SeaMonkey 2.0] -Parent=DefaultProperties -Browser=SeaMonkey -Version=2.0 -MajorVer=2 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinME - -[Mozilla/5.0 (Windows; ?; Win98; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win98 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; ?; Windows NT 6.0; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; ?; Windows NT 6.1; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Win7 - -[Mozilla/5.0 (X11; ?; FreeBSD*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; ?; Linux*; *; rv:1.9*) Gecko/20060221 SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=Linux - -[Mozilla/5.0 (X11; ?; SunOS*; *; rv:1.9*) Gecko/* SeaMonkey/2.0*] -Parent=SeaMonkey 2.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Flock 1.0 - -[Flock 1.0] -Parent=DefaultProperties -Browser=Flock -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; U; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinME - -[Mozilla/5.0 (Windows; U; Windows NT 5.0*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; U; Windows NT 5.1*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1*; *; rv:1.*) Gecko/* Firefox/2.* Flock/1.*] -Parent=Flock 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Flock 2.0 - -[Flock 2.0] -Parent=DefaultProperties -Browser=Flock -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; U; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; U; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinME - -[Mozilla/5.0 (Windows; U; Windows NT 5.0*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; U; Windows NT 5.1*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 5.2*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win2003 - -[Mozilla/5.0 (Windows; U; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1*; *; rv:1.*) Gecko/* Firefox/3.* Flock/2.*] -Parent=Flock 2.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Sleipnir 2.0 - -[Sleipnir] -Parent=DefaultProperties -Browser=Sleipnir -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.0*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.1*) Sleipnir/2.*] -Parent=Sleipnir -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 5.2*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 6.0*) Sleipnir/2.*] -Parent=Sleipnir -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE ?.0; Windows NT 6.1*) Sleipnir/2.*] -Parent=Sleipnir -Platform=Win7 - -[Sleipnir*] -Parent=Sleipnir - -[Sleipnir/2.*] -Parent=Sleipnir - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Fennec 1.0 - -[Fennec 1.0] -Parent=DefaultProperties -Browser=Firefox Mobile -Version=1.0 -MajorVer=1 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=WinXP - -[Mozilla/5.0 (Windows; U; Windows NT 6.0; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1; *; rv:1.9*) Gecko/* Fennec/1.0*] -Parent=Fennec 1.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firebird - -[Firebird] -Parent=DefaultProperties -Browser=Firebird -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Linux; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird Browser/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird -Win32=true - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; IRIX*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firebird/0.*] -Parent=Firebird - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Mozilla Firebird/0.*] -Parent=Firebird - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox - -[Firefox] -Parent=DefaultProperties -Browser=Firefox -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=MacOSX - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (OS/2; *; Warp*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (Windows NT 5.?; ?; rv:1.*) Gecko/* Firefox] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.*; *; rv:1.*) Gecko/* Deer Park/Alpha*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.?; *; rv:1.*) Gecko/* Firefox/10.5] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Win32=true - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; FreeBSD*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; HP-UX*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; Linux*; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/0.*] -Parent=Firefox -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.0 - -[Firefox 1.0] -Parent=DefaultProperties -Browser=Firefox -Version=1.0 -MajorVer=1 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=MacPPC - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; *Linux*; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; DragonFly*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.0*] -Parent=Firefox 1.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.4 - -[Firefox 1.4] -Parent=DefaultProperties -Browser=Firefox -Version=1.4 -MajorVer=1 -MinorVer=4 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.4*] -Parent=Firefox 1.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 1.5 - -[Firefox 1.5] -Parent=DefaultProperties -Browser=Firefox -Version=1.5 -MajorVer=1 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=OS/2 - -[Mozilla/5.0 (rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2 x64; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.*) Gecko/* Firefox/1.5*] -Parent=Firefox 1.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 2.0 - -[Firefox 2.0] -Parent=DefaultProperties -Browser=Firefox -Version=2.0 -MajorVer=2 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Linux; *; PPC*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Linux - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=MacOSX - -[Mozilla/5.0 (OS/2; *; Warp*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=OS/2 - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win95; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.8*) Gecko/* Firefox/2.0*] -Parent=Firefox 2.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.0 - -[Firefox 3.0] -Parent=DefaultProperties -Browser=Firefox -Version=3.0 -MajorVer=3 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.0; *; rv:1.*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2000 - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.0*] -Parent=Firefox 3.0 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.1 - -[Firefox 3.1] -Parent=DefaultProperties -Browser=Firefox -Version=3.1 -MajorVer=3 -MinorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9*) Gecko/* Firefox/3.1*] -Parent=Firefox 3.1 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Firefox 3.5 - -[Firefox 3.5] -Parent=DefaultProperties -Browser=Firefox -Version=3.5 -MajorVer=3 -MinorVer=5 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=3 -supportsCSS=true - -[Mozilla/5.0 (Macintosh; *; *Mac OS X*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=MacOSX - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.0; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinVista -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 6.1; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win7 - -[Mozilla/5.0 (Windows; *; WinNT4.0; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.1 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 5.2 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win2003 -Win32=false -Win64=true - -[Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=WinVista - -[Mozilla/5.0 (Windows; U; Windows NT 6.1 x64; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Win7 - -[Mozilla/5.0 (X11; *; *Linux*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=Linux - -[Mozilla/5.0 (X11; *; FreeBSD*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *; HP-UX*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=HP-UX - -[Mozilla/5.0 (X11; *; IRIX64*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=IRIX64 - -[Mozilla/5.0 (X11; *; OpenBSD*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *; SunOS*; *; rv:1.9.*) Gecko/* Firefox/3.5b*] -Parent=Firefox 3.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Phoenix - -[Phoenix] -Parent=DefaultProperties -Browser=Phoenix -Version=0.5 -MinorVer=5 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (Windows; *; Win 9x 4.90; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; *; Win98; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.0*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.1; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; *; Windows NT 5.2*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (X11; *; Linux*; *; rv:1.4*) Gecko/* Phoenix/0.5*] -Parent=Phoenix -Platform=Linux - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Iceweasel - -[Iceweasel] -Parent=DefaultProperties -Browser=Iceweasel -Platform=Linux -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (X11; U; Linux*; *; rv:1.8*) Gecko/* Iceweasel/2.0* (Debian-*)] -Parent=Iceweasel -Version=2.0 -MajorVer=2 -MinorVer=0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.0 - -[Mozilla 1.0] -Parent=DefaultProperties -Browser=Mozilla -Version=1.0 -MajorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.0.*) Gecko/*] -Parent=Mozilla 1.0 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.1 - -[Mozilla 1.1] -Parent=DefaultProperties -Browser=Mozilla -Version=1.1 -MajorVer=1 -MinorVer=1 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.1.*) Gecko/*] -Parent=Mozilla 1.1 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.2 - -[Mozilla 1.2] -Parent=DefaultProperties -Browser=Mozilla -Version=1.2 -MajorVer=1 -MinorVer=2 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.2.*) Gecko/*] -Parent=Mozilla 1.2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.3 - -[Mozilla 1.3] -Parent=DefaultProperties -Browser=Mozilla -Version=1.3 -MajorVer=1 -MinorVer=3 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.3.*) Gecko/*] -Parent=Mozilla 1.3 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.4 - -[Mozilla 1.4] -Parent=DefaultProperties -Browser=Mozilla -Version=1.4 -MajorVer=1 -MinorVer=4 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.4*) Gecko/*] -Parent=Mozilla 1.4 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.5 - -[Mozilla 1.5] -Parent=DefaultProperties -Browser=Mozilla -Version=1.5 -MajorVer=1 -MinorVer=5 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.5*) Gecko/*] -Parent=Mozilla 1.5 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.6 - -[Mozilla 1.6] -Parent=DefaultProperties -Browser=Mozilla -Version=1.6 -MajorVer=1 -MinorVer=6 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.6*) Gecko/*] -Parent=Mozilla 1.6 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.7 - -[Mozilla 1.7] -Parent=DefaultProperties -Browser=Mozilla -Version=1.7 -MajorVer=1 -MinorVer=7 -Beta=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (*rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win31 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.7*) Gecko/*] -Parent=Mozilla 1.7 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.8 - -[Mozilla 1.8] -Parent=DefaultProperties -Browser=Mozilla -Version=1.8 -MajorVer=1 -MinorVer=8 -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.5 -w3cdomversion=1.0 - -[Mozilla/5.0 (*rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.8*) Gecko/*] -Parent=Mozilla 1.8 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Mozilla 1.9 - -[Mozilla 1.9] -Parent=DefaultProperties -Browser=Mozilla -Version=1.9 -MajorVer=1 -MinorVer=9 -Alpha=true -Frames=true -IFrames=true -Tables=true -Cookies=true -JavaApplets=true -JavaScript=true -CssVersion=2 -supportsCSS=true - -[Mozilla/5.0 (*rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 - -[Mozilla/5.0 (Macintosh; ?; *Mac OS X*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=MacOSX - -[Mozilla/5.0 (Windows; ?; Win 9x 4.90; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinME -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.1; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win3.11; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win31 -Win16=true -Win32=true - -[Mozilla/5.0 (Windows; ?; Win95; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win95 -Win32=true - -[Mozilla/5.0 (Windows; ?; Win98; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win98 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.0; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win2000 -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.1; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinXP -Win32=true - -[Mozilla/5.0 (Windows; ?; Windows NT 5.2; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Win2003 -Win32=true - -[Mozilla/5.0 (Windows; ?; WinNT4.0; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=WinNT -Win32=true - -[Mozilla/5.0 (X11; *FreeBSD*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=FreeBSD - -[Mozilla/5.0 (X11; *Linux*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=Linux - -[Mozilla/5.0 (X11; *OpenBSD*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=OpenBSD - -[Mozilla/5.0 (X11; *SunOS*; *rv:1.9*) Gecko/*] -Parent=Mozilla 1.9 -Platform=SunOS - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE Mac - -[IE Mac] -Parent=DefaultProperties -Browser=IE -Platform=MacPPC -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -JavaApplets=true -JavaScript=true -CssVersion=1 -supportsCSS=true - -[Mozilla/?.? (compatible; MSIE 4.0*; *Mac_PowerPC*] -Parent=IE Mac -Version=4.0 -MajorVer=4 -MinorVer=0 - -[Mozilla/?.? (compatible; MSIE 4.5*; *Mac_PowerPC*] -Parent=IE Mac -Version=4.5 -MajorVer=4 -MinorVer=5 - -[Mozilla/?.? (compatible; MSIE 5.0*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.0 -MajorVer=5 -MinorVer=0 - -[Mozilla/?.? (compatible; MSIE 5.1*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.1 -MajorVer=5 -MinorVer=1 - -[Mozilla/?.? (compatible; MSIE 5.2*; *Mac_PowerPC*] -Parent=IE Mac -Version=5.2 -MajorVer=5 -MinorVer=2 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 5.5 - -[AOL 9.0/IE 5.5] -Parent=DefaultProperties -Browser=AOL -Version=5.5 -MajorVer=5 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 5.5; *AOL 9.0*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 5.5; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 5.5 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 6.0 - -[AOL 9.0/IE 6.0] -Parent=DefaultProperties -Browser=AOL -Version=6.0 -MajorVer=6 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 -ecmascriptversion=1.3 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 6.0; *AOL 9.0*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 6.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 6.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; AOL 9.0/IE 7.0 - -[AOL 9.0/IE 7.0] -Parent=DefaultProperties -Browser=AOL -Version=7.0 -MajorVer=7 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -AOL=true -aolVersion=9.0 - -[Mozilla/?.* (?compatible; *MSIE 7.0; *AOL 9.0*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Win 9x 4.90*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 95*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -CssVersion=2 -supportsCSS=true - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows 98; Win 9x 4.90*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 4.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.01*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.1*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 5.2*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 1*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *AOL 9.0; *Windows NT 6.0*.NET CLR 2*.NET CLR 1*)*] -Parent=AOL 9.0/IE 7.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Avant Browser - -[Avant Browser] -Parent=DefaultProperties -Browser=Avant Browser -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Advanced Browser (http://www.avantbrowser.com)] -Parent=Avant Browser - -[Avant Browser*] -Parent=Avant Browser - -[Avant Browser/*] -Parent=Avant Browser - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 4.01 - -[IE 4.01] -Parent=DefaultProperties -Browser=IE -Version=4.01 -MajorVer=4 -MinorVer=01 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 4.01*)*] -Parent=IE 4.01 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 95*)*] -Parent=IE 4.01 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 98*)*] -Parent=IE 4.01 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 4.01 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 4.0*)*] -Parent=IE 4.01 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.0*)*] -Parent=IE 4.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 4.01; *Windows NT 5.01*)*] -Parent=IE 4.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 4.01; Windows NT)] -Parent=IE 4.01 -Platform=WinNT - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.0 - -[IE 5.0] -Parent=DefaultProperties -Browser=IE -Version=5.0 -MajorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 5.0*)*] -Parent=IE 5.0 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 95*)*] -Parent=IE 5.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98*)*] -Parent=IE 5.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 5.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 4.0*)*] -Parent=IE 5.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.0*)*] -Parent=IE 5.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.0; *Windows NT 5.01*)*] -Parent=IE 5.0 -Platform=Win2000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.01 - -[IE 5.01] -Parent=DefaultProperties -Browser=IE -Version=5.01 -MajorVer=5 -MinorVer=01 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true - -[Mozilla/?.* (?compatible; *MSIE 5.01*)*] -Parent=IE 5.01 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 95*)*] -Parent=IE 5.01 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98*)*] -Parent=IE 5.01 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 5.01 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 4.0*)*] -Parent=IE 5.01 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.0*)*] -Parent=IE 5.01 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.01; *Windows NT 5.01*)*] -Parent=IE 5.01 -Platform=Win2000 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 5.5 - -[IE 5.5] -Parent=DefaultProperties -Browser=IE -Version=5.5 -MajorVer=5 -MinorVer=5 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 5.5*)*] -Parent=IE 5.5 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 95*)*] -Parent=IE 5.5 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98*)*] -Parent=IE 5.5 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows 98; Win 9x 4.90*)*] -Parent=IE 5.5 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 4.0*)*] -Parent=IE 5.5 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.0*)*] -Parent=IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.01*)*] -Parent=IE 5.5 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.1*)*] -Parent=IE 5.5 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 5.5; *Windows NT 5.2*)*] -Parent=IE 5.5 -Platform=Win2003 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 6.0 - -[IE 6.0] -Parent=DefaultProperties -Browser=IE -Version=6.0 -MajorVer=6 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -w3cdomversion=1.0 -msdomversion=6.0 - -[Mozilla/?.* (?compatible; *MSIE 6.0*)*] -Parent=IE 6.0 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 95*)*] -Parent=IE 6.0 -Platform=Win95 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98*)*] -Parent=IE 6.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows 98; Win 9x 4.90*)*] -Parent=IE 6.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 4.0*)*] -Parent=IE 6.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.0*)*] -Parent=IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.01*)*] -Parent=IE 6.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.1*)*] -Parent=IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2*)*] -Parent=IE 6.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*Win64;*)*] -Parent=IE 6.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 5.2;*WOW64;*)*] -Parent=IE 6.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 6.0; *Windows NT 6.0*)*] -Parent=IE 6.0 -Platform=WinVista - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 7.0 - -[IE 7.0] -Parent=DefaultProperties -Browser=IE -Version=7.0 -MajorVer=7 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=2 -supportsCSS=true -ecmascriptversion=1.2 -msdomversion=7.0 -w3cdomversion=1.0 - -[Mozilla/?.* (?compatible; *MSIE 7.0*)*] -Parent=IE 7.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98*)*] -Parent=IE 7.0 -Platform=Win98 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows 98; Win 9x 4.90;*)*] -Parent=IE 7.0 -Platform=WinME - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 4.0*)*] -Parent=IE 7.0 -Platform=WinNT - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.0*)*] -Parent=IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.01*)*] -Parent=IE 7.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.1*)*] -Parent=IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2*)*] -Parent=IE 7.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*Win64;*)*] -Parent=IE 7.0 -Platform=WinXP -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 5.2;*WOW64;*)*] -Parent=IE 7.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.0*)*] -Parent=IE 7.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 7.0; *Windows NT 6.1*)*] -Parent=IE 7.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; *)*] -Parent=IE 7.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IE 8.0 - -[IE 8.0] -Parent=DefaultProperties -Browser=IE -Version=8.0 -MajorVer=8 -Win32=true -Frames=true -IFrames=true -Tables=true -Cookies=true -BackgroundSounds=true -CDF=true -VBScript=true -JavaApplets=true -JavaScript=true -ActiveXControls=true -CssVersion=3 -supportsCSS=true -ecmascriptversion=1.2 -msdomversion=8.0 -w3cdomversion=1.0 - -[Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Win32*)*] -Parent=IE 8.0 -Platform=Win32 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0*)*] -Parent=IE 8.0 -Platform=Win2000 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1*)*] -Parent=IE 8.0 -Platform=WinXP - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2*)*] -Parent=IE 8.0 -Platform=Win2003 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Win64; x64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; WOW64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=WinVista -Win64=false - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1*)*] -Parent=IE 8.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 -Win32=false -Win64=true - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 -Win64=false - -[Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 7.0; Trident/4.0*)*] -Parent=IE 8.0 -Platform=Win7 - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Default Browser - -[*] -Browser=Default Browser -Version=0 -MajorVer=0 -MinorVer=0 -Platform=unknown -Alpha=false -Beta=false -Win16=false -Win32=false -Win64=false -Frames=true -IFrames=false -Tables=true -Cookies=false -BackgroundSounds=false -CDF=false -VBScript=false -JavaApplets=false -JavaScript=false -ActiveXControls=false -Stripper=false -isBanned=false -isMobileDevice=false -isSyndicationReader=false -Crawler=false -CssVersion=0 -supportsCSS=false -AOL=false -aolVersion=0 -AuthenticodeUpdate=0 -CSS=0 -WAP=false -netCLR=false -ClrVersion=0 -ECMAScriptVersion=0.0 -W3CDOMVersion=0.0 diff --git a/Source/Platforms/Windows/Binaries/Mono/etc/mono/config b/Source/Platforms/Windows/Binaries/Mono/etc/mono/config deleted file mode 100644 index 385128f74..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/etc/mono/config +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/Platforms/Windows/Binaries/Mono/etc/mono/mconfig/config.xml b/Source/Platforms/Windows/Binaries/Mono/etc/mono/mconfig/config.xml deleted file mode 100644 index a3df3b5e9..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/etc/mono/mconfig/config.xml +++ /dev/null @@ -1,616 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-
- - - - -]]> - - - - - - -
-
-
- - - - - -
- -
-
-
-
- - - -]]> - - - - - -
-
-
-
-
-
-
- - - - - -]]> - - - - - -
-
-
-
-
-
-
- - - - - - - - -]]> - - - - - -
-
-
-
-
- - - - - - - -]]> - - - - - -
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
- - - - - - - - - - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - - - - - -]]> - - - - - - - -
-
-
- - - - - -
- -
-
-
- - - - ]]> - - - - - -
-
-
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
- - - - - - - -]]> - - - - - -
-
-
-
-
- - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - - - -]]> - - - - - -
-
-
- - - - - - - - - - - - - -]]> - - - - - - -
-
-
-
-
-
-
- - - - -]]> - - - - - -
-
-
-
-
-
-
- - - - - - - - - - - -]]> - - - - - -
-
-
-
-
- - - - -]]> - - - - - - - - ]]> - - - - - - ]]> - - - - - - ]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - - -]]> - - - - -
-
-
-
-
-
- - diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/Accessibility.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/Accessibility.dll deleted file mode 100644 index 853d3c046..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/Accessibility.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0912a0bebc016e611e4900d99485713fbf0e013f496afc8fc837be08611723e -size 12288 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/Mono.Posix.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/Mono.Posix.dll deleted file mode 100644 index 24e19fd94..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/Mono.Posix.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:808439c9d7c076eb2522fdfe2ce1098abae6f6e285d6abc55d97ddb6d0d26e08 -size 212480 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/Mono.Security.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/Mono.Security.dll deleted file mode 100644 index 951b0bfae..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/Mono.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3f217f4a364c34d7f49936cf260433f45611a04429a2e3984b323a59f830589 -size 314368 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll deleted file mode 100644 index 8bfd1a09b..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ComponentModel.Composition.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2383b6b3a6b26d1087085b36c870f0ec9bbdea2b1bdbc84a0fae1199c748b7bc -size 259072 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll deleted file mode 100644 index ab6ebc5e5..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ComponentModel.DataAnnotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eba35e43d95ab785e49df375698e0d16dc96c01913f122d8e28037ede27a352d -size 84992 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Configuration.Install.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Configuration.Install.dll deleted file mode 100644 index 466defc1b..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Configuration.Install.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:252e5a4efb637836e095d3b548f260a5f102e1d9a7ab60d6e86f1d037fd5a9a9 -size 24064 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Configuration.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Configuration.dll deleted file mode 100644 index b527bebb0..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Configuration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b80cf5be3c7057d75a8316656c2908fee6c42c56db496a3cd7360fd7f7ef1a8 -size 122880 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Core.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Core.dll deleted file mode 100644 index 800084cbe..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cbbbec2664d3db5ba45968309567fd8f1a40e2b7f850f105f65542ee2e6a120b -size 1060864 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll deleted file mode 100644 index 20c4a229d..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.DataSetExtensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47d6066206c902291116777a12866baaf14047881b2a81c1581043da98f87d33 -size 29696 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.Entity.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.Entity.dll deleted file mode 100644 index 89a341f3d..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.Entity.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60d64c82a582aa890534cc712d433821054e06410bde58064e93d5e018c42863 -size 3339264 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.Linq.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.Linq.dll deleted file mode 100644 index 3b46bead2..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17a0d35c1ad7d7b08a1b587cf356642afbfa79c7dedce2a7f45233b4484ec0ab -size 493568 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.OracleClient.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.OracleClient.dll deleted file mode 100644 index 305c96c77..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.OracleClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d505d83165e22e7ab370453cf9a18df8719c85275f7ff14b66c3345cfae0a07 -size 173056 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.Services.Client.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.Services.Client.dll deleted file mode 100644 index 7a63dfefe..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.Services.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c36d770c293ee54ffc024ccd306ed52b0b1c673e938e70d2d545366e93b1fbf -size 418816 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.Services.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.Services.dll deleted file mode 100644 index 0289c8cba..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7eb71c131eb85bd425da257dc16f33eae51f4860d3acd6cc4b6012cad61feb6b -size 56320 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.dll deleted file mode 100644 index 03c392621..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3b1ff22e881e7942f699a47baf8b19a4c130e06f979d5f040b38a083bd3c80f -size 2176000 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Deployment.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Deployment.dll deleted file mode 100644 index 9ae5b7f34..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db9299957f72f26dc76cc3d99a2eed9cc2dfdcedf3e5d3b7126040a61df404bb -size 11264 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll deleted file mode 100644 index cc9ac46dc..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.Protocols.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0e27e7d6f334d21a0d79d5590a2910d7aea644f7c8f4ad3b8d95978d97bd287 -size 61952 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.dll deleted file mode 100644 index b8ac625bc..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.DirectoryServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4a7f98fb1e80e5d337bbc4836d8fa3545bb9c5da96de9bf5ee0fbbb8b4c2ef0 -size 94208 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Drawing.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Drawing.dll deleted file mode 100644 index 71fb58128..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Drawing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:032e72d1767859c9e9de20117b3ca2823e29d79a545608eb5fa4f0e432c95be9 -size 482816 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Dynamic.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Dynamic.dll deleted file mode 100644 index 19d37807a..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Dynamic.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:faeabe9ab6fb8c6c6f7401440b61f50742d6337422dbe877ffbd2863f8ed7f14 -size 87040 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.EnterpriseServices.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.EnterpriseServices.dll deleted file mode 100644 index 1bd5a2168..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.EnterpriseServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bab34e6aee689697f3de11997bf78d708ca9f388ebd8b4ef8444a72ad146b435 -size 46592 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll deleted file mode 100644 index f0a3d2170..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.IO.Compression.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07509ad8d972a949d23f28182f1014493827c522c0a05c362a322194dcc958d7 -size 18432 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.IO.Compression.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.IO.Compression.dll deleted file mode 100644 index 72c2b69a4..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.IO.Compression.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:854d4c3792cb38bdd150587483a4546ec00402c15ef800fbf9710e769bc6a858 -size 99840 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll deleted file mode 100644 index 2e27836a5..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.IdentityModel.Selectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b10311f5e74a932b53bf5246cb8c5d0870c8abb86b44f346b42d944e0d5aa4cc -size 17408 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.IdentityModel.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.IdentityModel.dll deleted file mode 100644 index fdc4af3ba..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.IdentityModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af5babdd0ed1f293f34cdb5de60990bbbff29b7210ec33b88216d1bcd6690c9f -size 139776 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Json.Microsoft.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Json.Microsoft.dll deleted file mode 100644 index 7fd728f75..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Json.Microsoft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8db90c030ac969ffb0eff96c588b48e687f6578de07dd501c5285adb38d52dc6 -size 54784 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Json.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Json.dll deleted file mode 100644 index d2b1ea8b4..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63b117af842abfd437b9a12d05b5e46eb893128e63d435a3945411a2c5f2c3be -size 32768 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Management.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Management.dll deleted file mode 100644 index 6d5b77cf6..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:167f222464d487e2e1fc3c3e650c8709ef69843e13b396b54832fef13fd2f17f -size 49152 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Messaging.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Messaging.dll deleted file mode 100644 index f1832234a..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23f29e2f9611bf7f723fbcbf8093ea76fa69e7c95f52af11e13ae9c524e36309 -size 75776 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll deleted file mode 100644 index 3bae6b653..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Net.Http.Formatting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2a0a7ef44aa32beb43360c15276c97d3d2f43fded9b49059ec4b5cd7375eef0 -size 519168 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll deleted file mode 100644 index 486b58b3f..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Net.Http.WebRequest.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:056222d594bd4d6d66778e2bbeb13fb60d67ec3bb8132d299b768f528e2b59dc -size 8704 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Net.Http.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Net.Http.dll deleted file mode 100644 index 9ed326fe0..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Net.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c622434b946190b68d1a06c9c4cbb255a335ceb7951ca3c95264f7134d962a89 -size 115712 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Net.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Net.dll deleted file mode 100644 index d5e539cc0..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Net.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:794e311e903861dc9c1fd58ca94d1020e69d2082ec57868ce9b057f0c7febed7 -size 13312 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Numerics.Vectors.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Numerics.Vectors.dll deleted file mode 100644 index 3832659b8..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Numerics.Vectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8605dc6f36efaa5caae780981ef26eb0f1e0991214b6fcc78b65b02de24d57d -size 12288 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Numerics.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Numerics.dll deleted file mode 100644 index 0712c5db6..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a34de47b07a11476d320e8bc90839497666a672dede5f0d89fdaddef9da7fb92 -size 119296 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Core.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Core.dll deleted file mode 100644 index 71a460cff..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4de31ce3baff183fd92197bf54538ef856c48d11aa6e09415fbaa2731b152c2c -size 96256 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Debugger.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Debugger.dll deleted file mode 100644 index 017efea9d..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Debugger.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8d86f058f7449f9562487d55fc6f6d8c48d1ae392031693c412027ab8c725dc -size 5120 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Experimental.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Experimental.dll deleted file mode 100644 index 8cd931a90..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Experimental.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:270fc54fffab856dc39c59f4b8f36c3ea100077d277f8376b38c0defc4ca7106 -size 28672 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll deleted file mode 100644 index cd36c3941..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Interfaces.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d9455be0e328fb04c676c098ddbdaae2ec502c3c0c40e5fa8df55eea934be88 -size 7680 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Linq.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Linq.dll deleted file mode 100644 index 896df65a1..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c3d59871c8372fe66118ad949fb63e27d1c9a5224411ca8ea6ff72e7810ce97 -size 683008 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll deleted file mode 100644 index ca13cac26..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Observable.Aliases.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d5c4c8215b336d46a9c0c2c17eb7e5b5f0cd1fd4dcb000c078c4e04eaceebf5 -size 9728 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll deleted file mode 100644 index 5d81b4873..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.PlatformServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79083f313b2f5e3b20faa88e49205aece830c554e2fc7166d2163aa6367378bd -size 22528 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Providers.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Providers.dll deleted file mode 100644 index 6baa78665..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Providers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6cca58ace28725eab8be54c5ce63f38226e00491e6f18e870f2c4de955f7eb1 -size 243200 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll deleted file mode 100644 index a76d185f1..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1de1731d7fb418f4d190d8bfb4a82c9fa98a7ed2dfb87c9f090b86f5859df9e3 -size 9216 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll deleted file mode 100644 index 9732542ef..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a45b23e876eaa89da807f8e569d4310b7837b15e8c1fa5d7f96b0cfc102a4e9a -size 9728 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll deleted file mode 100644 index c7d365f14..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reactive.Windows.Threading.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4bab7f093518c414085258a5ed9da770be284b6a0fd50717d7890ec743e7ec7 -size 12800 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reflection.Context.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reflection.Context.dll deleted file mode 100644 index 35115a643..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Reflection.Context.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd06d517d0d44a2f2c0b9ef30212f54f3c36b0db8c6efacab98a4685b1f64dea -size 13312 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Runtime.Caching.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Runtime.Caching.dll deleted file mode 100644 index fc7961035..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Runtime.Caching.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44472e1daf4804d9cbb27570a33637f8fff7baaf2a34cb1b0265ec0ce126560a -size 72192 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll deleted file mode 100644 index d8deafe7b..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Runtime.DurableInstancing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a602889eb1f44c67e0f007302b60cc597cebbe1497602251b72aead641b0b30 -size 107008 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Runtime.Remoting.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Runtime.Remoting.dll deleted file mode 100644 index 739ba99fb..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f969cb59d10e32c8ca64315202d9b7f4c281f90644eb3def96043630db93cea1 -size 119808 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll deleted file mode 100644 index fd8edb333..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.Formatters.Soap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11095119a3bb3e90062f5d945ee84cafd9f5d398b3469b7dea93226a8969f597 -size 38912 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.dll deleted file mode 100644 index 86d9f24ec..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Runtime.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e79e892dd359575db05e94540e258abd7d00d866537884b08f40496b8324bda1 -size 934400 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Security.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Security.dll deleted file mode 100644 index e9f767348..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3aa7e023a1603b1b8a75238fd90d84404270f4d0e1e19f4b990d516da69c4ae5 -size 281600 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll deleted file mode 100644 index 0549bdb6d..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Activation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f469c217afd60fcb81a9a74465cbf0354d8e67d1d2e7092a0e58868a0048c8d9 -size 13312 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll deleted file mode 100644 index 91210a18c..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Discovery.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99fe4cfa49222d8d6c8a1168e42be676574dd035040b1bbe4528c32b215e2c8f -size 141312 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll deleted file mode 100644 index 3c8004057..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Internals.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a89bf31e08fee2d8922b534387b5e1b73f66de4aaff8ef3267574c55dfa8b099 -size 214528 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll deleted file mode 100644 index 7f7a47794..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3f2ebe00b9ce96573985d158625c77d67fddf9ffb9c6932f88b094f01dfd68f -size 37376 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Web.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Web.dll deleted file mode 100644 index 40e3cc005..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceModel.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60bbb932cfd6740d5f33eb1606f5f37c84177dc690b0621a369015eb1c039cfa -size 79360 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceModel.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceModel.dll deleted file mode 100644 index 963c03d04..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5a0ac8df58b6ec822693e7560d99bdf18390c653255b32c944b15b6a3444ec4 -size 1426944 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceProcess.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceProcess.dll deleted file mode 100644 index 7f7f8abc4..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.ServiceProcess.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c4a73a29be261f5ccb86488ffe10f0a39e89da06bd79dfb14a8fcfa9220ab0d -size 47104 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll deleted file mode 100644 index 4e93ddc2f..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Threading.Tasks.Dataflow.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0cb9c05d93e946fb60be318c84f8f160b9a629a419932ec5a7d15caaaf684f8f -size 168960 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Transactions.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Transactions.dll deleted file mode 100644 index 5a32ec0ad..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Transactions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c42f2468cda39b9a52b122dcd18d0377220c396cb69b2b493ce7f8754fc1f1d -size 34304 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Abstractions.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Abstractions.dll deleted file mode 100644 index 98eb8573f..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Abstractions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c3f86f31d8a6ae98982e2d3dac1fd8f25b1ebb58f1206edfb118a41e9ffd319 -size 12800 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll deleted file mode 100644 index fdca73577..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.ApplicationServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fabe15ee190b3d1c4ffaa467cd76bfeeb174c26e85f9324b30a5ffaab13d5bf -size 33792 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.DynamicData.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.DynamicData.dll deleted file mode 100644 index ef466b724..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.DynamicData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66a107c6d94a6f4811240d1fde552d9fdac32b4a0cb985766e6c5570e1661002 -size 69120 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Extensions.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Extensions.dll deleted file mode 100644 index 7b6226fef..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0162659ab054c3969ae150f0e05368b57e45518c49ac3ceb97c5d55a6c529cf9 -size 746496 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll deleted file mode 100644 index 74f0a27c1..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Http.SelfHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53b4ec85036c686ffac982c7bdfe9991ac25fb6e316a341a5a07ce96e9513e55 -size 88064 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll deleted file mode 100644 index fc0cbcc1e..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Http.WebHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4cc0e41b1640296696ed6d3a6940acdb0746e45549f97809ea634444eadbca72 -size 56320 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Http.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Http.dll deleted file mode 100644 index c11535639..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d3314f0fd4caab1d63c2349c30ef557c74ae3ff2719a7998873b62180261f52 -size 326144 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Mobile.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Mobile.dll deleted file mode 100644 index 2f83ca253..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Mobile.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a836e3e93e5828736088cde47e28512c5cc57a2009db9805a797516e70245b7 -size 11264 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Mvc.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Mvc.dll deleted file mode 100644 index 985161adf..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Mvc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e16b3608d9d80935dfb5d7fee7c52ff010313177c336e699e197521f57a776e -size 420352 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Razor.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Razor.dll deleted file mode 100644 index dbcb53418..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c880284f07b77730ff6f403c404165de5bfc6cef7c114015f357f375b59200d9 -size 254976 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll deleted file mode 100644 index 8e64c7e1d..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.RegularExpressions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ac0e21ae2a3806a9b4022003e34c8fec95764b41de2b1c22053a5a4210b99f5 -size 11776 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Routing.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Routing.dll deleted file mode 100644 index 84a86a1ff..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f77a573dbf24e8d4c97b10ac1db02006a3a10b59fcf00f491a48d95e08f2d9a5 -size 12288 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Services.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Services.dll deleted file mode 100644 index 684f807d8..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e6957762acf08a660d95f8f53360b0f5d5f964faff1e8883a0a05d17d088181 -size 736256 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll deleted file mode 100644 index 217074c81..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3b155c702b203bd92bb000674ecbb17268c1f286d862456420a07fb06aea296 -size 39424 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll deleted file mode 100644 index 9c180770d..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1935aae7b622b37295665235e0ec74a8821b3c010c20f558b3d13be42d1e77c6 -size 38400 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.dll deleted file mode 100644 index bc5c14264..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.WebPages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5cb446d04971bbd2b6e911b9751c953f95d41f2c1d86291d683caf62644c613 -size 196608 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.dll deleted file mode 100644 index 76076e618..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5edaae59667f870f05981d83c31ff25de85a56bcac1c3c21b2a3536439ef6930 -size 3030016 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll deleted file mode 100644 index 23fa3775b..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.DataVisualization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8313360d08f86b6c805df0a3576a2dc2f5d253241ba22a868e65b09d947343bf -size 145920 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.dll deleted file mode 100644 index 3ff3435d4..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2cb88a463f0f8e7025b6e6988ee2e3d4001ce0b7cf5a37560e1002e325bb0eb -size 2898432 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Windows.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Windows.dll deleted file mode 100644 index a0d16168d..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Windows.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec90da3e05d35fa76a1d576a9c14e0fb95e9c5016305352607029ff080a4bc1a -size 11776 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Workflow.Activities.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Workflow.Activities.dll deleted file mode 100644 index 159d8a7e5..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Workflow.Activities.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ffda734f630f52c7aabf9b6dfbb1cfd43be266f5761f8df8e1ae1b9e5f7dcc1 -size 11776 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll deleted file mode 100644 index 2547b6648..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Workflow.ComponentModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c0c81efccdd49d67ba923bb9f96e7b095ae0c5726620ab0e98ecaab65dc299b -size 11776 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Workflow.Runtime.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Workflow.Runtime.dll deleted file mode 100644 index 2c2b17854..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Workflow.Runtime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b09dd31624af27363fab179b4b0a2dae32e698eb4284f187742a3129f1f44e9 -size 11776 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Xaml.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Xaml.dll deleted file mode 100644 index 9d4b1802f..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Xaml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:610a9d1d412a1785d2d04be3549e8b708977ddcfb3cd73241a659afa5039a381 -size 188928 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Xml.Linq.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Xml.Linq.dll deleted file mode 100644 index 07bb029db..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Xml.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74e12d93dc79b18aef8241d4dbfc7a5ab4a2457ec94f087ab280809dde3cb9b0 -size 137216 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Xml.Serialization.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Xml.Serialization.dll deleted file mode 100644 index 71501bb82..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Xml.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d51a04521acc7d37047913b82a2973edcaf6db96ce74f2e3fe3fa506d1b0b70 -size 11776 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Xml.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Xml.dll deleted file mode 100644 index 88dfe5ae7..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58196401c5c8f3323e0912b4422137612bd7eb2a3821cb53c4ac74fb7b26dda1 -size 3174912 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.dll deleted file mode 100644 index 997f34981..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/System.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb1d7b4b87422c0cd8f0aa847c382cbcb1bad88872f013ef164eaaf0ed76a5fc -size 2456064 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/WindowsBase.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/WindowsBase.dll deleted file mode 100644 index 345f59f24..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/WindowsBase.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:445e763848380e33861eda9af9b2d871237c12f4799603f32b0c42abf9875a7c -size 161792 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/mscorlib.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/mscorlib.dll deleted file mode 100644 index 7b6afe057..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/4.5/mscorlib.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1945a39b4cc3ff3d16d1ed359fca1399248b54dc41da14c51db37ace45eddf9 -size 4498432 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll deleted file mode 100644 index 853d3c046..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/Accessibility/4.0.0.0__b03f5f7f11d50a3a/Accessibility.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0912a0bebc016e611e4900d99485713fbf0e013f496afc8fc837be08611723e -size 12288 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll deleted file mode 100644 index 24e19fd94..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:808439c9d7c076eb2522fdfe2ce1098abae6f6e285d6abc55d97ddb6d0d26e08 -size 212480 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll deleted file mode 100644 index 951b0bfae..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3f217f4a364c34d7f49936cf260433f45611a04429a2e3984b323a59f830589 -size 314368 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ComponentModel.Composition/4.0.0.0__b77a5c561934e089/System.ComponentModel.Composition.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ComponentModel.Composition/4.0.0.0__b77a5c561934e089/System.ComponentModel.Composition.dll deleted file mode 100644 index 8bfd1a09b..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ComponentModel.Composition/4.0.0.0__b77a5c561934e089/System.ComponentModel.Composition.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2383b6b3a6b26d1087085b36c870f0ec9bbdea2b1bdbc84a0fae1199c748b7bc -size 259072 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll deleted file mode 100644 index ab6ebc5e5..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ComponentModel.DataAnnotations/4.0.0.0__31bf3856ad364e35/System.ComponentModel.DataAnnotations.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eba35e43d95ab785e49df375698e0d16dc96c01913f122d8e28037ede27a352d -size 84992 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll deleted file mode 100644 index 466defc1b..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Configuration.Install/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.Install.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:252e5a4efb637836e095d3b548f260a5f102e1d9a7ab60d6e86f1d037fd5a9a9 -size 24064 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll deleted file mode 100644 index b527bebb0..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b80cf5be3c7057d75a8316656c2908fee6c42c56db496a3cd7360fd7f7ef1a8 -size 122880 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll deleted file mode 100644 index 800084cbe..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cbbbec2664d3db5ba45968309567fd8f1a40e2b7f850f105f65542ee2e6a120b -size 1060864 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data.DataSetExtensions/4.0.0.0__b77a5c561934e089/System.Data.DataSetExtensions.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data.DataSetExtensions/4.0.0.0__b77a5c561934e089/System.Data.DataSetExtensions.dll deleted file mode 100644 index 20c4a229d..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data.DataSetExtensions/4.0.0.0__b77a5c561934e089/System.Data.DataSetExtensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47d6066206c902291116777a12866baaf14047881b2a81c1581043da98f87d33 -size 29696 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data.Entity/4.0.0.0__b77a5c561934e089/System.Data.Entity.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data.Entity/4.0.0.0__b77a5c561934e089/System.Data.Entity.dll deleted file mode 100644 index 89a341f3d..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data.Entity/4.0.0.0__b77a5c561934e089/System.Data.Entity.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60d64c82a582aa890534cc712d433821054e06410bde58064e93d5e018c42863 -size 3339264 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll deleted file mode 100644 index 3b46bead2..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data.Linq/4.0.0.0__b77a5c561934e089/System.Data.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17a0d35c1ad7d7b08a1b587cf356642afbfa79c7dedce2a7f45233b4484ec0ab -size 493568 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll deleted file mode 100644 index 305c96c77..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data.OracleClient/4.0.0.0__b77a5c561934e089/System.Data.OracleClient.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d505d83165e22e7ab370453cf9a18df8719c85275f7ff14b66c3345cfae0a07 -size 173056 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data.Services.Client/4.0.0.0__b77a5c561934e089/System.Data.Services.Client.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data.Services.Client/4.0.0.0__b77a5c561934e089/System.Data.Services.Client.dll deleted file mode 100644 index 7a63dfefe..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data.Services.Client/4.0.0.0__b77a5c561934e089/System.Data.Services.Client.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c36d770c293ee54ffc024ccd306ed52b0b1c673e938e70d2d545366e93b1fbf -size 418816 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data.Services/4.0.0.0__b77a5c561934e089/System.Data.Services.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data.Services/4.0.0.0__b77a5c561934e089/System.Data.Services.dll deleted file mode 100644 index 0289c8cba..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data.Services/4.0.0.0__b77a5c561934e089/System.Data.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7eb71c131eb85bd425da257dc16f33eae51f4860d3acd6cc4b6012cad61feb6b -size 56320 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll deleted file mode 100644 index 03c392621..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Data/4.0.0.0__b77a5c561934e089/System.Data.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3b1ff22e881e7942f699a47baf8b19a4c130e06f979d5f040b38a083bd3c80f -size 2176000 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Deployment/4.0.0.0__b03f5f7f11d50a3a/System.Deployment.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Deployment/4.0.0.0__b03f5f7f11d50a3a/System.Deployment.dll deleted file mode 100644 index 9ae5b7f34..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Deployment/4.0.0.0__b03f5f7f11d50a3a/System.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db9299957f72f26dc76cc3d99a2eed9cc2dfdcedf3e5d3b7126040a61df404bb -size 11264 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.DirectoryServices.Protocols/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.Protocols.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.DirectoryServices.Protocols/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.Protocols.dll deleted file mode 100644 index cc9ac46dc..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.DirectoryServices.Protocols/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.Protocols.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0e27e7d6f334d21a0d79d5590a2910d7aea644f7c8f4ad3b8d95978d97bd287 -size 61952 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll deleted file mode 100644 index b8ac625bc..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.DirectoryServices/4.0.0.0__b03f5f7f11d50a3a/System.DirectoryServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4a7f98fb1e80e5d337bbc4836d8fa3545bb9c5da96de9bf5ee0fbbb8b4c2ef0 -size 94208 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll deleted file mode 100644 index 71fb58128..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Drawing/4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:032e72d1767859c9e9de20117b3ca2823e29d79a545608eb5fa4f0e432c95be9 -size 482816 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Dynamic/4.0.0.0__b03f5f7f11d50a3a/System.Dynamic.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Dynamic/4.0.0.0__b03f5f7f11d50a3a/System.Dynamic.dll deleted file mode 100644 index 19d37807a..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Dynamic/4.0.0.0__b03f5f7f11d50a3a/System.Dynamic.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:faeabe9ab6fb8c6c6f7401440b61f50742d6337422dbe877ffbd2863f8ed7f14 -size 87040 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll deleted file mode 100644 index 1bd5a2168..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.EnterpriseServices/4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bab34e6aee689697f3de11997bf78d708ca9f388ebd8b4ef8444a72ad146b435 -size 46592 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll deleted file mode 100644 index f0a3d2170..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.IO.Compression.FileSystem/4.0.0.0__b77a5c561934e089/System.IO.Compression.FileSystem.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07509ad8d972a949d23f28182f1014493827c522c0a05c362a322194dcc958d7 -size 18432 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll deleted file mode 100644 index 72c2b69a4..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.IO.Compression/4.0.0.0__b77a5c561934e089/System.IO.Compression.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:854d4c3792cb38bdd150587483a4546ec00402c15ef800fbf9710e769bc6a858 -size 99840 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll deleted file mode 100644 index 2e27836a5..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.IdentityModel.Selectors/4.0.0.0__b77a5c561934e089/System.IdentityModel.Selectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b10311f5e74a932b53bf5246cb8c5d0870c8abb86b44f346b42d944e0d5aa4cc -size 17408 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll deleted file mode 100644 index fdc4af3ba..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.IdentityModel/4.0.0.0__b77a5c561934e089/System.IdentityModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af5babdd0ed1f293f34cdb5de60990bbbff29b7210ec33b88216d1bcd6690c9f -size 139776 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Json.Microsoft/4.0.0.0__31bf3856ad364e35/System.Json.Microsoft.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Json.Microsoft/4.0.0.0__31bf3856ad364e35/System.Json.Microsoft.dll deleted file mode 100644 index 7fd728f75..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Json.Microsoft/4.0.0.0__31bf3856ad364e35/System.Json.Microsoft.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8db90c030ac969ffb0eff96c588b48e687f6578de07dd501c5285adb38d52dc6 -size 54784 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Json/4.0.0.0__31bf3856ad364e35/System.Json.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Json/4.0.0.0__31bf3856ad364e35/System.Json.dll deleted file mode 100644 index d2b1ea8b4..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Json/4.0.0.0__31bf3856ad364e35/System.Json.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63b117af842abfd437b9a12d05b5e46eb893128e63d435a3945411a2c5f2c3be -size 32768 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll deleted file mode 100644 index 6d5b77cf6..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Management/4.0.0.0__b03f5f7f11d50a3a/System.Management.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:167f222464d487e2e1fc3c3e650c8709ef69843e13b396b54832fef13fd2f17f -size 49152 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll deleted file mode 100644 index f1832234a..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Messaging/4.0.0.0__b03f5f7f11d50a3a/System.Messaging.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23f29e2f9611bf7f723fbcbf8093ea76fa69e7c95f52af11e13ae9c524e36309 -size 75776 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll deleted file mode 100644 index 3bae6b653..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Net.Http.Formatting/4.0.0.0__31bf3856ad364e35/System.Net.Http.Formatting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2a0a7ef44aa32beb43360c15276c97d3d2f43fded9b49059ec4b5cd7375eef0 -size 519168 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll deleted file mode 100644 index 486b58b3f..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Net.Http.WebRequest/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.WebRequest.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:056222d594bd4d6d66778e2bbeb13fb60d67ec3bb8132d299b768f528e2b59dc -size 8704 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll deleted file mode 100644 index 9ed326fe0..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Net.Http/4.0.0.0__b03f5f7f11d50a3a/System.Net.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c622434b946190b68d1a06c9c4cbb255a335ceb7951ca3c95264f7134d962a89 -size 115712 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll deleted file mode 100644 index d5e539cc0..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Net/4.0.0.0__b03f5f7f11d50a3a/System.Net.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:794e311e903861dc9c1fd58ca94d1020e69d2082ec57868ce9b057f0c7febed7 -size 13312 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll deleted file mode 100644 index 3832659b8..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Numerics.Vectors/4.0.0.0__b03f5f7f11d50a3a/System.Numerics.Vectors.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8605dc6f36efaa5caae780981ef26eb0f1e0991214b6fcc78b65b02de24d57d -size 12288 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll deleted file mode 100644 index 0712c5db6..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Numerics/4.0.0.0__b77a5c561934e089/System.Numerics.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a34de47b07a11476d320e8bc90839497666a672dede5f0d89fdaddef9da7fb92 -size 119296 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Core/2.2.0.0__31bf3856ad364e35/System.Reactive.Core.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Core/2.2.0.0__31bf3856ad364e35/System.Reactive.Core.dll deleted file mode 100644 index 71a460cff..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Core/2.2.0.0__31bf3856ad364e35/System.Reactive.Core.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4de31ce3baff183fd92197bf54538ef856c48d11aa6e09415fbaa2731b152c2c -size 96256 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Debugger/2.2.0.0__31bf3856ad364e35/System.Reactive.Debugger.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Debugger/2.2.0.0__31bf3856ad364e35/System.Reactive.Debugger.dll deleted file mode 100644 index 017efea9d..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Debugger/2.2.0.0__31bf3856ad364e35/System.Reactive.Debugger.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8d86f058f7449f9562487d55fc6f6d8c48d1ae392031693c412027ab8c725dc -size 5120 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Experimental/2.2.0.0__31bf3856ad364e35/System.Reactive.Experimental.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Experimental/2.2.0.0__31bf3856ad364e35/System.Reactive.Experimental.dll deleted file mode 100644 index 8cd931a90..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Experimental/2.2.0.0__31bf3856ad364e35/System.Reactive.Experimental.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:270fc54fffab856dc39c59f4b8f36c3ea100077d277f8376b38c0defc4ca7106 -size 28672 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Interfaces/2.2.0.0__31bf3856ad364e35/System.Reactive.Interfaces.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Interfaces/2.2.0.0__31bf3856ad364e35/System.Reactive.Interfaces.dll deleted file mode 100644 index cd36c3941..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Interfaces/2.2.0.0__31bf3856ad364e35/System.Reactive.Interfaces.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d9455be0e328fb04c676c098ddbdaae2ec502c3c0c40e5fa8df55eea934be88 -size 7680 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Linq/2.2.0.0__31bf3856ad364e35/System.Reactive.Linq.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Linq/2.2.0.0__31bf3856ad364e35/System.Reactive.Linq.dll deleted file mode 100644 index 896df65a1..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Linq/2.2.0.0__31bf3856ad364e35/System.Reactive.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c3d59871c8372fe66118ad949fb63e27d1c9a5224411ca8ea6ff72e7810ce97 -size 683008 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Observable.Aliases/0.0.0.0__31bf3856ad364e35/System.Reactive.Observable.Aliases.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Observable.Aliases/0.0.0.0__31bf3856ad364e35/System.Reactive.Observable.Aliases.dll deleted file mode 100644 index ca13cac26..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Observable.Aliases/0.0.0.0__31bf3856ad364e35/System.Reactive.Observable.Aliases.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d5c4c8215b336d46a9c0c2c17eb7e5b5f0cd1fd4dcb000c078c4e04eaceebf5 -size 9728 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.PlatformServices/2.2.0.0__31bf3856ad364e35/System.Reactive.PlatformServices.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.PlatformServices/2.2.0.0__31bf3856ad364e35/System.Reactive.PlatformServices.dll deleted file mode 100644 index 5d81b4873..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.PlatformServices/2.2.0.0__31bf3856ad364e35/System.Reactive.PlatformServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79083f313b2f5e3b20faa88e49205aece830c554e2fc7166d2163aa6367378bd -size 22528 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Providers/2.2.0.0__31bf3856ad364e35/System.Reactive.Providers.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Providers/2.2.0.0__31bf3856ad364e35/System.Reactive.Providers.dll deleted file mode 100644 index 6baa78665..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Providers/2.2.0.0__31bf3856ad364e35/System.Reactive.Providers.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6cca58ace28725eab8be54c5ce63f38226e00491e6f18e870f2c4de955f7eb1 -size 243200 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Runtime.Remoting/2.2.0.0__31bf3856ad364e35/System.Reactive.Runtime.Remoting.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Runtime.Remoting/2.2.0.0__31bf3856ad364e35/System.Reactive.Runtime.Remoting.dll deleted file mode 100644 index a76d185f1..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Runtime.Remoting/2.2.0.0__31bf3856ad364e35/System.Reactive.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1de1731d7fb418f4d190d8bfb4a82c9fa98a7ed2dfb87c9f090b86f5859df9e3 -size 9216 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Windows.Forms/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Forms.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Windows.Forms/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Forms.dll deleted file mode 100644 index 9732542ef..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Windows.Forms/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a45b23e876eaa89da807f8e569d4310b7837b15e8c1fa5d7f96b0cfc102a4e9a -size 9728 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Windows.Threading/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Threading.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Windows.Threading/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Threading.dll deleted file mode 100644 index c7d365f14..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reactive.Windows.Threading/2.2.0.0__31bf3856ad364e35/System.Reactive.Windows.Threading.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4bab7f093518c414085258a5ed9da770be284b6a0fd50717d7890ec743e7ec7 -size 12800 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reflection.Context/4.0.0.0__b77a5c561934e089/System.Reflection.Context.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reflection.Context/4.0.0.0__b77a5c561934e089/System.Reflection.Context.dll deleted file mode 100644 index 35115a643..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Reflection.Context/4.0.0.0__b77a5c561934e089/System.Reflection.Context.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd06d517d0d44a2f2c0b9ef30212f54f3c36b0db8c6efacab98a4685b1f64dea -size 13312 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll deleted file mode 100644 index fc7961035..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Runtime.Caching/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Caching.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44472e1daf4804d9cbb27570a33637f8fff7baaf2a34cb1b0265ec0ce126560a -size 72192 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll deleted file mode 100644 index d8deafe7b..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Runtime.DurableInstancing/4.0.0.0__31bf3856ad364e35/System.Runtime.DurableInstancing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a602889eb1f44c67e0f007302b60cc597cebbe1497602251b72aead641b0b30 -size 107008 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll deleted file mode 100644 index 739ba99fb..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Runtime.Remoting/4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f969cb59d10e32c8ca64315202d9b7f4c281f90644eb3def96043630db93cea1 -size 119808 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll deleted file mode 100644 index fd8edb333..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization.Formatters.Soap/4.0.0.0__b03f5f7f11d50a3a/System.Runtime.Serialization.Formatters.Soap.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11095119a3bb3e90062f5d945ee84cafd9f5d398b3469b7dea93226a8969f597 -size 38912 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll deleted file mode 100644 index 86d9f24ec..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Runtime.Serialization/4.0.0.0__b77a5c561934e089/System.Runtime.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e79e892dd359575db05e94540e258abd7d00d866537884b08f40496b8324bda1 -size 934400 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll deleted file mode 100644 index e9f767348..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3aa7e023a1603b1b8a75238fd90d84404270f4d0e1e19f4b990d516da69c4ae5 -size 281600 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll deleted file mode 100644 index 0549bdb6d..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceModel.Activation/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Activation.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f469c217afd60fcb81a9a74465cbf0354d8e67d1d2e7092a0e58868a0048c8d9 -size 13312 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll deleted file mode 100644 index 91210a18c..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceModel.Discovery/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Discovery.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99fe4cfa49222d8d6c8a1168e42be676574dd035040b1bbe4528c32b215e2c8f -size 141312 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll deleted file mode 100644 index 3c8004057..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceModel.Internals/0.0.0.0__b77a5c561934e089/System.ServiceModel.Internals.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a89bf31e08fee2d8922b534387b5e1b73f66de4aaff8ef3267574c55dfa8b099 -size 214528 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll deleted file mode 100644 index 7f7a47794..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceModel.Routing/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3f2ebe00b9ce96573985d158625c77d67fddf9ffb9c6932f88b094f01dfd68f -size 37376 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll deleted file mode 100644 index 40e3cc005..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceModel.Web/4.0.0.0__31bf3856ad364e35/System.ServiceModel.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60bbb932cfd6740d5f33eb1606f5f37c84177dc690b0621a369015eb1c039cfa -size 79360 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll deleted file mode 100644 index 963c03d04..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceModel/4.0.0.0__b77a5c561934e089/System.ServiceModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5a0ac8df58b6ec822693e7560d99bdf18390c653255b32c944b15b6a3444ec4 -size 1426944 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll deleted file mode 100644 index 7f7f8abc4..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.ServiceProcess/4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c4a73a29be261f5ccb86488ffe10f0a39e89da06bd79dfb14a8fcfa9220ab0d -size 47104 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Threading.Tasks.Dataflow/4.0.0.0__b77a5c561934e089/System.Threading.Tasks.Dataflow.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Threading.Tasks.Dataflow/4.0.0.0__b77a5c561934e089/System.Threading.Tasks.Dataflow.dll deleted file mode 100644 index 4e93ddc2f..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Threading.Tasks.Dataflow/4.0.0.0__b77a5c561934e089/System.Threading.Tasks.Dataflow.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0cb9c05d93e946fb60be318c84f8f160b9a629a419932ec5a7d15caaaf684f8f -size 168960 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll deleted file mode 100644 index 5a32ec0ad..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Transactions/4.0.0.0__b77a5c561934e089/System.Transactions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c42f2468cda39b9a52b122dcd18d0377220c396cb69b2b493ce7f8754fc1f1d -size 34304 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll deleted file mode 100644 index 98eb8573f..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Abstractions/4.0.0.0__31bf3856ad364e35/System.Web.Abstractions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c3f86f31d8a6ae98982e2d3dac1fd8f25b1ebb58f1206edfb118a41e9ffd319 -size 12800 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll deleted file mode 100644 index fdca73577..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.ApplicationServices/4.0.0.0__31bf3856ad364e35/System.Web.ApplicationServices.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fabe15ee190b3d1c4ffaa467cd76bfeeb174c26e85f9324b30a5ffaab13d5bf -size 33792 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll deleted file mode 100644 index ef466b724..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.DynamicData/4.0.0.0__31bf3856ad364e35/System.Web.DynamicData.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66a107c6d94a6f4811240d1fde552d9fdac32b4a0cb985766e6c5570e1661002 -size 69120 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll deleted file mode 100644 index 7b6226fef..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Extensions/4.0.0.0__31bf3856ad364e35/System.Web.Extensions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0162659ab054c3969ae150f0e05368b57e45518c49ac3ceb97c5d55a6c529cf9 -size 746496 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll deleted file mode 100644 index 74f0a27c1..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Http.SelfHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.SelfHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53b4ec85036c686ffac982c7bdfe9991ac25fb6e316a341a5a07ce96e9513e55 -size 88064 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll deleted file mode 100644 index fc0cbcc1e..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Http.WebHost/4.0.0.0__31bf3856ad364e35/System.Web.Http.WebHost.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4cc0e41b1640296696ed6d3a6940acdb0746e45549f97809ea634444eadbca72 -size 56320 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll deleted file mode 100644 index c11535639..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Http/4.0.0.0__31bf3856ad364e35/System.Web.Http.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d3314f0fd4caab1d63c2349c30ef557c74ae3ff2719a7998873b62180261f52 -size 326144 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Mobile/4.0.0.0__b03f5f7f11d50a3a/System.Web.Mobile.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Mobile/4.0.0.0__b03f5f7f11d50a3a/System.Web.Mobile.dll deleted file mode 100644 index 2f83ca253..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Mobile/4.0.0.0__b03f5f7f11d50a3a/System.Web.Mobile.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a836e3e93e5828736088cde47e28512c5cc57a2009db9805a797516e70245b7 -size 11264 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll deleted file mode 100644 index 985161adf..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Mvc/3.0.0.0__31bf3856ad364e35/System.Web.Mvc.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e16b3608d9d80935dfb5d7fee7c52ff010313177c336e699e197521f57a776e -size 420352 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll deleted file mode 100644 index dbcb53418..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Razor/2.0.0.0__31bf3856ad364e35/System.Web.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c880284f07b77730ff6f403c404165de5bfc6cef7c114015f357f375b59200d9 -size 254976 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.RegularExpressions/4.0.0.0__b03f5f7f11d50a3a/System.Web.RegularExpressions.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.RegularExpressions/4.0.0.0__b03f5f7f11d50a3a/System.Web.RegularExpressions.dll deleted file mode 100644 index 8e64c7e1d..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.RegularExpressions/4.0.0.0__b03f5f7f11d50a3a/System.Web.RegularExpressions.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ac0e21ae2a3806a9b4022003e34c8fec95764b41de2b1c22053a5a4210b99f5 -size 11776 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll deleted file mode 100644 index 84a86a1ff..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Routing/4.0.0.0__31bf3856ad364e35/System.Web.Routing.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f77a573dbf24e8d4c97b10ac1db02006a3a10b59fcf00f491a48d95e08f2d9a5 -size 12288 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll deleted file mode 100644 index 684f807d8..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.Services/4.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e6957762acf08a660d95f8f53360b0f5d5f964faff1e8883a0a05d17d088181 -size 736256 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll deleted file mode 100644 index 217074c81..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Deployment/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Deployment.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3b155c702b203bd92bb000674ecbb17268c1f286d862456420a07fb06aea296 -size 39424 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll deleted file mode 100644 index 9c180770d..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.WebPages.Razor/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.Razor.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1935aae7b622b37295665235e0ec74a8821b3c010c20f558b3d13be42d1e77c6 -size 38400 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll deleted file mode 100644 index bc5c14264..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web.WebPages/2.0.0.0__31bf3856ad364e35/System.Web.WebPages.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5cb446d04971bbd2b6e911b9751c953f95d41f2c1d86291d683caf62644c613 -size 196608 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll deleted file mode 100644 index 76076e618..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Web/4.0.0.0__b03f5f7f11d50a3a/System.Web.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5edaae59667f870f05981d83c31ff25de85a56bcac1c3c21b2a3536439ef6930 -size 3030016 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Windows.Forms.DataVisualization/4.0.0.0__31bf3856ad364e35/System.Windows.Forms.DataVisualization.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Windows.Forms.DataVisualization/4.0.0.0__31bf3856ad364e35/System.Windows.Forms.DataVisualization.dll deleted file mode 100644 index 23fa3775b..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Windows.Forms.DataVisualization/4.0.0.0__31bf3856ad364e35/System.Windows.Forms.DataVisualization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8313360d08f86b6c805df0a3576a2dc2f5d253241ba22a868e65b09d947343bf -size 145920 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll deleted file mode 100644 index 3ff3435d4..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Windows.Forms/4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2cb88a463f0f8e7025b6e6988ee2e3d4001ce0b7cf5a37560e1002e325bb0eb -size 2898432 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Windows/4.0.0.0__b03f5f7f11d50a3a/System.Windows.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Windows/4.0.0.0__b03f5f7f11d50a3a/System.Windows.dll deleted file mode 100644 index a0d16168d..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Windows/4.0.0.0__b03f5f7f11d50a3a/System.Windows.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec90da3e05d35fa76a1d576a9c14e0fb95e9c5016305352607029ff080a4bc1a -size 11776 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Workflow.Activities/4.0.0.0__31bf3856ad364e35/System.Workflow.Activities.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Workflow.Activities/4.0.0.0__31bf3856ad364e35/System.Workflow.Activities.dll deleted file mode 100644 index 159d8a7e5..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Workflow.Activities/4.0.0.0__31bf3856ad364e35/System.Workflow.Activities.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ffda734f630f52c7aabf9b6dfbb1cfd43be266f5761f8df8e1ae1b9e5f7dcc1 -size 11776 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Workflow.ComponentModel/4.0.0.0__31bf3856ad364e35/System.Workflow.ComponentModel.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Workflow.ComponentModel/4.0.0.0__31bf3856ad364e35/System.Workflow.ComponentModel.dll deleted file mode 100644 index 2547b6648..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Workflow.ComponentModel/4.0.0.0__31bf3856ad364e35/System.Workflow.ComponentModel.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c0c81efccdd49d67ba923bb9f96e7b095ae0c5726620ab0e98ecaab65dc299b -size 11776 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Workflow.Runtime/4.0.0.0__31bf3856ad364e35/System.Workflow.Runtime.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Workflow.Runtime/4.0.0.0__31bf3856ad364e35/System.Workflow.Runtime.dll deleted file mode 100644 index 2c2b17854..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Workflow.Runtime/4.0.0.0__31bf3856ad364e35/System.Workflow.Runtime.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b09dd31624af27363fab179b4b0a2dae32e698eb4284f187742a3129f1f44e9 -size 11776 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll deleted file mode 100644 index 9d4b1802f..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Xaml/4.0.0.0__b77a5c561934e089/System.Xaml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:610a9d1d412a1785d2d04be3549e8b708977ddcfb3cd73241a659afa5039a381 -size 188928 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll deleted file mode 100644 index 07bb029db..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Xml.Linq/4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74e12d93dc79b18aef8241d4dbfc7a5ab4a2457ec94f087ab280809dde3cb9b0 -size 137216 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Xml.Serialization/4.0.0.0__b77a5c561934e089/System.Xml.Serialization.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Xml.Serialization/4.0.0.0__b77a5c561934e089/System.Xml.Serialization.dll deleted file mode 100644 index 71501bb82..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Xml.Serialization/4.0.0.0__b77a5c561934e089/System.Xml.Serialization.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d51a04521acc7d37047913b82a2973edcaf6db96ce74f2e3fe3fa506d1b0b70 -size 11776 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll deleted file mode 100644 index 88dfe5ae7..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58196401c5c8f3323e0912b4422137612bd7eb2a3821cb53c4ac74fb7b26dda1 -size 3174912 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll deleted file mode 100644 index 997f34981..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb1d7b4b87422c0cd8f0aa847c382cbcb1bad88872f013ef164eaaf0ed76a5fc -size 2456064 diff --git a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll b/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll deleted file mode 100644 index 345f59f24..000000000 --- a/Source/Platforms/Windows/Binaries/Mono/lib/mono/gac/WindowsBase/4.0.0.0__31bf3856ad364e35/WindowsBase.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:445e763848380e33861eda9af9b2d871237c12f4799603f32b0c42abf9875a7c -size 161792 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/FastXml_64.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/FastXml_64.pdb index fb7641343..43a87a79d 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/FastXml_64.pdb +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/FastXml_64.pdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6f750ddb111526b83b5613a3831a662ad4c1e3ea59af3ed77958953d9b8daf4d -size 102400 +oid sha256:132883c177c47a532afd6fa33b5a2f498cd310001400062a6df33743c4d5e784 +size 118784 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/LowLevelAABB_64.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/LowLevelAABB_64.pdb index 1d95f1e7e..819f1d896 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/LowLevelAABB_64.pdb +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/LowLevelAABB_64.pdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6fd6a4071042e5d89d5309383b78b55c15e4eac473da3fd38f3b9a4fc68778ce -size 618496 +oid sha256:7668042f2a51ef982925d28ec57efe89f3adfc0f0bdd45c0d836ea810010d0a1 +size 593920 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/LowLevelDynamics_64.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/LowLevelDynamics_64.pdb index 214dd67f9..e96418eed 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/LowLevelDynamics_64.pdb +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/LowLevelDynamics_64.pdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ec9dfc61ef830e7c60f17207c8dc6e16bbae5edebd2857fa765e70f97ad4c308 -size 1183744 +oid sha256:f5eb77e8531012b27e7616f097e17bd15a0d30f0314f311bacefa67610eb873c +size 1339392 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/LowLevel_64.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/LowLevel_64.pdb index 6984ff3cc..a6f6b58f8 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/LowLevel_64.pdb +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/LowLevel_64.pdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:14a04e5a22a3160788575e9a90d1c342f1ca659b2a68d62971d20fd19c4fd3d7 -size 1003520 +oid sha256:c5ed568ad39c0d14de2e51b413657cc965ee2e831b4b6bc7e6418d16fa697163 +size 1257472 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/MonoPosixHelper.dll b/Source/Platforms/Windows/Binaries/ThirdParty/x64/MonoPosixHelper.dll deleted file mode 100644 index dd082f208..000000000 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/MonoPosixHelper.dll +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:35a252fcb61a805c85558646d073e32f7eb54666931a73380b4dea2879c72584 -size 157696 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCharacterKinematic_static_64.lib b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCharacterKinematic_static_64.lib index 6e8a292cd..c9e7b5dfe 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCharacterKinematic_static_64.lib +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCharacterKinematic_static_64.lib @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:af188ecf8db6cdf7c674acf10a974df921cf8031db2f72e821bec6284a6df030 -size 1123270 +oid sha256:603e6025b22349137e7244bf6ca4056e09e6947660469269da1944d9f92e02fb +size 1306220 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCharacterKinematic_static_64.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCharacterKinematic_static_64.pdb index 358f282fa..b82c855c8 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCharacterKinematic_static_64.pdb +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCharacterKinematic_static_64.pdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c30d8a01ab33c44b8fed8827bd4844f93ee2a8f5bbdb0457ea6f040c36b53c76 -size 602112 +oid sha256:1c870f987df7407b2edc5615a5fb4d3cb942af801d0260a13de1d27e52eac4fb +size 675840 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCommon_static_64.lib b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCommon_static_64.lib index a9e082525..56a97a846 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCommon_static_64.lib +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCommon_static_64.lib @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:69534d12a3bd51641dbeb88557a0cbc5e904d8aac691e31b75c0d61b7459c8a6 -size 16676186 +oid sha256:d2b2093cf1f72c4135f653875f0fe0fa33d6696d34c29b6ac8d4ac3bb7aa92c1 +size 26130976 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCommon_static_64.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCommon_static_64.pdb index c8ebe8701..4c3883939 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCommon_static_64.pdb +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCommon_static_64.pdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0bed63cba17ff5fc909eb6e398f49d6d8e74650d5e99ed93a970848e64b51aad -size 1052672 +oid sha256:e0c09e6550a0ab319a7cde6382cc31ba31113d54d8d779444435e56213d07285 +size 1822720 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCooking_static_64.lib b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCooking_static_64.lib index 1ee0be725..7a47a2ddb 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCooking_static_64.lib +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCooking_static_64.lib @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bb3edb333102f96be621b41a7436d7009ebf1bd85eec10a481bb226ff2951933 -size 1785248 +oid sha256:ea85451d201ceeea71fd46bb01b5dc3501a05c77538bb85ae665ec6c0385c350 +size 130200 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCooking_static_64.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCooking_static_64.pdb index dfd47dad6..c79307c68 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCooking_static_64.pdb +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXCooking_static_64.pdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cb03d9c045c60d9ecf336555d36e73b8f5a0013196843c579df3f3320f4293ed -size 643072 +oid sha256:7f18f710748a40b3be245f1027748ed6c9fe6058e049c3926632c0658dd983f4 +size 397312 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXExtensions_static_64.lib b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXExtensions_static_64.lib index 65a0491e8..7d543561d 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXExtensions_static_64.lib +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXExtensions_static_64.lib @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e0c40331f0f3699de270b13e4e3902351cee4453d303267ef26efbb74ffce68d -size 11528512 +oid sha256:f880ee07970656a19ac9a811f16be3edeed06834886606f2385bbcce9389ea4c +size 17300374 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXExtensions_static_64.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXExtensions_static_64.pdb index be03ed1d4..b6401abd3 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXExtensions_static_64.pdb +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXExtensions_static_64.pdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f124ce8a0c90c95530b59fb2853d719da1d1593f2b8fe028d3b124f73225254f -size 3452928 +oid sha256:abd53b7899e7bce0b2180189d8c28df8b38107bb90cdd6078069c9d869169d9a +size 5156864 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXFoundation_static_64.lib b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXFoundation_static_64.lib index 551d0c1b6..dcb1935ee 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXFoundation_static_64.lib +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXFoundation_static_64.lib @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3d835510d536e817c3af9eecd8aabf4d080280714daa3220b944ff791de8d2ba -size 401660 +oid sha256:3f84c317ca2181e564fd7f6814898f9a1c738e3f157e5974da1fcf72d6abe8f9 +size 585126 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXFoundation_static_64.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXFoundation_static_64.pdb index ebc0b6a3d..f784a8e8e 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXFoundation_static_64.pdb +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXFoundation_static_64.pdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:acf68cf96b5d43d4349e6fddb0e2a32ad8216c7a3bd30fe14303befc818dca27 -size 282624 +oid sha256:4c4094a92b9252e8f0dee08600ef5f93fa01abb9b21fe4a2944114d41cd143ec +size 299008 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXPvdSDK_static_64.lib b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXPvdSDK_static_64.lib index a3606e504..52b0147b0 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXPvdSDK_static_64.lib +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXPvdSDK_static_64.lib @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:05dee85c255e798f0bfcdff521370fcc8cb744a7e962da3c2e63e4318109b92f -size 1969384 +oid sha256:747ed5f9e098e9c8e0a75cdfdfd09e82b338904b5916cc60df45d585f398b215 +size 2073834 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXPvdSDK_static_64.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXPvdSDK_static_64.pdb index 94675ac83..3778728ef 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXPvdSDK_static_64.pdb +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXPvdSDK_static_64.pdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:495b53259f8b6fd8fab6d955a634d485c49c3dfd8107ea115f219e64696a3e06 -size 913408 +oid sha256:227c4cddf1a1326c6f6a9cfb106c592f75433fcf047971f63c8bc992c6f16369 +size 946176 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXTask_64.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXTask_64.pdb index 1b314f838..ed9215af3 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXTask_64.pdb +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXTask_64.pdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:198a0524f71154057a2de8f15d01e520ef2fc3395448bc269b2ff8cfff7bc9cf -size 135168 +oid sha256:ea9f74cc743bf588cbb9e6a5dbe544551eefe6be2ffa1c0232908159f3fd2612 +size 143360 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXVehicle2_static_64.lib b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXVehicle2_static_64.lib new file mode 100644 index 000000000..1c7cb3bc0 --- /dev/null +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXVehicle2_static_64.lib @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c0c1865cba540abc026208ebf09653bb30f1ab9f800d65d53ea716e9b21ba64 +size 1125480 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXVehicle2_static_64.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXVehicle2_static_64.pdb new file mode 100644 index 000000000..11ae60a06 --- /dev/null +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXVehicle2_static_64.pdb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f83d273d0419023214b3f5094bfc23bd567c495bcf262fb6b2d696427a390f19 +size 733184 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXVehicle_static_64.lib b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXVehicle_static_64.lib index 1c32f639e..c71216d38 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXVehicle_static_64.lib +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXVehicle_static_64.lib @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d9834c255066c95f779e16821b503e5bd8ba13d6c245d1945f0b96c79f09518f -size 6573276 +oid sha256:64d9bd9c981905263b5d10ab9a9b2153785b58d6405ad99ed5119d4b70b55f51 +size 5843352 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXVehicle_static_64.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXVehicle_static_64.pdb index 7e7c940e0..67447c121 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXVehicle_static_64.pdb +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysXVehicle_static_64.pdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:99007463b16736a56f03caed5112cdb9996c64d43fd5b725d3328a2f1f83da1c -size 3125248 +oid sha256:eba825400abc8140c3d496ff0ad6df25ae9b4d4d2acb63db81171250d874e8b9 +size 3862528 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysX_static_64.lib b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysX_static_64.lib index 25369b45b..8a0399bd7 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysX_static_64.lib +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysX_static_64.lib @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a7db86e26551e2571591ad561e3b2625a4ca810537dfa80e689aaceab96b7930 -size 28035948 +oid sha256:8311b062fb2153604f3eddee2d2a5720beb7f571159e8b1ed8c9fa89d3a3d6c5 +size 34826088 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysX_static_64.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysX_static_64.pdb index a518ff696..6b3fbcb2d 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysX_static_64.pdb +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/PhysX_static_64.pdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:325986c22c99cb302edb03c328bea61e4b6650352d00ee2e0058d2034b3450d0 -size 3575808 +oid sha256:a332f82798acafc6423c40e09223d7781abc43fbe5cbe1aed9069937ed7de180 +size 4558848 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/SceneQuery_64.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/SceneQuery_64.pdb index b46ad5252..c6196ff06 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/SceneQuery_64.pdb +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/SceneQuery_64.pdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cf69c8a1ae3a867e05873fbacab78fa9d6892494282cc5bab80b0a49bc5d95f0 -size 1937408 +oid sha256:ac1251babb3766e7e9bc2efc40873b43aa1ae55b331918c9dc790f82b9e77d4f +size 544768 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/SimulationController_64.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/SimulationController_64.pdb index 62ed91d2c..92b08e4bc 100644 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/SimulationController_64.pdb +++ b/Source/Platforms/Windows/Binaries/ThirdParty/x64/SimulationController_64.pdb @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4174639bf5353187de2dca86901bd15a617ac4d16b5a8e9de42c71a92ee8cef2 -size 2191360 +oid sha256:b11081d87071515d65544c9265b9bd09bb66af0810fbd6ec03bd28512892466b +size 2699264 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/eglib.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/eglib.pdb deleted file mode 100644 index a79f59aac..000000000 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/eglib.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ff34e923a27392a70eb465df1ecc03372aadac6f2753832cce3d82cd5ae1b75 -size 159744 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/libgcmonosgen.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/libgcmonosgen.pdb deleted file mode 100644 index 166a8df92..000000000 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/libgcmonosgen.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d165b1a28ce64c030b4d242b86b813292ce038e0155ad0d6025ed7472e036ce4 -size 348160 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/libmini.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/libmini.pdb deleted file mode 100644 index 719362b2d..000000000 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/libmini.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9cc98ae831f784a7dd6f15a1dbb083c63e6c50100a201501a7825a6d85baf53e -size 864256 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/libmono-static.lib b/Source/Platforms/Windows/Binaries/ThirdParty/x64/libmono-static.lib deleted file mode 100644 index 1cc28852d..000000000 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/libmono-static.lib +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2eac1fd52b8d87a0fe4dce3c02e68da8b35bfaa44cb1689d5d8935f2ba09531b -size 28241218 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/libmonoruntime.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/libmonoruntime.pdb deleted file mode 100644 index c60e7dbe4..000000000 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/libmonoruntime.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:188ebd527b432f33f8bfccb4fbada27b029f362918ab5c4b6f82584f9d30b6f3 -size 1249280 diff --git a/Source/Platforms/Windows/Binaries/ThirdParty/x64/libmonoutils.pdb b/Source/Platforms/Windows/Binaries/ThirdParty/x64/libmonoutils.pdb deleted file mode 100644 index 30be1562b..000000000 --- a/Source/Platforms/Windows/Binaries/ThirdParty/x64/libmonoutils.pdb +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:289966b7d9ff6255e38a6e45d2b9a5179c42e0f1add6abb70f7fa5501dfc59bc -size 356352 diff --git a/Source/Platforms/Editor/Linux/.gitignore b/Source/Platforms/iOS/.gitignore similarity index 100% rename from Source/Platforms/Editor/Linux/.gitignore rename to Source/Platforms/iOS/.gitignore diff --git a/Source/Platforms/iOS/Binaries/Project/ExportOptions.plist b/Source/Platforms/iOS/Binaries/Project/ExportOptions.plist new file mode 100644 index 000000000..9c8037d53 --- /dev/null +++ b/Source/Platforms/iOS/Binaries/Project/ExportOptions.plist @@ -0,0 +1,14 @@ + + + + + method + ${ExportMethod} + + teamID + ${AppTeamId} + + compileBitcode + + + diff --git a/Source/Platforms/iOS/Binaries/Project/FlaxGame.xcodeproj/project.pbxproj b/Source/Platforms/iOS/Binaries/Project/FlaxGame.xcodeproj/project.pbxproj new file mode 100644 index 000000000..1dd5d4e01 --- /dev/null +++ b/Source/Platforms/iOS/Binaries/Project/FlaxGame.xcodeproj/project.pbxproj @@ -0,0 +1,391 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 2E6ABCC32A1540AF003DBD6D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2E6ABCC22A1540AF003DBD6D /* Assets.xcassets */; }; + 2E6ABCC62A1540AF003DBD6D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2E6ABCC42A1540AF003DBD6D /* LaunchScreen.storyboard */; }; + 2E6ABCC82A1540AF003DBD6D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2E6ABCC72A1540AF003DBD6D /* main.m */; }; +${PBXBuildFile} +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 2EE436B82A220EAA00206A23 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( +${PBXCopyFilesBuildPhaseFiles} + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 2E6ABCB02A1540AD003DBD6D /* FlaxGame.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FlaxGame.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 2E6ABCC22A1540AF003DBD6D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 2E6ABCC52A1540AF003DBD6D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 2E6ABCC72A1540AF003DBD6D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; +${PBXFileReference} +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 2E6ABCAD2A1540AD003DBD6D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( +${PBXFrameworksBuildPhase} + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2E6ABCA72A1540AD003DBD6D = { + isa = PBXGroup; + children = ( + 2E6ABCB22A1540AD003DBD6D /* FlaxGame */, + 2E6ABCB12A1540AD003DBD6D /* Products */, + 2EE436B42A220EA900206A23 /* Frameworks */, + ); + sourceTree = ""; + }; + 2E6ABCB12A1540AD003DBD6D /* Products */ = { + isa = PBXGroup; + children = ( + 2E6ABCB02A1540AD003DBD6D /* FlaxGame.app */, + ); + name = Products; + sourceTree = ""; + }; + 2E6ABCB22A1540AD003DBD6D /* FlaxGame */ = { + isa = PBXGroup; + children = ( +${PBXFilesGroup} + 2E6ABCC22A1540AF003DBD6D /* Assets.xcassets */, + 2E6ABCC42A1540AF003DBD6D /* LaunchScreen.storyboard */, + 2E6ABCC72A1540AF003DBD6D /* main.m */, + ); + path = FlaxGame; + sourceTree = ""; + }; + 2EE436B42A220EA900206A23 /* Frameworks */ = { + isa = PBXGroup; + children = ( +${PBXFrameworksGroup} + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 2E6ABCAF2A1540AD003DBD6D /* FlaxGame */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2E6ABCCB2A1540AF003DBD6D /* Build configuration list for PBXNativeTarget "FlaxGame" */; + buildPhases = ( + 2E6ABCAC2A1540AD003DBD6D /* Sources */, + 2E6ABCAD2A1540AD003DBD6D /* Frameworks */, + 2E6ABCAE2A1540AD003DBD6D /* Resources */, + 2EE436B82A220EAA00206A23 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = FlaxGame; + productName = ${AppName}; + productReference = 2E6ABCB02A1540AD003DBD6D /* FlaxGame.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 2E6ABCA82A1540AD003DBD6D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastUpgradeCheck = 1430; + TargetAttributes = { + 2E6ABCAF2A1540AD003DBD6D = { + CreatedOnToolsVersion = 14.3; + }; + }; + }; + buildConfigurationList = 2E6ABCAB2A1540AD003DBD6D /* Build configuration list for PBXProject "FlaxGame" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 2E6ABCA72A1540AD003DBD6D; + productRefGroup = 2E6ABCB12A1540AD003DBD6D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 2E6ABCAF2A1540AD003DBD6D /* FlaxGame */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 2E6ABCAE2A1540AD003DBD6D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( +${PBXResourcesGroup} + 2E6ABCC62A1540AF003DBD6D /* LaunchScreen.storyboard in Resources */, + 2E6ABCC32A1540AF003DBD6D /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 2E6ABCAC2A1540AD003DBD6D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2E6ABCC82A1540AF003DBD6D /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 2E6ABCC42A1540AF003DBD6D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 2E6ABCC52A1540AF003DBD6D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 2E6ABCC92A1540AF003DBD6D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ${HeaderSearchPaths}; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 2E6ABCCA2A1540AF003DBD6D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ${HeaderSearchPaths}; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 2E6ABCCC2A1540AF003DBD6D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = ${AppVersion}; + DEVELOPMENT_TEAM = ${AppTeamId}; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = "${ProjectName}"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIRequiredDeviceCapabilities = metal; + INFOPLIST_KEY_UIRequiresFullScreen = YES; + INFOPLIST_KEY_UIStatusBarHidden = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "${UISupportedInterfaceOrientations_iPad}"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "${UISupportedInterfaceOrientations_iPhone}"; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/FlaxGame", + "$(PROJECT_DIR)/FlaxGame/Data", + "$(PROJECT_DIR)/FlaxGame/Data/Dotnet", + ); + MARKETING_VERSION = ${ProjectVersion}; + PRODUCT_BUNDLE_IDENTIFIER = ${AppIdentifier}; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 2E6ABCCD2A1540AF003DBD6D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = ${AppVersion}; + DEVELOPMENT_TEAM = ${AppTeamId}; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_CFBundleDisplayName = "${ProjectName}"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.games"; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UIRequiredDeviceCapabilities = metal; + INFOPLIST_KEY_UIRequiresFullScreen = YES; + INFOPLIST_KEY_UIStatusBarHidden = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "${UISupportedInterfaceOrientations_iPad}"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "${UISupportedInterfaceOrientations_iPhone}"; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/FlaxGame", + "$(PROJECT_DIR)/FlaxGame/Data", + "$(PROJECT_DIR)/FlaxGame/Data/Dotnet", + ); + MARKETING_VERSION = ${ProjectVersion}; + PRODUCT_BUNDLE_IDENTIFIER = ${AppIdentifier}; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2E6ABCAB2A1540AD003DBD6D /* Build configuration list for PBXProject "FlaxGame" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2E6ABCC92A1540AF003DBD6D /* Debug */, + 2E6ABCCA2A1540AF003DBD6D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2E6ABCCB2A1540AF003DBD6D /* Build configuration list for PBXNativeTarget "FlaxGame" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2E6ABCCC2A1540AF003DBD6D /* Debug */, + 2E6ABCCD2A1540AF003DBD6D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 2E6ABCA82A1540AD003DBD6D /* Project object */; +} diff --git a/Source/Platforms/iOS/Binaries/Project/FlaxGame.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Source/Platforms/iOS/Binaries/Project/FlaxGame.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..919434a62 --- /dev/null +++ b/Source/Platforms/iOS/Binaries/Project/FlaxGame.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Source/Platforms/iOS/Binaries/Project/FlaxGame.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Source/Platforms/iOS/Binaries/Project/FlaxGame.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/Source/Platforms/iOS/Binaries/Project/FlaxGame.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Source/Platforms/iOS/Binaries/Project/FlaxGame.xcodeproj/xcshareddata/xcschemes/FlaxGame.xcscheme b/Source/Platforms/iOS/Binaries/Project/FlaxGame.xcodeproj/xcshareddata/xcschemes/FlaxGame.xcscheme new file mode 100644 index 000000000..dffb2d957 --- /dev/null +++ b/Source/Platforms/iOS/Binaries/Project/FlaxGame.xcodeproj/xcshareddata/xcschemes/FlaxGame.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Platforms/iOS/Binaries/Project/FlaxGame/Assets.xcassets/AccentColor.colorset/Contents.json b/Source/Platforms/iOS/Binaries/Project/FlaxGame/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 000000000..eb8789700 --- /dev/null +++ b/Source/Platforms/iOS/Binaries/Project/FlaxGame/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Source/Platforms/iOS/Binaries/Project/FlaxGame/Assets.xcassets/AppIcon.appiconset/Contents.json b/Source/Platforms/iOS/Binaries/Project/FlaxGame/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..9ec42b14d --- /dev/null +++ b/Source/Platforms/iOS/Binaries/Project/FlaxGame/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "ios_store_icon.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Source/Platforms/iOS/Binaries/Project/FlaxGame/Assets.xcassets/Contents.json b/Source/Platforms/iOS/Binaries/Project/FlaxGame/Assets.xcassets/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/Source/Platforms/iOS/Binaries/Project/FlaxGame/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Source/Platforms/iOS/Binaries/Project/FlaxGame/Base.lproj/LaunchScreen.storyboard b/Source/Platforms/iOS/Binaries/Project/FlaxGame/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000..865e9329f --- /dev/null +++ b/Source/Platforms/iOS/Binaries/Project/FlaxGame/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Source/Platforms/iOS/Binaries/Project/FlaxGame/main.m b/Source/Platforms/iOS/Binaries/Project/FlaxGame/main.m new file mode 100644 index 000000000..92cdfb019 --- /dev/null +++ b/Source/Platforms/iOS/Binaries/Project/FlaxGame/main.m @@ -0,0 +1,11 @@ +#import +#import + +int main(int argc, char* argv[]) +{ + NSString* appDelegateClassName; + @autoreleasepool { + appDelegateClassName = NSStringFromClass([FlaxAppDelegate class]); + } + return UIApplicationMain(argc, argv, nil, appDelegateClassName); +} diff --git a/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXCharacterKinematic_static_64.a b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXCharacterKinematic_static_64.a new file mode 100644 index 000000000..12b08f70a --- /dev/null +++ b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXCharacterKinematic_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd561fb2705fae1b2be8e512a7ac6dab3bf8ccea3bc5aedb7fac948c27f8fcfe +size 2605680 diff --git a/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXCommon_static_64.a b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXCommon_static_64.a new file mode 100644 index 000000000..db887da54 --- /dev/null +++ b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXCommon_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81bf0217e8297a347acfb3a09735404be2d4174ac9d0d83d1bfea906b3d8080c +size 31913888 diff --git a/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXCooking_static_64.a b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXCooking_static_64.a new file mode 100644 index 000000000..3711aafa0 --- /dev/null +++ b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXCooking_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd96d96cea66cd2ff741d60c4caa575d3280fa74cb37c07eb0d44ba67af4d588 +size 170336 diff --git a/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXExtensions_static_64.a b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXExtensions_static_64.a new file mode 100644 index 000000000..736668633 --- /dev/null +++ b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXExtensions_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62ace9a29db1bca74b7aadfc052d6781de064bee2e010bbd66c1219c11be09be +size 23526544 diff --git a/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXFoundation_static_64.a b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXFoundation_static_64.a new file mode 100644 index 000000000..64a801aed --- /dev/null +++ b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXFoundation_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:365aa50d42fdf84876ff592555021997f176d02396537d24ef07990e13815884 +size 388024 diff --git a/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXPvdSDK_static_64.a b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXPvdSDK_static_64.a new file mode 100644 index 000000000..a967eeba7 --- /dev/null +++ b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXPvdSDK_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:816451b0e172c9da826f8f3a13222fc4002d4e3be829f3ee53718e414809aa22 +size 2223872 diff --git a/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXVehicle2_static_64.a b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXVehicle2_static_64.a new file mode 100644 index 000000000..d23bda07f --- /dev/null +++ b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXVehicle2_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ff5590dc366cba414b79d1d31914fd8c560db3da776083d9d084148d93730fa +size 1567040 diff --git a/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXVehicle_static_64.a b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXVehicle_static_64.a new file mode 100644 index 000000000..690a92a3f --- /dev/null +++ b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysXVehicle_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ffb1bb6bec2b8dc54e7fe85c0a5011f0bbe99cc78f4fd7e447469d846b9ec5ff +size 7709616 diff --git a/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysX_static_64.a b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysX_static_64.a new file mode 100644 index 000000000..bc385f3d4 --- /dev/null +++ b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libPhysX_static_64.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37df05e01ae2cbe7717405abbaf33aa450d727c38b32344fe4b944b52da7485b +size 90307560 diff --git a/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libfreetype.a b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libfreetype.a new file mode 100644 index 000000000..d326f20f7 --- /dev/null +++ b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libfreetype.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a39d6f75ce78e2dde2202cc7cb0d90b078a844e4ee33a4d0e0ba636f7d06b345 +size 872136 diff --git a/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libogg.a b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libogg.a new file mode 100644 index 000000000..a5aeb5ecb --- /dev/null +++ b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libogg.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3b3fac0ddaa6c8f0fc3c95173258a78757ffe7cc3b755e19929f509df9d438a +size 22472 diff --git a/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libopenal.a b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libopenal.a new file mode 100644 index 000000000..e50f5c112 --- /dev/null +++ b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libopenal.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22566cafc8a508056b8a50674cf8f214354bd8decb5c4aeba349c7c3de818207 +size 1500864 diff --git a/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libvorbis.a b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libvorbis.a new file mode 100644 index 000000000..7c8306024 --- /dev/null +++ b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libvorbis.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2843880d75939aeab6e9fb169b9c4e8e2ae1e9686e9643280dc3f5933911106e +size 222352 diff --git a/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libvorbisenc.a b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libvorbisenc.a new file mode 100644 index 000000000..e1bda95b4 --- /dev/null +++ b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libvorbisenc.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91ff6bd6e0ddbb4daf54eb9b3f2d0aea8bea09c53dafd82694ef0eedfac6044e +size 688488 diff --git a/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libvorbisfile.a b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libvorbisfile.a new file mode 100644 index 000000000..d93e7267f --- /dev/null +++ b/Source/Platforms/iOS/Binaries/ThirdParty/ARM64/libvorbisfile.a @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e5ae3afb75aa4de8ce5f07b2a614ad05eaf870dca1bce641ce57950f673624e0 +size 29928 diff --git a/Source/Shaders/Lighting.hlsl b/Source/Shaders/Lighting.hlsl index d4b9da107..4b909c024 100644 --- a/Source/Shaders/Lighting.hlsl +++ b/Source/Shaders/Lighting.hlsl @@ -129,9 +129,8 @@ float4 GetLighting(float3 viewPos, LightData lightData, GBufferSample gBuffer, f toLight = lightData.Position - gBuffer.WorldPos; float distanceSqr = dot(toLight, toLight); L = toLight * rsqrt(distanceSqr); - float distanceAttenuation = 1, lightRadiusMask = 1, spotAttenuation = 1; - GetRadialLightAttenuation(lightData, isSpotLight, N, distanceSqr, 1, toLight, L, NoL, distanceAttenuation, lightRadiusMask, spotAttenuation); - float attenuation = distanceAttenuation * lightRadiusMask * spotAttenuation; + float attenuation = 1; + GetRadialLightAttenuation(lightData, isSpotLight, N, distanceSqr, 1, toLight, L, NoL, attenuation); shadow.SurfaceShadow *= attenuation; shadow.TransmissionShadow *= attenuation; } diff --git a/Source/Shaders/LightingCommon.hlsl b/Source/Shaders/LightingCommon.hlsl index bb7a6ce7e..3479157b5 100644 --- a/Source/Shaders/LightingCommon.hlsl +++ b/Source/Shaders/LightingCommon.hlsl @@ -63,10 +63,9 @@ void GetRadialLightAttenuation( float3 toLight, float3 L, inout float NoL, - inout float distanceAttenuation, - inout float lightRadiusMask, - inout float spotAttenuation) + inout float attenuation) { + // Distance attenuation if (lightData.InverseSquared) { BRANCH @@ -77,29 +76,31 @@ void GetRadialLightAttenuation( float3 l1 = toLight + 0.5 * l01; float lengthL0 = length(l0); float lengthL1 = length(l1); - distanceAttenuation = rcp((lengthL0 * lengthL1 + dot(l0, l1)) * 0.5 + distanceBiasSqr); + attenuation = rcp((lengthL0 * lengthL1 + dot(l0, l1)) * 0.5 + distanceBiasSqr); NoL = saturate(0.5 * (dot(N, l0) / lengthL0 + dot(N, l1) / lengthL1)); } else { - distanceAttenuation = rcp(distanceSqr + distanceBiasSqr); + attenuation = rcp(distanceSqr + distanceBiasSqr); NoL = saturate(dot(N, L)); } - lightRadiusMask = Square(saturate(1 - Square(distanceSqr * Square(lightData.RadiusInv)))); + attenuation *= Square(saturate(1 - Square(distanceSqr * Square(lightData.RadiusInv)))); } else { - distanceAttenuation = 1; + attenuation = 1; NoL = saturate(dot(N, L)); float3 worldLightVector = toLight * lightData.RadiusInv; float t = dot(worldLightVector, worldLightVector); - lightRadiusMask = pow(1.0f - saturate(t), lightData.FalloffExponent); + attenuation *= pow(1.0f - saturate(t), lightData.FalloffExponent); } + // Spot mask attenuation if (isSpotLight) { - // SpotAngles.x is CosOuterCone, SpotAngles.y is InvCosConeDifference - spotAttenuation = Square(saturate((dot(normalize(-L), lightData.Direction) - lightData.SpotAngles.x) * lightData.SpotAngles.y)); + float cosOuterCone = lightData.SpotAngles.x; + float invCosConeDifference = lightData.SpotAngles.y; + attenuation *= Square(saturate((dot(normalize(-L), lightData.Direction) - cosOuterCone) * invCosConeDifference)); } } @@ -107,7 +108,6 @@ void GetRadialLightAttenuation( float AreaLightSpecular(LightData lightData, float roughness, inout float3 toLight, inout float3 L, float3 V, half3 N) { float energy = 1; - float m = roughness * roughness; float3 r = reflect(-V, N); float invDistToLight = rsqrt(dot(toLight, toLight)); @@ -137,7 +137,6 @@ float AreaLightSpecular(LightData lightData, float roughness, inout float3 toLig } L = normalize(toLight); - return energy; } diff --git a/Source/Shaders/VolumetricFog.shader b/Source/Shaders/VolumetricFog.shader index 2f5103736..b97fede24 100644 --- a/Source/Shaders/VolumetricFog.shader +++ b/Source/Shaders/VolumetricFog.shader @@ -205,9 +205,6 @@ float4 PS_InjectLight(Quad_GS2PS input) : SV_Target0 uint samplesCount = historyAlpha < 0.001f ? MissedHistorySamplesCount : 1; float NoL = 0; - float distanceAttenuation = 1; - float lightRadiusMask = 1; - float spotAttenuation = 1; bool isSpotLight = LocalLight.SpotAngles.x > -2.0f; float4 scattering = 0; for (uint sampleIndex = 0; sampleIndex < samplesCount; sampleIndex++) @@ -224,19 +221,19 @@ float4 PS_InjectLight(Quad_GS2PS input) : SV_Target0 float3 L = toLight * rsqrt(distanceSqr); // Calculate the light attenuation - GetRadialLightAttenuation(LocalLight, isSpotLight, float3(0, 0, 1), distanceSqr, distanceBias * distanceBias, toLight, L, NoL, distanceAttenuation, lightRadiusMask, spotAttenuation); - float combinedAttenuation = distanceAttenuation * lightRadiusMask * spotAttenuation; + float attenuation = 1; + GetRadialLightAttenuation(LocalLight, isSpotLight, float3(0, 0, 1), distanceSqr, distanceBias * distanceBias, toLight, L, NoL, attenuation); // Peek the shadow float shadowFactor = 1.0f; #if USE_SHADOW - if (combinedAttenuation > 0) + if (attenuation > 0) { shadowFactor = ComputeVolumeShadowing(positionWS, isSpotLight); } #endif - scattering.rgb += LocalLight.Color * (GetPhase(PhaseG, dot(L, -cameraVector)) * combinedAttenuation * shadowFactor * LocalLightScatteringIntensity); + scattering.rgb += LocalLight.Color * (GetPhase(PhaseG, dot(L, -cameraVector)) * attenuation * shadowFactor * LocalLightScatteringIntensity); } scattering.rgb /= (float)samplesCount; diff --git a/Source/ThirdParty/PhysX/License.txt b/Source/ThirdParty/PhysX/License.txt index f767ab7aa..c39b0b8f4 100644 --- a/Source/ThirdParty/PhysX/License.txt +++ b/Source/ThirdParty/PhysX/License.txt @@ -1,9 +1,31 @@ -Copyright (c) 2018 NVIDIA Corporation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +BSD 3-Clause License -Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +Copyright (c) 2023, NVIDIA Corporation +All rights reserved. -Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: -Neither the name of NVIDIA CORPORATION nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + * Neither the name of NVIDIA CORPORATION nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/Source/ThirdParty/PhysX/PhysX.Build.cs b/Source/ThirdParty/PhysX/PhysX.Build.cs index 2e2f2ffad..7b598f8b1 100644 --- a/Source/ThirdParty/PhysX/PhysX.Build.cs +++ b/Source/ThirdParty/PhysX/PhysX.Build.cs @@ -6,7 +6,7 @@ using Flax.Build; using Flax.Build.NativeCpp; /// -/// https://github.com/NVIDIAGameWorks/PhysX +/// https://github.com/NVIDIA-Omniverse/PhysX /// public class PhysX : DepsModule { @@ -27,7 +27,7 @@ public class PhysX : DepsModule { base.Setup(options); - // PhysX 4 configuration: + // PhysX configuration: // PX_BUILDSNIPPETS = False // PX_BUILDSAMPLES = False // PX_BUILDPUBLICSAMPLES = False @@ -59,19 +59,31 @@ public class PhysX : DepsModule case TargetPlatform.XboxOne: case TargetPlatform.XboxScarlett: case TargetPlatform.Mac: + case TargetPlatform.Android: + case TargetPlatform.iOS: switch (options.Architecture) { case TargetArchitecture.x86: + case TargetArchitecture.ARM: archPostFix = "_32"; break; case TargetArchitecture.x64: + case TargetArchitecture.ARM64: archPostFix = "_64"; break; + default: throw new InvalidArchitectureException(options.Architecture); } break; } options.PublicIncludePaths.Add(Path.Combine(Globals.EngineRoot, "Source/ThirdParty/PhysX")); + switch (options.Platform.Target) + { + case TargetPlatform.Switch: + options.PublicIncludePaths.Add(Path.Combine(Globals.EngineRoot, "Source/Platforms", options.Platform.Target.ToString(), "Binaries/Data/PhysX/physx/include")); + options.PublicIncludePaths.Add(Path.Combine(Globals.EngineRoot, "Source/Platforms", options.Platform.Target.ToString(), "Binaries/Data/PhysX/physx/include/foundation")); + break; + } if (useDynamicLinking) { @@ -100,6 +112,7 @@ public class PhysX : DepsModule if (useVehicle) { AddLib(options, depsRoot, string.Format("PhysXVehicle_static{0}", archPostFix)); + //AddLib(options, depsRoot, string.Format("PhysXVehicle2_static{0}", archPostFix)); } } } diff --git a/Source/ThirdParty/PhysX/PxActor.h b/Source/ThirdParty/PhysX/PxActor.h index 0dfef1f8a..cb884ed69 100644 --- a/Source/ThirdParty/PhysX/PxActor.h +++ b/Source/ThirdParty/PhysX/PxActor.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_ACTOR -#define PX_PHYSICS_NX_ACTOR +#ifndef PX_ACTOR_H +#define PX_ACTOR_H /** \addtogroup physics @{ @@ -49,11 +47,12 @@ class PxRigidActor; class PxRigidBody; class PxRigidStatic; class PxRigidDynamic; -class PxArticulation; class PxArticulationLink; +class PxScene; - -/** Group index which allows to specify 1- or 2-way interaction */ +/** +\brief Group index which allows to specify 1- or 2-way interaction +*/ typedef PxU8 PxDominanceGroup; // Must be < 32, PxU8. /** @@ -93,7 +92,7 @@ struct PxActorFlag \note Setting this flag will remove all constraints attached to the actor from the scene. \note If this flag is set, the following calls are forbidden: - \li PxRigidBody: setLinearVelocity(), setAngularVelocity(), addForce(), addTorque(), clearForce(), clearTorque() + \li PxRigidBody: setLinearVelocity(), setAngularVelocity(), addForce(), addTorque(), clearForce(), clearTorque(), setForceAndTorque() \li PxRigidDynamic: setKinematicTarget(), setWakeCounter(), wakeUp(), putToSleep() \par Sleeping: @@ -138,9 +137,57 @@ struct PxActorType */ eARTICULATION_LINK, - //brief internal use only! + /** + \brief A FEM-based soft body + @see PxSoftBody + */ + eSOFTBODY, + + /** + \brief A FEM-based cloth + \note In development + @see PxFEMCloth + */ + eFEMCLOTH, + + /** + \brief A PBD ParticleSystem + @see PxPBDParticleSystem + */ + ePBD_PARTICLESYSTEM, + + /** + \brief A FLIP ParticleSystem + \note In development + @see PxFLIPParticleSystem + */ + eFLIP_PARTICLESYSTEM, + + /** + \brief A MPM ParticleSystem + \note In development + @see PxMPMParticleSystem + */ + eMPM_PARTICLESYSTEM, + + /** + \brief A CUSTOM ParticleSystem + \note In development + @see PxCUSTOMParticleSystem + */ + eCUSTOM_PARTICLESYSTEM, + + /** + \brief A HairSystem + \note In development + @see PxHairSystem + */ + eHAIRSYSTEM, + + //! \brief internal use only! eACTOR_COUNT, + //! \brief internal use only! eACTOR_FORCE_DWORD = 0x7fffffff }; }; @@ -149,7 +196,6 @@ struct PxActorType \brief PxActor is the base class for the main simulation objects in the physics SDK. The actor is owned by and contained in a PxScene. - */ class PxActor : public PxBase { @@ -211,6 +257,9 @@ public: /** \brief Retrieves the axis aligned bounding box enclosing the actor. + \note It is not allowed to use this method while the simulation is running (except during PxScene::collide(), + in PxContactModifyCallback or in contact report callbacks). + \param[in] inflation Scale factor for computed world bounds. Box extents are multiplied by this value. \return The actor's bounding box. @@ -229,13 +278,12 @@ public: \param[in] flag The PxActor flag to raise(set) or clear. See #PxActorFlag. \param[in] value The boolean value to assign to the flag. - Default: PxActorFlag::eVISUALIZATION - @see PxActorFlag getActorFlags() */ virtual void setActorFlag(PxActorFlag::Enum flag, bool value) = 0; + /** - \brief sets the actor flags + \brief Sets the actor flags. See the list of flags #PxActorFlag @see PxActorFlag setActorFlag() @@ -293,7 +341,7 @@ public: virtual void setOwnerClient( PxClientID inClient ) = 0; /** - \brief Returns the owner client that was specified with at creation time. + \brief Returns the owner client that was specified at creation time. This value cannot be changed once the object is placed into the scene. diff --git a/Source/ThirdParty/PhysX/PxActorData.h b/Source/ThirdParty/PhysX/PxActorData.h new file mode 100644 index 000000000..4fe5d7feb --- /dev/null +++ b/Source/ThirdParty/PhysX/PxActorData.h @@ -0,0 +1,111 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + + +#ifndef PX_ACTOR_DATA_H +#define PX_ACTOR_DATA_H + +/** \addtogroup physics + @{ +*/ + +#include "foundation/PxVec4.h" +#include "foundation/PxQuat.h" +#include "foundation/PxFlags.h" +#include "PxNodeIndex.h" + + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief Identifies each type of information for retrieving from actor. + @see PxScene::applyActorData + */ + struct PxActorCacheFlag + { + enum Enum + { + eACTOR_DATA = (1 << 0), //include transform and velocity + eFORCE = (1 << 2), + eTORQUE = (1 << 3) + }; + }; + + /** + \brief Collection of set bits defined in PxActorCacheFlag. + + @see PxActorCacheFlag + */ + typedef PxFlags PxActorCacheFlags; + PX_FLAGS_OPERATORS(PxActorCacheFlag::Enum, PxU16) + + /** + \brief State of a body used when interfacing with the GPU rigid body pipeline + @see PxScene.copyBodyData() + */ + PX_ALIGN_PREFIX(16) + struct PxGpuBodyData + { + PxQuat quat; /*!< actor global pose quaternion in world frame */ + PxVec4 pos; /*!< (x,y,z members): actor global pose position in world frame */ + PxVec4 linVel; /*!< (x,y,z members): linear velocity at center of gravity in world frame */ + PxVec4 angVel; /*!< (x,y,z members): angular velocity in world frame */ + } + PX_ALIGN_SUFFIX(16); + + /** + \brief Pair correspondence used for matching array indices with body node indices + */ + PX_ALIGN_PREFIX(8) + struct PxGpuActorPair + { + PxU32 srcIndex; //Defines which index in src array we read + PxNodeIndex nodeIndex; //Defines which actor this entry in src array is updating + } + PX_ALIGN_SUFFIX(8); + + /** + \brief Maps numeric index to a data pointer. + + @see PxScene::computeDenseJacobians(), PxScene::computeGeneralizedMassMatrices(), PxScene::computeGeneralizedGravityForces(), PxScene::computeCoriolisAndCentrifugalForces() + */ + struct PxIndexDataPair + { + PxU32 index; + void* data; + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxAggregate.h b/Source/ThirdParty/PhysX/PxAggregate.h index f794de22d..5a1cd1d43 100644 --- a/Source/ThirdParty/PhysX/PxAggregate.h +++ b/Source/ThirdParty/PhysX/PxAggregate.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_AGGREGATE -#define PX_PHYSICS_NX_AGGREGATE +#ifndef PX_AGGREGATE_H +#define PX_AGGREGATE_H /** \addtogroup physics @{ @@ -38,14 +36,44 @@ #include "PxPhysXConfig.h" #include "common/PxBase.h" - #if !PX_DOXYGEN namespace physx { #endif class PxActor; -class PxBVHStructure; +class PxBVH; +class PxScene; + + struct PxAggregateType + { + enum Enum + { + eGENERIC = 0, //!< Aggregate will contain various actors of unspecified types + eSTATIC = 1, //!< Aggregate will only contain static actors + eKINEMATIC = 2 //!< Aggregate will only contain kinematic actors + }; + }; + + // PxAggregateFilterHint is used for more efficient filtering of aggregates outside of the broadphase. + // It is a combination of a PxAggregateType and a self-collision bit. + typedef PxU32 PxAggregateFilterHint; + + PX_CUDA_CALLABLE PX_FORCE_INLINE PxAggregateFilterHint PxGetAggregateFilterHint(PxAggregateType::Enum type, bool enableSelfCollision) + { + const PxU32 selfCollisionBit = enableSelfCollision ? 1 : 0; + return PxAggregateFilterHint((PxU32(type)<<1)|selfCollisionBit); + } + + PX_CUDA_CALLABLE PX_FORCE_INLINE PxU32 PxGetAggregateSelfCollisionBit(PxAggregateFilterHint hint) + { + return hint & 1; + } + + PX_CUDA_CALLABLE PX_FORCE_INLINE PxAggregateType::Enum PxGetAggregateType(PxAggregateFilterHint hint) + { + return PxAggregateType::Enum(hint>>1); + } /** \brief Class to aggregate actors into a single broad-phase entry. @@ -66,7 +94,6 @@ large number of attached shapes). @see PxActor, PxPhysics.createAggregate */ - class PxAggregate : public PxBase { public: @@ -79,7 +106,7 @@ public: to delete both the PxAggregate and its actors, it is best to release the actors first, then release the PxAggregate when it is empty. */ - virtual void release() = 0; + virtual void release() = 0; /** \brief Adds an actor to the aggregate object. @@ -92,17 +119,16 @@ public: If the actor already belongs to a scene, a warning is output and the call is ignored. You need to remove the actor from the scene first, before adding it to the aggregate. - \note When BVHStructure is provided the actor shapes are grouped together. + \note When a BVH is provided the actor shapes are grouped together. The scene query pruning structure inside PhysX SDK will store/update one bound per actor. The scene queries against such an actor will query actor - bounds and then make a local space query against the provided BVH structure, which is in - actor's local space. + bounds and then make a local space query against the provided BVH, which is in actor's local space. - \param [in] actor The actor that should be added to the aggregate - \param [in] bvhStructure BVHStructure for actor shapes. + \param [in] actor The actor that should be added to the aggregate + \param [in] bvh BVH for actor shapes. return true if success */ - virtual bool addActor(PxActor& actor, const PxBVHStructure* bvhStructure = NULL) = 0; + virtual bool addActor(PxActor& actor, const PxBVH* bvh = NULL) = 0; /** \brief Removes an actor from the aggregate object. @@ -115,7 +141,7 @@ public: \param [in] actor The actor that should be removed from the aggregate return true if success */ - virtual bool removeActor(PxActor& actor) = 0; + virtual bool removeActor(PxActor& actor) = 0; /** \brief Adds an articulation to the aggregate object. @@ -131,20 +157,20 @@ public: \param [in] articulation The articulation that should be added to the aggregate return true if success */ - virtual bool addArticulation(PxArticulationBase& articulation) = 0; + virtual bool addArticulation(PxArticulationReducedCoordinate& articulation) = 0; /** \brief Removes an articulation from the aggregate object. A warning is output if the incoming articulation does not belong to the aggregate. Otherwise the articulation is removed from the aggregate. If the aggregate belongs to a scene, the articulation is reinserted in that - scene. If you intend to delete the articulation, it is best to call #PxArticulation::release() directly. That way + scene. If you intend to delete the articulation, it is best to call #PxArticulationReducedCoordinate::release() directly. That way the articulation will be automatically removed from its aggregate (if any) and not reinserted in a scene. \param [in] articulation The articulation that should be removed from the aggregate return true if success */ - virtual bool removeArticulation(PxArticulationBase& articulation) = 0; + virtual bool removeArticulation(PxArticulationReducedCoordinate& articulation) = 0; /** \brief Returns the number of actors contained in the aggregate. @@ -155,16 +181,29 @@ public: @see PxActor getActors() */ - virtual PxU32 getNbActors() const = 0; + virtual PxU32 getNbActors() const = 0; /** \brief Retrieves max amount of actors that can be contained in the aggregate. - \return Max aggregate size. + \note PxAggregate now supports an arbitrary number of actors. This method return PX_MAX_U32 and will be + removed in a future release. + + \return Max actor size. + + @see PxPhysics::createAggregate() + @deprecated + */ + PX_DEPRECATED virtual PxU32 getMaxNbActors() const = 0; + + /** + \brief Retrieves max amount of shapes that can be contained in the aggregate. + + \return Max shape size. @see PxPhysics::createAggregate() */ - virtual PxU32 getMaxNbActors() const = 0; + virtual PxU32 getMaxNbShapes() const = 0; /** \brief Retrieve all actors contained in the aggregate. @@ -178,7 +217,7 @@ public: @see PxShape getNbShapes() */ - virtual PxU32 getActors(PxActor** userBuffer, PxU32 bufferSize, PxU32 startIndex=0) const = 0; + virtual PxU32 getActors(PxActor** userBuffer, PxU32 bufferSize, PxU32 startIndex=0) const = 0; /** \brief Retrieves the scene which this aggregate belongs to. @@ -198,8 +237,10 @@ public: virtual const char* getConcreteTypeName() const { return "PxAggregate"; } + void* userData; //!< user can assign this to whatever, usually to create a 1:1 relationship with a user object. + protected: - PX_INLINE PxAggregate(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags) {} + PX_INLINE PxAggregate(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags), userData(NULL) {} PX_INLINE PxAggregate(PxBaseFlags baseFlags) : PxBase(baseFlags) {} virtual ~PxAggregate() {} virtual bool isKindOf(const char* name) const { return !::strcmp("PxAggregate", name) || PxBase::isKindOf(name); } diff --git a/Source/ThirdParty/PhysX/PxArticulation.h b/Source/ThirdParty/PhysX/PxArticulation.h deleted file mode 100644 index 4cd51ce52..000000000 --- a/Source/ThirdParty/PhysX/PxArticulation.h +++ /dev/null @@ -1,281 +0,0 @@ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// * Neither the name of NVIDIA CORPORATION nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. -// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. -// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - - -#ifndef PX_PHYSICS_NX_ARTICULATION -#define PX_PHYSICS_NX_ARTICULATION -/** \addtogroup physics -@{ */ - -#include "PxArticulationBase.h" - - -#if !PX_DOXYGEN -namespace physx -{ -#endif - -class PxArticulationLink; - -/** -\brief Articulation drive cache - -This cache is used for making one or more impulse applications to the articulation. - -@see PxArticulation PxArticulation.createDriveCache -*/ -class PxArticulationDriveCache -{ -protected: - PxArticulationDriveCache(); -}; - - -/** -\brief a tree structure of bodies connected by joints that is treated as a unit by the dynamics solver - -Articulations are more expensive to simulate than the equivalent collection of -PxRigidDynamic and PxJoint structures, but because the dynamics solver treats -each articulation as a single object, they are much less prone to separation and -have better support for actuation. An articulation may have at most 64 links. - -@see PxArticulationJoint PxArticulationLink PxPhysics.createArticulation -*/ - -#if PX_VC -#pragma warning(push) -#pragma warning(disable : 4435) -#endif - -class PxArticulation : public PxArticulationBase -{ -public: - - virtual void release() = 0; - - /** - \brief sets maxProjectionIterations. - - This is the maximum number of iterations to run projection on the articulation to bring - the links back together if the separation tolerance is exceeded. - - - \param[in] iterations the maximum number of projection iterations - Default: 4 - - @see getMaxProjectionIterations() - */ - virtual void setMaxProjectionIterations(PxU32 iterations) = 0; - - /** - \brief gets maxProjectionIterations. - - \return the maximum number of projection iterations - - @see setMaxProjectionIterations() - */ - - virtual PxU32 getMaxProjectionIterations() const = 0; - - /** - \brief sets separationTolerance. - - This is the maximum allowed separation of any joint in the articulation before projection is used - - Default: 0.1f, scaled by the tolerance scale - - \param[in] tolerance the separation tolerance for the articulation - - @see getSeparationTolerance() - */ - virtual void setSeparationTolerance(PxReal tolerance) = 0; - - /** - \brief gets separationTolerance. - - \return the separation tolerance - - @see setSeparationTolerance() - */ - - virtual PxReal getSeparationTolerance() const = 0; - - - /** - \brief sets the number of iterations used to compute the drive response to internal forces - - The drive model uses an iterative algorithm to determine the load on each joint of the articulation. - This is the number of iterations to use when computing response of the drive to internal forces. - - \param[in] iterations the number of iterations used to compute the drive response to internal forces. - - Default: 4 - - @see getInternalDriveIterations() - */ - virtual void setInternalDriveIterations(PxU32 iterations) = 0; - - /** - \brief gets internal driveIterations. - - \return the number of iterations used to compute the drive response to internal forces - - @see setInternalDriveIterations() - */ - - virtual PxU32 getInternalDriveIterations() const = 0; - - - /** - \brief sets the number of iterations for drive response to external forces. - - The drive model uses an iterative algorithm to determine the load on each joint of the articulation. - This is the number of iterations to use when computing response of the drive to external forces. - - \param[in] iterations the number of iterations used to compute the drive response to external forces. - - Default: 4 - - @see getExternalDriveIterations() - */ - - virtual void setExternalDriveIterations(PxU32 iterations) = 0; - - /** - \brief gets externalDriveIterations. - - \return the number of iterations used to compute the drive response to external forces - - @see setExternalDriveIterations() - */ - - virtual PxU32 getExternalDriveIterations() const = 0; - - /** - \brief create a drive cache for applying impulses which are propagated to the entire articulation - - \param[in] compliance the compliance value to use at all joints of the articulation. This is equivalent to the external compliance - parameter for articulation joints, as the impulse is treated as an external force - \param[in] driveIterations the number of iterations to use to evaluate the drive strengths - - \return a drive cache - - @see PxArticulationDriveCache updateDriveCache releaseDriveCache applyImpulse computeImpulseResponse - - \note this call may only be made on articulations that are in a scene, and may not be made during simulation - - */ - virtual PxArticulationDriveCache* - createDriveCache(PxReal compliance, PxU32 driveIterations) const = 0; - - - /** - \brief update a drive cache - - \param[in] driveCache the drive cache to update - \param[in] compliance the compliance value to use at all joints of the articulation. - \param[in] driveIterations the number of iterations to use to evaluate the drive strengths - - @see releaseDriveCache createDriveCache applyImpulse computeImpulseResponse - - \note this call may only be made on articulations that are in a scene, and may not be made during simulation - - */ - virtual void updateDriveCache(PxArticulationDriveCache& driveCache, - PxReal compliance, - PxU32 driveIterations) const = 0; - - /** - \brief release a drive cache - - \param[in] driveCache the drive cache to release - - @see createDriveCache updateDriveCache - */ - virtual void releaseDriveCache(PxArticulationDriveCache& driveCache) const = 0; - - /** - \brief apply an impulse to an entire articulation - - \param[in] link the link to which to apply the impulse - \param[in] driveCache the drive cache - \param[in] linearImpulse the linear impulse to apply - \param[in] angularImpulse the angular impulse to apply - - @see computeImpulseResponse - - \note this call may only be made on articulations that are in a scene, and may not be made during simulation - - */ - virtual void applyImpulse(PxArticulationLink* link, - const PxArticulationDriveCache& driveCache, - const PxVec3& linearImpulse, - const PxVec3& angularImpulse) = 0; - - /** - \brief determine the effect of applying an impulse to an entire articulation, without applying the impulse - - \param[in] link the link to which to apply the impulse - \param[out] linearResponse the change in linear velocity of the articulation link - \param[out] angularResponse the change in angular velocity of the articulation link - \param[in] driveCache the drive cache - \param[in] linearImpulse the linear impulse to apply - \param[in] angularImpulse the angular impulse to apply - - @see applyImpulse - - This call will wake up the articulation if it is asleep. - - \note this call may only be made on articulations that are in a scene, and may not be made during simulation - */ - - virtual void computeImpulseResponse(PxArticulationLink*link, - PxVec3& linearResponse, - PxVec3& angularResponse, - const PxArticulationDriveCache& driveCache, - const PxVec3& linearImpulse, - const PxVec3& angularImpulse) const = 0; - -protected: - PX_INLINE PxArticulation(PxType concreteType, PxBaseFlags baseFlags) : PxArticulationBase(concreteType, baseFlags){} - PX_INLINE PxArticulation(PxBaseFlags baseFlags) : PxArticulationBase(baseFlags){} - virtual ~PxArticulation() {} - -}; - -#if PX_VC -#pragma warning(pop) -#endif - -#if !PX_DOXYGEN -} // namespace physx -#endif - -/** @} */ -#endif diff --git a/Source/ThirdParty/PhysX/PxArticulationBase.h b/Source/ThirdParty/PhysX/PxArticulationBase.h deleted file mode 100644 index 66237fdbd..000000000 --- a/Source/ThirdParty/PhysX/PxArticulationBase.h +++ /dev/null @@ -1,320 +0,0 @@ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// * Neither the name of NVIDIA CORPORATION nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. -// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. -// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - - -#ifndef PX_PHYSICS_NX_ARTICULATION_BASE -#define PX_PHYSICS_NX_ARTICULATION_BASE -/** \addtogroup physics -@{ */ - -#include "PxPhysXConfig.h" -#include "common/PxBase.h" - -#if !PX_DOXYGEN -namespace physx -{ -#endif - - class PxArticulationImpl; - - /** - \brief a tree structure of bodies connected by joints that is treated as a unit by the dynamics solver - - Articulations are more expensive to simulate than the equivalent collection of - PxRigidDynamic and PxJoint structures, but because the dynamics solver treats - each articulation as a single object, they are much less prone to separation and - have better support for actuation. An articulation may have at most 64 links. - - @see PxArticulationJoint PxArticulationLink PxPhysics.createArticulation - */ - class PxArticulationBase : public PxBase - { - public: - - /** - \brief Retrieves the scene which this articulation belongs to. - - \return Owner Scene. NULL if not part of a scene. - - @see PxScene - */ - virtual PxScene* getScene() const = 0; - - /** - \brief Sets the solver iteration counts for the articulation. - - The solver iteration count determines how accurately joints and contacts are resolved. - If you are having trouble with jointed bodies oscillating and behaving erratically, then - setting a higher position iteration count may improve their stability. - - If intersecting bodies are being depenetrated too violently, increase the number of velocity - iterations. More velocity iterations will drive the relative exit velocity of the intersecting - objects closer to the correct value given the restitution. - - \param[in] minPositionIters Number of position iterations the solver should perform for this articulation. Range: [1,255] - \param[in] minVelocityIters Number of velocity iterations the solver should perform for this articulation. Range: [1,255] - - @see getSolverIterationCounts() - */ - virtual void setSolverIterationCounts(PxU32 minPositionIters, PxU32 minVelocityIters = 1) = 0; - - /** - \brief Retrieves the solver iteration counts. - - @see setSolverIterationCounts() - */ - virtual void getSolverIterationCounts(PxU32 & minPositionIters, PxU32 & minVelocityIters) const = 0; - - /** - \brief Returns true if this articulation is sleeping. - - When an actor does not move for a period of time, it is no longer simulated in order to save time. This state - is called sleeping. However, because the object automatically wakes up when it is either touched by an awake object, - or a sleep-affecting property is changed by the user, the entire sleep mechanism should be transparent to the user. - - An articulation can only go to sleep if all links are ready for sleeping. An articulation is guaranteed to be awake - if at least one of the following holds: - - \li The wake counter is positive (see #setWakeCounter()). - \li The linear or angular velocity of any link is non-zero. - \li A non-zero force or torque has been applied to the articulation or any of its links. - - If an articulation is sleeping, the following state is guaranteed: - - \li The wake counter is zero. - \li The linear and angular velocity of all links is zero. - \li There is no force update pending. - - When an articulation gets inserted into a scene, it will be considered asleep if all the points above hold, else it will - be treated as awake. - - If an articulation is asleep after the call to PxScene::fetchResults() returns, it is guaranteed that the poses of the - links were not changed. You can use this information to avoid updating the transforms of associated of dependent objects. - - \note It is invalid to use this method if the articulation has not been added to a scene already. - - \return True if the articulation is sleeping. - - @see isSleeping() wakeUp() putToSleep() getSleepThreshold() - */ - virtual bool isSleeping() const = 0; - - /** - \brief Sets the mass-normalized energy threshold below which an articulation may go to sleep. - - The articulation will sleep if the energy of each body is below this threshold. - - \param[in] threshold Energy below which an actor may go to sleep. Range: [0, PX_MAX_F32) - - @see isSleeping() getSleepThreshold() wakeUp() putToSleep() - */ - virtual void setSleepThreshold(PxReal threshold) = 0; - - /** - \brief Returns the mass-normalized energy below which an articulation may go to sleep. - - \return The energy threshold for sleeping. - - @see isSleeping() wakeUp() putToSleep() setSleepThreshold() - */ - virtual PxReal getSleepThreshold() const = 0; - - /** - \brief Sets the mass-normalized kinetic energy threshold below which an articulation may participate in stabilization. - - Articulation whose kinetic energy divided by their mass is above this threshold will not participate in stabilization. - - This value has no effect if PxSceneFlag::eENABLE_STABILIZATION was not enabled on the PxSceneDesc. - - Default: 0.01 * PxTolerancesScale::speed * PxTolerancesScale::speed - - \param[in] threshold Energy below which an actor may participate in stabilization. Range: [0,inf) - - @see getStabilizationThreshold() PxSceneFlag::eENABLE_STABILIZATION - */ - virtual void setStabilizationThreshold(PxReal threshold) = 0; - - /** - \brief Returns the mass-normalized kinetic energy below which an articulation may participate in stabilization. - - Articulations whose kinetic energy divided by their mass is above this threshold will not participate in stabilization. - - \return The energy threshold for participating in stabilization. - - @see setStabilizationThreshold() PxSceneFlag::eENABLE_STABILIZATION - */ - virtual PxReal getStabilizationThreshold() const = 0; - - /** - \brief Sets the wake counter for the articulation. - - The wake counter value determines the minimum amount of time until the articulation can be put to sleep. Please note - that an articulation will not be put to sleep if the energy is above the specified threshold (see #setSleepThreshold()) - or if other awake objects are touching it. - - \note Passing in a positive value will wake the articulation up automatically. - - Default: 0.4 (which corresponds to 20 frames for a time step of 0.02) - - \param[in] wakeCounterValue Wake counter value. Range: [0, PX_MAX_F32) - - @see isSleeping() getWakeCounter() - */ - virtual void setWakeCounter(PxReal wakeCounterValue) = 0; - - /** - \brief Returns the wake counter of the articulation. - - \return The wake counter of the articulation. - - @see isSleeping() setWakeCounter() - */ - virtual PxReal getWakeCounter() const = 0; - - /** - \brief Wakes up the articulation if it is sleeping. - - The articulation will get woken up and might cause other touching objects to wake up as well during the next simulation step. - - \note This will set the wake counter of the articulation to the value specified in #PxSceneDesc::wakeCounterResetValue. - - \note It is invalid to use this method if the articulation has not been added to a scene already. - - @see isSleeping() putToSleep() - */ - virtual void wakeUp() = 0; - - /** - \brief Forces the articulation to sleep. - - The articulation will stay asleep during the next simulation step if not touched by another non-sleeping actor. - - \note This will set any applied force, the velocity and the wake counter of all bodies in the articulation to zero. - - \note It is invalid to use this method if the articulation has not been added to a scene already. - - @see isSleeping() wakeUp() - */ - virtual void putToSleep() = 0; - - /** - \brief adds a link to the articulation with default attribute values. - - \param[in] parent the parent link of the articulation. Should be NULL if (and only if) this is the root link - \param[in] pose the initial pose of the new link. Must be a valid transform - - \return the new link, or NULL if the link cannot be created because the articulation has reached - its maximum link count (currently 64). - - @see PxArticulationLink - */ - virtual PxArticulationLink* createLink(PxArticulationLink* parent, const PxTransform& pose) = 0; - - /** - \brief returns the number of links in the articulation - */ - virtual PxU32 getNbLinks() const = 0; - - /** - \brief returns the set of links in the articulation - - \param[in] userBuffer buffer into which to write an array of articulation link pointers - \param[in] bufferSize the size of the buffer. If this is not large enough to contain all the pointers to links, - only as many as will fit are written. - \param[in] startIndex Index of first link pointer to be retrieved - - \return the number of links written into the buffer. - - @see ArticulationLink - */ - virtual PxU32 getLinks(PxArticulationLink** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; - - /** - \brief Sets a name string for the object that can be retrieved with getName(). - - This is for debugging and is not used by the SDK. The string is not copied by the SDK, - only the pointer is stored. - - \param[in] name String to set the objects name to. - - @see getName() - */ - virtual void setName(const char* name) = 0; - - /** - \brief Retrieves the name string set with setName(). - - \return Name string associated with object. - - @see setName() - */ - virtual const char* getName() const = 0; - - /** - \brief Retrieves the axis aligned bounding box enclosing the articulation. - - \param[in] inflation Scale factor for computed world bounds. Box extents are multiplied by this value. - - \return The articulation's bounding box. - - @see PxBounds3 - */ - virtual PxBounds3 getWorldBounds(float inflation = 1.01f) const = 0; - - /** - \brief Retrieves the aggregate the articulation might be a part of. - - \return The aggregate the articulation is a part of, or NULL if the articulation does not belong to an aggregate. - - @see PxAggregate - */ - virtual PxAggregate* getAggregate() const = 0; - - virtual PxArticulationImpl* getImpl() = 0; - virtual const PxArticulationImpl* getImpl() const = 0; - - void* userData; //!< user can assign this to whatever, usually to create a 1:1 relationship with a user object. - - virtual ~PxArticulationBase() {} - - protected: - PX_INLINE PxArticulationBase(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags), userData(NULL) {} - PX_INLINE PxArticulationBase(PxBaseFlags baseFlags) : PxBase(baseFlags) {} - - public: - virtual PxArticulationJointBase* createArticulationJoint(PxArticulationLink& parent, const PxTransform& parentFrame, PxArticulationLink& child, const PxTransform& childFrame) = 0; - virtual void releaseArticulationJoint(PxArticulationJointBase* joint) = 0; - }; - -#if !PX_DOXYGEN -} // namespace physx -#endif - - /** @} */ -#endif diff --git a/Source/ThirdParty/PhysX/PxArticulationFlag.h b/Source/ThirdParty/PhysX/PxArticulationFlag.h new file mode 100644 index 000000000..75870439d --- /dev/null +++ b/Source/ThirdParty/PhysX/PxArticulationFlag.h @@ -0,0 +1,106 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_ARTICULATION_FLAG_H +#define PX_ARTICULATION_FLAG_H + +#include "PxPhysXConfig.h" +#include "foundation/PxFlags.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief A description of the types of articulation data that may be directly written to and read from the GPU using the functions + PxScene::copyArticulationData() and PxScene::applyArticulationData(). Types that are read-only may only be used in conjunction with + PxScene::copyArticulationData(). Types that are write-only may only be used in conjunction with PxScene::applyArticulationData(). + A subset of data types may be used in conjunction with both PxScene::applyArticulationData() and PxScene::applyArticulationData(). + + @see PxArticulationCache, PxScene::copyArticulationData(), PxScene::applyArticulationData() + */ + class PxArticulationGpuDataType + { + public: + enum Enum + { + eJOINT_POSITION = 0, //!< The joint positions, read and write, see PxScene::copyArticulationData(), PxScene::applyArticulationData() + eJOINT_VELOCITY, //!< The joint velocities, read and write, see PxScene::copyArticulationData(), PxScene::applyArticulationData() + eJOINT_ACCELERATION, //!< The joint accelerations, read only, see PxScene::copyArticulationData() + eJOINT_FORCE, //!< The applied joint forces, write only, see PxScene::applyArticulationData() + eJOINT_SOLVER_FORCE, //!< The computed joint constraint solver forces, read only, see PxScene::copyArticulationData()() + eJOINT_TARGET_VELOCITY, //!< The velocity targets for the joint drives, write only, see PxScene::applyArticulationData() + eJOINT_TARGET_POSITION, //!< The position targets for the joint drives, write only, see PxScene::applyArticulationData() + eSENSOR_FORCE, //!< The spatial sensor forces, read only, see PxScene::copyArticulationData() + eROOT_TRANSFORM, //!< The root link transform, read and write, see PxScene::copyArticulationData(), PxScene::applyArticulationData() + eROOT_VELOCITY, //!< The root link velocity, read and write, see PxScene::copyArticulationData(), PxScene::applyArticulationData() + eLINK_TRANSFORM, //!< The link transforms including root link, read only, see PxScene::copyArticulationData() + eLINK_VELOCITY, //!< The link velocities including root link, read only, see PxScene::copyArticulationData() + eLINK_FORCE, //!< The forces to apply to links, write only, see PxScene::applyArticulationData() + eLINK_TORQUE, //!< The torques to apply to links, write only, see PxScene::applyArticulationData() + eFIXED_TENDON, //!< Fixed tendon data, write only, see PxScene::applyArticulationData() + eFIXED_TENDON_JOINT, //!< Fixed tendon joint data, write only, see PxScene::applyArticulationData() + eSPATIAL_TENDON, //!< Spatial tendon data, write only, see PxScene::applyArticulationData() + eSPATIAL_TENDON_ATTACHMENT //!< Spatial tendon attachment data, write only, see PxScene::applyArticulationData() + }; + }; + + + /** + \brief These flags determine what data is read or written to the internal articulation data via cache. + + @see PxArticulationCache PxArticulationReducedCoordinate::copyInternalStateToCache PxArticulationReducedCoordinate::applyCache + */ + class PxArticulationCacheFlag + { + public: + enum Enum + { + eVELOCITY = (1 << 0), //!< The joint velocities, see PxArticulationCache::jointVelocity. + eACCELERATION = (1 << 1), //!< The joint accelerations, see PxArticulationCache::jointAcceleration. + ePOSITION = (1 << 2), //!< The joint positions, see PxArticulationCache::jointPosition. + eFORCE = (1 << 3), //!< The joint forces, see PxArticulationCache::jointForce. + eLINK_VELOCITY = (1 << 4), //!< The link velocities, see PxArticulationCache::linkVelocity. + eLINK_ACCELERATION = (1 << 5), //!< The link accelerations, see PxArticulationCache::linkAcceleration. + eROOT_TRANSFORM = (1 << 6), //!< Root link transform, see PxArticulationCache::rootLinkData. + eROOT_VELOCITIES = (1 << 7), //!< Root link velocities (read/write) and accelerations (read), see PxArticulationCache::rootLinkData. + eSENSOR_FORCES = (1 << 8), //!< The spatial sensor forces, see PxArticulationCache::sensorForces. + eJOINT_SOLVER_FORCES = (1 << 9), //!< Solver constraint joint forces, see PxArticulationCache::jointSolverForces. + eALL = (eVELOCITY | eACCELERATION | ePOSITION | eLINK_VELOCITY | eLINK_ACCELERATION | eROOT_TRANSFORM | eROOT_VELOCITIES) + }; + }; + + typedef PxFlags PxArticulationCacheFlags; + PX_FLAGS_OPERATORS(PxArticulationCacheFlag::Enum, PxU32) + +#if !PX_DOXYGEN +} +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/PxArticulationJoint.h b/Source/ThirdParty/PhysX/PxArticulationJoint.h deleted file mode 100644 index 4f5031326..000000000 --- a/Source/ThirdParty/PhysX/PxArticulationJoint.h +++ /dev/null @@ -1,495 +0,0 @@ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// * Neither the name of NVIDIA CORPORATION nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. -// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. -// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - - -#ifndef PX_PHYSICS_NX_ARTICULATION_JOINT -#define PX_PHYSICS_NX_ARTICULATION_JOINT -/** \addtogroup physics -@{ */ - -#include "PxPhysXConfig.h" -#include "common/PxBase.h" -#include "solver/PxSolverDefs.h" - -#if !PX_DOXYGEN -namespace physx -{ -#endif - -class PxArticulationJointImpl; - -/** -\brief The type of joint drive to use for the articulation joint. - -Two drive models are currently supported. in the TARGET model, the drive spring displacement will be determined -as the rotation vector from the relative quaternion beetween child and parent, and the target quaternion. - -In the ERROR model, the drive spring displacement will be taken directly from the imaginary part of the relative -quaternion. This drive model requires more computation on the part of the application, but allows driving the joint -with a spring displacement that is more than a complete rotation. - -@see PxArticulationJoint -*/ - -struct PxArticulationJointDriveType -{ - enum Enum - { - eTARGET = 0, // use the quaternion as the drive target - eERROR = 1 // use the vector part of the quaternion as the drive error. - }; -}; - -class PxArticulationJointBase : public PxBase -{ -public: - /** - \brief get the parent articulation link to which this articulation joint belongs - - \return the articulation link to which this joint belongs - */ - virtual PxArticulationLink& getParentArticulationLink() const = 0; - - /** - \brief set the joint pose in the parent frame - - \param[in] pose the joint pose in the parent frame - Default: the identity matrix - - @see getParentPose() - */ - virtual void setParentPose(const PxTransform& pose) = 0; - - /** - \brief get the joint pose in the parent frame - - \return the joint pose in the parent frame - - @see setParentPose() - */ - virtual PxTransform getParentPose() const = 0; - - /** - \brief get the child articulation link to which this articulation joint belongs - - \return the articulation link to which this joint belongs - */ - virtual PxArticulationLink& getChildArticulationLink() const = 0; - - /** - \brief set the joint pose in the child frame - - \param[in] pose the joint pose in the child frame - Default: the identity matrix - - @see getChildPose() - */ - virtual void setChildPose(const PxTransform& pose) = 0; - - /** - \brief get the joint pose in the child frame - - \return the joint pose in the child frame - - @see setChildPose() - */ - virtual PxTransform getChildPose() const = 0; - - virtual PxArticulationJointImpl* getImpl() = 0; - virtual const PxArticulationJointImpl* getImpl() const = 0; - - virtual ~PxArticulationJointBase() {} - -private: -protected: - PX_INLINE PxArticulationJointBase(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags) {} - PX_INLINE PxArticulationJointBase(PxBaseFlags baseFlags) : PxBase(baseFlags) {} - - virtual bool isKindOf(const char* name) const { return !::strcmp("PxArticulationJointBase", name) || PxBase::isKindOf(name); } -}; - - - -/** -\brief a joint between two links in an articulation. - -The joint model is very similar to a PxSphericalJoint with swing and twist limits, -and an implicit drive model. - -@see PxArticulation PxArticulationLink -*/ - -class PxArticulationJoint : public PxArticulationJointBase -{ -public: - - /** - \brief set the target drive - - This is the target position for the joint drive, measured in the parent constraint frame. - - \param[in] orientation the target orientation for the joint - Range: a unit quaternion - Default: the identity quaternion - - @see getTargetOrientation() - */ - virtual void setTargetOrientation(const PxQuat& orientation) = 0; - - /** - \brief get the target drive position - - \return the joint drive target position - - @see setTargetOrientation() - */ - virtual PxQuat getTargetOrientation() const = 0; - - /** - \brief set the target drive velocity - - This is the target velocity for the joint drive, measured in the parent constraint frame - - \param[in] velocity the target velocity for the joint - Default: the zero vector - - @see getTargetVelocity() - */ - virtual void setTargetVelocity(const PxVec3& velocity) = 0; - - /** - \brief get the target drive velocity - - \return the target velocity for the joint - - @see setTargetVelocity() - */ - virtual PxVec3 getTargetVelocity() const = 0; - - /** - \brief set the drive type - - \param[in] driveType the drive type for the joint - Default: PxArticulationJointDriveType::eTARGET - - @see getDriveType() - */ - virtual void setDriveType(PxArticulationJointDriveType::Enum driveType) = 0; - - /** - \brief get the drive type - - \return the drive type - - @see setDriveType() - */ - virtual PxArticulationJointDriveType::Enum getDriveType() const = 0; - - /** - \brief set the drive strength of the joint acceleration spring. - - The acceleration generated by the spring drive is proportional to - this value and the angle between the drive target position and the - current position. - - \param[in] spring the spring strength of the joint - Range: [0, PX_MAX_F32)
- Default: 0.0 - - @see getStiffness() - */ - virtual void setStiffness(PxReal spring) = 0; - - /** - \brief get the drive strength of the joint acceleration spring - - \return the spring strength of the joint - - @see setStiffness() - */ - virtual PxReal getStiffness() const = 0; - - /** - \brief set the damping of the joint acceleration spring - - The acceleration generated by the spring drive is proportional to - this value and the difference between the angular velocity of the - joint and the target drive velocity. - - \param[in] damping the damping of the joint drive - Range: [0, PX_MAX_F32)
- Default: 0.0 - - @see getDamping() - */ - virtual void setDamping(PxReal damping) = 0; - - /** - \brief get the damping of the joint acceleration spring - - @see setDamping() - */ - virtual PxReal getDamping() const = 0; - - /** - \brief set the internal compliance - - Compliance determines the extent to which the joint resists acceleration. - - There are separate values for resistance to accelerations caused by external - forces such as gravity and contact forces, and internal forces generated from - other joints. - - A low compliance means that forces have little effect, a compliance of 1 means - the joint does not resist such forces at all. - - \param[in] compliance the compliance to internal forces - Range: (0, 1] - Default: 0.0 - - @see getInternalCompliance() - */ - virtual void setInternalCompliance(PxReal compliance) = 0; - - /** - \brief get the internal compliance - - \return the compliance to internal forces - - @see setInternalCompliance() - */ - virtual PxReal getInternalCompliance() const = 0; - - /** - \brief get the drive external compliance - - Compliance determines the extent to which the joint resists acceleration. - - There are separate values for resistance to accelerations caused by external - forces such as gravity and contact forces, and internal forces generated from - other joints. - - A low compliance means that forces have little effect, a compliance of 1 means - the joint does not resist such forces at all. - - \param[in] compliance the compliance to external forces - Range: (0, 1] - Default: 0.0 - - @see getExternalCompliance() - */ - virtual void setExternalCompliance(PxReal compliance) = 0; - - /** - \brief get the drive external compliance - - \return the compliance to external forces - - @see setExternalCompliance() - */ - virtual PxReal getExternalCompliance() const = 0; - - /** - \brief set the extents of the cone limit. The extents are measured in the frame - of the parent. - - Note that very small or highly elliptical limit cones may result in jitter. - - \param[in] zLimit the allowed extent of rotation around the z-axis - \param[in] yLimit the allowed extent of rotation around the y-axis - Range: ( (0, Pi), (0, Pi) ) - Default: (Pi/4, Pi/4) - - \note Please note the order of zLimit and yLimit. - */ - virtual void setSwingLimit(PxReal zLimit, PxReal yLimit) = 0; - - /** - \brief get the extents for the swing limit cone - - \param[out] zLimit the allowed extent of rotation around the z-axis - \param[out] yLimit the allowed extent of rotation around the y-axis - - \note Please note the order of zLimit and yLimit. - - @see setSwingLimit() - */ - virtual void getSwingLimit(PxReal& zLimit, PxReal& yLimit) const = 0; - - /** - \brief set the tangential spring for the limit cone - Range: ([0, PX_MAX_F32), [0, PX_MAX_F32)) - Default: (0.0, 0.0) - */ - virtual void setTangentialStiffness(PxReal spring) = 0; - - /** - \brief get the tangential spring for the swing limit cone - - \return the tangential spring - - @see setTangentialStiffness() - */ - virtual PxReal getTangentialStiffness() const = 0; - - /** - \brief set the tangential damping for the limit cone - Range: ([0, PX_MAX_F32), [0, PX_MAX_F32)) - Default: (0.0, 0.0) - */ - virtual void setTangentialDamping(PxReal damping) = 0; - - /** - \brief get the tangential damping for the swing limit cone - - \return the tangential damping - - @see setTangentialDamping() - */ - virtual PxReal getTangentialDamping() const = 0; - - /** - \brief set the contact distance for the swing limit - - The contact distance should be less than either limit angle. - - Range: [0, Pi] - Default: 0.05 radians - - @see getSwingLimitContactDistance() - */ - virtual void setSwingLimitContactDistance(PxReal contactDistance) = 0; - - /** - \brief get the contact distance for the swing limit - - \return the contact distance for the swing limit cone - - @see setSwingLimitContactDistance() - */ - virtual PxReal getSwingLimitContactDistance() const = 0; - - /** - \brief set the flag which enables the swing limit - - \param[in] enabled whether the limit is enabled - Default: false - - @see getSwingLimitEnabled() - */ - virtual void setSwingLimitEnabled(bool enabled) = 0; - - /** - \brief get the flag which enables the swing limit - - \return whether the swing limit is enabled - - @see setSwingLimitEnabled() - */ - virtual bool getSwingLimitEnabled() const = 0; - - /** - \brief set the bounds of the twistLimit - - \param[in] lower the lower extent of the twist limit - \param[in] upper the upper extent of the twist limit - Range: (-Pi, Pi) - Default: (-Pi/4, Pi/4) - - The lower limit value must be less than the upper limit if the limit is enabled - - @see getTwistLimit() - */ - virtual void setTwistLimit(PxReal lower, PxReal upper) = 0; - - /** - \brief get the bounds of the twistLimit - - \param[out] lower the lower extent of the twist limit - \param[out] upper the upper extent of the twist limit - - @see setTwistLimit() - */ - virtual void getTwistLimit(PxReal &lower, PxReal &upper) const = 0; - - /** - \brief set the flag which enables the twist limit - - \param[in] enabled whether the twist limit is enabled - Default: false - - @see getTwistLimitEnabled() - */ - virtual void setTwistLimitEnabled(bool enabled) = 0; - - /** - \brief get the twistLimitEnabled flag - - \return whether the twist limit is enabled - - @see setTwistLimitEnabled() - */ - virtual bool getTwistLimitEnabled() const = 0; - - /** - \brief set the contact distance for the swing limit - - The contact distance should be less than half the distance between the upper and lower limits. - - Range: [0, Pi) - Default: 0.05 radians - - @see getTwistLimitContactDistance() - */ - virtual void setTwistLimitContactDistance(PxReal contactDistance) = 0; - - /** - \brief get the contact distance for the swing limit - - \return the contact distance for the twist limit - - @see setTwistLimitContactDistance() - */ - virtual PxReal getTwistLimitContactDistance() const = 0; - - virtual const char* getConcreteTypeName() const { return "PxArticulationJoint"; } - -protected: - PX_INLINE PxArticulationJoint(PxType concreteType, PxBaseFlags baseFlags) : PxArticulationJointBase(concreteType, baseFlags) {} - PX_INLINE PxArticulationJoint(PxBaseFlags baseFlags) : PxArticulationJointBase(baseFlags) {} - virtual ~PxArticulationJoint() {} - virtual bool isKindOf(const char* name) const { return !::strcmp("PxArticulationJoint", name) || PxArticulationJointBase::isKindOf(name); } -}; - -#if !PX_DOXYGEN -} // namespace physx -#endif - -/** @} */ -#endif diff --git a/Source/ThirdParty/PhysX/PxArticulationJointReducedCoordinate.h b/Source/ThirdParty/PhysX/PxArticulationJointReducedCoordinate.h index bba5e3b92..4043f7464 100644 --- a/Source/ThirdParty/PhysX/PxArticulationJointReducedCoordinate.h +++ b/Source/ThirdParty/PhysX/PxArticulationJointReducedCoordinate.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,20 +22,18 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_ARTICULATION_JOINT_RC -#define PX_PHYSICS_NX_ARTICULATION_JOINT_RC +#ifndef PX_ARTICULATION_JOINT_RC_H +#define PX_ARTICULATION_JOINT_RC_H /** \addtogroup physics @{ */ -#if 1 #include "PxPhysXConfig.h" #include "common/PxBase.h" -#include "PxArticulationJoint.h" +#include "solver/PxSolverDefs.h" #if !PX_DOXYGEN namespace physx @@ -44,44 +41,482 @@ namespace physx #endif /** - \brief a joint between two links in an articulation. + \brief A joint between two links in an articulation. - The joint model is very similar to a PxSphericalJoint with swing and twist limits, - and an implicit drive model. - - @see PxArticulation PxArticulationLink + @see PxArticulationReducedCoordinate, PxArticulationLink */ - - class PxArticulationJointReducedCoordinate : public PxArticulationJointBase + class PxArticulationJointReducedCoordinate : public PxBase { public: - virtual void setJointType(PxArticulationJointType::Enum jointType) = 0; - virtual PxArticulationJointType::Enum getJointType() const = 0; + /** + \brief Gets the parent articulation link of this joint. - virtual void setMotion(PxArticulationAxis::Enum axis, PxArticulationMotion::Enum motion) = 0; - virtual PxArticulationMotion::Enum getMotion(PxArticulationAxis::Enum axis) const = 0; + \return The parent link. + */ + virtual PxArticulationLink& getParentArticulationLink() const = 0; - virtual void setLimit(PxArticulationAxis::Enum axis, const PxReal lowLimit, const PxReal highLimit) = 0; - virtual void getLimit(PxArticulationAxis::Enum axis, PxReal& lowLimit, PxReal& highLimit) = 0; - virtual void setDrive(PxArticulationAxis::Enum axis, const PxReal stiffness, const PxReal damping, const PxReal maxForce, PxArticulationDriveType::Enum driveType = PxArticulationDriveType::eFORCE) = 0; - virtual void getDrive(PxArticulationAxis::Enum axis, PxReal& stiffness, PxReal& damping, PxReal& maxForce, PxArticulationDriveType::Enum& driveType) = 0; - virtual void setDriveTarget(PxArticulationAxis::Enum axis, const PxReal target) = 0; - virtual void setDriveVelocity(PxArticulationAxis::Enum axis, const PxReal targetVel) = 0; - virtual PxReal getDriveTarget(PxArticulationAxis::Enum axis) = 0; - virtual PxReal getDriveVelocity(PxArticulationAxis::Enum axis) = 0; + /** + \brief Sets the joint pose in the parent link actor frame. - virtual void setFrictionCoefficient(const PxReal coefficient) = 0; - virtual PxReal getFrictionCoefficient() const = 0; + \param[in] pose The joint pose. + Default: The identity transform. + + \note This call is not allowed while the simulation is running. + + @see getParentPose + */ + virtual void setParentPose(const PxTransform& pose) = 0; + + /** + \brief Gets the joint pose in the parent link actor frame. + + \return The joint pose. + + @see setParentPose + */ + virtual PxTransform getParentPose() const = 0; + + /** + \brief Gets the child articulation link of this joint. + + \return The child link. + */ + virtual PxArticulationLink& getChildArticulationLink() const = 0; + + /** + \brief Sets the joint pose in the child link actor frame. + + \param[in] pose The joint pose. + Default: The identity transform. + + \note This call is not allowed while the simulation is running. + + @see getChildPose + */ + virtual void setChildPose(const PxTransform& pose) = 0; + + /** + \brief Gets the joint pose in the child link actor frame. + + \return The joint pose. + + @see setChildPose + */ + virtual PxTransform getChildPose() const = 0; + + /** + \brief Sets the joint type (e.g. revolute). + + \param[in] jointType The joint type to set. + + \note Setting the joint type is not allowed while the articulation is in a scene. + In order to set the joint type, remove and then re-add the articulation to the scene. + + @see PxArticulationJointType, getJointType + */ + virtual void setJointType(PxArticulationJointType::Enum jointType) = 0; + + /** + \brief Gets the joint type. + + \return The joint type. + + @see PxArticulationJointType, setJointType + */ + virtual PxArticulationJointType::Enum getJointType() const = 0; + + /** + \brief Sets the joint motion for a given axis. + + \param[in] axis The target axis. + \param[in] motion The motion type to set. + + \note Setting the motion of joint axes is not allowed while the articulation is in a scene. + In order to set the motion, remove and then re-add the articulation to the scene. + + @see PxArticulationAxis, PxArticulationMotion, getMotion + */ + virtual void setMotion(PxArticulationAxis::Enum axis, PxArticulationMotion::Enum motion) = 0; + + /** + \brief Returns the joint motion for the given axis. + + \param[in] axis The target axis. + + \return The joint motion of the given axis. + + @see PxArticulationAxis, PxArticulationMotion, setMotion + */ + virtual PxArticulationMotion::Enum getMotion(PxArticulationAxis::Enum axis) const = 0; + + /** + \brief Sets the joint limits for a given axis. + + - The motion of the corresponding axis should be set to PxArticulationMotion::eLIMITED in order for the limits to be enforced. + - The lower limit should be strictly smaller than the higher limit. If the limits should be equal, use PxArticulationMotion::eLOCKED + and an appropriate offset in the parent/child joint frames. + + \param[in] axis The target axis. + \param[in] lowLimit The lower joint limit.
+ Range: [-PX_MAX_F32, highLimit)
+ Default: 0.0 + \param[in] highLimit The higher joint limit.
+ Range: (lowLimit, PX_MAX_F32]
+ Default: 0.0 + + \note This call is not allowed while the simulation is running. + + \deprecated Use #setLimitParams instead. Deprecated since PhysX version 5.1. + + @see setLimitParams, PxArticulationAxis + */ + PX_DEPRECATED PX_FORCE_INLINE void setLimit(PxArticulationAxis::Enum axis, const PxReal lowLimit, const PxReal highLimit) + { + setLimitParams(axis, PxArticulationLimit(lowLimit, highLimit)); + } + + /** + \brief Returns the joint limits for a given axis. + + \param[in] axis The target axis. + \param[out] lowLimit The lower joint limit. + \param[out] highLimit The higher joint limit. + + \deprecated Use #getLimitParams instead. Deprecated since PhysX version 5.1. + + @see getLimitParams, PxArticulationAxis + */ + PX_DEPRECATED PX_FORCE_INLINE void getLimit(PxArticulationAxis::Enum axis, PxReal& lowLimit, PxReal& highLimit) const + { + PxArticulationLimit pair = getLimitParams(axis); + lowLimit = pair.low; + highLimit = pair.high; + } + + /** + \brief Sets the joint limits for a given axis. + + - The motion of the corresponding axis should be set to PxArticulationMotion::eLIMITED in order for the limits to be enforced. + - The lower limit should be strictly smaller than the higher limit. If the limits should be equal, use PxArticulationMotion::eLOCKED + and an appropriate offset in the parent/child joint frames. + + \param[in] axis The target axis. + \param[in] limit The joint limits. + + \note This call is not allowed while the simulation is running. + + \note For spherical joints, limit.min and limit.max must both be in range [-Pi, Pi]. + + @see getLimitParams, PxArticulationAxis, PxArticulationLimit + */ + virtual void setLimitParams(PxArticulationAxis::Enum axis, const PxArticulationLimit& limit) = 0; + + /** + \brief Returns the joint limits for a given axis. + + \param[in] axis The target axis. + + \return The joint limits. + + @see setLimitParams, PxArticulationAxis, PxArticulationLimit + */ + virtual PxArticulationLimit getLimitParams(PxArticulationAxis::Enum axis) const = 0; + + /** + \brief Configures a joint drive for the given axis. + + See PxArticulationDrive for parameter details; and the manual for further information, and the drives' implicit spring-damper (i.e. PD control) implementation in particular. + + \param[in] axis The target axis. + \param[in] stiffness The drive stiffness, i.e. the proportional gain of the implicit PD controller.
+ Range: [0, PX_MAX_F32]
+ Default: 0.0 + \param[in] damping The drive damping, i.e. the derivative gain of the implicit PD controller.
+ Range: [0, PX_MAX_F32]
+ Default: 0.0 + \param[in] maxForce The force limit of the drive (this parameter also limits the force for an acceleration-type drive).
+ Range: [0, PX_MAX_F32]
+ Default: 0.0 + \param[in] driveType The drive type, @see PxArticulationDriveType. + + \note This call is not allowed while the simulation is running. + + \deprecated Use #setDriveParams instead. Deprecated since PhysX version 5.1. + + @see setDriveParams, PxArticulationAxis, PxArticulationDriveType, PxArticulationDrive, PxArticulationFlag::eDRIVE_LIMITS_ARE_FORCES + */ + PX_DEPRECATED PX_FORCE_INLINE void setDrive(PxArticulationAxis::Enum axis, const PxReal stiffness, const PxReal damping, const PxReal maxForce, PxArticulationDriveType::Enum driveType = PxArticulationDriveType::eFORCE) + { + setDriveParams(axis, PxArticulationDrive(stiffness, damping, maxForce, driveType)); + } + + /** + \brief Gets the joint drive configuration for the given axis. + + \param[in] axis The motion axis. + \param[out] stiffness The drive stiffness. + \param[out] damping The drive damping. + \param[out] maxForce The force limit. + \param[out] driveType The drive type. + + \deprecated Use #getDriveParams instead. Deprecated since PhysX version 5.1. + + @see getDriveParams, PxArticulationAxis, PxArticulationDriveType, PxArticulationDrive + */ + PX_DEPRECATED PX_FORCE_INLINE void getDrive(PxArticulationAxis::Enum axis, PxReal& stiffness, PxReal& damping, PxReal& maxForce, PxArticulationDriveType::Enum& driveType) const + { + PxArticulationDrive drive = getDriveParams(axis); + stiffness = drive.stiffness; + damping = drive.damping; + maxForce = drive.maxForce; + driveType = drive.driveType; + } + + /** + \brief Configures a joint drive for the given axis. + + See PxArticulationDrive for parameter details; and the manual for further information, and the drives' implicit spring-damper (i.e. PD control) implementation in particular. + + \param[in] axis The target axis. + \param[in] drive The drive parameters + + \note This call is not allowed while the simulation is running. + + @see getDriveParams, PxArticulationAxis, PxArticulationDrive + */ + virtual void setDriveParams(PxArticulationAxis::Enum axis, const PxArticulationDrive& drive) = 0; + + /** + \brief Gets the joint drive configuration for the given axis. + + \param[in] axis The target axis. + \return The drive parameters. + + @see setDriveParams, PxArticulationAxis, PxArticulationDrive + */ + virtual PxArticulationDrive getDriveParams(PxArticulationAxis::Enum axis) const = 0; + + /** + \brief Sets the joint drive position target for the given axis. + + The target units are linear units (equivalent to scene units) for a translational axis, or rad for a rotational axis. + + \param[in] axis The target axis. + \param[in] target The target position. + \param[in] autowake If true and the articulation is in a scene, the call wakes up the articulation and increases the wake counter + to #PxSceneDesc::wakeCounterResetValue if the counter value is below the reset value. + + \note This call is not allowed while the simulation is running. + + \note For spherical joints, target must be in range [-Pi, Pi]. + + \note The target is specified in the parent frame of the joint. If Gp, Gc are the parent and child actor poses in the world frame and Lp, Lc are the parent and child joint frames expressed in the parent and child actor frames then the joint will drive the parent and child links to poses that obey Gp * Lp * J = Gc * Lc. For joints restricted to angular motion, J has the form PxTranfsorm(PxVec3(PxZero), PxExp(PxVec3(twistTarget, swing1Target, swing2Target))). For joints restricted to linear motion, J has the form PxTransform(PxVec3(XTarget, YTarget, ZTarget), PxQuat(PxIdentity)). + + \note For spherical joints with more than 1 degree of freedom, the joint target angles taken together can collectively represent a rotation of greater than Pi around a vector. When this happens the rotation that matches the joint drive target is not the shortest path rotation. The joint pose J that is the outcome after driving to the target pose will always be the equivalent of the shortest path rotation. + + @see PxArticulationAxis, getDriveTarget + */ + virtual void setDriveTarget(PxArticulationAxis::Enum axis, const PxReal target, bool autowake = true) = 0; + + /** + \brief Returns the joint drive position target for the given axis. + + \param[in] axis The target axis. + + \return The target position. + + @see PxArticulationAxis, setDriveTarget + */ + virtual PxReal getDriveTarget(PxArticulationAxis::Enum axis) const = 0; + + /** + \brief Sets the joint drive velocity target for the given axis. + + The target units are linear units (equivalent to scene units) per second for a translational axis, or radians per second for a rotational axis. + + \param[in] axis The target axis. + \param[in] targetVel The target velocity. + \param[in] autowake If true and the articulation is in a scene, the call wakes up the articulation and increases the wake counter + to #PxSceneDesc::wakeCounterResetValue if the counter value is below the reset value. + + \note This call is not allowed while the simulation is running. + + @see PxArticulationAxis, getDriveVelocity + */ + virtual void setDriveVelocity(PxArticulationAxis::Enum axis, const PxReal targetVel, bool autowake = true) = 0; + + /** + \brief Returns the joint drive velocity target for the given axis. + + \param[in] axis The target axis. + + \return The target velocity. + + @see PxArticulationAxis, setDriveVelocity + */ + virtual PxReal getDriveVelocity(PxArticulationAxis::Enum axis) const = 0; + + /** + \brief Sets the joint armature for the given axis. + + - The armature is directly added to the joint-space spatial inertia of the corresponding axis. + - The armature is in mass units for a prismatic (i.e. linear) joint, and in mass units * (scene linear units)^2 for a rotational joint. + + \param[in] axis The target axis. + \param[in] armature The joint axis armature. + + \note This call is not allowed while the simulation is running. + + @see PxArticulationAxis, getArmature + */ + virtual void setArmature(PxArticulationAxis::Enum axis, const PxReal armature) = 0; + + /** + \brief Gets the joint armature for the given axis. + + \param[in] axis The target axis. + \return The armature set on the given axis. + + @see PxArticulationAxis, setArmature + */ + virtual PxReal getArmature(PxArticulationAxis::Enum axis) const = 0; + + /** + \brief Sets the joint friction coefficient, which applies to all joint axes. + + - The joint friction is unitless and relates the magnitude of the spatial force [F_trans, T_trans] transmitted from parent to child link to + the maximal friction force F_resist that may be applied by the solver to resist joint motion, per axis; i.e. |F_resist| <= coefficient * (|F_trans| + |T_trans|), + where F_resist may refer to a linear force or torque depending on the joint axis. + - The simulated friction effect is therefore similar to static and Coulomb friction. In order to simulate dynamic joint friction, use a joint drive with + zero stiffness and zero velocity target, and an appropriately dimensioned damping parameter. + + \param[in] coefficient The joint friction coefficient. + + \note This call is not allowed while the simulation is running. + + @see getFrictionCoefficient + */ + virtual void setFrictionCoefficient(const PxReal coefficient) = 0; + + /** + \brief Gets the joint friction coefficient. + + \return The joint friction coefficient. + + @see setFrictionCoefficient + */ + virtual PxReal getFrictionCoefficient() const = 0; + + /** + \brief Sets the maximal joint velocity enforced for all axes. + + - The solver will apply appropriate joint-space impulses in order to enforce the per-axis joint-velocity limit. + - The velocity units are linear units (equivalent to scene units) per second for a translational axis, or radians per second for a rotational axis. + + \param[in] maxJointV The maximal per-axis joint velocity. + + \note This call is not allowed while the simulation is running. + + @see getMaxJointVelocity + */ + virtual void setMaxJointVelocity(const PxReal maxJointV) = 0; + + /** + \brief Gets the maximal joint velocity enforced for all axes. + + \return The maximal per-axis joint velocity. + + @see setMaxJointVelocity + */ + virtual PxReal getMaxJointVelocity() const = 0; + + /** + \brief Sets the joint position for the given axis. + + - For performance, prefer PxArticulationCache::jointPosition to set joint positions in a batch articulation state update. + - Use PxArticulationReducedCoordinate::updateKinematic after all state updates to the articulation via non-cache API such as this method, + in order to update link states for the next simulation frame or querying. + + \param[in] axis The target axis. + \param[in] jointPos The joint position in linear units (equivalent to scene units) for a translational axis, or radians for a rotational axis. + + \note This call is not allowed while the simulation is running. + + \note For spherical joints, jointPos must be in range [-Pi, Pi]. + + \note Joint position is specified in the parent frame of the joint. If Gp, Gc are the parent and child actor poses in the world frame and Lp, Lc are the parent and child joint frames expressed in the parent and child actor frames then the parent and child links will be given poses that obey Gp * Lp * J = Gc * Lc with J denoting the joint pose. For joints restricted to angular motion, J has the form PxTranfsorm(PxVec3(PxZero), PxExp(PxVec3(twistPos, swing1Pos, swing2Pos))). For joints restricted to linear motion, J has the form PxTransform(PxVec3(xPos, yPos, zPos), PxQuat(PxIdentity)). + + \note For spherical joints with more than 1 degree of freedom, the input joint positions taken together can collectively represent a rotation of greater than Pi around a vector. When this happens the rotation that matches the joint positions is not the shortest path rotation. The joint pose J that is the outcome of setting and applying the joint positions will always be the equivalent of the shortest path rotation. + + @see PxArticulationAxis, getJointPosition, PxArticulationCache::jointPosition, PxArticulationReducedCoordinate::updateKinematic + */ + virtual void setJointPosition(PxArticulationAxis::Enum axis, const PxReal jointPos) = 0; + + /** + \brief Gets the joint position for the given axis, i.e. joint degree of freedom (DOF). + + For performance, prefer PxArticulationCache::jointPosition to get joint positions in a batch query. + + \param[in] axis The target axis. + + \return The joint position in linear units (equivalent to scene units) for a translational axis, or radians for a rotational axis. + + \note This call is not allowed while the simulation is running except in a split simulation during #PxScene::collide() and up to #PxScene::advance(), + and in PxContactModifyCallback or in contact report callbacks. + + @see PxArticulationAxis, setJointPosition, PxArticulationCache::jointPosition + */ + virtual PxReal getJointPosition(PxArticulationAxis::Enum axis) const = 0; + + /** + \brief Sets the joint velocity for the given axis. + + - For performance, prefer PxArticulationCache::jointVelocity to set joint velocities in a batch articulation state update. + - Use PxArticulationReducedCoordinate::updateKinematic after all state updates to the articulation via non-cache API such as this method, + in order to update link states for the next simulation frame or querying. + + \param[in] axis The target axis. + \param[in] jointVel The joint velocity in linear units (equivalent to scene units) per second for a translational axis, or radians per second for a rotational axis. + + \note This call is not allowed while the simulation is running. + + @see PxArticulationAxis, getJointVelocity, PxArticulationCache::jointVelocity, PxArticulationReducedCoordinate::updateKinematic + */ + virtual void setJointVelocity(PxArticulationAxis::Enum axis, const PxReal jointVel) = 0; + + /** + \brief Gets the joint velocity for the given axis. + + For performance, prefer PxArticulationCache::jointVelocity to get joint velocities in a batch query. + + \param[in] axis The target axis. + + \return The joint velocity in linear units (equivalent to scene units) per second for a translational axis, or radians per second for a rotational axis. + + \note This call is not allowed while the simulation is running except in a split simulation during #PxScene::collide() and up to #PxScene::advance(), + and in PxContactModifyCallback or in contact report callbacks. + + @see PxArticulationAxis, setJointVelocity, PxArticulationCache::jointVelocity + */ + virtual PxReal getJointVelocity(PxArticulationAxis::Enum axis) const = 0; + + /** + \brief Returns the string name of the dynamic type. + + \return The string name. + */ virtual const char* getConcreteTypeName() const { return "PxArticulationJointReducedCoordinate"; } - virtual void setMaxJointVelocity(const PxReal maxJointV) = 0; - virtual PxReal getMaxJointVelocity() const = 0; + virtual ~PxArticulationJointReducedCoordinate() {} + + //public variables: + void* userData; //!< The user can assign this to whatever, usually to create a 1:1 relationship with a user object. protected: - PX_INLINE PxArticulationJointReducedCoordinate(PxType concreteType, PxBaseFlags baseFlags) : PxArticulationJointBase(concreteType, baseFlags) {} - PX_INLINE PxArticulationJointReducedCoordinate(PxBaseFlags baseFlags) : PxArticulationJointBase(baseFlags) {} - virtual ~PxArticulationJointReducedCoordinate() {} + PX_INLINE PxArticulationJointReducedCoordinate(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags) {} + PX_INLINE PxArticulationJointReducedCoordinate(PxBaseFlags baseFlags) : PxBase(baseFlags) {} + virtual bool isKindOf(const char* name) const { return !::strcmp("PxArticulationJointReducedCoordinate", name) || PxBase::isKindOf(name); } }; @@ -89,7 +524,5 @@ namespace physx } // namespace physx #endif -#endif - - /** @} */ +/** @} */ #endif diff --git a/Source/ThirdParty/PhysX/PxArticulationLink.h b/Source/ThirdParty/PhysX/PxArticulationLink.h index 4b9fee714..d6df1ebb6 100644 --- a/Source/ThirdParty/PhysX/PxArticulationLink.h +++ b/Source/ThirdParty/PhysX/PxArticulationLink.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,18 +22,16 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_ARTICULATION_LINK -#define PX_PHYSICS_NX_ARTICULATION_LINK +#ifndef PX_ARTICULATION_LINK_H +#define PX_ARTICULATION_LINK_H /** \addtogroup physics @{ */ #include "PxPhysXConfig.h" -#include "PxArticulationJoint.h" #include "PxRigidBody.h" #if !PX_DOXYGEN @@ -42,86 +39,155 @@ namespace physx { #endif - class PxArticulationBase; - /** -\brief a component of an articulation that represents a rigid body +\brief A component of an articulation that represents a rigid body. -A limited subset of the properties of PxRigidDynamic are supported. In particular, sleep properties -are attributes of the articulation rather than each individual body, damping and velocity limits -are not supported, and links may not be kinematic. +Articulation links have a restricted subset of the functionality of a PxRigidDynamic: +- They may not be kinematic, and do not support contact-force thresholds. +- Their velocity or global pose cannot be set directly, but must be set via the articulation-root and joint positions/velocities. +- Sleep state and solver iteration counts are properties of the entire articulation rather than the individual links. -@see PxArticulation PxArticulation.createLink PxArticulationJoint PxRigidBody +@see PxArticulationReducedCoordinate, PxArticulationReducedCoordinate::createLink, PxArticulationJointReducedCoordinate, PxRigidBody */ class PxArticulationLink : public PxRigidBody { public: /** - \brief Deletes the articulation link. + \brief Releases the link from the articulation. - \note Only a leaf articulation link can be released - - Do not keep a reference to the deleted instance. + \note Only a leaf articulation link can be released. + \note Releasing a link is not allowed while the articulation link is in a scene. In order to release a link, + remove and then re-add the corresponding articulation to the scene. - @see PxArticulation::createLink() + @see PxArticulationReducedCoordinate::createLink() */ virtual void release() = 0; /** - \brief get the articulation to which this articulation link belongs. This returns the base class. The application should - establish which articulation implementation this actually is and upcast to that type to access non-common functionality + \brief Gets the articulation that the link is a part of. - \return the articulation to which this link belongs + \return The articulation. + + @see PxArticulationReducedCoordinate */ - virtual PxArticulationBase& getArticulation() const = 0; + virtual PxArticulationReducedCoordinate& getArticulation() const = 0; /** - \brief Get the joint which connects this link to its parent. + \brief Gets the joint which connects this link to its parent. \return The joint connecting the link to the parent. NULL for the root link. - @see PxArticulationJoint + @see PxArticulationJointReducedCoordinate */ - virtual PxArticulationJointBase* getInboundJoint() const = 0; + virtual PxArticulationJointReducedCoordinate* getInboundJoint() const = 0; /** - \brief Get the degree of freedom of the joint which connects this link to its parent. + \brief Gets the number of degrees of freedom of the joint which connects this link to its parent. - \return The degree of freeedom of the joint connecting the link to the parent. 0xffffffff for the root link. + - The root link DOF-count is defined to be 0 regardless of PxArticulationFlag::eFIX_BASE. + - The return value is only valid for articulations that are in a scene. - @see PxArticulationJoint + \return The number of degrees of freedom, or 0xFFFFFFFF if the articulation is not in a scene. + + @see PxArticulationJointReducedCoordinate */ virtual PxU32 getInboundJointDof() const = 0; /** - \brief Get number of child links. + \brief Gets the number of child links. - \return the number of child links + \return The number of child links. - @see getChildren() + @see getChildren */ virtual PxU32 getNbChildren() const = 0; /** - \brief Get low-level link index + \brief Gets the low-level link index that may be used to index into members of PxArticulationCache. - \return low-level index + The return value is only valid for articulations that are in a scene. + + \return The low-level index, or 0xFFFFFFFF if the articulation is not in a scene. + + @see PxArticulationCache */ virtual PxU32 getLinkIndex() const = 0; /** - \brief Retrieve all the child links. + \brief Retrieves the child links. \param[out] userBuffer The buffer to receive articulation link pointers. - \param[in] bufferSize Size of provided user buffer. - \return Number of articulation links written to the buffer. - \param[in] startIndex Index of first child pointer to be retrieved + \param[in] bufferSize The size of the provided user buffer, use getNbChildren() for sizing. + \param[in] startIndex The index of the first child pointer to be retrieved. - @see getNbChildren() + \return The number of articulation links written to the buffer. + + @see getNbChildren */ - virtual PxU32 getChildren(PxArticulationLink** userBuffer, PxU32 bufferSize, PxU32 startIndex=0) const = 0; + virtual PxU32 getChildren(PxArticulationLink** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + + /** + \brief Set the constraint-force-mixing scale term. + + The cfm scale term is a stabilization term that helps avoid instabilities with over-constrained + configurations. It should be a small value that is multiplied by 1/mass internally to produce + an additional bias added to the unit response term in the solver. + + \param[in] cfm The constraint-force-mixing scale term. + + Default: 0.025 + Range: [0, 1] + + \note This call is not allowed while the simulation is running. + + @see getCfmScale + */ + virtual void setCfmScale(const PxReal cfm) = 0; + + /** + \brief Get the constraint-force-mixing scale term. + \return The constraint-force-mixing scale term. + + @see setCfmScale + */ + virtual PxReal getCfmScale() const = 0; + + /** + \brief Get the linear velocity of the link. + + - The linear velocity is with respect to the link's center of mass and not the actor frame origin. + - For performance, prefer PxArticulationCache::linkVelocity to get link spatial velocities in a batch query. + - When the articulation state is updated via non-cache API, use PxArticulationReducedCoordinate::updateKinematic before querying velocity. + + \return The linear velocity of the link. + + \note This call is not allowed while the simulation is running except in a split simulation during #PxScene::collide() and up to #PxScene::advance(), + and in PxContactModifyCallback or in contact report callbacks. + + @see PxRigidBody::getCMassLocalPose + */ + virtual PxVec3 getLinearVelocity() const = 0; + + /** + \brief Get the angular velocity of the link. + + - For performance, prefer PxArticulationCache::linkVelocity to get link spatial velocities in a batch query. + - When the articulation state is updated via non-cache API, use PxArticulationReducedCoordinate::updateKinematic before querying velocity. + + \return The angular velocity of the link. + + \note This call is not allowed while the simulation is running except in a split simulation during #PxScene::collide() and up to #PxScene::advance(), + and in PxContactModifyCallback or in contact report callbacks. + */ + virtual PxVec3 getAngularVelocity() const = 0; + + /** + \brief Returns the string name of the dynamic type. + + \return The string name. + */ virtual const char* getConcreteTypeName() const { return "PxArticulationLink"; } protected: diff --git a/Source/ThirdParty/PhysX/PxArticulationReducedCoordinate.h b/Source/ThirdParty/PhysX/PxArticulationReducedCoordinate.h index a3acd8e5c..c107dbd33 100644 --- a/Source/ThirdParty/PhysX/PxArticulationReducedCoordinate.h +++ b/Source/ThirdParty/PhysX/PxArticulationReducedCoordinate.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,20 +22,23 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_ARTICULATION_RC -#define PX_PHYSICS_NX_ARTICULATION_RC +#ifndef PX_ARTICULATION_RC_H +#define PX_ARTICULATION_RC_H /** \addtogroup physics @{ */ -#include "PxArticulationBase.h" +#include "PxPhysXConfig.h" +#include "common/PxBase.h" #include "foundation/PxVec3.h" #include "foundation/PxTransform.h" #include "solver/PxSolverDefs.h" +#include "PxArticulationFlag.h" +#include "PxArticulationTendon.h" +#include "PxArticulationFlag.h" #if !PX_DOXYGEN namespace physx @@ -44,6 +46,9 @@ namespace physx #endif PX_ALIGN_PREFIX(16) + /** + \brief Data structure to represent spatial forces. + */ struct PxSpatialForce { PxVec3 force; @@ -54,6 +59,9 @@ namespace physx PX_ALIGN_SUFFIX(16); PX_ALIGN_PREFIX(16) + /** + \brief Data structure to represent spatial velocities. + */ struct PxSpatialVelocity { PxVec3 linear; @@ -63,31 +71,33 @@ namespace physx } PX_ALIGN_SUFFIX(16); - class PxJoint; + class PxConstraint; + class PxScene; + /** + \brief Data structure used to access the root link state and acceleration. + + @see PxArticulationCache + */ struct PxArticulationRootLinkData { - PxTransform transform; - PxVec3 worldLinVel; - PxVec3 worldAngVel; - PxVec3 worldLinAccel; - PxVec3 worldAngAccel; + PxTransform transform; //!< Actor transform + // The velocities and accelerations below are with respect to the center of mass (COM) of the root link. The COM and actor frame origin may not coincide. + PxVec3 worldLinVel; //!< Link linear velocity + PxVec3 worldAngVel; //!< Link angular velocity + PxVec3 worldLinAccel; //!< Link classical linear acceleration + PxVec3 worldAngAccel; //!< Link angular acceleration }; + /** + \brief Data structure used to read and write internal articulation data. + + @see PxArticulationCacheFlag, PxArticulationReducedCoordinate::createCache, PxArticulationReducedCoordinate::applyCache, + PxArticulationReducedCoordinate::copyInternalStateToCache + */ class PxArticulationCache { public: - enum Enum - { - eVELOCITY = (1 << 0), //!< The joint velocities this frame. Note, this is the accumulated joint velocities, not change in joint velocity. - eACCELERATION = (1 << 1), //!< The joint accelerations this frame. Delta velocity can be computed from acceleration * dt. - ePOSITION = (1 << 2), //!< The joint positions this frame. Note, this is the accumulated joint positions over frames, not change in joint position. - eFORCE = (1 << 3), //!< The joint forces this frame. Note, the application should provide these values for the forward dynamic. If the application is using inverse dynamic, this is the joint force returned. - eLINKVELOCITY = (1 << 4), //!< The link velocities this frame. - eLINKACCELERATION = (1 << 5), //!< The link accelerations this frame. - eROOT = (1 << 6), //!< Root link transform, velocity and acceleration. Note, when the application call applyCache with eROOT flag, it won't apply root link's acceleration to the simulation - eALL = (eVELOCITY | eACCELERATION | ePOSITION| eLINKVELOCITY | eLINKACCELERATION | eROOT ) - }; PxArticulationCache() : externalForces (NULL), denseJacobian (NULL), @@ -96,7 +106,11 @@ namespace physx jointAcceleration (NULL), jointPosition (NULL), jointForce (NULL), + jointSolverForces (NULL), + linkVelocity (NULL), + linkAcceleration (NULL), rootLinkData (NULL), + sensorForces (NULL), coefficientMatrix (NULL), lambda (NULL), scratchMemory (NULL), @@ -104,310 +118,1293 @@ namespace physx version (0) {} - PxSpatialForce* externalForces; // N = getNbLinks() - PxReal* denseJacobian; // N = 6*getDofs()*NumJoints, NumJoints = getNbLinks() - 1 - PxReal* massMatrix; // N = getDofs()*getDofs() - PxReal* jointVelocity; // N = getDofs() - PxReal* jointAcceleration; // N = getDofs() - PxReal* jointPosition; // N = getDofs() - PxReal* jointForce; // N = getDofs() - PxSpatialVelocity* linkVelocity; // N = getNbLinks() - PxSpatialVelocity* linkAcceleration; // N = getNbLinks() - PxArticulationRootLinkData* rootLinkData; // root link Data + /** + \brief Releases an articulation cache. - //application need to allocate those memory and assign them to the cache - PxReal* coefficientMatrix; + @see PxArticulationReducedCoordinate::createCache, PxArticulationReducedCoordinate::applyCache, + PxArticulationReducedCoordinate::copyInternalStateToCache + */ + PX_PHYSX_CORE_API void release(); + + /** + \brief External forces acting on the articulation links for inverse dynamics computation. + + - N = getNbLinks(). + - Indexing follows the low-level link indices, see PxArticulationLink::getLinkIndex. + - The forces are with respect to the center of mass of the link. + + @see PxArticulationReducedCoordinate::computeGeneralizedExternalForce + */ + PxSpatialForce* externalForces; + + /** + \brief Dense Jacobian data. + + - N = nbRows * nbCols = (6 * getNbLinks()) * (6 + getDofs()) -> size includes possible floating-base DOFs regardless of PxArticulationFlag::eFIX_BASE flag. + - The links, i.e. rows are in order of the low-level link indices (minus one if PxArticulationFlag::eFIX_BASE is true), see PxArticulationLink::getLinkIndex. + The corresponding spatial velocities are stacked [vx; vy; vz; wx; wy; wz], where vx and wx refer to the linear and rotational velocity in world X. + - The DOFs, i.e. column indices correspond to the low-level DOF indices, see PxArticulationCache::jointVelocity. + + @see PxArticulationReducedCoordinate::computeDenseJacobian + */ + PxReal* denseJacobian; + + /** + \brief The generalized mass matrix that maps joint accelerations to joint forces. + + - N = getDofs() * getDofs(). + - The indexing follows the internal DOF index order, see PxArticulationCache::jointVelocity. + + @see PxArticulationReducedCoordinate::computeGeneralizedMassMatrix + */ + PxReal* massMatrix; + + /** + \brief The articulation joint DOF velocities. + + - N = getDofs(). + - Read/write using PxArticulationCacheFlag::eVELOCITY. + - The indexing follows the internal DOF index order. Therefore, the application should calculate the DOF data indices by summing the joint DOFs in the order of + the links' low-level indices (see the manual Section "Cache Indexing" for a snippet for this calculation): + \verbatim Low-level link index: | link 0 | link 1 | link 2 | link 3 | ... | <- PxArticulationLink::getLinkIndex() \endverbatim + \verbatim Link inbound joint DOF: | 0 | 1 | 2 | 1 | ... | <- PxArticulationLink::getInboundJointDof() \endverbatim + \verbatim Low-level DOF index: | - | 0 | 1, 2 | 3 | ... | \endverbatim + The root link always has low-level index 0 and always has zero inbound joint DOFs. The link DOF indexing follows the order in PxArticulationAxis::Enum. + For example, assume that low-level link 2 has an inbound spherical joint with two DOFs: eSWING1 and eSWING2. The corresponding low-level joint DOF indices + are therefore 1 for eSWING1 and 2 for eSWING2. + */ + PxReal* jointVelocity; + + /** + \brief The articulation joint DOF accelerations. + + - N = getDofs(). + - Read using PxArticulationCacheFlag::eACCELERATION. + - The indexing follows the internal DOF index order, see PxArticulationCache::jointVelocity. + - Delta joint DOF velocities can be computed from acceleration * dt. + */ + PxReal* jointAcceleration; + + /** + \brief The articulation joint DOF positions. + + - N = getDofs(). + - Read/write using PxArticulationCacheFlag::ePOSITION. + - The indexing follows the internal DOF index order, see PxArticulationCache::jointVelocity. + - For spherical joints, the joint position for each axis on the joint must be in range [-Pi, Pi]. + */ + PxReal* jointPosition; + + /** + \brief The articulation joint DOF forces. + + - N = getDofs(). + - Read/Write using PxArticulationCacheFlag::eFORCE. + - The indexing follows the internal DOF index order, see PxArticulationCache::jointVelocity. + - Applied joint forces persist and are applied each frame until changed. + */ + PxReal* jointForce; + + /** + \brief Solver constraint joint DOF forces. + + - N = getDofs(). + - Read using PxArticulationCacheFlag::eJOINT_SOLVER_FORCES. + - The indexing follows the internal DOF index order, see PxArticulationCache::jointVelocity. + - Raise PxArticulationFlag::eCOMPUTE_JOINT_FORCES to enable reading the solver forces. + */ + PxReal* jointSolverForces; + + /** + \brief Link spatial velocity. + + - N = getNbLinks(). + - Read using PxArticulationCacheFlag::eLINK_VELOCITY. + - The indexing follows the internal link indexing, see PxArticulationLink::getLinkIndex. + - The velocity is with respect to the link's center of mass. + + @see PxRigidBody::getCMassLocalPose + */ + PxSpatialVelocity* linkVelocity; + + /** + \brief Link classical acceleration. + + - N = getNbLinks(). + - Read using PxArticulationCacheFlag::eLINK_ACCELERATION. + - The indexing follows the internal link indexing, see PxArticulationLink::getLinkIndex. + - The acceleration is with respect to the link's center of mass. + + @see PxArticulationReducedCoordinate::getLinkAcceleration, PxRigidBody::getCMassLocalPose + */ + PxSpatialVelocity* linkAcceleration; + + /** + \brief Root link transform, velocities, and accelerations. + + - N = 1. + - Read/write using PxArticulationCacheFlag::eROOT_TRANSFORM and PxArticulationCacheFlag::eROOT_VELOCITIES (accelerations are read-only). + + @see PxArticulationRootLinkData + */ + PxArticulationRootLinkData* rootLinkData; + + /** + \brief Link sensor spatial forces. + + - N = getNbSensors(). + - Read using PxArticulationCacheFlag::eSENSOR_FORCES. + - For indexing, see PxArticulationSensor::getIndex. + + @see PxArticulationSensor + */ + PxSpatialForce* sensorForces; + + // Members and memory below here are not zeroed when zeroCache is called, and are not included in the size returned by PxArticulationReducedCoordinate::getCacheDataSize. + + /** + \brief Constraint coefficient matrix. + + - N = getCoefficentMatrixSize(). + - The user needs to allocate memory and set this member to the allocated memory. + + @see PxArticulationReducedCoordinate::computeCoefficientMatrix + */ + PxReal* coefficientMatrix; + + /** + \brief Constraint lambda values (impulses applied by the respective constraints). + + - N = getNbLoopJoints(). + - The user needs to allocate memory and set this member to the allocated memory. + + @see PxArticulationReducedCoordinate::computeLambda + */ PxReal* lambda; - //These three members won't be set to zero when zeroCache get called - void* scratchMemory; //this is used for internal calculation - void* scratchAllocator; - PxU32 version; //cache version. If the articulation configuration change, the cache is invalid + void* scratchMemory; //!< The scratch memory is used for internal calculations. + void* scratchAllocator; //!< The scratch allocator is used for internal calculations. + PxU32 version; //!< The cache version used internally to check compatibility with the articulation, i.e. detect if the articulation configuration changed after the cache was created. }; - typedef PxFlags PxArticulationCacheFlags; - PX_FLAGS_OPERATORS(PxArticulationCache::Enum, PxU8) + /** + \brief Flags to configure the forces reported by articulation link sensors. + + @see PxArticulationSensor::setFlag + */ + struct PxArticulationSensorFlag + { + enum Enum + { + eFORWARD_DYNAMICS_FORCES = 1 << 0, //!< Raise to receive forces from forward dynamics. + eCONSTRAINT_SOLVER_FORCES = 1 << 1, //!< Raise to receive forces from constraint solver. + eWORLD_FRAME = 1 << 2 //!< Raise to receive forces in the world rotation frame, otherwise they will be reported in the sensor's local frame. + }; + }; + + typedef physx::PxFlags PxArticulationSensorFlags; /** - \brief a tree structure of bodies connected by joints that is treated as a unit by the dynamics solver + \brief A force sensor that can be attached to articulation links to measure spatial force. - Articulations are more expensive to simulate than the equivalent collection of - PxRigidDynamic and PxJoint structures, but because the dynamics solver treats - each articulation as a single object, they are much less prone to separation and - have better support for actuation. An articulation may have at most 64 links. - - @see PxArticulationJoint PxArticulationLink PxPhysics.createArticulation + @see PxArticulationReducedCoordinate::createSensor */ + class PxArticulationSensor : public PxBase + { + public: + /** + \brief Releases the sensor. + + \note Releasing a sensor is not allowed while the articulation is in a scene. In order to + release a sensor, remove and then re-add the articulation to the scene. + */ + virtual void release() = 0; + + /** + \brief Returns the spatial force in the local frame of the sensor. + + \return The spatial force. + + \note This call is not allowed while the simulation is running except in a split simulation during #PxScene::collide() and up to #PxScene::advance(), + and in PxContactModifyCallback or in contact report callbacks. + + @see setRelativePose, getRelativePose + */ + virtual PxSpatialForce getForces() const = 0; + + /** + \brief Returns the relative pose between this sensor and the body frame of the link that the sensor is attached to. + + The link body frame is at the center of mass and aligned with the principal axes of inertia, see PxRigidBody::getCMassLocalPose. + + \return The transform link body frame -> sensor frame. + + @see setRelativePose + */ + virtual PxTransform getRelativePose() const = 0; + + /** + \brief Sets the relative pose between this sensor and the body frame of the link that the sensor is attached to. + + The link body frame is at the center of mass and aligned with the principal axes of inertia, see PxRigidBody::getCMassLocalPose. + + \param[in] pose The transform link body frame -> sensor frame. + + \note Setting the sensor relative pose is not allowed while the articulation is in a scene. In order to + set the pose, remove and then re-add the articulation to the scene. + + @see getRelativePose + */ + virtual void setRelativePose(const PxTransform& pose) = 0; + + /** + \brief Returns the link that this sensor is attached to. + + \return A pointer to the link. + */ + virtual PxArticulationLink* getLink() const = 0; + + /** + \brief Returns the index of this sensor inside the articulation. + + The return value is only valid for sensors attached to articulations that are in a scene. + + \return The low-level index, or 0xFFFFFFFF if the articulation is not in a scene. + */ + virtual PxU32 getIndex() const = 0; + + /** + \brief Returns the articulation that this sensor is part of. + + \return A pointer to the articulation. + */ + virtual PxArticulationReducedCoordinate* getArticulation() const = 0; + + /** + \brief Returns the sensor's flags. + + \return The current set of flags of the sensor. + + @see PxArticulationSensorFlag + */ + virtual PxArticulationSensorFlags getFlags() const = 0; + + /** + \brief Sets a flag of the sensor. + + \param[in] flag The flag to set. + \param[in] enabled The value to set the flag to. + + \note Setting the sensor flags is not allowed while the articulation is in a scene. In order to + set the flags, remove and then re-add the articulation to the scene. + + @see PxArticulationSensorFlag + */ + virtual void setFlag(PxArticulationSensorFlag::Enum flag, bool enabled) = 0; + + /** + \brief Returns the string name of the dynamic type. + + \return The string name. + */ + virtual const char* getConcreteTypeName() const { return "PxArticulationSensor"; } + + virtual ~PxArticulationSensor() {} + + void* userData; //!< user can assign this to whatever, usually to create a 1:1 relationship with a user object. + + protected: + PX_INLINE PxArticulationSensor(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags) {} + PX_INLINE PxArticulationSensor(PxBaseFlags baseFlags) : PxBase(baseFlags) {} + }; + + + /** + \brief Flag that configures articulation-state updates by PxArticulationReducedCoordinate::updateKinematic. + */ + struct PxArticulationKinematicFlag + { + enum Enum + { + ePOSITION = 1 << 0, //!< Raise after any changes to the articulation root or joint positions using non-cache API calls. Updates links' positions and velocities. + eVELOCITY = 1 << 1 //!< Raise after velocity-only changes to the articulation root or joints using non-cache API calls. Updates links' velocities. + }; + }; + + typedef physx::PxFlags PxArticulationKinematicFlags; + PX_FLAGS_OPERATORS(PxArticulationKinematicFlag::Enum, PxU8) #if PX_VC #pragma warning(push) #pragma warning(disable : 4435) #endif - class PxArticulationReducedCoordinate : public PxArticulationBase + /** + \brief A tree structure of bodies connected by joints that is treated as a unit by the dynamics solver. Parametrized in reduced (joint) coordinates. + + @see PxArticulationJointReducedCoordinate, PxArticulationLink, PxPhysics::createArticulationReducedCoordinate + */ + class PxArticulationReducedCoordinate : public PxBase { public: - virtual void release() = 0; + /** + \brief Returns the scene which this articulation belongs to. + + \return Owner Scene. NULL if not part of a scene. + + @see PxScene + */ + virtual PxScene* getScene() const = 0; /** - \brief Sets flags on the articulation + \brief Sets the solver iteration counts for the articulation. - \param[in] flags Articulation flags + The solver iteration count determines how accurately contacts, drives, and limits are resolved. + Setting a higher position iteration count may therefore help in scenarios where the articulation + is subject to many constraints; for example, a manipulator articulation with drives and joint limits + that is grasping objects, or several such articulations interacting through contacts. Other situations + where higher position iterations may improve simulation fidelity are: large mass ratios within the + articulation or between the articulation and an object in contact with it; or strong drives in the + articulation being used to manipulate a light object. + If intersecting bodies are being depenetrated too violently, increase the number of velocity + iterations. More velocity iterations will drive the relative exit velocity of the intersecting + objects closer to the correct value given the restitution. + + \param[in] minPositionIters Number of position iterations the solver should perform for this articulation. Range: [1,255] + \param[in] minVelocityIters Number of velocity iterations the solver should perform for this articulation. Range: [1,255] + + \note This call may not be made during simulation. + + @see getSolverIterationCounts() + */ + virtual void setSolverIterationCounts(PxU32 minPositionIters, PxU32 minVelocityIters = 1) = 0; + + /** + \brief Returns the solver iteration counts. + + @see setSolverIterationCounts() + */ + virtual void getSolverIterationCounts(PxU32& minPositionIters, PxU32& minVelocityIters) const = 0; + + /** + \brief Returns true if this articulation is sleeping. + + When an actor does not move for a period of time, it is no longer simulated in order to save time. This state + is called sleeping. However, because the object automatically wakes up when it is either touched by an awake object, + or a sleep-affecting property is changed by the user, the entire sleep mechanism should be transparent to the user. + + An articulation can only go to sleep if all links are ready for sleeping. An articulation is guaranteed to be awake + if at least one of the following holds: + + \li The wake counter is positive (see #setWakeCounter()). + \li The linear or angular velocity of any link is non-zero. + \li A non-zero force or torque has been applied to the articulation or any of its links. + + If an articulation is sleeping, the following state is guaranteed: + + \li The wake counter is zero. + \li The linear and angular velocity of all links is zero. + \li There is no force update pending. + + When an articulation gets inserted into a scene, it will be considered asleep if all the points above hold, else it will + be treated as awake. + + If an articulation is asleep after the call to #PxScene::fetchResults() returns, it is guaranteed that the poses of the + links were not changed. You can use this information to avoid updating the transforms of associated objects. + + \return True if the articulation is sleeping. + + \note This call may only be made on articulations that are in a scene, and may not be made during simulation, + except in a split simulation in-between #PxScene::fetchCollision and #PxScene::advance. + + @see wakeUp() putToSleep() getSleepThreshold() + */ + virtual bool isSleeping() const = 0; + + /** + \brief Sets the mass-normalized energy threshold below which the articulation may go to sleep. + + The articulation will sleep if the energy of each link is below this threshold. + + \param[in] threshold Energy below which the articulation may go to sleep. Range: [0, PX_MAX_F32) + + \note This call may not be made during simulation. + + @see isSleeping() getSleepThreshold() wakeUp() putToSleep() + */ + virtual void setSleepThreshold(PxReal threshold) = 0; + + /** + \brief Returns the mass-normalized energy below which the articulation may go to sleep. + + \return The energy threshold for sleeping. + + @see isSleeping() wakeUp() putToSleep() setSleepThreshold() + */ + virtual PxReal getSleepThreshold() const = 0; + + /** + \brief Sets the mass-normalized kinetic energy threshold below which the articulation may participate in stabilization. + + Articulations whose kinetic energy divided by their mass is above this threshold will not participate in stabilization. + + This value has no effect if PxSceneFlag::eENABLE_STABILIZATION was not enabled on the PxSceneDesc. + + Default: 0.01 * PxTolerancesScale::speed * PxTolerancesScale::speed + + \param[in] threshold Energy below which the articulation may participate in stabilization. Range: [0,inf) + + \note This call may not be made during simulation. + + @see getStabilizationThreshold() PxSceneFlag::eENABLE_STABILIZATION + */ + virtual void setStabilizationThreshold(PxReal threshold) = 0; + + /** + \brief Returns the mass-normalized kinetic energy below which the articulation may participate in stabilization. + + Articulations whose kinetic energy divided by their mass is above this threshold will not participate in stabilization. + + \return The energy threshold for participating in stabilization. + + @see setStabilizationThreshold() PxSceneFlag::eENABLE_STABILIZATION + */ + virtual PxReal getStabilizationThreshold() const = 0; + + /** + \brief Sets the wake counter for the articulation in seconds. + + - The wake counter value determines the minimum amount of time until the articulation can be put to sleep. + - An articulation will not be put to sleep if the energy is above the specified threshold (see #setSleepThreshold()) + or if other awake objects are touching it. + - Passing in a positive value will wake up the articulation automatically. + + Default: 0.4s (which corresponds to 20 frames for a time step of 0.02s) + + \param[in] wakeCounterValue Wake counter value in seconds. Range: [0, PX_MAX_F32) + + \note This call may not be made during simulation, except in a split simulation in-between #PxScene::fetchCollision and #PxScene::advance. + + @see isSleeping() getWakeCounter() + */ + virtual void setWakeCounter(PxReal wakeCounterValue) = 0; + + /** + \brief Returns the wake counter of the articulation in seconds. + + \return The wake counter of the articulation in seconds. + + \note This call may not be made during simulation, except in a split simulation in-between #PxScene::fetchCollision and #PxScene::advance. + + @see isSleeping() setWakeCounter() + */ + virtual PxReal getWakeCounter() const = 0; + + /** + \brief Wakes up the articulation if it is sleeping. + + - The articulation will get woken up and might cause other touching objects to wake up as well during the next simulation step. + - This will set the wake counter of the articulation to the value specified in #PxSceneDesc::wakeCounterResetValue. + + \note This call may only be made on articulations that are in a scene, and may not be made during simulation, + except in a split simulation in-between #PxScene::fetchCollision and #PxScene::advance. + + @see isSleeping() putToSleep() + */ + virtual void wakeUp() = 0; + + /** + \brief Forces the articulation to sleep. + + - The articulation will stay asleep during the next simulation step if not touched by another non-sleeping actor. + - This will set any applied force, the velocity, and the wake counter of all bodies in the articulation to zero. + + \note This call may not be made during simulation, and may only be made on articulations that are in a scene. + + @see isSleeping() wakeUp() + */ + virtual void putToSleep() = 0; + + /** + \brief Sets the limit on the magnitude of the linear velocity of the articulation's center of mass. + + - The limit acts on the linear velocity of the entire articulation. The velocity is calculated from the total momentum + and the spatial inertia of the articulation. + - The limit only applies to floating-base articulations. + - A benefit of the COM velocity limit is that it is evenly applied to the whole articulation, which results in fewer visual + artifacts compared to link rigid-body damping or joint-velocity limits. However, these per-link or per-degree-of-freedom + limits may still help avoid numerical issues. + + \note This call may not be made during simulation. + + \param[in] maxLinearVelocity The maximal linear velocity magnitude. Range: [0, PX_MAX_F32); Default: PX_MAX_F32. + + @see setMaxCOMAngularVelocity, PxRigidBody::setLinearDamping, PxRigidBody::setAngularDamping, PxArticulationJointReducedCoordinate::setMaxJointVelocity + */ + virtual void setMaxCOMLinearVelocity(const PxReal maxLinearVelocity) = 0; + + /** + \brief Gets the limit on the magnitude of the linear velocity of the articulation's center of mass. + + \return The maximal linear velocity magnitude. + + @see setMaxCOMLinearVelocity + */ + virtual PxReal getMaxCOMLinearVelocity() const = 0; + + /** + \brief Sets the limit on the magnitude of the angular velocity at the articulation's center of mass. + + - The limit acts on the angular velocity of the entire articulation. The velocity is calculated from the total momentum + and the spatial inertia of the articulation. + - The limit only applies to floating-base articulations. + - A benefit of the COM velocity limit is that it is evenly applied to the whole articulation, which results in fewer visual + artifacts compared to link rigid-body damping or joint-velocity limits. However, these per-link or per-degree-of-freedom + limits may still help avoid numerical issues. + + \note This call may not be made during simulation. + + \param[in] maxAngularVelocity The maximal angular velocity magnitude. Range: [0, PX_MAX_F32); Default: PX_MAX_F32. + + @see setMaxCOMLinearVelocity, PxRigidBody::setLinearDamping, PxRigidBody::setAngularDamping, PxArticulationJointReducedCoordinate::setMaxJointVelocity + */ + virtual void setMaxCOMAngularVelocity(const PxReal maxAngularVelocity) = 0; + + /** + \brief Gets the limit on the magnitude of the angular velocity at the articulation's center of mass. + + \return The maximal angular velocity magnitude. + + @see setMaxCOMAngularVelocity + */ + virtual PxReal getMaxCOMAngularVelocity() const = 0; + + /** + \brief Adds a link to the articulation with default attribute values. + + \param[in] parent The parent link in the articulation. Must be NULL if (and only if) this is the root link. + \param[in] pose The initial pose of the new link. Must be a valid transform. + + \return The new link, or NULL if the link cannot be created. + + \note Creating a link is not allowed while the articulation is in a scene. In order to add a link, + remove and then re-add the articulation to the scene. + + @see PxArticulationLink + */ + virtual PxArticulationLink* createLink(PxArticulationLink* parent, const PxTransform& pose) = 0; + + /** + \brief Releases the articulation, and all its links and corresponding joints. + + Attached sensors and tendons are released automatically when the articulation is released. + + \note This call may not be made during simulation. + */ + virtual void release() = 0; + + /** + \brief Returns the number of links in the articulation. + + \return The number of links. + */ + virtual PxU32 getNbLinks() const = 0; + + /** + \brief Returns the set of links in the articulation in the order that they were added to the articulation using createLink. + + \param[in] userBuffer Buffer into which to write the array of articulation link pointers. + \param[in] bufferSize The size of the buffer. If the buffer is not large enough to contain all the pointers to links, + only as many as will fit are written. + \param[in] startIndex Index of first link pointer to be retrieved. + + \return The number of links written into the buffer. + + @see PxArticulationLink + */ + virtual PxU32 getLinks(PxArticulationLink** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + + /** + \brief Returns the number of shapes in the articulation. + + \return The number of shapes. + */ + virtual PxU32 getNbShapes() const = 0; + + /** + \brief Sets a name string for the articulation that can be retrieved with getName(). + + This is for debugging and is not used by the SDK. The string is not copied by the SDK, + only the pointer is stored. + + \param[in] name String to set the articulation's name to. + + @see getName() + */ + virtual void setName(const char* name) = 0; + + /** + \brief Returns the name string set with setName(). + + \return Name string associated with the articulation. + + @see setName() + */ + virtual const char* getName() const = 0; + + /** + \brief Returns the axis-aligned bounding box enclosing the articulation. + + \param[in] inflation Scale factor for computed world bounds. Box extents are multiplied by this value. + + \return The articulation's bounding box. + + \note It is not allowed to use this method while the simulation is running, except in a split simulation + during #PxScene::collide() and up to #PxScene::advance(), and in PxContactModifyCallback or in contact report callbacks. + + @see PxBounds3 + */ + virtual PxBounds3 getWorldBounds(float inflation = 1.01f) const = 0; + + /** + \brief Returns the aggregate the articulation might be a part of. + + \return The aggregate the articulation is a part of, or NULL if the articulation does not belong to an aggregate. + + @see PxAggregate + */ + virtual PxAggregate* getAggregate() const = 0; + + /** + \brief Sets flags on the articulation. + + \param[in] flags The articulation flags. + + \note This call may not be made during simulation. + + @see PxArticulationFlag */ virtual void setArticulationFlags(PxArticulationFlags flags) = 0; /** - \brief Raises or clears a flag on the articulation + \brief Raises or clears a flag on the articulation. - \param[in] flag The articulation flag - \param[in] value true/false indicating whether to raise or clear the flag + \param[in] flag The articulation flag. + \param[in] value The value to set the flag to. + \note This call may not be made during simulation. + + @see PxArticulationFlag */ virtual void setArticulationFlag(PxArticulationFlag::Enum flag, bool value) = 0; /** - \brief return PxArticulationFlags + \brief Returns the articulation's flags. + + \return The flags. + + @see PxArticulationFlag */ virtual PxArticulationFlags getArticulationFlags() const = 0; /** - \brief returns the total Dofs of the articulation + \brief Returns the total number of joint degrees-of-freedom (DOFs) of the articulation. + + - The six DOFs of the base of a floating-base articulation are not included in this count. + - Example: Both a fixed-base and a floating-base double-pendulum with two revolute joints will have getDofs() == 2. + - The return value is only valid for articulations that are in a scene. + + \return The number of joint DOFs, or 0xFFFFFFFF if the articulation is not in a scene. + */ virtual PxU32 getDofs() const = 0; /** - \brief create an articulation cache + \brief Creates an articulation cache that can be used to read and write internal articulation data. - \note this call may only be made on articulations that are in a scene, and may not be made during simulation + - When the structure of the articulation changes (e.g. adding a link or sensor) after the cache was created, + the cache needs to be released and recreated. + - Free the memory allocated for the cache by calling the release() method on the cache. + - Caches can only be created by articulations that are in a scene. + + \return The cache, or NULL if the articulation is not in a scene. + + @see applyCache, copyInternalStateToCache */ virtual PxArticulationCache* createCache() const = 0; /** - \brief Get the size of the articulation cache + \brief Returns the size of the articulation cache in bytes. - \note this call may only be made on articulations that are in a scene, and may not be made during simulation + - The size does not include: the user-allocated memory for the coefficient matrix or lambda values; + the scratch-related memory/members; and the cache version. See comment in #PxArticulationCache. + - The return value is only valid for articulations that are in a scene. + + \return The byte size of the cache, or 0xFFFFFFFF if the articulation is not in a scene. + + @see PxArticulationCache */ virtual PxU32 getCacheDataSize() const = 0; /** - \brief zero all data in the articulation cache beside the cache version + \brief Zeroes all data in the articulation cache, except user-provided and scratch memory, and cache version. - \note this call may only be made on articulations that are in a scene, and may not be made during simulation + \note This call may only be made on articulations that are in a scene. + + @see PxArticulationCache */ - virtual void zeroCache(PxArticulationCache& cache) = 0; + virtual void zeroCache(PxArticulationCache& cache) const = 0; /** - \brief apply the user defined data in the cache to the articulation system + \brief Applies the data in the cache to the articulation. - \param[in] cache articulation data. - \param[in] flag The mode to use when determine which value in the cache will be applied to the articulation - \param[in] autowake Specify if the call should wake up the articulation if it is currently asleep. If true and the current wake counter value is smaller than #PxSceneDesc::wakeCounterResetValue it will get increased to the reset value. + This call wakes the articulation if it is sleeping, and the autowake parameter is true (default) or: + - a nonzero joint velocity is applied or + - a nonzero joint force is applied or + - a nonzero root velocity is applied - @see createCache copyInternalStateToCache + \param[in] cache The articulation data. + \param[in] flags Indicate which data in the cache to apply to the articulation. + \param[in] autowake If true, the call wakes up the articulation and increases the wake counter to #PxSceneDesc::wakeCounterResetValue + if the counter value is below the reset value. + + \note This call may only be made on articulations that are in a scene, and may not be made during simulation. + + @see PxArticulationCache, PxArticulationCacheFlags, createCache, copyInternalStateToCache, PxScene::applyArticulationData */ - virtual void applyCache(PxArticulationCache& cache, const PxArticulationCacheFlags flag, bool autowake = true) = 0; + virtual void applyCache(PxArticulationCache& cache, const PxArticulationCacheFlags flags, bool autowake = true) = 0; /** - \brief copy the internal data of the articulation to the cache + \brief Copies internal data of the articulation to the cache. - \param[in] cache articulation data - \param[in] flag this indicates what kind of data the articulation system need to copy to the cache + \param[in] cache The articulation data. + \param[in] flags Indicate which data to copy from the articulation to the cache. - @see createCache applyCache + \note This call may only be made on articulations that are in a scene, and may not be made during simulation. + + @see PxArticulationCache, PxArticulationCacheFlags, createCache, applyCache */ - virtual void copyInternalStateToCache(PxArticulationCache& cache, const PxArticulationCacheFlags flag) const = 0; + virtual void copyInternalStateToCache(PxArticulationCache& cache, const PxArticulationCacheFlags flags) const = 0; + /** - \brief release an articulation cache + \brief Converts maximal-coordinate joint DOF data to reduced coordinates. - \param[in] cache the cache to release + - Indexing into the maximal joint DOF data is via the link's low-level index minus 1 (the root link is not included). + - The reduced-coordinate data follows the cache indexing convention, see PxArticulationCache::jointVelocity. - @see createCache applyCache copyInternalStateToCache - */ - virtual void releaseCache(PxArticulationCache& cache) const = 0; + \param[in] maximum The maximal-coordinate joint DOF data, N = (getNbLinks() - 1) * 6 + \param[out] reduced The reduced-coordinate joint DOF data, N = getDofs() - /** - \brief reduce the maximum data format to the reduced internal data - \param[in] maximum joint data format - \param[out] reduced joint data format + \note The articulation must be in a scene. + + @see unpackJointData */ virtual void packJointData(const PxReal* maximum, PxReal* reduced) const = 0; /** - \brief turn the reduced internal data to maximum joint data format - \param[in] reduced joint data format - \param[out] maximum joint data format + \brief Converts reduced-coordinate joint DOF data to maximal coordinates. + + - Indexing into the maximal joint DOF data is via the link's low-level index minus 1 (the root link is not included). + - The reduced-coordinate data follows the cache indexing convention, see PxArticulationCache::jointVelocity. + + \param[in] reduced The reduced-coordinate joint DOF data, N = getDofs(). + \param[out] maximum The maximal-coordinate joint DOF data, N = (getNbLinks() - 1) * 6. + + \note The articulation must be in a scene. + + @see packJointData */ virtual void unpackJointData(const PxReal* reduced, PxReal* maximum) const = 0; /** - \brief initialize all the common data for inverse dynamics + \brief Prepares common articulation data based on articulation pose for inverse dynamics calculations. + + Usage: + -# Set articulation pose (joint positions and base transform) via articulation cache and applyCache(). + -# Call commonInit. + -# Call inverse dynamics computation method. + + \note This call may only be made on articulations that are in a scene, and may not be made during simulation. + + @see computeGeneralizedGravityForce, computeCoriolisAndCentrifugalForce */ virtual void commonInit() const = 0; /** - \brief determine the statically balance of the joint force of gravity for entire articulation. External force, joint velocity and joint acceleration - are set to zero, the joint force returned will be purely determined by gravity. + \brief Computes the joint DOF forces required to counteract gravitational forces for the given articulation pose. + + - Inputs: Articulation pose (joint positions + base transform). + - Outputs: Joint forces to counteract gravity (in cache). + + - The joint forces returned are determined purely by gravity for the articulation in the current joint and base pose, and joints at rest; + i.e. external forces, joint velocities, and joint accelerations are set to zero. Joint drives are also not considered in the computation. + - commonInit() must be called before the computation, and after setting the articulation pose via applyCache(). + + \param[out] cache Out: PxArticulationCache::jointForce. + + \note This call may only be made on articulations that are in a scene, and may not be made during simulation. - \param[out] cache return joint forces which can counteract gravity force - @see commonInit */ virtual void computeGeneralizedGravityForce(PxArticulationCache& cache) const = 0; /** - \brief determine coriolise and centrifugal force. External force, gravity and joint acceleration - are set to zero, the joint force return will be coriolise and centrifugal force for each joint. + \brief Computes the joint DOF forces required to counteract Coriolis and centrifugal forces for the given articulation state. + + - Inputs: Articulation state (joint positions and velocities (in cache), and base transform and spatial velocity). + - Outputs: Joint forces to counteract Coriolis and centrifugal forces (in cache). + + - The joint forces returned are determined purely by the articulation's state; i.e. external forces, gravity, and joint accelerations are set to zero. + Joint drives and potential damping terms, such as link angular or linear damping, or joint friction, are also not considered in the computation. + - Prior to the computation, update/set the base spatial velocity with PxArticulationCache::rootLinkData and applyCache(). + - commonInit() must be called before the computation, and after setting the articulation pose via applyCache(). + + \param[in,out] cache In: PxArticulationCache::jointVelocity; Out: PxArticulationCache::jointForce. + + \note This call may only be made on articulations that are in a scene, and may not be made during simulation. - \param[in] cache data - @see commonInit */ virtual void computeCoriolisAndCentrifugalForce(PxArticulationCache& cache) const = 0; /** - \brief determine joint force change caused by external force. Gravity, joint acceleration and joint velocity - are all set to zero. + \brief Computes the joint DOF forces required to counteract external spatial forces applied to articulation links. - \param[in] cache data + - Inputs: External forces on links (in cache), articulation pose (joint positions + base transform). + - Outputs: Joint forces to counteract the external forces (in cache). + + - Only the external spatial forces provided in the cache and the articulation pose are considered in the computation. + - The external spatial forces are with respect to the links' centers of mass, and not the actor's origin. + - commonInit() must be called before the computation, and after setting the articulation pose via applyCache(). + + \param[in,out] cache In: PxArticulationCache::externalForces; Out: PxArticulationCache::jointForce. + + \note This call may only be made on articulations that are in a scene, and may not be made during simulation. @see commonInit */ virtual void computeGeneralizedExternalForce(PxArticulationCache& cache) const = 0; /** - \brief determine the joint acceleration for each joint - This is purely calculates the change in joint acceleration due to change in the joint force + \brief Computes the joint accelerations for the given articulation state and joint forces. + + - Inputs: Joint forces (in cache) and articulation state (joint positions and velocities (in cache), and base transform and spatial velocity). + - Outputs: Joint accelerations (in cache). + + - The computation includes Coriolis terms and gravity. However, joint drives and potential damping terms are not considered in the computation + (for example, linear link damping or joint friction). + - Prior to the computation, update/set the base spatial velocity with PxArticulationCache::rootLinkData and applyCache(). + - commonInit() must be called before the computation, and after setting the articulation pose via applyCache(). + + \param[in,out] cache In: PxArticulationCache::jointForce and PxArticulationCache::jointVelocity; Out: PxArticulationCache::jointAcceleration. + + \note This call may only be made on articulations that are in a scene, and may not be made during simulation. - \param[in] cache articulation data - @see commonInit */ virtual void computeJointAcceleration(PxArticulationCache& cache) const = 0; /** - \brief determine the joint force - This is purely calculates the change in joint force due to change in the joint acceleration - This means gravity and joint velocity will be zero + \brief Computes the joint forces for the given articulation state and joint accelerations, not considering gravity. + + - Inputs: Joint accelerations (in cache) and articulation state (joint positions and velocities (in cache), and base transform and spatial velocity). + - Outputs: Joint forces (in cache). + + - The computation includes Coriolis terms. However, joint drives and potential damping terms are not considered in the computation + (for example, linear link damping or joint friction). + - Prior to the computation, update/set the base spatial velocity with PxArticulationCache::rootLinkData and applyCache(). + - commonInit() must be called before the computation, and after setting the articulation pose via applyCache(). + + \param[in,out] cache In: PxArticulationCache::jointAcceleration and PxArticulationCache::jointVelocity; Out: PxArticulationCache::jointForce. + + \note This call may only be made on articulations that are in a scene, and may not be made during simulation. - \param[in] cache return joint force - @see commonInit */ virtual void computeJointForce(PxArticulationCache& cache) const = 0; /** - \brief compute the dense Jacobian for the entire articulation in world space - \param[out] cache sets cache.denseJacobian matrix. The matrix is indexed [nCols * row + column]. - \param[out] nRows set to number of rows in matrix, which corresponds to the number of articulation links times 6. - \param[out] nCols set to number of columns in matrix, which corresponds to the number of joint DOFs, plus 6 in the case eFIX_BASE is false. + \brief Compute the dense Jacobian for the articulation in world space, including the DOFs of a potentially floating base. - Note that this computes the dense representation of an inherently sparse matrix. Multiplication with this matrix maps - joint space velocities to 6DOF world space linear and angular velocities. + This computes the dense representation of an inherently sparse matrix. Multiplication with this matrix maps + joint space velocities to world-space linear and angular (i.e. spatial) velocities of the centers of mass of the links. + + \param[out] cache Sets cache.denseJacobian matrix. The matrix is indexed [nCols * row + column]. + \param[out] nRows Set to number of rows in matrix, which corresponds to nbLinks() * 6, minus 6 if PxArticulationFlag::eFIX_BASE is true. + \param[out] nCols Set to number of columns in matrix, which corresponds to the number of joint DOFs, plus 6 in the case PxArticulationFlag::eFIX_BASE is false. + + \note This call may only be made on articulations that are in a scene, and may not be made during simulation. */ virtual void computeDenseJacobian(PxArticulationCache& cache, PxU32& nRows, PxU32& nCols) const = 0; - /** - \brief compute the coefficient matrix for contact force. - \param[out] cache returns the coefficient matrix. Each column is the joint force effected by a contact based on impulse strength 1 - @see commonInit + \brief Computes the coefficient matrix for contact forces. + + - The matrix dimension is getCoefficientMatrixSize() = getDofs() * getNbLoopJoints(), and the DOF (column) indexing follows the internal DOF order, see PxArticulationCache::jointVelocity. + - Each column in the matrix is the joint forces effected by a contact based on impulse strength 1. + - The user must allocate memory for PxArticulationCache::coefficientMatrix where the required size of the PxReal array is equal to getCoefficientMatrixSize(). + - commonInit() must be called before the computation, and after setting the articulation pose via applyCache(). + + \param[out] cache Out: PxArticulationCache::coefficientMatrix. + + \note This call may only be made on articulations that are in a scene, and may not be made during simulation. + + @see commonInit, getCoefficientMatrixSize */ virtual void computeCoefficientMatrix(PxArticulationCache& cache) const = 0; - + /** - \brief compute the lambda value when the test impulse is 1 - \param[in] initialState the initial state of the articulation system - \param[in] jointTorque M(q)*qddot + C(q,qdot) + g(q) - \param[in] maxIter maximum number of solver iterations to run. If the system converges, fewer iterations may be used. - \param[out] cache returns the coefficient matrix. Each column is the joint force effected by a contact based on impulse strength 1 - @see commonInit + \brief Computes the lambda values when the test impulse is 1. + + - The user must allocate memory for PxArticulationCache::lambda where the required size of the PxReal array is equal to getNbLoopJoints(). + - commonInit() must be called before the computation, and after setting the articulation pose via applyCache(). + + \param[out] cache Out: PxArticulationCache::lambda. + \param[in] initialState The initial state of the articulation system. + \param[in] jointTorque M(q)*qddot + C(q,qdot) + g(q) <- calculate by summing joint forces obtained with computeJointForce and computeGeneralizedGravityForce. + \param[in] maxIter Maximum number of solver iterations to run. If the system converges, fewer iterations may be used. + + \return True if convergence was achieved within maxIter; False if convergence was not achieved or the operation failed otherwise. + + \note This call may only be made on articulations that are in a scene, and may not be made during simulation. + + @see commonInit, getNbLoopJoints */ virtual bool computeLambda(PxArticulationCache& cache, PxArticulationCache& initialState, const PxReal* const jointTorque, const PxU32 maxIter) const = 0; - + /** - \brief compute the joint-space inertia matrix - \param[in] cache articulation data + \brief Compute the joint-space inertia matrix that maps joint accelerations to joint forces: forces = M * accelerations. + + - Inputs: Articulation pose (joint positions and base transform). + - Outputs: Mass matrix (in cache). + + commonInit() must be called before the computation, and after setting the articulation pose via applyCache(). + + \param[out] cache Out: PxArticulationCache::massMatrix. + + \note This call may only be made on articulations that are in a scene, and may not be made during simulation. @see commonInit */ virtual void computeGeneralizedMassMatrix(PxArticulationCache& cache) const = 0; - - /** - \brief add loop joint to the articulation system for inverse dynamic - \param[in] joint required to add loop joint - @see commonInit + /** + \brief Adds a loop joint to the articulation system for inverse dynamics. + + \param[in] joint The joint to add. + + \note This call may not be made during simulation. + + @see PxContactJoint, PxFixedJoint, PxSphericalJoint, PxRevoluteJoint, PxPrismaticJoint, PxDistanceJoint, PxD6Joint */ - virtual void addLoopJoint(PxJoint* joint) = 0; + virtual void addLoopJoint(PxConstraint* joint) = 0; /** - \brief remove loop joint from the articulation system - \param[in] joint required to remove loop joint + \brief Removes a loop joint from the articulation for inverse dynamics. - @see commonInit + \note This call may not be made during simulation. + + \param[in] joint The joint to remove. */ - virtual void removeLoopJoint(PxJoint* joint) = 0; + virtual void removeLoopJoint(PxConstraint* joint) = 0; /** - \brief returns the number of loop joints in the articulation - \return number of loop joints + \brief Returns the number of loop joints in the articulation for inverse dynamics. + + \return The number of loop joints. */ virtual PxU32 getNbLoopJoints() const = 0; /** - \brief returns the set of loop constraints in the articulation + \brief Returns the set of loop constraints (i.e. joints) in the articulation. - \param[in] userBuffer buffer into which to write an array of constraints pointers - \param[in] bufferSize the size of the buffer. If this is not large enough to contain all the pointers to links, - only as many as will fit are written. - \param[in] startIndex Index of first link pointer to be retrieved + \param[in] userBuffer Target buffer for the constraint pointers. + \param[in] bufferSize The size of the buffer. If this is not large enough to contain all the pointers to the constraints, + only as many as will fit are written. Use getNbLoopJoints() to size the buffer for retrieving all constraints. + \param[in] startIndex Index of first constraint pointer to be retrieved. - \return the number of links written into the buffer. - - @see ArticulationLink + \return The number of constraints written into the buffer. */ - virtual PxU32 getLoopJoints(PxJoint** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + virtual PxU32 getLoopJoints(PxConstraint** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; /** - \brief returns the required size of coeffient matrix in the articulation. The coefficient matrix is number of constraint(loop joints) by total dofs. Constraint Torque = transpose(K) * lambda(). Lambda is a vector of number of constraints - \return bite size of the coefficient matrix(nc * n) + \brief Returns the required size of the coefficient matrix in the articulation. + + \return Size of the coefficient matrix (equal to getDofs() * getNbLoopJoints()). + + \note This call may only be made on articulations that are in a scene. + + @see computeCoefficientMatrix */ virtual PxU32 getCoefficientMatrixSize() const = 0; /** - \brief teleport root link to a new location - \param[in] pose the new location of the root link - \param[in] autowake wake up the articulation system - - @see commonInit - */ - virtual void teleportRootLink(const PxTransform& pose, bool autowake) = 0; + \brief Sets the root link transform (world to actor frame). + - For performance, prefer PxArticulationCache::rootLinkData to set the root link transform in a batch articulation state update. + - Use updateKinematic() after all state updates to the articulation via non-cache API such as this method, + in order to update link states for the next simulation frame or querying. + + \param[in] pose The new root link transform. + \param[in] autowake If true and the articulation is in a scene, the call wakes up the articulation and increases the wake counter + to #PxSceneDesc::wakeCounterResetValue if the counter value is below the reset value. + + \note This call may not be made during simulation. + + @see getRootGlobalPose, updateKinematic, PxArticulationCache, applyCache + */ + virtual void setRootGlobalPose(const PxTransform& pose, bool autowake = true) = 0; /** - \brief return the link velocity in world space with the associated low-level link index(getLinkIndex()). - \param[in] linkId low-level link index + \brief Returns the root link transform (world to actor frame). - @see getLinkIndex() in PxArticulationLink + For performance, prefer PxArticulationCache::rootLinkData to get the root link transform in a batch query. + + \return The root link transform. + + \note This call is not allowed while the simulation is running except in a split simulation during #PxScene::collide() and up to #PxScene::advance(), + and in PxContactModifyCallback or in contact report callbacks. + + @see setRootGlobalPose, PxArticulationCache, copyInternalStateToCache */ - virtual PxSpatialVelocity getLinkVelocity(const PxU32 linkId) = 0; - + virtual PxTransform getRootGlobalPose() const = 0; /** - \brief return the link acceleration in world space with the associated low-level link index(getLinkIndex()) - \param[in] linkId low-level link index + \brief Sets the root link linear center-of-mass velocity. - @see getLinkIndex() in PxArticulationLink + - The linear velocity is with respect to the link's center of mass and not the actor frame origin. + - For performance, prefer PxArticulationCache::rootLinkData to set the root link velocity in a batch articulation state update. + - The articulation is woken up if the input velocity is nonzero (ignoring autowake) and the articulation is in a scene. + - Use updateKinematic() after all state updates to the articulation via non-cache API such as this method, + in order to update link states for the next simulation frame or querying. + + \param[in] linearVelocity The new root link center-of-mass linear velocity. + \param[in] autowake If true and the articulation is in a scene, the call wakes up the articulation and increases the wake counter + to #PxSceneDesc::wakeCounterResetValue if the counter value is below the reset value. + + \note This call may not be made during simulation, except in a split simulation in-between #PxScene::fetchCollision and #PxScene::advance. + + @see updateKinematic, getRootLinearVelocity, setRootAngularVelocity, getRootAngularVelocity, PxRigidBody::getCMassLocalPose, PxArticulationCache, applyCache + */ + virtual void setRootLinearVelocity(const PxVec3& linearVelocity, bool autowake = true) = 0; + + /** + \brief Gets the root link center-of-mass linear velocity. + + - The linear velocity is with respect to the link's center of mass and not the actor frame origin. + - For performance, prefer PxArticulationCache::rootLinkData to get the root link velocity in a batch query. + + \return The root link center-of-mass linear velocity. + + \note This call is not allowed while the simulation is running except in a split simulation during #PxScene::collide() and up to #PxScene::advance(), + and in PxContactModifyCallback or in contact report callbacks. + + @see setRootLinearVelocity, setRootAngularVelocity, getRootAngularVelocity, PxRigidBody::getCMassLocalPose, PxArticulationCache, applyCache + */ + virtual PxVec3 getRootLinearVelocity(void) const = 0; + + /** + \brief Sets the root link angular velocity. + + - For performance, prefer PxArticulationCache::rootLinkData to set the root link velocity in a batch articulation state update. + - The articulation is woken up if the input velocity is nonzero (ignoring autowake) and the articulation is in a scene. + - Use updateKinematic() after all state updates to the articulation via non-cache API such as this method, + in order to update link states for the next simulation frame or querying. + + \param[in] angularVelocity The new root link angular velocity. + \param[in] autowake If true and the articulation is in a scene, the call wakes up the articulation and increases the wake counter + to #PxSceneDesc::wakeCounterResetValue if the counter value is below the reset value. + + \note This call may not be made during simulation, except in a split simulation in-between #PxScene::fetchCollision and #PxScene::advance. + + @see updateKinematic, getRootAngularVelocity, setRootLinearVelocity, getRootLinearVelocity, PxArticulationCache, applyCache + */ + virtual void setRootAngularVelocity(const PxVec3& angularVelocity, bool autowake = true) = 0; + + /** + \brief Gets the root link angular velocity. + + For performance, prefer PxArticulationCache::rootLinkData to get the root link velocity in a batch query. + + \return The root link angular velocity. + + \note This call is not allowed while the simulation is running except in a split simulation during #PxScene::collide() and up to #PxScene::advance(), + and in PxContactModifyCallback or in contact report callbacks. + + @see setRootAngularVelocity, setRootLinearVelocity, getRootLinearVelocity, PxArticulationCache, applyCache + */ + virtual PxVec3 getRootAngularVelocity(void) const = 0; + + /** + \brief Returns the (classical) link acceleration in world space for the given low-level link index. + + - The returned acceleration is not a spatial, but a classical, i.e. body-fixed acceleration (https://en.wikipedia.org/wiki/Spatial_acceleration). + - The (linear) acceleration is with respect to the link's center of mass and not the actor frame origin. + + \param[in] linkId The low-level link index, see PxArticulationLink::getLinkIndex. + + \return The link's center-of-mass classical acceleration, or 0 if the call is made before the articulation participated in a first simulation step. + + \note This call may only be made on articulations that are in a scene, and it is not allowed to use this method while the simulation + is running except in a split simulation during #PxScene::collide() and up to #PxScene::advance(), and in PxContactModifyCallback or in contact report callbacks. + + @see PxArticulationLink::getLinkIndex, PxRigidBody::getCMassLocalPose */ virtual PxSpatialVelocity getLinkAcceleration(const PxU32 linkId) = 0; - protected: - PX_INLINE PxArticulationReducedCoordinate(PxType concreteType, PxBaseFlags baseFlags) : PxArticulationBase(concreteType, baseFlags) {} - PX_INLINE PxArticulationReducedCoordinate(PxBaseFlags baseFlags) : PxArticulationBase(baseFlags) {} + /** + \brief Returns the GPU articulation index. + + \return The GPU index, or 0xFFFFFFFF if the articulation is not in a scene or PxSceneFlag::eSUPPRESS_READBACK is not set. + */ + virtual PxU32 getGpuArticulationIndex() = 0; + + /** + \brief Creates a spatial tendon to attach to the articulation with default attribute values. + + \return The new spatial tendon. + + \note Creating a spatial tendon is not allowed while the articulation is in a scene. In order to + add the tendon, remove and then re-add the articulation to the scene. + + @see PxArticulationSpatialTendon + */ + virtual PxArticulationSpatialTendon* createSpatialTendon() = 0; + + /** + \brief Creates a fixed tendon to attach to the articulation with default attribute values. + + \return The new fixed tendon. + + \note Creating a fixed tendon is not allowed while the articulation is in a scene. In order to + add the tendon, remove and then re-add the articulation to the scene. + + @see PxArticulationFixedTendon + */ + virtual PxArticulationFixedTendon* createFixedTendon() = 0; + + /** + \brief Creates a force sensor attached to a link of the articulation. + + \param[in] link The link to attach the sensor to. + \param[in] relativePose The sensor frame's relative pose to the link's body frame, i.e. the transform body frame -> sensor frame. + The link body frame is at the center of mass and aligned with the principal axes of inertia, see PxRigidBody::getCMassLocalPose. + + \return The new sensor. + + \note Creating a sensor is not allowed while the articulation is in a scene. In order to + add the sensor, remove and then re-add the articulation to the scene. + + @see PxArticulationSensor + */ + virtual PxArticulationSensor* createSensor(PxArticulationLink* link, const PxTransform& relativePose) = 0; + + + /** + \brief Returns the spatial tendons attached to the articulation. + + The order of the tendons in the buffer is not necessarily identical to the order in which the tendons were added to the articulation. + + \param[in] userBuffer The buffer into which to write the array of pointers to the tendons. + \param[in] bufferSize The size of the buffer. If this is not large enough to contain all the pointers to tendons, + only as many as will fit are written. Use getNbSpatialTendons to size for all attached tendons. + \param[in] startIndex Index of first tendon pointer to be retrieved. + + \return The number of tendons written into the buffer. + + @see PxArticulationSpatialTendon, getNbSpatialTendons + */ + virtual PxU32 getSpatialTendons(PxArticulationSpatialTendon** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + + /** + \brief Returns the number of spatial tendons in the articulation. + + \return The number of tendons. + */ + virtual PxU32 getNbSpatialTendons() = 0; + + /** + \brief Returns the fixed tendons attached to the articulation. + + The order of the tendons in the buffer is not necessarily identical to the order in which the tendons were added to the articulation. + + \param[in] userBuffer The buffer into which to write the array of pointers to the tendons. + \param[in] bufferSize The size of the buffer. If this is not large enough to contain all the pointers to tendons, + only as many as will fit are written. Use getNbFixedTendons to size for all attached tendons. + \param[in] startIndex Index of first tendon pointer to be retrieved. + + \return The number of tendons written into the buffer. + + @see PxArticulationFixedTendon, getNbFixedTendons + */ + virtual PxU32 getFixedTendons(PxArticulationFixedTendon** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + + /** + \brief Returns the number of fixed tendons in the articulation. + + \return The number of tendons. + */ + virtual PxU32 getNbFixedTendons() = 0; + + /** + \brief Returns the sensors attached to the articulation. + + The order of the sensors in the buffer is not necessarily identical to the order in which the sensors were added to the articulation. + + \param[in] userBuffer The buffer into which to write the array of pointers to the sensors. + \param[in] bufferSize The size of the buffer. If this is not large enough to contain all the pointers to sensors, + only as many as will fit are written. Use getNbSensors to size for all attached sensors. + \param[in] startIndex Index of first sensor pointer to be retrieved. + + \return The number of sensors written into the buffer. + + @see PxArticulationSensor, getNbSensors + */ + + virtual PxU32 getSensors(PxArticulationSensor** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + + /** + \brief Returns the number of sensors in the articulation. + + \return The number of sensors. + */ + virtual PxU32 getNbSensors() = 0; + + /** + \brief Update link velocities and/or positions in the articulation. + + For performance, prefer the PxArticulationCache API that performs batch articulation state updates. + + If the application updates the root state (position and velocity) or joint state via any combination of + the non-cache API calls + + - setRootGlobalPose(), setRootLinearVelocity(), setRootAngularVelocity() + - PxArticulationJointReducedCoordinate::setJointPosition(), PxArticulationJointReducedCoordinate::setJointVelocity() + + the application needs to call this method after the state setting in order to update the link states for + the next simulation frame or querying. + + Use + - PxArticulationKinematicFlag::ePOSITION after any changes to the articulation root or joint positions using non-cache API calls. Updates links' positions and velocities. + - PxArticulationKinematicFlag::eVELOCITY after velocity-only changes to the articulation root or joints using non-cache API calls. Updates links' velocities only. + + \note This call may only be made on articulations that are in a scene, and may not be made during simulation. + + @see PxArticulationKinematicFlags, PxArticulationCache, applyCache + */ + virtual void updateKinematic(PxArticulationKinematicFlags flags) = 0; + virtual ~PxArticulationReducedCoordinate() {} + + void* userData; //!< user can assign this to whatever, usually to create a 1:1 relationship with a user object. + + protected: + PX_INLINE PxArticulationReducedCoordinate(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags) {} + PX_INLINE PxArticulationReducedCoordinate(PxBaseFlags baseFlags) : PxBase(baseFlags) {} + }; #if PX_VC diff --git a/Source/ThirdParty/PhysX/PxArticulationTendon.h b/Source/ThirdParty/PhysX/PxArticulationTendon.h new file mode 100644 index 000000000..6f47d0f3c --- /dev/null +++ b/Source/ThirdParty/PhysX/PxArticulationTendon.h @@ -0,0 +1,589 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + + +#ifndef PX_ARTICULATION_TENDON_H +#define PX_ARTICULATION_TENDON_H +/** \addtogroup physics +@{ */ + +#include "PxPhysXConfig.h" +#include "common/PxBase.h" +#include "solver/PxSolverDefs.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + class PxArticulationSpatialTendon; + class PxArticulationFixedTendon; + class PxArticulationLink; + /** + \brief Defines the low/high limits of the length of a tendon. + */ + class PxArticulationTendonLimit + { + public: + PxReal lowLimit; + PxReal highLimit; + }; + + /** + \brief Defines a spatial tendon attachment point on a link. + */ + class PxArticulationAttachment : public PxBase + { + + public: + + virtual ~PxArticulationAttachment() {} + /** + \brief Sets the spring rest length for the sub-tendon from the root to this leaf attachment. + + Setting this on non-leaf attachments has no effect. + + \param[in] restLength The rest length of the spring. + Default: 0 + + @see getRestLength(), isLeaf() + */ + virtual void setRestLength(const PxReal restLength) = 0; + + /** + \brief Gets the spring rest length for the sub-tendon from the root to this leaf attachment. + + \return The rest length. + + @see setRestLength() + */ + virtual PxReal getRestLength() const = 0; + + /** + \brief Sets the low and high limit on the length of the sub-tendon from the root to this leaf attachment. + + Setting this on non-leaf attachments has no effect. + + \param[in] parameters Struct with the low and high limit. + Default: (PX_MAX_F32, -PX_MAX_F32) (i.e. an invalid configuration that can only work if stiffness is zero) + + @see PxArticulationTendonLimit, getLimitParameters(), isLeaf() + */ + virtual void setLimitParameters(const PxArticulationTendonLimit& parameters) = 0; + + /** + \brief Gets the low and high limit on the length of the sub-tendon from the root to this leaf attachment. + + \return Struct with the low and high limit. + + @see PxArticulationTendonLimit, setLimitParameters() + */ + virtual PxArticulationTendonLimit getLimitParameters() const = 0; + + /** + \brief Sets the attachment's relative offset in the link actor frame. + + \param[in] offset The relative offset in the link actor frame. + + @see getRelativeOffset() + */ + virtual void setRelativeOffset(const PxVec3& offset) = 0; + + /** + \brief Gets the attachment's relative offset in the link actor frame. + + \return The relative offset in the link actor frame. + + @see setRelativeOffset() + */ + virtual PxVec3 getRelativeOffset() const = 0; + + /** + \brief Sets the attachment coefficient. + + \param[in] coefficient The scale that the distance between this attachment and its parent is multiplied by when summing up the spatial tendon's length. + + @see getCoefficient() + */ + virtual void setCoefficient(const PxReal coefficient) = 0; + + /** + \brief Gets the attachment coefficient. + + \return The scale that the distance between this attachment and its parent is multiplied by when summing up the spatial tendon's length. + + @see setCoefficient() + */ + virtual PxReal getCoefficient() const = 0; + + /** + \brief Gets the articulation link. + + \return The articulation link that this attachment is attached to. + */ + virtual PxArticulationLink* getLink() const = 0; + + /** + \brief Gets the parent attachment. + + \return The parent attachment. + */ + virtual PxArticulationAttachment* getParent() const = 0; + + /** + \brief Indicates that this attachment is a leaf, and thus defines a sub-tendon from the root to this attachment. + + \return True: This attachment is a leaf and has zero children; False: Not a leaf. + */ + virtual bool isLeaf() const = 0; + + /** + \brief Gets the spatial tendon that the attachment is a part of. + + \return The tendon. + + @see PxArticulationSpatialTendon + */ + virtual PxArticulationSpatialTendon* getTendon() const = 0; + + /** + \brief Releases the attachment. + + \note Releasing the attachment is not allowed while the articulation is in a scene. In order to + release the attachment, remove and then re-add the articulation to the scene. + + @see PxArticulationSpatialTendon::createAttachment() + */ + virtual void release() = 0; + + void* userData; //!< user can assign this to whatever, usually to create a 1:1 relationship with a user object. + + /** + \brief Returns the string name of the dynamic type. + + \return The string name. + */ + virtual const char* getConcreteTypeName() const { return "PxArticulationAttachment"; } + + protected: + + PX_INLINE PxArticulationAttachment(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags) {} + PX_INLINE PxArticulationAttachment(PxBaseFlags baseFlags) : PxBase(baseFlags) {} + }; + + + /** + \brief Defines a fixed-tendon joint on an articulation joint degree of freedom. + */ + class PxArticulationTendonJoint : public PxBase + { + + public: + + virtual ~PxArticulationTendonJoint() {} + + /** + \brief Sets the tendon joint coefficient. + + \param[in] axis The degree of freedom that the tendon joint operates on (must correspond to a degree of freedom of the associated link's incoming joint). + \param[in] coefficient The scale that the axis' joint position is multiplied by when summing up the fixed tendon's length. + \param[in] recipCoefficient The scale that the tendon's response is multiplied by when applying to this tendon joint. + + \note RecipCoefficient is commonly expected to be 1/coefficient, but it can be set to different values to tune behavior; for example, zero can be used to + have a joint axis only participate in the length computation of the tendon, but not have any tendon force applied to it. + + @see getCoefficient() + */ + virtual void setCoefficient(const PxArticulationAxis::Enum axis, const PxReal coefficient, const PxReal recipCoefficient) = 0; + + /** + \brief Gets the tendon joint coefficient. + + \param[out] axis The degree of freedom that the tendon joint operates on. + \param[out] coefficient The scale that the axis' joint position is multiplied by when summing up the fixed tendon's length. + \param[in] recipCoefficient The scale that the tendon's response is multiplied by when applying to this tendon joint. + + @see setCoefficient() + */ + virtual void getCoefficient(PxArticulationAxis::Enum& axis, PxReal& coefficient, PxReal& recipCoefficient) const = 0; + + /** + \brief Gets the articulation link. + + \return The articulation link (and its incoming joint in particular) that this tendon joint is associated with. + */ + virtual PxArticulationLink* getLink() const = 0; + + /** + \brief Gets the parent tendon joint. + + \return The parent tendon joint. + */ + virtual PxArticulationTendonJoint* getParent() const = 0; + + /** + \brief Gets the tendon that the joint is a part of. + + \return The tendon. + + @see PxArticulationFixedTendon + */ + virtual PxArticulationFixedTendon* getTendon() const = 0; + + /** + \brief Releases a tendon joint. + + \note Releasing a tendon joint is not allowed while the articulation is in a scene. In order to + release the joint, remove and then re-add the articulation to the scene. + + @see PxArticulationFixedTendon::createTendonJoint() + */ + virtual void release() = 0; + + void* userData; //!< user can assign this to whatever, usually to create a 1:1 relationship with a user object. + + /** + \brief Returns the string name of the dynamic type. + + \return The string name. + */ + virtual const char* getConcreteTypeName() const { return "PxArticulationTendonJoint"; } + + protected: + + PX_INLINE PxArticulationTendonJoint(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags) {} + PX_INLINE PxArticulationTendonJoint(PxBaseFlags baseFlags) : PxBase(baseFlags) {} + }; + + + /** + \brief Common API base class shared by PxArticulationSpatialTendon and PxArticulationFixedTendon. + */ + class PxArticulationTendon : public PxBase + { + public: + /** + \brief Sets the spring stiffness term acting on the tendon length. + + \param[in] stiffness The spring stiffness. + Default: 0 + + @see getStiffness() + */ + virtual void setStiffness(const PxReal stiffness) = 0; + + /** + \brief Gets the spring stiffness of the tendon. + + \return The spring stiffness. + + @see setStiffness() + */ + virtual PxReal getStiffness() const = 0; + + /** + \brief Sets the damping term acting both on the tendon length and tendon-length limits. + + \param[in] damping The damping term. + Default: 0 + + @see getDamping() + */ + virtual void setDamping(const PxReal damping) = 0; + + /** + \brief Gets the damping term acting both on the tendon length and tendon-length limits. + + \return The damping term. + + @see setDamping() + */ + virtual PxReal getDamping() const = 0; + + /** + \brief Sets the limit stiffness term acting on the tendon's length limits. + + For spatial tendons, this parameter applies to all its leaf attachments / sub-tendons. + + \param[in] stiffness The limit stiffness term. + Default: 0 + + @see getLimitStiffness() + */ + virtual void setLimitStiffness(const PxReal stiffness) = 0; + + /** + \brief Gets the limit stiffness term acting on the tendon's length limits. + + For spatial tendons, this parameter applies to all its leaf attachments / sub-tendons. + + \return The limit stiffness term. + + @see setLimitStiffness() + */ + virtual PxReal getLimitStiffness() const = 0; + + /** + \brief Sets the length offset term for the tendon. + + An offset defines an amount to be added to the accumulated length computed for the tendon. It allows the + application to actuate the tendon by shortening or lengthening it. + + \param[in] offset The offset term. Default: 0 + \param[in] autowake If true and the articulation is in a scene, the call wakes up the articulation and increases the wake counter + to #PxSceneDesc::wakeCounterResetValue if the counter value is below the reset value. + + @see getOffset() + */ + virtual void setOffset(const PxReal offset, bool autowake = true) = 0; + + /** + \brief Gets the length offset term for the tendon. + + \return The offset term. + + @see setOffset() + */ + virtual PxReal getOffset() const = 0; + + /** + \brief Gets the articulation that the tendon is a part of. + + \return The articulation. + + @see PxArticulationReducedCoordinate + */ + virtual PxArticulationReducedCoordinate* getArticulation() const = 0; + + /** + \brief Releases a tendon to remove it from the articulation and free its associated memory. + + When an articulation is released, its attached tendons are automatically released. + + \note Releasing a tendon is not allowed while the articulation is in a scene. In order to + release the tendon, remove and then re-add the articulation to the scene. + */ + + virtual void release() = 0; + + virtual ~PxArticulationTendon() {} + + void* userData; //!< user can assign this to whatever, usually to create a 1:1 relationship with a user object. + + protected: + PX_INLINE PxArticulationTendon(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags) {} + PX_INLINE PxArticulationTendon(PxBaseFlags baseFlags) : PxBase(baseFlags) {} + }; + + /** + \brief A spatial tendon that attaches to an articulation. + + A spatial tendon attaches to multiple links in an articulation using a set of PxArticulationAttachments. + The tendon is defined as a tree of attachment points, where each attachment can have an arbitrary number of children. + Each leaf of the attachment tree defines a subtendon between itself and the root attachment. The subtendon then + applies forces at the leaf, and an equal but opposing force at the root, in order to satisfy the spring-damper and limit + constraints that the user sets up. Attachments in between the root and leaf do not exert any force on the articulation, + but define the geometry of the tendon from which the length is computed together with the attachment coefficients. + */ + class PxArticulationSpatialTendon : public PxArticulationTendon + { + public: + /** + \brief Creates an articulation attachment and adds it to the list of children in the parent attachment. + + Creating an attachment is not allowed while the articulation is in a scene. In order to + add the attachment, remove and then re-add the articulation to the scene. + + \param[in] parent The parent attachment. Can be NULL for the root attachment of a tendon. + \param[in] coefficient A user-defined scale that the accumulated length is scaled by. + \param[in] relativeOffset An offset vector in the link's actor frame to the point where the tendon attachment is attached to the link. + \param[in] link The link that this attachment is associated with. + + \return The newly-created attachment if creation was successful, otherwise a null pointer. + + @see releaseAttachment() + */ + virtual PxArticulationAttachment* createAttachment(PxArticulationAttachment* parent, const PxReal coefficient, const PxVec3 relativeOffset, PxArticulationLink* link) = 0; + + /** + \brief Fills a user-provided buffer of attachment pointers with the set of attachments. + + \param[in] userBuffer The user-provided buffer. + \param[in] bufferSize The size of the buffer. If this is not large enough to contain all the pointers to attachments, + only as many as can fit are written. Use getNbAttachments to size for all attachments. + \param[in] startIndex Index of first attachment pointer to be retrieved. + + \return The number of attachments that were filled into the user buffer. + + @see getNbAttachments + */ + virtual PxU32 getAttachments(PxArticulationAttachment** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + + /** + \brief Returns the number of attachments in the tendon. + + \return The number of attachments. + */ + virtual PxU32 getNbAttachments() const = 0; + + /** + \brief Returns the string name of the dynamic type. + + \return The string name. + */ + virtual const char* getConcreteTypeName() const { return "PxArticulationSpatialTendon"; } + + virtual ~PxArticulationSpatialTendon() {} + + protected: + PX_INLINE PxArticulationSpatialTendon(PxType concreteType, PxBaseFlags baseFlags) : PxArticulationTendon(concreteType, baseFlags) {} + PX_INLINE PxArticulationSpatialTendon(PxBaseFlags baseFlags) : PxArticulationTendon(baseFlags) {} + + }; + + /** + \brief A fixed tendon that can be used to link multiple degrees of freedom of multiple articulation joints via length and limit constraints. + + Fixed tendons allow the simulation of coupled relationships between joint degrees of freedom in an articulation. Fixed tendons do not allow + linking arbitrary joint axes of the articulation: The respective joints must all be directly connected to each other in the articulation structure, + i.e. each of the joints in the tendon must be connected by a single articulation link to another joint in the same tendon. This implies both that + 1) fixed tendons can branch along a branching articulation; and 2) they cannot be used to create relationships between axes in a spherical joint with + more than one degree of freedom. Locked joint axes or fixed joints are currently not supported. + */ + class PxArticulationFixedTendon : public PxArticulationTendon + { + public: + /** + \brief Creates an articulation tendon joint and adds it to the list of children in the parent tendon joint. + + Creating a tendon joint is not allowed while the articulation is in a scene. In order to + add the joint, remove and then re-add the articulation to the scene. + + \param[in] parent The parent tendon joint. Can be NULL for the root tendon joint of a tendon. + \param[in] axis The degree of freedom that this tendon joint is associated with. + \param[in] coefficient A user-defined scale that the accumulated tendon length is scaled by. + \param[in] recipCoefficient The scale that the tendon's response is multiplied by when applying to this tendon joint. + \param[in] link The link (and the link's incoming joint in particular) that this tendon joint is associated with. + + \return The newly-created tendon joint if creation was successful, otherwise a null pointer. + + \note + - The axis motion must not be configured as PxArticulationMotion::eLOCKED. + - The axis cannot be part of a fixed joint, i.e. joint configured as PxArticulationJointType::eFIX. + + @see PxArticulationTendonJoint PxArticulationAxis + */ + virtual PxArticulationTendonJoint* createTendonJoint(PxArticulationTendonJoint* parent, PxArticulationAxis::Enum axis, const PxReal coefficient, const PxReal recipCoefficient, PxArticulationLink* link) = 0; + + /** + \brief Fills a user-provided buffer of tendon-joint pointers with the set of tendon joints. + + \param[in] userBuffer The user-provided buffer. + \param[in] bufferSize The size of the buffer. If this is not large enough to contain all the pointers to tendon joints, + only as many as can fit are written. Use getNbTendonJoints to size for all tendon joints. + \param[in] startIndex Index of first tendon joint pointer to be retrieved. + + \return The number of tendon joints filled into the user buffer. + + @see getNbTendonJoints + */ + virtual PxU32 getTendonJoints(PxArticulationTendonJoint** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + + /** + \brief Returns the number of tendon joints in the tendon. + + \return The number of tendon joints. + */ + virtual PxU32 getNbTendonJoints() const = 0; + + /** + \brief Sets the spring rest length of the tendon. + + The accumulated "length" of a fixed tendon is a linear combination of the joint axis positions that the tendon is + associated with, scaled by the respective tendon joints' coefficients. As such, when the joint positions of all + joints are zero, the accumulated length of a fixed tendon is zero. + + The spring of the tendon is not exerting any force on the articulation when the rest length is equal to the + tendon's accumulated length plus the tendon offset. + + \param[in] restLength The spring rest length of the tendon. + + @see getRestLength() + */ + virtual void setRestLength(const PxReal restLength) = 0; + + /** + \brief Gets the spring rest length of the tendon. + + \return The spring rest length of the tendon. + + @see setRestLength() + */ + virtual PxReal getRestLength() const = 0; + + /** + \brief Sets the low and high limit on the length of the tendon. + + \param[in] parameter Struct with the low and high limit. + + The limits, together with the damping and limit stiffness parameters, act on the accumulated length of the tendon. + + @see PxArticulationTendonLimit getLimitParameters() setRestLength() + */ + virtual void setLimitParameters(const PxArticulationTendonLimit& parameter) = 0; + + + /** + \brief Gets the low and high limit on the length of the tendon. + + \return Struct with the low and high limit. + + @see PxArticulationTendonLimit setLimitParameters() + */ + virtual PxArticulationTendonLimit getLimitParameters() const = 0; + + /** + \brief Returns the string name of the dynamic type. + + \return The string name. + */ + virtual const char* getConcreteTypeName() const { return "PxArticulationFixedTendon"; } + + virtual ~PxArticulationFixedTendon() {} + + protected: + PX_INLINE PxArticulationFixedTendon(PxType concreteType, PxBaseFlags baseFlags) : PxArticulationTendon(concreteType, baseFlags) {} + PX_INLINE PxArticulationFixedTendon(PxBaseFlags baseFlags) : PxArticulationTendon(baseFlags) {} + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif + diff --git a/Source/ThirdParty/PhysX/PxArticulationTendonData.h b/Source/ThirdParty/PhysX/PxArticulationTendonData.h new file mode 100644 index 000000000..8a4155a8c --- /dev/null +++ b/Source/ThirdParty/PhysX/PxArticulationTendonData.h @@ -0,0 +1,120 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + + +#ifndef PX_ARTICULATION_TENDON_DATA_H +#define PX_ARTICULATION_TENDON_DATA_H + +#include "foundation/PxSimpleTypes.h" +#include "foundation/PxVec3.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +/** +\brief PxGpuSpatialTendonData + +This data structure is to be used by the direct GPU API for spatial tendon data updates. + +@see PxArticulationSpatialTendon PxScene::copyArticulationData PxScene::applyArticulationData +*/ +PX_ALIGN_PREFIX(16) +class PxGpuSpatialTendonData +{ +public: + PxReal stiffness; + PxReal damping; + PxReal limitStiffness; + PxReal offset; +} +PX_ALIGN_SUFFIX(16); + +/** +\brief PxGpuFixedTendonData + +This data structure is to be used by the direct GPU API for fixed tendon data updates. + +@see PxArticulationFixedTendon PxScene::copyArticulationData PxScene::applyArticulationData +*/ +PX_ALIGN_PREFIX(16) +class PxGpuFixedTendonData : public PxGpuSpatialTendonData +{ +public: + PxReal lowLimit; + PxReal highLimit; + PxReal restLength; + PxReal padding; +} +PX_ALIGN_SUFFIX(16); + +/** +\brief PxGpuTendonJointCoefficientData + +This data structure is to be used by the direct GPU API for fixed tendon joint data updates. + +@see PxArticulationTendonJoint PxScene::copyArticulationData PxScene::applyArticulationData +*/ +PX_ALIGN_PREFIX(16) +class PxGpuTendonJointCoefficientData +{ +public: + PxReal coefficient; + PxReal recipCoefficient; + PxU32 axis; + PxU32 pad; +} +PX_ALIGN_SUFFIX(16); + +/** +\brief PxGpuTendonAttachmentData + +This data structure is to be used by the direct GPU API for spatial tendon attachment data updates. + +@see PxArticulationAttachment PxScene::copyArticulationData PxScene::applyArticulationData +*/ +PX_ALIGN_PREFIX(16) +class PxGpuTendonAttachmentData +{ +public: + PxVec3 relativeOffset; + PxReal restLength; + + PxReal coefficient; + PxReal lowLimit; + PxReal highLimit; + PxReal padding; +} +PX_ALIGN_SUFFIX(16); + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/PxAttachment.h b/Source/ThirdParty/PhysX/PxAttachment.h new file mode 100644 index 000000000..32d0a17c7 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxAttachment.h @@ -0,0 +1,60 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_ATTACHMENT_H +#define PX_ATTACHMENT_H + +#include "PxConeLimitedConstraint.h" +#include "PxFiltering.h" +#include "foundation/PxVec4.h" + +/** \addtogroup physics +@{ +*/ + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +/** +\brief Struct to specify attachment between a particle/vertex and a rigid +*/ +struct PxParticleRigidAttachment : public PxParticleRigidFilterPair +{ + PX_ALIGN(16, PxVec4 mLocalPose0); //!< local pose in body frame - except for statics, these are using world positions. + + PxConeLimitParams mParams; //!< Parameters to specify cone constraints +}; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxBaseMaterial.h b/Source/ThirdParty/PhysX/PxBaseMaterial.h new file mode 100644 index 000000000..7f5f8c788 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxBaseMaterial.h @@ -0,0 +1,64 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_BASE_MATERIAL_H +#define PX_BASE_MATERIAL_H +/** \addtogroup physics +@{ +*/ + +#include "PxPhysXConfig.h" +#include "common/PxBase.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief Base material class. + + @see PxPhysics.createMaterial PxPhysics.createFEMClothMaterial PxPhysics.createFEMSoftBodyMaterial PxPhysics.createFLIPMaterial PxPhysics.createMPMMaterial PxPhysics.createPBDMaterial + */ + class PxBaseMaterial : public PxRefCounted + { + public: + PX_INLINE PxBaseMaterial(PxType concreteType, PxBaseFlags baseFlags) : PxRefCounted(concreteType, baseFlags), userData(NULL) {} + PX_INLINE PxBaseMaterial(PxBaseFlags baseFlags) : PxRefCounted(baseFlags) {} + virtual ~PxBaseMaterial() {} + virtual bool isKindOf(const char* name) const { return !::strcmp("PxBaseMaterial", name) || PxRefCounted::isKindOf(name); } + + void* userData; //!< user can assign this to whatever, usually to create a 1:1 relationship with a user object. + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxBatchQuery.h b/Source/ThirdParty/PhysX/PxBatchQuery.h deleted file mode 100644 index 6dc4eaa26..000000000 --- a/Source/ThirdParty/PhysX/PxBatchQuery.h +++ /dev/null @@ -1,224 +0,0 @@ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// * Neither the name of NVIDIA CORPORATION nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. -// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. -// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - - -#ifndef PX_PHYSICS_NX_SCENEQUERY -#define PX_PHYSICS_NX_SCENEQUERY -/** \addtogroup scenequery -@{ */ - -#include "PxPhysXConfig.h" -#include "PxShape.h" -#include "PxBatchQueryDesc.h" -#include "PxQueryFiltering.h" - -#if !PX_DOXYGEN -namespace physx -{ -#endif - -class PxBoxGeometry; -class PxSphereGeometry; -struct PxQueryCache; - -/** -\brief Batched queries object. This is used to perform several queries at the same time. - -\deprecated The batched query feature has been deprecated in PhysX version 3.4 - -@see PxScene, PxScene.createBatchQuery -*/ -class PX_DEPRECATED PxBatchQuery -{ - public: - - /** - \brief Executes batched queries. - */ - virtual void execute() = 0; - - /** - \brief Gets the prefilter shader in use for this scene query. - - \return Prefilter shader. - - @see PxBatchQueryDesc.preFilterShade PxBatchQueryPreFilterShader - */ - virtual PxBatchQueryPreFilterShader getPreFilterShader() const = 0; - - /** - \brief Gets the postfilter shader in use for this scene query. - - \return Postfilter shader. - - @see PxBatchQueryDesc.preFilterShade PxBatchQueryPostFilterShader - */ - virtual PxBatchQueryPostFilterShader getPostFilterShader() const = 0; - - - /** - \brief Gets the shared global filter data in use for this scene query. - - \return Shared filter data for filter shader. - - @see getFilterShaderDataSize() PxBatchQueryDesc.filterShaderData PxBatchQueryPreFilterShader, PxBatchQueryPostFilterShader - */ - virtual const void* getFilterShaderData() const = 0; - - /** - \brief Gets the size of the shared global filter data (#PxSceneDesc.filterShaderData) - - \return Size of shared filter data [bytes]. - - @see getFilterShaderData() PxBatchQueryDesc.filterShaderDataSize PxBatchQueryPreFilterShader, PxBatchQueryPostFilterShader - */ - virtual PxU32 getFilterShaderDataSize() const = 0; - - /** - \brief Sets new user memory pointers. - - It is not possible to change the memory during query execute. - - @see PxBatchQueryDesc - */ - virtual void setUserMemory(const PxBatchQueryMemory&) = 0; - - /** - \brief Gets the user memory pointers. - - @see PxBatchQueryDesc - */ - virtual const PxBatchQueryMemory& getUserMemory() = 0; - - /** - \brief Releases PxBatchQuery from PxScene - - @see PxScene, PxScene.createBatchQuery - */ - virtual void release() = 0; - - /** - \brief Performs a raycast against objects in the scene, returns results in PxBatchQueryMemory::userRaycastResultBuffer - specified at PxBatchQuery creation time or via PxBatchQuery::setUserMemory call. - - \note Touching hits are not ordered. - \note Shooting a ray from within an object leads to different results depending on the shape type. Please check the details in article SceneQuery. User can ignore such objects by using one of the provided filter mechanisms. - - \param[in] origin Origin of the ray. - \param[in] unitDir Normalized direction of the ray. - \param[in] distance Length of the ray. Needs to be larger than 0. - \param[in] maxTouchHits Maximum number of hits to record in the touch buffer for this query. Default=0 reports a single blocking hit. If maxTouchHits is set to 0 all hits are treated as blocking by default. - \param[in] hitFlags Specifies which properties per hit should be computed and returned in hit array and blocking hit. - \param[in] filterData Filtering data passed to the filter shader. See #PxQueryFilterData #PxBatchQueryPreFilterShader, #PxBatchQueryPostFilterShader - \param[in] userData User can pass any value in this argument, usually to identify this particular query - \param[in] cache Cached hit shape (optional). Query is tested against cached shape first. If no hit is found the ray gets queried against the scene. - Note: Filtering is not executed for a cached shape if supplied; instead, if a hit is found, it is assumed to be a blocking hit. - Note: Using past touching hits as cache will produce incorrect behavior since the cached hit will always be treated as blocking. - - \note This query call writes to a list associated with the query object and is NOT thread safe (for performance reasons there is no lock - and overlapping writes from different threads may result in undefined behavior). - - @see PxQueryFilterData PxBatchQueryPreFilterShader PxBatchQueryPostFilterShader PxRaycastHit PxScene::raycast - */ - virtual void raycast( - const PxVec3& origin, const PxVec3& unitDir, PxReal distance = PX_MAX_F32, PxU16 maxTouchHits = 0, - PxHitFlags hitFlags = PxHitFlag::eDEFAULT, - const PxQueryFilterData& filterData = PxQueryFilterData(), - void* userData = NULL, const PxQueryCache* cache = NULL) = 0; - - - /** - \brief Performs an overlap test of a given geometry against objects in the scene, returns results in PxBatchQueryMemory::userOverlapResultBuffer - specified at PxBatchQuery creation time or via PxBatchQuery::setUserMemory call. - - \note Filtering: returning eBLOCK from user filter for overlap queries will cause a warning (see #PxQueryHitType). - - \param[in] geometry Geometry of object to check for overlap (supported types are: box, sphere, capsule, convex). - \param[in] pose Pose of the object. - \param[in] maxTouchHits Maximum number of hits to record in the touch buffer for this query. Default=0 reports a single blocking hit. If maxTouchHits is set to 0 all hits are treated as blocking by default. - \param[in] filterData Filtering data and simple logic. See #PxQueryFilterData #PxBatchQueryPreFilterShader, #PxBatchQueryPostFilterShader - \param[in] userData User can pass any value in this argument, usually to identify this particular query - \param[in] cache Cached hit shape (optional). Query is tested against cached shape first. If no hit is found the ray gets queried against the scene. - Note: Filtering is not executed for a cached shape if supplied; instead, if a hit is found, it is assumed to be a blocking hit. - Note: Using past touching hits as cache will produce incorrect behavior since the cached hit will always be treated as blocking. - - \note eBLOCK should not be returned from user filters for overlap(). Doing so will result in undefined behavior, and a warning will be issued. - \note If the PxQueryFlag::eNO_BLOCK flag is set, the eBLOCK will instead be automatically converted to an eTOUCH and the warning suppressed. - \note This query call writes to a list associated with the query object and is NOT thread safe (for performance reasons there is no lock - and overlapping writes from different threads may result in undefined behavior). - - @see PxQueryFilterData PxBatchQueryPreFilterShader PxBatchQueryPostFilterShader - */ - virtual void overlap( - const PxGeometry& geometry, const PxTransform& pose, PxU16 maxTouchHits = 0, - const PxQueryFilterData& filterData = PxQueryFilterData(), void* userData=NULL, const PxQueryCache* cache = NULL) = 0; - - /** - \brief Performs a sweep test against objects in the scene, returns results in PxBatchQueryMemory::userSweepResultBuffer - specified at PxBatchQuery creation time or via PxBatchQuery::setUserMemory call. - - \note Touching hits are not ordered. - \note If a shape from the scene is already overlapping with the query shape in its starting position, - the hit is returned unless eASSUME_NO_INITIAL_OVERLAP was specified. - - \param[in] geometry Geometry of object to sweep (supported types are: box, sphere, capsule, convex). - \param[in] pose Pose of the sweep object. - \param[in] unitDir Normalized direction of the sweep. - \param[in] distance Sweep distance. Needs to be larger than 0. Will be clamped to PX_MAX_SWEEP_DISTANCE. - \param[in] maxTouchHits Maximum number of hits to record in the touch buffer for this query. Default=0 reports a single blocking hit. If maxTouchHits is set to 0 all hits are treated as blocking by default. - \param[in] hitFlags Specifies which properties per hit should be computed and returned in hit array and blocking hit. - \param[in] filterData Filtering data and simple logic. See #PxQueryFilterData #PxBatchQueryPreFilterShader, #PxBatchQueryPostFilterShader - \param[in] userData User can pass any value in this argument, usually to identify this particular query - \param[in] cache Cached hit shape (optional). Query is tested against cached shape first. If no hit is found the ray gets queried against the scene. - Note: Filtering is not executed for a cached shape if supplied; instead, if a hit is found, it is assumed to be a blocking hit. - Note: Using past touching hits as cache will produce incorrect behavior since the cached hit will always be treated as blocking. - \param[in] inflation This parameter creates a skin around the swept geometry which increases its extents for sweeping. The sweep will register a hit as soon as the skin touches a shape, and will return the corresponding distance and normal. - Note: ePRECISE_SWEEP doesn't support inflation. Therefore the sweep will be performed with zero inflation. - - \note This query call writes to a list associated with the query object and is NOT thread safe (for performance reasons there is no lock - and overlapping writes from different threads may result in undefined behavior). - - @see PxHitFlags PxQueryFilterData PxBatchQueryPreFilterShader PxBatchQueryPostFilterShader PxSweepHit - */ - virtual void sweep( - const PxGeometry& geometry, const PxTransform& pose, const PxVec3& unitDir, const PxReal distance, - PxU16 maxTouchHits = 0, PxHitFlags hitFlags = PxHitFlag::eDEFAULT, - const PxQueryFilterData& filterData = PxQueryFilterData(), void* userData=NULL, const PxQueryCache* cache = NULL, - const PxReal inflation = 0.f) = 0; - -protected: - virtual ~PxBatchQuery() {} -}; - -#if !PX_DOXYGEN -} // namespace physx -#endif - -/** @} */ -#endif diff --git a/Source/ThirdParty/PhysX/PxBatchQueryDesc.h b/Source/ThirdParty/PhysX/PxBatchQueryDesc.h deleted file mode 100644 index 338db6fbc..000000000 --- a/Source/ThirdParty/PhysX/PxBatchQueryDesc.h +++ /dev/null @@ -1,303 +0,0 @@ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// * Neither the name of NVIDIA CORPORATION nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. -// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. -// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - - -#ifndef PX_PHYSICS_NX_SCENEQUERYDESC -#define PX_PHYSICS_NX_SCENEQUERYDESC -/** \addtogroup physics -@{ */ - -#include "PxPhysXConfig.h" -#include "PxClient.h" -#include "PxFiltering.h" -#include "PxQueryFiltering.h" -#include "foundation/PxAssert.h" - -#if !PX_DOXYGEN -namespace physx -{ -#endif - -struct PxSweepHit; -struct PxRaycastHit; - -/** -\brief Batched query status. - -\deprecated The batched query feature has been deprecated in PhysX version 3.4 -*/ -struct PX_DEPRECATED PxBatchQueryStatus -{ - enum Enum - { - /** - \brief This is the initial state before a query starts. - */ - ePENDING = 0, - - /** - \brief The query is finished; results have been written into the result and hit buffers. - */ - eSUCCESS, - - /** - \brief The query results were incomplete due to touch hit buffer overflow. Blocking hit is still correct. - */ - eOVERFLOW - }; -}; - -/** -\brief Generic struct for receiving results of single query in a batch. Gets templated on hit type PxRaycastHit, PxSweepHit or PxOverlapHit. - -\deprecated The batched query feature has been deprecated in PhysX version 3.4 -*/ -template -struct PX_DEPRECATED PxBatchQueryResult -{ - HitType block; //!< Holds the closest blocking hit for a single query in a batch. Only valid if hasBlock is true. - HitType* touches; //!< This pointer will either be set to NULL for 0 nbTouches or will point - //!< into the user provided batch query results buffer specified in PxBatchQueryDesc. - PxU32 nbTouches; //!< Number of touching hits returned by this query, works in tandem with touches pointer. - void* userData; //!< Copy of the userData pointer specified in the corresponding query. - PxU8 queryStatus; //!< Takes on values from PxBatchQueryStatus::Enum. - bool hasBlock; //!< True if there was a blocking hit. - PxU16 pad; //!< pads the struct to 16 bytes. - - /** \brief Computes the number of any hits in this result, blocking or touching. */ - PX_INLINE PxU32 getNbAnyHits() const { return nbTouches + (hasBlock ? 1 : 0); } - - /** \brief Convenience iterator used to access any hits in this result, blocking or touching. */ - PX_INLINE const HitType& getAnyHit(const PxU32 index) const { PX_ASSERT(index < nbTouches + (hasBlock ? 1 : 0)); - return index < nbTouches ? touches[index] : block; } -}; - -/** \brief Convenience typedef for the result of a batched raycast query. */ -typedef PX_DEPRECATED PxBatchQueryResult PxRaycastQueryResult; - -/** \brief Convenience typedef for the result of a batched sweep query. */ -typedef PX_DEPRECATED PxBatchQueryResult PxSweepQueryResult; - -/** \brief Convenience typedef for the result of a batched overlap query. */ -typedef PX_DEPRECATED PxBatchQueryResult PxOverlapQueryResult; - -/** -\brief Struct for #PxBatchQuery memory pointers. - -\deprecated The batched query feature has been deprecated in PhysX version 3.4 - -@see PxBatchQuery PxBatchQueryDesc -*/ -struct PX_DEPRECATED PxBatchQueryMemory - { - /** - \brief The pointer to the user-allocated buffer for results of raycast queries in corresponding order of issue - - \note The size should be large enough to fit the number of expected raycast queries. - - @see PxRaycastQueryResult - */ - PxRaycastQueryResult* userRaycastResultBuffer; - - /** - \brief The pointer to the user-allocated buffer for raycast touch hits. - \note The size of this buffer should be large enough to store PxRaycastHit. - If the buffer is too small to store hits, the related PxRaycastQueryResult.queryStatus will be set to eOVERFLOW - - */ - PxRaycastHit* userRaycastTouchBuffer; - - /** - \brief The pointer to the user-allocated buffer for results of sweep queries in corresponding order of issue - - \note The size should be large enough to fit the number of expected sweep queries. - - @see PxRaycastQueryResult - */ - PxSweepQueryResult* userSweepResultBuffer; - - /** - \brief The pointer to the user-allocated buffer for sweep hits. - \note The size of this buffer should be large enough to store PxSweepHit. - If the buffer is too small to store hits, the related PxSweepQueryResult.queryStatus will be set to eOVERFLOW - - */ - PxSweepHit* userSweepTouchBuffer; - - /** - \brief The pointer to the user-allocated buffer for results of overlap queries in corresponding order of issue - - \note The size should be large enough to fit the number of expected overlap queries. - - @see PxRaycastQueryResult - */ - PxOverlapQueryResult* userOverlapResultBuffer; - - /** - \brief The pointer to the user-allocated buffer for overlap hits. - \note The size of this buffer should be large enough to store the hits returned. - If the buffer is too small to store hits, the related PxOverlapQueryResult.queryStatus will be set to eABORTED - - */ - PxOverlapHit* userOverlapTouchBuffer; - - /** \brief Capacity of the user-allocated userRaycastTouchBuffer in elements */ - PxU32 raycastTouchBufferSize; - - /** \brief Capacity of the user-allocated userSweepTouchBuffer in elements */ - PxU32 sweepTouchBufferSize; - - /** \brief Capacity of the user-allocated userOverlapTouchBuffer in elements */ - PxU32 overlapTouchBufferSize; - - /** \return Capacity of the user-allocated userRaycastResultBuffer in elements (max number of raycast() calls before execute() call) */ - PX_FORCE_INLINE PxU32 getMaxRaycastsPerExecute() const { return raycastResultBufferSize; } - - /** \return Capacity of the user-allocated userSweepResultBuffer in elements (max number of sweep() calls before execute() call) */ - PX_FORCE_INLINE PxU32 getMaxSweepsPerExecute() const { return sweepResultBufferSize; } - - /** \return Capacity of the user-allocated userOverlapResultBuffer in elements (max number of overlap() calls before execute() call) */ - PX_FORCE_INLINE PxU32 getMaxOverlapsPerExecute() const { return overlapResultBufferSize; } - - PxBatchQueryMemory(PxU32 raycastResultBufferSize_, PxU32 sweepResultBufferSize_, PxU32 overlapResultBufferSize_) : - userRaycastResultBuffer (NULL), - userRaycastTouchBuffer (NULL), - userSweepResultBuffer (NULL), - userSweepTouchBuffer (NULL), - userOverlapResultBuffer (NULL), - userOverlapTouchBuffer (NULL), - raycastTouchBufferSize (0), - sweepTouchBufferSize (0), - overlapTouchBufferSize (0), - raycastResultBufferSize (raycastResultBufferSize_), - sweepResultBufferSize (sweepResultBufferSize_), - overlapResultBufferSize (overlapResultBufferSize_) - { - } - -protected: - PxU32 raycastResultBufferSize; - PxU32 sweepResultBufferSize; - PxU32 overlapResultBufferSize; -}; - -/** -\brief Descriptor class for #PxBatchQuery. - -\deprecated The batched query feature has been deprecated in PhysX version 3.4 - -@see PxBatchQuery PxSceneQueryExecuteMode -*/ -class PX_DEPRECATED PxBatchQueryDesc -{ -public: - - /** - \brief Shared global filter data which will get passed into the filter shader. - - \note The provided data will get copied to internal buffers and this copy will be used for filtering calls. - - Default: NULL - - @see PxSimulationFilterShader - */ - void* filterShaderData; - - /** - \brief Size (in bytes) of the shared global filter data #filterShaderData. - - Default: 0 - - @see PxSimulationFilterShader filterShaderData - */ - PxU32 filterShaderDataSize; - - /** - \brief The custom preFilter shader to use for filtering. - - @see PxBatchQueryPreFilterShader PxDefaultPreFilterShader - */ - PxBatchQueryPreFilterShader preFilterShader; - - /** - \brief The custom postFilter shader to use for filtering. - - @see PxBatchQueryPostFilterShader PxDefaultPostFilterShader - */ - PxBatchQueryPostFilterShader postFilterShader; - - /** - \brief User memory buffers for the query. - - @see PxBatchQueryMemory - */ - PxBatchQueryMemory queryMemory; - - /** - \brief Construct a batch query with specified maximum number of queries per batch. - - If the number of raycasts/sweeps/overlaps per execute exceeds the limit, the query will be discarded with a warning. - - \param maxRaycastsPerExecute Maximum number of raycast() calls allowed before execute() call. - This has to match the amount of memory allocated for PxBatchQueryMemory::userRaycastResultBuffer. - \param maxSweepsPerExecute Maximum number of sweep() calls allowed before execute() call. - This has to match the amount of memory allocated for PxBatchQueryMemory::userSweepResultBuffer. - \param maxOverlapsPerExecute Maximum number of overlap() calls allowed before execute() call. - This has to match the amount of memory allocated for PxBatchQueryMemory::userOverlapResultBuffer. - */ - PX_INLINE PxBatchQueryDesc(PxU32 maxRaycastsPerExecute, PxU32 maxSweepsPerExecute, PxU32 maxOverlapsPerExecute); - PX_INLINE bool isValid() const; -}; - - -PX_INLINE PxBatchQueryDesc::PxBatchQueryDesc(PxU32 maxRaycastsPerExecute, PxU32 maxSweepsPerExecute, PxU32 maxOverlapsPerExecute) : - filterShaderData (NULL), - filterShaderDataSize (0), - preFilterShader (NULL), - postFilterShader (NULL), - queryMemory (maxRaycastsPerExecute, maxSweepsPerExecute, maxOverlapsPerExecute) -{ -} - - -PX_INLINE bool PxBatchQueryDesc::isValid() const -{ - if ( ((filterShaderDataSize == 0) && (filterShaderData != NULL)) || - ((filterShaderDataSize > 0) && (filterShaderData == NULL)) ) - return false; - - return true; -} - -#if !PX_DOXYGEN -} // namespace physx -#endif - -/** @} */ -#endif diff --git a/Source/ThirdParty/PhysX/PxBroadPhase.h b/Source/ThirdParty/PhysX/PxBroadPhase.h index 91fd5deb4..cb8fab6b9 100644 --- a/Source/ThirdParty/PhysX/PxBroadPhase.h +++ b/Source/ThirdParty/PhysX/PxBroadPhase.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_BROAD_PHASE_H -#define PX_PHYSICS_BROAD_PHASE_H +#ifndef PX_BROAD_PHASE_H +#define PX_BROAD_PHASE_H /** \addtogroup physics @{ */ @@ -42,7 +40,8 @@ namespace physx { #endif - class PxActor; + class PxBaseTask; + class PxCudaContextManager; /** \brief Broad phase algorithm used in the simulation @@ -62,62 +61,31 @@ namespace physx of eMBP when a lot of objects are moving. While eSAP can remain faster when most objects are sleeping and eMBP can remain faster when it uses a large number of properly-defined regions, eABP often gives the best performance on average and the best memory usage. + + ePABP is a parallel implementation of ABP. It can often be the fastest (CPU) broadphase, but it + can use more memory than ABP. + + eGPU is a GPU implementation of the incremental sweep and prune approach. Additionally, it uses a ABP-style + initial pair generation approach to avoid large spikes when inserting shapes. It not only has the advantage + of traditional SAP approch which is good for when many objects are sleeping, but due to being fully parallel, + it also is great when lots of shapes are moving or for runtime pair insertion and removal. It can become a + performance bottleneck if there are a very large number of shapes roughly projecting to the same values + on a given axis. If the scene has a very large number of shapes in an actor, e.g. a humanoid, it is recommended + to use an aggregate to represent multi-shape or multi-body actors to minimize stress placed on the broad phase. */ struct PxBroadPhaseType { enum Enum { - eSAP, //!< 3-axes sweep-and-prune - eMBP, //!< Multi box pruning - eABP, //!< Automatic box pruning - eGPU, - + eSAP, //!< 3-axes sweep-and-prune + eMBP, //!< Multi box pruning + eABP, //!< Automatic box pruning + ePABP, //!< Parallel automatic box pruning + eGPU, //!< GPU broad phase eLAST }; }; - /** - \brief Broad-phase callback to receive broad-phase related events. - - Each broadphase callback object is associated with a PxClientID. It is possible to register different - callbacks for different clients. The callback functions are called this way: - - for shapes/actors, the callback assigned to the actors' clients are used - - for aggregates, the callbacks assigned to clients from aggregated actors are used - - \note SDK state should not be modified from within the callbacks. In particular objects should not - be created or destroyed. If state modification is needed then the changes should be stored to a buffer - and performed after the simulation step. - - Threading: It is not necessary to make this class thread safe as it will only be called in the context of the - user thread. - - @see PxSceneDesc PxScene.setBroadPhaseCallback() PxScene.getBroadPhaseCallback() - */ - class PxBroadPhaseCallback - { - public: - virtual ~PxBroadPhaseCallback() {} - - /** - \brief Out-of-bounds notification. - - This function is called when an object leaves the broad-phase. - - \param[in] shape Shape that left the broad-phase bounds - \param[in] actor Owner actor - */ - virtual void onObjectOutOfBounds(PxShape& shape, PxActor& actor) = 0; - - /** - \brief Out-of-bounds notification. - - This function is called when an aggregate leaves the broad-phase. - - \param[in] aggregate Aggregate that left the broad-phase bounds - */ - virtual void onObjectOutOfBounds(PxAggregate& aggregate) = 0; - }; - /** \brief "Region of interest" for the broad-phase. @@ -129,7 +97,7 @@ namespace physx thus collisions will be disabled for them. A PxBroadPhaseCallback out-of-bounds notification will be sent for each one of those objects. - The total number of regions is limited by PxBroadPhaseCaps::maxNbRegions. + The total number of regions is limited by PxBroadPhaseCaps::mMaxNbRegions. The number of regions has a direct impact on performance and memory usage, so it is recommended to experiment with various settings to find the best combination for your game. A good default setup is to start with global bounds @@ -140,8 +108,8 @@ namespace physx */ struct PxBroadPhaseRegion { - PxBounds3 bounds; //!< Region's bounds - void* userData; //!< Region's user-provided data + PxBounds3 mBounds; //!< Region's bounds + void* mUserData; //!< Region's user-provided data }; /** @@ -149,11 +117,11 @@ namespace physx */ struct PxBroadPhaseRegionInfo { - PxBroadPhaseRegion region; //!< User-provided region data - PxU32 nbStaticObjects; //!< Number of static objects in the region - PxU32 nbDynamicObjects; //!< Number of dynamic objects in the region - bool active; //!< True if region is currently used, i.e. it has not been removed - bool overlap; //!< True if region overlaps other regions (regions that are just touching are not considering overlapping) + PxBroadPhaseRegion mRegion; //!< User-provided region data + PxU32 mNbStaticObjects; //!< Number of static objects in the region + PxU32 mNbDynamicObjects; //!< Number of dynamic objects in the region + bool mActive; //!< True if region is currently used, i.e. it has not been removed + bool mOverlap; //!< True if region overlaps other regions (regions that are just touching are not considering overlapping) }; /** @@ -161,11 +129,574 @@ namespace physx */ struct PxBroadPhaseCaps { - PxU32 maxNbRegions; //!< Max number of regions supported by the broad-phase - PxU32 maxNbObjects; //!< Max number of objects supported by the broad-phase - bool needsPredefinedBounds; //!< If true, broad-phase needs 'regions' to work + PxU32 mMaxNbRegions; //!< Max number of regions supported by the broad-phase (0 = explicit regions not needed) }; + /** + \brief Broadphase descriptor. + + This structure is used to create a standalone broadphase. It captures all the parameters needed to + initialize a broadphase. + + For the GPU broadphase (PxBroadPhaseType::eGPU) it is necessary to provide a CUDA context manager. + + The kinematic filtering flags are currently not supported by the GPU broadphase. They are used to + dismiss pairs that involve kinematic objects directly within the broadphase. + + \see PxCreateBroadPhase + */ + class PxBroadPhaseDesc + { + public: + PxBroadPhaseDesc(PxBroadPhaseType::Enum type = PxBroadPhaseType::eLAST) : + mType (type), + mContextID (0), + mContextManager (NULL), + mFoundLostPairsCapacity (256 * 1024), + mDiscardStaticVsKinematic (false), + mDiscardKinematicVsKinematic(false) + {} + + PxBroadPhaseType::Enum mType; //!< Desired broadphase implementation + PxU64 mContextID; //!< Context ID for profiler. See PxProfilerCallback. + + PxCudaContextManager* mContextManager; //!< (GPU) CUDA context manager, must be provided for PxBroadPhaseType::eGPU. + PxU32 mFoundLostPairsCapacity; //!< (GPU) Capacity of found and lost buffers allocated in GPU global memory. This is used for the found/lost pair reports in the BP. + + bool mDiscardStaticVsKinematic; //!< Static-vs-kinematic filtering flag. Not supported by PxBroadPhaseType::eGPU. + bool mDiscardKinematicVsKinematic; //!< kinematic-vs-kinematic filtering flag. Not supported by PxBroadPhaseType::eGPU. + + PX_INLINE bool isValid() const + { + if(PxU32(mType)>=PxBroadPhaseType::eLAST) + return false; + + if(mType==PxBroadPhaseType::eGPU && !mContextManager) + return false; + + return true; + } + }; + + typedef PxU32 PxBpIndex; //!< Broadphase index. Indexes bounds, groups and distance arrays. + typedef PxU32 PxBpFilterGroup; //!< Broadphase filter group. + #define PX_INVALID_BP_FILTER_GROUP 0xffffffff //!< Invalid broadphase filter group + + /** + \brief Retrieves the filter group for static objects. + + Mark static objects with this group when adding them to the broadphase. + Overlaps between static objects will not be detected. All static objects + should have the same group. + + \return Filter group for static objects. + \see PxBpFilterGroup + */ + PX_C_EXPORT PX_PHYSX_CORE_API PxBpFilterGroup PxGetBroadPhaseStaticFilterGroup(); + + /** + \brief Retrieves a filter group for dynamic objects. + + Mark dynamic objects with this group when adding them to the broadphase. + Each dynamic object must have an ID, and overlaps between dynamic objects that have + the same ID will not be detected. This is useful to dismiss overlaps between shapes + of the same (compound) actor directly within the broadphase. + + \param id [in] ID/Index of dynamic object + \return Filter group for the object. + \see PxBpFilterGroup + */ + PX_C_EXPORT PX_PHYSX_CORE_API PxBpFilterGroup PxGetBroadPhaseDynamicFilterGroup(PxU32 id); + + /** + \brief Retrieves a filter group for kinematic objects. + + Mark kinematic objects with this group when adding them to the broadphase. + Each kinematic object must have an ID, and overlaps between kinematic objects that have + the same ID will not be detected. + + \param id [in] ID/Index of kinematic object + \return Filter group for the object. + \see PxBpFilterGroup + */ + PX_C_EXPORT PX_PHYSX_CORE_API PxBpFilterGroup PxGetBroadPhaseKinematicFilterGroup(PxU32 id); + + /** + \brief Broadphase data update structure. + + This structure is used to update the low-level broadphase (PxBroadPhase). All added, updated and removed objects + must be batched and submitted at once to the broadphase. + + Broadphase objects have bounds, a filtering group, and a distance. With the low-level broadphase the data must be + externally managed by the clients of the broadphase API, and passed to the update function. + + The provided bounds are non-inflated "base" bounds that can be further extended by the broadphase using the passed + distance value. These can be contact offsets, or dynamically updated distance values for e.g. speculative contacts. + Either way they are optional and can be left to zero. The broadphase implementations efficiently combine the base + bounds with the per-object distance values at runtime. + + The per-object filtering groups are used to discard some pairs directly within the broadphase, which is more + efficient than reporting the pairs and culling them in a second pass. + + \see PxBpFilterGroup PxBpIndex PxBounds3 PxBroadPhase::update + */ + class PxBroadPhaseUpdateData + { + public: + + PxBroadPhaseUpdateData( const PxBpIndex* created, PxU32 nbCreated, + const PxBpIndex* updated, PxU32 nbUpdated, + const PxBpIndex* removed, PxU32 nbRemoved, + const PxBounds3* bounds, const PxBpFilterGroup* groups, const float* distances, + PxU32 capacity) : + mCreated (created), mNbCreated (nbCreated), + mUpdated (updated), mNbUpdated (nbUpdated), + mRemoved (removed), mNbRemoved (nbRemoved), + mBounds (bounds), mGroups (groups), mDistances (distances), + mCapacity (capacity) + { + } + + PxBroadPhaseUpdateData(const PxBroadPhaseUpdateData& other) : + mCreated (other.mCreated), mNbCreated (other.mNbCreated), + mUpdated (other.mUpdated), mNbUpdated (other.mNbUpdated), + mRemoved (other.mRemoved), mNbRemoved (other.mNbRemoved), + mBounds (other.mBounds), mGroups (other.mGroups), mDistances (other.mDistances), + mCapacity (other.mCapacity) + { + } + + PxBroadPhaseUpdateData& operator=(const PxBroadPhaseUpdateData& other); + + const PxBpIndex* mCreated; //!< Indices of created objects. + const PxU32 mNbCreated; //!< Number of created objects. + + const PxBpIndex* mUpdated; //!< Indices of updated objects. + const PxU32 mNbUpdated; //!< Number of updated objects. + + const PxBpIndex* mRemoved; //!< Indices of removed objects. + const PxU32 mNbRemoved; //!< Number of removed objects. + + const PxBounds3* mBounds; //!< (Persistent) array of bounds. + const PxBpFilterGroup* mGroups; //!< (Persistent) array of groups. + const float* mDistances; //!< (Persistent) array of distances. + const PxU32 mCapacity; //!< Capacity of bounds / groups / distance buffers. + }; + + /** + \brief Broadphase pair. + + A pair of indices returned by the broadphase for found or lost pairs. + + \see PxBroadPhaseResults + */ + struct PxBroadPhasePair + { + PxBpIndex mID0; //!< Index of first object + PxBpIndex mID1; //!< Index of second object + }; + + /** + \brief Broadphase results. + + Set of found and lost pairs after a broadphase update. + + \see PxBroadPhasePair PxBroadPhase::fetchResults PxAABBManager::fetchResults + */ + struct PxBroadPhaseResults + { + PxBroadPhaseResults() : mNbCreatedPairs(0), mCreatedPairs(NULL), mNbDeletedPairs(0), mDeletedPairs(NULL) {} + + PxU32 mNbCreatedPairs; //!< Number of new/found/created pairs. + const PxBroadPhasePair* mCreatedPairs; //!< Array of new/found/created pairs. + + PxU32 mNbDeletedPairs; //!< Number of lost/deleted pairs. + const PxBroadPhasePair* mDeletedPairs; //!< Array of lost/deleted pairs. + }; + + /** + \brief Broadphase regions. + + An API to manage broadphase regions. Only needed for the MBP broadphase (PxBroadPhaseType::eMBP). + + \see PxBroadPhase::getRegions() + */ + class PxBroadPhaseRegions + { + protected: + PxBroadPhaseRegions() {} + virtual ~PxBroadPhaseRegions() {} + public: + + /** + \brief Returns number of regions currently registered in the broad-phase. + + \return Number of regions + */ + virtual PxU32 getNbRegions() const = 0; + + /** + \brief Gets broad-phase regions. + + \param userBuffer [out] Returned broad-phase regions + \param bufferSize [in] Size of provided userBuffer. + \param startIndex [in] Index of first desired region, in [0 ; getNbRegions()[ + \return Number of written out regions. + \see PxBroadPhaseRegionInfo + */ + virtual PxU32 getRegions(PxBroadPhaseRegionInfo* userBuffer, PxU32 bufferSize, PxU32 startIndex=0) const = 0; + + /** + \brief Adds a new broad-phase region. + + The total number of regions is limited to PxBroadPhaseCaps::mMaxNbRegions. If that number is exceeded, the call is ignored. + + The newly added region will be automatically populated with already existing objects that touch it, if the + 'populateRegion' parameter is set to true. Otherwise the newly added region will be empty, and it will only be + populated with objects when those objects are added to the simulation, or updated if they already exist. + + Using 'populateRegion=true' has a cost, so it is best to avoid it if possible. In particular it is more efficient + to create the empty regions first (with populateRegion=false) and then add the objects afterwards (rather than + the opposite). + + Objects automatically move from one region to another during their lifetime. The system keeps tracks of what + regions a given object is in. It is legal for an object to be in an arbitrary number of regions. However if an + object leaves all regions, or is created outside of all regions, several things happen: + - collisions get disabled for this object + - the object appears in the getOutOfBoundsObjects() array + + If an out-of-bounds object, whose collisions are disabled, re-enters a valid broadphase region, then collisions + are re-enabled for that object. + + \param region [in] User-provided region data + \param populateRegion [in] True to automatically populate the newly added region with existing objects touching it + \param bounds [in] User-managed array of bounds + \param distances [in] User-managed array of distances + + \return Handle for newly created region, or 0xffffffff in case of failure. + \see PxBroadPhaseRegion getOutOfBoundsObjects() + */ + virtual PxU32 addRegion(const PxBroadPhaseRegion& region, bool populateRegion, const PxBounds3* bounds, const float* distances) = 0; + + /** + \brief Removes a broad-phase region. + + If the region still contains objects, and if those objects do not overlap any region any more, they are not + automatically removed from the simulation. Instead, the PxBroadPhaseCallback::onObjectOutOfBounds notification + is used for each object. Users are responsible for removing the objects from the simulation if this is the + desired behavior. + + If the handle is invalid, or if a valid handle is removed twice, an error message is sent to the error stream. + + \param handle [in] Region's handle, as returned by addRegion + \return True if success + */ + virtual bool removeRegion(PxU32 handle) = 0; + + /* + \brief Return the number of objects that are not in any region. + */ + virtual PxU32 getNbOutOfBoundsObjects() const = 0; + + /* + \brief Return an array of objects that are not in any region. + */ + virtual const PxU32* getOutOfBoundsObjects() const = 0; + }; + + /** + \brief Low-level broadphase API. + + This low-level API only supports batched updates and leaves most of the data management to its clients. + + This is useful if you want to use the broadphase with your own memory buffers. Note however that the GPU broadphase + works best with buffers allocated in CUDA memory. The getAllocator() function returns an allocator that is compatible + with the selected broadphase. It is recommended to allocate and deallocate the broadphase data (bounds, groups, distances) + using this allocator. + + Important note: it must be safe to load 4 bytes past the end of the provided bounds array. + + The high-level broadphase API (PxAABBManager) is an easier-to-use interface that automatically deals with these requirements. + + \see PxCreateBroadPhase + */ + class PxBroadPhase + { + protected: + PxBroadPhase() {} + virtual ~PxBroadPhase() {} + public: + + /* + \brief Releases the broadphase. + */ + virtual void release() = 0; + + /** + \brief Gets the broadphase type. + + \return Broadphase type. + \see PxBroadPhaseType::Enum + */ + virtual PxBroadPhaseType::Enum getType() const = 0; + + /** + \brief Gets broad-phase caps. + + \param caps [out] Broad-phase caps + \see PxBroadPhaseCaps + */ + virtual void getCaps(PxBroadPhaseCaps& caps) const = 0; + + /** + \brief Retrieves the regions API if applicable. + + For broadphases that do not use explicit user-defined regions, this call returns NULL. + + \return Region API, or NULL. + \see PxBroadPhaseRegions + */ + virtual PxBroadPhaseRegions* getRegions() = 0; + + /** + \brief Retrieves the broadphase allocator. + + User-provided buffers should ideally be allocated with this allocator, for best performance. + This is especially true for the GPU broadphases, whose buffers need to be allocated in CUDA + host memory. + + \return The broadphase allocator. + \see PxAllocatorCallback + */ + virtual PxAllocatorCallback* getAllocator() = 0; + + /** + \brief Retrieves the profiler's context ID. + + \return The context ID. + \see PxBroadPhaseDesc + */ + virtual PxU64 getContextID() const = 0; + + /** + \brief Sets a scratch buffer + + Some broadphases might take advantage of a scratch buffer to limit runtime allocations. + + All broadphases still work without providing a scratch buffer, this is an optional function + that can potentially reduce runtime allocations. + + \param scratchBlock [in] The scratch buffer + \param size [in] Size of the scratch buffer in bytes + */ + virtual void setScratchBlock(void* scratchBlock, PxU32 size) = 0; + + /** + \brief Updates the broadphase and computes the lists of created/deleted pairs. + + The provided update data describes changes to objects since the last broadphase update. + + To benefit from potentially multithreaded implementations, it is necessary to provide a continuation + task to the function. It is legal to pass NULL there, but the underlying (CPU) implementations will + then run single-threaded. + + \param updateData [in] The update data + \param continuation [in] Continuation task to enable multi-threaded implementations, or NULL. + \see PxBroadPhaseUpdateData PxBaseTask + */ + virtual void update(const PxBroadPhaseUpdateData& updateData, PxBaseTask* continuation=NULL) = 0; + + /** + \brief Retrieves the broadphase results after an update. + + This should be called once after each update call to retrieve the results of the broadphase. The + results are incremental, i.e. the system only returns new and lost pairs, not all current pairs. + + \param results [out] The broadphase results + \see PxBroadPhaseResults + */ + virtual void fetchResults(PxBroadPhaseResults& results) = 0; + + /** + \brief Helper for single-threaded updates. + + This short helper function performs a single-theaded update and reports the results in a single call. + + \param results [out] The broadphase results + \param updateData [in] The update data + \see PxBroadPhaseUpdateData PxBroadPhaseResults + */ + PX_FORCE_INLINE void update(PxBroadPhaseResults& results, const PxBroadPhaseUpdateData& updateData) + { + update(updateData); + fetchResults(results); + } + }; + + /** + \brief Broadphase factory function. + + Use this function to create a new standalone broadphase. + + \param desc [in] Broadphase descriptor + \return Newly created broadphase, or NULL + \see PxBroadPhase PxBroadPhaseDesc + */ + PX_C_EXPORT PX_PHYSX_CORE_API PxBroadPhase* PxCreateBroadPhase(const PxBroadPhaseDesc& desc); + + /** + \brief High-level broadphase API. + + The low-level broadphase API (PxBroadPhase) only supports batched updates and has a few non-trivial + requirements for managing the bounds data. + + The high-level broadphase API (PxAABBManager) is an easier-to-use one-object-at-a-time API that + automatically deals with the quirks of the PxBroadPhase data management. + + \see PxCreateAABBManager + */ + class PxAABBManager + { + protected: + PxAABBManager() {} + virtual ~PxAABBManager() {} + public: + + /* + \brief Releases the AABB manager. + */ + virtual void release() = 0; + + /** + \brief Retrieves the underlying broadphase. + + \return The managed broadphase. + \see PxBroadPhase + */ + virtual PxBroadPhase& getBroadPhase() = 0; + + /** + \brief Retrieves the managed bounds. + + This is needed as input parameters to functions like PxBroadPhaseRegions::addRegion. + + \return The managed object bounds. + \see PxBounds3 + */ + virtual const PxBounds3* getBounds() const = 0; + + /** + \brief Retrieves the managed distances. + + This is needed as input parameters to functions like PxBroadPhaseRegions::addRegion. + + \return The managed object distances. + */ + virtual const float* getDistances() const = 0; + + /** + \brief Retrieves the managed filter groups. + + \return The managed object groups. + */ + virtual const PxBpFilterGroup* getGroups() const = 0; + + /** + \brief Retrieves the managed buffers' capacity. + + Bounds, distances and groups buffers have the same capacity. + + \return The managed buffers' capacity. + */ + virtual PxU32 getCapacity() const = 0; + + /** + \brief Adds an object to the manager. + + Objects' indices are externally managed, i.e. they must be provided by users (as opposed to handles + that could be returned by this manager). The design allows users to identify an object by a single ID, + and use the same ID in multiple sub-systems. + + \param index [in] The object's index + \param bounds [in] The object's bounds + \param group [in] The object's filter group + \param distance [in] The object's distance (optional) + \see PxBpIndex PxBounds3 PxBpFilterGroup + */ + virtual void addObject(PxBpIndex index, const PxBounds3& bounds, PxBpFilterGroup group, float distance=0.0f) = 0; + + /** + \brief Removes an object from the manager. + + \param index [in] The object's index + \see PxBpIndex + */ + virtual void removeObject(PxBpIndex index) = 0; + + /** + \brief Updates an object in the manager. + + This call can update an object's bounds, distance, or both. + It is not possible to update an object's filter group. + + \param index [in] The object's index + \param bounds [in] The object's updated bounds, or NULL + \param distance [in] The object's updated distance, or NULL + \see PxBpIndex PxBounds3 + */ + virtual void updateObject(PxBpIndex index, const PxBounds3* bounds=NULL, const float* distance=NULL) = 0; + + /** + \brief Updates the broadphase and computes the lists of created/deleted pairs. + + The data necessary for updating the broadphase is internally computed by the AABB manager. + + To benefit from potentially multithreaded implementations, it is necessary to provide a continuation + task to the function. It is legal to pass NULL there, but the underlying (CPU) implementations will + then run single-threaded. + + \param continuation [in] Continuation task to enable multi-threaded implementations, or NULL. + \see PxBaseTask + */ + virtual void update(PxBaseTask* continuation=NULL) = 0; + + /** + \brief Retrieves the broadphase results after an update. + + This should be called once after each update call to retrieve the results of the broadphase. The + results are incremental, i.e. the system only returns new and lost pairs, not all current pairs. + + \param results [out] The broadphase results + \see PxBroadPhaseResults + */ + virtual void fetchResults(PxBroadPhaseResults& results) = 0; + + /** + \brief Helper for single-threaded updates. + + This short helper function performs a single-theaded update and reports the results in a single call. + + \param results [out] The broadphase results + \see PxBroadPhaseResults + */ + PX_FORCE_INLINE void update(PxBroadPhaseResults& results) + { + update(); + fetchResults(results); + } + }; + + /** + \brief AABB manager factory function. + + Use this function to create a new standalone high-level broadphase. + + \param broadphase [in] The broadphase that will be managed by the AABB manager + \return Newly created AABB manager, or NULL + \see PxAABBManager PxBroadPhase + */ + PX_C_EXPORT PX_PHYSX_CORE_API PxAABBManager* PxCreateAABBManager(PxBroadPhase& broadphase); + #if !PX_DOXYGEN } // namespace physx #endif diff --git a/Source/ThirdParty/PhysX/PxBuffer.h b/Source/ThirdParty/PhysX/PxBuffer.h new file mode 100644 index 000000000..bfb5bf2fb --- /dev/null +++ b/Source/ThirdParty/PhysX/PxBuffer.h @@ -0,0 +1,136 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. + +#ifndef PX_BUFFER_H +#define PX_BUFFER_H +/** \addtogroup physics +@{ */ + +#include "foundation/PxFlags.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +#if PX_VC +#pragma warning(push) +#pragma warning(disable : 4435) +#endif + +class PxCudaContextManager; + +/** +\brief Specifies memory space for a PxBuffer instance. + +@see PxBuffer +*/ +struct PxBufferType +{ + enum Enum + { + eHOST, + eDEVICE + }; +}; + +/** +\brief Buffer for delayed bulk read and write operations supporting host and GPU device memory spaces. + +@see PxPhysics::createBuffer(), PxParticleSystem +*/ +class PxBuffer +{ +public: + + /** + \brief Deletes the buffer. + + Do not keep a reference to the deleted instance. + Unfinished operations will be flushed and synchronized on. + */ + virtual void release() = 0; + + /** + \brief Provides access to internal memory (either device or pinned host memory depending on PxBufferType). + + Unfinished operations will be flushed and synchronized on before returning. + */ + virtual void* map() = 0; + + /** + \brief Releases access to internal memory (either device or pinned host memory depending on PxBufferType). + + \param[in] event Optional pointer to CUevent. Used to synchronize on application side work that needs to be completed before + buffer can be accessed again. + */ + virtual void unmap(void* event = NULL) = 0; + + /** + \brief Buffer memory space type. + + @see PxBufferType + */ + virtual PxBufferType::Enum getBufferType() const = 0; + + /** + \brief Size of buffer in bytes. + */ + virtual PxU64 getByteSize() const = 0; + + /** + \brief Get the associated PxCudaContextManager. + + @see PxCudaContextManager. + */ + virtual PxCudaContextManager* getCudaContextManager() const = 0; + + /** + \brief Helper function to synchronize on all pending operations. + + @see PxCudaContextManager. + */ + PX_INLINE void sync() { map(); unmap(); } + + virtual void resize(PxU64 size) = 0; + +protected: + + virtual ~PxBuffer() {} + PX_INLINE PxBuffer() {} +}; + +#if PX_VC +#pragma warning(pop) +#endif + + +#if !PX_DOXYGEN +} // namespace physx +#endif + + /** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxClient.h b/Source/ThirdParty/PhysX/PxClient.h index ce540e030..71d39488b 100644 --- a/Source/ThirdParty/PhysX/PxClient.h +++ b/Source/ThirdParty/PhysX/PxClient.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_CLIENT -#define PX_PHYSICS_NX_CLIENT +#ifndef PX_CLIENT_H +#define PX_CLIENT_H #include "foundation/PxFlags.h" @@ -52,13 +50,6 @@ typedef PxU8 PxClientID; */ static const PxClientID PX_DEFAULT_CLIENT = 0; -/** -\brief The maximum number of clients we support. - -@see PxClientID PxScene::createClient() -*/ -static const PxClientID PX_MAX_CLIENTS = 128; - #if !PX_DOXYGEN } // namespace physx #endif diff --git a/Source/ThirdParty/PhysX/PxConeLimitedConstraint.h b/Source/ThirdParty/PhysX/PxConeLimitedConstraint.h new file mode 100644 index 000000000..e8e931f99 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxConeLimitedConstraint.h @@ -0,0 +1,79 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_CONE_LIMITED_CONSTRAINT_H +#define PX_CONE_LIMITED_CONSTRAINT_H + +/** \addtogroup physics +@{ +*/ + +#include "foundation/PxVec3.h" +#include "foundation/PxVec4.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +/** +\brief A constraint descriptor for limiting movement to a conical region. +*/ +struct PxConeLimitedConstraint +{ + PxConeLimitedConstraint() + { + mAxis = PxVec3(0.f, 0.f, 0.f); + mAngle = 0.f; + mLowLimit = 0.f; + mHighLimit = 0.f; + } + + PxVec3 mAxis; //!< Axis of the cone in the actor space of the rigid body + PxReal mAngle; //!< Opening angle in radians + PxReal mLowLimit; //!< Minimum distance + PxReal mHighLimit; //!< Maximum distance +}; + +/** +\brief Compressed form of cone limit parameters +@see PxConeLimitedConstraint +*/ +PX_ALIGN_PREFIX(16) +struct PxConeLimitParams +{ + PxVec4 lowHighLimits; // [lowLimit, highLimit, unused, unused] + PxVec4 axisAngle; // [axis.x, axis.y, axis.z, angle] +}PX_ALIGN_SUFFIX(16); + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxConfig.h b/Source/ThirdParty/PhysX/PxConfig.h index aec243fb8..b99a59a03 100644 --- a/Source/ThirdParty/PhysX/PxConfig.h +++ b/Source/ThirdParty/PhysX/PxConfig.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,8 +22,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. - +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. #ifndef PX_CONFIG #define PX_CONFIG diff --git a/Source/ThirdParty/PhysX/PxConstraint.h b/Source/ThirdParty/PhysX/PxConstraint.h index 0e64ff238..c8aa6c231 100644 --- a/Source/ThirdParty/PhysX/PxConstraint.h +++ b/Source/ThirdParty/PhysX/PxConstraint.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_PHYSICS_NX_CONSTRAINT -#define PX_PHYSICS_NX_CONSTRAINT +#ifndef PX_CONSTRAINT_H +#define PX_CONSTRAINT_H /** \addtogroup physics @{ @@ -47,33 +46,28 @@ class PxRigidActor; class PxScene; class PxConstraintConnector; -/** -\brief a table of function pointers for a constraint - -@see PxConstraint -*/ - /** \brief constraint flags \note eBROKEN is a read only flag */ - struct PxConstraintFlag { enum Enum { - eBROKEN = 1<<0, //!< whether the constraint is broken - ePROJECT_TO_ACTOR0 = 1<<1, //!< whether actor1 should get projected to actor0 for this constraint (note: projection of a static/kinematic actor to a dynamic actor will be ignored) - ePROJECT_TO_ACTOR1 = 1<<2, //!< whether actor0 should get projected to actor1 for this constraint (note: projection of a static/kinematic actor to a dynamic actor will be ignored) - ePROJECTION = ePROJECT_TO_ACTOR0 | ePROJECT_TO_ACTOR1, //!< whether the actors should get projected for this constraint (the direction will be chosen by PhysX) - eCOLLISION_ENABLED = 1<<3, //!< whether contacts should be generated between the objects this constraint constrains - eVISUALIZATION = 1<<4, //!< whether this constraint should be visualized, if constraint visualization is turned on - eDRIVE_LIMITS_ARE_FORCES = 1<<5, //!< limits for drive strength are forces rather than impulses - eIMPROVED_SLERP = 1<<7, //!< perform preprocessing for improved accuracy on D6 Slerp Drive (this flag will be removed in a future release when preprocessing is no longer required) - eDISABLE_PREPROCESSING = 1<<8, //!< suppress constraint preprocessing, intended for use with rowResponseThreshold. May result in worse solver accuracy for ill-conditioned constraints. - eENABLE_EXTENDED_LIMITS = 1<<9, //!< enables extended limit ranges for angular limits (e.g. limit values > PxPi or < -PxPi) - eGPU_COMPATIBLE = 1<<10 //!< the constraint type is supported by gpu dynamic + eBROKEN = 1<<0, //!< whether the constraint is broken + ePROJECT_TO_ACTOR0 = 1<<1, //!< @deprecated whether actor1 should get projected to actor0 for this constraint (note: projection of a static/kinematic actor to a dynamic actor will be ignored) + ePROJECT_TO_ACTOR1 = 1<<2, //!< @deprecated whether actor0 should get projected to actor1 for this constraint (note: projection of a static/kinematic actor to a dynamic actor will be ignored) + ePROJECTION = ePROJECT_TO_ACTOR0 | ePROJECT_TO_ACTOR1, //!< @deprecated whether the actors should get projected for this constraint (the direction will be chosen by PhysX) + eCOLLISION_ENABLED = 1<<3, //!< whether contacts should be generated between the objects this constraint constrains + eVISUALIZATION = 1<<4, //!< whether this constraint should be visualized, if constraint visualization is turned on + eDRIVE_LIMITS_ARE_FORCES = 1<<5, //!< limits for drive strength are forces rather than impulses + eIMPROVED_SLERP = 1<<7, //!< perform preprocessing for improved accuracy on D6 Slerp Drive (this flag will be removed in a future release when preprocessing is no longer required) + eDISABLE_PREPROCESSING = 1<<8, //!< suppress constraint preprocessing, intended for use with rowResponseThreshold. May result in worse solver accuracy for ill-conditioned constraints. + eENABLE_EXTENDED_LIMITS = 1<<9, //!< enables extended limit ranges for angular limits (e.g., limit values > PxPi or < -PxPi) + eGPU_COMPATIBLE = 1<<10, //!< the constraint type is supported by gpu dynamics + eALWAYS_UPDATE = 1<<11, //!< updates the constraint each frame + eDISABLE_CONSTRAINT = 1<<12 //!< disables the constraint. SolverPrep functions won't be called for this constraint. }; }; @@ -81,30 +75,27 @@ struct PxConstraintFlag \brief constraint flags @see PxConstraintFlag */ - typedef PxFlags PxConstraintFlags; PX_FLAGS_OPERATORS(PxConstraintFlag::Enum, PxU16) +/** +\brief a table of function pointers for a constraint + +@see PxConstraint +*/ struct PxConstraintShaderTable { - enum - { - eMAX_SOLVERPRPEP_DATASIZE=400 - }; - - PxConstraintSolverPrep solverPrep; //!< solver constraint generation function - PxConstraintProject project; //!< constraint projection function - PxConstraintVisualize visualize; //!< constraint visualization function - PxConstraintFlag::Enum flag; //!< gpu constraint + PxConstraintSolverPrep solverPrep; //!< solver constraint generation function + PxConstraintProject project; //!< @deprecated constraint projection function + PxConstraintVisualize visualize; //!< constraint visualization function + PxConstraintFlag::Enum flag; //!< constraint flags }; - /** \brief A plugin class for implementing constraints @see PxPhysics.createConstraint */ - class PxConstraint : public PxBase { public: @@ -152,6 +143,14 @@ public: */ virtual void markDirty() = 0; + /** + \brief Retrieve the flags for this constraint + + \return the constraint flags + @see PxConstraintFlags + */ + virtual PxConstraintFlags getFlags() const = 0; + /** \brief Set the flags for this constraint @@ -163,14 +162,6 @@ public: */ virtual void setFlags(PxConstraintFlags flags) = 0; - /** - \brief Retrieve the flags for this constraint - - \return the constraint flags - @see PxConstraintFlags - */ - virtual PxConstraintFlags getFlags() const = 0; - /** \brief Set a flag for this constraint @@ -183,6 +174,9 @@ public: /** \brief Retrieve the constraint force most recently applied to maintain this constraint. + + \note It is not allowed to use this method while the simulation is running (except during PxScene::collide(), + in PxContactModifyCallback or in contact report callbacks). \param[out] linear the constraint force \param[out] angular the constraint torque @@ -259,17 +253,17 @@ public: @see PxConstraintConnector PxConstraintSolverPrep PxConstraintProject PxConstraintVisualize */ - virtual void setConstraintFunctions(PxConstraintConnector& connector, - const PxConstraintShaderTable& shaders) = 0; + virtual void setConstraintFunctions(PxConstraintConnector& connector, const PxConstraintShaderTable& shaders) = 0; - virtual const char* getConcreteTypeName() const { return "PxConstraint"; } + virtual const char* getConcreteTypeName() const PX_OVERRIDE { return "PxConstraint"; } + + void* userData; //!< user can assign this to whatever, usually to create a 1:1 relationship with a user object. protected: - PX_INLINE PxConstraint(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags) {} - PX_INLINE PxConstraint(PxBaseFlags baseFlags) : PxBase(baseFlags) {} + PX_INLINE PxConstraint(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags), userData(NULL) {} + PX_INLINE PxConstraint(PxBaseFlags baseFlags) : PxBase(baseFlags), userData(NULL) {} virtual ~PxConstraint() {} - virtual bool isKindOf(const char* name) const { return !::strcmp("PxConstraint", name) || PxBase::isKindOf(name); } - + virtual bool isKindOf(const char* name) const PX_OVERRIDE { return !::strcmp("PxConstraint", name) || PxBase::isKindOf(name); } }; #if !PX_DOXYGEN diff --git a/Source/ThirdParty/PhysX/PxConstraintDesc.h b/Source/ThirdParty/PhysX/PxConstraintDesc.h index 785f5879f..12aa7559d 100644 --- a/Source/ThirdParty/PhysX/PxConstraintDesc.h +++ b/Source/ThirdParty/PhysX/PxConstraintDesc.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_PHYSICS_NX_CONSTRAINTDESC -#define PX_PHYSICS_NX_CONSTRAINTDESC +#ifndef PX_CONSTRAINT_DESC_H +#define PX_CONSTRAINT_DESC_H /** \addtogroup physics @{ @@ -52,15 +51,8 @@ namespace physx { #endif -class PxConstraintConnector; -class PxRigidActor; -class PxScene; -class PxConstraintConnector; -class PxRenderBuffer; -class PxDeletionListener; - /** - \brief constraint row flags + \brief Constraint row flags These flags configure the post-processing of constraint rows and the behavior of the solver while solving constraints */ @@ -76,8 +68,8 @@ struct Px1DConstraintFlag eKEEPBIAS = 1<<3, //!< whether to keep the error term when solving for velocity. Ignored if restitution generates bounce, or eSPRING is set. eOUTPUT_FORCE = 1<<4, //!< whether to accumulate the force value from this constraint in the force total that is reported for the constraint and tested for breakage eHAS_DRIVE_LIMIT = 1<<5, //!< whether the constraint has a drive force limit (which will be scaled by dt unless PxConstraintFlag::eLIMITS_ARE_FORCES is set) - eANGULAR_CONSTRAINT = 1 << 6,//!< Whether this is an angular or linear constraint - eDRIVE_ROW = 1 << 7 + eANGULAR_CONSTRAINT = 1<<6, //!< whether this is an angular or linear constraint + eDRIVE_ROW = 1<<7 //!< whether the constraint's geometric error should drive the target velocity }; }; @@ -85,7 +77,7 @@ typedef PxFlags Px1DConstraintFlags; PX_FLAGS_OPERATORS(Px1DConstraintFlag::Type, PxU16) /** -\brief constraint type hints which the solver uses to optimize constraint handling +\brief Constraint type hints which the solver uses to optimize constraint handling */ struct PxConstraintSolveHint { @@ -104,7 +96,7 @@ struct PxConstraintSolveHint }; /** -\brief A constraint +\brief A one-dimensional constraint A constraint is expressed as a set of 1-dimensional constraint rows which define the required constraint on the objects' velocities. @@ -140,37 +132,36 @@ All constraints support limits on the minimum or maximum impulse applied. PX_ALIGN_PREFIX(16) struct Px1DConstraint { - PxVec3 linear0; //!< linear component of velocity jacobian in world space - PxReal geometricError; //!< geometric error of the constraint along this axis - PxVec3 angular0; //!< angular component of velocity jacobian in world space - PxReal velocityTarget; //!< velocity target for the constraint along this axis + PxVec3 linear0; //!< linear component of velocity jacobian in world space + PxReal geometricError; //!< geometric error of the constraint along this axis + PxVec3 angular0; //!< angular component of velocity jacobian in world space + PxReal velocityTarget; //!< velocity target for the constraint along this axis - PxVec3 linear1; //!< linear component of velocity jacobian in world space - PxReal minImpulse; //!< minimum impulse the solver may apply to enforce this constraint - PxVec3 angular1; //!< angular component of velocity jacobian in world space - PxReal maxImpulse; //!< maximum impulse the solver may apply to enforce this constraint + PxVec3 linear1; //!< linear component of velocity jacobian in world space + PxReal minImpulse; //!< minimum impulse the solver may apply to enforce this constraint + PxVec3 angular1; //!< angular component of velocity jacobian in world space + PxReal maxImpulse; //!< maximum impulse the solver may apply to enforce this constraint union { struct SpringModifiers { - PxReal stiffness; //!< spring parameter, for spring constraints - PxReal damping; //!< damping parameter, for spring constraints + PxReal stiffness; //!< spring parameter, for spring constraints + PxReal damping; //!< damping parameter, for spring constraints } spring; struct RestitutionModifiers { - PxReal restitution; //!< restitution parameter for determining additional "bounce" - PxReal velocityThreshold; //!< minimum impact velocity for bounce + PxReal restitution; //!< restitution parameter for determining additional "bounce" + PxReal velocityThreshold; //!< minimum impact velocity for bounce } bounce; } mods; - PxReal forInternalUse; //!< for internal use only - PxU16 flags; //!< a set of Px1DConstraintFlags - PxU16 solveHint; //!< constraint optimization hint, should be an element of PxConstraintSolveHint -} + PxReal forInternalUse; //!< for internal use only + PxU16 flags; //!< a set of Px1DConstraintFlags + PxU16 solveHint; //!< constraint optimization hint, should be an element of PxConstraintSolveHint +} PX_ALIGN_SUFFIX(16); - /** \brief Flags for determining which components of the constraint should be visualized. @@ -185,6 +176,9 @@ struct PxConstraintVisualizationFlag }; }; +/** +\brief Struct for specifying mass scaling for a pair of rigids +*/ PX_ALIGN_PREFIX(16) struct PxConstraintInvMassScale { @@ -205,7 +199,8 @@ struct PxConstraintInvMassScale } PX_ALIGN_SUFFIX(16); -/** solver constraint generation shader +/** +\brief Solver constraint generation shader This function is called by the constraint solver framework. The function must be reentrant, since it may be called simultaneously from multiple threads, and should access only the arguments passed into it. @@ -226,17 +221,18 @@ Developers writing custom constraints are encouraged to read the documentation i \return the number of constraint rows written. */ typedef PxU32 (*PxConstraintSolverPrep)(Px1DConstraint* constraints, - PxVec3& bodyAWorldOffset, + PxVec3p& bodyAWorldOffset, PxU32 maxConstraints, PxConstraintInvMassScale& invMassScale, const void* constantBlock, const PxTransform& bodyAToWorld, const PxTransform& bodyBToWorld, bool useExtendedLimits, - PxVec3& cAtW, - PxVec3& cBtW); + PxVec3p& cAtW, + PxVec3p& cBtW); -/** solver constraint projection shader +/** +\brief Solver constraint projection shader This function is called by the constraint post-solver framework. The function must be reentrant, since it may be called simultaneously from multiple threads and should access only the arguments passed into it. @@ -245,28 +241,30 @@ from multiple threads and should access only the arguments passed into it. \param[out] bodyAToWorld The center of mass frame of the first constrained body (the identity if the actor is static or a NULL pointer was provided for it) \param[out] bodyBToWorld The center of mass frame of the second constrained body (the identity if the actor is static or a NULL pointer was provided for it) \param[in] projectToA True if the constraint should be projected by moving the second body towards the first, false if the converse + +@deprecated */ -typedef void (*PxConstraintProject)(const void* constantBlock, +typedef PX_DEPRECATED void (*PxConstraintProject)(const void* constantBlock, PxTransform& bodyAToWorld, PxTransform& bodyBToWorld, bool projectToA); /** - API used to visualize details about a constraint. +\brief API used to visualize details about a constraint. */ class PxConstraintVisualizer { protected: virtual ~PxConstraintVisualizer(){} public: - /** Visualize joint frames + /** \brief Visualize joint frames \param[in] parent Parent transformation \param[in] child Child transformation */ virtual void visualizeJointFrames(const PxTransform& parent, const PxTransform& child) = 0; - /** Visualize joint linear limit + /** \brief Visualize joint linear limit \param[in] t0 Base transformation \param[in] t1 End transformation @@ -275,7 +273,7 @@ public: */ virtual void visualizeLinearLimit(const PxTransform& t0, const PxTransform& t1, PxReal value, bool active) = 0; - /** Visualize joint angular limit + /** \brief Visualize joint angular limit \param[in] t0 Transformation for the visualization \param[in] lower Lower limit angle @@ -284,7 +282,7 @@ public: */ virtual void visualizeAngularLimit(const PxTransform& t0, PxReal lower, PxReal upper, bool active) = 0; - /** Visualize limit cone + /** \brief Visualize limit cone \param[in] t Transformation for the visualization \param[in] tanQSwingY Tangent of the quarter Y angle @@ -293,7 +291,7 @@ public: */ virtual void visualizeLimitCone(const PxTransform& t, PxReal tanQSwingY, PxReal tanQSwingZ, bool active) = 0; - /** Visualize joint double cone + /** \brief Visualize joint double cone \param[in] t Transformation for the visualization \param[in] angle Limit angle @@ -301,7 +299,7 @@ public: */ virtual void visualizeDoubleCone(const PxTransform& t, PxReal angle, bool active) = 0; - /** Visualize line + /** \brief Visualize line \param[in] p0 Start position \param[in] p1 End postion @@ -310,7 +308,7 @@ public: virtual void visualizeLine(const PxVec3& p0, const PxVec3& p1, PxU32 color) = 0; }; -/** solver constraint visualization function +/** \brief Solver constraint visualization function This function is called by the constraint post-solver framework to visualize the constraint @@ -328,20 +326,23 @@ typedef void (*PxConstraintVisualize)(PxConstraintVisualizer& visualizer, const PxTransform& body1Transform, PxU32 flags); +/** +\brief Flags for determining how PVD should serialize a constraint update +@see PxConstraintConnector::updatePvdProperties, PvdSceneClient::updateConstraint +*/ struct PxPvdUpdateType { enum Enum { - CREATE_INSTANCE, - RELEASE_INSTANCE, - UPDATE_ALL_PROPERTIES, - UPDATE_SIM_PROPERTIES + CREATE_INSTANCE, //!< triggers createPvdInstance call, creates an instance of a constraint + RELEASE_INSTANCE, //!< triggers releasePvdInstance call, releases an instance of a constraint + UPDATE_ALL_PROPERTIES, //!< triggers updatePvdProperties call, updates all properties of a constraint + UPDATE_SIM_PROPERTIES //!< triggers simUpdate call, updates all simulation properties of a constraint }; }; -/** - +/** \brief This class connects a custom constraint to the SDK This class connects a custom constraint to the SDK, and functions are called by the SDK @@ -352,40 +353,50 @@ the custom constraint's internal implementation class PxConstraintConnector { public: - /** + /** \brief Pre-simulation data preparation when the constraint is marked dirty, this function is called at the start of the simulation step for the SDK to copy the constraint data block. */ - virtual void* prepareData() = 0; + virtual void* prepareData() = 0; /** - this function is called by the SDK to update PVD's view of it + \brief this function is called by the SDK to update PVD's view of it */ - virtual bool updatePvdProperties(physx::pvdsdk::PvdDataStream& pvdConnection, - const PxConstraint* c, - PxPvdUpdateType::Enum updateType) const = 0; + virtual bool updatePvdProperties(physx::pvdsdk::PvdDataStream& pvdConnection, + const PxConstraint* c, + PxPvdUpdateType::Enum updateType) const = 0; + + /** + \brief this function is called by the SDK to update OmniPVD's view of it + */ + virtual void updateOmniPvdProperties() const = 0; + + /** + \brief Constraint release callback - /** When the SDK deletes a PxConstraint object this function is called by the SDK. In general custom constraints should not be deleted directly by applications: rather, the constraint should respond to a release() request by calling PxConstraint::release(), then wait for - this call to release its own resources, so that even if the release() call occurs during - a simulation step, the deletion of the constraint is buffered until that step completes. + this call to release its own resources. This function is also called when a PxConstraint object is deleted on cleanup due to destruction of the PxPhysics object. */ - virtual void onConstraintRelease() = 0; + virtual void onConstraintRelease() = 0; + + /** + \brief Center-of-mass shift callback - /** This function is called by the SDK when the CoM of one of the actors is moved. Since the API specifies constraint positions relative to actors, and the constraint shader functions are supplied with coordinates relative to bodies, some synchronization is usually required when the application moves an object's center of mass. */ - virtual void onComShift(PxU32 actor) = 0; + virtual void onComShift(PxU32 actor) = 0; /** + \brief Origin shift callback + This function is called by the SDK when the scene origin gets shifted and allows to adjust custom data which contains world space transforms. @@ -396,7 +407,7 @@ public: @see PxScene.shiftOrigin() */ - virtual void onOriginShift(const PxVec3& shift) = 0; + virtual void onOriginShift(const PxVec3& shift) = 0; /** \brief Fetches external data for a constraint. @@ -410,29 +421,34 @@ public: @see PxConstraintInfo PxSimulationEventCallback.onConstraintBreak() */ - virtual void* getExternalReference(PxU32& typeID) = 0; + virtual void* getExternalReference(PxU32& typeID) = 0; /** \brief Obtain a reference to a PxBase interface if the constraint has one. If the constraint does not implement the PxBase interface, it should return NULL. */ - virtual PxBase* getSerializable() = 0; + virtual PxBase* getSerializable() = 0; /** \brief Obtain the shader function pointer used to prep rows for this constraint */ - virtual PxConstraintSolverPrep getPrep() const = 0; + virtual PxConstraintSolverPrep getPrep() const = 0; /** \brief Obtain the pointer to the constraint's constant data */ - virtual const void* getConstantBlock() const = 0; + virtual const void* getConstantBlock() const = 0; + + /** + \brief Let the connector know it has been connected to a constraint. + */ + virtual void connectToConstraint(PxConstraint*) {} /** \brief virtual destructor */ - virtual ~PxConstraintConnector() {} + virtual ~PxConstraintConnector() {} }; #if !PX_DOXYGEN diff --git a/Source/ThirdParty/PhysX/PxContact.h b/Source/ThirdParty/PhysX/PxContact.h index 4d85f59a5..f10112bc1 100644 --- a/Source/ThirdParty/PhysX/PxContact.h +++ b/Source/ThirdParty/PhysX/PxContact.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,16 +22,20 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - #ifndef PX_CONTACT_H #define PX_CONTACT_H +/** \addtogroup physics + @{ +*/ + #include "foundation/PxVec3.h" #include "foundation/PxAssert.h" +#include "PxNodeIndex.h" #if !PX_DOXYGEN namespace physx @@ -46,8 +49,14 @@ namespace physx #define PXC_CONTACT_NO_FACE_INDEX 0xffffffff +class PxActor; + +/** +\brief Struct for specifying mass modification for a pair of rigids +\deprecated Use #PxConstraintInvMassScale instead. Deprecated since PhysX version 5.1. +*/ PX_ALIGN_PREFIX(16) -struct PxMassModificationProps +struct PX_DEPRECATED PxMassModificationProps { PxReal mInvMassScale0; PxReal mInvInertiaScale0; @@ -57,9 +66,8 @@ struct PxMassModificationProps PX_ALIGN_SUFFIX(16); /** -\brief Header for contact patch where all points share same material and normal +\brief Header for a contact patch where all points share same material and normal */ - PX_ALIGN_PREFIX(16) struct PxContactPatch { @@ -71,39 +79,78 @@ struct PxContactPatch eHAS_MODIFIED_MASS_RATIOS = 8, //!< Indicates this contact stream has modified mass ratios eHAS_TARGET_VELOCITY = 16, //!< Indicates this contact stream has target velocities set eHAS_MAX_IMPULSE = 32, //!< Indicates this contact stream has max impulses set - eREGENERATE_PATCHES = 64, //!< Indicates this contact stream needs patches re-generated. - //!< This is required if the application modified either the contact normal or the material properties + eREGENERATE_PATCHES = 64, //!< Indicates this contact stream needs patches re-generated. This is required if the application modified either the contact normal or the material properties eCOMPRESSED_MODIFIED_CONTACT = 128 }; + /** + \brief Modifiers for scaling the inertia of the involved bodies + */ PX_ALIGN(16, PxMassModificationProps mMassModification); //16 + /** \brief Contact normal */ PX_ALIGN(16, PxVec3 normal); //28 + /** \brief Restitution coefficient */ PxReal restitution; //32 + /** + \brief Dynamic friction coefficient + */ PxReal dynamicFriction; //36 - PxReal staticFriction; //40 - PxU8 startContactIndex; //41 - PxU8 nbContacts; //42 //Can be a U8 - PxU8 materialFlags; //43 //Can be a U16 - PxU8 internalFlags; //44 //Can be a U16 - PxU16 materialIndex0; //46 //Can be a U16 - PxU16 materialIndex1; //48 //Can be a U16 - + /** + \brief Static friction coefficient + */ + PxReal staticFriction; //40 + + /** + \brief Damping coefficient (for compliant contacts) + */ + PxReal damping; //44 + + /** + \brief Index of the first contact in the patch + */ + PxU16 startContactIndex; //46 + /** + \brief The number of contacts in this patch + */ + PxU8 nbContacts; //47 //Can be a U8 + + /** + \brief The combined material flag of two actors that come in contact + @see PxMaterialFlag, PxCombineMode + */ + PxU8 materialFlags; //48 //Can be a U16 + + /** + \brief The PxContactPatchFlags for this patch + */ + PxU16 internalFlags; //50 //Can be a U16 + + /** + \brief Material index of first body + */ + PxU16 materialIndex0; //52 //Can be a U16 + + /** + \brief Material index of second body + */ + PxU16 materialIndex1; //54 //Can be a U16 + + PxU16 pad[5]; //64 } PX_ALIGN_SUFFIX(16); /** -\brief Contact point data including face (feature) indices +\brief Contact point data */ - PX_ALIGN_PREFIX(16) struct PxContact { @@ -118,6 +165,9 @@ struct PxContact } PX_ALIGN_SUFFIX(16); +/** +\brief Contact point data with additional target and max impulse values +*/ PX_ALIGN_PREFIX(16) struct PxExtendedContact : public PxContact { @@ -189,6 +239,7 @@ struct PxContactStreamIterator cause performance issues on certain platforms. */ PxVec3 zero; + /** \brief The patch headers. */ @@ -204,7 +255,6 @@ struct PxContactStreamIterator */ const PxU32* faceIndice; - /** \brief The total number of patches in this contact stream */ @@ -225,27 +275,37 @@ struct PxContactStreamIterator */ PxU32 nextPatchIndex; - /* + /** \brief Size of contact patch header \note This varies whether the patch is modifiable or not. */ PxU32 contactPatchHeaderSize; + /** \brief Contact point size \note This varies whether the patch has feature indices or is modifiable. */ PxU32 contactPointSize; + /** \brief The stream format */ StreamFormat mStreamFormat; + /** \brief Indicates whether this stream is notify-only or not. */ PxU32 forceNoResponse; + /** + \brief Internal helper for stepping the contact stream iterator + */ bool pointStepped; + /** + \brief Specifies if this contactPatch has face indices (handled as bool) + @see faceIndice + */ PxU32 hasFaceIndices; /** @@ -314,6 +374,10 @@ struct PxContactStreamIterator return totalContacts; } + /** + \brief Returns the total patch count. + \return Total patch count. + */ PX_CUDA_CALLABLE PX_FORCE_INLINE PxU32 getTotalPatchCount() const { return totalPatches; @@ -362,7 +426,6 @@ struct PxContactStreamIterator pointStepped = true; } - /** \brief Gets the current contact's normal \return The current contact's normal. @@ -472,8 +535,8 @@ struct PxContactStreamIterator } /** - \brief Gets the contact's static dynamic coefficient. - \return The contact's static dynamic coefficient. + \brief Gets the contact's dynamic friction coefficient. + \return The contact's dynamic friction coefficient. */ PX_CUDA_CALLABLE PX_FORCE_INLINE PxReal getDynamicFriction() const { @@ -489,6 +552,15 @@ struct PxContactStreamIterator return getContactPatch().restitution; } + /** + \brief Gets the contact's damping value. + \return The contact's damping value. + */ + PX_CUDA_CALLABLE PX_FORCE_INLINE PxReal getDamping() const + { + return getContactPatch().damping; + } + /** \brief Gets the contact's material flags. \return The contact's material flags. @@ -518,6 +590,7 @@ struct PxContactStreamIterator /** \brief Advances the contact stream iterator to a specific contact index. + \return True if advancing was possible */ bool advanceToIndex(const PxU32 initialIndex) { @@ -571,6 +644,25 @@ private: }; +/** +\brief Contains contact information for a contact reported by the direct-GPU contact report API. See PxScene::copyContactData(). +*/ +struct PxGpuContactPair +{ + PxU8* contactPatches; //!< Ptr to contact patches. Type: PxContactPatch*, size: nbPatches. + PxU8* contactPoints; //!< Ptr to contact points. Type: PxContact*, size: nbContacts. + PxReal* contactForces; //!< Ptr to contact forces. Size: nbContacts. + PxU32 transformCacheRef0; //!< Ref to shape0's transform in transform cache. + PxU32 transformCacheRef1; //!< Ref to shape1's transform in transform cache. + PxNodeIndex nodeIndex0; //!< Unique Id for actor0 if the actor is dynamic. + PxNodeIndex nodeIndex1; //!< Unique Id for actor1 if the actor is dynamic. + PxActor* actor0; //!< Ptr to PxActor for actor0. + PxActor* actor1; //!< Ptr to PxActor for actor1. + + PxU16 nbContacts; //!< Num contacts. + PxU16 nbPatches; //!< Num patches. +}; + #if PX_VC #pragma warning(pop) @@ -580,4 +672,5 @@ private: } // namespace physx #endif +/** @} */ #endif diff --git a/Source/ThirdParty/PhysX/PxContactModifyCallback.h b/Source/ThirdParty/PhysX/PxContactModifyCallback.h index bb3bb58fd..6087d08f8 100644 --- a/Source/ThirdParty/PhysX/PxContactModifyCallback.h +++ b/Source/ThirdParty/PhysX/PxContactModifyCallback.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_CONTACT_MODIFY_CALLBACK -#define PX_CONTACT_MODIFY_CALLBACK +#ifndef PX_CONTACT_MODIFY_CALLBACK_H +#define PX_CONTACT_MODIFY_CALLBACK_H /** \addtogroup physics @{ */ @@ -63,6 +61,8 @@ class PxContactSet public: /** \brief Get the position of a specific contact point in the set. + \param[in] i Index of the point in the set + \return Position to the requested point in world space @see PxModifiableContact.point */ @@ -70,6 +70,8 @@ public: /** \brief Alter the position of a specific contact point in the set. + \param[in] i Index of the point in the set + \param[in] p The new position in world space @see PxModifiableContact.point */ @@ -77,6 +79,8 @@ public: /** \brief Get the contact normal of a specific contact point in the set. + \param[in] i Index of the point in the set + \return The requested normal in world space @see PxModifiableContact.normal */ @@ -84,6 +88,8 @@ public: /** \brief Alter the contact normal of a specific contact point in the set. + \param[in] i Index of the point in the set + \param[in] n The new normal in world space \note Changing the normal can cause contact points to be ignored. @@ -97,7 +103,9 @@ public: } /** - \brief Get the separation of a specific contact point in the set. + \brief Get the separation distance of a specific contact point in the set. + \param[in] i Index of the point in the set + \return The separation. Negative implies penetration. @see PxModifiableContact.separation */ @@ -105,6 +113,8 @@ public: /** \brief Alter the separation of a specific contact point in the set. + \param[in] i Index of the point in the set + \param[in] s The new separation @see PxModifiableContact.separation */ @@ -112,6 +122,8 @@ public: /** \brief Get the target velocity of a specific contact point in the set. + \param[in] i Index of the point in the set + \return The target velocity in world frame @see PxModifiableContact.targetVelocity @@ -120,6 +132,8 @@ public: /** \brief Alter the target velocity of a specific contact point in the set. + \param[in] i Index of the point in the set + \param[in] v The new velocity in world frame @see PxModifiableContact.targetVelocity */ @@ -132,17 +146,22 @@ public: /** \brief Get the face index with respect to the first shape of the pair for a specific contact point in the set. + \param[in] i Index of the point in the set + \return The face index of the first shape + \note At the moment, the first shape is never a tri-mesh, therefore this function always returns PXC_CONTACT_NO_FACE_INDEX @see PxModifiableContact.internalFaceIndex0 */ - PX_FORCE_INLINE PxU32 getInternalFaceIndex0(PxU32 i) { PX_UNUSED(i); return PXC_CONTACT_NO_FACE_INDEX; } + PX_FORCE_INLINE PxU32 getInternalFaceIndex0(PxU32 i) const { PX_UNUSED(i); return PXC_CONTACT_NO_FACE_INDEX; } /** \brief Get the face index with respect to the second shape of the pair for a specific contact point in the set. + \param[in] i Index of the point in the set + \return The face index of the second shape @see PxModifiableContact.internalFaceIndex1 */ - PX_FORCE_INLINE PxU32 getInternalFaceIndex1(PxU32 i) + PX_FORCE_INLINE PxU32 getInternalFaceIndex1(PxU32 i) const { PxContactPatch* patch = getPatch(); if (patch->internalFlags & PxContactPatch::eHAS_FACE_INDICES) @@ -154,6 +173,8 @@ public: /** \brief Get the maximum impulse for a specific contact point in the set. + \param[in] i Index of the point in the set + \return The maximum impulse @see PxModifiableContact.maxImpulse */ @@ -161,12 +182,14 @@ public: /** \brief Alter the maximum impulse for a specific contact point in the set. + \param[in] i Index of the point in the set + \param[in] s The new maximum impulse \note Must be nonnegative. If set to zero, the contact point will be ignored - @see PxModifiableContact.maxImpulse + @see PxModifiableContact.maxImpulse, ignore() */ - PX_FORCE_INLINE void setMaxImpulse(PxU32 i, PxReal s) + PX_FORCE_INLINE void setMaxImpulse(PxU32 i, PxReal s) { PxContactPatch* patch = getPatch(); patch->internalFlags |= PxContactPatch::eHAS_MAX_IMPULSE; @@ -175,6 +198,8 @@ public: /** \brief Get the restitution coefficient for a specific contact point in the set. + \param[in] i Index of the point in the set + \return The restitution coefficient @see PxModifiableContact.restitution */ @@ -182,12 +207,14 @@ public: /** \brief Alter the restitution coefficient for a specific contact point in the set. + \param[in] i Index of the point in the set + \param[in] r The new restitution coefficient \note Valid ranges [0,1] @see PxModifiableContact.restitution */ - PX_FORCE_INLINE void setRestitution(PxU32 i, PxReal r) + PX_FORCE_INLINE void setRestitution(PxU32 i, PxReal r) { PxContactPatch* patch = getPatch(); patch->internalFlags |= PxContactPatch::eREGENERATE_PATCHES; @@ -196,6 +223,8 @@ public: /** \brief Get the static friction coefficient for a specific contact point in the set. + \param[in] i Index of the point in the set + \return The friction coefficient (dimensionless) @see PxModifiableContact.staticFriction */ @@ -203,6 +232,8 @@ public: /** \brief Alter the static friction coefficient for a specific contact point in the set. + \param[in] i Index of the point in the set + \param[in] f The new friction coefficient (dimensionless), range [0, inf] @see PxModifiableContact.staticFriction */ @@ -215,6 +246,8 @@ public: /** \brief Get the static friction coefficient for a specific contact point in the set. + \param[in] i Index of the point in the set + \return The friction coefficient @see PxModifiableContact.dynamicFriction */ @@ -222,8 +255,10 @@ public: /** \brief Alter the static dynamic coefficient for a specific contact point in the set. + \param[in] i Index of the point in the set + \param[in] f The new friction coefficient - @see PxModifiableContact.dynamic + @see PxModifiableContact.dynamicFriction */ PX_FORCE_INLINE void setDynamicFriction(PxU32 i, PxReal f) { @@ -234,10 +269,11 @@ public: /** \brief Ignore the contact point. + \param[in] i Index of the point in the set If a contact point is ignored then no force will get applied at this point. This can be used to disable collision in certain areas of a shape, for example. */ - PX_FORCE_INLINE void ignore(PxU32 i) { mContacts[i].maxImpulse = 0.f; } + PX_FORCE_INLINE void ignore(PxU32 i) { setMaxImpulse(i, 0.0f); } /** \brief The number of contact points in the set. @@ -294,6 +330,7 @@ public: /** \brief Sets the invMassScale of body 0 + \param[in] scale The new scale This can be set to any value in the range [0, PX_MAX_F32). A value < 1.0 makes this contact treat the body as if it had larger mass. A value of 0.f makes this contact treat the body as if it had infinite mass. Any value > 1.f makes this contact treat the body as if it had smaller mass. @@ -307,6 +344,7 @@ public: /** \brief Sets the invMassScale of body 1 + \param[in] scale The new scale This can be set to any value in the range [0, PX_MAX_F32). A value < 1.0 makes this contact treat the body as if it had larger mass. A value of 0.f makes this contact treat the body as if it had infinite mass. Any value > 1.f makes this contact treat the body as if it had smaller mass. @@ -320,6 +358,7 @@ public: /** \brief Sets the invInertiaScale of body 0 + \param[in] scale The new scale This can be set to any value in the range [0, PX_MAX_F32). A value < 1.0 makes this contact treat the body as if it had larger inertia. A value of 0.f makes this contact treat the body as if it had infinite inertia. Any value > 1.f makes this contact treat the body as if it had smaller inertia. @@ -333,6 +372,7 @@ public: /** \brief Sets the invInertiaScale of body 1 + \param[in] scale The new scale This can be set to any value in the range [0, PX_MAX_F32). A value < 1.0 makes this contact treat the body as if it had larger inertia. A value of 0.f makes this contact treat the body as if it had infinite inertia. Any value > 1.f makes this contact treat the body as if it had smaller inertia. @@ -373,14 +413,13 @@ public: Note that these are the actors as seen by the simulation, and may have been deleted since the simulation step started. */ - const PxRigidActor* actor[2]; + /** \brief The shapes which make up the pair in contact. Note that these are the shapes as seen by the simulation, and may have been deleted since the simulation step started. */ - const PxShape* shape[2]; /** @@ -388,15 +427,12 @@ public: These are the transforms as the simulation engine sees them, and may have been modified by the application since the simulation step started. - */ - PxTransform transform[2]; /** \brief An array of contact points between these two shapes. */ - PxContactSet contacts; }; @@ -426,11 +462,14 @@ public: /** \brief Passes modifiable arrays of contacts to the application. - The initial contacts are as determined fresh each frame by collision detection. + The initial contacts are regenerated from scratch each frame by collision detection. The number of contacts can not be changed, so you cannot add your own contacts. You may however disable contacts using PxContactSet::ignore(). + \param[in,out] pairs The contact pairs that may be modified + \param[in] count Number of contact pairs + @see PxContactModifyPair */ virtual void onContactModify(PxContactModifyPair* const pairs, PxU32 count) = 0; @@ -464,12 +503,13 @@ public: /** \brief Passes modifiable arrays of contacts to the application. - The initial contacts are as determined fresh each frame by collision detection. - + The initial contacts are regenerated from scratch each frame by collision detection. + The number of contacts can not be changed, so you cannot add your own contacts. You may however disable contacts using PxContactSet::ignore(). - @see PxContactModifyPair + \param[in,out] pairs The contact pairs that may be modified + \param[in] count Number of contact pairs */ virtual void onCCDContactModify(PxContactModifyPair* const pairs, PxU32 count) = 0; diff --git a/Source/ThirdParty/PhysX/PxCustomParticleSystemSolverCallback.h b/Source/ThirdParty/PhysX/PxCustomParticleSystemSolverCallback.h new file mode 100644 index 000000000..be66d7f56 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxCustomParticleSystemSolverCallback.h @@ -0,0 +1,105 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_CUSTOM_PARTICLE_SYSTEM_SOLVER_CALLBACK_H +#define PX_CUSTOM_PARTICLE_SYSTEM_SOLVER_CALLBACK_H +/** \addtogroup physics +@{ */ + +#include "foundation/PxSimpleTypes.h" +#include "cudamanager/PxCudaTypes.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +#if PX_VC +#pragma warning(push) +#pragma warning(disable : 4435) +#endif + +class PxGpuParticleSystem; + + +class PxCustomParticleSystemSolverCallback +{ +public: + /** + \brief callback called when the particle solver begins. + + This is called once per frame. It occurs after external forces have been pre-integrated into the particle state. + It is called prior to the particles being reordered by spatial hash index, so state can be accessed in the unsorted buffers only at this stage. This provides an opportunity to add custom + forces and modifications to position or velocity. + + \param [in] gpuParticleSystem A pointer to the GPU particle system. This pointer points to a mirror of the particle system in device memory. + \param [in] dt The time-step. + \param [in] stream The CUDA stream currently being used by the particle system. Additional kernels should either be launched on this stream, or synchronization events should be used to avoid race conditions. + */ + virtual void onBegin(PxGpuParticleSystem* gpuParticleSystem, PxReal dt, CUstream stream) = 0; + + /** + \brief callback called during the iterative particle solve stage. + + This callback will potentially be called multiple times between onBegin and onFinalize. + + \param [in] gpuParticleSystem A pointer to the GPU particle system. This pointer points to a mirror of the particle system in device memory. + \param [in] dt The time-step. + \param [in] stream The CUDA stream currently being used by the particle system. Additional kernels should either be launched on this stream, or synchronization events should be used to avoid race conditions. + */ + virtual void onSolve(PxGpuParticleSystem* gpuParticleSystem, PxReal dt, CUstream stream) = 0; + + /** + \brief callback called after all solver iterations have completed. + + This callback will be called once per frame, after integration has completed. + + \param [in] gpuParticleSystem A pointer to the GPU particle system. This pointer points to a mirror of the particle system in device memory. + \param [in] dt The time-step. + \param [in] stream The CUDA stream currently being used by the particle system. Additional kernels should either be launched on this stream, or synchronization events should be used to avoid race conditions. + */ + virtual void onFinalize(PxGpuParticleSystem* gpuParticleSystem, PxReal dt, CUstream stream) = 0; + + /** + \brief Destructor + */ + virtual ~PxCustomParticleSystemSolverCallback() {} +}; + + +#if PX_VC +#pragma warning(pop) +#endif + + +#if !PX_DOXYGEN +} // namespace physx +#endif + + /** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxDeletionListener.h b/Source/ThirdParty/PhysX/PxDeletionListener.h index 953bd7bd9..310f58363 100644 --- a/Source/ThirdParty/PhysX/PxDeletionListener.h +++ b/Source/ThirdParty/PhysX/PxDeletionListener.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_DELETIONLISTENER -#define PX_PHYSICS_NX_DELETIONLISTENER +#ifndef PX_DELETION_LISTENER_H +#define PX_DELETION_LISTENER_H /** \addtogroup physics @{ */ diff --git a/Source/ThirdParty/PhysX/PxFEMClothFlags.h b/Source/ThirdParty/PhysX/PxFEMClothFlags.h new file mode 100644 index 000000000..43b7b18d6 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxFEMClothFlags.h @@ -0,0 +1,75 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_PHYSICS_FEM_CLOTH_FLAGS_H +#define PX_PHYSICS_FEM_CLOTH_FLAGS_H + +#include "foundation/PxFlags.h" +#include "foundation/PxSimpleTypes.h" + + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +/** +\brief Identifies input and output buffers for PxFEMCloth. +@see PxFEMClothData::readData(), PxFEMClothData::writeData(), PxBuffer. +*/ +struct PxFEMClothData +{ + enum Enum + { + eNONE = 0, + ePOSITION_INVMASS = 1 << 0, + eVELOCITY = 1 << 1, + eREST_POSITION = 1 << 2, + eALL = ePOSITION_INVMASS | eVELOCITY | eREST_POSITION + }; +}; + +typedef PxFlags PxFEMClothDataFlags; + +struct PxFEMClothFlag +{ + enum Enum + { + eDISABLE_SELF_COLLISION = 1 << 0, + eUSE_ISOTROPIC_CLOTH = 1 << 1, // 0: use anistropic model + eUSE_REST_POSITION_FOR_BENDING = 1 << 2 // 0: use zero bending angle + }; +}; + +typedef PxFlags PxFEMClothFlags; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/PxFEMClothMaterial.h b/Source/ThirdParty/PhysX/PxFEMClothMaterial.h new file mode 100644 index 000000000..c1b99cc4d --- /dev/null +++ b/Source/ThirdParty/PhysX/PxFEMClothMaterial.h @@ -0,0 +1,116 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_FEM_CLOTH_MATERIAL_H +#define PX_FEM_CLOTH_MATERIAL_H +/** \addtogroup physics +@{ +*/ + +#include "PxFEMMaterial.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief Material class to represent a set of FEM material properties. + + @see PxPhysics.createFEMClothMaterial + */ + class PxFEMClothMaterial : public PxFEMMaterial + { + public: + + /** + \brief Sets material thickness + + \param[in] thickness Material thickness. + + @see getThickness + */ + virtual void setThickness(PxReal thickness) = 0; + + /** + \brief Retrieves the material thickness. + \return thickness. + + @see setDamping() + */ + virtual PxReal getThickness() const = 0; + + /** + \brief Sets the elasticity damping for the internal cloth solver. + + \param[in] damping The elasticity damping term. Range: [0.0, Inf) + + @see getElasticityDamping() + */ + virtual void setElasticityDamping(PxReal damping) = 0; + + /** + \brief Retrieves the elasticity damping term. + \return The elasticity damping term. + + @see setElasticityDamping() + */ + virtual PxReal getElasticityDamping() const = 0; + + /** + \brief Sets the bending coefficient for bending constraints. + + \param[in] damping The bending coefficient. Range: [0.0, Inf) + + @see getBendingDamping() + */ + virtual void setBendingDamping(PxReal damping) = 0; + + /** + \brief Retrieves the bending coefficient for bending constraints. + \return The bending coefficient. + + @see setBendingDamping() + */ + virtual PxReal getBendingDamping() const = 0; + + virtual const char* getConcreteTypeName() const { return "PxFEMClothMaterial"; } + + protected: + PX_INLINE PxFEMClothMaterial(PxType concreteType, PxBaseFlags baseFlags) : PxFEMMaterial(concreteType, baseFlags) {} + PX_INLINE PxFEMClothMaterial(PxBaseFlags baseFlags) : PxFEMMaterial(baseFlags) {} + virtual ~PxFEMClothMaterial() {} + virtual bool isKindOf(const char* name) const { return !::strcmp("PxFEMClothMaterial", name) || PxRefCounted::isKindOf(name); } + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxFEMMaterial.h b/Source/ThirdParty/PhysX/PxFEMMaterial.h new file mode 100644 index 000000000..1a8142097 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxFEMMaterial.h @@ -0,0 +1,118 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_FEM_MATERIAL_H +#define PX_FEM_MATERIAL_H +/** \addtogroup physics +@{ +*/ + +#include "PxPhysXConfig.h" +#include "PxBaseMaterial.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + class PxScene; + + /** + \brief Material class to represent a set of FEM material properties. + + @see PxPhysics.createFEMSoftBodyMaterial + */ + class PxFEMMaterial : public PxBaseMaterial + { + public: + + /** + \brief Sets young's modulus which defines the body's stiffness + + \param[in] young Young's modulus. Range: [0, PX_MAX_F32) + + @see getYoungsModulus() + */ + virtual void setYoungsModulus(PxReal young) = 0; + + /** + \brief Retrieves the young's modulus value. + + \return The young's modulus value. + + @see setYoungsModulus() + */ + virtual PxReal getYoungsModulus() const = 0; + + /** + \brief Sets the Poisson's ratio which defines the body's volume preservation. Completely incompressible materials have a poisson ratio of 0.5. Its value should not be set to exactly 0.5 because this leads to numerical problems. + + \param[in] poisson Poisson's ratio. Range: [0, 0.5) + + @see getPoissons() + */ + virtual void setPoissons(PxReal poisson) = 0; + + /** + \brief Retrieves the Poisson's ratio. + \return The Poisson's ratio. + + @see setPoissons() + */ + virtual PxReal getPoissons() const = 0; + + /** + \brief Sets the dynamic friction value which defines the strength of resistance when two objects slide relative to each other while in contact. + + \param[in] dynamicFriction The dynamic friction value. Range: [0, PX_MAX_F32) + + @see getDynamicFriction() + */ + virtual void setDynamicFriction(PxReal dynamicFriction) = 0; + + /** + \brief Retrieves the dynamic friction value + \return The dynamic friction value + + @see setDynamicFriction() + */ + virtual PxReal getDynamicFriction() const = 0; + + protected: + PX_INLINE PxFEMMaterial(PxType concreteType, PxBaseFlags baseFlags) : PxBaseMaterial(concreteType, baseFlags) {} + PX_INLINE PxFEMMaterial(PxBaseFlags baseFlags) : PxBaseMaterial(baseFlags) {} + virtual ~PxFEMMaterial() {} + virtual bool isKindOf(const char* name) const { return !::strcmp("PxFEMMaterial", name) || PxBaseMaterial::isKindOf(name); } + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxFEMParameter.h b/Source/ThirdParty/PhysX/PxFEMParameter.h new file mode 100644 index 000000000..25fbafeb0 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxFEMParameter.h @@ -0,0 +1,95 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + + +#ifndef PX_PHYSICS_FEM_PARAMETER_H +#define PX_PHYSICS_FEM_PARAMETER_H + +#include "foundation/PxSimpleTypes.h" + + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief Set of parameters to control the sleeping and collision behavior of FEM based objects + */ + struct PxFEMParameters + { + public: + /** + \brief Velocity damping value. After every timestep the velocity is reduced while the magnitude of the reduction depends on velocityDamping + Default: 0.05 + */ + PxReal velocityDamping; + /** + \brief Threshold that defines the maximal magnitude of the linear motion a fem body can move in one second before it becomes a candidate for sleeping + Default: 0.1 + */ + PxReal settlingThreshold; + /** + \brief Threshold that defines the maximal magnitude of the linear motion a fem body can move in one second such that it can go to sleep in the next frame + Default: 0.05 + */ + PxReal sleepThreshold; + /** + \brief Damping value that damps the motion of bodies that move slow enough to be candidates for sleeping (see settlingThreshold) + Default: 10 + */ + PxReal sleepDamping; + /** + \brief Penetration value that needs to get exceeded before contacts for self collision are generated. Will only have an effect if self collisions are enabled. + Default: 0.1 + */ + PxReal selfCollisionFilterDistance; + /** + \brief Stress threshold to deactivate collision contacts in case the tetrahedron's stress magnitude exceeds the threshold + Default: 0.9 + */ + PxReal selfCollisionStressTolerance; + +#ifndef __CUDACC__ + PxFEMParameters() + { + velocityDamping = 0.05f; + settlingThreshold = 0.1f; + sleepThreshold = 0.05f; + sleepDamping = 10.f; + selfCollisionFilterDistance = 0.1f; + selfCollisionStressTolerance = 0.9f; + } +#endif + }; + +#if !PX_DOXYGEN +} +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/PxFEMSoftBodyMaterial.h b/Source/ThirdParty/PhysX/PxFEMSoftBodyMaterial.h new file mode 100644 index 000000000..ad856bffa --- /dev/null +++ b/Source/ThirdParty/PhysX/PxFEMSoftBodyMaterial.h @@ -0,0 +1,100 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_FEM_SOFT_BODY_MATERIAL_H +#define PX_FEM_SOFT_BODY_MATERIAL_H +/** \addtogroup physics +@{ +*/ + +#include "PxFEMMaterial.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + class PxScene; + /** + \brief Material class to represent a set of softbody FEM material properties. + + @see PxPhysics.createFEMSoftBodyMaterial + */ + class PxFEMSoftBodyMaterial : public PxFEMMaterial + { + public: + + /** + \brief Sets material velocity damping term + + \param[in] damping Material velocity damping term. Range: [0, PX_MAX_F32)
+ + @see getDamping + */ + virtual void setDamping(PxReal damping) = 0; + + /** + \brief Retrieves velocity damping + \return The velocity damping. + + @see setDamping() + */ + virtual PxReal getDamping() const = 0; + + /** + \brief Sets material damping scale. A scale of 1 corresponds to default damping, a value of 0 will only apply damping to certain motions leading to special effects that look similar to water filled softbodies. + + \param[in] scale Damping scale term. Default: 1 Range: [0, 1] + + @see getDampingScale + */ + virtual void setDampingScale(PxReal scale) = 0; + + /** + \brief Retrieves material damping scale. + \return The damping scale term. + + @see setDamping() + */ + virtual PxReal getDampingScale() const = 0; + + virtual const char* getConcreteTypeName() const { return "PxFEMSoftBodyMaterial"; } + + protected: + PX_INLINE PxFEMSoftBodyMaterial(PxType concreteType, PxBaseFlags baseFlags) : PxFEMMaterial(concreteType, baseFlags) {} + PX_INLINE PxFEMSoftBodyMaterial(PxBaseFlags baseFlags) : PxFEMMaterial(baseFlags) {} + virtual ~PxFEMSoftBodyMaterial() {} + virtual bool isKindOf(const char* name) const { return !::strcmp("PxFEMSoftBodyMaterial", name) || PxFEMMaterial::isKindOf(name); } + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxFLIPMaterial.h b/Source/ThirdParty/PhysX/PxFLIPMaterial.h new file mode 100644 index 000000000..b27d505a7 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxFLIPMaterial.h @@ -0,0 +1,83 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_FLIP_MATERIAL_H +#define PX_FLIP_MATERIAL_H +/** \addtogroup physics +@{ +*/ + +#include "PxParticleMaterial.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + class PxScene; + /** + \brief Material class to represent a set of FLIP particle material properties. + + @see #PxPhysics.createFLIPMaterial() + */ + class PxFLIPMaterial : public PxParticleMaterial + { + public: + /** + \brief Sets viscosity + + \param[in] viscosity Viscosity. Range: [0, PX_MAX_F32) + + @see #getViscosity() + */ + virtual void setViscosity(PxReal viscosity) = 0; + + /** + \brief Retrieves the viscosity value. + + \return The viscosity value. + + @see #setViscosity() + */ + virtual PxReal getViscosity() const = 0; + + virtual const char* getConcreteTypeName() const { return "PxFLIPMaterial"; } + + protected: + PX_INLINE PxFLIPMaterial(PxType concreteType, PxBaseFlags baseFlags) : PxParticleMaterial(concreteType, baseFlags) {} + PX_INLINE PxFLIPMaterial(PxBaseFlags baseFlags) : PxParticleMaterial(baseFlags) {} + virtual ~PxFLIPMaterial() {} + virtual bool isKindOf(const char* name) const { return !::strcmp("PxFLIPMaterial", name) || PxParticleMaterial::isKindOf(name); } + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxFiltering.h b/Source/ThirdParty/PhysX/PxFiltering.h index 91105ca90..16f54e8c5 100644 --- a/Source/ThirdParty/PhysX/PxFiltering.h +++ b/Source/ThirdParty/PhysX/PxFiltering.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_FILTERING -#define PX_PHYSICS_NX_FILTERING +#ifndef PX_FILTERING_H +#define PX_FILTERING_H /** \addtogroup physics @{ */ @@ -459,14 +457,40 @@ struct PxFilterObjectType /** \brief An articulation - @see PxArticulation + @see PxArticulationReducedCoordinate */ eARTICULATION, - //brief internal use only! + /** + \brief A particle system + @see PxParticleSystem + */ + ePARTICLESYSTEM, + + /** + \brief A FEM-based soft body + @see PxSoftBody + */ + eSOFTBODY, + + /** + \brief A FEM-based cloth + \note In development + @see PxFEMCloth + */ + eFEMCLOTH, + + /** + \brief A hair system + \note In development + @see PxHairSystem + */ + eHAIRSYSTEM, + + //! \brief internal use only! eMAX_TYPE_COUNT = 16, - //brief internal use only! + //! \brief internal use only! eUNDEFINED = eMAX_TYPE_COUNT-1 }; }; @@ -532,26 +556,18 @@ PX_INLINE bool PxFilterObjectIsTrigger(PxFilterObjectAttributes attr) return (attr & PxFilterObjectFlag::eTRIGGER) != 0; } - /** -\brief Filter shader to specify handling of collision pairs. +\brief Filter method to specify how a pair of potentially colliding objects should be processed. Collision filtering is a mechanism to specify how a pair of potentially colliding objects should be processed by the simulation. A pair of objects is potentially colliding if the bounding volumes of the two objects overlap. In short, a collision filter decides whether a collision pair should get processed, temporarily ignored or discarded. If a collision pair should get processed, the filter can additionally specify how it should get processed, for instance, whether contacts should get resolved, which callbacks should get invoked or which reports should be sent etc. +The function returns the PxFilterFlag flags and sets the PxPairFlag flags to define what the simulation should do with the given collision pair. \note A default implementation of a filter shader is provided in the PhysX extensions library, see #PxDefaultSimulationFilterShader. -@see PxSceneDesc.filterShader PxSimulationFilterCallback -*/ - -/** -\brief Filter method to specify how a pair of potentially colliding objects should be processed. - -Return the PxFilterFlag flags and set the PxPairFlag flags to define what the simulation should do with the given collision pair. - This methods gets called when: \li The bounding volumes of two objects start to overlap. \li The bounding volumes of two objects overlap and the filter data or filter attributes of one of the objects changed @@ -582,9 +598,8 @@ logic to filter a collision pair then use the filter callback mechanism for this \return Filter flags defining whether the pair should be discarded, temporarily ignored, processed and whether the filter callback should get invoked for this pair. -@see PxSimulationFilterCallback PxFilterData PxFilterObjectAttributes PxFilterFlag PxFilterFlags PxPairFlag PxPairFlags +@see PxSimulationFilterCallback PxFilterData PxFilterObjectAttributes PxFilterFlag PxFilterFlags PxPairFlag PxPairFlags PxSceneDesc.filterShader */ - typedef PxFilterFlags (*PxSimulationFilterShader) (PxFilterObjectAttributes attributes0, PxFilterData filterData0, PxFilterObjectAttributes attributes1, PxFilterData filterData1, @@ -701,7 +716,7 @@ struct PxPairFilteringMode enum Enum { /** - Output pair from BP, potentially send to user callbacks, create regular interaction object. + \brief Output pair from BP, potentially send to user callbacks, create regular interaction object. Enable contact pair filtering between kinematic/static or kinematic/kinematic rigid bodies. @@ -713,22 +728,54 @@ struct PxPairFilteringMode eKEEP, /** - Output pair from BP, create interaction marker. Can be later switched to regular interaction. + \brief Output pair from BP, create interaction marker. Can be later switched to regular interaction. */ eSUPPRESS, /** - Don't output pair from BP. Cannot be later switched to regular interaction, needs "resetFiltering" call. + \brief Don't output pair from BP. Cannot be later switched to regular interaction, needs "resetFiltering" call. */ eKILL, /** - Default is eSUPPRESS for compatibility with previous PhysX versions. + \brief Default is eSUPPRESS for compatibility with previous PhysX versions. */ eDEFAULT = eSUPPRESS }; }; +/** +\brief Struct for storing a particle/vertex - rigid filter pair with comparison operators +*/ +struct PxParticleRigidFilterPair +{ + PxU64 mID0; //!< Rigid node index + PxU64 mID1; //!< Particle/vertex id + + PX_CUDA_CALLABLE bool operator<(const PxParticleRigidFilterPair& other) const + { + if(mID0 < other.mID0) + return true; + if(mID0 == other.mID0 && mID1 < other.mID1) + return true; + return false; + } + + PX_CUDA_CALLABLE bool operator>(const PxParticleRigidFilterPair& other) const + { + if(mID0 > other.mID0) + return true; + if(mID0 == other.mID0 && mID1 > other.mID1) + return true; + return false; + } + + PX_CUDA_CALLABLE bool operator==(const PxParticleRigidFilterPair& other) const + { + return (mID0 == other.mID0 && mID1 == other.mID1); + } +}; + #if !PX_DOXYGEN } // namespace physx diff --git a/Source/ThirdParty/PhysX/PxForceMode.h b/Source/ThirdParty/PhysX/PxForceMode.h index 9d425d54e..090136b8a 100644 --- a/Source/ThirdParty/PhysX/PxForceMode.h +++ b/Source/ThirdParty/PhysX/PxForceMode.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_FORCE_MODE -#define PX_PHYSICS_NX_FORCE_MODE +#ifndef PX_FORCE_MODE_H +#define PX_FORCE_MODE_H #include "foundation/PxPreprocessor.h" @@ -51,10 +49,10 @@ struct PxForceMode { enum Enum { - eFORCE, //!< parameter has unit of mass * distance/ time^2, i.e. a force - eIMPULSE, //!< parameter has unit of mass * distance /time - eVELOCITY_CHANGE, //!< parameter has unit of distance / time, i.e. the effect is mass independent: a velocity change. - eACCELERATION //!< parameter has unit of distance/ time^2, i.e. an acceleration. It gets treated just like a force except the mass is not divided out before integration. + eFORCE, //!< parameter has unit of mass * length / time^2, i.e., a force + eIMPULSE, //!< parameter has unit of mass * length / time, i.e., force * time + eVELOCITY_CHANGE, //!< parameter has unit of length / time, i.e., the effect is mass independent: a velocity change. + eACCELERATION //!< parameter has unit of length/ time^2, i.e., an acceleration. It gets treated just like a force except the mass is not divided out before integration. }; }; diff --git a/Source/ThirdParty/PhysX/PxHairSystemFlag.h b/Source/ThirdParty/PhysX/PxHairSystemFlag.h new file mode 100644 index 000000000..06f6b3164 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxHairSystemFlag.h @@ -0,0 +1,74 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_HAIR_SYSTEM_FLAG_H +#define PX_HAIR_SYSTEM_FLAG_H + +#include "PxPhysXConfig.h" +#include "foundation/PxFlags.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief Identifies input and output buffers for PxHairSystem + \see PxHairSystemData::readData(), PxHairSystemData::writeData(), PxBuffer + */ + struct PxHairSystemData + { + enum Enum + { + eNONE = 0, //!< No data specified + ePOSITION_INVMASS = 1 << 0, //!< Specifies the position (first 3 floats) and inverse mass (last float) data (array of PxVec4 * max number of vertices) + eVELOCITY = 1 << 1, //!< Specifies the velocity (first 3 floats) data (array of PxVec4 * max number of vertices) + eALL = ePOSITION_INVMASS | eVELOCITY //!< Specifies everything + }; + }; + typedef PxFlags PxHairSystemDataFlags; + + /** + \brief Binary settings for hair system simulation + */ + struct PxHairSystemFlag + { + enum Enum + { + eDISABLE_SELF_COLLISION = 1 << 0, //!< Determines if self-collision between hair vertices is ignored + eDISABLE_EXTERNAL_COLLISION = 1 << 1, //!< Determines if collision between hair and external bodies is ignored + eDISABLE_TWOSIDED_ATTACHMENT = 1 << 2 //!< Determines if attachment constraint is also felt by body to which the hair is attached + }; + }; + typedef PxFlags PxHairSystemFlags; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/PxImmediateMode.h b/Source/ThirdParty/PhysX/PxImmediateMode.h index f58872308..e63debd91 100644 --- a/Source/ThirdParty/PhysX/PxImmediateMode.h +++ b/Source/ThirdParty/PhysX/PxImmediateMode.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,16 +22,17 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_PHYSICS_IMMEDIATE_MODE -#define PX_PHYSICS_IMMEDIATE_MODE +#ifndef PX_IMMEDIATE_MODE_H +#define PX_IMMEDIATE_MODE_H /** \addtogroup immediatemode @{ */ #include "PxPhysXConfig.h" +#include "foundation/PxMemory.h" #include "solver/PxSolverDefs.h" #include "collision/PxCollisionDefs.h" #include "PxArticulationReducedCoordinate.h" @@ -42,11 +42,28 @@ namespace physx { #endif + class PxCudaContextManager; + class PxBaseTask; + class PxGeometry; + #if !PX_DOXYGEN namespace immediate { #endif + typedef void* PxArticulationHandle; + + /** + \brief Structure to store linear and angular components of spatial vector + */ + struct PxSpatialVector + { + PxVec3 top; + PxReal pad0; + PxVec3 bottom; + PxReal pad1; + }; + /** \brief Structure to store rigid body properties */ @@ -79,7 +96,7 @@ namespace immediate \param [in] index The index of this pair. This is an index from 0-N-1 identifying which pair this relates to from within the array of pairs passed to PxGenerateContacts \return a boolean to indicate if this callback successfully stored the contacts or not. */ - virtual bool recordContacts(const Gu::ContactPoint* contactPoints, const PxU32 nbContacts, const PxU32 index) = 0; + virtual bool recordContacts(const PxContactPoint* contactPoints, const PxU32 nbContacts, const PxU32 index) = 0; virtual ~PxContactRecorder(){} }; @@ -87,12 +104,13 @@ namespace immediate /** \brief Constructs a PxSolverBodyData structure based on rigid body properties. Applies gravity, damping and clamps maximum velocity. \param [in] inRigidData The array rigid body properties - \param [out] outSolverBodyData The array of solverBodyData produced to repreent these bodies + \param [out] outSolverBodyData The array of solverBodyData produced to represent these bodies \param [in] nbBodies The total number of solver bodies to create \param [in] gravity The gravity vector \param [in] dt The timestep + \param [in] gyroscopicForces Indicates whether gyroscopic forces should be integrated */ - PX_C_EXPORT PX_PHYSX_CORE_API void PxConstructSolverBodies(const PxRigidBodyData* inRigidData, PxSolverBodyData* outSolverBodyData, const PxU32 nbBodies, const PxVec3& gravity, const PxReal dt); + PX_C_EXPORT PX_PHYSX_CORE_API void PxConstructSolverBodies(const PxRigidBodyData* inRigidData, PxSolverBodyData* outSolverBodyData, PxU32 nbBodies, const PxVec3& gravity, PxReal dt, bool gyroscopicForces = false); /** \brief Constructs a PxSolverBodyData structure for a static body at a given pose. @@ -118,9 +136,9 @@ namespace immediate infinite mass (static or kinematic). This means that either appending static/kinematic to the end of the array of bodies or placing static/kinematic bodies at before the start body pointer will ensure that the minimum number of batches are produced. */ - PX_C_EXPORT PX_PHYSX_CORE_API PxU32 PxBatchConstraints( const PxSolverConstraintDesc* solverConstraintDescs, const PxU32 nbConstraints, PxSolverBody* solverBodies, const PxU32 nbBodies, + PX_C_EXPORT PX_PHYSX_CORE_API PxU32 PxBatchConstraints( const PxSolverConstraintDesc* solverConstraintDescs, PxU32 nbConstraints, PxSolverBody* solverBodies, PxU32 nbBodies, PxConstraintBatchHeader* outBatchHeaders, PxSolverConstraintDesc* outOrderedConstraintDescs, - Dy::ArticulationV** articulations=NULL, const PxU32 nbArticulations=0); + PxArticulationHandle* articulations=NULL, PxU32 nbArticulations=0); /** \brief Creates a set of contact constraint blocks. Note that, depending the results of PxBatchConstraints, each batchHeader may refer to up to 4 solverConstraintDescs. @@ -136,56 +154,62 @@ namespace immediate then these pairs will always be solved by bias. \param [in] frictionOffsetThreshold The friction offset threshold. Contacts whose separations are below this threshold can generate friction constraints. \param [in] correlationDistance The correlation distance used by friction correlation to identify whether a friction patch is broken on the grounds of relation separation. + \param [out] Z Temporary buffer for impulse propagation. \return a boolean to define if this method was successful or not. */ - PX_C_EXPORT PX_PHYSX_CORE_API bool PxCreateContactConstraints(PxConstraintBatchHeader* batchHeaders, const PxU32 nbHeaders, PxSolverContactDesc* contactDescs, - PxConstraintAllocator& allocator, const PxReal invDt, const PxReal bounceThreshold, const PxReal frictionOffsetThreshold, const PxReal correlationDistance); + PX_C_EXPORT PX_PHYSX_CORE_API bool PxCreateContactConstraints(PxConstraintBatchHeader* batchHeaders, PxU32 nbHeaders, PxSolverContactDesc* contactDescs, + PxConstraintAllocator& allocator, PxReal invDt, PxReal bounceThreshold, PxReal frictionOffsetThreshold, PxReal correlationDistance, + PxSpatialVector* Z = NULL); /** \brief Creates a set of joint constraint blocks. Note that, depending the results of PxBatchConstraints, the batchHeader may refer to up to 4 solverConstraintDescs - \param [in] batchHeaders The array of batch headers to be processed - \param [in] nbHeaders The total number of batch headers to process - \param [in] jointDescs An array of constraint prep descs defining the properties of the constraints being created - \param [in] allocator An allocator callback to allocate constraint data - \param [in] dt The timestep - \param [in] invDt The inverse timestep + \param [in] batchHeaders The array of batch headers to be processed. + \param [in] nbHeaders The total number of batch headers to process. + \param [in] jointDescs An array of constraint prep descs defining the properties of the constraints being created. + \param [in] allocator An allocator callback to allocate constraint data. + \param [in] dt The timestep. + \param [in] invDt The inverse timestep. + \param [out] Z Temporary buffer for impulse propagation. \return a boolean indicating if this method was successful or not. */ - PX_C_EXPORT PX_PHYSX_CORE_API bool PxCreateJointConstraints(PxConstraintBatchHeader* batchHeaders, const PxU32 nbHeaders, PxSolverConstraintPrepDesc* jointDescs, PxConstraintAllocator& allocator, const PxReal dt, const PxReal invDt); + PX_C_EXPORT PX_PHYSX_CORE_API bool PxCreateJointConstraints(PxConstraintBatchHeader* batchHeaders, PxU32 nbHeaders, PxSolverConstraintPrepDesc* jointDescs, PxConstraintAllocator& allocator, PxSpatialVector* Z, PxReal dt, PxReal invDt); /** \brief Creates a set of joint constraint blocks. This function runs joint shaders defined inside PxConstraint** param, fills in joint row information in jointDescs and then calls PxCreateJointConstraints. - \param [in] batchHeaders The set of batchHeaders to be processed + \param [in] batchHeaders The set of batchHeaders to be processed. \param [in] nbBatchHeaders The number of batch headers to process. - \param [in] constraints The set of constraints to be used to produce constraint rows - \param [in,out] jointDescs An array of constraint prep descs defining the properties of the constraints being created - \param [in] allocator An allocator callback to allocate constraint data - \param [in] dt The timestep - \param [in] invDt The inverse timestep + \param [in] constraints The set of constraints to be used to produce constraint rows. + \param [in,out] jointDescs An array of constraint prep descs defining the properties of the constraints being created. + \param [in] allocator An allocator callback to allocate constraint data. + \param [in] dt The timestep. + \param [in] invDt The inverse timestep. + \param [out] Z Temporary buffer for impulse propagation. \return a boolean indicating if this method was successful or not. @see PxCreateJointConstraints */ - PX_C_EXPORT PX_PHYSX_CORE_API bool PxCreateJointConstraintsWithShaders(PxConstraintBatchHeader* batchHeaders, const PxU32 nbBatchHeaders, PxConstraint** constraints, PxSolverConstraintPrepDesc* jointDescs, PxConstraintAllocator& allocator, const PxReal dt, const PxReal invDt); + PX_C_EXPORT PX_PHYSX_CORE_API bool PxCreateJointConstraintsWithShaders(PxConstraintBatchHeader* batchHeaders, PxU32 nbBatchHeaders, PxConstraint** constraints, PxSolverConstraintPrepDesc* jointDescs, PxConstraintAllocator& allocator, PxReal dt, PxReal invDt, PxSpatialVector* Z = NULL); struct PxImmediateConstraint { PxConstraintSolverPrep prep; const void* constantBlock; }; + /** \brief Creates a set of joint constraint blocks. This function runs joint shaders defined inside PxImmediateConstraint* param, fills in joint row information in jointDescs and then calls PxCreateJointConstraints. - \param [in] batchHeaders The set of batchHeaders to be processed + \param [in] batchHeaders The set of batchHeaders to be processed. \param [in] nbBatchHeaders The number of batch headers to process. - \param [in] constraints The set of constraints to be used to produce constraint rows - \param [in,out] jointDescs An array of constraint prep descs defining the properties of the constraints being created - \param [in] allocator An allocator callback to allocate constraint data - \param [in] dt The timestep - \param [in] invDt The inverse timestep + \param [in] constraints The set of constraints to be used to produce constraint rows. + \param [in,out] jointDescs An array of constraint prep descs defining the properties of the constraints being created. + \param [in] allocator An allocator callback to allocate constraint data. + \param [in] dt The timestep. + \param [in] invDt The inverse timestep. + \param [out] Z Temporary buffer for impulse propagation. \return a boolean indicating if this method was successful or not. @see PxCreateJointConstraints */ - PX_C_EXPORT PX_PHYSX_CORE_API bool PxCreateJointConstraintsWithImmediateShaders(PxConstraintBatchHeader* batchHeaders, const PxU32 nbBatchHeaders, PxImmediateConstraint* constraints, PxSolverConstraintPrepDesc* jointDescs, PxConstraintAllocator& allocator, const PxReal dt, const PxReal invDt); + PX_C_EXPORT PX_PHYSX_CORE_API bool PxCreateJointConstraintsWithImmediateShaders(PxConstraintBatchHeader* batchHeaders, PxU32 nbBatchHeaders, PxImmediateConstraint* constraints, PxSolverConstraintPrepDesc* jointDescs, PxConstraintAllocator& allocator, PxReal dt, PxReal invDt, PxSpatialVector* Z = NULL); /** \brief Iteratively solves the set of constraints defined by the provided PxConstraintBatchHeader and PxSolverConstraintDesc structures. Updates deltaVelocities inside the PxSolverBody structures. Produces resulting linear and angular motion velocities. @@ -202,10 +226,12 @@ namespace immediate \param [in] invDt Inverse timestep. Only needed if articulations are sent to the function. \param [in] nbSolverArticulations Number of articulations to solve constraints for. \param [in] solverArticulations Array of articulations to solve constraints for. + \param [out] Z Temporary buffer for impulse propagation + \param [out] deltaV Temporary buffer for velocity change */ - PX_C_EXPORT PX_PHYSX_CORE_API void PxSolveConstraints(const PxConstraintBatchHeader* batchHeaders, const PxU32 nbBatchHeaders, const PxSolverConstraintDesc* solverConstraintDescs, - const PxSolverBody* solverBodies, PxVec3* linearMotionVelocity, PxVec3* angularMotionVelocity, const PxU32 nbSolverBodies, const PxU32 nbPositionIterations, const PxU32 nbVelocityIterations, - const float dt=0.0f, const float invDt=0.0f, const PxU32 nbSolverArticulations=0, Dy::ArticulationV** solverArticulations=NULL); + PX_C_EXPORT PX_PHYSX_CORE_API void PxSolveConstraints(const PxConstraintBatchHeader* batchHeaders, PxU32 nbBatchHeaders, const PxSolverConstraintDesc* solverConstraintDescs, + const PxSolverBody* solverBodies, PxVec3* linearMotionVelocity, PxVec3* angularMotionVelocity, PxU32 nbSolverBodies, PxU32 nbPositionIterations, PxU32 nbVelocityIterations, + float dt=0.0f, float invDt=0.0f, PxU32 nbSolverArticulations=0, PxArticulationHandle* solverArticulations=NULL, PxSpatialVector* Z = NULL, PxSpatialVector* deltaV = NULL); /** \brief Integrates a rigid body, returning the new velocities and transforms. After this function has been called, solverBodyData stores all the body's velocity data. @@ -217,10 +243,10 @@ namespace immediate \param [in] nbBodiesToIntegrate The total number of bodies to integrate \param [in] dt The timestep */ - PX_C_EXPORT PX_PHYSX_CORE_API void PxIntegrateSolverBodies(PxSolverBodyData* solverBodyData, PxSolverBody* solverBody, const PxVec3* linearMotionVelocity, const PxVec3* angularMotionState, const PxU32 nbBodiesToIntegrate, const PxReal dt); + PX_C_EXPORT PX_PHYSX_CORE_API void PxIntegrateSolverBodies(PxSolverBodyData* solverBodyData, PxSolverBody* solverBody, const PxVec3* linearMotionVelocity, const PxVec3* angularMotionState, PxU32 nbBodiesToIntegrate, PxReal dt); /** - \brief Performs contact generation for a given pair of geometries at the specified poses. Produced contacts are stored in the provided Gu::ContactBuffer. Information is cached in PxCache structure + \brief Performs contact generation for a given pair of geometries at the specified poses. Produced contacts are stored in the provided contact recorder. Information is cached in PxCache structure to accelerate future contact generation between pairs. This cache data is valid only as long as the memory provided by PxCacheAllocator has not been released/re-used. Recommendation is to retain that data for a single simulation frame, discarding cached data after 2 frames. If the cached memory has been released/re-used prior to the corresponding pair having contact generation performed again, it is the application's responsibility to reset the PxCache. @@ -231,7 +257,7 @@ namespace immediate \param [in] pose1 Array of poses associated with the corresponding entry in the geom1 array \param [in,out] contactCache Array of contact caches associated with each pair geom0[i] + geom1[i] \param [in] nbPairs The total number of pairs to process - \param [in] contactRecorder A callback that is called to record contacts for each pair that detects contacts + \param [out] contactRecorder A callback that is called to record contacts for each pair that detects contacts \param [in] contactDistance The distance at which contacts begin to be generated between the pairs \param [in] meshContactMargin The mesh contact margin. \param [in] toleranceLength The toleranceLength. Used for scaling distance-based thresholds internally to produce appropriate results given simulations in different units @@ -239,8 +265,9 @@ namespace immediate \return a boolean indicating if the function was successful or not. */ - PX_C_EXPORT PX_PHYSX_CORE_API bool PxGenerateContacts(const PxGeometry* const * geom0, const PxGeometry* const * geom1, const PxTransform* pose0, const PxTransform* pose1, PxCache* contactCache, const PxU32 nbPairs, PxContactRecorder& contactRecorder, - const PxReal contactDistance, const PxReal meshContactMargin, const PxReal toleranceLength, PxCacheAllocator& allocator); + PX_C_EXPORT PX_PHYSX_CORE_API bool PxGenerateContacts( const PxGeometry* const * geom0, const PxGeometry* const * geom1, const PxTransform* pose0, const PxTransform* pose1, + PxCache* contactCache, PxU32 nbPairs, PxContactRecorder& contactRecorder, + PxReal contactDistance, PxReal meshContactMargin, PxReal toleranceLength, PxCacheAllocator& allocator); /** \brief Register articulation-related solver functions. This is equivalent to PxRegisterArticulationsReducedCoordinate() for PxScene-level articulations. @@ -250,30 +277,50 @@ namespace immediate */ PX_C_EXPORT PX_PHYSX_CORE_API void PxRegisterImmediateArticulations(); - struct PxArticulationJointData + struct PxArticulationJointDataRC { - PxTransform parentPose; - PxTransform childPose; - }; - - struct PxFeatherstoneArticulationJointData : PxArticulationJointData - { - PxArticulationJointType::Enum type; + PxTransform parentPose; + PxTransform childPose; PxArticulationMotion::Enum motion[PxArticulationAxis::eCOUNT]; PxArticulationLimit limits[PxArticulationAxis::eCOUNT]; PxArticulationDrive drives[PxArticulationAxis::eCOUNT]; PxReal targetPos[PxArticulationAxis::eCOUNT]; PxReal targetVel[PxArticulationAxis::eCOUNT]; + PxReal armature[PxArticulationAxis::eCOUNT]; + PxReal jointPos[PxArticulationAxis::eCOUNT]; + PxReal jointVel[PxArticulationAxis::eCOUNT]; PxReal frictionCoefficient; PxReal maxJointVelocity; + PxArticulationJointType::Enum type; + + void initData() + { + parentPose = PxTransform(PxIdentity); + childPose = PxTransform(PxIdentity); + frictionCoefficient = 0.05f; + maxJointVelocity = 100.0f; + type = PxArticulationJointType::eUNDEFINED; // For root + + for(PxU32 i=0;i PxMPMCuttingFlags; + PX_FLAGS_OPERATORS(PxMPMCuttingFlag::Enum,PxU16) + + class PxScene; + + /** + \brief Material class to represent a set of MPM particle material properties. + + @see PxPhysics.createMPMMaterial + */ + class PxMPMMaterial : public PxParticleMaterial + { + public: + /** + \brief Sets stretch and shear damping which dampens stretch and shear motion of MPM bodies. The effect is comparable to viscosity for fluids. + + \param[in] stretchAndShearDamping The stretch and shear damping + + @see getStretchAndShearDamping() + */ + virtual void setStretchAndShearDamping(PxReal stretchAndShearDamping) = 0; + + /** + \brief Retrieves the stretch and shear damping. + + \return The stretch and shear damping + + @see setStretchAndShearDamping() + */ + virtual PxReal getStretchAndShearDamping() const = 0; + + + /** + \brief Sets the rotational damping which dampens rotations of mpm bodies + + \param[in] rotationalDamping The rotational damping + + @see getRotationalDamping() + */ + virtual void setRotationalDamping(PxReal rotationalDamping) = 0; + + /** + \brief Retrieves the rotational damping. + + \return The rotational damping + + @see setRotationalDamping() + */ + virtual PxReal getRotationalDamping() const = 0; + + + /** + \brief Sets density which influences the body's weight + + \param[in] density The material's density + + @see getDensity() + */ + virtual void setDensity(PxReal density) = 0; + + /** + \brief Retrieves the density value. + + \return The density + + @see setDensity() + */ + virtual PxReal getDensity() const = 0; + + + /** + \brief Sets the material model which influences interaction between MPM particles + + \param[in] materialModel The material model + + @see getMaterialModel() + */ + virtual void setMaterialModel(PxMPMMaterialModel::Enum materialModel) = 0; + + /** + \brief Retrieves the material model. + + \return The material model + + @see setMaterialModel() + */ + virtual PxMPMMaterialModel::Enum getMaterialModel() const = 0; + + + /** + \brief Sets the cutting flags which can enable damage tracking or thin blade support + + \param[in] cuttingFlags The cutting flags + + @see getCuttingFlags() + */ + virtual void setCuttingFlags(PxMPMCuttingFlags cuttingFlags) = 0; + + /** + \brief Retrieves the cutting flags. + + \return The cutting flags + + @see setCuttingFlags() + */ + virtual PxMPMCuttingFlags getCuttingFlags() const = 0; + + + /** + \brief Sets the sand friction angle, only applied if the material model is set to sand + + \param[in] sandFrictionAngle The sand friction angle + + @see getSandFrictionAngle() + */ + virtual void setSandFrictionAngle(PxReal sandFrictionAngle) = 0; + + /** + \brief Retrieves the sand friction angle. + + \return The sand friction angle + + @see setSandFrictionAngle() + */ + virtual PxReal getSandFrictionAngle() const = 0; + + + /** + \brief Sets the yield stress, only applied if the material model is set to Von Mises + + \param[in] yieldStress The yield stress + + @see getYieldStress() + */ + virtual void setYieldStress(PxReal yieldStress) = 0; + + + /** + \brief Retrieves the yield stress. + + \return The yield stress + + @see setYieldStress() + */ + virtual PxReal getYieldStress() const = 0; + + + /** + \brief Set material to plastic + + \param[in] isPlastic True if plastic + + @see getIsPlastic() + */ + virtual void setIsPlastic(bool isPlastic) = 0; + + /** + \brief Returns true if material is plastic + + \return True if plastic + + @see setIsPlastic() + */ + virtual bool getIsPlastic() const = 0; + + /** + \brief Sets Young's modulus which defines the body's stiffness + + \param[in] young Young's modulus. Range: [0, PX_MAX_F32) + + @see getYoungsModulus() + */ + virtual void setYoungsModulus(PxReal young) = 0; + + /** + \brief Retrieves the Young's modulus value. + + \return The Young's modulus value. + + @see setYoungsModulus() + */ + virtual PxReal getYoungsModulus() const = 0; + + /** + \brief Sets Poisson's ratio defines the body's volume preservation. Completely incompressible materials have a Poisson ratio of 0.5 which will lead to numerical problems. + + \param[in] poisson Poisson's ratio. Range: [0, 0.5) + + @see getPoissons() + */ + virtual void setPoissons(PxReal poisson) = 0; + + /** + \brief Retrieves the Poisson's ratio. + \return The Poisson's ratio. + + @see setPoissons() + */ + virtual PxReal getPoissons() const = 0; + + /** + \brief Sets material hardening coefficient + + Tendency to get more rigid under compression. Range: [0, PX_MAX_F32) + + \param[in] hardening Material hardening coefficient. + + @see getHardening + */ + virtual void setHardening(PxReal hardening) = 0; + + /** + \brief Retrieves the hardening coefficient. + + \return The hardening coefficient. + + @see setHardening() + */ + virtual PxReal getHardening() const = 0; + + /** + \brief Sets material critical compression coefficient + + Compression clamping threshold (higher means more compression is allowed before yield). Range: [0, 1) + + \param[in] criticalCompression Material critical compression coefficient. + + @see getCriticalCompression + */ + virtual void setCriticalCompression(PxReal criticalCompression) = 0; + + /** + \brief Retrieves the critical compression coefficient. + + \return The criticalCompression coefficient. + + @see setCriticalCompression() + */ + virtual PxReal getCriticalCompression() const = 0; + + /** + \brief Sets material critical stretch coefficient + + Stretch clamping threshold (higher means more stretching is allowed before yield). Range: [0, 1] + + \param[in] criticalStretch Material critical stretch coefficient. + + @see getCriticalStretch + */ + virtual void setCriticalStretch(PxReal criticalStretch) = 0; + + /** + \brief Retrieves the critical stretch coefficient. + + \return The criticalStretch coefficient. + + @see setCriticalStretch() + */ + virtual PxReal getCriticalStretch() const = 0; + + /** + \brief Sets material tensile damage sensitivity coefficient + + Sensitivity to tensile loads. The higher the sensitivity, the quicker damage will occur under tensile loads. Range: [0, PX_MAX_U32) + + \param[in] tensileDamageSensitivity Material tensile damage sensitivity coefficient. + + @see getTensileDamageSensitivity + */ + virtual void setTensileDamageSensitivity(PxReal tensileDamageSensitivity) = 0; + + /** + \brief Retrieves the tensile damage sensitivity coefficient. + + \return The tensileDamageSensitivity coefficient. + + @see setTensileDamageSensitivity() + */ + virtual PxReal getTensileDamageSensitivity() const = 0; + + /** + \brief Sets material compressive damage sensitivity coefficient + + Sensitivity to compressive loads. The higher the sensitivity, the quicker damage will occur under compressive loads Range: [0, PX_MAX_U32) + + \param[in] compressiveDamageSensitivity Material compressive damage sensitivity coefficient. + + @see getCompressiveDamageSensitivity + */ + virtual void setCompressiveDamageSensitivity(PxReal compressiveDamageSensitivity) = 0; + + /** + \brief Retrieves the compressive damage sensitivity coefficient. + + \return The compressiveDamageSensitivity coefficient. + + @see setCompressiveDamageSensitivity() + */ + virtual PxReal getCompressiveDamageSensitivity() const = 0; + + /** + \brief Sets material attractive force residual coefficient + + Relative amount of attractive force a fully damaged particle can exert on other particles compared to an undamaged one. Range: [0, 1] + + \param[in] attractiveForceResidual Material attractive force residual coefficient. + + @see getAttractiveForceResidual + */ + virtual void setAttractiveForceResidual(PxReal attractiveForceResidual) = 0; + + /** + \brief Retrieves the attractive force residual coefficient. + \return The attractiveForceResidual coefficient. + + @see setAttractiveForceResidual() + */ + virtual PxReal getAttractiveForceResidual() const = 0; + + virtual const char* getConcreteTypeName() const { return "PxMPMMaterial"; } + + protected: + PX_INLINE PxMPMMaterial(PxType concreteType, PxBaseFlags baseFlags) : PxParticleMaterial(concreteType, baseFlags) {} + PX_INLINE PxMPMMaterial(PxBaseFlags baseFlags) : PxParticleMaterial(baseFlags) {} + virtual ~PxMPMMaterial() {} + virtual bool isKindOf(const char* name) const { return !::strcmp("PxMPMMaterial", name) || PxParticleMaterial::isKindOf(name); } + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxMaterial.h b/Source/ThirdParty/PhysX/PxMaterial.h index d6f8685d9..f862dd841 100644 --- a/Source/ThirdParty/PhysX/PxMaterial.h +++ b/Source/ThirdParty/PhysX/PxMaterial.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,19 +22,17 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NXMATERIAL -#define PX_PHYSICS_NXMATERIAL +#ifndef PX_MATERIAL_H +#define PX_MATERIAL_H /** \addtogroup physics @{ */ -#include "PxPhysXConfig.h" -#include "common/PxBase.h" +#include "PxBaseMaterial.h" #if !PX_DOXYGEN namespace physx @@ -55,11 +52,12 @@ struct PxMaterialFlag { /** - If this flag is set, friction computations are always skipped between shapes with this material and any other shape. + \brief If this flag is set, friction computations are always skipped between shapes with this material and any other shape. */ eDISABLE_FRICTION = 1 << 0, /** + \brief Whether to use strong friction. The difference between "normal" and "strong" friction is that the strong friction feature remembers the "friction error" between simulation steps. The friction is a force trying to hold objects in place (or slow them down) and this is handled in the solver. But since the @@ -71,7 +69,7 @@ struct PxMaterialFlag However, in some cases the strong friction could cause problems, and this is why it is possible to disable the strong friction feature by setting this flag. One example is - raycast vehicles, that are sliding fast across the surface, but still need a precise + raycast vehicles that are sliding fast across the surface, but still need a precise steering behavior. It may be a good idea to reenable the strong friction when objects are coming to a rest, to prevent them from slowly creeping down inclines. @@ -80,6 +78,7 @@ struct PxMaterialFlag eDISABLE_STRONG_FRICTION = 1 << 1, /** + \brief Whether to use the patch friction model. This flag only has an effect if PxFrictionType::ePATCH friction model is used. When using the patch friction model, up to 2 friction anchors are generated per patch. As the number of friction anchors @@ -88,9 +87,15 @@ struct PxMaterialFlag as analytical models suggest). This flag causes the normal force to be distributed between the friction anchors such that the total amount of friction applied does not - exceed the analyical results. + exceed the analytical results. */ - eIMPROVED_PATCH_FRICTION = 1 << 2 + eIMPROVED_PATCH_FRICTION = 1 << 2, + + /** + \brief This flag has the effect of enabling an implicit spring model for the normal force computation. + @see PxMaterial.setRestitution, PxMaterial.setDamping + */ + eCOMPLIANT_CONTACT = 1 << 3 }; }; @@ -104,7 +109,7 @@ PX_FLAGS_OPERATORS(PxMaterialFlag::Enum,PxU16) /** -\brief enumeration that determines the way in which two material properties will be combined to yield a friction or restitution coefficient for a collision. +\brief Enumeration that determines the way in which two material properties will be combined to yield a friction or restitution coefficient for a collision. When two actors come in contact with each other, they each have materials with various coefficients, but we only need a single set of coefficients for the pair. @@ -140,34 +145,10 @@ struct PxCombineMode @see PxPhysics.createMaterial */ -class PxMaterial : public PxBase +class PxMaterial : public PxBaseMaterial { public: - /** - \brief Decrements the reference count of a material and releases it if the new reference count is zero. - - @see PxPhysics.createMaterial() - */ - virtual void release() = 0; - - /** - \brief Returns the reference count of the material. - - At creation, the reference count of the material is 1. Every shape referencing this material increments the - count by 1. When the reference count reaches 0, and only then, the material gets destroyed automatically. - - \return the current reference count. - */ - virtual PxU32 getReferenceCount() const = 0; - - /** - \brief Acquires a counted reference to a material. - - This method increases the reference count of the material by 1. Decrement the reference count by calling release() - */ - virtual void acquireReference() = 0; - /** \brief Sets the coefficient of dynamic friction. @@ -179,7 +160,7 @@ public: @see getDynamicFriction() */ - virtual void setDynamicFriction(PxReal coef) = 0; + virtual void setDynamicFriction(PxReal coef) = 0; /** \brief Retrieves the DynamicFriction value. @@ -188,7 +169,7 @@ public: @see setDynamicFriction */ - virtual PxReal getDynamicFriction() const = 0; + virtual PxReal getDynamicFriction() const = 0; /** \brief Sets the coefficient of static friction @@ -201,7 +182,7 @@ public: @see getStaticFriction() */ - virtual void setStaticFriction(PxReal coef) = 0; + virtual void setStaticFriction(PxReal coef) = 0; /** \brief Retrieves the coefficient of static friction. @@ -209,20 +190,24 @@ public: @see setStaticFriction */ - virtual PxReal getStaticFriction() const = 0; + virtual PxReal getStaticFriction() const = 0; /** \brief Sets the coefficient of restitution A coefficient of 0 makes the object bounce as little as possible, higher values up to 1.0 result in more bounce. + This property is overloaded when PxMaterialFlag::eCOMPLIANT_CONTACT flag is enabled. This permits negative values for restitution to be provided. + The negative values are converted into spring stiffness terms for an implicit spring simulated at the contact site, with the spring positional error defined by + the contact separation value. Higher stiffness terms produce stiffer springs that behave more like a rigid contact. + Sleeping: Does NOT wake any actors which may be affected. - \param[in] rest Coefficient of restitution. Range: [0,1] + \param[in] rest Coefficient of restitution. Range: [-INF,1] @see getRestitution() */ - virtual void setRestitution(PxReal rest) = 0; + virtual void setRestitution(PxReal rest) = 0; /** \brief Retrieves the coefficient of restitution. @@ -233,31 +218,65 @@ public: @see setRestitution() */ - virtual PxReal getRestitution() const = 0; + virtual PxReal getRestitution() const = 0; + + + /** + \brief Sets the coefficient of damping + + This property only affects the simulation if PxMaterialFlag::eCOMPLIANT_CONTACT is raised. + Damping works together with spring stiffness (set through a negative restitution value). Spring stiffness corrects positional error while + damping resists relative velocity. Setting a high damping coefficient can produce spongy contacts. + + Sleeping: Does NOT wake any actors which may be affected. + + \param[in] damping Coefficient of damping. Range: [0,INF] + + @see getDamping() + */ + virtual void setDamping(PxReal damping) = 0; + + /** + \brief Retrieves the coefficient of damping. + + See #setDamping. + + \return The coefficient of damping. + + @see setDamping() + */ + virtual PxReal getDamping() const = 0; /** \brief Raises or clears a particular material flag. See the list of flags #PxMaterialFlag + Default: eIMPROVED_PATCH_FRICTION + Sleeping: Does NOT wake any actors which may be affected. - \param[in] flag The PxMaterial flag to raise(set) or clear. + \param[in] flag The PxMaterial flag to raise(set) or clear. + \param[in] b New state of the flag - @see getFlags() PxMaterialFlag + @see getFlags() setFlags() PxMaterialFlag */ - virtual void setFlag(PxMaterialFlag::Enum flag, bool) = 0; - + virtual void setFlag(PxMaterialFlag::Enum flag, bool b) = 0; /** \brief sets all the material flags. See the list of flags #PxMaterialFlag + Default: eIMPROVED_PATCH_FRICTION + Sleeping: Does NOT wake any actors which may be affected. + \param[in] flags All PxMaterial flags + + @see getFlags() setFlag() PxMaterialFlag */ - virtual void setFlags( PxMaterialFlags inFlags ) = 0; + virtual void setFlags(PxMaterialFlags flags) = 0; /** \brief Retrieves the flags. See #PxMaterialFlag. @@ -273,13 +292,15 @@ public: See the enum ::PxCombineMode . + Default: PxCombineMode::eAVERAGE + Sleeping: Does NOT wake any actors which may be affected. \param[in] combMode Friction combine mode to set for this material. See #PxCombineMode. @see PxCombineMode getFrictionCombineMode setStaticFriction() setDynamicFriction() */ - virtual void setFrictionCombineMode(PxCombineMode::Enum combMode) = 0; + virtual void setFrictionCombineMode(PxCombineMode::Enum combMode) = 0; /** \brief Retrieves the friction combine mode. @@ -297,13 +318,15 @@ public: See the enum ::PxCombineMode . + Default: PxCombineMode::eAVERAGE + Sleeping: Does NOT wake any actors which may be affected. \param[in] combMode Restitution combine mode for this material. See #PxCombineMode. @see PxCombineMode getRestitutionCombineMode() setRestitution() */ - virtual void setRestitutionCombineMode(PxCombineMode::Enum combMode) = 0; + virtual void setRestitutionCombineMode(PxCombineMode::Enum combMode) = 0; /** \brief Retrieves the restitution combine mode. @@ -316,17 +339,15 @@ public: */ virtual PxCombineMode::Enum getRestitutionCombineMode() const = 0; - //public variables: - void* userData; //!< user can assign this to whatever, usually to create a 1:1 relationship with a user object. - - virtual const char* getConcreteTypeName() const { return "PxMaterial"; } + // PxBase + virtual const char* getConcreteTypeName() const PX_OVERRIDE { return "PxMaterial"; } + //~PxBase protected: - PX_INLINE PxMaterial(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags), userData(NULL) {} - PX_INLINE PxMaterial(PxBaseFlags baseFlags) : PxBase(baseFlags) {} - virtual ~PxMaterial() {} - virtual bool isKindOf(const char* name) const { return !::strcmp("PxMaterial", name) || PxBase::isKindOf(name); } - + PX_INLINE PxMaterial(PxType concreteType, PxBaseFlags baseFlags) : PxBaseMaterial(concreteType, baseFlags) {} + PX_INLINE PxMaterial(PxBaseFlags baseFlags) : PxBaseMaterial(baseFlags) {} + virtual ~PxMaterial() {} + virtual bool isKindOf(const char* name) const { return !::strcmp("PxMaterial", name) || PxBaseMaterial::isKindOf(name); } }; #if !PX_DOXYGEN diff --git a/Source/ThirdParty/PhysX/PxNodeIndex.h b/Source/ThirdParty/PhysX/PxNodeIndex.h new file mode 100644 index 000000000..dda4d6b48 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxNodeIndex.h @@ -0,0 +1,89 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_NODEINDEX_H +#define PX_NODEINDEX_H + +#include "foundation/PxSimpleTypes.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +#define PX_INVALID_NODE 0xFFFFFFFFu + + + /** + \brief PxNodeIndex + + Node index is the unique index for each actor referenced by the island gen. It contains details like + if the actor is an articulation or rigid body. If it is an articulation, the node index also contains + the link index of the rigid body within the articulation. Also, it contains information to detect whether + the rigid body is static body or not + */ + class PxNodeIndex + { + protected: + PxU64 ind; + + public: + + explicit PX_CUDA_CALLABLE PX_FORCE_INLINE PxNodeIndex(PxU32 id, PxU32 articLinkId) : ind((PxU64(id) << 32) | (articLinkId << 1) | 1) + { + } + + explicit PX_CUDA_CALLABLE PX_FORCE_INLINE PxNodeIndex(PxU32 id = PX_INVALID_NODE) : ind((PxU64(id) << 32)) + { + } + + PX_CUDA_CALLABLE PX_FORCE_INLINE PxU32 index() const { return PxU32(ind >> 32); } + PX_CUDA_CALLABLE PX_FORCE_INLINE PxU32 articulationLinkId() const { return PxU32((ind >> 1) & 0x7FFFFFFF); } + PX_CUDA_CALLABLE PX_FORCE_INLINE PxU32 isArticulation() const { return PxU32(ind & 1); } + + PX_CUDA_CALLABLE PX_FORCE_INLINE bool isStaticBody() const { return PxU32(ind >> 32) == PX_INVALID_NODE; } + + PX_CUDA_CALLABLE bool isValid() const { return PxU32(ind >> 32) != PX_INVALID_NODE; } + + PX_CUDA_CALLABLE void setIndices(PxU32 index, PxU32 articLinkId) { ind = ((PxU64(index) << 32) | (articLinkId << 1) | 1); } + + PX_CUDA_CALLABLE void setIndices(PxU32 index) { ind = ((PxU64(index) << 32)); } + + PX_CUDA_CALLABLE bool operator < (const PxNodeIndex& other) const { return ind < other.ind; } + + PX_CUDA_CALLABLE bool operator <= (const PxNodeIndex& other) const { return ind <= other.ind; } + + PX_CUDA_CALLABLE bool operator == (const PxNodeIndex& other) const { return ind == other.ind; } + + PX_CUDA_CALLABLE PxU64 getInd() const { return ind; } + }; +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/PxPBDMaterial.h b/Source/ThirdParty/PhysX/PxPBDMaterial.h new file mode 100644 index 000000000..f58184368 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxPBDMaterial.h @@ -0,0 +1,231 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_PBD_MATERIAL_H +#define PX_PBD_MATERIAL_H +/** \addtogroup physics +@{ +*/ + +#include "PxParticleMaterial.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + class PxScene; + /** + \brief Material class to represent a set of PBD particle material properties. + + @see #PxPhysics.createPBDMaterial + */ + class PxPBDMaterial : public PxParticleMaterial + { + public: + + /** + \brief Sets viscosity + + \param[in] viscosity Viscosity. Range: [0, PX_MAX_F32) + + @see #getViscosity() + */ + virtual void setViscosity(PxReal viscosity) = 0; + + /** + \brief Retrieves the viscosity value. + + \return The viscosity value. + + @see #setViscosity() + */ + virtual PxReal getViscosity() const = 0; + + /** + \brief Sets material vorticity confinement coefficient + + \param[in] vorticityConfinement Material vorticity confinement coefficient. Range: [0, PX_MAX_F32) + + @see #getVorticityConfinement() + */ + virtual void setVorticityConfinement(PxReal vorticityConfinement) = 0; + + /** + \brief Retrieves the vorticity confinement coefficient. + \return The vorticity confinement coefficient. + + @see #setVorticityConfinement() + */ + virtual PxReal getVorticityConfinement() const = 0; + + /** + \brief Sets material surface tension coefficient + + \param[in] surfaceTension Material surface tension coefficient. Range: [0, PX_MAX_F32) + + @see #getSurfaceTension() + */ + virtual void setSurfaceTension(PxReal surfaceTension) = 0; + + /** + \brief Retrieves the surface tension coefficient. + \return The surface tension coefficient. + + @see #setSurfaceTension() + */ + virtual PxReal getSurfaceTension() const = 0; + + /** + \brief Sets material cohesion coefficient + + \param[in] cohesion Material cohesion coefficient. Range: [0, PX_MAX_F32) + + @see #getCohesion() + */ + virtual void setCohesion(PxReal cohesion) = 0; + + /** + \brief Retrieves the cohesion coefficient. + \return The cohesion coefficient. + + @see #setCohesion() + */ + virtual PxReal getCohesion() const = 0; + + /** + \brief Sets material lift coefficient + + \param[in] lift Material lift coefficient. Range: [0, PX_MAX_F32) + + @see #getLift() + */ + virtual void setLift(PxReal lift) = 0; + + /** + \brief Retrieves the lift coefficient. + \return The lift coefficient. + + @see #setLift() + */ + virtual PxReal getLift() const = 0; + + /** + \brief Sets material drag coefficient + + \param[in] drag Material drag coefficient. Range: [0, PX_MAX_F32) + + @see #getDrag() + */ + virtual void setDrag(PxReal drag) = 0; + + /** + \brief Retrieves the drag coefficient. + \return The drag coefficient. + + @see #setDrag() + */ + virtual PxReal getDrag() const = 0; + + /** + \brief Sets the CFL coefficient. + + \param[in] coefficient CFL coefficient. This coefficient scales the CFL term used to limit relative motion between fluid particles. Range: [1.f, PX_MAX_F32) + */ + virtual void setCFLCoefficient(PxReal coefficient) = 0; + + /** + \brief Retrieves the CFL coefficient. + \return The CFL coefficient. + + @see #setCFLCoefficient() + */ + virtual PxReal getCFLCoefficient() const = 0; + + /** + \brief Sets material particle friction scale. This allows the application to scale up/down the frictional effect between particles independent of the friction + coefficient, which also defines frictional behavior between the particle and rigid bodies/soft bodies/cloth etc. + + \param[in] scale particle friction scale. Range: [0, PX_MAX_F32) + + @see #getParticleFrictionScale() + */ + virtual void setParticleFrictionScale(PxReal scale) = 0; + + /** + \brief Retrieves the particle friction scale. + \return The particle friction scale. + + @see #setParticleFrictionScale() + */ + virtual PxReal getParticleFrictionScale() const = 0; + + /** + \brief Sets material particle adhesion scale value. This is the adhesive value between particles defined as a scaled multiple of the adhesion parameter. + + \param[in] adhesion particle adhesion scale value. Range: [0, PX_MAX_F32) + + @see #getParticleAdhesionScale() + */ + virtual void setParticleAdhesionScale(PxReal adhesion) = 0; + + /** + \brief Retrieves the particle adhesion scale value. + \return The particle adhesion scale value. + + @see #setParticleAdhesionScale() + */ + virtual PxReal getParticleAdhesionScale() const = 0; + + virtual const char* getConcreteTypeName() const { return "PxPBDMaterial"; } + + protected: + PX_INLINE PxPBDMaterial(PxType concreteType, PxBaseFlags baseFlags) : PxParticleMaterial(concreteType, baseFlags) {} + PX_INLINE PxPBDMaterial(PxBaseFlags baseFlags) : PxParticleMaterial(baseFlags) {} + virtual ~PxPBDMaterial() {} + virtual bool isKindOf(const char* name) const { return !::strcmp("PxPBDMaterial", name) || PxParticleMaterial::isKindOf(name); } + }; + + class PxCustomMaterial : public PxParticleMaterial + { + public: + + virtual const char* getConcreteTypeName() const { return "PxCustomMaterial"; } + + protected: + PX_INLINE PxCustomMaterial(PxType concreteType, PxBaseFlags baseFlags) : PxParticleMaterial(concreteType, baseFlags) {} + PX_INLINE PxCustomMaterial(PxBaseFlags baseFlags) : PxParticleMaterial(baseFlags) {} + virtual ~PxCustomMaterial() {} + virtual bool isKindOf(const char* name) const { return !::strcmp("PxCustomMaterial", name) || PxParticleMaterial::isKindOf(name); } + }; +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxPBDParticleSystem.h b/Source/ThirdParty/PhysX/PxPBDParticleSystem.h new file mode 100644 index 000000000..33d0ffb11 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxPBDParticleSystem.h @@ -0,0 +1,149 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_PBD_PARTICLE_SYSTEM_H +#define PX_PBD_PARTICLE_SYSTEM_H +/** \addtogroup physics +@{ */ + +#include "foundation/PxSimpleTypes.h" +#include "foundation/PxVec3.h" + +#include "PxParticleSystem.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +#if PX_VC +#pragma warning(push) +#pragma warning(disable : 4435) +#endif + +/** +\brief A particle system that uses the position based dynamics(PBD) solver. + +The position based dynamics solver for particle systems supports behaviors like +fluid, cloth, inflatables etc. + +*/ +class PxPBDParticleSystem : public PxParticleSystem +{ +public: + + virtual ~PxPBDParticleSystem() {} + + /** + \brief Set wind direction and intensity + + \param[in] wind The wind direction and intensity + */ + virtual void setWind(const PxVec3& wind) = 0; + + /** + \brief Retrieves the wind direction and intensity. + + \return The wind direction and intensity + */ + virtual PxVec3 getWind() const = 0; + + /** + \brief Set the fluid boundary density scale + + Defines how strong of a contribution the boundary (typically a rigid surface) should have on a fluid particle's density. + + \param[in] fluidBoundaryDensityScale Range: (0.0, 1.0) + */ + virtual void setFluidBoundaryDensityScale(PxReal fluidBoundaryDensityScale) = 0; + + /** + \brief Return the fluid boundary density scale + \return the fluid boundary density scale + + See #setFluidBoundaryDensityScale() + */ + virtual PxReal getFluidBoundaryDensityScale() const = 0; + + /** + \brief Set the fluid rest offset + + Two fluid particles will come to rest at a distance equal to twice the fluidRestOffset value. + + \param[in] fluidRestOffset Range: (0, particleContactOffset) + */ + virtual void setFluidRestOffset(PxReal fluidRestOffset) = 0; + + /** + \brief Return the fluid rest offset + \return the fluid rest offset + + See #setFluidRestOffset() + */ + virtual PxReal getFluidRestOffset() const = 0; + + /** + \brief Set the particle system grid size x dimension + + \param[in] gridSizeX x dimension in the particle grid + */ + virtual void setGridSizeX(PxU32 gridSizeX) = 0; + + /** + \brief Set the particle system grid size y dimension + + \param[in] gridSizeY y dimension in the particle grid + */ + virtual void setGridSizeY(PxU32 gridSizeY) = 0; + + /** + \brief Set the particle system grid size z dimension + + \param[in] gridSizeZ z dimension in the particle grid + */ + virtual void setGridSizeZ(PxU32 gridSizeZ) = 0; + + virtual const char* getConcreteTypeName() const PX_OVERRIDE { return "PxPBDParticleSystem"; } + +protected: + PX_INLINE PxPBDParticleSystem(PxType concreteType, PxBaseFlags baseFlags) : PxParticleSystem(concreteType, baseFlags) {} + PX_INLINE PxPBDParticleSystem(PxBaseFlags baseFlags) : PxParticleSystem(baseFlags) {} + virtual bool isKindOf(const char* name) const PX_OVERRIDE { return !::strcmp("PxPBDParticleSystem", name) || PxParticleSystem::isKindOf(name); } +}; + +#if PX_VC +#pragma warning(pop) +#endif + + +#if !PX_DOXYGEN +} // namespace physx +#endif + + /** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxParticleBuffer.h b/Source/ThirdParty/PhysX/PxParticleBuffer.h new file mode 100644 index 000000000..7b23068d7 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxParticleBuffer.h @@ -0,0 +1,608 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_PARTICLE_BUFFER_H +#define PX_PARTICLE_BUFFER_H +/** \addtogroup physics +@{ */ + +#include "common/PxBase.h" +#include "common/PxPhysXCommonConfig.h" +#include "common/PxTypeInfo.h" + +#include "PxParticleSystemFlag.h" + +#include "foundation/PxBounds3.h" +#include "foundation/PxSimpleTypes.h" +#include "foundation/PxVec4.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +#if PX_VC +#pragma warning(push) +#pragma warning(disable : 4435) +#endif + +class PxCudaContextManager; +struct PxParticleRigidFilterPair; +struct PxParticleRigidAttachment; + +/** +\brief Particle volume structure. Used to track the bounding volume of a user-specified set of particles. The particles are required +to be laid out contiguously within the same PxParticleBuffer. +*/ +PX_ALIGN_PREFIX(16) +struct PxParticleVolume +{ + PxBounds3 bound; //!< The current bounds of the particles contained in this #PxParticleVolume. + PxU32 particleIndicesOffset; //!< The index into the particle list of the #PxParticleBuffer for the first particle of this volume. + PxU32 numParticles; //!< The number of particles contained in this #PxParticleVolume. +} PX_ALIGN_SUFFIX(16); + + +/** +\brief The shared base class for all particle buffers, can be instantiated directly to simulate granular and fluid particles. + +See #PxPhysics::createParticleBuffer. + +A particle buffer is a container that specifies per-particle attributes of a set of particles that will be used during the simulation +of a particle system. It exposes direct access to the underlying GPU buffers and is independent of the scene and particle system. Particle +buffers can be added/removed from a particle system at any time between simulation steps, and transferred from one particle system to another. +*/ +class PxParticleBuffer : public PxBase +{ +public: + + /** + \brief Get positions and inverse masses for this particle buffer. + \return A pointer to a device buffer containing the positions and inverse mass packed as PxVec4(pos.x, pos.y, pos.z, inverseMass). + */ + virtual PxVec4* getPositionInvMasses() const = 0; + + /** + \brief Get velocities for this particle buffer. + \return A pointer to a device buffer containing the velocities packed as PxVec4(vel.x, vel.y, vel.z, 0.0f). + */ + virtual PxVec4* getVelocities() const = 0; + + /** + \brief Get phases for this particle buffer. + + See #PxParticlePhase + + \return A pointer to a device buffer containing the per-particle phases for this particle buffer. + */ + virtual PxU32* getPhases() const = 0; + + /** + \brief Get particle volumes for this particle buffer. + + See #PxParticleVolume + + \return A pointer to a device buffer containing the #PxParticleVolume s for this particle buffer. + */ + virtual PxParticleVolume* getParticleVolumes() const = 0; + + /** + \brief Set the number of active particles for this particle buffer. + \param[in] nbActiveParticles The number of active particles. + + The number of active particles can be <= PxParticleBuffer::getMaxParticles(). The particle system will simulate the first + x particles in the #PxParticleBuffer, where x is the number of active particles. + */ + virtual void setNbActiveParticles(PxU32 nbActiveParticles) = 0; + + /** + \brief Get the number of active particles for this particle buffer. + \return The number of active particles. + */ + virtual PxU32 getNbActiveParticles() const = 0; + + /** + \brief Get the maximum number particles this particle buffer can hold. + + The maximum number of particles is specified when creating a #PxParticleBuffer. See #PxPhysics::createParticleBuffer. + + \return The maximum number of particles. + */ + virtual PxU32 getMaxParticles() const = 0; + + /** + \brief Get the number of particle volumes in this particle buffer. + \return The number of #PxParticleVolume s for this particle buffer. + */ + virtual PxU32 getNbParticleVolumes() const = 0; + + /** + \brief Set the number of #PxParticleVolume s for this particle buffer. + \param[in] nbParticleVolumes The number of particle volumes in this particle buffer. + */ + virtual void setNbParticleVolumes(PxU32 nbParticleVolumes) = 0; + + /** + \brief Get the maximum number of particle volumes this particle buffer can hold. + + See #PxParticleVolume. + + \return The maximum number of particle volumes this particle buffer can hold. + */ + virtual PxU32 getMaxParticleVolumes() const = 0; + + /** + \brief Set the #PxParticleRigidFilterPair s for collision filtering of particles in this buffer with rigid bodies. + + See #PxParticleRigidFilterPair + + \param[in] filters A device buffer containing #PxParticleRigidFilterPair s. + \param[in] nbFilters The number of particle-rigid body collision filtering pairs. + */ + virtual void setRigidFilters(PxParticleRigidFilterPair* filters, PxU32 nbFilters) = 0; + + /** + \brief Set the particle-rigid body attachments for particles in this particle buffer. + + See #PxParticleRigidAttachment + + \param[in] attachments A device buffer containing #PxParticleRigidAttachment s. + \param[in] nbAttachments The number of particle-rigid body attachments. + */ + virtual void setRigidAttachments(PxParticleRigidAttachment* attachments, PxU32 nbAttachments) = 0; + + /** + \brief Get the start index for the first particle of this particle buffer in the complete list of + particles of the particle system this buffer is used in. + + The return value is only correct if the particle buffer is assigned to a particle system and at least + one call to simulate() has been performed. + + \return The index of the first particle in the complete particle list. + */ + virtual PxU32 getFlatListStartIndex() const = 0; + + /** + \brief Raise dirty flags on this particle buffer to communicate that the corresponding data has been updated + by the user. + \param[in] flags The flag corresponding to the data that is dirty. + + See #PxParticleBufferFlag. + */ + virtual void raiseFlags(PxParticleBufferFlag::Enum flags) = 0; + + /** + \brief Release this buffer and deallocate all the memory. + */ + virtual void release() = 0; + + /** + \brief Cleanup helper used in case a particle system is released before the particle buffers have been removed. + */ + virtual void onParticleSystemDestroy() = 0; + + /** + \brief Reserved for internal use. + */ + virtual void setInternalData(void* data) = 0; + + /** + \brief Index of this buffer in the particle system it is assigned to. + */ + PxU32 bufferIndex; + + /** + \brief Unique index that does not change over the lifetime of a PxParticleBuffer. + */ + const PxU32 bufferUniqueId; + +protected: + + virtual ~PxParticleBuffer() { } + PX_INLINE PxParticleBuffer(PxU32 uniqueId) : PxBase(PxConcreteType::ePARTICLE_BUFFER, PxBaseFlag::eOWNS_MEMORY | PxBaseFlag::eIS_RELEASABLE), bufferIndex(0xffffffff), bufferUniqueId(uniqueId){} + PX_INLINE PxParticleBuffer(PxU32 uniqueId, PxType type) : PxBase(type, PxBaseFlag::eOWNS_MEMORY | PxBaseFlag::eIS_RELEASABLE), bufferIndex(0xffffffff), bufferUniqueId(uniqueId){} + +private: + PX_NOCOPY(PxParticleBuffer) +}; + +/** +\brief Parameters to configure the behavior of diffuse particles +*/ +class PxDiffuseParticleParams +{ +public: + /** + \brief Construct parameters with default values. + */ + PX_INLINE PxDiffuseParticleParams() + { + threshold = 100.0f; + lifetime = 5.0f; + airDrag = 0.0f; + bubbleDrag = 0.5f; + buoyancy = 0.8f; + kineticEnergyWeight = 0.01f; + pressureWeight = 1.0f; + divergenceWeight = 5.0f; + collisionDecay = 0.5f; + useAccurateVelocity = false; + } + + /** + \brief (re)sets the structure to the default. + */ + PX_INLINE void setToDefault() + { + *this = PxDiffuseParticleParams(); + } + + PxReal threshold; //!< Particles with potential value greater than the threshold will spawn diffuse particles + PxReal lifetime; //!< Diffuse particle will be removed after the specified lifetime + PxReal airDrag; //!< Air drag force factor for spray particles + PxReal bubbleDrag; //!< Fluid drag force factor for bubble particles + PxReal buoyancy; //!< Buoyancy force factor for bubble particles + PxReal kineticEnergyWeight; //!< Contribution from kinetic energy when deciding diffuse particle creation. + PxReal pressureWeight; //!< Contribution from pressure when deciding diffuse particle creation. + PxReal divergenceWeight; //!< Contribution from divergence when deciding diffuse particle creation. + PxReal collisionDecay; //!< Decay factor of diffuse particles' lifetime after they collide with shapes. + bool useAccurateVelocity; //!< If true, enables accurate velocity estimation when using PBD solver. +}; + +/** +\brief A particle buffer used to simulate diffuse particles. + +See #PxPhysics::createParticleAndDiffuseBuffer. +*/ +class PxParticleAndDiffuseBuffer : public PxParticleBuffer +{ +public: + + /** + \brief Get a device buffer of positions and remaining lifetimes for the diffuse particles. + \return A device buffer containing positions and lifetimes of diffuse particles packed as PxVec4(pos.x, pos.y, pos.z, lifetime). + */ + virtual PxVec4* getDiffusePositionLifeTime() const = 0; + + /** + \brief Get number of currently active diffuse particles. + \return The number of currently active diffuse particles. + */ + virtual PxU32 getNbActiveDiffuseParticles() const = 0; + + /** + \brief Set the maximum possible number of diffuse particles for this buffer. + \param[in] maxActiveDiffuseParticles the maximum number of active diffuse particles. + + \note Must be in the range [0, PxParticleAndDiffuseBuffer::getMaxDiffuseParticles()] + */ + virtual void setMaxActiveDiffuseParticles(PxU32 maxActiveDiffuseParticles) = 0; + + /** + \brief Get maximum possible number of diffuse particles. + \return The maximum possible number diffuse particles. + */ + virtual PxU32 getMaxDiffuseParticles() const = 0; + + /** + \brief Set the parameters for diffuse particle simulation. + \param[in] params The diffuse particle parameters. + + See #PxDiffuseParticleParams + */ + virtual void setDiffuseParticleParams(const PxDiffuseParticleParams& params) = 0; + + /** + \brief Get the parameters currently used for diffuse particle simulation. + \return A PxDiffuseParticleParams structure. + */ + virtual PxDiffuseParticleParams getDiffuseParticleParams() const = 0; + +protected: + + virtual ~PxParticleAndDiffuseBuffer() {} + PX_INLINE PxParticleAndDiffuseBuffer(PxU32 uniqueId) : PxParticleBuffer(uniqueId, PxConcreteType::ePARTICLE_DIFFUSE_BUFFER){} + +private: + PX_NOCOPY(PxParticleAndDiffuseBuffer) +}; + +/** +\brief Holds all the information for a spring constraint between two particles. Used for particle cloth simulation. +*/ +struct PX_ALIGN_PREFIX(8) PxParticleSpring +{ + PxU32 ind0; //!< particle index of first particle + PxU32 ind1; //!< particle index of second particle + PxReal length; //!< spring length + PxReal stiffness; //!< spring stiffness + PxReal damping; //!< spring damping factor + PxReal pad; //!< padding bytes. +} PX_ALIGN_SUFFIX(8); + +/** +\brief Particle cloth structure. Holds information about a single piece of cloth that is part of a #PxParticleClothBuffer. +*/ +struct PxParticleCloth +{ + PxU32 startVertexIndex; //!< Index of the first particle of this cloth in the position/velocity buffers of the parent #PxParticleClothBuffer + PxU32 numVertices; //!< The number of particles of this piece of cloth + PxReal clothBlendScale; //!< Used internally. + PxReal restVolume; //!< The rest volume of this piece of cloth, used for inflatable simulation. + PxReal pressure; //!< The factor of the rest volume to specify the target volume for this piece of cloth, used for inflatable simulation. + PxU32 startTriangleIndex; //!< The index of the first triangle of this piece of cloth in the triangle list. + PxU32 numTriangles; //!< The number of triangles of this piece of cloth. + + bool operator <= (const PxParticleCloth& other) const { return startVertexIndex <= other.startVertexIndex; } + bool operator >= (const PxParticleCloth& other) const { return startVertexIndex >= other.startVertexIndex; } + bool operator < (const PxParticleCloth& other) const { return startVertexIndex < other.startVertexIndex; } + bool operator > (const PxParticleCloth& other) const { return startVertexIndex > other.startVertexIndex; } + bool operator == (const PxParticleCloth& other) const { return startVertexIndex == other.startVertexIndex; } +}; + +/** +\brief Structure to describe the set of particle cloths in the same #PxParticleClothBuffer. Used an input for the cloth preprocessing. +*/ +struct PxParticleClothDesc +{ + PxParticleClothDesc() : cloths(NULL), triangles(NULL), springs(NULL), restPositions(NULL), + nbCloths(0), nbSprings(0), nbTriangles(0), nbParticles(0) + { + } + + PxParticleCloth* cloths; //!< List of PxParticleCloth s, describes the individual cloths. + PxU32* triangles; //!< List of triangle indices, 3 consecutive PxU32 that map triangle vertices to particles + PxParticleSpring* springs; //!< List of PxParticleSpring s. + PxVec4* restPositions; //!< List of rest positions for all particles + PxU32 nbCloths; //!< The number of cloths in described using this cloth descriptor + PxU32 nbSprings; //!< The number of springs in this cloth descriptor + PxU32 nbTriangles; //!< The number of triangles in this cloth descriptor + PxU32 nbParticles; //!< The number of particles in this cloth descriptor +}; + +/** +\brief Structure to describe the output of the particle cloth preprocessing. Used as an input to specify cloth data for a #PxParticleClothBuffer. +All the pointers point to pinned host memory. + +See #PxParticleClothPreProcessor +*/ +struct PX_PHYSX_CORE_API PxPartitionedParticleCloth +{ + PxU32* accumulatedSpringsPerPartitions; //!< The number of springs in each partition. Size: numPartitions. + PxU32* accumulatedCopiesPerParticles; //!< Start index for each particle in the accumulation buffer. Size: numParticles. + PxU32* remapOutput; //!< Index of the next copy of this particle in the next partition, or in the accumulation buffer. Size: numSprings * 2. + PxParticleSpring* orderedSprings; //!< Springs ordered by partition. Size: numSprings. + PxU32* sortedClothStartIndices; //!< The first particle index into the position buffer of the #PxParticleClothBuffer for each cloth. Cloths are sorted by start particle index. Size: numCloths. + PxParticleCloth* cloths; //!< The #PxParticleCloth s sorted by start particle index. + + PxU32 remapOutputSize; //!< Size of remapOutput. + PxU32 nbPartitions; //!< The number of partitions. + PxU32 nbSprings; //!< The number of springs. + PxU32 nbCloths; //!< The number of cloths. + PxU32 maxSpringsPerPartition; //!< The maximum number of springs in a partition. + + PxCudaContextManager* mCudaManager; //!< A cuda context manager. + + PxPartitionedParticleCloth(); + ~PxPartitionedParticleCloth(); + + /** + \brief allocate all the buffers for this #PxPartitionedParticleCloth. + + \param[in] nbParticles the number of particles this #PxPartitionedParticleCloth will be generated for. + \param[in] cudaManager a cuda context manager. + */ + void allocateBuffers(PxU32 nbParticles, PxCudaContextManager* cudaManager); +}; + +/** +\brief A particle buffer used to simulate particle cloth. + +See #PxPhysics::createParticleClothBuffer. +*/ +class PxParticleClothBuffer : public PxParticleBuffer +{ +public: + + /** + \brief Get rest positions for this particle buffer. + \return A pointer to a device buffer containing the rest positions packed as PxVec4(pos.x, pos.y, pos.z, 0.0f). + */ + virtual PxVec4* getRestPositions() = 0; + + /** + \brief Get the triangle indices for this particle buffer. + \return A pointer to a device buffer containing the triangle indices for this cloth buffer. + */ + virtual PxU32* getTriangles() const = 0; + + /** + \brief Set the number of triangles for this particle buffer. + \param[in] nbTriangles The number of triangles for this particle cloth buffer. + */ + virtual void setNbTriangles(PxU32 nbTriangles) = 0; + + /** + \brief Get the number of triangles for this particle buffer. + \return The number triangles for this cloth buffer. + */ + virtual PxU32 getNbTriangles() const = 0; + + /** + \brief Get the number of springs in this particle buffer. + \return The number of springs in this cloth buffer. + */ + virtual PxU32 getNbSprings() const = 0; + + /** + \brief Get the springs for this particle buffer. + \return A pointer to a device buffer containing the springs for this cloth buffer. + */ + virtual PxParticleSpring* getSprings() = 0; + + /** + \brief Set cloths for this particle buffer. + \param[in] cloths A pointer to a PxPartitionedParticleCloth. + + See #PxPartitionedParticleCloth, #PxParticleClothPreProcessor + */ + virtual void setCloths(PxPartitionedParticleCloth& cloths) = 0; + +protected: + + virtual ~PxParticleClothBuffer() {} + PX_INLINE PxParticleClothBuffer(PxU32 uniqueId) : PxParticleBuffer(uniqueId, PxConcreteType::ePARTICLE_CLOTH_BUFFER) {} + +private: + PX_NOCOPY(PxParticleClothBuffer) +}; + +/** +\brief A particle buffer used to simulate rigid bodies using shape matching with particles. + +See #PxPhysics::createParticleRigidBuffer. +*/ +class PxParticleRigidBuffer : public PxParticleBuffer +{ +public: + /** + \brief Get the particle indices of the first particle for each shape matched rigid body. + \return A device buffer containing the list of particle start indices of each shape matched rigid body. + */ + virtual PxU32* getRigidOffsets() const = 0; + + /** + \brief Get the stiffness coefficients for all shape matched rigid bodies in this buffer. + + Stiffness must be in the range [0, 1]. + + \return A device buffer containing the list of stiffness coefficients for each rigid body. + */ + virtual PxReal* getRigidCoefficients() const = 0; + + /** + \brief Get the local position of each particle relative to the rigid body's center of mass. + \return A pointer to a device buffer containing the local position for each particle. + */ + virtual PxVec4* getRigidLocalPositions() const = 0; + + /** + \brief Get the world-space translations for all rigid bodies in this buffer. + \return A pointer to a device buffer containing the world-space translations for all shape-matched rigid bodies in this buffer. + */ + virtual PxVec4* getRigidTranslations() const = 0; + + /** + \brief Get the world-space rotation of every shape-matched rigid body in this buffer. + + Rotations are specified as quaternions. + + \return A pointer to a device buffer containing the world-space rotation for every shape-matched rigid body in this buffer. + */ + virtual PxVec4* getRigidRotations() const = 0; + + /** + \brief Get the local space normals for each particle relative to the shape of the corresponding rigid body. + + The 4th component of every PxVec4 should be the negative signed distance of the particle inside its shape. + + \return A pointer to a device buffer containing the local-space normals for each particle. + */ + virtual PxVec4* getRigidLocalNormals() const = 0; + + /** + \brief Set the number of shape matched rigid bodies in this buffer. + \param[in] nbRigids The number of shape matched rigid bodies + */ + virtual void setNbRigids(PxU32 nbRigids) = 0; + + /** + \brief Get the number of shape matched rigid bodies in this buffer. + \return The number of shape matched rigid bodies in this buffer. + */ + virtual PxU32 getNbRigids() const = 0; + +protected: + + virtual ~PxParticleRigidBuffer() {} + PX_INLINE PxParticleRigidBuffer(PxU32 uniqueId) : PxParticleBuffer(uniqueId, PxConcreteType::ePARTICLE_RIGID_BUFFER) {} + +private: + PX_NOCOPY(PxParticleRigidBuffer) +}; + +/** +@brief Preprocessor to prepare particle cloths for simulation. + +Preprocessing is done by calling #PxParticleClothPreProcessor::partitionSprings() on an instance of this class. This will allocate the memory in the +output object, partition the springs and fill all the members of the ouput object. The output can then be passed without +any further modifications to #PxParticleClothBuffer::setCloths(). + +See #PxCreateParticleClothPreprocessor, #PxParticleClothDesc, #PxPartitionedParticleCloth +*/ +class PxParticleClothPreProcessor +{ +public: + + /** + \brief Release this object and deallocate all the memory. + */ + virtual void release() = 0; + + /** + \brief Partition the spring constraints for particle cloth simulation. + \param[in] clothDesc Reference to a valid #PxParticleClothDesc. + \param[in] output Reference to a #PxPartitionedParticleCloth object. This is the output of the preprocessing and should be passed to a #PxParticleClothBuffer. + */ + virtual void partitionSprings(const PxParticleClothDesc& clothDesc, PxPartitionedParticleCloth& output) = 0; + +protected: + virtual ~PxParticleClothPreProcessor(){} +}; + + +#if PX_VC +#pragma warning(pop) +#endif + + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** +\brief Create a particle cloth preprocessor. +\param[in] cudaContextManager A cuda context manager. + +See #PxParticleClothDesc, #PxPartitionedParticleCloth. +*/ +PX_C_EXPORT PX_PHYSX_CORE_API physx::PxParticleClothPreProcessor* PX_CALL_CONV PxCreateParticleClothPreProcessor(physx::PxCudaContextManager* cudaContextManager); + + + /** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxParticleGpu.h b/Source/ThirdParty/PhysX/PxParticleGpu.h new file mode 100644 index 000000000..3201d0150 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxParticleGpu.h @@ -0,0 +1,192 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_GPU_PARTICLE_SYSTEM_H +#define PX_GPU_PARTICLE_SYSTEM_H +/** \addtogroup physics +@{ */ + +#include "foundation/PxSimpleTypes.h" +#include "foundation/PxVec3.h" + +#include "PxParticleSystem.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +/** +@brief Common material properties for particles. See #PxParticleMaterial. + +Accessed by either integration or particle-rigid collisions +*/ +struct PxsParticleMaterialData +{ + PxReal friction; // 4 + PxReal damping; // 8 + PxReal adhesion; // 12 + PxReal gravityScale; // 16 + PxReal adhesionRadiusScale; // 20 +}; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#if PX_SUPPORT_GPU_PHYSX + +struct float4; + +PX_CUDA_CALLABLE inline physx::PxU32 PxGetGroup(physx::PxU32 phase) { return phase & physx::PxParticlePhaseFlag::eParticlePhaseGroupMask; } +PX_CUDA_CALLABLE inline bool PxGetFluid(physx::PxU32 phase) { return (phase & physx::PxParticlePhaseFlag::eParticlePhaseFluid) != 0; } +PX_CUDA_CALLABLE inline bool PxGetSelfCollide(physx::PxU32 phase) { return (phase & physx::PxParticlePhaseFlag::eParticlePhaseSelfCollide) != 0; } +PX_CUDA_CALLABLE inline bool PxGetSelfCollideFilter(physx::PxU32 phase) { return (phase & physx::PxParticlePhaseFlag::eParticlePhaseSelfCollideFilter) != 0; } + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +/** +@brief An iterator class to iterate over the neighbors of a particle during particle system simulation. +*/ +class PxNeighborhoodIterator +{ + + const PxU32* PX_RESTRICT mCollisionIndex; //!< Pointer to the current state of the iterator. + PxU32 mMaxParticles; //!< The maximum number of particles of the particle system this iterator is used on. + +public: + PX_CUDA_CALLABLE PxNeighborhoodIterator(const PxU32* PX_RESTRICT collisionIndex, PxU32 maxParticles) : + mCollisionIndex(collisionIndex), mMaxParticles(maxParticles) + { + } + + PX_CUDA_CALLABLE PxU32 getNextIndex() + { + PxU32 result = *mCollisionIndex; + mCollisionIndex += mMaxParticles; + return result; + } + + PX_INLINE PxNeighborhoodIterator(const PxNeighborhoodIterator& params) + { + mCollisionIndex = params.mCollisionIndex; + mMaxParticles = params.mMaxParticles; + } + + PX_INLINE void operator = (const PxNeighborhoodIterator& params) + { + mCollisionIndex = params.mCollisionIndex; + mMaxParticles = params.mMaxParticles; + } +}; + +/** +@brief Structure that holds simulation parameters of a #PxGpuParticleSystem. +*/ +struct PxGpuParticleData +{ + PxVec3 mPeriod; //!< Size of the unit cell for periodic boundary conditions. If 0, the size of the simulation domain is specified by the mGridSize * mParticleContactDistance. + + PxU32 mGridSizeX; //!< Size of the x-dimension of the background simulation grid. Translates to an absolute size of mGridSizeX * mParticleContactDistance. + PxU32 mGridSizeY; //!< Size of the y-dimension of the background simulation grid. Translates to an absolute size of mGridSizeY * mParticleContactDistance. + PxU32 mGridSizeZ; //!< Size of the z-dimension of the background simulation grid. Translates to an absolute size of mGridSizeZ * mParticleContactDistance. + + PxReal mParticleContactDistance; //!< Two particles start interacting if their distance is lower than mParticleContactDistance. + PxReal mParticleContactDistanceInv; //!< 1.f / mParticleContactDistance. + PxReal mParticleContactDistanceSq; //!< mParticleContactDistance * mParticleContactDistance. + + PxU32 mNumParticles; //!< The number of particles in this particle system. + PxU32 mMaxParticles; //!< The maximum number of particles that can be simulated in this particle system. + PxU32 mMaxNeighborhood; //!< The maximum number of particles considered when computing neighborhood based particle interactions. + PxU32 mMaxDiffuseParticles; //!< The maximum number of diffuse particles that can be simulated using this particle system. + PxU32 mNumParticleBuffers; //!< The number of particle buffers that are simulated in this particle system. +}; + +/** +@brief Container class for a GPU particle system. Used to communicate particle system parameters and simulation state +between the internal SDK simulation and the particle system callbacks. + +See #PxParticleSystem, #PxParticleSystemCallback. +*/ +class PxGpuParticleSystem +{ +public: + + /** + @brief Returns the number of cells of the background simulation grid. + + @return PxU32 the number of cells. + */ + PX_FORCE_INLINE PxU32 getNumCells() { return mCommonData.mGridSizeX * mCommonData.mGridSizeY * mCommonData.mGridSizeZ; } + + /* Unsorted particle state buffers */ + float4* mUnsortedPositions_InvMass; //!< GPU pointer to unsorted particle positions and inverse masses. + float4* mUnsortedVelocities; //!< GPU pointer to unsorted particle velocities. + PxU32* mUnsortedPhaseArray; //!< GPU pointer to unsorted particle phase array. See #PxParticlePhase. + + /* Sorted particle state buffers. Sorted by increasing hash value in background grid. */ + float4* mSortedPositions_InvMass; //!< GPU pointer to sorted particle positions + float4* mSortedVelocities; //!< GPU pointer to sorted particle velocities + PxU32* mSortedPhaseArray; //!< GPU pointer to sorted particle phase array + + /* Mappings to/from sorted particle states */ + PxU32* mUnsortedToSortedMapping; //!< GPU pointer to the mapping from unsortedParticle ID to sorted particle ID + PxU32* mSortedToUnsortedMapping; //!< GPU pointer to the mapping from sorted particle ID to unsorted particle ID + + /* Neighborhood information */ + PxU32* mParticleSelfCollisionCount; //!< Per-particle neighborhood count + PxU32* mCollisionIndex; //!< Set of sorted particle indices per neighbor + + PxsParticleMaterialData* mParticleMaterials; //!< GPU pointer to the particle materials used in this particle system. + PxGpuParticleData mCommonData; //!< Structure holding simulation parameters and state for this particle system. See #PxGpuParticleData. + + /** + @brief Get a PxNeighborhoodIterator initialized for usage with this particle system. + + @param particleId An initial particle index for the initialization of the iterator. + + @return An initialized PxNeighborhoodIterator. + */ + PX_CUDA_CALLABLE PxNeighborhoodIterator getIterator(PxU32 particleId) const + { + return PxNeighborhoodIterator(mCollisionIndex + particleId, mCommonData.mMaxParticles); + } +}; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + +/** @} */ +#endif + diff --git a/Source/ThirdParty/PhysX/PxParticleMaterial.h b/Source/ThirdParty/PhysX/PxParticleMaterial.h new file mode 100644 index 000000000..3dd7fa141 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxParticleMaterial.h @@ -0,0 +1,152 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_PARTICLE_MATERIAL_H +#define PX_PARTICLE_MATERIAL_H +/** \addtogroup physics +@{ +*/ + +#include "foundation/PxSimpleTypes.h" + +#include "PxBaseMaterial.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +/** +\brief Material class to represent a set of particle material properties. + +@see #PxPhysics.createPBDMaterial, #PxPhysics.createFLIPMaterial, #PxPhysics.createMPMMaterial +*/ +class PxParticleMaterial : public PxBaseMaterial +{ +public: + + /** + \brief Sets friction + + \param[in] friction Friction. Range: [0, PX_MAX_F32) + + @see #getFriction() + */ + virtual void setFriction(PxReal friction) = 0; + + /** + \brief Retrieves the friction value. + + \return The friction value. + + @see #setFriction() + */ + virtual PxReal getFriction() const = 0; + + /** + \brief Sets velocity damping term + + \param[in] damping Velocity damping term. Range: [0, PX_MAX_F32) + + @see #getDamping + */ + virtual void setDamping(PxReal damping) = 0; + + /** + \brief Retrieves the velocity damping term + \return The velocity damping term. + + @see #setDamping() + */ + virtual PxReal getDamping() const = 0; + + /** + \brief Sets adhesion term + + \param[in] adhesion adhesion coefficient. Range: [0, PX_MAX_F32) + + @see #getAdhesion + */ + virtual void setAdhesion(PxReal adhesion) = 0; + + /** + \brief Retrieves the adhesion term + \return The adhesion term. + + @see #setAdhesion() + */ + virtual PxReal getAdhesion() const = 0; + + /** + \brief Sets gravity scale term + + \param[in] scale gravity scale coefficient. Range: (-PX_MAX_F32, PX_MAX_F32) + + @see #getAdhesion + */ + virtual void setGravityScale(PxReal scale) = 0; + + /** + \brief Retrieves the gravity scale term + \return The gravity scale term. + + @see #setAdhesion() + */ + virtual PxReal getGravityScale() const = 0; + + /** + \brief Sets material adhesion radius scale. This is multiplied by the particle rest offset to compute the fall-off distance + at which point adhesion ceases to operate. + + \param[in] scale Material adhesion radius scale. Range: [0, PX_MAX_F32) + + @see #getAdhesionRadiusScale + */ + virtual void setAdhesionRadiusScale(PxReal scale) = 0; + + /** + \brief Retrieves the adhesion radius scale. + \return The adhesion radius scale. + + @see #setAdhesionRadiusScale() + */ + virtual PxReal getAdhesionRadiusScale() const = 0; + +protected: + PX_INLINE PxParticleMaterial(PxType concreteType, PxBaseFlags baseFlags) : PxBaseMaterial(concreteType, baseFlags) {} + PX_INLINE PxParticleMaterial(PxBaseFlags baseFlags) : PxBaseMaterial(baseFlags) {} + virtual ~PxParticleMaterial() {} + virtual bool isKindOf(const char* name) const { return !::strcmp("PxParticleMaterial", name) || PxBaseMaterial::isKindOf(name); } +}; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxParticleSolverType.h b/Source/ThirdParty/PhysX/PxParticleSolverType.h new file mode 100644 index 000000000..671220ef3 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxParticleSolverType.h @@ -0,0 +1,71 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_PARTICLE_SOLVER_TYPE_H +#define PX_PARTICLE_SOLVER_TYPE_H +/** \addtogroup physics +@{ */ + +#include "foundation/PxPreprocessor.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +#if PX_VC +#pragma warning(push) +#pragma warning(disable : 4435) +#endif + + +/** +\brief Identifies the solver to use for a particle system. +*/ +struct PxParticleSolverType +{ + enum Enum + { + ePBD = 1 << 0, //!< The position based dynamics solver that can handle fluid, granular material, cloth, inflatables etc. See #PxPBDParticleSystem. + eFLIP = 1 << 1, //!< The FLIP fluid solver. See #PxFLIPParticleSystem. + eMPM = 1 << 2, //!< The MPM (material point method) solver that can handle a variety of materials. See #PxMPMParticleSystem. + eCUSTOM = 1 << 3 //!< Custom solver. The user needs to specify the interaction of the particle by providing appropriate functions. Can be used e.g. for molecular dynamics simulations. See #PxCustomParticleSystem. + }; +}; + +#if PX_VC +#pragma warning(pop) +#endif + + +#if !PX_DOXYGEN +} // namespace physx +#endif + + /** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxParticleSystem.h b/Source/ThirdParty/PhysX/PxParticleSystem.h new file mode 100644 index 000000000..0cabdeac6 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxParticleSystem.h @@ -0,0 +1,451 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_PARTICLE_SYSTEM_H +#define PX_PARTICLE_SYSTEM_H +/** \addtogroup physics +@{ */ + +#include "foundation/PxSimpleTypes.h" + +#include "PxActor.h" +#include "PxFiltering.h" +#include "PxParticleSystemFlag.h" + +#include "cudamanager/PxCudaTypes.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +#if PX_VC +#pragma warning(push) +#pragma warning(disable : 4435) +#endif + +class PxCudaContextManager; +class PxGpuParticleSystem; + +class PxParticleAndDiffuseBuffer; +class PxParticleBuffer; +class PxParticleMaterial; + +/** +\brief Container to hold a pair of corresponding device and host pointers. These pointers should point to GPU / CPU mirrors of the same data, but +this is not enforced. +*/ +template +struct PxGpuMirroredPointer +{ + Type* mDevicePtr; + Type* mHostPtr; + + PxGpuMirroredPointer(Type* devicePtr, Type* hostPtr) : mDevicePtr(devicePtr), mHostPtr(hostPtr) { } +}; + +/** +\brief Particle system callback base class to schedule work that should be done before, while or after the particle system updates. +A call to fetchResultsParticleSystem() on the PxScene will synchronize the work such that the caller knows that all tasks of this callback completed. +*/ +class PxParticleSystemCallback +{ +public: + /** + \brief Method gets called when dirty data from the particle system is uploated to the gpu + + \param[in] gpuParticleSystem Pointers to the particle systems gpu data available as host accessible pointer and as gpu accessible pointer + \param[in] stream The stream on which all cuda kernel calls get scheduled for execution. A call to fetchResultsParticleSystem() on the + PxScene will synchronize the work such that the caller knows that the task completed. + */ + virtual void onBegin(const PxGpuMirroredPointer& gpuParticleSystem, CUstream stream) = 0; + + /** + \brief Method gets called when the simulation step of the particle system is performed + + \param[in] gpuParticleSystem Pointers to the particle systems gpu data available as host accessible pointer and as gpu accessible pointer + \param[in] stream The stream on which all cuda kernel calls get scheduled for execution. A call to fetchResultsParticleSystem() on the + PxScene will synchronize the work such that the caller knows that the task completed. + */ + virtual void onAdvance(const PxGpuMirroredPointer& gpuParticleSystem, CUstream stream) = 0; + + /** + \brief Method gets called after the particle system simulation step completed + + \param[in] gpuParticleSystem Pointers to the particle systems gpu data available as host accessible pointer and as gpu accessible pointer + \param[in] stream The stream on which all cuda kernel calls get scheduled for execution. A call to fetchResultsParticleSystem() on the + PxScene will synchronize the work such that the caller knows that the task completed. + */ + virtual void onPostSolve(const PxGpuMirroredPointer& gpuParticleSystem, CUstream stream) = 0; + + /** + \brief Destructor + */ + virtual ~PxParticleSystemCallback() {} +}; + +/** +\brief Flags which control the behaviour of a particle system. + +See #PxParticleSystem::setParticleFlag(), #PxParticleSystem::setParticleFlags(), #PxParticleSystem::getParticleFlags() +*/ +struct PxParticleFlag +{ + enum Enum + { + eDISABLE_SELF_COLLISION = 1 << 0, //!< Disables particle self-collision + eDISABLE_RIGID_COLLISION = 1 << 1, //!< Disables particle-rigid body collision + eFULL_DIFFUSE_ADVECTION = 1 << 2 //!< Enables full advection of diffuse particles. By default, diffuse particles are advected only by particles in the cell they are contained. This flag enables full neighbourhood generation (more expensive). + }; +}; + +typedef PxFlags PxParticleFlags; + +/** +\brief The shared base class for all particle systems + +A particle system simulates a bunch of particles that interact with each other. The interactions can be simple collisions +with friction (granular material) ore more complex like fluid interactions, cloth, inflatables etc. + +*/ +class PxParticleSystem : public PxActor +{ +public: + + /** + \brief Sets the solver iteration counts for the body. + + The solver iteration count determines how accurately joints and contacts are resolved. + If you are having trouble with jointed bodies oscillating and behaving erratically, then + setting a higher position iteration count may improve their stability. + + If intersecting bodies are being depenetrated too violently, increase the number of velocity + iterations. More velocity iterations will drive the relative exit velocity of the intersecting + objects closer to the correct value given the restitution. + + Default: 4 position iterations, 1 velocity iteration + + \param[in] minPositionIters Number of position iterations the solver should perform for this body. Range: [1,255] + \param[in] minVelocityIters Number of velocity iterations the solver should perform for this body. Range: [1,255] + + See #getSolverIterationCounts() + */ + virtual void setSolverIterationCounts(PxU32 minPositionIters, PxU32 minVelocityIters = 1) = 0; + + /** + \brief Retrieves the solver iteration counts. + + See #setSolverIterationCounts() + */ + virtual void getSolverIterationCounts(PxU32& minPositionIters, PxU32& minVelocityIters) const = 0; + + /** + \brief Retrieves the collision filter settings. + + \return The filter data + */ + virtual PxFilterData getSimulationFilterData() const = 0; + + /** + \brief Set collision filter settings + + Allows to control with which objects the particle system collides + + \param[in] data The filter data + */ + virtual void setSimulationFilterData(const PxFilterData& data) = 0; + + /** + \brief Set particle flag + + Allows to control self collision etc. + + \param[in] flag The flag to set + \param[in] val The new value of the flag + */ + virtual void setParticleFlag(PxParticleFlag::Enum flag, bool val) = 0; + + /** + \brief Set particle flags + + Allows to control self collision etc. + + \param[in] flags The flags to set + */ + virtual void setParticleFlags(PxParticleFlags flags) = 0; + + /** + \brief Retrieves the particle flags. + + \return The particle flags + */ + virtual PxParticleFlags getParticleFlags() const = 0; + + /** + \brief Set the maximal depenetration velocity particles can reach + + Allows to limit the particles' maximal depenetration velocity to avoid that collision responses lead to very high particle velocities + + \param[in] maxDepenetrationVelocity The maximal depenetration velocity + */ + virtual void setMaxDepenetrationVelocity(PxReal maxDepenetrationVelocity) = 0; + + /** + \brief Retrieves maximal depenetration velocity a particle can have. + + \return The maximal depenetration velocity + */ + virtual PxReal getMaxDepenetrationVelocity() = 0; + + /** + \brief Set the maximal velocity particles can reach + + Allows to limit the particles' maximal velocity to control the maximal distance a particle can move per frame + + \param[in] maxVelocity The maximal velocity + */ + virtual void setMaxVelocity(PxReal maxVelocity) = 0; + + /** + \brief Retrieves maximal velocity a particle can have. + + \return The maximal velocity + */ + virtual PxReal getMaxVelocity() = 0; + + + /** + \brief Return the cuda context manager + + \return The cuda context manager + */ + virtual PxCudaContextManager* getCudaContextManager() const = 0; + + /** + \brief Set the rest offset for the collision between particles and rigids or soft bodies. + + A particle and a rigid or soft body will come to rest at a distance equal to the sum of their restOffset values. + + \param[in] restOffset Range: (0, contactOffset) + */ + virtual void setRestOffset(PxReal restOffset) = 0; + + /** + \brief Return the rest offset + \return the rest offset + + See #setRestOffset() + */ + virtual PxReal getRestOffset() const = 0; + + /** + \brief Set the contact offset for the collision between particles and rigids or soft bodies + + The contact offset needs to be larger than the rest offset. + Contact constraints are generated for a particle and a rigid or softbody below the distance equal to the sum of their contacOffset values. + + \param[in] contactOffset Range: (restOffset, PX_MAX_F32) + */ + virtual void setContactOffset(PxReal contactOffset) = 0; + + /** + \brief Return the contact offset + \return the contact offset + + See #setContactOffset() + */ + virtual PxReal getContactOffset() const = 0; + + /** + \brief Set the contact offset for the interactions between particles + + The particle contact offset needs to be larger than the fluid rest offset and larger than the solid rest offset. + Interactions for two particles are computed if their distance is below twice the particleContactOffset value. + + \param[in] particleContactOffset Range: (Max(solidRestOffset, fluidRestOffset), PX_MAX_F32) + */ + virtual void setParticleContactOffset(PxReal particleContactOffset) = 0; + + /** + \brief Return the particle contact offset + \return the particle contact offset + + See #setParticleContactOffset() + */ + virtual PxReal getParticleContactOffset() const = 0; + + /** + \brief Set the solid rest offset + + Two solid particles (or a solid and a fluid particle) will come to rest at a distance equal to twice the solidRestOffset value. + + \param[in] solidRestOffset Range: (0, particleContactOffset) + */ + virtual void setSolidRestOffset(PxReal solidRestOffset) = 0; + + /** + \brief Return the solid rest offset + \return the solid rest offset + + See #setSolidRestOffset() + */ + virtual PxReal getSolidRestOffset() const = 0; + + + /** + \brief Creates a rigid attachment between a particle and a rigid actor. + + This method creates a symbolic attachment between the particle system and a rigid body for the purpose of island management. + The actual attachments will be contained in the particle buffers. + + Be aware that destroying the rigid body before destroying the attachment is illegal and may cause a crash. + The particle system keeps track of these attachments but the rigid body does not. + + \param[in] actor The rigid actor used for the attachment + */ + virtual void addRigidAttachment(PxRigidActor* actor) = 0; + + /** + \brief Removes a rigid attachment between a particle and a rigid body. + + This method destroys a symbolic attachment between the particle system and a rigid body for the purpose of island management. + + Be aware that destroying the rigid body before destroying the attachment is illegal and may cause a crash. + The particle system keeps track of these attachments but the rigid body does not. + + \param[in] actor The rigid body actor used for the attachment + */ + virtual void removeRigidAttachment(PxRigidActor* actor) = 0; + + + /** + \brief Enable continuous collision detection for particles + + \param[in] enable Boolean indicates whether continuous collision detection is enabled. + */ + virtual void enableCCD(bool enable) = 0; + + + /** + \brief Creates combined particle flag with particle material and particle phase flags. + + \param[in] material A material instance to associate with the new particle group. + \param[in] flags The particle phase flags. + \return The combined particle group index and phase flags. + + See #PxParticlePhaseFlag + */ + virtual PxU32 createPhase(PxParticleMaterial* material, PxParticlePhaseFlags flags) = 0; + + + /** + \brief Returns number of particle materials + \return The number of particle materials + */ + virtual PxU32 getNbParticleMaterials() const = 0; + + + /** + \brief Sets a user notify object which receives special simulation events when they occur. + + \note Do not set the callback while the simulation is running. Calls to this method while the simulation is running will be ignored. + \note A call to fetchResultsParticleSystem() on the PxScene will synchronize the work such that the caller knows that all worke done in the callback completed. + + \param[in] callback User notification callback. See PxSimulationEventCallback. + + See #PxParticleSystemCallback, #getParticleSystemCallback() + */ + virtual void setParticleSystemCallback(PxParticleSystemCallback* callback) = 0; + + /** + \brief Retrieves the simulationEventCallback pointer set with setSimulationEventCallback(). + \return The current user notify pointer. See PxSimulationEventCallback. + + See #PxParticleSystemCallback, #setParticleSystemCallback() + */ + virtual PxParticleSystemCallback* getParticleSystemCallback() const = 0; + + /** + \brief Sets periodic boundary wrap value + \param[in] boundary The periodic boundary wrap value + + See #getPeriodicBoundary() + */ + virtual void setPeriodicBoundary(const PxVec3& boundary) = 0; + + /** + \brief Gets periodic boundary wrap value + \return boundary The periodic boundary wrap value + + See #setPeriodicBoundary() + */ + virtual PxVec3 getPeriodicBoundary() const = 0; + + /** + \brief Add an existing particle buffer to the particle system. + \param[in] particleBuffer a PxParticleBuffer*. + + See #PxParticleBuffer. + */ + virtual void addParticleBuffer(PxParticleBuffer* particleBuffer) = 0; + + /** + \brief Remove particle buffer from the particle system. + \param[in] particleBuffer a PxParticleBuffer*. + + See #PxParticleBuffer. + */ + virtual void removeParticleBuffer(PxParticleBuffer* particleBuffer) = 0; + + /** + \brief Returns the GPU particle system index. + \return The GPU index, if the particle system is in a scene and PxSceneFlag::eSUPPRESS_READBACK is set, or 0xFFFFFFFF otherwise. + */ + virtual PxU32 getGpuParticleSystemIndex() = 0; + +protected: + + virtual ~PxParticleSystem() {} + + PX_INLINE PxParticleSystem(PxType concreteType, PxBaseFlags baseFlags) : PxActor(concreteType, baseFlags) {} + PX_INLINE PxParticleSystem(PxBaseFlags baseFlags) : PxActor(baseFlags) {} + virtual bool isKindOf(const char* name) const PX_OVERRIDE { return !::strcmp("PxParticleSystem", name) || PxActor::isKindOf(name); } +}; + + +#if PX_VC +#pragma warning(pop) +#endif + + +#if !PX_DOXYGEN +} // namespace physx +#endif + + /** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxParticleSystemFlag.h b/Source/ThirdParty/PhysX/PxParticleSystemFlag.h new file mode 100644 index 000000000..1544e490d --- /dev/null +++ b/Source/ThirdParty/PhysX/PxParticleSystemFlag.h @@ -0,0 +1,101 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_PARTICLE_SYSTEM_FLAG_H +#define PX_PARTICLE_SYSTEM_FLAG_H + +#include "foundation/PxFlags.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +/** +\brief Identifies dirty particle buffers that need to be updated in the particle system. + +This flag can be used mark the device user buffers that are dirty and need to be written to the particle system. +*/ +struct PxParticleBufferFlag +{ + enum Enum + { + eNONE = 0, //!< No data specified + + eUPDATE_POSITION = 1 << 0, //!< Specifies the position (first 3 floats) and inverse mass (last float) data (array of PxVec4 * number of particles) + eUPDATE_VELOCITY = 1 << 1, //!< Specifies the velocity (first 3 floats) data (array of PxVec4 * number of particles) + eUPDATE_PHASE = 1 << 2, //!< Specifies the per-particle phase flag data (array of PxU32 * number of particles) + eUPDATE_RESTPOSITION = 1 << 3, //!< Specifies the rest position (first 3 floats) data for cloth buffers + eUPDATE_CLOTH = 1 << 5, //!< Specifies the cloth buffer (see PxParticleClothBuffer) + eUPDATE_RIGID = 1 << 6, //!< Specifies the rigid buffer (see PxParticleRigidBuffer) + eUPDATE_DIFFUSE_PARAM = 1 << 7, //!< Specifies the diffuse particle parameter buffer (see PxDiffuseParticleParams) + eUPDATE_ATTACHMENTS = 1 << 8, //!< Specifies the attachments. + + eALL = + eUPDATE_POSITION | eUPDATE_VELOCITY | eUPDATE_PHASE | eUPDATE_RESTPOSITION | eUPDATE_CLOTH | eUPDATE_RIGID | eUPDATE_DIFFUSE_PARAM | eUPDATE_ATTACHMENTS + }; +}; + +typedef PxFlags PxParticleBufferFlags; + +/** +\brief A pair of particle buffer unique id and GPU particle system index. + +@see PxScene::applyParticleBufferData +*/ +struct PxGpuParticleBufferIndexPair +{ + PxU32 systemIndex; // gpu particle system index + PxU32 bufferIndex; // particle buffer unique id +}; + +/** +\brief Identifies per-particle behavior for a PxParticleSystem. + +See #PxParticleSystem::createPhase(). +*/ +struct PxParticlePhaseFlag +{ + enum Enum + { + eParticlePhaseGroupMask = 0x000fffff, //!< Bits [ 0, 19] represent the particle group for controlling collisions + eParticlePhaseFlagsMask = 0xfff00000, //!< Bits [20, 23] hold flags about how the particle behave + + eParticlePhaseSelfCollide = 1 << 20, //!< If set this particle will interact with particles of the same group + eParticlePhaseSelfCollideFilter = 1 << 21, //!< If set this particle will ignore collisions with particles closer than the radius in the rest pose, this flag should not be specified unless valid rest positions have been specified using setRestParticles() + eParticlePhaseFluid = 1 << 22 //!< If set this particle will generate fluid density constraints for its overlapping neighbors + }; +}; + +typedef PxFlags PxParticlePhaseFlags; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/PxPhysXConfig.h b/Source/ThirdParty/PhysX/PxPhysXConfig.h index ea329bb25..a27531e40 100644 --- a/Source/ThirdParty/PhysX/PxPhysXConfig.h +++ b/Source/ThirdParty/PhysX/PxPhysXConfig.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX -#define PX_PHYSICS_NX +#ifndef PX_PHYSICS_CONFIG_H +#define PX_PHYSICS_CONFIG_H /** Configuration include file for PhysX SDK */ @@ -44,32 +42,6 @@ namespace physx { #endif -class PxPhysics; -class PxShape; - -class PxActor; -class PxRigidActor; -class PxRigidStatic; -class PxRigidDynamic; -class PxConstraint; -class PxConstraintDesc; - -class PxArticulation; -class PxArticulationReducedCoordinate; -class PxArticulationBase; -class PxArticulationLink; -class PxArticulationJoint; -class PxArticulationJointReducedCoordinate; -class PxArticulationJointBase; - -class PxMaterial; - -class PxScene; -class PxSceneDesc; -class PxTolerancesScale; - -class PxAggregate; - #if !PX_DOXYGEN } // namespace physx #endif diff --git a/Source/ThirdParty/PhysX/PxPhysics.h b/Source/ThirdParty/PhysX/PxPhysics.h index f8efe3f9a..21fe137f1 100644 --- a/Source/ThirdParty/PhysX/PxPhysics.h +++ b/Source/ThirdParty/PhysX/PxPhysics.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_PHYSICS_NX_PHYSICS -#define PX_PHYSICS_NX_PHYSICS +#ifndef PX_PHYSICS_H +#define PX_PHYSICS_H /** \addtogroup physics @{ @@ -38,14 +37,26 @@ #include "PxDeletionListener.h" #include "foundation/PxTransform.h" #include "PxShape.h" +#include "PxAggregate.h" +#include "PxBuffer.h" +#include "PxParticleSystem.h" +#include "foundation/PxPreprocessor.h" +#if PX_ENABLE_FEATURES_UNDER_CONSTRUCTION +#include "PxFEMCloth.h" +#include "PxHairSystem.h" +#endif #if !PX_DOXYGEN namespace physx { #endif +class PxScene; +class PxSceneDesc; +class PxTolerancesScale; class PxPvd; -class PxPhysicsInsertionCallback; +class PxOmniPvd; +class PxInsertionCallback; class PxRigidActor; class PxConstraintConnector; @@ -53,20 +64,28 @@ struct PxConstraintShaderTable; class PxGeometry; class PxFoundation; -class PxSerializationRegistry; class PxPruningStructure; -class PxBVHStructure; +class PxBVH; +/** + * @deprecated + */ +typedef PX_DEPRECATED PxBVH PxBVHStructure; + +class PxParticleClothBuffer; +class PxParticleRigidBuffer; + +class PxSoftBodyMesh; /** \brief Abstract singleton factory class used for instancing objects in the Physics SDK. -In addition you can use PxPhysics to set global parameters which will effect all scenes and create +In addition you can use PxPhysics to set global parameters which will effect all scenes and create objects that can be shared across multiple scenes. You can get an instance of this class by calling PxCreateBasePhysics() or PxCreatePhysics() with pre-registered modules. -@see PxCreatePhysics() PxCreateBasePhysics() PxScene PxVisualizationParameter +@see PxCreatePhysics() PxCreateBasePhysics() PxScene */ class PxPhysics { @@ -75,10 +94,10 @@ public: /** @name Basics */ //@{ - + virtual ~PxPhysics() {} - - /** + + /** \brief Destroys the instance it is called on. Use this release method to destroy an instance of this class. Be sure @@ -86,15 +105,15 @@ public: Avoid release calls while a scene is simulating (in between simulate() and fetchResults() calls). Note that this must be called once for each prior call to PxCreatePhysics, as - there is a reference counter. Also note that you mustn't destroy the allocator or the error callback (if available) until after the - reference count reaches 0 and the SDK is actually removed. + there is a reference counter. Also note that you mustn't destroy the PxFoundation instance (holding the allocator, error callback etc.) + until after the reference count reaches 0 and the SDK is actually removed. - Releasing an SDK will also release any scenes, triangle meshes, convex meshes, heightfields and shapes - created through it, provided the user hasn't already done so. + Releasing an SDK will also release any objects created through it (scenes, triangle meshes, convex meshes, heightfields, shapes etc.), + provided the user hasn't already done so. - \note This function is required to be called to release foundation usage. + \note Releasing the PxPhysics instance is a prerequisite to releasing the PxFoundation instance. - @see PxCreatePhysics() + @see PxCreatePhysics() PxFoundation */ virtual void release() = 0; @@ -102,24 +121,62 @@ public: \brief Retrieves the Foundation instance. \return A reference to the Foundation object. */ - virtual PxFoundation& getFoundation() = 0; - - /** - \brief Creates an aggregate with the specified maximum size and selfCollision property. + virtual PxFoundation& getFoundation() = 0; - \param [in] maxSize The maximum number of actors that may be placed in the aggregate. - \param [in] enableSelfCollision Whether the aggregate supports self-collision + /** + \brief Retrieves the PxOmniPvd instance if there is one registered with PxPhysics. + \return A pointer to a PxOmniPvd object. + */ + virtual PxOmniPvd* getOmniPvd() = 0; + + /** + \brief Creates an aggregate with the specified maximum size and filtering hint. + + The previous API used "bool enableSelfCollision" which should now silently evaluates + to a PxAggregateType::eGENERIC aggregate with its self-collision bit. + + Use PxAggregateType::eSTATIC or PxAggregateType::eKINEMATIC for aggregates that will + only contain static or kinematic actors. This provides faster filtering when used in + combination with PxPairFilteringMode. + + \param [in] maxActor The maximum number of actors that may be placed in the aggregate. + \param [in] maxShape The maximum number of shapes that may be placed in the aggregate. + \param [in] filterHint The aggregate's filtering hint. \return The new aggregate. - @see PxAggregate + @see PxAggregate PxAggregateFilterHint PxAggregateType PxPairFilteringMode */ - virtual PxAggregate* createAggregate(PxU32 maxSize, bool enableSelfCollision) = 0; + virtual PxAggregate* createAggregate(PxU32 maxActor, PxU32 maxShape, PxAggregateFilterHint filterHint) = 0; /** - \brief Returns the simulation tolerance parameters. - \return The current simulation tolerance parameters. + \brief Creates an aggregate with the specified maximum size and filtering hint. + + The previous API used "bool enableSelfCollision" which should now silently evaluates + to a PxAggregateType::eGENERIC aggregate with its self-collision bit. + + Use PxAggregateType::eSTATIC or PxAggregateType::eKINEMATIC for aggregates that will + only contain static or kinematic actors. This provides faster filtering when used in + combination with PxPairFilteringMode. + + \note This variation of the method is not compatible with GPU rigid bodies. + + \param [in] maxActor The maximum number of actors that may be placed in the aggregate. + \param [in] filterHint The aggregate's filtering hint. + \return The new aggregate. + + @see PxAggregate PxAggregateFilterHint PxAggregateType PxPairFilteringMode + @deprecated */ - virtual const PxTolerancesScale& getTolerancesScale() const = 0; + PX_FORCE_INLINE PX_DEPRECATED PxAggregate* createAggregate(PxU32 maxActor, PxAggregateFilterHint filterHint) + { + return createAggregate(maxActor, PX_MAX_U32, filterHint); + } + + /** + \brief Returns the simulation tolerance parameters. + \return The current simulation tolerance parameters. + */ + virtual const PxTolerancesScale& getTolerancesScale() const = 0; //@} /** @name Meshes @@ -136,8 +193,8 @@ public: @see PxTriangleMesh PxMeshPreprocessingFlag PxTriangleMesh.release() PxInputStream PxTriangleMeshFlag */ - virtual PxTriangleMesh* createTriangleMesh(PxInputStream& stream) = 0; - + virtual PxTriangleMesh* createTriangleMesh(PxInputStream& stream) = 0; + /** \brief Return the number of triangle meshes that currently exist. @@ -145,23 +202,76 @@ public: @see getTriangleMeshes() */ - virtual PxU32 getNbTriangleMeshes() const = 0; + virtual PxU32 getNbTriangleMeshes() const = 0; /** \brief Writes the array of triangle mesh pointers to a user buffer. - + Returns the number of pointers written. The ordering of the triangle meshes in the array is not specified. \param [out] userBuffer The buffer to receive triangle mesh pointers. \param [in] bufferSize The number of triangle mesh pointers which can be stored in the buffer. - \param [in] startIndex Index of first mesh pointer to be retrieved + \param [in] startIndex Index of first mesh pointer to be retrieved. \return The number of triangle mesh pointers written to userBuffer, this should be less or equal to bufferSize. @see getNbTriangleMeshes() PxTriangleMesh */ - virtual PxU32 getTriangleMeshes(PxTriangleMesh** userBuffer, PxU32 bufferSize, PxU32 startIndex=0) const = 0; + virtual PxU32 getTriangleMeshes(PxTriangleMesh** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + + + //@} + /** @name Tetrahedron Meshes + */ + //@{ + + /** + \brief Creates a tetrahedron mesh object. + + This can then be instanced into #PxShape objects. + + \param[in] stream The tetrahedron mesh stream. + \return The new tetrahedron mesh. + + @see PxTetrahedronMesh PxMeshPreprocessingFlag PxTetrahedronMesh.release() PxInputStream PxTriangleMeshFlag + */ + virtual PxTetrahedronMesh* createTetrahedronMesh(PxInputStream& stream) = 0; + + /** + \brief Creates a softbody mesh object. + + \param[in] stream The softbody mesh stream. + \return The new softbody mesh. + + @see createTetrahedronMesh + */ + virtual PxSoftBodyMesh* createSoftBodyMesh(PxInputStream& stream) = 0; + + /** + \brief Return the number of tetrahedron meshes that currently exist. + + \return Number of tetrahedron meshes. + + @see getTetrahedronMeshes() + */ + virtual PxU32 getNbTetrahedronMeshes() const = 0; + + /** + \brief Writes the array of tetrahedron mesh pointers to a user buffer. + + Returns the number of pointers written. + + The ordering of the tetrahedron meshes in the array is not specified. + + \param[out] userBuffer The buffer to receive tetrahedron mesh pointers. + \param[in] bufferSize The number of tetrahedron mesh pointers which can be stored in the buffer. + \param[in] startIndex Index of first mesh pointer to be retrieved. + \return The number of tetrahedron mesh pointers written to userBuffer, this should be less or equal to bufferSize. + + @see getNbTetrahedronMeshes() PxTetrahedronMesh + */ + virtual PxU32 getTetrahedronMeshes(PxTetrahedronMesh** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; /** \brief Creates a heightfield object from previously cooked stream. @@ -173,7 +283,7 @@ public: @see PxHeightField PxHeightField.release() PxInputStream PxRegisterHeightFields */ - virtual PxHeightField* createHeightField(PxInputStream& stream) = 0; + virtual PxHeightField* createHeightField(PxInputStream& stream) = 0; /** \brief Return the number of heightfields that currently exist. @@ -182,23 +292,23 @@ public: @see getHeightFields() */ - virtual PxU32 getNbHeightFields() const = 0; + virtual PxU32 getNbHeightFields() const = 0; /** \brief Writes the array of heightfield pointers to a user buffer. - + Returns the number of pointers written. The ordering of the heightfields in the array is not specified. \param [out] userBuffer The buffer to receive heightfield pointers. \param [in] bufferSize The number of heightfield pointers which can be stored in the buffer. - \param [in] startIndex Index of first heightfield pointer to be retrieved + \param [in] startIndex Index of first heightfield pointer to be retrieved. \return The number of heightfield pointers written to userBuffer, this should be less or equal to bufferSize. @see getNbHeightFields() PxHeightField */ - virtual PxU32 getHeightFields(PxHeightField** userBuffer, PxU32 bufferSize, PxU32 startIndex=0) const = 0; + virtual PxU32 getHeightFields(PxHeightField** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; /** \brief Creates a convex mesh object. @@ -210,7 +320,7 @@ public: @see PxConvexMesh PxConvexMesh.release() PxInputStream createTriangleMesh() PxConvexMeshGeometry PxShape */ - virtual PxConvexMesh* createConvexMesh(PxInputStream &stream) = 0; + virtual PxConvexMesh* createConvexMesh(PxInputStream& stream) = 0; /** \brief Return the number of convex meshes that currently exist. @@ -219,58 +329,82 @@ public: @see getConvexMeshes() */ - virtual PxU32 getNbConvexMeshes() const = 0; + virtual PxU32 getNbConvexMeshes() const = 0; /** \brief Writes the array of convex mesh pointers to a user buffer. - + Returns the number of pointers written. The ordering of the convex meshes in the array is not specified. \param [out] userBuffer The buffer to receive convex mesh pointers. \param [in] bufferSize The number of convex mesh pointers which can be stored in the buffer. - \param [in] startIndex Index of first convex mesh pointer to be retrieved + \param [in] startIndex Index of first convex mesh pointer to be retrieved. \return The number of convex mesh pointers written to userBuffer, this should be less or equal to bufferSize. @see getNbConvexMeshes() PxConvexMesh */ - virtual PxU32 getConvexMeshes(PxConvexMesh** userBuffer, PxU32 bufferSize, PxU32 startIndex=0) const = 0; + virtual PxU32 getConvexMeshes(PxConvexMesh** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; /** - \brief Creates a bounding volume hierarchy structure. - - \param [in] stream The stream to load the BVH structure from. - \return The new BVH structure. + \brief Creates a bounding volume hierarchy. - @see PxBVHStructure PxInputStream + \param [in] stream The stream to load the BVH from. + \return The new BVH. + + @see PxBVH PxInputStream */ - virtual PxBVHStructure* createBVHStructure(PxInputStream &stream) = 0; + virtual PxBVH* createBVH(PxInputStream& stream) = 0; /** - \brief Return the number of bounding volume hierarchy structures that currently exist. + * @deprecated + */ + PX_DEPRECATED PX_FORCE_INLINE PxBVH* createBVHStructure(PxInputStream& stream) + { + return createBVH(stream); + } - \return Number of bounding volume hierarchy structures. + /** + \brief Return the number of bounding volume hierarchies that currently exist. - @see getBVHStructures() + \return Number of bounding volume hierarchies. + + @see PxBVH getBVHs() */ - virtual PxU32 getNbBVHStructures() const = 0; + virtual PxU32 getNbBVHs() const = 0; /** - \brief Writes the array of bounding volume hierarchy structure pointers to a user buffer. - + * @deprecated + */ + PX_DEPRECATED PX_FORCE_INLINE PxU32 getNbBVHStructures() const + { + return getNbBVHs(); + } + + /** + \brief Writes the array of bounding volume hierarchy pointers to a user buffer. + Returns the number of pointers written. - The ordering of the BVH structures in the array is not specified. + The ordering of the BVHs in the array is not specified. - \param [out] userBuffer The buffer to receive BVH structure pointers. - \param [in] bufferSize The number of BVH structure pointers which can be stored in the buffer. - \param [in] startIndex Index of first BVH structure pointer to be retrieved - \return The number of BVH structure pointers written to userBuffer, this should be less or equal to bufferSize. + \param [out] userBuffer The buffer to receive BVH pointers. + \param [in] bufferSize The number of BVH pointers which can be stored in the buffer. + \param [in] startIndex Index of first BVH pointer to be retrieved. + \return The number of BVH pointers written to userBuffer, this should be less or equal to bufferSize. - @see getNbBVHStructures() PxBVHStructure + @see getNbBVHs() PxBVH */ - virtual PxU32 getBVHStructures(PxBVHStructure** userBuffer, PxU32 bufferSize, PxU32 startIndex=0) const = 0; + virtual PxU32 getBVHs(PxBVH** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + + /** + * @deprecated + */ + PX_DEPRECATED PX_FORCE_INLINE PxU32 getBVHStructures(PxBVHStructure** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const + { + return getBVHs(userBuffer, bufferSize, startIndex); + } //@} /** @name Scenes @@ -288,33 +422,33 @@ public: @see PxScene PxScene.release() PxSceneDesc */ - virtual PxScene* createScene(const PxSceneDesc& sceneDesc) = 0; + virtual PxScene* createScene(const PxSceneDesc& sceneDesc) = 0; /** \brief Gets number of created scenes. \return The number of scenes created. - @see getScene() + @see getScenes() */ - virtual PxU32 getNbScenes() const = 0; + virtual PxU32 getNbScenes() const = 0; /** \brief Writes the array of scene pointers to a user buffer. - + Returns the number of pointers written. The ordering of the scene pointers in the array is not specified. \param [out] userBuffer The buffer to receive scene pointers. \param [in] bufferSize The number of scene pointers which can be stored in the buffer. - \param [in] startIndex Index of first scene pointer to be retrieved + \param [in] startIndex Index of first scene pointer to be retrieved. \return The number of scene pointers written to userBuffer, this should be less or equal to bufferSize. @see getNbScenes() PxScene */ - virtual PxU32 getScenes(PxScene** userBuffer, PxU32 bufferSize, PxU32 startIndex=0) const = 0; - + virtual PxU32 getScenes(PxScene** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + //@} /** @name Actors */ @@ -323,22 +457,22 @@ public: /** \brief Creates a static rigid actor with the specified pose and all other fields initialized to their default values. - - \param [in] pose The initial pose of the actor. Must be a valid transform + + \param [in] pose The initial pose of the actor. Must be a valid transform. @see PxRigidStatic */ - virtual PxRigidStatic* createRigidStatic(const PxTransform& pose) = 0; + virtual PxRigidStatic* createRigidStatic(const PxTransform& pose) = 0; /** \brief Creates a dynamic rigid actor with the specified pose and all other fields initialized to their default values. - - \param [in] pose The initial pose of the actor. Must be a valid transform + + \param [in] pose The initial pose of the actor. Must be a valid transform. @see PxRigidDynamic */ - virtual PxRigidDynamic* createRigidDynamic(const PxTransform& pose) = 0; + virtual PxRigidDynamic* createRigidDynamic(const PxTransform& pose) = 0; /** \brief Creates a pruning structure from actors. @@ -353,39 +487,90 @@ public: \return Pruning structure created from given actors, or NULL if any of the actors did not comply with the above requirements. @see PxActor PxPruningStructure */ - virtual PxPruningStructure* createPruningStructure(PxRigidActor*const* actors, PxU32 nbActors) = 0; + virtual PxPruningStructure* createPruningStructure(PxRigidActor*const* actors, PxU32 nbActors) = 0; //@} /** @name Shapes */ //@{ - + /** \brief Creates a shape which may be attached to multiple actors - + The shape will be created with a reference count of 1. \param [in] geometry The geometry for the shape \param [in] material The material for the shape \param [in] isExclusive Whether this shape is exclusive to a single actor or maybe be shared \param [in] shapeFlags The PxShapeFlags to be set + \return The shape - Shared shapes are not mutable when they are attached to an actor + \note Shared shapes are not mutable when they are attached to an actor @see PxShape */ - PX_FORCE_INLINE PxShape* createShape( const PxGeometry& geometry, - const PxMaterial& material, - bool isExclusive = false, - PxShapeFlags shapeFlags = PxShapeFlag::eVISUALIZATION | PxShapeFlag::eSCENE_QUERY_SHAPE | PxShapeFlag::eSIMULATION_SHAPE) + PX_FORCE_INLINE PxShape* createShape( const PxGeometry& geometry, + const PxMaterial& material, + bool isExclusive = false, + PxShapeFlags shapeFlags = PxShapeFlag::eVISUALIZATION | PxShapeFlag::eSCENE_QUERY_SHAPE | PxShapeFlag::eSIMULATION_SHAPE) { PxMaterial* materialPtr = const_cast(&material); return createShape(geometry, &materialPtr, 1, isExclusive, shapeFlags); } + /** + \brief Creates a shape which may be attached to one or more softbody actors + + The shape will be created with a reference count of 1. + + \param [in] geometry The geometry for the shape + \param [in] material The material for the shape + \param [in] isExclusive Whether this shape is exclusive to a single actor or maybe be shared + \param [in] shapeFlags The PxShapeFlags to be set + \return The shape + + \note Shared shapes are not mutable when they are attached to an actor + + @see PxShape + */ + PX_FORCE_INLINE PxShape* createShape( const PxGeometry& geometry, + const PxFEMSoftBodyMaterial& material, + bool isExclusive = false, + PxShapeFlags shapeFlags = PxShapeFlag::eVISUALIZATION | PxShapeFlag::eSCENE_QUERY_SHAPE | PxShapeFlag::eSIMULATION_SHAPE) + { + PxFEMSoftBodyMaterial* materialPtr = const_cast(&material); + return createShape(geometry, &materialPtr, 1, isExclusive, shapeFlags); + } + +#if PX_ENABLE_FEATURES_UNDER_CONSTRUCTION + /** + \brief Creates a shape which may be attached to one or more FEMCloth actors + + The shape will be created with a reference count of 1. + + \param [in] geometry The geometry for the shape + \param [in] material The material for the shape + \param [in] isExclusive Whether this shape is exclusive to a single actor or maybe be shared + \param [in] shapeFlags The PxShapeFlags to be set + \return The shape + + \note Shared shapes are not mutable when they are attached to an actor + + @see PxShape + */ + PX_FORCE_INLINE PxShape* createShape( const PxGeometry& geometry, + const PxFEMClothMaterial& material, + bool isExclusive = false, + PxShapeFlags shapeFlags = PxShapeFlag::eVISUALIZATION | PxShapeFlag::eSCENE_QUERY_SHAPE | PxShapeFlag::eSIMULATION_SHAPE) + { + PxFEMClothMaterial* materialPtr = const_cast(&material); + return createShape(geometry, &materialPtr, 1, isExclusive, shapeFlags); + } +#endif + /** \brief Creates a shape which may be attached to multiple actors - + The shape will be created with a reference count of 1. \param [in] geometry The geometry for the shape @@ -393,16 +578,30 @@ public: \param [in] materialCount The number of materials \param [in] isExclusive Whether this shape is exclusive to a single actor or may be shared \param [in] shapeFlags The PxShapeFlags to be set + \return The shape - Shared shapes are not mutable when they are attached to an actor + \note Shared shapes are not mutable when they are attached to an actor + \note Shapes created from *SDF* triangle-mesh geometries do not support more than one material. @see PxShape */ - virtual PxShape* createShape(const PxGeometry& geometry, - PxMaterial*const * materials, - PxU16 materialCount, - bool isExclusive = false, - PxShapeFlags shapeFlags = PxShapeFlag::eVISUALIZATION | PxShapeFlag::eSCENE_QUERY_SHAPE | PxShapeFlag::eSIMULATION_SHAPE) = 0; + virtual PxShape* createShape( const PxGeometry& geometry, + PxMaterial*const * materials, + PxU16 materialCount, + bool isExclusive = false, + PxShapeFlags shapeFlags = PxShapeFlag::eVISUALIZATION | PxShapeFlag::eSCENE_QUERY_SHAPE | PxShapeFlag::eSIMULATION_SHAPE) = 0; + + virtual PxShape* createShape( const PxGeometry& geometry, + PxFEMSoftBodyMaterial*const * materials, + PxU16 materialCount, + bool isExclusive = false, + PxShapeFlags shapeFlags = PxShapeFlag::eVISUALIZATION | PxShapeFlag::eSCENE_QUERY_SHAPE | PxShapeFlag::eSIMULATION_SHAPE) = 0; + + virtual PxShape* createShape( const PxGeometry& geometry, + PxFEMClothMaterial*const * materials, + PxU16 materialCount, + bool isExclusive = false, + PxShapeFlags shapeFlags = PxShapeFlag::eVISUALIZATION | PxShapeFlag::eSCENE_QUERY_SHAPE | PxShapeFlag::eSIMULATION_SHAPE) = 0; /** \brief Return the number of shapes that currently exist. @@ -411,11 +610,11 @@ public: @see getShapes() */ - virtual PxU32 getNbShapes() const = 0; + virtual PxU32 getNbShapes() const = 0; /** \brief Writes the array of shape pointers to a user buffer. - + Returns the number of pointers written. The ordering of the shapes in the array is not specified. @@ -427,7 +626,7 @@ public: @see getNbShapes() PxShape */ - virtual PxU32 getShapes(PxShape** userBuffer, PxU32 bufferSize, PxU32 startIndex=0) const = 0; + virtual PxU32 getShapes(PxShape** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; //@} /** @name Constraints and Articulations @@ -439,81 +638,470 @@ public: \note A constraint shader will get added automatically to the scene the two linked actors belong to. Either, but not both, of actor0 and actor1 may be NULL to denote attachment to the world. - + \param [in] actor0 The first actor \param [in] actor1 The second actor \param [in] connector The connector object, which the SDK uses to communicate with the infrastructure for the constraint \param [in] shaders The shader functions for the constraint \param [in] dataSize The size of the data block for the shader - \return The new shader. + \return The new constraint shader. @see PxConstraint */ - virtual PxConstraint* createConstraint(PxRigidActor* actor0, PxRigidActor* actor1, PxConstraintConnector& connector, const PxConstraintShaderTable& shaders, PxU32 dataSize) = 0; + virtual PxConstraint* createConstraint(PxRigidActor* actor0, PxRigidActor* actor1, PxConstraintConnector& connector, const PxConstraintShaderTable& shaders, PxU32 dataSize) = 0; /** - \brief Creates an articulation with all fields initialized to their default values. - - \return the new articulation - - @see PxArticulation, PxRegisterArticulations - */ - virtual PxArticulation* createArticulation() = 0; - - /** - \brief Creates a reduced coordinate articulation with all fields initialized to their default values. + \brief Creates a reduced-coordinate articulation with all fields initialized to their default values. \return the new articulation @see PxArticulationReducedCoordinate, PxRegisterArticulationsReducedCoordinate */ - virtual PxArticulationReducedCoordinate* createArticulationReducedCoordinate() = 0; + virtual PxArticulationReducedCoordinate* createArticulationReducedCoordinate() = 0; + /** + \brief Creates a FEM-based cloth with all fields initialized to their default values. + \warning Feature under development, only for internal usage. + + \param[in] cudaContextManager The PxCudaContextManager this instance is tied to. + \return the new FEM-cloth + + @see PxFEMCloth + */ + virtual PxFEMCloth* createFEMCloth(PxCudaContextManager& cudaContextManager) = 0; + + /** + \brief Creates a FEM-based soft body with all fields initialized to their default values. + + \param[in] cudaContextManager The PxCudaContextManager this instance is tied to. + \return the new soft body + + @see PxSoftBody + */ + virtual PxSoftBody* createSoftBody(PxCudaContextManager& cudaContextManager) = 0; + + /** + \brief Creates a hair system with all fields initialized to their default values. + \warning Feature under development, only for internal usage. + + \param[in] cudaContextManager The PxCudaContextManager this instance is tied to. + \return the new hair system + + @see PxHairSystem + */ + virtual PxHairSystem* createHairSystem(PxCudaContextManager& cudaContextManager) = 0; + + /** + \brief Creates a particle system with a position-based dynamics (PBD) solver. + + A PBD particle system can be used to simulate particle systems with fluid and granular particles. It also allows simulating cloth using + mass-spring constraints and rigid bodies by shape matching the bodies with particles. + + \param[in] cudaContextManager The PxCudaContextManager this instance is tied to. + \param[in] maxNeighborhood The maximum number of particles considered in neighborhood-based particle interaction calculations (e.g. fluid density constraints). + \return the new particle system + + @see PxPBDParticleSystem + */ + virtual PxPBDParticleSystem* createPBDParticleSystem(PxCudaContextManager& cudaContextManager, PxU32 maxNeighborhood = 96) = 0; + + /** + \brief Creates a particle system with a fluid-implicit particle solver (FLIP). + \warning Feature under development, only for internal usage. + + \param[in] cudaContextManager The PxCudaContextManager this instance is tied to. + \return the new particle system + + @see PxFLIPParticleSystem + */ + virtual PxFLIPParticleSystem* createFLIPParticleSystem(PxCudaContextManager& cudaContextManager) = 0; + + /** + \brief Creates a particle system with a material-point-method solver (MPM). + \warning Feature under development, only for internal usage. + + A MPM particle system can be used to simulate fluid dynamics and deformable body effects using particles. + + \param[in] cudaContextManager The PxCudaContextManager this instance is tied to. + \return the new particle system + + @see PxMPMParticleSystem + */ + virtual PxMPMParticleSystem* createMPMParticleSystem(PxCudaContextManager& cudaContextManager) = 0; + + /** + \brief Creates a customizable particle system to simulate effects that are not supported by PhysX natively (e.g. molecular dynamics). + \warning Feature under development, only for internal usage. + + \param[in] cudaContextManager The PxCudaContextManager this instance is tied to. + \param[in] maxNeighborhood The maximum number of particles considered in neighborhood-based particle interaction calculations (e.g. fluid density constraints). + \return the new particle system + + @see PxCustomParticleSystem + */ + virtual PxCustomParticleSystem* createCustomParticleSystem(PxCudaContextManager& cudaContextManager, PxU32 maxNeighborhood) = 0; + + /** + \brief Create a buffer for reading and writing data across host and device memory spaces. + + \param[in] byteSize The size of the buffer in bytes. + \param[in] bufferType The memory space of the buffer. + \param[in] cudaContextManager The PxCudaContextManager this buffer is tied to. + \return PxBuffer instance. + + @see PxBuffer + */ + virtual PxBuffer* createBuffer(PxU64 byteSize, PxBufferType::Enum bufferType, PxCudaContextManager* cudaContextManager) = 0; + + /** + \brief Create particle buffer to simulate fluid/granular material. + + \param[in] maxParticles The maximum number of particles in this buffer. + \param[in] maxVolumes The maximum number of volumes in this buffer. See PxParticleVolume. + \param[in] cudaContextManager The PxCudaContextManager this buffer is tied to. + \return PxParticleBuffer instance + + @see PxParticleBuffer + */ + virtual PxParticleBuffer* createParticleBuffer(PxU32 maxParticles, PxU32 maxVolumes, PxCudaContextManager* cudaContextManager) = 0; + + /** + \brief Create a particle buffer for fluid dynamics with diffuse particles. Diffuse particles are used to simulate fluid effects + such as foam, spray and bubbles. + + \param[in] maxParticles The maximum number of particles in this buffer. + \param[in] maxVolumes The maximum number of volumes in this buffer. See #PxParticleVolume. + \param[in] maxDiffuseParticles The max number of diffuse particles int this buffer. + \param[in] cudaContextManager The PxCudaContextManager this buffer is tied to. + \return PxParticleAndDiffuseBuffer instance + + @see PxParticleAndDiffuseBuffer, PxDiffuseParticleParams + */ + virtual PxParticleAndDiffuseBuffer* createParticleAndDiffuseBuffer(PxU32 maxParticles, PxU32 maxVolumes, PxU32 maxDiffuseParticles, PxCudaContextManager* cudaContextManager) = 0; + + /** + \brief Create a particle buffer to simulate particle cloth. + + \param[in] maxParticles The maximum number of particles in this buffer. + \param[in] maxNumVolumes The maximum number of volumes in this buffer. See #PxParticleVolume. + \param[in] maxNumCloths The maximum number of cloths in this buffer. See #PxParticleCloth. + \param[in] maxNumTriangles The maximum number of triangles for aerodynamics. + \param[in] maxNumSprings The maximum number of springs to connect particles. See #PxParticleSpring. + \param[in] cudaContextManager The PxCudaContextManager this buffer is tied to. + \return PxParticleClothBuffer instance + + @see PxParticleClothBuffer + */ + virtual PxParticleClothBuffer* createParticleClothBuffer(PxU32 maxParticles, PxU32 maxNumVolumes, PxU32 maxNumCloths, PxU32 maxNumTriangles, PxU32 maxNumSprings, PxCudaContextManager* cudaContextManager) = 0; + + /** + \brief Create a particle buffer to simulate rigid bodies using shape matching with particles. + + \param[in] maxParticles The maximum number of particles in this buffer. + \param[in] maxNumVolumes The maximum number of volumes in this buffer. See #PxParticleVolume. + \param[in] maxNumRigids The maximum number of rigid bodies this buffer is used to simulate. + \param[in] cudaContextManager The PxCudaContextManager this buffer is tied to. + \return PxParticleRigidBuffer instance + + @see PxParticleRigidBuffer + */ + virtual PxParticleRigidBuffer* createParticleRigidBuffer(PxU32 maxParticles, PxU32 maxNumVolumes, PxU32 maxNumRigids, PxCudaContextManager* cudaContextManager) = 0; + //@} /** @name Materials */ //@{ /** - \brief Creates a new material with default properties. + \brief Creates a new rigid body material with certain default properties. - \return The new material. + \return The new rigid body material. \param [in] staticFriction The coefficient of static friction \param [in] dynamicFriction The coefficient of dynamic friction \param [in] restitution The coefficient of restitution - @see PxMaterial + @see PxMaterial */ - virtual PxMaterial* createMaterial(PxReal staticFriction, PxReal dynamicFriction, PxReal restitution) = 0; - + virtual PxMaterial* createMaterial(PxReal staticFriction, PxReal dynamicFriction, PxReal restitution) = 0; /** - \brief Return the number of materials that currently exist. + \brief Return the number of rigid body materials that currently exist. - \return Number of materials. + \return Number of rigid body materials. @see getMaterials() */ - virtual PxU32 getNbMaterials() const = 0; + virtual PxU32 getNbMaterials() const = 0; /** - \brief Writes the array of material pointers to a user buffer. - + \brief Writes the array of rigid body material pointers to a user buffer. + Returns the number of pointers written. The ordering of the materials in the array is not specified. \param [out] userBuffer The buffer to receive material pointers. \param [in] bufferSize The number of material pointers which can be stored in the buffer. - \param [in] startIndex Index of first material pointer to be retrieved + \param [in] startIndex Index of first material pointer to be retrieved. \return The number of material pointers written to userBuffer, this should be less or equal to bufferSize. @see getNbMaterials() PxMaterial */ - virtual PxU32 getMaterials(PxMaterial** userBuffer, PxU32 bufferSize, PxU32 startIndex=0) const = 0; + virtual PxU32 getMaterials(PxMaterial** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + + /** + \brief Creates a new FEM soft body material with certain default properties. + + \return The new FEM material. + + \param [in] youngs The young's modulus + \param [in] poissons The poissons's ratio + \param [in] dynamicFriction The dynamic friction coefficient + + @see PxFEMSoftBodyMaterial + */ + virtual PxFEMSoftBodyMaterial* createFEMSoftBodyMaterial(PxReal youngs, PxReal poissons, PxReal dynamicFriction) = 0; + + /** + \brief Return the number of FEM soft body materials that currently exist. + + \return Number of FEM materials. + + @see getFEMSoftBodyMaterials() + */ + virtual PxU32 getNbFEMSoftBodyMaterials() const = 0; + + /** + \brief Writes the array of FEM soft body material pointers to a user buffer. + + Returns the number of pointers written. + + The ordering of the materials in the array is not specified. + + \param [out] userBuffer The buffer to receive material pointers. + \param [in] bufferSize The number of material pointers which can be stored in the buffer. + \param [in] startIndex Index of first material pointer to be retrieved. + \return The number of material pointers written to userBuffer, this should be less or equal to bufferSize. + + @see getNbFEMSoftBodyMaterials() PxFEMSoftBodyMaterial + */ + virtual PxU32 getFEMSoftBodyMaterials(PxFEMSoftBodyMaterial** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + + /** + \brief Creates a new FEM cloth material with certain default properties. + \warning Feature under development, only for internal usage. + + \return The new FEM material. + + \param [in] youngs The young's modulus + \param [in] poissons The poissons's ratio + \param [in] dynamicFriction The dynamic friction coefficient + + @see PxFEMClothMaterial + */ + virtual PxFEMClothMaterial* createFEMClothMaterial(PxReal youngs, PxReal poissons, PxReal dynamicFriction) = 0; + + /** + \brief Return the number of FEM cloth materials that currently exist. + + \return Number of FEM cloth materials. + + @see getFEMClothMaterials() + */ + virtual PxU32 getNbFEMClothMaterials() const = 0; + + /** + \brief Writes the array of FEM cloth material pointers to a user buffer. + + Returns the number of pointers written. + + The ordering of the materials in the array is not specified. + + \param [out] userBuffer The buffer to receive material pointers. + \param [in] bufferSize The number of material pointers which can be stored in the buffer. + \param [in] startIndex Index of first material pointer to be retrieved. + \return The number of material pointers written to userBuffer, this should be less or equal to bufferSize. + + @see getNbFEMClothMaterials() PxFEMClothMaterial + */ + virtual PxU32 getFEMClothMaterials(PxFEMClothMaterial** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + + /** + \brief Creates a new PBD material with certain default properties. + + \param [in] friction The friction parameter + \param [in] damping The velocity damping parameter + \param [in] adhesion The adhesion parameter + \param [in] viscosity The viscosity parameter + \param [in] vorticityConfinement The vorticity confinement coefficient + \param [in] surfaceTension The surface tension coefficient + \param [in] cohesion The cohesion parameter + \param [in] lift The lift parameter + \param [in] drag The drag parameter + \param [in] cflCoefficient The Courant-Friedrichs-Lewy(cfl) coefficient + \param [in] gravityScale The gravity scale + \return The new PBD material. + + @see PxPBDMaterial + */ + virtual PxPBDMaterial* createPBDMaterial(PxReal friction, PxReal damping, PxReal adhesion, PxReal viscosity, PxReal vorticityConfinement, PxReal surfaceTension, PxReal cohesion, PxReal lift, PxReal drag, PxReal cflCoefficient = 1.f, PxReal gravityScale = 1.f) = 0; + + /** + \brief Return the number of PBD materials that currently exist. + + \return Number of PBD materials. + + @see getPBDMaterials() + */ + virtual PxU32 getNbPBDMaterials() const = 0; + + /** + \brief Writes the array of PBD material pointers to a user buffer. + + Returns the number of pointers written. + + The ordering of the materials in the array is not specified. + + \param [out] userBuffer The buffer to receive material pointers. + \param [in] bufferSize The number of material pointers which can be stored in the buffer. + \param [in] startIndex Index of first material pointer to be retrieved. + \return The number of material pointers written to userBuffer, this should be less or equal to bufferSize. + + @see getNbPBDMaterials() PxPBDMaterial + */ + virtual PxU32 getPBDMaterials(PxPBDMaterial** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + + /** + \brief Creates a new FLIP material with certain default properties. + \warning Feature under development, only for internal usage. + + \param [in] friction The friction parameter + \param [in] damping The velocity damping parameter + \param [in] adhesion The maximum velocity magnitude of particles + \param [in] viscosity The viscosity parameter + \param [in] gravityScale The gravity scale + \return The new FLIP material. + + @see PxFLIPMaterial + */ + virtual PxFLIPMaterial* createFLIPMaterial(PxReal friction, PxReal damping, PxReal adhesion, PxReal viscosity, PxReal gravityScale = 1.f) = 0; + + /** + \brief Return the number of FLIP materials that currently exist. + \warning Feature under development, only for internal usage. + + \return Number of FLIP materials. + + @see getFLIPMaterials() + */ + virtual PxU32 getNbFLIPMaterials() const = 0; + + /** + \brief Writes the array of FLIP material pointers to a user buffer. + \warning Feature under development, only for internal usage. + + Returns the number of pointers written. + + The ordering of the materials in the array is not specified. + + \param [out] userBuffer The buffer to receive material pointers. + \param [in] bufferSize The number of material pointers which can be stored in the buffer. + \param [in] startIndex Index of first material pointer to be retrieved. + \return The number of material pointers written to userBuffer, this should be less or equal to bufferSize. + + @see getNbFLIPMaterials() PxFLIPMaterial + */ + virtual PxU32 getFLIPMaterials(PxFLIPMaterial** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + + /** + \brief Creates a new MPM material with certain default properties. + \warning Feature under development, only for internal usage. + + \param [in] friction The friction parameter + \param [in] damping The velocity damping parameter + \param [in] adhesion The maximum velocity magnitude of particles + \param [in] isPlastic True if plastic + \param [in] youngsModulus The Young's modulus + \param [in] poissons The Poissons's ratio + \param [in] hardening The hardening parameter + \param [in] criticalCompression The critical compression parameter + \param [in] criticalStretch The critical stretch parameter + \param [in] tensileDamageSensitivity The tensile damage sensitivity parameter + \param [in] compressiveDamageSensitivity The compressive damage sensitivity parameter + \param [in] attractiveForceResidual The attractive force residual parameter + \param [in] gravityScale The gravity scale + \return The new MPM material. + + @see PxMPMMaterial + */ + virtual PxMPMMaterial* createMPMMaterial(PxReal friction, PxReal damping, PxReal adhesion, bool isPlastic, PxReal youngsModulus, PxReal poissons, PxReal hardening, PxReal criticalCompression, PxReal criticalStretch, PxReal tensileDamageSensitivity, PxReal compressiveDamageSensitivity, PxReal attractiveForceResidual, PxReal gravityScale = 1.0f) = 0; + + /** + \brief Return the number of MPM materials that currently exist. + \warning Feature under development, only for internal usage. + + \return Number of MPM materials. + + @see getMPMMaterials() + */ + virtual PxU32 getNbMPMMaterials() const = 0; + + /** + \brief Writes the array of MPM material pointers to a user buffer. + \warning Feature under development, only for internal usage. + + Returns the number of pointers written. + + The ordering of the materials in the array is not specified. + + \param [out] userBuffer The buffer to receive material pointers. + \param [in] bufferSize The number of material pointers which can be stored in the buffer. + \param [in] startIndex Index of first material pointer to be retrieved. + \return The number of material pointers written to userBuffer, this should be less or equal to bufferSize. + + @see getNbMPMMaterials() PxMPMMaterial + */ + virtual PxU32 getMPMMaterials(PxMPMMaterial** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + + /** + \brief Creates a new material for custom particle systems. + \warning Feature under development, only for internal usage. + + \param[in] gpuBuffer A pointer to a GPU buffer containing material parameters. + \return the new material. + */ + virtual PxCustomMaterial* createCustomMaterial(void* gpuBuffer) = 0; + + /** + \brief Return the number of custom materials that currently exist. + \warning Feature under development, only for internal usage. + + \return Number of custom materials. + + @see getCustomMaterials() + */ + virtual PxU32 getNbCustomMaterials() const = 0; + + /** + \brief Writes the array of custom material pointers to a user buffer. + \warning Feature under development, only for internal usage. + + Returns the number of pointers written. + + The ordering of the materials in the array is not specified. + + \param [out] userBuffer The buffer to receive material pointers. + \param [in] bufferSize The number of material pointers which can be stored in the buffer. + \param [in] startIndex Index of first material pointer to be retrieved. + \return The number of material pointers written to userBuffer, this should be less or equal to bufferSize. + + @see getNbCustomMaterials() PxCustomMaterial + */ + virtual PxU32 getCustomMaterials(PxCustomMaterial** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + //@} /** @name Deletion Listeners @@ -538,11 +1126,11 @@ public: virtual void registerDeletionListener(PxDeletionListener& observer, const PxDeletionEventFlags& deletionEvents, bool restrictedObjectSet = false) = 0; /** - \brief Unregister a deletion listener. + \brief Unregister a deletion listener. It is illegal to register or unregister a deletion listener while deletions are being processed. - \param [in] observer Observer object to send notifications to + \param [in] observer Observer object to stop sending notifications to. @see PxDeletionListener registerDeletionListener */ @@ -555,7 +1143,7 @@ public: \note It is illegal to register or unregister objects while deletions are being processed. - \note The deletion listener has to be registered through #registerDeletionListener() and configured to support restricted objects sets prior to this method being used. + \note The deletion listener has to be registered through #registerDeletionListener() and configured to support restricted object sets prior to this method being used. \param [in] observer Observer object to send notifications to. \param [in] observables List of objects for which to receive deletion events. Only PhysX core objects are supported. In the case of PxJoint objects, the underlying PxConstraint can be used to get the events. @@ -572,7 +1160,7 @@ public: \note It is illegal to register or unregister objects while deletions are being processed. - \note The deletion listener has to be registered through #registerDeletionListener() and configured to support restricted objects sets prior to this method being used. + \note The deletion listener has to be registered through #registerDeletionListener() and configured to support restricted object sets prior to this method being used. \param [in] observer Observer object to stop sending notifications to. \param [in] observables List of objects for which to not receive deletion events anymore. @@ -583,14 +1171,14 @@ public: virtual void unregisterDeletionListenerObjects(PxDeletionListener& observer, const PxBase* const* observables, PxU32 observableCount) = 0; /** - \brief Gets PxPhysics object insertion interface. + \brief Gets PxPhysics object insertion interface. - The insertion interface is needed ie. for PxCooking::createTriangleMesh, this allows runtime mesh creation. This is not advised to do, please - use offline cooking if possible. + The insertion interface is needed for PxCreateTriangleMesh, PxCooking::createTriangleMesh etc., this allows runtime mesh creation. - @see PxCooking::createTriangleMesh PxCooking::createHeightfield + @see PxCreateTriangleMesh PxCreateHeightField PxCreateTetrahedronMesh PxCreateBVH + PxCooking::createTriangleMesh PxCooking::createHeightfield PxCooking::createTetrahedronMesh PxCooking::createBVH */ - virtual PxPhysicsInsertionCallback& getPhysicsInsertionCallback() = 0; + virtual PxInsertionCallback& getPhysicsInsertionCallback() = 0; //@} }; @@ -600,106 +1188,107 @@ public: #endif /** -\brief Enables the usage of the articulations feature. This function is called automatically inside PxCreatePhysics(). -On resource constrained platforms, it is possible to call PxCreateBasePhysics() and then NOT call this function -to save on code memory if your application does not use articulations. In this case the linker should strip out -the relevant implementation code from the library. If you need to use articulations but not some other optional -component, you shoud call PxCreateBasePhysics() followed by this call. -*/ -PX_C_EXPORT PX_PHYSX_CORE_API void PX_CALL_CONV PxRegisterArticulations(physx::PxPhysics& physics); - - -/** -\brief Enables the usage of the reduced coordinate articulations feature. This function is called automatically inside PxCreatePhysics(). +\brief Enables the usage of the reduced coordinate articulations feature. This function is called automatically inside PxCreatePhysics(). On resource constrained platforms, it is possible to call PxCreateBasePhysics() and then NOT call this function -to save on code memory if your application does not use articulations. In this case the linker should strip out -the relevant implementation code from the library. If you need to use articulations but not some other optional +to save on code memory if your application does not use reduced coordinate articulations. In this case the linker should strip out +the relevant implementation code from the library. If you need to use reduced coordinate articulations but not some other optional component, you shoud call PxCreateBasePhysics() followed by this call. + +@deprecated */ -PX_C_EXPORT PX_PHYSX_CORE_API void PX_CALL_CONV PxRegisterArticulationsReducedCoordinate(physx::PxPhysics& physics); +PX_DEPRECATED PX_C_EXPORT PX_PHYSX_CORE_API void PX_CALL_CONV PxRegisterArticulationsReducedCoordinate(physx::PxPhysics& physics); /** -\brief Enables the usage of the heightfield feature. +\brief Enables the usage of the heightfield feature. This call will link the default 'unified' implementation of heightfields which is identical to the narrow phase of triangle meshes. This function is called automatically inside PxCreatePhysics(). On resource constrained platforms, it is possible to call PxCreateBasePhysics() and then NOT call this function -to save on code memory if your application does not use heightfields. In this case the linker should strip out -the relevant implementation code from the library. If you need to use heightfield but not some other optional +to save on code memory if your application does not use heightfields. In this case the linker should strip out +the relevant implementation code from the library. If you need to use heightfield but not some other optional component, you shoud call PxCreateBasePhysics() followed by this call. You must call this function at a time where no ::PxScene instance exists, typically before calling PxPhysics::createScene(). This is to prevent a change to the heightfield implementation code at runtime which would have undefined results. -Calling PxCreateBasePhysics() and then attempting to create a heightfield shape without first calling +Calling PxCreateBasePhysics() and then attempting to create a heightfield shape without first calling ::PxRegisterHeightFields(), will result in an error. + +@deprecated */ -PX_C_EXPORT PX_PHYSX_CORE_API void PX_CALL_CONV PxRegisterHeightFields(physx::PxPhysics& physics); +PX_DEPRECATED PX_C_EXPORT PX_PHYSX_CORE_API void PX_CALL_CONV PxRegisterHeightFields(physx::PxPhysics& physics); /** \brief Creates an instance of the physics SDK with minimal additional components registered Creates an instance of this class. May not be a class member to avoid name mangling. Pass the constant #PX_PHYSICS_VERSION as the argument. -There may be only one instance of this class per process. Calling this method after an instance +There may be only one instance of this class per process. Calling this method after an instance has been created already will result in an error message and NULL will be returned. -\param version Version number we are expecting(should be #PX_PHYSICS_VERSION) +\param version Version number we are expecting (should be #PX_PHYSICS_VERSION) \param foundation Foundation instance (see PxFoundation) \param scale values used to determine default tolerances for objects at creation time -\param trackOutstandingAllocations true if you want to track memory allocations +\param trackOutstandingAllocations true if you want to track memory allocations so a debugger connection partway through your physics simulation will get - an accurate map of everything that has been allocated so far. This could have a memory + an accurate map of everything that has been allocated so far. This could have a memory and performance impact on your simulation hence it defaults to off. \param pvd When pvd points to a valid PxPvd instance (PhysX Visual Debugger), a connection to the specified PxPvd instance is created. If pvd is NULL no connection will be attempted. +\param omniPvd When omniPvd points to a valid PxOmniPvd instance PhysX will sample its internal structures to the defined OmniPvd output streams + set in the PxOmniPvd object. \return PxPhysics instance on success, NULL if operation failed -@see PxPhysics, PxFoundation, PxTolerancesScale, PxPvd +@see PxPhysics, PxFoundation, PxTolerancesScale, PxPvd, PxOmniPvd + +@deprecated */ -PX_C_EXPORT PX_PHYSX_CORE_API physx::PxPhysics* PX_CALL_CONV PxCreateBasePhysics(physx::PxU32 version, - physx::PxFoundation& foundation, - const physx::PxTolerancesScale& scale, - bool trackOutstandingAllocations = false, - physx::PxPvd* pvd = NULL); +PX_DEPRECATED PX_C_EXPORT PX_PHYSX_CORE_API physx::PxPhysics* PX_CALL_CONV PxCreateBasePhysics( physx::PxU32 version, + physx::PxFoundation& foundation, + const physx::PxTolerancesScale& scale, + bool trackOutstandingAllocations = false, + physx::PxPvd* pvd = NULL, + physx::PxOmniPvd* omniPvd = NULL); /** \brief Creates an instance of the physics SDK. Creates an instance of this class. May not be a class member to avoid name mangling. Pass the constant #PX_PHYSICS_VERSION as the argument. -There may be only one instance of this class per process. Calling this method after an instance +There may be only one instance of this class per process. Calling this method after an instance has been created already will result in an error message and NULL will be returned. -Calling this will register all optional code modules (Articulations and HeightFields), preparing them for use. -If you do not need some of these modules, consider calling PxCreateBasePhysics() instead and registering needed +Calling this will register all optional code modules (Articulations and HeightFields), preparing them for use. +If you do not need some of these modules, consider calling PxCreateBasePhysics() instead and registering needed modules manually. -\param version Version number we are expecting(should be #PX_PHYSICS_VERSION) +\param version Version number we are expecting (should be #PX_PHYSICS_VERSION) \param foundation Foundation instance (see PxFoundation) \param scale values used to determine default tolerances for objects at creation time -\param trackOutstandingAllocations true if you want to track memory allocations +\param trackOutstandingAllocations true if you want to track memory allocations so a debugger connection partway through your physics simulation will get - an accurate map of everything that has been allocated so far. This could have a memory + an accurate map of everything that has been allocated so far. This could have a memory and performance impact on your simulation hence it defaults to off. \param pvd When pvd points to a valid PxPvd instance (PhysX Visual Debugger), a connection to the specified PxPvd instance is created. If pvd is NULL no connection will be attempted. +\param omniPvd When omniPvd points to a valid PxOmniPvd instance PhysX will sample its internal structures to the defined OmniPvd output streams + set in the PxOmniPvd object. \return PxPhysics instance on success, NULL if operation failed -@see PxPhysics, PxCreateBasePhysics, PxRegisterArticulations, PxRegisterArticulationsReducedCoordinate, PxRegisterHeightFields +@see PxPhysics, PxCreateBasePhysics, PxRegisterArticulationsReducedCoordinate, PxRegisterHeightFields */ PX_INLINE physx::PxPhysics* PxCreatePhysics(physx::PxU32 version, physx::PxFoundation& foundation, - const physx::PxTolerancesScale& scale, + const physx::PxTolerancesScale& scale, bool trackOutstandingAllocations = false, - physx::PxPvd* pvd = NULL ) + physx::PxPvd* pvd = NULL, + physx::PxOmniPvd* omniPvd = NULL) { - physx::PxPhysics* physics = PxCreateBasePhysics(version, foundation, scale, trackOutstandingAllocations, pvd); - if(!physics) + physx::PxPhysics* physics = PxCreateBasePhysics(version, foundation, scale, trackOutstandingAllocations, pvd, omniPvd); + if (!physics) return NULL; - PxRegisterArticulations(*physics); PxRegisterArticulationsReducedCoordinate(*physics); PxRegisterHeightFields(*physics); @@ -710,7 +1299,7 @@ PX_INLINE physx::PxPhysics* PxCreatePhysics(physx::PxU32 version, /** \brief Retrieves the Physics SDK after it has been created. -Before using this function the user must call #PxCreatePhysics(). +Before using this function the user must call #PxCreatePhysics() or #PxCreateBasePhysics(). \note The behavior of this method is undefined if the Physics SDK instance has not been created already. */ diff --git a/Source/ThirdParty/PhysX/PxPhysicsAPI.h b/Source/ThirdParty/PhysX/PxPhysicsAPI.h index 1fbfb0aff..d66780805 100644 --- a/Source/ThirdParty/PhysX/PxPhysicsAPI.h +++ b/Source/ThirdParty/PhysX/PxPhysicsAPI.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NXPHYSICS_API -#define PX_PHYSICS_NXPHYSICS_API +#ifndef PX_PHYSICS_API_H +#define PX_PHYSICS_API_H /** \addtogroup physics @{ */ @@ -43,29 +41,65 @@ Alternatively, one can instead directly #include a subset of the below files. // Foundation SDK #include "foundation/Px.h" +#include "foundation/PxAlignedMalloc.h" +#include "foundation/PxAlloca.h" #include "foundation/PxAllocatorCallback.h" +#include "foundation/PxArray.h" #include "foundation/PxAssert.h" +#include "foundation/PxAtomic.h" +#include "foundation/PxBasicTemplates.h" #include "foundation/PxBitAndData.h" +#include "foundation/PxBitMap.h" +#include "foundation/PxBitUtils.h" #include "foundation/PxBounds3.h" +#include "foundation/PxBroadcast.h" #include "foundation/PxErrorCallback.h" #include "foundation/PxErrors.h" #include "foundation/PxFlags.h" +#include "foundation/PxFoundation.h" +#include "foundation/PxFoundationConfig.h" +#include "foundation/PxFPU.h" +#include "foundation/PxHash.h" +#include "foundation/PxHashMap.h" +#include "foundation/PxHashSet.h" +#include "foundation/PxInlineAllocator.h" +#include "foundation/PxInlineArray.h" #include "foundation/PxIntrinsics.h" #include "foundation/PxIO.h" #include "foundation/PxMat33.h" #include "foundation/PxMat44.h" #include "foundation/PxMath.h" +#include "foundation/PxMathIntrinsics.h" #include "foundation/PxMathUtils.h" +#include "foundation/PxMemory.h" +#include "foundation/PxMutex.h" +#include "foundation/PxPhysicsVersion.h" #include "foundation/PxPlane.h" +#include "foundation/PxPool.h" #include "foundation/PxPreprocessor.h" +#include "foundation/PxProfiler.h" #include "foundation/PxQuat.h" #include "foundation/PxSimpleTypes.h" +#include "foundation/PxSList.h" +#include "foundation/PxSocket.h" +#include "foundation/PxSort.h" #include "foundation/PxStrideIterator.h" +#include "foundation/PxString.h" +#include "foundation/PxSync.h" +#include "foundation/PxTempAllocator.h" +#include "foundation/PxThread.h" +#include "foundation/PxTime.h" #include "foundation/PxTransform.h" #include "foundation/PxUnionCast.h" +#include "foundation/PxUserAllocated.h" +#include "foundation/PxUtilities.h" #include "foundation/PxVec2.h" #include "foundation/PxVec3.h" #include "foundation/PxVec4.h" +#include "foundation/PxVecMath.h" +#include "foundation/PxVecQuat.h" +#include "foundation/PxVecTransform.h" + //Not physics specific utilities and common code #include "common/PxCoreUtilityTypes.h" @@ -79,7 +113,7 @@ Alternatively, one can instead directly #include a subset of the below files. #include "common/PxMetaData.h" #include "common/PxMetaDataFlags.h" #include "common/PxSerialFramework.h" -#include "common/PxPhysicsInsertionCallback.h" +#include "common/PxInsertionCallback.h" //Task Manager #include "task/PxTask.h" @@ -91,7 +125,8 @@ Alternatively, one can instead directly #include a subset of the below files. //Geometry Library #include "geometry/PxBoxGeometry.h" -#include "geometry/PxBVHStructure.h" +#include "geometry/PxBVH.h" +#include "geometry/PxBVHBuildStrategy.h" #include "geometry/PxCapsuleGeometry.h" #include "geometry/PxConvexMesh.h" #include "geometry/PxConvexMeshGeometry.h" @@ -111,31 +146,33 @@ Alternatively, one can instead directly #include a subset of the below files. #include "geometry/PxTriangle.h" #include "geometry/PxTriangleMesh.h" #include "geometry/PxTriangleMeshGeometry.h" - +#include "geometry/PxTetrahedron.h" +#include "geometry/PxTetrahedronMesh.h" +#include "geometry/PxTetrahedronMeshGeometry.h" // PhysX Core SDK #include "PxActor.h" #include "PxAggregate.h" -#include "PxArticulation.h" #include "PxArticulationReducedCoordinate.h" -#include "PxArticulationJoint.h" #include "PxArticulationJointReducedCoordinate.h" #include "PxArticulationLink.h" -#include "PxBatchQuery.h" -#include "PxBatchQueryDesc.h" #include "PxClient.h" +#include "PxConeLimitedConstraint.h" #include "PxConstraint.h" #include "PxConstraintDesc.h" #include "PxContact.h" #include "PxContactModifyCallback.h" #include "PxDeletionListener.h" +#include "PxFEMSoftBodyMaterial.h" #include "PxFiltering.h" #include "PxForceMode.h" -#include "PxFoundation.h" #include "PxLockedData.h" #include "PxMaterial.h" +#include "PxParticleBuffer.h" +#include "PxParticleSystem.h" +#include "PxPBDParticleSystem.h" +#include "PxPBDMaterial.h" #include "PxPhysics.h" -#include "PxPhysicsVersion.h" #include "PxPhysXConfig.h" #include "PxQueryFiltering.h" #include "PxQueryReport.h" @@ -149,8 +186,19 @@ Alternatively, one can instead directly #include a subset of the below files. #include "PxShape.h" #include "PxSimulationEventCallback.h" #include "PxSimulationStatistics.h" +#include "PxSoftBody.h" #include "PxVisualizationParameter.h" #include "PxPruningStructure.h" +#if PX_ENABLE_FEATURES_UNDER_CONSTRUCTION +#include "PxCustomParticleSystem.h" +#include "PxFEMCloth.h" +#include "PxFEMClothMaterial.h" +#include "PxFLIPParticleSystem.h" +#include "PxFLIPMaterial.h" +#include "PxHairSystem.h" +#include "PxMPMMaterial.h" +#include "PxMPMParticleSystem.h" +#endif //Character Controller #include "characterkinematic/PxBoxController.h" @@ -172,21 +220,7 @@ Alternatively, one can instead directly #include a subset of the below files. //Extensions to the SDK #include "extensions/PxDefaultStreams.h" -#include "extensions/PxDistanceJoint.h" #include "extensions/PxExtensionsAPI.h" -#include "extensions/PxFixedJoint.h" -#include "extensions/PxJoint.h" -#include "extensions/PxJointLimit.h" -#include "extensions/PxPrismaticJoint.h" -#include "extensions/PxRevoluteJoint.h" -#include "extensions/PxRigidBodyExt.h" -#include "extensions/PxShapeExt.h" -#include "extensions/PxSimpleFactory.h" -#include "extensions/PxSmoothNormals.h" -#include "extensions/PxSphericalJoint.h" -#include "extensions/PxStringTableExt.h" -#include "extensions/PxTriangleMeshExt.h" -#include "extensions/PxConvexMeshExt.h" //Serialization #include "extensions/PxSerialization.h" @@ -194,6 +228,7 @@ Alternatively, one can instead directly #include a subset of the below files. #include "extensions/PxRepXSerializer.h" //Vehicle Simulation +#include "vehicle2/PxVehicleAPI.h" #include "vehicle/PxVehicleComponents.h" #include "vehicle/PxVehicleDrive.h" #include "vehicle/PxVehicleDrive4W.h" @@ -202,6 +237,7 @@ Alternatively, one can instead directly #include a subset of the below files. #include "vehicle/PxVehicleShaders.h" #include "vehicle/PxVehicleTireFriction.h" #include "vehicle/PxVehicleUpdate.h" +#include "vehicle/PxVehicleUtil.h" #include "vehicle/PxVehicleUtilControl.h" #include "vehicle/PxVehicleUtilSetup.h" #include "vehicle/PxVehicleUtilTelemetry.h" diff --git a/Source/ThirdParty/PhysX/PxPhysicsSerialization.h b/Source/ThirdParty/PhysX/PxPhysicsSerialization.h index f9d657b98..e9383ab51 100644 --- a/Source/ThirdParty/PhysX/PxPhysicsSerialization.h +++ b/Source/ThirdParty/PhysX/PxPhysicsSerialization.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_PX_PHYSICS_SERIALIZATION -#define PX_PHYSICS_PX_PHYSICS_SERIALIZATION +#ifndef PX_PHYSICS_SERIALIZATION_H +#define PX_PHYSICS_SERIALIZATION_H #include "common/PxSerialFramework.h" #include "PxPhysXConfig.h" @@ -37,10 +35,13 @@ #if !PX_DOXYGEN /** \brief Retrieves the PhysX SDK metadata. + +\deprecated Binary conversion and binary meta data are deprecated. + This function is used to implement PxSerialization.dumpBinaryMetaData() and is not intended to be needed otherwise. @see PxSerialization.dumpBinaryMetaData() */ -PX_C_EXPORT PX_PHYSX_CORE_API void PX_CALL_CONV PxGetPhysicsBinaryMetaData(physx::PxOutputStream& stream); +PX_DEPRECATED PX_C_EXPORT PX_PHYSX_CORE_API void PX_CALL_CONV PxGetPhysicsBinaryMetaData(physx::PxOutputStream& stream); /** \brief Registers physics classes for serialization. @@ -71,4 +72,5 @@ PX_C_EXPORT PX_PHYSX_CORE_API void PX_CALL_CONV PxAddCollectionToPhysics(const p #endif // !PX_DOXYGEN -#endif // PX_PHYSICS_PX_PHYSICS_SERIALIZATION +#endif + diff --git a/Source/ThirdParty/PhysX/PxPruningStructure.h b/Source/ThirdParty/PhysX/PxPruningStructure.h index 562b5fffc..86019b1a3 100644 --- a/Source/ThirdParty/PhysX/PxPruningStructure.h +++ b/Source/ThirdParty/PhysX/PxPruningStructure.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_PRUNING_STRUCTURE -#define PX_PHYSICS_NX_PRUNING_STRUCTURE +#ifndef PX_PRUNING_STRUCTURE_H +#define PX_PRUNING_STRUCTURE_H /** \addtogroup physics @{ */ @@ -58,7 +56,7 @@ doing queries against the newly added actors. This applies to both static and dy invalidate the pruning structure. Same happens if shape scene query flags change or shape gets removed from an actor. @see PxScene::addActors PxCollection -*/ +*/ class PxPruningStructure : public PxBase { public: @@ -92,6 +90,30 @@ public: */ virtual PxU32 getNbRigidActors() const = 0; + /** + \brief Gets the merge data for static actors + + This is mainly called by the PxSceneQuerySystem::merge() function to merge a PxPruningStructure + with the internal data-structures of the scene-query system. + + \return Implementation-dependent merge data for static actors. + + @see PxSceneQuerySystem::merge() + */ + virtual const void* getStaticMergeData() const = 0; + + /** + \brief Gets the merge data for dynamic actors + + This is mainly called by the PxSceneQuerySystem::merge() function to merge a PxPruningStructure + with the internal data-structures of the scene-query system. + + \return Implementation-dependent merge data for dynamic actors. + + @see PxSceneQuerySystem::merge() + */ + virtual const void* getDynamicMergeData() const = 0; + virtual const char* getConcreteTypeName() const { return "PxPruningStructure"; } protected: PX_INLINE PxPruningStructure(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags) {} @@ -106,4 +128,5 @@ protected: #endif /** @} */ -#endif // PX_PHYSICS_NX_PRUNING_STRUCTURE +#endif + diff --git a/Source/ThirdParty/PhysX/PxQueryFiltering.h b/Source/ThirdParty/PhysX/PxQueryFiltering.h index 816ed9085..1ed8002c9 100644 --- a/Source/ThirdParty/PhysX/PxQueryFiltering.h +++ b/Source/ThirdParty/PhysX/PxQueryFiltering.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_SCENE_QUERY_FILTERING -#define PX_PHYSICS_NX_SCENE_QUERY_FILTERING +#ifndef PX_QUERY_FILTERING_H +#define PX_QUERY_FILTERING_H /** \addtogroup scenequery @{ */ @@ -48,7 +46,6 @@ class PxShape; class PxRigidActor; struct PxQueryHit; - /** \brief Filtering flags for scene queries. @@ -58,25 +55,33 @@ struct PxQueryFlag { enum Enum { - eSTATIC = (1<<0), //!< Traverse static shapes + eSTATIC = (1<<0), //!< Traverse static shapes - eDYNAMIC = (1<<1), //!< Traverse dynamic shapes + eDYNAMIC = (1<<1), //!< Traverse dynamic shapes - ePREFILTER = (1<<2), //!< Run the pre-intersection-test filter (see #PxQueryFilterCallback::preFilter()) + ePREFILTER = (1<<2), //!< Run the pre-intersection-test filter (see #PxQueryFilterCallback::preFilter()) - ePOSTFILTER = (1<<3), //!< Run the post-intersection-test filter (see #PxQueryFilterCallback::postFilter()) + ePOSTFILTER = (1<<3), //!< Run the post-intersection-test filter (see #PxQueryFilterCallback::postFilter()) - eANY_HIT = (1<<4), //!< Abort traversal as soon as any hit is found and return it via callback.block. - //!< Helps query performance. Both eTOUCH and eBLOCK hitTypes are considered hits with this flag. + eANY_HIT = (1<<4), //!< Abort traversal as soon as any hit is found and return it via callback.block. + //!< Helps query performance. Both eTOUCH and eBLOCK hitTypes are considered hits with this flag. - eNO_BLOCK = (1<<5), //!< All hits are reported as touching. Overrides eBLOCK returned from user filters with eTOUCH. - //!< This is also an optimization hint that may improve query performance. + eNO_BLOCK = (1<<5), //!< All hits are reported as touching. Overrides eBLOCK returned from user filters with eTOUCH. + //!< This is also an optimization hint that may improve query performance. + + eBATCH_QUERY_LEGACY_BEHAVIOUR = (1<<6), //!< Run with legacy batch query filter behavior. Raising this flag ensures that + //!< the hardcoded filter equation is neglected. This guarantees that any provided PxQueryFilterCallback + //!< will be utilised, as specified by the ePREFILTER and ePOSTFILTER flags. - eRESERVED = (1<<15) //!< Reserved for internal use + eDISABLE_HARDCODED_FILTER = (1<<6), //!< Same as eBATCH_QUERY_LEGACY_BEHAVIOUR, more explicit name making it clearer that this can also be used + //!< with regular/non-batched queries if needed. + + eRESERVED = (1<<15) //!< Reserved for internal use }; }; PX_COMPILE_TIME_ASSERT(PxQueryFlag::eSTATIC==(1<<0)); PX_COMPILE_TIME_ASSERT(PxQueryFlag::eDYNAMIC==(1<<1)); +PX_COMPILE_TIME_ASSERT(PxQueryFlag::eBATCH_QUERY_LEGACY_BEHAVIOUR==PxQueryFlag::eDISABLE_HARDCODED_FILTER); /** \brief Flags typedef for the set of bits defined in PxQueryFlag. @@ -127,7 +132,7 @@ queryFilterData is zero, the shape is skipped to type #PxQueryHitType::eBLOCK when the value of PxHitCallback::nbTouches provided with the query is zero and to type #PxQueryHitType::eTOUCH when PxHitCallback::nbTouches is positive. -@see PxScene.raycast PxScene.sweep PxScene.overlap PxBatchQuery.raycast PxBatchQuery.sweep PxBatchQuery.overlap PxQueryFlag::eANY_HIT +@see PxScene.raycast PxScene.sweep PxScene.overlap PxQueryFlag::eANY_HIT */ struct PxQueryFilterData { @@ -173,10 +178,10 @@ public: /** \brief This filter callback is executed before the exact intersection test if PxQueryFlag::ePREFILTER flag was set. - \param[in] filterData custom filter data specified as the query's filterData.data parameter. - \param[in] shape A shape that has not yet passed the exact intersection test. - \param[in] actor The shape's actor. - \param[in,out] queryFlags scene query flags from the query's function call (only flags from PxHitFlag::eMODIFIABLE_FLAGS bitmask can be modified) + \param[in] filterData custom filter data specified as the query's filterData.data parameter. + \param[in] shape A shape that has not yet passed the exact intersection test. + \param[in] actor The shape's actor. + \param[in,out] queryFlags scene query flags from the query's function call (only flags from PxHitFlag::eMODIFIABLE_FLAGS bitmask can be modified) \return the updated type for this hit (see #PxQueryHitType) */ virtual PxQueryHitType::Enum preFilter( @@ -185,11 +190,33 @@ public: /** \brief This filter callback is executed if the exact intersection test returned true and PxQueryFlag::ePOSTFILTER flag was set. - \param[in] filterData custom filter data of the query - \param[in] hit Scene query hit information. faceIndex member is not valid for overlap queries. For sweep and raycast queries the hit information can be cast to #PxSweepHit and #PxRaycastHit respectively. + \param[in] filterData custom filter data of the query + \param[in] hit Scene query hit information. faceIndex member is not valid for overlap queries. For sweep and raycast queries the hit information can be cast to #PxSweepHit and #PxRaycastHit respectively. + \return the updated hit type for this hit (see #PxQueryHitType) + @deprecated + */ + PX_DEPRECATED virtual PxQueryHitType::Enum postFilter(const PxFilterData& filterData, const PxQueryHit& hit) + { + PX_UNUSED(filterData); + PX_UNUSED(hit); + return PxQueryHitType::eBLOCK; + } + + /** + \brief This filter callback is executed if the exact intersection test returned true and PxQueryFlag::ePOSTFILTER flag was set. + + \param[in] filterData custom filter data of the query + \param[in] hit Scene query hit information. faceIndex member is not valid for overlap queries. For sweep and raycast queries the hit information can be cast to #PxSweepHit and #PxRaycastHit respectively. + \param[in] shape Hit shape + \param[in] actor Hit actor \return the updated hit type for this hit (see #PxQueryHitType) */ - virtual PxQueryHitType::Enum postFilter(const PxFilterData& filterData, const PxQueryHit& hit) = 0; + virtual PxQueryHitType::Enum postFilter(const PxFilterData& filterData, const PxQueryHit& hit, const PxShape* shape, const PxRigidActor* actor) + { + PX_UNUSED(shape); + PX_UNUSED(actor); + return postFilter(filterData, hit); + } /** \brief virtual destructor @@ -197,76 +224,6 @@ public: virtual ~PxQueryFilterCallback() {} }; -/** -\brief Batched query pre-filter shader. - -Custom filtering logic for batched query intersection candidates. If an intersection candidate object passes the data based filter (see #PxQueryFilterData), -filtering shader runs if specified in filtering flags (see #PxQueryFilterData.flags) - -\li If #PxQueryFlag::ePREFILTER is set, the preFilter shader runs before exact intersection tests. -If the shader returns #PxQueryHitType::eTOUCH or #PxQueryHitType::eBLOCK, exact testing is performed to -determine the intersection location. - -The preFilter shader may overwrite the copy of queryFlags it receives as an argument to specify any of #PxHitFlag::eMODIFIABLE_FLAGS -on a per-shape basis. Changes apply only to the shape being filtered, and changes to other flags are ignored. - -\li If #PxQueryFlag::ePREFILTER is not set, precise intersection testing is performed using the original query's filterData.flags. - -Filtering calls are not guaranteed to be sorted along the ray or sweep direction. - -\deprecated The batched query feature has been deprecated in PhysX version 3.4 - -@see PxBatchQueryDesc.preFilterShader PxQueryFilterCallback.preFilter PxBatchQueryPostFilterShader - -*/ - -/** -\param[in] queryFilterData Query filter data -\param[in] objectFilterData Object filter data -\param[in] constantBlock Global constant filter data (see #PxBatchQuery) -\param[in] constantBlockSize Size of global filter data (see #PxBatchQuery) -\param[in,out] hitFlags Per-object modifiable hit flags (only flags from PxHitFlag::eMODIFIABLE_FLAGS mask can be modified) -\return the updated hit type for this hit (see #PxQueryHitType) - -@see PxBatchQueryPostFilterShader -*/ -typedef PX_DEPRECATED PxQueryHitType::Enum (*PxBatchQueryPreFilterShader)( - PxFilterData queryFilterData, PxFilterData objectFilterData, - const void* constantBlock, PxU32 constantBlockSize, - PxHitFlags& hitFlags); - -/** -\brief Batched query post-filter shader. - -Custom filtering logic for batched query intersection candidates. If an intersection candidate object passes the data based filter (see #PxQueryFilterData), -the filtering shader run on request (see #PxQueryFilterData.flags) - -\li If #PxQueryFlag::ePOSTFILTER is set, the postFilter shader is called for each intersection to determine the touch/block status. -This overrides any touch/block status previously returned from the preFilter function for this shape. - -Filtering shaders are not in order along the query direction, rather they are processed in the order in which -candidate shapes for testing are found by PhysX' scene traversal algorithms. - -\deprecated The batched query feature has been deprecated in PhysX version 3.4 - -@see PxBatchQueryDesc.postFilterShader PxQueryFilterCallback.postFilter PxBatchQueryPreFilterShader -*/ - -/** -\param[in] queryFilterData Query filter data -\param[in] objectFilterData Object filter data -\param[in] constantBlock Global constant filter data (see #PxBatchQuery) -\param[in] constantBlockSize Size of global filter data (see #PxBatchQuery) -\param[in] hit Hit data from the prior exact intersection test. -\return the new hit type for this hit (see #PxQueryHitType) - -@see PxBatchQueryPreFilterShader -*/ - -typedef PX_DEPRECATED PxQueryHitType::Enum (*PxBatchQueryPostFilterShader)( - PxFilterData queryFilterData, PxFilterData objectFilterData, - const void* constantBlock, PxU32 constantBlockSize, - const PxQueryHit& hit); #if !PX_DOXYGEN } // namespace physx diff --git a/Source/ThirdParty/PhysX/PxQueryReport.h b/Source/ThirdParty/PhysX/PxQueryReport.h index f48741ab2..a508d1c26 100644 --- a/Source/ThirdParty/PhysX/PxQueryReport.h +++ b/Source/ThirdParty/PhysX/PxQueryReport.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,19 +22,20 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_SCENEQUERYREPORT -#define PX_PHYSICS_NX_SCENEQUERYREPORT +#ifndef PX_QUERY_REPORT_H +#define PX_QUERY_REPORT_H /** \addtogroup scenequery @{ */ #include "foundation/PxVec3.h" #include "foundation/PxFlags.h" #include "foundation/PxAssert.h" +#include "geometry/PxGeometryHit.h" +#include "geometry/PxGeometryQueryContext.h" #include "PxPhysXConfig.h" #if !PX_DOXYGEN @@ -46,54 +46,6 @@ namespace physx class PxShape; class PxRigidActor; -/** -\brief Scene query and geometry query behavior flags. - -PxHitFlags are used for 3 different purposes: - -1) To request hit fields to be filled in by scene queries (such as hit position, normal, face index or UVs). -2) Once query is completed, to indicate which fields are valid (note that a query may produce more valid fields than requested). -3) To specify additional options for the narrow phase and mid-phase intersection routines. - -All these flags apply to both scene queries and geometry queries (PxGeometryQuery). - -@see PxRaycastHit PxSweepHit PxOverlapHit PxScene.raycast PxScene.sweep PxScene.overlap PxGeometryQuery PxFindFaceIndex -*/ -struct PxHitFlag -{ - enum Enum - { - ePOSITION = (1<<0), //!< "position" member of #PxQueryHit is valid - eNORMAL = (1<<1), //!< "normal" member of #PxQueryHit is valid - eUV = (1<<3), //!< "u" and "v" barycentric coordinates of #PxQueryHit are valid. Not applicable to sweep queries. - eASSUME_NO_INITIAL_OVERLAP = (1<<4), //!< Performance hint flag for sweeps when it is known upfront there's no initial overlap. - //!< NOTE: using this flag may cause undefined results if shapes are initially overlapping. - eMESH_MULTIPLE = (1<<5), //!< Report all hits for meshes rather than just the first. Not applicable to sweep queries. - eMESH_ANY = (1<<6), //!< Report any first hit for meshes. If neither eMESH_MULTIPLE nor eMESH_ANY is specified, - //!< a single closest hit will be reported for meshes. - eMESH_BOTH_SIDES = (1<<7), //!< Report hits with back faces of mesh triangles. Also report hits for raycast - //!< originating on mesh surface and facing away from the surface normal. Not applicable to sweep queries. - //!< Please refer to the user guide for heightfield-specific differences. - ePRECISE_SWEEP = (1<<8), //!< Use more accurate but slower narrow phase sweep tests. - //!< May provide better compatibility with PhysX 3.2 sweep behavior. - eMTD = (1<<9), //!< Report the minimum translation depth, normal and contact point. - eFACE_INDEX = (1<<10), //!< "face index" member of #PxQueryHit is valid - - eDEFAULT = ePOSITION|eNORMAL|eFACE_INDEX, - - /** \brief Only this subset of flags can be modified by pre-filter. Other modifications will be discarded. */ - eMODIFIABLE_FLAGS = eMESH_MULTIPLE|eMESH_BOTH_SIDES|eASSUME_NO_INITIAL_OVERLAP|ePRECISE_SWEEP - }; -}; - - -/** -\brief collection of set bits defined in PxHitFlag. - -@see PxHitFlag -*/ -PX_FLAGS_TYPEDEF(PxHitFlag, PxU16) - /** \brief Combines a shape pointer and the actor the shape belongs to into one memory location. @@ -110,100 +62,10 @@ struct PxActorShape PxShape* shape; }; - -/** -\brief Scene query hit information. -*/ -struct PxQueryHit : public PxActorShape -{ - PX_INLINE PxQueryHit() : faceIndex(0xFFFFffff) {} - - /** - Face index of touched triangle, for triangle meshes, convex meshes and height fields. - - \note This index will default to 0xFFFFffff value for overlap queries. - \note Please refer to the user guide for more details for sweep queries. - \note This index is remapped by mesh cooking. Use #PxTriangleMesh::getTrianglesRemap() to convert to original mesh index. - \note For convex meshes use #PxConvexMesh::getPolygonData() to retrieve touched polygon data. - */ - PxU32 faceIndex; -}; - -/** -\brief Scene query hit information for raycasts and sweeps returning hit position and normal information. - -::PxHitFlag flags can be passed to scene query functions, as an optimization, to cause the SDK to -only generate specific members of this structure. -*/ -struct PxLocationHit : public PxQueryHit -{ - PX_INLINE PxLocationHit() : flags(0), position(PxVec3(0)), normal(PxVec3(0)), distance(PX_MAX_REAL) {} - - /** - \note For raycast hits: true for shapes overlapping with raycast origin. - \note For sweep hits: true for shapes overlapping at zero sweep distance. - - @see PxRaycastHit PxSweepHit - */ - PX_INLINE bool hadInitialOverlap() const { return (distance <= 0.0f); } - - // the following fields are set in accordance with the #PxHitFlags - PxHitFlags flags; //!< Hit flags specifying which members contain valid values. - PxVec3 position; //!< World-space hit position (flag: #PxHitFlag::ePOSITION) - PxVec3 normal; //!< World-space hit normal (flag: #PxHitFlag::eNORMAL) - - /** - \brief Distance to hit. - \note If the eMTD flag is used, distance will be a negative value if shapes are overlapping indicating the penetration depth. - \note Otherwise, this value will be >= 0 */ - PxF32 distance; -}; - - -/** -\brief Stores results of raycast queries. - -::PxHitFlag flags can be passed to raycast function, as an optimization, to cause the SDK to only compute specified members of this -structure. - -Some members like barycentric coordinates are currently only computed for triangle meshes and height fields, but next versions -might provide them in other cases. The client code should check #flags to make sure returned values are valid. - -@see PxScene.raycast PxBatchQuery.raycast -*/ -struct PxRaycastHit : public PxLocationHit -{ - PX_INLINE PxRaycastHit() : u(0.0f), v(0.0f) {} - - // the following fields are set in accordance with the #PxHitFlags - - PxReal u, v; //!< barycentric coordinates of hit point, for triangle mesh and height field (flag: #PxHitFlag::eUV) -#if !PX_P64_FAMILY - PxU32 padTo16Bytes[3]; -#endif -}; - - -/** -\brief Stores results of overlap queries. - -@see PxScene.overlap PxBatchQuery.overlap -*/ -struct PxOverlapHit: public PxQueryHit { PxU32 padTo16Bytes; }; - - -/** -\brief Stores results of sweep queries. - -@see PxScene.sweep PxBatchQuery.sweep -*/ -struct PxSweepHit : public PxLocationHit -{ - PX_INLINE PxSweepHit() {} - - PxU32 padTo16Bytes; -}; - +// Extends geom hits with Px object pointers +struct PxRaycastHit : PxGeomRaycastHit, PxActorShape {}; +struct PxOverlapHit : PxGeomOverlapHit, PxActorShape {}; +struct PxSweepHit : PxGeomSweepHit, PxActorShape {}; /** \brief Describes query behavior after returning a partial query result via a callback. @@ -215,7 +77,6 @@ If callback returns false, traversal will stop, callback will not be issued agai */ typedef bool PxAgain; - /** \brief This callback class facilitates reporting scene query hits (intersections) to the user. @@ -230,7 +91,7 @@ User overrides the virtual processTouches function to receive hits in (possibly @see PxHitBuffer PxRaycastHit PxSweepHit PxOverlapHit PxRaycastCallback PxOverlapCallback PxSweepCallback */ template -struct PxHitCallback +struct PxHitCallback : PxQueryThreadContext { HitType block; //!< Holds the closest blocking hit result for the query. Invalid if hasBlock is false. bool hasBlock; //!< Set to true if there was a blocking hit during query. @@ -293,7 +154,6 @@ struct PxHitCallback PX_FORCE_INLINE bool hasAnyHits() { return (hasBlock || (nbTouches > 0)); } }; - /** \brief Returns scene query hits (intersections) to the user in a preallocated buffer. @@ -340,7 +200,6 @@ protected: virtual PxAgain processTouches(const HitType* buffer, PxU32 nbHits) { PX_UNUSED(buffer); PX_UNUSED(nbHits); return false; } }; - /** \brief Raycast query callback. */ typedef PxHitCallback PxRaycastCallback; @@ -383,6 +242,41 @@ struct PxSweepBufferN : public PxHitBuffer PxSweepBufferN() : PxHitBuffer(hits, N) {} }; +/** +\brief single hit cache for scene queries. + +If a cache object is supplied to a scene query, the cached actor/shape pair is checked for intersection first. +\note Filters are not executed for the cached shape. +\note If intersection is found, the hit is treated as blocking. +\note Typically actor and shape from the last PxHitCallback.block query result is used as a cached actor/shape pair. +\note Using past touching hits as cache will produce incorrect behavior since the cached hit will always be treated as blocking. +\note Cache is only used if no touch buffer was provided, for single nearest blocking hit queries and queries using eANY_HIT flag. +\note if non-zero touch buffer was provided, cache will be ignored + +\note It is the user's responsibility to ensure that the shape and actor are valid, so care must be taken +when deleting shapes to invalidate cached references. + +The faceIndex field is an additional hint for a mesh or height field which is not currently used. + +@see PxScene.raycast +*/ +struct PxQueryCache +{ + /** + \brief constructor sets to default + */ + PX_INLINE PxQueryCache() : shape(NULL), actor(NULL), faceIndex(0xffffffff) {} + + /** + \brief constructor to set properties + */ + PX_INLINE PxQueryCache(PxShape* s, PxU32 findex) : shape(s), actor(NULL), faceIndex(findex) {} + + PxShape* shape; //!< Shape to test for intersection first + PxRigidActor* actor; //!< Actor to which the shape belongs + PxU32 faceIndex; //!< Triangle index to test first - NOT CURRENTLY SUPPORTED +}; + #if !PX_DOXYGEN } // namespace physx #endif diff --git a/Source/ThirdParty/PhysX/PxRigidActor.h b/Source/ThirdParty/PhysX/PxRigidActor.h index 09852863f..1c3d8ae96 100644 --- a/Source/ThirdParty/PhysX/PxRigidActor.h +++ b/Source/ThirdParty/PhysX/PxRigidActor.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_RIGIDACTOR -#define PX_PHYSICS_NX_RIGIDACTOR +#ifndef PX_RIGID_ACTOR_H +#define PX_RIGID_ACTOR_H /** \addtogroup physics @{ */ @@ -43,9 +41,6 @@ namespace physx #endif class PxConstraint; -class PxMaterial; -class PxGeometry; -class PxBVHStructure; /** \brief PxRigidActor represents a base class shared between dynamic and static rigid bodies in the physics SDK. @@ -54,13 +49,12 @@ PxRigidActor objects specify the geometry of the object by defining a set of att @see PxActor */ - class PxRigidActor : public PxActor { public: /** \brief Deletes the rigid actor object. - + Also releases any shapes associated with the actor. Releasing an actor will affect any objects that are connected to the actor (constraint shaders like joints etc.). @@ -76,6 +70,14 @@ public: */ virtual void release() = 0; + /** + \brief Returns the internal actor index. + + \warning This is only defined for actors that have been added to a scene. + + \return The internal actor index, or 0xffffffff if the actor is not part of a scene. + */ + virtual PxU32 getInternalActorIndex() const = 0; /************************************************************************************************/ /** @name Global Pose Manipulation @@ -86,6 +88,9 @@ public: The getGlobalPose() method retrieves the actor's current actor space to world space transformation. + \note It is not allowed to use this method while the simulation is running (except during PxScene::collide(), + in PxContactModifyCallback or in contact report callbacks). + \return Global pose of object. @see PxRigidDynamic.setGlobalPose() PxRigidStatic.setGlobalPose() @@ -95,19 +100,19 @@ public: /** \brief Method for setting an actor's pose in the world. - This method instantaneously changes the actor space to world space transformation. + This method instantaneously changes the actor space to world space transformation. - This method is mainly for dynamic rigid bodies (see #PxRigidDynamic). Calling this method on static actors is - likely to result in a performance penalty, since internal optimization structures for static actors may need to be - recomputed. In addition, moving static actors will not interact correctly with dynamic actors or joints. - - To directly control an actor's position and have it correctly interact with dynamic bodies and joints, create a dynamic + This method is mainly for dynamic rigid bodies (see #PxRigidDynamic). Calling this method on static actors is + likely to result in a performance penalty, since internal optimization structures for static actors may need to be + recomputed. In addition, moving static actors will not interact correctly with dynamic actors or joints. + + To directly control an actor's position and have it correctly interact with dynamic bodies and joints, create a dynamic body with the PxRigidBodyFlag::eKINEMATIC flag, then use the setKinematicTarget() commands to define its path. Even when moving dynamic actors, exercise restraint in making use of this method. Where possible, avoid: - + \li moving actors into other actors, thus causing overlap (an invalid physical state) - + \li moving an actor that is connected by a joint to another away from the other (thus causing joint error) Sleeping: This call wakes dynamic actors if they are sleeping and the autowake parameter is true (default). @@ -119,12 +124,12 @@ public: */ virtual void setGlobalPose(const PxTransform& pose, bool autowake = true) = 0; - /************************************************************************************************/ /** @name Shapes */ - /** attach a shared shape to an actor + /** + \brief Attach a shape to an actor This call will increment the reference count of the shape. @@ -135,7 +140,6 @@ public: Attaching a triangle mesh, heightfield or plane geometry shape configured as eSIMULATION_SHAPE is not supported for non-kinematic PxRigidDynamic instances. - Sleeping: Does NOT wake the actor up automatically. \param[in] shape the shape to attach. @@ -144,20 +148,18 @@ public: */ virtual bool attachShape(PxShape& shape) = 0; - - /** detach a shape from an actor. + /** + \brief Detach a shape from an actor. This will also decrement the reference count of the PxShape, and if the reference count is zero, will cause it to be deleted. Sleeping: Does NOT wake the actor up automatically. \param[in] shape the shape to detach. - \param[in] wakeOnLostTouch Specifies whether touching objects from the previous frame should get woken up in the next frame. Only applies to PxArticulation and PxRigidActor types. - + \param[in] wakeOnLostTouch Specifies whether touching objects from the previous frame should get woken up in the next frame. Only applies to PxArticulationReducedCoordinate and PxRigidActor types. */ virtual void detachShape(PxShape& shape, bool wakeOnLostTouch = true) = 0; - /** \brief Returns the number of shapes assigned to the actor. @@ -169,7 +171,6 @@ public: */ virtual PxU32 getNbShapes() const = 0; - /** \brief Retrieve all the shape pointers belonging to the actor. @@ -188,7 +189,6 @@ public: */ virtual PxU32 getShapes(PxShape** userBuffer, PxU32 bufferSize, PxU32 startIndex=0) const = 0; - /************************************************************************************************/ /** @name Constraints */ @@ -204,7 +204,6 @@ public: */ virtual PxU32 getNbConstraints() const = 0; - /** \brief Retrieve all the constraint shader pointers belonging to the actor. @@ -228,7 +227,6 @@ protected: virtual bool isKindOf(const char* name) const { return !::strcmp("PxRigidActor", name) || PxActor::isKindOf(name); } }; - #if !PX_DOXYGEN } // namespace physx #endif diff --git a/Source/ThirdParty/PhysX/PxRigidBody.h b/Source/ThirdParty/PhysX/PxRigidBody.h index 1d9feee02..4d0ecafa5 100644 --- a/Source/ThirdParty/PhysX/PxRigidBody.h +++ b/Source/ThirdParty/PhysX/PxRigidBody.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,37 +22,34 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_RIGIDBODY -#define PX_PHYSICS_NX_RIGIDBODY +#ifndef PX_RIGID_BODY_H +#define PX_RIGID_BODY_H /** \addtogroup physics @{ */ #include "PxRigidActor.h" #include "PxForceMode.h" +#include "PxNodeIndex.h" #if !PX_DOXYGEN namespace physx { #endif - /** \brief Collection of flags describing the behavior of a rigid body. @see PxRigidBody.setRigidBodyFlag(), PxRigidBody.getRigidBodyFlags() */ - struct PxRigidBodyFlag { enum Enum { - /** \brief Enables kinematic mode for the actor. @@ -75,7 +71,7 @@ struct PxRigidBodyFlag @see PxRigidDynamic.setKinematicTarget() */ - eKINEMATIC = (1<<0), //!< Enable kinematic mode for the body. + eKINEMATIC = (1<<0), //!< Enable kinematic mode for the body. /** \brief Use the kinematic target transform for scene queries. @@ -86,7 +82,7 @@ struct PxRigidBodyFlag @see PxRigidDynamic.setKinematicTarget() */ - eUSE_KINEMATIC_TARGET_FOR_SCENE_QUERIES = (1<<1), + eUSE_KINEMATIC_TARGET_FOR_SCENE_QUERIES = (1<<1), /** \brief Enables swept integration for the actor. @@ -96,9 +92,8 @@ struct PxRigidBodyFlag individual interactions. \note kinematic actors are incompatible with CCD so this flag will be cleared automatically when raised on a kinematic actor - */ - eENABLE_CCD = (1<<2), //!< Enable CCD for the body. + eENABLE_CCD = (1<<2), //!< Enable CCD for the body. /** \brief Enabled CCD in swept integration for the actor. @@ -109,7 +104,15 @@ struct PxRigidBodyFlag \note This flag requires PxRigidBodyFlag::eENABLE_CCD to be raised to have any effect. */ - eENABLE_CCD_FRICTION = (1<<3), + eENABLE_CCD_FRICTION = (1<<3), + + /** + \brief Register a rigid body to dynamically adjust contact offset based on velocity. This can be used to achieve a CCD effect. + + If both eENABLE_CCD and eENABLE_SPECULATIVE_CCD are set on the same body, then angular motions are handled by speculative + contacts (eENABLE_SPECULATIVE_CCD) while linear motions are handled by sweeps (eENABLE_CCD). + */ + eENABLE_SPECULATIVE_CCD = (1<<4), /** \brief Register a rigid body for reporting pose changes by the simulation at an early stage. @@ -121,22 +124,60 @@ struct PxRigidBodyFlag @see PxSimulationEventCallback::onAdvance() */ - eENABLE_POSE_INTEGRATION_PREVIEW = (1 << 4), - - /** - \brief Register a rigid body to dynamicly adjust contact offset based on velocity. This can be used to achieve a CCD effect. - */ - eENABLE_SPECULATIVE_CCD = (1 << 5), + eENABLE_POSE_INTEGRATION_PREVIEW = (1<<5), /** \brief Permit CCD to limit maxContactImpulse. This is useful for use-cases like a destruction system but can cause visual artefacts so is not enabled by default. */ - eENABLE_CCD_MAX_CONTACT_IMPULSE = (1 << 6), + eENABLE_CCD_MAX_CONTACT_IMPULSE = (1<<6), /** - \brief Carries over forces/accelerations between frames, rather than clearning them + \brief Carries over forces/accelerations between frames, rather than clearing them */ - eRETAIN_ACCELERATIONS = (1<<7) + eRETAIN_ACCELERATIONS = (1<<7), + + /** + \brief Forces kinematic-kinematic pairs notifications for this actor. + + This flag overrides the global scene-level PxPairFilteringMode setting for kinematic actors. + This is equivalent to having PxPairFilteringMode::eKEEP for pairs involving this actor. + + A particular use case is when you have a large amount of kinematic actors, but you are only + interested in interactions between a few of them. In this case it is best to use + PxSceneDesc.kineKineFilteringMode = PxPairFilteringMode::eKILL, and then raise the + eFORCE_KINE_KINE_NOTIFICATIONS flag on the small set of kinematic actors that need + notifications. + + \note This has no effect if PxRigidBodyFlag::eKINEMATIC is not set. + + \warning Changing this flag at runtime will not have an effect until you remove and re-add the actor to the scene. + + @see PxPairFilteringMode PxSceneDesc.kineKineFilteringMode + */ + eFORCE_KINE_KINE_NOTIFICATIONS = (1<<8), + + /** + \brief Forces static-kinematic pairs notifications for this actor. + + Similar to eFORCE_KINE_KINE_NOTIFICATIONS, but for static-kinematic interactions. + + \note This has no effect if PxRigidBodyFlag::eKINEMATIC is not set. + + \warning Changing this flag at runtime will not have an effect until you remove and re-add the actor to the scene. + + @see PxPairFilteringMode PxSceneDesc.staticKineFilteringMode + */ + eFORCE_STATIC_KINE_NOTIFICATIONS = (1<<9), + + /** + \brief Enables computation of gyroscopic forces on the rigid body. + */ + eENABLE_GYROSCOPIC_FORCES = (1<<10), + + /** + \brief Reserved for internal usage + */ + eRESERVED = (1<<15) }; }; @@ -145,8 +186,8 @@ struct PxRigidBodyFlag @see PxRigidBodyFlag */ -typedef PxFlags PxRigidBodyFlags; -PX_FLAGS_OPERATORS(PxRigidBodyFlag::Enum,PxU8) +typedef PxFlags PxRigidBodyFlags; +PX_FLAGS_OPERATORS(PxRigidBodyFlag::Enum,PxU16) /** \brief PxRigidBody is a base class shared between dynamic rigid body objects. @@ -177,8 +218,7 @@ public: @see getCMassLocalPose() PxRigidBodyDesc.massLocalPose */ - virtual void setCMassLocalPose(const PxTransform& pose) = 0; - + virtual void setCMassLocalPose(const PxTransform& pose) = 0; /** \brief Retrieves the center of mass pose relative to the actor frame. @@ -189,7 +229,6 @@ public: */ virtual PxTransform getCMassLocalPose() const = 0; - /** \brief Sets the mass of a dynamic actor. @@ -209,7 +248,7 @@ public: @see getMass() PxRigidBodyDesc.mass setMassSpaceInertiaTensor() */ - virtual void setMass(PxReal mass) = 0; + virtual void setMass(PxReal mass) = 0; /** \brief Retrieves the mass of the actor. @@ -220,7 +259,7 @@ public: @see setMass() PxRigidBodyDesc.mass setMassSpaceInertiaTensor() */ - virtual PxReal getMass() const = 0; + virtual PxReal getMass() const = 0; /** \brief Retrieves the inverse mass of the actor. @@ -229,7 +268,7 @@ public: @see setMass() PxRigidBodyDesc.mass setMassSpaceInertiaTensor() */ - virtual PxReal getInvMass() const = 0; + virtual PxReal getInvMass() const = 0; /** \brief Sets the inertia tensor, using a parameter specified in mass space coordinates. @@ -252,7 +291,7 @@ public: @see PxRigidBodyDesc.massSpaceInertia getMassSpaceInertia() setMass() setCMassLocalPose() */ - virtual void setMassSpaceInertiaTensor(const PxVec3& m) = 0; + virtual void setMassSpaceInertiaTensor(const PxVec3& m) = 0; /** \brief Retrieves the diagonal inertia tensor of the actor relative to the mass coordinate frame. @@ -265,7 +304,7 @@ public: @see PxRigidBodyDesc.massSpaceInertia setMassSpaceInertiaTensor() setMass() setCMassLocalPose() */ - virtual PxVec3 getMassSpaceInertiaTensor() const = 0; + virtual PxVec3 getMassSpaceInertiaTensor() const = 0; /** \brief Retrieves the diagonal inverse inertia tensor of the actor relative to the mass coordinate frame. @@ -278,7 +317,7 @@ public: @see PxRigidBodyDesc.massSpaceInertia setMassSpaceInertiaTensor() setMass() setCMassLocalPose() */ - virtual PxVec3 getMassSpaceInvInertiaTensor() const = 0; + virtual PxVec3 getMassSpaceInvInertiaTensor() const = 0; /************************************************************************************************/ /** @name Damping @@ -295,7 +334,7 @@ public: @see getLinearDamping() setAngularDamping() */ - virtual void setLinearDamping(PxReal linDamp) = 0; + virtual void setLinearDamping(PxReal linDamp) = 0; /** \brief Retrieves the linear damping coefficient. @@ -304,7 +343,7 @@ public: @see setLinearDamping() getAngularDamping() */ - virtual PxReal getLinearDamping() const = 0; + virtual PxReal getLinearDamping() const = 0; /** \brief Sets the angular damping coefficient. @@ -319,7 +358,7 @@ public: @see getAngularDamping() setLinearDamping() */ - virtual void setAngularDamping(PxReal angDamp) = 0; + virtual void setAngularDamping(PxReal angDamp) = 0; /** \brief Retrieves the angular damping coefficient. @@ -328,76 +367,62 @@ public: @see setAngularDamping() getLinearDamping() */ - virtual PxReal getAngularDamping() const = 0; + virtual PxReal getAngularDamping() const = 0; /************************************************************************************************/ /** @name Velocity */ - /** \brief Retrieves the linear velocity of an actor. + \note It is not allowed to use this method while the simulation is running (except during PxScene::collide(), + in PxContactModifyCallback or in contact report callbacks). + \return The linear velocity of the actor. @see PxRigidDynamic.setLinearVelocity() getAngularVelocity() */ - virtual PxVec3 getLinearVelocity() const = 0; - - /** - \brief Sets the linear velocity of the actor. - - Note that if you continuously set the velocity of an actor yourself, - forces such as gravity or friction will not be able to manifest themselves, because forces directly - influence only the velocity/momentum of an actor. - - Default: (0.0, 0.0, 0.0) - - Sleeping: This call wakes the actor if it is sleeping, the autowake parameter is true (default) or the - new velocity is non-zero - - \note It is invalid to use this method if PxActorFlag::eDISABLE_SIMULATION is set. - - \param[in] linVel New linear velocity of actor. Range: velocity vector - \param[in] autowake Whether to wake the object up if it is asleep and the velocity is non-zero. If true and the current wake counter value is smaller than #PxSceneDesc::wakeCounterResetValue it will get increased to the reset value. - - @see getLinearVelocity() setAngularVelocity() - */ - virtual void setLinearVelocity(const PxVec3& linVel, bool autowake = true ) = 0; - - + virtual PxVec3 getLinearVelocity() const = 0; /** \brief Retrieves the angular velocity of the actor. + \note It is not allowed to use this method while the simulation is running (except during PxScene::collide(), + in PxContactModifyCallback or in contact report callbacks). + \return The angular velocity of the actor. @see PxRigidDynamic.setAngularVelocity() getLinearVelocity() */ - virtual PxVec3 getAngularVelocity() const = 0; - + virtual PxVec3 getAngularVelocity() const = 0; /** - \brief Sets the angular velocity of the actor. - - Note that if you continuously set the angular velocity of an actor yourself, - forces such as friction will not be able to rotate the actor, because forces directly influence only the velocity/momentum. + \brief Lets you set the maximum linear velocity permitted for this actor. - Default: (0.0, 0.0, 0.0) + With this function, you can set the maximum linear velocity permitted for this rigid body. + Higher angular velocities are clamped to this value. - Sleeping: This call wakes the actor if it is sleeping, the autowake parameter is true (default) or the - new velocity is non-zero + Note: The angular velocity is clamped to the set value before the solver, which means that + the limit may still be momentarily exceeded. - \note It is invalid to use this method if PxActorFlag::eDISABLE_SIMULATION is set. + Default: PX_MAX_F32 - \param[in] angVel New angular velocity of actor. Range: angular velocity vector - \param[in] autowake Whether to wake the object up if it is asleep and the velocity is non-zero. If true and the current wake - counter value is smaller than #PxSceneDesc::wakeCounterResetValue it will get increased to the reset value. + \param[in] maxLinVel Max allowable linear velocity for actor. Range: [0, PX_MAX_F32) - @see getAngularVelocity() setLinearVelocity() + @see getMaxAngularVelocity() */ - virtual void setAngularVelocity(const PxVec3& angVel, bool autowake = true ) = 0; + virtual void setMaxLinearVelocity(PxReal maxLinVel) = 0; + + /** + \brief Retrieves the maximum angular velocity permitted for this actor. + + \return The maximum allowed angular velocity for this actor. + + @see setMaxLinearVelocity + */ + virtual PxReal getMaxLinearVelocity() const = 0; /** \brief Lets you set the maximum angular velocity permitted for this actor. @@ -417,7 +442,7 @@ public: @see getMaxAngularVelocity() */ - virtual void setMaxAngularVelocity(PxReal maxAngVel) = 0; + virtual void setMaxAngularVelocity(PxReal maxAngVel) = 0; /** \brief Retrieves the maximum angular velocity permitted for this actor. @@ -426,35 +451,7 @@ public: @see setMaxAngularVelocity */ - virtual PxReal getMaxAngularVelocity() const = 0; - - - /** - \brief Lets you set the maximum linear velocity permitted for this actor. - - With this function, you can set the maximum linear velocity permitted for this rigid body. - Higher angular velocities are clamped to this value. - - Note: The angular velocity is clamped to the set value before the solver, which means that - the limit may still be momentarily exceeded. - - Default: PX_MAX_F32 - - \param[in] maxLinVel Max allowable linear velocity for actor. Range: [0, PX_MAX_F32) - - @see getMaxAngularVelocity() - */ - virtual void setMaxLinearVelocity(PxReal maxLinVel) = 0; - - /** - \brief Retrieves the maximum angular velocity permitted for this actor. - - \return The maximum allowed angular velocity for this actor. - - @see setMaxLinearVelocity - */ - virtual PxReal getMaxLinearVelocity() const = 0; - + virtual PxReal getMaxAngularVelocity() const = 0; /************************************************************************************************/ /** @name Forces @@ -472,7 +469,6 @@ public: accumulators and are just short hand for multiplying the vector parameter by inverse mass and then using PxForceMode::eACCELERATION and PxForceMode::eVELOCITY_CHANGE respectively. - \note It is invalid to use this method if the actor has not been added to a scene already or if PxActorFlag::eDISABLE_SIMULATION is set. \note The force modes PxForceMode::eIMPULSE and PxForceMode::eVELOCITY_CHANGE can not be applied to articulation links. @@ -482,15 +478,16 @@ public: \note see #PxRigidBodyExt::computeVelocityDeltaFromImpulse for details of how to compute the change in linear velocity that will arise from the application of an impulsive force, where an impulsive force is applied force multiplied by a timestep. - Sleeping: This call wakes the actor if it is sleeping and the autowake parameter is true (default) or the force is non-zero. + Sleeping: This call wakes the actor if it is sleeping, and the autowake parameter is true (default) or the force is non-zero. \param[in] force Force/Impulse to apply defined in the global frame. \param[in] mode The mode to use when applying the force/impulse(see #PxForceMode) - \param[in] autowake Specify if the call should wake up the actor if it is currently asleep. If true and the current wake counter value is smaller than #PxSceneDesc::wakeCounterResetValue it will get increased to the reset value. + \param[in] autowake Specify if the call should wake up the actor if it is currently asleep. If true and the current wake counter value + is smaller than #PxSceneDesc::wakeCounterResetValue it will get increased to the reset value. @see PxForceMode addTorque */ - virtual void addForce(const PxVec3& force, PxForceMode::Enum mode = PxForceMode::eFORCE, bool autowake = true) = 0; + virtual void addForce(const PxVec3& force, PxForceMode::Enum mode = PxForceMode::eFORCE, bool autowake = true) = 0; /** \brief Applies an impulsive torque defined in the global coordinate frame to the actor. @@ -502,7 +499,6 @@ public: also modify these same accumulators and are just short hand for multiplying the vector parameter by inverse inertia and then using PxForceMode::eACCELERATION and PxForceMode::eVELOCITY_CHANGE respectively. - \note It is invalid to use this method if the actor has not been added to a scene already or if PxActorFlag::eDISABLE_SIMULATION is set. \note The force modes PxForceMode::eIMPULSE and PxForceMode::eVELOCITY_CHANGE can not be applied to articulation links. @@ -512,15 +508,16 @@ public: \note see #PxRigidBodyExt::computeVelocityDeltaFromImpulse for details of how to compute the change in angular velocity that will arise from the application of an impulsive torque, where an impulsive torque is an applied torque multiplied by a timestep. - Sleeping: This call wakes the actor if it is sleeping and the autowake parameter is true (default) or the torque is non-zero. + Sleeping: This call wakes the actor if it is sleeping, and the autowake parameter is true (default) or the torque is non-zero. \param[in] torque Torque to apply defined in the global frame. Range: torque vector \param[in] mode The mode to use when applying the force/impulse(see #PxForceMode). - \param[in] autowake whether to wake up the object if it is asleep. If true and the current wake counter value is smaller than #PxSceneDesc::wakeCounterResetValue it will get increased to the reset value. + \param[in] autowake Specify if the call should wake up the actor if it is currently asleep. If true and the current wake counter value + is smaller than #PxSceneDesc::wakeCounterResetValue it will get increased to the reset value. @see PxForceMode addForce() */ - virtual void addTorque(const PxVec3& torque, PxForceMode::Enum mode = PxForceMode::eFORCE, bool autowake = true) = 0; + virtual void addTorque(const PxVec3& torque, PxForceMode::Enum mode = PxForceMode::eFORCE, bool autowake = true) = 0; /** \brief Clears the accumulated forces (sets the accumulated force back to zero). @@ -541,7 +538,7 @@ public: @see PxForceMode addForce */ - virtual void clearForce(PxForceMode::Enum mode = PxForceMode::eFORCE) = 0; + virtual void clearForce(PxForceMode::Enum mode = PxForceMode::eFORCE) = 0; /** \brief Clears the impulsive torque defined in the global coordinate frame to the actor. @@ -562,8 +559,7 @@ public: @see PxForceMode addTorque */ - virtual void clearTorque(PxForceMode::Enum mode = PxForceMode::eFORCE) = 0; - + virtual void clearTorque(PxForceMode::Enum mode = PxForceMode::eFORCE) = 0; /** \brief Sets the impulsive force and torque defined in the global coordinate frame to the actor. @@ -576,7 +572,7 @@ public: @see PxForceMode addTorque */ - virtual void setForceAndTorque(const PxVec3& force, const PxVec3& torque, PxForceMode::Enum mode = PxForceMode::eFORCE) = 0; + virtual void setForceAndTorque(const PxVec3& force, const PxVec3& torque, PxForceMode::Enum mode = PxForceMode::eFORCE) = 0; /** \brief Raises or clears a particular rigid body flag. @@ -592,9 +588,8 @@ public: @see PxRigidBodyFlag getRigidBodyFlags() */ - - virtual void setRigidBodyFlag(PxRigidBodyFlag::Enum flag, bool value) = 0; - virtual void setRigidBodyFlags(PxRigidBodyFlags inFlags) = 0; + virtual void setRigidBodyFlag(PxRigidBodyFlag::Enum flag, bool value) = 0; + virtual void setRigidBodyFlags(PxRigidBodyFlags inFlags) = 0; /** \brief Reads the PxRigidBody flags. @@ -627,7 +622,6 @@ public: \param[in] advanceCoefficient The CCD min advance coefficient. Range: [0, 1] Default: 0.15 */ - virtual void setMinCCDAdvanceCoefficient(PxReal advanceCoefficient) = 0; /** @@ -636,12 +630,9 @@ public: \return The value of the CCD min advance coefficient. @see setMinCCDAdvanceCoefficient - */ - virtual PxReal getMinCCDAdvanceCoefficient() const = 0; - /** \brief Sets the maximum depenetration velocity permitted to be introduced by the solver. This value controls how much velocity the solver can introduce to correct for penetrations in contacts. @@ -656,7 +647,6 @@ public: */ virtual PxReal getMaxDepenetrationVelocity() const = 0; - /** \brief Sets a limit on the impulse that may be applied at a contact. The maximum impulse at a contact between two dynamic or kinematic bodies will be the minimum of the two limit values. For a collision between a static and a dynamic body, the impulse is limited @@ -678,21 +668,40 @@ public: virtual PxReal getMaxContactImpulse() const = 0; /** - \brief Returns the island node index that only for internal use only + \brief Sets a distance scale whereby the angular influence of a contact on the normal constraint in a contact is + zeroed if normal.cross(offset) falls below this tolerance. Rather than acting as an absolute value, this tolerance + is scaled by the ratio rXn.dot(angVel)/normal.dot(linVel) such that contacts that have relatively larger angular velocity + than linear normal velocity (e.g. rolling wheels) achieve larger slop values as the angular velocity increases. - \return The island node index that only for internal use only + \param[in] slopCoefficient the Slop coefficient. Range: [0, PX_MAX_F32] Default: 0 + + @see getContactSlopCoefficient */ - virtual PxU32 getInternalIslandNodeIndex() const = 0; + virtual void setContactSlopCoefficient(PxReal slopCoefficient) = 0; + /** + \brief Returns the contact slop coefficient. + + \return The contact slop coefficient. + + @see setContactSlopCoefficient + */ + virtual PxReal getContactSlopCoefficient() const = 0; + + /** + \brief Returns the island node index + + \return The island node index. + */ + virtual PxNodeIndex getInternalIslandNodeIndex() const = 0; protected: - PX_INLINE PxRigidBody(PxType concreteType, PxBaseFlags baseFlags) : PxRigidActor(concreteType, baseFlags) {} - PX_INLINE PxRigidBody(PxBaseFlags baseFlags) : PxRigidActor(baseFlags) {} - virtual ~PxRigidBody() {} - virtual bool isKindOf(const char* name)const { return !::strcmp("PxRigidBody", name) || PxRigidActor::isKindOf(name); } + PX_INLINE PxRigidBody(PxType concreteType, PxBaseFlags baseFlags) : PxRigidActor(concreteType, baseFlags) {} + PX_INLINE PxRigidBody(PxBaseFlags baseFlags) : PxRigidActor(baseFlags) {} + virtual ~PxRigidBody() {} + virtual bool isKindOf(const char* name) const { return !::strcmp("PxRigidBody", name) || PxRigidActor::isKindOf(name); } }; - #if !PX_DOXYGEN } // namespace physx #endif diff --git a/Source/ThirdParty/PhysX/PxRigidDynamic.h b/Source/ThirdParty/PhysX/PxRigidDynamic.h index 84cb66060..fa46bc6ba 100644 --- a/Source/ThirdParty/PhysX/PxRigidDynamic.h +++ b/Source/ThirdParty/PhysX/PxRigidDynamic.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_RIGIDDYNAMIC -#define PX_PHYSICS_NX_RIGIDDYNAMIC +#ifndef PX_RIGID_DYNAMIC_H +#define PX_RIGID_DYNAMIC_H /** \addtogroup physics @{ */ @@ -155,12 +153,14 @@ public: If an actor is asleep after the call to PxScene::fetchResults() returns, it is guaranteed that the pose of the actor was not changed. You can use this information to avoid updating the transforms of associated objects. - \note A kinematic actor is asleep unless a target pose has been set (in which case it will stay awake until the end of the next - simulation step where no target pose has been set anymore). The wake counter will get set to zero or to the reset value + \note A kinematic actor is asleep unless a target pose has been set (in which case it will stay awake until two consecutive + simulation steps without a target pose being set have passed). The wake counter will get set to zero or to the reset value #PxSceneDesc::wakeCounterResetValue in the case where a target pose has been set to be consistent with the definitions above. \note It is invalid to use this method if the actor has not been added to a scene already. + \note It is not allowed to use this method while the simulation is running. + \return True if the actor is sleeping. @see isSleeping() wakeUp() putToSleep() getSleepThreshold() @@ -244,8 +244,72 @@ public: virtual void setRigidDynamicLockFlag(PxRigidDynamicLockFlag::Enum flag, bool value) = 0; virtual void setRigidDynamicLockFlags(PxRigidDynamicLockFlags flags) = 0; + /** + \brief Retrieves the linear velocity of an actor. + \note It is not allowed to use this method while the simulation is running (except during PxScene::collide(), + in PxContactModifyCallback or in contact report callbacks). + \return The linear velocity of the actor. + + @see PxRigidDynamic.setLinearVelocity() getAngularVelocity() + */ + virtual PxVec3 getLinearVelocity() const = 0; + + /** + \brief Sets the linear velocity of the actor. + + Note that if you continuously set the velocity of an actor yourself, + forces such as gravity or friction will not be able to manifest themselves, because forces directly + influence only the velocity/momentum of an actor. + + Default: (0.0, 0.0, 0.0) + + Sleeping: This call wakes the actor if it is sleeping, and the autowake parameter is true (default) or the + new velocity is non-zero. + + \note It is invalid to use this method if PxActorFlag::eDISABLE_SIMULATION is set. + + \param[in] linVel New linear velocity of actor. Range: velocity vector + \param[in] autowake Whether to wake the object up if it is asleep. If true and the current wake counter value is + smaller than #PxSceneDesc::wakeCounterResetValue it will get increased to the reset value. + + @see getLinearVelocity() setAngularVelocity() + */ + virtual void setLinearVelocity(const PxVec3& linVel, bool autowake = true) = 0; + + /** + \brief Retrieves the angular velocity of the actor. + + \note It is not allowed to use this method while the simulation is running (except during PxScene::collide(), + in PxContactModifyCallback or in contact report callbacks). + + \return The angular velocity of the actor. + + @see PxRigidDynamic.setAngularVelocity() getLinearVelocity() + */ + virtual PxVec3 getAngularVelocity() const = 0; + + /** + \brief Sets the angular velocity of the actor. + + Note that if you continuously set the angular velocity of an actor yourself, + forces such as friction will not be able to rotate the actor, because forces directly influence only the velocity/momentum. + + Default: (0.0, 0.0, 0.0) + + Sleeping: This call wakes the actor if it is sleeping, and the autowake parameter is true (default) or the + new velocity is non-zero. + + \note It is invalid to use this method if PxActorFlag::eDISABLE_SIMULATION is set. + + \param[in] angVel New angular velocity of actor. Range: angular velocity vector + \param[in] autowake Whether to wake the object up if it is asleep. If true and the current wake counter value is + smaller than #PxSceneDesc::wakeCounterResetValue it will get increased to the reset value. + + @see getAngularVelocity() setLinearVelocity() + */ + virtual void setAngularVelocity(const PxVec3& angVel, bool autowake = true) = 0; /** \brief Sets the wake counter for the actor. @@ -271,6 +335,8 @@ public: /** \brief Returns the wake counter of the actor. + \note It is not allowed to use this method while the simulation is running. + \return The wake counter of the actor. @see isSleeping() setWakeCounter() @@ -325,7 +391,7 @@ public: Default: 4 position iterations, 1 velocity iteration \param[in] minPositionIters Number of position iterations the solver should perform for this body. Range: [1,255] - \param[in] minVelocityIters Number of velocity iterations the solver should perform for this body. Range: [1,255] + \param[in] minVelocityIters Number of velocity iterations the solver should perform for this body. Range: [0,255] @see getSolverIterationCounts() */ @@ -373,7 +439,7 @@ public: virtual const char* getConcreteTypeName() const { return "PxRigidDynamic"; } protected: - PX_INLINE PxRigidDynamic(PxType concreteType, PxBaseFlags baseFlags) : PxRigidBody(concreteType, baseFlags) {} + PX_INLINE PxRigidDynamic(PxType concreteType, PxBaseFlags baseFlags) : PxRigidBody(concreteType, baseFlags) { } PX_INLINE PxRigidDynamic(PxBaseFlags baseFlags) : PxRigidBody(baseFlags) {} virtual ~PxRigidDynamic() {} virtual bool isKindOf(const char* name) const { return !::strcmp("PxRigidDynamic", name) || PxRigidBody::isKindOf(name); } diff --git a/Source/ThirdParty/PhysX/PxRigidStatic.h b/Source/ThirdParty/PhysX/PxRigidStatic.h index e5fbd650a..57c6ebe02 100644 --- a/Source/ThirdParty/PhysX/PxRigidStatic.h +++ b/Source/ThirdParty/PhysX/PxRigidStatic.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_RIGIDSTATIC -#define PX_PHYSICS_NX_RIGIDSTATIC +#ifndef PX_RIGID_STATIC_H +#define PX_RIGID_STATIC_H /** \addtogroup physics @{ */ @@ -63,7 +61,7 @@ public: protected: PX_INLINE PxRigidStatic(PxType concreteType, PxBaseFlags baseFlags) : PxRigidActor(concreteType, baseFlags) {} - PX_INLINE PxRigidStatic(PxBaseFlags baseFlags) : PxRigidActor(baseFlags) {} + PX_INLINE PxRigidStatic(PxBaseFlags baseFlags) : PxRigidActor(baseFlags){} virtual ~PxRigidStatic() {} virtual bool isKindOf(const char* name) const { return !::strcmp("PxRigidStatic", name) || PxRigidActor::isKindOf(name); } diff --git a/Source/ThirdParty/PhysX/PxScene.h b/Source/ThirdParty/PhysX/PxScene.h index ebe579f06..a99d5cdf5 100644 --- a/Source/ThirdParty/PhysX/PxScene.h +++ b/Source/ThirdParty/PhysX/PxScene.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,24 +22,28 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_SCENE -#define PX_PHYSICS_NX_SCENE +#ifndef PX_SCENE_H +#define PX_SCENE_H /** \addtogroup physics @{ */ -#include "PxVisualizationParameter.h" +#include "PxSceneQuerySystem.h" #include "PxSceneDesc.h" +#include "PxVisualizationParameter.h" #include "PxSimulationStatistics.h" -#include "PxQueryReport.h" -#include "PxQueryFiltering.h" #include "PxClient.h" #include "task/PxTask.h" +#include "PxArticulationFlag.h" +#include "PxSoftBodyFlag.h" +#include "PxHairSystemFlag.h" +#include "PxActorData.h" +#include "PxParticleSystemFlag.h" +#include "PxParticleSolverType.h" #include "pvd/PxPvdSceneClient.h" @@ -49,29 +52,25 @@ namespace physx { #endif -class PxRigidStatic; -class PxRigidDynamic; +class PxCollection; class PxConstraint; -class PxMaterial; class PxSimulationEventCallback; class PxPhysics; -class PxBatchQueryDesc; -class PxBatchQuery; class PxAggregate; class PxRenderBuffer; +class PxArticulationReducedCoordinate; +class PxParticleSystem; -class PxSphereGeometry; -class PxBoxGeometry; -class PxCapsuleGeometry; - -class PxPruningStructure; -class PxBVHStructure; struct PxContactPairHeader; typedef PxU8 PxDominanceGroup; class PxPvdSceneClient; +class PxSoftBody; +class PxFEMCloth; +class PxHairSystem; + /** \brief Expresses the dominance relationship of a contact. For the time being only three settings are permitted: @@ -92,7 +91,7 @@ struct PxDominanceGroupPair /** \brief Identifies each type of actor for retrieving actors from a scene. -\note #PxArticulationLink objects are not supported. Use the #PxArticulation object to retrieve all its links. +\note #PxArticulationLink objects are not supported. Use the #PxArticulationReducedCoordinate object to retrieve all its links. @see PxScene::getActors(), PxScene::getNbActors() */ @@ -122,39 +121,48 @@ struct PxActorTypeFlag typedef PxFlags PxActorTypeFlags; PX_FLAGS_OPERATORS(PxActorTypeFlag::Enum,PxU16) +class PxActor; + /** -\brief single hit cache for scene queries. +\brief Broad-phase callback to receive broad-phase related events. -If a cache object is supplied to a scene query, the cached actor/shape pair is checked for intersection first. -\note Filters are not executed for the cached shape. -\note If intersection is found, the hit is treated as blocking. -\note Typically actor and shape from the last PxHitCallback.block query result is used as a cached actor/shape pair. -\note Using past touching hits as cache will produce incorrect behavior since the cached hit will always be treated as blocking. -\note Cache is only used if no touch buffer was provided, for single nearest blocking hit queries and queries using eANY_HIT flag. -\note if non-zero touch buffer was provided, cache will be ignored +Each broadphase callback object is associated with a PxClientID. It is possible to register different +callbacks for different clients. The callback functions are called this way: +- for shapes/actors, the callback assigned to the actors' clients are used +- for aggregates, the callbacks assigned to clients from aggregated actors are used -\note It is the user's responsibility to ensure that the shape and actor are valid, so care must be taken -when deleting shapes to invalidate cached references. +\note SDK state should not be modified from within the callbacks. In particular objects should not +be created or destroyed. If state modification is needed then the changes should be stored to a buffer +and performed after the simulation step. -The faceIndex field is an additional hint for a mesh or height field which is not currently used. +Threading: It is not necessary to make this class thread safe as it will only be called in the context of the +user thread. -@see PxScene.raycast +@see PxSceneDesc PxScene.setBroadPhaseCallback() PxScene.getBroadPhaseCallback() */ -struct PxQueryCache +class PxBroadPhaseCallback { - /** - \brief constructor sets to default - */ - PX_INLINE PxQueryCache() : shape(NULL), actor(NULL), faceIndex(0xffffffff) {} + public: + virtual ~PxBroadPhaseCallback() {} /** - \brief constructor to set properties - */ - PX_INLINE PxQueryCache(PxShape* s, PxU32 findex) : shape(s), actor(NULL), faceIndex(findex) {} + \brief Out-of-bounds notification. + + This function is called when an object leaves the broad-phase. - PxShape* shape; //!< Shape to test for intersection first - PxRigidActor* actor; //!< Actor to which the shape belongs - PxU32 faceIndex; //!< Triangle index to test first - NOT CURRENTLY SUPPORTED + \param[in] shape Shape that left the broad-phase bounds + \param[in] actor Owner actor + */ + virtual void onObjectOutOfBounds(PxShape& shape, PxActor& actor) = 0; + + /** + \brief Out-of-bounds notification. + + This function is called when an aggregate leaves the broad-phase. + + \param[in] aggregate Aggregate that left the broad-phase bounds + */ + virtual void onObjectOutOfBounds(PxAggregate& aggregate) = 0; }; /** @@ -166,7 +174,7 @@ struct PxQueryCache @see PxSceneDesc PxPhysics.createScene() release() */ -class PxScene +class PxScene : public PxSceneSQSystem { protected: @@ -176,8 +184,8 @@ class PxScene */ //@{ - PxScene(): userData(0) {} - virtual ~PxScene() {} + PxScene() : userData(NULL) {} + virtual ~PxScene() {} public: @@ -212,7 +220,6 @@ class PxScene */ virtual PxSceneFlags getFlags() const = 0; - /** \brief Set new scene limits. @@ -232,7 +239,6 @@ class PxScene */ virtual PxSceneLimits getLimits() const = 0; - /** \brief Call this method to retrieve the Physics SDK. @@ -249,43 +255,45 @@ class PxScene */ virtual PxU32 getTimestamp() const = 0; - //@} /************************************************************************************************/ - /** @name Add/Remove Contained Objects + /** @name Add/Remove Articulations */ //@{ /** \brief Adds an articulation to this scene. - \note If the articulation is already assigned to a scene (see #PxArticulation::getScene), the call is ignored and an error is issued. + \note If the articulation is already assigned to a scene (see #PxArticulationReducedCoordinate::getScene), the call is ignored and an error is issued. - \param[in] articulation Articulation to add to scene. See #PxArticulation + \param[in] articulation The articulation to add to the scene. + \return True if success - @see PxArticulation + @see PxArticulationReducedCoordinate */ - virtual void addArticulation(PxArticulationBase& articulation) = 0; + virtual bool addArticulation(PxArticulationReducedCoordinate& articulation) = 0; /** \brief Removes an articulation from this scene. - \note If the articulation is not part of this scene (see #PxArticulation::getScene), the call is ignored and an error is issued. + \note If the articulation is not part of this scene (see #PxArticulationReducedCoordinate::getScene), the call is ignored and an error is issued. \note If the articulation is in an aggregate it will be removed from the aggregate. - \param[in] articulation Articulation to remove from scene. See #PxArticulation - \param[in] wakeOnLostTouch Specifies whether touching objects from the previous frame should get woken up in the next frame. Only applies to PxArticulation and PxRigidActor types. + \param[in] articulation The articulation to remove from the scene. + \param[in] wakeOnLostTouch Specifies whether touching objects from the previous frame should get woken up in the next frame. + Only applies to PxArticulationReducedCoordinate and PxRigidActor types. - @see PxArticulation, PxAggregate + @see PxArticulationReducedCoordinate, PxAggregate */ - virtual void removeArticulation(PxArticulationBase& articulation, bool wakeOnLostTouch = true) = 0; - + virtual void removeArticulation(PxArticulationReducedCoordinate& articulation, bool wakeOnLostTouch = true) = 0; //@} /************************************************************************************************/ - + /** @name Add/Remove Actors + */ + //@{ /** \brief Adds an actor to this scene. @@ -297,47 +305,52 @@ class PxScene \note If the actor is a PxRigidActor then each assigned PxConstraint object will get added to the scene automatically if it connects to another actor that is part of the scene already. - \note When BVHStructure is provided the actor shapes are grouped together. + \note When a BVH is provided the actor shapes are grouped together. The scene query pruning structure inside PhysX SDK will store/update one bound per actor. The scene queries against such an actor will query actor - bounds and then make a local space query against the provided BVH structure, which is in - actor's local space. + bounds and then make a local space query against the provided BVH, which is in actor's local space. - \param[in] actor Actor to add to scene. - \param[in] bvhStructure BVHStructure for actor shapes. + \param[in] actor Actor to add to scene. + \param[in] bvh BVH for actor shapes. + \return True if success - @see PxActor, PxConstraint::isValid(), PxBVHStructure + @see PxActor, PxConstraint::isValid(), PxBVH */ - virtual void addActor(PxActor& actor, const PxBVHStructure* bvhStructure = NULL) = 0; + virtual bool addActor(PxActor& actor, const PxBVH* bvh = NULL) = 0; /** - \brief Adds actors to this scene. + \brief Adds actors to this scene. Only supports actors of type PxRigidStatic and PxRigidDynamic. + + \note This method only supports actors of type PxRigidStatic and PxRigidDynamic. For other actors, use addActor() instead. + For articulation links, use addArticulation(). \note If one of the actors is already assigned to a scene (see #PxActor::getScene), the call is ignored and an error is issued. - \note You can not add individual articulation links (see #PxArticulationLink) to the scene. Use #addArticulation() instead. - \note If an actor in the array contains an invalid constraint, in checked builds the call is ignored and an error is issued. \note If an actor in the array is a PxRigidActor then each assigned PxConstraint object will get added to the scene automatically if it connects to another actor that is part of the scene already. - \note this method is optimized for high performance, and does not support buffering. It may not be called during simulation. + \note this method is optimized for high performance. \param[in] actors Array of actors to add to scene. \param[in] nbActors Number of actors in the array. + \return True if success @see PxActor, PxConstraint::isValid() */ - virtual void addActors(PxActor*const* actors, PxU32 nbActors) = 0; + virtual bool addActors(PxActor*const* actors, PxU32 nbActors) = 0; /** - \brief Adds a pruning structure together with its actors to this scene. + \brief Adds a pruning structure together with its actors to this scene. Only supports actors of type PxRigidStatic and PxRigidDynamic. + + \note This method only supports actors of type PxRigidStatic and PxRigidDynamic. For other actors, use addActor() instead. + For articulation links, use addArticulation(). \note If an actor in the pruning structure contains an invalid constraint, in checked builds the call is ignored and an error is issued. \note For all actors in the pruning structure each assigned PxConstraint object will get added to the scene automatically if it connects to another actor that is part of the scene already. - \note This method is optimized for high performance, and does not support buffering. It may not be called during simulation. + \note This method is optimized for high performance. \note Merging a PxPruningStructure into an active scene query optimization AABB tree might unbalance the tree. A typical use case for PxPruningStructure is a large world scenario where blocks of closely positioned actors get streamed in. The merge process finds the @@ -345,10 +358,11 @@ class PxScene for actors scattered throughout the world will result in an unbalanced tree. \param[in] pruningStructure Pruning structure for a set of actors. + \return True if success @see PxPhysics::createPruningStructure, PxPruningStructure */ - virtual void addActors(const PxPruningStructure& pruningStructure) = 0; + virtual bool addActors(const PxPruningStructure& pruningStructure) = 0; /** \brief Removes an actor from this scene. @@ -362,14 +376,17 @@ class PxScene \note If the actor is in an aggregate it will be removed from the aggregate. \param[in] actor Actor to remove from scene. - \param[in] wakeOnLostTouch Specifies whether touching objects from the previous frame should get woken up in the next frame. Only applies to PxArticulation and PxRigidActor types. + \param[in] wakeOnLostTouch Specifies whether touching objects from the previous frame should get woken up in the next frame. Only applies to PxArticulationReducedCoordinate and PxRigidActor types. @see PxActor, PxAggregate */ virtual void removeActor(PxActor& actor, bool wakeOnLostTouch = true) = 0; /** - \brief Removes actors from this scene. + \brief Removes actors from this scene. Only supports actors of type PxRigidStatic and PxRigidDynamic. + + \note This method only supports actors of type PxRigidStatic and PxRigidDynamic. For other actors, use removeActor() instead. + For articulation links, use removeArticulation(). \note If some actor is not part of this scene (see #PxActor::getScene), the actor remove is ignored and an error is issued. @@ -379,7 +396,7 @@ class PxScene \param[in] actors Array of actors to add to scene. \param[in] nbActors Number of actors in the array. - \param[in] wakeOnLostTouch Specifies whether touching objects from the previous frame should get woken up in the next frame. Only applies to PxArticulation and PxRigidActor types. + \param[in] wakeOnLostTouch Specifies whether touching objects from the previous frame should get woken up in the next frame. Only applies to PxArticulationReducedCooridnate and PxRigidActor types. @see PxActor */ @@ -394,10 +411,11 @@ class PxScene \note If the aggregate already contains actors, those actors are added to the scene as well. \param[in] aggregate Aggregate to add to scene. + \return True if success @see PxAggregate, PxConstraint::isValid() */ - virtual void addAggregate(PxAggregate& aggregate) = 0; + virtual bool addAggregate(PxAggregate& aggregate) = 0; /** \brief Removes an aggregate from this scene. @@ -407,7 +425,7 @@ class PxScene \note If the aggregate contains actors, those actors are removed from the scene as well. \param[in] aggregate Aggregate to remove from scene. - \param[in] wakeOnLostTouch Specifies whether touching objects from the previous frame should get woken up in the next frame. Only applies to PxArticulation and PxRigidActor types. + \param[in] wakeOnLostTouch Specifies whether touching objects from the previous frame should get woken up in the next frame. Only applies to PxArticulationReducedCoordinate and PxRigidActor types. @see PxAggregate */ @@ -416,16 +434,17 @@ class PxScene /** \brief Adds objects in the collection to this scene. - This function adds the following types of objects to this scene: PxActor, PxAggregate, PxArticulation. + This function adds the following types of objects to this scene: PxRigidActor (except PxArticulationLink), PxAggregate, PxArticulationReducedCoordinate. This method is typically used after deserializing the collection in order to populate the scene with deserialized objects. \note If the collection contains an actor with an invalid constraint, in checked builds the call is ignored and an error is issued. \param[in] collection Objects to add to this scene. See #PxCollection + \return True if success @see PxCollection, PxConstraint::isValid() */ - virtual void addCollection(const PxCollection& collection) = 0; + virtual bool addCollection(const PxCollection& collection) = 0; //@} /************************************************************************************************/ @@ -434,7 +453,7 @@ class PxScene //@{ /** - \brief Retrieve the number of actors of certain types in the scene. + \brief Retrieve the number of actors of certain types in the scene. For supported types, see PxActorTypeFlags. \param[in] types Combination of actor types. \return the number of actors. @@ -444,7 +463,7 @@ class PxScene virtual PxU32 getNbActors(PxActorTypeFlags types) const = 0; /** - \brief Retrieve an array of all the actors of certain types in the scene. + \brief Retrieve an array of all the actors of certain types in the scene. For supported types, see PxActorTypeFlags. \param[in] types Combination of actor types to retrieve. \param[out] userBuffer The buffer to receive actor pointers. @@ -458,7 +477,7 @@ class PxScene /** \brief Queries the PxScene for a list of the PxActors whose transforms have been - updated during the previous simulation step + updated during the previous simulation step. Only includes actors of type PxRigidDynamic and PxArticulationLink. \note PxSceneFlag::eENABLE_ACTIVE_ACTORS must be set. @@ -472,6 +491,90 @@ class PxScene */ virtual PxActor** getActiveActors(PxU32& nbActorsOut) = 0; + /** + \brief Retrieve the number of soft bodies in the scene. + + \return the number of soft bodies. + + @see getActors() + */ + virtual PxU32 getNbSoftBodies() const = 0; + + /** + \brief Retrieve an array of all the soft bodies in the scene. + + \param[out] userBuffer The buffer to receive actor pointers. + \param[in] bufferSize Size of provided user buffer. + \param[in] startIndex Index of first actor pointer to be retrieved + \return Number of actors written to the buffer. + + @see getNbActors() + */ + virtual PxU32 getSoftBodies(PxSoftBody** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + + /** + \brief Retrieve the number of particle systems of the requested type in the scene. + + \param[in] type The particle system type. See PxParticleSolverType. Only one type can be requested per function call. + \return the number particle systems. + + See getParticleSystems(), PxParticleSolverType + */ + virtual PxU32 getNbParticleSystems(PxParticleSolverType::Enum type) const = 0; + + /** + \brief Retrieve an array of all the particle systems of the requested type in the scene. + + \param[in] type The particle system type. See PxParticleSolverType. Only one type can be requested per function call. + \param[out] userBuffer The buffer to receive particle system pointers. + \param[in] bufferSize Size of provided user buffer. + \param[in] startIndex Index of first particle system pointer to be retrieved + \return Number of particle systems written to the buffer. + + See getNbParticleSystems(), PxParticleSolverType + */ + virtual PxU32 getParticleSystems(PxParticleSolverType::Enum type, PxParticleSystem** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + + /** + \brief Retrieve the number of FEM cloths in the scene. + \warning Feature under development, only for internal usage. + + \return the number of FEM cloths. + + See getFEMCloths() + */ + virtual PxU32 getNbFEMCloths() const = 0; + + /** + \brief Retrieve an array of all the FEM cloths in the scene. + \warning Feature under development, only for internal usage. + + \param[out] userBuffer The buffer to write the FEM cloth pointers to + \param[in] bufferSize Size of the provided user buffer + \param[in] startIndex Index of first FEM cloth pointer to be retrieved + \return Number of FEM cloths written to the buffer + */ + virtual PxU32 getFEMCloths(PxFEMCloth** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + + /** + \brief Retrieve the number of hair systems in the scene. + \warning Feature under development, only for internal usage. + \return the number of hair systems + @see getActors() + */ + virtual PxU32 getNbHairSystems() const = 0; + + /** + \brief Retrieve an array of all the hair systems in the scene. + \warning Feature under development, only for internal usage. + + \param[out] userBuffer The buffer to write the actor pointers to + \param[in] bufferSize Size of the provided user buffer + \param[in] startIndex Index of first actor pointer to be retrieved + \return Number of actors written to the buffer + */ + virtual PxU32 getHairSystems(PxHairSystem** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + /** \brief Returns the number of articulations in the scene. @@ -491,7 +594,7 @@ class PxScene @see getNbArticulations() */ - virtual PxU32 getArticulations(PxArticulationBase** userBuffer, PxU32 bufferSize, PxU32 startIndex=0) const = 0; + virtual PxU32 getArticulations(PxArticulationReducedCoordinate** userBuffer, PxU32 bufferSize, PxU32 startIndex=0) const = 0; /** \brief Returns the number of constraint shaders in the scene. @@ -514,7 +617,6 @@ class PxScene */ virtual PxU32 getConstraints(PxConstraint** userBuffer, PxU32 bufferSize, PxU32 startIndex=0) const = 0; - /** \brief Returns the number of aggregates in the scene. @@ -810,13 +912,16 @@ class PxScene \note It is invalid to use this method if PxActorFlag::eDISABLE_SIMULATION is set. + \note Do not use this method while the simulation is running. + Sleeping: Does wake up the actor. \param[in] actor The actor for which to re-evaluate interactions. + \return True if success @see PxSimulationFilterShader PxSimulationFilterCallback */ - virtual void resetFiltering(PxActor& actor) = 0; + virtual bool resetFiltering(PxActor& actor) = 0; /** \brief Marks the object to reset interactions and re-run collision filters for specified shapes in the next simulation step. @@ -824,6 +929,8 @@ class PxScene This is a specialization of the resetFiltering(PxActor& actor) method and allows to reset interactions for specific shapes of a PxRigidActor. + \note Do not use this method while the simulation is running. + Sleeping: Does wake up the actor. \param[in] actor The actor for which to re-evaluate interactions. @@ -832,7 +939,7 @@ class PxScene @see PxSimulationFilterShader PxSimulationFilterCallback */ - virtual void resetFiltering(PxRigidActor& actor, PxShape*const* shapes, PxU32 shapeCount) = 0; + virtual bool resetFiltering(PxRigidActor& actor, PxShape*const* shapes, PxU32 shapeCount) = 0; /** \brief Gets the pair filtering mode for kinematic-kinematic pairs. @@ -886,13 +993,13 @@ class PxScene \param[in] scratchMemBlockSize the size of the scratch memory block. Must be a multiple of 16K. \param[in] controlSimulation if true, the scene controls its PxTaskManager simulation state. Leave true unless the application is calling the PxTaskManager start/stopSimulation() methods itself. + \return True if success @see fetchResults() checkResults() */ - virtual void simulate(PxReal elapsedTime, physx::PxBaseTask* completionTask = NULL, + virtual bool simulate(PxReal elapsedTime, physx::PxBaseTask* completionTask = NULL, void* scratchMemBlock = 0, PxU32 scratchMemBlockSize = 0, bool controlSimulation = true) = 0; - /** \brief Performs dynamics phase of the simulation pipeline. @@ -901,9 +1008,9 @@ class PxScene \param[in] completionTask if non-NULL, this task will have its refcount incremented in advance(), then decremented when the scene is ready to have fetchResults called. So the task will not run until the application also calls removeReference(). - + \return True if success */ - virtual void advance(physx::PxBaseTask* completionTask = 0) = 0; + virtual bool advance(physx::PxBaseTask* completionTask = 0) = 0; /** \brief Performs collision detection for the scene over elapsedTime @@ -920,9 +1027,9 @@ class PxScene \param[in] scratchMemBlockSize the size of the scratch memory block. Must be a multiple of 16K. \param[in] controlSimulation if true, the scene controls its PxTaskManager simulation state. Leave true unless the application is calling the PxTaskManager start/stopSimulation() methods itself. - + \return True if success */ - virtual void collide(PxReal elapsedTime, physx::PxBaseTask* completionTask = 0, void* scratchMemBlock = 0, + virtual bool collide(PxReal elapsedTime, physx::PxBaseTask* completionTask = 0, void* scratchMemBlock = 0, PxU32 scratchMemBlockSize = 0, bool controlSimulation = true) = 0; /** @@ -944,7 +1051,6 @@ class PxScene \param[in] block When set to true will block until the condition is met, which is collision must finish running. */ - virtual bool fetchCollision(bool block = false) = 0; /** @@ -970,10 +1076,8 @@ class PxScene */ virtual bool fetchResults(bool block = false, PxU32* errorState = 0) = 0; - /** - This call performs the first section of fetchResults (callbacks fired before swapBuffers), and returns a pointer to a - to the contact streams output by the simulation. It can be used to process contact pairs in parallel, which is often a limiting factor + This call performs the first section of fetchResults, and returns a pointer to the contact streams output by the simulation. It can be used to process contact pairs in parallel, which is often a limiting factor for fetchResults() performance. After calling this function and processing the contact streams, call fetchResultsFinish(). Note that writes to the simulation are not @@ -988,7 +1092,6 @@ class PxScene */ virtual bool fetchResultsStart(const PxContactPairHeader*& contactPairs, PxU32& nbContactPairs, bool block = false) = 0; - /** This call processes all event callbacks in parallel. It takes a continuation task, which will be executed once all callbacks have been processed. @@ -999,9 +1102,8 @@ class PxScene */ virtual void processCallbacks(physx::PxBaseTask* continuation) = 0; - /** - This call performs the second section of fetchResults: the buffer swap and subsequent callbacks. + This call performs the second section of fetchResults. It must be called after fetchResultsStart() returns and contact reports have been processed. @@ -1013,6 +1115,10 @@ class PxScene */ virtual void fetchResultsFinish(PxU32* errorState = 0) = 0; + /** + This call performs the synchronization of particle system data copies. + */ + virtual void fetchResultsParticleSystem() = 0; /** \brief Clear internal buffers and free memory. @@ -1029,6 +1135,8 @@ class PxScene /** \brief Sets a constant gravity for the entire scene. + \note Do not use this method while the simulation is running. + Sleeping: Does NOT wake the actor up automatically. \param[in] vec A new gravity vector(e.g. PxVec3(0.0f,-9.8f,0.0f) ) Range: force vector @@ -1049,6 +1157,8 @@ class PxScene /** \brief Set the bounce threshold velocity. Collision speeds below this threshold will not cause a bounce. + \note Do not use this method while the simulation is running. + @see PxSceneDesc::bounceThresholdVelocity, getBounceThresholdVelocity */ virtual void setBounceThresholdVelocity(const PxReal t) = 0; @@ -1060,14 +1170,14 @@ class PxScene */ virtual PxReal getBounceThresholdVelocity() const = 0; - /** \brief Sets the maximum number of CCD passes + \note Do not use this method while the simulation is running. + \param[in] ccdMaxPasses Maximum number of CCD passes @see PxSceneDesc.ccdMaxPasses getCCDMaxPasses() - */ virtual void setCCDMaxPasses(PxU32 ccdMaxPasses) = 0; @@ -1077,28 +1187,106 @@ class PxScene \return The maximum number of CCD passes. @see PxSceneDesc::ccdMaxPasses setCCDMaxPasses() - */ virtual PxU32 getCCDMaxPasses() const = 0; /** - \brief Return the value of frictionOffsetThreshold that was set in PxSceneDesc when creating the scene with PxPhysics::createScene + \brief Set the maximum CCD separation. - @see PxSceneDesc::frictionOffsetThreshold, PxPhysics::createScene + \note Do not use this method while the simulation is running. + + @see PxSceneDesc::ccdMaxSeparation, getCCDMaxSeparation + */ + virtual void setCCDMaxSeparation(const PxReal t) = 0; + + /** + \brief Gets the maximum CCD separation. + + \return The maximum CCD separation. + + @see PxSceneDesc::ccdMaxSeparation setCCDMaxSeparation() + */ + virtual PxReal getCCDMaxSeparation() const = 0; + + /** + \brief Set the CCD threshold. + + \note Do not use this method while the simulation is running. + + @see PxSceneDesc::ccdThreshold, getCCDThreshold + */ + virtual void setCCDThreshold(const PxReal t) = 0; + + /** + \brief Gets the CCD threshold. + + \return The CCD threshold. + + @see PxSceneDesc::ccdThreshold setCCDThreshold() + */ + virtual PxReal getCCDThreshold() const = 0; + + /** + \brief Set the max bias coefficient. + + \note Do not use this method while the simulation is running. + + @see PxSceneDesc::maxBiasCoefficient, getMaxBiasCoefficient + */ + virtual void setMaxBiasCoefficient(const PxReal t) = 0; + + /** + \brief Gets the max bias coefficient. + + \return The max bias coefficient. + + @see PxSceneDesc::maxBiasCoefficient setMaxBiasCoefficient() + */ + virtual PxReal getMaxBiasCoefficient() const = 0; + + /** + \brief Set the friction offset threshold. + + \note Do not use this method while the simulation is running. + + @see PxSceneDesc::frictionOffsetThreshold, getFrictionOffsetThreshold + */ + virtual void setFrictionOffsetThreshold(const PxReal t) = 0; + + /** + \brief Gets the friction offset threshold. + + @see PxSceneDesc::frictionOffsetThreshold, setFrictionOffsetThreshold */ virtual PxReal getFrictionOffsetThreshold() const = 0; /** - \brief Set the friction model. - @see PxFrictionType, PxSceneDesc::frictionType + \brief Set the friction correlation distance. + + \note Do not use this method while the simulation is running. + + @see PxSceneDesc::frictionCorrelationDistance, getFrictionCorrelationDistance */ - virtual void setFrictionType(PxFrictionType::Enum frictionType) = 0; + virtual void setFrictionCorrelationDistance(const PxReal t) = 0; + + /** + \brief Gets the friction correlation distance. + + @see PxSceneDesc::frictionCorrelationDistance, setFrictionCorrelationDistance + */ + virtual PxReal getFrictionCorrelationDistance() const = 0; /** \brief Return the friction model. @see PxFrictionType, PxSceneDesc::frictionType */ - virtual PxFrictionType::Enum getFrictionType() const = 0; + virtual PxFrictionType::Enum getFrictionType() const = 0; + + /** + \brief Return the solver model. + @see PxSolverType, PxSceneDesc::solverType + */ + virtual PxSolverType::Enum getSolverType() const = 0; //@} /************************************************************************************************/ @@ -1111,6 +1299,8 @@ class PxScene Returns false if the value passed is out of range for usage specified by the enum. + \note Do not use this method while the simulation is running. + \param[in] param Parameter to set. See #PxVisualizationParameter \param[in] value The value to set, see #PxVisualizationParameter for allowable values. Setting to zero disables visualization for the specified property, setting to a positive value usually enables visualization and defines the scale factor. \return False if the parameter is out of range. @@ -1129,9 +1319,10 @@ class PxScene */ virtual PxReal getVisualizationParameter(PxVisualizationParameter::Enum paramEnum) const = 0; - /** \brief Defines a box in world space to which visualization geometry will be (conservatively) culled. Use a non-empty culling box to enable the feature, and an empty culling box to disable it. + + \note Do not use this method while the simulation is running. \param[in] box the box to which the geometry will be culled. Empty box to disable the feature. @see setVisualizationParameter getVisualizationCullingBox getRenderBuffer() @@ -1151,7 +1342,7 @@ class PxScene This will contain the results of any active visualization for this scene. - \note Do not use this method while the simulation is running. Calls to this method while result in undefined behaviour. + \note Do not use this method while the simulation is running. Calls to this method while the simulation is running will result in undefined behaviour. \return The render buffer. @@ -1170,238 +1361,6 @@ class PxScene */ virtual void getSimulationStatistics(PxSimulationStatistics& stats) const = 0; - - //@} - /************************************************************************************************/ - - /** @name Scene Query - */ - //@{ - - /** - \brief Return the value of PxSceneDesc::staticStructure that was set when creating the scene with PxPhysics::createScene - - @see PxSceneDesc::staticStructure, PxPhysics::createScene - */ - virtual PxPruningStructureType::Enum getStaticStructure() const = 0; - - /** - \brief Return the value of PxSceneDesc::dynamicStructure that was set when creating the scene with PxPhysics::createScene - - @see PxSceneDesc::dynamicStructure, PxPhysics::createScene - */ - virtual PxPruningStructureType::Enum getDynamicStructure() const = 0; - - /** - \brief Flushes any changes to the scene query representation. - - This method updates the state of the scene query representation to match changes in the scene state. - - By default, these changes are buffered until the next query is submitted. Calling this function will not change - the results from scene queries, but can be used to ensure that a query will not perform update work in the course of - its execution. - - A thread performing updates will hold a write lock on the query structure, and thus stall other querying threads. In multithread - scenarios it can be useful to explicitly schedule the period where this lock may be held for a significant period, so that - subsequent queries issued from multiple threads will not block. - - */ - virtual void flushQueryUpdates() = 0; - - /** - \brief Creates a BatchQuery object. - - Scene queries like raycasts, overlap tests and sweeps are batched in this object and are then executed at once. See #PxBatchQuery. - - \deprecated The batched query feature has been deprecated in PhysX version 3.4 - - \param[in] desc The descriptor of scene query. Scene Queries need to register a callback. See #PxBatchQueryDesc. - - @see PxBatchQuery PxBatchQueryDesc - */ - PX_DEPRECATED virtual PxBatchQuery* createBatchQuery(const PxBatchQueryDesc& desc) = 0; - - /** - \brief Sets the rebuild rate of the dynamic tree pruning structures. - - \param[in] dynamicTreeRebuildRateHint Rebuild rate of the dynamic tree pruning structures. - - @see PxSceneDesc.dynamicTreeRebuildRateHint getDynamicTreeRebuildRateHint() forceDynamicTreeRebuild() - */ - virtual void setDynamicTreeRebuildRateHint(PxU32 dynamicTreeRebuildRateHint) = 0; - - /** - \brief Retrieves the rebuild rate of the dynamic tree pruning structures. - - \return The rebuild rate of the dynamic tree pruning structures. - - @see PxSceneDesc.dynamicTreeRebuildRateHint setDynamicTreeRebuildRateHint() forceDynamicTreeRebuild() - */ - virtual PxU32 getDynamicTreeRebuildRateHint() const = 0; - - /** - \brief Forces dynamic trees to be immediately rebuilt. - - \param[in] rebuildStaticStructure True to rebuild the dynamic tree containing static objects - \param[in] rebuildDynamicStructure True to rebuild the dynamic tree containing dynamic objects - - @see PxSceneDesc.dynamicTreeRebuildRateHint setDynamicTreeRebuildRateHint() getDynamicTreeRebuildRateHint() - */ - virtual void forceDynamicTreeRebuild(bool rebuildStaticStructure, bool rebuildDynamicStructure) = 0; - - /** - \brief Sets scene query update mode - - \param[in] updateMode Scene query update mode. - - @see PxSceneQueryUpdateMode::Enum - */ - virtual void setSceneQueryUpdateMode(PxSceneQueryUpdateMode::Enum updateMode) = 0; - - /** - \brief Gets scene query update mode - - \return Current scene query update mode. - - @see PxSceneQueryUpdateMode::Enum - */ - virtual PxSceneQueryUpdateMode::Enum getSceneQueryUpdateMode() const = 0; - - /** - \brief Executes scene queries update tasks. - This function will refit dirty shapes within the pruner and will execute a task to build a new AABB tree, which is - build on a different thread. The new AABB tree is built based on the dynamic tree rebuild hint rate. Once - the new tree is ready it will be commited in next fetchQueries call, which must be called after. - - \note If PxSceneQueryUpdateMode::eBUILD_DISABLED_COMMIT_DISABLED is used, it is required to update the scene queries - using this function. - - \param[in] completionTask if non-NULL, this task will have its refcount incremented in sceneQueryUpdate(), then - decremented when the scene is ready to have fetchQueries called. So the task will not run until the - application also calls removeReference(). - \param[in] controlSimulation if true, the scene controls its PxTaskManager simulation state. Leave - true unless the application is calling the PxTaskManager start/stopSimulation() methods itself. - - @see PxSceneQueryUpdateMode::eBUILD_DISABLED_COMMIT_DISABLED - */ - virtual void sceneQueriesUpdate(physx::PxBaseTask* completionTask = NULL, bool controlSimulation = true) = 0; - - /** - \brief This checks to see if the scene queries update has completed. - - This does not cause the data available for reading to be updated with the results of the scene queries update, it is simply a status check. - The bool will allow it to either return immediately or block waiting for the condition to be met so that it can return true - - \param[in] block When set to true will block until the condition is met. - \return True if the results are available. - - @see sceneQueriesUpdate() fetchResults() - */ - virtual bool checkQueries(bool block = false) = 0; - - /** - This method must be called after sceneQueriesUpdate. It will wait for the scene queries update to finish. If the user makes an illegal scene queries update call, - the SDK will issue an error message. - - If a new AABB tree build finished, then during fetchQueries the current tree within the pruning structure is swapped with the new tree. - - \param[in] block When set to true will block until the condition is met, which is tree built task must finish running. - */ - - virtual bool fetchQueries(bool block = false) = 0; - - /** - \brief Performs a raycast against objects in the scene, returns results in a PxRaycastBuffer object - or via a custom user callback implementation inheriting from PxRaycastCallback. - - \note Touching hits are not ordered. - \note Shooting a ray from within an object leads to different results depending on the shape type. Please check the details in user guide article SceneQuery. User can ignore such objects by employing one of the provided filter mechanisms. - - \param[in] origin Origin of the ray. - \param[in] unitDir Normalized direction of the ray. - \param[in] distance Length of the ray. Has to be in the [0, inf) range. - \param[out] hitCall Raycast hit buffer or callback object used to report raycast hits. - \param[in] hitFlags Specifies which properties per hit should be computed and returned via the hit callback. - \param[in] filterData Filtering data passed to the filter shader. See #PxQueryFilterData #PxBatchQueryPreFilterShader, #PxBatchQueryPostFilterShader - \param[in] filterCall Custom filtering logic (optional). Only used if the corresponding #PxQueryFlag flags are set. If NULL, all hits are assumed to be blocking. - \param[in] cache Cached hit shape (optional). Ray is tested against cached shape first. If no hit is found the ray gets queried against the scene. - Note: Filtering is not executed for a cached shape if supplied; instead, if a hit is found, it is assumed to be a blocking hit. - Note: Using past touching hits as cache will produce incorrect behavior since the cached hit will always be treated as blocking. - - \return True if any touching or blocking hits were found or any hit was found in case PxQueryFlag::eANY_HIT was specified. - - @see PxRaycastCallback PxRaycastBuffer PxQueryFilterData PxQueryFilterCallback PxQueryCache PxRaycastHit PxQueryFlag PxQueryFlag::eANY_HIT - */ - virtual bool raycast( - const PxVec3& origin, const PxVec3& unitDir, const PxReal distance, - PxRaycastCallback& hitCall, PxHitFlags hitFlags = PxHitFlags(PxHitFlag::eDEFAULT), - const PxQueryFilterData& filterData = PxQueryFilterData(), PxQueryFilterCallback* filterCall = NULL, - const PxQueryCache* cache = NULL) const = 0; - - /** - \brief Performs a sweep test against objects in the scene, returns results in a PxSweepBuffer object - or via a custom user callback implementation inheriting from PxSweepCallback. - - \note Touching hits are not ordered. - \note If a shape from the scene is already overlapping with the query shape in its starting position, - the hit is returned unless eASSUME_NO_INITIAL_OVERLAP was specified. - - \param[in] geometry Geometry of object to sweep (supported types are: box, sphere, capsule, convex). - \param[in] pose Pose of the sweep object. - \param[in] unitDir Normalized direction of the sweep. - \param[in] distance Sweep distance. Needs to be in [0, inf) range and >0 if eASSUME_NO_INITIAL_OVERLAP was specified. Will be clamped to PX_MAX_SWEEP_DISTANCE. - \param[out] hitCall Sweep hit buffer or callback object used to report sweep hits. - \param[in] hitFlags Specifies which properties per hit should be computed and returned via the hit callback. - \param[in] filterData Filtering data and simple logic. - \param[in] filterCall Custom filtering logic (optional). Only used if the corresponding #PxQueryFlag flags are set. If NULL, all hits are assumed to be blocking. - \param[in] cache Cached hit shape (optional). Sweep is performed against cached shape first. If no hit is found the sweep gets queried against the scene. - Note: Filtering is not executed for a cached shape if supplied; instead, if a hit is found, it is assumed to be a blocking hit. - Note: Using past touching hits as cache will produce incorrect behavior since the cached hit will always be treated as blocking. - \param[in] inflation This parameter creates a skin around the swept geometry which increases its extents for sweeping. The sweep will register a hit as soon as the skin touches a shape, and will return the corresponding distance and normal. - Note: ePRECISE_SWEEP doesn't support inflation. Therefore the sweep will be performed with zero inflation. - - \return True if any touching or blocking hits were found or any hit was found in case PxQueryFlag::eANY_HIT was specified. - - - @see PxSweepCallback PxSweepBuffer PxQueryFilterData PxQueryFilterCallback PxSweepHit PxQueryCache - */ - virtual bool sweep(const PxGeometry& geometry, const PxTransform& pose, const PxVec3& unitDir, const PxReal distance, - PxSweepCallback& hitCall, PxHitFlags hitFlags = PxHitFlags(PxHitFlag::eDEFAULT), - const PxQueryFilterData& filterData = PxQueryFilterData(), PxQueryFilterCallback* filterCall = NULL, - const PxQueryCache* cache = NULL, const PxReal inflation = 0.f) const = 0; - - - /** - \brief Performs an overlap test of a given geometry against objects in the scene, returns results in a PxOverlapBuffer object - or via a custom user callback implementation inheriting from PxOverlapCallback. - - \note Filtering: returning eBLOCK from user filter for overlap queries will cause a warning (see #PxQueryHitType). - - \param[in] geometry Geometry of object to check for overlap (supported types are: box, sphere, capsule, convex). - \param[in] pose Pose of the object. - \param[out] hitCall Overlap hit buffer or callback object used to report overlap hits. - \param[in] filterData Filtering data and simple logic. See #PxQueryFilterData #PxQueryFilterCallback - \param[in] filterCall Custom filtering logic (optional). Only used if the corresponding #PxQueryFlag flags are set. If NULL, all hits are assumed to overlap. - - \return True if any touching or blocking hits were found or any hit was found in case PxQueryFlag::eANY_HIT was specified. - - \note eBLOCK should not be returned from user filters for overlap(). Doing so will result in undefined behavior, and a warning will be issued. - \note If the PxQueryFlag::eNO_BLOCK flag is set, the eBLOCK will instead be automatically converted to an eTOUCH and the warning suppressed. - - @see PxOverlapCallback PxOverlapBuffer PxHitFlags PxQueryFilterData PxQueryFilterCallback - */ - virtual bool overlap(const PxGeometry& geometry, const PxTransform& pose, PxOverlapCallback& hitCall, - const PxQueryFilterData& filterData = PxQueryFilterData(), PxQueryFilterCallback* filterCall = NULL - ) const = 0; - - - /** - \brief Retrieves the scene's internal scene query timestamp, increased each time a change to the - static scene query structure is performed. - - \return scene query static timestamp - */ - virtual PxU32 getSceneQueryStaticTimestamp() const = 0; //@} /************************************************************************************************/ @@ -1444,6 +1403,8 @@ class PxScene /** \brief Adds a new broad-phase region. + The bounds for the new region must be non-empty, otherwise an error occurs and the call is ignored. + Note that by default, objects already existing in the SDK that might touch this region will not be automatically added to the region. In other words the newly created region will be empty, and will only be populated with new objects when they are added to the simulation, or with already existing objects when they are updated. @@ -1453,9 +1414,20 @@ class PxScene when the game can not guarantee that all objects within the new region will be added to the simulation after the region itself. + Objects automatically move from one region to another during their lifetime. The system keeps tracks of what + regions a given object is in. It is legal for an object to be in an arbitrary number of regions. However if an + object leaves all regions, or is created outside of all regions, several things happen: + - collisions get disabled for this object + - if a PxBroadPhaseCallback object is provided, an "out-of-bounds" event is generated via that callback + - if a PxBroadPhaseCallback object is not provided, a warning/error message is sent to the error stream + + If an object goes out-of-bounds and user deletes it during the same frame, neither the out-of-bounds event nor the + error message is generated. + \param[in] region User-provided region data \param[in] populateRegion Automatically populate new region with already existing objects overlapping it \return Handle for newly created region, or 0xffffffff in case of failure. + \see PxBroadPhaseRegion PxBroadPhaseCallback */ virtual PxU32 addBroadPhaseRegion(const PxBroadPhaseRegion& region, bool populateRegion=false) = 0; @@ -1489,7 +1461,6 @@ class PxScene */ virtual PxTaskManager* getTaskManager() const = 0; - /** \brief Lock the scene for reading from the calling thread. @@ -1551,7 +1522,6 @@ class PxScene */ virtual void unlockWrite() = 0; - /** \brief set the cache blocks that can be used during simulate(). @@ -1561,12 +1531,13 @@ class PxScene This call will force allocation of cache blocks if the numBlocks parameter is greater than the currently allocated number of blocks, and less than the max16KContactDataBlocks parameter specified at scene creation time. + \note Do not use this method while the simulation is running. + \param[in] numBlocks The number of blocks to allocate. @see PxSceneDesc.nbContactDataBlocks PxSceneDesc.maxNbContactDataBlocks flushSimulation() getNbContactDataBlocksUsed getMaxNbContactDataBlocksUsed */ virtual void setNbContactDataBlocks(PxU32 numBlocks) = 0; - /** \brief get the number of cache blocks currently used by the scene @@ -1590,18 +1561,18 @@ class PxScene */ virtual PxU32 getMaxNbContactDataBlocksUsed() const = 0; - /** \brief Return the value of PxSceneDesc::contactReportStreamBufferSize that was set when creating the scene with PxPhysics::createScene @see PxSceneDesc::contactReportStreamBufferSize, PxPhysics::createScene */ - virtual PxU32 getContactReportStreamBufferSize() const = 0; + virtual PxU32 getContactReportStreamBufferSize() const = 0; - /** \brief Sets the number of actors required to spawn a separate rigid body solver thread. + \note Do not use this method while the simulation is running. + \param[in] solverBatchSize Number of actors required to spawn a separate rigid body solver thread. @see PxSceneDesc.solverBatchSize getSolverBatchSize() @@ -1620,6 +1591,8 @@ class PxScene /** \brief Sets the number of articulations required to spawn a separate rigid body solver thread. + \note Do not use this method while the simulation is running. + \param[in] solverBatchSize Number of articulations required to spawn a separate rigid body solver thread. @see PxSceneDesc.solverBatchSize getSolverArticulationBatchSize() @@ -1635,7 +1608,6 @@ class PxScene */ virtual PxU32 getSolverArticulationBatchSize() const = 0; - //@} /** @@ -1671,6 +1643,168 @@ class PxScene */ virtual PxPvdSceneClient* getScenePvdClient() = 0; + /** + \brief Copy GPU articulation data from the internal GPU buffer to a user-provided device buffer. + \param[in] data User-provided gpu data buffer which should be sized appropriately for the particular data that is requested. Further details provided in the user guide. + \param[in] index User-provided gpu index buffer. This buffer stores the articulation indices which the user wants to copy. + \param[in] dataType Enum specifying the type of data the user wants to read back from the articulations. + \param[in] nbCopyArticulations Number of articulations that data should be copied from. + \param[in] copyEvent User-provided event for the articulation stream to signal when the data copy to the user buffer has completed. + */ + virtual void copyArticulationData(void* data, void* index, PxArticulationGpuDataType::Enum dataType, const PxU32 nbCopyArticulations, void* copyEvent = NULL) = 0; + + /** + \brief Apply GPU articulation data from a user-provided device buffer to the internal GPU buffer. + \param[in] data User-provided gpu data buffer which should be sized appropriately for the particular data that is requested. Further details provided in the user guide. + \param[in] index User-provided gpu index buffer. This buffer stores the articulation indices which the user wants to write to. + \param[in] dataType Enum specifying the type of data the user wants to write to the articulations. + \param[in] nbUpdatedArticulations Number of articulations that data should be written to. + \param[in] waitEvent User-provided event for the articulation stream to wait for data. + \param[in] signalEvent User-provided event for the articulation stream to signal when the data read from the user buffer has completed. + */ + virtual void applyArticulationData(void* data, void* index, PxArticulationGpuDataType::Enum dataType, const PxU32 nbUpdatedArticulations, void* waitEvent = NULL, void* signalEvent = NULL) = 0; + + /** + \brief Copy GPU softbody data from the internal GPU buffer to a user-provided device buffer. + \param[in] data User-provided gpu buffer containing a pointer to another gpu buffer for every softbody to process + \param[in] dataSizes The size of every buffer in bytes + \param[in] softBodyIndices User provided gpu index buffer. This buffer stores the softbody index which the user want to copy. + \param[in] maxSize The largest size stored in dataSizes. Used internally to decide how many threads to launch for the copy process. + \param[in] flag Flag defining which data the user wants to read back from the softbody system + \param[in] nbCopySoftBodies The number of softbodies to be copied. + \param[in] copyEvent User-provided event for the user to sync data + */ + virtual void copySoftBodyData(void** data, void* dataSizes, void* softBodyIndices, PxSoftBodyDataFlag::Enum flag, const PxU32 nbCopySoftBodies, const PxU32 maxSize, void* copyEvent = NULL) = 0; + + + /** + \brief Apply user-provided data to the internal softbody system. + \param[in] data User-provided gpu buffer containing a pointer to another gpu buffer for every softbody to process + \param[in] dataSizes The size of every buffer in bytes + \param[in] softBodyIndices User provided gpu index buffer. This buffer stores the updated softbody index. + \param[in] flag Flag defining which data the user wants to write to the softbody system + \param[in] maxSize The largest size stored in dataSizes. Used internally to decide how many threads to launch for the copy process. + \param[in] nbUpdatedSoftBodies The number of updated softbodies + \param[in] applyEvent User-provided event for the softbody stream to wait for data + */ + virtual void applySoftBodyData(void** data, void* dataSizes, void* softBodyIndices, PxSoftBodyDataFlag::Enum flag, const PxU32 nbUpdatedSoftBodies, const PxU32 maxSize, void* applyEvent = NULL) = 0; + + /** + \brief Copy contact data from the internal GPU buffer to a user-provided device buffer. + + \note The contact data contains pointers to internal state and is only valid until the next call to simulate(). + + \param[in] data User-provided gpu data buffer, which should be the size of PxGpuContactPair * numContactPairs + \param[in] maxContactPairs The maximum number of pairs that the buffer can contain + \param[in] numContactPairs The actual number of contact pairs that were written + \param[in] copyEvent User-provided event for the user to sync data + */ + virtual void copyContactData(void* data, const PxU32 maxContactPairs, void* numContactPairs, void* copyEvent = NULL) = 0; + + /** + \brief Copy GPU rigid body data from the internal GPU buffer to a user-provided device buffer. + \param[in] data User-provided gpu data buffer which should nbCopyActors * sizeof(PxGpuBodyData). The only data it can copy is PxGpuBodyData. + \param[in] index User provided node PxGpuActorPair buffer. This buffer stores pairs of indices: the PxNodeIndex corresponding to the rigid body and an index corresponding to the location in the user buffer that this value should be placed. + \param[in] nbCopyActors The number of rigid body to be copied. + \param[in] copyEvent User-provided event for the user to sync data. + */ + virtual void copyBodyData(PxGpuBodyData* data, PxGpuActorPair* index, const PxU32 nbCopyActors, void* copyEvent = NULL) = 0; + + /** + \brief Apply user-provided data to rigid body. + \param[in] data User-provided gpu data buffer which should be sized appropriately for the particular data that is requested. Further details provided in the user guide. + \param[in] index User provided PxGpuActorPair buffer. This buffer stores pairs of indices: the PxNodeIndex corresponding to the rigid body and an index corresponding to the location in the user buffer that this value should be placed. + \param[in] flag Flag defining which data the user wants to write to the rigid body + \param[in] nbUpdatedActors The number of updated rigid body + \param[in] waitEvent User-provided event for the rigid body stream to wait for data + \param[in] signalEvent User-provided event for the rigid body stream to signal when the read from the user buffer has completed + */ + virtual void applyActorData(void* data, PxGpuActorPair* index, PxActorCacheFlag::Enum flag, const PxU32 nbUpdatedActors, void* waitEvent = NULL, void* signalEvent = NULL) = 0; + + /** + \brief Compute dense Jacobian matrices for specified articulations on the GPU. + + The size of Jacobians can vary by articulation, since it depends on the number of links, degrees-of-freedom, and whether the base is fixed. + + The size is determined using these formulas: + nCols = (fixedBase ? 0 : 6) + dofCount + nRows = (fixedBase ? 0 : 6) + (linkCount - 1) * 6; + + The user must ensure that adequate space is provided for each Jacobian matrix. + + \param[in] indices User-provided gpu buffer of (index, data) pairs. The entries map a GPU articulation index to a GPU block of memory where the returned Jacobian will be stored. + \param[in] nbIndices The number of (index, data) pairs provided. + \param[in] computeEvent User-provided event for the user to sync data. + */ + virtual void computeDenseJacobians(const PxIndexDataPair* indices, PxU32 nbIndices, void* computeEvent) = 0; + + /** + \brief Compute the joint-space inertia matrices that maps joint accelerations to joint forces: forces = M * accelerations on the GPU. + + The size of matrices can vary by articulation, since it depends on the number of links and degrees-of-freedom. + + The size is determined using this formula: + sizeof(float) * dofCount * dofCount + + The user must ensure that adequate space is provided for each mass matrix. + + \param[in] indices User-provided gpu buffer of (index, data) pairs. The entries map a GPU articulation index to a GPU block of memory where the returned matrix will be stored. + \param[in] nbIndices The number of (index, data) pairs provided. + \param[in] computeEvent User-provided event for the user to sync data. + */ + virtual void computeGeneralizedMassMatrices(const PxIndexDataPair* indices, PxU32 nbIndices, void* computeEvent) = 0; + + /** + \brief Computes the joint DOF forces required to counteract gravitational forces for the given articulation pose. + + The size of the result can vary by articulation, since it depends on the number of links and degrees-of-freedom. + + The size is determined using this formula: + sizeof(float) * dofCount + + The user must ensure that adequate space is provided for each articulation. + + \param[in] indices User-provided gpu buffer of (index, data) pairs. The entries map a GPU articulation index to a GPU block of memory where the returned matrix will be stored. + \param[in] nbIndices The number of (index, data) pairs provided. + \param[in] computeEvent User-provided event for the user to sync data. + */ + virtual void computeGeneralizedGravityForces(const PxIndexDataPair* indices, PxU32 nbIndices, void* computeEvent) = 0; + + /** + \brief Computes the joint DOF forces required to counteract coriolis and centrifugal forces for the given articulation pose. + + The size of the result can vary by articulation, since it depends on the number of links and degrees-of-freedom. + + The size is determined using this formula: + sizeof(float) * dofCount + + The user must ensure that adequate space is provided for each articulation. + + \param[in] indices User-provided gpu buffer of (index, data) pairs. The entries map a GPU articulation index to a GPU block of memory where the returned matrix will be stored. + \param[in] nbIndices The number of (index, data) pairs provided. + \param[in] computeEvent User-provided event for the user to sync data. + */ + virtual void computeCoriolisAndCentrifugalForces(const PxIndexDataPair* indices, PxU32 nbIndices, void* computeEvent) = 0; + + virtual PxgDynamicsMemoryConfig getGpuDynamicsConfig() const = 0; + + /** + \brief Apply user-provided data to particle buffers. + + This function should be used if the particle buffer flags are already on the device. Otherwise, use PxParticleBuffer::raiseFlags() + from the CPU. + + This assumes the data has been changed directly in the PxParticleBuffer. + + \param[in] indices User-provided index buffer that indexes into the BufferIndexPair and flags list. + \param[in] bufferIndexPair User-provided index pair buffer specifying the unique id and GPU particle system for each PxParticleBuffer. See PxGpuParticleBufferIndexPair. + \param[in] flags Flags to mark what data needs to be updated. See PxParticleBufferFlags. + \param[in] nbUpdatedBuffers The number of particle buffers to update. + \param[in] waitEvent User-provided event for the particle stream to wait for data. + \param[in] signalEvent User-provided event for the particle stream to signal when the data read from the user buffer has completed. + */ + virtual void applyParticleBufferData(const PxU32* indices, const PxGpuParticleBufferIndexPair* bufferIndexPair, const PxParticleBufferFlags* flags, PxU32 nbUpdatedBuffers, void* waitEvent = NULL, void* signalEvent = NULL) = 0; + void* userData; //!< user can assign this to whatever, usually to create a 1:1 relationship with a user object. }; diff --git a/Source/ThirdParty/PhysX/PxSceneDesc.h b/Source/ThirdParty/PhysX/PxSceneDesc.h index f4dc1ed48..de8303c85 100644 --- a/Source/ThirdParty/PhysX/PxSceneDesc.h +++ b/Source/ThirdParty/PhysX/PxSceneDesc.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,20 +22,21 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_SCENEDESC -#define PX_PHYSICS_NX_SCENEDESC +#ifndef PX_SCENE_DESC_H +#define PX_SCENE_DESC_H /** \addtogroup physics @{ */ +#include "PxSceneQueryDesc.h" #include "PxPhysXConfig.h" #include "foundation/PxFlags.h" #include "foundation/PxBounds3.h" +#include "foundation/PxBitUtils.h" #include "PxFiltering.h" #include "PxBroadPhase.h" #include "common/PxTolerancesScale.h" @@ -47,68 +47,9 @@ namespace physx { #endif + class PxBroadPhaseCallback; class PxCudaContextManager; -/** -\brief Pruning structure used to accelerate scene queries. - -eNONE uses a simple data structure that consumes less memory than the alternatives, -but generally has slower query performance. - -eDYNAMIC_AABB_TREE usually provides the fastest queries. However there is a -constant per-frame management cost associated with this structure. How much work should -be done per frame can be tuned via the #PxSceneDesc::dynamicTreeRebuildRateHint -parameter. - -eSTATIC_AABB_TREE is typically used for static objects. It is the same as the -dynamic AABB tree, without the per-frame overhead. This can be a good choice for static -objects, if no static objects are added, moved or removed after the scene has been -created. If there is no such guarantee (e.g. when streaming parts of the world in and out), -then the dynamic version is a better choice even for static objects. - -*/ -struct PxPruningStructureType -{ - enum Enum - { - eNONE, //!< Using a simple data structure - eDYNAMIC_AABB_TREE, //!< Using a dynamic AABB tree - eSTATIC_AABB_TREE, //!< Using a static AABB tree - - eLAST - }; -}; - -/** -\brief Scene query update mode - -When PxScene::fetchResults is called it does scene query related work, with this enum it is possible to -set what work is done during the fetchResults. - -FetchResults will sync changed bounds during simulation and update the scene query bounds in pruners, this work is mandatory. - -eCOMMIT_ENABLED_BUILD_ENABLED does allow to execute the new AABB tree build step during fetchResults, additionally the pruner commit is -called where any changes are applied. During commit PhysX refits the dynamic scene query tree and if a new tree was built and -the build finished the tree is swapped with current AABB tree. - -eCOMMIT_DISABLED_BUILD_ENABLED does allow to execute the new AABB tree build step during fetchResults. Pruner commit is not called, -this means that refit will then occur during the first scene query following fetchResults, or may be forced by the method PxScene::flushSceneQueryUpdates(). - -eCOMMIT_DISABLED_BUILD_DISABLED no further scene query work is executed. The scene queries update needs to be called manually, see PxScene::sceneQueriesUpdate. -It is recommended to call PxScene::sceneQueriesUpdate right after fetchResults as the pruning structures are not updated. - -*/ -struct PxSceneQueryUpdateMode -{ - enum Enum - { - eBUILD_ENABLED_COMMIT_ENABLED, //!< Both scene query build and commit are executed. - eBUILD_ENABLED_COMMIT_DISABLED, //!< Scene query build only is executed. - eBUILD_DISABLED_COMMIT_DISABLED //!< No work is done, no update of scene queries - }; -}; - - /** \brief Enum for selecting the friction algorithm used for simulation. @@ -135,11 +76,10 @@ struct PxFrictionType }; }; - /** \brief Enum for selecting the type of solver used for the simulation. -#PxSolverType::ePGS selects the default iterative sequential impulse solver. This is the same kind of solver used in PhysX 3.4 and earlier releases. +#PxSolverType::ePGS selects the iterative sequential impulse solver. This is the same kind of solver used in PhysX 3.4 and earlier releases. #PxSolverType::eTGS selects a non linear iterative solver. This kind of solver can lead to improved convergence and handle large mass ratios, long chains and jointed systems better. It is slightly more expensive than the default solver and can introduce more energy to correct joint and contact errors. */ @@ -147,18 +87,16 @@ struct PxSolverType { enum Enum { - ePGS, //!< Default Projected Gauss-Seidel iterative solver - eTGS //!< Temporal Gauss-Seidel solver + ePGS, //!< Projected Gauss-Seidel iterative solver + eTGS //!< Default Temporal Gauss-Seidel solver }; }; - /** \brief flags for configuring properties of the scene @see PxScene */ - struct PxSceneFlag { enum Enum @@ -212,15 +150,6 @@ struct PxSceneFlag */ eDISABLE_CCD_RESWEEP = (1<<2), - /** - \brief Enable adaptive forces to accelerate convergence of the solver. - - \note This flag is not mutable, and must be set in PxSceneDesc at scene creation. - - Default: false - */ - eADAPTIVE_FORCE = (1<<3), - /** \brief Enable GJK-based distance collision detection system. @@ -349,11 +278,21 @@ struct PxSceneFlag */ eENABLE_FRICTION_EVERY_ITERATION = (1 << 15), - eMUTABLE_FLAGS = eENABLE_ACTIVE_ACTORS|eEXCLUDE_KINEMATICS_FROM_ACTIVE_ACTORS + /* + \brief Disables GPU readback of articulation data when running on GPU. + Useful if your application only needs to communicate to the GPU via GPU buffers. Can be significantly faster + */ + eSUPPRESS_READBACK = (1<<16), + + /* + \brief Forces GPU readback of articulation data when user raise eSUPPRESS_READBACK. + */ + eFORCE_READBACK = (1 << 17), + + eMUTABLE_FLAGS = eENABLE_ACTIVE_ACTORS|eEXCLUDE_KINEMATICS_FROM_ACTIVE_ACTORS|eSUPPRESS_READBACK }; }; - /** \brief collection of set bits defined in PxSceneFlag. @@ -362,7 +301,6 @@ struct PxSceneFlag typedef PxFlags PxSceneFlags; PX_FLAGS_OPERATORS(PxSceneFlag::Enum,PxU32) - class PxSimulationEventCallback; class PxContactModifyCallback; class PxCCDContactModifyCallback; @@ -437,28 +375,44 @@ PX_INLINE bool PxSceneLimits::isValid() const struct PxgDynamicsMemoryConfig { - PxU32 constraintBufferCapacity; //!< Capacity of constraint buffer allocated in GPU global memory - PxU32 contactBufferCapacity; //!< Capacity of contact buffer allocated in GPU global memory - PxU32 tempBufferCapacity; //!< Capacity of temp buffer allocated in pinned host memory. - PxU32 contactStreamSize; //!< Size of contact stream buffer allocated in pinned host memory. This is double-buffered so total allocation size = 2* contactStreamCapacity * sizeof(PxContact). - PxU32 patchStreamSize; //!< Size of the contact patch stream buffer allocated in pinned host memory. This is double-buffered so total allocation size = 2 * patchStreamCapacity * sizeof(PxContactPatch). - PxU32 forceStreamCapacity; //!< Capacity of force buffer allocated in pinned host memory. - PxU32 heapCapacity; //!< Initial capacity of the GPU and pinned host memory heaps. Additional memory will be allocated if more memory is required. - PxU32 foundLostPairsCapacity; //!< Capacity of found and lost buffers allocated in GPU global memory. This is used for the found/lost pair reports in the BP. + PxU32 tempBufferCapacity; //!< Capacity of temp buffer allocated in pinned host memory. + PxU32 maxRigidContactCount; //!< Size of contact stream buffer allocated in pinned host memory. This is double-buffered so total allocation size = 2* contactStreamCapacity * sizeof(PxContact). + PxU32 maxRigidPatchCount; //!< Size of the contact patch stream buffer allocated in pinned host memory. This is double-buffered so total allocation size = 2 * patchStreamCapacity * sizeof(PxContactPatch). + PxU32 heapCapacity; //!< Initial capacity of the GPU and pinned host memory heaps. Additional memory will be allocated if more memory is required. + PxU32 foundLostPairsCapacity; //!< Capacity of found and lost buffers allocated in GPU global memory. This is used for the found/lost pair reports in the BP. + PxU32 foundLostAggregatePairsCapacity; //!Range: force vector
Default: Zero - @see PxScene.setGravity() + @see PxScene.setGravity() PxScene.getGravity() When setting gravity, you should probably also set bounce threshold. */ - PxVec3 gravity; + PxVec3 gravity; /** \brief Possible notification callback. @@ -518,18 +472,18 @@ public: Default: NULL - @see PxSimulationFilterShader PxScene::setFilterShaderData() + @see PxSimulationFilterShader PxScene.setFilterShaderData() PxScene.getFilterShaderData() */ - const void* filterShaderData; + const void* filterShaderData; /** \brief Size (in bytes) of the shared global filter data #filterShaderData. Default: 0 - @see PxSimulationFilterShader filterShaderData + @see PxSimulationFilterShader filterShaderData PxScene.getFilterShaderDataSize() */ - PxU32 filterShaderDataSize; + PxU32 filterShaderDataSize; /** \brief The custom filter shader to use for collision filtering. @@ -538,7 +492,7 @@ public: use the default shader #PxDefaultSimulationFilterShader which can be found in the PhysX extensions library. - @see PxSimulationFilterShader + @see PxSimulationFilterShader PxScene.getFilterShader() */ PxSimulationFilterShader filterShader; @@ -548,7 +502,7 @@ public: Default: NULL - @see PxSimulationFilterCallback + @see PxSimulationFilterCallback PxScene.getFilterCallback() */ PxSimulationFilterCallback* filterCallback; @@ -557,53 +511,52 @@ public: Default: PxPairFilteringMode::eDEFAULT - @see PxPairFilteringMode + @see PxPairFilteringMode PxScene.getKinematicKinematicFilteringMode() */ - PxPairFilteringMode::Enum kineKineFilteringMode; + PxPairFilteringMode::Enum kineKineFilteringMode; /** \brief Filtering mode for static-kinematic pairs in the broadphase. Default: PxPairFilteringMode::eDEFAULT - @see PxPairFilteringMode + @see PxPairFilteringMode PxScene.getStaticKinematicFilteringMode() */ - PxPairFilteringMode::Enum staticKineFilteringMode; + PxPairFilteringMode::Enum staticKineFilteringMode; /** \brief Selects the broad-phase algorithm to use. - Default: PxBroadPhaseType::eABP + Default: PxBroadPhaseType::ePABP - @see PxBroadPhaseType + @see PxBroadPhaseType PxScene.getBroadPhaseType() */ - PxBroadPhaseType::Enum broadPhaseType; + PxBroadPhaseType::Enum broadPhaseType; /** \brief Broad-phase callback Default: NULL - @see PxBroadPhaseCallback + @see PxBroadPhaseCallback PxScene.getBroadPhaseCallback() PxScene.setBroadPhaseCallback() */ - PxBroadPhaseCallback* broadPhaseCallback; + PxBroadPhaseCallback* broadPhaseCallback; /** \brief Expected scene limits. - @see PxSceneLimits + @see PxSceneLimits PxScene.getLimits() */ - PxSceneLimits limits; + PxSceneLimits limits; /** \brief Selects the friction algorithm to use for simulation. \note frictionType cannot be modified after the first call to any of PxScene::simulate, PxScene::solve and PxScene::collide - @see PxFrictionType Default: PxFrictionType::ePATCH - @see PxScene::setFrictionType, PxScene::getFrictionType + @see PxFrictionType PxScene.setFrictionType(), PxScene.getFrictionType() */ PxFrictionType::Enum frictionType; @@ -612,18 +565,18 @@ public: Default: PxSolverType::ePGS - @see PxSolverType + @see PxSolverType PxScene.getSolverType() */ - PxSolverType::Enum solverType; + PxSolverType::Enum solverType; /** \brief A contact with a relative velocity below this will not bounce. A typical value for simulation. stability is about 0.2 * gravity. - Range: [0, PX_MAX_F32)
+ Range: (0, PX_MAX_F32)
Default: 0.2 * PxTolerancesScale::speed - @see PxMaterial + @see PxMaterial PxScene.setBounceThresholdVelocity() PxScene.getBounceThresholdVelocity() */ PxReal bounceThresholdVelocity; @@ -639,96 +592,56 @@ public: Range: [0, PX_MAX_F32)
Default: 0.04 * PxTolerancesScale::length + + @see PxScene.setFrictionOffsetThreshold() PxScene.getFrictionOffsetThreshold() */ PxReal frictionOffsetThreshold; /** - \brief A threshold for speculative CCD. Used to control whether bias, restitution or a combination of the two are used to resolve the contacts. + \brief Friction correlation distance used to decide whether contacts are close enough to be merged into a single friction anchor point or not. - \note This only has any effect on contacting pairs where one of the bodies has PxRigidBodyFlag::eENABLE_SPECULATIVE_CCD raised. + \note If the correlation distance is larger than the distance between contact points generated between a pair of shapes, some of the contacts may not experience frictional forces. + + \note This parameter can be used to tune the correlation distance used in the solver. Contact points can be merged into a single friction anchor if the distance between the contacts is smaller than correlation distance. Range: [0, PX_MAX_F32)
- Default: 0.04 * PxTolerancesScale::length + Default: 0.025f * PxTolerancesScale::length + + @see PxScene.setFrictionCorrelationDistance() PxScene.getFrictionCorrelationDistance() */ - - PxReal ccdMaxSeparation; - - /** - \brief A slop value used to zero contact offsets from the body's COM on an axis if the offset along that axis is smaller than this threshold. Can be used to compensate - for small numerical errors in contact generation. - - Range: [0, PX_MAX_F32)
- Default: 0.0 - */ - - PxReal solverOffsetSlop; + PxReal frictionCorrelationDistance; /** \brief Flags used to select scene options. - @see PxSceneFlag PxSceneFlags + Default: PxSceneFlag::eENABLE_PCM + + @see PxSceneFlag PxSceneFlags PxScene.getFlags() PxScene.setFlag() */ - PxSceneFlags flags; + PxSceneFlags flags; /** \brief The CPU task dispatcher for the scene. - See PxCpuDispatcher, PxScene::getCpuDispatcher + @see PxCpuDispatcher, PxScene::getCpuDispatcher */ - PxCpuDispatcher* cpuDispatcher; + PxCpuDispatcher* cpuDispatcher; /** \brief The CUDA context manager for the scene. Platform specific: Applies to PC GPU only. - See PxCudaContextManager, PxScene::getCudaContextManager + @see PxCudaContextManager, PxScene::getCudaContextManager */ PxCudaContextManager* cudaContextManager; - /** - \brief Defines the structure used to store static objects. - - \note Only PxPruningStructureType::eSTATIC_AABB_TREE and PxPruningStructureType::eDYNAMIC_AABB_TREE are allowed here. - */ - PxPruningStructureType::Enum staticStructure; - - /** - \brief Defines the structure used to store dynamic objects. - */ - PxPruningStructureType::Enum dynamicStructure; - - /** - \brief Hint for how much work should be done per simulation frame to rebuild the pruning structure. - - This parameter gives a hint on the distribution of the workload for rebuilding the dynamic AABB tree - pruning structure #PxPruningStructureType::eDYNAMIC_AABB_TREE. It specifies the desired number of simulation frames - the rebuild process should take. Higher values will decrease the workload per frame but the pruning - structure will get more and more outdated the longer the rebuild takes (which can make - scene queries less efficient). - - \note Only used for #PxPruningStructureType::eDYNAMIC_AABB_TREE pruning structure. - - \note This parameter gives only a hint. The rebuild process might still take more or less time depending on the - number of objects involved. - - Range: [4, PX_MAX_U32)
- Default: 100 - */ - PxU32 dynamicTreeRebuildRateHint; - - /** - \brief Defines the scene query update mode. - Default: PxSceneQueryUpdateMode::eBUILD_ENABLED_COMMIT_ENABLED - */ - PxSceneQueryUpdateMode::Enum sceneQueryUpdateMode; - /** \brief Will be copied to PxScene::userData. Default: NULL */ - void* userData; + void* userData; /** \brief Defines the number of actors required to spawn a separate rigid body solver island task chain. @@ -745,7 +658,7 @@ public: @see PxScene.setSolverBatchSize() PxScene.getSolverBatchSize() */ - PxU32 solverBatchSize; + PxU32 solverBatchSize; /** \brief Defines the number of articulations required to spawn a separate rigid body solver island task chain. @@ -758,11 +671,11 @@ public: Note that a rigid body solver task chain is spawned as soon as either a sufficient number of rigid bodies or articulations are batched together. - Default: 128 + Default: 16 @see PxScene.setSolverArticulationBatchSize() PxScene.getSolverArticulationBatchSize() */ - PxU32 solverArticulationBatchSize; + PxU32 solverArticulationBatchSize; /** \brief Setting to define the number of 16K blocks that will be initially reserved to store contact, friction, and contact cache data. @@ -777,7 +690,7 @@ public: @see PxPhysics::createScene PxScene::setNbContactDataBlocks */ - PxU32 nbContactDataBlocks; + PxU32 nbContactDataBlocks; /** \brief Setting to define the maximum number of 16K blocks that can be allocated to store contact, friction, and contact cache data. @@ -795,9 +708,9 @@ public: Range: [0, PX_MAX_U32]
- @see nbContactDataBlocks PxScene::setNbContactDataBlocks + @see nbContactDataBlocks PxScene.setNbContactDataBlocks() */ - PxU32 maxNbContactDataBlocks; + PxU32 maxNbContactDataBlocks; /** \brief The maximum bias coefficient used in the constraint solver @@ -814,8 +727,9 @@ public: Range [0, PX_MAX_F32]
+ @see PxScene.setMaxBiasCoefficient() PxScene.getMaxBiasCoefficient() */ - PxReal maxBiasCoefficient; + PxReal maxBiasCoefficient; /** \brief Size of the contact report stream (in bytes). @@ -829,8 +743,9 @@ public: Range: (0, PX_MAX_U32]
+ @see PxScene.getContactReportStreamBufferSize() */ - PxU32 contactReportStreamBufferSize; + PxU32 contactReportStreamBufferSize; /** \brief Maximum number of CCD passes @@ -842,8 +757,10 @@ public: Default: 1 Range: [1, PX_MAX_U32]
+ + @see PxScene.setCCDMaxPasses() PxScene.getCCDMaxPasses() */ - PxU32 ccdMaxPasses; + PxU32 ccdMaxPasses; /** \brief CCD threshold @@ -857,9 +774,22 @@ public: Default: PX_MAX_F32 Range: [Eps, PX_MAX_F32]
- */ - PxReal ccdThreshold; + @see PxScene.setCCDThreshold() PxScene.getCCDThreshold() + */ + PxReal ccdThreshold; + + /** + \brief A threshold for speculative CCD. Used to control whether bias, restitution or a combination of the two are used to resolve the contacts. + + \note This only has any effect on contacting pairs where one of the bodies has PxRigidBodyFlag::eENABLE_SPECULATIVE_CCD raised. + + Range: [0, PX_MAX_F32)
+ Default: 0.04 * PxTolerancesScale::length + + @see PxScene.setCCDMaxSeparation() PxScene.getCCDMaxSeparation() + */ + PxReal ccdMaxSeparation; /** \brief The wake counter reset value @@ -869,9 +799,9 @@ public: Range: (0, PX_MAX_F32)
Default: 0.4 (which corresponds to 20 frames for a time step of 0.02) - @see PxRigidDynamic::wakeUp() PxArticulationBase::wakeUp() + @see PxRigidDynamic::wakeUp() PxArticulationReducedCoordinate::wakeUp() PxScene.getWakeCounterResetValue() */ - PxReal wakeCounterResetValue; + PxReal wakeCounterResetValue; /** \brief The bounds used to sanity check user-set positions of actors and articulation links @@ -882,7 +812,7 @@ public: Range: any valid PxBounds3
Default: (-PX_MAX_BOUNDS_EXTENTS, PX_MAX_BOUNDS_EXTENTS) on each axis */ - PxBounds3 sanityBounds; + PxBounds3 sanityBounds; /** \brief The pre-allocations performed in the GPU dynamics pipeline. @@ -895,24 +825,52 @@ public: A value greater than 32 is currently not supported. Range: (1, 32)
*/ - PxU32 gpuMaxNumPartitions; + PxU32 gpuMaxNumPartitions; + + /** + \brief Limitation for the number of static rigid body partitions in the GPU dynamics pipeline. + Range: (1, 255)
+ Default: 16 + */ + PxU32 gpuMaxNumStaticPartitions; /** \brief Defines which compute version the GPU dynamics should target. DO NOT MODIFY */ - PxU32 gpuComputeVersion; + PxU32 gpuComputeVersion; + + /** + \brief Defines the size of a contact pool slab. + Contact pairs and associated data are allocated using a pool allocator. Increasing the slab size can trade + off some performance spikes when a large number of new contacts are found for an increase in overall memory + usage. + + Range:(1, PX_MAX_U32)
+ Default: 256 + */ + PxU32 contactPairSlabSize; + + /** + \brief The scene query sub-system for the scene. + + If left to NULL, PxScene will use its usual internal sub-system. If non-NULL, all SQ-related calls + will be re-routed to the user-provided implementation. An external SQ implementation is available + in the Extensions library (see PxCreateExternalSceneQuerySystem). This can also be fully re-implemented by users if needed. + + @see PxSceneQuerySystem + */ + PxSceneQuerySystem* sceneQuerySystem; private: /** \cond */ // For internal use only - PxTolerancesScale tolerancesScale; + PxTolerancesScale tolerancesScale; /** \endcond */ - public: /** \brief constructor sets to default. @@ -951,55 +909,53 @@ public: }; PX_INLINE PxSceneDesc::PxSceneDesc(const PxTolerancesScale& scale): - gravity (PxVec3(0.0f)), - simulationEventCallback (NULL), - contactModifyCallback (NULL), - ccdContactModifyCallback (NULL), + gravity (PxVec3(0.0f)), + simulationEventCallback (NULL), + contactModifyCallback (NULL), + ccdContactModifyCallback (NULL), - filterShaderData (NULL), - filterShaderDataSize (0), - filterShader (NULL), - filterCallback (NULL), + filterShaderData (NULL), + filterShaderDataSize (0), + filterShader (NULL), + filterCallback (NULL), - kineKineFilteringMode (PxPairFilteringMode::eDEFAULT), - staticKineFilteringMode (PxPairFilteringMode::eDEFAULT), + kineKineFilteringMode (PxPairFilteringMode::eDEFAULT), + staticKineFilteringMode (PxPairFilteringMode::eDEFAULT), - broadPhaseType (PxBroadPhaseType::eABP), - broadPhaseCallback (NULL), + broadPhaseType (PxBroadPhaseType::ePABP), + broadPhaseCallback (NULL), - frictionType (PxFrictionType::ePATCH), - solverType (PxSolverType::ePGS), - bounceThresholdVelocity (0.2f * scale.speed), - frictionOffsetThreshold (0.04f * scale.length), - ccdMaxSeparation (0.04f * scale.length), - solverOffsetSlop (0.0f), + frictionType (PxFrictionType::ePATCH), + solverType (PxSolverType::ePGS), + bounceThresholdVelocity (0.2f * scale.speed), + frictionOffsetThreshold (0.04f * scale.length), + frictionCorrelationDistance (0.025f * scale.length), - flags (PxSceneFlag::eENABLE_PCM), + flags (PxSceneFlag::eENABLE_PCM), - cpuDispatcher (NULL), - cudaContextManager (NULL), + cpuDispatcher (NULL), + cudaContextManager (NULL), - staticStructure (PxPruningStructureType::eDYNAMIC_AABB_TREE), - dynamicStructure (PxPruningStructureType::eDYNAMIC_AABB_TREE), - dynamicTreeRebuildRateHint (100), - sceneQueryUpdateMode (PxSceneQueryUpdateMode::eBUILD_ENABLED_COMMIT_ENABLED), + userData (NULL), - userData (NULL), + solverBatchSize (128), + solverArticulationBatchSize (16), - solverBatchSize (128), - solverArticulationBatchSize (16), - - nbContactDataBlocks (0), - maxNbContactDataBlocks (1<<16), - maxBiasCoefficient (PX_MAX_F32), - contactReportStreamBufferSize (8192), - ccdMaxPasses (1), - ccdThreshold (PX_MAX_F32), - wakeCounterResetValue (20.0f*0.02f), - sanityBounds (PxBounds3(PxVec3(-PX_MAX_BOUNDS_EXTENTS), PxVec3(PX_MAX_BOUNDS_EXTENTS))), - gpuMaxNumPartitions (8), - gpuComputeVersion (0), - tolerancesScale (scale) + nbContactDataBlocks (0), + maxNbContactDataBlocks (1<<16), + maxBiasCoefficient (PX_MAX_F32), + contactReportStreamBufferSize (8192), + ccdMaxPasses (1), + ccdThreshold (PX_MAX_F32), + ccdMaxSeparation (0.04f * scale.length), + wakeCounterResetValue (20.0f*0.02f), + sanityBounds (PxBounds3(PxVec3(-PX_MAX_BOUNDS_EXTENTS), PxVec3(PX_MAX_BOUNDS_EXTENTS))), + gpuMaxNumPartitions (8), + gpuMaxNumStaticPartitions (16), + gpuComputeVersion (0), + contactPairSlabSize (256), + sceneQuerySystem (NULL), + tolerancesScale (scale) { } @@ -1010,6 +966,9 @@ PX_INLINE void PxSceneDesc::setToDefault(const PxTolerancesScale& scale) PX_INLINE bool PxSceneDesc::isValid() const { + if(!PxSceneQueryDesc::isValid()) + return false; + if(!filterShader) return false; @@ -1020,22 +979,21 @@ PX_INLINE bool PxSceneDesc::isValid() const if(!limits.isValid()) return false; - if(staticStructure!=PxPruningStructureType::eSTATIC_AABB_TREE && staticStructure!=PxPruningStructureType::eDYNAMIC_AABB_TREE) - return false; - - if(dynamicTreeRebuildRateHint < 4) - return false; - - if(bounceThresholdVelocity < 0.0f) + if(bounceThresholdVelocity <= 0.0f) return false; if(frictionOffsetThreshold < 0.0f) return false; - if(ccdMaxSeparation < 0.0f) - return false; - if (solverOffsetSlop < 0.f) + if(frictionCorrelationDistance <= 0) return false; - if(ccdThreshold <= 0.f) + if(maxBiasCoefficient < 0.0f) + return false; + + if(!ccdMaxPasses) + return false; + if(ccdThreshold <= 0.0f) + return false; + if(ccdMaxSeparation < 0.0f) return false; if(!cpuDispatcher) @@ -1050,25 +1008,32 @@ PX_INLINE bool PxSceneDesc::isValid() const if(wakeCounterResetValue <= 0.0f) return false; - //Adaptive force and stabilization are incompatible. You can only have one or the other - if((flags & (PxSceneFlag::eADAPTIVE_FORCE | PxSceneFlag::eENABLE_STABILIZATION)) == (PxSceneFlag::eADAPTIVE_FORCE | PxSceneFlag::eENABLE_STABILIZATION)) - return false; - if(!sanityBounds.isValid()) return false; #if PX_SUPPORT_GPU_PHYSX - //gpuMaxNumPartitions must be power of 2 - if((gpuMaxNumPartitions&(gpuMaxNumPartitions - 1)) != 0) + if(!PxIsPowerOfTwo(gpuMaxNumPartitions)) return false; - if (gpuMaxNumPartitions > 32) + if(gpuMaxNumPartitions > 32) return false; + if (gpuMaxNumPartitions == 0) + return false; + if(!gpuDynamicsConfig.isValid()) + return false; + + if (flags & PxSceneFlag::eSUPPRESS_READBACK) + { + if(!(flags & PxSceneFlag::eENABLE_GPU_DYNAMICS && broadPhaseType == PxBroadPhaseType::eGPU)) + return false; + } #endif + if(contactPairSlabSize == 0) + return false; + return true; } - #if !PX_DOXYGEN } // namespace physx #endif diff --git a/Source/ThirdParty/PhysX/PxSceneLock.h b/Source/ThirdParty/PhysX/PxSceneLock.h index fcd8236e0..903841c0d 100644 --- a/Source/ThirdParty/PhysX/PxSceneLock.h +++ b/Source/ThirdParty/PhysX/PxSceneLock.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_SCENELOCK -#define PX_PHYSICS_NX_SCENELOCK +#ifndef PX_SCENE_LOCK_H +#define PX_SCENE_LOCK_H /** \addtogroup physics @{ */ @@ -50,7 +48,7 @@ for the duration of the enclosing scope: PxSceneReadLock lock(sceneRef); -\see PxScene::lockRead(), PxScene::unlockRead(), PxSceneFlag::eREQUIRE_RW_LOCK +@see PxScene::lockRead(), PxScene::unlockRead(), PxSceneFlag::eREQUIRE_RW_LOCK */ class PxSceneReadLock { @@ -89,7 +87,7 @@ for the duration of the enclosing scope: PxSceneWriteLock lock(sceneRef); -\see PxScene::lockWrite(), PxScene::unlockWrite(), PxSceneFlag::eREQUIRE_RW_LOCK +@see PxScene::lockWrite(), PxScene::unlockWrite(), PxSceneFlag::eREQUIRE_RW_LOCK */ class PxSceneWriteLock { diff --git a/Source/ThirdParty/PhysX/PxSceneQueryDesc.h b/Source/ThirdParty/PhysX/PxSceneQueryDesc.h new file mode 100644 index 000000000..50eae851b --- /dev/null +++ b/Source/ThirdParty/PhysX/PxSceneQueryDesc.h @@ -0,0 +1,328 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_SCENE_QUERY_DESC_H +#define PX_SCENE_QUERY_DESC_H +/** \addtogroup physics +@{ +*/ + +#include "PxPhysXConfig.h" +#include "geometry/PxBVHBuildStrategy.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + class PxSceneQuerySystem; + +/** +\brief Pruning structure used to accelerate scene queries. + +eNONE uses a simple data structure that consumes less memory than the alternatives, +but generally has slower query performance. + +eDYNAMIC_AABB_TREE usually provides the fastest queries. However there is a +constant per-frame management cost associated with this structure. How much work should +be done per frame can be tuned via the #PxSceneQueryDesc::dynamicTreeRebuildRateHint +parameter. + +eSTATIC_AABB_TREE is typically used for static objects. It is the same as the +dynamic AABB tree, without the per-frame overhead. This can be a good choice for static +objects, if no static objects are added, moved or removed after the scene has been +created. If there is no such guarantee (e.g. when streaming parts of the world in and out), +then the dynamic version is a better choice even for static objects. +*/ +struct PxPruningStructureType +{ + enum Enum + { + eNONE, //!< Using a simple data structure + eDYNAMIC_AABB_TREE, //!< Using a dynamic AABB tree + eSTATIC_AABB_TREE, //!< Using a static AABB tree + + eLAST + }; +}; + +/** +\brief Secondary pruning structure used for newly added objects in dynamic trees. + +Dynamic trees (PxPruningStructureType::eDYNAMIC_AABB_TREE) are slowly rebuilt +over several frames. A secondary pruning structure holds and manages objects +added to the scene while this rebuild is in progress. + +eNONE ignores newly added objects. This means that for a number of frames (roughly +defined by PxSceneQueryDesc::dynamicTreeRebuildRateHint) newly added objects will +be ignored by scene queries. This can be acceptable when streaming large worlds, e.g. +when the objects added at the boundaries of the game world don't immediately need to be +visible from scene queries (it would be equivalent to streaming that data in a few frames +later). The advantage of this approach is that there is no CPU cost associated with +inserting the new objects in the scene query data structures, and no extra runtime cost +when performing queries. + +eBUCKET uses a structure similar to PxPruningStructureType::eNONE. Insertion is fast but +query cost can be high. + +eINCREMENTAL uses an incremental AABB-tree, with no direct PxPruningStructureType equivalent. +Query time is fast but insertion cost can be high. + +eBVH uses a PxBVH structure. This usually offers the best overall performance. +*/ +struct PxDynamicTreeSecondaryPruner +{ + enum Enum + { + eNONE, //!< no secondary pruner, new objects aren't visible to SQ for a few frames + eBUCKET , //!< bucket-based secondary pruner, faster updates, slower query time + eINCREMENTAL, //!< incremental-BVH secondary pruner, faster query time, slower updates + eBVH, //!< PxBVH-based secondary pruner, good overall performance + + eLAST + }; +}; + +/** +\brief Scene query update mode + +This enum controls what work is done when the scene query system is updated. The updates traditionally happen when PxScene::fetchResults +is called. This function then calls PxSceneQuerySystem::finalizeUpdates, where the update mode is used. + +fetchResults/finalizeUpdates will sync changed bounds during simulation and update the scene query bounds in pruners, this work is mandatory. + +eBUILD_ENABLED_COMMIT_ENABLED does allow to execute the new AABB tree build step during fetchResults/finalizeUpdates, additionally +the pruner commit is called where any changes are applied. During commit PhysX refits the dynamic scene query tree and if a new tree +was built and the build finished the tree is swapped with current AABB tree. + +eBUILD_ENABLED_COMMIT_DISABLED does allow to execute the new AABB tree build step during fetchResults/finalizeUpdates. Pruner commit +is not called, this means that refit will then occur during the first scene query following fetchResults/finalizeUpdates, or may be forced +by the method PxScene::flushQueryUpdates() / PxSceneQuerySystemBase::flushUpdates(). + +eBUILD_DISABLED_COMMIT_DISABLED no further scene query work is executed. The scene queries update needs to be called manually, see +PxScene::sceneQueriesUpdate (see that function's doc for the equivalent PxSceneQuerySystem sequence). It is recommended to call +PxScene::sceneQueriesUpdate right after fetchResults/finalizeUpdates as the pruning structures are not updated. +*/ +struct PxSceneQueryUpdateMode +{ + enum Enum + { + eBUILD_ENABLED_COMMIT_ENABLED, //!< Both scene query build and commit are executed. + eBUILD_ENABLED_COMMIT_DISABLED, //!< Scene query build only is executed. + eBUILD_DISABLED_COMMIT_DISABLED //!< No work is done, no update of scene queries + }; +}; + +/** +\brief Descriptor class for scene query system. See #PxSceneQuerySystem. +*/ +class PxSceneQueryDesc +{ +public: + + /** + \brief Defines the structure used to store static objects (PxRigidStatic actors). + + There are usually a lot more static actors than dynamic actors in a scene, so they are stored + in a separate structure. The idea is that when dynamic actors move each frame, the static structure + remains untouched and does not need updating. + + Default: PxPruningStructureType::eDYNAMIC_AABB_TREE + + \note Only PxPruningStructureType::eSTATIC_AABB_TREE and PxPruningStructureType::eDYNAMIC_AABB_TREE are allowed here. + + @see PxPruningStructureType PxSceneSQSystem.getStaticStructure() + */ + PxPruningStructureType::Enum staticStructure; + + /** + \brief Defines the structure used to store dynamic objects (non-PxRigidStatic actors). + + Default: PxPruningStructureType::eDYNAMIC_AABB_TREE + + @see PxPruningStructureType PxSceneSQSystem.getDynamicStructure() + */ + PxPruningStructureType::Enum dynamicStructure; + + /** + \brief Hint for how much work should be done per simulation frame to rebuild the pruning structures. + + This parameter gives a hint on the distribution of the workload for rebuilding the dynamic AABB tree + pruning structure #PxPruningStructureType::eDYNAMIC_AABB_TREE. It specifies the desired number of simulation frames + the rebuild process should take. Higher values will decrease the workload per frame but the pruning + structure will get more and more outdated the longer the rebuild takes (which can make + scene queries less efficient). + + \note Only used for #PxPruningStructureType::eDYNAMIC_AABB_TREE pruning structures. + + \note Both staticStructure & dynamicStructure can use a PxPruningStructureType::eDYNAMIC_AABB_TREE, in which case + this parameter is used for both. + + \note This parameter gives only a hint. The rebuild process might still take more or less time depending on the + number of objects involved. + + Range: [4, PX_MAX_U32)
+ Default: 100 + + @see PxSceneQuerySystemBase.setDynamicTreeRebuildRateHint() PxSceneQuerySystemBase.getDynamicTreeRebuildRateHint() + */ + PxU32 dynamicTreeRebuildRateHint; + + /** + \brief Secondary pruner for dynamic tree. + + This is used for PxPruningStructureType::eDYNAMIC_AABB_TREE structures, to control how objects added to the system + at runtime are managed. + + \note Both staticStructure & dynamicStructure can use a PxPruningStructureType::eDYNAMIC_AABB_TREE, in which case + this parameter is used for both. + + Default: PxDynamicTreeSecondaryPruner::eINCREMENTAL + + @see PxDynamicTreeSecondaryPruner + */ + PxDynamicTreeSecondaryPruner::Enum dynamicTreeSecondaryPruner; + + /** + \brief Build strategy for PxSceneQueryDesc::staticStructure. + + This parameter is used to refine / control the build strategy of PxSceneQueryDesc::staticStructure. This is only + used with PxPruningStructureType::eDYNAMIC_AABB_TREE and PxPruningStructureType::eSTATIC_AABB_TREE. + + Default: PxBVHBuildStrategy::eFAST + + @see PxBVHBuildStrategy PxSceneQueryDesc::staticStructure + */ + PxBVHBuildStrategy::Enum staticBVHBuildStrategy; + + /** + \brief Build strategy for PxSceneQueryDesc::dynamicStructure. + + This parameter is used to refine / control the build strategy of PxSceneQueryDesc::dynamicStructure. This is only + used with PxPruningStructureType::eDYNAMIC_AABB_TREE and PxPruningStructureType::eSTATIC_AABB_TREE. + + Default: PxBVHBuildStrategy::eFAST + + @see PxBVHBuildStrategy PxSceneQueryDesc::dynamicStructure + */ + PxBVHBuildStrategy::Enum dynamicBVHBuildStrategy; + + /** + \brief Number of objects per node for PxSceneQueryDesc::staticStructure. + + This parameter is used to refine / control the number of objects per node for PxSceneQueryDesc::staticStructure. + This is only used with PxPruningStructureType::eDYNAMIC_AABB_TREE and PxPruningStructureType::eSTATIC_AABB_TREE. + + This parameter has an impact on how quickly the structure gets built, and on the per-frame cost of maintaining + the structure. Increasing this value gives smaller AABB-trees that use less memory, are faster to build and + update, but it can lead to slower queries. + + Default: 4 + + @see PxSceneQueryDesc::staticStructure + */ + PxU32 staticNbObjectsPerNode; + + /** + \brief Number of objects per node for PxSceneQueryDesc::dynamicStructure. + + This parameter is used to refine / control the number of objects per node for PxSceneQueryDesc::dynamicStructure. + This is only used with PxPruningStructureType::eDYNAMIC_AABB_TREE and PxPruningStructureType::eSTATIC_AABB_TREE. + + This parameter has an impact on how quickly the structure gets built, and on the per-frame cost of maintaining + the structure. Increasing this value gives smaller AABB-trees that use less memory, are faster to build and + update, but it can lead to slower queries. + + Default: 4 + + @see PxSceneQueryDesc::dynamicStructure + */ + PxU32 dynamicNbObjectsPerNode; + + /** + \brief Defines the scene query update mode. + + Default: PxSceneQueryUpdateMode::eBUILD_ENABLED_COMMIT_ENABLED + + @see PxSceneQuerySystemBase.setUpdateMode() PxSceneQuerySystemBase.getUpdateMode() + */ + PxSceneQueryUpdateMode::Enum sceneQueryUpdateMode; + +public: + /** + \brief constructor sets to default. + */ + PX_INLINE PxSceneQueryDesc(); + + /** + \brief (re)sets the structure to the default. + */ + PX_INLINE void setToDefault(); + + /** + \brief Returns true if the descriptor is valid. + \return true if the current settings are valid. + */ + PX_INLINE bool isValid() const; +}; + +PX_INLINE PxSceneQueryDesc::PxSceneQueryDesc(): + staticStructure (PxPruningStructureType::eDYNAMIC_AABB_TREE), + dynamicStructure (PxPruningStructureType::eDYNAMIC_AABB_TREE), + dynamicTreeRebuildRateHint (100), + dynamicTreeSecondaryPruner (PxDynamicTreeSecondaryPruner::eINCREMENTAL), + staticBVHBuildStrategy (PxBVHBuildStrategy::eFAST), + dynamicBVHBuildStrategy (PxBVHBuildStrategy::eFAST), + staticNbObjectsPerNode (4), + dynamicNbObjectsPerNode (4), + sceneQueryUpdateMode (PxSceneQueryUpdateMode::eBUILD_ENABLED_COMMIT_ENABLED) +{ +} + +PX_INLINE void PxSceneQueryDesc::setToDefault() +{ + *this = PxSceneQueryDesc(); +} + +PX_INLINE bool PxSceneQueryDesc::isValid() const +{ + if(staticStructure!=PxPruningStructureType::eSTATIC_AABB_TREE && staticStructure!=PxPruningStructureType::eDYNAMIC_AABB_TREE) + return false; + + if(dynamicTreeRebuildRateHint < 4) + return false; + + return true; +} + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxSceneQuerySystem.h b/Source/ThirdParty/PhysX/PxSceneQuerySystem.h new file mode 100644 index 000000000..759e6d894 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxSceneQuerySystem.h @@ -0,0 +1,656 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_SCENE_QUERY_SYSTEM_H +#define PX_SCENE_QUERY_SYSTEM_H +/** \addtogroup physics +@{ */ + +#include "foundation/PxSimpleTypes.h" +#include "foundation/PxBitMap.h" +#include "foundation/PxTransform.h" +#include "PxSceneQueryDesc.h" +#include "PxQueryReport.h" +#include "PxQueryFiltering.h" +#include "geometry/PxGeometryQueryFlags.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + class PxBaseTask; + class PxRenderOutput; + class PxGeometry; + class PxRigidActor; + class PxShape; + class PxBVH; + class PxPruningStructure; + + /** + \brief Built-in enum for default PxScene pruners + + This is passed as a pruner index to various functions in the following APIs. + + @see PxSceneQuerySystemBase::forceRebuildDynamicTree PxSceneQuerySystem::preallocate + @see PxSceneQuerySystem::visualize PxSceneQuerySystem::sync PxSceneQuerySystem::prepareSceneQueryBuildStep + */ + enum PxScenePrunerIndex + { + PX_SCENE_PRUNER_STATIC = 0, + PX_SCENE_PRUNER_DYNAMIC = 1, + PX_SCENE_COMPOUND_PRUNER = 0xffffffff + }; + + /** + \brief Base class for the scene-query system. + + Methods defined here are common to both the traditional PxScene API and the PxSceneQuerySystem API. + + @see PxScene PxSceneQuerySystem + */ + class PxSceneQuerySystemBase + { + protected: + PxSceneQuerySystemBase() {} + virtual ~PxSceneQuerySystemBase() {} + + public: + + /** @name Scene Query + */ + //@{ + + /** + \brief Sets the rebuild rate of the dynamic tree pruning structures. + + \param[in] dynamicTreeRebuildRateHint Rebuild rate of the dynamic tree pruning structures. + + @see PxSceneQueryDesc.dynamicTreeRebuildRateHint getDynamicTreeRebuildRateHint() forceRebuildDynamicTree() + */ + virtual void setDynamicTreeRebuildRateHint(PxU32 dynamicTreeRebuildRateHint) = 0; + + /** + \brief Retrieves the rebuild rate of the dynamic tree pruning structures. + + \return The rebuild rate of the dynamic tree pruning structures. + + @see PxSceneQueryDesc.dynamicTreeRebuildRateHint setDynamicTreeRebuildRateHint() forceRebuildDynamicTree() + */ + virtual PxU32 getDynamicTreeRebuildRateHint() const = 0; + + /** + \brief Forces dynamic trees to be immediately rebuilt. + + \param[in] prunerIndex Index of pruner containing the dynamic tree to rebuild + + \note PxScene will call this function with the PX_SCENE_PRUNER_STATIC or PX_SCENE_PRUNER_DYNAMIC value. + + @see PxSceneQueryDesc.dynamicTreeRebuildRateHint setDynamicTreeRebuildRateHint() getDynamicTreeRebuildRateHint() + */ + virtual void forceRebuildDynamicTree(PxU32 prunerIndex) = 0; + + /** + \brief Sets scene query update mode + + \param[in] updateMode Scene query update mode. + + @see PxSceneQueryUpdateMode::Enum + */ + virtual void setUpdateMode(PxSceneQueryUpdateMode::Enum updateMode) = 0; + + /** + \brief Gets scene query update mode + + \return Current scene query update mode. + + @see PxSceneQueryUpdateMode::Enum + */ + virtual PxSceneQueryUpdateMode::Enum getUpdateMode() const = 0; + + /** + \brief Retrieves the system's internal scene query timestamp, increased each time a change to the + static scene query structure is performed. + + \return scene query static timestamp + */ + virtual PxU32 getStaticTimestamp() const = 0; + + /** + \brief Flushes any changes to the scene query representation. + + This method updates the state of the scene query representation to match changes in the scene state. + + By default, these changes are buffered until the next query is submitted. Calling this function will not change + the results from scene queries, but can be used to ensure that a query will not perform update work in the course of + its execution. + + A thread performing updates will hold a write lock on the query structure, and thus stall other querying threads. In multithread + scenarios it can be useful to explicitly schedule the period where this lock may be held for a significant period, so that + subsequent queries issued from multiple threads will not block. + */ + virtual void flushUpdates() = 0; + + /** + \brief Performs a raycast against objects in the scene, returns results in a PxRaycastBuffer object + or via a custom user callback implementation inheriting from PxRaycastCallback. + + \note Touching hits are not ordered. + \note Shooting a ray from within an object leads to different results depending on the shape type. Please check the details in user guide article SceneQuery. User can ignore such objects by employing one of the provided filter mechanisms. + + \param[in] origin Origin of the ray. + \param[in] unitDir Normalized direction of the ray. + \param[in] distance Length of the ray. Has to be in the [0, inf) range. + \param[out] hitCall Raycast hit buffer or callback object used to report raycast hits. + \param[in] hitFlags Specifies which properties per hit should be computed and returned via the hit callback. + \param[in] filterData Filtering data passed to the filter shader. + \param[in] filterCall Custom filtering logic (optional). Only used if the corresponding #PxQueryFlag flags are set. If NULL, all hits are assumed to be blocking. + \param[in] cache Cached hit shape (optional). Ray is tested against cached shape first. If no hit is found the ray gets queried against the scene. + Note: Filtering is not executed for a cached shape if supplied; instead, if a hit is found, it is assumed to be a blocking hit. + Note: Using past touching hits as cache will produce incorrect behavior since the cached hit will always be treated as blocking. + \param[in] queryFlags Optional flags controlling the query. + + \return True if any touching or blocking hits were found or any hit was found in case PxQueryFlag::eANY_HIT was specified. + + @see PxRaycastCallback PxRaycastBuffer PxQueryFilterData PxQueryFilterCallback PxQueryCache PxRaycastHit PxQueryFlag PxQueryFlag::eANY_HIT PxGeometryQueryFlag + */ + virtual bool raycast(const PxVec3& origin, const PxVec3& unitDir, const PxReal distance, + PxRaycastCallback& hitCall, PxHitFlags hitFlags = PxHitFlag::eDEFAULT, + const PxQueryFilterData& filterData = PxQueryFilterData(), PxQueryFilterCallback* filterCall = NULL, + const PxQueryCache* cache = NULL, PxGeometryQueryFlags queryFlags = PxGeometryQueryFlag::eDEFAULT) const = 0; + + /** + \brief Performs a sweep test against objects in the scene, returns results in a PxSweepBuffer object + or via a custom user callback implementation inheriting from PxSweepCallback. + + \note Touching hits are not ordered. + \note If a shape from the scene is already overlapping with the query shape in its starting position, + the hit is returned unless eASSUME_NO_INITIAL_OVERLAP was specified. + + \param[in] geometry Geometry of object to sweep (supported types are: box, sphere, capsule, convex). + \param[in] pose Pose of the sweep object. + \param[in] unitDir Normalized direction of the sweep. + \param[in] distance Sweep distance. Needs to be in [0, inf) range and >0 if eASSUME_NO_INITIAL_OVERLAP was specified. Will be clamped to PX_MAX_SWEEP_DISTANCE. + \param[out] hitCall Sweep hit buffer or callback object used to report sweep hits. + \param[in] hitFlags Specifies which properties per hit should be computed and returned via the hit callback. + \param[in] filterData Filtering data and simple logic. + \param[in] filterCall Custom filtering logic (optional). Only used if the corresponding #PxQueryFlag flags are set. If NULL, all hits are assumed to be blocking. + \param[in] cache Cached hit shape (optional). Sweep is performed against cached shape first. If no hit is found the sweep gets queried against the scene. + Note: Filtering is not executed for a cached shape if supplied; instead, if a hit is found, it is assumed to be a blocking hit. + Note: Using past touching hits as cache will produce incorrect behavior since the cached hit will always be treated as blocking. + \param[in] inflation This parameter creates a skin around the swept geometry which increases its extents for sweeping. The sweep will register a hit as soon as the skin touches a shape, and will return the corresponding distance and normal. + Note: ePRECISE_SWEEP doesn't support inflation. Therefore the sweep will be performed with zero inflation. + \param[in] queryFlags Optional flags controlling the query. + + \return True if any touching or blocking hits were found or any hit was found in case PxQueryFlag::eANY_HIT was specified. + + @see PxSweepCallback PxSweepBuffer PxQueryFilterData PxQueryFilterCallback PxSweepHit PxQueryCache PxGeometryQueryFlag + */ + virtual bool sweep( const PxGeometry& geometry, const PxTransform& pose, const PxVec3& unitDir, const PxReal distance, + PxSweepCallback& hitCall, PxHitFlags hitFlags = PxHitFlag::eDEFAULT, + const PxQueryFilterData& filterData = PxQueryFilterData(), PxQueryFilterCallback* filterCall = NULL, + const PxQueryCache* cache = NULL, const PxReal inflation = 0.0f, PxGeometryQueryFlags queryFlags = PxGeometryQueryFlag::eDEFAULT) const = 0; + + /** + \brief Performs an overlap test of a given geometry against objects in the scene, returns results in a PxOverlapBuffer object + or via a custom user callback implementation inheriting from PxOverlapCallback. + + \note Filtering: returning eBLOCK from user filter for overlap queries will cause a warning (see #PxQueryHitType). + + \param[in] geometry Geometry of object to check for overlap (supported types are: box, sphere, capsule, convex). + \param[in] pose Pose of the object. + \param[out] hitCall Overlap hit buffer or callback object used to report overlap hits. + \param[in] filterData Filtering data and simple logic. See #PxQueryFilterData #PxQueryFilterCallback + \param[in] filterCall Custom filtering logic (optional). Only used if the corresponding #PxQueryFlag flags are set. If NULL, all hits are assumed to overlap. + \param[in] cache Cached hit shape (optional). Overlap is performed against cached shape first. If no hit is found the overlap gets queried against the scene. + \param[in] queryFlags Optional flags controlling the query. + Note: Filtering is not executed for a cached shape if supplied; instead, if a hit is found, it is assumed to be a blocking hit. + Note: Using past touching hits as cache will produce incorrect behavior since the cached hit will always be treated as blocking. + + \return True if any touching or blocking hits were found or any hit was found in case PxQueryFlag::eANY_HIT was specified. + + \note eBLOCK should not be returned from user filters for overlap(). Doing so will result in undefined behavior, and a warning will be issued. + \note If the PxQueryFlag::eNO_BLOCK flag is set, the eBLOCK will instead be automatically converted to an eTOUCH and the warning suppressed. + + @see PxOverlapCallback PxOverlapBuffer PxHitFlags PxQueryFilterData PxQueryFilterCallback PxGeometryQueryFlag + */ + virtual bool overlap(const PxGeometry& geometry, const PxTransform& pose, PxOverlapCallback& hitCall, + const PxQueryFilterData& filterData = PxQueryFilterData(), PxQueryFilterCallback* filterCall = NULL, + const PxQueryCache* cache = NULL, PxGeometryQueryFlags queryFlags = PxGeometryQueryFlag::eDEFAULT) const = 0; + //@} + }; + + /** + \brief Traditional SQ system for PxScene. + + Methods defined here are only available through the traditional PxScene API. + Thus PxSceneSQSystem effectively captures the scene-query related part of the PxScene API. + + @see PxScene PxSceneQuerySystemBase + */ + class PxSceneSQSystem : public PxSceneQuerySystemBase + { + protected: + PxSceneSQSystem() {} + virtual ~PxSceneSQSystem() {} + + public: + + /** @name Scene Query + */ + //@{ + + /** + \brief Sets scene query update mode + + \param[in] updateMode Scene query update mode. + + @see PxSceneQueryUpdateMode::Enum + */ + PX_FORCE_INLINE void setSceneQueryUpdateMode(PxSceneQueryUpdateMode::Enum updateMode) { setUpdateMode(updateMode); } + + /** + \brief Gets scene query update mode + + \return Current scene query update mode. + + @see PxSceneQueryUpdateMode::Enum + */ + PX_FORCE_INLINE PxSceneQueryUpdateMode::Enum getSceneQueryUpdateMode() const { return getUpdateMode(); } + + /** + \brief Retrieves the scene's internal scene query timestamp, increased each time a change to the + static scene query structure is performed. + + \return scene query static timestamp + */ + PX_FORCE_INLINE PxU32 getSceneQueryStaticTimestamp() const { return getStaticTimestamp(); } + + /** + \brief Flushes any changes to the scene query representation. + + @see flushUpdates + */ + PX_FORCE_INLINE void flushQueryUpdates() { flushUpdates(); } + + /** + \brief Forces dynamic trees to be immediately rebuilt. + + \param[in] rebuildStaticStructure True to rebuild the dynamic tree containing static objects + \param[in] rebuildDynamicStructure True to rebuild the dynamic tree containing dynamic objects + + @see PxSceneQueryDesc.dynamicTreeRebuildRateHint setDynamicTreeRebuildRateHint() getDynamicTreeRebuildRateHint() + */ + PX_FORCE_INLINE void forceDynamicTreeRebuild(bool rebuildStaticStructure, bool rebuildDynamicStructure) + { + if(rebuildStaticStructure) + forceRebuildDynamicTree(PX_SCENE_PRUNER_STATIC); + if(rebuildDynamicStructure) + forceRebuildDynamicTree(PX_SCENE_PRUNER_DYNAMIC); + } + + /** + \brief Return the value of PxSceneQueryDesc::staticStructure that was set when creating the scene with PxPhysics::createScene + + @see PxSceneQueryDesc::staticStructure, PxPhysics::createScene + */ + virtual PxPruningStructureType::Enum getStaticStructure() const = 0; + + /** + \brief Return the value of PxSceneQueryDesc::dynamicStructure that was set when creating the scene with PxPhysics::createScene + + @see PxSceneQueryDesc::dynamicStructure, PxPhysics::createScene + */ + virtual PxPruningStructureType::Enum getDynamicStructure() const = 0; + + /** + \brief Executes scene queries update tasks. + + This function will refit dirty shapes within the pruner and will execute a task to build a new AABB tree, which is + build on a different thread. The new AABB tree is built based on the dynamic tree rebuild hint rate. Once + the new tree is ready it will be commited in next fetchQueries call, which must be called after. + + This function is equivalent to the following PxSceneQuerySystem calls: + Synchronous calls: + - PxSceneQuerySystemBase::flushUpdates() + - handle0 = PxSceneQuerySystem::prepareSceneQueryBuildStep(PX_SCENE_PRUNER_STATIC) + - handle1 = PxSceneQuerySystem::prepareSceneQueryBuildStep(PX_SCENE_PRUNER_DYNAMIC) + Asynchronous calls: + - PxSceneQuerySystem::sceneQueryBuildStep(handle0); + - PxSceneQuerySystem::sceneQueryBuildStep(handle1); + + This function is part of the PxSceneSQSystem interface because it uses the PxScene task system under the hood. But + it calls PxSceneQuerySystem functions, which are independent from this system and could be called in a similar + fashion by a separate, possibly user-defined task manager. + + \note If PxSceneQueryUpdateMode::eBUILD_DISABLED_COMMIT_DISABLED is used, it is required to update the scene queries + using this function. + + \param[in] completionTask if non-NULL, this task will have its refcount incremented in sceneQueryUpdate(), then + decremented when the scene is ready to have fetchQueries called. So the task will not run until the + application also calls removeReference(). + \param[in] controlSimulation if true, the scene controls its PxTaskManager simulation state. Leave + true unless the application is calling the PxTaskManager start/stopSimulation() methods itself. + + @see PxSceneQueryUpdateMode::eBUILD_DISABLED_COMMIT_DISABLED + */ + virtual void sceneQueriesUpdate(PxBaseTask* completionTask = NULL, bool controlSimulation = true) = 0; + + /** + \brief This checks to see if the scene queries update has completed. + + This does not cause the data available for reading to be updated with the results of the scene queries update, it is simply a status check. + The bool will allow it to either return immediately or block waiting for the condition to be met so that it can return true + + \param[in] block When set to true will block until the condition is met. + \return True if the results are available. + + @see sceneQueriesUpdate() fetchResults() + */ + virtual bool checkQueries(bool block = false) = 0; + + /** + This method must be called after sceneQueriesUpdate. It will wait for the scene queries update to finish. If the user makes an illegal scene queries update call, + the SDK will issue an error message. + + If a new AABB tree build finished, then during fetchQueries the current tree within the pruning structure is swapped with the new tree. + + \param[in] block When set to true will block until the condition is met, which is tree built task must finish running. + */ + virtual bool fetchQueries(bool block = false) = 0; + //@} + }; + + typedef PxU32 PxSQCompoundHandle; + typedef PxU32 PxSQPrunerHandle; + typedef void* PxSQBuildStepHandle; + + /** + \brief Scene-queries external sub-system for PxScene-based objects. + + The default PxScene has hardcoded support for 2 regular pruners + 1 compound pruner, but these interfaces + should work with multiple pruners. + + Regular shapes are traditional PhysX shapes that belong to an actor. That actor can be a compound, i.e. it has + more than one shape. *All of these go to the regular pruners*. This is important because it might be misleading: + by default all shapes go to one of the two regular pruners, even shapes that belong to compound actors. + + For compound actors, adding all the actor's shapes individually to the SQ system can be costly, since all the + corresponding bounds will always move together and remain close together - that can put a lot of stress on the + code that updates the SQ spatial structures. In these cases it can be more efficient to add the compound's bounds + (i.e. the actor's bounds) to the system, as the first level of a bounds hierarchy. The scene queries would then + be performed against the actor's bounds first, and only visit the shapes' bounds second. This is only useful + for actors that have more than one shape, i.e. compound actors. Such actors added to the SQ system are thus + called "SQ compounds". These objects are managed by the "compound pruner", which is only used when an explicit + SQ compound is added to the SQ system via the addSQCompound call. So in the end one has to distinguish between: + + - a "compound shape", which is added to regular pruners as its own individual entity. + - an "SQ compound shape", which is added to the compound pruner as a subpart of an SQ compound actor. + + A compound shape has an invalid compound ID, since it does not belong to an SQ compound. + An SQ compound shape has a valid compound ID, that identifies its SQ compound owner. + + @see PxScene PxSceneQuerySystemBase + */ + class PxSceneQuerySystem : public PxSceneQuerySystemBase + { + protected: + PxSceneQuerySystem() {} + virtual ~PxSceneQuerySystem() {} + public: + + /** + \brief Decrements the reference count of the object and releases it if the new reference count is zero. + */ + virtual void release() = 0; + + /** + \brief Acquires a counted reference to this object. + + This method increases the reference count of the object by 1. Decrement the reference count by calling release() + */ + virtual void acquireReference() = 0; + + /** + \brief Preallocates internal arrays to minimize the amount of reallocations. + + The system does not prevent more allocations than given numbers. It is legal to not call this function at all, + or to add more shapes to the system than the preallocated amounts. + + \param[in] prunerIndex Index of pruner to preallocate (PX_SCENE_PRUNER_STATIC, PX_SCENE_PRUNER_DYNAMIC or PX_SCENE_COMPOUND_PRUNER when called from PxScene). + \param[in] nbShapes Expected number of (regular) shapes + */ + virtual void preallocate(PxU32 prunerIndex, PxU32 nbShapes) = 0; + + /** + \brief Frees internal memory that may not be in-use anymore. + + This is an entry point for reclaiming transient memory allocated at some point by the SQ system, + but which wasn't been immediately freed for performance reason. Calling this function might free + some memory, but it might also produce a new set of allocations in the next frame. + */ + virtual void flushMemory() = 0; + + /** + \brief Adds a shape to the SQ system. + + The same function is used to add either a regular shape, or a SQ compound shape. + + \param[in] actor The shape's actor owner + \param[in] shape The shape itself + \param[in] bounds Shape bounds, in world-space for regular shapes, in local-space for SQ compound shapes. + \param[in] transform Shape transform, in world-space for regular shapes, in local-space for SQ compound shapes. + \param[in] compoundHandle Handle of SQ compound owner, or NULL for regular shapes. + \param[in] hasPruningStructure True if the shape is part of a pruning structure. The structure will be merged later, adding the objects will not invalidate the pruner. + + @see merge() PxPruningStructure + */ + virtual void addSQShape( const PxRigidActor& actor, const PxShape& shape, const PxBounds3& bounds, + const PxTransform& transform, const PxSQCompoundHandle* compoundHandle=NULL, bool hasPruningStructure=false) = 0; + + /** + \brief Removes a shape from the SQ system. + + The same function is used to remove either a regular shape, or a SQ compound shape. + + \param[in] actor The shape's actor owner + \param[in] shape The shape itself + */ + virtual void removeSQShape(const PxRigidActor& actor, const PxShape& shape) = 0; + + /** + \brief Updates a shape in the SQ system. + + The same function is used to update either a regular shape, or a SQ compound shape. + + The transforms are eager-evaluated, but the bounds are lazy-evaluated. This means that + the updated transform has to be passed to the update function, while the bounds are automatically + recomputed by the system whenever needed. + + \param[in] actor The shape's actor owner + \param[in] shape The shape itself + \param[in] transform New shape transform, in world-space for regular shapes, in local-space for SQ compound shapes. + */ + virtual void updateSQShape(const PxRigidActor& actor, const PxShape& shape, const PxTransform& transform) = 0; + + /** + \brief Adds a compound to the SQ system. + + \param[in] actor The compound actor + \param[in] shapes The compound actor's shapes + \param[in] bvh BVH structure containing the compound's shapes in local space + \param[in] transforms Shape transforms, in local-space + + \return SQ compound handle + + @see PxBVH PxCooking::createBVH + */ + virtual PxSQCompoundHandle addSQCompound(const PxRigidActor& actor, const PxShape** shapes, const PxBVH& bvh, const PxTransform* transforms) = 0; + + /** + \brief Removes a compound from the SQ system. + + \param[in] compoundHandle SQ compound handle (returned by addSQCompound) + */ + virtual void removeSQCompound(PxSQCompoundHandle compoundHandle) = 0; + + /** + \brief Updates a compound in the SQ system. + + The compound structures are immediately updated when the call occurs. + + \param[in] compoundHandle SQ compound handle (returned by addSQCompound) + \param[in] compoundTransform New actor/compound transform, in world-space + */ + virtual void updateSQCompound(PxSQCompoundHandle compoundHandle, const PxTransform& compoundTransform) = 0; + + /** + \brief Shift the data structures' origin by the specified vector. + + Please refer to the notes of the similar function in PxScene. + + \param[in] shift Translation vector to shift the origin by. + */ + virtual void shiftOrigin(const PxVec3& shift) = 0; + + /** + \brief Visualizes the system's internal data-structures, for debugging purposes. + + \param[in] prunerIndex Index of pruner to visualize (PX_SCENE_PRUNER_STATIC, PX_SCENE_PRUNER_DYNAMIC or PX_SCENE_COMPOUND_PRUNER when called from PxScene). + + \param[out] out Filled with render output data + + @see PxRenderOutput + */ + virtual void visualize(PxU32 prunerIndex, PxRenderOutput& out) const = 0; + + /** + \brief Merges a pruning structure with the SQ system's internal pruners. + + \param[in] pruningStructure The pruning structure to merge + + @see PxPruningStructure + */ + virtual void merge(const PxPruningStructure& pruningStructure) = 0; + + /** + \brief Shape to SQ-pruner-handle mapping function. + + This function finds and returns the SQ pruner handle associated with a given (actor/shape) couple + that was previously added to the system. This is needed for the sync function. + + \param[in] actor The shape's actor owner + \param[in] shape The shape itself + \param[out] prunerIndex Index of pruner the shape belongs to + + \return Associated SQ pruner handle. + */ + virtual PxSQPrunerHandle getHandle(const PxRigidActor& actor, const PxShape& shape, PxU32& prunerIndex) const = 0; + + /** + \brief Synchronizes the scene-query system with another system that references the same objects. + + This function is used when the scene-query objects also exist in another system that can also update them. For example the scene-query objects + (used for raycast, overlap or sweep queries) might be driven by equivalent objects in an external rigid-body simulation engine. In this case + the rigid-body simulation engine computes the new poses and transforms, and passes them to the scene-query system using this function. It is + more efficient than calling updateSQShape on each object individually, since updateSQShape would end up recomputing the bounds already available + in the rigid-body engine. + + \param[in] prunerIndex Index of pruner being synched (PX_SCENE_PRUNER_DYNAMIC for regular PhysX usage) + \param[in] handles Handles of updated objects + \param[in] indices Bounds & transforms indices of updated objects, i.e. object handles[i] has bounds[indices[i]] and transforms[indices[i]] + \param[in] bounds Array of bounds for all objects (not only updated bounds) + \param[in] transforms Array of transforms for all objects (not only updated transforms) + \param[in] count Number of updated objects + \param[in] ignoredIndices Optional bitmap of ignored indices, i.e. update is skipped if ignoredIndices[indices[i]] is set. + + @see PxBounds3 PxTransform32 PxBitMap + */ + virtual void sync(PxU32 prunerIndex, const PxSQPrunerHandle* handles, const PxU32* indices, const PxBounds3* bounds, const PxTransform32* transforms, PxU32 count, const PxBitMap& ignoredIndices) = 0; + + /** + \brief Finalizes updates made to the SQ system. + + This function should be called after updates have been made to the SQ system, to fully reflect the changes + inside the internal pruners. In particular it should be called: + - after calls to updateSQShape + - after calls to sync + + This function: + - recomputes bounds of manually updated shapes (i.e. either regular or SQ compound shapes modified by updateSQShape) + - updates dynamic pruners (refit operations) + - incrementally rebuilds AABB-trees + + The amount of work performed in this function depends on PxSceneQueryUpdateMode. + + @see PxSceneQueryUpdateMode updateSQShape() sync() + */ + virtual void finalizeUpdates() = 0; + + /** + \brief Prepares asynchronous build step. + + This is directly called (synchronously) by PxSceneSQSystem::sceneQueriesUpdate(). See the comments there. + + This function is called to let the system execute any necessary synchronous operation before the + asynchronous sceneQueryBuildStep() function is called. + + If there is any work to do for the specific pruner, the function returns a pruner-specific handle that + will be passed to the corresponding, asynchronous sceneQueryBuildStep function. + + \return A pruner-specific handle that will be sent to sceneQueryBuildStep if there is any work to do, i.e. to execute the corresponding sceneQueryBuildStep() call. + + \param[in] prunerIndex Index of pruner being built. (PX_SCENE_PRUNER_STATIC or PX_SCENE_PRUNER_DYNAMIC when called by PxScene). + + \return Null if there is no work to do, otherwise a pruner-specific handle. + + @see PxSceneSQSystem::sceneQueriesUpdate sceneQueryBuildStep + */ + virtual PxSQBuildStepHandle prepareSceneQueryBuildStep(PxU32 prunerIndex) = 0; + + /** + \brief Executes asynchronous build step. + + This is directly called (asynchronously) by PxSceneSQSystem::sceneQueriesUpdate(). See the comments there. + + This function incrementally builds the internal trees/pruners. It is called asynchronously, i.e. this can be + called from different threads for building multiple trees at the same time. + + \param[in] handle Pruner-specific handle previously returned by the prepareSceneQueryBuildStep function. + + @see PxSceneSQSystem::sceneQueriesUpdate prepareSceneQueryBuildStep + */ + virtual void sceneQueryBuildStep(PxSQBuildStepHandle handle) = 0; + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + + /** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxShape.h b/Source/ThirdParty/PhysX/PxShape.h index 812f603c1..48ecf297e 100644 --- a/Source/ThirdParty/PhysX/PxShape.h +++ b/Source/ThirdParty/PhysX/PxShape.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_PHYSICS_NX_SHAPE -#define PX_PHYSICS_NX_SHAPE +#ifndef PX_SHAPE_H +#define PX_SHAPE_H /** \addtogroup physics @{ */ @@ -49,11 +48,16 @@ class PxCapsuleGeometry; class PxPlaneGeometry; class PxConvexMeshGeometry; class PxTriangleMeshGeometry; +class PxTetrahedronMeshGeometry; class PxHeightFieldGeometry; +class PxParticleSystemGeometry; +class PxHairSystemGeometry; class PxRigidActor; struct PxFilterData; -struct PxRaycastHit; -struct PxSweepHit; +class PxBaseMaterial; +class PxMaterial; +class PxFEMSoftBodyMaterial; +class PxFEMClothMaterial; /** \brief Flags which affect the behavior of PxShapes. @@ -122,7 +126,6 @@ struct PxShapeFlag typedef PxFlags PxShapeFlags; PX_FLAGS_OPERATORS(PxShapeFlag::Enum,PxU8) - /** \brief Abstract class for collision shapes. @@ -139,10 +142,9 @@ the createShape() method of the PxPhysics class. @see PxPhysics.createShape() PxRigidActor.createShape() PxBoxGeometry PxSphereGeometry PxCapsuleGeometry PxPlaneGeometry PxConvexMeshGeometry PxTriangleMeshGeometry PxHeightFieldGeometry */ -class PxShape : public PxBase +class PxShape : public PxRefCounted { public: - /** \brief Decrements the reference count of a shape and releases it if the new reference count is zero. @@ -153,33 +155,7 @@ public: @see PxRigidActor::createShape() PxPhysics::createShape() PxRigidActor::attachShape() PxRigidActor::detachShape() */ - virtual void release() = 0; - - /** - \brief Returns the reference count of the shape. - - At creation, the reference count of the shape is 1. Every actor referencing this shape increments the - count by 1. When the reference count reaches 0, and only then, the shape gets destroyed automatically. - - \return the current reference count. - */ - virtual PxU32 getReferenceCount() const = 0; - - /** - \brief Acquires a counted reference to a shape. - - This method increases the reference count of the shape by 1. Decrement the reference count by calling release() - */ - virtual void acquireReference() = 0; - - /** - \brief Get the geometry type of the shape. - - \return Type of shape geometry. - - @see PxGeometryType - */ - virtual PxGeometryType::Enum getGeometryType() const = 0; + virtual void release() = 0; /** \brief Adjust the geometry of the shape. @@ -192,19 +168,31 @@ public: @see PxGeometry PxGeometryType getGeometryType() */ - virtual void setGeometry(const PxGeometry& geometry) = 0; - + virtual void setGeometry(const PxGeometry& geometry) = 0; /** - \brief Retrieve the geometry from the shape in a PxGeometryHolder wrapper class. + \brief Retrieve a reference to the shape's geometry. + + \warning The returned reference has the same lifetime as the PxShape it comes from. + + \return Reference to internal PxGeometry object. - \return a PxGeometryHolder object containing the geometry; - @see PxGeometry PxGeometryType getGeometryType() setGeometry() */ + virtual const PxGeometry& getGeometry() const = 0; - virtual PxGeometryHolder getGeometry() const = 0; + /** + \brief Get the geometry type of the shape. + \return Type of shape geometry. + + @see PxGeometryType + @deprecated + */ + PX_DEPRECATED PX_FORCE_INLINE PxGeometryType::Enum getGeometryType() const + { + return getGeometry().getType(); + } /** \brief Fetch the geometry of the shape. @@ -216,8 +204,12 @@ public: \return True on success else false @see PxGeometry PxGeometryType getGeometryType() + @deprecated */ - virtual bool getBoxGeometry(PxBoxGeometry& geometry) const = 0; + PX_DEPRECATED PX_FORCE_INLINE bool getBoxGeometry(PxBoxGeometry& geometry) const + { + return getGeometryT(PxGeometryType::eBOX, geometry); + } /** \brief Fetch the geometry of the shape. @@ -229,8 +221,12 @@ public: \return True on success else false @see PxGeometry PxGeometryType getGeometryType() + @deprecated */ - virtual bool getSphereGeometry(PxSphereGeometry& geometry) const = 0; + PX_DEPRECATED PX_FORCE_INLINE bool getSphereGeometry(PxSphereGeometry& geometry) const + { + return getGeometryT(PxGeometryType::eSPHERE, geometry); + } /** \brief Fetch the geometry of the shape. @@ -242,8 +238,12 @@ public: \return True on success else false @see PxGeometry PxGeometryType getGeometryType() + @deprecated */ - virtual bool getCapsuleGeometry(PxCapsuleGeometry& geometry) const = 0; + PX_DEPRECATED PX_FORCE_INLINE bool getCapsuleGeometry(PxCapsuleGeometry& geometry) const + { + return getGeometryT(PxGeometryType::eCAPSULE, geometry); + } /** \brief Fetch the geometry of the shape. @@ -255,8 +255,12 @@ public: \return True on success else false @see PxGeometry PxGeometryType getGeometryType() + @deprecated */ - virtual bool getPlaneGeometry(PxPlaneGeometry& geometry) const = 0; + PX_DEPRECATED PX_FORCE_INLINE bool getPlaneGeometry(PxPlaneGeometry& geometry) const + { + return getGeometryT(PxGeometryType::ePLANE, geometry); + } /** \brief Fetch the geometry of the shape. @@ -268,8 +272,12 @@ public: \return True on success else false @see PxGeometry PxGeometryType getGeometryType() + @deprecated */ - virtual bool getConvexMeshGeometry(PxConvexMeshGeometry& geometry) const = 0; + PX_DEPRECATED PX_FORCE_INLINE bool getConvexMeshGeometry(PxConvexMeshGeometry& geometry) const + { + return getGeometryT(PxGeometryType::eCONVEXMESH, geometry); + } /** \brief Fetch the geometry of the shape. @@ -281,9 +289,12 @@ public: \return True on success else false @see PxGeometry PxGeometryType getGeometryType() + @deprecated */ - virtual bool getTriangleMeshGeometry(PxTriangleMeshGeometry& geometry) const = 0; - + PX_DEPRECATED PX_FORCE_INLINE bool getTriangleMeshGeometry(PxTriangleMeshGeometry& geometry) const + { + return getGeometryT(PxGeometryType::eTRIANGLEMESH, geometry); + } /** \brief Fetch the geometry of the shape. @@ -295,8 +306,63 @@ public: \return True on success else false @see PxGeometry PxGeometryType getGeometryType() + @deprecated */ - virtual bool getHeightFieldGeometry(PxHeightFieldGeometry& geometry) const = 0; + PX_DEPRECATED PX_FORCE_INLINE bool getTetrahedronMeshGeometry(PxTetrahedronMeshGeometry& geometry) const + { + return getGeometryT(PxGeometryType::eTETRAHEDRONMESH, geometry); + } + + /** + \brief Fetch the geometry of the shape. + + \note If the type of geometry to extract does not match the geometry type of the shape + then the method will return false and the passed in geometry descriptor is not modified. + + \param[in] geometry The descriptor to save the shape's geometry data to. + \return True on success else false + + @see PxGeometry PxGeometryType getGeometryType() + @deprecated + */ + PX_DEPRECATED PX_FORCE_INLINE bool getParticleSystemGeometry(PxParticleSystemGeometry& geometry) const + { + return getGeometryT(PxGeometryType::ePARTICLESYSTEM, geometry); + } + + /** + \brief Fetch the geometry of the shape. + + \note If the type of geometry to extract does not match the geometry type of the shape + then the method will return false and the passed in geometry descriptor is not modified. + + \param[in] geometry The descriptor to save the shape's geometry data to. + \return True on success else false + + @see PxGeometry PxGeometryType getGeometryType() + @deprecated + */ + PX_DEPRECATED PX_FORCE_INLINE bool getHeightFieldGeometry(PxHeightFieldGeometry& geometry) const + { + return getGeometryT(PxGeometryType::eHEIGHTFIELD, geometry); + } + + /** + \brief Fetch the geometry of the shape. + + \note If the type of geometry to extract does not match the geometry type of the shape + then the method will return false and the passed in geometry descriptor is not modified. + + \param[in] geometry The descriptor to save the shape's geometry data to. + \return True on success else false + + @see PxGeometry PxGeometryType getGeometryType() + @deprecated + */ + PX_DEPRECATED PX_FORCE_INLINE bool getCustomGeometry(PxCustomGeometry& geometry) const + { + return getGeometryT(PxGeometryType::eCUSTOM, geometry); + } /** \brief Retrieves the actor which this shape is associated with. @@ -305,8 +371,7 @@ public: @see PxRigidStatic, PxRigidDynamic, PxArticulationLink */ - virtual PxRigidActor* getActor() const = 0; - + virtual PxRigidActor* getActor() const = 0; /************************************************************************************************/ @@ -332,7 +397,7 @@ public: @see getLocalPose() */ - virtual void setLocalPose(const PxTransform& pose) = 0; + virtual void setLocalPose(const PxTransform& pose) = 0; /** \brief Retrieves the pose of the shape in actor space, i.e. relative to the actor they are owned by. @@ -343,7 +408,7 @@ public: @see setLocalPose() */ - virtual PxTransform getLocalPose() const = 0; + virtual PxTransform getLocalPose() const = 0; //@} /************************************************************************************************/ @@ -362,14 +427,14 @@ public: @see getSimulationFilterData() */ - virtual void setSimulationFilterData(const PxFilterData& data) = 0; + virtual void setSimulationFilterData(const PxFilterData& data) = 0; /** \brief Retrieves the shape's collision filter data. @see setSimulationFilterData() */ - virtual PxFilterData getSimulationFilterData() const = 0; + virtual PxFilterData getSimulationFilterData() const = 0; /** \brief Sets the user definable query filter data. @@ -378,20 +443,20 @@ public: @see getQueryFilterData() */ - virtual void setQueryFilterData(const PxFilterData& data) = 0; + virtual void setQueryFilterData(const PxFilterData& data) = 0; /** \brief Retrieves the shape's Query filter data. @see setQueryFilterData() */ - virtual PxFilterData getQueryFilterData() const = 0; + virtual PxFilterData getQueryFilterData() const = 0; //@} /************************************************************************************************/ /** - \brief Assigns material(s) to the shape. + \brief Assigns material(s) to the shape. Will remove existing materials from the shape. Sleeping: Does NOT wake the associated actor up automatically. @@ -400,7 +465,32 @@ public: @see PxPhysics.createMaterial() getMaterials() */ - virtual void setMaterials(PxMaterial*const* materials, PxU16 materialCount) = 0; + virtual void setMaterials(PxMaterial*const* materials, PxU16 materialCount) = 0; + + /** + \brief Assigns FEM soft body material(s) to the shape. Will remove existing materials from the shape. + + Sleeping: Does NOT wake the associated actor up automatically. + + \param[in] materials List of material pointers to assign to the shape. See #PxFEMSoftBodyMaterial + \param[in] materialCount The number of materials provided. + + @see PxPhysics.createFEMSoftBodyMaterial() getSoftBodyMaterials() + */ + virtual void setSoftBodyMaterials(PxFEMSoftBodyMaterial*const* materials, PxU16 materialCount) = 0; + + /** + \brief Assigns FEM cloth material(s) to the shape. Will remove existing materials from the shape. + \warning Feature under development, only for internal usage. + + Sleeping: Does NOT wake the associated actor up automatically. + + \param[in] materials List of material pointers to assign to the shape. See #PxFEMClothMaterial + \param[in] materialCount The number of materials provided. + + @see PxPhysics.createFEMClothMaterial() getClothMaterials() + */ + virtual void setClothMaterials(PxFEMClothMaterial*const* materials, PxU16 materialCount) = 0; /** \brief Returns the number of materials assigned to the shape. @@ -411,14 +501,14 @@ public: @see PxMaterial getMaterials() */ - virtual PxU16 getNbMaterials() const = 0; + virtual PxU16 getNbMaterials() const = 0; /** \brief Retrieve all the material pointers associated with the shape. You can retrieve the number of material pointers by calling #getNbMaterials() - Note: Removing materials with #PxMaterial::release() will invalidate the pointer of the released material. + Note: The returned data may contain invalid pointers if you release materials using #PxMaterial::release(). \param[out] userBuffer The buffer to store the material pointers. \param[in] bufferSize Size of provided user buffer. @@ -427,8 +517,41 @@ public: @see PxMaterial getNbMaterials() PxMaterial::release() */ - virtual PxU32 getMaterials(PxMaterial** userBuffer, PxU32 bufferSize, PxU32 startIndex=0) const = 0; - + virtual PxU32 getMaterials(PxMaterial** userBuffer, PxU32 bufferSize, PxU32 startIndex=0) const = 0; + + /** + \brief Retrieve all the FEM soft body material pointers associated with the shape. + + You can retrieve the number of material pointers by calling #getNbMaterials() + + Note: The returned data may contain invalid pointers if you release materials using #PxMaterial::release(). + + \param[out] userBuffer The buffer to store the material pointers. + \param[in] bufferSize Size of provided user buffer. + \param[in] startIndex Index of first material pointer to be retrieved + \return Number of material pointers written to the buffer. + + @see PxFEMSoftBodyMaterial getNbMaterials() PxMaterial::release() + */ + virtual PxU32 getSoftBodyMaterials(PxFEMSoftBodyMaterial** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + + /** + \brief Retrieve all the FEM cloth material pointers associated with the shape. + \warning Feature under development, only for internal usage. + + You can retrieve the number of material pointers by calling #getNbMaterials() + + Note: The returned data may contain invalid pointers if you release materials using #PxMaterial::release(). + + \param[out] userBuffer The buffer to store the material pointers. + \param[in] bufferSize Size of provided user buffer. + \param[in] startIndex Index of first material pointer to be retrieved + \return Number of material pointers written to the buffer. + + @see PxFEMClothMaterial getNbMaterials() PxMaterial::release() + */ + virtual PxU32 getClothMaterials(PxFEMClothMaterial** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const = 0; + /** \brief Retrieve material from given triangle index. @@ -436,8 +559,8 @@ public: returned to users by various SDK functions such as raycasts. This function is only useful for triangle meshes or heightfields, which have per-triangle - materials. For other shapes the function returns the single material associated with the - shape, regardless of the index. + materials. For other shapes or SDF triangle meshes, the function returns the single material + associated with the shape, regardless of the index. \param[in] faceIndex The internal triangle index whose material you want to retrieve. \return Material from input triangle @@ -447,7 +570,7 @@ public: @see PxMaterial getNbMaterials() PxMaterial::release() */ - virtual PxMaterial* getMaterialFromInternalFaceIndex(PxU32 faceIndex) const = 0; + virtual PxBaseMaterial* getMaterialFromInternalFaceIndex(PxU32 faceIndex) const = 0; /** \brief Sets the contact offset. @@ -465,7 +588,7 @@ public: @see getContactOffset PxTolerancesScale setRestOffset */ - virtual void setContactOffset(PxReal contactOffset) = 0; + virtual void setContactOffset(PxReal contactOffset) = 0; /** \brief Retrieves the contact offset. @@ -474,7 +597,7 @@ public: @see setContactOffset() */ - virtual PxReal getContactOffset() const = 0; + virtual PxReal getContactOffset() const = 0; /** \brief Sets the rest offset. @@ -491,7 +614,7 @@ public: @see getRestOffset setContactOffset */ - virtual void setRestOffset(PxReal restOffset) = 0; + virtual void setRestOffset(PxReal restOffset) = 0; /** \brief Retrieves the rest offset. @@ -500,8 +623,31 @@ public: @see setRestOffset() */ - virtual PxReal getRestOffset() const = 0; + virtual PxReal getRestOffset() const = 0; + /** + \brief Sets the density used to interact with fluids. + + To be physically accurate, the density of a rigid body should be computed as its mass divided by its volume. To + simplify tuning the interaction of fluid and rigid bodies, the density for fluid can differ from the real density. This + allows to create floating bodies, even if they are supposed to sink with their mass and volume. + + Default: 800.0f + + \param[in] densityForFluid Range: (0, PX_MAX_F32) + + @see getDensityForFluid + */ + virtual void setDensityForFluid(PxReal densityForFluid) = 0; + + /** + \brief Retrieves the density used to interact with fluids. + + \return The density of the body when interacting with fluid. + + @see setDensityForFluid() + */ + virtual PxReal getDensityForFluid() const = 0; /** \brief Sets torsional patch radius. @@ -511,10 +657,11 @@ public: so, if the shapes are separated or penetration is zero, no torsional friction will be applied. It is used to approximate rotational friction introduced by the compression of contacting surfaces. - \param[in] radius Range: (0, PX_MAX_F32) + Default: 0.0 + \param[in] radius Range: (0, PX_MAX_F32) */ - virtual void setTorsionalPatchRadius(PxReal radius) = 0; + virtual void setTorsionalPatchRadius(PxReal radius) = 0; /** \brief Gets torsional patch radius. @@ -526,7 +673,7 @@ public: \return The torsional patch radius of the shape. */ - virtual PxReal getTorsionalPatchRadius() const = 0; + virtual PxReal getTorsionalPatchRadius() const = 0; /** \brief Sets minimum torsional patch radius. @@ -536,10 +683,11 @@ public: If the radius is > 0, some torsional friction will be applied regardless of the value of torsionalPatchRadius or the amount of penetration. - \param[in] radius Range: (0, PX_MAX_F32) + Default: 0.0 + \param[in] radius Range: (0, PX_MAX_F32) */ - virtual void setMinTorsionalPatchRadius(PxReal radius) = 0; + virtual void setMinTorsionalPatchRadius(PxReal radius) = 0; /** \brief Gets minimum torsional patch radius. @@ -551,8 +699,7 @@ public: \return The minimum torsional patch radius of the shape. */ - virtual PxReal getMinTorsionalPatchRadius() const = 0; - + virtual PxReal getMinTorsionalPatchRadius() const = 0; /************************************************************************************************/ @@ -568,14 +715,14 @@ public: @see PxShapeFlag getFlags() */ - virtual void setFlag(PxShapeFlag::Enum flag, bool value) = 0; + virtual void setFlag(PxShapeFlag::Enum flag, bool value) = 0; /** \brief Sets shape flags @see PxShapeFlag getFlags() */ - virtual void setFlags(PxShapeFlags inFlags) = 0; + virtual void setFlags(PxShapeFlags inFlags) = 0; /** \brief Retrieves shape flags. @@ -584,14 +731,14 @@ public: @see PxShapeFlag setFlag() */ - virtual PxShapeFlags getFlags() const = 0; + virtual PxShapeFlags getFlags() const = 0; /** \brief Returns true if the shape is exclusive to an actor. @see PxPhysics::createShape() */ - virtual bool isExclusive() const = 0; + virtual bool isExclusive() const = 0; /** \brief Sets a name string for the object that can be retrieved with #getName(). @@ -605,8 +752,7 @@ public: @see getName() */ - virtual void setName(const char* name) = 0; - + virtual void setName(const char* name) = 0; /** \brief retrieves the name string set with setName(). @@ -614,21 +760,30 @@ public: @see setName() */ - virtual const char* getName() const = 0; + virtual const char* getName() const = 0; - virtual const char* getConcreteTypeName() const { return "PxShape"; } + virtual const char* getConcreteTypeName() const { return "PxShape"; } /************************************************************************************************/ - void* userData; //!< user can assign this to whatever, usually to create a 1:1 relationship with a user object. + void* userData; //!< user can assign this to whatever, usually to create a 1:1 relationship with a user object. protected: - PX_INLINE PxShape(PxBaseFlags baseFlags) : PxBase(baseFlags) {} - PX_INLINE PxShape(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags), userData(NULL) {} - virtual ~PxShape() {} - virtual bool isKindOf(const char* name) const { return !::strcmp("PxShape", name) || PxBase::isKindOf(name); } + PX_INLINE PxShape(PxBaseFlags baseFlags) : PxRefCounted(baseFlags) {} + PX_INLINE PxShape(PxType concreteType, PxBaseFlags baseFlags) : PxRefCounted(concreteType, baseFlags), userData(NULL) {} + virtual ~PxShape() {} + virtual bool isKindOf(const char* name) const { return !::strcmp("PxShape", name) || PxRefCounted::isKindOf(name); } + template + PX_FORCE_INLINE bool getGeometryT(PxGeometryType::Enum type, T& geom) const + { + if(getGeometryType() != type) + return false; + + geom = static_cast(getGeometry()); + return true; + } }; #if !PX_DOXYGEN diff --git a/Source/ThirdParty/PhysX/PxSimulationEventCallback.h b/Source/ThirdParty/PhysX/PxSimulationEventCallback.h index e242d45b1..5c4cb1813 100644 --- a/Source/ThirdParty/PhysX/PxSimulationEventCallback.h +++ b/Source/ThirdParty/PhysX/PxSimulationEventCallback.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_SIMULATION_EVENT_CALLBACK -#define PX_SIMULATION_EVENT_CALLBACK +#ifndef PX_SIMULATION_EVENT_CALLBACK_H +#define PX_SIMULATION_EVENT_CALLBACK_H /** \addtogroup physics @{ */ @@ -137,7 +135,7 @@ public: If CCD with multiple passes is enabled, then a fast moving object might bounce on and off the same object multiple times. Also, different shapes of the same actor might gain and lose contact with an other -object over multiple passes. This marker allows to seperate the extra data items for each collision case, as well as +object over multiple passes. This marker allows to separate the extra data items for each collision case, as well as distinguish the shape pair reports of different CCD passes. Example: @@ -360,7 +358,7 @@ struct PxContactPairHeader @see PxActor */ - PxRigidActor* actors[2]; + PxActor* actors[2]; /** \brief Stream containing extra data as requested in the PxPairFlag flags of the simulation filter. @@ -748,9 +746,9 @@ struct PxTriggerPair PX_INLINE PxTriggerPair() {} PxShape* triggerShape; //!< The shape that has been marked as a trigger. - PxRigidActor* triggerActor; //!< The actor to which triggerShape is attached + PxActor* triggerActor; //!< The actor to which triggerShape is attached PxShape* otherShape; //!< The shape causing the trigger event. \deprecated (see #PxSimulationEventCallback::onTrigger()) If collision between trigger shapes is enabled, then this member might point to a trigger shape as well. - PxRigidActor* otherActor; //!< The actor to which otherShape is attached + PxActor* otherActor; //!< The actor to which otherShape is attached PxPairFlag::Enum status; //!< Type of trigger event (eNOTIFY_TOUCH_FOUND or eNOTIFY_TOUCH_LOST). eNOTIFY_TOUCH_PERSISTS events are not supported. PxTriggerPairFlags flags; //!< Additional information on the pair (see #PxTriggerPairFlag) }; @@ -779,7 +777,7 @@ struct PxConstraintInfo With the exception of onAdvance(), the events get sent during the call to either #PxScene::fetchResults() or #PxScene::flushSimulation() with sendPendingReports=true. onAdvance() gets called while the simulation -is running (that is between PxScene::simulate(), onAdvance() and PxScene::fetchResults()). +is running (that is between PxScene::simulate() or PxScene::advance() and PxScene::fetchResults()). \note SDK state should not be modified from within the callbacks. In particular objects should not be created or destroyed. If state modification is needed then the changes should be stored to a buffer @@ -885,10 +883,6 @@ class PxSimulationEventCallback \note The provided buffers are valid and can be read until the next call to #PxScene::simulate() or #PxScene::collide(). - \note Buffered user changes to the rigid body pose will not yet be reflected in the provided data. More important, - the provided data might contain bodies that have been deleted while the simulation was running. It is the user's - responsibility to detect and avoid dereferencing such bodies. - \note This callback gets triggered while the simulation is running. If the provided rigid body references are used to read properties of the object, then the callback has to guarantee no other thread is writing to the same body at the same time. diff --git a/Source/ThirdParty/PhysX/PxSimulationStatistics.h b/Source/ThirdParty/PhysX/PxSimulationStatistics.h index 57635e3de..2102ecd90 100644 --- a/Source/ThirdParty/PhysX/PxSimulationStatistics.h +++ b/Source/ThirdParty/PhysX/PxSimulationStatistics.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_SIMULATION_STATISTICS -#define PX_SIMULATION_STATISTICS +#ifndef PX_SIMULATION_STATISTICS_H +#define PX_SIMULATION_STATISTICS_H /** \addtogroup physics @{ */ @@ -274,6 +272,106 @@ public: */ PxU32 nbPartitions; + /** + \brief GPU device memory in bytes allocated for particle state accessible through API + */ + PxU64 gpuMemParticles; + + /** + \brief GPU device memory in bytes allocated for FEM-based soft body state accessible through API + */ + PxU64 gpuMemSoftBodies; + + /** + \brief GPU device memory in bytes allocated for FEM-based cloth state accessible through API + */ + PxU64 gpuMemFEMCloths; + + /** + \brief GPU device memory in bytes allocated for hairsystem state accessible through API + */ + PxU64 gpuMemHairSystems; + + /** + \brief GPU device memory in bytes allocated for internal heap allocation + */ + PxU64 gpuMemHeap; + + /** + \brief GPU device heap memory used for broad phase in bytes + */ + PxU64 gpuMemHeapBroadPhase; + + /** + \brief GPU device heap memory used for narrow phase in bytes + */ + PxU64 gpuMemHeapNarrowPhase; + + /** + \brief GPU device heap memory used for solver in bytes + */ + PxU64 gpuMemHeapSolver; + + /** + \brief GPU device heap memory used for articulations in bytes + */ + PxU64 gpuMemHeapArticulation; + + /** + \brief GPU device heap memory used for simulation pipeline in bytes + */ + PxU64 gpuMemHeapSimulation; + + /** + \brief GPU device heap memory used for articulations in the simulation pipeline in bytes + */ + PxU64 gpuMemHeapSimulationArticulation; + + /** + \brief GPU device heap memory used for particles in the simulation pipeline in bytes + */ + PxU64 gpuMemHeapSimulationParticles; + + /** + \brief GPU device heap memory used for soft bodies in the simulation pipeline in bytes + */ + PxU64 gpuMemHeapSimulationSoftBody; + + /** + \brief GPU device heap memory used for FEM-cloth in the simulation pipeline in bytes + */ + PxU64 gpuMemHeapSimulationFEMCloth; + + /** + \brief GPU device heap memory used for hairsystem in the simulation pipeline in bytes + */ + PxU64 gpuMemHeapSimulationHairSystem; + + /** + \brief GPU device heap memory used for shared buffers in the particles pipeline in bytes + */ + PxU64 gpuMemHeapParticles; + + /** + \brief GPU device heap memory used for shared buffers in the FEM-based soft body pipeline in bytes + */ + PxU64 gpuMemHeapSoftBodies; + + /** + \brief GPU device heap memory used for shared buffers in the FEM-based cloth pipeline in bytes + */ + PxU64 gpuMemHeapFEMCloths; + + /** + \brief GPU device heap memory used for shared buffers in the hairsystem pipeline in bytes + */ + PxU64 gpuMemHeapHairSystems; + + /** + \brief GPU device heap memory not covered by other stats in bytes + */ + PxU64 gpuMemHeapOther; + PxSimulationStatistics() : nbActiveConstraints (0), nbActiveDynamicBodies (0), @@ -294,7 +392,27 @@ public: nbLostPairs (0), nbNewTouches (0), nbLostTouches (0), - nbPartitions (0) + nbPartitions (0), + gpuMemParticles (0), + gpuMemSoftBodies (0), + gpuMemFEMCloths (0), + gpuMemHairSystems (0), + gpuMemHeap (0), + gpuMemHeapBroadPhase (0), + gpuMemHeapNarrowPhase (0), + gpuMemHeapSolver (0), + gpuMemHeapArticulation (0), + gpuMemHeapSimulation (0), + gpuMemHeapSimulationArticulation (0), + gpuMemHeapSimulationParticles (0), + gpuMemHeapSimulationSoftBody (0), + gpuMemHeapSimulationFEMCloth (0), + gpuMemHeapSimulationHairSystem (0), + gpuMemHeapParticles (0), + gpuMemHeapSoftBodies (0), + gpuMemHeapFEMCloths (0), + gpuMemHeapHairSystems (0), + gpuMemHeapOther (0) { nbBroadPhaseAdds = 0; nbBroadPhaseRemoves = 0; diff --git a/Source/ThirdParty/PhysX/PxSoftBody.h b/Source/ThirdParty/PhysX/PxSoftBody.h new file mode 100644 index 000000000..c69ffd119 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxSoftBody.h @@ -0,0 +1,742 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_SOFT_BODY_H +#define PX_SOFT_BODY_H +/** \addtogroup physics +@{ */ + +#include "PxFEMParameter.h" +#include "PxActor.h" +#include "PxConeLimitedConstraint.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +#if PX_VC +#pragma warning(push) +#pragma warning(disable : 4435) +#endif + + class PxCudaContextManager; + class PxBuffer; + class PxTetrahedronMesh; + class PxSoftBodyAuxData; + class PxFEMCloth; + class PxParticleBuffer; + + /** + \brief The maximum tetrahedron index supported in the model. + */ + #define PX_MAX_TETID 0x000fffff + + /** + \brief Identifies input and output buffers for PxSoftBody. + + @see PxSoftBodyData::readData(), PxSoftBodyData::writeData(), PxBuffer. + */ + struct PxSoftBodyData + { + enum Enum + { + eNONE = 0, + + ePOSITION_INVMASS = 1 << 0, //!< Flag to request access to the collision mesh's positions; read only @see PxSoftBody::writeData + eSIM_POSITION_INVMASS = 1 << 2, //!< Flag to request access to the simulation mesh's positions and inverse masses + eSIM_VELOCITY = 1 << 3, //!< Flag to request access to the simulation mesh's velocities and inverse masses + eSIM_KINEMATIC_TARGET = 1 << 4, //!< Flag to request access to the simulation mesh's kinematic target position + + eALL = ePOSITION_INVMASS | eSIM_POSITION_INVMASS | eSIM_VELOCITY | eSIM_KINEMATIC_TARGET + }; + }; + + typedef PxFlags PxSoftBodyDataFlags; + + /** + \brief Flags to enable or disable special modes of a SoftBody + */ + struct PxSoftBodyFlag + { + enum Enum + { + eDISABLE_SELF_COLLISION = 1 << 0, //!< Determines if self collision will be detected and resolved + eCOMPUTE_STRESS_TENSOR = 1 << 1, //!< Enables computation of a Cauchy stress tensor for every tetrahedron in the simulation mesh. The tensors can be accessed through the softbody direct API + eENABLE_CCD = 1 << 2, //!< Enables support for continuous collision detection + eDISPLAY_SIM_MESH = 1 << 3, //!< Enable debug rendering to display the simulation mesh + eKINEMATIC = 1 << 4, //!< Enables support for kinematic motion of the collision and simulation mesh. + ePARTIALLY_KINEMATIC = 1 << 5 //!< Enables partially kinematic motion of the collisios and simulation mesh. + }; + }; + + typedef PxFlags PxSoftBodyFlags; + + /** + \brief Represents a FEM softbody including everything to calculate its definition like geometry and material properties + */ + class PxSoftBody : public PxActor + { + public: + + virtual ~PxSoftBody() {} + + /** + \brief Set a single softbody flag + + \param[in] flag The flag to set or clear + \param[in] val The new state of the flag + */ + virtual void setSoftBodyFlag(PxSoftBodyFlag::Enum flag, bool val) = 0; + + /** + \brief Set the softbody flags + + \param[in] flags The new softbody flags + */ + virtual void setSoftBodyFlags(PxSoftBodyFlags flags) = 0; + + /** + \brief Get the softbody flags + + \return The softbody flags + */ + virtual PxSoftBodyFlags getSoftBodyFlag() const = 0; + + /** + \brief Set parameter for FEM internal solve + + \param[in] parameters The FEM parameters + */ + virtual void setParameter(const PxFEMParameters parameters) = 0; + + /** + \brief Get parameter for FEM internal solve + + \return The FEM parameters + */ + virtual PxFEMParameters getParameter() const = 0; + + /** + \brief Issues a read command to the PxSoftBody. + + Read operations are scheduled and then flushed in PxScene::simulate(). + Read operations are known to be finished when PxBuffer::map() returns. + + PxSoftBodyData::ePOSITION_INVMASS, PxSoftBodyData::eSIM_POSITION_INVMASS and PxSoftBodyData::eSIM_VELOCITY can be read from the PxSoftBody. + + The softbody class offers internal cpu buffers that can be used to hold the data. The cpu buffers are accessible through getPositionInvMassCPU(), + getSimPositionInvMassCPU() and getSimVelocityInvMassCPU(). + + \param[in] flags Specifies which PxSoftBody data to read from. + \param[in] buffer Specifies buffer to which data is written to. + \param[in] flush If set to true the command gets executed immediately, otherwise it will get executed the next time copy commands are flushed. + + @see writeData(), PxBuffer, PxSoftBodyData + */ + virtual void readData(PxSoftBodyData::Enum flags, PxBuffer& buffer, bool flush = false) = 0; + + /** + \brief Issues a read command to the PxSoftBody. + + Read operations are scheduled and then flushed in PxScene::simulate(). + Read operations are known to be finished when PxBuffer::map() returns. + + PxSoftBodyData::ePOSITION_INVMASS, PxSoftBodyData::eSIM_POSITION_INVMASS and PxSoftBodyData::eSIM_VELOCITY can be read from the PxSoftBody. + + The data to read from the GPU is written to the corresponding cpu buffer that a softbody provides. Those cpu buffers are accessible through + getPositionInvMassCPU(), getSimPositionInvMassCPU() or getSimVelocityInvMassCPU(). + + \param[in] flags Specifies which PxSoftBody data to read from. + \param[in] flush If set to true the command gets executed immediately, otherwise it will get executed the next time copy commands are flushed. + + @see writeData(), PxSoftBodyData + */ + virtual void readData(PxSoftBodyData::Enum flags, bool flush = false) = 0; + + /** + \brief Issues a write command to the PxSoftBody. + + Write operations are scheduled and then flushed in PxScene::simulate(). + Write operations are known to be finished when PxScene::fetchResult() returns. + + PxSoftBodyData::eSIM_POSITION_INVMASS and PxSoftBodyData::eSIM_VELOCITY can be written to the PxSoftBody. PxSoftBodyData::ePOSITION_INVMASS is read only, + because the collision-mesh vertices are driven by the simulation-mesh vertices, which can be written to with PxSoftBodyData::eSIM_POSITION_INVMASS. + + The softbody class offers internal cpu buffers that can be used to hold the data. The cpu buffers are accessible through getPositionInvMassCPU(), + getSimPositionInvMassCPU() and getSimVelocityInvMassCPU(). Consider to use the PxSoftBodyExt::commit() extension method if all buffers should get written. + + \param[in] flags Specifies which PxSoftBody data to write to. + \param[in] buffer Specifies buffer from which data is read. + \param[in] flush If set to true the command gets executed immediately, otherwise it will get executed the next time copy commands are flushed. + + @see readData(), PxBuffer, PxSoftBodyData, PxSoftBodyExt::commit + */ + virtual void writeData(PxSoftBodyData::Enum flags, PxBuffer& buffer, bool flush = false) = 0; + + /** + \brief Issues a write command to the PxSoftBody. + + Write operations are scheduled and then flushed in PxScene::simulate(). + Write operations are known to be finished when PxScene::fetchResult() returns. + + PxSoftBodyData::eSIM_POSITION_INVMASS and PxSoftBodyData::eSIM_VELOCITY can be written to the PxSoftBody. PxSoftBodyData::ePOSITION_INVMASS is read only, + because the collision-mesh vertices are driven by the simulation-mesh vertices, which can be written to with PxSoftBodyData::eSIM_POSITION_INVMASS. + + The data to write to the GPU is taken from the corresponding cpu buffer that a softbody provides. Those cpu buffers are accessible through + getPositionInvMassCPU(), getSimPositionInvMassCPU() or getSimVelocityInvMassCPU(). + + \param[in] flags Specifies which PxSoftBody data to write to. + \param[in] flush If set to true the command gets executed immediately, otherwise it will get executed the next time copy commands are flushed. + + @see readData(), PxSoftBodyData + */ + virtual void writeData(PxSoftBodyData::Enum flags, bool flush = false) = 0; + + /** + \brief Return the cuda context manager + + \return The cuda context manager + */ + virtual PxCudaContextManager* getCudaContextManager() const = 0; + + /** + \brief Sets the wake counter for the soft body. + + The wake counter value determines the minimum amount of time until the soft body can be put to sleep. Please note + that a soft body will not be put to sleep if any vertex velocity is above the specified threshold + or if other awake objects are touching it. + + \note Passing in a positive value will wake the soft body up automatically. + + Default: 0.4 (which corresponds to 20 frames for a time step of 0.02) + + \param[in] wakeCounterValue Wake counter value. Range: [0, PX_MAX_F32) + + @see isSleeping() getWakeCounter() + */ + virtual void setWakeCounter(PxReal wakeCounterValue) = 0; + + /** + \brief Returns the wake counter of the soft body. + + \return The wake counter of the soft body. + + @see isSleeping() setWakeCounter() + */ + virtual PxReal getWakeCounter() const = 0; + + /** + \brief Returns true if this soft body is sleeping. + + When an actor does not move for a period of time, it is no longer simulated in order to save time. This state + is called sleeping. However, because the object automatically wakes up when it is either touched by an awake object, + or a sleep-affecting property is changed by the user, the entire sleep mechanism should be transparent to the user. + + A soft body can only go to sleep if all vertices are ready for sleeping. A soft body is guaranteed to be awake + if at least one of the following holds: + + \li The wake counter is positive (@see setWakeCounter()). + \li The velocity of any vertex is above the sleep threshold. + + If a soft body is sleeping, the following state is guaranteed: + + \li The wake counter is zero. + \li The linear velocity of all vertices is zero. + + When a soft body gets inserted into a scene, it will be considered asleep if all the points above hold, else it will + be treated as awake. + + \note It is invalid to use this method if the soft body has not been added to a scene already. + + \return True if the soft body is sleeping. + + @see isSleeping() + */ + virtual bool isSleeping() const = 0; + + /** + \brief Sets the solver iteration counts for the body. + + The solver iteration count determines how accurately deformation and contacts are resolved. + If you are having trouble with softbodies that are not as stiff as they should be, then + setting a higher position iteration count may improve the behavior. + + If intersecting bodies are being depenetrated too violently, increase the number of velocity + iterations. + + Default: 4 position iterations, 1 velocity iteration + + \param[in] minPositionIters Minimal number of position iterations the solver should perform for this body. Range: [1,255] + \param[in] minVelocityIters Minimal number of velocity iterations the solver should perform for this body. Range: [1,255] + + @see getSolverIterationCounts() + */ + virtual void setSolverIterationCounts(PxU32 minPositionIters, PxU32 minVelocityIters = 1) = 0; + + /** + \brief Retrieves the solver iteration counts. + + @see setSolverIterationCounts() + */ + virtual void getSolverIterationCounts(PxU32& minPositionIters, PxU32& minVelocityIters) const = 0; + + + /** + \brief Retrieves the shape pointer belonging to the actor. + + \return Pointer to the collision mesh's shape + @see PxShape getNbShapes() PxShape::release() + */ + virtual PxShape* getShape() = 0; + + + /** + \brief Retrieve the collision mesh pointer. + + Allows to access the geometry of the tetrahedral mesh used to perform collision detection + + \return Pointer to the collision mesh + */ + virtual PxTetrahedronMesh* getCollisionMesh() = 0; + + /** + \brief Retrieves the simulation mesh pointer. + + Allows to access the geometry of the tetrahedral mesh used to compute the object's deformation + + \return Pointer to the simulation mesh + */ + virtual PxTetrahedronMesh* getSimulationMesh() = 0; + + /** + \brief Retrieves the simulation state pointer. + + Allows to access the additional data of the simulation mesh (inverse mass, rest state etc.). + The geometry part of the data is stored in the simulation mesh. + + \return Pointer to the simulation state + */ + virtual PxSoftBodyAuxData* getSoftBodyAuxData() = 0; + + + /** + \brief Attaches a shape + + Attaches the shape to use for collision detection + + \param[in] shape The shape to use for collisions + + \return Returns true if the operation was successful + */ + virtual bool attachShape(PxShape& shape) = 0; + + /** + \brief Attaches a simulation mesh + + Attaches the simulation mesh (geometry) and a state containing inverse mass, rest pose + etc. required to compute the softbody deformation. + + \param[in] simulationMesh The tetrahedral mesh used to compute the softbody's deformation + \param[in] softBodyAuxData A state that contain a mapping from simulation to collision mesh, volume information etc. + + \return Returns true if the operation was successful + */ + virtual bool attachSimulationMesh(PxTetrahedronMesh& simulationMesh, PxSoftBodyAuxData& softBodyAuxData) = 0; + + /** + \brief Detaches the shape + + Detaches the shape used for collision detection. + + @see void detachSimulationMesh() + */ + virtual void detachShape() = 0; + + /** + \brief Detaches the simulation mesh + + Detaches the simulation mesh and simulation state used to compute the softbody deformation. + + @see void detachShape() + */ + virtual void detachSimulationMesh() = 0; + + /** + \brief Releases the softbody + + Releases the softbody and frees its resources. + */ + virtual void release() = 0; + + /** + \brief Creates a collision filter between a particle and a tetrahedron in the soft body's collision mesh. + + \param[in] particlesystem The particle system used for the collision filter + \param[in] buffer The PxParticleBuffer to which the particle belongs to. + \param[in] particleId The particle whose collisions with the tetrahedron in the soft body are filtered. + \param[in] tetId The tetradedron in the soft body that is filtered. If tetId is PX_MAX_TETID, this particle will filter against all tetrahedra in this soft body + */ + virtual void addParticleFilter(PxPBDParticleSystem* particlesystem, const PxParticleBuffer* buffer, PxU32 particleId, PxU32 tetId) = 0; + + /** + \brief Removes a collision filter between a particle and a tetrahedron in the soft body's collision mesh. + + \param[in] particlesystem The particle system used for the collision filter + \param[in] buffer The PxParticleBuffer to which the particle belongs to. + \param[in] particleId The particle whose collisions with the tetrahedron in the soft body are filtered. + \param[in] tetId The tetrahedron in the soft body is filtered. + */ + virtual void removeParticleFilter(PxPBDParticleSystem* particlesystem, const PxParticleBuffer* buffer, PxU32 particleId, PxU32 tetId) = 0; + + /** + \brief Creates an attachment between a particle and a soft body. + Be aware that destroying the particle system before destroying the attachment is illegal and may cause a crash. + The soft body keeps track of these attachments but the particle system does not. + + \param[in] particlesystem The particle system used for the attachment + \param[in] buffer The PxParticleBuffer to which the particle belongs to. + \param[in] particleId The particle that is attached to a tetrahedron in the soft body's collision mesh. + \param[in] tetId The tetrahedron in the soft body's collision mesh to attach the particle to. + \param[in] barycentric The barycentric coordinates of the particle attachment position with respect to the tetrahedron specified with tetId. + \return Returns a handle that identifies the attachment created. This handle can be used to release the attachment later + */ + virtual PxU32 addParticleAttachment(PxPBDParticleSystem* particlesystem, const PxParticleBuffer* buffer, PxU32 particleId, PxU32 tetId, const PxVec4& barycentric) = 0; + + + /** + \brief Removes an attachment between a particle and a soft body. + Be aware that destroying the particle system before destroying the attachment is illegal and may cause a crash. + The soft body keeps track of these attachments but the particle system does not. + + \param[in] particlesystem The particle system used for the attachment + \param[in] handle Index that identifies the attachment. This handle gets returned by the addParticleAttachment when the attachment is created + */ + virtual void removeParticleAttachment(PxPBDParticleSystem* particlesystem, PxU32 handle) = 0; + + /** + \brief Creates a collision filter between a vertex in a soft body and a rigid body. + + \param[in] actor The rigid body actor used for the collision filter + \param[in] vertId The index of a vertex in the softbody's collision mesh whose collisions with the rigid body are filtered. + */ + virtual void addRigidFilter(PxRigidActor* actor, PxU32 vertId) = 0; + + /** + \brief Removes a collision filter between a vertex in a soft body and a rigid body. + + \param[in] actor The rigid body actor used for the collision filter + \param[in] vertId The index of a vertex in the softbody's collision mesh whose collisions with the rigid body are filtered. + */ + virtual void removeRigidFilter(PxRigidActor* actor, PxU32 vertId) = 0; + + /** + \brief Creates a rigid attachment between a soft body and a rigid body. + Be aware that destroying the rigid body before destroying the attachment is illegal and may cause a crash. + The soft body keeps track of these attachments but the rigid body does not. + + This method attaches a vertex on the soft body collision mesh to the rigid body. + + \param[in] actor The rigid body actor used for the attachment + \param[in] vertId The index of a vertex in the softbody's collision mesh that gets attached to the rigid body. + \param[in] actorSpacePose The location of the attachment point expressed in the rigid body's coordinate system. + \param[in] constraint The user defined cone distance limit constraint to limit the movement between a vertex in the soft body and rigid body. + \return Returns a handle that identifies the attachment created. This handle can be used to relese the attachment later + */ + virtual PxU32 addRigidAttachment(PxRigidActor* actor, PxU32 vertId, const PxVec3& actorSpacePose, PxConeLimitedConstraint* constraint = NULL) = 0; + + /** + \brief Releases a rigid attachment between a soft body and a rigid body. + Be aware that destroying the rigid body before destroying the attachment is illegal and may cause a crash. + The soft body keeps track of these attachments but the rigid body does not. + + This method removes a previously-created attachment between a vertex of the soft body collision mesh and the rigid body. + + \param[in] actor The rigid body actor used for the attachment + \param[in] handle Index that identifies the attachment. This handle gets returned by the addRigidAttachment when the attachment is created + */ + virtual void removeRigidAttachment(PxRigidActor* actor, PxU32 handle) = 0; + + /** + \brief Creates collision filter between a tetrahedron in a soft body and a rigid body. + + \param[in] actor The rigid body actor used for collision filter + \param[in] tetIdx The index of a tetrahedron in the softbody's collision mesh whose collisions with the rigid body is filtered. + */ + virtual void addTetRigidFilter(PxRigidActor* actor, PxU32 tetIdx) = 0; + + /** + \brief Removes collision filter between a tetrahedron in a soft body and a rigid body. + + \param[in] actor The rigid body actor used for collision filter + \param[in] tetIdx The index of a tetrahedron in the softbody's collision mesh whose collisions with the rigid body is filtered. + */ + virtual void removeTetRigidFilter(PxRigidActor* actor, PxU32 tetIdx) = 0; + + /** + \brief Creates a rigid attachment between a soft body and a rigid body. + Be aware that destroying the rigid body before destroying the attachment is illegal and may cause a crash. + The soft body keeps track of these attachments but the rigid body does not. + + This method attaches a point inside a tetrahedron of the collision to the rigid body. + + \param[in] actor The rigid body actor used for the attachment + \param[in] tetIdx The index of a tetrahedron in the softbody's collision mesh that contains the point to be attached to the rigid body + \param[in] barycentric The barycentric coordinates of the attachment point inside the tetrahedron specified by tetIdx + \param[in] actorSpacePose The location of the attachment point expressed in the rigid body's coordinate system. + \param[in] constraint The user defined cone distance limit constraint to limit the movement between a tet and rigid body. + \return Returns a handle that identifies the attachment created. This handle can be used to release the attachment later + */ + virtual PxU32 addTetRigidAttachment(PxRigidActor* actor, PxU32 tetIdx, const PxVec4& barycentric, const PxVec3& actorSpacePose, PxConeLimitedConstraint* constraint = NULL) = 0; + + /** + \brief Creates collision filter between a tetrahedron in a soft body and a tetrahedron in another soft body. + + \param[in] otherSoftBody The other soft body actor used for collision filter + \param[in] otherTetIdx The index of the tetrahedron in the other softbody's collision mesh to be filtered. + \param[in] tetIdx1 The index of the tetrahedron in the softbody's collision mesh to be filtered. + */ + virtual void addSoftBodyFilter(PxSoftBody* otherSoftBody, PxU32 otherTetIdx, PxU32 tetIdx1) = 0; + + /** + \brief Removes collision filter between a tetrahedron in a soft body and a tetrahedron in other soft body. + + \param[in] otherSoftBody The other soft body actor used for collision filter + \param[in] otherTetIdx The index of the other tetrahedron in the other softbody's collision mesh whose collision with the tetrahedron with the soft body is filtered. + \param[in] tetIdx1 The index of the tetrahedron in the softbody's collision mesh whose collision with the other tetrahedron with the other soft body is filtered. + */ + virtual void removeSoftBodyFilter(PxSoftBody* otherSoftBody, PxU32 otherTetIdx, PxU32 tetIdx1) = 0; + + /** + \brief Creates collision filters between a tetrahedron in a soft body with another soft body. + + \param[in] otherSoftBody The other soft body actor used for collision filter + \param[in] otherTetIndices The indices of the tetrahedron in the other softbody's collision mesh to be filtered. + \param[in] tetIndices The indices of the tetrahedron of the softbody's collision mesh to be filtered. + \param[in] tetIndicesSize The size of tetIndices. + */ + virtual void addSoftBodyFilters(PxSoftBody* otherSoftBody, PxU32* otherTetIndices, PxU32* tetIndices, PxU32 tetIndicesSize) = 0; + + /** + \brief Removes collision filters between a tetrahedron in a soft body with another soft body. + + \param[in] otherSoftBody The other soft body actor used for collision filter + \param[in] otherTetIndices The indices of the tetrahedron in the other softbody's collision mesh to be filtered. + \param[in] tetIndices The indices of the tetrahedron of the softbody's collision mesh to be filtered. + \param[in] tetIndicesSize The size of tetIndices. + */ + virtual void removeSoftBodyFilters(PxSoftBody* otherSoftBody, PxU32* otherTetIndices, PxU32* tetIndices, PxU32 tetIndicesSize) = 0; + + /** + \brief Creates an attachment between two soft bodies. + + This method attaches a point inside a tetrahedron of the collision mesh to a point in another soft body's tetrahedron collision mesh. + + \param[in] softbody0 The soft body actor used for the attachment + \param[in] tetIdx0 The index of a tetrahedron in the other soft body that contains the point to be attached to the soft body + \param[in] tetBarycentric0 The barycentric coordinates of the attachment point inside the tetrahedron specified by tetIdx0 + \param[in] tetIdx1 The index of a tetrahedron in the softbody's collision mesh that contains the point to be attached to the softbody0 + \param[in] tetBarycentric1 The barycentric coordinates of the attachment point inside the tetrahedron specified by tetIdx1 + \param[in] constraint The user defined cone distance limit constraint to limit the movement between tets. + \return Returns a handle that identifies the attachment created. This handle can be used to release the attachment later + */ + virtual PxU32 addSoftBodyAttachment(PxSoftBody* softbody0, PxU32 tetIdx0, const PxVec4& tetBarycentric0, PxU32 tetIdx1, const PxVec4& tetBarycentric1, + PxConeLimitedConstraint* constraint = NULL) = 0; + + /** + \brief Releases an attachment between a soft body and the other soft body. + Be aware that destroying the soft body before destroying the attachment is illegal and may cause a crash. + + This method removes a previously-created attachment between a point inside a tetrahedron of the collision mesh to a point in another soft body's tetrahedron collision mesh. + + \param[in] softbody0 The softbody actor used for the attachment. + \param[in] handle Index that identifies the attachment. This handle gets returned by the addSoftBodyAttachment when the attachment is created. + */ + virtual void removeSoftBodyAttachment(PxSoftBody* softbody0, PxU32 handle) = 0; + + /** + \brief Creates collision filter between a tetrahedron in a soft body and a triangle in a cloth. + \warning Feature under development, only for internal usage. + + \param[in] cloth The cloth actor used for collision filter + \param[in] triIdx The index of the triangle in the cloth mesh to be filtered. + \param[in] tetIdx The index of the tetrahedron in the softbody's collision mesh to be filtered. + */ + virtual void addClothFilter(PxFEMCloth* cloth, PxU32 triIdx, PxU32 tetIdx) = 0; + + /** + \brief Removes collision filter between a tetrahedron in a soft body and a triangle in a cloth. + \warning Feature under development, only for internal usage. + + \param[in] cloth The cloth actor used for collision filter + \param[in] triIdx The index of the triangle in the cloth mesh to be filtered. + \param[in] tetIdx The index of the tetrahedron in the softbody's collision mesh to be filtered. + */ + virtual void removeClothFilter(PxFEMCloth* cloth, PxU32 triIdx, PxU32 tetIdx) = 0; + + + /** + \brief Creates an attachment between a soft body and a cloth. + Be aware that destroying the rigid body before destroying the attachment is illegal and may cause a crash. + The soft body keeps track of these attachments but the cloth does not. + + This method attaches a point inside a tetrahedron of the collision mesh to a cloth. + + \warning Feature under development, only for internal usage. + + \param[in] cloth The cloth actor used for the attachment + \param[in] triIdx The index of a triangle in the cloth mesh that contains the point to be attached to the soft body + \param[in] triBarycentric The barycentric coordinates of the attachment point inside the triangle specified by triangleIdx + \param[in] tetIdx The index of a tetrahedron in the softbody's collision mesh that contains the point to be attached to the cloth + \param[in] tetBarycentric The barycentric coordinates of the attachment point inside the tetrahedron specified by tetIdx + \param[in] constraint The user defined cone distance limit constraint to limit the movement between a triangle in the fem cloth and a tet in the soft body. + \return Returns a handle that identifies the attachment created. This handle can be used to release the attachment later + */ + virtual PxU32 addClothAttachment(PxFEMCloth* cloth, PxU32 triIdx, const PxVec4& triBarycentric, PxU32 tetIdx, const PxVec4& tetBarycentric, + PxConeLimitedConstraint* constraint = NULL) = 0; + + /** + \brief Releases an attachment between a cloth and a soft body. + Be aware that destroying the cloth before destroying the attachment is illegal and may cause a crash. + The soft body keeps track of these attachments but the cloth does not. + + This method removes a previously-created attachment between a point inside a collision mesh tetrahedron and a point inside a cloth mesh. + + \warning Feature under development, only for internal usage. + + \param[in] cloth The cloth actor used for the attachment + \param[in] handle Index that identifies the attachment. This handle gets returned by the addClothAttachment when the attachment is created + */ + virtual void removeClothAttachment(PxFEMCloth* cloth, PxU32 handle) = 0; + + /** + \brief Access to the vertices of the simulation mesh on the host + + Each element uses 4 float values containing position and inverseMass per vertex [x, y, z, inverseMass] + The inverse mass must match the inverse mass in the simVelocityCPU buffer at the same index. A copy of this value + is stored in the simVelocityCPU buffer to allow for faster access on the GPU. If the inverse masses in those two buffers + don't match, the simulation may produce wrong results + + Allows to access the CPU buffer of the simulation mesh's vertices + + \return The buffer that contains the simulation mesh's vertex positions (x, y, z) and the inverse mass as 4th component + */ + virtual PxBuffer* getSimPositionInvMassCPU() = 0; + + /** + \brief Access to the vertices of the simulation mesh on the host + + Each element uses 4 float values containing position and inverseMass per vertex [x, y, z, inverseMass] + The inverse mass must match the inverse mass in the simVelocityCPU buffer at the same index. A copy of this value + is stored in the simVelocityCPU buffer to allow for faster access on the GPU. If the inverse masses in those two buffers + don't match, the simulation may produce wrong results + + Allows to access the CPU buffer of the simulation mesh's vertices + + \return The buffer that contains the simulation mesh's vertex positions (x, y, z) and the inverse mass as 4th component + */ + virtual PxBuffer* getKinematicTargetCPU() = 0; + /** + \brief Access to the velocities of the simulation mesh on the host + + Each element uses 4 float values containing velocity and inverseMass per vertex [x, y, z, inverseMass] + The inverse mass must match the inverse mass in the simPositionInvMassCPU buffer at the same index. A copy of this value + is stored in the simPositionInvMassCPU buffer to allow for faster access on the GPU. If the inverse masses in those two buffers + don't match, the simulation may produce wrong results + + Allows to access the CPU buffer of the simulation mesh's vertices + + \return The buffer that contains the simulation mesh's velocities (x, y, z) and the inverse mass as 4th component + */ + virtual PxBuffer* getSimVelocityInvMassCPU() = 0; + + /** + \brief Access to the vertices of the collision mesh on the host + + Each element uses 4 float values containing position and inverseMass per vertex [x, y, z, inverseMass] + The inverse mass on the collision mesh has no effect, it can be set to an arbitrary value. + + Allows to access the CPU buffer of the collision mesh's vertices + + \return The buffer that contains the collision mesh's vertex positions (x, y, z) and the inverse mass as 4th component + */ + virtual PxBuffer* getPositionInvMassCPU() = 0; + + /** + \brief Access to the rest vertices of the collision mesh on the host + + Each element uses 4 float values containing position and inverseMass per vertex [x, y, z, inverseMass] + The inverse mass on the collision mesh has no effect, it can be set to an arbitrary value. + + Allows to access the CPU buffer of the collision mesh's rest vertices + + \return The buffer that contains the collision mesh's rest vertex positions (x, y, z) and the inverse mass as 4th component + */ + virtual PxBuffer* getRestPositionInvMassCPU() = 0; + + /** + \brief Retrieves the axis aligned bounding box enclosing the soft body. + + \note It is not allowed to use this method while the simulation is running (except during PxScene::collide(), + in PxContactModifyCallback or in contact report callbacks). + + \param[in] inflation Scale factor for computed world bounds. Box extents are multiplied by this value. + + \return The soft body's bounding box. + + @see PxBounds3 + */ + virtual PxBounds3 getWorldBounds(float inflation = 1.01f) const = 0; + + /** + \brief Returns the GPU soft body index. + + \return The GPU index, or 0xFFFFFFFF if the soft body is not in a scene. + */ + virtual PxU32 getGpuSoftBodyIndex() = 0; + + virtual const char* getConcreteTypeName() const PX_OVERRIDE { return "PxSoftBody"; } + + + protected: + PX_INLINE PxSoftBody(PxType concreteType, PxBaseFlags baseFlags) : PxActor(concreteType, baseFlags) {} + PX_INLINE PxSoftBody(PxBaseFlags baseFlags) : PxActor(baseFlags) {} + virtual bool isKindOf(const char* name) const PX_OVERRIDE { return !::strcmp("PxSoftBody", name) || PxActor::isKindOf(name); } + }; + +#if PX_VC +#pragma warning(pop) +#endif + + +#if !PX_DOXYGEN +} // namespace physx +#endif + + /** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxSoftBodyFlag.h b/Source/ThirdParty/PhysX/PxSoftBodyFlag.h new file mode 100644 index 000000000..ce19e5d67 --- /dev/null +++ b/Source/ThirdParty/PhysX/PxSoftBodyFlag.h @@ -0,0 +1,67 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_SOFT_BODY_FLAG_H +#define PX_SOFT_BODY_FLAG_H + +#include "PxPhysXConfig.h" +#include "foundation/PxFlags.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief These flags determine what data is read or written to the gpu softbody. + + @see PxScene::copySoftBodyData, PxScene::applySoftBodyData + */ + class PxSoftBodyDataFlag + { + public: + enum Enum + { + eTET_INDICES = 0, //!< The collision mesh tetrahedron indices (quadruples of int32) + eTET_STRESS = 1, //!< The collision mesh cauchy stress tensors (float 3x3 matrices) + eTET_STRESSCOEFF = 2, //!< The collision mesh tetrahedron von Mises stress (float scalar) + eTET_REST_POSES = 3, //!< The collision mesh tetrahedron rest poses (float 3x3 matrices) + eTET_ROTATIONS = 4, //!< The collision mesh tetrahedron orientations (quaternions, quadruples of float) + eTET_POSITION_INV_MASS = 5, //!< The collision mesh vertex positions and their inverted mass in the 4th component (quadruples of float) + eSIM_TET_INDICES = 6, //!< The simulation mesh tetrahedron indices (quadruples of int32) + eSIM_VELOCITY_INV_MASS = 7, //!< The simulation mesh vertex velocities and their inverted mass in the 4th component (quadruples of float) + eSIM_POSITION_INV_MASS = 8, //!< The simulation mesh vertex positions and their inverted mass in the 4th component (quadruples of float) + eSIM_KINEMATIC_TARGET = 9 //!< The simulation mesh kinematic target positions + }; + }; + +#if !PX_DOXYGEN +} +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/PxSparseGridParams.h b/Source/ThirdParty/PhysX/PxSparseGridParams.h new file mode 100644 index 000000000..c836804ea --- /dev/null +++ b/Source/ThirdParty/PhysX/PxSparseGridParams.h @@ -0,0 +1,119 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_SPARSE_GRID_PARAMS_H +#define PX_SPARSE_GRID_PARAMS_H +/** \addtogroup physics +@{ */ + +#include "foundation/PxSimpleTypes.h" +#include "foundation/PxMath.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief Parameters to define the sparse grid settings like grid spacing, maximal number of subgrids etc. + */ + struct PxSparseGridParams + { + /** + \brief Default constructor. + */ + PX_INLINE PxSparseGridParams() + { + maxNumSubgrids = 512; + subgridSizeX = 32; + subgridSizeY = 32; + subgridSizeZ = 32; + gridSpacing = 0.2f; + haloSize = 1; + } + + /** + \brief Copy constructor. + */ + PX_CUDA_CALLABLE PX_INLINE PxSparseGridParams(const PxSparseGridParams& params) + { + maxNumSubgrids = params.maxNumSubgrids; + subgridSizeX = params.subgridSizeX; + subgridSizeY = params.subgridSizeY; + subgridSizeZ = params.subgridSizeZ; + gridSpacing = params.gridSpacing; + haloSize = params.haloSize; + } + + PX_CUDA_CALLABLE PX_INLINE PxU32 getNumCellsPerSubgrid() const + { + return subgridSizeX * subgridSizeY * subgridSizeZ; + } + + PX_CUDA_CALLABLE PX_INLINE PxReal getSqrt3dx() const + { + return PxSqrt(3.0f) * gridSpacing; + } + + + /** + \brief (re)sets the structure to the default. + */ + PX_INLINE void setToDefault() + { + *this = PxSparseGridParams(); + } + + /** + \brief Assignment operator + */ + PX_INLINE void operator = (const PxSparseGridParams& params) + { + maxNumSubgrids = params.maxNumSubgrids; + subgridSizeX = params.subgridSizeX; + subgridSizeY = params.subgridSizeY; + subgridSizeZ = params.subgridSizeZ; + gridSpacing = params.gridSpacing; + haloSize = params.haloSize; + } + + PxU32 maxNumSubgrids; //!< Maximum number of subgrids + PxReal gridSpacing; //!< Grid spacing for the grid + PxU16 subgridSizeX; //!< Subgrid resolution in x dimension (must be an even number) + PxU16 subgridSizeY; //!< Subgrid resolution in y dimension (must be an even number) + PxU16 subgridSizeZ; //!< Subgrid resolution in z dimension (must be an even number) + PxU16 haloSize; //!< Number of halo cell layers around every subgrid cell. Only 0 and 1 are valid values + }; + + +#if !PX_DOXYGEN +} // namespace physx +#endif + + /** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/PxVisualizationParameter.h b/Source/ThirdParty/PhysX/PxVisualizationParameter.h index c05724b27..175f3f048 100644 --- a/Source/ThirdParty/PhysX/PxVisualizationParameter.h +++ b/Source/ThirdParty/PhysX/PxVisualizationParameter.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_DEBUG_VISUALIZATION_PARAMETER -#define PX_PHYSICS_NX_DEBUG_VISUALIZATION_PARAMETER +#ifndef PX_VISUALIZATION_PARAMETER_H +#define PX_VISUALIZATION_PARAMETER_H #include "foundation/PxPreprocessor.h" @@ -92,7 +90,6 @@ struct PxVisualizationParameter */ eSCALE, - /** \brief Visualize the world axes. */ @@ -132,7 +129,6 @@ struct PxVisualizationParameter */ eBODY_ANG_VELOCITY, - /* Contact visualisations */ /** @@ -155,7 +151,6 @@ struct PxVisualizationParameter */ eCONTACT_FORCE, - /** \brief Visualize actor axes. @@ -163,7 +158,6 @@ struct PxVisualizationParameter */ eACTOR_AXES, - /** \brief Visualize bounds (AABBs in world space) */ @@ -212,11 +206,6 @@ struct PxVisualizationParameter */ eCOLLISION_DYNAMIC, - /** - \brief Visualizes pairwise state. - */ - eDEPRECATED_COLLISION_PAIRS, - /** \brief Joint local axes */ @@ -237,6 +226,16 @@ struct PxVisualizationParameter */ eMBP_REGIONS, + /** + \brief Renders the simulation mesh instead of the collision mesh (only available for tetmeshes) + */ + eSIMULATION_MESH, + + /** + \brief Renders the SDF of a mesh instead of the collision mesh (only available for triangle meshes with SDFs) + */ + eSDF, + /** \brief This is not a parameter, it just records the current number of parameters (as maximum(PxVisualizationParameter)+1) for use in loops. */ diff --git a/Source/ThirdParty/PhysX/characterkinematic/PxBoxController.h b/Source/ThirdParty/PhysX/characterkinematic/PxBoxController.h index 533600b43..5ba8e54e5 100644 --- a/Source/ThirdParty/PhysX/characterkinematic/PxBoxController.h +++ b/Source/ThirdParty/PhysX/characterkinematic/PxBoxController.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_CCT_BOX_CONTROLLER -#define PX_PHYSICS_CCT_BOX_CONTROLLER +#ifndef PX_BOX_CONTROLLER_H +#define PX_BOX_CONTROLLER_H /** \addtogroup character @{ */ diff --git a/Source/ThirdParty/PhysX/characterkinematic/PxCapsuleController.h b/Source/ThirdParty/PhysX/characterkinematic/PxCapsuleController.h index cd95d7b6f..28e4e1ecc 100644 --- a/Source/ThirdParty/PhysX/characterkinematic/PxCapsuleController.h +++ b/Source/ThirdParty/PhysX/characterkinematic/PxCapsuleController.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_CCT_CAPSULE_CONTROLLER -#define PX_PHYSICS_CCT_CAPSULE_CONTROLLER +#ifndef PX_CAPSULE_CONTROLLER_H +#define PX_CAPSULE_CONTROLLER_H /** \addtogroup character @{ */ diff --git a/Source/ThirdParty/PhysX/characterkinematic/PxController.h b/Source/ThirdParty/PhysX/characterkinematic/PxController.h index 3d263bc3f..ee64b3d5a 100644 --- a/Source/ThirdParty/PhysX/characterkinematic/PxController.h +++ b/Source/ThirdParty/PhysX/characterkinematic/PxController.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_PHYSICS_CCT_CONTROLLER -#define PX_PHYSICS_CCT_CONTROLLER +#ifndef PX_CONTROLLER_H +#define PX_CONTROLLER_H /** \addtogroup character @{ */ @@ -119,14 +118,14 @@ PX_FLAGS_OPERATORS(PxControllerCollisionFlag::Enum, PxU8) */ struct PxControllerState { - PxVec3 deltaXP; //!< delta position vector for the object the CCT is standing/riding on. Not always match the CCT delta when variable timesteps are used. - PxShape* touchedShape; //!< Shape on which the CCT is standing - PxRigidActor* touchedActor; //!< Actor owning 'touchedShape' - ObstacleHandle touchedObstacleHandle; // Obstacle on which the CCT is standing - PxU32 collisionFlags; //!< Last known collision flags (PxControllerCollisionFlag) - bool standOnAnotherCCT; //!< Are we standing on another CCT? - bool standOnObstacle; //!< Are we standing on a user-defined obstacle? - bool isMovingUp; //!< is CCT moving up or not? (i.e. explicit jumping) + PxVec3 deltaXP; //!< delta position vector for the object the CCT is standing/riding on. Not always match the CCT delta when variable timesteps are used. + PxShape* touchedShape; //!< Shape on which the CCT is standing + PxRigidActor* touchedActor; //!< Actor owning 'touchedShape' + PxObstacleHandle touchedObstacleHandle; // Obstacle on which the CCT is standing + PxU32 collisionFlags; //!< Last known collision flags (PxControllerCollisionFlag) + bool standOnAnotherCCT; //!< Are we standing on another CCT? + bool standOnObstacle; //!< Are we standing on a user-defined obstacle? + bool isMovingUp; //!< is CCT moving up or not? (i.e. explicit jumping) }; /** @@ -506,6 +505,15 @@ public: */ bool registerDeletionListener; + /** + \brief Client ID for associated actor. + + @see PxClientID PxActor::setOwnerClient + + Default: PX_DEFAULT_CLIENT + */ + PxClientID clientID; + /** \brief User specified data associated with the controller. @@ -535,26 +543,26 @@ protected: PX_INLINE void copy(const PxControllerDesc&); }; -PX_INLINE PxControllerDesc::PxControllerDesc(PxControllerShapeType::Enum t) : mType(t) +PX_INLINE PxControllerDesc::PxControllerDesc(PxControllerShapeType::Enum t) : + position (PxExtended(0.0), PxExtended(0.0), PxExtended(0.0)), + upDirection (0.0f, 1.0f, 0.0f), + slopeLimit (0.707f), + invisibleWallHeight (0.0f), + maxJumpHeight (0.0f), + contactOffset (0.1f), + stepOffset (0.5f), + density (10.0f), + scaleCoeff (0.8f), + volumeGrowth (1.5f), + reportCallback (NULL), + behaviorCallback (NULL), + nonWalkableMode (PxControllerNonWalkableMode::ePREVENT_CLIMBING), + material (NULL), + registerDeletionListener (true), + clientID (PX_DEFAULT_CLIENT), + userData (NULL), + mType (t) { - upDirection = PxVec3(0.0f, 1.0f, 0.0f); - slopeLimit = 0.707f; - contactOffset = 0.1f; - stepOffset = 0.5f; - density = 10.0f; - scaleCoeff = 0.8f; - volumeGrowth = 1.5f; - reportCallback = NULL; - behaviorCallback = NULL; - userData = NULL; - nonWalkableMode = PxControllerNonWalkableMode::ePREVENT_CLIMBING; - position.x = PxExtended(0.0); - position.y = PxExtended(0.0); - position.z = PxExtended(0.0); - material = NULL; - invisibleWallHeight = 0.0f; - maxJumpHeight = 0.0f; - registerDeletionListener = true; } PX_INLINE PxControllerDesc::PxControllerDesc(const PxControllerDesc& other) : mType(other.mType) @@ -588,6 +596,7 @@ PX_INLINE void PxControllerDesc::copy(const PxControllerDesc& other) invisibleWallHeight = other.invisibleWallHeight; maxJumpHeight = other.maxJumpHeight; registerDeletionListener = other.registerDeletionListener; + clientID = other.clientID; } PX_INLINE PxControllerDesc::~PxControllerDesc() @@ -760,7 +769,7 @@ public: \param[in] flag The new value of the non-walkable mode. - \see PxControllerNonWalkableMode + @see PxControllerNonWalkableMode */ virtual void setNonWalkableMode(PxControllerNonWalkableMode::Enum flag) = 0; @@ -769,7 +778,7 @@ public: \return The current non-walkable mode. - \see PxControllerNonWalkableMode + @see PxControllerNonWalkableMode */ virtual PxControllerNonWalkableMode::Enum getNonWalkableMode() const = 0; diff --git a/Source/ThirdParty/PhysX/characterkinematic/PxControllerBehavior.h b/Source/ThirdParty/PhysX/characterkinematic/PxControllerBehavior.h index ea5ac3bb5..4c9aa475b 100644 --- a/Source/ThirdParty/PhysX/characterkinematic/PxControllerBehavior.h +++ b/Source/ThirdParty/PhysX/characterkinematic/PxControllerBehavior.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_PHYSICS_CCT_BEHAVIOR -#define PX_PHYSICS_CCT_BEHAVIOR +#ifndef PX_CONTROLLER_BEHAVIOR_H +#define PX_CONTROLLER_BEHAVIOR_H /** \addtogroup character @{ */ diff --git a/Source/ThirdParty/PhysX/characterkinematic/PxControllerManager.h b/Source/ThirdParty/PhysX/characterkinematic/PxControllerManager.h index 8accda39e..76c30e775 100644 --- a/Source/ThirdParty/PhysX/characterkinematic/PxControllerManager.h +++ b/Source/ThirdParty/PhysX/characterkinematic/PxControllerManager.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_CCT_MANAGER -#define PX_PHYSICS_CCT_MANAGER +#ifndef PX_CONTROLLER_MANAGER_H +#define PX_CONTROLLER_MANAGER_H /** \addtogroup character @{ */ @@ -296,4 +294,5 @@ protected: PX_C_EXPORT physx::PxControllerManager* PX_CALL_CONV PxCreateControllerManager(physx::PxScene& scene, bool lockingEnabled = false); /** @} */ -#endif //PX_PHYSICS_CCT_MANAGER +#endif + diff --git a/Source/ThirdParty/PhysX/characterkinematic/PxControllerObstacles.h b/Source/ThirdParty/PhysX/characterkinematic/PxControllerObstacles.h index b54a72cf0..7f438fcc3 100644 --- a/Source/ThirdParty/PhysX/characterkinematic/PxControllerObstacles.h +++ b/Source/ThirdParty/PhysX/characterkinematic/PxControllerObstacles.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_PHYSICS_CCT_OBSTACLES -#define PX_PHYSICS_CCT_OBSTACLES +#ifndef PX_CONTROLLER_OBSTACLES_H +#define PX_CONTROLLER_OBSTACLES_H /** \addtogroup character @{ */ @@ -43,7 +42,7 @@ namespace physx class PxControllerManager; - #define INVALID_OBSTACLE_HANDLE 0xffffffff + #define PX_INVALID_OBSTACLE_HANDLE 0xffffffff /** \brief Base class for obstacles. @@ -102,7 +101,7 @@ namespace physx PxReal mRadius; }; - typedef PxU32 ObstacleHandle; + typedef PxU32 PxObstacleHandle; /** \brief Context class for obstacles. @@ -136,7 +135,7 @@ namespace physx \return Handle for newly-added obstacle */ - virtual ObstacleHandle addObstacle(const PxObstacle& obstacle) = 0; + virtual PxObstacleHandle addObstacle(const PxObstacle& obstacle) = 0; /** \brief Removes an obstacle from the context. @@ -145,7 +144,7 @@ namespace physx \return True if success */ - virtual bool removeObstacle(ObstacleHandle handle) = 0; + virtual bool removeObstacle(PxObstacleHandle handle) = 0; /** \brief Updates data for an existing obstacle. @@ -155,7 +154,7 @@ namespace physx \return True if success */ - virtual bool updateObstacle(ObstacleHandle handle, const PxObstacle& obstacle) = 0; + virtual bool updateObstacle(PxObstacleHandle handle, const PxObstacle& obstacle) = 0; /** \brief Retrieves number of obstacles in the context. @@ -180,7 +179,7 @@ namespace physx \return Desired obstacle */ - virtual const PxObstacle* getObstacleByHandle(ObstacleHandle handle) const = 0; + virtual const PxObstacle* getObstacleByHandle(PxObstacleHandle handle) const = 0; }; #if !PX_DOXYGEN diff --git a/Source/ThirdParty/PhysX/characterkinematic/PxExtended.h b/Source/ThirdParty/PhysX/characterkinematic/PxExtended.h index 6759c296c..1bc75ebf9 100644 --- a/Source/ThirdParty/PhysX/characterkinematic/PxExtended.h +++ b/Source/ThirdParty/PhysX/characterkinematic/PxExtended.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_CCT_EXTENDED -#define PX_PHYSICS_CCT_EXTENDED +#ifndef PX_EXTENDED_H +#define PX_EXTENDED_H /** \addtogroup character @{ */ diff --git a/Source/ThirdParty/PhysX/collision/PxCollisionDefs.h b/Source/ThirdParty/PhysX/collision/PxCollisionDefs.h index 5923d0953..134c61c8d 100644 --- a/Source/ThirdParty/PhysX/collision/PxCollisionDefs.h +++ b/Source/ThirdParty/PhysX/collision/PxCollisionDefs.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,61 +22,67 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - #ifndef PX_COLLISION_DEFS_H #define PX_COLLISION_DEFS_H #include "PxPhysXConfig.h" -#include "foundation/PxVec3.h" -#include "foundation/PxMat33.h" -#include "geomutils/GuContactPoint.h" -#include "geomutils/GuContactBuffer.h" -#include "geometry/PxGeometry.h" +#include "foundation/PxSimpleTypes.h" #if !PX_DOXYGEN namespace physx { #endif +/** +\brief A callback class to allocate memory to cache information used in contact generation. +*/ +class PxCacheAllocator +{ +public: /** - \brief A structure to cache contact information produced by LL contact gen functions. + \brief Allocates cache data for contact generation. This data is stored inside PxCache objects. + The application can retain and provide this information for future contact generation passes + for a given pair to improve contact generation performance. It is the application's responsibility + to release this memory appropriately. If the memory is released, the application must ensure that + this memory is no longer referenced by any PxCache objects passed to PxGenerateContacts. + + \param byteSize [in] size of the allocation in bytes + + \return the newly-allocated memory. The returned address must be 16-byte aligned. + + @see PxCache, PxGenerateContacts */ - struct PxCache + virtual PxU8* allocateCacheData(const PxU32 byteSize) = 0; + + virtual ~PxCacheAllocator() {} +}; + +/** +\brief A structure to cache contact information produced by low-level contact generation functions. +*/ +struct PxCache +{ + PxU8* mCachedData; //!< Cached data pointer. Allocated via PxCacheAllocator + PxU16 mCachedSize; //!< The total size of the cached data + PxU8 mPairData; //!< Pair data information used and cached internally by some contact generation functions to accelerate performance. + PxU8 mManifoldFlags; //!< Manifold flags used to identify the format the cached data is stored in. @see Gu::ManifoldFlags + + PX_FORCE_INLINE PxCache() : mCachedData(NULL), mCachedSize(0), mPairData(0), mManifoldFlags(0) { - PxU8* mCachedData; //!< Cached data pointer. Allocated via PxCacheAllocator - PxU16 mCachedSize; //!< The total size of the cached data - PxU8 mPairData; //!< Pair data information used and cached internally by some contact gen functions to accelerate performance. - PxU8 mManifoldFlags; //!< Manifold flags used to identify the format the cached data is stored in. + } - PX_FORCE_INLINE PxCache() : mCachedData(NULL), mCachedSize(0), mPairData(0), mManifoldFlags(0) - { - } - - PX_FORCE_INLINE void reset() { mCachedData = NULL; mCachedSize = 0; mPairData = 0; mManifoldFlags = 0;} - }; - - - /** - A callback class to allocate memory to cache information used in contact generation. - */ - class PxCacheAllocator + PX_FORCE_INLINE void reset() { - public: - /** - \brief Allocates cache data for contact generation. This data is stored inside PxCache objects. The application can retain and provide this information for future contact generation passes - for a given pair to improve contact generation performance. It is the application's responsibility to release this memory appropriately. If the memory is released, the application must ensure that - this memory is no longer referenced by any PxCache objects passed to PxGenerateContacts. - \param byteSize The size of the allocation in bytes - \return the newly-allocated memory. The returned address must be 16-byte aligned. - */ - virtual PxU8* allocateCacheData(const PxU32 byteSize) = 0; - - virtual ~PxCacheAllocator() {} - }; + mCachedData = NULL; + mCachedSize = 0; + mPairData = 0; + mManifoldFlags = 0; + } +}; #if !PX_DOXYGEN } diff --git a/Source/ThirdParty/PhysX/common/PxBase.h b/Source/ThirdParty/PhysX/common/PxBase.h index cc4f8797f..f16cd907a 100644 --- a/Source/ThirdParty/PhysX/common/PxBase.h +++ b/Source/ThirdParty/PhysX/common/PxBase.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_PX_BASE -#define PX_PHYSICS_PX_BASE +#ifndef PX_BASE_H +#define PX_BASE_H /** \addtogroup common @{ @@ -40,6 +38,7 @@ #include "common/PxCollection.h" #include "common/PxTypeInfo.h" #include // For strcmp +#include "foundation/PxAssert.h" #if !PX_DOXYGEN namespace physx @@ -55,8 +54,8 @@ struct PxBaseFlag { enum Enum { - eOWNS_MEMORY = (1<<0), - eIS_RELEASABLE = (1<<1) + eOWNS_MEMORY = (1<<0), + eIS_RELEASABLE = (1<<1) }; }; @@ -82,13 +81,13 @@ public: /** \brief Releases the PxBase instance, please check documentation of release in derived class. */ - virtual void release() = 0; + virtual void release() = 0; /** \brief Returns string name of dynamic type. \return Class name of most derived type of this object. */ - virtual const char* getConcreteTypeName() const = 0; + virtual const char* getConcreteTypeName() const = 0; /* brief Implements dynamic cast functionality. @@ -98,7 +97,7 @@ public: \return A pointer to the specified type if object matches, otherwise NULL */ - template T* is() { return typeMatch() ? static_cast(this) : NULL; } + template T* is() { return typeMatch() ? static_cast(this) : NULL; } /* brief Implements dynamic cast functionality for const objects. @@ -108,7 +107,7 @@ public: \return A pointer to the specified type if object matches, otherwise NULL */ - template const T* is() const { return typeMatch() ? static_cast(this) : NULL; } + template const T* is() const { return typeMatch() ? static_cast(this) : NULL; } /** \brief Returns concrete type of object. @@ -116,7 +115,7 @@ public: @see PxConcreteType */ - PX_FORCE_INLINE PxType getConcreteType() const { return mConcreteType; } + PX_FORCE_INLINE PxType getConcreteType() const { return mConcreteType; } /** \brief Set PxBaseFlag @@ -124,7 +123,7 @@ public: \param[in] flag The flag to be set \param[in] value The flags new value */ - PX_FORCE_INLINE void setBaseFlag(PxBaseFlag::Enum flag, bool value) { mBaseFlags = value ? mBaseFlags|flag : mBaseFlags&~flag; } + PX_FORCE_INLINE void setBaseFlag(PxBaseFlag::Enum flag, bool value) { mBaseFlags = value ? mBaseFlags|flag : mBaseFlags&~flag; } /** \brief Set PxBaseFlags @@ -133,7 +132,7 @@ public: @see PxBaseFlags */ - PX_FORCE_INLINE void setBaseFlags(PxBaseFlags inFlags) { mBaseFlags = inFlags; } + PX_FORCE_INLINE void setBaseFlags(PxBaseFlags inFlags) { mBaseFlags = inFlags; } /** \brief Returns PxBaseFlags @@ -142,7 +141,7 @@ public: @see PxBaseFlags */ - PX_FORCE_INLINE PxBaseFlags getBaseFlags() const { return mBaseFlags; } + PX_FORCE_INLINE PxBaseFlags getBaseFlags() const { return mBaseFlags; } /** \brief Whether the object is subordinate. @@ -153,44 +152,83 @@ public: @see PxSerialization::isSerializable */ - virtual bool isReleasable() const { return mBaseFlags & PxBaseFlag::eIS_RELEASABLE; } + virtual bool isReleasable() const { return mBaseFlags & PxBaseFlag::eIS_RELEASABLE; } protected: /** \brief Constructor setting concrete type and base flags. */ - PX_INLINE PxBase(PxType concreteType, PxBaseFlags baseFlags) - : mConcreteType(concreteType), mBaseFlags(baseFlags) {} + PX_INLINE PxBase(PxType concreteType, PxBaseFlags baseFlags) + : mConcreteType(concreteType), mBaseFlags(baseFlags), mBuiltInRefCount(1) {} /** \brief Deserialization constructor setting base flags. */ - PX_INLINE PxBase(PxBaseFlags baseFlags) : mBaseFlags(baseFlags) {} - + PX_INLINE PxBase(PxBaseFlags baseFlags) : mBaseFlags(baseFlags) + { + PX_ASSERT(mBuiltInRefCount == 1); + } /** \brief Destructor. */ - virtual ~PxBase() {} + virtual ~PxBase() {} /** \brief Returns whether a given type name matches with the type of this instance */ - virtual bool isKindOf(const char* superClass) const { return !::strcmp(superClass, "PxBase"); } - - template bool typeMatch() const - { - return PxU32(PxTypeInfo::eFastTypeId)!=PxU32(PxConcreteType::eUNDEFINED) ? - PxU32(getConcreteType()) == PxU32(PxTypeInfo::eFastTypeId) : isKindOf(PxTypeInfo::name()); - } + virtual bool isKindOf(const char* superClass) const { return !::strcmp(superClass, "PxBase"); } + template bool typeMatch() const + { + return PxU32(PxTypeInfo::eFastTypeId)!=PxU32(PxConcreteType::eUNDEFINED) ? + PxU32(getConcreteType()) == PxU32(PxTypeInfo::eFastTypeId) : isKindOf(PxTypeInfo::name()); + } private: - friend void getBinaryMetaData_PxBase(PxOutputStream& stream); + friend void getBinaryMetaData_PxBase(PxOutputStream& stream); protected: - PxType mConcreteType; // concrete type identifier - see PxConcreteType. - PxBaseFlags mBaseFlags; // internal flags + PxType mConcreteType; // concrete type identifier - see PxConcreteType. + PxBaseFlags mBaseFlags; // internal flags + PxU32 mBuiltInRefCount; +}; +/** +\brief Base class for ref-counted objects. +*/ +class PxRefCounted : public PxBase +{ +public: + + /** + \brief Decrements the reference count of the object and releases it if the new reference count is zero. + */ + virtual void release() = 0; + + /** + \brief Returns the reference count of the object. + + At creation, the reference count of the object is 1. Every other object referencing this object increments the + count by 1. When the reference count reaches 0, and only then, the object gets destroyed automatically. + + \return the current reference count. + */ + virtual PxU32 getReferenceCount() const = 0; + + /** + \brief Acquires a counted reference to this object. + + This method increases the reference count of the object by 1. Decrement the reference count by calling release() + */ + virtual void acquireReference() = 0; + +protected: + virtual void onRefCountZero() { delete this; } + + PX_INLINE PxRefCounted(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags) {} + PX_INLINE PxRefCounted(PxBaseFlags baseFlags) : PxBase(baseFlags) {} + virtual ~PxRefCounted() {} + virtual bool isKindOf(const char* name) const { return !::strcmp("PxRefCounted", name) || PxBase::isKindOf(name); } }; #if !PX_DOXYGEN diff --git a/Source/ThirdParty/PhysX/common/PxCollection.h b/Source/ThirdParty/PhysX/common/PxCollection.h index d9ec5cfc4..84d67e5ab 100644 --- a/Source/ThirdParty/PhysX/common/PxCollection.h +++ b/Source/ThirdParty/PhysX/common/PxCollection.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_PX_COLLECTION -#define PX_PHYSICS_PX_COLLECTION +#ifndef PX_COLLECTION_H +#define PX_COLLECTION_H #include "common/PxSerialFramework.h" @@ -272,7 +270,7 @@ For deserialization, the system gives back a collection of deserialized objects @see PxCollection, PxCollection::release() */ -PX_PHYSX_COMMON_API physx::PxCollection* PX_CALL_CONV PxCreateCollection(); +PX_C_EXPORT PX_PHYSX_COMMON_API physx::PxCollection* PX_CALL_CONV PxCreateCollection(); /** @} */ diff --git a/Source/ThirdParty/PhysX/common/PxCoreUtilityTypes.h b/Source/ThirdParty/PhysX/common/PxCoreUtilityTypes.h index 0c4d4809d..bc1ab8089 100644 --- a/Source/ThirdParty/PhysX/common/PxCoreUtilityTypes.h +++ b/Source/ThirdParty/PhysX/common/PxCoreUtilityTypes.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_CORE_UTILTY_TYPES_H -#define PX_CORE_UTILTY_TYPES_H +#ifndef PX_CORE_UTILITY_TYPES_H +#define PX_CORE_UTILITY_TYPES_H /** \addtogroup common @{ */ @@ -78,6 +76,20 @@ struct PxTypedStridedData { } + PxTypedStridedData(const TDataType* data_, PxU32 stride_ = 0) + : stride(stride_) + , data(data_) + { + } + + PX_INLINE const TDataType& at(PxU32 idx) const + { + PxU32 theStride(stride); + if (theStride == 0) + theStride = sizeof(TDataType); + PxU32 offset(theStride * idx); + return *(reinterpret_cast(reinterpret_cast(data) + offset)); + } }; struct PxBoundedData : public PxStridedData @@ -183,7 +195,7 @@ public: void clear() { - memset(mDataPairs, 0, NB_ELEMENTS*2*sizeof(PxReal)); + PxMemSet(mDataPairs, 0, NB_ELEMENTS*2*sizeof(PxReal)); mNbDataPairs = 0; } diff --git a/Source/ThirdParty/PhysX/common/PxPhysicsInsertionCallback.h b/Source/ThirdParty/PhysX/common/PxInsertionCallback.h similarity index 73% rename from Source/ThirdParty/PhysX/common/PxPhysicsInsertionCallback.h rename to Source/ThirdParty/PhysX/common/PxInsertionCallback.h index 6b29f776f..e9f373884 100644 --- a/Source/ThirdParty/PhysX/common/PxPhysicsInsertionCallback.h +++ b/Source/ThirdParty/PhysX/common/PxInsertionCallback.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_PX_PHYSICS_INSERTION_CALLBACK -#define PX_PHYSICS_PX_PHYSICS_INSERTION_CALLBACK +#ifndef PX_INSERTION_CALLBACK_H +#define PX_INSERTION_CALLBACK_H #include "common/PxBase.h" @@ -43,27 +41,25 @@ namespace physx #endif /** - - \brief Callback interface that permits PxCooking to insert a - TriangleMesh, HeightfieldMesh or ConvexMesh directly into PxPhysics without the need to store - the cooking results into a stream. - + \brief Callback interface that permits TriangleMesh, Heightfield, ConvexMesh or BVH to be used + directly without the need to store the cooking results into a stream. Using this is advised only if real-time cooking is required; using "offline" cooking and streams is otherwise preferred. - The default PxPhysicsInsertionCallback implementation must be used. The PxPhysics + The default PxInsertionCallback implementations must be used. The PxPhysics default callback can be obtained using the PxPhysics::getPhysicsInsertionCallback(). + The PxCooking default callback can be obtained using the PxCooking::getStandaloneInsertionCallback(). @see PxCooking PxPhysics */ - class PxPhysicsInsertionCallback + class PxInsertionCallback { public: - PxPhysicsInsertionCallback() {} + PxInsertionCallback() {} /** - \brief Builds object (TriangleMesh, HeightfieldMesh or ConvexMesh) from given data in PxPhysics. + \brief Builds object (TriangleMesh, Heightfield, ConvexMesh or BVH) from given data in PxPhysics. \param type Object type to build. \param data Object data @@ -72,9 +68,10 @@ namespace physx virtual PxBase* buildObjectFromData(PxConcreteType::Enum type, void* data) = 0; protected: - virtual ~PxPhysicsInsertionCallback() {} + virtual ~PxInsertionCallback() {} }; + typedef PxInsertionCallback PxPhysicsInsertionCallback; #if !PX_DOXYGEN } // namespace physx diff --git a/Source/ThirdParty/PhysX/common/PxMetaData.h b/Source/ThirdParty/PhysX/common/PxMetaData.h index 27c06d4b6..4b2e26a67 100644 --- a/Source/ThirdParty/PhysX/common/PxMetaData.h +++ b/Source/ThirdParty/PhysX/common/PxMetaData.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_METADATA_H -#define PX_PHYSICS_METADATA_H +#ifndef PX_METADATA_H +#define PX_METADATA_H /** \addtogroup physics @{ */ diff --git a/Source/ThirdParty/PhysX/common/PxMetaDataFlags.h b/Source/ThirdParty/PhysX/common/PxMetaDataFlags.h index c8718e745..f7bdebeb2 100644 --- a/Source/ThirdParty/PhysX/common/PxMetaDataFlags.h +++ b/Source/ThirdParty/PhysX/common/PxMetaDataFlags.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_METADATA_FLAGS -#define PX_PHYSICS_METADATA_FLAGS +#ifndef PX_METADATA_FLAGS_H +#define PX_METADATA_FLAGS_H #include "foundation/Px.h" diff --git a/Source/ThirdParty/PhysX/common/PxPhysXCommonConfig.h b/Source/ThirdParty/PhysX/common/PxPhysXCommonConfig.h index d2f83a0d7..2e809674a 100644 --- a/Source/ThirdParty/PhysX/common/PxPhysXCommonConfig.h +++ b/Source/ThirdParty/PhysX/common/PxPhysXCommonConfig.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_COMMON_NX -#define PX_PHYSICS_COMMON_NX +#ifndef PX_PHYSX_COMMON_CONFIG_H +#define PX_PHYSX_COMMON_CONFIG_H /** \addtogroup common @{ */ @@ -47,7 +45,7 @@ https://developercommunity.visualstudio.com/content/problem/66047/possible-compi #if defined PX_PHYSX_STATIC_LIB #define PX_PHYSX_CORE_API #else - #if (PX_WINDOWS_FAMILY || PX_XBOXONE || PX_PS4) + #if (PX_WINDOWS_FAMILY || PX_PS4 || PX_PS5) #if defined PX_PHYSX_CORE_EXPORTS #define PX_PHYSX_CORE_API __declspec(dllexport) #else @@ -85,7 +83,7 @@ https://developercommunity.visualstudio.com/content/problem/66047/possible-compi #if defined PX_PHYSX_STATIC_LIB #define PX_PHYSX_COMMON_API #else - #if (PX_WINDOWS_FAMILY || PX_XBOXONE || PX_PS4) && !defined(__CUDACC__) + #if (PX_WINDOWS_FAMILY || PX_PS4 || PX_PS5) && !defined(__CUDACC__) #if defined PX_PHYSX_COMMON_EXPORTS #define PX_PHYSX_COMMON_API __declspec(dllexport) #else @@ -98,23 +96,27 @@ https://developercommunity.visualstudio.com/content/problem/66047/possible-compi #endif #endif +// PT: typical "invalid" value in various CD algorithms +#define PX_INVALID_U32 0xffffffff +#define PX_INVALID_U16 0xffff + // Changing these parameters requires recompilation of the SDK +// Enable debug visualization +#define PX_ENABLE_DEBUG_VISUALIZATION 1 +#define PX_CATCH_UNDEFINED_ENABLE_DEBUG_VISUALIZATION + +// Enable simulation statistics generation +#define PX_ENABLE_SIM_STATS 1 +#define PX_CATCH_UNDEFINED_ENABLE_SIM_STATS + #if !PX_DOXYGEN namespace physx { #endif - class PxCollection; - class PxBase; - - class PxHeightField; - class PxHeightFieldDesc; - - class PxTriangleMesh; - class PxConvexMesh; - typedef PxU32 PxTriangleID; typedef PxU16 PxMaterialTableIndex; + typedef PxU16 PxFEMMaterialTableIndex; #if !PX_DOXYGEN } // namespace physx diff --git a/Source/ThirdParty/PhysX/common/PxProfileZone.h b/Source/ThirdParty/PhysX/common/PxProfileZone.h index 17f042940..a562940de 100644 --- a/Source/ThirdParty/PhysX/common/PxProfileZone.h +++ b/Source/ThirdParty/PhysX/common/PxProfileZone.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,13 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. -#ifndef PXFOUNDATION_PXPROFILEZONE_H -#define PXFOUNDATION_PXPROFILEZONE_H +#ifndef PX_PROFILE_ZONE_H +#define PX_PROFILE_ZONE_H #include "foundation/PxProfiler.h" -#include "PxFoundation.h" +#include "foundation/PxFoundation.h" #if PX_DEBUG || PX_CHECKED || PX_PROFILE #define PX_PROFILE_ZONE(x, y) \ @@ -48,4 +47,4 @@ #define PX_PROFILE_POINTER_TO_U64(pointer) static_cast(reinterpret_cast(pointer)) -#endif // PXFOUNDATION_PXPROFILEZONE_H +#endif diff --git a/Source/ThirdParty/PhysX/common/PxRenderBuffer.h b/Source/ThirdParty/PhysX/common/PxRenderBuffer.h index 12fb6cf35..23baf4a88 100644 --- a/Source/ThirdParty/PhysX/common/PxRenderBuffer.h +++ b/Source/ThirdParty/PhysX/common/PxRenderBuffer.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_FOUNDATION_PXRENDERBUFFER_H -#define PX_FOUNDATION_PXRENDERBUFFER_H +#ifndef PX_RENDER_BUFFER_H +#define PX_RENDER_BUFFER_H /** \addtogroup common @{ @@ -61,12 +59,13 @@ struct PxDebugColor eARGB_CYAN = 0xff00ffff, eARGB_WHITE = 0xffffffff, eARGB_GREY = 0xff808080, - eARGB_DARKRED = 0x88880000, - eARGB_DARKGREEN = 0x88008800, - eARGB_DARKBLUE = 0x88000088 + eARGB_DARKRED = 0xff880000, + eARGB_DARKGREEN = 0xff008800, + eARGB_DARKBLUE = 0xff000088 }; }; + /** \brief Used to store a single point and colour for debug rendering. */ @@ -114,17 +113,22 @@ struct PxDebugTriangle */ struct PxDebugText { - PxDebugText() : string(0) {} + PxDebugText() : string(0) + { + } - PxDebugText(const PxVec3& p, const PxReal& s, const PxU32& c, const char* str) - : position(p), size(s), color(c), string(str) {} + PxDebugText(const PxVec3& pos, const PxReal& sz, const PxU32& clr, const char* str) + : position(pos), size(sz), color(clr), string(str) + { + } - PxVec3 position; - PxReal size; - PxU32 color; - const char* string; + PxVec3 position; + PxReal size; + PxU32 color; + const char* string; }; + /** \brief Interface for points, lines, triangles, and text buffer. */ @@ -135,18 +139,24 @@ public: virtual PxU32 getNbPoints() const = 0; virtual const PxDebugPoint* getPoints() const = 0; + virtual void addPoint(const PxDebugPoint& point) = 0; virtual PxU32 getNbLines() const = 0; virtual const PxDebugLine* getLines() const = 0; + virtual void addLine(const PxDebugLine& line) = 0; + virtual PxDebugLine* reserveLines(const PxU32 nbLines) = 0; + virtual PxDebugPoint* reservePoints(const PxU32 nbLines) = 0; virtual PxU32 getNbTriangles() const = 0; virtual const PxDebugTriangle* getTriangles() const = 0; - - virtual PxU32 getNbTexts() const = 0; - virtual const PxDebugText* getTexts() const = 0; + virtual void addTriangle(const PxDebugTriangle& triangle) = 0; virtual void append(const PxRenderBuffer& other) = 0; virtual void clear() = 0; + + virtual void shift(const PxVec3& delta) = 0; + + virtual bool empty() const = 0; }; #if !PX_DOXYGEN diff --git a/Source/ThirdParty/PhysX/common/PxRenderOutput.h b/Source/ThirdParty/PhysX/common/PxRenderOutput.h new file mode 100644 index 000000000..2bc16f8c0 --- /dev/null +++ b/Source/ThirdParty/PhysX/common/PxRenderOutput.h @@ -0,0 +1,404 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_RENDER_OUTPUT_H +#define PX_RENDER_OUTPUT_H + +#include "foundation/PxMat44.h" +#include "foundation/PxBasicTemplates.h" +#include "PxRenderBuffer.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +#if PX_VC +#pragma warning(push) +#pragma warning( disable : 4251 ) // class needs to have dll-interface to be used by clients of class +#endif + + /** + Output stream to fill RenderBuffer + */ + class PX_PHYSX_COMMON_API PxRenderOutput + { + public: + + enum Primitive + { + POINTS, + LINES, + LINESTRIP, + TRIANGLES, + TRIANGLESTRIP + }; + + PxRenderOutput(PxRenderBuffer& buffer) + : mPrim(POINTS), + mColor(0), + mVertex0(0.0f), + mVertex1(0.0f), + mVertexCount(0), + mTransform(PxIdentity), + mBuffer(buffer) + { + } + + PX_INLINE PxRenderOutput& operator<<(Primitive prim); + + PX_INLINE PxRenderOutput& operator<<(PxU32 color) ; + + PX_INLINE PxRenderOutput& operator<<(const PxMat44& transform); + + PX_INLINE PxRenderOutput& operator<<(const PxTransform& t); + + PX_INLINE PxRenderOutput& operator<<(const PxVec3& vertex); //AM: Don't use this! Slow! Deprecated! + + PX_INLINE PxDebugLine* reserveSegments(PxU32 nbSegments); + + PX_INLINE PxDebugPoint* reservePoints(PxU32 nbSegments); + + PX_INLINE void outputSegment(const PxVec3& v0, const PxVec3& v1); + + PX_INLINE PxRenderOutput& outputCapsule(PxF32 radius, PxF32 halfHeight, const PxMat44& absPose); + + private: + + PxRenderOutput& operator=(const PxRenderOutput&); + + Primitive mPrim; + PxU32 mColor; + PxVec3 mVertex0, mVertex1; + PxU32 mVertexCount; + PxMat44 mTransform; + PxRenderBuffer& mBuffer; + }; + + struct PxDebugBox + { + explicit PxDebugBox(const PxVec3& extents, bool wireframe_ = true) + : minimum(-extents), maximum(extents), wireframe(wireframe_) {} + + explicit PxDebugBox(const PxVec3& pos, const PxVec3& extents, bool wireframe_ = true) + : minimum(pos - extents), maximum(pos + extents), wireframe(wireframe_) {} + + explicit PxDebugBox(const PxBounds3& bounds, bool wireframe_ = true) + : minimum(bounds.minimum), maximum(bounds.maximum), wireframe(wireframe_) {} + + PxVec3 minimum, maximum; + bool wireframe; + }; + PX_FORCE_INLINE PxRenderOutput& operator<<(PxRenderOutput& out, const PxDebugBox& box) + { + if (box.wireframe) + { + out << PxRenderOutput::LINESTRIP; + out << PxVec3(box.minimum.x, box.minimum.y, box.minimum.z); + out << PxVec3(box.maximum.x, box.minimum.y, box.minimum.z); + out << PxVec3(box.maximum.x, box.maximum.y, box.minimum.z); + out << PxVec3(box.minimum.x, box.maximum.y, box.minimum.z); + out << PxVec3(box.minimum.x, box.minimum.y, box.minimum.z); + out << PxVec3(box.minimum.x, box.minimum.y, box.maximum.z); + out << PxVec3(box.maximum.x, box.minimum.y, box.maximum.z); + out << PxVec3(box.maximum.x, box.maximum.y, box.maximum.z); + out << PxVec3(box.minimum.x, box.maximum.y, box.maximum.z); + out << PxVec3(box.minimum.x, box.minimum.y, box.maximum.z); + out << PxRenderOutput::LINES; + out << PxVec3(box.maximum.x, box.minimum.y, box.minimum.z); + out << PxVec3(box.maximum.x, box.minimum.y, box.maximum.z); + out << PxVec3(box.maximum.x, box.maximum.y, box.minimum.z); + out << PxVec3(box.maximum.x, box.maximum.y, box.maximum.z); + out << PxVec3(box.minimum.x, box.maximum.y, box.minimum.z); + out << PxVec3(box.minimum.x, box.maximum.y, box.maximum.z); + } + else + { + out << PxRenderOutput::TRIANGLESTRIP; + out << PxVec3(box.minimum.x, box.minimum.y, box.minimum.z); // 0 + out << PxVec3(box.minimum.x, box.maximum.y, box.minimum.z); // 2 + out << PxVec3(box.maximum.x, box.minimum.y, box.minimum.z); // 1 + out << PxVec3(box.maximum.x, box.maximum.y, box.minimum.z); // 3 + out << PxVec3(box.maximum.x, box.maximum.y, box.maximum.z); // 7 + out << PxVec3(box.minimum.x, box.maximum.y, box.minimum.z); // 2 + out << PxVec3(box.minimum.x, box.maximum.y, box.maximum.z); // 6 + out << PxVec3(box.minimum.x, box.minimum.y, box.minimum.z); // 0 + out << PxVec3(box.minimum.x, box.minimum.y, box.maximum.z); // 4 + out << PxVec3(box.maximum.x, box.minimum.y, box.minimum.z); // 1 + out << PxVec3(box.maximum.x, box.minimum.y, box.maximum.z); // 5 + out << PxVec3(box.maximum.x, box.maximum.y, box.maximum.z); // 7 + out << PxVec3(box.minimum.x, box.minimum.y, box.maximum.z); // 4 + out << PxVec3(box.minimum.x, box.maximum.y, box.maximum.z); // 6 + } + return out; + } + + struct PxDebugArrow + { + PxDebugArrow(const PxVec3& pos, const PxVec3& vec) + : base(pos), tip(pos + vec), headLength(vec.magnitude()*0.15f) {} + + PxDebugArrow(const PxVec3& pos, const PxVec3& vec, PxReal headLength_) + : base(pos), tip(pos + vec), headLength(headLength_) {} + + PxVec3 base, tip; + PxReal headLength; + }; + PX_FORCE_INLINE void normalToTangents(const PxVec3& normal, PxVec3& tangent0, PxVec3& tangent1) + { + tangent0 = PxAbs(normal.x) < 0.70710678f ? PxVec3(0, -normal.z, normal.y) : PxVec3(-normal.y, normal.x, 0); + tangent0.normalize(); + tangent1 = normal.cross(tangent0); + } + PX_FORCE_INLINE PxRenderOutput& operator<<(PxRenderOutput& out, const PxDebugArrow& arrow) + { + PxVec3 t0 = arrow.tip - arrow.base, t1, t2; + + t0.normalize(); + normalToTangents(t0, t1, t2); + + const PxReal tipAngle = 0.25f; + t1 *= arrow.headLength * tipAngle; + t2 *= arrow.headLength * tipAngle * PxSqrt(3.0f); + PxVec3 headBase = arrow.tip - t0 * arrow.headLength; + + out << PxRenderOutput::LINES; + out << arrow.base << arrow.tip; + + out << PxRenderOutput::TRIANGLESTRIP; + out << arrow.tip; + out << headBase + t1 + t1; + out << headBase - t1 - t2; + out << headBase - t1 + t2; + out << arrow.tip; + out << headBase + t1 + t1; + return out; + } + + struct PxDebugBasis + { + PxDebugBasis(const PxVec3& ext, PxU32 cX = PxU32(PxDebugColor::eARGB_RED), + PxU32 cY = PxU32(PxDebugColor::eARGB_GREEN), PxU32 cZ = PxU32(PxDebugColor::eARGB_BLUE)) + : extends(ext), colorX(cX), colorY(cY), colorZ(cZ) {} + PxVec3 extends; + PxU32 colorX, colorY, colorZ; + }; + PX_FORCE_INLINE PxRenderOutput& operator<<(PxRenderOutput& out, const PxDebugBasis& basis) + { + const PxReal headLength = basis.extends.magnitude() * 0.15f; + out << basis.colorX << PxDebugArrow(PxVec3(0.0f), PxVec3(basis.extends.x, 0, 0), headLength); + out << basis.colorY << PxDebugArrow(PxVec3(0.0f), PxVec3(0, basis.extends.y, 0), headLength); + out << basis.colorZ << PxDebugArrow(PxVec3(0.0f), PxVec3(0, 0, basis.extends.z), headLength); + return out; + } + + struct PxDebugCircle + { + PxDebugCircle(PxU32 s, PxReal r) + : nSegments(s), radius(r) {} + PxU32 nSegments; + PxReal radius; + }; + PX_FORCE_INLINE PxRenderOutput& operator<<(PxRenderOutput& out, const PxDebugCircle& circle) + { + const PxF32 step = PxTwoPi / circle.nSegments; + PxF32 angle = 0; + out << PxRenderOutput::LINESTRIP; + for (PxU32 i = 0; i < circle.nSegments; i++, angle += step) + out << PxVec3(circle.radius * PxSin(angle), circle.radius * PxCos(angle), 0); + out << PxVec3(0, circle.radius, 0); + return out; + } + + struct PxDebugArc + { + PxDebugArc(PxU32 s, PxReal r, PxReal minAng, PxReal maxAng) + : nSegments(s), radius(r), minAngle(minAng), maxAngle(maxAng) {} + PxU32 nSegments; + PxReal radius; + PxReal minAngle, maxAngle; + }; + PX_FORCE_INLINE PxRenderOutput& operator<<(PxRenderOutput& out, const PxDebugArc& arc) + { + const PxF32 step = (arc.maxAngle - arc.minAngle) / arc.nSegments; + PxF32 angle = arc.minAngle; + out << PxRenderOutput::LINESTRIP; + for (PxU32 i = 0; i < arc.nSegments; i++, angle += step) + out << PxVec3(arc.radius * PxSin(angle), arc.radius * PxCos(angle), 0); + out << PxVec3(arc.radius * PxSin(arc.maxAngle), arc.radius * PxCos(arc.maxAngle), 0); + return out; + } + + PX_INLINE PxRenderOutput& PxRenderOutput::operator<<(Primitive prim) + { + mPrim = prim; + mVertexCount = 0; + return *this; + } + + PX_INLINE PxRenderOutput& PxRenderOutput::operator<<(PxU32 color) + { + mColor = color; + return *this; + } + + PX_INLINE PxRenderOutput& PxRenderOutput::operator<<(const PxMat44& transform) + { + mTransform = transform; + return *this; + } + + PX_INLINE PxRenderOutput& PxRenderOutput::operator<<(const PxTransform& t) + { + mTransform = PxMat44(t); + return *this; + } + + PX_INLINE PxRenderOutput& PxRenderOutput::operator<<(const PxVec3& vertexIn) + { + // apply transformation + const PxVec3 vertex = mTransform.transform(vertexIn); + ++mVertexCount; + + // add primitive to render buffer + switch (mPrim) + { + case POINTS: + mBuffer.addPoint(PxDebugPoint(vertex, mColor)); break; + case LINES: + if (mVertexCount == 2) + { + mBuffer.addLine(PxDebugLine(mVertex0, vertex, mColor)); + mVertexCount = 0; + } + break; + case LINESTRIP: + if (mVertexCount >= 2) + mBuffer.addLine(PxDebugLine(mVertex0, vertex, mColor)); + break; + case TRIANGLES: + if (mVertexCount == 3) + { + mBuffer.addTriangle(PxDebugTriangle(mVertex1, mVertex0, vertex, mColor)); + mVertexCount = 0; + } + break; + case TRIANGLESTRIP: + if (mVertexCount >= 3) + mBuffer.addTriangle(PxDebugTriangle( + (mVertexCount & 0x1) ? mVertex0 : mVertex1, + (mVertexCount & 0x1) ? mVertex1 : mVertex0, vertex, mColor)); + break; + } + + // cache the last 2 vertices (for strips) + if (1 < mVertexCount) + { + mVertex1 = mVertex0; + mVertex0 = vertex; + } + else + { + mVertex0 = vertex; + } + return *this; + } + + PX_INLINE PxDebugLine* PxRenderOutput::reserveSegments(PxU32 nbSegments) + { + return mBuffer.reserveLines(nbSegments); + } + + PX_INLINE PxDebugPoint* PxRenderOutput::reservePoints(PxU32 nbPoints) + { + return mBuffer.reservePoints(nbPoints); + } + + // PT: using the operators is just too slow. + PX_INLINE void PxRenderOutput::outputSegment(const PxVec3& v0, const PxVec3& v1) + { + PxDebugLine* segment = mBuffer.reserveLines(1); + segment->pos0 = v0; + segment->pos1 = v1; + segment->color0 = segment->color1 = mColor; + } + + PX_INLINE PxRenderOutput& PxRenderOutput::outputCapsule(PxF32 radius, PxF32 halfHeight, const PxMat44& absPose) + { + PxRenderOutput& out = *this; + + const PxVec3 vleft2(-halfHeight, 0.0f, 0.0f); + PxMat44 left2 = absPose; + left2.column3 += PxVec4(left2.rotate(vleft2), 0.0f); + out << left2 << PxDebugArc(100, radius, PxPi, PxTwoPi); + + PxMat44 rotPose = left2; + PxSwap(rotPose.column1, rotPose.column2); + rotPose.column1 = -rotPose.column1; + out << rotPose << PxDebugArc(100, radius, PxPi, PxTwoPi); + + PxSwap(rotPose.column0, rotPose.column2); + rotPose.column0 = -rotPose.column0; + out << rotPose << PxDebugCircle(100, radius); + + const PxVec3 vright2(halfHeight, 0.0f, 0.0f); + PxMat44 right2 = absPose; + right2.column3 += PxVec4(right2.rotate(vright2), 0.0f); + out << right2 << PxDebugArc(100, radius, 0.0f, PxPi); + + rotPose = right2; + PxSwap(rotPose.column1, rotPose.column2); + rotPose.column1 = -rotPose.column1; + out << rotPose << PxDebugArc(100, radius, 0.0f, PxPi); + + PxSwap(rotPose.column0, rotPose.column2); + rotPose.column0 = -rotPose.column0; + out << rotPose << PxDebugCircle(100, radius); + + out << absPose; + out.outputSegment(absPose.transform(PxVec3(-halfHeight, radius, 0)), + absPose.transform(PxVec3(halfHeight, radius, 0))); + out.outputSegment(absPose.transform(PxVec3(-halfHeight, -radius, 0)), + absPose.transform(PxVec3(halfHeight, -radius, 0))); + out.outputSegment(absPose.transform(PxVec3(-halfHeight, 0, radius)), + absPose.transform(PxVec3(halfHeight, 0, radius))); + out.outputSegment(absPose.transform(PxVec3(-halfHeight, 0, -radius)), + absPose.transform(PxVec3(halfHeight, 0, -radius))); + + return *this; + } + +#if PX_VC +#pragma warning(pop) +#endif + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/common/PxSerialFramework.h b/Source/ThirdParty/PhysX/common/PxSerialFramework.h index 0dfd0668a..22bc3c32f 100644 --- a/Source/ThirdParty/PhysX/common/PxSerialFramework.h +++ b/Source/ThirdParty/PhysX/common/PxSerialFramework.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_COMMON_NX_SERIAL_FRAMEWORK -#define PX_PHYSICS_COMMON_NX_SERIAL_FRAMEWORK +#ifndef PX_SERIAL_FRAMEWORK_H +#define PX_SERIAL_FRAMEWORK_H /** \addtogroup common @{ @@ -48,6 +46,7 @@ class PxSerializationContext; class PxRepXSerializer; class PxSerializer; class PxPhysics; +class PxCollection; //! Default serialization alignment #define PX_SERIAL_ALIGN 16 @@ -256,7 +255,7 @@ public: */ PX_INLINE void alignExtraData(PxU32 alignment = PX_SERIAL_ALIGN) { - size_t addr = reinterpret_cast(mExtraDataAddress); + size_t addr = size_t(mExtraDataAddress); addr = (addr+alignment-1)&~size_t(alignment-1); mExtraDataAddress = reinterpret_cast(addr); } @@ -271,11 +270,13 @@ protected: /** \brief Callback type for exporting binary meta data for a serializable type. +\deprecated Binary conversion and binary meta data are deprecated. + @see PxSerializationRegistry::registerBinaryMetaDataCallback \param stream Stream to store binary meta data. */ -typedef void (*PxBinaryMetaDataCallback)(PxOutputStream& stream); +typedef PX_DEPRECATED void (*PxBinaryMetaDataCallback)(PxOutputStream& stream); /** \brief Class serving as a registry for XML (RepX) and binary serializable types. @@ -319,13 +320,15 @@ public: /** \brief Register binary meta data callback + \deprecated Binary conversion and binary meta data are deprecated. + The callback is executed when calling PxSerialization::dumpBinaryMetaData. \param callback PxBinaryMetaDataCallback to be registered. @see PxBinaryMetaDataCallback, PxSerialization::dumpBinaryMetaData */ - virtual void registerBinaryMetaDataCallback(PxBinaryMetaDataCallback callback) = 0; + PX_DEPRECATED virtual void registerBinaryMetaDataCallback(PxBinaryMetaDataCallback callback) = 0; /** \brief Returns PxSerializer corresponding to type diff --git a/Source/ThirdParty/PhysX/common/PxSerializer.h b/Source/ThirdParty/PhysX/common/PxSerializer.h index b68b302cd..538f937c3 100644 --- a/Source/ThirdParty/PhysX/common/PxSerializer.h +++ b/Source/ThirdParty/PhysX/common/PxSerializer.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,11 +22,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - #ifndef PX_SERIALIZER_H #define PX_SERIALIZER_H /** \addtogroup extensions @@ -36,9 +34,9 @@ #include "foundation/PxAssert.h" #include "foundation/PxAllocatorCallback.h" +#include "foundation/PxFoundation.h" #include "common/PxSerialFramework.h" #include "common/PxCollection.h" -#include "PxFoundation.h" #if !PX_DOXYGEN @@ -193,7 +191,7 @@ public: virtual void exportData(PxBase& obj, PxSerializationContext& s) const { - PxAllocatorCallback& allocator = PxGetFoundation().getAllocatorCallback(); + PxAllocatorCallback& allocator = *PxGetAllocatorCallback(); T* copy = reinterpret_cast(allocator.allocate(sizeof(T), "TmpAllocExportData", __FILE__, __LINE__)); PxMemCopy(copy, &obj, sizeof(T)); copy->preExportDataReset(); @@ -248,14 +246,14 @@ private: Note: that the allocator used for creation needs to match with the one used in PX_DELETE_SERIALIZER_ADAPTER. */ #define PX_NEW_SERIALIZER_ADAPTER(x) \ - *new( PxGetFoundation().getAllocatorCallback().allocate(sizeof(PxSerializerDefaultAdapter), \ + *new( PxGetAllocatorCallback()->allocate(sizeof(PxSerializerDefaultAdapter), \ "PxSerializerDefaultAdapter", __FILE__, __LINE__ )) PxSerializerDefaultAdapter(#x) /** \brief Preprocessor Macro to simplify adapter deletion. */ #define PX_DELETE_SERIALIZER_ADAPTER(x) \ - { PxSerializer* s = x; if (s) { s->~PxSerializer(); PxGetFoundation().getAllocatorCallback().deallocate(s); } } + { PxSerializer* s = x; if (s) { s->~PxSerializer(); PxGetAllocatorCallback()->deallocate(s); } } #if !PX_DOXYGEN } // namespace physx diff --git a/Source/ThirdParty/PhysX/common/PxStringTable.h b/Source/ThirdParty/PhysX/common/PxStringTable.h index 2af440040..f5cc13467 100644 --- a/Source/ThirdParty/PhysX/common/PxStringTable.h +++ b/Source/ThirdParty/PhysX/common/PxStringTable.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,11 +22,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - #ifndef PX_STRING_TABLE_H #define PX_STRING_TABLE_H diff --git a/Source/ThirdParty/PhysX/common/PxTolerancesScale.h b/Source/ThirdParty/PhysX/common/PxTolerancesScale.h index c34f5322e..43434818a 100644 --- a/Source/ThirdParty/PhysX/common/PxTolerancesScale.h +++ b/Source/ThirdParty/PhysX/common/PxTolerancesScale.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_SCALE_H -#define PX_SCALE_H +#ifndef PX_TOLERANCES_SCALE_H +#define PX_TOLERANCES_SCALE_H /** \addtogroup common @{ @@ -42,13 +40,11 @@ namespace physx { #endif -class PxPhysics; - /** \brief Class to define the scale at which simulation runs. Most simulation tolerances are calculated in terms of the values here. -\note if you change the simulation scale, you will probablly also wish to change the scene's +\note if you change the simulation scale, you will probably also wish to change the scene's default value of gravity, and stable simulation will probably require changes to the scene's bounceThreshold also. */ @@ -57,8 +53,8 @@ class PxTolerancesScale { public: - /** brief - The approximate size of objects in the simulation. + /** + \brief The approximate size of objects in the simulation. For simulating roughly human-sized in metric units, 1 is a good choice. If simulation is done in centimetres, use 100 instead. This is used to @@ -66,8 +62,8 @@ public: */ PxReal length; - /** brief - The typical magnitude of velocities of objects in simulation. This is used to estimate + /** + \brief The typical magnitude of velocities of objects in simulation. This is used to estimate whether a contact should be treated as bouncing or resting based on its impact velocity, and a kinetic energy threshold below which the simulation may put objects to sleep. @@ -78,8 +74,11 @@ public: /** \brief constructor sets to default + + \param[in] defaultLength Default length + \param[in] defaultSpeed Default speed */ - PX_INLINE PxTolerancesScale(); + PX_INLINE PxTolerancesScale(float defaultLength=1.0f, float defaultSpeed=10.0f); /** \brief Returns true if the descriptor is valid. @@ -89,9 +88,9 @@ public: }; -PX_INLINE PxTolerancesScale::PxTolerancesScale(): - length(1.0f), - speed(10.0f) +PX_INLINE PxTolerancesScale::PxTolerancesScale(float defaultLength, float defaultSpeed) : + length (defaultLength), + speed (defaultSpeed) { } diff --git a/Source/ThirdParty/PhysX/common/PxTypeInfo.h b/Source/ThirdParty/PhysX/common/PxTypeInfo.h index 72b3c2dd4..8a84b3cb4 100644 --- a/Source/ThirdParty/PhysX/common/PxTypeInfo.h +++ b/Source/ThirdParty/PhysX/common/PxTypeInfo.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_PHYSICS_COMMON_PX_TYPEINFO -#define PX_PHYSICS_COMMON_PX_TYPEINFO +#ifndef PX_TYPE_INFO_H +#define PX_TYPE_INFO_H /** \addtogroup common @{ @@ -58,22 +57,45 @@ struct PxConcreteType eHEIGHTFIELD, eCONVEX_MESH, - eTRIANGLE_MESH_BVH33, + eTRIANGLE_MESH_BVH33, // PX_DEPRECATED eTRIANGLE_MESH_BVH34, + eTETRAHEDRON_MESH, + eSOFTBODY_MESH, eRIGID_DYNAMIC, eRIGID_STATIC, eSHAPE, eMATERIAL, + eSOFTBODY_MATERIAL, + eCLOTH_MATERIAL, + ePBD_MATERIAL, + eFLIP_MATERIAL, + eMPM_MATERIAL, + eCUSTOM_MATERIAL, eCONSTRAINT, eAGGREGATE, - eARTICULATION, eARTICULATION_REDUCED_COORDINATE, eARTICULATION_LINK, - eARTICULATION_JOINT, eARTICULATION_JOINT_REDUCED_COORDINATE, + eARTICULATION_SENSOR, + eARTICULATION_SPATIAL_TENDON, + eARTICULATION_FIXED_TENDON, + eARTICULATION_ATTACHMENT, + eARTICULATION_TENDON_JOINT, ePRUNING_STRUCTURE, - eBVH_STRUCTURE, + eBVH, + eSOFT_BODY, + eSOFT_BODY_STATE, + ePBD_PARTICLESYSTEM, + eFLIP_PARTICLESYSTEM, + eMPM_PARTICLESYSTEM, + eCUSTOM_PARTICLESYSTEM, + eFEM_CLOTH, + eHAIR_SYSTEM, + ePARTICLE_BUFFER, + ePARTICLE_DIFFUSE_BUFFER, + ePARTICLE_CLOTH_BUFFER, + ePARTICLE_RIGID_BUFFER, ePHYSX_CORE_COUNT, eFIRST_PHYSX_EXTENSION = 256, @@ -100,10 +122,17 @@ template struct PxTypeInfo {}; PX_DEFINE_TYPEINFO(PxBase, PxConcreteType::eUNDEFINED) PX_DEFINE_TYPEINFO(PxMaterial, PxConcreteType::eMATERIAL) +PX_DEFINE_TYPEINFO(PxFEMSoftBodyMaterial, PxConcreteType::eSOFTBODY_MATERIAL) +PX_DEFINE_TYPEINFO(PxFEMClothMaterial, PxConcreteType::eCLOTH_MATERIAL) +PX_DEFINE_TYPEINFO(PxPBDMaterial, PxConcreteType::ePBD_MATERIAL) +PX_DEFINE_TYPEINFO(PxFLIPMaterial, PxConcreteType::eFLIP_MATERIAL) +PX_DEFINE_TYPEINFO(PxMPMMaterial, PxConcreteType::eMPM_MATERIAL) +PX_DEFINE_TYPEINFO(PxCustomMaterial, PxConcreteType::eCUSTOM_MATERIAL) PX_DEFINE_TYPEINFO(PxConvexMesh, PxConcreteType::eCONVEX_MESH) PX_DEFINE_TYPEINFO(PxTriangleMesh, PxConcreteType::eUNDEFINED) PX_DEFINE_TYPEINFO(PxBVH33TriangleMesh, PxConcreteType::eTRIANGLE_MESH_BVH33) PX_DEFINE_TYPEINFO(PxBVH34TriangleMesh, PxConcreteType::eTRIANGLE_MESH_BVH34) +PX_DEFINE_TYPEINFO(PxTetrahedronMesh, PxConcreteType::eTETRAHEDRON_MESH) PX_DEFINE_TYPEINFO(PxHeightField, PxConcreteType::eHEIGHTFIELD) PX_DEFINE_TYPEINFO(PxActor, PxConcreteType::eUNDEFINED) PX_DEFINE_TYPEINFO(PxRigidActor, PxConcreteType::eUNDEFINED) @@ -111,14 +140,24 @@ PX_DEFINE_TYPEINFO(PxRigidBody, PxConcreteType::eUNDEFINED) PX_DEFINE_TYPEINFO(PxRigidDynamic, PxConcreteType::eRIGID_DYNAMIC) PX_DEFINE_TYPEINFO(PxRigidStatic, PxConcreteType::eRIGID_STATIC) PX_DEFINE_TYPEINFO(PxArticulationLink, PxConcreteType::eARTICULATION_LINK) -PX_DEFINE_TYPEINFO(PxArticulationJoint, PxConcreteType::eARTICULATION_JOINT) PX_DEFINE_TYPEINFO(PxArticulationJointReducedCoordinate, PxConcreteType::eARTICULATION_JOINT_REDUCED_COORDINATE) -PX_DEFINE_TYPEINFO(PxArticulation, PxConcreteType::eARTICULATION) PX_DEFINE_TYPEINFO(PxArticulationReducedCoordinate, PxConcreteType::eARTICULATION_REDUCED_COORDINATE) PX_DEFINE_TYPEINFO(PxAggregate, PxConcreteType::eAGGREGATE) PX_DEFINE_TYPEINFO(PxConstraint, PxConcreteType::eCONSTRAINT) PX_DEFINE_TYPEINFO(PxShape, PxConcreteType::eSHAPE) PX_DEFINE_TYPEINFO(PxPruningStructure, PxConcreteType::ePRUNING_STRUCTURE) +PX_DEFINE_TYPEINFO(PxParticleSystem, PxConcreteType::eUNDEFINED) +PX_DEFINE_TYPEINFO(PxPBDParticleSystem, PxConcreteType::ePBD_PARTICLESYSTEM) +PX_DEFINE_TYPEINFO(PxFLIPParticleSystem, PxConcreteType::eFLIP_PARTICLESYSTEM) +PX_DEFINE_TYPEINFO(PxMPMParticleSystem, PxConcreteType::eMPM_PARTICLESYSTEM) +PX_DEFINE_TYPEINFO(PxCustomParticleSystem, PxConcreteType::eCUSTOM_PARTICLESYSTEM) +PX_DEFINE_TYPEINFO(PxSoftBody, PxConcreteType::eSOFT_BODY) +PX_DEFINE_TYPEINFO(PxFEMCloth, PxConcreteType::eFEM_CLOTH) +PX_DEFINE_TYPEINFO(PxHairSystem, PxConcreteType::eHAIR_SYSTEM) +PX_DEFINE_TYPEINFO(PxParticleBuffer, PxConcreteType::ePARTICLE_BUFFER) +PX_DEFINE_TYPEINFO(PxParticleAndDiffuseBuffer, PxConcreteType::ePARTICLE_DIFFUSE_BUFFER) +PX_DEFINE_TYPEINFO(PxParticleClothBuffer, PxConcreteType::ePARTICLE_CLOTH_BUFFER) +PX_DEFINE_TYPEINFO(PxParticleRigidBuffer, PxConcreteType::ePARTICLE_RIGID_BUFFER) #if !PX_DOXYGEN } // namespace physx diff --git a/Source/ThirdParty/PhysX/common/windows/PxWindowsDelayLoadHook.h b/Source/ThirdParty/PhysX/common/windows/PxWindowsDelayLoadHook.h index 5a7b178d4..433b981ec 100644 --- a/Source/ThirdParty/PhysX/common/windows/PxWindowsDelayLoadHook.h +++ b/Source/ThirdParty/PhysX/common/windows/PxWindowsDelayLoadHook.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_DELAY_LOAD_HOOK -#define PX_PHYSICS_DELAY_LOAD_HOOK +#ifndef PX_WINDOWS_DELAY_LOAD_HOOK_H +#define PX_WINDOWS_DELAY_LOAD_HOOK_H #include "foundation/PxPreprocessor.h" #include "common/PxPhysXCommonConfig.h" diff --git a/Source/ThirdParty/PhysX/cooking/PxBVH33MidphaseDesc.h b/Source/ThirdParty/PhysX/cooking/PxBVH33MidphaseDesc.h index 25e3e137b..4642746a7 100644 --- a/Source/ThirdParty/PhysX/cooking/PxBVH33MidphaseDesc.h +++ b/Source/ThirdParty/PhysX/cooking/PxBVH33MidphaseDesc.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,11 +22,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - #ifndef PX_BVH_33_MIDPHASE_DESC_H #define PX_BVH_33_MIDPHASE_DESC_H /** \addtogroup cooking @@ -42,8 +40,11 @@ namespace physx { #endif -/** \brief Enumeration for mesh cooking hints. */ -struct PxMeshCookingHint +/** + * \brief Enumeration for mesh cooking hints. + * @deprecated + */ +struct PX_DEPRECATED PxMeshCookingHint { enum Enum { @@ -57,8 +58,9 @@ struct PxMeshCookingHint \brief Structure describing parameters affecting BVH33 midphase mesh structure. @see PxCookingParams, PxMidphaseDesc +@deprecated */ -struct PxBVH33MidphaseDesc +struct PX_DEPRECATED PxBVH33MidphaseDesc { /** \brief Controls the trade-off between mesh size and runtime performance. @@ -107,4 +109,5 @@ struct PxBVH33MidphaseDesc /** @} */ -#endif // PX_BVH_33_MIDPHASE_DESC_H +#endif + diff --git a/Source/ThirdParty/PhysX/cooking/PxBVH34MidphaseDesc.h b/Source/ThirdParty/PhysX/cooking/PxBVH34MidphaseDesc.h index 2c9933c45..100941874 100644 --- a/Source/ThirdParty/PhysX/cooking/PxBVH34MidphaseDesc.h +++ b/Source/ThirdParty/PhysX/cooking/PxBVH34MidphaseDesc.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,11 +22,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - #ifndef PX_BVH_34_MIDPHASE_DESC_H #define PX_BVH_34_MIDPHASE_DESC_H /** \addtogroup cooking @@ -42,6 +40,22 @@ namespace physx { #endif +/** +\brief Desired build strategy for PxMeshMidPhase::eBVH34 +*/ +struct PxBVH34BuildStrategy +{ + enum Enum + { + eFAST = 0, //!< Fast build strategy. Fast build speed, good runtime performance in most cases. Recommended for runtime mesh cooking. + eDEFAULT = 1, //!< Default build strategy. Medium build speed, good runtime performance in all cases. + eSAH = 2, //!< SAH build strategy. Slower builds, slightly improved runtime performance in some cases. + + eLAST + }; +}; + + /** \brief Structure describing parameters affecting BVH34 midphase mesh structure. @@ -57,16 +71,39 @@ struct PxBVH34MidphaseDesc smaller mesh sizes, but with worse runtime performance. Default value: 4 - Range: <4, 15> + Range: <2, 15> */ PxU32 numPrimsPerLeaf; + /** + \brief Desired build strategy for the BVH + + Default value: eDEFAULT + */ + PxBVH34BuildStrategy::Enum buildStrategy; + + /** + \brief Whether the tree should be quantized or not + + Quantized trees use up less memory, but the runtime dequantization (to retrieve the node bounds) might have + a measurable performance cost. In most cases the cost is too small to matter, and using less memory is more + important. Hence, the default is true. + + One important use case for non-quantized trees is deformable meshes. The refit function for the BVH is not + supported for quantized trees. + + Default value: true + */ + bool quantized; + /** \brief Desc initialization to default value. */ void setToDefault() { numPrimsPerLeaf = 4; + buildStrategy = PxBVH34BuildStrategy::eDEFAULT; + quantized = true; } /** @@ -75,7 +112,7 @@ struct PxBVH34MidphaseDesc */ bool isValid() const { - if(numPrimsPerLeaf < 4 || numPrimsPerLeaf > 15) + if(numPrimsPerLeaf < 2 || numPrimsPerLeaf > 15) return false; return true; } @@ -87,4 +124,5 @@ struct PxBVH34MidphaseDesc /** @} */ -#endif // PX_BVH_34_MIDPHASE_DESC_H +#endif + diff --git a/Source/ThirdParty/PhysX/cooking/PxBVHStructureDesc.h b/Source/ThirdParty/PhysX/cooking/PxBVHDesc.h similarity index 59% rename from Source/ThirdParty/PhysX/cooking/PxBVHStructureDesc.h rename to Source/ThirdParty/PhysX/cooking/PxBVHDesc.h index 62ff9de19..4a0aec9ad 100644 --- a/Source/ThirdParty/PhysX/cooking/PxBVHStructureDesc.h +++ b/Source/ThirdParty/PhysX/cooking/PxBVHDesc.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,21 +22,20 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_BVH_STRUCTURE_DESC_H -#define PX_BVH_STRUCTURE_DESC_H +#ifndef PX_BVH_DESC_H +#define PX_BVH_DESC_H /** \addtogroup cooking @{ */ #include "common/PxCoreUtilityTypes.h" -#include "common/PxPhysXCommonConfig.h" #include "foundation/PxTransform.h" #include "foundation/PxBounds3.h" +#include "geometry/PxBVHBuildStrategy.h" #if !PX_DOXYGEN namespace physx @@ -45,15 +43,14 @@ namespace physx #endif /** +\brief Descriptor class for #PxBVH. -\brief Descriptor class for #PxBVHStructure. - -@see PxBVHStructure +@see PxBVH */ -class PxBVHStructureDesc +class PxBVHDesc { public: - PX_INLINE PxBVHStructureDesc(); + PX_INLINE PxBVHDesc(); /** \brief Pointer to first bounding box. @@ -61,7 +58,38 @@ public: PxBoundedData bounds; /** - \brief Initialize the BVH structure descriptor + \brief Bounds enlargement + + Passed bounds are slightly enlarged before creating the BVH. This is done to avoid numerical issues when + e.g. raycasts just graze the bounds. The performed operation is: + + extents = (bounds.maximum - bounds.minimum)/2 + enlagedBounds.minimum = passedBounds.minium - extents * enlargement + enlagedBounds.maximum = passedBounds.maxium + extents * enlargement + + Users can pass pre-enlarged bounds to the BVH builder, in which case just set the enlargement value to zero. + + Default value: 0.01 + */ + float enlargement; + + /** + \brief Max primitives per leaf limit. + + Range: [0, 16)
+ Default value: 4 + */ + PxU32 numPrimsPerLeaf; + + /** + \brief Desired build strategy for the BVH + + Default value: eDEFAULT + */ + PxBVHBuildStrategy::Enum buildStrategy; + + /** + \brief Initialize the BVH descriptor */ PX_INLINE void setToDefault(); @@ -71,39 +99,46 @@ public: */ PX_INLINE bool isValid() const; - protected: }; - - -PX_INLINE PxBVHStructureDesc::PxBVHStructureDesc() +PX_INLINE PxBVHDesc::PxBVHDesc() : enlargement(0.01f), numPrimsPerLeaf(4), buildStrategy(PxBVHBuildStrategy::eDEFAULT) { } -PX_INLINE void PxBVHStructureDesc::setToDefault() +PX_INLINE void PxBVHDesc::setToDefault() { - *this = PxBVHStructureDesc(); + *this = PxBVHDesc(); } -PX_INLINE bool PxBVHStructureDesc::isValid() const +PX_INLINE bool PxBVHDesc::isValid() const { // Check BVH desc data if(!bounds.data) return false; - if(bounds.stride < sizeof(PxBounds3)) //should be at least one point's worth of data + if(bounds.stride < sizeof(PxBounds3)) //should be at least one bounds' worth of data return false; if(bounds.count == 0) return false; + if(enlargement<0.0f) + return false; + + if(numPrimsPerLeaf>=16) + return false; + return true; } + /** + * @deprecated + */ + typedef PX_DEPRECATED PxBVHDesc PxBVHStructureDesc; + #if !PX_DOXYGEN } // namespace physx #endif - /** @} */ -#endif // PX_BVH_STRUCTURE_DESC_H +#endif diff --git a/Source/ThirdParty/PhysX/cooking/PxConvexMeshDesc.h b/Source/ThirdParty/PhysX/cooking/PxConvexMeshDesc.h index 8aa939f74..390e2636e 100644 --- a/Source/ThirdParty/PhysX/cooking/PxConvexMeshDesc.h +++ b/Source/ThirdParty/PhysX/cooking/PxConvexMeshDesc.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_COLLISION_NXCONVEXMESHDESC -#define PX_COLLISION_NXCONVEXMESHDESC +#ifndef PX_CONVEX_MESH_DESC_H +#define PX_CONVEX_MESH_DESC_H /** \addtogroup cooking @{ */ @@ -38,12 +36,12 @@ #include "foundation/PxFlags.h" #include "common/PxCoreUtilityTypes.h" #include "geometry/PxConvexMesh.h" +#include "PxSDFDesc.h" #if !PX_DOXYGEN namespace physx { #endif - /** \brief Flags which describe the format and behavior of a convex mesh. */ @@ -121,8 +119,8 @@ struct PxConvexFlag eFAST_INERTIA_COMPUTATION = (1 << 6), /** - \brief Convex hulls are created with respect to GPU simulation limitations. Vertex limit is set to 64 and - vertex limit per face is internally set to 32. + \brief Convex hulls are created with respect to GPU simulation limitations. Vertex limit and polygon limit + is set to 64 and vertex limit per face is internally set to 32. \note Can be used only with eCOMPUTE_CONVEX flag. */ eGPU_COMPATIBLE = (1 << 7), @@ -148,6 +146,8 @@ PX_FLAGS_OPERATORS(PxConvexFlag::Enum,PxU16) /** \brief Descriptor class for #PxConvexMesh. \note The number of vertices and the number of convex polygons in a cooked convex mesh is limited to 256. +\note The number of vertices and the number of convex polygons in a GPU compatible convex mesh is limited to 64, +and the number of faces per vertex is limited to 32. @see PxConvexMesh PxConvexMeshGeometry PxShape PxPhysics.createConvexMesh() @@ -193,19 +193,31 @@ public: PxConvexFlags flags; /** - \brief Limits the number of vertices of the result convex mesh. Hard maximum limit is 256 + \brief Limits the number of vertices of the result convex mesh. Hard maximum limit is 255 and minimum limit is 4 if PxConvexFlag::ePLANE_SHIFTING is used, otherwise the minimum limit is 8. \note Vertex limit is only used when PxConvexFlag::eCOMPUTE_CONVEX is specified. \note The please see PxConvexFlag::ePLANE_SHIFTING for algorithm explanation + \note The maximum limit for GPU compatible convex meshes is 64. @see PxConvexFlag::ePLANE_SHIFTING Range: [4, 255]
Default: 255 */ - PxU16 vertexLimit; + PxU16 vertexLimit; + + /** + \brief Limits the number of polygons of the result convex mesh. Hard maximum limit is 255 + and minimum limit is 4. + + \note The maximum limit for GPU compatible convex meshes is 64. + + Range: [4, 255]
+ Default: 255 + */ + PxU16 polygonLimit; /** \brief Maximum number of vertices after quantization. The quantization is done during the vertex cleaning phase. @@ -218,6 +230,13 @@ public: */ PxU16 quantizedCount; + /** + \brief SDF descriptor. When this descriptor is set, signed distance field is calculated for this convex mesh. + + Default: NULL + */ + PxSDFDesc* sdfDesc; + /** \brief constructor sets to default. */ @@ -226,6 +245,8 @@ public: \brief (re)sets the structure to the default. */ PX_INLINE void setToDefault(); + + /** \brief Returns true if the descriptor is valid. @@ -235,8 +256,9 @@ public: }; PX_INLINE PxConvexMeshDesc::PxConvexMeshDesc() //constructor sets to default -: vertexLimit(255), quantizedCount(255) +: vertexLimit(255), polygonLimit(255), quantizedCount(255), sdfDesc(NULL) { + } PX_INLINE void PxConvexMeshDesc::setToDefault() @@ -292,10 +314,26 @@ PX_INLINE bool PxConvexMeshDesc::isValid() const return false; } - if(vertexLimit > 256) + if(vertexLimit > 255) { return false; } + + if (polygonLimit < 4) + { + return false; + } + + if (polygonLimit > 255) + { + return false; + } + + if (sdfDesc && !sdfDesc->isValid()) + { + return false; + } + return true; } diff --git a/Source/ThirdParty/PhysX/cooking/PxCooking.h b/Source/ThirdParty/PhysX/cooking/PxCooking.h index 94b492770..0ed9b93a1 100644 --- a/Source/ThirdParty/PhysX/cooking/PxCooking.h +++ b/Source/ThirdParty/PhysX/cooking/PxCooking.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,11 +22,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - #ifndef PX_COOKING_H #define PX_COOKING_H /** \addtogroup cooking @@ -39,18 +37,22 @@ #include "cooking/PxConvexMeshDesc.h" #include "cooking/PxTriangleMeshDesc.h" +#include "cooking/PxTetrahedronMeshDesc.h" #include "cooking/PxMidphaseDesc.h" -#include "cooking/PxBVHStructureDesc.h" +#include "cooking/PxBVHDesc.h" #include "geometry/PxTriangleMesh.h" -#include "geometry/PxBVHStructure.h" +#include "geometry/PxTetrahedronMesh.h" +#include "geometry/PxBVH.h" #if !PX_DOXYGEN namespace physx { #endif -class PxPhysicsInsertionCallback; +class PxInsertionCallback; class PxFoundation; +class PxAllocatorCallback; +class PxHeightFieldDesc; /** \brief Result from convex cooking. @@ -126,11 +128,8 @@ struct PxTriangleMeshCookingResult }; /** - \brief Enum for the set of mesh pre-processing parameters. - */ - struct PxMeshPreprocessingFlag { enum Enum @@ -138,7 +137,7 @@ struct PxMeshPreprocessingFlag /** \brief When set, mesh welding is performed. See PxCookingParams::meshWeldTolerance. Clean mesh must be enabled. */ - eWELD_VERTICES = 1 << 0, + eWELD_VERTICES = 1 << 0, /** \brief When set, mesh cleaning is disabled. This makes cooking faster. @@ -148,26 +147,36 @@ struct PxMeshPreprocessingFlag It is recommended to use only meshes that passed during validateTriangleMesh. */ - eDISABLE_CLEAN_MESH = 1 << 1, + eDISABLE_CLEAN_MESH = 1 << 1, /** \brief When set, active edges are set for each triangle edge. This makes cooking faster but slow up contact generation. */ - eDISABLE_ACTIVE_EDGES_PRECOMPUTE = 1 << 2, + eDISABLE_ACTIVE_EDGES_PRECOMPUTE = 1 << 2, /** \brief When set, 32-bit indices will always be created regardless of triangle count. \note By default mesh will be created with 16-bit indices for triangle count <= 0xFFFF and 32-bit otherwise. */ - eFORCE_32BIT_INDICES = 1 << 3 + eFORCE_32BIT_INDICES = 1 << 3, + + /** + \brief When set, a list of triangles will be created for each associated vertex in the mesh + */ + eENABLE_VERT_MAPPING = 1 << 4, + + /** + \brief When set, inertia tensor is calculated for the mesh + */ + eENABLE_INERTIA = 1 << 5 + }; }; typedef PxFlags PxMeshPreprocessingFlags; /** - \brief Structure describing parameters affecting mesh cooking. @see PxSetCookingParams() PxGetCookingParams() @@ -281,7 +290,7 @@ struct PxCookingParams @see PxBVH33MidphaseDesc, PxBVH34MidphaseDesc, PxMidphaseDesc - Default value: PxMeshMidPhase::eBVH33 + Default value: PxMeshMidPhase::eBVH34 */ PxMidphaseDesc midphaseDesc; @@ -294,6 +303,15 @@ struct PxCookingParams */ PxU32 gaussMapLimit; + /** + \brief Maximum mass ratio allowed on vertices touched by a single tet. If a any tetrahedron exceeds the mass ratio, the masses will get smoothed locally + until the maximum mass ratio is matched. Value should not be below 1. Smoothing might not fully converge for values <1.5. The smaller the maximum + allowed ratio, the better the stability during simulation. + + Default value: FLT_MAX + */ + PxReal maxWeightRatioInTet; + PxCookingParams(const PxTolerancesScale& sc): areaTestEpsilon (0.06f*sc.length*sc.length), planeTolerance (0.0007f), @@ -304,12 +322,18 @@ struct PxCookingParams scale (sc), meshPreprocessParams (0), meshWeldTolerance (0.f), - gaussMapLimit (32) + gaussMapLimit (32), + maxWeightRatioInTet (FLT_MAX) { } }; -class PxCooking +/** +\brief Provides methods to cook (where cooking means to prepare the data and convert it to the right format +potentially including the construction of acceleration structures and other support data) all kind of simulation data +@deprecated +*/ +class PX_DEPRECATED PxCooking { public: /** @@ -320,7 +344,7 @@ public: \note This function is required to be called to release foundation usage. */ - virtual void release() = 0; + virtual void release() = 0; /** \brief Sets cooking parameters @@ -329,7 +353,7 @@ public: @see getParams() */ - virtual void setParams(const PxCookingParams& params) = 0; + virtual void setParams(const PxCookingParams& params) = 0; /** \brief Gets cooking parameters @@ -338,14 +362,14 @@ public: @see PxCookingParams setParams() */ - virtual const PxCookingParams& getParams() const = 0; + virtual const PxCookingParams& getParams() const = 0; /** \brief Checks endianness is the same between cooking & target platforms \return True if there is and endian mismatch. */ - virtual bool platformMismatch() const = 0; + virtual bool platformMismatch() const = 0; /** \brief Cooks a triangle mesh. The results are written to the stream. @@ -356,29 +380,50 @@ public: cookTriangleMesh() allows a mesh description to be cooked into a binary stream suitable for loading and performing collision detection at runtime. - \param[in] desc The triangle mesh descriptor to read the mesh from. - \param[in] stream User stream to output the cooked data. - \param[out] condition Result from triangle mesh cooking. + \param[in] desc The triangle mesh descriptor to read the mesh from. + \param[in] stream User stream to output the cooked data. + \param[out] condition Result from triangle mesh cooking. \return true on success @see cookConvexMesh() setParams() PxPhysics.createTriangleMesh() PxTriangleMeshCookingResult::Enum */ - virtual bool cookTriangleMesh(const PxTriangleMeshDesc& desc, PxOutputStream& stream, PxTriangleMeshCookingResult::Enum* condition = NULL) const = 0; - + virtual bool cookTriangleMesh(const PxTriangleMeshDesc& desc, PxOutputStream& stream, PxTriangleMeshCookingResult::Enum* condition = NULL) const = 0; /** - \brief Cooks and creates a triangle mesh and inserts it into PxPhysics. + \brief Cooks and creates a triangle mesh without going through a stream. - \note PxPhysicsInsertionCallback can be obtained through PxPhysics::getPhysicsInsertionCallback(). + \note This method does the same as cookTriangleMesh, but the produced mesh is not stored + into a stream but is either directly inserted in PxPhysics, or created as a standalone + object. Use this method if you are unable to cook offline. - \param[in] desc The triangle mesh descriptor to read the mesh from. - \param[in] insertionCallback The insertion interface from PxPhysics. - \param[out] condition Result from triangle mesh cooking. + \note PxInsertionCallback can be obtained through PxPhysics::getPhysicsInsertionCallback() + or PxCooking::getStandaloneInsertionCallback(). + + \param[in] desc The triangle mesh descriptor to read the mesh from. + \param[in] insertionCallback The insertion interface from PxPhysics. + \param[out] condition Result from triangle mesh cooking. \return PxTriangleMesh pointer on success. - @see cookTriangleMesh() setParams() PxPhysics.createTriangleMesh() PxPhysicsInsertionCallback + @see cookTriangleMesh() setParams() PxPhysics.createTriangleMesh() PxInsertionCallback */ - virtual PxTriangleMesh* createTriangleMesh(const PxTriangleMeshDesc& desc, PxPhysicsInsertionCallback& insertionCallback, PxTriangleMeshCookingResult::Enum* condition = NULL) const = 0; + virtual PxTriangleMesh* createTriangleMesh(const PxTriangleMeshDesc& desc, PxInsertionCallback& insertionCallback, PxTriangleMeshCookingResult::Enum* condition = NULL) const = 0; + + /** + \brief Cooks and creates a triangle mesh without going through a stream. Convenience function for standalone objects. + + \note This method does the same as cookTriangleMesh, but the produced mesh is not stored + into a stream but is either directly inserted in PxPhysics, or created as a standalone + object. Use this method if you are unable to cook offline. + \return PxTriangleMesh pointer on success. + + \param[in] desc The triangle mesh descriptor to read the mesh from. + + @see cookTriangleMesh() PxPhysics.createTriangleMesh() PxInsertionCallback + */ + PX_FORCE_INLINE PxTriangleMesh* createTriangleMesh(const PxTriangleMeshDesc& desc) const + { + return createTriangleMesh(desc, const_cast(*this).getStandaloneInsertionCallback()); + } /** \brief Verifies if the triangle mesh is valid. Prints an error message for each inconsistency found. @@ -387,7 +432,7 @@ public: 1. There are no duplicate vertices (within specified vertexWeldTolerance. See PxCookingParams::meshWeldTolerance) 2. There are no large triangles (within specified PxTolerancesScale.) - \param[in] desc The triangle mesh descriptor to read the mesh from. + \param[in] desc The triangle mesh descriptor to read the mesh from. \return true if all the validity conditions hold, false otherwise. @@ -395,6 +440,202 @@ public: */ virtual bool validateTriangleMesh(const PxTriangleMeshDesc& desc) const = 0; + /** + \brief Cooks a softbody mesh. The results are written to the stream. + + To create a softbody mesh object it is necessary to first 'cook' the mesh data into + a form which allows the SDK to perform efficient collision detection and to store data + used during the FEM calculations. + + cookSoftBodyMesh() allows a mesh description to be cooked into a binary stream + suitable for loading and performing collision detection at runtime. + + Example + + \param[in] simulationMeshDesc The tetrahedron mesh descriptor to read the simulation mesh from. + \param[in] collisionMeshDesc The tetrahedron mesh descriptor to read the collision mesh from. + \param[in] softbodyDataDesc The softbody data descriptor to read mapping information from. + \param[in] stream User stream to output the cooked data. + \return true on success + + @see cookConvexMesh() setParams() PxPhysics.createTriangleMesh() PxTriangleMeshCookingResult::Enum + */ + virtual bool cookSoftBodyMesh(const PxTetrahedronMeshDesc& simulationMeshDesc, const PxTetrahedronMeshDesc& collisionMeshDesc, + const PxSoftBodySimulationDataDesc& softbodyDataDesc, PxOutputStream& stream) const = 0; + + /** + \brief Cooks and creates a softbody mesh without going through a stream. + + \note This method does the same as cookSoftBodyMesh, but the produced mesh is not stored + into a stream but is either directly inserted in PxPhysics, or created as a standalone + object. Use this method if you are unable to cook offline. + + \note PxInsertionCallback can be obtained through PxPhysics::getPhysicsInsertionCallback() + or PxCooking::getStandaloneInsertionCallback(). + + \param[in] simulationMeshDesc The tetrahedron mesh descriptor to read the simulation mesh from. + \param[in] collisionMeshDesc The tetrahedron mesh descriptor to read the collision mesh from. + \param[in] softbodyDataDesc The softbody data descriptor to read mapping information from. + \param[in] insertionCallback The insertion interface from PxPhysics. + \return PxSoftBodyMesh pointer on success. + + @see cookTriangleMesh() setParams() PxPhysics.createTriangleMesh() PxInsertionCallback + */ + virtual PxSoftBodyMesh* createSoftBodyMesh(const PxTetrahedronMeshDesc& simulationMeshDesc, const PxTetrahedronMeshDesc& collisionMeshDesc, + const PxSoftBodySimulationDataDesc& softbodyDataDesc, PxInsertionCallback& insertionCallback) const = 0; + + + /** + \brief Cooks and creates a softbody mesh without going through a stream. Convenience function for standalone objects. + + \note This method does the same as cookSoftBodyMesh, but the produced mesh is not stored + into a stream but is either directly inserted in PxPhysics, or created as a standalone + object. Use this method if you are unable to cook offline. + + \param[in] simulationMeshDesc The tetrahedron mesh descriptor to read the simulation mesh from. + \param[in] collisionMeshDesc The tetrahedron mesh descriptor to read the collision mesh from. + \param[in] softbodyDataDesc The softbody data descriptor to read mapping information from. + \return PxSoftBodyMesh pointer on success. + + @see cookTriangleMesh() PxPhysics.createTriangleMesh() PxInsertionCallback + */ + PX_FORCE_INLINE PxSoftBodyMesh* createSoftBodyMesh(const PxTetrahedronMeshDesc& simulationMeshDesc, const PxTetrahedronMeshDesc& collisionMeshDesc, + const PxSoftBodySimulationDataDesc& softbodyDataDesc) const + { + return createSoftBodyMesh(simulationMeshDesc, collisionMeshDesc, softbodyDataDesc, const_cast(*this).getStandaloneInsertionCallback()); + } + + /** + \brief Cooks a tetrahedron mesh. The results are written to the stream. + + To create a tetrahedron mesh object it is necessary to first 'cook' the mesh data into + a form which allows the SDK to perform efficient collision detection. + + cookTriangleMesh() allows a mesh description to be cooked into a binary stream + suitable for loading and performing collision detection at runtime. + + Example + + \param[in] meshDesc The tetrahedron mesh descriptor to read the mesh from. + \param[in] stream User stream to output the cooked data. + \return true on success + + @see cookConvexMesh() setParams() PxPhysics.createTetrahedronMesh() + */ + virtual bool cookTetrahedronMesh(const PxTetrahedronMeshDesc& meshDesc, PxOutputStream& stream) const = 0; + + /** + \brief Cooks and creates a tetrahedron mesh without going through a stream. + + \note This method does the same as cookTetrahedronMesh, but the produced mesh is not stored + into a stream but is either directly inserted in PxPhysics, or created as a standalone + object. Use this method if you are unable to cook offline. + + \note PxInsertionCallback can be obtained through PxPhysics::getPhysicsInsertionCallback() + or PxCooking::getStandaloneInsertionCallback(). + + \param[in] meshDesc The tetrahedron mesh descriptor to read the mesh from. + \param[in] insertionCallback The insertion interface from PxPhysics. + \return PxTetrahedronMesh pointer on success. + + @see cookTetrahedronMesh() setParams() PxInsertionCallback + */ + virtual PxTetrahedronMesh* createTetrahedronMesh(const PxTetrahedronMeshDesc& meshDesc, PxInsertionCallback& insertionCallback) const = 0; + + + /** + \brief Cooks and creates a tetrahedron mesh without going through a stream. Convenience function for standalone objects. + + \note This method does the same as cookTetrahedronMesh, but the produced mesh is not stored + into a stream but is either directly inserted in PxPhysics, or created as a standalone + object. Use this method if you are unable to cook offline. + + \param[in] meshDesc The tetrahedron mesh descriptor to read the mesh from. + \return PxTetrahedronMesh pointer on success. + + @see cookTetrahedronMesh() PxInsertionCallback + */ + PX_FORCE_INLINE PxTetrahedronMesh* createTetrahedronMesh(const PxTetrahedronMeshDesc& meshDesc) const + { + return createTetrahedronMesh(meshDesc, const_cast(*this).getStandaloneInsertionCallback()); + } + + /** + \brief Computes the mapping between collision and simulation mesh + + The softbody deformation is computed on the simulation mesh. To deform the collision mesh accordingly + it needs to be specified how its vertices need to be placed and updated inside the deformation mesh. + This method computes that embedding information. + + \param[in] simulationMesh A tetrahedral mesh that defines the shape of the simulation mesh which is used to compute the body's deformation + \param[in] collisionMesh A tetrahedral mesh that defines the shape of the collision mesh which is used for collision detection + \param[in] collisionData A data container that contains acceleration structures and surface information of the collision mesh + \param[in] vertexToTet Optional indices (array of integers) that specifies the index of the tetrahedron in the simulation mesh that + contains a collision mesh vertex. If not provided, the embedding will be computed internally. If the simulation mesh is obtained from + PxTetMaker::createVoxelTetrahedronMesh, then the vertexToTet map createVoxelTetrahedronMesh returned should be used here. + \return PxCollisionMeshMappingData pointer that describes how the collision mesh is embedded into the simulation mesh + + @see PxTetMaker::createVoxelTetrahedronMesh + */ + virtual PxCollisionMeshMappingData* computeModelsMapping(PxTetrahedronMeshData& simulationMesh, const PxTetrahedronMeshData& collisionMesh, + const PxSoftBodyCollisionData& collisionData, const PxBoundedData* vertexToTet = NULL) const = 0; + + /** + \brief Computes data to accelerate collision detection of tetrahedral meshes + + Computes data structures to speed up collision detection with tetrahedral meshes. + + \param[in] collisionMeshDesc Raw tetrahedral mesh descriptor wich will be used for collision detection + \return PxCollisionTetrahedronMeshData pointer that describes the collision mesh + + */ + virtual PxCollisionTetrahedronMeshData* computeCollisionData(const PxTetrahedronMeshDesc& collisionMeshDesc) const = 0; + + /** + \brief Computes data to accelerate collision detection of tetrahedral meshes + + Computes data to compute and store a softbody's deformation using FEM. + + \param[in] simulationMeshDesc Raw tetrahedral mesh descriptor wich will be used for FEM simulation + \return PxSimulationTetrahedronMeshData pointer that describes the simulation mesh + + */ + virtual PxSimulationTetrahedronMeshData* computeSimulationData(const PxTetrahedronMeshDesc& simulationMeshDesc) const = 0; + + /** + \brief Bundles all data required for softbody simulation + + Creates a container that provides everything to create a PxSoftBody + + \param[in] simulationMesh The geometry (tetrahedral mesh) to be used as simulation mesh + \param[in] simulationData Additional non-tetmesh data that contains mass information etc. for the simulation mesh + \param[in] collisionMesh The geometry (tetrahedral mesh) to be used for collision detection + \param[in] collisionData Additional non-tetmesh data that contains surface information, acceleration structures etc. for the simulation mesh + \param[in] mappingData Mapping that describes how the collision mesh's vertices are embedded into the simulation mesh + \param[in] insertionCallback The insertion interface from PxPhysics. + \return PxSoftBodyMesh pointer that represents a softbody mesh bundling all data (simulation mesh, collision mesh etc.) + + @see PxSoftBody createSoftBody() + */ + virtual PxSoftBodyMesh* assembleSoftBodyMesh(PxTetrahedronMeshData& simulationMesh, PxSoftBodySimulationData& simulationData, PxTetrahedronMeshData& collisionMesh, + PxSoftBodyCollisionData& collisionData, PxCollisionMeshMappingData& mappingData, PxInsertionCallback& insertionCallback) const = 0; + + /** + \brief Bundles all data required for softbody simulation + + Creates a container that provides everything to create a PxSoftBody + + \param[in] simulationMesh Container that provides all information about the simulation mesh (geometry, mass distribution etc.) + \param[in] collisionMesh Container that provides all information about the collision mesh (geometry, surface information, acceleration structures etc.) + \param[in] mappingData Mapping that describes how the collision mesh's vertices are embedded into the simulation mesh + \param[in] insertionCallback The insertion interface from PxPhysics. + \return PxSoftBodyMesh pointer that represents a softbody mesh bundling all data (simulation mesh, collision mesh etc.) + + @see PxSoftBody createSoftBody() + */ + virtual PxSoftBodyMesh* assembleSoftBodyMesh(PxSimulationTetrahedronMeshData& simulationMesh, PxCollisionTetrahedronMeshData& collisionMesh, + PxCollisionMeshMappingData& mappingData, PxInsertionCallback& insertionCallback) const = 0; + /** \brief Cooks a convex mesh. The results are written to the stream. @@ -408,9 +649,9 @@ public: \note The number of vertices and the number of convex polygons in a cooked convex mesh is limited to 255. \note If those limits are exceeded in either the user-provided data or the final cooked mesh, an error is reported. - \param[in] desc The convex mesh descriptor to read the mesh from. - \param[in] stream User stream to output the cooked data. - \param[out] condition Result from convex mesh cooking. + \param[in] desc The convex mesh descriptor to read the mesh from. + \param[in] stream User stream to output the cooked data. + \param[out] condition Result from convex mesh cooking. \return true on success. @see cookTriangleMesh() setParams() PxConvexMeshCookingResult::Enum @@ -418,21 +659,41 @@ public: virtual bool cookConvexMesh(const PxConvexMeshDesc& desc, PxOutputStream& stream, PxConvexMeshCookingResult::Enum* condition = NULL) const = 0; /** - \brief Cooks and creates a convex mesh and inserts it into PxPhysics. + \brief Cooks and creates a convex mesh without going through a stream. - \note This method does the same as cookConvexMesh, but the produced convex mesh is not stored - into a stream but is directly inserted in PxPhysics. Use this method if you are unable to cook offline. + \note This method does the same as cookConvexMesh, but the produced mesh is not stored + into a stream but is either directly inserted in PxPhysics, or created as a standalone + object. Use this method if you are unable to cook offline. - \note PxPhysicsInsertionCallback can be obtained through PxPhysics::getPhysicsInsertionCallback(). + \note PxInsertionCallback can be obtained through PxPhysics::getPhysicsInsertionCallback() + or PxCooking::getStandaloneInsertionCallback(). - \param[in] desc The convex mesh descriptor to read the mesh from. - \param[in] insertionCallback The insertion interface from PxPhysics. - \param[out] condition Result from convex mesh cooking. + \param[in] desc The convex mesh descriptor to read the mesh from. + \param[in] insertionCallback The insertion interface from PxPhysics. + \param[out] condition Result from convex mesh cooking. \return PxConvexMesh pointer on success - @see cookConvexMesh() setParams() PxPhysicsInsertionCallback + @see cookConvexMesh() setParams() PxInsertionCallback */ - virtual PxConvexMesh* createConvexMesh(const PxConvexMeshDesc& desc, PxPhysicsInsertionCallback& insertionCallback, PxConvexMeshCookingResult::Enum* condition = NULL) const = 0; + virtual PxConvexMesh* createConvexMesh(const PxConvexMeshDesc& desc, PxInsertionCallback& insertionCallback, PxConvexMeshCookingResult::Enum* condition = NULL) const = 0; + + + /** + \brief Cooks and creates a convex mesh without going through a stream. Convenience function for standalone objects. + + \note This method does the same as cookConvexMesh, but the produced mesh is not stored + into a stream but is either directly inserted in PxPhysics, or created as a standalone + object. Use this method if you are unable to cook offline. + + \param[in] desc The convex mesh descriptor to read the mesh from. + \return PxConvexMesh pointer on success + + @see cookConvexMesh() PxInsertionCallback + */ + PX_FORCE_INLINE PxConvexMesh* createConvexMesh(const PxConvexMeshDesc& desc) const + { + return createConvexMesh(desc, const_cast(*this).getStandaloneInsertionCallback()); + } /** \brief Verifies if the convex mesh is valid. Prints an error message for each inconsistency found. @@ -441,7 +702,7 @@ public: \note This function should be used if PxConvexFlag::eDISABLE_MESH_VALIDATION is planned to be used in release builds. - \param[in] desc The convex mesh descriptor to read the mesh from. + \param[in] desc The convex mesh descriptor to read the mesh from. \return true if all the validity conditions hold, false otherwise. @@ -449,7 +710,6 @@ public: */ virtual bool validateConvexMesh(const PxConvexMeshDesc& desc) const = 0; - /** \brief Computed hull polygons from given vertices and triangles. Polygons are needed for PxConvexMeshDesc rather than triangles. @@ -459,14 +719,14 @@ public: The provided PxAllocatorCallback does allocate the out array's. It is the user responsibility to deallocated those array's. - \param[in] mesh Simple triangle mesh containing vertices and triangles used to compute polygons. - \param[in] inCallback Memory allocator for out array allocations. - \param[out] nbVerts Number of vertices used by polygons. - \param[out] vertices Vertices array used by polygons. - \param[out] nbIndices Number of indices used by polygons. - \param[out] indices Indices array used by polygons. - \param[out] nbPolygons Number of created polygons. - \param[out] hullPolygons Polygons array. + \param[in] mesh Simple triangle mesh containing vertices and triangles used to compute polygons. + \param[in] inCallback Memory allocator for out array allocations. + \param[out] nbVerts Number of vertices used by polygons. + \param[out] vertices Vertices array used by polygons. + \param[out] nbIndices Number of indices used by polygons. + \param[out] indices Indices array used by polygons. + \param[out] nbPolygons Number of created polygons. + \param[out] hullPolygons Polygons array. \return true on success @see cookConvexMesh() PxConvexFlags PxConvexMeshDesc PxSimpleTriangleMesh @@ -482,8 +742,8 @@ public: cookHeightField() allows a heightfield description to be cooked into a binary stream suitable for loading and performing collision detection at runtime. - \param[in] desc The heightfield descriptor to read the HF from. - \param[in] stream User stream to output the cooked data. + \param[in] desc The heightfield descriptor to read the HF from. + \param[in] stream User stream to output the cooked data. \return true on success @see PxPhysics.createHeightField() @@ -493,43 +753,114 @@ public: /** \brief Cooks and creates a heightfield mesh and inserts it into PxPhysics. - \param[in] desc The heightfield descriptor to read the HF from. - \param[in] insertionCallback The insertion interface from PxPhysics. + \param[in] desc The heightfield descriptor to read the HF from. + \param[in] insertionCallback The insertion interface from PxPhysics. \return PxHeightField pointer on success - @see cookConvexMesh() setParams() PxPhysics.createTriangleMesh() PxPhysicsInsertionCallback + @see cookConvexMesh() setParams() PxPhysics.createTriangleMesh() PxInsertionCallback */ - virtual PxHeightField* createHeightField(const PxHeightFieldDesc& desc, PxPhysicsInsertionCallback& insertionCallback) const = 0; + virtual PxHeightField* createHeightField(const PxHeightFieldDesc& desc, PxInsertionCallback& insertionCallback) const = 0; + /** - \brief Cooks a bounding volume hierarchy structure. The results are written to the stream. + \brief Cooks and creates a heightfield mesh and inserts it into PxPhysics. Convenience function for standalone objects. - cookBVHStructure() allows a BVH structure description to be cooked into a binary stream + \param[in] desc The heightfield descriptor to read the HF from. + \return PxHeightField pointer on success + + @see cookConvexMesh() PxPhysics.createTriangleMesh() PxInsertionCallback + */ + PX_FORCE_INLINE PxHeightField* createHeightField(const PxHeightFieldDesc& desc) const + { + return createHeightField(desc, const_cast(*this).getStandaloneInsertionCallback()); + } + + /** + \brief Cooks a bounding volume hierarchy. The results are written to the stream. + + cookBVH() allows a BVH description to be cooked into a binary stream suitable for loading and performing BVH detection at runtime. - \param[in] desc The BVH structure descriptor. - \param[in] stream User stream to output the cooked data. + \param[in] desc The BVH descriptor. + \param[in] stream User stream to output the cooked data. \return true on success. - @see PxBVHStructure PxRigidActorExt::getRigidActorShapeLocalBoundsList + @see PxBVH PxRigidActorExt::getRigidActorShapeLocalBoundsList */ - virtual bool cookBVHStructure(const PxBVHStructureDesc& desc, PxOutputStream& stream) const = 0; + virtual bool cookBVH(const PxBVHDesc& desc, PxOutputStream& stream) const = 0; + /** - \brief Cooks and creates a bounding volume hierarchy structure and inserts it into PxPhysics. + \brief Backward compatibility helper. Cooks a bounding volume hierarchy. The results are written to the stream. - \note This method does the same as cookBVHStructure, but the produced BVH structure is not stored - into a stream but is directly inserted in PxPhysics. Use this method if you are unable to cook offline. - - \note PxPhysicsInsertionCallback can be obtained through PxPhysics::getPhysicsInsertionCallback(). - - \param[in] desc The BVH structure descriptor. - \param[in] insertionCallback The insertion interface from PxPhysics. - \return PxBVHStructure pointer on success - - @see cookBVHStructure() PxPhysicsInsertionCallback + \param[in] desc The BVH descriptor. + \param[in] stream User stream to output the cooked data. + \return true on success. + @deprecated */ - virtual PxBVHStructure* createBVHStructure(const PxBVHStructureDesc& desc, PxPhysicsInsertionCallback& insertionCallback) const = 0; + PX_DEPRECATED PX_FORCE_INLINE bool cookBVHStructure(const PxBVHStructureDesc& desc, PxOutputStream& stream) const + { + return cookBVH(desc, stream); + } + + /** + \brief Cooks and creates a bounding volume hierarchy without going through a stream. + + \note This method does the same as cookBVH, but the produced BVH is not stored + into a stream but is either directly inserted in PxPhysics, or created as a standalone + object. Use this method if you are unable to cook offline. + + \note PxInsertionCallback can be obtained through PxPhysics::getPhysicsInsertionCallback() + or PxCooking::getStandaloneInsertionCallback(). + + \param[in] desc The BVH descriptor. + \param[in] insertionCallback The insertion interface. + \return PxBVH pointer on success + + @see cookBVH() PxInsertionCallback + */ + virtual PxBVH* createBVH(const PxBVHDesc& desc, PxInsertionCallback& insertionCallback) const = 0; + + + /** + \brief Cooks and creates a bounding volume hierarchy without going through a stream. Convenience function for standalone objects. + + \note This method does the same as cookBVH, but the produced BVH is not stored + into a stream but is either directly inserted in PxPhysics, or created as a standalone + object. Use this method if you are unable to cook offline. + + \param[in] desc The BVH descriptor. + \return PxBVH pointer on success + + @see cookBVH() PxInsertionCallback + */ + PX_FORCE_INLINE PxBVH* createBVH(const PxBVHDesc& desc) const + { + return createBVH(desc, const_cast(*this).getStandaloneInsertionCallback()); + } + + /** + \brief Backward compatibility helper. Cooks and creates a bounding volume hierarchy without going through a stream. + + \param[in] desc The BVH descriptor. + \param[in] insertionCallback The insertion interface. + \return PxBVH pointer on success + @deprecated + */ + PX_DEPRECATED PX_FORCE_INLINE PxBVHStructure* createBVHStructure(const PxBVHStructureDesc& desc, PxInsertionCallback& insertionCallback) const + { + return createBVH(desc, insertionCallback); + } + + /** + \brief Gets standalone object insertion interface. + + This interface allows the creation of standalone objects that can exist without a PxPhysics or PxScene object. + + @see PxCooking::createTriangleMesh PxCooking::createHeightfield PxCooking::createTetrahedronMesh PxCooking::createBVH + */ + virtual PxInsertionCallback& getStandaloneInsertionCallback() = 0; + protected: virtual ~PxCooking(){} }; @@ -547,17 +878,100 @@ same executable as cooking, you should pass the Physics's copy of foundation (ac PxPhysics::getFoundation()) to the cooker. This will also ensure correct handling of memory for objects passed from the cooker to the SDK. -To use cooking in standalone mode, create an instance of the Foundation object with PxCreateCookingFoundation. +To use cooking in standalone mode, create an instance of the Foundation object with PxCreateFoundation. You should pass the same foundation object to all instances of the cooking interface. -\param[in] version the SDK version number -\param[in] foundation the foundation object associated with this instance of the cooking interface. -\param[in] params the parameters for this instance of the cooking interface +\param[in] version The SDK version number +\param[in] foundation The foundation object associated with this instance of the cooking interface. +\param[in] params The parameters for this instance of the cooking interface \return true on success. +@deprecated */ -PX_C_EXPORT PX_PHYSX_COOKING_API physx::PxCooking* PX_CALL_CONV PxCreateCooking(physx::PxU32 version, +PX_C_EXPORT PX_PHYSX_COOKING_API PX_DEPRECATED physx::PxCooking* PX_CALL_CONV PxCreateCooking(physx::PxU32 version, physx::PxFoundation& foundation, const physx::PxCookingParams& params); + + + +// Immediate cooking + +PX_C_EXPORT PX_PHYSX_COOKING_API physx::PxInsertionCallback* PxGetStandaloneInsertionCallback(); + +// BVH +PX_C_EXPORT PX_PHYSX_COOKING_API bool PxCookBVH(const physx::PxBVHDesc& desc, physx::PxOutputStream& stream); +PX_C_EXPORT PX_PHYSX_COOKING_API physx::PxBVH* PxCreateBVH(const physx::PxBVHDesc& desc, physx::PxInsertionCallback& insertionCallback); + +PX_FORCE_INLINE physx::PxBVH* PxCreateBVH(const physx::PxBVHDesc& desc) +{ + return PxCreateBVH(desc, *PxGetStandaloneInsertionCallback()); +} + +// Heightfield +PX_C_EXPORT PX_PHYSX_COOKING_API bool PxCookHeightField(const physx::PxHeightFieldDesc& desc, physx::PxOutputStream& stream); +PX_C_EXPORT PX_PHYSX_COOKING_API physx::PxHeightField* PxCreateHeightField(const physx::PxHeightFieldDesc& desc, physx::PxInsertionCallback& insertionCallback); + +PX_FORCE_INLINE physx::PxHeightField* PxCreateHeightField(const physx::PxHeightFieldDesc& desc) +{ + return PxCreateHeightField(desc, *PxGetStandaloneInsertionCallback()); +} + +// Convex meshes +PX_C_EXPORT PX_PHYSX_COOKING_API bool PxCookConvexMesh(const physx::PxCookingParams& params, const physx::PxConvexMeshDesc& desc, physx::PxOutputStream& stream, physx::PxConvexMeshCookingResult::Enum* condition=NULL); +PX_C_EXPORT PX_PHYSX_COOKING_API physx::PxConvexMesh* PxCreateConvexMesh(const physx::PxCookingParams& params, const physx::PxConvexMeshDesc& desc, physx::PxInsertionCallback& insertionCallback, physx::PxConvexMeshCookingResult::Enum* condition=NULL); + +PX_FORCE_INLINE physx::PxConvexMesh* PxCreateConvexMesh(const physx::PxCookingParams& params, const physx::PxConvexMeshDesc& desc) +{ + return PxCreateConvexMesh(params, desc, *PxGetStandaloneInsertionCallback()); +} + +PX_C_EXPORT PX_PHYSX_COOKING_API bool PxValidateConvexMesh(const physx::PxCookingParams& params, const physx::PxConvexMeshDesc& desc); +PX_C_EXPORT PX_PHYSX_COOKING_API bool PxComputeHullPolygons(const physx::PxCookingParams& params, const physx::PxSimpleTriangleMesh& mesh, physx::PxAllocatorCallback& inCallback, physx::PxU32& nbVerts, physx::PxVec3*& vertices, + physx::PxU32& nbIndices, physx::PxU32*& indices, physx::PxU32& nbPolygons, physx::PxHullPolygon*& hullPolygons); + +// Triangle meshes +PX_C_EXPORT PX_PHYSX_COOKING_API bool PxValidateTriangleMesh(const physx::PxCookingParams& params, const physx::PxTriangleMeshDesc& desc); +PX_C_EXPORT PX_PHYSX_COOKING_API physx::PxTriangleMesh* PxCreateTriangleMesh(const physx::PxCookingParams& params, const physx::PxTriangleMeshDesc& desc, physx::PxInsertionCallback& insertionCallback, physx::PxTriangleMeshCookingResult::Enum* condition=NULL); +PX_C_EXPORT PX_PHYSX_COOKING_API bool PxCookTriangleMesh(const physx::PxCookingParams& params, const physx::PxTriangleMeshDesc& desc, physx::PxOutputStream& stream, physx::PxTriangleMeshCookingResult::Enum* condition=NULL); + +PX_FORCE_INLINE physx::PxTriangleMesh* PxCreateTriangleMesh(const physx::PxCookingParams& params, const physx::PxTriangleMeshDesc& desc) +{ + return PxCreateTriangleMesh(params, desc, *PxGetStandaloneInsertionCallback()); +} + +// Tetrahedron & soft body meshes +PX_C_EXPORT PX_PHYSX_COOKING_API bool PxCookTetrahedronMesh(const physx::PxCookingParams& params, const physx::PxTetrahedronMeshDesc& meshDesc, physx::PxOutputStream& stream); +PX_C_EXPORT PX_PHYSX_COOKING_API physx::PxTetrahedronMesh* PxCreateTetrahedronMesh(const physx::PxCookingParams& params, const physx::PxTetrahedronMeshDesc& meshDesc, physx::PxInsertionCallback& insertionCallback); + +PX_FORCE_INLINE physx::PxTetrahedronMesh* PxCreateTetrahedronMesh(const physx::PxCookingParams& params, const physx::PxTetrahedronMeshDesc& meshDesc) +{ + return PxCreateTetrahedronMesh(params, meshDesc, *PxGetStandaloneInsertionCallback()); +} + +PX_C_EXPORT PX_PHYSX_COOKING_API bool PxCookSoftBodyMesh(const physx::PxCookingParams& params, const physx::PxTetrahedronMeshDesc& simulationMeshDesc, const physx::PxTetrahedronMeshDesc& collisionMeshDesc, + const physx::PxSoftBodySimulationDataDesc& softbodyDataDesc, physx::PxOutputStream& stream); + +PX_C_EXPORT PX_PHYSX_COOKING_API physx::PxSoftBodyMesh* PxCreateSoftBodyMesh(const physx::PxCookingParams& params, const physx::PxTetrahedronMeshDesc& simulationMeshDesc, const physx::PxTetrahedronMeshDesc& collisionMeshDesc, + const physx::PxSoftBodySimulationDataDesc& softbodyDataDesc, physx::PxInsertionCallback& insertionCallback); + +PX_FORCE_INLINE physx::PxSoftBodyMesh* PxCreateSoftBodyMesh(const physx::PxCookingParams& params, const physx::PxTetrahedronMeshDesc& simulationMeshDesc, const physx::PxTetrahedronMeshDesc& collisionMeshDesc, + const physx::PxSoftBodySimulationDataDesc& softbodyDataDesc) +{ + return PxCreateSoftBodyMesh(params, simulationMeshDesc, collisionMeshDesc, softbodyDataDesc, *PxGetStandaloneInsertionCallback()); +} + +PX_C_EXPORT PX_PHYSX_COOKING_API physx::PxCollisionMeshMappingData* PxComputeModelsMapping(const physx::PxCookingParams& params, physx::PxTetrahedronMeshData& simulationMesh, const physx::PxTetrahedronMeshData& collisionMesh, + const physx::PxSoftBodyCollisionData& collisionData, const physx::PxBoundedData* vertexToTet = NULL); + +PX_C_EXPORT PX_PHYSX_COOKING_API physx::PxCollisionTetrahedronMeshData* PxComputeCollisionData(const physx::PxCookingParams& params, const physx::PxTetrahedronMeshDesc& collisionMeshDesc); + +PX_C_EXPORT PX_PHYSX_COOKING_API physx::PxSimulationTetrahedronMeshData* PxComputeSimulationData(const physx::PxCookingParams& params, const physx::PxTetrahedronMeshDesc& simulationMeshDesc); + +PX_C_EXPORT PX_PHYSX_COOKING_API physx::PxSoftBodyMesh* PxAssembleSoftBodyMesh(physx::PxTetrahedronMeshData& simulationMesh, physx::PxSoftBodySimulationData& simulationData, physx::PxTetrahedronMeshData& collisionMesh, + physx::PxSoftBodyCollisionData& collisionData, physx::PxCollisionMeshMappingData& mappingData, physx::PxInsertionCallback& insertionCallback); + +PX_C_EXPORT PX_PHYSX_COOKING_API physx::PxSoftBodyMesh* PxAssembleSoftBodyMesh_Sim(physx::PxSimulationTetrahedronMeshData& simulationMesh, physx::PxCollisionTetrahedronMeshData& collisionMesh, + physx::PxCollisionMeshMappingData& mappingData, physx::PxInsertionCallback& insertionCallback); + /** @} */ #endif diff --git a/Source/ThirdParty/PhysX/cooking/PxCookingInternal.h b/Source/ThirdParty/PhysX/cooking/PxCookingInternal.h new file mode 100644 index 000000000..73972a87d --- /dev/null +++ b/Source/ThirdParty/PhysX/cooking/PxCookingInternal.h @@ -0,0 +1,56 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_COOKING_INTERNAL_H +#define PX_COOKING_INTERNAL_H +/** \addtogroup cooking +@{ +*/ + +#include "cooking/PxCooking.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + struct PxTriangleMeshInternalData; + struct PxBVHInternalData; + class PxTriangleMesh; + class PxBVH; + +#if !PX_DOXYGEN +} // namespace physx +#endif + + PX_C_EXPORT PX_PHYSX_COOKING_API physx::PxTriangleMesh* PX_CALL_CONV PxCreateTriangleMeshInternal(const physx::PxTriangleMeshInternalData& data, const physx::PxCooking& cooking); + + PX_C_EXPORT PX_PHYSX_COOKING_API physx::PxBVH* PX_CALL_CONV PxCreateBVHInternal(const physx::PxBVHInternalData& data, const physx::PxCooking& cooking); + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/cooking/PxMidphaseDesc.h b/Source/ThirdParty/PhysX/cooking/PxMidphaseDesc.h index fda59c996..ee63e01c1 100644 --- a/Source/ThirdParty/PhysX/cooking/PxMidphaseDesc.h +++ b/Source/ThirdParty/PhysX/cooking/PxMidphaseDesc.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,11 +22,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - #ifndef PX_MIDPHASE_DESC_H #define PX_MIDPHASE_DESC_H /** \addtogroup cooking @@ -52,7 +50,7 @@ namespace physx class PxMidphaseDesc { public: - PX_FORCE_INLINE PxMidphaseDesc() { setToDefault(PxMeshMidPhase::eBVH33); } + PX_FORCE_INLINE PxMidphaseDesc() { setToDefault(PxMeshMidPhase::eBVH34); } /** \brief Returns type of midphase mesh structure. @@ -100,7 +98,11 @@ public: return false; } - PX_FORCE_INLINE PxMidphaseDesc& operator=(PxMeshMidPhase::Enum descType) + /** + \brief Assignment operator + \return this + */ + PX_FORCE_INLINE PxMidphaseDesc& operator=(PxMeshMidPhase::Enum descType) { setToDefault(descType); return *this; @@ -116,4 +118,5 @@ protected: /** @} */ -#endif // PX_MIDPHASE_DESC_UNION_H +#endif + diff --git a/Source/ThirdParty/PhysX/cooking/PxSDFDesc.h b/Source/ThirdParty/PhysX/cooking/PxSDFDesc.h new file mode 100644 index 000000000..4f37a2ad0 --- /dev/null +++ b/Source/ThirdParty/PhysX/cooking/PxSDFDesc.h @@ -0,0 +1,196 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_SDF_DESC_H +#define PX_SDF_DESC_H +/** \addtogroup cooking +@{ +*/ + +#include "PxPhysXConfig.h" +#include "geometry/PxSimpleTriangleMesh.h" +#include "foundation/PxBounds3.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief A helper structure to define dimensions in 3D + */ + struct PxDim3 + { + PxU32 x, y, z; + }; + + /** + \brief Defines the number of bits per subgrid pixel + */ + class PxSdfBitsPerSubgridPixel + { + public: + enum Enum + { + e8_BIT_PER_PIXEL = 1, //!< 8 bit per subgrid pixel (values will be stored as normalized integers) + e16_BIT_PER_PIXEL = 2, //!< 16 bit per subgrid pixel (values will be stored as normalized integers) + e32_BIT_PER_PIXEL = 4 //!< 32 bit per subgrid pixel (values will be stored as floats in world scale units) + }; + }; + + /** + \brief A structure describing signed distance field for mesh. + */ + class PxSDFDesc + { + public: + + /** + \brief Pointer to first sdf array element. + */ + PxBoundedData sdf; + + /** + \brief Dimensions of sdf + */ + PxDim3 dims; + + /** + \brief The Lower bound of the original mesh + */ + PxVec3 meshLower; + + /** + \brief The spacing of each sdf voxel + */ + PxReal spacing; + + + /** + \brief The number of cells in a sparse subgrid block (full block has subgridSize^3 cells and (subgridSize+1)^3 samples). If set to zero, this indicates that only a dense background grid SDF is used without sparse blocks + */ + PxU32 subgridSize; + + /** + \brief Enumeration that defines the number of bits per subgrid pixel (either 32, 16 or 8bits) + */ + PxSdfBitsPerSubgridPixel::Enum bitsPerSubgridPixel; + + /** + \brief Number of subgrid blocks in the 3d texture. The full texture dimension will be sdfSubgrids3DTexBlockDim*(subgridSize+1). + */ + PxDim3 sdfSubgrids3DTexBlockDim; + + /** + \brief The data to create the 3d texture containg the packed subgrid blocks. Stored as PxU8 to support multiple formats (8, 16 and 32 bits per pixel) + */ + PxBoundedData sdfSubgrids; + + /** + \brief Array with start indices into the subgrid texture for every subgrid block. 10bits for z coordinate, 10bits for y and 10bits for x. Encoding is as follows: slot = (z << 20) | (y << 10) | x + */ + PxBoundedData sdfStartSlots; + + /** + \brief The minimum value over all subgrid blocks. Used if normalized textures are used which is the case for 8 and 16bit formats + */ + PxReal subgridsMinSdfValue; + + /** + \brief The maximum value over all subgrid blocks. Used if normalized textures are used which is the case for 8 and 16bit formats + */ + PxReal subgridsMaxSdfValue; + + /** + \brief The bounds of the sdf. If left unassigned (empty), the bounds of the mesh will be used + */ + PxBounds3 sdfBounds; + + /** + \brief Narrow band thickness as a fraction of the bounds diagonal length. Every subgrid block that + overlaps with the narrow band around the mesh surface will be kept providing high resultion around the mesh surface. + The valid range of this parameter is (0, 1). The higher the value, the more subgrids will get created, the more memory will be required. + */ + PxReal narrowBandThicknessRelativeToSdfBoundsDiagonal; + + /** + \brief The number of threads that are launched to compute the signed distance field + */ + PxU32 numThreadsForSdfConstruction; + + /** + \brief Constructor + */ + PX_INLINE PxSDFDesc(); + + /** + \brief Returns true if the descriptor is valid. + \return true if the current settings are valid + */ + PX_INLINE bool isValid() const; + }; + + PX_INLINE PxSDFDesc::PxSDFDesc() + { + sdf.data = NULL; + dims.x = 0; + dims.y = 0; + dims.z = 0; + spacing = 0; + meshLower = PxVec3(PxZero); + subgridSize = 0; + subgridsMinSdfValue = 0.0f; + subgridsMaxSdfValue = 0.0f; + sdfBounds = PxBounds3::empty(); + bitsPerSubgridPixel = PxSdfBitsPerSubgridPixel::e16_BIT_PER_PIXEL; + narrowBandThicknessRelativeToSdfBoundsDiagonal = 0.01f; + numThreadsForSdfConstruction = 1; + } + + PX_INLINE bool PxSDFDesc::isValid() const + { + // Check validity of user's input(if any) + if (sdf.data) + { + if (dims.x < 1 || dims.y < 1 || dims.z < 1) + return false; + if (!meshLower.isFinite()) + return false; + if (spacing <= 0) + return false; + } + + return true; + } + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/cooking/PxTetrahedronMeshDesc.h b/Source/ThirdParty/PhysX/cooking/PxTetrahedronMeshDesc.h new file mode 100644 index 000000000..5d68d02d0 --- /dev/null +++ b/Source/ThirdParty/PhysX/cooking/PxTetrahedronMeshDesc.h @@ -0,0 +1,233 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_TETRAHEDRON_MESH_DESC_H +#define PX_TETRAHEDRON_MESH_DESC_H +/** \addtogroup cooking +@{ +*/ + +#include "PxPhysXConfig.h" +#include "foundation/PxVec3.h" +#include "foundation/PxFlags.h" +#include "common/PxCoreUtilityTypes.h" +#include "geometry/PxSimpleTriangleMesh.h" +#include "foundation/PxArray.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + /** + \brief Descriptor class for #PxTetrahedronMesh (contains only pure geometric data). + + @see PxTetrahedronMesh PxShape + */ + class PxTetrahedronMeshDesc + { + public: + + /** + \brief Defines the tetrahedron structure of a mesh. + */ + enum PxMeshFormat + { + eTET_MESH, //!< Normal tetmesh with arbitrary tetrahedra + eHEX_MESH //!< 6 tetrahedra in a row will form a hexahedron + }; + + + /** + Optional pointer to first material index, or NULL. There are PxTetrahedronMesh::numTriangles indices in total. + Caller may add materialIndexStride bytes to the pointer to access the next triangle. + + When a tetrahedron mesh collides with another object, a material is required at the collision point. + If materialIndices is NULL, then the material of the PxShape instance is used. + Otherwise, if the point of contact is on a tetrahedron with index i, then the material index is determined as: + PxFEMMaterialTableIndex index = *(PxFEMMaterialTableIndex *)(((PxU8*)materialIndices) + materialIndexStride * i); + + If the contact point falls on a vertex or an edge, a tetrahedron adjacent to the vertex or edge is selected, and its index + used to look up a material. The selection is arbitrary but consistent over time. + + Default: NULL + + @see materialIndexStride + */ + PxTypedStridedData materialIndices; + + /** + \brief Pointer to first vertex point. + */ + PxBoundedData points; + + /** + \brief Pointer to first tetrahedron. + + Caller may add tetrhedronStrideBytes bytes to the pointer to access the next tetrahedron. + + These are quadruplets of 0 based indices: + vert0 vert1 vert2 vert3 + vert0 vert1 vert2 vert3 + vert0 vert1 vert2 vert3 + ... + + where vertex is either a 32 or 16 bit unsigned integer. There are numTetrahedrons*4 indices. + + This is declared as a void pointer because it is actually either an PxU16 or a PxU32 pointer. + */ + PxBoundedData tetrahedrons; + + + /** + \brief Flags bits, combined from values of the enum ::PxMeshFlag + */ + PxMeshFlags flags; + + /** + \brief Used for simulation meshes only. Defines if this tet mesh should be simulated as a tet mesh, + or if a set of tetrahedra should be used to represent another shape, e.g. a hexahedral mesh constructed + from 6 elements. + */ + PxU16 tetsPerElement; + + /** + \brief Constructor to build an empty tetmesh description + */ + PxTetrahedronMeshDesc() + { + points.count = 0; + points.stride = 0; + points.data = NULL; + + tetrahedrons.count = 0; + tetrahedrons.stride = 0; + tetrahedrons.data = NULL; + + tetsPerElement = 1; + } + + /** + \brief Constructor to build a tetmeshdescription that links to the vertices and indices provided + */ + PxTetrahedronMeshDesc(physx::PxArray& meshVertices, physx::PxArray& meshTetIndices, const PxTetrahedronMeshDesc::PxMeshFormat meshFormat = eTET_MESH) + { + points.count = meshVertices.size(); + points.stride = sizeof(float) * 3; + points.data = meshVertices.begin(); + + tetrahedrons.count = meshTetIndices.size() / 4; + tetrahedrons.stride = sizeof(int) * 4; + tetrahedrons.data = meshTetIndices.begin(); + + if (meshFormat == eTET_MESH) + tetsPerElement = 1; + else + tetsPerElement = 6; + } + + PX_INLINE bool isValid() const + { + // Check geometry of the collision mesh + if (points.count < 4) //at least 1 tetrahedron's worth of points + return false; + if ((!tetrahedrons.data) && (points.count % 4)) // Non-indexed mesh => we must ensure the geometry defines an implicit number of tetrahedrons // i.e. numVertices can't be divided by 4 + return false; + if (points.count > 0xffff && flags & PxMeshFlag::e16_BIT_INDICES) + return false; + if (!points.data) + return false; + if (points.stride < sizeof(PxVec3)) //should be at least one point's worth of data + return false; + + //add more validity checks here + if (materialIndices.data && materialIndices.stride < sizeof(PxFEMMaterialTableIndex)) + return false; + + // The tetrahedrons pointer is not mandatory + if (tetrahedrons.data) + { + // Indexed collision mesh + PxU32 limit = (flags & PxMeshFlag::e16_BIT_INDICES) ? sizeof(PxU16) * 4 : sizeof(PxU32) * 4; + if (tetrahedrons.stride < limit) + return false; + } + + //The model can only be either a tetmesh (1 tet per element), or have 5 or 6 tets per hex element, otherwise invalid. + if (tetsPerElement != 1 && tetsPerElement != 6) + return false; + + return true; + } + }; + + ///** + //\brief Descriptor class for #PxSoftBodyMesh (contains only additional data used for softbody simulation). + + //@see PxSoftBodyMesh PxShape + //*/ + class PxSoftBodySimulationDataDesc + { + public: + /** + \brief Pointer to first index of tetrahedron that contains the vertex at the same location in the vertex buffer. + if left unassigned it will be computed automatically. If a point is inside multiple tetrahedra (ambiguous case), the frist one found will be taken. + */ + PxBoundedData vertexToTet; + + /** + \brief Constructor to build an empty simulation description + */ + PxSoftBodySimulationDataDesc() + { + vertexToTet.count = 0; + vertexToTet.stride = 0; + vertexToTet.data = NULL; + } + + /** + \brief Constructor to build a simulation description with a defined vertex to tetrahedron mapping + */ + PxSoftBodySimulationDataDesc(physx::PxArray& vertToTet) + { + vertexToTet.count = vertToTet.size(); + vertexToTet.stride = sizeof(PxI32); + vertexToTet.data = vertToTet.begin(); + } + + PX_INLINE bool isValid() const + { + return true; + } + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + + /** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/cooking/PxTriangleMeshDesc.h b/Source/ThirdParty/PhysX/cooking/PxTriangleMeshDesc.h index d3b8ea6d4..10f52913d 100644 --- a/Source/ThirdParty/PhysX/cooking/PxTriangleMeshDesc.h +++ b/Source/ThirdParty/PhysX/cooking/PxTriangleMeshDesc.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,25 +22,26 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_COLLISION_NXTRIANGLEMESHDESC -#define PX_COLLISION_NXTRIANGLEMESHDESC +#ifndef PX_TRIANGLE_MESH_DESC_H +#define PX_TRIANGLE_MESH_DESC_H /** \addtogroup cooking @{ */ #include "PxPhysXConfig.h" #include "geometry/PxSimpleTriangleMesh.h" +#include "PxSDFDesc.h" #if !PX_DOXYGEN namespace physx { #endif + /** \brief Descriptor class for #PxTriangleMesh. @@ -73,10 +73,17 @@ public: */ PxTypedStridedData materialIndices; + /** + \brief SDF descriptor. When this descriptor is set, signed distance field is calculated for this convex mesh. + + Default: NULL + */ + PxSDFDesc* sdfDesc; + /** \brief Constructor sets to default. */ - PX_INLINE PxTriangleMeshDesc(); + PX_INLINE PxTriangleMeshDesc(); /** \brief (re)sets the structure to the default. @@ -90,9 +97,11 @@ public: PX_INLINE bool isValid() const; }; + PX_INLINE PxTriangleMeshDesc::PxTriangleMeshDesc() //constructor sets to default { - PxSimpleTriangleMesh::setToDefault(); + PxSimpleTriangleMesh::setToDefault(); + sdfDesc = NULL; } PX_INLINE void PxTriangleMeshDesc::setToDefault() @@ -109,9 +118,14 @@ PX_INLINE bool PxTriangleMeshDesc::isValid() const //add more validity checks here if (materialIndices.data && materialIndices.stride < sizeof(PxMaterialTableIndex)) return false; + + if (sdfDesc && !sdfDesc->isValid()) + return false; + return PxSimpleTriangleMesh::isValid(); } + #if !PX_DOXYGEN } // namespace physx #endif diff --git a/Source/ThirdParty/PhysX/cooking/Pxc.h b/Source/ThirdParty/PhysX/cooking/Pxc.h index ab28adf00..d7dc67826 100644 --- a/Source/ThirdParty/PhysX/cooking/Pxc.h +++ b/Source/ThirdParty/PhysX/cooking/Pxc.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,19 +22,18 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_COOKING_NX -#define PX_COOKING_NX +#ifndef PXC_H +#define PXC_H #include "foundation/Px.h" // define API function declaration #if !defined PX_PHYSX_STATIC_LIB - #if (PX_WINDOWS_FAMILY || PX_XBOXONE || PX_PS4) + #if (PX_WINDOWS_FAMILY || PX_PS4 || PX_PS5) #if defined PX_PHYSX_COOKING_EXPORTS #define PX_PHYSX_COOKING_API __declspec(dllexport) #else diff --git a/Source/ThirdParty/PhysX/cudamanager/PxCudaContext.h b/Source/ThirdParty/PhysX/cudamanager/PxCudaContext.h new file mode 100644 index 000000000..15e192691 --- /dev/null +++ b/Source/ThirdParty/PhysX/cudamanager/PxCudaContext.h @@ -0,0 +1,182 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. + +#ifndef PX_CUDA_CONTEX_H +#define PX_CUDA_CONTEX_H + +#include "foundation/PxPreprocessor.h" + +#if PX_SUPPORT_GPU_PHYSX + +#include "PxCudaTypes.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + struct PxCudaKernelParam + { + void* data; + size_t size; + }; + + // workaround for not being able to forward declare enums in PxCudaTypes.h. + // provides different automatic casting depending on whether cuda.h was included beforehand or not. + template + struct PxCUenum + { + PxU32 value; + + PxCUenum(CUenum e) { value = PxU32(e); } + operator CUenum() const { return CUenum(value); } + }; + +#ifdef CUDA_VERSION + typedef PxCUenum PxCUjit_option; + typedef PxCUenum PxCUresult; +#else + typedef PxCUenum PxCUjit_option; + typedef PxCUenum PxCUresult; +#endif + +#define PX_CUDA_KERNEL_PARAM(X) { (void*)&X, sizeof(X) } +#define PX_CUDA_KERNEL_PARAM2(X) (void*)&X + + class PxDeviceAllocatorCallback; + /** + Cuda Context + */ + class PxCudaContext + { + protected: + virtual ~PxCudaContext() {} + + PxDeviceAllocatorCallback* mAllocatorCallback; + + public: + virtual void release() = 0; + + virtual PxCUresult memAlloc(CUdeviceptr *dptr, size_t bytesize) = 0; + + virtual PxCUresult memFree(CUdeviceptr dptr) = 0; + + virtual PxCUresult memHostAlloc(void **pp, size_t bytesize, unsigned int Flags) = 0; + + virtual PxCUresult memFreeHost(void *p) = 0; + + virtual PxCUresult memHostGetDevicePointer(CUdeviceptr *pdptr, void *p, unsigned int Flags) = 0; + + virtual PxCUresult moduleLoadDataEx(CUmodule *module, const void *image, unsigned int numOptions, PxCUjit_option *options, void **optionValues) = 0; + + virtual PxCUresult moduleGetFunction(CUfunction *hfunc, CUmodule hmod, const char *name) = 0; + + virtual PxCUresult moduleUnload(CUmodule hmod) = 0; + + virtual PxCUresult streamCreate(CUstream *phStream, unsigned int Flags) = 0; + + virtual PxCUresult streamCreateWithPriority(CUstream *phStream, unsigned int flags, int priority) = 0; + + virtual PxCUresult streamFlush(CUstream hStream) = 0; + + virtual PxCUresult streamWaitEvent(CUstream hStream, CUevent hEvent, unsigned int Flags) = 0; + + virtual PxCUresult streamDestroy(CUstream hStream) = 0; + + virtual PxCUresult streamSynchronize(CUstream hStream) = 0; + + virtual PxCUresult eventCreate(CUevent *phEvent, unsigned int Flags) = 0; + + virtual PxCUresult eventRecord(CUevent hEvent, CUstream hStream) = 0; + + virtual PxCUresult eventQuery(CUevent hEvent) = 0; + + virtual PxCUresult eventSynchronize(CUevent hEvent) = 0; + + virtual PxCUresult eventDestroy(CUevent hEvent) = 0; + + virtual PxCUresult launchKernel( + CUfunction f, + unsigned int gridDimX, + unsigned int gridDimY, + unsigned int gridDimZ, + unsigned int blockDimX, + unsigned int blockDimY, + unsigned int blockDimZ, + unsigned int sharedMemBytes, + CUstream hStream, + PxCudaKernelParam* kernelParams, + size_t kernelParamsSizeInBytes, + void** extra = NULL + ) = 0; + + // PT: same as above but without copying the kernel params to a local stack before the launch + // i.e. the kernelParams data is passed directly to the kernel. + virtual PxCUresult launchKernel( + CUfunction f, + PxU32 gridDimX, PxU32 gridDimY, PxU32 gridDimZ, + PxU32 blockDimX, PxU32 blockDimY, PxU32 blockDimZ, + PxU32 sharedMemBytes, + CUstream hStream, + void** kernelParams, + void** extra = NULL + ) = 0; + + virtual PxCUresult memcpyDtoH(void *dstHost, CUdeviceptr srcDevice, size_t ByteCount) = 0; + + virtual PxCUresult memcpyDtoHAsync(void *dstHost, CUdeviceptr srcDevice, size_t ByteCount, CUstream hStream) = 0; + + virtual PxCUresult memcpyHtoD(CUdeviceptr dstDevice, const void *srcHost, size_t ByteCount) = 0; + + virtual PxCUresult memcpyHtoDAsync(CUdeviceptr dstDevice, const void *srcHost, size_t ByteCount, CUstream hStream) = 0; + + virtual PxCUresult memcpyDtoDAsync(CUdeviceptr dstDevice, CUdeviceptr srcDevice, size_t ByteCount, CUstream hStream) = 0; + + virtual PxCUresult memcpyDtoD(CUdeviceptr dstDevice, CUdeviceptr srcDevice, size_t ByteCount) = 0; + + virtual PxCUresult memcpyPeerAsync(CUdeviceptr dstDevice, CUcontext dstContext, CUdeviceptr srcDevice, CUcontext srcContext, size_t ByteCount, CUstream hStream) = 0; + + virtual PxCUresult memsetD32Async(CUdeviceptr dstDevice, unsigned int ui, size_t N, CUstream hStream) = 0; + + virtual PxCUresult memsetD8Async(CUdeviceptr dstDevice, unsigned char uc, size_t N, CUstream hStream) = 0; + + virtual PxCUresult memsetD32(CUdeviceptr dstDevice, unsigned int ui, size_t N) = 0; + + virtual PxCUresult memsetD16(CUdeviceptr dstDevice, unsigned short uh, size_t N) = 0; + + virtual PxCUresult memsetD8(CUdeviceptr dstDevice, unsigned char uc, size_t N) = 0; + + virtual PxCUresult getLastError() = 0; + + PxDeviceAllocatorCallback* getAllocatorCallback() { return mAllocatorCallback; } + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif // PX_SUPPORT_GPU_PHYSX +#endif + diff --git a/Source/ThirdParty/PhysX/cudamanager/PxCudaContextManager.h b/Source/ThirdParty/PhysX/cudamanager/PxCudaContextManager.h index dbf6a021c..49aa0dfc2 100644 --- a/Source/ThirdParty/PhysX/cudamanager/PxCudaContextManager.h +++ b/Source/ThirdParty/PhysX/cudamanager/PxCudaContextManager.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,11 +22,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. - -#ifndef PXCUDACONTEXTMANAGER_PXCUDACONTEXTMANAGER_H -#define PXCUDACONTEXTMANAGER_PXCUDACONTEXTMANAGER_H +#ifndef PX_CUDA_CONTEXT_MANAGER_H +#define PX_CUDA_CONTEXT_MANAGER_H #include "foundation/PxPreprocessor.h" @@ -36,17 +34,16 @@ #include "foundation/PxSimpleTypes.h" #include "foundation/PxErrorCallback.h" #include "foundation/PxFlags.h" -#include "task/PxTaskDefine.h" -#include "cudamanager/PxCudaMemoryManager.h" -/* Forward decl to avoid inclusion of cuda.h */ -typedef struct CUctx_st *CUcontext; -typedef struct CUgraphicsResource_st *CUgraphicsResource; -typedef int CUdevice; +#include "PxCudaTypes.h" +#if !PX_DOXYGEN namespace physx -{ - +{ +#endif + +class PxCudaContext; + /** \brief Possible graphic/CUDA interoperability modes for context */ struct PxCudaInteropMode { @@ -76,6 +73,31 @@ struct PxCudaInteropRegisterFlag }; }; +/** +\brief An interface class that the user can implement in order for PhysX to use a user-defined device memory allocator. +*/ +class PxDeviceAllocatorCallback +{ +public: + + /** + \brief Allocated device memory. + \param[in] ptr Pointer to store the allocated address + \param[in] size The amount of memory required + \return A boolean indicates the operation succeed or fail + */ + virtual bool memAlloc(void** ptr, size_t size) = 0; + + /** + \brief Frees device memory. + \param[in] ptr The memory to free + \return A boolean indicates the operation succeed or fail + */ + virtual bool memFree(void* ptr) = 0; + +protected: + virtual ~PxDeviceAllocatorCallback() {} +}; /** \brief collection of set bits defined in NxCudaInteropRegisterFlag. @@ -104,12 +126,8 @@ public: * If the user provides a context for the PxCudaContextManager, the context * _must_ have either been created on the GPU ordinal returned by * PxGetSuggestedCudaDeviceOrdinal() or on your graphics device. - * - * It is perfectly acceptable to allocate device or host pinned memory from - * the context outside the scope of the PxCudaMemoryManager, so long as you - * manage its eventual cleanup. */ - CUcontext *ctx; + CUcontext* ctx; /** * \brief D3D device pointer or OpenGl context handle @@ -118,9 +136,8 @@ public: * created. In that case, the created context will be bound to this * graphics device. */ - void *graphicsDevice; + void* graphicsDevice; -#if PX_SUPPORT_GPU_PHYSX /** * \brief Application-specific GUID * @@ -128,9 +145,18 @@ public: * so that patches for new architectures can be released for your game.You can obtain a GUID for your * application from Nvidia. */ - const char* appGUID; -#endif - /** + const char* appGUID; + + /** + * \brief Application-specific device memory allocator + * + * the application can implement an device memory allocator, which inherites PxDeviceAllocatorCallback, and + * pass that to the PxCudaContextManagerDesc. The SDK will use that allocator to allocate device memory instead of + * using the defaul CUDA device memory allocator. + */ + PxDeviceAllocatorCallback* deviceAllocator; + + /** * \brief The CUDA/Graphics interop mode of this context * * If ctx is NULL, this value describes the nature of the graphicsDevice @@ -139,75 +165,189 @@ public: */ PxCudaInteropMode::Enum interopMode; - - /** - * \brief Size of persistent memory - * - * This memory is allocated up front and stays allocated until the - * PxCudaContextManager is released. Size is in bytes, has to be power of two - * and bigger than the page size. Set to 0 to only use dynamic pages. - * - * Note: On Vista O/S and above, there is a per-memory allocation overhead - * to every CUDA work submission, so we recommend that you carefully tune - * this initial base memory size to closely approximate the amount of - * memory your application will consume. - - Note: This is currently not used by PxSceneFlag::eENABLE_GPU_DYNAMICS. Memory allocation properties are configured - for GPU rigid bodies using PxSceneDesc::gpuDynamicsConfig. - */ - uint32_t memoryBaseSize[PxCudaBufferMemorySpace::COUNT]; - - /** - * \brief Size of memory pages - * - * The memory manager will dynamically grow and shrink in blocks multiple of - * this page size. Size has to be power of two and bigger than 0. - - Note: This is currently not used by PxSceneFlag::eENABLE_GPU_DYNAMICS. Memory allocation properties are configured - for GPU rigid bodies using PxSceneDesc::gpuDynamicsConfig. - */ - uint32_t memoryPageSize[PxCudaBufferMemorySpace::COUNT]; - - /** - * \brief Maximum size of memory that the memory manager will allocate - - Note: This is currently not used by PxSceneFlag::eENABLE_GPU_DYNAMICS. Memory allocation properties are configured - for GPU rigid bodies using PxSceneDesc::gpuDynamicsConfig. - */ - uint32_t maxMemorySize[PxCudaBufferMemorySpace::COUNT]; - - PX_INLINE PxCudaContextManagerDesc() + PX_INLINE PxCudaContextManagerDesc() : + ctx (NULL), + graphicsDevice (NULL), + appGUID (NULL), + deviceAllocator (NULL), + interopMode (PxCudaInteropMode::NO_INTEROP) { - ctx = NULL; - interopMode = PxCudaInteropMode::NO_INTEROP; - graphicsDevice = 0; -#if PX_SUPPORT_GPU_PHYSX - appGUID = NULL; -#endif - for(uint32_t i = 0; i < PxCudaBufferMemorySpace::COUNT; i++) - { - memoryBaseSize[i] = 0; - memoryPageSize[i] = 2 * 1024*1024; - maxMemorySize[i] = UINT32_MAX; - } } }; +/** +\brief A cuda kernel index providing an index to the cuda module and the function name +*/ +struct PxKernelIndex +{ + PxU32 moduleIndex; + const char* functionName; +}; /** - * \brief Manages memory, thread locks, and task scheduling for a CUDA context + * \brief Manages thread locks, and task scheduling for a CUDA context * * A PxCudaContextManager manages access to a single CUDA context, allowing it to - * be shared between multiple scenes. Memory allocations are dynamic: starting - * with an initial heap size and growing on demand by a configurable page size. - * The context must be acquired from the manager before using any CUDA APIs. + * be shared between multiple scenes. + * The context must be acquired from the manager before using any CUDA APIs unless stated differently. * - * The PxCudaContextManager is based on the CUDA driver API and explictly does not + * The PxCudaContextManager is based on the CUDA driver API and explicitly does not * support the CUDA runtime API (aka, CUDART). */ class PxCudaContextManager { public: + /** + * \brief Schedules clear operation for a device memory buffer on the specified stream + * + * The cuda context will get acquired automatically + */ + template + void clearDeviceBufferAsync(T* deviceBuffer, PxU32 numElements, CUstream stream, PxI32 value = 0) + { + clearDeviceBufferAsyncInternal(deviceBuffer, numElements * sizeof(T), stream, value); + } + + /** + * \brief Copies a device buffer to the host + * + * The cuda context will get acquired automatically + */ + template + void copyDToH(T* hostBuffer, const T* deviceBuffer, PxU32 numElements) + { + copyDToHInternal(hostBuffer, deviceBuffer, numElements * sizeof(T)); + } + + /** + * \brief Copies a host buffer to the device + * + * The cuda context will get acquired automatically + */ + template + void copyHToD(T* deviceBuffer, const T* hostBuffer, PxU32 numElements) + { + copyHToDInternal(deviceBuffer, hostBuffer, numElements * sizeof(T)); + } + + /** + * \brief Schedules device to host copy operation on the specified stream + * + * The cuda context will get acquired automatically + */ + template + void copyDToHAsync(T* hostBuffer, const T* deviceBuffer, PxU32 numElements, CUstream stream) + { + copyDToHAsyncInternal(hostBuffer, deviceBuffer, numElements * sizeof(T), stream); + } + + /** + * \brief Schedules host to device copy operation on the specified stream + * + * The cuda context will get acquired automatically + */ + template + void copyHToDAsync(T* deviceBuffer, const T* hostBuffer, PxU32 numElements, CUstream stream) + { + copyHToDAsyncInternal(deviceBuffer, hostBuffer, numElements * sizeof(T), stream); + } + + /** + * \brief Schedules device to device copy operation on the specified stream + * + * The cuda context will get acquired automatically + */ + template + void copyDToDAsync(T* dstDeviceBuffer, const T* srcDeviceBuffer, PxU32 numElements, CUstream stream) + { + copyDToDAsyncInternal(dstDeviceBuffer, srcDeviceBuffer, numElements * sizeof(T), stream); + } + + /** + * \brief Allocates a device buffer + * + * The cuda context will get acquired automatically + */ + template + void allocDeviceBuffer(T*& deviceBuffer, PxU32 numElements, const char* filename = __FILE__, PxI32 line = __LINE__) + { + void* ptr = allocDeviceBufferInternal(numElements * sizeof(T), filename, line); + deviceBuffer = reinterpret_cast(ptr); + } + + /** + * \brief Allocates a device buffer and returns the pointer to the memory + * + * The cuda context will get acquired automatically + */ + template + T* allocDeviceBuffer(PxU32 numElements, const char* filename = __FILE__, PxI32 line = __LINE__) + { + void* ptr = allocDeviceBufferInternal(numElements * sizeof(T), filename, line); + return reinterpret_cast(ptr); + } + + /** + * \brief Frees a device buffer + * + * The cuda context will get acquired automatically + */ + template + void freeDeviceBuffer(T*& deviceBuffer) + { + freeDeviceBufferInternal(deviceBuffer); + deviceBuffer = NULL; + } + + /** + * \brief Allocates a pinned host buffer + * + * A pinned host buffer can be used on the gpu after getting a mapped device pointer from the pinned host buffer pointer, see getMappedDevicePtr + * The cuda context will get acquired automatically + * @see getMappedDevicePtr + */ + template + void allocPinnedHostBuffer(T*& pinnedHostBuffer, PxU32 numElements, const char* filename = __FILE__, PxI32 line = __LINE__) + { + void* ptr = allocPinnedHostBufferInternal(numElements * sizeof(T), filename, line); + pinnedHostBuffer = reinterpret_cast(ptr); + } + + /** + * \brief Allocates a pinned host buffer and returns the pointer to the memory + * + * A pinned host buffer can be used on the gpu after getting a mapped device pointer from the pinned host buffer pointer, see getMappedDevicePtr + * The cuda context will get acquired automatically + * @see getMappedDevicePtr + */ + template + T* allocPinnedHostBuffer(PxU32 numElements, const char* filename = __FILE__, PxI32 line = __LINE__) + { + void* ptr = allocPinnedHostBufferInternal(numElements * sizeof(T), filename, line); + return reinterpret_cast(ptr); + } + + /** + * \brief Frees a pinned host buffer + * + * The cuda context will get acquired automatically + */ + template + void freePinnedHostBuffer(T*& pinnedHostBuffer) + { + freePinnedHostBufferInternal(pinnedHostBuffer); + pinnedHostBuffer = NULL; + } + + /** + * \brief Gets a mapped pointer from a pinned host buffer that can be used in cuda kernels directly + * + * Data access performance with a mapped pinned host pointer will be slower than using a device pointer directly + * but the changes done in the kernel will be available on the host immediately. + * The cuda context will get acquired automatically + */ + virtual CUdeviceptr getMappedDevicePtr(void* pinnedHostBuffer) = 0; + /** * \brief Acquire the CUDA context for the current thread * @@ -232,13 +372,10 @@ public: */ virtual CUcontext getContext() = 0; - /** - * \brief Return the PxCudaMemoryManager instance associated with this - * CUDA context - * Note: This is currently not used by PxSceneFlag::eENABLE_GPU_DYNAMICS. Memory allocation properties are configured - * for GPU rigid bodies using PxSceneDesc::gpuDynamicsConfig. - */ - virtual PxCudaMemoryManager *getMemoryManager() = 0; + /** + * \brief Return the CudaContext + */ + virtual PxCudaContext* getCudaContext() = 0; /** * \brief Context manager has a valid CUDA context @@ -298,7 +435,7 @@ public: * \param buffer [IN] GLuint buffer index to be mapped to cuda * \param flags [IN] cuda interop registration flags */ - virtual bool registerResourceInCudaGL(CUgraphicsResource &resource, uint32_t buffer, PxCudaInteropRegisterFlags flags = PxCudaInteropRegisterFlags()) = 0; + virtual bool registerResourceInCudaGL(CUgraphicsResource& resource, uint32_t buffer, PxCudaInteropRegisterFlags flags = PxCudaInteropRegisterFlags()) = 0; /** * \brief Register a rendering resource with CUDA @@ -320,7 +457,7 @@ public: * \param resourcePointer [IN] A pointer to either IDirect3DResource9, or ID3D10Device, or ID3D11Resource to be registered. * \param flags [IN] cuda interop registration flags */ - virtual bool registerResourceInCudaD3D(CUgraphicsResource &resource, void *resourcePointer, PxCudaInteropRegisterFlags flags = PxCudaInteropRegisterFlags()) = 0; + virtual bool registerResourceInCudaD3D(CUgraphicsResource& resource, void* resourcePointer, PxCudaInteropRegisterFlags flags = PxCudaInteropRegisterFlags()) = 0; /** * \brief Unregister a rendering resource with CUDA @@ -340,14 +477,17 @@ public: */ virtual int usingDedicatedGPU() const = 0; + /** + * \brief Get the cuda modules that have been loaded into this context on construction + * \return Pointer to the cuda modules + */ + virtual CUmodule* getCuModules() = 0; + /** * \brief Release the PxCudaContextManager * - * When the manager instance is released, it also releases its - * PxCudaMemoryManager. Before the memory manager is released, it - * frees all allocated memory pages. If the PxCudaContextManager - * created the CUDA context it was responsible for, it also frees - * that context. + * If the PxCudaContextManager created the CUDA context it was + * responsible for, it also frees that context. * * Do not release the PxCudaContextManager if there are any scenes * using it. Those scenes must be released first. @@ -361,8 +501,31 @@ protected: * \brief protected destructor, use release() method */ virtual ~PxCudaContextManager() {} + + virtual void* allocDeviceBufferInternal(PxU32 numBytes, const char* filename = NULL, PxI32 line = -1) = 0; + virtual void* allocPinnedHostBufferInternal(PxU32 numBytes, const char* filename = NULL, PxI32 line = -1) = 0; + + virtual void freeDeviceBufferInternal(void* deviceBuffer) = 0; + virtual void freePinnedHostBufferInternal(void* pinnedHostBuffer) = 0; + + virtual void clearDeviceBufferAsyncInternal(void* deviceBuffer, PxU32 numBytes, CUstream stream, PxI32 value) = 0; + + virtual void copyDToHAsyncInternal(void* hostBuffer, const void* deviceBuffer, PxU32 numBytes, CUstream stream) = 0; + virtual void copyHToDAsyncInternal(void* deviceBuffer, const void* hostBuffer, PxU32 numBytes, CUstream stream) = 0; + virtual void copyDToDAsyncInternal(void* dstDeviceBuffer, const void* srcDeviceBuffer, PxU32 numBytes, CUstream stream) = 0; + + virtual void copyDToHInternal(void* hostBuffer, const void* deviceBuffer, PxU32 numBytes) = 0; + virtual void copyHToDInternal(void* deviceBuffer, const void* hostBuffer, PxU32 numBytes) = 0; }; +#define PX_DEVICE_ALLOC(cudaContextManager, deviceBuffer, numElements) cudaContextManager->allocDeviceBuffer(deviceBuffer, numElements, __FILE__, __LINE__) +#define PX_DEVICE_ALLOC_T(T, cudaContextManager, numElements) cudaContextManager->allocDeviceBuffer(numElements, __FILE__, __LINE__) +#define PX_DEVICE_FREE(cudaContextManager, deviceBuffer) cudaContextManager->freeDeviceBuffer(deviceBuffer); + +#define PX_PINNED_HOST_ALLOC(cudaContextManager, pinnedHostBuffer, numElements) cudaContextManager->allocPinnedHostBuffer(pinnedHostBuffer, numElements, __FILE__, __LINE__) +#define PX_PINNED_HOST_ALLOC_T(T, cudaContextManager, numElements) cudaContextManager->allocPinnedHostBuffer(numElements, __FILE__, __LINE__) +#define PX_PINNED_HOST_FREE(cudaContextManager, pinnedHostBuffer) cudaContextManager->freePinnedHostBuffer(pinnedHostBuffer); + /** * \brief Convenience class for holding CUDA lock within a scope */ @@ -393,7 +556,9 @@ protected: PxCudaContextManager* mCtx; }; -} // end physx namespace +#if !PX_DOXYGEN +} // namespace physx +#endif #endif // PX_SUPPORT_GPU_PHYSX -#endif // PXCUDACONTEXTMANAGER_PXCUDACONTEXTMANAGER_H +#endif diff --git a/Source/ThirdParty/PhysX/cudamanager/PxCudaMemoryManager.h b/Source/ThirdParty/PhysX/cudamanager/PxCudaMemoryManager.h deleted file mode 100644 index 83dc2cce9..000000000 --- a/Source/ThirdParty/PhysX/cudamanager/PxCudaMemoryManager.h +++ /dev/null @@ -1,281 +0,0 @@ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// * Neither the name of NVIDIA CORPORATION nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. - -#ifndef PXCUDACONTEXTMANAGER_PXCUDAMEMORYMANAGER_H -#define PXCUDACONTEXTMANAGER_PXCUDAMEMORYMANAGER_H - -#include "foundation/PxPreprocessor.h" - -#if PX_SUPPORT_GPU_PHYSX - -#include "task/PxTaskDefine.h" - -// some macros to keep the source code more readable -#define PX_ALLOC_INFO(name, ID) __FILE__, __LINE__, name, physx::PxAllocId::ID -#define PX_ALLOC_INFO_PARAMS_DECL(p0, p1, p2, p3) const char* file = p0, int line = p1, const char* allocName = p2, physx::PxAllocId::Enum allocId = physx::PxAllocId::p3 -#define PX_ALLOC_INFO_PARAMS_DEF() const char* file, int line, const char* allocName, physx::PxAllocId::Enum allocId -#define PX_ALLOC_INFO_PARAMS_INPUT() file, line, allocName, allocId -#define PX_ALLOC_INFO_PARAMS_INPUT_INFO(info) info.getFileName(), info.getLine(), info.getAllocName(), info.getAllocId() - -#ifndef NULL // don't want to include -#define NULL 0 -#endif - -namespace physx -{ - -PX_PUSH_PACK_DEFAULT - -/** \brief ID of the Feature which owns/allocated memory from the heap - * - * Maximum of 64k IDs allowed. - */ -struct PxAllocId -{ - /** - * \brief ID of the Feature which owns/allocated memory from the heap - */ - enum Enum - { - UNASSIGNED, //!< default - APEX, //!< APEX stuff not further classified - PARTICLES, //!< all particle related - GPU_UTIL, //!< e.g. RadixSort (used in SPH and deformable self collision) - CLOTH, //!< all cloth related - NUM_IDS //!< number of IDs, be aware that ApexHeapStats contains PxAllocIdStats[NUM_IDS] - }; -}; - -/// \brief memory type managed by a heap -struct PxCudaBufferMemorySpace -{ - /** - * \brief memory type managed by a heap - */ - enum Enum - { - T_GPU, - T_PINNED_HOST, - T_WRITE_COMBINED, - T_HOST, - COUNT - }; -}; - -/// \brief class to track allocation statistics, see PxgMirrored -class PxAllocInfo -{ -public: - /** - * \brief AllocInfo default constructor - */ - PxAllocInfo() {} - - /** - * \brief AllocInfo constructor that initializes all of the members - */ - PxAllocInfo(const char* file, int line, const char* allocName, PxAllocId::Enum allocId) - : mFileName(file) - , mLine(line) - , mAllocName(allocName) - , mAllocId(allocId) - {} - - /// \brief get the allocation file name - inline const char* getFileName() const - { - return mFileName; - } - - /// \brief get the allocation line - inline int getLine() const - { - return mLine; - } - - /// \brief get the allocation name - inline const char* getAllocName() const - { - return mAllocName; - } - - /// \brief get the allocation ID - inline PxAllocId::Enum getAllocId() const - { - return mAllocId; - } - -private: - const char* mFileName; - int mLine; - const char* mAllocName; - PxAllocId::Enum mAllocId; -}; - -/// \brief statistics collected per AllocationId by HeapManager. -struct PxAllocIdStats -{ - size_t size; //!< currently allocated memory by this ID - size_t maxSize; //!< max allocated memory by this ID - size_t elements; //!< number of current allocations by this ID - size_t maxElements; //!< max number of allocations by this ID -}; - -class PxCudaMemoryManager; -typedef size_t PxCudaBufferPtr; - -/// \brief Hint flag to tell how the buffer will be used -struct PxCudaBufferFlags -{ -/// \brief Enumerations for the hint flag to tell how the buffer will be used - enum Enum - { - F_READ = (1 << 0), - F_WRITE = (1 << 1), - F_READ_WRITE = F_READ | F_WRITE - }; -}; - - -/// \brief Memory statistics struct returned by CudaMemMgr::getStats() -struct PxCudaMemoryManagerStats -{ - - size_t heapSize; //!< Size of all pages allocated for this memory type (allocated + free). - size_t totalAllocated; //!< Size occupied by the current allocations. - size_t maxAllocated; //!< High water mark of allocations since the SDK was created. - PxAllocIdStats allocIdStats[PxAllocId::NUM_IDS]; //!< Stats for each allocation ID, see PxAllocIdStats -}; - - -/// \brief Buffer type: made of hint flags and the memory space (Device Memory, Pinned Host Memory, ...) -struct PxCudaBufferType -{ - /// \brief PxCudaBufferType copy constructor - PX_INLINE PxCudaBufferType(const PxCudaBufferType& t) - : memorySpace(t.memorySpace) - , flags(t.flags) - {} - - /// \brief PxCudaBufferType constructor to explicitely assign members - PX_INLINE PxCudaBufferType(PxCudaBufferMemorySpace::Enum _memSpace, PxCudaBufferFlags::Enum _flags) - : memorySpace(_memSpace) - , flags(_flags) - {} - - PxCudaBufferMemorySpace::Enum memorySpace; //!< specifies which memory space for the buffer - PxCudaBufferFlags::Enum flags; //!< specifies the usage flags for the buffer -}; - - -/// \brief Buffer which keeps informations about allocated piece of memory. -class PxCudaBuffer -{ -public: - /// Retrieves the manager over which the buffer was allocated. - virtual PxCudaMemoryManager* getCudaMemoryManager() const = 0; - - /// Releases the buffer and the memory it used, returns true if successful. - virtual bool free() = 0; - - /// Realloc memory. Use to shrink or resize the allocated chunk of memory of this buffer. - /// Returns true if successful. Fails if the operation would change the address and need a memcopy. - /// In that case the user has to allocate, copy and free the memory with separate steps. - /// Realloc to size 0 always returns false and doesn't change the state. - virtual bool realloc(size_t size, PX_ALLOC_INFO_PARAMS_DECL(NULL, 0, NULL, UNASSIGNED)) = 0; - - /// Returns the type of the allocated memory. - virtual const PxCudaBufferType& getType() const = 0; - - /// Returns the pointer to the allocated memory. - virtual PxCudaBufferPtr getPtr() const = 0; - - /// Returns the size of the allocated memory. - virtual size_t getSize() const = 0; - -protected: - /// \brief protected destructor - virtual ~PxCudaBuffer() {} -}; - - -/// \brief Allocator class for different kinds of CUDA related memory. -class PxCudaMemoryManager -{ -public: - /// Allocate memory of given type and size. Returns a CudaBuffer if successful. Returns NULL if failed. - virtual PxCudaBuffer* alloc(const PxCudaBufferType& type, size_t size, PX_ALLOC_INFO_PARAMS_DECL(NULL, 0, NULL, UNASSIGNED)) = 0; - - /// Basic heap allocator without PxCudaBuffer - virtual PxCudaBufferPtr alloc(PxCudaBufferMemorySpace::Enum memorySpace, size_t size, PX_ALLOC_INFO_PARAMS_DECL(NULL, 0, NULL, UNASSIGNED)) = 0; - - /// Basic heap deallocator without PxCudaBuffer - virtual bool free(PxCudaBufferMemorySpace::Enum memorySpace, PxCudaBufferPtr addr) = 0; - - /// Basic heap realloc without PxCudaBuffer - virtual bool realloc(PxCudaBufferMemorySpace::Enum memorySpace, PxCudaBufferPtr addr, size_t size, PX_ALLOC_INFO_PARAMS_DECL(NULL, 0, NULL, UNASSIGNED)) = 0; - - /// Retrieve stats for the memory of given type. See PxCudaMemoryManagerStats. - virtual void getStats(const PxCudaBufferType& type, PxCudaMemoryManagerStats& outStats) = 0; - - /// Ensure that a given amount of free memory is available. Triggers CUDA allocations in size of (2^n * pageSize) if necessary. - /// Returns false if page allocations failed. - virtual bool reserve(const PxCudaBufferType& type, size_t size) = 0; - - /// Set the page size. The managed memory grows by blocks 2^n * pageSize. Page allocations trigger CUDA driver allocations, - /// so the page size should be reasonably big. Returns false if input size was invalid, i.e. not power of two. - /// Default is 2 MB. - virtual bool setPageSize(const PxCudaBufferType& type, size_t size) = 0; - - /// Set the upper limit until which pages of a given memory type can be allocated. - /// Reducing the max when it is already hit does not shrink the memory until it is deallocated by releasing the buffers which own the memory. - virtual bool setMaxMemorySize(const PxCudaBufferType& type, size_t size) = 0; - - /// Returns the base size. The base memory block stays persistently allocated over the SDKs life time. - virtual size_t getBaseSize(const PxCudaBufferType& type) = 0; - - /// Returns the currently set page size. The memory grows and shrinks in blocks of size (2^n pageSize) - virtual size_t getPageSize(const PxCudaBufferType& type) = 0; - - /// Returns the upper limit until which the manager is allowed to allocate additional pages from the CUDA driver. - virtual size_t getMaxMemorySize(const PxCudaBufferType& type) = 0; - - /// Get device mapped pinned host mem ptr. Operation only valid for memory space PxCudaBufferMemorySpace::T_PINNED_HOST. - virtual PxCudaBufferPtr getMappedPinnedPtr(PxCudaBufferPtr hostPtr) = 0; - -protected: - /// \brief protected destructor - virtual ~PxCudaMemoryManager() {} -}; - -PX_POP_PACK - - -} // end physx namespace - -#endif // PX_SUPPORT_GPU_PHYSX -#endif // PXCUDACONTEXTMANAGER_PXCUDAMEMORYMANAGER_H diff --git a/Source/ThirdParty/PhysX/cudamanager/PxCudaTypes.h b/Source/ThirdParty/PhysX/cudamanager/PxCudaTypes.h new file mode 100644 index 000000000..97ee47d88 --- /dev/null +++ b/Source/ThirdParty/PhysX/cudamanager/PxCudaTypes.h @@ -0,0 +1,70 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. + +#ifndef PX_CUDA_TYPES_H +#define PX_CUDA_TYPES_H + +//type definitions to avoid forced inclusion of cuda.h +//if cuda.h is needed anyway, please include it before PxCudaContextManager.h, PxCudaContext.h or PxCudaTypes.h + +#include "foundation/PxPreprocessor.h" + +#if PX_SUPPORT_GPU_PHYSX +#ifndef CUDA_VERSION + +#include "foundation/PxSimpleTypes.h" + +#if PX_LINUX && !PX_A64 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wc++98-compat-pedantic" +#endif + +#if PX_P64_FAMILY +typedef unsigned long long CUdeviceptr; +#else +typedef unsigned int CUdeviceptr; +#endif + +#if PX_LINUX && !PX_A64 +#pragma GCC diagnostic pop +#endif + +typedef int CUdevice; + +typedef struct CUctx_st* CUcontext; +typedef struct CUmod_st* CUmodule; +typedef struct CUfunc_st* CUfunction; +typedef struct CUstream_st* CUstream; +typedef struct CUevent_st* CUevent; +typedef struct CUgraphicsResource_st* CUgraphicsResource; + +#endif + +#else +typedef struct CUstream_st* CUstream; // We declare some callbacks taking CUstream as an argument even when building with PX_SUPPORT_GPU_PHYSX = 0. +#endif // PX_SUPPORT_GPU_PHYSX +#endif + diff --git a/Source/ThirdParty/PhysX/extensions/PxBinaryConverter.h b/Source/ThirdParty/PhysX/extensions/PxBinaryConverter.h index ec790a72d..f2421e651 100644 --- a/Source/ThirdParty/PhysX/extensions/PxBinaryConverter.h +++ b/Source/ThirdParty/PhysX/extensions/PxBinaryConverter.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,11 +22,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - #ifndef PX_BINARY_CONVERTER_H #define PX_BINARY_CONVERTER_H /** \addtogroup extensions @@ -41,7 +39,7 @@ namespace physx { #endif -struct PxConverterReportMode +struct PX_DEPRECATED PxConverterReportMode { enum Enum { @@ -55,6 +53,8 @@ struct PxConverterReportMode /** \brief Binary converter for serialized streams. +\deprecated Binary conversion and binary meta data are deprecated. + The binary converter class is targeted at converting binary streams from authoring platforms, such as windows, osx or linux to any game runtime platform supported by PhysX. Particularly it is currently not supported to run the converter on a platforms that has an endian mismatch @@ -65,7 +65,7 @@ of this class for each thread. @see PxSerialization.createBinaryConverter */ -class PxBinaryConverter +class PX_DEPRECATED PxBinaryConverter { public: diff --git a/Source/ThirdParty/PhysX/extensions/PxBroadPhaseExt.h b/Source/ThirdParty/PhysX/extensions/PxBroadPhaseExt.h index d5562192d..614fb89fb 100644 --- a/Source/ThirdParty/PhysX/extensions/PxBroadPhaseExt.h +++ b/Source/ThirdParty/PhysX/extensions/PxBroadPhaseExt.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_EXTENSIONS_BROAD_PHASE_H -#define PX_PHYSICS_EXTENSIONS_BROAD_PHASE_H +#ifndef PX_BROAD_PHASE_EXT_H +#define PX_BROAD_PHASE_EXT_H /** \addtogroup extensions @{ */ diff --git a/Source/ThirdParty/PhysX/extensions/PxCollectionExt.h b/Source/ThirdParty/PhysX/extensions/PxCollectionExt.h index 85e8bee42..d17f5ddc0 100644 --- a/Source/ThirdParty/PhysX/extensions/PxCollectionExt.h +++ b/Source/ThirdParty/PhysX/extensions/PxCollectionExt.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,11 +22,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - #ifndef PX_COLLECTION_EXT_H #define PX_COLLECTION_EXT_H /** \addtogroup extensions @@ -42,6 +40,9 @@ namespace physx { #endif + class PxCollection; + class PxScene; + class PxCollectionExt { public: @@ -75,7 +76,6 @@ namespace physx */ static void remove(PxCollection& collection, PxType concreteType, PxCollection* to = NULL); - /** \brief Collects all objects in PxPhysics that are shareable across multiple scenes. @@ -95,9 +95,9 @@ namespace physx /** \brief Collects all objects from a PxScene. - This function creates a new collection from all objects that where added to the specified + This function creates a new collection from all objects that were added to the specified PxScene. Instances of the following types are included: PxActor, PxAggregate, - PxArticulation and PxJoint (other PxConstraint types are not included). + PxArticulationReducedCoordinate and PxJoint (other PxConstraint types are not included). This is a helper function to ease the creation of collections for serialization. The function PxSerialization.complete() can be used to complete the collection with required objects prior to diff --git a/Source/ThirdParty/PhysX/extensions/PxConstraintExt.h b/Source/ThirdParty/PhysX/extensions/PxConstraintExt.h index 6c7a916bd..0a585e8d0 100644 --- a/Source/ThirdParty/PhysX/extensions/PxConstraintExt.h +++ b/Source/ThirdParty/PhysX/extensions/PxConstraintExt.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_EXTENSIONS_CONSTRAINT_H -#define PX_PHYSICS_EXTENSIONS_CONSTRAINT_H +#ifndef PX_CONSTRAINT_EXT_H +#define PX_CONSTRAINT_EXT_H #include "foundation/PxPreprocessor.h" @@ -55,8 +53,9 @@ struct PxConstraintExtIDs enum Enum { eJOINT, - eVEHICLE_SUSP_LIMIT, - eVEHICLE_STICKY_TYRE, + eVEHICLE_SUSP_LIMIT_DEPRECATED, + eVEHICLE_STICKY_TYRE_DEPRECATED, + eVEHICLE_JOINT, eNEXT_FREE_ID, eINVALID_ID = 0x7fffffff }; diff --git a/Source/ThirdParty/PhysX/extensions/PxContactJoint.h b/Source/ThirdParty/PhysX/extensions/PxContactJoint.h index b3f149b77..a49ec1aa6 100644 --- a/Source/ThirdParty/PhysX/extensions/PxContactJoint.h +++ b/Source/ThirdParty/PhysX/extensions/PxContactJoint.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_CONTACTJOINT_H -#define PX_CONTACTJOINT_H +#ifndef PX_CONTACT_JOINT_H +#define PX_CONTACT_JOINT_H #include "extensions/PxJoint.h" @@ -126,8 +125,8 @@ namespace physx */ virtual PxReal getPenetration() const = 0; - virtual PxReal getResititution() const = 0; - virtual void setResititution(const PxReal resititution) = 0; + virtual PxReal getRestitution() const = 0; + virtual void setRestitution(const PxReal restitution) = 0; virtual PxReal getBounceThreshold() const = 0; virtual void setBounceThreshold(const PxReal bounceThreshold) = 0; diff --git a/Source/ThirdParty/PhysX/extensions/PxConvexMeshExt.h b/Source/ThirdParty/PhysX/extensions/PxConvexMeshExt.h index 5b33980df..0db30b9fe 100644 --- a/Source/ThirdParty/PhysX/extensions/PxConvexMeshExt.h +++ b/Source/ThirdParty/PhysX/extensions/PxConvexMeshExt.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_EXTENSIONS_CONVEX_MESH_H -#define PX_PHYSICS_EXTENSIONS_CONVEX_MESH_H +#ifndef PX_CONVEX_MESH_EXT_H +#define PX_CONVEX_MESH_EXT_H /** \addtogroup extensions @{ */ diff --git a/Source/ThirdParty/PhysX/extensions/PxCustomGeometryExt.h b/Source/ThirdParty/PhysX/extensions/PxCustomGeometryExt.h new file mode 100644 index 000000000..c9bdf6404 --- /dev/null +++ b/Source/ThirdParty/PhysX/extensions/PxCustomGeometryExt.h @@ -0,0 +1,173 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_CUSTOM_GEOMETRY_EXT_H +#define PX_CUSTOM_GEOMETRY_EXT_H +/** \addtogroup extensions + @{ +*/ + +#include +#include + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +class PxGeometry; +class PxMassProperties; +class PxGeometryHolder; +struct PxContactPoint; + +/** +\brief Pre-made custom geometry callbacks implementations. +*/ +class PxCustomGeometryExt +{ +public: + + /// \cond PRIVATE + struct BaseConvexCallbacks : PxCustomGeometry::Callbacks, PxGjkQuery::Support + { + float margin; + + BaseConvexCallbacks(float _margin) : margin(_margin) {} + + // override PxCustomGeometry::Callbacks + virtual PxBounds3 getLocalBounds(const PxGeometry& geometry) const; + virtual bool generateContacts(const PxGeometry& geom0, const PxGeometry& geom1, const PxTransform& pose0, const PxTransform& pose1, + const PxReal contactDistance, const PxReal meshContactMargin, const PxReal toleranceLength, + PxContactBuffer& contactBuffer) const; + virtual PxU32 raycast(const PxVec3& origin, const PxVec3& unitDir, const PxGeometry& geom, const PxTransform& pose, + PxReal maxDist, PxHitFlags hitFlags, PxU32 maxHits, PxGeomRaycastHit* rayHits, PxU32 stride, PxRaycastThreadContext*) const; + virtual bool overlap(const PxGeometry& geom0, const PxTransform& pose0, const PxGeometry& geom1, const PxTransform& pose1, PxOverlapThreadContext*) const; + virtual bool sweep(const PxVec3& unitDir, const PxReal maxDist, + const PxGeometry& geom0, const PxTransform& pose0, const PxGeometry& geom1, const PxTransform& pose1, + PxGeomSweepHit& sweepHit, PxHitFlags hitFlags, const PxReal inflation, PxSweepThreadContext*) const; + virtual bool usePersistentContactManifold(const PxGeometry& geometry, PxReal& breakingThreshold) const; + + // override PxGjkQuery::Support + virtual PxReal getMargin() const { return margin; } + + protected: + + // Substitute geometry + virtual bool useSubstituteGeometry(PxGeometryHolder& geom, PxTransform& preTransform, const PxContactPoint& p, const PxTransform& pose0, const PxVec3& pos1) const = 0; + }; + /// \endcond + + /** + \brief Cylinder geometry callbacks + */ + struct CylinderCallbacks : BaseConvexCallbacks + { + /// \brief Cylinder height + float height; + /// \brief Cylinder radius + float radius; + /// \brief Cylinder axis + int axis; + + /** + \brief Construct cylinder geometry callbacks object + + \param[in] height The cylinder height. + \param[in] radius The cylinder radius. + \param[in] axis The cylinder axis (0 - X, 1 - Y, 2 - Z). + \param[in] margin The cylinder margin. + */ + CylinderCallbacks(float height, float radius, int axis = 0, float margin = 0); + + /// \cond PRIVATE + // override PxCustomGeometry::Callbacks + DECLARE_CUSTOM_GEOMETRY_TYPE + virtual void visualize(const PxGeometry&, PxRenderOutput&, const PxTransform&, const PxBounds3&) const; + virtual void computeMassProperties(const PxGeometry& geometry, PxMassProperties& massProperties) const; + + // override PxGjkQuery::Support + virtual PxVec3 supportLocal(const PxVec3& dir) const; + + protected: + + // Substitute geometry + virtual bool useSubstituteGeometry(PxGeometryHolder& geom, PxTransform& preTransform, const PxContactPoint& p, const PxTransform& pose0, const PxVec3& pos1) const; + + // Radius at height + float getRadiusAtHeight(float height) const; + /// \endcond + }; + + /** + \brief Cone geometry callbacks + */ + struct ConeCallbacks : BaseConvexCallbacks + { + /// \brief Cone height + float height; + /// \brief Cone radius + float radius; + /// \brief Cone axis + int axis; + + /** + \brief Construct cone geometry callbacks object + + \param[in] height The cylinder height. + \param[in] radius The cylinder radius. + \param[in] axis The cylinder axis (0 - X, 1 - Y, 2 - Z). + \param[in] margin The cylinder margin. + */ + ConeCallbacks(float height, float radius, int axis = 0, float margin = 0); + + /// \cond PRIVATE + // override PxCustomGeometry::Callbacks + DECLARE_CUSTOM_GEOMETRY_TYPE + virtual void visualize(const PxGeometry&, PxRenderOutput&, const PxTransform&, const PxBounds3&) const; + virtual void computeMassProperties(const PxGeometry& geometry, PxMassProperties& massProperties) const; + + // override PxGjkQuery::Support + virtual PxVec3 supportLocal(const PxVec3& dir) const; + + protected: + + // Substitute geometry + virtual bool useSubstituteGeometry(PxGeometryHolder& geom, PxTransform& preTransform, const PxContactPoint& p, const PxTransform& pose0, const PxVec3& pos1) const; + + // Radius at height + float getRadiusAtHeight(float height) const; + /// \endcond + }; +}; + +#if !PX_DOXYGEN +} +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/extensions/PxCustomSceneQuerySystem.h b/Source/ThirdParty/PhysX/extensions/PxCustomSceneQuerySystem.h new file mode 100644 index 000000000..b245fa0a1 --- /dev/null +++ b/Source/ThirdParty/PhysX/extensions/PxCustomSceneQuerySystem.h @@ -0,0 +1,191 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_NEW_SCENE_QUERY_SYSTEM_H +#define PX_NEW_SCENE_QUERY_SYSTEM_H +/** \addtogroup extensions + @{ +*/ + +#include "PxSceneQuerySystem.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief A custom scene query system. + + This is an example of a custom scene query system. It augments the PxSceneQuerySystem API to support an arbitrary number + of "pruners", instead of the usual hardcoded two. + + It might not be possible to support the whole PxSceneQuerySystem API in this context. See the source code for details. + + @see PxSceneQuerySystem + */ + class PxCustomSceneQuerySystem : public PxSceneQuerySystem + { + public: + PxCustomSceneQuerySystem() {} + virtual ~PxCustomSceneQuerySystem() {} + + /** + \brief Adds a pruner to the system. + + The internal PhysX scene-query system uses two regular pruners (one for static shapes, one for dynamic shapes) and an optional + compound pruner. Our custom scene query system supports an arbitrary number of regular pruners. + + This can be useful to reduce the load on each pruner, in particular during updates, when internal trees are rebuilt in the + background. On the other hand this implementation simply iterates over all created pruners to perform queries, so their cost + might increase if a large number of pruners is used. + + In any case this serves as an example of how the PxSceneQuerySystem API can be used to customize scene queries. + + \param[in] primaryType Desired primary (main) type for the new pruner + \param[in] secondaryType Secondary type when primary type is PxPruningStructureType::eDYNAMIC_AABB_TREE. + \param[in] preallocated Optional number of preallocated shapes in the new pruner + + \return A pruner index + + @see PxCustomSceneQuerySystem PxSceneQueryUpdateMode PxCustomSceneQuerySystemAdapter PxSceneDesc::sceneQuerySystem + */ + virtual PxU32 addPruner(PxPruningStructureType::Enum primaryType, PxDynamicTreeSecondaryPruner::Enum secondaryType, PxU32 preallocated=0) = 0; + + /** + \brief Start custom build-steps for all pruners + + This function is used in combination with customBuildstep() and finishCustomBuildstep() to let users take control + of the pruners' build-step & commit calls - basically the pruners' update functions. These functions should be used + with the PxSceneQueryUpdateMode::eBUILD_DISABLED_COMMIT_DISABLED update mode, otherwise the build-steps will happen + automatically in fetchResults. For N pruners it can be more efficient to use these custom build-step functions to + perform the updates in parallel: + + - call startCustomBuildstep() first (one synchronous call) + - for each pruner, call customBuildstep() (asynchronous calls from multiple threads) + - once it is done, call finishCustomBuildstep() to finish the update (synchronous call) + + The multi-threaded update is more efficient here than what it is in PxScene, because the "flushShapes()" call is + also multi-threaded (while it is not in PxScene). + + Note that users are responsible for locks here, and these calls should not overlap with other SQ calls. In particular + one should not add new objects to the SQ system or perform queries while these calls are happening. + + \return The number of pruners in the system. + + @see customBuildstep finishCustomBuildstep PxSceneQueryUpdateMode + */ + virtual PxU32 startCustomBuildstep() = 0; + + /** + \brief Perform a custom build-step for a given pruner. + + \param[in] index Pruner index (should be between 0 and the number returned by startCustomBuildstep) + + @see startCustomBuildstep finishCustomBuildstep + */ + virtual void customBuildstep(PxU32 index) = 0; + + /** + \brief Finish custom build-steps + + Call this function once after all the customBuildstep() calls are done. + + @see startCustomBuildstep customBuildstep + */ + virtual void finishCustomBuildstep() = 0; + }; + + /** + \brief An adapter class to customize the object-to-pruner mapping. + + In the regular PhysX code static shapes went to the static pruner, and dynamic shapes went to the + dynamic pruner. + + This class is a replacement for this mapping when N user-defined pruners are involved. + */ + class PxCustomSceneQuerySystemAdapter + { + public: + PxCustomSceneQuerySystemAdapter() {} + virtual ~PxCustomSceneQuerySystemAdapter() {} + + /** + \brief Gets a pruner index for an actor/shape. + + This user-defined function tells the system in which pruner a given actor/shape should go. + + \note The returned index must be valid, i.e. it must have been previously returned to users by PxCustomSceneQuerySystem::addPruner. + + \param[in] actor The actor + \param[in] shape The shape + + \return A pruner index for this actor/shape. + + @see PxRigidActor PxShape PxCustomSceneQuerySystem::addPruner + */ + virtual PxU32 getPrunerIndex(const PxRigidActor& actor, const PxShape& shape) const = 0; + + /** + \brief Pruner filtering callback. + + This will be called for each query to validate whether it should process a given pruner. + + \param[in] prunerIndex The index of currently processed pruner + \param[in] context The query context + \param[in] filterData The query's filter data + \param[in] filterCall The query's filter callback + + \return True to process the pruner, false to skip it entirely + */ + virtual bool processPruner(PxU32 prunerIndex, const PxQueryThreadContext* context, const PxQueryFilterData& filterData, PxQueryFilterCallback* filterCall) const = 0; + }; + + /** + \brief Creates a custom scene query system. + + This is similar to PxCreateExternalSceneQuerySystem, except this function creates a PxCustomSceneQuerySystem object. + It can be plugged to PxScene the same way, via PxSceneDesc::sceneQuerySystem. + + \param[in] sceneQueryUpdateMode Desired update mode + \param[in] contextID Context ID parameter, sent to the profiler + \param[in] adapter Adapter class implementing our extended API + \param[in] usesTreeOfPruners True to keep pruners themselves in a BVH, which might increase query performance if a lot of pruners are involved + + \return A custom SQ system instance + + @see PxCustomSceneQuerySystem PxSceneQueryUpdateMode PxCustomSceneQuerySystemAdapter PxSceneDesc::sceneQuerySystem + */ + PxCustomSceneQuerySystem* PxCreateCustomSceneQuerySystem(PxSceneQueryUpdateMode::Enum sceneQueryUpdateMode, PxU64 contextID, const PxCustomSceneQuerySystemAdapter& adapter, bool usesTreeOfPruners=false); + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/extensions/PxD6Joint.h b/Source/ThirdParty/PhysX/extensions/PxD6Joint.h index 0b1cb6c36..84eab70f9 100644 --- a/Source/ThirdParty/PhysX/extensions/PxD6Joint.h +++ b/Source/ThirdParty/PhysX/extensions/PxD6Joint.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_D6JOINT_H -#define PX_D6JOINT_H +#ifndef PX_D6_JOINT_H +#define PX_D6_JOINT_H /** \addtogroup extensions @{ */ @@ -429,7 +428,8 @@ public: Default the identity transform \param[in] pose The goal drive pose if positional drive is in use. - \param[in] autowake Whether to wake the joint rigids up if it is asleep. + \param[in] autowake If true and the attached actors are in a scene, this call wakes them up and increases their + wake counters to #PxSceneDesc::wakeCounterResetValue if the counter value is below the reset value. @see setDrivePosition() */ @@ -449,7 +449,8 @@ public: \param[in] linear The goal velocity for linear drive \param[in] angular The goal velocity for angular drive - \param[in] autowake Whether to wake the joint rigids up if it is asleep. + \param[in] autowake If true and the attached actors are in a scene, this call wakes them up and increases their + wake counters to #PxSceneDesc::wakeCounterResetValue if the counter value is below the reset value. @see getDriveVelocity() */ @@ -482,8 +483,10 @@ public: \param[in] tolerance the linear tolerance threshold @see getProjectionLinearTolerance() PxJoint::setConstraintFlags() PxConstraintFlag::ePROJECTION + + @deprecated */ - virtual void setProjectionLinearTolerance(PxReal tolerance) = 0; + PX_DEPRECATED virtual void setProjectionLinearTolerance(PxReal tolerance) = 0; /** \brief Get the linear tolerance threshold for projection. @@ -491,8 +494,10 @@ public: \return the linear tolerance threshold @see setProjectionLinearTolerance() + + @deprecated */ - virtual PxReal getProjectionLinearTolerance() const = 0; + PX_DEPRECATED virtual PxReal getProjectionLinearTolerance() const = 0; /** \brief Set the angular tolerance threshold for projection. Projection is enabled if @@ -514,8 +519,10 @@ public: Angular projection is implemented only for the case of two or three locked angular degrees of freedom. @see getProjectionAngularTolerance() PxJoint::setConstraintFlag() PxConstraintFlag::ePROJECTION + + @deprecated */ - virtual void setProjectionAngularTolerance(PxReal tolerance) = 0; + PX_DEPRECATED virtual void setProjectionAngularTolerance(PxReal tolerance) = 0; /** \brief Get the angular tolerance threshold for projection. @@ -523,8 +530,10 @@ public: \return tolerance the angular tolerance threshold in radians @see setProjectionAngularTolerance() + + @deprecated */ - virtual PxReal getProjectionAngularTolerance() const = 0; + PX_DEPRECATED virtual PxReal getProjectionAngularTolerance() const = 0; /** \brief Returns string name of PxD6Joint, used for serialization diff --git a/Source/ThirdParty/PhysX/extensions/PxD6JointCreate.h b/Source/ThirdParty/PhysX/extensions/PxD6JointCreate.h index 8459dce58..39f16963e 100644 --- a/Source/ThirdParty/PhysX/extensions/PxD6JointCreate.h +++ b/Source/ThirdParty/PhysX/extensions/PxD6JointCreate.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_D6JOINT_CREATE_H -#define PX_D6JOINT_CREATE_H +#ifndef PX_D6_JOINT_CREATE_H +#define PX_D6_JOINT_CREATE_H #include "common/PxPhysXCommonConfig.h" diff --git a/Source/ThirdParty/PhysX/extensions/PxDefaultAllocator.h b/Source/ThirdParty/PhysX/extensions/PxDefaultAllocator.h index 8c24172d0..940abd928 100644 --- a/Source/ThirdParty/PhysX/extensions/PxDefaultAllocator.h +++ b/Source/ThirdParty/PhysX/extensions/PxDefaultAllocator.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,11 +22,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - #ifndef PX_DEFAULT_ALLOCATOR_H #define PX_DEFAULT_ALLOCATOR_H /** \addtogroup extensions @@ -89,14 +87,14 @@ PX_FORCE_INLINE void platformAlignedFree(void* ptr) class PxDefaultAllocator : public PxAllocatorCallback { public: - void* allocate(size_t size, const char*, const char*, int) + virtual void* allocate(size_t size, const char*, const char*, int) { void* ptr = platformAlignedAlloc(size); - PX_ASSERT((reinterpret_cast(ptr) & 15)==0); + PX_ASSERT((size_t(ptr) & 15)==0); return ptr; } - void deallocate(void* ptr) + virtual void deallocate(void* ptr) { platformAlignedFree(ptr); } diff --git a/Source/ThirdParty/PhysX/extensions/PxDefaultCpuDispatcher.h b/Source/ThirdParty/PhysX/extensions/PxDefaultCpuDispatcher.h index 8ad081ccf..9aadb99fd 100644 --- a/Source/ThirdParty/PhysX/extensions/PxDefaultCpuDispatcher.h +++ b/Source/ThirdParty/PhysX/extensions/PxDefaultCpuDispatcher.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_EXTENSIONS_DEFAULT_CPU_DISPATCHER_H -#define PX_PHYSICS_EXTENSIONS_DEFAULT_CPU_DISPATCHER_H +#ifndef PX_DEFAULT_CPU_DISPATCHER_H +#define PX_DEFAULT_CPU_DISPATCHER_H /** \addtogroup extensions @{ */ @@ -47,7 +45,7 @@ namespace physx @see PxDefaultCpuDispatcherCreate() PxCpuDispatcher */ -class PxDefaultCpuDispatcher: public PxCpuDispatcher +class PxDefaultCpuDispatcher : public PxCpuDispatcher { public: /** @@ -77,18 +75,45 @@ public: }; +/** +\brief If a thread ends up waiting for work it will find itself in a spin-wait loop until work becomes available. +Three strategies are available to limit wasted cycles. +The strategies are as follows: +a) wait until a work task signals the end of the spin-wait period. +b) yield the thread by providing a hint to reschedule thread execution, thereby allowing other threads to run. +c) yield the processor by informing it that it is waiting for work and requesting it to more efficiently use compute resources. +*/ +struct PxDefaultCpuDispatcherWaitForWorkMode +{ + enum Enum + { + eWAIT_FOR_WORK, + eYIELD_THREAD, + eYIELD_PROCESSOR + }; +}; + + /** \brief Create default dispatcher, extensions SDK needs to be initialized first. \param[in] numThreads Number of worker threads the dispatcher should use. \param[in] affinityMasks Array with affinity mask for each thread. If not defined, default masks will be used. +\param[in] mode is the strategy employed when a busy-wait is encountered. +\param[in] yieldProcessorCount specifies the number of times a OS-specific yield processor command will be executed +during each cycle of a busy-wait in the event that the specified mode is eYIELD_PROCESSOR \note numThreads may be zero in which case no worker thread are initialized and simulation tasks will be executed on the thread that calls PxScene::simulate() +\note yieldProcessorCount must be greater than zero if eYIELD_PROCESSOR is the chosen mode and equal to zero for all other modes. + +\note eYIELD_THREAD and eYIELD_PROCESSOR modes will use compute resources even if the simulation is not running. +It is left to users to keep threads inactive, if so desired, when no simulation is running. + @see PxDefaultCpuDispatcher */ -PxDefaultCpuDispatcher* PxDefaultCpuDispatcherCreate(PxU32 numThreads, PxU32* affinityMasks = NULL); +PxDefaultCpuDispatcher* PxDefaultCpuDispatcherCreate(PxU32 numThreads, PxU32* affinityMasks = NULL, PxDefaultCpuDispatcherWaitForWorkMode::Enum mode = PxDefaultCpuDispatcherWaitForWorkMode::eWAIT_FOR_WORK, PxU32 yieldProcessorCount = 0); #if !PX_DOXYGEN } // namespace physx diff --git a/Source/ThirdParty/PhysX/extensions/PxDefaultErrorCallback.h b/Source/ThirdParty/PhysX/extensions/PxDefaultErrorCallback.h index cec365e96..38227f5b5 100644 --- a/Source/ThirdParty/PhysX/extensions/PxDefaultErrorCallback.h +++ b/Source/ThirdParty/PhysX/extensions/PxDefaultErrorCallback.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,15 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_PHYSICS_EXTENSIONS_DEFAULT_ERROR_CALLBACK_H -#define PX_PHYSICS_EXTENSIONS_DEFAULT_ERROR_CALLBACK_H +#ifndef PX_DEFAULT_ERROR_CALLBACK_H +#define PX_DEFAULT_ERROR_CALLBACK_H +/** \addtogroup extensions + @{ +*/ #include "foundation/PxErrorCallback.h" #include "PxPhysXConfig.h" @@ -49,14 +51,15 @@ namespace physx class PxDefaultErrorCallback : public PxErrorCallback { public: - PxDefaultErrorCallback(); - ~PxDefaultErrorCallback(); + PxDefaultErrorCallback(); + virtual ~PxDefaultErrorCallback(); - virtual void reportError(PxErrorCode::Enum code, const char* message, const char* file, int line); + virtual void reportError(PxErrorCode::Enum code, const char* message, const char* file, int line) PX_OVERRIDE; }; #if !PX_DOXYGEN } // namespace physx #endif +/** @} */ #endif diff --git a/Source/ThirdParty/PhysX/extensions/PxDefaultSimulationFilterShader.h b/Source/ThirdParty/PhysX/extensions/PxDefaultSimulationFilterShader.h index 70d88af5e..f6fd7bebc 100644 --- a/Source/ThirdParty/PhysX/extensions/PxDefaultSimulationFilterShader.h +++ b/Source/ThirdParty/PhysX/extensions/PxDefaultSimulationFilterShader.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_EXTENSIONS_DEFAULTSIMULATIONFILTERSHADER_H -#define PX_PHYSICS_EXTENSIONS_DEFAULTSIMULATIONFILTERSHADER_H +#ifndef PX_DEFAULT_SIMULATION_FILTER_SHADER_H +#define PX_DEFAULT_SIMULATION_FILTER_SHADER_H /** \addtogroup extensions @{ */ diff --git a/Source/ThirdParty/PhysX/extensions/PxDefaultStreams.h b/Source/ThirdParty/PhysX/extensions/PxDefaultStreams.h index 0b33ec4ce..199d261b5 100644 --- a/Source/ThirdParty/PhysX/extensions/PxDefaultStreams.h +++ b/Source/ThirdParty/PhysX/extensions/PxDefaultStreams.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_EXTENSIONS_DEFAULT_STREAMS_H -#define PX_PHYSICS_EXTENSIONS_DEFAULT_STREAMS_H +#ifndef PX_DEFAULT_STREAMS_H +#define PX_DEFAULT_STREAMS_H /** \addtogroup extensions @{ */ @@ -37,7 +35,7 @@ #include #include "common/PxPhysXCommonConfig.h" #include "foundation/PxIO.h" -#include "PxFoundation.h" +#include "foundation/PxFoundation.h" typedef FILE* PxFileHandle; @@ -55,7 +53,7 @@ namespace physx class PxDefaultMemoryOutputStream: public PxOutputStream { public: - PxDefaultMemoryOutputStream(PxAllocatorCallback &allocator = PxGetFoundation().getAllocatorCallback()); + PxDefaultMemoryOutputStream(PxAllocatorCallback &allocator = *PxGetAllocatorCallback()); virtual ~PxDefaultMemoryOutputStream(); virtual PxU32 write(const void* src, PxU32 count); diff --git a/Source/ThirdParty/PhysX/extensions/PxDistanceJoint.h b/Source/ThirdParty/PhysX/extensions/PxDistanceJoint.h index ab6ae2d51..5a34b58e5 100644 --- a/Source/ThirdParty/PhysX/extensions/PxDistanceJoint.h +++ b/Source/ThirdParty/PhysX/extensions/PxDistanceJoint.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_DISTANCEJOINT_H -#define PX_DISTANCEJOINT_H +#ifndef PX_DISTANCE_JOINT_H +#define PX_DISTANCE_JOINT_H /** \addtogroup extensions @{ */ @@ -204,6 +203,34 @@ public: */ virtual PxReal getDamping() const = 0; + /** + \brief Set the contact distance for the min & max distance limits. + + This is similar to the PxJointLimitParameters::contactDistance parameter for regular limits. + + The two most common values are 0 and infinite. Infinite means the internal constraints are + always created, resulting in the best simulation quality but slower performance. Zero means + the internal constraints are only created when the limits are violated, resulting in best + performance but worse simulation quality. + + Default 0.0f + Range [0, PX_MAX_F32) + + \param[in] contactDistance The contact distance + + @see PxJointLimitParameters::contactDistance getContactDistance() + */ + virtual void setContactDistance(PxReal contactDistance) = 0; + + /** + \brief Get the contact distance. + + \return the contact distance + + @see PxJointLimitParameters::contactDistance setContactDistance() + */ + virtual PxReal getContactDistance() const = 0; + /** \brief Set the flags specific to the Distance Joint. diff --git a/Source/ThirdParty/PhysX/extensions/PxExtensionsAPI.h b/Source/ThirdParty/PhysX/extensions/PxExtensionsAPI.h index 46142bc94..fc30edb88 100644 --- a/Source/ThirdParty/PhysX/extensions/PxExtensionsAPI.h +++ b/Source/ThirdParty/PhysX/extensions/PxExtensionsAPI.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,11 +22,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - #ifndef PX_EXTENSIONS_API_H #define PX_EXTENSIONS_API_H /** \addtogroup extensions @@ -44,6 +42,8 @@ #include "extensions/PxRevoluteJoint.h" #include "extensions/PxSphericalJoint.h" #include "extensions/PxD6Joint.h" +#include "extensions/PxGearJoint.h" +#include "extensions/PxRackAndPinionJoint.h" #include "extensions/PxDefaultSimulationFilterShader.h" #include "extensions/PxDefaultErrorCallback.h" #include "extensions/PxDefaultStreams.h" @@ -59,6 +59,11 @@ #include "extensions/PxBroadPhaseExt.h" #include "extensions/PxMassProperties.h" #include "extensions/PxSceneQueryExt.h" +#include "extensions/PxSceneQuerySystemExt.h" +#include "extensions/PxCustomSceneQuerySystem.h" +#include "extensions/PxConvexMeshExt.h" +#include "extensions/PxSamplingExt.h" +#include "extensions/PxTetrahedronMeshExt.h" /** \brief Initialize the PhysXExtensions library. @@ -70,7 +75,6 @@ This should be called before calling any functions or methods in extensions whic @see PxCloseExtensions PxFoundation PxPhysics */ - PX_C_EXPORT bool PX_CALL_CONV PxInitExtensions(physx::PxPhysics& physics, physx::PxPvd* pvd); /** \brief Shut down the PhysXExtensions library. @@ -81,8 +85,8 @@ This function should be called to cleanly shut down the PhysXExtensions library @see PxInitExtensions */ - PX_C_EXPORT void PX_CALL_CONV PxCloseExtensions(); /** @} */ -#endif // PX_EXTENSIONS_API_H +#endif + diff --git a/Source/ThirdParty/PhysX/extensions/PxFixedJoint.h b/Source/ThirdParty/PhysX/extensions/PxFixedJoint.h index e68aaa194..a2a29397b 100644 --- a/Source/ThirdParty/PhysX/extensions/PxFixedJoint.h +++ b/Source/ThirdParty/PhysX/extensions/PxFixedJoint.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_FIXEDJOINT_H -#define PX_FIXEDJOINT_H +#ifndef PX_FIXED_JOINT_H +#define PX_FIXED_JOINT_H /** \addtogroup extensions @{ */ @@ -83,8 +82,10 @@ public: \param[in] tolerance the linear tolerance threshold @see getProjectionLinearTolerance() PxJoint::setConstraintFlags() PxConstraintFlag::ePROJECTION + + @deprecated */ - virtual void setProjectionLinearTolerance(PxReal tolerance) = 0; + PX_DEPRECATED virtual void setProjectionLinearTolerance(PxReal tolerance) = 0; /** \brief Get the linear tolerance threshold for projection. @@ -92,8 +93,10 @@ public: \return the linear tolerance threshold @see setProjectionLinearTolerance() PxJoint::setConstraintFlag() + + @deprecated */ - virtual PxReal getProjectionLinearTolerance() const = 0; + PX_DEPRECATED virtual PxReal getProjectionLinearTolerance() const = 0; /** \brief Set the angular tolerance threshold for projection. Projection is enabled if @@ -112,8 +115,10 @@ public: \param[in] tolerance the angular tolerance threshold in radians @see getProjectionAngularTolerance() PxJoint::setConstraintFlag() PxConstraintFlag::ePROJECTION + + @deprecated */ - virtual void setProjectionAngularTolerance(PxReal tolerance) = 0; + PX_DEPRECATED virtual void setProjectionAngularTolerance(PxReal tolerance) = 0; /** \brief Get the angular tolerance threshold for projection. @@ -121,8 +126,10 @@ public: \return the angular tolerance threshold in radians @see setProjectionAngularTolerance() + + @deprecated */ - virtual PxReal getProjectionAngularTolerance() const = 0; + PX_DEPRECATED virtual PxReal getProjectionAngularTolerance() const = 0; /** \brief Returns string name of PxFixedJoint, used for serialization diff --git a/Source/ThirdParty/PhysX/extensions/PxGearJoint.h b/Source/ThirdParty/PhysX/extensions/PxGearJoint.h new file mode 100644 index 000000000..28f42f83a --- /dev/null +++ b/Source/ThirdParty/PhysX/extensions/PxGearJoint.h @@ -0,0 +1,121 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_GEAR_JOINT_H +#define PX_GEAR_JOINT_H +/** \addtogroup extensions + @{ +*/ + +#include "extensions/PxJoint.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + class PxGearJoint; + + /** + \brief Create a gear Joint. + + \param[in] physics The physics SDK + \param[in] actor0 An actor to which the joint is attached. NULL may be used to attach the joint to a specific point in the world frame + \param[in] localFrame0 The position and orientation of the joint relative to actor0 + \param[in] actor1 An actor to which the joint is attached. NULL may be used to attach the joint to a specific point in the world frame + \param[in] localFrame1 The position and orientation of the joint relative to actor1 + + @see PxGearJoint + */ + PxGearJoint* PxGearJointCreate(PxPhysics& physics, PxRigidActor* actor0, const PxTransform& localFrame0, PxRigidActor* actor1, const PxTransform& localFrame1); + + /** + \brief A joint that connects two existing revolute joints and constrains their relative angular velocity and position with respect to each other. + + @see PxGearJointCreate PxJoint + */ + class PxGearJoint : public PxJoint + { + public: + + /** + \brief Set the hinge/revolute joints connected by the gear joint. + + The passed joints can be either PxRevoluteJoint, PxD6Joint or PxArticulationJointReducedCoordinate. + The joints must define degrees of freedom around the twist axis. They cannot be null. + + Note that these joints are only used to compute the positional error correction term, + used to adjust potential drift between jointed actors. The gear joint can run without + calling this function, but in that case some visible overlap may develop over time between + the teeth of the gear meshes. + + \note Calling this function resets the internal positional error correction term. + + \param[in] hinge0 The first hinge joint + \param[in] hinge1 The second hinge joint + \return true if success + */ + virtual bool setHinges(const PxBase* hinge0, const PxBase* hinge1) = 0; + + /** + \brief Set the desired gear ratio. + + For two gears with n0 and n1 teeth respectively, the gear ratio is n0/n1. + + \note You may need to use a negative gear ratio if the joint frames of involved actors are not oriented in the same direction. + + \note Calling this function resets the internal positional error correction term. + + \param[in] ratio Desired ratio between the two hinges. + */ + virtual void setGearRatio(float ratio) = 0; + + /** + \brief Get the gear ratio. + + \return Current ratio + */ + virtual float getGearRatio() const = 0; + + virtual const char* getConcreteTypeName() const { return "PxGearJoint"; } + + protected: + + PX_INLINE PxGearJoint(PxType concreteType, PxBaseFlags baseFlags) : PxJoint(concreteType, baseFlags) {} + + PX_INLINE PxGearJoint(PxBaseFlags baseFlags) : PxJoint(baseFlags) {} + + virtual bool isKindOf(const char* name) const { return !::strcmp("PxGearJoint", name) || PxJoint::isKindOf(name); } + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/extensions/PxGjkQueryExt.h b/Source/ThirdParty/PhysX/extensions/PxGjkQueryExt.h new file mode 100644 index 000000000..afaeb14be --- /dev/null +++ b/Source/ThirdParty/PhysX/extensions/PxGjkQueryExt.h @@ -0,0 +1,212 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_GJK_QUERY_EXT_H +#define PX_GJK_QUERY_EXT_H + +#include "geometry/PxGjkQuery.h" +#include "geometry/PxGeometry.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +class PxSphereGeometry; +class PxCapsuleGeometry; +class PxBoxGeometry; +class PxConvexMeshGeometry; +class PxContactBuffer; +class PxConvexMesh; + +/** +\brief Pre-made support mapping for built-in convex geometry types. +*/ +class PxGjkQueryExt +{ +public: + /** + \brief Pre-made support mapping for a sphere + */ + struct SphereSupport : PxGjkQuery::Support + { + PxReal radius; + + /** + \brief Default constructor + */ + SphereSupport(); + /** + \brief Constructs a SphereSupport for a sphere radius + */ + SphereSupport(PxReal radius); + /** + \brief Constructs a SphereSupport for a PxSphereGeometry + */ + SphereSupport(const PxSphereGeometry& geom); + + virtual PxReal getMargin() const; + virtual PxVec3 supportLocal(const PxVec3& dir) const; + }; + + /** + \brief Pre-made support mapping for a capsule + */ + struct CapsuleSupport : PxGjkQuery::Support + { + PxReal radius, halfHeight; + + /** + \brief Default constructor + */ + CapsuleSupport(); + /** + \brief Constructs a CapsuleSupport for capsule radius and halfHeight + */ + CapsuleSupport(PxReal radius, PxReal halfHeight); + /** + \brief Constructs a CapsuleSupport for a PxCapsuleGeometry + */ + CapsuleSupport(const PxCapsuleGeometry& geom); + + virtual PxReal getMargin() const; + virtual PxVec3 supportLocal(const PxVec3& dir) const; + }; + + /** + \brief Pre-made support mapping for a box + */ + struct BoxSupport : PxGjkQuery::Support + { + PxVec3 halfExtents; + PxReal margin; + + /** + \brief Default constructor + */ + BoxSupport(); + /** + \brief Constructs a BoxSupport for a box halfExtents with optional margin + */ + BoxSupport(const PxVec3& halfExtents, PxReal margin = 0); + /** + \brief Constructs a BoxSupport for a PxBoxGeometry + */ + BoxSupport(const PxBoxGeometry& box, PxReal margin = 0); + + virtual PxReal getMargin() const; + virtual PxVec3 supportLocal(const PxVec3& dir) const; + }; + + /** + \brief Pre-made support mapping for a convex mesh + */ + struct ConvexMeshSupport : PxGjkQuery::Support + { + const PxConvexMesh* convexMesh; + PxVec3 scale; + PxQuat scaleRotation; + PxReal margin; + + /** + \brief Default constructor + */ + ConvexMeshSupport(); + /** + \brief Constructs a BoxSupport for a PxConvexMesh + */ + ConvexMeshSupport(const PxConvexMesh& convexMesh, const PxVec3& scale = PxVec3(1), const PxQuat& scaleRotation = PxQuat(PxIdentity), PxReal margin = 0); + /** + \brief Constructs a BoxSupport for a PxConvexMeshGeometry + */ + ConvexMeshSupport(const PxConvexMeshGeometry& convexMesh, PxReal margin = 0); + + virtual PxReal getMargin() const; + virtual PxVec3 supportLocal(const PxVec3& dir) const; + }; + + /** + \brief Pre-made support mapping for any PhysX's convex geometry (sphere, capsule, box, convex mesh) + */ + struct ConvexGeomSupport : PxGjkQuery::Support + { + /** + \brief Default constructor + */ + ConvexGeomSupport(); + /** + \brief Constructs a BoxSupport for a PxGeometry + */ + ConvexGeomSupport(const PxGeometry& geom, PxReal margin = 0); + /** + \brief Destructor + */ + ~ConvexGeomSupport(); + + /** + \brief Returns false if ConvexGeomSupport was constructed from non-convex geometry + */ + bool isValid() const; + + virtual PxReal getMargin() const; + virtual PxVec3 supportLocal(const PxVec3& dir) const; + + private: + PxGeometryType::Enum mType; + union { + void* alignment; + PxU8 sphere[sizeof(SphereSupport)]; + PxU8 capsule[sizeof(CapsuleSupport)]; + PxU8 box[sizeof(BoxSupport)]; + PxU8 convexMesh[sizeof(ConvexMeshSupport)]; + } mSupport; + }; + + /** + \brief Generates a contact point between two shapes using GJK-EPA algorithm + + \param[in] a Shape A support mapping + \param[in] b Shape B support mapping + \param[in] poseA Shape A transformation + \param[in] poseB Shape B transformation + \param[in] contactDistance The distance at which contacts begin to be generated between the shapes + \param[in] toleranceLength The toleranceLength. Used for scaling distance-based thresholds internally to produce appropriate results given simulations in different units + \param[out] contactBuffer A buffer to store the contact + + \return True if there is a contact. + */ + static bool generateContacts(const PxGjkQuery::Support& a, const PxGjkQuery::Support& b, const PxTransform& poseA, const PxTransform& poseB, + PxReal contactDistance, PxReal toleranceLength, PxContactBuffer& contactBuffer); + +}; + +#if !PX_DOXYGEN +} +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/extensions/PxJoint.h b/Source/ThirdParty/PhysX/extensions/PxJoint.h index 43e8785d3..0d469c00b 100644 --- a/Source/ThirdParty/PhysX/extensions/PxJoint.h +++ b/Source/ThirdParty/PhysX/extensions/PxJoint.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_JOINTCONSTRAINT_H -#define PX_JOINTCONSTRAINT_H +#ifndef PX_JOINT_H +#define PX_JOINT_H /** \addtogroup extensions @{ */ @@ -64,18 +63,22 @@ struct PxJointConcreteType eDISTANCE, eD6, eCONTACT, + eGEAR, + eRACK_AND_PINION, eLast }; }; -PX_DEFINE_TYPEINFO(PxJoint, PxConcreteType::eUNDEFINED) -PX_DEFINE_TYPEINFO(PxD6Joint, PxJointConcreteType::eD6) -PX_DEFINE_TYPEINFO(PxDistanceJoint, PxJointConcreteType::eDISTANCE) -PX_DEFINE_TYPEINFO(PxContactJoint, PxJointConcreteType::eCONTACT) -PX_DEFINE_TYPEINFO(PxFixedJoint, PxJointConcreteType::eFIXED) -PX_DEFINE_TYPEINFO(PxPrismaticJoint, PxJointConcreteType::ePRISMATIC) -PX_DEFINE_TYPEINFO(PxRevoluteJoint, PxJointConcreteType::eREVOLUTE) -PX_DEFINE_TYPEINFO(PxSphericalJoint, PxJointConcreteType::eSPHERICAL) +PX_DEFINE_TYPEINFO(PxJoint, PxConcreteType::eUNDEFINED) +PX_DEFINE_TYPEINFO(PxRackAndPinionJoint, PxJointConcreteType::eRACK_AND_PINION) +PX_DEFINE_TYPEINFO(PxGearJoint, PxJointConcreteType::eGEAR) +PX_DEFINE_TYPEINFO(PxD6Joint, PxJointConcreteType::eD6) +PX_DEFINE_TYPEINFO(PxDistanceJoint, PxJointConcreteType::eDISTANCE) +PX_DEFINE_TYPEINFO(PxContactJoint, PxJointConcreteType::eCONTACT) +PX_DEFINE_TYPEINFO(PxFixedJoint, PxJointConcreteType::eFIXED) +PX_DEFINE_TYPEINFO(PxPrismaticJoint, PxJointConcreteType::ePRISMATIC) +PX_DEFINE_TYPEINFO(PxRevoluteJoint, PxJointConcreteType::eREVOLUTE) +PX_DEFINE_TYPEINFO(PxSphericalJoint, PxJointConcreteType::eSPHERICAL) /** diff --git a/Source/ThirdParty/PhysX/extensions/PxJointLimit.h b/Source/ThirdParty/PhysX/extensions/PxJointLimit.h index 2f89138a9..c00cbacb6 100644 --- a/Source/ThirdParty/PhysX/extensions/PxJointLimit.h +++ b/Source/ThirdParty/PhysX/extensions/PxJointLimit.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_EXTENSIONS_JOINT_LIMIT -#define PX_EXTENSIONS_JOINT_LIMIT +#ifndef PX_JOINT_LIMIT_H +#define PX_JOINT_LIMIT_H /** \addtogroup extensions @{ */ @@ -101,8 +100,8 @@ public: PxReal damping; /** - \brief the distance inside the limit value at which the limit will be considered to be active by the - solver. As this value is made larger, the limit becomes active more quickly. It thus becomes less + \brief The distance inside the limit value at which the limit will be considered to be active by the + solver. As this value is made larger, the limit becomes active more quickly. It thus becomes less likely to violate the extents of the limit, but more expensive. The contact distance should be less than the limit angle or distance, and in the case of a pair limit, @@ -113,16 +112,18 @@ public: Default: depends on the joint + \note This is deprecated in PhysX 5.1 + @see PxPhysics::getTolerancesScale() */ - PxReal contactDistance; + PxReal contactDistance_deprecated; PxJointLimitParameters() : restitution (0.0f), bounceThreshold (0.0f), stiffness (0.0f), damping (0.0f), - contactDistance (0.0f) + contactDistance_deprecated (0.0f) { } @@ -131,7 +132,7 @@ public: bounceThreshold (p.bounceThreshold), stiffness (p.stiffness), damping (p.damping), - contactDistance (p.contactDistance) + contactDistance_deprecated (p.contactDistance_deprecated) { } @@ -146,7 +147,7 @@ public: PxIsFinite(stiffness) && stiffness >= 0 && PxIsFinite(damping) && damping >= 0 && PxIsFinite(bounceThreshold) && bounceThreshold >= 0 && - PxIsFinite(contactDistance) && contactDistance >= 0; + PxIsFinite(contactDistance_deprecated) && contactDistance_deprecated >= 0; } PX_INLINE bool isSoft() const @@ -182,16 +183,16 @@ public: /** \brief construct a linear hard limit - \param[in] scale A PxTolerancesScale struct. Should be the same as used when creating the PxPhysics object. - \param[in] extent The extent of the limit - \param[in] contactDist The distance from the limit at which it becomes active. Default is 0.01f scaled by the tolerance length scale + \param[in] scale A PxTolerancesScale struct. Should be the same as used when creating the PxPhysics object. + \param[in] extent The extent of the limit + \param[in] contactDist_deprecated The distance from the limit at which it becomes active. Default is 0.01f scaled by the tolerance length scale. This is deprecated in PhysX 5.1. @see PxJointLimitParameters PxTolerancesScale */ - PxJointLinearLimit(const PxTolerancesScale& scale, PxReal extent, PxReal contactDist = -1.0f) + PxJointLinearLimit(const PxTolerancesScale& scale, PxReal extent, PxReal contactDist_deprecated = -1.0f) : value(extent) { - PxJointLimitParameters::contactDistance = contactDist == -1.0f ? 0.01f*scale.length : contactDist; + PxJointLimitParameters::contactDistance_deprecated = contactDist_deprecated == -1.0f ? 0.01f*scale.length : contactDist_deprecated; } /** @@ -246,18 +247,18 @@ public: /** \brief Construct a linear hard limit pair. The lower distance value must be less than the upper distance value. - \param[in] scale A PxTolerancesScale struct. Should be the same as used when creating the PxPhysics object. - \param[in] lowerLimit The lower distance of the limit - \param[in] upperLimit The upper distance of the limit - \param[in] contactDist The distance from the limit at which it becomes active. Default is the lesser of 0.01f scaled by the tolerance length scale, and 0.49 * (upperLimit - lowerLimit) + \param[in] scale A PxTolerancesScale struct. Should be the same as used when creating the PxPhysics object. + \param[in] lowerLimit The lower distance of the limit + \param[in] upperLimit The upper distance of the limit + \param[in] contactDist_deprecated The distance from the limit at which it becomes active. Default is the lesser of 0.01f scaled by the tolerance length scale, and 0.49 * (upperLimit - lowerLimit). This is deprecated in PhysX 5.1. @see PxJointLimitParameters PxTolerancesScale */ - PxJointLinearLimitPair(const PxTolerancesScale& scale, PxReal lowerLimit = -PX_MAX_F32/3.0f, PxReal upperLimit = PX_MAX_F32/3.0f, PxReal contactDist = -1.0f) : + PxJointLinearLimitPair(const PxTolerancesScale& scale, PxReal lowerLimit = -PX_MAX_F32/3.0f, PxReal upperLimit = PX_MAX_F32/3.0f, PxReal contactDist_deprecated = -1.0f) : upper(upperLimit), lower(lowerLimit) { - PxJointLimitParameters::contactDistance = contactDist == -1.0f ? PxMin(scale.length * 0.01f, (upperLimit*0.49f-lowerLimit*0.49f)) : contactDist; + PxJointLimitParameters::contactDistance_deprecated = contactDist_deprecated == -1.0f ? PxMin(scale.length * 0.01f, (upperLimit*0.49f-lowerLimit*0.49f)) : contactDist_deprecated; bounceThreshold = 2.0f*scale.length; } @@ -315,17 +316,17 @@ public: The lower value must be less than the upper value. - \param[in] lowerLimit The lower angle of the limit - \param[in] upperLimit The upper angle of the limit - \param[in] contactDist The distance from the limit at which it becomes active. Default is the lesser of 0.1 radians, and 0.49 * (upperLimit - lowerLimit) + \param[in] lowerLimit The lower angle of the limit + \param[in] upperLimit The upper angle of the limit + \param[in] contactDist_deprecated The distance from the limit at which it becomes active. Default is the lesser of 0.1 radians, and 0.49 * (upperLimit - lowerLimit). This is deprecated in PhysX 5.1. @see PxJointLimitParameters */ - PxJointAngularLimitPair(PxReal lowerLimit, PxReal upperLimit, PxReal contactDist = -1.0f) : + PxJointAngularLimitPair(PxReal lowerLimit, PxReal upperLimit, PxReal contactDist_deprecated = -1.0f) : upper(upperLimit), lower(lowerLimit) { - PxJointLimitParameters::contactDistance = contactDist ==-1.0f ? PxMin(0.1f, 0.49f*(upperLimit-lowerLimit)) : contactDist; + PxJointLimitParameters::contactDistance_deprecated = contactDist_deprecated ==-1.0f ? PxMin(0.1f, 0.49f*(upperLimit-lowerLimit)) : contactDist_deprecated; bounceThreshold = 0.5f; } @@ -396,17 +397,17 @@ public: /** \brief Construct a cone hard limit. - \param[in] yLimitAngle The limit angle from the Y-axis of the constraint frame - \param[in] zLimitAngle The limit angle from the Z-axis of the constraint frame - \param[in] contactDist The distance from the limit at which it becomes active. Default is the lesser of 0.1 radians, and 0.49 * the lower of the limit angles + \param[in] yLimitAngle The limit angle from the Y-axis of the constraint frame + \param[in] zLimitAngle The limit angle from the Z-axis of the constraint frame + \param[in] contactDist_deprecated The distance from the limit at which it becomes active. Default is the lesser of 0.1 radians, and 0.49 * the lower of the limit angles. This is deprecated in PhysX 5.1. @see PxJointLimitParameters */ - PxJointLimitCone(PxReal yLimitAngle, PxReal zLimitAngle, PxReal contactDist = -1.0f) : + PxJointLimitCone(PxReal yLimitAngle, PxReal zLimitAngle, PxReal contactDist_deprecated = -1.0f) : yAngle(yLimitAngle), zAngle(zLimitAngle) { - PxJointLimitParameters::contactDistance = contactDist == -1.0f ? PxMin(0.1f, PxMin(yLimitAngle, zLimitAngle)*0.49f) : contactDist; + PxJointLimitParameters::contactDistance_deprecated = contactDist_deprecated == -1.0f ? PxMin(0.1f, PxMin(yLimitAngle, zLimitAngle)*0.49f) : contactDist_deprecated; bounceThreshold = 0.5f; } @@ -493,29 +494,29 @@ public: /** \brief Construct a pyramid hard limit. - \param[in] yLimitAngleMin The minimum limit angle from the Y-axis of the constraint frame - \param[in] yLimitAngleMax The maximum limit angle from the Y-axis of the constraint frame - \param[in] zLimitAngleMin The minimum limit angle from the Z-axis of the constraint frame - \param[in] zLimitAngleMax The maximum limit angle from the Z-axis of the constraint frame - \param[in] contactDist The distance from the limit at which it becomes active. Default is the lesser of 0.1 radians, and 0.49 * the lower of the limit angles + \param[in] yLimitAngleMin The minimum limit angle from the Y-axis of the constraint frame + \param[in] yLimitAngleMax The maximum limit angle from the Y-axis of the constraint frame + \param[in] zLimitAngleMin The minimum limit angle from the Z-axis of the constraint frame + \param[in] zLimitAngleMax The maximum limit angle from the Z-axis of the constraint frame + \param[in] contactDist_deprecated The distance from the limit at which it becomes active. Default is the lesser of 0.1 radians, and 0.49 * the lower of the limit angles. This is deprecated in PhysX 5.1. @see PxJointLimitParameters */ - PxJointLimitPyramid(PxReal yLimitAngleMin, PxReal yLimitAngleMax, PxReal zLimitAngleMin, PxReal zLimitAngleMax, PxReal contactDist = -1.0f) : + PxJointLimitPyramid(PxReal yLimitAngleMin, PxReal yLimitAngleMax, PxReal zLimitAngleMin, PxReal zLimitAngleMax, PxReal contactDist_deprecated = -1.0f) : yAngleMin(yLimitAngleMin), yAngleMax(yLimitAngleMax), zAngleMin(zLimitAngleMin), zAngleMax(zLimitAngleMax) { - if(contactDist == -1.0f) + if(contactDist_deprecated == -1.0f) { const PxReal contactDistY = PxMin(0.1f, 0.49f*(yLimitAngleMax - yLimitAngleMin)); const PxReal contactDistZ = PxMin(0.1f, 0.49f*(zLimitAngleMax - zLimitAngleMin)); - PxJointLimitParameters::contactDistance = contactDist == PxMin(contactDistY, contactDistZ); + PxJointLimitParameters::contactDistance_deprecated = contactDist_deprecated == PxMin(contactDistY, contactDistZ); } else { - PxJointLimitParameters::contactDistance = contactDist; + PxJointLimitParameters::contactDistance_deprecated = contactDist_deprecated; } bounceThreshold = 0.5f; diff --git a/Source/ThirdParty/PhysX/extensions/PxMassProperties.h b/Source/ThirdParty/PhysX/extensions/PxMassProperties.h index 9f44bf1eb..a7acf5985 100644 --- a/Source/ThirdParty/PhysX/extensions/PxMassProperties.h +++ b/Source/ThirdParty/PhysX/extensions/PxMassProperties.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_EXTENSIONS_MASS_PROPERTIES_H -#define PX_PHYSICS_EXTENSIONS_MASS_PROPERTIES_H +#ifndef PX_MASS_PROPERTIES_H +#define PX_MASS_PROPERTIES_H /** \addtogroup extensions @{ */ @@ -47,6 +45,9 @@ #include "geometry/PxCapsuleGeometry.h" #include "geometry/PxConvexMeshGeometry.h" #include "geometry/PxConvexMesh.h" +#include "geometry/PxCustomGeometry.h" +#include "geometry/PxTriangleMeshGeometry.h" +#include "geometry/PxTriangleMesh.h" #if !PX_DOXYGEN namespace physx @@ -135,20 +136,47 @@ public: const PxMeshScale& s = c.scale; mass = unscaledMass * s.scale.x * s.scale.y * s.scale.z; - centerOfMass = s.rotation.rotate(s.scale.multiply(s.rotation.rotateInv(unscaledCoM))); + centerOfMass = s.transform(unscaledCoM); inertiaTensor = scaleInertia(unscaledInertiaTensorCOM, s.rotation, s.scale); } break; - case PxGeometryType::eHEIGHTFIELD: - case PxGeometryType::ePLANE: + case PxGeometryType::eCUSTOM: + { + *this = PxMassProperties(); + static_cast(geometry).callbacks->computeMassProperties(geometry, *this); + } + break; + case PxGeometryType::eTRIANGLEMESH: - case PxGeometryType::eINVALID: - case PxGeometryType::eGEOMETRY_COUNT: + { + const PxTriangleMeshGeometry& g = static_cast(geometry); + + PxVec3 unscaledCoM; + PxMat33 unscaledInertiaTensorNonCOM; // inertia tensor of convex mesh in mesh local space + PxMat33 unscaledInertiaTensorCOM; + PxReal unscaledMass; + g.triangleMesh->getMassInformation(unscaledMass, unscaledInertiaTensorNonCOM, unscaledCoM); + + // inertia tensor relative to center of mass + unscaledInertiaTensorCOM[0][0] = unscaledInertiaTensorNonCOM[0][0] - unscaledMass * PxReal((unscaledCoM.y*unscaledCoM.y + unscaledCoM.z*unscaledCoM.z)); + unscaledInertiaTensorCOM[1][1] = unscaledInertiaTensorNonCOM[1][1] - unscaledMass * PxReal((unscaledCoM.z*unscaledCoM.z + unscaledCoM.x*unscaledCoM.x)); + unscaledInertiaTensorCOM[2][2] = unscaledInertiaTensorNonCOM[2][2] - unscaledMass * PxReal((unscaledCoM.x*unscaledCoM.x + unscaledCoM.y*unscaledCoM.y)); + unscaledInertiaTensorCOM[0][1] = unscaledInertiaTensorCOM[1][0] = (unscaledInertiaTensorNonCOM[0][1] + unscaledMass * PxReal(unscaledCoM.x*unscaledCoM.y)); + unscaledInertiaTensorCOM[1][2] = unscaledInertiaTensorCOM[2][1] = (unscaledInertiaTensorNonCOM[1][2] + unscaledMass * PxReal(unscaledCoM.y*unscaledCoM.z)); + unscaledInertiaTensorCOM[0][2] = unscaledInertiaTensorCOM[2][0] = (unscaledInertiaTensorNonCOM[0][2] + unscaledMass * PxReal(unscaledCoM.z*unscaledCoM.x)); + + const PxMeshScale& s = g.scale; + mass = unscaledMass * s.scale.x * s.scale.y * s.scale.z; + centerOfMass = s.transform(unscaledCoM); + inertiaTensor = scaleInertia(unscaledInertiaTensorCOM, s.rotation, s.scale); + } + break; + + default: { *this = PxMassProperties(); } - break; } PX_ASSERT(inertiaTensor.column0.isFinite() && inertiaTensor.column1.isFinite() && inertiaTensor.column2.isFinite()); @@ -229,7 +257,8 @@ public: \brief Rotate an inertia tensor around the center of mass \param[in] inertia The inertia tensor to rotate. - \param[in] q The rotation to apply to the inertia tensor. + \param[in] q The rotation from the new to the old coordinate frame, i.e. q.rotate(v) transforms + the coordinates of vector v from the old to the new coordinate frame. \return The rotated inertia tensor. */ PX_FORCE_INLINE static PxMat33 rotateInertia(const PxMat33& inertia, const PxQuat& q) @@ -247,8 +276,9 @@ public: \brief Non-uniform scaling of the inertia tensor \param[in] inertia The inertia tensor to scale. - \param[in] scaleRotation The frame of the provided scaling factors. - \param[in] scale The scaling factor for each axis (relative to the frame specified in scaleRotation). + \param[in] scaleRotation The rotation from the scaling frame to the frame that inertia is expressed in. + I.e. scaleRotation.rotate(v) transforms the coordinates of vertex v from inertia's frame to the scaling-axes frame. + \param[in] scale The scaling factor for each axis (relative to the frame specified with scaleRotation). \return The scaled inertia tensor. */ static PxMat33 scaleInertia(const PxMat33& inertia, const PxQuat& scaleRotation, const PxVec3& scale) diff --git a/Source/ThirdParty/PhysX/extensions/PxParticleClothCooker.h b/Source/ThirdParty/PhysX/extensions/PxParticleClothCooker.h new file mode 100644 index 000000000..537e86f6c --- /dev/null +++ b/Source/ThirdParty/PhysX/extensions/PxParticleClothCooker.h @@ -0,0 +1,119 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_PARTICLE_CLOTH_COOKER_H +#define PX_PARTICLE_CLOTH_COOKER_H +/** \addtogroup extensions + @{ +*/ + +#include "foundation/PxSimpleTypes.h" +#include "foundation/PxVec4.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +namespace ExtGpu +{ + +/** +\brief Holds all the information for a particle cloth constraint used in the PxParticleClothCooker. +*/ +struct PxParticleClothConstraint +{ + enum + { + eTYPE_INVALID_CONSTRAINT = 0, + eTYPE_HORIZONTAL_CONSTRAINT = 1, + eTYPE_VERTICAL_CONSTRAINT = 2, + eTYPE_DIAGONAL_CONSTRAINT = 4, + eTYPE_BENDING_CONSTRAINT = 8, + eTYPE_DIAGONAL_BENDING_CONSTRAINT = 16, + eTYPE_ALL = eTYPE_HORIZONTAL_CONSTRAINT | eTYPE_VERTICAL_CONSTRAINT | eTYPE_DIAGONAL_CONSTRAINT | eTYPE_BENDING_CONSTRAINT | eTYPE_DIAGONAL_BENDING_CONSTRAINT + }; + PxU32 particleIndexA; //!< The first particle index of this constraint. + PxU32 particleIndexB; //!< The second particle index of this constraint. + PxReal length; //!< The distance between particle A and B. + PxU32 constraintType; //!< The type of constraint, see the constraint type enum. +}; + +/* +\brief Generates PxParticleClothConstraint constraints that connect the individual particles of a particle cloth. +*/ +class PxParticleClothCooker +{ +public: + virtual void release() = 0; + + /** + \brief Generate the constraint list and triangle index list. + + \param[in] constraints A pointer to an array of PxParticleClothConstraint constraints. If NULL, the cooker will generate all the constraints. Otherwise, the user-provided constraints will be added. + \param[in] numConstraints The number of user-provided PxParticleClothConstraint s. + */ + virtual void cookConstraints(const PxParticleClothConstraint* constraints = NULL, const PxU32 numConstraints = 0) = 0; + + virtual PxU32* getTriangleIndices() = 0; //!< \return A pointer to the triangle indices. + virtual PxU32 getTriangleIndicesCount() = 0; //!< \return The number of triangle indices. + virtual PxParticleClothConstraint* getConstraints() = 0; //!< \return A pointer to the PxParticleClothConstraint constraints. + virtual PxU32 getConstraintCount() = 0; //!< \return The number of constraints. + virtual void calculateMeshVolume() = 0; //!< Computes the volume of a closed mesh and the contraintScale. Expects vertices in local space - 'close' to origin. + virtual PxReal getMeshVolume() = 0; //!< \return The mesh volume calculated by PxParticleClothCooker::calculateMeshVolume. + +protected: + virtual ~PxParticleClothCooker() {} +}; + +} // namespace ExtGpu + +/** +\brief Creates a PxParticleClothCooker. + +\param[in] vertexCount The number of vertices of the particle cloth. +\param[in] inVertices The vertex positions of the particle cloth. +\param[in] triangleIndexCount The number of triangles of the cloth mesh. +\param[in] inTriangleIndices The triangle indices of the cloth mesh +\param[in] constraintTypeFlags The types of constraints to generate. See PxParticleClothConstraint. +\param[in] verticalDirection The vertical direction of the cloth mesh. This is needed to generate the correct horizontal and vertical constraints to model shear stiffness. +\param[in] bendingConstraintMaxAngle The maximum angle considered in the bending constraints. + +\return A pointer to the new PxParticleClothCooker. +*/ +ExtGpu::PxParticleClothCooker* PxCreateParticleClothCooker(PxU32 vertexCount, physx::PxVec4* inVertices, PxU32 triangleIndexCount, PxU32* inTriangleIndices, + PxU32 constraintTypeFlags = ExtGpu::PxParticleClothConstraint::eTYPE_ALL, PxVec3 verticalDirection = PxVec3(0.0f,1.0f,0.0f), PxReal bendingConstraintMaxAngle = 20.0f/360.0f*PxTwoPi +); + + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/extensions/PxParticleExt.h b/Source/ThirdParty/PhysX/extensions/PxParticleExt.h new file mode 100644 index 000000000..4ad9c5e80 --- /dev/null +++ b/Source/ThirdParty/PhysX/extensions/PxParticleExt.h @@ -0,0 +1,394 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_PARTICLE_EXT_H +#define PX_PARTICLE_EXT_H +/** \addtogroup extensions + @{ +*/ + +#include "PxParticleSystem.h" +#include "PxParticleBuffer.h" +#include "foundation/PxArray.h" +#include "foundation/PxHashMap.h" +#include "foundation/PxUserAllocated.h" +#include "PxAttachment.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +namespace ExtGpu +{ + +/** +\brief Structure to define user-defined particle state when constructing a new particle system. +*/ +struct PxParticleBufferDesc +{ + PxVec4* positions; + PxVec4* velocities; + PxU32* phases; + PxParticleVolume* volumes; + PxU32 numActiveParticles; + PxU32 maxParticles; + PxU32 numVolumes; + PxU32 maxVolumes; + + PxParticleBufferDesc() : positions(NULL), velocities(NULL), phases(NULL), volumes(NULL), numActiveParticles(0), maxParticles(0), numVolumes(0), maxVolumes(0) { } +}; + +/** +\brief Structure to define user-defined particle state when constructing a new particle system that includes diffuse particles. +*/ +struct PxParticleAndDiffuseBufferDesc : public PxParticleBufferDesc +{ + PxDiffuseParticleParams diffuseParams; + PxU32 maxDiffuseParticles; + PxU32 maxActiveDiffuseParticles; + + PxParticleAndDiffuseBufferDesc() : PxParticleBufferDesc() { } +}; + +/** +\brief Structure to define user-defined particle state when constructing a new particle system that includes shape-matched rigid bodies. +*/ +struct PxParticleRigidDesc +{ + PxParticleRigidDesc() : rigidOffsets(NULL), rigidCoefficients(NULL), rigidTranslations(NULL), rigidRotations(NULL), + rigidLocalPositions(NULL), rigidLocalNormals(NULL), maxRigids(0), numActiveRigids(0) { } + + PxU32* rigidOffsets; + PxReal* rigidCoefficients; + PxVec4* rigidTranslations; + PxQuat* rigidRotations; + PxVec4* rigidLocalPositions; + PxVec4* rigidLocalNormals; + PxU32 maxRigids; + PxU32 numActiveRigids; +}; + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +\brief Helper class to manage PxParticleClothDesc buffers used for communicating particle based cloths to PxParticleClothBuffer. +*/ +class PxParticleClothBufferHelper +{ +public: + virtual void release() = 0; + + virtual PxU32 getMaxCloths() const = 0; //!< \return The maximum number of cloths this PxParticleClothBufferHelper can hold. + virtual PxU32 getNumCloths() const = 0; //!< \return The current number of cloths in this PxParticleClothBufferHelper. + virtual PxU32 getMaxSprings() const = 0; //!< \return The maximum number of springs this PxParticleClothBufferHelper can hold. + virtual PxU32 getNumSprings() const = 0; //!< \return The current number of springs in this PxParticleClothBufferHelper. + virtual PxU32 getMaxTriangles() const = 0; //!< \return The maximum number of triangles this PxParticleClothBufferHelper can hold. + virtual PxU32 getNumTriangles() const = 0; //!< \return The current number of triangles in this PxParticleClothBufferHelper. + virtual PxU32 getMaxParticles() const = 0; //!< \return The maximum number of particles this PxParticleClothBufferHelper can hold. + virtual PxU32 getNumParticles() const = 0; //!< \return The current number of particles in this PxParticleClothBufferHelper. + + /** + \brief Adds a PxParticleCloth to this PxParticleClothBufferHelper instance. + + \param[in] particleCloth The PxParticleCloth to be added. + \param[in] triangles A pointer to the triangles + \param[in] numTriangles The number of triangles + \param[in] springs A pointer to the springs + \param[in] numSprings The number of springs + \param[in] restPositions A pointer to the particle rest positions + \param[in] numParticles The number of particles in this cloth + + @see PxParticleCloth PxParticleSpring + */ + virtual void addCloth(const PxParticleCloth& particleCloth, + const PxU32* triangles, const PxU32 numTriangles, + const PxParticleSpring* springs, const PxU32 numSprings, const PxVec4* restPositions, const PxU32 numParticles) = 0; + + /** + \brief Adds a cloth to this PxParticleClothBufferHelper instance. + + Adds a cloth to this PxParticleClothBufferHelper instance. With this method the relevant parameters for inflatable simulation + (restVolume, pressure) can be set directly. + + \param[in] blendScale This should be 1.f / (numPartitions + 1) if the springs are partitioned by the user. Otherwise this will be set during spring partitioning. + \param[in] restVolume The rest volume of the inflatable + \param[in] pressure The pressure of the inflatable. The target inflatable volume is defined as restVolume * pressure. Setting this to > 0.0 will enable inflatable simulation. + \param[in] triangles A pointer to the triangles + \param[in] numTriangles The number of triangles + \param[in] springs A pointer to the springs + \param[in] numSprings The number of springs + \param[in] restPositions A pointer to the particle rest positions + \param[in] numParticles The number of particles in this cloth + + @see PxParticleSpring + */ + virtual void addCloth(const PxReal blendScale, const PxReal restVolume, const PxReal pressure, + const PxU32* triangles, const PxU32 numTriangles, + const PxParticleSpring* springs, const PxU32 numSprings, + const PxVec4* restPositions, const PxU32 numParticles) = 0; + + /** + \brief Returns a PxParticleClothDesc for this PxParticleClothBufferHelper instance to be used for spring partitioning. + + \return the PxParticleClothDesc. + + @see PxCreateAndPopulateParticleClothBuffer, PxParticleClothPreProcessor::partitionSprings + */ + virtual PxParticleClothDesc& getParticleClothDesc() = 0; + +protected: + virtual ~PxParticleClothBufferHelper() {} +}; + + +/** +\brief Helper struct that holds information about a specific mesh in a PxParticleVolumeBufferHelper. +*/ +struct PxParticleVolumeMesh +{ + PxU32 startIndex; //!< The index of the first triangle of this mesh in the triangle array of the PxParticleVolumeBufferHelper instance. + PxU32 count; //!< The number of triangles of this mesh. +}; + +/** +\brief Helper class to manage communicating PxParticleVolumes data to PxParticleBuffer. +*/ +class PxParticleVolumeBufferHelper +{ +public: + virtual void release() = 0; + + virtual PxU32 getMaxVolumes() const = 0; //!< \return The maximum number of PxParticleVolume this PxParticleVolumeBufferHelper instance can hold. + virtual PxU32 getNumVolumes() const = 0; //!< \return The current number of PxParticleVolume in this PxParticleVolumeBufferHelper instance. + virtual PxU32 getMaxTriangles() const = 0; //!< \return The maximum number of triangles this PxParticleVolumeBufferHelper instance can hold. + virtual PxU32 getNumTriangles() const = 0; //!< \return The current number of triangles in this PxParticleVolumeBufferHelper instance. + + virtual PxParticleVolume* getParticleVolumes() = 0; //!< \return A pointer to the PxParticleVolume s of this PxParticleVolumeBufferHelper instance. + virtual PxParticleVolumeMesh* getParticleVolumeMeshes() = 0; //!< \return A pointer to the PxParticleVolumeMesh structs describing the PxParticleVolumes of this PxParticleVolumeBufferHelper instance. + virtual PxU32* getTriangles() = 0; //!< \return A pointer to the triangle indices in this PxParticleVolumeBufferHelper instance. + + /** + \brief Adds a PxParticleVolume with a PxParticleVolumeMesh + + \param[in] volume The PxParticleVolume to be added. + \param[in] volumeMesh A PxParticleVolumeMesh that describes the volumes to be added. startIndex is the index into the triangle list of the PxParticleVolumeBufferHelper instance. + \param[in] triangles A pointer to the triangle indices of the PxParticleVolume to be added. + \param[in] numTriangles The number of triangles of the PxParticleVolume to be added. + */ + virtual void addVolume(const PxParticleVolume& volume, const PxParticleVolumeMesh& volumeMesh, const PxU32* triangles, const PxU32 numTriangles) = 0; + + /** + \brief Adds a volume + + \param[in] particleOffset The index of the first particle of the cloth that maps to this volume in the PxParticleClothBufferHelper instance. + \param[in] numParticles The number of particles of the cloth that maps to this volume in the PxParticleClothBufferHelper instance. + \param[in] triangles A pointer to the triangle indices of this volume. + \param[in] numTriangles The number of triangles in this volume. + */ + virtual void addVolume(const PxU32 particleOffset, const PxU32 numParticles, const PxU32* triangles, const PxU32 numTriangles) = 0; + +protected: + virtual ~PxParticleVolumeBufferHelper() {} +}; + + +/** +\brief Helper class to manage PxParticleRigidDesc buffers used for communicating particle based rigids to PxPaticleSystem. +*/ +class PxParticleRigidBufferHelper +{ +public: + virtual void release() = 0; + + virtual PxU32 getMaxRigids() const = 0; //!< \return The maximum number of rigids this PxParticleRigidBufferHelper instance can hold. + virtual PxU32 getNumRigids() const = 0; //!< \return The current number of rigids in this PxParticleRigidBufferHelper instance. + virtual PxU32 getMaxParticles() const = 0; //!< \return The maximum number of particles this PxParticleRigidBufferHelper instance can hold. + virtual PxU32 getNumParticles() const = 0; //!< \return The current number of particles in this PxParticleRigidBufferHelper instance. + + /** + \brief Adds a rigid. + + \param[in] translation The world-space location of the rigid. + \param[in] rotation The world-space rotation of the rigid. + \param[in] coefficient The stiffness of the rigid. + \param[in] localPositions The particle positions in local space. + \param[in] localNormals The surface normal for all the particles in local space. Each PxVec4 has the normal in the first 3 components and the SDF in the last component. + \param[in] numParticles The number of particles in this rigid. + */ + virtual void addRigid(const PxVec3& translation, const PxQuat& rotation, const PxReal coefficient, + const PxVec4* localPositions, const PxVec4* localNormals, PxU32 numParticles) = 0; + + /** + \brief Get the PxParticleRigidDesc for this buffer. + + \returns A PxParticleRigidDesc. + */ + virtual PxParticleRigidDesc& getParticleRigidDesc() = 0; + +protected: + virtual ~PxParticleRigidBufferHelper() {} +}; + +/////////////////////////////////////////////////////////////////////////////// + +/** +\brief Holds user-defined attachment data to attach particles to other bodies +*/ +class PxParticleAttachmentBuffer : public PxUserAllocated +{ + PxArray mAttachments; + PxArray mFilters; + PxHashMap mReferencedBodies; + PxArray mNewReferencedBodies; + PxArray mDestroyedRefrencedBodies; + + PxParticleBuffer& mParticleBuffer; + + PxParticleRigidAttachment* mDeviceAttachments; + PxParticleRigidFilterPair* mDeviceFilters; + PxU32 mNumDeviceAttachments; + PxU32 mNumDeviceFilters; + + PxCudaContextManager* mCudaContextManager; + + PxParticleSystem& mParticleSystem; + + bool mDirty; + + PX_NOCOPY(PxParticleAttachmentBuffer) + +public: + + PxParticleAttachmentBuffer(PxParticleBuffer& particleBuffer, PxParticleSystem& particleSystem); + + ~PxParticleAttachmentBuffer(); + + // adds attachment to attachment buffer - localPose is in actor space for attachments to all types of rigids. + void addRigidAttachment(PxRigidActor* rigidBody, const PxU32 particleID, const PxVec3& localPose, PxConeLimitedConstraint* coneLimit = NULL); + bool removeRigidAttachment(PxRigidActor* rigidBody, const PxU32 particleID); + void addRigidFilter(PxRigidActor* rigidBody, const PxU32 particleID); + bool removeRigidFilter(PxRigidActor* rigidBody, const PxU32 particleID); + + void copyToDevice(CUstream stream = 0); +}; + +/** +\brief Creates a PxParticleRigidBufferHelper. + +\param[in] maxRigids The maximum number of rigids this PxParticleRigidsBuffers instance should hold. +\param[in] maxParticles The maximum number of particles this PxParticleRigidBufferHelper instance should hold. +\param[in] cudaContextManager A pointer to a PxCudaContextManager. + +\return A pointer to the new PxParticleRigidBufferHelper. +*/ +PxParticleRigidBufferHelper* PxCreateParticleRigidBufferHelper(PxU32 maxRigids, PxU32 maxParticles, PxCudaContextManager* cudaContextManager); + +/** +\brief Creates a PxParticleClothBufferHelper helper. + +\param[in] maxCloths The maximum number of cloths this PxParticleClothBufferHelper should hold. +\param[in] maxTriangles The maximum number of triangles this PxParticleClothBufferHelper should hold. +\param[in] maxSprings The maximum number of springs this PxParticleClothBufferHelper should hold. +\param[in] maxParticles The maximum number of particles this PxParticleClothBufferHelper should hold. +\param[in] cudaContextManager A pointer to a PxCudaContextManager. + +\return A pointer to the PxParticleClothBufferHelper that was created. +*/ +PxParticleClothBufferHelper* PxCreateParticleClothBufferHelper(const PxU32 maxCloths, const PxU32 maxTriangles, const PxU32 maxSprings, const PxU32 maxParticles, PxCudaContextManager* cudaContextManager); + +/** +\brief Creates a PxParticleVolumeBufferHelper. + +\param[in] maxVolumes The maximum number of PxParticleVolume s this PxParticleVolumeBufferHelper instance should hold. +\param[in] maxTriangles The maximum number of triangles this PxParticleVolumeBufferHelper instance should hold. +\param[in] cudaContextManager A pointer to a PxCudaContextManager. + +\return A pointer to the new PxParticleVolumeBufferHelper. +*/ +PxParticleVolumeBufferHelper* PxCreateParticleVolumeBufferHelper(PxU32 maxVolumes, PxU32 maxTriangles, PxCudaContextManager* cudaContextManager); + +/** +\brief Creates a particle attachment buffer + +\param[in] particleBuffer The particle buffer that contains particles that should get attached to something +\param[in] particleSystem The particle system that is used to simulate the userBuffer +\return An attachment buffer ready to use +*/ +PxParticleAttachmentBuffer* PxCreateParticleAttachmentBuffer(PxParticleBuffer& particleBuffer, PxParticleSystem& particleSystem); + +/** +\brief Creates and populates a particle buffer + +\param[in] desc The particle buffer descriptor +\param[in] cudaContextManager A cuda context manager +\return A fully populated particle buffer ready to use +*/ +PxParticleBuffer* PxCreateAndPopulateParticleBuffer(const ExtGpu::PxParticleBufferDesc& desc, PxCudaContextManager* cudaContextManager); + +/** +\brief Creates and populates a particle buffer that includes support for diffuse particles + +\param[in] desc The particle buffer descriptor +\param[in] cudaContextManager A cuda context manager +\return A fully populated particle buffer ready to use +*/ +PxParticleAndDiffuseBuffer* PxCreateAndPopulateParticleAndDiffuseBuffer(const ExtGpu::PxParticleAndDiffuseBufferDesc& desc, PxCudaContextManager* cudaContextManager); + +/** +\brief Creates and populates a particle cloth buffer + +\param[in] desc The particle buffer descriptor +\param[in] clothDesc The cloth descriptor +\param[out] output A cloth output object to further configure the behavior of the cloth +\param[in] cudaContextManager A cuda context manager +\return A fully populated particle cloth buffer ready to use +*/ +PxParticleClothBuffer* PxCreateAndPopulateParticleClothBuffer(const ExtGpu::PxParticleBufferDesc& desc, const PxParticleClothDesc& clothDesc, + PxPartitionedParticleCloth& output, PxCudaContextManager* cudaContextManager); + +/** +\brief Creates and populates a particle rigid buffer. Particle rigids are particles that try to keep their relative positions. They are a bit commpressible similar to softbodies. + +\param[in] desc The particle buffer descriptor +\param[in] rigidDesc The rigid descriptor +\param[in] cudaContextManager A cuda context manager +\return A fully populated particle rigid buffer ready to use +*/ +PxParticleRigidBuffer* PxCreateAndPopulateParticleRigidBuffer(const ExtGpu::PxParticleBufferDesc& desc, const ExtGpu::PxParticleRigidDesc& rigidDesc, + PxCudaContextManager* cudaContextManager); + +} // namespace ExtGpu + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif + diff --git a/Source/ThirdParty/PhysX/extensions/PxPrismaticJoint.h b/Source/ThirdParty/PhysX/extensions/PxPrismaticJoint.h index e59207a0c..d34c190c3 100644 --- a/Source/ThirdParty/PhysX/extensions/PxPrismaticJoint.h +++ b/Source/ThirdParty/PhysX/extensions/PxPrismaticJoint.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_PRISMATICJOINT_H -#define PX_PRISMATICJOINT_H +#ifndef PX_PRISMATIC_JOINT_H +#define PX_PRISMATIC_JOINT_H /** \addtogroup extensions @{ */ @@ -163,8 +162,10 @@ public: \param[in] tolerance the linear tolerance threshold @see getProjectionLinearTolerance() + + @deprecated */ - virtual void setProjectionLinearTolerance(PxReal tolerance) = 0; + PX_DEPRECATED virtual void setProjectionLinearTolerance(PxReal tolerance) = 0; /** \brief Get the linear tolerance threshold for projection. @@ -172,8 +173,10 @@ public: \return the linear tolerance threshold in radians @see setProjectionLinearTolerance() + + @deprecated */ - virtual PxReal getProjectionLinearTolerance() const = 0; + PX_DEPRECATED virtual PxReal getProjectionLinearTolerance() const = 0; /** \brief Set the angular tolerance threshold for projection. Projection is enabled if PxConstraintFlag::ePROJECTION @@ -192,15 +195,19 @@ public: \param[in] tolerance the linear tolerance threshold @see getProjectionLinearTolerance() PxJoint::setConstraintFlags() + + @deprecated */ - virtual void setProjectionAngularTolerance(PxReal tolerance) = 0; + PX_DEPRECATED virtual void setProjectionAngularTolerance(PxReal tolerance) = 0; /** \brief Get the angular tolerance threshold for projection. @see getProjectionAngularTolerance() + + @deprecated */ - virtual PxReal getProjectionAngularTolerance() const = 0; + PX_DEPRECATED virtual PxReal getProjectionAngularTolerance() const = 0; /** \brief Returns string name of PxPrismaticJoint, used for serialization diff --git a/Source/ThirdParty/PhysX/extensions/PxRackAndPinionJoint.h b/Source/ThirdParty/PhysX/extensions/PxRackAndPinionJoint.h new file mode 100644 index 000000000..953ff04df --- /dev/null +++ b/Source/ThirdParty/PhysX/extensions/PxRackAndPinionJoint.h @@ -0,0 +1,136 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_RACK_AND_PINION_JOINT_H +#define PX_RACK_AND_PINION_JOINT_H +/** \addtogroup extensions + @{ +*/ + +#include "extensions/PxJoint.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + class PxRackAndPinionJoint; + + /** + \brief Create a rack & pinion Joint. + + \param[in] physics The physics SDK + \param[in] actor0 An actor to which the joint is attached. NULL may be used to attach the joint to a specific point in the world frame + \param[in] localFrame0 The position and orientation of the joint relative to actor0 + \param[in] actor1 An actor to which the joint is attached. NULL may be used to attach the joint to a specific point in the world frame + \param[in] localFrame1 The position and orientation of the joint relative to actor1 + + @see PxRackAndPinionJoint + */ + PxRackAndPinionJoint* PxRackAndPinionJointCreate(PxPhysics& physics, PxRigidActor* actor0, const PxTransform& localFrame0, PxRigidActor* actor1, const PxTransform& localFrame1); + + /** + \brief A joint that connects an existing revolute joint to an existing prismatic joint, + and constrains their relative angular/linear velocity and position with respect to each other. + + @see PxRackAndPinionJointCreate PxJoint + */ + class PxRackAndPinionJoint : public PxJoint + { + public: + + /** + \brief Set the hinge & prismatic joints connected by the rack & pinion joint. + + The passed hinge joint can be either PxRevoluteJoint, PxD6Joint or PxArticulationJointReducedCoordinate. It cannot be null. + The passed prismatic joint can be either PxPrismaticJoint or PxD6Joint. It cannot be null. + + Note that these joints are only used to compute the positional error correction term, + used to adjust potential drift between jointed actors. The rack & pinion joint can run without + calling this function, but in that case some visible overlap may develop over time between + the teeth of the rack & pinion meshes. + + \note Calling this function resets the internal positional error correction term. + + \param[in] hinge The hinge joint (pinion) + \param[in] prismatic The prismatic joint (rack) + \return true if success + */ + virtual bool setJoints(const PxBase* hinge, const PxBase* prismatic) = 0; + + /** + \brief Set the desired ratio directly. + + \note You may need to use a negative gear ratio if the joint frames of involved actors are not oriented in the same direction. + + \note Calling this function resets the internal positional error correction term. + + \param[in] ratio Desired ratio between the hinge and the prismatic. + */ + virtual void setRatio(float ratio) = 0; + + /** + \brief Get the ratio. + + \return Current ratio + */ + virtual float getRatio() const = 0; + + /** + \brief Set the desired ratio indirectly. + + This is a simple helper function that computes the ratio from passed data: + + ratio = (PI*2*nbRackTeeth)/(rackLength*nbPinionTeeth) + + \note Calling this function resets the internal positional error correction term. + + \param[in] nbRackTeeth Number of teeth on the rack (cannot be zero) + \param[in] nbPinionTeeth Number of teeth on the pinion (cannot be zero) + \param[in] rackLength Length of the rack + \return true if success + */ + virtual bool setData(PxU32 nbRackTeeth, PxU32 nbPinionTeeth, float rackLength) = 0; + + virtual const char* getConcreteTypeName() const { return "PxRackAndPinionJoint"; } + + protected: + + PX_INLINE PxRackAndPinionJoint(PxType concreteType, PxBaseFlags baseFlags) : PxJoint(concreteType, baseFlags) {} + + PX_INLINE PxRackAndPinionJoint(PxBaseFlags baseFlags) : PxJoint(baseFlags) {} + + virtual bool isKindOf(const char* name) const { return !::strcmp("PxRackAndPinionJoint", name) || PxJoint::isKindOf(name); } + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/extensions/PxRaycastCCD.h b/Source/ThirdParty/PhysX/extensions/PxRaycastCCD.h index 927178190..4e92e190e 100644 --- a/Source/ThirdParty/PhysX/extensions/PxRaycastCCD.h +++ b/Source/ThirdParty/PhysX/extensions/PxRaycastCCD.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,7 +22,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. @@ -81,6 +80,16 @@ namespace physx */ bool registerRaycastCCDObject(PxRigidDynamic* actor, PxShape* shape); + /** + \brief Unregister dynamic object for raycast CCD. + + \param[in] actor object's actor + \param[in] shape object's shape + + \return True if success + */ + bool unregisterRaycastCCDObject(PxRigidDynamic* actor, PxShape* shape); + /** \brief Perform raycast CCD. Call this after your simulate/fetchResults calls. diff --git a/Source/ThirdParty/PhysX/extensions/PxRemeshingExt.h b/Source/ThirdParty/PhysX/extensions/PxRemeshingExt.h new file mode 100644 index 000000000..556a859c7 --- /dev/null +++ b/Source/ThirdParty/PhysX/extensions/PxRemeshingExt.h @@ -0,0 +1,73 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_REMESHING_EXT_H +#define PX_REMESHING_EXT_H +/** \addtogroup extensions + @{ +*/ + +#include "foundation/PxVec3.h" +#include "foundation/PxArray.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief Provides methods to adjust the tessellation of meshes + */ + class PxRemeshingExt + { + public: + /** + \brief Processes a triangle mesh and makes sure that no triangle edge is longer than the maximal edge length specified + + To shorten edges that are too long, additional points get inserted at their center leading to a subdivision of the input mesh. + This process is executed repeatedly until the maximum edge length criterion is satisfied + + \param[in,out] triangles The triangles of the mesh where a maximum edge length should be enforced. They will be modified in place during the process. + \param[in,out] points The vertices of the mesh where a maximum edge length should be enforced. They will be modified in place during the process. + \param[in] maxEdgeLength The maximum edge length allowed after processing the input + \param[in] maxIterations The maximum number of subdivision iterations + \param[out] triangleMap An optional map that provides the index of the original triangle for every triangle after the subdivision + \param[in] triangleCountThreshold Optional limit to the number of triangles. Not guaranteed to match exactly, the algorithm will just stop as soon as possible after reaching the limit. + + \return True if any remeshing was applied + */ + static bool limitMaxEdgeLength(PxArray& triangles, PxArray& points, PxReal maxEdgeLength, + PxU32 maxIterations = 100, PxArray* triangleMap = NULL, PxU32 triangleCountThreshold = 0xFFFFFFFF); + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/extensions/PxRepXSerializer.h b/Source/ThirdParty/PhysX/extensions/PxRepXSerializer.h index f75320b62..92f8211d0 100644 --- a/Source/ThirdParty/PhysX/extensions/PxRepXSerializer.h +++ b/Source/ThirdParty/PhysX/extensions/PxRepXSerializer.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,9 +22,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + #ifndef PX_REPX_SERIALIZER_H #define PX_REPX_SERIALIZER_H /** \addtogroup Serializers @@ -128,21 +128,22 @@ PX_INLINE physx::PxRepXObject PxCreateRepXObject(const physx::PxBase* inType, co template PX_INLINE physx::PxRepXObject PxCreateRepXObject(const TDataType* inType) { - return PxCreateRepXObject(inType, static_cast(reinterpret_cast(inType))); + return PxCreateRepXObject(inType, static_cast(size_t(inType))); } /** \brief Preprocessor macro for RepX serializer creation. */ #define PX_NEW_REPX_SERIALIZER(T) \ - *PX_PLACEMENT_NEW(PxGetFoundation().getAllocatorCallback().allocate(sizeof(T), "PxRepXSerializer", __FILE__, __LINE__ ), T)(PxGetFoundation().getAllocatorCallback()) + *PX_PLACEMENT_NEW(PxGetAllocatorCallback()->allocate(sizeof(T), "PxRepXSerializer", __FILE__, __LINE__ ), T)(*PxGetAllocatorCallback()) /** \brief Preprocessor Macro to simplify RepX serializer delete. */ #define PX_DELETE_REPX_SERIALIZER(x) \ - { PxRepXSerializer* s = x; if (s) { PxGetFoundation().getAllocatorCallback().deallocate(s); } } + { PxRepXSerializer* s = x; if (s) { PxGetAllocatorCallback()->deallocate(s); } } /** @} */ -#endif // PX_REPX_SERIALIZER_H +#endif + diff --git a/Source/ThirdParty/PhysX/extensions/PxRepXSimpleType.h b/Source/ThirdParty/PhysX/extensions/PxRepXSimpleType.h index a49ad2339..0eee59929 100644 --- a/Source/ThirdParty/PhysX/extensions/PxRepXSimpleType.h +++ b/Source/ThirdParty/PhysX/extensions/PxRepXSimpleType.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - - #ifndef PX_REPX_SIMPLE_TYPE_H #define PX_REPX_SIMPLE_TYPE_H diff --git a/Source/ThirdParty/PhysX/extensions/PxRevoluteJoint.h b/Source/ThirdParty/PhysX/extensions/PxRevoluteJoint.h index 8d82c8cb0..55bed4fc5 100644 --- a/Source/ThirdParty/PhysX/extensions/PxRevoluteJoint.h +++ b/Source/ThirdParty/PhysX/extensions/PxRevoluteJoint.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_REVOLUTEJOINT_H -#define PX_REVOLUTEJOINT_H +#ifndef PX_REVOLUTE_JOINT_H +#define PX_REVOLUTE_JOINT_H /** \addtogroup extensions @{ */ @@ -139,14 +138,14 @@ public: If the joint is spinning faster than this velocity, the motor will actually try to brake (see PxRevoluteJointFlag::eDRIVE_FREESPIN.) - If you set this to infinity then the motor will keep speeding up, unless there is some sort - of resistance on the attached bodies. The sign of this variable determines the rotation direction, - with positive values going the same way as positive joint angles. + The sign of this variable determines the rotation direction, with positive values going + the same way as positive joint angles. Setting a very large target velocity may cause + undesirable results. \param[in] velocity the drive target velocity - \param[in] autowake Whether to wake the joint rigids up if it is asleep. + \param[in] autowake Whether to wake up the joint rigids if they are asleep. - Range: [0, PX_MAX_F32)
+ Range: (-PX_MAX_F32, PX_MAX_F32)
Default: 0.0 @see PxRevoluteFlags::eDRIVE_FREESPIN @@ -165,8 +164,6 @@ public: /** \brief sets the maximum torque the drive can exert. - Setting this to a very large value if velTarget is also very large may cause unexpected results. - The value set here may be used either as an impulse limit or a force limit, depending on the flag PxConstraintFlag::eDRIVE_LIMITS_ARE_FORCES Range: [0, PX_MAX_F32)
@@ -256,8 +253,10 @@ public: \param[in] tolerance the linear tolerance threshold @see getProjectionLinearTolerance() PxJoint::setConstraintFlags() PxConstraintFlag::ePROJECTION + + @deprecated */ - virtual void setProjectionLinearTolerance(PxReal tolerance) = 0; + PX_DEPRECATED virtual void setProjectionLinearTolerance(PxReal tolerance) = 0; /** \brief Get the linear tolerance threshold for projection. @@ -265,8 +264,10 @@ public: \return the linear tolerance threshold @see setProjectionLinearTolerance() + + @deprecated */ - virtual PxReal getProjectionLinearTolerance() const = 0; + PX_DEPRECATED virtual PxReal getProjectionLinearTolerance() const = 0; /** \brief Set the angular tolerance threshold for projection. Projection is enabled if @@ -285,8 +286,10 @@ public: \param[in] tolerance the angular tolerance threshold in radians @see getProjectionAngularTolerance() PxJoint::setConstraintFlag() PxConstraintFlag::ePROJECTION + + @deprecated */ - virtual void setProjectionAngularTolerance(PxReal tolerance) = 0; + PX_DEPRECATED virtual void setProjectionAngularTolerance(PxReal tolerance) = 0; /** \brief gets the angular tolerance threshold for projection. @@ -294,8 +297,10 @@ public: \return the angular tolerance threshold in radians @see setProjectionAngularTolerance() + + @deprecated */ - virtual PxReal getProjectionAngularTolerance() const = 0; + PX_DEPRECATED virtual PxReal getProjectionAngularTolerance() const = 0; /** \brief Returns string name of PxRevoluteJoint, used for serialization diff --git a/Source/ThirdParty/PhysX/extensions/PxRigidActorExt.h b/Source/ThirdParty/PhysX/extensions/PxRigidActorExt.h index c7a3b7bf2..cb331cd4b 100644 --- a/Source/ThirdParty/PhysX/extensions/PxRigidActorExt.h +++ b/Source/ThirdParty/PhysX/extensions/PxRigidActorExt.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_EXTENSIONS_RIGIDACTOR_H -#define PX_PHYSICS_EXTENSIONS_RIGIDACTOR_H +#ifndef PX_RIGID_ACTOR_EXT_H +#define PX_RIGID_ACTOR_EXT_H /** \addtogroup extensions @{ */ @@ -43,6 +41,9 @@ namespace physx { #endif +class PxBVH; +class PxCooking; + /** \brief utility functions for use with PxRigidActor and subclasses @@ -82,7 +83,6 @@ public: @see PxShape PxShape::release(), PxPhysics::createShape(), PxRigidActor::attachShape() */ - static PxShape* createExclusiveShape(PxRigidActor& actor, const PxGeometry& geometry, PxMaterial*const* materials, PxU16 materialCount, PxShapeFlags shapeFlags = PxShapeFlag::eVISUALIZATION | PxShapeFlag::eSCENE_QUERY_SHAPE | PxShapeFlag::eSIMULATION_SHAPE) { @@ -125,7 +125,6 @@ public: @see PxShape PxShape::release(), PxPhysics::createShape(), PxRigidActor::attachShape() */ - static PX_FORCE_INLINE PxShape* createExclusiveShape(PxRigidActor& actor, const PxGeometry& geometry, const PxMaterial& material, PxShapeFlags shapeFlags = PxShapeFlag::eVISUALIZATION | PxShapeFlag::eSCENE_QUERY_SHAPE | PxShapeFlag::eSIMULATION_SHAPE) { @@ -133,7 +132,6 @@ public: return createExclusiveShape(actor, geometry, &materialPtr, 1, shapeFlags); } - /** \brief Gets a list of bounds based on shapes in rigid actor. This list can be used to cook/create bounding volume hierarchy though PxCooking API. @@ -141,10 +139,24 @@ public: \param[in] actor The actor from which the bounds list is retrieved. \param[out] numBounds Number of bounds in returned list. - @see PxShape PxBVHStructure PxCooking::createBVHStructure PxCooking::cookBVHStructure + @see PxShape PxBVH PxCooking::createBVH PxCooking::cookBVH */ - static PxBounds3* getRigidActorShapeLocalBoundsList(const PxRigidActor& actor, PxU32& numBounds); + static PxBounds3* getRigidActorShapeLocalBoundsList(const PxRigidActor& actor, PxU32& numBounds); + /** + \brief Convenience function to create a PxBVH object from a PxRigidActor. + + The computed PxBVH can then be used in PxScene::addActor() or PxAggregate::addActor(). + After adding the actor & BVH to the scene/aggregate, release the PxBVH object by calling PxBVH::release(). + + \param[in] physics The physics object. The function will retrieve the insertion callback from it. + \param[in] actor The actor to compute a PxBVH for. + + \return The PxBVH for this actor. + + @see PxBVH PxScene::addActor PxAggregate::addActor + */ + static PxBVH* createBVHFromActor(PxPhysics& physics, const PxRigidActor& actor); }; #if !PX_DOXYGEN diff --git a/Source/ThirdParty/PhysX/extensions/PxRigidBodyExt.h b/Source/ThirdParty/PhysX/extensions/PxRigidBodyExt.h index 71228b3ab..298801600 100644 --- a/Source/ThirdParty/PhysX/extensions/PxRigidBodyExt.h +++ b/Source/ThirdParty/PhysX/extensions/PxRigidBodyExt.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_EXTENSIONS_RIGIDBODY_H -#define PX_PHYSICS_EXTENSIONS_RIGIDBODY_H +#ifndef PX_RIGID_BODY_EXT_H +#define PX_RIGID_BODY_EXT_H /** \addtogroup extensions @{ */ @@ -93,7 +91,6 @@ public: */ static bool updateMassAndInertia(PxRigidBody& body, const PxReal* shapeDensities, PxU32 shapeDensityCount, const PxVec3* massLocalPose = NULL, bool includeNonSimShapes = false); - /** \brief Computation of mass properties for a rigid body actor @@ -109,7 +106,6 @@ public: */ static bool updateMassAndInertia(PxRigidBody& body, PxReal density, const PxVec3* massLocalPose = NULL, bool includeNonSimShapes = false); - /** \brief Computation of mass properties for a rigid body actor @@ -133,7 +129,6 @@ public: */ static bool setMassAndUpdateInertia(PxRigidBody& body, const PxReal* shapeMasses, PxU32 shapeMassCount, const PxVec3* massLocalPose = NULL, bool includeNonSimShapes = false); - /** \brief Computation of mass properties for a rigid body actor @@ -154,7 +149,6 @@ public: */ static bool setMassAndUpdateInertia(PxRigidBody& body, PxReal mass, const PxVec3* massLocalPose = NULL, bool includeNonSimShapes = false); - /** \brief Compute the mass, inertia tensor and center of mass from a list of shapes. @@ -166,7 +160,6 @@ public: */ static PxMassProperties computeMassPropertiesFromShapes(const PxShape* const* shapes, PxU32 shapeCount); - /** \brief Applies a force (or impulse) defined in the global coordinate frame, acting at a particular point in global coordinates, to the actor. @@ -315,6 +308,58 @@ public: */ static PxVec3 getVelocityAtOffset(const PxRigidBody& body, const PxVec3& pos); + /** + \brief Compute the change to linear and angular velocity that would occur if an impulsive force and torque were to be applied to a specified rigid body. + + The rigid body is left unaffected unless a subsequent independent call is executed that actually applies the computed changes to velocity and angular velocity. + + \note if this call is used to determine the velocity delta for an articulation link, only the mass properties of the link are taken into account. + + @see PxRigidBody::getLinearVelocity, PxRigidBody::setLinearVelocity, PxRigidBody::getAngularVelocity, PxRigidBody::setAngularVelocity + + \param[in] body The body under consideration. + \param[in] impulsiveForce The impulsive force that would be applied to the specified rigid body. + \param[in] impulsiveTorque The impulsive torque that would be applied to the specified rigid body. + \param[out] deltaLinearVelocity The change in linear velocity that would arise if impulsiveForce was to be applied to the specified rigid body. + \param[out] deltaAngularVelocity The change in angular velocity that would arise if impulsiveTorque was to be applied to the specified rigid body. + */ + static void computeVelocityDeltaFromImpulse(const PxRigidBody& body, const PxVec3& impulsiveForce, const PxVec3& impulsiveTorque, PxVec3& deltaLinearVelocity, PxVec3& deltaAngularVelocity); + + /** + \brief Computes the linear and angular velocity change vectors for a given impulse at a world space position taking a mass and inertia scale into account + + This function is useful for extracting the respective linear and angular velocity changes from a contact or joint when the mass/inertia ratios have been adjusted. + + \note if this call is used to determine the velocity delta for an articulation link, only the mass properties of the link are taken into account. + + \param[in] body The rigid body + \param[in] globalPose The body's world space transform + \param[in] point The point in world space where the impulse is applied + \param[in] impulse The impulse vector in world space + \param[in] invMassScale The inverse mass scale + \param[in] invInertiaScale The inverse inertia scale + \param[out] deltaLinearVelocity The linear velocity change + \param[out] deltaAngularVelocity The angular velocity change + */ + static void computeVelocityDeltaFromImpulse(const PxRigidBody& body, const PxTransform& globalPose, const PxVec3& point, const PxVec3& impulse, const PxReal invMassScale, + const PxReal invInertiaScale, PxVec3& deltaLinearVelocity, PxVec3& deltaAngularVelocity); + + /** + \brief Computes the linear and angular impulse vectors for a given impulse at a world space position taking a mass and inertia scale into account + + This function is useful for extracting the respective linear and angular impulses from a contact or joint when the mass/inertia ratios have been adjusted. + + \param[in] body The rigid body + \param[in] globalPose The body's world space transform + \param[in] point The point in world space where the impulse is applied + \param[in] impulse The impulse vector in world space + \param[in] invMassScale The inverse mass scale + \param[in] invInertiaScale The inverse inertia scale + \param[out] linearImpulse The linear impulse + \param[out] angularImpulse The angular impulse + */ + static void computeLinearAngularImpulse(const PxRigidBody& body, const PxTransform& globalPose, const PxVec3& point, const PxVec3& impulse, const PxReal invMassScale, + const PxReal invInertiaScale, PxVec3& linearImpulse, PxVec3& angularImpulse); /** \brief Performs a linear sweep through space with the body's geometry objects. @@ -342,7 +387,7 @@ public: \return True if a blocking hit was found. - @see PxScene PxQueryFlags PxFilterData PxBatchQueryPreFilterShader PxBatchQueryPostFilterShader PxSweepHit + @see PxScene PxQueryFlags PxFilterData PxSweepHit */ static bool linearSweepSingle( PxRigidBody& body, PxScene& scene, const PxVec3& unitDir, const PxReal distance, @@ -383,7 +428,7 @@ public: \return the number of touching hits. If overflow is set to true, the results are incomplete. In case of overflow there are also no guarantees that all touching hits returned are closer than the blocking hit. - @see PxScene PxQueryFlags PxFilterData PxBatchQueryPreFilterShader PxBatchQueryPostFilterShader PxSweepHit + @see PxScene PxQueryFlags PxFilterData PxSweepHit */ static PxU32 linearSweepMultiple( PxRigidBody& body, PxScene& scene, const PxVec3& unitDir, const PxReal distance, @@ -393,63 +438,6 @@ public: const PxQueryFilterData& filterData = PxQueryFilterData(), PxQueryFilterCallback* filterCall = NULL, const PxQueryCache* cache = NULL, const PxReal inflation = 0.0f); - - - /** - \brief Compute the change to linear and angular velocity that would occur if an impulsive force and torque were to be applied to a specified rigid body. - - The rigid body is left unaffected unless a subsequent independent call is executed that actually applies the computed changes to velocity and angular velocity. - - \note if this call is used to determine the velocity delta for an articulation link, only the mass properties of the link are taken into account. - - @see PxRigidBody::getLinearVelocity, PxRigidBody::setLinearVelocity, PxRigidBody::getAngularVelocity, PxRigidBody::setAngularVelocity - - \param[in] body The body under consideration. - \param[in] impulsiveForce The impulsive force that would be applied to the specified rigid body. - \param[in] impulsiveTorque The impulsive torque that would be applied to the specified rigid body. - \param[out] deltaLinearVelocity The change in linear velocity that would arise if impulsiveForce was to be applied to the specified rigid body. - \param[out] deltaAngularVelocity The change in angular velocity that would arise if impulsiveTorque was to be applied to the specified rigid body. - */ - static void computeVelocityDeltaFromImpulse(const PxRigidBody& body, const PxVec3& impulsiveForce, const PxVec3& impulsiveTorque, PxVec3& deltaLinearVelocity, PxVec3& deltaAngularVelocity); - - /** - \brief Computes the linear and angular velocity change vectors for a given impulse at a world space position taking a mass and inertia scale into account - - This function is useful for extracting the respective linear and angular velocity changes from a contact or joint when the mass/inertia ratios have been adjusted. - - \note if this call is used to determine the velocity delta for an articulation link, only the mass properties of the link are taken into account. - - \param[in] body The rigid body - \param[in] globalPose The body's world space transform - \param[in] point The point in world space where the impulse is applied - \param[in] impulse The impulse vector in world space - \param[in] invMassScale The inverse mass scale - \param[in] invInertiaScale The inverse inertia scale - \param[out] deltaLinearVelocity The linear velocity change - \param[out] deltaAngularVelocity The angular velocity change - */ - - static void computeVelocityDeltaFromImpulse(const PxRigidBody& body, const PxTransform& globalPose, const PxVec3& point, const PxVec3& impulse, const PxReal invMassScale, - const PxReal invInertiaScale, PxVec3& deltaLinearVelocity, PxVec3& deltaAngularVelocity); - - /** - \brief Computes the linear and angular impulse vectors for a given impulse at a world space position taking a mass and inertia scale into account - - This function is useful for extracting the respective linear and angular impulses from a contact or joint when the mass/inertia ratios have been adjusted. - - \param[in] body The rigid body - \param[in] globalPose The body's world space transform - \param[in] point The point in world space where the impulse is applied - \param[in] impulse The impulse vector in world space - \param[in] invMassScale The inverse mass scale - \param[in] invInertiaScale The inverse inertia scale - \param[out] linearImpulse The linear impulse - \param[out] angularImpulse The angular impulse - */ - static void computeLinearAngularImpulse(const PxRigidBody& body, const PxTransform& globalPose, const PxVec3& point, const PxVec3& impulse, const PxReal invMassScale, - const PxReal invInertiaScale, PxVec3& linearImpulse, PxVec3& angularImpulse); - - }; #if !PX_DOXYGEN diff --git a/Source/ThirdParty/PhysX/extensions/PxSamplingExt.h b/Source/ThirdParty/PhysX/extensions/PxSamplingExt.h new file mode 100644 index 000000000..088c4f20f --- /dev/null +++ b/Source/ThirdParty/PhysX/extensions/PxSamplingExt.h @@ -0,0 +1,185 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_SAMPLING_EXT_H +#define PX_SAMPLING_EXT_H +/** \addtogroup extensions + @{ +*/ + +#include "foundation/PxArray.h" +#include "geometry/PxGeometry.h" +#include "foundation/PxUserAllocated.h" +#include "geometry/PxSimpleTriangleMesh.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +/** +\brief utility functions to sample vertices on or inside a triangle mesh or other geometries +*/ +class PxSamplingExt +{ +public: + /** Computes samples on a triangle mesh's surface that are not closer to each other than a given distance. Optionally the mesh's interior can be filled with samples as well. + + \param[in] mesh The triangle mesh + \param[in] r The closest distance two surface samples are allowed to have + \param[out] result Equally distributed samples on and if specified inside the triangle mesh + \param[in] rVolume The average distance of samples inside the mesh. If set to zero, samples will only be placed on the mesh's surface + \param[out] triangleIds Optional output containing the index of the triangle for all samples on the mesh's surface. The array will contain less entries than output vertices if volume samples are active since volume samples are not on the surface. + \param[out] barycentricCoordinates Optional output containing the barycentric coordinates for all samples on the mesh's surface. The array will contain less entries than output vertices if volume samples are active since volume samples are not on the surface. + \param[in] axisAlignedBox A box that limits the space where samples can get created + \param[in] boxOrientation The orientation of the box that limits the space where samples can get created + \param[in] maxNumSamples If larger than zero, the sampler will stop when the sample count reaches maxNumSamples + \param[in] numSampleAttemptsAroundPoint Number of repetitions the underlying algorithm performs to find a new valid sample that matches all criteria like minimal distance to existing samples etc. + \return Returns true if the sampling was successful and false if there was a problem. Usually an internal overflow is the problem for very big meshes or very small sampling radii. + */ + static bool poissonSample(const PxSimpleTriangleMesh& mesh, PxReal r, PxArray& result, PxReal rVolume = 0.0f, PxArray* triangleIds = NULL, PxArray* barycentricCoordinates = NULL, + const PxBounds3* axisAlignedBox = NULL, const PxQuat* boxOrientation = NULL, PxU32 maxNumSamples = 0, PxU32 numSampleAttemptsAroundPoint = 30); + + /** Computes samples on a geometry's surface that are not closer to each other than a given distance. + + \param[in] geometry The geometry that defines the surface on which the samples get created + \param[in] transform The geometry's global pose + \param[in] worldBounds The geometry's bounding box + \param[in] r The closest distance two surface samples are allowed to have + \param[out] result Equally distributed samples on and if specified inside the triangle mesh + \param[in] rVolume The average distance of samples inside the mesh. If set to zero, samples will only be placed on the mesh's surface + \param[in] axisAlignedBox A box that limits the space where samples can get created + \param[in] boxOrientation The orientation of the box that limits the space where samples can get created + \param[in] maxNumSamples If larger than zero, the sampler will stop when the sample count reaches maxNumSamples + \param[in] numSampleAttemptsAroundPoint Number of repetitions the underlying algorithm performs to find a new valid sample that matches all criteria like minimal distance to existing samples etc. + \return Returns true if the sampling was successful and false if there was a problem. Usually an internal overflow is the problem for very big meshes or very small sampling radii. + */ + static bool poissonSample(const PxGeometry& geometry, const PxTransform& transform, const PxBounds3& worldBounds, PxReal r, PxArray& result, PxReal rVolume = 0.0f, + const PxBounds3* axisAlignedBox = NULL, const PxQuat* boxOrientation = NULL, PxU32 maxNumSamples = 0, PxU32 numSampleAttemptsAroundPoint = 30); +}; + +/** +\brief Sampler to generate Poisson Samples locally on a triangle mesh or a shape. For every local addition of new samples, an individual sampling density can be used. +*/ +class PxPoissonSampler : public PxUserAllocated +{ +public: + /** Sets the sampling radius + \param[in] samplingRadius The closest distance two surface samples are allowed to have. Changing the sampling radius is a bit an expensive operation. + \return Returns true if the sampling was successful and false if there was a problem. Usually an internal overflow is the problem for very big meshes or very small sampling radii. + */ + virtual bool setSamplingRadius(PxReal samplingRadius) = 0; + + /** Adds samples + \param[in] samples The samples to add. Adding samples is a bit an expensive operation. + */ + virtual void addSamples(const PxArray& samples) = 0; + + /** Adds samples + \param[in] samples The samples to remove. Removing samples is a bit an expensive operation. + \return Returns the number of removed samples. If some samples were not found, then the number of actually removed samples will be smaller than the number of samples requested to remove + */ + virtual PxU32 removeSamples(const PxArray& samples) = 0; + + /** Adds new Poisson Samples inside the sphere specified + \param[in] sphereCenter The sphere's center. Used to define the region where new samples get added. + \param[in] sphereRadius The sphere's radius. Used to define the region where new samples get added. + \param[in] createVolumeSamples If set to true, samples will also get generated inside of the mesh, not just on its surface. + */ + virtual void addSamplesInSphere(const PxVec3& sphereCenter, PxReal sphereRadius, bool createVolumeSamples = false) = 0; + + /** Adds new Poisson Samples inside the box specified + \param[in] axisAlignedBox The axis aligned bounding box. Used to define the region where new samples get added. + \param[in] boxOrientation The orientation making an oriented bounding box out of the axis aligned one. Used to define the region where new samples get added. + \param[in] createVolumeSamples If set to true, samples will also get generated inside of the mesh, not just on its surface. + */ + virtual void addSamplesInBox(const PxBounds3& axisAlignedBox, const PxQuat& boxOrientation, bool createVolumeSamples = false) = 0; + + /** Gets the Poisson Samples + \return Returns the generated Poisson Samples + */ + virtual const PxArray& getSamples() const = 0; + + virtual ~PxPoissonSampler() { } +}; + + +/** Creates a shape sampler +\param[in] geometry The shape that defines the surface on which the samples get created +\param[in] transform The shape's global pose +\param[in] worldBounds The shapes bounding box +\param[in] initialSamplingRadius The closest distance two surface samples are allowed to have +\param[in] numSampleAttemptsAroundPoint Number of repetitions the underlying algorithm performs to find a new valid sample that matches all criteria like minimal distance to existing samples etc. +\return Returns the sampler +*/ +PxPoissonSampler* PxCreateShapeSampler(const PxGeometry& geometry, const PxTransform& transform, const PxBounds3& worldBounds, PxReal initialSamplingRadius, PxI32 numSampleAttemptsAroundPoint = 30); + + +/** +\brief Sampler to generate Poisson Samples on a triangle mesh. +*/ +class PxTriangleMeshPoissonSampler : public virtual PxPoissonSampler +{ +public: + /** Gets the Poisson Samples' triangle indices + \return Returns the generated Poisson Samples' triangle indices + */ + virtual const PxArray& getSampleTriangleIds() const = 0; + + /** Gets the Poisson Samples' barycentric coordinates + \return Returns the generated Poisson Samples' barycentric coordinates + */ + virtual const PxArray& getSampleBarycentrics() const = 0; + + /** Checks whether a point is inside the triangle mesh + \return Returns true if the point is inside the triangle mesh + */ + virtual bool isPointInTriangleMesh(const PxVec3& p) = 0; + + virtual ~PxTriangleMeshPoissonSampler() { } +}; + + +/** Creates a triangle mesh sampler +\param[in] triangles The triangle indices of the mesh +\param[in] numTriangles The total number of triangles +\param[in] vertices The vertices of the mesh +\param[in] numVertices The total number of vertices +\param[in] initialSamplingRadius The closest distance two surface samples are allowed to have +\param[in] numSampleAttemptsAroundPoint Number of repetitions the underlying algorithm performs to find a new valid sample that matches all criteria like minimal distance to existing samples etc. +\return Returns the sampler +*/ +PxTriangleMeshPoissonSampler* PxCreateTriangleMeshSampler(const PxU32* triangles, PxU32 numTriangles, const PxVec3* vertices, PxU32 numVertices, PxReal initialSamplingRadius, PxI32 numSampleAttemptsAroundPoint = 30); + + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/extensions/PxSceneQueryExt.h b/Source/ThirdParty/PhysX/extensions/PxSceneQueryExt.h index 6f08fe803..f089abf21 100644 --- a/Source/ThirdParty/PhysX/extensions/PxSceneQueryExt.h +++ b/Source/ThirdParty/PhysX/extensions/PxSceneQueryExt.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_EXTENSIONS_SCENE_QUERY_H -#define PX_PHYSICS_EXTENSIONS_SCENE_QUERY_H +#ifndef PX_SCENE_QUERY_EXT_H +#define PX_SCENE_QUERY_EXT_H /** \addtogroup extensions @{ */ @@ -301,6 +299,208 @@ public: PxSceneQueryFilterCallback* filterCall = NULL); }; +struct PxBatchQueryStatus +{ + enum Enum + { + /** + \brief This is the initial state before a query starts. + */ + ePENDING = 0, + + /** + \brief The query is finished; results have been written into the result and hit buffers. + */ + eSUCCESS, + + /** + \brief The query results were incomplete due to touch hit buffer overflow. Blocking hit is still correct. + */ + eOVERFLOW + }; + + static PX_FORCE_INLINE Enum getStatus(const PxRaycastBuffer& r) + { + return (0xffffffff == r.nbTouches) ? ePENDING : (0xffffffff == r.maxNbTouches ? eOVERFLOW : eSUCCESS); + } + static PX_FORCE_INLINE Enum getStatus(const PxSweepBuffer& r) + { + return (0xffffffff == r.nbTouches) ? ePENDING : (0xffffffff == r.maxNbTouches ? eOVERFLOW : eSUCCESS); + } + static PX_FORCE_INLINE Enum getStatus(const PxOverlapBuffer& r) + { + return (0xffffffff == r.nbTouches) ? ePENDING : (0xffffffff == r.maxNbTouches ? eOVERFLOW : eSUCCESS); + } +}; + +class PxBatchQueryExt +{ +public: + + virtual void release() = 0; + + /** + \brief Performs a raycast against objects in the scene. + + \note Touching hits are not ordered. + \note Shooting a ray from within an object leads to different results depending on the shape type. Please check the details in article SceneQuery. User can ignore such objects by using one of the provided filter mechanisms. + + \param[in] origin Origin of the ray. + \param[in] unitDir Normalized direction of the ray. + \param[in] distance Length of the ray. Needs to be larger than 0. + \param[in] maxNbTouches Maximum number of hits to record in the touch buffer for this query. Default=0 reports a single blocking hit. If maxTouchHits is set to 0 all hits are treated as blocking by default. + \param[in] hitFlags Specifies which properties per hit should be computed and returned in hit array and blocking hit. + \param[in] filterData Filtering data passed to the filter shader. See #PxQueryFilterData #PxQueryFilterCallback + \param[in] cache Cached hit shape (optional). Query is tested against cached shape first. If no hit is found the ray gets queried against the scene. + Note: Filtering is not executed for a cached shape if supplied; instead, if a hit is found, it is assumed to be a blocking hit. + Note: Using past touching hits as cache will produce incorrect behavior since the cached hit will always be treated as blocking. + + \note This query call writes to a list associated with the query object and is NOT thread safe (for performance reasons there is no lock + and overlapping writes from different threads may result in undefined behavior). + + \return Returns a PxRaycastBuffer pointer that will store the result of the query after execute() is completed. + This will point either to an element of the buffer allocated on construction or to a user buffer passed to the constructor. + @see PxCreateBatchQueryExt + + @see PxQueryFilterData PxQueryFilterCallback PxRaycastHit PxScene::raycast + */ + virtual PxRaycastBuffer* raycast( + const PxVec3& origin, const PxVec3& unitDir, const PxReal distance, + const PxU16 maxNbTouches = 0, + PxHitFlags hitFlags = PxHitFlags(PxHitFlag::eDEFAULT), + const PxQueryFilterData& filterData = PxQueryFilterData(), + const PxQueryCache* cache = NULL) = 0; + + /** + \brief Performs a sweep test against objects in the scene. + + \note Touching hits are not ordered. + \note If a shape from the scene is already overlapping with the query shape in its starting position, + the hit is returned unless eASSUME_NO_INITIAL_OVERLAP was specified. + + \param[in] geometry Geometry of object to sweep (supported types are: box, sphere, capsule, convex). + \param[in] pose Pose of the sweep object. + \param[in] unitDir Normalized direction of the sweep. + \param[in] distance Sweep distance. Needs to be larger than 0. Will be clamped to PX_MAX_SWEEP_DISTANCE. + \param[in] maxNbTouches Maximum number of hits to record in the touch buffer for this query. Default=0 reports a single blocking hit. If maxTouchHits is set to 0 all hits are treated as blocking by default. + \param[in] hitFlags Specifies which properties per hit should be computed and returned in hit array and blocking hit. + \param[in] filterData Filtering data and simple logic. See #PxQueryFilterData #PxQueryFilterCallback + \param[in] cache Cached hit shape (optional). Query is tested against cached shape first. If no hit is found the ray gets queried against the scene. + Note: Filtering is not executed for a cached shape if supplied; instead, if a hit is found, it is assumed to be a blocking hit. + Note: Using past touching hits as cache will produce incorrect behavior since the cached hit will always be treated as blocking. + \param[in] inflation This parameter creates a skin around the swept geometry which increases its extents for sweeping. The sweep will register a hit as soon as the skin touches a shape, and will return the corresponding distance and normal. + Note: ePRECISE_SWEEP doesn't support inflation. Therefore the sweep will be performed with zero inflation. + + \note This query call writes to a list associated with the query object and is NOT thread safe (for performance reasons there is no lock + and overlapping writes from different threads may result in undefined behavior). + + \return Returns a PxSweepBuffer pointer that will store the result of the query after execute() is completed. + This will point either to an element of the buffer allocated on construction or to a user buffer passed to the constructor. + @see PxCreateBatchQueryExt + + @see PxHitFlags PxQueryFilterData PxBatchQueryPreFilterShader PxBatchQueryPostFilterShader PxSweepHit + */ + virtual PxSweepBuffer* sweep( + const PxGeometry& geometry, const PxTransform& pose, const PxVec3& unitDir, const PxReal distance, + const PxU16 maxNbTouches = 0, + PxHitFlags hitFlags = PxHitFlags(PxHitFlag::eDEFAULT), + const PxQueryFilterData& filterData = PxQueryFilterData(), + const PxQueryCache* cache = NULL, + const PxReal inflation = 0.0f) = 0; + + + /** + \brief Performs an overlap test of a given geometry against objects in the scene. + + \note Filtering: returning eBLOCK from user filter for overlap queries will cause a warning (see #PxQueryHitType). + + \param[in] geometry Geometry of object to check for overlap (supported types are: box, sphere, capsule, convex). + \param[in] pose Pose of the object. + \param[in] maxNbTouches Maximum number of hits to record in the touch buffer for this query. Default=0 reports a single blocking hit. If maxTouchHits is set to 0 all hits are treated as blocking by default. + \param[in] filterData Filtering data and simple logic. See #PxQueryFilterData #PxQueryFilterCallback + \param[in] cache Cached hit shape (optional). Query is tested against cached shape first. If no hit is found the ray gets queried against the scene. + Note: Filtering is not executed for a cached shape if supplied; instead, if a hit is found, it is assumed to be a blocking hit. + Note: Using past touching hits as cache will produce incorrect behavior since the cached hit will always be treated as blocking. + + \note eBLOCK should not be returned from user filters for overlap(). Doing so will result in undefined behavior, and a warning will be issued. + \note If the PxQueryFlag::eNO_BLOCK flag is set, the eBLOCK will instead be automatically converted to an eTOUCH and the warning suppressed. + \note This query call writes to a list associated with the query object and is NOT thread safe (for performance reasons there is no lock + and overlapping writes from different threads may result in undefined behavior). + + \return Returns a PxOverlapBuffer pointer that will store the result of the query after execute() is completed. + This will point either to an element of the buffer allocated on construction or to a user buffer passed to the constructor. + @see PxCreateBatchQueryExt + + @see PxQueryFilterData PxQueryFilterCallback + */ + virtual PxOverlapBuffer* overlap( + const PxGeometry& geometry, const PxTransform& pose, + PxU16 maxNbTouches = 0, + const PxQueryFilterData& filterData = PxQueryFilterData(), + const PxQueryCache* cache = NULL) = 0; + + virtual void execute() = 0; + +protected: + + virtual ~PxBatchQueryExt() {} +}; + +/** +\brief Create a PxBatchQueryExt without the need for pre-allocated result or touch buffers. + +\param[in] scene Queries will be performed against objects in the specified PxScene +\param[in] queryFilterCallback Filtering for all queries is performed using queryFilterCallback. A null pointer results in all shapes being considered. + +\param[in] maxNbRaycasts A result buffer will be allocated that is large enough to accommodate maxNbRaycasts calls to PxBatchQueryExt::raycast() +\param[in] maxNbRaycastTouches A touch buffer will be allocated that is large enough to accommodate maxNbRaycastTouches touches for all raycasts in the batch. + +\param[in] maxNbSweeps A result buffer will be allocated that is large enough to accommodate maxNbSweeps calls to PxBatchQueryExt::sweep() +\param[in] maxNbSweepTouches A touch buffer will be allocated that is large enough to accommodate maxNbSweepTouches touches for all sweeps in the batch. + +\param[in] maxNbOverlaps A result buffer will be allocated that is large enough to accommodate maxNbOverlaps calls to PxBatchQueryExt::overlap() +\param[in] maxNbOverlapTouches A touch buffer will be allocated that is large enough to accommodate maxNbOverlapTouches touches for all overlaps in the batch. + +\return Returns a PxBatchQueryExt instance. A NULL pointer will be returned if the subsequent allocations fail or if any of the arguments are illegal. +In the event that a NULL pointer is returned a corresponding error will be issued to the error stream. +*/ +PxBatchQueryExt* PxCreateBatchQueryExt( + const PxScene& scene, PxQueryFilterCallback* queryFilterCallback, + const PxU32 maxNbRaycasts, const PxU32 maxNbRaycastTouches, + const PxU32 maxNbSweeps, const PxU32 maxNbSweepTouches, + const PxU32 maxNbOverlaps, const PxU32 maxNbOverlapTouches); + + +/** +\brief Create a PxBatchQueryExt with user-supplied result and touch buffers. + +\param[in] scene Queries will be performed against objects in the specified PxScene +\param[in] queryFilterCallback Filtering for all queries is performed using queryFilterCallback. A null pointer results in all shapes being considered. + +\param[in] raycastBuffers This is the array that will be used to store the results of each raycast in a batch. +\param[in] maxNbRaycasts This is the length of the raycastBuffers array. +\param[in] raycastTouches This is the array that will be used to store the touches generated by all raycasts in a batch. +\param[in] maxNbRaycastTouches This is the length of the raycastTouches array. + +\param[in] sweepBuffers This is the array that will be used to store the results of each sweep in a batch. +\param[in] maxNbSweeps This is the length of the sweepBuffers array. +\param[in] sweepTouches This is the array that will be used to store the touches generated by all sweeps in a batch. +\param[in] maxNbSweepTouches This is the length of the sweepTouches array. + +\param[in] overlapBuffers This is the array that will be used to store the results of each overlap in a batch. +\param[in] maxNbOverlaps This is the length of the overlapBuffers array. +\param[in] overlapTouches This is the array that will be used to store the touches generated by all overlaps in a batch. +\param[in] maxNbOverlapTouches This is the length of the overlapTouches array. + +\return Returns a PxBatchQueryExt instance. A NULL pointer will be returned if the subsequent allocations fail or if any of the arguments are illegal. +In the event that a NULL pointer is returned a corresponding error will be issued to the error stream. +*/ +PxBatchQueryExt* PxCreateBatchQueryExt( + const PxScene& scene, PxQueryFilterCallback* queryFilterCallback, + PxRaycastBuffer* raycastBuffers, const PxU32 maxNbRaycasts, PxRaycastHit* raycastTouches, const PxU32 maxNbRaycastTouches, + PxSweepBuffer* sweepBuffers, const PxU32 maxNbSweeps, PxSweepHit* sweepTouches, const PxU32 maxNbSweepTouches, + PxOverlapBuffer* overlapBuffers, const PxU32 maxNbOverlaps, PxOverlapHit* overlapTouches, const PxU32 maxNbOverlapTouches); + #if !PX_DOXYGEN } // namespace physx #endif diff --git a/Source/ThirdParty/PhysX/extensions/PxSceneQuerySystemExt.h b/Source/ThirdParty/PhysX/extensions/PxSceneQuerySystemExt.h new file mode 100644 index 000000000..909fd726f --- /dev/null +++ b/Source/ThirdParty/PhysX/extensions/PxSceneQuerySystemExt.h @@ -0,0 +1,67 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_SCENE_QUERY_SYSTEM_EXT_H +#define PX_SCENE_QUERY_SYSTEM_EXT_H +/** \addtogroup extensions + @{ +*/ + +#include "PxSceneQuerySystem.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief Creates an external scene query system. + + An external SQ system is the part of a PxScene that deals with scene queries (SQ). This is usually taken care of + by an internal implementation inside PxScene, but it is also possible to re-route all SQ calls to an external + implementation, potentially opening the door to some customizations in behavior and features for advanced users. + + The following external SQ system is an example of how an implementation would look like. It re-uses much of the + same code as the internal version, but it could be re-implemented in a completely different way to match users' + specific needs. + + \param[in] desc Scene query descriptor + \param[in] contextID Context ID parameter, sent to the profiler + + \return An external SQ system instance + + @see PxSceneQuerySystem PxSceneQueryDesc + */ + PxSceneQuerySystem* PxCreateExternalSceneQuerySystem(const PxSceneQueryDesc& desc, PxU64 contextID); + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/extensions/PxSerialization.h b/Source/ThirdParty/PhysX/extensions/PxSerialization.h index 54e5cdd08..fca17512a 100644 --- a/Source/ThirdParty/PhysX/extensions/PxSerialization.h +++ b/Source/ThirdParty/PhysX/extensions/PxSerialization.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,11 +22,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - #ifndef PX_SERIALIZATION_H #define PX_SERIALIZATION_H /** \addtogroup extensions @@ -46,7 +44,7 @@ PX_BINARY_SERIAL_VERSION is used to version the PhysX binary data and meta data. The global unique identifier of the PhysX SDK needs to match the one in the data and meta data, otherwise they are considered incompatible. A 32 character wide GUID can be generated with https://www.guidgenerator.com/ for example. */ -#define PX_BINARY_SERIAL_VERSION "F193874828914B3A8AC4EFE75AED0247" +#define PX_BINARY_SERIAL_VERSION "0E16D844227B469DB23DA9C42CB4E624" #if !PX_DOXYGEN @@ -235,6 +233,8 @@ public: /** \brief Serializes a collection to a binary stream. + \deprecated Deterministic binary serialization is deprecated. PxSerialization::serializeCollectionToBinary might become deterministic in the future. + Convenience function that serializes a collection to a stream while rebasing memory addresses and handles to achieve a deterministic output, independent of the PhysX runtime environment the objects have been created in. @@ -245,11 +245,13 @@ public: @see PxSerialization::serializeCollectionToBinary, PxSerialization::dumpBinaryMetaData, PxBinaryConverter */ - static bool serializeCollectionToBinaryDeterministic(PxOutputStream& outputStream, PxCollection& collection, PxSerializationRegistry& sr, const PxCollection* externalRefs = NULL, bool exportNames = false); + PX_DEPRECATED static bool serializeCollectionToBinaryDeterministic(PxOutputStream& outputStream, PxCollection& collection, PxSerializationRegistry& sr, const PxCollection* externalRefs = NULL, bool exportNames = false); /** \brief Dumps the binary meta-data to a stream. + \deprecated Binary conversion and binary meta data are deprecated. + A meta-data file contains information about the SDK's internal classes and about custom user types ready for serialization. Such a file is needed to convert binary-serialized data from one platform to another (re-targeting). The converter needs meta-data files for the source and target platforms to perform conversions. @@ -261,14 +263,16 @@ public: @see PxOutputStream, PxSerializationRegistry */ - static void dumpBinaryMetaData(PxOutputStream& outputStream, PxSerializationRegistry& sr); + PX_DEPRECATED static void dumpBinaryMetaData(PxOutputStream& outputStream, PxSerializationRegistry& sr); /** \brief Creates binary converter for re-targeting binary-serialized data. + \deprecated Binary conversion and binary meta data are deprecated. + \return Binary converter instance. */ - static PxBinaryConverter* createBinaryConverter(); + PX_DEPRECATED static PxBinaryConverter* createBinaryConverter(); /** \brief Creates an application managed registry for serialization. diff --git a/Source/ThirdParty/PhysX/extensions/PxShapeExt.h b/Source/ThirdParty/PhysX/extensions/PxShapeExt.h index ce4440a8a..e0c059d4e 100644 --- a/Source/ThirdParty/PhysX/extensions/PxShapeExt.h +++ b/Source/ThirdParty/PhysX/extensions/PxShapeExt.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_EXTENSIONS_SHAPE_H -#define PX_PHYSICS_EXTENSIONS_SHAPE_H +#ifndef PX_SHAPE_EXT_H +#define PX_SHAPE_EXT_H /** \addtogroup extensions @{ */ @@ -39,6 +37,7 @@ #include "PxShape.h" #include "PxRigidActor.h" #include "geometry/PxGeometryQuery.h" +#include "PxQueryReport.h" #if !PX_DOXYGEN namespace physx @@ -87,7 +86,7 @@ public: PxU32 maxHits, PxRaycastHit* rayHits) { return PxGeometryQuery::raycast( - rayOrigin, rayDir, shape.getGeometry().any(), getGlobalPose(shape, actor), maxDist, hitFlags, maxHits, rayHits); + rayOrigin, rayDir, shape.getGeometry(), getGlobalPose(shape, actor), maxDist, hitFlags, maxHits, rayHits); } /** @@ -104,7 +103,7 @@ public: static PX_INLINE bool overlap(const PxShape& shape, const PxRigidActor& actor, const PxGeometry& otherGeom, const PxTransform& otherGeomPose) { - return PxGeometryQuery::overlap(shape.getGeometry().any(), getGlobalPose(shape, actor), otherGeom, otherGeomPose); + return PxGeometryQuery::overlap(shape.getGeometry(), getGlobalPose(shape, actor), otherGeom, otherGeomPose); } /** @@ -128,7 +127,7 @@ public: const PxVec3& unitDir, const PxReal distance, const PxGeometry& otherGeom, const PxTransform& otherGeomPose, PxSweepHit& sweepHit, PxHitFlags hitFlags) { - return PxGeometryQuery::sweep(unitDir, distance, otherGeom, otherGeomPose, shape.getGeometry().any(), getGlobalPose(shape, actor), sweepHit, hitFlags); + return PxGeometryQuery::sweep(unitDir, distance, otherGeom, otherGeomPose, shape.getGeometry(), getGlobalPose(shape, actor), sweepHit, hitFlags); } @@ -145,7 +144,7 @@ public: */ static PX_INLINE PxBounds3 getWorldBounds(const PxShape& shape, const PxRigidActor& actor, float inflation=1.01f) { - return PxGeometryQuery::getWorldBounds(shape.getGeometry().any(), getGlobalPose(shape, actor), inflation); + return PxGeometryQuery::getWorldBounds(shape.getGeometry(), getGlobalPose(shape, actor), inflation); } }; diff --git a/Source/ThirdParty/PhysX/extensions/PxSimpleFactory.h b/Source/ThirdParty/PhysX/extensions/PxSimpleFactory.h index d6e423dc3..ac21af09f 100644 --- a/Source/ThirdParty/PhysX/extensions/PxSimpleFactory.h +++ b/Source/ThirdParty/PhysX/extensions/PxSimpleFactory.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_EXTENSIONS_SIMPLE_FACTORY_H -#define PX_PHYSICS_EXTENSIONS_SIMPLE_FACTORY_H +#ifndef PX_SIMPLE_FACTORY_H +#define PX_SIMPLE_FACTORY_H /** \addtogroup extensions @{ */ @@ -51,7 +49,6 @@ namespace physx class PxGeometry; class PxShape; - /** \brief simple method to create a PxRigidDynamic actor with a single PxShape. \param[in] sdk the PxPhysics object @@ -66,7 +63,6 @@ namespace physx @see PxRigidDynamic PxShapeFlag */ - PxRigidDynamic* PxCreateDynamic(PxPhysics& sdk, const PxTransform& transform, const PxGeometry& geometry, @@ -74,7 +70,6 @@ PxRigidDynamic* PxCreateDynamic(PxPhysics& sdk, PxReal density, const PxTransform& shapeOffset = PxTransform(PxIdentity)); - /** \brief simple method to create a PxRigidDynamic actor with a single PxShape. \param[in] sdk the PxPhysics object @@ -87,13 +82,11 @@ PxRigidDynamic* PxCreateDynamic(PxPhysics& sdk, @see PxRigidDynamic PxShapeFlag */ - PxRigidDynamic* PxCreateDynamic(PxPhysics& sdk, const PxTransform& transform, PxShape& shape, PxReal density); - /** \brief simple method to create a kinematic PxRigidDynamic actor with a single PxShape. \param[in] sdk the PxPhysics object @@ -113,7 +106,6 @@ PxRigidDynamic* PxCreateDynamic(PxPhysics& sdk, @see PxRigidDynamic PxShapeFlag */ - PxRigidDynamic* PxCreateKinematic(PxPhysics& sdk, const PxTransform& transform, const PxGeometry& geometry, @@ -121,7 +113,6 @@ PxRigidDynamic* PxCreateKinematic(PxPhysics& sdk, PxReal density, const PxTransform& shapeOffset = PxTransform(PxIdentity)); - /** \brief simple method to create a kinematic PxRigidDynamic actor with a single PxShape. \param[in] sdk the PxPhysics object @@ -139,13 +130,11 @@ PxRigidDynamic* PxCreateKinematic(PxPhysics& sdk, @see PxRigidDynamic PxShapeFlag */ - PxRigidDynamic* PxCreateKinematic(PxPhysics& sdk, const PxTransform& transform, PxShape& shape, PxReal density); - /** \brief simple method to create a PxRigidStatic actor with a single PxShape. \param[in] sdk the PxPhysics object @@ -158,14 +147,12 @@ PxRigidDynamic* PxCreateKinematic(PxPhysics& sdk, @see PxRigidStatic */ - PxRigidStatic* PxCreateStatic(PxPhysics& sdk, const PxTransform& transform, const PxGeometry& geometry, PxMaterial& material, const PxTransform& shapeOffset = PxTransform(PxIdentity)); - /** \brief simple method to create a PxRigidStatic actor with a single PxShape. \param[in] sdk the PxPhysics object @@ -176,28 +163,10 @@ PxRigidStatic* PxCreateStatic(PxPhysics& sdk, @see PxRigidStatic */ - PxRigidStatic* PxCreateStatic(PxPhysics& sdk, const PxTransform& transform, PxShape& shape); - -/** \brief simple method to create a PxRigidStatic actor with a single PxShape. - - \param[in] sdk the PxPhysics object - \param[in] transform the global pose of the new object - \param[in] shape the new object's shape - - \return a new static actor, or NULL if it could not be constructed - - @see PxRigidStatic -*/ - -PxRigidStatic* PxCreateStatic(PxPhysics& sdk, - const PxTransform& transform, - PxShape& shape); - - /** \brief create a shape by copying attributes from another shape @@ -210,6 +179,8 @@ The function clones a PxShape. The following properties are copied: - rest offset - simulation filter data - query filter data +- torsional patch radius +- minimum torsional patch radius The following are not copied and retain their default values: - name @@ -220,15 +191,11 @@ The following are not copied and retain their default values: \param[in] isExclusive whether the new shape should be an exclusive or shared shape. \return the newly-created rigid static - */ - PxShape* PxCloneShape(PxPhysics& physicsSDK, const PxShape& shape, bool isExclusive); - - /** \brief create a static body by copying attributes from another rigid actor @@ -236,6 +203,7 @@ The function clones a PxRigidDynamic or PxRigidStatic as a PxRigidStatic. A unif - shapes - actor flags - owner client and client behavior bits +- dominance group The following are not copied and retain their default values: - name @@ -250,23 +218,21 @@ The following are not copied and retain their default values: \param[in] transform the transform of the new static. \return the newly-created rigid static - */ - PxRigidStatic* PxCloneStatic(PxPhysics& physicsSDK, const PxTransform& transform, const PxRigidActor& actor); - /** \brief create a dynamic body by copying attributes from an existing body The following properties are copied: - shapes -- actor flags and rigidDynamic flags +- actor flags, rigidDynamic flags and rigidDynamic lock flags - mass, moment of inertia, and center of mass frame - linear and angular velocity - linear and angular damping +- maximum linear velocity - maximum angular velocity - position and velocity solver iterations - maximum depenetration velocity @@ -275,6 +241,7 @@ The following properties are copied: - dominance group - owner client and client behavior bits - name pointer +- kinematic target The following are not copied and retain their default values: - name @@ -290,14 +257,11 @@ The following are not copied and retain their default values: \param[in] transform the transform of the new dynamic \return the newly-created rigid static - */ - PxRigidDynamic* PxCloneDynamic(PxPhysics& physicsSDK, const PxTransform& transform, const PxRigidDynamic& body); - /** \brief create a plane actor. The plane equation is n.x + d = 0 \param[in] sdk the PxPhysics object @@ -308,12 +272,10 @@ PxRigidDynamic* PxCloneDynamic(PxPhysics& physicsSDK, @see PxRigidStatic */ - PxRigidStatic* PxCreatePlane(PxPhysics& sdk, const PxPlane& plane, PxMaterial& material); - /** \brief scale a rigid actor by a uniform scale @@ -325,10 +287,8 @@ center of mass is linearly scaled, the mass is multiplied by the cube of the sca \param[in] scale the scale by which to multiply the actor. Must be >0. \param[in] scaleMassProps whether to scale the mass properties */ - void PxScaleRigidActor(PxRigidActor& actor, PxReal scale, bool scaleMassProps = true); - #if !PX_DOXYGEN } // namespace physx #endif diff --git a/Source/ThirdParty/PhysX/extensions/PxSmoothNormals.h b/Source/ThirdParty/PhysX/extensions/PxSmoothNormals.h index 21d0d47f3..7b5285015 100644 --- a/Source/ThirdParty/PhysX/extensions/PxSmoothNormals.h +++ b/Source/ThirdParty/PhysX/extensions/PxSmoothNormals.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_EXTENSIONS_SMOOTH_NORMALS_H -#define PX_PHYSICS_EXTENSIONS_SMOOTH_NORMALS_H +#ifndef PX_SMOOTH_NORMALS_H +#define PX_SMOOTH_NORMALS_H /** \addtogroup extensions @{ */ diff --git a/Source/ThirdParty/PhysX/extensions/PxSoftBodyExt.h b/Source/ThirdParty/PhysX/extensions/PxSoftBodyExt.h new file mode 100644 index 000000000..ffc1c3093 --- /dev/null +++ b/Source/ThirdParty/PhysX/extensions/PxSoftBodyExt.h @@ -0,0 +1,197 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_SOFT_BODY_EXT_H +#define PX_SOFT_BODY_EXT_H +/** \addtogroup extensions + @{ +*/ + +#include "foundation/PxTransform.h" +#include "PxSoftBody.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +struct PxCookingParams; +class PxSimpleTriangleMesh; +class PxInsertionCallback; +class PxSoftBodyMesh; + +/** +\brief utility functions for use with PxSoftBody and subclasses +*/ +class PxSoftBodyExt +{ +public: + /** + \brief Computes the SoftBody's vertex masses from the provided density and the volume of the tetrahedra + + The buffers affected by this operation can be obtained from the SoftBody using the methods getSimPositionInvMassCPU() and getSimVelocityInvMassCPU() + + The inverse mass is stored in the 4th component (the first three components are x, y, z coordinates) of the simulation mesh's position and velocity buffer. + Performance optimizations are the reason why the mass inverse is stored in two locations. + + \param[in] softBody The soft body which will get its mass updated + \param[in] density The density to used to calculate the mass from the body's volume + \param[in] maxInvMassRatio Maximum allowed ratio defined as max(vertexMasses) / min(vertexMasses) where vertexMasses is a list of float values with a mass for every vertex in the simulation mesh + + @see PxSoftBody PxSoftBody::getSimPositionInvMassCPU() PxSoftBody::getSimVelocityInvMassCPU() + */ + static void updateMass(PxSoftBody& softBody, const PxReal density, const PxReal maxInvMassRatio); + + /** + \brief Computes the SoftBody's vertex masses such that the sum of all masses is equal to the provided mass + + The buffers affected by this operation can be obtained from the SoftBody using the methods getSimPositionInvMassCPU() and getSimVelocityInvMassCPU() + + The inverse mass is stored in the 4th component (the first three components are x, y, z coordinates) of the simulation mesh's position and velocity buffer. + Performance optimizations are the reason why the mass inverse is stored in two locations. + + \param[in] softBody The soft body which will get its mass updated + \param[in] mass The SoftBody's mass + \param[in] maxInvMassRatio Maximum allowed ratio defined as max(vertexMasses) / min(vertexMasses) where vertexMasses is a list of float values with a mass for every vertex in the simulation mesh + + @see PxSoftBody PxSoftBody::getSimPositionInvMassCPU() PxSoftBody::getSimVelocityInvMassCPU() + */ + static void setMass(PxSoftBody& softBody, const PxReal mass, const PxReal maxInvMassRatio); + + /** + \brief Transforms a SoftBody + + The buffers affected by this operation can be obtained from the SoftBody using the methods getSimPositionInvMassCPU() and getSimVelocityInvMassCPU() + + Applies a transformation to the simulation mesh's positions an velocities. Velocities only get rotated and scaled (translation is not applicable to direction vectors). + It does not modify the body's mass. + If the method is called multiple times, the transformation will compound with the ones previously applied. + + \param[in] softBody The soft body which is transformed + \param[in] transform The transform to apply + \param[in] scale A scaling factor + + @see PxSoftBody PxSoftBody::getSimPositionInvMassCPU() PxSoftBody::getSimVelocityInvMassCPU() + */ + static void transform(PxSoftBody& softBody, const PxTransform& transform, const PxReal scale); + + /** + \brief Updates the collision mesh's vertex positions to match the simulation mesh's transformation and scale. + + The buffer affected by this operation can be obtained from the SoftBody using the method getPositionInvMassCPU() + + \param[in] softBody The soft body which will get its collision mesh vertices updated + + @see PxSoftBody PxSoftBody::getPositionInvMassCPU() + */ + static void updateEmbeddedCollisionMesh(PxSoftBody& softBody); + + /** + \brief Uploads prepared SoftBody data to the GPU. It ensures that the embedded collision mesh matches the simulation mesh's transformation and scale. + + \param[in] softBody The soft body which will perform the data upload + \param[in] flags Specifies which buffers the data transfer should include + \param[in] flush If set to true, the upload will get processed immediately, otherwise it will take place before the data is needed for calculations on the GPU + + @see PxSoftBody + */ + static void commit(PxSoftBody& softBody, PxSoftBodyDataFlags flags, bool flush = false); + + /** + \brief Creates a full SoftBody mesh matching the shape given as input. Uses a voxel mesh for FEM simulation and a surface-matching mesh for collision detection. + + \param[in] params Cooking params instance required for mesh processing + \param[in] surfaceMesh Input triangle mesh that represents the surface of the SoftBody + \param[in] numVoxelsAlongLongestAABBAxis The number of voxels along the longest bounding box axis + \param[in] insertionCallback The insertion interface from PxPhysics + \param[in] validate If set to true the input triangle mesh will get analyzed to find possible deficiencies + \return SoftBody mesh if cooking was successful, NULL otherwise + @see PxSoftBodyMesh + */ + static PxSoftBodyMesh* createSoftBodyMesh(const PxCookingParams& params, const PxSimpleTriangleMesh& surfaceMesh, PxU32 numVoxelsAlongLongestAABBAxis, PxInsertionCallback& insertionCallback, const bool validate = true); + + /** + \brief Creates a full SoftBody mesh matching the shape given as input. Uses the same surface-matching mesh for collision detection and FEM simulation. + + \param[in] params Cooking params instance required for mesh processing + \param[in] surfaceMesh Input triangle mesh that represents the surface of the SoftBody + \param[in] insertionCallback The insertion interface from PxPhysics + \param[in] maxWeightRatioInTet Upper limit for the ratio of node weights that are adjacent to the same tetrahedron. The closer to one (while remaining larger than one), the more stable the simulation. + \param[in] validate If set to true the input triangle mesh will get analyzed to find possible deficiencies + \return SoftBody mesh if cooking was successful, NULL otherwise + @see PxSoftBodyMesh + */ + static PxSoftBodyMesh* createSoftBodyMeshNoVoxels(const PxCookingParams& params, const PxSimpleTriangleMesh& surfaceMesh, PxInsertionCallback& insertionCallback, PxReal maxWeightRatioInTet = 1.5f, const bool validate = true); + + + /** + \brief Creates a SoftBody instance from a SoftBody mesh + + \param[in] softBodyMesh The SoftBody mesh + \param[in] transform The transform that defines initial position and orientation of the SoftBody + \param[in] material The material + \param[in] cudaContextManager A cuda context manager + \param[in] density The density used to compute the mass properties + \param[in] solverIterationCount The number of iterations the solver should apply during simulation + \param[in] femParams Additional parameters to specify e. g. damping + \param[in] scale The scaling of the SoftBody + \return SoftBody instance + @see PxSoftBodyMesh, PxSoftBody + */ + static PxSoftBody* createSoftBodyFromMesh(PxSoftBodyMesh* softBodyMesh, const PxTransform& transform, + const PxFEMSoftBodyMaterial& material, PxCudaContextManager& cudaContextManager, PxReal density = 100.0f, PxU32 solverIterationCount = 30, + const PxFEMParameters& femParams = PxFEMParameters(), PxReal scale = 1.0f); + + + /** + \brief Creates a SoftBody instance with a box shape + + \param[in] transform The transform that defines initial position and orientation of the SoftBody + \param[in] boxDimensions The dimensions (side lengths) of the box shape + \param[in] material The material + \param[in] cudaContextManager A cuda context manager + \param[in] maxEdgeLength The maximal length of a triangle edge. Subdivision will get applied until the edge length criteria is matched. -1 means no subdivision is applied. + \param[in] density The density used to compute the mass properties + \param[in] solverIterationCount The number of iterations the solver should apply during simulation + \param[in] femParams Additional parameters to specify e. g. damping + \param[in] numVoxelsAlongLongestAABBAxis The number of voxels to use for the simulation mesh along the longest bounding box dimension + \param[in] scale The scaling of the SoftBody + \return SoftBody instance + @see PxSoftBodyMesh, PxSoftBody + */ + static PxSoftBody* createSoftBodyBox(const PxTransform& transform, const PxVec3& boxDimensions, const PxFEMSoftBodyMaterial& material, + PxCudaContextManager& cudaContextManager, PxReal maxEdgeLength = -1.0f, PxReal density = 100.0f, PxU32 solverIterationCount = 30, + const PxFEMParameters& femParams = PxFEMParameters(), PxU32 numVoxelsAlongLongestAABBAxis = 10, PxReal scale = 1.0f); +}; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/extensions/PxSphericalJoint.h b/Source/ThirdParty/PhysX/extensions/PxSphericalJoint.h index 188ebfc41..bee05853f 100644 --- a/Source/ThirdParty/PhysX/extensions/PxSphericalJoint.h +++ b/Source/ThirdParty/PhysX/extensions/PxSphericalJoint.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_SPHERICALJOINT_H -#define PX_SPHERICALJOINT_H +#ifndef PX_SPHERICAL_JOINT_H +#define PX_SPHERICAL_JOINT_H /** \addtogroup extensions @{ */ @@ -168,8 +167,10 @@ public: \param[in] tolerance the linear tolerance threshold @see getProjectionLinearTolerance() PxJoint::setConstraintFlags() PxConstraintFlag::ePROJECTION + + @deprecated */ - virtual void setProjectionLinearTolerance(PxReal tolerance) = 0; + PX_DEPRECATED virtual void setProjectionLinearTolerance(PxReal tolerance) = 0; /** \brief Get the linear tolerance threshold for projection. @@ -177,8 +178,10 @@ public: \return the linear tolerance threshold @see setProjectionLinearTolerance() + + @deprecated */ - virtual PxReal getProjectionLinearTolerance() const = 0; + PX_DEPRECATED virtual PxReal getProjectionLinearTolerance() const = 0; /** \brief Returns string name of PxSphericalJoint, used for serialization diff --git a/Source/ThirdParty/PhysX/extensions/PxStringTableExt.h b/Source/ThirdParty/PhysX/extensions/PxStringTableExt.h index a40f1d33b..b4fdb1cf8 100644 --- a/Source/ThirdParty/PhysX/extensions/PxStringTableExt.h +++ b/Source/ThirdParty/PhysX/extensions/PxStringTableExt.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,11 +22,10 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - #ifndef PX_STRING_TABLE_EXT_H #define PX_STRING_TABLE_EXT_H #include "foundation/Px.h" diff --git a/Source/ThirdParty/PhysX/extensions/PxTetMakerExt.h b/Source/ThirdParty/PhysX/extensions/PxTetMakerExt.h new file mode 100644 index 000000000..e5d8dd51b --- /dev/null +++ b/Source/ThirdParty/PhysX/extensions/PxTetMakerExt.h @@ -0,0 +1,188 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_TETMAKER_EXT_H +#define PX_TETMAKER_EXT_H +/** \addtogroup extensions + @{ +*/ + +#include "foundation/PxSimpleTypes.h" +#include "foundation/PxVec3.h" +#include "common/PxCoreUtilityTypes.h" +#include "foundation/PxArray.h" +#include "PxTriangleMeshAnalysisResult.h" +#include "PxTetrahedronMeshAnalysisResult.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +class PxTriangleMesh; +class PxTetrahedronMeshDesc; +class PxSoftBodySimulationDataDesc; +struct PxTetMakerData; +class PxSimpleTriangleMesh; + +/** +\brief Provides functionality to create a tetrahedral mesh from a triangle mesh. +*/ +class PxTetMaker +{ +public: + + /** + \brief Create conforming tetrahedron mesh using TetMaker + + \param[in] triangleMesh The description of the triangle mesh including vertices and indices + \param[out] outVertices The vertices to store the conforming tetrahedral mesh + \param[out] outTetIndices The indices to store the conforming tetrahedral mesh + \param[in] validate If set to true the input triangle mesh will get analyzed to find possible deficiencies + \param[in] volumeThreshold Tetrahedra with a volume smaller than the specified threshold will be removed from the mesh + \return True if success + */ + static bool createConformingTetrahedronMesh(const PxSimpleTriangleMesh& triangleMesh, physx::PxArray& outVertices, physx::PxArray& outTetIndices, + const bool validate = true, PxReal volumeThreshold = 0.0f); + + /** + \brief Create voxel-based tetrahedron mesh using TetMaker + + \param[in] tetMesh The description of the tetrahedral mesh including vertices and indices + \param[in] numVoxelsAlongLongestBoundingBoxAxis The number of voxels along the longest bounding box axis + \param[out] outVertices The vertices to store the voxel-based tetrahedral mesh + \param[out] outTetIndices The indices to store the voxel-based tetrahedral mesh + \param[out] inputPointToOutputTetIndex Buffer with the size of nbTetVerts that contains the tetrahedron index containing the input point with the same index + \param[in] anchorNodeIndices Some input vertices may not be referenced by any tetrahedron. They can be mapped to another input vertex that is used by a tetrahedron to support embedding of additional points. + \return True if success + */ + static bool createVoxelTetrahedronMesh(const PxTetrahedronMeshDesc& tetMesh, const PxU32 numVoxelsAlongLongestBoundingBoxAxis, + physx::PxArray& outVertices, physx::PxArray& outTetIndices, PxI32* inputPointToOutputTetIndex = NULL, const PxU32* anchorNodeIndices = NULL); + + /** + \brief Create voxel-based tetrahedron mesh using TetMaker + + \param[in] tetMesh The description of the tetrahedral mesh including vertices and indices + \param[in] voxelEdgeLength The edge length of a voxel.Can be adjusted slightly such that a multiple of it matches the input points' bounding box size + \param[out] outVertices The vertices to store the voxel-based tetrahedral mesh + \param[out] outTetIndices The indices to store the voxel-based tetrahedral mesh + \param[out] inputPointToOutputTetIndex Buffer with the size of nbTetVerts that contains the tetrahedron index containing the input point with the same index + \param[in] anchorNodeIndices Some input vertices may not be referenced by any tetrahedron. They can be mapped to another input vertex that is used by a tetrahedron to support embedding of additional points. + \return True if success + */ + static bool createVoxelTetrahedronMeshFromEdgeLength(const PxTetrahedronMeshDesc& tetMesh, const PxReal voxelEdgeLength, + physx::PxArray& outVertices, physx::PxArray& outTetIndices, PxI32* inputPointToOutputTetIndex = NULL, const PxU32* anchorNodeIndices = NULL); + + /** + \brief Analyzes the triangle mesh to get a report about deficiencies. Some deficiencies can be handled by the tetmesher, others cannot. + + \param[in] triangleMesh The description of the triangle mesh including vertices and indices + \param[in] minVolumeThreshold Minimum volume the mesh must have such that no volume warning is generated + \param[in] minTriangleAngleRadians Minimum angle allowed for triangles such that no angle warning is generated + \return Flags that describe the triangle mesh's deficiencies + */ + static PxTriangleMeshAnalysisResults validateTriangleMesh(const PxSimpleTriangleMesh& triangleMesh, const PxReal minVolumeThreshold = 1e-6f, const PxReal minTriangleAngleRadians = 10.0f*3.1415926535898f / 180.0f); + + /** + \brief Analyzes the tetrahedron mesh to get a report about deficiencies. Some deficiencies can be handled by the softbody cooker, others cannot. + + \param[in] points The mesh's points + \param[in] tetrahedra The mesh's tetrahedra (index buffer) + \param[in] minTetVolumeThreshold Minimum volume every tetrahedron in the mesh must have such that no volume warning is generated + \return Flags that describe the tetrahedron mesh's deficiencies + */ + static PxTetrahedronMeshAnalysisResults validateTetrahedronMesh(const PxBoundedData& points, const PxBoundedData& tetrahedra, const PxReal minTetVolumeThreshold = 1e-8f); + + /** + \brief Simplifies (decimates) a triangle mesh using quadric simplification. + + \param[in] inputVertices The vertices of the input triangle mesh + \param[in] inputIndices The indices of the input triangle mesh of the form (id0, id1, id2), (id0, id1, id2), .. + \param[in] targetTriangleCount Desired number of triangles in the output mesh + \param[in] maximalEdgeLength Edges below this length will not be collapsed. A value of zero means there is no limit. + \param[out] outputVertices The vertices of the output (decimated) triangle mesh + \param[out] outputIndices The indices of the output (decimated) triangle mesh of the form (id0, id1, id2), (id0, id1, id2), .. + \param[out] vertexMap Optional parameter which returns the mapping from input to output vertices. Note that multiple input vertices are typically collapsed into the same output vertex. + \param[in] edgeLengthCostWeight Factor to scale influence of edge length when prioritizing edge collapses. Has no effect if set to zero. + \param[in] flatnessDetectionThreshold Threshold used to detect edges in flat regions and to improve the placement of the collapsed point. If set to a large value it will have no effect. + */ + static void simplifyTriangleMesh(const PxArray& inputVertices, const PxArray&inputIndices, int targetTriangleCount, PxF32 maximalEdgeLength, + PxArray& outputVertices, PxArray& outputIndices, + PxArray *vertexMap = NULL, PxReal edgeLengthCostWeight = 0.1f, PxReal flatnessDetectionThreshold = 0.01f); + + /** + \brief Creates a new mesh from a given mesh. The input mesh is first voxelized. The new surface is created from the voxel surface and subsequent projection to the original mesh. + + \param[in] inputVertices The vertices of the input triangle mesh + \param[in] inputIndices The indices of the input triangle mesh of the form (id0, id1, id2), (id0, id1, id2), .. + \param[in] gridResolution Size of the voxel grid (number of voxels along the longest dimension) + \param[out] outputVertices The vertices of the output (decimated) triangle mesh + \param[out] outputIndices The indices of the output (decimated) triangle mesh of the form (id0, id1, id2), (id0, id1, id2), .. + \param[out] vertexMap Optional parameter which returns a mapping from input to output vertices. Since the meshes are independent, the mapping returns an output vertex that is topologically close to the input vertex. + */ + static void remeshTriangleMesh(const PxArray& inputVertices, const PxArray&inputIndices, int gridResolution, + PxArray& outputVertices, PxArray& outputIndices, + PxArray *vertexMap = NULL); + + /** + \brief Creates a tetrahedral mesh using an octree. + + \param[in] inputVertices The vertices of the input triangle mesh + \param[in] inputIndices The indices of the input triangle mesh of the form (id0, id1, id2), (id0, id1, id2), .. + \param[in] useTreeNodes Using the nodes of the octree as tetrahedral vertices + \param[out] outputVertices The vertices of the output tetrahedral mesh + \param[out] outputIndices The indices of the output tetrahedral mesh of the form (id0, id1, id2, id3), (id0, id1, id2, id3), .. + \param[in] volumeThreshold Tetrahedra with a volume smaller than the specified threshold will be removed from the mesh + */ + static void createTreeBasedTetrahedralMesh(const PxArray& inputVertices, const PxArray&inputIndices, + bool useTreeNodes, PxArray& outputVertices, PxArray& outputIndices, PxReal volumeThreshold = 0.0f); + + /** + \brief Creates a tetrahedral mesh by relaxing a voxel mesh around the input mesh + + \param[in] inputVertices The vertices of the input triangle mesh + \param[in] inputIndices The indices of the input triangle mesh of the form (id0, id1, id2), (id0, id1, id2), .. + \param[out] outputVertices The vertices of the output tetrahedral mesh + \param[out] outputIndices The indices of the output tetrahedral mesh of the form (id0, id1, id2, id3), (id0, id1, id2, id3), .. + \param[in] resolution The grid spacing is computed as the diagonal of the bounding box of the input mesh divided by the resolution. + \param[in] numRelaxationIterations Number of iterations to pull the tetrahedral mesh towards the input mesh + \param[in] relMinTetVolume Constrains the volumes of the tetrahedra to stay abobe relMinTetvolume times the tetrahedron's rest volume. + */ + static void createRelaxedVoxelTetrahedralMesh(const PxArray& inputVertices, const PxArray&inputIndices, + PxArray& outputVertices, PxArray& outputIndices, + PxI32 resolution, PxI32 numRelaxationIterations = 5, PxF32 relMinTetVolume = 0.05f); + +}; + +#if !PX_DOXYGEN +} +#endif + +/** @} */ +#endif + diff --git a/Source/ThirdParty/PhysX/extensions/PxTetrahedronMeshAnalysisResult.h b/Source/ThirdParty/PhysX/extensions/PxTetrahedronMeshAnalysisResult.h new file mode 100644 index 000000000..be88af9e7 --- /dev/null +++ b/Source/ThirdParty/PhysX/extensions/PxTetrahedronMeshAnalysisResult.h @@ -0,0 +1,61 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. + +#ifndef PX_TETRAHEDRON_MESH_ANALYSIS_RESULT_H +#define PX_TETRAHEDRON_MESH_ANALYSIS_RESULT_H + + +#include "PxPhysXConfig.h" +#include "foundation/PxFlags.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief These flags indicate what kind of deficiencies a tetrahedron mesh has and describe if the mesh is considered ok, problematic or invalid for softbody cooking + */ + class PxTetrahedronMeshAnalysisResult + { + public: + enum Enum + { + eVALID = 0, + eDEGENERATE_TETRAHEDRON = (1 << 0), //!< At least one tetrahedron has zero or negative volume. This can happen when the input triangle mesh contains triangles that are very elongated, e. g. one edge is a lot shorther than the other two. + + eMESH_IS_PROBLEMATIC = (1 << 1), //!< flag is set if the mesh is categorized as problematic + eMESH_IS_INVALID = (1 << 2) //!< flag is set if the mesh is categorized as invalid + }; + }; + typedef PxFlags PxTetrahedronMeshAnalysisResults; + PX_FLAGS_OPERATORS(PxTetrahedronMeshAnalysisResult::Enum, PxU32) + +#if !PX_DOXYGEN +} +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/extensions/PxTetrahedronMeshExt.h b/Source/ThirdParty/PhysX/extensions/PxTetrahedronMeshExt.h new file mode 100644 index 000000000..ca24c4415 --- /dev/null +++ b/Source/ThirdParty/PhysX/extensions/PxTetrahedronMeshExt.h @@ -0,0 +1,100 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_TETRAHEDRON_MESH_EXT_H +#define PX_TETRAHEDRON_MESH_EXT_H +/** \addtogroup extensions + @{ +*/ + +#include "foundation/PxVec3.h" +#include "foundation/PxArray.h" + + +#if !PX_DOXYGEN +namespace physx +{ +#endif + class PxTetrahedronMesh; + + /** + \brief utility functions for use with PxTetrahedronMesh and subclasses + */ + class PxTetrahedronMeshExt + { + public: + /** Returns the index of the tetrahedron that contains a point + + \param[in] mesh The tetmesh + \param[in] point The point to find the enclosing tetrahedron for + \param[in] bary The barycentric coordinates of the point inside the enclosing tetrahedron + \param[in] tolerance Tolerance value used classify points as inside if they lie exactly a tetrahedron's surface + \return The index of the tetrahedon containing the point, -1 if not tetrahedron contains the opoint + */ + static PxI32 findTetrahedronContainingPoint(const PxTetrahedronMesh* mesh, const PxVec3& point, PxVec4& bary, PxReal tolerance = 1e-6f); + + /** Returns the index of the tetrahedron closest to a point + + \param[in] mesh The tetmesh + \param[in] point The point to find the closest tetrahedron for + \param[in] bary The barycentric coordinates of the point in the tetrahedron + \return The index of the tetrahedon closest to the point + */ + static PxI32 findTetrahedronClosestToPoint(const PxTetrahedronMesh* mesh, const PxVec3& point, PxVec4& bary); + + /** Extracts the surface triangles of a tetmesh + + The extracted triangle's vertex indices point to the vertex buffer of the tetmesh. + + \param[in] tetrahedra The tetrahedra indices + \param[in] numTetrahedra The number of tetrahedra + \param[in] sixteenBitIndices If set to true, the tetrahedra indices are read as 16bit integers, otherwise 32bit integers are used + \param[in] surfaceTriangles The resulting surface triangles + \param[in] surfaceTriangleToTet Optional array to get the index of a tetrahedron that is adjacent to the surface triangle with the corresponding index + \param[in] flipTriangleOrientation Reverses the orientation of the ouput triangles + */ + static void extractTetMeshSurface(const void* tetrahedra, PxU32 numTetrahedra, bool sixteenBitIndices, PxArray& surfaceTriangles, PxArray* surfaceTriangleToTet = NULL, bool flipTriangleOrientation = false); + + /** Extracts the surface triangles of a tetmesh + + The extracted triangle's vertex indices point to the vertex buffer of the tetmesh. + + \param[in] mesh The mesh from which the surface shall be computed + \param[in] surfaceTriangles The resulting surface triangles + \param[in] surfaceTriangleToTet Optional array to get the index of a tetrahedron that is adjacent to the surface triangle with the corresponding index + \param[in] flipTriangleOrientation Reverses the orientation of the ouput triangles + */ + static void extractTetMeshSurface(const PxTetrahedronMesh* mesh, PxArray& surfaceTriangles, PxArray* surfaceTriangleToTet = NULL, bool flipTriangleOrientation = false); + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/extensions/PxTriangleMeshAnalysisResult.h b/Source/ThirdParty/PhysX/extensions/PxTriangleMeshAnalysisResult.h new file mode 100644 index 000000000..e84bcf95c --- /dev/null +++ b/Source/ThirdParty/PhysX/extensions/PxTriangleMeshAnalysisResult.h @@ -0,0 +1,69 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. + +#ifndef PX_TRIANGLE_MESH_ANALYSIS_RESULT_H +#define PX_TRIANGLE_MESH_ANALYSIS_RESULT_H + + +#include "PxPhysXConfig.h" +#include "foundation/PxFlags.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief These flags indicate what kind of deficiencies a triangle mesh has and describe if the mesh is considered ok, problematic or invalid for tetmeshing + */ + class PxTriangleMeshAnalysisResult + { + public: + enum Enum + { + eVALID = 0, + eZERO_VOLUME = (1 << 0), //!< invalid: Flat mesh without meaningful amount of volume - cannot be meshed since a tetmesh is volumetric + eOPEN_BOUNDARIES = (1 << 1), //!< problematic: Open boundary means that the mesh is not watertight and that there are holes. The mesher can fill holes but the surface might have an unexpected shape where the hole was. + eSELF_INTERSECTIONS = (1 << 2), //!< problematic: The surface of the resulting mesh won't match exactly at locations of self-intersections. The tetmesh might be connected at self-intersections even if the input triangle mesh is not + eINCONSISTENT_TRIANGLE_ORIENTATION = (1 << 3), //!< invalid: It is not possible to distinguish what is inside and outside of the mesh. If there are no self-intersections and not edges shared by more than two triangles, a call to makeTriOrientationConsistent can fix this. Without fixing it, the output from the tetmesher will be incorrect + eCONTAINS_ACUTE_ANGLED_TRIANGLES = (1 << 4), //!< problematic: An ideal mesh for a softbody has triangles with similar angles and evenly distributed vertices. Acute angles can be handled but might lead to a poor quality tetmesh. + eEDGE_SHARED_BY_MORE_THAN_TWO_TRIANGLES = (1 << 5), //!< problematic: Border case of a self-intersecting mesh. The tetmesh might not match the surace exactly near such edges. + eCONTAINS_DUPLICATE_POINTS = (1 << 6), //!< ok: Duplicate points can be handled by the mesher without problems. The resulting tetmesh will only make use of first unique point that is found, duplicate points will get mapped to that unique point in the tetmesh. Therefore the tetmesh can contain points that are not accessed by a tet. + eCONTAINS_INVALID_POINTS = (1 << 7), //!< invalid: Points contain NAN, infinity or similar values that will lead to an invalid mesh + eREQUIRES_32BIT_INDEX_BUFFER = (1 << 8), //!< invalid: Mesh contains more indices than a 16bit index buffer can address + + eMESH_IS_PROBLEMATIC = (1 << 9), //!< flag is set if the mesh is categorized as problematic + eMESH_IS_INVALID = (1 << 10) //!< flag is set if the mesh is categorized as invalid + }; + }; + typedef PxFlags PxTriangleMeshAnalysisResults; + PX_FLAGS_OPERATORS(PxTriangleMeshAnalysisResult::Enum, PxU32) + +#if !PX_DOXYGEN +} +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/extensions/PxTriangleMeshExt.h b/Source/ThirdParty/PhysX/extensions/PxTriangleMeshExt.h index 8bee28db9..c5de6966d 100644 --- a/Source/ThirdParty/PhysX/extensions/PxTriangleMeshExt.h +++ b/Source/ThirdParty/PhysX/extensions/PxTriangleMeshExt.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,19 +22,19 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_EXTENSIONS_TRIANGLE_MESH_H -#define PX_PHYSICS_EXTENSIONS_TRIANGLE_MESH_H +#ifndef PX_TRIANGLE_MESH_EXT_H +#define PX_TRIANGLE_MESH_EXT_H /** \addtogroup extensions @{ */ #include "PxPhysXConfig.h" #include "common/PxPhysXCommonConfig.h" +#include "foundation/PxArray.h" #if !PX_DOXYGEN namespace physx @@ -43,6 +42,7 @@ namespace physx #endif class PxGeometry; +class PxTriangleMesh; class PxTriangleMeshGeometry; class PxHeightFieldGeometry; @@ -180,6 +180,15 @@ class PxHeightFieldGeometry; PxU32 maxIter, PxU32* usedIter = NULL); + /** + \brief Extracts an isosurface from the SDF of a mesh if it the SDF is available. + + \param[in] triangleMesh The triangle mesh + \param[out] isosurfaceVertices The vertices of the extracted isosurface + \param[out] isosurfaceTriangleIndices The triangles of the extracted isosurface + */ + bool PxExtractIsosurfaceFromSDF(const PxTriangleMesh& triangleMesh, PxArray& isosurfaceVertices, PxArray& isosurfaceTriangleIndices); + #if !PX_DOXYGEN } // namespace physx #endif diff --git a/Source/ThirdParty/PhysX/filebuf/PxFileBuf.h b/Source/ThirdParty/PhysX/filebuf/PxFileBuf.h index 9431fc36c..79ab02661 100644 --- a/Source/ThirdParty/PhysX/filebuf/PxFileBuf.h +++ b/Source/ThirdParty/PhysX/filebuf/PxFileBuf.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,7 +22,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. @@ -205,7 +204,7 @@ public: void release(void) { - delete this; + PX_DELETE_THIS; } static PX_INLINE bool isBigEndian() diff --git a/Source/ThirdParty/PhysX/foundation/PsAllocator.h b/Source/ThirdParty/PhysX/foundation/PsAllocator.h deleted file mode 100644 index 91c5ea9dc..000000000 --- a/Source/ThirdParty/PhysX/foundation/PsAllocator.h +++ /dev/null @@ -1,367 +0,0 @@ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// * Neither the name of NVIDIA CORPORATION nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. -// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. -// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PSFOUNDATION_PSALLOCATOR_H -#define PSFOUNDATION_PSALLOCATOR_H - -#include "foundation/PxAllocatorCallback.h" -#include "foundation/PxAssert.h" -#include "PxFoundation.h" -#include "Ps.h" - -#if(PX_WINDOWS_FAMILY || PX_XBOXONE) - #include - #include -#endif -#if(PX_APPLE_FAMILY) - #include -#endif - -#include - -// Allocation macros going through user allocator -#if PX_CHECKED - #define PX_ALLOC(n, name) physx::shdfnd::NamedAllocator(name).allocate(n, __FILE__, __LINE__) -#else - #define PX_ALLOC(n, name) physx::shdfnd::NonTrackingAllocator().allocate(n, __FILE__, __LINE__) -#endif -#define PX_ALLOC_TEMP(n, name) PX_ALLOC(n, name) -#define PX_FREE(x) physx::shdfnd::NonTrackingAllocator().deallocate(x) -#define PX_FREE_AND_RESET(x) \ - { \ - PX_FREE(x); \ - x = 0; \ - } - -// The following macros support plain-old-types and classes derived from UserAllocated. -#define PX_NEW(T) new (physx::shdfnd::ReflectionAllocator(), __FILE__, __LINE__) T -#define PX_NEW_TEMP(T) PX_NEW(T) -#define PX_DELETE(x) delete x -#define PX_DELETE_AND_RESET(x) \ - { \ - PX_DELETE(x); \ - x = 0; \ - } -#define PX_DELETE_POD(x) \ - { \ - PX_FREE(x); \ - x = 0; \ - } -#define PX_DELETE_ARRAY(x) \ - { \ - PX_DELETE([] x); \ - x = 0; \ - } - -// aligned allocation -#define PX_ALIGNED16_ALLOC(n) physx::shdfnd::AlignedAllocator<16>().allocate(n, __FILE__, __LINE__) -#define PX_ALIGNED16_FREE(x) physx::shdfnd::AlignedAllocator<16>().deallocate(x) - -//! placement new macro to make it easy to spot bad use of 'new' -#define PX_PLACEMENT_NEW(p, T) new (p) T - -#if PX_DEBUG || PX_CHECKED - #define PX_USE_NAMED_ALLOCATOR 1 -#else - #define PX_USE_NAMED_ALLOCATOR 0 -#endif - -// Don't use inline for alloca !!! -#if PX_WINDOWS_FAMILY - #include - #define PxAlloca(x) _alloca(x) -#elif PX_LINUX || PX_ANDROID - #include - #define PxAlloca(x) alloca(x) -#elif PX_APPLE_FAMILY - #include - #define PxAlloca(x) alloca(x) -#elif PX_PS4 - #include - #define PxAlloca(x) alloca(x) -#elif PX_XBOXONE - #include - #define PxAlloca(x) alloca(x) -#elif PX_SWITCH - #include - #define PxAlloca(x) alloca(x) -#endif - -#define PxAllocaAligned(x, alignment) ((size_t(PxAlloca(x + alignment)) + (alignment - 1)) & ~size_t(alignment - 1)) - -namespace physx -{ -namespace shdfnd -{ - -PX_FOUNDATION_API PxAllocatorCallback& getAllocator(); - -/** -Allocator used to access the global PxAllocatorCallback instance without providing additional information. -*/ - -class PX_FOUNDATION_API Allocator -{ - public: - Allocator(const char* = 0) - { - } - void* allocate(size_t size, const char* file, int line); - void deallocate(void* ptr); -}; - -/* - * Bootstrap allocator using malloc/free. - * Don't use unless your objects get allocated before foundation is initialized. - */ -class RawAllocator -{ - public: - RawAllocator(const char* = 0) - { - } - void* allocate(size_t size, const char*, int) - { - // malloc returns valid pointer for size==0, no need to check - return ::malloc(size); - } - void deallocate(void* ptr) - { - // free(0) is guaranteed to have no side effect, no need to check - ::free(ptr); - } -}; - -/* - * Allocator that simply calls straight back to the application without tracking. - * This is used by the heap (Foundation::mNamedAllocMap) that tracks allocations - * because it needs to be able to grow as a result of an allocation. - * Making the hash table re-entrant to deal with this may not make sense. - */ -class NonTrackingAllocator -{ - public: - PX_FORCE_INLINE NonTrackingAllocator(const char* = 0) - { - } - PX_FORCE_INLINE void* allocate(size_t size, const char* file, int line) - { - return !size ? 0 : getAllocator().allocate(size, "NonTrackedAlloc", file, line); - } - PX_FORCE_INLINE void deallocate(void* ptr) - { - if(ptr) - getAllocator().deallocate(ptr); - } -}; - -/* -\brief Virtual allocator callback used to provide run-time defined allocators to foundation types like Array or Bitmap. - This is used by VirtualAllocator -*/ -class VirtualAllocatorCallback -{ - public: - VirtualAllocatorCallback() - { - } - virtual ~VirtualAllocatorCallback() - { - } - virtual void* allocate(const size_t size, const char* file, const int line) = 0; - virtual void deallocate(void* ptr) = 0; -}; - -/* -\brief Virtual allocator to be used by foundation types to provide run-time defined allocators. -Due to the fact that Array extends its allocator, rather than contains a reference/pointer to it, the VirtualAllocator -must -be a concrete type containing a pointer to a virtual callback. The callback may not be available at instantiation time, -therefore -methods are provided to set the callback later. -*/ -class VirtualAllocator -{ - public: - VirtualAllocator(VirtualAllocatorCallback* callback = NULL) : mCallback(callback) - { - } - - void* allocate(const size_t size, const char* file, const int line) - { - PX_ASSERT(mCallback); - if(size) - return mCallback->allocate(size, file, line); - return NULL; - } - void deallocate(void* ptr) - { - PX_ASSERT(mCallback); - if(ptr) - mCallback->deallocate(ptr); - } - - void setCallback(VirtualAllocatorCallback* callback) - { - mCallback = callback; - } - VirtualAllocatorCallback* getCallback() - { - return mCallback; - } - - private: - VirtualAllocatorCallback* mCallback; - VirtualAllocator& operator=(const VirtualAllocator&); -}; - -#if PX_USE_NAMED_ALLOCATOR // can be slow, so only use in debug/checked -class PX_FOUNDATION_API NamedAllocator -{ - public: - NamedAllocator(const PxEMPTY); - NamedAllocator(const char* name = 0); // todo: should not have default argument! - NamedAllocator(const NamedAllocator&); - ~NamedAllocator(); - NamedAllocator& operator=(const NamedAllocator&); - void* allocate(size_t size, const char* filename, int line); - void deallocate(void* ptr); -}; -#else -class NamedAllocator; -#endif // PX_DEBUG - -/** -Allocator used to access the global PxAllocatorCallback instance using a static name derived from T. -*/ - -template -class ReflectionAllocator -{ - static const char* getName() - { - if(!PxGetFoundation().getReportAllocationNames()) - return ""; -#if PX_GCC_FAMILY - return __PRETTY_FUNCTION__; -#else - // name() calls malloc(), raw_name() wouldn't - return typeid(T).name(); -#endif - } - - public: - ReflectionAllocator(const PxEMPTY) - { - } - ReflectionAllocator(const char* = 0) - { - } - inline ReflectionAllocator(const ReflectionAllocator&) - { - } - void* allocate(size_t size, const char* filename, int line) - { - return size ? getAllocator().allocate(size, getName(), filename, line) : 0; - } - void deallocate(void* ptr) - { - if(ptr) - getAllocator().deallocate(ptr); - } -}; - -template -struct AllocatorTraits -{ -#if PX_USE_NAMED_ALLOCATOR - typedef NamedAllocator Type; -#else - typedef ReflectionAllocator Type; -#endif -}; - -// if you get a build error here, you are trying to PX_NEW a class -// that is neither plain-old-type nor derived from UserAllocated -template -union EnableIfPod -{ - int i; - T t; - typedef X Type; -}; - -} // namespace shdfnd -} // namespace physx - -// Global placement new for ReflectionAllocator templated by -// plain-old-type. Allows using PX_NEW for pointers and built-in-types. -// -// ATTENTION: You need to use PX_DELETE_POD or PX_FREE to deallocate -// memory, not PX_DELETE. PX_DELETE_POD redirects to PX_FREE. -// -// Rationale: PX_DELETE uses global operator delete(void*), which we dont' want to overload. -// Any other definition of PX_DELETE couldn't support array syntax 'PX_DELETE([]a);'. -// PX_DELETE_POD was preferred over PX_DELETE_ARRAY because it is used -// less often and applies to both single instances and arrays. -template -PX_INLINE void* operator new(size_t size, physx::shdfnd::ReflectionAllocator alloc, const char* fileName, - typename physx::shdfnd::EnableIfPod::Type line) -{ - return alloc.allocate(size, fileName, line); -} - -template -PX_INLINE void* operator new [](size_t size, physx::shdfnd::ReflectionAllocator alloc, const char* fileName, - typename physx::shdfnd::EnableIfPod::Type line) -{ return alloc.allocate(size, fileName, line); } - -// If construction after placement new throws, this placement delete is being called. -template -PX_INLINE void operator delete(void* ptr, physx::shdfnd::ReflectionAllocator alloc, const char* fileName, - typename physx::shdfnd::EnableIfPod::Type line) -{ - PX_UNUSED(fileName); - PX_UNUSED(line); - - alloc.deallocate(ptr); -} - -// If construction after placement new throws, this placement delete is being called. -template -PX_INLINE void operator delete [](void* ptr, physx::shdfnd::ReflectionAllocator alloc, const char* fileName, - typename physx::shdfnd::EnableIfPod::Type line) -{ - PX_UNUSED(fileName); - PX_UNUSED(line); - - alloc.deallocate(ptr); -} - -#endif // #ifndef PSFOUNDATION_PSALLOCATOR_H diff --git a/Source/ThirdParty/PhysX/foundation/Px.h b/Source/ThirdParty/PhysX/foundation/Px.h index e4e53415d..1d3dd4e74 100644 --- a/Source/ThirdParty/PhysX/foundation/Px.h +++ b/Source/ThirdParty/PhysX/foundation/Px.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PX_H -#define PXFOUNDATION_PX_H +#ifndef PX_H +#define PX_H /** \addtogroup foundation @{ @@ -56,14 +55,31 @@ class PxInputStream; class PxInputData; class PxOutputStream; -class PxVec2; -class PxVec3; -class PxVec4; -class PxMat33; -class PxMat44; +template class PxVec2T; +typedef PxVec2T PxVec2; + +template class PxVec3T; +typedef PxVec3T PxVec3; + +template class PxVec4T; +typedef PxVec4T PxVec4; + +template class PxQuatT; +typedef PxQuatT PxQuat; + +template class PxMat33T; +typedef PxMat33T PxMat33; + +template class PxMat34T; +typedef PxMat34T PxMat34; + +template class PxMat44T; +typedef PxMat44T PxMat44; + +template class PxTransformT; +typedef PxTransformT PxTransform; + class PxPlane; -class PxQuat; -class PxTransform; class PxBounds3; /** enum for empty constructor tag*/ @@ -89,4 +105,5 @@ enum PxIDENTITY #endif /** @} */ -#endif // #ifndef PXFOUNDATION_PX_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxAlignedMalloc.h b/Source/ThirdParty/PhysX/foundation/PxAlignedMalloc.h new file mode 100644 index 000000000..6e71f5988 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxAlignedMalloc.h @@ -0,0 +1,89 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_ALIGNED_MALLOC_H +#define PX_ALIGNED_MALLOC_H + +#include "PxUserAllocated.h" + +/*! +Allocate aligned memory. +Alignment must be a power of 2! +-- should be templated by a base allocator +*/ + +#if !PX_DOXYGEN +namespace physx +{ +#endif + /** + Allocator, which is used to access the global PxAllocatorCallback instance + (used for dynamic data types template instantiation), which can align memory + */ + + // SCS: AlignedMalloc with 3 params not found, seems not used on PC either + // disabled for now to avoid GCC error + + template + class PxAlignedAllocator : public BaseAllocator + { + public: + PxAlignedAllocator(const BaseAllocator& base = BaseAllocator()) : BaseAllocator(base) + { + } + + void* allocate(size_t size, const char* file, int line) + { + size_t pad = N - 1 + sizeof(size_t); // store offset for delete. + uint8_t* base = reinterpret_cast(BaseAllocator::allocate(size + pad, file, line)); + if (!base) + return NULL; + + uint8_t* ptr = reinterpret_cast(size_t(base + pad) & ~(size_t(N) - 1)); // aligned pointer, ensuring N + // is a size_t + // wide mask + reinterpret_cast(ptr)[-1] = size_t(ptr - base); // store offset + + return ptr; + } + void deallocate(void* ptr) + { + if (ptr == NULL) + return; + + uint8_t* base = reinterpret_cast(ptr) - reinterpret_cast(ptr)[-1]; + BaseAllocator::deallocate(base); + } + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxAlloca.h b/Source/ThirdParty/PhysX/foundation/PxAlloca.h new file mode 100644 index 000000000..64c41515d --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxAlloca.h @@ -0,0 +1,93 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_ALLOCA_H +#define PX_ALLOCA_H + +#include "foundation/PxTempAllocator.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif +template +class PxScopedPointer : private Alloc +{ + public: + ~PxScopedPointer() + { + if(mOwned) + Alloc::deallocate(mPointer); + } + + operator T*() const + { + return mPointer; + } + + T* mPointer; + bool mOwned; +}; + +#if !PX_DOXYGEN +} // namespace physx +#endif + + // Don't use inline for alloca !!! +#if PX_WINDOWS_FAMILY +#include +#define PxAlloca(x) _alloca(x) +#elif PX_LINUX || PX_ANDROID +#include +#define PxAlloca(x) alloca(x) +#elif PX_APPLE_FAMILY +#include +#define PxAlloca(x) alloca(x) +#elif PX_PS4 || PX_PS5 +#include +#define PxAlloca(x) alloca(x) +#elif PX_SWITCH +#include +#define PxAlloca(x) alloca(x) +#endif + +#define PxAllocaAligned(x, alignment) ((size_t(PxAlloca(x + alignment)) + (alignment - 1)) & ~size_t(alignment - 1)) + +/*! Stack allocation for \c count instances of \c type. Falling back to temp allocator if using more than 1kB. */ +#define PX_ALLOCA(var, type, count) \ + physx::PxScopedPointer var; \ + { \ + uint32_t size = sizeof(type) * (count); \ + var.mOwned = size > 1024; \ + if(var.mOwned) \ + var.mPointer = reinterpret_cast(physx::PxTempAllocator().allocate(size, __FILE__, __LINE__)); \ + else \ + var.mPointer = reinterpret_cast(PxAlloca(size)); \ + } +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxAllocator.h b/Source/ThirdParty/PhysX/foundation/PxAllocator.h new file mode 100644 index 000000000..5fb41997d --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxAllocator.h @@ -0,0 +1,230 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_ALLOCATOR_H +#define PX_ALLOCATOR_H + +#include "foundation/PxAllocatorCallback.h" +#include "foundation/PxAssert.h" +#include "foundation/PxFoundation.h" +#include "foundation/Px.h" + +#if PX_VC +#pragma warning(push) +#pragma warning(disable : 4577) +#endif + +#if PX_WINDOWS_FAMILY + #include +#if(_MSC_VER >= 1923) + #include +#else + #include +#endif +#endif +#if(PX_APPLE_FAMILY) + #include +#endif + +#include + +#if PX_VC +#pragma warning(pop) +#endif + + +// PT: the rules are simple: +// - PX_ALLOC/PX_ALLOCATE/PX_FREE is similar to malloc/free. Use that for POD/anything that doesn't need ctor/dtor. +// - PX_NEW/PX_DELETE is similar to new/delete. Use that for anything that needs a ctor/dtor. +// - Everything goes through the user allocator. +// - Inherit from PxUserAllocated to PX_NEW something. Do it even on small classes, it's free. +// - You cannot PX_NEW a POD. Use PX_ALLOC. + +#define PX_ALLOC(n, name) physx::PxAllocator().allocate(n, __FILE__, __LINE__) + +// PT: use this one to reduce the amount of visible reinterpret_cast +#define PX_ALLOCATE(type, count, name) reinterpret_cast(PX_ALLOC(count*sizeof(type), name)) + +#define PX_FREE(x) \ + if(x) \ + { \ + physx::PxAllocator().deallocate(x); \ + x = NULL; \ + } + +#define PX_FREE_THIS physx::PxAllocator().deallocate(this) + +#define PX_NEW(T) new (physx::PxReflectionAllocator(), __FILE__, __LINE__) T +#define PX_PLACEMENT_NEW(p, T) new (p) T +#define PX_DELETE_THIS delete this +#define PX_DELETE(x) if(x) { delete x; x = NULL; } +#define PX_DELETE_ARRAY(x) if(x) { delete []x; x = NULL; } +#define PX_RELEASE(x) if(x) { x->release(); x = NULL; } + +#if !PX_DOXYGEN +namespace physx +{ +#endif + /** + Allocator used to access the global PxAllocatorCallback instance without providing additional information. + */ + class PxAllocator + { + public: + PX_FORCE_INLINE PxAllocator(const char* = NULL){} + + PX_FORCE_INLINE void* allocate(size_t size, const char* file, int line) + { + return size ? PxGetBroadcastAllocator()->allocate(size, "", file, line) : NULL; + } + + PX_FORCE_INLINE void deallocate(void* ptr) + { + if(ptr) + PxGetBroadcastAllocator()->deallocate(ptr); + } + }; + + /* + * Bootstrap allocator using malloc/free. + * Don't use unless your objects get allocated before foundation is initialized. + */ + class PxRawAllocator + { + public: + PxRawAllocator(const char* = 0) {} + + PX_FORCE_INLINE void* allocate(size_t size, const char*, int) + { + // malloc returns valid pointer for size==0, no need to check + return ::malloc(size); + } + + PX_FORCE_INLINE void deallocate(void* ptr) + { + // free(0) is guaranteed to have no side effect, no need to check + ::free(ptr); + } + }; + + /* + \brief Virtual allocator callback used to provide run-time defined allocators to foundation types like Array or Bitmap. + This is used by VirtualAllocator + */ + class PxVirtualAllocatorCallback + { + public: + PxVirtualAllocatorCallback() {} + virtual ~PxVirtualAllocatorCallback() {} + + virtual void* allocate(const size_t size, const int group, const char* file, const int line) = 0; + virtual void deallocate(void* ptr) = 0; + }; + + /* + \brief Virtual allocator to be used by foundation types to provide run-time defined allocators. + Due to the fact that Array extends its allocator, rather than contains a reference/pointer to it, the VirtualAllocator + must + be a concrete type containing a pointer to a virtual callback. The callback may not be available at instantiation time, + therefore + methods are provided to set the callback later. + */ + class PxVirtualAllocator + { + public: + PxVirtualAllocator(PxVirtualAllocatorCallback* callback = NULL, const int group = 0) : mCallback(callback), mGroup(group) {} + + PX_FORCE_INLINE void* allocate(const size_t size, const char* file, const int line) + { + PX_ASSERT(mCallback); + if (size) + return mCallback->allocate(size, mGroup, file, line); + return NULL; + } + + PX_FORCE_INLINE void deallocate(void* ptr) + { + PX_ASSERT(mCallback); + if (ptr) + mCallback->deallocate(ptr); + } + + private: + PxVirtualAllocatorCallback* mCallback; + const int mGroup; + PxVirtualAllocator& operator=(const PxVirtualAllocator&); + }; + + /** + Allocator used to access the global PxAllocatorCallback instance using a static name derived from T. + */ + template + class PxReflectionAllocator + { + static const char* getName() + { + if (!PxGetFoundation().getReportAllocationNames()) + return ""; +#if PX_GCC_FAMILY + return __PRETTY_FUNCTION__; +#else + // name() calls malloc(), raw_name() wouldn't + return typeid(T).name(); +#endif + } + + public: + PxReflectionAllocator(const PxEMPTY) {} + PxReflectionAllocator(const char* = 0) {} + + inline PxReflectionAllocator(const PxReflectionAllocator&) {} + + PX_FORCE_INLINE void* allocate(size_t size, const char* filename, int line) + { + return size ? PxGetBroadcastAllocator()->allocate(size, getName(), filename, line) : NULL; + } + + PX_FORCE_INLINE void deallocate(void* ptr) + { + if (ptr) + PxGetBroadcastAllocator()->deallocate(ptr); + } + }; + + template + struct PxAllocatorTraits + { + typedef PxReflectionAllocator Type; + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxAllocatorCallback.h b/Source/ThirdParty/PhysX/foundation/PxAllocatorCallback.h index 4e9487d80..c82ceb0d3 100644 --- a/Source/ThirdParty/PhysX/foundation/PxAllocatorCallback.h +++ b/Source/ThirdParty/PhysX/foundation/PxAllocatorCallback.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,17 +22,18 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXALLOCATORCALLBACK_H -#define PXFOUNDATION_PXALLOCATORCALLBACK_H +#ifndef PX_ALLOCATOR_CALLBACK_H +#define PX_ALLOCATOR_CALLBACK_H /** \addtogroup foundation @{ */ +#include "foundation/PxFoundationConfig.h" #include "foundation/Px.h" #if !PX_DOXYGEN namespace physx @@ -52,9 +52,7 @@ or the physics processing thread(s). class PxAllocatorCallback { public: - /** - \brief destructor - */ + virtual ~PxAllocatorCallback() { } @@ -92,4 +90,5 @@ class PxAllocatorCallback #endif /** @} */ -#endif // #ifndef PXFOUNDATION_PXALLOCATORCALLBACK_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxSharedAssert.h b/Source/ThirdParty/PhysX/foundation/PxAoS.h similarity index 78% rename from Source/ThirdParty/PhysX/foundation/PxSharedAssert.h rename to Source/ThirdParty/PhysX/foundation/PxAoS.h index 1cb05cb2e..bb5e74807 100644 --- a/Source/ThirdParty/PhysX/foundation/PxSharedAssert.h +++ b/Source/ThirdParty/PhysX/foundation/PxAoS.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,24 +22,21 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXASSERT_H -#define PXFOUNDATION_PXASSERT_H - -/** \addtogroup foundation -@{ */ +#ifndef PX_AOS_H +#define PX_AOS_H #include "foundation/Px.h" -#if !PX_ENABLE_ASSERTS - #define PX_SHARED_ASSERT(exp) ((void)0) +#if PX_WINDOWS && !PX_NEON +#include "windows/PxWindowsAoS.h" +#elif(PX_UNIX_FAMILY || PX_PS4 || PX_PS5 || PX_SWITCH) +#include "unix/PxUnixAoS.h" #else - #include - #define PX_SHARED_ASSERT(exp) assert(exp); -#endif // !PX_ENABLE_ASSERTS +#error "Platform not supported!" +#endif -/** @} */ -#endif // #ifndef PXFOUNDATION_PXASSERT_H +#endif diff --git a/Source/ThirdParty/PhysX/foundation/PxArray.h b/Source/ThirdParty/PhysX/foundation/PxArray.h new file mode 100644 index 000000000..5b636f891 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxArray.h @@ -0,0 +1,721 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_ARRAY_H +#define PX_ARRAY_H + +#include "foundation/PxAssert.h" +#include "foundation/PxMathIntrinsics.h" +#include "foundation/PxAllocator.h" +#include "foundation/PxBasicTemplates.h" +#include "foundation/PxMemory.h" + +namespace physx +{ + +/*! +An array is a sequential container. + +Implementation note +* entries between 0 and size are valid objects +* we use inheritance to build this because the array is included inline in a lot + of objects and we want the allocator to take no space if it's not stateful, which + aggregation doesn't allow. Also, we want the metadata at the front for the inline + case where the allocator contains some inline storage space +*/ +template ::Type> +class PxArray : protected Alloc +{ + public: + typedef T* Iterator; + typedef const T* ConstIterator; + + explicit PxArray(const PxEMPTY v) : Alloc(v) + { + if(mData) + mCapacity |= PX_SIGN_BITMASK; + } + + /*! + Default array constructor. Initialize an empty array + */ + PX_INLINE explicit PxArray(const Alloc& alloc = Alloc()) : Alloc(alloc), mData(0), mSize(0), mCapacity(0) + { + } + + /*! + Initialize array with given capacity + */ + PX_INLINE explicit PxArray(uint32_t size, const T& a = T(), const Alloc& alloc = Alloc()) + : Alloc(alloc), mData(0), mSize(0), mCapacity(0) + { + resize(size, a); + } + + /*! + Copy-constructor. Copy all entries from other array + */ + template + PX_INLINE explicit PxArray(const PxArray& other, const Alloc& alloc = Alloc()) + : Alloc(alloc) + { + copy(other); + } + + // This is necessary else the basic default copy constructor is used in the case of both arrays being of the same + // template instance + // The C++ standard clearly states that a template constructor is never a copy constructor [2]. In other words, + // the presence of a template constructor does not suppress the implicit declaration of the copy constructor. + // Also never make a copy constructor explicit, or copy-initialization* will no longer work. This is because + // 'binding an rvalue to a const reference requires an accessible copy constructor' (http://gcc.gnu.org/bugs/) + // *http://stackoverflow.com/questions/1051379/is-there-a-difference-in-c-between-copy-initialization-and-assignment-initializ + PX_INLINE PxArray(const PxArray& other, const Alloc& alloc = Alloc()) : Alloc(alloc) + { + copy(other); + } + + /*! + Initialize array with given length + */ + PX_INLINE explicit PxArray(const T* first, const T* last, const Alloc& alloc = Alloc()) + : Alloc(alloc), mSize(last < first ? 0 : uint32_t(last - first)), mCapacity(mSize) + { + mData = allocate(mSize); + copy(mData, mData + mSize, first); + } + + /*! + Destructor + */ + PX_INLINE ~PxArray() + { + destroy(mData, mData + mSize); + + if(capacity() && !isInUserMemory()) + deallocate(mData); + } + + /*! + Assignment operator. Copy content (deep-copy) + */ + template + PX_INLINE PxArray& operator=(const PxArray& rhs) + { + if(&rhs == this) + return *this; + + clear(); + reserve(rhs.mSize); + copy(mData, mData + rhs.mSize, rhs.mData); + + mSize = rhs.mSize; + return *this; + } + + PX_INLINE PxArray& operator=(const PxArray& t) // Needs to be declared, see comment at copy-constructor + { + return operator=(t); + } + + /*! + Array indexing operator. + \param i + The index of the element that will be returned. + \return + The element i in the array. + */ + PX_FORCE_INLINE const T& operator[](uint32_t i) const + { + PX_ASSERT(i < mSize); + return mData[i]; + } + + /*! + Array indexing operator. + \param i + The index of the element that will be returned. + \return + The element i in the array. + */ + PX_FORCE_INLINE T& operator[](uint32_t i) + { + PX_ASSERT(i < mSize); + return mData[i]; + } + + /*! + Returns a pointer to the initial element of the array. + \return + a pointer to the initial element of the array. + */ + PX_FORCE_INLINE ConstIterator begin() const + { + return mData; + } + + PX_FORCE_INLINE Iterator begin() + { + return mData; + } + + /*! + Returns an iterator beyond the last element of the array. Do not dereference. + \return + a pointer to the element beyond the last element of the array. + */ + + PX_FORCE_INLINE ConstIterator end() const + { + return mData + mSize; + } + + PX_FORCE_INLINE Iterator end() + { + return mData + mSize; + } + + /*! + Returns a reference to the first element of the array. Undefined if the array is empty. + \return a reference to the first element of the array + */ + + PX_FORCE_INLINE const T& front() const + { + PX_ASSERT(mSize); + return mData[0]; + } + + PX_FORCE_INLINE T& front() + { + PX_ASSERT(mSize); + return mData[0]; + } + + /*! + Returns a reference to the last element of the array. Undefined if the array is empty + \return a reference to the last element of the array + */ + + PX_FORCE_INLINE const T& back() const + { + PX_ASSERT(mSize); + return mData[mSize - 1]; + } + + PX_FORCE_INLINE T& back() + { + PX_ASSERT(mSize); + return mData[mSize - 1]; + } + + /*! + Returns the number of entries in the array. This can, and probably will, + differ from the array capacity. + \return + The number of of entries in the array. + */ + PX_FORCE_INLINE uint32_t size() const + { + return mSize; + } + + /*! + Clears the array. + */ + PX_INLINE void clear() + { + destroy(mData, mData + mSize); + mSize = 0; + } + + /*! + Returns whether the array is empty (i.e. whether its size is 0). + \return + true if the array is empty + */ + PX_FORCE_INLINE bool empty() const + { + return mSize == 0; + } + + /*! + Finds the first occurrence of an element in the array. + \param a + The element to find. + */ + + PX_INLINE Iterator find(const T& a) + { + uint32_t index; + for(index = 0; index < mSize && mData[index] != a; index++) + ; + return mData + index; + } + + PX_INLINE ConstIterator find(const T& a) const + { + uint32_t index; + for(index = 0; index < mSize && mData[index] != a; index++) + ; + return mData + index; + } + + ///////////////////////////////////////////////////////////////////////// + /*! + Adds one element to the end of the array. Operation is O(1). + \param a + The element that will be added to this array. + */ + ///////////////////////////////////////////////////////////////////////// + + PX_FORCE_INLINE T& pushBack(const T& a) + { + if(capacity() <= mSize) + return growAndPushBack(a); + + PX_PLACEMENT_NEW(reinterpret_cast(mData + mSize), T)(a); + + return mData[mSize++]; + } + + ///////////////////////////////////////////////////////////////////////// + /*! + Returns the element at the end of the array. Only legal if the array is non-empty. + */ + ///////////////////////////////////////////////////////////////////////// + PX_INLINE T popBack() + { + PX_ASSERT(mSize); + T t = mData[mSize - 1]; + + mData[--mSize].~T(); + + return t; + } + + ///////////////////////////////////////////////////////////////////////// + /*! + Construct one element at the end of the array. Operation is O(1). + */ + ///////////////////////////////////////////////////////////////////////// + PX_INLINE T& insert() + { + if(capacity() <= mSize) + grow(capacityIncrement()); + + T* ptr = mData + mSize++; + PX_PLACEMENT_NEW(ptr, T); // not 'T()' because PODs should not get default-initialized. + return *ptr; + } + + ///////////////////////////////////////////////////////////////////////// + /*! + Subtracts the element on position i from the array and replace it with + the last element. + Operation is O(1) + \param i + The position of the element that will be subtracted from this array. + */ + ///////////////////////////////////////////////////////////////////////// + PX_INLINE void replaceWithLast(uint32_t i) + { + PX_ASSERT(i < mSize); + mData[i] = mData[--mSize]; + + mData[mSize].~T(); + } + + PX_INLINE void replaceWithLast(Iterator i) + { + replaceWithLast(static_cast(i - mData)); + } + + ///////////////////////////////////////////////////////////////////////// + /*! + Replaces the first occurrence of the element a with the last element + Operation is O(n) + \param a + The position of the element that will be subtracted from this array. + \return true if the element has been removed. + */ + ///////////////////////////////////////////////////////////////////////// + + PX_INLINE bool findAndReplaceWithLast(const T& a) + { + uint32_t index = 0; + while(index < mSize && mData[index] != a) + ++index; + if(index == mSize) + return false; + replaceWithLast(index); + return true; + } + + ///////////////////////////////////////////////////////////////////////// + /*! + Subtracts the element on position i from the array. Shift the entire + array one step. + Operation is O(n) + \param i + The position of the element that will be subtracted from this array. + */ + ///////////////////////////////////////////////////////////////////////// + PX_INLINE void remove(uint32_t i) + { + PX_ASSERT(i < mSize); + + T* it = mData + i; + it->~T(); + while (++i < mSize) + { + PX_PLACEMENT_NEW(it, T(mData[i])); + ++it; + it->~T(); + } + --mSize; + } + + ///////////////////////////////////////////////////////////////////////// + /*! + Removes a range from the array. Shifts the array so order is maintained. + Operation is O(n) + \param begin + The starting position of the element that will be subtracted from this array. + \param count + The number of elments that will be subtracted from this array. + */ + ///////////////////////////////////////////////////////////////////////// + PX_INLINE void removeRange(uint32_t begin, uint32_t count) + { + PX_ASSERT(begin < mSize); + PX_ASSERT((begin + count) <= mSize); + + for(uint32_t i = 0; i < count; i++) + mData[begin + i].~T(); // call the destructor on the ones being removed first. + + T* dest = &mData[begin]; // location we are copying the tail end objects to + T* src = &mData[begin + count]; // start of tail objects + uint32_t move_count = mSize - (begin + count); // compute remainder that needs to be copied down + + for(uint32_t i = 0; i < move_count; i++) + { + PX_PLACEMENT_NEW(dest, T(*src)); // copy the old one to the new location + src->~T(); // call the destructor on the old location + dest++; + src++; + } + mSize -= count; + } + + ////////////////////////////////////////////////////////////////////////// + /*! + Resize array + */ + ////////////////////////////////////////////////////////////////////////// + PX_NOINLINE void resize(const uint32_t size, const T& a = T()); + + PX_NOINLINE void resizeUninitialized(const uint32_t size); + + ////////////////////////////////////////////////////////////////////////// + /*! + Resize array such that only as much memory is allocated to hold the + existing elements + */ + ////////////////////////////////////////////////////////////////////////// + PX_INLINE void shrink() + { + recreate(mSize); + } + + ////////////////////////////////////////////////////////////////////////// + /*! + Deletes all array elements and frees memory. + */ + ////////////////////////////////////////////////////////////////////////// + PX_INLINE void reset() + { + resize(0); + shrink(); + } + + ////////////////////////////////////////////////////////////////////////// + /*! + Resets or clears the array depending on occupancy. + */ + ////////////////////////////////////////////////////////////////////////// + PX_INLINE void resetOrClear() + { + const PxU32 c = capacity(); + const PxU32 s = size(); + if(s>=c/2) + clear(); + else + reset(); + } + + ////////////////////////////////////////////////////////////////////////// + /*! + Ensure that the array has at least size capacity. + */ + ////////////////////////////////////////////////////////////////////////// + PX_INLINE void reserve(const uint32_t capacity) + { + if(capacity > this->capacity()) + grow(capacity); + } + + ////////////////////////////////////////////////////////////////////////// + /*! + Query the capacity(allocated mem) for the array. + */ + ////////////////////////////////////////////////////////////////////////// + PX_FORCE_INLINE uint32_t capacity() const + { + return mCapacity & ~PX_SIGN_BITMASK; + } + + ////////////////////////////////////////////////////////////////////////// + /*! + Unsafe function to force the size of the array + */ + ////////////////////////////////////////////////////////////////////////// + PX_FORCE_INLINE void forceSize_Unsafe(uint32_t size) + { + PX_ASSERT(size <= mCapacity); + mSize = size; + } + + ////////////////////////////////////////////////////////////////////////// + /*! + Swap contents of an array without allocating temporary storage + */ + ////////////////////////////////////////////////////////////////////////// + PX_INLINE void swap(PxArray& other) + { + PxSwap(mData, other.mData); + PxSwap(mSize, other.mSize); + PxSwap(mCapacity, other.mCapacity); + } + + ////////////////////////////////////////////////////////////////////////// + /*! + Assign a range of values to this vector (resizes to length of range) + */ + ////////////////////////////////////////////////////////////////////////// + PX_INLINE void assign(const T* first, const T* last) + { + resizeUninitialized(uint32_t(last - first)); + copy(begin(), end(), first); + } + + // We need one bit to mark arrays that have been deserialized from a user-provided memory block. + // For alignment & memory saving purpose we store that bit in the rarely used capacity member. + PX_FORCE_INLINE uint32_t isInUserMemory() const + { + return mCapacity & PX_SIGN_BITMASK; + } + + /// return reference to allocator + PX_INLINE Alloc& getAllocator() + { + return *this; + } + + protected: + // constructor for where we don't own the memory + PxArray(T* memory, uint32_t size, uint32_t capacity, const Alloc& alloc = Alloc()) + : Alloc(alloc), mData(memory), mSize(size), mCapacity(capacity | PX_SIGN_BITMASK) + { + } + + template + PX_NOINLINE void copy(const PxArray& other); + + PX_INLINE T* allocate(uint32_t size) + { + if(size > 0) + { + T* p = reinterpret_cast(Alloc::allocate(sizeof(T) * size, __FILE__, __LINE__)); + PxMarkSerializedMemory(p, sizeof(T) * size); + return p; + } + return 0; + } + + PX_INLINE void deallocate(void* mem) + { + Alloc::deallocate(mem); + } + + static PX_INLINE void create(T* first, T* last, const T& a) + { + for(; first < last; ++first) + ::PX_PLACEMENT_NEW(first, T(a)); + } + + static PX_INLINE void copy(T* first, T* last, const T* src) + { + if(last <= first) + return; + + for(; first < last; ++first, ++src) + ::PX_PLACEMENT_NEW(first, T(*src)); + } + + static PX_INLINE void destroy(T* first, T* last) + { + for(; first < last; ++first) + first->~T(); + } + + /*! + Called when pushBack() needs to grow the array. + \param a The element that will be added to this array. + */ + PX_NOINLINE T& growAndPushBack(const T& a); + + /*! + Resizes the available memory for the array. + + \param capacity + The number of entries that the set should be able to hold. + */ + PX_INLINE void grow(uint32_t capacity) + { + PX_ASSERT(this->capacity() < capacity); + recreate(capacity); + } + + /*! + Creates a new memory block, copies all entries to the new block and destroys old entries. + + \param capacity + The number of entries that the set should be able to hold. + */ + PX_NOINLINE void recreate(uint32_t capacity); + + // The idea here is to prevent accidental bugs with pushBack or insert. Unfortunately + // it interacts badly with InlineArrays with smaller inline allocations. + // TODO(dsequeira): policy template arg, this is exactly what they're for. + PX_INLINE uint32_t capacityIncrement() const + { + const uint32_t capacity = this->capacity(); + return capacity == 0 ? 1 : capacity * 2; + } + + T* mData; + uint32_t mSize; + uint32_t mCapacity; +}; + +template +PX_NOINLINE void PxArray::resize(const uint32_t size, const T& a) +{ + reserve(size); + create(mData + mSize, mData + size, a); + destroy(mData + size, mData + mSize); + mSize = size; +} + +template +template +PX_NOINLINE void PxArray::copy(const PxArray& other) +{ + if(!other.empty()) + { + mData = allocate(mSize = mCapacity = other.size()); + copy(mData, mData + mSize, other.begin()); + } + else + { + mData = NULL; + mSize = 0; + mCapacity = 0; + } + + // mData = allocate(other.mSize); + // mSize = other.mSize; + // mCapacity = other.mSize; + // copy(mData, mData + mSize, other.mData); +} + +template +PX_NOINLINE void PxArray::resizeUninitialized(const uint32_t size) +{ + reserve(size); + mSize = size; +} + +template +PX_NOINLINE T& PxArray::growAndPushBack(const T& a) +{ + uint32_t capacity = capacityIncrement(); + + T* newData = allocate(capacity); + PX_ASSERT((!capacity) || (newData && (newData != mData))); + copy(newData, newData + mSize, mData); + + // inserting element before destroying old array + // avoids referencing destroyed object when duplicating array element. + PX_PLACEMENT_NEW(reinterpret_cast(newData + mSize), T)(a); + + destroy(mData, mData + mSize); + if(!isInUserMemory()) + deallocate(mData); + + mData = newData; + mCapacity = capacity; + + return mData[mSize++]; +} + +template +PX_NOINLINE void PxArray::recreate(uint32_t capacity) +{ + T* newData = allocate(capacity); + PX_ASSERT((!capacity) || (newData && (newData != mData))); + + copy(newData, newData + mSize, mData); + destroy(mData, mData + mSize); + if(!isInUserMemory()) + deallocate(mData); + + mData = newData; + mCapacity = capacity; +} + +template +PX_INLINE void swap(PxArray& x, PxArray& y) +{ + x.swap(y); +} + +} // namespace physx + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxAssert.h b/Source/ThirdParty/PhysX/foundation/PxAssert.h index 88309d53f..f1d4d2688 100644 --- a/Source/ThirdParty/PhysX/foundation/PxAssert.h +++ b/Source/ThirdParty/PhysX/foundation/PxAssert.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_FOUNDATION_PX_ASSERT_H -#define PX_FOUNDATION_PX_ASSERT_H +#ifndef PX_ASSERT_H +#define PX_ASSERT_H #include "foundation/PxFoundationConfig.h" #include "foundation/Px.h" @@ -42,7 +41,10 @@ namespace physx { #endif -/* Base class to handle assert failures */ +/** + * @brief Base class to handle assert failures + * @deprecated + */ class PX_DEPRECATED PxAssertHandler { public: @@ -52,9 +54,17 @@ class PX_DEPRECATED PxAssertHandler virtual void operator()(const char* exp, const char* file, int line, bool& ignore) = 0; }; +/** + * @deprecated + */ PX_FOUNDATION_API PX_DEPRECATED PxAssertHandler& PxGetAssertHandler(); + +/** + * @deprecated + */ PX_FOUNDATION_API PX_DEPRECATED void PxSetAssertHandler(PxAssertHandler& handler); + #if !PX_ENABLE_ASSERTS #define PX_ASSERT(exp) ((void)0) #define PX_ALWAYS_ASSERT_MESSAGE(exp) ((void)0) @@ -95,4 +105,5 @@ PX_FOUNDATION_API PX_DEPRECATED void PxSetAssertHandler(PxAssertHandler& handler /** @} */ -#endif // PX_FOUNDATION_PX_ASSERT_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxAtomic.h b/Source/ThirdParty/PhysX/foundation/PxAtomic.h new file mode 100644 index 000000000..5cf4a16fa --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxAtomic.h @@ -0,0 +1,65 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_ATOMIC_H +#define PX_ATOMIC_H + +#include "foundation/PxFoundationConfig.h" +#include "foundation/PxSimpleTypes.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif +/* set *dest equal to val. Return the old value of *dest */ +PX_FOUNDATION_API PxI32 PxAtomicExchange(volatile PxI32* dest, PxI32 val); + +/* if *dest == comp, replace with exch. Return original value of *dest */ +PX_FOUNDATION_API PxI32 PxAtomicCompareExchange(volatile PxI32* dest, PxI32 exch, PxI32 comp); + +/* if *dest == comp, replace with exch. Return original value of *dest */ +PX_FOUNDATION_API void* PxAtomicCompareExchangePointer(volatile void** dest, void* exch, void* comp); + +/* increment the specified location. Return the incremented value */ +PX_FOUNDATION_API PxI32 PxAtomicIncrement(volatile PxI32* val); + +/* decrement the specified location. Return the decremented value */ +PX_FOUNDATION_API PxI32 PxAtomicDecrement(volatile PxI32* val); + +/* add delta to *val. Return the new value */ +PX_FOUNDATION_API PxI32 PxAtomicAdd(volatile PxI32* val, PxI32 delta); + +/* compute the maximum of dest and val. Return the new value */ +PX_FOUNDATION_API PxI32 PxAtomicMax(volatile PxI32* val, PxI32 val2); + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxBasicTemplates.h b/Source/ThirdParty/PhysX/foundation/PxBasicTemplates.h new file mode 100644 index 000000000..7243e5d8a --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxBasicTemplates.h @@ -0,0 +1,147 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_BASIC_TEMPLATES_H +#define PX_BASIC_TEMPLATES_H + +#include "foundation/PxPreprocessor.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + template + struct PxEqual + { + bool operator()(const A& a, const A& b) const + { + return a == b; + } + }; + + template + struct PxLess + { + bool operator()(const A& a, const A& b) const + { + return a < b; + } + }; + + template + struct PxGreater + { + bool operator()(const A& a, const A& b) const + { + return a > b; + } + }; + + template + class PxPair + { + public: + F first; + S second; + PX_CUDA_CALLABLE PxPair() : first(F()), second(S()) + { + } + PX_CUDA_CALLABLE PxPair(const F& f, const S& s) : first(f), second(s) + { + } + PX_CUDA_CALLABLE PxPair(const PxPair& p) : first(p.first), second(p.second) + { + } + // CN - fix for /.../PxBasicTemplates.h(61) : warning C4512: 'physx::PxPair' : assignment operator could + // not be generated + PX_CUDA_CALLABLE PxPair& operator=(const PxPair& p) + { + first = p.first; + second = p.second; + return *this; + } + PX_CUDA_CALLABLE bool operator==(const PxPair& p) const + { + return first == p.first && second == p.second; + } + PX_CUDA_CALLABLE bool operator<(const PxPair& p) const + { + if (first < p.first) + return true; + else + return !(p.first < first) && (second < p.second); + } + }; + + template + struct PxLogTwo + { + static const unsigned int value = PxLogTwo<(A >> 1)>::value + 1; + }; + template <> + struct PxLogTwo<1> + { + static const unsigned int value = 0; + }; + + template + struct PxUnConst + { + typedef T Type; + }; + template + struct PxUnConst + { + typedef T Type; + }; + + template + T PxPointerOffset(void* p, ptrdiff_t offset) + { + return reinterpret_cast(reinterpret_cast(p) + offset); + } + template + T PxPointerOffset(const void* p, ptrdiff_t offset) + { + return reinterpret_cast(reinterpret_cast(p) + offset); + } + + template + PX_CUDA_CALLABLE PX_INLINE void PxSwap(T& x, T& y) + { + const T tmp = x; + x = y; + y = tmp; + } + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxBitAndData.h b/Source/ThirdParty/PhysX/foundation/PxBitAndData.h index e5692997c..38f937b4e 100644 --- a/Source/ThirdParty/PhysX/foundation/PxBitAndData.h +++ b/Source/ThirdParty/PhysX/foundation/PxBitAndData.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXBITANDDATA_H -#define PXFOUNDATION_PXBITANDDATA_H +#ifndef PX_BIT_AND_DATA_H +#define PX_BIT_AND_DATA_H #include "foundation/Px.h" @@ -75,13 +74,14 @@ class PxBitAndDataT protected: storageType mData; }; -typedef PxBitAndDataT PxBitAndByte; -typedef PxBitAndDataT PxBitAndWord; -typedef PxBitAndDataT PxBitAndDword; +typedef PxBitAndDataT PxBitAndByte; +typedef PxBitAndDataT PxBitAndWord; +typedef PxBitAndDataT PxBitAndDword; #if !PX_DOXYGEN } // namespace physx #endif /** @} */ -#endif // PXFOUNDATION_PXBITANDDATA_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxBitMap.h b/Source/ThirdParty/PhysX/foundation/PxBitMap.h new file mode 100644 index 000000000..cb7ce9d17 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxBitMap.h @@ -0,0 +1,480 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_BITMAP_H +#define PX_BITMAP_H + +#include "foundation/PxAssert.h" +#include "foundation/PxMath.h" +#include "foundation/PxMemory.h" +#include "foundation/PxAllocator.h" +#include "foundation/PxUserAllocated.h" +#include "foundation/PxIntrinsics.h" +#include "foundation/PxBitUtils.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + /*! + Hold a bitmap with operations to set,reset or test given bit. + + We inhibit copy to prevent unintentional copies. If a copy is desired copy() should be used or + alternatively a copy constructor implemented. + */ + template + class PxBitMapBase : public PxUserAllocated + { + //= ATTENTION! ===================================================================================== + // Changing the data layout of this class breaks the binary serialization format. See comments for + // PX_BINARY_SERIAL_VERSION. If a modification is required, please adjust the getBinaryMetaData + // function. If the modification is made on a custom branch, please change PX_BINARY_SERIAL_VERSION + // accordingly. + //================================================================================================== + + PX_NOCOPY(PxBitMapBase) + + public: + + // PX_SERIALIZATION + /* todo: explicit */ PxBitMapBase(const PxEMPTY) + { + if (mMap) + mWordCount |= PX_SIGN_BITMASK; + } + //~PX_SERIALIZATION + + PX_INLINE PxBitMapBase(const PxAllocator& allocator) : mMap(0), mWordCount(0), mAllocator(allocator) {} + + PX_INLINE PxBitMapBase() : mMap(0), mWordCount(0) {} + + PX_INLINE ~PxBitMapBase() + { + release(); + } + + PX_INLINE void release() + { + if (mMap && !isInUserMemory()) + mAllocator.deallocate(mMap); + mMap = NULL; + } + + PX_INLINE PxAllocator& getAllocator() { return mAllocator; } + + PX_INLINE void growAndSet(PxU32 index) + { + extend(index + 1); + mMap[index >> 5] |= 1 << (index & 31); + } + + PX_INLINE void growAndReset(PxU32 index) + { + extend(index + 1); + mMap[index >> 5] &= ~(1 << (index & 31)); + } + + PX_INLINE PxIntBool boundedTest(PxU32 index) const + { + return PxIntBool(index >> 5 >= getWordCount() ? PxIntFalse : (mMap[index >> 5] & (1 << (index & 31)))); + } + + PX_INLINE void boundedReset(PxU32 index) + { + if((index >> 5) < getWordCount()) + mMap[index >> 5] &= ~(1 << (index & 31)); + } + + // Special optimized versions, when you _know_ your index is in range + PX_INLINE void set(PxU32 index) + { + PX_ASSERT(index> 5] |= 1 << (index & 31); + } + + PX_INLINE void reset(PxU32 index) + { + PX_ASSERT(index> 5] &= ~(1 << (index & 31)); + } + + PX_INLINE PxIntBool test(PxU32 index) const + { + PX_ASSERT(index> 5] & (1 << (index & 31))); + } + + // nibble == 4 bits + PX_INLINE PxU32 getNibbleFast(PxU32 nibIndex) const + { + const PxU32 bitIndex = nibIndex << 2; + PX_ASSERT(bitIndex < getWordCount() * 32); + return (mMap[bitIndex >> 5] >> (bitIndex & 31)) & 0xf; + } + + PX_INLINE void andNibbleFast(PxU32 nibIndex, PxU32 mask) + { + //TODO: there has to be a faster way... + const PxU32 bitIndex = nibIndex << 2; + const PxU32 shift = (bitIndex & 31); + const PxU32 nibMask = (0xfu << shift); + + PX_ASSERT(bitIndex < getWordCount() * 32); + + mMap[bitIndex >> 5] &= ((mask << shift) | ~nibMask); + } + + PX_INLINE void orNibbleFast(PxU32 nibIndex, PxU32 mask) + { + PX_ASSERT(!(mask & ~0xfu)); //check extra bits are not set + + const PxU32 bitIndex = nibIndex << 2; + const PxU32 shift = bitIndex & 31; + + PX_ASSERT(bitIndex < getWordCount() * 32); + + mMap[bitIndex >> 5] |= (mask << shift); + } + + void clear() + { + PxMemSet(mMap, 0, getWordCount() * sizeof(PxU32)); + } + + void resizeAndClear(PxU32 newBitCount) + { + extendUninitialized(newBitCount); + PxMemSet(mMap, 0, getWordCount() * sizeof(PxU32)); + } + + void setEmpty() + { + mMap = NULL; + mWordCount = 0; + } + + void setWords(PxU32* map, PxU32 wordCount) + { + mMap = map; + mWordCount = wordCount; + mWordCount |= PX_SIGN_BITMASK; + } + + // !!! only sets /last/ bit to value + void resize(PxU32 newBitCount, bool value = false) + { + PX_ASSERT(!value); // only new class supports this + PX_UNUSED(value); + extend(newBitCount); + } + + PxU32 size() const { return getWordCount() * 32; } + + void copy(const PxBitMapBase& a) + { + extendUninitialized(a.getWordCount() << 5); + PxMemCopy(mMap, a.mMap, a.getWordCount() * sizeof(PxU32)); + if (getWordCount() > a.getWordCount()) + PxMemSet(mMap + a.getWordCount(), 0, (getWordCount() - a.getWordCount()) * sizeof(PxU32)); + } + + PX_INLINE PxU32 count() const + { + // NOTE: we can probably do this faster, since the last steps in PxcBitCount32 can be defered to + // the end of the seq. + 64/128bits at a time + native bit counting instructions(360 is fast non micro code). + PxU32 count = 0; + const PxU32 wordCount = getWordCount(); + for (PxU32 i = 0; i 0;) + { + if (mMap[i]) + return (i << 5) + PxHighestSetBit(mMap[i]); + } + return PxU32(0); + } + + // the obvious combiners and some used in the SDK + + struct OR { PX_INLINE PxU32 operator()(PxU32 a, PxU32 b) { return a | b; } }; + struct AND { PX_INLINE PxU32 operator()(PxU32 a, PxU32 b) { return a&b; } }; + struct XOR { PX_INLINE PxU32 operator()(PxU32 a, PxU32 b) { return a^b; } }; + + // we use auxiliary functions here so as not to generate combiners for every combination + // of allocators + + template + PX_INLINE void combineInPlace(const PxBitMapBase<_>& b) + { + combine1(b.mMap, b.getWordCount()); + } + + template + PX_INLINE void combine(const PxBitMapBase<_1>& a, const PxBitMapBase<_2>& b) + { + combine2(a.mMap, a.getWordCount(), b.mMap, b.getWordCount()); + } + + PX_FORCE_INLINE const PxU32* getWords() const { return mMap; } + PX_FORCE_INLINE PxU32* getWords() { return mMap; } + + // PX_SERIALIZATION + PX_FORCE_INLINE PxU32 getWordCount() const { return mWordCount & ~PX_SIGN_BITMASK; } + + // We need one bit to mark arrays that have been deserialized from a user-provided memory block. + PX_FORCE_INLINE PxU32 isInUserMemory() const { return mWordCount & PX_SIGN_BITMASK; } + //~PX_SERIALIZATION + + /*! + Iterate over indices in a bitmap + + This iterator is good because it finds the set bit without looping over the cached bits upto 31 times. + However it does require a variable shift. + */ + + class Iterator + { + public: + static const PxU32 DONE = 0xffffffff; + + PX_INLINE Iterator(const PxBitMapBase &map) : mBitMap(map) + { + reset(); + } + + PX_INLINE Iterator& operator=(const Iterator& other) + { + PX_ASSERT(&mBitMap == &other.mBitMap); + mBlock = other.mBlock; + mIndex = other.mIndex; + return *this; + } + + PX_INLINE PxU32 getNext() + { + if (mBlock) + { + PxU32 bitIndex = mIndex << 5 | PxLowestSetBit(mBlock); + mBlock &= mBlock - 1; + PxU32 wordCount = mBitMap.getWordCount(); + while (!mBlock && ++mIndex < wordCount) + mBlock = mBitMap.mMap[mIndex]; + return bitIndex; + } + return DONE; + } + + PX_INLINE void reset() + { + mIndex = mBlock = 0; + PxU32 wordCount = mBitMap.getWordCount(); + while (mIndex < wordCount && ((mBlock = mBitMap.mMap[mIndex]) == 0)) + ++mIndex; + } + private: + PxU32 mBlock, mIndex; + const PxBitMapBase& mBitMap; + }; + + // DS: faster but less general: hasBits() must be true or getNext() is illegal so it is the calling code's responsibility to ensure that getNext() is not called illegally. + class PxLoopIterator + { + PX_NOCOPY(PxLoopIterator) + + public: + PX_FORCE_INLINE PxLoopIterator(const PxBitMapBase &map) : mMap(map.getWords()), mBlock(0), mIndex(-1), mWordCount(PxI32(map.getWordCount())) {} + + PX_FORCE_INLINE bool hasBits() + { + PX_ASSERT(mIndex> 5; + if (newWordCount > getWordCount()) + { + PxU32* newMap = reinterpret_cast(mAllocator.allocate(newWordCount * sizeof(PxU32), __FILE__, __LINE__)); + if (mMap) + { + PxMemCopy(newMap, mMap, getWordCount() * sizeof(PxU32)); + if (!isInUserMemory()) + mAllocator.deallocate(mMap); + } + PxMemSet(newMap + getWordCount(), 0, (newWordCount - getWordCount()) * sizeof(PxU32)); + mMap = newMap; + // also resets the isInUserMemory bit + mWordCount = newWordCount; + } + } + + void extendUninitialized(PxU32 size) + { + PxU32 newWordCount = (size + 31) >> 5; + if (newWordCount > getWordCount()) + { + if (mMap && !isInUserMemory()) + mAllocator.deallocate(mMap); + // also resets the isInUserMemory bit + mWordCount = newWordCount; + mMap = reinterpret_cast(mAllocator.allocate(mWordCount * sizeof(PxU32), __FILE__, __LINE__)); + } + } + + template + void combine1(const PxU32* words, PxU32 length) + { + extend(length << 5); + PxU32 combineLength = PxMin(getWordCount(), length); + for (PxU32 i = 0; i + void combine2(const PxU32* words1, PxU32 length1, + const PxU32* words2, PxU32 length2) + { + extendUninitialized(PxMax(length1, length2) << 5); + + PxU32 commonSize = PxMin(length1, length2); + + for (PxU32 i = 0; i PxBitMap; + typedef PxBitMapBase PxBitMapPinned; +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/foundation/PxBitUtils.h b/Source/ThirdParty/PhysX/foundation/PxBitUtils.h new file mode 100644 index 000000000..49942c171 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxBitUtils.h @@ -0,0 +1,109 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_BIT_UTILS_H +#define PX_BIT_UTILS_H + +#include "foundation/PxMathIntrinsics.h" +#include "foundation/PxAssert.h" +#include "foundation/PxIntrinsics.h" +#include "foundation/PxMathIntrinsics.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif +PX_INLINE uint32_t PxBitCount(uint32_t v) +{ + // from http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel + uint32_t const w = v - ((v >> 1) & 0x55555555); + uint32_t const x = (w & 0x33333333) + ((w >> 2) & 0x33333333); + return (((x + (x >> 4)) & 0xF0F0F0F) * 0x1010101) >> 24; +} + +PX_INLINE bool PxIsPowerOfTwo(uint32_t x) +{ + return x != 0 && (x & (x - 1)) == 0; +} + +// "Next Largest Power of 2 +// Given a binary integer value x, the next largest power of 2 can be computed by a SWAR algorithm +// that recursively "folds" the upper bits into the lower bits. This process yields a bit vector with +// the same most significant 1 as x, but all 1's below it. Adding 1 to that value yields the next +// largest power of 2. For a 32-bit value:" +PX_INLINE uint32_t PxNextPowerOfTwo(uint32_t x) +{ + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + return x + 1; +} + +/*! +Return the index of the highest set bit. Not valid for zero arg. +*/ + +PX_INLINE uint32_t PxLowestSetBit(uint32_t x) +{ + PX_ASSERT(x); + return PxLowestSetBitUnsafe(x); +} + +/*! +Return the index of the highest set bit. Not valid for zero arg. +*/ + +PX_INLINE uint32_t PxHighestSetBit(uint32_t x) +{ + PX_ASSERT(x); + return PxHighestSetBitUnsafe(x); +} + +// Helper function to approximate log2 of an integer value +// assumes that the input is actually power of two. +PX_INLINE uint32_t PxILog2(uint32_t num) +{ + for(uint32_t i = 0; i < 32; i++) + { + num >>= 1; + if(num == 0) + return i; + } + + PX_ASSERT(0); + return uint32_t(-1); +} + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxBounds3.h b/Source/ThirdParty/PhysX/foundation/PxBounds3.h index ef8ead25c..40d0ebe9b 100644 --- a/Source/ThirdParty/PhysX/foundation/PxBounds3.h +++ b/Source/ThirdParty/PhysX/foundation/PxBounds3.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXBOUNDS3_H -#define PXFOUNDATION_PXBOUNDS3_H +#ifndef PX_BOUNDS3_H +#define PX_BOUNDS3_H /** \addtogroup foundation @{ @@ -71,6 +70,18 @@ class PxBounds3 */ PX_CUDA_CALLABLE PX_FORCE_INLINE PxBounds3(const PxVec3& minimum, const PxVec3& maximum); + PX_CUDA_CALLABLE PX_FORCE_INLINE void operator=(const PxBounds3& other) + { + minimum = other.minimum; + maximum = other.maximum; + } + + PX_CUDA_CALLABLE PX_FORCE_INLINE PxBounds3(const PxBounds3& other) + { + minimum = other.minimum; + maximum = other.maximum; + } + /** \brief Return empty bounds. */ @@ -93,8 +104,7 @@ class PxBounds3 /** \brief Construct from center, extent, and (not necessarily orthogonal) basis */ - static PX_CUDA_CALLABLE PX_INLINE PxBounds3 - basisExtent(const PxVec3& center, const PxMat33& basis, const PxVec3& extent); + static PX_CUDA_CALLABLE PX_INLINE PxBounds3 basisExtent(const PxVec3& center, const PxMat33& basis, const PxVec3& extent); /** \brief Construct from pose and extent @@ -257,6 +267,12 @@ class PxBounds3 */ PX_CUDA_CALLABLE PX_FORCE_INLINE bool isValid() const; + /** + Finds the closest point in the box to the point p. If p is contained, this will be p, otherwise it + will be the closest point on the surface of the box. + */ + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 closestPoint(const PxVec3& p) const; + PxVec3 minimum, maximum; }; @@ -289,15 +305,14 @@ PX_CUDA_CALLABLE PX_INLINE PxBounds3 PxBounds3::basisExtent(const PxVec3& center, const PxMat33& basis, const PxVec3& extent) { // extended basis vectors - PxVec3 c0 = basis.column0 * extent.x; - PxVec3 c1 = basis.column1 * extent.y; - PxVec3 c2 = basis.column2 * extent.z; + const PxVec3 c0 = basis.column0 * extent.x; + const PxVec3 c1 = basis.column1 * extent.y; + const PxVec3 c2 = basis.column2 * extent.z; - PxVec3 w; // find combination of base vectors that produces max. distance for each component = sum of abs() - w.x = PxAbs(c0.x) + PxAbs(c1.x) + PxAbs(c2.x); - w.y = PxAbs(c0.y) + PxAbs(c1.y) + PxAbs(c2.y); - w.z = PxAbs(c0.z) + PxAbs(c1.z) + PxAbs(c2.z); + const PxVec3 w( PxAbs(c0.x) + PxAbs(c1.x) + PxAbs(c2.x), + PxAbs(c0.y) + PxAbs(c1.y) + PxAbs(c2.y), + PxAbs(c0.z) + PxAbs(c1.z) + PxAbs(c2.z)); return PxBounds3(center - w, center + w); } @@ -321,40 +336,40 @@ PX_CUDA_CALLABLE PX_FORCE_INLINE void PxBounds3::setMaximal() PX_CUDA_CALLABLE PX_FORCE_INLINE void PxBounds3::include(const PxVec3& v) { - PX_SHARED_ASSERT(isValid()); + PX_ASSERT(isValid()); minimum = minimum.minimum(v); maximum = maximum.maximum(v); } PX_CUDA_CALLABLE PX_FORCE_INLINE void PxBounds3::include(const PxBounds3& b) { - PX_SHARED_ASSERT(isValid()); + PX_ASSERT(isValid()); minimum = minimum.minimum(b.minimum); maximum = maximum.maximum(b.maximum); } PX_CUDA_CALLABLE PX_FORCE_INLINE bool PxBounds3::isEmpty() const { - PX_SHARED_ASSERT(isValid()); + PX_ASSERT(isValid()); return minimum.x > maximum.x; } PX_CUDA_CALLABLE PX_FORCE_INLINE bool PxBounds3::intersects(const PxBounds3& b) const { - PX_SHARED_ASSERT(isValid() && b.isValid()); + PX_ASSERT(isValid() && b.isValid()); return !(b.minimum.x > maximum.x || minimum.x > b.maximum.x || b.minimum.y > maximum.y || minimum.y > b.maximum.y || b.minimum.z > maximum.z || minimum.z > b.maximum.z); } PX_CUDA_CALLABLE PX_FORCE_INLINE bool PxBounds3::intersects1D(const PxBounds3& a, uint32_t axis) const { - PX_SHARED_ASSERT(isValid() && a.isValid()); + PX_ASSERT(isValid() && a.isValid()); return maximum[axis] >= a.minimum[axis] && a.maximum[axis] >= minimum[axis]; } PX_CUDA_CALLABLE PX_FORCE_INLINE bool PxBounds3::contains(const PxVec3& v) const { - PX_SHARED_ASSERT(isValid()); + PX_ASSERT(isValid()); return !(v.x < minimum.x || v.x > maximum.x || v.y < minimum.y || v.y > maximum.y || v.z < minimum.z || v.z > maximum.z); @@ -362,7 +377,7 @@ PX_CUDA_CALLABLE PX_FORCE_INLINE bool PxBounds3::contains(const PxVec3& v) const PX_CUDA_CALLABLE PX_FORCE_INLINE bool PxBounds3::isInside(const PxBounds3& box) const { - PX_SHARED_ASSERT(isValid() && box.isValid()); + PX_ASSERT(isValid() && box.isValid()); if(box.minimum.x > minimum.x) return false; if(box.minimum.y > minimum.y) @@ -380,57 +395,57 @@ PX_CUDA_CALLABLE PX_FORCE_INLINE bool PxBounds3::isInside(const PxBounds3& box) PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 PxBounds3::getCenter() const { - PX_SHARED_ASSERT(isValid()); + PX_ASSERT(isValid()); return (minimum + maximum) * 0.5f; } PX_CUDA_CALLABLE PX_FORCE_INLINE float PxBounds3::getCenter(uint32_t axis) const { - PX_SHARED_ASSERT(isValid()); + PX_ASSERT(isValid()); return (minimum[axis] + maximum[axis]) * 0.5f; } PX_CUDA_CALLABLE PX_FORCE_INLINE float PxBounds3::getExtents(uint32_t axis) const { - PX_SHARED_ASSERT(isValid()); + PX_ASSERT(isValid()); return (maximum[axis] - minimum[axis]) * 0.5f; } PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 PxBounds3::getDimensions() const { - PX_SHARED_ASSERT(isValid()); + PX_ASSERT(isValid()); return maximum - minimum; } PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 PxBounds3::getExtents() const { - PX_SHARED_ASSERT(isValid()); + PX_ASSERT(isValid()); return getDimensions() * 0.5f; } PX_CUDA_CALLABLE PX_FORCE_INLINE void PxBounds3::scaleSafe(float scale) { - PX_SHARED_ASSERT(isValid()); + PX_ASSERT(isValid()); if(!isEmpty()) scaleFast(scale); } PX_CUDA_CALLABLE PX_FORCE_INLINE void PxBounds3::scaleFast(float scale) { - PX_SHARED_ASSERT(isValid()); + PX_ASSERT(isValid()); *this = centerExtents(getCenter(), getExtents() * scale); } PX_CUDA_CALLABLE PX_FORCE_INLINE void PxBounds3::fattenSafe(float distance) { - PX_SHARED_ASSERT(isValid()); + PX_ASSERT(isValid()); if(!isEmpty()) fattenFast(distance); } PX_CUDA_CALLABLE PX_FORCE_INLINE void PxBounds3::fattenFast(float distance) { - PX_SHARED_ASSERT(isValid()); + PX_ASSERT(isValid()); minimum.x -= distance; minimum.y -= distance; minimum.z -= distance; @@ -442,25 +457,25 @@ PX_CUDA_CALLABLE PX_FORCE_INLINE void PxBounds3::fattenFast(float distance) PX_CUDA_CALLABLE PX_INLINE PxBounds3 PxBounds3::transformSafe(const PxMat33& matrix, const PxBounds3& bounds) { - PX_SHARED_ASSERT(bounds.isValid()); + PX_ASSERT(bounds.isValid()); return !bounds.isEmpty() ? transformFast(matrix, bounds) : bounds; } PX_CUDA_CALLABLE PX_INLINE PxBounds3 PxBounds3::transformFast(const PxMat33& matrix, const PxBounds3& bounds) { - PX_SHARED_ASSERT(bounds.isValid()); + PX_ASSERT(bounds.isValid()); return PxBounds3::basisExtent(matrix * bounds.getCenter(), matrix, bounds.getExtents()); } PX_CUDA_CALLABLE PX_INLINE PxBounds3 PxBounds3::transformSafe(const PxTransform& transform, const PxBounds3& bounds) { - PX_SHARED_ASSERT(bounds.isValid()); + PX_ASSERT(bounds.isValid()); return !bounds.isEmpty() ? transformFast(transform, bounds) : bounds; } PX_CUDA_CALLABLE PX_INLINE PxBounds3 PxBounds3::transformFast(const PxTransform& transform, const PxBounds3& bounds) { - PX_SHARED_ASSERT(bounds.isValid()); + PX_ASSERT(bounds.isValid()); return PxBounds3::basisExtent(transform.transform(bounds.getCenter()), PxMat33(transform.q), bounds.getExtents()); } @@ -472,9 +487,15 @@ PX_CUDA_CALLABLE PX_FORCE_INLINE bool PxBounds3::isValid() const (maximum.y == -PX_MAX_BOUNDS_EXTENTS) && (maximum.z == -PX_MAX_BOUNDS_EXTENTS)))); } +PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 PxBounds3::closestPoint(const PxVec3& p) const +{ + return minimum.maximum(maximum.minimum(p)); +} + #if !PX_DOXYGEN } // namespace physx #endif /** @} */ -#endif // #ifndef PXFOUNDATION_PXBOUNDS3_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxBroadcast.h b/Source/ThirdParty/PhysX/foundation/PxBroadcast.h new file mode 100644 index 000000000..2d160896c --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxBroadcast.h @@ -0,0 +1,276 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_BROADCAST_H +#define PX_BROADCAST_H + +#include "foundation/PxInlineArray.h" +#include "foundation/PxSimpleTypes.h" +#include "foundation/PxErrorCallback.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +/** +\brief Abstract listener class that listens to allocation and deallocation events from the + foundation memory system. + +Threading: All methods of this class should be thread safe as it can be called from the user thread +or the physics processing thread(s). +*/ +class PxAllocationListener +{ + public: + /** + \brief callback when memory is allocated. + \param size Size of the allocation in bytes. + \param typeName Type this data is being allocated for. + \param filename File the allocation came from. + \param line the allocation came from. + \param allocatedMemory memory that will be returned from the allocation. + */ + virtual void onAllocation(size_t size, const char* typeName, const char* filename, int line, + void* allocatedMemory) = 0; + + /** + \brief callback when memory is deallocated. + \param allocatedMemory memory just before allocation. + */ + virtual void onDeallocation(void* allocatedMemory) = 0; + + protected: + virtual ~PxAllocationListener() + { + } +}; + +/** +\brief Broadcast class implementation, registering listeners. + +Threading: All methods of this class should be thread safe as it can be called from the user thread +or the physics processing thread(s). There is not internal locking +*/ +template +class PxBroadcast : public Base +{ + public: + static const uint32_t MAX_NB_LISTENERS = 16; + + /** + \brief The default constructor. + */ + PxBroadcast() + { + } + + /** + \brief Register new listener. + + \note It is NOT SAFE to register and deregister listeners while allocations may be taking place. + moreover, there is no thread safety to registration/deregistration. + + \param listener Listener to register. + */ + void registerListener(Listener& listener) + { + if(mListeners.size() < MAX_NB_LISTENERS) + mListeners.pushBack(&listener); + } + + /** + \brief Deregister an existing listener. + + \note It is NOT SAFE to register and deregister listeners while allocations may be taking place. + moreover, there is no thread safety to registration/deregistration. + + \param listener Listener to deregister. + */ + void deregisterListener(Listener& listener) + { + mListeners.findAndReplaceWithLast(&listener); + } + + /** + \brief Get number of registered listeners. + + \return Number of listeners. + */ + uint32_t getNbListeners() const + { + return mListeners.size(); + } + + /** + \brief Get an existing listener from given index. + + \param index Index of the listener. + \return Listener on given index. + */ + Listener& getListener(uint32_t index) + { + PX_ASSERT(index <= mListeners.size()); + return *mListeners[index]; + } + + protected: + virtual ~PxBroadcast() + { + } + + physx::PxInlineArray mListeners; +}; + +/** +\brief Abstract base class for an application defined memory allocator that allows an external listener +to audit the memory allocations. +*/ +class PxBroadcastingAllocator : public PxBroadcast +{ + PX_NOCOPY(PxBroadcastingAllocator) + + public: + /** + \brief The default constructor. + */ + PxBroadcastingAllocator(PxAllocatorCallback& allocator, PxErrorCallback& error) : mAllocator(allocator), mError(error) + { + mListeners.clear(); + } + + /** + \brief The default constructor. + */ + virtual ~PxBroadcastingAllocator() + { + mListeners.clear(); + } + + /** + \brief Allocates size bytes of memory, which must be 16-byte aligned. + + This method should never return NULL. If you run out of memory, then + you should terminate the app or take some other appropriate action. + + Threading: This function should be thread safe as it can be called in the context of the user thread + and physics processing thread(s). + + \param size Number of bytes to allocate. + \param typeName Name of the datatype that is being allocated + \param filename The source file which allocated the memory + \param line The source line which allocated the memory + \return The allocated block of memory. + */ + void* allocate(size_t size, const char* typeName, const char* filename, int line) + { + void* mem = mAllocator.allocate(size, typeName, filename, line); + + if(!mem) + { + mError.reportError(PxErrorCode::eABORT, "User allocator returned NULL.", __FILE__, __LINE__); + return NULL; + } + + if((size_t(mem) & 15)) + { + mError.reportError(PxErrorCode::eABORT, "Allocations must be 16-byte aligned.", __FILE__, __LINE__); + return NULL; + } + + for(uint32_t i = 0; i < mListeners.size(); i++) + mListeners[i]->onAllocation(size, typeName, filename, line, mem); + + return mem; + } + + /** + \brief Frees memory previously allocated by allocate(). + + Threading: This function should be thread safe as it can be called in the context of the user thread + and physics processing thread(s). + + \param ptr Memory to free. + */ + void deallocate(void* ptr) + { + for(uint32_t i = 0; i < mListeners.size(); i++) + { + mListeners[i]->onDeallocation(ptr); + } + mAllocator.deallocate(ptr); + } + + private: + PxAllocatorCallback& mAllocator; + PxErrorCallback& mError; +}; + +/** +\brief Abstract base class for an application defined error callback that allows an external listener +to report errors. +*/ +class PxBroadcastingErrorCallback : public PxBroadcast +{ + PX_NOCOPY(PxBroadcastingErrorCallback) + public: + /** + \brief The default constructor. + */ + PxBroadcastingErrorCallback(PxErrorCallback& errorCallback) + { + registerListener(errorCallback); + } + + /** + \brief The default destructor. + */ + virtual ~PxBroadcastingErrorCallback() + { + mListeners.clear(); + } + + /** + \brief Reports an error code. + \param code Error code, see #PxErrorCode + \param message Message to display. + \param file File error occured in. + \param line Line number error occured on. + */ + void reportError(PxErrorCode::Enum code, const char* message, const char* file, int line) + { + for(uint32_t i = 0; i < mListeners.size(); i++) + mListeners[i]->reportError(code, message, file, line); + } +}; +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxErrorCallback.h b/Source/ThirdParty/PhysX/foundation/PxErrorCallback.h index c0517dbef..3a9a52220 100644 --- a/Source/ThirdParty/PhysX/foundation/PxErrorCallback.h +++ b/Source/ThirdParty/PhysX/foundation/PxErrorCallback.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXERRORCALLBACK_H -#define PXFOUNDATION_PXERRORCALLBACK_H +#ifndef PX_ERROR_CALLBACK_H +#define PX_ERROR_CALLBACK_H /** \addtogroup foundation @{ @@ -70,4 +69,5 @@ class PxErrorCallback #endif /** @} */ -#endif // #ifndef PXFOUNDATION_PXERRORCALLBACK_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxErrors.h b/Source/ThirdParty/PhysX/foundation/PxErrors.h index cf86d3ba5..17311daa9 100644 --- a/Source/ThirdParty/PhysX/foundation/PxErrors.h +++ b/Source/ThirdParty/PhysX/foundation/PxErrors.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXERRORS_H -#define PXFOUNDATION_PXERRORS_H +#ifndef PX_ERRORS_H +#define PX_ERRORS_H /** \addtogroup foundation @{ */ @@ -47,7 +46,6 @@ These error codes are passed to #PxErrorCallback @see PxErrorCallback */ - struct PxErrorCode { enum Enum @@ -85,9 +83,50 @@ struct PxErrorCode }; }; +#if PX_CHECKED + #define PX_CHECK_MSG(exp, msg) (!!(exp) || (PxGetFoundation().error(physx::PxErrorCode::eINVALID_PARAMETER, PX_FL, msg), 0) ) + #define PX_CHECK_AND_RETURN(exp, msg) { if(!(exp)) { PxGetFoundation().error(physx::PxErrorCode::eINVALID_PARAMETER, PX_FL, msg); return; } } + #define PX_CHECK_AND_RETURN_NULL(exp, msg) { if(!(exp)) { PxGetFoundation().error(physx::PxErrorCode::eINVALID_PARAMETER, PX_FL, msg); return 0; } } + #define PX_CHECK_AND_RETURN_VAL(exp, msg, r) { if(!(exp)) { PxGetFoundation().error(physx::PxErrorCode::eINVALID_PARAMETER, PX_FL, msg); return r; } } +#else + #define PX_CHECK_MSG(exp, msg) + #define PX_CHECK_AND_RETURN(exp, msg) + #define PX_CHECK_AND_RETURN_NULL(exp, msg) + #define PX_CHECK_AND_RETURN_VAL(exp, msg, r) +#endif + +// shortcut macros: +// usage: PxGetFoundation().error(PX_WARN, "static friction %f is is lower than dynamic friction %d", sfr, dfr); +#define PX_WARN ::physx::PxErrorCode::eDEBUG_WARNING, PX_FL +#define PX_INFO ::physx::PxErrorCode::eDEBUG_INFO, PX_FL + +#if PX_DEBUG || PX_CHECKED + #define PX_WARN_ONCE(string) \ + { \ + static PxU32 timestamp = 0; \ + const PxU32 ts = PxGetWarnOnceTimeStamp(); \ + if(timestamp != ts) \ + { \ + timestamp = ts; \ + PxGetFoundation().error(PX_WARN, string); \ + } \ + } + #define PX_WARN_ONCE_IF(condition, string) \ + { \ + if(condition) \ + { \ + PX_WARN_ONCE(string) \ + } \ + } +#else + #define PX_WARN_ONCE(string) ((void)0) + #define PX_WARN_ONCE_IF(condition, string) ((void)0) +#endif + #if !PX_DOXYGEN } // namespace physx #endif /** @} */ -#endif // #ifndef PXFOUNDATION_PXERRORS_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxFPU.h b/Source/ThirdParty/PhysX/foundation/PxFPU.h new file mode 100644 index 000000000..f7668a6e4 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxFPU.h @@ -0,0 +1,99 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_FPU_H +#define PX_FPU_H + +#include "foundation/PxIntrinsics.h" +#include "foundation/PxAssert.h" +#include "foundation/PxFoundationConfig.h" + +#define PX_IR(x) ((PxU32&)(x)) // integer representation of a floating-point value. +#define PX_SIR(x) ((PxI32&)(x)) // signed integer representation of a floating-point value. +#define PX_FR(x) ((PxReal&)(x)) // floating-point representation of a integer value. + +#define PX_FPU_GUARD PxFPUGuard scopedFpGuard; +#define PX_SIMD_GUARD PxSIMDGuard scopedFpGuard; +#define PX_SIMD_GUARD_CNDT(x) PxSIMDGuard scopedFpGuard(x); + +#if !PX_DOXYGEN +namespace physx +{ +#endif +// sets the default SDK state for scalar and SIMD units +class PX_FOUNDATION_API PxFPUGuard +{ + public: + PxFPUGuard(); // set fpu control word for PhysX + ~PxFPUGuard(); // restore fpu control word + private: + PxU32 mControlWords[8]; +}; + +// sets default SDK state for simd unit only, lighter weight than FPUGuard +class PxSIMDGuard +{ + public: + PX_INLINE PxSIMDGuard(bool enable = true); // set simd control word for PhysX + PX_INLINE ~PxSIMDGuard(); // restore simd control word + private: +#if !(PX_LINUX || PX_OSX) || (!PX_EMSCRIPTEN && PX_INTEL_FAMILY) + PxU32 mControlWord; + bool mEnabled; +#endif +}; + +/** +\brief Enables floating point exceptions for the scalar and SIMD unit +*/ +PX_FOUNDATION_API void PxEnableFPExceptions(); + +/** +\brief Disables floating point exceptions for the scalar and SIMD unit +*/ +PX_FOUNDATION_API void PxDisableFPExceptions(); + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#if PX_WINDOWS_FAMILY +#include "foundation/windows/PxWindowsFPU.h" +#elif ((PX_LINUX || PX_OSX || PX_PS4 || PX_PS5) && PX_SSE2) +#include "foundation/unix/PxUnixFPU.h" +#else +PX_INLINE physx::PxSIMDGuard::PxSIMDGuard(bool) +{ +} +PX_INLINE physx::PxSIMDGuard::~PxSIMDGuard() +{ +} +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxFlags.h b/Source/ThirdParty/PhysX/foundation/PxFlags.h index 85dce4ede..65d6ed2b8 100644 --- a/Source/ThirdParty/PhysX/foundation/PxFlags.h +++ b/Source/ThirdParty/PhysX/foundation/PxFlags.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXFLAGS_H -#define PXFOUNDATION_PXFLAGS_H +#ifndef PX_FLAGS_H +#define PX_FLAGS_H /** \addtogroup foundation @{ @@ -83,8 +82,6 @@ class PxFlags PX_CUDA_CALLABLE PX_INLINE PxFlags(const PxFlags& f); PX_CUDA_CALLABLE PX_INLINE explicit PxFlags(storagetype b); - PX_CUDA_CALLABLE PX_INLINE bool isSet(enumtype e) const; - PX_CUDA_CALLABLE PX_INLINE PxFlags& set(enumtype e); PX_CUDA_CALLABLE PX_INLINE bool operator==(enumtype e) const; PX_CUDA_CALLABLE PX_INLINE bool operator==(const PxFlags& f) const; PX_CUDA_CALLABLE PX_INLINE bool operator==(bool b) const; @@ -117,6 +114,9 @@ class PxFlags PX_CUDA_CALLABLE PX_INLINE operator uint32_t(void) const; PX_CUDA_CALLABLE PX_INLINE void clear(enumtype e); + PX_CUDA_CALLABLE PX_INLINE void raise(enumtype e); + PX_CUDA_CALLABLE PX_INLINE bool isSet(enumtype e) const; + PX_CUDA_CALLABLE PX_INLINE PxFlags& setAll(enumtype e); public: friend PX_INLINE PxFlags operator&(enumtype a, PxFlags& b) @@ -132,26 +132,26 @@ class PxFlags #if !PX_DOXYGEN -#define PX_FLAGS_OPERATORS(enumtype, storagetype) \ - PX_CUDA_CALLABLE PX_INLINE PxFlags operator|(enumtype a, enumtype b) \ - { \ - PxFlags r(a); \ - r |= b; \ - return r; \ - } \ - PX_CUDA_CALLABLE PX_INLINE PxFlags operator&(enumtype a, enumtype b) \ - { \ - PxFlags r(a); \ - r &= b; \ - return r; \ - } \ - PX_CUDA_CALLABLE PX_INLINE PxFlags operator~(enumtype a) \ - { \ - return ~PxFlags(a); \ +#define PX_FLAGS_OPERATORS(enumtype, storagetype) \ + PX_CUDA_CALLABLE PX_INLINE PxFlags operator|(enumtype a, enumtype b) \ + { \ + PxFlags r(a); \ + r |= b; \ + return r; \ + } \ + PX_CUDA_CALLABLE PX_INLINE PxFlags operator&(enumtype a, enumtype b) \ + { \ + PxFlags r(a); \ + r &= b; \ + return r; \ + } \ + PX_CUDA_CALLABLE PX_INLINE PxFlags operator~(enumtype a) \ + { \ + return ~PxFlags(a); \ } -#define PX_FLAGS_TYPEDEF(x, y) \ - typedef PxFlags x##s; \ +#define PX_FLAGS_TYPEDEF(x, y) \ + typedef PxFlags x##s; \ PX_FLAGS_OPERATORS(x::Enum, y) template @@ -178,19 +178,6 @@ PX_CUDA_CALLABLE PX_INLINE PxFlags::PxFlags(storagetype b mBits = b; } -template -PX_CUDA_CALLABLE PX_INLINE bool PxFlags::isSet(enumtype e) const -{ - return (mBits & static_cast(e)) == static_cast(e); -} - -template -PX_CUDA_CALLABLE PX_INLINE PxFlags& PxFlags::set(enumtype e) -{ - mBits = static_cast(e); - return *this; -} - template PX_CUDA_CALLABLE PX_INLINE bool PxFlags::operator==(enumtype e) const { @@ -369,8 +356,28 @@ PX_CUDA_CALLABLE PX_INLINE void PxFlags::clear(enumtype e mBits &= ~static_cast(e); } +template +PX_CUDA_CALLABLE PX_INLINE void PxFlags::raise(enumtype e) +{ + mBits |= static_cast(e); +} + +template +PX_CUDA_CALLABLE PX_INLINE bool PxFlags::isSet(enumtype e) const +{ + return (mBits & static_cast(e)) == static_cast(e); +} + +template +PX_CUDA_CALLABLE PX_INLINE PxFlags& PxFlags::setAll(enumtype e) +{ + mBits = static_cast(e); + return *this; +} + } // namespace physx #endif //!PX_DOXYGEN /** @} */ -#endif // #ifndef PXFOUNDATION_PXFLAGS_H +#endif + diff --git a/Source/ThirdParty/PhysX/PxFoundation.h b/Source/ThirdParty/PhysX/foundation/PxFoundation.h similarity index 64% rename from Source/ThirdParty/PhysX/PxFoundation.h rename to Source/ThirdParty/PhysX/foundation/PxFoundation.h index 4a4a14dfd..c103b2d55 100644 --- a/Source/ThirdParty/PhysX/PxFoundation.h +++ b/Source/ThirdParty/PhysX/foundation/PxFoundation.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_FOUNDATION_PX_FOUNDATION_H -#define PX_FOUNDATION_PX_FOUNDATION_H +#ifndef PX_FOUNDATION_H +#define PX_FOUNDATION_H /** \addtogroup foundation @{ @@ -37,12 +36,18 @@ #include "foundation/Px.h" #include "foundation/PxErrors.h" #include "foundation/PxFoundationConfig.h" +#include "foundation/PxErrors.h" + +#include #if !PX_DOXYGEN namespace physx { #endif +class PxAllocationListener; +class PxErrorCallback; + /** \brief Foundation SDK singleton class. @@ -55,8 +60,7 @@ class PX_FOUNDATION_API PxFoundation \brief Destroys the instance it is called on. The operation will fail, if there are still modules referencing the foundation object. Release all dependent modules - prior - to calling this method. + prior to calling this method. @see PxCreateFoundation() */ @@ -93,6 +97,18 @@ class PX_FOUNDATION_API PxFoundation */ virtual void setReportAllocationNames(bool value) = 0; + virtual void registerAllocationListener(PxAllocationListener& listener) = 0; + + virtual void deregisterAllocationListener(PxAllocationListener& listener) = 0; + + virtual void registerErrorCallback(PxErrorCallback& callback) = 0; + + virtual void deregisterErrorCallback(PxErrorCallback& callback) = 0; + + virtual bool error(PxErrorCode::Enum c, const char* file, int line, const char* messageFmt, ...) = 0; + + virtual bool error(PxErrorCode::Enum, const char* file, int line, const char* messageFmt, va_list) = 0; + protected: virtual ~PxFoundation() { @@ -103,6 +119,15 @@ class PX_FOUNDATION_API PxFoundation } // namespace physx #endif +// PT: use this to make generated code shorter (e.g. from 52 to 24 bytes of assembly (10 to 4 instructions)) +// We must use a macro here to let __FILE__ expand to the proper filename (it doesn't work with an inlined function). +#define PX_IMPLEMENT_OUTPUT_ERROR \ +template \ +static PX_NOINLINE bool outputError(int line, const char* message) \ +{ \ + return PxGetFoundation().error(PxErrorCode::Enum(errorCode), __FILE__, line, message); \ +} + /** \brief Creates an instance of the foundation class @@ -117,9 +142,12 @@ returned. @see PxFoundation */ +PX_C_EXPORT PX_FOUNDATION_API physx::PxFoundation* PX_CALL_CONV PxCreateFoundation(physx::PxU32 version, physx::PxAllocatorCallback& allocator, physx::PxErrorCallback& errorCallback); + + +PX_C_EXPORT PX_FOUNDATION_API void PX_CALL_CONV PxSetFoundationInstance(physx::PxFoundation& foundation); + -PX_C_EXPORT PX_FOUNDATION_API physx::PxFoundation* PX_CALL_CONV -PxCreateFoundation(physx::PxU32 version, physx::PxAllocatorCallback& allocator, physx::PxErrorCallback& errorCallback); /** \brief Retrieves the Foundation SDK after it has been created. @@ -140,10 +168,16 @@ PX_C_EXPORT PX_FOUNDATION_API physx::PxFoundation& PX_CALL_CONV PxGetFoundation( #endif // PX_LINUX #endif // PX_CLANG +#if !PX_DOXYGEN namespace physx { +#endif class PxProfilerCallback; -} +class PxAllocatorCallback; +class PxErrorCallback; +#if !PX_DOXYGEN +} // namespace physx +#endif /** \brief Get the callback that will be used for all profiling. @@ -155,5 +189,41 @@ PX_C_EXPORT PX_FOUNDATION_API physx::PxProfilerCallback* PX_CALL_CONV PxGetProfi */ PX_C_EXPORT PX_FOUNDATION_API void PX_CALL_CONV PxSetProfilerCallback(physx::PxProfilerCallback* profiler); +/** +\brief Get the allocator callback +*/ +PX_C_EXPORT PX_FOUNDATION_API physx::PxAllocatorCallback* PX_CALL_CONV PxGetAllocatorCallback(); + +/** +\brief Get the broadcasting allocator callback +*/ +PX_C_EXPORT PX_FOUNDATION_API physx::PxAllocatorCallback* PX_CALL_CONV PxGetBroadcastAllocator(); + +/** +\brief Get the error callback +*/ +PX_C_EXPORT PX_FOUNDATION_API physx::PxErrorCallback* PX_CALL_CONV PxGetErrorCallback(); + +/** +\brief Get the broadcasting error callback +*/ +PX_C_EXPORT PX_FOUNDATION_API physx::PxErrorCallback* PX_CALL_CONV PxGetBroadcastError(); + +/** +\brief Get the warn once timestamp +*/ +PX_C_EXPORT PX_FOUNDATION_API physx::PxU32 PX_CALL_CONV PxGetWarnOnceTimeStamp(); + +/** +\brief Decrement the ref count of PxFoundation +*/ +PX_C_EXPORT PX_FOUNDATION_API void PX_CALL_CONV PxDecFoundationRefCount(); + +/** +\brief Increment the ref count of PxFoundation +*/ +PX_C_EXPORT PX_FOUNDATION_API void PX_CALL_CONV PxIncFoundationRefCount(); + /** @} */ -#endif // PX_FOUNDATION_PX_FOUNDATION_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxFoundationConfig.h b/Source/ThirdParty/PhysX/foundation/PxFoundationConfig.h index a2e74ecea..cae286da4 100644 --- a/Source/ThirdParty/PhysX/foundation/PxFoundationConfig.h +++ b/Source/ThirdParty/PhysX/foundation/PxFoundationConfig.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_FOUNDATION_PX_FOUNDATION_CONFIG_H -#define PX_FOUNDATION_PX_FOUNDATION_CONFIG_H +#ifndef PX_FOUNDATION_CONFIG_H +#define PX_FOUNDATION_CONFIG_H #include "foundation/PxPreprocessor.h" @@ -39,7 +38,7 @@ #if defined PX_PHYSX_STATIC_LIB #define PX_FOUNDATION_API #else - #if (PX_WINDOWS_FAMILY || PX_XBOXONE || PX_PS4) && !defined(__CUDACC__) + #if (PX_WINDOWS_FAMILY || PX_PS4 || PX_PS5) && !defined(__CUDACC__) #if defined PX_PHYSX_FOUNDATION_EXPORTS #define PX_FOUNDATION_API __declspec(dllexport) #else @@ -54,4 +53,4 @@ /** @} */ -#endif // PX_FOUNDATION_PX_ASSERT_H +#endif diff --git a/Source/ThirdParty/PhysX/foundation/PxHash.h b/Source/ThirdParty/PhysX/foundation/PxHash.h new file mode 100644 index 000000000..43ea55215 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxHash.h @@ -0,0 +1,163 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_HASH_H +#define PX_HASH_H + +#include "foundation/PxBasicTemplates.h" +#include "foundation/PxString.h" + +#if PX_VC +#pragma warning(push) +#pragma warning(disable : 4302) +#endif + +#if PX_LINUX +#include "foundation/PxSimpleTypes.h" +#endif + +/*! +Central definition of hash functions +*/ + +#if !PX_DOXYGEN +namespace physx +{ +#endif +// Hash functions + +// Thomas Wang's 32 bit mix +// http://www.cris.com/~Ttwang/tech/inthash.htm +PX_FORCE_INLINE uint32_t PxComputeHash(const uint32_t key) +{ + uint32_t k = key; + k += ~(k << 15); + k ^= (k >> 10); + k += (k << 3); + k ^= (k >> 6); + k += ~(k << 11); + k ^= (k >> 16); + return uint32_t(k); +} + +PX_FORCE_INLINE uint32_t PxComputeHash(const int32_t key) +{ + return PxComputeHash(uint32_t(key)); +} + +// Thomas Wang's 64 bit mix +// http://www.cris.com/~Ttwang/tech/inthash.htm +PX_FORCE_INLINE uint32_t PxComputeHash(const uint64_t key) +{ + uint64_t k = key; + k += ~(k << 32); + k ^= (k >> 22); + k += ~(k << 13); + k ^= (k >> 8); + k += (k << 3); + k ^= (k >> 15); + k += ~(k << 27); + k ^= (k >> 31); + return uint32_t(UINT32_MAX & k); +} + +#if PX_APPLE_FAMILY +// hash for size_t, to make gcc happy +PX_INLINE uint32_t PxComputeHash(const size_t key) +{ +#if PX_P64_FAMILY + return PxComputeHash(uint64_t(key)); +#else + return PxComputeHash(uint32_t(key)); +#endif +} +#endif + +// Hash function for pointers +PX_INLINE uint32_t PxComputeHash(const void* ptr) +{ +#if PX_P64_FAMILY + return PxComputeHash(uint64_t(ptr)); +#else + return PxComputeHash(uint32_t(UINT32_MAX & size_t(ptr))); +#endif +} + +// Hash function for pairs +template +PX_INLINE uint32_t PxComputeHash(const PxPair& p) +{ + uint32_t seed = 0x876543; + uint32_t m = 1000007; + return PxComputeHash(p.second) ^ (m * (PxComputeHash(p.first) ^ (m * seed))); +} + +// hash object for hash map template parameter +template +struct PxHash +{ + uint32_t operator()(const Key& k) const + { + return PxComputeHash(k); + } + bool equal(const Key& k0, const Key& k1) const + { + return k0 == k1; + } +}; + +// specialization for strings +template <> +struct PxHash +{ + public: + uint32_t operator()(const char* _string) const + { + // "DJB" string hash + const uint8_t* string = reinterpret_cast(_string); + uint32_t h = 5381; + for(const uint8_t* ptr = string; *ptr; ptr++) + h = ((h << 5) + h) ^ uint32_t(*ptr); + return h; + } + bool equal(const char* string0, const char* string1) const + { + return !Pxstrcmp(string0, string1); + } +}; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#if PX_VC +#pragma warning(pop) +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxHashInternals.h b/Source/ThirdParty/PhysX/foundation/PxHashInternals.h new file mode 100644 index 000000000..024084da2 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxHashInternals.h @@ -0,0 +1,792 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_HASH_INTERNALS_H +#define PX_HASH_INTERNALS_H + +#include "foundation/PxAllocator.h" +#include "foundation/PxBitUtils.h" +#include "foundation/PxMathIntrinsics.h" +#include "foundation/PxBasicTemplates.h" +#include "foundation/PxHash.h" + +#if PX_VC +#pragma warning(push) +#pragma warning(disable : 4127) // conditional expression is constant +#endif +#if !PX_DOXYGEN +namespace physx +{ +#endif +template +class PxHashBase : private PxAllocator +{ + void init(uint32_t initialTableSize, float loadFactor) + { + mBuffer = NULL; + mEntries = NULL; + mEntriesNext = NULL; + mHash = NULL; + mEntriesCapacity = 0; + mHashSize = 0; + mLoadFactor = loadFactor; + mFreeList = uint32_t(EOL); + mTimestamp = 0; + mEntriesCount = 0; + + if(initialTableSize) + reserveInternal(initialTableSize); + } + + public: + typedef Entry EntryType; + + PxHashBase(uint32_t initialTableSize = 64, float loadFactor = 0.75f) : PxAllocator("hashBase") + { + init(initialTableSize, loadFactor); + } + + PxHashBase(uint32_t initialTableSize, float loadFactor, const PxAllocator& alloc) : PxAllocator(alloc) + { + init(initialTableSize, loadFactor); + } + + PxHashBase(const PxAllocator& alloc) : PxAllocator(alloc) + { + init(64, 0.75f); + } + + ~PxHashBase() + { + destroy(); // No need to clear() + + if(mBuffer) + PxAllocator::deallocate(mBuffer); + } + + static const uint32_t EOL = 0xffffffff; + + PX_INLINE Entry* create(const Key& k, bool& exists) + { + uint32_t h = 0; + if(mHashSize) + { + h = hash(k); + uint32_t index = mHash[h]; + while(index != EOL && !HashFn().equal(GetKey()(mEntries[index]), k)) + index = mEntriesNext[index]; + exists = index != EOL; + if(exists) + return mEntries + index; + } + else + exists = false; + + if(freeListEmpty()) + { + grow(); + h = hash(k); + } + + uint32_t entryIndex = freeListGetNext(); + + mEntriesNext[entryIndex] = mHash[h]; + mHash[h] = entryIndex; + + mEntriesCount++; + mTimestamp++; + + return mEntries + entryIndex; + } + + PX_INLINE const Entry* find(const Key& k) const + { + if(!mEntriesCount) + return NULL; + + const uint32_t h = hash(k); + uint32_t index = mHash[h]; + while(index != EOL && !HashFn().equal(GetKey()(mEntries[index]), k)) + index = mEntriesNext[index]; + return index != EOL ? mEntries + index : NULL; + } + + PX_INLINE bool erase(const Key& k, Entry& e) + { + if(!mEntriesCount) + return false; + + const uint32_t h = hash(k); + uint32_t* ptr = mHash + h; + while(*ptr != EOL && !HashFn().equal(GetKey()(mEntries[*ptr]), k)) + ptr = mEntriesNext + *ptr; + + if(*ptr == EOL) + return false; + + PX_PLACEMENT_NEW(&e, Entry)(mEntries[*ptr]); + + return eraseInternal(ptr); + } + + PX_INLINE bool erase(const Key& k) + { + if(!mEntriesCount) + return false; + + const uint32_t h = hash(k); + uint32_t* ptr = mHash + h; + while(*ptr != EOL && !HashFn().equal(GetKey()(mEntries[*ptr]), k)) + ptr = mEntriesNext + *ptr; + + if(*ptr == EOL) + return false; + + return eraseInternal(ptr); + } + + PX_INLINE uint32_t size() const + { + return mEntriesCount; + } + + PX_INLINE uint32_t capacity() const + { + return mHashSize; + } + + void clear() + { + if(!mHashSize || mEntriesCount == 0) + return; + + destroy(); + + intrinsics::memSet(mHash, EOL, mHashSize * sizeof(uint32_t)); + + const uint32_t sizeMinus1 = mEntriesCapacity - 1; + for(uint32_t i = 0; i < sizeMinus1; i++) + { + PxPrefetchLine(mEntriesNext + i, 128); + mEntriesNext[i] = i + 1; + } + mEntriesNext[mEntriesCapacity - 1] = uint32_t(EOL); + mFreeList = 0; + mEntriesCount = 0; + } + + void reserve(uint32_t size) + { + if(size > mHashSize) + reserveInternal(size); + } + + PX_INLINE const Entry* getEntries() const + { + return mEntries; + } + + PX_INLINE Entry* insertUnique(const Key& k) + { + PX_ASSERT(find(k) == NULL); + uint32_t h = hash(k); + + uint32_t entryIndex = freeListGetNext(); + + mEntriesNext[entryIndex] = mHash[h]; + mHash[h] = entryIndex; + + mEntriesCount++; + mTimestamp++; + + return mEntries + entryIndex; + } + + private: + void destroy() + { + for(uint32_t i = 0; i < mHashSize; i++) + { + for(uint32_t j = mHash[i]; j != EOL; j = mEntriesNext[j]) + mEntries[j].~Entry(); + } + } + + template + PX_NOINLINE void copy(const PxHashBase& other); + + // free list management - if we're coalescing, then we use mFreeList to hold + // the top of the free list and it should always be equal to size(). Otherwise, + // we build a free list in the next() pointers. + + PX_INLINE void freeListAdd(uint32_t index) + { + if(compacting) + { + mFreeList--; + PX_ASSERT(mFreeList == mEntriesCount); + } + else + { + mEntriesNext[index] = mFreeList; + mFreeList = index; + } + } + + PX_INLINE void freeListAdd(uint32_t start, uint32_t end) + { + if(!compacting) + { + for(uint32_t i = start; i < end - 1; i++) // add the new entries to the free list + mEntriesNext[i] = i + 1; + + // link in old free list + mEntriesNext[end - 1] = mFreeList; + PX_ASSERT(mFreeList != end - 1); + mFreeList = start; + } + else if(mFreeList == EOL) // don't reset the free ptr for the compacting hash unless it's empty + mFreeList = start; + } + + PX_INLINE uint32_t freeListGetNext() + { + PX_ASSERT(!freeListEmpty()); + if(compacting) + { + PX_ASSERT(mFreeList == mEntriesCount); + return mFreeList++; + } + else + { + uint32_t entryIndex = mFreeList; + mFreeList = mEntriesNext[mFreeList]; + return entryIndex; + } + } + + PX_INLINE bool freeListEmpty() const + { + if(compacting) + return mEntriesCount == mEntriesCapacity; + else + return mFreeList == EOL; + } + + PX_INLINE void replaceWithLast(uint32_t index) + { + PX_PLACEMENT_NEW(mEntries + index, Entry)(mEntries[mEntriesCount]); + mEntries[mEntriesCount].~Entry(); + mEntriesNext[index] = mEntriesNext[mEntriesCount]; + + uint32_t h = hash(GetKey()(mEntries[index])); + uint32_t* ptr; + for(ptr = mHash + h; *ptr != mEntriesCount; ptr = mEntriesNext + *ptr) + PX_ASSERT(*ptr != EOL); + *ptr = index; + } + + PX_INLINE uint32_t hash(const Key& k, uint32_t hashSize) const + { + return HashFn()(k) & (hashSize - 1); + } + + PX_INLINE uint32_t hash(const Key& k) const + { + return hash(k, mHashSize); + } + + PX_INLINE bool eraseInternal(uint32_t* ptr) + { + const uint32_t index = *ptr; + + *ptr = mEntriesNext[index]; + + mEntries[index].~Entry(); + + mEntriesCount--; + mTimestamp++; + + if (compacting && index != mEntriesCount) + replaceWithLast(index); + + freeListAdd(index); + return true; + } + + PX_NOINLINE void reserveInternal(uint32_t size) + { + if(!PxIsPowerOfTwo(size)) + size = PxNextPowerOfTwo(size); + + PX_ASSERT(!(size & (size - 1))); + + // decide whether iteration can be done on the entries directly + bool resizeCompact = compacting || freeListEmpty(); + + // define new table sizes + uint32_t oldEntriesCapacity = mEntriesCapacity; + uint32_t newEntriesCapacity = uint32_t(float(size) * mLoadFactor); + uint32_t newHashSize = size; + + // allocate new common buffer and setup pointers to new tables + uint8_t* newBuffer; + uint32_t* newHash; + uint32_t* newEntriesNext; + Entry* newEntries; + { + uint32_t newHashByteOffset = 0; + uint32_t newEntriesNextBytesOffset = newHashByteOffset + newHashSize * sizeof(uint32_t); + uint32_t newEntriesByteOffset = newEntriesNextBytesOffset + newEntriesCapacity * sizeof(uint32_t); + newEntriesByteOffset += (16 - (newEntriesByteOffset & 15)) & 15; + uint32_t newBufferByteSize = newEntriesByteOffset + newEntriesCapacity * sizeof(Entry); + + newBuffer = reinterpret_cast(PxAllocator::allocate(newBufferByteSize, __FILE__, __LINE__)); + PX_ASSERT(newBuffer); + + newHash = reinterpret_cast(newBuffer + newHashByteOffset); + newEntriesNext = reinterpret_cast(newBuffer + newEntriesNextBytesOffset); + newEntries = reinterpret_cast(newBuffer + newEntriesByteOffset); + } + + // initialize new hash table + intrinsics::memSet(newHash, uint32_t(EOL), newHashSize * sizeof(uint32_t)); + + // iterate over old entries, re-hash and create new entries + if(resizeCompact) + { + // check that old free list is empty - we don't need to copy the next entries + PX_ASSERT(compacting || mFreeList == EOL); + + for(uint32_t index = 0; index < mEntriesCount; ++index) + { + uint32_t h = hash(GetKey()(mEntries[index]), newHashSize); + newEntriesNext[index] = newHash[h]; + newHash[h] = index; + + PX_PLACEMENT_NEW(newEntries + index, Entry)(mEntries[index]); + mEntries[index].~Entry(); + } + } + else + { + // copy old free list, only required for non compact resizing + intrinsics::memCopy(newEntriesNext, mEntriesNext, mEntriesCapacity * sizeof(uint32_t)); + + for(uint32_t bucket = 0; bucket < mHashSize; bucket++) + { + uint32_t index = mHash[bucket]; + while(index != EOL) + { + uint32_t h = hash(GetKey()(mEntries[index]), newHashSize); + newEntriesNext[index] = newHash[h]; + PX_ASSERT(index != newHash[h]); + + newHash[h] = index; + + PX_PLACEMENT_NEW(newEntries + index, Entry)(mEntries[index]); + mEntries[index].~Entry(); + + index = mEntriesNext[index]; + } + } + } + + // swap buffer and pointers + PxAllocator::deallocate(mBuffer); + mBuffer = newBuffer; + mHash = newHash; + mHashSize = newHashSize; + mEntriesNext = newEntriesNext; + mEntries = newEntries; + mEntriesCapacity = newEntriesCapacity; + + freeListAdd(oldEntriesCapacity, newEntriesCapacity); + } + + void grow() + { + PX_ASSERT((mFreeList == EOL) || (compacting && (mEntriesCount == mEntriesCapacity))); + + uint32_t size = mHashSize == 0 ? 16 : mHashSize * 2; + reserve(size); + } + + uint8_t* mBuffer; + Entry* mEntries; + uint32_t* mEntriesNext; // same size as mEntries + uint32_t* mHash; + uint32_t mEntriesCapacity; + uint32_t mHashSize; + float mLoadFactor; + uint32_t mFreeList; + uint32_t mTimestamp; + uint32_t mEntriesCount; // number of entries + + public: + class Iter + { + public: + PX_INLINE Iter(PxHashBase& b) : mBucket(0), mEntry(uint32_t(b.EOL)), mTimestamp(b.mTimestamp), mBase(b) + { + if(mBase.mEntriesCapacity > 0) + { + mEntry = mBase.mHash[0]; + skip(); + } + } + + PX_INLINE void check() const + { + PX_ASSERT(mTimestamp == mBase.mTimestamp); + } + PX_INLINE const Entry& operator*() const + { + check(); + return mBase.mEntries[mEntry]; + } + PX_INLINE Entry& operator*() + { + check(); + return mBase.mEntries[mEntry]; + } + PX_INLINE const Entry* operator->() const + { + check(); + return mBase.mEntries + mEntry; + } + PX_INLINE Entry* operator->() + { + check(); + return mBase.mEntries + mEntry; + } + PX_INLINE Iter operator++() + { + check(); + advance(); + return *this; + } + PX_INLINE Iter operator++(int) + { + check(); + Iter i = *this; + advance(); + return i; + } + PX_INLINE bool done() const + { + check(); + return mEntry == mBase.EOL; + } + + private: + PX_INLINE void advance() + { + mEntry = mBase.mEntriesNext[mEntry]; + skip(); + } + PX_INLINE void skip() + { + while(mEntry == mBase.EOL) + { + if(++mBucket == mBase.mHashSize) + break; + mEntry = mBase.mHash[mBucket]; + } + } + + Iter& operator=(const Iter&); + + uint32_t mBucket; + uint32_t mEntry; + uint32_t mTimestamp; + PxHashBase& mBase; + }; + + /*! + Iterate over entries in a hash base and allow entry erase while iterating + */ + class PxEraseIterator + { + public: + PX_INLINE PxEraseIterator(PxHashBase& b): mBase(b) + { + reset(); + } + + PX_INLINE Entry* eraseCurrentGetNext(bool eraseCurrent) + { + if(eraseCurrent && mCurrentEntryIndexPtr) + { + mBase.eraseInternal(mCurrentEntryIndexPtr); + // if next was valid return the same ptr, if next was EOL search new hash entry + if(*mCurrentEntryIndexPtr != mBase.EOL) + return mBase.mEntries + *mCurrentEntryIndexPtr; + else + return traverseHashEntries(); + } + + // traverse mHash to find next entry + if(mCurrentEntryIndexPtr == NULL) + return traverseHashEntries(); + + const uint32_t index = *mCurrentEntryIndexPtr; + if(mBase.mEntriesNext[index] == mBase.EOL) + { + return traverseHashEntries(); + } + else + { + mCurrentEntryIndexPtr = mBase.mEntriesNext + index; + return mBase.mEntries + *mCurrentEntryIndexPtr; + } + } + + PX_INLINE void reset() + { + mCurrentHashIndex = 0; + mCurrentEntryIndexPtr = NULL; + } + + private: + PX_INLINE Entry* traverseHashEntries() + { + mCurrentEntryIndexPtr = NULL; + while (mCurrentEntryIndexPtr == NULL && mCurrentHashIndex < mBase.mHashSize) + { + if (mBase.mHash[mCurrentHashIndex] != mBase.EOL) + { + mCurrentEntryIndexPtr = mBase.mHash + mCurrentHashIndex; + mCurrentHashIndex++; + return mBase.mEntries + *mCurrentEntryIndexPtr; + } + else + { + mCurrentHashIndex++; + } + } + return NULL; + } + + PxEraseIterator& operator=(const PxEraseIterator&); + private: + uint32_t* mCurrentEntryIndexPtr; + uint32_t mCurrentHashIndex; + PxHashBase& mBase; + }; +}; + +template +template +PX_NOINLINE void +PxHashBase::copy(const PxHashBase& other) +{ + reserve(other.mEntriesCount); + + for(uint32_t i = 0; i < other.mEntriesCount; i++) + { + for(uint32_t j = other.mHash[i]; j != EOL; j = other.mEntriesNext[j]) + { + const Entry& otherEntry = other.mEntries[j]; + + bool exists; + Entry* newEntry = create(GK()(otherEntry), exists); + PX_ASSERT(!exists); + + PX_PLACEMENT_NEW(newEntry, Entry)(otherEntry); + } + } +} + +template ::Type, bool Coalesced = false> +class PxHashSetBase +{ + PX_NOCOPY(PxHashSetBase) + public: + struct GetKey + { + PX_INLINE const Key& operator()(const Key& e) + { + return e; + } + }; + + typedef PxHashBase BaseMap; + typedef typename BaseMap::Iter Iterator; + + PxHashSetBase(uint32_t initialTableSize, float loadFactor, const PxAllocator& alloc) + : mBase(initialTableSize, loadFactor, alloc) + { + } + + PxHashSetBase(const PxAllocator& alloc) : mBase(64, 0.75f, alloc) + { + } + + PxHashSetBase(uint32_t initialTableSize = 64, float loadFactor = 0.75f) : mBase(initialTableSize, loadFactor) + { + } + + bool insert(const Key& k) + { + bool exists; + Key* e = mBase.create(k, exists); + if(!exists) + PX_PLACEMENT_NEW(e, Key)(k); + return !exists; + } + + PX_INLINE bool contains(const Key& k) const + { + return mBase.find(k) != 0; + } + PX_INLINE bool erase(const Key& k) + { + return mBase.erase(k); + } + PX_INLINE uint32_t size() const + { + return mBase.size(); + } + PX_INLINE uint32_t capacity() const + { + return mBase.capacity(); + } + PX_INLINE void reserve(uint32_t size) + { + mBase.reserve(size); + } + PX_INLINE void clear() + { + mBase.clear(); + } + + protected: + BaseMap mBase; +}; + +template >::Type> +class PxHashMapBase +{ + PX_NOCOPY(PxHashMapBase) + public: + typedef PxPair Entry; + + struct GetKey + { + PX_INLINE const Key& operator()(const Entry& e) + { + return e.first; + } + }; + + typedef PxHashBase BaseMap; + typedef typename BaseMap::Iter Iterator; + typedef typename BaseMap::PxEraseIterator EraseIterator; + + PxHashMapBase(uint32_t initialTableSize, float loadFactor, const PxAllocator& alloc) + : mBase(initialTableSize, loadFactor, alloc) + { + } + + PxHashMapBase(const PxAllocator& alloc) : mBase(64, 0.75f, alloc) + { + } + + PxHashMapBase(uint32_t initialTableSize = 64, float loadFactor = 0.75f) : mBase(initialTableSize, loadFactor) + { + } + + bool insert(const Key /*&*/ k, const Value /*&*/ v) + { + bool exists; + Entry* e = mBase.create(k, exists); + if(!exists) + PX_PLACEMENT_NEW(e, Entry)(k, v); + return !exists; + } + + Value& operator[](const Key& k) + { + bool exists; + Entry* e = mBase.create(k, exists); + if(!exists) + PX_PLACEMENT_NEW(e, Entry)(k, Value()); + + return e->second; + } + + PX_INLINE const Entry* find(const Key& k) const + { + return mBase.find(k); + } + PX_INLINE bool erase(const Key& k) + { + return mBase.erase(k); + } + PX_INLINE bool erase(const Key& k, Entry& e) + { + return mBase.erase(k, e); + } + PX_INLINE uint32_t size() const + { + return mBase.size(); + } + PX_INLINE uint32_t capacity() const + { + return mBase.capacity(); + } + PX_INLINE Iterator getIterator() + { + return Iterator(mBase); + } + PX_INLINE EraseIterator getEraseIterator() + { + return EraseIterator(mBase); + } + PX_INLINE void reserve(uint32_t size) + { + mBase.reserve(size); + } + PX_INLINE void clear() + { + mBase.clear(); + } + + protected: + BaseMap mBase; +}; +#if !PX_DOXYGEN +} // namespace physx +#endif + +#if PX_VC +#pragma warning(pop) +#endif +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxHashMap.h b/Source/ThirdParty/PhysX/foundation/PxHashMap.h new file mode 100644 index 000000000..cc34ae177 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxHashMap.h @@ -0,0 +1,119 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_HASHMAP_H +#define PX_HASHMAP_H + +#include "foundation/PxHashInternals.h" + +// TODO: make this doxy-format +// +// This header defines two hash maps. Hash maps +// * support custom initial table sizes (rounded up internally to power-of-2) +// * support custom static allocator objects +// * auto-resize, based on a load factor (i.e. a 64-entry .75 load factor hash will resize +// when the 49th element is inserted) +// * are based on open hashing +// * have O(1) contains, erase +// +// Maps have STL-like copying semantics, and properly initialize and destruct copies of objects +// +// There are two forms of map: coalesced and uncoalesced. Coalesced maps keep the entries in the +// initial segment of an array, so are fast to iterate over; however deletion is approximately +// twice as expensive. +// +// HashMap: +// bool insert(const Key& k, const Value& v) O(1) amortized (exponential resize policy) +// Value & operator[](const Key& k) O(1) for existing objects, else O(1) amortized +// const Entry * find(const Key& k); O(1) +// bool erase(const T& k); O(1) +// uint32_t size(); constant +// void reserve(uint32_t size); O(MAX(currentOccupancy,size)) +// void clear(); O(currentOccupancy) (with zero constant for objects +// without +// destructors) +// Iterator getIterator(); +// +// operator[] creates an entry if one does not exist, initializing with the default constructor. +// CoalescedHashMap does not support getIterator, but instead supports +// const Key *getEntries(); +// +// Use of iterators: +// +// for(HashMap::Iterator iter = test.getIterator(); !iter.done(); ++iter) +// myFunction(iter->first, iter->second); + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +template , class Allocator = PxAllocator> +class PxHashMap : public physx::PxHashMapBase +{ + public: + typedef physx::PxHashMapBase HashMapBase; + typedef typename HashMapBase::Iterator Iterator; + + PxHashMap(uint32_t initialTableSize = 64, float loadFactor = 0.75f) : HashMapBase(initialTableSize, loadFactor) + { + } + PxHashMap(uint32_t initialTableSize, float loadFactor, const Allocator& alloc) + : HashMapBase(initialTableSize, loadFactor, alloc) + { + } + PxHashMap(const Allocator& alloc) : HashMapBase(64, 0.75f, alloc) + { + } + Iterator getIterator() + { + return Iterator(HashMapBase::mBase); + } +}; + +template , class Allocator = PxAllocator> +class PxCoalescedHashMap : public physx::PxHashMapBase +{ + public: + typedef physx::PxHashMapBase HashMapBase; + + PxCoalescedHashMap(uint32_t initialTableSize = 64, float loadFactor = 0.75f) + : HashMapBase(initialTableSize, loadFactor) + { + } + const PxPair* getEntries() const + { + return HashMapBase::mBase.getEntries(); + } +}; +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxHashSet.h b/Source/ThirdParty/PhysX/foundation/PxHashSet.h new file mode 100644 index 000000000..354b04493 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxHashSet.h @@ -0,0 +1,128 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_HASHSET_H +#define PX_HASHSET_H + +#include "foundation/PxHashInternals.h" + +// TODO: make this doxy-format + +// This header defines two hash sets. Hash sets +// * support custom initial table sizes (rounded up internally to power-of-2) +// * support custom static allocator objects +// * auto-resize, based on a load factor (i.e. a 64-entry .75 load factor hash will resize +// when the 49th element is inserted) +// * are based on open hashing +// +// Sets have STL-like copying semantics, and properly initialize and destruct copies of objects +// +// There are two forms of set: coalesced and uncoalesced. Coalesced sets keep the entries in the +// initial segment of an array, so are fast to iterate over; however deletion is approximately +// twice as expensive. +// +// HashSet: +// bool insert(const T& k) amortized O(1) (exponential resize policy) +// bool contains(const T& k) const; O(1) +// bool erase(const T& k); O(1) +// uint32_t size() const; constant +// void reserve(uint32_t size); O(MAX(size, currentOccupancy)) +// void clear(); O(currentOccupancy) (with zero constant for objects without +// destructors) +// Iterator getIterator(); +// +// Use of iterators: +// +// for(HashSet::Iterator iter = test.getIterator(); !iter.done(); ++iter) +// myFunction(*iter); +// +// CoalescedHashSet does not support getIterator, but instead supports +// const Key *getEntries(); +// +// insertion into a set already containing the element fails returning false, as does +// erasure of an element not in the set +// + +#if !PX_DOXYGEN +namespace physx +{ +#endif +template , class Allocator = PxAllocator> +class PxHashSet : public physx::PxHashSetBase +{ + public: + typedef physx::PxHashSetBase HashSetBase; + typedef typename HashSetBase::Iterator Iterator; + + PxHashSet(uint32_t initialTableSize = 64, float loadFactor = 0.75f) : HashSetBase(initialTableSize, loadFactor) + { + } + PxHashSet(uint32_t initialTableSize, float loadFactor, const Allocator& alloc) + : HashSetBase(initialTableSize, loadFactor, alloc) + { + } + PxHashSet(const Allocator& alloc) : HashSetBase(64, 0.75f, alloc) + { + } + Iterator getIterator() + { + return Iterator(HashSetBase::mBase); + } +}; + +template , class Allocator = PxAllocator> +class PxCoalescedHashSet : public physx::PxHashSetBase +{ + public: + typedef typename physx::PxHashSetBase HashSetBase; + + PxCoalescedHashSet(uint32_t initialTableSize = 64, float loadFactor = 0.75f) + : HashSetBase(initialTableSize, loadFactor) + { + } + + PxCoalescedHashSet(uint32_t initialTableSize, float loadFactor, const Allocator& alloc) + : HashSetBase(initialTableSize, loadFactor, alloc) + { + } + PxCoalescedHashSet(const Allocator& alloc) : HashSetBase(64, 0.75f, alloc) + { + } + + const Key* getEntries() const + { + return HashSetBase::mBase.getEntries(); + } +}; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxIO.h b/Source/ThirdParty/PhysX/foundation/PxIO.h index 1db6a8054..a3d53f755 100644 --- a/Source/ThirdParty/PhysX/foundation/PxIO.h +++ b/Source/ThirdParty/PhysX/foundation/PxIO.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXIO_H -#define PXFOUNDATION_PXIO_H +#ifndef PX_IO_H +#define PX_IO_H /** \addtogroup common @{ @@ -135,4 +134,5 @@ class PxOutputStream #endif /** @} */ -#endif // #ifndef PXFOUNDATION_PXIO_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxInlineAllocator.h b/Source/ThirdParty/PhysX/foundation/PxInlineAllocator.h new file mode 100644 index 000000000..9ff73881a --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxInlineAllocator.h @@ -0,0 +1,92 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_INLINE_ALLOCATOR_H +#define PX_INLINE_ALLOCATOR_H + +#include "foundation/PxUserAllocated.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif +// this is used by the array class to allocate some space for a small number +// of objects along with the metadata +template +class PxInlineAllocator : private BaseAllocator +{ + public: + PxInlineAllocator(const PxEMPTY v) : BaseAllocator(v) + { + } + + PxInlineAllocator(const BaseAllocator& alloc = BaseAllocator()) : BaseAllocator(alloc), mBufferUsed(false) + { + } + + PxInlineAllocator(const PxInlineAllocator& aloc) : BaseAllocator(aloc), mBufferUsed(false) + { + } + + void* allocate(PxU32 size, const char* filename, PxI32 line) + { + if(!mBufferUsed && size <= N) + { + mBufferUsed = true; + return mBuffer; + } + return BaseAllocator::allocate(size, filename, line); + } + + void deallocate(void* ptr) + { + if(ptr == mBuffer) + mBufferUsed = false; + else + BaseAllocator::deallocate(ptr); + } + + PX_FORCE_INLINE PxU8* getInlineBuffer() + { + return mBuffer; + } + PX_FORCE_INLINE bool isBufferUsed() const + { + return mBufferUsed; + } + + protected: + PxU8 mBuffer[N]; + bool mBufferUsed; +}; +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxInlineAoS.h b/Source/ThirdParty/PhysX/foundation/PxInlineAoS.h new file mode 100644 index 000000000..f59cc5972 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxInlineAoS.h @@ -0,0 +1,45 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_INLINE_AOS_H +#define PX_INLINE_AOS_H + +#include "foundation/PxPreprocessor.h" + +#if PX_WINDOWS +#include "windows/PxWindowsTrigConstants.h" +#include "windows/PxWindowsInlineAoS.h" +#elif (PX_UNIX_FAMILY || PX_PS4 || PX_PS5 || PX_SWITCH) +#include "unix/PxUnixTrigConstants.h" +#include "unix/PxUnixInlineAoS.h" +#else +#error "Platform not supported!" +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxInlineArray.h b/Source/ThirdParty/PhysX/foundation/PxInlineArray.h new file mode 100644 index 000000000..f3c9d8428 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxInlineArray.h @@ -0,0 +1,69 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_INLINE_ARRAY_H +#define PX_INLINE_ARRAY_H + +#include "foundation/PxArray.h" +#include "foundation/PxInlineAllocator.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +// array that pre-allocates for N elements +template ::Type> +class PxInlineArray : public PxArray > +{ + typedef PxInlineAllocator Allocator; + + public: + PxInlineArray(const PxEMPTY v) : PxArray(v) + { + if(isInlined()) + this->mData = reinterpret_cast(PxArray::getInlineBuffer()); + } + + PX_INLINE bool isInlined() const + { + return Allocator::isBufferUsed(); + } + + PX_INLINE explicit PxInlineArray(const Alloc& alloc = Alloc()) : PxArray(alloc) + { + this->mData = this->allocate(N); + this->mCapacity = N; + } +}; +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxIntrinsics.h b/Source/ThirdParty/PhysX/foundation/PxIntrinsics.h index 9f6d4a13a..85ba03af0 100644 --- a/Source/ThirdParty/PhysX/foundation/PxIntrinsics.h +++ b/Source/ThirdParty/PhysX/foundation/PxIntrinsics.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,25 +22,29 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXINTRINSICS_H -#define PXFOUNDATION_PXINTRINSICS_H +#ifndef PX_INTRINSICS_H +#define PX_INTRINSICS_H #include "foundation/PxPreprocessor.h" #if PX_WINDOWS_FAMILY -#include "foundation/windows/PxWindowsIntrinsics.h" -#elif(PX_LINUX || PX_ANDROID || PX_APPLE_FAMILY || PX_PS4) -#include "foundation/unix/PxUnixIntrinsics.h" -#elif PX_XBOXONE -#include "foundation/XboxOne/PxXboxOneIntrinsics.h" +#include "windows/PxWindowsIntrinsics.h" +#elif (PX_LINUX || PX_ANDROID || PX_APPLE_FAMILY || PX_PS4 || PX_PS5) +#include "unix/PxUnixIntrinsics.h" #elif PX_SWITCH -#include +#include "switch/PxSwitchIntrinsics.h" #else #error "Platform not supported!" #endif -#endif // #ifndef PXFOUNDATION_PXINTRINSICS_H +#if PX_WINDOWS_FAMILY +#pragma intrinsic(memcmp) +#pragma intrinsic(memcpy) +#pragma intrinsic(memset) +#endif + +#endif // #ifndef PX_INTRINSICS_H diff --git a/Source/ThirdParty/PhysX/foundation/PxMat33.h b/Source/ThirdParty/PhysX/foundation/PxMat33.h index 3019ba2dd..0f5485827 100644 --- a/Source/ThirdParty/PhysX/foundation/PxMat33.h +++ b/Source/ThirdParty/PhysX/foundation/PxMat33.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXMAT33_H -#define PXFOUNDATION_PXMAT33_H +#ifndef PX_MAT33_H +#define PX_MAT33_H /** \addtogroup foundation @{ */ @@ -85,86 +84,97 @@ which in C++ translates to M[column][row] The mathematical indexing is M_row,column and this is what is used for _-notation so _12 is 1st row, second column and operator(row, column)! - */ -class PxMat33 + +template +class PxMat33T { - public: + public: //! Default constructor - PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat33() + PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat33T() { } //! identity constructor - PX_CUDA_CALLABLE PX_INLINE PxMat33(PxIDENTITY r) - : column0(1.0f, 0.0f, 0.0f), column1(0.0f, 1.0f, 0.0f), column2(0.0f, 0.0f, 1.0f) + PX_CUDA_CALLABLE PX_INLINE PxMat33T(PxIDENTITY) : + column0(Type(1.0), Type(0.0), Type(0.0)), + column1(Type(0.0), Type(1.0), Type(0.0)), + column2(Type(0.0), Type(0.0), Type(1.0)) { - PX_UNUSED(r); } //! zero constructor - PX_CUDA_CALLABLE PX_INLINE PxMat33(PxZERO r) : column0(0.0f), column1(0.0f), column2(0.0f) + PX_CUDA_CALLABLE PX_INLINE PxMat33T(PxZERO) : + column0(Type(0.0)), + column1(Type(0.0)), + column2(Type(0.0)) { - PX_UNUSED(r); } //! Construct from three base vectors - PX_CUDA_CALLABLE PxMat33(const PxVec3& col0, const PxVec3& col1, const PxVec3& col2) - : column0(col0), column1(col1), column2(col2) + PX_CUDA_CALLABLE PxMat33T(const PxVec3T& col0, const PxVec3T& col1, const PxVec3T& col2) : + column0(col0), + column1(col1), + column2(col2) { } //! constructor from a scalar, which generates a multiple of the identity matrix - explicit PX_CUDA_CALLABLE PX_INLINE PxMat33(float r) - : column0(r, 0.0f, 0.0f), column1(0.0f, r, 0.0f), column2(0.0f, 0.0f, r) + explicit PX_CUDA_CALLABLE PX_INLINE PxMat33T(Type r) : + column0(r, Type(0.0), Type(0.0)), + column1(Type(0.0), r, Type(0.0)), + column2(Type(0.0), Type(0.0), r) { } - //! Construct from float[9] - explicit PX_CUDA_CALLABLE PX_INLINE PxMat33(float values[]) - : column0(values[0], values[1], values[2]) - , column1(values[3], values[4], values[5]) - , column2(values[6], values[7], values[8]) + //! Construct from Type[9] + explicit PX_CUDA_CALLABLE PX_INLINE PxMat33T(Type values[]) : + column0(values[0], values[1], values[2]), + column1(values[3], values[4], values[5]), + column2(values[6], values[7], values[8]) { } //! Construct from a quaternion - explicit PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat33(const PxQuat& q) + explicit PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat33T(const PxQuatT& q) { - const float x = q.x; - const float y = q.y; - const float z = q.z; - const float w = q.w; + // PT: TODO: PX-566 + const Type x = q.x; + const Type y = q.y; + const Type z = q.z; + const Type w = q.w; - const float x2 = x + x; - const float y2 = y + y; - const float z2 = z + z; + const Type x2 = x + x; + const Type y2 = y + y; + const Type z2 = z + z; - const float xx = x2 * x; - const float yy = y2 * y; - const float zz = z2 * z; + const Type xx = x2 * x; + const Type yy = y2 * y; + const Type zz = z2 * z; - const float xy = x2 * y; - const float xz = x2 * z; - const float xw = x2 * w; + const Type xy = x2 * y; + const Type xz = x2 * z; + const Type xw = x2 * w; - const float yz = y2 * z; - const float yw = y2 * w; - const float zw = z2 * w; + const Type yz = y2 * z; + const Type yw = y2 * w; + const Type zw = z2 * w; - column0 = PxVec3(1.0f - yy - zz, xy + zw, xz - yw); - column1 = PxVec3(xy - zw, 1.0f - xx - zz, yz + xw); - column2 = PxVec3(xz + yw, yz - xw, 1.0f - xx - yy); + column0 = PxVec3T(Type(1.0) - yy - zz, xy + zw, xz - yw); + column1 = PxVec3T(xy - zw, Type(1.0) - xx - zz, yz + xw); + column2 = PxVec3T(xz + yw, yz - xw, Type(1.0) - xx - yy); } //! Copy constructor - PX_CUDA_CALLABLE PX_INLINE PxMat33(const PxMat33& other) - : column0(other.column0), column1(other.column1), column2(other.column2) + PX_CUDA_CALLABLE PX_INLINE PxMat33T(const PxMat33T& other) : + column0(other.column0), + column1(other.column1), + column2(other.column2) { } //! Assignment operator - PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat33& operator=(const PxMat33& other) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat33T& operator=(const PxMat33T& other) { column0 = other.column0; column1 = other.column1; @@ -173,38 +183,46 @@ class PxMat33 } //! Construct from diagonal, off-diagonals are zero. - PX_CUDA_CALLABLE PX_INLINE static const PxMat33 createDiagonal(const PxVec3& d) + PX_CUDA_CALLABLE PX_INLINE static const PxMat33T createDiagonal(const PxVec3T& d) { - return PxMat33(PxVec3(d.x, 0.0f, 0.0f), PxVec3(0.0f, d.y, 0.0f), PxVec3(0.0f, 0.0f, d.z)); + return PxMat33T(PxVec3T(d.x, Type(0.0), Type(0.0)), + PxVec3T(Type(0.0), d.y, Type(0.0)), + PxVec3T(Type(0.0), Type(0.0), d.z)); + } + + //! Computes the outer product of two vectors + PX_CUDA_CALLABLE PX_INLINE static const PxMat33T outer(const PxVec3T& a, const PxVec3T& b) + { + return PxMat33T(a * b.x, a * b.y, a * b.z); } /** \brief returns true if the two matrices are exactly equal */ - PX_CUDA_CALLABLE PX_INLINE bool operator==(const PxMat33& m) const + PX_CUDA_CALLABLE PX_INLINE bool operator==(const PxMat33T& m) const { return column0 == m.column0 && column1 == m.column1 && column2 == m.column2; } //! Get transposed matrix - PX_CUDA_CALLABLE PX_FORCE_INLINE const PxMat33 getTranspose() const + PX_CUDA_CALLABLE PX_FORCE_INLINE const PxMat33T getTranspose() const { - const PxVec3 v0(column0.x, column1.x, column2.x); - const PxVec3 v1(column0.y, column1.y, column2.y); - const PxVec3 v2(column0.z, column1.z, column2.z); + const PxVec3T v0(column0.x, column1.x, column2.x); + const PxVec3T v1(column0.y, column1.y, column2.y); + const PxVec3T v2(column0.z, column1.z, column2.z); - return PxMat33(v0, v1, v2); + return PxMat33T(v0, v1, v2); } //! Get the real inverse - PX_CUDA_CALLABLE PX_INLINE const PxMat33 getInverse() const + PX_CUDA_CALLABLE PX_INLINE const PxMat33T getInverse() const { - const float det = getDeterminant(); - PxMat33 inverse; + const Type det = getDeterminant(); + PxMat33T inverse; - if(det != 0) + if(det != Type(0.0)) { - const float invDet = 1.0f / det; + const Type invDet = Type(1.0) / det; inverse.column0.x = invDet * (column1.y * column2.z - column2.y * column1.z); inverse.column0.y = invDet * -(column0.y * column2.z - column2.y * column0.z); @@ -222,44 +240,45 @@ class PxMat33 } else { - return PxMat33(PxIdentity); + return PxMat33T(PxIdentity); } } //! Get determinant - PX_CUDA_CALLABLE PX_INLINE float getDeterminant() const + PX_CUDA_CALLABLE PX_INLINE Type getDeterminant() const { return column0.dot(column1.cross(column2)); } //! Unary minus - PX_CUDA_CALLABLE PX_INLINE const PxMat33 operator-() const + PX_CUDA_CALLABLE PX_INLINE const PxMat33T operator-() const { - return PxMat33(-column0, -column1, -column2); + return PxMat33T(-column0, -column1, -column2); } //! Add - PX_CUDA_CALLABLE PX_INLINE const PxMat33 operator+(const PxMat33& other) const + PX_CUDA_CALLABLE PX_INLINE const PxMat33T operator+(const PxMat33T& other) const { - return PxMat33(column0 + other.column0, column1 + other.column1, column2 + other.column2); + return PxMat33T(column0 + other.column0, column1 + other.column1, column2 + other.column2); } //! Subtract - PX_CUDA_CALLABLE PX_INLINE const PxMat33 operator-(const PxMat33& other) const + PX_CUDA_CALLABLE PX_INLINE const PxMat33T operator-(const PxMat33T& other) const { - return PxMat33(column0 - other.column0, column1 - other.column1, column2 - other.column2); + return PxMat33T(column0 - other.column0, column1 - other.column1, column2 - other.column2); } //! Scalar multiplication - PX_CUDA_CALLABLE PX_INLINE const PxMat33 operator*(float scalar) const + PX_CUDA_CALLABLE PX_INLINE const PxMat33T operator*(Type scalar) const { - return PxMat33(column0 * scalar, column1 * scalar, column2 * scalar); + return PxMat33T(column0 * scalar, column1 * scalar, column2 * scalar); } - friend PxMat33 operator*(float, const PxMat33&); + template + PX_CUDA_CALLABLE PX_INLINE friend PxMat33T operator*(Type2, const PxMat33T&); //! Matrix vector multiplication (returns 'this->transform(vec)') - PX_CUDA_CALLABLE PX_INLINE const PxVec3 operator*(const PxVec3& vec) const + PX_CUDA_CALLABLE PX_INLINE const PxVec3T operator*(const PxVec3T& vec) const { return transform(vec); } @@ -267,15 +286,17 @@ class PxMat33 // a = b operators //! Matrix multiplication - PX_CUDA_CALLABLE PX_FORCE_INLINE const PxMat33 operator*(const PxMat33& other) const + PX_CUDA_CALLABLE PX_FORCE_INLINE const PxMat33T operator*(const PxMat33T& other) const { // Rows from this columns from other // column0 = transform(other.column0) etc - return PxMat33(transform(other.column0), transform(other.column1), transform(other.column2)); + return PxMat33T(transform(other.column0), + transform(other.column1), + transform(other.column2)); } //! Equals-add - PX_CUDA_CALLABLE PX_INLINE PxMat33& operator+=(const PxMat33& other) + PX_CUDA_CALLABLE PX_INLINE PxMat33T& operator+=(const PxMat33T& other) { column0 += other.column0; column1 += other.column1; @@ -284,7 +305,7 @@ class PxMat33 } //! Equals-sub - PX_CUDA_CALLABLE PX_INLINE PxMat33& operator-=(const PxMat33& other) + PX_CUDA_CALLABLE PX_INLINE PxMat33T& operator-=(const PxMat33T& other) { column0 -= other.column0; column1 -= other.column1; @@ -293,7 +314,7 @@ class PxMat33 } //! Equals scalar multiplication - PX_CUDA_CALLABLE PX_INLINE PxMat33& operator*=(float scalar) + PX_CUDA_CALLABLE PX_INLINE PxMat33T& operator*=(Type scalar) { column0 *= scalar; column1 *= scalar; @@ -302,20 +323,20 @@ class PxMat33 } //! Equals matrix multiplication - PX_CUDA_CALLABLE PX_INLINE PxMat33& operator*=(const PxMat33& other) + PX_CUDA_CALLABLE PX_INLINE PxMat33T& operator*=(const PxMat33T& other) { *this = *this * other; return *this; } //! Element access, mathematical way! - PX_CUDA_CALLABLE PX_FORCE_INLINE float operator()(unsigned int row, unsigned int col) const + PX_CUDA_CALLABLE PX_FORCE_INLINE Type operator()(PxU32 row, PxU32 col) const { return (*this)[col][row]; } //! Element access, mathematical way! - PX_CUDA_CALLABLE PX_FORCE_INLINE float& operator()(unsigned int row, unsigned int col) + PX_CUDA_CALLABLE PX_FORCE_INLINE Type& operator()(PxU32 row, PxU32 col) { return (*this)[col][row]; } @@ -323,74 +344,82 @@ class PxMat33 // Transform etc //! Transform vector by matrix, equal to v' = M*v - PX_CUDA_CALLABLE PX_FORCE_INLINE const PxVec3 transform(const PxVec3& other) const + PX_CUDA_CALLABLE PX_FORCE_INLINE const PxVec3T transform(const PxVec3T& other) const { return column0 * other.x + column1 * other.y + column2 * other.z; } //! Transform vector by matrix transpose, v' = M^t*v - PX_CUDA_CALLABLE PX_INLINE const PxVec3 transformTranspose(const PxVec3& other) const + PX_CUDA_CALLABLE PX_INLINE const PxVec3T transformTranspose(const PxVec3T& other) const { - return PxVec3(column0.dot(other), column1.dot(other), column2.dot(other)); + return PxVec3T(column0.dot(other), column1.dot(other), column2.dot(other)); } - PX_CUDA_CALLABLE PX_FORCE_INLINE const float* front() const + PX_CUDA_CALLABLE PX_FORCE_INLINE const Type* front() const { return &column0.x; } - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3& operator[](unsigned int num) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T& operator[](PxU32 num) { return (&column0)[num]; } - PX_CUDA_CALLABLE PX_FORCE_INLINE const PxVec3& operator[](unsigned int num) const + + PX_CUDA_CALLABLE PX_FORCE_INLINE const PxVec3T& operator[](PxU32 num) const { return (&column0)[num]; } // Data, see above for format! - PxVec3 column0, column1, column2; // the three base vectors + PxVec3T column0, column1, column2; // the three base vectors }; -// implementation from PxQuat.h -PX_CUDA_CALLABLE PX_INLINE PxQuat::PxQuat(const PxMat33& m) +template +PX_CUDA_CALLABLE PX_INLINE PxMat33T operator*(Type scalar, const PxMat33T& m) { - if(m.column2.z < 0) + return PxMat33T(scalar * m.column0, scalar * m.column1, scalar * m.column2); +} + +// implementation from PxQuat.h +template +PX_CUDA_CALLABLE PX_INLINE PxQuatT::PxQuatT(const PxMat33T& m) +{ + if(m.column2.z < Type(0)) { if(m.column0.x > m.column1.y) { - float t = 1 + m.column0.x - m.column1.y - m.column2.z; - *this = PxQuat(t, m.column0.y + m.column1.x, m.column2.x + m.column0.z, m.column1.z - m.column2.y) * - (0.5f / PxSqrt(t)); + const Type t = Type(1.0) + m.column0.x - m.column1.y - m.column2.z; + *this = PxQuatT(t, m.column0.y + m.column1.x, m.column2.x + m.column0.z, m.column1.z - m.column2.y) * (Type(0.5) / PxSqrt(t)); } else { - float t = 1 - m.column0.x + m.column1.y - m.column2.z; - *this = PxQuat(m.column0.y + m.column1.x, t, m.column1.z + m.column2.y, m.column2.x - m.column0.z) * - (0.5f / PxSqrt(t)); + const Type t = Type(1.0) - m.column0.x + m.column1.y - m.column2.z; + *this = PxQuatT(m.column0.y + m.column1.x, t, m.column1.z + m.column2.y, m.column2.x - m.column0.z) * (Type(0.5) / PxSqrt(t)); } } else { if(m.column0.x < -m.column1.y) { - float t = 1 - m.column0.x - m.column1.y + m.column2.z; - *this = PxQuat(m.column2.x + m.column0.z, m.column1.z + m.column2.y, t, m.column0.y - m.column1.x) * - (0.5f / PxSqrt(t)); + const Type t = Type(1.0) - m.column0.x - m.column1.y + m.column2.z; + *this = PxQuatT(m.column2.x + m.column0.z, m.column1.z + m.column2.y, t, m.column0.y - m.column1.x) * (Type(0.5) / PxSqrt(t)); } else { - float t = 1 + m.column0.x + m.column1.y + m.column2.z; - *this = PxQuat(m.column1.z - m.column2.y, m.column2.x - m.column0.z, m.column0.y - m.column1.x, t) * - (0.5f / PxSqrt(t)); + const Type t = Type(1.0) + m.column0.x + m.column1.y + m.column2.z; + *this = PxQuatT(m.column1.z - m.column2.y, m.column2.x - m.column0.z, m.column0.y - m.column1.x, t) * (Type(0.5) / PxSqrt(t)); } } } +typedef PxMat33T PxMat33; +typedef PxMat33T PxMat33d; + #if !PX_DOXYGEN } // namespace physx #endif /** @} */ -#endif // #ifndef PXFOUNDATION_PXMAT33_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxMat34.h b/Source/ThirdParty/PhysX/foundation/PxMat34.h new file mode 100644 index 000000000..ccbc6c0d7 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxMat34.h @@ -0,0 +1,277 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_MAT34_H +#define PX_MAT34_H +/** \addtogroup foundation +@{ +*/ + +#include "foundation/PxTransform.h" +#include "foundation/PxMat33.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif +/*! +Basic mathematical 3x4 matrix, implemented as a 3x3 rotation matrix and a translation + +See PxMat33 for the format of the rotation matrix. +*/ + +template +class PxMat34T +{ + public: + //! Default constructor + PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat34T() + { + } + + //! Construct from four base vectors + PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat34T(const PxVec3T& b0, const PxVec3T& b1, const PxVec3T& b2, const PxVec3T& b3) + : m(b0, b1, b2), p(b3) + { + } + + //! Construct from Type[12] + explicit PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat34T(Type values[]) : + m(values), p(values[9], values[10], values[11]) + { + } + + //! Construct from a 3x3 matrix + explicit PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat34T(const PxMat33T& other) + : m(other), p(PxZero) + { + } + + //! Construct from a 3x3 matrix and a translation vector + PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat34T(const PxMat33T& other, const PxVec3T& t) + : m(other), p(t) + { + } + + //! Construct from a PxTransformT + explicit PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat34T(const PxTransformT& other) + : m(other.q), p(other.p) + { + } + + //! Copy constructor + PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat34T(const PxMat34T& other) : m(other.m), p(other.p) + { + } + + //! Assignment operator + PX_CUDA_CALLABLE PX_FORCE_INLINE const PxMat34T& operator=(const PxMat34T& other) + { + m = other.m; + p = other.p; + return *this; + } + + //! Set to identity matrix + PX_CUDA_CALLABLE PX_FORCE_INLINE void setIdentity() + { + m = PxMat33T(PxIdentity); + p = PxVec3T(0); + } + + // Simpler operators + //! Equality operator + PX_CUDA_CALLABLE PX_FORCE_INLINE bool operator==(const PxMat34T& other) const + { + return m == other.m && p == other.p; + } + + //! Inequality operator + PX_CUDA_CALLABLE PX_FORCE_INLINE bool operator!=(const PxMat34T& other) const + { + return !operator==(other); + } + + //! Unary minus + PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat34T operator-() const + { + return PxMat34T(-m, -p); + } + + //! Add + PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat34T operator+(const PxMat34T& other) const + { + return PxMat34T(m + other.m, p + other.p); + } + + //! Subtract + PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat34T operator-(const PxMat34T& other) const + { + return PxMat34T(m - other.m, p - other.p); + } + + //! Scalar multiplication + PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat34T operator*(Type scalar) const + { + return PxMat34T(m*scalar, p*scalar); + } + + //! Matrix multiplication + PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat34T operator*(const PxMat34T& other) const + { + //Rows from this columns from other + //base0 = rotate(other.m.column0) etc + return PxMat34T(m*other.m, m*other.p + p); + } + + //! Matrix multiplication, extend the second matrix + PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat34T operator*(const PxMat33T& other) const + { + //Rows from this columns from other + //base0 = transform(other.m.column0) etc + return PxMat34T(m*other, p); + } + + template + friend PxMat34T operator*(const PxMat33T& a, const PxMat34T& b); + + // a = b operators + + //! Equals-add + PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat34T& operator+=(const PxMat34T& other) + { + m += other.m; + p += other.p; + return *this; + } + + //! Equals-sub + PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat34T& operator-=(const PxMat34T& other) + { + m -= other.m; + p -= other.p; + return *this; + } + + //! Equals scalar multiplication + PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat34T& operator*=(Type scalar) + { + m *= scalar; + p *= scalar; + return *this; + } + + //! Element access, mathematical way! + PX_CUDA_CALLABLE PX_FORCE_INLINE Type operator()(PxU32 row, PxU32 col) const + { + return (*this)[col][row]; + } + + //! Element access, mathematical way! + PX_CUDA_CALLABLE PX_FORCE_INLINE Type& operator()(PxU32 row, PxU32 col) + { + return (*this)[col][row]; + } + + // Transform etc + + //! Transform vector by matrix, equal to v' = M*v + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T rotate(const PxVec3T& other) const + { + return m*other; + } + + //! Transform vector by transpose of matrix, equal to v' = M^t*v + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T rotateTranspose(const PxVec3T& other) const + { + return m.transformTranspose(other); + } + + //! Transform point by matrix + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T transform(const PxVec3T& other) const + { + return m*other + p; + } + + //! Transform point by transposed matrix + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T transformTranspose(const PxVec3T& other) const + { + return m.transformTranspose(other - p); + } + + //! Transform point by transposed matrix + PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat34T transformTranspose(const PxMat34T& other) const + { + return PxMat34T(m.transformTranspose(other.m.column0), + m.transformTranspose(other.m.column1), + m.transformTranspose(other.m.column2), + m.transformTranspose(other.p - p)); + } + + //! Invert matrix treating it as a rotation+translation matrix only + PX_CUDA_CALLABLE PX_FORCE_INLINE PxMat34T getInverseRT() const + { + return PxMat34T(m.getTranspose(), m.transformTranspose(-p)); + } + + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T& operator[](PxU32 num) { return (&m.column0)[num]; } + PX_CUDA_CALLABLE PX_FORCE_INLINE const PxVec3T& operator[](PxU32 num) const { return (&m.column0)[num]; } + + //Data, see above for format! + + PxMat33T m; + PxVec3T p; +}; + +//! Multiply a*b, a is extended +template +PX_INLINE PxMat34T operator*(const PxMat33T& a, const PxMat34T& b) +{ + return PxMat34T(a * b.m, a * b.p); +} + +typedef PxMat34T PxMat34; +typedef PxMat34T PxMat34d; + +//! A padded version of PxMat34, to safely load its data using SIMD +class PxMat34Padded : public PxMat34 +{ + public: + PX_FORCE_INLINE PxMat34Padded(const PxMat34& src) : PxMat34(src) {} + PX_FORCE_INLINE PxMat34Padded() {} + PX_FORCE_INLINE ~PxMat34Padded() {} + PxU32 padding; +}; +PX_COMPILE_TIME_ASSERT(0==(sizeof(PxMat34Padded)==16)); + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/foundation/PxMat44.h b/Source/ThirdParty/PhysX/foundation/PxMat44.h index 577a93fbd..92cfa51d4 100644 --- a/Source/ThirdParty/PhysX/foundation/PxMat44.h +++ b/Source/ThirdParty/PhysX/foundation/PxMat44.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXMAT44_H -#define PXFOUNDATION_PXMAT44_H +#ifndef PX_MAT44_H +#define PX_MAT44_H /** \addtogroup foundation @{ */ @@ -51,126 +50,138 @@ This class is layout-compatible with D3D and OpenGL matrices. More notes on layo @see PxMat33 PxTransform */ -class PxMat44 +template +class PxMat44T { - public: + public: //! Default constructor - PX_CUDA_CALLABLE PX_INLINE PxMat44() + PX_CUDA_CALLABLE PX_INLINE PxMat44T() { } //! identity constructor - PX_CUDA_CALLABLE PX_INLINE PxMat44(PxIDENTITY r) - : column0(1.0f, 0.0f, 0.0f, 0.0f) - , column1(0.0f, 1.0f, 0.0f, 0.0f) - , column2(0.0f, 0.0f, 1.0f, 0.0f) - , column3(0.0f, 0.0f, 0.0f, 1.0f) + PX_CUDA_CALLABLE PX_INLINE PxMat44T(PxIDENTITY) : + column0(Type(1.0), Type(0.0), Type(0.0), Type(0.0)), + column1(Type(0.0), Type(1.0), Type(0.0), Type(0.0)), + column2(Type(0.0), Type(0.0), Type(1.0), Type(0.0)), + column3(Type(0.0), Type(0.0), Type(0.0), Type(1.0)) { - PX_UNUSED(r); } //! zero constructor - PX_CUDA_CALLABLE PX_INLINE PxMat44(PxZERO r) : column0(PxZero), column1(PxZero), column2(PxZero), column3(PxZero) + PX_CUDA_CALLABLE PX_INLINE PxMat44T(PxZERO) : column0(PxZero), column1(PxZero), column2(PxZero), column3(PxZero) { - PX_UNUSED(r); } //! Construct from four 4-vectors - PX_CUDA_CALLABLE PxMat44(const PxVec4& col0, const PxVec4& col1, const PxVec4& col2, const PxVec4& col3) - : column0(col0), column1(col1), column2(col2), column3(col3) + PX_CUDA_CALLABLE PxMat44T(const PxVec4T& col0, const PxVec4T& col1, const PxVec4T& col2, const PxVec4T& col3) : + column0(col0), + column1(col1), + column2(col2), + column3(col3) { } //! constructor that generates a multiple of the identity matrix - explicit PX_CUDA_CALLABLE PX_INLINE PxMat44(float r) - : column0(r, 0.0f, 0.0f, 0.0f) - , column1(0.0f, r, 0.0f, 0.0f) - , column2(0.0f, 0.0f, r, 0.0f) - , column3(0.0f, 0.0f, 0.0f, r) + explicit PX_CUDA_CALLABLE PX_INLINE PxMat44T(Type r) : + column0(r, Type(0.0), Type(0.0), Type(0.0)), + column1(Type(0.0), r, Type(0.0), Type(0.0)), + column2(Type(0.0), Type(0.0), r, Type(0.0)), + column3(Type(0.0), Type(0.0), Type(0.0), r) { } //! Construct from three base vectors and a translation - PX_CUDA_CALLABLE PxMat44(const PxVec3& col0, const PxVec3& col1, const PxVec3& col2, const PxVec3& col3) - : column0(col0, 0), column1(col1, 0), column2(col2, 0), column3(col3, 1.0f) + PX_CUDA_CALLABLE PxMat44T(const PxVec3T& col0, const PxVec3T& col1, const PxVec3T& col2, const PxVec3T& col3) : + column0(col0, Type(0.0)), + column1(col1, Type(0.0)), + column2(col2, Type(0.0)), + column3(col3, Type(1.0)) { } - //! Construct from float[16] - explicit PX_CUDA_CALLABLE PX_INLINE PxMat44(float values[]) - : column0(values[0], values[1], values[2], values[3]) - , column1(values[4], values[5], values[6], values[7]) - , column2(values[8], values[9], values[10], values[11]) - , column3(values[12], values[13], values[14], values[15]) + //! Construct from Type[16] + explicit PX_CUDA_CALLABLE PX_INLINE PxMat44T(Type values[]) : + column0(values[0], values[1], values[2], values[3]), + column1(values[4], values[5], values[6], values[7]), + column2(values[8], values[9], values[10], values[11]), + column3(values[12], values[13], values[14], values[15]) { } //! Construct from a quaternion - explicit PX_CUDA_CALLABLE PX_INLINE PxMat44(const PxQuat& q) + explicit PX_CUDA_CALLABLE PX_INLINE PxMat44T(const PxQuatT& q) { - const float x = q.x; - const float y = q.y; - const float z = q.z; - const float w = q.w; + // PT: TODO: PX-566 + const Type x = q.x; + const Type y = q.y; + const Type z = q.z; + const Type w = q.w; - const float x2 = x + x; - const float y2 = y + y; - const float z2 = z + z; + const Type x2 = x + x; + const Type y2 = y + y; + const Type z2 = z + z; - const float xx = x2 * x; - const float yy = y2 * y; - const float zz = z2 * z; + const Type xx = x2 * x; + const Type yy = y2 * y; + const Type zz = z2 * z; - const float xy = x2 * y; - const float xz = x2 * z; - const float xw = x2 * w; + const Type xy = x2 * y; + const Type xz = x2 * z; + const Type xw = x2 * w; - const float yz = y2 * z; - const float yw = y2 * w; - const float zw = z2 * w; + const Type yz = y2 * z; + const Type yw = y2 * w; + const Type zw = z2 * w; - column0 = PxVec4(1.0f - yy - zz, xy + zw, xz - yw, 0.0f); - column1 = PxVec4(xy - zw, 1.0f - xx - zz, yz + xw, 0.0f); - column2 = PxVec4(xz + yw, yz - xw, 1.0f - xx - yy, 0.0f); - column3 = PxVec4(0.0f, 0.0f, 0.0f, 1.0f); + column0 = PxVec4T(Type(1.0) - yy - zz, xy + zw, xz - yw, Type(0.0)); + column1 = PxVec4T(xy - zw, Type(1.0) - xx - zz, yz + xw, Type(0.0)); + column2 = PxVec4T(xz + yw, yz - xw, Type(1.0) - xx - yy, Type(0.0)); + column3 = PxVec4T(Type(0.0), Type(0.0), Type(0.0), Type(1.0)); } //! Construct from a diagonal vector - explicit PX_CUDA_CALLABLE PX_INLINE PxMat44(const PxVec4& diagonal) - : column0(diagonal.x, 0.0f, 0.0f, 0.0f) - , column1(0.0f, diagonal.y, 0.0f, 0.0f) - , column2(0.0f, 0.0f, diagonal.z, 0.0f) - , column3(0.0f, 0.0f, 0.0f, diagonal.w) + explicit PX_CUDA_CALLABLE PX_INLINE PxMat44T(const PxVec4T& diagonal) : + column0(diagonal.x, Type(0.0), Type(0.0), Type(0.0)), + column1(Type(0.0), diagonal.y, Type(0.0), Type(0.0)), + column2(Type(0.0), Type(0.0), diagonal.z, Type(0.0)), + column3(Type(0.0), Type(0.0), Type(0.0), diagonal.w) { } //! Construct from Mat33 and a translation - PX_CUDA_CALLABLE PxMat44(const PxMat33& axes, const PxVec3& position) - : column0(axes.column0, 0.0f), column1(axes.column1, 0.0f), column2(axes.column2, 0.0f), column3(position, 1.0f) + PX_CUDA_CALLABLE PxMat44T(const PxMat33T& axes, const PxVec3T& position) : + column0(axes.column0, Type(0.0)), + column1(axes.column1, Type(0.0)), + column2(axes.column2, Type(0.0)), + column3(position, Type(1.0)) { } - PX_CUDA_CALLABLE PxMat44(const PxTransform& t) + PX_CUDA_CALLABLE PxMat44T(const PxTransform& t) { - *this = PxMat44(PxMat33(t.q), t.p); + *this = PxMat44T(PxMat33T(t.q), t.p); } /** \brief returns true if the two matrices are exactly equal */ - PX_CUDA_CALLABLE PX_INLINE bool operator==(const PxMat44& m) const + PX_CUDA_CALLABLE PX_INLINE bool operator==(const PxMat44T& m) const { return column0 == m.column0 && column1 == m.column1 && column2 == m.column2 && column3 == m.column3; } //! Copy constructor - PX_CUDA_CALLABLE PX_INLINE PxMat44(const PxMat44& other) - : column0(other.column0), column1(other.column1), column2(other.column2), column3(other.column3) + PX_CUDA_CALLABLE PX_INLINE PxMat44T(const PxMat44T& other) : + column0(other.column0), + column1(other.column1), + column2(other.column2), + column3(other.column3) { } //! Assignment operator - PX_CUDA_CALLABLE PX_INLINE PxMat44& operator=(const PxMat44& other) + PX_CUDA_CALLABLE PX_INLINE PxMat44T& operator=(const PxMat44T& other) { column0 = other.column0; column1 = other.column1; @@ -180,54 +191,52 @@ class PxMat44 } //! Get transposed matrix - PX_CUDA_CALLABLE PX_INLINE const PxMat44 getTranspose() const + PX_CUDA_CALLABLE PX_INLINE const PxMat44T getTranspose() const { - return PxMat44( - PxVec4(column0.x, column1.x, column2.x, column3.x), PxVec4(column0.y, column1.y, column2.y, column3.y), - PxVec4(column0.z, column1.z, column2.z, column3.z), PxVec4(column0.w, column1.w, column2.w, column3.w)); + return PxMat44T( + PxVec4T(column0.x, column1.x, column2.x, column3.x), PxVec4T(column0.y, column1.y, column2.y, column3.y), + PxVec4T(column0.z, column1.z, column2.z, column3.z), PxVec4T(column0.w, column1.w, column2.w, column3.w)); } //! Unary minus - PX_CUDA_CALLABLE PX_INLINE const PxMat44 operator-() const + PX_CUDA_CALLABLE PX_INLINE const PxMat44T operator-() const { - return PxMat44(-column0, -column1, -column2, -column3); + return PxMat44T(-column0, -column1, -column2, -column3); } //! Add - PX_CUDA_CALLABLE PX_INLINE const PxMat44 operator+(const PxMat44& other) const + PX_CUDA_CALLABLE PX_INLINE const PxMat44T operator+(const PxMat44T& other) const { - return PxMat44(column0 + other.column0, column1 + other.column1, column2 + other.column2, - column3 + other.column3); + return PxMat44T(column0 + other.column0, column1 + other.column1, column2 + other.column2, column3 + other.column3); } //! Subtract - PX_CUDA_CALLABLE PX_INLINE const PxMat44 operator-(const PxMat44& other) const + PX_CUDA_CALLABLE PX_INLINE const PxMat44T operator-(const PxMat44T& other) const { - return PxMat44(column0 - other.column0, column1 - other.column1, column2 - other.column2, - column3 - other.column3); + return PxMat44T(column0 - other.column0, column1 - other.column1, column2 - other.column2, column3 - other.column3); } //! Scalar multiplication - PX_CUDA_CALLABLE PX_INLINE const PxMat44 operator*(float scalar) const + PX_CUDA_CALLABLE PX_INLINE const PxMat44T operator*(Type scalar) const { - return PxMat44(column0 * scalar, column1 * scalar, column2 * scalar, column3 * scalar); + return PxMat44T(column0 * scalar, column1 * scalar, column2 * scalar, column3 * scalar); } - friend PxMat44 operator*(float, const PxMat44&); + template + friend PxMat44T operator*(Type2, const PxMat44T&); //! Matrix multiplication - PX_CUDA_CALLABLE PX_INLINE const PxMat44 operator*(const PxMat44& other) const + PX_CUDA_CALLABLE PX_INLINE const PxMat44T operator*(const PxMat44T& other) const { // Rows from this columns from other // column0 = transform(other.column0) etc - return PxMat44(transform(other.column0), transform(other.column1), transform(other.column2), - transform(other.column3)); + return PxMat44T(transform(other.column0), transform(other.column1), transform(other.column2), transform(other.column3)); } // a = b operators //! Equals-add - PX_CUDA_CALLABLE PX_INLINE PxMat44& operator+=(const PxMat44& other) + PX_CUDA_CALLABLE PX_INLINE PxMat44T& operator+=(const PxMat44T& other) { column0 += other.column0; column1 += other.column1; @@ -237,7 +246,7 @@ class PxMat44 } //! Equals-sub - PX_CUDA_CALLABLE PX_INLINE PxMat44& operator-=(const PxMat44& other) + PX_CUDA_CALLABLE PX_INLINE PxMat44T& operator-=(const PxMat44T& other) { column0 -= other.column0; column1 -= other.column1; @@ -247,7 +256,7 @@ class PxMat44 } //! Equals scalar multiplication - PX_CUDA_CALLABLE PX_INLINE PxMat44& operator*=(float scalar) + PX_CUDA_CALLABLE PX_INLINE PxMat44T& operator*=(Type scalar) { column0 *= scalar; column1 *= scalar; @@ -257,81 +266,81 @@ class PxMat44 } //! Equals matrix multiplication - PX_CUDA_CALLABLE PX_INLINE PxMat44& operator*=(const PxMat44& other) + PX_CUDA_CALLABLE PX_INLINE PxMat44T& operator*=(const PxMat44T& other) { *this = *this * other; return *this; } //! Element access, mathematical way! - PX_CUDA_CALLABLE PX_FORCE_INLINE float operator()(unsigned int row, unsigned int col) const + PX_CUDA_CALLABLE PX_FORCE_INLINE Type operator()(PxU32 row, PxU32 col) const { return (*this)[col][row]; } //! Element access, mathematical way! - PX_CUDA_CALLABLE PX_FORCE_INLINE float& operator()(unsigned int row, unsigned int col) + PX_CUDA_CALLABLE PX_FORCE_INLINE Type& operator()(PxU32 row, PxU32 col) { return (*this)[col][row]; } //! Transform vector by matrix, equal to v' = M*v - PX_CUDA_CALLABLE PX_INLINE const PxVec4 transform(const PxVec4& other) const + PX_CUDA_CALLABLE PX_INLINE const PxVec4T transform(const PxVec4T& other) const { return column0 * other.x + column1 * other.y + column2 * other.z + column3 * other.w; } //! Transform vector by matrix, equal to v' = M*v - PX_CUDA_CALLABLE PX_INLINE const PxVec3 transform(const PxVec3& other) const + PX_CUDA_CALLABLE PX_INLINE const PxVec3T transform(const PxVec3T& other) const { - return transform(PxVec4(other, 1.0f)).getXYZ(); + return transform(PxVec4T(other, Type(1.0))).getXYZ(); } //! Rotate vector by matrix, equal to v' = M*v - PX_CUDA_CALLABLE PX_INLINE const PxVec4 rotate(const PxVec4& other) const + PX_CUDA_CALLABLE PX_INLINE const PxVec4T rotate(const PxVec4T& other) const { return column0 * other.x + column1 * other.y + column2 * other.z; // + column3*0; } //! Rotate vector by matrix, equal to v' = M*v - PX_CUDA_CALLABLE PX_INLINE const PxVec3 rotate(const PxVec3& other) const + PX_CUDA_CALLABLE PX_INLINE const PxVec3T rotate(const PxVec3T& other) const { - return rotate(PxVec4(other, 1.0f)).getXYZ(); + return rotate(PxVec4T(other, Type(1.0))).getXYZ(); } - PX_CUDA_CALLABLE PX_INLINE const PxVec3 getBasis(int num) const + PX_CUDA_CALLABLE PX_INLINE const PxVec3T getBasis(PxU32 num) const { - PX_SHARED_ASSERT(num >= 0 && num < 3); + PX_ASSERT(num < 3); return (&column0)[num].getXYZ(); } - PX_CUDA_CALLABLE PX_INLINE const PxVec3 getPosition() const + PX_CUDA_CALLABLE PX_INLINE const PxVec3T getPosition() const { return column3.getXYZ(); } - PX_CUDA_CALLABLE PX_INLINE void setPosition(const PxVec3& position) + PX_CUDA_CALLABLE PX_INLINE void setPosition(const PxVec3T& position) { column3.x = position.x; column3.y = position.y; column3.z = position.z; } - PX_CUDA_CALLABLE PX_FORCE_INLINE const float* front() const + PX_CUDA_CALLABLE PX_FORCE_INLINE const Type* front() const { return &column0.x; } - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec4& operator[](unsigned int num) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec4T& operator[](PxU32 num) { return (&column0)[num]; } - PX_CUDA_CALLABLE PX_FORCE_INLINE const PxVec4& operator[](unsigned int num) const + PX_CUDA_CALLABLE PX_FORCE_INLINE const PxVec4T& operator[](PxU32 num) const { return (&column0)[num]; } - PX_CUDA_CALLABLE PX_INLINE void scale(const PxVec4& p) + PX_CUDA_CALLABLE PX_INLINE void scale(const PxVec4T& p) { column0 *= p.x; column1 *= p.y; @@ -339,12 +348,13 @@ class PxMat44 column3 *= p.w; } - PX_CUDA_CALLABLE PX_INLINE const PxMat44 inverseRT(void) const + PX_CUDA_CALLABLE PX_INLINE const PxMat44T inverseRT(void) const { - PxVec3 r0(column0.x, column1.x, column2.x), r1(column0.y, column1.y, column2.y), - r2(column0.z, column1.z, column2.z); + const PxVec3T r0(column0.x, column1.x, column2.x); + const PxVec3T r1(column0.y, column1.y, column2.y); + const PxVec3T r2(column0.z, column1.z, column2.z); - return PxMat44(r0, r1, r2, -(r0 * column3.x + r1 * column3.y + r2 * column3.z)); + return PxMat44T(r0, r1, r2, -(r0 * column3.x + r1 * column3.y + r2 * column3.z)); } PX_CUDA_CALLABLE PX_INLINE bool isFinite() const @@ -354,23 +364,28 @@ class PxMat44 // Data, see above for format! - PxVec4 column0, column1, column2, column3; // the four base vectors + PxVec4T column0, column1, column2, column3; // the four base vectors }; // implementation from PxTransform.h -PX_CUDA_CALLABLE PX_FORCE_INLINE PxTransform::PxTransform(const PxMat44& m) +template +PX_CUDA_CALLABLE PX_FORCE_INLINE PxTransformT::PxTransformT(const PxMat44T& m) { - PxVec3 column0 = PxVec3(m.column0.x, m.column0.y, m.column0.z); - PxVec3 column1 = PxVec3(m.column1.x, m.column1.y, m.column1.z); - PxVec3 column2 = PxVec3(m.column2.x, m.column2.y, m.column2.z); + const PxVec3T column0(m.column0.x, m.column0.y, m.column0.z); + const PxVec3T column1(m.column1.x, m.column1.y, m.column1.z); + const PxVec3T column2(m.column2.x, m.column2.y, m.column2.z); - q = PxQuat(PxMat33(column0, column1, column2)); - p = PxVec3(m.column3.x, m.column3.y, m.column3.z); + q = PxQuatT(PxMat33T(column0, column1, column2)); + p = PxVec3T(m.column3.x, m.column3.y, m.column3.z); } +typedef PxMat44T PxMat44; +typedef PxMat44T PxMat44d; + #if !PX_DOXYGEN } // namespace physx #endif /** @} */ -#endif // #ifndef PXFOUNDATION_PXMAT44_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxMath.h b/Source/ThirdParty/PhysX/foundation/PxMath.h index d75d8bc37..cff5b1795 100644 --- a/Source/ThirdParty/PhysX/foundation/PxMath.h +++ b/Source/ThirdParty/PhysX/foundation/PxMath.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXMATH_H -#define PXFOUNDATION_PXMATH_H +#ifndef PX_MATH_H +#define PX_MATH_H /** \addtogroup foundation @{ @@ -36,6 +35,7 @@ #include "foundation/PxPreprocessor.h" + #if PX_VC #pragma warning(push) #pragma warning(disable : 4985) // 'symbol name': attributes not present on previous declaration @@ -45,9 +45,15 @@ #pragma warning(pop) #endif +#if (PX_LINUX_FAMILY && !PX_ARM_FAMILY) +// Force linking against nothing newer than glibc v2.17 to remain compatible with platforms with older glibc versions +__asm__(".symver expf,expf@GLIBC_2.2.5"); +__asm__(".symver powf,powf@GLIBC_2.2.5"); +#endif + #include -#include "foundation/PxIntrinsics.h" -#include "foundation/PxSharedAssert.h" +#include "foundation/PxMathIntrinsics.h" +#include "foundation/PxAssert.h" #if !PX_DOXYGEN namespace physx @@ -62,6 +68,8 @@ static const float PxInvPi = float(0.31830988618379067154); static const float PxInvTwoPi = float(0.15915494309189533577); static const float PxPiDivTwo = float(1.57079632679489661923); static const float PxPiDivFour = float(0.78539816339744830962); +static const float PxSqrt2 = float(1.4142135623730951); +static const float PxInvSqrt2 = float(0.7071067811865476); /** \brief The return value is the greater of the two specified values. @@ -136,7 +144,7 @@ PX_CUDA_CALLABLE PX_FORCE_INLINE int32_t PxAbs(int32_t a) template PX_CUDA_CALLABLE PX_FORCE_INLINE T PxClamp(T v, T lo, T hi) { - PX_SHARED_ASSERT(lo <= hi); + PX_ASSERT(lo <= hi); return PxMin(hi, PxMax(lo, v)); } @@ -164,6 +172,12 @@ PX_CUDA_CALLABLE PX_FORCE_INLINE double PxRecipSqrt(double a) return 1 / ::sqrt(a); } +//! \brief square of the argument +PX_CUDA_CALLABLE PX_FORCE_INLINE PxF32 PxSqr(const PxF32 a) +{ + return a * a; +} + //! trigonometry -- all angles are in radians. //! \brief Sine of an angle ( Unit: Radians ) @@ -190,6 +204,24 @@ PX_CUDA_CALLABLE PX_FORCE_INLINE double PxCos(double a) return ::cos(a); } +//! \brief compute sine and cosine at the same time +PX_CUDA_CALLABLE PX_FORCE_INLINE void PxSinCos(const PxF32 a, PxF32& sin, PxF32& cos) +{ +#if defined(__CUDACC__) && __CUDA_ARCH__ >= 350 + __sincosf(a, &sin, &cos); +#else + sin = PxSin(a); + cos = PxCos(a); +#endif +} + +//! \brief compute sine and cosine at the same time +PX_CUDA_CALLABLE PX_FORCE_INLINE void PxSinCos(const double a, double& sin, double& cos) +{ + sin = PxSin(a); + cos = PxCos(a); +} + /** \brief Tangent of an angle. Unit: Radians @@ -288,6 +320,14 @@ PX_CUDA_CALLABLE PX_FORCE_INLINE double PxAtan2(double x, double y) return ::atan2(x, y); } +/** +\brief Converts degrees to radians. +*/ +PX_CUDA_CALLABLE PX_FORCE_INLINE PxF32 PxDegToRad(const PxF32 a) +{ + return 0.01745329251994329547f * a; +} + //! \brief returns true if the passed number is a finite floating point number as opposed to INF, NAN, etc. PX_CUDA_CALLABLE PX_FORCE_INLINE bool PxIsFinite(float f) { @@ -320,6 +360,11 @@ PX_CUDA_CALLABLE PX_FORCE_INLINE float PxSign(float a) return physx::intrinsics::sign(a); } +PX_CUDA_CALLABLE PX_FORCE_INLINE float PxSign2(float a, float eps = FLT_EPSILON) +{ + return (a < -eps) ? -1.0f : (a > eps) ? 1.0f : 0.0f; +} + PX_CUDA_CALLABLE PX_FORCE_INLINE float PxPow(float x, float y) { return ::powf(x, y); @@ -335,4 +380,5 @@ PX_CUDA_CALLABLE PX_FORCE_INLINE float PxLog(float x) #endif /** @} */ -#endif // #ifndef PXFOUNDATION_PXMATH_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/Ps.h b/Source/ThirdParty/PhysX/foundation/PxMathIntrinsics.h similarity index 64% rename from Source/ThirdParty/PhysX/foundation/Ps.h rename to Source/ThirdParty/PhysX/foundation/PxMathIntrinsics.h index ca4c50d09..0a82e3479 100644 --- a/Source/ThirdParty/PhysX/foundation/Ps.h +++ b/Source/ThirdParty/PhysX/foundation/PxMathIntrinsics.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,48 +22,31 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PSFOUNDATION_PS_H -#define PSFOUNDATION_PS_H +#ifndef PX_MATH_INTRINSICS_H +#define PX_MATH_INTRINSICS_H -/*! \file top level include file for shared foundation */ +#include "foundation/PxPreprocessor.h" -#include "foundation/Px.h" +#if PX_WINDOWS_FAMILY +#include "foundation/windows/PxWindowsMathIntrinsics.h" +#elif (PX_LINUX || PX_ANDROID || PX_PS4 || PX_PS5 || PX_APPLE_FAMILY) +#include "foundation/unix/PxUnixMathIntrinsics.h" +#elif PX_SWITCH +#include "foundation/switch/PxSwitchMathIntrinsics.h" +#else +#error "Platform not supported!" +#endif /** Platform specific defines */ -#if PX_WINDOWS_FAMILY || PX_XBOXONE -#pragma intrinsic(memcmp) -#pragma intrinsic(memcpy) -#pragma intrinsic(memset) +#if PX_WINDOWS_FAMILY #pragma intrinsic(abs) #pragma intrinsic(labs) #endif -// An expression that should expand to nothing in non PX_CHECKED builds. -// We currently use this only for tagging the purpose of containers for memory use tracking. -#if PX_CHECKED -#define PX_DEBUG_EXP(x) (x) -#else -#define PX_DEBUG_EXP(x) -#endif - -#define PX_SIGN_BITMASK 0x80000000 - -namespace physx -{ -namespace shdfnd -{ -// Int-as-bool type - has some uses for efficiency and with SIMD -typedef int IntBool; -static const IntBool IntFalse = 0; -static const IntBool IntTrue = 1; -} - -} // namespace physx - -#endif // #ifndef PSFOUNDATION_PS_H +#endif diff --git a/Source/ThirdParty/PhysX/foundation/PxMathUtils.h b/Source/ThirdParty/PhysX/foundation/PxMathUtils.h index 445439c0c..bfbf3b7be 100644 --- a/Source/ThirdParty/PhysX/foundation/PxMathUtils.h +++ b/Source/ThirdParty/PhysX/foundation/PxMathUtils.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,19 +22,22 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXMATHUTILS_H -#define PXFOUNDATION_PXMATHUTILS_H +#ifndef PX_MATH_UTILS_H +#define PX_MATH_UTILS_H /** \addtogroup common @{ */ -#include "foundation/Px.h" #include "foundation/PxFoundationConfig.h" +#include "foundation/Px.h" +#include "foundation/PxVec4.h" +#include "foundation/PxAssert.h" +#include "foundation/PxPlane.h" #if !PX_DOXYGEN namespace physx @@ -49,7 +51,6 @@ namespace physx \param[in] target the vector to rotate to \return a rotation about an axis normal to the two vectors which takes one to the other via the shortest path */ - PX_FOUNDATION_API PxQuat PxShortestRotation(const PxVec3& from, const PxVec3& target); /* \brief diagonalizes a 3x3 symmetric matrix y @@ -63,9 +64,435 @@ If the matrix is not symmetric, the result is undefined. \param[out] axes a quaternion rotation which diagonalizes the matrix \return the vector diagonal of the diagonalized matrix. */ - PX_FOUNDATION_API PxVec3 PxDiagonalize(const PxMat33& m, PxQuat& axes); +/** \brief creates a transform from the endpoints of a segment, suitable for an actor transform for a PxCapsuleGeometry + +\param[in] p0 one end of major axis of the capsule +\param[in] p1 the other end of the axis of the capsule +\param[out] halfHeight the halfHeight of the capsule. This parameter is optional. +\return A PxTransform which will transform the vector (1,0,0) to the capsule axis shrunk by the halfHeight +*/ +PX_FOUNDATION_API PxTransform PxTransformFromSegment(const PxVec3& p0, const PxVec3& p1, PxReal* halfHeight = NULL); + +/** \brief creates a transform from a plane equation, suitable for an actor transform for a PxPlaneGeometry + +\param[in] plane the desired plane equation +\return a PxTransform which will transform the plane PxPlane(1,0,0,0) to the specified plane +*/ +PX_FOUNDATION_API PxTransform PxTransformFromPlaneEquation(const PxPlane& plane); + +/** \brief creates a plane equation from a transform, such as the actor transform for a PxPlaneGeometry + +\param[in] pose the transform +\return the plane +*/ +PX_INLINE PxPlane PxPlaneEquationFromTransform(const PxTransform& pose) +{ + return PxPlane(1.0f, 0.0f, 0.0f, 0.0f).transform(pose); +} + +/** +\brief Spherical linear interpolation of two quaternions. +\param[in] t is the interpolation parameter in range (0, 1) +\param[in] left is the start of the interpolation +\param[in] right is the end of the interpolation +\return Returns left when t=0, right when t=1 and a linear interpolation of left and right when 0 < t < 1. +Returns angle between -PI and PI in radians +*/ +PX_FOUNDATION_API PxQuat PxSlerp(const PxReal t, const PxQuat& left, const PxQuat& right); + +/** +\brief integrate transform. +\param[in] curTrans The current transform +\param[in] linvel Linear velocity +\param[in] angvel Angular velocity +\param[in] timeStep The time-step for integration +\param[out] result The integrated transform +*/ +PX_FOUNDATION_API void PxIntegrateTransform(const PxTransform& curTrans, const PxVec3& linvel, const PxVec3& angvel, + PxReal timeStep, PxTransform& result); + +//! \brief Compute the exponent of a PxVec3 +PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuat PxExp(const PxVec3& v) +{ + const PxReal m = v.magnitudeSquared(); + return m < 1e-24f ? PxQuat(PxIdentity) : PxQuat(PxSqrt(m), v * PxRecipSqrt(m)); +} + +/** +\brief computes a oriented bounding box around the scaled basis. +\param basis Input = skewed basis, Output = (normalized) orthogonal basis. +\return Bounding box extent. +*/ +PX_FOUNDATION_API PxVec3 PxOptimizeBoundingBox(PxMat33& basis); + +/** +\brief return Returns the log of a PxQuat +*/ +PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 PxLog(const PxQuat& q) +{ + const PxReal s = q.getImaginaryPart().magnitude(); + if (s < 1e-12f) + return PxVec3(0.0f); + // force the half-angle to have magnitude <= pi/2 + PxReal halfAngle = q.w < 0 ? PxAtan2(-s, -q.w) : PxAtan2(s, q.w); + PX_ASSERT(halfAngle >= -PxPi / 2 && halfAngle <= PxPi / 2); + + return q.getImaginaryPart().getNormalized() * 2.f * halfAngle; +} + +/** +\brief return Returns 0 if v.x is largest element of v, 1 if v.y is largest element, 2 if v.z is largest element. +*/ +PX_CUDA_CALLABLE PX_FORCE_INLINE PxU32 PxLargestAxis(const PxVec3& v) +{ + PxU32 m = PxU32(v.y > v.x ? 1 : 0); + return v.z > v[m] ? 2 : m; +} + +/** +\brief Compute tan(theta/2) given sin(theta) and cos(theta) as inputs. +\param[in] sin has value sin(theta) +\param[in] cos has value cos(theta) +\return Returns tan(theta/2) +*/ +PX_CUDA_CALLABLE PX_FORCE_INLINE PxReal PxTanHalf(PxReal sin, PxReal cos) +{ + // PT: avoids divide by zero for singularity. We return sqrt(FLT_MAX) instead of FLT_MAX + // to make sure the calling code doesn't generate INF values when manipulating the returned value + // (some joints multiply it by 4, etc). + if (cos == -1.0f) + return sin < 0.0f ? -sqrtf(FLT_MAX) : sqrtf(FLT_MAX); + + // PT: half-angle formula: tan(a/2) = sin(a)/(1+cos(a)) + return sin / (1.0f + cos); +} + +/** +\brief Compute the closest point on an 2d ellipse to a given 2d point. +\param[in] point is a 2d point in the y-z plane represented by (point.y, point.z) +\param[in] radii are the radii of the ellipse (radii.y and radii.z) in the y-z plane. +\return Returns the 2d position on the surface of the ellipse that is closest to point. +*/ +PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 PxEllipseClamp(const PxVec3& point, const PxVec3& radii) +{ + // lagrange multiplier method with Newton/Halley hybrid root-finder. + // see http://www.geometrictools.com/Documentation/DistancePointToEllipse2.pdf + // for proof of Newton step robustness and initial estimate. + // Halley converges much faster but sometimes overshoots - when that happens we take + // a newton step instead + + // converges in 1-2 iterations where D&C works well, and it's good with 4 iterations + // with any ellipse that isn't completely crazy + + const PxU32 MAX_ITERATIONS = 20; + const PxReal convergenceThreshold = 1e-4f; + + // iteration requires first quadrant but we recover generality later + + PxVec3 q(0, PxAbs(point.y), PxAbs(point.z)); + const PxReal tinyEps = 1e-6f; // very close to minor axis is numerically problematic but trivial + if (radii.y >= radii.z) + { + if (q.z < tinyEps) + return PxVec3(0, point.y > 0 ? radii.y : -radii.y, 0); + } + else + { + if (q.y < tinyEps) + return PxVec3(0, 0, point.z > 0 ? radii.z : -radii.z); + } + + PxVec3 denom, e2 = radii.multiply(radii), eq = radii.multiply(q); + + // we can use any initial guess which is > maximum(-e.y^2,-e.z^2) and for which f(t) is > 0. + // this guess works well near the axes, but is weak along the diagonals. + + PxReal t = PxMax(eq.y - e2.y, eq.z - e2.z); + + for (PxU32 i = 0; i < MAX_ITERATIONS; i++) + { + denom = PxVec3(0, 1 / (t + e2.y), 1 / (t + e2.z)); + PxVec3 denom2 = eq.multiply(denom); + + PxVec3 fv = denom2.multiply(denom2); + PxReal f = fv.y + fv.z - 1; + + // although in exact arithmetic we are guaranteed f>0, we can get here + // on the first iteration via catastrophic cancellation if the point is + // very close to the origin. In that case we just behave as if f=0 + + if (f < convergenceThreshold) + return e2.multiply(point).multiply(denom); + + PxReal df = fv.dot(denom) * -2.0f; + t = t - f / df; + } + + // we didn't converge, so clamp what we have + PxVec3 r = e2.multiply(point).multiply(denom); + return r * PxRecipSqrt(PxSqr(r.y / radii.y) + PxSqr(r.z / radii.z)); +} + +/** +\brief Compute from an input quaternion q a pair of quaternions (swing, twist) such that +q = swing * twist +with the caveats that swing.x = twist.y = twist.z = 0. +\param[in] q is the quaternion to be decomposed into swing and twist quaternions. +\param[out] swing is the swing component of the quaternion decomposition. +\param[out] twist is the twist component of the quaternion decomposition. +*/ +PX_CUDA_CALLABLE PX_FORCE_INLINE void PxSeparateSwingTwist(const PxQuat& q, PxQuat& swing, PxQuat& twist) +{ + twist = q.x != 0.0f ? PxQuat(q.x, 0, 0, q.w).getNormalized() : PxQuat(PxIdentity); + swing = q * twist.getConjugate(); +} + +/** +\brief Compute the angle between two non-unit vectors +\param[in] v0 is one of the non-unit vectors +\param[in] v1 is the other of the two non-unit vectors +\return Returns the angle (in radians) between the two vector v0 and v1. +*/ +PX_CUDA_CALLABLE PX_FORCE_INLINE PxF32 PxComputeAngle(const PxVec3& v0, const PxVec3& v1) +{ + const PxF32 cos = v0.dot(v1); // |v0|*|v1|*Cos(Angle) + const PxF32 sin = (v0.cross(v1)).magnitude(); // |v0|*|v1|*Sin(Angle) + return PxAtan2(sin, cos); +} + +/** +\brief Compute two normalized vectors (right and up) that are perpendicular to an input normalized vector (dir). +\param[in] dir is a normalized vector that is used to compute the perpendicular vectors. +\param[out] right is the first of the two vectors perpendicular to dir +\param[out] up is the second of the two vectors perpendicular to dir +*/ +PX_INLINE void PxComputeBasisVectors(const PxVec3& dir, PxVec3& right, PxVec3& up) +{ + // Derive two remaining vectors + if (PxAbs(dir.y) <= 0.9999f) + { + right = PxVec3(dir.z, 0.0f, -dir.x); + right.normalize(); + + // PT: normalize not needed for 'up' because dir & right are unit vectors, + // and by construction the angle between them is 90 degrees (i.e. sin(angle)=1) + up = PxVec3(dir.y * right.z, dir.z * right.x - dir.x * right.z, -dir.y * right.x); + } + else + { + right = PxVec3(1.0f, 0.0f, 0.0f); + + up = PxVec3(0.0f, dir.z, -dir.y); + up.normalize(); + } +} + +/** +\brief Compute three normalized vectors (dir, right and up) that are parallel to (dir) and perpendicular to (right, up) the +normalized direction vector (p1 - p0)/||p1 - p0||. +\param[in] p0 is used to compute the normalized vector dir = (p1 - p0)/||p1 - p0||. +\param[in] p1 is used to compute the normalized vector dir = (p1 - p0)/||p1 - p0||. +\param[out] dir is the normalized vector (p1 - p0)/||p1 - p0||. +\param[out] right is the first of the two normalized vectors perpendicular to dir +\param[out] up is the second of the two normalized vectors perpendicular to dir +*/ +PX_INLINE void PxComputeBasisVectors(const PxVec3& p0, const PxVec3& p1, PxVec3& dir, PxVec3& right, PxVec3& up) +{ + // Compute the new direction vector + dir = p1 - p0; + dir.normalize(); + + // Derive two remaining vectors + PxComputeBasisVectors(dir, right, up); +} + + +/** +\brief Compute (i+1)%3 +*/ +PX_INLINE PxU32 PxGetNextIndex3(PxU32 i) +{ + return (i + 1 + (i >> 1)) & 3; +} + +PX_INLINE PX_CUDA_CALLABLE void computeBarycentric(const PxVec3& a, const PxVec3& b, const PxVec3& c, const PxVec3& d, const PxVec3& p, PxVec4& bary) +{ + const PxVec3 ba = b - a; + const PxVec3 ca = c - a; + const PxVec3 da = d - a; + const PxVec3 pa = p - a; + + const PxReal detBcd = ba.dot(ca.cross(da)); + const PxReal detPcd = pa.dot(ca.cross(da)); + + bary.y = detPcd / detBcd; + + const PxReal detBpd = ba.dot(pa.cross(da)); + bary.z = detBpd / detBcd; + + const PxReal detBcp = ba.dot(ca.cross(pa)); + + bary.w = detBcp / detBcd; + bary.x = 1 - bary.y - bary.z - bary.w; +} + +PX_INLINE PX_CUDA_CALLABLE void computeBarycentric(const PxVec3& a, const PxVec3& b, const PxVec3& c, const PxVec3& p, PxVec4& bary) +{ + const PxVec3 v0 = b - a; + const PxVec3 v1 = c - a; + const PxVec3 v2 = p - a; + + const float d00 = v0.dot(v0); + const float d01 = v0.dot(v1); + const float d11 = v1.dot(v1); + const float d20 = v2.dot(v0); + const float d21 = v2.dot(v1); + + const float denom = d00 * d11 - d01 * d01; + const float v = (d11 * d20 - d01 * d21) / denom; + const float w = (d00 * d21 - d01 * d20) / denom; + const float u = 1.f - v - w; + + bary.x = u; bary.y = v; bary.z = w; + bary.w = 0.f; +} + + +// lerp +struct Interpolation +{ + PX_INLINE PX_CUDA_CALLABLE static float PxLerp(float a, float b, float t) + { + return a + t * (b - a); + } + + PX_INLINE PX_CUDA_CALLABLE static PxReal PxBiLerp( + const PxReal f00, + const PxReal f10, + const PxReal f01, + const PxReal f11, + const PxReal tx, const PxReal ty) + { + return PxLerp( + PxLerp(f00, f10, tx), + PxLerp(f01, f11, tx), + ty); + } + + PX_INLINE PX_CUDA_CALLABLE static PxReal PxTriLerp( + const PxReal f000, + const PxReal f100, + const PxReal f010, + const PxReal f110, + const PxReal f001, + const PxReal f101, + const PxReal f011, + const PxReal f111, + const PxReal tx, + const PxReal ty, + const PxReal tz) + { + return PxLerp( + PxBiLerp(f000, f100, f010, f110, tx, ty), + PxBiLerp(f001, f101, f011, f111, tx, ty), + tz); + } + + PX_INLINE PX_CUDA_CALLABLE static PxU32 PxSDFIdx(PxU32 i, PxU32 j, PxU32 k, PxU32 nbX, PxU32 nbY) + { + return i + j * nbX + k * nbX*nbY; + } + + PX_INLINE PX_CUDA_CALLABLE static PxReal PxSDFSampleImpl(const PxReal* PX_RESTRICT sdf, const PxVec3& localPos, const PxVec3& sdfBoxLower, + const PxVec3& sdfBoxHigher, const PxReal sdfDx, const PxReal invSdfDx, const PxU32 dimX, const PxU32 dimY, const PxU32 dimZ, PxReal tolerance) + { + PxVec3 clampedGridPt = localPos.maximum(sdfBoxLower).minimum(sdfBoxHigher); + + const PxVec3 diff = (localPos - clampedGridPt); + + if (diff.magnitudeSquared() > tolerance*tolerance) + return PX_MAX_F32; + + PxVec3 f = (clampedGridPt - sdfBoxLower) * invSdfDx; + + PxU32 i = PxU32(f.x); + PxU32 j = PxU32(f.y); + PxU32 k = PxU32(f.z); + + f -= PxVec3(PxReal(i), PxReal(j), PxReal(k)); + + if (i >= (dimX - 1)) + { + i = dimX - 2; + clampedGridPt.x -= f.x * sdfDx; + f.x = 1.f; + } + if (j >= (dimY - 1)) + { + j = dimY - 2; + clampedGridPt.y -= f.y * sdfDx; + f.y = 1.f; + } + if (k >= (dimZ - 1)) + { + k = dimZ - 2; + clampedGridPt.z -= f.z * sdfDx; + f.z = 1.f; + } + + const PxReal s000 = sdf[Interpolation::PxSDFIdx(i, j, k, dimX, dimY)]; + const PxReal s100 = sdf[Interpolation::PxSDFIdx(i + 1, j, k, dimX, dimY)]; + const PxReal s010 = sdf[Interpolation::PxSDFIdx(i, j + 1, k, dimX, dimY)]; + const PxReal s110 = sdf[Interpolation::PxSDFIdx(i + 1, j + 1, k, dimX, dimY)]; + const PxReal s001 = sdf[Interpolation::PxSDFIdx(i, j, k + 1, dimX, dimY)]; + const PxReal s101 = sdf[Interpolation::PxSDFIdx(i + 1, j, k + 1, dimX, dimY)]; + const PxReal s011 = sdf[Interpolation::PxSDFIdx(i, j + 1, k + 1, dimX, dimY)]; + const PxReal s111 = sdf[Interpolation::PxSDFIdx(i + 1, j + 1, k + 1, dimX, dimY)]; + + PxReal dist = PxTriLerp( + s000, + s100, + s010, + s110, + s001, + s101, + s011, + s111, + f.x, f.y, f.z); + + dist += diff.magnitude(); + + return dist; + } + +}; + +PX_INLINE PX_CUDA_CALLABLE PxReal PxSdfSample(const PxReal* PX_RESTRICT sdf, const PxVec3& localPos, const PxVec3& sdfBoxLower, + const PxVec3& sdfBoxHigher, const PxReal sdfDx, const PxReal invSdfDx, const PxU32 dimX, const PxU32 dimY, const PxU32 dimZ, PxVec3& gradient, PxReal tolerance = PX_MAX_F32) +{ + + PxReal dist = Interpolation::PxSDFSampleImpl(sdf, localPos, sdfBoxLower, sdfBoxHigher, sdfDx, invSdfDx, dimX, dimY, dimZ, tolerance); + + if (dist < tolerance) + { + + PxVec3 grad; + grad.x = Interpolation::PxSDFSampleImpl(sdf, localPos + PxVec3(sdfDx, 0.f, 0.f), sdfBoxLower, sdfBoxHigher, sdfDx, invSdfDx, dimX, dimY, dimZ, tolerance) - + Interpolation::PxSDFSampleImpl(sdf, localPos - PxVec3(sdfDx, 0.f, 0.f), sdfBoxLower, sdfBoxHigher, sdfDx, invSdfDx, dimX, dimY, dimZ, tolerance); + grad.y = Interpolation::PxSDFSampleImpl(sdf, localPos + PxVec3(0.f, sdfDx, 0.f), sdfBoxLower, sdfBoxHigher, sdfDx, invSdfDx, dimX, dimY, dimZ, tolerance) - + Interpolation::PxSDFSampleImpl(sdf, localPos - PxVec3(0.f, sdfDx, 0.f), sdfBoxLower, sdfBoxHigher, sdfDx, invSdfDx, dimX, dimY, dimZ, tolerance); + grad.z = Interpolation::PxSDFSampleImpl(sdf, localPos + PxVec3(0.f, 0.f, sdfDx), sdfBoxLower, sdfBoxHigher, sdfDx, invSdfDx, dimX, dimY, dimZ, tolerance) - + Interpolation::PxSDFSampleImpl(sdf, localPos - PxVec3(0.f, 0.f, sdfDx), sdfBoxLower, sdfBoxHigher, sdfDx, invSdfDx, dimX, dimY, dimZ, tolerance); + + gradient = grad; + + } + + return dist; +} + #if !PX_DOXYGEN } // namespace physx #endif diff --git a/Source/ThirdParty/PhysX/foundation/PxMemory.h b/Source/ThirdParty/PhysX/foundation/PxMemory.h index 911b0d48f..750a5faef 100644 --- a/Source/ThirdParty/PhysX/foundation/PxMemory.h +++ b/Source/ThirdParty/PhysX/foundation/PxMemory.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,19 +22,19 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXMEMORY_H -#define PXFOUNDATION_PXMEMORY_H +#ifndef PX_MEMORY_H +#define PX_MEMORY_H /** \addtogroup foundation @{ */ #include "foundation/Px.h" -#include "foundation/PxIntrinsics.h" +#include "foundation/PxMathIntrinsics.h" #include "foundation/PxSimpleTypes.h" #if !PX_DOXYGEN @@ -43,68 +42,86 @@ namespace physx { #endif -/** -\brief Sets the bytes of the provided buffer to zero. + /** + \brief Sets the bytes of the provided buffer to zero. -\param dest Pointer to block of memory to set zero. -\param count Number of bytes to set to zero. + \param dest [out] Pointer to block of memory to set zero. + \param count [in] Number of bytes to set to zero. -\return Pointer to memory block (same as input) -*/ -PX_FORCE_INLINE void* PxMemZero(void* dest, PxU32 count) -{ - return physx::intrinsics::memZero(dest, count); -} + \return Pointer to memory block (same as input) + */ + PX_FORCE_INLINE void* PxMemZero(void* dest, PxU32 count) + { + return physx::intrinsics::memZero(dest, count); + } -/** -\brief Sets the bytes of the provided buffer to the specified value. + /** + \brief Sets the bytes of the provided buffer to the specified value. -\param dest Pointer to block of memory to set to the specified value. -\param c Value to set the bytes of the block of memory to. -\param count Number of bytes to set to the specified value. + \param dest [out] Pointer to block of memory to set to the specified value. + \param c [in] Value to set the bytes of the block of memory to. + \param count [in] Number of bytes to set to the specified value. -\return Pointer to memory block (same as input) -*/ -PX_FORCE_INLINE void* PxMemSet(void* dest, PxI32 c, PxU32 count) -{ - return physx::intrinsics::memSet(dest, c, count); -} + \return Pointer to memory block (same as input) + */ + PX_FORCE_INLINE void* PxMemSet(void* dest, PxI32 c, PxU32 count) + { + return physx::intrinsics::memSet(dest, c, count); + } -/** -\brief Copies the bytes of one memory block to another. The memory blocks must not overlap. + /** + \brief Copies the bytes of one memory block to another. The memory blocks must not overlap. -\note Use #PxMemMove if memory blocks overlap. + \note Use #PxMemMove if memory blocks overlap. -\param dest Pointer to block of memory to copy to. -\param src Pointer to block of memory to copy from. -\param count Number of bytes to copy. + \param dest [out] Pointer to block of memory to copy to. + \param src [in] Pointer to block of memory to copy from. + \param count [in] Number of bytes to copy. -\return Pointer to destination memory block -*/ -PX_FORCE_INLINE void* PxMemCopy(void* dest, const void* src, PxU32 count) -{ - return physx::intrinsics::memCopy(dest, src, count); -} + \return Pointer to destination memory block + */ + PX_FORCE_INLINE void* PxMemCopy(void* dest, const void* src, PxU32 count) + { + return physx::intrinsics::memCopy(dest, src, count); + } -/** -\brief Copies the bytes of one memory block to another. The memory blocks can overlap. + /** + \brief Copies the bytes of one memory block to another. The memory blocks can overlap. -\note Use #PxMemCopy if memory blocks do not overlap. + \note Use #PxMemCopy if memory blocks do not overlap. -\param dest Pointer to block of memory to copy to. -\param src Pointer to block of memory to copy from. -\param count Number of bytes to copy. + \param dest [out] Pointer to block of memory to copy to. + \param src [in] Pointer to block of memory to copy from. + \param count [in] Number of bytes to copy. -\return Pointer to destination memory block -*/ -PX_FORCE_INLINE void* PxMemMove(void* dest, const void* src, PxU32 count) -{ - return physx::intrinsics::memMove(dest, src, count); -} + \return Pointer to destination memory block + */ + PX_FORCE_INLINE void* PxMemMove(void* dest, const void* src, PxU32 count) + { + return physx::intrinsics::memMove(dest, src, count); + } + + /** + Mark a specified amount of memory with 0xcd pattern. This is used to check that the meta data + definition for serialized classes is complete in checked builds. + + \param ptr [out] Pointer to block of memory to initialize. + \param byteSize [in] Number of bytes to initialize. + */ + PX_INLINE void PxMarkSerializedMemory(void* ptr, PxU32 byteSize) + { +#if PX_CHECKED + PxMemSet(ptr, 0xcd, byteSize); +#else + PX_UNUSED(ptr); + PX_UNUSED(byteSize); +#endif + } #if !PX_DOXYGEN } // namespace physx #endif /** @} */ -#endif // PXFOUNDATION_PXMEMORY_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxMutex.h b/Source/ThirdParty/PhysX/foundation/PxMutex.h new file mode 100644 index 000000000..fcb8e021b --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxMutex.h @@ -0,0 +1,183 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_MUTEX_H +#define PX_MUTEX_H + +#include "foundation/PxAllocator.h" + +/* + * This inclusion is a best known fix for gcc 4.4.1 error: + * Creating object file for apex/src/PsAllocator.cpp ... + * In file included from apex/include/PsFoundation.h:30, + * from apex/src/PsAllocator.cpp:26: + * apex/include/PsMutex.h: In constructor 'physx::PxMutexT::MutexT(const Alloc&)': + * apex/include/PsMutex.h:92: error: no matching function for call to 'operator new(unsigned int, + * physx::PxMutexImpl*&)' + * :0: note: candidates are: void* operator new(unsigned int) + */ +#include + +#if !PX_DOXYGEN +namespace physx +{ +#endif +class PX_FOUNDATION_API PxMutexImpl +{ + public: + /** + The constructor for Mutex creates a mutex. It is initially unlocked. + */ + PxMutexImpl(); + + /** + The destructor for Mutex deletes the mutex. + */ + ~PxMutexImpl(); + + /** + Acquire (lock) the mutex. If the mutex is already locked + by another thread, this method blocks until the mutex is + unlocked. + */ + void lock(); + + /** + Acquire (lock) the mutex. If the mutex is already locked + by another thread, this method returns false without blocking. + */ + bool trylock(); + + /** + Release (unlock) the mutex. + */ + void unlock(); + + /** + Size of this class. + */ + static uint32_t getSize(); +}; + +template > +class PxMutexT : protected Alloc +{ + PX_NOCOPY(PxMutexT) + public: + class ScopedLock + { + PxMutexT& mMutex; + PX_NOCOPY(ScopedLock) + public: + PX_INLINE ScopedLock(PxMutexT& mutex) : mMutex(mutex) + { + mMutex.lock(); + } + PX_INLINE ~ScopedLock() + { + mMutex.unlock(); + } + }; + + /** + The constructor for Mutex creates a mutex. It is initially unlocked. + */ + PxMutexT(const Alloc& alloc = Alloc()) : Alloc(alloc) + { + mImpl = reinterpret_cast(Alloc::allocate(PxMutexImpl::getSize(), __FILE__, __LINE__)); + PX_PLACEMENT_NEW(mImpl, PxMutexImpl)(); + } + + /** + The destructor for Mutex deletes the mutex. + */ + ~PxMutexT() + { + mImpl->~PxMutexImpl(); + Alloc::deallocate(mImpl); + } + + /** + Acquire (lock) the mutex. If the mutex is already locked + by another thread, this method blocks until the mutex is + unlocked. + */ + PX_FORCE_INLINE void lock() const + { + mImpl->lock(); + } + + /** + Acquire (lock) the mutex. If the mutex is already locked + by another thread, this method returns false without blocking, + returns true if lock is successfully acquired + */ + PX_FORCE_INLINE bool trylock() const + { + return mImpl->trylock(); + } + + /** + Release (unlock) the mutex, the calling thread must have + previously called lock() or method will error + */ + PX_FORCE_INLINE void unlock() const + { + mImpl->unlock(); + } + + private: + PxMutexImpl* mImpl; +}; + +class PX_FOUNDATION_API PxReadWriteLock +{ + PX_NOCOPY(PxReadWriteLock) + public: + PxReadWriteLock(); + ~PxReadWriteLock(); + + // "takeLock" can only be false if the thread already holds the mutex, e.g. if it already acquired the write lock + void lockReader(bool takeLock); + void lockWriter(); + + void unlockReader(); + void unlockWriter(); + + private: + class ReadWriteLockImpl* mImpl; +}; + +typedef PxMutexT<> PxMutex; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/PxPhysicsVersion.h b/Source/ThirdParty/PhysX/foundation/PxPhysicsVersion.h similarity index 88% rename from Source/ThirdParty/PhysX/PxPhysicsVersion.h rename to Source/ThirdParty/PhysX/foundation/PxPhysicsVersion.h index 4f8c67c07..bab58af26 100644 --- a/Source/ThirdParty/PhysX/PxPhysicsVersion.h +++ b/Source/ThirdParty/PhysX/foundation/PxPhysicsVersion.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_PHYSICS_VERSION_NUMBER_H -#define PX_PHYSICS_VERSION_NUMBER_H +#ifndef PX_PHYSICS_VERSION_H +#define PX_PHYSICS_VERSION_H /* VersionNumbers: The combination of these @@ -49,9 +48,9 @@ sometimes they are stored in a byte. @{ */ -#define PX_PHYSICS_VERSION_MAJOR 4 +#define PX_PHYSICS_VERSION_MAJOR 5 #define PX_PHYSICS_VERSION_MINOR 1 -#define PX_PHYSICS_VERSION_BUGFIX 1 +#define PX_PHYSICS_VERSION_BUGFIX 3 /** The constant PX_PHYSICS_VERSION is used when creating certain PhysX module objects. @@ -59,7 +58,6 @@ This is to ensure that the application is using the same header version as the l */ #define PX_PHYSICS_VERSION ((PX_PHYSICS_VERSION_MAJOR<<24) + (PX_PHYSICS_VERSION_MINOR<<16) + (PX_PHYSICS_VERSION_BUGFIX<<8) + 0) - -#endif // PX_PHYSICS_VERSION_NUMBER_H +#endif /** @} */ diff --git a/Source/ThirdParty/PhysX/foundation/PxPinnedArray.h b/Source/ThirdParty/PhysX/foundation/PxPinnedArray.h new file mode 100644 index 000000000..020fb4383 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxPinnedArray.h @@ -0,0 +1,53 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_PINNED_ARRAY_H +#define PX_PINNED_ARRAY_H + +#include "foundation/PxArray.h" +#include "foundation/PxAllocator.h" +#include "foundation/PxBounds3.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + template + using PxPinnedArray = PxArray; + + typedef PxArray PxBoundsArrayPinned; + typedef PxArray PxFloatArrayPinned; + typedef PxArray PxInt32ArrayPinned; + typedef PxArray PxInt8ArrayPinned; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxPlane.h b/Source/ThirdParty/PhysX/foundation/PxPlane.h index 76f63f2cd..a04186204 100644 --- a/Source/ThirdParty/PhysX/foundation/PxPlane.h +++ b/Source/ThirdParty/PhysX/foundation/PxPlane.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,19 +22,18 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXPLANE_H -#define PXFOUNDATION_PXPLANE_H +#ifndef PX_PLANE_H +#define PX_PLANE_H /** \addtogroup foundation @{ */ -#include "foundation/PxMath.h" -#include "foundation/PxVec3.h" +#include "foundation/PxTransform.h" #if !PX_DOXYGEN namespace physx @@ -133,6 +131,24 @@ class PxPlane d *= denom; } + /** + \brief transform plane + */ + PX_CUDA_CALLABLE PX_FORCE_INLINE PxPlane transform(const PxTransform& pose) const + { + const PxVec3 transformedNormal = pose.rotate(n); + return PxPlane(transformedNormal, d - pose.p.dot(transformedNormal)); + } + + /** + \brief inverse-transform plane + */ + PX_CUDA_CALLABLE PX_FORCE_INLINE PxPlane inverseTransform(const PxTransform& pose) const + { + const PxVec3 transformedNormal = pose.rotateInv(n); + return PxPlane(transformedNormal, d + pose.p.dot(n)); + } + PxVec3 n; //!< The normal to the plane float d; //!< The distance from the origin }; @@ -142,4 +158,5 @@ class PxPlane #endif /** @} */ -#endif // #ifndef PXFOUNDATION_PXPLANE_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxPool.h b/Source/ThirdParty/PhysX/foundation/PxPool.h new file mode 100644 index 000000000..21c83678a --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxPool.h @@ -0,0 +1,269 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_POOL_H +#define PX_POOL_H + +#include "foundation/PxArray.h" +#include "foundation/PxSort.h" +#include "foundation/PxBasicTemplates.h" +#include "foundation/PxInlineArray.h" +#include "foundation/PxMemory.h" + +namespace physx +{ + +/*! +Simple allocation pool +*/ +template ::Type> +class PxPoolBase : public PxUserAllocated, public Alloc +{ + PX_NOCOPY(PxPoolBase) + protected: + PxPoolBase(const Alloc& alloc, uint32_t elementsPerSlab, uint32_t slabSize) + : Alloc(alloc), mSlabs(alloc), mElementsPerSlab(elementsPerSlab), mUsed(0), mSlabSize(slabSize), mFreeElement(0) + { + mSlabs.reserve(64); +#if PX_CLANG +#if PX_LINUX +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-local-typedef" +#endif // PX_LINUX +#endif // PX_CLANG + PX_COMPILE_TIME_ASSERT(sizeof(T) >= sizeof(size_t)); +#if PX_CLANG +#if PX_LINUX +#pragma clang diagnostic pop +#endif +#endif + } + + public: + ~PxPoolBase() + { + if(mUsed) + disposeElements(); + + for(void** slabIt = mSlabs.begin(), *slabEnd = mSlabs.end(); slabIt != slabEnd; ++slabIt) + Alloc::deallocate(*slabIt); + } + + // Allocate space for single object + PX_INLINE T* allocate() + { + if(mFreeElement == 0) + allocateSlab(); + T* p = reinterpret_cast(mFreeElement); + mFreeElement = mFreeElement->mNext; + mUsed++; + + PxMarkSerializedMemory(p, sizeof(T)); + return p; + } + + // Put space for a single element back in the lists + PX_INLINE void deallocate(T* p) + { + if(p) + { + PX_ASSERT(mUsed); + mUsed--; + push(reinterpret_cast(p)); + } + } + + PX_INLINE T* construct() + { + T* t = allocate(); + return t ? PX_PLACEMENT_NEW(t, T()) : NULL; + } + + template + PX_INLINE T* construct(A1& a) + { + T* t = allocate(); + return t ? PX_PLACEMENT_NEW(t, T(a)) : NULL; + } + + template + PX_INLINE T* construct(A1& a, A2& b) + { + T* t = allocate(); + return t ? PX_PLACEMENT_NEW(t, T(a, b)) : NULL; + } + + template + PX_INLINE T* construct(A1& a, A2& b, A3& c) + { + T* t = allocate(); + return t ? PX_PLACEMENT_NEW(t, T(a, b, c)) : NULL; + } + + template + PX_INLINE T* construct(A1* a, A2& b, A3& c) + { + T* t = allocate(); + return t ? PX_PLACEMENT_NEW(t, T(a, b, c)) : NULL; + } + + template + PX_INLINE T* construct(A1& a, A2& b, A3& c, A4& d) + { + T* t = allocate(); + return t ? PX_PLACEMENT_NEW(t, T(a, b, c, d)) : NULL; + } + + template + PX_INLINE T* construct(A1& a, A2& b, A3& c, A4& d, A5& e) + { + T* t = allocate(); + return t ? PX_PLACEMENT_NEW(t, T(a, b, c, d, e)) : NULL; + } + + template + PX_INLINE T* construct(A1& a, A2& b, A3& c, A4& d, A5& e, A6& f) + { + T* t = allocate(); + return t ? PX_PLACEMENT_NEW(t, T(a, b, c, d, e, f)) : NULL; + } + + template + PX_INLINE T* construct(A1& a, A2& b, A3& c, A4& d, A5& e, A6& f, A7& g) + { + T* t = allocate(); + return t ? PX_PLACEMENT_NEW(t, T(a, b, c, d, e, f, g)) : NULL; + } + + template + PX_INLINE T* construct(A1& a, A2& b, A3& c, A4& d, A5& e, A6& f, A7& g, A8& h) + { + T* t = allocate(); + return t ? PX_PLACEMENT_NEW(t, T(a, b, c, d, e, f, g, h)) : NULL; + } + + PX_INLINE void destroy(T* const p) + { + if(p) + { + p->~T(); + deallocate(p); + } + } + + protected: + struct FreeList + { + FreeList* mNext; + }; + + // All the allocated slabs, sorted by pointer + PxArray mSlabs; + + uint32_t mElementsPerSlab; + uint32_t mUsed; + uint32_t mSlabSize; + + FreeList* mFreeElement; // Head of free-list + + // Helper function to get bitmap of allocated elements + + void push(FreeList* p) + { + p->mNext = mFreeElement; + mFreeElement = p; + } + + // Allocate a slab and segregate it into the freelist + void allocateSlab() + { + T* slab = reinterpret_cast(Alloc::allocate(mSlabSize, __FILE__, __LINE__)); + + mSlabs.pushBack(slab); + + // Build a chain of nodes for the freelist + T* it = slab + mElementsPerSlab; + while(--it >= slab) + push(reinterpret_cast(it)); + } + + /* + Cleanup method. Go through all active slabs and call destructor for live objects, + then free their memory + */ + void disposeElements() + { + PxArray freeNodes(*this); + while(mFreeElement) + { + freeNodes.pushBack(mFreeElement); + mFreeElement = mFreeElement->mNext; + } + Alloc& alloc(*this); + PxSort(freeNodes.begin(), freeNodes.size(), PxLess(), alloc); + PxSort(mSlabs.begin(), mSlabs.size(), PxLess(), alloc); + + typename PxArray::Iterator slabIt = mSlabs.begin(), slabEnd = mSlabs.end(); + for(typename PxArray::Iterator freeIt = freeNodes.begin(); slabIt != slabEnd; ++slabIt) + { + for(T* tIt = reinterpret_cast(*slabIt), *tEnd = tIt + mElementsPerSlab; tIt != tEnd; ++tIt) + { + if(freeIt != freeNodes.end() && *freeIt == tIt) + ++freeIt; + else + tIt->~T(); + } + } + } +}; + +// original pool implementation +template ::Type> +class PxPool : public PxPoolBase +{ + public: + PxPool(const Alloc& alloc = Alloc(), uint32_t elementsPerSlab = 32) + : PxPoolBase(alloc, elementsPerSlab, elementsPerSlab * sizeof(T)) + { + } +}; + +// allows specification of the slab size instead of the occupancy +template ::Type> +class PxPool2 : public PxPoolBase +{ + public: + PxPool2(const Alloc& alloc = Alloc()) : PxPoolBase(alloc, slabSize / sizeof(T), slabSize) + { + } +}; + +} // namespace physx + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxPreprocessor.h b/Source/ThirdParty/PhysX/foundation/PxPreprocessor.h index 3b7a8f37e..5dc1217d8 100644 --- a/Source/ThirdParty/PhysX/foundation/PxPreprocessor.h +++ b/Source/ThirdParty/PhysX/foundation/PxPreprocessor.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXPREPROCESSOR_H -#define PXFOUNDATION_PXPREPROCESSOR_H +#ifndef PX_PREPROCESSOR_H +#define PX_PREPROCESSOR_H #include #if !defined(PX_GENERATE_META_DATA) @@ -38,6 +37,10 @@ @{ */ +#ifndef PX_ENABLE_FEATURES_UNDER_CONSTRUCTION +#define PX_ENABLE_FEATURES_UNDER_CONSTRUCTION 0 +#endif + #define PX_STRINGIZE_HELPER(X) #X #define PX_STRINGIZE(X) PX_STRINGIZE_HELPER(X) @@ -53,20 +56,22 @@ All definitions have a value of 1 or 0, use '#if' instead of '#ifdef'. Compiler defines, see http://sourceforge.net/p/predef/wiki/Compilers/ */ #if defined(_MSC_VER) -#if _MSC_VER >= 1910 -#define PX_VC 15 +#if _MSC_VER >= 1920 + #define PX_VC 16 +#elif _MSC_VER >= 1910 + #define PX_VC 15 #elif _MSC_VER >= 1900 -#define PX_VC 14 + #define PX_VC 14 #elif _MSC_VER >= 1800 -#define PX_VC 12 + #define PX_VC 12 #elif _MSC_VER >= 1700 -#define PX_VC 11 + #define PX_VC 11 #elif _MSC_VER >= 1600 -#define PX_VC 10 + #define PX_VC 10 #elif _MSC_VER >= 1500 -#define PX_VC 9 + #define PX_VC 9 #else -#error "Unknown VC version" + #error "Unknown VC version" #endif #elif defined(__clang__) #define PX_CLANG 1 @@ -78,160 +83,158 @@ Compiler defines, see http://sourceforge.net/p/predef/wiki/Compilers/ #define PX_CLANG_MAJOR 0 #endif #elif defined(__GNUC__) // note: __clang__ implies __GNUC__ -#define PX_GCC 1 + #define PX_GCC 1 #else -#error "Unknown compiler" + #error "Unknown compiler" #endif /** Operating system defines, see http://sourceforge.net/p/predef/wiki/OperatingSystems/ */ -#if defined(_XBOX_ONE) -#define PX_XBOXONE 1 -#elif defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP -#define PX_UWP 1 -#elif defined(_WIN64) // note: _XBOX_ONE implies _WIN64 -#define PX_WIN64 1 +#if defined(_WIN64) + #define PX_WIN64 1 #elif defined(_WIN32) // note: _M_PPC implies _WIN32 -#define PX_WIN32 1 + #define PX_WIN32 1 #elif defined(__ANDROID__) -#define PX_ANDROID 1 + #define PX_ANDROID 1 #elif defined(__linux__) || defined (__EMSCRIPTEN__) // note: __ANDROID__ implies __linux__ -#define PX_LINUX 1 -#elif defined(__APPLE__) && (defined(__arm__) || defined(__arm64__)) -#define PX_IOS 1 + #define PX_LINUX 1 #elif defined(__APPLE__) -#define PX_OSX 1 + #define PX_OSX 1 + #include + #if TARGET_OS_IPHONE + #define PX_IOS 1 + #elif TARGET_OS_OSX + #define PX_OSX 1 + #else + #error "Unknown Apple target OS" + #endif #elif defined(__PROSPERO__) -#define PX_PS4 1 -#define PX_PS5 1 + #define PX_PS5 1 #elif defined(__ORBIS__) -#define PX_PS4 1 + #define PX_PS4 1 #elif defined(__NX__) -#define PX_SWITCH 1 + #define PX_SWITCH 1 #else -#error "Unknown operating system" + #error "Unknown operating system" #endif /** Architecture defines, see http://sourceforge.net/p/predef/wiki/Architectures/ */ -#if defined(__x86_64__) || defined(_M_X64) // ps4 compiler defines _M_X64 without value -#define PX_X64 1 +#if defined(__x86_64__) || defined(_M_X64) + #define PX_X64 1 #elif defined(__i386__) || defined(_M_IX86) || defined (__EMSCRIPTEN__) -#define PX_X86 1 + #define PX_X86 1 #elif defined(__arm64__) || defined(__aarch64__) || defined(_M_ARM64) -#define PX_A64 1 + #define PX_A64 1 #elif defined(__arm__) || defined(_M_ARM) -#define PX_ARM 1 + #define PX_ARM 1 #elif defined(__ppc__) || defined(_M_PPC) || defined(__CELLOS_LV2__) -#define PX_PPC 1 + #define PX_PPC 1 #else -#error "Unknown architecture" + #error "Unknown architecture" #endif /** SIMD defines */ #if !defined(PX_SIMD_DISABLED) -#if defined(__i386__) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64) || (defined (__EMSCRIPTEN__) && defined(__SSE2__)) -#define PX_SSE2 1 -#endif -#if defined(_M_ARM) || defined(__ARM_NEON__) || defined(__ARM_NEON) -#define PX_NEON 1 -#endif -#if defined(_M_PPC) || defined(__CELLOS_LV2__) -#define PX_VMX 1 -#endif + #if defined(__i386__) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64) || (defined (__EMSCRIPTEN__) && defined(__SSE2__)) + #define PX_SSE2 1 + #endif + #if defined(_M_ARM) || defined(__ARM_NEON__) || defined(__ARM_NEON) + #define PX_NEON 1 + #endif + #if defined(_M_PPC) || defined(__CELLOS_LV2__) + #define PX_VMX 1 + #endif #endif /** define anything not defined on this platform to 0 */ #ifndef PX_VC -#define PX_VC 0 + #define PX_VC 0 #endif #ifndef PX_CLANG -#define PX_CLANG 0 + #define PX_CLANG 0 #endif #ifndef PX_GCC -#define PX_GCC 0 -#endif -#ifndef PX_XBOXONE -#define PX_XBOXONE 0 + #define PX_GCC 0 #endif #ifndef PX_WIN64 -#define PX_WIN64 0 + #define PX_WIN64 0 #endif #ifndef PX_WIN32 -#define PX_WIN32 0 + #define PX_WIN32 0 #endif #ifndef PX_ANDROID -#define PX_ANDROID 0 + #define PX_ANDROID 0 #endif #ifndef PX_LINUX -#define PX_LINUX 0 + #define PX_LINUX 0 #endif #ifndef PX_IOS -#define PX_IOS 0 + #define PX_IOS 0 #endif #ifndef PX_OSX -#define PX_OSX 0 + #define PX_OSX 0 #endif #ifndef PX_PS4 -#define PX_PS4 0 + #define PX_PS4 0 +#endif +#ifndef PX_PS5 + #define PX_PS5 0 #endif #ifndef PX_SWITCH -#define PX_SWITCH 0 -#endif -#ifndef PX_UWP -#define PX_UWP 0 + #define PX_SWITCH 0 #endif #ifndef PX_X64 -#define PX_X64 0 + #define PX_X64 0 #endif #ifndef PX_X86 -#define PX_X86 0 + #define PX_X86 0 #endif #ifndef PX_A64 -#define PX_A64 0 + #define PX_A64 0 #endif #ifndef PX_ARM -#define PX_ARM 0 + #define PX_ARM 0 #endif #ifndef PX_PPC -#define PX_PPC 0 + #define PX_PPC 0 #endif #ifndef PX_SSE2 -#define PX_SSE2 0 + #define PX_SSE2 0 #endif #ifndef PX_NEON -#define PX_NEON 0 + #define PX_NEON 0 #endif #ifndef PX_VMX -#define PX_VMX 0 + #define PX_VMX 0 #endif /* define anything not defined through the command line to 0 */ #ifndef PX_DEBUG -#define PX_DEBUG 0 + #define PX_DEBUG 0 #endif #ifndef PX_CHECKED -#define PX_CHECKED 0 + #define PX_CHECKED 0 #endif #ifndef PX_PROFILE -#define PX_PROFILE 0 + #define PX_PROFILE 0 #endif #ifndef PX_DEBUG_CRT -#define PX_DEBUG_CRT 0 + #define PX_DEBUG_CRT 0 #endif #ifndef PX_NVTX -#define PX_NVTX 0 + #define PX_NVTX 0 #endif #ifndef PX_DOXYGEN -#define PX_DOXYGEN 0 + #define PX_DOXYGEN 0 #endif /** @@ -240,15 +243,14 @@ family shortcuts // compiler #define PX_GCC_FAMILY (PX_CLANG || PX_GCC) // os -#define PX_WINDOWS_FAMILY (PX_WIN32 || PX_WIN64 || PX_UWP) -#define PX_MICROSOFT_FAMILY (PX_XBOXONE || PX_WINDOWS_FAMILY) +#define PX_WINDOWS_FAMILY (PX_WIN32 || PX_WIN64) #define PX_LINUX_FAMILY (PX_LINUX || PX_ANDROID) #define PX_APPLE_FAMILY (PX_IOS || PX_OSX) // equivalent to #if __APPLE__ #define PX_UNIX_FAMILY (PX_LINUX_FAMILY || PX_APPLE_FAMILY) // shortcut for unix/posix platforms #if defined(__EMSCRIPTEN__) -#define PX_EMSCRIPTEN 1 + #define PX_EMSCRIPTEN 1 #else -#define PX_EMSCRIPTEN 0 + #define PX_EMSCRIPTEN 0 #endif // architecture #define PX_INTEL_FAMILY (PX_X64 || PX_X86) @@ -258,10 +260,10 @@ family shortcuts /** C++ standard library defines */ -#if defined(_LIBCPP_VERSION) || PX_WIN64 || PX_WIN32 || PX_PS4 || PX_XBOXONE || PX_UWP || PX_EMSCRIPTEN -#define PX_LIBCPP 1 +#if defined(_LIBCPP_VERSION) || PX_WIN64 || PX_WIN32 || PX_PS4 || PX_PS5 || PX_EMSCRIPTEN + #define PX_LIBCPP 1 #else -#define PX_LIBCPP 0 + #define PX_LIBCPP 0 #endif // legacy define for PhysX @@ -271,111 +273,122 @@ C++ standard library defines Assert macro */ #ifndef PX_ENABLE_ASSERTS -#if PX_DEBUG && !defined(__CUDACC__) -#define PX_ENABLE_ASSERTS 1 -#else -#define PX_ENABLE_ASSERTS 0 -#endif + #if PX_DEBUG && !defined(__CUDACC__) + #define PX_ENABLE_ASSERTS 1 + #else + #define PX_ENABLE_ASSERTS 0 + #endif #endif /** DLL export macros */ #ifndef PX_C_EXPORT -#if PX_WINDOWS_FAMILY || PX_LINUX -#define PX_C_EXPORT extern "C" -#else -#define PX_C_EXPORT -#endif + #if PX_WINDOWS_FAMILY || PX_LINUX + #define PX_C_EXPORT extern "C" + #else + #define PX_C_EXPORT + #endif #endif #if PX_UNIX_FAMILY&& __GNUC__ >= 4 -#define PX_UNIX_EXPORT __attribute__((visibility("default"))) + #define PX_UNIX_EXPORT __attribute__((visibility("default"))) #else -#define PX_UNIX_EXPORT + #define PX_UNIX_EXPORT #endif -#if (PX_WINDOWS_FAMILY || PX_XBOXONE || PX_PS4) -#define PX_DLL_EXPORT __declspec(dllexport) -#define PX_DLL_IMPORT __declspec(dllimport) +#if (PX_WINDOWS_FAMILY || PX_PS4 || PX_PS5) + #define PX_DLL_EXPORT __declspec(dllexport) + #define PX_DLL_IMPORT __declspec(dllimport) #else -#define PX_DLL_EXPORT PX_UNIX_EXPORT -#define PX_DLL_IMPORT + #define PX_DLL_EXPORT PX_UNIX_EXPORT + #define PX_DLL_IMPORT #endif /** Calling convention */ #ifndef PX_CALL_CONV -#if PX_MICROSOFT_FAMILY -#define PX_CALL_CONV __cdecl -#else -#define PX_CALL_CONV -#endif + #if PX_WINDOWS_FAMILY + #define PX_CALL_CONV __cdecl + #else + #define PX_CALL_CONV + #endif #endif /** Pack macros - disabled on SPU because they are not supported */ #if PX_VC -#define PX_PUSH_PACK_DEFAULT __pragma(pack(push, 8)) -#define PX_POP_PACK __pragma(pack(pop)) + #define PX_PUSH_PACK_DEFAULT __pragma(pack(push, 8)) + #define PX_POP_PACK __pragma(pack(pop)) #elif PX_GCC_FAMILY -#define PX_PUSH_PACK_DEFAULT _Pragma("pack(push, 8)") -#define PX_POP_PACK _Pragma("pack(pop)") + #define PX_PUSH_PACK_DEFAULT _Pragma("pack(push, 8)") + #define PX_POP_PACK _Pragma("pack(pop)") #else -#define PX_PUSH_PACK_DEFAULT -#define PX_POP_PACK + #define PX_PUSH_PACK_DEFAULT + #define PX_POP_PACK #endif /** Inline macro */ #define PX_INLINE inline -#if PX_MICROSOFT_FAMILY -#pragma inline_depth(255) +#if PX_WINDOWS_FAMILY + #pragma inline_depth(255) #endif /** Force inline macro */ #if PX_VC -#define PX_FORCE_INLINE __forceinline + #define PX_FORCE_INLINE __forceinline #elif PX_LINUX // Workaround; Fedora Core 3 do not agree with force inline and PxcPool -#define PX_FORCE_INLINE inline + #define PX_FORCE_INLINE inline #elif PX_GCC_FAMILY -#define PX_FORCE_INLINE inline __attribute__((always_inline)) + #define PX_FORCE_INLINE inline __attribute__((always_inline)) #else -#define PX_FORCE_INLINE inline + #define PX_FORCE_INLINE inline #endif /** Noinline macro */ -#if PX_MICROSOFT_FAMILY -#define PX_NOINLINE __declspec(noinline) +#if PX_WINDOWS_FAMILY + #define PX_NOINLINE __declspec(noinline) #elif PX_GCC_FAMILY -#define PX_NOINLINE __attribute__((noinline)) + #define PX_NOINLINE __attribute__((noinline)) #else -#define PX_NOINLINE + #define PX_NOINLINE #endif /** Restrict macro */ #if defined(__CUDACC__) -#define PX_RESTRICT __restrict__ + #define PX_RESTRICT __restrict__ #else -#define PX_RESTRICT __restrict + #define PX_RESTRICT __restrict #endif /** Noalias macro */ -#if PX_MICROSOFT_FAMILY -#define PX_NOALIAS __declspec(noalias) +#if PX_WINDOWS_FAMILY + #define PX_NOALIAS __declspec(noalias) #else -#define PX_NOALIAS + #define PX_NOALIAS +#endif + +/** +Override macro +*/ +#if PX_WINDOWS_FAMILY + #define PX_OVERRIDE override +#else + // PT: we don't really need to support it on all platforms, as long as + // we compile the code on at least one platform that supports it. + #define PX_OVERRIDE #endif /** @@ -387,32 +400,31 @@ struct A { ... } PX_ALIGN_SUFFIX(16); This declaration style is parsed correctly by Visual Assist. - */ #ifndef PX_ALIGN -#if PX_MICROSOFT_FAMILY -#define PX_ALIGN(alignment, decl) __declspec(align(alignment)) decl -#define PX_ALIGN_PREFIX(alignment) __declspec(align(alignment)) -#define PX_ALIGN_SUFFIX(alignment) -#elif PX_GCC_FAMILY -#define PX_ALIGN(alignment, decl) decl __attribute__((aligned(alignment))) -#define PX_ALIGN_PREFIX(alignment) -#define PX_ALIGN_SUFFIX(alignment) __attribute__((aligned(alignment))) -#elif defined __CUDACC__ -#define PX_ALIGN(alignment, decl) __align__(alignment) decl -#define PX_ALIGN_PREFIX(alignment) -#define PX_ALIGN_SUFFIX(alignment) __align__(alignment)) -#else -#define PX_ALIGN(alignment, decl) -#define PX_ALIGN_PREFIX(alignment) -#define PX_ALIGN_SUFFIX(alignment) -#endif + #if PX_WINDOWS_FAMILY + #define PX_ALIGN(alignment, decl) __declspec(align(alignment)) decl + #define PX_ALIGN_PREFIX(alignment) __declspec(align(alignment)) + #define PX_ALIGN_SUFFIX(alignment) + #elif PX_GCC_FAMILY + #define PX_ALIGN(alignment, decl) decl __attribute__((aligned(alignment))) + #define PX_ALIGN_PREFIX(alignment) + #define PX_ALIGN_SUFFIX(alignment) __attribute__((aligned(alignment))) + #elif defined __CUDACC__ + #define PX_ALIGN(alignment, decl) __align__(alignment) decl + #define PX_ALIGN_PREFIX(alignment) + #define PX_ALIGN_SUFFIX(alignment) __align__(alignment)) + #else + #define PX_ALIGN(alignment, decl) + #define PX_ALIGN_PREFIX(alignment) + #define PX_ALIGN_SUFFIX(alignment) + #endif #endif /** Deprecated macro - To deprecate a function: Place PX_DEPRECATED at the start of the function header (leftmost word). -- To deprecate a 'typedef', a 'struct' or a 'class': Place PX_DEPRECATED directly after the keywords ('typdef', +- To deprecate a 'typedef', a 'struct' or a 'class': Place PX_DEPRECATED directly after the keywords ('typedef', 'struct', 'class'). Use these macro definitions to create warnings for deprecated functions @@ -426,36 +438,35 @@ General defines */ // static assert -#if(defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))) || (PX_PS4) || (PX_APPLE_FAMILY) || (PX_SWITCH) || (PX_CLANG && PX_ARM) -#define PX_COMPILE_TIME_ASSERT(exp) typedef char PX_CONCAT(PxCompileTimeAssert_Dummy, __COUNTER__)[(exp) ? 1 : -1] __attribute__((unused)) +#if(defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))) || (PX_APPLE_FAMILY) || (PX_SWITCH || PX_PS4 || PX_PS5) || (PX_CLANG && PX_ARM) || (PX_CLANG && PX_A64) + #define PX_COMPILE_TIME_ASSERT(exp) typedef char PX_CONCAT(PxCompileTimeAssert_Dummy, __COUNTER__)[(exp) ? 1 : -1] __attribute__((unused)) #else -#define PX_COMPILE_TIME_ASSERT(exp) typedef char PxCompileTimeAssert_Dummy[(exp) ? 1 : -1] + #define PX_COMPILE_TIME_ASSERT(exp) typedef char PxCompileTimeAssert_Dummy[(exp) ? 1 : -1] #endif #if PX_GCC_FAMILY -#define PX_OFFSET_OF(X, Y) __builtin_offsetof(X, Y) + #define PX_OFFSET_OF(X, Y) __builtin_offsetof(X, Y) #else -#define PX_OFFSET_OF(X, Y) offsetof(X, Y) + #define PX_OFFSET_OF(X, Y) offsetof(X, Y) #endif #define PX_OFFSETOF_BASE 0x100 // casting the null ptr takes a special-case code path, which we don't want -#define PX_OFFSET_OF_RT(Class, Member) \ - (reinterpret_cast(&reinterpret_cast(PX_OFFSETOF_BASE)->Member) - size_t(PX_OFFSETOF_BASE)) +#define PX_OFFSET_OF_RT(Class, Member) (reinterpret_cast(&reinterpret_cast(PX_OFFSETOF_BASE)->Member) - size_t(PX_OFFSETOF_BASE)) // check that exactly one of NDEBUG and _DEBUG is defined #if !defined(NDEBUG) ^ defined(_DEBUG) -#error Exactly one of NDEBUG and _DEBUG needs to be defined! + #undef _DEBUG #endif // make sure PX_CHECKED is defined in all _DEBUG configurations as well #if !PX_CHECKED && PX_DEBUG -#error PX_CHECKED must be defined when PX_DEBUG is defined + #error PX_CHECKED must be defined when PX_DEBUG is defined #endif #ifdef __CUDACC__ -#define PX_CUDA_CALLABLE __host__ __device__ + #define PX_CUDA_CALLABLE __host__ __device__ #else -#define PX_CUDA_CALLABLE + #define PX_CUDA_CALLABLE #endif // avoid unreferenced parameter warning @@ -470,69 +481,70 @@ PX_CUDA_CALLABLE PX_INLINE void PX_UNUSED(T const&) // This assert works on win32/win64, but may need further specialization on other platforms. // Some GCC compilers need the compiler flag -malign-double to be set. // Apparently the apple-clang-llvm compiler doesn't support malign-double. -#if PX_PS4 || PX_APPLE_FAMILY || (PX_CLANG && !PX_ARM) -struct PxPackValidation -{ - char _; - long a; -}; +#if PX_PS4 || PX_PS5 || (PX_CLANG && !PX_ARM) + struct PxPackValidation + { + char _; + long a; + }; #elif PX_ANDROID || (PX_CLANG && PX_ARM) -struct PxPackValidation -{ - char _; - double a; -}; + struct PxPackValidation + { + char _; + double a; + }; #else -struct PxPackValidation -{ - char _; - long long a; -}; + struct PxPackValidation + { + char _; + long long a; + }; #endif // clang (as of version 3.9) cannot align doubles on 8 byte boundary when compiling for Intel 32 bit target #if !PX_APPLE_FAMILY && !PX_EMSCRIPTEN && !(PX_CLANG && PX_X86) -PX_COMPILE_TIME_ASSERT(PX_OFFSET_OF(PxPackValidation, a) == 8); + PX_COMPILE_TIME_ASSERT(PX_OFFSET_OF(PxPackValidation, a) == 8); #endif // use in a cpp file to suppress LNK4221 #if PX_VC -#define PX_DUMMY_SYMBOL \ - namespace \ - { \ - char PxDummySymbol; \ - } + #define PX_DUMMY_SYMBOL \ + namespace \ + { \ + char PxDummySymbol; \ + } #else -#define PX_DUMMY_SYMBOL + #define PX_DUMMY_SYMBOL #endif #if PX_GCC_FAMILY -#define PX_WEAK_SYMBOL __attribute__((weak)) // this is to support SIMD constant merging in template specialization + #define PX_WEAK_SYMBOL __attribute__((weak)) // this is to support SIMD constant merging in template specialization #else -#define PX_WEAK_SYMBOL + #define PX_WEAK_SYMBOL #endif // Macro for avoiding default assignment and copy, because doing this by inheritance can increase class size on some // platforms. -#define PX_NOCOPY(Class) \ - \ -protected: \ - Class(const Class&); \ +#define PX_NOCOPY(Class) \ +protected: \ + Class(const Class&); \ Class& operator=(const Class&); +//#define DISABLE_CUDA_PHYSX #ifndef DISABLE_CUDA_PHYSX -//CUDA is currently supported only on windows -#define PX_SUPPORT_GPU_PHYSX ((PX_WINDOWS_FAMILY) || (PX_LINUX && PX_X64)) + //CUDA is currently supported on x86_64 windows and linux, and ARM_64 linux + #define PX_SUPPORT_GPU_PHYSX ((PX_X64 && (PX_WINDOWS_FAMILY || PX_LINUX)) || (PX_A64 && PX_LINUX)) #else -#define PX_SUPPORT_GPU_PHYSX 0 + #define PX_SUPPORT_GPU_PHYSX 0 #endif -#define PX_SUPPORT_COMPUTE_PHYSX 0 - #ifndef PX_SUPPORT_EXTERN_TEMPLATE -#define PX_SUPPORT_EXTERN_TEMPLATE ((!PX_ANDROID) && (PX_VC != 11)) + #define PX_SUPPORT_EXTERN_TEMPLATE ((!PX_ANDROID) && (PX_VC != 11)) #else -#define PX_SUPPORT_EXTERN_TEMPLATE 0 + #define PX_SUPPORT_EXTERN_TEMPLATE 0 #endif +#define PX_FL __FILE__, __LINE__ + /** @} */ -#endif // #ifndef PXFOUNDATION_PXPREPROCESSOR_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxProfiler.h b/Source/ThirdParty/PhysX/foundation/PxProfiler.h index a949b723c..b72a6b2f8 100644 --- a/Source/ThirdParty/PhysX/foundation/PxProfiler.h +++ b/Source/ThirdParty/PhysX/foundation/PxProfiler.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,15 +22,17 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. -#ifndef PXFOUNDATION_PXPROFILER_H -#define PXFOUNDATION_PXPROFILER_H +#ifndef PX_PROFILER_H +#define PX_PROFILER_H #include "foundation/Px.h" +#if !PX_DOXYGEN namespace physx { +#endif /** \brief The pure virtual callback interface for general purpose instrumentation and profiling of GameWorks modules as @@ -94,6 +95,9 @@ class PxProfileScoped bool mDetached; }; -} // end of physx namespace +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif -#endif // PXFOUNDATION_PXPROFILER_H diff --git a/Source/ThirdParty/PhysX/foundation/PxQuat.h b/Source/ThirdParty/PhysX/foundation/PxQuat.h index f29a37277..70d0ca6bd 100644 --- a/Source/ThirdParty/PhysX/foundation/PxQuat.h +++ b/Source/ThirdParty/PhysX/foundation/PxQuat.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXQUAT_H -#define PXFOUNDATION_PXQUAT_H +#ifndef PX_QUAT_H +#define PX_QUAT_H /** \addtogroup foundation @{ @@ -43,36 +42,36 @@ namespace physx /** \brief This is a quaternion class. For more information on quaternion mathematics consult a mathematics source on complex numbers. - */ -class PxQuat +template +class PxQuatT { public: + /** \brief Default constructor, does not do any initialization. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuat() + PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuatT() { } //! identity constructor - PX_CUDA_CALLABLE PX_INLINE PxQuat(PxIDENTITY r) : x(0.0f), y(0.0f), z(0.0f), w(1.0f) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuatT(PxIDENTITY) : x(Type(0.0)), y(Type(0.0)), z(Type(0.0)), w(Type(1.0)) { - PX_UNUSED(r); } /** \brief Constructor from a scalar: sets the real part w to the scalar value, and the imaginary parts (x,y,z) to zero */ - explicit PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuat(float r) : x(0.0f), y(0.0f), z(0.0f), w(r) + explicit PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuatT(Type r) : x(Type(0.0)), y(Type(0.0)), z(Type(0.0)), w(r) { } /** - \brief Constructor. Take note of the order of the elements! + \brief Constructor. Take note of the order of the elements! */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuat(float nx, float ny, float nz, float nw) : x(nx), y(ny), z(nz), w(nw) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuatT(Type nx, Type ny, Type nz, Type nw) : x(nx), y(ny), z(nz), w(nw) { } @@ -85,12 +84,13 @@ class PxQuat Unit: Radians */ - PX_CUDA_CALLABLE PX_INLINE PxQuat(float angleRadians, const PxVec3& unitAxis) + PX_CUDA_CALLABLE PX_INLINE PxQuatT(Type angleRadians, const PxVec3T& unitAxis) { - PX_SHARED_ASSERT(PxAbs(1.0f - unitAxis.magnitude()) < 1e-3f); - const float a = angleRadians * 0.5f; - const float s = PxSin(a); - w = PxCos(a); + PX_ASSERT(PxAbs(Type(1.0) - unitAxis.magnitude()) < Type(1e-3)); + const Type a = angleRadians * Type(0.5); + + Type s; + PxSinCos(a, s, w); x = unitAxis.x * s; y = unitAxis.y * s; z = unitAxis.z * s; @@ -99,7 +99,7 @@ class PxQuat /** \brief Copy ctor. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuat(const PxQuat& v) : x(v.x), y(v.y), z(v.z), w(v.w) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuatT(const PxQuatT& v) : x(v.x), y(v.y), z(v.z), w(v.w) { } @@ -108,14 +108,14 @@ class PxQuat \param[in] m Rotation matrix to extract quaternion from. */ - PX_CUDA_CALLABLE PX_INLINE explicit PxQuat(const PxMat33& m); /* defined in PxMat33.h */ + PX_CUDA_CALLABLE PX_INLINE explicit PxQuatT(const PxMat33T& m); /* defined in PxMat33.h */ /** \brief returns true if quat is identity */ PX_CUDA_CALLABLE PX_FORCE_INLINE bool isIdentity() const { - return x==0.0f && y==0.0f && z==0.0f && w==1.0f; + return x==Type(0.0) && y==Type(0.0) && z==Type(0.0) && w==Type(1.0); } /** @@ -131,8 +131,8 @@ class PxQuat */ PX_CUDA_CALLABLE bool isUnit() const { - const float unitTolerance = 1e-4f; - return isFinite() && PxAbs(magnitude() - 1) < unitTolerance; + const Type unitTolerance = Type(1e-3); + return isFinite() && PxAbs(magnitude() - Type(1.0)) < unitTolerance; } /** @@ -141,14 +141,14 @@ class PxQuat */ PX_CUDA_CALLABLE bool isSane() const { - const float unitTolerance = 1e-2f; - return isFinite() && PxAbs(magnitude() - 1) < unitTolerance; + const Type unitTolerance = Type(1e-2); + return isFinite() && PxAbs(magnitude() - Type(1.0)) < unitTolerance; } /** \brief returns true if the two quaternions are exactly equal */ - PX_CUDA_CALLABLE PX_INLINE bool operator==(const PxQuat& q) const + PX_CUDA_CALLABLE PX_FORCE_INLINE bool operator==(const PxQuatT& q) const { return x == q.x && y == q.y && z == q.z && w == q.w; } @@ -156,20 +156,20 @@ class PxQuat /** \brief converts this quaternion to angle-axis representation */ - PX_CUDA_CALLABLE PX_INLINE void toRadiansAndUnitAxis(float& angle, PxVec3& axis) const + PX_CUDA_CALLABLE PX_INLINE void toRadiansAndUnitAxis(Type& angle, PxVec3T& axis) const { - const float quatEpsilon = 1.0e-8f; - const float s2 = x * x + y * y + z * z; + const Type quatEpsilon = Type(1.0e-8); + const Type s2 = x * x + y * y + z * z; if(s2 < quatEpsilon * quatEpsilon) // can't extract a sensible axis { - angle = 0.0f; - axis = PxVec3(1.0f, 0.0f, 0.0f); + angle = Type(0.0); + axis = PxVec3T(Type(1.0), Type(0.0), Type(0.0)); } else { - const float s = PxRecipSqrt(s2); - axis = PxVec3(x, y, z) * s; - angle = PxAbs(w) < quatEpsilon ? PxPi : PxAtan2(s2 * s, w) * 2.0f; + const Type s = PxRecipSqrt(s2); + axis = PxVec3T(x, y, z) * s; + angle = PxAbs(w) < quatEpsilon ? Type(PxPi) : PxAtan2(s2 * s, w) * Type(2.0); } } @@ -178,9 +178,9 @@ class PxQuat Unit: Radians */ - PX_CUDA_CALLABLE PX_INLINE float getAngle() const + PX_CUDA_CALLABLE PX_FORCE_INLINE Type getAngle() const { - return PxAcos(w) * 2.0f; + return PxAcos(w) * Type(2.0); } /** @@ -188,15 +188,15 @@ class PxQuat Unit: Radians */ - PX_CUDA_CALLABLE PX_INLINE float getAngle(const PxQuat& q) const + PX_CUDA_CALLABLE PX_FORCE_INLINE Type getAngle(const PxQuatT& q) const { - return PxAcos(dot(q)) * 2.0f; + return PxAcos(dot(q)) * Type(2.0); } /** \brief This is the squared 4D vector length, should be 1 for unit quaternions. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE float magnitudeSquared() const + PX_CUDA_CALLABLE PX_FORCE_INLINE Type magnitudeSquared() const { return x * x + y * y + z * z + w * w; } @@ -204,18 +204,18 @@ class PxQuat /** \brief returns the scalar product of this and other. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE float dot(const PxQuat& v) const + PX_CUDA_CALLABLE PX_FORCE_INLINE Type dot(const PxQuatT& v) const { return x * v.x + y * v.y + z * v.z + w * v.w; } - PX_CUDA_CALLABLE PX_INLINE PxQuat getNormalized() const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuatT getNormalized() const { - const float s = 1.0f / magnitude(); - return PxQuat(x * s, y * s, z * s, w * s); + const Type s = Type(1.0) / magnitude(); + return PxQuatT(x * s, y * s, z * s, w * s); } - PX_CUDA_CALLABLE PX_INLINE float magnitude() const + PX_CUDA_CALLABLE PX_FORCE_INLINE Type magnitude() const { return PxSqrt(magnitudeSquared()); } @@ -224,12 +224,12 @@ class PxQuat /** \brief maps to the closest unit quaternion. */ - PX_CUDA_CALLABLE PX_INLINE float normalize() // convert this PxQuat to a unit quaternion + PX_CUDA_CALLABLE PX_FORCE_INLINE Type normalize() // convert this PxQuatT to a unit quaternion { - const float mag = magnitude(); - if(mag != 0.0f) + const Type mag = magnitude(); + if(mag != Type(0.0)) { - const float imag = 1.0f / mag; + const Type imag = Type(1.0) / mag; x *= imag; y *= imag; @@ -244,75 +244,75 @@ class PxQuat \note for unit quaternions, this is the inverse. */ - PX_CUDA_CALLABLE PX_INLINE PxQuat getConjugate() const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuatT getConjugate() const { - return PxQuat(-x, -y, -z, w); + return PxQuatT(-x, -y, -z, w); } /* \brief returns imaginary part. */ - PX_CUDA_CALLABLE PX_INLINE PxVec3 getImaginaryPart() const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T getImaginaryPart() const { - return PxVec3(x, y, z); + return PxVec3T(x, y, z); } /** brief computes rotation of x-axis */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 getBasisVector0() const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T getBasisVector0() const { - const float x2 = x * 2.0f; - const float w2 = w * 2.0f; - return PxVec3((w * w2) - 1.0f + x * x2, (z * w2) + y * x2, (-y * w2) + z * x2); + const Type x2 = x * Type(2.0); + const Type w2 = w * Type(2.0); + return PxVec3T((w * w2) - Type(1.0) + x * x2, (z * w2) + y * x2, (-y * w2) + z * x2); } /** brief computes rotation of y-axis */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 getBasisVector1() const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T getBasisVector1() const { - const float y2 = y * 2.0f; - const float w2 = w * 2.0f; - return PxVec3((-z * w2) + x * y2, (w * w2) - 1.0f + y * y2, (x * w2) + z * y2); + const Type y2 = y * Type(2.0); + const Type w2 = w * Type(2.0); + return PxVec3T((-z * w2) + x * y2, (w * w2) - Type(1.0) + y * y2, (x * w2) + z * y2); } /** brief computes rotation of z-axis */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 getBasisVector2() const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T getBasisVector2() const { - const float z2 = z * 2.0f; - const float w2 = w * 2.0f; - return PxVec3((y * w2) + x * z2, (-x * w2) + y * z2, (w * w2) - 1.0f + z * z2); + const Type z2 = z * Type(2.0); + const Type w2 = w * Type(2.0); + return PxVec3T((y * w2) + x * z2, (-x * w2) + y * z2, (w * w2) - Type(1.0) + z * z2); } /** rotates passed vec by this (assumed unitary) */ - PX_CUDA_CALLABLE PX_FORCE_INLINE const PxVec3 rotate(const PxVec3& v) const + PX_CUDA_CALLABLE PX_FORCE_INLINE const PxVec3T rotate(const PxVec3T& v) const { - const float vx = 2.0f * v.x; - const float vy = 2.0f * v.y; - const float vz = 2.0f * v.z; - const float w2 = w * w - 0.5f; - const float dot2 = (x * vx + y * vy + z * vz); - return PxVec3((vx * w2 + (y * vz - z * vy) * w + x * dot2), (vy * w2 + (z * vx - x * vz) * w + y * dot2), - (vz * w2 + (x * vy - y * vx) * w + z * dot2)); + const Type vx = Type(2.0) * v.x; + const Type vy = Type(2.0) * v.y; + const Type vz = Type(2.0) * v.z; + const Type w2 = w * w - 0.5f; + const Type dot2 = (x * vx + y * vy + z * vz); + return PxVec3T((vx * w2 + (y * vz - z * vy) * w + x * dot2), (vy * w2 + (z * vx - x * vz) * w + y * dot2), + (vz * w2 + (x * vy - y * vx) * w + z * dot2)); } /** inverse rotates passed vec by this (assumed unitary) */ - PX_CUDA_CALLABLE PX_FORCE_INLINE const PxVec3 rotateInv(const PxVec3& v) const + PX_CUDA_CALLABLE PX_FORCE_INLINE const PxVec3T rotateInv(const PxVec3T& v) const { - const float vx = 2.0f * v.x; - const float vy = 2.0f * v.y; - const float vz = 2.0f * v.z; - const float w2 = w * w - 0.5f; - const float dot2 = (x * vx + y * vy + z * vz); - return PxVec3((vx * w2 - (y * vz - z * vy) * w + x * dot2), (vy * w2 - (z * vx - x * vz) * w + y * dot2), - (vz * w2 - (x * vy - y * vx) * w + z * dot2)); + const Type vx = Type(2.0) * v.x; + const Type vy = Type(2.0) * v.y; + const Type vz = Type(2.0) * v.z; + const Type w2 = w * w - 0.5f; + const Type dot2 = (x * vx + y * vy + z * vz); + return PxVec3T((vx * w2 - (y * vz - z * vy) * w + x * dot2), (vy * w2 - (z * vx - x * vz) * w + y * dot2), + (vz * w2 - (x * vy - y * vx) * w + z * dot2)); } /** \brief Assignment operator */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuat& operator=(const PxQuat& p) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuatT& operator=(const PxQuatT& p) { x = p.x; y = p.y; @@ -321,21 +321,20 @@ class PxQuat return *this; } - PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuat& operator*=(const PxQuat& q) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuatT& operator*=(const PxQuatT& q) { - const float tx = w * q.x + q.w * x + y * q.z - q.y * z; - const float ty = w * q.y + q.w * y + z * q.x - q.z * x; - const float tz = w * q.z + q.w * z + x * q.y - q.x * y; + const Type tx = w * q.x + q.w * x + y * q.z - q.y * z; + const Type ty = w * q.y + q.w * y + z * q.x - q.z * x; + const Type tz = w * q.z + q.w * z + x * q.y - q.x * y; w = w * q.w - q.x * x - y * q.y - q.z * z; x = tx; y = ty; z = tz; - return *this; } - PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuat& operator+=(const PxQuat& q) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuatT& operator+=(const PxQuatT& q) { x += q.x; y += q.y; @@ -344,7 +343,7 @@ class PxQuat return *this; } - PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuat& operator-=(const PxQuat& q) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuatT& operator-=(const PxQuatT& q) { x -= q.x; y -= q.y; @@ -353,7 +352,7 @@ class PxQuat return *this; } - PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuat& operator*=(const float s) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuatT& operator*=(const Type s) { x *= s; y *= s; @@ -363,41 +362,45 @@ class PxQuat } /** quaternion multiplication */ - PX_CUDA_CALLABLE PX_INLINE PxQuat operator*(const PxQuat& q) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuatT operator*(const PxQuatT& q) const { - return PxQuat(w * q.x + q.w * x + y * q.z - q.y * z, w * q.y + q.w * y + z * q.x - q.z * x, + return PxQuatT(w * q.x + q.w * x + y * q.z - q.y * z, w * q.y + q.w * y + z * q.x - q.z * x, w * q.z + q.w * z + x * q.y - q.x * y, w * q.w - x * q.x - y * q.y - z * q.z); } /** quaternion addition */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuat operator+(const PxQuat& q) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuatT operator+(const PxQuatT& q) const { - return PxQuat(x + q.x, y + q.y, z + q.z, w + q.w); + return PxQuatT(x + q.x, y + q.y, z + q.z, w + q.w); } /** quaternion subtraction */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuat operator-() const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuatT operator-() const { - return PxQuat(-x, -y, -z, -w); + return PxQuatT(-x, -y, -z, -w); } - PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuat operator-(const PxQuat& q) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuatT operator-(const PxQuatT& q) const { - return PxQuat(x - q.x, y - q.y, z - q.z, w - q.w); + return PxQuatT(x - q.x, y - q.y, z - q.z, w - q.w); } - PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuat operator*(float r) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxQuatT operator*(Type r) const { - return PxQuat(x * r, y * r, z * r, w * r); + return PxQuatT(x * r, y * r, z * r, w * r); } /** the quaternion elements */ - float x, y, z, w; + Type x, y, z, w; }; +typedef PxQuatT PxQuat; +typedef PxQuatT PxQuatd; + #if !PX_DOXYGEN } // namespace physx #endif /** @} */ -#endif // #ifndef PXFOUNDATION_PXQUAT_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxSIMDHelpers.h b/Source/ThirdParty/PhysX/foundation/PxSIMDHelpers.h new file mode 100644 index 000000000..85e065679 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxSIMDHelpers.h @@ -0,0 +1,72 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_SIMD_HELPERS_H +#define PX_SIMD_HELPERS_H + +#include "foundation/PxMat33.h" +#include "foundation/PxVecMath.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + //! A padded version of PxMat33, to safely load its data using SIMD + class PxMat33Padded : public PxMat33 + { + public: + explicit PX_FORCE_INLINE PxMat33Padded(const PxQuat& q) + { + using namespace aos; + const QuatV qV = V4LoadU(&q.x); + Vec3V column0V, column1V, column2V; + QuatGetMat33V(qV, column0V, column1V, column2V); +#if defined(PX_SIMD_DISABLED) || (PX_LINUX && (PX_ARM || PX_A64)) + V3StoreU(column0V, column0); + V3StoreU(column1V, column1); + V3StoreU(column2V, column2); +#else + V4StoreU(column0V, &column0.x); + V4StoreU(column1V, &column1.x); + V4StoreU(column2V, &column2.x); +#endif + } + PX_FORCE_INLINE ~PxMat33Padded() {} + PX_FORCE_INLINE void operator=(const PxMat33& other) + { + column0 = other.column0; + column1 = other.column1; + column2 = other.column2; + } + PxU32 padding; + }; +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/foundation/PxSList.h b/Source/ThirdParty/PhysX/foundation/PxSList.h new file mode 100644 index 000000000..e0a33617f --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxSList.h @@ -0,0 +1,133 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_SLIST_H +#define PX_SLIST_H + +#include "foundation/Px.h" +#include "foundation/PxAssert.h" +#include "foundation/PxAlignedMalloc.h" + +#if PX_P64_FAMILY + #define PX_SLIST_ALIGNMENT 16 +#else + #define PX_SLIST_ALIGNMENT 8 +#endif + +#if !PX_DOXYGEN +namespace physx +{ +#endif +#if PX_VC + #pragma warning(push) + #pragma warning(disable : 4324) // Padding was added at the end of a structure because of a __declspec(align) value. +#endif + +PX_ALIGN_PREFIX(PX_SLIST_ALIGNMENT) +class PxSListEntry +{ + friend struct PxSListImpl; + + public: + PxSListEntry() : mNext(NULL) + { + PX_ASSERT((size_t(this) & (PX_SLIST_ALIGNMENT - 1)) == 0); + } + + // Only use on elements returned by SList::flush() + // because the operation is not atomic. + PxSListEntry* next() + { + return mNext; + } + + private: + PxSListEntry* mNext; +}PX_ALIGN_SUFFIX(PX_SLIST_ALIGNMENT); + +#if PX_VC + #pragma warning(pop) +#endif + +// template-less implementation +struct PX_FOUNDATION_API PxSListImpl +{ + PxSListImpl(); + ~PxSListImpl(); + void push(PxSListEntry* entry); + PxSListEntry* pop(); + PxSListEntry* flush(); + static uint32_t getSize(); +}; + +template > +class PxSListT : protected Alloc +{ + public: + PxSListT(const Alloc& alloc = Alloc()) : Alloc(alloc) + { + mImpl = reinterpret_cast(Alloc::allocate(PxSListImpl::getSize(), __FILE__, __LINE__)); + PX_ASSERT((size_t(mImpl) & (PX_SLIST_ALIGNMENT - 1)) == 0); + PX_PLACEMENT_NEW(mImpl, PxSListImpl)(); + } + ~PxSListT() + { + mImpl->~PxSListImpl(); + Alloc::deallocate(mImpl); + } + + // pushes a new element to the list + void push(PxSListEntry& entry) + { + mImpl->push(&entry); + } + + // pops an element from the list + PxSListEntry* pop() + { + return mImpl->pop(); + } + + // removes all items from list, returns pointer to first element + PxSListEntry* flush() + { + return mImpl->flush(); + } + + private: + PxSListImpl* mImpl; +}; + +typedef PxSListT<> PxSList; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxSimpleTypes.h b/Source/ThirdParty/PhysX/foundation/PxSimpleTypes.h index a9ced086c..87e8bb958 100644 --- a/Source/ThirdParty/PhysX/foundation/PxSimpleTypes.h +++ b/Source/ThirdParty/PhysX/foundation/PxSimpleTypes.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXSIMPLETYPES_H -#define PXFOUNDATION_PXSIMPLETYPES_H +#ifndef PX_SIMPLE_TYPES_H +#define PX_SIMPLE_TYPES_H /** \addtogroup foundation @{ @@ -56,15 +55,17 @@ #if PX_VC // we could use inttypes.h starting with VC12 #define PX_PRIu64 "I64u" #else -#if !PX_PS4 && !PX_APPLE_FAMILY +#if !PX_PS4 && !PX_PS5 && !PX_APPLE_FAMILY #define __STDC_FORMAT_MACROS #endif #include #define PX_PRIu64 PRIu64 #endif +#if !PX_DOXYGEN namespace physx { +#endif typedef int64_t PxI64; typedef uint64_t PxU64; typedef int32_t PxI32; @@ -76,13 +77,18 @@ typedef uint8_t PxU8; typedef float PxF32; typedef double PxF64; typedef float PxReal; -} +// Int-as-bool type - has some uses for efficiency and with SIMD +typedef PxI32 PxIntBool; +static const PxIntBool PxIntFalse = 0; +static const PxIntBool PxIntTrue = 1; +#if !PX_DOXYGEN +} // namespace physx +#endif + +#define PX_SIGN_BITMASK 0x80000000 // Type ranges -// These are here because we sometimes have non-IEEE compliant platforms to deal with. -// Removal is under consideration (issue GWSD-34) - #define PX_MAX_F32 3.4028234663852885981170418348452e+38F // maximum possible float value #define PX_MAX_F64 DBL_MAX // maximum possible double value @@ -109,4 +115,5 @@ typedef float PxReal; #define PX_MIN_U32 UINT32_MIN /** @} */ -#endif // #ifndef PXFOUNDATION_PXSIMPLETYPES_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxSocket.h b/Source/ThirdParty/PhysX/foundation/PxSocket.h new file mode 100644 index 000000000..eaa0485f4 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxSocket.h @@ -0,0 +1,187 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_SOCKET_H +#define PX_SOCKET_H + +#include "foundation/PxUserAllocated.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif +/** +Socket abstraction API +*/ + +class PX_FOUNDATION_API PxSocket : public PxUserAllocated +{ + public: + static const uint32_t DEFAULT_BUFFER_SIZE; + + PxSocket(bool inEnableBuffering = true, bool blocking = true); + + virtual ~PxSocket(); + + /*! + Opens a network socket for input and/or output + + \param host + Name of the host to connect to. This can be an IP, URL, etc + + \param port + The port to connect to on the remote host + + \param timeout + Timeout in ms until the connection must be established. + + \return + True if the connection was successful, false otherwise + */ + bool connect(const char* host, uint16_t port, uint32_t timeout = 1000); + + /*! + Opens a network socket for input and/or output as a server. Put the connection in listening mode + + \param port + The port on which the socket listens + */ + bool listen(uint16_t port); + + /*! + Accept a connection on a socket that is in listening mode + + \note + This method only supports a single connection client. Additional clients + that connect to the listening port will overwrite the existing socket handle. + + \param block + whether or not the call should block + + \return whether a connection was established + */ + bool accept(bool block); + + /*! + Disconnects an open socket + */ + void disconnect(); + + /*! + Returns whether the socket is currently open (connected) or not. + + \return + True if the socket is connected, false otherwise + */ + bool isConnected() const; + + /*! + Returns the name of the connected host. This is the same as the string + that was supplied to the connect call. + + \return + The name of the connected host + */ + const char* getHost() const; + + /*! + Returns the port of the connected host. This is the same as the port + that was supplied to the connect call. + + \return + The port of the connected host + */ + uint16_t getPort() const; + + /*! + Flushes the output stream. Until the stream is flushed, there is no + guarantee that the written data has actually reached the destination + storage. Flush forces all buffered data to be sent to the output. + + \note flush always blocks. If the socket is in non-blocking mode, this will result + the thread spinning. + + \return + True if the flush was successful, false otherwise + */ + bool flush(); + + /*! + Writes data to the output stream. + + \param data + Pointer to a block of data to write to the stream + + \param length + Amount of data to write, in bytes + + \return + Number of bytes actually written. This could be lower than length if the socket is non-blocking. + */ + + uint32_t write(const uint8_t* data, uint32_t length); + + /*! + Reads data from the output stream. + + \param data + Pointer to a buffer where the read data will be stored. + + \param length + Amount of data to read, in bytes. + + \return + Number of bytes actually read. This could be lower than length if the stream end is + encountered or the socket is non-blocking. + */ + uint32_t read(uint8_t* data, uint32_t length); + + /*! + Sets blocking mode of the socket. + Socket must be connected, otherwise calling this method won't take any effect. + */ + void setBlocking(bool blocking); + + /*! + Returns whether read/write/flush calls to the socket are blocking. + + \return + True if the socket is blocking. + */ + bool isBlocking() const; + + private: + class SocketImpl* mImpl; +}; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxSort.h b/Source/ThirdParty/PhysX/foundation/PxSort.h new file mode 100644 index 000000000..24ad1bc34 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxSort.h @@ -0,0 +1,131 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_SORT_H +#define PX_SORT_H + +/** \addtogroup foundation +@{ +*/ + +#include "foundation/PxSortInternals.h" +#include "foundation/PxAlloca.h" + +#define PX_SORT_PARANOIA PX_DEBUG + +/** +\brief Sorts an array of objects in ascending order, assuming +that the predicate implements the < operator: + +@see PxLess, PxGreater +*/ + +#if PX_VC +#pragma warning(push) +#pragma warning(disable : 4706) // disable the warning that we did an assignment within a conditional expression, as +// this was intentional. +#endif + +#if !PX_DOXYGEN +namespace physx +{ +#endif +template +void PxSort(T* elements, uint32_t count, const Predicate& compare, const PxAllocator& inAllocator, + const uint32_t initialStackSize = 32) +{ + static const uint32_t SMALL_SORT_CUTOFF = 5; // must be >= 3 since we need 3 for median + + PX_ALLOCA(stackMem, int32_t, initialStackSize); + PxStack stack(stackMem, initialStackSize, inAllocator); + + int32_t first = 0, last = int32_t(count - 1); + if(last > first) + { + for(;;) + { + while(last > first) + { + PX_ASSERT(first >= 0 && last < int32_t(count)); + if(uint32_t(last - first) < SMALL_SORT_CUTOFF) + { + PxSmallSort(elements, first, last, compare); + break; + } + else + { + const int32_t partIndex = PxPartition(elements, first, last, compare); + + // push smaller sublist to minimize stack usage + if((partIndex - first) < (last - partIndex)) + { + stack.push(first, partIndex - 1); + first = partIndex + 1; + } + else + { + stack.push(partIndex + 1, last); + last = partIndex - 1; + } + } + } + + if(stack.empty()) + break; + + stack.pop(first, last); + } + } +#if PX_SORT_PARANOIA + for(uint32_t i = 1; i < count; i++) + PX_ASSERT(!compare(elements[i], elements[i - 1])); +#endif +} + +template +void PxSort(T* elements, uint32_t count, const Predicate& compare) +{ + PxSort(elements, count, compare, typename PxAllocatorTraits::Type()); +} + +template +void PxSort(T* elements, uint32_t count) +{ + PxSort(elements, count, PxLess(), typename PxAllocatorTraits::Type()); +} + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#if PX_VC +#pragma warning(pop) +#endif +/** @} */ +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxSortInternals.h b/Source/ThirdParty/PhysX/foundation/PxSortInternals.h new file mode 100644 index 000000000..b6702d133 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxSortInternals.h @@ -0,0 +1,186 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_SORT_INTERNALS_H +#define PX_SORT_INTERNALS_H + +/** \addtogroup foundation +@{ +*/ + +#include "foundation/PxAssert.h" +#include "foundation/PxMathIntrinsics.h" +#include "foundation/PxBasicTemplates.h" +#include "foundation/PxUserAllocated.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif +template +PX_INLINE void PxMedian3(T* elements, int32_t first, int32_t last, Predicate& compare) +{ + /* + This creates sentinels because we know there is an element at the start minimum(or equal) + than the pivot and an element at the end greater(or equal) than the pivot. Plus the + median of 3 reduces the chance of degenerate behavour. + */ + + int32_t mid = (first + last) / 2; + + if(compare(elements[mid], elements[first])) + PxSwap(elements[first], elements[mid]); + + if(compare(elements[last], elements[first])) + PxSwap(elements[first], elements[last]); + + if(compare(elements[last], elements[mid])) + PxSwap(elements[mid], elements[last]); + + // keep the pivot at last-1 + PxSwap(elements[mid], elements[last - 1]); +} + +template +PX_INLINE int32_t PxPartition(T* elements, int32_t first, int32_t last, Predicate& compare) +{ + PxMedian3(elements, first, last, compare); + + /* + WARNING: using the line: + + T partValue = elements[last-1]; + + and changing the scan loops to: + + while(comparator.greater(partValue, elements[++i])); + while(comparator.greater(elements[--j], partValue); + + triggers a compiler optimizer bug on xenon where it stores a double to the stack for partValue + then loads it as a single...:-( + */ + + int32_t i = first; // we know first is less than pivot(but i gets pre incremented) + int32_t j = last - 1; // pivot is in last-1 (but j gets pre decremented) + + for(;;) + { + while(compare(elements[++i], elements[last - 1])) + ; + while(compare(elements[last - 1], elements[--j])) + ; + + if(i >= j) + break; + + PX_ASSERT(i <= last && j >= first); + PxSwap(elements[i], elements[j]); + } + // put the pivot in place + + PX_ASSERT(i <= last && first <= (last - 1)); + PxSwap(elements[i], elements[last - 1]); + + return i; +} + +template +PX_INLINE void PxSmallSort(T* elements, int32_t first, int32_t last, Predicate& compare) +{ + // selection sort - could reduce to fsel on 360 with floats. + + for(int32_t i = first; i < last; i++) + { + int32_t m = i; + for(int32_t j = i + 1; j <= last; j++) + if(compare(elements[j], elements[m])) + m = j; + + if(m != i) + PxSwap(elements[m], elements[i]); + } +} + +template +class PxStack +{ + PxAllocator mAllocator; + uint32_t mSize, mCapacity; + int32_t* mMemory; + bool mRealloc; + + public: + PxStack(int32_t* memory, uint32_t capacity, const PxAllocator& inAllocator) + : mAllocator(inAllocator), mSize(0), mCapacity(capacity), mMemory(memory), mRealloc(false) + { + } + ~PxStack() + { + if(mRealloc) + mAllocator.deallocate(mMemory); + } + + void grow() + { + mCapacity *= 2; + int32_t* newMem = + reinterpret_cast(mAllocator.allocate(sizeof(int32_t) * mCapacity, __FILE__, __LINE__)); + intrinsics::memCopy(newMem, mMemory, mSize * sizeof(int32_t)); + if(mRealloc) + mAllocator.deallocate(mMemory); + mRealloc = true; + mMemory = newMem; + } + + PX_INLINE void push(int32_t start, int32_t end) + { + if(mSize >= mCapacity - 1) + grow(); + mMemory[mSize++] = start; + mMemory[mSize++] = end; + } + + PX_INLINE void pop(int32_t& start, int32_t& end) + { + PX_ASSERT(!empty()); + end = mMemory[--mSize]; + start = mMemory[--mSize]; + } + + PX_INLINE bool empty() + { + return mSize == 0; + } +}; + +#if !PX_DOXYGEN +} // namespace physx +#endif + /** @} */ +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxStrideIterator.h b/Source/ThirdParty/PhysX/foundation/PxStrideIterator.h index dd6dd10ba..c1326fa18 100644 --- a/Source/ThirdParty/PhysX/foundation/PxStrideIterator.h +++ b/Source/ThirdParty/PhysX/foundation/PxStrideIterator.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,15 +22,15 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXSTRIDEITERATOR_H -#define PXFOUNDATION_PXSTRIDEITERATOR_H +#ifndef PX_STRIDE_ITERATOR_H +#define PX_STRIDE_ITERATOR_H #include "foundation/Px.h" -#include "foundation/PxSharedAssert.h" +#include "foundation/PxAssert.h" /** \addtogroup foundation @{ @@ -106,7 +105,7 @@ class PxStrideIterator */ explicit PX_INLINE PxStrideIterator(T* ptr = NULL, PxU32 stride = sizeof(T)) : mPtr(ptr), mStride(stride) { - PX_SHARED_ASSERT(mStride == 0 || sizeof(T) <= mStride); + PX_ASSERT(mStride == 0 || sizeof(T) <= mStride); } /** @@ -117,7 +116,7 @@ class PxStrideIterator PX_INLINE PxStrideIterator(const PxStrideIterator::Type>& strideIterator) : mPtr(strideIterator.ptr()), mStride(strideIterator.stride()) { - PX_SHARED_ASSERT(mStride == 0 || sizeof(T) <= mStride); + PX_ASSERT(mStride == 0 || sizeof(T) <= mStride); } /** @@ -237,7 +236,7 @@ class PxStrideIterator */ PX_INLINE int operator-(const PxStrideIterator& other) const { - PX_SHARED_ASSERT(isCompatible(other)); + PX_ASSERT(isCompatible(other)); int byteDiff = static_cast(reinterpret_cast(mPtr) - reinterpret_cast(other.mPtr)); return byteDiff / static_cast(stride()); } @@ -247,7 +246,7 @@ class PxStrideIterator */ PX_INLINE bool operator==(const PxStrideIterator& other) const { - PX_SHARED_ASSERT(isCompatible(other)); + PX_ASSERT(isCompatible(other)); return mPtr == other.mPtr; } @@ -256,7 +255,7 @@ class PxStrideIterator */ PX_INLINE bool operator!=(const PxStrideIterator& other) const { - PX_SHARED_ASSERT(isCompatible(other)); + PX_ASSERT(isCompatible(other)); return mPtr != other.mPtr; } @@ -265,7 +264,7 @@ class PxStrideIterator */ PX_INLINE bool operator<(const PxStrideIterator& other) const { - PX_SHARED_ASSERT(isCompatible(other)); + PX_ASSERT(isCompatible(other)); return mPtr < other.mPtr; } @@ -274,7 +273,7 @@ class PxStrideIterator */ PX_INLINE bool operator>(const PxStrideIterator& other) const { - PX_SHARED_ASSERT(isCompatible(other)); + PX_ASSERT(isCompatible(other)); return mPtr > other.mPtr; } @@ -283,7 +282,7 @@ class PxStrideIterator */ PX_INLINE bool operator<=(const PxStrideIterator& other) const { - PX_SHARED_ASSERT(isCompatible(other)); + PX_ASSERT(isCompatible(other)); return mPtr <= other.mPtr; } @@ -292,7 +291,7 @@ class PxStrideIterator */ PX_INLINE bool operator>=(const PxStrideIterator& other) const { - PX_SHARED_ASSERT(isCompatible(other)); + PX_ASSERT(isCompatible(other)); return mPtr >= other.mPtr; } @@ -350,4 +349,5 @@ PX_INLINE PxStrideIterator PxMakeIterator(const T* ptr, PxU32 stride = #endif /** @} */ -#endif // PXFOUNDATION_PXSTRIDEITERATOR_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxString.h b/Source/ThirdParty/PhysX/foundation/PxString.h new file mode 100644 index 000000000..eb744bb2c --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxString.h @@ -0,0 +1,79 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_STRING_H +#define PX_STRING_H + +#include "foundation/PxPreprocessor.h" +#include "foundation/PxSimpleTypes.h" +#include "foundation/PxFoundationConfig.h" +#include + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +// the following functions have C99 semantics. Note that C99 requires for snprintf and vsnprintf: +// * the resulting string is always NULL-terminated regardless of truncation. +// * in the case of truncation the return value is the number of characters that would have been created. + +PX_FOUNDATION_API int32_t Pxsscanf(const char* buffer, const char* format, ...); +PX_FOUNDATION_API int32_t Pxstrcmp(const char* str1, const char* str2); +PX_FOUNDATION_API int32_t Pxstrncmp(const char* str1, const char* str2, size_t count); +PX_FOUNDATION_API int32_t Pxsnprintf(char* dst, size_t dstSize, const char* format, ...); +PX_FOUNDATION_API int32_t Pxvsnprintf(char* dst, size_t dstSize, const char* src, va_list arg); + +// strlcat and strlcpy have BSD semantics: +// * dstSize is always the size of the destination buffer +// * the resulting string is always NULL-terminated regardless of truncation +// * in the case of truncation the return value is the length of the string that would have been created + +PX_FOUNDATION_API size_t Pxstrlcat(char* dst, size_t dstSize, const char* src); +PX_FOUNDATION_API size_t Pxstrlcpy(char* dst, size_t dstSize, const char* src); + +// case-insensitive string comparison +PX_FOUNDATION_API int32_t Pxstricmp(const char* str1, const char* str2); +PX_FOUNDATION_API int32_t Pxstrnicmp(const char* str1, const char* str2, size_t count); + +// in-place string case conversion +PX_FOUNDATION_API void Pxstrlwr(char* str); +PX_FOUNDATION_API void Pxstrupr(char* str); + + +/** +\brief Prints the string literally (does not consume % specifier), trying to make sure it's visible to the app +programmer +*/ +PX_FOUNDATION_API void PxPrintString(const char*); + +#if !PX_DOXYGEN +} // namespace physx +#endif +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PsSync.h b/Source/ThirdParty/PhysX/foundation/PxSync.h similarity index 81% rename from Source/ThirdParty/PhysX/foundation/PsSync.h rename to Source/ThirdParty/PhysX/foundation/PxSync.h index 0fd87c2dc..46865d7e5 100644 --- a/Source/ThirdParty/PhysX/foundation/PsSync.h +++ b/Source/ThirdParty/PhysX/foundation/PxSync.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,19 +22,19 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PSFOUNDATION_PSSYNC_H -#define PSFOUNDATION_PSSYNC_H +#ifndef PX_SYNC_H +#define PX_SYNC_H -#include "PsAllocator.h" +#include "foundation/PxAllocator.h" +#if !PX_DOXYGEN namespace physx { -namespace shdfnd -{ +#endif /*! Implementation notes: * - Calling set() on an already signaled Sync does not change its state. @@ -45,14 +44,14 @@ Implementation notes: * - NOTE: be careful when pulsing an event with set() followed by reset(), because a * thread that is not waiting on the event will miss the signal. */ -class PX_FOUNDATION_API SyncImpl +class PX_FOUNDATION_API PxSyncImpl { public: static const uint32_t waitForever = 0xffffffff; - SyncImpl(); + PxSyncImpl(); - ~SyncImpl(); + ~PxSyncImpl(); /** Wait on the object for at most the given number of ms. Returns * true if the object is signaled. Sync::waitForever will block forever @@ -84,21 +83,21 @@ Implementation notes: * - NOTE: be careful when pulsing an event with set() followed by reset(), because a * thread that is not waiting on the event will miss the signal. */ -template > -class SyncT : protected Alloc +template > +class PxSyncT : protected Alloc { public: - static const uint32_t waitForever = SyncImpl::waitForever; + static const uint32_t waitForever = PxSyncImpl::waitForever; - SyncT(const Alloc& alloc = Alloc()) : Alloc(alloc) + PxSyncT(const Alloc& alloc = Alloc()) : Alloc(alloc) { - mImpl = reinterpret_cast(Alloc::allocate(SyncImpl::getSize(), __FILE__, __LINE__)); - PX_PLACEMENT_NEW(mImpl, SyncImpl)(); + mImpl = reinterpret_cast(Alloc::allocate(PxSyncImpl::getSize(), __FILE__, __LINE__)); + PX_PLACEMENT_NEW(mImpl, PxSyncImpl)(); } - ~SyncT() + ~PxSyncT() { - mImpl->~SyncImpl(); + mImpl->~PxSyncImpl(); Alloc::deallocate(mImpl); } @@ -107,7 +106,7 @@ class SyncT : protected Alloc * or until the object is signaled. */ - bool wait(uint32_t milliseconds = SyncImpl::waitForever) + bool wait(uint32_t milliseconds = PxSyncImpl::waitForever) { return mImpl->wait(milliseconds); } @@ -127,12 +126,14 @@ class SyncT : protected Alloc } private: - class SyncImpl* mImpl; + class PxSyncImpl* mImpl; }; -typedef SyncT<> Sync; +typedef PxSyncT<> PxSync; -} // namespace shdfnd +#if !PX_DOXYGEN } // namespace physx +#endif + +#endif -#endif // #ifndef PSFOUNDATION_PSSYNC_H diff --git a/Source/ThirdParty/PhysX/foundation/PxTempAllocator.h b/Source/ThirdParty/PhysX/foundation/PxTempAllocator.h new file mode 100644 index 000000000..395bce9a2 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxTempAllocator.h @@ -0,0 +1,63 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_TEMP_ALLOCATOR_H +#define PX_TEMP_ALLOCATOR_H + +#include "foundation/PxAllocator.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif +union PxTempAllocatorChunk +{ + PxTempAllocatorChunk() : mNext(0) + { + } + PxTempAllocatorChunk* mNext; // while chunk is free + PxU32 mIndex; // while chunk is allocated + PxU8 mPad[16]; // 16 byte aligned allocations +}; + +class PxTempAllocator +{ + public: + PX_FORCE_INLINE PxTempAllocator(const char* = 0) + { + } + PX_FOUNDATION_API void* allocate(size_t size, const char* file, PxI32 line); + PX_FOUNDATION_API void deallocate(void* ptr); +}; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxThread.h b/Source/ThirdParty/PhysX/foundation/PxThread.h new file mode 100644 index 000000000..6f3b8ddb7 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxThread.h @@ -0,0 +1,369 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_THREAD_H +#define PX_THREAD_H + +#include "foundation/PxUserAllocated.h" + +// todo: these need to go somewhere else +// PT: looks like this is still used on some platforms + +#if PX_WINDOWS_FAMILY +#define PxSpinLockPause() __asm pause +#elif PX_LINUX || PX_ANDROID || PX_PS4 || PX_PS5 || PX_APPLE_FAMILY || PX_SWITCH +#define PxSpinLockPause() asm("nop") +#else +#error "Platform not supported!" +#endif + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +struct PxThreadPriority +{ + enum Enum + { + eHIGH = 0, //!< High priority + eABOVE_NORMAL = 1, //!< Above Normal priority + eNORMAL = 2, //!< Normal/default priority + eBELOW_NORMAL = 3, //!< Below Normal priority + eLOW = 4, //!< Low priority. + eFORCE_DWORD = 0xffFFffFF + }; +}; + +class PxRunnable +{ + public: + PxRunnable() {} + virtual ~PxRunnable() {} + virtual void execute() {} +}; + +class PX_FOUNDATION_API PxThreadImpl +{ + public: + typedef size_t Id; // space for a pointer or an integer + typedef void* (*ExecuteFn)(void*); + + static PxU32 getDefaultStackSize(); + static Id getId(); + + /** + Construct (but do not start) the thread object. The OS thread object will not be created + until start() is called. Executes in the context + of the spawning thread. + */ + + PxThreadImpl(); + + /** + Construct and start the the thread, passing the given arg to the given fn. (pthread style) + */ + + PxThreadImpl(ExecuteFn fn, void* arg, const char* name); + + /** + Deallocate all resources associated with the thread. Should be called in the + context of the spawning thread. + */ + + ~PxThreadImpl(); + + /** + Create the OS thread and start it running. Called in the context of the spawning thread. + If an affinity mask has previously been set then it will be applied after the + thread has been created. + */ + + void start(PxU32 stackSize, PxRunnable* r); + + /** + Violently kill the current thread. Blunt instrument, not recommended since + it can leave all kinds of things unreleased (stack, memory, mutexes...) Should + be called in the context of the spawning thread. + */ + + void kill(); + + /** + Stop the thread. Signals the spawned thread that it should stop, so the + thread should check regularly + */ + + void signalQuit(); + + /** + Wait for a thread to stop. Should be called in the context of the spawning + thread. Returns false if the thread has not been started. + */ + + bool waitForQuit(); + + /** + check whether the thread is signalled to quit. Called in the context of the + spawned thread. + */ + + bool quitIsSignalled(); + + /** + Cleanly shut down this thread. Called in the context of the spawned thread. + */ + void quit(); + + /** + Change the affinity mask for this thread. The mask is a platform + specific value. + + On Windows, Linux, PS4, PS5, and Switch platforms, each set mask bit represents + the index of a logical processor that the OS may schedule thread execution on. + Bits outside the range of valid logical processors may be ignored or cause + the function to return an error. + + On Apple platforms, this function has no effect. + + If the thread has not yet been started then the mask is stored + and applied when the thread is started. + + If the thread has already been started then this method returns the + previous affinity mask on success, otherwise it returns zero. + */ + PxU32 setAffinityMask(PxU32 mask); + + static PxThreadPriority::Enum getPriority(Id threadId); + + /** Set thread priority. */ + void setPriority(PxThreadPriority::Enum prio); + + /** set the thread's name */ + void setName(const char* name); + + /** Put the current thread to sleep for the given number of milliseconds */ + static void sleep(PxU32 ms); + + /** Yield the current thread's slot on the CPU */ + static void yield(); + + /** Inform the processor that we're in a busy wait to give it a chance to do something clever. + yield() yields the thread, while yieldProcessor() aims to yield the processor */ + static void yieldProcessor(); + + /** Return the number of physical cores (does not include hyper-threaded cores), returns 0 on failure */ + static PxU32 getNbPhysicalCores(); + + /** + Size of this class. + */ + static PxU32 getSize(); +}; + +/** +Thread abstraction API +*/ +template > +class PxThreadT : protected Alloc, public PxUserAllocated, public PxRunnable +{ + public: + typedef PxThreadImpl::Id Id; // space for a pointer or an integer + + /** + Construct (but do not start) the thread object. Executes in the context + of the spawning thread + */ + PxThreadT(const Alloc& alloc = Alloc()) : Alloc(alloc) + { + mImpl = reinterpret_cast(Alloc::allocate(PxThreadImpl::getSize(), __FILE__, __LINE__)); + PX_PLACEMENT_NEW(mImpl, PxThreadImpl)(); + } + + /** + Construct and start the the thread, passing the given arg to the given fn. (pthread style) + */ + PxThreadT(PxThreadImpl::ExecuteFn fn, void* arg, const char* name, const Alloc& alloc = Alloc()) : Alloc(alloc) + { + mImpl = reinterpret_cast(Alloc::allocate(PxThreadImpl::getSize(), __FILE__, __LINE__)); + PX_PLACEMENT_NEW(mImpl, PxThreadImpl)(fn, arg, name); + } + + /** + Deallocate all resources associated with the thread. Should be called in the + context of the spawning thread. + */ + virtual ~PxThreadT() + { + mImpl->~PxThreadImpl(); + Alloc::deallocate(mImpl); + } + + /** + start the thread running. Called in the context of the spawning thread. + */ + + void start(PxU32 stackSize = PxThreadImpl::getDefaultStackSize()) + { + mImpl->start(stackSize, this); + } + + /** + Violently kill the current thread. Blunt instrument, not recommended since + it can leave all kinds of things unreleased (stack, memory, mutexes...) Should + be called in the context of the spawning thread. + */ + + void kill() + { + mImpl->kill(); + } + + /** + The virtual execute() method is the user defined function that will + run in the new thread. Called in the context of the spawned thread. + */ + + virtual void execute(void) + { + } + + /** + stop the thread. Signals the spawned thread that it should stop, so the + thread should check regularly + */ + + void signalQuit() + { + mImpl->signalQuit(); + } + + /** + Wait for a thread to stop. Should be called in the context of the spawning + thread. Returns false if the thread has not been started. + */ + + bool waitForQuit() + { + return mImpl->waitForQuit(); + } + + /** + check whether the thread is signalled to quit. Called in the context of the + spawned thread. + */ + + bool quitIsSignalled() + { + return mImpl->quitIsSignalled(); + } + + /** + Cleanly shut down this thread. Called in the context of the spawned thread. + */ + void quit() + { + mImpl->quit(); + } + + PxU32 setAffinityMask(PxU32 mask) + { + return mImpl->setAffinityMask(mask); + } + + static PxThreadPriority::Enum getPriority(PxThreadImpl::Id threadId) + { + return PxThreadImpl::getPriority(threadId); + } + + /** Set thread priority. */ + void setPriority(PxThreadPriority::Enum prio) + { + mImpl->setPriority(prio); + } + + /** set the thread's name */ + void setName(const char* name) + { + mImpl->setName(name); + } + + /** Put the current thread to sleep for the given number of milliseconds */ + static void sleep(PxU32 ms) + { + PxThreadImpl::sleep(ms); + } + + /** Yield the current thread's slot on the CPU */ + static void yield() + { + PxThreadImpl::yield(); + } + + /** Inform the processor that we're in a busy wait to give it a chance to do something clever + yield() yields the thread, while yieldProcessor() aims to yield the processor */ + static void yieldProcesor() + { + PxThreadImpl::yieldProcessor(); + } + + static PxU32 getDefaultStackSize() + { + return PxThreadImpl::getDefaultStackSize(); + } + + static PxThreadImpl::Id getId() + { + return PxThreadImpl::getId(); + } + + static PxU32 getNbPhysicalCores() + { + return PxThreadImpl::getNbPhysicalCores(); + } + + private: + class PxThreadImpl* mImpl; +}; + +typedef PxThreadT<> PxThread; + +PX_FOUNDATION_API PxU32 PxTlsAlloc(); +PX_FOUNDATION_API void PxTlsFree(PxU32 index); +PX_FOUNDATION_API void* PxTlsGet(PxU32 index); +PX_FOUNDATION_API size_t PxTlsGetValue(PxU32 index); +PX_FOUNDATION_API PxU32 PxTlsSet(PxU32 index, void* value); +PX_FOUNDATION_API PxU32 PxTlsSetValue(PxU32 index, size_t value); + + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxTime.h b/Source/ThirdParty/PhysX/foundation/PxTime.h new file mode 100644 index 000000000..e21226fff --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxTime.h @@ -0,0 +1,97 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_TIME_H +#define PX_TIME_H + +#include "foundation/PxSimpleTypes.h" +#include "foundation/PxFoundationConfig.h" + +#if PX_LINUX || PX_ANDROID +#include +#endif + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +struct PxCounterFrequencyToTensOfNanos +{ + PxU64 mNumerator; + PxU64 mDenominator; + PxCounterFrequencyToTensOfNanos(PxU64 inNum, PxU64 inDenom) : mNumerator(inNum), mDenominator(inDenom) + { + } + + // quite slow. + PxU64 toTensOfNanos(PxU64 inCounter) const + { + return (inCounter * mNumerator) / mDenominator; + } +}; + +class PX_FOUNDATION_API PxTime +{ + public: + typedef PxF64 Second; + static const PxU64 sNumTensOfNanoSecondsInASecond = 100000000; + // This is supposedly guaranteed to not change after system boot + // regardless of processors, speedstep, etc. + static const PxCounterFrequencyToTensOfNanos& getBootCounterFrequency(); + + static PxCounterFrequencyToTensOfNanos getCounterFrequency(); + + static PxU64 getCurrentCounterValue(); + + // SLOW!! + // Thar be a 64 bit divide in thar! + static PxU64 getCurrentTimeInTensOfNanoSeconds() + { + PxU64 ticks = getCurrentCounterValue(); + return getBootCounterFrequency().toTensOfNanos(ticks); + } + + PxTime(); + Second getElapsedSeconds(); + Second peekElapsedSeconds(); + Second getLastTime() const; + + private: +#if PX_LINUX || PX_ANDROID || PX_APPLE_FAMILY || PX_PS4 || PX_PS5 + Second mLastTime; +#else + PxI64 mTickCount; +#endif +}; +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxTransform.h b/Source/ThirdParty/PhysX/foundation/PxTransform.h index f639903b6..bf877a6d6 100644 --- a/Source/ThirdParty/PhysX/foundation/PxTransform.h +++ b/Source/ThirdParty/PhysX/foundation/PxTransform.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,18 +22,17 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXTRANSFORM_H -#define PXFOUNDATION_PXTRANSFORM_H +#ifndef PX_TRANSFORM_H +#define PX_TRANSFORM_H /** \addtogroup foundation @{ */ #include "foundation/PxQuat.h" -#include "foundation/PxPlane.h" #if !PX_DOXYGEN namespace physx @@ -45,106 +43,117 @@ namespace physx \brief class representing a rigid euclidean transform as a quaternion and a vector */ -class PxTransform +template +class PxTransformT { public: - PxQuat q; - PxVec3 p; + PxQuatT q; + PxVec3T p; - PX_CUDA_CALLABLE PX_FORCE_INLINE PxTransform() + PX_CUDA_CALLABLE PX_FORCE_INLINE PxTransformT() { } - PX_CUDA_CALLABLE PX_FORCE_INLINE explicit PxTransform(const PxVec3& position) : q(PxIdentity), p(position) + PX_CUDA_CALLABLE PX_FORCE_INLINE explicit PxTransformT(const PxVec3T& position) : q(PxIdentity), p(position) { } - PX_CUDA_CALLABLE PX_FORCE_INLINE explicit PxTransform(PxIDENTITY r) : q(PxIdentity), p(PxZero) - { - PX_UNUSED(r); - } - - PX_CUDA_CALLABLE PX_FORCE_INLINE explicit PxTransform(const PxQuat& orientation) : q(orientation), p(0) - { - PX_SHARED_ASSERT(orientation.isSane()); - } - - PX_CUDA_CALLABLE PX_FORCE_INLINE PxTransform(float x, float y, float z, PxQuat aQ = PxQuat(PxIdentity)) - : q(aQ), p(x, y, z) + PX_CUDA_CALLABLE PX_FORCE_INLINE explicit PxTransformT(PxIDENTITY) : q(PxIdentity), p(PxZero) { } - PX_CUDA_CALLABLE PX_FORCE_INLINE PxTransform(const PxVec3& p0, const PxQuat& q0) : q(q0), p(p0) + PX_CUDA_CALLABLE PX_FORCE_INLINE explicit PxTransformT(const PxQuatT& orientation) : q(orientation), p(Type(0)) { - PX_SHARED_ASSERT(q0.isSane()); + PX_ASSERT(orientation.isSane()); } - PX_CUDA_CALLABLE PX_FORCE_INLINE explicit PxTransform(const PxMat44& m); // defined in PxMat44.h + PX_CUDA_CALLABLE PX_FORCE_INLINE PxTransformT(Type x, Type y, Type z, PxQuatT aQ = PxQuatT(PxIdentity)) : + q(aQ), p(x, y, z) + { + } + + PX_CUDA_CALLABLE PX_FORCE_INLINE PxTransformT(const PxVec3T& p0, const PxQuatT& q0) : q(q0), p(p0) + { + PX_ASSERT(q0.isSane()); + } + + PX_CUDA_CALLABLE PX_FORCE_INLINE explicit PxTransformT(const PxMat44T& m); // defined in PxMat44.h + + PX_CUDA_CALLABLE PX_FORCE_INLINE void operator=(const PxTransformT& other) + { + p = other.p; + q = other.q; + } + + PX_CUDA_CALLABLE PX_FORCE_INLINE PxTransformT(const PxTransformT& other) + { + p = other.p; + q = other.q; + } /** \brief returns true if the two transforms are exactly equal */ - PX_CUDA_CALLABLE PX_INLINE bool operator==(const PxTransform& t) const + PX_CUDA_CALLABLE PX_INLINE bool operator==(const PxTransformT& t) const { return p == t.p && q == t.q; } - PX_CUDA_CALLABLE PX_FORCE_INLINE PxTransform operator*(const PxTransform& x) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxTransformT operator*(const PxTransformT& x) const { - PX_SHARED_ASSERT(x.isSane()); + PX_ASSERT(x.isSane()); return transform(x); } //! Equals matrix multiplication - PX_CUDA_CALLABLE PX_INLINE PxTransform& operator*=(PxTransform& other) + PX_CUDA_CALLABLE PX_INLINE PxTransformT& operator*=(const PxTransformT& other) { *this = *this * other; return *this; } - PX_CUDA_CALLABLE PX_FORCE_INLINE PxTransform getInverse() const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxTransformT getInverse() const { - PX_SHARED_ASSERT(isFinite()); - return PxTransform(q.rotateInv(-p), q.getConjugate()); + PX_ASSERT(isFinite()); + return PxTransformT(q.rotateInv(-p), q.getConjugate()); } - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 transform(const PxVec3& input) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T transform(const PxVec3T& input) const { - PX_SHARED_ASSERT(isFinite()); + PX_ASSERT(isFinite()); return q.rotate(input) + p; } - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 transformInv(const PxVec3& input) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T transformInv(const PxVec3T& input) const { - PX_SHARED_ASSERT(isFinite()); + PX_ASSERT(isFinite()); return q.rotateInv(input - p); } - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 rotate(const PxVec3& input) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T rotate(const PxVec3T& input) const { - PX_SHARED_ASSERT(isFinite()); + PX_ASSERT(isFinite()); return q.rotate(input); } - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 rotateInv(const PxVec3& input) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T rotateInv(const PxVec3T& input) const { - PX_SHARED_ASSERT(isFinite()); + PX_ASSERT(isFinite()); return q.rotateInv(input); } //! Transform transform to parent (returns compound transform: first src, then *this) - PX_CUDA_CALLABLE PX_FORCE_INLINE PxTransform transform(const PxTransform& src) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxTransformT transform(const PxTransformT& src) const { - PX_SHARED_ASSERT(src.isSane()); - PX_SHARED_ASSERT(isSane()); + PX_ASSERT(src.isSane()); + PX_ASSERT(isSane()); // src = [srct, srcr] -> [r*srct + t, r*srcr] - return PxTransform(q.rotate(src.p) + p, q * src.q); + return PxTransformT(q.rotate(src.p) + p, q * src.q); } /** \brief returns true if finite and q is a unit quaternion */ - PX_CUDA_CALLABLE bool isValid() const { return p.isFinite() && q.isFinite() && q.isUnit(); @@ -154,7 +163,6 @@ class PxTransform \brief returns true if finite and quat magnitude is reasonably close to unit to allow for some accumulation of error vs isValid */ - PX_CUDA_CALLABLE bool isSane() const { return isFinite() && q.isSane(); @@ -169,47 +177,48 @@ class PxTransform } //! Transform transform from parent (returns compound transform: first src, then this->inverse) - PX_CUDA_CALLABLE PX_FORCE_INLINE PxTransform transformInv(const PxTransform& src) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxTransformT transformInv(const PxTransformT& src) const { - PX_SHARED_ASSERT(src.isSane()); - PX_SHARED_ASSERT(isFinite()); + PX_ASSERT(src.isSane()); + PX_ASSERT(isFinite()); // src = [srct, srcr] -> [r^-1*(srct-t), r^-1*srcr] - PxQuat qinv = q.getConjugate(); - return PxTransform(qinv.rotate(src.p - p), qinv * src.q); - } - - /** - \brief transform plane - */ - - PX_CUDA_CALLABLE PX_FORCE_INLINE PxPlane transform(const PxPlane& plane) const - { - PxVec3 transformedNormal = rotate(plane.n); - return PxPlane(transformedNormal, plane.d - p.dot(transformedNormal)); - } - - /** - \brief inverse-transform plane - */ - - PX_CUDA_CALLABLE PX_FORCE_INLINE PxPlane inverseTransform(const PxPlane& plane) const - { - PxVec3 transformedNormal = rotateInv(plane.n); - return PxPlane(transformedNormal, plane.d + p.dot(plane.n)); + const PxQuatT qinv = q.getConjugate(); + return PxTransformT(qinv.rotate(src.p - p), qinv * src.q); } /** \brief return a normalized transform (i.e. one in which the quaternion has unit magnitude) */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxTransform getNormalized() const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxTransformT getNormalized() const { - return PxTransform(p, q.getNormalized()); + return PxTransformT(p, q.getNormalized()); } }; +typedef PxTransformT PxTransform; +typedef PxTransformT PxTransformd; + +/*! +\brief A generic padded & aligned transform class. + +This can be used for safe faster loads & stores, and faster address computations +(the default PxTransformT often generating imuls for this otherwise). Padding bytes +can be reused to store useful data if needed. +*/ +struct PX_ALIGN_PREFIX(16) PxTransformPadded +{ + PxTransform transform; + PxU32 padding; +} +PX_ALIGN_SUFFIX(16); +PX_COMPILE_TIME_ASSERT(sizeof(PxTransformPadded)==32); + +typedef PxTransformPadded PxTransform32; + #if !PX_DOXYGEN } // namespace physx #endif /** @} */ -#endif // #ifndef PXFOUNDATION_PXTRANSFORM_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxUnionCast.h b/Source/ThirdParty/PhysX/foundation/PxUnionCast.h index 007493cba..95d7d1d25 100644 --- a/Source/ThirdParty/PhysX/foundation/PxUnionCast.h +++ b/Source/ThirdParty/PhysX/foundation/PxUnionCast.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXUNIONCAST_H -#define PXFOUNDATION_PXUNIONCAST_H +#ifndef PX_UNION_CAST_H +#define PX_UNION_CAST_H #include "foundation/Px.h" @@ -70,4 +69,5 @@ PX_FORCE_INLINE A PxUnionCast(B b) /** @} */ -#endif // PXFOUNDATION_PXUNIONCAST_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxUserAllocated.h b/Source/ThirdParty/PhysX/foundation/PxUserAllocated.h new file mode 100644 index 000000000..d5be1724c --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxUserAllocated.h @@ -0,0 +1,116 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_USER_ALLOCATED_H +#define PX_USER_ALLOCATED_H + +#include "PxAllocator.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + /** + Provides new and delete using a UserAllocator. + Guarantees that 'delete x;' uses the UserAllocator too. + */ + class PxUserAllocated + { + public: + // PX_SERIALIZATION + PX_INLINE void* operator new(size_t, void* address) + { + return address; + } + + //~PX_SERIALIZATION + // Matching operator delete to the above operator new. Don't ask me + // how this makes any sense - Nuernberger. + PX_INLINE void operator delete(void*, void*) + { + } + + template + PX_INLINE void* operator new(size_t size, Alloc alloc, const char* fileName, int line) + { + return alloc.allocate(size, fileName, line); + } + + template + PX_INLINE void* operator new(size_t size, size_t /*align*/, Alloc alloc, const char* fileName, int line) + { + // align is not respected, we have 16bit aligned allocator + return alloc.allocate(size, fileName, line); + } + + template + PX_INLINE void* operator new [](size_t size, Alloc alloc, const char* fileName, int line) + { + return alloc.allocate(size, fileName, line); + } + + template + PX_INLINE void* operator new [](size_t size, size_t /*align*/, Alloc alloc, const char* fileName, int line) + { + // align is not respected, we have 16bit aligned allocator + return alloc.allocate(size, fileName, line); + } + + // placement delete + template + PX_INLINE void operator delete(void* ptr, Alloc alloc, const char* fileName, int line) + { + PX_UNUSED(fileName); + PX_UNUSED(line); + alloc.deallocate(ptr); + } + + template + PX_INLINE void operator delete [](void* ptr, Alloc alloc, const char* fileName, int line) + { + PX_UNUSED(fileName); + PX_UNUSED(line); + alloc.deallocate(ptr); + } + + PX_INLINE void operator delete(void* ptr) + { + PxAllocator().deallocate(ptr); + } + + PX_INLINE void operator delete [](void* ptr) + { + PxAllocator().deallocate(ptr); + } + }; +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxUtilities.h b/Source/ThirdParty/PhysX/foundation/PxUtilities.h new file mode 100644 index 000000000..39dc5c590 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxUtilities.h @@ -0,0 +1,148 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_UTILITIES_H +#define PX_UTILITIES_H + +#include "foundation/PxVec3.h" +#include "foundation/PxAssert.h" +#include "foundation/PxIntrinsics.h" +#include "foundation/PxBasicTemplates.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif +PX_INLINE char PxLittleEndian() +{ + int i = 1; + return *(reinterpret_cast(&i)); +} + +// PT: checked casts +PX_CUDA_CALLABLE PX_FORCE_INLINE PxU32 PxTo32(PxU64 value) +{ + PX_ASSERT(value <= 0xffffffff); + return PxU32(value); +} +PX_CUDA_CALLABLE PX_FORCE_INLINE PxU16 PxTo16(PxU32 value) +{ + PX_ASSERT(value <= 0xffff); + return PxU16(value); +} +PX_CUDA_CALLABLE PX_FORCE_INLINE PxU8 PxTo8(PxU16 value) +{ + PX_ASSERT(value <= 0xff); + return PxU8(value); +} +PX_CUDA_CALLABLE PX_FORCE_INLINE PxU8 PxTo8(PxU32 value) +{ + PX_ASSERT(value <= 0xff); + return PxU8(value); +} +PX_CUDA_CALLABLE PX_FORCE_INLINE PxU8 PxTo8(PxI32 value) +{ + PX_ASSERT(value <= 0xff); + PX_ASSERT(value >= 0); + return PxU8(value); +} +PX_CUDA_CALLABLE PX_FORCE_INLINE PxI8 PxToI8(PxU32 value) +{ + PX_ASSERT(value <= 0x7f); + return PxI8(value); +} + +//! @cond +/*! +Get number of elements in array +*/ +template +char (&PxArraySizeHelper(T (&array)[N]))[N]; +#define PX_ARRAY_SIZE(_array) (sizeof(physx::PxArraySizeHelper(_array))) +//! @endcond + +/*! +Sort two elements using operator< + +On return x will be the smaller of the two +*/ +template +PX_CUDA_CALLABLE PX_FORCE_INLINE void PxOrder(T& x, T& y) +{ + if(y < x) + PxSwap(x, y); +} + +// most architectures can do predication on real comparisons, and on VMX, it matters + +PX_CUDA_CALLABLE PX_FORCE_INLINE void PxOrder(PxReal& x, PxReal& y) +{ + PxReal newX = PxMin(x, y); + PxReal newY = PxMax(x, y); + x = newX; + y = newY; +} + +/*! +Sort two elements using operator< and also keep order +of any extra data +*/ +template +PX_CUDA_CALLABLE PX_FORCE_INLINE void PxOrder(T& x, T& y, E1& xe1, E1& ye1) +{ + if(y < x) + { + swap(x, y); + swap(xe1, ye1); + } +} + +#if PX_GCC_FAMILY && !PX_EMSCRIPTEN && !PX_ANDROID +__attribute__((noreturn)) +#endif + PX_INLINE void PxDebugBreak() +{ +#if PX_WINDOWS + __debugbreak(); +#elif PX_ANDROID + raise(SIGTRAP); // works better than __builtin_trap. Proper call stack and can be continued. +#elif PX_LINUX + __builtin_trap(); +#elif PX_GCC_FAMILY + __builtin_trap(); +#else + PX_ASSERT(false); +#endif +} + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxVec2.h b/Source/ThirdParty/PhysX/foundation/PxVec2.h index 11281115b..12c2f51be 100644 --- a/Source/ThirdParty/PhysX/foundation/PxVec2.h +++ b/Source/ThirdParty/PhysX/foundation/PxVec2.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXVEC2_H -#define PXFOUNDATION_PXVEC2_H +#ifndef PX_VEC2_H +#define PX_VEC2_H /** \addtogroup foundation @{ @@ -46,22 +45,22 @@ namespace physx This is a 2-dimensional vector class with public data members. */ -class PxVec2 +template +class PxVec2T { public: /** \brief default constructor leaves data uninitialized. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2() + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2T() { } /** \brief zero constructor. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2(PxZERO r) : x(0.0f), y(0.0f) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2T(PxZERO) : x(Type(0.0)), y(Type(0.0)) { - PX_UNUSED(r); } /** @@ -71,7 +70,7 @@ class PxVec2 \param[in] a Value to assign to elements. */ - explicit PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2(float a) : x(a), y(a) + explicit PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2T(Type a) : x(a), y(a) { } @@ -81,14 +80,14 @@ class PxVec2 \param[in] nx Value to initialize X component. \param[in] ny Value to initialize Y component. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2(float nx, float ny) : x(nx), y(ny) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2T(Type nx, Type ny) : x(nx), y(ny) { } /** \brief Copy ctor. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2(const PxVec2& v) : x(v.x), y(v.y) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2T(const PxVec2T& v) : x(v.x), y(v.y) { } @@ -97,7 +96,7 @@ class PxVec2 /** \brief Assignment operator */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2& operator=(const PxVec2& p) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2T& operator=(const PxVec2T& p) { x = p.x; y = p.y; @@ -107,27 +106,25 @@ class PxVec2 /** \brief element access */ - PX_CUDA_CALLABLE PX_FORCE_INLINE float& operator[](int index) + PX_CUDA_CALLABLE PX_FORCE_INLINE Type& operator[](unsigned int index) { - PX_SHARED_ASSERT(index >= 0 && index <= 1); - - return reinterpret_cast(this)[index]; + PX_ASSERT(index <= 1); + return reinterpret_cast(this)[index]; } /** \brief element access */ - PX_CUDA_CALLABLE PX_FORCE_INLINE const float& operator[](int index) const + PX_CUDA_CALLABLE PX_FORCE_INLINE const Type& operator[](unsigned int index) const { - PX_SHARED_ASSERT(index >= 0 && index <= 1); - - return reinterpret_cast(this)[index]; + PX_ASSERT(index <= 1); + return reinterpret_cast(this)[index]; } /** \brief returns true if the two vectors are exactly equal. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE bool operator==(const PxVec2& v) const + PX_CUDA_CALLABLE PX_FORCE_INLINE bool operator==(const PxVec2T& v) const { return x == v.x && y == v.y; } @@ -135,7 +132,7 @@ class PxVec2 /** \brief returns true if the two vectors are not exactly equal. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE bool operator!=(const PxVec2& v) const + PX_CUDA_CALLABLE PX_FORCE_INLINE bool operator!=(const PxVec2T& v) const { return x != v.x || y != v.y; } @@ -145,7 +142,7 @@ class PxVec2 */ PX_CUDA_CALLABLE PX_FORCE_INLINE bool isZero() const { - return x == 0.0f && y == 0.0f; + return x == Type(0.0) && y == Type(0.0); } /** @@ -161,8 +158,8 @@ class PxVec2 */ PX_CUDA_CALLABLE PX_FORCE_INLINE bool isNormalized() const { - const float unitTolerance = 1e-4f; - return isFinite() && PxAbs(magnitude() - 1) < unitTolerance; + const Type unitTolerance = Type(1e-4); + return isFinite() && PxAbs(magnitude() - Type(1.0)) < unitTolerance; } /** @@ -170,7 +167,7 @@ class PxVec2 Avoids calling PxSqrt()! */ - PX_CUDA_CALLABLE PX_FORCE_INLINE float magnitudeSquared() const + PX_CUDA_CALLABLE PX_FORCE_INLINE Type magnitudeSquared() const { return x * x + y * y; } @@ -178,7 +175,7 @@ class PxVec2 /** \brief returns the magnitude */ - PX_CUDA_CALLABLE PX_FORCE_INLINE float magnitude() const + PX_CUDA_CALLABLE PX_FORCE_INLINE Type magnitude() const { return PxSqrt(magnitudeSquared()); } @@ -186,48 +183,48 @@ class PxVec2 /** \brief negation */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2 operator-() const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2T operator-() const { - return PxVec2(-x, -y); + return PxVec2T(-x, -y); } /** \brief vector addition */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2 operator+(const PxVec2& v) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2T operator+(const PxVec2T& v) const { - return PxVec2(x + v.x, y + v.y); + return PxVec2T(x + v.x, y + v.y); } /** \brief vector difference */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2 operator-(const PxVec2& v) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2T operator-(const PxVec2T& v) const { - return PxVec2(x - v.x, y - v.y); + return PxVec2T(x - v.x, y - v.y); } /** \brief scalar post-multiplication */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2 operator*(float f) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2T operator*(Type f) const { - return PxVec2(x * f, y * f); + return PxVec2T(x * f, y * f); } /** \brief scalar division */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2 operator/(float f) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2T operator/(Type f) const { - f = 1.0f / f; // PT: inconsistent notation with operator /= - return PxVec2(x * f, y * f); + f = Type(1.0) / f; + return PxVec2T(x * f, y * f); } /** \brief vector addition */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2& operator+=(const PxVec2& v) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2T& operator+=(const PxVec2T& v) { x += v.x; y += v.y; @@ -237,7 +234,7 @@ class PxVec2 /** \brief vector difference */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2& operator-=(const PxVec2& v) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2T& operator-=(const PxVec2T& v) { x -= v.x; y -= v.y; @@ -247,18 +244,19 @@ class PxVec2 /** \brief scalar multiplication */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2& operator*=(float f) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2T& operator*=(Type f) { x *= f; y *= f; return *this; } + /** \brief scalar division */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2& operator/=(float f) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2T& operator/=(Type f) { - f = 1.0f / f; // PT: inconsistent notation with operator / + f = Type(1.0) / f; x *= f; y *= f; return *this; @@ -267,26 +265,25 @@ class PxVec2 /** \brief returns the scalar product of this and other. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE float dot(const PxVec2& v) const + PX_CUDA_CALLABLE PX_FORCE_INLINE Type dot(const PxVec2T& v) const { return x * v.x + y * v.y; } - /** return a unit vector */ - - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2 getNormalized() const + /** returns a unit vector */ + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2T getNormalized() const { - const float m = magnitudeSquared(); - return m > 0.0f ? *this * PxRecipSqrt(m) : PxVec2(0, 0); + const Type m = magnitudeSquared(); + return m > Type(0.0) ? *this * PxRecipSqrt(m) : PxVec2T(Type(0)); } /** \brief normalizes the vector in place */ - PX_CUDA_CALLABLE PX_FORCE_INLINE float normalize() + PX_CUDA_CALLABLE PX_FORCE_INLINE Type normalize() { - const float m = magnitude(); - if(m > 0.0f) + const Type m = magnitude(); + if(m > Type(0.0)) *this /= m; return m; } @@ -294,23 +291,23 @@ class PxVec2 /** \brief a[i] * b[i], for all i. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2 multiply(const PxVec2& a) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2T multiply(const PxVec2T& a) const { - return PxVec2(x * a.x, y * a.y); + return PxVec2T(x * a.x, y * a.y); } /** \brief element-wise minimum */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2 minimum(const PxVec2& v) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2T minimum(const PxVec2T& v) const { - return PxVec2(PxMin(x, v.x), PxMin(y, v.y)); + return PxVec2T(PxMin(x, v.x), PxMin(y, v.y)); } /** \brief returns MIN(x, y); */ - PX_CUDA_CALLABLE PX_FORCE_INLINE float minElement() const + PX_CUDA_CALLABLE PX_FORCE_INLINE Type minElement() const { return PxMin(x, y); } @@ -318,30 +315,35 @@ class PxVec2 /** \brief element-wise maximum */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2 maximum(const PxVec2& v) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec2T maximum(const PxVec2T& v) const { - return PxVec2(PxMax(x, v.x), PxMax(y, v.y)); + return PxVec2T(PxMax(x, v.x), PxMax(y, v.y)); } /** \brief returns MAX(x, y); */ - PX_CUDA_CALLABLE PX_FORCE_INLINE float maxElement() const + PX_CUDA_CALLABLE PX_FORCE_INLINE Type maxElement() const { return PxMax(x, y); } - float x, y; + Type x, y; }; -PX_CUDA_CALLABLE static PX_FORCE_INLINE PxVec2 operator*(float f, const PxVec2& v) +template +PX_CUDA_CALLABLE static PX_FORCE_INLINE PxVec2T operator*(Type f, const PxVec2T& v) { - return PxVec2(f * v.x, f * v.y); + return PxVec2T(f * v.x, f * v.y); } +typedef PxVec2T PxVec2; +typedef PxVec2T PxVec2d; + #if !PX_DOXYGEN } // namespace physx #endif /** @} */ -#endif // #ifndef PXFOUNDATION_PXVEC2_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxVec3.h b/Source/ThirdParty/PhysX/foundation/PxVec3.h index d3baead98..af51e8c4c 100644 --- a/Source/ThirdParty/PhysX/foundation/PxVec3.h +++ b/Source/ThirdParty/PhysX/foundation/PxVec3.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXVEC3_H -#define PXFOUNDATION_PXVEC3_H +#ifndef PX_VEC3_H +#define PX_VEC3_H /** \addtogroup foundation @{ @@ -46,22 +45,23 @@ namespace physx This is a 3-dimensional vector class with public data members. */ -class PxVec3 +template +class PxVec3T { public: + /** \brief default constructor leaves data uninitialized. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3() + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T() { } /** \brief zero constructor. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3(PxZERO r) : x(0.0f), y(0.0f), z(0.0f) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T(PxZERO) : x(Type(0.0)), y(Type(0.0)), z(Type(0.0)) { - PX_UNUSED(r); } /** @@ -71,7 +71,7 @@ class PxVec3 \param[in] a Value to assign to elements. */ - explicit PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3(float a) : x(a), y(a), z(a) + explicit PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T(Type a) : x(a), y(a), z(a) { } @@ -82,14 +82,14 @@ class PxVec3 \param[in] ny Value to initialize Y component. \param[in] nz Value to initialize Z component. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3(float nx, float ny, float nz) : x(nx), y(ny), z(nz) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T(Type nx, Type ny, Type nz) : x(nx), y(ny), z(nz) { } /** \brief Copy ctor. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3(const PxVec3& v) : x(v.x), y(v.y), z(v.z) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T(const PxVec3T& v) : x(v.x), y(v.y), z(v.z) { } @@ -98,7 +98,7 @@ class PxVec3 /** \brief Assignment operator */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3& operator=(const PxVec3& p) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T& operator=(const PxVec3T& p) { x = p.x; y = p.y; @@ -109,27 +109,25 @@ class PxVec3 /** \brief element access */ - PX_CUDA_CALLABLE PX_FORCE_INLINE float& operator[](unsigned int index) + PX_CUDA_CALLABLE PX_FORCE_INLINE Type& operator[](unsigned int index) { - PX_SHARED_ASSERT(index <= 2); - - return reinterpret_cast(this)[index]; + PX_ASSERT(index <= 2); + return reinterpret_cast(this)[index]; } /** \brief element access */ - PX_CUDA_CALLABLE PX_FORCE_INLINE const float& operator[](unsigned int index) const + PX_CUDA_CALLABLE PX_FORCE_INLINE const Type& operator[](unsigned int index) const { - PX_SHARED_ASSERT(index <= 2); - - return reinterpret_cast(this)[index]; + PX_ASSERT(index <= 2); + return reinterpret_cast(this)[index]; } /** \brief returns true if the two vectors are exactly equal. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE bool operator==(const PxVec3& v) const + PX_CUDA_CALLABLE PX_FORCE_INLINE bool operator==(const PxVec3T& v) const { return x == v.x && y == v.y && z == v.z; } @@ -137,7 +135,7 @@ class PxVec3 /** \brief returns true if the two vectors are not exactly equal. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE bool operator!=(const PxVec3& v) const + PX_CUDA_CALLABLE PX_FORCE_INLINE bool operator!=(const PxVec3T& v) const { return x != v.x || y != v.y || z != v.z; } @@ -147,7 +145,7 @@ class PxVec3 */ PX_CUDA_CALLABLE PX_FORCE_INLINE bool isZero() const { - return x == 0.0f && y == 0.0f && z == 0.0f; + return x == Type(0.0) && y == Type(0.0) && z == Type(0.0); } /** @@ -163,8 +161,8 @@ class PxVec3 */ PX_CUDA_CALLABLE PX_FORCE_INLINE bool isNormalized() const { - const float unitTolerance = 1e-4f; - return isFinite() && PxAbs(magnitude() - 1) < unitTolerance; + const float unitTolerance = Type(1e-4); // PT: do we need a different epsilon for float & double? + return isFinite() && PxAbs(magnitude() - Type(1.0)) < unitTolerance; } /** @@ -172,7 +170,7 @@ class PxVec3 Avoids calling PxSqrt()! */ - PX_CUDA_CALLABLE PX_FORCE_INLINE float magnitudeSquared() const + PX_CUDA_CALLABLE PX_FORCE_INLINE Type magnitudeSquared() const { return x * x + y * y + z * z; } @@ -180,7 +178,7 @@ class PxVec3 /** \brief returns the magnitude */ - PX_CUDA_CALLABLE PX_FORCE_INLINE float magnitude() const + PX_CUDA_CALLABLE PX_FORCE_INLINE Type magnitude() const { return PxSqrt(magnitudeSquared()); } @@ -188,48 +186,48 @@ class PxVec3 /** \brief negation */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 operator-() const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T operator-() const { - return PxVec3(-x, -y, -z); + return PxVec3T(-x, -y, -z); } /** \brief vector addition */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 operator+(const PxVec3& v) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T operator+(const PxVec3T& v) const { - return PxVec3(x + v.x, y + v.y, z + v.z); + return PxVec3T(x + v.x, y + v.y, z + v.z); } /** \brief vector difference */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 operator-(const PxVec3& v) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T operator-(const PxVec3T& v) const { - return PxVec3(x - v.x, y - v.y, z - v.z); + return PxVec3T(x - v.x, y - v.y, z - v.z); } /** \brief scalar post-multiplication */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 operator*(float f) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T operator*(Type f) const { - return PxVec3(x * f, y * f, z * f); + return PxVec3T(x * f, y * f, z * f); } /** \brief scalar division */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 operator/(float f) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T operator/(Type f) const { - f = 1.0f / f; - return PxVec3(x * f, y * f, z * f); + f = Type(1.0) / f; + return PxVec3T(x * f, y * f, z * f); } /** \brief vector addition */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3& operator+=(const PxVec3& v) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T& operator+=(const PxVec3T& v) { x += v.x; y += v.y; @@ -240,7 +238,7 @@ class PxVec3 /** \brief vector difference */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3& operator-=(const PxVec3& v) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T& operator-=(const PxVec3T& v) { x -= v.x; y -= v.y; @@ -251,7 +249,7 @@ class PxVec3 /** \brief scalar multiplication */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3& operator*=(float f) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T& operator*=(Type f) { x *= f; y *= f; @@ -261,9 +259,9 @@ class PxVec3 /** \brief scalar division */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3& operator/=(float f) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T& operator/=(Type f) { - f = 1.0f / f; + f = Type(1.0) / f; x *= f; y *= f; z *= f; @@ -273,7 +271,7 @@ class PxVec3 /** \brief returns the scalar product of this and other. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE float dot(const PxVec3& v) const + PX_CUDA_CALLABLE PX_FORCE_INLINE Type dot(const PxVec3T& v) const { return x * v.x + y * v.y + z * v.z; } @@ -281,26 +279,25 @@ class PxVec3 /** \brief cross product */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 cross(const PxVec3& v) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T cross(const PxVec3T& v) const { - return PxVec3(y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x); + return PxVec3T(y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x); } - /** return a unit vector */ - - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 getNormalized() const + /** returns a unit vector */ + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T getNormalized() const { - const float m = magnitudeSquared(); - return m > 0.0f ? *this * PxRecipSqrt(m) : PxVec3(0, 0, 0); + const Type m = magnitudeSquared(); + return m > Type(0.0) ? *this * PxRecipSqrt(m) : PxVec3T(Type(0)); } /** \brief normalizes the vector in place */ - PX_CUDA_CALLABLE PX_FORCE_INLINE float normalize() + PX_CUDA_CALLABLE PX_FORCE_INLINE Type normalize() { - const float m = magnitude(); - if(m > 0.0f) + const Type m = magnitude(); + if(m > Type(0.0)) *this /= m; return m; } @@ -309,12 +306,12 @@ class PxVec3 \brief normalizes the vector in place. Does nothing if vector magnitude is under PX_NORMALIZATION_EPSILON. Returns vector magnitude if >= PX_NORMALIZATION_EPSILON and 0.0f otherwise. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE float normalizeSafe() + PX_CUDA_CALLABLE PX_FORCE_INLINE Type normalizeSafe() { - const float mag = magnitude(); - if(mag < PX_NORMALIZATION_EPSILON) - return 0.0f; - *this *= 1.0f / mag; + const Type mag = magnitude(); + if(mag < PX_NORMALIZATION_EPSILON) // PT: do we need a different epsilon for float & double? + return Type(0.0); + *this *= Type(1.0) / mag; return mag; } @@ -322,34 +319,34 @@ class PxVec3 \brief normalizes the vector in place. Asserts if vector magnitude is under PX_NORMALIZATION_EPSILON. returns vector magnitude. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE float normalizeFast() + PX_CUDA_CALLABLE PX_FORCE_INLINE Type normalizeFast() { - const float mag = magnitude(); - PX_SHARED_ASSERT(mag >= PX_NORMALIZATION_EPSILON); - *this *= 1.0f / mag; + const Type mag = magnitude(); + PX_ASSERT(mag >= PX_NORMALIZATION_EPSILON); // PT: do we need a different epsilon for float & double? + *this *= Type(1.0) / mag; return mag; } /** \brief a[i] * b[i], for all i. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 multiply(const PxVec3& a) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T multiply(const PxVec3T& a) const { - return PxVec3(x * a.x, y * a.y, z * a.z); + return PxVec3T(x * a.x, y * a.y, z * a.z); } /** \brief element-wise minimum */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 minimum(const PxVec3& v) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T minimum(const PxVec3T& v) const { - return PxVec3(PxMin(x, v.x), PxMin(y, v.y), PxMin(z, v.z)); + return PxVec3T(PxMin(x, v.x), PxMin(y, v.y), PxMin(z, v.z)); } /** \brief returns MIN(x, y, z); */ - PX_CUDA_CALLABLE PX_FORCE_INLINE float minElement() const + PX_CUDA_CALLABLE PX_FORCE_INLINE Type minElement() const { return PxMin(x, PxMin(y, z)); } @@ -357,15 +354,15 @@ class PxVec3 /** \brief element-wise maximum */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 maximum(const PxVec3& v) const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T maximum(const PxVec3T& v) const { - return PxVec3(PxMax(x, v.x), PxMax(y, v.y), PxMax(z, v.z)); + return PxVec3T(PxMax(x, v.x), PxMax(y, v.y), PxMax(z, v.z)); } /** \brief returns MAX(x, y, z); */ - PX_CUDA_CALLABLE PX_FORCE_INLINE float maxElement() const + PX_CUDA_CALLABLE PX_FORCE_INLINE Type maxElement() const { return PxMax(x, PxMax(y, z)); } @@ -373,22 +370,54 @@ class PxVec3 /** \brief returns absolute values of components; */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3 abs() const + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3T abs() const { - return PxVec3(PxAbs(x), PxAbs(y), PxAbs(z)); + return PxVec3T(PxAbs(x), PxAbs(y), PxAbs(z)); } - float x, y, z; + Type x, y, z; }; -PX_CUDA_CALLABLE static PX_FORCE_INLINE PxVec3 operator*(float f, const PxVec3& v) +template +PX_CUDA_CALLABLE static PX_FORCE_INLINE PxVec3T operator*(Type f, const PxVec3T& v) { - return PxVec3(f * v.x, f * v.y, f * v.z); + return PxVec3T(f * v.x, f * v.y, f * v.z); } +typedef PxVec3T PxVec3; +typedef PxVec3T PxVec3d; + +//! A padded version of PxVec3, to safely load its data using SIMD +class PxVec3Padded : public PxVec3 +{ + public: + PX_FORCE_INLINE PxVec3Padded() {} + PX_FORCE_INLINE ~PxVec3Padded() {} + PX_FORCE_INLINE PxVec3Padded(const PxVec3& p) : PxVec3(p) {} + PX_FORCE_INLINE PxVec3Padded(float f) : PxVec3(f) {} + + /** + \brief Assignment operator. + To fix this: + error: definition of implicit copy assignment operator for 'PxVec3Padded' is deprecated because it has a user-declared destructor [-Werror,-Wdeprecated] + */ + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec3Padded& operator=(const PxVec3Padded& p) + { + x = p.x; + y = p.y; + z = p.z; + return *this; + } + + PxU32 padding; +}; +PX_COMPILE_TIME_ASSERT(sizeof(PxVec3Padded) == 16); + +typedef PxVec3Padded PxVec3p; + #if !PX_DOXYGEN } // namespace physx #endif /** @} */ -#endif // #ifndef PXFOUNDATION_PXVEC3_H +#endif diff --git a/Source/ThirdParty/PhysX/foundation/PxVec4.h b/Source/ThirdParty/PhysX/foundation/PxVec4.h index 711e5310e..f467a2f44 100644 --- a/Source/ThirdParty/PhysX/foundation/PxVec4.h +++ b/Source/ThirdParty/PhysX/foundation/PxVec4.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,18 +22,18 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXVEC4_H -#define PXFOUNDATION_PXVEC4_H +#ifndef PX_VEC4_H +#define PX_VEC4_H + /** \addtogroup foundation @{ */ #include "foundation/PxMath.h" #include "foundation/PxVec3.h" -#include "foundation/PxSharedAssert.h" /** \brief 4 Element vector class. @@ -46,22 +45,22 @@ namespace physx { #endif -class PxVec4 +template +class PxVec4T { public: /** \brief default constructor leaves data uninitialized. */ - PX_CUDA_CALLABLE PX_INLINE PxVec4() + PX_CUDA_CALLABLE PX_INLINE PxVec4T() { } /** \brief zero constructor. */ - PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec4(PxZERO r) : x(0.0f), y(0.0f), z(0.0f), w(0.0f) + PX_CUDA_CALLABLE PX_FORCE_INLINE PxVec4T(PxZERO) : x(Type(0.0)), y(Type(0.0)), z(Type(0.0)), w(Type(0.0)) { - PX_UNUSED(r); } /** @@ -71,7 +70,7 @@ class PxVec4 \param[in] a Value to assign to elements. */ - explicit PX_CUDA_CALLABLE PX_INLINE PxVec4(float a) : x(a), y(a), z(a), w(a) + explicit PX_CUDA_CALLABLE PX_INLINE PxVec4T(Type a) : x(a), y(a), z(a), w(a) { } @@ -83,7 +82,7 @@ class PxVec4 \param[in] nz Value to initialize Z component. \param[in] nw Value to initialize W component. */ - PX_CUDA_CALLABLE PX_INLINE PxVec4(float nx, float ny, float nz, float nw) : x(nx), y(ny), z(nz), w(nw) + PX_CUDA_CALLABLE PX_INLINE PxVec4T(Type nx, Type ny, Type nz, Type nw) : x(nx), y(ny), z(nz), w(nw) { } @@ -93,7 +92,7 @@ class PxVec4 \param[in] v Value to initialize the X, Y, and Z components. \param[in] nw Value to initialize W component. */ - PX_CUDA_CALLABLE PX_INLINE PxVec4(const PxVec3& v, float nw) : x(v.x), y(v.y), z(v.z), w(nw) + PX_CUDA_CALLABLE PX_INLINE PxVec4T(const PxVec3T& v, Type nw) : x(v.x), y(v.y), z(v.z), w(nw) { } @@ -102,14 +101,14 @@ class PxVec4 \param[in] v Value to initialize with. */ - explicit PX_CUDA_CALLABLE PX_INLINE PxVec4(const float v[]) : x(v[0]), y(v[1]), z(v[2]), w(v[3]) + explicit PX_CUDA_CALLABLE PX_INLINE PxVec4T(const Type v[]) : x(v[0]), y(v[1]), z(v[2]), w(v[3]) { } /** \brief Copy ctor. */ - PX_CUDA_CALLABLE PX_INLINE PxVec4(const PxVec4& v) : x(v.x), y(v.y), z(v.z), w(v.w) + PX_CUDA_CALLABLE PX_INLINE PxVec4T(const PxVec4T& v) : x(v.x), y(v.y), z(v.z), w(v.w) { } @@ -118,7 +117,7 @@ class PxVec4 /** \brief Assignment operator */ - PX_CUDA_CALLABLE PX_INLINE PxVec4& operator=(const PxVec4& p) + PX_CUDA_CALLABLE PX_INLINE PxVec4T& operator=(const PxVec4T& p) { x = p.x; y = p.y; @@ -130,27 +129,25 @@ class PxVec4 /** \brief element access */ - PX_CUDA_CALLABLE PX_INLINE float& operator[](unsigned int index) + PX_CUDA_CALLABLE PX_INLINE Type& operator[](unsigned int index) { - PX_SHARED_ASSERT(index <= 3); - - return reinterpret_cast(this)[index]; + PX_ASSERT(index <= 3); + return reinterpret_cast(this)[index]; } /** \brief element access */ - PX_CUDA_CALLABLE PX_INLINE const float& operator[](unsigned int index) const + PX_CUDA_CALLABLE PX_INLINE const Type& operator[](unsigned int index) const { - PX_SHARED_ASSERT(index <= 3); - - return reinterpret_cast(this)[index]; + PX_ASSERT(index <= 3); + return reinterpret_cast(this)[index]; } /** \brief returns true if the two vectors are exactly equal. */ - PX_CUDA_CALLABLE PX_INLINE bool operator==(const PxVec4& v) const + PX_CUDA_CALLABLE PX_INLINE bool operator==(const PxVec4T& v) const { return x == v.x && y == v.y && z == v.z && w == v.w; } @@ -158,7 +155,7 @@ class PxVec4 /** \brief returns true if the two vectors are not exactly equal. */ - PX_CUDA_CALLABLE PX_INLINE bool operator!=(const PxVec4& v) const + PX_CUDA_CALLABLE PX_INLINE bool operator!=(const PxVec4T& v) const { return x != v.x || y != v.y || z != v.z || w != v.w; } @@ -168,7 +165,7 @@ class PxVec4 */ PX_CUDA_CALLABLE PX_INLINE bool isZero() const { - return x == 0 && y == 0 && z == 0 && w == 0; + return x == Type(0) && y == Type(0) && z == Type(0) && w == Type(0); } /** @@ -184,8 +181,8 @@ class PxVec4 */ PX_CUDA_CALLABLE PX_INLINE bool isNormalized() const { - const float unitTolerance = 1e-4f; - return isFinite() && PxAbs(magnitude() - 1) < unitTolerance; + const Type unitTolerance = Type(1e-4); + return isFinite() && PxAbs(magnitude() - Type(1.0)) < unitTolerance; } /** @@ -193,7 +190,7 @@ class PxVec4 Avoids calling PxSqrt()! */ - PX_CUDA_CALLABLE PX_INLINE float magnitudeSquared() const + PX_CUDA_CALLABLE PX_INLINE Type magnitudeSquared() const { return x * x + y * y + z * z + w * w; } @@ -201,7 +198,7 @@ class PxVec4 /** \brief returns the magnitude */ - PX_CUDA_CALLABLE PX_INLINE float magnitude() const + PX_CUDA_CALLABLE PX_INLINE Type magnitude() const { return PxSqrt(magnitudeSquared()); } @@ -209,49 +206,48 @@ class PxVec4 /** \brief negation */ - PX_CUDA_CALLABLE PX_INLINE PxVec4 operator-() const + PX_CUDA_CALLABLE PX_INLINE PxVec4T operator-() const { - return PxVec4(-x, -y, -z, -w); + return PxVec4T(-x, -y, -z, -w); } /** \brief vector addition */ - PX_CUDA_CALLABLE PX_INLINE PxVec4 operator+(const PxVec4& v) const + PX_CUDA_CALLABLE PX_INLINE PxVec4T operator+(const PxVec4T& v) const { - return PxVec4(x + v.x, y + v.y, z + v.z, w + v.w); + return PxVec4T(x + v.x, y + v.y, z + v.z, w + v.w); } /** \brief vector difference */ - PX_CUDA_CALLABLE PX_INLINE PxVec4 operator-(const PxVec4& v) const + PX_CUDA_CALLABLE PX_INLINE PxVec4T operator-(const PxVec4T& v) const { - return PxVec4(x - v.x, y - v.y, z - v.z, w - v.w); + return PxVec4T(x - v.x, y - v.y, z - v.z, w - v.w); } /** \brief scalar post-multiplication */ - - PX_CUDA_CALLABLE PX_INLINE PxVec4 operator*(float f) const + PX_CUDA_CALLABLE PX_INLINE PxVec4T operator*(Type f) const { - return PxVec4(x * f, y * f, z * f, w * f); + return PxVec4T(x * f, y * f, z * f, w * f); } /** \brief scalar division */ - PX_CUDA_CALLABLE PX_INLINE PxVec4 operator/(float f) const + PX_CUDA_CALLABLE PX_INLINE PxVec4T operator/(Type f) const { - f = 1.0f / f; - return PxVec4(x * f, y * f, z * f, w * f); + f = Type(1.0) / f; + return PxVec4T(x * f, y * f, z * f, w * f); } /** \brief vector addition */ - PX_CUDA_CALLABLE PX_INLINE PxVec4& operator+=(const PxVec4& v) + PX_CUDA_CALLABLE PX_INLINE PxVec4T& operator+=(const PxVec4T& v) { x += v.x; y += v.y; @@ -263,7 +259,7 @@ class PxVec4 /** \brief vector difference */ - PX_CUDA_CALLABLE PX_INLINE PxVec4& operator-=(const PxVec4& v) + PX_CUDA_CALLABLE PX_INLINE PxVec4T& operator-=(const PxVec4T& v) { x -= v.x; y -= v.y; @@ -275,7 +271,7 @@ class PxVec4 /** \brief scalar multiplication */ - PX_CUDA_CALLABLE PX_INLINE PxVec4& operator*=(float f) + PX_CUDA_CALLABLE PX_INLINE PxVec4T& operator*=(Type f) { x *= f; y *= f; @@ -286,9 +282,9 @@ class PxVec4 /** \brief scalar division */ - PX_CUDA_CALLABLE PX_INLINE PxVec4& operator/=(float f) + PX_CUDA_CALLABLE PX_INLINE PxVec4T& operator/=(Type f) { - f = 1.0f / f; + f = Type(1.0) / f; x *= f; y *= f; z *= f; @@ -299,26 +295,25 @@ class PxVec4 /** \brief returns the scalar product of this and other. */ - PX_CUDA_CALLABLE PX_INLINE float dot(const PxVec4& v) const + PX_CUDA_CALLABLE PX_INLINE Type dot(const PxVec4T& v) const { return x * v.x + y * v.y + z * v.z + w * v.w; } - /** return a unit vector */ - - PX_CUDA_CALLABLE PX_INLINE PxVec4 getNormalized() const + /** returns a unit vector */ + PX_CUDA_CALLABLE PX_INLINE PxVec4T getNormalized() const { - float m = magnitudeSquared(); - return m > 0.0f ? *this * PxRecipSqrt(m) : PxVec4(0, 0, 0, 0); + const Type m = magnitudeSquared(); + return m > Type(0.0) ? *this * PxRecipSqrt(m) : PxVec4T(Type(0)); } /** \brief normalizes the vector in place */ - PX_CUDA_CALLABLE PX_INLINE float normalize() + PX_CUDA_CALLABLE PX_INLINE Type normalize() { - float m = magnitude(); - if(m > 0.0f) + const Type m = magnitude(); + if(m > Type(0.0)) *this /= m; return m; } @@ -326,15 +321,15 @@ class PxVec4 /** \brief a[i] * b[i], for all i. */ - PX_CUDA_CALLABLE PX_INLINE PxVec4 multiply(const PxVec4& a) const + PX_CUDA_CALLABLE PX_INLINE PxVec4T multiply(const PxVec4T& a) const { - return PxVec4(x * a.x, y * a.y, z * a.z, w * a.w); + return PxVec4T(x * a.x, y * a.y, z * a.z, w * a.w); } /** \brief element-wise minimum */ - PX_CUDA_CALLABLE PX_INLINE PxVec4 minimum(const PxVec4& v) const + PX_CUDA_CALLABLE PX_INLINE PxVec4T minimum(const PxVec4T& v) const { return PxVec4(PxMin(x, v.x), PxMin(y, v.y), PxMin(z, v.z), PxMin(w, v.w)); } @@ -342,35 +337,32 @@ class PxVec4 /** \brief element-wise maximum */ - PX_CUDA_CALLABLE PX_INLINE PxVec4 maximum(const PxVec4& v) const + PX_CUDA_CALLABLE PX_INLINE PxVec4T maximum(const PxVec4T& v) const { - return PxVec4(PxMax(x, v.x), PxMax(y, v.y), PxMax(z, v.z), PxMax(w, v.w)); + return PxVec4T(PxMax(x, v.x), PxMax(y, v.y), PxMax(z, v.z), PxMax(w, v.w)); } - PX_CUDA_CALLABLE PX_INLINE PxVec3 getXYZ() const + PX_CUDA_CALLABLE PX_INLINE PxVec3T getXYZ() const { - return PxVec3(x, y, z); + return PxVec3T(x, y, z); } - /** - \brief set vector elements to zero - */ - PX_CUDA_CALLABLE PX_INLINE void setZero() - { - x = y = z = w = 0.0f; - } - - float x, y, z, w; + Type x, y, z, w; }; -PX_CUDA_CALLABLE static PX_INLINE PxVec4 operator*(float f, const PxVec4& v) +template +PX_CUDA_CALLABLE static PX_INLINE PxVec4T operator*(Type f, const PxVec4T& v) { - return PxVec4(f * v.x, f * v.y, f * v.z, f * v.w); + return PxVec4T(f * v.x, f * v.y, f * v.z, f * v.w); } +typedef PxVec4T PxVec4; +typedef PxVec4T PxVec4d; + #if !PX_DOXYGEN } // namespace physx #endif /** @} */ -#endif // #ifndef PXFOUNDATION_PXVEC4_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxVecMath.h b/Source/ThirdParty/PhysX/foundation/PxVecMath.h new file mode 100644 index 000000000..729729e6b --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxVecMath.h @@ -0,0 +1,1340 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_VEC_MATH_H +#define PX_VEC_MATH_H + +#include "foundation/Px.h" +#include "foundation/PxIntrinsics.h" +#include "foundation/PxVec3.h" +#include "foundation/PxVec4.h" +#include "foundation/PxMat33.h" +#include "foundation/PxUnionCast.h" + +// We can opt to use the scalar version of vectorised functions. +// This can catch type safety issues and might even work out more optimal on pc. +// It will also be useful for benchmarking and testing. +// NEVER submit with vector intrinsics deactivated without good reason. +// AM: deactivating SIMD for debug win64 just so autobuild will also exercise +// non-SIMD path, until a dedicated non-SIMD platform sich as Arm comes online. +// TODO: dima: reference all platforms with SIMD support here, +// all unknown/experimental cases should better default to NO SIMD. + +// enable/disable SIMD +#if !defined(PX_SIMD_DISABLED) +#if PX_INTEL_FAMILY && (!defined(__EMSCRIPTEN__) || defined(__SSE2__)) + #define COMPILE_VECTOR_INTRINSICS 1 +#elif PX_ANDROID && PX_NEON + #define COMPILE_VECTOR_INTRINSICS 1 +#elif PX_IOS && PX_NEON + #define COMPILE_VECTOR_INTRINSICS 1 +#elif PX_OSX && PX_NEON + #define COMPILE_VECTOR_INTRINSICS 1 +#elif PX_SWITCH + #define COMPILE_VECTOR_INTRINSICS 1 +#else + #define COMPILE_VECTOR_INTRINSICS 0 +#endif +#else + #define COMPILE_VECTOR_INTRINSICS 0 +#endif + +#if COMPILE_VECTOR_INTRINSICS && PX_INTEL_FAMILY && (PX_UNIX_FAMILY || PX_PS4 || PX_PS5) +// only SSE2 compatible platforms should reach this +#if PX_EMSCRIPTEN + #include +#endif + #include +#endif + +#if COMPILE_VECTOR_INTRINSICS + #include "PxAoS.h" +#else + #include "PxVecMathAoSScalar.h" +#endif + +#if !PX_DOXYGEN +namespace physx +{ +#endif +namespace aos +{ + +// Basic AoS types are +// FloatV - 16-byte aligned representation of float. +// Vec3V - 16-byte aligned representation of PxVec3 stored as (x y z 0). +// Vec4V - 16-byte aligned representation of vector of 4 floats stored as (x y z w). +// BoolV - 16-byte aligned representation of vector of 4 bools stored as (x y z w). +// VecU32V - 16-byte aligned representation of 4 unsigned ints stored as (x y z w). +// VecI32V - 16-byte aligned representation of 4 signed ints stored as (x y z w). +// Mat33V - 16-byte aligned representation of any 3x3 matrix. +// Mat34V - 16-byte aligned representation of transformation matrix (rotation in col1,col2,col3 and translation in +// col4). +// Mat44V - 16-byte aligned representation of any 4x4 matrix. + +////////////////////////////////////////// +// Construct a simd type from a scalar type +////////////////////////////////////////// + +// FloatV +//(f,f,f,f) +PX_FORCE_INLINE FloatV FLoad(const PxF32 f); + +// Vec3V +//(f,f,f,0) +PX_FORCE_INLINE Vec3V V3Load(const PxF32 f); +//(f.x,f.y,f.z,0) +PX_FORCE_INLINE Vec3V V3LoadU(const PxVec3& f); +//(f.x,f.y,f.z,0), f must be 16-byte aligned +PX_FORCE_INLINE Vec3V V3LoadA(const PxVec3& f); +//(f.x,f.y,f.z,w_undefined), f must be 16-byte aligned +PX_FORCE_INLINE Vec3V V3LoadUnsafeA(const PxVec3& f); +//(f.x,f.y,f.z,0) +PX_FORCE_INLINE Vec3V V3LoadU(const PxF32* f); +//(f.x,f.y,f.z,0), f must be 16-byte aligned +PX_FORCE_INLINE Vec3V V3LoadA(const PxF32* f); + +// Vec4V +//(f,f,f,f) +PX_FORCE_INLINE Vec4V V4Load(const PxF32 f); +//(f[0],f[1],f[2],f[3]) +PX_FORCE_INLINE Vec4V V4LoadU(const PxF32* const f); +//(f[0],f[1],f[2],f[3]), f must be 16-byte aligned +PX_FORCE_INLINE Vec4V V4LoadA(const PxF32* const f); +//(x,y,z,w) +PX_FORCE_INLINE Vec4V V4LoadXYZW(const PxF32& x, const PxF32& y, const PxF32& z, const PxF32& w); + +// BoolV +//(f,f,f,f) +PX_FORCE_INLINE BoolV BLoad(const bool f); +//(f[0],f[1],f[2],f[3]) +PX_FORCE_INLINE BoolV BLoad(const bool* const f); + +// VecU32V +//(f,f,f,f) +PX_FORCE_INLINE VecU32V U4Load(const PxU32 f); +//(f[0],f[1],f[2],f[3]) +PX_FORCE_INLINE VecU32V U4LoadU(const PxU32* f); +//(f[0],f[1],f[2],f[3]), f must be 16-byte aligned +PX_FORCE_INLINE VecU32V U4LoadA(const PxU32* f); +//((U32)x, (U32)y, (U32)z, (U32)w) +PX_FORCE_INLINE VecU32V U4LoadXYZW(PxU32 x, PxU32 y, PxU32 z, PxU32 w); + +// VecI32V +//(i,i,i,i) +PX_FORCE_INLINE VecI32V I4Load(const PxI32 i); +//(i,i,i,i) +PX_FORCE_INLINE VecI32V I4LoadU(const PxI32* i); +//(i,i,i,i) +PX_FORCE_INLINE VecI32V I4LoadA(const PxI32* i); + +// QuatV +//(x = v[0], y=v[1], z=v[2], w=v3[3]) and array don't need to aligned +PX_FORCE_INLINE QuatV QuatVLoadU(const PxF32* v); +//(x = v[0], y=v[1], z=v[2], w=v3[3]) and array need to aligned, fast load +PX_FORCE_INLINE QuatV QuatVLoadA(const PxF32* v); +//(x, y, z, w) +PX_FORCE_INLINE QuatV QuatVLoadXYZW(const PxF32 x, const PxF32 y, const PxF32 z, const PxF32 w); + +// not added to public api +Vec4V Vec4V_From_PxVec3_WUndefined(const PxVec3& v); + +/////////////////////////////////////////////////// +// Construct a simd type from a different simd type +/////////////////////////////////////////////////// + +// Vec3V +//(v.x,v.y,v.z,0) +PX_FORCE_INLINE Vec3V Vec3V_From_Vec4V(Vec4V v); +//(v.x,v.y,v.z,undefined) - be very careful with w!=0 because many functions require w==0 for correct operation eg V3Dot, V3Length, V3Cross etc etc. +PX_FORCE_INLINE Vec3V Vec3V_From_Vec4V_WUndefined(const Vec4V v); + +// Vec4V +//(f.x,f.y,f.z,f.w) +PX_FORCE_INLINE Vec4V Vec4V_From_Vec3V(Vec3V f); +//((PxF32)f.x, (PxF32)f.y, (PxF32)f.z, (PxF32)f.w) +PX_FORCE_INLINE Vec4V Vec4V_From_VecU32V(VecU32V a); +//((PxF32)f.x, (PxF32)f.y, (PxF32)f.z, (PxF32)f.w) +PX_FORCE_INLINE Vec4V Vec4V_From_VecI32V(VecI32V a); +//(*(reinterpret_cast(&f.x), (reinterpret_cast(&f.y), (reinterpret_cast(&f.z), +//(reinterpret_cast(&f.w)) +PX_FORCE_INLINE Vec4V Vec4V_ReinterpretFrom_VecU32V(VecU32V a); +//(*(reinterpret_cast(&f.x), (reinterpret_cast(&f.y), (reinterpret_cast(&f.z), +//(reinterpret_cast(&f.w)) +PX_FORCE_INLINE Vec4V Vec4V_ReinterpretFrom_VecI32V(VecI32V a); + +// VecU32V +//(*(reinterpret_cast(&f.x), (reinterpret_cast(&f.y), (reinterpret_cast(&f.z), +//(reinterpret_cast(&f.w)) +PX_FORCE_INLINE VecU32V VecU32V_ReinterpretFrom_Vec4V(Vec4V a); +//(b[0], b[1], b[2], b[3]) +PX_FORCE_INLINE VecU32V VecU32V_From_BoolV(const BoolVArg b); + +// VecI32V +//(*(reinterpret_cast(&f.x), (reinterpret_cast(&f.y), (reinterpret_cast(&f.z), +//(reinterpret_cast(&f.w)) +PX_FORCE_INLINE VecI32V VecI32V_ReinterpretFrom_Vec4V(Vec4V a); +//((I32)a.x, (I32)a.y, (I32)a.z, (I32)a.w) +PX_FORCE_INLINE VecI32V VecI32V_From_Vec4V(Vec4V a); +//((I32)b.x, (I32)b.y, (I32)b.z, (I32)b.w) +PX_FORCE_INLINE VecI32V VecI32V_From_BoolV(const BoolVArg b); + +/////////////////////////////////////////////////// +// Convert from a simd type back to a scalar type +/////////////////////////////////////////////////// + +// FloatV +// a.x +PX_FORCE_INLINE void FStore(const FloatV a, PxF32* PX_RESTRICT f); + +// Vec3V +//(a.x,a.y,a.z) +PX_FORCE_INLINE void V3StoreA(const Vec3V a, PxVec3& f); +//(a.x,a.y,a.z) +PX_FORCE_INLINE void V3StoreU(const Vec3V a, PxVec3& f); + +// Vec4V +PX_FORCE_INLINE void V4StoreA(const Vec4V a, PxF32* f); +PX_FORCE_INLINE void V4StoreU(const Vec4V a, PxF32* f); + +// BoolV +PX_FORCE_INLINE void BStoreA(const BoolV b, PxU32* f); + +// VecU32V +PX_FORCE_INLINE void U4StoreA(const VecU32V uv, PxU32* u); + +// VecI32V +PX_FORCE_INLINE void I4StoreA(const VecI32V iv, PxI32* i); + +////////////////////////////////////////////////////////////////// +// Test that simd types have elements in the floating point range +////////////////////////////////////////////////////////////////// + +// check for each component is valid ie in floating point range +PX_FORCE_INLINE bool isFiniteFloatV(const FloatV a); +// check for each component is valid ie in floating point range +PX_FORCE_INLINE bool isFiniteVec3V(const Vec3V a); +// check for each component is valid ie in floating point range +PX_FORCE_INLINE bool isFiniteVec4V(const Vec4V a); + +// Check that w-component is zero. +PX_FORCE_INLINE bool isValidVec3V(const Vec3V a); + +////////////////////////////////////////////////////////////////// +// Tests that all elements of two 16-byte types are completely equivalent. +// Use these tests for unit testing and asserts only. +////////////////////////////////////////////////////////////////// + +namespace vecMathTests +{ +PX_FORCE_INLINE Vec3V getInvalidVec3V(); +PX_FORCE_INLINE bool allElementsEqualFloatV(const FloatV a, const FloatV b); +PX_FORCE_INLINE bool allElementsEqualVec3V(const Vec3V a, const Vec3V b); +PX_FORCE_INLINE bool allElementsEqualVec4V(const Vec4V a, const Vec4V b); +PX_FORCE_INLINE bool allElementsEqualBoolV(const BoolV a, const BoolV b); +PX_FORCE_INLINE bool allElementsEqualVecU32V(const VecU32V a, const VecU32V b); +PX_FORCE_INLINE bool allElementsEqualVecI32V(const VecI32V a, const VecI32V b); + +PX_FORCE_INLINE bool allElementsEqualMat33V(const Mat33V& a, const Mat33V& b) +{ + return (allElementsEqualVec3V(a.col0, b.col0) && allElementsEqualVec3V(a.col1, b.col1) && + allElementsEqualVec3V(a.col2, b.col2)); +} +PX_FORCE_INLINE bool allElementsEqualMat34V(const Mat34V& a, const Mat34V& b) +{ + return (allElementsEqualVec3V(a.col0, b.col0) && allElementsEqualVec3V(a.col1, b.col1) && + allElementsEqualVec3V(a.col2, b.col2) && allElementsEqualVec3V(a.col3, b.col3)); +} +PX_FORCE_INLINE bool allElementsEqualMat44V(const Mat44V& a, const Mat44V& b) +{ + return (allElementsEqualVec4V(a.col0, b.col0) && allElementsEqualVec4V(a.col1, b.col1) && + allElementsEqualVec4V(a.col2, b.col2) && allElementsEqualVec4V(a.col3, b.col3)); +} + +PX_FORCE_INLINE bool allElementsNearEqualFloatV(const FloatV a, const FloatV b); +PX_FORCE_INLINE bool allElementsNearEqualVec3V(const Vec3V a, const Vec3V b); +PX_FORCE_INLINE bool allElementsNearEqualVec4V(const Vec4V a, const Vec4V b); +PX_FORCE_INLINE bool allElementsNearEqualMat33V(const Mat33V& a, const Mat33V& b) +{ + return (allElementsNearEqualVec3V(a.col0, b.col0) && allElementsNearEqualVec3V(a.col1, b.col1) && + allElementsNearEqualVec3V(a.col2, b.col2)); +} +PX_FORCE_INLINE bool allElementsNearEqualMat34V(const Mat34V& a, const Mat34V& b) +{ + return (allElementsNearEqualVec3V(a.col0, b.col0) && allElementsNearEqualVec3V(a.col1, b.col1) && + allElementsNearEqualVec3V(a.col2, b.col2) && allElementsNearEqualVec3V(a.col3, b.col3)); +} +PX_FORCE_INLINE bool allElementsNearEqualMat44V(const Mat44V& a, const Mat44V& b) +{ + return (allElementsNearEqualVec4V(a.col0, b.col0) && allElementsNearEqualVec4V(a.col1, b.col1) && + allElementsNearEqualVec4V(a.col2, b.col2) && allElementsNearEqualVec4V(a.col3, b.col3)); +} +} + +////////////////////////////////////////////////////////////////// +// Math operations on FloatV +////////////////////////////////////////////////////////////////// + +//(0,0,0,0) +PX_FORCE_INLINE FloatV FZero(); +//(1,1,1,1) +PX_FORCE_INLINE FloatV FOne(); +//(0.5,0.5,0.5,0.5) +PX_FORCE_INLINE FloatV FHalf(); +//(PX_EPS_REAL,PX_EPS_REAL,PX_EPS_REAL,PX_EPS_REAL) +PX_FORCE_INLINE FloatV FEps(); +//! @cond +//(PX_MAX_REAL, PX_MAX_REAL, PX_MAX_REAL PX_MAX_REAL) +PX_FORCE_INLINE FloatV FMax(); +//! @endcond +//(-PX_MAX_REAL, -PX_MAX_REAL, -PX_MAX_REAL -PX_MAX_REAL) +PX_FORCE_INLINE FloatV FNegMax(); +//(1e-6f, 1e-6f, 1e-6f, 1e-6f) +PX_FORCE_INLINE FloatV FEps6(); +//((PxF32*)&1, (PxF32*)&1, (PxF32*)&1, (PxF32*)&1) + +//-f (per component) +PX_FORCE_INLINE FloatV FNeg(const FloatV f); +// a+b (per component) +PX_FORCE_INLINE FloatV FAdd(const FloatV a, const FloatV b); +// a-b (per component) +PX_FORCE_INLINE FloatV FSub(const FloatV a, const FloatV b); +// a*b (per component) +PX_FORCE_INLINE FloatV FMul(const FloatV a, const FloatV b); +// a/b (per component) +PX_FORCE_INLINE FloatV FDiv(const FloatV a, const FloatV b); +// a/b (per component) +PX_FORCE_INLINE FloatV FDivFast(const FloatV a, const FloatV b); +// 1.0f/a +PX_FORCE_INLINE FloatV FRecip(const FloatV a); +// 1.0f/a +PX_FORCE_INLINE FloatV FRecipFast(const FloatV a); +// 1.0f/sqrt(a) +PX_FORCE_INLINE FloatV FRsqrt(const FloatV a); +// 1.0f/sqrt(a) +PX_FORCE_INLINE FloatV FRsqrtFast(const FloatV a); +// sqrt(a) +PX_FORCE_INLINE FloatV FSqrt(const FloatV a); +// a*b+c +PX_FORCE_INLINE FloatV FScaleAdd(const FloatV a, const FloatV b, const FloatV c); +// c-a*b +PX_FORCE_INLINE FloatV FNegScaleSub(const FloatV a, const FloatV b, const FloatV c); +// fabs(a) +PX_FORCE_INLINE FloatV FAbs(const FloatV a); +// c ? a : b (per component) +PX_FORCE_INLINE FloatV FSel(const BoolV c, const FloatV a, const FloatV b); +// a>b (per component) +PX_FORCE_INLINE BoolV FIsGrtr(const FloatV a, const FloatV b); +// a>=b (per component) +PX_FORCE_INLINE BoolV FIsGrtrOrEq(const FloatV a, const FloatV b); +// a==b (per component) +PX_FORCE_INLINE BoolV FIsEq(const FloatV a, const FloatV b); +// Max(a,b) (per component) +PX_FORCE_INLINE FloatV FMax(const FloatV a, const FloatV b); +// Min(a,b) (per component) +PX_FORCE_INLINE FloatV FMin(const FloatV a, const FloatV b); +// Clamp(a,b) (per component) +PX_FORCE_INLINE FloatV FClamp(const FloatV a, const FloatV minV, const FloatV maxV); + +// a.x>b.x +PX_FORCE_INLINE PxU32 FAllGrtr(const FloatV a, const FloatV b); +// a.x>=b.x +PX_FORCE_INLINE PxU32 FAllGrtrOrEq(const FloatV a, const FloatV b); +// a.x==b.x +PX_FORCE_INLINE PxU32 FAllEq(const FloatV a, const FloatV b); +// amax +PX_FORCE_INLINE PxU32 FOutOfBounds(const FloatV a, const FloatV min, const FloatV max); +// a>=min && a<=max +PX_FORCE_INLINE PxU32 FInBounds(const FloatV a, const FloatV min, const FloatV max); +// a<-bounds || a>bounds +PX_FORCE_INLINE PxU32 FOutOfBounds(const FloatV a, const FloatV bounds); +// a>=-bounds && a<=bounds +PX_FORCE_INLINE PxU32 FInBounds(const FloatV a, const FloatV bounds); + +// round float a to the near int +PX_FORCE_INLINE FloatV FRound(const FloatV a); +// calculate the sin of float a +PX_FORCE_INLINE FloatV FSin(const FloatV a); +// calculate the cos of float b +PX_FORCE_INLINE FloatV FCos(const FloatV a); + +////////////////////////////////////////////////////////////////// +// Math operations on Vec3V +////////////////////////////////////////////////////////////////// + +//(f,f,f,f) +PX_FORCE_INLINE Vec3V V3Splat(const FloatV f); + +//(x,y,z) +PX_FORCE_INLINE Vec3V V3Merge(const FloatVArg x, const FloatVArg y, const FloatVArg z); + +//(1,0,0,0) +PX_FORCE_INLINE Vec3V V3UnitX(); +//(0,1,0,0) +PX_FORCE_INLINE Vec3V V3UnitY(); +//(0,0,1,0) +PX_FORCE_INLINE Vec3V V3UnitZ(); + +//(f.x,f.x,f.x,f.x) +PX_FORCE_INLINE FloatV V3GetX(const Vec3V f); +//(f.y,f.y,f.y,f.y) +PX_FORCE_INLINE FloatV V3GetY(const Vec3V f); +//(f.z,f.z,f.z,f.z) +PX_FORCE_INLINE FloatV V3GetZ(const Vec3V f); + +//(f,v.y,v.z,v.w) +PX_FORCE_INLINE Vec3V V3SetX(const Vec3V v, const FloatV f); +//(v.x,f,v.z,v.w) +PX_FORCE_INLINE Vec3V V3SetY(const Vec3V v, const FloatV f); +//(v.x,v.y,f,v.w) +PX_FORCE_INLINE Vec3V V3SetZ(const Vec3V v, const FloatV f); + +// v.x=f +PX_FORCE_INLINE void V3WriteX(Vec3V& v, const PxF32 f); +// v.y=f +PX_FORCE_INLINE void V3WriteY(Vec3V& v, const PxF32 f); +// v.z=f +PX_FORCE_INLINE void V3WriteZ(Vec3V& v, const PxF32 f); +// v.x=f.x, v.y=f.y, v.z=f.z +PX_FORCE_INLINE void V3WriteXYZ(Vec3V& v, const PxVec3& f); +// return v.x +PX_FORCE_INLINE PxF32 V3ReadX(const Vec3V& v); +// return v.y +PX_FORCE_INLINE PxF32 V3ReadY(const Vec3V& v); +// return v.y +PX_FORCE_INLINE PxF32 V3ReadZ(const Vec3V& v); +// return (v.x,v.y,v.z) +PX_FORCE_INLINE const PxVec3& V3ReadXYZ(const Vec3V& v); + +//(a.x, b.x, c.x) +PX_FORCE_INLINE Vec3V V3ColX(const Vec3V a, const Vec3V b, const Vec3V c); +//(a.y, b.y, c.y) +PX_FORCE_INLINE Vec3V V3ColY(const Vec3V a, const Vec3V b, const Vec3V c); +//(a.z, b.z, c.z) +PX_FORCE_INLINE Vec3V V3ColZ(const Vec3V a, const Vec3V b, const Vec3V c); + +//(0,0,0,0) +PX_FORCE_INLINE Vec3V V3Zero(); +//(1,1,1,1) +PX_FORCE_INLINE Vec3V V3One(); +//(PX_EPS_REAL,PX_EPS_REAL,PX_EPS_REAL,PX_EPS_REAL) +PX_FORCE_INLINE Vec3V V3Eps(); +//-c (per component) +PX_FORCE_INLINE Vec3V V3Neg(const Vec3V c); +// a+b (per component) +PX_FORCE_INLINE Vec3V V3Add(const Vec3V a, const Vec3V b); +// a-b (per component) +PX_FORCE_INLINE Vec3V V3Sub(const Vec3V a, const Vec3V b); +// a*b (per component) +PX_FORCE_INLINE Vec3V V3Scale(const Vec3V a, const FloatV b); +// a*b (per component) +PX_FORCE_INLINE Vec3V V3Mul(const Vec3V a, const Vec3V b); +// a/b (per component) +PX_FORCE_INLINE Vec3V V3ScaleInv(const Vec3V a, const FloatV b); +// a/b (per component) +PX_FORCE_INLINE Vec3V V3Div(const Vec3V a, const Vec3V b); +// a/b (per component) +PX_FORCE_INLINE Vec3V V3ScaleInvFast(const Vec3V a, const FloatV b); +// a/b (per component) +PX_FORCE_INLINE Vec3V V3DivFast(const Vec3V a, const Vec3V b); +// 1.0f/a +PX_FORCE_INLINE Vec3V V3Recip(const Vec3V a); +// 1.0f/a +PX_FORCE_INLINE Vec3V V3RecipFast(const Vec3V a); +// 1.0f/sqrt(a) +PX_FORCE_INLINE Vec3V V3Rsqrt(const Vec3V a); +// 1.0f/sqrt(a) +PX_FORCE_INLINE Vec3V V3RsqrtFast(const Vec3V a); +// a*b+c +PX_FORCE_INLINE Vec3V V3ScaleAdd(const Vec3V a, const FloatV b, const Vec3V c); +// c-a*b +PX_FORCE_INLINE Vec3V V3NegScaleSub(const Vec3V a, const FloatV b, const Vec3V c); +// a*b+c +PX_FORCE_INLINE Vec3V V3MulAdd(const Vec3V a, const Vec3V b, const Vec3V c); +// c-a*b +PX_FORCE_INLINE Vec3V V3NegMulSub(const Vec3V a, const Vec3V b, const Vec3V c); +// fabs(a) +PX_FORCE_INLINE Vec3V V3Abs(const Vec3V a); + +// a.b +// Note: a.w and b.w must have value zero +PX_FORCE_INLINE FloatV V3Dot(const Vec3V a, const Vec3V b); +// aXb +// Note: a.w and b.w must have value zero +PX_FORCE_INLINE Vec3V V3Cross(const Vec3V a, const Vec3V b); +// |a.a|^1/2 +// Note: a.w must have value zero +PX_FORCE_INLINE FloatV V3Length(const Vec3V a); +// a.a +// Note: a.w must have value zero +PX_FORCE_INLINE FloatV V3LengthSq(const Vec3V a); +// a*|a.a|^-1/2 +// Note: a.w must have value zero +PX_FORCE_INLINE Vec3V V3Normalize(const Vec3V a); +// a.a>0 ? a*|a.a|^-1/2 : (0,0,0,0) +// Note: a.w must have value zero +PX_FORCE_INLINE FloatV V3Length(const Vec3V a); +// a.a>0 ? a*|a.a|^-1/2 : unsafeReturnValue +// Note: a.w must have value zero +PX_FORCE_INLINE Vec3V V3NormalizeSafe(const Vec3V a, const Vec3V unsafeReturnValue); +// a.x + a.y + a.z +// Note: a.w must have value zero +PX_FORCE_INLINE FloatV V3SumElems(const Vec3V a); + +// c ? a : b (per component) +PX_FORCE_INLINE Vec3V V3Sel(const BoolV c, const Vec3V a, const Vec3V b); +// a>b (per component) +PX_FORCE_INLINE BoolV V3IsGrtr(const Vec3V a, const Vec3V b); +// a>=b (per component) +PX_FORCE_INLINE BoolV V3IsGrtrOrEq(const Vec3V a, const Vec3V b); +// a==b (per component) +PX_FORCE_INLINE BoolV V3IsEq(const Vec3V a, const Vec3V b); +// Max(a,b) (per component) +PX_FORCE_INLINE Vec3V V3Max(const Vec3V a, const Vec3V b); +// Min(a,b) (per component) +PX_FORCE_INLINE Vec3V V3Min(const Vec3V a, const Vec3V b); + +// Extract the maximum value from a +// Note: a.w must have value zero +PX_FORCE_INLINE FloatV V3ExtractMax(const Vec3V a); + +// Extract the minimum value from a +// Note: a.w must have value zero +PX_FORCE_INLINE FloatV V3ExtractMin(const Vec3V a); + +// Clamp(a,b) (per component) +PX_FORCE_INLINE Vec3V V3Clamp(const Vec3V a, const Vec3V minV, const Vec3V maxV); + +// Extract the sign for each component +PX_FORCE_INLINE Vec3V V3Sign(const Vec3V a); + +// Test all components. +// (a.x>b.x && a.y>b.y && a.z>b.z) +// Note: a.w and b.w must have value zero +PX_FORCE_INLINE PxU32 V3AllGrtr(const Vec3V a, const Vec3V b); +// (a.x>=b.x && a.y>=b.y && a.z>=b.z) +// Note: a.w and b.w must have value zero +PX_FORCE_INLINE PxU32 V3AllGrtrOrEq(const Vec3V a, const Vec3V b); +// (a.x==b.x && a.y==b.y && a.z==b.z) +// Note: a.w and b.w must have value zero +PX_FORCE_INLINE PxU32 V3AllEq(const Vec3V a, const Vec3V b); +// a.xmax.x || a.y>max.y || a.z>max.z +// Note: a.w and min.w and max.w must have value zero +PX_FORCE_INLINE PxU32 V3OutOfBounds(const Vec3V a, const Vec3V min, const Vec3V max); +// a.x>=min.x && a.y>=min.y && a.z>=min.z && a.x<=max.x && a.y<=max.y && a.z<=max.z +// Note: a.w and min.w and max.w must have value zero +PX_FORCE_INLINE PxU32 V3InBounds(const Vec3V a, const Vec3V min, const Vec3V max); +// a.x<-bounds.x || a.y<=-bounds.y || a.zbounds.x || a.y>bounds.y || a.z>bounds.z +// Note: a.w and bounds.w must have value zero +PX_FORCE_INLINE PxU32 V3OutOfBounds(const Vec3V a, const Vec3V bounds); +// a.x>=-bounds.x && a.y>=-bounds.y && a.z>=-bounds.z && a.x<=bounds.x && a.y<=bounds.y && a.z<=bounds.z +// Note: a.w and bounds.w must have value zero +PX_FORCE_INLINE PxU32 V3InBounds(const Vec3V a, const Vec3V bounds); + +//(floor(a.x + 0.5f), floor(a.y + 0.5f), floor(a.z + 0.5f)) +PX_FORCE_INLINE Vec3V V3Round(const Vec3V a); + +//(sinf(a.x), sinf(a.y), sinf(a.z)) +PX_FORCE_INLINE Vec3V V3Sin(const Vec3V a); +//(cosf(a.x), cosf(a.y), cosf(a.z)) +PX_FORCE_INLINE Vec3V V3Cos(const Vec3V a); + +//(a.y,a.z,a.z) +PX_FORCE_INLINE Vec3V V3PermYZZ(const Vec3V a); +//(a.x,a.y,a.x) +PX_FORCE_INLINE Vec3V V3PermXYX(const Vec3V a); +//(a.y,a.z,a.x) +PX_FORCE_INLINE Vec3V V3PermYZX(const Vec3V a); +//(a.z, a.x, a.y) +PX_FORCE_INLINE Vec3V V3PermZXY(const Vec3V a); +//(a.z,a.z,a.y) +PX_FORCE_INLINE Vec3V V3PermZZY(const Vec3V a); +//(a.y,a.x,a.x) +PX_FORCE_INLINE Vec3V V3PermYXX(const Vec3V a); +//(0, v1.z, v0.y) +PX_FORCE_INLINE Vec3V V3Perm_Zero_1Z_0Y(const Vec3V v0, const Vec3V v1); +//(v0.z, 0, v1.x) +PX_FORCE_INLINE Vec3V V3Perm_0Z_Zero_1X(const Vec3V v0, const Vec3V v1); +//(v1.y, v0.x, 0) +PX_FORCE_INLINE Vec3V V3Perm_1Y_0X_Zero(const Vec3V v0, const Vec3V v1); + +// Transpose 3 Vec3Vs inplace. Sets the w component to zero +// [ x0, y0, z0, w0] [ x1, y1, z1, w1] [ x2, y2, z2, w2] -> [x0 x1 x2 0] [y0 y1 y2 0] [z0 z1 z2 0] +PX_FORCE_INLINE void V3Transpose(Vec3V& col0, Vec3V& col1, Vec3V& col2); + +////////////////////////////////////////////////////////////////// +// Math operations on Vec4V +////////////////////////////////////////////////////////////////// + +//(f,f,f,f) +PX_FORCE_INLINE Vec4V V4Splat(const FloatV f); + +//(f[0],f[1],f[2],f[3]) +PX_FORCE_INLINE Vec4V V4Merge(const FloatV* const f); +//(x,y,z,w) +PX_FORCE_INLINE Vec4V V4Merge(const FloatVArg x, const FloatVArg y, const FloatVArg z, const FloatVArg w); +//(x.w, y.w, z.w, w.w) +PX_FORCE_INLINE Vec4V V4MergeW(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w); +//(x.z, y.z, z.z, w.z) +PX_FORCE_INLINE Vec4V V4MergeZ(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w); +//(x.y, y.y, z.y, w.y) +PX_FORCE_INLINE Vec4V V4MergeY(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w); +//(x.x, y.x, z.x, w.x) +PX_FORCE_INLINE Vec4V V4MergeX(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w); + +//(a.x, b.x, a.y, b.y) +PX_FORCE_INLINE Vec4V V4UnpackXY(const Vec4VArg a, const Vec4VArg b); +//(a.z, b.z, a.w, b.w) +PX_FORCE_INLINE Vec4V V4UnpackZW(const Vec4VArg a, const Vec4VArg b); + +//(1,0,0,0) +PX_FORCE_INLINE Vec4V V4UnitW(); +//(0,1,0,0) +PX_FORCE_INLINE Vec4V V4UnitY(); +//(0,0,1,0) +PX_FORCE_INLINE Vec4V V4UnitZ(); +//(0,0,0,1) +PX_FORCE_INLINE Vec4V V4UnitW(); + +//(f.x,f.x,f.x,f.x) +PX_FORCE_INLINE FloatV V4GetX(const Vec4V f); +//(f.y,f.y,f.y,f.y) +PX_FORCE_INLINE FloatV V4GetY(const Vec4V f); +//(f.z,f.z,f.z,f.z) +PX_FORCE_INLINE FloatV V4GetZ(const Vec4V f); +//(f.w,f.w,f.w,f.w) +PX_FORCE_INLINE FloatV V4GetW(const Vec4V f); + +//(f,v.y,v.z,v.w) +PX_FORCE_INLINE Vec4V V4SetX(const Vec4V v, const FloatV f); +//(v.x,f,v.z,v.w) +PX_FORCE_INLINE Vec4V V4SetY(const Vec4V v, const FloatV f); +//(v.x,v.y,f,v.w) +PX_FORCE_INLINE Vec4V V4SetZ(const Vec4V v, const FloatV f); +//(v.x,v.y,v.z,f) +PX_FORCE_INLINE Vec4V V4SetW(const Vec4V v, const FloatV f); + +//(v.x,v.y,v.z,0) +PX_FORCE_INLINE Vec4V V4ClearW(const Vec4V v); + +//(a[elementIndex], a[elementIndex], a[elementIndex], a[elementIndex]) +template +PX_FORCE_INLINE Vec4V V4SplatElement(Vec4V a); + +// v.x=f +PX_FORCE_INLINE void V4WriteX(Vec4V& v, const PxF32 f); +// v.y=f +PX_FORCE_INLINE void V4WriteY(Vec4V& v, const PxF32 f); +// v.z=f +PX_FORCE_INLINE void V4WriteZ(Vec4V& v, const PxF32 f); +// v.w=f +PX_FORCE_INLINE void V4WriteW(Vec4V& v, const PxF32 f); +// v.x=f.x, v.y=f.y, v.z=f.z +PX_FORCE_INLINE void V4WriteXYZ(Vec4V& v, const PxVec3& f); +// return v.x +PX_FORCE_INLINE PxF32 V4ReadX(const Vec4V& v); +// return v.y +PX_FORCE_INLINE PxF32 V4ReadY(const Vec4V& v); +// return v.z +PX_FORCE_INLINE PxF32 V4ReadZ(const Vec4V& v); +// return v.w +PX_FORCE_INLINE PxF32 V4ReadW(const Vec4V& v); +// return (v.x,v.y,v.z) +PX_FORCE_INLINE const PxVec3& V4ReadXYZ(const Vec4V& v); + +//(0,0,0,0) +PX_FORCE_INLINE Vec4V V4Zero(); +//(1,1,1,1) +PX_FORCE_INLINE Vec4V V4One(); +//(PX_EPS_REAL,PX_EPS_REAL,PX_EPS_REAL,PX_EPS_REAL) +PX_FORCE_INLINE Vec4V V4Eps(); + +//-c (per component) +PX_FORCE_INLINE Vec4V V4Neg(const Vec4V c); +// a+b (per component) +PX_FORCE_INLINE Vec4V V4Add(const Vec4V a, const Vec4V b); +// a-b (per component) +PX_FORCE_INLINE Vec4V V4Sub(const Vec4V a, const Vec4V b); +// a*b (per component) +PX_FORCE_INLINE Vec4V V4Scale(const Vec4V a, const FloatV b); +// a*b (per component) +PX_FORCE_INLINE Vec4V V4Mul(const Vec4V a, const Vec4V b); +// a/b (per component) +PX_FORCE_INLINE Vec4V V4ScaleInv(const Vec4V a, const FloatV b); +// a/b (per component) +PX_FORCE_INLINE Vec4V V4Div(const Vec4V a, const Vec4V b); +// a/b (per component) +PX_FORCE_INLINE Vec4V V4ScaleInvFast(const Vec4V a, const FloatV b); +// a/b (per component) +PX_FORCE_INLINE Vec4V V4DivFast(const Vec4V a, const Vec4V b); +// 1.0f/a +PX_FORCE_INLINE Vec4V V4Recip(const Vec4V a); +// 1.0f/a +PX_FORCE_INLINE Vec4V V4RecipFast(const Vec4V a); +// 1.0f/sqrt(a) +PX_FORCE_INLINE Vec4V V4Rsqrt(const Vec4V a); +// 1.0f/sqrt(a) +PX_FORCE_INLINE Vec4V V4RsqrtFast(const Vec4V a); +// a*b+c +PX_FORCE_INLINE Vec4V V4ScaleAdd(const Vec4V a, const FloatV b, const Vec4V c); +// c-a*b +PX_FORCE_INLINE Vec4V V4NegScaleSub(const Vec4V a, const FloatV b, const Vec4V c); +// a*b+c +PX_FORCE_INLINE Vec4V V4MulAdd(const Vec4V a, const Vec4V b, const Vec4V c); +// c-a*b +PX_FORCE_INLINE Vec4V V4NegMulSub(const Vec4V a, const Vec4V b, const Vec4V c); + +// fabs(a) +PX_FORCE_INLINE Vec4V V4Abs(const Vec4V a); +// bitwise a & ~b +PX_FORCE_INLINE Vec4V V4Andc(const Vec4V a, const VecU32V b); + +// a.b (W is taken into account) +PX_FORCE_INLINE FloatV V4Dot(const Vec4V a, const Vec4V b); +// a.b (same computation as V3Dot. W is ignored in input) +PX_FORCE_INLINE FloatV V4Dot3(const Vec4V a, const Vec4V b); +// aXb (same computation as V3Cross. W is ignored in input and undefined in output) +PX_FORCE_INLINE Vec4V V4Cross(const Vec4V a, const Vec4V b); + +//|a.a|^1/2 +PX_FORCE_INLINE FloatV V4Length(const Vec4V a); +// a.a +PX_FORCE_INLINE FloatV V4LengthSq(const Vec4V a); + +// a*|a.a|^-1/2 +PX_FORCE_INLINE Vec4V V4Normalize(const Vec4V a); +// a.a>0 ? a*|a.a|^-1/2 : unsafeReturnValue +PX_FORCE_INLINE Vec4V V4NormalizeSafe(const Vec4V a, const Vec4V unsafeReturnValue); +// a*|a.a|^-1/2 +PX_FORCE_INLINE Vec4V V4NormalizeFast(const Vec4V a); + +// c ? a : b (per component) +PX_FORCE_INLINE Vec4V V4Sel(const BoolV c, const Vec4V a, const Vec4V b); +// a>b (per component) +PX_FORCE_INLINE BoolV V4IsGrtr(const Vec4V a, const Vec4V b); +// a>=b (per component) +PX_FORCE_INLINE BoolV V4IsGrtrOrEq(const Vec4V a, const Vec4V b); +// a==b (per component) +PX_FORCE_INLINE BoolV V4IsEq(const Vec4V a, const Vec4V b); +// Max(a,b) (per component) +PX_FORCE_INLINE Vec4V V4Max(const Vec4V a, const Vec4V b); +// Min(a,b) (per component) +PX_FORCE_INLINE Vec4V V4Min(const Vec4V a, const Vec4V b); +// Get the maximum component from a +PX_FORCE_INLINE FloatV V4ExtractMax(const Vec4V a); +// Get the minimum component from a +PX_FORCE_INLINE FloatV V4ExtractMin(const Vec4V a); + +// Clamp(a,b) (per component) +PX_FORCE_INLINE Vec4V V4Clamp(const Vec4V a, const Vec4V minV, const Vec4V maxV); + +// return 1 if all components of a are greater than all components of b. +PX_FORCE_INLINE PxU32 V4AllGrtr(const Vec4V a, const Vec4V b); +// return 1 if all components of a are greater than or equal to all components of b +PX_FORCE_INLINE PxU32 V4AllGrtrOrEq(const Vec4V a, const Vec4V b); +// return 1 if XYZ components of a are greater than or equal to XYZ components of b. W is ignored. +PX_FORCE_INLINE PxU32 V4AllGrtrOrEq3(const Vec4V a, const Vec4V b); +// return 1 if all components of a are equal to all components of b +PX_FORCE_INLINE PxU32 V4AllEq(const Vec4V a, const Vec4V b); +// return 1 if any XYZ component of a is greater than the corresponding component of b. W is ignored. +PX_FORCE_INLINE PxU32 V4AnyGrtr3(const Vec4V a, const Vec4V b); + +// round(a)(per component) +PX_FORCE_INLINE Vec4V V4Round(const Vec4V a); +// sin(a) (per component) +PX_FORCE_INLINE Vec4V V4Sin(const Vec4V a); +// cos(a) (per component) +PX_FORCE_INLINE Vec4V V4Cos(const Vec4V a); + +// Permute v into a new vec4v with YXWZ format +PX_FORCE_INLINE Vec4V V4PermYXWZ(const Vec4V v); +// Permute v into a new vec4v with XZXZ format +PX_FORCE_INLINE Vec4V V4PermXZXZ(const Vec4V v); +// Permute v into a new vec4v with YWYW format +PX_FORCE_INLINE Vec4V V4PermYWYW(const Vec4V v); +// Permute v into a new vec4v with YZXW format +PX_FORCE_INLINE Vec4V V4PermYZXW(const Vec4V v); +// Permute v into a new vec4v with ZWXY format - equivalent to a swap of the two 64bit parts of the vector +PX_FORCE_INLINE Vec4V V4PermZWXY(const Vec4V a); + +// Permute v into a new vec4v with format {a[x], a[y], a[z], a[w]} +// V4Perm<1,3,1,3> is equal to V4PermYWYW +// V4Perm<0,2,0,2> is equal to V4PermXZXZ +// V3Perm<1,0,3,2> is equal to V4PermYXWZ +template +PX_FORCE_INLINE Vec4V V4Perm(const Vec4V a); + +// Transpose 4 Vec4Vs inplace. +// [ x0, y0, z0, w0] [ x1, y1, z1, w1] [ x2, y2, z2, w2] [ x3, y3, z3, w3] -> +// [ x0, x1, x2, x3] [ y0, y1, y2, y3] [ z0, z1, z2, z3] [ w0, w1, w2, w3] +PX_FORCE_INLINE void V3Transpose(Vec3V& col0, Vec3V& col1, Vec3V& col2); + +// q = cos(a/2) + u*sin(a/2) +PX_FORCE_INLINE QuatV QuatV_From_RotationAxisAngle(const Vec3V u, const FloatV a); +// convert q to a unit quaternion +PX_FORCE_INLINE QuatV QuatNormalize(const QuatV q); +//|q.q|^1/2 +PX_FORCE_INLINE FloatV QuatLength(const QuatV q); +// q.q +PX_FORCE_INLINE FloatV QuatLengthSq(const QuatV q); +// a.b +PX_FORCE_INLINE FloatV QuatDot(const QuatV a, const QuatV b); +//(-q.x, -q.y, -q.z, q.w) +PX_FORCE_INLINE QuatV QuatConjugate(const QuatV q); +//(q.x, q.y, q.z) +PX_FORCE_INLINE Vec3V QuatGetImaginaryPart(const QuatV q); +// convert quaternion to matrix 33 +PX_FORCE_INLINE Mat33V QuatGetMat33V(const QuatVArg q); +// convert quaternion to matrix 33 +PX_FORCE_INLINE void QuatGetMat33V(const QuatVArg q, Vec3V& column0, Vec3V& column1, Vec3V& column2); +// convert matrix 33 to quaternion +PX_FORCE_INLINE QuatV Mat33GetQuatV(const Mat33V& a); +// brief computes rotation of x-axis +PX_FORCE_INLINE Vec3V QuatGetBasisVector0(const QuatV q); +// brief computes rotation of y-axis +PX_FORCE_INLINE Vec3V QuatGetBasisVector1(const QuatV q); +// brief computes rotation of z-axis +PX_FORCE_INLINE Vec3V QuatGetBasisVector2(const QuatV q); +// calculate the rotation vector from q and v +PX_FORCE_INLINE Vec3V QuatRotate(const QuatV q, const Vec3V v); +// calculate the rotation vector from the conjugate quaternion and v +PX_FORCE_INLINE Vec3V QuatRotateInv(const QuatV q, const Vec3V v); +// quaternion multiplication +PX_FORCE_INLINE QuatV QuatMul(const QuatV a, const QuatV b); +// quaternion add +PX_FORCE_INLINE QuatV QuatAdd(const QuatV a, const QuatV b); +// (-q.x, -q.y, -q.z, -q.w) +PX_FORCE_INLINE QuatV QuatNeg(const QuatV q); +// (a.x - b.x, a.y-b.y, a.z-b.z, a.w-b.w ) +PX_FORCE_INLINE QuatV QuatSub(const QuatV a, const QuatV b); +// (a.x*b, a.y*b, a.z*b, a.w*b) +PX_FORCE_INLINE QuatV QuatScale(const QuatV a, const FloatV b); +// (x = v[0], y = v[1], z = v[2], w =v[3]) +PX_FORCE_INLINE QuatV QuatMerge(const FloatV* const v); +// (x = v[0], y = v[1], z = v[2], w =v[3]) +PX_FORCE_INLINE QuatV QuatMerge(const FloatVArg x, const FloatVArg y, const FloatVArg z, const FloatVArg w); +// (x = 0.f, y = 0.f, z = 0.f, w = 1.f) +PX_FORCE_INLINE QuatV QuatIdentity(); +// check for each component is valid +PX_FORCE_INLINE bool isFiniteQuatV(const QuatV q); +// check for each component is valid +PX_FORCE_INLINE bool isValidQuatV(const QuatV q); +// check for each component is valid +PX_FORCE_INLINE bool isSaneQuatV(const QuatV q); + +// Math operations on 16-byte aligned booleans. +// x=false y=false z=false w=false +PX_FORCE_INLINE BoolV BFFFF(); +// x=false y=false z=false w=true +PX_FORCE_INLINE BoolV BFFFT(); +// x=false y=false z=true w=false +PX_FORCE_INLINE BoolV BFFTF(); +// x=false y=false z=true w=true +PX_FORCE_INLINE BoolV BFFTT(); +// x=false y=true z=false w=false +PX_FORCE_INLINE BoolV BFTFF(); +// x=false y=true z=false w=true +PX_FORCE_INLINE BoolV BFTFT(); +// x=false y=true z=true w=false +PX_FORCE_INLINE BoolV BFTTF(); +// x=false y=true z=true w=true +PX_FORCE_INLINE BoolV BFTTT(); +// x=true y=false z=false w=false +PX_FORCE_INLINE BoolV BTFFF(); +// x=true y=false z=false w=true +PX_FORCE_INLINE BoolV BTFFT(); +// x=true y=false z=true w=false +PX_FORCE_INLINE BoolV BTFTF(); +// x=true y=false z=true w=true +PX_FORCE_INLINE BoolV BTFTT(); +// x=true y=true z=false w=false +PX_FORCE_INLINE BoolV BTTFF(); +// x=true y=true z=false w=true +PX_FORCE_INLINE BoolV BTTFT(); +// x=true y=true z=true w=false +PX_FORCE_INLINE BoolV BTTTF(); +// x=true y=true z=true w=true +PX_FORCE_INLINE BoolV BTTTT(); + +// x=false y=false z=false w=true +PX_FORCE_INLINE BoolV BWMask(); +// x=true y=false z=false w=false +PX_FORCE_INLINE BoolV BXMask(); +// x=false y=true z=false w=false +PX_FORCE_INLINE BoolV BYMask(); +// x=false y=false z=true w=false +PX_FORCE_INLINE BoolV BZMask(); + +// get x component +PX_FORCE_INLINE BoolV BGetX(const BoolV f); +// get y component +PX_FORCE_INLINE BoolV BGetY(const BoolV f); +// get z component +PX_FORCE_INLINE BoolV BGetZ(const BoolV f); +// get w component +PX_FORCE_INLINE BoolV BGetW(const BoolV f); + +// Use elementIndex to splat xxxx or yyyy or zzzz or wwww +template +PX_FORCE_INLINE BoolV BSplatElement(Vec4V a); + +// component-wise && (AND) +PX_FORCE_INLINE BoolV BAnd(const BoolV a, const BoolV b); +// component-wise || (OR) +PX_FORCE_INLINE BoolV BOr(const BoolV a, const BoolV b); +// component-wise not +PX_FORCE_INLINE BoolV BNot(const BoolV a); + +// if all four components are true, return true, otherwise return false +PX_FORCE_INLINE BoolV BAllTrue4(const BoolV a); + +// if any four components is true, return true, otherwise return false +PX_FORCE_INLINE BoolV BAnyTrue4(const BoolV a); + +// if all three(0, 1, 2) components are true, return true, otherwise return false +PX_FORCE_INLINE BoolV BAllTrue3(const BoolV a); + +// if any three (0, 1, 2) components is true, return true, otherwise return false +PX_FORCE_INLINE BoolV BAnyTrue3(const BoolV a); + +// Return 1 if all components equal, zero otherwise. +PX_FORCE_INLINE PxU32 BAllEq(const BoolV a, const BoolV b); + +// Specialized/faster BAllEq function for b==TTTT +PX_FORCE_INLINE PxU32 BAllEqTTTT(const BoolV a); +// Specialized/faster BAllEq function for b==FFFF +PX_FORCE_INLINE PxU32 BAllEqFFFF(const BoolV a); + +/// Get BoolV as bits set in an PxU32. A bit in the output is set if the element is 'true' in the input. +/// There is a bit for each element in a, with element 0s value held in bit0, element 1 in bit 1s and so forth. +/// If nothing is true in the input it will return 0, and if all are true if will return 0xf. +/// NOTE! That performance of the function varies considerably by platform, thus it is recommended to use +/// where your algorithm really needs a BoolV in an integer variable. +PX_FORCE_INLINE PxU32 BGetBitMask(const BoolV a); + +// VecI32V stuff + +PX_FORCE_INLINE VecI32V VecI32V_Zero(); + +PX_FORCE_INLINE VecI32V VecI32V_One(); + +PX_FORCE_INLINE VecI32V VecI32V_Two(); + +PX_FORCE_INLINE VecI32V VecI32V_MinusOne(); + +// Compute a shift parameter for VecI32V_LeftShift and VecI32V_RightShift +// Each element of shift must be identical ie the vector must have form {count, count, count, count} with count>=0 +PX_FORCE_INLINE VecShiftV VecI32V_PrepareShift(const VecI32VArg shift); + +// Shift each element of a leftwards by the same amount +// Compute shift with VecI32V_PrepareShift +//{a.x<>shift[0], a.y>>shift[0], a.z>>shift[0], a.w>>shift[0]} +PX_FORCE_INLINE VecI32V VecI32V_RightShift(const VecI32VArg a, const VecShiftVArg shift); + +PX_FORCE_INLINE VecI32V VecI32V_Add(const VecI32VArg a, const VecI32VArg b); + +PX_FORCE_INLINE VecI32V VecI32V_Or(const VecI32VArg a, const VecI32VArg b); + +PX_FORCE_INLINE VecI32V VecI32V_GetX(const VecI32VArg a); + +PX_FORCE_INLINE VecI32V VecI32V_GetY(const VecI32VArg a); + +PX_FORCE_INLINE VecI32V VecI32V_GetZ(const VecI32VArg a); + +PX_FORCE_INLINE VecI32V VecI32V_GetW(const VecI32VArg a); + +PX_FORCE_INLINE VecI32V VecI32V_Sub(const VecI32VArg a, const VecI32VArg b); + +PX_FORCE_INLINE BoolV VecI32V_IsGrtr(const VecI32VArg a, const VecI32VArg b); + +PX_FORCE_INLINE BoolV VecI32V_IsEq(const VecI32VArg a, const VecI32VArg b); + +PX_FORCE_INLINE VecI32V V4I32Sel(const BoolV c, const VecI32V a, const VecI32V b); + +// VecU32V stuff + +PX_FORCE_INLINE VecU32V U4Zero(); + +PX_FORCE_INLINE VecU32V U4One(); + +PX_FORCE_INLINE VecU32V U4Two(); + +PX_FORCE_INLINE BoolV V4IsEqU32(const VecU32V a, const VecU32V b); + +PX_FORCE_INLINE VecU32V V4U32Sel(const BoolV c, const VecU32V a, const VecU32V b); + +PX_FORCE_INLINE VecU32V V4U32or(VecU32V a, VecU32V b); + +PX_FORCE_INLINE VecU32V V4U32xor(VecU32V a, VecU32V b); + +PX_FORCE_INLINE VecU32V V4U32and(VecU32V a, VecU32V b); + +PX_FORCE_INLINE VecU32V V4U32Andc(VecU32V a, VecU32V b); + +// VecU32 - why does this not return a bool? +PX_FORCE_INLINE VecU32V V4IsGrtrV32u(const Vec4V a, const Vec4V b); + +// Math operations on 16-byte aligned Mat33s (represents any 3x3 matrix) +PX_FORCE_INLINE Mat33V M33Load(const PxMat33& m) +{ + return Mat33V(Vec3V_From_Vec4V(V4LoadU(&m.column0.x)), + Vec3V_From_Vec4V(V4LoadU(&m.column1.x)), V3LoadU(m.column2)); +} +// a*b +PX_FORCE_INLINE Vec3V M33MulV3(const Mat33V& a, const Vec3V b); +// A*x + b +PX_FORCE_INLINE Vec3V M33MulV3AddV3(const Mat33V& A, const Vec3V b, const Vec3V c); +// transpose(a) * b +PX_FORCE_INLINE Vec3V M33TrnspsMulV3(const Mat33V& a, const Vec3V b); +// a*b +PX_FORCE_INLINE Mat33V M33MulM33(const Mat33V& a, const Mat33V& b); +// a+b +PX_FORCE_INLINE Mat33V M33Add(const Mat33V& a, const Mat33V& b); +// a+b +PX_FORCE_INLINE Mat33V M33Sub(const Mat33V& a, const Mat33V& b); +//-a +PX_FORCE_INLINE Mat33V M33Neg(const Mat33V& a); +// absolute value of the matrix +PX_FORCE_INLINE Mat33V M33Abs(const Mat33V& a); +// inverse mat +PX_FORCE_INLINE Mat33V M33Inverse(const Mat33V& a); +// transpose(a) +PX_FORCE_INLINE Mat33V M33Trnsps(const Mat33V& a); +// create an identity matrix +PX_FORCE_INLINE Mat33V M33Identity(); + +// create a vec3 to store the diagonal element of the M33 +PX_FORCE_INLINE Mat33V M33Diagonal(const Vec3VArg); + +// Not implemented +// return 1 if all components of a are equal to all components of b +// PX_FORCE_INLINE PxU32 V4U32AllEq(const VecU32V a, const VecU32V b); +// v.w=f +// PX_FORCE_INLINE void V3WriteW(Vec3V& v, const PxF32 f); +// PX_FORCE_INLINE PxF32 V3ReadW(const Vec3V& v); + +// Not used +// PX_FORCE_INLINE Vec4V V4LoadAligned(Vec4V* addr); +// PX_FORCE_INLINE Vec4V V4LoadUnaligned(Vec4V* addr); +// floor(a)(per component) +// PX_FORCE_INLINE Vec4V V4Floor(Vec4V a); +// ceil(a) (per component) +// PX_FORCE_INLINE Vec4V V4Ceil(Vec4V a); +// PX_FORCE_INLINE VecU32V V4ConvertToU32VSaturate(const Vec4V a, PxU32 power); + +// Math operations on 16-byte aligned Mat34s (represents transformation matrix - rotation and translation). +// namespace _Mat34V +//{ +// //a*b +// PX_FORCE_INLINE Vec3V multiplyV(const Mat34V& a, const Vec3V b); +// //a_rotation * b +// PX_FORCE_INLINE Vec3V multiply3X3V(const Mat34V& a, const Vec3V b); +// //transpose(a_rotation)*b +// PX_FORCE_INLINE Vec3V multiplyTranspose3X3V(const Mat34V& a, const Vec3V b); +// //a*b +// PX_FORCE_INLINE Mat34V multiplyV(const Mat34V& a, const Mat34V& b); +// //a_rotation*b +// PX_FORCE_INLINE Mat33V multiply3X3V(const Mat34V& a, const Mat33V& b); +// //a_rotation*b_rotation +// PX_FORCE_INLINE Mat33V multiply3X3V(const Mat34V& a, const Mat34V& b); +// //a+b +// PX_FORCE_INLINE Mat34V addV(const Mat34V& a, const Mat34V& b); +// //a^-1 +// PX_FORCE_INLINE Mat34V getInverseV(const Mat34V& a); +// //transpose(a_rotation) +// PX_FORCE_INLINE Mat33V getTranspose3X3(const Mat34V& a); +//}; //namespace _Mat34V + +// a*b +//#define M34MulV3(a,b) (M34MulV3(a,b)) +////a_rotation * b +//#define M34Mul33V3(a,b) (M34Mul33V3(a,b)) +////transpose(a_rotation)*b +//#define M34TrnspsMul33V3(a,b) (M34TrnspsMul33V3(a,b)) +////a*b +//#define M34MulM34(a,b) (_Mat34V::multiplyV(a,b)) +// a_rotation*b +//#define M34MulM33(a,b) (M34MulM33(a,b)) +// a_rotation*b_rotation +//#define M34Mul33MM34(a,b) (M34MulM33(a,b)) +// a+b +//#define M34Add(a,b) (M34Add(a,b)) +////a^-1 +//#define M34Inverse(a,b) (M34Inverse(a)) +// transpose(a_rotation) +//#define M34Trnsps33(a) (M33Trnsps3X3(a)) + +// Math operations on 16-byte aligned Mat44s (represents any 4x4 matrix) +// namespace _Mat44V +//{ +// //a*b +// PX_FORCE_INLINE Vec4V multiplyV(const Mat44V& a, const Vec4V b); +// //transpose(a)*b +// PX_FORCE_INLINE Vec4V multiplyTransposeV(const Mat44V& a, const Vec4V b); +// //a*b +// PX_FORCE_INLINE Mat44V multiplyV(const Mat44V& a, const Mat44V& b); +// //a+b +// PX_FORCE_INLINE Mat44V addV(const Mat44V& a, const Mat44V& b); +// //a&-1 +// PX_FORCE_INLINE Mat44V getInverseV(const Mat44V& a); +// //transpose(a) +// PX_FORCE_INLINE Mat44V getTransposeV(const Mat44V& a); +//}; //namespace _Mat44V + +// namespace _VecU32V +//{ +// // pack 8 U32s to 8 U16s with saturation +// PX_FORCE_INLINE VecU16V pack2U32VToU16VSaturate(VecU32V a, VecU32V b); +// PX_FORCE_INLINE VecU32V orV(VecU32V a, VecU32V b); +// PX_FORCE_INLINE VecU32V andV(VecU32V a, VecU32V b); +// PX_FORCE_INLINE VecU32V andcV(VecU32V a, VecU32V b); +// // conversion from integer to float +// PX_FORCE_INLINE Vec4V convertToVec4V(VecU32V a); +// // splat a[elementIndex] into all fields of a +// template +// PX_FORCE_INLINE VecU32V splatElement(VecU32V a); +// PX_FORCE_INLINE void storeAligned(VecU32V a, VecU32V* address); +//}; + +// namespace _VecI32V +//{ +// template PX_FORCE_INLINE VecI32V splatI32(); +//}; +// +// namespace _VecU16V +//{ +// PX_FORCE_INLINE VecU16V orV(VecU16V a, VecU16V b); +// PX_FORCE_INLINE VecU16V andV(VecU16V a, VecU16V b); +// PX_FORCE_INLINE VecU16V andcV(VecU16V a, VecU16V b); +// PX_FORCE_INLINE void storeAligned(VecU16V val, VecU16V *address); +// PX_FORCE_INLINE VecU16V loadAligned(VecU16V* addr); +// PX_FORCE_INLINE VecU16V loadUnaligned(VecU16V* addr); +// PX_FORCE_INLINE VecU16V compareGt(VecU16V a, VecU16V b); +// template +// PX_FORCE_INLINE VecU16V splatElement(VecU16V a); +// PX_FORCE_INLINE VecU16V subtractModulo(VecU16V a, VecU16V b); +// PX_FORCE_INLINE VecU16V addModulo(VecU16V a, VecU16V b); +// PX_FORCE_INLINE VecU32V getLo16(VecU16V a); // [0,2,4,6] 16-bit values to [0,1,2,3] 32-bit vector +// PX_FORCE_INLINE VecU32V getHi16(VecU16V a); // [1,3,5,7] 16-bit values to [0,1,2,3] 32-bit vector +//}; +// +// namespace _VecI16V +//{ +// template PX_FORCE_INLINE VecI16V splatImmediate(); +//}; +// +// namespace _VecU8V +//{ +//}; + +// a*b +//#define M44MulV4(a,b) (M44MulV4(a,b)) +////transpose(a)*b +//#define M44TrnspsMulV4(a,b) (M44TrnspsMulV4(a,b)) +////a*b +//#define M44MulM44(a,b) (M44MulM44(a,b)) +////a+b +//#define M44Add(a,b) (M44Add(a,b)) +////a&-1 +//#define M44Inverse(a) (M44Inverse(a)) +////transpose(a) +//#define M44Trnsps(a) (M44Trnsps(a)) + +// dsequeira: these used to be assert'd out in SIMD builds, but they're necessary if +// we want to be able to write some scalar functions which run using SIMD data structures + +PX_FORCE_INLINE void V3WriteX(Vec3V& v, const PxF32 f) +{ + reinterpret_cast(v).x = f; +} + +PX_FORCE_INLINE void V3WriteY(Vec3V& v, const PxF32 f) +{ + reinterpret_cast(v).y = f; +} + +PX_FORCE_INLINE void V3WriteZ(Vec3V& v, const PxF32 f) +{ + reinterpret_cast(v).z = f; +} + +PX_FORCE_INLINE void V3WriteXYZ(Vec3V& v, const PxVec3& f) +{ + reinterpret_cast(v) = f; +} + +PX_FORCE_INLINE PxF32 V3ReadX(const Vec3V& v) +{ + return reinterpret_cast(v).x; +} + +PX_FORCE_INLINE PxF32 V3ReadY(const Vec3V& v) +{ + return reinterpret_cast(v).y; +} + +PX_FORCE_INLINE PxF32 V3ReadZ(const Vec3V& v) +{ + return reinterpret_cast(v).z; +} + +PX_FORCE_INLINE const PxVec3& V3ReadXYZ(const Vec3V& v) +{ + return reinterpret_cast(v); +} + +PX_FORCE_INLINE void V4WriteX(Vec4V& v, const PxF32 f) +{ + reinterpret_cast(v).x = f; +} + +PX_FORCE_INLINE void V4WriteY(Vec4V& v, const PxF32 f) +{ + reinterpret_cast(v).y = f; +} + +PX_FORCE_INLINE void V4WriteZ(Vec4V& v, const PxF32 f) +{ + reinterpret_cast(v).z = f; +} + +PX_FORCE_INLINE void V4WriteW(Vec4V& v, const PxF32 f) +{ + reinterpret_cast(v).w = f; +} + +PX_FORCE_INLINE void V4WriteXYZ(Vec4V& v, const PxVec3& f) +{ + reinterpret_cast(v) = f; +} + +PX_FORCE_INLINE PxF32 V4ReadX(const Vec4V& v) +{ + return reinterpret_cast(v).x; +} + +PX_FORCE_INLINE PxF32 V4ReadY(const Vec4V& v) +{ + return reinterpret_cast(v).y; +} + +PX_FORCE_INLINE PxF32 V4ReadZ(const Vec4V& v) +{ + return reinterpret_cast(v).z; +} + +PX_FORCE_INLINE PxF32 V4ReadW(const Vec4V& v) +{ + return reinterpret_cast(v).w; +} + +PX_FORCE_INLINE const PxVec3& V4ReadXYZ(const Vec4V& v) +{ + return reinterpret_cast(v); +} + +// this macro transposes 4 Vec4V into 3 Vec4V (assuming that the W component can be ignored +#define PX_TRANSPOSE_44_34(inA, inB, inC, inD, outA, outB, outC) \ +outA = V4UnpackXY(inA, inC); \ +inA = V4UnpackZW(inA, inC); \ +inC = V4UnpackXY(inB, inD); \ +inB = V4UnpackZW(inB, inD); \ +outB = V4UnpackZW(outA, inC); \ +outA = V4UnpackXY(outA, inC); \ +outC = V4UnpackXY(inA, inB); + +// this macro transposes 3 Vec4V into 4 Vec4V (with W components as garbage!) +#define PX_TRANSPOSE_34_44(inA, inB, inC, outA, outB, outC, outD) \ + outA = V4UnpackXY(inA, inC); \ + inA = V4UnpackZW(inA, inC); \ + outC = V4UnpackXY(inB, inB); \ + inC = V4UnpackZW(inB, inB); \ + outB = V4UnpackZW(outA, outC); \ + outA = V4UnpackXY(outA, outC); \ + outC = V4UnpackXY(inA, inC); \ + outD = V4UnpackZW(inA, inC); + +#define PX_TRANSPOSE_44(inA, inB, inC, inD, outA, outB, outC, outD) \ + outA = V4UnpackXY(inA, inC); \ + inA = V4UnpackZW(inA, inC); \ + inC = V4UnpackXY(inB, inD); \ + inB = V4UnpackZW(inB, inD); \ + outB = V4UnpackZW(outA, inC); \ + outA = V4UnpackXY(outA, inC); \ + outC = V4UnpackXY(inA, inB); \ + outD = V4UnpackZW(inA, inB); + +// This function returns a Vec4V, where each element is the dot product of one pair of Vec3Vs. On PC, each element in +// the result should be identical to the results if V3Dot was performed +// for each pair of Vec3V. +// However, on other platforms, the result might diverge by some small margin due to differences in FP rounding, e.g. if +// _mm_dp_ps was used or some other approximate dot product or fused madd operations +// were used. +// Where there does not exist a hw-accelerated dot-product operation, this approach should be the fastest way to compute +// the dot product of 4 vectors. +PX_FORCE_INLINE Vec4V V3Dot4(const Vec3VArg a0, const Vec3VArg b0, const Vec3VArg a1, const Vec3VArg b1, + const Vec3VArg a2, const Vec3VArg b2, const Vec3VArg a3, const Vec3VArg b3) +{ + Vec4V a0b0 = Vec4V_From_Vec3V(V3Mul(a0, b0)); + Vec4V a1b1 = Vec4V_From_Vec3V(V3Mul(a1, b1)); + Vec4V a2b2 = Vec4V_From_Vec3V(V3Mul(a2, b2)); + Vec4V a3b3 = Vec4V_From_Vec3V(V3Mul(a3, b3)); + + Vec4V aTrnsps, bTrnsps, cTrnsps; + + PX_TRANSPOSE_44_34(a0b0, a1b1, a2b2, a3b3, aTrnsps, bTrnsps, cTrnsps); + + return V4Add(V4Add(aTrnsps, bTrnsps), cTrnsps); +} + +//(f.x,f.y,f.z,0) - Alternative/faster V3LoadU implementation when it is safe to read "W", i.e. the 32bits after the PxVec3. +PX_FORCE_INLINE Vec3V V3LoadU_SafeReadW(const PxVec3& f) +{ + return Vec3V_From_Vec4V(V4LoadU(&f.x)); +} + +} // namespace aos +#if !PX_DOXYGEN +} // namespace physx +#endif + +// Now for the cross-platform implementations of the 16-byte aligned maths functions (win32/360/ppu/spu etc). +#if COMPILE_VECTOR_INTRINSICS +#include "PxInlineAoS.h" +#else // #if COMPILE_VECTOR_INTRINSICS +#include "PxVecMathAoSScalarInline.h" +#endif // #if !COMPILE_VECTOR_INTRINSICS +#include "PxVecQuat.h" + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxVecMathAoSScalar.h b/Source/ThirdParty/PhysX/foundation/PxVecMathAoSScalar.h new file mode 100644 index 000000000..11243cd13 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxVecMathAoSScalar.h @@ -0,0 +1,251 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_VEC_MATH_AOS_SCALAR_H +#define PX_VEC_MATH_AOS_SCALAR_H + +#if COMPILE_VECTOR_INTRINSICS +#error Scalar version should not be included when using vector intrinsics. +#endif + +#if !PX_DOXYGEN +namespace physx +{ +#endif +namespace aos +{ + +struct VecI16V; +struct VecU16V; +struct VecI32V; +struct VecU32V; +struct Vec4V; +typedef Vec4V QuatV; + +PX_ALIGN_PREFIX(16) +struct FloatV +{ + PxF32 x; + PxF32 pad[3]; + FloatV() + { + } + FloatV(const PxF32 _x) : x(_x) + { + } +} PX_ALIGN_SUFFIX(16); + +PX_ALIGN_PREFIX(16) +struct Vec4V +{ + PxF32 x, y, z, w; + Vec4V() + { + } + Vec4V(const PxF32 _x, const PxF32 _y, const PxF32 _z, const PxF32 _w) : x(_x), y(_y), z(_z), w(_w) + { + } +} PX_ALIGN_SUFFIX(16); + +PX_ALIGN_PREFIX(16) +struct Vec3V +{ + PxF32 x, y, z; + PxF32 pad; + Vec3V() + { + } + Vec3V(const PxF32 _x, const PxF32 _y, const PxF32 _z) : x(_x), y(_y), z(_z), pad(0.0f) + { + } +} PX_ALIGN_SUFFIX(16); + +PX_ALIGN_PREFIX(16) +struct BoolV +{ + PxU32 ux, uy, uz, uw; + BoolV() + { + } + BoolV(const PxU32 _x, const PxU32 _y, const PxU32 _z, const PxU32 _w) : ux(_x), uy(_y), uz(_z), uw(_w) + { + } +} PX_ALIGN_SUFFIX(16); + +struct Mat33V +{ + Mat33V() + { + } + Mat33V(const Vec3V& c0, const Vec3V& c1, const Vec3V& c2) : col0(c0), col1(c1), col2(c2) + { + } + Vec3V col0; + Vec3V col1; + Vec3V col2; +}; + +struct Mat34V +{ + Mat34V() + { + } + Mat34V(const Vec3V& c0, const Vec3V& c1, const Vec3V& c2, const Vec3V& c3) : col0(c0), col1(c1), col2(c2), col3(c3) + { + } + Vec3V col0; + Vec3V col1; + Vec3V col2; + Vec3V col3; +}; + +struct Mat43V +{ + Mat43V() + { + } + Mat43V(const Vec4V& c0, const Vec4V& c1, const Vec4V& c2) : col0(c0), col1(c1), col2(c2) + { + } + Vec4V col0; + Vec4V col1; + Vec4V col2; +}; + +struct Mat44V +{ + Mat44V() + { + } + Mat44V(const Vec4V& c0, const Vec4V& c1, const Vec4V& c2, const Vec4V& c3) : col0(c0), col1(c1), col2(c2), col3(c3) + { + } + Vec4V col0; + Vec4V col1; + Vec4V col2; + Vec4V col3; +}; + +PX_ALIGN_PREFIX(16) +struct VecU32V +{ + PxU32 u32[4]; + PX_FORCE_INLINE VecU32V() + { + } + PX_FORCE_INLINE VecU32V(PxU32 a, PxU32 b, PxU32 c, PxU32 d) + { + u32[0] = a; + u32[1] = b; + u32[2] = c; + u32[3] = d; + } +} PX_ALIGN_SUFFIX(16); + +PX_ALIGN_PREFIX(16) +struct VecI32V +{ + PxI32 i32[4]; + PX_FORCE_INLINE VecI32V() + { + } + PX_FORCE_INLINE VecI32V(PxI32 a, PxI32 b, PxI32 c, PxI32 d) + { + i32[0] = a; + i32[1] = b; + i32[2] = c; + i32[3] = d; + } +} PX_ALIGN_SUFFIX(16); + +PX_ALIGN_PREFIX(16) +struct VecI16V +{ + PxI16 i16[8]; + PX_FORCE_INLINE VecI16V() + { + } + PX_FORCE_INLINE VecI16V(PxI16 a, PxI16 b, PxI16 c, PxI16 d, PxI16 e, PxI16 f, PxI16 g, PxI16 h) + { + i16[0] = a; + i16[1] = b; + i16[2] = c; + i16[3] = d; + i16[4] = e; + i16[5] = f; + i16[6] = g; + i16[7] = h; + } +} PX_ALIGN_SUFFIX(16); + +PX_ALIGN_PREFIX(16) +struct VecU16V +{ + union + { + PxU16 u16[8]; + PxI16 i16[8]; + }; + PX_FORCE_INLINE VecU16V() + { + } + PX_FORCE_INLINE VecU16V(PxU16 a, PxU16 b, PxU16 c, PxU16 d, PxU16 e, PxU16 f, PxU16 g, PxU16 h) + { + u16[0] = a; + u16[1] = b; + u16[2] = c; + u16[3] = d; + u16[4] = e; + u16[5] = f; + u16[6] = g; + u16[7] = h; + } +} PX_ALIGN_SUFFIX(16); + +#define FloatVArg FloatV & +#define Vec3VArg Vec3V & +#define Vec4VArg Vec4V & +#define BoolVArg BoolV & +#define VecU32VArg VecU32V & +#define VecI32VArg VecI32V & +#define VecU16VArg VecU16V & +#define VecI16VArg VecI16V & +#define QuatVArg QuatV & + +#define VecCrossV Vec3V + +typedef VecI32V VecShiftV; +#define VecShiftVArg VecShiftV & + +} // namespace aos +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxVecMathAoSScalarInline.h b/Source/ThirdParty/PhysX/foundation/PxVecMathAoSScalarInline.h new file mode 100644 index 000000000..b328ebb79 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxVecMathAoSScalarInline.h @@ -0,0 +1,2293 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_VEC_MATH_AOS_SCALAR_INLINE_H +#define PX_VEC_MATH_AOS_SCALAR_INLINE_H + +#if COMPILE_VECTOR_INTRINSICS +#error Scalar version should not be included when using vector intrinsics. +#endif + +#if !PX_DOXYGEN +namespace physx +{ +#endif +namespace aos +{ + +#define BOOL_TO_U32(b) PxU32(- PxI32(b)) +#define TRUE_TO_U32 PxU32(-1) +#define FALSE_TO_U32 PxU32(0) + +#define BOOL_TO_U16(b) PxU16(- PxI32(b)) + +#define PX_VECMATH_ASSERT_ENABLED 0 + +#if PX_VECMATH_ASSERT_ENABLED +#define VECMATHAOS_ASSERT(x) { PX_ASSERT(x); } +#else +#define VECMATHAOS_ASSERT(x) +#endif + +///////////////////////////////////////////////////////////////////// +////INTERNAL USE ONLY AND TESTS +///////////////////////////////////////////////////////////////////// + +namespace internalScalarSimd +{ +PX_FORCE_INLINE PxF32 FStore(const FloatV a) +{ + return a.x; +} + +PX_FORCE_INLINE bool hasZeroElementInFloatV(const FloatV a) +{ + return (0 == a.x); +} + +PX_FORCE_INLINE bool hasZeroElementInVec3V(const Vec3V a) +{ + return (0 == a.x || 0 == a.y || 0 == a.z); +} + +PX_FORCE_INLINE bool hasZeroElementInVec4V(const Vec4V a) +{ + return (0 == a.x || 0 == a.y || 0 == a.z || 0 == a.w); +} +} + +namespace vecMathTests +{ +// PT: this function returns an invalid Vec3V (W!=0.0f) just for unit-testing 'isValidVec3V' +PX_FORCE_INLINE Vec3V getInvalidVec3V() +{ + Vec3V tmp; + tmp.x = tmp.y = tmp.z = 0.0f; + tmp.pad = 1.0f; + return tmp; +} + +PX_FORCE_INLINE bool allElementsEqualFloatV(const FloatV a, const FloatV b) +{ + return (a.x == b.x); +} + +PX_FORCE_INLINE bool allElementsEqualVec3V(const Vec3V a, const Vec3V b) +{ + return (a.x == b.x && a.y == b.y && a.z == b.z); +} + +PX_FORCE_INLINE bool allElementsEqualVec4V(const Vec4V a, const Vec4V b) +{ + return (a.x == b.x && a.y == b.y && a.z == b.z && a.w == b.w); +} + +PX_FORCE_INLINE bool allElementsEqualBoolV(const BoolV a, const BoolV b) +{ + return (a.ux == b.ux && a.uy == b.uy && a.uz == b.uz && a.uw == b.uw); +} + +PX_FORCE_INLINE bool allElementsEqualVecU32V(const VecU32V a, const VecU32V b) +{ + return (a.u32[0] == b.u32[0] && a.u32[1] == b.u32[1] && a.u32[2] == b.u32[2] && a.u32[3] == b.u32[3]); +} + +PX_FORCE_INLINE bool allElementsEqualVecI32V(const VecI32V a, const VecI32V b) +{ + return (a.i32[0] == b.i32[0] && a.i32[1] == b.i32[1] && a.i32[2] == b.i32[2] && a.i32[3] == b.i32[3]); +} + +#define VECMATH_AOS_EPSILON (1e-3f) + +PX_FORCE_INLINE bool allElementsNearEqualFloatV(const FloatV a, const FloatV b) +{ + const PxF32 cx = a.x - b.x; + return (cx > -VECMATH_AOS_EPSILON && cx < VECMATH_AOS_EPSILON); +} + +PX_FORCE_INLINE bool allElementsNearEqualVec3V(const Vec3V a, const Vec3V b) +{ + const PxF32 cx = a.x - b.x; + const PxF32 cy = a.y - b.y; + const PxF32 cz = a.z - b.z; + return (cx > -VECMATH_AOS_EPSILON && cx < VECMATH_AOS_EPSILON && cy > -VECMATH_AOS_EPSILON && + cy < VECMATH_AOS_EPSILON && cz > -VECMATH_AOS_EPSILON && cz < VECMATH_AOS_EPSILON); +} + +PX_FORCE_INLINE bool allElementsNearEqualVec4V(const Vec4V a, const Vec4V b) +{ + const PxF32 cx = a.x - b.x; + const PxF32 cy = a.y - b.y; + const PxF32 cz = a.z - b.z; + const PxF32 cw = a.w - b.w; + return (cx > -VECMATH_AOS_EPSILON && cx < VECMATH_AOS_EPSILON && cy > -VECMATH_AOS_EPSILON && + cy < VECMATH_AOS_EPSILON && cz > -VECMATH_AOS_EPSILON && cz < VECMATH_AOS_EPSILON && + cw > -VECMATH_AOS_EPSILON && cw < VECMATH_AOS_EPSILON); +} +} + +/////////////////////////////////////////////////////// + +PX_FORCE_INLINE bool isValidVec3V(const Vec3V a) +{ + return a.pad == 0.f; +} + +PX_FORCE_INLINE bool isFiniteFloatV(const FloatV a) +{ + return PxIsFinite(a.x); +} + +PX_FORCE_INLINE bool isFiniteVec3V(const Vec3V a) +{ + return PxIsFinite(a.x) && PxIsFinite(a.y) && PxIsFinite(a.z); +} + +PX_FORCE_INLINE bool isFiniteVec4V(const Vec4V a) +{ + return PxIsFinite(a.x) && PxIsFinite(a.y) && PxIsFinite(a.z) && PxIsFinite(a.w); +} + +///////////////////////////////////////////////////////////////////// +////VECTORISED FUNCTION IMPLEMENTATIONS +///////////////////////////////////////////////////////////////////// + +PX_FORCE_INLINE FloatV FLoad(const PxF32 f) +{ + return FloatV(f); +} + +PX_FORCE_INLINE Vec3V V3Load(const PxF32 f) +{ + return Vec3V(f, f, f); +} + +PX_FORCE_INLINE Vec4V V4Load(const PxF32 f) +{ + return Vec4V(f, f, f, f); +} + +PX_FORCE_INLINE BoolV BLoad(const bool f) +{ +#if PX_ARM + // SD: Android ARM builds fail if this is done with a cast. + // Might also fail because of something else but the select + // operator here seems to fix everything that failed in release builds. + return f ? BTTTT() : BFFFF(); +#else + return BoolV(BOOL_TO_U32(f), BOOL_TO_U32(f), BOOL_TO_U32(f), BOOL_TO_U32(f)); +#endif +} + +PX_FORCE_INLINE Vec3V V3LoadA(const PxVec3& f) +{ + return Vec3V(f.x, f.y, f.z); +} + +PX_FORCE_INLINE Vec3V V3LoadU(const PxVec3& f) +{ + return Vec3V(f.x, f.y, f.z); +} + +PX_FORCE_INLINE Vec3V V3LoadUnsafeA(const PxVec3& f) +{ + return Vec3V(f.x, f.y, f.z); +} + +PX_FORCE_INLINE Vec3V V3LoadA(const PxF32* const f) +{ + return Vec3V(f[0], f[1], f[2]); +} + +PX_FORCE_INLINE Vec3V V3LoadU(const PxF32* const f) +{ + return Vec3V(f[0], f[1], f[2]); +} + +PX_FORCE_INLINE Vec3V Vec3V_From_Vec4V(Vec4V f) +{ + return Vec3V(f.x, f.y, f.z); +} + +PX_FORCE_INLINE Vec3V Vec3V_From_Vec4V_WUndefined(const Vec4V v) +{ + return Vec3V(v.x, v.y, v.z); +} + +PX_FORCE_INLINE Vec4V Vec4V_From_Vec3V(Vec3V f) +{ + return Vec4V(f.x, f.y, f.z, 0.0f); +} + +PX_FORCE_INLINE Vec4V Vec4V_From_FloatV(FloatV f) +{ + return Vec4V(f.x, f.x, f.x, f.x); +} + +PX_FORCE_INLINE Vec3V Vec3V_From_FloatV(FloatV f) +{ + return Vec3V(f.x, f.x, f.x); +} + +PX_FORCE_INLINE Vec3V Vec3V_From_FloatV_WUndefined(FloatV f) +{ + return Vec3V(f.x, f.x, f.x); +} + +PX_FORCE_INLINE Vec4V V4LoadA(const PxF32* const f) +{ + return Vec4V(f[0], f[1], f[2], f[3]); +} + +PX_FORCE_INLINE void V4StoreA(const Vec4V a, PxF32* f) +{ + *reinterpret_cast(f) = a; +} + +PX_FORCE_INLINE void V4StoreU(const Vec4V a, PxF32* f) +{ + *reinterpret_cast(f) = *reinterpret_cast(&a.x); +} + +PX_FORCE_INLINE void BStoreA(const BoolV a, PxU32* f) +{ + *reinterpret_cast(f) = a; +} + +PX_FORCE_INLINE void U4StoreA(const VecU32V uv, PxU32* u) +{ + *reinterpret_cast(u) = uv; +} + +PX_FORCE_INLINE void I4StoreA(const VecI32V iv, PxI32* i) +{ + *reinterpret_cast(i) = iv; +} + +PX_FORCE_INLINE Vec4V V4LoadU(const PxF32* const f) +{ + return Vec4V(f[0], f[1], f[2], f[3]); +} + +PX_FORCE_INLINE Vec4V Vec4V_From_PxVec3_WUndefined(const PxVec3& f) +{ + return Vec4V(f[0], f[1], f[2], 0.0f); +} + +PX_FORCE_INLINE BoolV BLoad(const bool* const f) +{ + return BoolV(BOOL_TO_U32(f[0]), BOOL_TO_U32(f[1]), BOOL_TO_U32(f[2]), BOOL_TO_U32(f[3])); +} + +PX_FORCE_INLINE void FStore(const FloatV a, PxF32* PX_RESTRICT f) +{ + *f = a.x; +} + +PX_FORCE_INLINE void V3StoreA(const Vec3V a, PxVec3& f) +{ + f = PxVec3(a.x, a.y, a.z); +} + +PX_FORCE_INLINE void V3StoreU(const Vec3V a, PxVec3& f) +{ + f = PxVec3(a.x, a.y, a.z); +} + +PX_FORCE_INLINE void Store_From_BoolV(const BoolV b, PxU32* b2) +{ + *b2 = b.ux; +} + +////////////////////////// +// FLOATV +////////////////////////// + +PX_FORCE_INLINE FloatV FZero() +{ + return FLoad(0.0f); +} + +PX_FORCE_INLINE FloatV FOne() +{ + return FLoad(1.0f); +} + +PX_FORCE_INLINE FloatV FHalf() +{ + return FLoad(0.5f); +} + +PX_FORCE_INLINE FloatV FEps() +{ + return FLoad(PX_EPS_REAL); +} + +PX_FORCE_INLINE FloatV FEps6() +{ + return FLoad(1e-6f); +} + +//! @cond +PX_FORCE_INLINE FloatV FMax() +{ + return FLoad(PX_MAX_REAL); +} +//! @endcond + +PX_FORCE_INLINE FloatV FNegMax() +{ + return FLoad(-PX_MAX_REAL); +} + +PX_FORCE_INLINE FloatV FNeg(const FloatV f) +{ + return FloatV(-f.x); +} + +PX_FORCE_INLINE FloatV FAdd(const FloatV a, const FloatV b) +{ + return FloatV(a.x + b.x); +} + +PX_FORCE_INLINE FloatV FSub(const FloatV a, const FloatV b) +{ + return FloatV(a.x - b.x); +} + +PX_FORCE_INLINE FloatV FMul(const FloatV a, const FloatV b) +{ + return FloatV(a.x * b.x); +} + +PX_FORCE_INLINE FloatV FDiv(const FloatV a, const FloatV b) +{ + VECMATHAOS_ASSERT(b.x != 0.0f); + return FloatV(a.x / b.x); +} + +PX_FORCE_INLINE FloatV FDivFast(const FloatV a, const FloatV b) +{ + VECMATHAOS_ASSERT(b.x != 0.0f); + return FloatV(a.x / b.x); +} + +PX_FORCE_INLINE FloatV FRecip(const FloatV a) +{ + VECMATHAOS_ASSERT(a.x != 0.0f); + return 1.0f / a.x; +} + +PX_FORCE_INLINE FloatV FRecipFast(const FloatV a) +{ + VECMATHAOS_ASSERT(a.x != 0.0f); + return 1.0f / a.x; +} + +PX_FORCE_INLINE FloatV FRsqrt(const FloatV a) +{ + VECMATHAOS_ASSERT(a.x != 0.0f); + return PxRecipSqrt(a.x); +} + +PX_FORCE_INLINE FloatV FSqrt(const FloatV a) +{ + return PxSqrt(a.x); +} + +PX_FORCE_INLINE FloatV FRsqrtFast(const FloatV a) +{ + VECMATHAOS_ASSERT(a.x != 0.0f); + return PxRecipSqrt(a.x); +} + +PX_FORCE_INLINE FloatV FScaleAdd(const FloatV a, const FloatV b, const FloatV c) +{ + return FAdd(FMul(a, b), c); +} + +PX_FORCE_INLINE FloatV FNegScaleSub(const FloatV a, const FloatV b, const FloatV c) +{ + return FSub(c, FMul(a, b)); +} + +PX_FORCE_INLINE FloatV FAbs(const FloatV a) +{ + return FloatV(PxAbs(a.x)); +} + +PX_FORCE_INLINE FloatV FSel(const BoolV c, const FloatV a, const FloatV b) +{ + return FloatV(c.ux ? a.x : b.x); +} + +PX_FORCE_INLINE BoolV FIsGrtr(const FloatV a, const FloatV b) +{ + return BLoad(a.x > b.x); +} + +PX_FORCE_INLINE BoolV FIsGrtrOrEq(const FloatV a, const FloatV b) +{ + return BLoad(a.x >= b.x); +} + +PX_FORCE_INLINE BoolV FIsEq(const FloatV a, const FloatV b) +{ + return BLoad(a.x == b.x); +} + +PX_FORCE_INLINE FloatV FMax(const FloatV a, const FloatV b) +{ + return (a.x > b.x ? FloatV(a.x) : FloatV(b.x)); +} + +PX_FORCE_INLINE FloatV FMin(const FloatV a, const FloatV b) +{ + return (a.x > b.x ? FloatV(b.x) : FloatV(a.x)); +} + +PX_FORCE_INLINE FloatV FClamp(const FloatV a, const FloatV minV, const FloatV maxV) +{ + return FMax(FMin(a, maxV), minV); +} + +PX_FORCE_INLINE PxU32 FAllGrtr(const FloatV a, const FloatV b) +{ + return BOOL_TO_U32(a.x > b.x); +} + +PX_FORCE_INLINE PxU32 FAllGrtrOrEq(const FloatV a, const FloatV b) +{ + return BOOL_TO_U32(a.x >= b.x); +} +PX_FORCE_INLINE PxU32 FAllEq(const FloatV a, const FloatV b) +{ + return BOOL_TO_U32(a.x == b.x); +} + +PX_FORCE_INLINE FloatV FRound(const FloatV a) +{ + return floorf(a.x + 0.5f); +} + +PX_FORCE_INLINE FloatV FSin(const FloatV a) +{ + return sinf(a.x); +} + +PX_FORCE_INLINE FloatV FCos(const FloatV a) +{ + return cosf(a.x); +} + +PX_FORCE_INLINE PxU32 FOutOfBounds(const FloatV a, const FloatV min, const FloatV max) +{ + return BOOL_TO_U32(a.x > max.x || a.x < min.x); +} + +PX_FORCE_INLINE PxU32 FInBounds(const FloatV a, const FloatV min, const FloatV max) +{ + return BOOL_TO_U32(a.x >= min.x && a.x <= max.x); +} + +PX_FORCE_INLINE PxU32 FOutOfBounds(const FloatV a, const FloatV bounds) +{ + return FOutOfBounds(a, FNeg(bounds), bounds); +} + +PX_FORCE_INLINE PxU32 FInBounds(const FloatV a, const FloatV bounds) +{ + return FInBounds(a, FNeg(bounds), bounds); +} + +///////////////////// +// VEC3V +///////////////////// + +PX_FORCE_INLINE Vec3V V3Splat(const FloatV f) +{ + return Vec3V(f.x, f.x, f.x); +} + +PX_FORCE_INLINE Vec3V V3Merge(const FloatVArg x, const FloatVArg y, const FloatVArg z) +{ + return Vec3V(x.x, y.x, z.x); +} + +PX_FORCE_INLINE Vec3V V3UnitX() +{ + return Vec3V(1.0f, 0.0f, 0.0f); +} + +PX_FORCE_INLINE Vec3V V3UnitY() +{ + return Vec3V(0.0f, 1.0f, 0.0f); +} + +PX_FORCE_INLINE Vec3V V3UnitZ() +{ + return Vec3V(0.0f, 0.0f, 1.0f); +} + +PX_FORCE_INLINE FloatV V3GetX(const Vec3V f) +{ + return FloatV(f.x); +} + +PX_FORCE_INLINE FloatV V3GetY(const Vec3V f) +{ + return FloatV(f.y); +} + +PX_FORCE_INLINE FloatV V3GetZ(const Vec3V f) +{ + return FloatV(f.z); +} + +PX_FORCE_INLINE Vec3V V3SetX(const Vec3V v, const FloatV f) +{ + return Vec3V(f.x, v.y, v.z); +} + +PX_FORCE_INLINE Vec3V V3SetY(const Vec3V v, const FloatV f) +{ + return Vec3V(v.x, f.x, v.z); +} + +PX_FORCE_INLINE Vec3V V3SetZ(const Vec3V v, const FloatV f) +{ + return Vec3V(v.x, v.y, f.x); +} + +PX_FORCE_INLINE Vec3V V3ColX(const Vec3V a, const Vec3V b, const Vec3V c) +{ + return Vec3V(a.x, b.x, c.x); +} + +PX_FORCE_INLINE Vec3V V3ColY(const Vec3V a, const Vec3V b, const Vec3V c) +{ + return Vec3V(a.y, b.y, c.y); +} + +PX_FORCE_INLINE Vec3V V3ColZ(const Vec3V a, const Vec3V b, const Vec3V c) +{ + return Vec3V(a.z, b.z, c.z); +} + +PX_FORCE_INLINE Vec3V V3Zero() +{ + return V3Load(0.0f); +} + +PX_FORCE_INLINE Vec3V V3One() +{ + return V3Load(1.0f); +} + +PX_FORCE_INLINE Vec3V V3Eps() +{ + return V3Load(PX_EPS_REAL); +} + +PX_FORCE_INLINE Vec3V V3Neg(const Vec3V c) +{ + return Vec3V(-c.x, -c.y, -c.z); +} + +PX_FORCE_INLINE Vec3V V3Add(const Vec3V a, const Vec3V b) +{ + return Vec3V(a.x + b.x, a.y + b.y, a.z + b.z); +} + +PX_FORCE_INLINE Vec3V V3Sub(const Vec3V a, const Vec3V b) +{ + return Vec3V(a.x - b.x, a.y - b.y, a.z - b.z); +} + +PX_FORCE_INLINE Vec3V V3Scale(const Vec3V a, const FloatV b) +{ + return Vec3V(a.x * b.x, a.y * b.x, a.z * b.x); +} + +PX_FORCE_INLINE Vec3V V3Mul(const Vec3V a, const Vec3V b) +{ + return Vec3V(a.x * b.x, a.y * b.y, a.z * b.z); +} + +PX_FORCE_INLINE Vec3V V3ScaleInv(const Vec3V a, const FloatV b) +{ + const PxF32 bInv = 1.0f / b.x; + return Vec3V(a.x * bInv, a.y * bInv, a.z * bInv); +} + +PX_FORCE_INLINE Vec3V V3Div(const Vec3V a, const Vec3V b) +{ + return Vec3V(a.x / b.x, a.y / b.y, a.z / b.z); +} + +PX_FORCE_INLINE Vec3V V3ScaleInvFast(const Vec3V a, const FloatV b) +{ + const PxF32 bInv = 1.0f / b.x; + return Vec3V(a.x * bInv, a.y * bInv, a.z * bInv); +} + +PX_FORCE_INLINE Vec3V V3DivFast(const Vec3V a, const Vec3V b) +{ + return Vec3V(a.x / b.x, a.y / b.y, a.z / b.z); +} + +PX_FORCE_INLINE Vec3V V3Recip(const Vec3V a) +{ + return Vec3V(1.0f / a.x, 1.0f / a.y, 1.0f / a.z); +} + +PX_FORCE_INLINE Vec3V V3RecipFast(const Vec3V a) +{ + return Vec3V(1.0f / a.x, 1.0f / a.y, 1.0f / a.z); +} + +PX_FORCE_INLINE Vec3V V3Rsqrt(const Vec3V a) +{ + return Vec3V(PxRecipSqrt(a.x), PxRecipSqrt(a.y), PxRecipSqrt(a.z)); +} + +PX_FORCE_INLINE Vec3V V3RsqrtFast(const Vec3V a) +{ + return Vec3V(PxRecipSqrt(a.x), PxRecipSqrt(a.y), PxRecipSqrt(a.z)); +} + +PX_FORCE_INLINE Vec3V V3ScaleAdd(const Vec3V a, const FloatV b, const Vec3V c) +{ + return V3Add(V3Scale(a, b), c); +} + +PX_FORCE_INLINE Vec3V V3NegScaleSub(const Vec3V a, const FloatV b, const Vec3V c) +{ + return V3Sub(c, V3Scale(a, b)); +} + +PX_FORCE_INLINE Vec3V V3MulAdd(const Vec3V a, const Vec3V b, const Vec3V c) +{ + return V3Add(V3Mul(a, b), c); +} + +PX_FORCE_INLINE Vec3V V3NegMulSub(const Vec3V a, const Vec3V b, const Vec3V c) +{ + return V3Sub(c, V3Mul(a, b)); +} + +PX_FORCE_INLINE FloatV V3Dot(const Vec3V a, const Vec3V b) +{ + return FloatV(a.x * b.x + a.y * b.y + a.z * b.z); +} + +PX_FORCE_INLINE VecCrossV V3PrepareCross(const Vec3VArg normal) +{ + return normal; +} + +PX_FORCE_INLINE Vec3V V3Cross(const Vec3V a, const Vec3V b) +{ + return Vec3V(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x); +} + +PX_FORCE_INLINE FloatV V3Length(const Vec3V a) +{ + return FloatV(PxSqrt(a.x * a.x + a.y * a.y + a.z * a.z)); +} + +PX_FORCE_INLINE FloatV V3LengthSq(const Vec3V a) +{ + return FloatV(a.x * a.x + a.y * a.y + a.z * a.z); +} + +PX_FORCE_INLINE Vec3V V3Normalize(const Vec3V a) +{ + VECMATHAOS_ASSERT(a.x != 0 || a.y != 0 || a.z != 0); + const PxF32 lengthInv = 1.0f / PxSqrt(a.x * a.x + a.y * a.y + a.z * a.z); + return Vec3V(a.x * lengthInv, a.y * lengthInv, a.z * lengthInv); +} + +PX_FORCE_INLINE Vec3V V3NormalizeSafe(const Vec3V a, const Vec3V unsafeReturnValue) +{ + const PxF32 length = PxSqrt(a.x * a.x + a.y * a.y + a.z * a.z); + if(PX_EPS_REAL >= length) + { + return unsafeReturnValue; + } + else + { + const PxF32 lengthInv = 1.0f / length; + return Vec3V(a.x * lengthInv, a.y * lengthInv, a.z * lengthInv); + } +} + +PX_FORCE_INLINE Vec3V V3NormalizeFast(const Vec3V a) +{ + VECMATHAOS_ASSERT(a.x != 0 || a.y != 0 || a.z != 0); + const PxF32 lengthInv = 1.0f / PxSqrt(a.x * a.x + a.y * a.y + a.z * a.z); + return Vec3V(a.x * lengthInv, a.y * lengthInv, a.z * lengthInv); +} + +PX_FORCE_INLINE Vec3V V3Sel(const BoolV c, const Vec3V a, const Vec3V b) +{ + return Vec3V(c.ux ? a.x : b.x, c.uy ? a.y : b.y, c.uz ? a.z : b.z); +} + +PX_FORCE_INLINE BoolV V3IsGrtr(const Vec3V a, const Vec3V b) +{ + return BoolV(BOOL_TO_U32(a.x > b.x), BOOL_TO_U32(a.y > b.y), BOOL_TO_U32(a.z > b.z), FALSE_TO_U32); +} + +PX_FORCE_INLINE BoolV V3IsGrtrOrEq(const Vec3V a, const Vec3V b) +{ + return BoolV(BOOL_TO_U32(a.x >= b.x), BOOL_TO_U32(a.y >= b.y), BOOL_TO_U32(a.z >= b.z), TRUE_TO_U32); +} + +PX_FORCE_INLINE BoolV V3IsEq(const Vec3V a, const Vec3V b) +{ + return BoolV(BOOL_TO_U32(a.x == b.x), BOOL_TO_U32(a.y == b.y), BOOL_TO_U32(a.z == b.z), TRUE_TO_U32); +} + +PX_FORCE_INLINE Vec3V V3Max(const Vec3V a, const Vec3V b) +{ + return Vec3V(a.x > b.x ? a.x : b.x, a.y > b.y ? a.y : b.y, a.z > b.z ? a.z : b.z); +} + +PX_FORCE_INLINE Vec3V V3Min(const Vec3V a, const Vec3V b) +{ + return Vec3V(a.x < b.x ? a.x : b.x, a.y < b.y ? a.y : b.y, a.z < b.z ? a.z : b.z); +} + +PX_FORCE_INLINE FloatV V3ExtractMax(const Vec3V a) +{ + const PxF32 t0 = (a.x >= a.y) ? a.x : a.y; + return t0 >= a.z ? t0 : a.z; +} + +PX_FORCE_INLINE FloatV V3ExtractMin(const Vec3V a) +{ + const PxF32 t0 = (a.x <= a.y) ? a.x : a.y; + return t0 <= a.z ? t0 : a.z; +} + +// return (a >= 0.0f) ? 1.0f : -1.0f; +PX_FORCE_INLINE Vec3V V3Sign(const Vec3V a) +{ + return Vec3V((a.x >= 0.f ? 1.f : -1.f), (a.y >= 0.f ? 1.f : -1.f), (a.z >= 0.f ? 1.f : -1.f)); +} + +PX_FORCE_INLINE Vec3V V3Clamp(const Vec3V a, const Vec3V minV, const Vec3V maxV) +{ + return V3Max(V3Min(a, maxV), minV); +} + +PX_FORCE_INLINE Vec3V V3Abs(const Vec3V a) +{ + return V3Max(a, V3Neg(a)); +} + +PX_FORCE_INLINE PxU32 V3AllGrtr(const Vec3V a, const Vec3V b) +{ + return BOOL_TO_U32((a.x > b.x) & (a.y > b.y) & (a.z > b.z)); +} + +PX_FORCE_INLINE PxU32 V3AllGrtrOrEq(const Vec3V a, const Vec3V b) +{ + return BOOL_TO_U32((a.x >= b.x) & (a.y >= b.y) & (a.z >= b.z)); +} + +PX_FORCE_INLINE PxU32 V3AllEq(const Vec3V a, const Vec3V b) +{ + return BOOL_TO_U32((a.x == b.x) & (a.y == b.y) & (a.z == b.z)); +} + +PX_FORCE_INLINE Vec3V V3Round(const Vec3V a) +{ + return Vec3V(floorf(a.x + 0.5f), floorf(a.y + 0.5f), floorf(a.z + 0.5f)); +} + +PX_FORCE_INLINE Vec3V V3Sin(const Vec3V a) +{ + return Vec3V(sinf(a.x), sinf(a.y), sinf(a.z)); +} + +PX_FORCE_INLINE Vec3V V3Cos(const Vec3V a) +{ + return Vec3V(cosf(a.x), cosf(a.y), cosf(a.z)); +} + +PX_FORCE_INLINE Vec3V V3PermYZZ(const Vec3V a) +{ + return Vec3V(a.y, a.z, a.z); +} + +PX_FORCE_INLINE Vec3V V3PermXYX(const Vec3V a) +{ + return Vec3V(a.x, a.y, a.x); +} + +PX_FORCE_INLINE Vec3V V3PermYZX(const Vec3V a) +{ + return Vec3V(a.y, a.z, a.x); +} + +PX_FORCE_INLINE Vec3V V3PermZXY(const Vec3V a) +{ + return Vec3V(a.z, a.x, a.y); +} + +PX_FORCE_INLINE Vec3V V3PermZZY(const Vec3V a) +{ + return Vec3V(a.z, a.z, a.y); +} + +PX_FORCE_INLINE Vec3V V3PermYXX(const Vec3V a) +{ + return Vec3V(a.y, a.x, a.x); +} + +PX_FORCE_INLINE Vec3V V3Perm_Zero_1Z_0Y(const Vec3V v0, const Vec3V v1) +{ + return Vec3V(0.0f, v1.z, v0.y); +} + +PX_FORCE_INLINE Vec3V V3Perm_0Z_Zero_1X(const Vec3V v0, const Vec3V v1) +{ + return Vec3V(v0.z, 0.0f, v1.x); +} + +PX_FORCE_INLINE Vec3V V3Perm_1Y_0X_Zero(const Vec3V v0, const Vec3V v1) +{ + return Vec3V(v1.y, v0.x, 0.0f); +} + +PX_FORCE_INLINE FloatV V3SumElems(const Vec3V a) +{ + return FloatV(a.x + a.y + a.z); +} + +PX_FORCE_INLINE PxU32 V3OutOfBounds(const Vec3V a, const Vec3V min, const Vec3V max) +{ + return BOOL_TO_U32(a.x > max.x || a.y > max.y || a.z > max.z || a.x < min.x || a.y < min.y || a.z < min.z); +} + +PX_FORCE_INLINE PxU32 V3InBounds(const Vec3V a, const Vec3V min, const Vec3V max) +{ + return BOOL_TO_U32(a.x <= max.x && a.y <= max.y && a.z <= max.z && a.x >= min.x && a.y >= min.y && a.z >= min.z); +} + +PX_FORCE_INLINE PxU32 V3OutOfBounds(const Vec3V a, const Vec3V bounds) +{ + return V3OutOfBounds(a, V3Neg(bounds), bounds); +} + +PX_FORCE_INLINE PxU32 V3InBounds(const Vec3V a, const Vec3V bounds) +{ + return V3InBounds(a, V3Neg(bounds), bounds); +} + +PX_FORCE_INLINE void V3Transpose(Vec3V& col0, Vec3V& col1, Vec3V& col2) +{ + const PxF32 t01 = col0.y, t02 = col0.z, t12 = col1.z; + col0.y = col1.x; + col0.z = col2.x; + col1.z = col2.y; + col1.x = t01; + col2.x = t02; + col2.y = t12; +} + +///////////////////////// +// VEC4V +///////////////////////// + +PX_FORCE_INLINE Vec4V V4Splat(const FloatV f) +{ + return Vec4V(f.x, f.x, f.x, f.x); +} + +PX_FORCE_INLINE Vec4V V4Merge(const FloatV* const floatVArray) +{ + return Vec4V(floatVArray[0].x, floatVArray[1].x, floatVArray[2].x, floatVArray[3].x); +} + +PX_FORCE_INLINE Vec4V V4Merge(const FloatVArg x, const FloatVArg y, const FloatVArg z, const FloatVArg w) +{ + return Vec4V(x.x, y.x, z.x, w.x); +} + +PX_FORCE_INLINE Vec4V V4MergeW(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w) +{ + return Vec4V(x.w, y.w, z.w, w.w); +} + +PX_FORCE_INLINE Vec4V V4MergeZ(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w) +{ + return Vec4V(x.z, y.z, z.z, w.z); +} + +PX_FORCE_INLINE Vec4V V4MergeY(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w) +{ + return Vec4V(x.y, y.y, z.y, w.y); +} + +PX_FORCE_INLINE Vec4V V4MergeX(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w) +{ + return Vec4V(x.x, y.x, z.x, w.x); +} + +PX_FORCE_INLINE Vec4V V4UnpackXY(const Vec4VArg a, const Vec4VArg b) +{ + return Vec4V(a.x, b.x, a.y, b.y); +} + +PX_FORCE_INLINE Vec4V V4UnpackZW(const Vec4VArg a, const Vec4VArg b) +{ + return Vec4V(a.z, b.z, a.w, b.w); +} + +PX_FORCE_INLINE Vec4V V4UnitX() +{ + return Vec4V(1.0f, 0.0f, 0.0f, 0.0f); +} + +PX_FORCE_INLINE Vec4V V4UnitY() +{ + return Vec4V(0.0f, 1.0f, 0.0f, 0.0f); +} + +PX_FORCE_INLINE Vec4V V4UnitZ() +{ + return Vec4V(0.0f, 0.0f, 1.0f, 0.0f); +} + +PX_FORCE_INLINE Vec4V V4UnitW() +{ + return Vec4V(0.0f, 0.0f, 0.0f, 1.0f); +} + +PX_FORCE_INLINE FloatV V4GetX(const Vec4V f) +{ + return FloatV(f.x); +} + +PX_FORCE_INLINE FloatV V4GetY(const Vec4V f) +{ + return FloatV(f.y); +} + +PX_FORCE_INLINE FloatV V4GetZ(const Vec4V f) +{ + return FloatV(f.z); +} + +PX_FORCE_INLINE FloatV V4GetW(const Vec4V f) +{ + return FloatV(f.w); +} + +PX_FORCE_INLINE Vec4V V4SetX(const Vec4V v, const FloatV f) +{ + return Vec4V(f.x, v.y, v.z, v.w); +} + +PX_FORCE_INLINE Vec4V V4SetY(const Vec4V v, const FloatV f) +{ + return Vec4V(v.x, f.x, v.z, v.w); +} + +PX_FORCE_INLINE Vec4V V4SetZ(const Vec4V v, const FloatV f) +{ + return Vec4V(v.x, v.y, f.x, v.w); +} + +PX_FORCE_INLINE Vec4V V4SetW(const Vec4V v, const FloatV f) +{ + return Vec4V(v.x, v.y, v.z, f.x); +} + +PX_FORCE_INLINE Vec4V V4SetW(const Vec3V v, const FloatV f) +{ + return Vec4V(v.x, v.y, v.z, f.x); +} + +PX_FORCE_INLINE Vec4V V4ClearW(const Vec4V v) +{ + return Vec4V(v.x, v.y, v.z, 0.0f); +} + +PX_FORCE_INLINE Vec4V V4PermYXWZ(const Vec4V v) +{ + return Vec4V(v.y, v.x, v.w, v.z); +} + +PX_FORCE_INLINE Vec4V V4PermXZXZ(const Vec4V v) +{ + return Vec4V(v.x, v.z, v.x, v.z); +} + +PX_FORCE_INLINE Vec4V V4PermYWYW(const Vec4V v) +{ + return Vec4V(v.y, v.w, v.y, v.w); +} + +PX_FORCE_INLINE Vec4V V4PermYZXW(const Vec4V v) +{ + return Vec4V(v.y, v.z, v.x, v.w); +} + +PX_FORCE_INLINE Vec4V V4PermZWXY(const Vec4V v) +{ + return Vec4V(v.z, v.w, v.x, v.y); +} + +template +PX_FORCE_INLINE Vec4V V4Perm(const Vec4V v) +{ + const PxF32 f[4] = { v.x, v.y, v.z, v.w }; + return Vec4V(f[_x], f[_y], f[_z], f[_w]); +} + +PX_FORCE_INLINE Vec4V V4Zero() +{ + return V4Load(0.0f); +} + +PX_FORCE_INLINE Vec4V V4One() +{ + return V4Load(1.0f); +} + +PX_FORCE_INLINE Vec4V V4Eps() +{ + return V4Load(PX_EPS_REAL); +} + +PX_FORCE_INLINE Vec4V V4Neg(const Vec4V c) +{ + return Vec4V(-c.x, -c.y, -c.z, -c.w); +} + +PX_FORCE_INLINE Vec4V V4Add(const Vec4V a, const Vec4V b) +{ + return Vec4V(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w); +} + +PX_FORCE_INLINE Vec4V V4Sub(const Vec4V a, const Vec4V b) +{ + return Vec4V(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w); +} + +PX_FORCE_INLINE Vec4V V4Scale(const Vec4V a, const FloatV b) +{ + return Vec4V(a.x * b.x, a.y * b.x, a.z * b.x, a.w * b.x); +} + +PX_FORCE_INLINE Vec4V V4Mul(const Vec4V a, const Vec4V b) +{ + return Vec4V(a.x * b.x, a.y * b.y, a.z * b.z, a.w * b.w); +} + +PX_FORCE_INLINE Vec4V V4ScaleInv(const Vec4V a, const FloatV b) +{ + const PxF32 bInv = 1.0f / b.x; + return Vec4V(a.x * bInv, a.y * bInv, a.z * bInv, a.w * bInv); +} + +PX_FORCE_INLINE Vec4V V4Div(const Vec4V a, const Vec4V b) +{ + VECMATHAOS_ASSERT(b.x != 0 && b.y != 0 && b.z != 0 && b.w != 0); + return Vec4V(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w); +} + +PX_FORCE_INLINE Vec4V V4ScaleInvFast(const Vec4V a, const FloatV b) +{ + const PxF32 bInv = 1.0f / b.x; + return Vec4V(a.x * bInv, a.y * bInv, a.z * bInv, a.w * bInv); +} + +PX_FORCE_INLINE Vec4V V4DivFast(const Vec4V a, const Vec4V b) +{ + return Vec4V(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w); +} + +PX_FORCE_INLINE Vec4V V4Recip(const Vec4V a) +{ + return Vec4V(1.0f / a.x, 1.0f / a.y, 1.0f / a.z, 1.0f / a.w); +} + +PX_FORCE_INLINE Vec4V V4RecipFast(const Vec4V a) +{ + return Vec4V(1.0f / a.x, 1.0f / a.y, 1.0f / a.z, 1.0f / a.w); +} + +PX_FORCE_INLINE Vec4V V4Rsqrt(const Vec4V a) +{ + return Vec4V(PxRecipSqrt(a.x), PxRecipSqrt(a.y), PxRecipSqrt(a.z), PxRecipSqrt(a.w)); +} + +PX_FORCE_INLINE Vec4V V4RsqrtFast(const Vec4V a) +{ + return Vec4V(PxRecipSqrt(a.x), PxRecipSqrt(a.y), PxRecipSqrt(a.z), PxRecipSqrt(a.w)); +} + +PX_FORCE_INLINE Vec4V V4Sqrt(const Vec4V a) +{ + return Vec4V(PxSqrt(a.x), PxSqrt(a.y), PxSqrt(a.z), PxSqrt(a.w)); +} + +PX_FORCE_INLINE Vec4V V4ScaleAdd(const Vec4V a, const FloatV b, const Vec4V c) +{ + return V4Add(V4Scale(a, b), c); +} + +PX_FORCE_INLINE Vec4V V4NegScaleSub(const Vec4V a, const FloatV b, const Vec4V c) +{ + return V4Sub(c, V4Scale(a, b)); +} + +PX_FORCE_INLINE Vec4V V4MulAdd(const Vec4V a, const Vec4V b, const Vec4V c) +{ + return V4Add(V4Mul(a, b), c); +} + +PX_FORCE_INLINE Vec4V V4NegMulSub(const Vec4V a, const Vec4V b, const Vec4V c) +{ + return V4Sub(c, V4Mul(a, b)); +} + +PX_FORCE_INLINE FloatV V4SumElements(const Vec4V a) +{ + return FloatV(a.x + a.y + a.z + a.w); +} + +PX_FORCE_INLINE FloatV V4Dot(const Vec4V a, const Vec4V b) +{ + return FloatV(a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w); +} + +PX_FORCE_INLINE FloatV V4Dot3(const Vec4V a, const Vec4V b) +{ + return FloatV(a.x * b.x + a.y * b.y + a.z * b.z); +} + +PX_FORCE_INLINE Vec4V V4Cross(const Vec4V a, const Vec4V b) +{ + return Vec4V(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x, 0.0f); +} + +PX_FORCE_INLINE FloatV V4Length(const Vec4V a) +{ + return FloatV(PxSqrt(a.x * a.x + a.y * a.y + a.z * a.z + a.w * a.w)); +} + +PX_FORCE_INLINE FloatV V4LengthSq(const Vec4V a) +{ + return V4Dot(a, a); +} + +PX_FORCE_INLINE Vec4V V4Normalize(const Vec4V a) +{ + VECMATHAOS_ASSERT(0 != a.x || 0 != a.y || 0 != a.z || 0 != a.w); + const FloatV length = FloatV(V4Length(a)); + return V4ScaleInv(a, length); +} + +PX_FORCE_INLINE Vec4V V4NormalizeSafe(const Vec4V a, const Vec4V unsafeReturnValue) +{ + const FloatV length = FloatV(V4Length(a)); + if(PX_EPS_REAL >= length.x) + { + return unsafeReturnValue; + } + else + { + return V4ScaleInv(a, length); + } +} +PX_FORCE_INLINE Vec4V V4NormalizeFast(const Vec4V a) +{ + VECMATHAOS_ASSERT(0 != a.x || 0 != a.y || 0 != a.z || 0 != a.w); + const FloatV length = FloatV(V4Length(a)); + return V4ScaleInv(a, length); +} + +PX_FORCE_INLINE Vec4V V4Sel(const BoolV c, const Vec4V a, const Vec4V b) +{ + return Vec4V(c.ux ? a.x : b.x, c.uy ? a.y : b.y, c.uz ? a.z : b.z, c.uw ? a.w : b.w); +} + +PX_FORCE_INLINE BoolV V4IsGrtr(const Vec4V a, const Vec4V b) +{ + return BoolV(BOOL_TO_U32(a.x > b.x), BOOL_TO_U32(a.y > b.y), BOOL_TO_U32(a.z > b.z), BOOL_TO_U32(a.w > b.w)); +} + +PX_FORCE_INLINE BoolV V4IsGrtrOrEq(const Vec4V a, const Vec4V b) +{ + return BoolV(BOOL_TO_U32(a.x >= b.x), BOOL_TO_U32(a.y >= b.y), BOOL_TO_U32(a.z >= b.z), BOOL_TO_U32(a.w >= b.w)); +} + +PX_FORCE_INLINE BoolV V4IsEq(const Vec4V a, const Vec4V b) +{ + return BoolV(BOOL_TO_U32(a.x == b.x), BOOL_TO_U32(a.y == b.y), BOOL_TO_U32(a.z == b.z), BOOL_TO_U32(a.w == b.w)); +} + +PX_FORCE_INLINE Vec4V V4Max(const Vec4V a, const Vec4V b) +{ + return Vec4V(a.x > b.x ? a.x : b.x, a.y > b.y ? a.y : b.y, a.z > b.z ? a.z : b.z, a.w > b.w ? a.w : b.w); +} + +PX_FORCE_INLINE Vec4V V4Min(const Vec4V a, const Vec4V b) +{ + return Vec4V(a.x < b.x ? a.x : b.x, a.y < b.y ? a.y : b.y, a.z < b.z ? a.z : b.z, a.w < b.w ? a.w : b.w); +} + +PX_FORCE_INLINE FloatV V4ExtractMax(const Vec4V a) +{ + const PxF32 t0 = (a.x >= a.y) ? a.x : a.y; + const PxF32 t1 = (a.z >= a.w) ? a.x : a.w; + return t0 >= t1 ? t0 : t1; +} + +PX_FORCE_INLINE FloatV V4ExtractMin(const Vec4V a) +{ + const PxF32 t0 = (a.x <= a.y) ? a.x : a.y; + const PxF32 t1 = (a.z <= a.w) ? a.x : a.w; + return t0 <= t1 ? t0 : t1; +} + +PX_FORCE_INLINE Vec4V V4Clamp(const Vec4V a, const Vec4V minV, const Vec4V maxV) +{ + return V4Max(V4Min(a, maxV), minV); +} + +PX_FORCE_INLINE Vec4V V4Round(const Vec4V a) +{ + return Vec4V(floorf(a.x + 0.5f), floorf(a.y + 0.5f), floorf(a.z + 0.5f), floorf(a.w + 0.5f)); +} + +PX_FORCE_INLINE Vec4V V4Sin(const Vec4V a) +{ + return Vec4V(sinf(a.x), sinf(a.y), sinf(a.z), sinf(a.w)); +} + +PX_FORCE_INLINE Vec4V V4Cos(const Vec4V a) +{ + return Vec4V(cosf(a.x), cosf(a.y), cosf(a.z), cosf(a.w)); +} + +PX_FORCE_INLINE PxU32 V4AllGrtr(const Vec4V a, const Vec4V b) +{ + return BOOL_TO_U32((a.x > b.x) & (a.y > b.y) & (a.z > b.z) & (a.w > b.w)); +} + +PX_FORCE_INLINE PxU32 V4AllGrtrOrEq(const Vec4V a, const Vec4V b) +{ + return BOOL_TO_U32((a.x >= b.x) & (a.y >= b.y) & (a.z >= b.z) & (a.w >= b.w)); +} + +PX_FORCE_INLINE PxU32 V4AllGrtrOrEq3(const Vec4V a, const Vec4V b) +{ + return BOOL_TO_U32((a.x >= b.x) & (a.y >= b.y) & (a.z >= b.z)); +} + +PX_FORCE_INLINE PxU32 V4AllEq(const Vec4V a, const Vec4V b) +{ + return BOOL_TO_U32((a.x == b.x) & (a.y == b.y) & (a.z == b.z) & (a.w == b.w)); +} + +PX_FORCE_INLINE PxU32 V4AnyGrtr3(const Vec4V a, const Vec4V b) +{ + return BOOL_TO_U32((a.x > b.x) | (a.y > b.y) | (a.z > b.z)); +} + +PX_FORCE_INLINE void V4Transpose(Vec4V& col0, Vec4V& col1, Vec4V& col2, Vec4V& col3) +{ + const PxF32 t01 = col0.y, t02 = col0.z, t03 = col0.w; + const PxF32 t12 = col1.z, t13 = col1.w; + const PxF32 t23 = col2.w; + col0.y = col1.x; + col0.z = col2.x; + col0.w = col3.x; + col1.z = col2.y; + col1.w = col3.y; + col2.w = col3.z; + col1.x = t01; + col2.x = t02; + col3.x = t03; + col2.y = t12; + col3.y = t13; + col3.z = t23; +} + +PX_FORCE_INLINE BoolV BFFFF() +{ + return BoolV(FALSE_TO_U32, FALSE_TO_U32, FALSE_TO_U32, FALSE_TO_U32); +} +PX_FORCE_INLINE BoolV BFFFT() +{ + return BoolV(FALSE_TO_U32, FALSE_TO_U32, FALSE_TO_U32, TRUE_TO_U32); +} +PX_FORCE_INLINE BoolV BFFTF() +{ + return BoolV(FALSE_TO_U32, FALSE_TO_U32, TRUE_TO_U32, FALSE_TO_U32); +} +PX_FORCE_INLINE BoolV BFFTT() +{ + return BoolV(FALSE_TO_U32, FALSE_TO_U32, TRUE_TO_U32, TRUE_TO_U32); +} +PX_FORCE_INLINE BoolV BFTFF() +{ + return BoolV(FALSE_TO_U32, TRUE_TO_U32, FALSE_TO_U32, FALSE_TO_U32); +} +PX_FORCE_INLINE BoolV BFTFT() +{ + return BoolV(FALSE_TO_U32, TRUE_TO_U32, FALSE_TO_U32, TRUE_TO_U32); +} +PX_FORCE_INLINE BoolV BFTTF() +{ + return BoolV(FALSE_TO_U32, TRUE_TO_U32, TRUE_TO_U32, FALSE_TO_U32); +} +PX_FORCE_INLINE BoolV BFTTT() +{ + return BoolV(FALSE_TO_U32, TRUE_TO_U32, TRUE_TO_U32, TRUE_TO_U32); +} +PX_FORCE_INLINE BoolV BTFFF() +{ + return BoolV(TRUE_TO_U32, FALSE_TO_U32, FALSE_TO_U32, FALSE_TO_U32); +} +PX_FORCE_INLINE BoolV BTFFT() +{ + return BoolV(TRUE_TO_U32, FALSE_TO_U32, FALSE_TO_U32, TRUE_TO_U32); +} +PX_FORCE_INLINE BoolV BTFTF() +{ + return BoolV(TRUE_TO_U32, FALSE_TO_U32, TRUE_TO_U32, FALSE_TO_U32); +} +PX_FORCE_INLINE BoolV BTFTT() +{ + return BoolV(TRUE_TO_U32, FALSE_TO_U32, TRUE_TO_U32, TRUE_TO_U32); +} +PX_FORCE_INLINE BoolV BTTFF() +{ + return BoolV(TRUE_TO_U32, TRUE_TO_U32, FALSE_TO_U32, FALSE_TO_U32); +} +PX_FORCE_INLINE BoolV BTTFT() +{ + return BoolV(TRUE_TO_U32, TRUE_TO_U32, FALSE_TO_U32, TRUE_TO_U32); +} +PX_FORCE_INLINE BoolV BTTTF() +{ + return BoolV(TRUE_TO_U32, TRUE_TO_U32, TRUE_TO_U32, FALSE_TO_U32); +} +PX_FORCE_INLINE BoolV BTTTT() +{ + return BoolV(TRUE_TO_U32, TRUE_TO_U32, TRUE_TO_U32, TRUE_TO_U32); +} + +PX_FORCE_INLINE BoolV BXMask() +{ + return BTFFF(); +} +PX_FORCE_INLINE BoolV BYMask() +{ + return BFTFF(); +} +PX_FORCE_INLINE BoolV BZMask() +{ + return BFFTF(); +} +PX_FORCE_INLINE BoolV BWMask() +{ + return BFFFT(); +} + +PX_FORCE_INLINE BoolV BGetX(const BoolV a) +{ + return BoolV(a.ux, a.ux, a.ux, a.ux); +} + +PX_FORCE_INLINE BoolV BGetY(const BoolV a) +{ + return BoolV(a.uy, a.uy, a.uy, a.uy); +} + +PX_FORCE_INLINE BoolV BGetZ(const BoolV a) +{ + return BoolV(a.uz, a.uz, a.uz, a.uz); +} + +PX_FORCE_INLINE BoolV BGetW(const BoolV a) +{ + return BoolV(a.uw, a.uw, a.uw, a.uw); +} + +PX_FORCE_INLINE BoolV BSetX(const BoolV v, const BoolV f) +{ + return BoolV(f.ux, v.uy, v.uz, v.uw); +} + +PX_FORCE_INLINE BoolV BSetY(const BoolV v, const BoolV f) +{ + return BoolV(v.ux, f.uy, v.uz, v.uw); +} + +PX_FORCE_INLINE BoolV BSetZ(const BoolV v, const BoolV f) +{ + return BoolV(v.ux, v.uy, f.uz, v.uw); +} + +PX_FORCE_INLINE BoolV BSetW(const BoolV v, const BoolV f) +{ + return BoolV(v.ux, v.uy, v.uz, f.uw); +} + +template +BoolV BSplatElement(BoolV a) +{ + PxU32* b = reinterpret_cast(&a); + return BoolV(b[index], b[index], b[index], b[index]); +} + +PX_FORCE_INLINE BoolV BAnd(const BoolV a, const BoolV b) +{ + return BoolV(BOOL_TO_U32(a.ux && b.ux), BOOL_TO_U32(a.uy && b.uy), BOOL_TO_U32(a.uz && b.uz), BOOL_TO_U32(a.uw && b.uw)); +} + +PX_FORCE_INLINE BoolV BAndNot(const BoolV a, const BoolV b) +{ + return BoolV(a.ux & ~b.ux, a.uy & ~b.uy, a.uz & ~b.uz, a.uw & ~b.uw); +} + +PX_FORCE_INLINE BoolV BNot(const BoolV a) +{ + return BoolV(~a.ux, ~a.uy, ~a.uz, ~a.uw); +} + +PX_FORCE_INLINE BoolV BOr(const BoolV a, const BoolV b) +{ + return BoolV(BOOL_TO_U32(a.ux || b.ux), BOOL_TO_U32(a.uy || b.uy), BOOL_TO_U32(a.uz || b.uz), BOOL_TO_U32(a.uw || b.uw)); +} + +PX_FORCE_INLINE PxU32 BAllEq(const BoolV a, const BoolV b) +{ + return (a.ux == b.ux && a.uy == b.uy && a.uz == b.uz && a.uw == b.uw ? 1 : 0); +} + +PX_FORCE_INLINE PxU32 BAllEqTTTT(const BoolV a) +{ + return BAllEq(a, BTTTT()); +} + +PX_FORCE_INLINE PxU32 BAllEqFFFF(const BoolV a) +{ + return BAllEq(a, BFFFF()); +} + +PX_FORCE_INLINE BoolV BAllTrue4(const BoolV a) +{ + return (a.ux & a.uy & a.uz & a.uw) ? BTTTT() : BFFFF(); +} + +PX_FORCE_INLINE BoolV BAnyTrue4(const BoolV a) +{ + return (a.ux | a.uy | a.uz | a.uw) ? BTTTT() : BFFFF(); +} + +PX_FORCE_INLINE BoolV BAllTrue3(const BoolV a) +{ + return (a.ux & a.uy & a.uz) ? BTTTT() : BFFFF(); +} + +PX_FORCE_INLINE BoolV BAnyTrue3(const BoolV a) +{ + return (a.ux | a.uy | a.uz) ? BTTTT() : BFFFF(); +} + +PX_FORCE_INLINE PxU32 BGetBitMask(const BoolV a) +{ + return (a.ux & 1) | (a.uy & 2) | (a.uz & 4) | (a.uw & 8); +} + +////////////////////////////////// +// MAT33V +////////////////////////////////// + +PX_FORCE_INLINE Vec3V M33MulV3(const Mat33V& a, const Vec3V b) +{ + return Vec3V(a.col0.x * b.x + a.col1.x * b.y + a.col2.x * b.z, a.col0.y * b.x + a.col1.y * b.y + a.col2.y * b.z, + a.col0.z * b.x + a.col1.z * b.y + a.col2.z * b.z); +} + +PX_FORCE_INLINE Vec3V M33TrnspsMulV3(const Mat33V& a, const Vec3V b) +{ + return Vec3V(a.col0.x * b.x + a.col0.y * b.y + a.col0.z * b.z, a.col1.x * b.x + a.col1.y * b.y + a.col1.z * b.z, + a.col2.x * b.x + a.col2.y * b.y + a.col2.z * b.z); +} + +PX_FORCE_INLINE Vec3V M33MulV3AddV3(const Mat33V& A, const Vec3V b, const Vec3V c) +{ + const FloatV x = V3GetX(b); + const FloatV y = V3GetY(b); + const FloatV z = V3GetZ(b); + Vec3V result = V3ScaleAdd(A.col0, x, c); + result = V3ScaleAdd(A.col1, y, result); + return V3ScaleAdd(A.col2, z, result); +} + +PX_FORCE_INLINE Mat33V M33MulM33(const Mat33V& a, const Mat33V& b) +{ + return Mat33V(M33MulV3(a, b.col0), M33MulV3(a, b.col1), M33MulV3(a, b.col2)); +} + +PX_FORCE_INLINE Mat33V M33Add(const Mat33V& a, const Mat33V& b) +{ + return Mat33V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2)); +} + +PX_FORCE_INLINE Mat33V M33Scale(const Mat33V& a, const FloatV& b) +{ + return Mat33V(V3Scale(a.col0, b), V3Scale(a.col1, b), V3Scale(a.col2, b)); +} + +PX_FORCE_INLINE Mat33V M33Sub(const Mat33V& a, const Mat33V& b) +{ + return Mat33V(V3Sub(a.col0, b.col0), V3Sub(a.col1, b.col1), V3Sub(a.col2, b.col2)); +} + +PX_FORCE_INLINE Mat33V M33Neg(const Mat33V& a) +{ + return Mat33V(V3Neg(a.col0), V3Neg(a.col1), V3Neg(a.col2)); +} + +PX_FORCE_INLINE Mat33V M33Abs(const Mat33V& a) +{ + return Mat33V(V3Abs(a.col0), V3Abs(a.col1), V3Abs(a.col2)); +} + +PX_FORCE_INLINE Mat33V M33Diagonal(const Vec3VArg d) +{ + const Vec3V x = V3Mul(V3UnitX(), d); + const Vec3V y = V3Mul(V3UnitY(), d); + const Vec3V z = V3Mul(V3UnitZ(), d); + return Mat33V(x, y, z); +} + +PX_FORCE_INLINE Mat33V M33Inverse(const Mat33V& a) +{ + const PxF32 det = a.col0.x * (a.col1.y * a.col2.z - a.col1.z * a.col2.y) - + a.col1.x * (a.col0.y * a.col2.z - a.col2.y * a.col0.z) + + a.col2.x * (a.col0.y * a.col1.z - a.col1.y * a.col0.z); + + const PxF32 invDet = 1.0f / det; + + Mat33V ret; + ret.col0.x = invDet * (a.col1.y * a.col2.z - a.col2.y * a.col1.z); + ret.col0.y = invDet * (a.col2.y * a.col0.z - a.col0.y * a.col2.z); + ret.col0.z = invDet * (a.col0.y * a.col1.z - a.col1.y * a.col0.z); + + ret.col1.x = invDet * (a.col2.x * a.col1.z - a.col1.x * a.col2.z); + ret.col1.y = invDet * (a.col0.x * a.col2.z - a.col2.x * a.col0.z); + ret.col1.z = invDet * (a.col1.x * a.col0.z - a.col0.x * a.col1.z); + + ret.col2.x = invDet * (a.col1.x * a.col2.y - a.col2.x * a.col1.y); + ret.col2.y = invDet * (a.col2.x * a.col0.y - a.col0.x * a.col2.y); + ret.col2.z = invDet * (a.col0.x * a.col1.y - a.col1.x * a.col0.y); + + return ret; +} + +PX_FORCE_INLINE Mat33V Mat33V_From_PxMat33(const PxMat33& m) +{ + return Mat33V(V3LoadU(m.column0), V3LoadU(m.column1), V3LoadU(m.column2)); +} + +PX_FORCE_INLINE void PxMat33_From_Mat33V(const Mat33V& m, PxMat33& out) +{ + PX_ASSERT((size_t(&out) & 15) == 0); + V3StoreU(m.col0, out.column0); + V3StoreU(m.col1, out.column1); + V3StoreU(m.col2, out.column2); +} + +PX_FORCE_INLINE Mat33V M33Trnsps(const Mat33V& a) +{ + return Mat33V(Vec3V(a.col0.x, a.col1.x, a.col2.x), Vec3V(a.col0.y, a.col1.y, a.col2.y), + Vec3V(a.col0.z, a.col1.z, a.col2.z)); +} + +PX_FORCE_INLINE Mat33V M33Identity() +{ + return Mat33V(V3UnitX(), V3UnitY(), V3UnitZ()); +} + +////////////////////////////////// +// MAT34V +////////////////////////////////// + +PX_FORCE_INLINE Vec3V M34MulV3(const Mat34V& a, const Vec3V b) +{ + return Vec3V(a.col0.x * b.x + a.col1.x * b.y + a.col2.x * b.z + a.col3.x, + a.col0.y * b.x + a.col1.y * b.y + a.col2.y * b.z + a.col3.y, + a.col0.z * b.x + a.col1.z * b.y + a.col2.z * b.z + a.col3.z); +} + +PX_FORCE_INLINE Vec3V M34Mul33V3(const Mat34V& a, const Vec3V b) +{ + return Vec3V(a.col0.x * b.x + a.col1.x * b.y + a.col2.x * b.z, a.col0.y * b.x + a.col1.y * b.y + a.col2.y * b.z, + a.col0.z * b.x + a.col1.z * b.y + a.col2.z * b.z); +} + +PX_FORCE_INLINE Vec3V M34TrnspsMul33V3(const Mat34V& a, const Vec3V b) +{ + return Vec3V(a.col0.x * b.x + a.col0.y * b.y + a.col0.z * b.z, a.col1.x * b.x + a.col1.y * b.y + a.col1.z * b.z, + a.col2.x * b.x + a.col2.y * b.y + a.col2.z * b.z); +} + +PX_FORCE_INLINE Mat34V M34MulM34(const Mat34V& a, const Mat34V& b) +{ + return Mat34V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2), M34MulV3(a, b.col3)); +} + +PX_FORCE_INLINE Mat33V M34MulM33(const Mat34V& a, const Mat33V& b) +{ + return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2)); +} + +PX_FORCE_INLINE Mat33V M34Mul33V3(const Mat34V& a, const Mat33V& b) +{ + return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2)); +} + +PX_FORCE_INLINE Mat33V M34Mul33MM34(const Mat34V& a, const Mat34V& b) +{ + return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2)); +} + +PX_FORCE_INLINE Mat34V M34Add(const Mat34V& a, const Mat34V& b) +{ + return Mat34V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2), V3Add(a.col3, b.col3)); +} + +PX_FORCE_INLINE Mat33V M34Trnsps33(const Mat34V& a) +{ + return Mat33V(Vec3V(a.col0.x, a.col1.x, a.col2.x), Vec3V(a.col0.y, a.col1.y, a.col2.y), + Vec3V(a.col0.z, a.col1.z, a.col2.z)); +} + +////////////////////////////////// +// MAT44V +////////////////////////////////// + +PX_FORCE_INLINE Vec4V M44MulV4(const Mat44V& a, const Vec4V b) +{ + return Vec4V(a.col0.x * b.x + a.col1.x * b.y + a.col2.x * b.z + a.col3.x * b.w, + a.col0.y * b.x + a.col1.y * b.y + a.col2.y * b.z + a.col3.y * b.w, + a.col0.z * b.x + a.col1.z * b.y + a.col2.z * b.z + a.col3.z * b.w, + a.col0.w * b.x + a.col1.w * b.y + a.col2.w * b.z + a.col3.w * b.w); +} + +PX_FORCE_INLINE Vec4V M44TrnspsMulV4(const Mat44V& a, const Vec4V b) +{ + return Vec4V(a.col0.x * b.x + a.col0.y * b.y + a.col0.z * b.z + a.col0.w * b.w, + a.col1.x * b.x + a.col1.y * b.y + a.col1.z * b.z + a.col1.w * b.w, + a.col2.x * b.x + a.col2.y * b.y + a.col2.z * b.z + a.col2.w * b.w, + a.col3.x * b.x + a.col3.y * b.y + a.col3.z * b.z + a.col3.w * b.w); +} + +PX_FORCE_INLINE Mat44V M44MulM44(const Mat44V& a, const Mat44V& b) +{ + return Mat44V(M44MulV4(a, b.col0), M44MulV4(a, b.col1), M44MulV4(a, b.col2), M44MulV4(a, b.col3)); +} + +PX_FORCE_INLINE Mat44V M44Add(const Mat44V& a, const Mat44V& b) +{ + return Mat44V(V4Add(a.col0, b.col0), V4Add(a.col1, b.col1), V4Add(a.col2, b.col2), V4Add(a.col3, b.col3)); +} + +PX_FORCE_INLINE Mat44V M44Inverse(const Mat44V& a) +{ + PxF32 tmp[12]; + PxF32 dst[16]; + PxF32 det; + + const PxF32 src[16] = { a.col0.x, a.col0.y, a.col0.z, a.col0.w, a.col1.x, a.col1.y, a.col1.z, a.col1.w, + a.col2.x, a.col2.y, a.col2.z, a.col2.w, a.col3.x, a.col3.y, a.col3.z, a.col3.w }; + + tmp[0] = src[10] * src[15]; + tmp[1] = src[11] * src[14]; + tmp[2] = src[9] * src[15]; + tmp[3] = src[11] * src[13]; + tmp[4] = src[9] * src[14]; + tmp[5] = src[10] * src[13]; + tmp[6] = src[8] * src[15]; + tmp[7] = src[11] * src[12]; + tmp[8] = src[8] * src[14]; + tmp[9] = src[10] * src[12]; + tmp[10] = src[8] * src[13]; + tmp[11] = src[9] * src[12]; + + dst[0] = tmp[0] * src[5] + tmp[3] * src[6] + tmp[4] * src[7]; + dst[0] -= tmp[1] * src[5] + tmp[2] * src[6] + tmp[5] * src[7]; + dst[1] = tmp[1] * src[4] + tmp[6] * src[6] + tmp[9] * src[7]; + dst[1] -= tmp[0] * src[4] + tmp[7] * src[6] + tmp[8] * src[7]; + dst[2] = tmp[2] * src[4] + tmp[7] * src[5] + tmp[10] * src[7]; + dst[2] -= tmp[3] * src[4] + tmp[6] * src[5] + tmp[11] * src[7]; + dst[3] = tmp[5] * src[4] + tmp[8] * src[5] + tmp[11] * src[6]; + dst[3] -= tmp[4] * src[4] + tmp[9] * src[5] + tmp[10] * src[6]; + dst[4] = tmp[1] * src[1] + tmp[2] * src[2] + tmp[5] * src[3]; + dst[4] -= tmp[0] * src[1] + tmp[3] * src[2] + tmp[4] * src[3]; + dst[5] = tmp[0] * src[0] + tmp[7] * src[2] + tmp[8] * src[3]; + dst[5] -= tmp[1] * src[0] + tmp[6] * src[2] + tmp[9] * src[3]; + dst[6] = tmp[3] * src[0] + tmp[6] * src[1] + tmp[11] * src[3]; + dst[6] -= tmp[2] * src[0] + tmp[7] * src[1] + tmp[10] * src[3]; + dst[7] = tmp[4] * src[0] + tmp[9] * src[1] + tmp[10] * src[2]; + dst[7] -= tmp[5] * src[0] + tmp[8] * src[1] + tmp[11] * src[2]; + + tmp[0] = src[2] * src[7]; + tmp[1] = src[3] * src[6]; + tmp[2] = src[1] * src[7]; + tmp[3] = src[3] * src[5]; + tmp[4] = src[1] * src[6]; + tmp[5] = src[2] * src[5]; + tmp[6] = src[0] * src[7]; + tmp[7] = src[3] * src[4]; + tmp[8] = src[0] * src[6]; + tmp[9] = src[2] * src[4]; + tmp[10] = src[0] * src[5]; + tmp[11] = src[1] * src[4]; + + dst[8] = tmp[0] * src[13] + tmp[3] * src[14] + tmp[4] * src[15]; + dst[8] -= tmp[1] * src[13] + tmp[2] * src[14] + tmp[5] * src[15]; + dst[9] = tmp[1] * src[12] + tmp[6] * src[14] + tmp[9] * src[15]; + dst[9] -= tmp[0] * src[12] + tmp[7] * src[14] + tmp[8] * src[15]; + dst[10] = tmp[2] * src[12] + tmp[7] * src[13] + tmp[10] * src[15]; + dst[10] -= tmp[3] * src[12] + tmp[6] * src[13] + tmp[11] * src[15]; + dst[11] = tmp[5] * src[12] + tmp[8] * src[13] + tmp[11] * src[14]; + dst[11] -= tmp[4] * src[12] + tmp[9] * src[13] + tmp[10] * src[14]; + dst[12] = tmp[2] * src[10] + tmp[5] * src[11] + tmp[1] * src[9]; + dst[12] -= tmp[4] * src[11] + tmp[0] * src[9] + tmp[3] * src[10]; + dst[13] = tmp[8] * src[11] + tmp[0] * src[8] + tmp[7] * src[10]; + dst[13] -= tmp[6] * src[10] + tmp[9] * src[11] + tmp[1] * src[8]; + dst[14] = tmp[6] * src[9] + tmp[11] * src[11] + tmp[3] * src[8]; + dst[14] -= tmp[10] * src[11] + tmp[2] * src[8] + tmp[7] * src[9]; + dst[15] = tmp[10] * src[10] + tmp[4] * src[8] + tmp[9] * src[9]; + dst[15] -= tmp[8] * src[9] + tmp[11] * src[10] + tmp[5] * src[8]; + + det = src[0] * dst[0] + src[1] * dst[1] + src[2] * dst[2] + src[3] * dst[3]; + + det = 1.0f / det; + for(PxU32 j = 0; j < 16; j++) + { + dst[j] *= det; + } + + return Mat44V(Vec4V(dst[0], dst[4], dst[8], dst[12]), Vec4V(dst[1], dst[5], dst[9], dst[13]), + Vec4V(dst[2], dst[6], dst[10], dst[14]), Vec4V(dst[3], dst[7], dst[11], dst[15])); +} + +PX_FORCE_INLINE Mat44V M44Trnsps(const Mat44V& a) +{ + return Mat44V(Vec4V(a.col0.x, a.col1.x, a.col2.x, a.col3.x), Vec4V(a.col0.y, a.col1.y, a.col2.y, a.col3.y), + Vec4V(a.col0.z, a.col1.z, a.col2.z, a.col3.z), Vec4V(a.col0.w, a.col1.w, a.col2.w, a.col3.w)); +} + +PX_FORCE_INLINE Vec4V V4LoadXYZW(const PxF32& x, const PxF32& y, const PxF32& z, const PxF32& w) +{ + return Vec4V(x, y, z, w); +} + +/* +PX_FORCE_INLINE VecU16V V4U32PK(VecU32V a, VecU32V b) +{ + return VecU16V( + PxU16(PxClamp((a).u32[0], 0, 0xFFFF)), + PxU16(PxClamp((a).u32[1], 0, 0xFFFF)), + PxU16(PxClamp((a).u32[2], 0, 0xFFFF)), + PxU16(PxClamp((a).u32[3], 0, 0xFFFF)), + PxU16(PxClamp((b).u32[0], 0, 0xFFFF)), + PxU16(PxClamp((b).u32[1], 0, 0xFFFF)), + PxU16(PxClamp((b).u32[2], 0, 0xFFFF)), + PxU16(PxClamp((b).u32[3], 0, 0xFFFF))); +} +*/ + +PX_FORCE_INLINE VecU32V V4U32Sel(const BoolV c, const VecU32V a, const VecU32V b) +{ + return VecU32V(c.ux ? a.u32[0] : b.u32[0], c.uy ? a.u32[1] : b.u32[1], c.uz ? a.u32[2] : b.u32[2], + c.uw ? a.u32[3] : b.u32[3]); +} + +PX_FORCE_INLINE VecU32V V4U32or(VecU32V a, VecU32V b) +{ + return VecU32V((a).u32[0] | (b).u32[0], (a).u32[1] | (b).u32[1], (a).u32[2] | (b).u32[2], (a).u32[3] | (b).u32[3]); +} + +PX_FORCE_INLINE VecU32V V4U32xor(VecU32V a, VecU32V b) +{ + return VecU32V((a).u32[0] ^ (b).u32[0], (a).u32[1] ^ (b).u32[1], (a).u32[2] ^ (b).u32[2], (a).u32[3] ^ (b).u32[3]); +} + +PX_FORCE_INLINE VecU32V V4U32and(VecU32V a, VecU32V b) +{ + return VecU32V((a).u32[0] & (b).u32[0], (a).u32[1] & (b).u32[1], (a).u32[2] & (b).u32[2], (a).u32[3] & (b).u32[3]); +} + +PX_FORCE_INLINE VecU32V V4U32Andc(VecU32V a, VecU32V b) +{ + return VecU32V((a).u32[0] & ~(b).u32[0], (a).u32[1] & ~(b).u32[1], (a).u32[2] & ~(b).u32[2], + (a).u32[3] & ~(b).u32[3]); +} + +/* +PX_FORCE_INLINE VecU16V V4U16Or(VecU16V a, VecU16V b) +{ + return VecU16V( + (a).u16[0]|(b).u16[0], (a).u16[1]|(b).u16[1], (a).u16[2]|(b).u16[2], (a).u16[3]|(b).u16[3], + (a).u16[4]|(b).u16[4], (a).u16[5]|(b).u16[5], (a).u16[6]|(b).u16[6], (a).u16[7]|(b).u16[7]); +} +*/ + +/* +PX_FORCE_INLINE VecU16V V4U16And(VecU16V a, VecU16V b) +{ + return VecU16V( + (a).u16[0]&(b).u16[0], (a).u16[1]&(b).u16[1], (a).u16[2]&(b).u16[2], (a).u16[3]&(b).u16[3], + (a).u16[4]&(b).u16[4], (a).u16[5]&(b).u16[5], (a).u16[6]&(b).u16[6], (a).u16[7]&(b).u16[7]); +} +*/ + +/* +PX_FORCE_INLINE VecU16V V4U16Andc(VecU16V a, VecU16V b) +{ + return VecU16V( + (a).u16[0]&~(b).u16[0], (a).u16[1]&~(b).u16[1], (a).u16[2]&~(b).u16[2], (a).u16[3]&~(b).u16[3], + (a).u16[4]&~(b).u16[4], (a).u16[5]&~(b).u16[5], (a).u16[6]&~(b).u16[6], (a).u16[7]&~(b).u16[7]); +} +*/ + +/* +template PX_FORCE_INLINE VecI32V V4ISplat() +{ + return VecI32V(a, a, a, a); +} + +template PX_FORCE_INLINE VecU32V V4USplat() +{ + return VecU32V(a, a, a, a); +} +*/ + +/* +PX_FORCE_INLINE void V4U16StoreAligned(VecU16V val, VecU16V* address) +{ + *address = val; +} +*/ + +PX_FORCE_INLINE void V4U32StoreAligned(VecU32V val, VecU32V* address) +{ + *address = val; +} + +PX_FORCE_INLINE Vec4V V4Andc(const Vec4V a, const VecU32V b) +{ + VecU32V r = V4U32Andc(*reinterpret_cast(&a), b); + return (*reinterpret_cast(&r)); +} + +PX_FORCE_INLINE VecU32V V4IsGrtrV32u(const Vec4V a, const Vec4V b) +{ + return VecU32V(a.x > b.x ? 0xFFFFffff : 0, a.y > b.y ? 0xFFFFffff : 0, a.z > b.z ? 0xFFFFffff : 0, + a.w > b.w ? 0xFFFFffff : 0); +} + +PX_FORCE_INLINE VecU16V V4U16LoadAligned(VecU16V* addr) +{ + return *addr; +} + +PX_FORCE_INLINE VecU16V V4U16LoadUnaligned(VecU16V* addr) +{ + return *addr; +} + +PX_FORCE_INLINE VecU16V V4U16CompareGt(VecU16V a, VecU16V b) +{ + return VecU16V + ( + BOOL_TO_U16(a.u16[0] > b.u16[0]), BOOL_TO_U16(a.u16[1] > b.u16[1]), BOOL_TO_U16(a.u16[2] > b.u16[2]), BOOL_TO_U16(a.u16[3] > b.u16[3]), + BOOL_TO_U16(a.u16[4] > b.u16[4]), BOOL_TO_U16(a.u16[5] > b.u16[5]), BOOL_TO_U16(a.u16[6] > b.u16[6]), BOOL_TO_U16(a.u16[7] > b.u16[7]) + ); +} + +PX_FORCE_INLINE VecU16V V4I16CompareGt(VecU16V a, VecU16V b) +{ + return VecU16V + ( + BOOL_TO_U16(a.i16[0] > b.i16[0]), BOOL_TO_U16(a.i16[1] > b.i16[1]), BOOL_TO_U16(a.i16[2] > b.i16[2]), BOOL_TO_U16(a.i16[3] > b.i16[3]), + BOOL_TO_U16(a.i16[4] > b.i16[4]), BOOL_TO_U16(a.i16[5] > b.i16[5]), BOOL_TO_U16(a.i16[6] > b.i16[6]), BOOL_TO_U16(a.i16[7] > b.i16[7]) + ); +} + +PX_FORCE_INLINE Vec4V Vec4V_From_VecU32V(VecU32V a) +{ + return Vec4V(PxF32((a).u32[0]), PxF32((a).u32[1]), PxF32((a).u32[2]), PxF32((a).u32[3])); +} + +PX_FORCE_INLINE Vec4V Vec4V_From_VecI32V(VecI32V a) +{ + return Vec4V(PxF32((a).i32[0]), PxF32((a).i32[1]), PxF32((a).i32[2]), PxF32((a).i32[3])); +} + +PX_FORCE_INLINE VecI32V VecI32V_From_Vec4V(Vec4V a) +{ + float* data = reinterpret_cast(&a); + return VecI32V(PxI32(data[0]), PxI32(data[1]), PxI32(data[2]), PxI32(data[3])); +} + +PX_FORCE_INLINE Vec4V Vec4V_ReinterpretFrom_VecU32V(VecU32V a) +{ + Vec4V b = *reinterpret_cast(&a); + return b; +} + +PX_FORCE_INLINE Vec4V Vec4V_ReinterpretFrom_VecI32V(VecI32V a) +{ + Vec4V b = *reinterpret_cast(&a); + return b; +} + +PX_FORCE_INLINE VecU32V VecU32V_ReinterpretFrom_Vec4V(Vec4V a) +{ + VecU32V b = *reinterpret_cast(&a); + return b; +} + +PX_FORCE_INLINE VecI32V VecI32V_ReinterpretFrom_Vec4V(Vec4V a) +{ + VecI32V b = *reinterpret_cast(&a); + return b; +} + +template +PX_FORCE_INLINE VecU32V V4U32SplatElement(VecU32V a) +{ + return VecU32V((a).u32[index], (a).u32[index], (a).u32[index], (a).u32[index]); +} + +template +PX_FORCE_INLINE VecU32V V4U32SplatElement(BoolV a) +{ + const PxU32 u = (&a.ux)[index]; + return VecU32V(u, u, u, u); +} + +template +PX_FORCE_INLINE Vec4V V4SplatElement(Vec4V a) +{ + float* data = reinterpret_cast(&a); + return Vec4V(data[index], data[index], data[index], data[index]); +} + +PX_FORCE_INLINE VecU32V U4LoadXYZW(PxU32 x, PxU32 y, PxU32 z, PxU32 w) +{ + return VecU32V(x, y, z, w); +} + +PX_FORCE_INLINE Vec4V V4Abs(const Vec4V a) +{ + return V4Max(a, V4Neg(a)); +} + +PX_FORCE_INLINE BoolV V4IsEqU32(const VecU32V a, const VecU32V b) +{ + return BoolV(BOOL_TO_U32(a.u32[0] == b.u32[0]), BOOL_TO_U32(a.u32[1] == b.u32[1]), BOOL_TO_U32(a.u32[2] == b.u32[2]), BOOL_TO_U32(a.u32[3] == b.u32[3])); +} + +PX_FORCE_INLINE VecU32V U4Load(const PxU32 i) +{ + return VecU32V(i, i, i, i); +} + +PX_FORCE_INLINE VecU32V U4LoadU(const PxU32* i) +{ + return VecU32V(i[0], i[1], i[2], i[3]); +} + +PX_FORCE_INLINE VecU32V U4LoadA(const PxU32* i) +{ + return VecU32V(i[0], i[1], i[2], i[3]); +} + +PX_FORCE_INLINE VecI32V I4LoadXYZW(const PxI32& x, const PxI32& y, const PxI32& z, const PxI32& w) +{ + return VecI32V(x, y, z, w); +} + +PX_FORCE_INLINE VecI32V I4Load(const PxI32 i) +{ + return VecI32V(i, i, i, i); +} + +PX_FORCE_INLINE VecI32V I4LoadU(const PxI32* i) +{ + return VecI32V(i[0], i[1], i[2], i[3]); +} + +PX_FORCE_INLINE VecI32V I4LoadA(const PxI32* i) +{ + return VecI32V(i[0], i[1], i[2], i[3]); +} + +PX_FORCE_INLINE VecI32V VecI32V_Add(const VecI32VArg a, const VecI32VArg b) +{ + return VecI32V(a.i32[0] + b.i32[0], a.i32[1] + b.i32[1], a.i32[2] + b.i32[2], a.i32[3] + b.i32[3]); +} + +PX_FORCE_INLINE VecI32V VecI32V_Sub(const VecI32VArg a, const VecI32VArg b) +{ + return VecI32V(a.i32[0] - b.i32[0], a.i32[1] - b.i32[1], a.i32[2] - b.i32[2], a.i32[3] - b.i32[3]); +} + +PX_FORCE_INLINE BoolV VecI32V_IsGrtr(const VecI32VArg a, const VecI32VArg b) +{ + return BoolV(BOOL_TO_U32(a.i32[0] > b.i32[0]), BOOL_TO_U32(a.i32[1] > b.i32[1]), BOOL_TO_U32(a.i32[2] > b.i32[2]), BOOL_TO_U32(a.i32[3] > b.i32[3])); +} + +PX_FORCE_INLINE BoolV VecI32V_IsEq(const VecI32VArg a, const VecI32VArg b) +{ + return BoolV(BOOL_TO_U32(a.i32[0] == b.i32[0]), BOOL_TO_U32(a.i32[1] == b.i32[1]), BOOL_TO_U32(a.i32[2] == b.i32[2]), BOOL_TO_U32(a.i32[3] == b.i32[3])); +} + +PX_FORCE_INLINE VecI32V V4I32Sel(const BoolV c, const VecI32V a, const VecI32V b) +{ + return VecI32V(c.ux ? a.i32[0] : b.i32[0], c.uy ? a.i32[1] : b.i32[1], c.uz ? a.i32[2] : b.i32[2], + c.uw ? a.i32[3] : b.i32[3]); +} + +PX_FORCE_INLINE VecI32V VecI32V_Zero() +{ + return VecI32V(0, 0, 0, 0); +} + +PX_FORCE_INLINE VecI32V VecI32V_One() +{ + return VecI32V(1, 1, 1, 1); +} + +PX_FORCE_INLINE VecI32V VecI32V_Two() +{ + return VecI32V(2, 2, 2, 2); +} + +PX_FORCE_INLINE VecI32V VecI32V_MinusOne() +{ + return VecI32V(-1, -1, -1, -1); +} + +PX_FORCE_INLINE VecU32V U4Zero() +{ + return VecU32V(0, 0, 0, 0); +} + +PX_FORCE_INLINE VecU32V U4One() +{ + return VecU32V(1, 1, 1, 1); +} + +PX_FORCE_INLINE VecU32V U4Two() +{ + return VecU32V(2, 2, 2, 2); +} + +PX_FORCE_INLINE VecShiftV VecI32V_PrepareShift(const VecI32VArg shift) +{ + return shift; +} + +PX_FORCE_INLINE VecI32V VecI32V_LeftShift(const VecI32VArg a, const VecShiftVArg count) +{ + return VecI32V(a.i32[0] << count.i32[0], a.i32[1] << count.i32[1], a.i32[2] << count.i32[2], a.i32[3] + << count.i32[3]); +} + +PX_FORCE_INLINE VecI32V VecI32V_RightShift(const VecI32VArg a, const VecShiftVArg count) +{ + return VecI32V(a.i32[0] >> count.i32[0], a.i32[1] >> count.i32[1], a.i32[2] >> count.i32[2], + a.i32[3] >> count.i32[3]); +} + +PX_FORCE_INLINE VecI32V VecI32V_LeftShift(const VecI32VArg a, const PxU32 count) +{ + return VecI32V(a.i32[0] << count, a.i32[1] << count, a.i32[2] << count, a.i32[3] << count); +} + +PX_FORCE_INLINE VecI32V VecI32V_RightShift(const VecI32VArg a, const PxU32 count) +{ + return VecI32V(a.i32[0] >> count, a.i32[1] >> count, a.i32[2] >> count, a.i32[3] >> count); +} + +PX_FORCE_INLINE VecI32V VecI32V_And(const VecI32VArg a, const VecI32VArg b) +{ + return VecI32V(a.i32[0] & b.i32[0], a.i32[1] & b.i32[1], a.i32[2] & b.i32[2], a.i32[3] & b.i32[3]); +} + +PX_FORCE_INLINE VecI32V VecI32V_Or(const VecI32VArg a, const VecI32VArg b) +{ + return VecI32V(a.i32[0] | b.i32[0], a.i32[1] | b.i32[1], a.i32[2] | b.i32[2], a.i32[3] | b.i32[3]); +} + +PX_FORCE_INLINE VecI32V VecI32V_GetX(const VecI32VArg a) +{ + return VecI32V(a.i32[0], a.i32[0], a.i32[0], a.i32[0]); +} + +PX_FORCE_INLINE VecI32V VecI32V_GetY(const VecI32VArg a) +{ + return VecI32V(a.i32[1], a.i32[1], a.i32[1], a.i32[1]); +} + +PX_FORCE_INLINE VecI32V VecI32V_GetZ(const VecI32VArg a) +{ + return VecI32V(a.i32[2], a.i32[2], a.i32[2], a.i32[2]); +} + +PX_FORCE_INLINE VecI32V VecI32V_GetW(const VecI32VArg a) +{ + return VecI32V(a.i32[3], a.i32[3], a.i32[3], a.i32[3]); +} + +PX_FORCE_INLINE VecI32V VecI32V_Sel(const BoolV c, const VecI32VArg a, const VecI32VArg b) +{ + return VecI32V(c.ux ? a.i32[0] : b.i32[0], c.uy ? a.i32[1] : b.i32[1], c.uz ? a.i32[2] : b.i32[2], + c.uw ? a.i32[3] : b.i32[3]); +} + +PX_FORCE_INLINE VecI32V VecI32V_Merge(const VecI32VArg a, const VecI32VArg b, const VecI32VArg c, const VecI32VArg d) +{ + return VecI32V(a.i32[0], b.i32[0], c.i32[0], d.i32[0]); +} + +PX_FORCE_INLINE void PxI32_From_VecI32V(const VecI32VArg a, PxI32* i) +{ + *i = a.i32[0]; +} + +PX_FORCE_INLINE VecI32V VecI32V_From_BoolV(const BoolVArg b) +{ + return VecI32V(PxI32(b.ux), PxI32(b.uy), PxI32(b.uz), PxI32(b.uw)); +} + +PX_FORCE_INLINE VecU32V VecU32V_From_BoolV(const BoolVArg b) +{ + return VecU32V(b.ux, b.uy, b.uz, b.uw); +} + +PX_FORCE_INLINE void QuatGetMat33V(const QuatVArg q, Vec3V& column0, Vec3V& column1, Vec3V& column2) +{ + const FloatV one = FOne(); + const FloatV x = V4GetX(q); + const FloatV y = V4GetY(q); + const FloatV z = V4GetZ(q); + const FloatV w = V4GetW(q); + + const FloatV x2 = FAdd(x, x); + const FloatV y2 = FAdd(y, y); + const FloatV z2 = FAdd(z, z); + + const FloatV xx = FMul(x2, x); + const FloatV yy = FMul(y2, y); + const FloatV zz = FMul(z2, z); + + const FloatV xy = FMul(x2, y); + const FloatV xz = FMul(x2, z); + const FloatV xw = FMul(x2, w); + + const FloatV yz = FMul(y2, z); + const FloatV yw = FMul(y2, w); + const FloatV zw = FMul(z2, w); + + const FloatV v = FSub(one, xx); + + column0 = V3Merge(FSub(FSub(one, yy), zz), FAdd(xy, zw), FSub(xz, yw)); + column1 = V3Merge(FSub(xy, zw), FSub(v, zz), FAdd(yz, xw)); + column2 = V3Merge(FAdd(xz, yw), FSub(yz, xw), FSub(v, yy)); +} + + +// not used + +/* +PX_FORCE_INLINE Vec4V V4LoadAligned(Vec4V* addr) +{ + return *addr; +} +*/ + +/* +PX_FORCE_INLINE Vec4V V4LoadUnaligned(Vec4V* addr) +{ + return *addr; +} +*/ + +/* +PX_FORCE_INLINE Vec4V V4Ceil(const Vec4V a) +{ + return Vec4V(PxCeil(a.x), PxCeil(a.y), PxCeil(a.z), PxCeil(a.w)); +} + +PX_FORCE_INLINE Vec4V V4Floor(const Vec4V a) +{ + return Vec4V(PxFloor(a.x), PxFloor(a.y), PxFloor(a.z), PxFloor(a.w)); +} +*/ + +/* +PX_FORCE_INLINE VecU32V V4ConvertToU32VSaturate(const Vec4V a, PxU32 power) +{ + PX_ASSERT(power == 0 && "Non-zero power not supported in convertToU32VSaturate"); + PX_UNUSED(power); // prevent warning in release builds + PxF32 ffffFFFFasFloat = PxF32(0xFFFF0000); + return VecU32V( + PxU32(PxClamp((a).x, 0.0f, ffffFFFFasFloat)), + PxU32(PxClamp((a).y, 0.0f, ffffFFFFasFloat)), + PxU32(PxClamp((a).z, 0.0f, ffffFFFFasFloat)), + PxU32(PxClamp((a).w, 0.0f, ffffFFFFasFloat))); +} +*/ + +} // namespace aos +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxVecMathSSE.h b/Source/ThirdParty/PhysX/foundation/PxVecMathSSE.h new file mode 100644 index 000000000..0b0aaa924 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxVecMathSSE.h @@ -0,0 +1,68 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_VEC_MATH_SSE_H +#define PX_VEC_MATH_SSE_H + +#if !PX_DOXYGEN +namespace physx +{ +#endif +namespace aos +{ + +namespace +{ + const PX_ALIGN(16, PxF32) minus1w[4] = { 0.0f, 0.0f, 0.0f, -1.0f }; +} + +PX_FORCE_INLINE void QuatGetMat33V(const QuatVArg q, Vec3V& column0, Vec3V& column1, Vec3V& column2) +{ + const __m128 q2 = V4Add(q, q); + const __m128 qw2 = V4MulAdd(q2, V4GetW(q), _mm_load_ps(minus1w)); // (2wx, 2wy, 2wz, 2ww-1) + const __m128 nw2 = Vec3V_From_Vec4V(V4Neg(qw2)); // (-2wx, -2wy, -2wz, 0) + const __m128 v = Vec3V_From_Vec4V(q); + + const __m128 a0 = _mm_shuffle_ps(qw2, nw2, _MM_SHUFFLE(3, 1, 2, 3)); // (2ww-1, 2wz, -2wy, 0) + column0 = V4MulAdd(v, V4GetX(q2), a0); + + const __m128 a1 = _mm_shuffle_ps(qw2, nw2, _MM_SHUFFLE(3, 2, 0, 3)); // (2ww-1, 2wx, -2wz, 0) + column1 = V4MulAdd(v, V4GetY(q2), _mm_shuffle_ps(a1, a1, _MM_SHUFFLE(3, 1, 0, 2))); + + const __m128 a2 = _mm_shuffle_ps(qw2, nw2, _MM_SHUFFLE(3, 0, 1, 3)); // (2ww-1, 2wy, -2wx, 0) + column2 = V4MulAdd(v, V4GetZ(q2), _mm_shuffle_ps(a2, a2, _MM_SHUFFLE(3, 0, 2, 1))); +} + +} // namespace aos +#if !PX_DOXYGEN +} // namespace physx +#endif + + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/PxVecQuat.h b/Source/ThirdParty/PhysX/foundation/PxVecQuat.h new file mode 100644 index 000000000..1c6d04a31 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxVecQuat.h @@ -0,0 +1,473 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_VEC_QUAT_H +#define PX_VEC_QUAT_H + +#if !PX_DOXYGEN +namespace physx +{ +#endif +namespace aos +{ + +#ifndef PX_PIDIV2 +#define PX_PIDIV2 1.570796327f +#endif + +////////////////////////////////// +// QuatV +////////////////////////////////// +PX_FORCE_INLINE QuatV QuatVLoadXYZW(const PxF32 x, const PxF32 y, const PxF32 z, const PxF32 w) +{ + return V4LoadXYZW(x, y, z, w); +} + +PX_FORCE_INLINE QuatV QuatVLoadU(const PxF32* v) +{ + return V4LoadU(v); +} + +PX_FORCE_INLINE QuatV QuatVLoadA(const PxF32* v) +{ + return V4LoadA(v); +} + +PX_FORCE_INLINE QuatV QuatV_From_RotationAxisAngle(const Vec3V u, const FloatV a) +{ + // q = cos(a/2) + u*sin(a/2) + const FloatV half = FLoad(0.5f); + const FloatV hangle = FMul(a, half); + const FloatV piByTwo(FLoad(PX_PIDIV2)); + const FloatV PiByTwoMinHangle(FSub(piByTwo, hangle)); + const Vec4V hangle2(Vec4V_From_Vec3V(V3Merge(hangle, PiByTwoMinHangle, hangle))); + + /*const FloatV sina = FSin(hangle); + const FloatV cosa = FCos(hangle);*/ + + const Vec4V _sina = V4Sin(hangle2); + const FloatV sina = V4GetX(_sina); + const FloatV cosa = V4GetY(_sina); + + const Vec3V v = V3Scale(u, sina); + // return V4Sel(BTTTF(), Vec4V_From_Vec3V(v), V4Splat(cosa)); + return V4SetW(Vec4V_From_Vec3V(v), cosa); +} + +// Normalize +PX_FORCE_INLINE QuatV QuatNormalize(const QuatV q) +{ + return V4Normalize(q); +} + +PX_FORCE_INLINE FloatV QuatLength(const QuatV q) +{ + return V4Length(q); +} + +PX_FORCE_INLINE FloatV QuatLengthSq(const QuatV q) +{ + return V4LengthSq(q); +} + +PX_FORCE_INLINE FloatV QuatDot(const QuatV a, const QuatV b) // convert this PxQuat to a unit quaternion +{ + return V4Dot(a, b); +} + +PX_FORCE_INLINE QuatV QuatConjugate(const QuatV q) +{ + return V4SetW(V4Neg(q), V4GetW(q)); +} + +PX_FORCE_INLINE Vec3V QuatGetImaginaryPart(const QuatV q) +{ + return Vec3V_From_Vec4V(q); +} + +/** brief computes rotation of x-axis */ +PX_FORCE_INLINE Vec3V QuatGetBasisVector0(const QuatV q) +{ + /*const PxF32 x2 = x*2.0f; + const PxF32 w2 = w*2.0f; + return PxVec3( (w * w2) - 1.0f + x*x2, + (z * w2) + y*x2, + (-y * w2) + z*x2);*/ + + const FloatV two = FLoad(2.f); + const FloatV w = V4GetW(q); + const Vec3V u = Vec3V_From_Vec4V(q); + + const FloatV x2 = FMul(V3GetX(u), two); + const FloatV w2 = FMul(w, two); + + const Vec3V a = V3Scale(u, x2); + const Vec3V tmp = V3Merge(w, V3GetZ(u), FNeg(V3GetY(u))); + // const Vec3V b = V3Scale(tmp, w2); + // const Vec3V ab = V3Add(a, b); + const Vec3V ab = V3ScaleAdd(tmp, w2, a); + return V3SetX(ab, FSub(V3GetX(ab), FOne())); +} + +/** brief computes rotation of y-axis */ +PX_FORCE_INLINE Vec3V QuatGetBasisVector1(const QuatV q) +{ + /*const PxF32 y2 = y*2.0f; + const PxF32 w2 = w*2.0f; + return PxVec3( (-z * w2) + x*y2, + (w * w2) - 1.0f + y*y2, + (x * w2) + z*y2);*/ + + const FloatV two = FLoad(2.f); + const FloatV w = V4GetW(q); + const Vec3V u = Vec3V_From_Vec4V(q); + + const FloatV y2 = FMul(V3GetY(u), two); + const FloatV w2 = FMul(w, two); + + const Vec3V a = V3Scale(u, y2); + const Vec3V tmp = V3Merge(FNeg(V3GetZ(u)), w, V3GetX(u)); + // const Vec3V b = V3Scale(tmp, w2); + // const Vec3V ab = V3Add(a, b); + const Vec3V ab = V3ScaleAdd(tmp, w2, a); + return V3SetY(ab, FSub(V3GetY(ab), FOne())); +} + +/** brief computes rotation of z-axis */ +PX_FORCE_INLINE Vec3V QuatGetBasisVector2(const QuatV q) +{ + /*const PxF32 z2 = z*2.0f; + const PxF32 w2 = w*2.0f; + return PxVec3( (y * w2) + x*z2, + (-x * w2) + y*z2, + (w * w2) - 1.0f + z*z2);*/ + + const FloatV two = FLoad(2.f); + const FloatV w = V4GetW(q); + const Vec3V u = Vec3V_From_Vec4V(q); + + const FloatV z2 = FMul(V3GetZ(u), two); + const FloatV w2 = FMul(w, two); + + const Vec3V a = V3Scale(u, z2); + const Vec3V tmp = V3Merge(V3GetY(u), FNeg(V3GetX(u)), w); + /*const Vec3V b = V3Scale(tmp, w2); + const Vec3V ab = V3Add(a, b);*/ + const Vec3V ab = V3ScaleAdd(tmp, w2, a); + return V3SetZ(ab, FSub(V3GetZ(ab), FOne())); +} + +PX_FORCE_INLINE Vec3V QuatRotate(const QuatV q, const Vec3V v) +{ + /* + const PxVec3 qv(x,y,z); + return (v*(w*w-0.5f) + (qv.cross(v))*w + qv*(qv.dot(v)))*2; + */ + + const FloatV two = FLoad(2.f); + // const FloatV half = FloatV_From_F32(0.5f); + const FloatV nhalf = FLoad(-0.5f); + const Vec3V u = Vec3V_From_Vec4V(q); + const FloatV w = V4GetW(q); + // const FloatV w2 = FSub(FMul(w, w), half); + const FloatV w2 = FScaleAdd(w, w, nhalf); + const Vec3V a = V3Scale(v, w2); + // const Vec3V b = V3Scale(V3Cross(u, v), w); + // const Vec3V c = V3Scale(u, V3Dot(u, v)); + // return V3Scale(V3Add(V3Add(a, b), c), two); + const Vec3V temp = V3ScaleAdd(V3Cross(u, v), w, a); + return V3Scale(V3ScaleAdd(u, V3Dot(u, v), temp), two); +} + +PX_FORCE_INLINE Vec3V QuatTransform(const QuatV q, const Vec3V p, const Vec3V v) +{ + // p + q.rotate(v) + const FloatV two = FLoad(2.f); + // const FloatV half = FloatV_From_F32(0.5f); + const FloatV nhalf = FLoad(-0.5f); + const Vec3V u = Vec3V_From_Vec4V(q); + const FloatV w = V4GetW(q); + // const FloatV w2 = FSub(FMul(w, w), half); + const FloatV w2 = FScaleAdd(w, w, nhalf); + const Vec3V a = V3Scale(v, w2); + /*const Vec3V b = V3Scale(V3Cross(u, v), w); + const Vec3V c = V3Scale(u, V3Dot(u, v)); + return V3ScaleAdd(V3Add(V3Add(a, b), c), two, p);*/ + const Vec3V temp = V3ScaleAdd(V3Cross(u, v), w, a); + const Vec3V z = V3ScaleAdd(u, V3Dot(u, v), temp); + return V3ScaleAdd(z, two, p); +} + +PX_FORCE_INLINE Vec3V QuatRotateInv(const QuatV q, const Vec3V v) +{ + + // const PxVec3 qv(x,y,z); + // return (v*(w*w-0.5f) - (qv.cross(v))*w + qv*(qv.dot(v)))*2; + + const FloatV two = FLoad(2.f); + const FloatV nhalf = FLoad(-0.5f); + const Vec3V u = Vec3V_From_Vec4V(q); + const FloatV w = V4GetW(q); + const FloatV w2 = FScaleAdd(w, w, nhalf); + const Vec3V a = V3Scale(v, w2); + /*const Vec3V b = V3Scale(V3Cross(u, v), w); + const Vec3V c = V3Scale(u, V3Dot(u, v)); + return V3Scale(V3Add(V3Sub(a, b), c), two);*/ + const Vec3V temp = V3NegScaleSub(V3Cross(u, v), w, a); + return V3Scale(V3ScaleAdd(u, V3Dot(u, v), temp), two); +} + +PX_FORCE_INLINE QuatV QuatMul(const QuatV a, const QuatV b) +{ + const Vec3V imagA = Vec3V_From_Vec4V(a); + const Vec3V imagB = Vec3V_From_Vec4V(b); + const FloatV rA = V4GetW(a); + const FloatV rB = V4GetW(b); + + const FloatV real = FSub(FMul(rA, rB), V3Dot(imagA, imagB)); + const Vec3V v0 = V3Scale(imagA, rB); + const Vec3V v1 = V3Scale(imagB, rA); + const Vec3V v2 = V3Cross(imagA, imagB); + const Vec3V imag = V3Add(V3Add(v0, v1), v2); + + return V4SetW(Vec4V_From_Vec3V(imag), real); +} + +PX_FORCE_INLINE QuatV QuatAdd(const QuatV a, const QuatV b) +{ + return V4Add(a, b); +} + +PX_FORCE_INLINE QuatV QuatNeg(const QuatV q) +{ + return V4Neg(q); +} + +PX_FORCE_INLINE QuatV QuatSub(const QuatV a, const QuatV b) +{ + return V4Sub(a, b); +} + +PX_FORCE_INLINE QuatV QuatScale(const QuatV a, const FloatV b) +{ + return V4Scale(a, b); +} + +PX_FORCE_INLINE QuatV QuatMerge(const FloatV* const floatVArray) +{ + return V4Merge(floatVArray); +} + +PX_FORCE_INLINE QuatV QuatMerge(const FloatVArg x, const FloatVArg y, const FloatVArg z, const FloatVArg w) +{ + return V4Merge(x, y, z, w); +} + +PX_FORCE_INLINE QuatV QuatIdentity() +{ + return V4SetW(V4Zero(), FOne()); +} + +PX_FORCE_INLINE bool isFiniteQuatV(const QuatV q) +{ + return isFiniteVec4V(q); +} + +#if PX_CLANG +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wbitwise-instead-of-logical" // bitwise intentionally chosen for performance +#endif + +PX_FORCE_INLINE bool isValidQuatV(const QuatV q) +{ + const FloatV unitTolerance = FLoad(1e-4f); + const FloatV tmp = FAbs(FSub(QuatLength(q), FOne())); + const BoolV con = FIsGrtr(unitTolerance, tmp); + return isFiniteVec4V(q) & (BAllEqTTTT(con) == 1); +} + +PX_FORCE_INLINE bool isSaneQuatV(const QuatV q) +{ + const FloatV unitTolerance = FLoad(1e-2f); + const FloatV tmp = FAbs(FSub(QuatLength(q), FOne())); + const BoolV con = FIsGrtr(unitTolerance, tmp); + return isFiniteVec4V(q) & (BAllEqTTTT(con) == 1); +} + +#if PX_CLANG +#pragma clang diagnostic pop +#endif + +PX_FORCE_INLINE Mat33V QuatGetMat33V(const QuatVArg q) +{ + // const FloatV two = FloatV_From_F32(2.f); + // const FloatV one = FOne(); + + // const FloatV x = V4GetX(q); + // const FloatV y = V4GetY(q); + // const FloatV z = V4GetZ(q); + // const Vec4V _q = V4Mul(q, two); + // + ////const FloatV w = V4GetW(q); + + // const Vec4V t0 = V4Mul(_q, x); // 2xx, 2xy, 2xz, 2xw + // const Vec4V t1 = V4Mul(_q, y); // 2xy, 2yy, 2yz, 2yw + // const Vec4V t2 = V4Mul(_q, z); // 2xz, 2yz, 2zz, 2zw + ////const Vec4V t3 = V4Mul(_q, w); // 2xw, 2yw, 2zw, 2ww + + // const FloatV xx2 = V4GetX(t0); + // const FloatV xy2 = V4GetY(t0); + // const FloatV xz2 = V4GetZ(t0); + // const FloatV xw2 = V4GetW(t0); + + // const FloatV yy2 = V4GetY(t1); + // const FloatV yz2 = V4GetZ(t1); + // const FloatV yw2 = V4GetW(t1); + + // const FloatV zz2 = V4GetZ(t2); + // const FloatV zw2 = V4GetW(t2); + + ////const FloatV ww2 = V4GetW(t3); + + // const FloatV c00 = FSub(one, FAdd(yy2, zz2)); + // const FloatV c01 = FSub(xy2, zw2); + // const FloatV c02 = FAdd(xz2, yw2); + + // const FloatV c10 = FAdd(xy2, zw2); + // const FloatV c11 = FSub(one, FAdd(xx2, zz2)); + // const FloatV c12 = FSub(yz2, xw2); + + // const FloatV c20 = FSub(xz2, yw2); + // const FloatV c21 = FAdd(yz2, xw2); + // const FloatV c22 = FSub(one, FAdd(xx2, yy2)); + + // const Vec3V c0 = V3Merge(c00, c10, c20); + // const Vec3V c1 = V3Merge(c01, c11, c21); + // const Vec3V c2 = V3Merge(c02, c12, c22); + + // return Mat33V(c0, c1, c2); + + const FloatV one = FOne(); + const FloatV x = V4GetX(q); + const FloatV y = V4GetY(q); + const FloatV z = V4GetZ(q); + const FloatV w = V4GetW(q); + + const FloatV x2 = FAdd(x, x); + const FloatV y2 = FAdd(y, y); + const FloatV z2 = FAdd(z, z); + + const FloatV xx = FMul(x2, x); + const FloatV yy = FMul(y2, y); + const FloatV zz = FMul(z2, z); + + const FloatV xy = FMul(x2, y); + const FloatV xz = FMul(x2, z); + const FloatV xw = FMul(x2, w); + + const FloatV yz = FMul(y2, z); + const FloatV yw = FMul(y2, w); + const FloatV zw = FMul(z2, w); + + const FloatV v = FSub(one, xx); + + const Vec3V column0 = V3Merge(FSub(FSub(one, yy), zz), FAdd(xy, zw), FSub(xz, yw)); + const Vec3V column1 = V3Merge(FSub(xy, zw), FSub(v, zz), FAdd(yz, xw)); + const Vec3V column2 = V3Merge(FAdd(xz, yw), FSub(yz, xw), FSub(v, yy)); + return Mat33V(column0, column1, column2); +} + +PX_FORCE_INLINE QuatV Mat33GetQuatV(const Mat33V& a) +{ + const FloatV one = FOne(); + const FloatV zero = FZero(); + const FloatV half = FLoad(0.5f); + const FloatV two = FLoad(2.f); + const FloatV scale = FLoad(0.25f); + const FloatV a00 = V3GetX(a.col0); + const FloatV a11 = V3GetY(a.col1); + const FloatV a22 = V3GetZ(a.col2); + + const FloatV a21 = V3GetZ(a.col1); // row=2, col=1; + const FloatV a12 = V3GetY(a.col2); // row=1, col=2; + const FloatV a02 = V3GetX(a.col2); // row=0, col=2; + const FloatV a20 = V3GetZ(a.col0); // row=2, col=0; + const FloatV a10 = V3GetY(a.col0); // row=1, col=0; + const FloatV a01 = V3GetX(a.col1); // row=0, col=1; + + const Vec3V vec0 = V3Merge(a21, a02, a10); + const Vec3V vec1 = V3Merge(a12, a20, a01); + const Vec3V v = V3Sub(vec0, vec1); + const Vec3V g = V3Add(vec0, vec1); + + const FloatV trace = FAdd(a00, FAdd(a11, a22)); + + if(FAllGrtrOrEq(trace, zero)) + { + const FloatV h = FSqrt(FAdd(trace, one)); + const FloatV w = FMul(half, h); + const FloatV s = FMul(half, FRecip(h)); + const Vec3V u = V3Scale(v, s); + return V4SetW(Vec4V_From_Vec3V(u), w); + } + else + { + const FloatV ntrace = FNeg(trace); + const Vec3V d = V3Merge(a00, a11, a22); + const BoolV con0 = BAllTrue3(V3IsGrtrOrEq(V3Splat(a00), d)); + const BoolV con1 = BAllTrue3(V3IsGrtrOrEq(V3Splat(a11), d)); + + const FloatV t0 = FAdd(one, FScaleAdd(a00, two, ntrace)); + const FloatV t1 = FAdd(one, FScaleAdd(a11, two, ntrace)); + const FloatV t2 = FAdd(one, FScaleAdd(a22, two, ntrace)); + + const FloatV t = FSel(con0, t0, FSel(con1, t1, t2)); + + const FloatV h = FMul(two, FSqrt(t)); + const FloatV s = FRecip(h); + const FloatV g0 = FMul(scale, h); + const Vec3V vs = V3Scale(v, s); + const Vec3V gs = V3Scale(g, s); + const FloatV gsx = V3GetX(gs); + const FloatV gsy = V3GetY(gs); + const FloatV gsz = V3GetZ(gs); + // vs.x= (a21 - a12)*s; vs.y=(a02 - a20)*s; vs.z=(a10 - a01)*s; + // gs.x= (a21 + a12)*s; gs.y=(a02 + a20)*s; gs.z=(a10 + a01)*s; + const Vec4V v0 = V4Merge(g0, gsz, gsy, V3GetX(vs)); + const Vec4V v1 = V4Merge(gsz, g0, gsx, V3GetY(vs)); + const Vec4V v2 = V4Merge(gsy, gsx, g0, V3GetZ(vs)); + return V4Sel(con0, v0, V4Sel(con1, v1, v2)); + } +} + +} // namespace aos +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/foundation/PxVecTransform.h b/Source/ThirdParty/PhysX/foundation/PxVecTransform.h new file mode 100644 index 000000000..fcfd412f3 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/PxVecTransform.h @@ -0,0 +1,291 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_VEC_TRANSFORM_H +#define PX_VEC_TRANSFORM_H + +#include "foundation/PxVecMath.h" +#include "foundation/PxTransform.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif +namespace aos +{ + +class PxTransformV +{ + public: + QuatV q; + Vec3V p; + + PX_FORCE_INLINE PxTransformV(const PxTransform& orientation) + { + // const PxQuat oq = orientation.q; + // const PxF32 f[4] = {oq.x, oq.y, oq.z, oq.w}; + q = QuatVLoadXYZW(orientation.q.x, orientation.q.y, orientation.q.z, orientation.q.w); + // q = QuatV_From_F32Array(&oq.x); + p = V3LoadU(orientation.p); + } + + PX_FORCE_INLINE PxTransformV(const Vec3VArg p0 = V3Zero(), const QuatVArg q0 = QuatIdentity()) : q(q0), p(p0) + { + PX_ASSERT(isSaneQuatV(q0)); + } + + PX_FORCE_INLINE PxTransformV operator*(const PxTransformV& x) const + { + PX_ASSERT(x.isSane()); + return transform(x); + } + + PX_FORCE_INLINE PxTransformV getInverse() const + { + PX_ASSERT(isFinite()); + // return PxTransform(q.rotateInv(-p),q.getConjugate()); + return PxTransformV(QuatRotateInv(q, V3Neg(p)), QuatConjugate(q)); + } + + PX_FORCE_INLINE void normalize() + { + p = V3Zero(); + q = QuatIdentity(); + } + + PX_FORCE_INLINE void Invalidate() + { + p = V3Splat(FMax()); + q = QuatIdentity(); + } + + PX_FORCE_INLINE Vec3V transform(const Vec3VArg input) const + { + PX_ASSERT(isFinite()); + // return q.rotate(input) + p; + return QuatTransform(q, p, input); + } + + PX_FORCE_INLINE Vec3V transformInv(const Vec3VArg input) const + { + PX_ASSERT(isFinite()); + // return q.rotateInv(input-p); + return QuatRotateInv(q, V3Sub(input, p)); + } + + PX_FORCE_INLINE Vec3V rotate(const Vec3VArg input) const + { + PX_ASSERT(isFinite()); + // return q.rotate(input); + return QuatRotate(q, input); + } + + PX_FORCE_INLINE Vec3V rotateInv(const Vec3VArg input) const + { + PX_ASSERT(isFinite()); + // return q.rotateInv(input); + return QuatRotateInv(q, input); + } + + //! Transform transform to parent (returns compound transform: first src, then *this) + PX_FORCE_INLINE PxTransformV transform(const PxTransformV& src) const + { + PX_ASSERT(src.isSane()); + PX_ASSERT(isSane()); + // src = [srct, srcr] -> [r*srct + t, r*srcr] + // return PxTransform(q.rotate(src.p) + p, q*src.q); + return PxTransformV(V3Add(QuatRotate(q, src.p), p), QuatMul(q, src.q)); + } + +#if PX_CLANG +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wbitwise-instead-of-logical" // bitwise intentionally chosen for performance +#endif + + /** + \brief returns true if finite and q is a unit quaternion + */ + PX_FORCE_INLINE bool isValid() const + { + // return p.isFinite() && q.isFinite() && q.isValid(); + return isFiniteVec3V(p) & isFiniteQuatV(q) & isValidQuatV(q); + } + + /** + \brief returns true if finite and quat magnitude is reasonably close to unit to allow for some accumulation of error + vs isValid + */ + + PX_FORCE_INLINE bool isSane() const + { + // return isFinite() && q.isSane(); + return isFinite() & isSaneQuatV(q); + } + + /** + \brief returns true if all elems are finite (not NAN or INF, etc.) + */ + PX_FORCE_INLINE bool isFinite() const + { + // return p.isFinite() && q.isFinite(); + return isFiniteVec3V(p) & isFiniteQuatV(q); + } + +#if PX_CLANG +#pragma clang diagnostic pop +#endif + + //! Transform transform from parent (returns compound transform: first src, then this->inverse) + PX_FORCE_INLINE PxTransformV transformInv(const PxTransformV& src) const + { + PX_ASSERT(src.isSane()); + PX_ASSERT(isFinite()); + // src = [srct, srcr] -> [r^-1*(srct-t), r^-1*srcr] + /*PxQuat qinv = q.getConjugate(); + return PxTransform(qinv.rotate(src.p - p), qinv*src.q);*/ + const QuatV qinv = QuatConjugate(q); + const Vec3V v = QuatRotate(qinv, V3Sub(src.p, p)); + const QuatV rot = QuatMul(qinv, src.q); + return PxTransformV(v, rot); + } + + static PX_FORCE_INLINE PxTransformV createIdentity() + { + return PxTransformV(V3Zero()); + } +}; + +PX_FORCE_INLINE PxTransformV loadTransformA(const PxTransform& transform) +{ + const QuatV q0 = QuatVLoadA(&transform.q.x); + const Vec3V p0 = V3LoadA(&transform.p.x); + + return PxTransformV(p0, q0); +} + +PX_FORCE_INLINE PxTransformV loadTransformU(const PxTransform& transform) +{ + const QuatV q0 = QuatVLoadU(&transform.q.x); + const Vec3V p0 = V3LoadU(&transform.p.x); + + return PxTransformV(p0, q0); +} + +class PxMatTransformV +{ + public: + Mat33V rot; + Vec3V p; + + PX_FORCE_INLINE PxMatTransformV() + { + p = V3Zero(); + rot = M33Identity(); + } + PX_FORCE_INLINE PxMatTransformV(const Vec3VArg _p, const Mat33V& _rot) + { + p = _p; + rot = _rot; + } + + PX_FORCE_INLINE PxMatTransformV(const PxTransformV& other) + { + p = other.p; + QuatGetMat33V(other.q, rot.col0, rot.col1, rot.col2); + } + + PX_FORCE_INLINE PxMatTransformV(const Vec3VArg _p, const QuatV& quat) + { + p = _p; + QuatGetMat33V(quat, rot.col0, rot.col1, rot.col2); + } + + PX_FORCE_INLINE Vec3V getCol0() const + { + return rot.col0; + } + + PX_FORCE_INLINE Vec3V getCol1() const + { + return rot.col1; + } + + PX_FORCE_INLINE Vec3V getCol2() const + { + return rot.col2; + } + + PX_FORCE_INLINE void setCol0(const Vec3VArg col0) + { + rot.col0 = col0; + } + + PX_FORCE_INLINE void setCol1(const Vec3VArg col1) + { + rot.col1 = col1; + } + + PX_FORCE_INLINE void setCol2(const Vec3VArg col2) + { + rot.col2 = col2; + } + + PX_FORCE_INLINE Vec3V transform(const Vec3VArg input) const + { + return V3Add(p, M33MulV3(rot, input)); + } + + PX_FORCE_INLINE Vec3V transformInv(const Vec3VArg input) const + { + return M33TrnspsMulV3(rot, V3Sub(input, p)); // QuatRotateInv(q, V3Sub(input, p)); + } + + PX_FORCE_INLINE Vec3V rotate(const Vec3VArg input) const + { + return M33MulV3(rot, input); + } + + PX_FORCE_INLINE Vec3V rotateInv(const Vec3VArg input) const + { + return M33TrnspsMulV3(rot, input); + } + + PX_FORCE_INLINE PxMatTransformV transformInv(const PxMatTransformV& src) const + { + + const Vec3V v = M33TrnspsMulV3(rot, V3Sub(src.p, p)); + const Mat33V mat = M33MulM33(M33Trnsps(rot), src.rot); + return PxMatTransformV(v, mat); + } +}; +} +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/foundation/unix/PxUnixAoS.h b/Source/ThirdParty/PhysX/foundation/unix/PxUnixAoS.h new file mode 100644 index 000000000..530cc9525 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/unix/PxUnixAoS.h @@ -0,0 +1,46 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PXFOUNDATION_PXUNIXAOS_H +#define PXFOUNDATION_PXUNIXAOS_H + +// no includes here! this file should be included from PxcVecMath.h only!!! + +#if !COMPILE_VECTOR_INTRINSICS +#error Vector intrinsics should not be included when using scalar implementation. +#endif + +#if PX_INTEL_FAMILY +#include "foundation/unix/sse2/PxUnixSse2AoS.h" +#elif PX_NEON +#include "foundation/unix/neon/PxUnixNeonAoS.h" +#else +#error No SIMD implementation for this unix platform. +#endif + +#endif // PXFOUNDATION_PXUNIXAOS_H diff --git a/Source/ThirdParty/PhysX/foundation/unix/PxUnixFPU.h b/Source/ThirdParty/PhysX/foundation/unix/PxUnixFPU.h new file mode 100644 index 000000000..6accc20fd --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/unix/PxUnixFPU.h @@ -0,0 +1,83 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PXFOUNDATION_PXUNIXFPU_H +#define PXFOUNDATION_PXUNIXFPU_H + +#include "foundation/PxPreprocessor.h" + +#if PX_LINUX || PX_PS4 || PX_PS5 || PX_OSX + +#if PX_X86 || PX_X64 +#if PX_EMSCRIPTEN +#include +#endif +#include +#elif PX_NEON +#include +#endif + +PX_INLINE physx::PxSIMDGuard::PxSIMDGuard(bool enable) +#if !PX_EMSCRIPTEN && (PX_X86 || PX_X64) + : mEnabled(enable) +#endif +{ +#if !PX_EMSCRIPTEN && (PX_X86 || PX_X64) + if(enable) + { + mControlWord = _mm_getcsr(); + // set default (disable exceptions: _MM_MASK_MASK) and FTZ (_MM_FLUSH_ZERO_ON), DAZ (_MM_DENORMALS_ZERO_ON: (1<<6)) + _mm_setcsr(_MM_MASK_MASK | _MM_FLUSH_ZERO_ON | (1 << 6)); + } + else + { + PX_UNUSED(enable); + PX_ASSERT(_mm_getcsr() & _MM_FLUSH_ZERO_ON); + PX_ASSERT(_mm_getcsr() & (1 << 6)); + PX_ASSERT(_mm_getcsr() & _MM_MASK_MASK); + } +#endif +} + +PX_INLINE physx::PxSIMDGuard::~PxSIMDGuard() +{ +#if !PX_EMSCRIPTEN && (PX_X86 || PX_X64) + if(mEnabled) + { + // restore control word and clear exception flags + // (setting exception state flags cause exceptions on the first following fp operation) + _mm_setcsr(mControlWord & PxU32(~_MM_EXCEPT_MASK)); + } +#endif +} + +#else + #error No SIMD implementation for this unix platform. +#endif + +#endif // #ifndef PXFOUNDATION_PXUNIXFPU_H diff --git a/Source/ThirdParty/PhysX/foundation/unix/PxUnixInlineAoS.h b/Source/ThirdParty/PhysX/foundation/unix/PxUnixInlineAoS.h new file mode 100644 index 000000000..e257d17b5 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/unix/PxUnixInlineAoS.h @@ -0,0 +1,44 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PXFOUNDATION_PXUNIXINLINEAOS_H +#define PXFOUNDATION_PXUNIXINLINEAOS_H + +#if !COMPILE_VECTOR_INTRINSICS +#error Vector intrinsics should not be included when using scalar implementation. +#endif + +#if PX_INTEL_FAMILY +#include "foundation/unix/sse2/PxUnixSse2InlineAoS.h" +#elif PX_NEON +#include "foundation/unix/neon/PxUnixNeonInlineAoS.h" +#else +#error No SIMD implementation for this unix platform. +#endif + +#endif // PXFOUNDATION_PXUNIXINLINEAOS_H diff --git a/Source/ThirdParty/PhysX/foundation/unix/PxUnixIntrinsics.h b/Source/ThirdParty/PhysX/foundation/unix/PxUnixIntrinsics.h index 1095b1356..02104221a 100644 --- a/Source/ThirdParty/PhysX/foundation/unix/PxUnixIntrinsics.h +++ b/Source/ThirdParty/PhysX/foundation/unix/PxUnixIntrinsics.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,163 +22,106 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXUNIXINTRINSICS_H -#define PXFOUNDATION_PXUNIXINTRINSICS_H - -#include "foundation/Px.h" -#include "foundation/PxSharedAssert.h" - -#if !(PX_LINUX || PX_ANDROID || PX_PS4 || PX_APPLE_FAMILY) -#error "This file should only be included by Unix builds!!" -#endif - -#if (PX_LINUX || PX_ANDROID) && !defined(__CUDACC__) && !PX_EMSCRIPTEN - // Linux/android and CUDA compilation does not work with std::isfnite, as it is not marked as CUDA callable - #include - #ifndef isfinite - using std::isfinite; - #endif -#endif +#ifndef PSFOUNDATION_PSUNIXINTRINSICS_H +#define PSFOUNDATION_PSUNIXINTRINSICS_H +#include "foundation/PxAssert.h" #include -#include +#if PX_ANDROID +#include // for PxDebugBreak() { raise(SIGTRAP); } +#endif + +// this file is for internal intrinsics - that is, intrinsics that are used in +// cross platform code but do not appear in the API + +#if !(PX_LINUX || PX_ANDROID || PX_PS4 || PX_PS5 || PX_APPLE_FAMILY) +#error "This file should only be included by unix builds!!" +#endif + +#if !PX_DOXYGEN namespace physx { -namespace intrinsics -{ -//! \brief platform-specific absolute value -PX_CUDA_CALLABLE PX_FORCE_INLINE float abs(float a) -{ - return ::fabsf(a); -} +#endif -//! \brief platform-specific select float -PX_CUDA_CALLABLE PX_FORCE_INLINE float fsel(float a, float b, float c) +PX_FORCE_INLINE void PxMemoryBarrier() { - return (a >= 0.0f) ? b : c; -} - -//! \brief platform-specific sign -PX_CUDA_CALLABLE PX_FORCE_INLINE float sign(float a) -{ - return (a >= 0.0f) ? 1.0f : -1.0f; -} - -//! \brief platform-specific reciprocal -PX_CUDA_CALLABLE PX_FORCE_INLINE float recip(float a) -{ - return 1.0f / a; -} - -//! \brief platform-specific reciprocal estimate -PX_CUDA_CALLABLE PX_FORCE_INLINE float recipFast(float a) -{ - return 1.0f / a; -} - -//! \brief platform-specific square root -PX_CUDA_CALLABLE PX_FORCE_INLINE float sqrt(float a) -{ - return ::sqrtf(a); -} - -//! \brief platform-specific reciprocal square root -PX_CUDA_CALLABLE PX_FORCE_INLINE float recipSqrt(float a) -{ - return 1.0f / ::sqrtf(a); -} - -PX_CUDA_CALLABLE PX_FORCE_INLINE float recipSqrtFast(float a) -{ - return 1.0f / ::sqrtf(a); -} - -//! \brief platform-specific sine -PX_CUDA_CALLABLE PX_FORCE_INLINE float sin(float a) -{ - return ::sinf(a); -} - -//! \brief platform-specific cosine -PX_CUDA_CALLABLE PX_FORCE_INLINE float cos(float a) -{ - return ::cosf(a); -} - -//! \brief platform-specific minimum -PX_CUDA_CALLABLE PX_FORCE_INLINE float selectMin(float a, float b) -{ - return a < b ? a : b; -} - -//! \brief platform-specific maximum -PX_CUDA_CALLABLE PX_FORCE_INLINE float selectMax(float a, float b) -{ - return a > b ? a : b; -} - -//! \brief platform-specific finiteness check (not INF or NAN) -PX_CUDA_CALLABLE PX_FORCE_INLINE bool isFinite(float a) -{ - //std::isfinite not recommended as of Feb 2017, since it doesn't work with g++/clang's floating point optimization. - union localU { PxU32 i; float f; } floatUnion; - floatUnion.f = a; - return !((floatUnion.i & 0x7fffffff) >= 0x7f800000); -} - -//! \brief platform-specific finiteness check (not INF or NAN) -PX_CUDA_CALLABLE PX_FORCE_INLINE bool isFinite(double a) -{ - return !!isfinite(a); + __sync_synchronize(); } /*! -Sets \c count bytes starting at \c dst to zero. +Return the index of the highest set bit. Undefined for zero arg. */ -PX_FORCE_INLINE void* memZero(void* dest, uint32_t count) +PX_INLINE uint32_t PxHighestSetBitUnsafe(uint32_t v) { - return memset(dest, 0, count); + + return uint32_t(31 - __builtin_clz(v)); } /*! -Sets \c count bytes starting at \c dst to \c c. +Return the index of the highest set bit. Undefined for zero arg. */ -PX_FORCE_INLINE void* memSet(void* dest, int32_t c, uint32_t count) +PX_INLINE uint32_t PxLowestSetBitUnsafe(uint32_t v) { - return memset(dest, c, count); + return uint32_t(__builtin_ctz(v)); } /*! -Copies \c count bytes from \c src to \c dst. User memMove if regions overlap. +Returns the index of the highest set bit. Returns 32 for v=0. */ -PX_FORCE_INLINE void* memCopy(void* dest, const void* src, uint32_t count) +PX_INLINE uint32_t PxCountLeadingZeros(uint32_t v) { - return memcpy(dest, src, count); + if(v) + return uint32_t(__builtin_clz(v)); + else + return 32u; } /*! -Copies \c count bytes from \c src to \c dst. Supports overlapping regions. +Prefetch aligned 64B x86, 32b ARM around \c ptr+offset. */ -PX_FORCE_INLINE void* memMove(void* dest, const void* src, uint32_t count) +PX_FORCE_INLINE void PxPrefetchLine(const void* ptr, uint32_t offset = 0) { - return memmove(dest, src, count); + __builtin_prefetch(reinterpret_cast(ptr) + offset, 0, 3); } /*! -Set 128B to zero starting at \c dst+offset. Must be aligned. +Prefetch \c count bytes starting at \c ptr. */ -PX_FORCE_INLINE void memZero128(void* dest, uint32_t offset = 0) +#if PX_ANDROID || PX_IOS +PX_FORCE_INLINE void PxPrefetch(const void* ptr, uint32_t count = 1) { - PX_SHARED_ASSERT(((size_t(dest) + offset) & 0x7f) == 0); - memSet(reinterpret_cast(dest) + offset, 0, 128); + const char* cp = static_cast(ptr); + size_t p = reinterpret_cast(ptr); + uint32_t startLine = uint32_t(p >> 5), endLine = uint32_t((p + count - 1) >> 5); + uint32_t lines = endLine - startLine + 1; + do + { + PxPrefetchLine(cp); + cp += 32; + } while(--lines); } +#else +PX_FORCE_INLINE void PxPrefetch(const void* ptr, uint32_t count = 1) +{ + const char* cp = reinterpret_cast(ptr); + uint64_t p = size_t(ptr); + uint64_t startLine = p >> 6, endLine = (p + count - 1) >> 6; + uint64_t lines = endLine - startLine + 1; + do + { + PxPrefetchLine(cp); + cp += 64; + } while(--lines); +} +#endif -} // namespace intrinsics +#if !PX_DOXYGEN } // namespace physx +#endif -#endif // #ifndef PXFOUNDATION_PXUNIXINTRINSICS_H +#endif // #ifndef PSFOUNDATION_PSUNIXINTRINSICS_H diff --git a/Source/ThirdParty/PhysX/foundation/unix/PxUnixMathIntrinsics.h b/Source/ThirdParty/PhysX/foundation/unix/PxUnixMathIntrinsics.h new file mode 100644 index 000000000..4a343dc7d --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/unix/PxUnixMathIntrinsics.h @@ -0,0 +1,180 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PXFOUNDATION_PXUNIXINTRINSICS_H +#define PXFOUNDATION_PXUNIXINTRINSICS_H + +#include "foundation/Px.h" +#include "foundation/PxAssert.h" + +#if !(PX_LINUX || PX_ANDROID || PX_PS4 || PX_PS5 || PX_APPLE_FAMILY) +#error "This file should only be included by Unix builds!!" +#endif + +#if PX_LINUX && !defined(__CUDACC__) && !PX_EMSCRIPTEN + // Linux and CUDA compilation does not work with std::isfnite, as it is not marked as CUDA callable + #include + #ifndef isfinite + using std::isfinite; + #endif +#endif + +#include +#include + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +namespace intrinsics +{ +//! \brief platform-specific absolute value +PX_CUDA_CALLABLE PX_FORCE_INLINE float abs(float a) +{ + return ::fabsf(a); +} + +//! \brief platform-specific select float +PX_CUDA_CALLABLE PX_FORCE_INLINE float fsel(float a, float b, float c) +{ + return (a >= 0.0f) ? b : c; +} + +//! \brief platform-specific sign +PX_CUDA_CALLABLE PX_FORCE_INLINE float sign(float a) +{ + return (a >= 0.0f) ? 1.0f : -1.0f; +} + +//! \brief platform-specific reciprocal +PX_CUDA_CALLABLE PX_FORCE_INLINE float recip(float a) +{ + return 1.0f / a; +} + +//! \brief platform-specific reciprocal estimate +PX_CUDA_CALLABLE PX_FORCE_INLINE float recipFast(float a) +{ + return 1.0f / a; +} + +//! \brief platform-specific square root +PX_CUDA_CALLABLE PX_FORCE_INLINE float sqrt(float a) +{ + return ::sqrtf(a); +} + +//! \brief platform-specific reciprocal square root +PX_CUDA_CALLABLE PX_FORCE_INLINE float recipSqrt(float a) +{ + return 1.0f / ::sqrtf(a); +} + +PX_CUDA_CALLABLE PX_FORCE_INLINE float recipSqrtFast(float a) +{ + return 1.0f / ::sqrtf(a); +} + +//! \brief platform-specific sine +PX_CUDA_CALLABLE PX_FORCE_INLINE float sin(float a) +{ + return ::sinf(a); +} + +//! \brief platform-specific cosine +PX_CUDA_CALLABLE PX_FORCE_INLINE float cos(float a) +{ + return ::cosf(a); +} + +//! \brief platform-specific minimum +PX_CUDA_CALLABLE PX_FORCE_INLINE float selectMin(float a, float b) +{ + return a < b ? a : b; +} + +//! \brief platform-specific maximum +PX_CUDA_CALLABLE PX_FORCE_INLINE float selectMax(float a, float b) +{ + return a > b ? a : b; +} + +//! \brief platform-specific finiteness check (not INF or NAN) +PX_CUDA_CALLABLE PX_FORCE_INLINE bool isFinite(float a) +{ + //std::isfinite not recommended as of Feb 2017, since it doesn't work with g++/clang's floating point optimization. + union localU { PxU32 i; float f; } floatUnion; + floatUnion.f = a; + return !((floatUnion.i & 0x7fffffff) >= 0x7f800000); +} + +//! \brief platform-specific finiteness check (not INF or NAN) +PX_CUDA_CALLABLE PX_FORCE_INLINE bool isFinite(double a) +{ + return !!isfinite(a); +} + +/*! +Sets \c count bytes starting at \c dst to zero. +*/ +PX_FORCE_INLINE void* memZero(void* dest, uint32_t count) +{ + return memset(dest, 0, count); +} + +/*! +Sets \c count bytes starting at \c dst to \c c. +*/ +PX_FORCE_INLINE void* memSet(void* dest, int32_t c, uint32_t count) +{ + return memset(dest, c, count); +} + +/*! +Copies \c count bytes from \c src to \c dst. User memMove if regions overlap. +*/ +PX_FORCE_INLINE void* memCopy(void* dest, const void* src, uint32_t count) +{ + return memcpy(dest, src, count); +} + +/*! +Copies \c count bytes from \c src to \c dst. Supports overlapping regions. +*/ +PX_FORCE_INLINE void* memMove(void* dest, const void* src, uint32_t count) +{ + return memmove(dest, src, count); +} + +} // namespace intrinsics +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif // #ifndef PXFOUNDATION_PXUNIXINTRINSICS_H diff --git a/Source/ThirdParty/PhysX/foundation/unix/PxUnixTrigConstants.h b/Source/ThirdParty/PhysX/foundation/unix/PxUnixTrigConstants.h new file mode 100644 index 000000000..635d5222e --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/unix/PxUnixTrigConstants.h @@ -0,0 +1,75 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PXFOUNDATION_PXUNIXTRIGCONSTANTS_H +#define PXFOUNDATION_PXUNIXTRIGCONSTANTS_H + +#include "foundation/PxPreprocessor.h" + +namespace physx +{ +namespace aos +{ + +#if PX_CLANG +#if PX_LINUX +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wmissing-variable-declarations" +#endif +#endif + +#define PX_GLOBALCONST extern const __attribute__((weak)) + +PX_ALIGN_PREFIX(16) +struct PX_VECTORF32 +{ + float f[4]; +} PX_ALIGN_SUFFIX(16); + +PX_GLOBALCONST PX_VECTORF32 g_PXSinCoefficients0 = { { 1.0f, -0.166666667f, 8.333333333e-3f, -1.984126984e-4f } }; +PX_GLOBALCONST PX_VECTORF32 +g_PXSinCoefficients1 = { { 2.755731922e-6f, -2.505210839e-8f, 1.605904384e-10f, -7.647163732e-13f } }; +PX_GLOBALCONST PX_VECTORF32 +g_PXSinCoefficients2 = { { 2.811457254e-15f, -8.220635247e-18f, 1.957294106e-20f, -3.868170171e-23f } }; +PX_GLOBALCONST PX_VECTORF32 g_PXCosCoefficients0 = { { 1.0f, -0.5f, 4.166666667e-2f, -1.388888889e-3f } }; +PX_GLOBALCONST PX_VECTORF32 +g_PXCosCoefficients1 = { { 2.480158730e-5f, -2.755731922e-7f, 2.087675699e-9f, -1.147074560e-11f } }; +PX_GLOBALCONST PX_VECTORF32 +g_PXCosCoefficients2 = { { 4.779477332e-14f, -1.561920697e-16f, 4.110317623e-19f, -8.896791392e-22f } }; +PX_GLOBALCONST PX_VECTORF32 g_PXReciprocalTwoPi = { { PxInvTwoPi, PxInvTwoPi, PxInvTwoPi, PxInvTwoPi } }; +PX_GLOBALCONST PX_VECTORF32 g_PXTwoPi = { { PxTwoPi, PxTwoPi, PxTwoPi, PxTwoPi } }; + +#if PX_CLANG +#if PX_LINUX +#pragma clang diagnostic pop +#endif +#endif +} // namespace aos +} // namespace physx + +#endif //PXFOUNDATION_PXUNIXTRIGCONSTANTS_H diff --git a/Source/ThirdParty/PhysX/foundation/unix/neon/PxUnixNeonAoS.h b/Source/ThirdParty/PhysX/foundation/unix/neon/PxUnixNeonAoS.h new file mode 100644 index 000000000..bf0085163 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/unix/neon/PxUnixNeonAoS.h @@ -0,0 +1,136 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PXFOUNDATION_PXUNIXNEONAOS_H +#define PXFOUNDATION_PXUNIXNEONAOS_H + +// no includes here! this file should be included from PxcVecMath.h only!!! + +#if !COMPILE_VECTOR_INTRINSICS +#error Vector intrinsics should not be included when using scalar implementation. +#endif + +// only ARM NEON compatible platforms should reach this +#include + +namespace physx +{ +namespace aos +{ + +typedef float32x2_t FloatV; +typedef float32x4_t Vec3V; +typedef float32x4_t Vec4V; +typedef uint32x4_t BoolV; +typedef float32x4_t QuatV; + +typedef uint32x4_t VecU32V; +typedef int32x4_t VecI32V; +typedef uint16x8_t VecU16V; +typedef int16x8_t VecI16V; +typedef uint8x16_t VecU8V; + +#define FloatVArg FloatV & +#define Vec3VArg Vec3V & +#define Vec4VArg Vec4V & +#define BoolVArg BoolV & +#define VecU32VArg VecU32V & +#define VecI32VArg VecI32V & +#define VecU16VArg VecU16V & +#define VecI16VArg VecI16V & +#define VecU8VArg VecU8V & +#define QuatVArg QuatV & + +// KS - TODO - make an actual VecCrossV type for NEON +#define VecCrossV Vec3V + +typedef VecI32V VecShiftV; +#define VecShiftVArg VecShiftV & + +PX_ALIGN_PREFIX(16) +struct Mat33V +{ + Mat33V() + { + } + Mat33V(const Vec3V& c0, const Vec3V& c1, const Vec3V& c2) : col0(c0), col1(c1), col2(c2) + { + } + Vec3V PX_ALIGN(16, col0); + Vec3V PX_ALIGN(16, col1); + Vec3V PX_ALIGN(16, col2); +} PX_ALIGN_SUFFIX(16); + +PX_ALIGN_PREFIX(16) +struct Mat34V +{ + Mat34V() + { + } + Mat34V(const Vec3V& c0, const Vec3V& c1, const Vec3V& c2, const Vec3V& c3) : col0(c0), col1(c1), col2(c2), col3(c3) + { + } + Vec3V PX_ALIGN(16, col0); + Vec3V PX_ALIGN(16, col1); + Vec3V PX_ALIGN(16, col2); + Vec3V PX_ALIGN(16, col3); +} PX_ALIGN_SUFFIX(16); + +PX_ALIGN_PREFIX(16) +struct Mat43V +{ + Mat43V() + { + } + Mat43V(const Vec4V& c0, const Vec4V& c1, const Vec4V& c2) : col0(c0), col1(c1), col2(c2) + { + } + Vec4V PX_ALIGN(16, col0); + Vec4V PX_ALIGN(16, col1); + Vec4V PX_ALIGN(16, col2); +} PX_ALIGN_SUFFIX(16); + +PX_ALIGN_PREFIX(16) +struct Mat44V +{ + Mat44V() + { + } + Mat44V(const Vec4V& c0, const Vec4V& c1, const Vec4V& c2, const Vec4V& c3) : col0(c0), col1(c1), col2(c2), col3(c3) + { + } + Vec4V PX_ALIGN(16, col0); + Vec4V PX_ALIGN(16, col1); + Vec4V PX_ALIGN(16, col2); + Vec4V PX_ALIGN(16, col3); +} PX_ALIGN_SUFFIX(16); + +} // namespace aos +} // namespace physx + +#endif // PXFOUNDATION_PXUNIXNEONAOS_H diff --git a/Source/ThirdParty/PhysX/foundation/unix/neon/PxUnixNeonInlineAoS.h b/Source/ThirdParty/PhysX/foundation/unix/neon/PxUnixNeonInlineAoS.h new file mode 100644 index 000000000..9a3692aef --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/unix/neon/PxUnixNeonInlineAoS.h @@ -0,0 +1,3640 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PXFOUNDATION_PXUNIXNEONINLINEAOS_H +#define PXFOUNDATION_PXUNIXNEONINLINEAOS_H + +#if !COMPILE_VECTOR_INTRINSICS +#error Vector intrinsics should not be included when using scalar implementation. +#endif + +namespace physx +{ +namespace aos +{ + +// improved estimates +#define VRECIPEQ recipq_newton<1> +#define VRECIPE recip_newton<1> +#define VRECIPSQRTEQ rsqrtq_newton<1> +#define VRECIPSQRTE rsqrt_newton<1> + +// "exact" +#define VRECIPQ recipq_newton<4> +#if PX_SWITCH +// StabilizationTests.AveragePoint needs more precision to succeed. +#define VRECIP recip_newton<5> +#else +#define VRECIP recip_newton<4> +#endif +#define VRECIPSQRTQ rsqrtq_newton<4> +#define VRECIPSQRT rsqrt_newton<4> + +#define VECMATH_AOS_EPSILON (1e-3f) + +////////////////////////////////////////////////////////////////////// +//Test that Vec3V and FloatV are legal +////////////////////////////////// + +#define FLOAT_COMPONENTS_EQUAL_THRESHOLD 0.01f +PX_FORCE_INLINE bool isValidFloatV(const FloatV a) +{ + /* + PX_ALIGN(16, PxF32) data[4]; + vst1_f32(reinterpret_cast(data), a); + return + PxU32* intData = reinterpret_cast(data); + return intData[0] == intData[1]; + */ + PX_ALIGN(16, PxF32) data[4]; + vst1_f32(reinterpret_cast(data), a); + const float32_t x = data[0]; + const float32_t y = data[1]; + + return (x == y); + + /*if (PxAbs(x - y) < FLOAT_COMPONENTS_EQUAL_THRESHOLD) + { + return true; + } + + if (PxAbs((x - y) / x) < FLOAT_COMPONENTS_EQUAL_THRESHOLD) + { + return true; + } + + return false;*/ +} + +PX_FORCE_INLINE bool isValidVec3V(const Vec3V a) +{ + const float32_t w = vgetq_lane_f32(a, 3); + return (0.0f == w); + //const PxU32* intData = reinterpret_cast(&w); + //return *intData == 0; +} + +PX_FORCE_INLINE bool isAligned16(const void* a) +{ + return(0 == (size_t(a) & 0x0f)); +} + +#if PX_DEBUG +#define ASSERT_ISVALIDVEC3V(a) PX_ASSERT(isValidVec3V(a)) +#define ASSERT_ISVALIDFLOATV(a) PX_ASSERT(isValidFloatV(a)) +#define ASSERT_ISALIGNED16(a) PX_ASSERT(isAligned16(static_cast(a))) +#else +#define ASSERT_ISVALIDVEC3V(a) +#define ASSERT_ISVALIDFLOATV(a) +#define ASSERT_ISALIGNED16(a) +#endif + +namespace internalUnitNeonSimd +{ +PX_FORCE_INLINE PxU32 BAllTrue4_R(const BoolV a) +{ + const uint16x4_t dHigh = vget_high_u16(vreinterpretq_u16_u32(a)); + const uint16x4_t dLow = vmovn_u32(a); + const uint16x8_t combined = vcombine_u16(dLow, dHigh); + const uint32x2_t finalReduce = vreinterpret_u32_u8(vmovn_u16(combined)); + return PxU32(vget_lane_u32(finalReduce, 0) == 0xffffFFFF); +} + +PX_FORCE_INLINE PxU32 BAllTrue3_R(const BoolV a) +{ + const uint16x4_t dHigh = vget_high_u16(vreinterpretq_u16_u32(a)); + const uint16x4_t dLow = vmovn_u32(a); + const uint16x8_t combined = vcombine_u16(dLow, dHigh); + const uint32x2_t finalReduce = vreinterpret_u32_u8(vmovn_u16(combined)); + return PxU32((vget_lane_u32(finalReduce, 0) & 0xffFFff) == 0xffFFff); +} + +PX_FORCE_INLINE PxU32 BAnyTrue4_R(const BoolV a) +{ + const uint16x4_t dHigh = vget_high_u16(vreinterpretq_u16_u32(a)); + const uint16x4_t dLow = vmovn_u32(a); + const uint16x8_t combined = vcombine_u16(dLow, dHigh); + const uint32x2_t finalReduce = vreinterpret_u32_u8(vmovn_u16(combined)); + return PxU32(vget_lane_u32(finalReduce, 0) != 0x0); +} + +PX_FORCE_INLINE PxU32 BAnyTrue3_R(const BoolV a) +{ + const uint16x4_t dHigh = vget_high_u16(vreinterpretq_u16_u32(a)); + const uint16x4_t dLow = vmovn_u32(a); + const uint16x8_t combined = vcombine_u16(dLow, dHigh); + const uint32x2_t finalReduce = vreinterpret_u32_u8(vmovn_u16(combined)); + return PxU32((vget_lane_u32(finalReduce, 0) & 0xffFFff) != 0); +} +} + +namespace vecMathTests +{ +// PT: this function returns an invalid Vec3V (W!=0.0f) just for unit-testing 'isValidVec3V' +PX_FORCE_INLINE Vec3V getInvalidVec3V() +{ + PX_ALIGN(16, PxF32) data[4] = { 1.0f, 1.0f, 1.0f, 1.0f }; + return V4LoadA(data); +} + +PX_FORCE_INLINE bool allElementsEqualFloatV(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return vget_lane_u32(vceq_f32(a, b), 0) != 0; +} + +PX_FORCE_INLINE bool allElementsEqualVec3V(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return V3AllEq(a, b) != 0; +} + +PX_FORCE_INLINE bool allElementsEqualVec4V(const Vec4V a, const Vec4V b) +{ + return V4AllEq(a, b) != 0; +} + +PX_FORCE_INLINE bool allElementsEqualBoolV(const BoolV a, const BoolV b) +{ + return internalUnitNeonSimd::BAllTrue4_R(vceqq_u32(a, b)) != 0; +} + +PX_FORCE_INLINE PxU32 V4U32AllEq(const VecU32V a, const VecU32V b) +{ + return internalUnitNeonSimd::BAllTrue4_R(V4IsEqU32(a, b)); +} + +PX_FORCE_INLINE bool allElementsEqualVecU32V(const VecU32V a, const VecU32V b) +{ + return V4U32AllEq(a, b) != 0; +} + +PX_FORCE_INLINE BoolV V4IsEqI32(const VecI32V a, const VecI32V b) +{ + return vceqq_s32(a, b); +} + +PX_FORCE_INLINE PxU32 V4I32AllEq(const VecI32V a, const VecI32V b) +{ + return internalUnitNeonSimd::BAllTrue4_R(V4IsEqI32(a, b)); +} + +PX_FORCE_INLINE bool allElementsEqualVecI32V(const VecI32V a, const VecI32V b) +{ + return V4I32AllEq(a, b) != 0; +} + +PX_FORCE_INLINE bool allElementsNearEqualFloatV(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + + const float32x2_t c = vsub_f32(a, b); + const float32x2_t error = vdup_n_f32(VECMATH_AOS_EPSILON); +// absolute compare abs(error) > abs(c) + const uint32x2_t greater = vcagt_f32(error, c); + const uint32x2_t min = vpmin_u32(greater, greater); + return vget_lane_u32(min, 0) != 0x0; +} + +PX_FORCE_INLINE bool allElementsNearEqualVec3V(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + const float32x4_t c = vsubq_f32(a, b); + const float32x4_t error = vdupq_n_f32(VECMATH_AOS_EPSILON); +// absolute compare abs(error) > abs(c) + const uint32x4_t greater = vcagtq_f32(error, c); + return internalUnitNeonSimd::BAllTrue3_R(greater) != 0; +} + +PX_FORCE_INLINE bool allElementsNearEqualVec4V(const Vec4V a, const Vec4V b) +{ + const float32x4_t c = vsubq_f32(a, b); + const float32x4_t error = vdupq_n_f32(VECMATH_AOS_EPSILON); +// absolute compare abs(error) > abs(c) + const uint32x4_t greater = vcagtq_f32(error, c); + return internalUnitNeonSimd::BAllTrue4_R(greater) != 0x0; +} +} + +#if 0 // debugging printfs +#include +PX_FORCE_INLINE void printVec(const float32x4_t& v, const char* name) +{ + PX_ALIGN(16, float32_t) data[4]; + vst1q_f32(data, v); + printf("%s: (%f, %f, %f, %f)\n", name, data[0], data[1], data[2], data[3]); +} + +PX_FORCE_INLINE void printVec(const float32x2_t& v, const char* name) +{ + PX_ALIGN(16, float32_t) data[2]; + vst1_f32(data, v); + printf("%s: (%f, %f)\n", name, data[0], data[1]); +} + +PX_FORCE_INLINE void printVec(const uint32x4_t& v, const char* name) +{ + PX_ALIGN(16, uint32_t) data[4]; + vst1q_u32(data, v); + printf("%s: (0x%x, 0x%x, 0x%x, 0x%x)\n", name, data[0], data[1], data[2], data[3]); +} + +PX_FORCE_INLINE void printVec(const uint16x8_t& v, const char* name) +{ + PX_ALIGN(16, uint16_t) data[8]; + vst1q_u16(data, v); + printf("%s: (0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n", name, data[0], data[1], data[2], data[3], + data[4], data[5], data[6], data[7]); +} + +PX_FORCE_INLINE void printVec(const int32x4_t& v, const char* name) +{ + PX_ALIGN(16, int32_t) data[4]; + vst1q_s32(data, v); + printf("%s: (0x%x, 0x%x, 0x%x, 0x%x)\n", name, data[0], data[1], data[2], data[3]); +} + +PX_FORCE_INLINE void printVec(const int16x8_t& v, const char* name) +{ + PX_ALIGN(16, int16_t) data[8]; + vst1q_s16(data, v); + printf("%s: (0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n", name, data[0], data[1], data[2], data[3], + data[4], data[5], data[6], data[7]); +} + +PX_FORCE_INLINE void printVec(const uint16x4_t& v, const char* name) +{ + PX_ALIGN(16, uint16_t) data[4]; + vst1_u16(data, v); + printf("%s: (0x%x, 0x%x, 0x%x, 0x%x)\n", name, data[0], data[1], data[2], data[3]); +} + +PX_FORCE_INLINE void printVec(const uint32x2_t& v, const char* name) +{ + PX_ALIGN(16, uint32_t) data[2]; + vst1_u32(data, v); + printf("%s: (0x%x, 0x%x)\n", name, data[0], data[1]); +} + +PX_FORCE_INLINE void printVar(const PxU32 v, const char* name) +{ + printf("%s: 0x%x\n", name, v); +} + +PX_FORCE_INLINE void printVar(const PxF32 v, const char* name) +{ + printf("%s: %f\n", name, v); +} + +#define PRINT_VAR(X) printVar((X), #X) +#define PRINT_VEC(X) printVec((X), #X) +#define PRINT_VEC_TITLE(TITLE, X) printVec((X), TITLE #X) +#endif // debugging printf + +///////////////////////////////////////////////////////////////////// +////FUNCTIONS USED ONLY FOR ASSERTS IN VECTORISED IMPLEMENTATIONS +///////////////////////////////////////////////////////////////////// + +PX_FORCE_INLINE bool isFiniteFloatV(const FloatV a) +{ + PX_ALIGN(16, PxF32) data[4]; + vst1_f32(reinterpret_cast(data), a); + return PxIsFinite(data[0]) && PxIsFinite(data[1]); +} + +PX_FORCE_INLINE bool isFiniteVec3V(const Vec3V a) +{ + PX_ALIGN(16, PxF32) data[4]; + vst1q_f32(reinterpret_cast(data), a); + return PxIsFinite(data[0]) && PxIsFinite(data[1]) && PxIsFinite(data[2]); +} + +PX_FORCE_INLINE bool isFiniteVec4V(const Vec4V a) +{ + PX_ALIGN(16, PxF32) data[4]; + vst1q_f32(reinterpret_cast(data), a); + return PxIsFinite(data[0]) && PxIsFinite(data[1]) && PxIsFinite(data[2]) && PxIsFinite(data[3]); +} + +PX_FORCE_INLINE bool hasZeroElementinFloatV(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + return vget_lane_u32(vreinterpret_u32_f32(a), 0) == 0; +} + +PX_FORCE_INLINE bool hasZeroElementInVec3V(const Vec3V a) +{ + const uint32x2_t dLow = vget_low_u32(vreinterpretq_u32_f32(a)); + const uint32x2_t dMin = vpmin_u32(dLow, dLow); + + return vget_lane_u32(dMin, 0) == 0 || vgetq_lane_u32(vreinterpretq_u32_f32(a), 2) == 0; +} + +PX_FORCE_INLINE bool hasZeroElementInVec4V(const Vec4V a) +{ + const uint32x2_t dHigh = vget_high_u32(vreinterpretq_u32_f32(a)); + const uint32x2_t dLow = vget_low_u32(vreinterpretq_u32_f32(a)); + + const uint32x2_t dMin = vmin_u32(dHigh, dLow); + const uint32x2_t pairMin = vpmin_u32(dMin, dMin); + return vget_lane_u32(pairMin, 0) == 0; +} + +///////////////////////////////////////////////////////////////////// +////VECTORISED FUNCTION IMPLEMENTATIONS +///////////////////////////////////////////////////////////////////// + +PX_FORCE_INLINE FloatV FLoad(const PxF32 f) +{ + return vdup_n_f32(reinterpret_cast(f)); +} + +PX_FORCE_INLINE FloatV FLoadA(const PxF32* const f) +{ + ASSERT_ISALIGNED16(f); + return vld1_f32(reinterpret_cast(f)); +} + +PX_FORCE_INLINE Vec3V V3Load(const PxF32 f) +{ + PX_ALIGN(16, PxF32) data[4] = { f, f, f, 0.0f }; + return V4LoadA(data); +} + +PX_FORCE_INLINE Vec4V V4Load(const PxF32 f) +{ + return vdupq_n_f32(reinterpret_cast(f)); +} + +PX_FORCE_INLINE BoolV BLoad(const bool f) +{ + const PxU32 i = static_cast(-(static_cast(f))); + return vdupq_n_u32(i); +} + +PX_FORCE_INLINE Vec3V V3LoadA(const PxVec3& f) +{ + ASSERT_ISALIGNED16(&f); + PX_ALIGN(16, PxF32) data[4] = { f.x, f.y, f.z, 0.0f }; + return V4LoadA(data); +} + +PX_FORCE_INLINE Vec3V V3LoadU(const PxVec3& f) +{ + PX_ALIGN(16, PxF32) data[4] = { f.x, f.y, f.z, 0.0f }; + return V4LoadA(data); +} + +PX_FORCE_INLINE Vec3V V3LoadUnsafeA(const PxVec3& f) +{ + ASSERT_ISALIGNED16(&f); + PX_ALIGN(16, PxF32) data[4] = { f.x, f.y, f.z, 0.0f }; + return V4LoadA(data); +} + +PX_FORCE_INLINE Vec3V V3LoadA(const PxF32* f) +{ + ASSERT_ISALIGNED16(f); + PX_ALIGN(16, PxF32) data[4] = { f[0], f[1], f[2], 0.0f }; + return V4LoadA(data); +} + +PX_FORCE_INLINE Vec3V V3LoadU(const PxF32* f) +{ + PX_ALIGN(16, PxF32) data[4] = { f[0], f[1], f[2], 0.0f }; + return V4LoadA(data); +} + +PX_FORCE_INLINE Vec3V Vec3V_From_Vec4V(Vec4V v) +{ + return vsetq_lane_f32(0.0f, v, 3); +} + +PX_FORCE_INLINE Vec3V Vec3V_From_Vec4V_WUndefined(Vec4V v) +{ + return v; +} + +PX_FORCE_INLINE Vec4V Vec4V_From_Vec3V(Vec3V f) +{ + return f; // ok if it is implemented as the same type. +} + +PX_FORCE_INLINE Vec4V Vec4V_From_FloatV(FloatV f) +{ + return vcombine_f32(f, f); +} + +PX_FORCE_INLINE Vec3V Vec3V_From_FloatV(FloatV f) +{ + return Vec3V_From_Vec4V(Vec4V_From_FloatV(f)); +} + +PX_FORCE_INLINE Vec3V Vec3V_From_FloatV_WUndefined(FloatV f) +{ + return Vec3V_From_Vec4V_WUndefined(Vec4V_From_FloatV(f)); +} + +PX_FORCE_INLINE Vec4V Vec4V_From_PxVec3_WUndefined(const PxVec3& f) +{ + PX_ALIGN(16, PxF32) data[4] = { f.x, f.y, f.z, 0.0f }; + return V4LoadA(data); +} + +PX_FORCE_INLINE Mat33V Mat33V_From_PxMat33(const PxMat33& m) +{ + return Mat33V(V3LoadU(m.column0), V3LoadU(m.column1), V3LoadU(m.column2)); +} + +PX_FORCE_INLINE void PxMat33_From_Mat33V(const Mat33V& m, PxMat33& out) +{ + V3StoreU(m.col0, out.column0); + V3StoreU(m.col1, out.column1); + V3StoreU(m.col2, out.column2); +} + +PX_FORCE_INLINE Vec4V V4LoadA(const PxF32* const f) +{ + ASSERT_ISALIGNED16(f); + return vld1q_f32(reinterpret_cast(f)); +} + +PX_FORCE_INLINE void V4StoreA(Vec4V a, PxF32* f) +{ + ASSERT_ISALIGNED16(f); + vst1q_f32(reinterpret_cast(f), a); +} + +PX_FORCE_INLINE void V4StoreU(const Vec4V a, PxF32* f) +{ + PX_ALIGN(16, PxF32) f2[4]; + vst1q_f32(reinterpret_cast(f2), a); + f[0] = f2[0]; + f[1] = f2[1]; + f[2] = f2[2]; + f[3] = f2[3]; +} + +PX_FORCE_INLINE void BStoreA(const BoolV a, PxU32* u) +{ + ASSERT_ISALIGNED16(u); + vst1q_u32(reinterpret_cast(u), a); +} + +PX_FORCE_INLINE void U4StoreA(const VecU32V uv, PxU32* u) +{ + ASSERT_ISALIGNED16(u); + vst1q_u32(reinterpret_cast(u), uv); +} + +PX_FORCE_INLINE void I4StoreA(const VecI32V iv, PxI32* i) +{ + ASSERT_ISALIGNED16(i); + vst1q_s32(reinterpret_cast(i), iv); +} + +PX_FORCE_INLINE Vec4V V4LoadU(const PxF32* const f) +{ + return vld1q_f32(reinterpret_cast(f)); +} + +PX_FORCE_INLINE BoolV BLoad(const bool* const f) +{ + const PX_ALIGN(16, PxU32) b[4] = { static_cast(-static_cast(f[0])), + static_cast(-static_cast(f[1])), + static_cast(-static_cast(f[2])), + static_cast(-static_cast(f[3])) }; + return vld1q_u32(b); +} + +PX_FORCE_INLINE void FStore(const FloatV a, PxF32* PX_RESTRICT f) +{ + ASSERT_ISVALIDFLOATV(a); + // vst1q_lane_f32(f, a, 0); // causes vst1 alignment bug + *f = vget_lane_f32(a, 0); +} + +PX_FORCE_INLINE void Store_From_BoolV(const BoolV a, PxU32* PX_RESTRICT f) +{ + *f = vget_lane_u32(vget_low_u32(a), 0); +} + +PX_FORCE_INLINE void V3StoreA(const Vec3V a, PxVec3& f) +{ + ASSERT_ISALIGNED16(&f); + PX_ALIGN(16, PxF32) f2[4]; + vst1q_f32(reinterpret_cast(f2), a); + f = PxVec3(f2[0], f2[1], f2[2]); +} + +PX_FORCE_INLINE void V3StoreU(const Vec3V a, PxVec3& f) +{ + PX_ALIGN(16, PxF32) f2[4]; + vst1q_f32(reinterpret_cast(f2), a); + f = PxVec3(f2[0], f2[1], f2[2]); +} + +////////////////////////////////// +// FLOATV +////////////////////////////////// + +PX_FORCE_INLINE FloatV FZero() +{ + return FLoad(0.0f); +} + +PX_FORCE_INLINE FloatV FOne() +{ + return FLoad(1.0f); +} + +PX_FORCE_INLINE FloatV FHalf() +{ + return FLoad(0.5f); +} + +PX_FORCE_INLINE FloatV FEps() +{ + return FLoad(PX_EPS_REAL); +} + +PX_FORCE_INLINE FloatV FEps6() +{ + return FLoad(1e-6f); +} + +PX_FORCE_INLINE FloatV FMax() +{ + return FLoad(PX_MAX_REAL); +} + +PX_FORCE_INLINE FloatV FNegMax() +{ + return FLoad(-PX_MAX_REAL); +} + +PX_FORCE_INLINE FloatV IZero() +{ + return vreinterpret_f32_u32(vdup_n_u32(0)); +} + +PX_FORCE_INLINE FloatV IOne() +{ + return vreinterpret_f32_u32(vdup_n_u32(1)); +} + +PX_FORCE_INLINE FloatV ITwo() +{ + return vreinterpret_f32_u32(vdup_n_u32(2)); +} + +PX_FORCE_INLINE FloatV IThree() +{ + return vreinterpret_f32_u32(vdup_n_u32(3)); +} + +PX_FORCE_INLINE FloatV IFour() +{ + return vreinterpret_f32_u32(vdup_n_u32(4)); +} + +PX_FORCE_INLINE FloatV FNeg(const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + return vneg_f32(f); +} + +PX_FORCE_INLINE FloatV FAdd(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return vadd_f32(a, b); +} + +PX_FORCE_INLINE FloatV FSub(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return vsub_f32(a, b); +} + +PX_FORCE_INLINE FloatV FMul(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return vmul_f32(a, b); +} + +template +PX_FORCE_INLINE float32x2_t recip_newton(const float32x2_t& in) +{ + float32x2_t recip = vrecpe_f32(in); + for(int i = 0; i < n; ++i) + recip = vmul_f32(recip, vrecps_f32(in, recip)); + return recip; +} + +template +PX_FORCE_INLINE float32x4_t recipq_newton(const float32x4_t& in) +{ + float32x4_t recip = vrecpeq_f32(in); + for(int i = 0; i < n; ++i) + recip = vmulq_f32(recip, vrecpsq_f32(recip, in)); + return recip; +} + +template +PX_FORCE_INLINE float32x2_t rsqrt_newton(const float32x2_t& in) +{ + float32x2_t rsqrt = vrsqrte_f32(in); + for(int i = 0; i < n; ++i) + rsqrt = vmul_f32(rsqrt, vrsqrts_f32(vmul_f32(rsqrt, rsqrt), in)); + return rsqrt; +} + +template +PX_FORCE_INLINE float32x4_t rsqrtq_newton(const float32x4_t& in) +{ + float32x4_t rsqrt = vrsqrteq_f32(in); + for(int i = 0; i < n; ++i) + rsqrt = vmulq_f32(rsqrt, vrsqrtsq_f32(vmulq_f32(rsqrt, rsqrt), in)); + return rsqrt; +} + +PX_FORCE_INLINE FloatV FDiv(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return vmul_f32(a, VRECIP(b)); +} + +PX_FORCE_INLINE FloatV FDivFast(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return vmul_f32(a, VRECIPE(b)); +} + +PX_FORCE_INLINE FloatV FRecip(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + return VRECIP(a); +} + +PX_FORCE_INLINE FloatV FRecipFast(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + return VRECIPE(a); +} + +PX_FORCE_INLINE FloatV FRsqrt(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + return VRECIPSQRT(a); +} + +PX_FORCE_INLINE FloatV FSqrt(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + return FSel(FIsEq(a, FZero()), a, vmul_f32(a, VRECIPSQRT(a))); +} + +PX_FORCE_INLINE FloatV FRsqrtFast(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + return VRECIPSQRTE(a); +} + +PX_FORCE_INLINE FloatV FScaleAdd(const FloatV a, const FloatV b, const FloatV c) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + ASSERT_ISVALIDFLOATV(c); + return vmla_f32(c, a, b); +} + +PX_FORCE_INLINE FloatV FNegScaleSub(const FloatV a, const FloatV b, const FloatV c) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + ASSERT_ISVALIDFLOATV(c); + return vmls_f32(c, a, b); +} + +PX_FORCE_INLINE FloatV FAbs(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + return vabs_f32(a); +} + +PX_FORCE_INLINE FloatV FSel(const BoolV c, const FloatV a, const FloatV b) +{ + PX_ASSERT( vecMathTests::allElementsEqualBoolV(c, BTTTT()) || + vecMathTests::allElementsEqualBoolV(c, BFFFF())); + ASSERT_ISVALIDFLOATV(vbsl_f32(vget_low_u32(c), a, b)); + return vbsl_f32(vget_low_u32(c), a, b); +} + +PX_FORCE_INLINE BoolV FIsGrtr(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return vdupq_lane_u32(vcgt_f32(a, b), 0); +} + +PX_FORCE_INLINE BoolV FIsGrtrOrEq(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return vdupq_lane_u32(vcge_f32(a, b), 0); +} + +PX_FORCE_INLINE BoolV FIsEq(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return vdupq_lane_u32(vceq_f32(a, b), 0); +} + +PX_FORCE_INLINE FloatV FMax(const FloatV a, const FloatV b) +{ + //ASSERT_ISVALIDFLOATV(a); + //ASSERT_ISVALIDFLOATV(b); + return vmax_f32(a, b); +} + +PX_FORCE_INLINE FloatV FMin(const FloatV a, const FloatV b) +{ + //ASSERT_ISVALIDFLOATV(a); + //ASSERT_ISVALIDFLOATV(b); + return vmin_f32(a, b); +} + +PX_FORCE_INLINE FloatV FClamp(const FloatV a, const FloatV minV, const FloatV maxV) +{ + ASSERT_ISVALIDFLOATV(minV); + ASSERT_ISVALIDFLOATV(maxV); + return vmax_f32(vmin_f32(a, maxV), minV); +} + +PX_FORCE_INLINE PxU32 FAllGrtr(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return vget_lane_u32(vcgt_f32(a, b), 0); +} + +PX_FORCE_INLINE PxU32 FAllGrtrOrEq(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return vget_lane_u32(vcge_f32(a, b), 0); +} + +PX_FORCE_INLINE PxU32 FAllEq(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return vget_lane_u32(vceq_f32(a, b), 0); +} + +PX_FORCE_INLINE FloatV FRound(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + + // truncate(a + (0.5f - sign(a))) + const float32x2_t half = vdup_n_f32(0.5f); + const float32x2_t sign = vcvt_f32_u32((vshr_n_u32(vreinterpret_u32_f32(a), 31))); + const float32x2_t aPlusHalf = vadd_f32(a, half); + const float32x2_t aRound = vsub_f32(aPlusHalf, sign); + int32x2_t tmp = vcvt_s32_f32(aRound); + return vcvt_f32_s32(tmp); +} + +PX_FORCE_INLINE FloatV FSin(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + + // Modulo the range of the given angles such that -XM_2PI <= Angles < XM_2PI + const FloatV recipTwoPi = FLoadA(g_PXReciprocalTwoPi.f); + const FloatV twoPi = FLoadA(g_PXTwoPi.f); + const FloatV tmp = FMul(a, recipTwoPi); + const FloatV b = FRound(tmp); + const FloatV V1 = FNegScaleSub(twoPi, b, a); + + // sin(V) ~= V - V^3 / 3! + V^5 / 5! - V^7 / 7! + V^9 / 9! - V^11 / 11! + V^13 / 13! - + // V^15 / 15! + V^17 / 17! - V^19 / 19! + V^21 / 21! - V^23 / 23! (for -PI <= V < PI) + const FloatV V2 = FMul(V1, V1); + const FloatV V3 = FMul(V2, V1); + const FloatV V5 = FMul(V3, V2); + const FloatV V7 = FMul(V5, V2); + const FloatV V9 = FMul(V7, V2); + const FloatV V11 = FMul(V9, V2); + const FloatV V13 = FMul(V11, V2); + const FloatV V15 = FMul(V13, V2); + const FloatV V17 = FMul(V15, V2); + const FloatV V19 = FMul(V17, V2); + const FloatV V21 = FMul(V19, V2); + const FloatV V23 = FMul(V21, V2); + + const Vec4V sinCoefficients0 = V4LoadA(g_PXSinCoefficients0.f); + const Vec4V sinCoefficients1 = V4LoadA(g_PXSinCoefficients1.f); + const Vec4V sinCoefficients2 = V4LoadA(g_PXSinCoefficients2.f); + + const FloatV S1 = V4GetY(sinCoefficients0); + const FloatV S2 = V4GetZ(sinCoefficients0); + const FloatV S3 = V4GetW(sinCoefficients0); + const FloatV S4 = V4GetX(sinCoefficients1); + const FloatV S5 = V4GetY(sinCoefficients1); + const FloatV S6 = V4GetZ(sinCoefficients1); + const FloatV S7 = V4GetW(sinCoefficients1); + const FloatV S8 = V4GetX(sinCoefficients2); + const FloatV S9 = V4GetY(sinCoefficients2); + const FloatV S10 = V4GetZ(sinCoefficients2); + const FloatV S11 = V4GetW(sinCoefficients2); + + FloatV Result; + Result = FScaleAdd(S1, V3, V1); + Result = FScaleAdd(S2, V5, Result); + Result = FScaleAdd(S3, V7, Result); + Result = FScaleAdd(S4, V9, Result); + Result = FScaleAdd(S5, V11, Result); + Result = FScaleAdd(S6, V13, Result); + Result = FScaleAdd(S7, V15, Result); + Result = FScaleAdd(S8, V17, Result); + Result = FScaleAdd(S9, V19, Result); + Result = FScaleAdd(S10, V21, Result); + Result = FScaleAdd(S11, V23, Result); + + return Result; +} + +PX_FORCE_INLINE FloatV FCos(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + + // Modulo the range of the given angles such that -XM_2PI <= Angles < XM_2PI + const FloatV recipTwoPi = FLoadA(g_PXReciprocalTwoPi.f); + const FloatV twoPi = FLoadA(g_PXTwoPi.f); + const FloatV tmp = FMul(a, recipTwoPi); + const FloatV b = FRound(tmp); + const FloatV V1 = FNegScaleSub(twoPi, b, a); + + // cos(V) ~= 1 - V^2 / 2! + V^4 / 4! - V^6 / 6! + V^8 / 8! - V^10 / 10! + V^12 / 12! - + // V^14 / 14! + V^16 / 16! - V^18 / 18! + V^20 / 20! - V^22 / 22! (for -PI <= V < PI) + const FloatV V2 = FMul(V1, V1); + const FloatV V4 = FMul(V2, V2); + const FloatV V6 = FMul(V4, V2); + const FloatV V8 = FMul(V4, V4); + const FloatV V10 = FMul(V6, V4); + const FloatV V12 = FMul(V6, V6); + const FloatV V14 = FMul(V8, V6); + const FloatV V16 = FMul(V8, V8); + const FloatV V18 = FMul(V10, V8); + const FloatV V20 = FMul(V10, V10); + const FloatV V22 = FMul(V12, V10); + + const Vec4V cosCoefficients0 = V4LoadA(g_PXCosCoefficients0.f); + const Vec4V cosCoefficients1 = V4LoadA(g_PXCosCoefficients1.f); + const Vec4V cosCoefficients2 = V4LoadA(g_PXCosCoefficients2.f); + + const FloatV C1 = V4GetY(cosCoefficients0); + const FloatV C2 = V4GetZ(cosCoefficients0); + const FloatV C3 = V4GetW(cosCoefficients0); + const FloatV C4 = V4GetX(cosCoefficients1); + const FloatV C5 = V4GetY(cosCoefficients1); + const FloatV C6 = V4GetZ(cosCoefficients1); + const FloatV C7 = V4GetW(cosCoefficients1); + const FloatV C8 = V4GetX(cosCoefficients2); + const FloatV C9 = V4GetY(cosCoefficients2); + const FloatV C10 = V4GetZ(cosCoefficients2); + const FloatV C11 = V4GetW(cosCoefficients2); + + FloatV Result; + Result = FScaleAdd(C1, V2, FOne()); + Result = FScaleAdd(C2, V4, Result); + Result = FScaleAdd(C3, V6, Result); + Result = FScaleAdd(C4, V8, Result); + Result = FScaleAdd(C5, V10, Result); + Result = FScaleAdd(C6, V12, Result); + Result = FScaleAdd(C7, V14, Result); + Result = FScaleAdd(C8, V16, Result); + Result = FScaleAdd(C9, V18, Result); + Result = FScaleAdd(C10, V20, Result); + Result = FScaleAdd(C11, V22, Result); + + return Result; +} + +PX_FORCE_INLINE PxU32 FOutOfBounds(const FloatV a, const FloatV min, const FloatV max) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(min); + ASSERT_ISVALIDFLOATV(max); + + const BoolV c = BOr(FIsGrtr(a, max), FIsGrtr(min, a)); + return PxU32(!BAllEqFFFF(c)); +} + +PX_FORCE_INLINE PxU32 FInBounds(const FloatV a, const FloatV min, const FloatV max) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(min); + ASSERT_ISVALIDFLOATV(max); + + const BoolV c = BAnd(FIsGrtrOrEq(a, min), FIsGrtrOrEq(max, a)); + return PxU32(BAllEqTTTT(c)); +} + +PX_FORCE_INLINE PxU32 FOutOfBounds(const FloatV a, const FloatV bounds) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(bounds); + const uint32x2_t greater = vcagt_f32(a, bounds); + return vget_lane_u32(greater, 0); +} + +PX_FORCE_INLINE PxU32 FInBounds(const FloatV a, const FloatV bounds) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(bounds); + const uint32x2_t geq = vcage_f32(bounds, a); + return vget_lane_u32(geq, 0); +} + +////////////////////////////////// +// VEC3V +////////////////////////////////// + +PX_FORCE_INLINE Vec3V V3Splat(const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + + const uint32x2_t mask = { 0xffffFFFF, 0x0 }; + const uint32x2_t uHigh = vreinterpret_u32_f32(f); + const float32x2_t dHigh = vreinterpret_f32_u32(vand_u32(uHigh, mask)); + + return vcombine_f32(f, dHigh); +} + +PX_FORCE_INLINE Vec3V V3Merge(const FloatVArg x, const FloatVArg y, const FloatVArg z) +{ + ASSERT_ISVALIDFLOATV(x); + ASSERT_ISVALIDFLOATV(y); + ASSERT_ISVALIDFLOATV(z); + + const uint32x2_t mask = { 0xffffFFFF, 0x0 }; + const uint32x2_t dHigh = vand_u32(vreinterpret_u32_f32(z), mask); + const uint32x2_t dLow = vext_u32(vreinterpret_u32_f32(x), vreinterpret_u32_f32(y), 1); + return vreinterpretq_f32_u32(vcombine_u32(dLow, dHigh)); +} + +PX_FORCE_INLINE Vec3V V3UnitX() +{ + const float32x4_t x = { 1.0f, 0.0f, 0.0f, 0.0f }; + return x; +} + +PX_FORCE_INLINE Vec3V V3UnitY() +{ + const float32x4_t y = { 0, 1.0f, 0, 0 }; + return y; +} + +PX_FORCE_INLINE Vec3V V3UnitZ() +{ + const float32x4_t z = { 0, 0, 1.0f, 0 }; + return z; +} + +PX_FORCE_INLINE FloatV V3GetX(const Vec3V f) +{ + ASSERT_ISVALIDVEC3V(f); + const float32x2_t fLow = vget_low_f32(f); + return vdup_lane_f32(fLow, 0); +} + +PX_FORCE_INLINE FloatV V3GetY(const Vec3V f) +{ + ASSERT_ISVALIDVEC3V(f); + const float32x2_t fLow = vget_low_f32(f); + return vdup_lane_f32(fLow, 1); +} + +PX_FORCE_INLINE FloatV V3GetZ(const Vec3V f) +{ + ASSERT_ISVALIDVEC3V(f); + const float32x2_t fhigh = vget_high_f32(f); + return vdup_lane_f32(fhigh, 0); +} + +PX_FORCE_INLINE Vec3V V3SetX(const Vec3V v, const FloatV f) +{ + ASSERT_ISVALIDVEC3V(v); + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BFTTT(), v, vcombine_f32(f, f)); +} + +PX_FORCE_INLINE Vec3V V3SetY(const Vec3V v, const FloatV f) +{ + ASSERT_ISVALIDVEC3V(v); + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BTFTT(), v, vcombine_f32(f, f)); +} + +PX_FORCE_INLINE Vec3V V3SetZ(const Vec3V v, const FloatV f) +{ + ASSERT_ISVALIDVEC3V(v); + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BTTFT(), v, vcombine_f32(f, f)); +} + +PX_FORCE_INLINE Vec3V V3ColX(const Vec3V a, const Vec3V b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + ASSERT_ISVALIDVEC3V(c); + + const float32x2_t aLow = vget_low_f32(a); + const float32x2_t bLow = vget_low_f32(b); + const float32x2_t cLow = vget_low_f32(c); + const float32x2_t zero = vdup_n_f32(0.0f); + + const float32x2x2_t zipL = vzip_f32(aLow, bLow); + const float32x2x2_t zipH = vzip_f32(cLow, zero); + + return vcombine_f32(zipL.val[0], zipH.val[0]); +} + +PX_FORCE_INLINE Vec3V V3ColY(const Vec3V a, const Vec3V b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + ASSERT_ISVALIDVEC3V(c); + + const float32x2_t aLow = vget_low_f32(a); + const float32x2_t bLow = vget_low_f32(b); + const float32x2_t cLow = vget_low_f32(c); + const float32x2_t zero = vdup_n_f32(0.0f); + + const float32x2x2_t zipL = vzip_f32(aLow, bLow); + const float32x2x2_t zipH = vzip_f32(cLow, zero); + + return vcombine_f32(zipL.val[1], zipH.val[1]); +} + +PX_FORCE_INLINE Vec3V V3ColZ(const Vec3V a, const Vec3V b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + ASSERT_ISVALIDVEC3V(c); + + const float32x2_t aHi = vget_high_f32(a); + const float32x2_t bHi = vget_high_f32(b); + const float32x2_t cHi = vget_high_f32(c); + + const float32x2x2_t zipL = vzip_f32(aHi, bHi); + + return vcombine_f32(zipL.val[0], cHi); +} + +PX_FORCE_INLINE Vec3V V3Zero() +{ + return vdupq_n_f32(0.0f); +} + +PX_FORCE_INLINE Vec3V V3Eps() +{ + return V3Load(PX_EPS_REAL); +} + +PX_FORCE_INLINE Vec3V V3One() +{ + return V3Load(1.0f); +} + +PX_FORCE_INLINE Vec3V V3Neg(const Vec3V f) +{ + ASSERT_ISVALIDVEC3V(f); + const float32x4_t tmp = vnegq_f32(f); + return vsetq_lane_f32(0.0f, tmp, 3); +} + +PX_FORCE_INLINE Vec3V V3Add(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return vaddq_f32(a, b); +} + +PX_FORCE_INLINE Vec3V V3Add(const Vec3V a, const FloatV b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDFLOATV(b); + return vaddq_f32(a, Vec3V_From_FloatV(b)); +} + +PX_FORCE_INLINE Vec3V V3Sub(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return vsubq_f32(a, b); +} + +PX_FORCE_INLINE Vec3V V3Sub(const Vec3V a, const FloatV b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDFLOATV(b); + return vsubq_f32(a, Vec3V_From_FloatV(b)); +} + +PX_FORCE_INLINE Vec3V V3Scale(const Vec3V a, const FloatV b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDFLOATV(b); + const float32x4_t tmp = vmulq_lane_f32(a, b, 0); + return vsetq_lane_f32(0.0f, tmp, 3); +} + +PX_FORCE_INLINE Vec3V V3Mul(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return vmulq_f32(a, b); +} + +PX_FORCE_INLINE Vec3V V3ScaleInv(const Vec3V a, const FloatV b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDFLOATV(b); + const float32x2_t invB = VRECIP(b); + const float32x4_t tmp = vmulq_lane_f32(a, invB, 0); + return vsetq_lane_f32(0.0f, tmp, 3); +} + +PX_FORCE_INLINE Vec3V V3Div(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + float32x4_t invB = VRECIPQ(b); + invB = vsetq_lane_f32(0.0f, invB, 3); + return vmulq_f32(a, invB); +} + +PX_FORCE_INLINE Vec3V V3ScaleInvFast(const Vec3V a, const FloatV b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDFLOATV(b); + const float32x2_t invB = VRECIPE(b); + const float32x4_t tmp = vmulq_lane_f32(a, invB, 0); + return vsetq_lane_f32(0.0f, tmp, 3); +} + +PX_FORCE_INLINE Vec3V V3DivFast(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + float32x4_t invB = VRECIPEQ(b); + invB = vsetq_lane_f32(0.0f, invB, 3); + return vmulq_f32(a, invB); +} + +PX_FORCE_INLINE Vec3V V3Recip(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const float32x4_t recipA = VRECIPQ(a); + return vsetq_lane_f32(0.0f, recipA, 3); +} + +PX_FORCE_INLINE Vec3V V3RecipFast(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const float32x4_t recipA = VRECIPEQ(a); + return vsetq_lane_f32(0.0f, recipA, 3); +} + +PX_FORCE_INLINE Vec3V V3Rsqrt(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const float32x4_t rSqrA = VRECIPSQRTQ(a); + return vsetq_lane_f32(0.0f, rSqrA, 3); +} + +PX_FORCE_INLINE Vec3V V3RsqrtFast(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const float32x4_t rSqrA = VRECIPSQRTEQ(a); + return vsetq_lane_f32(0.0f, rSqrA, 3); +} + +PX_FORCE_INLINE Vec3V V3ScaleAdd(const Vec3V a, const FloatV b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDFLOATV(b); + ASSERT_ISVALIDVEC3V(c); + + float32x4_t tmp = vmlaq_lane_f32(c, a, b, 0); + // using vsetq_lane_f32 resulted in failures, + // probably related to a compiler bug on + // ndk r9d-win32, gcc 4.8, cardhu/shield + + // code with issue + // return vsetq_lane_f32(0.0f, tmp, 3); + + // workaround + float32x2_t w_z = vget_high_f32(tmp); + float32x2_t y_x = vget_low_f32(tmp); + w_z = vset_lane_f32(0.0f, w_z, 1); + return vcombine_f32(y_x, w_z); +} + +PX_FORCE_INLINE Vec3V V3NegScaleSub(const Vec3V a, const FloatV b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDFLOATV(b); + ASSERT_ISVALIDVEC3V(c); + + float32x4_t tmp = vmlsq_lane_f32(c, a, b, 0); + // using vsetq_lane_f32 resulted in failures, + // probably related to a compiler bug on + // ndk r9d-win32, gcc 4.8, cardhu/shield + + // code with issue + // return vsetq_lane_f32(0.0f, tmp, 3); + + // workaround + float32x2_t w_z = vget_high_f32(tmp); + float32x2_t y_x = vget_low_f32(tmp); + w_z = vset_lane_f32(0.0f, w_z, 1); + return vcombine_f32(y_x, w_z); +} + +PX_FORCE_INLINE Vec3V V3MulAdd(const Vec3V a, const Vec3V b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + ASSERT_ISVALIDVEC3V(c); + return vmlaq_f32(c, a, b); +} + +PX_FORCE_INLINE Vec3V V3NegMulSub(const Vec3V a, const Vec3V b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + ASSERT_ISVALIDVEC3V(c); + return vmlsq_f32(c, a, b); +} + +PX_FORCE_INLINE Vec3V V3Abs(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return vabsq_f32(a); +} + +PX_FORCE_INLINE FloatV V3Dot(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + + // const uint32x2_t mask = {0xffffFFFF, 0x0}; + const float32x4_t tmp = vmulq_f32(a, b); + + const float32x2_t low = vget_low_f32(tmp); + const float32x2_t high = vget_high_f32(tmp); + // const float32x2_t high = vreinterpret_f32_u32(vand_u32(vreinterpret_u32_f32(high_), mask)); + + const float32x2_t sumTmp = vpadd_f32(low, high); // = {0+z, x+y} + const float32x2_t sum0ZYX = vpadd_f32(sumTmp, sumTmp); // = {x+y+z, x+y+z} + + return sum0ZYX; +} + +PX_FORCE_INLINE Vec3V V3Cross(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + + const uint32x2_t TF = { 0xffffFFFF, 0x0 }; + const float32x2_t ay_ax = vget_low_f32(a); // d2 + const float32x2_t aw_az = vget_high_f32(a); // d3 + const float32x2_t by_bx = vget_low_f32(b); // d4 + const float32x2_t bw_bz = vget_high_f32(b); // d5 + // Hi, Lo + const float32x2_t bz_by = vext_f32(by_bx, bw_bz, 1); // bz, by + const float32x2_t az_ay = vext_f32(ay_ax, aw_az, 1); // az, ay + + const float32x2_t azbx = vmul_f32(aw_az, by_bx); // 0, az*bx + const float32x2_t aybz_axby = vmul_f32(ay_ax, bz_by); // ay*bz, ax*by + + const float32x2_t azbxSUBaxbz = vmls_f32(azbx, bw_bz, ay_ax); // 0, az*bx-ax*bz + const float32x2_t aybzSUBazby_axbySUBaybx = vmls_f32(aybz_axby, by_bx, az_ay); // ay*bz-az*by, ax*by-ay*bx + + const float32x2_t retLow = vext_f32(aybzSUBazby_axbySUBaybx, azbxSUBaxbz, 1); // az*bx-ax*bz, ay*bz-az*by + const uint32x2_t retHigh = vand_u32(TF, vreinterpret_u32_f32(aybzSUBazby_axbySUBaybx)); // 0, ax*by-ay*bx + + return vcombine_f32(retLow, vreinterpret_f32_u32(retHigh)); +} + +PX_FORCE_INLINE VecCrossV V3PrepareCross(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return a; +} + +PX_FORCE_INLINE FloatV V3Length(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + + // const uint32x2_t mask = {0xffffFFFF, 0x0}; + + const float32x4_t tmp = vmulq_f32(a, a); + const float32x2_t low = vget_low_f32(tmp); + const float32x2_t high = vget_high_f32(tmp); + // const float32x2_t high = vreinterpret_f32_u32(vand_u32(vreinterpret_u32_f32(high_), mask)); + + const float32x2_t sumTmp = vpadd_f32(low, high); // = {0+z, x+y} + const float32x2_t sum0ZYX = vpadd_f32(sumTmp, sumTmp); // = {x+y+z, x+y+z} + + return FSqrt(sum0ZYX); +} + +PX_FORCE_INLINE FloatV V3LengthSq(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return V3Dot(a, a); +} + +PX_FORCE_INLINE Vec3V V3Normalize(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + //PX_ASSERT(!FAllEq(V4LengthSq(a), FZero())); + return V3ScaleInv(a, V3Length(a)); +} + +PX_FORCE_INLINE Vec3V V3NormalizeFast(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + //PX_ASSERT(!FAllEq(V4LengthSq(a), FZero())); + return V3Scale(a, VRECIPSQRTE(V3Dot(a, a))); +} + +PX_FORCE_INLINE Vec3V V3NormalizeSafe(const Vec3V a, const Vec3V unsafeReturnValue) +{ + ASSERT_ISVALIDVEC3V(a); + const FloatV zero = vdup_n_f32(0.0f); + const FloatV length = V3Length(a); + const uint32x4_t isGreaterThanZero = FIsGrtr(length, zero); + return V3Sel(isGreaterThanZero, V3ScaleInv(a, length), unsafeReturnValue); +} + +PX_FORCE_INLINE Vec3V V3Sel(const BoolV c, const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V( vbslq_f32(c, a, b)); + return vbslq_f32(c, a, b); +} + +PX_FORCE_INLINE BoolV V3IsGrtr(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return vcgtq_f32(a, b); +} + +PX_FORCE_INLINE BoolV V3IsGrtrOrEq(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return vcgeq_f32(a, b); +} + +PX_FORCE_INLINE BoolV V3IsEq(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return vceqq_f32(a, b); +} + +PX_FORCE_INLINE Vec3V V3Max(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return vmaxq_f32(a, b); +} + +PX_FORCE_INLINE Vec3V V3Min(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return vminq_f32(a, b); +} + +PX_FORCE_INLINE FloatV V3ExtractMax(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + + const float32x2_t low = vget_low_f32(a); + const float32x2_t high = vget_high_f32(a); + + const float32x2_t zz = vdup_lane_f32(high, 0); + const float32x2_t max0 = vpmax_f32(zz, low); + const float32x2_t max1 = vpmax_f32(max0, max0); + + return max1; +} + +PX_FORCE_INLINE FloatV V3ExtractMin(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + + const float32x2_t low = vget_low_f32(a); + const float32x2_t high = vget_high_f32(a); + + const float32x2_t zz = vdup_lane_f32(high, 0); + const float32x2_t min0 = vpmin_f32(zz, low); + const float32x2_t min1 = vpmin_f32(min0, min0); + + return min1; +} + +// return (a >= 0.0f) ? 1.0f : -1.0f; +PX_FORCE_INLINE Vec3V V3Sign(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const Vec3V zero = V3Zero(); + const Vec3V one = V3One(); + const Vec3V none = V3Neg(one); + return V3Sel(V3IsGrtrOrEq(a, zero), one, none); +} + +PX_FORCE_INLINE Vec3V V3Clamp(const Vec3V a, const Vec3V minV, const Vec3V maxV) +{ + ASSERT_ISVALIDVEC3V(minV); + ASSERT_ISVALIDVEC3V(maxV); + return V3Max(V3Min(a, maxV), minV); +} + +PX_FORCE_INLINE PxU32 V3AllGrtr(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return internalUnitNeonSimd::BAllTrue3_R(V4IsGrtr(a, b)); +} + +PX_FORCE_INLINE PxU32 V3AllGrtrOrEq(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return internalUnitNeonSimd::BAllTrue3_R(V4IsGrtrOrEq(a, b)); +} + +PX_FORCE_INLINE PxU32 V3AllEq(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return internalUnitNeonSimd::BAllTrue3_R(V4IsEq(a, b)); +} + +PX_FORCE_INLINE Vec3V V3Round(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + // truncate(a + (0.5f - sign(a))) + const Vec3V half = V3Load(0.5f); + const float32x4_t sign = vcvtq_f32_u32((vshrq_n_u32(vreinterpretq_u32_f32(a), 31))); + const Vec3V aPlusHalf = V3Add(a, half); + const Vec3V aRound = V3Sub(aPlusHalf, sign); + return vcvtq_f32_s32(vcvtq_s32_f32(aRound)); +} + +PX_FORCE_INLINE Vec3V V3Sin(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + + // Modulo the range of the given angles such that -XM_2PI <= Angles < XM_2PI + const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f); + const Vec4V twoPi = V4LoadA(g_PXTwoPi.f); + const Vec3V tmp = V4Mul(a, recipTwoPi); + const Vec3V b = V3Round(tmp); + const Vec3V V1 = V4NegMulSub(twoPi, b, a); + + // sin(V) ~= V - V^3 / 3! + V^5 / 5! - V^7 / 7! + V^9 / 9! - V^11 / 11! + V^13 / 13! - + // V^15 / 15! + V^17 / 17! - V^19 / 19! + V^21 / 21! - V^23 / 23! (for -PI <= V < PI) + const Vec3V V2 = V3Mul(V1, V1); + const Vec3V V3 = V3Mul(V2, V1); + const Vec3V V5 = V3Mul(V3, V2); + const Vec3V V7 = V3Mul(V5, V2); + const Vec3V V9 = V3Mul(V7, V2); + const Vec3V V11 = V3Mul(V9, V2); + const Vec3V V13 = V3Mul(V11, V2); + const Vec3V V15 = V3Mul(V13, V2); + const Vec3V V17 = V3Mul(V15, V2); + const Vec3V V19 = V3Mul(V17, V2); + const Vec3V V21 = V3Mul(V19, V2); + const Vec3V V23 = V3Mul(V21, V2); + + const Vec4V sinCoefficients0 = V4LoadA(g_PXSinCoefficients0.f); + const Vec4V sinCoefficients1 = V4LoadA(g_PXSinCoefficients1.f); + const Vec4V sinCoefficients2 = V4LoadA(g_PXSinCoefficients2.f); + + const FloatV S1 = V4GetY(sinCoefficients0); + const FloatV S2 = V4GetZ(sinCoefficients0); + const FloatV S3 = V4GetW(sinCoefficients0); + const FloatV S4 = V4GetX(sinCoefficients1); + const FloatV S5 = V4GetY(sinCoefficients1); + const FloatV S6 = V4GetZ(sinCoefficients1); + const FloatV S7 = V4GetW(sinCoefficients1); + const FloatV S8 = V4GetX(sinCoefficients2); + const FloatV S9 = V4GetY(sinCoefficients2); + const FloatV S10 = V4GetZ(sinCoefficients2); + const FloatV S11 = V4GetW(sinCoefficients2); + + Vec3V Result; + Result = V4ScaleAdd(V3, S1, V1); + Result = V4ScaleAdd(V5, S2, Result); + Result = V4ScaleAdd(V7, S3, Result); + Result = V4ScaleAdd(V9, S4, Result); + Result = V4ScaleAdd(V11, S5, Result); + Result = V4ScaleAdd(V13, S6, Result); + Result = V4ScaleAdd(V15, S7, Result); + Result = V4ScaleAdd(V17, S8, Result); + Result = V4ScaleAdd(V19, S9, Result); + Result = V4ScaleAdd(V21, S10, Result); + Result = V4ScaleAdd(V23, S11, Result); + + return Result; +} + +PX_FORCE_INLINE Vec3V V3Cos(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + + // Modulo the range of the given angles such that -XM_2PI <= Angles < XM_2PI + const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f); + const Vec4V twoPi = V4LoadA(g_PXTwoPi.f); + const Vec3V tmp = V4Mul(a, recipTwoPi); + const Vec3V b = V3Round(tmp); + const Vec3V V1 = V4NegMulSub(twoPi, b, a); + + // cos(V) ~= 1 - V^2 / 2! + V^4 / 4! - V^6 / 6! + V^8 / 8! - V^10 / 10! + V^12 / 12! - + // V^14 / 14! + V^16 / 16! - V^18 / 18! + V^20 / 20! - V^22 / 22! (for -PI <= V < PI) + const Vec3V V2 = V3Mul(V1, V1); + const Vec3V V4 = V3Mul(V2, V2); + const Vec3V V6 = V3Mul(V4, V2); + const Vec3V V8 = V3Mul(V4, V4); + const Vec3V V10 = V3Mul(V6, V4); + const Vec3V V12 = V3Mul(V6, V6); + const Vec3V V14 = V3Mul(V8, V6); + const Vec3V V16 = V3Mul(V8, V8); + const Vec3V V18 = V3Mul(V10, V8); + const Vec3V V20 = V3Mul(V10, V10); + const Vec3V V22 = V3Mul(V12, V10); + + const Vec4V cosCoefficients0 = V4LoadA(g_PXCosCoefficients0.f); + const Vec4V cosCoefficients1 = V4LoadA(g_PXCosCoefficients1.f); + const Vec4V cosCoefficients2 = V4LoadA(g_PXCosCoefficients2.f); + + const FloatV C1 = V4GetY(cosCoefficients0); + const FloatV C2 = V4GetZ(cosCoefficients0); + const FloatV C3 = V4GetW(cosCoefficients0); + const FloatV C4 = V4GetX(cosCoefficients1); + const FloatV C5 = V4GetY(cosCoefficients1); + const FloatV C6 = V4GetZ(cosCoefficients1); + const FloatV C7 = V4GetW(cosCoefficients1); + const FloatV C8 = V4GetX(cosCoefficients2); + const FloatV C9 = V4GetY(cosCoefficients2); + const FloatV C10 = V4GetZ(cosCoefficients2); + const FloatV C11 = V4GetW(cosCoefficients2); + + Vec3V Result; + Result = V4ScaleAdd(V2, C1, V4One()); + Result = V4ScaleAdd(V4, C2, Result); + Result = V4ScaleAdd(V6, C3, Result); + Result = V4ScaleAdd(V8, C4, Result); + Result = V4ScaleAdd(V10, C5, Result); + Result = V4ScaleAdd(V12, C6, Result); + Result = V4ScaleAdd(V14, C7, Result); + Result = V4ScaleAdd(V16, C8, Result); + Result = V4ScaleAdd(V18, C9, Result); + Result = V4ScaleAdd(V20, C10, Result); + Result = V4ScaleAdd(V22, C11, Result); + + return V4ClearW(Result); +} + +PX_FORCE_INLINE Vec3V V3PermYZZ(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const float32x2_t xy = vget_low_f32(a); + const float32x2_t zw = vget_high_f32(a); + const float32x2_t yz = vext_f32(xy, zw, 1); + return vcombine_f32(yz, zw); +} + +PX_FORCE_INLINE Vec3V V3PermXYX(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + + const uint32x2_t mask = { 0xffffFFFF, 0x0 }; + const uint32x2_t xy = vget_low_u32(vreinterpretq_u32_f32(a)); + const uint32x2_t xw = vand_u32(xy, mask); + return vreinterpretq_f32_u32(vcombine_u32(xy, xw)); +} + +PX_FORCE_INLINE Vec3V V3PermYZX(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + + const uint32x2_t mask = { 0xffffFFFF, 0x0 }; + const uint32x2_t xy = vget_low_u32(vreinterpretq_u32_f32(a)); + const uint32x2_t zw = vget_high_u32(vreinterpretq_u32_f32(a)); + const uint32x2_t yz = vext_u32(xy, zw, 1); + const uint32x2_t xw = vand_u32(xy, mask); + return vreinterpretq_f32_u32(vcombine_u32(yz, xw)); +} + +PX_FORCE_INLINE Vec3V V3PermZXY(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + + const uint32x2_t xy = vget_low_u32(vreinterpretq_u32_f32(a)); + const uint32x2_t zw = vget_high_u32(vreinterpretq_u32_f32(a)); + const uint32x2_t wz = vrev64_u32(zw); + + const uint32x2_t zx = vext_u32(wz, xy, 1); + const uint32x2_t yw = vext_u32(xy, wz, 1); + + return vreinterpretq_f32_u32(vcombine_u32(zx, yw)); +} + +PX_FORCE_INLINE Vec3V V3PermZZY(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + + const uint32x2_t xy = vget_low_u32(vreinterpretq_u32_f32(a)); + const uint32x2_t zw = vget_high_u32(vreinterpretq_u32_f32(a)); + + const uint32x2_t wz = vrev64_u32(zw); + const uint32x2_t yw = vext_u32(xy, wz, 1); + const uint32x2_t zz = vdup_lane_u32(wz, 1); + + return vreinterpretq_f32_u32(vcombine_u32(zz, yw)); +} + +PX_FORCE_INLINE Vec3V V3PermYXX(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + + const uint32x2_t mask = { 0xffffFFFF, 0x0 }; + const uint32x2_t xy = vget_low_u32(vreinterpretq_u32_f32(a)); + const uint32x2_t yx = vrev64_u32(xy); + const uint32x2_t xw = vand_u32(xy, mask); + return vreinterpretq_f32_u32(vcombine_u32(yx, xw)); +} + +PX_FORCE_INLINE Vec3V V3Perm_Zero_1Z_0Y(const Vec3V v0, const Vec3V v1) +{ + ASSERT_ISVALIDVEC3V(v0); + ASSERT_ISVALIDVEC3V(v1); + + const uint32x2_t xy = vget_low_u32(vreinterpretq_u32_f32(v0)); + const uint32x2_t zw = vget_high_u32(vreinterpretq_u32_f32(v1)); + const uint32x2_t wz = vrev64_u32(zw); + const uint32x2_t yw = vext_u32(xy, wz, 1); + + return vreinterpretq_f32_u32(vcombine_u32(wz, yw)); +} + +PX_FORCE_INLINE Vec3V V3Perm_0Z_Zero_1X(const Vec3V v0, const Vec3V v1) +{ + ASSERT_ISVALIDVEC3V(v0); + ASSERT_ISVALIDVEC3V(v1); + + const uint32x2_t mask = { 0xffffFFFF, 0x0 }; + const uint32x2_t zw = vget_high_u32(vreinterpretq_u32_f32(v0)); + const uint32x2_t xy = vget_low_u32(vreinterpretq_u32_f32(v1)); + const uint32x2_t xw = vand_u32(xy, mask); + + return vreinterpretq_f32_u32(vcombine_u32(zw, xw)); +} + +PX_FORCE_INLINE Vec3V V3Perm_1Y_0X_Zero(const Vec3V v0, const Vec3V v1) +{ + ASSERT_ISVALIDVEC3V(v0); + ASSERT_ISVALIDVEC3V(v1); + + const uint32x2_t axy = vget_low_u32(vreinterpretq_u32_f32(v0)); + const uint32x2_t bxy = vget_low_u32(vreinterpretq_u32_f32(v1)); + const uint32x2_t byax = vext_u32(bxy, axy, 1); + const uint32x2_t ww = vdup_n_u32(0); + + return vreinterpretq_f32_u32(vcombine_u32(byax, ww)); +} + +PX_FORCE_INLINE FloatV V3SumElems(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + + // const uint32x2_t mask = {0xffffFFFF, 0x0}; + + const float32x2_t low = vget_low_f32(a); + const float32x2_t high = vget_high_f32(a); + // const float32x2_t high = vreinterpret_f32_u32(vand_u32(vreinterpret_u32_f32(high_), mask)); + + const float32x2_t sumTmp = vpadd_f32(low, high); // = {0+z, x+y} + const float32x2_t sum0ZYX = vpadd_f32(sumTmp, sumTmp); // = {x+y+z, x+y+z} + + return sum0ZYX; +} + +PX_FORCE_INLINE PxU32 V3OutOfBounds(const Vec3V a, const Vec3V min, const Vec3V max) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(min); + ASSERT_ISVALIDVEC3V(max); + + const BoolV c = BOr(V3IsGrtr(a, max), V3IsGrtr(min, a)); + return internalUnitNeonSimd::BAnyTrue3_R(c); +} + +PX_FORCE_INLINE PxU32 V3InBounds(const Vec3V a, const Vec3V min, const Vec3V max) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(min); + ASSERT_ISVALIDVEC3V(max); + + const BoolV c = BAnd(V3IsGrtrOrEq(a, min), V3IsGrtrOrEq(max, a)); + return internalUnitNeonSimd::BAllTrue4_R(c); +} + +PX_FORCE_INLINE PxU32 V3OutOfBounds(const Vec3V a, const Vec3V bounds) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(bounds); + + const BoolV greater = V3IsGrtr(V3Abs(a), bounds); + return internalUnitNeonSimd::BAnyTrue3_R(greater); +} + +PX_FORCE_INLINE PxU32 V3InBounds(const Vec3V a, const Vec3V bounds) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(bounds); + + const BoolV greaterOrEq = V3IsGrtrOrEq(bounds, V3Abs(a)); + return internalUnitNeonSimd::BAllTrue4_R(greaterOrEq); +} + +PX_FORCE_INLINE void V3Transpose(Vec3V& col0, Vec3V& col1, Vec3V& col2) +{ + ASSERT_ISVALIDVEC3V(col0); + ASSERT_ISVALIDVEC3V(col1); + ASSERT_ISVALIDVEC3V(col2); + + Vec3V col3 = V3Zero(); + const float32x4x2_t v0v1 = vzipq_f32(col0, col2); + const float32x4x2_t v2v3 = vzipq_f32(col1, col3); + const float32x4x2_t zip0 = vzipq_f32(v0v1.val[0], v2v3.val[0]); + const float32x4x2_t zip1 = vzipq_f32(v0v1.val[1], v2v3.val[1]); + col0 = zip0.val[0]; + col1 = zip0.val[1]; + col2 = zip1.val[0]; + // col3 = zip1.val[1]; +} + +////////////////////////////////// +// VEC4V +////////////////////////////////// + +PX_FORCE_INLINE Vec4V V4Splat(const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + return vcombine_f32(f, f); +} + +PX_FORCE_INLINE Vec4V V4Merge(const FloatV* const floatVArray) +{ + ASSERT_ISVALIDFLOATV(floatVArray[0]); + ASSERT_ISVALIDFLOATV(floatVArray[1]); + ASSERT_ISVALIDFLOATV(floatVArray[2]); + ASSERT_ISVALIDFLOATV(floatVArray[3]); + + const uint32x2_t xLow = vreinterpret_u32_f32(floatVArray[0]); + const uint32x2_t yLow = vreinterpret_u32_f32(floatVArray[1]); + const uint32x2_t zLow = vreinterpret_u32_f32(floatVArray[2]); + const uint32x2_t wLow = vreinterpret_u32_f32(floatVArray[3]); + + const uint32x2_t dLow = vext_u32(xLow, yLow, 1); + const uint32x2_t dHigh = vext_u32(zLow, wLow, 1); + + return vreinterpretq_f32_u32(vcombine_u32(dLow, dHigh)); +} + +PX_FORCE_INLINE Vec4V V4Merge(const FloatVArg x, const FloatVArg y, const FloatVArg z, const FloatVArg w) +{ + ASSERT_ISVALIDFLOATV(x); + ASSERT_ISVALIDFLOATV(y); + ASSERT_ISVALIDFLOATV(z); + ASSERT_ISVALIDFLOATV(w); + + const uint32x2_t xLow = vreinterpret_u32_f32(x); + const uint32x2_t yLow = vreinterpret_u32_f32(y); + const uint32x2_t zLow = vreinterpret_u32_f32(z); + const uint32x2_t wLow = vreinterpret_u32_f32(w); + + const uint32x2_t dLow = vext_u32(xLow, yLow, 1); + const uint32x2_t dHigh = vext_u32(zLow, wLow, 1); + + return vreinterpretq_f32_u32(vcombine_u32(dLow, dHigh)); +} + +PX_FORCE_INLINE Vec4V V4MergeW(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w) +{ + const float32x2_t xx = vget_high_f32(x); + const float32x2_t yy = vget_high_f32(y); + const float32x2_t zz = vget_high_f32(z); + const float32x2_t ww = vget_high_f32(w); + + const float32x2x2_t zipL = vzip_f32(xx, yy); + const float32x2x2_t zipH = vzip_f32(zz, ww); + + return vcombine_f32(zipL.val[1], zipH.val[1]); +} + +PX_FORCE_INLINE Vec4V V4MergeZ(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w) +{ + const float32x2_t xx = vget_high_f32(x); + const float32x2_t yy = vget_high_f32(y); + const float32x2_t zz = vget_high_f32(z); + const float32x2_t ww = vget_high_f32(w); + + const float32x2x2_t zipL = vzip_f32(xx, yy); + const float32x2x2_t zipH = vzip_f32(zz, ww); + + return vcombine_f32(zipL.val[0], zipH.val[0]); +} + +PX_FORCE_INLINE Vec4V V4MergeY(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w) +{ + const float32x2_t xx = vget_low_f32(x); + const float32x2_t yy = vget_low_f32(y); + const float32x2_t zz = vget_low_f32(z); + const float32x2_t ww = vget_low_f32(w); + + const float32x2x2_t zipL = vzip_f32(xx, yy); + const float32x2x2_t zipH = vzip_f32(zz, ww); + + return vcombine_f32(zipL.val[1], zipH.val[1]); +} + +PX_FORCE_INLINE Vec4V V4MergeX(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w) +{ + const float32x2_t xx = vget_low_f32(x); + const float32x2_t yy = vget_low_f32(y); + const float32x2_t zz = vget_low_f32(z); + const float32x2_t ww = vget_low_f32(w); + + const float32x2x2_t zipL = vzip_f32(xx, yy); + const float32x2x2_t zipH = vzip_f32(zz, ww); + + return vcombine_f32(zipL.val[0], zipH.val[0]); +} + +PX_FORCE_INLINE Vec4V V4UnpackXY(const Vec4VArg a, const Vec4VArg b) +{ + return vzipq_f32(a, b).val[0]; +} + +PX_FORCE_INLINE Vec4V V4UnpackZW(const Vec4VArg a, const Vec4VArg b) +{ + return vzipq_f32(a, b).val[1]; +} + +PX_FORCE_INLINE Vec4V V4UnitW() +{ + const float32x2_t zeros = vreinterpret_f32_u32(vmov_n_u32(0)); + const float32x2_t ones = vmov_n_f32(1.0f); + const float32x2_t zo = vext_f32(zeros, ones, 1); + return vcombine_f32(zeros, zo); +} + +PX_FORCE_INLINE Vec4V V4UnitX() +{ + const float32x2_t zeros = vreinterpret_f32_u32(vmov_n_u32(0)); + const float32x2_t ones = vmov_n_f32(1.0f); + const float32x2_t oz = vext_f32(ones, zeros, 1); + return vcombine_f32(oz, zeros); +} + +PX_FORCE_INLINE Vec4V V4UnitY() +{ + const float32x2_t zeros = vreinterpret_f32_u32(vmov_n_u32(0)); + const float32x2_t ones = vmov_n_f32(1.0f); + const float32x2_t zo = vext_f32(zeros, ones, 1); + return vcombine_f32(zo, zeros); +} + +PX_FORCE_INLINE Vec4V V4UnitZ() +{ + const float32x2_t zeros = vreinterpret_f32_u32(vmov_n_u32(0)); + const float32x2_t ones = vmov_n_f32(1.0f); + const float32x2_t oz = vext_f32(ones, zeros, 1); + return vcombine_f32(zeros, oz); +} + +PX_FORCE_INLINE FloatV V4GetW(const Vec4V f) +{ + const float32x2_t fhigh = vget_high_f32(f); + return vdup_lane_f32(fhigh, 1); +} + +PX_FORCE_INLINE FloatV V4GetX(const Vec4V f) +{ + const float32x2_t fLow = vget_low_f32(f); + return vdup_lane_f32(fLow, 0); +} + +PX_FORCE_INLINE FloatV V4GetY(const Vec4V f) +{ + const float32x2_t fLow = vget_low_f32(f); + return vdup_lane_f32(fLow, 1); +} + +PX_FORCE_INLINE FloatV V4GetZ(const Vec4V f) +{ + const float32x2_t fhigh = vget_high_f32(f); + return vdup_lane_f32(fhigh, 0); +} + +PX_FORCE_INLINE Vec4V V4SetW(const Vec4V v, const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BTTTF(), v, vcombine_f32(f, f)); +} + +PX_FORCE_INLINE Vec4V V4SetX(const Vec4V v, const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BFTTT(), v, vcombine_f32(f, f)); +} + +PX_FORCE_INLINE Vec4V V4SetY(const Vec4V v, const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BTFTT(), v, vcombine_f32(f, f)); +} + +PX_FORCE_INLINE Vec4V V4SetZ(const Vec4V v, const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BTTFT(), v, vcombine_f32(f, f)); +} + +PX_FORCE_INLINE Vec4V V4ClearW(const Vec4V v) +{ + return V4Sel(BTTTF(), v, V4Zero()); +} + +PX_FORCE_INLINE Vec4V V4PermYXWZ(const Vec4V a) +{ + const float32x2_t xy = vget_low_f32(a); + const float32x2_t zw = vget_high_f32(a); + const float32x2_t yx = vext_f32(xy, xy, 1); + const float32x2_t wz = vext_f32(zw, zw, 1); + return vcombine_f32(yx, wz); +} + +PX_FORCE_INLINE Vec4V V4PermXZXZ(const Vec4V a) +{ + const float32x2_t xy = vget_low_f32(a); + const float32x2_t zw = vget_high_f32(a); + const float32x2x2_t xzyw = vzip_f32(xy, zw); + return vcombine_f32(xzyw.val[0], xzyw.val[0]); +} + +PX_FORCE_INLINE Vec4V V4PermYWYW(const Vec4V a) +{ + const float32x2_t xy = vget_low_f32(a); + const float32x2_t zw = vget_high_f32(a); + const float32x2x2_t xzyw = vzip_f32(xy, zw); + return vcombine_f32(xzyw.val[1], xzyw.val[1]); +} + +PX_FORCE_INLINE Vec4V V4PermYZXW(const Vec4V a) +{ + const uint32x2_t xy = vget_low_u32(vreinterpretq_u32_f32(a)); + const uint32x2_t zw = vget_high_u32(vreinterpretq_u32_f32(a)); + const uint32x2_t yz = vext_u32(xy, zw, 1); + const uint32x2_t xw = vrev64_u32(vext_u32(zw, xy, 1)); + return vreinterpretq_f32_u32(vcombine_u32(yz, xw)); +} + +PX_FORCE_INLINE Vec4V V4PermZWXY(const Vec4V a) +{ + const float32x2_t low = vget_low_f32(a); + const float32x2_t high = vget_high_f32(a); + return vcombine_f32(high, low); +} + +template +PX_FORCE_INLINE Vec4V V4Perm(const Vec4V V) +{ + static const uint32_t ControlElement[4] = + { +#if 1 + 0x03020100, // XM_SWIZZLE_X + 0x07060504, // XM_SWIZZLE_Y + 0x0B0A0908, // XM_SWIZZLE_Z + 0x0F0E0D0C, // XM_SWIZZLE_W +#else + 0x00010203, // XM_SWIZZLE_X + 0x04050607, // XM_SWIZZLE_Y + 0x08090A0B, // XM_SWIZZLE_Z + 0x0C0D0E0F, // XM_SWIZZLE_W +#endif + }; + + uint8x8x2_t tbl; + tbl.val[0] = vreinterpret_u8_f32(vget_low_f32(V)); + tbl.val[1] = vreinterpret_u8_f32(vget_high_f32(V)); + + uint8x8_t idx = + vcreate_u8(static_cast(ControlElement[E0]) | (static_cast(ControlElement[E1]) << 32)); + const uint8x8_t rL = vtbl2_u8(tbl, idx); + idx = vcreate_u8(static_cast(ControlElement[E2]) | (static_cast(ControlElement[E3]) << 32)); + const uint8x8_t rH = vtbl2_u8(tbl, idx); + return vreinterpretq_f32_u8(vcombine_u8(rL, rH)); +} + +// PT: this seems measurably slower than the hardcoded version +/*PX_FORCE_INLINE Vec4V V4PermYZXW(const Vec4V a) +{ + return V4Perm<1, 2, 0, 3>(a); +}*/ + +PX_FORCE_INLINE Vec4V V4Zero() +{ + return vreinterpretq_f32_u32(vmovq_n_u32(0)); + // return vmovq_n_f32(0.0f); +} + +PX_FORCE_INLINE Vec4V V4One() +{ + return vmovq_n_f32(1.0f); +} + +PX_FORCE_INLINE Vec4V V4Eps() +{ + // return vmovq_n_f32(PX_EPS_REAL); + return V4Load(PX_EPS_REAL); +} + +PX_FORCE_INLINE Vec4V V4Neg(const Vec4V f) +{ + return vnegq_f32(f); +} + +PX_FORCE_INLINE Vec4V V4Add(const Vec4V a, const Vec4V b) +{ + return vaddq_f32(a, b); +} + +PX_FORCE_INLINE Vec4V V4Sub(const Vec4V a, const Vec4V b) +{ + return vsubq_f32(a, b); +} + +PX_FORCE_INLINE Vec4V V4Scale(const Vec4V a, const FloatV b) +{ + return vmulq_lane_f32(a, b, 0); +} + +PX_FORCE_INLINE Vec4V V4Mul(const Vec4V a, const Vec4V b) +{ + return vmulq_f32(a, b); +} + +PX_FORCE_INLINE Vec4V V4ScaleInv(const Vec4V a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(b); + const float32x2_t invB = VRECIP(b); + return vmulq_lane_f32(a, invB, 0); +} + +PX_FORCE_INLINE Vec4V V4Div(const Vec4V a, const Vec4V b) +{ + const float32x4_t invB = VRECIPQ(b); + return vmulq_f32(a, invB); +} + +PX_FORCE_INLINE Vec4V V4ScaleInvFast(const Vec4V a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(b); + const float32x2_t invB = VRECIPE(b); + return vmulq_lane_f32(a, invB, 0); +} + +PX_FORCE_INLINE Vec4V V4DivFast(const Vec4V a, const Vec4V b) +{ + const float32x4_t invB = VRECIPEQ(b); + return vmulq_f32(a, invB); +} + +PX_FORCE_INLINE Vec4V V4Recip(const Vec4V a) +{ + return VRECIPQ(a); +} + +PX_FORCE_INLINE Vec4V V4RecipFast(const Vec4V a) +{ + return VRECIPEQ(a); +} + +PX_FORCE_INLINE Vec4V V4Rsqrt(const Vec4V a) +{ + return VRECIPSQRTQ(a); +} + +PX_FORCE_INLINE Vec4V V4RsqrtFast(const Vec4V a) +{ + return VRECIPSQRTEQ(a); +} + +PX_FORCE_INLINE Vec4V V4Sqrt(const Vec4V a) +{ + return V4Sel(V4IsEq(a, V4Zero()), a, V4Mul(a, VRECIPSQRTQ(a))); +} + +PX_FORCE_INLINE Vec4V V4ScaleAdd(const Vec4V a, const FloatV b, const Vec4V c) +{ + ASSERT_ISVALIDFLOATV(b); + return vmlaq_lane_f32(c, a, b, 0); +} + +PX_FORCE_INLINE Vec4V V4NegScaleSub(const Vec4V a, const FloatV b, const Vec4V c) +{ + ASSERT_ISVALIDFLOATV(b); + return vmlsq_lane_f32(c, a, b, 0); +} + +PX_FORCE_INLINE Vec4V V4MulAdd(const Vec4V a, const Vec4V b, const Vec4V c) +{ + return vmlaq_f32(c, a, b); +} + +PX_FORCE_INLINE Vec4V V4NegMulSub(const Vec4V a, const Vec4V b, const Vec4V c) +{ + return vmlsq_f32(c, a, b); +} + +PX_FORCE_INLINE Vec4V V4Abs(const Vec4V a) +{ + return vabsq_f32(a); +} + +PX_FORCE_INLINE FloatV V4SumElements(const Vec4V a) +{ + const Vec4V xy = V4UnpackXY(a, a); // x,x,y,y + const Vec4V zw = V4UnpackZW(a, a); // z,z,w,w + const Vec4V xz_yw = V4Add(xy, zw); // x+z,x+z,y+w,y+w + const FloatV xz = V4GetX(xz_yw); // x+z + const FloatV yw = V4GetZ(xz_yw); // y+w + return FAdd(xz, yw); // sum +} + +PX_FORCE_INLINE FloatV V4Dot(const Vec4V a, const Vec4V b) +{ + const float32x4_t tmp = vmulq_f32(a, b); + const float32x2_t low = vget_low_f32(tmp); + const float32x2_t high = vget_high_f32(tmp); + + const float32x2_t sumTmp = vpadd_f32(low, high); // = {z+w, x+y} + const float32x2_t sumWZYX = vpadd_f32(sumTmp, sumTmp); // = {x+y+z+w, x+y+z+w} + return sumWZYX; +} + +PX_FORCE_INLINE FloatV V4Dot3(const Vec4V aa, const Vec4V bb) +{ + // PT: the V3Dot code relies on the fact that W=0 so we can't reuse it as-is, we need to clear W first. + // TODO: find a better implementation that does not need to clear W. + const Vec4V a = V4ClearW(aa); + const Vec4V b = V4ClearW(bb); + + const float32x4_t tmp = vmulq_f32(a, b); + const float32x2_t low = vget_low_f32(tmp); + const float32x2_t high = vget_high_f32(tmp); + + const float32x2_t sumTmp = vpadd_f32(low, high); // = {0+z, x+y} + const float32x2_t sum0ZYX = vpadd_f32(sumTmp, sumTmp); // = {x+y+z, x+y+z} + return sum0ZYX; +} + +PX_FORCE_INLINE Vec4V V4Cross(const Vec4V a, const Vec4V b) +{ + const uint32x2_t TF = { 0xffffFFFF, 0x0 }; + const float32x2_t ay_ax = vget_low_f32(a); // d2 + const float32x2_t aw_az = vget_high_f32(a); // d3 + const float32x2_t by_bx = vget_low_f32(b); // d4 + const float32x2_t bw_bz = vget_high_f32(b); // d5 + // Hi, Lo + const float32x2_t bz_by = vext_f32(by_bx, bw_bz, 1); // bz, by + const float32x2_t az_ay = vext_f32(ay_ax, aw_az, 1); // az, ay + + const float32x2_t azbx = vmul_f32(aw_az, by_bx); // 0, az*bx + const float32x2_t aybz_axby = vmul_f32(ay_ax, bz_by); // ay*bz, ax*by + + const float32x2_t azbxSUBaxbz = vmls_f32(azbx, bw_bz, ay_ax); // 0, az*bx-ax*bz + const float32x2_t aybzSUBazby_axbySUBaybx = vmls_f32(aybz_axby, by_bx, az_ay); // ay*bz-az*by, ax*by-ay*bx + + const float32x2_t retLow = vext_f32(aybzSUBazby_axbySUBaybx, azbxSUBaxbz, 1); // az*bx-ax*bz, ay*bz-az*by + const uint32x2_t retHigh = vand_u32(TF, vreinterpret_u32_f32(aybzSUBazby_axbySUBaybx)); // 0, ax*by-ay*bx + + return vcombine_f32(retLow, vreinterpret_f32_u32(retHigh)); +} + +PX_FORCE_INLINE FloatV V4Length(const Vec4V a) +{ + const float32x4_t tmp = vmulq_f32(a, a); + const float32x2_t low = vget_low_f32(tmp); + const float32x2_t high = vget_high_f32(tmp); + + const float32x2_t sumTmp = vpadd_f32(low, high); // = {0+z, x+y} + const float32x2_t sumWZYX = vpadd_f32(sumTmp, sumTmp); // = {x+y+z, x+y+z} + return FSqrt(sumWZYX); +} + +PX_FORCE_INLINE FloatV V4LengthSq(const Vec4V a) +{ + return V4Dot(a, a); +} + +PX_FORCE_INLINE Vec4V V4Normalize(const Vec4V a) +{ + //PX_ASSERT(!FAllEq(V4LengthSq(a), FZero())); + return V4ScaleInv(a, V4Length(a)); +} + +PX_FORCE_INLINE Vec4V V4NormalizeFast(const Vec4V a) +{ + //PX_ASSERT(!FAllEq(V4LengthSq(a), FZero())); + return V4Scale(a, FRsqrtFast(V4Dot(a, a))); +} + +PX_FORCE_INLINE Vec4V V4NormalizeSafe(const Vec4V a, const Vec4V unsafeReturnValue) +{ + const FloatV zero = FZero(); + const FloatV length = V4Length(a); + const uint32x4_t isGreaterThanZero = FIsGrtr(length, zero); + return V4Sel(isGreaterThanZero, V4ScaleInv(a, length), unsafeReturnValue); +} + +PX_FORCE_INLINE BoolV V4IsEqU32(const VecU32V a, const VecU32V b) +{ + return vceqq_u32(a, b); +} + +PX_FORCE_INLINE Vec4V V4Sel(const BoolV c, const Vec4V a, const Vec4V b) +{ + return vbslq_f32(c, a, b); +} + +PX_FORCE_INLINE BoolV V4IsGrtr(const Vec4V a, const Vec4V b) +{ + return vcgtq_f32(a, b); +} + +PX_FORCE_INLINE BoolV V4IsGrtrOrEq(const Vec4V a, const Vec4V b) +{ + return vcgeq_f32(a, b); +} + +PX_FORCE_INLINE BoolV V4IsEq(const Vec4V a, const Vec4V b) +{ + return vceqq_f32(a, b); +} + +PX_FORCE_INLINE Vec4V V4Max(const Vec4V a, const Vec4V b) +{ + return vmaxq_f32(a, b); +} + +PX_FORCE_INLINE Vec4V V4Min(const Vec4V a, const Vec4V b) +{ + return vminq_f32(a, b); +} + +PX_FORCE_INLINE FloatV V4ExtractMax(const Vec4V a) +{ + const float32x2_t low = vget_low_f32(a); + const float32x2_t high = vget_high_f32(a); + + const float32x2_t max0 = vpmax_f32(high, low); + const float32x2_t max1 = vpmax_f32(max0, max0); + + return max1; +} + +PX_FORCE_INLINE FloatV V4ExtractMin(const Vec4V a) +{ + const float32x2_t low = vget_low_f32(a); + const float32x2_t high = vget_high_f32(a); + + const float32x2_t min0 = vpmin_f32(high, low); + const float32x2_t min1 = vpmin_f32(min0, min0); + + return min1; +} + +PX_FORCE_INLINE Vec4V V4Clamp(const Vec4V a, const Vec4V minV, const Vec4V maxV) +{ + return V4Max(V4Min(a, maxV), minV); +} + +PX_FORCE_INLINE PxU32 V4AllGrtr(const Vec4V a, const Vec4V b) +{ + return internalUnitNeonSimd::BAllTrue4_R(V4IsGrtr(a, b)); +} + +PX_FORCE_INLINE PxU32 V4AllGrtrOrEq(const Vec4V a, const Vec4V b) +{ + return internalUnitNeonSimd::BAllTrue4_R(V4IsGrtrOrEq(a, b)); +} + +PX_FORCE_INLINE PxU32 V4AllGrtrOrEq3(const Vec4V a, const Vec4V b) +{ + return internalUnitNeonSimd::BAllTrue3_R(V4IsGrtrOrEq(a, b)); +} + +PX_FORCE_INLINE PxU32 V4AllEq(const Vec4V a, const Vec4V b) +{ + return internalUnitNeonSimd::BAllTrue4_R(V4IsEq(a, b)); +} + +PX_FORCE_INLINE PxU32 V4AnyGrtr3(const Vec4V a, const Vec4V b) +{ + return internalUnitNeonSimd::BAnyTrue3_R(V4IsGrtr(a, b)); +} + +PX_FORCE_INLINE Vec4V V4Round(const Vec4V a) +{ + // truncate(a + (0.5f - sign(a))) + const Vec4V half = V4Load(0.5f); + const float32x4_t sign = vcvtq_f32_u32((vshrq_n_u32(vreinterpretq_u32_f32(a), 31))); + const Vec4V aPlusHalf = V4Add(a, half); + const Vec4V aRound = V4Sub(aPlusHalf, sign); + return vcvtq_f32_s32(vcvtq_s32_f32(aRound)); +} + +PX_FORCE_INLINE Vec4V V4Sin(const Vec4V a) +{ + const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f); + const Vec4V twoPi = V4LoadA(g_PXTwoPi.f); + const Vec4V tmp = V4Mul(a, recipTwoPi); + const Vec4V b = V4Round(tmp); + const Vec4V V1 = V4NegMulSub(twoPi, b, a); + + // sin(V) ~= V - V^3 / 3! + V^5 / 5! - V^7 / 7! + V^9 / 9! - V^11 / 11! + V^13 / 13! - + // V^15 / 15! + V^17 / 17! - V^19 / 19! + V^21 / 21! - V^23 / 23! (for -PI <= V < PI) + const Vec4V V2 = V4Mul(V1, V1); + const Vec4V V3 = V4Mul(V2, V1); + const Vec4V V5 = V4Mul(V3, V2); + const Vec4V V7 = V4Mul(V5, V2); + const Vec4V V9 = V4Mul(V7, V2); + const Vec4V V11 = V4Mul(V9, V2); + const Vec4V V13 = V4Mul(V11, V2); + const Vec4V V15 = V4Mul(V13, V2); + const Vec4V V17 = V4Mul(V15, V2); + const Vec4V V19 = V4Mul(V17, V2); + const Vec4V V21 = V4Mul(V19, V2); + const Vec4V V23 = V4Mul(V21, V2); + + const Vec4V sinCoefficients0 = V4LoadA(g_PXSinCoefficients0.f); + const Vec4V sinCoefficients1 = V4LoadA(g_PXSinCoefficients1.f); + const Vec4V sinCoefficients2 = V4LoadA(g_PXSinCoefficients2.f); + + const FloatV S1 = V4GetY(sinCoefficients0); + const FloatV S2 = V4GetZ(sinCoefficients0); + const FloatV S3 = V4GetW(sinCoefficients0); + const FloatV S4 = V4GetX(sinCoefficients1); + const FloatV S5 = V4GetY(sinCoefficients1); + const FloatV S6 = V4GetZ(sinCoefficients1); + const FloatV S7 = V4GetW(sinCoefficients1); + const FloatV S8 = V4GetX(sinCoefficients2); + const FloatV S9 = V4GetY(sinCoefficients2); + const FloatV S10 = V4GetZ(sinCoefficients2); + const FloatV S11 = V4GetW(sinCoefficients2); + + Vec4V Result; + Result = V4ScaleAdd(V3, S1, V1); + Result = V4ScaleAdd(V5, S2, Result); + Result = V4ScaleAdd(V7, S3, Result); + Result = V4ScaleAdd(V9, S4, Result); + Result = V4ScaleAdd(V11, S5, Result); + Result = V4ScaleAdd(V13, S6, Result); + Result = V4ScaleAdd(V15, S7, Result); + Result = V4ScaleAdd(V17, S8, Result); + Result = V4ScaleAdd(V19, S9, Result); + Result = V4ScaleAdd(V21, S10, Result); + Result = V4ScaleAdd(V23, S11, Result); + + return Result; +} + +PX_FORCE_INLINE Vec4V V4Cos(const Vec4V a) +{ + const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f); + const Vec4V twoPi = V4LoadA(g_PXTwoPi.f); + const Vec4V tmp = V4Mul(a, recipTwoPi); + const Vec4V b = V4Round(tmp); + const Vec4V V1 = V4NegMulSub(twoPi, b, a); + + // cos(V) ~= 1 - V^2 / 2! + V^4 / 4! - V^6 / 6! + V^8 / 8! - V^10 / 10! + V^12 / 12! - + // V^14 / 14! + V^16 / 16! - V^18 / 18! + V^20 / 20! - V^22 / 22! (for -PI <= V < PI) + const Vec4V V2 = V4Mul(V1, V1); + const Vec4V V4 = V4Mul(V2, V2); + const Vec4V V6 = V4Mul(V4, V2); + const Vec4V V8 = V4Mul(V4, V4); + const Vec4V V10 = V4Mul(V6, V4); + const Vec4V V12 = V4Mul(V6, V6); + const Vec4V V14 = V4Mul(V8, V6); + const Vec4V V16 = V4Mul(V8, V8); + const Vec4V V18 = V4Mul(V10, V8); + const Vec4V V20 = V4Mul(V10, V10); + const Vec4V V22 = V4Mul(V12, V10); + + const Vec4V cosCoefficients0 = V4LoadA(g_PXCosCoefficients0.f); + const Vec4V cosCoefficients1 = V4LoadA(g_PXCosCoefficients1.f); + const Vec4V cosCoefficients2 = V4LoadA(g_PXCosCoefficients2.f); + + const FloatV C1 = V4GetY(cosCoefficients0); + const FloatV C2 = V4GetZ(cosCoefficients0); + const FloatV C3 = V4GetW(cosCoefficients0); + const FloatV C4 = V4GetX(cosCoefficients1); + const FloatV C5 = V4GetY(cosCoefficients1); + const FloatV C6 = V4GetZ(cosCoefficients1); + const FloatV C7 = V4GetW(cosCoefficients1); + const FloatV C8 = V4GetX(cosCoefficients2); + const FloatV C9 = V4GetY(cosCoefficients2); + const FloatV C10 = V4GetZ(cosCoefficients2); + const FloatV C11 = V4GetW(cosCoefficients2); + + Vec4V Result; + Result = V4ScaleAdd(V2, C1, V4One()); + Result = V4ScaleAdd(V4, C2, Result); + Result = V4ScaleAdd(V6, C3, Result); + Result = V4ScaleAdd(V8, C4, Result); + Result = V4ScaleAdd(V10, C5, Result); + Result = V4ScaleAdd(V12, C6, Result); + Result = V4ScaleAdd(V14, C7, Result); + Result = V4ScaleAdd(V16, C8, Result); + Result = V4ScaleAdd(V18, C9, Result); + Result = V4ScaleAdd(V20, C10, Result); + Result = V4ScaleAdd(V22, C11, Result); + + return Result; +} + +PX_FORCE_INLINE void V4Transpose(Vec4V& col0, Vec4V& col1, Vec4V& col2, Vec4V& col3) +{ + const float32x4x2_t v0v1 = vzipq_f32(col0, col2); + const float32x4x2_t v2v3 = vzipq_f32(col1, col3); + const float32x4x2_t zip0 = vzipq_f32(v0v1.val[0], v2v3.val[0]); + const float32x4x2_t zip1 = vzipq_f32(v0v1.val[1], v2v3.val[1]); + col0 = zip0.val[0]; + col1 = zip0.val[1]; + col2 = zip1.val[0]; + col3 = zip1.val[1]; +} + +////////////////////////////////// +// VEC4V +////////////////////////////////// + +PX_FORCE_INLINE BoolV BFFFF() +{ + return vmovq_n_u32(0); +} + +PX_FORCE_INLINE BoolV BFFFT() +{ + const uint32x2_t zeros = vmov_n_u32(0); + const uint32x2_t ones = vmov_n_u32(0xffffFFFF); + const uint32x2_t zo = vext_u32(zeros, ones, 1); + return vcombine_u32(zeros, zo); +} + +PX_FORCE_INLINE BoolV BFFTF() +{ + const uint32x2_t zeros = vmov_n_u32(0); + const uint32x2_t ones = vmov_n_u32(0xffffFFFF); + const uint32x2_t oz = vext_u32(ones, zeros, 1); + return vcombine_u32(zeros, oz); +} + +PX_FORCE_INLINE BoolV BFFTT() +{ + const uint32x2_t zeros = vmov_n_u32(0); + const uint32x2_t ones = vmov_n_u32(0xffffFFFF); + return vcombine_u32(zeros, ones); +} + +PX_FORCE_INLINE BoolV BFTFF() +{ + const uint32x2_t zeros = vmov_n_u32(0); + const uint32x2_t ones = vmov_n_u32(0xffffFFFF); + const uint32x2_t zo = vext_u32(zeros, ones, 1); + return vcombine_u32(zo, zeros); +} + +PX_FORCE_INLINE BoolV BFTFT() +{ + const uint32x2_t zeros = vmov_n_u32(0); + const uint32x2_t ones = vmov_n_u32(0xffffFFFF); + const uint32x2_t zo = vext_u32(zeros, ones, 1); + return vcombine_u32(zo, zo); +} + +PX_FORCE_INLINE BoolV BFTTF() +{ + const uint32x2_t zeros = vmov_n_u32(0); + const uint32x2_t ones = vmov_n_u32(0xffffFFFF); + const uint32x2_t zo = vext_u32(zeros, ones, 1); + const uint32x2_t oz = vext_u32(ones, zeros, 1); + return vcombine_u32(zo, oz); +} + +PX_FORCE_INLINE BoolV BFTTT() +{ + const uint32x2_t zeros = vmov_n_u32(0); + const uint32x2_t ones = vmov_n_u32(0xffffFFFF); + const uint32x2_t zo = vext_u32(zeros, ones, 1); + return vcombine_u32(zo, ones); +} + +PX_FORCE_INLINE BoolV BTFFF() +{ + const uint32x2_t zeros = vmov_n_u32(0); + const uint32x2_t ones = vmov_n_u32(0xffffFFFF); + // const uint32x2_t zo = vext_u32(zeros, ones, 1); + const uint32x2_t oz = vext_u32(ones, zeros, 1); + return vcombine_u32(oz, zeros); +} + +PX_FORCE_INLINE BoolV BTFFT() +{ + const uint32x2_t zeros = vmov_n_u32(0); + const uint32x2_t ones = vmov_n_u32(0xffffFFFF); + const uint32x2_t zo = vext_u32(zeros, ones, 1); + const uint32x2_t oz = vext_u32(ones, zeros, 1); + return vcombine_u32(oz, zo); +} + +PX_FORCE_INLINE BoolV BTFTF() +{ + const uint32x2_t zeros = vmov_n_u32(0); + const uint32x2_t ones = vmov_n_u32(0xffffFFFF); + const uint32x2_t oz = vext_u32(ones, zeros, 1); + return vcombine_u32(oz, oz); +} + +PX_FORCE_INLINE BoolV BTFTT() +{ + const uint32x2_t zeros = vmov_n_u32(0); + const uint32x2_t ones = vmov_n_u32(0xffffFFFF); + const uint32x2_t oz = vext_u32(ones, zeros, 1); + return vcombine_u32(oz, ones); +} + +PX_FORCE_INLINE BoolV BTTFF() +{ + const uint32x2_t zeros = vmov_n_u32(0); + const uint32x2_t ones = vmov_n_u32(0xffffFFFF); + return vcombine_u32(ones, zeros); +} + +PX_FORCE_INLINE BoolV BTTFT() +{ + const uint32x2_t zeros = vmov_n_u32(0); + const uint32x2_t ones = vmov_n_u32(0xffffFFFF); + const uint32x2_t zo = vext_u32(zeros, ones, 1); + return vcombine_u32(ones, zo); +} + +PX_FORCE_INLINE BoolV BTTTF() +{ + const uint32x2_t zeros = vmov_n_u32(0); + const uint32x2_t ones = vmov_n_u32(0xffffFFFF); + const uint32x2_t oz = vext_u32(ones, zeros, 1); + return vcombine_u32(ones, oz); +} + +PX_FORCE_INLINE BoolV BTTTT() +{ + return vmovq_n_u32(0xffffFFFF); +} + +PX_FORCE_INLINE BoolV BXMask() +{ + return BTFFF(); +} + +PX_FORCE_INLINE BoolV BYMask() +{ + return BFTFF(); +} + +PX_FORCE_INLINE BoolV BZMask() +{ + return BFFTF(); +} + +PX_FORCE_INLINE BoolV BWMask() +{ + return BFFFT(); +} + +PX_FORCE_INLINE BoolV BGetX(const BoolV f) +{ + const uint32x2_t fLow = vget_low_u32(f); + return vdupq_lane_u32(fLow, 0); +} + +PX_FORCE_INLINE BoolV BGetY(const BoolV f) +{ + const uint32x2_t fLow = vget_low_u32(f); + return vdupq_lane_u32(fLow, 1); +} + +PX_FORCE_INLINE BoolV BGetZ(const BoolV f) +{ + const uint32x2_t fHigh = vget_high_u32(f); + return vdupq_lane_u32(fHigh, 0); +} + +PX_FORCE_INLINE BoolV BGetW(const BoolV f) +{ + const uint32x2_t fHigh = vget_high_u32(f); + return vdupq_lane_u32(fHigh, 1); +} + +PX_FORCE_INLINE BoolV BSetX(const BoolV v, const BoolV f) +{ + return vbslq_u32(BFTTT(), v, f); +} + +PX_FORCE_INLINE BoolV BSetY(const BoolV v, const BoolV f) +{ + return vbslq_u32(BTFTT(), v, f); +} + +PX_FORCE_INLINE BoolV BSetZ(const BoolV v, const BoolV f) +{ + return vbslq_u32(BTTFT(), v, f); +} + +PX_FORCE_INLINE BoolV BSetW(const BoolV v, const BoolV f) +{ + return vbslq_u32(BTTTF(), v, f); +} + +PX_FORCE_INLINE BoolV BAnd(const BoolV a, const BoolV b) +{ + return vandq_u32(a, b); +} + +PX_FORCE_INLINE BoolV BNot(const BoolV a) +{ + return vmvnq_u32(a); +} + +PX_FORCE_INLINE BoolV BAndNot(const BoolV a, const BoolV b) +{ + // return vbicq_u32(a, b); + return vandq_u32(a, vmvnq_u32(b)); +} + +PX_FORCE_INLINE BoolV BOr(const BoolV a, const BoolV b) +{ + return vorrq_u32(a, b); +} + +PX_FORCE_INLINE BoolV BAllTrue4(const BoolV a) +{ + const uint32x2_t allTrue = vmov_n_u32(0xffffFFFF); + const uint16x4_t dHigh = vget_high_u16(vreinterpretq_u16_u32(a)); + const uint16x4_t dLow = vmovn_u32(a); + uint16x8_t combined = vcombine_u16(dLow, dHigh); + const uint32x2_t finalReduce = vreinterpret_u32_u8(vmovn_u16(combined)); + const uint32x2_t result = vceq_u32(finalReduce, allTrue); + return vdupq_lane_u32(result, 0); +} + +PX_FORCE_INLINE BoolV BAnyTrue4(const BoolV a) +{ + const uint32x2_t allTrue = vmov_n_u32(0xffffFFFF); + const uint16x4_t dHigh = vget_high_u16(vreinterpretq_u16_u32(a)); + const uint16x4_t dLow = vmovn_u32(a); + uint16x8_t combined = vcombine_u16(dLow, dHigh); + const uint32x2_t finalReduce = vreinterpret_u32_u8(vmovn_u16(combined)); + const uint32x2_t result = vtst_u32(finalReduce, allTrue); + return vdupq_lane_u32(result, 0); +} + +PX_FORCE_INLINE BoolV BAllTrue3(const BoolV a) +{ + const uint32x2_t allTrue3 = vmov_n_u32(0x00ffFFFF); + const uint16x4_t dHigh = vget_high_u16(vreinterpretq_u16_u32(a)); + const uint16x4_t dLow = vmovn_u32(a); + uint16x8_t combined = vcombine_u16(dLow, dHigh); + const uint32x2_t finalReduce = vreinterpret_u32_u8(vmovn_u16(combined)); + const uint32x2_t result = vceq_u32(vand_u32(finalReduce, allTrue3), allTrue3); + return vdupq_lane_u32(result, 0); +} + +PX_FORCE_INLINE BoolV BAnyTrue3(const BoolV a) +{ + const uint32x2_t allTrue3 = vmov_n_u32(0x00ffFFFF); + const uint16x4_t dHigh = vget_high_u16(vreinterpretq_u16_u32(a)); + const uint16x4_t dLow = vmovn_u32(a); + uint16x8_t combined = vcombine_u16(dLow, dHigh); + const uint32x2_t finalReduce = vreinterpret_u32_u8(vmovn_u16(combined)); + const uint32x2_t result = vtst_u32(vand_u32(finalReduce, allTrue3), allTrue3); + return vdupq_lane_u32(result, 0); +} + +PX_FORCE_INLINE PxU32 BAllEq(const BoolV a, const BoolV b) +{ + const BoolV bTest = vceqq_u32(a, b); + return internalUnitNeonSimd::BAllTrue4_R(bTest); +} + +PX_FORCE_INLINE PxU32 BAllEqTTTT(const BoolV a) +{ + return BAllEq(a, BTTTT()); +} + +PX_FORCE_INLINE PxU32 BAllEqFFFF(const BoolV a) +{ + return BAllEq(a, BFFFF()); +} + +PX_FORCE_INLINE PxU32 BGetBitMask(const BoolV a) +{ + static PX_ALIGN(16, const PxU32) bitMaskData[4] = { 1, 2, 4, 8 }; + const uint32x4_t bitMask = *(reinterpret_cast(bitMaskData)); + const uint32x4_t t0 = vandq_u32(a, bitMask); + const uint32x2_t t1 = vpadd_u32(vget_low_u32(t0), vget_high_u32(t0)); // Pairwise add (0 + 1), (2 + 3) + return PxU32(vget_lane_u32(vpadd_u32(t1, t1), 0)); +} + +////////////////////////////////// +// MAT33V +////////////////////////////////// + +PX_FORCE_INLINE Vec3V M33MulV3(const Mat33V& a, const Vec3V b) +{ + const FloatV x = V3GetX(b); + const FloatV y = V3GetY(b); + const FloatV z = V3GetZ(b); + const Vec3V v0 = V3Scale(a.col0, x); + const Vec3V v1 = V3Scale(a.col1, y); + const Vec3V v2 = V3Scale(a.col2, z); + const Vec3V v0PlusV1 = V3Add(v0, v1); + return V3Add(v0PlusV1, v2); +} + +PX_FORCE_INLINE Vec3V M33TrnspsMulV3(const Mat33V& a, const Vec3V b) +{ + const FloatV x = V3Dot(a.col0, b); + const FloatV y = V3Dot(a.col1, b); + const FloatV z = V3Dot(a.col2, b); + return V3Merge(x, y, z); +} + +PX_FORCE_INLINE Vec3V M33MulV3AddV3(const Mat33V& A, const Vec3V b, const Vec3V c) +{ + const FloatV x = V3GetX(b); + const FloatV y = V3GetY(b); + const FloatV z = V3GetZ(b); + Vec3V result = V3ScaleAdd(A.col0, x, c); + result = V3ScaleAdd(A.col1, y, result); + return V3ScaleAdd(A.col2, z, result); +} + +PX_FORCE_INLINE Mat33V M33MulM33(const Mat33V& a, const Mat33V& b) +{ + return Mat33V(M33MulV3(a, b.col0), M33MulV3(a, b.col1), M33MulV3(a, b.col2)); +} + +PX_FORCE_INLINE Mat33V M33Add(const Mat33V& a, const Mat33V& b) +{ + return Mat33V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2)); +} + +PX_FORCE_INLINE Mat33V M33Scale(const Mat33V& a, const FloatV& b) +{ + return Mat33V(V3Scale(a.col0, b), V3Scale(a.col1, b), V3Scale(a.col2, b)); +} + +PX_FORCE_INLINE Mat33V M33Inverse(const Mat33V& a) +{ + const float32x2_t zeros = vreinterpret_f32_u32(vmov_n_u32(0)); + const BoolV btttf = BTTTF(); + + const Vec3V cross01 = V3Cross(a.col0, a.col1); + const Vec3V cross12 = V3Cross(a.col1, a.col2); + const Vec3V cross20 = V3Cross(a.col2, a.col0); + const FloatV dot = V3Dot(cross01, a.col2); + const FloatV invDet = FRecipFast(dot); + + const float32x4x2_t merge = vzipq_f32(cross12, cross01); + const float32x4_t mergeh = merge.val[0]; + const float32x4_t mergel = merge.val[1]; + + // const Vec3V colInv0 = XMVectorPermute(mergeh,cross20,PxPermuteControl(0,4,1,7)); + const float32x4_t colInv0_xxyy = vzipq_f32(mergeh, cross20).val[0]; + const float32x4_t colInv0 = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(colInv0_xxyy), btttf)); + + // const Vec3V colInv1 = XMVectorPermute(mergeh,cross20,PxPermuteControl(2,5,3,7)); + const float32x2_t zw0 = vget_high_f32(mergeh); + const float32x2_t xy1 = vget_low_f32(cross20); + const float32x2_t yzero1 = vext_f32(xy1, zeros, 1); + const float32x2x2_t merge1 = vzip_f32(zw0, yzero1); + const float32x4_t colInv1 = vcombine_f32(merge1.val[0], merge1.val[1]); + + // const Vec3V colInv2 = XMVectorPermute(mergel,cross20,PxPermuteControl(0,6,1,7)); + const float32x2_t x0y0 = vget_low_f32(mergel); + const float32x2_t z1w1 = vget_high_f32(cross20); + const float32x2x2_t merge2 = vzip_f32(x0y0, z1w1); + const float32x4_t colInv2 = vcombine_f32(merge2.val[0], merge2.val[1]); + + return Mat33V(vmulq_lane_f32(colInv0, invDet, 0), vmulq_lane_f32(colInv1, invDet, 0), + vmulq_lane_f32(colInv2, invDet, 0)); +} + +PX_FORCE_INLINE Mat33V M33Trnsps(const Mat33V& a) +{ + return Mat33V(V3Merge(V3GetX(a.col0), V3GetX(a.col1), V3GetX(a.col2)), + V3Merge(V3GetY(a.col0), V3GetY(a.col1), V3GetY(a.col2)), + V3Merge(V3GetZ(a.col0), V3GetZ(a.col1), V3GetZ(a.col2))); +} + +PX_FORCE_INLINE Mat33V M33Identity() +{ + return Mat33V(V3UnitX(), V3UnitY(), V3UnitZ()); +} + +PX_FORCE_INLINE Mat33V M33Sub(const Mat33V& a, const Mat33V& b) +{ + return Mat33V(V3Sub(a.col0, b.col0), V3Sub(a.col1, b.col1), V3Sub(a.col2, b.col2)); +} + +PX_FORCE_INLINE Mat33V M33Neg(const Mat33V& a) +{ + return Mat33V(V3Neg(a.col0), V3Neg(a.col1), V3Neg(a.col2)); +} + +PX_FORCE_INLINE Mat33V M33Abs(const Mat33V& a) +{ + return Mat33V(V3Abs(a.col0), V3Abs(a.col1), V3Abs(a.col2)); +} + +PX_FORCE_INLINE Mat33V PromoteVec3V(const Vec3V v) +{ + const BoolV bTFFF = BTFFF(); + const BoolV bFTFF = BFTFF(); + const BoolV bFFTF = BTFTF(); + + const Vec3V zero = V3Zero(); + + return Mat33V(V3Sel(bTFFF, v, zero), V3Sel(bFTFF, v, zero), V3Sel(bFFTF, v, zero)); +} + +PX_FORCE_INLINE Mat33V M33Diagonal(const Vec3VArg d) +{ + const Vec3V x = V3Mul(V3UnitX(), d); + const Vec3V y = V3Mul(V3UnitY(), d); + const Vec3V z = V3Mul(V3UnitZ(), d); + return Mat33V(x, y, z); +} + +////////////////////////////////// +// MAT34V +////////////////////////////////// + +PX_FORCE_INLINE Vec3V M34MulV3(const Mat34V& a, const Vec3V b) +{ + const FloatV x = V3GetX(b); + const FloatV y = V3GetY(b); + const FloatV z = V3GetZ(b); + const Vec3V v0 = V3Scale(a.col0, x); + const Vec3V v1 = V3Scale(a.col1, y); + const Vec3V v2 = V3Scale(a.col2, z); + const Vec3V v0PlusV1 = V3Add(v0, v1); + const Vec3V v0PlusV1Plusv2 = V3Add(v0PlusV1, v2); + return V3Add(v0PlusV1Plusv2, a.col3); +} + +PX_FORCE_INLINE Vec3V M34Mul33V3(const Mat34V& a, const Vec3V b) +{ + const FloatV x = V3GetX(b); + const FloatV y = V3GetY(b); + const FloatV z = V3GetZ(b); + const Vec3V v0 = V3Scale(a.col0, x); + const Vec3V v1 = V3Scale(a.col1, y); + const Vec3V v2 = V3Scale(a.col2, z); + const Vec3V v0PlusV1 = V3Add(v0, v1); + return V3Add(v0PlusV1, v2); +} + +PX_FORCE_INLINE Vec3V M34TrnspsMul33V3(const Mat34V& a, const Vec3V b) +{ + const FloatV x = V3Dot(a.col0, b); + const FloatV y = V3Dot(a.col1, b); + const FloatV z = V3Dot(a.col2, b); + return V3Merge(x, y, z); +} + +PX_FORCE_INLINE Mat34V M34MulM34(const Mat34V& a, const Mat34V& b) +{ + return Mat34V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2), M34MulV3(a, b.col3)); +} + +PX_FORCE_INLINE Mat33V M34MulM33(const Mat34V& a, const Mat33V& b) +{ + return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2)); +} + +PX_FORCE_INLINE Mat33V M34Mul33MM34(const Mat34V& a, const Mat34V& b) +{ + return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2)); +} + +PX_FORCE_INLINE Mat34V M34Add(const Mat34V& a, const Mat34V& b) +{ + return Mat34V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2), V3Add(a.col3, b.col3)); +} + +PX_FORCE_INLINE Mat33V M34Trnsps33(const Mat34V& a) +{ + return Mat33V(V3Merge(V3GetX(a.col0), V3GetX(a.col1), V3GetX(a.col2)), + V3Merge(V3GetY(a.col0), V3GetY(a.col1), V3GetY(a.col2)), + V3Merge(V3GetZ(a.col0), V3GetZ(a.col1), V3GetZ(a.col2))); +} + +////////////////////////////////// +// MAT44V +////////////////////////////////// + +PX_FORCE_INLINE Vec4V M44MulV4(const Mat44V& a, const Vec4V b) +{ + const FloatV x = V4GetX(b); + const FloatV y = V4GetY(b); + const FloatV z = V4GetZ(b); + const FloatV w = V4GetW(b); + + const Vec4V v0 = V4Scale(a.col0, x); + const Vec4V v1 = V4Scale(a.col1, y); + const Vec4V v2 = V4Scale(a.col2, z); + const Vec4V v3 = V4Scale(a.col3, w); + const Vec4V v0PlusV1 = V4Add(v0, v1); + const Vec4V v0PlusV1Plusv2 = V4Add(v0PlusV1, v2); + return V4Add(v0PlusV1Plusv2, v3); +} + +PX_FORCE_INLINE Vec4V M44TrnspsMulV4(const Mat44V& a, const Vec4V b) +{ + return V4Merge(V4Dot(a.col0, b), V4Dot(a.col1, b), V4Dot(a.col2, b), V4Dot(a.col3, b)); +} + +PX_FORCE_INLINE Mat44V M44MulM44(const Mat44V& a, const Mat44V& b) +{ + return Mat44V(M44MulV4(a, b.col0), M44MulV4(a, b.col1), M44MulV4(a, b.col2), M44MulV4(a, b.col3)); +} + +PX_FORCE_INLINE Mat44V M44Add(const Mat44V& a, const Mat44V& b) +{ + return Mat44V(V4Add(a.col0, b.col0), V4Add(a.col1, b.col1), V4Add(a.col2, b.col2), V4Add(a.col3, b.col3)); +} + +PX_FORCE_INLINE Mat44V M44Trnsps(const Mat44V& a) +{ + // asm volatile( + // "vzip.f32 %q0, %q2 \n\t" + // "vzip.f32 %q1, %q3 \n\t" + // "vzip.f32 %q0, %q1 \n\t" + // "vzip.f32 %q2, %q3 \n\t" + // : "+w" (a.col0), "+w" (a.col1), "+w" (a.col2), "+w" a.col3)); + + const float32x4x2_t v0v1 = vzipq_f32(a.col0, a.col2); + const float32x4x2_t v2v3 = vzipq_f32(a.col1, a.col3); + const float32x4x2_t zip0 = vzipq_f32(v0v1.val[0], v2v3.val[0]); + const float32x4x2_t zip1 = vzipq_f32(v0v1.val[1], v2v3.val[1]); + + return Mat44V(zip0.val[0], zip0.val[1], zip1.val[0], zip1.val[1]); +} + +PX_FORCE_INLINE Mat44V M44Inverse(const Mat44V& a) +{ + float32x4_t minor0, minor1, minor2, minor3; + float32x4_t row0, row1, row2, row3; + float32x4_t det, tmp1; + + tmp1 = vmovq_n_f32(0.0f); + row1 = vmovq_n_f32(0.0f); + row3 = vmovq_n_f32(0.0f); + + row0 = a.col0; + row1 = vextq_f32(a.col1, a.col1, 2); + row2 = a.col2; + row3 = vextq_f32(a.col3, a.col3, 2); + + tmp1 = vmulq_f32(row2, row3); + tmp1 = vrev64q_f32(tmp1); + minor0 = vmulq_f32(row1, tmp1); + minor1 = vmulq_f32(row0, tmp1); + tmp1 = vextq_f32(tmp1, tmp1, 2); + minor0 = vsubq_f32(vmulq_f32(row1, tmp1), minor0); + minor1 = vsubq_f32(vmulq_f32(row0, tmp1), minor1); + minor1 = vextq_f32(minor1, minor1, 2); + + tmp1 = vmulq_f32(row1, row2); + tmp1 = vrev64q_f32(tmp1); + minor0 = vaddq_f32(vmulq_f32(row3, tmp1), minor0); + minor3 = vmulq_f32(row0, tmp1); + tmp1 = vextq_f32(tmp1, tmp1, 2); + minor0 = vsubq_f32(minor0, vmulq_f32(row3, tmp1)); + minor3 = vsubq_f32(vmulq_f32(row0, tmp1), minor3); + minor3 = vextq_f32(minor3, minor3, 2); + + tmp1 = vmulq_f32(vextq_f32(row1, row1, 2), row3); + tmp1 = vrev64q_f32(tmp1); + row2 = vextq_f32(row2, row2, 2); + minor0 = vaddq_f32(vmulq_f32(row2, tmp1), minor0); + minor2 = vmulq_f32(row0, tmp1); + tmp1 = vextq_f32(tmp1, tmp1, 2); + minor0 = vsubq_f32(minor0, vmulq_f32(row2, tmp1)); + minor2 = vsubq_f32(vmulq_f32(row0, tmp1), minor2); + minor2 = vextq_f32(minor2, minor2, 2); + + tmp1 = vmulq_f32(row0, row1); + tmp1 = vrev64q_f32(tmp1); + minor2 = vaddq_f32(vmulq_f32(row3, tmp1), minor2); + minor3 = vsubq_f32(vmulq_f32(row2, tmp1), minor3); + tmp1 = vextq_f32(tmp1, tmp1, 2); + minor2 = vsubq_f32(vmulq_f32(row3, tmp1), minor2); + minor3 = vsubq_f32(minor3, vmulq_f32(row2, tmp1)); + + tmp1 = vmulq_f32(row0, row3); + tmp1 = vrev64q_f32(tmp1); + minor1 = vsubq_f32(minor1, vmulq_f32(row2, tmp1)); + minor2 = vaddq_f32(vmulq_f32(row1, tmp1), minor2); + tmp1 = vextq_f32(tmp1, tmp1, 2); + minor1 = vaddq_f32(vmulq_f32(row2, tmp1), minor1); + minor2 = vsubq_f32(minor2, vmulq_f32(row1, tmp1)); + + tmp1 = vmulq_f32(row0, row2); + tmp1 = vrev64q_f32(tmp1); + minor1 = vaddq_f32(vmulq_f32(row3, tmp1), minor1); + minor3 = vsubq_f32(minor3, vmulq_f32(row1, tmp1)); + tmp1 = vextq_f32(tmp1, tmp1, 2); + minor1 = vsubq_f32(minor1, vmulq_f32(row3, tmp1)); + minor3 = vaddq_f32(vmulq_f32(row1, tmp1), minor3); + + det = vmulq_f32(row0, minor0); + det = vaddq_f32(vextq_f32(det, det, 2), det); + det = vaddq_f32(vrev64q_f32(det), det); + det = vdupq_lane_f32(VRECIPE(vget_low_f32(det)), 0); + + minor0 = vmulq_f32(det, minor0); + minor1 = vmulq_f32(det, minor1); + minor2 = vmulq_f32(det, minor2); + minor3 = vmulq_f32(det, minor3); + Mat44V invTrans(minor0, minor1, minor2, minor3); + return M44Trnsps(invTrans); +} + +PX_FORCE_INLINE Vec4V V4LoadXYZW(const PxF32& x, const PxF32& y, const PxF32& z, const PxF32& w) +{ + const float32x4_t ret = { x, y, z, w }; + return ret; +} + +/* +PX_FORCE_INLINE VecU16V V4U32PK(VecU32V a, VecU32V b) +{ + return vcombine_u16(vqmovn_u32(a), vqmovn_u32(b)); +} +*/ + +PX_FORCE_INLINE VecU32V V4U32Sel(const BoolV c, const VecU32V a, const VecU32V b) +{ + return vbslq_u32(c, a, b); +} + +PX_FORCE_INLINE VecU32V V4U32or(VecU32V a, VecU32V b) +{ + return vorrq_u32(a, b); +} + +PX_FORCE_INLINE VecU32V V4U32xor(VecU32V a, VecU32V b) +{ + return veorq_u32(a, b); +} + +PX_FORCE_INLINE VecU32V V4U32and(VecU32V a, VecU32V b) +{ + return vandq_u32(a, b); +} + +PX_FORCE_INLINE VecU32V V4U32Andc(VecU32V a, VecU32V b) +{ + // return vbicq_u32(a, b); // creates gcc compiler bug in RTreeQueries.cpp + return vandq_u32(a, vmvnq_u32(b)); +} + +/* +PX_FORCE_INLINE VecU16V V4U16Or(VecU16V a, VecU16V b) +{ + return vorrq_u16(a, b); +} +*/ + +/* +PX_FORCE_INLINE VecU16V V4U16And(VecU16V a, VecU16V b) +{ + return vandq_u16(a, b); +} +*/ +/* +PX_FORCE_INLINE VecU16V V4U16Andc(VecU16V a, VecU16V b) +{ + return vbicq_u16(a, b); +} +*/ + +PX_FORCE_INLINE VecI32V I4LoadXYZW(const PxI32& x, const PxI32& y, const PxI32& z, const PxI32& w) +{ + const int32x4_t ret = { x, y, z, w }; + return ret; +} + +PX_FORCE_INLINE VecI32V I4Load(const PxI32 i) +{ + return vdupq_n_s32(i); +} + +PX_FORCE_INLINE VecI32V I4LoadU(const PxI32* i) +{ + return vld1q_s32(i); +} + +PX_FORCE_INLINE VecI32V I4LoadA(const PxI32* i) +{ + return vld1q_s32(i); +} + +PX_FORCE_INLINE VecI32V VecI32V_Add(const VecI32VArg a, const VecI32VArg b) +{ + return vaddq_s32(a, b); +} + +PX_FORCE_INLINE VecI32V VecI32V_Sub(const VecI32VArg a, const VecI32VArg b) +{ + return vsubq_s32(a, b); +} + +PX_FORCE_INLINE BoolV VecI32V_IsGrtr(const VecI32VArg a, const VecI32VArg b) +{ + return vcgtq_s32(a, b); +} + +PX_FORCE_INLINE BoolV VecI32V_IsEq(const VecI32VArg a, const VecI32VArg b) +{ + return vceqq_s32(a, b); +} + +PX_FORCE_INLINE VecI32V V4I32Sel(const BoolV c, const VecI32V a, const VecI32V b) +{ + return vbslq_s32(c, a, b); +} + +PX_FORCE_INLINE VecI32V VecI32V_Zero() +{ + return vdupq_n_s32(0); +} + +PX_FORCE_INLINE VecI32V VecI32V_One() +{ + return vdupq_n_s32(1); +} + +PX_FORCE_INLINE VecI32V VecI32V_Two() +{ + return vdupq_n_s32(2); +} + +PX_FORCE_INLINE VecI32V VecI32V_MinusOne() +{ + return vdupq_n_s32(-1); +} + +PX_FORCE_INLINE VecU32V U4Zero() +{ + return U4Load(0); +} + +PX_FORCE_INLINE VecU32V U4One() +{ + return U4Load(1); +} + +PX_FORCE_INLINE VecU32V U4Two() +{ + return U4Load(2); +} + +PX_FORCE_INLINE VecShiftV VecI32V_PrepareShift(const VecI32VArg shift) +{ + return shift; +} + +PX_FORCE_INLINE VecI32V VecI32V_LeftShift(const VecI32VArg a, const VecShiftVArg count) +{ + return vshlq_s32(a, count); +} + +PX_FORCE_INLINE VecI32V VecI32V_RightShift(const VecI32VArg a, const VecShiftVArg count) +{ + return vshlq_s32(a, VecI32V_Sub(I4Load(0), count)); +} + +PX_FORCE_INLINE VecI32V VecI32V_LeftShift(const VecI32VArg a, const PxU32 count) +{ + const int32x4_t shiftCount = { (PxI32)count, (PxI32)count, (PxI32)count, (PxI32)count }; + return vshlq_s32(a, shiftCount); +} + +PX_FORCE_INLINE VecI32V VecI32V_RightShift(const VecI32VArg a, const PxU32 count) +{ + const int32x4_t shiftCount = { -(PxI32)count, -(PxI32)count, -(PxI32)count, -(PxI32)count }; + return vshlq_s32(a, shiftCount); +} + +PX_FORCE_INLINE VecI32V VecI32V_And(const VecI32VArg a, const VecI32VArg b) +{ + return vandq_s32(a, b); +} + +PX_FORCE_INLINE VecI32V VecI32V_Or(const VecI32VArg a, const VecI32VArg b) +{ + return vorrq_s32(a, b); +} + +PX_FORCE_INLINE VecI32V VecI32V_GetX(const VecI32VArg f) +{ + const int32x2_t fLow = vget_low_s32(f); + return vdupq_lane_s32(fLow, 0); +} + +PX_FORCE_INLINE VecI32V VecI32V_GetY(const VecI32VArg f) +{ + const int32x2_t fLow = vget_low_s32(f); + return vdupq_lane_s32(fLow, 1); +} + +PX_FORCE_INLINE VecI32V VecI32V_GetZ(const VecI32VArg f) +{ + const int32x2_t fHigh = vget_high_s32(f); + return vdupq_lane_s32(fHigh, 0); +} + +PX_FORCE_INLINE VecI32V VecI32V_GetW(const VecI32VArg f) +{ + const int32x2_t fHigh = vget_high_s32(f); + return vdupq_lane_s32(fHigh, 1); +} + +PX_FORCE_INLINE VecI32V VecI32V_Sel(const BoolV c, const VecI32VArg a, const VecI32VArg b) +{ + return vbslq_s32(c, a, b); +} + +PX_FORCE_INLINE void PxI32_From_VecI32V(const VecI32VArg a, PxI32* i) +{ + *i = vgetq_lane_s32(a, 0); +} + +PX_FORCE_INLINE VecI32V VecI32V_Merge(const VecI32VArg a, const VecI32VArg b, const VecI32VArg c, const VecI32VArg d) +{ + const int32x2_t aLow = vget_low_s32(a); + const int32x2_t bLow = vget_low_s32(b); + const int32x2_t cLow = vget_low_s32(c); + const int32x2_t dLow = vget_low_s32(d); + + const int32x2_t low = vext_s32(aLow, bLow, 1); + const int32x2_t high = vext_s32(cLow, dLow, 1); + + return vcombine_s32(low, high); +} + +PX_FORCE_INLINE VecI32V VecI32V_From_BoolV(const BoolVArg a) +{ + return vreinterpretq_s32_u32(a); +} + +PX_FORCE_INLINE VecU32V VecU32V_From_BoolV(const BoolVArg a) +{ + return a; +} + +/* +template PX_FORCE_INLINE VecI32V V4ISplat() +{ + return vdupq_n_s32(a); +} + +template PX_FORCE_INLINE VecU32V V4USplat() +{ + return vdupq_n_u32(a); +} +*/ + +/* +PX_FORCE_INLINE void V4U16StoreAligned(VecU16V val, VecU16V* address) +{ + vst1q_u16((uint16_t*)address, val); +} +*/ + +PX_FORCE_INLINE void V4U32StoreAligned(VecU32V val, VecU32V* address) +{ + vst1q_u32(reinterpret_cast(address), val); +} + +PX_FORCE_INLINE Vec4V V4LoadAligned(Vec4V* addr) +{ + return vld1q_f32(reinterpret_cast(addr)); +} + +PX_FORCE_INLINE Vec4V V4LoadUnaligned(Vec4V* addr) +{ + return vld1q_f32(reinterpret_cast(addr)); +} + +PX_FORCE_INLINE Vec4V V4Andc(const Vec4V a, const VecU32V b) +{ + return vreinterpretq_f32_u32(V4U32Andc(vreinterpretq_u32_f32(a), b)); +} + +PX_FORCE_INLINE VecU32V V4IsGrtrV32u(const Vec4V a, const Vec4V b) +{ + return V4IsGrtr(a, b); +} + +PX_FORCE_INLINE VecU16V V4U16LoadAligned(VecU16V* addr) +{ + return vld1q_u16(reinterpret_cast(addr)); +} + +PX_FORCE_INLINE VecU16V V4U16LoadUnaligned(VecU16V* addr) +{ + return vld1q_u16(reinterpret_cast(addr)); +} + +PX_FORCE_INLINE VecU16V V4U16CompareGt(VecU16V a, VecU16V b) +{ + return vcgtq_u16(a, b); +} + +PX_FORCE_INLINE VecU16V V4I16CompareGt(VecI16V a, VecI16V b) +{ + return vcgtq_s16(a, b); +} + +PX_FORCE_INLINE Vec4V Vec4V_From_VecU32V(VecU32V a) +{ + return vcvtq_f32_u32(a); +} + +PX_FORCE_INLINE Vec4V Vec4V_From_VecI32V(VecI32V a) +{ + return vcvtq_f32_s32(a); +} + +PX_FORCE_INLINE VecI32V VecI32V_From_Vec4V(Vec4V a) +{ + return vcvtq_s32_f32(a); +} + +PX_FORCE_INLINE Vec4V Vec4V_ReinterpretFrom_VecU32V(VecU32V a) +{ + return vreinterpretq_f32_u32(a); +} + +PX_FORCE_INLINE Vec4V Vec4V_ReinterpretFrom_VecI32V(VecI32V a) +{ + return vreinterpretq_f32_s32(a); +} + +PX_FORCE_INLINE VecU32V VecU32V_ReinterpretFrom_Vec4V(Vec4V a) +{ + return vreinterpretq_u32_f32(a); +} + +PX_FORCE_INLINE VecI32V VecI32V_ReinterpretFrom_Vec4V(Vec4V a) +{ + return vreinterpretq_s32_f32(a); +} + +#if !PX_SWITCH +template +PX_FORCE_INLINE BoolV BSplatElement(BoolV a) +{ + if(index < 2) + { + return vdupq_lane_u32(vget_low_u32(a), index); + } + else if(index == 2) + { + return vdupq_lane_u32(vget_high_u32(a), 0); + } + else if(index == 3) + { + return vdupq_lane_u32(vget_high_u32(a), 1); + } +} +#else +//workaround for template compile issue +template PX_FORCE_INLINE BoolV BSplatElement(BoolV a); +template<> PX_FORCE_INLINE BoolV BSplatElement<0>(BoolV a) { return vdupq_lane_u32(vget_low_u32(a), 0); } +template<> PX_FORCE_INLINE BoolV BSplatElement<1>(BoolV a) { return vdupq_lane_u32(vget_low_u32(a), 1); } +template<> PX_FORCE_INLINE BoolV BSplatElement<2>(BoolV a) { return vdupq_lane_u32(vget_high_u32(a), 0); } +template<> PX_FORCE_INLINE BoolV BSplatElement<3>(BoolV a) { return vdupq_lane_u32(vget_high_u32(a), 1); } +#endif + +#if !PX_SWITCH +template +PX_FORCE_INLINE VecU32V V4U32SplatElement(VecU32V a) +{ + if(index < 2) + { + return vdupq_lane_u32(vget_low_u32(a), index); + } + else if(index == 2) + { + return vdupq_lane_u32(vget_high_u32(a), 0); + } + else if(index == 3) + { + return vdupq_lane_u32(vget_high_u32(a), 1); + } +} +#else +//workaround for template compile issue +template PX_FORCE_INLINE VecU32V V4U32SplatElement(VecU32V a); +template <> PX_FORCE_INLINE VecU32V V4U32SplatElement<0>(VecU32V a) { return vdupq_lane_u32(vget_low_u32(a), 0); } +template <> PX_FORCE_INLINE VecU32V V4U32SplatElement<1>(VecU32V a) { return vdupq_lane_u32(vget_low_u32(a), 1); } +template <> PX_FORCE_INLINE VecU32V V4U32SplatElement<2>(VecU32V a) { return vdupq_lane_u32(vget_high_u32(a), 0); } +template <> PX_FORCE_INLINE VecU32V V4U32SplatElement<3>(VecU32V a) { return vdupq_lane_u32(vget_high_u32(a), 1); } +#endif + +#if !PX_SWITCH +template +PX_FORCE_INLINE Vec4V V4SplatElement(Vec4V a) +{ + if(index == 0) + { + return vdupq_lane_f32(vget_low_f32(a), 0); + } + else if (index == 1) + { + return vdupq_lane_f32(vget_low_f32(a), 1); + } + else if(index == 2) + { + return vdupq_lane_f32(vget_high_f32(a), 0); + } + else if(index == 3) + { + return vdupq_lane_f32(vget_high_f32(a), 1); + } +} +#else +//workaround for template compile issue +template PX_FORCE_INLINE Vec4V V4SplatElement(Vec4V a); +template <> PX_FORCE_INLINE Vec4V V4SplatElement<0>(Vec4V a) { return vdupq_lane_f32(vget_low_f32(a), 0); } +template <> PX_FORCE_INLINE Vec4V V4SplatElement<1>(Vec4V a) { return vdupq_lane_f32(vget_low_f32(a), 1); } +template <> PX_FORCE_INLINE Vec4V V4SplatElement<2>(Vec4V a) { return vdupq_lane_f32(vget_high_f32(a), 0); } +template <> PX_FORCE_INLINE Vec4V V4SplatElement<3>(Vec4V a) { return vdupq_lane_f32(vget_high_f32(a), 1); } +#endif + +PX_FORCE_INLINE VecU32V U4LoadXYZW(PxU32 x, PxU32 y, PxU32 z, PxU32 w) +{ + const uint32x4_t ret = { x, y, z, w }; + return ret; +} + +PX_FORCE_INLINE VecU32V U4Load(const PxU32 i) +{ + return vdupq_n_u32(i); +} + +PX_FORCE_INLINE VecU32V U4LoadU(const PxU32* i) +{ + return vld1q_u32(i); +} + +PX_FORCE_INLINE VecU32V U4LoadA(const PxU32* i) +{ + return vld1q_u32(i); +} + +PX_FORCE_INLINE Vec4V V4Ceil(const Vec4V in) +{ + const float32x4_t ones = vdupq_n_f32(1.0f); + const float32x4_t rdToZero = vcvtq_f32_s32(vcvtq_s32_f32(in)); + const float32x4_t rdToZeroPlusOne = vaddq_f32(rdToZero, ones); + const uint32x4_t gt = vcgtq_f32(in, rdToZero); + return vbslq_f32(gt, rdToZeroPlusOne, rdToZero); +} + +PX_FORCE_INLINE Vec4V V4Floor(const Vec4V in) +{ + const float32x4_t ones = vdupq_n_f32(1.0f); + const float32x4_t rdToZero = vcvtq_f32_s32(vcvtq_s32_f32(in)); + const float32x4_t rdToZeroMinusOne = vsubq_f32(rdToZero, ones); + const uint32x4_t lt = vcltq_f32(in, rdToZero); + return vbslq_f32(lt, rdToZeroMinusOne, rdToZero); +} + +PX_FORCE_INLINE VecU32V V4ConvertToU32VSaturate(const Vec4V in, PxU32 power) +{ + PX_ASSERT(power == 0 && "Non-zero power not supported in convertToU32VSaturate"); + PX_UNUSED(power); // prevent warning in release builds + + return vcvtq_u32_f32(in); +} + +PX_FORCE_INLINE void QuatGetMat33V(const QuatVArg q, Vec3V& column0, Vec3V& column1, Vec3V& column2) +{ + const FloatV one = FOne(); + const FloatV x = V4GetX(q); + const FloatV y = V4GetY(q); + const FloatV z = V4GetZ(q); + const FloatV w = V4GetW(q); + + const FloatV x2 = FAdd(x, x); + const FloatV y2 = FAdd(y, y); + const FloatV z2 = FAdd(z, z); + + const FloatV xx = FMul(x2, x); + const FloatV yy = FMul(y2, y); + const FloatV zz = FMul(z2, z); + + const FloatV xy = FMul(x2, y); + const FloatV xz = FMul(x2, z); + const FloatV xw = FMul(x2, w); + + const FloatV yz = FMul(y2, z); + const FloatV yw = FMul(y2, w); + const FloatV zw = FMul(z2, w); + + const FloatV v = FSub(one, xx); + + column0 = V3Merge(FSub(FSub(one, yy), zz), FAdd(xy, zw), FSub(xz, yw)); + column1 = V3Merge(FSub(xy, zw), FSub(v, zz), FAdd(yz, xw)); + column2 = V3Merge(FAdd(xz, yw), FSub(yz, xw), FSub(v, yy)); +} + +} // namespace aos +} // namespace physx + +#endif // PXFOUNDATION_PXUNIXNEONINLINEAOS_H diff --git a/Source/ThirdParty/PhysX/foundation/unix/sse2/PxUnixSse2AoS.h b/Source/ThirdParty/PhysX/foundation/unix/sse2/PxUnixSse2AoS.h new file mode 100644 index 000000000..d7761a150 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/unix/sse2/PxUnixSse2AoS.h @@ -0,0 +1,187 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PXFOUNDATION_PXUNIXSSE2AOS_H +#define PXFOUNDATION_PXUNIXSSE2AOS_H + +// no includes here! this file should be included from PxcVecMath.h only!!! + +#if !COMPILE_VECTOR_INTRINSICS +#error Vector intrinsics should not be included when using scalar implementation. +#endif + +namespace physx +{ +namespace aos +{ + +#if PX_EMSCRIPTEN +typedef int8_t __int8_t; +typedef int16_t __int16_t; +typedef int32_t __int32_t; +typedef int64_t __int64_t; +typedef uint16_t __uint16_t; +typedef uint32_t __uint32_t; +typedef uint64_t __uint64_t; +#endif + +typedef union UnionM128 +{ + UnionM128() + { + } + UnionM128(__m128 in) + { + m128 = in; + } + + UnionM128(__m128i in) + { + m128i = in; + } + + operator __m128() + { + return m128; + } + + operator const __m128() const + { + return m128; + } + + float m128_f32[4]; + __int8_t m128_i8[16]; + __int16_t m128_i16[8]; + __int32_t m128_i32[4]; + __int64_t m128_i64[2]; + __uint16_t m128_u16[8]; + __uint32_t m128_u32[4]; + __uint64_t m128_u64[2]; + __m128 m128; + __m128i m128i; +} UnionM128; + +typedef __m128 FloatV; +typedef __m128 Vec3V; +typedef __m128 Vec4V; +typedef __m128 BoolV; +typedef __m128 QuatV; +typedef __m128i VecI32V; +typedef UnionM128 VecU32V; +typedef UnionM128 VecU16V; +typedef UnionM128 VecI16V; +typedef UnionM128 VecU8V; + +#define FloatVArg FloatV & +#define Vec3VArg Vec3V & +#define Vec4VArg Vec4V & +#define BoolVArg BoolV & +#define VecU32VArg VecU32V & +#define VecI32VArg VecI32V & +#define VecU16VArg VecU16V & +#define VecI16VArg VecI16V & +#define VecU8VArg VecU8V & +#define QuatVArg QuatV & + +// Optimization for situations in which you cross product multiple vectors with the same vector. +// Avoids 2X shuffles per product +struct VecCrossV +{ + Vec3V mL1; + Vec3V mR1; +}; + +struct VecShiftV +{ + VecI32V shift; +}; +#define VecShiftVArg VecShiftV & + +PX_ALIGN_PREFIX(16) +struct Mat33V +{ + Mat33V() + { + } + Mat33V(const Vec3V& c0, const Vec3V& c1, const Vec3V& c2) : col0(c0), col1(c1), col2(c2) + { + } + Vec3V PX_ALIGN(16, col0); + Vec3V PX_ALIGN(16, col1); + Vec3V PX_ALIGN(16, col2); +} PX_ALIGN_SUFFIX(16); + +PX_ALIGN_PREFIX(16) +struct Mat34V +{ + Mat34V() + { + } + Mat34V(const Vec3V& c0, const Vec3V& c1, const Vec3V& c2, const Vec3V& c3) : col0(c0), col1(c1), col2(c2), col3(c3) + { + } + Vec3V PX_ALIGN(16, col0); + Vec3V PX_ALIGN(16, col1); + Vec3V PX_ALIGN(16, col2); + Vec3V PX_ALIGN(16, col3); +} PX_ALIGN_SUFFIX(16); + +PX_ALIGN_PREFIX(16) +struct Mat43V +{ + Mat43V() + { + } + Mat43V(const Vec4V& c0, const Vec4V& c1, const Vec4V& c2) : col0(c0), col1(c1), col2(c2) + { + } + Vec4V PX_ALIGN(16, col0); + Vec4V PX_ALIGN(16, col1); + Vec4V PX_ALIGN(16, col2); +} PX_ALIGN_SUFFIX(16); + +PX_ALIGN_PREFIX(16) +struct Mat44V +{ + Mat44V() + { + } + Mat44V(const Vec4V& c0, const Vec4V& c1, const Vec4V& c2, const Vec4V& c3) : col0(c0), col1(c1), col2(c2), col3(c3) + { + } + Vec4V PX_ALIGN(16, col0); + Vec4V PX_ALIGN(16, col1); + Vec4V PX_ALIGN(16, col2); + Vec4V PX_ALIGN(16, col3); +} PX_ALIGN_SUFFIX(16); + +} // namespace aos +} // namespace physx + +#endif // PXFOUNDATION_PXUNIXSSE2AOS_H diff --git a/Source/ThirdParty/PhysX/foundation/unix/sse2/PxUnixSse2InlineAoS.h b/Source/ThirdParty/PhysX/foundation/unix/sse2/PxUnixSse2InlineAoS.h new file mode 100644 index 000000000..ac776942a --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/unix/sse2/PxUnixSse2InlineAoS.h @@ -0,0 +1,3274 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PXFOUNDATION_PXUNIXSSE2INLINEAOS_H +#define PXFOUNDATION_PXUNIXSSE2INLINEAOS_H + +#if !COMPILE_VECTOR_INTRINSICS +#error Vector intrinsics should not be included when using scalar implementation. +#endif + +#ifdef __SSE4_2__ +#include "smmintrin.h" +#endif + +#include "../../PxVecMathSSE.h" + +namespace physx +{ +namespace aos +{ + +#define PX_FPCLASS_SNAN 0x0001 /* signaling NaN */ +#define PX_FPCLASS_QNAN 0x0002 /* quiet NaN */ +#define PX_FPCLASS_NINF 0x0004 /* negative infinity */ +#define PX_FPCLASS_PINF 0x0200 /* positive infinity */ + +PX_FORCE_INLINE __m128 m128_I2F(__m128i n) +{ + return _mm_castsi128_ps(n); +} +PX_FORCE_INLINE __m128i m128_F2I(__m128 n) +{ + return _mm_castps_si128(n); +} + +////////////////////////////////////////////////////////////////////// +//Test that Vec3V and FloatV are legal +////////////////////////////////////////////////////////////////////// + +#define FLOAT_COMPONENTS_EQUAL_THRESHOLD 0.01f +PX_FORCE_INLINE static bool isValidFloatV(const FloatV a) +{ + const PxF32 x = V4ReadX(a); + const PxF32 y = V4ReadY(a); + const PxF32 z = V4ReadZ(a); + const PxF32 w = V4ReadW(a); + + return (x == y && x == z && x == w); + + /*if ( + (PxAbs(x - y) < FLOAT_COMPONENTS_EQUAL_THRESHOLD) && + (PxAbs(x - z) < FLOAT_COMPONENTS_EQUAL_THRESHOLD) && + (PxAbs(x - w) < FLOAT_COMPONENTS_EQUAL_THRESHOLD) + ) + { + return true; + } + + if ( + (PxAbs((x - y) / x) < FLOAT_COMPONENTS_EQUAL_THRESHOLD) && + (PxAbs((x - z) / x) < FLOAT_COMPONENTS_EQUAL_THRESHOLD) && + (PxAbs((x - w) / x) < FLOAT_COMPONENTS_EQUAL_THRESHOLD) + ) + { + return true; + } + + return false;*/ +} + +PX_FORCE_INLINE bool isValidVec3V(const Vec3V a) +{ + PX_ALIGN(16, PxF32 f[4]); + V4StoreA(a, f); + return (f[3] == 0.0f); +} + +PX_FORCE_INLINE bool isFiniteLength(const Vec3V a) +{ + return !FAllEq(V4LengthSq(a), FZero()); +} + +PX_FORCE_INLINE bool isAligned16(void* a) +{ + return(0 == (size_t(a) & 0x0f)); +} + +//ASSERT_FINITELENGTH is deactivated because there is a lot of code that calls a simd normalisation function with zero length but then ignores the result. + +#if PX_DEBUG +#define ASSERT_ISVALIDVEC3V(a) PX_ASSERT(isValidVec3V(a)) +#define ASSERT_ISVALIDFLOATV(a) PX_ASSERT(isValidFloatV(a)) +#define ASSERT_ISALIGNED16(a) PX_ASSERT(isAligned16(reinterpret_cast(a))) +#define ASSERT_ISFINITELENGTH(a) //PX_ASSERT(isFiniteLength(a)) +#else +#define ASSERT_ISVALIDVEC3V(a) +#define ASSERT_ISVALIDFLOATV(a) +#define ASSERT_ISALIGNED16(a) +#define ASSERT_ISFINITELENGTH(a) +#endif + + +namespace internalUnitSSE2Simd +{ +PX_FORCE_INLINE PxU32 BAllTrue4_R(const BoolV a) +{ + const PxI32 moveMask = _mm_movemask_ps(a); + return PxU32(moveMask == 0xf); +} + +PX_FORCE_INLINE PxU32 BAllTrue3_R(const BoolV a) +{ + const PxI32 moveMask = _mm_movemask_ps(a); + return PxU32((moveMask & 0x7) == 0x7); +} + +PX_FORCE_INLINE PxU32 BAnyTrue4_R(const BoolV a) +{ + const PxI32 moveMask = _mm_movemask_ps(a); + return PxU32(moveMask != 0x0); +} + +PX_FORCE_INLINE PxU32 BAnyTrue3_R(const BoolV a) +{ + const PxI32 moveMask = _mm_movemask_ps(a); + return PxU32((moveMask & 0x7) != 0x0); +} + +PX_FORCE_INLINE PxU32 FiniteTestEq(const Vec4V a, const Vec4V b) +{ + // This is a bit of a bodge. + //_mm_comieq_ss returns 1 if either value is nan so we need to re-cast a and b with true encoded as a non-nan + // number. + // There must be a better way of doing this in sse. + const BoolV one = FOne(); + const BoolV zero = FZero(); + const BoolV a1 = V4Sel(a, one, zero); + const BoolV b1 = V4Sel(b, one, zero); + return ( + _mm_comieq_ss(a1, b1) && + _mm_comieq_ss(_mm_shuffle_ps(a1, a1, _MM_SHUFFLE(1, 1, 1, 1)), _mm_shuffle_ps(b1, b1, _MM_SHUFFLE(1, 1, 1, 1))) && + _mm_comieq_ss(_mm_shuffle_ps(a1, a1, _MM_SHUFFLE(2, 2, 2, 2)), _mm_shuffle_ps(b1, b1, _MM_SHUFFLE(2, 2, 2, 2))) && + _mm_comieq_ss(_mm_shuffle_ps(a1, a1, _MM_SHUFFLE(3, 3, 3, 3)), _mm_shuffle_ps(b1, b1, _MM_SHUFFLE(3, 3, 3, 3)))); +} + +#if !PX_EMSCRIPTEN +#if PX_CLANG +#if PX_LINUX +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wglobal-constructors" +#endif +#endif +const PX_ALIGN(16, PxF32 gMaskXYZ[4]) = { physx::PxUnionCast(0xffffffff), physx::PxUnionCast(0xffffffff), + physx::PxUnionCast(0xffffffff), 0 }; +#if PX_CLANG +#if PX_LINUX +#pragma clang diagnostic pop +#endif +#endif +#else +// emscripten doesn't like the PxUnionCast data structure +// the following is what windows and xbox does -- using these for emscripten +const PX_ALIGN(16, PxU32 gMaskXYZ[4]) = { 0xffffffff, 0xffffffff, 0xffffffff, 0 }; +#endif +} + +namespace vecMathTests +{ +// PT: this function returns an invalid Vec3V (W!=0.0f) just for unit-testing 'isValidVec3V' +PX_FORCE_INLINE Vec3V getInvalidVec3V() +{ + const float f = 1.0f; + return _mm_load1_ps(&f); +} + +PX_FORCE_INLINE bool allElementsEqualFloatV(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_comieq_ss(a, b) != 0; +} + +PX_FORCE_INLINE bool allElementsEqualVec3V(const Vec3V a, const Vec3V b) +{ + return V3AllEq(a, b) != 0; +} + +PX_FORCE_INLINE bool allElementsEqualVec4V(const Vec4V a, const Vec4V b) +{ + return V4AllEq(a, b) != 0; +} + +PX_FORCE_INLINE bool allElementsEqualBoolV(const BoolV a, const BoolV b) +{ + return internalUnitSSE2Simd::BAllTrue4_R(VecI32V_IsEq(m128_F2I(a), m128_F2I(b))) != 0; +} + +PX_FORCE_INLINE bool allElementsEqualVecU32V(const VecU32V a, const VecU32V b) +{ + return internalUnitSSE2Simd::BAllTrue4_R(V4IsEqU32(a, b)) != 0; +} + +PX_FORCE_INLINE bool allElementsEqualVecI32V(const VecI32V a, const VecI32V b) +{ + BoolV c = m128_I2F(_mm_cmpeq_epi32(a, b)); + return internalUnitSSE2Simd::BAllTrue4_R(c) != 0; +} + +#define VECMATH_AOS_EPSILON (1e-3f) + +PX_FORCE_INLINE bool allElementsNearEqualFloatV(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + const FloatV c = FSub(a, b); + const FloatV minError = FLoad(-VECMATH_AOS_EPSILON); + const FloatV maxError = FLoad(VECMATH_AOS_EPSILON); + return _mm_comigt_ss(c, minError) && _mm_comilt_ss(c, maxError); +} + +PX_FORCE_INLINE bool allElementsNearEqualVec3V(const Vec3V a, const Vec3V b) +{ + const Vec3V c = V3Sub(a, b); + const Vec3V minError = V3Load(-VECMATH_AOS_EPSILON); + const Vec3V maxError = V3Load(VECMATH_AOS_EPSILON); + return (_mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), minError) && + _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), maxError) && + _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), minError) && + _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), maxError) && + _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), minError) && + _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), maxError)); +} + +PX_FORCE_INLINE bool allElementsNearEqualVec4V(const Vec4V a, const Vec4V b) +{ + const Vec4V c = V4Sub(a, b); + const Vec4V minError = V4Load(-VECMATH_AOS_EPSILON); + const Vec4V maxError = V4Load(VECMATH_AOS_EPSILON); + return (_mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), minError) && + _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), maxError) && + _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), minError) && + _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), maxError) && + _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), minError) && + _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), maxError) && + _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(3, 3, 3, 3)), minError) && + _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(3, 3, 3, 3)), maxError)); +} +} + +///////////////////////////////////////////////////////////////////// +////FUNCTIONS USED ONLY FOR ASSERTS IN VECTORISED IMPLEMENTATIONS +///////////////////////////////////////////////////////////////////// + +PX_FORCE_INLINE bool isFiniteFloatV(const FloatV a) +{ + PxF32 badNumber = + physx::PxUnionCast(PX_FPCLASS_SNAN | PX_FPCLASS_QNAN | PX_FPCLASS_NINF | PX_FPCLASS_PINF); + const FloatV vBadNum = FLoad(badNumber); + const BoolV vMask = BAnd(vBadNum, a); + return internalUnitSSE2Simd::FiniteTestEq(vMask, BFFFF()) == 1; +} + +PX_FORCE_INLINE bool isFiniteVec3V(const Vec3V a) +{ + PxF32 badNumber = + physx::PxUnionCast(PX_FPCLASS_SNAN | PX_FPCLASS_QNAN | PX_FPCLASS_NINF | PX_FPCLASS_PINF); + const Vec3V vBadNum = V3Load(badNumber); + const BoolV vMask = BAnd(BAnd(vBadNum, a), BTTTF()); + return internalUnitSSE2Simd::FiniteTestEq(vMask, BFFFF()) == 1; +} + +PX_FORCE_INLINE bool isFiniteVec4V(const Vec4V a) +{ + /*Vec4V a; + PX_ALIGN(16, PxF32 f[4]); + F32Array_Aligned_From_Vec4V(a, f); + return PxIsFinite(f[0]) + && PxIsFinite(f[1]) + && PxIsFinite(f[2]) + && PxIsFinite(f[3]);*/ + + PxF32 badNumber = + physx::PxUnionCast(PX_FPCLASS_SNAN | PX_FPCLASS_QNAN | PX_FPCLASS_NINF | PX_FPCLASS_PINF); + const Vec4V vBadNum = V4Load(badNumber); + const BoolV vMask = BAnd(vBadNum, a); + + return internalUnitSSE2Simd::FiniteTestEq(vMask, BFFFF()) == 1; +} + +PX_FORCE_INLINE bool hasZeroElementinFloatV(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + return _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)), FZero()) ? true : false; +} + +PX_FORCE_INLINE bool hasZeroElementInVec3V(const Vec3V a) +{ + return (_mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)), FZero()) || + _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)), FZero()) || + _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)), FZero())); +} + +PX_FORCE_INLINE bool hasZeroElementInVec4V(const Vec4V a) +{ + return (_mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)), FZero()) || + _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)), FZero()) || + _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)), FZero()) || + _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3)), FZero())); +} + +///////////////////////////////////////////////////////////////////// +////VECTORISED FUNCTION IMPLEMENTATIONS +///////////////////////////////////////////////////////////////////// + +PX_FORCE_INLINE FloatV FLoad(const PxF32 f) +{ + return _mm_load1_ps(&f); +} + +PX_FORCE_INLINE Vec3V V3Load(const PxF32 f) +{ + return _mm_set_ps(0.0f, f, f, f); +} + +PX_FORCE_INLINE Vec4V V4Load(const PxF32 f) +{ + return _mm_load1_ps(&f); +} + +PX_FORCE_INLINE BoolV BLoad(const bool f) +{ + const PxU32 i = PxU32(-PxI32(f)); + return _mm_load1_ps(reinterpret_cast(&i)); +} + +PX_FORCE_INLINE Vec3V V3LoadA(const PxVec3& f) +{ + ASSERT_ISALIGNED16(const_cast(&f)); +#if !PX_EMSCRIPTEN + return _mm_and_ps(reinterpret_cast(f), V4LoadA(internalUnitSSE2Simd::gMaskXYZ)); +#else + return _mm_and_ps((Vec3V&)f, (VecI32V&)internalUnitSSE2Simd::gMaskXYZ); +#endif +} + +PX_FORCE_INLINE Vec3V V3LoadU(const PxVec3& f) +{ + return _mm_set_ps(0.0f, f.z, f.y, f.x); +} + +PX_FORCE_INLINE Vec3V V3LoadUnsafeA(const PxVec3& f) +{ + ASSERT_ISALIGNED16(const_cast(&f)); + return _mm_set_ps(0.0f, f.z, f.y, f.x); +} + +PX_FORCE_INLINE Vec3V V3LoadA(const PxF32* const f) +{ + ASSERT_ISALIGNED16(const_cast(f)); +#if !PX_EMSCRIPTEN + return _mm_and_ps(V4LoadA(f), V4LoadA(internalUnitSSE2Simd::gMaskXYZ)); +#else + return _mm_and_ps((Vec3V&)*f, (VecI32V&)internalUnitSSE2Simd::gMaskXYZ); +#endif +} + +PX_FORCE_INLINE Vec3V V3LoadU(const PxF32* const i) +{ + return _mm_set_ps(0.0f, i[2], i[1], i[0]); +} + +PX_FORCE_INLINE Vec3V Vec3V_From_Vec4V(Vec4V v) +{ + return V4ClearW(v); +} + +PX_FORCE_INLINE Vec3V Vec3V_From_Vec4V_WUndefined(const Vec4V v) +{ + return v; +} + +PX_FORCE_INLINE Vec4V Vec4V_From_Vec3V(Vec3V f) +{ + ASSERT_ISVALIDVEC3V(f); + return f; // ok if it is implemented as the same type. +} + +PX_FORCE_INLINE Vec4V Vec4V_From_PxVec3_WUndefined(const PxVec3& f) +{ + return _mm_set_ps(0.0f, f.z, f.y, f.x); +} + +PX_FORCE_INLINE Vec4V Vec4V_From_FloatV(FloatV f) +{ + return f; +} + +PX_FORCE_INLINE Vec3V Vec3V_From_FloatV(FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + return Vec3V_From_Vec4V(Vec4V_From_FloatV(f)); +} + +PX_FORCE_INLINE Vec3V Vec3V_From_FloatV_WUndefined(FloatV f) +{ + ASSERT_ISVALIDVEC3V(f); + return Vec3V_From_Vec4V_WUndefined(Vec4V_From_FloatV(f)); +} + +PX_FORCE_INLINE Mat33V Mat33V_From_PxMat33(const PxMat33& m) +{ + return Mat33V(V3LoadU(m.column0), V3LoadU(m.column1), V3LoadU(m.column2)); +} + +PX_FORCE_INLINE void PxMat33_From_Mat33V(const Mat33V& m, PxMat33& out) +{ + V3StoreU(m.col0, out.column0); + V3StoreU(m.col1, out.column1); + V3StoreU(m.col2, out.column2); +} + +PX_FORCE_INLINE Vec4V V4LoadA(const PxF32* const f) +{ + ASSERT_ISALIGNED16(const_cast(f)); + return _mm_load_ps(f); +} + +PX_FORCE_INLINE void V4StoreA(Vec4V a, PxF32* f) +{ + ASSERT_ISALIGNED16(f); + _mm_store_ps(f, a); +} + +PX_FORCE_INLINE void V4StoreU(const Vec4V a, PxF32* f) +{ + _mm_storeu_ps(f, a); +} + +PX_FORCE_INLINE void BStoreA(const BoolV a, PxU32* f) +{ + ASSERT_ISALIGNED16(f); + _mm_store_ps(reinterpret_cast(f), a); +} + +PX_FORCE_INLINE void U4StoreA(const VecU32V uv, PxU32* u) +{ + ASSERT_ISALIGNED16(u); + _mm_store_ps(reinterpret_cast(u), uv); +} + +PX_FORCE_INLINE VecI32V I4LoadXYZW(const PxI32& x, const PxI32& y, const PxI32& z, const PxI32& w) +{ + return _mm_set_epi32(w, z, y, x); +} + +PX_FORCE_INLINE void I4StoreA(const VecI32V iv, PxI32* i) +{ + ASSERT_ISALIGNED16(i); + _mm_store_ps(reinterpret_cast(i), m128_I2F(iv)); +} + +PX_FORCE_INLINE Vec4V V4LoadU(const PxF32* const f) +{ + return _mm_loadu_ps(f); +} + +PX_FORCE_INLINE BoolV BLoad(const bool* const f) +{ + const PX_ALIGN(16, PxI32) b[4] = { -PxI32(f[0]), -PxI32(f[1]), -PxI32(f[2]), -PxI32(f[3]) }; + return _mm_load_ps(reinterpret_cast(&b)); +} + +PX_FORCE_INLINE void FStore(const FloatV a, PxF32* PX_RESTRICT f) +{ + ASSERT_ISVALIDFLOATV(a); + _mm_store_ss(f, a); +} + +PX_FORCE_INLINE void V3StoreA(const Vec3V a, PxVec3& f) +{ + ASSERT_ISALIGNED16(&f); + PX_ALIGN(16, PxF32) f2[4]; + _mm_store_ps(f2, a); + f = PxVec3(f2[0], f2[1], f2[2]); +} + +PX_FORCE_INLINE void V3StoreU(const Vec3V a, PxVec3& f) +{ + PX_ALIGN(16, PxF32) f2[4]; + _mm_store_ps(f2, a); + f = PxVec3(f2[0], f2[1], f2[2]); +} + +PX_FORCE_INLINE void Store_From_BoolV(const BoolV b, PxU32* b2) +{ + _mm_store_ss(reinterpret_cast(b2), b); +} + +PX_FORCE_INLINE VecU32V U4Load(const PxU32 i) +{ + return _mm_load1_ps(reinterpret_cast(&i)); +} + +PX_FORCE_INLINE VecU32V U4LoadU(const PxU32* i) +{ + return _mm_loadu_ps(reinterpret_cast(i)); +} + +PX_FORCE_INLINE VecU32V U4LoadA(const PxU32* i) +{ + ASSERT_ISALIGNED16(const_cast(i)); + return _mm_load_ps(reinterpret_cast(i)); +} + +////////////////////////////////// +// FLOATV +////////////////////////////////// + +PX_FORCE_INLINE FloatV FZero() +{ + return FLoad(0.0f); +} + +PX_FORCE_INLINE FloatV FOne() +{ + return FLoad(1.0f); +} + +PX_FORCE_INLINE FloatV FHalf() +{ + return FLoad(0.5f); +} + +PX_FORCE_INLINE FloatV FEps() +{ + return FLoad(PX_EPS_REAL); +} + +PX_FORCE_INLINE FloatV FEps6() +{ + return FLoad(1e-6f); +} + +PX_FORCE_INLINE FloatV FMax() +{ + return FLoad(PX_MAX_REAL); +} + +PX_FORCE_INLINE FloatV FNegMax() +{ + return FLoad(-PX_MAX_REAL); +} + +PX_FORCE_INLINE FloatV IZero() +{ + const PxU32 zero = 0; + return _mm_load1_ps(reinterpret_cast(&zero)); +} + +PX_FORCE_INLINE FloatV IOne() +{ + const PxU32 one = 1; + return _mm_load1_ps(reinterpret_cast(&one)); +} + +PX_FORCE_INLINE FloatV ITwo() +{ + const PxU32 two = 2; + return _mm_load1_ps(reinterpret_cast(&two)); +} + +PX_FORCE_INLINE FloatV IThree() +{ + const PxU32 three = 3; + return _mm_load1_ps(reinterpret_cast(&three)); +} + +PX_FORCE_INLINE FloatV IFour() +{ + PxU32 four = 4; + return _mm_load1_ps(reinterpret_cast(&four)); +} + +PX_FORCE_INLINE FloatV FNeg(const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + return _mm_sub_ps(_mm_setzero_ps(), f); +} + +PX_FORCE_INLINE FloatV FAdd(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); +/* + if(!isValidFloatV(a)) + { +assert(false); + } + if(!isValidFloatV(b)) + { +assert(false); + } +*/ + return _mm_add_ps(a, b); +} + +PX_FORCE_INLINE FloatV FSub(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_sub_ps(a, b); +} + +PX_FORCE_INLINE FloatV FMul(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_mul_ps(a, b); +} + +PX_FORCE_INLINE FloatV FDiv(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_div_ps(a, b); +} + +PX_FORCE_INLINE FloatV FDivFast(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_mul_ps(a, _mm_rcp_ps(b)); +} + +PX_FORCE_INLINE FloatV FRecip(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + return _mm_div_ps(FOne(), a); +} + +PX_FORCE_INLINE FloatV FRecipFast(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + return _mm_rcp_ps(a); +} + +PX_FORCE_INLINE FloatV FRsqrt(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + return _mm_div_ps(FOne(), _mm_sqrt_ps(a)); +} + +PX_FORCE_INLINE FloatV FSqrt(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + return _mm_sqrt_ps(a); +} + +PX_FORCE_INLINE FloatV FRsqrtFast(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + return _mm_rsqrt_ps(a); +} + +PX_FORCE_INLINE FloatV FScaleAdd(const FloatV a, const FloatV b, const FloatV c) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + ASSERT_ISVALIDFLOATV(c); + return FAdd(FMul(a, b), c); +} + +PX_FORCE_INLINE FloatV FNegScaleSub(const FloatV a, const FloatV b, const FloatV c) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + ASSERT_ISVALIDFLOATV(c); + return FSub(c, FMul(a, b)); +} + +PX_FORCE_INLINE FloatV FAbs(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + PX_ALIGN(16, const PxU32) absMask[4] = { 0x7fFFffFF, 0x7fFFffFF, 0x7fFFffFF, 0x7fFFffFF }; + return _mm_and_ps(a, _mm_load_ps(reinterpret_cast(absMask))); +} + +PX_FORCE_INLINE FloatV FSel(const BoolV c, const FloatV a, const FloatV b) +{ + PX_ASSERT(vecMathTests::allElementsEqualBoolV(c,BTTTT()) || + vecMathTests::allElementsEqualBoolV(c,BFFFF())); + ASSERT_ISVALIDFLOATV(_mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a))); + return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a)); +} + +PX_FORCE_INLINE BoolV FIsGrtr(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_cmpgt_ps(a, b); +} + +PX_FORCE_INLINE BoolV FIsGrtrOrEq(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_cmpge_ps(a, b); +} + +PX_FORCE_INLINE BoolV FIsEq(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_cmpeq_ps(a, b); +} + +PX_FORCE_INLINE FloatV FMax(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_max_ps(a, b); +} + +PX_FORCE_INLINE FloatV FMin(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_min_ps(a, b); +} + +PX_FORCE_INLINE FloatV FClamp(const FloatV a, const FloatV minV, const FloatV maxV) +{ + ASSERT_ISVALIDFLOATV(minV); + ASSERT_ISVALIDFLOATV(maxV); + return _mm_max_ps(_mm_min_ps(a, maxV), minV); +} + +PX_FORCE_INLINE PxU32 FAllGrtr(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return PxU32(_mm_comigt_ss(a, b)); +} + +PX_FORCE_INLINE PxU32 FAllGrtrOrEq(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return PxU32(_mm_comige_ss(a, b)); +} + +PX_FORCE_INLINE PxU32 FAllEq(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return PxU32(_mm_comieq_ss(a, b)); +} + +PX_FORCE_INLINE FloatV FRound(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); +#ifdef __SSE4_2__ + return _mm_round_ps(a, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); +#else + // return _mm_round_ps(a, 0x0); + const FloatV half = FLoad(0.5f); + const __m128 signBit = _mm_cvtepi32_ps(_mm_srli_epi32(_mm_cvtps_epi32(a), 31)); + const FloatV aRound = FSub(FAdd(a, half), signBit); + __m128i tmp = _mm_cvttps_epi32(aRound); + return _mm_cvtepi32_ps(tmp); +#endif +} + +PX_FORCE_INLINE FloatV FSin(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + + // Modulo the range of the given angles such that -XM_2PI <= Angles < XM_2PI + const FloatV recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f); + const FloatV twoPi = V4LoadA(g_PXTwoPi.f); + const FloatV tmp = FMul(a, recipTwoPi); + const FloatV b = FRound(tmp); + const FloatV V1 = FNegScaleSub(twoPi, b, a); + + // sin(V) ~= V - V^3 / 3! + V^5 / 5! - V^7 / 7! + V^9 / 9! - V^11 / 11! + V^13 / 13! - + // V^15 / 15! + V^17 / 17! - V^19 / 19! + V^21 / 21! - V^23 / 23! (for -PI <= V < PI) + const FloatV V2 = FMul(V1, V1); + const FloatV V3 = FMul(V2, V1); + const FloatV V5 = FMul(V3, V2); + const FloatV V7 = FMul(V5, V2); + const FloatV V9 = FMul(V7, V2); + const FloatV V11 = FMul(V9, V2); + const FloatV V13 = FMul(V11, V2); + const FloatV V15 = FMul(V13, V2); + const FloatV V17 = FMul(V15, V2); + const FloatV V19 = FMul(V17, V2); + const FloatV V21 = FMul(V19, V2); + const FloatV V23 = FMul(V21, V2); + + const Vec4V sinCoefficients0 = V4LoadA(g_PXSinCoefficients0.f); + const Vec4V sinCoefficients1 = V4LoadA(g_PXSinCoefficients1.f); + const Vec4V sinCoefficients2 = V4LoadA(g_PXSinCoefficients2.f); + + const FloatV S1 = V4GetY(sinCoefficients0); + const FloatV S2 = V4GetZ(sinCoefficients0); + const FloatV S3 = V4GetW(sinCoefficients0); + const FloatV S4 = V4GetX(sinCoefficients1); + const FloatV S5 = V4GetY(sinCoefficients1); + const FloatV S6 = V4GetZ(sinCoefficients1); + const FloatV S7 = V4GetW(sinCoefficients1); + const FloatV S8 = V4GetX(sinCoefficients2); + const FloatV S9 = V4GetY(sinCoefficients2); + const FloatV S10 = V4GetZ(sinCoefficients2); + const FloatV S11 = V4GetW(sinCoefficients2); + + FloatV Result; + Result = FScaleAdd(S1, V3, V1); + Result = FScaleAdd(S2, V5, Result); + Result = FScaleAdd(S3, V7, Result); + Result = FScaleAdd(S4, V9, Result); + Result = FScaleAdd(S5, V11, Result); + Result = FScaleAdd(S6, V13, Result); + Result = FScaleAdd(S7, V15, Result); + Result = FScaleAdd(S8, V17, Result); + Result = FScaleAdd(S9, V19, Result); + Result = FScaleAdd(S10, V21, Result); + Result = FScaleAdd(S11, V23, Result); + + return Result; +} + +PX_FORCE_INLINE FloatV FCos(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + + // Modulo the range of the given angles such that -XM_2PI <= Angles < XM_2PI + const FloatV recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f); + const FloatV twoPi = V4LoadA(g_PXTwoPi.f); + const FloatV tmp = FMul(a, recipTwoPi); + const FloatV b = FRound(tmp); + const FloatV V1 = FNegScaleSub(twoPi, b, a); + + // cos(V) ~= 1 - V^2 / 2! + V^4 / 4! - V^6 / 6! + V^8 / 8! - V^10 / 10! + V^12 / 12! - + // V^14 / 14! + V^16 / 16! - V^18 / 18! + V^20 / 20! - V^22 / 22! (for -PI <= V < PI) + const FloatV V2 = FMul(V1, V1); + const FloatV V4 = FMul(V2, V2); + const FloatV V6 = FMul(V4, V2); + const FloatV V8 = FMul(V4, V4); + const FloatV V10 = FMul(V6, V4); + const FloatV V12 = FMul(V6, V6); + const FloatV V14 = FMul(V8, V6); + const FloatV V16 = FMul(V8, V8); + const FloatV V18 = FMul(V10, V8); + const FloatV V20 = FMul(V10, V10); + const FloatV V22 = FMul(V12, V10); + + const Vec4V cosCoefficients0 = V4LoadA(g_PXCosCoefficients0.f); + const Vec4V cosCoefficients1 = V4LoadA(g_PXCosCoefficients1.f); + const Vec4V cosCoefficients2 = V4LoadA(g_PXCosCoefficients2.f); + + const FloatV C1 = V4GetY(cosCoefficients0); + const FloatV C2 = V4GetZ(cosCoefficients0); + const FloatV C3 = V4GetW(cosCoefficients0); + const FloatV C4 = V4GetX(cosCoefficients1); + const FloatV C5 = V4GetY(cosCoefficients1); + const FloatV C6 = V4GetZ(cosCoefficients1); + const FloatV C7 = V4GetW(cosCoefficients1); + const FloatV C8 = V4GetX(cosCoefficients2); + const FloatV C9 = V4GetY(cosCoefficients2); + const FloatV C10 = V4GetZ(cosCoefficients2); + const FloatV C11 = V4GetW(cosCoefficients2); + + FloatV Result; + Result = FScaleAdd(C1, V2, V4One()); + Result = FScaleAdd(C2, V4, Result); + Result = FScaleAdd(C3, V6, Result); + Result = FScaleAdd(C4, V8, Result); + Result = FScaleAdd(C5, V10, Result); + Result = FScaleAdd(C6, V12, Result); + Result = FScaleAdd(C7, V14, Result); + Result = FScaleAdd(C8, V16, Result); + Result = FScaleAdd(C9, V18, Result); + Result = FScaleAdd(C10, V20, Result); + Result = FScaleAdd(C11, V22, Result); + + return Result; +} + +PX_FORCE_INLINE PxU32 FOutOfBounds(const FloatV a, const FloatV min, const FloatV max) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(min); + ASSERT_ISVALIDFLOATV(max); + const BoolV c = BOr(FIsGrtr(a, max), FIsGrtr(min, a)); + return !BAllEqFFFF(c); +} + +PX_FORCE_INLINE PxU32 FInBounds(const FloatV a, const FloatV min, const FloatV max) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(min); + ASSERT_ISVALIDFLOATV(max) + const BoolV c = BAnd(FIsGrtrOrEq(a, min), FIsGrtrOrEq(max, a)); + return BAllEqTTTT(c); +} + +PX_FORCE_INLINE PxU32 FOutOfBounds(const FloatV a, const FloatV bounds) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(bounds); + return FOutOfBounds(a, FNeg(bounds), bounds); +} + +PX_FORCE_INLINE PxU32 FInBounds(const FloatV a, const FloatV bounds) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(bounds); + return FInBounds(a, FNeg(bounds), bounds); +} + +////////////////////////////////// +// VEC3V +////////////////////////////////// + +PX_FORCE_INLINE Vec3V V3Splat(const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + const __m128 zero = FZero(); + const __m128 fff0 = _mm_move_ss(f, zero); + return _mm_shuffle_ps(fff0, fff0, _MM_SHUFFLE(0, 1, 2, 3)); +} + +PX_FORCE_INLINE Vec3V V3Merge(const FloatVArg x, const FloatVArg y, const FloatVArg z) +{ + ASSERT_ISVALIDFLOATV(x); + ASSERT_ISVALIDFLOATV(y); + ASSERT_ISVALIDFLOATV(z); + // static on zero causes compiler crash on x64 debug_opt + const __m128 zero = FZero(); + const __m128 xy = _mm_move_ss(x, y); + const __m128 z0 = _mm_move_ss(zero, z); + + return _mm_shuffle_ps(xy, z0, _MM_SHUFFLE(1, 0, 0, 1)); +} + +PX_FORCE_INLINE Vec3V V3UnitX() +{ + const PX_ALIGN(16, PxF32) x[4] = { 1.0f, 0.0f, 0.0f, 0.0f }; + const __m128 x128 = _mm_load_ps(x); + return x128; +} + +PX_FORCE_INLINE Vec3V V3UnitY() +{ + const PX_ALIGN(16, PxF32) y[4] = { 0.0f, 1.0f, 0.0f, 0.0f }; + const __m128 y128 = _mm_load_ps(y); + return y128; +} + +PX_FORCE_INLINE Vec3V V3UnitZ() +{ + const PX_ALIGN(16, PxF32) z[4] = { 0.0f, 0.0f, 1.0f, 0.0f }; + const __m128 z128 = _mm_load_ps(z); + return z128; +} + +PX_FORCE_INLINE FloatV V3GetX(const Vec3V f) +{ + ASSERT_ISVALIDVEC3V(f); + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0, 0, 0, 0)); +} + +PX_FORCE_INLINE FloatV V3GetY(const Vec3V f) +{ + ASSERT_ISVALIDVEC3V(f) + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(1, 1, 1, 1)); +} + +PX_FORCE_INLINE FloatV V3GetZ(const Vec3V f) +{ + ASSERT_ISVALIDVEC3V(f); + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(2, 2, 2, 2)); +} + +PX_FORCE_INLINE Vec3V V3SetX(const Vec3V v, const FloatV f) +{ + ASSERT_ISVALIDVEC3V(v); + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BFTTT(), v, f); +} + +PX_FORCE_INLINE Vec3V V3SetY(const Vec3V v, const FloatV f) +{ + ASSERT_ISVALIDVEC3V(v); + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BTFTT(), v, f); +} + +PX_FORCE_INLINE Vec3V V3SetZ(const Vec3V v, const FloatV f) +{ + ASSERT_ISVALIDVEC3V(v); + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BTTFT(), v, f); +} + +PX_FORCE_INLINE Vec3V V3ColX(const Vec3V a, const Vec3V b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + ASSERT_ISVALIDVEC3V(c); + Vec3V r = _mm_shuffle_ps(a, c, _MM_SHUFFLE(3, 0, 3, 0)); + return V3SetY(r, V3GetX(b)); +} + +PX_FORCE_INLINE Vec3V V3ColY(const Vec3V a, const Vec3V b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + ASSERT_ISVALIDVEC3V(c) + Vec3V r = _mm_shuffle_ps(a, c, _MM_SHUFFLE(3, 1, 3, 1)); + return V3SetY(r, V3GetY(b)); +} + +PX_FORCE_INLINE Vec3V V3ColZ(const Vec3V a, const Vec3V b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + ASSERT_ISVALIDVEC3V(c); + Vec3V r = _mm_shuffle_ps(a, c, _MM_SHUFFLE(3, 2, 3, 2)); + return V3SetY(r, V3GetZ(b)); +} + +PX_FORCE_INLINE Vec3V V3Zero() +{ + return V3Load(0.0f); +} + +PX_FORCE_INLINE Vec3V V3Eps() +{ + return V3Load(PX_EPS_REAL); +} +PX_FORCE_INLINE Vec3V V3One() +{ + return V3Load(1.0f); +} + +PX_FORCE_INLINE Vec3V V3Neg(const Vec3V f) +{ + ASSERT_ISVALIDVEC3V(f); + return _mm_sub_ps(_mm_setzero_ps(), f); +} + +PX_FORCE_INLINE Vec3V V3Add(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return _mm_add_ps(a, b); +} + +PX_FORCE_INLINE Vec3V V3Sub(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return _mm_sub_ps(a, b); +} + +PX_FORCE_INLINE Vec3V V3Scale(const Vec3V a, const FloatV b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_mul_ps(a, b); +} + +PX_FORCE_INLINE Vec3V V3Mul(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return _mm_mul_ps(a, b); +} + +PX_FORCE_INLINE Vec3V V3ScaleInv(const Vec3V a, const FloatV b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_div_ps(a, b); +} + +PX_FORCE_INLINE Vec3V V3Div(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return V4ClearW(_mm_div_ps(a, b)); +} + +PX_FORCE_INLINE Vec3V V3ScaleInvFast(const Vec3V a, const FloatV b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_mul_ps(a, _mm_rcp_ps(b)); +} + +PX_FORCE_INLINE Vec3V V3DivFast(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return V4ClearW(_mm_mul_ps(a, _mm_rcp_ps(b))); +} + +PX_FORCE_INLINE Vec3V V3Recip(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const __m128 zero = V3Zero(); + const __m128 tttf = BTTTF(); + const __m128 recipA = _mm_div_ps(V3One(), a); + return V4Sel(tttf, recipA, zero); +} + +PX_FORCE_INLINE Vec3V V3RecipFast(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const __m128 zero = V3Zero(); + const __m128 tttf = BTTTF(); + const __m128 recipA = _mm_rcp_ps(a); + return V4Sel(tttf, recipA, zero); +} + +PX_FORCE_INLINE Vec3V V3Rsqrt(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const __m128 zero = V3Zero(); + const __m128 tttf = BTTTF(); + const __m128 recipA = _mm_div_ps(V3One(), _mm_sqrt_ps(a)); + return V4Sel(tttf, recipA, zero); +} + +PX_FORCE_INLINE Vec3V V3RsqrtFast(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const __m128 zero = V3Zero(); + const __m128 tttf = BTTTF(); + const __m128 recipA = _mm_rsqrt_ps(a); + return V4Sel(tttf, recipA, zero); +} + +PX_FORCE_INLINE Vec3V V3ScaleAdd(const Vec3V a, const FloatV b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDFLOATV(b); + ASSERT_ISVALIDVEC3V(c); + return V3Add(V3Scale(a, b), c); +} + +PX_FORCE_INLINE Vec3V V3NegScaleSub(const Vec3V a, const FloatV b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDFLOATV(b); + ASSERT_ISVALIDVEC3V(c); + return V3Sub(c, V3Scale(a, b)); +} + +PX_FORCE_INLINE Vec3V V3MulAdd(const Vec3V a, const Vec3V b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + ASSERT_ISVALIDVEC3V(c); + return V3Add(V3Mul(a, b), c); +} + +PX_FORCE_INLINE Vec3V V3NegMulSub(const Vec3V a, const Vec3V b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + ASSERT_ISVALIDVEC3V(c); + return V3Sub(c, V3Mul(a, b)); +} + +PX_FORCE_INLINE Vec3V V3Abs(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return V3Max(a, V3Neg(a)); +} + +PX_FORCE_INLINE FloatV V3Dot(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); +#ifdef __SSE4_2__ + return _mm_dp_ps(a, b, 0x7f); +#else + const __m128 t0 = _mm_mul_ps(a, b); // aw*bw | az*bz | ay*by | ax*bx + const __m128 t1 = _mm_shuffle_ps(t0, t0, _MM_SHUFFLE(1,0,3,2)); // ay*by | ax*bx | aw*bw | az*bz + const __m128 t2 = _mm_add_ps(t0, t1); // ay*by + aw*bw | ax*bx + az*bz | aw*bw + ay*by | az*bz + ax*bx + const __m128 t3 = _mm_shuffle_ps(t2, t2, _MM_SHUFFLE(2,3,0,1)); // ax*bx + az*bz | ay*by + aw*bw | az*bz + ax*bx | aw*bw + ay*by + return _mm_add_ps(t3, t2); // ax*bx + az*bz + ay*by + aw*bw + // ay*by + aw*bw + ax*bx + az*bz + // az*bz + ax*bx + aw*bw + ay*by + // aw*bw + ay*by + az*bz + ax*bx +#endif +} + +PX_FORCE_INLINE Vec3V V3Cross(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + const __m128 r1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2)); // z,x,y,w + const __m128 r2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 0, 2, 1)); // y,z,x,w + const __m128 l1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1)); // y,z,x,w + const __m128 l2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 1, 0, 2)); // z,x,y,w + return _mm_sub_ps(_mm_mul_ps(l1, l2), _mm_mul_ps(r1, r2)); +} + +PX_FORCE_INLINE VecCrossV V3PrepareCross(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + VecCrossV v; + v.mR1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2)); // z,x,y,w + v.mL1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1)); // y,z,x,w + return v; +} + +PX_FORCE_INLINE Vec3V V3Cross(const VecCrossV& a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(b); + const __m128 r2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 0, 2, 1)); // y,z,x,w + const __m128 l2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 1, 0, 2)); // z,x,y,w + return _mm_sub_ps(_mm_mul_ps(a.mL1, l2), _mm_mul_ps(a.mR1, r2)); +} + +PX_FORCE_INLINE Vec3V V3Cross(const Vec3V a, const VecCrossV& b) +{ + ASSERT_ISVALIDVEC3V(a); + const __m128 r2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1)); // y,z,x,w + const __m128 l2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2)); // z,x,y,w + return _mm_sub_ps(_mm_mul_ps(b.mR1, r2), _mm_mul_ps(b.mL1, l2)); +} + +PX_FORCE_INLINE Vec3V V3Cross(const VecCrossV& a, const VecCrossV& b) +{ + return _mm_sub_ps(_mm_mul_ps(a.mL1, b.mR1), _mm_mul_ps(a.mR1, b.mL1)); +} + +PX_FORCE_INLINE FloatV V3Length(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return _mm_sqrt_ps(V3Dot(a, a)); +} + +PX_FORCE_INLINE FloatV V3LengthSq(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return V3Dot(a, a); +} + +PX_FORCE_INLINE Vec3V V3Normalize(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISFINITELENGTH(a); + return V3ScaleInv(a, _mm_sqrt_ps(V3Dot(a, a))); +} + +PX_FORCE_INLINE Vec3V V3NormalizeFast(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISFINITELENGTH(a); + return V3Scale(a, _mm_rsqrt_ps(V3Dot(a, a))); +} + +PX_FORCE_INLINE Vec3V V3NormalizeSafe(const Vec3V a, const Vec3V unsafeReturnValue) +{ + ASSERT_ISVALIDVEC3V(a); + const __m128 eps = V4Eps(); + const __m128 length = V3Length(a); + const __m128 isGreaterThanZero = FIsGrtr(length, eps); + return V3Sel(isGreaterThanZero, V3ScaleInv(a, length), unsafeReturnValue); +} + +PX_FORCE_INLINE Vec3V V3Sel(const BoolV c, const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(_mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a))); + return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a)); +} + +PX_FORCE_INLINE BoolV V3IsGrtr(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return _mm_cmpgt_ps(a, b); +} + +PX_FORCE_INLINE BoolV V3IsGrtrOrEq(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return _mm_cmpge_ps(a, b); +} + +PX_FORCE_INLINE BoolV V3IsEq(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return _mm_cmpeq_ps(a, b); +} + +PX_FORCE_INLINE Vec3V V3Max(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return _mm_max_ps(a, b); +} + +PX_FORCE_INLINE Vec3V V3Min(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return _mm_min_ps(a, b); +} + +PX_FORCE_INLINE FloatV V3ExtractMax(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)); + const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)); + const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)); + + return _mm_max_ps(_mm_max_ps(shuf1, shuf2), shuf3); +} + +PX_FORCE_INLINE FloatV V3ExtractMin(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + + const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)); + const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)); + const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)); + + return _mm_min_ps(_mm_min_ps(shuf1, shuf2), shuf3); +} + +// return (a >= 0.0f) ? 1.0f : -1.0f; +PX_FORCE_INLINE Vec3V V3Sign(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const __m128 zero = V3Zero(); + const __m128 one = V3One(); + const __m128 none = V3Neg(one); + return V3Sel(V3IsGrtrOrEq(a, zero), one, none); +} + +PX_FORCE_INLINE Vec3V V3Clamp(const Vec3V a, const Vec3V minV, const Vec3V maxV) +{ + ASSERT_ISVALIDVEC3V(maxV); + ASSERT_ISVALIDVEC3V(minV); + return V3Max(V3Min(a, maxV), minV); +} + +PX_FORCE_INLINE PxU32 V3AllGrtr(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return internalUnitSSE2Simd::BAllTrue3_R(V4IsGrtr(a, b)); +} + +PX_FORCE_INLINE PxU32 V3AllGrtrOrEq(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return internalUnitSSE2Simd::BAllTrue3_R(V4IsGrtrOrEq(a, b)); +} + +PX_FORCE_INLINE PxU32 V3AllEq(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return internalUnitSSE2Simd::BAllTrue3_R(V4IsEq(a, b)); +} + +PX_FORCE_INLINE Vec3V V3Round(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); +#ifdef __SSE4_2__ + return _mm_round_ps(a, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); +#else + // return _mm_round_ps(a, 0x0); + const Vec3V half = V3Load(0.5f); + const __m128 signBit = _mm_cvtepi32_ps(_mm_srli_epi32(_mm_cvtps_epi32(a), 31)); + const Vec3V aRound = V3Sub(V3Add(a, half), signBit); + __m128i tmp = _mm_cvttps_epi32(aRound); + return _mm_cvtepi32_ps(tmp); +#endif +} + +PX_FORCE_INLINE Vec3V V3Sin(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + // Modulo the range of the given angles such that -XM_2PI <= Angles < XM_2PI + const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f); + const Vec4V twoPi = V4LoadA(g_PXTwoPi.f); + const Vec3V tmp = V3Scale(a, recipTwoPi); + const Vec3V b = V3Round(tmp); + const Vec3V V1 = V3NegScaleSub(b, twoPi, a); + + // sin(V) ~= V - V^3 / 3! + V^5 / 5! - V^7 / 7! + V^9 / 9! - V^11 / 11! + V^13 / 13! - + // V^15 / 15! + V^17 / 17! - V^19 / 19! + V^21 / 21! - V^23 / 23! (for -PI <= V < PI) + const Vec3V V2 = V3Mul(V1, V1); + const Vec3V V3 = V3Mul(V2, V1); + const Vec3V V5 = V3Mul(V3, V2); + const Vec3V V7 = V3Mul(V5, V2); + const Vec3V V9 = V3Mul(V7, V2); + const Vec3V V11 = V3Mul(V9, V2); + const Vec3V V13 = V3Mul(V11, V2); + const Vec3V V15 = V3Mul(V13, V2); + const Vec3V V17 = V3Mul(V15, V2); + const Vec3V V19 = V3Mul(V17, V2); + const Vec3V V21 = V3Mul(V19, V2); + const Vec3V V23 = V3Mul(V21, V2); + + const Vec4V sinCoefficients0 = V4LoadA(g_PXSinCoefficients0.f); + const Vec4V sinCoefficients1 = V4LoadA(g_PXSinCoefficients1.f); + const Vec4V sinCoefficients2 = V4LoadA(g_PXSinCoefficients2.f); + + const FloatV S1 = V4GetY(sinCoefficients0); + const FloatV S2 = V4GetZ(sinCoefficients0); + const FloatV S3 = V4GetW(sinCoefficients0); + const FloatV S4 = V4GetX(sinCoefficients1); + const FloatV S5 = V4GetY(sinCoefficients1); + const FloatV S6 = V4GetZ(sinCoefficients1); + const FloatV S7 = V4GetW(sinCoefficients1); + const FloatV S8 = V4GetX(sinCoefficients2); + const FloatV S9 = V4GetY(sinCoefficients2); + const FloatV S10 = V4GetZ(sinCoefficients2); + const FloatV S11 = V4GetW(sinCoefficients2); + + Vec3V Result; + Result = V3ScaleAdd(V3, S1, V1); + Result = V3ScaleAdd(V5, S2, Result); + Result = V3ScaleAdd(V7, S3, Result); + Result = V3ScaleAdd(V9, S4, Result); + Result = V3ScaleAdd(V11, S5, Result); + Result = V3ScaleAdd(V13, S6, Result); + Result = V3ScaleAdd(V15, S7, Result); + Result = V3ScaleAdd(V17, S8, Result); + Result = V3ScaleAdd(V19, S9, Result); + Result = V3ScaleAdd(V21, S10, Result); + Result = V3ScaleAdd(V23, S11, Result); + + ASSERT_ISVALIDVEC3V(Result); + return Result; +} + +PX_FORCE_INLINE Vec3V V3Cos(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + + // Modulo the range of the given angles such that -XM_2PI <= Angles < XM_2PI + const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f); + const Vec4V twoPi = V4LoadA(g_PXTwoPi.f); + const Vec3V tmp = V3Scale(a, recipTwoPi); + const Vec3V b = V3Round(tmp); + const Vec3V V1 = V3NegScaleSub(b, twoPi, a); + + // cos(V) ~= 1 - V^2 / 2! + V^4 / 4! - V^6 / 6! + V^8 / 8! - V^10 / 10! + V^12 / 12! - + // V^14 / 14! + V^16 / 16! - V^18 / 18! + V^20 / 20! - V^22 / 22! (for -PI <= V < PI) + const Vec3V V2 = V3Mul(V1, V1); + const Vec3V V4 = V3Mul(V2, V2); + const Vec3V V6 = V3Mul(V4, V2); + const Vec3V V8 = V3Mul(V4, V4); + const Vec3V V10 = V3Mul(V6, V4); + const Vec3V V12 = V3Mul(V6, V6); + const Vec3V V14 = V3Mul(V8, V6); + const Vec3V V16 = V3Mul(V8, V8); + const Vec3V V18 = V3Mul(V10, V8); + const Vec3V V20 = V3Mul(V10, V10); + const Vec3V V22 = V3Mul(V12, V10); + + const Vec4V cosCoefficients0 = V4LoadA(g_PXCosCoefficients0.f); + const Vec4V cosCoefficients1 = V4LoadA(g_PXCosCoefficients1.f); + const Vec4V cosCoefficients2 = V4LoadA(g_PXCosCoefficients2.f); + + const FloatV C1 = V4GetY(cosCoefficients0); + const FloatV C2 = V4GetZ(cosCoefficients0); + const FloatV C3 = V4GetW(cosCoefficients0); + const FloatV C4 = V4GetX(cosCoefficients1); + const FloatV C5 = V4GetY(cosCoefficients1); + const FloatV C6 = V4GetZ(cosCoefficients1); + const FloatV C7 = V4GetW(cosCoefficients1); + const FloatV C8 = V4GetX(cosCoefficients2); + const FloatV C9 = V4GetY(cosCoefficients2); + const FloatV C10 = V4GetZ(cosCoefficients2); + const FloatV C11 = V4GetW(cosCoefficients2); + + Vec3V Result; + Result = V3ScaleAdd(V2, C1, V3One()); + Result = V3ScaleAdd(V4, C2, Result); + Result = V3ScaleAdd(V6, C3, Result); + Result = V3ScaleAdd(V8, C4, Result); + Result = V3ScaleAdd(V10, C5, Result); + Result = V3ScaleAdd(V12, C6, Result); + Result = V3ScaleAdd(V14, C7, Result); + Result = V3ScaleAdd(V16, C8, Result); + Result = V3ScaleAdd(V18, C9, Result); + Result = V3ScaleAdd(V20, C10, Result); + Result = V3ScaleAdd(V22, C11, Result); + + ASSERT_ISVALIDVEC3V(Result); + return Result; +} + +PX_FORCE_INLINE Vec3V V3PermYZZ(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 2, 2, 1)); +} + +PX_FORCE_INLINE Vec3V V3PermXYX(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 1, 0)); +} + +PX_FORCE_INLINE Vec3V V3PermYZX(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1)); +} + +PX_FORCE_INLINE Vec3V V3PermZXY(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2)); +} + +PX_FORCE_INLINE Vec3V V3PermZZY(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 2, 2)); +} + +PX_FORCE_INLINE Vec3V V3PermYXX(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 0, 1)); +} + +PX_FORCE_INLINE Vec3V V3Perm_Zero_1Z_0Y(const Vec3V v0, const Vec3V v1) +{ + ASSERT_ISVALIDVEC3V(v0); + ASSERT_ISVALIDVEC3V(v1); + return _mm_shuffle_ps(v1, v0, _MM_SHUFFLE(3, 1, 2, 3)); +} + +PX_FORCE_INLINE Vec3V V3Perm_0Z_Zero_1X(const Vec3V v0, const Vec3V v1) +{ + ASSERT_ISVALIDVEC3V(v0); + ASSERT_ISVALIDVEC3V(v1); + return _mm_shuffle_ps(v0, v1, _MM_SHUFFLE(3, 0, 3, 2)); +} + +PX_FORCE_INLINE Vec3V V3Perm_1Y_0X_Zero(const Vec3V v0, const Vec3V v1) +{ + ASSERT_ISVALIDVEC3V(v0); + ASSERT_ISVALIDVEC3V(v1); + // There must be a better way to do this. + Vec3V v2 = V3Zero(); + FloatV y1 = V3GetY(v1); + FloatV x0 = V3GetX(v0); + v2 = V3SetX(v2, y1); + return V3SetY(v2, x0); +} + +PX_FORCE_INLINE FloatV V3SumElems(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); +#ifdef __SSE4_2__ + Vec3V r = _mm_hadd_ps(a, a); + r = _mm_hadd_ps(r, r); + return r; +#else + __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)); // z,y,x,w + __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)); // y,x,w,z + __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)); // x,w,z,y + return _mm_add_ps(_mm_add_ps(shuf1, shuf2), shuf3); +#endif +} + +PX_FORCE_INLINE PxU32 V3OutOfBounds(const Vec3V a, const Vec3V min, const Vec3V max) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(min); + ASSERT_ISVALIDVEC3V(max); + const BoolV c = BOr(V3IsGrtr(a, max), V3IsGrtr(min, a)); + return !BAllEqFFFF(c); +} + +PX_FORCE_INLINE PxU32 V3InBounds(const Vec3V a, const Vec3V min, const Vec3V max) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(min); + ASSERT_ISVALIDVEC3V(max); + const BoolV c = BAnd(V3IsGrtrOrEq(a, min), V3IsGrtrOrEq(max, a)); + return BAllEqTTTT(c); +} + +PX_FORCE_INLINE PxU32 V3OutOfBounds(const Vec3V a, const Vec3V bounds) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(bounds); + return V3OutOfBounds(a, V3Neg(bounds), bounds); +} + +PX_FORCE_INLINE PxU32 V3InBounds(const Vec3V a, const Vec3V bounds) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(bounds) + return V3InBounds(a, V3Neg(bounds), bounds); +} + +PX_FORCE_INLINE void V3Transpose(Vec3V& col0, Vec3V& col1, Vec3V& col2) +{ + ASSERT_ISVALIDVEC3V(col0); + ASSERT_ISVALIDVEC3V(col1); + ASSERT_ISVALIDVEC3V(col2); + + const Vec3V col3 = _mm_setzero_ps(); + Vec3V tmp0 = _mm_unpacklo_ps(col0, col1); + Vec3V tmp2 = _mm_unpacklo_ps(col2, col3); + Vec3V tmp1 = _mm_unpackhi_ps(col0, col1); + Vec3V tmp3 = _mm_unpackhi_ps(col2, col3); + col0 = _mm_movelh_ps(tmp0, tmp2); + col1 = _mm_movehl_ps(tmp2, tmp0); + col2 = _mm_movelh_ps(tmp1, tmp3); +} + +////////////////////////////////// +// VEC4V +////////////////////////////////// + +PX_FORCE_INLINE Vec4V V4Splat(const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + // return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0,0,0,0)); + return f; +} + +PX_FORCE_INLINE Vec4V V4Merge(const FloatV* const floatVArray) +{ + ASSERT_ISVALIDFLOATV(floatVArray[0]); + ASSERT_ISVALIDFLOATV(floatVArray[1]); + ASSERT_ISVALIDFLOATV(floatVArray[2]); + ASSERT_ISVALIDFLOATV(floatVArray[3]); + const __m128 xw = _mm_move_ss(floatVArray[1], floatVArray[0]); // y, y, y, x + const __m128 yz = _mm_move_ss(floatVArray[2], floatVArray[3]); // z, z, z, w + return _mm_shuffle_ps(xw, yz, _MM_SHUFFLE(0, 2, 1, 0)); +} + +PX_FORCE_INLINE Vec4V V4Merge(const FloatVArg x, const FloatVArg y, const FloatVArg z, const FloatVArg w) +{ + ASSERT_ISVALIDFLOATV(x); + ASSERT_ISVALIDFLOATV(y); + ASSERT_ISVALIDFLOATV(z); + ASSERT_ISVALIDFLOATV(w); + const __m128 xw = _mm_move_ss(y, x); // y, y, y, x + const __m128 yz = _mm_move_ss(z, w); // z, z, z, w + return _mm_shuffle_ps(xw, yz, _MM_SHUFFLE(0, 2, 1, 0)); +} + +PX_FORCE_INLINE Vec4V V4MergeW(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w) +{ + const Vec4V xz = _mm_unpackhi_ps(x, z); + const Vec4V yw = _mm_unpackhi_ps(y, w); + return _mm_unpackhi_ps(xz, yw); +} + +PX_FORCE_INLINE Vec4V V4MergeZ(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w) +{ + const Vec4V xz = _mm_unpackhi_ps(x, z); + const Vec4V yw = _mm_unpackhi_ps(y, w); + return _mm_unpacklo_ps(xz, yw); +} + +PX_FORCE_INLINE Vec4V V4MergeY(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w) +{ + const Vec4V xz = _mm_unpacklo_ps(x, z); + const Vec4V yw = _mm_unpacklo_ps(y, w); + return _mm_unpackhi_ps(xz, yw); +} + +PX_FORCE_INLINE Vec4V V4MergeX(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w) +{ + const Vec4V xz = _mm_unpacklo_ps(x, z); + const Vec4V yw = _mm_unpacklo_ps(y, w); + return _mm_unpacklo_ps(xz, yw); +} + +PX_FORCE_INLINE Vec4V V4UnpackXY(const Vec4VArg a, const Vec4VArg b) +{ + return _mm_unpacklo_ps(a, b); +} + +PX_FORCE_INLINE Vec4V V4UnpackZW(const Vec4VArg a, const Vec4VArg b) +{ + return _mm_unpackhi_ps(a, b); +} + +PX_FORCE_INLINE Vec4V V4UnitW() +{ + const PX_ALIGN(16, PxF32) w[4] = { 0.0f, 0.0f, 0.0f, 1.0f }; + const __m128 w128 = _mm_load_ps(w); + return w128; +} + +PX_FORCE_INLINE Vec4V V4UnitX() +{ + const PX_ALIGN(16, PxF32) x[4] = { 1.0f, 0.0f, 0.0f, 0.0f }; + const __m128 x128 = _mm_load_ps(x); + return x128; +} + +PX_FORCE_INLINE Vec4V V4UnitY() +{ + const PX_ALIGN(16, PxF32) y[4] = { 0.0f, 1.0f, 0.0f, 0.0f }; + const __m128 y128 = _mm_load_ps(y); + return y128; +} + +PX_FORCE_INLINE Vec4V V4UnitZ() +{ + const PX_ALIGN(16, PxF32) z[4] = { 0.0f, 0.0f, 1.0f, 0.0f }; + const __m128 z128 = _mm_load_ps(z); + return z128; +} + +PX_FORCE_INLINE FloatV V4GetW(const Vec4V f) +{ + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(3, 3, 3, 3)); +} + +PX_FORCE_INLINE FloatV V4GetX(const Vec4V f) +{ + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0, 0, 0, 0)); +} + +PX_FORCE_INLINE FloatV V4GetY(const Vec4V f) +{ + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(1, 1, 1, 1)); +} + +PX_FORCE_INLINE FloatV V4GetZ(const Vec4V f) +{ + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(2, 2, 2, 2)); +} + +PX_FORCE_INLINE Vec4V V4SetW(const Vec4V v, const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BTTTF(), v, f); +} + +PX_FORCE_INLINE Vec4V V4SetX(const Vec4V v, const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BFTTT(), v, f); +} + +PX_FORCE_INLINE Vec4V V4SetY(const Vec4V v, const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BTFTT(), v, f); +} + +PX_FORCE_INLINE Vec4V V4SetZ(const Vec4V v, const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BTTFT(), v, f); +} + +PX_FORCE_INLINE Vec4V V4ClearW(const Vec4V v) +{ +#if !PX_EMSCRIPTEN + return _mm_and_ps(v, V4LoadA(internalUnitSSE2Simd::gMaskXYZ)); +#else + return _mm_and_ps(v, (VecI32V&)internalUnitSSE2Simd::gMaskXYZ); +#endif +} + +PX_FORCE_INLINE Vec4V V4PermYXWZ(const Vec4V a) +{ + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 3, 0, 1)); +} + +PX_FORCE_INLINE Vec4V V4PermXZXZ(const Vec4V a) +{ + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 0, 2, 0)); +} + +PX_FORCE_INLINE Vec4V V4PermYWYW(const Vec4V a) +{ + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 3, 1)); +} + +PX_FORCE_INLINE Vec4V V4PermYZXW(const Vec4V a) +{ + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1)); +} + +PX_FORCE_INLINE Vec4V V4PermZWXY(const Vec4V a) +{ + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 0, 3, 2)); +} + +template +PX_FORCE_INLINE Vec4V V4Perm(const Vec4V a) +{ + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(w, z, y, x)); +} + +PX_FORCE_INLINE Vec4V V4Zero() +{ + return V4Load(0.0f); +} + +PX_FORCE_INLINE Vec4V V4One() +{ + return V4Load(1.0f); +} + +PX_FORCE_INLINE Vec4V V4Eps() +{ + return V4Load(PX_EPS_REAL); +} + +PX_FORCE_INLINE Vec4V V4Neg(const Vec4V f) +{ + return _mm_sub_ps(_mm_setzero_ps(), f); +} + +PX_FORCE_INLINE Vec4V V4Add(const Vec4V a, const Vec4V b) +{ + return _mm_add_ps(a, b); +} + +PX_FORCE_INLINE Vec4V V4Sub(const Vec4V a, const Vec4V b) +{ + return _mm_sub_ps(a, b); +} + +PX_FORCE_INLINE Vec4V V4Scale(const Vec4V a, const FloatV b) +{ + return _mm_mul_ps(a, b); +} + +PX_FORCE_INLINE Vec4V V4Mul(const Vec4V a, const Vec4V b) +{ + return _mm_mul_ps(a, b); +} + +PX_FORCE_INLINE Vec4V V4ScaleInv(const Vec4V a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(b); + return _mm_div_ps(a, b); +} + +PX_FORCE_INLINE Vec4V V4Div(const Vec4V a, const Vec4V b) +{ + return _mm_div_ps(a, b); +} + +PX_FORCE_INLINE Vec4V V4ScaleInvFast(const Vec4V a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(b); + return _mm_mul_ps(a, _mm_rcp_ps(b)); +} + +PX_FORCE_INLINE Vec4V V4DivFast(const Vec4V a, const Vec4V b) +{ + return _mm_mul_ps(a, _mm_rcp_ps(b)); +} + +PX_FORCE_INLINE Vec4V V4Recip(const Vec4V a) +{ + return _mm_div_ps(V4One(), a); +} + +PX_FORCE_INLINE Vec4V V4RecipFast(const Vec4V a) +{ + return _mm_rcp_ps(a); +} + +PX_FORCE_INLINE Vec4V V4Rsqrt(const Vec4V a) +{ + return _mm_div_ps(V4One(), _mm_sqrt_ps(a)); +} + +PX_FORCE_INLINE Vec4V V4RsqrtFast(const Vec4V a) +{ + return _mm_rsqrt_ps(a); +} + +PX_FORCE_INLINE Vec4V V4Sqrt(const Vec4V a) +{ + return _mm_sqrt_ps(a); +} + +PX_FORCE_INLINE Vec4V V4ScaleAdd(const Vec4V a, const FloatV b, const Vec4V c) +{ + ASSERT_ISVALIDFLOATV(b); + return V4Add(V4Scale(a, b), c); +} + +PX_FORCE_INLINE Vec4V V4NegScaleSub(const Vec4V a, const FloatV b, const Vec4V c) +{ + ASSERT_ISVALIDFLOATV(b); + return V4Sub(c, V4Scale(a, b)); +} + +PX_FORCE_INLINE Vec4V V4MulAdd(const Vec4V a, const Vec4V b, const Vec4V c) +{ + return V4Add(V4Mul(a, b), c); +} + +PX_FORCE_INLINE Vec4V V4NegMulSub(const Vec4V a, const Vec4V b, const Vec4V c) +{ + return V4Sub(c, V4Mul(a, b)); +} + +PX_FORCE_INLINE Vec4V V4Abs(const Vec4V a) +{ + return V4Max(a, V4Neg(a)); +} + +PX_FORCE_INLINE FloatV V4SumElements(const Vec4V a) +{ +#ifdef __SSE4_2__ + Vec4V r = _mm_hadd_ps(a, a); + r = _mm_hadd_ps(r, r); + return r; +#else + const Vec4V xy = V4UnpackXY(a, a); // x,x,y,y + const Vec4V zw = V4UnpackZW(a, a); // z,z,w,w + const Vec4V xz_yw = V4Add(xy, zw); // x+z,x+z,y+w,y+w + const FloatV xz = V4GetX(xz_yw); // x+z + const FloatV yw = V4GetZ(xz_yw); // y+w + return FAdd(xz, yw); // sum +#endif +} + +PX_FORCE_INLINE FloatV V4Dot(const Vec4V a, const Vec4V b) +{ +#ifdef __SSE4_2__ + return _mm_dp_ps(a, b, 0xff); +#else + //const __m128 dot1 = _mm_mul_ps(a, b); // x,y,z,w + //const __m128 shuf1 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(2, 1, 0, 3)); // w,x,y,z + //const __m128 shuf2 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(1, 0, 3, 2)); // z,w,x,y + //const __m128 shuf3 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(0, 3, 2, 1)); // y,z,w,x + //return _mm_add_ps(_mm_add_ps(shuf2, shuf3), _mm_add_ps(dot1, shuf1)); + + // aw*bw | az*bz | ay*by | ax*bx + const __m128 t0 = _mm_mul_ps(a, b); + // ay*by | ax*bx | aw*bw | az*bz + const __m128 t1 = _mm_shuffle_ps(t0, t0, _MM_SHUFFLE(1, 0, 3, 2)); + // ay*by + aw*bw | ax*bx + az*bz | aw*bw + ay*by | az*bz + ax*bx + const __m128 t2 = _mm_add_ps(t0, t1); + // ax*bx + az*bz | ay*by + aw*bw | az*bz + ax*bx | aw*bw + ay*by + const __m128 t3 = _mm_shuffle_ps(t2, t2, _MM_SHUFFLE(2, 3, 0, 1)); + // ax*bx + az*bz + ay*by + aw*bw + return _mm_add_ps(t3, t2); +#endif +} + +PX_FORCE_INLINE FloatV V4Dot3(const Vec4V a, const Vec4V b) +{ +#ifdef __SSE4_2__ + return _mm_dp_ps(a, b, 0x7f); +#else + const __m128 dot1 = _mm_mul_ps(a, b); // w,z,y,x + const __m128 shuf1 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(0, 0, 0, 0)); // z,y,x,w + const __m128 shuf2 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(1, 1, 1, 1)); // y,x,w,z + const __m128 shuf3 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(2, 2, 2, 2)); // x,w,z,y + return _mm_add_ps(_mm_add_ps(shuf1, shuf2), shuf3); +#endif +} + +PX_FORCE_INLINE Vec4V V4Cross(const Vec4V a, const Vec4V b) +{ + const __m128 r1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2)); // z,x,y,w + const __m128 r2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 0, 2, 1)); // y,z,x,w + const __m128 l1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1)); // y,z,x,w + const __m128 l2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 1, 0, 2)); // z,x,y,w + return _mm_sub_ps(_mm_mul_ps(l1, l2), _mm_mul_ps(r1, r2)); +} + +PX_FORCE_INLINE FloatV V4Length(const Vec4V a) +{ + return _mm_sqrt_ps(V4Dot(a, a)); +} + +PX_FORCE_INLINE FloatV V4LengthSq(const Vec4V a) +{ + return V4Dot(a, a); +} + +PX_FORCE_INLINE Vec4V V4Normalize(const Vec4V a) +{ + ASSERT_ISFINITELENGTH(a); + return V4ScaleInv(a, _mm_sqrt_ps(V4Dot(a, a))); +} + +PX_FORCE_INLINE Vec4V V4NormalizeFast(const Vec4V a) +{ + ASSERT_ISFINITELENGTH(a); + return V4ScaleInvFast(a, _mm_sqrt_ps(V4Dot(a, a))); +} + +PX_FORCE_INLINE Vec4V V4NormalizeSafe(const Vec4V a, const Vec3V unsafeReturnValue) +{ + const __m128 eps = V3Eps(); + const __m128 length = V4Length(a); + const __m128 isGreaterThanZero = V4IsGrtr(length, eps); + return V4Sel(isGreaterThanZero, V4ScaleInv(a, length), unsafeReturnValue); +} + +PX_FORCE_INLINE BoolV V4IsEqU32(const VecU32V a, const VecU32V b) +{ + return m128_I2F(_mm_cmpeq_epi32(m128_F2I(a), m128_F2I(b))); +} + +PX_FORCE_INLINE Vec4V V4Sel(const BoolV c, const Vec4V a, const Vec4V b) +{ + return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a)); +} + +PX_FORCE_INLINE BoolV V4IsGrtr(const Vec4V a, const Vec4V b) +{ + return _mm_cmpgt_ps(a, b); +} + +PX_FORCE_INLINE BoolV V4IsGrtrOrEq(const Vec4V a, const Vec4V b) +{ + return _mm_cmpge_ps(a, b); +} + +PX_FORCE_INLINE BoolV V4IsEq(const Vec4V a, const Vec4V b) +{ + return _mm_cmpeq_ps(a, b); +} + +PX_FORCE_INLINE Vec4V V4Max(const Vec4V a, const Vec4V b) +{ + return _mm_max_ps(a, b); +} + +PX_FORCE_INLINE Vec4V V4Min(const Vec4V a, const Vec4V b) +{ + return _mm_min_ps(a, b); +} + +PX_FORCE_INLINE FloatV V4ExtractMax(const Vec4V a) +{ + const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 1, 0, 3)); + const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 0, 3, 2)); + const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 3, 2, 1)); + + return _mm_max_ps(_mm_max_ps(a, shuf1), _mm_max_ps(shuf2, shuf3)); +} + +PX_FORCE_INLINE FloatV V4ExtractMin(const Vec4V a) +{ + const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 1, 0, 3)); + const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 0, 3, 2)); + const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 3, 2, 1)); + + return _mm_min_ps(_mm_min_ps(a, shuf1), _mm_min_ps(shuf2, shuf3)); +} + +PX_FORCE_INLINE Vec4V V4Clamp(const Vec4V a, const Vec4V minV, const Vec4V maxV) +{ + return V4Max(V4Min(a, maxV), minV); +} + +PX_FORCE_INLINE PxU32 V4AllGrtr(const Vec4V a, const Vec4V b) +{ + return internalUnitSSE2Simd::BAllTrue4_R(V4IsGrtr(a, b)); +} + +PX_FORCE_INLINE PxU32 V4AllGrtrOrEq(const Vec4V a, const Vec4V b) +{ + return internalUnitSSE2Simd::BAllTrue4_R(V4IsGrtrOrEq(a, b)); +} + +PX_FORCE_INLINE PxU32 V4AllGrtrOrEq3(const Vec4V a, const Vec4V b) +{ + return internalUnitSSE2Simd::BAllTrue3_R(V4IsGrtrOrEq(a, b)); +} + +PX_FORCE_INLINE PxU32 V4AllEq(const Vec4V a, const Vec4V b) +{ + return internalUnitSSE2Simd::BAllTrue4_R(V4IsEq(a, b)); +} + +PX_FORCE_INLINE PxU32 V4AnyGrtr3(const Vec4V a, const Vec4V b) +{ + return internalUnitSSE2Simd::BAnyTrue3_R(V4IsGrtr(a, b)); +} + +PX_FORCE_INLINE Vec4V V4Round(const Vec4V a) +{ +#ifdef __SSE4_2__ + return _mm_round_ps(a, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); +#else + // return _mm_round_ps(a, 0x0); + const Vec4V half = V4Load(0.5f); + const __m128 signBit = _mm_cvtepi32_ps(_mm_srli_epi32(_mm_cvtps_epi32(a), 31)); + const Vec4V aRound = V4Sub(V4Add(a, half), signBit); + __m128i tmp = _mm_cvttps_epi32(aRound); + return _mm_cvtepi32_ps(tmp); +#endif +} + +PX_FORCE_INLINE Vec4V V4Sin(const Vec4V a) +{ + const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f); + const Vec4V twoPi = V4LoadA(g_PXTwoPi.f); + const Vec4V tmp = V4Mul(a, recipTwoPi); + const Vec4V b = V4Round(tmp); + const Vec4V V1 = V4NegMulSub(twoPi, b, a); + + // sin(V) ~= V - V^3 / 3! + V^5 / 5! - V^7 / 7! + V^9 / 9! - V^11 / 11! + V^13 / 13! - + // V^15 / 15! + V^17 / 17! - V^19 / 19! + V^21 / 21! - V^23 / 23! (for -PI <= V < PI) + const Vec4V V2 = V4Mul(V1, V1); + const Vec4V V3 = V4Mul(V2, V1); + const Vec4V V5 = V4Mul(V3, V2); + const Vec4V V7 = V4Mul(V5, V2); + const Vec4V V9 = V4Mul(V7, V2); + const Vec4V V11 = V4Mul(V9, V2); + const Vec4V V13 = V4Mul(V11, V2); + const Vec4V V15 = V4Mul(V13, V2); + const Vec4V V17 = V4Mul(V15, V2); + const Vec4V V19 = V4Mul(V17, V2); + const Vec4V V21 = V4Mul(V19, V2); + const Vec4V V23 = V4Mul(V21, V2); + + const Vec4V sinCoefficients0 = V4LoadA(g_PXSinCoefficients0.f); + const Vec4V sinCoefficients1 = V4LoadA(g_PXSinCoefficients1.f); + const Vec4V sinCoefficients2 = V4LoadA(g_PXSinCoefficients2.f); + + const FloatV S1 = V4GetY(sinCoefficients0); + const FloatV S2 = V4GetZ(sinCoefficients0); + const FloatV S3 = V4GetW(sinCoefficients0); + const FloatV S4 = V4GetX(sinCoefficients1); + const FloatV S5 = V4GetY(sinCoefficients1); + const FloatV S6 = V4GetZ(sinCoefficients1); + const FloatV S7 = V4GetW(sinCoefficients1); + const FloatV S8 = V4GetX(sinCoefficients2); + const FloatV S9 = V4GetY(sinCoefficients2); + const FloatV S10 = V4GetZ(sinCoefficients2); + const FloatV S11 = V4GetW(sinCoefficients2); + + Vec4V Result; + Result = V4MulAdd(S1, V3, V1); + Result = V4MulAdd(S2, V5, Result); + Result = V4MulAdd(S3, V7, Result); + Result = V4MulAdd(S4, V9, Result); + Result = V4MulAdd(S5, V11, Result); + Result = V4MulAdd(S6, V13, Result); + Result = V4MulAdd(S7, V15, Result); + Result = V4MulAdd(S8, V17, Result); + Result = V4MulAdd(S9, V19, Result); + Result = V4MulAdd(S10, V21, Result); + Result = V4MulAdd(S11, V23, Result); + + return Result; +} + +PX_FORCE_INLINE Vec4V V4Cos(const Vec4V a) +{ + const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f); + const Vec4V twoPi = V4LoadA(g_PXTwoPi.f); + const Vec4V tmp = V4Mul(a, recipTwoPi); + const Vec4V b = V4Round(tmp); + const Vec4V V1 = V4NegMulSub(twoPi, b, a); + + // cos(V) ~= 1 - V^2 / 2! + V^4 / 4! - V^6 / 6! + V^8 / 8! - V^10 / 10! + V^12 / 12! - + // V^14 / 14! + V^16 / 16! - V^18 / 18! + V^20 / 20! - V^22 / 22! (for -PI <= V < PI) + const Vec4V V2 = V4Mul(V1, V1); + const Vec4V V4 = V4Mul(V2, V2); + const Vec4V V6 = V4Mul(V4, V2); + const Vec4V V8 = V4Mul(V4, V4); + const Vec4V V10 = V4Mul(V6, V4); + const Vec4V V12 = V4Mul(V6, V6); + const Vec4V V14 = V4Mul(V8, V6); + const Vec4V V16 = V4Mul(V8, V8); + const Vec4V V18 = V4Mul(V10, V8); + const Vec4V V20 = V4Mul(V10, V10); + const Vec4V V22 = V4Mul(V12, V10); + + const Vec4V cosCoefficients0 = V4LoadA(g_PXCosCoefficients0.f); + const Vec4V cosCoefficients1 = V4LoadA(g_PXCosCoefficients1.f); + const Vec4V cosCoefficients2 = V4LoadA(g_PXCosCoefficients2.f); + + const FloatV C1 = V4GetY(cosCoefficients0); + const FloatV C2 = V4GetZ(cosCoefficients0); + const FloatV C3 = V4GetW(cosCoefficients0); + const FloatV C4 = V4GetX(cosCoefficients1); + const FloatV C5 = V4GetY(cosCoefficients1); + const FloatV C6 = V4GetZ(cosCoefficients1); + const FloatV C7 = V4GetW(cosCoefficients1); + const FloatV C8 = V4GetX(cosCoefficients2); + const FloatV C9 = V4GetY(cosCoefficients2); + const FloatV C10 = V4GetZ(cosCoefficients2); + const FloatV C11 = V4GetW(cosCoefficients2); + + Vec4V Result; + Result = V4MulAdd(C1, V2, V4One()); + Result = V4MulAdd(C2, V4, Result); + Result = V4MulAdd(C3, V6, Result); + Result = V4MulAdd(C4, V8, Result); + Result = V4MulAdd(C5, V10, Result); + Result = V4MulAdd(C6, V12, Result); + Result = V4MulAdd(C7, V14, Result); + Result = V4MulAdd(C8, V16, Result); + Result = V4MulAdd(C9, V18, Result); + Result = V4MulAdd(C10, V20, Result); + Result = V4MulAdd(C11, V22, Result); + + return Result; +} + +PX_FORCE_INLINE void V4Transpose(Vec4V& col0, Vec4V& col1, Vec4V& col2, Vec4V& col3) +{ + Vec4V tmp0 = _mm_unpacklo_ps(col0, col1); + Vec4V tmp2 = _mm_unpacklo_ps(col2, col3); + Vec4V tmp1 = _mm_unpackhi_ps(col0, col1); + Vec4V tmp3 = _mm_unpackhi_ps(col2, col3); + col0 = _mm_movelh_ps(tmp0, tmp2); + col1 = _mm_movehl_ps(tmp2, tmp0); + col2 = _mm_movelh_ps(tmp1, tmp3); + col3 = _mm_movehl_ps(tmp3, tmp1); +} + +////////////////////////////////// +// BoolV +////////////////////////////////// + +PX_FORCE_INLINE BoolV BFFFF() +{ + return _mm_setzero_ps(); +} + +PX_FORCE_INLINE BoolV BFFFT() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0,0,0xFFFFFFFF}; + const __m128 ffft=_mm_load_ps((float*)&f); + return ffft;*/ + return m128_I2F(_mm_set_epi32(-1, 0, 0, 0)); +} + +PX_FORCE_INLINE BoolV BFFTF() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0,0xFFFFFFFF,0}; + const __m128 fftf=_mm_load_ps((float*)&f); + return fftf;*/ + return m128_I2F(_mm_set_epi32(0, -1, 0, 0)); +} + +PX_FORCE_INLINE BoolV BFFTT() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0,0xFFFFFFFF,0xFFFFFFFF}; + const __m128 fftt=_mm_load_ps((float*)&f); + return fftt;*/ + return m128_I2F(_mm_set_epi32(-1, -1, 0, 0)); +} + +PX_FORCE_INLINE BoolV BFTFF() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0xFFFFFFFF,0,0}; + const __m128 ftff=_mm_load_ps((float*)&f); + return ftff;*/ + return m128_I2F(_mm_set_epi32(0, 0, -1, 0)); +} + +PX_FORCE_INLINE BoolV BFTFT() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0xFFFFFFFF,0,0xFFFFFFFF}; + const __m128 ftft=_mm_load_ps((float*)&f); + return ftft;*/ + return m128_I2F(_mm_set_epi32(-1, 0, -1, 0)); +} + +PX_FORCE_INLINE BoolV BFTTF() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0xFFFFFFFF,0xFFFFFFFF,0}; + const __m128 fttf=_mm_load_ps((float*)&f); + return fttf;*/ + return m128_I2F(_mm_set_epi32(0, -1, -1, 0)); +} + +PX_FORCE_INLINE BoolV BFTTT() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}; + const __m128 fttt=_mm_load_ps((float*)&f); + return fttt;*/ + return m128_I2F(_mm_set_epi32(-1, -1, -1, 0)); +} + +PX_FORCE_INLINE BoolV BTFFF() +{ + // const PX_ALIGN(16, PxU32 f[4])={0xFFFFFFFF,0,0,0}; + // const __m128 tfff=_mm_load_ps((float*)&f); + // return tfff; + return m128_I2F(_mm_set_epi32(0, 0, 0, -1)); +} + +PX_FORCE_INLINE BoolV BTFFT() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0xFFFFFFFF,0,0,0xFFFFFFFF}; + const __m128 tfft=_mm_load_ps((float*)&f); + return tfft;*/ + return m128_I2F(_mm_set_epi32(-1, 0, 0, -1)); +} + +PX_FORCE_INLINE BoolV BTFTF() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0xFFFFFFFF,0,0xFFFFFFFF,0}; + const __m128 tftf=_mm_load_ps((float*)&f); + return tftf;*/ + return m128_I2F(_mm_set_epi32(0, -1, 0, -1)); +} + +PX_FORCE_INLINE BoolV BTFTT() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0xFFFFFFFF,0,0xFFFFFFFF,0xFFFFFFFF}; + const __m128 tftt=_mm_load_ps((float*)&f); + return tftt;*/ + return m128_I2F(_mm_set_epi32(-1, -1, 0, -1)); +} + +PX_FORCE_INLINE BoolV BTTFF() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0xFFFFFFFF,0xFFFFFFFF,0,0}; + const __m128 ttff=_mm_load_ps((float*)&f); + return ttff;*/ + return m128_I2F(_mm_set_epi32(0, 0, -1, -1)); +} + +PX_FORCE_INLINE BoolV BTTFT() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0xFFFFFFFF,0xFFFFFFFF,0,0xFFFFFFFF}; + const __m128 ttft=_mm_load_ps((float*)&f); + return ttft;*/ + return m128_I2F(_mm_set_epi32(-1, 0, -1, -1)); +} + +PX_FORCE_INLINE BoolV BTTTF() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0}; + const __m128 tttf=_mm_load_ps((float*)&f); + return tttf;*/ + return m128_I2F(_mm_set_epi32(0, -1, -1, -1)); +} + +PX_FORCE_INLINE BoolV BTTTT() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}; + const __m128 tttt=_mm_load_ps((float*)&f); + return tttt;*/ + return m128_I2F(_mm_set_epi32(-1, -1, -1, -1)); +} + +PX_FORCE_INLINE BoolV BXMask() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0xFFFFFFFF,0,0,0}; + const __m128 tfff=_mm_load_ps((float*)&f); + return tfff;*/ + return m128_I2F(_mm_set_epi32(0, 0, 0, -1)); +} + +PX_FORCE_INLINE BoolV BYMask() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0xFFFFFFFF,0,0}; + const __m128 ftff=_mm_load_ps((float*)&f); + return ftff;*/ + return m128_I2F(_mm_set_epi32(0, 0, -1, 0)); +} + +PX_FORCE_INLINE BoolV BZMask() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0,0xFFFFFFFF,0}; + const __m128 fftf=_mm_load_ps((float*)&f); + return fftf;*/ + return m128_I2F(_mm_set_epi32(0, -1, 0, 0)); +} + +PX_FORCE_INLINE BoolV BWMask() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0,0,0xFFFFFFFF}; + const __m128 ffft=_mm_load_ps((float*)&f); + return ffft;*/ + return m128_I2F(_mm_set_epi32(-1, 0, 0, 0)); +} + +PX_FORCE_INLINE BoolV BGetX(const BoolV f) +{ + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0, 0, 0, 0)); +} + +PX_FORCE_INLINE BoolV BGetY(const BoolV f) +{ + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(1, 1, 1, 1)); +} + +PX_FORCE_INLINE BoolV BGetZ(const BoolV f) +{ + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(2, 2, 2, 2)); +} + +PX_FORCE_INLINE BoolV BGetW(const BoolV f) +{ + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(3, 3, 3, 3)); +} + +PX_FORCE_INLINE BoolV BSetX(const BoolV v, const BoolV f) +{ + return V4Sel(BFTTT(), v, f); +} + +PX_FORCE_INLINE BoolV BSetY(const BoolV v, const BoolV f) +{ + return V4Sel(BTFTT(), v, f); +} + +PX_FORCE_INLINE BoolV BSetZ(const BoolV v, const BoolV f) +{ + return V4Sel(BTTFT(), v, f); +} + +PX_FORCE_INLINE BoolV BSetW(const BoolV v, const BoolV f) +{ + return V4Sel(BTTTF(), v, f); +} + +PX_FORCE_INLINE BoolV BAnd(const BoolV a, const BoolV b) +{ + return _mm_and_ps(a, b); +} + +PX_FORCE_INLINE BoolV BNot(const BoolV a) +{ + const BoolV bAllTrue(BTTTT()); + return _mm_xor_ps(a, bAllTrue); +} + +PX_FORCE_INLINE BoolV BAndNot(const BoolV a, const BoolV b) +{ + return _mm_andnot_ps(b, a); +} + +PX_FORCE_INLINE BoolV BOr(const BoolV a, const BoolV b) +{ + return _mm_or_ps(a, b); +} + +PX_FORCE_INLINE BoolV BAllTrue4(const BoolV a) +{ + const BoolV bTmp = + _mm_and_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)), _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 3, 2, 3))); + return _mm_and_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)), + _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1))); +} + +PX_FORCE_INLINE BoolV BAnyTrue4(const BoolV a) +{ + const BoolV bTmp = + _mm_or_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)), _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 3, 2, 3))); + return _mm_or_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)), + _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1))); +} + +PX_FORCE_INLINE BoolV BAllTrue3(const BoolV a) +{ + const BoolV bTmp = + _mm_and_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)), _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2))); + return _mm_and_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)), + _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1))); +} + +PX_FORCE_INLINE BoolV BAnyTrue3(const BoolV a) +{ + const BoolV bTmp = + _mm_or_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)), _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2))); + return _mm_or_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)), + _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1))); +} + +PX_FORCE_INLINE PxU32 BAllEq(const BoolV a, const BoolV b) +{ + const BoolV bTest = m128_I2F(_mm_cmpeq_epi32(m128_F2I(a), m128_F2I(b))); + return internalUnitSSE2Simd::BAllTrue4_R(bTest); +} + +PX_FORCE_INLINE PxU32 BAllEqTTTT(const BoolV a) +{ + return PxU32(_mm_movemask_ps(a)==15); +} + +PX_FORCE_INLINE PxU32 BAllEqFFFF(const BoolV a) +{ + return PxU32(_mm_movemask_ps(a)==0); +} + +PX_FORCE_INLINE PxU32 BGetBitMask(const BoolV a) +{ + return PxU32(_mm_movemask_ps(a)); +} + +////////////////////////////////// +// MAT33V +////////////////////////////////// + +PX_FORCE_INLINE Vec3V M33MulV3(const Mat33V& a, const Vec3V b) +{ + const FloatV x = V3GetX(b); + const FloatV y = V3GetY(b); + const FloatV z = V3GetZ(b); + const Vec3V v0 = V3Scale(a.col0, x); + const Vec3V v1 = V3Scale(a.col1, y); + const Vec3V v2 = V3Scale(a.col2, z); + const Vec3V v0PlusV1 = V3Add(v0, v1); + return V3Add(v0PlusV1, v2); +} + +PX_FORCE_INLINE Vec3V M33TrnspsMulV3(const Mat33V& a, const Vec3V b) +{ + const FloatV x = V3Dot(a.col0, b); + const FloatV y = V3Dot(a.col1, b); + const FloatV z = V3Dot(a.col2, b); + return V3Merge(x, y, z); +} + +PX_FORCE_INLINE Vec3V M33MulV3AddV3(const Mat33V& A, const Vec3V b, const Vec3V c) +{ + const FloatV x = V3GetX(b); + const FloatV y = V3GetY(b); + const FloatV z = V3GetZ(b); + Vec3V result = V3ScaleAdd(A.col0, x, c); + result = V3ScaleAdd(A.col1, y, result); + return V3ScaleAdd(A.col2, z, result); +} + +PX_FORCE_INLINE Mat33V M33MulM33(const Mat33V& a, const Mat33V& b) +{ + return Mat33V(M33MulV3(a, b.col0), M33MulV3(a, b.col1), M33MulV3(a, b.col2)); +} + +PX_FORCE_INLINE Mat33V M33Add(const Mat33V& a, const Mat33V& b) +{ + return Mat33V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2)); +} + +PX_FORCE_INLINE Mat33V M33Scale(const Mat33V& a, const FloatV& b) +{ + return Mat33V(V3Scale(a.col0, b), V3Scale(a.col1, b), V3Scale(a.col2, b)); +} + +PX_FORCE_INLINE Mat33V M33Inverse(const Mat33V& a) +{ + const BoolV tfft = BTFFT(); + const BoolV tttf = BTTTF(); + const FloatV zero = FZero(); + const Vec3V cross01 = V3Cross(a.col0, a.col1); + const Vec3V cross12 = V3Cross(a.col1, a.col2); + const Vec3V cross20 = V3Cross(a.col2, a.col0); + const FloatV dot = V3Dot(cross01, a.col2); + const FloatV invDet = _mm_rcp_ps(dot); + const Vec3V mergeh = _mm_unpacklo_ps(cross12, cross01); + const Vec3V mergel = _mm_unpackhi_ps(cross12, cross01); + Vec3V colInv0 = _mm_unpacklo_ps(mergeh, cross20); + colInv0 = _mm_or_ps(_mm_andnot_ps(tttf, zero), _mm_and_ps(tttf, colInv0)); + const Vec3V zppd = _mm_shuffle_ps(mergeh, cross20, _MM_SHUFFLE(3, 0, 0, 2)); + const Vec3V pbwp = _mm_shuffle_ps(cross20, mergeh, _MM_SHUFFLE(3, 3, 1, 0)); + const Vec3V colInv1 = _mm_or_ps(_mm_andnot_ps(BTFFT(), pbwp), _mm_and_ps(BTFFT(), zppd)); + const Vec3V xppd = _mm_shuffle_ps(mergel, cross20, _MM_SHUFFLE(3, 0, 0, 0)); + const Vec3V pcyp = _mm_shuffle_ps(cross20, mergel, _MM_SHUFFLE(3, 1, 2, 0)); + const Vec3V colInv2 = _mm_or_ps(_mm_andnot_ps(tfft, pcyp), _mm_and_ps(tfft, xppd)); + + return Mat33V(_mm_mul_ps(colInv0, invDet), _mm_mul_ps(colInv1, invDet), _mm_mul_ps(colInv2, invDet)); +} + +PX_FORCE_INLINE Mat33V M33Trnsps(const Mat33V& a) +{ + return Mat33V(V3Merge(V3GetX(a.col0), V3GetX(a.col1), V3GetX(a.col2)), + V3Merge(V3GetY(a.col0), V3GetY(a.col1), V3GetY(a.col2)), + V3Merge(V3GetZ(a.col0), V3GetZ(a.col1), V3GetZ(a.col2))); +} + +PX_FORCE_INLINE Mat33V M33Identity() +{ + return Mat33V(V3UnitX(), V3UnitY(), V3UnitZ()); +} + +PX_FORCE_INLINE Mat33V M33Sub(const Mat33V& a, const Mat33V& b) +{ + return Mat33V(V3Sub(a.col0, b.col0), V3Sub(a.col1, b.col1), V3Sub(a.col2, b.col2)); +} + +PX_FORCE_INLINE Mat33V M33Neg(const Mat33V& a) +{ + return Mat33V(V3Neg(a.col0), V3Neg(a.col1), V3Neg(a.col2)); +} + +PX_FORCE_INLINE Mat33V M33Abs(const Mat33V& a) +{ + return Mat33V(V3Abs(a.col0), V3Abs(a.col1), V3Abs(a.col2)); +} + +PX_FORCE_INLINE Mat33V PromoteVec3V(const Vec3V v) +{ + const BoolV bTFFF = BTFFF(); + const BoolV bFTFF = BFTFF(); + const BoolV bFFTF = BTFTF(); + + const Vec3V zero = V3Zero(); + + return Mat33V(V3Sel(bTFFF, v, zero), V3Sel(bFTFF, v, zero), V3Sel(bFFTF, v, zero)); +} + +PX_FORCE_INLINE Mat33V M33Diagonal(const Vec3VArg d) +{ + const FloatV x = V3Mul(V3UnitX(), d); + const FloatV y = V3Mul(V3UnitY(), d); + const FloatV z = V3Mul(V3UnitZ(), d); + return Mat33V(x, y, z); +} + +////////////////////////////////// +// MAT34V +////////////////////////////////// + +PX_FORCE_INLINE Vec3V M34MulV3(const Mat34V& a, const Vec3V b) +{ + const FloatV x = V3GetX(b); + const FloatV y = V3GetY(b); + const FloatV z = V3GetZ(b); + const Vec3V v0 = V3Scale(a.col0, x); + const Vec3V v1 = V3Scale(a.col1, y); + const Vec3V v2 = V3Scale(a.col2, z); + const Vec3V v0PlusV1 = V3Add(v0, v1); + const Vec3V v0PlusV1Plusv2 = V3Add(v0PlusV1, v2); + return V3Add(v0PlusV1Plusv2, a.col3); +} + +PX_FORCE_INLINE Vec3V M34Mul33V3(const Mat34V& a, const Vec3V b) +{ + const FloatV x = V3GetX(b); + const FloatV y = V3GetY(b); + const FloatV z = V3GetZ(b); + const Vec3V v0 = V3Scale(a.col0, x); + const Vec3V v1 = V3Scale(a.col1, y); + const Vec3V v2 = V3Scale(a.col2, z); + const Vec3V v0PlusV1 = V3Add(v0, v1); + return V3Add(v0PlusV1, v2); +} + +PX_FORCE_INLINE Vec3V M34TrnspsMul33V3(const Mat34V& a, const Vec3V b) +{ + const FloatV x = V3Dot(a.col0, b); + const FloatV y = V3Dot(a.col1, b); + const FloatV z = V3Dot(a.col2, b); + return V3Merge(x, y, z); +} + +PX_FORCE_INLINE Mat34V M34MulM34(const Mat34V& a, const Mat34V& b) +{ + return Mat34V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2), M34MulV3(a, b.col3)); +} + +PX_FORCE_INLINE Mat33V M34MulM33(const Mat34V& a, const Mat33V& b) +{ + return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2)); +} + +PX_FORCE_INLINE Mat33V M34Mul33MM34(const Mat34V& a, const Mat34V& b) +{ + return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2)); +} + +PX_FORCE_INLINE Mat34V M34Add(const Mat34V& a, const Mat34V& b) +{ + return Mat34V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2), V3Add(a.col3, b.col3)); +} + +PX_FORCE_INLINE Mat33V M34Trnsps33(const Mat34V& a) +{ + return Mat33V(V3Merge(V3GetX(a.col0), V3GetX(a.col1), V3GetX(a.col2)), + V3Merge(V3GetY(a.col0), V3GetY(a.col1), V3GetY(a.col2)), + V3Merge(V3GetZ(a.col0), V3GetZ(a.col1), V3GetZ(a.col2))); +} + +////////////////////////////////// +// MAT44V +////////////////////////////////// + +PX_FORCE_INLINE Vec4V M44MulV4(const Mat44V& a, const Vec4V b) +{ + const FloatV x = V4GetX(b); + const FloatV y = V4GetY(b); + const FloatV z = V4GetZ(b); + const FloatV w = V4GetW(b); + + const Vec4V v0 = V4Scale(a.col0, x); + const Vec4V v1 = V4Scale(a.col1, y); + const Vec4V v2 = V4Scale(a.col2, z); + const Vec4V v3 = V4Scale(a.col3, w); + const Vec4V v0PlusV1 = V4Add(v0, v1); + const Vec4V v0PlusV1Plusv2 = V4Add(v0PlusV1, v2); + return V4Add(v0PlusV1Plusv2, v3); +} + +PX_FORCE_INLINE Vec4V M44TrnspsMulV4(const Mat44V& a, const Vec4V b) +{ + PX_ALIGN(16, FloatV) dotProdArray[4] = { V4Dot(a.col0, b), V4Dot(a.col1, b), V4Dot(a.col2, b), V4Dot(a.col3, b) }; + return V4Merge(dotProdArray); +} + +PX_FORCE_INLINE Mat44V M44MulM44(const Mat44V& a, const Mat44V& b) +{ + return Mat44V(M44MulV4(a, b.col0), M44MulV4(a, b.col1), M44MulV4(a, b.col2), M44MulV4(a, b.col3)); +} + +PX_FORCE_INLINE Mat44V M44Add(const Mat44V& a, const Mat44V& b) +{ + return Mat44V(V4Add(a.col0, b.col0), V4Add(a.col1, b.col1), V4Add(a.col2, b.col2), V4Add(a.col3, b.col3)); +} + +PX_FORCE_INLINE Mat44V M44Trnsps(const Mat44V& a) +{ + const Vec4V v0 = _mm_unpacklo_ps(a.col0, a.col2); + const Vec4V v1 = _mm_unpackhi_ps(a.col0, a.col2); + const Vec4V v2 = _mm_unpacklo_ps(a.col1, a.col3); + const Vec4V v3 = _mm_unpackhi_ps(a.col1, a.col3); + return Mat44V(_mm_unpacklo_ps(v0, v2), _mm_unpackhi_ps(v0, v2), _mm_unpacklo_ps(v1, v3), _mm_unpackhi_ps(v1, v3)); +} + +PX_FORCE_INLINE Mat44V M44Inverse(const Mat44V& a) +{ + __m128 minor0, minor1, minor2, minor3; + __m128 row0, row1, row2, row3; + __m128 det, tmp1; + + tmp1 = V4Zero(); + row1 = V4Zero(); + row3 = V4Zero(); + + row0 = a.col0; + row1 = _mm_shuffle_ps(a.col1, a.col1, _MM_SHUFFLE(1, 0, 3, 2)); + row2 = a.col2; + row3 = _mm_shuffle_ps(a.col3, a.col3, _MM_SHUFFLE(1, 0, 3, 2)); + + tmp1 = _mm_mul_ps(row2, row3); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1); + minor0 = _mm_mul_ps(row1, tmp1); + minor1 = _mm_mul_ps(row0, tmp1); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E); + minor0 = _mm_sub_ps(_mm_mul_ps(row1, tmp1), minor0); + minor1 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor1); + minor1 = _mm_shuffle_ps(minor1, minor1, 0x4E); + + tmp1 = _mm_mul_ps(row1, row2); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1); + minor0 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor0); + minor3 = _mm_mul_ps(row0, tmp1); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E); + minor0 = _mm_sub_ps(minor0, _mm_mul_ps(row3, tmp1)); + minor3 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor3); + minor3 = _mm_shuffle_ps(minor3, minor3, 0x4E); + + tmp1 = _mm_mul_ps(_mm_shuffle_ps(row1, row1, 0x4E), row3); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1); + row2 = _mm_shuffle_ps(row2, row2, 0x4E); + minor0 = _mm_add_ps(_mm_mul_ps(row2, tmp1), minor0); + minor2 = _mm_mul_ps(row0, tmp1); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E); + minor0 = _mm_sub_ps(minor0, _mm_mul_ps(row2, tmp1)); + minor2 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor2); + minor2 = _mm_shuffle_ps(minor2, minor2, 0x4E); + + tmp1 = _mm_mul_ps(row0, row1); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1); + minor2 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor2); + minor3 = _mm_sub_ps(_mm_mul_ps(row2, tmp1), minor3); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E); + minor2 = _mm_sub_ps(_mm_mul_ps(row3, tmp1), minor2); + minor3 = _mm_sub_ps(minor3, _mm_mul_ps(row2, tmp1)); + + tmp1 = _mm_mul_ps(row0, row3); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1); + minor1 = _mm_sub_ps(minor1, _mm_mul_ps(row2, tmp1)); + minor2 = _mm_add_ps(_mm_mul_ps(row1, tmp1), minor2); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E); + minor1 = _mm_add_ps(_mm_mul_ps(row2, tmp1), minor1); + minor2 = _mm_sub_ps(minor2, _mm_mul_ps(row1, tmp1)); + + tmp1 = _mm_mul_ps(row0, row2); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1); + minor1 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor1); + minor3 = _mm_sub_ps(minor3, _mm_mul_ps(row1, tmp1)); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E); + minor1 = _mm_sub_ps(minor1, _mm_mul_ps(row3, tmp1)); + minor3 = _mm_add_ps(_mm_mul_ps(row1, tmp1), minor3); + + det = _mm_mul_ps(row0, minor0); + det = _mm_add_ps(_mm_shuffle_ps(det, det, 0x4E), det); + det = _mm_add_ss(_mm_shuffle_ps(det, det, 0xB1), det); + tmp1 = _mm_rcp_ss(det); +#if 0 + det = _mm_sub_ss(_mm_add_ss(tmp1, tmp1), _mm_mul_ss(det, _mm_mul_ss(tmp1, tmp1))); + det = _mm_shuffle_ps(det, det, 0x00); +#else + det = _mm_shuffle_ps(tmp1, tmp1, _MM_SHUFFLE(0, 0, 0, 0)); +#endif + + minor0 = _mm_mul_ps(det, minor0); + minor1 = _mm_mul_ps(det, minor1); + minor2 = _mm_mul_ps(det, minor2); + minor3 = _mm_mul_ps(det, minor3); + Mat44V invTrans(minor0, minor1, minor2, minor3); + return M44Trnsps(invTrans); +} + +PX_FORCE_INLINE Vec4V V4LoadXYZW(const PxF32& x, const PxF32& y, const PxF32& z, const PxF32& w) +{ + return _mm_set_ps(w, z, y, x); +} + +/* +// AP: work in progress - use proper SSE intrinsics where possible +PX_FORCE_INLINE VecU16V V4U32PK(VecU32V a, VecU32V b) +{ + VecU16V result; + result.m128_u16[0] = PxU16(PxClamp((a).m128_u32[0], 0, 0xFFFF)); + result.m128_u16[1] = PxU16(PxClamp((a).m128_u32[1], 0, 0xFFFF)); + result.m128_u16[2] = PxU16(PxClamp((a).m128_u32[2], 0, 0xFFFF)); + result.m128_u16[3] = PxU16(PxClamp((a).m128_u32[3], 0, 0xFFFF)); + result.m128_u16[4] = PxU16(PxClamp((b).m128_u32[0], 0, 0xFFFF)); + result.m128_u16[5] = PxU16(PxClamp((b).m128_u32[1], 0, 0xFFFF)); + result.m128_u16[6] = PxU16(PxClamp((b).m128_u32[2], 0, 0xFFFF)); + result.m128_u16[7] = PxU16(PxClamp((b).m128_u32[3], 0, 0xFFFF)); + return result; +} +*/ + +PX_FORCE_INLINE VecU32V V4U32Sel(const BoolV c, const VecU32V a, const VecU32V b) +{ + return m128_I2F(_mm_or_si128(_mm_andnot_si128(m128_F2I(c), m128_F2I(b)), _mm_and_si128(m128_F2I(c), m128_F2I(a)))); +} + +PX_FORCE_INLINE VecU32V V4U32or(VecU32V a, VecU32V b) +{ + return m128_I2F(_mm_or_si128(m128_F2I(a), m128_F2I(b))); +} + +PX_FORCE_INLINE VecU32V V4U32xor(VecU32V a, VecU32V b) +{ + return m128_I2F(_mm_xor_si128(m128_F2I(a), m128_F2I(b))); +} + +PX_FORCE_INLINE VecU32V V4U32and(VecU32V a, VecU32V b) +{ + return m128_I2F(_mm_and_si128(m128_F2I(a), m128_F2I(b))); +} + +PX_FORCE_INLINE VecU32V V4U32Andc(VecU32V a, VecU32V b) +{ + return m128_I2F(_mm_andnot_si128(m128_F2I(b), m128_F2I(a))); +} + +/* +PX_FORCE_INLINE VecU16V V4U16Or(VecU16V a, VecU16V b) +{ + return m128_I2F(_mm_or_si128(m128_F2I(a), m128_F2I(b))); +} +*/ + +/* +PX_FORCE_INLINE VecU16V V4U16And(VecU16V a, VecU16V b) +{ + return m128_I2F(_mm_and_si128(m128_F2I(a), m128_F2I(b))); +} +*/ + +/* +PX_FORCE_INLINE VecU16V V4U16Andc(VecU16V a, VecU16V b) +{ + return m128_I2F(_mm_andnot_si128(m128_F2I(b), m128_F2I(a))); +} +*/ + +PX_FORCE_INLINE VecI32V I4Load(const PxI32 i) +{ + return m128_F2I(_mm_load1_ps(reinterpret_cast(&i))); +} + +PX_FORCE_INLINE VecI32V I4LoadU(const PxI32* i) +{ + return m128_F2I(_mm_loadu_ps(reinterpret_cast(i))); +} + +PX_FORCE_INLINE VecI32V I4LoadA(const PxI32* i) +{ + return m128_F2I(_mm_load_ps(reinterpret_cast(i))); +} + +PX_FORCE_INLINE VecI32V VecI32V_Add(const VecI32VArg a, const VecI32VArg b) +{ + return _mm_add_epi32(a, b); +} + +PX_FORCE_INLINE VecI32V VecI32V_Sub(const VecI32VArg a, const VecI32VArg b) +{ + return _mm_sub_epi32(a, b); +} + +PX_FORCE_INLINE BoolV VecI32V_IsGrtr(const VecI32VArg a, const VecI32VArg b) +{ + return m128_I2F(_mm_cmpgt_epi32(a, b)); +} + +PX_FORCE_INLINE BoolV VecI32V_IsEq(const VecI32VArg a, const VecI32VArg b) +{ + return m128_I2F(_mm_cmpeq_epi32(a, b)); +} + +PX_FORCE_INLINE VecI32V V4I32Sel(const BoolV c, const VecI32V a, const VecI32V b) +{ + return _mm_or_si128(_mm_andnot_si128(m128_F2I(c), b), _mm_and_si128(m128_F2I(c), a)); +} + +PX_FORCE_INLINE VecI32V VecI32V_Zero() +{ + return _mm_setzero_si128(); +} + +PX_FORCE_INLINE VecI32V VecI32V_One() +{ + return I4Load(1); +} + +PX_FORCE_INLINE VecI32V VecI32V_Two() +{ + return I4Load(2); +} + +PX_FORCE_INLINE VecI32V VecI32V_MinusOne() +{ + return I4Load(-1); +} + +PX_FORCE_INLINE VecU32V U4Zero() +{ + return U4Load(0); +} + +PX_FORCE_INLINE VecU32V U4One() +{ + return U4Load(1); +} + +PX_FORCE_INLINE VecU32V U4Two() +{ + return U4Load(2); +} + +PX_FORCE_INLINE VecI32V VecI32V_Sel(const BoolV c, const VecI32VArg a, const VecI32VArg b) +{ + return _mm_or_si128(_mm_andnot_si128(m128_F2I(c), b), _mm_and_si128(m128_F2I(c), a)); +} + +PX_FORCE_INLINE VecShiftV VecI32V_PrepareShift(const VecI32VArg shift) +{ + VecShiftV s; + s.shift = VecI32V_Sel(BTFFF(), shift, VecI32V_Zero()); + return s; +} + +PX_FORCE_INLINE VecI32V VecI32V_LeftShift(const VecI32VArg a, const VecShiftVArg count) +{ + return _mm_sll_epi32(a, count.shift); +} + +PX_FORCE_INLINE VecI32V VecI32V_RightShift(const VecI32VArg a, const VecShiftVArg count) +{ + return _mm_srl_epi32(a, count.shift); +} + +PX_FORCE_INLINE VecI32V VecI32V_LeftShift(const VecI32VArg a, const PxU32 count) +{ + return _mm_slli_epi32(a, PxI32(count)); +} + +PX_FORCE_INLINE VecI32V VecI32V_RightShift(const VecI32VArg a, const PxU32 count) +{ + return _mm_srai_epi32(a, PxI32(count)); +} + +PX_FORCE_INLINE VecI32V VecI32V_And(const VecI32VArg a, const VecI32VArg b) +{ + return _mm_and_si128(a, b); +} + +PX_FORCE_INLINE VecI32V VecI32V_Or(const VecI32VArg a, const VecI32VArg b) +{ + return _mm_or_si128(a, b); +} + +PX_FORCE_INLINE VecI32V VecI32V_GetX(const VecI32VArg a) +{ + return m128_F2I(_mm_shuffle_ps(m128_I2F(a), m128_I2F(a), _MM_SHUFFLE(0, 0, 0, 0))); +} + +PX_FORCE_INLINE VecI32V VecI32V_GetY(const VecI32VArg a) +{ + return m128_F2I(_mm_shuffle_ps(m128_I2F(a), m128_I2F(a), _MM_SHUFFLE(1, 1, 1, 1))); +} + +PX_FORCE_INLINE VecI32V VecI32V_GetZ(const VecI32VArg a) +{ + return m128_F2I(_mm_shuffle_ps(m128_I2F(a), m128_I2F(a), _MM_SHUFFLE(2, 2, 2, 2))); +} + +PX_FORCE_INLINE VecI32V VecI32V_GetW(const VecI32VArg a) +{ + return m128_F2I(_mm_shuffle_ps(m128_I2F(a), m128_I2F(a), _MM_SHUFFLE(3, 3, 3, 3))); +} + +PX_FORCE_INLINE void PxI32_From_VecI32V(const VecI32VArg a, PxI32* i) +{ + _mm_store_ss(reinterpret_cast(i), m128_I2F(a)); +} + +PX_FORCE_INLINE VecI32V VecI32V_Merge(const VecI32VArg x, const VecI32VArg y, const VecI32VArg z, const VecI32VArg w) +{ + const __m128 xw = _mm_move_ss(m128_I2F(y), m128_I2F(x)); // y, y, y, x + const __m128 yz = _mm_move_ss(m128_I2F(z), m128_I2F(w)); // z, z, z, w + return m128_F2I(_mm_shuffle_ps(xw, yz, _MM_SHUFFLE(0, 2, 1, 0))); +} + +PX_FORCE_INLINE VecI32V VecI32V_From_BoolV(const BoolVArg a) +{ + return m128_F2I(a); +} + +PX_FORCE_INLINE VecU32V VecU32V_From_BoolV(const BoolVArg a) +{ + return a; +} + +/* +template PX_FORCE_INLINE VecI32V V4ISplat() +{ + VecI32V result; + result.m128_i32[0] = a; + result.m128_i32[1] = a; + result.m128_i32[2] = a; + result.m128_i32[3] = a; + return result; +} + +template PX_FORCE_INLINE VecU32V V4USplat() +{ + VecU32V result; + result.m128_u32[0] = a; + result.m128_u32[1] = a; + result.m128_u32[2] = a; + result.m128_u32[3] = a; + return result; +} +*/ + +/* +PX_FORCE_INLINE void V4U16StoreAligned(VecU16V val, VecU16V* address) +{ + *address = val; +} +*/ + +PX_FORCE_INLINE void V4U32StoreAligned(VecU32V val, VecU32V* address) +{ + *address = val; +} + +PX_FORCE_INLINE Vec4V V4LoadAligned(Vec4V* addr) +{ + return *addr; +} + +PX_FORCE_INLINE Vec4V V4LoadUnaligned(Vec4V* addr) +{ + return V4LoadU(reinterpret_cast(addr)); +} + +PX_FORCE_INLINE Vec4V V4Andc(const Vec4V a, const VecU32V b) +{ + VecU32V result32(a); + result32 = V4U32Andc(result32, b); + return Vec4V(result32); +} + +PX_FORCE_INLINE VecU32V V4IsGrtrV32u(const Vec4V a, const Vec4V b) +{ + return V4IsGrtr(a, b); +} + +PX_FORCE_INLINE VecU16V V4U16LoadAligned(VecU16V* addr) +{ + return *addr; +} + +PX_FORCE_INLINE VecU16V V4U16LoadUnaligned(VecU16V* addr) +{ + return *addr; +} + +PX_FORCE_INLINE VecU16V V4U16CompareGt(VecU16V a, VecU16V b) +{ + // _mm_cmpgt_epi16 doesn't work for unsigned values unfortunately + // return m128_I2F(_mm_cmpgt_epi16(m128_F2I(a), m128_F2I(b))); + VecU16V result; + result.m128_u16[0] = (a).m128_u16[0] > (b).m128_u16[0]; + result.m128_u16[1] = (a).m128_u16[1] > (b).m128_u16[1]; + result.m128_u16[2] = (a).m128_u16[2] > (b).m128_u16[2]; + result.m128_u16[3] = (a).m128_u16[3] > (b).m128_u16[3]; + result.m128_u16[4] = (a).m128_u16[4] > (b).m128_u16[4]; + result.m128_u16[5] = (a).m128_u16[5] > (b).m128_u16[5]; + result.m128_u16[6] = (a).m128_u16[6] > (b).m128_u16[6]; + result.m128_u16[7] = (a).m128_u16[7] > (b).m128_u16[7]; + return result; +} + +PX_FORCE_INLINE VecU16V V4I16CompareGt(VecU16V a, VecU16V b) +{ + return m128_I2F(_mm_cmpgt_epi16(m128_F2I(a), m128_F2I(b))); +} + +PX_FORCE_INLINE Vec4V Vec4V_From_VecU32V(VecU32V a) +{ + Vec4V result = V4LoadXYZW(PxF32(a.m128_u32[0]), PxF32(a.m128_u32[1]), PxF32(a.m128_u32[2]), PxF32(a.m128_u32[3])); + return result; +} + +PX_FORCE_INLINE Vec4V Vec4V_From_VecI32V(VecI32V in) +{ + return _mm_cvtepi32_ps(in); +} + +PX_FORCE_INLINE VecI32V VecI32V_From_Vec4V(Vec4V a) +{ + return _mm_cvttps_epi32(a); +} + +PX_FORCE_INLINE Vec4V Vec4V_ReinterpretFrom_VecU32V(VecU32V a) +{ + return Vec4V(a); +} + +PX_FORCE_INLINE Vec4V Vec4V_ReinterpretFrom_VecI32V(VecI32V a) +{ + return m128_I2F(a); +} + +PX_FORCE_INLINE VecU32V VecU32V_ReinterpretFrom_Vec4V(Vec4V a) +{ + return VecU32V(a); +} + +PX_FORCE_INLINE VecI32V VecI32V_ReinterpretFrom_Vec4V(Vec4V a) +{ + return m128_F2I(a); +} + +/* +template PX_FORCE_INLINE BoolV BSplatElement(BoolV a) +{ + BoolV result; + result[0] = result[1] = result[2] = result[3] = a[index]; + return result; +} +*/ + +template +BoolV BSplatElement(BoolV a) +{ + float* data = reinterpret_cast(&a); + return V4Load(data[index]); +} + +template +PX_FORCE_INLINE VecU32V V4U32SplatElement(VecU32V a) +{ + VecU32V result; + result.m128_u32[0] = result.m128_u32[1] = result.m128_u32[2] = result.m128_u32[3] = a.m128_u32[index]; + return result; +} + +template +PX_FORCE_INLINE Vec4V V4SplatElement(Vec4V a) +{ + float* data = reinterpret_cast(&a); + return V4Load(data[index]); +} + +PX_FORCE_INLINE VecU32V U4LoadXYZW(PxU32 x, PxU32 y, PxU32 z, PxU32 w) +{ + VecU32V result; + result.m128_u32[0] = x; + result.m128_u32[1] = y; + result.m128_u32[2] = z; + result.m128_u32[3] = w; + return result; +} + +PX_FORCE_INLINE Vec4V V4Ceil(const Vec4V in) +{ + UnionM128 a(in); + return V4LoadXYZW(PxCeil(a.m128_f32[0]), PxCeil(a.m128_f32[1]), PxCeil(a.m128_f32[2]), PxCeil(a.m128_f32[3])); +} + +PX_FORCE_INLINE Vec4V V4Floor(const Vec4V in) +{ + UnionM128 a(in); + return V4LoadXYZW(PxFloor(a.m128_f32[0]), PxFloor(a.m128_f32[1]), PxFloor(a.m128_f32[2]), PxFloor(a.m128_f32[3])); +} + +PX_FORCE_INLINE VecU32V V4ConvertToU32VSaturate(const Vec4V in, PxU32 power) +{ + PX_ASSERT(power == 0 && "Non-zero power not supported in convertToU32VSaturate"); + PX_UNUSED(power); // prevent warning in release builds + PxF32 ffffFFFFasFloat = PxF32(0xFFFF0000); + UnionM128 a(in); + VecU32V result; + result.m128_u32[0] = PxU32(PxClamp((a).m128_f32[0], 0.0f, ffffFFFFasFloat)); + result.m128_u32[1] = PxU32(PxClamp((a).m128_f32[1], 0.0f, ffffFFFFasFloat)); + result.m128_u32[2] = PxU32(PxClamp((a).m128_f32[2], 0.0f, ffffFFFFasFloat)); + result.m128_u32[3] = PxU32(PxClamp((a).m128_f32[3], 0.0f, ffffFFFFasFloat)); + return result; +} + +} // namespace aos +} // namespace physx + +#endif // PXFOUNDATION_PXUNIXSSE2INLINEAOS_H diff --git a/Source/ThirdParty/PhysX/foundation/windows/PxWindowsAoS.h b/Source/ThirdParty/PhysX/foundation/windows/PxWindowsAoS.h new file mode 100644 index 000000000..13175e3ec --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/windows/PxWindowsAoS.h @@ -0,0 +1,143 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_WINDOWS_AOS_H +#define PX_WINDOWS_AOS_H + +// no includes here! this file should be included from PxAOS.h only!!! + +#if !COMPILE_VECTOR_INTRINSICS +#error Vector intrinsics should not be included when using scalar implementation. +#endif + +#if !PX_DOXYGEN +namespace physx +{ +#endif +namespace aos +{ + +typedef __m128 FloatV; +typedef __m128 Vec3V; +typedef __m128 Vec4V; +typedef __m128 BoolV; +typedef __m128 VecU32V; +typedef __m128 VecI32V; +typedef __m128 VecU16V; +typedef __m128 VecI16V; +typedef __m128 QuatV; + +#define FloatVArg FloatV & +#define Vec3VArg Vec3V & +#define Vec4VArg Vec4V & +#define BoolVArg BoolV & +#define VecU32VArg VecU32V & +#define VecI32VArg VecI32V & +#define VecU16VArg VecU16V & +#define VecI16VArg VecI16V & +#define QuatVArg QuatV & + +// Optimization for situations in which you cross product multiple vectors with the same vector. +// Avoids 2X shuffles per product +struct VecCrossV +{ + Vec3V mL1; + Vec3V mR1; +}; + +struct VecShiftV +{ + VecI32V shift; +}; +#define VecShiftVArg VecShiftV & + +PX_ALIGN_PREFIX(16) +struct Mat33V +{ + Mat33V() + { + } + Mat33V(const Vec3V& c0, const Vec3V& c1, const Vec3V& c2) : col0(c0), col1(c1), col2(c2) + { + } + Vec3V PX_ALIGN(16, col0); + Vec3V PX_ALIGN(16, col1); + Vec3V PX_ALIGN(16, col2); +} PX_ALIGN_SUFFIX(16); + +PX_ALIGN_PREFIX(16) +struct Mat34V +{ + Mat34V() + { + } + Mat34V(const Vec3V& c0, const Vec3V& c1, const Vec3V& c2, const Vec3V& c3) : col0(c0), col1(c1), col2(c2), col3(c3) + { + } + Vec3V PX_ALIGN(16, col0); + Vec3V PX_ALIGN(16, col1); + Vec3V PX_ALIGN(16, col2); + Vec3V PX_ALIGN(16, col3); +} PX_ALIGN_SUFFIX(16); + +PX_ALIGN_PREFIX(16) +struct Mat43V +{ + Mat43V() + { + } + Mat43V(const Vec4V& c0, const Vec4V& c1, const Vec4V& c2) : col0(c0), col1(c1), col2(c2) + { + } + Vec4V PX_ALIGN(16, col0); + Vec4V PX_ALIGN(16, col1); + Vec4V PX_ALIGN(16, col2); +} PX_ALIGN_SUFFIX(16); + +PX_ALIGN_PREFIX(16) +struct Mat44V +{ + Mat44V() + { + } + Mat44V(const Vec4V& c0, const Vec4V& c1, const Vec4V& c2, const Vec4V& c3) : col0(c0), col1(c1), col2(c2), col3(c3) + { + } + Vec4V PX_ALIGN(16, col0); + Vec4V PX_ALIGN(16, col1); + Vec4V PX_ALIGN(16, col2); + Vec4V PX_ALIGN(16, col3); +} PX_ALIGN_SUFFIX(16); + +} // namespace aos +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/windows/PxWindowsFPU.h b/Source/ThirdParty/PhysX/foundation/windows/PxWindowsFPU.h new file mode 100644 index 000000000..f70383eae --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/windows/PxWindowsFPU.h @@ -0,0 +1,63 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_WINDOWS_FPU_H +#define PX_WINDOWS_FPU_H + +PX_INLINE physx::PxSIMDGuard::PxSIMDGuard(bool enable) : mEnabled(enable) +{ +#if !PX_ARM && !PX_A64 + if (enable) + { + mControlWord = _mm_getcsr(); + // set default (disable exceptions: _MM_MASK_MASK) and FTZ (_MM_FLUSH_ZERO_ON), DAZ (_MM_DENORMALS_ZERO_ON: (1<<6)) + _mm_setcsr(_MM_MASK_MASK | _MM_FLUSH_ZERO_ON | (1 << 6)); + } + else + { + PX_ASSERT(_mm_getcsr() & _MM_FLUSH_ZERO_ON); + PX_ASSERT(_mm_getcsr() & (1 << 6)); + PX_ASSERT(_mm_getcsr() & _MM_MASK_MASK); + } +#endif +} + +PX_INLINE physx::PxSIMDGuard::~PxSIMDGuard() +{ +#if !PX_ARM && !PX_A64 + if (mEnabled) + { + // restore control word and clear any exception flags + // (setting exception state flags cause exceptions on the first following fp operation) + _mm_setcsr(mControlWord & ~_MM_EXCEPT_MASK); + } +#endif +} + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/windows/PxWindowsInclude.h b/Source/ThirdParty/PhysX/foundation/windows/PxWindowsInclude.h new file mode 100644 index 000000000..992a5a6ef --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/windows/PxWindowsInclude.h @@ -0,0 +1,96 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_WINDOWS_INCLUDE_H +#define PX_WINDOWS_INCLUDE_H + +#ifndef _WIN32 +#error "This file should only be included by Windows builds!!" +#endif + +#ifdef _WINDOWS_ // windows already included +#error "Only include windows.h through this file!!" +#endif + +// We only support >= Windows XP, and we need this for critical section and +// Setting this hides some important APIs (e.g. LoadPackagedLibrary), so don't do it +#define _WIN32_WINNT 0x0501 + +// turn off as much as we can for windows. All we really need is the thread functions(critical sections/Interlocked* +// etc) +#define NOGDICAPMASKS +#define NOVIRTUALKEYCODES +#define NOWINMESSAGES +#define NOWINSTYLES +#define NOSYSMETRICS +#define NOMENUS +#define NOICONS +#define NOKEYSTATES +#define NOSYSCOMMANDS +#define NORASTEROPS +#define NOSHOWWINDOW +#define NOATOM +#define NOCLIPBOARD +#define NOCOLOR +#define NOCTLMGR +#define NODRAWTEXT +#define NOGDI +#define NOMB +#define NOMEMMGR +#define NOMETAFILE +#define NOMINMAX +#define NOOPENFILE +#define NOSCROLL +#define NOSERVICE +#define NOSOUND +#define NOTEXTMETRIC +#define NOWH +#define NOWINOFFSETS +#define NOCOMM +#define NOKANJI +#define NOHELP +#define NOPROFILER +#define NODEFERWINDOWPOS +#define NOMCX +#define WIN32_LEAN_AND_MEAN +// We need a slightly wider API surface for e.g. MultiByteToWideChar +#define NOUSER +#define NONLS +#define NOMSG + +#pragma warning(push) +#pragma warning(disable : 4668) //'symbol' is not defined as a preprocessor macro, replacing with '0' for 'directives' +#include +#pragma warning(pop) + +#if PX_SSE2 +#include +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/windows/PxWindowsInlineAoS.h b/Source/ThirdParty/PhysX/foundation/windows/PxWindowsInlineAoS.h new file mode 100644 index 000000000..ac6ebabd5 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/windows/PxWindowsInlineAoS.h @@ -0,0 +1,3174 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_WINDOWS_INLINE_AOS_H +#define PX_WINDOWS_INLINE_AOS_H + +#if !COMPILE_VECTOR_INTRINSICS +#error Vector intrinsics should not be included when using scalar implementation. +#endif + +#include "../PxVecMathSSE.h" + +namespace physx +{ +namespace aos +{ + +////////////////////////////////////////////////////////////////////// +//Test that Vec3V and FloatV are legal +////////////////////////////////////////////////////////////////////// + +#define FLOAT_COMPONENTS_EQUAL_THRESHOLD 0.01f +PX_FORCE_INLINE bool isValidFloatV(const FloatV a) +{ + const PxF32 x = V4ReadX(a); + const PxF32 y = V4ReadY(a); + const PxF32 z = V4ReadZ(a); + const PxF32 w = V4ReadW(a); + + return (!(x != y || x != z || x != w)); + + /*if ( + (PxAbs(x - y) < FLOAT_COMPONENTS_EQUAL_THRESHOLD) && + (PxAbs(x - z) < FLOAT_COMPONENTS_EQUAL_THRESHOLD) && + (PxAbs(x - w) < FLOAT_COMPONENTS_EQUAL_THRESHOLD) + ) + { + return true; + } + + if ( + (PxAbs((x - y) / x) < FLOAT_COMPONENTS_EQUAL_THRESHOLD) && + (PxAbs((x - z) / x) < FLOAT_COMPONENTS_EQUAL_THRESHOLD) && + (PxAbs((x - w) / x) < FLOAT_COMPONENTS_EQUAL_THRESHOLD) + ) + { + return true; + } + return false;*/ +} + +PX_FORCE_INLINE bool isValidVec3V(const Vec3V a) +{ + //using _mm_comieq_ss to do the comparison doesn't work for NaN. + PX_ALIGN(16, PxF32 f[4]); + V4StoreA((const Vec4V&)a, f); + return f[3] == 0.0f; +} + +PX_FORCE_INLINE bool isFiniteLength(const Vec3V a) +{ + return !FAllEq(V4LengthSq(a), FZero()); +} + +PX_FORCE_INLINE bool isAligned16(void* a) +{ + return(0 == ((size_t)a & 0x0f)); +} + +//ASSERT_FINITELENGTH is deactivated because there is a lot of code that calls a simd normalisation function with zero length but then ignores the result. + +#if PX_DEBUG +#define ASSERT_ISVALIDVEC3V(a) PX_ASSERT(isValidVec3V(a)) +#define ASSERT_ISVALIDFLOATV(a) PX_ASSERT(isValidFloatV(a)) +#define ASSERT_ISALIGNED16(a) PX_ASSERT(isAligned16((void*)a)) +#define ASSERT_ISFINITELENGTH(a) //PX_ASSERT(isFiniteLength(a)) +#else +#define ASSERT_ISVALIDVEC3V(a) +#define ASSERT_ISVALIDFLOATV(a) +#define ASSERT_ISALIGNED16(a) +#define ASSERT_ISFINITELENGTH(a) +#endif +///////////////////////////////////////////////////////////////////// +////FUNCTIONS USED ONLY FOR ASSERTS IN VECTORISED IMPLEMENTATIONS +///////////////////////////////////////////////////////////////////// + +////////////////////////////////////////////////////////////////////// +// USED ONLY INTERNALLY +////////////////////////////////////////////////////////////////////// + +namespace internalWindowsSimd +{ +PX_FORCE_INLINE __m128 m128_I2F(__m128i n) +{ + return _mm_castsi128_ps(n); +} + +PX_FORCE_INLINE __m128i m128_F2I(__m128 n) +{ + return _mm_castps_si128(n); +} + +PX_FORCE_INLINE PxU32 BAllTrue4_R(const BoolV a) +{ + const PxI32 moveMask = _mm_movemask_ps(a); + return PxU32(moveMask == 0xf); +} + +PX_FORCE_INLINE PxU32 BAllTrue3_R(const BoolV a) +{ + const PxI32 moveMask = _mm_movemask_ps(a); + return PxU32((moveMask & 0x7) == 0x7); +} + +PX_FORCE_INLINE PxU32 BAnyTrue4_R(const BoolV a) +{ + const PxI32 moveMask = _mm_movemask_ps(a); + return PxU32(moveMask != 0x0); +} + +PX_FORCE_INLINE PxU32 BAnyTrue3_R(const BoolV a) +{ + const PxI32 moveMask = _mm_movemask_ps(a); + return PxU32(((moveMask & 0x7) != 0x0)); +} + +PX_FORCE_INLINE PxU32 FiniteTestEq(const Vec4V a, const Vec4V b) +{ + // This is a bit of a bodge. + //_mm_comieq_ss returns 1 if either value is nan so we need to re-cast a and b with true encoded as a non-nan + // number. + // There must be a better way of doing this in sse. + const BoolV one = FOne(); + const BoolV zero = FZero(); + const BoolV a1 = V4Sel(a, one, zero); + const BoolV b1 = V4Sel(b, one, zero); + return (PxU32( + _mm_comieq_ss(a1, b1) && + _mm_comieq_ss(_mm_shuffle_ps(a1, a1, _MM_SHUFFLE(1, 1, 1, 1)), _mm_shuffle_ps(b1, b1, _MM_SHUFFLE(1, 1, 1, 1))) && + _mm_comieq_ss(_mm_shuffle_ps(a1, a1, _MM_SHUFFLE(2, 2, 2, 2)), _mm_shuffle_ps(b1, b1, _MM_SHUFFLE(2, 2, 2, 2))) && + _mm_comieq_ss(_mm_shuffle_ps(a1, a1, _MM_SHUFFLE(3, 3, 3, 3)), _mm_shuffle_ps(b1, b1, _MM_SHUFFLE(3, 3, 3, 3))))); +} + +PX_FORCE_INLINE bool hasZeroElementinFloatV(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + return _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)), FZero()) ? true : false; +} + +PX_FORCE_INLINE bool hasZeroElementInVec3V(const Vec3V a) +{ + return (_mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)), FZero()) || + _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)), FZero()) || + _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)), FZero())); +} + +PX_FORCE_INLINE bool hasZeroElementInVec4V(const Vec4V a) +{ + return (_mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)), FZero()) || + _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)), FZero()) || + _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)), FZero()) || + _mm_comieq_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3)), FZero())); +} + +const PX_ALIGN(16, PxU32 gMaskXYZ[4]) = { 0xffffffff, 0xffffffff, 0xffffffff, 0 }; +} //internalWindowsSimd + +namespace vecMathTests +{ +// PT: this function returns an invalid Vec3V (W!=0.0f) just for unit-testing 'isValidVec3V' +PX_FORCE_INLINE Vec3V getInvalidVec3V() +{ + const float f = 1.0f; + return _mm_load1_ps(&f); +} + +PX_FORCE_INLINE bool allElementsEqualFloatV(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_comieq_ss(a, b) != 0; +} + +PX_FORCE_INLINE bool allElementsEqualVec3V(const Vec3V a, const Vec3V b) +{ + return V3AllEq(a, b) != 0; +} + +PX_FORCE_INLINE bool allElementsEqualVec4V(const Vec4V a, const Vec4V b) +{ + return V4AllEq(a, b) != 0; +} + +PX_FORCE_INLINE bool allElementsEqualBoolV(const BoolV a, const BoolV b) +{ + return internalWindowsSimd::BAllTrue4_R(VecI32V_IsEq(a, b)) != 0; +} + +PX_FORCE_INLINE bool allElementsEqualVecU32V(const VecU32V a, const VecU32V b) +{ + return internalWindowsSimd::BAllTrue4_R(V4IsEqU32(a, b)) != 0; +} + +PX_FORCE_INLINE bool allElementsEqualVecI32V(const VecI32V a, const VecI32V b) +{ + BoolV c = internalWindowsSimd::m128_I2F( + _mm_cmpeq_epi32(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b))); + return internalWindowsSimd::BAllTrue4_R(c) != 0; +} + +#define VECMATH_AOS_EPSILON (1e-3f) +static const FloatV minFError = FLoad(-VECMATH_AOS_EPSILON); +static const FloatV maxFError = FLoad(VECMATH_AOS_EPSILON); +static const Vec3V minV3Error = V3Load(-VECMATH_AOS_EPSILON); +static const Vec3V maxV3Error = V3Load(VECMATH_AOS_EPSILON); +static const Vec4V minV4Error = V4Load(-VECMATH_AOS_EPSILON); +static const Vec4V maxV4Error = V4Load(VECMATH_AOS_EPSILON); + +PX_FORCE_INLINE bool allElementsNearEqualFloatV(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + const FloatV c = FSub(a, b); + return _mm_comigt_ss(c, minFError) && _mm_comilt_ss(c, maxFError); +} + +PX_FORCE_INLINE bool allElementsNearEqualVec3V(const Vec3V a, const Vec3V b) +{ + const Vec3V c = V3Sub(a, b); + return (_mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), minV3Error) && + _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), maxV3Error) && + _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), minV3Error) && + _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), maxV3Error) && + _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), minV3Error) && + _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), maxV3Error)); +} + +PX_FORCE_INLINE bool allElementsNearEqualVec4V(const Vec4V a, const Vec4V b) +{ + const Vec4V c = V4Sub(a, b); + return (_mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), minV4Error) && + _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(0, 0, 0, 0)), maxV4Error) && + _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), minV4Error) && + _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(1, 1, 1, 1)), maxV4Error) && + _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), minV4Error) && + _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(2, 2, 2, 2)), maxV4Error) && + _mm_comigt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(3, 3, 3, 3)), minV4Error) && + _mm_comilt_ss(_mm_shuffle_ps(c, c, _MM_SHUFFLE(3, 3, 3, 3)), maxV4Error)); +} +} //vecMathTests + +PX_FORCE_INLINE bool isFiniteFloatV(const FloatV a) +{ + PxF32 f; + FStore(a, &f); + return PxIsFinite(f); + /* + const PxU32 badNumber = (_FPCLASS_SNAN | _FPCLASS_QNAN | _FPCLASS_NINF | _FPCLASS_PINF); + const FloatV vBadNum = FloatV_From_F32((PxF32&)badNumber); + const BoolV vMask = BAnd(vBadNum, a); + return FiniteTestEq(vMask, BFFFF()) == 1; + */ +} + +PX_FORCE_INLINE bool isFiniteVec3V(const Vec3V a) +{ + PX_ALIGN(16, PxF32 f[4]); + V4StoreA((Vec4V&)a, f); + return PxIsFinite(f[0]) && PxIsFinite(f[1]) && PxIsFinite(f[2]); + + /* + const PxU32 badNumber = (_FPCLASS_SNAN | _FPCLASS_QNAN | _FPCLASS_NINF | _FPCLASS_PINF); + const Vec3V vBadNum = Vec3V_From_F32((PxF32&)badNumber); + const BoolV vMask = BAnd(BAnd(vBadNum, a), BTTTF()); + return FiniteTestEq(vMask, BFFFF()) == 1; + */ +} + +PX_FORCE_INLINE bool isFiniteVec4V(const Vec4V a) +{ + PX_ALIGN(16, PxF32 f[4]); + V4StoreA(a, f); + return PxIsFinite(f[0]) && PxIsFinite(f[1]) && PxIsFinite(f[2]) && PxIsFinite(f[3]); + + /* + const PxU32 badNumber = (_FPCLASS_SNAN | _FPCLASS_QNAN | _FPCLASS_NINF | _FPCLASS_PINF); + const Vec4V vBadNum = Vec4V_From_U32((PxF32&)badNumber); + const BoolV vMask = BAnd(vBadNum, a); + + return FiniteTestEq(vMask, BFFFF()) == 1; + */ +} + +///////////////////////////////////////////////////////////////////// +////VECTORISED FUNCTION IMPLEMENTATIONS +///////////////////////////////////////////////////////////////////// + +PX_FORCE_INLINE FloatV FLoad(const PxF32 f) +{ + return _mm_load1_ps(&f); +} + +PX_FORCE_INLINE Vec3V V3Load(const PxF32 f) +{ + return _mm_set_ps(0.0f, f, f, f); +} + +PX_FORCE_INLINE Vec4V V4Load(const PxF32 f) +{ + return _mm_load1_ps(&f); +} + +PX_FORCE_INLINE BoolV BLoad(const bool f) +{ + const PxU32 i = PxU32(-(PxI32)f); + return _mm_load1_ps((float*)&i); +} + +PX_FORCE_INLINE Vec3V V3LoadA(const PxVec3& f) +{ + ASSERT_ISALIGNED16(&f); + return _mm_and_ps(_mm_load_ps(&f.x), reinterpret_cast(internalWindowsSimd::gMaskXYZ)); +} + +PX_FORCE_INLINE Vec3V V3LoadU(const PxVec3& f) +{ + return _mm_set_ps(0.0f, f.z, f.y, f.x); +} + +// w component of result is undefined +PX_FORCE_INLINE Vec3V V3LoadUnsafeA(const PxVec3& f) +{ + ASSERT_ISALIGNED16(&f); + return _mm_load_ps(&f.x); +} + +PX_FORCE_INLINE Vec3V V3LoadA(const PxF32* const f) +{ + ASSERT_ISALIGNED16(f); + return V4ClearW(_mm_load_ps(f)); +} + +PX_FORCE_INLINE Vec3V V3LoadU(const PxF32* const i) +{ + return _mm_set_ps(0.0f, i[2], i[1], i[0]); +} + +PX_FORCE_INLINE Vec3V Vec3V_From_Vec4V(Vec4V v) +{ + return V4ClearW(v); +} + +PX_FORCE_INLINE Vec3V Vec3V_From_Vec4V_WUndefined(const Vec4V v) +{ + return v; +} + +PX_FORCE_INLINE Vec4V Vec4V_From_Vec3V(Vec3V f) +{ + return f; // ok if it is implemented as the same type. +} + +PX_FORCE_INLINE Vec4V Vec4V_From_FloatV(FloatV f) +{ + return f; +} + +PX_FORCE_INLINE Vec3V Vec3V_From_FloatV(FloatV f) +{ + return Vec3V_From_Vec4V(Vec4V_From_FloatV(f)); +} + +PX_FORCE_INLINE Vec3V Vec3V_From_FloatV_WUndefined(FloatV f) +{ + return Vec3V_From_Vec4V_WUndefined(Vec4V_From_FloatV(f)); +} + +PX_FORCE_INLINE Vec4V Vec4V_From_PxVec3_WUndefined(const PxVec3& f) +{ + return _mm_set_ps(0.0f, f.z, f.y, f.x); +} + +PX_FORCE_INLINE Vec4V V4LoadA(const PxF32* const f) +{ + ASSERT_ISALIGNED16(f); + return _mm_load_ps(f); +} + +PX_FORCE_INLINE void V4StoreA(const Vec4V a, PxF32* f) +{ + ASSERT_ISALIGNED16(f); + _mm_store_ps(f, a); +} + +PX_FORCE_INLINE void V4StoreU(const Vec4V a, PxF32* f) +{ + _mm_storeu_ps(f, a); +} + +PX_FORCE_INLINE void BStoreA(const BoolV a, PxU32* f) +{ + ASSERT_ISALIGNED16(f); + _mm_store_ps((PxF32*)f, a); +} + +PX_FORCE_INLINE void U4StoreA(const VecU32V uv, PxU32* u) +{ + ASSERT_ISALIGNED16(u); + _mm_store_ps((PxF32*)u, uv); +} + +PX_FORCE_INLINE void I4StoreA(const VecI32V iv, PxI32* i) +{ + ASSERT_ISALIGNED16(i); + _mm_store_ps((PxF32*)i, iv); +} + +PX_FORCE_INLINE Vec4V V4LoadU(const PxF32* const f) +{ + return _mm_loadu_ps(f); +} + +PX_FORCE_INLINE BoolV BLoad(const bool* const f) +{ + const PX_ALIGN(16, PxU32 b[4]) = { PxU32(-(PxI32)f[0]), PxU32(-(PxI32)f[1]), + PxU32(-(PxI32)f[2]), PxU32(-(PxI32)f[3]) }; + return _mm_load_ps((float*)&b); +} + +PX_FORCE_INLINE void FStore(const FloatV a, PxF32* PX_RESTRICT f) +{ + ASSERT_ISVALIDFLOATV(a); + _mm_store_ss(f, a); +} + +PX_FORCE_INLINE void V3StoreA(const Vec3V a, PxVec3& f) +{ + ASSERT_ISALIGNED16(&f); + PX_ALIGN(16, PxF32 f2[4]); + _mm_store_ps(f2, a); + f = PxVec3(f2[0], f2[1], f2[2]); +} + +PX_FORCE_INLINE void Store_From_BoolV(const BoolV b, PxU32* b2) +{ + _mm_store_ss((PxF32*)b2, b); +} + +PX_FORCE_INLINE void V3StoreU(const Vec3V a, PxVec3& f) +{ + PX_ALIGN(16, PxF32 f2[4]); + _mm_store_ps(f2, a); + f = PxVec3(f2[0], f2[1], f2[2]); +} + +PX_FORCE_INLINE Mat33V Mat33V_From_PxMat33(const PxMat33& m) +{ + return Mat33V(V3LoadU(m.column0), V3LoadU(m.column1), V3LoadU(m.column2)); +} + +PX_FORCE_INLINE void PxMat33_From_Mat33V(const Mat33V& m, PxMat33& out) +{ + ASSERT_ISALIGNED16(&out); + V3StoreU(m.col0, out.column0); + V3StoreU(m.col1, out.column1); + V3StoreU(m.col2, out.column2); +} + +////////////////////////////////// +// FLOATV +////////////////////////////////// + +PX_FORCE_INLINE FloatV FZero() +{ + return _mm_setzero_ps(); +} + +PX_FORCE_INLINE FloatV FOne() +{ + return FLoad(1.0f); +} + +PX_FORCE_INLINE FloatV FHalf() +{ + return FLoad(0.5f); +} + +PX_FORCE_INLINE FloatV FEps() +{ + return FLoad(PX_EPS_REAL); +} + +PX_FORCE_INLINE FloatV FEps6() +{ + return FLoad(1e-6f); +} + +PX_FORCE_INLINE FloatV FMax() +{ + return FLoad(PX_MAX_REAL); +} + +PX_FORCE_INLINE FloatV FNegMax() +{ + return FLoad(-PX_MAX_REAL); +} + +PX_FORCE_INLINE FloatV IZero() +{ + const PxU32 zero = 0; + return _mm_load1_ps((PxF32*)&zero); +} + +PX_FORCE_INLINE FloatV IOne() +{ + const PxU32 one = 1; + return _mm_load1_ps((PxF32*)&one); +} + +PX_FORCE_INLINE FloatV ITwo() +{ + const PxU32 two = 2; + return _mm_load1_ps((PxF32*)&two); +} + +PX_FORCE_INLINE FloatV IThree() +{ + const PxU32 three = 3; + return _mm_load1_ps((PxF32*)&three); +} + +PX_FORCE_INLINE FloatV IFour() +{ + const PxU32 four = 4; + return _mm_load1_ps((PxF32*)&four); +} + +PX_FORCE_INLINE FloatV FNeg(const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + return _mm_sub_ps(_mm_setzero_ps(), f); +} + +PX_FORCE_INLINE FloatV FAdd(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_add_ps(a, b); +} + +PX_FORCE_INLINE FloatV FSub(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_sub_ps(a, b); +} + +PX_FORCE_INLINE FloatV FMul(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_mul_ps(a, b); +} + +PX_FORCE_INLINE FloatV FDiv(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_div_ps(a, b); +} + +PX_FORCE_INLINE FloatV FDivFast(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_mul_ps(a, _mm_rcp_ps(b)); +} + +PX_FORCE_INLINE FloatV FRecip(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + return _mm_div_ps(FOne(), a); +} + +PX_FORCE_INLINE FloatV FRecipFast(const FloatV a) +{ + return _mm_rcp_ps(a); +} + +PX_FORCE_INLINE FloatV FRsqrt(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + return _mm_div_ps(FOne(), _mm_sqrt_ps(a)); +} + +PX_FORCE_INLINE FloatV FSqrt(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + return _mm_sqrt_ps(a); +} + +PX_FORCE_INLINE FloatV FRsqrtFast(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + return _mm_rsqrt_ps(a); +} + +PX_FORCE_INLINE FloatV FScaleAdd(const FloatV a, const FloatV b, const FloatV c) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + ASSERT_ISVALIDFLOATV(c); + return FAdd(FMul(a, b), c); +} + +PX_FORCE_INLINE FloatV FNegScaleSub(const FloatV a, const FloatV b, const FloatV c) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + ASSERT_ISVALIDFLOATV(c); + return FSub(c, FMul(a, b)); +} + +PX_FORCE_INLINE FloatV FAbs(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + PX_ALIGN(16, const static PxU32 absMask[4]) = { 0x7fFFffFF, 0x7fFFffFF, 0x7fFFffFF, 0x7fFFffFF }; + return _mm_and_ps(a, _mm_load_ps((PxF32*)absMask)); +} + +PX_FORCE_INLINE FloatV FSel(const BoolV c, const FloatV a, const FloatV b) +{ + PX_ASSERT(vecMathTests::allElementsEqualBoolV(c, BTTTT()) || + vecMathTests::allElementsEqualBoolV(c, BFFFF())); + ASSERT_ISVALIDFLOATV(_mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a))); + return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a)); +} + +PX_FORCE_INLINE BoolV FIsGrtr(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_cmpgt_ps(a, b); +} + +PX_FORCE_INLINE BoolV FIsGrtrOrEq(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_cmpge_ps(a, b); +} + +PX_FORCE_INLINE BoolV FIsEq(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_cmpeq_ps(a, b); +} + +PX_FORCE_INLINE FloatV FMax(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_max_ps(a, b); +} + +PX_FORCE_INLINE FloatV FMin(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_min_ps(a, b); +} + +PX_FORCE_INLINE FloatV FClamp(const FloatV a, const FloatV minV, const FloatV maxV) +{ + ASSERT_ISVALIDFLOATV(minV); + ASSERT_ISVALIDFLOATV(maxV); + return _mm_max_ps(_mm_min_ps(a, maxV), minV); +} + +PX_FORCE_INLINE PxU32 FAllGrtr(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return PxU32(_mm_comigt_ss(a, b)); +} + +PX_FORCE_INLINE PxU32 FAllGrtrOrEq(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return PxU32(_mm_comige_ss(a, b)); +} + +PX_FORCE_INLINE PxU32 FAllEq(const FloatV a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(b); + return PxU32(_mm_comieq_ss(a, b)); +} + +PX_FORCE_INLINE FloatV FRound(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + // return _mm_round_ps(a, 0x0); + const FloatV half = FLoad(0.5f); + const __m128 signBit = _mm_cvtepi32_ps(_mm_srli_epi32(_mm_cvtps_epi32(a), 31)); + const FloatV aRound = FSub(FAdd(a, half), signBit); + __m128i tmp = _mm_cvttps_epi32(aRound); + return _mm_cvtepi32_ps(tmp); +} + +PX_FORCE_INLINE FloatV FSin(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + // Modulo the range of the given angles such that -XM_2PI <= Angles < XM_2PI + const FloatV recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f); + const FloatV twoPi = V4LoadA(g_PXTwoPi.f); + const FloatV tmp = FMul(a, recipTwoPi); + const FloatV b = FRound(tmp); + const FloatV V1 = FNegScaleSub(twoPi, b, a); + + // sin(V) ~= V - V^3 / 3! + V^5 / 5! - V^7 / 7! + V^9 / 9! - V^11 / 11! + V^13 / 13! - + // V^15 / 15! + V^17 / 17! - V^19 / 19! + V^21 / 21! - V^23 / 23! (for -PI <= V < PI) + const FloatV V2 = FMul(V1, V1); + const FloatV V3 = FMul(V2, V1); + const FloatV V5 = FMul(V3, V2); + const FloatV V7 = FMul(V5, V2); + const FloatV V9 = FMul(V7, V2); + const FloatV V11 = FMul(V9, V2); + const FloatV V13 = FMul(V11, V2); + const FloatV V15 = FMul(V13, V2); + const FloatV V17 = FMul(V15, V2); + const FloatV V19 = FMul(V17, V2); + const FloatV V21 = FMul(V19, V2); + const FloatV V23 = FMul(V21, V2); + + const Vec4V sinCoefficients0 = V4LoadA(g_PXSinCoefficients0.f); + const Vec4V sinCoefficients1 = V4LoadA(g_PXSinCoefficients1.f); + const Vec4V sinCoefficients2 = V4LoadA(g_PXSinCoefficients2.f); + + const FloatV S1 = V4GetY(sinCoefficients0); + const FloatV S2 = V4GetZ(sinCoefficients0); + const FloatV S3 = V4GetW(sinCoefficients0); + const FloatV S4 = V4GetX(sinCoefficients1); + const FloatV S5 = V4GetY(sinCoefficients1); + const FloatV S6 = V4GetZ(sinCoefficients1); + const FloatV S7 = V4GetW(sinCoefficients1); + const FloatV S8 = V4GetX(sinCoefficients2); + const FloatV S9 = V4GetY(sinCoefficients2); + const FloatV S10 = V4GetZ(sinCoefficients2); + const FloatV S11 = V4GetW(sinCoefficients2); + + FloatV Result; + Result = FScaleAdd(S1, V3, V1); + Result = FScaleAdd(S2, V5, Result); + Result = FScaleAdd(S3, V7, Result); + Result = FScaleAdd(S4, V9, Result); + Result = FScaleAdd(S5, V11, Result); + Result = FScaleAdd(S6, V13, Result); + Result = FScaleAdd(S7, V15, Result); + Result = FScaleAdd(S8, V17, Result); + Result = FScaleAdd(S9, V19, Result); + Result = FScaleAdd(S10, V21, Result); + Result = FScaleAdd(S11, V23, Result); + + return Result; +} + +PX_FORCE_INLINE FloatV FCos(const FloatV a) +{ + ASSERT_ISVALIDFLOATV(a); + + // Modulo the range of the given angles such that -XM_2PI <= Angles < XM_2PI + const FloatV recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f); + const FloatV twoPi = V4LoadA(g_PXTwoPi.f); + const FloatV tmp = FMul(a, recipTwoPi); + const FloatV b = FRound(tmp); + const FloatV V1 = FNegScaleSub(twoPi, b, a); + + // cos(V) ~= 1 - V^2 / 2! + V^4 / 4! - V^6 / 6! + V^8 / 8! - V^10 / 10! + V^12 / 12! - + // V^14 / 14! + V^16 / 16! - V^18 / 18! + V^20 / 20! - V^22 / 22! (for -PI <= V < PI) + const FloatV V2 = FMul(V1, V1); + const FloatV V4 = FMul(V2, V2); + const FloatV V6 = FMul(V4, V2); + const FloatV V8 = FMul(V4, V4); + const FloatV V10 = FMul(V6, V4); + const FloatV V12 = FMul(V6, V6); + const FloatV V14 = FMul(V8, V6); + const FloatV V16 = FMul(V8, V8); + const FloatV V18 = FMul(V10, V8); + const FloatV V20 = FMul(V10, V10); + const FloatV V22 = FMul(V12, V10); + + const Vec4V cosCoefficients0 = V4LoadA(g_PXCosCoefficients0.f); + const Vec4V cosCoefficients1 = V4LoadA(g_PXCosCoefficients1.f); + const Vec4V cosCoefficients2 = V4LoadA(g_PXCosCoefficients2.f); + + const FloatV C1 = V4GetY(cosCoefficients0); + const FloatV C2 = V4GetZ(cosCoefficients0); + const FloatV C3 = V4GetW(cosCoefficients0); + const FloatV C4 = V4GetX(cosCoefficients1); + const FloatV C5 = V4GetY(cosCoefficients1); + const FloatV C6 = V4GetZ(cosCoefficients1); + const FloatV C7 = V4GetW(cosCoefficients1); + const FloatV C8 = V4GetX(cosCoefficients2); + const FloatV C9 = V4GetY(cosCoefficients2); + const FloatV C10 = V4GetZ(cosCoefficients2); + const FloatV C11 = V4GetW(cosCoefficients2); + + FloatV Result; + Result = FScaleAdd(C1, V2, V4One()); + Result = FScaleAdd(C2, V4, Result); + Result = FScaleAdd(C3, V6, Result); + Result = FScaleAdd(C4, V8, Result); + Result = FScaleAdd(C5, V10, Result); + Result = FScaleAdd(C6, V12, Result); + Result = FScaleAdd(C7, V14, Result); + Result = FScaleAdd(C8, V16, Result); + Result = FScaleAdd(C9, V18, Result); + Result = FScaleAdd(C10, V20, Result); + Result = FScaleAdd(C11, V22, Result); + + return Result; +} + +PX_FORCE_INLINE PxU32 FOutOfBounds(const FloatV a, const FloatV min, const FloatV max) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(min); + ASSERT_ISVALIDFLOATV(max); + const BoolV c = BOr(FIsGrtr(a, max), FIsGrtr(min, a)); + return PxU32(!BAllEqFFFF(c)); +} + +PX_FORCE_INLINE PxU32 FInBounds(const FloatV a, const FloatV min, const FloatV max) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(min); + ASSERT_ISVALIDFLOATV(max); + const BoolV c = BAnd(FIsGrtrOrEq(a, min), FIsGrtrOrEq(max, a)); + return BAllEqTTTT(c); +} + +PX_FORCE_INLINE PxU32 FOutOfBounds(const FloatV a, const FloatV bounds) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(bounds); + return FOutOfBounds(a, FNeg(bounds), bounds); +} + +PX_FORCE_INLINE PxU32 FInBounds(const FloatV a, const FloatV bounds) +{ + ASSERT_ISVALIDFLOATV(a); + ASSERT_ISVALIDFLOATV(bounds); + return FInBounds(a, FNeg(bounds), bounds); +} + +////////////////////////////////// +// VEC3V +////////////////////////////////// + +PX_FORCE_INLINE Vec3V V3Splat(const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + const __m128 zero = V3Zero(); + const __m128 fff0 = _mm_move_ss(f, zero); + return _mm_shuffle_ps(fff0, fff0, _MM_SHUFFLE(0, 1, 2, 3)); +} + +PX_FORCE_INLINE Vec3V V3Merge(const FloatVArg x, const FloatVArg y, const FloatVArg z) +{ + ASSERT_ISVALIDFLOATV(x); + ASSERT_ISVALIDFLOATV(y); + ASSERT_ISVALIDFLOATV(z); + // static on zero causes compiler crash on x64 debug_opt + const __m128 zero = V3Zero(); + const __m128 xy = _mm_move_ss(x, y); + const __m128 z0 = _mm_move_ss(zero, z); + + return _mm_shuffle_ps(xy, z0, _MM_SHUFFLE(1, 0, 0, 1)); +} + +PX_FORCE_INLINE Vec3V V3UnitX() +{ + const PX_ALIGN(16, PxF32 x[4]) = { 1.0f, 0.0f, 0.0f, 0.0f }; + const __m128 x128 = _mm_load_ps(x); + return x128; +} + +PX_FORCE_INLINE Vec3V V3UnitY() +{ + const PX_ALIGN(16, PxF32 y[4]) = { 0.0f, 1.0f, 0.0f, 0.0f }; + const __m128 y128 = _mm_load_ps(y); + return y128; +} + +PX_FORCE_INLINE Vec3V V3UnitZ() +{ + const PX_ALIGN(16, PxF32 z[4]) = { 0.0f, 0.0f, 1.0f, 0.0f }; + const __m128 z128 = _mm_load_ps(z); + return z128; +} + +PX_FORCE_INLINE FloatV V3GetX(const Vec3V f) +{ + ASSERT_ISVALIDVEC3V(f); + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0, 0, 0, 0)); +} + +PX_FORCE_INLINE FloatV V3GetY(const Vec3V f) +{ + ASSERT_ISVALIDVEC3V(f); + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(1, 1, 1, 1)); +} + +PX_FORCE_INLINE FloatV V3GetZ(const Vec3V f) +{ + ASSERT_ISVALIDVEC3V(f); + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(2, 2, 2, 2)); +} + +PX_FORCE_INLINE Vec3V V3SetX(const Vec3V v, const FloatV f) +{ + ASSERT_ISVALIDVEC3V(v); + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BFTTT(), v, f); +} + +PX_FORCE_INLINE Vec3V V3SetY(const Vec3V v, const FloatV f) +{ + ASSERT_ISVALIDVEC3V(v); + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BTFTT(), v, f); +} + +PX_FORCE_INLINE Vec3V V3SetZ(const Vec3V v, const FloatV f) +{ + ASSERT_ISVALIDVEC3V(v); + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BTTFT(), v, f); +} + +PX_FORCE_INLINE Vec3V V3ColX(const Vec3V a, const Vec3V b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + ASSERT_ISVALIDVEC3V(c); + Vec3V r = _mm_shuffle_ps(a, c, _MM_SHUFFLE(3, 0, 3, 0)); + return V3SetY(r, V3GetX(b)); +} + +PX_FORCE_INLINE Vec3V V3ColY(const Vec3V a, const Vec3V b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + ASSERT_ISVALIDVEC3V(c); + Vec3V r = _mm_shuffle_ps(a, c, _MM_SHUFFLE(3, 1, 3, 1)); + return V3SetY(r, V3GetY(b)); +} + +PX_FORCE_INLINE Vec3V V3ColZ(const Vec3V a, const Vec3V b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + ASSERT_ISVALIDVEC3V(c); + Vec3V r = _mm_shuffle_ps(a, c, _MM_SHUFFLE(3, 2, 3, 2)); + return V3SetY(r, V3GetZ(b)); +} + +PX_FORCE_INLINE Vec3V V3Zero() +{ + return _mm_setzero_ps(); +} + +PX_FORCE_INLINE Vec3V V3One() +{ + return V3Load(1.0f); +} + +PX_FORCE_INLINE Vec3V V3Eps() +{ + return V3Load(PX_EPS_REAL); +} + +PX_FORCE_INLINE Vec3V V3Neg(const Vec3V f) +{ + ASSERT_ISVALIDVEC3V(f); + return _mm_sub_ps(_mm_setzero_ps(), f); +} + +PX_FORCE_INLINE Vec3V V3Add(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return _mm_add_ps(a, b); +} + +PX_FORCE_INLINE Vec3V V3Sub(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return _mm_sub_ps(a, b); +} + +PX_FORCE_INLINE Vec3V V3Scale(const Vec3V a, const FloatV b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_mul_ps(a, b); +} + +PX_FORCE_INLINE Vec3V V3Mul(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return _mm_mul_ps(a, b); +} + +PX_FORCE_INLINE Vec3V V3ScaleInv(const Vec3V a, const FloatV b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_div_ps(a, b); +} + +PX_FORCE_INLINE Vec3V V3Div(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return V4ClearW(_mm_div_ps(a, b)); +} + +PX_FORCE_INLINE Vec3V V3ScaleInvFast(const Vec3V a, const FloatV b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDFLOATV(b); + return _mm_mul_ps(a, _mm_rcp_ps(b)); +} + +PX_FORCE_INLINE Vec3V V3DivFast(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return V4ClearW(_mm_mul_ps(a, _mm_rcp_ps(b))); +} + +PX_FORCE_INLINE Vec3V V3Recip(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const __m128 zero = V3Zero(); + const __m128 tttf = BTTTF(); + const __m128 recipA = _mm_div_ps(V3One(), a); + return V4Sel(tttf, recipA, zero); +} + +PX_FORCE_INLINE Vec3V V3RecipFast(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const __m128 zero = V3Zero(); + const __m128 tttf = BTTTF(); + const __m128 recipA = _mm_rcp_ps(a); + return V4Sel(tttf, recipA, zero); +} + +PX_FORCE_INLINE Vec3V V3Rsqrt(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const __m128 zero = V3Zero(); + const __m128 tttf = BTTTF(); + const __m128 recipA = _mm_div_ps(V3One(), _mm_sqrt_ps(a)); + return V4Sel(tttf, recipA, zero); +} + +PX_FORCE_INLINE Vec3V V3RsqrtFast(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const __m128 zero = V3Zero(); + const __m128 tttf = BTTTF(); + const __m128 recipA = _mm_rsqrt_ps(a); + return V4Sel(tttf, recipA, zero); +} + +PX_FORCE_INLINE Vec3V V3ScaleAdd(const Vec3V a, const FloatV b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDFLOATV(b); + ASSERT_ISVALIDVEC3V(c); + return V3Add(V3Scale(a, b), c); +} + +PX_FORCE_INLINE Vec3V V3NegScaleSub(const Vec3V a, const FloatV b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDFLOATV(b); + ASSERT_ISVALIDVEC3V(c); + return V3Sub(c, V3Scale(a, b)); +} + +PX_FORCE_INLINE Vec3V V3MulAdd(const Vec3V a, const Vec3V b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + ASSERT_ISVALIDVEC3V(c); + return V3Add(V3Mul(a, b), c); +} + +PX_FORCE_INLINE Vec3V V3NegMulSub(const Vec3V a, const Vec3V b, const Vec3V c) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + ASSERT_ISVALIDVEC3V(c); + return V3Sub(c, V3Mul(a, b)); +} + +PX_FORCE_INLINE Vec3V V3Abs(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return V3Max(a, V3Neg(a)); +} + +PX_FORCE_INLINE FloatV V3Dot(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + + const __m128 t0 = _mm_mul_ps(a, b); // aw*bw | az*bz | ay*by | ax*bx + const __m128 t1 = _mm_shuffle_ps(t0, t0, _MM_SHUFFLE(1,0,3,2)); // ay*by | ax*bx | aw*bw | az*bz + const __m128 t2 = _mm_add_ps(t0, t1); // ay*by + aw*bw | ax*bx + az*bz | aw*bw + ay*by | az*bz + ax*bx + const __m128 t3 = _mm_shuffle_ps(t2, t2, _MM_SHUFFLE(2,3,0,1)); // ax*bx + az*bz | ay*by + aw*bw | az*bz + ax*bx | aw*bw + ay*by + return _mm_add_ps(t3, t2); // ax*bx + az*bz + ay*by + aw*bw + // ay*by + aw*bw + ax*bx + az*bz + // az*bz + ax*bx + aw*bw + ay*by + // aw*bw + ay*by + az*bz + ax*bx +} + +PX_FORCE_INLINE Vec3V V3Cross(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); +/* if(0) + { + const __m128 r1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2)); // z,x,y,w + const __m128 r2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 0, 2, 1)); // y,z,x,w + const __m128 l1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1)); // y,z,x,w + const __m128 l2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 1, 0, 2)); // z,x,y,w + return _mm_sub_ps(_mm_mul_ps(l1, l2), _mm_mul_ps(r1, r2)); + } + else*/ + { + const __m128 b0 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3,0,2,1)); + const __m128 a1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3,0,2,1)); + __m128 v = _mm_mul_ps(a1, b); + v = _mm_sub_ps(_mm_mul_ps(a, b0), v); + __m128 res = _mm_shuffle_ps(v, v, _MM_SHUFFLE(3,0,2,1)); + ASSERT_ISVALIDVEC3V(res); + return res; + } +} + +PX_FORCE_INLINE VecCrossV V3PrepareCross(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + VecCrossV v; + v.mR1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2)); // z,x,y,w + v.mL1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1)); // y,z,x,w + return v; +} + +PX_FORCE_INLINE Vec3V V3Cross(const VecCrossV& a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(b); + const __m128 r2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 0, 2, 1)); // y,z,x,w + const __m128 l2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 1, 0, 2)); // z,x,y,w + return _mm_sub_ps(_mm_mul_ps(a.mL1, l2), _mm_mul_ps(a.mR1, r2)); +} + +PX_FORCE_INLINE Vec3V V3Cross(const Vec3V a, const VecCrossV& b) +{ + ASSERT_ISVALIDVEC3V(a); + const __m128 r2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1)); // y,z,x,w + const __m128 l2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2)); // z,x,y,w + return _mm_sub_ps(_mm_mul_ps(b.mR1, r2), _mm_mul_ps(b.mL1, l2)); +} + +PX_FORCE_INLINE Vec3V V3Cross(const VecCrossV& a, const VecCrossV& b) +{ + return _mm_sub_ps(_mm_mul_ps(a.mL1, b.mR1), _mm_mul_ps(a.mR1, b.mL1)); +} + +PX_FORCE_INLINE FloatV V3Length(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return _mm_sqrt_ps(V3Dot(a, a)); +} + +PX_FORCE_INLINE FloatV V3LengthSq(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return V3Dot(a, a); +} + +PX_FORCE_INLINE Vec3V V3Normalize(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISFINITELENGTH(a); + return V3ScaleInv(a, _mm_sqrt_ps(V3Dot(a, a))); +} + +PX_FORCE_INLINE Vec3V V3NormalizeFast(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISFINITELENGTH(a); + return V3Scale(a, _mm_rsqrt_ps(V3Dot(a, a))); +} + +PX_FORCE_INLINE Vec3V V3NormalizeSafe(const Vec3V a, const Vec3V unsafeReturnValue) +{ + ASSERT_ISVALIDVEC3V(a); + const __m128 eps = FEps(); + const __m128 length = V3Length(a); + const __m128 isGreaterThanZero = FIsGrtr(length, eps); + return V3Sel(isGreaterThanZero, V3ScaleInv(a, length), unsafeReturnValue); +} + +PX_FORCE_INLINE Vec3V V3Sel(const BoolV c, const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(_mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a))); + return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a)); +} + +PX_FORCE_INLINE BoolV V3IsGrtr(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return _mm_cmpgt_ps(a, b); +} + +PX_FORCE_INLINE BoolV V3IsGrtrOrEq(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return _mm_cmpge_ps(a, b); +} + +PX_FORCE_INLINE BoolV V3IsEq(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return _mm_cmpeq_ps(a, b); +} + +PX_FORCE_INLINE Vec3V V3Max(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return _mm_max_ps(a, b); +} + +PX_FORCE_INLINE Vec3V V3Min(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return _mm_min_ps(a, b); +} + +PX_FORCE_INLINE FloatV V3ExtractMax(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)); + const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)); + const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)); + return _mm_max_ps(_mm_max_ps(shuf1, shuf2), shuf3); +} + +PX_FORCE_INLINE FloatV V3ExtractMin(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)); + const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)); + const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)); + return _mm_min_ps(_mm_min_ps(shuf1, shuf2), shuf3); +} + +//// if(a > 0.0f) return 1.0f; else if a == 0.f return 0.f, else return -1.f; +// PX_FORCE_INLINE Vec3V V3MathSign(const Vec3V a) +//{ +// VECMATHAOS_ASSERT(isValidVec3V(a)); +// +// const __m128i ai = _mm_cvtps_epi32(a); +// const __m128i bi = _mm_cvtps_epi32(V3Neg(a)); +// const __m128 aa = _mm_cvtepi32_ps(_mm_srai_epi32(ai, 31)); +// const __m128 bb = _mm_cvtepi32_ps(_mm_srai_epi32(bi, 31)); +// return _mm_or_ps(aa, bb); +//} + +// return (a >= 0.0f) ? 1.0f : -1.0f; +PX_FORCE_INLINE Vec3V V3Sign(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const __m128 zero = V3Zero(); + const __m128 one = V3One(); + const __m128 none = V3Neg(one); + return V3Sel(V3IsGrtrOrEq(a, zero), one, none); +} + +PX_FORCE_INLINE Vec3V V3Clamp(const Vec3V a, const Vec3V minV, const Vec3V maxV) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(minV); + ASSERT_ISVALIDVEC3V(maxV); + return V3Max(V3Min(a, maxV), minV); +} + +PX_FORCE_INLINE PxU32 V3AllGrtr(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return internalWindowsSimd::BAllTrue3_R(V4IsGrtr(a, b)); +} + +PX_FORCE_INLINE PxU32 V3AllGrtrOrEq(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return internalWindowsSimd::BAllTrue3_R(V4IsGrtrOrEq(a, b)); +} + +PX_FORCE_INLINE PxU32 V3AllEq(const Vec3V a, const Vec3V b) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(b); + return internalWindowsSimd::BAllTrue3_R(V4IsEq(a, b)); +} + +PX_FORCE_INLINE Vec3V V3Round(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + + // return _mm_round_ps(a, 0x0); + const Vec3V half = V3Load(0.5f); + const __m128 signBit = _mm_cvtepi32_ps(_mm_srli_epi32(_mm_cvtps_epi32(a), 31)); + const Vec3V aRound = V3Sub(V3Add(a, half), signBit); + __m128i tmp = _mm_cvttps_epi32(aRound); + return _mm_cvtepi32_ps(tmp); +} + +PX_FORCE_INLINE Vec3V V3Sin(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + + // Modulo the range of the given angles such that -XM_2PI <= Angles < XM_2PI + const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f); + const Vec4V twoPi = V4LoadA(g_PXTwoPi.f); + const Vec3V tmp = V3Scale(a, recipTwoPi); + const Vec3V b = V3Round(tmp); + const Vec3V V1 = V3NegScaleSub(b, twoPi, a); + + // sin(V) ~= V - V^3 / 3! + V^5 / 5! - V^7 / 7! + V^9 / 9! - V^11 / 11! + V^13 / 13! - + // V^15 / 15! + V^17 / 17! - V^19 / 19! + V^21 / 21! - V^23 / 23! (for -PI <= V < PI) + const Vec3V V2 = V3Mul(V1, V1); + const Vec3V V3 = V3Mul(V2, V1); + const Vec3V V5 = V3Mul(V3, V2); + const Vec3V V7 = V3Mul(V5, V2); + const Vec3V V9 = V3Mul(V7, V2); + const Vec3V V11 = V3Mul(V9, V2); + const Vec3V V13 = V3Mul(V11, V2); + const Vec3V V15 = V3Mul(V13, V2); + const Vec3V V17 = V3Mul(V15, V2); + const Vec3V V19 = V3Mul(V17, V2); + const Vec3V V21 = V3Mul(V19, V2); + const Vec3V V23 = V3Mul(V21, V2); + + const Vec4V sinCoefficients0 = V4LoadA(g_PXSinCoefficients0.f); + const Vec4V sinCoefficients1 = V4LoadA(g_PXSinCoefficients1.f); + const Vec4V sinCoefficients2 = V4LoadA(g_PXSinCoefficients2.f); + + const FloatV S1 = V4GetY(sinCoefficients0); + const FloatV S2 = V4GetZ(sinCoefficients0); + const FloatV S3 = V4GetW(sinCoefficients0); + const FloatV S4 = V4GetX(sinCoefficients1); + const FloatV S5 = V4GetY(sinCoefficients1); + const FloatV S6 = V4GetZ(sinCoefficients1); + const FloatV S7 = V4GetW(sinCoefficients1); + const FloatV S8 = V4GetX(sinCoefficients2); + const FloatV S9 = V4GetY(sinCoefficients2); + const FloatV S10 = V4GetZ(sinCoefficients2); + const FloatV S11 = V4GetW(sinCoefficients2); + + Vec3V Result; + Result = V3ScaleAdd(V3, S1, V1); + Result = V3ScaleAdd(V5, S2, Result); + Result = V3ScaleAdd(V7, S3, Result); + Result = V3ScaleAdd(V9, S4, Result); + Result = V3ScaleAdd(V11, S5, Result); + Result = V3ScaleAdd(V13, S6, Result); + Result = V3ScaleAdd(V15, S7, Result); + Result = V3ScaleAdd(V17, S8, Result); + Result = V3ScaleAdd(V19, S9, Result); + Result = V3ScaleAdd(V21, S10, Result); + Result = V3ScaleAdd(V23, S11, Result); + + ASSERT_ISVALIDVEC3V(Result); + return Result; +} + +PX_FORCE_INLINE Vec3V V3Cos(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + + // Modulo the range of the given angles such that -XM_2PI <= Angles < XM_2PI + const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f); + const Vec4V twoPi = V4LoadA(g_PXTwoPi.f); + const Vec3V tmp = V3Scale(a, recipTwoPi); + const Vec3V b = V3Round(tmp); + const Vec3V V1 = V3NegScaleSub(b, twoPi, a); + + // cos(V) ~= 1 - V^2 / 2! + V^4 / 4! - V^6 / 6! + V^8 / 8! - V^10 / 10! + V^12 / 12! - + // V^14 / 14! + V^16 / 16! - V^18 / 18! + V^20 / 20! - V^22 / 22! (for -PI <= V < PI) + const Vec3V V2 = V3Mul(V1, V1); + const Vec3V V4 = V3Mul(V2, V2); + const Vec3V V6 = V3Mul(V4, V2); + const Vec3V V8 = V3Mul(V4, V4); + const Vec3V V10 = V3Mul(V6, V4); + const Vec3V V12 = V3Mul(V6, V6); + const Vec3V V14 = V3Mul(V8, V6); + const Vec3V V16 = V3Mul(V8, V8); + const Vec3V V18 = V3Mul(V10, V8); + const Vec3V V20 = V3Mul(V10, V10); + const Vec3V V22 = V3Mul(V12, V10); + + const Vec4V cosCoefficients0 = V4LoadA(g_PXCosCoefficients0.f); + const Vec4V cosCoefficients1 = V4LoadA(g_PXCosCoefficients1.f); + const Vec4V cosCoefficients2 = V4LoadA(g_PXCosCoefficients2.f); + + const FloatV C1 = V4GetY(cosCoefficients0); + const FloatV C2 = V4GetZ(cosCoefficients0); + const FloatV C3 = V4GetW(cosCoefficients0); + const FloatV C4 = V4GetX(cosCoefficients1); + const FloatV C5 = V4GetY(cosCoefficients1); + const FloatV C6 = V4GetZ(cosCoefficients1); + const FloatV C7 = V4GetW(cosCoefficients1); + const FloatV C8 = V4GetX(cosCoefficients2); + const FloatV C9 = V4GetY(cosCoefficients2); + const FloatV C10 = V4GetZ(cosCoefficients2); + const FloatV C11 = V4GetW(cosCoefficients2); + + Vec3V Result; + Result = V3ScaleAdd(V2, C1, V3One()); + Result = V3ScaleAdd(V4, C2, Result); + Result = V3ScaleAdd(V6, C3, Result); + Result = V3ScaleAdd(V8, C4, Result); + Result = V3ScaleAdd(V10, C5, Result); + Result = V3ScaleAdd(V12, C6, Result); + Result = V3ScaleAdd(V14, C7, Result); + Result = V3ScaleAdd(V16, C8, Result); + Result = V3ScaleAdd(V18, C9, Result); + Result = V3ScaleAdd(V20, C10, Result); + Result = V3ScaleAdd(V22, C11, Result); + + ASSERT_ISVALIDVEC3V(Result); + return Result; +} + +PX_FORCE_INLINE Vec3V V3PermYZZ(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 2, 2, 1)); +} + +PX_FORCE_INLINE Vec3V V3PermXYX(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 1, 0)); +} + +PX_FORCE_INLINE Vec3V V3PermYZX(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1)); +} + +PX_FORCE_INLINE Vec3V V3PermZXY(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2)); +} + +PX_FORCE_INLINE Vec3V V3PermZZY(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 2, 2)); +} + +PX_FORCE_INLINE Vec3V V3PermYXX(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 0, 1)); +} + +PX_FORCE_INLINE Vec3V V3Perm_Zero_1Z_0Y(const Vec3V v0, const Vec3V v1) +{ + ASSERT_ISVALIDVEC3V(v0); + ASSERT_ISVALIDVEC3V(v1); + return _mm_shuffle_ps(v1, v0, _MM_SHUFFLE(3, 1, 2, 3)); +} + +PX_FORCE_INLINE Vec3V V3Perm_0Z_Zero_1X(const Vec3V v0, const Vec3V v1) +{ + ASSERT_ISVALIDVEC3V(v0); + ASSERT_ISVALIDVEC3V(v1); + return _mm_shuffle_ps(v0, v1, _MM_SHUFFLE(3, 0, 3, 2)); +} + +PX_FORCE_INLINE Vec3V V3Perm_1Y_0X_Zero(const Vec3V v0, const Vec3V v1) +{ + ASSERT_ISVALIDVEC3V(v0); + ASSERT_ISVALIDVEC3V(v1); + // There must be a better way to do this. + Vec3V v2 = V3Zero(); + FloatV y1 = V3GetY(v1); + FloatV x0 = V3GetX(v0); + v2 = V3SetX(v2, y1); + return V3SetY(v2, x0); +} + +PX_FORCE_INLINE FloatV V3SumElems(const Vec3V a) +{ + ASSERT_ISVALIDVEC3V(a); + const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)); // z,y,x,w + const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)); // y,x,w,z + const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)); // x,w,z,y + return _mm_add_ps(_mm_add_ps(shuf1, shuf2), shuf3); +} + +PX_FORCE_INLINE PxU32 V3OutOfBounds(const Vec3V a, const Vec3V min, const Vec3V max) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(min); + ASSERT_ISVALIDVEC3V(max); + const BoolV c = BOr(V3IsGrtr(a, max), V3IsGrtr(min, a)); + return PxU32(!BAllEqFFFF(c)); +} + +PX_FORCE_INLINE PxU32 V3InBounds(const Vec3V a, const Vec3V min, const Vec3V max) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(min); + ASSERT_ISVALIDVEC3V(max); + const BoolV c = BAnd(V3IsGrtrOrEq(a, min), V3IsGrtrOrEq(max, a)); + return BAllEqTTTT(c); +} + +PX_FORCE_INLINE PxU32 V3OutOfBounds(const Vec3V a, const Vec3V bounds) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(bounds); + return V3OutOfBounds(a, V3Neg(bounds), bounds); +} + +PX_FORCE_INLINE PxU32 V3InBounds(const Vec3V a, const Vec3V bounds) +{ + ASSERT_ISVALIDVEC3V(a); + ASSERT_ISVALIDVEC3V(bounds); + return V3InBounds(a, V3Neg(bounds), bounds); +} + +PX_FORCE_INLINE void V3Transpose(Vec3V& col0, Vec3V& col1, Vec3V& col2) +{ + ASSERT_ISVALIDVEC3V(col0); + ASSERT_ISVALIDVEC3V(col1); + ASSERT_ISVALIDVEC3V(col2); + const Vec3V col3 = _mm_setzero_ps(); + Vec3V tmp0 = _mm_unpacklo_ps(col0, col1); + Vec3V tmp2 = _mm_unpacklo_ps(col2, col3); + Vec3V tmp1 = _mm_unpackhi_ps(col0, col1); + Vec3V tmp3 = _mm_unpackhi_ps(col2, col3); + col0 = _mm_movelh_ps(tmp0, tmp2); + col1 = _mm_movehl_ps(tmp2, tmp0); + col2 = _mm_movelh_ps(tmp1, tmp3); +} + +////////////////////////////////// +// VEC4V +////////////////////////////////// + +PX_FORCE_INLINE Vec4V V4Splat(const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + // return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0,0,0,0)); + return f; +} + +PX_FORCE_INLINE Vec4V V4Merge(const FloatV* const floatVArray) +{ + ASSERT_ISVALIDFLOATV(floatVArray[0]); + ASSERT_ISVALIDFLOATV(floatVArray[1]); + ASSERT_ISVALIDFLOATV(floatVArray[2]); + ASSERT_ISVALIDFLOATV(floatVArray[3]); + const __m128 xw = _mm_move_ss(floatVArray[1], floatVArray[0]); // y, y, y, x + const __m128 yz = _mm_move_ss(floatVArray[2], floatVArray[3]); // z, z, z, w + return _mm_shuffle_ps(xw, yz, _MM_SHUFFLE(0, 2, 1, 0)); +} + +PX_FORCE_INLINE Vec4V V4Merge(const FloatVArg x, const FloatVArg y, const FloatVArg z, const FloatVArg w) +{ + ASSERT_ISVALIDFLOATV(x); + ASSERT_ISVALIDFLOATV(y); + ASSERT_ISVALIDFLOATV(z); + ASSERT_ISVALIDFLOATV(w); + const __m128 xw = _mm_move_ss(y, x); // y, y, y, x + const __m128 yz = _mm_move_ss(z, w); // z, z, z, w + return _mm_shuffle_ps(xw, yz, _MM_SHUFFLE(0, 2, 1, 0)); +} + +PX_FORCE_INLINE Vec4V V4MergeW(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w) +{ + const Vec4V xz = _mm_unpackhi_ps(x, z); + const Vec4V yw = _mm_unpackhi_ps(y, w); + return _mm_unpackhi_ps(xz, yw); +} + +PX_FORCE_INLINE Vec4V V4MergeZ(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w) +{ + const Vec4V xz = _mm_unpackhi_ps(x, z); + const Vec4V yw = _mm_unpackhi_ps(y, w); + return _mm_unpacklo_ps(xz, yw); +} + +PX_FORCE_INLINE Vec4V V4MergeY(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w) +{ + const Vec4V xz = _mm_unpacklo_ps(x, z); + const Vec4V yw = _mm_unpacklo_ps(y, w); + return _mm_unpackhi_ps(xz, yw); +} + +PX_FORCE_INLINE Vec4V V4MergeX(const Vec4VArg x, const Vec4VArg y, const Vec4VArg z, const Vec4VArg w) +{ + const Vec4V xz = _mm_unpacklo_ps(x, z); + const Vec4V yw = _mm_unpacklo_ps(y, w); + return _mm_unpacklo_ps(xz, yw); +} + +PX_FORCE_INLINE Vec4V V4UnpackXY(const Vec4VArg a, const Vec4VArg b) +{ + return _mm_unpacklo_ps(a, b); +} + +PX_FORCE_INLINE Vec4V V4UnpackZW(const Vec4VArg a, const Vec4VArg b) +{ + return _mm_unpackhi_ps(a, b); +} + +PX_FORCE_INLINE Vec4V V4PermYXWZ(const Vec4V a) +{ + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 3, 0, 1)); +} + +PX_FORCE_INLINE Vec4V V4PermXZXZ(const Vec4V a) +{ + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 0, 2, 0)); +} + +PX_FORCE_INLINE Vec4V V4PermYWYW(const Vec4V a) +{ + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 3, 1)); +} + +PX_FORCE_INLINE Vec4V V4PermYZXW(const Vec4V a) +{ + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1)); +} + +PX_FORCE_INLINE Vec4V V4PermZWXY(const Vec4V a) +{ + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 0, 3, 2)); +} + +template +PX_FORCE_INLINE Vec4V V4Perm(const Vec4V a) +{ + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(w, z, y, x)); +} + +PX_FORCE_INLINE Vec4V V4UnitW() +{ + const PX_ALIGN(16, PxF32 w[4]) = { 0.0f, 0.0f, 0.0f, 1.0f }; + const __m128 w128 = _mm_load_ps(w); + return w128; +} + +PX_FORCE_INLINE Vec4V V4UnitX() +{ + const PX_ALIGN(16, PxF32 x[4]) = { 1.0f, 0.0f, 0.0f, 0.0f }; + const __m128 x128 = _mm_load_ps(x); + return x128; +} + +PX_FORCE_INLINE Vec4V V4UnitY() +{ + const PX_ALIGN(16, PxF32 y[4]) = { 0.0f, 1.0f, 0.0f, 0.0f }; + const __m128 y128 = _mm_load_ps(y); + return y128; +} + +PX_FORCE_INLINE Vec4V V4UnitZ() +{ + const PX_ALIGN(16, PxF32 z[4]) = { 0.0f, 0.0f, 1.0f, 0.0f }; + const __m128 z128 = _mm_load_ps(z); + return z128; +} + +PX_FORCE_INLINE FloatV V4GetW(const Vec4V f) +{ + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(3, 3, 3, 3)); +} + +PX_FORCE_INLINE FloatV V4GetX(const Vec4V f) +{ + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0, 0, 0, 0)); +} + +PX_FORCE_INLINE FloatV V4GetY(const Vec4V f) +{ + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(1, 1, 1, 1)); +} + +PX_FORCE_INLINE FloatV V4GetZ(const Vec4V f) +{ + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(2, 2, 2, 2)); +} + +PX_FORCE_INLINE Vec4V V4SetW(const Vec4V v, const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BTTTF(), v, f); +} + +PX_FORCE_INLINE Vec4V V4ClearW(const Vec4V v) +{ + return _mm_and_ps(v, (VecI32V&)internalWindowsSimd::gMaskXYZ); +} + +PX_FORCE_INLINE Vec4V V4SetX(const Vec4V v, const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BFTTT(), v, f); +} + +PX_FORCE_INLINE Vec4V V4SetY(const Vec4V v, const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BTFTT(), v, f); +} + +PX_FORCE_INLINE Vec4V V4SetZ(const Vec4V v, const FloatV f) +{ + ASSERT_ISVALIDFLOATV(f); + return V4Sel(BTTFT(), v, f); +} + +PX_FORCE_INLINE Vec4V V4Zero() +{ + return _mm_setzero_ps(); +} + +PX_FORCE_INLINE Vec4V V4One() +{ + return V4Load(1.0f); +} + +PX_FORCE_INLINE Vec4V V4Eps() +{ + return V4Load(PX_EPS_REAL); +} + +PX_FORCE_INLINE Vec4V V4Neg(const Vec4V f) +{ + return _mm_sub_ps(_mm_setzero_ps(), f); +} + +PX_FORCE_INLINE Vec4V V4Add(const Vec4V a, const Vec4V b) +{ + return _mm_add_ps(a, b); +} + +PX_FORCE_INLINE Vec4V V4Sub(const Vec4V a, const Vec4V b) +{ + return _mm_sub_ps(a, b); +} + +PX_FORCE_INLINE Vec4V V4Scale(const Vec4V a, const FloatV b) +{ + return _mm_mul_ps(a, b); +} + +PX_FORCE_INLINE Vec4V V4Mul(const Vec4V a, const Vec4V b) +{ + return _mm_mul_ps(a, b); +} + +PX_FORCE_INLINE Vec4V V4ScaleInv(const Vec4V a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(b); + return _mm_div_ps(a, b); +} + +PX_FORCE_INLINE Vec4V V4Div(const Vec4V a, const Vec4V b) +{ + return _mm_div_ps(a, b); +} + +PX_FORCE_INLINE Vec4V V4ScaleInvFast(const Vec4V a, const FloatV b) +{ + ASSERT_ISVALIDFLOATV(b); + return _mm_mul_ps(a, _mm_rcp_ps(b)); +} + +PX_FORCE_INLINE Vec4V V4DivFast(const Vec4V a, const Vec4V b) +{ + return _mm_mul_ps(a, _mm_rcp_ps(b)); +} + +PX_FORCE_INLINE Vec4V V4Recip(const Vec4V a) +{ + return _mm_div_ps(V4One(), a); +} + +PX_FORCE_INLINE Vec4V V4RecipFast(const Vec4V a) +{ + return _mm_rcp_ps(a); +} + +PX_FORCE_INLINE Vec4V V4Rsqrt(const Vec4V a) +{ + return _mm_div_ps(V4One(), _mm_sqrt_ps(a)); +} + +PX_FORCE_INLINE Vec4V V4RsqrtFast(const Vec4V a) +{ + return _mm_rsqrt_ps(a); +} + +PX_FORCE_INLINE Vec4V V4Sqrt(const Vec4V a) +{ + return _mm_sqrt_ps(a); +} + +PX_FORCE_INLINE Vec4V V4ScaleAdd(const Vec4V a, const FloatV b, const Vec4V c) +{ + ASSERT_ISVALIDFLOATV(b); + return V4Add(V4Scale(a, b), c); +} + +PX_FORCE_INLINE Vec4V V4NegScaleSub(const Vec4V a, const FloatV b, const Vec4V c) +{ + ASSERT_ISVALIDFLOATV(b); + return V4Sub(c, V4Scale(a, b)); +} + +PX_FORCE_INLINE Vec4V V4MulAdd(const Vec4V a, const Vec4V b, const Vec4V c) +{ + return V4Add(V4Mul(a, b), c); +} + +PX_FORCE_INLINE Vec4V V4NegMulSub(const Vec4V a, const Vec4V b, const Vec4V c) +{ + return V4Sub(c, V4Mul(a, b)); +} + +PX_FORCE_INLINE Vec4V V4Abs(const Vec4V a) +{ + return V4Max(a, V4Neg(a)); +} + +PX_FORCE_INLINE FloatV V4SumElements(const Vec4V a) +{ + const Vec4V xy = V4UnpackXY(a, a); // x,x,y,y + const Vec4V zw = V4UnpackZW(a, a); // z,z,w,w + const Vec4V xz_yw = V4Add(xy, zw); // x+z,x+z,y+w,y+w + const FloatV xz = V4GetX(xz_yw); // x+z + const FloatV yw = V4GetZ(xz_yw); // y+w + return FAdd(xz, yw); // sum +} + +PX_FORCE_INLINE FloatV V4Dot(const Vec4V a, const Vec4V b) +{ + //const __m128 dot1 = _mm_mul_ps(a, b); // x,y,z,w + //const __m128 shuf1 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(2, 1, 0, 3)); // w,x,y,z + //const __m128 shuf2 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(1, 0, 3, 2)); // z,w,x,y + //const __m128 shuf3 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(0, 3, 2, 1)); // y,z,w,x + //return _mm_add_ps(_mm_add_ps(shuf2, shuf3), _mm_add_ps(dot1, shuf1)); + + // PT: this version has two less instructions but we should check its accuracy + // aw*bw | az*bz | ay*by | ax*bx + const __m128 t0 = _mm_mul_ps(a, b); + // ay*by | ax*bx | aw*bw | az*bz + const __m128 t1 = _mm_shuffle_ps(t0, t0, _MM_SHUFFLE(1,0,3,2)); + // ay*by + aw*bw | ax*bx + az*bz | aw*bw + ay*by | az*bz + ax*bx + const __m128 t2 = _mm_add_ps(t0, t1); + // ax*bx + az*bz | ay*by + aw*bw | az*bz + ax*bx | aw*bw + ay*by + const __m128 t3 = _mm_shuffle_ps(t2, t2, _MM_SHUFFLE(2,3,0,1)); + // ax*bx + az*bz + ay*by + aw*bw + return _mm_add_ps(t3, t2); + // ay*by + aw*bw + ax*bx + az*bz + // az*bz + ax*bx + aw*bw + ay*by + // aw*bw + ay*by + az*bz + ax*bx +} + +PX_FORCE_INLINE FloatV V4Dot3(const Vec4V a, const Vec4V b) +{ + const __m128 dot1 = _mm_mul_ps(a, b); // aw*bw | az*bz | ay*by | ax*bx + const __m128 shuf1 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(0, 0, 0, 0)); // ax*bx | ax*bx | ax*bx | ax*bx + const __m128 shuf2 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(1, 1, 1, 1)); // ay*by | ay*by | ay*by | ay*by + const __m128 shuf3 = _mm_shuffle_ps(dot1, dot1, _MM_SHUFFLE(2, 2, 2, 2)); // az*bz | az*bz | az*bz | az*bz + return _mm_add_ps(_mm_add_ps(shuf1, shuf2), shuf3); // ax*bx + ay*by + az*bz in each component +} + +PX_FORCE_INLINE Vec4V V4Cross(const Vec4V a, const Vec4V b) +{ +/* if(0) + { + const __m128 r1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 1, 0, 2)); // z,x,y,w + const __m128 r2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 0, 2, 1)); // y,z,x,w + const __m128 l1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 0, 2, 1)); // y,z,x,w + const __m128 l2 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 1, 0, 2)); // z,x,y,w + return _mm_sub_ps(_mm_mul_ps(l1, l2), _mm_mul_ps(r1, r2)); + } + else*/ + { + const __m128 b0 = _mm_shuffle_ps(b, b, _MM_SHUFFLE(3,0,2,1)); + const __m128 a1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(3,0,2,1)); + __m128 v = _mm_mul_ps(a1, b); + v = _mm_sub_ps(_mm_mul_ps(a, b0), v); + return _mm_shuffle_ps(v, v, _MM_SHUFFLE(3,0,2,1)); + } +} + +PX_FORCE_INLINE FloatV V4Length(const Vec4V a) +{ + return _mm_sqrt_ps(V4Dot(a, a)); +} + +PX_FORCE_INLINE FloatV V4LengthSq(const Vec4V a) +{ + return V4Dot(a, a); +} + +PX_FORCE_INLINE Vec4V V4Normalize(const Vec4V a) +{ + ASSERT_ISFINITELENGTH(a); + return V4ScaleInv(a, _mm_sqrt_ps(V4Dot(a, a))); +} + +PX_FORCE_INLINE Vec4V V4NormalizeFast(const Vec4V a) +{ + ASSERT_ISFINITELENGTH(a); + return V4ScaleInvFast(a, _mm_sqrt_ps(V4Dot(a, a))); +} + +PX_FORCE_INLINE Vec4V V4NormalizeSafe(const Vec4V a, const Vec4V unsafeReturnValue) +{ + const __m128 eps = V3Eps(); + const __m128 length = V4Length(a); + const __m128 isGreaterThanZero = V4IsGrtr(length, eps); + return V4Sel(isGreaterThanZero, V4ScaleInv(a, length), unsafeReturnValue); +} + +PX_FORCE_INLINE Vec4V V4Sel(const BoolV c, const Vec4V a, const Vec4V b) +{ + return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a)); +} + +PX_FORCE_INLINE BoolV V4IsGrtr(const Vec4V a, const Vec4V b) +{ + return _mm_cmpgt_ps(a, b); +} + +PX_FORCE_INLINE BoolV V4IsGrtrOrEq(const Vec4V a, const Vec4V b) +{ + return _mm_cmpge_ps(a, b); +} + +PX_FORCE_INLINE BoolV V4IsEq(const Vec4V a, const Vec4V b) +{ + return _mm_cmpeq_ps(a, b); +} + +PX_FORCE_INLINE BoolV V4IsEqU32(const VecU32V a, const VecU32V b) +{ + return internalWindowsSimd::m128_I2F( + _mm_cmpeq_epi32(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b))); +} + +PX_FORCE_INLINE Vec4V V4Max(const Vec4V a, const Vec4V b) +{ + return _mm_max_ps(a, b); +} + +PX_FORCE_INLINE Vec4V V4Min(const Vec4V a, const Vec4V b) +{ + return _mm_min_ps(a, b); +} + +PX_FORCE_INLINE FloatV V4ExtractMax(const Vec4V a) +{ + const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 1, 0, 3)); + const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 0, 3, 2)); + const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 3, 2, 1)); + + return _mm_max_ps(_mm_max_ps(a, shuf1), _mm_max_ps(shuf2, shuf3)); +} + +PX_FORCE_INLINE FloatV V4ExtractMin(const Vec4V a) +{ + const __m128 shuf1 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 1, 0, 3)); + const __m128 shuf2 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 0, 3, 2)); + const __m128 shuf3 = _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 3, 2, 1)); + + return _mm_min_ps(_mm_min_ps(a, shuf1), _mm_min_ps(shuf2, shuf3)); +} + +PX_FORCE_INLINE Vec4V V4Clamp(const Vec4V a, const Vec4V minV, const Vec4V maxV) +{ + return V4Max(V4Min(a, maxV), minV); +} + +PX_FORCE_INLINE PxU32 V4AllGrtr(const Vec4V a, const Vec4V b) +{ + return internalWindowsSimd::BAllTrue4_R(V4IsGrtr(a, b)); +} + +PX_FORCE_INLINE PxU32 V4AllGrtrOrEq(const Vec4V a, const Vec4V b) +{ + return internalWindowsSimd::BAllTrue4_R(V4IsGrtrOrEq(a, b)); +} + +PX_FORCE_INLINE PxU32 V4AllGrtrOrEq3(const Vec4V a, const Vec4V b) +{ + return internalWindowsSimd::BAllTrue3_R(V4IsGrtrOrEq(a, b)); +} + +PX_FORCE_INLINE PxU32 V4AllEq(const Vec4V a, const Vec4V b) +{ + return internalWindowsSimd::BAllTrue4_R(V4IsEq(a, b)); +} + +PX_FORCE_INLINE PxU32 V4AnyGrtr3(const Vec4V a, const Vec4V b) +{ + return internalWindowsSimd::BAnyTrue3_R(V4IsGrtr(a, b)); +} + +PX_FORCE_INLINE Vec4V V4Round(const Vec4V a) +{ + // return _mm_round_ps(a, 0x0); + const Vec4V half = V4Load(0.5f); + const __m128 signBit = _mm_cvtepi32_ps(_mm_srli_epi32(_mm_cvtps_epi32(a), 31)); + const Vec4V aRound = V4Sub(V4Add(a, half), signBit); + const __m128i tmp = _mm_cvttps_epi32(aRound); + return _mm_cvtepi32_ps(tmp); +} + +PX_FORCE_INLINE Vec4V V4Sin(const Vec4V a) +{ + const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f); + const Vec4V twoPi = V4LoadA(g_PXTwoPi.f); + const Vec4V tmp = V4Mul(a, recipTwoPi); + const Vec4V b = V4Round(tmp); + const Vec4V V1 = V4NegMulSub(twoPi, b, a); + + // sin(V) ~= V - V^3 / 3! + V^5 / 5! - V^7 / 7! + V^9 / 9! - V^11 / 11! + V^13 / 13! - + // V^15 / 15! + V^17 / 17! - V^19 / 19! + V^21 / 21! - V^23 / 23! (for -PI <= V < PI) + const Vec4V V2 = V4Mul(V1, V1); + const Vec4V V3 = V4Mul(V2, V1); + const Vec4V V5 = V4Mul(V3, V2); + const Vec4V V7 = V4Mul(V5, V2); + const Vec4V V9 = V4Mul(V7, V2); + const Vec4V V11 = V4Mul(V9, V2); + const Vec4V V13 = V4Mul(V11, V2); + const Vec4V V15 = V4Mul(V13, V2); + const Vec4V V17 = V4Mul(V15, V2); + const Vec4V V19 = V4Mul(V17, V2); + const Vec4V V21 = V4Mul(V19, V2); + const Vec4V V23 = V4Mul(V21, V2); + + const Vec4V sinCoefficients0 = V4LoadA(g_PXSinCoefficients0.f); + const Vec4V sinCoefficients1 = V4LoadA(g_PXSinCoefficients1.f); + const Vec4V sinCoefficients2 = V4LoadA(g_PXSinCoefficients2.f); + + const FloatV S1 = V4GetY(sinCoefficients0); + const FloatV S2 = V4GetZ(sinCoefficients0); + const FloatV S3 = V4GetW(sinCoefficients0); + const FloatV S4 = V4GetX(sinCoefficients1); + const FloatV S5 = V4GetY(sinCoefficients1); + const FloatV S6 = V4GetZ(sinCoefficients1); + const FloatV S7 = V4GetW(sinCoefficients1); + const FloatV S8 = V4GetX(sinCoefficients2); + const FloatV S9 = V4GetY(sinCoefficients2); + const FloatV S10 = V4GetZ(sinCoefficients2); + const FloatV S11 = V4GetW(sinCoefficients2); + + Vec4V Result; + Result = V4MulAdd(S1, V3, V1); + Result = V4MulAdd(S2, V5, Result); + Result = V4MulAdd(S3, V7, Result); + Result = V4MulAdd(S4, V9, Result); + Result = V4MulAdd(S5, V11, Result); + Result = V4MulAdd(S6, V13, Result); + Result = V4MulAdd(S7, V15, Result); + Result = V4MulAdd(S8, V17, Result); + Result = V4MulAdd(S9, V19, Result); + Result = V4MulAdd(S10, V21, Result); + Result = V4MulAdd(S11, V23, Result); + + return Result; +} + +PX_FORCE_INLINE Vec4V V4Cos(const Vec4V a) +{ + const Vec4V recipTwoPi = V4LoadA(g_PXReciprocalTwoPi.f); + const FloatV twoPi = V4LoadA(g_PXTwoPi.f); + const Vec4V tmp = V4Mul(a, recipTwoPi); + const Vec4V b = V4Round(tmp); + const Vec4V V1 = V4NegMulSub(twoPi, b, a); + + // cos(V) ~= 1 - V^2 / 2! + V^4 / 4! - V^6 / 6! + V^8 / 8! - V^10 / 10! + V^12 / 12! - + // V^14 / 14! + V^16 / 16! - V^18 / 18! + V^20 / 20! - V^22 / 22! (for -PI <= V < PI) + const Vec4V V2 = V4Mul(V1, V1); + const Vec4V V4 = V4Mul(V2, V2); + const Vec4V V6 = V4Mul(V4, V2); + const Vec4V V8 = V4Mul(V4, V4); + const Vec4V V10 = V4Mul(V6, V4); + const Vec4V V12 = V4Mul(V6, V6); + const Vec4V V14 = V4Mul(V8, V6); + const Vec4V V16 = V4Mul(V8, V8); + const Vec4V V18 = V4Mul(V10, V8); + const Vec4V V20 = V4Mul(V10, V10); + const Vec4V V22 = V4Mul(V12, V10); + + const Vec4V cosCoefficients0 = V4LoadA(g_PXCosCoefficients0.f); + const Vec4V cosCoefficients1 = V4LoadA(g_PXCosCoefficients1.f); + const Vec4V cosCoefficients2 = V4LoadA(g_PXCosCoefficients2.f); + + const FloatV C1 = V4GetY(cosCoefficients0); + const FloatV C2 = V4GetZ(cosCoefficients0); + const FloatV C3 = V4GetW(cosCoefficients0); + const FloatV C4 = V4GetX(cosCoefficients1); + const FloatV C5 = V4GetY(cosCoefficients1); + const FloatV C6 = V4GetZ(cosCoefficients1); + const FloatV C7 = V4GetW(cosCoefficients1); + const FloatV C8 = V4GetX(cosCoefficients2); + const FloatV C9 = V4GetY(cosCoefficients2); + const FloatV C10 = V4GetZ(cosCoefficients2); + const FloatV C11 = V4GetW(cosCoefficients2); + + Vec4V Result; + Result = V4MulAdd(C1, V2, V4One()); + Result = V4MulAdd(C2, V4, Result); + Result = V4MulAdd(C3, V6, Result); + Result = V4MulAdd(C4, V8, Result); + Result = V4MulAdd(C5, V10, Result); + Result = V4MulAdd(C6, V12, Result); + Result = V4MulAdd(C7, V14, Result); + Result = V4MulAdd(C8, V16, Result); + Result = V4MulAdd(C9, V18, Result); + Result = V4MulAdd(C10, V20, Result); + Result = V4MulAdd(C11, V22, Result); + + return Result; +} + +PX_FORCE_INLINE void V4Transpose(Vec4V& col0, Vec4V& col1, Vec4V& col2, Vec4V& col3) +{ + Vec4V tmp0 = _mm_unpacklo_ps(col0, col1); + Vec4V tmp2 = _mm_unpacklo_ps(col2, col3); + Vec4V tmp1 = _mm_unpackhi_ps(col0, col1); + Vec4V tmp3 = _mm_unpackhi_ps(col2, col3); + col0 = _mm_movelh_ps(tmp0, tmp2); + col1 = _mm_movehl_ps(tmp2, tmp0); + col2 = _mm_movelh_ps(tmp1, tmp3); + col3 = _mm_movehl_ps(tmp3, tmp1); +} + +////////////////////////////////// +// BoolV +////////////////////////////////// + +PX_FORCE_INLINE BoolV BFFFF() +{ + return _mm_setzero_ps(); +} + +PX_FORCE_INLINE BoolV BFFFT() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0,0,0xFFFFFFFF}; + const __m128 ffft=_mm_load_ps((float*)&f); + return ffft;*/ + return internalWindowsSimd::m128_I2F(_mm_set_epi32(-1, 0, 0, 0)); +} + +PX_FORCE_INLINE BoolV BFFTF() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0,0xFFFFFFFF,0}; + const __m128 fftf=_mm_load_ps((float*)&f); + return fftf;*/ + return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, -1, 0, 0)); +} + +PX_FORCE_INLINE BoolV BFFTT() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0,0xFFFFFFFF,0xFFFFFFFF}; + const __m128 fftt=_mm_load_ps((float*)&f); + return fftt;*/ + return internalWindowsSimd::m128_I2F(_mm_set_epi32(-1, -1, 0, 0)); +} + +PX_FORCE_INLINE BoolV BFTFF() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0xFFFFFFFF,0,0}; + const __m128 ftff=_mm_load_ps((float*)&f); + return ftff;*/ + return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, 0, -1, 0)); +} + +PX_FORCE_INLINE BoolV BFTFT() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0xFFFFFFFF,0,0xFFFFFFFF}; + const __m128 ftft=_mm_load_ps((float*)&f); + return ftft;*/ + return internalWindowsSimd::m128_I2F(_mm_set_epi32(-1, 0, -1, 0)); +} + +PX_FORCE_INLINE BoolV BFTTF() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0xFFFFFFFF,0xFFFFFFFF,0}; + const __m128 fttf=_mm_load_ps((float*)&f); + return fttf;*/ + return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, -1, -1, 0)); +} + +PX_FORCE_INLINE BoolV BFTTT() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}; + const __m128 fttt=_mm_load_ps((float*)&f); + return fttt;*/ + return internalWindowsSimd::m128_I2F(_mm_set_epi32(-1, -1, -1, 0)); +} + +PX_FORCE_INLINE BoolV BTFFF() +{ + // const PX_ALIGN(16, PxU32 f[4])={0xFFFFFFFF,0,0,0}; + // const __m128 tfff=_mm_load_ps((float*)&f); + // return tfff; + return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, 0, 0, -1)); +} + +PX_FORCE_INLINE BoolV BTFFT() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0xFFFFFFFF,0,0,0xFFFFFFFF}; + const __m128 tfft=_mm_load_ps((float*)&f); + return tfft;*/ + return internalWindowsSimd::m128_I2F(_mm_set_epi32(-1, 0, 0, -1)); +} + +PX_FORCE_INLINE BoolV BTFTF() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0xFFFFFFFF,0,0xFFFFFFFF,0}; + const __m128 tftf=_mm_load_ps((float*)&f); + return tftf;*/ + return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, -1, 0, -1)); +} + +PX_FORCE_INLINE BoolV BTFTT() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0xFFFFFFFF,0,0xFFFFFFFF,0xFFFFFFFF}; + const __m128 tftt=_mm_load_ps((float*)&f); + return tftt;*/ + return internalWindowsSimd::m128_I2F(_mm_set_epi32(-1, -1, 0, -1)); +} + +PX_FORCE_INLINE BoolV BTTFF() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0xFFFFFFFF,0xFFFFFFFF,0,0}; + const __m128 ttff=_mm_load_ps((float*)&f); + return ttff;*/ + return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, 0, -1, -1)); +} + +PX_FORCE_INLINE BoolV BTTFT() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0xFFFFFFFF,0xFFFFFFFF,0,0xFFFFFFFF}; + const __m128 ttft=_mm_load_ps((float*)&f); + return ttft;*/ + return internalWindowsSimd::m128_I2F(_mm_set_epi32(-1, 0, -1, -1)); +} + +PX_FORCE_INLINE BoolV BTTTF() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0}; + const __m128 tttf=_mm_load_ps((float*)&f); + return tttf;*/ + return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, -1, -1, -1)); +} + +PX_FORCE_INLINE BoolV BTTTT() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}; + const __m128 tttt=_mm_load_ps((float*)&f); + return tttt;*/ + return internalWindowsSimd::m128_I2F(_mm_set_epi32(-1, -1, -1, -1)); +} + +PX_FORCE_INLINE BoolV BXMask() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0xFFFFFFFF,0,0,0}; + const __m128 tfff=_mm_load_ps((float*)&f); + return tfff;*/ + return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, 0, 0, -1)); +} + +PX_FORCE_INLINE BoolV BYMask() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0xFFFFFFFF,0,0}; + const __m128 ftff=_mm_load_ps((float*)&f); + return ftff;*/ + return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, 0, -1, 0)); +} + +PX_FORCE_INLINE BoolV BZMask() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0,0xFFFFFFFF,0}; + const __m128 fftf=_mm_load_ps((float*)&f); + return fftf;*/ + return internalWindowsSimd::m128_I2F(_mm_set_epi32(0, -1, 0, 0)); +} + +PX_FORCE_INLINE BoolV BWMask() +{ + /*const PX_ALIGN(16, PxU32 f[4])={0,0,0,0xFFFFFFFF}; + const __m128 ffft=_mm_load_ps((float*)&f); + return ffft;*/ + return internalWindowsSimd::m128_I2F(_mm_set_epi32(-1, 0, 0, 0)); +} + +PX_FORCE_INLINE BoolV BGetX(const BoolV f) +{ + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(0, 0, 0, 0)); +} + +PX_FORCE_INLINE BoolV BGetY(const BoolV f) +{ + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(1, 1, 1, 1)); +} + +PX_FORCE_INLINE BoolV BGetZ(const BoolV f) +{ + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(2, 2, 2, 2)); +} + +PX_FORCE_INLINE BoolV BGetW(const BoolV f) +{ + return _mm_shuffle_ps(f, f, _MM_SHUFFLE(3, 3, 3, 3)); +} + +PX_FORCE_INLINE BoolV BSetX(const BoolV v, const BoolV f) +{ + return V4Sel(BFTTT(), v, f); +} + +PX_FORCE_INLINE BoolV BSetY(const BoolV v, const BoolV f) +{ + return V4Sel(BTFTT(), v, f); +} + +PX_FORCE_INLINE BoolV BSetZ(const BoolV v, const BoolV f) +{ + return V4Sel(BTTFT(), v, f); +} + +PX_FORCE_INLINE BoolV BSetW(const BoolV v, const BoolV f) +{ + return V4Sel(BTTTF(), v, f); +} + +template +BoolV BSplatElement(BoolV a) +{ + return internalWindowsSimd::m128_I2F( + _mm_shuffle_epi32(internalWindowsSimd::m128_F2I(a), _MM_SHUFFLE(index, index, index, index))); +} + +PX_FORCE_INLINE BoolV BAnd(const BoolV a, const BoolV b) +{ + return _mm_and_ps(a, b); +} + +PX_FORCE_INLINE BoolV BNot(const BoolV a) +{ + const BoolV bAllTrue(BTTTT()); + return _mm_xor_ps(a, bAllTrue); +} + +PX_FORCE_INLINE BoolV BAndNot(const BoolV a, const BoolV b) +{ + return _mm_andnot_ps(b, a); +} + +PX_FORCE_INLINE BoolV BOr(const BoolV a, const BoolV b) +{ + return _mm_or_ps(a, b); +} + +PX_FORCE_INLINE BoolV BAllTrue4(const BoolV a) +{ + const BoolV bTmp = + _mm_and_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)), _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 3, 2, 3))); + return _mm_and_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)), + _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1))); +} + +PX_FORCE_INLINE BoolV BAnyTrue4(const BoolV a) +{ + const BoolV bTmp = + _mm_or_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)), _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 3, 2, 3))); + return _mm_or_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)), + _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1))); +} + +PX_FORCE_INLINE BoolV BAllTrue3(const BoolV a) +{ + const BoolV bTmp = + _mm_and_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)), _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2))); + return _mm_and_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)), + _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1))); +} + +PX_FORCE_INLINE BoolV BAnyTrue3(const BoolV a) +{ + const BoolV bTmp = + _mm_or_ps(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 1, 0, 1)), _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2))); + return _mm_or_ps(_mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(0, 0, 0, 0)), + _mm_shuffle_ps(bTmp, bTmp, _MM_SHUFFLE(1, 1, 1, 1))); +} + +PX_FORCE_INLINE PxU32 BAllEq(const BoolV a, const BoolV b) +{ + const BoolV bTest = internalWindowsSimd::m128_I2F( + _mm_cmpeq_epi32(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b))); + return internalWindowsSimd::BAllTrue4_R(bTest); +} + +PX_FORCE_INLINE PxU32 BAllEqTTTT(const BoolV a) +{ + return PxU32(_mm_movemask_ps(a)==15); +} + +PX_FORCE_INLINE PxU32 BAllEqFFFF(const BoolV a) +{ + return PxU32(_mm_movemask_ps(a)==0); +} + +PX_FORCE_INLINE PxU32 BGetBitMask(const BoolV a) +{ + return PxU32(_mm_movemask_ps(a)); +} + +////////////////////////////////// +// MAT33V +////////////////////////////////// + +PX_FORCE_INLINE Vec3V M33MulV3(const Mat33V& a, const Vec3V b) +{ + const FloatV x = V3GetX(b); + const FloatV y = V3GetY(b); + const FloatV z = V3GetZ(b); + const Vec3V v0 = V3Scale(a.col0, x); + const Vec3V v1 = V3Scale(a.col1, y); + const Vec3V v2 = V3Scale(a.col2, z); + const Vec3V v0PlusV1 = V3Add(v0, v1); + return V3Add(v0PlusV1, v2); +} + +PX_FORCE_INLINE Vec3V M33TrnspsMulV3(const Mat33V& a, const Vec3V b) +{ + Vec3V v0 = V3Mul(a.col0, b); + Vec3V v1 = V3Mul(a.col1, b); + Vec3V v2 = V3Mul(a.col2, b); + V3Transpose(v0, v1, v2); + return V3Add(V3Add(v0, v1), v2); +} + +PX_FORCE_INLINE Vec3V M33MulV3AddV3(const Mat33V& A, const Vec3V b, const Vec3V c) +{ + const FloatV x = V3GetX(b); + const FloatV y = V3GetY(b); + const FloatV z = V3GetZ(b); + Vec3V result = V3ScaleAdd(A.col0, x, c); + result = V3ScaleAdd(A.col1, y, result); + return V3ScaleAdd(A.col2, z, result); +} + +PX_FORCE_INLINE Mat33V M33MulM33(const Mat33V& a, const Mat33V& b) +{ + return Mat33V(M33MulV3(a, b.col0), M33MulV3(a, b.col1), M33MulV3(a, b.col2)); +} + +PX_FORCE_INLINE Mat33V M33Add(const Mat33V& a, const Mat33V& b) +{ + return Mat33V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2)); +} + +PX_FORCE_INLINE Mat33V M33Scale(const Mat33V& a, const FloatV& b) +{ + return Mat33V(V3Scale(a.col0, b), V3Scale(a.col1, b), V3Scale(a.col2, b)); +} + +PX_FORCE_INLINE Mat33V M33Sub(const Mat33V& a, const Mat33V& b) +{ + return Mat33V(V3Sub(a.col0, b.col0), V3Sub(a.col1, b.col1), V3Sub(a.col2, b.col2)); +} + +PX_FORCE_INLINE Mat33V M33Neg(const Mat33V& a) +{ + return Mat33V(V3Neg(a.col0), V3Neg(a.col1), V3Neg(a.col2)); +} + +PX_FORCE_INLINE Mat33V M33Abs(const Mat33V& a) +{ + return Mat33V(V3Abs(a.col0), V3Abs(a.col1), V3Abs(a.col2)); +} + +PX_FORCE_INLINE Mat33V M33Inverse(const Mat33V& a) +{ + const BoolV tfft = BTFFT(); + const BoolV tttf = BTTTF(); + const FloatV zero = V3Zero(); + const Vec3V cross01 = V3Cross(a.col0, a.col1); + const Vec3V cross12 = V3Cross(a.col1, a.col2); + const Vec3V cross20 = V3Cross(a.col2, a.col0); + const FloatV dot = V3Dot(cross01, a.col2); + const FloatV invDet = _mm_rcp_ps(dot); + const Vec3V mergeh = _mm_unpacklo_ps(cross12, cross01); + const Vec3V mergel = _mm_unpackhi_ps(cross12, cross01); + Vec3V colInv0 = _mm_unpacklo_ps(mergeh, cross20); + colInv0 = _mm_or_ps(_mm_andnot_ps(tttf, zero), _mm_and_ps(tttf, colInv0)); + const Vec3V zppd = _mm_shuffle_ps(mergeh, cross20, _MM_SHUFFLE(3, 0, 0, 2)); + const Vec3V pbwp = _mm_shuffle_ps(cross20, mergeh, _MM_SHUFFLE(3, 3, 1, 0)); + const Vec3V colInv1 = _mm_or_ps(_mm_andnot_ps(BTFFT(), pbwp), _mm_and_ps(BTFFT(), zppd)); + const Vec3V xppd = _mm_shuffle_ps(mergel, cross20, _MM_SHUFFLE(3, 0, 0, 0)); + const Vec3V pcyp = _mm_shuffle_ps(cross20, mergel, _MM_SHUFFLE(3, 1, 2, 0)); + const Vec3V colInv2 = _mm_or_ps(_mm_andnot_ps(tfft, pcyp), _mm_and_ps(tfft, xppd)); + + return Mat33V(_mm_mul_ps(colInv0, invDet), _mm_mul_ps(colInv1, invDet), _mm_mul_ps(colInv2, invDet)); +} + +PX_FORCE_INLINE Mat33V M33Trnsps(const Mat33V& a) +{ + Vec3V col0 = a.col0, col1 = a.col1, col2 = a.col2; + V3Transpose(col0, col1, col2); + return Mat33V(col0, col1, col2); +} + +PX_FORCE_INLINE Mat33V M33Identity() +{ + return Mat33V(V3UnitX(), V3UnitY(), V3UnitZ()); +} + +PX_FORCE_INLINE Mat33V M33Diagonal(const Vec3VArg d) +{ + const FloatV x = V3Mul(V3UnitX(), d); + const FloatV y = V3Mul(V3UnitY(), d); + const FloatV z = V3Mul(V3UnitZ(), d); + return Mat33V(x, y, z); +} + +////////////////////////////////// +// MAT34V +////////////////////////////////// + +PX_FORCE_INLINE Vec3V M34MulV3(const Mat34V& a, const Vec3V b) +{ + const FloatV x = V3GetX(b); + const FloatV y = V3GetY(b); + const FloatV z = V3GetZ(b); + const Vec3V v0 = V3Scale(a.col0, x); + const Vec3V v1 = V3Scale(a.col1, y); + const Vec3V v2 = V3Scale(a.col2, z); + const Vec3V v0PlusV1 = V3Add(v0, v1); + const Vec3V v0PlusV1Plusv2 = V3Add(v0PlusV1, v2); + return V3Add(v0PlusV1Plusv2, a.col3); +} + +PX_FORCE_INLINE Vec3V M34Mul33V3(const Mat34V& a, const Vec3V b) +{ + const FloatV x = V3GetX(b); + const FloatV y = V3GetY(b); + const FloatV z = V3GetZ(b); + const Vec3V v0 = V3Scale(a.col0, x); + const Vec3V v1 = V3Scale(a.col1, y); + const Vec3V v2 = V3Scale(a.col2, z); + const Vec3V v0PlusV1 = V3Add(v0, v1); + return V3Add(v0PlusV1, v2); +} + +PX_FORCE_INLINE Vec3V M34TrnspsMul33V3(const Mat34V& a, const Vec3V b) +{ + Vec3V v0 = V3Mul(a.col0, b); + Vec3V v1 = V3Mul(a.col1, b); + Vec3V v2 = V3Mul(a.col2, b); + V3Transpose(v0, v1, v2); + return V3Add(V3Add(v0, v1), v2); +} + +PX_FORCE_INLINE Mat34V M34MulM34(const Mat34V& a, const Mat34V& b) +{ + return Mat34V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2), M34MulV3(a, b.col3)); +} + +PX_FORCE_INLINE Mat33V M34MulM33(const Mat34V& a, const Mat33V& b) +{ + return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2)); +} + +PX_FORCE_INLINE Mat33V M34Mul33MM34(const Mat34V& a, const Mat34V& b) +{ + return Mat33V(M34Mul33V3(a, b.col0), M34Mul33V3(a, b.col1), M34Mul33V3(a, b.col2)); +} + +PX_FORCE_INLINE Mat34V M34Add(const Mat34V& a, const Mat34V& b) +{ + return Mat34V(V3Add(a.col0, b.col0), V3Add(a.col1, b.col1), V3Add(a.col2, b.col2), V3Add(a.col3, b.col3)); +} + +PX_FORCE_INLINE Mat34V M34Inverse(const Mat34V& a) +{ + Mat34V aInv; + const BoolV tfft = BTFFT(); + const BoolV tttf = BTTTF(); + const FloatV zero = V3Zero(); + const Vec3V cross01 = V3Cross(a.col0, a.col1); + const Vec3V cross12 = V3Cross(a.col1, a.col2); + const Vec3V cross20 = V3Cross(a.col2, a.col0); + const FloatV dot = V3Dot(cross01, a.col2); + const FloatV invDet = _mm_rcp_ps(dot); + const Vec3V mergeh = _mm_unpacklo_ps(cross12, cross01); + const Vec3V mergel = _mm_unpackhi_ps(cross12, cross01); + Vec3V colInv0 = _mm_unpacklo_ps(mergeh, cross20); + colInv0 = _mm_or_ps(_mm_andnot_ps(tttf, zero), _mm_and_ps(tttf, colInv0)); + const Vec3V zppd = _mm_shuffle_ps(mergeh, cross20, _MM_SHUFFLE(3, 0, 0, 2)); + const Vec3V pbwp = _mm_shuffle_ps(cross20, mergeh, _MM_SHUFFLE(3, 3, 1, 0)); + const Vec3V colInv1 = _mm_or_ps(_mm_andnot_ps(BTFFT(), pbwp), _mm_and_ps(BTFFT(), zppd)); + const Vec3V xppd = _mm_shuffle_ps(mergel, cross20, _MM_SHUFFLE(3, 0, 0, 0)); + const Vec3V pcyp = _mm_shuffle_ps(cross20, mergel, _MM_SHUFFLE(3, 1, 2, 0)); + const Vec3V colInv2 = _mm_or_ps(_mm_andnot_ps(tfft, pcyp), _mm_and_ps(tfft, xppd)); + aInv.col0 = _mm_mul_ps(colInv0, invDet); + aInv.col1 = _mm_mul_ps(colInv1, invDet); + aInv.col2 = _mm_mul_ps(colInv2, invDet); + aInv.col3 = M34Mul33V3(aInv, V3Neg(a.col3)); + return aInv; +} + +PX_FORCE_INLINE Mat33V M34Trnsps33(const Mat34V& a) +{ + Vec3V col0 = a.col0, col1 = a.col1, col2 = a.col2; + V3Transpose(col0, col1, col2); + return Mat33V(col0, col1, col2); +} + +////////////////////////////////// +// MAT44V +////////////////////////////////// + +PX_FORCE_INLINE Vec4V M44MulV4(const Mat44V& a, const Vec4V b) +{ + const FloatV x = V4GetX(b); + const FloatV y = V4GetY(b); + const FloatV z = V4GetZ(b); + const FloatV w = V4GetW(b); + + const Vec4V v0 = V4Scale(a.col0, x); + const Vec4V v1 = V4Scale(a.col1, y); + const Vec4V v2 = V4Scale(a.col2, z); + const Vec4V v3 = V4Scale(a.col3, w); + const Vec4V v0PlusV1 = V4Add(v0, v1); + const Vec4V v0PlusV1Plusv2 = V4Add(v0PlusV1, v2); + return V4Add(v0PlusV1Plusv2, v3); +} + +PX_FORCE_INLINE Vec4V M44TrnspsMulV4(const Mat44V& a, const Vec4V b) +{ + Vec4V v0 = V4Mul(a.col0, b); + Vec4V v1 = V4Mul(a.col1, b); + Vec4V v2 = V4Mul(a.col2, b); + Vec4V v3 = V4Mul(a.col3, b); + V4Transpose(v0, v1, v2, v3); + return V4Add(V4Add(v0, v1), V4Add(v2, v3)); +} + +PX_FORCE_INLINE Mat44V M44MulM44(const Mat44V& a, const Mat44V& b) +{ + return Mat44V(M44MulV4(a, b.col0), M44MulV4(a, b.col1), M44MulV4(a, b.col2), M44MulV4(a, b.col3)); +} + +PX_FORCE_INLINE Mat44V M44Add(const Mat44V& a, const Mat44V& b) +{ + return Mat44V(V4Add(a.col0, b.col0), V4Add(a.col1, b.col1), V4Add(a.col2, b.col2), V4Add(a.col3, b.col3)); +} + +PX_FORCE_INLINE Mat44V M44Trnsps(const Mat44V& a) +{ + Vec4V col0 = a.col0, col1 = a.col1, col2 = a.col2, col3 = a.col3; + V4Transpose(col0, col1, col2, col3); + return Mat44V(col0, col1, col2, col3); +} + +PX_FORCE_INLINE Mat44V M44Inverse(const Mat44V& a) +{ + __m128 minor0, minor1, minor2, minor3; + __m128 row0, row1, row2, row3; + __m128 det, tmp1; + + tmp1 = V4Zero(); + row1 = V4Zero(); + row3 = V4Zero(); + + row0 = a.col0; + row1 = _mm_shuffle_ps(a.col1, a.col1, _MM_SHUFFLE(1, 0, 3, 2)); + row2 = a.col2; + row3 = _mm_shuffle_ps(a.col3, a.col3, _MM_SHUFFLE(1, 0, 3, 2)); + + tmp1 = _mm_mul_ps(row2, row3); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1); + minor0 = _mm_mul_ps(row1, tmp1); + minor1 = _mm_mul_ps(row0, tmp1); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E); + minor0 = _mm_sub_ps(_mm_mul_ps(row1, tmp1), minor0); + minor1 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor1); + minor1 = _mm_shuffle_ps(minor1, minor1, 0x4E); + + tmp1 = _mm_mul_ps(row1, row2); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1); + minor0 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor0); + minor3 = _mm_mul_ps(row0, tmp1); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E); + minor0 = _mm_sub_ps(minor0, _mm_mul_ps(row3, tmp1)); + minor3 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor3); + minor3 = _mm_shuffle_ps(minor3, minor3, 0x4E); + + tmp1 = _mm_mul_ps(_mm_shuffle_ps(row1, row1, 0x4E), row3); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1); + row2 = _mm_shuffle_ps(row2, row2, 0x4E); + minor0 = _mm_add_ps(_mm_mul_ps(row2, tmp1), minor0); + minor2 = _mm_mul_ps(row0, tmp1); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E); + minor0 = _mm_sub_ps(minor0, _mm_mul_ps(row2, tmp1)); + minor2 = _mm_sub_ps(_mm_mul_ps(row0, tmp1), minor2); + minor2 = _mm_shuffle_ps(minor2, minor2, 0x4E); + + tmp1 = _mm_mul_ps(row0, row1); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1); + minor2 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor2); + minor3 = _mm_sub_ps(_mm_mul_ps(row2, tmp1), minor3); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E); + minor2 = _mm_sub_ps(_mm_mul_ps(row3, tmp1), minor2); + minor3 = _mm_sub_ps(minor3, _mm_mul_ps(row2, tmp1)); + + tmp1 = _mm_mul_ps(row0, row3); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1); + minor1 = _mm_sub_ps(minor1, _mm_mul_ps(row2, tmp1)); + minor2 = _mm_add_ps(_mm_mul_ps(row1, tmp1), minor2); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E); + minor1 = _mm_add_ps(_mm_mul_ps(row2, tmp1), minor1); + minor2 = _mm_sub_ps(minor2, _mm_mul_ps(row1, tmp1)); + + tmp1 = _mm_mul_ps(row0, row2); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0xB1); + minor1 = _mm_add_ps(_mm_mul_ps(row3, tmp1), minor1); + minor3 = _mm_sub_ps(minor3, _mm_mul_ps(row1, tmp1)); + tmp1 = _mm_shuffle_ps(tmp1, tmp1, 0x4E); + minor1 = _mm_sub_ps(minor1, _mm_mul_ps(row3, tmp1)); + minor3 = _mm_add_ps(_mm_mul_ps(row1, tmp1), minor3); + + det = _mm_mul_ps(row0, minor0); + det = _mm_add_ps(_mm_shuffle_ps(det, det, 0x4E), det); + det = _mm_add_ss(_mm_shuffle_ps(det, det, 0xB1), det); + tmp1 = _mm_rcp_ss(det); +#if 0 + det = _mm_sub_ss(_mm_add_ss(tmp1, tmp1), _mm_mul_ss(det, _mm_mul_ss(tmp1, tmp1))); + det = _mm_shuffle_ps(det, det, 0x00); +#else + det = _mm_shuffle_ps(tmp1, tmp1, _MM_SHUFFLE(0, 0, 0, 0)); +#endif + + minor0 = _mm_mul_ps(det, minor0); + minor1 = _mm_mul_ps(det, minor1); + minor2 = _mm_mul_ps(det, minor2); + minor3 = _mm_mul_ps(det, minor3); + Mat44V invTrans(minor0, minor1, minor2, minor3); + return M44Trnsps(invTrans); +} + +PX_FORCE_INLINE Vec4V V4LoadXYZW(const PxF32& x, const PxF32& y, const PxF32& z, const PxF32& w) +{ + return _mm_set_ps(w, z, y, x); +} + +PX_FORCE_INLINE VecU32V V4U32Sel(const BoolV c, const VecU32V a, const VecU32V b) +{ + return internalWindowsSimd::m128_I2F( + _mm_or_si128(_mm_andnot_si128(internalWindowsSimd::m128_F2I(c), internalWindowsSimd::m128_F2I(b)), + _mm_and_si128(internalWindowsSimd::m128_F2I(c), internalWindowsSimd::m128_F2I(a)))); +} + +PX_FORCE_INLINE VecU32V V4U32or(VecU32V a, VecU32V b) +{ + return internalWindowsSimd::m128_I2F(_mm_or_si128(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b))); +} + +PX_FORCE_INLINE VecU32V V4U32xor(VecU32V a, VecU32V b) +{ + return internalWindowsSimd::m128_I2F( + _mm_xor_si128(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b))); +} + +PX_FORCE_INLINE VecU32V V4U32and(VecU32V a, VecU32V b) +{ + return internalWindowsSimd::m128_I2F( + _mm_and_si128(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b))); +} + +PX_FORCE_INLINE VecU32V V4U32Andc(VecU32V a, VecU32V b) +{ + return internalWindowsSimd::m128_I2F( + _mm_andnot_si128(internalWindowsSimd::m128_F2I(b), internalWindowsSimd::m128_F2I(a))); +} + +PX_FORCE_INLINE VecI32V U4Load(const PxU32 i) +{ + return _mm_load1_ps((PxF32*)&i); +} + +PX_FORCE_INLINE VecU32V U4LoadU(const PxU32* i) +{ + return _mm_loadu_ps((PxF32*)i); +} + +PX_FORCE_INLINE VecU32V U4LoadA(const PxU32* i) +{ + ASSERT_ISALIGNED16(i); + return _mm_load_ps((PxF32*)i); +} + +PX_FORCE_INLINE VecI32V I4LoadXYZW(const PxI32& x, const PxI32& y, const PxI32& z, const PxI32& w) +{ + return internalWindowsSimd::m128_I2F(_mm_set_epi32(w, z, y, x)); +} + +PX_FORCE_INLINE VecI32V I4Load(const PxI32 i) +{ + return _mm_load1_ps((PxF32*)&i); +} + +PX_FORCE_INLINE VecI32V I4LoadU(const PxI32* i) +{ + return _mm_loadu_ps((PxF32*)i); +} + +PX_FORCE_INLINE VecI32V I4LoadA(const PxI32* i) +{ + ASSERT_ISALIGNED16(i); + return _mm_load_ps((PxF32*)i); +} + +PX_FORCE_INLINE VecI32V VecI32V_Add(const VecI32VArg a, const VecI32VArg b) +{ + return internalWindowsSimd::m128_I2F( + _mm_add_epi32(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b))); +} + +PX_FORCE_INLINE VecI32V VecI32V_Sub(const VecI32VArg a, const VecI32VArg b) +{ + return internalWindowsSimd::m128_I2F( + _mm_sub_epi32(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b))); +} + +PX_FORCE_INLINE BoolV VecI32V_IsGrtr(const VecI32VArg a, const VecI32VArg b) +{ + return internalWindowsSimd::m128_I2F( + _mm_cmpgt_epi32(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b))); +} + +PX_FORCE_INLINE BoolV VecI32V_IsEq(const VecI32VArg a, const VecI32VArg b) +{ + return internalWindowsSimd::m128_I2F( + _mm_cmpeq_epi32(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b))); +} + +PX_FORCE_INLINE VecI32V V4I32Sel(const BoolV c, const VecI32V a, const VecI32V b) +{ + return V4U32Sel(c, a, b); +} + +PX_FORCE_INLINE VecI32V VecI32V_Zero() +{ + return V4Zero(); +} + +PX_FORCE_INLINE VecI32V VecI32V_One() +{ + return I4Load(1); +} + +PX_FORCE_INLINE VecI32V VecI32V_Two() +{ + return I4Load(2); +} + +PX_FORCE_INLINE VecI32V VecI32V_MinusOne() +{ + return I4Load(-1); +} + +PX_FORCE_INLINE VecU32V U4Zero() +{ + return U4Load(0); +} + +PX_FORCE_INLINE VecU32V U4One() +{ + return U4Load(1); +} + +PX_FORCE_INLINE VecU32V U4Two() +{ + return U4Load(2); +} + +PX_FORCE_INLINE VecI32V VecI32V_Sel(const BoolV c, const VecI32VArg a, const VecI32VArg b) +{ + PX_ASSERT(vecMathTests::allElementsEqualBoolV(c, BTTTT()) || + vecMathTests::allElementsEqualBoolV(c, BFFFF())); + return _mm_or_ps(_mm_andnot_ps(c, b), _mm_and_ps(c, a)); +} + +PX_FORCE_INLINE VecShiftV VecI32V_PrepareShift(const VecI32VArg shift) +{ + VecShiftV preparedShift; + preparedShift.shift = _mm_or_ps(_mm_andnot_ps(BTFFF(), VecI32V_Zero()), _mm_and_ps(BTFFF(), shift)); + return preparedShift; +} + +PX_FORCE_INLINE VecI32V VecI32V_LeftShift(const VecI32VArg a, const VecShiftVArg count) +{ + return internalWindowsSimd::m128_I2F( + _mm_sll_epi32(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(count.shift))); +} + +PX_FORCE_INLINE VecI32V VecI32V_RightShift(const VecI32VArg a, const VecShiftVArg count) +{ + return internalWindowsSimd::m128_I2F( + _mm_srl_epi32(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(count.shift))); +} + +PX_FORCE_INLINE VecI32V VecI32V_LeftShift(const VecI32VArg a, const PxU32 count) +{ + return internalWindowsSimd::m128_I2F( + _mm_slli_epi32(internalWindowsSimd::m128_F2I(a), count)); +} + +PX_FORCE_INLINE VecI32V VecI32V_RightShift(const VecI32VArg a, const PxU32 count) +{ + return internalWindowsSimd::m128_I2F( + _mm_srai_epi32(internalWindowsSimd::m128_F2I(a), count)); +} + +PX_FORCE_INLINE VecI32V VecI32V_And(const VecI32VArg a, const VecI32VArg b) +{ + return internalWindowsSimd::m128_I2F( + _mm_and_si128(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b))); +} + +PX_FORCE_INLINE VecI32V VecI32V_Or(const VecI32VArg a, const VecI32VArg b) +{ + return internalWindowsSimd::m128_I2F( + _mm_or_si128(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b))); +} + +PX_FORCE_INLINE VecI32V VecI32V_GetX(const VecI32VArg a) +{ + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)); +} + +PX_FORCE_INLINE VecI32V VecI32V_GetY(const VecI32VArg a) +{ + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)); +} + +PX_FORCE_INLINE VecI32V VecI32V_GetZ(const VecI32VArg a) +{ + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)); +} + +PX_FORCE_INLINE VecI32V VecI32V_GetW(const VecI32VArg a) +{ + return _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3)); +} + +PX_FORCE_INLINE void PxI32_From_VecI32V(const VecI32VArg a, PxI32* i) +{ + _mm_store_ss((PxF32*)i, a); +} + +PX_FORCE_INLINE VecI32V VecI32V_From_BoolV(const BoolVArg a) +{ + return a; +} + +PX_FORCE_INLINE VecU32V VecU32V_From_BoolV(const BoolVArg a) +{ + return a; +} + +PX_FORCE_INLINE VecI32V VecI32V_Merge(const VecI32VArg a, const VecI32VArg b, const VecI32VArg c, const VecI32VArg d) +{ + const __m128 xw = _mm_move_ss(b, a); // y, y, y, x + const __m128 yz = _mm_move_ss(c, d); // z, z, z, w + return _mm_shuffle_ps(xw, yz, _MM_SHUFFLE(0, 2, 1, 0)); +} + +PX_FORCE_INLINE void V4U32StoreAligned(VecU32V val, VecU32V* address) +{ + *address = val; +} + +PX_FORCE_INLINE Vec4V V4Andc(const Vec4V a, const VecU32V b) +{ + VecU32V result32(a); + result32 = V4U32Andc(result32, b); + return Vec4V(result32); +} + +PX_FORCE_INLINE VecU32V V4IsGrtrV32u(const Vec4V a, const Vec4V b) +{ + return V4IsGrtr(a, b); +} + +PX_FORCE_INLINE VecU16V V4U16LoadAligned(VecU16V* addr) +{ + return *addr; +} + +PX_FORCE_INLINE VecU16V V4U16LoadUnaligned(VecU16V* addr) +{ + return *addr; +} + +// unsigned compares are not supported on x86 +PX_FORCE_INLINE VecU16V V4U16CompareGt(VecU16V a, VecU16V b) +{ + // _mm_cmpgt_epi16 doesn't work for unsigned values unfortunately + // return m128_I2F(_mm_cmpgt_epi16(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b))); + VecU16V result; + result.m128_u16[0] = PxU16((a).m128_u16[0] > (b).m128_u16[0]); + result.m128_u16[1] = PxU16((a).m128_u16[1] > (b).m128_u16[1]); + result.m128_u16[2] = PxU16((a).m128_u16[2] > (b).m128_u16[2]); + result.m128_u16[3] = PxU16((a).m128_u16[3] > (b).m128_u16[3]); + result.m128_u16[4] = PxU16((a).m128_u16[4] > (b).m128_u16[4]); + result.m128_u16[5] = PxU16((a).m128_u16[5] > (b).m128_u16[5]); + result.m128_u16[6] = PxU16((a).m128_u16[6] > (b).m128_u16[6]); + result.m128_u16[7] = PxU16((a).m128_u16[7] > (b).m128_u16[7]); + return result; +} + +PX_FORCE_INLINE VecU16V V4I16CompareGt(VecU16V a, VecU16V b) +{ + return internalWindowsSimd::m128_I2F( + _mm_cmpgt_epi16(internalWindowsSimd::m128_F2I(a), internalWindowsSimd::m128_F2I(b))); +} + +PX_FORCE_INLINE Vec4V Vec4V_From_VecU32V(VecU32V a) +{ + Vec4V result = V4LoadXYZW(PxF32(a.m128_u32[0]), PxF32(a.m128_u32[1]), PxF32(a.m128_u32[2]), PxF32(a.m128_u32[3])); + return result; +} + +PX_FORCE_INLINE Vec4V Vec4V_From_VecI32V(VecI32V a) +{ + return _mm_cvtepi32_ps(internalWindowsSimd::m128_F2I(a)); +} + +PX_FORCE_INLINE VecI32V VecI32V_From_Vec4V(Vec4V a) +{ + return internalWindowsSimd::m128_I2F(_mm_cvttps_epi32(a)); +} + +PX_FORCE_INLINE Vec4V Vec4V_ReinterpretFrom_VecU32V(VecU32V a) +{ + return Vec4V(a); +} + +PX_FORCE_INLINE Vec4V Vec4V_ReinterpretFrom_VecI32V(VecI32V a) +{ + return Vec4V(a); +} + +PX_FORCE_INLINE VecU32V VecU32V_ReinterpretFrom_Vec4V(Vec4V a) +{ + return VecU32V(a); +} + +PX_FORCE_INLINE VecI32V VecI32V_ReinterpretFrom_Vec4V(Vec4V a) +{ + return VecI32V(a); +} + +template +PX_FORCE_INLINE VecU32V V4U32SplatElement(VecU32V a) +{ + return internalWindowsSimd::m128_I2F( + _mm_shuffle_epi32(internalWindowsSimd::m128_F2I(a), _MM_SHUFFLE(index, index, index, index))); +} + +template +PX_FORCE_INLINE Vec4V V4SplatElement(Vec4V a) +{ + return internalWindowsSimd::m128_I2F( + _mm_shuffle_epi32(internalWindowsSimd::m128_F2I(a), _MM_SHUFFLE(index, index, index, index))); +} + +PX_FORCE_INLINE VecU32V U4LoadXYZW(PxU32 x, PxU32 y, PxU32 z, PxU32 w) +{ + VecU32V result; + result.m128_u32[0] = x; + result.m128_u32[1] = y; + result.m128_u32[2] = z; + result.m128_u32[3] = w; + return result; +} + +PX_FORCE_INLINE Vec4V V4ConvertFromI32V(const VecI32V in) +{ + return _mm_cvtepi32_ps(internalWindowsSimd::m128_F2I(in)); +} + +} // namespace aos +} // namespace physx + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/windows/PxWindowsIntrinsics.h b/Source/ThirdParty/PhysX/foundation/windows/PxWindowsIntrinsics.h index 804c20b0d..9d79d3568 100644 --- a/Source/ThirdParty/PhysX/foundation/windows/PxWindowsIntrinsics.h +++ b/Source/ThirdParty/PhysX/foundation/windows/PxWindowsIntrinsics.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,166 +22,151 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXFOUNDATION_PXWINDOWSINTRINSICS_H -#define PXFOUNDATION_PXWINDOWSINTRINSICS_H +#ifndef PX_WINDOWS_INTRINSICS_H +#define PX_WINDOWS_INTRINSICS_H -#include "foundation/Px.h" -#include "foundation/PxSharedAssert.h" +#include "foundation/PxAssert.h" + +// this file is for internal intrinsics - that is, intrinsics that are used in +// cross platform code but do not appear in the API #if !PX_WINDOWS_FAMILY #error "This file should only be included by Windows builds!!" #endif +#pragma warning(push) +//'symbol' is not defined as a preprocessor macro, replacing with '0' for 'directives' +#pragma warning(disable : 4668) +#if PX_VC == 10 +#pragma warning(disable : 4987) // nonstandard extension used: 'throw (...)' +#endif +#include +#pragma warning(pop) + +#pragma warning(push) +#pragma warning(disable : 4985) // 'symbol name': attributes not present on previous declaration #include +#pragma warning(pop) + #include +// do not include for ARM target +#if !PX_ARM && !PX_A64 +#include +#endif + +#pragma intrinsic(_BitScanForward) +#pragma intrinsic(_BitScanReverse) #if !PX_DOXYGEN namespace physx { -namespace intrinsics -{ #endif -//! \brief platform-specific absolute value -PX_CUDA_CALLABLE PX_FORCE_INLINE float abs(float a) +/* +* Implements a memory barrier +*/ +PX_FORCE_INLINE void PxMemoryBarrier() { - return ::fabsf(a); + _ReadWriteBarrier(); + /* long Barrier; + __asm { + xchg Barrier, eax + }*/ } -//! \brief platform-specific select float -PX_CUDA_CALLABLE PX_FORCE_INLINE float fsel(float a, float b, float c) +/*! +Returns the index of the highest set bit. Not valid for zero arg. +*/ +PX_FORCE_INLINE uint32_t PxHighestSetBitUnsafe(uint32_t v) { - return (a >= 0.0f) ? b : c; + unsigned long retval; + _BitScanReverse(&retval, v); + return retval; } -//! \brief platform-specific sign -PX_CUDA_CALLABLE PX_FORCE_INLINE float sign(float a) +/*! +Returns the index of the highest set bit. Undefined for zero arg. +*/ +PX_FORCE_INLINE uint32_t PxLowestSetBitUnsafe(uint32_t v) { - return (a >= 0.0f) ? 1.0f : -1.0f; + unsigned long retval; + _BitScanForward(&retval, v); + return retval; } -//! \brief platform-specific reciprocal -PX_CUDA_CALLABLE PX_FORCE_INLINE float recip(float a) +/*! +Returns the number of leading zeros in v. Returns 32 for v=0. +*/ +PX_FORCE_INLINE uint32_t PxCountLeadingZeros(uint32_t v) { - return 1.0f / a; + if(v) + { + unsigned long bsr = (unsigned long)-1; + _BitScanReverse(&bsr, v); + return 31 - bsr; + } + else + return 32; } -//! \brief platform-specific reciprocal estimate -PX_CUDA_CALLABLE PX_FORCE_INLINE float recipFast(float a) +/*! +Prefetch aligned cache size around \c ptr+offset. +*/ +#if !PX_ARM && !PX_A64 +PX_FORCE_INLINE void PxPrefetchLine(const void* ptr, uint32_t offset = 0) { - return 1.0f / a; + // cache line on X86/X64 is 64-bytes so a 128-byte prefetch would require 2 prefetches. + // However, we can only dispatch a limited number of prefetch instructions so we opt to prefetch just 1 cache line + /*_mm_prefetch(((const char*)ptr + offset), _MM_HINT_T0);*/ + // We get slightly better performance prefetching to non-temporal addresses instead of all cache levels + _mm_prefetch(((const char*)ptr + offset), _MM_HINT_NTA); } - -//! \brief platform-specific square root -PX_CUDA_CALLABLE PX_FORCE_INLINE float sqrt(float a) -{ - return ::sqrtf(a); -} - -//! \brief platform-specific reciprocal square root -PX_CUDA_CALLABLE PX_FORCE_INLINE float recipSqrt(float a) -{ - return 1.0f / ::sqrtf(a); -} - -//! \brief platform-specific reciprocal square root estimate -PX_CUDA_CALLABLE PX_FORCE_INLINE float recipSqrtFast(float a) -{ - return 1.0f / ::sqrtf(a); -} - -//! \brief platform-specific sine -PX_CUDA_CALLABLE PX_FORCE_INLINE float sin(float a) -{ - return ::sinf(a); -} - -//! \brief platform-specific cosine -PX_CUDA_CALLABLE PX_FORCE_INLINE float cos(float a) -{ - return ::cosf(a); -} - -//! \brief platform-specific minimum -PX_CUDA_CALLABLE PX_FORCE_INLINE float selectMin(float a, float b) -{ - return a < b ? a : b; -} - -//! \brief platform-specific maximum -PX_CUDA_CALLABLE PX_FORCE_INLINE float selectMax(float a, float b) -{ - return a > b ? a : b; -} - -//! \brief platform-specific finiteness check (not INF or NAN) -PX_CUDA_CALLABLE PX_FORCE_INLINE bool isFinite(float a) -{ -#ifdef __CUDACC__ - return !!isfinite(a); #else - return (0 == ((_FPCLASS_SNAN | _FPCLASS_QNAN | _FPCLASS_NINF | _FPCLASS_PINF) & _fpclass(a))); -#endif -} - -//! \brief platform-specific finiteness check (not INF or NAN) -PX_CUDA_CALLABLE PX_FORCE_INLINE bool isFinite(double a) +PX_FORCE_INLINE void PxPrefetchLine(const void* ptr, uint32_t offset = 0) { -#ifdef __CUDACC__ - return !!isfinite(a); + // arm does have 32b cache line size + __prefetch(((const char*)ptr + offset)); +} +#endif + +/*! +Prefetch \c count bytes starting at \c ptr. +*/ +#if !PX_ARM +PX_FORCE_INLINE void PxPrefetch(const void* ptr, uint32_t count = 1) +{ + const char* cp = (char*)ptr; + uint64_t p = size_t(ptr); + uint64_t startLine = p >> 6, endLine = (p + count - 1) >> 6; + uint64_t lines = endLine - startLine + 1; + do + { + PxPrefetchLine(cp); + cp += 64; + } while(--lines); +} #else - return (0 == ((_FPCLASS_SNAN | _FPCLASS_QNAN | _FPCLASS_NINF | _FPCLASS_PINF) & _fpclass(a))); +PX_FORCE_INLINE void PxPrefetch(const void* ptr, uint32_t count = 1) +{ + const char* cp = (char*)ptr; + uint32_t p = size_t(ptr); + uint32_t startLine = p >> 5, endLine = (p + count - 1) >> 5; + uint32_t lines = endLine - startLine + 1; + do + { + PxPrefetchLine(cp); + cp += 32; + } while(--lines); +} #endif -} - -/*! -Sets \c count bytes starting at \c dst to zero. -*/ -PX_FORCE_INLINE void* memZero(void* dest, uint32_t count) -{ - return memset(dest, 0, count); -} - -/*! -Sets \c count bytes starting at \c dst to \c c. -*/ -PX_FORCE_INLINE void* memSet(void* dest, int32_t c, uint32_t count) -{ - return memset(dest, c, count); -} - -/*! -Copies \c count bytes from \c src to \c dst. User memMove if regions overlap. -*/ -PX_FORCE_INLINE void* memCopy(void* dest, const void* src, uint32_t count) -{ - return memcpy(dest, src, count); -} - -/*! -Copies \c count bytes from \c src to \c dst. Supports overlapping regions. -*/ -PX_FORCE_INLINE void* memMove(void* dest, const void* src, uint32_t count) -{ - return memmove(dest, src, count); -} - -/*! -Set 128B to zero starting at \c dst+offset. Must be aligned. -*/ -PX_FORCE_INLINE void memZero128(void* dest, uint32_t offset = 0) -{ - PX_SHARED_ASSERT(((size_t(dest) + offset) & 0x7f) == 0); - memSet(reinterpret_cast(dest) + offset, 0, 128); -} #if !PX_DOXYGEN -} // namespace intrinsics } // namespace physx #endif -#endif // #ifndef PXFOUNDATION_PXWINDOWSINTRINSICS_H +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/windows/PxWindowsMathIntrinsics.h b/Source/ThirdParty/PhysX/foundation/windows/PxWindowsMathIntrinsics.h new file mode 100644 index 000000000..1eed28188 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/windows/PxWindowsMathIntrinsics.h @@ -0,0 +1,179 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_WINDOWS_MATH_INTRINSICS_H +#define PX_WINDOWS_MATH_INTRINSICS_H + +#include "foundation/Px.h" +#include "foundation/PxAssert.h" + +#if !PX_WINDOWS_FAMILY +#error "This file should only be included by Windows builds!!" +#endif + +#include +#include + +#if !PX_DOXYGEN +namespace physx +{ +namespace intrinsics +{ +#endif + +//! \brief platform-specific absolute value +PX_CUDA_CALLABLE PX_FORCE_INLINE float abs(float a) +{ + return ::fabsf(a); +} + +//! \brief platform-specific select float +PX_CUDA_CALLABLE PX_FORCE_INLINE float fsel(float a, float b, float c) +{ + return (a >= 0.0f) ? b : c; +} + +//! \brief platform-specific sign +PX_CUDA_CALLABLE PX_FORCE_INLINE float sign(float a) +{ + return (a >= 0.0f) ? 1.0f : -1.0f; +} + +//! \brief platform-specific reciprocal +PX_CUDA_CALLABLE PX_FORCE_INLINE float recip(float a) +{ + return 1.0f / a; +} + +//! \brief platform-specific reciprocal estimate +PX_CUDA_CALLABLE PX_FORCE_INLINE float recipFast(float a) +{ + return 1.0f / a; +} + +//! \brief platform-specific square root +PX_CUDA_CALLABLE PX_FORCE_INLINE float sqrt(float a) +{ + return ::sqrtf(a); +} + +//! \brief platform-specific reciprocal square root +PX_CUDA_CALLABLE PX_FORCE_INLINE float recipSqrt(float a) +{ + return 1.0f / ::sqrtf(a); +} + +//! \brief platform-specific reciprocal square root estimate +PX_CUDA_CALLABLE PX_FORCE_INLINE float recipSqrtFast(float a) +{ + return 1.0f / ::sqrtf(a); +} + +//! \brief platform-specific sine +PX_CUDA_CALLABLE PX_FORCE_INLINE float sin(float a) +{ + return ::sinf(a); +} + +//! \brief platform-specific cosine +PX_CUDA_CALLABLE PX_FORCE_INLINE float cos(float a) +{ + return ::cosf(a); +} + +//! \brief platform-specific minimum +PX_CUDA_CALLABLE PX_FORCE_INLINE float selectMin(float a, float b) +{ + return a < b ? a : b; +} + +//! \brief platform-specific maximum +PX_CUDA_CALLABLE PX_FORCE_INLINE float selectMax(float a, float b) +{ + return a > b ? a : b; +} + +//! \brief platform-specific finiteness check (not INF or NAN) +PX_CUDA_CALLABLE PX_FORCE_INLINE bool isFinite(float a) +{ +#ifdef __CUDACC__ + return !!isfinite(a); +#else + return (0 == ((_FPCLASS_SNAN | _FPCLASS_QNAN | _FPCLASS_NINF | _FPCLASS_PINF) & _fpclass(a))); +#endif +} + +//! \brief platform-specific finiteness check (not INF or NAN) +PX_CUDA_CALLABLE PX_FORCE_INLINE bool isFinite(double a) +{ +#ifdef __CUDACC__ + return !!isfinite(a); +#else + return (0 == ((_FPCLASS_SNAN | _FPCLASS_QNAN | _FPCLASS_NINF | _FPCLASS_PINF) & _fpclass(a))); +#endif +} + +/*! +Sets \c count bytes starting at \c dst to zero. +*/ +PX_FORCE_INLINE void* memZero(void* dest, uint32_t count) +{ + return memset(dest, 0, count); +} + +/*! +Sets \c count bytes starting at \c dst to \c c. +*/ +PX_FORCE_INLINE void* memSet(void* dest, int32_t c, uint32_t count) +{ + return memset(dest, c, count); +} + +/*! +Copies \c count bytes from \c src to \c dst. User memMove if regions overlap. +*/ +PX_FORCE_INLINE void* memCopy(void* dest, const void* src, uint32_t count) +{ + return memcpy(dest, src, count); +} + +/*! +Copies \c count bytes from \c src to \c dst. Supports overlapping regions. +*/ +PX_FORCE_INLINE void* memMove(void* dest, const void* src, uint32_t count) +{ + return memmove(dest, src, count); +} + +#if !PX_DOXYGEN +} // namespace intrinsics +} // namespace physx +#endif + +#endif + diff --git a/Source/ThirdParty/PhysX/foundation/windows/PxWindowsTrigConstants.h b/Source/ThirdParty/PhysX/foundation/windows/PxWindowsTrigConstants.h new file mode 100644 index 000000000..673244d03 --- /dev/null +++ b/Source/ThirdParty/PhysX/foundation/windows/PxWindowsTrigConstants.h @@ -0,0 +1,60 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_WINDOWS_TRIG_CONSTANTS_H +#define PX_WINDOWS_TRIG_CONSTANTS_H + +namespace physx +{ +namespace aos +{ + +#define PX_GLOBALCONST extern const __declspec(selectany) + +__declspec(align(16)) struct PX_VECTORF32 +{ + float f[4]; +}; + +PX_GLOBALCONST PX_VECTORF32 g_PXSinCoefficients0 = { { 1.0f, -0.166666667f, 8.333333333e-3f, -1.984126984e-4f } }; +PX_GLOBALCONST PX_VECTORF32 +g_PXSinCoefficients1 = { { 2.755731922e-6f, -2.505210839e-8f, 1.605904384e-10f, -7.647163732e-13f } }; +PX_GLOBALCONST PX_VECTORF32 +g_PXSinCoefficients2 = { { 2.811457254e-15f, -8.220635247e-18f, 1.957294106e-20f, -3.868170171e-23f } }; +PX_GLOBALCONST PX_VECTORF32 g_PXCosCoefficients0 = { { 1.0f, -0.5f, 4.166666667e-2f, -1.388888889e-3f } }; +PX_GLOBALCONST PX_VECTORF32 +g_PXCosCoefficients1 = { { 2.480158730e-5f, -2.755731922e-7f, 2.087675699e-9f, -1.147074560e-11f } }; +PX_GLOBALCONST PX_VECTORF32 +g_PXCosCoefficients2 = { { 4.779477332e-14f, -1.561920697e-16f, 4.110317623e-19f, -8.896791392e-22f } }; +PX_GLOBALCONST PX_VECTORF32 g_PXReciprocalTwoPi = { { PxInvTwoPi, PxInvTwoPi, PxInvTwoPi, PxInvTwoPi } }; +PX_GLOBALCONST PX_VECTORF32 g_PXTwoPi = { { PxTwoPi, PxTwoPi, PxTwoPi, PxTwoPi } }; + +} // namespace aos +} // namespace physx + +#endif diff --git a/Source/ThirdParty/PhysX/geometry/PxBVH.h b/Source/ThirdParty/PhysX/geometry/PxBVH.h new file mode 100644 index 000000000..70d40e5c5 --- /dev/null +++ b/Source/ThirdParty/PhysX/geometry/PxBVH.h @@ -0,0 +1,329 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_BVH_H +#define PX_BVH_H +/** \addtogroup geomutils +@{ +*/ + +#include "common/PxBase.h" +#include "foundation/PxTransform.h" +#include "foundation/PxBounds3.h" +#include "geometry/PxGeometryQueryFlags.h" +#include "geometry/PxReportCallback.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +class PxGeometry; + +/** +\brief Class representing a bounding volume hierarchy. + +PxBVH can be provided to PxScene::addActor. In this case the scene query +pruning structure inside PhysX SDK will store/update one bound per actor. +The scene queries against such an actor will query actor bounds and then +make a local space query against the provided BVH, which is in actor's +local space. + +PxBVH can also be used as a standalone data-structure for arbitrary +purposes, unrelated to PxScene / PxActor. + +@see PxScene::addActor +*/ +class PxBVH : public PxBase +{ +public: + + /** + \brief Raycast test against a BVH. + + \param[in] origin The origin of the ray. + \param[in] unitDir Normalized direction of the ray. + \param[in] maxDist Maximum ray length, has to be in the [0, inf) range + \param[in] maxHits Max number of returned hits = size of 'rayHits' buffer + \param[out] rayHits Raycast hits information, bounds indices + \return Number of hits + @deprecated + */ + PX_DEPRECATED virtual PxU32 raycast(const PxVec3& origin, const PxVec3& unitDir, PxReal maxDist, PxU32 maxHits, PxU32* PX_RESTRICT rayHits) const = 0; + + /** + \brief Sweep test against a BVH. + + \param[in] aabb The axis aligned bounding box to sweep + \param[in] unitDir Normalized direction of the sweep. + \param[in] maxDist Maximum sweep length, has to be in the [0, inf) range + \param[in] maxHits Max number of returned hits = size of 'sweepHits' buffer + \param[out] sweepHits Sweep hits information, bounds indices + \return Number of hits + @deprecated + */ + PX_DEPRECATED virtual PxU32 sweep(const PxBounds3& aabb, const PxVec3& unitDir, PxReal maxDist, PxU32 maxHits, PxU32* PX_RESTRICT sweepHits) const = 0; + + /** + \brief AABB overlap test against a BVH. + + \param[in] aabb The axis aligned bounding box + \param[in] maxHits Max number of returned hits = size of 'overlapHits' buffer + \param[out] overlapHits Overlap hits information, bounds indices + \return Number of hits + @deprecated + */ + PX_DEPRECATED virtual PxU32 overlap(const PxBounds3& aabb, PxU32 maxHits, PxU32* PX_RESTRICT overlapHits) const = 0; + + struct RaycastCallback + { + RaycastCallback() {} + virtual ~RaycastCallback() {} + + // Reports one raycast or sweep hit. + // boundsIndex [in] Index of touched bounds + // distance [in/out] Impact distance. Shrinks the ray if written out. + // return false to abort the query + virtual bool reportHit(PxU32 boundsIndex, PxReal& distance) = 0; + }; + + struct OverlapCallback + { + OverlapCallback() {} + virtual ~OverlapCallback() {} + + // Reports one overlap hit. + // boundsIndex [in] Index of touched bounds + // return false to abort the query + virtual bool reportHit(PxU32 boundsIndex) = 0; + }; + + struct TraversalCallback + { + TraversalCallback() {} + virtual ~TraversalCallback() {} + + // Reports one visited node. + // bounds [in] node bounds + // return true to continue traversing this branch + virtual bool visitNode(const PxBounds3& bounds) = 0; + + // Reports one validated leaf node. Called on leaf nodes after visitNode returns true on them. + // nbPrims [in] number of primitives in the node + // prims [in] primitives in the node (nbPrims entries) + // return false to abort the query + virtual bool reportLeaf(PxU32 nbPrims, const PxU32* prims) = 0; + }; + + /** + \brief Raycast test against a BVH. + + \param[in] origin The origin of the ray. + \param[in] unitDir Normalized direction of the ray. + \param[in] maxDist Maximum ray length, has to be in the [0, inf) range + \param[in] cb Raycast callback, called once per hit + \param[in] queryFlags Optional flags controlling the query. + \return false if query has been aborted + */ + virtual bool raycast(const PxVec3& origin, const PxVec3& unitDir, float maxDist, RaycastCallback& cb, PxGeometryQueryFlags queryFlags = PxGeometryQueryFlag::eDEFAULT) const = 0; + + /** + \brief Sweep test against a BVH. + + \param[in] geom The query volume + \param[in] pose The pose of the query volume + \param[in] unitDir Normalized direction of the sweep. + \param[in] maxDist Maximum sweep length, has to be in the [0, inf) range + \param[in] cb Raycast callback, called once per hit + \param[in] queryFlags Optional flags controlling the query. + \return false if query has been aborted + */ + virtual bool sweep(const PxGeometry& geom, const PxTransform& pose, const PxVec3& unitDir, float maxDist, RaycastCallback& cb, PxGeometryQueryFlags queryFlags = PxGeometryQueryFlag::eDEFAULT) const = 0; + + /** + \brief Overlap test against a BVH. + + \param[in] geom The query volume + \param[in] pose The pose of the query volume + \param[in] cb Overlap callback, called once per hit + \param[in] queryFlags Optional flags controlling the query. + \return false if query has been aborted + */ + virtual bool overlap(const PxGeometry& geom, const PxTransform& pose, OverlapCallback& cb, PxGeometryQueryFlags queryFlags = PxGeometryQueryFlag::eDEFAULT) const = 0; + + /** + \brief Frustum culling test against a BVH. + + This is similar in spirit to an overlap query using a convex object around the frustum. + However this specialized query has better performance, and can support more than the 6 planes + of a frustum, which can be useful in portal-based engines. + + On the other hand this test only returns a conservative number of bounds, i.e. some of the returned + bounds may actually be outside the frustum volume, close to it but not touching it. This is usually + an ok performance trade-off when the function is used for view-frustum culling. + + \param[in] nbPlanes Number of planes. Only 32 planes max are supported. + \param[in] planes Array of planes, should be in the same space as the BVH. + \param[in] cb Overlap callback, called once per visible object + \param[in] queryFlags Optional flags controlling the query. + \return false if query has been aborted + */ + virtual bool cull(PxU32 nbPlanes, const PxPlane* planes, OverlapCallback& cb, PxGeometryQueryFlags queryFlags = PxGeometryQueryFlag::eDEFAULT) const = 0; + + /** + \brief Returns the number of bounds in the BVH. + + You can use #getBounds() to retrieve the bounds. + + \note These are the user-defined bounds passed to the BVH builder, not the internal bounds around each BVH node. + + \return Number of bounds in the BVH. + + @see getBounds() getBoundsForModification() + */ + virtual PxU32 getNbBounds() const = 0; + + /** + \brief Retrieve the read-only bounds in the BVH. + + \note These are the user-defined bounds passed to the BVH builder, not the internal bounds around each BVH node. + + @see PxBounds3 getNbBounds() getBoundsForModification() + */ + virtual const PxBounds3* getBounds() const = 0; + + /** + \brief Retrieve the bounds in the BVH. + + These bounds can be modified. Call refit() after modifications are done. + + \note These are the user-defined bounds passed to the BVH builder, not the internal bounds around each BVH node. + + @see PxBounds3 getNbBounds() getBounds() refit() updateBounds() partialRefit() + */ + PX_FORCE_INLINE PxBounds3* getBoundsForModification() + { + return const_cast(getBounds()); + } + + /** + \brief Refit the BVH. + + This function "refits" the tree, i.e. takes the new (leaf) bounding boxes into account and + recomputes all the BVH bounds accordingly. This is an O(n) operation with n = number of bounds in the BVH. + + This works best with minor bounds modifications, i.e. when the bounds remain close to their initial values. + With large modifications the tree quality degrades more and more, and subsequent query performance suffers. + It might be a better strategy to create a brand new BVH if bounds change drastically. + + This function refits the whole tree after an arbitrary number of bounds have potentially been modified by + users (via getBoundsForModification()). If you only have a small number of bounds to update, it might be + more efficient to use setBounds() and partialRefit() instead. + + @see getNbBounds() getBoundsForModification() updateBounds() partialRefit() + */ + virtual void refit() = 0; + + /** + \brief Update single bounds. + + This is an alternative to getBoundsForModification() / refit(). If you only have a small set of bounds to + update, it can be inefficient to call the refit() function, because it refits the whole BVH. + + Instead, one can update individual bounds with this updateBounds() function. It sets the new bounds and + marks the corresponding BVH nodes for partial refit. Once all the individual bounds have been updated, + call partialRefit() to only refit the subset of marked nodes. + + \param[in] boundsIndex Index of updated bounds. Valid range is between 0 and getNbBounds(). + \param[in] newBounds Updated bounds. + + \return true if success + + @see getNbBounds() getBoundsForModification() refit() partialRefit() + */ + virtual bool updateBounds(PxU32 boundsIndex, const PxBounds3& newBounds) = 0; + + /** + \brief Refits subset of marked nodes. + + This is an alternative to the refit() function, to be called after updateBounds() calls. + See updateBounds() for details. + + @see getNbBounds() getBoundsForModification() refit() updateBounds() + */ + virtual void partialRefit() = 0; + + /** + \brief Generic BVH traversal function. + + This can be used to implement custom BVH traversal functions if provided ones are not enough. + In particular this can be used to visualize the tree's bounds. + + \param[in] cb Traversal callback, called for each visited node + \return false if query has been aborted + */ + virtual bool traverse(TraversalCallback& cb) const = 0; + + virtual const char* getConcreteTypeName() const { return "PxBVH"; } +protected: + PX_INLINE PxBVH(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags) {} + PX_INLINE PxBVH(PxBaseFlags baseFlags) : PxBase(baseFlags) {} + virtual ~PxBVH() {} + + virtual bool isKindOf(const char* name) const { return !::strcmp("PxBVH", name) || PxBase::isKindOf(name); } +}; + + struct PxGeomIndexPair; + + /** + \brief BVH-vs-BVH overlap test + + This function returns pairs of box indices that belong to both the first & second input bvhs. + + \param[in] callback The callback object used to report results + \param[in] bvh0 First bvh + \param[in] bvh1 Second bvh + \return true if an overlap has been detected + + @see PxBVH PxReportCallback + */ + PX_C_EXPORT PX_PHYSX_COMMON_API bool PX_CALL_CONV PxFindOverlap(PxReportCallback& callback, const PxBVH& bvh0, const PxBVH& bvh1); + +//! @cond + /** + * @deprecated + */ + typedef PX_DEPRECATED PxBVH PxBVHStructure; +//! @endcond + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/geometry/PxBVHBuildStrategy.h b/Source/ThirdParty/PhysX/geometry/PxBVHBuildStrategy.h new file mode 100644 index 000000000..4397201b0 --- /dev/null +++ b/Source/ThirdParty/PhysX/geometry/PxBVHBuildStrategy.h @@ -0,0 +1,62 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_BVH_BUILD_STRATEGY_H +#define PX_BVH_BUILD_STRATEGY_H +/** \addtogroup geomutils +@{ +*/ + +#include "common/PxPhysXCommonConfig.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +/** +\brief Desired build strategy for bounding-volume hierarchies +*/ +struct PxBVHBuildStrategy +{ + enum Enum + { + eFAST = 0, //!< Fast build strategy. Fast build speed, good runtime performance in most cases. Recommended for runtime cooking. + eDEFAULT = 1, //!< Default build strategy. Medium build speed, good runtime performance in all cases. + eSAH = 2, //!< SAH build strategy. Slower builds, slightly improved runtime performance in some cases. + + eLAST + }; +}; + +#if !PX_DOXYGEN +} // namespace physx +#endif + + /** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/geometry/PxBVHStructure.h b/Source/ThirdParty/PhysX/geometry/PxBVHStructure.h deleted file mode 100644 index 1ff9d3f20..000000000 --- a/Source/ThirdParty/PhysX/geometry/PxBVHStructure.h +++ /dev/null @@ -1,138 +0,0 @@ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// * Neither the name of NVIDIA CORPORATION nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. -// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. -// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - - -#ifndef PX_PHYSICS_BVH_STRUCTURE -#define PX_PHYSICS_BVH_STRUCTURE -/** \addtogroup geomutils -@{ -*/ - -#include "common/PxBase.h" -#include "foundation/PxTransform.h" -#include "foundation/PxBounds3.h" - -#if !PX_DOXYGEN -namespace physx -{ -#endif - -/** -\brief Class representing the bounding volume hierarchy structure. - -PxBVHStructure can be provided to PxScene::addActor. In this case the scene query -pruning structure inside PhysX SDK will store/update one bound per actor. -The scene queries against such an actor will query actor bounds and then -make a local space query against the provided BVH structure, which is in -actor's local space. - -@see PxScene::addActor -*/ -class PxBVHStructure: public PxBase -{ -public: - - /** - \brief Raycast test against a BVH structure. - - \param[in] origin The origin of the ray. - \param[in] unitDir Normalized direction of the ray. - \param[in] maxDist Maximum ray length, has to be in the [0, inf) range - \param[in] maxHits Max number of returned hits = size of 'rayHits' buffer - \param[out] rayHits Raycast hits information, bounds indices - \return Number of hits - */ - virtual PxU32 raycast(const PxVec3& origin, - const PxVec3& unitDir, - PxReal maxDist, - PxU32 maxHits, - PxU32* PX_RESTRICT rayHits) const = 0; - - /** - \brief Sweep test against a BVH structure. - - \param[in] aabb The axis aligned bounding box to sweep - \param[in] unitDir Normalized direction of the sweep. - \param[in] maxDist Maximum sweep length, has to be in the [0, inf) range - \param[in] maxHits Max number of returned hits = size of 'sweepHits' buffer - \param[out] sweepHits Sweep hits information, bounds indices - \return Number of hits - */ - virtual PxU32 sweep(const PxBounds3& aabb, - const PxVec3& unitDir, - PxReal maxDist, - PxU32 maxHits, - PxU32* PX_RESTRICT sweepHits) const = 0; - - /** - \brief AABB overlap test against a BVH structure. - - \param[in] aabb The axis aligned bounding box - \param[in] maxHits Max number of returned hits = size of 'overlapHits' buffer - \param[out] overlapHits Overlap hits information, bounds indices - \return Number of hits - */ - virtual PxU32 overlap(const PxBounds3& aabb, - PxU32 maxHits, - PxU32* PX_RESTRICT overlapHits) const = 0; - - /** - \brief Retrieve the bounds in the BVH. - - @see PxBounds3 - */ - virtual const PxBounds3* getBounds() const = 0; - - /** - \brief Returns the number of bounds in the BVH. - - You can use #getBounds() to retrieve the bounds. - - \return Number of bounds in the BVH. - - */ - virtual PxU32 getNbBounds() const = 0; - - virtual const char* getConcreteTypeName() const { return "PxBVHStructure"; } -protected: - PX_INLINE PxBVHStructure(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags) {} - PX_INLINE PxBVHStructure(PxBaseFlags baseFlags) : PxBase(baseFlags) {} - virtual ~PxBVHStructure() {} - - virtual bool isKindOf(const char* name) const { return !::strcmp("PxBVHStructure", name) || PxBase::isKindOf(name); } - -}; - - -#if !PX_DOXYGEN -} // namespace physx -#endif - -/** @} */ -#endif diff --git a/Source/ThirdParty/PhysX/geometry/PxBoxGeometry.h b/Source/ThirdParty/PhysX/geometry/PxBoxGeometry.h index 0c24790ee..de04acc06 100644 --- a/Source/ThirdParty/PhysX/geometry/PxBoxGeometry.h +++ b/Source/ThirdParty/PhysX/geometry/PxBoxGeometry.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_BOX_GEOMETRY -#define PX_PHYSICS_NX_BOX_GEOMETRY +#ifndef PX_BOX_GEOMETRY_H +#define PX_BOX_GEOMETRY_H /** \addtogroup geomutils @{ */ @@ -50,24 +48,35 @@ The geometry of a box can be fully specified by its half extents. This is the h class PxBoxGeometry : public PxGeometry { public: - /** - \brief Default constructor, initializes to a box with zero dimensions. - */ - PX_INLINE PxBoxGeometry() : PxGeometry(PxGeometryType::eBOX), halfExtents(0,0,0) {} - /** \brief Constructor to initialize half extents from scalar parameters. \param hx Initial half extents' x component. \param hy Initial half extents' y component. \param hz Initial half extents' z component. */ - PX_INLINE PxBoxGeometry(PxReal hx, PxReal hy, PxReal hz) : PxGeometry(PxGeometryType::eBOX), halfExtents(hx, hy, hz) {} + PX_INLINE PxBoxGeometry(PxReal hx=0.0f, PxReal hy=0.0f, PxReal hz=0.0f) : PxGeometry(PxGeometryType::eBOX), halfExtents(hx, hy, hz) {} /** \brief Constructor to initialize half extents from vector parameter. \param halfExtents_ Initial half extents. */ - PX_INLINE PxBoxGeometry(PxVec3 halfExtents_) : PxGeometry(PxGeometryType::eBOX), halfExtents(halfExtents_) {} + PX_INLINE PxBoxGeometry(PxVec3 halfExtents_) : PxGeometry(PxGeometryType::eBOX), halfExtents(halfExtents_) {} + + /** + \brief Copy constructor. + + \param[in] that Other object + */ + PX_INLINE PxBoxGeometry(const PxBoxGeometry& that) : PxGeometry(that), halfExtents(that.halfExtents) {} + + /** + \brief Assignment operator + */ + PX_INLINE void operator=(const PxBoxGeometry& that) + { + mType = that.mType; + halfExtents = that.halfExtents; + } /** \brief Returns true if the geometry is valid. @@ -88,14 +97,13 @@ public: PxVec3 halfExtents; }; - PX_INLINE bool PxBoxGeometry::isValid() const { - if (mType != PxGeometryType::eBOX) + if(mType != PxGeometryType::eBOX) return false; - if (!halfExtents.isFinite()) + if(!halfExtents.isFinite()) return false; - if (halfExtents.x <= 0.0f || halfExtents.y <= 0.0f || halfExtents.z <= 0.0f) + if(halfExtents.x <= 0.0f || halfExtents.y <= 0.0f || halfExtents.z <= 0.0f) return false; return true; diff --git a/Source/ThirdParty/PhysX/geometry/PxCapsuleGeometry.h b/Source/ThirdParty/PhysX/geometry/PxCapsuleGeometry.h index 33774e1c3..69a59f9ff 100644 --- a/Source/ThirdParty/PhysX/geometry/PxCapsuleGeometry.h +++ b/Source/ThirdParty/PhysX/geometry/PxCapsuleGeometry.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_CAPSULE_GEOMETRY -#define PX_PHYSICS_NX_CAPSULE_GEOMETRY +#ifndef PX_CAPSULE_GEOMETRY_H +#define PX_CAPSULE_GEOMETRY_H /** \addtogroup geomutils @{ */ @@ -55,22 +53,34 @@ The function PxTransformFromSegment is a helper for generating an appropriate tr class PxCapsuleGeometry : public PxGeometry { public: - /** - \brief Default constructor, initializes to a capsule with zero height and radius. - */ - PX_INLINE PxCapsuleGeometry() : PxGeometry(PxGeometryType::eCAPSULE), radius(0), halfHeight(0) {} - /** \brief Constructor, initializes to a capsule with passed radius and half height. */ - PX_INLINE PxCapsuleGeometry(PxReal radius_, PxReal halfHeight_) : PxGeometry(PxGeometryType::eCAPSULE), radius(radius_), halfHeight(halfHeight_) {} + PX_INLINE PxCapsuleGeometry(PxReal radius_=0.0f, PxReal halfHeight_=0.0f) : PxGeometry(PxGeometryType::eCAPSULE), radius(radius_), halfHeight(halfHeight_) {} + + /** + \brief Copy constructor. + + \param[in] that Other object + */ + PX_INLINE PxCapsuleGeometry(const PxCapsuleGeometry& that) : PxGeometry(that), radius(that.radius), halfHeight(that.halfHeight) {} + + /** + \brief Assignment operator + */ + PX_INLINE void operator=(const PxCapsuleGeometry& that) + { + mType = that.mType; + radius = that.radius; + halfHeight = that.halfHeight; + } /** \brief Returns true if the geometry is valid. \return True if the current settings are valid. - \note A valid capsule has radius > 0, halfHeight > 0. + \note A valid capsule has radius > 0, halfHeight >= 0. It is illegal to call PxRigidActor::createShape and PxPhysics::createShape with a capsule that has zero radius or height. @see PxRigidActor::createShape, PxPhysics::createShape @@ -89,31 +99,18 @@ public: PxReal halfHeight; }; - PX_INLINE bool PxCapsuleGeometry::isValid() const { - if (mType != PxGeometryType::eCAPSULE) + if(mType != PxGeometryType::eCAPSULE) return false; - if (!PxIsFinite(radius) || !PxIsFinite(halfHeight)) + if(!PxIsFinite(radius) || !PxIsFinite(halfHeight)) return false; - if (radius <= 0.0f || halfHeight <= 0.0f) + if(radius <= 0.0f || halfHeight < 0.0f) return false; return true; } - -/** \brief creates a transform from the endpoints of a segment, suitable for an actor transform for a PxCapsuleGeometry - -\param[in] p0 one end of major axis of the capsule -\param[in] p1 the other end of the axis of the capsule -\param[out] halfHeight the halfHeight of the capsule. This parameter is optional. -\return A PxTransform which will transform the vector (1,0,0) to the capsule axis shrunk by the halfHeight -*/ - -PX_FOUNDATION_API PxTransform PxTransformFromSegment(const PxVec3& p0, const PxVec3& p1, PxReal* halfHeight = NULL); - - #if !PX_DOXYGEN } // namespace physx #endif diff --git a/Source/ThirdParty/PhysX/geometry/PxConvexMesh.h b/Source/ThirdParty/PhysX/geometry/PxConvexMesh.h index 80434ed78..a0c945732 100644 --- a/Source/ThirdParty/PhysX/geometry/PxConvexMesh.h +++ b/Source/ThirdParty/PhysX/geometry/PxConvexMesh.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_GEOMUTILS_NX_CONVEXMESH -#define PX_PHYSICS_GEOMUTILS_NX_CONVEXMESH +#ifndef PX_CONVEX_MESH_H +#define PX_CONVEX_MESH_H /** \addtogroup geomutils @{ */ @@ -81,7 +79,7 @@ once you have released all of its #PxShape instances. @see PxConvexMeshDesc PxPhysics.createConvexMesh() */ -class PxConvexMesh : public PxBase +class PxConvexMesh : public PxRefCounted { public: @@ -90,28 +88,28 @@ public: \return Number of vertices. @see getVertices() */ - PX_PHYSX_COMMON_API virtual PxU32 getNbVertices() const = 0; + virtual PxU32 getNbVertices() const = 0; /** \brief Returns the vertices. \return Array of vertices. @see getNbVertices() */ - PX_PHYSX_COMMON_API virtual const PxVec3* getVertices() const = 0; + virtual const PxVec3* getVertices() const = 0; /** \brief Returns the index buffer. \return Index buffer. @see getNbPolygons() getPolygonData() */ - PX_PHYSX_COMMON_API virtual const PxU8* getIndexBuffer() const = 0; + virtual const PxU8* getIndexBuffer() const = 0; /** \brief Returns the number of polygons. \return Number of polygons. @see getIndexBuffer() getPolygonData() */ - PX_PHYSX_COMMON_API virtual PxU32 getNbPolygons() const = 0; + virtual PxU32 getNbPolygons() const = 0; /** \brief Returns the polygon data. @@ -120,31 +118,14 @@ public: \return True if success. @see getIndexBuffer() getNbPolygons() */ - PX_PHYSX_COMMON_API virtual bool getPolygonData(PxU32 index, PxHullPolygon& data) const = 0; + virtual bool getPolygonData(PxU32 index, PxHullPolygon& data) const = 0; /** \brief Decrements the reference count of a convex mesh and releases it if the new reference count is zero. @see PxPhysics.createConvexMesh() PxConvexMeshGeometry PxShape */ - PX_PHYSX_COMMON_API virtual void release() = 0; - - /** - \brief Returns the reference count of a convex mesh. - - At creation, the reference count of the convex mesh is 1. Every shape referencing this convex mesh increments the - count by 1. When the reference count reaches 0, and only then, the convex mesh gets destroyed automatically. - - \return the current reference count. - */ - PX_PHYSX_COMMON_API virtual PxU32 getReferenceCount() const = 0; - - /** - \brief Acquires a counted reference to a convex mesh. - - This method increases the reference count of the convex mesh by 1. Decrement the reference count by calling release() - */ - PX_PHYSX_COMMON_API virtual void acquireReference() = 0; + virtual void release() = 0; /** \brief Returns the mass properties of the mesh assuming unit density. @@ -162,16 +143,23 @@ public: \param[out] localInertia The inertia tensor in mesh local space assuming unit density. \param[out] localCenterOfMass Position of center of mass (or centroid) in mesh local space. */ - PX_PHYSX_COMMON_API virtual void getMassInformation(PxReal& mass, PxMat33& localInertia, PxVec3& localCenterOfMass) const = 0; + virtual void getMassInformation(PxReal& mass, PxMat33& localInertia, PxVec3& localCenterOfMass) const = 0; /** \brief Returns the local-space (vertex space) AABB from the convex mesh. \return local-space bounds */ - PX_PHYSX_COMMON_API virtual PxBounds3 getLocalBounds() const = 0; + virtual PxBounds3 getLocalBounds() const = 0; - PX_PHYSX_COMMON_API virtual const char* getConcreteTypeName() const { return "PxConvexMesh"; } + /** + \brief Returns the local-space Signed Distance Field for this mesh if it has one. + \return local-space SDF. + */ + virtual const PxReal* getSDF() const = 0; + + + virtual const char* getConcreteTypeName() const { return "PxConvexMesh"; } /** \brief This method decides whether a convex mesh is gpu compatible. If the total number of vertices are more than 64 or any number of vertices in a polygon is more than 32, or @@ -180,13 +168,14 @@ public: \return True if the convex hull is gpu compatible */ - PX_PHYSX_COMMON_API virtual bool isGpuCompatible() const = 0; + virtual bool isGpuCompatible() const = 0; + protected: - PX_INLINE PxConvexMesh(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags) {} - PX_INLINE PxConvexMesh(PxBaseFlags baseFlags) : PxBase(baseFlags) {} - PX_PHYSX_COMMON_API virtual ~PxConvexMesh() {} - PX_PHYSX_COMMON_API virtual bool isKindOf(const char* name) const { return !::strcmp("PxConvexMesh", name) || PxBase::isKindOf(name); } + PX_INLINE PxConvexMesh(PxType concreteType, PxBaseFlags baseFlags) : PxRefCounted(concreteType, baseFlags) {} + PX_INLINE PxConvexMesh(PxBaseFlags baseFlags) : PxRefCounted(baseFlags) {} + virtual ~PxConvexMesh() {} + virtual bool isKindOf(const char* name) const { return !::strcmp("PxConvexMesh", name) || PxRefCounted::isKindOf(name); } }; #if !PX_DOXYGEN diff --git a/Source/ThirdParty/PhysX/geometry/PxConvexMeshGeometry.h b/Source/ThirdParty/PhysX/geometry/PxConvexMeshGeometry.h index 625337498..1a35d3397 100644 --- a/Source/ThirdParty/PhysX/geometry/PxConvexMeshGeometry.h +++ b/Source/ThirdParty/PhysX/geometry/PxConvexMeshGeometry.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_CONVEXMESH_GEOMETRY -#define PX_PHYSICS_NX_CONVEXMESH_GEOMETRY +#ifndef PX_CONVEX_MESH_GEOMETRY_H +#define PX_CONVEX_MESH_GEOMETRY_H /** \addtogroup geomutils @{ */ @@ -81,25 +79,14 @@ class PxConvexMeshGeometry : public PxGeometry { public: /** - \brief Default constructor. + \brief Constructor. By default creates an empty object with a NULL mesh and identity scale. - Creates an empty object with a NULL mesh and identity scale. - */ - PX_INLINE PxConvexMeshGeometry() : - PxGeometry (PxGeometryType::eCONVEXMESH), - scale (PxMeshScale(1.0f)), - convexMesh (NULL), - meshFlags (PxConvexMeshGeometryFlag::eTIGHT_BOUNDS) - {} - - /** - \brief Constructor. \param[in] mesh Mesh pointer. May be NULL, though this will not make the object valid for shape construction. \param[in] scaling Scale factor. \param[in] flags Mesh flags. \ */ - PX_INLINE PxConvexMeshGeometry( PxConvexMesh* mesh, + PX_INLINE PxConvexMeshGeometry( PxConvexMesh* mesh = NULL, const PxMeshScale& scaling = PxMeshScale(), PxConvexMeshGeometryFlags flags = PxConvexMeshGeometryFlag::eTIGHT_BOUNDS) : PxGeometry (PxGeometryType::eCONVEXMESH), @@ -109,6 +96,30 @@ public: { } + /** + \brief Copy constructor. + + \param[in] that Other object + */ + PX_INLINE PxConvexMeshGeometry(const PxConvexMeshGeometry& that) : + PxGeometry (that), + scale (that.scale), + convexMesh (that.convexMesh), + meshFlags (that.meshFlags) + { + } + + /** + \brief Assignment operator + */ + PX_INLINE void operator=(const PxConvexMeshGeometry& that) + { + mType = that.mType; + scale = that.scale; + convexMesh = that.convexMesh; + meshFlags = that.meshFlags; + } + /** \brief Returns true if the geometry is valid. diff --git a/Source/ThirdParty/PhysX/geometry/PxCustomGeometry.h b/Source/ThirdParty/PhysX/geometry/PxCustomGeometry.h new file mode 100644 index 000000000..2fb9f686b --- /dev/null +++ b/Source/ThirdParty/PhysX/geometry/PxCustomGeometry.h @@ -0,0 +1,310 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_CUSTOMGEOMETRY_H +#define PX_CUSTOMGEOMETRY_H +/** \addtogroup geomutils +@{ +*/ + +#include "geometry/PxGeometry.h" +#include "geometry/PxGeometryHit.h" +#include "geometry/PxGeometryQueryContext.h" +#include "foundation/PxFoundationConfig.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + class PxContactBuffer; + class PxRenderOutput; + class PxMassProperties; + + /** + \brief Custom geometry class. This class allows user to create custom geometries by providing a set of virtual callback functions. + */ + class PxCustomGeometry : public PxGeometry + { + public: + /** + \brief For internal use + */ + PX_PHYSX_COMMON_API static PxU32 getUniqueID(); + + /** + \brief The type of a custom geometry. Allows to identify a particular kind of it. + */ + struct Type + { + /** + \brief Default constructor + */ + PX_INLINE Type() : mID(getUniqueID()) {} + + /** + \brief Default constructor + */ + PX_INLINE Type(const Type& t) : mID(t.mID) {} + + /** + \brief Assigment operator + */ + PX_INLINE Type& operator = (const Type& t) { mID = t.mID; return *this; } + + /** + \brief Equality operator + */ + PX_INLINE bool operator == (const Type& t) const { return mID == t.mID; } + + /** + \brief Inequality operator + */ + PX_INLINE bool operator != (const Type& t) const { return mID != t.mID; } + + /** + \brief Invalid type + */ + PX_INLINE static Type INVALID() { PxU32 z(0); return reinterpret_cast(z); } + + private: + PxU32 mID; + }; + + /** + \brief Custom geometry callbacks structure. User should inherit this and implement all pure virtual functions. + */ + struct Callbacks + { + /** + \brief Return custom type. The type purpose is for user to differentiate custom geometries. Not used by PhysX. + + \return Unique ID of a custom geometry type. + + \note User should use DECLARE_CUSTOM_GEOMETRY_TYPE and IMPLEMENT_CUSTOM_GEOMETRY_TYPE intead of overwriting this function. + */ + virtual Type getCustomType() const = 0; + + /** + \brief Return local bounds. + + \param[in] geometry This geometry. + + \return Bounding box in the geometry local space. + */ + virtual PxBounds3 getLocalBounds(const PxGeometry& geometry) const = 0; + + /** + \brief Contacts generation. Generate collision contacts between two geometries in given poses. + + \param[in] geom0 This custom geometry + \param[in] geom1 The other geometry + \param[in] pose0 This custom geometry pose + \param[in] pose1 The other geometry pose + \param[in] contactDistance The distance at which contacts begin to be generated between the pairs + \param[in] meshContactMargin The mesh contact margin. + \param[in] toleranceLength The toleranceLength. Used for scaling distance-based thresholds internally to produce appropriate results given simulations in different units + \param[out] contactBuffer A buffer to write contacts to. + + \return True if there are contacts. False otherwise. + */ + virtual bool generateContacts(const PxGeometry& geom0, const PxGeometry& geom1, const PxTransform& pose0, const PxTransform& pose1, + const PxReal contactDistance, const PxReal meshContactMargin, const PxReal toleranceLength, + PxContactBuffer& contactBuffer) const = 0; + + /** + \brief Raycast. Cast a ray against the geometry in given pose. + + \param[in] origin Origin of the ray. + \param[in] unitDir Normalized direction of the ray. + \param[in] geom This custom geometry + \param[in] pose This custom geometry pose + \param[in] maxDist Length of the ray. Has to be in the [0, inf) range. + \param[in] hitFlags Specifies which properties per hit should be computed and returned via the hit callback. + \param[in] maxHits max number of returned hits = size of 'rayHits' buffer + \param[out] rayHits Ray hits. + \param[in] stride Ray hit structure stride. + \param[in] threadContext Optional user-defined per-thread context. + + \return Number of hits. + */ + virtual PxU32 raycast(const PxVec3& origin, const PxVec3& unitDir, const PxGeometry& geom, const PxTransform& pose, + PxReal maxDist, PxHitFlags hitFlags, PxU32 maxHits, PxGeomRaycastHit* rayHits, PxU32 stride, PxRaycastThreadContext* threadContext) const = 0; + + /** + \brief Overlap. Test if geometries overlap. + + \param[in] geom0 This custom geometry + \param[in] pose0 This custom geometry pose + \param[in] geom1 The other geometry + \param[in] pose1 The other geometry pose + \param[in] threadContext Optional user-defined per-thread context. + + \return True if there is overlap. False otherwise. + */ + virtual bool overlap(const PxGeometry& geom0, const PxTransform& pose0, const PxGeometry& geom1, const PxTransform& pose1, PxOverlapThreadContext* threadContext) const = 0; + + /** + \brief Sweep. Sweep one geometry against the other. + + \param[in] unitDir Normalized direction of the sweep. + \param[in] maxDist Length of the sweep. Has to be in the [0, inf) range. + \param[in] geom0 This custom geometry + \param[in] pose0 This custom geometry pose + \param[in] geom1 The other geometry + \param[in] pose1 The other geometry pose + \param[out] sweepHit Used to report the sweep hit. + \param[in] hitFlags Specifies which properties per hit should be computed and returned via the hit callback. + \param[in] inflation This parameter creates a skin around the swept geometry which increases its extents for sweeping. + \param[in] threadContext Optional user-defined per-thread context. + + \return True if there is hit. False otherwise. + */ + virtual bool sweep(const PxVec3& unitDir, const PxReal maxDist, + const PxGeometry& geom0, const PxTransform& pose0, const PxGeometry& geom1, const PxTransform& pose1, + PxGeomSweepHit& sweepHit, PxHitFlags hitFlags, const PxReal inflation, PxSweepThreadContext* threadContext) const = 0; + + /** + \brief Visualize custom geometry for debugging. Optional. + + \param[in] geometry This geometry. + \param[in] out Render output. + \param[in] absPose Geometry absolute transform. + \param[in] cullbox Region to visualize. + */ + virtual void visualize(const PxGeometry& geometry, PxRenderOutput& out, const PxTransform& absPose, const PxBounds3& cullbox) const = 0; + + /** + \brief Compute custom geometry mass properties. For geometries usable with dynamic rigidbodies. + + \param[in] geometry This geometry. + \param[out] massProperties Mass properties to compute. + */ + virtual void computeMassProperties(const PxGeometry& geometry, PxMassProperties& massProperties) const = 0; + + /** + \brief Compatible with PhysX's PCM feature. Allows to optimize contact generation. + + \param[in] geometry This geometry. + \param[out] breakingThreshold The threshold to trigger contacts re-generation. + */ + virtual bool usePersistentContactManifold(const PxGeometry& geometry, PxReal& breakingThreshold) const = 0; + + /* Destructor */ + virtual ~Callbacks() {} + }; + + /** + \brief Default constructor. + + Creates an empty object with a NULL callbacks pointer. + */ + PX_INLINE PxCustomGeometry() : + PxGeometry(PxGeometryType::eCUSTOM), + callbacks(NULL) + {} + + /** + \brief Constructor. + */ + PX_INLINE PxCustomGeometry(Callbacks& _callbacks) : + PxGeometry(PxGeometryType::eCUSTOM), + callbacks(&_callbacks) + {} + + /** + \brief Copy constructor. + + \param[in] that Other object + */ + PX_INLINE PxCustomGeometry(const PxCustomGeometry& that) : + PxGeometry(that), + callbacks(that.callbacks) + {} + + /** + \brief Assignment operator + */ + PX_INLINE void operator=(const PxCustomGeometry& that) + { + mType = that.mType; + callbacks = that.callbacks; + } + + /** + \brief Returns true if the geometry is valid. + + \return True if the current settings are valid for shape creation. + + @see PxRigidActor::createShape, PxPhysics::createShape + */ + PX_INLINE bool isValid() const; + + /** + \brief Returns the custom type of the custom geometry. + */ + PX_INLINE Type getCustomType() const + { + return callbacks ? callbacks->getCustomType() : Type::INVALID(); + } + + public: + Callbacks* callbacks; //!< A reference to the callbacks object. + }; + + PX_INLINE bool PxCustomGeometry::isValid() const + { + return mType == PxGeometryType::eCUSTOM && callbacks != NULL; + } + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** +\brief Used in pair with IMPLEMENT_CUSTOM_GEOMETRY_TYPE to overwrite Callbacks::getCustomType() callback. +*/ +#define DECLARE_CUSTOM_GEOMETRY_TYPE \ + static ::physx::PxCustomGeometry::Type TYPE(); \ + virtual ::physx::PxCustomGeometry::Type getCustomType() const; + +/** +\brief Used in pair with DECLARE_CUSTOM_GEOMETRY_TYPE to overwrite Callbacks::getCustomType() callback. +*/ +#define IMPLEMENT_CUSTOM_GEOMETRY_TYPE(CLASS) \ +::physx::PxCustomGeometry::Type CLASS::TYPE() \ +{ \ + static ::physx::PxCustomGeometry::Type customType; \ + return customType; \ +} \ +::physx::PxCustomGeometry::Type CLASS::getCustomType() const \ +{ \ + return TYPE(); \ +} + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/geometry/PxGeometry.h b/Source/ThirdParty/PhysX/geometry/PxGeometry.h index 2ef93b94c..043484c66 100644 --- a/Source/ThirdParty/PhysX/geometry/PxGeometry.h +++ b/Source/ThirdParty/PhysX/geometry/PxGeometry.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_GEOMETRY -#define PX_PHYSICS_NX_GEOMETRY +#ifndef PX_GEOMETRY_H +#define PX_GEOMETRY_H /** \addtogroup geomutils @{ */ @@ -57,8 +55,13 @@ struct PxGeometryType eCAPSULE, eBOX, eCONVEXMESH, + ePARTICLESYSTEM, + eTETRAHEDRONMESH, eTRIANGLEMESH, eHEIGHTFIELD, + eHAIRSYSTEM, + eCUSTOM, + eGEOMETRY_COUNT, //!< internal use only! eINVALID = -1 //!< internal use only! }; @@ -72,8 +75,8 @@ about its placement in the world. \note This is an abstract class. You cannot create instances directly. Create an instance of one of the derived classes instead. */ -class PxGeometry -{ +class PxGeometry +{ public: /** \brief Returns the type of the geometry. @@ -81,9 +84,22 @@ public: */ PX_CUDA_CALLABLE PX_FORCE_INLINE PxGeometryType::Enum getType() const { return mType; } + /** + \brief Assignment operator + */ + PX_INLINE void operator=(const PxGeometry& that) + { + mType = that.mType; + } + protected: - PX_CUDA_CALLABLE PX_FORCE_INLINE PxGeometry(PxGeometryType::Enum type) : mType(type) {} - PxGeometryType::Enum mType; + PX_CUDA_CALLABLE PX_FORCE_INLINE PxGeometry(PxGeometryType::Enum type) : mType(type) {} + PX_CUDA_CALLABLE PX_FORCE_INLINE PxGeometry(const PxGeometry& that) : mType(that.mType) {} + + PxGeometryType::Enum mType; + +public: + float mTypePadding; // PT: padding bytes on x64, used internally }; #if !PX_DOXYGEN diff --git a/Source/ThirdParty/PhysX/geometry/PxGeometryHelpers.h b/Source/ThirdParty/PhysX/geometry/PxGeometryHelpers.h index 5681a930d..02983c1a8 100644 --- a/Source/ThirdParty/PhysX/geometry/PxGeometryHelpers.h +++ b/Source/ThirdParty/PhysX/geometry/PxGeometryHelpers.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_GEOMETRYHELPERS -#define PX_PHYSICS_GEOMETRYHELPERS +#ifndef PX_GEOMETRY_HELPERS_H +#define PX_GEOMETRY_HELPERS_H /** \addtogroup geomutils @{ */ @@ -45,6 +43,10 @@ #include "geometry/PxPlaneGeometry.h" #include "geometry/PxConvexMeshGeometry.h" #include "geometry/PxHeightFieldGeometry.h" +#include "geometry/PxParticleSystemGeometry.h" +#include "geometry/PxHairSystemGeometry.h" +#include "geometry/PxTetrahedronMeshGeometry.h" +#include "geometry/PxCustomGeometry.h" #if !PX_DOXYGEN namespace physx @@ -56,98 +58,68 @@ namespace physx This class contains enough space to hold a value of any PxGeometry subtype. -Its principal use is as a convenience class to allow geometries to be returned polymorphically -from functions. See PxShape::getGeometry(); +Its principal use is as a convenience class to allow geometries to be returned polymorphically from functions. */ PX_ALIGN_PREFIX(4) class PxGeometryHolder { + class PxInvalidGeometry : public PxGeometry + { + public: + PX_INLINE PxInvalidGeometry() : PxGeometry(PxGeometryType::eINVALID) {} + }; + public: PX_FORCE_INLINE PxGeometryType::Enum getType() const { return any().getType(); } - PX_FORCE_INLINE PxGeometry& any() - { - return *PxUnionCast(&bytes.geometry); - } - - PX_FORCE_INLINE const PxGeometry& any() const - { - return *PxUnionCast(&bytes.geometry); - } - - PX_FORCE_INLINE PxSphereGeometry& sphere() + PX_FORCE_INLINE PxGeometry& any() { - return get(); + return *PxUnionCast(&bytes.geometry); } - PX_FORCE_INLINE const PxSphereGeometry& sphere() const + PX_FORCE_INLINE const PxGeometry& any() const { - return get(); + return *PxUnionCast(&bytes.geometry); } - PX_FORCE_INLINE PxPlaneGeometry& plane() - { - return get(); - } +//! @cond + PX_FORCE_INLINE PxSphereGeometry& sphere() { return get(); } + PX_FORCE_INLINE const PxSphereGeometry& sphere() const { return get(); } - PX_FORCE_INLINE const PxPlaneGeometry& plane() const - { - return get(); - } + PX_FORCE_INLINE PxPlaneGeometry& plane() { return get(); } + PX_FORCE_INLINE const PxPlaneGeometry& plane() const { return get(); } - PX_FORCE_INLINE PxCapsuleGeometry& capsule() - { - return get(); - } + PX_FORCE_INLINE PxCapsuleGeometry& capsule() { return get(); } + PX_FORCE_INLINE const PxCapsuleGeometry& capsule() const { return get(); } - PX_FORCE_INLINE const PxCapsuleGeometry& capsule() const - { - return get(); - } + PX_FORCE_INLINE PxBoxGeometry& box() { return get(); } + PX_FORCE_INLINE const PxBoxGeometry& box() const { return get(); } - PX_FORCE_INLINE PxBoxGeometry& box() - { - return get(); - } + PX_FORCE_INLINE PxConvexMeshGeometry& convexMesh() { return get(); } + PX_FORCE_INLINE const PxConvexMeshGeometry& convexMesh() const { return get(); } - PX_FORCE_INLINE const PxBoxGeometry& box() const - { - return get(); - } + PX_FORCE_INLINE PxTetrahedronMeshGeometry& tetMesh() { return get(); } + PX_FORCE_INLINE const PxTetrahedronMeshGeometry& tetMesh() const { return get(); } - PX_FORCE_INLINE PxConvexMeshGeometry& convexMesh() - { - return get(); - } + PX_FORCE_INLINE PxTriangleMeshGeometry& triangleMesh() { return get(); } + PX_FORCE_INLINE const PxTriangleMeshGeometry& triangleMesh() const { return get(); } - PX_FORCE_INLINE const PxConvexMeshGeometry& convexMesh() const - { - return get(); - } + PX_FORCE_INLINE PxHeightFieldGeometry& heightField() { return get(); } + PX_FORCE_INLINE const PxHeightFieldGeometry& heightField() const { return get(); } - PX_FORCE_INLINE PxTriangleMeshGeometry& triangleMesh() - { - return get(); - } + PX_FORCE_INLINE PxParticleSystemGeometry& particleSystem() { return get(); } + PX_FORCE_INLINE const PxParticleSystemGeometry& particleSystem() const { return get(); } - PX_FORCE_INLINE const PxTriangleMeshGeometry& triangleMesh() const - { - return get(); - } + PX_FORCE_INLINE PxHairSystemGeometry& hairSystem() { return get(); } + PX_FORCE_INLINE const PxHairSystemGeometry& hairSystem() const { return get(); } - PX_FORCE_INLINE PxHeightFieldGeometry& heightField() - { - return get(); - } - - PX_FORCE_INLINE const PxHeightFieldGeometry& heightField() const - { - return get(); - } + PX_FORCE_INLINE PxCustomGeometry& custom() { return get(); } + PX_FORCE_INLINE const PxCustomGeometry& custom() const { return get(); } +//! @endcond PX_FORCE_INLINE void storeAny(const PxGeometry& geometry) { @@ -157,20 +129,24 @@ public: switch(geometry.getType()) { - case PxGeometryType::eSPHERE: put(geometry); break; - case PxGeometryType::ePLANE: put(geometry); break; - case PxGeometryType::eCAPSULE: put(geometry); break; - case PxGeometryType::eBOX: put(geometry); break; - case PxGeometryType::eCONVEXMESH: put(geometry); break; - case PxGeometryType::eTRIANGLEMESH: put(geometry); break; - case PxGeometryType::eHEIGHTFIELD: put(geometry); break; + case PxGeometryType::eSPHERE: put(geometry); break; + case PxGeometryType::ePLANE: put(geometry); break; + case PxGeometryType::eCAPSULE: put(geometry); break; + case PxGeometryType::eBOX: put(geometry); break; + case PxGeometryType::eCONVEXMESH: put(geometry); break; + case PxGeometryType::eTRIANGLEMESH: put(geometry); break; + case PxGeometryType::eTETRAHEDRONMESH: put(geometry); break; + case PxGeometryType::eHEIGHTFIELD: put(geometry); break; + case PxGeometryType::ePARTICLESYSTEM: put(geometry); break; + case PxGeometryType::eHAIRSYSTEM: put(geometry); break; + case PxGeometryType::eCUSTOM: put(geometry); break; case PxGeometryType::eGEOMETRY_COUNT: - case PxGeometryType::eINVALID: break; + case PxGeometryType::eINVALID: break; } } - PX_FORCE_INLINE PxGeometryHolder() {} - PX_FORCE_INLINE PxGeometryHolder(const PxGeometry& geometry){ storeAny(geometry); } + PX_FORCE_INLINE PxGeometryHolder() { put(PxInvalidGeometry()); } + PX_FORCE_INLINE PxGeometryHolder(const PxGeometry& geometry){ storeAny(geometry); } private: template void put(const PxGeometry& geometry) @@ -197,15 +173,16 @@ public: PxU8 capsule[sizeof(PxCapsuleGeometry)]; PxU8 plane[sizeof(PxPlaneGeometry)]; PxU8 convex[sizeof(PxConvexMeshGeometry)]; + PxU8 tetMesh[sizeof(PxTetrahedronMeshGeometry)]; PxU8 mesh[sizeof(PxTriangleMeshGeometry)]; PxU8 heightfield[sizeof(PxHeightFieldGeometry)]; + PxU8 particleSystem[sizeof(PxParticleSystemGeometry)]; + PxU8 hairSystem[sizeof(PxHairSystemGeometry)]; + PxU8 custom[sizeof(PxCustomGeometry)]; } bytes; } PX_ALIGN_SUFFIX(4); - - - #if !PX_DOXYGEN } // namespace physx #endif diff --git a/Source/ThirdParty/PhysX/geometry/PxGeometryHit.h b/Source/ThirdParty/PhysX/geometry/PxGeometryHit.h new file mode 100644 index 000000000..2fcd83f93 --- /dev/null +++ b/Source/ThirdParty/PhysX/geometry/PxGeometryHit.h @@ -0,0 +1,195 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_GEOMETRY_HIT_H +#define PX_GEOMETRY_HIT_H +/** \addtogroup scenequery +@{ +*/ +#include "foundation/PxVec3.h" +#include "foundation/PxFlags.h" +#include "common/PxPhysXCommonConfig.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +/** +\brief Scene query and geometry query behavior flags. + +PxHitFlags are used for 3 different purposes: + +1) To request hit fields to be filled in by scene queries (such as hit position, normal, face index or UVs). +2) Once query is completed, to indicate which fields are valid (note that a query may produce more valid fields than requested). +3) To specify additional options for the narrow phase and mid-phase intersection routines. + +All these flags apply to both scene queries and geometry queries (PxGeometryQuery). + +@see PxRaycastHit PxSweepHit PxOverlapHit PxScene.raycast PxScene.sweep PxScene.overlap PxGeometryQuery PxFindFaceIndex +*/ +struct PxHitFlag +{ + enum Enum + { + ePOSITION = (1<<0), //!< "position" member of #PxQueryHit is valid + eNORMAL = (1<<1), //!< "normal" member of #PxQueryHit is valid + eUV = (1<<3), //!< "u" and "v" barycentric coordinates of #PxQueryHit are valid. Not applicable to sweep queries. + eASSUME_NO_INITIAL_OVERLAP = (1<<4), //!< Performance hint flag for sweeps when it is known upfront there's no initial overlap. + //!< NOTE: using this flag may cause undefined results if shapes are initially overlapping. + eANY_HIT = (1<<5), //!< Report any first hit. Used for geometries that contain more than one primitive. For meshes, + //!< if neither eMESH_MULTIPLE nor eANY_HIT is specified, a single closest hit will be reported. + eMESH_MULTIPLE = (1<<6), //!< Report all hits for meshes rather than just the first. Not applicable to sweep queries. + eMESH_ANY = eANY_HIT, //!< @deprecated Deprecated, please use eANY_HIT instead. + eMESH_BOTH_SIDES = (1<<7), //!< Report hits with back faces of mesh triangles. Also report hits for raycast + //!< originating on mesh surface and facing away from the surface normal. Not applicable to sweep queries. + //!< Please refer to the user guide for heightfield-specific differences. + ePRECISE_SWEEP = (1<<8), //!< Use more accurate but slower narrow phase sweep tests. + //!< May provide better compatibility with PhysX 3.2 sweep behavior. + eMTD = (1<<9), //!< Report the minimum translation depth, normal and contact point. + eFACE_INDEX = (1<<10), //!< "face index" member of #PxQueryHit is valid + + eDEFAULT = ePOSITION|eNORMAL|eFACE_INDEX, + + /** \brief Only this subset of flags can be modified by pre-filter. Other modifications will be discarded. */ + eMODIFIABLE_FLAGS = eMESH_MULTIPLE|eMESH_BOTH_SIDES|eASSUME_NO_INITIAL_OVERLAP|ePRECISE_SWEEP + }; +}; + +/** +\brief collection of set bits defined in PxHitFlag. + +@see PxHitFlag +*/ +PX_FLAGS_TYPEDEF(PxHitFlag, PxU16) + +/** +\brief Scene query hit information. +*/ +struct PxQueryHit +{ + PX_INLINE PxQueryHit() : faceIndex(0xFFFFffff) {} + + /** + Face index of touched triangle, for triangle meshes, convex meshes and height fields. + + \note This index will default to 0xFFFFffff value for overlap queries. + \note Please refer to the user guide for more details for sweep queries. + \note This index is remapped by mesh cooking. Use #PxTriangleMesh::getTrianglesRemap() to convert to original mesh index. + \note For convex meshes use #PxConvexMesh::getPolygonData() to retrieve touched polygon data. + */ + PxU32 faceIndex; +}; + +/** +\brief Scene query hit information for raycasts and sweeps returning hit position and normal information. + +::PxHitFlag flags can be passed to scene query functions, as an optimization, to cause the SDK to +only generate specific members of this structure. +*/ +struct PxLocationHit : PxQueryHit +{ + PX_INLINE PxLocationHit() : flags(0), position(PxVec3(0)), normal(PxVec3(0)), distance(PX_MAX_REAL) {} + + /** + \note For raycast hits: true for shapes overlapping with raycast origin. + \note For sweep hits: true for shapes overlapping at zero sweep distance. + + @see PxRaycastHit PxSweepHit + */ + PX_INLINE bool hadInitialOverlap() const { return (distance <= 0.0f); } + + // the following fields are set in accordance with the #PxHitFlags + PxHitFlags flags; //!< Hit flags specifying which members contain valid values. + PxVec3 position; //!< World-space hit position (flag: #PxHitFlag::ePOSITION) + PxVec3 normal; //!< World-space hit normal (flag: #PxHitFlag::eNORMAL) + + /** + \brief Distance to hit. + \note If the eMTD flag is used, distance will be a negative value if shapes are overlapping indicating the penetration depth. + \note Otherwise, this value will be >= 0 */ + PxF32 distance; +}; + +/** +\brief Stores results of raycast queries. + +::PxHitFlag flags can be passed to raycast function, as an optimization, to cause the SDK to only compute specified members of this +structure. + +Some members like barycentric coordinates are currently only computed for triangle meshes and height fields, but next versions +might provide them in other cases. The client code should check #flags to make sure returned values are valid. + +@see PxScene.raycast +*/ +struct PxGeomRaycastHit : PxLocationHit +{ + PX_INLINE PxGeomRaycastHit() : u(0.0f), v(0.0f) {} + + // the following fields are set in accordance with the #PxHitFlags + + PxReal u, v; //!< barycentric coordinates of hit point, for triangle mesh and height field (flag: #PxHitFlag::eUV) +}; + +/** +\brief Stores results of overlap queries. + +@see PxScene.overlap +*/ +struct PxGeomOverlapHit : PxQueryHit +{ + PX_INLINE PxGeomOverlapHit() {} +}; + +/** +\brief Stores results of sweep queries. + +@see PxScene.sweep +*/ +struct PxGeomSweepHit : PxLocationHit +{ + PX_INLINE PxGeomSweepHit() {} +}; + +/** +\brief Pair of indices, typically either object or triangle indices. +*/ +struct PxGeomIndexPair +{ + PX_FORCE_INLINE PxGeomIndexPair() {} + PX_FORCE_INLINE PxGeomIndexPair(PxU32 _id0, PxU32 _id1) : id0(_id0), id1(_id1) {} + + PxU32 id0, id1; +}; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/geometry/PxGeometryInternal.h b/Source/ThirdParty/PhysX/geometry/PxGeometryInternal.h new file mode 100644 index 000000000..b269b02a9 --- /dev/null +++ b/Source/ThirdParty/PhysX/geometry/PxGeometryInternal.h @@ -0,0 +1,123 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_GEOMETRY_INTERNAL_H +#define PX_GEOMETRY_INTERNAL_H +/** \addtogroup geomutils +@{ */ + +#include "common/PxPhysXCommonConfig.h" +#include "foundation/PxVec3.h" +#include "geometry/PxTriangleMesh.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + class PxTriangleMesh; + + struct PxTriangleMeshInternalData + { + PxU32 mNbVertices; + PxU32 mNbTriangles; + PxVec3* mVertices; + void* mTriangles; + PxU32* mFaceRemap; + PxVec3 mAABB_Center; + PxVec3 mAABB_Extents; + PxReal mGeomEpsilon; + PxU8 mFlags; + // + PxU32 mNbNodes; + PxU32 mNodeSize; + void* mNodes; + PxU32 mInitData; + PxVec3 mCenterOrMinCoeff; + PxVec3 mExtentsOrMaxCoeff; + bool mQuantized; + + PX_FORCE_INLINE PxU32 getSizeofVerticesInBytes() const + { + return mNbVertices * sizeof(PxVec3); + } + + PX_FORCE_INLINE PxU32 getSizeofTrianglesInBytes() const + { + const PxU32 triangleSize = mFlags & PxTriangleMeshFlag::e16_BIT_INDICES ? sizeof(PxU16) : sizeof(PxU32); + return mNbTriangles * 3 * triangleSize; + } + + PX_FORCE_INLINE PxU32 getSizeofFaceRemapInBytes() const + { + return mNbTriangles * sizeof(PxU32); + } + + PX_FORCE_INLINE PxU32 getSizeofNodesInBytes() const + { + return mNbNodes * mNodeSize; + } + }; + + PX_C_EXPORT PX_PHYSX_COMMON_API bool PX_CALL_CONV PxGetTriangleMeshInternalData(PxTriangleMeshInternalData& data, const PxTriangleMesh& mesh, bool takeOwnership); + + class PxBVH; + + struct PxBVHInternalData + { + PxU32 mNbIndices; + PxU32 mNbNodes; + PxU32 mNodeSize; + void* mNodes; + PxU32* mIndices; // Can be null + void* mBounds; + + PX_FORCE_INLINE PxU32 getSizeofNodesInBytes() const + { + return mNbNodes * mNodeSize; + } + + PX_FORCE_INLINE PxU32 getSizeofIndicesInBytes() const + { + return mNbIndices * sizeof(PxU32); + } + + PX_FORCE_INLINE PxU32 getSizeofBoundsInBytes() const + { + return (mNbIndices+1)*6; + } + }; + + PX_C_EXPORT PX_PHYSX_COMMON_API bool PX_CALL_CONV PxGetBVHInternalData(PxBVHInternalData& data, const PxBVH& bvh, bool takeOwnership); + +#if !PX_DOXYGEN +} // namespace physx +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/geometry/PxGeometryQuery.h b/Source/ThirdParty/PhysX/geometry/PxGeometryQuery.h index a4cab1a71..1cb4a615b 100644 --- a/Source/ThirdParty/PhysX/geometry/PxGeometryQuery.h +++ b/Source/ThirdParty/PhysX/geometry/PxGeometryQuery.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_GEOMUTILS_PX_GEOMETRY_QUERY -#define PX_PHYSICS_GEOMUTILS_PX_GEOMETRY_QUERY +#ifndef PX_GEOMETRY_QUERY_H +#define PX_GEOMETRY_QUERY_H /** \brief Maximum sweep distance for scene sweeps. The distance parameter for sweep functions will be clamped to this value. @@ -44,7 +42,9 @@ The reason for this is GJK support cannot be evaluated near infinity. A viable a */ #include "common/PxPhysXCommonConfig.h" -#include "PxQueryReport.h" +#include "geometry/PxGeometryHit.h" +#include "geometry/PxGeometryQueryFlags.h" +#include "geometry/PxGeometryQueryContext.h" #if !PX_DOXYGEN namespace physx @@ -52,10 +52,7 @@ namespace physx #endif class PxGeometry; -struct PxSweepHit; -struct PxRaycastHit; - -class PxTriangle; +class PxContactBuffer; /** \brief Collection of geometry object queries (sweeps, raycasts, overlaps, ...). @@ -64,6 +61,70 @@ class PxGeometryQuery { public: + /** + \brief Raycast test against a geometry object. + + All geometry types are supported except PxParticleSystemGeometry, PxTetrahedronMeshGeometry and PxHairSystemGeometry. + + \param[in] origin The origin of the ray to test the geometry object against + \param[in] unitDir Normalized direction of the ray to test the geometry object against + \param[in] geom The geometry object to test the ray against + \param[in] pose Pose of the geometry object + \param[in] maxDist Maximum ray length, has to be in the [0, inf) range + \param[in] hitFlags Specification of the kind of information to retrieve on hit. Combination of #PxHitFlag flags + \param[in] maxHits max number of returned hits = size of 'rayHits' buffer + \param[out] rayHits Raycast hits information + \param[in] stride Stride value (in number of bytes) for rayHits array. Typically sizeof(PxGeomRaycastHit) for packed arrays. + \param[in] queryFlags Optional flags controlling the query. + \param[in] threadContext Optional user-defined per-thread context. + + \return Number of hits between the ray and the geometry object + + @see PxGeomRaycastHit PxGeometry PxTransform + */ + PX_PHYSX_COMMON_API static PxU32 raycast( const PxVec3& origin, const PxVec3& unitDir, + const PxGeometry& geom, const PxTransform& pose, + PxReal maxDist, PxHitFlags hitFlags, + PxU32 maxHits, PxGeomRaycastHit* PX_RESTRICT rayHits, PxU32 stride, PxGeometryQueryFlags queryFlags = PxGeometryQueryFlag::eDEFAULT, + PxRaycastThreadContext* threadContext = NULL); + + /** + * @brief Backward compatibility helper + * @deprecated + */ + template + PX_DEPRECATED PX_FORCE_INLINE static PxU32 raycast( const PxVec3& origin, const PxVec3& unitDir, + const PxGeometry& geom, const PxTransform& pose, + PxReal maxDist, PxHitFlags hitFlags, + PxU32 maxHits, HitT* PX_RESTRICT rayHits) + { + return raycast(origin, unitDir, geom, pose, maxDist, hitFlags, maxHits, rayHits, sizeof(HitT)); + } + + /** + \brief Overlap test for two geometry objects. + + All combinations are supported except: + \li PxPlaneGeometry vs. {PxPlaneGeometry, PxTriangleMeshGeometry, PxHeightFieldGeometry} + \li PxTriangleMeshGeometry vs. PxHeightFieldGeometry + \li PxHeightFieldGeometry vs. PxHeightFieldGeometry + \li Anything involving PxParticleSystemGeometry, PxTetrahedronMeshGeometry or PxHairSystemGeometry. + + \param[in] geom0 The first geometry object + \param[in] pose0 Pose of the first geometry object + \param[in] geom1 The second geometry object + \param[in] pose1 Pose of the second geometry object + \param[in] queryFlags Optional flags controlling the query. + \param[in] threadContext Optional user-defined per-thread context. + + \return True if the two geometry objects overlap + + @see PxGeometry PxTransform + */ + PX_PHYSX_COMMON_API static bool overlap(const PxGeometry& geom0, const PxTransform& pose0, + const PxGeometry& geom1, const PxTransform& pose1, + PxGeometryQueryFlags queryFlags = PxGeometryQueryFlag::eDEFAULT, PxOverlapThreadContext* threadContext=NULL); + /** \brief Sweep a specified geometry object in space and test for collision with a given object. @@ -74,74 +135,28 @@ public: \li PxBoxGeometry vs. {PxSphereGeometry, PxPlaneGeometry, PxCapsuleGeometry, PxBoxGeometry, PxConvexMeshGeometry, PxTriangleMeshGeometry, PxHeightFieldGeometry} \li PxConvexMeshGeometry vs. {PxSphereGeometry, PxPlaneGeometry, PxCapsuleGeometry, PxBoxGeometry, PxConvexMeshGeometry, PxTriangleMeshGeometry, PxHeightFieldGeometry} - \param[in] unitDir Normalized direction along which object geom0 should be swept - \param[in] maxDist Maximum sweep distance, has to be in the [0, inf) range - \param[in] geom0 The geometry object to sweep. Supported geometries are #PxSphereGeometry, #PxCapsuleGeometry, #PxBoxGeometry and #PxConvexMeshGeometry - \param[in] pose0 Pose of the geometry object to sweep - \param[in] geom1 The geometry object to test the sweep against - \param[in] pose1 Pose of the geometry object to sweep against - \param[out] sweepHit The sweep hit information. Only valid if this method returns true. - \param[in] hitFlags Specify which properties per hit should be computed and written to result hit array. Combination of #PxHitFlag flags - \param[in] inflation Surface of the swept shape is additively extruded in the normal direction, rounding corners and edges. + \param[in] unitDir Normalized direction along which object geom0 should be swept + \param[in] maxDist Maximum sweep distance, has to be in the [0, inf) range + \param[in] geom0 The geometry object to sweep. Supported geometries are #PxSphereGeometry, #PxCapsuleGeometry, #PxBoxGeometry and #PxConvexMeshGeometry + \param[in] pose0 Pose of the geometry object to sweep + \param[in] geom1 The geometry object to test the sweep against + \param[in] pose1 Pose of the geometry object to sweep against + \param[out] sweepHit The sweep hit information. Only valid if this method returns true. + \param[in] hitFlags Specify which properties per hit should be computed and written to result hit array. Combination of #PxHitFlag flags + \param[in] inflation Surface of the swept shape is additively extruded in the normal direction, rounding corners and edges. + \param[in] queryFlags Optional flags controlling the query. + \param[in] threadContext Optional user-defined per-thread context. \return True if the swept geometry object geom0 hits the object geom1 - @see PxSweepHit PxGeometry PxTransform + @see PxGeomSweepHit PxGeometry PxTransform */ - PX_PHYSX_COMMON_API static bool sweep(const PxVec3& unitDir, - const PxReal maxDist, - const PxGeometry& geom0, - const PxTransform& pose0, - const PxGeometry& geom1, - const PxTransform& pose1, - PxSweepHit& sweepHit, - PxHitFlags hitFlags = PxHitFlag::eDEFAULT, - const PxReal inflation = 0.f); - - - /** - \brief Overlap test for two geometry objects. - - All combinations are supported except: - \li PxPlaneGeometry vs. {PxPlaneGeometry, PxTriangleMeshGeometry, PxHeightFieldGeometry} - \li PxTriangleMeshGeometry vs. {PxTriangleMeshGeometry, PxHeightFieldGeometry} - \li PxHeightFieldGeometry vs. {PxHeightFieldGeometry} - - \param[in] geom0 The first geometry object - \param[in] pose0 Pose of the first geometry object - \param[in] geom1 The second geometry object - \param[in] pose1 Pose of the second geometry object - \return True if the two geometry objects overlap - - @see PxGeometry PxTransform - */ - PX_PHYSX_COMMON_API static bool overlap(const PxGeometry& geom0, const PxTransform& pose0, - const PxGeometry& geom1, const PxTransform& pose1); - - - /** - \brief Raycast test against a geometry object. - - \param[in] origin The origin of the ray to test the geometry object against - \param[in] unitDir Normalized direction of the ray to test the geometry object against - \param[in] geom The geometry object to test the ray against - \param[in] pose Pose of the geometry object - \param[in] maxDist Maximum ray length, has to be in the [0, inf) range - \param[in] hitFlags Specification of the kind of information to retrieve on hit. Combination of #PxHitFlag flags - \param[in] maxHits max number of returned hits = size of 'rayHits' buffer - \param[out] rayHits Raycast hits information - \return Number of hits between the ray and the geometry object - - @see PxRaycastHit PxGeometry PxTransform - */ - PX_PHYSX_COMMON_API static PxU32 raycast(const PxVec3& origin, - const PxVec3& unitDir, - const PxGeometry& geom, - const PxTransform& pose, - PxReal maxDist, - PxHitFlags hitFlags, - PxU32 maxHits, - PxRaycastHit* PX_RESTRICT rayHits); + PX_PHYSX_COMMON_API static bool sweep( const PxVec3& unitDir, const PxReal maxDist, + const PxGeometry& geom0, const PxTransform& pose0, + const PxGeometry& geom1, const PxTransform& pose1, + PxGeomSweepHit& sweepHit, PxHitFlags hitFlags = PxHitFlag::eDEFAULT, + const PxReal inflation = 0.0f, PxGeometryQueryFlags queryFlags = PxGeometryQueryFlag::eDEFAULT, + PxSweepThreadContext* threadContext = NULL); /** \brief Compute minimum translational distance (MTD) between two geometry objects. @@ -153,6 +168,7 @@ public: - mesh/mesh - mesh/heightfield - heightfield/heightfield + - anything involving PxParticleSystemGeometry, PxTetrahedronMeshGeometry or PxHairSystemGeometry The function returns a unit vector ('direction') and a penetration depth ('depth'). @@ -163,60 +179,97 @@ public: If objects do not overlap, the function can not compute the MTD and returns false. - \param[out] direction Computed MTD unit direction - \param[out] depth Penetration depth. Always positive or null. - \param[in] geom0 The first geometry object - \param[in] pose0 Pose of the first geometry object - \param[in] geom1 The second geometry object - \param[in] pose1 Pose of the second geometry object + \param[out] direction Computed MTD unit direction + \param[out] depth Penetration depth. Always positive or null. + \param[in] geom0 The first geometry object + \param[in] pose0 Pose of the first geometry object + \param[in] geom1 The second geometry object + \param[in] pose1 Pose of the second geometry object + \param[in] queryFlags Optional flags controlling the query. \return True if the MTD has successfully been computed, i.e. if objects do overlap. @see PxGeometry PxTransform */ - PX_PHYSX_COMMON_API static bool computePenetration(PxVec3& direction, PxF32& depth, - const PxGeometry& geom0, const PxTransform& pose0, - const PxGeometry& geom1, const PxTransform& pose1); + PX_PHYSX_COMMON_API static bool computePenetration( PxVec3& direction, PxF32& depth, + const PxGeometry& geom0, const PxTransform& pose0, + const PxGeometry& geom1, const PxTransform& pose1, + PxGeometryQueryFlags queryFlags = PxGeometryQueryFlag::eDEFAULT); /** \brief Computes distance between a point and a geometry object. - Currently supported geometry objects: box, sphere, capsule, convex. + Currently supported geometry objects: box, sphere, capsule, convex, mesh. - \param[in] point The point P - \param[in] geom The geometry object - \param[in] pose Pose of the geometry object - \param[out] closestPoint Optionally returned closest point to P on the geom object. Only valid when returned distance is strictly positive. - \return Square distance between the point and the geom object, or 0.0 if the point is inside the object, or -1.0 if the geometry type is not supported. + \note For meshes, only the BVH34 midphase data-structure is supported. + + \param[in] point The point P + \param[in] geom The geometry object + \param[in] pose Pose of the geometry object + \param[out] closestPoint Optionally returned closest point to P on the geom object. Only valid when returned distance is strictly positive. + \param[out] closestIndex Optionally returned closest (triangle) index. Only valid for triangle meshes. + \param[in] queryFlags Optional flags controlling the query. + \return Square distance between the point and the geom object, or 0.0 if the point is inside the object, or -1.0 if an error occured (geometry type is not supported, or invalid pose) @see PxGeometry PxTransform */ - PX_PHYSX_COMMON_API static PxReal pointDistance(const PxVec3& point, const PxGeometry& geom, const PxTransform& pose, PxVec3* closestPoint=NULL); + PX_PHYSX_COMMON_API static PxReal pointDistance(const PxVec3& point, const PxGeometry& geom, const PxTransform& pose, + PxVec3* closestPoint=NULL, PxU32* closestIndex=NULL, + PxGeometryQueryFlags queryFlags = PxGeometryQueryFlag::eDEFAULT); + /** + \brief computes the bounds for a geometry object + + \param[out] bounds Returned computed bounds + \param[in] geom The geometry object + \param[in] pose Pose of the geometry object + \param[in] offset Offset for computed bounds. This value is added to the geom's extents. + \param[in] inflation Scale factor for computed bounds. The geom's extents are multiplied by this value. + \param[in] queryFlags Optional flags controlling the query. + + @see PxGeometry PxTransform + */ + PX_PHYSX_COMMON_API static void computeGeomBounds(PxBounds3& bounds, const PxGeometry& geom, const PxTransform& pose, float offset=0.0f, float inflation=1.0f, PxGeometryQueryFlags queryFlags = PxGeometryQueryFlag::eDEFAULT); /** \brief get the bounds for a geometry object - \param[in] geom The geometry object - \param[in] pose Pose of the geometry object - \param[in] inflation Scale factor for computed world bounds. Box extents are multiplied by this value. + \param[in] geom The geometry object + \param[in] pose Pose of the geometry object + \param[in] inflation Scale factor for computed world bounds. Box extents are multiplied by this value. \return The bounds of the object @see PxGeometry PxTransform + @deprecated */ - PX_PHYSX_COMMON_API static PxBounds3 getWorldBounds(const PxGeometry& geom, const PxTransform& pose, float inflation=1.01f); + PX_DEPRECATED PX_PHYSX_COMMON_API static PxBounds3 getWorldBounds(const PxGeometry& geom, const PxTransform& pose, float inflation=1.01f); + + /** + \brief Generate collision contacts between a convex geometry and a single triangle + + \param[in] geom The geometry object. Can be a capsule, a box or a convex mesh + \param[in] pose Pose of the geometry object + \param[in] triangleVertices Triangle vertices in local space + \param[in] triangleIndex Triangle index + \param[in] contactDistance The distance at which contacts begin to be generated between the pairs + \param[in] meshContactMargin The mesh contact margin. + \param[in] toleranceLength The toleranceLength. Used for scaling distance-based thresholds internally to produce appropriate results given simulations in different units + \param[out] contactBuffer A buffer to write contacts to. + + \return True if there was collision + */ + PX_PHYSX_COMMON_API static bool generateTriangleContacts(const PxGeometry& geom, const PxTransform& pose, const PxVec3 triangleVertices[3], PxU32 triangleIndex, PxReal contactDistance, PxReal meshContactMargin, PxReal toleranceLength, PxContactBuffer& contactBuffer); /** \brief Checks if provided geometry is valid. - \param[in] geom The geometry object. + \param[in] geom The geometry object. \return True if geometry is valid. - @see PxGeometry PxSphereGeometry, PxCapsuleGeometry, PxBoxGeometry, PxConvexGeometry + @see PxGeometry */ PX_PHYSX_COMMON_API static bool isValid(const PxGeometry& geom); }; - #if !PX_DOXYGEN } #endif diff --git a/Source/ThirdParty/PhysX/geometry/PxGeometryQueryContext.h b/Source/ThirdParty/PhysX/geometry/PxGeometryQueryContext.h new file mode 100644 index 000000000..0b64cfeaf --- /dev/null +++ b/Source/ThirdParty/PhysX/geometry/PxGeometryQueryContext.h @@ -0,0 +1,74 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_GEOMETRY_QUERY_CONTEXT_H +#define PX_GEOMETRY_QUERY_CONTEXT_H + +#include "common/PxPhysXCommonConfig.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief A per-thread context passed to low-level query functions. + + This is a user-defined optional parameter that gets passed down to low-level query functions (raycast / overlap / sweep). + + This is not used directly in PhysX, although the context in this case is the PxHitCallback used in the query. This allows + user-defined query functions, such as the ones from PxCustomGeometry, to get some additional data about the query. In this + case this is a 'per-query' context rather than 'per-thread', but the initial goal of this parameter is to give custom + query callbacks access to per-thread data structures (e.g. caches) that could be needed to implement the callbacks. + + In any case this is mostly for user-controlled query systems. + */ + struct PxQueryThreadContext + { + }; + + /** + \brief A per-thread context passed to low-level raycast functions. + */ + typedef PxQueryThreadContext PxRaycastThreadContext; + + /** + \brief A per-thread context passed to low-level overlap functions. + */ + typedef PxQueryThreadContext PxOverlapThreadContext; + + /** + \brief A per-thread context passed to low-level sweep functions. + */ + typedef PxQueryThreadContext PxSweepThreadContext; + +#if !PX_DOXYGEN +} +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/geometry/PxGeometryQueryFlags.h b/Source/ThirdParty/PhysX/geometry/PxGeometryQueryFlags.h new file mode 100644 index 000000000..e2edb9061 --- /dev/null +++ b/Source/ThirdParty/PhysX/geometry/PxGeometryQueryFlags.h @@ -0,0 +1,68 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_GEOMETRY_QUERY_FLAGS_H +#define PX_GEOMETRY_QUERY_FLAGS_H + +#include "foundation/PxFlags.h" +#include "common/PxPhysXCommonConfig.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief Geometry-level query flags. + + @see PxScene::raycast PxScene::overlap PxScene::sweep PxBVH::raycast PxBVH::overlap PxBVH::sweep PxGeometryQuery::raycast PxGeometryQuery::overlap PxGeometryQuery::sweep + @see PxGeometryQuery::computePenetration PxGeometryQuery::pointDistance PxGeometryQuery::computeGeomBounds + @see PxMeshQuery::findOverlapTriangleMesh PxMeshQuery::findOverlapHeightField PxMeshQuery::sweep + */ + struct PxGeometryQueryFlag + { + enum Enum + { + eSIMD_GUARD = (1<<0), //!< Saves/restores SIMD control word for each query (safer but slower). Omit this if you took care of it yourself in your app. + + eDEFAULT = eSIMD_GUARD + }; + }; + + /** + \brief collection of set bits defined in PxGeometryQueryFlag. + + @see PxGeometryQueryFlag + */ + PX_FLAGS_TYPEDEF(PxGeometryQueryFlag, PxU32) + +#if !PX_DOXYGEN +} +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/geometry/PxGjkQuery.h b/Source/ThirdParty/PhysX/geometry/PxGjkQuery.h new file mode 100644 index 000000000..c85b79171 --- /dev/null +++ b/Source/ThirdParty/PhysX/geometry/PxGjkQuery.h @@ -0,0 +1,145 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_GJK_QUERY_H +#define PX_GJK_QUERY_H + +#include "common/PxPhysXCommonConfig.h" +#include "foundation/PxVec3.h" +#include "foundation/PxQuat.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +/** +\brief Collection of GJK query functions (sweeps, raycasts, overlaps, ...). +*/ +class PxGjkQuery +{ +public: + + /** + \brief Abstract interface for a user defined shape GJK mapping support. + A user defined shape consists of a core shape and a margin. If the distance + between two shapes' cores is equal to the sum of their margins, these shapes are + considered touching. + */ + struct Support + { + /* Virtual destructor */ + virtual ~Support() {} + /** + \brief Return the user defined shape margin. Margin should be greater than or equal to 0 + + \return Margin. + */ + virtual PxReal getMargin() const = 0; + /** + \brief Return the farthest point on the user defined shape's core in given direction. + + \param[in] dir Direction + + \return Farthest point in given direction. + */ + virtual PxVec3 supportLocal(const PxVec3& dir) const = 0; + }; + + /** + \brief Computes proximity information for two shapes using GJK-EPA algorithm + + \param[in] a Shape A support mapping + \param[in] b Shape B support mapping + \param[in] poseA Shape A transformation + \param[in] poseB Shape B transformation + \param[in] contactDistance The distance at which proximity info begins to be computed between the shapes + \param[in] toleranceLength The toleranceLength. Used for scaling distance-based thresholds internally to produce appropriate results given simulations in different units + \param[out] pointA The closest/deepest point on shape A surface + \param[out] pointB The closest/deepest point on shape B surface + \param[out] separatingAxis Translating shape B along 'separatingAxis' by 'separation' makes the shapes touching + \param[out] separation Translating shape B along 'separatingAxis' by 'separation' makes the shapes touching + + \return False if the distance greater than contactDistance. + */ + PX_PHYSX_COMMON_API static bool proximityInfo(const Support& a, const Support& b, const PxTransform& poseA, const PxTransform& poseB, + PxReal contactDistance, PxReal toleranceLength, PxVec3& pointA, PxVec3& pointB, PxVec3& separatingAxis, PxReal& separation); + + /** + \brief Raycast test against the given shape. + + \param[in] shape Shape support mapping + \param[in] pose Shape transformation + \param[in] rayStart The start point of the ray to test the shape against + \param[in] unitDir Normalized direction of the ray to test the shape against + \param[in] maxDist Maximum ray length, has to be in the [0, inf) range + \param[out] t Hit distance + \param[out] n Hit normal + \param[out] p Hit point + + \return True if there is a hit. + */ + PX_PHYSX_COMMON_API static bool raycast(const Support& shape, const PxTransform& pose, const PxVec3& rayStart, + const PxVec3& unitDir, PxReal maxDist, PxReal& t, PxVec3& n, PxVec3& p); + + /** + \brief Overlap test for two shapes. + + \param[in] a Shape A support mapping + \param[in] b Shape B support mapping + \param[in] poseA Shape A transformation + \param[in] poseB Shape B transformation + + \return True if the shapes overlap. + */ + PX_PHYSX_COMMON_API static bool overlap(const Support& a, const Support& b, const PxTransform& poseA, const PxTransform& poseB); + + /** + \brief Sweep the shape B in space and test for collision with the shape A. + + \param[in] a Shape A support mapping + \param[in] b Shape B support mapping + \param[in] poseA Shape A transformation + \param[in] poseB Shape B transformation + \param[in] unitDir Normalized direction of the ray to test the shape against + \param[in] maxDist Maximum ray length, has to be in the [0, inf) range + \param[out] t Hit distance + \param[out] n Hit normal + \param[out] p Hit point + + \return True if there is a hit. + */ + PX_PHYSX_COMMON_API static bool sweep(const Support& a, const Support& b, const PxTransform& poseA, const PxTransform& poseB, + const PxVec3& unitDir, PxReal maxDist, PxReal& t, PxVec3& n, PxVec3& p); +}; + +#if !PX_DOXYGEN +} +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/geometry/PxHairSystemDesc.h b/Source/ThirdParty/PhysX/geometry/PxHairSystemDesc.h new file mode 100644 index 000000000..f5ab60ed9 --- /dev/null +++ b/Source/ThirdParty/PhysX/geometry/PxHairSystemDesc.h @@ -0,0 +1,200 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. + + +#ifndef PX_HAIRSYSTEM_DESC_H +#define PX_HAIRSYSTEM_DESC_H +/** \addtogroup geomutils +@{ +*/ + +#include "foundation/PxFlags.h" +#include "common/PxCoreUtilityTypes.h" + +#if PX_ENABLE_FEATURES_UNDER_CONSTRUCTION + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + struct PxHairSystemDescFlag + { + enum Enum + { + /** + Determines whether or not to allocate memory on device (GPU) or on Host (CPU) + */ + eDEVICE_MEMORY = (1<<0) + }; + }; + + /** + \brief collection of set bits defined in PxHairSystemDescFlag + \see PxHairSystemDescFlag + */ + typedef PxFlags PxHairSystemDescFlags; + PX_FLAGS_OPERATORS(PxHairSystemDescFlag::Enum, PxU16) + + /** + \brief Descriptor class for #PxHairSystem + \note The data is *copied* when a PxHairSystem object is created from this + descriptor. The user may discard the data after the call. + + \see PxHairSystem PxHairSystemGeometry PxShape PxPhysics.createHairSystem() + PxCooking.createHairSystem() + */ + class PxHairSystemDesc + { + public: + /** + \brief The number of strands in this hair system + + Default: 0 + */ + PxU32 numStrands; + + /** + \brief The length of a hair segment + + Default: 0.1 + */ + PxReal segmentLength; + + /** + \brief The radius of a hair segment + + Default: 0.01 + */ + PxReal segmentRadius; + + /** + \brief Specifies the number of vertices each strand is composed of. + Length must be equal to numStrands, elements assumed to be of + type PxU32. Number of segments = numVerticesPerStrand - 1. + + Default: NULL + */ + PxBoundedData numVerticesPerStrand; + + /** + \brief Vertex positions and inverse mass [x,y,z,1/m] in PxBoundedData format. + If count equal to numStrands, assumed to be strand root positions, + otherwise positions of all vertices sorted by strands and increasing + from root towards tip of strand. + Type assumed to be of PxReal. + + Default: NULL + */ + PxBoundedData vertices; + + /** + \brief Vertex velocities in PxBoundedData format. + If NULL, zero velocity is assumed. + Type assumed to be of PxReal. + + Default: NULL + */ + PxBoundedData velocities; + + /** + \brief Flags bits, combined from values of the enum ::PxHairSystemDesc + + Default: 0 + */ + PxHairSystemDescFlags flags; + + /** + \brief Constructor with default initialization + */ + PX_INLINE PxHairSystemDesc(); + + /** + \brief (re)sets the structure to the default. + */ + PX_INLINE void setToDefault(); + + /** + \brief Check whether the descriptor is valid + \return True if the current settings are valid + */ + PX_INLINE bool isValid() const; + }; + + PX_INLINE PxHairSystemDesc::PxHairSystemDesc() + { + numStrands = 0; + segmentLength = 0.1f; + segmentRadius = 0.01f; + } + + PX_INLINE void PxHairSystemDesc::setToDefault() + { + *this = PxHairSystemDesc(); + } + + PX_INLINE bool PxHairSystemDesc::isValid() const + { + if (segmentLength < 0.0f || segmentRadius < 0.0f) + return false; + + if (2.0f * segmentRadius >= segmentLength) + return false; + + if (numStrands == 0) + return false; + + if (numVerticesPerStrand.count != numStrands) + return false; + + PxU32 totalNumVertices = 0; + for (PxU32 i = 0; i < numVerticesPerStrand.count; i++) + { + const PxU32 numVertices = numVerticesPerStrand.at(i); + totalNumVertices += numVertices; + if (numVertices < 2) + { + return false; + } + } + + if (vertices.count != totalNumVertices && vertices.count != numStrands) + return false; + + if (velocities.count != totalNumVertices && velocities.count != 0) + return false; + + return true; + } + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/geometry/PxHairSystemGeometry.h b/Source/ThirdParty/PhysX/geometry/PxHairSystemGeometry.h new file mode 100644 index 000000000..6d35c5245 --- /dev/null +++ b/Source/ThirdParty/PhysX/geometry/PxHairSystemGeometry.h @@ -0,0 +1,73 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. + + +#ifndef PX_HAIRSYSTEM_GEOMETRY_H +#define PX_HAIRSYSTEM_GEOMETRY_H +/** \addtogroup geomutils +@{ +*/ +#include "geometry/PxGeometry.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief Hair system geometry class. + + */ + class PxHairSystemGeometry : public PxGeometry + { + public: + /** + \brief Default constructor. + */ + PX_INLINE PxHairSystemGeometry() : PxGeometry(PxGeometryType::eHAIRSYSTEM) {} + + /** + \brief Returns true if the geometry is valid. + + \return True if the current settings are valid for shape creation. + + @see PxRigidActor::createShape, PxPhysics::createShape + */ + PX_FORCE_INLINE bool isValid() const + { + if(mType != PxGeometryType::eHAIRSYSTEM) + return false; + + return true; + } + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + + /** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/geometry/PxHeightField.h b/Source/ThirdParty/PhysX/geometry/PxHeightField.h index 346659569..d76042228 100644 --- a/Source/ThirdParty/PhysX/geometry/PxHeightField.h +++ b/Source/ThirdParty/PhysX/geometry/PxHeightField.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_GEOMUTILS_NX_HEIGHTFIELD -#define PX_PHYSICS_GEOMUTILS_NX_HEIGHTFIELD +#ifndef PX_HEIGHTFIELD_H +#define PX_HEIGHTFIELD_H /** \addtogroup geomutils @{ */ @@ -68,7 +66,7 @@ via the PxHeightFieldGeometry and PxShape classes.

Creation

To create an instance of this class call PxPhysics::createHeightField() or -PxCooking::createHeightField(const PxHeightFieldDesc&, PxPhysicsInsertionCallback&). +PxCooking::createHeightField(const PxHeightFieldDesc&, PxInsertionCallback&). To delete it call release(). This is only possible once you have released all of its PxHeightFiedShape instances. @@ -82,7 +80,7 @@ once you have released all of its PxHeightFiedShape instances. @see PxHeightFieldDesc PxHeightFieldGeometry PxShape PxPhysics.createHeightField() PxCooking.createHeightField() */ -class PxHeightField : public PxBase +class PxHeightField : public PxRefCounted { public: /** @@ -90,7 +88,7 @@ class PxHeightField : public PxBase @see PxPhysics.createHeightField() PxHeightFieldDesc PxHeightFieldGeometry PxShape */ - PX_PHYSX_COMMON_API virtual void release() = 0; + virtual void release() = 0; /** \brief Writes out the sample data array. @@ -104,7 +102,7 @@ class PxHeightField : public PxBase @see PxHeightFieldDesc.samples */ - PX_PHYSX_COMMON_API virtual PxU32 saveCells(void* destBuffer, PxU32 destBufferSize) const = 0; + virtual PxU32 saveCells(void* destBuffer, PxU32 destBufferSize) const = 0; /** \brief Replaces a rectangular subfield in the sample data array. @@ -126,7 +124,7 @@ class PxHeightField : public PxBase @see PxHeightFieldDesc.samples PxShape.setGeometry */ - PX_PHYSX_COMMON_API virtual bool modifySamples(PxI32 startCol, PxI32 startRow, const PxHeightFieldDesc& subfieldDesc, bool shrinkBounds = false) = 0; + virtual bool modifySamples(PxI32 startCol, PxI32 startRow, const PxHeightFieldDesc& subfieldDesc, bool shrinkBounds = false) = 0; /** \brief Retrieves the number of sample rows in the samples array. @@ -135,7 +133,7 @@ class PxHeightField : public PxBase @see PxHeightFieldDesc.nbRows */ - PX_PHYSX_COMMON_API virtual PxU32 getNbRows() const = 0; + virtual PxU32 getNbRows() const = 0; /** \brief Retrieves the number of sample columns in the samples array. @@ -144,7 +142,7 @@ class PxHeightField : public PxBase @see PxHeightFieldDesc.nbColumns */ - PX_PHYSX_COMMON_API virtual PxU32 getNbColumns() const = 0; + virtual PxU32 getNbColumns() const = 0; /** \brief Retrieves the format of the sample data. @@ -153,7 +151,7 @@ class PxHeightField : public PxBase @see PxHeightFieldDesc.format PxHeightFieldFormat */ - PX_PHYSX_COMMON_API virtual PxHeightFieldFormat::Enum getFormat() const = 0; + virtual PxHeightFieldFormat::Enum getFormat() const = 0; /** \brief Retrieves the offset in bytes between consecutive samples in the array. @@ -162,7 +160,7 @@ class PxHeightField : public PxBase @see PxHeightFieldDesc.sampleStride */ - PX_PHYSX_COMMON_API virtual PxU32 getSampleStride() const = 0; + virtual PxU32 getSampleStride() const = 0; /** \brief Retrieves the convex edge threshold. @@ -171,7 +169,7 @@ class PxHeightField : public PxBase @see PxHeightFieldDesc.convexEdgeThreshold */ - PX_PHYSX_COMMON_API virtual PxReal getConvexEdgeThreshold() const = 0; + virtual PxReal getConvexEdgeThreshold() const = 0; /** \brief Retrieves the flags bits, combined from values of the enum ::PxHeightFieldFlag. @@ -180,31 +178,14 @@ class PxHeightField : public PxBase @see PxHeightFieldDesc.flags PxHeightFieldFlag */ - PX_PHYSX_COMMON_API virtual PxHeightFieldFlags getFlags() const = 0; + virtual PxHeightFieldFlags getFlags() const = 0; /** \brief Retrieves the height at the given coordinates in grid space. \return The height at the given coordinates or 0 if the coordinates are out of range. */ - PX_PHYSX_COMMON_API virtual PxReal getHeight(PxReal x, PxReal z) const = 0; - - /** - \brief Returns the reference count for shared heightfields. - - At creation, the reference count of the heightfield is 1. Every shape referencing this heightfield increments the - count by 1. When the reference count reaches 0, and only then, the heightfield gets destroyed automatically. - - \return the current reference count. - */ - PX_PHYSX_COMMON_API virtual PxU32 getReferenceCount() const = 0; - - /** - \brief Acquires a counted reference to a heightfield. - - This method increases the reference count of the heightfield by 1. Decrement the reference count by calling release() - */ - PX_PHYSX_COMMON_API virtual void acquireReference() = 0; + virtual PxReal getHeight(PxReal x, PxReal z) const = 0; /** \brief Returns material table index of given triangle @@ -214,7 +195,7 @@ class PxHeightField : public PxBase \param[in] triangleIndex (internal) index of desired triangle \return Material table index, or 0xffff if no per-triangle materials are used */ - PX_PHYSX_COMMON_API virtual PxMaterialTableIndex getTriangleMaterialIndex(PxTriangleID triangleIndex) const = 0; + virtual PxMaterialTableIndex getTriangleMaterialIndex(PxTriangleID triangleIndex) const = 0; /** \brief Returns a triangle face normal for a given triangle index @@ -224,7 +205,7 @@ class PxHeightField : public PxBase \param[in] triangleIndex (internal) index of desired triangle \return Triangle normal for a given triangle index */ - PX_PHYSX_COMMON_API virtual PxVec3 getTriangleNormal(PxTriangleID triangleIndex) const = 0; + virtual PxVec3 getTriangleNormal(PxTriangleID triangleIndex) const = 0; /** \brief Returns heightfield sample of given row and column @@ -233,7 +214,7 @@ class PxHeightField : public PxBase \param[in] column Given heightfield column \return Heightfield sample */ - PX_PHYSX_COMMON_API virtual const PxHeightFieldSample& getSample(PxU32 row, PxU32 column) const = 0; + virtual const PxHeightFieldSample& getSample(PxU32 row, PxU32 column) const = 0; /** \brief Returns the number of times the heightfield data has been modified @@ -243,15 +224,15 @@ class PxHeightField : public PxBase \return the number of times the heightfield sample data has been modified. */ - PX_PHYSX_COMMON_API virtual PxU32 getTimestamp() const = 0; + virtual PxU32 getTimestamp() const = 0; - PX_PHYSX_COMMON_API virtual const char* getConcreteTypeName() const { return "PxHeightField"; } + virtual const char* getConcreteTypeName() const { return "PxHeightField"; } protected: - PX_INLINE PxHeightField(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags) {} - PX_INLINE PxHeightField(PxBaseFlags baseFlags) : PxBase(baseFlags) {} - PX_PHYSX_COMMON_API virtual ~PxHeightField() {} - PX_PHYSX_COMMON_API virtual bool isKindOf(const char* name) const { return !::strcmp("PxHeightField", name) || PxBase::isKindOf(name); } + PX_INLINE PxHeightField(PxType concreteType, PxBaseFlags baseFlags) : PxRefCounted(concreteType, baseFlags) {} + PX_INLINE PxHeightField(PxBaseFlags baseFlags) : PxRefCounted(baseFlags) {} + virtual ~PxHeightField() {} + virtual bool isKindOf(const char* name) const { return !::strcmp("PxHeightField", name) || PxRefCounted::isKindOf(name); } }; #if !PX_DOXYGEN diff --git a/Source/ThirdParty/PhysX/geometry/PxHeightFieldDesc.h b/Source/ThirdParty/PhysX/geometry/PxHeightFieldDesc.h index 669e91559..bb9ac8228 100644 --- a/Source/ThirdParty/PhysX/geometry/PxHeightFieldDesc.h +++ b/Source/ThirdParty/PhysX/geometry/PxHeightFieldDesc.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_COLLISION_NXHEIGHTFIELDDESC -#define PX_COLLISION_NXHEIGHTFIELDDESC +#ifndef PX_HEIGHTFIELD_DESC_H +#define PX_HEIGHTFIELD_DESC_H /** \addtogroup geomutils @{ */ diff --git a/Source/ThirdParty/PhysX/geometry/PxHeightFieldFlag.h b/Source/ThirdParty/PhysX/geometry/PxHeightFieldFlag.h index 85b27a339..b09472551 100644 --- a/Source/ThirdParty/PhysX/geometry/PxHeightFieldFlag.h +++ b/Source/ThirdParty/PhysX/geometry/PxHeightFieldFlag.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_COLLISION_NXHEIGHTFIELDFLAG -#define PX_COLLISION_NXHEIGHTFIELDFLAG +#ifndef PX_HEIGHT_FIELD_FLAG_H +#define PX_HEIGHT_FIELD_FLAG_H /** \addtogroup geomutils @{ */ diff --git a/Source/ThirdParty/PhysX/geometry/PxHeightFieldGeometry.h b/Source/ThirdParty/PhysX/geometry/PxHeightFieldGeometry.h index d32c1b89d..b64c32dda 100644 --- a/Source/ThirdParty/PhysX/geometry/PxHeightFieldGeometry.h +++ b/Source/ThirdParty/PhysX/geometry/PxHeightFieldGeometry.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_HEIGHTFIELD_GEOMETRY -#define PX_PHYSICS_NX_HEIGHTFIELD_GEOMETRY +#ifndef PX_HEIGHT_FIELD_GEOMETRY_H +#define PX_HEIGHT_FIELD_GEOMETRY_H /** \addtogroup geomutils @{ */ @@ -56,29 +54,51 @@ There is a minimum allowed value for Y and XZ scaling - PX_MIN_HEIGHTFIELD_XZ_SC class PxHeightFieldGeometry : public PxGeometry { public: - PX_INLINE PxHeightFieldGeometry() : - PxGeometry (PxGeometryType::eHEIGHTFIELD), - heightField (NULL), - heightScale (1.0f), - rowScale (1.0f), - columnScale (1.0f), - heightFieldFlags(0) - {} - - PX_INLINE PxHeightFieldGeometry(PxHeightField* hf, - PxMeshGeometryFlags flags, - PxReal heightScale_, - PxReal rowScale_, - PxReal columnScale_) : + /** + \brief Constructor. + */ + PX_INLINE PxHeightFieldGeometry(PxHeightField* hf = NULL, + PxMeshGeometryFlags flags = PxMeshGeometryFlag::Enum(0), + PxReal heightScale_ = 1.0f, + PxReal rowScale_ = 1.0f, + PxReal columnScale_ = 1.0f) : PxGeometry (PxGeometryType::eHEIGHTFIELD), - heightField (hf) , - heightScale (heightScale_), - rowScale (rowScale_), - columnScale (columnScale_), + heightField (hf), + heightScale (heightScale_), + rowScale (rowScale_), + columnScale (columnScale_), heightFieldFlags (flags) { } + /** + \brief Copy constructor. + + \param[in] that Other object + */ + PX_INLINE PxHeightFieldGeometry(const PxHeightFieldGeometry& that) : + PxGeometry (that), + heightField (that.heightField), + heightScale (that.heightScale), + rowScale (that.rowScale), + columnScale (that.columnScale), + heightFieldFlags (that.heightFieldFlags) + { + } + + /** + \brief Assignment operator + */ + PX_INLINE void operator=(const PxHeightFieldGeometry& that) + { + mType = that.mType; + heightField = that.heightField; + heightScale = that.heightScale; + rowScale = that.rowScale; + columnScale = that.columnScale; + heightFieldFlags = that.heightFieldFlags; + } + /** \brief Returns true if the geometry is valid. @@ -95,41 +115,41 @@ public: /** \brief The height field data. */ - PxHeightField* heightField; + PxHeightField* heightField; /** \brief The scaling factor for the height field in vertical direction (y direction in local space). */ - PxReal heightScale; + PxReal heightScale; /** \brief The scaling factor for the height field in the row direction (x direction in local space). */ - PxReal rowScale; + PxReal rowScale; /** \brief The scaling factor for the height field in the column direction (z direction in local space). */ - PxReal columnScale; + PxReal columnScale; /** \brief Flags to specify some collision properties for the height field. */ - PxMeshGeometryFlags heightFieldFlags; + PxMeshGeometryFlags heightFieldFlags; - PxPadding<3> paddingFromFlags; //!< padding for mesh flags. + PxPadding<3> paddingFromFlags; //!< padding for mesh flags. }; PX_INLINE bool PxHeightFieldGeometry::isValid() const { - if (mType != PxGeometryType::eHEIGHTFIELD) + if(mType != PxGeometryType::eHEIGHTFIELD) return false; - if (!PxIsFinite(heightScale) || !PxIsFinite(rowScale) || !PxIsFinite(columnScale)) + if(!PxIsFinite(heightScale) || !PxIsFinite(rowScale) || !PxIsFinite(columnScale)) return false; - if (rowScale < PX_MIN_HEIGHTFIELD_XZ_SCALE || columnScale < PX_MIN_HEIGHTFIELD_XZ_SCALE || heightScale < PX_MIN_HEIGHTFIELD_Y_SCALE) + if(rowScale < PX_MIN_HEIGHTFIELD_XZ_SCALE || columnScale < PX_MIN_HEIGHTFIELD_XZ_SCALE || heightScale < PX_MIN_HEIGHTFIELD_Y_SCALE) return false; - if (!heightField) + if(!heightField) return false; return true; diff --git a/Source/ThirdParty/PhysX/geometry/PxHeightFieldSample.h b/Source/ThirdParty/PhysX/geometry/PxHeightFieldSample.h index a0489974c..82df7fdf1 100644 --- a/Source/ThirdParty/PhysX/geometry/PxHeightFieldSample.h +++ b/Source/ThirdParty/PhysX/geometry/PxHeightFieldSample.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NXHEIGHTFIELDSAMPLE -#define PX_PHYSICS_NXHEIGHTFIELDSAMPLE +#ifndef PX_HEIGHT_FIELD_SAMPLE_H +#define PX_HEIGHT_FIELD_SAMPLE_H /** \addtogroup geomutils @{ */ diff --git a/Source/ThirdParty/PhysX/geometry/PxMeshQuery.h b/Source/ThirdParty/PhysX/geometry/PxMeshQuery.h index 7a9cfb6f6..a7c657aac 100644 --- a/Source/ThirdParty/PhysX/geometry/PxMeshQuery.h +++ b/Source/ThirdParty/PhysX/geometry/PxMeshQuery.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,20 +22,21 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_GEOMUTILS_PX_MESH_QUERY -#define PX_PHYSICS_GEOMUTILS_PX_MESH_QUERY +#ifndef PX_MESH_QUERY_H +#define PX_MESH_QUERY_H /** \addtogroup geomutils @{ */ #include "common/PxPhysXCommonConfig.h" -#include "PxQueryReport.h" +#include "geometry/PxGeometryHit.h" +#include "geometry/PxGeometryQueryFlags.h" +#include "geometry/PxReportCallback.h" #if !PX_DOXYGEN namespace physx @@ -50,6 +50,17 @@ class PxHeightFieldGeometry; class PxTriangle; + struct PxMeshMeshQueryFlag + { + enum Enum + { + eDEFAULT = 0, //!< Report all overlaps + eDISCARD_COPLANAR = (1<<0) //!< Ignore coplanar triangle-triangle overlaps + }; + }; + + PX_FLAGS_TYPEDEF(PxMeshMeshQueryFlag, PxU32) + class PxMeshQuery { public: @@ -59,12 +70,12 @@ public: This function can be used together with #findOverlapTriangleMesh() to retrieve triangle properties. - \param[in] triGeom Geometry of the triangle mesh to extract the triangle from. - \param[in] transform Transform for the triangle mesh - \param[in] triangleIndex The index of the triangle to retrieve. - \param[out] triangle Triangle points in world space. - \param[out] vertexIndices Returned vertex indices for given triangle - \param[out] adjacencyIndices Returned 3 triangle adjacency internal face indices (0xFFFFFFFF if no adjacency). The mesh must be cooked with cooking param buildTriangleAdjacencies enabled. + \param[in] triGeom Geometry of the triangle mesh to extract the triangle from. + \param[in] transform Transform for the triangle mesh + \param[in] triangleIndex The index of the triangle to retrieve. + \param[out] triangle Triangle points in world space. + \param[out] vertexIndices Returned vertex indices for given triangle + \param[out] adjacencyIndices Returned 3 triangle adjacency internal face indices (0xFFFFFFFF if no adjacency). The mesh must be cooked with cooking param buildTriangleAdjacencies enabled. \note This function will flip the triangle normal whenever triGeom.scale.hasNegativeDeterminant() is true. @@ -78,12 +89,12 @@ public: This function can be used together with #findOverlapHeightField() to retrieve triangle properties. - \param[in] hfGeom Geometry of the height field to extract the triangle from. - \param[in] transform Transform for the height field. - \param[in] triangleIndex The index of the triangle to retrieve. - \param[out] triangle Triangle points in world space. - \param[out] vertexIndices Returned vertex indices for given triangle - \param[out] adjacencyIndices Returned 3 triangle adjacency triangle indices (0xFFFFFFFF if no adjacency). + \param[in] hfGeom Geometry of the height field to extract the triangle from. + \param[in] transform Transform for the height field. + \param[in] triangleIndex The index of the triangle to retrieve. + \param[out] triangle Triangle points in world space. + \param[out] vertexIndices Returned vertex indices for given triangle + \param[out] adjacencyIndices Returned 3 triangle adjacency triangle indices (0xFFFFFFFF if no adjacency). \note This function will flip the triangle normal whenever triGeom.scale.hasNegativeDeterminant() is true. \note TriangleIndex is an index used in internal format, which does have an index out of the bounds in last row. @@ -107,44 +118,78 @@ public: /** \brief Find the mesh triangles which touch the specified geometry object. + For mesh-vs-mesh overlap tests, please use the specialized function below. + Returned triangle indices can be used with #getTriangle() to retrieve the triangle properties. - \param[in] geom The geometry object to test for mesh triangle overlaps. Supported geometries are #PxSphereGeometry, #PxCapsuleGeometry and #PxBoxGeometry - \param[in] geomPose Pose of the geometry object - \param[in] meshGeom The triangle mesh geometry to check overlap against - \param[in] meshPose Pose of the triangle mesh - \param[out] results Indices of overlapping triangles - \param[in] maxResults Size of 'results' buffer - \param[in] startIndex Index of first result to be retrieved. Previous indices are skipped. - \param[out] overflow True if a buffer overflow occurred + \param[in] geom The geometry object to test for mesh triangle overlaps. Supported geometries are #PxSphereGeometry, #PxCapsuleGeometry and #PxBoxGeometry + \param[in] geomPose Pose of the geometry object + \param[in] meshGeom The triangle mesh geometry to check overlap against + \param[in] meshPose Pose of the triangle mesh + \param[out] results Indices of overlapping triangles + \param[in] maxResults Size of 'results' buffer + \param[in] startIndex Index of first result to be retrieved. Previous indices are skipped. + \param[out] overflow True if a buffer overflow occurred + \param[in] queryFlags Optional flags controlling the query. \return Number of overlaps found, i.e. number of elements written to the results buffer - @see PxTriangleMeshGeometry getTriangle() + @see PxTriangleMeshGeometry getTriangle() PxGeometryQueryFlags */ PX_PHYSX_COMMON_API static PxU32 findOverlapTriangleMesh( const PxGeometry& geom, const PxTransform& geomPose, const PxTriangleMeshGeometry& meshGeom, const PxTransform& meshPose, - PxU32* results, PxU32 maxResults, PxU32 startIndex, bool& overflow); + PxU32* results, PxU32 maxResults, PxU32 startIndex, bool& overflow, + PxGeometryQueryFlags queryFlags = PxGeometryQueryFlag::eDEFAULT); + + /** + \brief Mesh-vs-mesh overlap test + + A specialized findOverlapTriangleMesh function for mesh-vs-mesh. The other findOverlapTriangleMesh() function above cannot be used + directly since it only returns a single set of triangle indices that belongs to one of the meshes only. This function returns pairs + of triangle indices that belong to both the first & second input meshes. + + Returned triangle indices can be used with #getTriangle() to retrieve the triangle properties. + + \note This is only implemented for the PxMeshMidPhase::eBVH34 data structure. + + \param[in] callback The callback object used to report results + \param[in] meshGeom0 First triangle mesh geometry + \param[in] meshPose0 Pose of first triangle mesh geometry + \param[in] meshGeom1 Second triangle mesh geometry + \param[in] meshPose1 Pose of second triangle mesh geometry + \param[in] queryFlags Optional flags controlling the query. + \param[in] meshMeshFlags Optional flags controlling the query. + \return true if an overlap has been detected, false if the meshes are disjoint + + @see PxTriangleMeshGeometry getTriangle() PxReportCallback PxGeometryQueryFlags PxMeshMeshQueryFlags + */ + PX_PHYSX_COMMON_API static bool findOverlapTriangleMesh(PxReportCallback& callback, + const PxTriangleMeshGeometry& meshGeom0, const PxTransform& meshPose0, + const PxTriangleMeshGeometry& meshGeom1, const PxTransform& meshPose1, + PxGeometryQueryFlags queryFlags = PxGeometryQueryFlag::eDEFAULT, + PxMeshMeshQueryFlags meshMeshFlags = PxMeshMeshQueryFlag::eDEFAULT); /** \brief Find the height field triangles which touch the specified geometry object. Returned triangle indices can be used with #getTriangle() to retrieve the triangle properties. - \param[in] geom The geometry object to test for height field overlaps. Supported geometries are #PxSphereGeometry, #PxCapsuleGeometry and #PxBoxGeometry. The sphere and capsule queries are currently conservative estimates. - \param[in] geomPose Pose of the geometry object - \param[in] hfGeom The height field geometry to check overlap against - \param[in] hfPose Pose of the height field - \param[out] results Indices of overlapping triangles - \param[in] maxResults Size of 'results' buffer - \param[in] startIndex Index of first result to be retrieved. Previous indices are skipped. - \param[out] overflow True if a buffer overflow occurred + \param[in] geom The geometry object to test for height field overlaps. Supported geometries are #PxSphereGeometry, #PxCapsuleGeometry and #PxBoxGeometry. The sphere and capsule queries are currently conservative estimates. + \param[in] geomPose Pose of the geometry object + \param[in] hfGeom The height field geometry to check overlap against + \param[in] hfPose Pose of the height field + \param[out] results Indices of overlapping triangles + \param[in] maxResults Size of 'results' buffer + \param[in] startIndex Index of first result to be retrieved. Previous indices are skipped. + \param[out] overflow True if a buffer overflow occurred + \param[in] queryFlags Optional flags controlling the query. \return Number of overlaps found, i.e. number of elements written to the results buffer - @see PxHeightFieldGeometry getTriangle() + @see PxHeightFieldGeometry getTriangle() PxGeometryQueryFlags */ PX_PHYSX_COMMON_API static PxU32 findOverlapHeightField(const PxGeometry& geom, const PxTransform& geomPose, const PxHeightFieldGeometry& hfGeom, const PxTransform& hfPose, - PxU32* results, PxU32 maxResults, PxU32 startIndex, bool& overflow); + PxU32* results, PxU32 maxResults, PxU32 startIndex, bool& overflow, + PxGeometryQueryFlags queryFlags = PxGeometryQueryFlag::eDEFAULT); /** @@ -153,17 +198,18 @@ public: This function simply sweeps input geometry against each input triangle, in the order they are given. This is an O(N) operation with N = number of input triangles. It does not use any particular acceleration structure. - \param[in] unitDir Normalized direction of the sweep. - \param[in] distance Sweep distance. Needs to be larger than 0. Clamped to PX_MAX_SWEEP_DISTANCE. - \param[in] geom The geometry object to sweep. Supported geometries are #PxSphereGeometry, #PxCapsuleGeometry and #PxBoxGeometry - \param[in] pose Pose of the geometry object to sweep. - \param[in] triangleCount Number of specified triangles - \param[in] triangles Array of triangles to sweep against - \param[out] sweepHit The sweep hit information. See the notes below for limitations about returned results. - \param[in] hitFlags Specification of the kind of information to retrieve on hit. Combination of #PxHitFlag flags. See the notes below for limitations about supported flags. - \param[in] cachedIndex Cached triangle index for subsequent calls. Cached triangle is tested first. Optional parameter. - \param[in] inflation This parameter creates a skin around the swept geometry which increases its extents for sweeping. The sweep will register a hit as soon as the skin touches a shape, and will return the corresponding distance and normal. - \param[in] doubleSided Counterpart of PxMeshGeometryFlag::eDOUBLE_SIDED for input triangles. + \param[in] unitDir Normalized direction of the sweep. + \param[in] distance Sweep distance. Needs to be larger than 0. Clamped to PX_MAX_SWEEP_DISTANCE. + \param[in] geom The geometry object to sweep. Supported geometries are #PxSphereGeometry, #PxCapsuleGeometry and #PxBoxGeometry + \param[in] pose Pose of the geometry object to sweep. + \param[in] triangleCount Number of specified triangles + \param[in] triangles Array of triangles to sweep against + \param[out] sweepHit The sweep hit information. See the notes below for limitations about returned results. + \param[in] hitFlags Specification of the kind of information to retrieve on hit. Combination of #PxHitFlag flags. See the notes below for limitations about supported flags. + \param[in] cachedIndex Cached triangle index for subsequent calls. Cached triangle is tested first. Optional parameter. + \param[in] inflation This parameter creates a skin around the swept geometry which increases its extents for sweeping. The sweep will register a hit as soon as the skin touches a shape, and will return the corresponding distance and normal. + \param[in] doubleSided Counterpart of PxMeshGeometryFlag::eDOUBLE_SIDED for input triangles. + \param[in] queryFlags Optional flags controlling the query. \return True if the swept geometry object hits the specified triangles \note Only the following geometry types are currently supported: PxSphereGeometry, PxCapsuleGeometry, PxBoxGeometry @@ -173,11 +219,10 @@ public: \note ePOSITION is only defined when there is no initial overlap (sweepHit.hadInitialOverlap() == false) \note The returned normal for initially overlapping sweeps is set to -unitDir. \note Otherwise the returned normal is the front normal of the triangle even if PxHitFlag::eMESH_BOTH_SIDES is set. - \note The returned PxSweepHit::faceIndex parameter will hold the index of the hit triangle in input array, i.e. the range is [0; triangleCount). For initially overlapping sweeps, this is the index of overlapping triangle. - \note The returned PxSweepHit::actor and PxSweepHit::shape pointers are not filled. + \note The returned PxGeomSweepHit::faceIndex parameter will hold the index of the hit triangle in input array, i.e. the range is [0; triangleCount). For initially overlapping sweeps, this is the index of overlapping triangle. \note The inflation parameter is not compatible with PxHitFlag::ePRECISE_SWEEP. - @see PxTriangle PxSweepHit PxGeometry PxTransform + @see PxTriangle PxSweepHit PxGeometry PxTransform PxGeometryQueryFlags */ PX_PHYSX_COMMON_API static bool sweep(const PxVec3& unitDir, const PxReal distance, @@ -185,11 +230,12 @@ public: const PxTransform& pose, PxU32 triangleCount, const PxTriangle* triangles, - PxSweepHit& sweepHit, + PxGeomSweepHit& sweepHit, PxHitFlags hitFlags = PxHitFlag::eDEFAULT, const PxU32* cachedIndex = NULL, const PxReal inflation = 0.0f, - bool doubleSided = false); + bool doubleSided = false, + PxGeometryQueryFlags queryFlags = PxGeometryQueryFlag::eDEFAULT); }; diff --git a/Source/ThirdParty/PhysX/geometry/PxMeshScale.h b/Source/ThirdParty/PhysX/geometry/PxMeshScale.h index 02bf3659a..813435664 100644 --- a/Source/ThirdParty/PhysX/geometry/PxMeshScale.h +++ b/Source/ThirdParty/PhysX/geometry/PxMeshScale.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_MESHSCALE -#define PX_PHYSICS_NX_MESHSCALE +#ifndef PX_MESH_SCALE_H +#define PX_MESH_SCALE_H /** \addtogroup geomutils @{ */ @@ -54,7 +52,9 @@ namespace physx /** \brief A class expressing a nonuniform scaling transformation. -The scaling is along arbitrary axes that are specified by PxMeshScale::rotation. +The scaling is along arbitrary axes that are specified by PxMeshScale::rotation. Specifically, PxMeshScale::rotation +describes the rotation from the scaling-axes frame to the mesh-local frame, i.e. PxMeshScale::rotation.rotate(v) transforms +the coordinates of vertex v from the mesh-local frame to the scaling-axes frame. \note Negative scale values are supported for PxTriangleMeshGeometry with absolute values for each component within [PX_MIN_ABS_MESH_SCALE, PX_MAX_ABS_MESH_SCALE] range. @@ -107,7 +107,6 @@ public: rotation = r; } - /** \brief Returns true if the scaling is an identity transformation. */ @@ -161,10 +160,8 @@ public: return (scale.maxElement() <= PX_MESH_SCALE_MAX) && (scale.minElement() >= PX_MESH_SCALE_MIN); } - PxVec3 scale; //!< A nonuniform scaling - PxQuat rotation; //!< The orientation of the scaling axes - - + PxVec3 scale; //!< A nonuniform scaling + PxQuat rotation; //!< The orientation of the scaling axes }; #if !PX_DOXYGEN diff --git a/Source/ThirdParty/PhysX/geometry/PxParticleSystemGeometry.h b/Source/ThirdParty/PhysX/geometry/PxParticleSystemGeometry.h new file mode 100644 index 000000000..f4578d120 --- /dev/null +++ b/Source/ThirdParty/PhysX/geometry/PxParticleSystemGeometry.h @@ -0,0 +1,99 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_PARTICLESYSTEM_GEOMETRY_H +#define PX_PARTICLESYSTEM_GEOMETRY_H +/** \addtogroup geomutils +@{ +*/ +#include "geometry/PxGeometry.h" +#include "common/PxCoreUtilityTypes.h" +#include "foundation/PxBounds3.h" +#include "foundation/PxVec4.h" +#include "PxParticleSystem.h" +#include "PxParticleSolverType.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief Particle system geometry class. + + */ + class PxParticleSystemGeometry : public PxGeometry + { + public: + /** + \brief Default constructor. + + Creates an empty object with no particles. + */ + PX_INLINE PxParticleSystemGeometry() : PxGeometry(PxGeometryType::ePARTICLESYSTEM){} + + /** + \brief Copy constructor. + + \param[in] that Other object + */ + PX_INLINE PxParticleSystemGeometry(const PxParticleSystemGeometry& that) : PxGeometry(that) {} + + /** + \brief Assignment operator + */ + PX_INLINE void operator=(const PxParticleSystemGeometry& that) + { + mType = that.mType; + mSolverType = that.mSolverType; + } + + /** + \brief Returns true if the geometry is valid. + + \return True if the current settings are valid for shape creation. + + @see PxRigidActor::createShape, PxPhysics::createShape + */ + PX_FORCE_INLINE bool isValid() const + { + if(mType != PxGeometryType::ePARTICLESYSTEM) + return false; + + return true; + } + + PxParticleSolverType::Enum mSolverType; + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + + /** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/geometry/PxPlaneGeometry.h b/Source/ThirdParty/PhysX/geometry/PxPlaneGeometry.h index cbc80e8d5..72c6d1424 100644 --- a/Source/ThirdParty/PhysX/geometry/PxPlaneGeometry.h +++ b/Source/ThirdParty/PhysX/geometry/PxPlaneGeometry.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,18 +22,15 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_PLANE_GEOMETRY -#define PX_PHYSICS_NX_PLANE_GEOMETRY +#ifndef PX_PLANE_GEOMETRY_H +#define PX_PLANE_GEOMETRY_H /** \addtogroup geomutils @{ */ -#include "foundation/PxPlane.h" -#include "foundation/PxTransform.h" #include "geometry/PxGeometry.h" #include "foundation/PxFoundationConfig.h" @@ -59,7 +55,25 @@ To generate a PxTransform from a PxPlane, use PxTransformFromPlaneEquation. class PxPlaneGeometry : public PxGeometry { public: - PX_INLINE PxPlaneGeometry() : PxGeometry(PxGeometryType::ePLANE) {} + /** + \brief Constructor. + */ + PX_INLINE PxPlaneGeometry() : PxGeometry(PxGeometryType::ePLANE) {} + + /** + \brief Copy constructor. + + \param[in] that Other object + */ + PX_INLINE PxPlaneGeometry(const PxPlaneGeometry& that) : PxGeometry(that) {} + + /** + \brief Assignment operator + */ + PX_INLINE void operator=(const PxPlaneGeometry& that) + { + mType = that.mType; + } /** \brief Returns true if the geometry is valid. @@ -69,37 +83,14 @@ public: PX_INLINE bool isValid() const; }; - PX_INLINE bool PxPlaneGeometry::isValid() const { - if (mType != PxGeometryType::ePLANE) + if(mType != PxGeometryType::ePLANE) return false; return true; } - -/** \brief creates a transform from a plane equation, suitable for an actor transform for a PxPlaneGeometry - -\param[in] plane the desired plane equation -\return a PxTransform which will transform the plane PxPlane(1,0,0,0) to the specified plane -*/ - -PX_FOUNDATION_API PxTransform PxTransformFromPlaneEquation(const PxPlane& plane); - -/** \brief creates a plane equation from a transform, such as the actor transform for a PxPlaneGeometry - -\param[in] transform the transform -\return the plane -*/ - - -PX_INLINE PxPlane PxPlaneEquationFromTransform(const PxTransform& transform) -{ - return transform.transform(PxPlane(1.f,0.f,0.f,0.f)); -} - - #if !PX_DOXYGEN } // namespace physx #endif diff --git a/Source/ThirdParty/PhysX/geometry/PxReportCallback.h b/Source/ThirdParty/PhysX/geometry/PxReportCallback.h new file mode 100644 index 000000000..36f2a8fd0 --- /dev/null +++ b/Source/ThirdParty/PhysX/geometry/PxReportCallback.h @@ -0,0 +1,259 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_REPORT_CALLBACK_H +#define PX_REPORT_CALLBACK_H + +/** \addtogroup geomutils + @{ +*/ + +#include "common/PxPhysXCommonConfig.h" +#include "foundation/PxArray.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief Base class for callback reporting an unknown number of items to users. + + This can be used as-is and customized by users, or several pre-designed callbacks can be used instead (see below). + + This design lets users decide how to retrieve the results of a query: + - either one by one via a regular callback + - or one batch at a time via a callback + - or written out directly to their own C-style buffer + - or pushed back to their own PxArray + - etc + + @see PxRegularReportCallback PxLocalStorageReportCallback PxExternalStorageReportCallback PxDynamicArrayReportCallback + */ + template + class PxReportCallback + { + public: + PxReportCallback(T* buffer=NULL, PxU32 capacity=0) : mBuffer(buffer), mCapacity(capacity), mSize(0) {} + virtual ~PxReportCallback() {} + + T* mBuffer; // Destination buffer for writing results. if NULL, the system will use its internal buffer and set that pointer as it sees fit. + // Otherwise users can set it to where they want the results to be written. + PxU32 mCapacity; // Capacity of mBuffer. If mBuffer is NULL, this controls how many items are reported to users at the same time (with a limit of 256). + PxU32 mSize; //!< Current number of items in the buffer. This is entirely managed by the system. + + /** + \brief Reports query results to users. + + This will be called by the system as many times as necessary to report all results. + + \param[in] nbItems Number of reported items + \param[in] items array of reported items + + \return true to continue the query, false to abort the query + */ + virtual bool flushResults(PxU32 nbItems, const T* items) = 0; + }; + + /** + \brief Regular report callback + + This reports results like a regular callback would: + - without explicit buffer management from users + - by default, one item at a time + + This customized callback sends results to users via the processResults() function. + + The capacity parameter dictates how many items can be reported at a time, + i.e. how many times the flushResults/processResults function will be called by the system. + + @see PxReportCallback + */ + template + class PxRegularReportCallback : public PxReportCallback + { + public: + PxRegularReportCallback(const PxU32 capacity=1) + { + PX_ASSERT(capacity<=256); + this->mCapacity = capacity; + } + + virtual bool flushResults(PxU32 nbItems, const T* items) + { + PX_ASSERT(nbItems<=this->mCapacity); + PX_ASSERT(items==this->mBuffer); + return processResults(nbItems, items); + } + + /** + \brief Reports query results to users. + + \param[in] nbItems Number of reported items + \param[in] items array of reported items + + \return true to continue the query, false to abort the query + */ + virtual bool processResults(PxU32 nbItems, const T* items) = 0; + }; + + /** + \brief Local storage report callback + + This is the same as a regular callback, except the destination buffer is a local buffer within the class. + + This customized callback sends results to users via the processResults() function. + + The capacity of the embedded buffer (determined by a template parameter) dictates how many items can be reported at a time, + i.e. how many times the flushResults/processResults function will be called by the system. + + @see PxReportCallback + */ + template + class PxLocalStorageReportCallback : public PxReportCallback + { + T mLocalStorage[capacityT]; + + public: + PxLocalStorageReportCallback() + { + this->mBuffer = mLocalStorage; + this->mCapacity = capacityT; + } + + virtual bool flushResults(PxU32 nbItems, const T* items) + { + PX_ASSERT(items==mLocalStorage); + PX_ASSERT(nbItems<=this->mCapacity); + return processResults(nbItems, items); + } + + /** + \brief Reports query results to users. + + \param[in] nbItems Number of reported items + \param[in] items array of reported items + + \return true to continue the query, false to abort the query + */ + virtual bool processResults(PxU32 nbItems, const T* items) = 0; + }; + + /** + \brief External storage report callback + + This is the same as a regular callback, except the destination buffer is a user-provided external buffer. + + Typically the provided buffer can be larger here than for PxLocalStorageReportCallback, and it could + even be a scratchpad-kind of memory shared by multiple sub-systems. + + This would be the same as having a C-style buffer to write out results in the query interface. + + This customized callback sends results to users via the processResults() function. + + The capacity parameter dictates how many items can be reported at a time, + i.e. how many times the flushResults/processResults function will be called by the system. + + @see PxReportCallback + */ + template + class PxExternalStorageReportCallback : public PxReportCallback + { + public: + PxExternalStorageReportCallback(T* buffer, PxU32 capacity) + { + this->mBuffer = buffer; + this->mCapacity = capacity; + } + + virtual bool flushResults(PxU32 nbItems, const T* items) + { + PX_ASSERT(items==this->mBuffer); + PX_ASSERT(nbItems<=this->mCapacity); + return processResults(nbItems, items); + } + + /** + \brief Reports query results to users. + + \param[in] nbItems Number of reported items + \param[in] items array of reported items + + \return true to continue the query, false to abort the query + */ + virtual bool processResults(PxU32 nbItems, const T* items) = 0; + }; + + /** + \brief Dynamic array report callback + + This callback emulates the behavior of pushing results to a (user-provided) dynamic array. + + This customized callback does not actually call users back during the query, results are + available afterwards in the provided dynamic array. This would be the same as having a PxArray + directly in the query interface. + + @see PxReportCallback + */ + template + class PxDynamicArrayReportCallback : public PxReportCallback + { + public: + PxDynamicArrayReportCallback(PxArray& results) : mResults(results) + { + mResults.reserve(32); + this->mBuffer = mResults.begin(); + this->mCapacity = mResults.capacity(); + } + + virtual bool flushResults(PxU32 nbItems, const T* /*items*/) + { + const PxU32 size = mResults.size(); + const PxU32 capa = mResults.capacity(); + const PxU32 newSize = size+nbItems; + PX_ASSERT(newSize<=capa); + mResults.forceSize_Unsafe(newSize); + if(newSize==capa) + { + const PxU32 newCapa = capa*2; + mResults.reserve(newCapa); + this->mBuffer = mResults.begin() + newSize; + this->mCapacity = mResults.capacity() - newSize; + } + return true; + } + + PxArray& mResults; + }; + +#if !PX_DOXYGEN +} +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/geometry/PxSimpleTriangleMesh.h b/Source/ThirdParty/PhysX/geometry/PxSimpleTriangleMesh.h index 643905dd4..76b448719 100644 --- a/Source/ThirdParty/PhysX/geometry/PxSimpleTriangleMesh.h +++ b/Source/ThirdParty/PhysX/geometry/PxSimpleTriangleMesh.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_GEOMUTILS_NX_SIMPLETRIANGLEMESH -#define PX_PHYSICS_GEOMUTILS_NX_SIMPLETRIANGLEMESH +#ifndef PX_SIMPLE_TRIANGLE_MESH_H +#define PX_SIMPLE_TRIANGLE_MESH_H /** \addtogroup geomutils @{ */ diff --git a/Source/ThirdParty/PhysX/geometry/PxSphereGeometry.h b/Source/ThirdParty/PhysX/geometry/PxSphereGeometry.h index b89191d46..d93985153 100644 --- a/Source/ThirdParty/PhysX/geometry/PxSphereGeometry.h +++ b/Source/ThirdParty/PhysX/geometry/PxSphereGeometry.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_SPHERE_GEOMETRY -#define PX_PHYSICS_NX_SPHERE_GEOMETRY +#ifndef PX_SPHERE_GEOMETRY_H +#define PX_SPHERE_GEOMETRY_H /** \addtogroup geomutils @{ */ @@ -49,8 +47,26 @@ Spheres are defined by their radius. class PxSphereGeometry : public PxGeometry { public: - PX_INLINE PxSphereGeometry() : PxGeometry(PxGeometryType::eSPHERE), radius(0) {} - PX_INLINE PxSphereGeometry(PxReal ir) : PxGeometry(PxGeometryType::eSPHERE), radius(ir) {} + /** + \brief Constructor. + */ + PX_INLINE PxSphereGeometry(PxReal ir=0.0f) : PxGeometry(PxGeometryType::eSPHERE), radius(ir) {} + + /** + \brief Copy constructor. + + \param[in] that Other object + */ + PX_INLINE PxSphereGeometry(const PxSphereGeometry& that) : PxGeometry(that), radius(that.radius) {} + + /** + \brief Assignment operator + */ + PX_INLINE void operator=(const PxSphereGeometry& that) + { + mType = that.mType; + radius = that.radius; + } /** \brief Returns true if the geometry is valid. @@ -72,14 +88,13 @@ public: PxReal radius; }; - PX_INLINE bool PxSphereGeometry::isValid() const { - if (mType != PxGeometryType::eSPHERE) + if(mType != PxGeometryType::eSPHERE) return false; - if (!PxIsFinite(radius)) + if(!PxIsFinite(radius)) return false; - if (radius <= 0.0f) + if(radius <= 0.0f) return false; return true; diff --git a/Source/ThirdParty/PhysX/geometry/PxTetrahedron.h b/Source/ThirdParty/PhysX/geometry/PxTetrahedron.h new file mode 100644 index 000000000..2e0233737 --- /dev/null +++ b/Source/ThirdParty/PhysX/geometry/PxTetrahedron.h @@ -0,0 +1,111 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_TETRAHEDRON_H +#define PX_TETRAHEDRON_H +/** \addtogroup geomutils +@{ +*/ + +#include "common/PxPhysXCommonConfig.h" +#include "foundation/PxVec3.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + /** + \brief Tetrahedron class. + */ + class PxTetrahedron + { + public: + /** + \brief Constructor + */ + PX_FORCE_INLINE PxTetrahedron() {} + + /** + \brief Constructor + + \param[in] p0 Point 0 + \param[in] p1 Point 1 + \param[in] p2 Point 2 + \param[in] p3 Point 3 + */ + PX_FORCE_INLINE PxTetrahedron(const PxVec3& p0, const PxVec3& p1, const PxVec3& p2, const PxVec3& p3) + { + verts[0] = p0; + verts[1] = p1; + verts[2] = p2; + verts[3] = p3; + } + + /** + \brief Copy constructor + + \param[in] tetrahedron copy + */ + PX_FORCE_INLINE PxTetrahedron(const PxTetrahedron& tetrahedron) + { + verts[0] = tetrahedron.verts[0]; + verts[1] = tetrahedron.verts[1]; + verts[2] = tetrahedron.verts[2]; + verts[3] = tetrahedron.verts[3]; + } + + /** + \brief Destructor + */ + PX_FORCE_INLINE ~PxTetrahedron() {} + + /** + \brief Assignment operator + */ + PX_FORCE_INLINE void operator=(const PxTetrahedron& tetrahedron) + { + verts[0] = tetrahedron.verts[0]; + verts[1] = tetrahedron.verts[1]; + verts[2] = tetrahedron.verts[2]; + verts[3] = tetrahedron.verts[3]; + } + /** + \brief Array of Vertices. + */ + PxVec3 verts[4]; + + }; + + +#if !PX_DOXYGEN +} +#endif + +/** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/geometry/PxTetrahedronMesh.h b/Source/ThirdParty/PhysX/geometry/PxTetrahedronMesh.h new file mode 100644 index 000000000..147a64390 --- /dev/null +++ b/Source/ThirdParty/PhysX/geometry/PxTetrahedronMesh.h @@ -0,0 +1,362 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_TETRAHEDRON_MESH_H +#define PX_TETRAHEDRON_MESH_H +/** \addtogroup geomutils +@{ */ + +#include "foundation/PxVec3.h" +#include "foundation/PxBounds3.h" +#include "foundation/PxUserAllocated.h" +#include "common/PxPhysXCommonConfig.h" +#include "common/PxBase.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + struct PxTetrahedronMeshFlag + { + enum Enum + { + e16_BIT_INDICES = (1 << 1) //!< The tetrahedron mesh has 16bits vertex indices + }; + }; + + /** + \brief collection of set bits defined in PxTetrahedronMeshFlag. + + @see PxTetrahedronMeshFlag + */ + typedef PxFlags PxTetrahedronMeshFlags; + PX_FLAGS_OPERATORS(PxTetrahedronMeshFlag::Enum, PxU8) + + + /** + \brief A data container providing mass, rest pose and other information required for softbody simulation + + Stores properties of softbody like inverse mass per node, rest pose matrix per tetrahedral element etc. + Mainly used internally to store runtime data. + + */ + class PxSoftBodyAuxData : public PxRefCounted + { + public: + /** + \brief Decrements the reference count of a tetrahedron mesh and releases it if the new reference count is zero. + + @see PxPhysics.createTetrahedronMesh() + */ + virtual void release() = 0; + + protected: + PX_INLINE PxSoftBodyAuxData(PxType concreteType, PxBaseFlags baseFlags) : PxRefCounted(concreteType, baseFlags) {} + PX_INLINE PxSoftBodyAuxData(PxBaseFlags baseFlags) : PxRefCounted(baseFlags) {} + virtual ~PxSoftBodyAuxData() {} + + virtual bool isKindOf(const char* name) const { return !::strcmp("PxSoftBodyAuxData", name) || PxRefCounted::isKindOf(name); } + }; + + /** + \brief A tetramedron mesh, also called a 'tetrahedron soup'. + + It is represented as an indexed tetrahedron list. There are no restrictions on the + tetrahedron data. + + To avoid duplicating data when you have several instances of a particular + mesh positioned differently, you do not use this class to represent a + mesh object directly. Instead, you create an instance of this mesh via + the PxTetrahedronMeshGeometry and PxShape classes. + +

Creation

+ + To create an instance of this class call PxPhysics::createTetrahedronMesh(), + and release() to delete it. This is only possible + once you have released all of its PxShape instances. + + +

Visualizations:

+ \li #PxVisualizationParameter::eCOLLISION_AABBS + \li #PxVisualizationParameter::eCOLLISION_SHAPES + \li #PxVisualizationParameter::eCOLLISION_AXES + \li #PxVisualizationParameter::eCOLLISION_FNORMALS + \li #PxVisualizationParameter::eCOLLISION_EDGES + + @see PxTetrahedronMeshDesc PxTetrahedronMeshGeometry PxShape PxPhysics.createTetrahedronMesh() + */ + class PxTetrahedronMesh : public PxRefCounted + { + public: + /** + \brief Returns the number of vertices. + \return number of vertices + @see getVertices() + */ + virtual PxU32 getNbVertices() const = 0; + + /** + \brief Returns the vertices + \return array of vertices + @see getNbVertices() + */ + virtual const PxVec3* getVertices() const = 0; + + + /** + \brief Returns the number of tetrahedrons. + \return number of tetrahedrons + @see getTetrahedrons() + */ + virtual PxU32 getNbTetrahedrons() const = 0; + + /** + \brief Returns the tetrahedron indices. + + The indices can be 16 or 32bit depending on the number of tetrahedrons in the mesh. + Call getTetrahedronMeshFlags() to know if the indices are 16 or 32 bits. + + The number of indices is the number of tetrahedrons * 4. + + \return array of tetrahedrons + @see getNbTetrahedron() getTetrahedronMeshFlags() getTetrahedraRemap() + */ + virtual const void* getTetrahedrons() const = 0; + + /** + \brief Reads the PxTetrahedronMesh flags. + + See the list of flags #PxTetrahedronMeshFlags + + \return The values of the PxTetrahedronMesh flags. + */ + virtual PxTetrahedronMeshFlags getTetrahedronMeshFlags() const = 0; + + + /** + \brief Returns the tetrahedra remapping table. + + The tetrahedra are internally sorted according to various criteria. Hence the internal tetrahedron order + does not always match the original (user-defined) order. The remapping table helps finding the old + indices knowing the new ones: + + remapTable[ internalTetrahedronIndex ] = originalTetrahedronIndex + + \return the remapping table (or NULL if 'PxCookingParams::suppressTriangleMeshRemapTable' has been used) + @see getNbTetrahedron() getTetrahedrons() PxCookingParams::suppressTriangleMeshRemapTable + */ + virtual const PxU32* getTetrahedraRemap() const = 0; + + /** + \brief Returns the local-space (vertex space) AABB from the tetrahedron mesh. + + \return local-space bounds + */ + virtual PxBounds3 getLocalBounds() const = 0; + + /** + \brief Decrements the reference count of a tetrahedron mesh and releases it if the new reference count is zero. + + @see PxPhysics.createTetrahedronMesh() + */ + virtual void release() = 0; + + protected: + PX_INLINE PxTetrahedronMesh(PxType concreteType, PxBaseFlags baseFlags) : PxRefCounted(concreteType, baseFlags) {} + PX_INLINE PxTetrahedronMesh(PxBaseFlags baseFlags) : PxRefCounted(baseFlags) {} + virtual ~PxTetrahedronMesh() {} + + virtual bool isKindOf(const char* name) const { return !::strcmp("PxTetrahedronMesh", name) || PxRefCounted::isKindOf(name); } + }; + + /** + \brief A softbody mesh, containing structures to store collision shape, simulation shape and deformation state + + The class bundles shapes and deformation state of a softbody that is simulated using FEM. The meshes used for + collision detection and for the FEM calculations are both tetrahedral meshes. While collision detection requires + a mesh that matches the surface of the simulated body as exactly as possible, the simulation mesh has more freedom + such that it can be optimized for tetrahedra without small angles and nodes that aren't shared by too many elements. + +

Creation

+ + To create an instance of this class call PxPhysics::createSoftBodyMesh(), + and release() to delete it. This is only possible + once you have released all of its PxShape instances. + + */ + class PxSoftBodyMesh : public PxRefCounted + { + public: + /** + \brief Const accecssor to the softbody's collision mesh. + + @see PxTetrahedronMesh + */ + virtual const PxTetrahedronMesh* getCollisionMesh() const = 0; + + /** + \brief Accecssor to the softbody's collision mesh. + + @see PxTetrahedronMesh + */ + virtual PxTetrahedronMesh* getCollisionMesh() = 0; + + /** + \brief Const accessor to the softbody's simulation mesh. + + @see PxTetrahedronMesh + */ + virtual const PxTetrahedronMesh* getSimulationMesh() const = 0; + + /** + \brief Accecssor to the softbody's simulation mesh. + + @see PxTetrahedronMesh + */ + virtual PxTetrahedronMesh* getSimulationMesh() = 0; + + + /** + \brief Const accessor to the softbodies simulation state. + + @see PxSoftBodyAuxData + */ + virtual const PxSoftBodyAuxData* getSoftBodyAuxData() const = 0; + + /** + \brief Accessor to the softbody's auxilary data like mass and rest pose information + + @see PxSoftBodyAuxData + */ + virtual PxSoftBodyAuxData* getSoftBodyAuxData() = 0; + + /** + \brief Decrements the reference count of a tetrahedron mesh and releases it if the new reference count is zero. + + @see PxPhysics.createTetrahedronMesh() + */ + virtual void release() = 0; + + + protected: + PX_INLINE PxSoftBodyMesh(PxType concreteType, PxBaseFlags baseFlags) : PxRefCounted(concreteType, baseFlags) {} + PX_INLINE PxSoftBodyMesh(PxBaseFlags baseFlags) : PxRefCounted(baseFlags) {} + virtual ~PxSoftBodyMesh() {} + + virtual bool isKindOf(const char* name) const { return !::strcmp("PxSoftBodyMesh", name) || PxRefCounted::isKindOf(name); } + }; + + + /** + + \brief Contains information about how to update the collision mesh's vertices given a deformed simulation tetmesh. + + @see PxTetrahedronMeshData + */ + class PxCollisionMeshMappingData : public PxUserAllocated + { + public: + virtual void release() = 0; + + virtual ~PxCollisionMeshMappingData() {} + }; + + /** + + \brief Stores data to accelerate collision detection of a tetrahedral mesh + + @see PxTetrahedronMeshData + */ + class PxSoftBodyCollisionData : public PxUserAllocated + { + + }; + + /** + + \brief Contains raw geometry information describing the tetmesh's vertices and its elements (tetrahedra) + + @see PxTetrahedronMeshData + */ + class PxTetrahedronMeshData : public PxUserAllocated + { + + }; + + /** + + \brief Stores data to compute and store the state of a deformed tetrahedral mesh + + @see PxTetrahedronMeshData + */ + class PxSoftBodySimulationData : public PxUserAllocated + { + + }; + + /** + + \brief Conbines PxTetrahedronMeshData and PxSoftBodyCollisionData + + @see PxTetrahedronMeshData PxSoftBodyCollisionData + */ + class PxCollisionTetrahedronMeshData : public PxUserAllocated + { + public: + virtual const PxTetrahedronMeshData* getMesh() const = 0; + virtual PxTetrahedronMeshData* getMesh() = 0; + virtual const PxSoftBodyCollisionData* getData() const = 0; + virtual PxSoftBodyCollisionData* getData() = 0; + virtual void release() = 0; + + virtual ~PxCollisionTetrahedronMeshData() {} + }; + + /** + + \brief Conbines PxTetrahedronMeshData and PxSoftBodyCollisionData + + @see PxTetrahedronMeshData PxSoftBodySimulationData + */ + class PxSimulationTetrahedronMeshData : public PxUserAllocated + { + public: + virtual PxTetrahedronMeshData* getMesh() = 0; + virtual PxSoftBodySimulationData* getData() = 0; + virtual void release() = 0; + + virtual ~PxSimulationTetrahedronMeshData() {} + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + + /** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/geometry/PxTetrahedronMeshGeometry.h b/Source/ThirdParty/PhysX/geometry/PxTetrahedronMeshGeometry.h new file mode 100644 index 000000000..2c32cdf79 --- /dev/null +++ b/Source/ThirdParty/PhysX/geometry/PxTetrahedronMeshGeometry.h @@ -0,0 +1,111 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_TETRAHEDRON_GEOMETRY_H +#define PX_TETRAHEDRON_GEOMETRY_H +/** \addtogroup geomutils +@{ +*/ +#include "geometry/PxGeometry.h" +#include "geometry/PxMeshScale.h" +#include "common/PxCoreUtilityTypes.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + class PxTetrahedronMesh; + + /** + \brief Tetrahedron mesh geometry class. + + This class wraps a tetrahedron mesh such that it can be used in contexts where a PxGeometry type is needed. + */ + class PxTetrahedronMeshGeometry : public PxGeometry + { + public: + /** + \brief Constructor. By default creates an empty object with a NULL mesh and identity scale. + */ + PX_INLINE PxTetrahedronMeshGeometry(PxTetrahedronMesh* mesh = NULL) : + PxGeometry(PxGeometryType::eTETRAHEDRONMESH), + tetrahedronMesh(mesh) + {} + + /** + \brief Copy constructor. + + \param[in] that Other object + */ + PX_INLINE PxTetrahedronMeshGeometry(const PxTetrahedronMeshGeometry& that) : + PxGeometry(that), + tetrahedronMesh(that.tetrahedronMesh) + {} + + /** + \brief Assignment operator + */ + PX_INLINE void operator=(const PxTetrahedronMeshGeometry& that) + { + mType = that.mType; + tetrahedronMesh = that.tetrahedronMesh; + } + + /** + \brief Returns true if the geometry is valid. + + \return True if the current settings are valid for shape creation. + + \note A valid tetrahedron mesh has a positive scale value in each direction (scale.scale.x > 0, scale.scale.y > 0, scale.scale.z > 0). + It is illegal to call PxRigidActor::createShape and PxPhysics::createShape with a tetrahedron mesh that has zero extents in any direction. + + @see PxRigidActor::createShape, PxPhysics::createShape + */ + PX_INLINE bool isValid() const; + + public: + PxTetrahedronMesh* tetrahedronMesh; //!< A reference to the mesh object. + }; + + PX_INLINE bool PxTetrahedronMeshGeometry::isValid() const + { + if(mType != PxGeometryType::eTETRAHEDRONMESH) + return false; + + if(!tetrahedronMesh) + return false; + + return true; + } + +#if !PX_DOXYGEN +} // namespace physx +#endif + + /** @} */ +#endif diff --git a/Source/ThirdParty/PhysX/geometry/PxTriangle.h b/Source/ThirdParty/PhysX/geometry/PxTriangle.h index 8ccc6d646..5fe2dd156 100644 --- a/Source/ThirdParty/PhysX/geometry/PxTriangle.h +++ b/Source/ThirdParty/PhysX/geometry/PxTriangle.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_GEOMUTILS_PX_TRIANGLE -#define PX_PHYSICS_GEOMUTILS_PX_TRIANGLE +#ifndef PX_TRIANGLE_H +#define PX_TRIANGLE_H /** \addtogroup geomutils @{ */ @@ -131,15 +129,25 @@ class PxTriangle /** \return Computes a point on the triangle from u and v barycentric coordinates. */ - PxVec3 pointFromUV(PxReal u, PxReal v) const { return (1.0f-u-v)*verts[0] + u*verts[1] + v*verts[2]; } + PX_FORCE_INLINE PxVec3 pointFromUV(PxReal u, PxReal v) const + { + return (1.0f-u-v)*verts[0] + u*verts[1] + v*verts[2]; + } /** \brief Array of Vertices. */ PxVec3 verts[3]; - }; +//! A padded version of PxTriangle, to safely load its data using SIMD +class PxTrianglePadded : public PxTriangle +{ +public: + PX_FORCE_INLINE PxTrianglePadded() {} + PX_FORCE_INLINE ~PxTrianglePadded() {} + PxU32 padding; +}; #if !PX_DOXYGEN } diff --git a/Source/ThirdParty/PhysX/geometry/PxTriangleMesh.h b/Source/ThirdParty/PhysX/geometry/PxTriangleMesh.h index 6b0eb2efc..1a9f4892a 100644 --- a/Source/ThirdParty/PhysX/geometry/PxTriangleMesh.h +++ b/Source/ThirdParty/PhysX/geometry/PxTriangleMesh.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_GEOMUTILS_NX_TRIANGLEMESH -#define PX_PHYSICS_GEOMUTILS_NX_TRIANGLEMESH +#ifndef PX_TRIANGLE_MESH_H +#define PX_TRIANGLE_MESH_H /** \addtogroup geomutils @{ */ @@ -37,35 +35,28 @@ #include "foundation/PxBounds3.h" #include "common/PxPhysXCommonConfig.h" #include "common/PxBase.h" +#include "foundation/PxUserAllocated.h" #if !PX_DOXYGEN namespace physx { #endif -/** -\brief Enables the dynamic rtree mesh feature. It is recommended to use this feature for scene queries only. -@see PxTriangleMesh::getVerticesForModification -@see PxTriangleMesh::refitBVH -*/ -#define PX_ENABLE_DYNAMIC_MESH_RTREE 1 - /** \brief Mesh midphase structure. This enum is used to select the desired acceleration structure for midphase queries (i.e. raycasts, overlaps, sweeps vs triangle meshes). The PxMeshMidPhase::eBVH33 structure is the one used in recent PhysX versions (up to PhysX 3.3). It has great performance and is - supported on all platforms. + supported on all platforms. It is deprecated since PhysX 5.x. The PxMeshMidPhase::eBVH34 structure is a revisited implementation introduced in PhysX 3.4. It can be significantly faster both - in terms of cooking performance and runtime performance, but it is currently only available on platforms supporting the - SSE2 instuction set. + in terms of cooking performance and runtime performance. */ struct PxMeshMidPhase { enum Enum { - eBVH33 = 0, //!< Default midphase mesh structure, as used up to PhysX 3.3 + eBVH33 = 0, //!< Default midphase mesh structure, as used up to PhysX 3.3 (deprecated) eBVH34 = 1, //!< New midphase mesh structure, introduced in PhysX 3.4 eLAST @@ -82,7 +73,8 @@ struct PxTriangleMeshFlag enum Enum { e16_BIT_INDICES = (1<<1), //!< The triangle mesh has 16bits vertex indices. - eADJACENCY_INFO = (1<<2) //!< The triangle mesh has adjacency information build. + eADJACENCY_INFO = (1<<2), //!< The triangle mesh has adjacency information build. + ePREFER_NO_SDF_PROJ = (1<<3)//!< Indicates that this mesh would preferably not be the mesh projected for mesh-mesh collision. This can indicate that the mesh is not well tessellated. }; }; @@ -122,8 +114,7 @@ once you have released all of its PxShape instances. @see PxTriangleMeshDesc PxTriangleMeshGeometry PxShape PxPhysics.createTriangleMesh() */ - -class PxTriangleMesh : public PxBase +class PxTriangleMesh : public PxRefCounted { public: /** @@ -131,16 +122,15 @@ class PxTriangleMesh : public PxBase \return number of vertices @see getVertices() */ - virtual PxU32 getNbVertices() const = 0; + virtual PxU32 getNbVertices() const = 0; /** \brief Returns the vertices. \return array of vertices @see getNbVertices() */ - virtual const PxVec3* getVertices() const = 0; + virtual const PxVec3* getVertices() const = 0; -#if PX_ENABLE_DYNAMIC_MESH_RTREE /** \brief Returns all mesh vertices for modification. @@ -150,7 +140,7 @@ class PxTriangleMesh : public PxBase \return inplace vertex coordinates for each existing mesh vertex. - \note works only for PxMeshMidPhase::eBVH33 + \note It is recommended to use this feature for scene queries only. \note Size of array returned is equal to the number returned by getNbVertices(). \note This function operates on cooked vertex indices. \note This means the index mapping and vertex count can be different from what was provided as an input to the cooking routine. @@ -160,7 +150,7 @@ class PxTriangleMesh : public PxBase @see getNbVertices() @see refitBVH() */ - virtual PxVec3* getVerticesForModification() = 0; + virtual PxVec3* getVerticesForModification() = 0; /** \brief Refits BVH for mesh vertices. @@ -170,24 +160,24 @@ class PxTriangleMesh : public PxBase \return New bounds for the entire mesh. - \note works only for PxMeshMidPhase::eBVH33 + \note For PxMeshMidPhase::eBVH34 trees the refit operation is only available on non-quantized trees (see PxBVH34MidphaseDesc::quantized) \note PhysX does not keep a mapping from the mesh to mesh shapes that reference it. \note Call PxShape::setGeometry on each shape which references the mesh, to ensure that internal data structures are updated to reflect the new geometry. \note PxShape::setGeometry does not guarantee correct/continuous behavior when objects are resting on top of old or new geometry. \note It is also recommended to make sure that a call to validateTriangleMesh returns true if mesh cleaning is disabled. \note Active edges information will be lost during refit, the rigid body mesh contact generation might not perform as expected. @see getNbVertices() - @see getVerticesForModification() + @see getVerticesForModification() + @see PxBVH34MidphaseDesc::quantized */ - virtual PxBounds3 refitBVH() = 0; -#endif // PX_ENABLE_DYNAMIC_MESH_RTREE + virtual PxBounds3 refitBVH() = 0; /** \brief Returns the number of triangles. \return number of triangles @see getTriangles() getTrianglesRemap() */ - virtual PxU32 getNbTriangles() const = 0; + virtual PxU32 getNbTriangles() const = 0; /** \brief Returns the triangle indices. @@ -200,7 +190,7 @@ class PxTriangleMesh : public PxBase \return array of triangles @see getNbTriangles() getTriangleMeshFlags() getTrianglesRemap() */ - virtual const void* getTriangles() const = 0; + virtual const void* getTriangles() const = 0; /** \brief Reads the PxTriangleMesh flags. @@ -211,7 +201,7 @@ class PxTriangleMesh : public PxBase @see PxTriangleMesh */ - virtual PxTriangleMeshFlags getTriangleMeshFlags() const = 0; + virtual PxTriangleMeshFlags getTriangleMeshFlags() const = 0; /** \brief Returns the triangle remapping table. @@ -225,15 +215,14 @@ class PxTriangleMesh : public PxBase \return the remapping table (or NULL if 'PxCookingParams::suppressTriangleMeshRemapTable' has been used) @see getNbTriangles() getTriangles() PxCookingParams::suppressTriangleMeshRemapTable */ - virtual const PxU32* getTrianglesRemap() const = 0; - + virtual const PxU32* getTrianglesRemap() const = 0; /** \brief Decrements the reference count of a triangle mesh and releases it if the new reference count is zero. @see PxPhysics.createTriangleMesh() */ - virtual void release() = 0; + virtual void release() = 0; /** \brief Returns material table index of given triangle @@ -250,31 +239,62 @@ class PxTriangleMesh : public PxBase \return local-space bounds */ - virtual PxBounds3 getLocalBounds() const = 0; + virtual PxBounds3 getLocalBounds() const = 0; /** - \brief Returns the reference count for shared meshes. - - At creation, the reference count of the mesh is 1. Every shape referencing this mesh increments the - count by 1. When the reference count reaches 0, and only then, the mesh gets destroyed automatically. - - \return the current reference count. + \brief Returns the local-space Signed Distance Field for this mesh if it has one. + \return local-space SDF. */ - virtual PxU32 getReferenceCount() const = 0; + virtual const PxReal* getSDF() const = 0; /** - \brief Acquires a counted reference to a triangle mesh. - - This method increases the reference count of the triangle mesh by 1. Decrement the reference count by calling release() + \brief Returns the resolution of the local-space dense SDF. */ - virtual void acquireReference() = 0; + virtual void getSDFDimensions(PxU32& numX, PxU32& numY, PxU32& numZ) const = 0; + + /** + \brief Sets whether this mesh should be preferred for SDF projection. + + By default, meshes are flagged as preferring projection and the decisions on which mesh to project is based on the triangle and vertex + count. The model with the fewer triangles is projected onto the SDF of the more detailed mesh. + If one of the meshes is set to prefer SDF projection (default) and the other is set to not prefer SDF projection, model flagged as + preferring SDF projection will be projected onto the model flagged as not preferring, regardless of the detail of the respective meshes. + Where both models are flagged as preferring no projection, the less detailed model will be projected as before. + + \param[in] preferProjection Indicates if projection is preferred + */ + virtual void setPreferSDFProjection(bool preferProjection) = 0; + + /** + \brief Returns whether this mesh prefers SDF projection. + \return whether this mesh prefers SDF projection. + */ + virtual bool getPreferSDFProjection() const = 0; + + /** + \brief Returns the mass properties of the mesh assuming unit density. + + The following relationship holds between mass and volume: + + mass = volume * density + + The mass of a unit density mesh is equal to its volume, so this function returns the volume of the mesh. + + Similarly, to obtain the localInertia of an identically shaped object with a uniform density of d, simply multiply the + localInertia of the unit density mesh by d. + + \param[out] mass The mass of the mesh assuming unit density. + \param[out] localInertia The inertia tensor in mesh local space assuming unit density. + \param[out] localCenterOfMass Position of center of mass (or centroid) in mesh local space. + */ + virtual void getMassInformation(PxReal& mass, PxMat33& localInertia, PxVec3& localCenterOfMass) const = 0; protected: - PX_INLINE PxTriangleMesh(PxType concreteType, PxBaseFlags baseFlags) : PxBase(concreteType, baseFlags) {} - PX_INLINE PxTriangleMesh(PxBaseFlags baseFlags) : PxBase(baseFlags) {} - virtual ~PxTriangleMesh() {} + PX_INLINE PxTriangleMesh(PxType concreteType, PxBaseFlags baseFlags) : PxRefCounted(concreteType, baseFlags) {} + PX_INLINE PxTriangleMesh(PxBaseFlags baseFlags) : PxRefCounted(baseFlags) {} + virtual ~PxTriangleMesh() {} - virtual bool isKindOf(const char* name) const { return !::strcmp("PxTriangleMesh", name) || PxBase::isKindOf(name); } + virtual bool isKindOf(const char* name) const { return !::strcmp("PxTriangleMesh", name) || PxRefCounted::isKindOf(name); } }; /** @@ -282,15 +302,16 @@ protected: \brief A triangle mesh containing the PxMeshMidPhase::eBVH33 structure. @see PxMeshMidPhase +@deprecated */ -class PxBVH33TriangleMesh : public PxTriangleMesh +class PX_DEPRECATED PxBVH33TriangleMesh : public PxTriangleMesh { public: protected: - PX_INLINE PxBVH33TriangleMesh(PxType concreteType, PxBaseFlags baseFlags) : PxTriangleMesh(concreteType, baseFlags) {} - PX_INLINE PxBVH33TriangleMesh(PxBaseFlags baseFlags) : PxTriangleMesh(baseFlags) {} - virtual ~PxBVH33TriangleMesh() {} - virtual bool isKindOf(const char* name) const { return !::strcmp("PxBVH33TriangleMesh", name) || PxTriangleMesh::isKindOf(name); } + PX_INLINE PxBVH33TriangleMesh(PxType concreteType, PxBaseFlags baseFlags) : PxTriangleMesh(concreteType, baseFlags) {} + PX_INLINE PxBVH33TriangleMesh(PxBaseFlags baseFlags) : PxTriangleMesh(baseFlags) {} + virtual ~PxBVH33TriangleMesh() {} + virtual bool isKindOf(const char* name) const { return !::strcmp("PxBVH33TriangleMesh", name) || PxTriangleMesh::isKindOf(name); } }; /** @@ -303,10 +324,10 @@ class PxBVH34TriangleMesh : public PxTriangleMesh { public: protected: - PX_INLINE PxBVH34TriangleMesh(PxType concreteType, PxBaseFlags baseFlags) : PxTriangleMesh(concreteType, baseFlags) {} - PX_INLINE PxBVH34TriangleMesh(PxBaseFlags baseFlags) : PxTriangleMesh(baseFlags) {} - virtual ~PxBVH34TriangleMesh() {} - virtual bool isKindOf(const char* name) const { return !::strcmp("PxBVH34TriangleMesh", name) || PxTriangleMesh::isKindOf(name); } + PX_INLINE PxBVH34TriangleMesh(PxType concreteType, PxBaseFlags baseFlags) : PxTriangleMesh(concreteType, baseFlags) {} + PX_INLINE PxBVH34TriangleMesh(PxBaseFlags baseFlags) : PxTriangleMesh(baseFlags) {} + virtual ~PxBVH34TriangleMesh() {} + virtual bool isKindOf(const char* name) const { return !::strcmp("PxBVH34TriangleMesh", name) || PxTriangleMesh::isKindOf(name); } }; #if !PX_DOXYGEN diff --git a/Source/ThirdParty/PhysX/geometry/PxTriangleMeshGeometry.h b/Source/ThirdParty/PhysX/geometry/PxTriangleMeshGeometry.h index 56f58f79a..3f347a156 100644 --- a/Source/ThirdParty/PhysX/geometry/PxTriangleMeshGeometry.h +++ b/Source/ThirdParty/PhysX/geometry/PxTriangleMeshGeometry.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,13 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef PX_PHYSICS_NX_TRIANGLEMESH_GEOMETRY -#define PX_PHYSICS_NX_TRIANGLEMESH_GEOMETRY +#ifndef PX_TRIANGLE_MESH_GEOMETRY_H +#define PX_TRIANGLE_MESH_GEOMETRY_H /** \addtogroup geomutils @{ */ @@ -44,7 +42,6 @@ namespace physx class PxTriangleMesh; - /** \brief Flags controlling the simulated behavior of the triangle mesh geometry. @@ -54,6 +51,7 @@ struct PxMeshGeometryFlag { enum Enum { + eTIGHT_BOUNDS = (1<<0), //!< Use tighter (but more expensive to compute) bounds around the triangle mesh geometry. eDOUBLE_SIDED = (1<<1) //!< Meshes with this flag set are treated as double-sided. //!< This flag is currently only used for raycasts and sweeps (it is ignored for overlap queries). //!< For detailed specifications of this flag for meshes and heightfields please refer to the Geometry Query section of the user guide. @@ -77,37 +75,50 @@ lets the combined object be used anywhere a PxGeometry is needed. The scaling is a transform along arbitrary axes contained in the scale object. The vertices of the mesh in geometry (or shape) space is the PxMeshScale::toMat33() transform, multiplied by the vertex space vertices -in the PxConvexMesh object. +in the PxTriangleMeshGeometry object. */ class PxTriangleMeshGeometry : public PxGeometry { public: /** - \brief Default constructor. + \brief Constructor. By default creates an empty object with a NULL mesh and identity scale. - Creates an empty object with a NULL mesh and identity scale. - */ - PX_INLINE PxTriangleMeshGeometry() : - PxGeometry (PxGeometryType::eTRIANGLEMESH), - triangleMesh(NULL) - {} - - /** - \brief Constructor. \param[in] mesh Mesh pointer. May be NULL, though this will not make the object valid for shape construction. \param[in] scaling Scale factor. \param[in] flags Mesh flags. - \ */ - PX_INLINE PxTriangleMeshGeometry( PxTriangleMesh* mesh, - const PxMeshScale& scaling = PxMeshScale(), + PX_INLINE PxTriangleMeshGeometry( PxTriangleMesh* mesh = NULL, + const PxMeshScale& scaling = PxMeshScale(), PxMeshGeometryFlags flags = PxMeshGeometryFlags()) : - PxGeometry (PxGeometryType::eTRIANGLEMESH), - scale (scaling), - meshFlags (flags), - triangleMesh(mesh) + PxGeometry (PxGeometryType::eTRIANGLEMESH), + scale (scaling), + meshFlags (flags), + triangleMesh(mesh) {} + /** + \brief Copy constructor. + + \param[in] that Other object + */ + PX_INLINE PxTriangleMeshGeometry(const PxTriangleMeshGeometry& that) : + PxGeometry (that), + scale (that.scale), + meshFlags (that.meshFlags), + triangleMesh(that.triangleMesh) + {} + + /** + \brief Assignment operator + */ + PX_INLINE void operator=(const PxTriangleMeshGeometry& that) + { + mType = that.mType; + scale = that.scale; + meshFlags = that.meshFlags; + triangleMesh = that.triangleMesh; + } + /** \brief Returns true if the geometry is valid. @@ -127,7 +138,6 @@ public: PxTriangleMesh* triangleMesh; //!< A reference to the mesh object. }; - PX_INLINE bool PxTriangleMeshGeometry::isValid() const { if(mType != PxGeometryType::eTRIANGLEMESH) diff --git a/Source/ThirdParty/PhysX/geomutils/GuContactBuffer.h b/Source/ThirdParty/PhysX/geomutils/GuContactBuffer.h deleted file mode 100644 index 786735792..000000000 --- a/Source/ThirdParty/PhysX/geomutils/GuContactBuffer.h +++ /dev/null @@ -1,131 +0,0 @@ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// * Neither the name of NVIDIA CORPORATION nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. -// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. -// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - -#ifndef GU_CONTACTBUFFER_H -#define GU_CONTACTBUFFER_H - -#include "geomutils/GuContactPoint.h" -#include "PxPhysXConfig.h" -#include "PxContact.h" - -namespace physx -{ -namespace Gu -{ - - struct NarrowPhaseParams - { - PX_FORCE_INLINE NarrowPhaseParams(PxReal contactDistance, PxReal meshContactMargin, PxReal toleranceLength) : - mContactDistance(contactDistance), - mMeshContactMargin(meshContactMargin), - mToleranceLength(toleranceLength) {} - - PxReal mContactDistance; - PxReal mMeshContactMargin; // PT: Margin used to generate mesh contacts. Temp & unclear, should be removed once GJK is default path. - PxReal mToleranceLength; // PT: copy of PxTolerancesScale::length - }; - -//sizeof(SavedContactData)/sizeof(PxU32) = 17, 1088/17 = 64 triangles in the local array -#define LOCAL_CONTACTS_SIZE 1088 - -class ContactBuffer -{ -public: - - static const PxU32 MAX_CONTACTS = 64; - - Gu::ContactPoint contacts[MAX_CONTACTS]; - PxU32 count; - PxU32 pad; - - PX_FORCE_INLINE void reset() - { - count = 0; - } - - PX_FORCE_INLINE bool contact(const PxVec3& worldPoint, - const PxVec3& worldNormalIn, - PxReal separation, - PxU32 faceIndex1 = PXC_CONTACT_NO_FACE_INDEX - ) - { - PX_ASSERT(PxAbs(worldNormalIn.magnitude()-1)<1e-3f); - - if(count>=MAX_CONTACTS) - return false; - - Gu::ContactPoint& p = contacts[count++]; - p.normal = worldNormalIn; - p.point = worldPoint; - p.separation = separation; - p.internalFaceIndex1= faceIndex1; - return true; - } - - PX_FORCE_INLINE bool contact(const PxVec3& worldPoint, - const PxVec3& worldNormalIn, - PxReal separation, - PxU16 internalUsage, - PxU32 faceIndex1 = PXC_CONTACT_NO_FACE_INDEX - ) - { - PX_ASSERT(PxAbs(worldNormalIn.magnitude() - 1)<1e-3f); - - if (count >= MAX_CONTACTS) - return false; - - Gu::ContactPoint& p = contacts[count++]; - p.normal = worldNormalIn; - p.point = worldPoint; - p.separation = separation; - p.internalFaceIndex1 = faceIndex1; - p.forInternalUse = internalUsage; - return true; - } - - PX_FORCE_INLINE bool contact(const Gu::ContactPoint & pt) - { - if(count>=MAX_CONTACTS) - return false; - contacts[count++] = pt; - return true; - } - - PX_FORCE_INLINE Gu::ContactPoint* contact() - { - if(count>=MAX_CONTACTS) - return NULL; - return &contacts[count++]; - } -}; - -} -} - -#endif diff --git a/Source/ThirdParty/PhysX/geomutils/PxContactBuffer.h b/Source/ThirdParty/PhysX/geomutils/PxContactBuffer.h new file mode 100644 index 000000000..92a47f271 --- /dev/null +++ b/Source/ThirdParty/PhysX/geomutils/PxContactBuffer.h @@ -0,0 +1,95 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_CONTACTBUFFER_H +#define PX_CONTACTBUFFER_H + +#include "PxPhysXConfig.h" +#include "geomutils/PxContactPoint.h" +#include "PxContact.h" + +#if !PX_DOXYGEN +namespace physx +{ +#endif + + class PxContactBuffer + { + public: + + static const PxU32 MAX_CONTACTS = 64; + + PxContactPoint contacts[MAX_CONTACTS]; + PxU32 count; + PxU32 pad; + + PX_FORCE_INLINE void reset() + { + count = 0; + } + + PX_FORCE_INLINE bool contact(const PxVec3& worldPoint, + const PxVec3& worldNormalIn, + PxReal separation, + PxU32 faceIndex1 = PXC_CONTACT_NO_FACE_INDEX + ) + { + PX_ASSERT(PxAbs(worldNormalIn.magnitude()-1)<1e-3f); + + if(count>=MAX_CONTACTS) + return false; + + PxContactPoint& p = contacts[count++]; + p.normal = worldNormalIn; + p.point = worldPoint; + p.separation = separation; + p.internalFaceIndex1= faceIndex1; + return true; + } + + PX_FORCE_INLINE bool contact(const PxContactPoint& pt) + { + if(count>=MAX_CONTACTS) + return false; + contacts[count++] = pt; + return true; + } + + PX_FORCE_INLINE PxContactPoint* contact() + { + if(count>=MAX_CONTACTS) + return NULL; + return &contacts[count++]; + } + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif diff --git a/Source/ThirdParty/PhysX/geomutils/GuContactPoint.h b/Source/ThirdParty/PhysX/geomutils/PxContactPoint.h similarity index 52% rename from Source/ThirdParty/PhysX/geomutils/GuContactPoint.h rename to Source/ThirdParty/PhysX/geomutils/PxContactPoint.h index 33f851d60..9630bf255 100644 --- a/Source/ThirdParty/PhysX/geomutils/GuContactPoint.h +++ b/Source/ThirdParty/PhysX/geomutils/PxContactPoint.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,87 +22,79 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef GU_CONTACT_POINT_H -#define GU_CONTACT_POINT_H - -/** \addtogroup geomutils -@{ -*/ +#ifndef PX_CONTACT_POINT_H +#define PX_CONTACT_POINT_H #include "foundation/PxVec3.h" +#if !PX_DOXYGEN namespace physx { -namespace Gu -{ - -struct ContactPoint -{ - /** - \brief The normal of the contacting surfaces at the contact point. - - For two shapes s0 and s1, the normal points in the direction that s0 needs to move in to resolve the contact with s1. - */ - PX_ALIGN(16, PxVec3 normal); - /** - \brief The separation of the shapes at the contact point. A negative separation denotes a penetration. - */ - PxReal separation; - - /** - \brief The point of contact between the shapes, in world space. - */ - PX_ALIGN(16, PxVec3 point); - - /** - \brief The max impulse permitted at this point - */ - PxReal maxImpulse; - - PX_ALIGN(16, PxVec3 targetVel); - - /** - \brief The static friction coefficient - */ - PxReal staticFriction; - - /** - \brief Material flags for this contact (eDISABLE_FRICTION, eDISABLE_STRONG_FRICTION). @see PxMaterialFlag - */ - PxU8 materialFlags; - - /** - \brief internal structure used for internal use only - */ - PxU16 forInternalUse; - - /** - \brief The surface index of shape 1 at the contact point. This is used to identify the surface material. - - \note This field is only supported by triangle meshes and heightfields, else it will be set to PXC_CONTACT_NO_FACE_INDEX. - \note This value must be directly after internalFaceIndex0 in memory - */ - - PxU32 internalFaceIndex1; - - /** - \brief The dynamic friction coefficient - */ - PxReal dynamicFriction; - /** - \brief The restitution coefficient - */ - PxReal restitution; - -}; - -} - -} - -/** @} */ +#endif + + struct PxContactPoint + { + /** + \brief The normal of the contacting surfaces at the contact point. + + For two shapes s0 and s1, the normal points in the direction that s0 needs to move in to resolve the contact with s1. + */ + PX_ALIGN(16, PxVec3 normal); + + /** + \brief The separation of the shapes at the contact point. A negative separation denotes a penetration. + */ + PxReal separation; + + /** + \brief The point of contact between the shapes, in world space. + */ + PX_ALIGN(16, PxVec3 point); + + /** + \brief The max impulse permitted at this point + */ + PxReal maxImpulse; + + PX_ALIGN(16, PxVec3 targetVel); + + /** + \brief The static friction coefficient + */ + PxReal staticFriction; + + /** + \brief Material flags for this contact (eDISABLE_FRICTION, eDISABLE_STRONG_FRICTION). @see PxMaterialFlag + */ + PxU8 materialFlags; + + /** + \brief The surface index of shape 1 at the contact point. This is used to identify the surface material. + + \note This field is only supported by triangle meshes and heightfields, else it will be set to PXC_CONTACT_NO_FACE_INDEX. + \note This value must be directly after internalFaceIndex0 in memory + */ + PxU32 internalFaceIndex1; + + /** + \brief The dynamic friction coefficient + */ + PxReal dynamicFriction; + + /** + \brief The restitution coefficient + */ + PxReal restitution; + + PxReal damping; + }; + +#if !PX_DOXYGEN +} // namespace physx +#endif + #endif diff --git a/Source/ThirdParty/PhysX/gpu/PxGpu.h b/Source/ThirdParty/PhysX/gpu/PxGpu.h index 60210a6bb..4b0f34b38 100644 --- a/Source/ThirdParty/PhysX/gpu/PxGpu.h +++ b/Source/ThirdParty/PhysX/gpu/PxGpu.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,7 +22,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. #ifndef PX_GPU_H #define PX_GPU_H @@ -34,11 +33,10 @@ #if PX_SUPPORT_GPU_PHYSX #include "cudamanager/PxCudaContextManager.h" -#include "cudamanager/PxCudaMemoryManager.h" #include "foundation/Px.h" #include "foundation/PxPreprocessor.h" +#include "foundation/PxFoundation.h" #include "common/PxPhysXCommonConfig.h" -#include "PxFoundation.h" /** \brief PxGpuLoadHook @@ -91,6 +89,46 @@ PX_C_EXPORT PX_PHYSX_CORE_API int PX_CALL_CONV PxGetSuggestedCudaDeviceOrdinal(p */ PX_C_EXPORT PX_PHYSX_CORE_API physx::PxCudaContextManager* PX_CALL_CONV PxCreateCudaContextManager(physx::PxFoundation& foundation, const physx::PxCudaContextManagerDesc& desc, physx::PxProfilerCallback* profilerCallback = NULL); +/** + * \brief Sets profiler callback to PhysX GPU + \param[in] profilerCallback PhysX profiler callback instance. + + @see PxGetProfilerCallback() + */ +PX_C_EXPORT PX_PHYSX_CORE_API void PX_CALL_CONV PxSetPhysXGpuProfilerCallback(physx::PxProfilerCallback* profilerCallback); + + +/** +\brief Internally used callback to register function names of cuda kernels +*/ +PX_C_EXPORT PX_PHYSX_CORE_API void PX_CALL_CONV PxCudaRegisterFunction(int moduleIndex, const char* functionName); + +/** +\brief Internally used callback to register cuda modules at load time +*/ +PX_C_EXPORT PX_PHYSX_CORE_API void** PX_CALL_CONV PxCudaRegisterFatBinary(void*); + +/** +\brief Access to the registered cuda modules +*/ +PX_C_EXPORT PX_PHYSX_CORE_API void** PX_CALL_CONV PxGetCudaModuleTable(); + +/** +\brief Number of registered cuda modules +*/ +PX_C_EXPORT PX_PHYSX_CORE_API physx::PxU32 PX_CALL_CONV PxGetCudaModuleTableSize(); + +/** +\brief Access to the loaded cuda functions (kernels) +*/ +PX_C_EXPORT PX_PHYSX_CORE_API physx::PxKernelIndex* PX_CALL_CONV PxGetCudaFunctionTable(); + +/** +\brief Number of loaded cuda functions (kernels) +*/ +PX_C_EXPORT PX_PHYSX_CORE_API physx::PxU32 PX_CALL_CONV PxGetCudaFunctionTableSize(); + + #endif // PX_SUPPORT_GPU_PHYSX -#endif // PX_GPU_H +#endif diff --git a/Source/ThirdParty/PhysX/omnipvd/PxOmniPvd.h b/Source/ThirdParty/PhysX/omnipvd/PxOmniPvd.h new file mode 100644 index 000000000..cc7b8420b --- /dev/null +++ b/Source/ThirdParty/PhysX/omnipvd/PxOmniPvd.h @@ -0,0 +1,94 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#ifndef PX_OMNI_PVD_H +#define PX_OMNI_PVD_H + +#include "PxPhysXConfig.h" + +class OmniPvdWriter; +class OmniPvdFileWriteStream; + +#if !PX_DOXYGEN +namespace physx +{ +#endif + +class PxFoundation; + +class PxOmniPvd +{ +public: + virtual ~PxOmniPvd() + { + } + /** + \brief Gets an instance of the OmniPvd writer + + \return OmniPvdWriter instance on succes, NULL otherwise. + */ + virtual OmniPvdWriter* getWriter() = 0; + + /** + \brief Gets an instance to the OmniPvd file write stream + + \return OmniPvdFileWriteStream instance on succes, NULL otherwise. + */ + virtual OmniPvdFileWriteStream* getFileWriteStream() = 0; + + /** + \brief Starts the OmniPvd sampling + + \return True if sampling started correctly, false if not. + */ + virtual bool startSampling() = 0; + + /** + \brief Releases the PxOmniPvd object + + */ + virtual void release() = 0; +}; +#if !PX_DOXYGEN +} // namespace physx +#endif +/** +\brief Creates an instance of the OmniPvd object + +Creates an instance of the OmniPvd class. There may be only one instance of this class per process. Calling this method after an instance +has been created already will return the same instance over and over. + +\param foundation Foundation instance (see PxFoundation) + +\return PxOmniPvd instance on succes, NULL otherwise. + +*/ +PX_C_EXPORT PX_PHYSX_CORE_API physx::PxOmniPvd* PX_CALL_CONV PxCreateOmniPvd(physx::PxFoundation& foundation); + + +#endif diff --git a/Source/ThirdParty/PhysX/pvd/PxPvd.h b/Source/ThirdParty/PhysX/pvd/PxPvd.h index 08b4aabad..1597e3ab1 100644 --- a/Source/ThirdParty/PhysX/pvd/PxPvd.h +++ b/Source/ThirdParty/PhysX/pvd/PxPvd.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXPVDSDK_PXPVD_H -#define PXPVDSDK_PXPVD_H +#ifndef PX_PVD_H +#define PX_PVD_H /** \addtogroup pvd @{ @@ -175,4 +174,5 @@ PX_C_EXPORT PxPvd* PX_CALL_CONV PxCreatePvd(PxFoundation& foundation); #endif /** @} */ -#endif // PXPVDSDK_PXPVD_H +#endif + diff --git a/Source/ThirdParty/PhysX/pvd/PxPvdSceneClient.h b/Source/ThirdParty/PhysX/pvd/PxPvdSceneClient.h index 2db2e073b..0c9140089 100644 --- a/Source/ThirdParty/PhysX/pvd/PxPvdSceneClient.h +++ b/Source/ThirdParty/PhysX/pvd/PxPvdSceneClient.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,7 +22,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. @@ -36,17 +35,21 @@ #include "foundation/PxFlags.h" +#if !PX_DOXYGEN namespace physx { +#endif namespace pvdsdk { class PvdClient; - struct PvdDebugPoint; - struct PvdDebugLine; - struct PvdDebugTriangle; - struct PvdDebugText; } -} + struct PxDebugPoint; + struct PxDebugLine; + struct PxDebugTriangle; + struct PxDebugText; +#if !PX_DOXYGEN +} // namespace physx +#endif #if !PX_DOXYGEN namespace physx @@ -108,22 +111,22 @@ class PxPvdSceneClient /** draw points on PVD application's render window */ - virtual void drawPoints(const physx::pvdsdk::PvdDebugPoint* points, PxU32 count) = 0; + virtual void drawPoints(const physx::PxDebugPoint* points, PxU32 count) = 0; /** draw lines on PVD application's render window */ - virtual void drawLines(const physx::pvdsdk::PvdDebugLine* lines, PxU32 count) = 0; + virtual void drawLines(const physx::PxDebugLine* lines, PxU32 count) = 0; /** draw triangles on PVD application's render window */ - virtual void drawTriangles(const physx::pvdsdk::PvdDebugTriangle* triangles, PxU32 count) = 0; + virtual void drawTriangles(const physx::PxDebugTriangle* triangles, PxU32 count) = 0; /** draw text on PVD application's render window */ - virtual void drawText(const physx::pvdsdk::PvdDebugText& text) = 0; + virtual void drawText(const physx::PxDebugText& text) = 0; /** get the underlying client, for advanced users @@ -139,4 +142,4 @@ protected: #endif /** @} */ -#endif // PX_PVD_SCENE_CLIENT_H +#endif diff --git a/Source/ThirdParty/PhysX/pvd/PxPvdTransport.h b/Source/ThirdParty/PhysX/pvd/PxPvdTransport.h index 169ec23df..d9da9dfad 100644 --- a/Source/ThirdParty/PhysX/pvd/PxPvdTransport.h +++ b/Source/ThirdParty/PhysX/pvd/PxPvdTransport.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,12 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXPVDSDK_PXPVDTRANSPORT_H -#define PXPVDSDK_PXPVDTRANSPORT_H +#ifndef PX_PVD_TRANSPORT_H +#define PX_PVD_TRANSPORT_H /** \addtogroup pvd @{ @@ -126,4 +125,5 @@ PX_C_EXPORT PxPvdTransport* PX_CALL_CONV PxDefaultPvdFileTransportCreate(const c #endif /** @} */ -#endif // PXPVDSDK_PXPVDTRANSPORT_H +#endif + diff --git a/Source/ThirdParty/PhysX/solver/PxSolverDefs.h b/Source/ThirdParty/PhysX/solver/PxSolverDefs.h index f93b6835a..1e67f88ab 100644 --- a/Source/ThirdParty/PhysX/solver/PxSolverDefs.h +++ b/Source/ThirdParty/PhysX/solver/PxSolverDefs.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,7 +22,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. @@ -35,7 +34,7 @@ #include "foundation/PxMat33.h" #include "foundation/PxTransform.h" #include "PxConstraintDesc.h" -#include "geomutils/GuContactPoint.h" +#include "geomutils/PxContactPoint.h" #if PX_VC #pragma warning(push) @@ -49,17 +48,9 @@ namespace physx struct PxTGSSolverBodyVel; -namespace Dy -{ - class ArticulationV; - typedef size_t ArticulationLinkHandle; -} - -namespace Sc -{ - class ShapeInteraction; -} - +/** +\brief Struct that the solver uses to store velocity updates for a body +*/ struct PxSolverBody { PX_ALIGN(16, PxVec3) linearVelocity; //!< Delta linear velocity computed by the solver @@ -74,9 +65,11 @@ struct PxSolverBody { } }; - PX_COMPILE_TIME_ASSERT(sizeof(PxSolverBody) == 32); +/** +\brief Struct that the solver uses to store the state and other properties of a body +*/ struct PxSolverBodyData { PX_ALIGN(16, PxVec3 linearVelocity); //!< 12 Pre-solver linear velocity @@ -88,7 +81,6 @@ struct PxSolverBodyData PxU32 nodeIndex; //!< 76 the node idx of this solverBodyData. Used by solver to reference between solver bodies and island bodies. Not required by immediate mode PxReal maxContactImpulse; //!< 80 the max contact impulse PxTransform body2World; //!< 108 the body's transform - PxU16 lockFlags; //!< 110 lock flags PxU16 pad; //!< 112 pad PX_FORCE_INLINE PxReal projectVelocity(const PxVec3& lin, const PxVec3& ang) const @@ -96,10 +88,11 @@ struct PxSolverBodyData return linearVelocity.dot(lin) + angularVelocity.dot(ang); } }; +PX_COMPILE_TIME_ASSERT(0 == (sizeof(PxSolverBodyData) & 15)); //---------------------------------- -/* -* A header that defines the size of a specific batch of constraints (of same type and without dependencies) +/** +\brief A header that defines the size of a specific batch of constraints (of same type and without dependencies) */ struct PxConstraintBatchHeader { @@ -108,9 +101,12 @@ struct PxConstraintBatchHeader PxU16 constraintType; //!< The type of constraint this batch references }; +/** +\brief Constraint descriptor used inside the solver +*/ struct PxSolverConstraintDesc { - static const PxU16 NO_LINK = 0xffff; + static const PxU16 RIGID_BODY = 0xffff; enum ConstraintType { @@ -120,28 +116,34 @@ struct PxSolverConstraintDesc union { - PxSolverBody* bodyA; //!< bodyA pointer - PxTGSSolverBodyVel* tgsBodyA; //!< bodyA pointer - Dy::ArticulationV* articulationA; //!< Articulation pointer for body A - + PxSolverBody* bodyA; //!< bodyA pointer + PxTGSSolverBodyVel* tgsBodyA; //!< bodyA pointer + void* articulationA; //!< Articulation pointer for body A }; union { - PxSolverBody* bodyB; //!< BodyB pointer - PxTGSSolverBodyVel* tgsBodyB; //!< BodyB pointer - Dy::ArticulationV* articulationB; //!< Articulation pointer for body B + PxSolverBody* bodyB; //!< BodyB pointer + PxTGSSolverBodyVel* tgsBodyB; //!< BodyB pointer + void* articulationB; //!< Articulation pointer for body B }; - PxU16 linkIndexA; //!< Link index defining which link in Articulation A this constraint affects. If not an articulation, must be NO_LINK - PxU16 linkIndexB; //!< Link index defining which link in Articulation B this constraint affects. If not an articulation, must be NO_LINK. - PxU32 bodyADataIndex; //!< Body A's index into the SolverBodyData array - PxU32 bodyBDataIndex; //!< Body B's index into the SolverBodyData array - PxU16 writeBackLengthOver4; //!< writeBackLength/4, max writeback length is 256K, allows PxSolverConstraintDesc to fit in 32 bytes - PxU16 constraintLengthOver16; //!< constraintLength/16, max constraint length is 1MB, allows PxSolverConstraintDesc to fit in 32 bytes - PxU8* constraint; //!< Pointer to the constraint rows to be solved - void* writeBack; //!< Pointer to the writeback structure results for this given constraint are to be written to + PxU32 bodyADataIndex; //!< Body A's index into the SolverBodyData array + PxU32 bodyBDataIndex; //!< Body B's index into the SolverBodyData array + + PxU32 linkIndexA; //!< Link index defining which link in Articulation A this constraint affects. If not an articulation, must be NO_LINK + PxU32 linkIndexB; //!< Link index defining which link in Articulation B this constraint affects. If not an articulation, must be NO_LINK + PxU8* constraint; //!< Pointer to the constraint rows to be solved + void* writeBack; //!< Pointer to the writeback structure results for this given constraint are to be written to + + PxU16 progressA; //!< Internal progress counter + PxU16 progressB; //!< Internal progress counter + PxU16 constraintLengthOver16; //!< constraintLength/16, max constraint length is 1MB, allows PxSolverConstraintDesc to fit in 32 bytes + PxU8 padding[10]; }; +/** +\brief Data structure used for preparing constraints before solving them +*/ struct PxSolverConstraintPrepDescBase { enum BodyState @@ -169,6 +171,9 @@ struct PxSolverConstraintPrepDescBase BodyState bodyState1; //!< In: Defines what kind of actor the second body is }; +/** +\brief Data structure used for preparing constraints before solving them +*/ struct PxSolverConstraintPrepDesc : public PxSolverConstraintPrepDescBase { PX_ALIGN(16, Px1DConstraint* rows); //!< The start of the constraint rows @@ -181,15 +186,19 @@ struct PxSolverConstraintPrepDesc : public PxSolverConstraintPrepDescBase bool improvedSlerp; //!< Use improved slerp model bool driveLimitsAreForces; //!< Indicates whether drive limits are forces bool extendedLimits; //!< Indicates whether we want to use extended limits + bool disableConstraint; //!< Disables constraint - PxVec3 body0WorldOffset; //!< Body0 world offset + PxVec3p body0WorldOffset; //!< Body0 world offset }; +/** +\brief Data structure used for preparing constraints before solving them +*/ struct PxSolverContactDesc : public PxSolverConstraintPrepDescBase { - PX_ALIGN(16, Sc::ShapeInteraction* shapeInteraction); //!< Pointer to share interaction. Used for force threshold reports in solver. Set to NULL if using immediate mode. - Gu::ContactPoint* contacts; //!< The start of the contacts for this pair - PxU32 numContacts; //!< The total number of contacs this pair references. + void* shapeInteraction; //!< Pointer to shape interaction. Used for force threshold reports in solver. Set to NULL if using immediate mode. + PxContactPoint* contacts; //!< The start of the contacts for this pair + PxU32 numContacts; //!< The total number of contacts this pair references. bool hasMaxImpulse; //!< Defines whether this pairs has maxImpulses clamping enabled bool disableStrongFriction; //!< Defines whether this pair disables strong friction (sticky friction correlation) @@ -198,7 +207,7 @@ struct PxSolverContactDesc : public PxSolverConstraintPrepDescBase PxReal restDistance; //!< A distance at which the solver should aim to hold the bodies separated. Default is 0 PxReal maxCCDSeparation; //!< A distance used to configure speculative CCD behavior. Default is PX_MAX_F32. Set internally in PhysX for bodies with eENABLE_SPECULATIVE_CCD on. Do not set directly! - PxU8* frictionPtr; //!< InOut: Friction patch correlation data. Set each frame by solver. Can be retained for improved behaviour or discarded each frame. + PxU8* frictionPtr; //!< InOut: Friction patch correlation data. Set each frame by solver. Can be retained for improved behavior or discarded each frame. PxU8 frictionCount; //!< The total number of friction patches in this pair PxReal* contactForces; //!< Out: A buffer for the solver to write applied contact forces to. @@ -210,7 +219,8 @@ struct PxSolverContactDesc : public PxSolverConstraintPrepDescBase PxU16 numContactPatches; //!< Total number of contact patches. PxU16 axisConstraintCount; //!< Axis constraint count. Defines how many constraint rows this pair has produced. Useful for statistical purposes. - PxU8 pad[16 - sizeof(void*)]; + PxReal offsetSlop; //!< Slop value used to snap contact line of action back in-line with the COM. + //PxU8 pad[16 - sizeof(void*)]; }; class PxConstraintAllocator @@ -219,7 +229,7 @@ public: /** \brief Allocates constraint data. It is the application's responsibility to release this memory after PxSolveConstraints has completed. \param[in] byteSize Allocation size in bytes - \return the allocated memory. This address must be 16-byte aligned. + \return The allocated memory. This address must be 16-byte aligned. */ virtual PxU8* reserveConstraintData(const PxU32 byteSize) = 0; @@ -227,23 +237,25 @@ public: \brief Allocates friction data. Friction data can be retained by the application for a given pair and provided as an input to PxSolverContactDesc to improve simulation stability. It is the application's responsibility to release this memory. If this memory is released, the application should ensure it does not pass pointers to this memory to PxSolverContactDesc. \param[in] byteSize Allocation size in bytes - \return the allocated memory. This address must be 4-byte aligned. + \return The allocated memory. This address must be 4-byte aligned. */ virtual PxU8* reserveFrictionData(const PxU32 byteSize) = 0; virtual ~PxConstraintAllocator() {} }; +/** \addtogroup physics +@{ */ struct PxArticulationAxis { enum Enum { - eTWIST = 0, - eSWING1 = 1, - eSWING2 = 2, - eX = 3, - eY = 4, - eZ = 5, + eTWIST = 0, //!< Rotational about eX + eSWING1 = 1, //!< Rotational about eY + eSWING2 = 2, //!< Rotational about eZ + eX = 3, //!< Linear in eX + eY = 4, //!< Linear in eY + eZ = 5, //!< Linear in eZ eCOUNT = 6 }; }; @@ -254,9 +266,9 @@ struct PxArticulationMotion { enum Enum { - eLOCKED = 0, - eLIMITED = 1, - eFREE = 2 + eLOCKED = 0, //!< Locked axis, i.e. degree of freedom (DOF) + eLIMITED = 1, //!< Limited DOF - set limits of joint DOF together with this flag, see PxArticulationJointReducedCoordinate::setLimitParams + eFREE = 2 //!< Free DOF }; }; @@ -267,11 +279,12 @@ struct PxArticulationJointType { enum Enum { - ePRISMATIC = 0, - eREVOLUTE = 1, - eSPHERICAL = 2, - eFIX = 3, - eUNDEFINED = 4 + eFIX = 0, //!< All joint axes, i.e. degrees of freedom (DOFs) locked + ePRISMATIC = 1, //!< Single linear DOF, e.g. cart on a rail + eREVOLUTE = 2, //!< Single rotational DOF, e.g. an elbow joint or a rotational motor, position wrapped at 2pi radians + eREVOLUTE_UNWRAPPED = 3, //!< Single rotational DOF, e.g. an elbow joint or a rotational motor, position not wrapped + eSPHERICAL = 4, //!< Ball and socket joint with two or three DOFs + eUNDEFINED = 5 }; }; @@ -279,8 +292,10 @@ struct PxArticulationFlag { enum Enum { - eFIX_BASE = (1 << 0), - eDRIVE_LIMITS_ARE_FORCES = (1<<1) + eFIX_BASE = (1 << 0), //!< Set articulation base to be fixed. + eDRIVE_LIMITS_ARE_FORCES = (1<<1), //!< Limits for drive effort are forces and torques rather than impulses, see PxArticulationDrive::maxForce. + eDISABLE_SELF_COLLISION = (1<<2), //!< Disable collisions between the articulation's links (note that parent/child collisions are disabled internally in either case). + eCOMPUTE_JOINT_FORCES = (1<<3) //!< Enable in order to be able to query joint solver (i.e. constraint) forces using PxArticulationCache::jointSolverForces. }; }; @@ -291,31 +306,120 @@ struct PxArticulationDriveType { enum Enum { - eFORCE = 0, - eACCELERATION = 1, - eTARGET = 2, - eVELOCITY = 3, + eFORCE = 0, //!< The output of the implicit spring drive controller is a force/torque. + eACCELERATION = 1, //!< The output of the implicit spring drive controller is a joint acceleration (use this to get (spatial)-inertia-invariant behavior of the drive). + eTARGET = 2, //!< Sets the drive gains internally to track a target position almost kinematically (i.e. with very high drive gains). + eVELOCITY = 3, //!< Sets the drive gains internally to track a target velocity almost kinematically (i.e. with very high drive gains). eNONE = 4 }; }; +/** +\brief Data structure to set articulation joint limits. + +- The lower limit should be strictly smaller than the higher limit. If the limits should be equal, use PxArticulationMotion::eLOCKED +and an appropriate offset in the parent/child joint frames. +- The limit units are linear units (equivalent to scene units) for a translational axis, or radians for a rotational axis. + +@see PxArticulationJointReducedCoordinate::setLimitParams, PxArticulationReducedCoordinate +*/ struct PxArticulationLimit { - PxReal low, high; + PxArticulationLimit(){} + + PxArticulationLimit(const PxReal low_, const PxReal high_) + { + low = low_; + high = high_; + } + + /** + \brief The lower limit on the joint axis position. + + Range: [-PX_MAX_F32, high)
+ Default: 0.0f
+ */ + PxReal low; + + /** + \brief The higher limit on the joint axis position. + + Range: (low, PX_MAX_F32]
+ Default: 0.0f
+ */ + PxReal high; }; +/** +\brief Data structure for articulation joint drive configuration. + +@see PxArticulationJointReducedCoordinate::setDriveParams, PxArticulationReducedCoordinate +*/ struct PxArticulationDrive { - PxReal stiffness, damping, maxForce; + PxArticulationDrive(){} + + PxArticulationDrive(const PxReal stiffness_, const PxReal damping_, const PxReal maxForce_, PxArticulationDriveType::Enum driveType_=PxArticulationDriveType::eFORCE) + { + stiffness = stiffness_; + damping = damping_; + maxForce = maxForce_; + driveType = driveType_; + } + + /** + \brief The drive stiffness, i.e. the proportional gain of the implicit PD controller. + + See manual for further information, and the drives' implicit spring-damper (i.e. PD control) implementation in particular. + + Units: (distance = linear scene units)
+ Rotational axis: torque/rad if driveType = PxArticulationDriveType::eFORCE; or (rad/s^2)/rad if driveType = PxArticulationDriveType::eACCELERATION
+ Translational axis: force/distance if driveType = PxArticulationDriveType::eFORCE; or (distance/s^2)/distance if driveType = PxArticulationDriveType::eACCELERATION
+ Range: [0, PX_MAX_F32]
+ Default: 0.0f
+ */ + PxReal stiffness; + + /** + \brief The drive damping, i.e. the derivative gain of the implicit PD controller. + + See manual for further information, and the drives' implicit spring-damper (i.e. PD control) implementation in particular. + + Units: (distance = linear scene units)
+ Rotational axis: torque/(rad/s) if driveType = PxArticulationDriveType::eFORCE; or (rad/s^2)/(rad/s) if driveType = PxArticulationDriveType::eACCELERATION
+ Translational axis: force/(distance/s) if driveType = PxArticulationDriveType::eFORCE; or (distance/s^2)/(distance/s) if driveType = PxArticulationDriveType::eACCELERATION
+ Range: [0, PX_MAX_F32]
+ Default: 0.0f
+ */ + PxReal damping; + + /** + \brief The drive force limit. + + - The limit is enforced regardless of the drive type #PxArticulationDriveType. + - The limit corresponds to a force (linear axis) or torque (rotational axis) if PxArticulationFlag::eDRIVE_LIMITS_ARE_FORCES is set, and to an impulse (force|torque * dt) otherwise. + + Range: [0, PX_MAX_F32]
+ Default: 0.0f
+ + @see PxArticulationFlag::eDRIVE_LIMITS_ARE_FORCES + */ + PxReal maxForce; + + /** + \brief The drive type. + + @see PxArticulationDriveType + */ PxArticulationDriveType::Enum driveType; }; - +/** @} */ struct PxTGSSolverBodyVel { - PX_ALIGN(16, PxVec3) linearVelocity; //12 + PX_ALIGN(16, PxVec3) linearVelocity; //12 PxU16 nbStaticInteractions; //14 Used to accumulate the number of static interactions - PxU16 maxDynamicPartition; //16 Used to accumualte the max partition of dynamic interactions + PxU16 maxDynamicPartition; //16 Used to accumulate the max partition of dynamic interactions PxVec3 angularVelocity; //28 PxU32 partitionMask; //32 Used in partitioning as a bit-field PxVec3 deltaAngDt; //44 @@ -329,26 +433,25 @@ struct PxTGSSolverBodyVel { return linearVelocity.dot(lin) + angularVelocity.dot(ang); } - }; //Needed only by prep, integration and 1D constraints struct PxTGSSolverBodyTxInertia { PxTransform deltaBody2World; - PxMat33 sqrtInvInertia; + PxMat33 sqrtInvInertia; //!< inverse inertia in world space }; struct PxTGSSolverBodyData { - PX_ALIGN(16, PxVec3) originalLinearVelocity; - PxReal maxContactImpulse; - PxVec3 originalAngularVelocity; - PxReal penBiasClamp; + PX_ALIGN(16, PxVec3) originalLinearVelocity; //!< Pre-solver linear velocity. + PxReal maxContactImpulse; //!< The max contact impulse. + PxVec3 originalAngularVelocity; //!< Pre-solver angular velocity + PxReal penBiasClamp; //!< The penetration bias clamp. - PxReal invMass; - PxU32 nodeIndex; - PxReal reportThreshold; + PxReal invMass; //!< Inverse mass. + PxU32 nodeIndex; //!< The node idx of this solverBodyData. Used by solver to reference between solver bodies and island bodies. Not required by immediate mode. + PxReal reportThreshold; //!< Contact force threshold. PxU32 pad; PxReal projectVelocity(const PxVec3& linear, const PxVec3& angular) const @@ -359,52 +462,50 @@ struct PxTGSSolverBodyData struct PxTGSSolverConstraintPrepDescBase { - PxConstraintInvMassScale invMassScales; //!< In: The local mass scaling for this pair. + PxConstraintInvMassScale invMassScales; //!< In: The local mass scaling for this pair. PxSolverConstraintDesc* desc; //!< Output: The PxSolverConstraintDesc filled in by contact prep - const PxTGSSolverBodyVel* body0; //!< In: The first body. Stores velocity information. Unused unless contact involves articulations. - const PxTGSSolverBodyVel *body1; //!< In: The second body. Stores velocity information. Unused unless contact involves articulations. + const PxTGSSolverBodyVel* body0; //!< In: The first body. Stores velocity information. Unused unless contact involves articulations. + const PxTGSSolverBodyVel* body1; //!< In: The second body. Stores velocity information. Unused unless contact involves articulations. - const PxTGSSolverBodyTxInertia* body0TxI; - const PxTGSSolverBodyTxInertia* body1TxI; + const PxTGSSolverBodyTxInertia* body0TxI; //!< In: The first PxTGSSolverBodyTxInertia. Stores the delta body to world transform and sqrtInvInertia for first body. + const PxTGSSolverBodyTxInertia* body1TxI; //!< In: The second PxTGSSolverBodyTxInertia. Stores the delta body to world transform and sqrtInvInertia for second body. - const PxTGSSolverBodyData* bodyData0; - const PxTGSSolverBodyData* bodyData1; + const PxTGSSolverBodyData* bodyData0; //!< In: The first PxTGSSolverBodyData. Stores mass and miscellaneous information for the first body. + const PxTGSSolverBodyData* bodyData1; //!< In: The second PxTGSSolverBodyData. Stores mass and miscellaneous information for the second body. PxTransform bodyFrame0; //!< In: The world-space transform of the first body. PxTransform bodyFrame1; //!< In: The world-space transform of the second body. - PxSolverContactDesc::BodyState bodyState0; //!< In: Defines what kind of actor the first body is - PxSolverContactDesc::BodyState bodyState1; //!< In: Defines what kind of actor the second body is - + PxSolverContactDesc::BodyState bodyState0; //!< In: Defines what kind of actor the first body is + PxSolverContactDesc::BodyState bodyState1; //!< In: Defines what kind of actor the second body is }; struct PxTGSSolverConstraintPrepDesc : public PxTGSSolverConstraintPrepDescBase { - Px1DConstraint* rows; //!< The start of the constraint rows - PxU32 numRows; //!< The number of rows + Px1DConstraint* rows; //!< The start of the constraint rows + PxU32 numRows; //!< The number of rows - PxReal linBreakForce, angBreakForce; //!< Break forces - PxReal minResponseThreshold; //!< The minimum response threshold - void* writeback; //!< Pointer to constraint writeback structure. Reports back joint breaking. If not required, set to NULL. - bool disablePreprocessing; //!< Disable joint pre-processing. Pre-processing can improve stability but under certain circumstances, e.g. when some invInertia rows are zero/almost zero, can cause instabilities. - bool improvedSlerp; //!< Use improved slerp model - bool driveLimitsAreForces; //!< Indicates whether drive limits are forces - bool extendedLimits; //!< Indiciates whether extended limits are used + PxReal linBreakForce, angBreakForce; //!< Break forces + PxReal minResponseThreshold; //!< The minimum response threshold + void* writeback; //!< Pointer to constraint writeback structure. Reports back joint breaking. If not required, set to NULL. + bool disablePreprocessing; //!< Disable joint pre-processing. Pre-processing can improve stability but under certain circumstances, e.g. when some invInertia rows are zero/almost zero, can cause instabilities. + bool improvedSlerp; //!< Use improved slerp model + bool driveLimitsAreForces; //!< Indicates whether drive limits are forces + bool extendedLimits; //!< Indicates whether extended limits are used + bool disableConstraint; //!< Disables constraint - PxVec3 body0WorldOffset; //!< Body0 world offset - PxVec3 cA2w; //!< Location of anchor point A in world space - PxVec3 cB2w; //!< Location of anchor point B in world space + PxVec3p body0WorldOffset; //!< Body0 world offset + PxVec3p cA2w; //!< Location of anchor point A in world space + PxVec3p cB2w; //!< Location of anchor point B in world space }; - struct PxTGSSolverContactDesc : public PxTGSSolverConstraintPrepDescBase { - - Sc::ShapeInteraction* shapeInteraction; //!< Pointer to share interaction. Used for force threshold reports in solver. Set to NULL if using immediate mode. - Gu::ContactPoint* contacts; //!< The start of the contacts for this pair - PxU32 numContacts; //!< The total number of contacs this pair references. + void* shapeInteraction; //!< Pointer to shape interaction. Used for force threshold reports in solver. Set to NULL if using immediate mode. + PxContactPoint* contacts; //!< The start of the contacts for this pair + PxU32 numContacts; //!< The total number of contacts this pair references. bool hasMaxImpulse; //!< Defines whether this pairs has maxImpulses clamping enabled bool disableStrongFriction; //!< Defines whether this pair disables strong friction (sticky friction correlation) @@ -413,7 +514,7 @@ struct PxTGSSolverContactDesc : public PxTGSSolverConstraintPrepDescBase PxReal restDistance; //!< A distance at which the solver should aim to hold the bodies separated. Default is 0 PxReal maxCCDSeparation; //!< A distance used to configure speculative CCD behavior. Default is PX_MAX_F32. Set internally in PhysX for bodies with eENABLE_SPECULATIVE_CCD on. Do not set directly! - PxU8* frictionPtr; //!< InOut: Friction patch correlation data. Set each frame by solver. Can be retained for improved behaviour or discarded each frame. + PxU8* frictionPtr; //!< InOut: Friction patch correlation data. Set each frame by solver. Can be retained for improved behavior or discarded each frame. PxU8 frictionCount; //!< The total number of friction patches in this pair PxReal* contactForces; //!< Out: A buffer for the solver to write applied contact forces to. @@ -425,10 +526,11 @@ struct PxTGSSolverContactDesc : public PxTGSSolverConstraintPrepDescBase PxU16 numContactPatches; //!< Total number of contact patches. PxU16 axisConstraintCount; //!< Axis constraint count. Defines how many constraint rows this pair has produced. Useful for statistical purposes. - PxReal maxImpulse; + PxReal maxImpulse; //!< The maximum impulse the solver is allowed to introduce for this pair of bodies. - PxReal torsionalPatchRadius; - PxReal minTorsionalPatchRadius; + PxReal torsionalPatchRadius; //!< This defines the radius of the contact patch used to apply torsional friction. + PxReal minTorsionalPatchRadius; //!< This defines the minimum radius of the contact patch used to apply torsional friction. + PxReal offsetSlop; //!< Slop value used to snap contact line of action back in-line with the COM. }; #if !PX_DOXYGEN diff --git a/Source/ThirdParty/PhysX/task/PxCpuDispatcher.h b/Source/ThirdParty/PhysX/task/PxCpuDispatcher.h index a9993d5c9..fc2e30ca0 100644 --- a/Source/ThirdParty/PhysX/task/PxCpuDispatcher.h +++ b/Source/ThirdParty/PhysX/task/PxCpuDispatcher.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,16 +22,17 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. -#ifndef PXTASK_PXCPUDISPATCHER_H -#define PXTASK_PXCPUDISPATCHER_H +#ifndef PX_CPU_DISPATCHER_H +#define PX_CPU_DISPATCHER_H -#include "task/PxTaskDefine.h" #include "foundation/PxSimpleTypes.h" +#if !PX_DOXYGEN namespace physx { +#endif class PxBaseTask; @@ -52,15 +52,15 @@ public: /** \brief Called by the TaskManager when a task is to be queued for execution. - Upon receiving a task, the dispatcher should schedule the task - to run when resource is available. After the task has been run, - it should call the release() method and discard it's pointer. + Upon receiving a task, the dispatcher should schedule the task to run. + After the task has been run, it should call the release() method and + discard its pointer. \param[in] task The task to be run. @see PxBaseTask */ - virtual void submitTask( PxBaseTask& task ) = 0; + virtual void submitTask(PxBaseTask& task) = 0; /** \brief Returns the number of available worker threads for this dispatcher. @@ -74,6 +74,9 @@ public: virtual ~PxCpuDispatcher() {} }; -} // end physx namespace +#if !PX_DOXYGEN +} // namespace physx +#endif + +#endif -#endif // PXTASK_PXCPUDISPATCHER_H diff --git a/Source/ThirdParty/PhysX/task/PxTask.h b/Source/ThirdParty/PhysX/task/PxTask.h index d20400629..73851e5d4 100644 --- a/Source/ThirdParty/PhysX/task/PxTask.h +++ b/Source/ThirdParty/PhysX/task/PxTask.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,18 +22,19 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. -#ifndef PXTASK_PXTASK_H -#define PXTASK_PXTASK_H +#ifndef PX_TASK_H +#define PX_TASK_H -#include "task/PxTaskDefine.h" #include "task/PxTaskManager.h" #include "task/PxCpuDispatcher.h" #include "foundation/PxAssert.h" +#if !PX_DOXYGEN namespace physx { +#endif /** * \brief Base class of all task types @@ -114,58 +114,58 @@ public: virtual ~PxTask() {} //! \brief Release method implementation - virtual void release() + virtual void release() PX_OVERRIDE { PX_ASSERT(mTm); // clear mTm before calling taskCompleted() for safety PxTaskManager* save = mTm; mTm = NULL; - save->taskCompleted( *this ); + save->taskCompleted(*this); } //! \brief Inform the PxTaskManager this task must finish before the given // task is allowed to start. - PX_INLINE void finishBefore( PxTaskID taskID ) + PX_INLINE void finishBefore(PxTaskID taskID) { PX_ASSERT(mTm); - mTm->finishBefore( *this, taskID); + mTm->finishBefore(*this, taskID); } //! \brief Inform the PxTaskManager this task cannot start until the given // task has completed. - PX_INLINE void startAfter( PxTaskID taskID ) + PX_INLINE void startAfter(PxTaskID taskID) { PX_ASSERT(mTm); - mTm->startAfter( *this, taskID ); + mTm->startAfter(*this, taskID); } /** - * \brief Manually increment this task's reference count. The task will + * \brief Manually increment this task's reference count. The task will * not be allowed to run until removeReference() is called. */ - PX_INLINE void addReference() + virtual void addReference() PX_OVERRIDE { PX_ASSERT(mTm); - mTm->addReference( mTaskID ); + mTm->addReference(mTaskID); } /** - * \brief Manually decrement this task's reference count. If the reference + * \brief Manually decrement this task's reference count. If the reference * count reaches zero, the task will be dispatched. */ - PX_INLINE void removeReference() + virtual void removeReference() PX_OVERRIDE { PX_ASSERT(mTm); - mTm->decrReference( mTaskID ); + mTm->decrReference(mTaskID); } /** * \brief Return the ref-count for this task */ - PX_INLINE int32_t getReference() const + virtual int32_t getReference() const PX_OVERRIDE { - return mTm->getReference( mTaskID ); + return mTm->getReference(mTaskID); } /** @@ -229,14 +229,12 @@ public: */ PX_INLINE void setContinuation(PxTaskManager& tm, PxBaseTask* c) { - PX_ASSERT( mRefCount == 0 ); + PX_ASSERT(mRefCount == 0); mRefCount = 1; mCont = c; mTm = &tm; - if( mCont ) - { + if(mCont) mCont->addReference(); - } } /** @@ -246,17 +244,17 @@ public: * task, which cannot be NULL. * \param[in] c The task to be executed after this task has finished running */ - PX_INLINE void setContinuation( PxBaseTask* c ) + PX_INLINE void setContinuation(PxBaseTask* c) { - PX_ASSERT( c ); - PX_ASSERT( mRefCount == 0 ); + PX_ASSERT(c); + PX_ASSERT(mRefCount == 0); mRefCount = 1; mCont = c; - if( mCont ) + if(mCont) { mCont->addReference(); mTm = mCont->getTaskManager(); - PX_ASSERT( mTm ); + PX_ASSERT(mTm); } } @@ -269,25 +267,25 @@ public: } /** - * \brief Manually decrement this task's reference count. If the reference + * \brief Manually decrement this task's reference count. If the reference * count reaches zero, the task will be dispatched. */ - PX_INLINE void removeReference() + virtual void removeReference() PX_OVERRIDE { mTm->decrReference(*this); } /** \brief Return the ref-count for this task */ - PX_INLINE int32_t getReference() const + virtual int32_t getReference() const PX_OVERRIDE { return mRefCount; } /** - * \brief Manually increment this task's reference count. The task will + * \brief Manually increment this task's reference count. The task will * not be allowed to run until removeReference() is called. */ - PX_INLINE void addReference() + virtual void addReference() PX_OVERRIDE { mTm->addReference(*this); } @@ -297,12 +295,10 @@ public: * * Decrements the continuation task's reference count, if specified. */ - PX_INLINE void release() + virtual void release() PX_OVERRIDE { - if( mCont ) - { + if(mCont) mCont->removeReference(); - } } protected: @@ -314,7 +310,10 @@ protected: }; -}// end physx namespace +#if !PX_DOXYGEN +} // namespace physx +#endif -#endif // PXTASK_PXTASK_H +#endif + diff --git a/Source/ThirdParty/PhysX/task/PxTaskManager.h b/Source/ThirdParty/PhysX/task/PxTaskManager.h index 003bbb6c5..33af75478 100644 --- a/Source/ThirdParty/PhysX/task/PxTaskManager.h +++ b/Source/ThirdParty/PhysX/task/PxTaskManager.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,18 +22,18 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. -#ifndef PXTASK_PXTASKMANAGER_H -#define PXTASK_PXTASKMANAGER_H +#ifndef PX_TASK_MANAGER_H +#define PX_TASK_MANAGER_H -#include "task/PxTaskDefine.h" #include "foundation/PxSimpleTypes.h" #include "foundation/PxErrorCallback.h" +#if !PX_DOXYGEN namespace physx { -PX_PUSH_PACK_DEFAULT +#endif class PxBaseTask; class PxTask; @@ -44,7 +43,7 @@ typedef unsigned int PxTaskID; /** \brief Identifies the type of each heavyweight PxTask object -\note This enum type is only used by PxTask and GpuTask objects, LightCpuTasks do not use this enum. +\note This enum type is only used by PxTask objects, PxLightCpuTasks do not use this enum. @see PxTask @see PxLightCpuTask @@ -56,9 +55,12 @@ struct PxTaskType */ enum Enum { - TT_CPU, //!< PxTask will be run on the CPU - TT_NOT_PRESENT, //!< Return code when attempting to find a task that does not exist - TT_COMPLETED //!< PxTask execution has been completed + eCPU, //!< PxTask will be run on the CPU + eNOT_PRESENT, //!< Return code when attempting to find a task that does not exist + eCOMPLETED, //!< PxTask execution has been completed + TT_CPU PX_DEPRECATED = eCPU, + TT_NOT_PRESENT PX_DEPRECATED = eNOT_PRESENT, + TT_COMPLETED PX_DEPRECATED = eCOMPLETED }; }; @@ -67,12 +69,12 @@ class PxCpuDispatcher; /** \brief The PxTaskManager interface - A PxTaskManager instance holds references to user-provided dispatcher objects, when tasks are + A PxTaskManager instance holds references to user-provided dispatcher objects. When tasks are submitted the PxTaskManager routes them to the appropriate dispatcher and handles task profiling if enabled. Users should not implement the PxTaskManager interface, the SDK creates its own concrete PxTaskManager object per-scene which users can configure by passing dispatcher objects into the PxSceneDesc. - @see CpuDispatcher + @see PxCpuDispatcher */ class PxTaskManager @@ -84,7 +86,7 @@ public: \param[in] ref The dispatcher object. - @see CpuDispatcher + @see PxCpuDispatcher */ virtual void setCpuDispatcher(PxCpuDispatcher& ref) = 0; @@ -93,9 +95,9 @@ public: \return The CPU dispatcher object. - @see CpuDispatcher + @see PxCpuDispatcher */ - virtual PxCpuDispatcher* getCpuDispatcher() const = 0; + virtual PxCpuDispatcher* getCpuDispatcher() const = 0; /** \brief Reset any dependencies between Tasks @@ -109,7 +111,7 @@ public: /** \brief Called by the owning scene to start the task graph. - \note All tasks with with ref count of 1 will be dispatched. + \note All tasks with ref count of 1 will be dispatched. @see PxTask */ @@ -121,7 +123,7 @@ public: virtual void stopSimulation() = 0; /** - \brief Called by the worker threads to inform the PxTaskManager that a task has completed processing + \brief Called by the worker threads to inform the PxTaskManager that a task has completed processing. \param[in] task The task which has been completed */ @@ -131,7 +133,7 @@ public: \brief Retrieve a task by name \param[in] name The unique name of a task - \return The ID of the task with that name, or TT_NOT_PRESENT if not found + \return The ID of the task with that name, or eNOT_PRESENT if not found */ virtual PxTaskID getNamedTask(const char* name) = 0; @@ -140,20 +142,20 @@ public: \param[in] task The task to be executed \param[in] name The unique name of a task - \param[in] type The type of the task (default TT_CPU) - \return The ID of the task with that name, or TT_NOT_PRESENT if not found + \param[in] type The type of the task (default eCPU) + \return The ID of the task with that name, or eNOT_PRESENT if not found */ - virtual PxTaskID submitNamedTask(PxTask* task, const char* name, PxTaskType::Enum type = PxTaskType::TT_CPU) = 0; + virtual PxTaskID submitNamedTask(PxTask* task, const char* name, PxTaskType::Enum type = PxTaskType::eCPU) = 0; /** \brief Submit an unnamed task. \param[in] task The task to be executed - \param[in] type The type of the task (default TT_CPU) + \param[in] type The type of the task (default eCPU) - \return The ID of the task with that name, or TT_NOT_PRESENT if not found + \return The ID of the task with that name, or eNOT_PRESENT if not found */ - virtual PxTaskID submitUnnamedTask(PxTask& task, PxTaskType::Enum type = PxTaskType::TT_CPU) = 0; + virtual PxTaskID submitUnnamedTask(PxTask& task, PxTaskType::Enum type = PxTaskType::eCPU) = 0; /** \brief Retrieve a task given a task ID @@ -172,7 +174,7 @@ public: /** \brief Construct a new PxTaskManager instance with the given [optional] dispatchers */ - static PxTaskManager* createTaskManager(PxErrorCallback& errorCallback, PxCpuDispatcher* = 0); + static PxTaskManager* createTaskManager(PxErrorCallback& errorCallback, PxCpuDispatcher* = NULL); protected: virtual ~PxTaskManager() {} @@ -196,9 +198,9 @@ protected: friend class PxLightCpuTask; }; -PX_POP_PACK - -} // end physx namespace +#if !PX_DOXYGEN +} // namespace physx +#endif -#endif // PXTASK_PXTASKMANAGER_H +#endif diff --git a/Source/ThirdParty/PhysX/vehicle/PxVehicleComponents.h b/Source/ThirdParty/PhysX/vehicle/PxVehicleComponents.h index dbf0a1c65..1b2c38146 100644 --- a/Source/ThirdParty/PhysX/vehicle/PxVehicleComponents.h +++ b/Source/ThirdParty/PhysX/vehicle/PxVehicleComponents.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,15 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_VEHICLE_CORE_COMPONENTS_H -#define PX_VEHICLE_CORE_COMPONENTS_H -/** \addtogroup vehicle - @{ -*/ +#ifndef PX_VEHICLE_COMPONENTS_H +#define PX_VEHICLE_COMPONENTS_H #include "foundation/PxMemory.h" #include "foundation/PxVec3.h" @@ -44,7 +40,7 @@ namespace physx { #endif -class PxVehicleChassisData +class PX_DEPRECATED PxVehicleChassisData { public: @@ -86,7 +82,7 @@ private: }; PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleChassisData)& 0x0f)); -class PxVehicleEngineData +class PX_DEPRECATED PxVehicleEngineData { public: @@ -239,7 +235,7 @@ public: }; PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleEngineData)& 0x0f)); -class PxVehicleGearsData +class PX_DEPRECATED PxVehicleGearsData { public: @@ -344,7 +340,7 @@ public: }; PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleGearsData)& 0x0f)); -class PxVehicleAutoBoxData +class PX_DEPRECATED PxVehicleAutoBoxData { public: @@ -427,7 +423,7 @@ public: }; PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleAutoBoxData)& 0x0f)); -class PxVehicleDifferential4WData +class PX_DEPRECATED PxVehicleDifferential4WData { public: @@ -532,7 +528,7 @@ public: }; PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleDifferential4WData)& 0x0f)); -class PxVehicleDifferentialNWData +class PX_DEPRECATED PxVehicleDifferentialNWData { public: @@ -579,7 +575,7 @@ public: PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleDifferentialNWData)& 0x0f)); -class PxVehicleAckermannGeometryData +class PX_DEPRECATED PxVehicleAckermannGeometryData { public: @@ -652,7 +648,7 @@ PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleAckermannGeometryData)& 0x0f)); \brief Choose between a potentially more expensive but more accurate solution to the clutch model or a potentially cheaper but less accurate solution. @see PxVehicleClutchData */ -struct PxVehicleClutchAccuracyMode +struct PX_DEPRECATED PxVehicleClutchAccuracyMode { enum Enum { @@ -661,7 +657,7 @@ struct PxVehicleClutchAccuracyMode }; }; -class PxVehicleClutchData +class PX_DEPRECATED PxVehicleClutchData { public: @@ -759,7 +755,7 @@ to give less jerky handling behavior. \note The tire load applied as input to the tire force computation is the filtered normalized load multiplied by the rest load. */ -class PxVehicleTireLoadFilterData +class PX_DEPRECATED PxVehicleTireLoadFilterData { public: @@ -815,7 +811,7 @@ public: }; PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleTireLoadFilterData)& 0x0f)); -class PxVehicleWheelData +class PX_DEPRECATED PxVehicleWheelData { public: @@ -957,7 +953,7 @@ private: }; PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleWheelData)& 0x0f)); -class PxVehicleSuspensionData +class PX_DEPRECATED PxVehicleSuspensionData { public: @@ -1023,7 +1019,8 @@ public: \note The sum of the sprung masses of all suspensions of a vehicle should match the mass of the PxRigidDynamic associated with the vehicle. When this condition is satisfied for a vehicle on a horizontal plane the wheels of the vehicle are guaranteed to sit at the rest pose - defined by the wheel centre offset. The mass matching condition is not enforced. + defined by the wheel centre offset. For special cases, where this condition can not be met easily, the flag + #PxVehicleWheelsSimFlag::eDISABLE_SPRUNG_MASS_SUM_CHECK allows to provide sprung mass values that do not sum up to the mass of the PxRigidDynamic. \note As the wheel compresses or elongates along the suspension direction the force generated by the spring is F = |gravity|*mSprungMass + deltaX*mSpringStrength + deltaXDot*mSpringDamperRate @@ -1135,7 +1132,7 @@ private: }; PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleSuspensionData)& 0x0f)); -class PxVehicleAntiRollBarData +class PX_DEPRECATED PxVehicleAntiRollBarData { public: @@ -1175,7 +1172,7 @@ private: }; PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleAntiRollBarData)& 0x0f)); -class PxVehicleTireData +class PX_DEPRECATED PxVehicleTireData { public: friend class PxVehicleWheels4SimData; @@ -1355,5 +1352,4 @@ PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleTireData)& 0x0f)); } // namespace physx #endif -/** @} */ -#endif //PX_VEHICLE_CORE_COMPONENTS_H +#endif diff --git a/Source/ThirdParty/PhysX/vehicle/PxVehicleDrive.h b/Source/ThirdParty/PhysX/vehicle/PxVehicleDrive.h index c0ca3fc61..57be28f50 100644 --- a/Source/ThirdParty/PhysX/vehicle/PxVehicleDrive.h +++ b/Source/ThirdParty/PhysX/vehicle/PxVehicleDrive.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,15 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. #ifndef PX_VEHICLE_DRIVE_H #define PX_VEHICLE_DRIVE_H -/** \addtogroup vehicle - @{ -*/ #include "vehicle/PxVehicleWheels.h" #include "vehicle/PxVehicleComponents.h" @@ -53,7 +49,7 @@ class PxRigidDynamic; \brief Data structure describing non-wheel configuration data of a vehicle that has engine, gears, clutch, and auto-box. @see PxVehicleWheelsSimData for wheels configuration data. */ -class PxVehicleDriveSimData +class PX_DEPRECATED PxVehicleDriveSimData { //= ATTENTION! ===================================================================================== // Changing the data layout of this class breaks the binary serialization format. See comments for @@ -168,7 +164,7 @@ PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleDriveSimData) & 15)); \brief Data structure with instanced dynamics data for vehicle with engine, clutch, gears, autobox @see PxVehicleWheelsDynData for wheels dynamics data. */ -class PxVehicleDriveDynData +class PX_DEPRECATED PxVehicleDriveDynData { public: @@ -493,7 +489,7 @@ PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleDriveDynData) & 15)); \brief A complete vehicle with instance dynamics data and configuration data for wheels and engine,clutch,gears,autobox. @see PxVehicleDrive4W, PxVehicleDriveTank */ -class PxVehicleDrive : public PxVehicleWheels +class PX_DEPRECATED PxVehicleDrive : public PxVehicleWheels { //= ATTENTION! ===================================================================================== // Changing the data layout of this class breaks the binary serialization format. See comments for @@ -561,5 +557,4 @@ PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleDrive) & 15)); } // namespace physx #endif -/** @} */ -#endif //PX_VEHICLE_DRIVE_H +#endif diff --git a/Source/ThirdParty/PhysX/vehicle/PxVehicleDrive4W.h b/Source/ThirdParty/PhysX/vehicle/PxVehicleDrive4W.h index 270f1662e..e2212df48 100644 --- a/Source/ThirdParty/PhysX/vehicle/PxVehicleDrive4W.h +++ b/Source/ThirdParty/PhysX/vehicle/PxVehicleDrive4W.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,15 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. #ifndef PX_VEHICLE_4WDRIVE_H #define PX_VEHICLE_4WDRIVE_H -/** \addtogroup vehicle - @{ -*/ #include "vehicle/PxVehicleDrive.h" #include "vehicle/PxVehicleWheels.h" @@ -56,7 +52,7 @@ class PxRigidDynamic; The drive model incorporates engine, clutch, gears, autobox, differential, and Ackermann steer correction. @see PxVehicleDriveSimData */ -class PxVehicleDriveSimData4W : public PxVehicleDriveSimData +class PX_DEPRECATED PxVehicleDriveSimData4W : public PxVehicleDriveSimData { //= ATTENTION! ===================================================================================== // Changing the data layout of this class breaks the binary serialization format. See comments for @@ -140,7 +136,7 @@ PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleDriveSimData4W) & 15)); @see PxVehicleWheelsSimData, PxVehicleWheelsDynData */ -struct PxVehicleDrive4WWheelOrder +struct PX_DEPRECATED PxVehicleDrive4WWheelOrder { enum Enum { @@ -157,7 +153,7 @@ struct PxVehicleDrive4WWheelOrder @see PxVehicleDriveDynData::setAnalogInput, PxVehicleDriveDynData::getAnalogInput */ -struct PxVehicleDrive4WControl +struct PX_DEPRECATED PxVehicleDrive4WControl { enum Enum { @@ -173,7 +169,7 @@ struct PxVehicleDrive4WControl /** \brief Data structure with instanced dynamics data and configuration data of a vehicle with up to 4 driven wheels and up to 16 non-driven wheels. */ -class PxVehicleDrive4W : public PxVehicleDrive +class PX_DEPRECATED PxVehicleDrive4W : public PxVehicleDrive { //= ATTENTION! ===================================================================================== // Changing the data layout of this class breaks the binary serialization format. See comments for @@ -274,5 +270,4 @@ PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleDrive4W) & 15)); } // namespace physx #endif -/** @} */ -#endif //PX_VEHICLE_4WDRIVE_H +#endif diff --git a/Source/ThirdParty/PhysX/vehicle/PxVehicleDriveNW.h b/Source/ThirdParty/PhysX/vehicle/PxVehicleDriveNW.h index f9334d2a4..23c984bee 100644 --- a/Source/ThirdParty/PhysX/vehicle/PxVehicleDriveNW.h +++ b/Source/ThirdParty/PhysX/vehicle/PxVehicleDriveNW.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,15 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. #ifndef PX_VEHICLE_NWDRIVE_H #define PX_VEHICLE_NWDRIVE_H -/** \addtogroup vehicle - @{ -*/ #include "vehicle/PxVehicleDrive.h" #include "vehicle/PxVehicleWheels.h" @@ -55,7 +51,7 @@ class PxRigidDynamic; engine, clutch, gears, autobox, differential. @see PxVehicleDriveSimData */ -class PxVehicleDriveSimDataNW : public PxVehicleDriveSimData +class PX_DEPRECATED PxVehicleDriveSimDataNW : public PxVehicleDriveSimData { //= ATTENTION! ===================================================================================== // Changing the data layout of this class breaks the binary serialization format. See comments for @@ -115,7 +111,7 @@ PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleDriveSimDataNW) & 15)); @see PxVehicleDriveDynData::setAnalogInput, PxVehicleDriveDynData::getAnalogInput */ -struct PxVehicleDriveNWControl +struct PX_DEPRECATED PxVehicleDriveNWControl { enum Enum { @@ -131,7 +127,7 @@ struct PxVehicleDriveNWControl /** \brief Data structure with instanced dynamics data and configuration data of a vehicle with up to PX_MAX_NB_WHEELS driven wheels. */ -class PxVehicleDriveNW : public PxVehicleDrive +class PX_DEPRECATED PxVehicleDriveNW : public PxVehicleDrive { //= ATTENTION! ===================================================================================== // Changing the data layout of this class breaks the binary serialization format. See comments for @@ -232,5 +228,4 @@ PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleDriveNW) & 15)); } // namespace physx #endif -/** @} */ -#endif //PX_VEHICLE_NWDRIVE_H +#endif diff --git a/Source/ThirdParty/PhysX/vehicle/PxVehicleDriveTank.h b/Source/ThirdParty/PhysX/vehicle/PxVehicleDriveTank.h index b9f163512..420161217 100644 --- a/Source/ThirdParty/PhysX/vehicle/PxVehicleDriveTank.h +++ b/Source/ThirdParty/PhysX/vehicle/PxVehicleDriveTank.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,15 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. #ifndef PX_VEHICLE_DRIVE_TANK_H #define PX_VEHICLE_DRIVE_TANK_H -/** \addtogroup vehicle - @{ -*/ #include "vehicle/PxVehicleDrive.h" #include "vehicle/PxVehicleWheels.h" @@ -56,7 +52,7 @@ class PxRigidDynamic; @see PxVehicleWheelsSimData, PxVehicleWheelsDynData */ -struct PxVehicleDriveTankWheelOrder +struct PX_DEPRECATED PxVehicleDriveTankWheelOrder { enum Enum { @@ -102,7 +98,7 @@ the tank will turn to the left. @see PxVehicleDriveDynData::setAnalogInput, PxVehicleDriveDynData::getAnalogInput */ -struct PxVehicleDriveTankControl +struct PX_DEPRECATED PxVehicleDriveTankControl { enum Enum { @@ -134,7 +130,7 @@ thrust to the right wheels. @see PxVehicleDriveTank::setDriveModel */ -struct PxVehicleDriveTankControlModel +struct PX_DEPRECATED PxVehicleDriveTankControlModel { enum Enum { @@ -147,7 +143,7 @@ struct PxVehicleDriveTankControlModel /** \brief Data structure with instanced dynamics data and configuration data of a tank. */ -class PxVehicleDriveTank : public PxVehicleDrive +class PX_DEPRECATED PxVehicleDriveTank : public PxVehicleDrive { //= ATTENTION! ===================================================================================== // Changing the data layout of this class breaks the binary serialization format. See comments for @@ -276,5 +272,4 @@ PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleDriveTank) & 15)); } // namespace physx #endif -/** @} */ -#endif //PX_VEHICLE_DRIVE_TANK_H +#endif diff --git a/Source/ThirdParty/PhysX/vehicle/PxVehicleNoDrive.h b/Source/ThirdParty/PhysX/vehicle/PxVehicleNoDrive.h index 69982da2d..f8d8cc74d 100644 --- a/Source/ThirdParty/PhysX/vehicle/PxVehicleNoDrive.h +++ b/Source/ThirdParty/PhysX/vehicle/PxVehicleNoDrive.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,15 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. #ifndef PX_VEHICLE_NO_DRIVE_H #define PX_VEHICLE_NO_DRIVE_H -/** \addtogroup vehicle - @{ -*/ #include "vehicle/PxVehicleWheels.h" #include "vehicle/PxVehicleComponents.h" @@ -53,7 +49,7 @@ class PxRigidDynamic; /** \brief Data structure with instanced dynamics data and configuration data of a vehicle with no drive model. */ -class PxVehicleNoDrive : public PxVehicleWheels +class PX_DEPRECATED PxVehicleNoDrive : public PxVehicleWheels { //= ATTENTION! ===================================================================================== // Changing the data layout of this class breaks the binary serialization format. See comments for @@ -212,5 +208,4 @@ PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleNoDrive) & 15)); } // namespace physx #endif -/** @} */ -#endif //PX_VEHICLE_NO_DRIVE_H +#endif diff --git a/Source/ThirdParty/PhysX/vehicle/PxVehicleSDK.h b/Source/ThirdParty/PhysX/vehicle/PxVehicleSDK.h index d47aa5433..cfe58f01a 100644 --- a/Source/ThirdParty/PhysX/vehicle/PxVehicleSDK.h +++ b/Source/ThirdParty/PhysX/vehicle/PxVehicleSDK.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,17 +22,15 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. #ifndef PX_VEHICLE_SDK_H #define PX_VEHICLE_SDK_H -/** \addtogroup vehicle - @{ -*/ #include "foundation/Px.h" +#include "foundation/PxVec3.h" #include "common/PxTypeInfo.h" #if !PX_DOXYGEN @@ -57,7 +54,7 @@ Call this before using any of the vehicle functions. @see PxCloseVehicleSDK */ -PX_C_EXPORT bool PX_CALL_CONV PxInitVehicleSDK(PxPhysics& physics, PxSerializationRegistry* serializationRegistry = NULL); +PX_DEPRECATED PX_C_EXPORT bool PX_CALL_CONV PxInitVehicleSDK(PxPhysics& physics, PxSerializationRegistry* serializationRegistry = NULL); /** @@ -72,7 +69,7 @@ Call this function as part of the physx shutdown process. @see PxInitVehicleSDK */ -PX_C_EXPORT void PX_CALL_CONV PxCloseVehicleSDK(PxSerializationRegistry* serializationRegistry = NULL); +PX_DEPRECATED PX_C_EXPORT void PX_CALL_CONV PxCloseVehicleSDK(PxSerializationRegistry* serializationRegistry = NULL); /** @@ -92,7 +89,7 @@ PX_C_EXPORT void PX_CALL_CONV PxCloseVehicleSDK(PxSerializationRegistry* seriali /** @see PxVehicleDrive4W, PxVehicleDriveTank, PxVehicleDriveNW, PxVehicleNoDrive, PxVehicleWheels::getVehicleType */ -struct PxVehicleTypes +struct PX_DEPRECATED PxVehicleTypes { enum Enum { @@ -113,7 +110,7 @@ struct PxVehicleTypes \note This enum can be used to identify a vehicle object stored in a PxCollection. @see PxBase, PxTypeInfo, PxBase::getConcreteType */ -struct PxVehicleConcreteType +struct PX_DEPRECATED PxVehicleConcreteType { enum Enum { @@ -128,17 +125,20 @@ struct PxVehicleConcreteType /** \brief Set the basis vectors of the vehicle simulation -Default values PxVec3(0,1,0), PxVec3(0,0,1) +See PxVehicleContext for the default values. -Call this function before using PxVehicleUpdates unless the default values are correct. +Call this function before using PxVehicleUpdates unless the default values are correct +or the settings structure is explicitly provided. + +@see PxVehicleContext */ -void PxVehicleSetBasisVectors(const PxVec3& up, const PxVec3& forward); +PX_DEPRECATED void PxVehicleSetBasisVectors(const PxVec3& up, const PxVec3& forward); /** @see PxVehicleSetUpdateMode */ -struct PxVehicleUpdateMode +struct PX_DEPRECATED PxVehicleUpdateMode { enum Enum { @@ -153,13 +153,14 @@ struct PxVehicleUpdateMode with an acceleration to be applied in the next PhysX SDK update or as an immediate velocity modification. -Default behavior is immediate velocity modification. +See PxVehicleContext for the default value. -Call this function before using PxVehicleUpdates for the first time if the default is not the desired behavior. +Call this function before using PxVehicleUpdates for the first time if the default is not the desired behavior +or if the settings structure is not explicitly provided. -@see PxVehicleUpdates +@see PxVehicleUpdates, PxVehicleContext */ -void PxVehicleSetUpdateMode(PxVehicleUpdateMode::Enum vehicleUpdateMode); +PX_DEPRECATED void PxVehicleSetUpdateMode(PxVehicleUpdateMode::Enum vehicleUpdateMode); /** @@ -211,9 +212,9 @@ by the contact modification callback PxVehicleModifyWheelContacts. \note Both angles have default values of Pi/4. -@see PxVehicleSuspensionSweeps, PxVehicleModifyWheelContacts +@see PxVehicleSuspensionSweeps, PxVehicleModifyWheelContacts, PxVehicleContext */ -void PxVehicleSetSweepHitRejectionAngles(const PxF32 pointRejectAngle, const PxF32 normalRejectAngle); +PX_DEPRECATED void PxVehicleSetSweepHitRejectionAngles(const PxF32 pointRejectAngle, const PxF32 normalRejectAngle); /** @@ -225,13 +226,195 @@ the suspension must be applied to dynamic objects that lie under the wheel. This when a heavy wheel is driving on a light object. The value of maxHitActorAcceleration clamps the applied force so that it never generates an acceleration greater than the specified value. -\note Default value of maxHitActorAcceleration is PX_MAX_REAL +See PxVehicleContext for the default value. + +@see PxVehicleContext */ -void PxVehicleSetMaxHitActorAcceleration(const PxF32 maxHitActorAcceleration); +PX_DEPRECATED void PxVehicleSetMaxHitActorAcceleration(const PxF32 maxHitActorAcceleration); + + +/** +\brief Common parameters and settings used for the vehicle simulation. + +To be passed into PxVehicleUpdates(), for example. + +@see PxVehicleUpdates() +*/ +class PX_DEPRECATED PxVehicleContext +{ +public: + + /** + \brief The axis denoting the up direction for vehicles. + + Range: unit length vector
+ Default: PxVec3(0,1,0) + + @see PxVehicleSetBasisVectors() + */ + PxVec3 upAxis; + + /** + \brief The axis denoting the forward direction for vehicles. + + Range: unit length vector
+ Default: PxVec3(0,0,1) + + @see PxVehicleSetBasisVectors() + */ + PxVec3 forwardAxis; + + /** + \brief The axis denoting the side direction for vehicles. + + Has to be the cross product of the up- and forward-axis. The method + computeSideAxis() can be used to do that computation for you. + + Range: unit length vector
+ Default: PxVec3(1,0,0) + + @see PxVehicleSetBasisVectors(), computeSideAxis() + */ + PxVec3 sideAxis; + + /** + \brief Apply vehicle simulation results as acceleration or velocity modification. + + See PxVehicleSetUpdateMode() for details. + + Default: eVELOCITY_CHANGE + + @see PxVehicleSetUpdateMode() + */ + PxVehicleUpdateMode::Enum updateMode; + + /** + \brief Cosine of threshold angle for rejecting sweep hits. + + See PxVehicleSetSweepHitRejectionAngles() for details. + + Range: (1, -1)
+ Default: 0.707f (cosine of 45 degrees) + + @see PxVehicleSetSweepHitRejectionAngles() + */ + PxF32 pointRejectAngleThresholdCosine; + + /** + \brief Cosine of threshold angle for rejecting sweep hits. + + See PxVehicleSetSweepHitRejectionAngles() for details. + + Range: (1, -1)
+ Default: 0.707f (cosine of 45 degrees) + + @see PxVehicleSetSweepHitRejectionAngles() + */ + PxF32 normalRejectAngleThresholdCosine; + + /** + \brief Maximum acceleration experienced by PxRigidDynamic instances that are found to be in contact with a wheel. + + See PxVehicleSetMaxHitActorAcceleration() for details. + + Range: [0, PX_MAX_REAL]
+ Default: PX_MAX_REAL + + @see PxVehicleSetMaxHitActorAcceleration() + */ + PxF32 maxHitActorAcceleration; + + +public: + /** + \brief Constructor sets to default. + */ + PX_INLINE PxVehicleContext(); + + /** + \brief (re)sets the structure to the default. + */ + PX_INLINE void setToDefault(); + + /** + \brief Check if the settings descriptor is valid. + + \return True if the current settings are valid. + */ + PX_INLINE bool isValid() const; + + /** + \brief Compute the side-axis from the up- and forward-axis + */ + PX_INLINE void computeSideAxis(); +}; + +PX_INLINE PxVehicleContext::PxVehicleContext(): + upAxis(0.0f, 1.0f, 0.0f), + forwardAxis(0.0f, 0.0f, 1.0f), + sideAxis(1.0f, 0.0f, 0.0f), + updateMode(PxVehicleUpdateMode::eVELOCITY_CHANGE), + pointRejectAngleThresholdCosine(0.707f), // cosine of 45 degrees + normalRejectAngleThresholdCosine(0.707f), // cosine of 45 degrees + maxHitActorAcceleration(PX_MAX_REAL) +{ +} + +PX_INLINE void PxVehicleContext::setToDefault() +{ + *this = PxVehicleContext(); +} + +PX_INLINE bool PxVehicleContext::isValid() const +{ + if (!upAxis.isNormalized()) + return false; + + if (!forwardAxis.isNormalized()) + return false; + + if (!sideAxis.isNormalized()) + return false; + + if (((upAxis.cross(forwardAxis)) - sideAxis).magnitude() > 0.02f) // somewhat above 1 degree assuming both have unit length + return false; + + if ((pointRejectAngleThresholdCosine >= 1) || (pointRejectAngleThresholdCosine <= -1)) + return false; + + if ((normalRejectAngleThresholdCosine >= 1) || (normalRejectAngleThresholdCosine <= -1)) + return false; + + if (maxHitActorAcceleration < 0.0f) + return false; + + return true; +} + +PX_INLINE void PxVehicleContext::computeSideAxis() +{ + sideAxis = upAxis.cross(forwardAxis); +} + + +/** +\brief Get the default vehicle context. + +Will be used if the corresponding parameters are not specified in methods like +PxVehicleUpdates() etc. + +To set the default values, see the methods PxVehicleSetBasisVectors(), +PxVehicleSetUpdateMode() etc. + +\return The default vehicle context. + +@see PxVehicleSetBasisVectors() PxVehicleSetUpdateMode() +*/ +PX_DEPRECATED const PxVehicleContext& PxVehicleGetDefaultContext(); + #if !PX_DOXYGEN } // namespace physx #endif -/** @} */ -#endif //PX_VEHICLE_SDK_H +#endif diff --git a/Source/ThirdParty/PhysX/vehicle/PxVehicleShaders.h b/Source/ThirdParty/PhysX/vehicle/PxVehicleShaders.h index 18d92440d..0c08d9fd2 100644 --- a/Source/ThirdParty/PhysX/vehicle/PxVehicleShaders.h +++ b/Source/ThirdParty/PhysX/vehicle/PxVehicleShaders.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,15 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. #ifndef PX_VEHICLE_SHADERS_H #define PX_VEHICLE_SHADERS_H -/** \addtogroup vehicle - @{ -*/ #include "foundation/PxSimpleTypes.h" @@ -61,7 +57,7 @@ namespace physx \param[out] tireAlignMoment is the aligning moment of the tire that is to be applied to the vehicle's rigid body (not currently used). @see PxVehicleWheelsDynData::setTireForceShaderFunction, PxVehicleWheelsDynData::setTireForceShaderData */ -typedef void (*PxVehicleComputeTireForce) +PX_DEPRECATED typedef void (*PxVehicleComputeTireForce) (const void* shaderData, const PxF32 tireFriction, const PxF32 longSlip, const PxF32 latSlip, const PxF32 camber, @@ -75,5 +71,4 @@ typedef void (*PxVehicleComputeTireForce) } // namespace physx #endif -/** @} */ -#endif //PX_VEHICLE_SHADERS_H +#endif diff --git a/Source/ThirdParty/PhysX/vehicle/PxVehicleTireFriction.h b/Source/ThirdParty/PhysX/vehicle/PxVehicleTireFriction.h index cdc8ca750..d2408eace 100644 --- a/Source/ThirdParty/PhysX/vehicle/PxVehicleTireFriction.h +++ b/Source/ThirdParty/PhysX/vehicle/PxVehicleTireFriction.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,17 +22,15 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. #ifndef PX_VEHICLE_TIREFRICTION_H #define PX_VEHICLE_TIREFRICTION_H -/** \addtogroup vehicle - @{ -*/ #include "foundation/PxSimpleTypes.h" +#include "common/PxSerialFramework.h" #if !PX_DOXYGEN namespace physx @@ -41,12 +38,14 @@ namespace physx #endif class PxMaterial; +class PxCollection; +class PxOutputStream; /** \brief Driving surface type. Each PxMaterial is associated with a corresponding PxVehicleDrivableSurfaceType. @see PxMaterial, PxVehicleDrivableSurfaceToTireFrictionPairs */ -struct PxVehicleDrivableSurfaceType +struct PX_DEPRECATED PxVehicleDrivableSurfaceType { enum { @@ -59,7 +58,7 @@ struct PxVehicleDrivableSurfaceType \brief Friction for each combination of driving surface type and tire type. @see PxVehicleDrivableSurfaceType, PxVehicleTireData::mType */ -class PxVehicleDrivableSurfaceToTireFrictionPairs +class PX_DEPRECATED PxVehicleDrivableSurfaceToTireFrictionPairs { public: @@ -116,28 +115,83 @@ public: */ void setTypePairFriction(const PxU32 surfaceType, const PxU32 tireType, const PxReal value); + + /** + \brief Compute the surface type associated with a specified PxMaterial instance. + \param[in] surfaceMaterial is the material to be queried for its associated surface type. + \note The surface type may be used to query the friction of a surface type/tire type pair using getTypePairFriction() + \return The surface type associated with a specified PxMaterial instance. + If surfaceMaterial is not referenced by the PxVehicleDrivableSurfaceToTireFrictionPairs a value of 0 will be returned. + @see setup + @see getTypePairFriction + */ + PxU32 getSurfaceType(const PxMaterial& surfaceMaterial) const; + /** \brief Return the friction for a specified combination of surface type and tire type. \return The friction for a specified combination of surface type and tire type. \note The final friction value used by the tire model is the value returned by getTypePairFriction multiplied by the value computed from PxVehicleTireData::mFrictionVsSlipGraph + \note The surface type is associated with a PxMaterial. The mapping between the two may be queried using getSurfaceType(). @see PxVehicleTireData::mFrictionVsSlipGraph + @see getSurfaceType */ PxReal getTypePairFriction(const PxU32 surfaceType, const PxU32 tireType) const; + /** + \brief Return the friction for a specified combination of PxMaterial and tire type. + \return The friction for a specified combination of PxMaterial and tire type. + \note The final friction value used by the tire model is the value returned by getTypePairFriction + multiplied by the value computed from PxVehicleTireData::mFrictionVsSlipGraph + \note If surfaceMaterial is not referenced by the PxVehicleDrivableSurfaceToTireFrictionPairs + a surfaceType of value 0 will be assumed and the corresponding friction value will be returned. + @see PxVehicleTireData::mFrictionVsSlipGraph + */ + PxReal getTypePairFriction(const PxMaterial& surfaceMaterial, const PxU32 tireType) const; + /** \brief Return the maximum number of surface types \return The maximum number of surface types @see allocate */ - PxU32 getMaxNbSurfaceTypes() const {return mMaxNbSurfaceTypes;} + PX_FORCE_INLINE PxU32 getMaxNbSurfaceTypes() const {return mMaxNbSurfaceTypes;} /** \brief Return the maximum number of tire types \return The maximum number of tire types @see allocate */ - PxU32 getMaxNbTireTypes() const {return mMaxNbTireTypes;} + PX_FORCE_INLINE PxU32 getMaxNbTireTypes() const {return mMaxNbTireTypes;} + + /** + \brief Binary serialization of a PxVehicleDrivableSurfaceToTireFrictionPairs instance. + The PxVehicleDrivableSurfaceToTireFrictionPairs instance is serialized to a PxOutputStream. + The materials referenced by the PxVehicleDrivableSurfaceToTireFrictionPairs instance are + serialized to a PxCollection. + \param[in] frictionTable is the PxVehicleDrivableSurfaceToTireFrictionPairs instance to be serialized. + \param[in] materialIds are unique ids that will be used to add the materials to the collection. + \param[in] nbMaterialIds is the length of the materialIds array. It must be sufficient to cover all materials. + \param[out] collection is the PxCollection instance that is to be used to serialize the PxMaterial instances referenced by the + PxVehicleDrivableSurfaceToTireFrictionPairs instance. + \param[out] stream contains the memory block for the binary serialized friction table. + \note If a material has already been added to the collection with a PxSerialObjectId, it will not be added again. + \note If all materials have already been added to the collection with a PxSerialObjectId, it is legal to pass a NULL ptr for the materialIds array. + \note frictionTable references PxMaterial instances, which are serialized using PxCollection. + The PxCollection instance may be used to serialize an entire scene that also references some or none of those material instances + or particular objects in a scene or nothing at all. The complementary deserialize() function requires the same collection instance + or more typically a deserialized copy of the collection to be passed as a function argument. + @see deserializeFromBinary + */ + static void serializeToBinary(const PxVehicleDrivableSurfaceToTireFrictionPairs& frictionTable, const PxSerialObjectId* materialIds, const PxU32 nbMaterialIds, PxCollection* collection, PxOutputStream& stream); + + /** + \brief Deserialize from a memory block to create a PxVehicleDrivableSurfaceToTireFrictionPairs instance. + \param[in] collection contains the PxMaterial instances that will be referenced by the friction table. + \param[in] memBlock is a binary array that may be retrieved or copied from the stream in the complementary serializeToBinary function. + \return A PxVehicleDrivableSurfaceToTireFrictionPairs instance whose base address is equal to the memBlock ptr. + @see serializeToBinary + */ + static PxVehicleDrivableSurfaceToTireFrictionPairs* deserializeFromBinary(const PxCollection& collection, void* memBlock); private: @@ -173,6 +227,11 @@ private: */ PxVehicleDrivableSurfaceType* mDrivableSurfaceTypes; + /** + \brief A PxSerialObjectId per surface type used internally for serialization. + */ + PxSerialObjectId* mMaterialSerialIds; + /** \brief Number of different driving surface types. @@ -203,13 +262,6 @@ private: */ PxU32 mMaxNbTireTypes; - -#if !PX_P64_FAMILY - PxU32 mPad[1]; -#else - PxU32 mPad[2]; -#endif - PxVehicleDrivableSurfaceToTireFrictionPairs(){} ~PxVehicleDrivableSurfaceToTireFrictionPairs(){} }; @@ -219,5 +271,4 @@ PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleDrivableSurfaceToTireFrictionPairs) & } // namespace physx #endif -/** @} */ -#endif //PX_VEHICLE_TIREFRICTION_H +#endif diff --git a/Source/ThirdParty/PhysX/vehicle/PxVehicleUpdate.h b/Source/ThirdParty/PhysX/vehicle/PxVehicleUpdate.h index 40306fdcd..ae6bc5078 100644 --- a/Source/ThirdParty/PhysX/vehicle/PxVehicleUpdate.h +++ b/Source/ThirdParty/PhysX/vehicle/PxVehicleUpdate.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,40 +22,37 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. #ifndef PX_VEHICLE_UPDATE_H #define PX_VEHICLE_UPDATE_H -/** \addtogroup vehicle - @{ -*/ #include "vehicle/PxVehicleSDK.h" #include "vehicle/PxVehicleTireFriction.h" #include "foundation/PxSimpleTypes.h" #include "foundation/PxMemory.h" #include "foundation/PxTransform.h" -#include "PxBatchQueryDesc.h" +#include "PxQueryFiltering.h" #if !PX_DOXYGEN namespace physx { #endif - class PxBatchQuery; class PxContactModifyPair; class PxVehicleWheels; class PxVehicleDrivableSurfaceToTireFrictionPairs; class PxVehicleTelemetryData; + class PxBatchQueryExt; /** \brief Structure containing data describing the non-persistent state of each suspension/wheel/tire unit. This structure is filled out in PxVehicleUpdates and PxVehicleUpdateSingleVehicleAndStoreTelemetryData @see PxVehicleUpdates, PxVehicleUpdateSingleVehicleAndStoreTelemetryData */ - struct PxWheelQueryResult + struct PX_DEPRECATED PxWheelQueryResult { PxWheelQueryResult() { @@ -220,7 +216,7 @@ namespace physx PxTransform localPose; }; - struct PxVehicleWheelQueryResult + struct PX_DEPRECATED PxVehicleWheelQueryResult { /** \brief Pointer to an PxWheelQueryResult buffer of length nbWheelQueryResults @@ -240,12 +236,12 @@ namespace physx }; /** - \brief Structure containing data that is computed for a wheel during concurrent calls to PxVehicleUpdates - but which cannot be safely concurrently applied. + \brief Structure containing data that is computed for a wheel during concurrent calls to PxVehicleUpdates or + PxVehicleUpdateSingleVehicleAndStoreTelemetryData but which cannot be safely concurrently applied. - @see PxVehicleUpdates, PxVehiclePostUpdates, PxVehicleConcurrentUpdate + @see PxVehicleUpdates, PxVehicleUpdateSingleVehicleAndStoreTelemetryData, PxVehiclePostUpdates, PxVehicleConcurrentUpdate */ - struct PxVehicleWheelConcurrentUpdateData + struct PX_DEPRECATED PxVehicleWheelConcurrentUpdateData { friend class PxVehicleUpdate; @@ -266,13 +262,13 @@ namespace physx }; /** - \brief Structure containing data that is computed for a vehicle and its wheels during concurrent calls to PxVehicleUpdates - but which cannot be safely concurrently applied. + \brief Structure containing data that is computed for a vehicle and its wheels during concurrent calls to PxVehicleUpdates or + PxVehicleUpdateSingleVehicleAndStoreTelemetryData but which cannot be safely concurrently applied. - @see PxVehicleUpdates, PxVehiclePostUpdates, PxVehicleWheelConcurrentUpdateData + @see PxVehicleUpdates, PxVehicleUpdateSingleVehicleAndStoreTelemetryData, PxVehiclePostUpdates, PxVehicleWheelConcurrentUpdateData */ - struct PxVehicleConcurrentUpdateData + struct PX_DEPRECATED PxVehicleConcurrentUpdateData { friend class PxVehicleUpdate; @@ -311,21 +307,18 @@ namespace physx /** \brief Perform raycasts for all suspension lines for all vehicles. - \param[in] batchQuery is a PxBatchQuery instance used to specify shader data and functions for the raycast scene queries. + \param[in] batchQuery is a PxBatchQueryExt instance used to specify shader data and functions for the raycast scene queries. \param[in] nbVehicles is the number of vehicles in the vehicles array. \param[in] vehicles is an array of all vehicles that are to have a raycast issued from each wheel. - \param[in] nbSceneQueryResults must be greater than or equal to the total number of wheels of all the vehicles in the vehicles array; that is, - sceneQueryResults must have dimensions large enough for one raycast hit result per wheel for all the vehicles in the vehicles array. - - \param[in] sceneQueryResults must persist without being overwritten until the end of the next PxVehicleUpdates call. - \param[in] vehiclesToRaycast is an array of bools of length nbVehicles that is used to decide if raycasts will be performed for the corresponding vehicle in the vehicles array. If vehiclesToRaycast[i] is true then suspension line raycasts will be performed for vehicles[i]. If vehiclesToRaycast[i] is false then suspension line raycasts will not be performed for vehicles[i]. + \param[in] queryFlags filter flags for the batched scene queries + \note If vehiclesToRaycast is NULL then raycasts are performed for all vehicles in the vehicles array. \note If vehiclesToRaycast[i] is false then the vehicle stored in vehicles[i] will automatically use the raycast or sweep hit planes recorded by the most recent @@ -344,28 +337,23 @@ namespace physx \note Only blocking hits are supported (PxQueryHitType::eBLOCK). @see PxVehicleDrive4W::setToRestState, PxVehicleDriveNW::setToRestState, PxVehicleDriveTank::setToRestState, PxVehicleNoDrive::setToRestState - */ - void PxVehicleSuspensionRaycasts - (PxBatchQuery* batchQuery, - const PxU32 nbVehicles, PxVehicleWheels** vehicles, - const PxU32 nbSceneQueryResults, PxRaycastQueryResult* sceneQueryResults, - const bool* vehiclesToRaycast = NULL); + @see PxBatchQueryExt::raycast + */ + PX_DEPRECATED void PxVehicleSuspensionRaycasts( PxBatchQueryExt* batchQuery, + const PxU32 nbVehicles, PxVehicleWheels** vehicles, + const bool* vehiclesToRaycast = NULL, + const PxQueryFlags queryFlags = PxQueryFlag::eSTATIC | PxQueryFlag::eDYNAMIC | PxQueryFlag::ePREFILTER); /** \brief Perform sweeps for all suspension lines for all vehicles. - \param[in] batchQuery is a PxBatchQuery instance used to specify shader data and functions for the sweep scene queries. + \param[in] batchQuery is a PxBatchQueryExt instance used to specify shader data and functions for the sweep scene queries. \param[in] nbVehicles is the number of vehicles in the vehicles array. \param[in] vehicles is an array of all vehicles that are to have a sweep issued from each wheel. - \param[in] nbSceneQueryResults must be greater than or equal to the total number of wheels of all the vehicles in the vehicles array; that is, - sceneQueryResults must have dimensions large enough for one sweep hit result per wheel for all the vehicles in the vehicles array. - - \param[in] sceneQueryResults must persist without being overwritten until the end of the next PxVehicleUpdates call. - \param[in] nbHitsPerQuery is the maximum numbers of hits that will be returned for each query. \param[in] vehiclesToSweep is an array of bools of length nbVehicles that is used to decide if sweeps will be performed for the corresponding vehicle @@ -374,7 +362,14 @@ namespace physx \param[in] sweepWidthScale scales the geometry of the wheel used in the sweep. Values < 1 result in a thinner swept wheel, while values > 1 result in a fatter swept wheel. - \param[in] sweepRadiusScale scales the geometry of the wheel used in the sweep. Values < 1 result in a larger swept wheel, while values > 1 result in a smaller swept wheel. + \param[in] sweepRadiusScale scales the geometry of the wheel used in the sweep. Values < 1 result in a smaller swept wheel, while values > 1 result in a larger swept wheel. + + \param[in] sweepInflation Inflation parameter for sweeps. This is the inflation parameter from PxScene::sweep(). It inflates the shape and makes it rounder, + which gives smoother and more reliable normals. + + \param[in] queryFlags filter flags for the batched scene queries + + \param[in] context the vehicle context to use for the suspension sweeps. \note If vehiclesToSweep is NULL then sweeps are performed for all vehicles in the vehicles array. @@ -403,16 +398,17 @@ namespace physx @see PxVehicleDrive4W::setToRestState, PxVehicleDriveNW::setToRestState, PxVehicleDriveTank::setToRestState, PxVehicleNoDrive::setToRestState - @see PxBatchQuery::sweep + @see PxBatchQueryExt::sweep PxScene::sweep() @see PxVehicleSetSweepHitRejectionAngles */ - void PxVehicleSuspensionSweeps - (PxBatchQuery* batchQuery, - const PxU32 nbVehicles, PxVehicleWheels** vehicles, - const PxU32 nbSceneQueryResults, PxSweepQueryResult* sceneQueryResults, const PxU16 nbHitsPerQuery, - const bool* vehiclesToSweep = NULL, - const PxF32 sweepWidthScale = 1.0f, const PxF32 sweepRadiusScale = 1.0f); + PX_DEPRECATED void PxVehicleSuspensionSweeps( PxBatchQueryExt* batchQuery, + const PxU32 nbVehicles, PxVehicleWheels** vehicles, + const PxU16 nbHitsPerQuery, + const bool* vehiclesToSweep = NULL, + const PxF32 sweepWidthScale = 1.0f, const PxF32 sweepRadiusScale = 1.0f, const PxF32 sweepInflation = 0.0f, + const PxQueryFlags queryFlags = PxQueryFlag::eSTATIC | PxQueryFlag::eDYNAMIC | PxQueryFlag::ePREFILTER, + const PxVehicleContext& context = PxVehicleGetDefaultContext()); /** \brief A function called from PxContactModifyCallback::onContactModify. The function determines if rigid body contact points @@ -435,7 +431,9 @@ namespace physx \param[in,out] contactModifyPair describes the set of contacts involving the PxShape of the specified wheel and one other shape. The contacts in the contact set are ignored or modified as required. - \note[in] Contact points are accepted or rejected using the threshold angles specified in the function PxVehicleSetSweepHitRejectionAngles. + \param[in] context the vehicle context to use for the contact modification. + + \note Contact points are accepted or rejected using the threshold angles specified in the function PxVehicleSetSweepHitRejectionAngles. \note If a contact point is not rejected it is modified to account for the wheel rotation speed. @@ -444,12 +442,13 @@ namespace physx \note Reduce maxImpulse if the wheels are frequently colliding with light objects with mass much less than the vehicle's mass. Reducing this value encourages numerical stability. - @see PxContactModifyCallback::onContactModify, PxVehicleSetSweepHitRejectionAngles + @see PxContactModifyCallback::onContactModify, PxVehicleSetSweepHitRejectionAngles, PxVehicleContext */ - PxU32 PxVehicleModifyWheelContacts + PX_DEPRECATED PxU32 PxVehicleModifyWheelContacts (const PxVehicleWheels& vehicle, const PxU32 wheelId, const PxF32 wheelTangentVelocityMultiplier, const PxReal maxImpulse, - PxContactModifyPair& contactModifyPair); + PxContactModifyPair& contactModifyPair, + const PxVehicleContext& context = PxVehicleGetDefaultContext()); /** @@ -472,16 +471,18 @@ namespace physx \param[out] vehicleWheelQueryResults is an array of length nbVehicles storing the wheel query results of each corresponding vehicle and wheel in the vehicles array. A NULL pointer is permitted. - \param[out] vehicleConcurrentUpdates is an array of length nbVehicles. It is only necessary to specify vehicleConcurrentUpdates if PxVehicleUpdates is - called concurrently. The element vehicleWheelQueryResults[i] of the array stores data that is computed for vehicle[i] during PxVehicleUpdates but which - cannot be safely written when concurrently called. The data computed and stored in vehicleConcurrentUpdates must be passed to PxVehiclePostUpdates, where - it is applied to all relevant actors in sequence. A NULL pointer is permitted. + \param[out] vehicleConcurrentUpdates is an array of length nbVehicles. It is only necessary to specify vehicleConcurrentUpdates if PxVehicleUpdates is + called concurrently (also concurrently with PxVehicleUpdateSingleVehicleAndStoreTelemetryData). The element vehicleConcurrentUpdates[i] of the array + stores data that is computed for vehicle[i] during PxVehicleUpdates but which cannot be safely written when concurrently called. The data computed and + stored in vehicleConcurrentUpdates must be passed to PxVehiclePostUpdates, where it is applied to all relevant actors in sequence. A NULL pointer is permitted. + + \param[in] context the vehicle context to use for the vehicle update. \note The vehicleWheelQueryResults buffer must persist until the end of PxVehicleUpdates. \note The vehicleWheelQueryResults buffer is left unmodified for vehicles with sleeping rigid bodies whose control inputs indicate they should remain inert. - \note If PxVehicleUpdates is called concurrently then vehicleConcurrentUpdates must be specified. Do not specify vehicleConcurrentUpdates is PxVehicleUpdates + \note If PxVehicleUpdates is called concurrently then vehicleConcurrentUpdates must be specified. Do not specify vehicleConcurrentUpdates if PxVehicleUpdates is not called concurrently. \note The vehicleConcurrentUpdates buffer must persist until the end of PxVehiclePostUpdate. @@ -490,32 +491,38 @@ namespace physx with a PxShape (PxVehicleWheelsSimData::setWheelShapeMapping); the differential of the vehicle must be configured so that no drive torque is delivered to a disabled wheel; and the wheel must have zero rotation speed (PxVehicleWheelsDynData::setWheelRotationSpeed) - \note PxVehicleUpdates may be called concurrently provided all concurrent calls to PxVehicleUpdates involve only vehicles in the scene specified by PxVehicleUpdateSetScene. - PxVehicleUpdates must never run concurrently with PxVehicleUpdateSingleVehicleAndStoreTelemetryData. + \note Concurrent calls to PxVehicleUpdates and PxVehicleUpdateSingleVehicleAndStoreTelemetryData are permitted if the parameter + vehicleConcurrentUpdates is used. @see PxVehicleSetUpdateMode, PxVehicleWheelsSimData::disableWheel, PxVehicleWheelsSimData::setWheelShapeMapping, PxVehicleWheelsDynData::setWheelRotationSpeed, PxVehiclePostUpdates */ - void PxVehicleUpdates( + PX_DEPRECATED void PxVehicleUpdates( const PxReal timestep, const PxVec3& gravity, const PxVehicleDrivableSurfaceToTireFrictionPairs& vehicleDrivableSurfaceToTireFrictionPairs, - const PxU32 nbVehicles, PxVehicleWheels** vehicles, PxVehicleWheelQueryResult* vehicleWheelQueryResults, PxVehicleConcurrentUpdateData* vehicleConcurrentUpdates = NULL); + const PxU32 nbVehicles, PxVehicleWheels** vehicles, PxVehicleWheelQueryResult* vehicleWheelQueryResults, PxVehicleConcurrentUpdateData* vehicleConcurrentUpdates = NULL, + const PxVehicleContext& context = PxVehicleGetDefaultContext()); /** - \brief Apply actor changes that were computed in concurrent calls to PxVehicleUpdates but which could not be safely applied due to the concurrency. + \brief Apply actor changes that were computed in concurrent calls to PxVehicleUpdates or PxVehicleUpdateSingleVehicleAndStoreTelemetryData but + which could not be safely applied due to the concurrency. \param[in] vehicleConcurrentUpdates is an array of length nbVehicles where vehicleConcurrentUpdates[i] contains data describing actor changes that - were computed for vehicles[i] during concurrent calls to PxVehicleUpdates. + were computed for vehicles[i] during concurrent calls to PxVehicleUpdates or PxVehicleUpdateSingleVehicleAndStoreTelemetryData. \param[in] nbVehicles is the number of vehicles pointers in the vehicles array - \param[in,out] vehicles is an array of length nbVehicles containing all vehicles that were partially updated in concurrent calls to PxVehicleUpdates. + \param[in,out] vehicles is an array of length nbVehicles containing all vehicles that were partially updated in concurrent calls to PxVehicleUpdates or + PxVehicleUpdateSingleVehicleAndStoreTelemetryData. - @see PxVehicleUpdates + \param[in] context the vehicle context to use for the vehicle post update. + + @see PxVehicleUpdates, PxVehicleUpdateSingleVehicleAndStoreTelemetryData */ - void PxVehiclePostUpdates( - const PxVehicleConcurrentUpdateData* vehicleConcurrentUpdates, const PxU32 nbVehicles, PxVehicleWheels** vehicles); + PX_DEPRECATED void PxVehiclePostUpdates( + const PxVehicleConcurrentUpdateData* vehicleConcurrentUpdates, const PxU32 nbVehicles, PxVehicleWheels** vehicles, + const PxVehicleContext& context = PxVehicleGetDefaultContext()); /** @@ -534,7 +541,7 @@ namespace physx \param[in,out] vehicles is an array of all vehicles that should be updated to map to the new scene origin. */ - void PxVehicleShiftOrigin(const PxVec3& shift, const PxU32 nbVehicles, PxVehicleWheels** vehicles); + PX_DEPRECATED void PxVehicleShiftOrigin(const PxVec3& shift, const PxU32 nbVehicles, PxVehicleWheels** vehicles); #if PX_DEBUG_VEHICLE_ON /** @@ -558,24 +565,34 @@ namespace physx \param[out] telemetryData is the data structure used to record telemetry data during the update for later query or visualization - \note The vehicleWheelQueryResults buffer must persist until the end of PxVehicleUpdates + \param[out] vehicleConcurrentUpdates is an array of length 1. It is only necessary to specify vehicleConcurrentUpdates if + PxVehicleUpdateSingleVehicleAndStoreTelemetryData is called concurrently (also concurrently with PxVehicleUpdates). The + PxVehicleConcurrentUpdateData struct stores data that cannot be safely written when concurrently called. The data computed and + stored in vehicleConcurrentUpdates must be passed to PxVehiclePostUpdates, where it is applied to the vehicle actor. A NULL + pointer is permitted. + + \param[in] context the vehicle context to use for the vehicle update. + + \note The vehicleWheelQueryResults buffer must persist until the end of PxVehicleUpdateSingleVehicleAndStoreTelemetryData \note The vehicleWheelQueryResults buffer is left unmodified for vehicles with sleeping rigid bodies whose control inputs indicate they should remain inert. - \note PxVehicleUpdateSingleVehicleAndStoreTelemetryData is not thread-safe. As a consequence, it must run sequentially and never concurrently with PxVehicleUpdates + \note Concurrent calls to PxVehicleUpdateSingleVehicleAndStoreTelemetryData and PxVehicleUpdates are permitted if the parameter + vehicleConcurrentUpdates is used. - @see PxVehicleSetUpdateMode, PxVehicleTelemetryData + @see PxVehiclePostUpdates, PxVehicleSetUpdateMode, PxVehicleTelemetryData */ - void PxVehicleUpdateSingleVehicleAndStoreTelemetryData + PX_DEPRECATED void PxVehicleUpdateSingleVehicleAndStoreTelemetryData (const PxReal timestep, const PxVec3& gravity, const PxVehicleDrivableSurfaceToTireFrictionPairs& vehicleDrivableSurfaceToTireFrictionPairs, PxVehicleWheels* focusVehicle, PxVehicleWheelQueryResult* vehicleWheelQueryResults, - PxVehicleTelemetryData& telemetryData); + PxVehicleTelemetryData& telemetryData, + PxVehicleConcurrentUpdateData* vehicleConcurrentUpdates = NULL, + const PxVehicleContext& context = PxVehicleGetDefaultContext()); #endif #if !PX_DOXYGEN } // namespace physx #endif -/** @} */ -#endif //PX_VEHICLE_UPDATE_H +#endif diff --git a/Source/ThirdParty/PhysX/vehicle/PxVehicleUtil.h b/Source/ThirdParty/PhysX/vehicle/PxVehicleUtil.h index b2bfd2d25..3eea356cd 100644 --- a/Source/ThirdParty/PhysX/vehicle/PxVehicleUtil.h +++ b/Source/ThirdParty/PhysX/vehicle/PxVehicleUtil.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,15 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_VEHICLE_UTILHELPER_H -#define PX_VEHICLE_UTILHELPER_H -/** \addtogroup vehicle - @{ -*/ +#ifndef PX_VEHICLE_UTIL_H +#define PX_VEHICLE_UTIL_H #include "foundation/Px.h" @@ -54,11 +50,10 @@ that wheels disabled more recently than the last call to PxVehicleUpdates report \return True if the vehicle is in the air, false if any wheel is touching the ground. */ -bool PxVehicleIsInAir(const PxVehicleWheelQueryResult& vehWheelQueryResults); +PX_DEPRECATED bool PxVehicleIsInAir(const PxVehicleWheelQueryResult& vehWheelQueryResults); #if !PX_DOXYGEN } // namespace physx #endif -/** @} */ -#endif //PX_VEHICLE_UTILHELPER_H +#endif diff --git a/Source/ThirdParty/PhysX/vehicle/PxVehicleUtilControl.h b/Source/ThirdParty/PhysX/vehicle/PxVehicleUtilControl.h index 62a86cff5..3a6361ece 100644 --- a/Source/ThirdParty/PhysX/vehicle/PxVehicleUtilControl.h +++ b/Source/ThirdParty/PhysX/vehicle/PxVehicleUtilControl.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,15 +22,13 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_VEHICLE_CONTROL_H -#define PX_VEHICLE_CONTROL_H -/** \addtogroup vehicle - @{ -*/ +#ifndef PX_VEHICLE_UTIL_CONTROL_H +#define PX_VEHICLE_UTIL_CONTROL_H + #include "vehicle/PxVehicleSDK.h" #include "vehicle/PxVehicleDrive4W.h" #include "vehicle/PxVehicleDriveNW.h" @@ -47,14 +44,41 @@ namespace physx void testValidAnalogValue(const PxF32 actualValue, const PxF32 minVal, const PxF32 maxVal, const char* errorString); #endif +/** +\brief Used to produce smooth steering values in the presence of discontinuities when a vehicle e.g. lands on the ground. +Use a zero sharpness value to disable the feature (backward compatibility with previous PhysX versions). +*/ +struct PX_DEPRECATED PxVehicleSteerFilter +{ + PxVehicleSteerFilter(float sharpness=0.0f) : mSharpness(sharpness), mFilteredMaxSteer(0.0f) {} + + static PX_FORCE_INLINE float feedbackFilter(float val, float& memory, float sharpness) + { + if(sharpness<0.0f) sharpness = 0.0f; + else if(sharpness>1.0f) sharpness = 1.0f; + return memory = val * sharpness + memory * (1.0f - sharpness); + } + + PX_FORCE_INLINE float computeMaxSteer(const bool isVehicleInAir, const PxFixedSizeLookupTable<8>& steerVsForwardSpeedTable, + const PxF32 vzAbs, const PxF32 timestep) const + { + const PxF32 targetMaxSteer = (isVehicleInAir ? 1.0f : steerVsForwardSpeedTable.getYVal(vzAbs)); + if(mSharpness==0.0f) + return targetMaxSteer; + else + return feedbackFilter(targetMaxSteer, mFilteredMaxSteer, mSharpness*timestep); + } + + PxReal mSharpness; + mutable PxReal mFilteredMaxSteer; +}; + /** \brief Used to produce smooth vehicle driving control values from key inputs. @see PxVehicle4WSmoothDigitalRawInputsAndSetAnalogInputs, PxVehicle4WSmoothAnalogRawInputsAndSetAnalogInputs */ -struct PxVehicleKeySmoothingData +struct PX_DEPRECATED PxVehicleKeySmoothingData { -public: - /** \brief Rise rate of each analog value if digital value is 1 */ @@ -71,10 +95,8 @@ PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleKeySmoothingData)& 0x0f)); \brief Used to produce smooth analog vehicle control values from analog inputs. @see PxVehicleDrive4WSmoothDigitalRawInputsAndSetAnalogInputs, PxVehicleDrive4WSmoothAnalogRawInputsAndSetAnalogInputs */ -struct PxVehiclePadSmoothingData +struct PX_DEPRECATED PxVehiclePadSmoothingData { -public: - /** \brief Rise rate of each analog value from previous value towards target if target>previous */ @@ -91,7 +113,7 @@ PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehiclePadSmoothingData)& 0x0f)); \brief Used to produce smooth vehicle driving control values from analog and digital inputs. @see PxVehicleDrive4WSmoothDigitalRawInputsAndSetAnalogInputs, PxVehicleDrive4WSmoothAnalogRawInputsAndSetAnalogInputs */ -class PxVehicleDrive4WRawInputData +class PX_DEPRECATED PxVehicleDrive4WRawInputData { public: @@ -286,13 +308,14 @@ private: \param[in] timestep is the time that has passed since the last call to PxVehicleDrive4WSmoothDigitalRawInputsAndSetAnalogInputs \param[in] isVehicleInAir describes if the vehicle is in the air or on the ground and is used to decide whether or not to apply steerVsForwardSpeedTable. \param[in] focusVehicle is the vehicle that will be given analog and gearup/geardown control values arising from the digital inputs. + \param[in] steerFilter is an optional smoothing filter for the steering angle. + \param[in] forwardAxis The axis denoting the local space forward direction of the vehicle. */ -void PxVehicleDrive4WSmoothDigitalRawInputsAndSetAnalogInputs +PX_DEPRECATED void PxVehicleDrive4WSmoothDigitalRawInputsAndSetAnalogInputs (const PxVehicleKeySmoothingData& keySmoothing, const PxFixedSizeLookupTable<8>& steerVsForwardSpeedTable, - const PxVehicleDrive4WRawInputData& rawInputData, - const PxReal timestep, - const bool isVehicleInAir, - PxVehicleDrive4W& focusVehicle); + const PxVehicleDrive4WRawInputData& rawInputData, const PxReal timestep, const bool isVehicleInAir, + PxVehicleDrive4W& focusVehicle, const PxVehicleSteerFilter& steerFilter = PxVehicleSteerFilter(), + const PxVec3& forwardAxis = PxVehicleGetDefaultContext().forwardAxis); /** \brief Used to smooth and set analog vehicle control values from analog inputs (gamepad). @@ -300,23 +323,24 @@ Also used to set boolean gearup, geardown values. \param[in] padSmoothing describes how quickly the control values applied to the vehicle blend from the current vehicle values towards the raw analog values from the gamepad. \param[in] steerVsForwardSpeedTable is a table of maximum allowed steer versus forward vehicle speed. \param[in] rawInputData is the state of all gamepad analog inputs that will be used control the vehicle. -\param[in] timestep is the time that has passed since the last call to PxVehicleDrive4WSmoothDigitalRawInputsAndSetAnalogInputs +\param[in] timestep is the time that has passed since the last call to PxVehicleDrive4WSmoothAnalogRawInputsAndSetAnalogInputs \param[in] isVehicleInAir describes if the vehicle is in the air or on the ground and is used to decide whether or not to apply steerVsForwardSpeedTable. \param[in] focusVehicle is the vehicle that will be given analog control values arising from the gamepad inputs. +\param[in] steerFilter is an optional smoothing filter for the steering angle. +\param[in] forwardAxis The axis denoting the local space forward direction of the vehicle. */ -void PxVehicleDrive4WSmoothAnalogRawInputsAndSetAnalogInputs +PX_DEPRECATED void PxVehicleDrive4WSmoothAnalogRawInputsAndSetAnalogInputs (const PxVehiclePadSmoothingData& padSmoothing, const PxFixedSizeLookupTable<8>& steerVsForwardSpeedTable, - const PxVehicleDrive4WRawInputData& rawInputData, - const PxReal timestep, - const bool isVehicleInAir, - PxVehicleDrive4W& focusVehicle); + const PxVehicleDrive4WRawInputData& rawInputData, const PxReal timestep, const bool isVehicleInAir, + PxVehicleDrive4W& focusVehicle, const PxVehicleSteerFilter& steerFilter = PxVehicleSteerFilter(), + const PxVec3& forwardAxis = PxVehicleGetDefaultContext().forwardAxis); /** \brief Used to produce smooth vehicle driving control values from analog and digital inputs. @see PxVehicleDriveNWSmoothDigitalRawInputsAndSetAnalogInputs, PxVehicleDriveNWSmoothAnalogRawInputsAndSetAnalogInputs */ -class PxVehicleDriveNWRawInputData : public PxVehicleDrive4WRawInputData +class PX_DEPRECATED PxVehicleDriveNWRawInputData : public PxVehicleDrive4WRawInputData { public: @@ -330,16 +354,17 @@ public: \param[in] keySmoothing describes the rise and fall rates of the corresponding analog values when keys are pressed on and off. \param[in] steerVsForwardSpeedTable is a table of maximum allowed steer versus forward vehicle speed. \param[in] rawInputData is the state of all digital inputs that control the vehicle. - \param[in] timestep is the time that has passed since the last call to PxVehicleDrive4WSmoothDigitalRawInputsAndSetAnalogInputs + \param[in] timestep is the time that has passed since the last call to PxVehicleDriveNWSmoothDigitalRawInputsAndSetAnalogInputs \param[in] isVehicleInAir describes if the vehicle is in the air or on the ground and is used to decide whether or not to apply steerVsForwardSpeedTable. \param[in] focusVehicle is the vehicle that will be given analog and gearup/geardown control values arising from the digital inputs. + \param[in] steerFilter is an optional smoothing filter for the steering angle. + \param[in] forwardAxis The axis denoting the local space forward direction of the vehicle. */ -void PxVehicleDriveNWSmoothDigitalRawInputsAndSetAnalogInputs +PX_DEPRECATED void PxVehicleDriveNWSmoothDigitalRawInputsAndSetAnalogInputs (const PxVehicleKeySmoothingData& keySmoothing, const PxFixedSizeLookupTable<8>& steerVsForwardSpeedTable, - const PxVehicleDriveNWRawInputData& rawInputData, - const PxReal timestep, - const bool isVehicleInAir, - PxVehicleDriveNW& focusVehicle); + const PxVehicleDriveNWRawInputData& rawInputData, const PxReal timestep, const bool isVehicleInAir, + PxVehicleDriveNW& focusVehicle, const PxVehicleSteerFilter& steerFilter = PxVehicleSteerFilter(), + const PxVec3& forwardAxis = PxVehicleGetDefaultContext().forwardAxis); /** \brief Used to smooth and set analog vehicle control values from analog inputs (gamepad). @@ -347,23 +372,24 @@ Also used to set boolean gearup, geardown values. \param[in] padSmoothing describes how quickly the control values applied to the vehicle blend from the current vehicle values towards the raw analog values from the gamepad. \param[in] steerVsForwardSpeedTable is a table of maximum allowed steer versus forward vehicle speed. \param[in] rawInputData is the state of all gamepad analog inputs that will be used control the vehicle. -\param[in] timestep is the time that has passed since the last call to PxVehicleDrive4WSmoothDigitalRawInputsAndSetAnalogInputs +\param[in] timestep is the time that has passed since the last call to PxVehicleDriveNWSmoothAnalogRawInputsAndSetAnalogInputs \param[in] isVehicleInAir describes if the vehicle is in the air or on the ground and is used to decide whether or not to apply steerVsForwardSpeedTable. \param[in] focusVehicle is the vehicle that will be given analog control values arising from the gamepad inputs. +\param[in] steerFilter is an optional smoothing filter for the steering angle. +\param[in] forwardAxis The axis denoting the local space forward direction of the vehicle. */ -void PxVehicleDriveNWSmoothAnalogRawInputsAndSetAnalogInputs +PX_DEPRECATED void PxVehicleDriveNWSmoothAnalogRawInputsAndSetAnalogInputs (const PxVehiclePadSmoothingData& padSmoothing, const PxFixedSizeLookupTable<8>& steerVsForwardSpeedTable, - const PxVehicleDriveNWRawInputData& rawInputData, - const PxReal timestep, - const bool isVehicleInAir, - PxVehicleDriveNW& focusVehicle); + const PxVehicleDriveNWRawInputData& rawInputData, const PxReal timestep, const bool isVehicleInAir, + PxVehicleDriveNW& focusVehicle, const PxVehicleSteerFilter& steerFilter = PxVehicleSteerFilter(), + const PxVec3& forwardAxis = PxVehicleGetDefaultContext().forwardAxis); /** \brief Used to produce smooth analog tank control values from analog and digital inputs. @see PxVehicleDriveTankSmoothDigitalRawInputsAndSetAnalogInputs, PxVehicleDriveTankSmoothAnalogRawInputsAndSetAnalogInputs */ -class PxVehicleDriveTankRawInputData +class PX_DEPRECATED PxVehicleDriveTankRawInputData { public: @@ -618,10 +644,10 @@ private: Also used to set boolean gearup, geardown values. \param[in] keySmoothing describes the rise and fall rates of the corresponding analog values when keys are pressed on and off. \param[in] rawInputData is the state of all digital inputs that control the vehicle. -\param[in] timestep is the time that has passed since the last call to PxVehicleDrive4WSmoothDigitalRawInputsAndSetAnalogInputs +\param[in] timestep is the time that has passed since the last call to PxVehicleDriveTankSmoothDigitalRawInputsAndSetAnalogInputs \param[in] focusVehicle is the vehicle that will be given analog and gearup/geardown control values arising from the digital inputs. */ -void PxVehicleDriveTankSmoothDigitalRawInputsAndSetAnalogInputs +PX_DEPRECATED void PxVehicleDriveTankSmoothDigitalRawInputsAndSetAnalogInputs (const PxVehicleKeySmoothingData& keySmoothing, const PxVehicleDriveTankRawInputData& rawInputData, const PxReal timestep, @@ -633,10 +659,10 @@ void PxVehicleDriveTankSmoothDigitalRawInputsAndSetAnalogInputs Also used to set boolean gearup, geardown values. \param[in] padSmoothing describes how quickly the control values applied to the vehicle blend from the current vehicle values towards the raw analog values from the gamepad. \param[in] rawInputData is the state of all gamepad analog inputs that will be used control the vehicle. -\param[in] timestep is the time that has passed since the last call to PxVehicleDrive4WSmoothDigitalRawInputsAndSetAnalogInputs +\param[in] timestep is the time that has passed since the last call to PxVehicleDriveTankSmoothAnalogRawInputsAndSetAnalogInputs \param[in] focusVehicle is the vehicle that will be given analog control values arising from the gamepad inputs. */ -void PxVehicleDriveTankSmoothAnalogRawInputsAndSetAnalogInputs +PX_DEPRECATED void PxVehicleDriveTankSmoothAnalogRawInputsAndSetAnalogInputs (const PxVehiclePadSmoothingData& padSmoothing, const PxVehicleDriveTankRawInputData& rawInputData, const PxReal timestep, @@ -647,5 +673,4 @@ void PxVehicleDriveTankSmoothAnalogRawInputsAndSetAnalogInputs } // namespace physx #endif -/** @} */ -#endif //PX_VEHICLE_CONTROL_H +#endif diff --git a/Source/ThirdParty/PhysX/vehicle/PxVehicleUtilSetup.h b/Source/ThirdParty/PhysX/vehicle/PxVehicleUtilSetup.h index d3d53a4b5..cbec49cf5 100644 --- a/Source/ThirdParty/PhysX/vehicle/PxVehicleUtilSetup.h +++ b/Source/ThirdParty/PhysX/vehicle/PxVehicleUtilSetup.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,15 +22,13 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_VEHICLE_UTILSSETUP_H -#define PX_VEHICLE_UTILSSETUP_H -/** \addtogroup vehicle - @{ -*/ +#ifndef PX_VEHICLE_UTIL_SETUP_H +#define PX_VEHICLE_UTIL_SETUP_H + #include "foundation/PxSimpleTypes.h" #include "vehicle/PxVehicleSDK.h" @@ -55,8 +52,10 @@ The suspension of the rear-right wheel is modified to support the entire mass of \param[in,out] wheelsSimData is the data describing the wheels/suspensions/tires of the vehicle. \param[in,out] wheelsDynData is the data describing the dynamic state of the wheels of the vehicle. \param[in,out] driveSimData is the data describing the drive model of the vehicle. +\param[in] context the vehicle context to use for the setup. */ -void PxVehicle4WEnable3WTadpoleMode(PxVehicleWheelsSimData& wheelsSimData, PxVehicleWheelsDynData& wheelsDynData, PxVehicleDriveSimData4W& driveSimData); +PX_DEPRECATED void PxVehicle4WEnable3WTadpoleMode(PxVehicleWheelsSimData& wheelsSimData, PxVehicleWheelsDynData& wheelsDynData, PxVehicleDriveSimData4W& driveSimData, + const PxVehicleContext& context = PxVehicleGetDefaultContext()); /** \brief Reconfigure a PxVehicle4W instance as a three-wheeled car with delta config (1 front wheel, 2 rear wheels) @@ -67,8 +66,10 @@ The suspension of the front-right wheel is modified to support the entire mass o \param[in,out] wheelsSimData is the data describing the wheels/suspensions/tires of the vehicle. \param[in,out] wheelsDynData is the data describing the dynamic state of the wheels of the vehicle. \param[in,out] driveSimData is the data describing the drive model of the vehicle. +\param[in] context the vehicle context to use for the setup. */ -void PxVehicle4WEnable3WDeltaMode(PxVehicleWheelsSimData& wheelsSimData, PxVehicleWheelsDynData& wheelsDynData, PxVehicleDriveSimData4W& driveSimData); +PX_DEPRECATED void PxVehicle4WEnable3WDeltaMode(PxVehicleWheelsSimData& wheelsSimData, PxVehicleWheelsDynData& wheelsDynData, PxVehicleDriveSimData4W& driveSimData, + const PxVehicleContext& context = PxVehicleGetDefaultContext()); /** \brief Compute the sprung masses of the suspension springs given (i) the number of sprung masses, @@ -87,7 +88,7 @@ a value of 1 corresponds to (0,-1,0) and a value of 2 corresponds to (0,0,-1). nbSprungMasses or greater. Each element in the sprungMasses array corresponds to the suspension located at the same array element in sprungMassCoordinates. The center of mass of the masses in sprungMasses with the coordinates in sprungMassCoordinates satisfy the specified centerOfMass. */ -void PxVehicleComputeSprungMasses(const PxU32 nbSprungMasses, const PxVec3* sprungMassCoordinates, const PxVec3& centreOfMass, const PxReal totalMass, const PxU32 gravityDirection, PxReal* sprungMasses); +PX_DEPRECATED void PxVehicleComputeSprungMasses(const PxU32 nbSprungMasses, const PxVec3* sprungMassCoordinates, const PxVec3& centreOfMass, const PxReal totalMass, const PxU32 gravityDirection, PxReal* sprungMasses); /** @@ -106,13 +107,13 @@ a value of 1 corresponds to (0,-1,0) and a value of 2 corresponds to (0,0,-1). \note The suspension sprung masses are updated so that the natural frequency and damping ratio of the springs are preserved. This involves altering the stiffness and damping rate of the suspension springs. */ -void PxVehicleUpdateCMassLocalPose(const PxTransform& oldCMassLocalPose, const PxTransform& newCMassLocalPose, const PxU32 gravityDirection, PxVehicleWheels* vehicle); +PX_DEPRECATED void PxVehicleUpdateCMassLocalPose(const PxTransform& oldCMassLocalPose, const PxTransform& newCMassLocalPose, const PxU32 gravityDirection, PxVehicleWheels* vehicle); /** \brief Used by PxVehicleCopyDynamicsData @see PxVehicleCopyDynamicsData */ -class PxVehicleCopyDynamicsMap +class PX_DEPRECATED PxVehicleCopyDynamicsMap { public: @@ -149,12 +150,11 @@ speed of all enabled src wheels. \note src and trg must be the same vehicle type. */ -void PxVehicleCopyDynamicsData(const PxVehicleCopyDynamicsMap& wheelMap, const PxVehicleWheels& src, PxVehicleWheels* trg); +PX_DEPRECATED void PxVehicleCopyDynamicsData(const PxVehicleCopyDynamicsMap& wheelMap, const PxVehicleWheels& src, PxVehicleWheels* trg); #if !PX_DOXYGEN } // namespace physx #endif -/** @} */ -#endif //PX_VEHICLE_UTILSSETUP_H +#endif diff --git a/Source/ThirdParty/PhysX/vehicle/PxVehicleUtilTelemetry.h b/Source/ThirdParty/PhysX/vehicle/PxVehicleUtilTelemetry.h index b32a30f93..936a95af2 100644 --- a/Source/ThirdParty/PhysX/vehicle/PxVehicleUtilTelemetry.h +++ b/Source/ThirdParty/PhysX/vehicle/PxVehicleUtilTelemetry.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,15 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PX_VEHICLE_UTILSTELEMETRY_H -#define PX_VEHICLE_UTILSTELEMETRY_H -/** \addtogroup vehicle - @{ -*/ +#ifndef PX_VEHICLE_UTIL_TELEMETRY_H +#define PX_VEHICLE_UTIL_TELEMETRY_H #include "vehicle/PxVehicleSDK.h" #include "foundation/PxSimpleTypes.h" @@ -44,7 +40,7 @@ namespace physx #if PX_DEBUG_VEHICLE_ON -class PxVehicleGraphDesc +class PX_DEPRECATED PxVehicleGraphDesc { friend class PxVehicleGraph; @@ -90,7 +86,7 @@ private: bool isValid() const; }; -struct PxVehicleGraphChannelDesc +struct PX_DEPRECATED PxVehicleGraphChannelDesc { public: @@ -134,7 +130,7 @@ private: bool isValid() const; }; -struct PxVehicleWheelGraphChannel +struct PX_DEPRECATED PxVehicleWheelGraphChannel { enum Enum { @@ -153,7 +149,7 @@ struct PxVehicleWheelGraphChannel }; }; -struct PxVehicleDriveGraphChannel +struct PX_DEPRECATED PxVehicleDriveGraphChannel { enum Enum { @@ -170,7 +166,7 @@ struct PxVehicleDriveGraphChannel }; }; -struct PxVehicleGraphType +struct PX_DEPRECATED PxVehicleGraphType { enum Enum { @@ -180,7 +176,7 @@ struct PxVehicleGraphType }; -class PxVehicleGraph +class PX_DEPRECATED PxVehicleGraph { public: @@ -246,6 +242,14 @@ public: */ PxF32 getLatestValue(const PxU32 channel) const ; + /** + \brief Get the raw data of a specific graph channel. + + \param[in] channel is the ID of the graph channel to get data from. + \param[out] values is the buffer to write the data to. Minimum required size is eMAX_NB_SAMPLES. + */ + void getRawData(const PxU32 channel, PxReal* values) const; + private: //Min and max of each sample. @@ -300,7 +304,7 @@ private: PX_COMPILE_TIME_ASSERT(PxU32(PxVehicleGraph::eMAX_NB_CHANNELS) >= PxU32(PxVehicleWheelGraphChannel::eMAX_NB_WHEEL_CHANNELS) && PxU32(PxVehicleGraph::eMAX_NB_CHANNELS) >= PxU32(PxVehicleDriveGraphChannel::eMAX_NB_DRIVE_CHANNELS)); PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleGraph) & 15)); -class PxVehicleTelemetryData +class PX_DEPRECATED PxVehicleTelemetryData { public: @@ -406,5 +410,4 @@ PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleTelemetryData) & 15)); } // namespace physx #endif -/** @} */ -#endif //PX_VEHICLE_UTILSTELEMETRY_H +#endif diff --git a/Source/ThirdParty/PhysX/vehicle/PxVehicleWheels.h b/Source/ThirdParty/PhysX/vehicle/PxVehicleWheels.h index 322701c43..4a000d82c 100644 --- a/Source/ThirdParty/PhysX/vehicle/PxVehicleWheels.h +++ b/Source/ThirdParty/PhysX/vehicle/PxVehicleWheels.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,16 +22,12 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. // Copyright (c) 2001-2004 NovodeX AG. All rights reserved. - #ifndef PX_VEHICLE_WHEELS_H #define PX_VEHICLE_WHEELS_H -/** \addtogroup vehicle - @{ -*/ #include "foundation/PxSimpleTypes.h" #include "vehicle/PxVehicleShaders.h" @@ -57,7 +52,7 @@ class PxMaterial; @see PxVehicleWheelsSimData::setFlags(), PxVehicleWheelsSimData::getFlags() */ -struct PxVehicleWheelsSimFlag +struct PX_DEPRECATED PxVehicleWheelsSimFlag { enum Enum { @@ -72,7 +67,49 @@ struct PxVehicleWheelsSimFlag this feature gives a slightly more realisitic behavior at the potential cost of more easily losing control when steering the vehicle. */ - eLIMIT_SUSPENSION_EXPANSION_VELOCITY = (1 << 0) + eLIMIT_SUSPENSION_EXPANSION_VELOCITY = (1 << 0), + + /** + \brief Disable internal cylinder-plane intersection test. + + By default the internal code runs a post-process on sweep results, approximating the wheel shape with a + cylinder and tweaking the sweep hit results accordingly. This can produce artefacts in certain cases, in + particular when the swept shape is very different from a cylinder - e.g. with swept spheres. This flag + tells the system to disable this internal test, and reuse the direct user-provided sweep results. + + The default code refines the sweep results in each substep. Enabling this flag makes the system partially + reuse the same sweep results over each substep, which could potentially create other artefacts. + */ + eDISABLE_INTERNAL_CYLINDER_PLANE_INTERSECTION_TEST = (1 << 1), + + /** + \brief Disable suspension force projection. + + By default the internal code modulates the suspension force with the contact normal, i.e. the more the contact + normal is aligned with the suspension direction, the bigger the force. This can create issues when using a + single blocking hit, whose unique contact normal sometimes does not accurately capture the reality of the + surrounding geometry. For example it can weaken the suspension force too much, which visually makes the wheel + move up and down against e.g. a kerb. Enabling this flag tells the system to disable the modulation of the + suspension force by the contact normal. + + The rationale is that a real tire has a deformed contact patch containing multiple normals, and even if some + of these normals are bent when colliding against a kerb, there would still be a large area of the contact patch + touching the ground, and getting normals aligned with the suspension. This is difficult to capture with simple + sweep results, especially with a single sweep hit whose normal is computed by a less than accurate algorithm + like GJK. Using this flag shortcuts these issues, which can improves the behavior when driving over kerbs or + small obstacles. + */ + eDISABLE_SUSPENSION_FORCE_PROJECTION = (1 << 2), + + /** + \brief Disable check for sprung mass values summing up to chassis mass. + + Generally, the sum of the suspension sprung mass values should match the chassis mass. However, there can be + scenarios where this is not necessarily desired. Taking a semi-trailer truck as an example, a large part of + the trailer mass will rest on the tractor unit and not the trailer wheels. This flag allows the user to set + the values as desired without error messages being sent. + */ + eDISABLE_SPRUNG_MASS_SUM_CHECK = (1 << 3) }; }; @@ -88,7 +125,7 @@ PX_FLAGS_OPERATORS(PxVehicleWheelsSimFlag::Enum, PxU32) \brief Data structure describing configuration data of a vehicle with up to 20 wheels. */ -class PxVehicleWheelsSimData +class PX_DEPRECATED PxVehicleWheelsSimData { //= ATTENTION! ===================================================================================== // Changing the data layout of this class breaks the binary serialization format. See comments for @@ -584,10 +621,23 @@ public: }; PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleWheelsSimData) & 15)); + +/** +\brief Description of the per wheel intersection method to be used by PxVehicleWheelsDynData::setTireContacts() +*/ +struct PX_DEPRECATED PxTireContactIntersectionMethod +{ + enum Enum + { + eRAY = 0, + eCYLINDER + }; +}; + /** \brief Data structure with instanced dynamics data for wheels */ -class PxVehicleWheelsDynData +class PX_DEPRECATED PxVehicleWheelsDynData { //= ATTENTION! ===================================================================================== // Changing the data layout of this class breaks the binary serialization format. See comments for @@ -674,6 +724,24 @@ public: */ void copy(const PxVehicleWheelsDynData& src, const PxU32 srcWheel, const PxU32 trgWheel); + /** + \brief Directly set tire contact plane and friction for all tires on the vehicle as an alternative to using PxVehicleSuspensionSweeps() or PxVehicleSuspensionRaycasts(). + \param[in] nbHits is an array describing whether each tire has a contact plane or not. Each element of the array is either 0 (no contact) or 1 (contact). + \param[in] contactPlanes is an array of contact planes describing the contact plane per tire. + \param[in] contactFrictions is the friction value of each tire contact with the drivable surface. + \param[in] intersectionMethods describes how each tire will individually interact with its contact plane in order to compute the spring + compression that places the tire on the contact plane. A value of eCYLINDER will compute the spring compression by intersecting the wheel's + cylindrical shape with the contact plane. A value of eRAY will compute the spring compression by casting a ray through the wheel center + and along the suspension direction until it hits the contact plane. + \param[in] nbWheels is the length of the arrays nbContacts, contactPlanes, contactFrictions and intersectionMethods. + \note Each contact plane (n, d) obeys the rule that all points P on the plane satisfy n.dot(P) + d = 0.0. + \note The contact planes specified by setTireContacts() will persist as driving surfaces until either the next call to setTireContacts() or the next call to + \note The friction values are scaled by PxVehicleTireData::mFrictionVsSlipGraph before being applied to the tire. + \note The vehicle model assumes that the tire contacts are with static objects. + PxVehicleSuspensionSweeps() or PxVehicleSuspensionRaycasts(). + */ + void setTireContacts(const PxU32* nbHits, const PxPlane* contactPlanes, const PxReal* contactFrictions, const PxTireContactIntersectionMethod::Enum* intersectionMethods, const PxU32 nbWheels); + private: /** @@ -723,6 +791,31 @@ public: PxU32 getNbWheelRotationAngle() const { return mNbActiveWheels; } PxVehicleWheels4DynData* getWheel4DynData() const { return mWheels4DynData; } //~serialization + + /** + \brief Retrieve the number of PxConstraint objects associated with the vehicle. + + You can use #getConstraints() to retrieve the constraint pointers. + + \return Number of constraints associated with this vehicle. + + @see PxConstraint getConstraints() + */ + PxU32 getNbConstraints() const { return mNbWheels4; } + + /** + \brief Retrieve all the PxConstraint objects associated with the vehicle. + + There is one PxConstraint per block of 4 wheels. The count can be extracted through #getNbConstraints() + + \param[out] userBuffer The buffer to store the constraint pointers. + \param[in] bufferSize Size of provided user buffer. + \param[in] startIndex Index of first constraint pointer to be retrieved + \return Number of constraint pointers written to the buffer. + + @see PxConstraint getNbConstraints() + */ + PxU32 getConstraints(PxConstraint** userBuffer, PxU32 bufferSize, PxU32 startIndex = 0) const; }; PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleWheelsDynData) & 15)); @@ -730,7 +823,7 @@ PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleWheelsDynData) & 15)); \brief Data structure with instanced dynamics data and configuration data of a vehicle with just wheels @see PxVehicleDrive, PxVehicleDrive4W, PxVehicleDriveTank */ -class PxVehicleWheels : public PxBase +class PX_DEPRECATED PxVehicleWheels : public PxBase { //= ATTENTION! ===================================================================================== // Changing the data layout of this class breaks the binary serialization format. See comments for @@ -761,15 +854,21 @@ public: /** \brief Compute the rigid body velocity component along the forward vector of the rigid body transform. + + \param[in] forwardAxis The axis denoting the local space forward direction of the vehicle. + @see PxVehicleSetBasisVectors */ - PxReal computeForwardSpeed() const; + PxReal computeForwardSpeed(const PxVec3& forwardAxis = PxVehicleGetDefaultContext().forwardAxis) const; /** \brief Compute the rigid body velocity component along the right vector of the rigid body transform. + + \param[in] sideAxis The axis denoting the local space side direction of the vehicle. + @see PxVehicleSetBasisVectors */ - PxReal computeSidewaysSpeed() const; + PxReal computeSidewaysSpeed(const PxVec3& sideAxis = PxVehicleGetDefaultContext().sideAxis) const; /** \brief Data describing the setup of all the wheels/suspensions/tires. @@ -844,7 +943,7 @@ protected: #if PX_P64_FAMILY PxU8 mPad0[14]; #else - PxU8 mPad0[14]; + PxU8 mPad0[8]; #endif //serialization @@ -870,5 +969,4 @@ PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleWheels) & 15)); } // namespace physx #endif -/** @} */ -#endif //PX_VEHICLE_WHEELS_H +#endif diff --git a/Source/ThirdParty/PhysX/vehicle2/PxVehicleAPI.h b/Source/ThirdParty/PhysX/vehicle2/PxVehicleAPI.h new file mode 100644 index 000000000..922a5f117 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/PxVehicleAPI.h @@ -0,0 +1,147 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "vehicle2/PxVehicleLimits.h" +#include "vehicle2/PxVehicleComponent.h" +#include "vehicle2/PxVehicleComponentSequence.h" +#include "vehicle2/PxVehicleParams.h" +#include "vehicle2/PxVehicleFunctions.h" +#include "vehicle2/PxVehicleMaths.h" + +#include "vehicle2/braking/PxVehicleBrakingParams.h" +#include "vehicle2/braking/PxVehicleBrakingFunctions.h" + +#include "vehicle2/commands/PxVehicleCommandParams.h" +#include "vehicle2/commands/PxVehicleCommandStates.h" +#include "vehicle2/commands/PxVehicleCommandHelpers.h" + +#include "vehicle2/drivetrain/PxVehicleDrivetrainParams.h" +#include "vehicle2/drivetrain/PxVehicleDrivetrainStates.h" +#include "vehicle2/drivetrain/PxVehicleDrivetrainHelpers.h" +#include "vehicle2/drivetrain/PxVehicleDrivetrainFunctions.h" +#include "vehicle2/drivetrain/PxVehicleDrivetrainComponents.h" + +#include "vehicle2/physxActor/PxVehiclePhysXActorStates.h" +#include "vehicle2/physxActor/PxVehiclePhysXActorHelpers.h" +#include "vehicle2/physxActor/PxVehiclePhysXActorFunctions.h" +#include "vehicle2/physxActor/PxVehiclePhysXActorComponents.h" + +#include "vehicle2/physxConstraints/PxVehiclePhysXConstraintParams.h" +#include "vehicle2/physxConstraints/PxVehiclePhysXConstraintStates.h" +#include "vehicle2/physxConstraints/PxVehiclePhysXConstraintHelpers.h" +#include "vehicle2/physxConstraints/PxVehiclePhysXConstraintFunctions.h" +#include "vehicle2/physxConstraints/PxVehiclePhysXConstraintComponents.h" + +#include "vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryState.h" +#include "vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryParams.h" +#include "vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryHelpers.h" +#include "vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryFunctions.h" +#include "vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryComponents.h" + +#include "vehicle2/pvd/PxVehiclePvdHelpers.h" +#include "vehicle2/pvd/PxVehiclePvdFunctions.h" +#include "vehicle2/pvd/PxVehiclePvdComponents.h" + +#include "vehicle2/rigidBody/PxVehicleRigidBodyParams.h" +#include "vehicle2/rigidBody/PxVehicleRigidBodyStates.h" +#include "vehicle2/rigidBody/PxVehicleRigidBodyFunctions.h" +#include "vehicle2/rigidBody/PxVehicleRigidBodyComponents.h" + +#include "vehicle2/roadGeometry/PxVehicleRoadGeometryState.h" + +#include "vehicle2/steering/PxVehicleSteeringParams.h" +#include "vehicle2/steering/PxVehicleSteeringFunctions.h" + +#include "vehicle2/suspension/PxVehicleSuspensionParams.h" +#include "vehicle2/suspension/PxVehicleSuspensionStates.h" +#include "vehicle2/suspension/PxVehicleSuspensionHelpers.h" +#include "vehicle2/suspension/PxVehicleSuspensionFunctions.h" +#include "vehicle2/suspension/PxVehicleSuspensionComponents.h" + +#include "vehicle2/tire/PxVehicleTireParams.h" +#include "vehicle2/tire/PxVehicleTireStates.h" +#include "vehicle2/tire/PxVehicleTireHelpers.h" +#include "vehicle2/tire/PxVehicleTireFunctions.h" +#include "vehicle2/tire/PxVehicleTireComponents.h" + +#include "vehicle2/wheel/PxVehicleWheelParams.h" +#include "vehicle2/wheel/PxVehicleWheelStates.h" +#include "vehicle2/wheel/PxVehicleWheelHelpers.h" +#include "vehicle2/wheel/PxVehicleWheelFunctions.h" +#include "vehicle2/wheel/PxVehicleWheelComponents.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + + /** \brief Initialize the PhysX Vehicle library. + + This should be called before calling any functions or methods in extensions which may require allocation. + \note This function does not need to be called before creating a PxDefaultAllocator object. + + \param foundation a PxFoundation object + + @see PxCloseVehicleExtension PxFoundation + */ + PX_FORCE_INLINE bool PxInitVehicleExtension(physx::PxFoundation& foundation) + { + PX_UNUSED(foundation); + PX_CHECK_AND_RETURN_VAL(&PxGetFoundation() == &foundation, "Supplied foundation must match the one that will be used to perform allocations", false); + PxIncFoundationRefCount(); + return true; + } + + /** \brief Shut down the PhysX Vehicle library. + + This function should be called to cleanly shut down the PhysX Vehicle library before application exit. + + \note This function is required to be called to release foundation usage. + + @see PxInitVehicleExtension + */ + PX_FORCE_INLINE void PxCloseVehicleExtension() + { + PxDecFoundationRefCount(); + } + + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/PxVehicleComponent.h b/Source/ThirdParty/PhysX/vehicle2/PxVehicleComponent.h new file mode 100644 index 000000000..0e2d5f813 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/PxVehicleComponent.h @@ -0,0 +1,70 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxSimpleTypes.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif +struct PxVehicleSimulationContext; + +class PxVehicleComponent +{ +public: + + virtual ~PxVehicleComponent() {} + + /** + \brief Update function for a vehicle component. + + \param[in] dt The timestep size to use for the update step. + \param[in] context Vehicle simulation context holding global data or data that usually applies to a + large group of vehicles. + \return True if subsequent components in a sequence should get updated, false if the sequence should + be aborted. + + @see PxVehicleComponentSequence + */ + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) = 0; + +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/PxVehicleComponentSequence.h b/Source/ThirdParty/PhysX/vehicle2/PxVehicleComponentSequence.h new file mode 100644 index 000000000..8ddb99a06 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/PxVehicleComponentSequence.h @@ -0,0 +1,326 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once +/** \addtogroup vehicle2 + @{ +*/ +#include "foundation/PxAssert.h" +#include "foundation/PxErrors.h" +#include "foundation/PxFoundation.h" +#include "PxVehicleComponent.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + + +struct PxVehicleComponentSequenceLimits +{ + enum Enum + { + eMAX_NB_SUBGROUPS = 16, + eMAX_NB_COMPONENTS = 64, + eMAX_NB_SUBGROUPELEMENTS = eMAX_NB_SUBGROUPS + eMAX_NB_COMPONENTS + }; +}; + +struct PxVehicleComponentSequence +{ + enum + { + eINVALID_SUBSTEP_GROUP = 0xff + }; + + PxVehicleComponentSequence() + : mNbComponents(0), mNbSubgroups(1), mNbSubGroupElements(0), mActiveSubgroup(0) + { + } + + /** + \brief Add a component to the sequence. + + \param[in] component The component to add to the sequence. + \return True on success, else false (for example due to component count limit being reached). + */ + PX_FORCE_INLINE bool add(PxVehicleComponent* component); + + /** + \brief Start a substepping group. + \note All components added using #add() will be added to the new substepping group until either the group + is marked as complete with a call to #endSubstepGroup() or a subsequent substepping group is started with + a call to #beginSubstepGroup(). + \note Groups can be nested with stacked calls to #beginSubstepGroup(). + \note Each group opened by #beginSubstepGroup() must be closed with a complementary #endSubstepGroup() prior to calling #update(). + \param[in] nbSubSteps is the number of substeps for the group's sequence. This can be changed with a call to #setSubsteps(). + \return Handle for the substepping group on success, else eINVALID_SUBSTEP_GROUP + @see setSubsteps() + @see endSubstepGroup() + */ + PX_FORCE_INLINE PxU8 beginSubstepGroup(const PxU8 nbSubSteps = 1); + + /** + \brief End a substepping group + \note The group most recently opened with #beginSubstepGroup() will be closed by this call. + @see setSubsteps() + @see beginSubstepGroup() + */ + PX_FORCE_INLINE void endSubstepGroup() + { + mActiveSubgroup = mSubGroups[mActiveSubgroup].parentGroup; + } + + /** + \brief Set the number of substeps to perform for a specific substepping group. + \param[in] subGroupHandle specifies the substepping group + \param[in] nbSteps is the number of times to invoke the sequence of components and groups in the specified substepping group. + @see beginSubstepGroup() + @see endSubstepGroup() + */ + void setSubsteps(const PxU8 subGroupHandle, const PxU8 nbSteps) + { + PX_ASSERT(subGroupHandle < mNbSubgroups); + mSubGroups[subGroupHandle].nbSteps = nbSteps; + } + + /** + \brief Update each component in the sequence. + + \note If the update method of a component in the sequence returns false, the update process gets aborted. + + \param[in] dt is the timestep of the update. The provided value has to be positive. + \param[in] context specifies global quantities of the simulation such as gravitational acceleration. + */ + void update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_ASSERT(0 == mActiveSubgroup); + + if (dt > 0.0f) + { + updateSubGroup(dt, context, 0, 1); + } + else + { + PxGetFoundation().error(PxErrorCode::eINVALID_PARAMETER, __FILE__, __LINE__, + "PxVehicleComponentSequence::update: The timestep must be positive!"); + } + } + +private: + enum + { + eINVALID_COMPONENT = 0xff, + eINVALID_SUB_GROUP_ELEMENT = 0xff + }; + + //Elements have the form of a linked list to allow traversal over a list of elements. + //Each element is either a single component or a subgroup. + struct SubGroupElement + { + SubGroupElement() + : childGroup(eINVALID_SUBSTEP_GROUP), + component(eINVALID_COMPONENT), + nextElement(eINVALID_SUB_GROUP_ELEMENT) + { + } + + PxU8 childGroup; + PxU8 component; + PxU8 nextElement; + }; + + //A group is a linked list of elements to be processed in sequence. + //Each group stores the first element in the sequence. + //Each element in the sequence stores the next element in the sequence + //to allow traversal over the list of elements in the group. + struct Group + { + Group() + : parentGroup(eINVALID_SUBSTEP_GROUP), + firstElement(eINVALID_SUB_GROUP_ELEMENT), + nbSteps(1) + { + } + PxU8 parentGroup; + PxU8 firstElement; + PxU8 nbSteps; + }; + + PxVehicleComponent* mComponents[PxVehicleComponentSequenceLimits::eMAX_NB_COMPONENTS]; + PxU8 mNbComponents; + + Group mSubGroups[PxVehicleComponentSequenceLimits::eMAX_NB_SUBGROUPS]; + PxU8 mNbSubgroups; + + SubGroupElement mSubGroupElements[PxVehicleComponentSequenceLimits::eMAX_NB_SUBGROUPELEMENTS]; + PxU8 mNbSubGroupElements; + + PxU8 mActiveSubgroup; + + bool updateSubGroup(const PxReal dt, const PxVehicleSimulationContext& context, const PxU8 groupId, const PxU8 parentSepMultiplier) + { + const PxU8 nbSteps = mSubGroups[groupId].nbSteps; + const PxU8 stepMultiplier = parentSepMultiplier * nbSteps; + const PxReal timestepForGroup = dt / PxReal(stepMultiplier); + for (PxU8 k = 0; k < nbSteps; k++) + { + PxU8 nextElement = mSubGroups[groupId].firstElement; + while (eINVALID_SUB_GROUP_ELEMENT != nextElement) + { + const SubGroupElement& e = mSubGroupElements[nextElement]; + PX_ASSERT(e.component != eINVALID_COMPONENT || e.childGroup != eINVALID_SUBSTEP_GROUP); + if (eINVALID_COMPONENT != e.component) + { + PxVehicleComponent* c = mComponents[e.component]; + if (!c->update(timestepForGroup, context)) + return false; + } + else + { + PX_ASSERT(eINVALID_SUBSTEP_GROUP != e.childGroup); + if (!updateSubGroup(dt, context, e.childGroup, stepMultiplier)) + return false; + } + nextElement = e.nextElement; + } + } + + return true; + } + + PxU8 getLastKnownElementInGroup(const PxU8 groupId) const + { + PxU8 currElement = mSubGroups[groupId].firstElement; + PxU8 nextElement = mSubGroups[groupId].firstElement; + while (nextElement != eINVALID_SUB_GROUP_ELEMENT) + { + currElement = nextElement; + nextElement = mSubGroupElements[nextElement].nextElement; + } + return currElement; + } +}; + + +bool PxVehicleComponentSequence::add(PxVehicleComponent* c) +{ + if (PxVehicleComponentSequenceLimits::eMAX_NB_COMPONENTS == mNbComponents) + return false; + if (PxVehicleComponentSequenceLimits::eMAX_NB_SUBGROUPELEMENTS == mNbSubGroupElements) + return false; + + //Create a new element and point it at the component. + SubGroupElement& nextElementInGroup = mSubGroupElements[mNbSubGroupElements]; + nextElementInGroup.childGroup = eINVALID_SUBSTEP_GROUP; + nextElementInGroup.component = mNbComponents; + nextElementInGroup.nextElement = eINVALID_SUB_GROUP_ELEMENT; + + if (eINVALID_SUB_GROUP_ELEMENT == mSubGroups[mActiveSubgroup].firstElement) + { + //The group is empty so add the first element to it. + //Point the group at the new element because this will + //be the first element in the group. + mSubGroups[mActiveSubgroup].firstElement = mNbSubGroupElements; + } + else + { + //We are extending the sequence of element of the group. + //Add the new element to the end of the group's sequence. + mSubGroupElements[getLastKnownElementInGroup(mActiveSubgroup)].nextElement = mNbSubGroupElements; + } + + //Increment the number of elements. + mNbSubGroupElements++; + + //Record the component and increment the number of components. + mComponents[mNbComponents] = c; + mNbComponents++; + + return true; +} + +PxU8 PxVehicleComponentSequence::beginSubstepGroup(const PxU8 nbSubSteps) +{ + if (mNbSubgroups == PxVehicleComponentSequenceLimits::eMAX_NB_SUBGROUPS) + return eINVALID_SUBSTEP_GROUP; + if (mNbSubGroupElements == PxVehicleComponentSequenceLimits::eMAX_NB_SUBGROUPELEMENTS) + return eINVALID_SUBSTEP_GROUP; + + //We have a parent and child group relationship. + const PxU8 parentGroup = mActiveSubgroup; + const PxU8 childGroup = mNbSubgroups; + + //Set up the child group. + mSubGroups[childGroup].parentGroup = parentGroup; + mSubGroups[childGroup].firstElement = eINVALID_SUB_GROUP_ELEMENT; + mSubGroups[childGroup].nbSteps = nbSubSteps; + + //Create a new element to add to the parent group and point it at the child group. + SubGroupElement& nextElementIInGroup = mSubGroupElements[mNbSubGroupElements]; + nextElementIInGroup.childGroup = childGroup; + nextElementIInGroup.nextElement = eINVALID_SUB_GROUP_ELEMENT; + nextElementIInGroup.component = eINVALID_COMPONENT; + + //Add the new element to the parent group. + if (eINVALID_SUB_GROUP_ELEMENT == mSubGroups[parentGroup].firstElement) + { + //The parent group is empty so add the first element to it. + //Point the parent group at the new element because this will + //be the first element in the group. + mSubGroups[parentGroup].firstElement = mNbSubGroupElements; + } + else + { + //We are extending the sequence of elements of the parent group. + //Add the new element to the end of the group's sequence. + mSubGroupElements[getLastKnownElementInGroup(parentGroup)].nextElement = mNbSubGroupElements; + } + + //Push the active group. + //All subsequent operations will now address the child group and we push or pop the group. + mActiveSubgroup = childGroup; + + //Increment the number of elements. + mNbSubGroupElements++; + + //Increment the number of groups. + mNbSubgroups++; + + //Return the group id. + return mActiveSubgroup; +} + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/PxVehicleFunctions.h b/Source/ThirdParty/PhysX/vehicle2/PxVehicleFunctions.h new file mode 100644 index 000000000..9cfafdc57 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/PxVehicleFunctions.h @@ -0,0 +1,199 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxTransform.h" +#include "foundation/PxMat33.h" +#include "foundation/PxSimpleTypes.h" +#include "PxRigidBody.h" +#include "PxVehicleParams.h" +#include "roadGeometry/PxVehicleRoadGeometryState.h" +#include "rigidBody/PxVehicleRigidBodyStates.h" +#include "physxRoadGeometry/PxVehiclePhysXRoadGeometryState.h" +#include "physxActor/PxVehiclePhysXActorStates.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif +PX_FORCE_INLINE PxVec3 PxVehicleTransformFrameToFrame +(const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVec3& v) +{ + PxVec3 result = v; + if ((srcFrame.lngAxis != trgFrame.lngAxis) || (srcFrame.latAxis != trgFrame.latAxis) || (srcFrame.vrtAxis != trgFrame.vrtAxis)) + { + const PxMat33 a = srcFrame.getFrame(); + const PxMat33 r = trgFrame.getFrame(); + result = (r * a.getTranspose() * v); + } + return result; +} + +PX_FORCE_INLINE PxVec3 PxVehicleTransformFrameToFrame +(const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, + const PxVehicleScale& srcScale, const PxVehicleScale& trgScale, + const PxVec3& v) +{ + PxVec3 result = PxVehicleTransformFrameToFrame(srcFrame, trgFrame, v); + if((srcScale.scale != trgScale.scale)) + result *= (trgScale.scale / srcScale.scale); + return result; +} + +PX_FORCE_INLINE PxTransform PxVehicleTransformFrameToFrame +(const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, + const PxVehicleScale& srcScale, const PxVehicleScale& trgScale, + const PxTransform& v) +{ + PxTransform result(PxVehicleTransformFrameToFrame(srcFrame, trgFrame, srcScale, trgScale, v.p), v.q); + if ((srcFrame.lngAxis != trgFrame.lngAxis) || (srcFrame.latAxis != trgFrame.latAxis) || (srcFrame.vrtAxis != trgFrame.vrtAxis)) + { + PxF32 angle; + PxVec3 axis; + v.q.toRadiansAndUnitAxis(angle, axis); + result.q = PxQuat(angle, PxVehicleTransformFrameToFrame(srcFrame, trgFrame, axis)); + } + return result; +} + +PX_FORCE_INLINE PxVec3 PxVehicleComputeTranslation(const PxVehicleFrame& frame, const PxReal lng, const PxReal lat, const PxReal vrt) +{ + const PxVec3 v = frame.getFrame()*PxVec3(lng, lat, vrt); + return v; +} + +PX_FORCE_INLINE PxQuat PxVehicleComputeRotation(const PxVehicleFrame& frame, const PxReal roll, const PxReal pitch, const PxReal yaw) +{ + const PxMat33 m = frame.getFrame(); + const PxVec3& lngAxis = m.column0; + const PxVec3& latAxis = m.column1; + const PxVec3& vrtAxis = m.column2; + const PxQuat quatPitch(pitch, latAxis); + const PxQuat quatRoll(roll, lngAxis); + const PxQuat quatYaw(yaw, vrtAxis); + const PxQuat result = quatYaw * quatRoll * quatPitch; + return result; +} + +PX_FORCE_INLINE PxF32 PxVehicleComputeSign(const PxReal f) +{ + return physx::intrinsics::fsel(f, physx::intrinsics::fsel(-f, 0.0f, 1.0f), -1.0f); +} + + +/** +\brief Shift the origin of a vehicle by the specified vector. + +Call this method to adjust the internal data structures of vehicles to reflect the shifted origin location +(the shift vector will get subtracted from all world space spatial data). + +\param[in] axleDesc is a description of the wheels on the vehicle. +\param[in] shift is the translation vector used to shift the origin. +\param[in] rigidBodyState stores the current position of the vehicle +\param[in] roadGeometryStates stores the hit plane under each wheel. +\param[in] physxActor stores the PxRigidActor that is the vehicle's PhysX representation. +\param[in] physxQueryStates stores the hit point of the most recent execution of PxVehiclePhysXRoadGeometryQueryUpdate() for each wheel. +\note It is the user's responsibility to keep track of the summed total origin shift and adjust all input/output to/from the vehicle accordingly. +\note This call will not automatically shift the PhysX scene and its objects. PxScene::shiftOrigin() must be called seperately to keep the systems in sync. +\note If there is no associated PxRigidActor then set physxActor to NULL. +\note If there is an associated PxRigidActor and it is already in a PxScene then the complementary call to PxScene::shiftOrigin() will take care of +shifting the associated PxRigidActor. This being the case, set physxActor to NULL. physxActor should be a non-NULL pointer only when there is an +associated PxRigidActor and it is not part of a PxScene. This can occur if the associated PxRigidActor is updated using PhysX immediate mode. +\note If scene queries are independent of PhysX geometry then set queryStates to NULL. +*/ +PX_FORCE_INLINE void PxVehicleShiftOrigin +(const PxVehicleAxleDescription& axleDesc, const PxVec3& shift, + PxVehicleRigidBodyState& rigidBodyState, PxVehicleRoadGeometryState* roadGeometryStates, + PxVehiclePhysXActor* physxActor = NULL, PxVehiclePhysXRoadGeometryQueryState* physxQueryStates = NULL) +{ + //Adjust the vehicle's internal pose. + rigidBodyState.pose.p -= shift; + + //Optionally adjust the PxRigidActor pose. + if (physxActor && !physxActor->rigidBody->getScene()) + { + const PxTransform oldPose = physxActor->rigidBody->getGlobalPose(); + const PxTransform newPose(oldPose.p - shift, oldPose.q); + physxActor->rigidBody->setGlobalPose(newPose); + } + + for (PxU32 i = 0; i < axleDesc.nbWheels; i++) + { + const PxU32 wheelId = axleDesc.wheelIdsInAxleOrder[i]; + + //Optionally adjust the hit position. + if (physxQueryStates && physxQueryStates[wheelId].actor) + physxQueryStates[wheelId].hitPosition -= shift; + + //Adjust the hit plane. + if (roadGeometryStates[wheelId].hitState) + { + const PxPlane plane = roadGeometryStates[wheelId].plane; + PxU32 largestNormalComponentAxis = 0; + PxReal largestNormalComponent = 0.0f; + const PxF32 normalComponents[3] = { plane.n.x, plane.n.y, plane.n.z }; + for (PxU32 k = 0; k < 3; k++) + { + if (PxAbs(normalComponents[k]) > largestNormalComponent) + { + largestNormalComponent = PxAbs(normalComponents[k]); + largestNormalComponentAxis = k; + } + } + PxVec3 pointInPlane(PxZero); + switch (largestNormalComponentAxis) + { + case 0: + pointInPlane.x = -plane.d / plane.n.x; + break; + case 1: + pointInPlane.y = -plane.d / plane.n.y; + break; + case 2: + pointInPlane.z = -plane.d / plane.n.z; + break; + default: + break; + } + roadGeometryStates[wheelId].plane.d = -plane.n.dot(pointInPlane - shift); + } + } +} + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/task/PxTaskDefine.h b/Source/ThirdParty/PhysX/vehicle2/PxVehicleLimits.h similarity index 73% rename from Source/ThirdParty/PhysX/task/PxTaskDefine.h rename to Source/ThirdParty/PhysX/vehicle2/PxVehicleLimits.h index 401d36ebf..e91c53cd0 100644 --- a/Source/ThirdParty/PhysX/task/PxTaskDefine.h +++ b/Source/ThirdParty/PhysX/vehicle2/PxVehicleLimits.h @@ -1,4 +1,3 @@ -// // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: @@ -11,7 +10,7 @@ // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR @@ -23,15 +22,36 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -// Copyright (c) 2008-2019 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. -#ifndef PXTASK_PXTASKDEFINE_H -#define PXTASK_PXTASKDEFINE_H +#pragma once +/** \addtogroup vehicle2 + @{ +*/ #include "foundation/PxPreprocessor.h" -#ifndef PX_SUPPORT_PXTASK_PROFILING -#define PX_SUPPORT_PXTASK_PROFILING 1 +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif +struct PxVehicleLimits +{ + enum Enum + { + eMAX_NB_WHEELS = 20, + eMAX_NB_AXLES = eMAX_NB_WHEELS + }; +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx #endif -#endif // PXTASK_PXTASKDEFINE_H +/** @} */ + diff --git a/Source/ThirdParty/PhysX/vehicle2/PxVehicleMaths.h b/Source/ThirdParty/PhysX/vehicle2/PxVehicleMaths.h new file mode 100644 index 000000000..a4d409884 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/PxVehicleMaths.h @@ -0,0 +1,237 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxSimpleTypes.h" +#include "foundation/PxMemory.h" + +#include "PxVehicleLimits.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +class PxVehicleVectorN +{ +public: + enum + { + eMAX_SIZE = PxVehicleLimits::eMAX_NB_WHEELS + 3 + }; + + PxVehicleVectorN(const PxU32 size) + : mSize(size) + { + PX_ASSERT(mSize <= PxVehicleVectorN::eMAX_SIZE); + PxMemZero(mValues, sizeof(PxReal)*PxVehicleVectorN::eMAX_SIZE); + } + + ~PxVehicleVectorN() + { + } + + PxVehicleVectorN(const PxVehicleVectorN& src) + { + for (PxU32 i = 0; i < src.mSize; i++) + { + mValues[i] = src.mValues[i]; + } + mSize = src.mSize; + } + + PX_FORCE_INLINE PxVehicleVectorN& operator=(const PxVehicleVectorN& src) + { + for (PxU32 i = 0; i < src.mSize; i++) + { + mValues[i] = src.mValues[i]; + } + mSize = src.mSize; + return *this; + } + + PX_FORCE_INLINE PxReal& operator[] (const PxU32 i) + { + PX_ASSERT(i < mSize); + return (mValues[i]); + } + + PX_FORCE_INLINE const PxReal& operator[] (const PxU32 i) const + { + //PX_ASSERT(i < mSize); + return (mValues[i]); + } + + PX_FORCE_INLINE PxU32 getSize() const { return mSize; } + +private: + + PxReal mValues[PxVehicleVectorN::eMAX_SIZE]; + PxU32 mSize; +}; + +class PxVehicleMatrixNN +{ +public: + + PxVehicleMatrixNN() + : mSize(0) + { + } + + PxVehicleMatrixNN(const PxU32 size) + : mSize(size) + { + PX_ASSERT(mSize <= PxVehicleVectorN::eMAX_SIZE); + PxMemZero(mValues, sizeof(PxReal)*PxVehicleVectorN::eMAX_SIZE*PxVehicleVectorN::eMAX_SIZE); + } + + PxVehicleMatrixNN(const PxVehicleMatrixNN& src) + { + for (PxU32 i = 0; i < src.mSize; i++) + { + for (PxU32 j = 0; j < src.mSize; j++) + { + mValues[i][j] = src.mValues[i][j]; + } + } + mSize = src.mSize; + } + + ~PxVehicleMatrixNN() + { + } + + PX_FORCE_INLINE PxVehicleMatrixNN& operator=(const PxVehicleMatrixNN& src) + { + for (PxU32 i = 0; i < src.mSize; i++) + { + for (PxU32 j = 0; j < src.mSize; j++) + { + mValues[i][j] = src.mValues[i][j]; + } + } + mSize = src.mSize; + return *this; + } + + PX_FORCE_INLINE PxReal get(const PxU32 i, const PxU32 j) const + { + PX_ASSERT(i < mSize); + PX_ASSERT(j < mSize); + return mValues[i][j]; + } + + PX_FORCE_INLINE void set(const PxU32 i, const PxU32 j, const PxReal val) + { + PX_ASSERT(i < mSize); + PX_ASSERT(j < mSize); + mValues[i][j] = val; + } + + PX_FORCE_INLINE PxU32 getSize() const { return mSize; } + + PX_FORCE_INLINE void setSize(const PxU32 size) + { + PX_ASSERT(size <= PxVehicleVectorN::eMAX_SIZE); + mSize = size; + } + +public: + + PxReal mValues[PxVehicleVectorN::eMAX_SIZE][PxVehicleVectorN::eMAX_SIZE]; + PxU32 mSize; +}; + + +/* + LUPQ decomposition + + Based upon "Outer Product LU with Complete Pivoting," from Matrix Computations (4th Edition), Golub and Van Loan + + Solve A*x = b using: + + MatrixNNLUSolver solver; + solver.decomposeLU(A); + solver.solve(b, x); +*/ +class PxVehicleMatrixNNLUSolver +{ +private: + + PxVehicleMatrixNN mLU; + PxU32 mP[PxVehicleVectorN::eMAX_SIZE - 1]; // Row permutation + PxU32 mQ[PxVehicleVectorN::eMAX_SIZE - 1]; // Column permutation + PxReal mDetM; + +public: + + PxVehicleMatrixNNLUSolver() {} + ~PxVehicleMatrixNNLUSolver() {} + + PxReal getDet() const { return mDetM; } + + void decomposeLU(const PxVehicleMatrixNN& A); + + //Given a matrix A and a vector b find x that satisfies Ax = b, where the matrix A is the matrix that was passed to #decomposeLU. + //Returns true if the lu decomposition indicates that the matrix has an inverse and x was successfully computed. + //Returns false if the lu decomposition resulted in zero determinant ie the matrix has no inverse and no solution exists for x. + //Returns false if the size of either b or x doesn't match the size of the matrix passed to #decomposeLU. + //If false is returned then each relevant element of x is set to zero. + bool solve(const PxVehicleVectorN& b, PxVehicleVectorN& x) const; +}; + + +class PxVehicleMatrixNGaussSeidelSolver +{ +public: + + void solve(const PxU32 maxIterations, const PxReal tolerance, const PxVehicleMatrixNN& A, const PxVehicleVectorN& b, PxVehicleVectorN& result) const; +}; + +class PxVehicleMatrix33Solver +{ +public: + + bool solve(const PxVehicleMatrixNN& A_, const PxVehicleVectorN& b_, PxVehicleVectorN& result) const; +}; + +#if !PX_DOXYGEN +} //namespace vehicle2 +} //namespace physx +#endif + +/** @} */ + + diff --git a/Source/ThirdParty/PhysX/vehicle2/PxVehicleParams.h b/Source/ThirdParty/PhysX/vehicle2/PxVehicleParams.h new file mode 100644 index 000000000..7eb58e492 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/PxVehicleParams.h @@ -0,0 +1,914 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once +/** \addtogroup vehicle2 + @{ +*/ +#include "foundation/PxFoundation.h" +#include "foundation/PxAssert.h" +#include "foundation/PxMemory.h" +#include "foundation/PxVec3.h" +#include "foundation/PxMat33.h" + +#include "PxVehicleLimits.h" + +class OmniPvdWriter; + +#if !PX_DOXYGEN +namespace physx +{ +class PxConvexMesh; +class PxScene; +namespace vehicle2 +{ +#endif + +struct PxVehicleAxleDescription +{ + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleAxleDescription)); + } + + /** + \brief Add an axle to the vehicle by specifying the number of wheels on the axle and an array of wheel ids specifying each wheel on the axle. + \param[in] nbWheelsOnAxle is the number of wheels on the axle to be added. + \param[in] wheelIdsOnAxle is an array of wheel ids specifying all the wheels on the axle to be added. + */ + void addAxle(const PxU32 nbWheelsOnAxle, const PxU32* const wheelIdsOnAxle) + { + PX_ASSERT((nbWheels + nbWheelsOnAxle) < PxVehicleLimits::eMAX_NB_WHEELS); + PX_ASSERT(nbAxles < PxVehicleLimits::eMAX_NB_AXLES); + nbWheelsPerAxle[nbAxles] = nbWheelsOnAxle; + axleToWheelIds[nbAxles] = nbWheels; + for (PxU32 i = 0; i < nbWheelsOnAxle; i++) + { + wheelIdsInAxleOrder[nbWheels + i] = wheelIdsOnAxle[i]; + } + nbWheels += nbWheelsOnAxle; + nbAxles++; + } + + /** + \brief Return the number of axles on the vehicle. + \return The number of axles. + @see getNbWheelsOnAxle() + */ + PX_FORCE_INLINE PxU32 getNbAxles() const + { + return nbAxles; + } + + /** + \brief Return the number of wheels on the ith axle. + \param[in] i specifies the axle to be queried for its wheel count. + \return The number of wheels on the specified axle. + @see getWheelOnAxle() + */ + PX_FORCE_INLINE PxU32 getNbWheelsOnAxle(const PxU32 i) const + { + return nbWheelsPerAxle[i]; + } + + /** + \brief Return the wheel id of the jth wheel on the ith axle. + \param[in] j specifies that the wheel id to be returned is the jth wheel in the list of wheels on the specified axle. + \param[in] i specifies the axle to be queried. + \return The wheel id of the jth wheel on the ith axle. + @see getNbWheelsOnAxle() + */ + PX_FORCE_INLINE PxU32 getWheelOnAxle(const PxU32 j, const PxU32 i) const + { + return wheelIdsInAxleOrder[axleToWheelIds[i] + j]; + } + + /** + \brief Return the number of wheels on the vehicle. + \return The number of wheels. + */ + PX_FORCE_INLINE PxU32 getNbWheels() const + { + return nbWheels; + } + + /** + \brief Return the axle of a specified wheel. + \param[in] wheelId is the wheel whose axle is to be queried. + \return The axle of the specified wheel. + */ + PX_FORCE_INLINE PxU32 getAxle(const PxU32 wheelId) const + { + for (PxU32 i = 0; i < getNbAxles(); i++) + { + for (PxU32 j = 0; j < getNbWheelsOnAxle(i); j++) + { + if (getWheelOnAxle(j, i) == wheelId) + return i; + } + } + return 0xffffffff; + } + + PX_FORCE_INLINE bool isValid() const + { + PX_CHECK_AND_RETURN_VAL(nbAxles > 0, "PxVehicleAxleDescription.nbAxles must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(nbWheels > 0, "PxVehicleAxleDescription.nbWheels must be greater than zero", false); + return true; + } + + PxU32 nbAxles; //!< The number of axles on the vehicle + PxU32 nbWheelsPerAxle[PxVehicleLimits::eMAX_NB_AXLES]; //!< The number of wheels on each axle. + PxU32 axleToWheelIds[PxVehicleLimits::eMAX_NB_AXLES]; //!< The list of wheel ids for the ith axle begins at wheelIdsInAxleOrder[axleToWheelIds[i]] + + PxU32 wheelIdsInAxleOrder[PxVehicleLimits::eMAX_NB_WHEELS]; //!< The list of all wheel ids on the vehicle. + PxU32 nbWheels; //!< The number of wheels on the vehicle. + + + PX_COMPILE_TIME_ASSERT(PxVehicleLimits::eMAX_NB_AXLES == PxVehicleLimits::eMAX_NB_WHEELS); + // It should be possible to support cases where each wheel is controlled individually and thus + // having a wheel per axle for up to the max wheel count. +}; + + +struct PxVehicleAxes +{ + enum Enum + { + ePosX = 0, //!< The +x axis + eNegX, //!< The -x axis + ePosY, //!< The +y axis + eNegY, //!< The -y axis + ePosZ, //!< The +z axis + eNegZ, //!< The -z axis + eMAX_NB_AXES + }; +}; + +struct PxVehicleFrame +{ + PxVehicleAxes::Enum lngAxis; //!< The axis defining the longitudinal (forward) direction of the vehicle. + PxVehicleAxes::Enum latAxis; //!< The axis defining the lateral (side) direction of the vehicle. + PxVehicleAxes::Enum vrtAxis; //!< The axis defining the vertical (up) direction of the vehicle. + + PX_FORCE_INLINE void setToDefault() + { + lngAxis = PxVehicleAxes::ePosX; + latAxis = PxVehicleAxes::ePosY; + vrtAxis = PxVehicleAxes::ePosZ; + } + + PX_FORCE_INLINE PxMat33 getFrame() const + { + const PxVec3 basisDirs[6] = { PxVec3(1,0,0), PxVec3(-1,0,0), PxVec3(0,1,0), PxVec3(0,-1,0), PxVec3(0,0,1), PxVec3(0,0,-1) }; + const PxMat33 mat33(basisDirs[lngAxis], basisDirs[latAxis], basisDirs[vrtAxis]); + return mat33; + } + + PX_FORCE_INLINE PxVec3 getLngAxis() const + { + const PxVec3 basisDirs[6] = { PxVec3(1,0,0), PxVec3(-1,0,0), PxVec3(0,1,0), PxVec3(0,-1,0), PxVec3(0,0,1), PxVec3(0,0,-1) }; + return basisDirs[lngAxis]; + } + + PX_FORCE_INLINE PxVec3 getLatAxis() const + { + const PxVec3 basisDirs[6] = { PxVec3(1,0,0), PxVec3(-1,0,0), PxVec3(0,1,0), PxVec3(0,-1,0), PxVec3(0,0,1), PxVec3(0,0,-1) }; + return basisDirs[latAxis]; + } + + PX_FORCE_INLINE PxVec3 getVrtAxis() const + { + const PxVec3 basisDirs[6] = { PxVec3(1,0,0), PxVec3(-1,0,0), PxVec3(0,1,0), PxVec3(0,-1,0), PxVec3(0,0,1), PxVec3(0,0,-1) }; + return basisDirs[vrtAxis]; + } + + PX_FORCE_INLINE bool isValid() const + { + PX_CHECK_AND_RETURN_VAL(lngAxis < PxVehicleAxes::eMAX_NB_AXES, "PxVehicleFrame.lngAxis is invalid", false); + PX_CHECK_AND_RETURN_VAL(latAxis < PxVehicleAxes::eMAX_NB_AXES, "PxVehicleFrame.latAxis is invalid", false); + PX_CHECK_AND_RETURN_VAL(vrtAxis < PxVehicleAxes::eMAX_NB_AXES, "PxVehicleFrame.vrtAxis is invalid", false); + const PxMat33 frame = getFrame(); + const PxQuat quat(frame); + PX_CHECK_AND_RETURN_VAL(quat.isFinite() && quat.isUnit() && quat.isSane(), "PxVehicleFrame is not a legal frame", false); + return true; + } +}; + +struct PxVehicleScale +{ + PxReal scale; //!< The length scale used for the vehicle. For example, if 1.0 is considered meters, then 100.0 would be for centimeters. + + PX_FORCE_INLINE void setToDefault() + { + scale = 1.0f; + } + + PX_FORCE_INLINE bool isValid() const + { + PX_CHECK_AND_RETURN_VAL(scale > 0.0f, "PxVehicleScale.scale must be greater than zero", false); + return true; + } +}; + +/** +\brief Helper struct to pass array type data to vehice components and functions. + +The Vehicle SDK tries to give the user a certain freedom in how the parameters and +states are stored. This helper struct presents a way to either use array of structs +or array of pointers to structs to pass data into the provided vehicle components +and functions. +*/ +template +struct PxVehicleArrayData +{ + enum DataFormat + { + eARRAY_OF_STRUCTS = 0, //!< The data is provided as an array of structs and stored in #arrayOfStructs. + eARRAY_OF_POINTERS //!< The data is provided as an array of pointers and stored in #arrayOfPointers. + }; + + /** + \brief Set the data as an array of structs. + + \param[in] data The data as an array of structs. + */ + PX_FORCE_INLINE void setData(T* data) + { + arrayOfStructs = data; + dataFormat = eARRAY_OF_STRUCTS; + } + + /** + \brief Set the data as an array of pointers. + + \param[in] data The data as an array of pointers. + */ + PX_FORCE_INLINE void setData(T*const* data) + { + arrayOfPointers= data; + dataFormat = eARRAY_OF_POINTERS; + } + + PX_FORCE_INLINE PxVehicleArrayData() + { + } + + PX_FORCE_INLINE explicit PxVehicleArrayData(T* data) + { + setData(data); + } + + PX_FORCE_INLINE explicit PxVehicleArrayData(T*const* data) + { + setData(data); + } + + /** + \brief Get the data entry at a given index. + + \param[in] index The index to retrieve the data entry for. + \return Reference to the requested data entry. + */ + PX_FORCE_INLINE T& getData(PxU32 index) + { + if (dataFormat == eARRAY_OF_STRUCTS) + return arrayOfStructs[index]; + else + return *arrayOfPointers[index]; + } + + PX_FORCE_INLINE T& operator[](PxU32 index) + { + return getData(index); + } + + /** + \brief Get the data entry at a given index. + + \param[in] index The index to retrieve the data entry for. + \return Reference to the requested data entry. + */ + PX_FORCE_INLINE const T& getData(PxU32 index) const + { + if (dataFormat == eARRAY_OF_STRUCTS) + return arrayOfStructs[index]; + else + return *arrayOfPointers[index]; + } + + PX_FORCE_INLINE const T& operator[](PxU32 index) const + { + return getData(index); + } + + /** + \brief Set as empty. + */ + PX_FORCE_INLINE void setEmpty() + { + arrayOfStructs = NULL; + } + + /** + \brief Check if declared as empty. + + \return True if empty, else false. + */ + PX_FORCE_INLINE bool isEmpty() const + { + return (arrayOfStructs == NULL); + } + + /** + \brief Get a reference to the array but read only. + + \return Read only version of the data. + */ + PX_FORCE_INLINE const PxVehicleArrayData& getConst() const + { + return reinterpret_cast&>(*this); + } + + + union + { + T* arrayOfStructs; //!< The data stored as an array of structs. + T*const* arrayOfPointers; //!< The data stored as an array of pointers. + }; + PxU8 dataFormat; +}; + +template +struct PxVehicleSizedArrayData : public PxVehicleArrayData +{ + /** + \brief Set the data as an array of structs and set the number of data entries. + + \param[in] data The data as an array of structs. + \param[in] count The number of entries in the data array. + */ + PX_FORCE_INLINE void setDataAndCount(T* data, const PxU32 count) + { + PxVehicleArrayData::setData(data); + size = count; + } + + /** + \brief Set the data as an array of pointers and set the number of data entries. + + \param[in] data The data as an array of pointers. + \param[in] count The number of entries in the data array. + */ + PX_FORCE_INLINE void setDataAndCount(T*const* data, const PxU32 count) + { + PxVehicleArrayData::setData(data); + size = count; + } + + /** + \brief Set as empty. + */ + PX_FORCE_INLINE void setEmpty() + { + PxVehicleArrayData::setEmpty(); + size = 0; + } + + /** + \brief Check if declared as empty. + + \return True if empty, else false. + */ + PX_FORCE_INLINE bool isEmpty() const + { + return ((size == 0) || PxVehicleArrayData::isEmpty()); + } + + PxU32 size; +}; + +/** +\brief Determine whether the PhysX actor associated with a vehicle is to be updated with a velocity change or an acceleration change. +A velocity change will be immediately reflected in linear and angular velocity queries against the vehicle. An acceleration change, on the other hand, +will leave the linear and angular velocities unchanged until the next PhysX scene update has applied the acceleration update to the actor's linear and +angular velocities. +@see PxVehiclePhysXActorEndComponent +@see PxVehicleWriteRigidBodyStateToPhysXActor +*/ +struct PxVehiclePhysXActorUpdateMode +{ + enum Enum + { + eAPPLY_VELOCITY = 0, + eAPPLY_ACCELERATION + }; +}; + +/** +\brief Tire slip values are computed using ratios with potential for divide-by-zero errors. PxVehicleTireSlipParams +introduces a minimum value for the denominator of each of these ratios. +*/ +struct PxVehicleTireSlipParams +{ + /** + \brief The lateral slip angle is typically computed as a function of the ratio of lateral and longitudinal speeds + of the rigid body in the tire's frame. This leads to a divide-by-zero in the event that the longitudinal speed + approaches zero. The parameter minLatSlipDenominator sets a minimum denominator for the ratio of speeds used to + compute the lateral slip angle. + \note Larger timesteps typically require larger values of minLatSlipDenominator. + + Range: (0, inf)
+ Unit: velocity = length / time + */ + PxReal minLatSlipDenominator; + + /** + \brief The longitudinal slip represents the difference between the longitudinal speed of the rigid body in the tire's + frame and the linear speed arising from the rotation of the wheel. This is typically normalized using the reciprocal + of the longitudinal speed of the rigid body in the tire's frame. This leads to a divide-by-zero in the event that the + longitudinal speed approaches zero. The parameter minPassiveLongSlipDenominator sets a minimum denominator for the normalized + longitudinal slip when the wheel experiences zero drive torque and zero brake torque and zero handbrake torque. The aim is + to bring the vehicle to rest without experiencing wheel rotational speeds that oscillate around zero. + \note The vehicle will come to rest more smoothly with larger values of minPassiveLongSlipDenominator, particularly + with large timesteps that often lead to oscillation in wheel rotation speeds when the wheel rotation speed approaches + zero. + \note It is recommended that minActiveLongSlipDenominator < minPassiveLongSlipDenominator. + + Range: (0, inf)
+ Unit: velocity = length / time + */ + PxReal minPassiveLongSlipDenominator; + + /** + \brief The longitudinal slip represents the difference between the longitudinal speed of the rigid body in the tire's + frame and the linear speed arising from the rotation of the wheel. This is typically normalized using the reciprocal + of the longitudinal speed of the rigid body in the tire's frame. This leads to a divide-by-zero in the event that the + longitudinal speed approaches zero. The parameter minActiveLongSlipDenominator sets a minimum denominator for the normalized + longitudinal slip when the wheel experiences either a non-zero drive torque or a non-zero brake torque or a non-zero handbrake + torque. + \note Larger timesteps typically require larger values of minActiveLongSlipDenominator to avoid instabilities occurring when + the vehicle is aggressively throttled from rest. + \note It is recommended that minActiveLongSlipDenominator < minPassiveLongSlipDenominator. + + Range: (0, inf)
+ Unit: velocity = length / time + */ + PxReal minActiveLongSlipDenominator; + + PX_FORCE_INLINE void setToDefault() + { + minLatSlipDenominator = 1.0f; + minActiveLongSlipDenominator = 0.1f; + minPassiveLongSlipDenominator = 4.0f; + } + + PX_FORCE_INLINE PxVehicleTireSlipParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PxVehicleTireSlipParams p = *this; + const PxReal scaleRatio = trgScale.scale / srcScale.scale; + p.minLatSlipDenominator *= scaleRatio; + p.minPassiveLongSlipDenominator *= scaleRatio; + p.minActiveLongSlipDenominator *= scaleRatio; + return p; + } + + PX_FORCE_INLINE bool isValid() const + { + PX_CHECK_AND_RETURN_VAL(minLatSlipDenominator > 0.0f, "PxVehicleTireSlipParams.minLatSlipDenominator must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(minPassiveLongSlipDenominator > 0.0f, "PxVehicleTireSlipParams.minPassiveLongSlipDenominator must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(minActiveLongSlipDenominator > 0.0f, "PxVehicleTireSlipParams.minActiveLongSlipDenominator must be greater than zero", false); + return true; + } +}; + +/** +\brief Tires have two important directions for the purposes of tire force computation: longitudinal and lateral. +*/ +struct PxVehicleTireDirectionModes +{ + enum Enum + { + eLONGITUDINAL = 0, + eLATERAL, + eMAX_NB_PLANAR_DIRECTIONS + }; +}; + +/** +\brief The low speed regime often presents numerical difficulties for the tire model due to the potential for divide-by-zero errors. +This particularly affects scenarios where the vehicle is slowing down due to damping and drag. In scenarios where there is no +significant brake or drive torque, numerical error begins to dominate and it can be difficult to bring the vehicle to rest. A solution +to this problem is to recognise that the vehicle is close to rest and to replace the tire forces with velocity constraints that will +bring the vehicle to rest. This regime is known as the "sticky tire" regime. PxVehicleTireAxisStickyParams describes velocity and time +thresholds that categorise the "sticky tire" regime. It also describes the rate at which the velocity constraints approach zero speed. +*/ +struct PxVehicleTireAxisStickyParams +{ + /** + \brief A tire enters the "sticky tire" regime when it has been below a speed specified by #thresholdSpeed for a continuous time + specified by #thresholdTime. + + Range: [0, inf)
+ Unit: velocity = length / time + */ + PxReal thresholdSpeed; + + /** + \brief A tire enters the "sticky tire" regime when it has been below a speed specified by #thresholdSpeed for a continuous time + specified by #thresholdTime. + + Range: [0, inf)
+ Unit: time + */ + PxReal thresholdTime; + + /** + \brief The rate at which the velocity constraint approaches zero is controlled by the damping parameter. + \note Larger values of damping lead to faster approaches to zero. Since the damping behaves like a + stiffness with respect to the velocity, too large a value can lead to instabilities. + + Range: [0, inf)
+ Unit: 1 / time (acceleration instead of force based damping, thus not mass/time) + */ + PxReal damping; + + + PX_FORCE_INLINE PxVehicleTireAxisStickyParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PxVehicleTireAxisStickyParams p = *this; + const PxReal scaleRatio = trgScale.scale / srcScale.scale; + p.thresholdSpeed *= scaleRatio; + return p; + } + + PX_FORCE_INLINE bool isValid() const + { + PX_CHECK_AND_RETURN_VAL(thresholdSpeed >= 0.0f, "PxVehicleTireAxisStickyParams.thresholdSpeed must be greater than or equal to zero", false); + PX_CHECK_AND_RETURN_VAL(thresholdTime >= 0.0f, "PxVehicleTireAxisStickyParams.thresholdTime must be greater than or equal to zero", false); + PX_CHECK_AND_RETURN_VAL(damping >= 0.0f, "PxVehicleTireAxisStickyParams.damping must be greater than or equal to zero", false); + return true; + } +}; + +/** +\brief For each tire, the forces of the tire model may be replaced by velocity constraints when the tire enters the "sticky tire" +regime. The "sticky tire" regime of the lateral and longitudinal directions of the tire are managed separately. +*/ +struct PxVehicleTireStickyParams +{ + /** + The "sticky tire" regime of the lateral and longitudinal directions of the tire are managed separately and are individually + parameterized. + */ + PxVehicleTireAxisStickyParams stickyParams[PxVehicleTireDirectionModes::eMAX_NB_PLANAR_DIRECTIONS]; + + PX_FORCE_INLINE void setToDefault() + { + stickyParams[PxVehicleTireDirectionModes::eLONGITUDINAL].thresholdSpeed = 0.2f; + stickyParams[PxVehicleTireDirectionModes::eLONGITUDINAL].thresholdTime = 1.0f; + stickyParams[PxVehicleTireDirectionModes::eLONGITUDINAL].damping = 1.0f; + stickyParams[PxVehicleTireDirectionModes::eLATERAL].thresholdSpeed = 0.2f; + stickyParams[PxVehicleTireDirectionModes::eLATERAL].thresholdTime = 1.0f; + stickyParams[PxVehicleTireDirectionModes::eLATERAL].damping = 0.1f; + } + + PX_FORCE_INLINE PxVehicleTireStickyParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PxVehicleTireStickyParams p = *this; + p.stickyParams[PxVehicleTireDirectionModes::eLONGITUDINAL] = + stickyParams[PxVehicleTireDirectionModes::eLONGITUDINAL].transformAndScale(srcFrame, trgFrame, srcScale, trgScale); + p.stickyParams[PxVehicleTireDirectionModes::eLATERAL] = + stickyParams[PxVehicleTireDirectionModes::eLATERAL].transformAndScale(srcFrame, trgFrame, srcScale, trgScale); + return p; + } + + PX_FORCE_INLINE bool isValid() const + { + if (!stickyParams[PxVehicleTireDirectionModes::eLONGITUDINAL].isValid()) + return false; + if (!stickyParams[PxVehicleTireDirectionModes::eLATERAL].isValid()) + return false; + return true; + } +}; + +struct PxVehicleSimulationContextType +{ + enum Enum + { + eDEFAULT, //!< The simulation context inherits from PxVehicleSimulationContext + ePHYSX //!< The simulation context inherits from PxVehiclePhysXSimulationContext + }; +}; + +/** +\brief Structure to support Omni PVD, the PhysX Visual Debugger. +*/ +struct PxVehiclePvdContext +{ +public: + PX_FORCE_INLINE void setToDefault() + { + attributeHandles = NULL; + writer = NULL; + } + + + /** + \brief The attribute handles used to reflect vehicle parameter and state data in omnipvd. + \note A null value will result in no values being reflected in omnipvd. + \note #attributeHandles and #writer both need to be non-NULL to reflect vehicle values in omnipvd. + @see PxVehiclePvdAttributesCreate + @see PxVehiclePvdAttributesRelease + @see PxVehiclePVDComponent + */ + const struct PxVehiclePvdAttributeHandles* attributeHandles; + + /** + \brief An instance of OmniPvdWriter used to write vehicle prameter and state data to omnipvd. + \note A null value will result in no values being reflected in omnipvd. + \note #attributeHandles and #writer both need to be non-NULL to reflect vehicle values in omnipvd. + @see PxVehiclePvdAttributesCreate + @see PxVehiclePvdAttributesRelease + @see PxVehiclePVDComponent + */ + OmniPvdWriter* writer; +}; + +struct PxVehicleSimulationContext +{ + PxVehicleSimulationContext() + : type(PxVehicleSimulationContextType::eDEFAULT) + {} + + PxVec3 gravity; + + PxVehicleFrame frame; + PxVehicleScale scale; + + //Tire + PxVehicleTireSlipParams tireSlipParams; + PxVehicleTireStickyParams tireStickyParams; + + /** + \brief Forward wheel speed below which the wheel rotation speed gets blended with the rolling speed. + + The blended rotation speed is used to integrate the wheel rotation angle. At low forward wheel speed, + the wheel rotation speed can get unstable (depending on the tire model used) and, for example, oscillate. + + \note If brake or throttle is applied, there will be no blending. + + Unit: velocity = length / time + */ + PxReal thresholdForwardSpeedForWheelAngleIntegration; + + /** + \brief Structure to support Omni PVD, the PhysX Visual Debugger. + */ + PxVehiclePvdContext pvdContext; + +protected: + PxVehicleSimulationContextType::Enum type; + + +public: + PX_FORCE_INLINE PxVehicleSimulationContextType::Enum getType() const { return type; } + + PX_FORCE_INLINE void setToDefault() + { + frame.setToDefault(); + scale.setToDefault(); + + gravity = frame.getVrtAxis() * (-9.81f * scale.scale); + + tireSlipParams.setToDefault(); + tireStickyParams.setToDefault(); + + thresholdForwardSpeedForWheelAngleIntegration = 5.0f * scale.scale; + + pvdContext.setToDefault(); + } + + PX_FORCE_INLINE PxVehicleSimulationContext transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PxVehicleSimulationContext c = *this; + const PxReal scaleRatio = trgScale.scale / srcScale.scale; + c.gravity = trgFrame.getFrame()*srcFrame.getFrame().getTranspose()*c.gravity; + c.gravity *= scaleRatio; + c.tireSlipParams = tireSlipParams.transformAndScale(srcFrame, trgFrame, srcScale, trgScale); + c.tireStickyParams = tireStickyParams.transformAndScale(srcFrame, trgFrame, srcScale, trgScale); + c.thresholdForwardSpeedForWheelAngleIntegration *= scaleRatio; + c.frame = trgFrame; + c.scale = trgScale; + return c; + } +}; + +struct PxVehiclePhysXSimulationContext : public PxVehicleSimulationContext +{ + PxVehiclePhysXSimulationContext() + : PxVehicleSimulationContext() + { + type = PxVehicleSimulationContextType::ePHYSX; + } + + //Road geometry queries to find the plane under the wheel. + const PxConvexMesh* physxUnitCylinderSweepMesh; + const PxScene* physxScene; + + //PhysX actor update + PxVehiclePhysXActorUpdateMode::Enum physxActorUpdateMode; + + /** + \brief Wake counter value to set on the physx actor if a reset is required. + + Certain vehicle states should keep a physx actor of a vehicle awake. This + will be achieved by resetting the wake counter value if needed. The wake + counter value is the minimum simulation time that a physx actor will stay + awake. + + Unit: time + + @see physxActorWakeCounterThreshold PxVehiclePhysxActorKeepAwakeCheck + */ + PxReal physxActorWakeCounterResetValue; + + /** + \brief Threshold below which to check whether the physx actor wake counter + should get reset. + + Unit: time + + @see physxActorWakeCounterResetValue PxVehiclePhysxActorKeepAwakeCheck + */ + PxReal physxActorWakeCounterThreshold; + + + PX_FORCE_INLINE void setToDefault() + { + PxVehicleSimulationContext::setToDefault(); + + physxUnitCylinderSweepMesh = NULL; + physxScene = NULL; + + physxActorUpdateMode = PxVehiclePhysXActorUpdateMode::eAPPLY_VELOCITY; + + physxActorWakeCounterResetValue = 20.0f * 0.02f; // 20 timesteps of size 0.02 + physxActorWakeCounterThreshold = 0.5f * physxActorWakeCounterResetValue; + } + + PX_FORCE_INLINE PxVehiclePhysXSimulationContext transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PxVehiclePhysXSimulationContext r = *this; + static_cast(r) = PxVehicleSimulationContext::transformAndScale(srcFrame, trgFrame, srcScale, trgScale); + return r; + } +}; + +/** +* \brief Express a function as a sequence of points {(x, y)} that form a piecewise polynomial. +*/ +template +class PxVehicleFixedSizeLookupTable +{ +public: + + PxVehicleFixedSizeLookupTable() + : nbDataPairs(0) + { + } + + PxVehicleFixedSizeLookupTable(const PxVehicleFixedSizeLookupTable& src) + { + PxMemCopy(xVals, src.xVals, sizeof(PxReal)* src.nbDataPairs); + PxMemCopy(yVals, src.yVals, sizeof(T)*src.nbDataPairs); + nbDataPairs = src.nbDataPairs; + } + + ~PxVehicleFixedSizeLookupTable() + { + } + + PxVehicleFixedSizeLookupTable& operator=(const PxVehicleFixedSizeLookupTable& src) + { + PxMemCopy(xVals, src.xVals, sizeof(PxReal)*src.nbDataPairs); + PxMemCopy(yVals, src.yVals, sizeof(T)*src.nbDataPairs); + nbDataPairs = src.nbDataPairs; + return *this; + } + + /** + \brief Add one more point to create one more polynomial segment of a piecewise polynomial. + */ + PX_FORCE_INLINE bool addPair(const PxReal x, const T y) + { + PX_CHECK_AND_RETURN_VAL(nbDataPairs < NB_ELEMENTS, "PxVehicleFixedSizeLookupTable::addPair() exceeded fixed size capacity", false); + xVals[nbDataPairs] = x; + yVals[nbDataPairs] = y; + nbDataPairs++; + return true; + } + + /** + \brief Identify the segment of the piecewise polynomial that includes x and compute the corresponding y value by linearly interpolating the gradient of the segment. + \param[in] x is the value on the x-axis of the piecewise polynomial. + \return Returns the y value that corresponds to the input x. + */ + PX_FORCE_INLINE T interpolate(const PxReal x) const + { + if (0 == nbDataPairs) + { + return T(0); + } + + if (1 == nbDataPairs || x < xVals[0]) + { + return yVals[0]; + } + + PxReal x0 = xVals[0]; + T y0 = yVals[0]; + + for (PxU32 i = 1; i < nbDataPairs; i++) + { + const PxReal x1 = xVals[i]; + const T y1 = yVals[i]; + + if ((x >= x0) && (x < x1)) + { + return (y0 + (y1 - y0) * (x - x0) / (x1 - x0)); + } + + x0 = x1; + y0 = y1; + } + + PX_ASSERT(x >= xVals[nbDataPairs - 1]); + return yVals[nbDataPairs - 1]; + } + + void clear() + { + PxMemSet(xVals, 0, NB_ELEMENTS * sizeof(PxReal)); + PxMemSet(yVals, 0, NB_ELEMENTS * sizeof(T)); + nbDataPairs = 0; + } + + PxReal xVals[NB_ELEMENTS]; + T yVals[NB_ELEMENTS]; + PxU32 nbDataPairs; + + PX_FORCE_INLINE bool isValid() const + { + for (PxU32 i = 1; i < nbDataPairs; i++) + { + PX_CHECK_AND_RETURN_VAL(xVals[i] > xVals[i - 1], "PxVehicleFixedSizeLookupTable:: xVals[i+1] must be greater than xVals[i]", false); + } + return true; + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + + + + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/braking/PxVehicleBrakingFunctions.h b/Source/ThirdParty/PhysX/vehicle2/braking/PxVehicleBrakingFunctions.h new file mode 100644 index 000000000..f72fed12e --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/braking/PxVehicleBrakingFunctions.h @@ -0,0 +1,79 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxPreprocessor.h" +#include "foundation/PxMath.h" +#include "PxVehicleBrakingParams.h" +#include "../commands/PxVehicleCommandStates.h" +#include "../commands/PxVehicleCommandHelpers.h" +#include "../drivetrain/PxVehicleDrivetrainParams.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +/** +\brief Compute the brake torque response to an array of brake commands. +\param[in] brakeCommands is the array of input brake commands to be applied to the vehicle. +\param[in] nbBrakeCommands is the number of input brake commands to be applied to the vehicle. +\param[in] longitudinalSpeed is the longitudinal speed of the vehicle. +\param[in] wheelId specifies the wheel that is to have its brake response computed. +\param[in] brakeResponseParams specifies the per wheel brake torque response to each brake command as a nonlinear function of brake command and longitudinal speed. +\param[out] brakeResponseState is the brake torque response to the input brake command. +\note commands.brakes[i] and brakeResponseParams[i] are treated as pairs of brake command and brake command response. +*/ +PX_FORCE_INLINE void PxVehicleBrakeCommandResponseUpdate +(const PxReal* brakeCommands, const PxU32 nbBrakeCommands, const PxReal longitudinalSpeed, + const PxU32 wheelId, const PxVehicleSizedArrayData& brakeResponseParams, + PxReal& brakeResponseState) +{ + PX_CHECK_AND_RETURN(nbBrakeCommands <= brakeResponseParams.size, "PxVehicleBrakeCommandLinearUpdate: nbBrakes must be less than or equal to brakeResponseParams.size"); + PxReal sum = 0.0f; + for (PxU32 i = 0; i < nbBrakeCommands; i++) + { + sum += PxVehicleNonLinearResponseCompute(brakeCommands[i], longitudinalSpeed, wheelId, brakeResponseParams[i]); + } + brakeResponseState = sum; +} + + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/braking/PxVehicleBrakingParams.h b/Source/ThirdParty/PhysX/vehicle2/braking/PxVehicleBrakingParams.h new file mode 100644 index 000000000..c48259aef --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/braking/PxVehicleBrakingParams.h @@ -0,0 +1,86 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxFoundation.h" + +#include "vehicle2/PxVehicleParams.h" + +#include "vehicle2/commands/PxVehicleCommandParams.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +/** +\brief Distribute a brake response to the wheels of a vehicle. +\note The brake torque of each wheel on the ith wheel is brakeCommand * maxResponse * wheelResponseMultipliers[i]. +\note A typical use case is to set maxResponse to be the vehicle's maximum achievable brake torque +that occurs when the brake command is equal to 1.0. The array wheelResponseMultipliers[i] would then be used +to specify the maximum achievable brake torque per wheel as a fractional multiplier of the vehicle's maximum achievable brake torque. +*/ +struct PxVehicleBrakeCommandResponseParams : public PxVehicleCommandResponseParams +{ + PX_FORCE_INLINE PxVehicleBrakeCommandResponseParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PxVehicleBrakeCommandResponseParams r = *this; + const PxReal scale = trgScale.scale/srcScale.scale; + r.maxResponse *= (scale*scale); //maxResponse is a torque! + return r; + } + + PX_FORCE_INLINE bool isValid(const PxVehicleAxleDescription& axleDesc) const + { + if (!axleDesc.isValid()) + return false; + PX_CHECK_AND_RETURN_VAL(maxResponse >= 0.0f, "PxVehicleBrakeCommandResponseParams.maxResponse must be greater than or equal to zero", false); + for (PxU32 i = 0; i < axleDesc.nbWheels; i++) + { + PX_CHECK_AND_RETURN_VAL(wheelResponseMultipliers[axleDesc.wheelIdsInAxleOrder[i]] >= 0.0f, "PxVehicleBrakeCommandResponseParams.wheelResponseMultipliers[i] must be greater than or equal to zero.", false); + } + return true; + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/commands/PxVehicleCommandHelpers.h b/Source/ThirdParty/PhysX/vehicle2/commands/PxVehicleCommandHelpers.h new file mode 100644 index 000000000..b746bfc25 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/commands/PxVehicleCommandHelpers.h @@ -0,0 +1,76 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "vehicle2/PxVehicleParams.h" +#include "PxVehicleCommandParams.h" +#include "PxVehicleCommandStates.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +/** +\brief Compute the linear response to a command. +\param[in] command is a normalised command value. +\param[in] wheelId specifies the wheel that is to respond to the command. +\param[in] responseParams specifies the wheel responses for all wheels on a vehicle. +\return The linear response of the specified wheel to the command. +*/ +PX_FORCE_INLINE PxReal PxVehicleLinearResponseCompute +(const PxReal command, const PxU32 wheelId, const PxVehicleCommandResponseParams& responseParams) +{ + return command*responseParams.maxResponse*responseParams.wheelResponseMultipliers[wheelId]; +} + +/** +\brief Compute the non-linear response to a command. +\param[in] command is a normalised command value. +\param[in] longitudinalSpeed is the longitudional speed of the vehicle. +\param[in] wheelId specifies the wheel that is to respond to the command. +\param[in] responseParams specifies the wheel responses for all wheels on a vehicle. +\note responseParams is used to compute an interpolated normalized response to the combination of command and longitudinalSpeed. +The interpolated normalized response is then used in place of the command as input to PxVehicleComputeLinearResponse(). +*/ +PxReal PxVehicleNonLinearResponseCompute +(const PxReal command, const PxReal longitudinalSpeed, const PxU32 wheelId, const PxVehicleCommandResponseParams& responseParams); + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/commands/PxVehicleCommandParams.h b/Source/ThirdParty/PhysX/vehicle2/commands/PxVehicleCommandParams.h new file mode 100644 index 000000000..3b8265603 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/commands/PxVehicleCommandParams.h @@ -0,0 +1,202 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxFoundation.h" +#include "vehicle2/PxVehicleLimits.h" +#include "vehicle2/PxVehicleParams.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + + + +/** +\brief Each command value may be associated with a table specifying a normalized response as a function of longitudinal speed. +Multiple instances of PxVehicleCommandValueResponseTable allow a normalized response to be authored as a multi-variate +piecewise polynomial with normalized command response expressed as a nonlinear function of command value and speed. +*/ +struct PxVehicleCommandValueResponseTable +{ + enum Enum + { + eMAX_NB_SPEED_RESPONSES = 64 + }; + + /** + \brief The command value associated with the table of speed responses. + */ + PxReal commandValue; + + /** + \brief A lookup table specifying the normalised response to the specified command value as a function of longitudinal speed. + \note Each entry in the speedResponses table must be of the form (speed, normalizedResponse). + \note The longitudinal speeds in the table must form a monotonically increasing series. + \note The normalized responses must be in range (0,1). + */ + PxVehicleFixedSizeLookupTable speedResponses; +}; + +/** +\note Brake, drive and steer response typically reduce at increased longitudinal speed. Moreover, response to a brake, throttle or steer command is typically +nonlinear and may be subject to dead zones where response is constant with either zero or non-zero response. PxVehicleCommandNonLinearResponseParams allows +command responses to be authored as multi-variate piecewise polynomials with normalized command response a function of command value and longitudinal speed. +*/ +class PxVehicleCommandNonLinearResponseParams +{ +public: + + enum Enum + { + eMAX_NB_COMMAND_VALUES = 8 + }; + + PxVehicleCommandNonLinearResponseParams() + : nbSpeedResponses(0), + nbCommandValues(0) + { + } + + void clear() + { + nbCommandValues = 0; + nbSpeedResponses = 0; + } + + /** + \brief Add a table of normalised response vs speed and associated it with a specified command value. + \note commandValueSpeedResponses must be authored as a series of monotonically increasing series of speeds with form {speed, normalizedResponse} + \note The responses added must form a series of monotonically increasing commands. + */ + bool addResponse(const PxVehicleCommandValueResponseTable& commandValueSpeedResponses) + { + const PxReal commandValue = commandValueSpeedResponses.commandValue; + const PxReal* speeds = commandValueSpeedResponses.speedResponses.xVals; + const PxReal* responses = commandValueSpeedResponses.speedResponses.yVals; + const PxU16 nb = PxU16(commandValueSpeedResponses.speedResponses.nbDataPairs); + + PX_CHECK_AND_RETURN_VAL(commandValue >= 0.0f && commandValue <= 1.0f, "PxVehicleCommandAndResponseTable::commandValue must be in range (0,1)", false); + + PX_CHECK_AND_RETURN_VAL(nbCommandValues < eMAX_NB_COMMAND_VALUES, "PxVehicleNonLinearCommandResponse::addResponse - exceeded maximum number of command responses", false); + + PX_CHECK_AND_RETURN_VAL(((nbSpeedResponses + nb) <= PxVehicleCommandValueResponseTable::eMAX_NB_SPEED_RESPONSES), "PxVehicleNonLinearCommandResponse::addResponse - exceeded maximum number of command responses", false); + + PX_CHECK_AND_RETURN_VAL((0 == nbCommandValues) || (commandValue > commandValues[nbCommandValues - 1]), "PxVehicleNonLinearCommandResponse::addResponse - command must be part of a a monotonically increasing series", false); + + PX_CHECK_AND_RETURN_VAL(nb > 0, "PxVehicleNonLinearCommandResponse::addResponse - each command response must have at least 1 point", false); + +#if PX_CHECKED + for (PxU32 i = 1; i < nb; i++) + { + PX_CHECK_AND_RETURN_VAL(speeds[i] > speeds[i - 1], "PxVehicleNonLinearCommandResponse::addResponse - speeds array must be a monotonically increasing series", false); + PX_CHECK_AND_RETURN_VAL(responses[i] >= 0.0f && responses[i] <= 1.0f , "PxVehicleNonLinearCommandResponse::addResponse - response must be in range (0,1)", false); + } +#endif + + commandValues[nbCommandValues] = commandValue; + nbSpeedRenponsesPerCommandValue[nbCommandValues] = nb; + speedResponsesPerCommandValue[nbCommandValues] = nbSpeedResponses; + PxMemCopy(speedResponses + 2 * nbSpeedResponses, speeds, sizeof(PxReal)*nb); + PxMemCopy(speedResponses + 2 * nbSpeedResponses + nb, responses, sizeof(PxReal)*nb); + nbCommandValues++; + nbSpeedResponses += nb; + return true; + } + +public: + + /** + \brief A ragged array of speeds and normalized responses. + */ + PxReal speedResponses[PxVehicleCommandValueResponseTable::eMAX_NB_SPEED_RESPONSES * 2]; + + /** + \brief The number of speeds and normalized responses. + */ + PxU16 nbSpeedResponses; + + /** + \brief The table of speed responses for the ith command value begins at speedResponses[2*speedResponsesPerCommandValue[i]] + */ + PxU16 speedResponsesPerCommandValue[eMAX_NB_COMMAND_VALUES]; + + /** + \brief The ith command value has N speed responses with N = nbSpeedRenponsesPerCommandValue[i]. + */ + PxU16 nbSpeedRenponsesPerCommandValue[eMAX_NB_COMMAND_VALUES]; + + /** + \brief The command values. + */ + PxReal commandValues[eMAX_NB_COMMAND_VALUES]; + + /** + \brief The number of command values. + */ + PxU16 nbCommandValues; +}; + +/** +\brief A description of the per wheel response to an input command. +*/ +struct PxVehicleCommandResponseParams +{ + /** + \brief A nonlinear response to command value expressed as a lookup table of normalized response as a function of command value and longitudinal speed. + \note The effect of the default state of nonlinearResponse is a linear response to command value that is independent of longitudinal speed. + */ + PxVehicleCommandNonLinearResponseParams nonlinearResponse; + + /** + \brief A description of the per wheel response multiplier to an input command. + */ + PxReal wheelResponseMultipliers[PxVehicleLimits::eMAX_NB_WHEELS]; + + /** + \brief The maximum response that occurs when the wheel response multiplier has value 1.0 and nonlinearResponse is in the default state of linear response. + */ + PxF32 maxResponse; +}; + + + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/commands/PxVehicleCommandStates.h b/Source/ThirdParty/PhysX/vehicle2/commands/PxVehicleCommandStates.h new file mode 100644 index 000000000..6dec45eb3 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/commands/PxVehicleCommandStates.h @@ -0,0 +1,140 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxPreprocessor.h" +#include "foundation/PxSimpleTypes.h" +#include "foundation/PxMemory.h" +#include "vehicle2/PxVehicleLimits.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + + +/** +\brief A description of the state of commands that are applied to the vehicle +\note brakes[0] and brakes[1] may be used to distinguish brake and handbrake controls. +*/ +struct PxVehicleCommandState +{ + PxReal brakes[2]; //!< The instantaneous state of the brake controllers in range [0,1] with 1 denoting fully pressed and 0 fully depressed. + PxU32 nbBrakes; //|< The number of brake commands. + PxReal throttle; //!< The instantaneous state of the throttle controller in range [0,1] with 1 denoting fully pressed and 0 fully depressed. + PxReal steer; //!< The instantaneous state of the steer controller in range [-1,1]. + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleCommandState)); + } +}; + +/** +\brief A description of the state of transmission-related commands that are applied to a vehicle with direct drive. +*/ +struct PxVehicleDirectDriveTransmissionCommandState +{ + /** + \brief Direct drive vehicles only have reverse, neutral or forward gear. + */ + enum Enum + { + eREVERSE = 0, + eNEUTRAL, + eFORWARD + }; + + Enum gear; //!< The desired gear of the input gear controller. + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleDirectDriveTransmissionCommandState)); + } +}; + +/** +\brief A description of the state of transmission-related commands that are applied to a vehicle with engine drive. +*/ +struct PxVehicleEngineDriveTransmissionCommandState +{ + enum Enum + { + /** + \brief Special gear value to denote the automatic shift mode (often referred to as DRIVE). + + When using automatic transmission, setting this value as target gear will enable automatic + gear shifts between first and highest gear. If the current gear is a reverse gear or + the neutral gear, then this value will trigger a shift to first gear. If this value is + used even though there is no automatic transmission available, the gear state will remain + unchanged. + */ + eAUTOMATIC_GEAR = 0xff + }; + + PxReal clutch; //!< The instantaneous state of the clutch controller in range [0,1] with 1 denoting fully pressed and 0 fully depressed. + PxU32 targetGear; //!< The desired gear of the input gear controller. + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleEngineDriveTransmissionCommandState)); + } +}; + +/** +\brief A description of the state of transmission-related commands that are applied to a vehicle with tank drive. +*/ +struct PxVehicleTankDriveTransmissionCommandState : public PxVehicleEngineDriveTransmissionCommandState +{ + /** + \brief The wheels of each tank track are either all connected to thrusts[0] or all connected to thrusts[1]. + \note The thrust commands are used to divert torque from the engine to the wheels of the tank tracks controlled by each thrust. + \note thrusts[0] and thrusts[1] are in range [-1,1] with the sign dictating whether the thrust will be applied positively or negatively with respect to the gearing ratio. + */ + PxReal thrusts[2]; + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleTankDriveTransmissionCommandState)); + } +}; + + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/drivetrain/PxVehicleDrivetrainComponents.h b/Source/ThirdParty/PhysX/vehicle2/drivetrain/PxVehicleDrivetrainComponents.h new file mode 100644 index 000000000..75050de7b --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/drivetrain/PxVehicleDrivetrainComponents.h @@ -0,0 +1,802 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "vehicle2/PxVehicleFunctions.h" +#include "vehicle2/PxVehicleParams.h" +#include "vehicle2/PxVehicleComponent.h" + +#include "vehicle2/braking/PxVehicleBrakingFunctions.h" +#include "vehicle2/commands/PxVehicleCommandHelpers.h" +#include "vehicle2/rigidBody/PxVehicleRigidBodyStates.h" +#include "vehicle2/steering/PxVehicleSteeringFunctions.h" +#include "vehicle2/steering/PxVehicleSteeringParams.h" +#include "vehicle2/wheel/PxVehicleWheelStates.h" +#include "vehicle2/wheel/PxVehicleWheelParams.h" +#include "vehicle2/tire/PxVehicleTireStates.h" + +#include "PxVehicleDrivetrainStates.h" +#include "PxVehicleDrivetrainFunctions.h" + +#include "common/PxProfileZone.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +struct PxVehicleBrakeCommandResponseParams; +struct PxVehicleDirectDriveThrottleCommandResponseParams; + +/** +\brief Forward the applicable set of control values for a direct drive vehicle to a command response state for each +applicable control value. +\note The applicable control values are brake, handbrake, throttle and steer. +@see PxVehicleDirectDriveActuationStateComponent +@see PxVehicleDirectDrivetrainComponent +@see PxVehicleBrakeCommandLinearUpdate +@see PxVehicleDirectDriveThrottleLinearCommandUpdate +@see PxVehicleSteerCommandLinearUpdate +@see PxVehicleAckermannSteerUpdate +*/ +class PxVehicleDirectDriveCommandResponseComponent : public PxVehicleComponent +{ +public: + + PxVehicleDirectDriveCommandResponseComponent() : PxVehicleComponent() {} + virtual ~PxVehicleDirectDriveCommandResponseComponent() {} + + /** + \brief Provide vehicle data items for this component. + + \param[out] axleDescription identifies the wheels on each axle. + \param[out] brakeResponseParams An array of brake response parameters with a brake response for each brake command. + \param[out] throttleResponseParams The throttle response parameters. + \param[out] steerResponseParams The steer response parameters. + \param[out] ackermannParams The parameters defining Ackermann steering. NULL if no Ackermann steering is desired. + \param[out] commands The throttle, brake, steer etc. command states. + \param[out] transmissionCommands The transmission command state describing the current gear. + \param[out] rigidBodyState The state of the vehicle's rigid body. + \param[out] brakeResponseStates The resulting brake response states given the command input and brake response parameters. + \param[out] throttleResponseStates The resulting throttle response states given the command input and throttle response parameters. + \param[out] steerResponseStates The resulting steer response states given the command input, steer response and (optionally) Ackermann parameters. + */ + virtual void getDataForDirectDriveCommandResponseComponent( + const PxVehicleAxleDescription*& axleDescription, + PxVehicleSizedArrayData& brakeResponseParams, + const PxVehicleDirectDriveThrottleCommandResponseParams*& throttleResponseParams, + const PxVehicleSteerCommandResponseParams*& steerResponseParams, + PxVehicleSizedArrayData& ackermannParams, + const PxVehicleCommandState*& commands, const PxVehicleDirectDriveTransmissionCommandState*& transmissionCommands, + const PxVehicleRigidBodyState*& rigidBodyState, + PxVehicleArrayData& brakeResponseStates, + PxVehicleArrayData& throttleResponseStates, + PxVehicleArrayData& steerResponseStates) = 0; + + /** + \brief Compute a per wheel response to the input brake/handbrake/throttle/steer commands + and determine if there is an intention to accelerate the vehicle. + */ + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_UNUSED(dt); + PX_UNUSED(context); + + PX_PROFILE_ZONE("PxVehicleDirectDriveCommandResponseComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + PxVehicleSizedArrayData brakeResponseParams; + const PxVehicleDirectDriveThrottleCommandResponseParams* throttleResponseParams; + const PxVehicleSteerCommandResponseParams* steerResponseParams; + PxVehicleSizedArrayData ackermannParams; + const PxVehicleCommandState* commands; + const PxVehicleDirectDriveTransmissionCommandState* transmissionCommands; + const PxVehicleRigidBodyState* rigidBodyState; + PxVehicleArrayData brakeResponseStates; + PxVehicleArrayData throttleResponseStates; + PxVehicleArrayData steerResponseStates; + + getDataForDirectDriveCommandResponseComponent(axleDescription, + brakeResponseParams, throttleResponseParams, steerResponseParams, ackermannParams, + commands, transmissionCommands, + rigidBodyState, + brakeResponseStates, throttleResponseStates, steerResponseStates); + + const PxReal longitudinalSpeed = rigidBodyState->getLongitudinalSpeed(context.frame); + + for (PxU32 i = 0; i < axleDescription->nbWheels; i++) + { + const PxU32 wheelId = axleDescription->wheelIdsInAxleOrder[i]; + + PxVehicleBrakeCommandResponseUpdate( + commands->brakes, commands->nbBrakes, longitudinalSpeed, + wheelId, brakeResponseParams, + brakeResponseStates[wheelId]); + + PxVehicleDirectDriveThrottleCommandResponseUpdate( + commands->throttle, *transmissionCommands, longitudinalSpeed, + wheelId, *throttleResponseParams, + throttleResponseStates[wheelId]); + + PxVehicleSteerCommandResponseUpdate( + commands->steer, longitudinalSpeed, + wheelId, *steerResponseParams, + steerResponseStates[wheelId]); + } + if (ackermannParams.size > 0) + PxVehicleAckermannSteerUpdate( + commands->steer, + *steerResponseParams, ackermannParams, + steerResponseStates); + + return true; + } +}; + + +/** +\brief Determine the actuation state for each wheel of a direct drive vehicle. +\note The actuation state for each wheel contains a binary record of whether brake and drive torque are to be applied to the wheel. +@see PxVehicleDirectDriveCommandResponseComponent +@see PxVehicleDirectDrivetrainComponent +@see PxVehicleDirectDriveActuationStateUpdate +*/ +class PxVehicleDirectDriveActuationStateComponent : public PxVehicleComponent +{ +public: + + PxVehicleDirectDriveActuationStateComponent() : PxVehicleComponent() {} + virtual ~PxVehicleDirectDriveActuationStateComponent() {} + + + /** + \brief Provide vehicle data items for this component. + + \param[out] axleDescription identifies the wheels on each axle. + \param[out] brakeResponseStates The brake response states. + \param[out] throttleResponseStates The throttle response states. + \param[out] actuationStates The actuation states. + */ + virtual void getDataForDirectDriveActuationStateComponent( + const PxVehicleAxleDescription*& axleDescription, + PxVehicleArrayData& brakeResponseStates, + PxVehicleArrayData& throttleResponseStates, + PxVehicleArrayData& actuationStates) = 0; + + /** + \brief Compute the actuation state for each wheel given the brake, handbrake and throttle states. + \*/ + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_UNUSED(dt); + PX_UNUSED(context); + + PX_PROFILE_ZONE("PxVehicleDirectDriveActuationStateComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + PxVehicleArrayData brakeResponseStates; + PxVehicleArrayData throttleResponseStates; + PxVehicleArrayData actuationStates; + + getDataForDirectDriveActuationStateComponent( + axleDescription, + brakeResponseStates, throttleResponseStates, + actuationStates); + + for (PxU32 i = 0; i < axleDescription->nbWheels; i++) + { + const PxU32 wheelId = axleDescription->wheelIdsInAxleOrder[i]; + PxVehicleDirectDriveActuationStateUpdate( + brakeResponseStates[wheelId], throttleResponseStates[wheelId], + actuationStates[wheelId]); + } + + return true; + } +}; + +/** +\brief Forward integrate the angular speed of each wheel on a vehicle by integrating the +brake and drive torque applied to each wheel and the torque that develops on the tire as a response +to the longitudinal tire force. +@see PxVehicleDirectDriveUpdate +*/ +class PxVehicleDirectDrivetrainComponent : public PxVehicleComponent +{ +public: + + PxVehicleDirectDrivetrainComponent() : PxVehicleComponent() {} + virtual ~PxVehicleDirectDrivetrainComponent() {} + + virtual void getDataForDirectDrivetrainComponent( + const PxVehicleAxleDescription*& axleDescription, + PxVehicleArrayData& brakeResponseStates, + PxVehicleArrayData& throttleResponseStates, + PxVehicleArrayData& wheelParams, + PxVehicleArrayData& actuationStates, + PxVehicleArrayData& tireForces, + PxVehicleArrayData& wheelRigidBody1dStates) = 0; + + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_UNUSED(context); + + PX_PROFILE_ZONE("PxVehicleDirectDrivetrainComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + PxVehicleArrayData brakeResponseStates; + PxVehicleArrayData throttleResponseStates; + PxVehicleArrayData wheelParams; + PxVehicleArrayData actuationStates; + PxVehicleArrayData tireForces; + PxVehicleArrayData wheelRigidBody1dStates; + + getDataForDirectDrivetrainComponent(axleDescription, + brakeResponseStates, throttleResponseStates, + wheelParams, actuationStates, tireForces, + wheelRigidBody1dStates); + + for (PxU32 i = 0; i < axleDescription->nbWheels; i++) + { + const PxU32 wheelId = axleDescription->wheelIdsInAxleOrder[i]; + + PxVehicleDirectDriveUpdate( + wheelParams[wheelId], actuationStates[wheelId], + brakeResponseStates[wheelId], throttleResponseStates[wheelId], + tireForces[wheelId], + dt, + wheelRigidBody1dStates[wheelId]); + } + + return true; + } +}; + +/** +\brief Forward the applicable set of control values for a vehicle driven by an engine to a command response state for each +applicable control value. + +If parameters for an autobox are provided, the autobox will determine if a gear change should begin in order to +maintain a desired engine revs. + +@see PxVehicleBrakeCommandLinearUpdate +@see PxVehicleClutchCommandResponseLinearUpdate +@see PxVehicleEngineDriveThrottleCommandResponseUpdate +@see PxVehicleSteerCommandLinearUpdate +@see PxVehicleAckermannSteerUpdate +@see PxVehicleAutoBoxUpdate +@see PxVehicleGearCommandResponseUpdate +*/ +class PxVehicleEngineDriveCommandResponseComponent : public PxVehicleComponent +{ +public: + + PxVehicleEngineDriveCommandResponseComponent() : PxVehicleComponent() {} + virtual ~PxVehicleEngineDriveCommandResponseComponent() {} + + /** + \brief Provide vehicle data items for this component. + \param[out] axleDescription identifies the wheels on each axle. + \param[out] brakeResponseParams An array of brake response parameters with a brake response for each brake command. + \param[out] steerResponseParams The steer response parameters. + \param[out] ackermannParams The parameters defining Ackermann steering. NULL if no Ackermann steering is desired. + \param[out] gearboxParams The gearbox parameters. + \param[out] clutchResponseParams The clutch response parameters. + \param[out] engineParams The engine parameters. Only needed if an autobox is provided (see autoboxParams), else it can be set to NULL. + \param[out] engineState The engine state. Only needed if an autobox is provided (see autoboxParams), else it can be set to NULL. + \param[out] autoboxParams The autobox parameters. If not NULL, the autobox will determine the target gear. Requires the parameters + engineParams, engineState and autoboxState to be available. If no autobox is desired, NULL can be used in which case + the aforementioned additional parameters can be set to NULL too. + \param[out] rigidBodyState The state of the vehicle's rigid body. + \param[out] commands The throttle, brake, steer etc. command states. + \param[out] transmissionCommands The clutch, target gear etc. command states. If an autobox is provided (see autoboxParams) + and the target gear is set to PxVehicleEngineDriveTransmissionCommandState::eAUTOMATIC_GEAR, then the autobox will trigger + gear shifts. + \param[out] brakeResponseStates The resulting brake response states given the command input and brake response parameters. + \param[out] throttleResponseState The resulting throttle response to the input throttle command. + \param[out] steerResponseStates The resulting steer response states given the command input, steer response and (optionally) Ackermann parameters. + \param[out] gearboxResponseState The resulting gearbox response state given the command input and gearbox parameters. + \param[out] clutchResponseState The resulting clutch state given the command input and clutch response parameters. + \param[out] autoboxState The resulting autobox state given the autobox/engine/gear params and engine state. Only needed if an autobox is + provided (see autoboxParams), else it can be set to NULL. + */ + virtual void getDataForEngineDriveCommandResponseComponent( + const PxVehicleAxleDescription*& axleDescription, + PxVehicleSizedArrayData& brakeResponseParams, + const PxVehicleSteerCommandResponseParams*& steerResponseParams, + PxVehicleSizedArrayData& ackermannParams, + const PxVehicleGearboxParams*& gearboxParams, + const PxVehicleClutchCommandResponseParams*& clutchResponseParams, + const PxVehicleEngineParams*& engineParams, + const PxVehicleRigidBodyState*& rigidBodyState, + const PxVehicleEngineState*& engineState, + const PxVehicleAutoboxParams*& autoboxParams, + const PxVehicleCommandState*& commands, + const PxVehicleEngineDriveTransmissionCommandState*& transmissionCommands, + PxVehicleArrayData& brakeResponseStates, + PxVehicleEngineDriveThrottleCommandResponseState*& throttleResponseState, + PxVehicleArrayData& steerResponseStates, + PxVehicleGearboxState*& gearboxResponseState, + PxVehicleClutchCommandResponseState*& clutchResponseState, + PxVehicleAutoboxState*& autoboxState) = 0; + + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_UNUSED(dt); + PX_UNUSED(context); + + PX_PROFILE_ZONE("PxVehicleEngineDriveCommandResponseComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + PxVehicleSizedArrayData brakeResponseParams; + const PxVehicleSteerCommandResponseParams* steerResponseParams; + PxVehicleSizedArrayData ackermannParams; + const PxVehicleGearboxParams* gearboxParams; + const PxVehicleClutchCommandResponseParams* clutchResponseParams; + const PxVehicleEngineParams* engineParams; + const PxVehicleRigidBodyState* rigidBodyState; + const PxVehicleEngineState* engineState; + const PxVehicleAutoboxParams* autoboxParams; + const PxVehicleCommandState* commands; + const PxVehicleEngineDriveTransmissionCommandState* transmissionCommands; + PxVehicleArrayData brakeResponseStates; + PxVehicleEngineDriveThrottleCommandResponseState* throttleResponseState; + PxVehicleArrayData steerResponseStates; + PxVehicleGearboxState* gearboxResponseState; + PxVehicleClutchCommandResponseState* clutchResponseState; + PxVehicleAutoboxState* autoboxState; + + getDataForEngineDriveCommandResponseComponent(axleDescription, + brakeResponseParams, steerResponseParams, ackermannParams, + gearboxParams, clutchResponseParams, engineParams, rigidBodyState, + engineState, autoboxParams, + commands, transmissionCommands, + brakeResponseStates, throttleResponseState, + steerResponseStates, + gearboxResponseState, clutchResponseState, autoboxState); + + //The autobox can modify commands like throttle and target gear. Since the user defined + //values should not be overwritten, a copy is used to compute the response. + PxVehicleCommandState commandsTmp = *commands; + PxVehicleEngineDriveTransmissionCommandState transmissionCommandsTmp = *transmissionCommands; + + const PxReal longitudinalSpeed = rigidBodyState->getLongitudinalSpeed(context.frame); + + //Let the autobox set the target gear, unless the user defined target gear requests + //a shift already + if (autoboxParams) + { + PX_ASSERT(engineParams); + PX_ASSERT(engineState); + PX_ASSERT(autoboxState); + + PxVehicleAutoBoxUpdate( + *engineParams, *gearboxParams, *autoboxParams, + *engineState, *gearboxResponseState, dt, + transmissionCommandsTmp.targetGear, *autoboxState, commandsTmp.throttle); + } + else if (transmissionCommandsTmp.targetGear == PxVehicleEngineDriveTransmissionCommandState::eAUTOMATIC_GEAR) + { + //If there is no autobox but eAUTOMATIC_GEAR was specified, use the current target gear + transmissionCommandsTmp.targetGear = gearboxResponseState->targetGear; + } + + //Distribute brake torque to the wheels across each axle. + for (PxU32 i = 0; i < axleDescription->nbWheels; i++) + { + const PxU32 wheelId = axleDescription->wheelIdsInAxleOrder[i]; + PxVehicleBrakeCommandResponseUpdate( + commandsTmp.brakes, commandsTmp.nbBrakes, longitudinalSpeed, + wheelId, brakeResponseParams, + brakeResponseStates[i]); + } + + //Update target gear as required. + PxVehicleGearCommandResponseUpdate( + transmissionCommandsTmp.targetGear, + *gearboxParams, + *gearboxResponseState); + + //Compute the response to the clutch command. + PxVehicleClutchCommandResponseLinearUpdate( + transmissionCommandsTmp.clutch, + *clutchResponseParams, + *clutchResponseState); + + //Compute the response to the throttle command. + PxVehicleEngineDriveThrottleCommandResponseLinearUpdate( + commandsTmp, + *throttleResponseState); + + //Update the steer angles and Ackermann correction. + for (PxU32 i = 0; i < axleDescription->nbWheels; i++) + { + const PxU32 wheelId = axleDescription->wheelIdsInAxleOrder[i]; + PxVehicleSteerCommandResponseUpdate(commandsTmp.steer, longitudinalSpeed, wheelId, *steerResponseParams, steerResponseStates[i]); + } + if (ackermannParams.size > 0) + PxVehicleAckermannSteerUpdate(commandsTmp.steer, *steerResponseParams, ackermannParams, steerResponseStates); + + return true; + } +}; + +/** +\brief Compute the per wheel drive torque split of a multi-wheel drive differential. +@see PxVehicleDifferentialStateUpdate +*/ +class PxVehicleMultiWheelDriveDifferentialStateComponent : public PxVehicleComponent +{ +public: + + PxVehicleMultiWheelDriveDifferentialStateComponent() : PxVehicleComponent() {} + virtual ~PxVehicleMultiWheelDriveDifferentialStateComponent() {} + + virtual void getDataForMultiWheelDriveDifferentialStateComponent( + const PxVehicleAxleDescription*& axleDescription, + const PxVehicleMultiWheelDriveDifferentialParams*& differentialParams, + PxVehicleDifferentialState*& differentialState) = 0; + + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_UNUSED(dt); + PX_UNUSED(context); + + PX_PROFILE_ZONE("PxVehicleMultiWheelDriveDifferentialStateComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + const PxVehicleMultiWheelDriveDifferentialParams* differentialParams; + PxVehicleDifferentialState* differentialState; + + getDataForMultiWheelDriveDifferentialStateComponent(axleDescription, + differentialParams, differentialState); + + PxVehicleDifferentialStateUpdate( + *axleDescription, + *differentialParams, + *differentialState); + + return true; + } +}; + +/** +\brief Compute the per wheel drive torque split of a differential delivering torque to multiple wheels +with limited slip applied to specified wheel pairs. +@see PxVehicleDifferentialStateUpdate +*/ +class PxVehicleFourWheelDriveDifferentialStateComponent : public PxVehicleComponent +{ +public: + + PxVehicleFourWheelDriveDifferentialStateComponent() : PxVehicleComponent() {} + virtual ~PxVehicleFourWheelDriveDifferentialStateComponent() {} + + virtual void getDataForFourWheelDriveDifferentialStateComponent( + const PxVehicleAxleDescription*& axleDescription, + const PxVehicleFourWheelDriveDifferentialParams*& differentialParams, + PxVehicleArrayData& wheelRigidbody1dStates, + PxVehicleDifferentialState*& differentialState, + PxVehicleWheelConstraintGroupState*& wheelConstraintGroupState) = 0; + + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_UNUSED(dt); + PX_UNUSED(context); + + PX_PROFILE_ZONE("PxVehicleFourWheelDriveDifferentialStateComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + const PxVehicleFourWheelDriveDifferentialParams* differentialParams; + PxVehicleArrayData wheelRigidbody1dStates; + PxVehicleDifferentialState* differentialState; + PxVehicleWheelConstraintGroupState* wheelConstraintGroupState; + + getDataForFourWheelDriveDifferentialStateComponent(axleDescription, differentialParams, + wheelRigidbody1dStates, + differentialState, wheelConstraintGroupState); + + PxVehicleDifferentialStateUpdate( + *axleDescription, *differentialParams, + wheelRigidbody1dStates, dt, + *differentialState, *wheelConstraintGroupState); + + return true; + } +}; + +/** +\brief Compute the per wheel drive torque split of a tank drive differential. +@see PxVehicleDifferentialStateUpdate +*/ +class PxVehicleTankDriveDifferentialStateComponent : public PxVehicleComponent +{ +public: + + PxVehicleTankDriveDifferentialStateComponent() : PxVehicleComponent() {} + virtual ~PxVehicleTankDriveDifferentialStateComponent() {} + + /** + \brief Provide vehicle data items for this component. + + \param[out] axleDescription identifies the wheels on each axle. + \param[out] transmissionCommands specifies the values of the thrust controllers that divert torque to the tank tracks. + \param[out] wheelParams is an array describing the radius of each wheel. + \param[out] differentialParams describes the operation of the tank differential by + specifying the default torque split between all wheels connected to the differential and by + specifying the wheels coupled to each tank track. + \param[out] differentialState stores the instantaneous torque split between all wheels arising from the difference between the thrust controllers. + \param[out] constraintGroupState stores the groups of wheels that are connected by sharing a tank track. + */ + virtual void getDataForTankDriveDifferentialStateComponent( + const PxVehicleAxleDescription*& axleDescription, + const PxVehicleTankDriveTransmissionCommandState*& transmissionCommands, + PxVehicleArrayData& wheelParams, + const PxVehicleTankDriveDifferentialParams*& differentialParams, + PxVehicleDifferentialState*& differentialState, + PxVehicleWheelConstraintGroupState*& constraintGroupState) = 0; + + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_UNUSED(dt); + PX_UNUSED(context); + + PX_PROFILE_ZONE("PxVehicleTankDriveDifferentialStateComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + const PxVehicleTankDriveTransmissionCommandState* transmissionCommands; + PxVehicleArrayData wheelParams; + const PxVehicleTankDriveDifferentialParams* differentialParams; + PxVehicleDifferentialState* differentialState; + PxVehicleWheelConstraintGroupState* constraintGroupState; + + getDataForTankDriveDifferentialStateComponent( + axleDescription, + transmissionCommands, + wheelParams, + differentialParams, + differentialState, constraintGroupState); + + PxVehicleDifferentialStateUpdate( + *axleDescription, + wheelParams, *differentialParams, + transmissionCommands->thrusts[0], transmissionCommands->thrusts[1], + *differentialState, *constraintGroupState); + + return true; + } +}; + +/** +@deprecated + +\brief Compute the per wheel drive torque split of a four wheel drive differential. +@see PxVehicleDifferentialStateUpdate +*/ +class PX_DEPRECATED PxVehicleLegacyFourWheelDriveDifferentialStateComponent : public PxVehicleComponent +{ +public: + + PxVehicleLegacyFourWheelDriveDifferentialStateComponent() : PxVehicleComponent() {} + virtual ~PxVehicleLegacyFourWheelDriveDifferentialStateComponent() {} + + virtual void getDataForLegacyFourWheelDriveDifferentialStateComponent( + const PxVehicleAxleDescription*& axleDescription, + const PxVehicleFourWheelDriveDifferentialLegacyParams*& differentialParams, + PxVehicleArrayData& wheelRigidbody1dStates, + PxVehicleDifferentialState*& differentialState) = 0; + + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_UNUSED(dt); + PX_UNUSED(context); + + PX_PROFILE_ZONE("PxVehicleLegacyFourWheelDriveDifferentialStateComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + const PxVehicleFourWheelDriveDifferentialLegacyParams* differentialParams; + PxVehicleArrayData wheelRigidbody1dStates; + PxVehicleDifferentialState* differentialState; + + getDataForLegacyFourWheelDriveDifferentialStateComponent(axleDescription, differentialParams, + wheelRigidbody1dStates, + differentialState); + + PxVehicleDifferentialStateUpdate( + *differentialParams, wheelRigidbody1dStates, + *differentialState); + + return true; + } +}; + +/** +\brief Determine the actuation state for each wheel for a vehicle propelled by engine torque. +\note The actuation state for each wheel contains a binary record of whether brake and drive torque are to be applied to the wheel. +@see PxVehicleEngineDriveActuationStateUpdate +*/ +class PxVehicleEngineDriveActuationStateComponent : public PxVehicleComponent +{ +public: + + PxVehicleEngineDriveActuationStateComponent() : PxVehicleComponent() {} + virtual ~PxVehicleEngineDriveActuationStateComponent() {} + + virtual void getDataForEngineDriveActuationStateComponent( + const PxVehicleAxleDescription*& axleDescription, + const PxVehicleGearboxParams*& gearboxParams, + PxVehicleArrayData& brakeResponseStates, + const PxVehicleEngineDriveThrottleCommandResponseState*& throttleResponseState, + const PxVehicleGearboxState*& gearboxState, + const PxVehicleDifferentialState*& differentialState, + const PxVehicleClutchCommandResponseState*& clutchResponseState, + PxVehicleArrayData& actuationStates) = 0; + + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_UNUSED(dt); + PX_UNUSED(context); + + PX_PROFILE_ZONE("PxVehicleEngineDriveActuationStateComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + const PxVehicleGearboxParams* gearboxParams; + PxVehicleArrayData brakeResponseStates; + const PxVehicleEngineDriveThrottleCommandResponseState* throttleResponseState; + const PxVehicleGearboxState* gearboxState; + const PxVehicleDifferentialState* differentialState; + const PxVehicleClutchCommandResponseState* clutchResponseState; + PxVehicleArrayData actuationStates; + + getDataForEngineDriveActuationStateComponent(axleDescription, gearboxParams, + brakeResponseStates, throttleResponseState, + gearboxState, differentialState, clutchResponseState, + actuationStates); + + PxVehicleEngineDriveActuationStateUpdate( + *axleDescription, + *gearboxParams, + brakeResponseStates, + *throttleResponseState, + *gearboxState, *differentialState, *clutchResponseState, + actuationStates); + + return true; + } +}; + +/** +\brief Forward integrate the angular speed of each wheel and of the engine, accounting for the +state of the clutch, gearbox and differential. +@see PxVehicleGearboxUpdate +@see PxVehicleEngineDrivetrainUpdate +*/ +class PxVehicleEngineDrivetrainComponent : public PxVehicleComponent +{ +public: + + PxVehicleEngineDrivetrainComponent() : PxVehicleComponent() {} + virtual ~PxVehicleEngineDrivetrainComponent() {} + + /** + \brief Provide vehicle data items for this component. + + \param[out] axleDescription identifies the wheels on each axle. + \param[out] wheelParams specifies the radius of each wheel. + \param[out] engineParams specifies the engine's torque curve, idle revs and max revs. + \param[out] clutchParams specifies the maximum strength of the clutch. + \param[out] gearboxParams specifies the gear ratio of each gear. + \param[out] brakeResponseStates stores the instantaneous brake brake torque to apply to each wheel. + \param[out] actuationStates stores whether a brake and/or drive torque are to be applied to each wheel. + \param[out] tireForces stores the lateral and longitudinal tire force that has developed on each tire. + \param[out] throttleResponseState stores the response of the throttle to the input throttle command. + \param[out] clutchResponseState stores the instantaneous clutch strength that arises from the input clutch command. + \param[out] differentialState stores the instantaneous torque split between the wheels. + \param[out] constraintGroupState stores the groups of wheels that are subject to constraints that require them to have the same angular or linear velocity. + \param[out] wheelRigidBody1dStates stores the per wheel angular speed to be computed by the component. + \param[out] engineState stores the engine rotation speed to be computed by the component. + \param[out] gearboxState stores the state of the gearbox to be computed by the component. + \param[out] clutchState stores the clutch slip to be computed by the component. + \note If constraintGroupState is set to NULL it is assumed that there are no requirements for any wheels to have the same angular or linear velocity. + */ + virtual void getDataForEngineDrivetrainComponent( + const PxVehicleAxleDescription*& axleDescription, + PxVehicleArrayData& wheelParams, + const PxVehicleEngineParams*& engineParams, + const PxVehicleClutchParams*& clutchParams, + const PxVehicleGearboxParams*& gearboxParams, + PxVehicleArrayData& brakeResponseStates, + PxVehicleArrayData& actuationStates, + PxVehicleArrayData& tireForces, + const PxVehicleEngineDriveThrottleCommandResponseState*& throttleResponseState, + const PxVehicleClutchCommandResponseState*& clutchResponseState, + const PxVehicleDifferentialState*& differentialState, + const PxVehicleWheelConstraintGroupState*& constraintGroupState, + PxVehicleArrayData& wheelRigidBody1dStates, + PxVehicleEngineState*& engineState, + PxVehicleGearboxState*& gearboxState, + PxVehicleClutchSlipState*& clutchState) = 0; + + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_UNUSED(context); + + PX_PROFILE_ZONE("PxVehicleEngineDrivetrainComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + PxVehicleArrayData wheelParams; + const PxVehicleEngineParams* engineParams; + const PxVehicleClutchParams* clutchParams; + const PxVehicleGearboxParams* gearboxParams; + PxVehicleArrayData brakeResponseStates; + PxVehicleArrayData actuationStates; + PxVehicleArrayData tireForces; + const PxVehicleEngineDriveThrottleCommandResponseState* throttleResponseState; + const PxVehicleClutchCommandResponseState* clutchResponseState; + const PxVehicleDifferentialState* differentialState; + const PxVehicleWheelConstraintGroupState* constraintGroupState; + PxVehicleArrayData wheelRigidBody1dStates; + PxVehicleEngineState* engineState; + PxVehicleGearboxState* gearboxState; + PxVehicleClutchSlipState* clutchState; + + getDataForEngineDrivetrainComponent(axleDescription, wheelParams, + engineParams, clutchParams, gearboxParams, + brakeResponseStates, actuationStates, tireForces, + throttleResponseState, clutchResponseState, differentialState, constraintGroupState, + wheelRigidBody1dStates, engineState, gearboxState, clutchState); + + PxVehicleGearboxUpdate(*gearboxParams, dt, *gearboxState); + + PxVehicleEngineDrivetrainUpdate( + *axleDescription, + wheelParams, + *engineParams, *clutchParams, *gearboxParams, + brakeResponseStates, actuationStates, + tireForces, + *gearboxState, *throttleResponseState, *clutchResponseState, *differentialState, constraintGroupState, + dt, + wheelRigidBody1dStates, *engineState, *clutchState); + + return true; + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/drivetrain/PxVehicleDrivetrainFunctions.h b/Source/ThirdParty/PhysX/vehicle2/drivetrain/PxVehicleDrivetrainFunctions.h new file mode 100644 index 000000000..33bef117f --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/drivetrain/PxVehicleDrivetrainFunctions.h @@ -0,0 +1,318 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxSimpleTypes.h" +#include "vehicle2/PxVehicleParams.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +struct PxVehicleCommandState; +struct PxVehicleDirectDriveTransmissionCommandState; +struct PxVehicleEngineDriveTransmissionCommandState; +struct PxVehicleDirectDriveThrottleCommandResponseParams; +struct PxVehicleWheelActuationState; +struct PxVehicleWheelParams; +struct PxVehicleTireForce; +struct PxVehicleWheelRigidBody1dState; +struct PxVehicleEngineParams; +struct PxVehicleGearboxParams; +struct PxVehicleAutoboxParams; +struct PxVehicleEngineState; +struct PxVehicleGearboxState; +struct PxVehicleAutoboxState; +struct PxVehicleClutchCommandResponseParams; +struct PxVehicleClutchCommandResponseState; +struct PxVehicleEngineDriveThrottleCommandResponseState; +struct PxVehicleDifferentialState; +struct PxVehicleMultiWheelDriveDifferentialParams; +struct PxVehicleFourWheelDriveDifferentialParams; +struct PxVehicleTankDriveDifferentialParams; +struct PxVehicleFourWheelDriveDifferentialLegacyParams; +struct PxVehicleClutchParams; +struct PxVehicleWheelConstraintGroupState; +struct PxVehicleClutchSlipState; + +/** +\brief Compute the drive torque response to a throttle command. +\param[in] throttle is the throttle command. +\param[in] transmissionCommands is the gearing command to apply to the direct drive tranmission. +\param[in] longitudinalSpeed is the longitudinal speed of the vehicle's rigid body. +\param[in] wheelId specifies the wheel that is to have its throttle response computed. +\param[in] throttleResponseParams specifies the per wheel drive torque response to the throttle command as a nonlinear function of throttle command and longitudinal speed. +\param[out] throttleResponseState is the drive torque response to the input throttle command. +*/ +void PxVehicleDirectDriveThrottleCommandResponseUpdate +(const PxReal throttle, const PxVehicleDirectDriveTransmissionCommandState& transmissionCommands, const PxReal longitudinalSpeed, + const PxU32 wheelId, const PxVehicleDirectDriveThrottleCommandResponseParams& throttleResponseParams, + PxReal& throttleResponseState); + +/** +\brief Determine the actuation state of a wheel given the brake torque, handbrake torque and drive torque applied to it. +\param[in] brakeTorque is the brake torque to be applied to the wheel. +\param[in] driveTorque is the drive torque to be applied to the wheel. +\param[out] actuationState contains a binary record of whether brake or drive torque is applied to the wheel. +*/ +void PxVehicleDirectDriveActuationStateUpdate +(const PxReal brakeTorque, const PxReal driveTorque, + PxVehicleWheelActuationState& actuationState); + +/** +\brief Forward integrate the angular speed of a wheel given the brake and drive torque applied to it +\param[in] wheelParams specifies the moment of inertia of the wheel. +\param[in] actuationState is a binary record of whether brake and drive torque are to be applied to the wheel. +\param[in] brakeTorque is the brake torque to be applied to the wheel. +\param[in] driveTorque is the drive torque to be applied to the wheel. +\param[in] tireForce specifies the torque to apply to the wheel as a response to the longitudinal tire force. +\param[in] dt is the timestep of the forward integration. +\param[out] wheelRigidBody1dState describes the angular speed of the wheel. +*/ +void PxVehicleDirectDriveUpdate +(const PxVehicleWheelParams& wheelParams, + const PxVehicleWheelActuationState& actuationState, + const PxReal brakeTorque, const PxReal driveTorque, const PxVehicleTireForce& tireForce, + const PxF32 dt, + PxVehicleWheelRigidBody1dState& wheelRigidBody1dState); + +/** +\param[in] engineParams specifies the engine configuration. +\param[in] gearboxParams specifies the gear ratios and the time required to complete a gear change. +\param[in] autoboxParams specifies the conditions for switching gear. +\param[in] engineState contains the current angular speed of the engine. +\param[in] gearboxState describes the current and target gear. +\param[in] dt is the time that has lapsed since the last call to PxVehicleAutoBoxUpdate. +\param[in,out] targetGearCommand specifies the desired target gear for the gearbox. If set to + PxVehicleEngineDriveTransmissionCommandState::eAUTOMATIC_GEAR, the value will get overwritten + with a target gear chosen by the autobox. +\param[out] autoboxState specifies the time that has lapsed since the last automated gear change and contains a record of +any ongoing automated gear change. +\param[out] throttle A throttle command value in [0, 1] that will be set to 0 if a gear change is initiated or is ongoing. + +\note The autobox will not begin a gear change if a gear change is already ongoing. +\note The autobox will not begin a gear change until a threshold time has lapsed since the last automated gear change. +\note A gear change is considered as ongoing for as long as PxVehicleGearboxState::currentGear is different from + PxVehicleGearboxState::targetGear. +\note The autobox will not shift down from 1st gear or up from reverse gear. +\note The autobox shifts in single gear increments or decrements. +\note The autobox instantiates a gear change by setting PxVehicleCommandState::targetGear to be different from +from PxVehicleGearboxState::currentGear +*/ +void PxVehicleAutoBoxUpdate +(const PxVehicleEngineParams& engineParams, const PxVehicleGearboxParams& gearboxParams, const PxVehicleAutoboxParams& autoboxParams, + const PxVehicleEngineState& engineState, const PxVehicleGearboxState& gearboxState, + const PxReal dt, + PxU32& targetGearCommand, PxVehicleAutoboxState& autoboxState, + PxReal& throttle); + +/** +\brief Propagate input gear commands to the gearbox state. +\param[in] targetGearCommand specifies the target gear for the gearbox. +\param[in] gearboxParams specifies the number of gears and the index of neutral gear. +\param[out] gearboxState contains a record of the current and target gear. +\note Any ongoing gear change must complete before starting another. +\note A gear change is considered as ongoing for as long as PxVehicleGearboxState::currentGear is different from + PxVehicleGearboxState::targetGear. + \note The gearbox remains in neutral for the duration of the gear change. + \note A gear change begins if PxVehicleCommandState::targetGear is different from PxVehicleGearboxState::currentGear. +*/ +void PxVehicleGearCommandResponseUpdate +(const PxU32 targetGearCommand, + const PxVehicleGearboxParams& gearboxParams, + PxVehicleGearboxState& gearboxState); + +/** +\brief Propagate the input clutch command to the clutch response state. +\param[in] clutchCommand specifies the state of the clutch pedal. +\param[in] clutchResponseParams specifies how the clutch responds to the input clutch command. +\param[out] clutchResponse specifies the response of the clutch to the input clutch command. +*/ +void PxVehicleClutchCommandResponseLinearUpdate +(const PxReal clutchCommand, + const PxVehicleClutchCommandResponseParams& clutchResponseParams, + PxVehicleClutchCommandResponseState& clutchResponse); + +/** +\brief Propagate the input throttle command to the throttle response state. +\param[in] commands specifies the state of the throttle pedal. +\param[out] throttleResponse specifies how the clutch responds to the input throttle command. +*/ +void PxVehicleEngineDriveThrottleCommandResponseLinearUpdate +(const PxVehicleCommandState& commands, + PxVehicleEngineDriveThrottleCommandResponseState& throttleResponse); + +/** +\brief Determine the actuation state of all wheels on a vehicle. +\param[in] axleDescription is a decription of the axles of the vehicle and the wheels on each axle. +\param[in] gearboxParams specifies the index of the neutral gear of the gearbox. +\param[in] brakeResponseStates specifies the response of each wheel to the input brake command. +\param[in] throttleResponseState specifies the response of the engine to the input throttle command. +\param[in] gearboxState specifies the current gear. +\param[in] diffState specifies the fraction of available drive torque to be delivered to each wheel. +\param[in] clutchResponseState specifies the response of the clutch to the input throttle command. +\param[out] actuationStates is an array of binary records determining whether brake and drive torque are to be applied to each wheel. +\note Drive torque is not applied to a wheel if + a) the gearbox is in neutral + b) the differential delivers no torque to the wheel + c) no throttle is applied to the engine + c) the clutch is fully disengaged. +*/ +void PxVehicleEngineDriveActuationStateUpdate +(const PxVehicleAxleDescription& axleDescription, + const PxVehicleGearboxParams& gearboxParams, + const PxVehicleArrayData& brakeResponseStates, + const PxVehicleEngineDriveThrottleCommandResponseState& throttleResponseState, + const PxVehicleGearboxState& gearboxState, const PxVehicleDifferentialState& diffState, const PxVehicleClutchCommandResponseState& clutchResponseState, + PxVehicleArrayData& actuationStates); + +/** +@deprecated + +\brief Compute the fraction of available torque to be delivered to each wheel and gather a list of all +wheels connected to the differential. +\param[in] diffParams specifies the operation of a differential that can be connected to up to four wheels. +\param[in] wheelStates describes the angular speed of each wheel +\param[out] diffState contains the fraction of available drive torque to be delivered to each wheel. +\note If the handbrake is on then torque is only delivered to the wheels specified as the front wheels of the differential. +*/ +void PX_DEPRECATED PxVehicleDifferentialStateUpdate +(const PxVehicleFourWheelDriveDifferentialLegacyParams& diffParams, + const PxVehicleArrayData& wheelStates, + PxVehicleDifferentialState& diffState); + +/** +\brief Compute the fraction of available torque to be delivered to each wheel and gather a list of all +wheels connected to the differential. Additionally, add wheel constraints for wheel pairs whose +rotational speed ratio exceeds the corresponding differential bias. +\param[in] axleDescription is a decription of the axles of the vehicle and the wheels on each axle. +\param[in] diffParams describe the division of available drive torque and the biases of the limited +slip differential. +\param[in] wheelStates describes the rotational speeds of each wheel. +\param[in] dt is the simulation time that has passes since the last call to PxVehicleDifferentialStateUpdate() +\param[out] diffState contains the fraction of available drive torque to be delivered to each wheel. +\param[out] wheelConstraintGroupState describes the groups of wheels that have exceeded their corresponding +differential biases. +*/ +void PxVehicleDifferentialStateUpdate +(const PxVehicleAxleDescription& axleDescription, const PxVehicleFourWheelDriveDifferentialParams& diffParams, + const PxVehicleArrayData& wheelStates, + const PxReal dt, + PxVehicleDifferentialState& diffState, PxVehicleWheelConstraintGroupState& wheelConstraintGroupState); + +/** +\brief Compute the fraction of available torque to be delivered to each wheel and gather a list of all +wheels connected to the differential. +\param[in] axleDescription is a decription of the axles of the vehicle and the wheels on each axle. +\param[in] diffParams specifies the operation of a differential that can be connected to any combination of wheels. +\param[out] diffState contains the fraction of available drive torque to be delivered to each wheel connected to the differential. +*/ +void PxVehicleDifferentialStateUpdate +(const PxVehicleAxleDescription& axleDescription, const PxVehicleMultiWheelDriveDifferentialParams& diffParams, + PxVehicleDifferentialState& diffState); + +/** +\brief Compute the fraction of available torque to be delivered to each wheel and gather a list of all +wheels connected to the differential. +\param[in] axleDescription is a decription of the axles of the vehicle and the wheels on each axle. +\param[in] wheelParams is an array that describes the wheel radius of each wheel. +\param[in] diffParams specifies the operation of a tank differential. +\param[in] thrustCommand0 is the state of one of the two thrust controllers. +\param[in] thrustCommand1 is the state of one of the two thrust controllers. +\param[out] diffState contains the fraction of available drive torque to be delivered to each wheel connected to the differential. +\param[out] wheelConstraintGroupState describes the groups of wheels connected by sharing a tank track. +*/ +void PxVehicleDifferentialStateUpdate +(const PxVehicleAxleDescription& axleDescription, + const PxVehicleArrayData& wheelParams, const PxVehicleTankDriveDifferentialParams& diffParams, + const PxReal thrustCommand0, PxReal thrustCommand1, + PxVehicleDifferentialState& diffState, PxVehicleWheelConstraintGroupState& wheelConstraintGroupState); + + +/** +\brief Update the current gear of the gearbox. If a gear change is ongoing then complete the gear change if a threshold +time has passed since the beginning of the gear change. +\param[in] gearboxParams describes the time required to complete a gear change. +\param[in] dt is the time that has lapsed since the last call to PxVehicleGearboxUpdate. +\param[out] gearboxState is the gearbox state to be updated. +\note A gear change is considered as ongoing for as long as PxVehicleGearboxState::currentGear is different from + PxVehicleGearboxState::targetGear. +*/ +void PxVehicleGearboxUpdate +(const PxVehicleGearboxParams& gearboxParams, + const PxF32 dt, + PxVehicleGearboxState& gearboxState); + +/** +\brief Forward integrate the angular speed of the vehicle's wheels and engine, given the state of clutch, differential and gearbox. +\param[in] axleDescription is a decription of the axles of the vehicle and the wheels on each axle. +\param[in] wheelParams specifies the moment of inertia of each wheel. +\param[in] engineParams specifies the torque curve of the engine and its moment of inertia. +\param[in] clutchParams specifies the maximum clutch strength that happens when the clutch is fully engaged. +\param[in] gearboxParams specifies the gearing ratios of the gearbox. +\param[in] brakeResponseStates describes the per wheel response to the input brake command. +\param[in] actuationStates is a binary record of whether brake or drive torque is applied to each wheel. +\param[in] tireForces describes the torque to apply to each wheel as a response to the longitudinal tire force. +\param[in] gearboxState describes the current gear. +\param[in] throttleResponse describes the engine response to the input throttle pedal. +\param[in] clutchResponse describes the clutch response to the input clutch pedal. +\param[in] diffState describes the fraction of available drive torque to be delivered to each wheel. +\param[in] constraintGroupState describes groups of wheels with rotational speed constrained to the same value. +\param[in] dt is the time that has lapsed since the last call to PxVehicleEngineDrivetrainUpdate +\param[out] wheelRigidbody1dStates describes the angular speed of each wheel. +\param[out] engineState describes the angular speed of the engine. +\param[out] clutchState describes the clutch slip. +\note If constraintGroupState is NULL then it is assumed that there are no wheels subject to rotational speed constraints. +*/ +void PxVehicleEngineDrivetrainUpdate +(const PxVehicleAxleDescription& axleDescription, + const PxVehicleArrayData& wheelParams, + const PxVehicleEngineParams& engineParams, const PxVehicleClutchParams& clutchParams, const PxVehicleGearboxParams& gearboxParams, + const PxVehicleArrayData& brakeResponseStates, + const PxVehicleArrayData& actuationStates, + const PxVehicleArrayData& tireForces, + const PxVehicleGearboxState& gearboxState, const PxVehicleEngineDriveThrottleCommandResponseState& throttleResponse, const PxVehicleClutchCommandResponseState& clutchResponse, + const PxVehicleDifferentialState& diffState, const PxVehicleWheelConstraintGroupState* constraintGroupState, + const PxReal dt, + PxVehicleArrayData& wheelRigidbody1dStates, + PxVehicleEngineState& engineState, PxVehicleClutchSlipState& clutchState); + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/drivetrain/PxVehicleDrivetrainHelpers.h b/Source/ThirdParty/PhysX/vehicle2/drivetrain/PxVehicleDrivetrainHelpers.h new file mode 100644 index 000000000..908e5a922 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/drivetrain/PxVehicleDrivetrainHelpers.h @@ -0,0 +1,160 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "vehicle2/drivetrain/PxVehicleDrivetrainParams.h" +#include "vehicle2/drivetrain/PxVehicleDrivetrainStates.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +struct PxVehicleWheelRigidBody1dState; + +/** +\brief Compute the coupling strength of the clutch. +\param[in] clutchResponseState describes the response of the clutch to the input clutch command. +\param[in] gearboxParams holds the index of neutral gear. +\param[in] gearboxState describes the current gear. +\note If the gear is in neutral the clutch is fully disengaged and the clutch strength is 0. +\note A clutch response state of 0.0 denotes a fully engaged clutch with maximum strength. +\note A clutch response state of 1.0 denotes a fully disengaged clutch with a strength of 0.0. +*/ +PX_FORCE_INLINE PxReal PxVehicleClutchStrengthCompute(const PxVehicleClutchCommandResponseState& clutchResponseState, const PxVehicleGearboxParams& gearboxParams, const PxVehicleGearboxState& gearboxState) +{ + return (gearboxParams.neutralGear != gearboxState.currentGear) ? clutchResponseState.commandResponse : 0.0f; +} + +/** +\brief Compute the damping rate of the engine. +\param[in] engineParams describes various damping rates of the engine in different operational states. +\param[in] gearboxParams holds the index of neutral gear. +\param[in] gearboxState describes the current gear. +\param[in] clutchResponseState is the response of the clutch to the clutch command. +\param[in] throttleResponseState is the response of the throttle to the throttle command. +\note Engines typically have different damping rates with clutch engaged and disengaged. +\note Engines typically have different damping rates at different throttle pedal values. +@see PxVehicleClutchStrengthCompute() +\note In neutral gear the clutch is considered to be fully disengaged. +*/ +PX_FORCE_INLINE PxReal PxVehicleEngineDampingRateCompute +(const PxVehicleEngineParams& engineParams, + const PxVehicleGearboxParams& gearboxParams, const PxVehicleGearboxState& gearboxState, + const PxVehicleClutchCommandResponseState& clutchResponseState, + const PxVehicleEngineDriveThrottleCommandResponseState& throttleResponseState) +{ + const PxReal K = (gearboxParams.neutralGear != gearboxState.currentGear) ? clutchResponseState.normalisedCommandResponse : 0.0f; + const PxReal zeroThrottleDamping = engineParams.dampingRateZeroThrottleClutchEngaged + + (1.0f - K)* (engineParams.dampingRateZeroThrottleClutchDisengaged - engineParams.dampingRateZeroThrottleClutchEngaged); + const PxReal appliedThrottle = throttleResponseState.commandResponse; + const PxReal fullThrottleDamping = engineParams.dampingRateFullThrottle; + const PxReal engineDamping = zeroThrottleDamping + (fullThrottleDamping - zeroThrottleDamping)*appliedThrottle; + return engineDamping; +} + +/** +\brief Compute the gear ratio delivered by the gearbox in the current gear. +\param[in] gearboxParams describes the gear ratio of each gear and the final ratio. +\param[in] gearboxState describes the current gear. +\note The gear ratio is the product of the gear ratio of the current gear and the final gear ratio of the gearbox. +*/ +PX_FORCE_INLINE PxReal PxVehicleGearRatioCompute +(const PxVehicleGearboxParams& gearboxParams, const PxVehicleGearboxState& gearboxState) +{ + const PxReal gearRatio = gearboxParams.ratios[gearboxState.currentGear] * gearboxParams.finalRatio; + return gearRatio; +} + +/** +\brief Compute the drive torque to deliver to the engine. +\param[in] engineParams describes the profile of maximum available torque across the full range of engine rotational speed. +\param[in] engineState describes the engine rotational speed. +\param[in] throttleCommandResponseState describes the engine's response to input throttle command. +*/ +PX_FORCE_INLINE PxReal PxVehicleEngineDriveTorqueCompute +(const PxVehicleEngineParams& engineParams, const PxVehicleEngineState& engineState, const PxVehicleEngineDriveThrottleCommandResponseState& throttleCommandResponseState) +{ + const PxReal appliedThrottle = throttleCommandResponseState.commandResponse; + const PxReal peakTorque = engineParams.peakTorque; + const PxVehicleFixedSizeLookupTable& torqueCurve = engineParams.torqueCurve; + const PxReal normalisedRotSpeed = engineState.rotationSpeed/engineParams.maxOmega; + const PxReal engineDriveTorque = appliedThrottle*peakTorque*torqueCurve.interpolate(normalisedRotSpeed); + return engineDriveTorque; +} + +/** +@deprecated + +\brief Compute the contribution that each wheel makes to the averaged wheel speed at the clutch plate connected to the wheels driven by +the differential. +\param[in] diffParams describes the wheels coupled to the differential and the operation of the torque split at the differential. +\param[in] nbWheels The number of wheels. Can be larger than the number of wheels connected to the differential. +\param[out] diffAveWheelSpeedContributions describes the contribution that each wheel makes to the averaged wheel speed at the clutch. + The buffer needs to be sized to be able to hold at least nbWheels entries. +\note Any wheel on an axle connected to the differential could have a non-zero value, depending on the way the differential couples to the wheels. +\note Any wheel on an axle not connected to the differential will have a zero contribution to the averaged wheel speed. +*/ +void PX_DEPRECATED PxVehicleLegacyDifferentialWheelSpeedContributionsCompute +(const PxVehicleFourWheelDriveDifferentialLegacyParams& diffParams, + const PxU32 nbWheels, PxReal* diffAveWheelSpeedContributions); + +/** +@deprecated + +\brief Compute the fraction of available torque that is delivered to each wheel through the differential. +\param[in] diffParams describes the wheels coupled to the differential and the operation of the torque split at the differential. +\param[in] wheelOmegas describes the rotational speeds of the wheels. Is expected to have nbWheels entries. +\param[in] nbWheels The number of wheels. Can be larger than the number of wheels connected to the differential. +\param[out] diffTorqueRatios describes the fraction of available torque delivered to each wheel. + The buffer needs to be sized to be able to hold at least nbWheels entries. +\note Any wheel on an axle connected to the diff could receive a non-zero ratio, depending on the way the differential couples to the wheels. +\note Any wheel not on an axle connected to the diff will have a zero value. +\note The sum of all the ratios adds to 1.0. +\note Slipping wheels driven by the differential will typically receive less torque than non-slipping wheels in the event that the +differential has a limited slip configuration. +*/ +void PX_DEPRECATED PxVehicleLegacyDifferentialTorqueRatiosCompute +(const PxVehicleFourWheelDriveDifferentialLegacyParams& diffParams, + const PxVehicleArrayData& wheelOmegas, + const PxU32 nbWheels, PxReal* diffTorqueRatios); + + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/drivetrain/PxVehicleDrivetrainParams.h b/Source/ThirdParty/PhysX/vehicle2/drivetrain/PxVehicleDrivetrainParams.h new file mode 100644 index 000000000..cb2bdc871 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/drivetrain/PxVehicleDrivetrainParams.h @@ -0,0 +1,991 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxFoundation.h" +#include "common/PxCoreUtilityTypes.h" + +#include "vehicle2/PxVehicleParams.h" + +#include "vehicle2/commands/PxVehicleCommandParams.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +/** +\brief Distribute a throttle response to the wheels of a direct drive vehicle. +\note The drive torque applied to each wheel on the ith axle is throttleCommand * maxResponse * wheelResponseMultipliers[i]. +\note A typical use case is to set maxResponse to be the vehicle's maximum achievable drive torque +that occurs when the steer command is equal to 1.0. The array wheelResponseMultipliers[i] would then be used +to specify the maximum achievable drive torque per wheel as a fractional multiplier of the vehicle's maximum achievable steer angle. +*/ +struct PxVehicleDirectDriveThrottleCommandResponseParams : public PxVehicleCommandResponseParams +{ + PX_FORCE_INLINE PxVehicleDirectDriveThrottleCommandResponseParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PxVehicleDirectDriveThrottleCommandResponseParams r = *this; + const PxReal scale = trgScale.scale/srcScale.scale; + r.maxResponse *= (scale*scale); //Max response is a torque! + return r; + } + + PX_FORCE_INLINE bool isValid(const PxVehicleAxleDescription& axleDesc) const + { + PX_CHECK_AND_RETURN_VAL(PxIsFinite(maxResponse), "PxVehicleDirectDriveThrottleCommandResponseParams.maxResponse must be a finite value", false); + for (PxU32 i = 0; i < axleDesc.nbWheels; i++) + { + PX_CHECK_AND_RETURN_VAL(PxIsFinite(wheelResponseMultipliers[axleDesc.wheelIdsInAxleOrder[i]]), "PxVehicleDirectDriveThrottleCommandResponseParams.wheelResponseMultipliers[i] must be a finite value", false); + } + return true; + } +}; + +/** +\brief Specifies the maximum clutch strength that occurs when the clutch pedal is fully disengaged and the clutch is fully engaged. +*/ +struct PxVehicleClutchCommandResponseParams +{ + /** + \brief Strength of clutch. + + \note The clutch is the mechanism that couples the engine to the wheels. + A stronger clutch more strongly couples the engine to the wheels, while a + clutch of strength zero completely decouples the engine from the wheels. + Stronger clutches more quickly bring the wheels and engine into equilibrium, while weaker + clutches take longer, resulting in periods of clutch slip and delays in power transmission + from the engine to the wheels. + The torque generated by the clutch is proportional to the clutch strength and + the velocity difference between the engine's rotational speed and the rotational speed of the + driven wheels after accounting for the gear ratio. + The torque at the clutch is applied negatively to the engine and positively to the driven wheels. + + Range: [0,inf)
+ Unit: torque * time = mass * (length^2) / time + */ + PxReal maxResponse; + + PX_FORCE_INLINE PxVehicleClutchCommandResponseParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + const PxReal scale = trgScale.scale/srcScale.scale; + PxVehicleClutchCommandResponseParams r = *this; + r.maxResponse *= (scale*scale); + return r; + } + + PX_FORCE_INLINE bool isValid() const + { + PX_CHECK_AND_RETURN_VAL(maxResponse >= 0.0f, "PxVehicleClutchCommandResponseParams.maxResponse must be greater than or equal to zero", false); + return true; + } +}; + +/** +\brief Choose between a potentially more expensive but more accurate solution to the clutch model or a potentially cheaper but less accurate solution. +@see PxVehicleClutchParams +*/ +struct PxVehicleClutchAccuracyMode +{ + enum Enum + { + eESTIMATE = 0, + eBEST_POSSIBLE + }; +}; + +/** +\brief The clutch connects two plates together. One plate rotates with the speed of the engine. The second plate rotates with a weighted average of all +wheels connected to the differential after accounting for the gear ratio. The difference in rotation speeds generates a restoring torque applied to engine and wheels +that aims to reduce the difference in rotational speed. The restoring torque is proportional to the clutch strength and the clutch pedal position. +*/ +struct PxVehicleClutchParams +{ +public: + + /** + \brief The engine and wheel rotation speeds that are coupled through the clutch can be updated by choosing + one of two modes: eESTIMATE and eBEST_POSSIBLE. + + \note If eESTIMATE is chosen the vehicle sdk will update the wheel and engine rotation speeds + with estimated values to the implemented clutch model. + + \note If eBEST_POSSIBLE is chosen the vehicle sdk will compute the best possible + solution (within floating point tolerance) to the implemented clutch model. + This is the recommended mode. + + \note The clutch model remains the same if either eESTIMATE or eBEST_POSSIBLE is chosen but the accuracy and + computational cost of the solution to the model can be tuned as required. + */ + PxVehicleClutchAccuracyMode::Enum accuracyMode; + + /** + \brief Tune the mathematical accuracy and computational cost of the computed estimate to the wheel and + engine rotation speeds if eESTIMATE is chosen. + + \note As estimateIterations increases the computational cost of the clutch also increases and the solution + approaches the solution that would be computed if eBEST_POSSIBLE was chosen instead. + + \note This has no effect if eBEST_POSSIBLE is chosen as the accuracy mode. + + \note A value of zero is not allowed if eESTIMATE is chosen as the accuracy mode. + */ + PxU32 estimateIterations; + + PX_FORCE_INLINE PxVehicleClutchParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PX_UNUSED(srcScale); + PX_UNUSED(trgScale); + return *this; + } + + PX_FORCE_INLINE bool isValid() const + { + PX_CHECK_AND_RETURN_VAL((PxVehicleClutchAccuracyMode::eBEST_POSSIBLE == accuracyMode) || ((PxVehicleClutchAccuracyMode::eESTIMATE == accuracyMode) && (estimateIterations > 0)), "PxVehicleClutchParams.estimateIterations must be greater than zero if PxVehicleClutchAccuracyMode::eESTIMATE is selected", false); + return true; + } +}; + + +struct PxVehicleEngineParams +{ + /** + \brief Maximum supported number of points in the #torqueCurve graph. + */ + enum + { + eMAX_NB_ENGINE_TORQUE_CURVE_ENTRIES = 8 + }; + + /** + \brief Graph of normalized torque (torque/#peakTorque) against normalized engine speed ( engineRotationSpeed / #maxOmega ). + + \note The normalized engine speed is the x-axis of the graph, while the normalized torque is the y-axis of the graph. + */ + PxVehicleFixedSizeLookupTable torqueCurve; + + /** + \brief Moment of inertia of the engine around the axis of rotation. + + Range: (0, inf)
+ Unit: mass * (length^2) + */ + PxReal moi; + + /** + \brief Maximum torque available to apply to the engine when the accelerator pedal is at maximum. + + \note The torque available is the value of the accelerator pedal (in range [0, 1]) multiplied by the normalized torque as computed from #torqueCurve multiplied by #peakTorque. + + Range: [0, inf)
+ Unit: mass * (length^2) / (time^2) + */ + PxReal peakTorque; + + /** + \brief Minimum rotation speed of the engine. + + Range: [0, inf)
+ Unit: radians / time + */ + PxReal idleOmega; + + /** + \brief Maximum rotation speed of the engine. + + Range: [0, inf)
+ Unit: radians / time + */ + PxReal maxOmega; + + /** + \brief Damping rate of engine when full throttle is applied. + + \note If the clutch is engaged (any gear except neutral) then the damping rate applied at run-time is an interpolation + between #dampingRateZeroThrottleClutchEngaged and #dampingRateFullThrottle: + #dampingRateZeroThrottleClutchEngaged + (#dampingRateFullThrottle-#dampingRateZeroThrottleClutchEngaged)*acceleratorPedal; + + \note If the clutch is disengaged (in neutral gear) the damping rate applied at run-time is an interpolation + between #dampingRateZeroThrottleClutchDisengaged and #dampingRateFullThrottle: + #dampingRateZeroThrottleClutchDisengaged + (#dampingRateFullThrottle-#dampingRateZeroThrottleClutchDisengaged)*acceleratorPedal; + + Range: [0, inf)
+ Unit: torque * time = mass * (length^2) / time + */ + PxReal dampingRateFullThrottle; + + /** + \brief Damping rate of engine when no throttle is applied and with engaged clutch. + + \note If the clutch is engaged (any gear except neutral) then the damping rate applied at run-time is an interpolation + between #dampingRateZeroThrottleClutchEngaged and #dampingRateFullThrottle: + #dampingRateZeroThrottleClutchEngaged + (#dampingRateFullThrottle-#dampingRateZeroThrottleClutchEngaged)*acceleratorPedal; + + \note If the clutch is disengaged (in neutral gear) the damping rate applied at run-time is an interpolation + between #dampingRateZeroThrottleClutchDisengaged and #dampingRateFullThrottle: + #dampingRateZeroThrottleClutchDisengaged + (#dampingRateFullThrottle-#dampingRateZeroThrottleClutchDisengaged)*acceleratorPedal; + + Range: [0, inf)
+ Unit: torque * time = mass * (length^2) / time + */ + PxReal dampingRateZeroThrottleClutchEngaged; + + /** + \brief Damping rate of engine when no throttle is applied and with disengaged clutch. + + \note If the clutch is engaged (any gear except neutral) then the damping rate applied at run-time is an interpolation + between #dampingRateZeroThrottleClutchEngaged and #dampingRateFullThrottle: + #dampingRateZeroThrottleClutchEngaged + (#dampingRateFullThrottle-#dampingRateZeroThrottleClutchEngaged)*acceleratorPedal; + + \note If the clutch is disengaged (in neutral gear) the damping rate applied at run-time is an interpolation + between #dampingRateZeroThrottleClutchDisengaged and #dampingRateFullThrottle: + #dampingRateZeroThrottleClutchDisengaged + (#dampingRateFullThrottle-#dampingRateZeroThrottleClutchDisengaged)*acceleratorPedal; + + Range: [0, inf)
+ Unit: torque * time = mass * (length^2) / time + */ + PxReal dampingRateZeroThrottleClutchDisengaged; + + PX_FORCE_INLINE PxVehicleEngineParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PxVehicleEngineParams r = *this; + const PxReal scale = trgScale.scale/srcScale.scale; + r.moi *= (scale*scale); + r.peakTorque *= (scale*scale); + r.dampingRateFullThrottle *= (scale*scale); + r.dampingRateZeroThrottleClutchDisengaged *= (scale*scale); + r.dampingRateZeroThrottleClutchEngaged *= (scale*scale); + return r; + } + + PX_FORCE_INLINE bool isValid() const + { + PX_CHECK_AND_RETURN_VAL(moi > 0.0f, "PxVehicleEngineParams.moi must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(peakTorque >= 0.0f, "PxVehicleEngineParams.peakTorque must be greater than or equal to zero", false); + PX_CHECK_AND_RETURN_VAL(torqueCurve.isValid(), "PxVehicleEngineParams.torqueCurve is invalid", false); + PX_CHECK_AND_RETURN_VAL(maxOmega >= 0.0f, "PxVehicleEngineParams.maxOmega must be greater than or equal to zero", false); + PX_CHECK_AND_RETURN_VAL(idleOmega >= 0.0f, "PxVehicleEngineParams.idleOmega must be greater or equal to zero", false); + PX_CHECK_AND_RETURN_VAL(dampingRateFullThrottle >= 0.0f, "PxVehicleEngineParams.dampingRateFullThrottle must be greater than or equal to zero", false); + PX_CHECK_AND_RETURN_VAL(dampingRateZeroThrottleClutchEngaged >= 0.0f, "PxVehicleEngineParams.dampingRateZeroThrottleClutchEngaged must be greater than or equal to zero", false); + PX_CHECK_AND_RETURN_VAL(dampingRateZeroThrottleClutchDisengaged >= 0.0f, "PxVehicleEngineParams.dampingRateZeroThrottleClutchDisengaged must be greater than or equal to zero", false) + return true; + } +}; + +struct PxVehicleGearboxParams +{ +public: + + /** + \brief The gear that denotes neutral gear + */ + PxU32 neutralGear; + + /** + \brief Maximum supported number of gears, including reverse and neutral. + */ + enum Enum + { + eMAX_NB_GEARS = 32 + }; + + /** + \brief Gear ratios + + The ratio for reverse gears must be negative, the ratio for the neutral gear + has to be 0 and the ratio for forward gears must be positive. + */ + PxReal ratios[eMAX_NB_GEARS]; + + /** + \brief Gear ratio applied is #ratios[currentGear]*#finalRatio + + Range: (0, inf)
+ */ + PxReal finalRatio; + + /** + \brief Number of gears (including reverse and neutral). + + Range: [1, eMAX_NB_GEARS]
+ */ + PxU32 nbRatios; + + /** + \brief Time it takes to switch gear. + + Range: [0, inf)
+ Unit: time + */ + PxReal switchTime; + + PX_FORCE_INLINE PxVehicleGearboxParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PX_UNUSED(srcScale); + PX_UNUSED(trgScale); + return *this; + } + + PX_FORCE_INLINE bool isValid() const + { + PX_CHECK_AND_RETURN_VAL(finalRatio > 0, "PxVehicleGearboxParams.finalRatio must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(nbRatios >= 1, "PxVehicleGearboxParams.nbRatios must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(nbRatios <= eMAX_NB_GEARS, "PxVehicleGearboxParams.nbRatios must be less than or equal to eMAX_NB_GEARS", false); + PX_CHECK_AND_RETURN_VAL(neutralGear < nbRatios, "PxVehicleGearboxParams.neutralGear must be less than PxVehicleGearboxParams.nbRatios", false); + PX_CHECK_AND_RETURN_VAL(switchTime >= 0.0f, "PxVehicleGearboxParams.switchTime must be greater than or equal to zero", false); + for(PxU32 i = 0; i < neutralGear; i++) + { + PX_CHECK_AND_RETURN_VAL(ratios[i] < 0.0f, "Reverse gear ratios must be less than zero", false); + } + { + PX_CHECK_AND_RETURN_VAL(ratios[neutralGear] == 0.0f, "Neutral gear ratio must be equal to zero", false); + } + for (PxU32 i = neutralGear + 1; i < nbRatios; i++) + { + PX_CHECK_AND_RETURN_VAL(ratios[i] > 0.0f, "Forward gear ratios must be greater than zero", false); + } + for (PxU32 i = neutralGear + 2; i < nbRatios; i++) + { + PX_CHECK_AND_RETURN_VAL(ratios[i] < ratios[i - 1], "Forward gear ratios must be a descending sequence of gear ratios", false); + } + return true; + } +}; + + +struct PxVehicleAutoboxParams +{ +public: + + /** + \brief Value of ( engineRotationSpeed /maxEngineRevs ) that is high enough to increment gear. + + \note When ( engineRotationSpeed / #PxVehicleEngineParams::maxOmega ) > upRatios[currentGear] the autobox will begin + a transition to currentGear+1 unless currentGear is the highest possible gear or neutral or reverse. + + Range: [0, 1]
+ */ + PxReal upRatios[PxVehicleGearboxParams::eMAX_NB_GEARS]; + + /** + \brief Value of engineRevs/maxEngineRevs that is low enough to decrement gear. + + \note When ( engineRotationSpeed / #PxVehicleEngineParams::maxOmega) < downRatios[currentGear] the autobox will begin + a transition to currentGear-1 unless currentGear is first gear or neutral or reverse. + + Range: [0, 1]
+ */ + PxReal downRatios[PxVehicleGearboxParams::eMAX_NB_GEARS]; + + /** + \brief Set the latency time of the autobox. + + \note Latency time is the minimum time that must pass between each gear change that is initiated by the autobox. + The auto-box will only attempt to initiate another gear change up or down if the simulation time that has passed since the most recent + automated gear change is greater than the specified latency. + + Range: [0, inf)
+ Unit: time + */ + PxReal latency; + + PX_FORCE_INLINE PxVehicleAutoboxParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PX_UNUSED(srcScale); + PX_UNUSED(trgScale); + return *this; + } + + PX_FORCE_INLINE bool isValid(const PxVehicleGearboxParams& gearboxParams) const + { + if (!gearboxParams.isValid()) + return false; + + for (PxU32 i = gearboxParams.neutralGear + 1; i < gearboxParams.nbRatios-1; i++) + { + PX_CHECK_AND_RETURN_VAL(upRatios[i] >= 0.0f, "PxVehicleAutoboxParams.upRatios must be greater than or equal to zero", false); + } + for (PxU32 i = gearboxParams.neutralGear + 2; i < gearboxParams.nbRatios; i++) + { + PX_CHECK_AND_RETURN_VAL(downRatios[i] >= 0.0f, "PxVehicleAutoboxParams.downRatios must be greater than or equal to zero", false); + } + PX_CHECK_AND_RETURN_VAL(latency >= 0.0f, "PxVehicleAutoboxParams.latency must be greater than or equal to zero", false); + return true; + } +}; + +/** +@deprecated +*/ +struct PX_DEPRECATED PxVehicleFourWheelDriveDifferentialLegacyParams +{ +public: + + enum Enum + { + eDIFF_TYPE_LS_4WD, //limited slip differential for car with 4 driven wheels + eDIFF_TYPE_LS_FRONTWD, //limited slip differential for car with front-wheel drive + eDIFF_TYPE_LS_REARWD, //limited slip differential for car with rear-wheel drive + eMAX_NB_DIFF_TYPES + }; + + /** + \brief The two front wheels are specified by the array frontWheelIds. + \note The states eDIFF_TYPE_LS_4WD, eDIFF_TYPE_LS_FRONTWD require knowledge of the front wheels + to allow torque splits between front and rear axles as well as torque splits across the front axle. + \note frontWheelIds[0] should specify the wheel on the front axle that is negatively placed on the lateral axis. + \note frontWheelIds[1] should specify the wheel on the front axle that is positively placed on the lateral axis. + \note If #frontNegPosSplit > 0.5, more torque will be delivered to the wheel specified by frontWheelIds[0] than to the wheel + specified by frontWheelIds[1]. The converse is true if #frontNegPosSplit < 0.5. + */ + PxU32 frontWheelIds[2]; + + + /** + \brief The two rear wheels are specified by the array rearWheelIds. + \note The states eDIFF_TYPE_LS_4WD, eDIFF_TYPE_LS_REARWD require knowledge of the rear wheels + to allow torque splits between front and rear axles as well as torque splits across the rear axle. + \note rearWheelIds[0] should specify the wheel on the rear axle that is negatively placed on the lateral axis. + \note rearWheelIds[1] should specify the wheel on the rear axle that is positively placed on the lateral axis. + \note If #rearNegPosSplit > 0.5, more torque will be delivered to the wheel specified by rearWheelIds[0] than to the wheel + specified by rearWheelIds[1]. The converse is true if #rearNegPosSplit < 0.5. + */ + PxU32 rearWheelIds[2]; + + /** + \brief Ratio of torque split between front and rear wheels (>0.5 means more front, <0.5 means more to rear). + + \note Only applied to DIFF_TYPE_LS_4WD + + Range: [0, 1]
+ */ + PxReal frontRearSplit; + + /** + \brief Ratio of torque split between front-negative and front-positive wheels (>0.5 means more to #frontWheelIds[0], <0.5 means more to #frontWheelIds[1]). + + \note Only applied to DIFF_TYPE_LS_4WD and DIFF_TYPE_LS_FRONTWD + + Range: [0, 1]
+ */ + PxReal frontNegPosSplit; + + /** + \brief Ratio of torque split between rear-negative wheel and rear-positive wheels (>0.5 means more to #rearWheelIds[0], <0.5 means more to #rearWheelIds[1]). + + \note Only applied to DIFF_TYPE_LS_4WD and eDIFF_TYPE_LS_REARWD + + Range: [0, 1]
+ */ + PxReal rearNegPosSplit; + + /** + \brief Maximum allowed ratio of average front wheel rotation speed and rear wheel rotation speeds. + The differential will divert more torque to the slower wheels when the bias is exceeded. + + \note Only applied to DIFF_TYPE_LS_4WD + + Range: [1, inf)
+ */ + PxReal centerBias; + + /** + \brief Maximum allowed ratio of front-left and front-right wheel rotation speeds. + The differential will divert more torque to the slower wheel when the bias is exceeded. + + \note Only applied to DIFF_TYPE_LS_4WD and DIFF_TYPE_LS_FRONTWD + + Range: [1, inf)
+ */ + PxReal frontBias; + + /** + \brief Maximum allowed ratio of rear-left and rear-right wheel rotation speeds. + The differential will divert more torque to the slower wheel when the bias is exceeded. + + \note Only applied to DIFF_TYPE_LS_4WD and DIFF_TYPE_LS_REARWD + + Range: [1, inf)
+ */ + PxReal rearBias; + + /** + \brief Type of differential. + + Range: [DIFF_TYPE_LS_4WD, eDIFF_TYPE_LS_REARWD]
+ */ + Enum type; + + PX_FORCE_INLINE PxVehicleFourWheelDriveDifferentialLegacyParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PX_UNUSED(srcScale); + PX_UNUSED(trgScale); + return *this; + } + + PX_FORCE_INLINE bool isValid(const PxVehicleAxleDescription& axleDesc) const + { + PX_UNUSED(axleDesc); + PX_CHECK_AND_RETURN_VAL((axleDesc.getAxle(frontWheelIds[0]) != 0xffffffff) && (axleDesc.getAxle(frontWheelIds[0])== axleDesc.getAxle(frontWheelIds[1])), "frontWheelIds[0] and frontWheelIds[1] must reference wheels on the same axle", false); + PX_CHECK_AND_RETURN_VAL((axleDesc.getAxle(rearWheelIds[0]) != 0xffffffff) && (axleDesc.getAxle(rearWheelIds[0]) == axleDesc.getAxle(rearWheelIds[1])), "rearWheelIds[0] and rearWheelIds[1] must reference wheels on the same axle", false); + PX_CHECK_AND_RETURN_VAL(frontRearSplit <= 1.0f && frontRearSplit >= 0.0f, "PxVehicleLegacyFourWheelDriveDifferentialParams.frontRearSplit must be in range [0,1]", false); + PX_CHECK_AND_RETURN_VAL(frontNegPosSplit <= 1.0f && frontNegPosSplit >= 0.0f, "PxVehicleLegacyFourWheelDriveDifferentialParams.frontNegPosSplit must be in range [0,1]", false); + PX_CHECK_AND_RETURN_VAL(rearNegPosSplit <= 1.0f && rearNegPosSplit >= 0.0f, "PxVehicleLegacyFourWheelDriveDifferentialParams.rearNegPosSplit must be in range [0,1]", false); + PX_CHECK_AND_RETURN_VAL(centerBias >= 1.0f, "PxVehicleLegacyFourWheelDriveDifferentialParams.centerBias must be greater than or equal to 1.0f", false); + PX_CHECK_AND_RETURN_VAL(frontBias >= 1.0f, "PxVehicleLegacyFourWheelDriveDifferentialParams.frontBias must be greater than or equal to 1.0f", false); + PX_CHECK_AND_RETURN_VAL(rearBias >= 1.0f, "PxVehicleLegacyFourWheelDriveDifferentialParams.rearBias must be greater than or equal to 1.0f", false); + PX_CHECK_AND_RETURN_VAL(type < PxVehicleFourWheelDriveDifferentialLegacyParams::eMAX_NB_DIFF_TYPES, "PxVehicleLegacyFourWheelDriveDifferentialParams.type has illegal value", false); + return true; + } +}; + +/** +\brief PxVehicleMultiWheelDriveDifferentialParams specifies the wheels that are to receive drive torque from the differential +and the division of torque between the wheels that are connected to the differential. +*/ +struct PxVehicleMultiWheelDriveDifferentialParams +{ + /** + \brief torqueRatios describes the fraction of torque delivered to each wheel through the differential. + \note Wheels not connected to the differential must receive zero torque. + \note Wheels connected to the differential may receive a non-zero torque. + \note The sum of the absolute of the ratios of all wheels must equal to 1.0. + \note A negative torque ratio simulates a wheel with negative gearing applied. + + Range: [1, -1]
+ */ + PxReal torqueRatios[PxVehicleLimits::eMAX_NB_WHEELS]; + + /** + \brief aveWheelSpeedRatios describes the contribution of each wheel to the average wheel speed measured at the clutch. + \note Wheels not connected to the differential do not contribute to the average wheel speed measured at the clutch. + \note Wheels connected to the differential may delivere a non-zero contribution to the average wheel speed measured at the clutch. + \note The sum of all ratios of all wheels must equal to 1.0. + + Range: [0, 1]
+ */ + PxReal aveWheelSpeedRatios[PxVehicleLimits::eMAX_NB_WHEELS]; + + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleMultiWheelDriveDifferentialParams)); + } + + PX_FORCE_INLINE PxVehicleMultiWheelDriveDifferentialParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PX_UNUSED(srcScale); + PX_UNUSED(trgScale); + return *this; + } + + PX_FORCE_INLINE bool isValid(const PxVehicleAxleDescription& axleDesc) const + { + if (!axleDesc.isValid()) + return false; + PxReal aveWheelSpeedSum = 0.0f; + PxReal torqueRatioSum = 0.0f; + for (PxU32 i = 0; i < axleDesc.nbWheels; i++) + { + const PxU32 wheelId = axleDesc.wheelIdsInAxleOrder[i]; + PX_CHECK_AND_RETURN_VAL(PxAbs(torqueRatios[wheelId]) <= 1.0f, "PxVehicleMultiWheelDriveDifferentialParams.torqueRatios[i] must be in range [-1, 1] for all wheels connected to the differential", false); + PX_CHECK_AND_RETURN_VAL(aveWheelSpeedRatios[wheelId] >= 0.0f && aveWheelSpeedRatios[wheelId] <= 1.0f, "PxVehicleMultiWheelDriveDifferentialParams.aveWheelSpeedRatios[i] must be in range [0, 1] for all wheels connected to the differential", false); + aveWheelSpeedSum += aveWheelSpeedRatios[wheelId]; + torqueRatioSum += PxAbs(torqueRatios[wheelId]); + } + PX_CHECK_AND_RETURN_VAL(aveWheelSpeedSum >= 0.99f && aveWheelSpeedSum <= 1.01f, "Sum of PxVehicleMultiWheelDriveDifferentialParams.aveWheelSpeedRatios[i] must be 1.0.", false); + PX_CHECK_AND_RETURN_VAL(torqueRatioSum >= 0.99f && torqueRatioSum <= 1.01f, "Sum of PxVehicleMultiWheelDriveDifferentialParams.torqueRatios[i] must be 1.0.", false); + PX_UNUSED(aveWheelSpeedSum); + PX_UNUSED(torqueRatioSum); + return true; + } +}; + +/** +\brief A special value that indicates instantaneous resolution of a slip that exceeds a differential bias. +*/ +#define PX_VEHICLE_FOUR_WHEEL_DIFFERENTIAL_MAXIMUM_STRENGTH PX_MAX_F32 + +/** +\brief PxVehicleFourWheelDriveDifferentialParams specifies the wheels that are to receive drive torque from the differential +and the division of torque between the wheels that are connected to the differential. Additionally, it specifies the biases +and strength of a limited slip differential that operates on two wheels specified as front wheels and two wheels specified +as rear wheels. +*/ +struct PxVehicleFourWheelDriveDifferentialParams : public PxVehicleMultiWheelDriveDifferentialParams +{ + /** + \brief The ids of the two wheels considered by the differential to be the front pair. + \note When the ratio of the rotational speeds of the front wheels exceeds frontBias, drive torque is diverted so + that the ratio approaches the value specified by frontTarget. When the bias is not breached, the drive torque + is specified by the corresponding entries in PxVehicleMultiWheelDriveDifferentialParams::torqueRatios. + */ + PxU32 frontWheelIds[2]; + + /** + \brief The ids of the two wheels considered by the differential to be the rear pair. + \note When the ratio of the rotational speeds of the rear wheels exceeds rearBias, drive torque is diverted so + that the ratio approaches the value specified by rearTarget. When the bias is not breached, the drive torque + is specified by the corresponding entries in PxVehicleMultiWheelDriveDifferentialParams::torqueRatios. + */ + PxU32 rearWheelIds[2]; + + /** + \brief The parameter frontBias specifies the maximum angular speed ratio of the two front wheels specified by frontWheelIds[2]. + \note If frontBias has value 0.0, the differential will not try to enforce any relationship between the rotational speeds of the two front wheels. + \note If frontBias has value 0.0, the torque split between the front wheels is specified by the array torqueRatios. + \note frontBias must have value 0.0 (deactivated limited slip) or be greater than 1.0 (activated limited slip) or be equal to 1.0 (locked axle). + \note If frontBias has value greater than or equal to 1.0 then the array frontWheelIds must be specified and the corresponding entries of + the isConnected[] array must be set true. + \note If frontBias has value greater than or equal to 1.0 then frontTarget must also be specified. + \note A locked axle may be achieved by setting frontBias and frontTarget to 1.0. + \note A limited slip differential may be achieved by setting frontBias > 1.0 and frontBias > frontTarget > 1.0. + */ + PxReal frontBias; + + /** + \brief The parameter frontTarget specifies the target rotational speed ratio of the two front wheels in the event that the ratio exceeds frontBias and frontBias + is configured for an activated limited slip or locked axle. + \note frontTarget must be less than frontBias and greater than 1.0 to implement a limited slip differential. + \note Set frontTarget and frontBias to 1.0 to implement a locked axle. + */ + PxReal frontTarget; + + /** + \brief The parameter rearBias specifies the maximum angular speed ratio of the two rear wheels specified by rearWheelIds[2]. + \note If rearBias has value 0.0, the differential will not try to enforce any relationship between the rotational speeds of the two rear wheels. + \note If rearBias has value 0.0, the torque split between the rear wheels is specified by the array torqueRatios. + \note rearBias must have value 0.0 (deactivated limited slip) or be greater than 1.0 (activated limited slip) or be equal to 1.0 (locked axle). + \note If rearBias has value greater than or equal to 1.0 then the array rearWheelIds must be specified and the corresponding entries of + the isConnected[] array must be set true. + \note If rearBias has value greater than or equal to 1.0 then rearTarget must also be specified. + \note A locked axle may be achieved by setting rearBias and rearTarget to 1.0. + \note A limited slip differential may be achieved by setting rearBias > 1.0 and rearBias > rearTarget > 1.0 + */ + PxReal rearBias; + + /** + \brief The parameter rearTarget specifies the target rotational speed ratio of the two rear wheels in the event that the ratio exceeds rearBias and rearBias + is configured for an activated limited slip or locked axle. + \note rearTarget must be less than rearBias and greater than 1.0 to implement a limited slip differential. + \note Set rearTarget and rearBias to 1.0 to implement a locked axle. + */ + PxReal rearTarget; + + /** + \brief The parameter centerBias specifies the maximum angular speed ratio of the sum of the two front wheels and the sum of the two rear wheels, + as specified by frontWheelIds[2] and rearWheelIds[2]. + \note If centerBias has value 0.0, the differential will not try to enforce any relationship between the rotational speeds of the front and rear wheels. + \note If centerBias has value 0.0, the torque split between the front and rear rear wheels is specified by the array torqueRatios. + \note centerBias must have value 0.0 (deactivated limited slip) or be greater than 1.0 (activated limited slip) or be equal to 1.0 (locked). + \note If centerBias has value greater than or equal to 1.0 then the arrays frontWheelIds and rearWheelIds must be specified and the corresponding entries of + the isConnected[] array must be set true. + \note If centerBias has value greater than or equal to 1.0 then centerTarget must also be specified. + \note A locked front/rear differential may be achieved by setting centerBias and centerTarget to 1.0. + \note A limited slip differential may be achieved by setting centerBias > 1.0 and centerBias > centerTarget > 1.0 + */ + PxReal centerBias; + + /** + \brief The parameter centerTarget specifies the target rotational speed ratio of the sum of the two front wheels and the sum of the two rear wheels + in the event that the ratio exceeds centerBias and centerBias is configured for an activated limited slip. + \note centerTarget must be less than centerBias and greater than 1.0 to implement a limited slip differential. + \note Set centerTarget and centerBias to 1.0 to implement a locked differential. + */ + PxReal centerTarget; + + /** + \brief The parameter rate specifies how quickly the ratio of rotational speeds approaches the target rotational speed ratio. + \note strength must be in range [0,PX_VEHICLE_FOUR_WHEEL_DIFF_MAXIMUM_STRENGTH]. + \note The ratio of rotational speeds is decremented each update by rate*dt until the ratio is equal to the target ratio. + \note A value of 0 will result in a deactivated limited slip. + \note A value of PX_VEHICLE_FOUR_WHEEL_DIFF_MAXIMUM_STRENGTH will result in instantaneous correction of the rotational speed ratios. + */ + PxReal rate; + + + PX_FORCE_INLINE void setToDefault() + { + PxVehicleMultiWheelDriveDifferentialParams::setToDefault(); + frontBias = 0.0f; + rearBias = 0.0f; + centerBias = 0.0f; + } + + PX_FORCE_INLINE bool isValid(const PxVehicleAxleDescription& axleDesc) const + { + if (!PxVehicleMultiWheelDriveDifferentialParams::isValid(axleDesc)) + return false; + + PX_CHECK_AND_RETURN_VAL((0.0f == centerBias) || + (centerBias > 1.0f && + frontWheelIds[0] < axleDesc.nbWheels && frontWheelIds[1] < axleDesc.nbWheels && + rearWheelIds[0] < axleDesc.nbWheels && rearWheelIds[1] < axleDesc.nbWheels), + "PxVehicleFourWheelDriveDifferentialParams:: centreBias is enabled but the frontWheelIds and rearWheelIds are not configured correctly.", false); + PX_CHECK_AND_RETURN_VAL((0.0f == centerBias) || + (centerBias > 1.0f && + frontWheelIds[0] != frontWheelIds[1] && frontWheelIds[0] != rearWheelIds[0] && frontWheelIds[0] != rearWheelIds[1] && + frontWheelIds[1] != rearWheelIds[0] && frontWheelIds[1] != rearWheelIds[1] && + rearWheelIds[0] != rearWheelIds[1]), + "PxVehicleFourWheelDriveDifferentialParams:: centreBias is enabled but the frontWheelIds and rearWheelIds are not configured correctly.", false); + PX_CHECK_AND_RETURN_VAL((0.0f == centerBias) || + (centerBias > 1.0f && + torqueRatios[frontWheelIds[0]] != 0.0f && torqueRatios[frontWheelIds[1]] != 0.0f && torqueRatios[rearWheelIds[0]] != 0.0f && torqueRatios[rearWheelIds[1]] != 0.0f), + "PxVehicleFourWheelDriveDifferentialParams:: centreBias is enabled but the front and rear wheels are not connected.", false); + + PX_CHECK_AND_RETURN_VAL((0.0f == rearBias) || + (rearBias > 1.0f && rearWheelIds[0] < axleDesc.nbWheels && rearWheelIds[1] < axleDesc.nbWheels), + "PxVehicleFourWheelDriveDifferentialParams:: rearBias is enabled but the rearWheelIds are not configured correctly.", false); + PX_CHECK_AND_RETURN_VAL((0.0f == rearBias) || + (rearBias > 1.0f && rearWheelIds[0] != rearWheelIds[1]), + "PxVehicleFourWheelDriveDifferentialParams:: rearBias is enabled but the rearWheelIds are not configured correctly.", false); + PX_CHECK_AND_RETURN_VAL((0.0f == centerBias) || + (rearBias > 1.0f && torqueRatios[rearWheelIds[0]] != 0.0f && torqueRatios[rearWheelIds[1]] != 0.0f), + "PxVehicleFourWheelDriveDifferentialParams:: rearBias is enabled but the rear wheels are not connected.", false); + + PX_CHECK_AND_RETURN_VAL((0.0f == frontBias) || + (frontBias > 1.0f && frontWheelIds[0] < axleDesc.nbWheels && frontWheelIds[1] < axleDesc.nbWheels), + "PxVehicleFourWheelDriveDifferentialParams:: frontBias is enabled but the frontWheelIds are not configured correctly.", false); + PX_CHECK_AND_RETURN_VAL((0.0f == frontBias) || + (frontBias > 1.0f && frontWheelIds[0] != frontWheelIds[1]), + "PxVehicleFourWheelDriveDifferentialParams:: frontBias is enabled but the frontWheelIds are not configured correctly.", false); + PX_CHECK_AND_RETURN_VAL((0.0f == frontBias) || + (frontBias > 1.0f && torqueRatios[frontWheelIds[0]] != 0.0f && frontWheelIds[frontWheelIds[1]]), + "PxVehicleFourWheelDriveDifferentialParams:: frontBias is enabled but the front wheels are not connected.", false); + + PX_CHECK_AND_RETURN_VAL(((0.0f == frontBias) && (0.0f == rearBias) && (0.0f == centerBias)) || (rate >= 0.0f), + "PxVehicleFourWheelDriveDifferentialParams:: strength must be greater than or equal to zero", false); + + PX_CHECK_AND_RETURN_VAL((0.0f == frontBias) || ((1.0f == frontTarget && 1.0f == rearTarget) || (frontTarget > 1.0f && frontTarget < frontBias)), + "PxVehicleFourWheelDriveDifferentialParams: frontBias is enabled but frontTarget not in range (1.0f, frontBias)", false); + PX_CHECK_AND_RETURN_VAL((0.0f == rearBias) || ((1.0f == rearTarget && 1.0f == rearBias) || (rearTarget > 1.0f && rearTarget < rearBias)), + "PxVehicleFourWheelDriveDifferentialParams: rearBias is enabled but rearTarget not in range (1.0f, rearBias)", false); + PX_CHECK_AND_RETURN_VAL((0.0f == centerBias) || ((1.0f == centerTarget && 1.0f == centerBias) || (centerTarget > 1.0f && centerTarget < centerBias)), + "PxVehicleFourWheelDriveDifferentialParams: centerBias is enabled but centerTarget not in range (1.0f, centerBias)", false); + + return true; + } + + PX_FORCE_INLINE PxVehicleFourWheelDriveDifferentialParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PX_UNUSED(srcScale); + PX_UNUSED(trgScale); + PxVehicleFourWheelDriveDifferentialParams r = *this; + static_cast(r) = PxVehicleMultiWheelDriveDifferentialParams::transformAndScale(srcFrame, trgFrame, srcScale, trgScale); + return r; + } +}; + +/** +\brief A description of a tank differential. +\note The wheels on a tank may be connected to the differential or not connected to the differential. +\note The wheels on a tank track may be connected to a tank track or not connected to a tank track. +\note Wheels connected to the differential but not to a tank track receive the torque split specified by the +corresponding elements of PxVehicleMultiWheelDriveDifferentialParams::torqueRatios[]. +\note Wheels connected to a tank track but not to the differential receive no torque from the engine. +\note Wheels connected to a tank track and to the differential receive the torque split specified by the +corresponding elements of PxVehicleMultiWheelDriveDifferentialParams::torqueRatios[] multiplied by the corresponding +thrust controller value. If the thrust controller has a negative value, the wheels will receive a torque that is negative +with respect to the gearing ratio. +\note The wheels in each tank track have a constraint applied to them to enforce the rule that they all have the same longitudinal speed +at the contact point between the wheel and the tank track. +*/ +struct PxVehicleTankDriveDifferentialParams : public PxVehicleMultiWheelDriveDifferentialParams +{ + PX_FORCE_INLINE void setToDefault() + { + PxVehicleMultiWheelDriveDifferentialParams::setToDefault(); + nbTracks = 0; + nbWheelsInTracks = 0; + } + + /** + \brief Add a tank track by specifying the number of wheels along the track track and an array of wheel ids specifying each wheel in the tank track. + \param[in] nbWheelsInTrackToAdd is the number of wheels in the track to be added. + \param[in] wheelIdsInTrackToAdd is an array of wheel ids specifying all the wheels in the track to be added. + \param[in] thrustControllerIndex specifies the index of the thrust controller that will be used to control the tank track. + */ + void addTankTrack(const PxU32 nbWheelsInTrackToAdd, const PxU32* const wheelIdsInTrackToAdd, const PxU32 thrustControllerIndex) + { + PX_ASSERT((nbWheelsInTracks + nbWheelsInTrackToAdd) < PxVehicleLimits::eMAX_NB_WHEELS); + PX_ASSERT(nbTracks < PxVehicleLimits::eMAX_NB_WHEELS); + PX_ASSERT(thrustControllerIndex < 2); + nbWheelsPerTrack[nbTracks] = nbWheelsInTrackToAdd; + thrustIdPerTrack[nbTracks] = thrustControllerIndex; + trackToWheelIds[nbTracks] = nbWheelsInTracks; + for (PxU32 i = 0; i < nbWheelsInTrackToAdd; i++) + { + wheelIdsInTrackOrder[nbWheelsInTracks + i] = wheelIdsInTrackToAdd[i]; + } + nbWheelsInTracks += nbWheelsInTrackToAdd; + nbTracks++; + } + + /** + \brief Return the number of tracks. + \return The number of tracks. + @see getNbWheelsInTrack() + */ + PX_FORCE_INLINE PxU32 getNbTracks() const + { + return nbTracks; + } + + /** + \brief Return the number of wheels in the ith track. + \param[in] i specifies the track to be queried for its wheel count. + \return The number of wheels in the specified track. + @see getWheelInTrack() + */ + PX_FORCE_INLINE PxU32 getNbWheelsInTrack(const PxU32 i) const + { + return nbWheelsPerTrack[i]; + } + + /** + \brief Return the array of all wheels in the ith track. + \param[in] i specifies the track to be queried for its wheels. + \return The array of wheels in the specified track. + */ + PX_FORCE_INLINE const PxU32* getWheelsInTrack(const PxU32 i) const + { + return (wheelIdsInTrackOrder + trackToWheelIds[i]); + } + + /** + \brief Return the wheel id of the jth wheel in the ith track. + \param[in] j specifies that the wheel id to be returned is the jth wheel in the list of wheels on the specified track. + \param[in] i specifies the track to be queried. + \return The wheel id of the jth wheel in the ith track. + @see getNbWheelsInTrack() + */ + PX_FORCE_INLINE PxU32 getWheelInTrack(const PxU32 j, const PxU32 i) const + { + return wheelIdsInTrackOrder[trackToWheelIds[i] + j]; + } + + /** + \brief Return the index of the thrust controller that will control a specified track. + \param[in] i specifies the track to be queried for its thrust controller index + \return The index of the thrust controller that will control the ith track. + */ + PX_FORCE_INLINE PxU32 getThrustControllerIndex(const PxU32 i) const + { + return thrustIdPerTrack[i]; + } + + PX_FORCE_INLINE PxVehicleTankDriveDifferentialParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PX_UNUSED(srcScale); + PX_UNUSED(trgScale); + PxVehicleTankDriveDifferentialParams r = *this; + static_cast(r) = PxVehicleMultiWheelDriveDifferentialParams::transformAndScale(srcFrame, trgFrame, srcScale, trgScale); + return r; + } + + PX_FORCE_INLINE bool isValid(const PxVehicleAxleDescription& axleDesc) const + { + if (!PxVehicleMultiWheelDriveDifferentialParams::isValid(axleDesc)) + return false; + + PX_CHECK_AND_RETURN_VAL(nbTracks <= PxVehicleLimits::eMAX_NB_WHEELS, "PxVehicleTankDriveDifferentialParams.nbTracks must not exceed PxVehicleLimits::eMAX_NB_WHEELS", false); + PX_CHECK_AND_RETURN_VAL(nbWheelsInTracks <= PxVehicleLimits::eMAX_NB_WHEELS, "PxVehicleTankDriveDifferentialParams.nbWheelsInTracks must not exceed PxVehicleLimits::eMAX_NB_WHEELS", false); + for (PxU32 i = 0; i < nbTracks; i++) + { + PX_CHECK_AND_RETURN_VAL(thrustIdPerTrack[i] < 2, "PxVehicleTankDriveDifferentialParams.thrustId must be less than 2", false); + PX_CHECK_AND_RETURN_VAL(getNbWheelsInTrack(i) >= 2, "PxVehicleTankDriveDifferentialParams.nbWheelsPerTrack must be greater than or equal to 2", false); + } + + for (PxU32 i = 0; i < axleDesc.nbWheels; i++) + { + const PxU32 wheelId = axleDesc.wheelIdsInAxleOrder[i]; + PxU32 count = 0; + for (PxU32 j = 0; j < nbWheelsInTracks; j++) + { + if (wheelIdsInTrackOrder[j] == wheelId) + count++; + } + PX_CHECK_AND_RETURN_VAL(count <= 1, "PxVehicleTankDriveDifferentialParams - a wheel cannot be in more than one tank track", false); + } + return true; + } + + PxU32 nbTracks; //!< The number of tracks + PxU32 thrustIdPerTrack[PxVehicleLimits::eMAX_NB_WHEELS]; //!< The id of the thrust that will control the track. Must have value 0 or 1. + PxU32 nbWheelsPerTrack[PxVehicleLimits::eMAX_NB_WHEELS]; //!< The number of wheels in each track + PxU32 trackToWheelIds[PxVehicleLimits::eMAX_NB_WHEELS]; //!< The list of wheel ids for the ith tank track begins at wheelIdsInTrackOrder[trackToWheelIds[i]] + + PxU32 wheelIdsInTrackOrder[PxVehicleLimits::eMAX_NB_WHEELS];//!< The list of all wheel ids in all tracks + PxU32 nbWheelsInTracks; //!< The number of wheels in all tracks. +}; + + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ + diff --git a/Source/ThirdParty/PhysX/vehicle2/drivetrain/PxVehicleDrivetrainStates.h b/Source/ThirdParty/PhysX/vehicle2/drivetrain/PxVehicleDrivetrainStates.h new file mode 100644 index 000000000..aacfc75e9 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/drivetrain/PxVehicleDrivetrainStates.h @@ -0,0 +1,288 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "vehicle2/commands/PxVehicleCommandStates.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + + +struct PxVehicleClutchCommandResponseState +{ + PxReal normalisedCommandResponse; + PxReal commandResponse; + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleClutchCommandResponseState)); + } +}; + +struct PxVehicleEngineDriveThrottleCommandResponseState +{ + PxReal commandResponse; + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleEngineDriveThrottleCommandResponseState)); + } +}; + +struct PxVehicleEngineState +{ + /** + \brief The rotation speed of the engine (radians per second). + + Unit: radians / time + */ + PxReal rotationSpeed; + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleEngineState)); + } +}; + +#define PX_VEHICLE_NO_GEAR_SWITCH_PENDING -1.0f +#define PX_VEHICLE_GEAR_SWITCH_INITIATED -2.0f + +struct PxVehicleGearboxState +{ + /** + \brief Current gear + */ + PxU32 currentGear; + + /** + \brief Target gear (different from current gear if a gear change is underway) + */ + PxU32 targetGear; + + /** + \brief Reported time that has passed since gear change started. + + The special value PX_VEHICLE_NO_GEAR_SWITCH_PENDING denotes that there is currently + no gear change underway. + + If a gear switch was initiated, the special value PX_VEHICLE_GEAR_SWITCH_INITIATED + will be used temporarily but get translated to 0 in the gearbox update immediately. + This state might only get encountered, if the vehicle component update is split into + multiple sequences that do not run in one go. + + Unit: time + */ + PxReal gearSwitchTime; + + PX_FORCE_INLINE void setToDefault() + { + currentGear = 0; + targetGear = 0; + gearSwitchTime = PX_VEHICLE_NO_GEAR_SWITCH_PENDING; + } +}; + +#define PX_VEHICLE_UNSPECIFIED_TIME_SINCE_LAST_SHIFT PX_MAX_F32 + +struct PxVehicleAutoboxState +{ + /** + \brief Time that has lapsed since the last autobox gear shift. + + Unit: time + */ + PxReal timeSinceLastShift; + + /** + \brief Describes whether a gear shift triggered by the autobox is still in flight. + */ + bool activeAutoboxGearShift; + + PX_FORCE_INLINE void setToDefault() + { + timeSinceLastShift = PX_VEHICLE_UNSPECIFIED_TIME_SINCE_LAST_SHIFT; + activeAutoboxGearShift = false; + } +}; + +struct PxVehicleDifferentialState +{ + /** + \brief A list of wheel indices that are connected to the differential. + */ + PxU32 connectedWheels[PxVehicleLimits::eMAX_NB_WHEELS]; + + /** + \brief The number of wheels that are connected to the differential. + */ + PxU32 nbConnectedWheels; + + /** + \brief The fraction of available torque that is delivered to each wheel through the differential. + \note If a wheel is not connected to the differential then the fraction of available torque delivered to that wheel will be zero. + \note A negative torque ratio for a wheel indicates a negative gearing is to be applied to that wheel. + \note The sum of the absolute value of each fraction must equal 1.0. + */ + PxReal torqueRatiosAllWheels[PxVehicleLimits::eMAX_NB_WHEELS]; + + /** + \brief The contribution of each wheel to the average wheel rotation speed measured at the clutch. + \note If a wheel is not connected to the differential then the contribution to the average rotation speed measured at the clutch must be zero. + \note The sum of all contributions must equal 1.0. + */ + PxReal aveWheelSpeedContributionAllWheels[PxVehicleLimits::eMAX_NB_WHEELS]; + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleDifferentialState)); + } +}; + +/** +\brief Specify groups of wheels that are to be constrained to have pre-determined angular velocity relationship. +*/ +struct PxVehicleWheelConstraintGroupState +{ + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleWheelConstraintGroupState)); + } + + /** + \brief Add a wheel constraint group by specifying the number of wheels in the group, an array of wheel ids specifying each wheel in the group + and a desired rotational speed relationship. + \param[in] nbWheelsInGroupToAdd is the number of wheels in the group to be added. + \param[in] wheelIdsInGroupToAdd is an array of wheel ids specifying all the wheels in the group to be added. + \param[in] constraintMultipliers is an array of constraint multipliers describing the desired relationship of the wheel rotational speeds. + \note constraintMultipliers[j] specifies the target rotational speed of the jth wheel in the constraint group as a multiplier of the rotational + speed of the zeroth wheel in the group. + */ + void addConstraintGroup(const PxU32 nbWheelsInGroupToAdd, const PxU32* const wheelIdsInGroupToAdd, const PxF32* constraintMultipliers) + { + PX_ASSERT((nbWheelsInGroups + nbWheelsInGroupToAdd) < PxVehicleLimits::eMAX_NB_WHEELS); + PX_ASSERT(nbGroups < PxVehicleLimits::eMAX_NB_WHEELS); + nbWheelsPerGroup[nbGroups] = nbWheelsInGroupToAdd; + groupToWheelIds[nbGroups] = nbWheelsInGroups; + for (PxU32 i = 0; i < nbWheelsInGroupToAdd; i++) + { + wheelIdsInGroupOrder[nbWheelsInGroups + i] = wheelIdsInGroupToAdd[i]; + wheelMultipliersInGroupOrder[nbWheelsInGroups + i] = constraintMultipliers[i]; + } + nbWheelsInGroups += nbWheelsInGroupToAdd; + nbGroups++; + } + + /** + \brief Return the number of wheel constraint groups in the vehicle. + \return The number of wheel constraint groups. + @see getNbWheelsInConstraintGroup() + */ + PX_FORCE_INLINE PxU32 getNbConstraintGroups() const + { + return nbGroups; + } + + /** + \brief Return the number of wheels in the ith constraint group. + \param[in] i specifies the constraint group to be queried for its wheel count. + \return The number of wheels in the specified constraint group. + @see getWheelInConstraintGroup() + */ + PX_FORCE_INLINE PxU32 getNbWheelsInConstraintGroup(const PxU32 i) const + { + return nbWheelsPerGroup[i]; + } + + /** + \brief Return the wheel id of the jth wheel in the ith constraint group. + \param[in] j specifies that the wheel id to be returned is the jth wheel in the list of wheels on the specified constraint group. + \param[in] i specifies the constraint group to be queried. + \return The wheel id of the jth wheel in the ith constraint group. + @see getNbWheelsInConstraintGroup() + */ + PX_FORCE_INLINE PxU32 getWheelInConstraintGroup(const PxU32 j, const PxU32 i) const + { + return wheelIdsInGroupOrder[groupToWheelIds[i] + j]; + } + + /** + \brief Return the constraint multiplier of the jth wheel in the ith constraint group + \param[in] j specifies that the wheel id to be returned is the jth wheel in the list of wheels on the specified constraint group. + \param[in] i specifies the constraint group to be queried. + \return The constraint multiplier of the jth wheel in the ith constraint group. + */ + PX_FORCE_INLINE PxReal getMultiplierInConstraintGroup(const PxU32 j, const PxU32 i) const + { + return wheelMultipliersInGroupOrder[groupToWheelIds[i] + j]; + } + + PxU32 nbGroups; //!< The number of constraint groups in the vehicle + PxU32 nbWheelsPerGroup[PxVehicleLimits::eMAX_NB_AXLES]; //!< The number of wheels in each group + PxU32 groupToWheelIds[PxVehicleLimits::eMAX_NB_AXLES]; //!< The list of wheel ids for the ith group begins at wheelIdsInGroupOrder[groupToWheelIds[i]] + + PxU32 wheelIdsInGroupOrder[PxVehicleLimits::eMAX_NB_WHEELS]; //!< The list of all wheel ids in constraint groups + PxF32 wheelMultipliersInGroupOrder[PxVehicleLimits::eMAX_NB_WHEELS];//!< The constraint multipliers for each constraint group. + PxU32 nbWheelsInGroups; //!< The number of wheels in a constraint group. +}; + +/** +\brief The clutch is modelled as two spinning plates with one connected to the wheels through the gearing and the other connected to the engine. The clutch slip is angular speed difference of the two plates. +*/ +struct PxVehicleClutchSlipState +{ + /** + \brief The slip at the clutch. + + Unit: radians / time + */ + PxReal clutchSlip; + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleClutchSlipState)); + } +}; + + + + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/physxActor/PxVehiclePhysXActorComponents.h b/Source/ThirdParty/PhysX/vehicle2/physxActor/PxVehiclePhysXActorComponents.h new file mode 100644 index 000000000..f97c8f5b7 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/physxActor/PxVehiclePhysXActorComponents.h @@ -0,0 +1,238 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once +/** \addtogroup vehicle2 + @{ +*/ + +#include "vehicle2/PxVehicleParams.h" +#include "vehicle2/PxVehicleComponent.h" + +#include "vehicle2/wheel/PxVehicleWheelStates.h" + +#include "PxVehiclePhysXActorFunctions.h" +#include "PxVehiclePhysXActorStates.h" + +#include "common/PxProfileZone.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +/** +\brief Work items at the beginning of an update step for a PhysX actor based vehicle. + +Includes: + - Waking the actor up if it is sleeping and a throttle or steer command is issued. + - Clearing certain states if the actor is sleeping. + - Reading the state from the PhysX actor and copy to the vehicle internal state. + +@see PxVehiclePhysxActorWakeup PxVehiclePhysxActorSleepCheck PxVehicleReadRigidBodyStateFromPhysXActor +*/ +class PxVehiclePhysXActorBeginComponent : public PxVehicleComponent +{ +public: + + PxVehiclePhysXActorBeginComponent() : PxVehicleComponent() {} + virtual ~PxVehiclePhysXActorBeginComponent() {} + + /** + \brief Provide vehicle data items for this component. + + \param[out] axleDescription identifies the wheels on each axle. + \param[out] commands are the brake, throttle and steer values that will drive the vehicle. + \param[out] transmissionCommands are the target gear and clutch values that will control + the transmission. Can be set to NULL if the vehicle does not have a gearbox. If + specified, then gearParams and gearState has to be specifed too. + \param[out] gearParams The gearbox parameters. Can be set to NULL if the vehicle does + not have a gearbox and transmissionCommands is NULL. + \param[out] gearState The state of the gearbox. Can be set to NULL if the vehicle does + not have a gearbox and transmissionCommands is NULL. + \param[out] engineParams The engine parameters. Can be set to NULL if the vehicle does + not have an engine. Must be specified, if engineState is specified. + \param[out] physxActor is the PxRigidBody instance associated with the vehicle. + \param[out] physxSteerState is the previous state of the steer and is used to determine if the + steering wheel has changed by comparing with PxVehicleCommandState::steer. + \param[out] physxConstraints The state of the suspension limit and low speed tire constraints. + If the vehicle actor is sleeping and constraints are active, they will be + deactivated and marked as dirty. + \param[out] rigidBodyState is the state of the rigid body used by the Vehicle SDK. + \param[out] wheelRigidBody1dStates describes the angular speed of each wheel. + \param[out] engineState The engine state. Can be set to NULL if the vehicle does + not have an engine. If specified, then engineParams has to be specifed too. + */ + virtual void getDataForPhysXActorBeginComponent( + const PxVehicleAxleDescription*& axleDescription, + const PxVehicleCommandState*& commands, + const PxVehicleEngineDriveTransmissionCommandState*& transmissionCommands, + const PxVehicleGearboxParams*& gearParams, + const PxVehicleGearboxState*& gearState, + const PxVehicleEngineParams*& engineParams, + PxVehiclePhysXActor*& physxActor, + PxVehiclePhysXSteerState*& physxSteerState, + PxVehiclePhysXConstraints*& physxConstraints, + PxVehicleRigidBodyState*& rigidBodyState, + PxVehicleArrayData& wheelRigidBody1dStates, + PxVehicleEngineState*& engineState) = 0; + + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_UNUSED(dt); + PX_UNUSED(context); + + PX_PROFILE_ZONE("PxVehiclePhysXActorBeginComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + const PxVehicleCommandState* commands; + const PxVehicleEngineDriveTransmissionCommandState* transmissionCommands; + const PxVehicleGearboxParams* gearParams; + const PxVehicleGearboxState* gearState; + const PxVehicleEngineParams* engineParams; + PxVehiclePhysXActor* physxActor; + PxVehiclePhysXSteerState* physxSteerState; + PxVehiclePhysXConstraints* physxConstraints; + PxVehicleRigidBodyState* rigidBodyState; + PxVehicleArrayData wheelRigidBody1dStates; + PxVehicleEngineState* engineState; + + getDataForPhysXActorBeginComponent(axleDescription, commands, transmissionCommands, + gearParams, gearState, engineParams, + physxActor, physxSteerState, physxConstraints, + rigidBodyState, wheelRigidBody1dStates, engineState); + + if (physxActor->rigidBody->getScene()) // Considering case where actor is not in a scene and constraints get solved via immediate mode + { + PxVehiclePhysxActorWakeup(*commands, transmissionCommands, gearParams, gearState, + *physxActor->rigidBody, *physxSteerState); + + if (PxVehiclePhysxActorSleepCheck(*axleDescription, *physxActor->rigidBody, engineParams, + *rigidBodyState, *physxConstraints, wheelRigidBody1dStates, engineState)) + { + return false; + } + } + + PxVehicleReadRigidBodyStateFromPhysXActor(*physxActor->rigidBody, *rigidBodyState); + + return true; + } +}; + +/** +\brief Work items at the end of an update step for a PhysX actor based vehicle. + +Includes: + - Writing vehicle internal state to the PhysX actor. + - Keeping the vehicle awake if certain criteria are met. +*/ +class PxVehiclePhysXActorEndComponent : public PxVehicleComponent +{ +public: + + PxVehiclePhysXActorEndComponent() : PxVehicleComponent() {} + virtual ~PxVehiclePhysXActorEndComponent() {} + + /** + \brief Provide vehicle data items for this component. + + \param[out] axleDescription identifies the wheels on each axle. + \param[out] rigidBodyState is the state of the rigid body used by the Vehicle SDK. + \param[out] wheelParams describes the radius, mass etc. of the wheels. + \param[out] wheelShapeLocalPoses are the local poses in the wheel's frame to apply to the PxShape instances that represent the wheel + \param[out] wheelRigidBody1dStates describes the angular speed of the wheels. + \param[out] wheelLocalPoses describes the local poses of the wheels in the rigid body frame. + \param[out] gearState The gear state. Can be set to NULL if the vehicle does + not have gears. + \param[out] physxActor is the PxRigidBody instance associated with the vehicle. + */ + virtual void getDataForPhysXActorEndComponent( + const PxVehicleAxleDescription*& axleDescription, + const PxVehicleRigidBodyState*& rigidBodyState, + PxVehicleArrayData& wheelParams, + PxVehicleArrayData& wheelShapeLocalPoses, + PxVehicleArrayData& wheelRigidBody1dStates, + PxVehicleArrayData& wheelLocalPoses, + const PxVehicleGearboxState*& gearState, + PxVehiclePhysXActor*& physxActor) = 0; + + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_UNUSED(dt); + + PX_PROFILE_ZONE("PxVehiclePhysXActorEndComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + const PxVehicleRigidBodyState* rigidBodyState; + PxVehicleArrayData wheelParams; + PxVehicleArrayData wheelShapeLocalPoses; + PxVehicleArrayData wheelRigidBody1dStates; + PxVehicleArrayData wheelLocalPoses; + const PxVehicleGearboxState* gearState; + PxVehiclePhysXActor* physxActor; + + getDataForPhysXActorEndComponent(axleDescription, rigidBodyState, + wheelParams, wheelShapeLocalPoses, wheelRigidBody1dStates, wheelLocalPoses, gearState, + physxActor); + + for (PxU32 i = 0; i < axleDescription->nbWheels; i++) + { + const PxU32 wheelId = axleDescription->wheelIdsInAxleOrder[i]; + + PxVehicleWriteWheelLocalPoseToPhysXWheelShape(wheelLocalPoses[wheelId].localPose, wheelShapeLocalPoses[wheelId], + physxActor->wheelShapes[wheelId]); + } + + if (context.getType() == PxVehicleSimulationContextType::ePHYSX) + { + const PxVehiclePhysXSimulationContext& physxContext = static_cast(context); + + PxVehicleWriteRigidBodyStateToPhysXActor(physxContext.physxActorUpdateMode, *rigidBodyState, dt, *physxActor->rigidBody); + + PxVehiclePhysxActorKeepAwakeCheck(*axleDescription, wheelParams, wheelRigidBody1dStates, + physxContext.physxActorWakeCounterThreshold, physxContext.physxActorWakeCounterResetValue, gearState, + *physxActor->rigidBody); + } + else + { + PX_ALWAYS_ASSERT(); + } + + return true; + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/physxActor/PxVehiclePhysXActorFunctions.h b/Source/ThirdParty/PhysX/vehicle2/physxActor/PxVehiclePhysXActorFunctions.h new file mode 100644 index 000000000..cd7072ef6 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/physxActor/PxVehiclePhysXActorFunctions.h @@ -0,0 +1,195 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxSimpleTypes.h" + +#include "vehicle2/PxVehicleParams.h" + +#if !PX_DOXYGEN +namespace physx +{ + +class PxRigidBody; +class PxShape; + +namespace vehicle2 +{ +#endif + +struct PxVehicleCommandState; +struct PxVehicleEngineDriveTransmissionCommandState; +struct PxVehicleEngineParams; +struct PxVehicleEngineState; +struct PxVehicleGearboxParams; +struct PxVehicleGearboxState; +struct PxVehicleRigidBodyState; +struct PxVehiclePhysXConstraints; +struct PxVehicleWheelLocalPose; +struct PxVehicleWheelParams; +struct PxVehicleWheelRigidBody1dState; +struct PxVehiclePhysXSteerState; + +/** +\brief Wake up the physx actor if the actor is asleep and the commands signal an intent to +change the state of the vehicle. +\param[in] commands are the brake, throttle and steer values that will drive the vehicle. +\param[in] transmissionCommands are the target gear and clutch values that will control + the transmission. If the target gear is different from the current gearbox + target gear, then the physx actor will get woken up. Can be set to NULL if the + vehicle does not have a gearbox or if this is not a desired behavior. If + specified, then gearParams and gearState has to be specifed too. +\param[in] gearParams The gearbox parameters. Can be set to NULL if the vehicle does + not have a gearbox and transmissionCommands is NULL. +\param[in] gearState The state of the gearbox. Can be set to NULL if the vehicle does + not have a gearbox and transmissionCommands is NULL. +\param[in] physxActor is the PxRigidBody instance associated with the vehicle. +\param[in,out] physxSteerState and commands are compared to +determine if the steering state has changed since the last call to PxVehiclePhysxActorWakeup(). +\note If the steering has changed, the actor will be woken up. +\note On exit from PxVehiclePhysxActorWakeup, physxSteerState.previousSteerCommand is assigned to the value +of commands.steer so that the steer state may be propagated to the subsequent call to PxVehiclePhysxActorWakeup(). +\note If physxSteerState.previousSteerCommand has value PX_VEHICLE_UNSPECIFIED_STEER_STATE, the steering state +is treated as though it has not changed. +*/ +void PxVehiclePhysxActorWakeup( + const PxVehicleCommandState& commands, + const PxVehicleEngineDriveTransmissionCommandState* transmissionCommands, + const PxVehicleGearboxParams* gearParams, + const PxVehicleGearboxState* gearState, + PxRigidBody& physxActor, + PxVehiclePhysXSteerState& physxSteerState); + +/** +\brief Check if the physx actor is sleeping and clear certain vehicle states if it is. + +\param[in] axleDescription identifies the wheels on each axle. +\param[in] physxActor is the PxRigidBody instance associated with the vehicle. +\param[in] engineParams The engine parameters. Can be set to NULL if the vehicle does + not have an engine. Must be specified, if engineState is specified. +\param[in,out] rigidBodyState is the state of the rigid body used by the Vehicle SDK. +\param[in,out] physxConstraints The state of the suspension limit and low speed tire constraints. + If the vehicle actor is sleeping and constraints are active, they will be + deactivated and marked as dirty. +\param[in,out] wheelRigidBody1dStates describes the angular speed of the wheels. +\param[out] engineState The engine state. Can be set to NULL if the vehicle does + not have an engine. If specified, then engineParams has to be specifed too. + The engine rotation speed will get set to the idle rotation speed if + the actor is sleeping. +\return True if the actor was sleeping, else false. +*/ +bool PxVehiclePhysxActorSleepCheck +(const PxVehicleAxleDescription& axleDescription, + const PxRigidBody& physxActor, + const PxVehicleEngineParams* engineParams, + PxVehicleRigidBodyState& rigidBodyState, + PxVehiclePhysXConstraints& physxConstraints, + PxVehicleArrayData& wheelRigidBody1dStates, + PxVehicleEngineState* engineState); + +/** +\brief Check if the physx actor has to be kept awake. + +Certain criteria should keep the vehicle physx actor awake, for example, if the +(mass normalized) rotational kinetic energy of the wheels is above a certain +threshold or if a gear change is pending. This method will reset the wake +counter of the physx actor to a specified value, if any of the mentioned +criterias are met. + +\note The physx actor's sleep threshold will be used as threshold to test against + for the energy criteria. + +\param[in] axleDescription identifies the wheels on each axle. +\param[in] wheelParams describes the radius, mass etc. of the wheels. +\param[in] wheelRigidBody1dStates describes the angular speed of the wheels. +\param[in] wakeCounterThreshold Once the wake counter of the physx actor falls + below this threshold, the method will start testing if the wake + counter needs to be reset. +\param[in] wakeCounterResetValue The value to set the physx actor wake counter + to, if any of the criteria to do so are met. +\param[in] gearState The gear state. Can be set to NULL if the vehicle does + not have gears or if the mentioned behavior is not desired. +\param[in] physxActor is the PxRigidBody instance associated with the vehicle. +*/ +void PxVehiclePhysxActorKeepAwakeCheck +(const PxVehicleAxleDescription& axleDescription, + const PxVehicleArrayData& wheelParams, + const PxVehicleArrayData& wheelRigidBody1dStates, + const PxReal wakeCounterThreshold, + const PxReal wakeCounterResetValue, + const PxVehicleGearboxState* gearState, + PxRigidBody& physxActor); + + +/** +\brief Read the rigid body state from a PhysX actor. +\param[in] physxActor is a reference to a PhysX actor. +\param[out] rigidBodyState is the state of the rigid body used by the Vehicle SDK. +*/ +void PxVehicleReadRigidBodyStateFromPhysXActor +(const PxRigidBody& physxActor, + PxVehicleRigidBodyState& rigidBodyState); + +/** +\brief Update the local pose of a PxShape that is associated with a wheel. +\param[in] wheelLocalPose describes the local pose of each wheel in the rigid body frame. +\param[in] wheelShapeLocalPose describes the local pose to apply to the PxShape instance in the wheel's frame. +\param[in] shape is the target PxShape. +*/ +void PxVehicleWriteWheelLocalPoseToPhysXWheelShape +(const PxTransform& wheelLocalPose, const PxTransform& wheelShapeLocalPose, PxShape* shape); + +/** +\brief Write the rigid body state to a PhysX actor. +\param[in] physxActorUpdateMode controls whether the PhysX actor is to be updated with +instantaneous velocity changes or with accumulated accelerations to be applied in +the next simulation step of the associated PxScene. +\param[in] rigidBodyState is the state of the rigid body. +\param[in] dt is the simulation time that has elapsed since the last call to +PxVehicleWriteRigidBodyStateToPhysXActor(). +\param[out] physXActor is a reference to the PhysX actor. +*/ +void PxVehicleWriteRigidBodyStateToPhysXActor +(const PxVehiclePhysXActorUpdateMode::Enum physxActorUpdateMode, + const PxVehicleRigidBodyState& rigidBodyState, + const PxReal dt, + PxRigidBody& physXActor); + + + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/physxActor/PxVehiclePhysXActorHelpers.h b/Source/ThirdParty/PhysX/vehicle2/physxActor/PxVehiclePhysXActorHelpers.h new file mode 100644 index 000000000..a4ee94df7 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/physxActor/PxVehiclePhysXActorHelpers.h @@ -0,0 +1,209 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "PxFiltering.h" +#include "PxShape.h" + +#if !PX_DOXYGEN +namespace physx +{ + +class PxGeometry; +class PxMaterial; +struct PxCookingParams; + +namespace vehicle2 +{ +#endif + +struct PxVehicleRigidBodyParams; +struct PxVehicleAxleDescription; +struct PxVehicleWheelParams; +struct PxVehiclePhysXActor; +struct PxVehicleFrame; +struct PxVehicleSuspensionParams; + +class PxVehiclePhysXRigidActorParams +{ + PX_NOCOPY(PxVehiclePhysXRigidActorParams) + +public: + + PxVehiclePhysXRigidActorParams(const PxVehicleRigidBodyParams& _physxActorRigidBodyParams, const char* _physxActorName) + : rigidBodyParams(_physxActorRigidBodyParams), + physxActorName(_physxActorName) + { + } + + const PxVehicleRigidBodyParams& rigidBodyParams; + const char* physxActorName; +}; + +class PxVehiclePhysXRigidActorShapeParams +{ + PX_NOCOPY(PxVehiclePhysXRigidActorShapeParams) + +public: + + PxVehiclePhysXRigidActorShapeParams + (const PxGeometry& _geometry, const PxTransform& _localPose, const PxMaterial& _material, + const PxShapeFlags _flags, const PxFilterData& _simulationFilterData, const PxFilterData& _queryFilterData) + : geometry(_geometry), + localPose(_localPose), + material(_material), + flags(_flags), + simulationFilterData(_simulationFilterData), + queryFilterData(_queryFilterData) + { + } + + const PxGeometry& geometry; + const PxTransform& localPose; + const PxMaterial& material; + PxShapeFlags flags; + PxFilterData simulationFilterData; + PxFilterData queryFilterData; +}; + +class PxVehiclePhysXWheelParams +{ + PX_NOCOPY(PxVehiclePhysXWheelParams) + +public: + + PxVehiclePhysXWheelParams(const PxVehicleAxleDescription& _axleDescription, const PxVehicleWheelParams* _wheelParams) + : axleDescription(_axleDescription), + wheelParams(_wheelParams) + { + } + + const PxVehicleAxleDescription& axleDescription; + const PxVehicleWheelParams* wheelParams; +}; + +class PxVehiclePhysXWheelShapeParams +{ + PX_NOCOPY(PxVehiclePhysXWheelShapeParams) + +public: + + PxVehiclePhysXWheelShapeParams(const PxMaterial& _material, const PxShapeFlags _flags, const PxFilterData _simulationFilterData, const PxFilterData _queryFilterData) + : material(_material), + flags(_flags), + simulationFilterData(_simulationFilterData), + queryFilterData(_queryFilterData) + { + } + + const PxMaterial& material; + PxShapeFlags flags; + PxFilterData simulationFilterData; + PxFilterData queryFilterData; +}; + +/** +\brief Create a PxRigidDynamic instance, instantiate it with desired properties and populate it with PxShape instances. +\param[in] vehicleFrame describes the frame of the vehicle. +\param[in] rigidActorParams describes the mass and moment of inertia of the rigid body. +\param[in] rigidActorCmassLocalPose specifies the mapping between actor and rigid body frame. +\param[in] rigidActorShapeParams describes the collision geometry associated with the rigid body. +\param[in] wheelParams describes the radius and half-width of the wheels. +\param[in] wheelShapeParams describes the PxMaterial and PxShapeFlags to apply to the wheel shapes. +\param[in] physics is a PxPhysics instance. +\param[in] params is a PxCookingParams instance +\param[in] vehiclePhysXActor is a record of the PxRigidDynamic and PxShape instances instantiated. +\note This is an alternative to PxVehiclePhysXArticulationLinkCreate. +\note PxVehiclePhysXActorCreate primarily serves as an illustration of the instantiation of the PhysX class instances +required to simulate a vehicle with a PxRigidDynamic. +@see PxVehiclePhysXActorDestroy +*/ +void PxVehiclePhysXActorCreate +(const PxVehicleFrame& vehicleFrame, + const PxVehiclePhysXRigidActorParams& rigidActorParams, const PxTransform& rigidActorCmassLocalPose, + const PxVehiclePhysXRigidActorShapeParams& rigidActorShapeParams, + const PxVehiclePhysXWheelParams& wheelParams, const PxVehiclePhysXWheelShapeParams& wheelShapeParams, + PxPhysics& physics, const PxCookingParams& params, + PxVehiclePhysXActor& vehiclePhysXActor); + + +/** +\brief Configure an actor so that it is ready for vehicle simulation. +\param[in] rigidActorParams describes the mass and moment of inertia of the rigid body. +\param[in] rigidActorCmassLocalPose specifies the mapping between actor and rigid body frame. +\param[out] rigidBody is the body to be prepared for simulation. +*/ +void PxVehiclePhysXActorConfigure +(const PxVehiclePhysXRigidActorParams& rigidActorParams, const PxTransform& rigidActorCmassLocalPose, + PxRigidBody& rigidBody); + +/** +\brief Create a PxArticulationReducedCoordinate and a single PxArticulationLink, +instantiate the PxArticulationLink with desired properties and populate it with PxShape instances. +\param[in] vehicleFrame describes the frame of the vehicle. +\param[in] rigidActorParams describes the mass and moment of inertia of the rigid body. +\param[in] rigidActorCmassLocalPose specifies the mapping between actor and rigid body frame. +\param[in] rigidActorShapeParams describes the collision geometry associated with the rigid body. +\param[in] wheelParams describes the radius and half-width of the wheels. +\param[in] wheelShapeParams describes the PxMaterial and PxShapeFlags to apply to the wheel shapes. +\param[in] physics is a PxPhysics instance. +\param[in] params is a PxCookingParams instance +\param[in] vehiclePhysXActor is a record of the PxArticulationReducedCoordinate, PxArticulationLink and PxShape instances instantiated. +\note This is an alternative to PxVehiclePhysXActorCreate. +\note PxVehiclePhysXArticulationLinkCreate primarily serves as an illustration of the instantiation of the PhysX class instances +required to simulate a vehicle as part of an articulated ensemble. +@see PxVehiclePhysXActorDestroy +*/ +void PxVehiclePhysXArticulationLinkCreate +(const PxVehicleFrame& vehicleFrame, + const PxVehiclePhysXRigidActorParams& rigidActorParams, const PxTransform& rigidActorCmassLocalPose, + const PxVehiclePhysXRigidActorShapeParams& rigidActorShapeParams, + const PxVehiclePhysXWheelParams& wheelParams, const PxVehiclePhysXWheelShapeParams& wheelShapeParams, + PxPhysics& physics, const PxCookingParams& params, + PxVehiclePhysXActor& vehiclePhysXActor); + +/** +\brief Release the PxRigidDynamic, PxArticulationReducedCoordinate, PxArticulationLink and PxShape instances +instantiated by PxVehiclePhysXActorCreate or PxVehiclePhysXArticulationLinkCreate. +\param[in] vehiclePhysXActor is a description of the PhysX instances to be released. +*/ +void PxVehiclePhysXActorDestroy(PxVehiclePhysXActor& vehiclePhysXActor); + + + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/physxActor/PxVehiclePhysXActorStates.h b/Source/ThirdParty/PhysX/vehicle2/physxActor/PxVehiclePhysXActorStates.h new file mode 100644 index 000000000..617649c36 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/physxActor/PxVehiclePhysXActorStates.h @@ -0,0 +1,98 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxPreprocessor.h" +#include "foundation/PxMemory.h" + +#include "PxRigidBody.h" + +#include "vehicle2/PxVehicleLimits.h" + +#if !PX_DOXYGEN +namespace physx +{ + +class PxShape; + +namespace vehicle2 +{ +#endif + +/** +\brief A description of the PhysX actor and shapes that represent the vehicle in an associated PxScene. +*/ +struct PxVehiclePhysXActor +{ + /** + \brief The PhysX rigid body that represents the vehcle in the associated PhysX scene. + \note PxActorFlag::eDISABLE_GRAVITY must be set true on the PxRigidBody + */ + PxRigidBody* rigidBody; + + /** + \brief An array of shapes with one shape pointer (or NULL) for each wheel. + */ + PxShape* wheelShapes[PxVehicleLimits::eMAX_NB_WHEELS]; + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehiclePhysXActor)); + } +}; + + +#define PX_VEHICLE_UNSPECIFIED_STEER_STATE PX_MAX_F32 + +/** +\brief A description of the previous steer command applied to the vehicle. +*/ +struct PxVehiclePhysXSteerState +{ + + /** + \brief The steer command that was most previously applied to the vehicle. + */ + PxReal previousSteerCommand; + + PX_FORCE_INLINE void setToDefault() + { + previousSteerCommand = PX_VEHICLE_UNSPECIFIED_STEER_STATE; + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/physxConstraints/PxVehiclePhysXConstraintComponents.h b/Source/ThirdParty/PhysX/vehicle2/physxConstraints/PxVehiclePhysXConstraintComponents.h new file mode 100644 index 000000000..a362e0839 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/physxConstraints/PxVehiclePhysXConstraintComponents.h @@ -0,0 +1,123 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "vehicle2/PxVehicleParams.h" +#include "vehicle2/PxVehicleComponent.h" + +#include "vehicle2/roadGeometry/PxVehicleRoadGeometryState.h" +#include "vehicle2/suspension/PxVehicleSuspensionParams.h" +#include "vehicle2/suspension/PxVehicleSuspensionStates.h" + +#include "PxVehiclePhysXConstraintFunctions.h" +#include "PxVehiclePhysXConstraintHelpers.h" +#include "PxVehiclePhysXConstraintStates.h" +#include "PxVehiclePhysXConstraintParams.h" + +#include "common/PxProfileZone.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +class PxVehiclePhysXConstraintComponent : public PxVehicleComponent +{ +public: + PxVehiclePhysXConstraintComponent() : PxVehicleComponent() {} + virtual ~PxVehiclePhysXConstraintComponent() {} + + virtual void getDataForPhysXConstraintComponent( + const PxVehicleAxleDescription*& axleDescription, + const PxVehicleRigidBodyState*& rigidBodyState, + PxVehicleArrayData& suspensionParams, + PxVehicleArrayData& suspensionLimitParams, + PxVehicleArrayData& suspensionStates, + PxVehicleArrayData& suspensionComplianceStates, + PxVehicleArrayData& wheelRoadGeomStates, + PxVehicleArrayData& tireDirectionStates, + PxVehicleArrayData& tireStickyStates, + PxVehiclePhysXConstraints*& constraints) = 0; + + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_UNUSED(dt); + PX_UNUSED(context); + + PX_PROFILE_ZONE("PxVehiclePhysXConstraintComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + const PxVehicleRigidBodyState* rigidBodyState; + PxVehicleArrayData suspensionParams; + PxVehicleArrayData suspensionLimitParams; + PxVehicleArrayData suspensionStates; + PxVehicleArrayData suspensionComplianceStates; + PxVehicleArrayData wheelRoadGeomStates; + PxVehicleArrayData tireDirectionStates; + PxVehicleArrayData tireStickyStates; + PxVehiclePhysXConstraints* constraints; + + getDataForPhysXConstraintComponent(axleDescription, rigidBodyState, + suspensionParams, suspensionLimitParams, suspensionStates, suspensionComplianceStates, + wheelRoadGeomStates, tireDirectionStates, tireStickyStates, + constraints); + + PxVehicleConstraintsDirtyStateUpdate(*constraints); + + for (PxU32 i = 0; i < axleDescription->nbWheels; i++) + { + const PxU32 wheelId = axleDescription->wheelIdsInAxleOrder[i]; + + PxVehiclePhysXConstraintStatesUpdate( + suspensionParams[wheelId], suspensionLimitParams[wheelId], + suspensionStates[wheelId], suspensionComplianceStates[wheelId], + wheelRoadGeomStates[wheelId].plane.n, + context.tireStickyParams.stickyParams[PxVehicleTireDirectionModes::eLONGITUDINAL].damping, + context.tireStickyParams.stickyParams[PxVehicleTireDirectionModes::eLATERAL].damping, + tireDirectionStates[wheelId], tireStickyStates[wheelId], + *rigidBodyState, + constraints->constraintStates[wheelId]); + } + + return true; + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/physxConstraints/PxVehiclePhysXConstraintFunctions.h b/Source/ThirdParty/PhysX/vehicle2/physxConstraints/PxVehiclePhysXConstraintFunctions.h new file mode 100644 index 000000000..d1993ccfa --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/physxConstraints/PxVehiclePhysXConstraintFunctions.h @@ -0,0 +1,92 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxVec3.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +struct PxVehicleSuspensionParams; +struct PxVehiclePhysXSuspensionLimitConstraintParams; +struct PxVehicleSuspensionState; +struct PxVehicleSuspensionComplianceState; +struct PxVehicleTireDirectionState; +struct PxVehicleTireStickyState; +struct PxVehicleRigidBodyState; +struct PxVehiclePhysXConstraintState; + +/** +\brief Read constraint data from the vehicle's internal state for a single wheel and write it to a +structure that will be read by the associated PxScene and used to impose the constraints during the next +PxScene::simulate() step. +\param[in] suspensionParams describes the suspension frame. +\param[in] suspensionLimitParams describes the restitution value applied to any constraint triggered by +the suspension travel limit. +\param[in] suspensionState describes the excess suspension compression beyond the suspension travel limit that will be +resolved with a constraint. +\param[in] suspensionComplianceState describes the effect of suspension compliance on the effective application point +of the suspension force. +\param[in] groundPlaneNormal The normal direction of the ground plane the wheel is driving on. A normalized vector is + expected. +\param[in] tireStickyDampingLong The damping coefficient to use in the constraint to approach a zero target velocity + along the longitudinal tire axis. +\param[in] tireStickyDampingLat Same concept as tireStickyDampingLong but for the lateral tire axis. +\param[in] tireDirectionState describes the longitudinal and lateral directions of the tire in the world frame. +\param[in] tireStickyState describes the low speed state of the tire in the longitudinal and lateral directions. +\param[in] rigidBodyState describes the pose of the rigid body. +\param[out] constraintState is the data structure that will be read by the associated PxScene in the next call to +PxScene::simulate(). +\note Constraints include suspension constraints to account for suspension travel limit and sticky +tire constraints that bring the vehicle to rest at low longitudinal and lateral speed. +*/ +void PxVehiclePhysXConstraintStatesUpdate +(const PxVehicleSuspensionParams& suspensionParams, + const PxVehiclePhysXSuspensionLimitConstraintParams& suspensionLimitParams, + const PxVehicleSuspensionState& suspensionState, const PxVehicleSuspensionComplianceState& suspensionComplianceState, + const PxVec3& groundPlaneNormal, + const PxReal tireStickyDampingLong, const PxReal tireStickyDampingLat, + const PxVehicleTireDirectionState& tireDirectionState, const PxVehicleTireStickyState& tireStickyState, + const PxVehicleRigidBodyState& rigidBodyState, + PxVehiclePhysXConstraintState& constraintState); + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/physxConstraints/PxVehiclePhysXConstraintHelpers.h b/Source/ThirdParty/PhysX/vehicle2/physxConstraints/PxVehiclePhysXConstraintHelpers.h new file mode 100644 index 000000000..a42f126ad --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/physxConstraints/PxVehiclePhysXConstraintHelpers.h @@ -0,0 +1,92 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +#include "foundation/PxPreprocessor.h" + +/** \addtogroup vehicle2 + @{ +*/ + +#if !PX_DOXYGEN +namespace physx +{ + +class PxPhysics; +class PxRigidBody; + +namespace vehicle2 +{ +#endif + +struct PxVehicleAxleDescription; +struct PxVehiclePhysXConstraints; + +/** +\brief Instantiate the PhysX custom constraints. + +Custom constraints will resolve excess suspension compression and velocity constraints that serve as +a replacement low speed tire model. + +\param[in] axleDescription describes the axles of the vehicle and the wheels on each axle. +\param[in] physics is a PxPhysics instance. +\param[in] physxActor is the vehicle's PhysX representation as a PxRigidBody +\param[in] vehicleConstraints is a wrapper class that holds pointers to PhysX objects required to implement the custom constraint. +*/ +void PxVehicleConstraintsCreate +(const PxVehicleAxleDescription& axleDescription, + PxPhysics& physics, PxRigidBody& physxActor, + PxVehiclePhysXConstraints& vehicleConstraints); + +/** +\brief To ensure the constraints are processed by the PhysX scene they are marked as dirty prior to each simulate step. + +\param[in] vehicleConstraints is a wrapper class that holds pointers to PhysX objects required to implement the custom constraint. + +@see PxVehicleConstraintsCreate +*/ +void PxVehicleConstraintsDirtyStateUpdate +(PxVehiclePhysXConstraints& vehicleConstraints); + +/** +\brief Destroy the PhysX custom constraints. + +\param[in,out] vehicleConstraints describes the PhysX custom constraints to be released. + +@see PxVehicleConstraintsCreate +*/ +void PxVehicleConstraintsDestroy +(PxVehiclePhysXConstraints& vehicleConstraints); + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/physxConstraints/PxVehiclePhysXConstraintParams.h b/Source/ThirdParty/PhysX/vehicle2/physxConstraints/PxVehiclePhysXConstraintParams.h new file mode 100644 index 000000000..9da860729 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/physxConstraints/PxVehiclePhysXConstraintParams.h @@ -0,0 +1,110 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxFoundation.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +struct PxVehicleFrame; +struct PxVehicleScale; + +/** +\brief A description of the PhysX models employed to resolve suspension limit constraints. +@see PxVehiclePhysXConstraintState +*/ +struct PxVehiclePhysXSuspensionLimitConstraintParams +{ + /** + \brief restitution is used by the restitution model used to generate a target velocity when resolving suspension limit + constraints. + \note A value of 0.0 means that the restitution model is not employed. + \note Restitution has no effect if directionForSuspensionLimitConstraint has value Enum::eNONE. + @see Px1DConstraintFlag::eRESTITUTION + @see Px1DConstraint::RestitutionModifiers::restitution + */ + PxReal restitution; + + /** + \brief Set the direction to apply a constraint impulse when the suspension cannot place the wheel on the ground + and simultaneously respect the limits of suspension travel. The choices are to push along the ground normal to resolve the + geometric error or to push along the suspension direction. The former choice can be thought of as mimicing a force applied + by the tire's contact with the ground, while the latter can be thought of as mimicing a force arising from a suspension limit spring. + When the ground normal and the suspension direction are approximately aligned, both do an equivalent job of maintaining the wheel above + the ground. When the vehicle is on its side, eSUSPENSION does a better job of keeping the wheels above + the ground but comes at the cost of an unnaturally strong torque that can lead to unwanted self-righting behaviour. + eROAD_GEOMETRY_NORMAL is a good choice to avoid self-righting behaviour and still do a reasonable job at maintaining + the wheel above the ground in the event that the vehicle is tending towards a roll onto its side. + eNONE should be chosen if it is desired that no extra impulse is applied when the suspension alone cannot keep the wheels above + the ground plane. + */ + enum DirectionSpecifier + { + eSUSPENSION, + eROAD_GEOMETRY_NORMAL, + eNONE + }; + DirectionSpecifier directionForSuspensionLimitConstraint; + + PX_FORCE_INLINE PxVehiclePhysXSuspensionLimitConstraintParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PX_UNUSED(srcScale); + PX_UNUSED(trgScale); + return *this; + } + + PX_FORCE_INLINE bool isValid() const + { + PX_CHECK_AND_RETURN_VAL( + PxVehiclePhysXSuspensionLimitConstraintParams::eSUSPENSION == directionForSuspensionLimitConstraint || + PxVehiclePhysXSuspensionLimitConstraintParams::eROAD_GEOMETRY_NORMAL == directionForSuspensionLimitConstraint || + PxVehiclePhysXSuspensionLimitConstraintParams::eNONE == directionForSuspensionLimitConstraint, "PxVehiclePhysXSuspensionLimitConstraintParams.directionForSuspensionLimitConstraint must have legal value", false); + PX_CHECK_AND_RETURN_VAL(restitution >= 0.0f && restitution <= 1.0f, "PxVehiclePhysXSuspensionLimitConstraintParams.restitution must be in range [0, 1]", false); + return true; + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/physxConstraints/PxVehiclePhysXConstraintStates.h b/Source/ThirdParty/PhysX/vehicle2/physxConstraints/PxVehiclePhysXConstraintStates.h new file mode 100644 index 000000000..ae312341e --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/physxConstraints/PxVehiclePhysXConstraintStates.h @@ -0,0 +1,357 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxAssert.h" +#include "foundation/PxTransform.h" +#include "extensions/PxConstraintExt.h" + +#include "vehicle2/PxVehicleLimits.h" +#include "vehicle2/tire/PxVehicleTireStates.h" + +#include "PxConstraint.h" +#include "PxConstraintDesc.h" + +#if !PX_DOXYGEN +namespace physx +{ + +class PxConstraint; + +namespace vehicle2 +{ +#endif + + +/** +\brief A description of the number of PxConstraintConnector instances per vehicle required to maintain suspension limit +and sticky tire instances. +*/ +struct PxVehiclePhysXConstraintLimits +{ + enum Enum + { + eNB_DOFS_PER_PXCONSTRAINT = 12, + eNB_DOFS_PER_WHEEL = 3, + eNB_WHEELS_PER_PXCONSTRAINT = eNB_DOFS_PER_PXCONSTRAINT / eNB_DOFS_PER_WHEEL, + eNB_CONSTRAINTS_PER_VEHICLE = (PxVehicleLimits::eMAX_NB_WHEELS + (eNB_WHEELS_PER_PXCONSTRAINT - 1)) / (eNB_WHEELS_PER_PXCONSTRAINT) + }; +}; + +/** +\brief PxVehiclePhysXConstraintState is a data structure used to write +constraint data to the internal state of the associated PxScene. +@see Px1dConstraint +*/ +struct PxVehiclePhysXConstraintState +{ + /** + \brief a boolean describing whether to trigger a low speed constraint along the tire longitudinal and lateral directions. + */ + bool tireActiveStatus[PxVehicleTireDirectionModes::eMAX_NB_PLANAR_DIRECTIONS]; + /** + \brief linear component of velocity jacobian in world space for the tire's longitudinal and lateral directions. + */ + PxVec3 tireLinears[PxVehicleTireDirectionModes::eMAX_NB_PLANAR_DIRECTIONS]; + /** + \brief angular component of velocity jacobian in world space for the tire's longitudinal and lateral directions. + */ + PxVec3 tireAngulars[PxVehicleTireDirectionModes::eMAX_NB_PLANAR_DIRECTIONS]; + /** + \brief damping coefficient applied to the tire's longitudinal and lateral velocities. + + The constraint sets a target velocity of 0 and the damping coefficient will impact the size of the + impulse applied to reach the target. Since damping acts as a stiffness with respect to the velocity, + too large a value can cause instabilities. + */ + PxReal tireDamping[PxVehicleTireDirectionModes::eMAX_NB_PLANAR_DIRECTIONS]; + + + /** + \brief a boolean describing whether to trigger a suspension limit constraint. + */ + bool suspActiveStatus; + /** + \brief linear component of velocity jacobian in the world frame. + */ + PxVec3 suspLinear; + /** + \brief angular component of velocity jacobian in the world frame. + */ + PxVec3 suspAngular; + /** + \brief the excess suspension compression to be resolved by the constraint that cannot be resolved due to the travel limit + of the suspension spring. + + \note The expected error value is the excess suspension compression projected onto the ground plane normal and should have + a negative sign. + */ + PxReal suspGeometricError; + /** + \brief restitution value of the restitution model used to generate a target velocity that will resolve the geometric error. + \note A value of 0.0 means that the restitution model is not employed. + @see Px1DConstraintFlag::eRESTITUTION + @see Px1DConstraint::RestitutionModifiers::restitution + */ + PxReal restitution; + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehiclePhysXConstraintState)); + } +}; + +//TAG:solverprepshader +PX_FORCE_INLINE PxU32 vehicleConstraintSolverPrep +(Px1DConstraint* constraints, + PxVec3p& body0WorldOffset, + PxU32 maxConstraints, + PxConstraintInvMassScale&, + const void* constantBlock, + const PxTransform& bodyAToWorld, + const PxTransform& bodyBToWorld, + bool, + PxVec3p& cA2w, PxVec3p& cB2w) +{ + PX_UNUSED(maxConstraints); + PX_UNUSED(body0WorldOffset); + PX_UNUSED(bodyBToWorld); + PX_ASSERT(bodyAToWorld.isValid()); PX_ASSERT(bodyBToWorld.isValid()); + + const PxVehiclePhysXConstraintState* data = static_cast(constantBlock); + PxU32 numActive = 0; + + //KS - the TGS solver will use raXn to try to add to the angular part of the linear constraints. + //We overcome this by setting the ra and rb offsets to be 0. + cA2w = bodyAToWorld.p; + cB2w = bodyBToWorld.p; + // note: this is only needed for PxSolverType::eTGS and even then it should not have an effect as + // long as a constraint raises Px1DConstraintFlag::eANGULAR_CONSTRAINT + + //Susp limit constraints. + for (PxU32 i = 0; i < PxVehiclePhysXConstraintLimits::eNB_WHEELS_PER_PXCONSTRAINT; i++) + { + if (data[i].suspActiveStatus) + { + // Going beyond max suspension compression should be treated similar to rigid body contacts. + // Thus setting up constraints that try to emulate such contacts. + // + // linear l = contact normal = n + // angular a = suspension force application offset x contact normal = cross(r, n) + // + // velocity at contact: + // vl: part from linear vehicle velocity v + // vl = dot(n, v) = dot(l, v) + // + // va: part from angular vehicle velocity w + // va = dot(n, cross(w, r)) = dot(w, cross(r, n)) = dot(w, a) + // + // ve: part from excess suspension compression + // ve = (geomError / dt) (note: geomError is expected to be negative here) + // + // velocity target vt = vl + va + ve + // => should become 0 by applying positive impulse along l. If vt is positive, + // nothing will happen as a negative impulse would have to be applied (but + // min impulse is set to 0). If vt is negative, a positive impulse will get + // applied to push vt towards 0. + // + + Px1DConstraint& p = constraints[numActive]; + p.linear0 = data[i].suspLinear; + p.angular0 = data[i].suspAngular; + p.geometricError = data[i].suspGeometricError; + p.linear1 = PxVec3(0); + p.angular1 = PxVec3(0); + p.minImpulse = 0; + p.maxImpulse = FLT_MAX; + p.velocityTarget = 0; + p.solveHint = PxConstraintSolveHint::eINEQUALITY; + + // note: this is only needed for PxSolverType::eTGS to not have the angular part + // be modified based on the linear part during substeps. Basically, it will + // disable the constraint re-projection etc. to emulate PxSolverType::ePGS. + p.flags |= Px1DConstraintFlag::eANGULAR_CONSTRAINT; + + if (data[i].restitution > 0.0f) + { + p.flags |= Px1DConstraintFlag::eRESTITUTION; + p.mods.bounce.restitution = data[i].restitution; + p.mods.bounce.velocityThreshold = -FLT_MAX; + } + numActive++; + } + } + + //Sticky tire friction constraints. + for (PxU32 i = 0; i < PxVehiclePhysXConstraintLimits::eNB_WHEELS_PER_PXCONSTRAINT; i++) + { + if (data[i].tireActiveStatus[PxVehicleTireDirectionModes::eLONGITUDINAL]) + { + Px1DConstraint& p = constraints[numActive]; + p.linear0 = data[i].tireLinears[PxVehicleTireDirectionModes::eLONGITUDINAL]; + p.angular0 = data[i].tireAngulars[PxVehicleTireDirectionModes::eLONGITUDINAL]; + p.geometricError = 0.0f; + p.linear1 = PxVec3(0); + p.angular1 = PxVec3(0); + p.minImpulse = -FLT_MAX; + p.maxImpulse = FLT_MAX; + p.velocityTarget = 0.0f; + p.mods.spring.damping = data[i].tireDamping[PxVehicleTireDirectionModes::eLONGITUDINAL]; + // note: no stiffness specified as this will have no effect with geometricError=0 + p.flags = Px1DConstraintFlag::eSPRING | Px1DConstraintFlag::eACCELERATION_SPRING; + p.flags |= Px1DConstraintFlag::eANGULAR_CONSTRAINT; // see explanation of same flag usage further above + numActive++; + } + } + + //Sticky tire friction constraints. + for (PxU32 i = 0; i < PxVehiclePhysXConstraintLimits::eNB_WHEELS_PER_PXCONSTRAINT; i++) + { + if (data[i].tireActiveStatus[PxVehicleTireDirectionModes::eLATERAL]) + { + Px1DConstraint& p = constraints[numActive]; + p.linear0 = data[i].tireLinears[PxVehicleTireDirectionModes::eLATERAL]; + p.angular0 = data[i].tireAngulars[PxVehicleTireDirectionModes::eLATERAL]; + p.geometricError = 0.0f; + p.linear1 = PxVec3(0); + p.angular1 = PxVec3(0); + p.minImpulse = -FLT_MAX; + p.maxImpulse = FLT_MAX; + p.velocityTarget = 0.0f; + p.mods.spring.damping = data[i].tireDamping[PxVehicleTireDirectionModes::eLATERAL]; + // note: no stiffness specified as this will have no effect with geometricError=0 + p.flags = Px1DConstraintFlag::eSPRING | Px1DConstraintFlag::eACCELERATION_SPRING; + p.flags |= Px1DConstraintFlag::eANGULAR_CONSTRAINT; // see explanation of same flag usage further above + numActive++; + } + } + + return numActive; +} + +PX_FORCE_INLINE void visualiseVehicleConstraint +(PxConstraintVisualizer &viz, + const void* constantBlock, + const PxTransform& body0Transform, + const PxTransform& body1Transform, + PxU32 flags) +{ + PX_UNUSED(&viz); + PX_UNUSED(constantBlock); + PX_UNUSED(body0Transform); + PX_UNUSED(body1Transform); + PX_UNUSED(flags); + PX_ASSERT(body0Transform.isValid()); + PX_ASSERT(body1Transform.isValid()); +} + +class PxVehicleConstraintConnector : public PxConstraintConnector +{ +public: + + PxVehicleConstraintConnector() : mVehicleConstraintState(NULL) {} + PxVehicleConstraintConnector(PxVehiclePhysXConstraintState* vehicleConstraintState) : mVehicleConstraintState(vehicleConstraintState) {} + ~PxVehicleConstraintConnector() {} + + void setConstraintState(PxVehiclePhysXConstraintState* constraintState) { mVehicleConstraintState = constraintState; } + + virtual void* prepareData() { return mVehicleConstraintState; } + virtual const void* getConstantBlock() const { return mVehicleConstraintState; } + virtual PxConstraintSolverPrep getPrep() const { return vehicleConstraintSolverPrep; } + + //Is this necessary if physx no longer supports double-buffering? + virtual void onConstraintRelease() { } + + //Can be empty functions. + virtual bool updatePvdProperties(physx::pvdsdk::PvdDataStream& pvdConnection, const PxConstraint* c, PxPvdUpdateType::Enum updateType) const + { + PX_UNUSED(pvdConnection); + PX_UNUSED(c); + PX_UNUSED(updateType); + return true; + } + virtual void updateOmniPvdProperties() const { } + virtual void onComShift(PxU32 actor) { PX_UNUSED(actor); } + virtual void onOriginShift(const PxVec3& shift) { PX_UNUSED(shift); } + virtual void* getExternalReference(PxU32& typeID) { typeID = PxConstraintExtIDs::eVEHICLE_JOINT; return this; } + virtual PxBase* getSerializable() { return NULL; } + +private: + + PxVehiclePhysXConstraintState* mVehicleConstraintState; +}; + +/** +\brief A mapping between constraint state data and the associated PxConstraint instances. +*/ +struct PxVehiclePhysXConstraints +{ + /** + \brief PxVehiclePhysXConstraintComponent writes to the constraintStates array and a + callback invoked by PxScene::simulate() reads a portion from it for a block of wheels + and writes that portion to an associated PxConstraint instance. + */ + PxVehiclePhysXConstraintState constraintStates[PxVehicleLimits::eMAX_NB_WHEELS]; + + /** + \brief PxVehiclePhysXConstraintComponent writes to the constraintStates array and a + callback invoked by PxScene::simulate() reads a portion from it for a block of wheels + and writes that portion to an associated PxConstraint instance. + */ + PxConstraint* constraints[PxVehiclePhysXConstraintLimits::eNB_CONSTRAINTS_PER_VEHICLE]; + + /** + \brief A constraint connector is necessary to connect each PxConstraint to a portion of the constraintStates array. + */ + PxVehicleConstraintConnector* constraintConnectors[PxVehiclePhysXConstraintLimits::eNB_CONSTRAINTS_PER_VEHICLE]; + + PX_FORCE_INLINE void setToDefault() + { + for (PxU32 i = 0; i < PxVehicleLimits::eMAX_NB_WHEELS; i++) + { + constraintStates[i].setToDefault(); + } + for(PxU32 i = 0; i < PxVehiclePhysXConstraintLimits::eNB_CONSTRAINTS_PER_VEHICLE; i++) + { + constraints[i] = NULL; + constraintConnectors[i] = NULL; + } + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ + diff --git a/Source/ThirdParty/PhysX/vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryComponents.h b/Source/ThirdParty/PhysX/vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryComponents.h new file mode 100644 index 000000000..b422aea85 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryComponents.h @@ -0,0 +1,145 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once +/** \addtogroup vehicle2 + @{ +*/ + +#include "vehicle2/PxVehicleParams.h" +#include "vehicle2/PxVehicleComponent.h" + +#include "vehicle2/commands/PxVehicleCommandHelpers.h" +#include "vehicle2/roadGeometry/PxVehicleRoadGeometryState.h" +#include "vehicle2/suspension/PxVehicleSuspensionParams.h" +#include "vehicle2/wheel/PxVehicleWheelParams.h" + +#include "vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryFunctions.h" +#include "vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryParams.h" +#include "vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryState.h" + +#include "common/PxProfileZone.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +class PxVehiclePhysXRoadGeometrySceneQueryComponent : public PxVehicleComponent +{ +public: + PxVehiclePhysXRoadGeometrySceneQueryComponent() : PxVehicleComponent() {} + virtual ~PxVehiclePhysXRoadGeometrySceneQueryComponent() {} + + /** + \brief Provide vehicle data items for this component. + + \param[out] axleDescription identifies the wheels on each axle. + \param[out] roadGeomParams The road geometry parameters of the vehicle. + \param[out] steerResponseStates The steer response state of the wheels. + \param[out] rigidBodyState The pose, velocity etc. of the vehicle rigid body. + \param[out] wheelParams The wheel parameters for the wheels. + \param[out] suspensionParams The suspension parameters for the wheels. + \param[out] materialFrictionParams The tire friction tables for the wheels. + \param[out] roadGeometryStates The detected ground surface plane, friction value etc. for the wheels. + \param[out] physxRoadGeometryStates Optional buffer to store additional information about the query (like actor/shape that got hit etc.). + Set to empty if not desired. + */ + virtual void getDataForPhysXRoadGeometrySceneQueryComponent( + const PxVehicleAxleDescription*& axleDescription, + const PxVehiclePhysXRoadGeometryQueryParams*& roadGeomParams, + PxVehicleArrayData& steerResponseStates, + const PxVehicleRigidBodyState*& rigidBodyState, + PxVehicleArrayData& wheelParams, + PxVehicleArrayData& suspensionParams, + PxVehicleArrayData& materialFrictionParams, + PxVehicleArrayData& roadGeometryStates, + PxVehicleArrayData& physxRoadGeometryStates) = 0; + + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_UNUSED(dt); + + PX_PROFILE_ZONE("PxVehiclePhysXRoadGeometrySceneQueryComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + const PxVehiclePhysXRoadGeometryQueryParams* roadGeomParams; + PxVehicleArrayData steerResponseStates; + const PxVehicleRigidBodyState* rigidBodyState; + PxVehicleArrayData wheelParams; + PxVehicleArrayData suspensionParams; + PxVehicleArrayData materialFrictionParams; + PxVehicleArrayData roadGeometryStates; + PxVehicleArrayData physxRoadGeometryStates; + + getDataForPhysXRoadGeometrySceneQueryComponent(axleDescription, + roadGeomParams, steerResponseStates, rigidBodyState, + wheelParams, suspensionParams, materialFrictionParams, + roadGeometryStates, physxRoadGeometryStates); + + if (context.getType() == PxVehicleSimulationContextType::ePHYSX) + { + const PxVehiclePhysXSimulationContext& physxContext = static_cast(context); + + for(PxU32 i = 0; i < axleDescription->nbWheels; i++) + { + const PxU32 wheelId = axleDescription->wheelIdsInAxleOrder[i]; + + PxVehiclePhysXRoadGeometryQueryUpdate( + wheelParams[wheelId], suspensionParams[wheelId], + *roadGeomParams, materialFrictionParams[wheelId], + steerResponseStates[wheelId], *rigidBodyState, + *physxContext.physxScene, physxContext.physxUnitCylinderSweepMesh, context.frame, + roadGeometryStates[wheelId], + !physxRoadGeometryStates.isEmpty() ? &physxRoadGeometryStates[wheelId] : NULL); + } + } + else + { + PX_ALWAYS_ASSERT(); + + for(PxU32 i = 0; i < axleDescription->nbWheels; i++) + { + const PxU32 wheelId = axleDescription->wheelIdsInAxleOrder[i]; + + roadGeometryStates[wheelId].setToDefault(); + } + } + + return true; + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryFunctions.h b/Source/ThirdParty/PhysX/vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryFunctions.h new file mode 100644 index 000000000..20ddaf685 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryFunctions.h @@ -0,0 +1,90 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxSimpleTypes.h" + +#if !PX_DOXYGEN +namespace physx +{ +class PxScene; +class PxConvexMesh; + +namespace vehicle2 +{ +#endif + +struct PxVehicleWheelParams; +struct PxVehicleSuspensionParams; +struct PxVehiclePhysXRoadGeometryQueryParams; +struct PxVehiclePhysXRoadGeometryQueryState; +struct PxVehiclePhysXMaterialFrictionParams; +struct PxVehicleRigidBodyState; +struct PxVehicleFrame; +struct PxVehicleRoadGeometryState; + +/** +\brief Compute the plane of the road geometry under a wheel and the tire friction of the contact. +\param[in] wheelParams describes the radius and halfwidth of the wheel. +\param[in] suspParams describes the frame of the suspension and wheel and the maximum suspension travel. +\param[in] roadGeomParams describes the operation of the PhysX scene query. +\param[in] materialFrictionParams describes a mapping between PxMaterial and friction in order to compute a tire friction value. +\param[in] wheelYawAngle is the yaw angle (in radians) of the wheel. +\param[in] rigidBodyState describes the pose of the rigid body. +\param[in] scene is the PhysX scene that will be queried by the scene query. +\param[in] unitCylinderSweepMesh is a convex cylindrical mesh of unit radius and half-width to be used in +the event that a sweep query is to be used. +\param[in] frame describes the lateral, longitudinal and vertical axes and is used to scale unitCylinderSweepMesh +by the wheel's radius and half-width. +\param[out] roadGeomState contains the plane and friction of the road geometry under the wheel. +\param[out] physxRoadGeometryState Optional buffer to store additional information about the query (like actor/shape that got hit etc.). + Set to NULL if not needed. +\note PxVehicleRoadGeometryState::hitState will have value false in the event that the there is no reachable road geometry under the wheel and +true if there is reachable road geometry under the wheel. Road geometry is considered reachable if the suspension can elongate from its +reference pose far enough to place wheel on the ground. +*/ +void PxVehiclePhysXRoadGeometryQueryUpdate +(const PxVehicleWheelParams& wheelParams, const PxVehicleSuspensionParams& suspParams, + const PxVehiclePhysXRoadGeometryQueryParams& roadGeomParams, const PxVehiclePhysXMaterialFrictionParams& materialFrictionParams, + const PxReal wheelYawAngle, const PxVehicleRigidBodyState& rigidBodyState, + const PxScene& scene, const PxConvexMesh* unitCylinderSweepMesh, + const PxVehicleFrame& frame, + PxVehicleRoadGeometryState& roadGeomState, + PxVehiclePhysXRoadGeometryQueryState* physxRoadGeometryState); + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryHelpers.h b/Source/ThirdParty/PhysX/vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryHelpers.h new file mode 100644 index 000000000..4dbe39d43 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryHelpers.h @@ -0,0 +1,73 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxPreprocessor.h" + +#if !PX_DOXYGEN +namespace physx +{ + +class PxConvexMesh; +class PxPhysics; +struct PxCookingParams; + +namespace vehicle2 +{ +#endif + +struct PxVehicleFrame; + +/** +\brief Create a cylindrical mesh with unit radius and half-width. +\param[in] vehicleFrame is a description of the lateral and longitudinal axes. +\param[in] physics is a PxPhysics instance. +\param[in] params is a PxCookingParams instance +\return Return a PxConvexMesh instance that represents a convex hull with unit radius and half-width. +@see PxVehicleUnitCylinderSweepMeshDestroy +*/ +PxConvexMesh* PxVehicleUnitCylinderSweepMeshCreate(const PxVehicleFrame& vehicleFrame, PxPhysics& physics, const PxCookingParams& params); + +/** +\brief Release the mesh created with PxVehicleUnitCylinderSweepMeshCreate. +\param[in] mesh is a PxConvexMesh instance. +@see PxVehicleUnitCylinderSweepMeshCreate +*/ +void PxVehicleUnitCylinderSweepMeshDestroy(PxConvexMesh* mesh); + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryParams.h b/Source/ThirdParty/PhysX/vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryParams.h new file mode 100644 index 000000000..896204c5d --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryParams.h @@ -0,0 +1,164 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxFoundation.h" + +#include "PxQueryFiltering.h" + +#if !PX_DOXYGEN +namespace physx +{ +class PxMaterial; + +namespace vehicle2 +{ +#endif + +struct PxVehicleFrame; +struct PxVehicleScale; + +/** +\brief PhysX scene queries may be raycasts or sweeps. +\note eNONE will result in no PhysX scene query. This option will not overwrite the associated PxVehicleRoadGeometryState. +*/ +struct PxVehiclePhysXRoadGeometryQueryType +{ + enum Enum + { + eNONE = 0, //!< Info about the road geometry below the wheel is provided by the user + eRAYCAST, //!< The road geometry below the wheel is analyzed using a raycast query + eSWEEP, //!< The road geometry below the wheel is analyzed using a sweep query + eMAX_NB + }; +}; + +/** +\brief A description of type of PhysX scene query and the filter data to apply to the query. +*/ +struct PxVehiclePhysXRoadGeometryQueryParams +{ + /** + \brief A description of the type of physx scene query to employ. + @see PxSceneQuerySystemBase::raycast + @see PxSceneQuerySystemBase::sweep + */ + PxVehiclePhysXRoadGeometryQueryType::Enum roadGeometryQueryType; + + /** + \brief The filter data to use for the physx scene query. + @see PxSceneQuerySystemBase::raycast + @see PxSceneQuerySystemBase::sweep + */ + PxQueryFilterData filterData; + + /** + \brief A filter callback to be used by the physx scene query + \note A null pointer is allowed. + @see PxSceneQuerySystemBase::raycast + @see PxSceneQuerySystemBase::sweep + */ + PxQueryFilterCallback* filterCallback; + + PX_FORCE_INLINE PxVehiclePhysXRoadGeometryQueryParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PX_UNUSED(srcScale); + PX_UNUSED(trgScale); + return *this; + } + + PX_FORCE_INLINE bool isValid() const + { + PX_CHECK_AND_RETURN_VAL(roadGeometryQueryType < PxVehiclePhysXRoadGeometryQueryType::eMAX_NB, "PxVehiclePhysXRoadGeometryQueryParams.roadGeometryQueryType has illegal value", false); + return true; + } +}; + +/** +A mapping between PxMaterial and a friction value to be used by the tire model. +@see PxVehiclePhysXMaterialFrictionParams +*/ +struct PxVehiclePhysXMaterialFriction +{ + /** + \brief A PxMaterial instance that is to be mapped to a friction value. + */ + const PxMaterial* material; + + /** + \brief A friction value that is to be mapped to a PxMaterial instance. + \note friction must have value greater than or equal to zero. + + Range: [0, inf)
+ + @see PxVehicleTireGripState::friction + */ + PxReal friction; + + PX_FORCE_INLINE bool isValid() const + { + PX_CHECK_AND_RETURN_VAL(friction >= 0.0f, "PxVehiclePhysXMaterialFriction.friction must be greater than or equal to zero", false); + return true; + } +}; + +/** +\brief A mappping between PxMaterial instance and friction for multiple PxMaterial intances. +*/ +struct PxVehiclePhysXMaterialFrictionParams +{ + PxVehiclePhysXMaterialFriction* materialFrictions; //!< An array of mappings between PxMaterial and friction. + PxU32 nbMaterialFrictions; //!< The number of mappings between PxMaterial and friction. + PxReal defaultFriction; //!< A default friction value to be used in the event that the PxMaterial under the tire is not found in the array #materialFrictions. + + PX_FORCE_INLINE bool isValid() const + { + for (PxU32 i = 0; i < nbMaterialFrictions; i++) + { + if (!materialFrictions[i].isValid()) + return false; + } + PX_CHECK_AND_RETURN_VAL(defaultFriction >= 0.0f, "PxVehiclePhysXMaterialFrictionParams.defaultFriction must be greater than or equal to zero", false); + return true; + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryState.h b/Source/ThirdParty/PhysX/vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryState.h new file mode 100644 index 000000000..28ef45fbf --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryState.h @@ -0,0 +1,69 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxMemory.h" +#include "foundation/PxVec3.h" + +#if !PX_DOXYGEN +namespace physx +{ + +class PxRigidActor; +class PxShape; +class PxMaterial; + +namespace vehicle2 +{ +#endif + +struct PxVehiclePhysXRoadGeometryQueryState +{ + PxRigidActor* actor; //!< The actor that got hit by the query. + PxShape* shape; //!< The shape that got hit by the query. + PxMaterial* material; //!< The material at the hit point. + PxVec3 hitPosition; //!< The hit position in world space. + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehiclePhysXRoadGeometryQueryState)); + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ + diff --git a/Source/ThirdParty/PhysX/vehicle2/pvd/PxVehiclePvdComponents.h b/Source/ThirdParty/PhysX/vehicle2/pvd/PxVehiclePvdComponents.h new file mode 100644 index 000000000..676ff738f --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/pvd/PxVehiclePvdComponents.h @@ -0,0 +1,323 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "vehicle2/PxVehicleComponent.h" +#include "vehicle2/PxVehicleParams.h" +#include "PxVehiclePvdFunctions.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +#define VEHICLE_FLOAT_ARRAY_DATA(b) PxVehicleArrayData b; b.setEmpty(); +#define VEHICLE_ARRAY_DATA(a, b) PxVehicleArrayData b; b.setEmpty(); +#define VEHICLE_SIZED_ARRAY_DATA(a, b) PxVehicleSizedArrayData b; b.setEmpty(); + +class PxVehiclePVDComponent : public PxVehicleComponent +{ +public: + + PxVehiclePVDComponent() : PxVehicleComponent() , firstTime(true) {} + virtual ~PxVehiclePVDComponent() {} + + virtual void getDataForPVDComponent( + const PxVehicleAxleDescription*& axleDescription, + const PxVehicleRigidBodyParams*& rbodyParams, const PxVehicleRigidBodyState*& rbodyState, + const PxVehicleSuspensionStateCalculationParams*& suspStateCalcParams, + PxVehicleSizedArrayData& brakeResponseParams, + const PxVehicleSteerCommandResponseParams*& steerResponseParams, + PxVehicleArrayData& brakeResponseStates, + PxVehicleArrayData& steerResponseStates, + PxVehicleArrayData& wheelParams, + PxVehicleArrayData& wheelActuationStates, + PxVehicleArrayData& wheelRigidBody1dStates, + PxVehicleArrayData& wheelLocalPoses, + PxVehicleArrayData& roadGeomStates, + PxVehicleArrayData& suspParams, + PxVehicleArrayData& suspCompParams, + PxVehicleArrayData& suspForceParams, + PxVehicleArrayData& suspStates, + PxVehicleArrayData& suspCompStates, + PxVehicleArrayData& suspForces, + PxVehicleArrayData& tireForceParams, + PxVehicleArrayData& tireDirectionStates, + PxVehicleArrayData& tireSpeedStates, + PxVehicleArrayData& tireSlipStates, + PxVehicleArrayData& tireStickyStates, + PxVehicleArrayData& tireGripStates, + PxVehicleArrayData& tireCamberStates, + PxVehicleArrayData& tireForces, + PxVehicleSizedArrayData& antiRollForceParams, + const PxVehicleAntiRollTorque*& antiRollTorque, + const PxVehicleCommandState*& commandState, + const PxVehicleDirectDriveThrottleCommandResponseParams*& directDriveThrottleResponseParams, + const PxVehicleDirectDriveTransmissionCommandState*& directDriveTransmissionState, + PxVehicleArrayData& directDrivethrottleResponseState, + const PxVehicleClutchCommandResponseParams*& clutchResponseParams, + const PxVehicleClutchParams*& clutchParams, + const PxVehicleEngineParams*& engineParams, + const PxVehicleGearboxParams*& gearboxParams, + const PxVehicleAutoboxParams*& autoboxParams, + const PxVehicleMultiWheelDriveDifferentialParams*& multiWheelDiffParams, + const PxVehicleFourWheelDriveDifferentialParams*& fourWheelDiffParams, + const PxVehicleEngineDriveTransmissionCommandState*& engineDriveTransmissionState, + const PxVehicleClutchCommandResponseState*& clutchResponseState, + const PxVehicleEngineDriveThrottleCommandResponseState*& engineDriveThrottleResponseState, + const PxVehicleEngineState*& engineState, + const PxVehicleGearboxState*& gearboxState, + const PxVehicleAutoboxState*& autoboxState, + const PxVehicleDifferentialState*& diffState, + const PxVehicleClutchSlipState*& clutchSlipState, + PxVehicleArrayData& physxConstraintParams, + PxVehicleArrayData& physxMaterialFrictionParams, + const PxVehiclePhysXActor*& physxActor, + const PxVehiclePhysXRoadGeometryQueryParams*& physxRoadGeomQryParams, + PxVehicleArrayData& physxRoadGeomStates, + PxVehicleArrayData& physxConstraintStates, + PxVehiclePvdObjectHandles*& objectHandles) = 0; + + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_UNUSED(dt); + PX_UNUSED(context); + + if(!context.pvdContext.attributeHandles || !context.pvdContext.writer) + return true; + + const PxVehicleAxleDescription* axleDesc = NULL; + const PxVehicleRigidBodyParams* rbodyParams = NULL; + const PxVehicleRigidBodyState* rbodyState = NULL; + const PxVehicleSuspensionStateCalculationParams* suspStateCalcParams = NULL; + VEHICLE_SIZED_ARRAY_DATA(PxVehicleBrakeCommandResponseParams, brakeResponseParams); + const PxVehicleSteerCommandResponseParams* steerResponseParams = NULL; + VEHICLE_FLOAT_ARRAY_DATA(brakeResponseStates); + VEHICLE_FLOAT_ARRAY_DATA(steerResponseStates); + VEHICLE_ARRAY_DATA(PxVehicleWheelParams, wheelParams); + VEHICLE_ARRAY_DATA(PxVehicleWheelActuationState, wheelActuationStates); + VEHICLE_ARRAY_DATA(PxVehicleWheelRigidBody1dState, wheelRigidBody1dStates); + VEHICLE_ARRAY_DATA(PxVehicleWheelLocalPose, wheelLocalPoses); + VEHICLE_ARRAY_DATA(PxVehicleRoadGeometryState, roadGeomStates); + VEHICLE_ARRAY_DATA(PxVehicleSuspensionParams, suspParams); + VEHICLE_ARRAY_DATA(PxVehicleSuspensionComplianceParams, suspComplianceParams); + VEHICLE_ARRAY_DATA(PxVehicleSuspensionForceParams, suspForceParams); + VEHICLE_ARRAY_DATA(PxVehicleSuspensionState, suspStates); + VEHICLE_ARRAY_DATA(PxVehicleSuspensionComplianceState, suspComplianceStates); + VEHICLE_ARRAY_DATA(PxVehicleSuspensionForce, suspForces); + VEHICLE_ARRAY_DATA(PxVehicleTireForceParams, tireForceParams); + VEHICLE_ARRAY_DATA(PxVehicleTireDirectionState, tireDirectionStates); + VEHICLE_ARRAY_DATA(PxVehicleTireSpeedState, tireSpeedStates); + VEHICLE_ARRAY_DATA(PxVehicleTireSlipState, tireSlipStates); + VEHICLE_ARRAY_DATA(PxVehicleTireStickyState, tireStickyStates); + VEHICLE_ARRAY_DATA(PxVehicleTireGripState, tireGripStates); + VEHICLE_ARRAY_DATA(PxVehicleTireCamberAngleState, tireCamberStates); + VEHICLE_ARRAY_DATA(PxVehicleTireForce, tireForces); + VEHICLE_SIZED_ARRAY_DATA(PxVehicleAntiRollForceParams, antiRollParams); + const PxVehicleAntiRollTorque* antiRollTorque = NULL; + const PxVehicleCommandState* commandState = NULL; + const PxVehicleDirectDriveThrottleCommandResponseParams* directDriveThrottleResponseParams = NULL; + const PxVehicleDirectDriveTransmissionCommandState* directDriveTransmissionState = NULL; + VEHICLE_FLOAT_ARRAY_DATA(directDrivethrottleResponseState); + const PxVehicleClutchCommandResponseParams* clutchResponseParams = NULL; + const PxVehicleClutchParams* clutchParams = NULL; + const PxVehicleEngineParams* engineParams = NULL; + const PxVehicleGearboxParams* gearboxParams = NULL; + const PxVehicleAutoboxParams* autoboxParams = NULL; + const PxVehicleMultiWheelDriveDifferentialParams* multiWheelDiffParams = NULL; + const PxVehicleFourWheelDriveDifferentialParams* fourWheelDiffParams = NULL; + const PxVehicleEngineDriveTransmissionCommandState* engineDriveTransmissionCommandState = NULL; + const PxVehicleClutchCommandResponseState* clutchResponseState = NULL; + const PxVehicleEngineDriveThrottleCommandResponseState* throttleResponseState = NULL; + const PxVehicleEngineState* engineState = NULL; + const PxVehicleGearboxState* gearboxState = NULL; + const PxVehicleAutoboxState* autoboxState = NULL; + const PxVehicleDifferentialState* diffState = NULL; + const PxVehicleClutchSlipState* clutchSlipState = NULL; + VEHICLE_ARRAY_DATA(PxVehiclePhysXSuspensionLimitConstraintParams, physxConstraintParams); + VEHICLE_ARRAY_DATA(PxVehiclePhysXMaterialFrictionParams, physxMaterialFrictionParams); + const PxVehiclePhysXActor* physxActor = NULL; + const PxVehiclePhysXRoadGeometryQueryParams* physxRoadGeomQryParams = NULL; + VEHICLE_ARRAY_DATA(PxVehiclePhysXRoadGeometryQueryState, physxRoadGeomStates); + VEHICLE_ARRAY_DATA(PxVehiclePhysXConstraintState, physxConstraintStates); + PxVehiclePvdObjectHandles* omniPvdObjectHandles = NULL; + + getDataForPVDComponent( + axleDesc, + rbodyParams, rbodyState, + suspStateCalcParams, + brakeResponseParams, steerResponseParams, + brakeResponseStates, steerResponseStates, + wheelParams, + wheelActuationStates, wheelRigidBody1dStates, wheelLocalPoses, + roadGeomStates, + suspParams, suspComplianceParams, suspForceParams, + suspStates, suspComplianceStates, + suspForces, + tireForceParams, + tireDirectionStates, tireSpeedStates, tireSlipStates, tireStickyStates, tireGripStates, tireCamberStates, + tireForces, + antiRollParams, antiRollTorque, + commandState, + directDriveThrottleResponseParams, directDriveTransmissionState, directDrivethrottleResponseState, + clutchResponseParams, clutchParams, engineParams, gearboxParams, autoboxParams, multiWheelDiffParams, fourWheelDiffParams, + engineDriveTransmissionCommandState, + clutchResponseState, throttleResponseState, engineState, gearboxState, autoboxState, diffState, clutchSlipState, + physxConstraintParams, physxMaterialFrictionParams, + physxActor, physxRoadGeomQryParams, physxRoadGeomStates, physxConstraintStates, + omniPvdObjectHandles); + + if(!omniPvdObjectHandles) + return true; + + if(firstTime) + { + PxVehiclePvdRigidBodyRegister( + rbodyParams, rbodyState, + *context.pvdContext.attributeHandles, omniPvdObjectHandles, context.pvdContext.writer); + + PxVehiclePvdSuspensionStateCalculationParamsRegister( + suspStateCalcParams, + *context.pvdContext.attributeHandles, omniPvdObjectHandles, context.pvdContext.writer); + + PxVehiclePvdCommandResponseRegister( + brakeResponseParams, steerResponseParams, + brakeResponseStates, steerResponseStates, + *context.pvdContext.attributeHandles, omniPvdObjectHandles, context.pvdContext.writer); + + PxVehiclePvdWheelAttachmentsRegister( + *axleDesc, + wheelParams, wheelActuationStates, wheelRigidBody1dStates, wheelLocalPoses, + roadGeomStates, + suspParams, suspComplianceParams, suspForceParams, suspStates, suspComplianceStates, + suspForces, + tireForceParams, + tireDirectionStates, tireSpeedStates, tireSlipStates, tireStickyStates, tireGripStates, tireCamberStates, + tireForces, + *context.pvdContext.attributeHandles, omniPvdObjectHandles, context.pvdContext.writer); + + PxVehiclePvdAntiRollsRegister( + antiRollParams, antiRollTorque, + *context.pvdContext.attributeHandles, omniPvdObjectHandles, context.pvdContext.writer); + + PxVehiclePvdDirectDrivetrainRegister( + commandState, directDriveTransmissionState, + directDriveThrottleResponseParams, + directDrivethrottleResponseState, + *context.pvdContext.attributeHandles, omniPvdObjectHandles, context.pvdContext.writer); + + PxVehiclePvdEngineDrivetrainRegister( + commandState, engineDriveTransmissionCommandState, + clutchResponseParams, clutchParams, engineParams, gearboxParams, autoboxParams, multiWheelDiffParams, fourWheelDiffParams, + clutchResponseState, throttleResponseState, engineState, gearboxState, autoboxState, diffState, clutchSlipState, + *context.pvdContext.attributeHandles, omniPvdObjectHandles, context.pvdContext.writer); + + PxVehiclePvdPhysXWheelAttachmentRegister( + *axleDesc, + physxConstraintParams, physxMaterialFrictionParams, + physxActor, physxRoadGeomQryParams, physxRoadGeomStates, physxConstraintStates, + *context.pvdContext.attributeHandles, omniPvdObjectHandles, context.pvdContext.writer); + + PxVehiclePvdPhysXRigidActorRegister( + physxActor, + *context.pvdContext.attributeHandles, omniPvdObjectHandles, context.pvdContext.writer); + + firstTime = false; + } + + PxVehiclePvdRigidBodyWrite( + rbodyParams, rbodyState, + *context.pvdContext.attributeHandles, *omniPvdObjectHandles, context.pvdContext.writer); + + PxVehiclePvdSuspensionStateCalculationParamsWrite( + suspStateCalcParams, + *context.pvdContext.attributeHandles, *omniPvdObjectHandles, context.pvdContext.writer); + + PxVehiclePvdCommandResponseWrite( + *axleDesc, brakeResponseParams, steerResponseParams, brakeResponseStates, steerResponseStates, + *context.pvdContext.attributeHandles, *omniPvdObjectHandles, context.pvdContext.writer); + + PxVehiclePvdWheelAttachmentsWrite( + *axleDesc, + wheelParams, wheelActuationStates, wheelRigidBody1dStates, wheelLocalPoses, + roadGeomStates, + suspParams, suspComplianceParams, suspForceParams, suspStates, suspComplianceStates, + suspForces, + tireForceParams, + tireDirectionStates, tireSpeedStates, tireSlipStates, tireStickyStates, tireGripStates, tireCamberStates, + tireForces, + *context.pvdContext.attributeHandles, *omniPvdObjectHandles, context.pvdContext.writer); + + PxVehiclePvdAntiRollsWrite( + antiRollParams, antiRollTorque, + *context.pvdContext.attributeHandles, *omniPvdObjectHandles, context.pvdContext.writer); + + PxVehiclePvdDirectDrivetrainWrite( + *axleDesc, + commandState, directDriveTransmissionState, + directDriveThrottleResponseParams, + directDrivethrottleResponseState, + *context.pvdContext.attributeHandles, *omniPvdObjectHandles, context.pvdContext.writer); + + PxVehiclePvdEngineDrivetrainWrite( + commandState, engineDriveTransmissionCommandState, + clutchResponseParams, clutchParams, engineParams, gearboxParams, autoboxParams, multiWheelDiffParams, fourWheelDiffParams, + clutchResponseState, throttleResponseState, engineState, gearboxState, autoboxState, diffState, clutchSlipState, + *context.pvdContext.attributeHandles, *omniPvdObjectHandles, context.pvdContext.writer); + + PxVehiclePvdPhysXWheelAttachmentWrite( + *axleDesc, + physxConstraintParams, physxMaterialFrictionParams, + physxActor, physxRoadGeomQryParams, physxRoadGeomStates, physxConstraintStates, + *context.pvdContext.attributeHandles, *omniPvdObjectHandles, context.pvdContext.writer); + + PxVehiclePvdPhysXRigidActorWrite( + physxActor, + *context.pvdContext.attributeHandles, *omniPvdObjectHandles, context.pvdContext.writer); + + return true; + } + +private: + + bool firstTime; +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/pvd/PxVehiclePvdFunctions.h b/Source/ThirdParty/PhysX/vehicle2/pvd/PxVehiclePvdFunctions.h new file mode 100644 index 000000000..9bff4dbb3 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/pvd/PxVehiclePvdFunctions.h @@ -0,0 +1,610 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "vehicle2/PxVehicleParams.h" +#include "vehicle2/braking/PxVehicleBrakingParams.h" +#include "vehicle2/commands/PxVehicleCommandStates.h" +#include "vehicle2/drivetrain/PxVehicleDrivetrainParams.h" +#include "vehicle2/drivetrain/PxVehicleDrivetrainStates.h" +#include "vehicle2/physxActor/PxVehiclePhysXActorStates.h" +#include "vehicle2/physxConstraints/PxVehiclePhysXConstraintParams.h" +#include "vehicle2/physxConstraints/PxVehiclePhysXConstraintStates.h" +#include "vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryParams.h" +#include "vehicle2/physxRoadGeometry/PxVehiclePhysXRoadGeometryState.h" +#include "vehicle2/roadGeometry/PxVehicleRoadGeometryState.h" +#include "vehicle2/steering/PxVehicleSteeringParams.h" +#include "vehicle2/suspension/PxVehicleSuspensionParams.h" +#include "vehicle2/suspension/PxVehicleSuspensionStates.h" +#include "vehicle2/tire/PxVehicleTireParams.h" +#include "vehicle2/tire/PxVehicleTireStates.h" +#include "vehicle2/wheel/PxVehicleWheelParams.h" +#include "vehicle2/wheel/PxVehicleWheelStates.h" + +class OmniPvdWriter; +namespace physx +{ +class PxAllocatorCallback; +namespace vehicle2 +{ +struct PxVehiclePvdAttributeHandles; +struct PxVehiclePvdObjectHandles; +} // namespace vehicle2 +} // namespace physx + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +/** +\brief Create object instances in omnipvd that will be used to reflect the parameters and state of the rigid body of a vehicle instance. +Handles to the created object instances will be stored in a PxVehiclePvdObjectHandles instance. +\param[in] rbodyParams describes the parameters of the vehicle's rigid body. +\param[in] rbodyState describes the state of the vehicle's rigid body. +\param[in] attributeHandles contains a general description of vehicle parameters and states that will be reflected in omnipvd. +\param[in] objectHandles contains unique handles for the parameters and states of each vehicle instance. +\param[in] omniWriter is an OmniPvdWriter instance used to communicate state and parameter data to omnipvd. +\note If rbodyParams is NULL, omnipvd will not reflect rigid body parameters. +\note If rbodyState is NULL, omnipvd will not reflect rigid body state. +\note objectHandles must be non-NULL +\note omniWriter must be non-NULL +\note PxVehiclePvdRigidBodyRegister should be called once for each vehicle instance. +@see PxVehiclePvdAttributesCreate +@see PxVehiclePvdObjectCreate +@see PxVehiclePvdRigidBodyWrite +*/ +void PxVehiclePvdRigidBodyRegister +(const PxVehicleRigidBodyParams* rbodyParams, const PxVehicleRigidBodyState* rbodyState, + const PxVehiclePvdAttributeHandles& attributeHandles, + PxVehiclePvdObjectHandles* objectHandles, OmniPvdWriter* omniWriter); + +/** +\brief Write the parameters and state of the rigid body of a vehicle instance to omnipvd. +\param[in] rbodyParams describes the parameters of the vehicle's rigid body. +\param[in] rbodyState describes the state of the vehicle's rigid body. +\param[in] attributeHandles contains a general description of vehicle parameters and states that will be reflected in omnipvd. +\param[in] objectHandles contains unique handles for the parameters and states of each vehicle instance. +\param[in] omniWriter is an OmniPvdWriter instance used to communicate state and parameter data to omnipvd. +\note If rbodyParams is NULL but a non-NULL value was used in PxVehiclePvdRigidBodyRegister(), the rigid body parameters will not be updated in omnipvd. +\note If rbodyState is NULL but a non-NULL value was used in PxVehiclePvdRigidBodyRegister(), the rigid body state will not be updated in omnipvd. +\note omniWriter must be non-NULL and must be the same instance used in PxVehiclePvdRigidBodyRegister(). +@see PxVehiclePvdAttributesCreate +@see PxVehiclePvdObjectCreate +@see PxVehiclePvdRigidBodyRegister +*/ +void PxVehiclePvdRigidBodyWrite +(const PxVehicleRigidBodyParams* rbodyParams, const PxVehicleRigidBodyState* rbodyState, + const PxVehiclePvdAttributeHandles& attributeHandles, + const PxVehiclePvdObjectHandles& objectHandles, OmniPvdWriter* omniWriter); + +/** +\brief Register object instances in omnipvd that will be used to reflect the suspension state calculation parameters of a vehicle instance. +\param[in] suspStateCalcParams describes parameters used to calculate suspension state. +\param[in] attributeHandles contains a general description of vehicle parameters and states that will be reflected in omnipvd. +\param[in] objectHandles contains unique handles for the parameters and states of each vehicle instance. +\param[in] omniWriter is an OmniPvdWriter instance used to communicate state and parameter data to omnipvd. +\note If suspStateCalcParams is NULL, omnipvd will not reflect the suspension state calculation parameters. +\note objectHandles must be non-NULL +\note omniWriter must be non-NULL +@see PxVehiclePvdAttributesCreate +@see PxVehiclePvdObjectCreate +@see PxVehiclePvdSuspensionStateCalculationParamsWrite +*/ +void PxVehiclePvdSuspensionStateCalculationParamsRegister +(const PxVehicleSuspensionStateCalculationParams* suspStateCalcParams, + const PxVehiclePvdAttributeHandles& attributeHandles, + PxVehiclePvdObjectHandles* objectHandles, OmniPvdWriter* omniWriter); + +/** +\brief Write the parameters and state of the rigid body of a vehicle instance to omnipvd. +\param[in] suspStateCalcParams describes parameters used to calculate suspension state. +\param[in] attributeHandles contains a general description of vehicle parameters and states that will be reflected in omnipvd. +\param[in] objectHandles contains unique handles for the parameters and states of each vehicle instance. +\param[in] omniWriter is an OmniPvdWriter instance used to communicate state and parameter data to omnipvd. +\note If suspStateCalcParams is NULL but a non-NULL value was used in void PxVehiclePvdSuspensionStateCalculationParamsRegister(), +the suspension state calculation parameters will not be updated in omnipvd. +\note omniWriter must be non-NULL and must be the same instance used in PxVehiclePvdSuspensionStateCalculationParamsRegister(). +@see PxVehiclePvdAttributesCreate +@see PxVehiclePvdObjectCreate +@see PxVehiclePvdSuspensionStateCalculationParamsRegister +*/ +void PxVehiclePvdSuspensionStateCalculationParamsWrite +(const PxVehicleSuspensionStateCalculationParams* suspStateCalcParams, + const PxVehiclePvdAttributeHandles& attributeHandles, + const PxVehiclePvdObjectHandles& objectHandles, OmniPvdWriter* omniWriter); + +/** +\brief Register object instances in omnipvd that will be used to reflect the brake and steer command response parameters of a vehicle instance. +\param[in] brakeResponseParams is an array of brake command response parameters. +\param[in] steerResponseParams describes the steer command response parameters. +\param[in] brakeResponseStates is an array of brake responses torqyes, +\param[in] steerResponseStates is an array of steer response angles. +\param[in] attributeHandles contains a general description of vehicle parameters and states that will be reflected in omnipvd. +\param[in] objectHandles contains unique handles for the parameters and states of each vehicle instance. +\param[in] omniWriter is an OmniPvdWriter instance used to communicate state and parameter data to omnipvd. +\note If brakeResponseParams is empty, omnipvd will not reflect any brake command response parameters. +\note If steerResponseParams is NULL, omnipvd will not reflect the steer command response parameters. +\note If brakeResponseStates is empty, omnipvd will not reflect any brake command response state. +\note If steerResponseStates is empty, omnipvd will not reflect any steer command response state. +\note objectHandles must be non-NULL +\note omniWriter must be non-NULL +@see PxVehiclePvdAttributesCreate +@see PxVehiclePvdObjectCreate +@see PxVehiclePvdCommandResponseWrite +*/ +void PxVehiclePvdCommandResponseRegister +(const PxVehicleSizedArrayData& brakeResponseParams, + const PxVehicleSteerCommandResponseParams* steerResponseParams, + const PxVehicleArrayData& brakeResponseStates, + const PxVehicleArrayData& steerResponseStates, + const PxVehiclePvdAttributeHandles& attributeHandles, + PxVehiclePvdObjectHandles* objectHandles, OmniPvdWriter* omniWriter); + +/** +\brief Write brake and steer command response parameters to omnipvd. +\param[in] axleDesc is a description of the wheels and axles of a vehicle. +\param[in] brakeResponseParams is an array of brake command response parameters. +\param[in] steerResponseParams describes the steer command response parameters. +\param[in] brakeResponseStates is an array of brake response torques. +\param[in] steerResponseStates is an array of steer response angles. +\param[in] attributeHandles contains a general description of vehicle parameters and states that will be reflected in omnipvd. +\param[in] objectHandles contains unique handles for the parameters and states of each vehicle instance. +\param[in] omniWriter is an OmniPvdWriter instance used to communicate state and parameter data to omnipvd. +\note If brakeResponseParams is empty but a non-empty array was used in PxVehiclePvdCommandResponseRegister(), +the brake command response parameters will not be updated in omnipvd. +\note If steerResponseParams is non-NULL but a NULL value was used in PxVehiclePvdCommandResponseRegister(), +the steer command parameters will not be updated in omnipvd. +\note If brakeResponseStates is empty but a non-empty array was used in PxVehiclePvdCommandResponseRegister(), +the brake response states will not be updated in omnipvd. +\note If steerResponseStates is empty but a non-empty array was used in PxVehiclePvdCommandResponseRegister(), +the steer response states will not be updated in omnipvd. +\note omniWriter must be non-NULL and must be the same instance used in PxVehiclePvdCommandResponseRegister(). +@see PxVehiclePvdAttributesCreate +@see PxVehiclePvdObjectCreate +@see PxVehiclePvdCommandResponseRegister +*/ +void PxVehiclePvdCommandResponseWrite +(const PxVehicleAxleDescription& axleDesc, + const PxVehicleSizedArrayData& brakeResponseParams, + const PxVehicleSteerCommandResponseParams* steerResponseParams, + const PxVehicleArrayData& brakeResponseStates, + const PxVehicleArrayData& steerResponseStates, + const PxVehiclePvdAttributeHandles& attributeHandles, + const PxVehiclePvdObjectHandles& objectHandles, OmniPvdWriter* omniWriter); + +/** +\brief Register object instances in omnipvd that will be used to reflect wheel attachment data such as tires, suspensions and wheels. +\param[in] axleDesc is a description of the wheels and axles of a vehicle. +\param[in] wheelParams is an array of wheel parameters. +\param[in] wheelActuationStates is an array of wheel actuation states. +\param[in] wheelRigidBody1dStates is an array of wheel rigid body states. +\param[in] wheelLocalPoses is an array of wheel local poses. +\param[in] roadGeometryStates is an array of road geometry states. +\param[in] suspParams is an array of suspension parameters. +\param[in] suspCompParams is an array of suspension compliance parameters. +\param[in] suspForceParams is an array of suspension force parameters. +\param[in] suspStates is an array of suspension states. +\param[in] suspCompStates is an array of suspension compliance states. +\param[in] suspForces is an array of suspension forces. +\param[in] tireForceParams is an array of tire force parameters. +\param[in] tireDirectionStates is an array of tire direction states. +\param[in] tireSpeedStates is an array of tire speed states. +\param[in] tireSlipStates is an array of tire slip states. +\param[in] tireStickyStates is an array of tire sticky states. +\param[in] tireGripStates is an array of tire grip states. +\param[in] tireCamberStates is an array of tire camber states. +\param[in] tireForces is an array of tire forces. +\param[in] attributeHandles contains a general description of vehicle parameters and states that will be reflected in omnipvd. +\param[in] objectHandles contains unique handles for the parameters and states of each vehicle instance. +\param[in] omniWriter is an OmniPvdWriter instance used to communicate state and parameter data to omnipvd. +\note If any array is empty, the corresponding data will not be reflected in omnipvd. +\note Each array must either be empty or contain an entry for each wheel present in axleDesc. +\note objectHandles must be non-NULL +\note omniWriter must be non-NULL +@see PxVehiclePvdAttributesCreate +@see PxVehiclePvdObjectCreate +@see PxVehiclePvdWheelAttachmentsWrite +*/ +void PxVehiclePvdWheelAttachmentsRegister +(const PxVehicleAxleDescription& axleDesc, + const PxVehicleArrayData& wheelParams, + const PxVehicleArrayData& wheelActuationStates, + const PxVehicleArrayData& wheelRigidBody1dStates, + const PxVehicleArrayData& wheelLocalPoses, + const PxVehicleArrayData& roadGeometryStates, + const PxVehicleArrayData& suspParams, + const PxVehicleArrayData& suspCompParams, + const PxVehicleArrayData& suspForceParams, + const PxVehicleArrayData& suspStates, + const PxVehicleArrayData& suspCompStates, + const PxVehicleArrayData& suspForces, + const PxVehicleArrayData& tireForceParams, + const PxVehicleArrayData& tireDirectionStates, + const PxVehicleArrayData& tireSpeedStates, + const PxVehicleArrayData& tireSlipStates, + const PxVehicleArrayData& tireStickyStates, + const PxVehicleArrayData& tireGripStates, + const PxVehicleArrayData& tireCamberStates, + const PxVehicleArrayData& tireForces, + const PxVehiclePvdAttributeHandles& attributeHandles, + PxVehiclePvdObjectHandles* objectHandles, OmniPvdWriter* omniWriter); + +/** +\brief Write wheel attachment data such as tire, suspension and wheel data to omnipvd. +\param[in] axleDesc is a description of the wheels and axles of a vehicle. +\param[in] wheelParams is an array of wheel parameters. +\param[in] wheelActuationStates is an array of wheel actuation states. +\param[in] wheelRigidBody1dStates is an array of wheel rigid body states. +\param[in] wheelLocalPoses is an array of wheel local poses. +\param[in] roadGeometryStates is an array of road geometry states. +\param[in] suspParams is an array of suspension parameters. +\param[in] suspCompParams is an array of suspension compliance parameters. +\param[in] suspForceParams is an array of suspension force parameters. +\param[in] suspStates is an array of suspension states. +\param[in] suspCompStates is an array of suspension compliance states. +\param[in] suspForces is an array of suspension forces. +\param[in] tireForceParams is an array of tire force parameters. +\param[in] tireDirectionStates is an array of tire direction states. +\param[in] tireSpeedStates is an array of tire speed states. +\param[in] tireSlipStates is an array of tire slip states. +\param[in] tireStickyStates is an array of tire sticky states. +\param[in] tireGripStates is an array of tire grip states. +\param[in] tireCamberStates is an array of tire camber states. +\param[in] tireForces is an array of tire forces. +\param[in] attributeHandles contains a general description of vehicle parameters and states that will be reflected in omnipvd. +\param[in] objectHandles contains unique handles for the parameters and states of each vehicle instance. +\param[in] omniWriter is an OmniPvdWriter instance used to communicate state and parameter data to omnipvd. +\note If any array is empty but the corresponding argument in PxVehiclePvdWheelAttachmentsRegister was not empty, the corresponding data will not be updated in omnipvd. +\note Each array must either be empty or contain an entry for each wheel present in axleDesc. +\note omniWriter must be non-NULL +@see PxVehiclePvdAttributesCreate +@see PxVehiclePvdObjectCreate +@see PxVehiclePvdWheelAttachmentsRegister +*/ +void PxVehiclePvdWheelAttachmentsWrite +(const PxVehicleAxleDescription& axleDesc, + const PxVehicleArrayData& wheelParams, + const PxVehicleArrayData& wheelActuationStates, + const PxVehicleArrayData& wheelRigidBody1dStates, + const PxVehicleArrayData& wheelLocalPoses, + const PxVehicleArrayData& roadGeometryStates, + const PxVehicleArrayData& suspParams, + const PxVehicleArrayData& suspCompParams, + const PxVehicleArrayData& suspForceParams, + const PxVehicleArrayData& suspStates, + const PxVehicleArrayData& suspCompStates, + const PxVehicleArrayData& suspForces, + const PxVehicleArrayData& tireForceParams, + const PxVehicleArrayData& tireDirectionStates, + const PxVehicleArrayData& tireSpeedStates, + const PxVehicleArrayData& tireSlipStates, + const PxVehicleArrayData& tireStickyStates, + const PxVehicleArrayData& tireGripStates, + const PxVehicleArrayData& tireCamberStates, + const PxVehicleArrayData& tireForces, + const PxVehiclePvdAttributeHandles& attributeHandles, + const PxVehiclePvdObjectHandles& objectHandles, OmniPvdWriter* omniWriter); + +/** +\brief Register object instances in omnipvd that will be used to reflect the antiroll bars of a vehicle instance. +\param[in] antiRollForceParams is an array of antiroll parameters. +\param[in] antiRollTorque describes the instantaneous accumulated torque from all antiroll bas. +\param[in] attributeHandles contains a general description of vehicle parameters and states that will be reflected in omnipvd. +\param[in] objectHandles contains unique handles for the parameters and states of each vehicle instance. +\param[in] omniWriter is an OmniPvdWriter instance used to communicate state and parameter data to omnipvd. +\note If antiRollForceParams is empty, the corresponding data will not be reflected in omnipvd. +\note If antiRollTorque is NULL, the corresponding data will not be reflected in omnipvd. +\note objectHandles must be non-NULL +\note omniWriter must be non-NULL +@see PxVehiclePvdAttributesCreate +@see PxVehiclePvdObjectCreate +@see PxVehiclePvdAntiRollsWrite +*/ +void PxVehiclePvdAntiRollsRegister +(const PxVehicleSizedArrayData& antiRollForceParams, const PxVehicleAntiRollTorque* antiRollTorque, + const PxVehiclePvdAttributeHandles& attributeHandles, + PxVehiclePvdObjectHandles* objectHandles, OmniPvdWriter* omniWriter); + +/** +\brief Write antiroll data to omnipvd. +\param[in] antiRollForceParams is an array of antiroll parameters. +\param[in] antiRollTorque describes the instantaneous accumulated torque from all antiroll bas. +\param[in] attributeHandles contains a general description of vehicle parameters and states that will be reflected in omnipvd. +\param[in] objectHandles contains unique handles for the parameters and states of each vehicle instance. +\param[in] omniWriter is an OmniPvdWriter instance used to communicate state and parameter data to omnipvd. +\note If antiRollForceParams is empty but the corresponding argument was not empty, the corresponding data will not be updated in omnipvd. +\note If antiRollTorque is NULL but the corresponding argument was not NULL, the corresponding data will not be updated in omnipvd. +\note omniWriter must be non-NULL +@see PxVehiclePvdAttributesCreate +@see PxVehiclePvdObjectCreate +@see PxVehiclePvdAntiRollsRegister +*/ +void PxVehiclePvdAntiRollsWrite +(const PxVehicleSizedArrayData& antiRollForceParams, const PxVehicleAntiRollTorque* antiRollTorque, + const PxVehiclePvdAttributeHandles& attributeHandles, + const PxVehiclePvdObjectHandles& objectHandles, OmniPvdWriter* omniWriter); + +/** +\brief Register object instances in omnipvd that will be used to reflect the direct drivetrain of a vehicle instance. +\param[in] commandState describes the control values applied to the vehicle. +\param[in] transmissionCommandState describes the state of the direct drive transmission. +\param[in] directDriveThrottleResponseParams describes the vehicle's torque response to a throttle command. +\param[in] directDriveThrottleResponseState is the instantaneous torque response of each wheel to a throttle command. +\param[in] attributeHandles contains a general description of vehicle parameters and states that will be reflected in omnipvd. +\param[in] objectHandles contains unique handles for the parameters and states of each vehicle instance. +\param[in] omniWriter is an OmniPvdWriter instance used to communicate state and parameter data to omnipvd. +\note If commandState is NULL, the corresponding data will not be reflected in omnipvd. +\note If transmissionCommandState is NULL, the corresponding data will not be reflected in omnipvd. +\note If directDriveThrottleResponseParams is NULL, the corresponding data will not be reflected in omnipvd. +\note If directDriveThrottleResponseState is empty, the corresponding data will not be reflected in omnipvd. +\note objectHandles must be non-NULL +\note omniWriter must be non-NULL +@see PxVehiclePvdAttributesCreate +@see PxVehiclePvdObjectCreate +@see PxVehiclePvdDirectDrivetrainWrite +*/ +void PxVehiclePvdDirectDrivetrainRegister +(const PxVehicleCommandState* commandState, const PxVehicleDirectDriveTransmissionCommandState* transmissionCommandState, + const PxVehicleDirectDriveThrottleCommandResponseParams* directDriveThrottleResponseParams, + const PxVehicleArrayData& directDriveThrottleResponseState, + const PxVehiclePvdAttributeHandles& attributeHandles, + PxVehiclePvdObjectHandles* objectHandles, OmniPvdWriter* omniWriter); + +/** +\brief Write direct drivetrain data to omnipvd. +\param[in] axleDesc is a description of the wheels and axles of a vehicle. +\param[in] commandState describes the control values applied to the vehicle. +\param[in] transmissionCommandState describes the state of the direct drive transmission. +\param[in] directDriveThrottleResponseParams describes the vehicle's torque response to a throttle command. +\param[in] directDriveThrottleResponseState is the instantaneous torque response of each wheel to a throttle command. +\param[in] attributeHandles contains a general description of vehicle parameters and states that will be reflected in omnipvd. +\param[in] objectHandles contains unique handles for the parameters and states of each vehicle instance. +\param[in] omniWriter is an OmniPvdWriter instance used to communicate state and parameter data to omnipvd. +\note If commandState is NULL but the corresponding entry in PxVehiclePvdDirectDrivetrainRegister() was not NULL, the corresponding data will not be updated in omnipvd. +\note If transmissionCommandState is NULL but the corresponding entry in PxVehiclePvdDirectDrivetrainRegister() was not NULL, the corresponding data will not be updated in omnipvd. +\note If directDriveThrottleResponseParams is NULL but the corresponding entry in PxVehiclePvdDirectDrivetrainRegister() was not NULL, the corresponding data will not be updated in omnipvd. +\note If directDriveThrottleResponseState is empty but the corresponding entry in PxVehiclePvdDirectDrivetrainRegister() was not empty, the corresponding data will not be updated in omnipvd. +\note omniWriter must be non-NULL +@see PxVehiclePvdAttributesCreate +@see PxVehiclePvdObjectCreate +@see PxVehiclePvdDirectDrivetrainRegister +*/ +void PxVehiclePvdDirectDrivetrainWrite +(const PxVehicleAxleDescription& axleDesc, + const PxVehicleCommandState* commandState, const PxVehicleDirectDriveTransmissionCommandState* transmissionCommandState, + const PxVehicleDirectDriveThrottleCommandResponseParams* directDriveThrottleResponseParams, + const PxVehicleArrayData& directDriveThrottleResponseState, + const PxVehiclePvdAttributeHandles& attributeHandles, + const PxVehiclePvdObjectHandles& objectHandles, OmniPvdWriter* omniWriter); + +/** +\brief Register object instances in omnipvd that will be used to reflect the engine drivetrain of a vehicle instance. +\param[in] commandState describes the control values applied to the vehicle. +\param[in] transmissionCommandState describes the state of the engine drive transmission. +\param[in] clutchResponseParams describes the vehicle's response to a clutch command. +\param[in] clutchParams describes the vehicle's clutch. +\param[in] engineParams describes the engine. +\param[in] gearboxParams describes the gearbox. +\param[in] autoboxParams describes the automatic gearbox. +\param[in] multiWheelDiffParams describes a multiwheel differential without limited slip compensation. +\param[in] fourWheelDiffPrams describes a differential that delivers torque to four drive wheels with limited slip compensation. +\param[in] clutchResponseState is the instantaneous reponse of the clutch to a clutch command. +\param[in] throttleResponseState is the instantaneous response to a throttle command. +\param[in] engineState is the instantaneous state of the engine. +\param[in] gearboxState is the instantaneous state of the gearbox. +\param[in] autoboxState is the instantaneous state of the automatic gearbox. +\param[in] diffState is the instantaneous state of the differential. +\param[in] clutchSlipState is the instantaneous slip recorded at the clutch. +\param[in] attributeHandles contains a general description of vehicle parameters and states that will be reflected in omnipvd. +\param[in] objectHandles contains unique handles for the parameters and states of each vehicle instance. +\param[in] omniWriter is an OmniPvdWriter instance used to communicate state and parameter data to omnipvd. +\note If any pointer is NULL, the corresponding data will not be reflected in omnipvd. +\note objectHandles must be non-NULL +\note omniWriter must be non-NULL +@see PxVehiclePvdAttributesCreate +@see PxVehiclePvdObjectCreate +@see PxVehiclePvdEngineDrivetrainWrite +*/ +void PxVehiclePvdEngineDrivetrainRegister +(const PxVehicleCommandState* commandState, const PxVehicleEngineDriveTransmissionCommandState* transmissionCommandState, + const PxVehicleClutchCommandResponseParams* clutchResponseParams, + const PxVehicleClutchParams* clutchParams, + const PxVehicleEngineParams* engineParams, + const PxVehicleGearboxParams* gearboxParams, + const PxVehicleAutoboxParams* autoboxParams, + const PxVehicleMultiWheelDriveDifferentialParams* multiWheelDiffParams, + const PxVehicleFourWheelDriveDifferentialParams* fourWheelDiffPrams, + const PxVehicleClutchCommandResponseState* clutchResponseState, + const PxVehicleEngineDriveThrottleCommandResponseState* throttleResponseState, + const PxVehicleEngineState* engineState, + const PxVehicleGearboxState* gearboxState, + const PxVehicleAutoboxState* autoboxState, + const PxVehicleDifferentialState* diffState, + const PxVehicleClutchSlipState* clutchSlipState, + const PxVehiclePvdAttributeHandles& attributeHandles, + PxVehiclePvdObjectHandles* objectHandles, OmniPvdWriter* omniWriter); + +/** +\brief Write engine drivetrain data of a vehicle instance to omnipvd. +\param[in] commandState describes the control values applied to the vehicle. +\param[in] transmissionCommandState describes the state of the engine drive transmission. +\param[in] clutchResponseParams describes the vehicle's response to a clutch command. +\param[in] clutchParams describes the vehicle's clutch. +\param[in] engineParams describes the engine. +\param[in] gearboxParams describes the gearbox. +\param[in] autoboxParams describes the automatic gearbox. +\param[in] multiWheelDiffParams describes a multiwheel differential without limited slip compensation. +\param[in] fourWheelDiffPrams describes a differential that delivers torque to four drive wheels with limited slip compensation. +\param[in] clutchResponseState is the instantaneous reponse of the clutch to a clutch command. +\param[in] throttleResponseState is the instantaneous response to a throttle command. +\param[in] engineState is the instantaneous state of the engine. +\param[in] gearboxState is the instantaneous state of the gearbox. +\param[in] autoboxState is the instantaneous state of the automatic gearbox. +\param[in] diffState is the instantaneous state of the differential. +\param[in] clutchSlipState is the instantaneous slip recorded at the clutch. +\param[in] attributeHandles contains a general description of vehicle parameters and states that will be reflected in omnipvd. +\param[in] objectHandles contains unique handles for the parameters and states of each vehicle instance. +\param[in] omniWriter is an OmniPvdWriter instance used to communicate state and parameter data to omnipvd. +\note If any pointer is NULL and the corresponding argument in PxVehiclePvdEngineDrivetrainRegister() was not NULL, the corresponding data will not be reflected in omnipvd. +\note omniWriter must be non-NULL +@see PxVehiclePvdAttributesCreate +@see PxVehiclePvdObjectCreate +@see PxVehiclePvdEngineDrivetrainRegister +*/ +void PxVehiclePvdEngineDrivetrainWrite +(const PxVehicleCommandState* commandState, const PxVehicleEngineDriveTransmissionCommandState* transmissionCommandState, + const PxVehicleClutchCommandResponseParams* clutchResponseParams, + const PxVehicleClutchParams* clutchParams, + const PxVehicleEngineParams* engineParams, + const PxVehicleGearboxParams* gearboxParams, + const PxVehicleAutoboxParams* autoboxParams, + const PxVehicleMultiWheelDriveDifferentialParams* multiWheelDiffParams, + const PxVehicleFourWheelDriveDifferentialParams* fourWheelDiffPrams, + const PxVehicleClutchCommandResponseState* clutchResponseState, + const PxVehicleEngineDriveThrottleCommandResponseState* throttleResponseState, + const PxVehicleEngineState* engineState, + const PxVehicleGearboxState* gearboxState, + const PxVehicleAutoboxState* autoboxState, + const PxVehicleDifferentialState* diffState, + const PxVehicleClutchSlipState* clutchSlipState, + const PxVehiclePvdAttributeHandles& attributeHandles, + const PxVehiclePvdObjectHandles& objectHandles, OmniPvdWriter* omniWriter); + +/** +\brief Register per wheel attachment data that involves the vehicle's integration with a PhysX scene. +\param[in] axleDesc is a description of the wheels and axles of a vehicle. +\param[in] physxSuspLimitConstraintParams describes the method used by PhysX to enforce suspension travel limits. +\param[in] physxMaterialFrictionParams describes the friction response of each wheel to a set of PxMaterial instances. +\param[in] physxActor describes the PxRigidActor and PxShape instances that are used to represent the vehicle's rigid body and wheel shapes in PhysX. +\param[in] physxRoadGeometryQueryParams describes the physx scene query method used to place each wheel on the ground. +\param[in] physxRoadGeomState is an array of per wheel physx scene query results. +\param[in] physxConstraintStates is an array of constraints states used by PhysX to enforce sticky tire and suspension travel limit constraints. +\param[in] attributeHandles contains a general description of vehicle parameters and states that will be reflected in omnipvd. +\param[in] objectHandles contains unique handles for the parameters and states of each vehicle instance. +\param[in] omniWriter is an OmniPvdWriter instance used to communicate state and parameter data to omnipvd. +\note If any array is empty, the corresponding data will not be reflected in omnipvd. +\note If physxActor is NULL, the corresponding data will not be reflected in omnipvd. +\note If physxRoadGeometryQueryParams is NULL, the corresponding data will not be reflected in omnipvd. +\note Each array must either be empty or contain an entry for each wheel present in axleDesc. +\note objectHandles must be non-NULL. +\note omniWriter must be non-NULL. +@see PxVehiclePvdAttributesCreate +@see PxVehiclePvdObjectCreate +@see PxVehiclePvdPhysXWheelAttachmentWrite +*/ +void PxVehiclePvdPhysXWheelAttachmentRegister +(const PxVehicleAxleDescription& axleDesc, + const PxVehicleArrayData& physxSuspLimitConstraintParams, + const PxVehicleArrayData& physxMaterialFrictionParams, + const PxVehiclePhysXActor* physxActor, const PxVehiclePhysXRoadGeometryQueryParams* physxRoadGeometryQueryParams, + const PxVehicleArrayData& physxRoadGeomState, + const PxVehicleArrayData& physxConstraintStates, + const PxVehiclePvdAttributeHandles& attributeHandles, + PxVehiclePvdObjectHandles* objectHandles, OmniPvdWriter* omniWriter); + +/** +\brief Write to omnipvd the per wheel attachment data that involves the vehicle's integration with a PhysX scene. +\param[in] axleDesc is a description of the wheels and axles of a vehicle. +\param[in] physxSuspLimitConstraintParams describes the method used by PhysX to enforce suspension travel limits. +\param[in] physxMaterialFrictionParams describes the friction response of each wheel to a set of PxMaterial instances. +\param[in] physxActor describes the PxShape instances that are used to represent the vehicle's wheel shapes in PhysX. +\param[in] physxRoadGeometryQueryParams describes the physx scene query method used to place each wheel on the ground. +\param[in] physxRoadGeomState is an array of per wheel physx scene query results. +\param[in] physxConstraintStates is an array of constraints states used by PhysX to enforce sticky tire and suspension travel limit constraints. +\param[in] attributeHandles contains a general description of vehicle parameters and states that will be reflected in omnipvd. +\param[in] objectHandles contains unique handles for the parameters and states of each vehicle instance. +\param[in] omniWriter is an OmniPvdWriter instance used to communicate state and parameter data to omnipvd. +\note If any array is empty but the corresponding array in PxVehiclePvdPhysXWheelAttachmentRegister() was not empty, the corresponding data will not be updated in omnipvd. +\note If physxActor is NULL but the corresponding argument in PxVehiclePvdPhysXWheelAttachmentRegister was not NULL, the corresponding data will not be reflected in omnipvd. +\note If physxRoadGeometryQueryParams is NULL but the corresponding argument in PxVehiclePvdPhysXWheelAttachmentRegister was not NULL, the corresponding data will not be reflected in omnipvd. +\note Each array must either be empty or contain an entry for each wheel present in axleDesc. +\note omniWriter must be non-NULL. +@see PxVehiclePvdAttributesCreate +@see PxVehiclePvdObjectCreate +@see PxVehiclePvdPhysXWheelAttachmentWrite +*/ +void PxVehiclePvdPhysXWheelAttachmentWrite +(const PxVehicleAxleDescription& axleDesc, + const PxVehicleArrayData& physxSuspLimitConstraintParams, + const PxVehicleArrayData& physxMaterialFrictionParams, + const PxVehiclePhysXActor* physxActor, const PxVehiclePhysXRoadGeometryQueryParams* physxRoadGeometryQueryParams, + const PxVehicleArrayData& physxRoadGeomState, + const PxVehicleArrayData& physxConstraintStates, + const PxVehiclePvdAttributeHandles& attributeHandles, + const PxVehiclePvdObjectHandles& objectHandles, OmniPvdWriter* omniWriter); + +/** +\brief Register the PxRigidActor instance that represents the vehicle's rigid body in a PhysX scene. +\param[in] physxActor describes the PxRigidActor instance that is used to represent the vehicle's rigid body in PhysX. +\param[in] attributeHandles contains a general description of vehicle parameters and states that will be reflected in omnipvd. +\param[in] objectHandles contains unique handles for the parameters and states of each vehicle instance. +\param[in] omniWriter is an OmniPvdWriter instance used to communicate state and parameter data to omnipvd. +\note If physxActor is NULL, the corresponding data will not be reflected in omnipvd. +\note objectHandles must be non-NULL. +\note omniWriter must be non-NULL. +@see PxVehiclePvdAttributesCreate +@see PxVehiclePvdObjectCreate +@see PxVehiclePvdPhysXRigidActorWrite +*/ +void PxVehiclePvdPhysXRigidActorRegister +(const PxVehiclePhysXActor* physxActor, + const PxVehiclePvdAttributeHandles& attributeHandles, + PxVehiclePvdObjectHandles* objectHandles, OmniPvdWriter* omniWriter); + +/** +\brief Write the PxRigidActor instance to omnipvd. +\param[in] physxActor describes the PxRigidActor instance that is used to represent the vehicle's rigid body in PhysX. +\param[in] attributeHandles contains a general description of vehicle parameters and states that will be reflected in omnipvd. +\param[in] objectHandles contains unique handles for the parameters and states of each vehicle instance. +\param[in] omniWriter is an OmniPvdWriter instance used to communicate state and parameter data to omnipvd. +\note If physxActor is NULL and the corresponding argument in PxVehiclePvdPhysXRigidActorRegister was not NULL, the corresponding data will not be updated in omnipvd. +\note objectHandles must be non-NULL. +\note omniWriter must be non-NULL. +@see PxVehiclePvdAttributesCreate +@see PxVehiclePvdObjectCreate +@see PxVehiclePvdPhysXRigidActorRegister +*/ +void PxVehiclePvdPhysXRigidActorWrite +(const PxVehiclePhysXActor* physxActor, + const PxVehiclePvdAttributeHandles& attributeHandles, + const PxVehiclePvdObjectHandles& objectHandles, OmniPvdWriter* omniWriter); + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/pvd/PxVehiclePvdHelpers.h b/Source/ThirdParty/PhysX/vehicle2/pvd/PxVehiclePvdHelpers.h new file mode 100644 index 000000000..1151dee8d --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/pvd/PxVehiclePvdHelpers.h @@ -0,0 +1,114 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxSimpleTypes.h" + +class OmniPvdWriter; +namespace physx +{ +class PxAllocatorCallback; +namespace vehicle2 +{ +struct PxVehiclePvdAttributeHandles; +struct PxVehiclePvdObjectHandles; +} +} + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +/** +\brief Create the attribute handles necessary to reflect vehicles in omnipvd. +\param[in] allocator is used to allocate the memory used to store the attribute handles. +\param[in] omniWriter is used to register the attribute handles with omnipvd. +\note omniWriter must be a valid pointer to an instance of OmniPvdWriter. +@see PxVehicleSimulationContext +@see PxVehiclePVDComponent +@see PxVehiclePvdAttributesRelease +*/ +PxVehiclePvdAttributeHandles* PxVehiclePvdAttributesCreate +(PxAllocatorCallback& allocator, OmniPvdWriter* omniWriter); + +/** +\brief Destory the attribute handles created by PxVehiclePvdAttributesCreate(). +\param[in] allocator must be the instance used by PxVehiclePvdObjectCreate(). +\param[in] omniWriter must point to the same OmniPvdWriter instance used for the complementary call to PxVehiclePvdAttributesCreate(). +\param[in] attributeHandles is the PxVehiclePvdAttributeHandles created by PxVehiclePvdAttributesCreate(). +@see PxVehiclePvdAttributesCreate +*/ +void PxVehiclePvdAttributesRelease +(PxAllocatorCallback& allocator, OmniPvdWriter* omniWriter, PxVehiclePvdAttributeHandles* attributeHandles); + +/** +\brief Create omnipvd objects that will be used to reflect an individual veicle in omnipvd. +\param[in] nbWheels must be greater than or equal to the number of wheels on the vehicle. +\param[in] nbAntirolls must be greater than or equal to the number of antiroll bars on the vehicle. +\param[in] maxNbPhysxMaterialFrictions must be greater than or equal to the number of PxPhysXMaterialFriction instances associated with any wheel of the vehicle. +\param[in] contextHandle is typically used to associated vehicles with a particular scene or group. +\param[in] attributeHandles is the PxVehiclePvdAttributeHandles instance returned by PxVehiclePvdAttributesCreate() +\param[in] omniWriter is used to register the attribute handles with omnipvd. +\param[in] allocator is used to allocate the memory used to store handles to the created omnipvd objects. +\note PxVehiclePvdObjectCreate() must be called after PxVehiclePvdAttributesCreate(). +@see PxVehicleAxleDescription +@see PxVehicleAntiRollForceParams +@see PxVehiclePhysXMaterialFrictionParams +@see PxVehiclePVDComponent +@see PxVehiclePvdAttributesCreate +*/ +PxVehiclePvdObjectHandles* PxVehiclePvdObjectCreate +(const PxU32 nbWheels, const PxU32 nbAntirolls, const PxU32 maxNbPhysxMaterialFrictions, + const PxU64 contextHandle, const PxVehiclePvdAttributeHandles& attributeHandles, + OmniPvdWriter* omniWriter, PxAllocatorCallback& allocator); + +/** +\brief Destroy the PxVehiclePvdObjectHandles instance created by PxVehiclePvdObjectCreate(). +\param[in] attributeHandles is the PxVehiclePvdAttributeHandles created by PxVehiclePvdAttributesCreate(). +\param[in] omniWriter is used to register the attribute handles with omnipvd. +\param[in] allocator must be the instance used by PxVehiclePvdObjectCreate(). +\param[in] objectHandles is the PxVehiclePvdObjectHandles that was created by PxVehiclePvdObjectCreate(). +*/ +void PxVehiclePvdObjectRelease +(const PxVehiclePvdAttributeHandles& attributeHandles, + OmniPvdWriter* omniWriter, PxAllocatorCallback& allocator, PxVehiclePvdObjectHandles* objectHandles); + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/rigidBody/PxVehicleRigidBodyComponents.h b/Source/ThirdParty/PhysX/vehicle2/rigidBody/PxVehicleRigidBodyComponents.h new file mode 100644 index 000000000..c4a976660 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/rigidBody/PxVehicleRigidBodyComponents.h @@ -0,0 +1,114 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ +#include "vehicle2/PxVehicleParams.h" +#include "vehicle2/PxVehicleComponent.h" + +#include "PxVehicleRigidBodyFunctions.h" + +#include "common/PxProfileZone.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +/** +\brief Forward integrate the momentum and pose of the vehicle's rigid body after applying forces and torques +from the suspension, tires and anti-roll bars. +*/ +class PxVehicleRigidBodyComponent : public PxVehicleComponent +{ +public: + + PxVehicleRigidBodyComponent() : PxVehicleComponent() {} + virtual ~PxVehicleRigidBodyComponent() {} + + /** + \brief Retrieve pointers to the parameter and state data required to update the dynamic state of a rigid body. + \param[out] axleDescription must be returned as a non-null pointer to a single PxVehicleAxleDescription instance that describes the wheels and axles + of the vehicle. + \param[out] rigidBodyParams must be returned as a non-null pointer to a single PxVehicleRigidBodyParams instance that describes the mass and moment of + inertia of the rigid body. + \param[out] suspensionForces must be returned as a non-null pointer to an array of suspension forces and torques in the world frame. + The suspension forces and torques will be applied to the rigid body to update *rigidBodyState*. + \param[out] tireForces must be returned as a non-null pointer to an array of tire forces and torques in the world frame. + The tire forces and torques will be applied to the rigid body to update *rigidBodyState*. + \param[out] antiRollTorque may be returned an optionally non-null pointer to a single PxVehicleAntiRollTorque instance that contains the accumulated anti-roll + torque to apply to the rigid body. + \param[out] rigidBodyState imust be returned as a non-null pointer to a single PxVehicleRigidBodyState instance that is to be forward integrated. + \note The suspensionForces array must contain an entry for each wheel listed as an active wheel in axleDescription. + \note The tireForces array must contain an entry for each wheel listed as an active wheel in axleDescription. + \note If antiRollTorque is returned as a null pointer then zero anti-roll torque will be applied to the rigid body. + */ + virtual void getDataForRigidBodyComponent( + const PxVehicleAxleDescription*& axleDescription, + const PxVehicleRigidBodyParams*& rigidBodyParams, + PxVehicleArrayData& suspensionForces, + PxVehicleArrayData& tireForces, + const PxVehicleAntiRollTorque*& antiRollTorque, + PxVehicleRigidBodyState*& rigidBodyState) = 0; + + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_PROFILE_ZONE("PxVehicleRigidBodyComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + const PxVehicleRigidBodyParams* rigidBodyParams; + PxVehicleArrayData suspensionForces; + PxVehicleArrayData tireForces; + const PxVehicleAntiRollTorque* antiRollTorque; + PxVehicleRigidBodyState* rigidBodyState; + + getDataForRigidBodyComponent(axleDescription, rigidBodyParams, + suspensionForces, tireForces, antiRollTorque, + rigidBodyState); + + PxVehicleRigidBodyUpdate( + *axleDescription, *rigidBodyParams, + suspensionForces, tireForces, antiRollTorque, + dt, context.gravity, + *rigidBodyState); + + return true; + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/rigidBody/PxVehicleRigidBodyFunctions.h b/Source/ThirdParty/PhysX/vehicle2/rigidBody/PxVehicleRigidBodyFunctions.h new file mode 100644 index 000000000..c1e555ea6 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/rigidBody/PxVehicleRigidBodyFunctions.h @@ -0,0 +1,80 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxVec3.h" +#include "foundation/PxSimpleTypes.h" +#include "vehicle2/PxVehicleParams.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +struct PxVehicleRigidBodyParams; +struct PxVehicleSuspensionForce; +struct PxVehicleTireForce; +struct PxVehicleAntiRollTorque; +struct PxVehicleRigidBodyState; + +/** +\brief Forward integrate rigid body state. +\param[in] axleDescription is a description of the axles of the vehicle and the wheels on each axle. +\param[in] rigidBodyParams is a description of rigid body mass and moment of inertia. +\param[in] suspensionForces is an array of suspension forces and torques in the world frame to be applied to the rigid body. +\param[in] tireForces is an array of tire forces and torques in the world frame to be applied to the rigid body. +\param[in] antiRollTorque is an optional pointer to a single PxVehicleAntiRollTorque instance that contains the accumulated anti-roll +torque to apply to the rigid body. +\param[in] dt is the timestep of the forward integration. +\param[in] gravity is gravitational acceleration. +\param[in,out] rigidBodyState is the rigid body state that is to be updated. +\note The suspensionForces array must contain an entry for each wheel listed as an active wheel in axleDescription. +\note The tireForces array must contain an entry for each wheel listed as an active wheel in axleDescription. +\note If antiRollTorque is a null pointer then zero anti-roll torque will be applied to the rigid body. +*/ +void PxVehicleRigidBodyUpdate + (const PxVehicleAxleDescription& axleDescription, const PxVehicleRigidBodyParams& rigidBodyParams, + const PxVehicleArrayData& suspensionForces, + const PxVehicleArrayData& tireForces, + const PxVehicleAntiRollTorque* antiRollTorque, + const PxReal dt, const PxVec3& gravity, + PxVehicleRigidBodyState& rigidBodyState); + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/rigidBody/PxVehicleRigidBodyParams.h b/Source/ThirdParty/PhysX/vehicle2/rigidBody/PxVehicleRigidBodyParams.h new file mode 100644 index 000000000..8fe3dea37 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/rigidBody/PxVehicleRigidBodyParams.h @@ -0,0 +1,91 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxFoundation.h" +#include "vehicle2/PxVehicleParams.h" +#include "vehicle2/PxVehicleFunctions.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +/** +\brief The properties of the rigid body. +*/ +struct PxVehicleRigidBodyParams +{ + /** + \brief The mass of the rigid body. + + Range: (0, inf)
+ Unit: mass + */ + PxReal mass; + + /** + \brief The moment of inertia of the rigid body. + + Range: (0, inf)
+ Unit: mass * (length^2) + */ + PxVec3 moi; + + PX_FORCE_INLINE PxVehicleRigidBodyParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PxVehicleRigidBodyParams r = *this; + r.moi = PxVehicleTransformFrameToFrame(srcFrame, trgFrame, moi).abs(); + const PxReal scale = trgScale.scale/srcScale.scale; + r.moi *= (scale*scale); + return r; + } + + PX_FORCE_INLINE bool isValid() const + { + PX_CHECK_AND_RETURN_VAL(mass > 0.0f, "PxVehicleRigidBodyParams.mass must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(moi.x > 0.0f && moi.y > 0.0f && moi.z> 0.0f, "PxVehicleRigidBodyParams.moi must be greater than zero", false); + return true; + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ + diff --git a/Source/ThirdParty/PhysX/vehicle2/rigidBody/PxVehicleRigidBodyStates.h b/Source/ThirdParty/PhysX/vehicle2/rigidBody/PxVehicleRigidBodyStates.h new file mode 100644 index 000000000..ce2b33e9a --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/rigidBody/PxVehicleRigidBodyStates.h @@ -0,0 +1,98 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxTransform.h" +#include "foundation/PxVec3.h" +#include "vehicle2/PxVehicleParams.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +struct PxVehicleRigidBodyState +{ + PxTransform pose; //!< the body's pose (in world space) + PxVec3 linearVelocity; //!< the body's linear velocity (in world space) + PxVec3 angularVelocity; //!< the body's angular velocity (in world space) + PxVec3 previousLinearVelocity; //!< the previous linear velocity of the body (in world space) + PxVec3 previousAngularVelocity; //!< the previous angular velocity of the body (in world space) + PxVec3 externalForce; //!< external force (in world space) affecting the rigid body (usually excluding gravitational force) + PxVec3 externalTorque; //!< external torque (in world space) affecting the rigid body + + PX_FORCE_INLINE void setToDefault() + { + pose = PxTransform(PxIdentity); + linearVelocity = PxVec3(PxZero); + angularVelocity = PxVec3(PxZero); + externalForce = PxVec3(PxZero); + externalTorque = PxVec3(PxZero); + } + + /** + \brief Compute the vertical speed of the rigid body transformed to the world frame. + \param[in] frame describes the axes of the vehicle + */ + PX_FORCE_INLINE PxReal getVerticalSpeed(const PxVehicleFrame& frame) const + { + return linearVelocity.dot(pose.q.rotate(frame.getVrtAxis())); + } + + /** + \param[in] frame describes the axes of the vehicle + \brief Compute the lateral speed of the rigid body transformed to the world frame. + */ + PX_FORCE_INLINE PxReal getLateralSpeed(const PxVehicleFrame& frame) const + { + return linearVelocity.dot(pose.q.rotate(frame.getLatAxis())); + } + + /** + \brief Compute the longitudinal speed of the rigid body transformed to the world frame. + \param[in] frame describes the axes of the vehicle + */ + PX_FORCE_INLINE PxReal getLongitudinalSpeed(const PxVehicleFrame& frame) const + { + return linearVelocity.dot(pose.q.rotate(frame.getLngAxis())); + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/roadGeometry/PxVehicleRoadGeometryState.h b/Source/ThirdParty/PhysX/vehicle2/roadGeometry/PxVehicleRoadGeometryState.h new file mode 100644 index 000000000..1c4a9e2e2 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/roadGeometry/PxVehicleRoadGeometryState.h @@ -0,0 +1,63 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxPlane.h" +#include "foundation/PxMemory.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +struct PxVehicleRoadGeometryState +{ + PxPlane plane; //!< the plane under the wheel + PxReal friction; //!< the friction to be used by the tire model + PxVec3 velocity; //!< the velocity of the road geometry + bool hitState; //!< true if a plane is found, false if there is no plane. + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleRoadGeometryState)); + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/steering/PxVehicleSteeringFunctions.h b/Source/ThirdParty/PhysX/vehicle2/steering/PxVehicleSteeringFunctions.h new file mode 100644 index 000000000..3b77b3921 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/steering/PxVehicleSteeringFunctions.h @@ -0,0 +1,80 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxPreprocessor.h" +#include "foundation/PxSimpleTypes.h" + +#include "vehicle2/PxVehicleParams.h" +#include "PxVehicleSteeringParams.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +struct PxVehicleCommandState; + +/** +\brief Compute the yaw angle response to a steer command. +\param[in] steer is the input steer command value. +\param[in] longitudinalSpeed is the longitudinal speed of the vehicle. +\param[in] wheelId specifies the wheel to have its steer response computed. +\param[in] steerResponseParmas specifies the per wheel yaw angle response to the steer command as a nonlinear function of steer command and longitudinal speed. +\param[out] steerResponseState is the yaw angle response to the input steer command. +*/ +void PxVehicleSteerCommandResponseUpdate +(const PxReal steer, const PxReal longitudinalSpeed, + const PxU32 wheelId, const PxVehicleSteerCommandResponseParams& steerResponseParmas, + PxReal& steerResponseState); + +/** +\brief Account for Ackermann correction by modifying the per wheel steer response multipliers to engineer an asymmetric steer response across axles. +\param[in] steer is the input steer command value. +\param[in] steerResponseParmas describes the maximum response and a response multiplier per axle. +\param[in] ackermannParams is an array that describes the wheels affected by Ackerman steer correction. +\param[in,out] steerResponseStates contains the corrected per wheel steer response multipliers that take account of Ackermann steer correction. +*/ +void PxVehicleAckermannSteerUpdate +(const PxReal steer, const PxVehicleSteerCommandResponseParams& steerResponseParmas, + const PxVehicleSizedArrayData& ackermannParams, + PxVehicleArrayData& steerResponseStates); + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/steering/PxVehicleSteeringParams.h b/Source/ThirdParty/PhysX/vehicle2/steering/PxVehicleSteeringParams.h new file mode 100644 index 000000000..f40cd14f2 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/steering/PxVehicleSteeringParams.h @@ -0,0 +1,122 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxFoundation.h" + +#include "vehicle2/PxVehicleParams.h" + +#include "vehicle2/commands/PxVehicleCommandParams.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +struct PxVehicleFrame; +struct PxVehicleScale; + +/** +\brief Distribute a steer response to the wheels of a vehicle. +\note The steer angle applied to each wheel on the ith wheel is steerCommand * maxResponse * wheelResponseMultipliers[i]. +\note A typical use case is to set maxResponse to be the vehicle's maximum achievable steer angle +that occurs when the steer command is equal to 1.0. The array wheelResponseMultipliers[i] would then be used +to specify the maximum achievable steer angle per wheel as a fractional multiplier of the vehicle's maximum achievable steer angle. +*/ +struct PxVehicleSteerCommandResponseParams : public PxVehicleCommandResponseParams +{ + PX_FORCE_INLINE PxVehicleSteerCommandResponseParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PX_UNUSED(srcScale); + PX_UNUSED(trgScale); + return *this; + } + + PX_FORCE_INLINE bool isValid(const PxVehicleAxleDescription& axleDesc) const + { + if (!axleDesc.isValid()) + return false; + for (PxU32 i = 0; i < axleDesc.nbWheels; i++) + { + PX_CHECK_AND_RETURN_VAL(PxAbs(maxResponse*wheelResponseMultipliers[axleDesc.wheelIdsInAxleOrder[i]]) <= PxPi, + "PxVehicleSteerCommandResponseParams.maxResponse*PxVehicleSteerCommandResponseParams.wheelResponseMultipliers[i] must be in range [-Pi, Pi]", false); + } + return true; + } +}; + +/** +\brief A description of a single axle that is to be affected by Ackermann steer correction. +*/ +struct PxVehicleAckermannParams +{ + PxU32 wheelIds[2]; //!< wheelIds[0] is the id of the wheel that is negative along the lateral axis, wheelIds[1] is the wheel id that is positive along the lateral axis. + PxReal wheelBase; //!< wheelBase is the longitudinal distance between the axle that is affected by Ackermann correction and a reference axle. + PxReal trackWidth; //!< trackWidth is the width of the axle specified by #wheelIds + PxReal strength; //!< is the strength of the correction with 0 denoting no correction and 1 denoting perfect correction. + + PX_FORCE_INLINE bool isValid(const PxVehicleAxleDescription& axleDesc) const + { + PX_CHECK_AND_RETURN_VAL(0.0f == strength || wheelIds[0] < axleDesc.getNbWheels(), "PxVehicleAckermannParams.wheelIds[0] must be valid wheel", false); + PX_CHECK_AND_RETURN_VAL(0.0f == strength || wheelIds[1] < axleDesc.getNbWheels(), "PxVehicleAckermannParams.wheelIds[1] must be a valid wheel", false); + PX_CHECK_AND_RETURN_VAL(0.0f == strength || wheelIds[0] != wheelIds[1], "PxVehicleAckermannParams.wheelIds[0] and PxVehicleAckermannParams.wheelIds[1] must reference two different wheels", false); + PX_CHECK_AND_RETURN_VAL(0.0f == strength || wheelBase > 0.0f, "PxVehicleAckermannParams.wheelBase must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(0.0f == strength || trackWidth > 0.0f, "PxVehicleAckermannParams.trackWidth must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(strength >= 0.0f && strength <= 1.0f, "PxVehicleAckermannParams.strength must be in range [0,1]", false); + PX_UNUSED(axleDesc); + return true; + } + + PX_FORCE_INLINE PxVehicleAckermannParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PxVehicleAckermannParams r = *this; + const PxReal scale = trgScale.scale / srcScale.scale; + r.wheelBase *= scale; + r.trackWidth *= scale; + return r; + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/suspension/PxVehicleSuspensionComponents.h b/Source/ThirdParty/PhysX/vehicle2/suspension/PxVehicleSuspensionComponents.h new file mode 100644 index 000000000..fd6201fd8 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/suspension/PxVehicleSuspensionComponents.h @@ -0,0 +1,328 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "vehicle2/PxVehicleParams.h" +#include "vehicle2/PxVehicleComponent.h" + +#include "vehicle2/commands/PxVehicleCommandStates.h" +#include "vehicle2/commands/PxVehicleCommandHelpers.h" +#include "vehicle2/rigidBody/PxVehicleRigidBodyParams.h" +#include "vehicle2/roadGeometry/PxVehicleRoadGeometryState.h" +#include "vehicle2/wheel/PxVehicleWheelParams.h" + +#include "PxVehicleSuspensionParams.h" +#include "PxVehicleSuspensionStates.h" +#include "PxVehicleSuspensionFunctions.h" + +#include "common/PxProfileZone.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + + +class PxVehicleSuspensionComponent : public PxVehicleComponent +{ +public: + + PxVehicleSuspensionComponent() : PxVehicleComponent() {} + virtual ~PxVehicleSuspensionComponent() {} + + /** + \brief Retrieve pointers to the parameter and state data required to compute the suspension state and the forces/torques that arise from the suspension state. + \param[out] axleDescription must be returned as a non-null pointer to a single PxVehicleAxleDescription instance that describes the wheels and axles + of the vehicle. + \param[out] rigidBodyParams must be returned as a a non-null pointer to a single PxVehicleRigidBodyParams instance that describes the mass and moment + of inertia of the vehicle's rigid body. + \param[out] suspensionStateCalculationParams must be returned as a non-null pointer to a single PxVehicleSuspensionStateCalculationParams instance + that describes the jounce computation type etc. + \param[out] steerResponseStates must be returned as a non-null pointer to a single PxVehicleSteerCommandResponseStates instance that describes the steer + state of the wheels. + \param[out] rigidBodyState must be returned as a non-null pointer to a single PxVehicleRigidBodyState instance that describes the pose and momentum of + the vehicle's rigid body. + \param[out] wheelParams must be set to a non-null pointer to an array of PxVehicleWheelParams containing per-wheel parameters for each wheel + referenced by axleDescription. + \param[out] suspensionParams must be set to a non-null pointer to an array of PxVehicleSuspensionParams containing per-wheel parameters for each + wheel referenced by axleDescription. + \param[out] suspensionComplianceParams must be set to a non-null pointer to an array of PxVehicleSuspensionComplianceParams containing per-wheel + parameters for each wheel referenced by axleDescription. + \param[out] suspensionForceParams must be set to a non-null pointer to an array of PxVehicleSuspensionForceParams containing per-wheel parameters + for each wheel referenced by axleDescription. + \param[out] antiRollForceParams is optionally returned as a non-null pointer to an array of PxVehicleAntiRollForceParams with each element in the array + describing a unique anti-roll bar connecting a pair of wheels. + \param[out] wheelRoadGeomStates must be set to non-null pointer to an array of PxVehicleRoadGeometryState containing per-wheel road geometry for + each wheel referenced by axleDescription. + \param[out] suspensionStates must be set to a non-null pointer to an array of PxVehicleSuspensionState containing per-wheel suspension state for each + wheel referenced by axleDescription. + \param[out] suspensionComplianceStates must be set to a non-null pointer to an array of PxVehicleSuspensionComplianceState containing per-wheel suspension + compliance state for each wheel referenced by axleDescription. + \param[out] suspensionForces must be set to a non-null pointer to an array of PxVehicleSuspensionForce containing per-wheel suspension forces for each + wheel referenced by axleDescription. + \param[out] antiRollTorque is optionally returned as a non-null pointer to a single PxVehicleAntiRollTorque instance that will store the accumulated anti-roll + torque to be applied to the vheicle's rigid body. + \note antiRollForceParams and antiRollTorque should be returned either both non-NULL or both NULL. + */ + virtual void getDataForSuspensionComponent( + const PxVehicleAxleDescription*& axleDescription, + const PxVehicleRigidBodyParams*& rigidBodyParams, + const PxVehicleSuspensionStateCalculationParams*& suspensionStateCalculationParams, + PxVehicleArrayData& steerResponseStates, + const PxVehicleRigidBodyState*& rigidBodyState, + PxVehicleArrayData& wheelParams, + PxVehicleArrayData& suspensionParams, + PxVehicleArrayData& suspensionComplianceParams, + PxVehicleArrayData& suspensionForceParams, + PxVehicleSizedArrayData& antiRollForceParams, + PxVehicleArrayData& wheelRoadGeomStates, + PxVehicleArrayData& suspensionStates, + PxVehicleArrayData& suspensionComplianceStates, + PxVehicleArrayData& suspensionForces, + PxVehicleAntiRollTorque*& antiRollTorque) = 0; + + /** + \brief Update the suspension state and suspension compliance state and use those updated states to compute suspension and anti-roll forces/torques + to apply to the vehicle's rigid body. + \param[in] dt is the simulation time that has passed since the last call to PxVehicleSuspensionComponent::update() + \param[in] context describes a variety of global simulation constants such as frame and scale of the simulation and the gravitational acceleration + of the simulated environment. + \note The suspension and anti-roll forces/torques are computed in the world frame. + */ + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_PROFILE_ZONE("PxVehicleSuspensionComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + const PxVehicleRigidBodyParams* rigidBodyParams; + const PxVehicleSuspensionStateCalculationParams* suspensionStateCalculationParams; + PxVehicleArrayData steerResponseStates; + const PxVehicleRigidBodyState* rigidBodyState; + PxVehicleArrayData wheelParams; + PxVehicleArrayData suspensionParams; + PxVehicleArrayData suspensionComplianceParams; + PxVehicleArrayData suspensionForceParams; + PxVehicleSizedArrayData antiRollForceParams; + PxVehicleArrayData wheelRoadGeomStates; + PxVehicleArrayData suspensionStates; + PxVehicleArrayData suspensionComplianceStates; + PxVehicleArrayData suspensionForces; + PxVehicleAntiRollTorque* antiRollTorque; + + getDataForSuspensionComponent(axleDescription, rigidBodyParams, suspensionStateCalculationParams, + steerResponseStates, rigidBodyState, + wheelParams, suspensionParams, + suspensionComplianceParams, suspensionForceParams, antiRollForceParams, + wheelRoadGeomStates, suspensionStates, suspensionComplianceStates, + suspensionForces, antiRollTorque); + + for (PxU32 i = 0; i < axleDescription->nbWheels; i++) + { + const PxU32 wheelId = axleDescription->wheelIdsInAxleOrder[i]; + + //Update the suspension state (jounce, jounce speed) + PxVehicleSuspensionStateUpdate( + wheelParams[wheelId], suspensionParams[wheelId], *suspensionStateCalculationParams, + suspensionForceParams[wheelId].stiffness, suspensionForceParams[wheelId].damping, + steerResponseStates[wheelId], wheelRoadGeomStates[wheelId], + *rigidBodyState, + dt, context.frame, context.gravity, + suspensionStates[wheelId]); + + //Update the compliance from the suspension state. + PxVehicleSuspensionComplianceUpdate( + suspensionParams[wheelId], suspensionComplianceParams[wheelId], + suspensionStates[wheelId], + suspensionComplianceStates[wheelId]); + + //Compute the suspension force from the suspension and compliance states. + PxVehicleSuspensionForceUpdate( + suspensionParams[wheelId], suspensionForceParams[wheelId], + wheelRoadGeomStates[wheelId], suspensionStates[wheelId], + suspensionComplianceStates[wheelId], *rigidBodyState, + context.gravity, rigidBodyParams->mass, + suspensionForces[wheelId]); + } + + if (antiRollForceParams.size>0 && antiRollTorque) + { + PxVehicleAntiRollForceUpdate( + suspensionParams, antiRollForceParams, + suspensionStates.getConst(), suspensionComplianceStates.getConst(), *rigidBodyState, + *antiRollTorque); + } + + return true; + } +}; + +/** + * @deprecated + */ +class PX_DEPRECATED PxVehicleLegacySuspensionComponent : public PxVehicleComponent +{ +public: + + PxVehicleLegacySuspensionComponent() : PxVehicleComponent() {} + virtual ~PxVehicleLegacySuspensionComponent() {} + + /** + \brief Retrieve pointers to the parameter and state data required to compute the suspension state and the forces/torques that arise from the suspension state. + \param[out] axleDescription must be returned as a non-null pointer to a single PxVehicleAxleDescription instance that describes the wheels and axles + of the vehicle. + \param[out] suspensionStateCalculationParams must be returned as a non-null pointer to a single PxVehicleSuspensionStateCalculationParams instance + that describes the jounce computation type etc. + \param[out] steerResponseStates must be returned as a non-null pointer to a single PxVehicleSteerCommandResponseStates instance that describes the steer + state of the wheels. + \param[out] rigidBodyState must be returned as a non-null pointer to a single PxVehicleRigidBodyState instance that describes the pose and momentum of + the vehicle's rigid body. + \param[out] wheelParams must be set to a non-null pointer to an array of PxVehicleWheelParams containing per-wheel parameters for each wheel + referenced by axleDescription. + \param[out] suspensionParams must be set to a non-null pointer to an array of PxVehicleSuspensionParams containing per-wheel parameters for each + wheel referenced by axleDescription. + \param[out] suspensionComplianceParams must be set to a non-null pointer to an array of PxVehicleSuspensionComplianceParams containing per-wheel + parameters for each wheel referenced by axleDescription. + \param[out] suspensionForceParams must be set to a non-null pointer to an array of PxVehicleSuspensionForceLegacyParams containing per-wheel parameters + for each wheel referenced by axleDescription. + \param[out] antiRollForceParams is optionally returned as a non-null pointer to an array of PxVehicleAntiRollForceParams with each element in the array + describing a unique anti-roll bar connecting a pair of wheels. + \param[out] wheelRoadGeomStates must be set to non-null pointer to an array of PxVehicleRoadGeometryState containing per-wheel road geometry for + each wheel referenced by axleDescription. + \param[out] suspensionStates must be set to a non-null pointer to an array of PxVehicleSuspensionState containing per-wheel suspension state for each + wheel referenced by axleDescription. + \param[out] suspensionComplianceStates must be set to a non-null pointer to an array of PxVehicleSuspensionComplianceState containing per-wheel suspension + compliance state for each wheel referenced by axleDescription. + \param[out] suspensionForces must be set to a non-null pointer to an array of PxVehicleSuspensionForce containing per-wheel suspension forces for each + wheel referenced by axleDescription. + \param[out] antiRollTorque is optionally returned as a non-null pointer to a single PxVehicleAntiRollTorque instance that will store the accumulated anti-roll + torque to be applied to the vheicle's rigid body. + \note antiRollForceParams and antiRollTorque should be returned either both non-NULL or both NULL. + */ + virtual void getDataForLegacySuspensionComponent( + const PxVehicleAxleDescription*& axleDescription, + const PxVehicleSuspensionStateCalculationParams*& suspensionStateCalculationParams, + PxVehicleArrayData& steerResponseStates, + const PxVehicleRigidBodyState*& rigidBodyState, + PxVehicleArrayData& wheelParams, + PxVehicleArrayData& suspensionParams, + PxVehicleArrayData& suspensionComplianceParams, + PxVehicleArrayData& suspensionForceParams, + PxVehicleSizedArrayData& antiRollForceParams, + PxVehicleArrayData& wheelRoadGeomStates, + PxVehicleArrayData& suspensionStates, + PxVehicleArrayData& suspensionComplianceStates, + PxVehicleArrayData& suspensionForces, + PxVehicleAntiRollTorque*& antiRollTorque) = 0; + + /** + \brief Update the suspension state and suspension compliance state and use those updated states to compute suspension and anti-roll forces/torques + to apply to the vehicle's rigid body. + \param[in] dt is the simulation time that has passed since the last call to PxVehicleSuspensionComponent::update() + \param[in] context describes a variety of global simulation constants such as frame and scale of the simulation and the gravitational acceleration + of the simulated environment. + \note The suspension and anti-roll forces are computed in the world frame. + \note PxVehicleLegacySuspensionComponent::update() implements legacy suspension behaviour. + */ + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_PROFILE_ZONE("PxVehicleLegacySuspensionComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + const PxVehicleSuspensionStateCalculationParams* suspensionStateCalculationParams; + PxVehicleArrayData steerResponseStates; + const PxVehicleRigidBodyState* rigidBodyState; + PxVehicleArrayData wheelParams; + PxVehicleArrayData suspensionParams; + PxVehicleArrayData suspensionComplianceParams; + PxVehicleArrayData suspensionForceParams; + PxVehicleSizedArrayData antiRollForceParams; + PxVehicleArrayData wheelRoadGeomStates; + PxVehicleArrayData suspensionStates; + PxVehicleArrayData suspensionComplianceStates; + PxVehicleArrayData suspensionForces; + PxVehicleAntiRollTorque* antiRollTorque; + + getDataForLegacySuspensionComponent(axleDescription, suspensionStateCalculationParams, + steerResponseStates, rigidBodyState, wheelParams, + suspensionParams, suspensionComplianceParams, + suspensionForceParams, antiRollForceParams, + wheelRoadGeomStates, suspensionStates, suspensionComplianceStates, + suspensionForces, antiRollTorque); + + for (PxU32 i = 0; i < axleDescription->nbWheels; i++) + { + const PxU32 wheelId = axleDescription->wheelIdsInAxleOrder[i]; + + //Update the suspension state (jounce, jounce speed) + PxVehicleSuspensionStateUpdate( + wheelParams[wheelId], suspensionParams[wheelId], *suspensionStateCalculationParams, + suspensionForceParams[wheelId].stiffness, suspensionForceParams[wheelId].damping, + steerResponseStates[wheelId], wheelRoadGeomStates[wheelId], *rigidBodyState, + dt, context.frame, context.gravity, + suspensionStates[wheelId]); + + //Update the compliance from the suspension state. + PxVehicleSuspensionComplianceUpdate( + suspensionParams[wheelId], suspensionComplianceParams[wheelId], + suspensionStates[wheelId], + suspensionComplianceStates[wheelId]); + + //Compute the suspension force from the suspension and compliance states. + PxVehicleSuspensionLegacyForceUpdate( + suspensionParams[wheelId], suspensionForceParams[wheelId], + wheelRoadGeomStates[wheelId], suspensionStates[wheelId], + suspensionComplianceStates[wheelId], *rigidBodyState, + context.gravity, + suspensionForces[wheelId]); + } + + if (antiRollForceParams.size>0 && antiRollTorque) + { + PxVehicleAntiRollForceUpdate( + suspensionParams, antiRollForceParams, + suspensionStates.getConst(), suspensionComplianceStates.getConst(), *rigidBodyState, + *antiRollTorque); + } + + return true; + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/suspension/PxVehicleSuspensionFunctions.h b/Source/ThirdParty/PhysX/vehicle2/suspension/PxVehicleSuspensionFunctions.h new file mode 100644 index 000000000..5e63350af --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/suspension/PxVehicleSuspensionFunctions.h @@ -0,0 +1,166 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxVec3.h" +#include "foundation/PxSimpleTypes.h" +#include "vehicle2/PxVehicleParams.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +struct PxVehicleWheelParams; +struct PxVehicleSuspensionParams; +struct PxVehicleSuspensionStateCalculationParams; +struct PxVehicleRoadGeometryState; +struct PxVehicleRigidBodyState; +struct PxVehicleSuspensionState; +struct PxVehicleSuspensionComplianceParams; +struct PxVehicleSuspensionComplianceState; +struct PxVehicleSuspensionForceParams; +struct PxVehicleSuspensionForce; +struct PxVehicleSuspensionForceLegacyParams; +struct PxVehicleAntiRollForceParams; +struct PxVehicleAntiRollTorque; + +/** +\brief Compute the suspension compression and compression speed for a single suspension. +\param[in] wheelParams is a description of the radius and half-width of the wheel on the suspension. +\param[in] suspensionParams is a description of the suspension and wheel frames. +\param[in] suspensionStateCalcParams specifies whether to compute the suspension compression by either +raycasting or sweeping against the plane of the road geometry under the wheel. +\param[in] suspensionStiffness is the stiffness of the suspension +\param[in] suspensionDamping is the damping rate of the suspension. +or whether to apply a limit to the expansion speed so that the wheel may not reach the ground. +\param[in] steerAngle is the yaw angle (in radians) of the wheel. +\param[in] roadGeometryState describes the plane under the wheel. +\param[in] rigidBodyState describes the pose of the rigid body. +\param[in] dt is the simulation time that has lapsed since the last call to PxVehicleSuspensionStateUpdate +\param[in] frame describes the longitudinal, lateral and vertical axes of the vehicle. +\param[in] gravity is the gravitational acceleration that acts on the suspension sprung mass. +\param[in,out] suspState is the compression (jounce) and compression speed of the suspension. +*/ +void PxVehicleSuspensionStateUpdate +(const PxVehicleWheelParams& wheelParams, const PxVehicleSuspensionParams& suspensionParams, const PxVehicleSuspensionStateCalculationParams& suspensionStateCalcParams, + const PxReal suspensionStiffness, const PxReal suspensionDamping, + const PxReal steerAngle, const PxVehicleRoadGeometryState& roadGeometryState, const PxVehicleRigidBodyState& rigidBodyState, + const PxReal dt, const PxVehicleFrame& frame, const PxVec3& gravity, + PxVehicleSuspensionState& suspState); + +/** +\brief Compute the toe, camber and force application points that are affected by suspension compression. +\param[in] suspensionParams is a description of the suspension and wheel frames. +\param[in] complianceParams describes how toe, camber and force application points are affected by suspension compression. +\param[in] suspensionState describes the current suspension compression. +\param[in] complianceState is the computed toe, camber and force application points. +*/ +void PxVehicleSuspensionComplianceUpdate +(const PxVehicleSuspensionParams& suspensionParams, + const PxVehicleSuspensionComplianceParams& complianceParams, + const PxVehicleSuspensionState& suspensionState, + PxVehicleSuspensionComplianceState& complianceState); + +/** +\brief Compute the suspension force and torque arising from suspension compression and speed. +\param[in] suspensionParams is a description of the suspension and wheel frames. +\param[in] suspensionForceParams describes the conversion of suspension state to suspension force. +\param[in] roadGeometryState describes the plane under the wheel of the suspension. +\param[in] suspensionState is the current compression state of the suspension. +\param[in] complianceState is the current compliance state of the suspension. +\param[in] rigidBodyState describes the current pose of the rigid body. +\param[in] gravity is the gravitational acceleration. +\param[in] vehicleMass is the rigid body mass. +\param[out] suspensionForce is the force and torque to apply to the rigid body arising from the suspension state. +*/ +void PxVehicleSuspensionForceUpdate +(const PxVehicleSuspensionParams& suspensionParams, + const PxVehicleSuspensionForceParams& suspensionForceParams, + const PxVehicleRoadGeometryState& roadGeometryState, const PxVehicleSuspensionState& suspensionState, + const PxVehicleSuspensionComplianceState& complianceState, const PxVehicleRigidBodyState& rigidBodyState, + const PxVec3& gravity, const PxReal vehicleMass, + PxVehicleSuspensionForce& suspensionForce); + + +/** +\brief Compute the suspension force and torque arising from suspension compression and speed. +\param[in] suspensionParams is a description of the suspension and wheel frames. +\param[in] suspensionForceParams describes the conversion of suspension state to suspension force. +\param[in] roadGeometryState describes the plane under the wheel of the suspension. +\param[in] suspensionState is the current compression state of the suspension. +\param[in] complianceState is the current compliance state of the suspension. +\param[in] rigidBodyState describes the current pose of the rigid body. +\param[in] gravity is the gravitational acceleration. +\param[out] suspensionForce is the force and torque to apply to the rigid body arising from the suspension state. +\note PxVehicleSuspensionLegacyForceUpdate implements the legacy force computation of PhysX 5.0 and earlier. +@deprecated +*/ +PX_DEPRECATED void PxVehicleSuspensionLegacyForceUpdate +(const PxVehicleSuspensionParams& suspensionParams, + const PxVehicleSuspensionForceLegacyParams& suspensionForceParams, + const PxVehicleRoadGeometryState& roadGeometryState, const PxVehicleSuspensionState& suspensionState, + const PxVehicleSuspensionComplianceState& complianceState, const PxVehicleRigidBodyState& rigidBodyState, + const PxVec3& gravity, + PxVehicleSuspensionForce& suspensionForce); + +/** +\brief Compute the accumulated anti-roll torque to apply to the vehicle's rigid body. +\param[in] suspensionParams The suspension parameters for each wheel. +\param[in] antiRollParams describes the wheel pairs connected by anti-roll bars and the strength of each anti-roll bar. +\param[in] suspensionStates The suspension states for each wheel. +\param[in] complianceStates The suspension compliance states for each wheel. +\param[in] rigidBodyState describes the pose and momentum of the vehicle's rigid body in the world frame. +\param[in] antiRollTorque is the accumulated anti-roll torque that is computed by iterating over all anti-roll bars +describes in *antiRollParams*. +\note suspensionParams must contain an entry for each wheel index referenced by *antiRollParams*. +\note suspensionStates must contain an entry for each wheel index referenced by *antiRollParams*. +\note complianceStates must contain an entry for each wheel index referenced by *antiRollParams*. +\note antiRollTorque is expressed in the world frame. +*/ +void PxVehicleAntiRollForceUpdate +(const PxVehicleArrayData& suspensionParams, + const PxVehicleSizedArrayData& antiRollParams, + const PxVehicleArrayData& suspensionStates, + const PxVehicleArrayData& complianceStates, + const PxVehicleRigidBodyState& rigidBodyState, + PxVehicleAntiRollTorque& antiRollTorque); + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/suspension/PxVehicleSuspensionHelpers.h b/Source/ThirdParty/PhysX/vehicle2/suspension/PxVehicleSuspensionHelpers.h new file mode 100644 index 000000000..648e73959 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/suspension/PxVehicleSuspensionHelpers.h @@ -0,0 +1,154 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ + + */ +#include "foundation/PxTransform.h" + +#include "vehicle2/wheel/PxVehicleWheelParams.h" +#include "vehicle2/wheel/PxVehicleWheelHelpers.h" + +#include "PxVehicleSuspensionParams.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +/** +\brief Compute suspension travel direction in the world frame. +\param[in] suspensionParams is a description of the suspension frame. +\param[in] rigidBodyPose is the current pose of the vehicle's rigid body. +\return The return value is the suspension travel direction in the world frame. +\note The suspension travel direction is used to perform queries against the road geometry. +*/ +PX_FORCE_INLINE PxVec3 PxVehicleComputeSuspensionDirection(const PxVehicleSuspensionParams& suspensionParams, const PxTransform& rigidBodyPose) +{ + const PxVec3 suspDir = rigidBodyPose.rotate(suspensionParams.suspensionTravelDir); + return suspDir; +} + +/** +\brief Compute the start pose of a suspension query. +\param[in] frame is a description of the longitudinal, lateral and vertical axes. +\param[in] suspensionParams is a description of the suspension frame. +\param[in] steerAngle is the yaw angle of the wheel in radians. +\param[in] rigidBodyPose is the pose of the rigid body in the world frame. +*/ +PX_FORCE_INLINE PxTransform PxVehicleComputeWheelPoseForSuspensionQuery(const PxVehicleFrame& frame, const PxVehicleSuspensionParams& suspensionParams, + const PxReal steerAngle, const PxTransform& rigidBodyPose) +{ + //Compute the wheel pose with zero travel from attachment point, zero compliance, + //zero wheel pitch (ignore due to radial symmetry). + //Zero travel from attachment point (we want the wheel pose at the top of the suspension, i.e., at max compression) + PxVehicleSuspensionState suspState; + suspState.setToDefault(); + //Compute the wheel pose. + const PxTransform wheelPose = PxVehicleComputeWheelPose(frame, suspensionParams, suspState, 0.0f, 0.0f, steerAngle, rigidBodyPose, + 0.0f); + + return wheelPose; +} + +/** +\brief Compute the start point, direction and length of a suspension scene raycast. +\param[in] frame is a description of the longitudinal, lateral and vertical axes. +\param[in] wheelParams describes the radius and halfwidth of the wheel. +\param[in] suspensionParams describes the suspension frame and the maximum suspension travel. +\param[in] steerAngle is the yaw angle of the wheel in radians. +\param[in] rigidBodyPose is the pose of the rigid body in the world frame. +\param[out] start is the starting point of the raycast in the world frame. +\param[out] dir is the direction of the raycast in the world frame. +\param[out] dist is the length of the raycast. +\note start, dir and dist together describe a raycast that begins at the top of wheel at maximum compression +and ends at the bottom of wheel at maximum droop. +*/ +PX_FORCE_INLINE void PxVehicleComputeSuspensionRaycast +(const PxVehicleFrame& frame, const PxVehicleWheelParams& wheelParams, const PxVehicleSuspensionParams& suspensionParams, + const PxF32 steerAngle, const PxTransform& rigidBodyPose, + PxVec3& start, PxVec3& dir, PxReal& dist) +{ + const PxTransform wheelPose = PxVehicleComputeWheelPoseForSuspensionQuery(frame, suspensionParams, steerAngle, rigidBodyPose); + + //Raycast from top of wheel at max compression to bottom of wheel at max droop. + dir = PxVehicleComputeSuspensionDirection(suspensionParams, rigidBodyPose); + start = wheelPose.p - dir * wheelParams.radius; + dist = suspensionParams.suspensionTravelDist + 2.0f*wheelParams.radius; +} + +/** +\brief Compute the start pose, direction and length of a suspension scene sweep. +\param[in] frame is a description of the longitudinal, lateral and vertical axes. +\param[in] suspensionParams describes the suspension frame and the maximum suspension travel. +\param[in] steerAngle is the yaw angle of the wheel in radians. +\param[in] rigidBodyPose is the pose of the rigid body in the world frame. +\param[out] start is the start pose of the sweep in the world frame. +\param[out] dir is the direction of the sweep in the world frame. +\param[out] dist is the length of the sweep. +\note start, dir and dist together describe a sweep that begins with the wheel placed at maximum +compression and ends at the maximum droop pose. +*/ +PX_FORCE_INLINE void PxVehicleComputeSuspensionSweep +(const PxVehicleFrame& frame, const PxVehicleSuspensionParams& suspensionParams, + const PxReal steerAngle, const PxTransform& rigidBodyPose, + PxTransform& start, PxVec3& dir, PxReal& dist) +{ + start = PxVehicleComputeWheelPoseForSuspensionQuery(frame, suspensionParams, steerAngle, rigidBodyPose); + dir = PxVehicleComputeSuspensionDirection(suspensionParams, rigidBodyPose); + dist = suspensionParams.suspensionTravelDist; +} + + +/** +\brief Compute the sprung masses of the suspension springs given (i) the number of sprung masses, +(ii) coordinates of the sprung masses in the rigid body frame, (iii) the center of mass offset of the rigid body, (iv) the +total mass of the rigid body, and (v) the direction of gravity +\param[in] nbSprungMasses is the number of sprung masses of the vehicle. This value corresponds to the number of wheels on the vehicle. +\param[in] sprungMassCoordinates are the coordinates of the sprung masses in the rigid body frame. The array sprungMassCoordinates must be of +length nbSprungMasses or greater. +\param[in] totalMass is the total mass of all the sprung masses. +\param[in] gravityDirection describes the direction of gravitational acceleration. +\param[out] sprungMasses are the masses to set in the associated suspension data with PxVehicleSuspensionData::mSprungMass. The sprungMasses array must be of length +nbSprungMasses or greater. Each element in the sprungMasses array corresponds to the suspension located at the same array element in sprungMassCoordinates. +The center of mass of the masses in sprungMasses with the coordinates in sprungMassCoordinates satisfy the specified centerOfMass. +\return True if the sprung masses were successfully computed, false if the sprung masses were not successfully computed. +*/ +bool PxVehicleComputeSprungMasses(const PxU32 nbSprungMasses, const PxVec3* sprungMassCoordinates, const PxReal totalMass, const PxVehicleAxes::Enum gravityDirection, PxReal* sprungMasses); + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/suspension/PxVehicleSuspensionParams.h b/Source/ThirdParty/PhysX/vehicle2/suspension/PxVehicleSuspensionParams.h new file mode 100644 index 000000000..a58a8d7cf --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/suspension/PxVehicleSuspensionParams.h @@ -0,0 +1,414 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once +/** \addtogroup vehicle2 + @{ +*/ + + +#include "foundation/PxTransform.h" +#include "foundation/PxFoundation.h" + +#include "common/PxCoreUtilityTypes.h" + +#include "vehicle2/PxVehicleParams.h" +#include "vehicle2/PxVehicleFunctions.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +struct PxVehicleSuspensionParams +{ + /** + \brief suspensionAttachment specifies the wheel pose at maximum compression. + \note suspensionAttachment is specified in the frame of the rigid body. + \note camber, steer and toe angles are all applied in the suspension frame. + */ + PxTransform suspensionAttachment; + + /** + \brief suspensionTravelDir specifies the direction of suspension travel. + \note suspensionTravelDir is specified in the frame of the rigid body. + */ + PxVec3 suspensionTravelDir; + + /** + \brief suspensionTravelDist is the maximum distance that the suspenson can elongate along #suspensionTravelDir + from the pose specified by #suspensionAttachment. + \note The position suspensionAttachment.p + #suspensionTravelDir*#suspensionTravelDist corresponds to the + the suspension at maximum droop in the rigid body frame. + */ + PxReal suspensionTravelDist; + + /** + \brief wheelAttachment is the pose of the wheel in the suspension frame. + \note The rotation angle around the wheel's lateral axis is applied in the wheel attachment frame. + */ + PxTransform wheelAttachment; + + + PX_FORCE_INLINE PxVehicleSuspensionParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PxVehicleSuspensionParams r = *this; + r.suspensionAttachment= PxVehicleTransformFrameToFrame(srcFrame, trgFrame, srcScale, trgScale, suspensionAttachment); + r.suspensionTravelDir = PxVehicleTransformFrameToFrame(srcFrame, trgFrame, suspensionTravelDir); + r.suspensionTravelDist *= (trgScale.scale/srcScale.scale); + r.wheelAttachment = PxVehicleTransformFrameToFrame(srcFrame, trgFrame, srcScale, trgScale, wheelAttachment); + return r; + } + + PX_FORCE_INLINE bool isValid() const + { + PX_CHECK_AND_RETURN_VAL(suspensionAttachment.isValid(), "PxVehicleSuspensionParams.suspensionAttachment must be a valid transform", false); + PX_CHECK_AND_RETURN_VAL(suspensionTravelDir.isFinite(), "PxVehicleSuspensionParams.suspensionTravelDir must be a valid vector", false); + PX_CHECK_AND_RETURN_VAL(suspensionTravelDir.isNormalized(), "PxVehicleSuspensionParams.suspensionTravelDir must be a unit vector", false); + PX_CHECK_AND_RETURN_VAL(suspensionTravelDist > 0.0f, "PxVehicleSuspensionParams.suspensionTravelDist must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(wheelAttachment.isValid(), "PxVehicleSuspensionParams.wheelAttachment must be a valid transform", false); + return true; + } +}; + +struct PxVehicleSuspensionJounceCalculationType +{ + enum Enum + { + eRAYCAST, //!< The jounce is calculated using a raycast against the plane of the road geometry state + eSWEEP, //!< The jounce is calculated by sweeping a cylinder against the plane of the road geometry state + eMAX_NB + }; +}; + +struct PxVehicleSuspensionStateCalculationParams +{ + PxVehicleSuspensionJounceCalculationType::Enum suspensionJounceCalculationType; + + /** + \brief Limit the suspension expansion dynamics. + + If a hit with the ground is detected, the suspension jounce will be set such that the wheel + is placed on the ground. This can result in large changes to jounce within a single + simulation frame, if the ground surface has high frequency or if the simulation time step + is large. As a result, large damping forces can evolve and cause undesired behavior. If this + parameter is set to true, the suspension expansion speed will be limited to what can be + achieved given the time step, suspension stiffness etc. As a consequence, handling of the + vehicle will be affected as the wheel might loose contact with the ground more easily. + */ + bool limitSuspensionExpansionVelocity; + + PX_FORCE_INLINE PxVehicleSuspensionStateCalculationParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PX_UNUSED(srcScale); + PX_UNUSED(trgScale); + return *this; + } + + PX_FORCE_INLINE bool isValid() const + { + return true; + } +}; + +/** +\brief Compliance describes how toe and camber angle and force application points are affected by suspension compression. +\note Each compliance term is in the form of a graph with up to 3 points. +\note Each point in the graph has form (jounce/suspensionTravelDist, complianceValue). +\note The sequence of points must respresent monotonically increasing values of jounce. +\note The compliance value can be computed by linear interpolation. +\note If any graph has zero points in it, a value of 0.0 is used for the compliance value. +\note If any graph has 1 point in it, the compliance value of that point is used directly. +*/ +struct PxVehicleSuspensionComplianceParams +{ + /** + \brief A graph of toe angle against jounce/suspensionTravelDist with the toe angle expressed in radians. + \note The toe angle is applied in the suspension frame. + */ + PxVehicleFixedSizeLookupTable wheelToeAngle; + + /** + \brief A graph of camber angle against jounce/suspensionTravelDist with the camber angle expressed in radians. + \note The camber angle is applied in the suspension frame. + */ + PxVehicleFixedSizeLookupTable wheelCamberAngle; + + /** + \brief Suspension forces are applied at an offset from the suspension frame. suspForceAppPoint + specifies the (X, Y, Z) components of that offset as a function of jounce/suspensionTravelDist. + */ + PxVehicleFixedSizeLookupTable suspForceAppPoint; + + /** + \brief Tire forces are applied at an offset from the suspension frame. tireForceAppPoint + specifies the (X, Y, Z) components of that offset as a function of jounce/suspensionTravelDist. + */ + PxVehicleFixedSizeLookupTable tireForceAppPoint; + + PX_FORCE_INLINE PxVehicleSuspensionComplianceParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PxVehicleSuspensionComplianceParams r = *this; + + const PxReal scale = trgScale.scale / srcScale.scale; + for (PxU32 i = 0; i < r.suspForceAppPoint.nbDataPairs; i++) + { + r.suspForceAppPoint.yVals[i] = PxVehicleTransformFrameToFrame(srcFrame, trgFrame, suspForceAppPoint.yVals[i]); + r.suspForceAppPoint.yVals[i] *= scale; + } + for (PxU32 i = 0; i < r.tireForceAppPoint.nbDataPairs; i++) + { + r.tireForceAppPoint.yVals[i] = PxVehicleTransformFrameToFrame(srcFrame, trgFrame, tireForceAppPoint.yVals[i]); + r.tireForceAppPoint.yVals[i] *= scale; + } + return r; + } + + PX_FORCE_INLINE bool isValid() const + { + PX_CHECK_AND_RETURN_VAL(wheelToeAngle.isValid(), "PxVehicleSuspensionComplianceParams.wheelToeAngle is invalid", false); + PX_CHECK_AND_RETURN_VAL(wheelCamberAngle.isValid(), "PxVehicleSuspensionComplianceParams.wheelCamberAngle is invalid", false); + PX_CHECK_AND_RETURN_VAL(suspForceAppPoint.isValid(), "PxVehicleSuspensionComplianceParams.wheelToeAngle is invalid", false); + PX_CHECK_AND_RETURN_VAL(tireForceAppPoint.isValid(), "PxVehicleSuspensionComplianceParams.wheelCamberAngle is invalid", false); + + for (PxU32 i = 0; i < wheelToeAngle.nbDataPairs; i++) + { + PX_CHECK_AND_RETURN_VAL(wheelToeAngle.xVals[i] >= 0.0f && wheelToeAngle.xVals[i] <= 1.0f, "PxVehicleSuspensionComplianceParams.wheelToeAngle must be an array of points (x,y) with x in range [0, 1]", false); + PX_CHECK_AND_RETURN_VAL(wheelToeAngle.yVals[i] >= -PxPi && wheelToeAngle.yVals[i] <= PxPi, "PxVehicleSuspensionComplianceParams.wheelToeAngle must be an array of points (x,y) with y in range [-Pi, Pi]", false); + } + for (PxU32 i = 0; i < wheelCamberAngle.nbDataPairs; i++) + { + PX_CHECK_AND_RETURN_VAL(wheelCamberAngle.xVals[i] >= 0.0f && wheelCamberAngle.xVals[i] <= 1.0f, "PxVehicleSuspensionComplianceParams.wheelCamberAngle must be an array of points (x,y) with x in range [0, 1]", false); + PX_CHECK_AND_RETURN_VAL(wheelCamberAngle.yVals[i] >= -PxPi && wheelCamberAngle.yVals[i] <= PxPi, "PxVehicleSuspensionComplianceParams.wheelCamberAngle must be an array of points (x,y) with y in range [-Pi, Pi]", false); + } + + for (PxU32 i = 0; i < suspForceAppPoint.nbDataPairs; i++) + { + PX_CHECK_AND_RETURN_VAL(suspForceAppPoint.xVals[i] >= 0.0f && suspForceAppPoint.xVals[i] <= 1.0f, "PxVehicleSuspensionComplianceParams.suspForceAppPoint[0] must be an array of points (x,y) with x in range [0, 1]", false); + } + for (PxU32 i = 0; i < tireForceAppPoint.nbDataPairs; i++) + { + PX_CHECK_AND_RETURN_VAL(tireForceAppPoint.xVals[i] >= 0.0f && tireForceAppPoint.xVals[i] <= 1.0f, "PxVehicleSuspensionComplianceParams.tireForceAppPoint[0] must be an array of points (x,y) with x in range [0, 1]", false); + } + return true; + } +}; + +/** +\brief Suspension force is computed by converting suspenson state to suspension force under the assumption of a linear spring. +@see PxVehicleSuspensionForceUpdate +*/ +struct PxVehicleSuspensionForceParams +{ + /** + \brief Spring strength of suspension. + + Range: (0, inf)
+ Unit: mass / (time^2) + */ + PxReal stiffness; + + /** + \brief Spring damper rate of suspension. + + Range: [0, inf)
+ Unit: mass / time + */ + PxReal damping; + + /** + \brief Part of the vehicle mass that is supported by the suspension spring. + + Range: (0, inf)
+ Unit: mass + */ + PxReal sprungMass; + + PX_FORCE_INLINE PxVehicleSuspensionForceParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PX_UNUSED(srcScale); + PX_UNUSED(trgScale); + return *this; + } + + PX_FORCE_INLINE bool isValid() const + { + PX_CHECK_AND_RETURN_VAL(stiffness > 0.0f, "PxVehicleSuspensionForceParams.stiffness must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(damping >= 0.0f, "PxVehicleSuspensionForceParams.damping must be greater than or equal to zero", false); + PX_CHECK_AND_RETURN_VAL(sprungMass > 0.0f, "PxVehicleSuspensionForceParams.sprungMass must be greater than zero", false); + return true; + } +}; + +/** +\brief Suspension force is computed by converting suspenson state to suspension force under the assumption of a linear spring. +@see PxVehicleSuspensionLegacyForceUpdate +@deprecated +*/ +struct PX_DEPRECATED PxVehicleSuspensionForceLegacyParams +{ + /** + \brief Spring strength of suspension. + + Range: (0, inf)
+ Unit: mass / (time^2) + */ + PxReal stiffness; + + /** + \brief Spring damper rate of suspension. + + Range: [0, inf)
+ Unit: mass / time + */ + PxReal damping; + + /** + \brief The suspension compression that balances the gravitational force acting on the sprung mass. + + Range: (0, inf)
+ Unit: length + */ + PxReal restDistance; + + /** + \brief The mass supported by the suspension spring. + + Range: (0, inf)
+ Unit: mass + */ + PxReal sprungMass; + + PX_FORCE_INLINE PxVehicleSuspensionForceLegacyParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PxVehicleSuspensionForceLegacyParams r = *this; + r.restDistance *= (trgScale.scale / srcScale.scale); + return *this; + } + + PX_FORCE_INLINE bool isValid() const + { + PX_CHECK_AND_RETURN_VAL(stiffness > 0.0f, "PxVehicleSuspensionForceLegacyParams.stiffness must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(damping >= 0.0f, "PxVehicleSuspensionForceLegacyParams.damping must be greater than or equal to zero", false); + PX_CHECK_AND_RETURN_VAL(restDistance > 0.0f, "PxVehicleSuspensionForceLegacyParams.restDistance must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(sprungMass > 0.0f, "PxVehicleSuspensionForceLegacyParams.sprungMass must be greater than zero", false); + return true; + } + +}; + +/** +\brief The purpose of the anti-roll bar is to generate a torque to apply to the vehicle's rigid body that will reduce the jounce difference arising +between any pair of chosen wheels. If the chosen wheels share an axle, the anti-roll bar will attempt to reduce the roll angle of the vehicle's rigid body. +Alternatively, if the chosen wheels are the front and rear wheels along one side of the vehicle, the anti-roll bar will attempt to reduce the pitch angle of the +vehicle's rigid body. +*/ +struct PxVehicleAntiRollForceParams +{ + /* + \brief The anti-roll bar connects two wheels with indices wheel0 and wheel1 + \note wheel0 and wheel1 may be chosen to have the effect of an anti-dive bar or to have the effect of an anti-roll bar. + */ + PxU32 wheel0; + + /* + \brief The anti-roll bar connects two wheels with indices wheel0 and wheel1 + \note wheel0 and wheel1 may be chosen to have the effect of an anti-dive bar or to have the effect of an anti-roll bar. + */ + PxU32 wheel1; + + /* + \brief The linear stiffness of the anti-roll bar. + \note A positive stiffness will work to reduce the discrepancy in jounce between wheel0 and wheel1. + \note A negative stiffness will work to increase the discrepancy in jounce between wheel0 and wheel1. + + Unit: mass / (time^2) + */ + PxReal stiffness; + + PX_FORCE_INLINE PxVehicleAntiRollForceParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PX_UNUSED(srcScale); + PX_UNUSED(trgScale); + return *this; + } + + PX_FORCE_INLINE bool isValid(const PxVehicleAxleDescription& axleDesc) const + { + if (!PxIsFinite(stiffness)) + return false; + if (wheel0 == wheel1) + return false; + + //Check that each wheel id is a valid wheel. + const PxU32 wheelIds[2] = { wheel0, wheel1 }; + for (PxU32 k = 0; k < 2; k++) + { + const PxU32 wheelToFind = wheelIds[k]; + bool foundWheelInAxleDescription = false; + for (PxU32 i = 0; i < axleDesc.nbWheels; i++) + { + const PxU32 wheel = axleDesc.wheelIdsInAxleOrder[i]; + if (wheel == wheelToFind) + { + foundWheelInAxleDescription = true; + } + } + if (!foundWheelInAxleDescription) + return false; + } + + return true; + } +}; + + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/suspension/PxVehicleSuspensionStates.h b/Source/ThirdParty/PhysX/vehicle2/suspension/PxVehicleSuspensionStates.h new file mode 100644 index 000000000..af916c86b --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/suspension/PxVehicleSuspensionStates.h @@ -0,0 +1,189 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxSimpleTypes.h" +#include "foundation/PxVec3.h" +#include "foundation/PxMemory.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +#define PX_VEHICLE_UNSPECIFIED_JOUNCE PX_MAX_F32 +#define PX_VEHICLE_UNSPECIFIED_SEPARATION PX_MAX_F32 + +/** + +*/ +struct PxVehicleSuspensionState +{ + /** + \brief jounce is the distance from maximum droop. + \note jounce is positive semi-definite + \note A value of 0.0 represents the suspension at maximum droop and zero suspension force. + \note A value of suspensionTravelDist represents the suspension at maximum compression. + \note jounce is clamped in range [0, suspensionTravelDist]. + */ + PxReal jounce; + + /** + \brief jounceSpeed is the rate of change of jounce. + */ + PxReal jounceSpeed; + + /** + \brief separation holds extra information about the contact state of the wheel with the ground. + + If the suspension travel range is enough to place the wheel on the ground, then separation will be 0. + If separation holds a negative value, then the wheel penetrates into the ground at maximum compression + as well as maximum droop. The suspension would need to go beyond maximum compression (ground normal + pointing in opposite direction of suspension) or beyond maximum droop (ground normal pointing in same + direction as suspension) to place the wheel on the ground. In that case the separation value defines + how much the wheel penetrates into the ground along the ground plane normal. This penetration may be + resolved by using a constraint that simulates the effect of a bump stop. + If separation holds a positive value, then the wheel does not penetrate the ground at maximum droop + but can not touch the ground because the suspension would need to expand beyond max droop to reach it + or because the suspension could not expand fast enough to reach the ground. + */ + PxReal separation; + + PX_FORCE_INLINE void setToDefault(const PxReal _jounce = PX_VEHICLE_UNSPECIFIED_JOUNCE, + const PxReal _separation = PX_VEHICLE_UNSPECIFIED_SEPARATION) + { + jounce = _jounce; + jounceSpeed = 0; + separation = _separation; + } +}; + +/** +\brief The effect of suspension compliance on toe and camber angle and on the tire and suspension force application points. +*/ +struct PxVehicleSuspensionComplianceState +{ + /** + \brief The toe angle in radians that arises from suspension compliance. + \note toe is expressed in the suspension frame. + */ + PxReal toe; + + /** + \brief The camber angle in radians that arises from suspension compliance. + \note camber is expressed in the suspension frame. + */ + PxReal camber; + + /** + \brief The tire force application point that arises from suspension compliance. + \note tireForceAppPoint is expressed in the suspension frame. + */ + PxVec3 tireForceAppPoint; + + /** + \brief The suspension force application point that arises from suspension compliance. + \note suspForceAppPoint is expressed in the suspension frame. + */ + PxVec3 suspForceAppPoint; + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleSuspensionComplianceState)); + } +}; + +/** +\brief The force and torque for a single suspension to apply to the vehicle's rigid body. +*/ +struct PxVehicleSuspensionForce +{ + /** + \brief The force to apply to the rigid body. + \note force is expressed in the world frame. + + Unit: mass * length / (time^2) + */ + PxVec3 force; + + /** + \brief The torque to apply to the rigid body. + \note torque is expressed in the world frame. + + Unit: mass * (length^2) / (time^2) + */ + PxVec3 torque; + + /** + \brief The component of force that lies along the normal of the plane under the wheel. + \note normalForce may be used by the tire model as the tire load. + + Unit: mass * length / (time^2) + */ + PxReal normalForce; + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleSuspensionForce)); + } +}; + +/** +\brief The anti-roll torque of all anti-roll bars accumulates in a single torque to apply +to the vehicle's rigid body. +*/ +struct PxVehicleAntiRollTorque +{ + /** + \brief The accumulated torque to apply to the rigid body. + \note antiRollTorque is expressed in the world frame. + + Unit: mass * (length^2) / (time^2) + */ + PxVec3 antiRollTorque; + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleAntiRollTorque)); + } +}; + + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/tire/PxVehicleTireComponents.h b/Source/ThirdParty/PhysX/vehicle2/tire/PxVehicleTireComponents.h new file mode 100644 index 000000000..32b1f1f74 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/tire/PxVehicleTireComponents.h @@ -0,0 +1,333 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ +#include "vehicle2/PxVehicleParams.h" +#include "vehicle2/PxVehicleComponent.h" + +#include "vehicle2/commands/PxVehicleCommandHelpers.h" +#include "vehicle2/roadGeometry/PxVehicleRoadGeometryState.h" +#include "vehicle2/suspension/PxVehicleSuspensionParams.h" +#include "vehicle2/suspension/PxVehicleSuspensionStates.h" +#include "vehicle2/wheel/PxVehicleWheelStates.h" +#include "vehicle2/wheel/PxVehicleWheelParams.h" + +#include "PxVehicleTireFunctions.h" +#include "PxVehicleTireParams.h" + +#include "common/PxProfileZone.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +class PxVehicleTireComponent : public PxVehicleComponent +{ +public: + + PxVehicleTireComponent() : PxVehicleComponent() {} + virtual ~PxVehicleTireComponent() {} + + virtual void getDataForTireComponent( + const PxVehicleAxleDescription*& axleDescription, + PxVehicleArrayData& steerResponseStates, + const PxVehicleRigidBodyState*& rigidBodyState, + PxVehicleArrayData& actuationStates, + PxVehicleArrayData& wheelParams, + PxVehicleArrayData& suspensionParams, + PxVehicleArrayData& tireForceParams, + PxVehicleArrayData& roadGeomStates, + PxVehicleArrayData& suspensionStates, + PxVehicleArrayData& suspensionComplianceStates, + PxVehicleArrayData& suspensionForces, + PxVehicleArrayData& wheelRigidBody1DStates, + PxVehicleArrayData& tireGripStates, + PxVehicleArrayData& tireDirectionStates, + PxVehicleArrayData& tireSpeedStates, + PxVehicleArrayData& tireSlipStates, + PxVehicleArrayData& tireCamberAngleStates, + PxVehicleArrayData& tireStickyStates, + PxVehicleArrayData& tireForces) = 0; + + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_PROFILE_ZONE("PxVehicleTireComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + PxVehicleArrayData steerResponseStates; + const PxVehicleRigidBodyState* rigidBodyState; + PxVehicleArrayData actuationStates; + PxVehicleArrayData wheelParams; + PxVehicleArrayData suspensionParams; + PxVehicleArrayData tireForceParams; + PxVehicleArrayData roadGeomStates; + PxVehicleArrayData suspensionStates; + PxVehicleArrayData suspensionComplianceStates; + PxVehicleArrayData suspensionForces; + PxVehicleArrayData wheelRigidBody1DStates; + PxVehicleArrayData tireGripStates; + PxVehicleArrayData tireDirectionStates; + PxVehicleArrayData tireSpeedStates; + PxVehicleArrayData tireSlipStates; + PxVehicleArrayData tireCamberAngleStates; + PxVehicleArrayData tireStickyStates; + PxVehicleArrayData tireForces; + + getDataForTireComponent(axleDescription, steerResponseStates, + rigidBodyState, actuationStates, wheelParams, suspensionParams, tireForceParams, + roadGeomStates, suspensionStates, suspensionComplianceStates, suspensionForces, + wheelRigidBody1DStates, tireGripStates, tireDirectionStates, tireSpeedStates, + tireSlipStates, tireCamberAngleStates, tireStickyStates, tireForces); + + for (PxU32 i = 0; i < axleDescription->nbWheels; i++) + { + const PxU32 wheelId = axleDescription->wheelIdsInAxleOrder[i]; + + //Compute the tire slip directions + PxVehicleTireDirsUpdate( + suspensionParams[wheelId], + steerResponseStates[wheelId], + roadGeomStates[wheelId], suspensionComplianceStates[wheelId], + *rigidBodyState, + context.frame, + tireDirectionStates[wheelId]); + + //Compute the rigid body speeds along the tire slip directions. + PxVehicleTireSlipSpeedsUpdate( + wheelParams[wheelId], suspensionParams[wheelId], + steerResponseStates[wheelId], suspensionStates[wheelId], tireDirectionStates[wheelId], + *rigidBodyState, roadGeomStates[i], + context.frame, + tireSpeedStates[wheelId]); + + //Compute the tire slip angles. + PxVehicleTireSlipsUpdate( + wheelParams[wheelId], context.tireSlipParams, + actuationStates[wheelId], tireSpeedStates[wheelId], + wheelRigidBody1DStates[wheelId], + tireSlipStates[wheelId]); + + //Update the camber angle + PxVehicleTireCamberAnglesUpdate( + suspensionParams[wheelId], steerResponseStates[wheelId], roadGeomStates[wheelId], + suspensionComplianceStates[wheelId], *rigidBodyState, + context.frame, + tireCamberAngleStates[wheelId]); + + //Compute the friction + PxVehicleTireGripUpdate( + tireForceParams[wheelId], roadGeomStates[wheelId], + suspensionStates[wheelId], suspensionForces[wheelId], + tireSlipStates[wheelId], tireGripStates[wheelId]); + + //Update the tire sticky state + // + //Note: this should be skipped if tires do not use the sticky feature + PxVehicleTireStickyStateUpdate( + *axleDescription, + wheelParams[wheelId], + context.tireStickyParams, + actuationStates, tireGripStates[wheelId], + tireSpeedStates[wheelId], wheelRigidBody1DStates[wheelId], + dt, + tireStickyStates[wheelId]); + + //If sticky tire is active set the slip angle to zero. + // + //Note: this should be skipped if tires do not use the sticky feature + PxVehicleTireSlipsAccountingForStickyStatesUpdate( + tireStickyStates[wheelId], + tireSlipStates[wheelId]); + + //Compute the tire forces + PxVehicleTireForcesUpdate( + wheelParams[wheelId], suspensionParams[wheelId], + tireForceParams[wheelId], + suspensionComplianceStates[wheelId], + tireGripStates[wheelId], tireDirectionStates[wheelId], + tireSlipStates[wheelId], tireCamberAngleStates[wheelId], + *rigidBodyState, + tireForces[wheelId]); + } + + return true; + } +}; + +/** + * @deprecated + */ +class PX_DEPRECATED PxVehicleLegacyTireComponent : public PxVehicleComponent +{ +public: + + PxVehicleLegacyTireComponent() : PxVehicleComponent() {} + virtual ~PxVehicleLegacyTireComponent() {} + + virtual void getDataForLegacyTireComponent( + const PxVehicleAxleDescription*& axleDescription, + PxVehicleArrayData& steerResponseStates, + const PxVehicleRigidBodyState*& rigidBodyState, + PxVehicleArrayData& actuationStates, + PxVehicleArrayData& wheelParams, + PxVehicleArrayData& suspensionParams, + PxVehicleArrayData& tireForceParams, + PxVehicleArrayData& roadGeomStates, + PxVehicleArrayData& suspensionStates, + PxVehicleArrayData& suspensionComplianceStates, + PxVehicleArrayData& suspensionForces, + PxVehicleArrayData& wheelRigidBody1DStates, + PxVehicleArrayData& tireGripStates, + PxVehicleArrayData& tireDirectionStates, + PxVehicleArrayData& tireSpeedStates, + PxVehicleArrayData& tireSlipStates, + PxVehicleArrayData& tireCamberAngleStates, + PxVehicleArrayData& tireStickyStates, + PxVehicleArrayData& tireForces) = 0; + + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_PROFILE_ZONE("PxVehicleLegacyTireComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + PxVehicleArrayData steerResponseStates; + const PxVehicleRigidBodyState* rigidBodyState; + PxVehicleArrayData actuationStates; + PxVehicleArrayData wheelParams; + PxVehicleArrayData suspensionParams; + PxVehicleArrayData tireForceParams; + PxVehicleArrayData roadGeomStates; + PxVehicleArrayData suspensionStates; + PxVehicleArrayData suspensionComplianceStates; + PxVehicleArrayData suspensionForces; + PxVehicleArrayData wheelRigidBody1DStates; + PxVehicleArrayData tireGripStates; + PxVehicleArrayData tireDirectionStates; + PxVehicleArrayData tireSpeedStates; + PxVehicleArrayData tireSlipStates; + PxVehicleArrayData tireCamberAngleStates; + PxVehicleArrayData tireStickyStates; + PxVehicleArrayData tireForces; + + getDataForLegacyTireComponent(axleDescription, steerResponseStates, + rigidBodyState, actuationStates, + wheelParams, suspensionParams, tireForceParams, + roadGeomStates, suspensionStates, suspensionComplianceStates, + suspensionForces, wheelRigidBody1DStates, + tireGripStates, tireDirectionStates, tireSpeedStates, tireSlipStates, + tireCamberAngleStates, tireStickyStates, tireForces); + + for (PxU32 i = 0; i < axleDescription->nbWheels; i++) + { + const PxU32 wheelId = axleDescription->wheelIdsInAxleOrder[i]; + + //Compute the tire slip directions + PxVehicleTireDirsLegacyUpdate( + suspensionParams[wheelId], + steerResponseStates[wheelId], + roadGeomStates[wheelId], *rigidBodyState, + context.frame, + tireDirectionStates[wheelId]); + + //Compute the rigid body speeds along the tire slip directions. + PxVehicleTireSlipSpeedsUpdate( + wheelParams[wheelId], suspensionParams[wheelId], + steerResponseStates[wheelId], suspensionStates[wheelId], tireDirectionStates[wheelId], + *rigidBodyState, roadGeomStates[wheelId], + context.frame, + tireSpeedStates[wheelId]); + + //Compute the tire slip angles. + PxVehicleTireSlipsLegacyUpdate( + wheelParams[wheelId], context.tireSlipParams, + actuationStates[wheelId], tireSpeedStates[wheelId], + wheelRigidBody1DStates[wheelId], + tireSlipStates[wheelId]); + + //Update the camber angle + PxVehicleTireCamberAnglesUpdate( + suspensionParams[wheelId], steerResponseStates[wheelId], roadGeomStates[wheelId], + suspensionComplianceStates[wheelId], *rigidBodyState, + context.frame, + tireCamberAngleStates[wheelId]); + + //Compute the friction + PxVehicleTireGripUpdate( + tireForceParams[wheelId], roadGeomStates[wheelId], + suspensionStates[wheelId], suspensionForces[wheelId], + tireSlipStates[wheelId], tireGripStates[wheelId]); + + //Update the tire sticky state + // + //Note: this should be skipped if tires do not use the sticky feature + PxVehicleTireStickyStateUpdate( + *axleDescription, + wheelParams[wheelId], + context.tireStickyParams, + actuationStates, tireGripStates[wheelId], + tireSpeedStates[wheelId], wheelRigidBody1DStates[wheelId], + dt, + tireStickyStates[wheelId]); + + //If sticky tire is active set the slip angle to zero. + // + //Note: this should be skipped if tires do not use the sticky feature + PxVehicleTireSlipsAccountingForStickyStatesUpdate( + tireStickyStates[wheelId], + tireSlipStates[wheelId]); + + //Compute the tire forces + PxVehicleTireForcesUpdate( + wheelParams[wheelId], suspensionParams[wheelId], + tireForceParams[wheelId], + suspensionComplianceStates[wheelId], + tireGripStates[wheelId], tireDirectionStates[wheelId], + tireSlipStates[wheelId], tireCamberAngleStates[wheelId], + *rigidBodyState, + tireForces[wheelId]); + } + + return true; + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ + + diff --git a/Source/ThirdParty/PhysX/vehicle2/tire/PxVehicleTireFunctions.h b/Source/ThirdParty/PhysX/vehicle2/tire/PxVehicleTireFunctions.h new file mode 100644 index 000000000..cd8cd14c4 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/tire/PxVehicleTireFunctions.h @@ -0,0 +1,269 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxSimpleTypes.h" +#include "vehicle2/PxVehicleParams.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +struct PxVehicleSuspensionParams; +struct PxVehicleRoadGeometryState; +struct PxVehicleRigidBodyState; +struct PxVehicleTireDirectionState; +struct PxVehicleSuspensionComplianceState; +struct PxVehicleWheelParams; +struct PxVehicleTireSpeedState; +struct PxVehicleWheelActuationState; +struct PxVehicleWheelRigidBody1dState; +struct PxVehicleTireSlipState; +struct PxVehicleSuspensionState; +struct PxVehicleTireCamberAngleState; +struct PxVehicleTireGripState; +struct PxVehicleTireForceParams; +struct PxVehicleSuspensionForce; +struct PxVehicleTireForce; +struct PxVehicleTireStickyState; + +/** +\brief Compute the longitudinal and lateral tire directions in the ground plane. +\param[in] suspensionParams describes the frame of the suspension and wheel. +\param[in] steerAngle is the steer angle in radians to be applied to the wheel. +\param[in] roadGeometryState describes the plane of the road geometry under the wheel +\param[in] rigidBodyState describes the current pose of the vehicle's rigid body in the world frame. +\param[in] frame is a description of the vehicle's lateral and longitudinal axes. +\param[out] tireDirectionState is the computed tire longitudinal and lateral directions in the world frame. +\note PxVehicleTireDirsLegacyUpdate replicates the tire direction calculation of PhysX 5.0 and earlier. +@deprecated +*/ +PX_DEPRECATED void PxVehicleTireDirsLegacyUpdate +(const PxVehicleSuspensionParams& suspensionParams, + const PxReal steerAngle, const PxVehicleRoadGeometryState& roadGeometryState, const PxVehicleRigidBodyState& rigidBodyState, + const PxVehicleFrame& frame, + PxVehicleTireDirectionState& tireDirectionState); + +/** +\brief Compute the longitudinal and lateral tire directions in the ground plane. +\param[in] suspensionParams describes the frame of the suspension and wheel. +\param[in] steerAngle is the steer angle in radians to be applied to the wheel. +\param[in] roadGeometryState describes the plane of the road geometry under the wheel. +\param[in] rigidBodyState describes the current pose of the vehicle's rigid body in the world frame. +\param[in] complianceState is a description of the camber and toe angle that arise from suspension compliance. +\param[in] frame is a description of the vehicle's lateral and longitudinal axes. +\param[out] tireDirectionState is the computed tire longitudinal and lateral directions in the world frame. +\note The difference between PxVehicleTireDirsUpdate and PxVehicleTireDirsLegacyUpdate is that +PxVehicleTireDirsUpdate accounts for suspension compliance while PxVehicleTireDirsLegacyUpdate does not. +*/ +void PxVehicleTireDirsUpdate +(const PxVehicleSuspensionParams& suspensionParams, + const PxReal steerAngle, const PxVehicleRoadGeometryState& roadGeometryState, const PxVehicleSuspensionComplianceState& complianceState, + const PxVehicleRigidBodyState& rigidBodyState, + const PxVehicleFrame& frame, + PxVehicleTireDirectionState& tireDirectionState); + +/** +\brief Project the rigid body velocity at the tire contact point along the tire longitudinal directions. +\param[in] wheelParams is a description of the wheel's radius and half-width. +\param[in] suspensionParams describes the frame of the suspension and wheel. +\param[in] steerAngle is the steer angle in radians to be applied to the wheel. +\param[in] suspensionStates is the current suspension compression state. +\param[in] tireDirectionState is the tire's longitudinal and lateral directions in the ground plane. +\param[in] rigidBodyState describes the current pose and velocity of the vehicle's rigid body in the world frame. +\param[in] roadGeometryState describes the current velocity of the road geometry under each wheel. +\param[in] frame is a description of the vehicle's lateral and longitudinal axes. +\param[out] tireSpeedState is the components of rigid body velocity at the tire contact point along the +tire's longitudinal and lateral axes. +@see PxVehicleTireDirsUpdate +@see PxVehicleTireDirsLegacyUpdate +*/ +void PxVehicleTireSlipSpeedsUpdate +(const PxVehicleWheelParams& wheelParams, const PxVehicleSuspensionParams& suspensionParams, + const PxF32 steerAngle, const PxVehicleSuspensionState& suspensionStates, const PxVehicleTireDirectionState& tireDirectionState, + const PxVehicleRigidBodyState& rigidBodyState, const PxVehicleRoadGeometryState& roadGeometryState, + const PxVehicleFrame& frame, + PxVehicleTireSpeedState& tireSpeedState); + +/** +\brief Compute a tire's longitudinal and lateral slip angles. +\param[in] wheelParams describes the radius of the wheel. +\param[in] tireSlipParams describes how to manage small longitudinal speeds by setting minimum values on the +denominator of the quotients used to calculate lateral and longitudinal slip. +\param[in] actuationState describes whether a wheel is to be driven by a drive torque or not. +\param[in] tireSpeedState is the component of rigid body velocity at the tire contact point projected along the +tire's longitudinal and lateral axes. +\param[in] wheelRigidBody1dState is the wheel rotation speed. +\param[out] tireSlipState is the computed tire longitudinal and lateral slips. +\note Longitudinal slip angle has the following theoretical form: (wheelRotationSpeed*wheelRadius - longitudinalSpeed)/|longitudinalSpeed| +\note Lateral slip angle has the following theoretical form: atan(lateralSpeed/|longitudinalSpeed|) +\note The calculation of both longitudinal and lateral slip angles avoid a zero denominator using minimum values for the denominator set in +tireSlipParams. +*/ +void PxVehicleTireSlipsUpdate +(const PxVehicleWheelParams& wheelParams, + const PxVehicleTireSlipParams& tireSlipParams, + const PxVehicleWheelActuationState& actuationState, PxVehicleTireSpeedState& tireSpeedState, const PxVehicleWheelRigidBody1dState& wheelRigidBody1dState, + PxVehicleTireSlipState& tireSlipState); + +/** +@deprecated + +\brief Compute a tire's longitudinal and lateral slip angles. +\param[in] wheelParams describes the radius of the wheel. +\param[in] tireSlipParams describes how to manage small longitudinal speeds by setting minimum values on the +denominator of the quotients used to calculate lateral and longitudinal slip. +\param[in] actuationState describes whether a wheel is to be driven by a drive torque or not. +\param[in] tireSpeedState is the component of rigid body velocity at the tire contact point projected along the +tire's longitudinal and lateral axes. +\param[in] wheelRigidBody1dState is the wheel rotation speed. +\param[out] tireSlipState is the computed tire longitudinal and lateral slips. +\note Longitudinal slip angle has the following theoretical form: (wheelRotationSpeed*wheelRadius - longitudinalSpeed)/|longitudinalSpeed| +\note Lateral slip angle has the following theoretical form: atan(lateralSpeed/|longitudinalSpeed|) +\note The calculation of both longitudinal and lateral slip angles avoid a zero denominator using minimum values for the denominator set in +tireSlipParams. +*/ +void PX_DEPRECATED PxVehicleTireSlipsLegacyUpdate +(const PxVehicleWheelParams& wheelParams, + const PxVehicleTireSlipParams& tireSlipParams, + const PxVehicleWheelActuationState& actuationState, PxVehicleTireSpeedState& tireSpeedState, const PxVehicleWheelRigidBody1dState& wheelRigidBody1dState, + PxVehicleTireSlipState& tireSlipState); + + +/** +\brief Compute the camber angle of the wheel +\param[in] suspensionParams describes the frame of the suspension and wheel. +\param[in] steerAngle is the steer angle in radians to be applied to the wheel. +\param[in] roadGeometryState describes the plane of the road geometry under the wheel. +\param[in] complianceState is a description of the camber and toe angle that arise from suspension compliance. +\param[in] rigidBodyState describes the current pose of the vehicle's rigid body in the world frame. +\param[in] frame is a description of the vehicle's lateral and longitudinal axes. +\param[out] tireCamberAngleState is the computed camber angle of the tire expressed in radians. +*/ +void PxVehicleTireCamberAnglesUpdate +(const PxVehicleSuspensionParams& suspensionParams, + const PxReal steerAngle, const PxVehicleRoadGeometryState& roadGeometryState, const PxVehicleSuspensionComplianceState& complianceState, + const PxVehicleRigidBodyState& rigidBodyState, + const PxVehicleFrame& frame, + PxVehicleTireCamberAngleState& tireCamberAngleState); + +/** +\brief Compute the load and friction experienced by the tire. +\param[in] tireForceParams describes the tire's friction response to longitudinal lip angle and its load response. +\param[in] roadGeometryState describes the plane of the road geometry under the wheel. +\param[in] suspensionState is the current suspension compression state. +\param[in] suspensionForce is the force that the suspension exerts on the sprung mass of the suspension. +\param[in] tireSlipState is the tire longitudinal and lateral slip angles. +\param[out] tireGripState is the computed load and friction experienced by the tire. +\note If the suspension cannot place the wheel on the ground the tire load and friction will be 0.0. +*/ +void PxVehicleTireGripUpdate +(const PxVehicleTireForceParams& tireForceParams, + const PxVehicleRoadGeometryState& roadGeometryState, const PxVehicleSuspensionState& suspensionState, const PxVehicleSuspensionForce& suspensionForce, + const PxVehicleTireSlipState& tireSlipState, + PxVehicleTireGripState& tireGripState); + +/** +\brief When a tire has been at a very low speed for a threshold time without application of drive torque, a +secondary tire model is applied to bring the tire to rest using velocity constraints that asymptotically approach zero speed +along the tire's lateral and longitudinal directions. This secondary tire model is referred to as the sticky tire model and the +tire is considered to be in the sticky tire state when the speed and time conditions are satisfied. The purpose of +PxVehicleTireStickyStateUpdate is to compute the target speeds of the sticky state and to record whether sticky state is +active or not. +\param[in] axleDescription is the axles of the vehicle and the wheels on each axle. +\param[in] wheelParams describes the radius of the wheel +\param[in] tireStickyParams describe the threshold speeds and times for the lateral and longitudinal sticky states. +\param[in] actuationStates describes whether each wheel experiences a drive torque. +\param[in] tireGripState is the load and friction experienced by the tire. +\param[in] tireSpeedState is the component of rigid body velocity at the tire contact point projected along the +tire's longitudinal and lateral axes. +\param[in] wheelRigidBody1dState is the wheel rotation speed. +\param[in] dt is the simulation time that has lapsed since the last call to PxVehicleTireStickyStateUpdate +\param[out] tireStickyState is a description of the sticky state of the tire in the longitudinal and lateral directions. +\note The velocity constraints are maintained through integration with the PhysX scene using the function +PxVehiclePhysXConstraintStatesUpdate. Alternative implementations independent of PhysX are possible. +@see PxVehiclePhysXConstraintStatesUpdate +@see PxVehicleTireSlipsAccountingForStickyStatesUpdate +*/ +void PxVehicleTireStickyStateUpdate +(const PxVehicleAxleDescription& axleDescription, const PxVehicleWheelParams& wheelParams, + const PxVehicleTireStickyParams& tireStickyParams, + const PxVehicleArrayData& actuationStates, + const PxVehicleTireGripState& tireGripState, const PxVehicleTireSpeedState& tireSpeedState, const PxVehicleWheelRigidBody1dState& wheelRigidBody1dState, + const PxReal dt, + PxVehicleTireStickyState& tireStickyState); + +/** +\brief Set the tire longitudinal and lateral slip values to 0.0 in the event that the tire has entred tire sticky state. This is +necessary to avoid both tire models being simultaneously active and interfering with each other. +\param[in] tireStickyState is a description of the sticky state of the tire in the longitudinal and lateral directions. +\param[out] tireSlipState is the updated lateral and longudinal slip with either set to 0.0 in the event that the correspoinding +sticky state is active. +\note This function should not be invoked if there is no subsequent component to implement the sticky tire model. +*/ +void PxVehicleTireSlipsAccountingForStickyStatesUpdate +(const PxVehicleTireStickyState& tireStickyState, + PxVehicleTireSlipState& tireSlipState); + +/** +\brief Compute the longitudinal and lateral forces in the world frame that develop on the tire as a consequence of +the tire's slip angles, friction and load. +\param[in] wheelParams describes the radius and half-width of the wheel. +\param[in] suspensionParams describes the frame of the suspension and wheel. +\param[in] tireForceParams describes the conversion of slip angle, friction and load to a force along the longitudinal +and lateral directions of the tire. +\param[in] complianceState is a description of the camber and toe angle that arise from suspension compliance. +\param[out] tireGripState is the load and friction experienced by the tire. +\param[in] tireDirectionState is the tire's longitudinal and lateral directions in the ground plane. +\param[in] tireSlipState is the longitudinal and lateral slip angles. +\param[in] tireCamberAngleState is the camber angle of the tire expressed in radians. +\param[in] rigidBodyState describes the current pose of the vehicle's rigid body in the world frame. +\param[out] tireForce is the computed tire forces in the world frame. +*/ +void PxVehicleTireForcesUpdate +(const PxVehicleWheelParams& wheelParams, const PxVehicleSuspensionParams& suspensionParams, + const PxVehicleTireForceParams& tireForceParams, + const PxVehicleSuspensionComplianceState& complianceState, + const PxVehicleTireGripState& tireGripState, const PxVehicleTireDirectionState& tireDirectionState, + const PxVehicleTireSlipState& tireSlipState, const PxVehicleTireCamberAngleState& tireCamberAngleState, + const PxVehicleRigidBodyState& rigidBodyState, + PxVehicleTireForce& tireForce); + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/tire/PxVehicleTireHelpers.h b/Source/ThirdParty/PhysX/vehicle2/tire/PxVehicleTireHelpers.h new file mode 100644 index 000000000..5a6d1eb41 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/tire/PxVehicleTireHelpers.h @@ -0,0 +1,73 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once +/** \addtogroup vehicle2 + @{ +*/ + +#include "vehicle2/PxVehicleParams.h" +#include "vehicle2/wheel/PxVehicleWheelStates.h" +#include "PxVehicleTireStates.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +/** +\brief Compute the intention to accelerate by inspecting the actuation states of the wheels of a powered vehicle. +\param[in] poweredVehicleAxleDesc describes the axles and wheels of a powered vehicle in a jointed ensemble of vehicles. +\param[in] poweredVehicleActuationStates describes the drive state of each wheel of the powered vehicle. +@see PxVehicleTireStickyStateReset +*/ +bool PxVehicleAccelerationIntentCompute +(const PxVehicleAxleDescription& poweredVehicleAxleDesc, const PxVehicleArrayData& poweredVehicleActuationStates); + +/** +\brief Reset the sticky tire states of an unpowered vehicle if it is in a jointed ensemble of vehicles with at least one powered vehicle. +\param[in] poweredVehicleIntentionToAccelerate describes the state of the powered vehicle in an ensemble of jointed vehicles. +\param[in] unpoweredVehicleAxleDesc describes the axles and wheels of an unpowered vehicle towed by a powered vehicle. +\param[out] unpoweredVehicleStickyState is the sticky state of the wheels of an unpowered vehicle towed by a powered vehicle. +\note If any wheel on the powered vehicle is to receive a drive torque, the sticky tire states of the towed vehicle will be reset to the deactivated state. +\note poweredVehicleIntentionToAccelerate may be computed using PxVehicleAccelerationIntentCompute(). +@see PxVehicleAccelerationIntentCompute +*/ +void PxVehicleTireStickyStateReset +(const bool poweredVehicleIntentionToAccelerate, + const PxVehicleAxleDescription& unpoweredVehicleAxleDesc, + PxVehicleArrayData& unpoweredVehicleStickyState); + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/tire/PxVehicleTireParams.h b/Source/ThirdParty/PhysX/vehicle2/tire/PxVehicleTireParams.h new file mode 100644 index 000000000..a47428a54 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/tire/PxVehicleTireParams.h @@ -0,0 +1,166 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxFoundation.h" + +#include "vehicle2/PxVehicleParams.h" + +#include "PxVehicleTireStates.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +struct PxVehicleTireForceParams +{ + /** + \brief Tire lateral stiffness is a graph of tire load that has linear behavior near zero load and + flattens at large loads. latStiffX describes the minimum normalized load (load/restLoad) that gives a + flat lateral stiffness response to load. + \note A value of 0.0 indicates that the tire lateral stiffness is independent of load and will adopt + the value #latStiffY for all values of tire load. + */ + PxReal latStiffX; + + /** + \brief Tire lateral stiffness is a graph of tire load that has linear behavior near zero load and + flattens at large loads. latStiffY describes the maximum possible value of lateral stiffness that occurs + when (load/restLoad) >= #latStiffX. + + Unit: force per lateral slip = mass * length / (time^2) + */ + PxReal latStiffY; + + /** + \brief Tire Longitudinal stiffness + \note Longitudinal force can be approximated as longStiff*longitudinalSlip. + + Unit: force per longitudinal slip = mass * length / (time^2) + */ + PxReal longStiff; + + /** + \brief Tire camber stiffness + \note Camber force can be approximated as camberStiff*camberAngle. + + Unit: force per radian = mass * length / (time^2) + */ + PxReal camberStiff; + + /** + \brief Graph of friction vs longitudinal slip with 3 points. + \note frictionVsSlip[0][0] is always zero. + \note frictionVsSlip[0][1] is the friction available at zero longitudinal slip. + \note frictionVsSlip[1][0] is the value of longitudinal slip with maximum friction. + \note frictionVsSlip[1][1] is the maximum friction. + \note frictionVsSlip[2][0] is the end point of the graph. + \note frictionVsSlip[2][1] is the value of friction for slips greater than frictionVsSlip[2][0]. + \note The friction value is computed from the friction vs longitudinal slip graph using linear interpolation. + \note The friction value computed from the friction vs longitudinal slip graph is used to scale the friction + value of the road geometry. + \note frictionVsSlip[2][0] > frictionVsSlip[1][0] > frictionVsSlip[0][0] + \note frictionVsSlip[1][1] is typically greater than frictionVsSlip[0][1] + \note frictionVsSlip[2][1] is typically smaller than frictionVsSlip[1][1] + \note longitudinal slips > frictionVsSlip[2][0] use friction multiplier frictionVsSlip[2][1] + */ + PxReal frictionVsSlip[3][2]; //3 (x,y) points + + /** + \brief The rest load is the load that develops on the tire when the vehicle is at rest on a flat plane. + \note The rest load is approximately the product of gravitational acceleration and (sprungMass + wheelMass). + + Unit: force = mass * length / (time^2) + */ + PxReal restLoad; + + /** + \brief Tire load variation can be strongly dependent on the time-step so it is a good idea to filter it + to give less jerky handling behavior. + \note Tire load filtering is implemented by linear interpolating a graph containing just two points. + The x-axis of the graph is normalized tire load, while the y-axis is the filtered normalized tire load that is + to be applied during the tire force calculation. + \note The normalized load is the force acting downwards on the tire divided by restLoad. + \note The minimum possible normalized load is zero. + \note There are two points on the graph: (minNormalisedLoad, minNormalisedFilteredLoad) and (maxNormalisedLoad, maxFilteredNormalisedLoad). + \note Normalized loads less than minNormalisedLoad have filtered normalized load = minNormalisedFilteredLoad. + \note Normalized loads greater than maxNormalisedLoad have filtered normalized load = maxFilteredNormalisedLoad. + \note Normalized loads in-between are linearly interpolated between minNormalisedFilteredLoad and maxFilteredNormalisedLoad. + \note The tire load applied as input to the tire force computation is the filtered normalized load multiplied by the rest load. + \note loadFilter[0][0] is minNormalisedLoad + \note loadFilter[0][1] is minFilteredNormalisedLoad + \note loadFilter[1][0] is maxNormalisedLoad + \note loadFilter[1][1] is maxFilteredNormalisedLoad + */ + PxReal loadFilter[2][2]; //2 (x,y) points + + PX_FORCE_INLINE PxVehicleTireForceParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PxVehicleTireForceParams r = *this; + const PxReal scale = trgScale.scale / srcScale.scale; + r.latStiffY *= scale; + r.longStiff *= scale; + r.camberStiff *= scale; + r.restLoad *= scale; + return r; + } + + PX_FORCE_INLINE bool isValid() const + { + PX_CHECK_AND_RETURN_VAL(latStiffX >= 0, "PxVehicleTireForceParams.latStiffX must be greater than or equal to zero", false); + PX_CHECK_AND_RETURN_VAL(latStiffY > 0, "PxVehicleTireForceParams.latStiffY must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(longStiff > 0, "PxVehicleTireForceParams.longStiff must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(camberStiff >= 0, "PxVehicleTireForceParams.camberStiff must be greater than or equal zero", false); + PX_CHECK_AND_RETURN_VAL(restLoad > 0, "PxVehicleTireForceParams.restLoad must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(loadFilter[1][0] >= loadFilter[0][0], "PxVehicleTireForceParams.loadFilter[1][0] must be greater than or equal to PxVehicleTireForceParams.loadFilter[0][0]", false); + PX_CHECK_AND_RETURN_VAL(loadFilter[1][1] > 0, "PxVehicleTireLoadFilterData.loadFilter[1][1] must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(0.0f == loadFilter[0][0], "PxVehicleTireLoadFilterData.loadFilter[0][0] must be equal to zero", false); + PX_CHECK_AND_RETURN_VAL(frictionVsSlip[0][0] >= 0.0f && frictionVsSlip[0][1] >= 0.0f, "Illegal values for frictionVsSlip[0]", false); + PX_CHECK_AND_RETURN_VAL(frictionVsSlip[1][0] >= 0.0f && frictionVsSlip[1][1] >= 0.0f, "Illegal values for frictionVsSlip[1]", false); + PX_CHECK_AND_RETURN_VAL(frictionVsSlip[2][0] >= 0.0f && frictionVsSlip[2][1] >= 0.0f, "Illegal values for frictionVsSlip[2]", false); + return true; + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/tire/PxVehicleTireStates.h b/Source/ThirdParty/PhysX/vehicle2/tire/PxVehicleTireStates.h new file mode 100644 index 000000000..7e666dba7 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/tire/PxVehicleTireStates.h @@ -0,0 +1,181 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxVec3.h" +#include "foundation/PxMemory.h" + +#include "vehicle2/PxVehicleParams.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + + +/** +\brief PxVehicleTireDirectionState stores the world frame lateral and longtidinal axes of the tire after +projecting the wheel pose in the world frame onto the road geometry plane (also in the world frame). +*/ +struct PxVehicleTireDirectionState +{ + PxVec3 directions[PxVehicleTireDirectionModes::eMAX_NB_PLANAR_DIRECTIONS]; + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleTireDirectionState)); + } +}; + + +/** +\brief PxVehicleTireSpeedState stores the components of the instantaneous velocity of the rigid body at the tire contact point projected +along the lateral and longitudinal axes of the tire. +@see PxVehicleTireDirectionState +*/ +struct PxVehicleTireSpeedState +{ + PxReal speedStates[PxVehicleTireDirectionModes::eMAX_NB_PLANAR_DIRECTIONS]; + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleTireSpeedState)); + } +}; + +/** +\brief The lateral and longitudinal tire slips. +@see PxVehicleTireSpeedState +*/ +struct PxVehicleTireSlipState +{ + PxReal slips[PxVehicleTireDirectionModes::eMAX_NB_PLANAR_DIRECTIONS]; + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleTireSlipState)); + } +}; + +/** +\brief The load and friction experienced by a tire. +*/ +struct PxVehicleTireGripState +{ + /** + \brief The tire load + + Unit: force = mass * length / (time^2) + */ + PxReal load; + + /** + \brief The tire friction is the product of the road geometry friction and a friction response multiplier. + */ + PxReal friction; + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleTireGripState)); + } +}; + +/** +\brief Camber angle of the tire relative to the ground plane. +*/ +struct PxVehicleTireCamberAngleState +{ + PxReal camberAngle; + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleTireCamberAngleState)); + } +}; + +/** +\brief Prolonged low speeds in the lateral and longitudinal directions may be handled with "sticky" velocity constraints that activate after +a speed below a threshold has been recorded for a threshold time. +@see PxVehicleTireStickyParams +@see PxVehicleTireSpeedState +*/ +struct PxVehicleTireStickyState +{ + PxReal lowSpeedTime[PxVehicleTireDirectionModes::eMAX_NB_PLANAR_DIRECTIONS]; + bool activeStatus[PxVehicleTireDirectionModes::eMAX_NB_PLANAR_DIRECTIONS]; + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleTireStickyState)); + } +}; + +/** +\brief The longitudinal/lateral forces/torques that develop on the tire. +*/ +struct PxVehicleTireForce +{ + /* + \brief The tire forces that develop along the tire's longitudinal and lateral directions. Specified in the world frame. + */ + PxVec3 forces[PxVehicleTireDirectionModes::eMAX_NB_PLANAR_DIRECTIONS]; + + /* + \brief The tire torques that develop around the tire's longitudinal and lateral directions. Specified in the world frame. + */ + PxVec3 torques[PxVehicleTireDirectionModes::eMAX_NB_PLANAR_DIRECTIONS]; + + /** + \brief The aligning moment may be propagated to a torque-driven steering controller. + */ + PxReal aligningMoment; + + /** + \brief The torque to apply to the wheel's 1d rigid body. + */ + PxReal wheelTorque; + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleTireForce)); + } +}; + + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/wheel/PxVehicleWheelComponents.h b/Source/ThirdParty/PhysX/vehicle2/wheel/PxVehicleWheelComponents.h new file mode 100644 index 000000000..bb3ca8484 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/wheel/PxVehicleWheelComponents.h @@ -0,0 +1,120 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "vehicle2/PxVehicleParams.h" +#include "vehicle2/PxVehicleComponent.h" + +#include "vehicle2/commands/PxVehicleCommandHelpers.h" +#include "vehicle2/tire/PxVehicleTireStates.h" + +#include "PxVehicleWheelFunctions.h" +#include "PxVehicleWheelHelpers.h" + +#include "common/PxProfileZone.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +class PxVehicleWheelComponent : public PxVehicleComponent +{ +public: + + PxVehicleWheelComponent() : PxVehicleComponent() {} + virtual ~PxVehicleWheelComponent() {} + + virtual void getDataForWheelComponent( + const PxVehicleAxleDescription*& axleDescription, + PxVehicleArrayData& steerResponseStates, + PxVehicleArrayData& wheelParams, + PxVehicleArrayData& suspensionParams, + PxVehicleArrayData& actuationStates, + PxVehicleArrayData& suspensionStates, + PxVehicleArrayData& suspensionComplianceStates, + PxVehicleArrayData& tireSpeedStates, + PxVehicleArrayData& wheelRigidBody1dStates, + PxVehicleArrayData& wheelLocalPoses) = 0; + + virtual bool update(const PxReal dt, const PxVehicleSimulationContext& context) + { + PX_PROFILE_ZONE("PxVehicleWheelComponent::update", 0); + + const PxVehicleAxleDescription* axleDescription; + PxVehicleArrayData steerResponseStates; + PxVehicleArrayData wheelParams; + PxVehicleArrayData suspensionParams; + PxVehicleArrayData actuationStates; + PxVehicleArrayData suspensionStates; + PxVehicleArrayData suspensionComplianceStates; + PxVehicleArrayData tireSpeedStates; + PxVehicleArrayData wheelRigidBody1dStates; + PxVehicleArrayData wheelLocalPoses; + + getDataForWheelComponent(axleDescription, steerResponseStates, + wheelParams, suspensionParams, actuationStates, suspensionStates, + suspensionComplianceStates, tireSpeedStates, wheelRigidBody1dStates, + wheelLocalPoses); + + for (PxU32 i = 0; i < axleDescription->nbWheels; i++) + { + const PxU32 wheelId = axleDescription->wheelIdsInAxleOrder[i]; + + PxVehicleWheelRotationAngleUpdate( + wheelParams[wheelId], + actuationStates[wheelId], suspensionStates[wheelId], + tireSpeedStates[wheelId], + context.thresholdForwardSpeedForWheelAngleIntegration, dt, + wheelRigidBody1dStates[wheelId]); + + wheelLocalPoses[wheelId].localPose = PxVehicleComputeWheelLocalPose(context.frame, + suspensionParams[wheelId], + suspensionStates[wheelId], + suspensionComplianceStates[wheelId], + steerResponseStates[wheelId], + wheelRigidBody1dStates[wheelId]); + } + + return true; + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/wheel/PxVehicleWheelFunctions.h b/Source/ThirdParty/PhysX/vehicle2/wheel/PxVehicleWheelFunctions.h new file mode 100644 index 000000000..cd5588c48 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/wheel/PxVehicleWheelFunctions.h @@ -0,0 +1,81 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxSimpleTypes.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +struct PxVehicleWheelParams; +struct PxVehicleWheelActuationState; +struct PxVehicleSuspensionState; +struct PxVehicleTireSpeedState; +struct PxVehicleScale; +struct PxVehicleWheelRigidBody1dState; + +/** +\brief Forward integrate the rotation angle of a wheel +\note The rotation angle of the wheel plays no role in simulation but is important to compute the pose of the wheel for rendering. +\param[in] wheelParams describes the radius and half-width of the wheel +\param[in] actuationState describes whether the wheel has drive or brake torque applied to it. +\param[in] suspensionState describes whether the wheel touches the ground. +\param[in] tireSpeedState describes the components of rigid body velocity at the ground contact point along the tire's lateral and longitudinal directions. +\param[in] thresholdForwardSpeedForWheelAngleIntegration Forward wheel speed below which the wheel rotation speed gets blended with the rolling + speed (based on the forward wheel speed) which is then used to integrate the wheel rotation angle. At low forward wheel speed, the wheel + rotation speed can get unstable (depending on the tire model used) and, for example, oscillate. If brake or throttle is applied, there + will be no blending. +\param[in] dt is the simulation time that has lapsed since the last call to PxVehicleWheelRotationAngleUpdate +\param[in,out] wheelRigidBody1dState describes the current angular speed and angle of the wheel. +\note At low speeds and large timesteps, wheel rotation speed can become noisy due to singularities in the tire slip computations. +At low speeds, therefore, the wheel speed used for integrating the angle is a blend of current angular speed and rolling angular speed if the +wheel experiences neither brake nor drive torque and can be placed on the ground. The blended rotation speed gets stored in +PxVehicleWheelRigidBody1dState::correctedRotationSpeed. +*/ +void PxVehicleWheelRotationAngleUpdate +(const PxVehicleWheelParams& wheelParams, + const PxVehicleWheelActuationState& actuationState, const PxVehicleSuspensionState& suspensionState, const PxVehicleTireSpeedState& tireSpeedState, + const PxReal thresholdForwardSpeedForWheelAngleIntegration, const PxReal dt, + PxVehicleWheelRigidBody1dState& wheelRigidBody1dState); + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ + diff --git a/Source/ThirdParty/PhysX/vehicle2/wheel/PxVehicleWheelHelpers.h b/Source/ThirdParty/PhysX/vehicle2/wheel/PxVehicleWheelHelpers.h new file mode 100644 index 000000000..5a62db2df --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/wheel/PxVehicleWheelHelpers.h @@ -0,0 +1,221 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "vehicle2/PxVehicleFunctions.h" + +#include "vehicle2/suspension/PxVehicleSuspensionParams.h" +#include "vehicle2/suspension/PxVehicleSuspensionStates.h" + +#include "PxVehicleWheelParams.h" +#include "PxVehicleWheelStates.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +/** +\brief Compute the quaternion of a wheel in the rigid body frame. +\param[in] frame describes the longitudinal and lateral axes of the vehicle. +\param[in] suspensionParams describes the suspension and wheel frames. +\param[in] camberAngle is the camber angle in radian sinduced by suspension compliance. +\param[in] toeAngle is the toe angle in radians induced by suspension compliance. +\param[in] steerAngle is the steer angle in radians applied to the wheel. +\param[in] rotationAngle is the angle around the wheel's lateral axis. +\return The quaterion of the wheel in the rigid body frame. +@see PxVehicleComputeWheelOrientation +*/ +PX_FORCE_INLINE PxQuat PxVehicleComputeWheelLocalOrientation +(const PxVehicleFrame& frame, + const PxVehicleSuspensionParams& suspensionParams, + const PxReal camberAngle, const PxReal toeAngle, const PxReal steerAngle, + const PxReal rotationAngle) +{ + const PxQuat wheelLocalOrientation = + (suspensionParams.suspensionAttachment.q * PxVehicleComputeRotation(frame, camberAngle, 0.0f, steerAngle + toeAngle))* + (suspensionParams.wheelAttachment.q * PxVehicleComputeRotation(frame, 0.0f, rotationAngle, 0.0f)); + return wheelLocalOrientation; +} + +/** +\brief Compute the quaternion of a wheel in the world frame. +\param[in] frame describes the longitudinal and lateral axes of the vehicle. +\param[in] suspensionParams describes the suspension and wheel frames. +\param[in] camberAngle is the camber angle in radian induced by suspension compliance. +\param[in] toeAngle is the toe angle in radians induced by suspension compliance. +\param[in] steerAngle is the steer angle in radians applied to the wheel. +\param[in] rigidBodyOrientation is the quaterion of the rigid body in the world frame. +\param[in] rotationAngle is the angle around the wheel's lateral axis. +\return The quaterion of the wheel in the world frame. +@see PxVehicleComputeWheelLocalOrientation +*/ +PX_FORCE_INLINE PxQuat PxVehicleComputeWheelOrientation +(const PxVehicleFrame& frame, + const PxVehicleSuspensionParams& suspensionParams, + const PxReal camberAngle, const PxReal toeAngle, const PxReal steerAngle, + const PxQuat& rigidBodyOrientation, const PxReal rotationAngle) +{ + const PxQuat wheelOrientation = rigidBodyOrientation * PxVehicleComputeWheelLocalOrientation(frame, suspensionParams, + camberAngle, toeAngle, steerAngle, rotationAngle); + return wheelOrientation; +} + +/** +\brief Compute the pose of the wheel in the rigid body frame. +\param[in] frame describes the longitudinal and lateral axes of the vehicle. +\param[in] suspensionParams describes the suspension and wheel frames. +\param[in] suspensionState is the compression state of the suspenson. +\param[in] camberAngle is the camber angle in radian induced by suspension compliance. +\param[in] toeAngle is the toe angle in radians induced by suspension compliance. +\param[in] steerAngle is the steer angle in radians applied to the wheel. +\param[in] rotationAngle is the angle around the wheel's lateral axis. +\return The pose of the wheel in the rigid body frame. +*/ +PX_FORCE_INLINE PxTransform PxVehicleComputeWheelLocalPose +(const PxVehicleFrame& frame, + const PxVehicleSuspensionParams& suspensionParams, + const PxVehicleSuspensionState& suspensionState, + const PxReal camberAngle, const PxReal toeAngle, const PxReal steerAngle, + const PxReal rotationAngle) +{ + //Full equation: + //PxTransform(suspAttachment.p + suspParams.suspensionTravelDir*suspDist, suspAttachment.q) * + //PxTransform(PxVec3(0), PxQuat(camber, 0, steer+toe)) * + //wheelAttachment * + //PxTransform(PxVec3(0), PxQuat(0, rotation, 0)) + //Reduces to: + //PxTransform(suspAttachment.p + suspParams.suspensionTravelDir*suspDist, suspAttachment.q * PxQuat(camber, 0, steer+toe)) * + //PxTranfsorm(wheelAttachment.p, wheelAttachment.q * PxQuat(0, rotation, 0)) + const PxF32 suspDist = (suspensionState.jounce != PX_VEHICLE_UNSPECIFIED_JOUNCE) ? (suspensionParams.suspensionTravelDist - suspensionState.jounce) : 0.0f; + const PxTransform wheelLocalPose = + PxTransform( + suspensionParams.suspensionAttachment.p + suspensionParams.suspensionTravelDir*suspDist, + suspensionParams.suspensionAttachment.q*PxVehicleComputeRotation(frame, camberAngle, 0.0f, steerAngle + toeAngle))* + PxTransform( + suspensionParams.wheelAttachment.p, + suspensionParams.wheelAttachment.q*PxVehicleComputeRotation(frame, 0.0f, rotationAngle, 0.0f)); + return wheelLocalPose; +} + + +/** +\brief Compute the pose of the wheel in the rigid body frame. +\param[in] frame describes the longitudinal and lateral axes of the vehicle. +\param[in] suspensionParams describes the suspension and wheel frames. +\param[in] suspensionState is the compression state of the suspenson. +\param[in] suspensionComplianceState is the camber and toe angles induced by suspension compliance. +\param[in] steerAngle is the steer angle in radians applied to the wheel. +\param[in] wheelState is angle around the wheel's lateral axis. +\return The pose of the wheel in the rigid body frame. +*/ +PX_FORCE_INLINE PxTransform PxVehicleComputeWheelLocalPose +(const PxVehicleFrame& frame, + const PxVehicleSuspensionParams& suspensionParams, + const PxVehicleSuspensionState& suspensionState, const PxVehicleSuspensionComplianceState& suspensionComplianceState, + const PxReal steerAngle, + const PxVehicleWheelRigidBody1dState& wheelState) +{ + return PxVehicleComputeWheelLocalPose(frame, suspensionParams, suspensionState, + suspensionComplianceState.camber, suspensionComplianceState.toe, steerAngle, + wheelState.rotationAngle); +} + +/** +\brief Compute the pose of the wheel in the world frame. +\param[in] frame describes the longitudinal and lateral axes of the vehicle. +\param[in] suspensionParams describes the suspension and wheel frames. +\param[in] suspensionState is the compression state of the suspenson. +\param[in] camberAngle is the camber angle in radian induced by suspension compliance. +\param[in] toeAngle is the toe angle in radians induced by suspension compliance. +\param[in] steerAngle is the steer angle in radians applied to the wheel. +\param[in] rigidBodyPose is the pose of the rigid body in the world frame. +\param[in] rotationAngle is the angle around the wheel's lateral axis. +\return The pose of the wheel in the world frame. +*/ +PX_FORCE_INLINE PxTransform PxVehicleComputeWheelPose +(const PxVehicleFrame& frame, + const PxVehicleSuspensionParams& suspensionParams, + const PxVehicleSuspensionState& suspensionState, + const PxReal camberAngle, const PxReal toeAngle, const PxReal steerAngle, + const PxTransform& rigidBodyPose, const PxReal rotationAngle) +{ + const PxTransform wheelPose = rigidBodyPose * PxVehicleComputeWheelLocalPose(frame, suspensionParams, suspensionState, + camberAngle, toeAngle, steerAngle, rotationAngle); + return wheelPose; +} + +/** +\brief Compute the pose of the wheel in the world frame. +\param[in] frame describes the longitudinal and lateral axes of the vehicle. +\param[in] suspensionParams describes the suspension and wheel frames. +\param[in] suspensionState is the compression state of the suspenson. +\param[in] suspensionComplianceState is the camber and toe angles induced by suspension compliance. +\param[in] steerAngle is the steer angle in radians applied to the wheel. +\param[in] rigidBodyPose is the pose of the rigid body in the world frame. +\param[in] wheelState is angle around the wheel's lateral axis. +\return The pose of the wheel in the world frame. +*/ + +PX_FORCE_INLINE PxTransform PxVehicleComputeWheelPose +(const PxVehicleFrame& frame, + const PxVehicleSuspensionParams& suspensionParams, + const PxVehicleSuspensionState& suspensionState, const PxVehicleSuspensionComplianceState& suspensionComplianceState, const PxReal steerAngle, + const PxTransform& rigidBodyPose, const PxVehicleWheelRigidBody1dState& wheelState) +{ + return PxVehicleComputeWheelPose(frame, suspensionParams, suspensionState, + suspensionComplianceState.camber, suspensionComplianceState.toe, steerAngle, + rigidBodyPose, wheelState.rotationAngle); +} + +/** +\brief Check if the suspension could place the wheel on the ground or not. + +\param[in] suspState The state of the suspension to check. +\return True if the wheel connects to the ground, else false. + +@see PxVehicleSuspensionState +*/ +PX_FORCE_INLINE bool PxVehicleIsWheelOnGround(const PxVehicleSuspensionState& suspState) +{ + return (suspState.separation <= 0.0f); +} + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/PhysX/vehicle2/wheel/PxVehicleWheelParams.h b/Source/ThirdParty/PhysX/vehicle2/wheel/PxVehicleWheelParams.h new file mode 100644 index 000000000..016f0ccfd --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/wheel/PxVehicleWheelParams.h @@ -0,0 +1,119 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxFoundation.h" + +#include "vehicle2/PxVehicleParams.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +struct PxVehicleWheelParams +{ + /** + \brief Radius of unit that includes metal wheel plus rubber tire. + + Range: (0, inf)
+ Unit: length + */ + PxReal radius; + + /** + \brief Half-width of unit that includes wheel plus tire. + + Range: (0, inf)
+ Unit: length + */ + PxReal halfWidth; + + /** + \brief Mass of unit that includes wheel plus tire. + + Range: (0, inf)
+ Unit: mass + */ + PxReal mass; + + /** + \brief Moment of inertia of unit that includes wheel plus tire about the rolling axis. + + Range: (0, inf)
+ Unit: mass * (length^2) + */ + PxReal moi; + + /** + \brief Damping rate applied to wheel. + + Range: [0, inf)
+ Unit: torque * time = mass * (length^2) / time + */ + PxReal dampingRate; + + PX_FORCE_INLINE PxVehicleWheelParams transformAndScale( + const PxVehicleFrame& srcFrame, const PxVehicleFrame& trgFrame, const PxVehicleScale& srcScale, const PxVehicleScale& trgScale) const + { + PX_UNUSED(srcFrame); + PX_UNUSED(trgFrame); + PxVehicleWheelParams r = *this; + const PxReal scale = trgScale.scale/srcScale.scale; + r.radius *= scale; + r.halfWidth *= scale; + r.moi *= (scale*scale); + r.dampingRate *= (scale*scale); + return r; + } + + PX_FORCE_INLINE bool isValid() const + { + PX_CHECK_AND_RETURN_VAL(radius > 0.0f, "PxVehicleWheelParams.radius must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(halfWidth > 0.0f, "PxVehicleWheelParams.halfWidth must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(mass > 0.0f, "PxVehicleWheelParams.mass must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(moi > 0.0f, "PxVehicleWheelParams.moi must be greater than zero", false); + PX_CHECK_AND_RETURN_VAL(dampingRate >= 0.0f, "PxVehicleWheelParams.dampingRate must be greater than or equal to zero", false); + return true; + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ + diff --git a/Source/ThirdParty/PhysX/vehicle2/wheel/PxVehicleWheelStates.h b/Source/ThirdParty/PhysX/vehicle2/wheel/PxVehicleWheelStates.h new file mode 100644 index 000000000..01b28d227 --- /dev/null +++ b/Source/ThirdParty/PhysX/vehicle2/wheel/PxVehicleWheelStates.h @@ -0,0 +1,108 @@ +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Copyright (c) 2008-2023 NVIDIA Corporation. All rights reserved. +// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved. +// Copyright (c) 2001-2004 NovodeX AG. All rights reserved. + +#pragma once + +/** \addtogroup vehicle2 + @{ +*/ + +#include "foundation/PxSimpleTypes.h" +#include "foundation/PxTransform.h" +#include "foundation/PxMemory.h" + +#if !PX_DOXYGEN +namespace physx +{ +namespace vehicle2 +{ +#endif + +/** +\brief It is useful to know if a brake or drive torque is to be applied to a wheel. +*/ +struct PxVehicleWheelActuationState +{ + bool isBrakeApplied; //!< True if a brake torque is applied, false if not. + bool isDriveApplied; //!< True if a drive torque is applied, false if not. + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleWheelActuationState)); + } +}; + +struct PxVehicleWheelRigidBody1dState +{ + /** + \brief The rotation speed of the wheel around the lateral axis. + + Unit: radians / time + */ + PxReal rotationSpeed; + + /** + \brief The corrected rotation speed of the wheel around the lateral axis in radians per second. + + At low forward wheel speed, the wheel rotation speed can get unstable (depending on the tire + model used) and, for example, oscillate. To integrate the wheel rotation angle, a (potentially) + blended rotation speed is used which gets stored in #correctedRotationSpeed. + + Unit: radians / time + + @see PxVehicleSimulationContext::thresholdForwardSpeedForWheelAngleIntegration + */ + PxReal correctedRotationSpeed; + + /** + \brief The accumulated angle of the wheel around the lateral axis in radians in range (-2*Pi,2*Pi) + */ + PxReal rotationAngle; + + PX_FORCE_INLINE void setToDefault() + { + PxMemZero(this, sizeof(PxVehicleWheelRigidBody1dState)); + } +}; + +struct PxVehicleWheelLocalPose +{ + PxTransform localPose; //!< The pose of the wheel in the rigid body frame. + + PX_FORCE_INLINE void setToDefault() + { + localPose = PxTransform(PxIdentity); + } +}; + +#if !PX_DOXYGEN +} // namespace vehicle2 +} // namespace physx +#endif + +/** @} */ diff --git a/Source/ThirdParty/enet/enet.h b/Source/ThirdParty/enet/enet.h index 2357e8488..7386d1fa5 100644 --- a/Source/ThirdParty/enet/enet.h +++ b/Source/ThirdParty/enet/enet.h @@ -5002,7 +5002,7 @@ extern "C" { tv->tv_nsec = t.QuadPart % 1000000 * 1000; return (0); } - #elif __APPLE__ && __MAC_OS_X_VERSION_MIN_REQUIRED < 101200 + #elif __APPLE__ && defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101200 #define CLOCK_MONOTONIC 0 int clock_gettime(int X, struct timespec *ts) { diff --git a/Source/ThirdParty/fmt/core.h b/Source/ThirdParty/fmt/core.h index 7d2686a50..a8b208508 100644 --- a/Source/ThirdParty/fmt/core.h +++ b/Source/ThirdParty/fmt/core.h @@ -1,4 +1,4 @@ -// Formatting library for C++ - the core API +// Formatting library for C++ - the core API for char/UTF-8 // // Copyright (c) 2012 - present, Victor Zverovich // All rights reserved. @@ -8,29 +8,38 @@ #ifndef FMT_CORE_H_ #define FMT_CORE_H_ -// Custom configuration for Flax +/* +Customizations done to fmt lib: +- Expose fmt within Flax DLL +- Use Flax utilities instead of std (eg. string length util, assert) +- Remove: dynamic args, chrono, colors, printf, ranges, os +- Remove file-related api +- Reduce `std` library usage (including `std::string`) +- Disable literal-based api +- Disable compile-time formatting +- Move `bigint`, `format_float` to internal api +- Remove `fmt::ptr`, `fmt::vformat_to_n`, `fmt::print`, `fmt::underlying`, `fmt::to_string`, `fmt::join` +*/ #include "Engine/Platform/Platform.h" #include "Engine/Platform/StringUtils.h" #include "Engine/Core/Templates.h" #include "Engine/Core/Memory/StlWrapper.h" -#define FMT_USE_CONSTEXPR11 0 +#define FMT_USE_CONSTEXPR 0 +#define FMT_CONSTEXPR_CHAR_TRAITS +#define FMT_USE_COMPILE_TIME 0 #define FMT_USE_USER_DEFINED_LITERALS 0 -#define FMT_USE_WINDOWS_H 0 -//#define FMT_USE_STRING_VIEW 1 #define FMT_USE_STRING 0 #define FMT_USE_LONG_DOUBLE 0 #define FMT_USE_ITERATOR 0 #define FMT_USE_LOCALE_GROUPING 0 #define FMT_EXCEPTIONS 0 #if ENABLE_ASSERTION -#define FMT_ASSERT(condition, message) \ - if (!(condition)) \ - { \ - Platform::Assert(message, __FILE__, __LINE__); \ - } +#define FMT_ASSERT(condition, message) if (!(condition)) { Platform::Assert(message, __FILE__, __LINE__); } #else #define FMT_ASSERT(condition, message) ((void)0) #endif +#define FMT_THROW(x) do { static_cast(sizeof(x)); FMT_ASSERT(false, ""); } while (false) +#define FMT_THROW_FORMAT_ERROR(x) Platform::Assert(x, __FILE__, __LINE__) #define FMT_API FLAXENGINE_API #if FMT_USE_ITERATOR @@ -101,13 +110,61 @@ protected: } #endif +#ifndef FMT_USE_STRING +#define FMT_USE_STRING 1 +#endif + #if FMT_USE_STRING #include #endif #include // The fmt library version in the form major * 10000 + minor * 100 + patch. -#define FMT_VERSION 60201 +#define FMT_VERSION 90100 + +#if defined(__clang__) && !defined(__ibmxl__) +# define FMT_CLANG_VERSION (__clang_major__ * 100 + __clang_minor__) +#else +# define FMT_CLANG_VERSION 0 +#endif + +#if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER) && \ + !defined(__NVCOMPILER) +# define FMT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) +#else +# define FMT_GCC_VERSION 0 +#endif + +#ifndef FMT_GCC_PRAGMA +// Workaround _Pragma bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59884. +# if FMT_GCC_VERSION >= 504 +# define FMT_GCC_PRAGMA(arg) _Pragma(arg) +# else +# define FMT_GCC_PRAGMA(arg) +# endif +#endif + +#ifdef __ICL +# define FMT_ICC_VERSION __ICL +#elif defined(__INTEL_COMPILER) +# define FMT_ICC_VERSION __INTEL_COMPILER +#else +# define FMT_ICC_VERSION 0 +#endif + +#ifdef _MSC_VER +# define FMT_MSC_VERSION _MSC_VER +# define FMT_MSC_WARNING(...) __pragma(warning(__VA_ARGS__)) +#else +# define FMT_MSC_VERSION 0 +# define FMT_MSC_WARNING(...) +#endif + +#ifdef _MSVC_LANG +# define FMT_CPLUSPLUS _MSVC_LANG +#else +# define FMT_CPLUSPLUS __cplusplus +#endif #ifdef __has_feature # define FMT_HAS_FEATURE(x) __has_feature(x) @@ -115,8 +172,9 @@ protected: # define FMT_HAS_FEATURE(x) 0 #endif -#if defined(__has_include) && !defined(__INTELLISENSE__) && \ - !(defined(__INTEL_COMPILER) && __INTEL_COMPILER < 1600) +#if (defined(__has_include) || FMT_ICC_VERSION >= 1600 || \ + FMT_MSC_VERSION > 1900) && \ + !defined(__INTELLISENSE__) # define FMT_HAS_INCLUDE(x) __has_include(x) #else # define FMT_HAS_INCLUDE(x) 0 @@ -129,122 +187,69 @@ protected: #endif #define FMT_HAS_CPP14_ATTRIBUTE(attribute) \ - (__cplusplus >= 201402L && FMT_HAS_CPP_ATTRIBUTE(attribute)) + (FMT_CPLUSPLUS >= 201402L && FMT_HAS_CPP_ATTRIBUTE(attribute)) #define FMT_HAS_CPP17_ATTRIBUTE(attribute) \ - (__cplusplus >= 201703L && FMT_HAS_CPP_ATTRIBUTE(attribute)) - -#ifdef __clang__ -# define FMT_CLANG_VERSION (__clang_major__ * 100 + __clang_minor__) -#else -# define FMT_CLANG_VERSION 0 -#endif - -#if defined(__GNUC__) && !defined(__clang__) -# define FMT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) -#else -# define FMT_GCC_VERSION 0 -#endif - -#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) -# define FMT_HAS_GXX_CXX11 FMT_GCC_VERSION -#else -# define FMT_HAS_GXX_CXX11 0 -#endif - -#ifdef __NVCC__ -# define FMT_NVCC __NVCC__ -#else -# define FMT_NVCC 0 -#endif - -#ifdef _MSC_VER -# define FMT_MSC_VER _MSC_VER -#else -# define FMT_MSC_VER 0 -#endif + (FMT_CPLUSPLUS >= 201703L && FMT_HAS_CPP_ATTRIBUTE(attribute)) // Check if relaxed C++14 constexpr is supported. // GCC doesn't allow throw in constexpr until version 6 (bug 67371). #ifndef FMT_USE_CONSTEXPR -# define FMT_USE_CONSTEXPR \ - (FMT_HAS_FEATURE(cxx_relaxed_constexpr) || FMT_MSC_VER >= 1910 || \ - (FMT_GCC_VERSION >= 600 && __cplusplus >= 201402L)) && \ - !FMT_NVCC +# if (FMT_HAS_FEATURE(cxx_relaxed_constexpr) || FMT_MSC_VERSION >= 1912 || \ + (FMT_GCC_VERSION >= 600 && FMT_CPLUSPLUS >= 201402L)) && \ + !FMT_ICC_VERSION && !defined(__NVCC__) +# define FMT_USE_CONSTEXPR 1 +# else +# define FMT_USE_CONSTEXPR 0 +# endif #endif #if FMT_USE_CONSTEXPR # define FMT_CONSTEXPR constexpr -# define FMT_CONSTEXPR_DECL constexpr #else -# define FMT_CONSTEXPR inline -# define FMT_CONSTEXPR_DECL +# define FMT_CONSTEXPR #endif -#ifndef FMT_OVERRIDE -# if FMT_HAS_FEATURE(cxx_override) || \ - (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1900 -# define FMT_OVERRIDE override -# else -# define FMT_OVERRIDE +#if ((FMT_CPLUSPLUS >= 202002L) && \ + (!defined(_GLIBCXX_RELEASE) || _GLIBCXX_RELEASE > 9)) || \ + (FMT_CPLUSPLUS >= 201709L && FMT_GCC_VERSION >= 1002) +# define FMT_CONSTEXPR20 constexpr +#else +# define FMT_CONSTEXPR20 +#endif + +// Check if constexpr std::char_traits<>::{compare,length} are supported. +#if defined(__GLIBCXX__) +# if FMT_CPLUSPLUS >= 201703L && defined(_GLIBCXX_RELEASE) && \ + _GLIBCXX_RELEASE >= 7 // GCC 7+ libstdc++ has _GLIBCXX_RELEASE. +# define FMT_CONSTEXPR_CHAR_TRAITS constexpr # endif +#elif defined(_LIBCPP_VERSION) && FMT_CPLUSPLUS >= 201703L && \ + _LIBCPP_VERSION >= 4000 +# define FMT_CONSTEXPR_CHAR_TRAITS constexpr +#elif FMT_MSC_VERSION >= 1914 && FMT_CPLUSPLUS >= 201703L +# define FMT_CONSTEXPR_CHAR_TRAITS constexpr +#endif +#ifndef FMT_CONSTEXPR_CHAR_TRAITS +# define FMT_CONSTEXPR_CHAR_TRAITS #endif // Check if exceptions are disabled. #ifndef FMT_EXCEPTIONS # if (defined(__GNUC__) && !defined(__EXCEPTIONS)) || \ - FMT_MSC_VER && !_HAS_EXCEPTIONS + (FMT_MSC_VERSION && !_HAS_EXCEPTIONS) # define FMT_EXCEPTIONS 0 # else # define FMT_EXCEPTIONS 1 # endif #endif -// Define FMT_USE_NOEXCEPT to make fmt use noexcept (C++11 feature). -#ifndef FMT_USE_NOEXCEPT -# define FMT_USE_NOEXCEPT 0 -#endif - -#if FMT_USE_NOEXCEPT || FMT_HAS_FEATURE(cxx_noexcept) || \ - (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1900 -# define FMT_DETECTED_NOEXCEPT noexcept -# define FMT_HAS_CXX11_NOEXCEPT 1 -#else -# define FMT_DETECTED_NOEXCEPT throw() -# define FMT_HAS_CXX11_NOEXCEPT 0 -#endif - -#ifndef FMT_NOEXCEPT -# if FMT_EXCEPTIONS || FMT_HAS_CXX11_NOEXCEPT -# define FMT_NOEXCEPT FMT_DETECTED_NOEXCEPT -# else -# define FMT_NOEXCEPT -# endif -#endif - -// [[noreturn]] is disabled on MSVC and NVCC because of bogus unreachable code -// warnings. -#if FMT_EXCEPTIONS && FMT_HAS_CPP_ATTRIBUTE(noreturn) && !FMT_MSC_VER && \ - !FMT_NVCC -# define FMT_NORETURN [[noreturn]] -#else -# define FMT_NORETURN -#endif - -#ifndef FMT_MAYBE_UNUSED -# if FMT_HAS_CPP17_ATTRIBUTE(maybe_unused) -# define FMT_MAYBE_UNUSED [[maybe_unused]] -# else -# define FMT_MAYBE_UNUSED -# endif -#endif - #ifndef FMT_DEPRECATED -# if FMT_HAS_CPP14_ATTRIBUTE(deprecated) || FMT_MSC_VER >= 1900 +# if FMT_HAS_CPP14_ATTRIBUTE(deprecated) || FMT_MSC_VERSION >= 1900 # define FMT_DEPRECATED [[deprecated]] # else -# if defined(__GNUC__) || defined(__clang__) +# if (defined(__GNUC__) && !defined(__LCC__)) || defined(__clang__) # define FMT_DEPRECATED __attribute__((deprecated)) -# elif FMT_MSC_VER +# elif FMT_MSC_VERSION # define FMT_DEPRECATED __declspec(deprecated) # else # define FMT_DEPRECATED /* deprecated */ @@ -252,97 +257,149 @@ protected: # endif #endif -// Workaround broken [[deprecated]] in the Intel, PGI and NVCC compilers. -#if defined(__INTEL_COMPILER) || defined(__PGI) || FMT_NVCC -# define FMT_DEPRECATED_ALIAS +// [[noreturn]] is disabled on MSVC and NVCC because of bogus unreachable code +// warnings. +#if FMT_EXCEPTIONS && FMT_HAS_CPP_ATTRIBUTE(noreturn) && !FMT_MSC_VERSION && \ + !defined(__NVCC__) +# define FMT_NORETURN [[noreturn]] #else -# define FMT_DEPRECATED_ALIAS FMT_DEPRECATED +# define FMT_NORETURN +#endif + +#if FMT_HAS_CPP17_ATTRIBUTE(fallthrough) +# define FMT_FALLTHROUGH [[fallthrough]] +#elif defined(__clang__) +# define FMT_FALLTHROUGH [[clang::fallthrough]] +#elif FMT_GCC_VERSION >= 700 && \ + (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= 520) +# define FMT_FALLTHROUGH [[gnu::fallthrough]] +#else +# define FMT_FALLTHROUGH +#endif + +#ifndef FMT_NODISCARD +# if FMT_HAS_CPP17_ATTRIBUTE(nodiscard) +# define FMT_NODISCARD [[nodiscard]] +# else +# define FMT_NODISCARD +# endif +#endif + +#ifndef FMT_USE_FLOAT +# define FMT_USE_FLOAT 1 +#endif +#ifndef FMT_USE_DOUBLE +# define FMT_USE_DOUBLE 1 +#endif +#ifndef FMT_USE_LONG_DOUBLE +# define FMT_USE_LONG_DOUBLE 1 +#endif + +#ifndef FMT_INLINE +# if FMT_GCC_VERSION || FMT_CLANG_VERSION +# define FMT_INLINE inline __attribute__((always_inline)) +# else +# define FMT_INLINE inline +# endif +#endif + +// An inline std::forward replacement. +#define FMT_FORWARD(...) static_cast(__VA_ARGS__) + +#ifdef _MSC_VER +# define FMT_UNCHECKED_ITERATOR(It) \ + using _Unchecked_type = It // Mark iterator as checked. +#else +# define FMT_UNCHECKED_ITERATOR(It) using unchecked_type = It #endif #ifndef FMT_BEGIN_NAMESPACE -# if FMT_HAS_FEATURE(cxx_inline_namespaces) || FMT_GCC_VERSION >= 404 || \ - FMT_MSC_VER >= 1900 -# define FMT_INLINE_NAMESPACE inline namespace -# define FMT_END_NAMESPACE \ - } \ - } -# else -# define FMT_INLINE_NAMESPACE namespace -# define FMT_END_NAMESPACE \ - } \ - using namespace v6; \ - } -# endif # define FMT_BEGIN_NAMESPACE \ namespace fmt { \ - FMT_INLINE_NAMESPACE v6 { + inline namespace v9 { +# define FMT_END_NAMESPACE \ + } \ + } +#endif + +#ifndef FMT_MODULE_EXPORT +# define FMT_MODULE_EXPORT +# define FMT_MODULE_EXPORT_BEGIN +# define FMT_MODULE_EXPORT_END +# define FMT_BEGIN_DETAIL_NAMESPACE namespace detail { +# define FMT_END_DETAIL_NAMESPACE } #endif #if !defined(FMT_HEADER_ONLY) && defined(_WIN32) -# if FMT_MSC_VER -# define FMT_NO_W4275 __pragma(warning(suppress : 4275)) -# else -# define FMT_NO_W4275 -# endif -# define FMT_CLASS_API FMT_NO_W4275 +# define FMT_CLASS_API FMT_MSC_WARNING(suppress : 4275) # ifdef FMT_EXPORT # define FMT_API __declspec(dllexport) # elif defined(FMT_SHARED) # define FMT_API __declspec(dllimport) -# define FMT_EXTERN_TEMPLATE_API FMT_API # endif -#endif -#ifndef FMT_CLASS_API +#else # define FMT_CLASS_API +# if defined(FMT_EXPORT) || defined(FMT_SHARED) +# if defined(__GNUC__) || defined(__clang__) +# define FMT_API __attribute__((visibility("default"))) +# endif +# endif #endif #ifndef FMT_API -# if FMT_GCC_VERSION || FMT_CLANG_VERSION -# define FMT_API __attribute__((visibility("default"))) -# define FMT_EXTERN_TEMPLATE_API FMT_API -# define FMT_INSTANTIATION_DEF_API -# else -# define FMT_API -# endif -#endif -#ifndef FMT_EXTERN_TEMPLATE_API -# define FMT_EXTERN_TEMPLATE_API -#endif -#ifndef FMT_INSTANTIATION_DEF_API -# define FMT_INSTANTIATION_DEF_API FMT_API -#endif - -#ifndef FMT_HEADER_ONLY -# define FMT_EXTERN extern -#else -# define FMT_EXTERN +# define FMT_API #endif // libc++ supports string_view in pre-c++17. -#if (FMT_HAS_INCLUDE() && \ - (__cplusplus > 201402L || defined(_LIBCPP_VERSION))) || \ - (defined(_MSVC_LANG) && _MSVC_LANG > 201402L && _MSC_VER >= 1910) +#if FMT_HAS_INCLUDE() && \ + (FMT_CPLUSPLUS >= 201703L || defined(_LIBCPP_VERSION)) # include # define FMT_USE_STRING_VIEW -#elif FMT_HAS_INCLUDE("experimental/string_view") && __cplusplus >= 201402L +#elif FMT_HAS_INCLUDE("experimental/string_view") && FMT_CPLUSPLUS >= 201402L # include # define FMT_USE_EXPERIMENTAL_STRING_VIEW #endif #ifndef FMT_UNICODE -# define FMT_UNICODE !FMT_MSC_VER -#endif -#if FMT_UNICODE && FMT_MSC_VER -# pragma execution_character_set("utf-8") +# define FMT_UNICODE !FMT_MSC_VERSION #endif -#define FMT_THROW_FORMAT_ERROR(x) FMT_THROW(x) +#ifndef FMT_CONSTEVAL +# if ((FMT_GCC_VERSION >= 1000 || FMT_CLANG_VERSION >= 1101) && \ + FMT_CPLUSPLUS >= 202002L && !defined(__apple_build_version__)) || \ + (defined(__cpp_consteval) && \ + (!FMT_MSC_VERSION || _MSC_FULL_VER >= 193030704)) +// consteval is broken in MSVC before VS2022 and Apple clang 13. +# define FMT_CONSTEVAL consteval +# define FMT_HAS_CONSTEVAL +# else +# define FMT_CONSTEVAL +# endif +#endif + +#ifndef FMT_USE_NONTYPE_TEMPLATE_ARGS +# if defined(__cpp_nontype_template_args) && \ + ((FMT_GCC_VERSION >= 903 && FMT_CPLUSPLUS >= 201709L) || \ + __cpp_nontype_template_args >= 201911L) && \ + !defined(__NVCOMPILER) +# define FMT_USE_NONTYPE_TEMPLATE_ARGS 1 +# else +# define FMT_USE_NONTYPE_TEMPLATE_ARGS 0 +# endif +#endif + +// Enable minimal optimizations for more compact code in debug mode. +FMT_GCC_PRAGMA("GCC push_options") +#if !defined(__OPTIMIZE__) && !defined(__NVCOMPILER) +FMT_GCC_PRAGMA("GCC optimize(\"Og\")") +#endif FMT_BEGIN_NAMESPACE +FMT_MODULE_EXPORT_BEGIN // Implementations of enable_if_t and other metafunctions for older systems. -template +template using enable_if_t = typename std::enable_if::type; -template +template using conditional_t = typename std::conditional::type; template using bool_constant = std::integral_constant; template @@ -353,26 +410,55 @@ template using remove_cvref_t = typename std::remove_cv>::type; template struct type_identity { using type = T; }; template using type_identity_t = typename type_identity::type; +template +using underlying_t = typename std::underlying_type::type; -struct monostate {}; +template struct disjunction : std::false_type {}; +template struct disjunction

: P {}; +template +struct disjunction + : conditional_t> {}; + +template struct conjunction : std::true_type {}; +template struct conjunction

: P {}; +template +struct conjunction + : conditional_t, P1> {}; + +struct monostate { + constexpr monostate() {} +}; // An enable_if helper to be used in template parameters which results in much // shorter symbols: https://godbolt.org/z/sWw4vP. Extra parentheses are needed // to workaround a bug in MSVC 2019 (see #1140 and #1186). -#define FMT_ENABLE_IF(...) enable_if_t<(__VA_ARGS__), int> = 0 +#ifdef FMT_DOC +# define FMT_ENABLE_IF(...) +#else +# define FMT_ENABLE_IF(...) enable_if_t<(__VA_ARGS__), int> = 0 +#endif -namespace internal { -template -typename Allocator::value_type *allocate(Allocator& alloc, std::size_t n) { - return alloc.allocate(n); +FMT_BEGIN_DETAIL_NAMESPACE + +// Suppresses "unused variable" warnings with the method described in +// https://herbsutter.com/2009/10/18/mailbag-shutting-up-compiler-warnings/. +// (void)var does not work on many Intel compilers. +template FMT_CONSTEXPR void ignore_unused(const T&...) {} + +constexpr FMT_INLINE auto is_constant_evaluated( + bool default_value = false) noexcept -> bool { +#ifdef __cpp_lib_is_constant_evaluated + ignore_unused(default_value); + return std::is_constant_evaluated(); +#else + return default_value; +#endif } -// A helper function to suppress bogus "conditional expression is constant" -// warnings. -template FMT_CONSTEXPR T const_check(T value) { return value; } - -// A workaround for gcc 4.8 to make void_t work in a SFINAE context. -template struct void_t_impl { using type = void; }; +// Suppresses "conditional expression is constant" warnings. +template constexpr FMT_INLINE auto const_check(T value) -> T { + return value; +} #if defined(FMT_USE_STRING_VIEW) template using std_string_view = std::basic_string_view; @@ -385,28 +471,41 @@ template struct std_string_view {}; #ifdef FMT_USE_INT128 // Do nothing. -#elif defined(__SIZEOF_INT128__) && !FMT_NVCC +#elif defined(__SIZEOF_INT128__) && !defined(__NVCC__) && \ + !(FMT_CLANG_VERSION && FMT_MSC_VERSION) # define FMT_USE_INT128 1 -using int128_t = __int128_t; -using uint128_t = __uint128_t; +using int128_opt = __int128_t; // An optional native 128-bit integer. +using uint128_opt = __uint128_t; +template inline auto convert_for_visit(T value) -> T { + return value; +} #else # define FMT_USE_INT128 0 #endif #if !FMT_USE_INT128 -struct int128_t {}; -struct uint128_t {}; +enum class int128_opt {}; +enum class uint128_opt {}; +// Reduce template instantiations. +template auto convert_for_visit(T) -> monostate { return {}; } #endif // Casts a nonnegative integer to unsigned. template -FMT_CONSTEXPR typename std::make_unsigned::type to_unsigned(Int value) { - FMT_ASSERT(value >= 0, "negative value"); +FMT_CONSTEXPR auto to_unsigned(Int value) -> + typename std::make_unsigned::type { + FMT_ASSERT(std::is_unsigned::value || value >= 0, "negative value"); return static_cast::type>(value); } -} // namespace internal -template -using void_t = typename internal::void_t_impl::type; +FMT_MSC_WARNING(suppress : 4566) constexpr unsigned char micro[] = "\u00B5"; + +constexpr auto is_utf8() -> bool { + // Avoid buggy sign extensions in MSVC's constant evaluation mode (#2297). + using uchar = unsigned char; + return FMT_UNICODE || (sizeof(micro) == 3 && uchar(micro[0]) == 0xC2 && + uchar(micro[1]) == 0xB5); +} +FMT_END_DETAIL_NAMESPACE /** An implementation of ``std::basic_string_view`` for pre-C++17. It provides a @@ -424,58 +523,56 @@ template class basic_string_view { using value_type = Char; using iterator = const Char*; - FMT_CONSTEXPR basic_string_view() FMT_NOEXCEPT : data_(nullptr), size_(0) {} + constexpr basic_string_view() noexcept : data_(nullptr), size_(0) {} /** Constructs a string reference object from a C string and a size. */ - FMT_CONSTEXPR basic_string_view(const Char* s, size_t count) FMT_NOEXCEPT - : data_(s), - size_(count) {} + constexpr basic_string_view(const Char* s, size_t count) noexcept + : data_(s), size_(count) {} /** \rst Constructs a string reference object from a C string computing - the size with ``std::char_traits::length``. + the size with ``StringUtils::Length``. \endrst */ -#if __cplusplus >= 201703L // C++17's char_traits::length() is constexpr. - FMT_CONSTEXPR -#endif + FMT_CONSTEXPR_CHAR_TRAITS + FMT_INLINE basic_string_view(const Char* s) - : data_(s), size_(StringUtils::Length(s)) {} + : data_(s), + size_(StringUtils::Length(s)) {} #if FMT_USE_STRING /** Constructs a string reference from a ``std::basic_string`` object. */ template FMT_CONSTEXPR basic_string_view( - const std::basic_string& s) FMT_NOEXCEPT - : data_(s.data()), - size_(s.size()) {} + const std::basic_string& s) noexcept + : data_(s.data()), size_(s.size()) {} #endif - - template < - typename S, - FMT_ENABLE_IF(std::is_same>::value)> - FMT_CONSTEXPR basic_string_view(S s) FMT_NOEXCEPT : data_(s.data()), - size_(s.size()) {} + template >::value)> + FMT_CONSTEXPR basic_string_view(S s) noexcept + : data_(s.data()), size_(s.size()) {} /** Returns a pointer to the string data. */ - FMT_CONSTEXPR const Char* data() const { return data_; } + constexpr auto data() const noexcept -> const Char* { return data_; } /** Returns the string size. */ - FMT_CONSTEXPR size_t size() const { return size_; } + constexpr auto size() const noexcept -> size_t { return size_; } - FMT_CONSTEXPR iterator begin() const { return data_; } - FMT_CONSTEXPR iterator end() const { return data_ + size_; } + constexpr auto begin() const noexcept -> iterator { return data_; } + constexpr auto end() const noexcept -> iterator { return data_ + size_; } - FMT_CONSTEXPR const Char& operator[](size_t pos) const { return data_[pos]; } + constexpr auto operator[](size_t pos) const noexcept -> const Char& { + return data_[pos]; + } - FMT_CONSTEXPR void remove_prefix(size_t n) { + FMT_CONSTEXPR void remove_prefix(size_t n) noexcept { data_ += n; size_ -= n; } // Lexicographically compare this string reference to other. - int compare(basic_string_view other) const { + FMT_CONSTEXPR_CHAR_TRAITS auto compare(basic_string_view other) const -> int { size_t str_size = size_ < other.size_ ? size_ : other.size_; int result = StringUtils::Compare(data_, other.data_, (int32)str_size); if (result == 0) @@ -483,96 +580,81 @@ template class basic_string_view { return result; } - friend bool operator==(basic_string_view lhs, basic_string_view rhs) { + FMT_CONSTEXPR_CHAR_TRAITS friend auto operator==(basic_string_view lhs, + basic_string_view rhs) + -> bool { return lhs.compare(rhs) == 0; } - friend bool operator!=(basic_string_view lhs, basic_string_view rhs) { + friend auto operator!=(basic_string_view lhs, basic_string_view rhs) -> bool { return lhs.compare(rhs) != 0; } - friend bool operator<(basic_string_view lhs, basic_string_view rhs) { + friend auto operator<(basic_string_view lhs, basic_string_view rhs) -> bool { return lhs.compare(rhs) < 0; } - friend bool operator<=(basic_string_view lhs, basic_string_view rhs) { + friend auto operator<=(basic_string_view lhs, basic_string_view rhs) -> bool { return lhs.compare(rhs) <= 0; } - friend bool operator>(basic_string_view lhs, basic_string_view rhs) { + friend auto operator>(basic_string_view lhs, basic_string_view rhs) -> bool { return lhs.compare(rhs) > 0; } - friend bool operator>=(basic_string_view lhs, basic_string_view rhs) { + friend auto operator>=(basic_string_view lhs, basic_string_view rhs) -> bool { return lhs.compare(rhs) >= 0; } }; using string_view = basic_string_view; -using wstring_view = basic_string_view; /** Specifies if ``T`` is a character type. Can be specialized by users. */ template struct is_char : std::false_type {}; template <> struct is_char : std::true_type {}; template <> struct is_char : std::true_type {}; +#ifdef __cpp_char8_t +template <> struct is_char : std::true_type {}; +#endif template <> struct is_char : std::true_type {}; template <> struct is_char : std::true_type {}; -/** - \rst - Returns a string view of `s`. In order to add custom string type support to - {fmt} provide an overload of `to_string_view` for it in the same namespace as - the type for the argument-dependent lookup to work. +FMT_BEGIN_DETAIL_NAMESPACE - **Example**:: - - namespace my_ns { - inline string_view to_string_view(const my_string& s) { - return {s.data(), s.length()}; - } - } - std::string message = fmt::format(my_string("The answer is {}"), 42); - \endrst - */ -template ::value)> -inline basic_string_view to_string_view(const Char* s) { - return s; -} - -#if FMT_USE_STRING -template -inline basic_string_view to_string_view( - const std::basic_string& s) { - return s; -} -#endif - -template -inline basic_string_view to_string_view(basic_string_view s) { - return s; -} - -template >::value)> -inline basic_string_view to_string_view( - internal::std_string_view s) { - return s; -} - -// A base class for compile-time strings. It is defined in the fmt namespace to -// make formatting functions visible via ADL, e.g. format(fmt("{}"), 42). +// A base class for compile-time strings. struct compile_string {}; template struct is_compile_string : std::is_base_of {}; -template ::value)> -constexpr basic_string_view to_string_view(const S& s) { +// Returns a string view of `s`. +template ::value)> +FMT_INLINE auto to_string_view(const Char* s) -> basic_string_view { return s; } - -namespace internal { +#if FMT_USE_STRING +template +inline auto to_string_view(const std::basic_string& s) + -> basic_string_view { + return s; +} +#endif +template +constexpr auto to_string_view(basic_string_view s) + -> basic_string_view { + return s; +} +template >::value)> +inline auto to_string_view(std_string_view s) -> basic_string_view { + return s; +} +template ::value)> +constexpr auto to_string_view(const S& s) + -> basic_string_view { + return basic_string_view(s); +} void to_string_view(...); -using fmt::v6::to_string_view; // Specifies whether S is a string type convertible to fmt::basic_string_view. // It should be a constexpr function but MSVC 2017 fails to compile it in // enable_if and MSVC 2015 fails to compile it as an alias template. +// ADL invocation of to_string_view is DEPRECATED! template struct is_string : std::is_class()))> { }; @@ -583,242 +665,8 @@ template struct char_t_impl::value>> { using type = typename result::value_type; }; -struct error_handler { - FMT_CONSTEXPR error_handler() = default; - FMT_CONSTEXPR error_handler(const error_handler&) = default; - - // This function is intentionally not constexpr to give a compile-time error. - FMT_NORETURN FMT_API void on_error(const char* message); -}; -} // namespace internal - -/** String's character type. */ -template using char_t = typename internal::char_t_impl::type; - -/** - \rst - Parsing context consisting of a format string range being parsed and an - argument counter for automatic indexing. - - You can use one of the following type aliases for common character types: - - +-----------------------+-------------------------------------+ - | Type | Definition | - +=======================+=====================================+ - | format_parse_context | basic_format_parse_context | - +-----------------------+-------------------------------------+ - | wformat_parse_context | basic_format_parse_context | - +-----------------------+-------------------------------------+ - \endrst - */ -template -class basic_format_parse_context : private ErrorHandler { - private: - basic_string_view format_str_; - int next_arg_id_; - - public: - using char_type = Char; - using iterator = typename basic_string_view::iterator; - - explicit FMT_CONSTEXPR basic_format_parse_context( - basic_string_view format_str, ErrorHandler eh = ErrorHandler()) - : ErrorHandler(eh), format_str_(format_str), next_arg_id_(0) {} - - /** - Returns an iterator to the beginning of the format string range being - parsed. - */ - FMT_CONSTEXPR iterator begin() const FMT_NOEXCEPT { - return format_str_.begin(); - } - - /** - Returns an iterator past the end of the format string range being parsed. - */ - FMT_CONSTEXPR iterator end() const FMT_NOEXCEPT { return format_str_.end(); } - - /** Advances the begin iterator to ``it``. */ - FMT_CONSTEXPR void advance_to(iterator it) { - format_str_.remove_prefix(internal::to_unsigned(it - begin())); - } - - /** - Reports an error if using the manual argument indexing; otherwise returns - the next argument index and switches to the automatic indexing. - */ - FMT_CONSTEXPR int next_arg_id() { - if (next_arg_id_ >= 0) return next_arg_id_++; - on_error("cannot switch from manual to automatic argument indexing"); - return 0; - } - - /** - Reports an error if using the automatic argument indexing; otherwise - switches to the manual indexing. - */ - FMT_CONSTEXPR void check_arg_id(int) { - if (next_arg_id_ > 0) - on_error("cannot switch from automatic to manual argument indexing"); - else - next_arg_id_ = -1; - } - - FMT_CONSTEXPR void check_arg_id(basic_string_view) {} - - FMT_CONSTEXPR void on_error(const char* message) { - ErrorHandler::on_error(message); - } - - FMT_CONSTEXPR ErrorHandler error_handler() const { return *this; } -}; - -using format_parse_context = basic_format_parse_context; -using wformat_parse_context = basic_format_parse_context; - -template class basic_format_arg; -template class basic_format_args; - -// A formatter for objects of type T. -template -struct formatter { - // A deleted default constructor indicates a disabled formatter. - formatter() = delete; -}; - -// Specifies if T has an enabled formatter specialization. A type can be -// formattable even if it doesn't have a formatter e.g. via a conversion. -template -using has_formatter = - std::is_constructible>; - -namespace internal { - -/** A contiguous memory buffer with an optional growing ability. */ -template class buffer { - private: - T* ptr_; - std::size_t size_; - std::size_t capacity_; - - protected: - // Don't initialize ptr_ since it is not accessed to save a few cycles. - buffer(std::size_t sz) FMT_NOEXCEPT : size_(sz), capacity_(sz) {} - - buffer(T* p = nullptr, std::size_t sz = 0, std::size_t cap = 0) FMT_NOEXCEPT - : ptr_(p), - size_(sz), - capacity_(cap) {} - - /** Sets the buffer data and capacity. */ - void set(T* buf_data, std::size_t buf_capacity) FMT_NOEXCEPT { - ptr_ = buf_data; - capacity_ = buf_capacity; - } - - /** Increases the buffer capacity to hold at least *capacity* elements. */ - virtual void grow(std::size_t capacity) = 0; - - public: - using value_type = T; - using const_reference = const T&; - - buffer(const buffer&) = delete; - void operator=(const buffer&) = delete; - virtual ~buffer() = default; - - T* begin() FMT_NOEXCEPT { return ptr_; } - T* end() FMT_NOEXCEPT { return ptr_ + size_; } - - const T* begin() const FMT_NOEXCEPT { return ptr_; } - const T* end() const FMT_NOEXCEPT { return ptr_ + size_; } - - /** Returns the size of this buffer. */ - std::size_t size() const FMT_NOEXCEPT { return size_; } - - /** Returns the capacity of this buffer. */ - std::size_t capacity() const FMT_NOEXCEPT { return capacity_; } - - /** Returns a pointer to the buffer data. */ - T* data() FMT_NOEXCEPT { return ptr_; } - - /** Returns a pointer to the buffer data. */ - const T* data() const FMT_NOEXCEPT { return ptr_; } - - /** - Resizes the buffer. If T is a POD type new elements may not be initialized. - */ - void resize(std::size_t new_size) { - reserve(new_size); - size_ = new_size; - } - - /** Clears this buffer. */ - void clear() { size_ = 0; } - - /** Reserves space to store at least *capacity* elements. */ - void reserve(std::size_t new_capacity) { - if (new_capacity > capacity_) grow(new_capacity); - } - - void push_back(const T& value) { - reserve(size_ + 1); - ptr_[size_++] = value; - } - - /** Appends data to the end of the buffer. */ - template void append(const U* begin, const U* end); - - template T& operator[](I index) { return ptr_[index]; } - template const T& operator[](I index) const { - return ptr_[index]; - } -}; - -// A container-backed buffer. -template -class container_buffer : public buffer { - private: - Container& container_; - - protected: - void grow(std::size_t capacity) FMT_OVERRIDE { - container_.resize(capacity); - this->set(&container_[0], capacity); - } - - public: - explicit container_buffer(Container& c) - : buffer(c.size()), container_(c) {} -}; - -// Extracts a reference to the container from back_insert_iterator. -template -inline Container& get_container(fmt::back_insert_iterator it) { - using bi_iterator = fmt::back_insert_iterator; - struct accessor : bi_iterator { - accessor(bi_iterator iter) : bi_iterator(iter) {} - using bi_iterator::container; - }; - return *accessor(it).container; -} - -template -struct fallback_formatter { - fallback_formatter() = delete; -}; - -// Specifies if T has an enabled fallback_formatter specialization. -template -using has_fallback_formatter = - std::is_constructible>; - -template struct named_arg_base; -template struct named_arg; - enum class type { none_type, - named_arg_type, // Integer types should go first, int_type, uint_type, @@ -849,13 +697,12 @@ struct type_constant : std::integral_constant {}; struct type_constant \ : std::integral_constant {} -FMT_TYPE_CONSTANT(const named_arg_base&, named_arg_type); FMT_TYPE_CONSTANT(int, int_type); FMT_TYPE_CONSTANT(unsigned, uint_type); FMT_TYPE_CONSTANT(long long, long_long_type); FMT_TYPE_CONSTANT(unsigned long long, ulong_long_type); -FMT_TYPE_CONSTANT(int128_t, int128_type); -FMT_TYPE_CONSTANT(uint128_t, uint128_type); +FMT_TYPE_CONSTANT(int128_opt, int128_type); +FMT_TYPE_CONSTANT(uint128_opt, uint128_type); FMT_TYPE_CONSTANT(bool, bool_type); FMT_TYPE_CONSTANT(Char, char_type); FMT_TYPE_CONSTANT(float, float_type); @@ -865,26 +712,621 @@ FMT_TYPE_CONSTANT(const Char*, cstring_type); FMT_TYPE_CONSTANT(basic_string_view, string_type); FMT_TYPE_CONSTANT(const void*, pointer_type); -FMT_CONSTEXPR bool is_integral_type(type t) { - FMT_ASSERT(t != type::named_arg_type, "invalid argument type"); +constexpr bool is_integral_type(type t) { return t > type::none_type && t <= type::last_integer_type; } -FMT_CONSTEXPR bool is_arithmetic_type(type t) { - FMT_ASSERT(t != type::named_arg_type, "invalid argument type"); +constexpr bool is_arithmetic_type(type t) { return t > type::none_type && t <= type::last_numeric_type; } +struct error_handler { + constexpr error_handler() = default; + constexpr error_handler(const error_handler&) = default; + + // This function is intentionally not constexpr to give a compile-time error. + FMT_NORETURN void on_error(const char* message) { + FMT_THROW_FORMAT_ERROR(message); + } +}; +FMT_END_DETAIL_NAMESPACE + +/** String's character type. */ +template using char_t = typename detail::char_t_impl::type; + +/** + \rst + Parsing context consisting of a format string range being parsed and an + argument counter for automatic indexing. + You can use the ``format_parse_context`` type alias for ``char`` instead. + \endrst + */ +template +class basic_format_parse_context : private ErrorHandler { + private: + basic_string_view format_str_; + int next_arg_id_; + + FMT_CONSTEXPR void do_check_arg_id(int id); + + public: + using char_type = Char; + using iterator = typename basic_string_view::iterator; + + explicit constexpr basic_format_parse_context( + basic_string_view format_str, ErrorHandler eh = {}, + int next_arg_id = 0) + : ErrorHandler(eh), format_str_(format_str), next_arg_id_(next_arg_id) {} + + /** + Returns an iterator to the beginning of the format string range being + parsed. + */ + constexpr auto begin() const noexcept -> iterator { + return format_str_.begin(); + } + + /** + Returns an iterator past the end of the format string range being parsed. + */ + constexpr auto end() const noexcept -> iterator { return format_str_.end(); } + + /** Advances the begin iterator to ``it``. */ + FMT_CONSTEXPR void advance_to(iterator it) { + format_str_.remove_prefix(detail::to_unsigned(it - begin())); + } + + /** + Reports an error if using the manual argument indexing; otherwise returns + the next argument index and switches to the automatic indexing. + */ + FMT_CONSTEXPR auto next_arg_id() -> int { + if (next_arg_id_ < 0) { + on_error("cannot switch from manual to automatic argument indexing"); + return 0; + } + int id = next_arg_id_++; + do_check_arg_id(id); + return id; + } + + /** + Reports an error if using the automatic argument indexing; otherwise + switches to the manual indexing. + */ + FMT_CONSTEXPR void check_arg_id(int id) { + if (next_arg_id_ > 0) { + on_error("cannot switch from automatic to manual argument indexing"); + return; + } + next_arg_id_ = -1; + do_check_arg_id(id); + } + FMT_CONSTEXPR void check_arg_id(basic_string_view) {} + FMT_CONSTEXPR void check_dynamic_spec(int arg_id); + + FMT_CONSTEXPR void on_error(const char* message) { + ErrorHandler::on_error(message); + } + + constexpr auto error_handler() const -> ErrorHandler { return *this; } +}; + +using format_parse_context = basic_format_parse_context; + +FMT_BEGIN_DETAIL_NAMESPACE +// A parse context with extra data used only in compile-time checks. +template +class compile_parse_context + : public basic_format_parse_context { + private: + int num_args_; + const type* types_; + using base = basic_format_parse_context; + + public: + explicit FMT_CONSTEXPR compile_parse_context( + basic_string_view format_str, int num_args, const type* types, + ErrorHandler eh = {}, int next_arg_id = 0) + : base(format_str, eh, next_arg_id), num_args_(num_args), types_(types) {} + + constexpr auto num_args() const -> int { return num_args_; } + constexpr auto arg_type(int id) const -> type { return types_[id]; } + + FMT_CONSTEXPR auto next_arg_id() -> int { + int id = base::next_arg_id(); + if (id >= num_args_) this->on_error("argument not found"); + return id; + } + + FMT_CONSTEXPR void check_arg_id(int id) { + base::check_arg_id(id); + if (id >= num_args_) this->on_error("argument not found"); + } + using base::check_arg_id; + + FMT_CONSTEXPR void check_dynamic_spec(int arg_id) { + if (arg_id < num_args_ && types_ && !is_integral_type(types_[arg_id])) + this->on_error("width/precision is not integer"); + } +}; +FMT_END_DETAIL_NAMESPACE + +template +FMT_CONSTEXPR void +basic_format_parse_context::do_check_arg_id(int id) { + // Argument id is only checked at compile-time during parsing because + // formatting has its own validation. + if (detail::is_constant_evaluated() && FMT_GCC_VERSION >= 1200) { + using context = detail::compile_parse_context; + if (id >= static_cast(this)->num_args()) + on_error("argument not found"); + } +} + +template +FMT_CONSTEXPR void +basic_format_parse_context::check_dynamic_spec(int arg_id) { + if (detail::is_constant_evaluated()) { + using context = detail::compile_parse_context; + static_cast(this)->check_dynamic_spec(arg_id); + } +} + +template class basic_format_arg; +template class basic_format_args; +template class dynamic_format_arg_store; + +// A formatter for objects of type T. +template +struct formatter { + // A deleted default constructor indicates a disabled formatter. + formatter() = delete; +}; + +// Specifies if T has an enabled formatter specialization. A type can be +// formattable even if it doesn't have a formatter e.g. via a conversion. +template +using has_formatter = + std::is_constructible>; + +// Checks whether T is a container with contiguous storage. +template struct is_contiguous : std::false_type {}; +#if FMT_USE_STRING +template +struct is_contiguous> : std::true_type {}; +#endif + +class appender; + +FMT_BEGIN_DETAIL_NAMESPACE + +template +constexpr auto has_const_formatter_impl(T*) + -> decltype(typename Context::template formatter_type().format( + std::declval(), std::declval()), + true) { + return true; +} +template +constexpr auto has_const_formatter_impl(...) -> bool { + return false; +} +template +constexpr auto has_const_formatter() -> bool { + return has_const_formatter_impl(static_cast(nullptr)); +} + +// Extracts a reference to the container from back_insert_iterator. +template +inline auto get_container(fmt::back_insert_iterator it) + -> Container& { + using base = fmt::back_insert_iterator; + struct accessor : base { + accessor(base b) : base(b) {} + using base::container; + }; + return *accessor(it).container; +} + +template +FMT_CONSTEXPR auto copy_str(InputIt begin, InputIt end, OutputIt out) + -> OutputIt { + while (begin != end) *out++ = static_cast(*begin++); + return out; +} + +template , U>::value&& is_char::value)> +FMT_CONSTEXPR auto copy_str(T* begin, T* end, U* out) -> U* { + if (is_constant_evaluated()) return copy_str(begin, end, out); + auto size = to_unsigned(end - begin); + memcpy(out, begin, size * sizeof(U)); + return out + size; +} + +/** + \rst + A contiguous memory buffer with an optional growing ability. It is an internal + class and shouldn't be used directly, only via `~fmt::basic_memory_buffer`. + \endrst + */ +template class buffer { + private: + T* ptr_; + size_t size_; + size_t capacity_; + + protected: + // Don't initialize ptr_ since it is not accessed to save a few cycles. + FMT_MSC_WARNING(suppress : 26495) + buffer(size_t sz) noexcept : size_(sz), capacity_(sz) {} + + FMT_CONSTEXPR20 buffer(T* p = nullptr, size_t sz = 0, size_t cap = 0) noexcept + : ptr_(p), size_(sz), capacity_(cap) {} + + FMT_CONSTEXPR20 ~buffer() = default; + buffer(buffer&&) = default; + + /** Sets the buffer data and capacity. */ + FMT_CONSTEXPR void set(T* buf_data, size_t buf_capacity) noexcept { + ptr_ = buf_data; + capacity_ = buf_capacity; + } + + /** Increases the buffer capacity to hold at least *capacity* elements. */ + virtual FMT_CONSTEXPR20 void grow(size_t capacity) = 0; + + public: + using value_type = T; + using const_reference = const T&; + + buffer(const buffer&) = delete; + void operator=(const buffer&) = delete; + + auto begin() noexcept -> T* { return ptr_; } + auto end() noexcept -> T* { return ptr_ + size_; } + + auto begin() const noexcept -> const T* { return ptr_; } + auto end() const noexcept -> const T* { return ptr_ + size_; } + + /** Returns the size of this buffer. */ + constexpr auto size() const noexcept -> size_t { return size_; } + + /** Returns the capacity of this buffer. */ + constexpr auto capacity() const noexcept -> size_t { return capacity_; } + + /** Returns a pointer to the buffer data. */ + FMT_CONSTEXPR auto data() noexcept -> T* { return ptr_; } + + /** Returns a pointer to the buffer data. */ + FMT_CONSTEXPR auto data() const noexcept -> const T* { return ptr_; } + + /** Clears this buffer. */ + void clear() { size_ = 0; } + + // Tries resizing the buffer to contain *count* elements. If T is a POD type + // the new elements may not be initialized. + FMT_CONSTEXPR20 void try_resize(size_t count) { + try_reserve(count); + size_ = count <= capacity_ ? count : capacity_; + } + + // Tries increasing the buffer capacity to *new_capacity*. It can increase the + // capacity by a smaller amount than requested but guarantees there is space + // for at least one additional element either by increasing the capacity or by + // flushing the buffer if it is full. + FMT_CONSTEXPR20 void try_reserve(size_t new_capacity) { + if (new_capacity > capacity_) grow(new_capacity); + } + + FMT_CONSTEXPR20 void push_back(const T& value) { + try_reserve(size_ + 1); + ptr_[size_++] = value; + } + + /** Appends data to the end of the buffer. */ + template void append(const U* begin, const U* end); + + template FMT_CONSTEXPR auto operator[](Idx index) -> T& { + return ptr_[index]; + } + template + FMT_CONSTEXPR auto operator[](Idx index) const -> const T& { + return ptr_[index]; + } +}; + +struct buffer_traits { + explicit buffer_traits(size_t) {} + auto count() const -> size_t { return 0; } + auto limit(size_t size) -> size_t { return size; } +}; + +class fixed_buffer_traits { + private: + size_t count_ = 0; + size_t limit_; + + public: + explicit fixed_buffer_traits(size_t limit) : limit_(limit) {} + auto count() const -> size_t { return count_; } + auto limit(size_t size) -> size_t { + size_t n = limit_ > count_ ? limit_ - count_ : 0; + count_ += size; + return size < n ? size : n; + } +}; + +// A buffer that writes to an output iterator when flushed. +template +class iterator_buffer final : public Traits, public buffer { + private: + OutputIt out_; + enum { buffer_size = 256 }; + T data_[buffer_size]; + + protected: + FMT_CONSTEXPR20 void grow(size_t) override { + if (this->size() == buffer_size) flush(); + } + + void flush() { + auto size = this->size(); + this->clear(); + out_ = copy_str(data_, data_ + this->limit(size), out_); + } + + public: + explicit iterator_buffer(OutputIt out, size_t n = buffer_size) + : Traits(n), buffer(data_, 0, buffer_size), out_(out) {} + iterator_buffer(iterator_buffer&& other) + : Traits(other), buffer(data_, 0, buffer_size), out_(other.out_) {} + ~iterator_buffer() { flush(); } + + auto out() -> OutputIt { + flush(); + return out_; + } + auto count() const -> size_t { return Traits::count() + this->size(); } +}; + +template +class iterator_buffer final + : public fixed_buffer_traits, + public buffer { + private: + T* out_; + enum { buffer_size = 256 }; + T data_[buffer_size]; + + protected: + FMT_CONSTEXPR20 void grow(size_t) override { + if (this->size() == this->capacity()) flush(); + } + + void flush() { + size_t n = this->limit(this->size()); + if (this->data() == out_) { + out_ += n; + this->set(data_, buffer_size); + } + this->clear(); + } + + public: + explicit iterator_buffer(T* out, size_t n = buffer_size) + : fixed_buffer_traits(n), buffer(out, 0, n), out_(out) {} + iterator_buffer(iterator_buffer&& other) + : fixed_buffer_traits(other), + buffer(std::move(other)), + out_(other.out_) { + if (this->data() != out_) { + this->set(data_, buffer_size); + this->clear(); + } + } + ~iterator_buffer() { flush(); } + + auto out() -> T* { + flush(); + return out_; + } + auto count() const -> size_t { + return fixed_buffer_traits::count() + this->size(); + } +}; + +template class iterator_buffer final : public buffer { + protected: + FMT_CONSTEXPR20 void grow(size_t) override {} + + public: + explicit iterator_buffer(T* out, size_t = 0) : buffer(out, 0, ~size_t()) {} + + auto out() -> T* { return &*this->end(); } +}; + +// A buffer that writes to a container with the contiguous storage. +template +class iterator_buffer, + enable_if_t::value, + typename Container::value_type>> + final : public buffer { + private: + Container& container_; + + protected: + FMT_CONSTEXPR20 void grow(size_t capacity) override { + container_.resize(capacity); + this->set(&container_[0], capacity); + } + + public: + explicit iterator_buffer(Container& c) + : buffer(c.size()), container_(c) {} + explicit iterator_buffer(fmt::back_insert_iterator out, size_t = 0) + : iterator_buffer(get_container(out)) {} + + auto out() -> fmt::back_insert_iterator { + return fmt::back_inserter(container_); + } +}; + +// A buffer that counts the number of code units written discarding the output. +template class counting_buffer final : public buffer { + private: + enum { buffer_size = 256 }; + T data_[buffer_size]; + size_t count_ = 0; + + protected: + FMT_CONSTEXPR20 void grow(size_t) override { + if (this->size() != buffer_size) return; + count_ += this->size(); + this->clear(); + } + + public: + counting_buffer() : buffer(data_, 0, buffer_size) {} + + auto count() -> size_t { return count_ + this->size(); } +}; + +template +using buffer_appender = conditional_t::value, appender, + fmt::back_insert_iterator>>; + +// Maps an output iterator to a buffer. +template +auto get_buffer(OutputIt out) -> iterator_buffer { + return iterator_buffer(out); +} + +template +auto get_iterator(Buffer& buf) -> decltype(buf.out()) { + return buf.out(); +} +template auto get_iterator(buffer& buf) -> buffer_appender { + return buffer_appender(buf); +} + +template +struct fallback_formatter { + fallback_formatter() = delete; +}; + +// Specifies if T has an enabled fallback_formatter specialization. +template +using has_fallback_formatter = +#ifdef FMT_DEPRECATED_OSTREAM + std::is_constructible>; +#else + std::false_type; +#endif + +struct view {}; + +template struct named_arg : view { + const Char* name; + const T& value; + named_arg(const Char* n, const T& v) : name(n), value(v) {} +}; + +template struct named_arg_info { + const Char* name; + int id; +}; + +template +struct arg_data { + // args_[0].named_args points to named_args_ to avoid bloating format_args. + // +1 to workaround a bug in gcc 7.5 that causes duplicated-branches warning. + T args_[1 + (NUM_ARGS != 0 ? NUM_ARGS : +1)]; + named_arg_info named_args_[NUM_NAMED_ARGS]; + + template + arg_data(const U&... init) : args_{T(named_args_, NUM_NAMED_ARGS), init...} {} + arg_data(const arg_data& other) = delete; + auto args() const -> const T* { return args_ + 1; } + auto named_args() -> named_arg_info* { return named_args_; } +}; + +template +struct arg_data { + // +1 to workaround a bug in gcc 7.5 that causes duplicated-branches warning. + T args_[NUM_ARGS != 0 ? NUM_ARGS : +1]; + + template + FMT_CONSTEXPR FMT_INLINE arg_data(const U&... init) : args_{init...} {} + FMT_CONSTEXPR FMT_INLINE auto args() const -> const T* { return args_; } + FMT_CONSTEXPR FMT_INLINE auto named_args() -> std::nullptr_t { + return nullptr; + } +}; + +template +inline void init_named_args(named_arg_info*, int, int) {} + +template struct is_named_arg : std::false_type {}; +template struct is_statically_named_arg : std::false_type {}; + +template +struct is_named_arg> : std::true_type {}; + +template ::value)> +void init_named_args(named_arg_info* named_args, int arg_count, + int named_arg_count, const T&, const Tail&... args) { + init_named_args(named_args, arg_count + 1, named_arg_count, args...); +} + +template ::value)> +void init_named_args(named_arg_info* named_args, int arg_count, + int named_arg_count, const T& arg, const Tail&... args) { + named_args[named_arg_count++] = {arg.name, arg_count}; + init_named_args(named_args, arg_count + 1, named_arg_count, args...); +} + +template +FMT_CONSTEXPR FMT_INLINE void init_named_args(std::nullptr_t, int, int, + const Args&...) {} + +template constexpr auto count() -> size_t { return B ? 1 : 0; } +template constexpr auto count() -> size_t { + return (B1 ? 1 : 0) + count(); +} + +template constexpr auto count_named_args() -> size_t { + return count::value...>(); +} + +template +constexpr auto count_statically_named_args() -> size_t { + return count::value...>(); +} + +struct unformattable {}; +struct unformattable_char : unformattable {}; +struct unformattable_const : unformattable {}; +struct unformattable_pointer : unformattable {}; + template struct string_value { const Char* data; - std::size_t size; + size_t size; +}; + +template struct named_arg_value { + const named_arg_info* data; + size_t size; }; template struct custom_value { - using parse_context = basic_format_parse_context; - const void* value; - void (*format)(const void* arg, - typename Context::parse_context_type& parse_ctx, Context& ctx); + using parse_context = typename Context::parse_context_type; + void* value; + void (*format)(void* arg, parse_context& parse_ctx, Context& ctx); }; // A formatting argument value. @@ -893,12 +1335,13 @@ template class value { using char_type = typename Context::char_type; union { + monostate no_value; int int_value; unsigned uint_value; long long long_long_value; unsigned long long ulong_long_value; - int128_t int128_value; - uint128_t uint128_value; + int128_opt int128_value; + uint128_opt uint128_value; bool bool_value; char_type char_value; float float_value; @@ -907,54 +1350,66 @@ template class value { const void* pointer; string_value string; custom_value custom; - const named_arg_base* named_arg; + named_arg_value named_args; }; - FMT_CONSTEXPR value(int val = 0) : int_value(val) {} - FMT_CONSTEXPR value(unsigned val) : uint_value(val) {} - value(long long val) : long_long_value(val) {} - value(unsigned long long val) : ulong_long_value(val) {} - value(int128_t val) : int128_value(val) {} - value(uint128_t val) : uint128_value(val) {} - value(float val) : float_value(val) {} - value(double val) : double_value(val) {} - value(long double val) : long_double_value(val) {} - value(bool val) : bool_value(val) {} - value(char_type val) : char_value(val) {} - value(const char_type* val) { string.data = val; } - value(basic_string_view val) { + constexpr FMT_INLINE value() : no_value() {} + constexpr FMT_INLINE value(int val) : int_value(val) {} + constexpr FMT_INLINE value(unsigned val) : uint_value(val) {} + constexpr FMT_INLINE value(long long val) : long_long_value(val) {} + constexpr FMT_INLINE value(unsigned long long val) : ulong_long_value(val) {} + FMT_INLINE value(int128_opt val) : int128_value(val) {} + FMT_INLINE value(uint128_opt val) : uint128_value(val) {} + constexpr FMT_INLINE value(float val) : float_value(val) {} + constexpr FMT_INLINE value(double val) : double_value(val) {} + FMT_INLINE value(long double val) : long_double_value(val) {} + constexpr FMT_INLINE value(bool val) : bool_value(val) {} + constexpr FMT_INLINE value(char_type val) : char_value(val) {} + FMT_CONSTEXPR FMT_INLINE value(const char_type* val) { + string.data = val; + if (is_constant_evaluated()) string.size = {}; + } + FMT_CONSTEXPR FMT_INLINE value(basic_string_view val) { string.data = val.data(); string.size = val.size(); } - value(const void* val) : pointer(val) {} + FMT_INLINE value(const void* val) : pointer(val) {} + FMT_INLINE value(const named_arg_info* args, size_t size) + : named_args{args, size} {} - template value(const T& val) { - custom.value = &val; + template FMT_CONSTEXPR FMT_INLINE value(T& val) { + using value_type = remove_cvref_t; + custom.value = const_cast(&val); // Get the formatter type through the context to allow different contexts // have different extension points, e.g. `formatter` for `format` and // `printf_formatter` for `printf`. custom.format = format_custom_arg< - T, conditional_t::value, - typename Context::template formatter_type, - fallback_formatter>>; + value_type, + conditional_t::value, + typename Context::template formatter_type, + fallback_formatter>>; } - - value(const named_arg_base& val) { named_arg = &val; } + value(unformattable); + value(unformattable_char); + value(unformattable_const); + value(unformattable_pointer); private: // Formats an argument of a custom type, such as a user-defined class. template - static void format_custom_arg(const void* arg, + static void format_custom_arg(void* arg, typename Context::parse_context_type& parse_ctx, Context& ctx) { - Formatter f; + auto f = Formatter(); parse_ctx.advance_to(f.parse(parse_ctx)); - ctx.advance_to(f.format(*static_cast(arg), ctx)); + using qualified_type = + conditional_t(), const T, T>; + ctx.advance_to(f.format(*static_cast(arg), ctx)); } }; template -FMT_CONSTEXPR basic_format_arg make_arg(const T& value); +FMT_CONSTEXPR auto make_arg(T&& value) -> basic_format_arg; // To minimize the number of types we need to deal with, long is translated // either to int or to long long depending on its size. @@ -962,117 +1417,205 @@ enum { long_short = sizeof(long) == sizeof(int) }; using long_type = conditional_t; using ulong_type = conditional_t; +#ifdef __cpp_lib_byte +inline auto format_as(std::byte b) -> unsigned char { + return static_cast(b); +} +#endif + +template struct has_format_as { + template ::value&& std::is_integral::value)> + static auto check(U*) -> std::true_type; + static auto check(...) -> std::false_type; + + enum { value = decltype(check(static_cast(nullptr)))::value }; +}; + // Maps formatting arguments to core types. +// arg_mapper reports errors by returning unformattable instead of using +// static_assert because it's used in the is_formattable trait. template struct arg_mapper { using char_type = typename Context::char_type; - FMT_CONSTEXPR int map(signed char val) { return val; } - FMT_CONSTEXPR unsigned map(unsigned char val) { return val; } - FMT_CONSTEXPR int map(short val) { return val; } - FMT_CONSTEXPR unsigned map(unsigned short val) { return val; } - FMT_CONSTEXPR int map(int val) { return val; } - FMT_CONSTEXPR unsigned map(unsigned val) { return val; } - FMT_CONSTEXPR long_type map(long val) { return val; } - FMT_CONSTEXPR ulong_type map(unsigned long val) { return val; } - FMT_CONSTEXPR long long map(long long val) { return val; } - FMT_CONSTEXPR unsigned long long map(unsigned long long val) { return val; } - FMT_CONSTEXPR int128_t map(int128_t val) { return val; } - FMT_CONSTEXPR uint128_t map(uint128_t val) { return val; } - FMT_CONSTEXPR bool map(bool val) { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(signed char val) -> int { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(unsigned char val) -> unsigned { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(short val) -> int { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(unsigned short val) -> unsigned { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(int val) -> int { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(unsigned val) -> unsigned { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(long val) -> long_type { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(unsigned long val) -> ulong_type { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(long long val) -> long long { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(unsigned long long val) + -> unsigned long long { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(int128_opt val) -> int128_opt { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(uint128_opt val) -> uint128_opt { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(bool val) -> bool { return val; } - template ::value)> - FMT_CONSTEXPR char_type map(T val) { - static_assert( - std::is_same::value || std::is_same::value, - "mixing character types is disallowed"); + template ::value || + std::is_same::value)> + FMT_CONSTEXPR FMT_INLINE auto map(T val) -> char_type { + return val; + } + template ::value || +#ifdef __cpp_char8_t + std::is_same::value || +#endif + std::is_same::value || + std::is_same::value) && + !std::is_same::value, + int> = 0> + FMT_CONSTEXPR FMT_INLINE auto map(T) -> unformattable_char { + return {}; + } + + FMT_CONSTEXPR FMT_INLINE auto map(float val) -> float { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(double val) -> double { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(long double val) -> long double { return val; } - FMT_CONSTEXPR float map(float val) { return val; } - FMT_CONSTEXPR double map(double val) { return val; } - FMT_CONSTEXPR long double map(long double val) { return val; } - - FMT_CONSTEXPR const char_type* map(char_type* val) { return val; } - FMT_CONSTEXPR const char_type* map(const char_type* val) { return val; } - template ::value)> - FMT_CONSTEXPR basic_string_view map(const T& val) { - static_assert(std::is_same>::value, - "mixing character types is disallowed"); + FMT_CONSTEXPR FMT_INLINE auto map(char_type* val) -> const char_type* { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(const char_type* val) -> const char_type* { + return val; + } + template ::value && !std::is_pointer::value && + std::is_same>::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T& val) + -> basic_string_view { return to_string_view(val); } + template ::value && !std::is_pointer::value && + !std::is_same>::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T&) -> unformattable_char { + return {}; + } template , T>::value && + std::is_convertible>::value && !is_string::value && !has_formatter::value && - !has_fallback_formatter::value)> - FMT_CONSTEXPR basic_string_view map(const T& val) { + !has_fallback_formatter::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T& val) + -> basic_string_view { return basic_string_view(val); } + template >::value && + !std::is_convertible>::value && + !is_string::value && !has_formatter::value && + !has_fallback_formatter::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T& val) + -> basic_string_view { + return std_string_view(val); + } + + FMT_CONSTEXPR FMT_INLINE auto map(void* val) -> const void* { return val; } + FMT_CONSTEXPR FMT_INLINE auto map(const void* val) -> const void* { + return val; + } + FMT_CONSTEXPR FMT_INLINE auto map(std::nullptr_t val) -> const void* { + return val; + } + + // We use SFINAE instead of a const T* parameter to avoid conflicting with + // the C array overload. template < typename T, FMT_ENABLE_IF( - std::is_constructible, T>::value && - !std::is_constructible, T>::value && - !is_string::value && !has_formatter::value && - !has_fallback_formatter::value)> - FMT_CONSTEXPR basic_string_view map(const T& val) { - return std_string_view(val); - } - FMT_CONSTEXPR const char* map(const signed char* val) { - static_assert(std::is_same::value, "invalid string type"); - return reinterpret_cast(val); - } - FMT_CONSTEXPR const char* map(const unsigned char* val) { - static_assert(std::is_same::value, "invalid string type"); - return reinterpret_cast(val); + std::is_pointer::value || std::is_member_pointer::value || + std::is_function::type>::value || + (std::is_convertible::value && + !std::is_convertible::value && + !has_formatter::value))> + FMT_CONSTEXPR auto map(const T&) -> unformattable_pointer { + return {}; } - FMT_CONSTEXPR const void* map(void* val) { return val; } - FMT_CONSTEXPR const void* map(const void* val) { return val; } - FMT_CONSTEXPR const void* map(std::nullptr_t val) { return val; } - template FMT_CONSTEXPR int map(const T*) { - // Formatting of arbitrary pointers is disallowed. If you want to output - // a pointer cast it to "void *" or "const void *". In particular, this - // forbids formatting of "[const] volatile char *" which is printed as bool - // by iostreams. - static_assert(!sizeof(T), "formatting of non-void pointers is disallowed"); - return 0; + template ::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T (&values)[N]) -> const T (&)[N] { + return values; } template ::value && - !has_formatter::value && - !has_fallback_formatter::value)> - FMT_CONSTEXPR auto map(const T& val) + FMT_ENABLE_IF( + std::is_enum::value&& std::is_convertible::value && + !has_format_as::value && !has_formatter::value && + !has_fallback_formatter::value)> + FMT_DEPRECATED FMT_CONSTEXPR FMT_INLINE auto map(const T& val) -> decltype(std::declval().map( - static_cast::type>(val))) { - return map(static_cast::type>(val)); - } - template ::value && !is_char::value && - (has_formatter::value || - has_fallback_formatter::value))> - FMT_CONSTEXPR const T& map(const T& val) { - return val; + static_cast>(val))) { + return map(static_cast>(val)); } - template - FMT_CONSTEXPR const named_arg_base& map( - const named_arg& val) { - auto arg = make_arg(val.value); - ::memcpy(val.data, &arg, sizeof(arg)); - return val; + template ::value && + !has_formatter::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T& val) + -> decltype(std::declval().map(format_as(T()))) { + return map(format_as(val)); } - int map(...) { - constexpr bool formattable = sizeof(Context) == 0; - static_assert( - formattable, - "Cannot format argument. To make type T formattable provide a " - "formatter specialization: " - "https://fmt.dev/latest/api.html#formatting-user-defined-types"); - return 0; + template > + struct formattable + : bool_constant() || + !std::is_const>::value || + has_fallback_formatter::value> {}; + +#if (FMT_MSC_VERSION != 0 && FMT_MSC_VERSION < 1910) || \ + FMT_ICC_VERSION != 0 || defined(__NVCC__) + // Workaround a bug in MSVC and Intel (Issue 2746). + template FMT_CONSTEXPR FMT_INLINE auto do_map(T&& val) -> T& { + return val; } +#else + template ::value)> + FMT_CONSTEXPR FMT_INLINE auto do_map(T&& val) -> T& { + return val; + } + template ::value)> + FMT_CONSTEXPR FMT_INLINE auto do_map(T&&) -> unformattable_const { + return {}; + } +#endif + + template , + FMT_ENABLE_IF(!is_string::value && !is_char::value && + !std::is_array::value && + !std::is_pointer::value && + !has_format_as::value && + (has_formatter::value || + has_fallback_formatter::value))> + FMT_CONSTEXPR FMT_INLINE auto map(T&& val) + -> decltype(this->do_map(std::forward(val))) { + return do_map(std::forward(val)); + } + + template ::value)> + FMT_CONSTEXPR FMT_INLINE auto map(const T& named_arg) + -> decltype(std::declval().map(named_arg.value)) { + return map(named_arg.value); + } + + auto map(...) -> unformattable { return {}; } }; // A type constant after applying arg_mapper. @@ -1081,24 +1624,43 @@ using mapped_type_constant = type_constant().map(std::declval())), typename Context::char_type>; -enum { packed_arg_bits = 5 }; +enum { packed_arg_bits = 4 }; // Maximum number of arguments with packed types. -enum { max_packed_args = 63 / packed_arg_bits }; +enum { max_packed_args = 62 / packed_arg_bits }; enum : unsigned long long { is_unpacked_bit = 1ULL << 63 }; +enum : unsigned long long { has_named_args_bit = 1ULL << 62 }; -template class arg_map; -} // namespace internal +FMT_END_DETAIL_NAMESPACE + +// An output iterator that appends to a buffer. +// It is used to reduce symbol sizes for the common case. +class appender : public fmt::back_insert_iterator> { + using base = fmt::back_insert_iterator>; + + template + friend auto get_buffer(appender out) -> detail::buffer& { + return detail::get_container(out); + } + + public: + using fmt::back_insert_iterator>::back_insert_iterator; + appender(base it) noexcept : base(it) {} + FMT_UNCHECKED_ITERATOR(appender); + + auto operator++() noexcept -> appender& { return *this; } + auto operator++(int) noexcept -> appender { return *this; } +}; // A formatting argument. It is a trivially copyable/constructible type to // allow storage in basic_memory_buffer. template class basic_format_arg { private: - internal::value value_; - internal::type type_; + detail::value value_; + detail::type type_; template - friend FMT_CONSTEXPR basic_format_arg internal::make_arg( - const T& value); + friend FMT_CONSTEXPR auto detail::make_arg(T&& value) + -> basic_format_arg; template friend FMT_CONSTEXPR auto visit_format_arg(Visitor&& vis, @@ -1106,14 +1668,20 @@ template class basic_format_arg { -> decltype(vis(0)); friend class basic_format_args; - friend class internal::arg_map; + friend class dynamic_format_arg_store; using char_type = typename Context::char_type; + template + friend struct detail::arg_data; + + basic_format_arg(const detail::named_arg_info* args, size_t size) + : value_(args, size) {} + public: class handle { public: - explicit handle(internal::custom_value custom) : custom_(custom) {} + explicit handle(detail::custom_value custom) : custom_(custom) {} void format(typename Context::parse_context_type& parse_ctx, Context& ctx) const { @@ -1121,19 +1689,21 @@ template class basic_format_arg { } private: - internal::custom_value custom_; + detail::custom_value custom_; }; - FMT_CONSTEXPR basic_format_arg() : type_(internal::type::none_type) {} + constexpr basic_format_arg() : type_(detail::type::none_type) {} - FMT_CONSTEXPR explicit operator bool() const FMT_NOEXCEPT { - return type_ != internal::type::none_type; + constexpr explicit operator bool() const noexcept { + return type_ != detail::type::none_type; } - internal::type type() const { return type_; } + auto type() const -> detail::type { return type_; } - bool is_integral() const { return internal::is_integral_type(type_); } - bool is_arithmetic() const { return internal::is_arithmetic_type(type_); } + auto is_integral() const -> bool { return detail::is_integral_type(type_); } + auto is_arithmetic() const -> bool { + return detail::is_arithmetic_type(type_); + } }; /** @@ -1144,120 +1714,141 @@ template class basic_format_arg { \endrst */ template -FMT_CONSTEXPR auto visit_format_arg(Visitor&& vis, - const basic_format_arg& arg) - -> decltype(vis(0)) { - using char_type = typename Context::char_type; +FMT_CONSTEXPR FMT_INLINE auto visit_format_arg( + Visitor&& vis, const basic_format_arg& arg) -> decltype(vis(0)) { switch (arg.type_) { - case internal::type::none_type: + case detail::type::none_type: break; - case internal::type::named_arg_type: - FMT_ASSERT(false, "invalid argument type"); - break; - case internal::type::int_type: + case detail::type::int_type: return vis(arg.value_.int_value); - case internal::type::uint_type: + case detail::type::uint_type: return vis(arg.value_.uint_value); - case internal::type::long_long_type: + case detail::type::long_long_type: return vis(arg.value_.long_long_value); - case internal::type::ulong_long_type: + case detail::type::ulong_long_type: return vis(arg.value_.ulong_long_value); -#if FMT_USE_INT128 - case internal::type::int128_type: - return vis(arg.value_.int128_value); - case internal::type::uint128_type: - return vis(arg.value_.uint128_value); -#else - case internal::type::int128_type: - case internal::type::uint128_type: - break; -#endif - case internal::type::bool_type: + case detail::type::int128_type: + return vis(detail::convert_for_visit(arg.value_.int128_value)); + case detail::type::uint128_type: + return vis(detail::convert_for_visit(arg.value_.uint128_value)); + case detail::type::bool_type: return vis(arg.value_.bool_value); - case internal::type::char_type: + case detail::type::char_type: return vis(arg.value_.char_value); - case internal::type::float_type: + case detail::type::float_type: return vis(arg.value_.float_value); - case internal::type::double_type: + case detail::type::double_type: return vis(arg.value_.double_value); - case internal::type::long_double_type: + case detail::type::long_double_type: return vis(arg.value_.long_double_value); - case internal::type::cstring_type: + case detail::type::cstring_type: return vis(arg.value_.string.data); - case internal::type::string_type: - return vis(basic_string_view(arg.value_.string.data, - arg.value_.string.size)); - case internal::type::pointer_type: + case detail::type::string_type: + using sv = basic_string_view; + return vis(sv(arg.value_.string.data, arg.value_.string.size)); + case detail::type::pointer_type: return vis(arg.value_.pointer); - case internal::type::custom_type: + case detail::type::custom_type: return vis(typename basic_format_arg::handle(arg.value_.custom)); } return vis(monostate()); } -namespace internal { -// A map from argument names to their values for named arguments. -template class arg_map { - private: - using char_type = typename Context::char_type; +FMT_BEGIN_DETAIL_NAMESPACE - struct entry { - basic_string_view name; - basic_format_arg arg; - }; +template +auto copy_str(InputIt begin, InputIt end, appender out) -> appender { + get_container(out).append(begin, end); + return out; +} - entry* map_; - unsigned size_; +template +FMT_CONSTEXPR auto copy_str(R&& rng, OutputIt out) -> OutputIt { + return detail::copy_str(rng.begin(), rng.end(), out); +} - void push_back(value val) { - const auto& named = *val.named_arg; - map_[size_] = {named.name, named.template deserialize()}; - ++size_; - } +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 500 +// A workaround for gcc 4.8 to make void_t work in a SFINAE context. +template struct void_t_impl { using type = void; }; +template +using void_t = typename detail::void_t_impl::type; +#else +template using void_t = void; +#endif - public: - arg_map(const arg_map&) = delete; - void operator=(const arg_map&) = delete; - arg_map() : map_(nullptr), size_(0) {} - void init(const basic_format_args& args); - ~arg_map() { delete[] map_; } +template +struct is_back_insert_iterator : std::false_type {}; +template +struct is_back_insert_iterator> + : std::true_type {}; - basic_format_arg find(basic_string_view name) const { - // The list is unsorted, so just return the first matching name. - for (entry *it = map_, *end = map_ + size_; it != end; ++it) { - if (it->name == name) return it->arg; - } - return {}; - } -}; +template +struct is_contiguous_back_insert_iterator : std::false_type {}; +template +struct is_contiguous_back_insert_iterator> + : is_contiguous {}; +template <> +struct is_contiguous_back_insert_iterator : std::true_type {}; -// A type-erased reference to an std::locale to avoid heavy include. +// A type-erased reference to an std::locale to avoid a heavy include. class locale_ref { private: const void* locale_; // A type-erased pointer to std::locale. public: - locale_ref() : locale_(nullptr) {} + constexpr locale_ref() : locale_(nullptr) {} template explicit locale_ref(const Locale& loc); - explicit operator bool() const FMT_NOEXCEPT { return locale_ != nullptr; } + explicit operator bool() const noexcept { return locale_ != nullptr; } - template Locale get() const; + template auto get() const -> Locale; }; -template constexpr unsigned long long encode_types() { return 0; } +template constexpr auto encode_types() -> unsigned long long { + return 0; +} template -constexpr unsigned long long encode_types() { +constexpr auto encode_types() -> unsigned long long { return static_cast(mapped_type_constant::value) | (encode_types() << packed_arg_bits); } template -FMT_CONSTEXPR basic_format_arg make_arg(const T& value) { +FMT_CONSTEXPR FMT_INLINE auto make_value(T&& val) -> value { + const auto& arg = arg_mapper().map(FMT_FORWARD(val)); + + constexpr bool formattable_char = + !std::is_same::value; + static_assert(formattable_char, "Mixing character types is disallowed."); + + constexpr bool formattable_const = + !std::is_same::value; + static_assert(formattable_const, "Cannot format a const argument."); + + // Formatting of arbitrary pointers is disallowed. If you want to output + // a pointer cast it to "void *" or "const void *". In particular, this + // forbids formatting of "[const] volatile char *" which is printed as bool + // by iostreams. + constexpr bool formattable_pointer = + !std::is_same::value; + static_assert(formattable_pointer, + "Formatting of non-void pointers is disallowed."); + + constexpr bool formattable = + !std::is_same::value; + static_assert( + formattable, + "Cannot format an argument. To make type T formattable provide a " + "formatter specialization: https://fmt.dev/latest/api.html#udt"); + return {arg}; +} + +template +FMT_CONSTEXPR auto make_arg(T&& value) -> basic_format_arg { basic_format_arg arg; arg.type_ = mapped_type_constant::value; - arg.value_ = arg_mapper().map(value); + arg.value_ = make_value(value); return arg; } @@ -1266,21 +1857,16 @@ FMT_CONSTEXPR basic_format_arg make_arg(const T& value) { // another (not recommended). template -inline value make_arg(const T& val) { - return arg_mapper().map(val); +FMT_CONSTEXPR FMT_INLINE auto make_arg(T&& val) -> value { + return make_value(val); } template -inline basic_format_arg make_arg(const T& value) { +FMT_CONSTEXPR inline auto make_arg(T&& value) -> basic_format_arg { return make_arg(value); } - -template struct is_reference_wrapper : std::false_type {}; - -template -struct is_reference_wrapper> : std::true_type {}; -} // namespace internal +FMT_END_DETAIL_NAMESPACE // Formatting context. template class basic_format_context { @@ -1291,8 +1877,7 @@ template class basic_format_context { private: OutputIt out_; basic_format_args args_; - internal::arg_map map_; - internal::locale_ref loc_; + detail::locale_ref loc_; public: using iterator = OutputIt; @@ -1300,41 +1885,58 @@ template class basic_format_context { using parse_context_type = basic_format_parse_context; template using formatter_type = formatter; + basic_format_context(basic_format_context&&) = default; basic_format_context(const basic_format_context&) = delete; void operator=(const basic_format_context&) = delete; /** Constructs a ``basic_format_context`` object. References to the arguments are stored in the object so make sure they have appropriate lifetimes. */ - basic_format_context(OutputIt out, - basic_format_args ctx_args, - internal::locale_ref loc = internal::locale_ref()) + constexpr basic_format_context( + OutputIt out, basic_format_args ctx_args, + detail::locale_ref loc = detail::locale_ref()) : out_(out), args_(ctx_args), loc_(loc) {} - format_arg arg(int id) const { return args_.get(id); } + constexpr auto arg(int id) const -> format_arg { return args_.get(id); } + FMT_CONSTEXPR auto arg(basic_string_view name) -> format_arg { + return args_.get(name); + } + FMT_CONSTEXPR auto arg_id(basic_string_view name) -> int { + return args_.get_id(name); + } + auto args() const -> const basic_format_args& { + return args_; + } - // Checks if manual indexing is used and returns the argument with the - // specified name. - format_arg arg(basic_string_view name); - - internal::error_handler error_handler() { return {}; } + FMT_CONSTEXPR auto error_handler() -> detail::error_handler { return {}; } void on_error(const char* message) { error_handler().on_error(message); } // Returns an iterator to the beginning of the output range. - iterator out() { return out_; } + FMT_CONSTEXPR auto out() -> iterator { return out_; } // Advances the begin iterator to ``it``. - void advance_to(iterator it) { out_ = it; } + void advance_to(iterator it) { + if (!detail::is_back_insert_iterator()) out_ = it; + } - internal::locale_ref locale() { return loc_; } + FMT_CONSTEXPR auto locale() -> detail::locale_ref { return loc_; } }; template using buffer_context = - basic_format_context>, - Char>; + basic_format_context, Char>; using format_context = buffer_context; -using wformat_context = buffer_context; + +// Workaround an alias issue: https://stackoverflow.com/q/62767544/471164. +#define FMT_BUFFER_CONTEXT(Char) \ + basic_format_context, Char> + +template +using is_formattable = bool_constant< + !std::is_base_of>().map( + std::declval()))>::value && + !detail::has_fallback_formatter::value>; /** \rst @@ -1352,44 +1954,69 @@ class format_arg_store { private: static const size_t num_args = sizeof...(Args); - static const bool is_packed = num_args < internal::max_packed_args; + static const size_t num_named_args = detail::count_named_args(); + static const bool is_packed = num_args <= detail::max_packed_args; - using value_type = conditional_t, + using value_type = conditional_t, basic_format_arg>; - // If the arguments are not packed, add one more element to mark the end. - value_type data_[num_args + (num_args == 0 ? 1 : 0)]; + detail::arg_data + data_; friend class basic_format_args; - public: - static constexpr unsigned long long types = - is_packed ? internal::encode_types() - : internal::is_unpacked_bit | num_args; + static constexpr unsigned long long desc = + (is_packed ? detail::encode_types() + : detail::is_unpacked_bit | num_args) | + (num_named_args != 0 + ? static_cast(detail::has_named_args_bit) + : 0); - format_arg_store(const Args&... args) + public: + template + FMT_CONSTEXPR FMT_INLINE format_arg_store(T&&... args) : #if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 basic_format_args(*this), #endif - data_{internal::make_arg< + data_{detail::make_arg< is_packed, Context, - internal::mapped_type_constant::value>(args)...} { + detail::mapped_type_constant, Context>::value>( + FMT_FORWARD(args))...} { + detail::init_named_args(data_.named_args(), 0, 0, args...); } }; /** \rst - Constructs an `~fmt::format_arg_store` object that contains references to + Constructs a `~fmt::format_arg_store` object that contains references to arguments and can be implicitly converted to `~fmt::format_args`. `Context` can be omitted in which case it defaults to `~fmt::context`. See `~fmt::arg` for lifetime considerations. \endrst */ template -inline format_arg_store make_format_args( - const Args&... args) { - return {args...}; +constexpr auto make_format_args(Args&&... args) + -> format_arg_store...> { + return {FMT_FORWARD(args)...}; +} + +/** + \rst + Returns a named argument to be used in a formatting function. + It should only be used in a call to a formatting function or + `dynamic_format_arg_store::push_back`. + + **Example**:: + + fmt::print("Elapsed time: {s:.2f} seconds", fmt::arg("s", 1.23)); + \endrst + */ +template +inline auto arg(const Char* name, const T& arg) -> detail::named_arg { + static_assert(!detail::is_named_arg(), "nested named arguments"); + return {name, arg}; } /** @@ -1408,49 +2035,42 @@ template class basic_format_args { using format_arg = basic_format_arg; private: - // To reduce compiled code size per formatting function call, types of first - // max_packed_args arguments are passed in the types_ field. - unsigned long long types_; + // A descriptor that contains information about formatting arguments. + // If the number of arguments is less or equal to max_packed_args then + // argument types are passed in the descriptor. This reduces binary code size + // per formatting function call. + unsigned long long desc_; union { - // If the number of arguments is less than max_packed_args, the argument - // values are stored in values_, otherwise they are stored in args_. - // This is done to reduce compiled code size as storing larger objects + // If is_packed() returns true then argument values are stored in values_; + // otherwise they are stored in args_. This is done to improve cache + // locality and reduce compiled code size since storing larger objects // may require more code (at least on x86-64) even if the same amount of // data is actually copied to stack. It saves ~10% on the bloat test. - const internal::value* values_; + const detail::value* values_; const format_arg* args_; }; - bool is_packed() const { return (types_ & internal::is_unpacked_bit) == 0; } - - internal::type type(int index) const { - int shift = index * internal::packed_arg_bits; - unsigned int mask = (1 << internal::packed_arg_bits) - 1; - return static_cast((types_ >> shift) & mask); + constexpr auto is_packed() const -> bool { + return (desc_ & detail::is_unpacked_bit) == 0; + } + auto has_named_args() const -> bool { + return (desc_ & detail::has_named_args_bit) != 0; } - friend class internal::arg_map; - - void set_data(const internal::value* values) { values_ = values; } - void set_data(const format_arg* args) { args_ = args; } - - format_arg do_get(int index) const { - format_arg arg; - if (!is_packed()) { - auto num_args = max_size(); - if (index < num_args) arg = args_[index]; - return arg; - } - if (index > internal::max_packed_args) return arg; - arg.type_ = type(index); - if (arg.type_ == internal::type::none_type) return arg; - internal::value& val = arg.value_; - val = values_[index]; - return arg; + FMT_CONSTEXPR auto type(int index) const -> detail::type { + int shift = index * detail::packed_arg_bits; + unsigned int mask = (1 << detail::packed_arg_bits) - 1; + return static_cast((desc_ >> shift) & mask); } + constexpr FMT_INLINE basic_format_args(unsigned long long desc, + const detail::value* values) + : desc_(desc), values_(values) {} + constexpr basic_format_args(unsigned long long desc, const format_arg* args) + : desc_(desc), args_(args) {} + public: - basic_format_args() : types_(0) {} + constexpr basic_format_args() : desc_(0), args_(nullptr) {} /** \rst @@ -1458,196 +2078,1269 @@ template class basic_format_args { \endrst */ template - basic_format_args(const format_arg_store& store) - : types_(store.types) { - set_data(store.data_); - } + constexpr FMT_INLINE basic_format_args( + const format_arg_store& store) + : basic_format_args(format_arg_store::desc, + store.data_.args()) {} - /** Returns the argument at specified index. */ - format_arg get(int index) const { - format_arg arg = do_get(index); - if (arg.type_ == internal::type::named_arg_type) - arg = arg.value_.named_arg->template deserialize(); + /** + \rst + Constructs a `basic_format_args` object from + `~fmt::dynamic_format_arg_store`. + \endrst + */ + constexpr FMT_INLINE basic_format_args( + const dynamic_format_arg_store& store) + : basic_format_args(store.get_types(), store.data()) {} + + /** + \rst + Constructs a `basic_format_args` object from a dynamic set of arguments. + \endrst + */ + constexpr basic_format_args(const format_arg* args, int count) + : basic_format_args(detail::is_unpacked_bit | detail::to_unsigned(count), + args) {} + + /** Returns the argument with the specified id. */ + FMT_CONSTEXPR auto get(int id) const -> format_arg { + format_arg arg; + if (!is_packed()) { + if (id < max_size()) arg = args_[id]; + return arg; + } + if (id >= detail::max_packed_args) return arg; + arg.type_ = type(id); + if (arg.type_ == detail::type::none_type) return arg; + arg.value_ = values_[id]; return arg; } - int max_size() const { - unsigned long long max_packed = internal::max_packed_args; + template + auto get(basic_string_view name) const -> format_arg { + int id = get_id(name); + return id >= 0 ? get(id) : format_arg(); + } + + template + auto get_id(basic_string_view name) const -> int { + if (!has_named_args()) return -1; + const auto& named_args = + (is_packed() ? values_[-1] : args_[-1].value_).named_args; + for (size_t i = 0; i < named_args.size; ++i) { + if (named_args.data[i].name == name) return named_args.data[i].id; + } + return -1; + } + + auto max_size() const -> int { + unsigned long long max_packed = detail::max_packed_args; return static_cast(is_packed() ? max_packed - : types_ & ~internal::is_unpacked_bit); + : desc_ & ~detail::is_unpacked_bit); } }; -/** An alias to ``basic_format_args``. */ -// It is a separate type rather than an alias to make symbols readable. -struct format_args : basic_format_args { - template - format_args(Args&&... args) - : basic_format_args(static_cast(args)...) {} +/** An alias to ``basic_format_args``. */ +// A separate type would result in shorter symbols but break ABI compatibility +// between clang and gcc on ARM (#1919). +using format_args = basic_format_args; + +// We cannot use enum classes as bit fields because of a gcc bug, so we put them +// in namespaces instead (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61414). +// Additionally, if an underlying type is specified, older gcc incorrectly warns +// that the type is too small. Both bugs are fixed in gcc 9.3. +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 903 +# define FMT_ENUM_UNDERLYING_TYPE(type) +#else +# define FMT_ENUM_UNDERLYING_TYPE(type) : type +#endif +namespace align { +enum type FMT_ENUM_UNDERLYING_TYPE(unsigned char){none, left, right, center, + numeric}; +} +using align_t = align::type; +namespace sign { +enum type FMT_ENUM_UNDERLYING_TYPE(unsigned char){none, minus, plus, space}; +} +using sign_t = sign::type; + +FMT_BEGIN_DETAIL_NAMESPACE + +// Workaround an array initialization issue in gcc 4.8. +template struct fill_t { + private: + enum { max_size = 4 }; + Char data_[max_size] = {Char(' '), Char(0), Char(0), Char(0)}; + unsigned char size_ = 1; + + public: + FMT_CONSTEXPR void operator=(basic_string_view s) { + auto size = s.size(); + if (size > max_size) return; + for (size_t i = 0; i < size; ++i) data_[i] = s[i]; + size_ = static_cast(size); + } + + constexpr auto size() const -> size_t { return size_; } + constexpr auto data() const -> const Char* { return data_; } + + FMT_CONSTEXPR auto operator[](size_t index) -> Char& { return data_[index]; } + FMT_CONSTEXPR auto operator[](size_t index) const -> const Char& { + return data_[index]; + } }; -struct wformat_args : basic_format_args { - template - wformat_args(Args&&... args) - : basic_format_args(static_cast(args)...) {} +FMT_END_DETAIL_NAMESPACE + +enum class presentation_type : unsigned char { + none, + // Integer types should go first, + dec, // 'd' + oct, // 'o' + hex_lower, // 'x' + hex_upper, // 'X' + bin_lower, // 'b' + bin_upper, // 'B' + hexfloat_lower, // 'a' + hexfloat_upper, // 'A' + exp_lower, // 'e' + exp_upper, // 'E' + fixed_lower, // 'f' + fixed_upper, // 'F' + general_lower, // 'g' + general_upper, // 'G' + chr, // 'c' + string, // 's' + pointer, // 'p' + debug // '?' }; -template struct is_contiguous : std::false_type {}; +// Format specifiers for built-in and string types. +template struct basic_format_specs { + int width; + int precision; + presentation_type type; + align_t align : 4; + sign_t sign : 3; + bool alt : 1; // Alternate form ('#'). + bool localized : 1; + detail::fill_t fill; -#if FMT_USE_STRING + constexpr basic_format_specs() + : width(0), + precision(-1), + type(presentation_type::none), + align(align::none), + sign(sign::none), + alt(false), + localized(false) {} +}; + +using format_specs = basic_format_specs; + +FMT_BEGIN_DETAIL_NAMESPACE + +enum class arg_id_kind { none, index, name }; + +// An argument reference. +template struct arg_ref { + FMT_CONSTEXPR arg_ref() : kind(arg_id_kind::none), val() {} + + FMT_CONSTEXPR explicit arg_ref(int index) + : kind(arg_id_kind::index), val(index) {} + FMT_CONSTEXPR explicit arg_ref(basic_string_view name) + : kind(arg_id_kind::name), val(name) {} + + FMT_CONSTEXPR auto operator=(int idx) -> arg_ref& { + kind = arg_id_kind::index; + val.index = idx; + return *this; + } + + arg_id_kind kind; + union value { + FMT_CONSTEXPR value(int id = 0) : index{id} {} + FMT_CONSTEXPR value(basic_string_view n) : name(n) {} + + int index; + basic_string_view name; + } val; +}; + +// Format specifiers with width and precision resolved at formatting rather +// than parsing time to allow re-using the same parsed specifiers with +// different sets of arguments (precompilation of format strings). template -struct is_contiguous> : std::true_type {}; +struct dynamic_format_specs : basic_format_specs { + arg_ref width_ref; + arg_ref precision_ref; +}; + +struct auto_id {}; + +// A format specifier handler that sets fields in basic_format_specs. +template class specs_setter { + protected: + basic_format_specs& specs_; + + public: + explicit FMT_CONSTEXPR specs_setter(basic_format_specs& specs) + : specs_(specs) {} + + FMT_CONSTEXPR specs_setter(const specs_setter& other) + : specs_(other.specs_) {} + + FMT_CONSTEXPR void on_align(align_t align) { specs_.align = align; } + FMT_CONSTEXPR void on_fill(basic_string_view fill) { + specs_.fill = fill; + } + FMT_CONSTEXPR void on_sign(sign_t s) { specs_.sign = s; } + FMT_CONSTEXPR void on_hash() { specs_.alt = true; } + FMT_CONSTEXPR void on_localized() { specs_.localized = true; } + + FMT_CONSTEXPR void on_zero() { + if (specs_.align == align::none) specs_.align = align::numeric; + specs_.fill[0] = Char('0'); + } + + FMT_CONSTEXPR void on_width(int width) { specs_.width = width; } + FMT_CONSTEXPR void on_precision(int precision) { + specs_.precision = precision; + } + FMT_CONSTEXPR void end_precision() {} + + FMT_CONSTEXPR void on_type(presentation_type type) { specs_.type = type; } +}; + +// Format spec handler that saves references to arguments representing dynamic +// width and precision to be resolved at formatting time. +template +class dynamic_specs_handler + : public specs_setter { + public: + using char_type = typename ParseContext::char_type; + + FMT_CONSTEXPR dynamic_specs_handler(dynamic_format_specs& specs, + ParseContext& ctx) + : specs_setter(specs), specs_(specs), context_(ctx) {} + + FMT_CONSTEXPR dynamic_specs_handler(const dynamic_specs_handler& other) + : specs_setter(other), + specs_(other.specs_), + context_(other.context_) {} + + template FMT_CONSTEXPR void on_dynamic_width(Id arg_id) { + specs_.width_ref = make_arg_ref(arg_id); + } + + template FMT_CONSTEXPR void on_dynamic_precision(Id arg_id) { + specs_.precision_ref = make_arg_ref(arg_id); + } + + FMT_CONSTEXPR void on_error(const char* message) { + context_.on_error(message); + } + + private: + dynamic_format_specs& specs_; + ParseContext& context_; + + using arg_ref_type = arg_ref; + + FMT_CONSTEXPR auto make_arg_ref(int arg_id) -> arg_ref_type { + context_.check_arg_id(arg_id); + context_.check_dynamic_spec(arg_id); + return arg_ref_type(arg_id); + } + + FMT_CONSTEXPR auto make_arg_ref(auto_id) -> arg_ref_type { + int arg_id = context_.next_arg_id(); + context_.check_dynamic_spec(arg_id); + return arg_ref_type(arg_id); + } + + FMT_CONSTEXPR auto make_arg_ref(basic_string_view arg_id) + -> arg_ref_type { + context_.check_arg_id(arg_id); + basic_string_view format_str( + context_.begin(), to_unsigned(context_.end() - context_.begin())); + return arg_ref_type(arg_id); + } +}; + +template constexpr bool is_ascii_letter(Char c) { + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); +} + +// Converts a character to ASCII. Returns a number > 127 on conversion failure. +template ::value)> +constexpr auto to_ascii(Char c) -> Char { + return c; +} +template ::value)> +constexpr auto to_ascii(Char c) -> underlying_t { + return c; +} + +FMT_CONSTEXPR inline auto code_point_length_impl(char c) -> int { + return "\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\1\0\0\0\0\0\0\0\0\2\2\2\2\3\3\4" + [static_cast(c) >> 3]; +} + +template +FMT_CONSTEXPR auto code_point_length(const Char* begin) -> int { + if (const_check(sizeof(Char) != 1)) return 1; + int len = code_point_length_impl(static_cast(*begin)); + + // Compute the pointer to the next character early so that the next + // iteration can start working on the next character. Neither Clang + // nor GCC figure out this reordering on their own. + return len + !len; +} + +// Return the result via the out param to workaround gcc bug 77539. +template +FMT_CONSTEXPR auto find(Ptr first, Ptr last, T value, Ptr& out) -> bool { + for (out = first; out != last; ++out) { + if (*out == value) return true; + } + return false; +} + +template <> +inline auto find(const char* first, const char* last, char value, + const char*& out) -> bool { + out = static_cast( + ::memchr(first, value, to_unsigned(last - first))); + return out != nullptr; +} + +// Parses the range [begin, end) as an unsigned integer. This function assumes +// that the range is non-empty and the first character is a digit. +template +FMT_CONSTEXPR auto parse_nonnegative_int(const Char*& begin, const Char* end, + int error_value) noexcept -> int { + FMT_ASSERT(begin != end && '0' <= *begin && *begin <= '9', ""); + unsigned value = 0, prev = 0; + auto p = begin; + do { + prev = value; + value = value * 10 + unsigned(*p - '0'); + ++p; + } while (p != end && '0' <= *p && *p <= '9'); + auto num_digits = p - begin; + begin = p; + if (num_digits <= std::numeric_limits::digits10) + return static_cast(value); + // Check for overflow. + const unsigned max = to_unsigned((std::numeric_limits::max)()); + return num_digits == std::numeric_limits::digits10 + 1 && + prev * 10ull + unsigned(p[-1] - '0') <= max + ? static_cast(value) + : error_value; +} + +// Parses fill and alignment. +template +FMT_CONSTEXPR auto parse_align(const Char* begin, const Char* end, + Handler&& handler) -> const Char* { + FMT_ASSERT(begin != end, ""); + auto align = align::none; + auto p = begin + code_point_length(begin); + if (end - p <= 0) p = begin; + for (;;) { + switch (to_ascii(*p)) { + case '<': + align = align::left; + break; + case '>': + align = align::right; + break; + case '^': + align = align::center; + break; + default: + break; + } + if (align != align::none) { + if (p != begin) { + auto c = *begin; + if (c == '{') + return handler.on_error("invalid fill character '{'"), begin; + handler.on_fill(basic_string_view(begin, to_unsigned(p - begin))); + begin = p + 1; + } else + ++begin; + handler.on_align(align); + break; + } else if (p == begin) { + break; + } + p = begin; + } + return begin; +} + +template FMT_CONSTEXPR bool is_name_start(Char c) { + return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || '_' == c; +} + +template +FMT_CONSTEXPR auto do_parse_arg_id(const Char* begin, const Char* end, + IDHandler&& handler) -> const Char* { + FMT_ASSERT(begin != end, ""); + Char c = *begin; + if (c >= '0' && c <= '9') { + int index = 0; + if (c != '0') + index = + parse_nonnegative_int(begin, end, (std::numeric_limits::max)()); + else + ++begin; + if (begin == end || (*begin != '}' && *begin != ':')) + handler.on_error("invalid format string"); + else + handler(index); + return begin; + } + if (!is_name_start(c)) { + handler.on_error("invalid format string"); + return begin; + } + auto it = begin; + do { + ++it; + } while (it != end && (is_name_start(c = *it) || ('0' <= c && c <= '9'))); + handler(basic_string_view(begin, to_unsigned(it - begin))); + return it; +} + +template +FMT_CONSTEXPR FMT_INLINE auto parse_arg_id(const Char* begin, const Char* end, + IDHandler&& handler) -> const Char* { + Char c = *begin; + if (c != '}' && c != ':') return do_parse_arg_id(begin, end, handler); + handler(); + return begin; +} + +template +FMT_CONSTEXPR auto parse_width(const Char* begin, const Char* end, + Handler&& handler) -> const Char* { + using detail::auto_id; + struct width_adapter { + Handler& handler; + + FMT_CONSTEXPR void operator()() { handler.on_dynamic_width(auto_id()); } + FMT_CONSTEXPR void operator()(int id) { handler.on_dynamic_width(id); } + FMT_CONSTEXPR void operator()(basic_string_view id) { + handler.on_dynamic_width(id); + } + FMT_CONSTEXPR void on_error(const char* message) { + if (message) handler.on_error(message); + } + }; + + FMT_ASSERT(begin != end, ""); + if ('0' <= *begin && *begin <= '9') { + int width = parse_nonnegative_int(begin, end, -1); + if (width != -1) + handler.on_width(width); + else + handler.on_error("number is too big"); + } else if (*begin == '{') { + ++begin; + if (begin != end) begin = parse_arg_id(begin, end, width_adapter{handler}); + if (begin == end || *begin != '}') + return handler.on_error("invalid format string"), begin; + ++begin; + } + return begin; +} + +template +FMT_CONSTEXPR auto parse_precision(const Char* begin, const Char* end, + Handler&& handler) -> const Char* { + using detail::auto_id; + struct precision_adapter { + Handler& handler; + + FMT_CONSTEXPR void operator()() { handler.on_dynamic_precision(auto_id()); } + FMT_CONSTEXPR void operator()(int id) { handler.on_dynamic_precision(id); } + FMT_CONSTEXPR void operator()(basic_string_view id) { + handler.on_dynamic_precision(id); + } + FMT_CONSTEXPR void on_error(const char* message) { + if (message) handler.on_error(message); + } + }; + + ++begin; + auto c = begin != end ? *begin : Char(); + if ('0' <= c && c <= '9') { + auto precision = parse_nonnegative_int(begin, end, -1); + if (precision != -1) + handler.on_precision(precision); + else + handler.on_error("number is too big"); + } else if (c == '{') { + ++begin; + if (begin != end) + begin = parse_arg_id(begin, end, precision_adapter{handler}); + if (begin == end || *begin++ != '}') + return handler.on_error("invalid format string"), begin; + } else { + return handler.on_error("missing precision specifier"), begin; + } + handler.end_precision(); + return begin; +} + +template +FMT_CONSTEXPR auto parse_presentation_type(Char type) -> presentation_type { + switch (to_ascii(type)) { + case 'd': + return presentation_type::dec; + case 'o': + return presentation_type::oct; + case 'x': + return presentation_type::hex_lower; + case 'X': + return presentation_type::hex_upper; + case 'b': + return presentation_type::bin_lower; + case 'B': + return presentation_type::bin_upper; + case 'a': + return presentation_type::hexfloat_lower; + case 'A': + return presentation_type::hexfloat_upper; + case 'e': + return presentation_type::exp_lower; + case 'E': + return presentation_type::exp_upper; + case 'f': + return presentation_type::fixed_lower; + case 'F': + return presentation_type::fixed_upper; + case 'g': + return presentation_type::general_lower; + case 'G': + return presentation_type::general_upper; + case 'c': + return presentation_type::chr; + case 's': + return presentation_type::string; + case 'p': + return presentation_type::pointer; + case '?': + return presentation_type::debug; + default: + return presentation_type::none; + } +} + +// Parses standard format specifiers and sends notifications about parsed +// components to handler. +template +FMT_CONSTEXPR FMT_INLINE auto parse_format_specs(const Char* begin, + const Char* end, + SpecHandler&& handler) + -> const Char* { + if (1 < end - begin && begin[1] == '}' && is_ascii_letter(*begin) && + *begin != 'L') { + presentation_type type = parse_presentation_type(*begin++); + if (type == presentation_type::none) + handler.on_error("invalid type specifier"); + handler.on_type(type); + return begin; + } + + if (begin == end) return begin; + + begin = parse_align(begin, end, handler); + if (begin == end) return begin; + + // Parse sign. + switch (to_ascii(*begin)) { + case '+': + handler.on_sign(sign::plus); + ++begin; + break; + case '-': + handler.on_sign(sign::minus); + ++begin; + break; + case ' ': + handler.on_sign(sign::space); + ++begin; + break; + default: + break; + } + if (begin == end) return begin; + + if (*begin == '#') { + handler.on_hash(); + if (++begin == end) return begin; + } + + // Parse zero flag. + if (*begin == '0') { + handler.on_zero(); + if (++begin == end) return begin; + } + + begin = parse_width(begin, end, handler); + if (begin == end) return begin; + + // Parse precision. + if (*begin == '.') { + begin = parse_precision(begin, end, handler); + if (begin == end) return begin; + } + + if (*begin == 'L') { + handler.on_localized(); + ++begin; + } + + // Parse type. + if (begin != end && *begin != '}') { + presentation_type type = parse_presentation_type(*begin++); + if (type == presentation_type::none) + handler.on_error("invalid type specifier"); + handler.on_type(type); + } + return begin; +} + +template +FMT_CONSTEXPR auto parse_replacement_field(const Char* begin, const Char* end, + Handler&& handler) -> const Char* { + struct id_adapter { + Handler& handler; + int arg_id; + + FMT_CONSTEXPR void operator()() { arg_id = handler.on_arg_id(); } + FMT_CONSTEXPR void operator()(int id) { arg_id = handler.on_arg_id(id); } + FMT_CONSTEXPR void operator()(basic_string_view id) { + arg_id = handler.on_arg_id(id); + } + FMT_CONSTEXPR void on_error(const char* message) { + if (message) handler.on_error(message); + } + }; + + ++begin; + if (begin == end) return handler.on_error("invalid format string"), end; + if (*begin == '}') { + handler.on_replacement_field(handler.on_arg_id(), begin); + } else if (*begin == '{') { + handler.on_text(begin, begin + 1); + } else { + auto adapter = id_adapter{handler, 0}; + begin = parse_arg_id(begin, end, adapter); + Char c = begin != end ? *begin : Char(); + if (c == '}') { + handler.on_replacement_field(adapter.arg_id, begin); + } else if (c == ':') { + begin = handler.on_format_specs(adapter.arg_id, begin + 1, end); + if (begin == end || *begin != '}') + return handler.on_error("unknown format specifier"), end; + } else { + return handler.on_error("missing '}' in format string"), end; + } + } + return begin + 1; +} + +template +FMT_CONSTEXPR FMT_INLINE void parse_format_string( + basic_string_view format_str, Handler&& handler) { + // Workaround a name-lookup bug in MSVC's modules implementation. + using detail::find; + + auto begin = format_str.data(); + auto end = begin + format_str.size(); + if (end - begin < 32) { + // Use a simple loop instead of memchr for small strings. + const Char* p = begin; + while (p != end) { + auto c = *p++; + if (c == '{') { + handler.on_text(begin, p - 1); + begin = p = parse_replacement_field(p - 1, end, handler); + } else if (c == '}') { + if (p == end || *p != '}') + return handler.on_error("unmatched '}' in format string"); + handler.on_text(begin, p); + begin = ++p; + } + } + handler.on_text(begin, end); + return; + } + struct writer { + FMT_CONSTEXPR void operator()(const Char* from, const Char* to) { + if (from == to) return; + for (;;) { + const Char* p = nullptr; + if (!find(from, to, Char('}'), p)) + return handler_.on_text(from, to); + ++p; + if (p == to || *p != '}') + return handler_.on_error("unmatched '}' in format string"); + handler_.on_text(from, p); + from = p + 1; + } + } + Handler& handler_; + } write = {handler}; + while (begin != end) { + // Doing two passes with memchr (one for '{' and another for '}') is up to + // 2.5x faster than the naive one-pass implementation on big format strings. + const Char* p = begin; + if (*begin != '{' && !find(begin + 1, end, Char('{'), p)) + return write(begin, end); + write(begin, p); + begin = parse_replacement_field(p, end, handler); + } +} + +template ::value> struct strip_named_arg { + using type = T; +}; +template struct strip_named_arg { + using type = remove_cvref_t; +}; + +template +FMT_CONSTEXPR auto parse_format_specs(ParseContext& ctx) + -> decltype(ctx.begin()) { + using char_type = typename ParseContext::char_type; + using context = buffer_context; + using stripped_type = typename strip_named_arg::type; + using mapped_type = conditional_t< + mapped_type_constant::value != type::custom_type, + decltype(arg_mapper().map(std::declval())), + stripped_type>; + auto f = conditional_t::value, + formatter, + fallback_formatter>(); + return f.parse(ctx); +} + +template +FMT_CONSTEXPR void check_int_type_spec(presentation_type type, + ErrorHandler&& eh) { + if (type > presentation_type::bin_upper && type != presentation_type::chr) + eh.on_error("invalid type specifier"); +} + +// Checks char specs and returns true if the type spec is char (and not int). +template +FMT_CONSTEXPR auto check_char_specs(const basic_format_specs& specs, + ErrorHandler&& eh = {}) -> bool { + if (specs.type != presentation_type::none && + specs.type != presentation_type::chr && + specs.type != presentation_type::debug) { + check_int_type_spec(specs.type, eh); + return false; + } + if (specs.align == align::numeric || specs.sign != sign::none || specs.alt) + eh.on_error("invalid format specifier for char"); + return true; +} + +// A floating-point presentation format. +enum class float_format : unsigned char { + general, // General: exponent notation or fixed point based on magnitude. + exp, // Exponent notation with the default precision of 6, e.g. 1.2e-3. + fixed, // Fixed point with the default precision of 6, e.g. 0.0012. + hex +}; + +struct float_specs { + int precision; + float_format format : 8; + sign_t sign : 8; + bool upper : 1; + bool locale : 1; + bool binary32 : 1; + bool showpoint : 1; +}; + +template +FMT_CONSTEXPR auto parse_float_type_spec(const basic_format_specs& specs, + ErrorHandler&& eh = {}) + -> float_specs { + auto result = float_specs(); + result.showpoint = specs.alt; + result.locale = specs.localized; + switch (specs.type) { + case presentation_type::none: + result.format = float_format::general; + break; + case presentation_type::general_upper: + result.upper = true; + FMT_FALLTHROUGH; + case presentation_type::general_lower: + result.format = float_format::general; + break; + case presentation_type::exp_upper: + result.upper = true; + FMT_FALLTHROUGH; + case presentation_type::exp_lower: + result.format = float_format::exp; + result.showpoint |= specs.precision != 0; + break; + case presentation_type::fixed_upper: + result.upper = true; + FMT_FALLTHROUGH; + case presentation_type::fixed_lower: + result.format = float_format::fixed; + result.showpoint |= specs.precision != 0; + break; + case presentation_type::hexfloat_upper: + result.upper = true; + FMT_FALLTHROUGH; + case presentation_type::hexfloat_lower: + result.format = float_format::hex; + break; + default: + eh.on_error("invalid type specifier"); + break; + } + return result; +} + +template +FMT_CONSTEXPR auto check_cstring_type_spec(presentation_type type, + ErrorHandler&& eh = {}) -> bool { + if (type == presentation_type::none || type == presentation_type::string || + type == presentation_type::debug) + return true; + if (type != presentation_type::pointer) eh.on_error("invalid type specifier"); + return false; +} + +template +FMT_CONSTEXPR void check_string_type_spec(presentation_type type, + ErrorHandler&& eh = {}) { + if (type != presentation_type::none && type != presentation_type::string && + type != presentation_type::debug) + eh.on_error("invalid type specifier"); +} + +template +FMT_CONSTEXPR void check_pointer_type_spec(presentation_type type, + ErrorHandler&& eh) { + if (type != presentation_type::none && type != presentation_type::pointer) + eh.on_error("invalid type specifier"); +} + +// A parse_format_specs handler that checks if specifiers are consistent with +// the argument type. +template class specs_checker : public Handler { + private: + detail::type arg_type_; + + FMT_CONSTEXPR void require_numeric_argument() { + if (!is_arithmetic_type(arg_type_)) + this->on_error("format specifier requires numeric argument"); + } + + public: + FMT_CONSTEXPR specs_checker(const Handler& handler, detail::type arg_type) + : Handler(handler), arg_type_(arg_type) {} + + FMT_CONSTEXPR void on_align(align_t align) { + if (align == align::numeric) require_numeric_argument(); + Handler::on_align(align); + } + + FMT_CONSTEXPR void on_sign(sign_t s) { + require_numeric_argument(); + if (is_integral_type(arg_type_) && arg_type_ != type::int_type && + arg_type_ != type::long_long_type && arg_type_ != type::int128_type && + arg_type_ != type::char_type) { + this->on_error("format specifier requires signed argument"); + } + Handler::on_sign(s); + } + + FMT_CONSTEXPR void on_hash() { + require_numeric_argument(); + Handler::on_hash(); + } + + FMT_CONSTEXPR void on_localized() { + require_numeric_argument(); + Handler::on_localized(); + } + + FMT_CONSTEXPR void on_zero() { + require_numeric_argument(); + Handler::on_zero(); + } + + FMT_CONSTEXPR void end_precision() { + if (is_integral_type(arg_type_) || arg_type_ == type::pointer_type) + this->on_error("precision not allowed for this argument type"); + } +}; + +constexpr int invalid_arg_index = -1; + +#if FMT_USE_NONTYPE_TEMPLATE_ARGS +template +constexpr auto get_arg_index_by_name(basic_string_view name) -> int { + if constexpr (detail::is_statically_named_arg()) { + if (name == T::name) return N; + } + if constexpr (sizeof...(Args) > 0) + return get_arg_index_by_name(name); + (void)name; // Workaround an MSVC bug about "unused" parameter. + return invalid_arg_index; +} #endif -template -struct is_contiguous> : std::true_type {}; +template +FMT_CONSTEXPR auto get_arg_index_by_name(basic_string_view name) -> int { +#if FMT_USE_NONTYPE_TEMPLATE_ARGS + if constexpr (sizeof...(Args) > 0) + return get_arg_index_by_name<0, Args...>(name); +#endif + (void)name; + return invalid_arg_index; +} -namespace internal { +template +class format_string_checker { + private: + // In the future basic_format_parse_context will replace compile_parse_context + // here and will use is_constant_evaluated and downcasting to access the data + // needed for compile-time checks: https://godbolt.org/z/GvWzcTjh1. + using parse_context_type = compile_parse_context; + static constexpr int num_args = sizeof...(Args); -template -struct is_contiguous_back_insert_iterator : std::false_type {}; -template -struct is_contiguous_back_insert_iterator> - : is_contiguous {}; + // Format specifier parsing function. + using parse_func = const Char* (*)(parse_context_type&); -template struct named_arg_base { - basic_string_view name; + parse_context_type context_; + parse_func parse_funcs_[num_args > 0 ? static_cast(num_args) : 1]; + type types_[num_args > 0 ? static_cast(num_args) : 1]; - // Serialized value. - mutable char data[sizeof(basic_format_arg>)]; + public: + explicit FMT_CONSTEXPR format_string_checker( + basic_string_view format_str, ErrorHandler eh) + : context_(format_str, num_args, types_, eh), + parse_funcs_{&parse_format_specs...}, + types_{ + mapped_type_constant>::value...} { + } - named_arg_base(basic_string_view nm) : name(nm) {} + FMT_CONSTEXPR void on_text(const Char*, const Char*) {} - template basic_format_arg deserialize() const { - basic_format_arg arg; - ::memcpy(&arg, data, sizeof(basic_format_arg)); - return arg; + FMT_CONSTEXPR auto on_arg_id() -> int { return context_.next_arg_id(); } + FMT_CONSTEXPR auto on_arg_id(int id) -> int { + return context_.check_arg_id(id), id; + } + FMT_CONSTEXPR auto on_arg_id(basic_string_view id) -> int { +#if FMT_USE_NONTYPE_TEMPLATE_ARGS + auto index = get_arg_index_by_name(id); + if (index == invalid_arg_index) on_error("named argument is not found"); + return context_.check_arg_id(index), index; +#else + (void)id; + on_error("compile-time checks for named arguments require C++20 support"); + return 0; +#endif + } + + FMT_CONSTEXPR void on_replacement_field(int, const Char*) {} + + FMT_CONSTEXPR auto on_format_specs(int id, const Char* begin, const Char*) + -> const Char* { + context_.advance_to(context_.begin() + (begin - &*context_.begin())); + // id >= 0 check is a workaround for gcc 10 bug (#2065). + return id >= 0 && id < num_args ? parse_funcs_[id](context_) : begin; + } + + FMT_CONSTEXPR void on_error(const char* message) { + context_.on_error(message); } }; -struct view {}; - -template -struct named_arg : view, named_arg_base { - const T& value; - - named_arg(basic_string_view name, const T& val) - : named_arg_base(name), value(val) {} -}; - +// Reports a compile-time error if S is not a valid format string. template ::value)> -inline void check_format_string(const S&) { -#if defined(FMT_ENFORCE_COMPILE_STRING) +FMT_INLINE void check_format_string(const S&) { +#ifdef FMT_ENFORCE_COMPILE_STRING static_assert(is_compile_string::value, - "FMT_ENFORCE_COMPILE_STRING requires all format strings to " - "utilize FMT_STRING() or fmt()."); + "FMT_ENFORCE_COMPILE_STRING requires all format strings to use " + "FMT_STRING."); #endif } -template ::value)> -void check_format_string(S); - -template struct bool_pack; -template -using all_true = - std::is_same, bool_pack>; - -template > -inline format_arg_store, remove_reference_t...> -make_args_checked(const S& format_str, - const remove_reference_t&... args) { - static_assert( - all_true<(!std::is_base_of>::value || - !std::is_reference::value)...>::value, - "passing views as lvalues is disallowed"); - check_format_string(format_str); - return {args...}; +template ::value)> +void check_format_string(S format_str) { + FMT_CONSTEXPR auto s = basic_string_view(format_str); + using checker = format_string_checker...>; + FMT_CONSTEXPR bool invalid_format = + (parse_format_string(s, checker(s, {})), true); + ignore_unused(invalid_format); } +template +void vformat_to( + buffer& buf, basic_string_view fmt, + basic_format_args)> args, + locale_ref loc = {}); + +FMT_END_DETAIL_NAMESPACE + +// A formatter specialization for the core types corresponding to detail::type +// constants. +template +struct formatter::value != + detail::type::custom_type>> { + private: + detail::dynamic_format_specs specs_; + + public: + // Parses format specifiers stopping either at the end of the range or at the + // terminating '}'. + template + FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) { + auto begin = ctx.begin(), end = ctx.end(); + if (begin == end) return begin; + using handler_type = detail::dynamic_specs_handler; + auto type = detail::type_constant::value; + auto checker = + detail::specs_checker(handler_type(specs_, ctx), type); + auto it = detail::parse_format_specs(begin, end, checker); + auto eh = ctx.error_handler(); + switch (type) { + case detail::type::none_type: + FMT_ASSERT(false, "invalid argument type"); + break; + case detail::type::bool_type: + if (specs_.type == presentation_type::none || + specs_.type == presentation_type::string) { + break; + } + FMT_FALLTHROUGH; + case detail::type::int_type: + case detail::type::uint_type: + case detail::type::long_long_type: + case detail::type::ulong_long_type: + case detail::type::int128_type: + case detail::type::uint128_type: + detail::check_int_type_spec(specs_.type, eh); + break; + case detail::type::char_type: + detail::check_char_specs(specs_, eh); + break; + case detail::type::float_type: + if (detail::const_check(FMT_USE_FLOAT)) + detail::parse_float_type_spec(specs_, eh); + else + FMT_ASSERT(false, "float support disabled"); + break; + case detail::type::double_type: + if (detail::const_check(FMT_USE_DOUBLE)) + detail::parse_float_type_spec(specs_, eh); + else + FMT_ASSERT(false, "double support disabled"); + break; + case detail::type::long_double_type: + if (detail::const_check(FMT_USE_LONG_DOUBLE)) + detail::parse_float_type_spec(specs_, eh); + else + FMT_ASSERT(false, "long double support disabled"); + break; + case detail::type::cstring_type: + detail::check_cstring_type_spec(specs_.type, eh); + break; + case detail::type::string_type: + detail::check_string_type_spec(specs_.type, eh); + break; + case detail::type::pointer_type: + detail::check_pointer_type_spec(specs_.type, eh); + break; + case detail::type::custom_type: + // Custom format specifiers are checked in parse functions of + // formatter specializations. + break; + } + return it; + } + + template ::value, + enable_if_t<(U == detail::type::string_type || + U == detail::type::cstring_type || + U == detail::type::char_type), + int> = 0> + FMT_CONSTEXPR void set_debug_format() { + specs_.type = presentation_type::debug; + } + + template + FMT_CONSTEXPR auto format(const T& val, FormatContext& ctx) const + -> decltype(ctx.out()); +}; + +#define FMT_FORMAT_AS(Type, Base) \ + template \ + struct formatter : formatter { \ + template \ + auto format(Type const& val, FormatContext& ctx) const \ + -> decltype(ctx.out()) { \ + return formatter::format(static_cast(val), ctx); \ + } \ + } + +FMT_FORMAT_AS(signed char, int); +FMT_FORMAT_AS(unsigned char, unsigned); +FMT_FORMAT_AS(short, int); +FMT_FORMAT_AS(unsigned short, unsigned); +FMT_FORMAT_AS(long, long long); +FMT_FORMAT_AS(unsigned long, unsigned long long); +FMT_FORMAT_AS(Char*, const Char*); #if FMT_USE_STRING -template -std::basic_string vformat( - basic_string_view format_str, - basic_format_args>> args); +FMT_FORMAT_AS(std::basic_string, basic_string_view); #endif +FMT_FORMAT_AS(std::nullptr_t, const void*); +FMT_FORMAT_AS(detail::std_string_view, basic_string_view); -template -typename buffer_context::iterator vformat_to( - buffer& buf, basic_string_view format_str, - basic_format_args>> args); -} // namespace internal +template struct basic_runtime { basic_string_view str; }; +/** A compile-time format string. */ +template class basic_format_string { + private: + basic_string_view str_; + + public: + template >::value)> + FMT_CONSTEVAL FMT_INLINE basic_format_string(const S& s) : str_(s) { + static_assert( + detail::count< + (std::is_base_of>::value && + std::is_reference::value)...>() == 0, + "passing views as lvalues is disallowed"); +#ifdef FMT_HAS_CONSTEVAL + if constexpr (detail::count_named_args() == + detail::count_statically_named_args()) { + using checker = detail::format_string_checker...>; + detail::parse_format_string(str_, checker(s, {})); + } +#else + detail::check_format_string(s); +#endif + } + basic_format_string(basic_runtime r) : str_(r.str) {} + + FMT_INLINE operator basic_string_view() const { return str_; } +}; + +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 +// Workaround broken conversion on older gcc. +template using format_string = string_view; +template using format_string_w = string_view; +inline auto runtime(string_view s) -> string_view { return s; } +#else +template +using format_string = basic_format_string...>; +template /** \rst - Returns a named argument to be used in a formatting function. It should only - be used in a call to a formatting function. + Creates a runtime format string. **Example**:: - fmt::print("Elapsed time: {s:.2f} seconds", fmt::arg("s", 1.23)); + // Check format string at runtime instead of compile-time. + fmt::print(fmt::runtime("{:d}"), "I am not a number"); \endrst */ -template > -inline internal::named_arg arg(const S& name, const T& arg) { - static_assert(internal::is_string::value, ""); - return {name, arg}; -} - -// Disable nested named arguments, e.g. ``arg("a", arg("b", 42))``. -template -void arg(S, internal::named_arg) = delete; - -/** Formats a string and writes the output to ``out``. */ -// GCC 8 and earlier cannot handle std::back_insert_iterator with -// vformat_to(...) overload, so SFINAE on iterator type instead. -template , - FMT_ENABLE_IF( - internal::is_contiguous_back_insert_iterator::value)> -OutputIt vformat_to( - OutputIt out, const S& format_str, - basic_format_args>> args) { - using container = remove_reference_t; - internal::container_buffer buf((internal::get_container(out))); - internal::vformat_to(buf, to_string_view(format_str), args); - return out; -} - -template ::value&& internal::is_string::value)> -inline fmt::back_insert_iterator format_to( - fmt::back_insert_iterator out, const S& format_str, - Args&&... args) { - return vformat_to(out, to_string_view(format_str), - internal::make_args_checked(format_str, args...)); -} +inline auto runtime(string_view s) -> basic_runtime { return {{s}}; } +#endif #if FMT_USE_STRING -template > -inline std::basic_string vformat( - const S& format_str, - basic_format_args>> args) { - return internal::vformat(to_string_view(format_str), args); -} +FMT_API auto vformat(string_view fmt, format_args args) -> std::string; +FMT_API auto vformat(basic_string_view fmt, basic_format_args> args) -> std::wstring; /** \rst - Formats arguments and returns the result as a string. + Formats ``args`` according to specifications in ``fmt`` and returns the result + as a string. **Example**:: #include - std::string message = fmt::format("The answer is {}", 42); + std::string message = fmt::format("The answer is {}.", 42); \endrst */ -// Pass char_t as a default template parameter instead of using -// std::basic_string> to reduce the symbol size. -template > -inline std::basic_string format(const S& format_str, Args&&... args) { - return internal::vformat( - to_string_view(format_str), - internal::make_args_checked(format_str, args...)); +template +FMT_NODISCARD FMT_INLINE auto format(format_string fmt, T&&... args) + -> std::string { + return vformat(fmt, fmt::make_format_args(args...)); +} + + template +FMT_NODISCARD FMT_INLINE auto format(basic_string_view fmt, T&&... args) + -> std::wstring { + return vformat(fmt, fmt::make_format_args>(args...)); } #endif +/** Formats a string and writes the output to ``out``. */ +template +auto vformat_to(OutputIt out, basic_string_view fmt, + basic_format_args args, detail::locale_ref loc = {}) -> OutputIt { + using detail::get_buffer; + auto&& buf = get_buffer(out); + detail::vformat_to(buf, fmt, args, loc); + return detail::get_iterator(buf); +} + +/** + \rst + Formats ``args`` according to specifications in ``fmt``, writes the result to + the output iterator ``out`` and returns the iterator past the end of the output + range. `format_to` does not append a terminating null character. + + **Example**:: + + auto out = std::vector(); + fmt::format_to(std::back_inserter(out), "{}", 42); + \endrst + */ +template +FMT_INLINE auto format_to(OutputIt out, basic_string_view fmt, T&&... args) + -> OutputIt { + return vformat_to>(out, fmt, fmt::make_format_args>(args...)); +} + +/** Returns the number of chars in the output of ``format(fmt, args...)``. */ +template +FMT_NODISCARD FMT_INLINE auto formatted_size(format_string fmt, + T&&... args) -> size_t { + auto buf = detail::counting_buffer<>(); + detail::vformat_to(buf, string_view(fmt), fmt::make_format_args(args...), {}); + return buf.count(); +} + +FMT_MODULE_EXPORT_END +FMT_GCC_PRAGMA("GCC pop_options") FMT_END_NAMESPACE +#ifdef FMT_HEADER_ONLY +# include "format.h" +#endif #endif // FMT_CORE_H_ diff --git a/Source/ThirdParty/fmt/format-inl.h b/Source/ThirdParty/fmt/format-inl.h index 52bc5e51d..66f14d4e4 100644 --- a/Source/ThirdParty/fmt/format-inl.h +++ b/Source/ThirdParty/fmt/format-inl.h @@ -10,57 +10,28 @@ #include "format.h" -#include #include #include -#include +#include // errno #include -#include -#include #include #include -#include +#include // std::memmove +#if FMT_USE_STRING +#include +#endif +#if FMT_EXCEPTIONS +#include +#endif -#if !defined(FMT_STATIC_THOUSANDS_SEPARATOR) +#ifndef FMT_STATIC_THOUSANDS_SEPARATOR # include #endif -#ifdef _WIN32 -# include -# include -#endif - -#ifdef _MSC_VER -# pragma warning(push) -# pragma warning(disable : 4702) // unreachable code -#endif - -// Dummy implementations of strerror_r and strerror_s called if corresponding -// system functions are not available. -inline fmt::internal::null<> strerror_r(int, char*, ...) { return {}; } -inline fmt::internal::null<> strerror_s(char*, std::size_t, ...) { return {}; } - FMT_BEGIN_NAMESPACE -namespace internal { - -#ifndef _MSC_VER -# define FMT_SNPRINTF snprintf -#else // _MSC_VER -inline int fmt_snprintf(char* buffer, size_t size, const char* format, ...) { - va_list args; - va_start(args, format); - int result = vsnprintf_s(buffer, size, _TRUNCATE, format, args); - va_end(args); - return result; -} -# define FMT_SNPRINTF fmt_snprintf -#endif // _MSC_VER - -} // namespace internal - -#if !defined(FMT_STATIC_THOUSANDS_SEPARATOR) -namespace internal { +namespace detail { +#ifndef FMT_STATIC_THOUSANDS_SEPARATOR template locale_ref::locale_ref(const Locale& loc) : locale_(&loc) { static_assert(std::is_same::value, ""); @@ -71,299 +42,1300 @@ template Locale locale_ref::get() const { return locale_ ? *static_cast(locale_) : std::locale(); } +template +FMT_FUNC auto thousands_sep_impl(locale_ref loc) -> thousands_sep_result { + auto& facet = std::use_facet>(loc.get()); #if FMT_USE_LOCALE_GROUPING -template FMT_FUNC std::string grouping_impl(locale_ref loc) { - return std::use_facet>(loc.get()).grouping(); -} + auto grouping = facet.grouping(); + auto thousands_sep = grouping.empty() ? Char() : facet.thousands_sep(); + return {std::move(grouping), thousands_sep}; +#else + return {Char()}; #endif -template FMT_FUNC Char thousands_sep_impl(locale_ref loc) { - return std::use_facet>(loc.get()) - .thousands_sep(); } template FMT_FUNC Char decimal_point_impl(locale_ref loc) { return std::use_facet>(loc.get()) .decimal_point(); } -} // namespace internal #else -#if FMT_USE_LOCALE_GROUPING template -FMT_FUNC std::string internal::grouping_impl(locale_ref) { - return "\03"; +FMT_FUNC auto thousands_sep_impl(locale_ref) -> thousands_sep_result { + return {"\03", FMT_STATIC_THOUSANDS_SEPARATOR}; } -#endif -template -FMT_FUNC Char internal::thousands_sep_impl(locale_ref) { - return FMT_STATIC_THOUSANDS_SEPARATOR; -} -template -FMT_FUNC Char internal::decimal_point_impl(locale_ref) { +template FMT_FUNC Char decimal_point_impl(locale_ref) { return '.'; } #endif +} // namespace detail -namespace internal { +namespace detail { -template <> FMT_FUNC int count_digits<4>(internal::fallback_uintptr n) { - // fallback_uintptr is always stored in little endian. - int i = static_cast(sizeof(void*)) - 1; - while (i > 0 && n.value[i] == 0) --i; - auto char_digits = std::numeric_limits::digits / 4; - return i >= 0 ? i * char_digits + count_digits<4, unsigned>(n.value[i]) : 1; +template inline bool operator==(basic_fp x, basic_fp y) { + return x.f == y.f && x.e == y.e; } -const char basic_data::digits[] = - "0001020304050607080910111213141516171819" - "2021222324252627282930313233343536373839" - "4041424344454647484950515253545556575859" - "6061626364656667686970717273747576777879" - "8081828384858687888990919293949596979899"; - -const char basic_data::hex_digits[] = "0123456789abcdef"; - -#define FMT_POWERS_OF_10(factor) \ - factor * 10, (factor)*100, (factor)*1000, (factor)*10000, (factor)*100000, \ - (factor)*1000000, (factor)*10000000, (factor)*100000000, \ - (factor)*1000000000 - -const uint64_t basic_data::powers_of_10_64[] = { - 1, FMT_POWERS_OF_10(1), FMT_POWERS_OF_10(1000000000ULL), - 10000000000000000000ULL}; - -const uint32_t basic_data::zero_or_powers_of_10_32[] = {0, - FMT_POWERS_OF_10(1)}; - -const uint64_t basic_data::zero_or_powers_of_10_64[] = { - 0, FMT_POWERS_OF_10(1), FMT_POWERS_OF_10(1000000000ULL), - 10000000000000000000ULL}; - -// Normalized 64-bit significands of pow(10, k), for k = -348, -340, ..., 340. -// These are generated by support/compute-powers.py. -const uint64_t basic_data::pow10_significands[] = { - 0xfa8fd5a0081c0288, 0xbaaee17fa23ebf76, 0x8b16fb203055ac76, - 0xcf42894a5dce35ea, 0x9a6bb0aa55653b2d, 0xe61acf033d1a45df, - 0xab70fe17c79ac6ca, 0xff77b1fcbebcdc4f, 0xbe5691ef416bd60c, - 0x8dd01fad907ffc3c, 0xd3515c2831559a83, 0x9d71ac8fada6c9b5, - 0xea9c227723ee8bcb, 0xaecc49914078536d, 0x823c12795db6ce57, - 0xc21094364dfb5637, 0x9096ea6f3848984f, 0xd77485cb25823ac7, - 0xa086cfcd97bf97f4, 0xef340a98172aace5, 0xb23867fb2a35b28e, - 0x84c8d4dfd2c63f3b, 0xc5dd44271ad3cdba, 0x936b9fcebb25c996, - 0xdbac6c247d62a584, 0xa3ab66580d5fdaf6, 0xf3e2f893dec3f126, - 0xb5b5ada8aaff80b8, 0x87625f056c7c4a8b, 0xc9bcff6034c13053, - 0x964e858c91ba2655, 0xdff9772470297ebd, 0xa6dfbd9fb8e5b88f, - 0xf8a95fcf88747d94, 0xb94470938fa89bcf, 0x8a08f0f8bf0f156b, - 0xcdb02555653131b6, 0x993fe2c6d07b7fac, 0xe45c10c42a2b3b06, - 0xaa242499697392d3, 0xfd87b5f28300ca0e, 0xbce5086492111aeb, - 0x8cbccc096f5088cc, 0xd1b71758e219652c, 0x9c40000000000000, - 0xe8d4a51000000000, 0xad78ebc5ac620000, 0x813f3978f8940984, - 0xc097ce7bc90715b3, 0x8f7e32ce7bea5c70, 0xd5d238a4abe98068, - 0x9f4f2726179a2245, 0xed63a231d4c4fb27, 0xb0de65388cc8ada8, - 0x83c7088e1aab65db, 0xc45d1df942711d9a, 0x924d692ca61be758, - 0xda01ee641a708dea, 0xa26da3999aef774a, 0xf209787bb47d6b85, - 0xb454e4a179dd1877, 0x865b86925b9bc5c2, 0xc83553c5c8965d3d, - 0x952ab45cfa97a0b3, 0xde469fbd99a05fe3, 0xa59bc234db398c25, - 0xf6c69a72a3989f5c, 0xb7dcbf5354e9bece, 0x88fcf317f22241e2, - 0xcc20ce9bd35c78a5, 0x98165af37b2153df, 0xe2a0b5dc971f303a, - 0xa8d9d1535ce3b396, 0xfb9b7cd9a4a7443c, 0xbb764c4ca7a44410, - 0x8bab8eefb6409c1a, 0xd01fef10a657842c, 0x9b10a4e5e9913129, - 0xe7109bfba19c0c9d, 0xac2820d9623bf429, 0x80444b5e7aa7cf85, - 0xbf21e44003acdd2d, 0x8e679c2f5e44ff8f, 0xd433179d9c8cb841, - 0x9e19db92b4e31ba9, 0xeb96bf6ebadf77d9, 0xaf87023b9bf0ee6b, -}; - -// Binary exponents of pow(10, k), for k = -348, -340, ..., 340, corresponding -// to significands above. -const int16_t basic_data::pow10_exponents[] = { - -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, -954, - -927, -901, -874, -847, -821, -794, -768, -741, -715, -688, -661, - -635, -608, -582, -555, -529, -502, -475, -449, -422, -396, -369, - -343, -316, -289, -263, -236, -210, -183, -157, -130, -103, -77, - -50, -24, 3, 30, 56, 83, 109, 136, 162, 189, 216, - 242, 269, 295, 322, 348, 375, 402, 428, 455, 481, 508, - 534, 561, 588, 614, 641, 667, 694, 720, 747, 774, 800, - 827, 853, 880, 907, 933, 960, 986, 1013, 1039, 1066}; - -const char basic_data::signs[] = {0, '-', '+', ' '}; - -template struct bits { - static FMT_CONSTEXPR_DECL const int value = - static_cast(sizeof(T) * std::numeric_limits::digits); -}; - -class fp; -template fp normalize(fp value); - -// Lower (upper) boundary is a value half way between a floating-point value -// and its predecessor (successor). Boundaries have the same exponent as the -// value so only significands are stored. -struct boundaries { - uint64_t lower; - uint64_t upper; -}; - -// A handmade floating-point number f * pow(2, e). -class fp { - private: - using significand_type = uint64_t; - - public: - significand_type f; - int e; - - // All sizes are in bits. - // Subtract 1 to account for an implicit most significant bit in the - // normalized form. - static FMT_CONSTEXPR_DECL const int double_significand_size = - std::numeric_limits::digits - 1; - static FMT_CONSTEXPR_DECL const uint64_t implicit_bit = - 1ULL << double_significand_size; - static FMT_CONSTEXPR_DECL const int significand_size = - bits::value; - - fp() : f(0), e(0) {} - fp(uint64_t f_val, int e_val) : f(f_val), e(e_val) {} - - // Constructs fp from an IEEE754 double. It is a template to prevent compile - // errors on platforms where double is not IEEE754. - template explicit fp(Double d) { assign(d); } - - // Assigns d to this and return true iff predecessor is closer than successor. - template - bool assign(Double d) { - // Assume double is in the format [sign][exponent][significand]. - using limits = std::numeric_limits; - const int exponent_size = - bits::value - double_significand_size - 1; // -1 for sign - const uint64_t significand_mask = implicit_bit - 1; - const uint64_t exponent_mask = (~0ULL >> 1) & ~significand_mask; - const int exponent_bias = (1 << exponent_size) - limits::max_exponent - 1; - auto u = bit_cast(d); - f = u & significand_mask; - int biased_e = - static_cast((u & exponent_mask) >> double_significand_size); - // Predecessor is closer if d is a normalized power of 2 (f == 0) other than - // the smallest normalized number (biased_e > 1). - bool is_predecessor_closer = f == 0 && biased_e > 1; - if (biased_e != 0) - f += implicit_bit; - else - biased_e = 1; // Subnormals use biased exponent 1 (min exponent). - e = biased_e - exponent_bias - double_significand_size; - return is_predecessor_closer; - } - - template - bool assign(Double) { - *this = fp(); - return false; - } - - // Assigns d to this together with computing lower and upper boundaries, - // where a boundary is a value half way between the number and its predecessor - // (lower) or successor (upper). The upper boundary is normalized and lower - // has the same exponent but may be not normalized. - template boundaries assign_with_boundaries(Double d) { - bool is_lower_closer = assign(d); - fp lower = - is_lower_closer ? fp((f << 2) - 1, e - 2) : fp((f << 1) - 1, e - 1); - // 1 in normalize accounts for the exponent shift above. - fp upper = normalize<1>(fp((f << 1) + 1, e - 1)); - lower.f <<= lower.e - upper.e; - return boundaries{lower.f, upper.f}; - } - - template boundaries assign_float_with_boundaries(Double d) { - assign(d); - constexpr int min_normal_e = std::numeric_limits::min_exponent - - std::numeric_limits::digits; - significand_type half_ulp = 1 << (std::numeric_limits::digits - - std::numeric_limits::digits - 1); - if (min_normal_e > e) half_ulp <<= min_normal_e - e; - fp upper = normalize<0>(fp(f + half_ulp, e)); - fp lower = fp( - f - (half_ulp >> ((f == implicit_bit && e > min_normal_e) ? 1 : 0)), e); - lower.f <<= lower.e - upper.e; - return boundaries{lower.f, upper.f}; - } -}; - -// Normalizes the value converted from double and multiplied by (1 << SHIFT). -template fp normalize(fp value) { - // Handle subnormals. - const auto shifted_implicit_bit = fp::implicit_bit << SHIFT; - while ((value.f & shifted_implicit_bit) == 0) { - value.f <<= 1; - --value.e; - } - // Subtract 1 to account for hidden bit. - const auto offset = - fp::significand_size - fp::double_significand_size - SHIFT - 1; - value.f <<= offset; - value.e -= offset; - return value; +// Compilers should be able to optimize this into the ror instruction. +FMT_CONSTEXPR inline uint32_t rotr(uint32_t n, uint32_t r) noexcept { + r &= 31; + return (n >> r) | (n << (32 - r)); +} +FMT_CONSTEXPR inline uint64_t rotr(uint64_t n, uint32_t r) noexcept { + r &= 63; + return (n >> r) | (n << (64 - r)); } -inline bool operator==(fp x, fp y) { return x.f == y.f && x.e == y.e; } - -// Computes lhs * rhs / pow(2, 64) rounded to nearest with half-up tie breaking. -inline uint64_t multiply(uint64_t lhs, uint64_t rhs) { +// Computes 128-bit result of multiplication of two 64-bit unsigned integers. +inline uint128_fallback umul128(uint64_t x, uint64_t y) noexcept { #if FMT_USE_INT128 - auto product = static_cast<__uint128_t>(lhs) * rhs; - auto f = static_cast(product >> 64); - return (static_cast(product) & (1ULL << 63)) != 0 ? f + 1 : f; + auto p = static_cast(x) * static_cast(y); + return {static_cast(p >> 64), static_cast(p)}; +#elif defined(_MSC_VER) && defined(_M_X64) + auto result = uint128_fallback(); + result.lo_ = _umul128(x, y, &result.hi_); + return result; #else - // Multiply 32-bit parts of significands. - uint64_t mask = (1ULL << 32) - 1; - uint64_t a = lhs >> 32, b = lhs & mask; - uint64_t c = rhs >> 32, d = rhs & mask; - uint64_t ac = a * c, bc = b * c, ad = a * d, bd = b * d; - // Compute mid 64-bit of result and round. - uint64_t mid = (bd >> 32) + (ad & mask) + (bc & mask) + (1U << 31); - return ac + (ad >> 32) + (bc >> 32) + (mid >> 32); + const uint64_t mask = static_cast(max_value()); + + uint64_t a = x >> 32; + uint64_t b = x & mask; + uint64_t c = y >> 32; + uint64_t d = y & mask; + + uint64_t ac = a * c; + uint64_t bc = b * c; + uint64_t ad = a * d; + uint64_t bd = b * d; + + uint64_t intermediate = (bd >> 32) + (ad & mask) + (bc & mask); + + return {ac + (intermediate >> 32) + (ad >> 32) + (bc >> 32), + (intermediate << 32) + (bd & mask)}; #endif } -inline fp operator*(fp x, fp y) { return {multiply(x.f, y.f), x.e + y.e + 64}; } - -// Returns a cached power of 10 `c_k = c_k.f * pow(2, c_k.e)` such that its -// (binary) exponent satisfies `min_exponent <= c_k.e <= min_exponent + 28`. -inline fp get_cached_power(int min_exponent, int& pow10_exponent) { - const int64_t one_over_log2_10 = 0x4d104d42; // round(pow(2, 32) / log2(10)) - int index = static_cast( - ((min_exponent + fp::significand_size - 1) * one_over_log2_10 + - ((int64_t(1) << 32) - 1)) // ceil - >> 32 // arithmetic shift - ); - // Decimal exponent of the first (smallest) cached power of 10. - const int first_dec_exp = -348; - // Difference between 2 consecutive decimal exponents in cached powers of 10. - const int dec_exp_step = 8; - index = (index - first_dec_exp - 1) / dec_exp_step + 1; - pow10_exponent = first_dec_exp + index * dec_exp_step; - return {data::pow10_significands[index], data::pow10_exponents[index]}; +// Implementation of Dragonbox algorithm: https://github.com/jk-jeon/dragonbox. +namespace dragonbox { +// Computes upper 64 bits of multiplication of two 64-bit unsigned integers. +inline uint64_t umul128_upper64(uint64_t x, uint64_t y) noexcept { +#if FMT_USE_INT128 + auto p = static_cast(x) * static_cast(y); + return static_cast(p >> 64); +#elif defined(_MSC_VER) && defined(_M_X64) + return __umulh(x, y); +#else + return umul128(x, y).high(); +#endif } -// A simple accumulator to hold the sums of terms in bigint::square if uint128_t -// is not available. -struct accumulator { - uint64_t lower; - uint64_t upper; +// Computes upper 128 bits of multiplication of a 64-bit unsigned integer and a +// 128-bit unsigned integer. +inline uint128_fallback umul192_upper128(uint64_t x, + uint128_fallback y) noexcept { + uint128_fallback r = umul128(x, y.high()); + r += umul128_upper64(x, y.low()); + return r; +} - accumulator() : lower(0), upper(0) {} - explicit operator uint32_t() const { return static_cast(lower); } +// Computes upper 64 bits of multiplication of a 32-bit unsigned integer and a +// 64-bit unsigned integer. +inline uint64_t umul96_upper64(uint32_t x, uint64_t y) noexcept { + return umul128_upper64(static_cast(x) << 32, y); +} - void operator+=(uint64_t n) { - lower += n; - if (lower < n) ++upper; +// Computes lower 128 bits of multiplication of a 64-bit unsigned integer and a +// 128-bit unsigned integer. +inline uint128_fallback umul192_lower128(uint64_t x, + uint128_fallback y) noexcept { + uint64_t high = x * y.high(); + uint128_fallback high_low = umul128(x, y.low()); + return {high + high_low.high(), high_low.low()}; +} + +// Computes lower 64 bits of multiplication of a 32-bit unsigned integer and a +// 64-bit unsigned integer. +inline uint64_t umul96_lower64(uint32_t x, uint64_t y) noexcept { + return x * y; +} + +// Computes floor(log10(pow(2, e))) for e in [-2620, 2620] using the method from +// https://fmt.dev/papers/Dragonbox.pdf#page=28, section 6.1. +inline int floor_log10_pow2(int e) noexcept { + FMT_ASSERT(e <= 2620 && e >= -2620, "too large exponent"); + static_assert((-1 >> 1) == -1, "right shift is not arithmetic"); + return (e * 315653) >> 20; +} + +// Various fast log computations. +inline int floor_log2_pow10(int e) noexcept { + FMT_ASSERT(e <= 1233 && e >= -1233, "too large exponent"); + return (e * 1741647) >> 19; +} +inline int floor_log10_pow2_minus_log10_4_over_3(int e) noexcept { + FMT_ASSERT(e <= 2936 && e >= -2985, "too large exponent"); + return (e * 631305 - 261663) >> 21; +} + +static constexpr struct { + uint32_t divisor; + int shift_amount; +} div_small_pow10_infos[] = {{10, 16}, {100, 16}}; + +// Replaces n by floor(n / pow(10, N)) returning true if and only if n is +// divisible by pow(10, N). +// Precondition: n <= pow(10, N + 1). +template +bool check_divisibility_and_divide_by_pow10(uint32_t& n) noexcept { + // The numbers below are chosen such that: + // 1. floor(n/d) = floor(nm / 2^k) where d=10 or d=100, + // 2. nm mod 2^k < m if and only if n is divisible by d, + // where m is magic_number, k is shift_amount + // and d is divisor. + // + // Item 1 is a common technique of replacing division by a constant with + // multiplication, see e.g. "Division by Invariant Integers Using + // Multiplication" by Granlund and Montgomery (1994). magic_number (m) is set + // to ceil(2^k/d) for large enough k. + // The idea for item 2 originates from Schubfach. + constexpr auto info = div_small_pow10_infos[N - 1]; + FMT_ASSERT(n <= info.divisor * 10, "n is too large"); + constexpr uint32_t magic_number = + (1u << info.shift_amount) / info.divisor + 1; + n *= magic_number; + const uint32_t comparison_mask = (1u << info.shift_amount) - 1; + bool result = (n & comparison_mask) < magic_number; + n >>= info.shift_amount; + return result; +} + +// Computes floor(n / pow(10, N)) for small n and N. +// Precondition: n <= pow(10, N + 1). +template uint32_t small_division_by_pow10(uint32_t n) noexcept { + constexpr auto info = div_small_pow10_infos[N - 1]; + FMT_ASSERT(n <= info.divisor * 10, "n is too large"); + constexpr uint32_t magic_number = + (1u << info.shift_amount) / info.divisor + 1; + return (n * magic_number) >> info.shift_amount; +} + +// Computes floor(n / 10^(kappa + 1)) (float) +inline uint32_t divide_by_10_to_kappa_plus_1(uint32_t n) noexcept { + // 1374389535 = ceil(2^37/100) + return static_cast((static_cast(n) * 1374389535) >> 37); +} +// Computes floor(n / 10^(kappa + 1)) (double) +inline uint64_t divide_by_10_to_kappa_plus_1(uint64_t n) noexcept { + // 2361183241434822607 = ceil(2^(64+7)/1000) + return umul128_upper64(n, 2361183241434822607ull) >> 7; +} + +// Various subroutines using pow10 cache +template struct cache_accessor; + +template <> struct cache_accessor { + using carrier_uint = float_info::carrier_uint; + using cache_entry_type = uint64_t; + + static uint64_t get_cached_power(int k) noexcept { + FMT_ASSERT(k >= float_info::min_k && k <= float_info::max_k, + "k is out of range"); + static constexpr const uint64_t pow10_significands[] = { + 0x81ceb32c4b43fcf5, 0xa2425ff75e14fc32, 0xcad2f7f5359a3b3f, + 0xfd87b5f28300ca0e, 0x9e74d1b791e07e49, 0xc612062576589ddb, + 0xf79687aed3eec552, 0x9abe14cd44753b53, 0xc16d9a0095928a28, + 0xf1c90080baf72cb2, 0x971da05074da7bef, 0xbce5086492111aeb, + 0xec1e4a7db69561a6, 0x9392ee8e921d5d08, 0xb877aa3236a4b44a, + 0xe69594bec44de15c, 0x901d7cf73ab0acda, 0xb424dc35095cd810, + 0xe12e13424bb40e14, 0x8cbccc096f5088cc, 0xafebff0bcb24aaff, + 0xdbe6fecebdedd5bf, 0x89705f4136b4a598, 0xabcc77118461cefd, + 0xd6bf94d5e57a42bd, 0x8637bd05af6c69b6, 0xa7c5ac471b478424, + 0xd1b71758e219652c, 0x83126e978d4fdf3c, 0xa3d70a3d70a3d70b, + 0xcccccccccccccccd, 0x8000000000000000, 0xa000000000000000, + 0xc800000000000000, 0xfa00000000000000, 0x9c40000000000000, + 0xc350000000000000, 0xf424000000000000, 0x9896800000000000, + 0xbebc200000000000, 0xee6b280000000000, 0x9502f90000000000, + 0xba43b74000000000, 0xe8d4a51000000000, 0x9184e72a00000000, + 0xb5e620f480000000, 0xe35fa931a0000000, 0x8e1bc9bf04000000, + 0xb1a2bc2ec5000000, 0xde0b6b3a76400000, 0x8ac7230489e80000, + 0xad78ebc5ac620000, 0xd8d726b7177a8000, 0x878678326eac9000, + 0xa968163f0a57b400, 0xd3c21bcecceda100, 0x84595161401484a0, + 0xa56fa5b99019a5c8, 0xcecb8f27f4200f3a, 0x813f3978f8940985, + 0xa18f07d736b90be6, 0xc9f2c9cd04674edf, 0xfc6f7c4045812297, + 0x9dc5ada82b70b59e, 0xc5371912364ce306, 0xf684df56c3e01bc7, + 0x9a130b963a6c115d, 0xc097ce7bc90715b4, 0xf0bdc21abb48db21, + 0x96769950b50d88f5, 0xbc143fa4e250eb32, 0xeb194f8e1ae525fe, + 0x92efd1b8d0cf37bf, 0xb7abc627050305ae, 0xe596b7b0c643c71a, + 0x8f7e32ce7bea5c70, 0xb35dbf821ae4f38c, 0xe0352f62a19e306f}; + return pow10_significands[k - float_info::min_k]; } - void operator>>=(int shift) { - FMT_ASSERT(shift == 32, ""); - (void)shift; - lower = (upper << 32) | (lower >> 32); - upper >>= 32; + + struct compute_mul_result { + carrier_uint result; + bool is_integer; + }; + struct compute_mul_parity_result { + bool parity; + bool is_integer; + }; + + static compute_mul_result compute_mul( + carrier_uint u, const cache_entry_type& cache) noexcept { + auto r = umul96_upper64(u, cache); + return {static_cast(r >> 32), + static_cast(r) == 0}; + } + + static uint32_t compute_delta(const cache_entry_type& cache, + int beta) noexcept { + return static_cast(cache >> (64 - 1 - beta)); + } + + static compute_mul_parity_result compute_mul_parity( + carrier_uint two_f, const cache_entry_type& cache, int beta) noexcept { + FMT_ASSERT(beta >= 1, ""); + FMT_ASSERT(beta < 64, ""); + + auto r = umul96_lower64(two_f, cache); + return {((r >> (64 - beta)) & 1) != 0, + static_cast(r >> (32 - beta)) == 0}; + } + + static carrier_uint compute_left_endpoint_for_shorter_interval_case( + const cache_entry_type& cache, int beta) noexcept { + return static_cast( + (cache - (cache >> (num_significand_bits() + 2))) >> + (64 - num_significand_bits() - 1 - beta)); + } + + static carrier_uint compute_right_endpoint_for_shorter_interval_case( + const cache_entry_type& cache, int beta) noexcept { + return static_cast( + (cache + (cache >> (num_significand_bits() + 1))) >> + (64 - num_significand_bits() - 1 - beta)); + } + + static carrier_uint compute_round_up_for_shorter_interval_case( + const cache_entry_type& cache, int beta) noexcept { + return (static_cast( + cache >> (64 - num_significand_bits() - 2 - beta)) + + 1) / + 2; } }; +template <> struct cache_accessor { + using carrier_uint = float_info::carrier_uint; + using cache_entry_type = uint128_fallback; + + static uint128_fallback get_cached_power(int k) noexcept { + FMT_ASSERT(k >= float_info::min_k && k <= float_info::max_k, + "k is out of range"); + + static constexpr const uint128_fallback pow10_significands[] = { +#if FMT_USE_FULL_CACHE_DRAGONBOX + {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b}, + {0x9faacf3df73609b1, 0x77b191618c54e9ad}, + {0xc795830d75038c1d, 0xd59df5b9ef6a2418}, + {0xf97ae3d0d2446f25, 0x4b0573286b44ad1e}, + {0x9becce62836ac577, 0x4ee367f9430aec33}, + {0xc2e801fb244576d5, 0x229c41f793cda740}, + {0xf3a20279ed56d48a, 0x6b43527578c11110}, + {0x9845418c345644d6, 0x830a13896b78aaaa}, + {0xbe5691ef416bd60c, 0x23cc986bc656d554}, + {0xedec366b11c6cb8f, 0x2cbfbe86b7ec8aa9}, + {0x94b3a202eb1c3f39, 0x7bf7d71432f3d6aa}, + {0xb9e08a83a5e34f07, 0xdaf5ccd93fb0cc54}, + {0xe858ad248f5c22c9, 0xd1b3400f8f9cff69}, + {0x91376c36d99995be, 0x23100809b9c21fa2}, + {0xb58547448ffffb2d, 0xabd40a0c2832a78b}, + {0xe2e69915b3fff9f9, 0x16c90c8f323f516d}, + {0x8dd01fad907ffc3b, 0xae3da7d97f6792e4}, + {0xb1442798f49ffb4a, 0x99cd11cfdf41779d}, + {0xdd95317f31c7fa1d, 0x40405643d711d584}, + {0x8a7d3eef7f1cfc52, 0x482835ea666b2573}, + {0xad1c8eab5ee43b66, 0xda3243650005eed0}, + {0xd863b256369d4a40, 0x90bed43e40076a83}, + {0x873e4f75e2224e68, 0x5a7744a6e804a292}, + {0xa90de3535aaae202, 0x711515d0a205cb37}, + {0xd3515c2831559a83, 0x0d5a5b44ca873e04}, + {0x8412d9991ed58091, 0xe858790afe9486c3}, + {0xa5178fff668ae0b6, 0x626e974dbe39a873}, + {0xce5d73ff402d98e3, 0xfb0a3d212dc81290}, + {0x80fa687f881c7f8e, 0x7ce66634bc9d0b9a}, + {0xa139029f6a239f72, 0x1c1fffc1ebc44e81}, + {0xc987434744ac874e, 0xa327ffb266b56221}, + {0xfbe9141915d7a922, 0x4bf1ff9f0062baa9}, + {0x9d71ac8fada6c9b5, 0x6f773fc3603db4aa}, + {0xc4ce17b399107c22, 0xcb550fb4384d21d4}, + {0xf6019da07f549b2b, 0x7e2a53a146606a49}, + {0x99c102844f94e0fb, 0x2eda7444cbfc426e}, + {0xc0314325637a1939, 0xfa911155fefb5309}, + {0xf03d93eebc589f88, 0x793555ab7eba27cb}, + {0x96267c7535b763b5, 0x4bc1558b2f3458df}, + {0xbbb01b9283253ca2, 0x9eb1aaedfb016f17}, + {0xea9c227723ee8bcb, 0x465e15a979c1cadd}, + {0x92a1958a7675175f, 0x0bfacd89ec191eca}, + {0xb749faed14125d36, 0xcef980ec671f667c}, + {0xe51c79a85916f484, 0x82b7e12780e7401b}, + {0x8f31cc0937ae58d2, 0xd1b2ecb8b0908811}, + {0xb2fe3f0b8599ef07, 0x861fa7e6dcb4aa16}, + {0xdfbdcece67006ac9, 0x67a791e093e1d49b}, + {0x8bd6a141006042bd, 0xe0c8bb2c5c6d24e1}, + {0xaecc49914078536d, 0x58fae9f773886e19}, + {0xda7f5bf590966848, 0xaf39a475506a899f}, + {0x888f99797a5e012d, 0x6d8406c952429604}, + {0xaab37fd7d8f58178, 0xc8e5087ba6d33b84}, + {0xd5605fcdcf32e1d6, 0xfb1e4a9a90880a65}, + {0x855c3be0a17fcd26, 0x5cf2eea09a550680}, + {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f}, + {0xd0601d8efc57b08b, 0xf13b94daf124da27}, + {0x823c12795db6ce57, 0x76c53d08d6b70859}, + {0xa2cb1717b52481ed, 0x54768c4b0c64ca6f}, + {0xcb7ddcdda26da268, 0xa9942f5dcf7dfd0a}, + {0xfe5d54150b090b02, 0xd3f93b35435d7c4d}, + {0x9efa548d26e5a6e1, 0xc47bc5014a1a6db0}, + {0xc6b8e9b0709f109a, 0x359ab6419ca1091c}, + {0xf867241c8cc6d4c0, 0xc30163d203c94b63}, + {0x9b407691d7fc44f8, 0x79e0de63425dcf1e}, + {0xc21094364dfb5636, 0x985915fc12f542e5}, + {0xf294b943e17a2bc4, 0x3e6f5b7b17b2939e}, + {0x979cf3ca6cec5b5a, 0xa705992ceecf9c43}, + {0xbd8430bd08277231, 0x50c6ff782a838354}, + {0xece53cec4a314ebd, 0xa4f8bf5635246429}, + {0x940f4613ae5ed136, 0x871b7795e136be9a}, + {0xb913179899f68584, 0x28e2557b59846e40}, + {0xe757dd7ec07426e5, 0x331aeada2fe589d0}, + {0x9096ea6f3848984f, 0x3ff0d2c85def7622}, + {0xb4bca50b065abe63, 0x0fed077a756b53aa}, + {0xe1ebce4dc7f16dfb, 0xd3e8495912c62895}, + {0x8d3360f09cf6e4bd, 0x64712dd7abbbd95d}, + {0xb080392cc4349dec, 0xbd8d794d96aacfb4}, + {0xdca04777f541c567, 0xecf0d7a0fc5583a1}, + {0x89e42caaf9491b60, 0xf41686c49db57245}, + {0xac5d37d5b79b6239, 0x311c2875c522ced6}, + {0xd77485cb25823ac7, 0x7d633293366b828c}, + {0x86a8d39ef77164bc, 0xae5dff9c02033198}, + {0xa8530886b54dbdeb, 0xd9f57f830283fdfd}, + {0xd267caa862a12d66, 0xd072df63c324fd7c}, + {0x8380dea93da4bc60, 0x4247cb9e59f71e6e}, + {0xa46116538d0deb78, 0x52d9be85f074e609}, + {0xcd795be870516656, 0x67902e276c921f8c}, + {0x806bd9714632dff6, 0x00ba1cd8a3db53b7}, + {0xa086cfcd97bf97f3, 0x80e8a40eccd228a5}, + {0xc8a883c0fdaf7df0, 0x6122cd128006b2ce}, + {0xfad2a4b13d1b5d6c, 0x796b805720085f82}, + {0x9cc3a6eec6311a63, 0xcbe3303674053bb1}, + {0xc3f490aa77bd60fc, 0xbedbfc4411068a9d}, + {0xf4f1b4d515acb93b, 0xee92fb5515482d45}, + {0x991711052d8bf3c5, 0x751bdd152d4d1c4b}, + {0xbf5cd54678eef0b6, 0xd262d45a78a0635e}, + {0xef340a98172aace4, 0x86fb897116c87c35}, + {0x9580869f0e7aac0e, 0xd45d35e6ae3d4da1}, + {0xbae0a846d2195712, 0x8974836059cca10a}, + {0xe998d258869facd7, 0x2bd1a438703fc94c}, + {0x91ff83775423cc06, 0x7b6306a34627ddd0}, + {0xb67f6455292cbf08, 0x1a3bc84c17b1d543}, + {0xe41f3d6a7377eeca, 0x20caba5f1d9e4a94}, + {0x8e938662882af53e, 0x547eb47b7282ee9d}, + {0xb23867fb2a35b28d, 0xe99e619a4f23aa44}, + {0xdec681f9f4c31f31, 0x6405fa00e2ec94d5}, + {0x8b3c113c38f9f37e, 0xde83bc408dd3dd05}, + {0xae0b158b4738705e, 0x9624ab50b148d446}, + {0xd98ddaee19068c76, 0x3badd624dd9b0958}, + {0x87f8a8d4cfa417c9, 0xe54ca5d70a80e5d7}, + {0xa9f6d30a038d1dbc, 0x5e9fcf4ccd211f4d}, + {0xd47487cc8470652b, 0x7647c32000696720}, + {0x84c8d4dfd2c63f3b, 0x29ecd9f40041e074}, + {0xa5fb0a17c777cf09, 0xf468107100525891}, + {0xcf79cc9db955c2cc, 0x7182148d4066eeb5}, + {0x81ac1fe293d599bf, 0xc6f14cd848405531}, + {0xa21727db38cb002f, 0xb8ada00e5a506a7d}, + {0xca9cf1d206fdc03b, 0xa6d90811f0e4851d}, + {0xfd442e4688bd304a, 0x908f4a166d1da664}, + {0x9e4a9cec15763e2e, 0x9a598e4e043287ff}, + {0xc5dd44271ad3cdba, 0x40eff1e1853f29fe}, + {0xf7549530e188c128, 0xd12bee59e68ef47d}, + {0x9a94dd3e8cf578b9, 0x82bb74f8301958cf}, + {0xc13a148e3032d6e7, 0xe36a52363c1faf02}, + {0xf18899b1bc3f8ca1, 0xdc44e6c3cb279ac2}, + {0x96f5600f15a7b7e5, 0x29ab103a5ef8c0ba}, + {0xbcb2b812db11a5de, 0x7415d448f6b6f0e8}, + {0xebdf661791d60f56, 0x111b495b3464ad22}, + {0x936b9fcebb25c995, 0xcab10dd900beec35}, + {0xb84687c269ef3bfb, 0x3d5d514f40eea743}, + {0xe65829b3046b0afa, 0x0cb4a5a3112a5113}, + {0x8ff71a0fe2c2e6dc, 0x47f0e785eaba72ac}, + {0xb3f4e093db73a093, 0x59ed216765690f57}, + {0xe0f218b8d25088b8, 0x306869c13ec3532d}, + {0x8c974f7383725573, 0x1e414218c73a13fc}, + {0xafbd2350644eeacf, 0xe5d1929ef90898fb}, + {0xdbac6c247d62a583, 0xdf45f746b74abf3a}, + {0x894bc396ce5da772, 0x6b8bba8c328eb784}, + {0xab9eb47c81f5114f, 0x066ea92f3f326565}, + {0xd686619ba27255a2, 0xc80a537b0efefebe}, + {0x8613fd0145877585, 0xbd06742ce95f5f37}, + {0xa798fc4196e952e7, 0x2c48113823b73705}, + {0xd17f3b51fca3a7a0, 0xf75a15862ca504c6}, + {0x82ef85133de648c4, 0x9a984d73dbe722fc}, + {0xa3ab66580d5fdaf5, 0xc13e60d0d2e0ebbb}, + {0xcc963fee10b7d1b3, 0x318df905079926a9}, + {0xffbbcfe994e5c61f, 0xfdf17746497f7053}, + {0x9fd561f1fd0f9bd3, 0xfeb6ea8bedefa634}, + {0xc7caba6e7c5382c8, 0xfe64a52ee96b8fc1}, + {0xf9bd690a1b68637b, 0x3dfdce7aa3c673b1}, + {0x9c1661a651213e2d, 0x06bea10ca65c084f}, + {0xc31bfa0fe5698db8, 0x486e494fcff30a63}, + {0xf3e2f893dec3f126, 0x5a89dba3c3efccfb}, + {0x986ddb5c6b3a76b7, 0xf89629465a75e01d}, + {0xbe89523386091465, 0xf6bbb397f1135824}, + {0xee2ba6c0678b597f, 0x746aa07ded582e2d}, + {0x94db483840b717ef, 0xa8c2a44eb4571cdd}, + {0xba121a4650e4ddeb, 0x92f34d62616ce414}, + {0xe896a0d7e51e1566, 0x77b020baf9c81d18}, + {0x915e2486ef32cd60, 0x0ace1474dc1d122f}, + {0xb5b5ada8aaff80b8, 0x0d819992132456bb}, + {0xe3231912d5bf60e6, 0x10e1fff697ed6c6a}, + {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2}, + {0xb1736b96b6fd83b3, 0xbd308ff8a6b17cb3}, + {0xddd0467c64bce4a0, 0xac7cb3f6d05ddbdf}, + {0x8aa22c0dbef60ee4, 0x6bcdf07a423aa96c}, + {0xad4ab7112eb3929d, 0x86c16c98d2c953c7}, + {0xd89d64d57a607744, 0xe871c7bf077ba8b8}, + {0x87625f056c7c4a8b, 0x11471cd764ad4973}, + {0xa93af6c6c79b5d2d, 0xd598e40d3dd89bd0}, + {0xd389b47879823479, 0x4aff1d108d4ec2c4}, + {0x843610cb4bf160cb, 0xcedf722a585139bb}, + {0xa54394fe1eedb8fe, 0xc2974eb4ee658829}, + {0xce947a3da6a9273e, 0x733d226229feea33}, + {0x811ccc668829b887, 0x0806357d5a3f5260}, + {0xa163ff802a3426a8, 0xca07c2dcb0cf26f8}, + {0xc9bcff6034c13052, 0xfc89b393dd02f0b6}, + {0xfc2c3f3841f17c67, 0xbbac2078d443ace3}, + {0x9d9ba7832936edc0, 0xd54b944b84aa4c0e}, + {0xc5029163f384a931, 0x0a9e795e65d4df12}, + {0xf64335bcf065d37d, 0x4d4617b5ff4a16d6}, + {0x99ea0196163fa42e, 0x504bced1bf8e4e46}, + {0xc06481fb9bcf8d39, 0xe45ec2862f71e1d7}, + {0xf07da27a82c37088, 0x5d767327bb4e5a4d}, + {0x964e858c91ba2655, 0x3a6a07f8d510f870}, + {0xbbe226efb628afea, 0x890489f70a55368c}, + {0xeadab0aba3b2dbe5, 0x2b45ac74ccea842f}, + {0x92c8ae6b464fc96f, 0x3b0b8bc90012929e}, + {0xb77ada0617e3bbcb, 0x09ce6ebb40173745}, + {0xe55990879ddcaabd, 0xcc420a6a101d0516}, + {0x8f57fa54c2a9eab6, 0x9fa946824a12232e}, + {0xb32df8e9f3546564, 0x47939822dc96abfa}, + {0xdff9772470297ebd, 0x59787e2b93bc56f8}, + {0x8bfbea76c619ef36, 0x57eb4edb3c55b65b}, + {0xaefae51477a06b03, 0xede622920b6b23f2}, + {0xdab99e59958885c4, 0xe95fab368e45ecee}, + {0x88b402f7fd75539b, 0x11dbcb0218ebb415}, + {0xaae103b5fcd2a881, 0xd652bdc29f26a11a}, + {0xd59944a37c0752a2, 0x4be76d3346f04960}, + {0x857fcae62d8493a5, 0x6f70a4400c562ddc}, + {0xa6dfbd9fb8e5b88e, 0xcb4ccd500f6bb953}, + {0xd097ad07a71f26b2, 0x7e2000a41346a7a8}, + {0x825ecc24c873782f, 0x8ed400668c0c28c9}, + {0xa2f67f2dfa90563b, 0x728900802f0f32fb}, + {0xcbb41ef979346bca, 0x4f2b40a03ad2ffba}, + {0xfea126b7d78186bc, 0xe2f610c84987bfa9}, + {0x9f24b832e6b0f436, 0x0dd9ca7d2df4d7ca}, + {0xc6ede63fa05d3143, 0x91503d1c79720dbc}, + {0xf8a95fcf88747d94, 0x75a44c6397ce912b}, + {0x9b69dbe1b548ce7c, 0xc986afbe3ee11abb}, + {0xc24452da229b021b, 0xfbe85badce996169}, + {0xf2d56790ab41c2a2, 0xfae27299423fb9c4}, + {0x97c560ba6b0919a5, 0xdccd879fc967d41b}, + {0xbdb6b8e905cb600f, 0x5400e987bbc1c921}, + {0xed246723473e3813, 0x290123e9aab23b69}, + {0x9436c0760c86e30b, 0xf9a0b6720aaf6522}, + {0xb94470938fa89bce, 0xf808e40e8d5b3e6a}, + {0xe7958cb87392c2c2, 0xb60b1d1230b20e05}, + {0x90bd77f3483bb9b9, 0xb1c6f22b5e6f48c3}, + {0xb4ecd5f01a4aa828, 0x1e38aeb6360b1af4}, + {0xe2280b6c20dd5232, 0x25c6da63c38de1b1}, + {0x8d590723948a535f, 0x579c487e5a38ad0f}, + {0xb0af48ec79ace837, 0x2d835a9df0c6d852}, + {0xdcdb1b2798182244, 0xf8e431456cf88e66}, + {0x8a08f0f8bf0f156b, 0x1b8e9ecb641b5900}, + {0xac8b2d36eed2dac5, 0xe272467e3d222f40}, + {0xd7adf884aa879177, 0x5b0ed81dcc6abb10}, + {0x86ccbb52ea94baea, 0x98e947129fc2b4ea}, + {0xa87fea27a539e9a5, 0x3f2398d747b36225}, + {0xd29fe4b18e88640e, 0x8eec7f0d19a03aae}, + {0x83a3eeeef9153e89, 0x1953cf68300424ad}, + {0xa48ceaaab75a8e2b, 0x5fa8c3423c052dd8}, + {0xcdb02555653131b6, 0x3792f412cb06794e}, + {0x808e17555f3ebf11, 0xe2bbd88bbee40bd1}, + {0xa0b19d2ab70e6ed6, 0x5b6aceaeae9d0ec5}, + {0xc8de047564d20a8b, 0xf245825a5a445276}, + {0xfb158592be068d2e, 0xeed6e2f0f0d56713}, + {0x9ced737bb6c4183d, 0x55464dd69685606c}, + {0xc428d05aa4751e4c, 0xaa97e14c3c26b887}, + {0xf53304714d9265df, 0xd53dd99f4b3066a9}, + {0x993fe2c6d07b7fab, 0xe546a8038efe402a}, + {0xbf8fdb78849a5f96, 0xde98520472bdd034}, + {0xef73d256a5c0f77c, 0x963e66858f6d4441}, + {0x95a8637627989aad, 0xdde7001379a44aa9}, + {0xbb127c53b17ec159, 0x5560c018580d5d53}, + {0xe9d71b689dde71af, 0xaab8f01e6e10b4a7}, + {0x9226712162ab070d, 0xcab3961304ca70e9}, + {0xb6b00d69bb55c8d1, 0x3d607b97c5fd0d23}, + {0xe45c10c42a2b3b05, 0x8cb89a7db77c506b}, + {0x8eb98a7a9a5b04e3, 0x77f3608e92adb243}, + {0xb267ed1940f1c61c, 0x55f038b237591ed4}, + {0xdf01e85f912e37a3, 0x6b6c46dec52f6689}, + {0x8b61313bbabce2c6, 0x2323ac4b3b3da016}, + {0xae397d8aa96c1b77, 0xabec975e0a0d081b}, + {0xd9c7dced53c72255, 0x96e7bd358c904a22}, + {0x881cea14545c7575, 0x7e50d64177da2e55}, + {0xaa242499697392d2, 0xdde50bd1d5d0b9ea}, + {0xd4ad2dbfc3d07787, 0x955e4ec64b44e865}, + {0x84ec3c97da624ab4, 0xbd5af13bef0b113f}, + {0xa6274bbdd0fadd61, 0xecb1ad8aeacdd58f}, + {0xcfb11ead453994ba, 0x67de18eda5814af3}, + {0x81ceb32c4b43fcf4, 0x80eacf948770ced8}, + {0xa2425ff75e14fc31, 0xa1258379a94d028e}, + {0xcad2f7f5359a3b3e, 0x096ee45813a04331}, + {0xfd87b5f28300ca0d, 0x8bca9d6e188853fd}, + {0x9e74d1b791e07e48, 0x775ea264cf55347e}, + {0xc612062576589dda, 0x95364afe032a819e}, + {0xf79687aed3eec551, 0x3a83ddbd83f52205}, + {0x9abe14cd44753b52, 0xc4926a9672793543}, + {0xc16d9a0095928a27, 0x75b7053c0f178294}, + {0xf1c90080baf72cb1, 0x5324c68b12dd6339}, + {0x971da05074da7bee, 0xd3f6fc16ebca5e04}, + {0xbce5086492111aea, 0x88f4bb1ca6bcf585}, + {0xec1e4a7db69561a5, 0x2b31e9e3d06c32e6}, + {0x9392ee8e921d5d07, 0x3aff322e62439fd0}, + {0xb877aa3236a4b449, 0x09befeb9fad487c3}, + {0xe69594bec44de15b, 0x4c2ebe687989a9b4}, + {0x901d7cf73ab0acd9, 0x0f9d37014bf60a11}, + {0xb424dc35095cd80f, 0x538484c19ef38c95}, + {0xe12e13424bb40e13, 0x2865a5f206b06fba}, + {0x8cbccc096f5088cb, 0xf93f87b7442e45d4}, + {0xafebff0bcb24aafe, 0xf78f69a51539d749}, + {0xdbe6fecebdedd5be, 0xb573440e5a884d1c}, + {0x89705f4136b4a597, 0x31680a88f8953031}, + {0xabcc77118461cefc, 0xfdc20d2b36ba7c3e}, + {0xd6bf94d5e57a42bc, 0x3d32907604691b4d}, + {0x8637bd05af6c69b5, 0xa63f9a49c2c1b110}, + {0xa7c5ac471b478423, 0x0fcf80dc33721d54}, + {0xd1b71758e219652b, 0xd3c36113404ea4a9}, + {0x83126e978d4fdf3b, 0x645a1cac083126ea}, + {0xa3d70a3d70a3d70a, 0x3d70a3d70a3d70a4}, + {0xcccccccccccccccc, 0xcccccccccccccccd}, + {0x8000000000000000, 0x0000000000000000}, + {0xa000000000000000, 0x0000000000000000}, + {0xc800000000000000, 0x0000000000000000}, + {0xfa00000000000000, 0x0000000000000000}, + {0x9c40000000000000, 0x0000000000000000}, + {0xc350000000000000, 0x0000000000000000}, + {0xf424000000000000, 0x0000000000000000}, + {0x9896800000000000, 0x0000000000000000}, + {0xbebc200000000000, 0x0000000000000000}, + {0xee6b280000000000, 0x0000000000000000}, + {0x9502f90000000000, 0x0000000000000000}, + {0xba43b74000000000, 0x0000000000000000}, + {0xe8d4a51000000000, 0x0000000000000000}, + {0x9184e72a00000000, 0x0000000000000000}, + {0xb5e620f480000000, 0x0000000000000000}, + {0xe35fa931a0000000, 0x0000000000000000}, + {0x8e1bc9bf04000000, 0x0000000000000000}, + {0xb1a2bc2ec5000000, 0x0000000000000000}, + {0xde0b6b3a76400000, 0x0000000000000000}, + {0x8ac7230489e80000, 0x0000000000000000}, + {0xad78ebc5ac620000, 0x0000000000000000}, + {0xd8d726b7177a8000, 0x0000000000000000}, + {0x878678326eac9000, 0x0000000000000000}, + {0xa968163f0a57b400, 0x0000000000000000}, + {0xd3c21bcecceda100, 0x0000000000000000}, + {0x84595161401484a0, 0x0000000000000000}, + {0xa56fa5b99019a5c8, 0x0000000000000000}, + {0xcecb8f27f4200f3a, 0x0000000000000000}, + {0x813f3978f8940984, 0x4000000000000000}, + {0xa18f07d736b90be5, 0x5000000000000000}, + {0xc9f2c9cd04674ede, 0xa400000000000000}, + {0xfc6f7c4045812296, 0x4d00000000000000}, + {0x9dc5ada82b70b59d, 0xf020000000000000}, + {0xc5371912364ce305, 0x6c28000000000000}, + {0xf684df56c3e01bc6, 0xc732000000000000}, + {0x9a130b963a6c115c, 0x3c7f400000000000}, + {0xc097ce7bc90715b3, 0x4b9f100000000000}, + {0xf0bdc21abb48db20, 0x1e86d40000000000}, + {0x96769950b50d88f4, 0x1314448000000000}, + {0xbc143fa4e250eb31, 0x17d955a000000000}, + {0xeb194f8e1ae525fd, 0x5dcfab0800000000}, + {0x92efd1b8d0cf37be, 0x5aa1cae500000000}, + {0xb7abc627050305ad, 0xf14a3d9e40000000}, + {0xe596b7b0c643c719, 0x6d9ccd05d0000000}, + {0x8f7e32ce7bea5c6f, 0xe4820023a2000000}, + {0xb35dbf821ae4f38b, 0xdda2802c8a800000}, + {0xe0352f62a19e306e, 0xd50b2037ad200000}, + {0x8c213d9da502de45, 0x4526f422cc340000}, + {0xaf298d050e4395d6, 0x9670b12b7f410000}, + {0xdaf3f04651d47b4c, 0x3c0cdd765f114000}, + {0x88d8762bf324cd0f, 0xa5880a69fb6ac800}, + {0xab0e93b6efee0053, 0x8eea0d047a457a00}, + {0xd5d238a4abe98068, 0x72a4904598d6d880}, + {0x85a36366eb71f041, 0x47a6da2b7f864750}, + {0xa70c3c40a64e6c51, 0x999090b65f67d924}, + {0xd0cf4b50cfe20765, 0xfff4b4e3f741cf6d}, + {0x82818f1281ed449f, 0xbff8f10e7a8921a5}, + {0xa321f2d7226895c7, 0xaff72d52192b6a0e}, + {0xcbea6f8ceb02bb39, 0x9bf4f8a69f764491}, + {0xfee50b7025c36a08, 0x02f236d04753d5b5}, + {0x9f4f2726179a2245, 0x01d762422c946591}, + {0xc722f0ef9d80aad6, 0x424d3ad2b7b97ef6}, + {0xf8ebad2b84e0d58b, 0xd2e0898765a7deb3}, + {0x9b934c3b330c8577, 0x63cc55f49f88eb30}, + {0xc2781f49ffcfa6d5, 0x3cbf6b71c76b25fc}, + {0xf316271c7fc3908a, 0x8bef464e3945ef7b}, + {0x97edd871cfda3a56, 0x97758bf0e3cbb5ad}, + {0xbde94e8e43d0c8ec, 0x3d52eeed1cbea318}, + {0xed63a231d4c4fb27, 0x4ca7aaa863ee4bde}, + {0x945e455f24fb1cf8, 0x8fe8caa93e74ef6b}, + {0xb975d6b6ee39e436, 0xb3e2fd538e122b45}, + {0xe7d34c64a9c85d44, 0x60dbbca87196b617}, + {0x90e40fbeea1d3a4a, 0xbc8955e946fe31ce}, + {0xb51d13aea4a488dd, 0x6babab6398bdbe42}, + {0xe264589a4dcdab14, 0xc696963c7eed2dd2}, + {0x8d7eb76070a08aec, 0xfc1e1de5cf543ca3}, + {0xb0de65388cc8ada8, 0x3b25a55f43294bcc}, + {0xdd15fe86affad912, 0x49ef0eb713f39ebf}, + {0x8a2dbf142dfcc7ab, 0x6e3569326c784338}, + {0xacb92ed9397bf996, 0x49c2c37f07965405}, + {0xd7e77a8f87daf7fb, 0xdc33745ec97be907}, + {0x86f0ac99b4e8dafd, 0x69a028bb3ded71a4}, + {0xa8acd7c0222311bc, 0xc40832ea0d68ce0d}, + {0xd2d80db02aabd62b, 0xf50a3fa490c30191}, + {0x83c7088e1aab65db, 0x792667c6da79e0fb}, + {0xa4b8cab1a1563f52, 0x577001b891185939}, + {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87}, + {0x80b05e5ac60b6178, 0x544f8158315b05b5}, + {0xa0dc75f1778e39d6, 0x696361ae3db1c722}, + {0xc913936dd571c84c, 0x03bc3a19cd1e38ea}, + {0xfb5878494ace3a5f, 0x04ab48a04065c724}, + {0x9d174b2dcec0e47b, 0x62eb0d64283f9c77}, + {0xc45d1df942711d9a, 0x3ba5d0bd324f8395}, + {0xf5746577930d6500, 0xca8f44ec7ee3647a}, + {0x9968bf6abbe85f20, 0x7e998b13cf4e1ecc}, + {0xbfc2ef456ae276e8, 0x9e3fedd8c321a67f}, + {0xefb3ab16c59b14a2, 0xc5cfe94ef3ea101f}, + {0x95d04aee3b80ece5, 0xbba1f1d158724a13}, + {0xbb445da9ca61281f, 0x2a8a6e45ae8edc98}, + {0xea1575143cf97226, 0xf52d09d71a3293be}, + {0x924d692ca61be758, 0x593c2626705f9c57}, + {0xb6e0c377cfa2e12e, 0x6f8b2fb00c77836d}, + {0xe498f455c38b997a, 0x0b6dfb9c0f956448}, + {0x8edf98b59a373fec, 0x4724bd4189bd5ead}, + {0xb2977ee300c50fe7, 0x58edec91ec2cb658}, + {0xdf3d5e9bc0f653e1, 0x2f2967b66737e3ee}, + {0x8b865b215899f46c, 0xbd79e0d20082ee75}, + {0xae67f1e9aec07187, 0xecd8590680a3aa12}, + {0xda01ee641a708de9, 0xe80e6f4820cc9496}, + {0x884134fe908658b2, 0x3109058d147fdcde}, + {0xaa51823e34a7eede, 0xbd4b46f0599fd416}, + {0xd4e5e2cdc1d1ea96, 0x6c9e18ac7007c91b}, + {0x850fadc09923329e, 0x03e2cf6bc604ddb1}, + {0xa6539930bf6bff45, 0x84db8346b786151d}, + {0xcfe87f7cef46ff16, 0xe612641865679a64}, + {0x81f14fae158c5f6e, 0x4fcb7e8f3f60c07f}, + {0xa26da3999aef7749, 0xe3be5e330f38f09e}, + {0xcb090c8001ab551c, 0x5cadf5bfd3072cc6}, + {0xfdcb4fa002162a63, 0x73d9732fc7c8f7f7}, + {0x9e9f11c4014dda7e, 0x2867e7fddcdd9afb}, + {0xc646d63501a1511d, 0xb281e1fd541501b9}, + {0xf7d88bc24209a565, 0x1f225a7ca91a4227}, + {0x9ae757596946075f, 0x3375788de9b06959}, + {0xc1a12d2fc3978937, 0x0052d6b1641c83af}, + {0xf209787bb47d6b84, 0xc0678c5dbd23a49b}, + {0x9745eb4d50ce6332, 0xf840b7ba963646e1}, + {0xbd176620a501fbff, 0xb650e5a93bc3d899}, + {0xec5d3fa8ce427aff, 0xa3e51f138ab4cebf}, + {0x93ba47c980e98cdf, 0xc66f336c36b10138}, + {0xb8a8d9bbe123f017, 0xb80b0047445d4185}, + {0xe6d3102ad96cec1d, 0xa60dc059157491e6}, + {0x9043ea1ac7e41392, 0x87c89837ad68db30}, + {0xb454e4a179dd1877, 0x29babe4598c311fc}, + {0xe16a1dc9d8545e94, 0xf4296dd6fef3d67b}, + {0x8ce2529e2734bb1d, 0x1899e4a65f58660d}, + {0xb01ae745b101e9e4, 0x5ec05dcff72e7f90}, + {0xdc21a1171d42645d, 0x76707543f4fa1f74}, + {0x899504ae72497eba, 0x6a06494a791c53a9}, + {0xabfa45da0edbde69, 0x0487db9d17636893}, + {0xd6f8d7509292d603, 0x45a9d2845d3c42b7}, + {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3}, + {0xa7f26836f282b732, 0x8e6cac7768d7141f}, + {0xd1ef0244af2364ff, 0x3207d795430cd927}, + {0x8335616aed761f1f, 0x7f44e6bd49e807b9}, + {0xa402b9c5a8d3a6e7, 0x5f16206c9c6209a7}, + {0xcd036837130890a1, 0x36dba887c37a8c10}, + {0x802221226be55a64, 0xc2494954da2c978a}, + {0xa02aa96b06deb0fd, 0xf2db9baa10b7bd6d}, + {0xc83553c5c8965d3d, 0x6f92829494e5acc8}, + {0xfa42a8b73abbf48c, 0xcb772339ba1f17fa}, + {0x9c69a97284b578d7, 0xff2a760414536efc}, + {0xc38413cf25e2d70d, 0xfef5138519684abb}, + {0xf46518c2ef5b8cd1, 0x7eb258665fc25d6a}, + {0x98bf2f79d5993802, 0xef2f773ffbd97a62}, + {0xbeeefb584aff8603, 0xaafb550ffacfd8fb}, + {0xeeaaba2e5dbf6784, 0x95ba2a53f983cf39}, + {0x952ab45cfa97a0b2, 0xdd945a747bf26184}, + {0xba756174393d88df, 0x94f971119aeef9e5}, + {0xe912b9d1478ceb17, 0x7a37cd5601aab85e}, + {0x91abb422ccb812ee, 0xac62e055c10ab33b}, + {0xb616a12b7fe617aa, 0x577b986b314d600a}, + {0xe39c49765fdf9d94, 0xed5a7e85fda0b80c}, + {0x8e41ade9fbebc27d, 0x14588f13be847308}, + {0xb1d219647ae6b31c, 0x596eb2d8ae258fc9}, + {0xde469fbd99a05fe3, 0x6fca5f8ed9aef3bc}, + {0x8aec23d680043bee, 0x25de7bb9480d5855}, + {0xada72ccc20054ae9, 0xaf561aa79a10ae6b}, + {0xd910f7ff28069da4, 0x1b2ba1518094da05}, + {0x87aa9aff79042286, 0x90fb44d2f05d0843}, + {0xa99541bf57452b28, 0x353a1607ac744a54}, + {0xd3fa922f2d1675f2, 0x42889b8997915ce9}, + {0x847c9b5d7c2e09b7, 0x69956135febada12}, + {0xa59bc234db398c25, 0x43fab9837e699096}, + {0xcf02b2c21207ef2e, 0x94f967e45e03f4bc}, + {0x8161afb94b44f57d, 0x1d1be0eebac278f6}, + {0xa1ba1ba79e1632dc, 0x6462d92a69731733}, + {0xca28a291859bbf93, 0x7d7b8f7503cfdcff}, + {0xfcb2cb35e702af78, 0x5cda735244c3d43f}, + {0x9defbf01b061adab, 0x3a0888136afa64a8}, + {0xc56baec21c7a1916, 0x088aaa1845b8fdd1}, + {0xf6c69a72a3989f5b, 0x8aad549e57273d46}, + {0x9a3c2087a63f6399, 0x36ac54e2f678864c}, + {0xc0cb28a98fcf3c7f, 0x84576a1bb416a7de}, + {0xf0fdf2d3f3c30b9f, 0x656d44a2a11c51d6}, + {0x969eb7c47859e743, 0x9f644ae5a4b1b326}, + {0xbc4665b596706114, 0x873d5d9f0dde1fef}, + {0xeb57ff22fc0c7959, 0xa90cb506d155a7eb}, + {0x9316ff75dd87cbd8, 0x09a7f12442d588f3}, + {0xb7dcbf5354e9bece, 0x0c11ed6d538aeb30}, + {0xe5d3ef282a242e81, 0x8f1668c8a86da5fb}, + {0x8fa475791a569d10, 0xf96e017d694487bd}, + {0xb38d92d760ec4455, 0x37c981dcc395a9ad}, + {0xe070f78d3927556a, 0x85bbe253f47b1418}, + {0x8c469ab843b89562, 0x93956d7478ccec8f}, + {0xaf58416654a6babb, 0x387ac8d1970027b3}, + {0xdb2e51bfe9d0696a, 0x06997b05fcc0319f}, + {0x88fcf317f22241e2, 0x441fece3bdf81f04}, + {0xab3c2fddeeaad25a, 0xd527e81cad7626c4}, + {0xd60b3bd56a5586f1, 0x8a71e223d8d3b075}, + {0x85c7056562757456, 0xf6872d5667844e4a}, + {0xa738c6bebb12d16c, 0xb428f8ac016561dc}, + {0xd106f86e69d785c7, 0xe13336d701beba53}, + {0x82a45b450226b39c, 0xecc0024661173474}, + {0xa34d721642b06084, 0x27f002d7f95d0191}, + {0xcc20ce9bd35c78a5, 0x31ec038df7b441f5}, + {0xff290242c83396ce, 0x7e67047175a15272}, + {0x9f79a169bd203e41, 0x0f0062c6e984d387}, + {0xc75809c42c684dd1, 0x52c07b78a3e60869}, + {0xf92e0c3537826145, 0xa7709a56ccdf8a83}, + {0x9bbcc7a142b17ccb, 0x88a66076400bb692}, + {0xc2abf989935ddbfe, 0x6acff893d00ea436}, + {0xf356f7ebf83552fe, 0x0583f6b8c4124d44}, + {0x98165af37b2153de, 0xc3727a337a8b704b}, + {0xbe1bf1b059e9a8d6, 0x744f18c0592e4c5d}, + {0xeda2ee1c7064130c, 0x1162def06f79df74}, + {0x9485d4d1c63e8be7, 0x8addcb5645ac2ba9}, + {0xb9a74a0637ce2ee1, 0x6d953e2bd7173693}, + {0xe8111c87c5c1ba99, 0xc8fa8db6ccdd0438}, + {0x910ab1d4db9914a0, 0x1d9c9892400a22a3}, + {0xb54d5e4a127f59c8, 0x2503beb6d00cab4c}, + {0xe2a0b5dc971f303a, 0x2e44ae64840fd61e}, + {0x8da471a9de737e24, 0x5ceaecfed289e5d3}, + {0xb10d8e1456105dad, 0x7425a83e872c5f48}, + {0xdd50f1996b947518, 0xd12f124e28f7771a}, + {0x8a5296ffe33cc92f, 0x82bd6b70d99aaa70}, + {0xace73cbfdc0bfb7b, 0x636cc64d1001550c}, + {0xd8210befd30efa5a, 0x3c47f7e05401aa4f}, + {0x8714a775e3e95c78, 0x65acfaec34810a72}, + {0xa8d9d1535ce3b396, 0x7f1839a741a14d0e}, + {0xd31045a8341ca07c, 0x1ede48111209a051}, + {0x83ea2b892091e44d, 0x934aed0aab460433}, + {0xa4e4b66b68b65d60, 0xf81da84d56178540}, + {0xce1de40642e3f4b9, 0x36251260ab9d668f}, + {0x80d2ae83e9ce78f3, 0xc1d72b7c6b42601a}, + {0xa1075a24e4421730, 0xb24cf65b8612f820}, + {0xc94930ae1d529cfc, 0xdee033f26797b628}, + {0xfb9b7cd9a4a7443c, 0x169840ef017da3b2}, + {0x9d412e0806e88aa5, 0x8e1f289560ee864f}, + {0xc491798a08a2ad4e, 0xf1a6f2bab92a27e3}, + {0xf5b5d7ec8acb58a2, 0xae10af696774b1dc}, + {0x9991a6f3d6bf1765, 0xacca6da1e0a8ef2a}, + {0xbff610b0cc6edd3f, 0x17fd090a58d32af4}, + {0xeff394dcff8a948e, 0xddfc4b4cef07f5b1}, + {0x95f83d0a1fb69cd9, 0x4abdaf101564f98f}, + {0xbb764c4ca7a4440f, 0x9d6d1ad41abe37f2}, + {0xea53df5fd18d5513, 0x84c86189216dc5ee}, + {0x92746b9be2f8552c, 0x32fd3cf5b4e49bb5}, + {0xb7118682dbb66a77, 0x3fbc8c33221dc2a2}, + {0xe4d5e82392a40515, 0x0fabaf3feaa5334b}, + {0x8f05b1163ba6832d, 0x29cb4d87f2a7400f}, + {0xb2c71d5bca9023f8, 0x743e20e9ef511013}, + {0xdf78e4b2bd342cf6, 0x914da9246b255417}, + {0x8bab8eefb6409c1a, 0x1ad089b6c2f7548f}, + {0xae9672aba3d0c320, 0xa184ac2473b529b2}, + {0xda3c0f568cc4f3e8, 0xc9e5d72d90a2741f}, + {0x8865899617fb1871, 0x7e2fa67c7a658893}, + {0xaa7eebfb9df9de8d, 0xddbb901b98feeab8}, + {0xd51ea6fa85785631, 0x552a74227f3ea566}, + {0x8533285c936b35de, 0xd53a88958f872760}, + {0xa67ff273b8460356, 0x8a892abaf368f138}, + {0xd01fef10a657842c, 0x2d2b7569b0432d86}, + {0x8213f56a67f6b29b, 0x9c3b29620e29fc74}, + {0xa298f2c501f45f42, 0x8349f3ba91b47b90}, + {0xcb3f2f7642717713, 0x241c70a936219a74}, + {0xfe0efb53d30dd4d7, 0xed238cd383aa0111}, + {0x9ec95d1463e8a506, 0xf4363804324a40ab}, + {0xc67bb4597ce2ce48, 0xb143c6053edcd0d6}, + {0xf81aa16fdc1b81da, 0xdd94b7868e94050b}, + {0x9b10a4e5e9913128, 0xca7cf2b4191c8327}, + {0xc1d4ce1f63f57d72, 0xfd1c2f611f63a3f1}, + {0xf24a01a73cf2dccf, 0xbc633b39673c8ced}, + {0x976e41088617ca01, 0xd5be0503e085d814}, + {0xbd49d14aa79dbc82, 0x4b2d8644d8a74e19}, + {0xec9c459d51852ba2, 0xddf8e7d60ed1219f}, + {0x93e1ab8252f33b45, 0xcabb90e5c942b504}, + {0xb8da1662e7b00a17, 0x3d6a751f3b936244}, + {0xe7109bfba19c0c9d, 0x0cc512670a783ad5}, + {0x906a617d450187e2, 0x27fb2b80668b24c6}, + {0xb484f9dc9641e9da, 0xb1f9f660802dedf7}, + {0xe1a63853bbd26451, 0x5e7873f8a0396974}, + {0x8d07e33455637eb2, 0xdb0b487b6423e1e9}, + {0xb049dc016abc5e5f, 0x91ce1a9a3d2cda63}, + {0xdc5c5301c56b75f7, 0x7641a140cc7810fc}, + {0x89b9b3e11b6329ba, 0xa9e904c87fcb0a9e}, + {0xac2820d9623bf429, 0x546345fa9fbdcd45}, + {0xd732290fbacaf133, 0xa97c177947ad4096}, + {0x867f59a9d4bed6c0, 0x49ed8eabcccc485e}, + {0xa81f301449ee8c70, 0x5c68f256bfff5a75}, + {0xd226fc195c6a2f8c, 0x73832eec6fff3112}, + {0x83585d8fd9c25db7, 0xc831fd53c5ff7eac}, + {0xa42e74f3d032f525, 0xba3e7ca8b77f5e56}, + {0xcd3a1230c43fb26f, 0x28ce1bd2e55f35ec}, + {0x80444b5e7aa7cf85, 0x7980d163cf5b81b4}, + {0xa0555e361951c366, 0xd7e105bcc3326220}, + {0xc86ab5c39fa63440, 0x8dd9472bf3fefaa8}, + {0xfa856334878fc150, 0xb14f98f6f0feb952}, + {0x9c935e00d4b9d8d2, 0x6ed1bf9a569f33d4}, + {0xc3b8358109e84f07, 0x0a862f80ec4700c9}, + {0xf4a642e14c6262c8, 0xcd27bb612758c0fb}, + {0x98e7e9cccfbd7dbd, 0x8038d51cb897789d}, + {0xbf21e44003acdd2c, 0xe0470a63e6bd56c4}, + {0xeeea5d5004981478, 0x1858ccfce06cac75}, + {0x95527a5202df0ccb, 0x0f37801e0c43ebc9}, + {0xbaa718e68396cffd, 0xd30560258f54e6bb}, + {0xe950df20247c83fd, 0x47c6b82ef32a206a}, + {0x91d28b7416cdd27e, 0x4cdc331d57fa5442}, + {0xb6472e511c81471d, 0xe0133fe4adf8e953}, + {0xe3d8f9e563a198e5, 0x58180fddd97723a7}, + {0x8e679c2f5e44ff8f, 0x570f09eaa7ea7649}, + {0xb201833b35d63f73, 0x2cd2cc6551e513db}, + {0xde81e40a034bcf4f, 0xf8077f7ea65e58d2}, + {0x8b112e86420f6191, 0xfb04afaf27faf783}, + {0xadd57a27d29339f6, 0x79c5db9af1f9b564}, + {0xd94ad8b1c7380874, 0x18375281ae7822bd}, + {0x87cec76f1c830548, 0x8f2293910d0b15b6}, + {0xa9c2794ae3a3c69a, 0xb2eb3875504ddb23}, + {0xd433179d9c8cb841, 0x5fa60692a46151ec}, + {0x849feec281d7f328, 0xdbc7c41ba6bcd334}, + {0xa5c7ea73224deff3, 0x12b9b522906c0801}, + {0xcf39e50feae16bef, 0xd768226b34870a01}, + {0x81842f29f2cce375, 0xe6a1158300d46641}, + {0xa1e53af46f801c53, 0x60495ae3c1097fd1}, + {0xca5e89b18b602368, 0x385bb19cb14bdfc5}, + {0xfcf62c1dee382c42, 0x46729e03dd9ed7b6}, + {0x9e19db92b4e31ba9, 0x6c07a2c26a8346d2}, + {0xc5a05277621be293, 0xc7098b7305241886}, + { 0xf70867153aa2db38, + 0xb8cbee4fc66d1ea8 } +#else + {0xff77b1fcbebcdc4f, 0x25e8e89c13bb0f7b}, + {0xce5d73ff402d98e3, 0xfb0a3d212dc81290}, + {0xa6b34ad8c9dfc06f, 0xf42faa48c0ea481f}, + {0x86a8d39ef77164bc, 0xae5dff9c02033198}, + {0xd98ddaee19068c76, 0x3badd624dd9b0958}, + {0xafbd2350644eeacf, 0xe5d1929ef90898fb}, + {0x8df5efabc5979c8f, 0xca8d3ffa1ef463c2}, + {0xe55990879ddcaabd, 0xcc420a6a101d0516}, + {0xb94470938fa89bce, 0xf808e40e8d5b3e6a}, + {0x95a8637627989aad, 0xdde7001379a44aa9}, + {0xf1c90080baf72cb1, 0x5324c68b12dd6339}, + {0xc350000000000000, 0x0000000000000000}, + {0x9dc5ada82b70b59d, 0xf020000000000000}, + {0xfee50b7025c36a08, 0x02f236d04753d5b5}, + {0xcde6fd5e09abcf26, 0xed4c0226b55e6f87}, + {0xa6539930bf6bff45, 0x84db8346b786151d}, + {0x865b86925b9bc5c2, 0x0b8a2392ba45a9b3}, + {0xd910f7ff28069da4, 0x1b2ba1518094da05}, + {0xaf58416654a6babb, 0x387ac8d1970027b3}, + {0x8da471a9de737e24, 0x5ceaecfed289e5d3}, + {0xe4d5e82392a40515, 0x0fabaf3feaa5334b}, + {0xb8da1662e7b00a17, 0x3d6a751f3b936244}, + { 0x95527a5202df0ccb, + 0x0f37801e0c43ebc9 } +#endif + }; + +#if FMT_USE_FULL_CACHE_DRAGONBOX + return pow10_significands[k - float_info::min_k]; +#else + static constexpr const uint64_t powers_of_5_64[] = { + 0x0000000000000001, 0x0000000000000005, 0x0000000000000019, + 0x000000000000007d, 0x0000000000000271, 0x0000000000000c35, + 0x0000000000003d09, 0x000000000001312d, 0x000000000005f5e1, + 0x00000000001dcd65, 0x00000000009502f9, 0x0000000002e90edd, + 0x000000000e8d4a51, 0x0000000048c27395, 0x000000016bcc41e9, + 0x000000071afd498d, 0x0000002386f26fc1, 0x000000b1a2bc2ec5, + 0x000003782dace9d9, 0x00001158e460913d, 0x000056bc75e2d631, + 0x0001b1ae4d6e2ef5, 0x000878678326eac9, 0x002a5a058fc295ed, + 0x00d3c21bcecceda1, 0x0422ca8b0a00a425, 0x14adf4b7320334b9}; + + static const int compression_ratio = 27; + + // Compute base index. + int cache_index = (k - float_info::min_k) / compression_ratio; + int kb = cache_index * compression_ratio + float_info::min_k; + int offset = k - kb; + + // Get base cache. + uint128_fallback base_cache = pow10_significands[cache_index]; + if (offset == 0) return base_cache; + + // Compute the required amount of bit-shift. + int alpha = floor_log2_pow10(kb + offset) - floor_log2_pow10(kb) - offset; + FMT_ASSERT(alpha > 0 && alpha < 64, "shifting error detected"); + + // Try to recover the real cache. + uint64_t pow5 = powers_of_5_64[offset]; + uint128_fallback recovered_cache = umul128(base_cache.high(), pow5); + uint128_fallback middle_low = umul128(base_cache.low(), pow5); + + recovered_cache += middle_low.high(); + + uint64_t high_to_middle = recovered_cache.high() << (64 - alpha); + uint64_t middle_to_low = recovered_cache.low() << (64 - alpha); + + recovered_cache = + uint128_fallback{(recovered_cache.low() >> alpha) | high_to_middle, + ((middle_low.low() >> alpha) | middle_to_low)}; + FMT_ASSERT(recovered_cache.low() + 1 != 0, ""); + return {recovered_cache.high(), recovered_cache.low() + 1}; +#endif + } + + struct compute_mul_result { + carrier_uint result; + bool is_integer; + }; + struct compute_mul_parity_result { + bool parity; + bool is_integer; + }; + + static compute_mul_result compute_mul( + carrier_uint u, const cache_entry_type& cache) noexcept { + auto r = umul192_upper128(u, cache); + return {r.high(), r.low() == 0}; + } + + static uint32_t compute_delta(cache_entry_type const& cache, + int beta) noexcept { + return static_cast(cache.high() >> (64 - 1 - beta)); + } + + static compute_mul_parity_result compute_mul_parity( + carrier_uint two_f, const cache_entry_type& cache, int beta) noexcept { + FMT_ASSERT(beta >= 1, ""); + FMT_ASSERT(beta < 64, ""); + + auto r = umul192_lower128(two_f, cache); + return {((r.high() >> (64 - beta)) & 1) != 0, + ((r.high() << beta) | (r.low() >> (64 - beta))) == 0}; + } + + static carrier_uint compute_left_endpoint_for_shorter_interval_case( + const cache_entry_type& cache, int beta) noexcept { + return (cache.high() - + (cache.high() >> (num_significand_bits() + 2))) >> + (64 - num_significand_bits() - 1 - beta); + } + + static carrier_uint compute_right_endpoint_for_shorter_interval_case( + const cache_entry_type& cache, int beta) noexcept { + return (cache.high() + + (cache.high() >> (num_significand_bits() + 1))) >> + (64 - num_significand_bits() - 1 - beta); + } + + static carrier_uint compute_round_up_for_shorter_interval_case( + const cache_entry_type& cache, int beta) noexcept { + return ((cache.high() >> (64 - num_significand_bits() - 2 - beta)) + + 1) / + 2; + } +}; + +// Various integer checks +template +bool is_left_endpoint_integer_shorter_interval(int exponent) noexcept { + const int case_shorter_interval_left_endpoint_lower_threshold = 2; + const int case_shorter_interval_left_endpoint_upper_threshold = 3; + return exponent >= case_shorter_interval_left_endpoint_lower_threshold && + exponent <= case_shorter_interval_left_endpoint_upper_threshold; +} + +// Remove trailing zeros from n and return the number of zeros removed (float) +FMT_INLINE int remove_trailing_zeros(uint32_t& n) noexcept { + FMT_ASSERT(n != 0, ""); + const uint32_t mod_inv_5 = 0xcccccccd; + const uint32_t mod_inv_25 = mod_inv_5 * mod_inv_5; + + int s = 0; + while (true) { + auto q = rotr(n * mod_inv_25, 2); + if (q > max_value() / 100) break; + n = q; + s += 2; + } + auto q = rotr(n * mod_inv_5, 1); + if (q <= max_value() / 10) { + n = q; + s |= 1; + } + + return s; +} + +// Removes trailing zeros and returns the number of zeros removed (double) +FMT_INLINE int remove_trailing_zeros(uint64_t& n) noexcept { + FMT_ASSERT(n != 0, ""); + + // This magic number is ceil(2^90 / 10^8). + constexpr uint64_t magic_number = 12379400392853802749ull; + auto nm = umul128(n, magic_number); + + // Is n is divisible by 10^8? + if ((nm.high() & ((1ull << (90 - 64)) - 1)) == 0 && nm.low() < magic_number) { + // If yes, work with the quotient. + auto n32 = static_cast(nm.high() >> (90 - 64)); + + const uint32_t mod_inv_5 = 0xcccccccd; + const uint32_t mod_inv_25 = mod_inv_5 * mod_inv_5; + + int s = 8; + while (true) { + auto q = rotr(n32 * mod_inv_25, 2); + if (q > max_value() / 100) break; + n32 = q; + s += 2; + } + auto q = rotr(n32 * mod_inv_5, 1); + if (q <= max_value() / 10) { + n32 = q; + s |= 1; + } + + n = n32; + return s; + } + + // If n is not divisible by 10^8, work with n itself. + const uint64_t mod_inv_5 = 0xcccccccccccccccd; + const uint64_t mod_inv_25 = mod_inv_5 * mod_inv_5; + + int s = 0; + while (true) { + auto q = rotr(n * mod_inv_25, 2); + if (q > max_value() / 100) break; + n = q; + s += 2; + } + auto q = rotr(n * mod_inv_5, 1); + if (q <= max_value() / 10) { + n = q; + s |= 1; + } + + return s; +} + +// The main algorithm for shorter interval case +template +FMT_INLINE decimal_fp shorter_interval_case(int exponent) noexcept { + decimal_fp ret_value; + // Compute k and beta + const int minus_k = floor_log10_pow2_minus_log10_4_over_3(exponent); + const int beta = exponent + floor_log2_pow10(-minus_k); + + // Compute xi and zi + using cache_entry_type = typename cache_accessor::cache_entry_type; + const cache_entry_type cache = cache_accessor::get_cached_power(-minus_k); + + auto xi = cache_accessor::compute_left_endpoint_for_shorter_interval_case( + cache, beta); + auto zi = cache_accessor::compute_right_endpoint_for_shorter_interval_case( + cache, beta); + + // If the left endpoint is not an integer, increase it + if (!is_left_endpoint_integer_shorter_interval(exponent)) ++xi; + + // Try bigger divisor + ret_value.significand = zi / 10; + + // If succeed, remove trailing zeros if necessary and return + if (ret_value.significand * 10 >= xi) { + ret_value.exponent = minus_k + 1; + ret_value.exponent += remove_trailing_zeros(ret_value.significand); + return ret_value; + } + + // Otherwise, compute the round-up of y + ret_value.significand = + cache_accessor::compute_round_up_for_shorter_interval_case(cache, + beta); + ret_value.exponent = minus_k; + + // When tie occurs, choose one of them according to the rule + if (exponent >= float_info::shorter_interval_tie_lower_threshold && + exponent <= float_info::shorter_interval_tie_upper_threshold) { + ret_value.significand = ret_value.significand % 2 == 0 + ? ret_value.significand + : ret_value.significand - 1; + } else if (ret_value.significand < xi) { + ++ret_value.significand; + } + return ret_value; +} + +template decimal_fp to_decimal(T x) noexcept { + // Step 1: integer promotion & Schubfach multiplier calculation. + + using carrier_uint = typename float_info::carrier_uint; + using cache_entry_type = typename cache_accessor::cache_entry_type; + auto br = bit_cast(x); + + // Extract significand bits and exponent bits. + const carrier_uint significand_mask = + (static_cast(1) << num_significand_bits()) - 1; + carrier_uint significand = (br & significand_mask); + int exponent = + static_cast((br & exponent_mask()) >> num_significand_bits()); + + if (exponent != 0) { // Check if normal. + exponent -= exponent_bias() + num_significand_bits(); + + // Shorter interval case; proceed like Schubfach. + // In fact, when exponent == 1 and significand == 0, the interval is + // regular. However, it can be shown that the end-results are anyway same. + if (significand == 0) return shorter_interval_case(exponent); + + significand |= (static_cast(1) << num_significand_bits()); + } else { + // Subnormal case; the interval is always regular. + if (significand == 0) return {0, 0}; + exponent = + std::numeric_limits::min_exponent - num_significand_bits() - 1; + } + + const bool include_left_endpoint = (significand % 2 == 0); + const bool include_right_endpoint = include_left_endpoint; + + // Compute k and beta. + const int minus_k = floor_log10_pow2(exponent) - float_info::kappa; + const cache_entry_type cache = cache_accessor::get_cached_power(-minus_k); + const int beta = exponent + floor_log2_pow10(-minus_k); + + // Compute zi and deltai. + // 10^kappa <= deltai < 10^(kappa + 1) + const uint32_t deltai = cache_accessor::compute_delta(cache, beta); + const carrier_uint two_fc = significand << 1; + + // For the case of binary32, the result of integer check is not correct for + // 29711844 * 2^-82 + // = 6.1442653300000000008655037797566933477355632930994033813476... * 10^-18 + // and 29711844 * 2^-81 + // = 1.2288530660000000001731007559513386695471126586198806762695... * 10^-17, + // and they are the unique counterexamples. However, since 29711844 is even, + // this does not cause any problem for the endpoints calculations; it can only + // cause a problem when we need to perform integer check for the center. + // Fortunately, with these inputs, that branch is never executed, so we are + // fine. + const typename cache_accessor::compute_mul_result z_mul = + cache_accessor::compute_mul((two_fc | 1) << beta, cache); + + // Step 2: Try larger divisor; remove trailing zeros if necessary. + + // Using an upper bound on zi, we might be able to optimize the division + // better than the compiler; we are computing zi / big_divisor here. + decimal_fp ret_value; + ret_value.significand = divide_by_10_to_kappa_plus_1(z_mul.result); + uint32_t r = static_cast(z_mul.result - float_info::big_divisor * + ret_value.significand); + + if (r < deltai) { + // Exclude the right endpoint if necessary. + if (r == 0 && (z_mul.is_integer & !include_right_endpoint)) { + --ret_value.significand; + r = float_info::big_divisor; + goto small_divisor_case_label; + } + } else if (r > deltai) { + goto small_divisor_case_label; + } else { + // r == deltai; compare fractional parts. + const typename cache_accessor::compute_mul_parity_result x_mul = + cache_accessor::compute_mul_parity(two_fc - 1, cache, beta); + + if (!(x_mul.parity | (x_mul.is_integer & include_left_endpoint))) + goto small_divisor_case_label; + } + ret_value.exponent = minus_k + float_info::kappa + 1; + + // We may need to remove trailing zeros. + ret_value.exponent += remove_trailing_zeros(ret_value.significand); + return ret_value; + + // Step 3: Find the significand with the smaller divisor. + +small_divisor_case_label: + ret_value.significand *= 10; + ret_value.exponent = minus_k + float_info::kappa; + + uint32_t dist = r - (deltai / 2) + (float_info::small_divisor / 2); + const bool approx_y_parity = + ((dist ^ (float_info::small_divisor / 2)) & 1) != 0; + + // Is dist divisible by 10^kappa? + const bool divisible_by_small_divisor = + check_divisibility_and_divide_by_pow10::kappa>(dist); + + // Add dist / 10^kappa to the significand. + ret_value.significand += dist; + + if (!divisible_by_small_divisor) return ret_value; + + // Check z^(f) >= epsilon^(f). + // We have either yi == zi - epsiloni or yi == (zi - epsiloni) - 1, + // where yi == zi - epsiloni if and only if z^(f) >= epsilon^(f). + // Since there are only 2 possibilities, we only need to care about the + // parity. Also, zi and r should have the same parity since the divisor + // is an even number. + const auto y_mul = cache_accessor::compute_mul_parity(two_fc, cache, beta); + + // If z^(f) >= epsilon^(f), we might have a tie when z^(f) == epsilon^(f), + // or equivalently, when y is an integer. + if (y_mul.parity != approx_y_parity) + --ret_value.significand; + else if (y_mul.is_integer & (ret_value.significand % 2 != 0)) + --ret_value.significand; + return ret_value; +} +} // namespace dragonbox + class bigint { private: // A bigint is stored as an array of bigits (big digits), with bigit at index @@ -374,39 +1346,42 @@ class bigint { basic_memory_buffer bigits_; int exp_; - bigit operator[](int index) const { return bigits_[to_unsigned(index)]; } - bigit& operator[](int index) { return bigits_[to_unsigned(index)]; } + FMT_CONSTEXPR20 bigit operator[](int index) const { + return bigits_[to_unsigned(index)]; + } + FMT_CONSTEXPR20 bigit& operator[](int index) { + return bigits_[to_unsigned(index)]; + } - static FMT_CONSTEXPR_DECL const int bigit_bits = bits::value; + static constexpr const int bigit_bits = num_bits(); friend struct formatter; - void subtract_bigits(int index, bigit other, bigit& borrow) { + FMT_CONSTEXPR20 void subtract_bigits(int index, bigit other, bigit& borrow) { auto result = static_cast((*this)[index]) - other - borrow; (*this)[index] = static_cast(result); borrow = static_cast(result >> (bigit_bits * 2 - 1)); } - void remove_leading_zeros() { + FMT_CONSTEXPR20 void remove_leading_zeros() { int num_bigits = static_cast(bigits_.size()) - 1; while (num_bigits > 0 && (*this)[num_bigits] == 0) --num_bigits; bigits_.resize(to_unsigned(num_bigits + 1)); } // Computes *this -= other assuming aligned bigints and *this >= other. - void subtract_aligned(const bigint& other) { + FMT_CONSTEXPR20 void subtract_aligned(const bigint& other) { FMT_ASSERT(other.exp_ >= exp_, "unaligned bigints"); FMT_ASSERT(compare(*this, other) >= 0, ""); bigit borrow = 0; int i = other.exp_ - exp_; - for (size_t j = 0, n = other.bigits_.size(); j != n; ++i, ++j) { + for (size_t j = 0, n = other.bigits_.size(); j != n; ++i, ++j) subtract_bigits(i, other.bigits_[j], borrow); - } while (borrow > 0) subtract_bigits(i, 0, borrow); remove_leading_zeros(); } - void multiply(uint32_t value) { + FMT_CONSTEXPR20 void multiply(uint32_t value) { const double_bigit wide_value = value; bigit carry = 0; for (size_t i = 0, n = bigits_.size(); i < n; ++i) { @@ -417,51 +1392,64 @@ class bigint { if (carry != 0) bigits_.push_back(carry); } - void multiply(uint64_t value) { - const bigit mask = ~bigit(0); - const double_bigit lower = value & mask; - const double_bigit upper = value >> bigit_bits; - double_bigit carry = 0; + template ::value || + std::is_same::value)> + FMT_CONSTEXPR20 void multiply(UInt value) { + using half_uint = + conditional_t::value, uint64_t, uint32_t>; + const int shift = num_bits() - bigit_bits; + const UInt lower = static_cast(value); + const UInt upper = value >> num_bits(); + UInt carry = 0; for (size_t i = 0, n = bigits_.size(); i < n; ++i) { - double_bigit result = bigits_[i] * lower + (carry & mask); - carry = - bigits_[i] * upper + (result >> bigit_bits) + (carry >> bigit_bits); + UInt result = lower * bigits_[i] + static_cast(carry); + carry = (upper * bigits_[i] << shift) + (result >> bigit_bits) + + (carry >> bigit_bits); bigits_[i] = static_cast(result); } while (carry != 0) { - bigits_.push_back(carry & mask); + bigits_.push_back(static_cast(carry)); carry >>= bigit_bits; } } - public: - bigint() : exp_(0) {} - explicit bigint(uint64_t n) { assign(n); } - ~bigint() { FMT_ASSERT(bigits_.capacity() <= bigits_capacity, ""); } - - bigint(const bigint&) = delete; - void operator=(const bigint&) = delete; - - void assign(const bigint& other) { - bigits_.resize(other.bigits_.size()); - auto data = other.bigits_.data(); - std::copy(data, data + other.bigits_.size(), bigits_.data()); - exp_ = other.exp_; - } - - void assign(uint64_t n) { + template ::value || + std::is_same::value)> + FMT_CONSTEXPR20 void assign(UInt n) { size_t num_bigits = 0; do { - bigits_[num_bigits++] = n & ~bigit(0); + bigits_[num_bigits++] = static_cast(n); n >>= bigit_bits; } while (n != 0); bigits_.resize(num_bigits); exp_ = 0; } - int num_bigits() const { return static_cast(bigits_.size()) + exp_; } + public: + FMT_CONSTEXPR20 bigint() : exp_(0) {} + explicit bigint(uint64_t n) { assign(n); } - bigint& operator<<=(int shift) { + bigint(const bigint&) = delete; + void operator=(const bigint&) = delete; + + FMT_CONSTEXPR20 void assign(const bigint& other) { + auto size = other.bigits_.size(); + bigits_.resize(size); + auto data = other.bigits_.data(); + std::copy(data, data + size, bigits_.data()); + exp_ = other.exp_; + } + + template FMT_CONSTEXPR20 void operator=(Int n) { + FMT_ASSERT(n > 0, ""); + assign(uint64_or_128_t(n)); + } + + FMT_CONSTEXPR20 int num_bigits() const { + return static_cast(bigits_.size()) + exp_; + } + + FMT_NOINLINE FMT_CONSTEXPR20 bigint& operator<<=(int shift) { FMT_ASSERT(shift >= 0, ""); exp_ += shift / bigit_bits; shift %= bigit_bits; @@ -476,13 +1464,13 @@ class bigint { return *this; } - template bigint& operator*=(Int value) { + template FMT_CONSTEXPR20 bigint& operator*=(Int value) { FMT_ASSERT(value > 0, ""); multiply(uint32_or_64_or_128_t(value)); return *this; } - friend int compare(const bigint& lhs, const bigint& rhs) { + friend FMT_CONSTEXPR20 int compare(const bigint& lhs, const bigint& rhs) { int num_lhs_bigits = lhs.num_bigits(), num_rhs_bigits = rhs.num_bigits(); if (num_lhs_bigits != num_rhs_bigits) return num_lhs_bigits > num_rhs_bigits ? 1 : -1; @@ -499,9 +1487,11 @@ class bigint { } // Returns compare(lhs1 + lhs2, rhs). - friend int add_compare(const bigint& lhs1, const bigint& lhs2, - const bigint& rhs) { - int max_lhs_bigits = (std::max)(lhs1.num_bigits(), lhs2.num_bigits()); + friend FMT_CONSTEXPR20 int add_compare(const bigint& lhs1, const bigint& lhs2, + const bigint& rhs) { + auto minimum = [](int a, int b) { return a < b ? a : b; }; + auto maximum = [](int a, int b) { return a > b ? a : b; }; + int max_lhs_bigits = maximum(lhs1.num_bigits(), lhs2.num_bigits()); int num_rhs_bigits = rhs.num_bigits(); if (max_lhs_bigits + 1 < num_rhs_bigits) return -1; if (max_lhs_bigits > num_rhs_bigits) return 1; @@ -509,7 +1499,7 @@ class bigint { return i >= n.exp_ && i < n.num_bigits() ? n[i - n.exp_] : 0; }; double_bigit borrow = 0; - int min_exp = (std::min)((std::min)(lhs1.exp_, lhs2.exp_), rhs.exp_); + int min_exp = minimum(minimum(lhs1.exp_, lhs2.exp_), rhs.exp_); for (int i = num_rhs_bigits - 1; i >= min_exp; --i) { double_bigit sum = static_cast(get_bigit(lhs1, i)) + get_bigit(lhs2, i); @@ -523,16 +1513,16 @@ class bigint { } // Assigns pow(10, exp) to this bigint. - void assign_pow10(int exp) { + FMT_CONSTEXPR20 void assign_pow10(int exp) { FMT_ASSERT(exp >= 0, ""); - if (exp == 0) return assign(1); + if (exp == 0) return *this = 1; // Find the top bit. int bitmask = 1; while (exp >= bitmask) bitmask <<= 1; bitmask >>= 1; // pow(10, exp) = pow(5, exp) * pow(2, exp). First compute pow(5, exp) by // repeated squaring and multiplication. - assign(5); + *this = 5; bitmask >>= 1; while (bitmask != 0) { square(); @@ -542,13 +1532,12 @@ class bigint { *this <<= exp; // Multiply by pow(2, exp) by shifting. } - void square() { - basic_memory_buffer n(::MoveTemp(bigits_)); + FMT_CONSTEXPR20 void square() { int num_bigits = static_cast(bigits_.size()); int num_result_bigits = 2 * num_bigits; + basic_memory_buffer n(std::move(bigits_)); bigits_.resize(to_unsigned(num_result_bigits)); - using accumulator_t = conditional_t; - auto sum = accumulator_t(); + auto sum = uint128_t(); for (int bigit_index = 0; bigit_index < num_bigits; ++bigit_index) { // Compute bigit at position bigit_index of the result by adding // cross-product terms n[i] * n[j] such that i + j == bigit_index. @@ -557,7 +1546,7 @@ class bigint { sum += static_cast(n[i]) * n[j]; } (*this)[bigit_index] = static_cast(sum); - sum >>= bits::value; // Compute the carry. + sum >>= num_bits(); // Compute the carry. } // Do the same for the top half. for (int bigit_index = num_bigits; bigit_index < num_result_bigits; @@ -565,29 +1554,32 @@ class bigint { for (int j = num_bigits - 1, i = bigit_index - j; i < num_bigits;) sum += static_cast(n[i++]) * n[j--]; (*this)[bigit_index] = static_cast(sum); - sum >>= bits::value; + sum >>= num_bits(); } - --num_result_bigits; remove_leading_zeros(); exp_ *= 2; } + // If this bigint has a bigger exponent than other, adds trailing zero to make + // exponents equal. This simplifies some operations such as subtraction. + FMT_CONSTEXPR20 void align(const bigint& other) { + int exp_difference = exp_ - other.exp_; + if (exp_difference <= 0) return; + int num_bigits = static_cast(bigits_.size()); + bigits_.resize(to_unsigned(num_bigits + exp_difference)); + for (int i = num_bigits - 1, j = i + exp_difference; i >= 0; --i, --j) + bigits_[j] = bigits_[i]; + std::uninitialized_fill_n(bigits_.data(), exp_difference, 0); + exp_ -= exp_difference; + } + // Divides this bignum by divisor, assigning the remainder to this and // returning the quotient. - int divmod_assign(const bigint& divisor) { + FMT_CONSTEXPR20 int divmod_assign(const bigint& divisor) { FMT_ASSERT(this != &divisor, ""); if (compare(*this, divisor) < 0) return 0; - int num_bigits = static_cast(bigits_.size()); FMT_ASSERT(divisor.bigits_[divisor.bigits_.size() - 1u] != 0, ""); - int exp_difference = exp_ - divisor.exp_; - if (exp_difference > 0) { - // Align bigints by adding trailing zeros to simplify subtraction. - bigits_.resize(to_unsigned(num_bigits + exp_difference)); - for (int i = num_bigits - 1, j = i + exp_difference; i >= 0; --i, --j) - bigits_[j] = bigits_[i]; - std::uninitialized_fill_n(bigits_.data(), exp_difference, 0); - exp_ -= exp_difference; - } + align(divisor); int quotient = 0; do { subtract_aligned(divisor); @@ -597,319 +1589,149 @@ class bigint { } }; -enum class round_direction { unknown, up, down }; - -// Given the divisor (normally a power of 10), the remainder = v % divisor for -// some number v and the error, returns whether v should be rounded up, down, or -// whether the rounding direction can't be determined due to error. -// error should be less than divisor / 2. -inline round_direction get_round_direction(uint64_t divisor, uint64_t remainder, - uint64_t error) { - FMT_ASSERT(remainder < divisor, ""); // divisor - remainder won't overflow. - FMT_ASSERT(error < divisor, ""); // divisor - error won't overflow. - FMT_ASSERT(error < divisor - error, ""); // error * 2 won't overflow. - // Round down if (remainder + error) * 2 <= divisor. - if (remainder <= divisor - remainder && error * 2 <= divisor - remainder * 2) - return round_direction::down; - // Round up if (remainder - error) * 2 >= divisor. - if (remainder >= error && - remainder - error >= divisor - (remainder - error)) { - return round_direction::up; - } - return round_direction::unknown; -} - -namespace digits { -enum result { - more, // Generate more digits. - done, // Done generating digits. - error // Digit generation cancelled due to an error. -}; -} - -// A version of count_digits optimized for grisu_gen_digits. -inline int grisu_count_digits(uint32_t n) { - if (n < 10) return 1; - if (n < 100) return 2; - if (n < 1000) return 3; - if (n < 10000) return 4; - if (n < 100000) return 5; - if (n < 1000000) return 6; - if (n < 10000000) return 7; - if (n < 100000000) return 8; - if (n < 1000000000) return 9; - return 10; -} - -// Generates output using the Grisu digit-gen algorithm. -// error: the size of the region (lower, upper) outside of which numbers -// definitely do not round to value (Delta in Grisu3). -template -FMT_ALWAYS_INLINE digits::result grisu_gen_digits(fp value, uint64_t error, - int& exp, Handler& handler) { - const fp one(1ULL << -value.e, value.e); - // The integral part of scaled value (p1 in Grisu) = value / one. It cannot be - // zero because it contains a product of two 64-bit numbers with MSB set (due - // to normalization) - 1, shifted right by at most 60 bits. - auto integral = static_cast(value.f >> -one.e); - FMT_ASSERT(integral != 0, ""); - FMT_ASSERT(integral == value.f >> -one.e, ""); - // The fractional part of scaled value (p2 in Grisu) c = value % one. - uint64_t fractional = value.f & (one.f - 1); - exp = grisu_count_digits(integral); // kappa in Grisu. - // Divide by 10 to prevent overflow. - auto result = handler.on_start(data::powers_of_10_64[exp - 1] << -one.e, - value.f / 10, error * 10, exp); - if (result != digits::more) return result; - // Generate digits for the integral part. This can produce up to 10 digits. - do { - uint32_t digit = 0; - auto divmod_integral = [&](uint32_t divisor) { - digit = integral / divisor; - integral %= divisor; - }; - // This optimization by Milo Yip reduces the number of integer divisions by - // one per iteration. - switch (exp) { - case 10: - divmod_integral(1000000000); - break; - case 9: - divmod_integral(100000000); - break; - case 8: - divmod_integral(10000000); - break; - case 7: - divmod_integral(1000000); - break; - case 6: - divmod_integral(100000); - break; - case 5: - divmod_integral(10000); - break; - case 4: - divmod_integral(1000); - break; - case 3: - divmod_integral(100); - break; - case 2: - divmod_integral(10); - break; - case 1: - digit = integral; - integral = 0; - break; - default: - FMT_ASSERT(false, "invalid number of digits"); - } - --exp; - uint64_t remainder = - (static_cast(integral) << -one.e) + fractional; - result = handler.on_digit(static_cast('0' + digit), - data::powers_of_10_64[exp] << -one.e, remainder, - error, exp, true); - if (result != digits::more) return result; - } while (exp > 0); - // Generate digits for the fractional part. - for (;;) { - fractional *= 10; - error *= 10; - char digit = - static_cast('0' + static_cast(fractional >> -one.e)); - fractional &= one.f - 1; - --exp; - result = handler.on_digit(digit, one.f, fractional, error, exp, false); - if (result != digits::more) return result; - } -} - -// The fixed precision digit handler. -struct fixed_handler { - char* buf; - int size; - int precision; - int exp10; - bool fixed; - - digits::result on_start(uint64_t divisor, uint64_t remainder, uint64_t error, - int& exp) { - // Non-fixed formats require at least one digit and no precision adjustment. - if (!fixed) return digits::more; - // Adjust fixed precision by exponent because it is relative to decimal - // point. - precision += exp + exp10; - // Check if precision is satisfied just by leading zeros, e.g. - // format("{:.2f}", 0.001) gives "0.00" without generating any digits. - if (precision > 0) return digits::more; - if (precision < 0) return digits::done; - auto dir = get_round_direction(divisor, remainder, error); - if (dir == round_direction::unknown) return digits::error; - buf[size++] = dir == round_direction::up ? '1' : '0'; - return digits::done; - } - - digits::result on_digit(char digit, uint64_t divisor, uint64_t remainder, - uint64_t error, int, bool integral) { - FMT_ASSERT(remainder < divisor, ""); - buf[size++] = digit; - if (size < precision) return digits::more; - if (!integral) { - // Check if error * 2 < divisor with overflow prevention. - // The check is not needed for the integral part because error = 1 - // and divisor > (1 << 32) there. - if (error >= divisor || error >= divisor - error) return digits::error; - } else { - FMT_ASSERT(error == 1 && divisor > 2, ""); - } - auto dir = get_round_direction(divisor, remainder, error); - if (dir != round_direction::up) - return dir == round_direction::down ? digits::done : digits::error; - ++buf[size - 1]; - for (int i = size - 1; i > 0 && buf[i] > '9'; --i) { - buf[i] = '0'; - ++buf[i - 1]; - } - if (buf[0] > '9') { - buf[0] = '1'; - buf[size++] = '0'; - } - return digits::done; - } +// format_dragon flags. +enum dragon { + predecessor_closer = 1, + fixup = 2, // Run fixup to correct exp10 which can be off by one. + fixed = 4, }; -// The shortest representation digit handler. -struct grisu_shortest_handler { - char* buf; - int size; - // Distance between scaled value and upper bound (wp_W in Grisu3). - uint64_t diff; - - digits::result on_start(uint64_t, uint64_t, uint64_t, int&) { - return digits::more; - } - - // Decrement the generated number approaching value from above. - void round(uint64_t d, uint64_t divisor, uint64_t& remainder, - uint64_t error) { - while ( - remainder < d && error - remainder >= divisor && - (remainder + divisor < d || d - remainder >= remainder + divisor - d)) { - --buf[size - 1]; - remainder += divisor; - } - } - - // Implements Grisu's round_weed. - digits::result on_digit(char digit, uint64_t divisor, uint64_t remainder, - uint64_t error, int exp, bool integral) { - buf[size++] = digit; - if (remainder >= error) return digits::more; - uint64_t unit = integral ? 1 : data::powers_of_10_64[-exp]; - uint64_t up = (diff - 1) * unit; // wp_Wup - round(up, divisor, remainder, error); - uint64_t down = (diff + 1) * unit; // wp_Wdown - if (remainder < down && error - remainder >= divisor && - (remainder + divisor < down || - down - remainder > remainder + divisor - down)) { - return digits::error; - } - return 2 * unit <= remainder && remainder <= error - 4 * unit - ? digits::done - : digits::error; - } -}; - -// Formats value using a variation of the Fixed-Precision Positive -// Floating-Point Printout ((FPP)^2) algorithm by Steele & White: -// https://fmt.dev/p372-steele.pdf. -template -void fallback_format(Double d, buffer& buf, int& exp10) { +// Formats a floating-point number using a variation of the Fixed-Precision +// Positive Floating-Point Printout ((FPP)^2) algorithm by Steele & White: +// https://fmt.dev/papers/p372-steele.pdf. +FMT_CONSTEXPR20 inline void format_dragon(basic_fp value, + unsigned flags, int num_digits, + buffer& buf, int& exp10) { bigint numerator; // 2 * R in (FPP)^2. bigint denominator; // 2 * S in (FPP)^2. // lower and upper are differences between value and corresponding boundaries. bigint lower; // (M^- in (FPP)^2). bigint upper_store; // upper's value if different from lower. bigint* upper = nullptr; // (M^+ in (FPP)^2). - fp value; // Shift numerator and denominator by an extra bit or two (if lower boundary // is closer) to make lower and upper integers. This eliminates multiplication // by 2 during later computations. - // TODO: handle float - int shift = value.assign(d) ? 2 : 1; - uint64_t significand = value.f << shift; + bool is_predecessor_closer = (flags & dragon::predecessor_closer) != 0; + int shift = is_predecessor_closer ? 2 : 1; if (value.e >= 0) { - numerator.assign(significand); - numerator <<= value.e; - lower.assign(1); + numerator = value.f; + numerator <<= value.e + shift; + lower = 1; lower <<= value.e; - if (shift != 1) { - upper_store.assign(1); + if (is_predecessor_closer) { + upper_store = 1; upper_store <<= value.e + 1; upper = &upper_store; } denominator.assign_pow10(exp10); - denominator <<= 1; + denominator <<= shift; } else if (exp10 < 0) { numerator.assign_pow10(-exp10); lower.assign(numerator); - if (shift != 1) { + if (is_predecessor_closer) { upper_store.assign(numerator); upper_store <<= 1; upper = &upper_store; } - numerator *= significand; - denominator.assign(1); + numerator *= value.f; + numerator <<= shift; + denominator = 1; denominator <<= shift - value.e; } else { - numerator.assign(significand); + numerator = value.f; + numerator <<= shift; denominator.assign_pow10(exp10); denominator <<= shift - value.e; - lower.assign(1); - if (shift != 1) { - upper_store.assign(1ULL << 1); + lower = 1; + if (is_predecessor_closer) { + upper_store = 1ULL << 1; upper = &upper_store; } } + int even = static_cast((value.f & 1) == 0); if (!upper) upper = &lower; - // Invariant: value == (numerator / denominator) * pow(10, exp10). - bool even = (value.f & 1) == 0; - int num_digits = 0; - char* data = buf.data(); - for (;;) { - int digit = numerator.divmod_assign(denominator); - bool low = compare(numerator, lower) - even < 0; // numerator <[=] lower. - // numerator + upper >[=] pow10: - bool high = add_compare(numerator, *upper, denominator) + even > 0; - data[num_digits++] = static_cast('0' + digit); - if (low || high) { - if (!low) { - ++data[num_digits - 1]; - } else if (high) { - int result = add_compare(numerator, numerator, denominator); - // Round half to even. - if (result > 0 || (result == 0 && (digit % 2) != 0)) - ++data[num_digits - 1]; + if ((flags & dragon::fixup) != 0) { + if (add_compare(numerator, *upper, denominator) + even <= 0) { + --exp10; + numerator *= 10; + if (num_digits < 0) { + lower *= 10; + if (upper != &lower) *upper *= 10; + } + } + if ((flags & dragon::fixed) != 0) adjust_precision(num_digits, exp10 + 1); + } + // Invariant: value == (numerator / denominator) * pow(10, exp10). + if (num_digits < 0) { + // Generate the shortest representation. + num_digits = 0; + char* data = buf.data(); + for (;;) { + int digit = numerator.divmod_assign(denominator); + bool low = compare(numerator, lower) - even < 0; // numerator <[=] lower. + // numerator + upper >[=] pow10: + bool high = add_compare(numerator, *upper, denominator) + even > 0; + data[num_digits++] = static_cast('0' + digit); + if (low || high) { + if (!low) { + ++data[num_digits - 1]; + } else if (high) { + int result = add_compare(numerator, numerator, denominator); + // Round half to even. + if (result > 0 || (result == 0 && (digit % 2) != 0)) + ++data[num_digits - 1]; + } + buf.try_resize(to_unsigned(num_digits)); + exp10 -= num_digits - 1; + return; + } + numerator *= 10; + lower *= 10; + if (upper != &lower) *upper *= 10; + } + } + // Generate the given number of digits. + exp10 -= num_digits - 1; + if (num_digits == 0) { + denominator *= 10; + auto digit = add_compare(numerator, numerator, denominator) > 0 ? '1' : '0'; + buf.push_back(digit); + return; + } + buf.try_resize(to_unsigned(num_digits)); + for (int i = 0; i < num_digits - 1; ++i) { + int digit = numerator.divmod_assign(denominator); + buf[i] = static_cast('0' + digit); + numerator *= 10; + } + int digit = numerator.divmod_assign(denominator); + auto result = add_compare(numerator, numerator, denominator); + if (result > 0 || (result == 0 && (digit % 2) != 0)) { + if (digit == 9) { + const auto overflow = '0' + 10; + buf[num_digits - 1] = overflow; + // Propagate the carry. + for (int i = num_digits - 1; i > 0 && buf[i] == overflow; --i) { + buf[i] = '0'; + ++buf[i - 1]; + } + if (buf[0] == overflow) { + buf[0] = '1'; + ++exp10; } - buf.resize(to_unsigned(num_digits)); - exp10 -= num_digits - 1; return; } - numerator *= 10; - lower *= 10; - if (upper != &lower) *upper *= 10; + ++digit; } + buf[num_digits - 1] = static_cast('0' + digit); } -// Formats value using the Grisu algorithm -// (https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf) -// if T is a IEEE754 binary32 or binary64 and snprintf otherwise. -template -int format_float(T value, int precision, float_specs specs, buffer& buf) { - static_assert(!std::is_same::value, ""); +template +int format_float(Float value, int precision, float_specs specs, buffer& buf) { + // float is passed as double to reduce the number of instantiations. + static_assert(!std::is_same::value, ""); FMT_ASSERT(value >= 0, "value is negative"); + auto converted_value = convert_float(value); const bool fixed = specs.format == float_format::fixed; if (value <= 0) { // <= instead of == to silence a warning. @@ -917,256 +1739,122 @@ int format_float(T value, int precision, float_specs specs, buffer& buf) { buf.push_back('0'); return 0; } - buf.resize(to_unsigned(precision)); - std::uninitialized_fill_n(buf.data(), precision, '0'); + buf.try_resize(to_unsigned(precision)); + fill_n(buf.data(), precision, '0'); return -precision; } - if (!specs.use_grisu) return snprintf_float(value, precision, specs, buf); - int exp = 0; - const int min_exp = -60; // alpha in Grisu. - int cached_exp10 = 0; // K in Grisu. - if (precision < 0) { - fp fp_value; - auto boundaries = specs.binary32 - ? fp_value.assign_float_with_boundaries(value) - : fp_value.assign_with_boundaries(value); - fp_value = normalize(fp_value); - // Find a cached power of 10 such that multiplying value by it will bring - // the exponent in the range [min_exp, -32]. - const fp cached_pow = get_cached_power( - min_exp - (fp_value.e + fp::significand_size), cached_exp10); - // Multiply value and boundaries by the cached power of 10. - fp_value = fp_value * cached_pow; - boundaries.lower = multiply(boundaries.lower, cached_pow.f); - boundaries.upper = multiply(boundaries.upper, cached_pow.f); - FMT_ASSERT(min_exp <= fp_value.e && fp_value.e <= -32, ""); - --boundaries.lower; // \tilde{M}^- - 1 ulp -> M^-_{\downarrow}. - ++boundaries.upper; // \tilde{M}^+ + 1 ulp -> M^+_{\uparrow}. - // Numbers outside of (lower, upper) definitely do not round to value. - grisu_shortest_handler handler{buf.data(), 0, - boundaries.upper - fp_value.f}; - auto result = - grisu_gen_digits(fp(boundaries.upper, fp_value.e), - boundaries.upper - boundaries.lower, exp, handler); - if (result == digits::error) { - exp += handler.size - cached_exp10 - 1; - fallback_format(value, buf, exp); - return exp; + bool use_dragon = true; + unsigned dragon_flags = 0; + if (!is_fast_float()) { + const auto inv_log2_10 = 0.3010299956639812; // 1 / log2(10) + using info = dragonbox::float_info; + const auto f = basic_fp(converted_value); + // Compute exp, an approximate power of 10, such that + // 10^(exp - 1) <= value < 10^exp or 10^exp <= value < 10^(exp + 1). + // This is based on log10(value) == log2(value) / log2(10) and approximation + // of log2(value) by e + num_fraction_bits idea from double-conversion. + exp = static_cast( + ::ceil((f.e + count_digits<1>(f.f) - 1) * inv_log2_10 - 1e-10)); + dragon_flags = dragon::fixup; + } else if (!is_constant_evaluated() && precision < 0) { + // Use Dragonbox for the shortest format. + if (specs.binary32) { + auto dec = dragonbox::to_decimal(static_cast(value)); + write(buffer_appender(buf), dec.significand); + return dec.exponent; } - buf.resize(to_unsigned(handler.size)); + auto dec = dragonbox::to_decimal(static_cast(value)); + write(buffer_appender(buf), dec.significand); + return dec.exponent; } else { - if (precision > 17) return snprintf_float(value, precision, specs, buf); - fp normalized = normalize(fp(value)); + // Use Grisu + Dragon4 for the given precision: + // https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf. + const int min_exp = -60; // alpha in Grisu. + int cached_exp10 = 0; // K in Grisu. + fp normalized = normalize(fp(converted_value)); const auto cached_pow = get_cached_power( - min_exp - (normalized.e + fp::significand_size), cached_exp10); + min_exp - (normalized.e + fp::num_significand_bits), cached_exp10); normalized = normalized * cached_pow; - fixed_handler handler{buf.data(), 0, precision, -cached_exp10, fixed}; - if (grisu_gen_digits(normalized, 1, exp, handler) == digits::error) - return snprintf_float(value, precision, specs, buf); - int num_digits = handler.size; - if (!fixed) { - // Remove trailing zeros. - while (num_digits > 0 && buf[num_digits - 1] == '0') { - --num_digits; - ++exp; - } + gen_digits_handler handler{buf.data(), 0, precision, -cached_exp10, fixed}; + if (grisu_gen_digits(normalized, 1, exp, handler) != digits::error && + !is_constant_evaluated()) { + exp += handler.exp10; + buf.try_resize(to_unsigned(handler.size)); + use_dragon = false; + } else { + exp += handler.size - cached_exp10 - 1; + precision = handler.precision; } - buf.resize(to_unsigned(num_digits)); } - return exp - cached_exp10; + if (use_dragon) { + auto f = basic_fp(); + bool is_predecessor_closer = specs.binary32 + ? f.assign(static_cast(value)) + : f.assign(converted_value); + if (is_predecessor_closer) dragon_flags |= dragon::predecessor_closer; + if (fixed) dragon_flags |= dragon::fixed; + // Limit precision to the maximum possible number of significant digits in + // an IEEE754 double because we don't need to generate zeros. + const int max_double_digits = 767; + if (precision > max_double_digits) precision = max_double_digits; + format_dragon(f, dragon_flags, precision, buf, exp); + } + if (!fixed && !specs.showpoint) { + // Remove trailing zeros. + auto num_digits = buf.size(); + while (num_digits > 0 && buf[num_digits - 1] == '0') { + --num_digits; + ++exp; + } + buf.try_resize(num_digits); + } + return exp; } -template -int snprintf_float(T value, int precision, float_specs specs, - buffer& buf) { - // Buffer capacity must be non-zero, otherwise MSVC's vsnprintf_s will fail. - FMT_ASSERT(buf.capacity() > buf.size(), "empty buffer"); - static_assert(!std::is_same::value, ""); - - // Subtract 1 to account for the difference in precision since we use %e for - // both general and exponent format. - if (specs.format == float_format::general || - specs.format == float_format::exp) - precision = (precision >= 0 ? precision : 6) - 1; - - // Build the format string. - enum { max_format_size = 7 }; // Ths longest format is "%#.*Le". - char format[max_format_size]; - char* format_ptr = format; - *format_ptr++ = '%'; - if (specs.showpoint && specs.format == float_format::hex) *format_ptr++ = '#'; - if (precision >= 0) { - *format_ptr++ = '.'; - *format_ptr++ = '*'; - } - if (std::is_same()) *format_ptr++ = 'L'; - *format_ptr++ = specs.format != float_format::hex - ? (specs.format == float_format::fixed ? 'f' : 'e') - : (specs.upper ? 'A' : 'a'); - *format_ptr = '\0'; - - // Format using snprintf. - auto offset = buf.size(); - for (;;) { - auto begin = buf.data() + offset; - auto capacity = buf.capacity() - offset; -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - if (precision > 100000) - throw std::runtime_error( - "fuzz mode - avoid large allocation inside snprintf"); +#ifdef _MSC_VER +FMT_FUNC auto fmt_snprintf(char* buf, size_t size, const char* fmt, ...) + -> int { + auto args = va_list(); + va_start(args, fmt); + int result = vsnprintf_s(buf, size, _TRUNCATE, fmt, args); + va_end(args); + return result; +} #endif - // Suppress the warning about a nonliteral format string. - // Cannot use auto becase of a bug in MinGW (#1532). - int (*snprintf_ptr)(char*, size_t, const char*, ...) = FMT_SNPRINTF; - int result = precision >= 0 - ? snprintf_ptr(begin, capacity, format, precision, value) - : snprintf_ptr(begin, capacity, format, value); - if (result < 0) { - buf.reserve(buf.capacity() + 1); // The buffer will grow exponentially. - continue; - } - auto size = to_unsigned(result); - // Size equal to capacity means that the last character was truncated. - if (size >= capacity) { - buf.reserve(size + offset + 1); // Add 1 for the terminating '\0'. - continue; - } - auto is_digit = [](char c) { return c >= '0' && c <= '9'; }; - if (specs.format == float_format::fixed) { - if (precision == 0) { - buf.resize(size); - return 0; - } - // Find and remove the decimal point. - auto end = begin + size, p = end; - do { - --p; - } while (is_digit(*p)); - int fraction_size = static_cast(end - p - 1); - std::memmove(p, p + 1, to_unsigned(fraction_size)); - buf.resize(size - 1); - return -fraction_size; - } - if (specs.format == float_format::hex) { - buf.resize(size + offset); - return 0; - } - // Find and parse the exponent. - auto end = begin + size, exp_pos = end; - do { - --exp_pos; - } while (*exp_pos != 'e'); - char sign = exp_pos[1]; - FMT_ASSERT(sign == '+' || sign == '-', ""); - int exp = 0; - auto p = exp_pos + 2; // Skip 'e' and sign. - do { - FMT_ASSERT(is_digit(*p), ""); - exp = exp * 10 + (*p++ - '0'); - } while (p != end); - if (sign == '-') exp = -exp; - int fraction_size = 0; - if (exp_pos != begin + 1) { - // Remove trailing zeros. - auto fraction_end = exp_pos - 1; - while (*fraction_end == '0') --fraction_end; - // Move the fractional part left to get rid of the decimal point. - fraction_size = static_cast(fraction_end - begin - 1); - std::memmove(begin + 1, begin + 2, to_unsigned(fraction_size)); - } - buf.resize(to_unsigned(fraction_size) + offset + 1); - return exp - fraction_size; - } -} +} // namespace detail -// A public domain branchless UTF-8 decoder by Christopher Wellons: -// https://github.com/skeeto/branchless-utf8 -/* Decode the next character, c, from buf, reporting errors in e. - * - * Since this is a branchless decoder, four bytes will be read from the - * buffer regardless of the actual length of the next character. This - * means the buffer _must_ have at least three bytes of zero padding - * following the end of the data stream. - * - * Errors are reported in e, which will be non-zero if the parsed - * character was somehow invalid: invalid byte sequence, non-canonical - * encoding, or a surrogate half. - * - * The function returns a pointer to the next character. When an error - * occurs, this pointer will be a guess that depends on the particular - * error, but it will always advance at least one byte. - */ -FMT_FUNC const char* utf8_decode(const char* buf, uint32_t* c, int* e) { - static const char lengths[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 2, 2, 2, 3, 3, 4, 0}; - static const int masks[] = {0x00, 0x7f, 0x1f, 0x0f, 0x07}; - static const uint32_t mins[] = {4194304, 0, 128, 2048, 65536}; - static const int shiftc[] = {0, 18, 12, 6, 0}; - static const int shifte[] = {0, 6, 4, 2, 0}; - - auto s = reinterpret_cast(buf); - int len = lengths[s[0] >> 3]; - - // Compute the pointer to the next character early so that the next - // iteration can start working on the next character. Neither Clang - // nor GCC figure out this reordering on their own. - const char* next = buf + len + !len; - - // Assume a four-byte character and load four bytes. Unused bits are - // shifted out. - *c = uint32_t(s[0] & masks[len]) << 18; - *c |= uint32_t(s[1] & 0x3f) << 12; - *c |= uint32_t(s[2] & 0x3f) << 6; - *c |= uint32_t(s[3] & 0x3f) << 0; - *c >>= shiftc[len]; - - // Accumulate the various error conditions. - *e = (*c < mins[len]) << 6; // non-canonical encoding - *e |= ((*c >> 11) == 0x1b) << 7; // surrogate half? - *e |= (*c > 0x10FFFF) << 8; // out of range? - *e |= (s[1] & 0xc0) >> 2; - *e |= (s[2] & 0xc0) >> 4; - *e |= (s[3]) >> 6; - *e ^= 0x2a; // top two bits of each tail byte correct? - *e >>= shifte[len]; - - return next; -} -} // namespace internal - -template <> struct formatter { - format_parse_context::iterator parse(format_parse_context& ctx) { +template <> struct formatter { + FMT_CONSTEXPR auto parse(format_parse_context& ctx) + -> format_parse_context::iterator { return ctx.begin(); } - format_context::iterator format(const internal::bigint& n, - format_context& ctx) { + template + auto format(const detail::bigint& n, FormatContext& ctx) const -> + typename FormatContext::iterator { auto out = ctx.out(); bool first = true; for (auto i = n.bigits_.size(); i > 0; --i) { auto value = n.bigits_[i - 1u]; if (first) { - out = format_to(out, "{:x}", value); + out = format_to(out, FMT_STRING("{:x}"), value); first = false; continue; } - out = format_to(out, "{:08x}", value); + out = format_to(out, FMT_STRING("{:08x}"), value); } if (n.exp_ > 0) - out = format_to(out, "p{}", n.exp_ * internal::bigint::bigit_bits); + out = format_to(out, FMT_STRING("p{}"), + n.exp_ * detail::bigint::bigit_bits); return out; } }; -FMT_FUNC internal::utf8_to_utf16::utf8_to_utf16(string_view s) { - auto transcode = [this](const char* p) { - auto cp = uint32_t(); - auto error = 0; - p = utf8_decode(p, &cp, &error); - if (error != 0) FMT_THROW(std::runtime_error("invalid utf8")); +FMT_FUNC detail::utf8_to_utf16::utf8_to_utf16(string_view s) { + for_each_codepoint(s, [this](uint32_t cp, string_view) { + if (cp == invalid_code_point) FMT_THROW("invalid utf8"); if (cp <= 0xFFFF) { buffer_.push_back(static_cast(cp)); } else { @@ -1174,32 +1862,220 @@ FMT_FUNC internal::utf8_to_utf16::utf8_to_utf16(string_view s) { buffer_.push_back(static_cast(0xD800 + (cp >> 10))); buffer_.push_back(static_cast(0xDC00 + (cp & 0x3FF))); } - return p; - }; - auto p = s.data(); - const size_t block_size = 4; // utf8_decode always reads blocks of 4 chars. - if (s.size() >= block_size) { - for (auto end = p + s.size() - block_size + 1; p < end;) p = transcode(p); - } - if (auto num_chars_left = s.data() + s.size() - p) { - char buf[2 * block_size - 1] = {}; - memcpy(buf, p, to_unsigned(num_chars_left)); - p = buf; - do { - p = transcode(p); - } while (p - buf < num_chars_left); - } + return true; + }); buffer_.push_back(0); } -FMT_FUNC void internal::error_handler::on_error(const char* message) { - FMT_THROW_FORMAT_ERROR(message); +#if FMT_USE_STRING +FMT_FUNC std::string vformat(string_view fmt, format_args args) { + // Don't optimize the "{}" case to keep the binary size small and because it + // can be better optimized in fmt::format anyway. + auto buffer = memory_buffer(); + detail::vformat_to(buffer, fmt, args); + return to_string(buffer); } +FMT_FUNC std::wstring vformat(basic_string_view fmt, basic_format_args> args) { + // Don't optimize the "{}" case to keep the binary size small and because it + // can be better optimized in fmt::format anyway. + auto buffer = basic_memory_buffer(); + detail::vformat_to(buffer, fmt, args); + return to_string(buffer); +} +#endif + +namespace detail { + +struct singleton { + unsigned char upper; + unsigned char lower_count; +}; + +inline auto is_printable(uint16_t x, const singleton* singletons, + size_t singletons_size, + const unsigned char* singleton_lowers, + const unsigned char* normal, size_t normal_size) + -> bool { + auto upper = x >> 8; + auto lower_start = 0; + for (size_t i = 0; i < singletons_size; ++i) { + auto s = singletons[i]; + auto lower_end = lower_start + s.lower_count; + if (upper < s.upper) break; + if (upper == s.upper) { + for (auto j = lower_start; j < lower_end; ++j) { + if (singleton_lowers[j] == (x & 0xff)) return false; + } + } + lower_start = lower_end; + } + + auto xsigned = static_cast(x); + auto current = true; + for (size_t i = 0; i < normal_size; ++i) { + auto v = static_cast(normal[i]); + auto len = (v & 0x80) != 0 ? (v & 0x7f) << 8 | normal[++i] : v; + xsigned -= len; + if (xsigned < 0) break; + current = !current; + } + return current; +} + +// This code is generated by support/printable.py. +FMT_FUNC auto is_printable(uint32_t cp) -> bool { + static constexpr singleton singletons0[] = { + {0x00, 1}, {0x03, 5}, {0x05, 6}, {0x06, 3}, {0x07, 6}, {0x08, 8}, + {0x09, 17}, {0x0a, 28}, {0x0b, 25}, {0x0c, 20}, {0x0d, 16}, {0x0e, 13}, + {0x0f, 4}, {0x10, 3}, {0x12, 18}, {0x13, 9}, {0x16, 1}, {0x17, 5}, + {0x18, 2}, {0x19, 3}, {0x1a, 7}, {0x1c, 2}, {0x1d, 1}, {0x1f, 22}, + {0x20, 3}, {0x2b, 3}, {0x2c, 2}, {0x2d, 11}, {0x2e, 1}, {0x30, 3}, + {0x31, 2}, {0x32, 1}, {0xa7, 2}, {0xa9, 2}, {0xaa, 4}, {0xab, 8}, + {0xfa, 2}, {0xfb, 5}, {0xfd, 4}, {0xfe, 3}, {0xff, 9}, + }; + static constexpr unsigned char singletons0_lower[] = { + 0xad, 0x78, 0x79, 0x8b, 0x8d, 0xa2, 0x30, 0x57, 0x58, 0x8b, 0x8c, 0x90, + 0x1c, 0x1d, 0xdd, 0x0e, 0x0f, 0x4b, 0x4c, 0xfb, 0xfc, 0x2e, 0x2f, 0x3f, + 0x5c, 0x5d, 0x5f, 0xb5, 0xe2, 0x84, 0x8d, 0x8e, 0x91, 0x92, 0xa9, 0xb1, + 0xba, 0xbb, 0xc5, 0xc6, 0xc9, 0xca, 0xde, 0xe4, 0xe5, 0xff, 0x00, 0x04, + 0x11, 0x12, 0x29, 0x31, 0x34, 0x37, 0x3a, 0x3b, 0x3d, 0x49, 0x4a, 0x5d, + 0x84, 0x8e, 0x92, 0xa9, 0xb1, 0xb4, 0xba, 0xbb, 0xc6, 0xca, 0xce, 0xcf, + 0xe4, 0xe5, 0x00, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a, + 0x3b, 0x45, 0x46, 0x49, 0x4a, 0x5e, 0x64, 0x65, 0x84, 0x91, 0x9b, 0x9d, + 0xc9, 0xce, 0xcf, 0x0d, 0x11, 0x29, 0x45, 0x49, 0x57, 0x64, 0x65, 0x8d, + 0x91, 0xa9, 0xb4, 0xba, 0xbb, 0xc5, 0xc9, 0xdf, 0xe4, 0xe5, 0xf0, 0x0d, + 0x11, 0x45, 0x49, 0x64, 0x65, 0x80, 0x84, 0xb2, 0xbc, 0xbe, 0xbf, 0xd5, + 0xd7, 0xf0, 0xf1, 0x83, 0x85, 0x8b, 0xa4, 0xa6, 0xbe, 0xbf, 0xc5, 0xc7, + 0xce, 0xcf, 0xda, 0xdb, 0x48, 0x98, 0xbd, 0xcd, 0xc6, 0xce, 0xcf, 0x49, + 0x4e, 0x4f, 0x57, 0x59, 0x5e, 0x5f, 0x89, 0x8e, 0x8f, 0xb1, 0xb6, 0xb7, + 0xbf, 0xc1, 0xc6, 0xc7, 0xd7, 0x11, 0x16, 0x17, 0x5b, 0x5c, 0xf6, 0xf7, + 0xfe, 0xff, 0x80, 0x0d, 0x6d, 0x71, 0xde, 0xdf, 0x0e, 0x0f, 0x1f, 0x6e, + 0x6f, 0x1c, 0x1d, 0x5f, 0x7d, 0x7e, 0xae, 0xaf, 0xbb, 0xbc, 0xfa, 0x16, + 0x17, 0x1e, 0x1f, 0x46, 0x47, 0x4e, 0x4f, 0x58, 0x5a, 0x5c, 0x5e, 0x7e, + 0x7f, 0xb5, 0xc5, 0xd4, 0xd5, 0xdc, 0xf0, 0xf1, 0xf5, 0x72, 0x73, 0x8f, + 0x74, 0x75, 0x96, 0x2f, 0x5f, 0x26, 0x2e, 0x2f, 0xa7, 0xaf, 0xb7, 0xbf, + 0xc7, 0xcf, 0xd7, 0xdf, 0x9a, 0x40, 0x97, 0x98, 0x30, 0x8f, 0x1f, 0xc0, + 0xc1, 0xce, 0xff, 0x4e, 0x4f, 0x5a, 0x5b, 0x07, 0x08, 0x0f, 0x10, 0x27, + 0x2f, 0xee, 0xef, 0x6e, 0x6f, 0x37, 0x3d, 0x3f, 0x42, 0x45, 0x90, 0x91, + 0xfe, 0xff, 0x53, 0x67, 0x75, 0xc8, 0xc9, 0xd0, 0xd1, 0xd8, 0xd9, 0xe7, + 0xfe, 0xff, + }; + static constexpr singleton singletons1[] = { + {0x00, 6}, {0x01, 1}, {0x03, 1}, {0x04, 2}, {0x08, 8}, {0x09, 2}, + {0x0a, 5}, {0x0b, 2}, {0x0e, 4}, {0x10, 1}, {0x11, 2}, {0x12, 5}, + {0x13, 17}, {0x14, 1}, {0x15, 2}, {0x17, 2}, {0x19, 13}, {0x1c, 5}, + {0x1d, 8}, {0x24, 1}, {0x6a, 3}, {0x6b, 2}, {0xbc, 2}, {0xd1, 2}, + {0xd4, 12}, {0xd5, 9}, {0xd6, 2}, {0xd7, 2}, {0xda, 1}, {0xe0, 5}, + {0xe1, 2}, {0xe8, 2}, {0xee, 32}, {0xf0, 4}, {0xf8, 2}, {0xf9, 2}, + {0xfa, 2}, {0xfb, 1}, + }; + static constexpr unsigned char singletons1_lower[] = { + 0x0c, 0x27, 0x3b, 0x3e, 0x4e, 0x4f, 0x8f, 0x9e, 0x9e, 0x9f, 0x06, 0x07, + 0x09, 0x36, 0x3d, 0x3e, 0x56, 0xf3, 0xd0, 0xd1, 0x04, 0x14, 0x18, 0x36, + 0x37, 0x56, 0x57, 0x7f, 0xaa, 0xae, 0xaf, 0xbd, 0x35, 0xe0, 0x12, 0x87, + 0x89, 0x8e, 0x9e, 0x04, 0x0d, 0x0e, 0x11, 0x12, 0x29, 0x31, 0x34, 0x3a, + 0x45, 0x46, 0x49, 0x4a, 0x4e, 0x4f, 0x64, 0x65, 0x5c, 0xb6, 0xb7, 0x1b, + 0x1c, 0x07, 0x08, 0x0a, 0x0b, 0x14, 0x17, 0x36, 0x39, 0x3a, 0xa8, 0xa9, + 0xd8, 0xd9, 0x09, 0x37, 0x90, 0x91, 0xa8, 0x07, 0x0a, 0x3b, 0x3e, 0x66, + 0x69, 0x8f, 0x92, 0x6f, 0x5f, 0xee, 0xef, 0x5a, 0x62, 0x9a, 0x9b, 0x27, + 0x28, 0x55, 0x9d, 0xa0, 0xa1, 0xa3, 0xa4, 0xa7, 0xa8, 0xad, 0xba, 0xbc, + 0xc4, 0x06, 0x0b, 0x0c, 0x15, 0x1d, 0x3a, 0x3f, 0x45, 0x51, 0xa6, 0xa7, + 0xcc, 0xcd, 0xa0, 0x07, 0x19, 0x1a, 0x22, 0x25, 0x3e, 0x3f, 0xc5, 0xc6, + 0x04, 0x20, 0x23, 0x25, 0x26, 0x28, 0x33, 0x38, 0x3a, 0x48, 0x4a, 0x4c, + 0x50, 0x53, 0x55, 0x56, 0x58, 0x5a, 0x5c, 0x5e, 0x60, 0x63, 0x65, 0x66, + 0x6b, 0x73, 0x78, 0x7d, 0x7f, 0x8a, 0xa4, 0xaa, 0xaf, 0xb0, 0xc0, 0xd0, + 0xae, 0xaf, 0x79, 0xcc, 0x6e, 0x6f, 0x93, + }; + static constexpr unsigned char normal0[] = { + 0x00, 0x20, 0x5f, 0x22, 0x82, 0xdf, 0x04, 0x82, 0x44, 0x08, 0x1b, 0x04, + 0x06, 0x11, 0x81, 0xac, 0x0e, 0x80, 0xab, 0x35, 0x28, 0x0b, 0x80, 0xe0, + 0x03, 0x19, 0x08, 0x01, 0x04, 0x2f, 0x04, 0x34, 0x04, 0x07, 0x03, 0x01, + 0x07, 0x06, 0x07, 0x11, 0x0a, 0x50, 0x0f, 0x12, 0x07, 0x55, 0x07, 0x03, + 0x04, 0x1c, 0x0a, 0x09, 0x03, 0x08, 0x03, 0x07, 0x03, 0x02, 0x03, 0x03, + 0x03, 0x0c, 0x04, 0x05, 0x03, 0x0b, 0x06, 0x01, 0x0e, 0x15, 0x05, 0x3a, + 0x03, 0x11, 0x07, 0x06, 0x05, 0x10, 0x07, 0x57, 0x07, 0x02, 0x07, 0x15, + 0x0d, 0x50, 0x04, 0x43, 0x03, 0x2d, 0x03, 0x01, 0x04, 0x11, 0x06, 0x0f, + 0x0c, 0x3a, 0x04, 0x1d, 0x25, 0x5f, 0x20, 0x6d, 0x04, 0x6a, 0x25, 0x80, + 0xc8, 0x05, 0x82, 0xb0, 0x03, 0x1a, 0x06, 0x82, 0xfd, 0x03, 0x59, 0x07, + 0x15, 0x0b, 0x17, 0x09, 0x14, 0x0c, 0x14, 0x0c, 0x6a, 0x06, 0x0a, 0x06, + 0x1a, 0x06, 0x59, 0x07, 0x2b, 0x05, 0x46, 0x0a, 0x2c, 0x04, 0x0c, 0x04, + 0x01, 0x03, 0x31, 0x0b, 0x2c, 0x04, 0x1a, 0x06, 0x0b, 0x03, 0x80, 0xac, + 0x06, 0x0a, 0x06, 0x21, 0x3f, 0x4c, 0x04, 0x2d, 0x03, 0x74, 0x08, 0x3c, + 0x03, 0x0f, 0x03, 0x3c, 0x07, 0x38, 0x08, 0x2b, 0x05, 0x82, 0xff, 0x11, + 0x18, 0x08, 0x2f, 0x11, 0x2d, 0x03, 0x20, 0x10, 0x21, 0x0f, 0x80, 0x8c, + 0x04, 0x82, 0x97, 0x19, 0x0b, 0x15, 0x88, 0x94, 0x05, 0x2f, 0x05, 0x3b, + 0x07, 0x02, 0x0e, 0x18, 0x09, 0x80, 0xb3, 0x2d, 0x74, 0x0c, 0x80, 0xd6, + 0x1a, 0x0c, 0x05, 0x80, 0xff, 0x05, 0x80, 0xdf, 0x0c, 0xee, 0x0d, 0x03, + 0x84, 0x8d, 0x03, 0x37, 0x09, 0x81, 0x5c, 0x14, 0x80, 0xb8, 0x08, 0x80, + 0xcb, 0x2a, 0x38, 0x03, 0x0a, 0x06, 0x38, 0x08, 0x46, 0x08, 0x0c, 0x06, + 0x74, 0x0b, 0x1e, 0x03, 0x5a, 0x04, 0x59, 0x09, 0x80, 0x83, 0x18, 0x1c, + 0x0a, 0x16, 0x09, 0x4c, 0x04, 0x80, 0x8a, 0x06, 0xab, 0xa4, 0x0c, 0x17, + 0x04, 0x31, 0xa1, 0x04, 0x81, 0xda, 0x26, 0x07, 0x0c, 0x05, 0x05, 0x80, + 0xa5, 0x11, 0x81, 0x6d, 0x10, 0x78, 0x28, 0x2a, 0x06, 0x4c, 0x04, 0x80, + 0x8d, 0x04, 0x80, 0xbe, 0x03, 0x1b, 0x03, 0x0f, 0x0d, + }; + static constexpr unsigned char normal1[] = { + 0x5e, 0x22, 0x7b, 0x05, 0x03, 0x04, 0x2d, 0x03, 0x66, 0x03, 0x01, 0x2f, + 0x2e, 0x80, 0x82, 0x1d, 0x03, 0x31, 0x0f, 0x1c, 0x04, 0x24, 0x09, 0x1e, + 0x05, 0x2b, 0x05, 0x44, 0x04, 0x0e, 0x2a, 0x80, 0xaa, 0x06, 0x24, 0x04, + 0x24, 0x04, 0x28, 0x08, 0x34, 0x0b, 0x01, 0x80, 0x90, 0x81, 0x37, 0x09, + 0x16, 0x0a, 0x08, 0x80, 0x98, 0x39, 0x03, 0x63, 0x08, 0x09, 0x30, 0x16, + 0x05, 0x21, 0x03, 0x1b, 0x05, 0x01, 0x40, 0x38, 0x04, 0x4b, 0x05, 0x2f, + 0x04, 0x0a, 0x07, 0x09, 0x07, 0x40, 0x20, 0x27, 0x04, 0x0c, 0x09, 0x36, + 0x03, 0x3a, 0x05, 0x1a, 0x07, 0x04, 0x0c, 0x07, 0x50, 0x49, 0x37, 0x33, + 0x0d, 0x33, 0x07, 0x2e, 0x08, 0x0a, 0x81, 0x26, 0x52, 0x4e, 0x28, 0x08, + 0x2a, 0x56, 0x1c, 0x14, 0x17, 0x09, 0x4e, 0x04, 0x1e, 0x0f, 0x43, 0x0e, + 0x19, 0x07, 0x0a, 0x06, 0x48, 0x08, 0x27, 0x09, 0x75, 0x0b, 0x3f, 0x41, + 0x2a, 0x06, 0x3b, 0x05, 0x0a, 0x06, 0x51, 0x06, 0x01, 0x05, 0x10, 0x03, + 0x05, 0x80, 0x8b, 0x62, 0x1e, 0x48, 0x08, 0x0a, 0x80, 0xa6, 0x5e, 0x22, + 0x45, 0x0b, 0x0a, 0x06, 0x0d, 0x13, 0x39, 0x07, 0x0a, 0x36, 0x2c, 0x04, + 0x10, 0x80, 0xc0, 0x3c, 0x64, 0x53, 0x0c, 0x48, 0x09, 0x0a, 0x46, 0x45, + 0x1b, 0x48, 0x08, 0x53, 0x1d, 0x39, 0x81, 0x07, 0x46, 0x0a, 0x1d, 0x03, + 0x47, 0x49, 0x37, 0x03, 0x0e, 0x08, 0x0a, 0x06, 0x39, 0x07, 0x0a, 0x81, + 0x36, 0x19, 0x80, 0xb7, 0x01, 0x0f, 0x32, 0x0d, 0x83, 0x9b, 0x66, 0x75, + 0x0b, 0x80, 0xc4, 0x8a, 0xbc, 0x84, 0x2f, 0x8f, 0xd1, 0x82, 0x47, 0xa1, + 0xb9, 0x82, 0x39, 0x07, 0x2a, 0x04, 0x02, 0x60, 0x26, 0x0a, 0x46, 0x0a, + 0x28, 0x05, 0x13, 0x82, 0xb0, 0x5b, 0x65, 0x4b, 0x04, 0x39, 0x07, 0x11, + 0x40, 0x05, 0x0b, 0x02, 0x0e, 0x97, 0xf8, 0x08, 0x84, 0xd6, 0x2a, 0x09, + 0xa2, 0xf7, 0x81, 0x1f, 0x31, 0x03, 0x11, 0x04, 0x08, 0x81, 0x8c, 0x89, + 0x04, 0x6b, 0x05, 0x0d, 0x03, 0x09, 0x07, 0x10, 0x93, 0x60, 0x80, 0xf6, + 0x0a, 0x73, 0x08, 0x6e, 0x17, 0x46, 0x80, 0x9a, 0x14, 0x0c, 0x57, 0x09, + 0x19, 0x80, 0x87, 0x81, 0x47, 0x03, 0x85, 0x42, 0x0f, 0x15, 0x85, 0x50, + 0x2b, 0x80, 0xd5, 0x2d, 0x03, 0x1a, 0x04, 0x02, 0x81, 0x70, 0x3a, 0x05, + 0x01, 0x85, 0x00, 0x80, 0xd7, 0x29, 0x4c, 0x04, 0x0a, 0x04, 0x02, 0x83, + 0x11, 0x44, 0x4c, 0x3d, 0x80, 0xc2, 0x3c, 0x06, 0x01, 0x04, 0x55, 0x05, + 0x1b, 0x34, 0x02, 0x81, 0x0e, 0x2c, 0x04, 0x64, 0x0c, 0x56, 0x0a, 0x80, + 0xae, 0x38, 0x1d, 0x0d, 0x2c, 0x04, 0x09, 0x07, 0x02, 0x0e, 0x06, 0x80, + 0x9a, 0x83, 0xd8, 0x08, 0x0d, 0x03, 0x0d, 0x03, 0x74, 0x0c, 0x59, 0x07, + 0x0c, 0x14, 0x0c, 0x04, 0x38, 0x08, 0x0a, 0x06, 0x28, 0x08, 0x22, 0x4e, + 0x81, 0x54, 0x0c, 0x15, 0x03, 0x03, 0x05, 0x07, 0x09, 0x19, 0x07, 0x07, + 0x09, 0x03, 0x0d, 0x07, 0x29, 0x80, 0xcb, 0x25, 0x0a, 0x84, 0x06, + }; + auto lower = static_cast(cp); + if (cp < 0x10000) { + return is_printable(lower, singletons0, + sizeof(singletons0) / sizeof(*singletons0), + singletons0_lower, normal0, sizeof(normal0)); + } + if (cp < 0x20000) { + return is_printable(lower, singletons1, + sizeof(singletons1) / sizeof(*singletons1), + singletons1_lower, normal1, sizeof(normal1)); + } + if (0x2a6de <= cp && cp < 0x2a700) return false; + if (0x2b735 <= cp && cp < 0x2b740) return false; + if (0x2b81e <= cp && cp < 0x2b820) return false; + if (0x2cea2 <= cp && cp < 0x2ceb0) return false; + if (0x2ebe1 <= cp && cp < 0x2f800) return false; + if (0x2fa1e <= cp && cp < 0x30000) return false; + if (0x3134b <= cp && cp < 0xe0100) return false; + if (0xe01f0 <= cp && cp < 0x110000) return false; + return cp < 0x110000; +} + +} // namespace detail + FMT_END_NAMESPACE -#ifdef _MSC_VER -# pragma warning(pop) -#endif - #endif // FMT_FORMAT_INL_H_ diff --git a/Source/ThirdParty/fmt/format.cpp b/Source/ThirdParty/fmt/format.cpp index 03c97e636..b1d610b26 100644 --- a/Source/ThirdParty/fmt/format.cpp +++ b/Source/ThirdParty/fmt/format.cpp @@ -8,170 +8,42 @@ #include "fmt/format-inl.h" FMT_BEGIN_NAMESPACE -namespace internal { +namespace detail { -template -int format_float(char* buf, std::size_t size, const char* format, int precision, - T value) { -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - if (precision > 100000) - throw std::runtime_error( - "fuzz mode - avoid large allocation inside snprintf"); -#endif - // Suppress the warning about nonliteral format string. - int (*snprintf_ptr)(char*, size_t, const char*, ...) = FMT_SNPRINTF; - return precision < 0 ? snprintf_ptr(buf, size, format, value) - : snprintf_ptr(buf, size, format, precision, value); -} -struct sprintf_specs { - int precision; - char type; - bool alt : 1; - - template - constexpr sprintf_specs(basic_format_specs specs) - : precision(specs.precision), type(specs.type), alt(specs.alt) {} - - constexpr bool has_precision() const { return precision >= 0; } -}; - -// This is deprecated and is kept only to preserve ABI compatibility. -template -char* sprintf_format(Double value, internal::buffer& buf, - sprintf_specs specs) { - // Buffer capacity must be non-zero, otherwise MSVC's vsnprintf_s will fail. - FMT_ASSERT(buf.capacity() != 0, "empty buffer"); - - // Build format string. - enum { max_format_size = 10 }; // longest format: %#-*.*Lg - char format[max_format_size]; - char* format_ptr = format; - *format_ptr++ = '%'; - if (specs.alt || !specs.type) *format_ptr++ = '#'; - if (specs.precision >= 0) { - *format_ptr++ = '.'; - *format_ptr++ = '*'; - } - if (std::is_same::value) *format_ptr++ = 'L'; - - char type = specs.type; - - if (type == '%') - type = 'f'; - else if (type == 0 || type == 'n') - type = 'g'; -#if FMT_MSC_VER - if (type == 'F') { - // MSVC's printf doesn't support 'F'. - type = 'f'; - } -#endif - *format_ptr++ = type; - *format_ptr = '\0'; - - // Format using snprintf. - char* start = nullptr; - char* decimal_point_pos = nullptr; - for (;;) { - std::size_t buffer_size = buf.capacity(); - start = &buf[0]; - int result = - format_float(start, buffer_size, format, specs.precision, value); - if (result >= 0) { - unsigned n = internal::to_unsigned(result); - if (n < buf.capacity()) { - // Find the decimal point. - auto p = buf.data(), end = p + n; - if (*p == '+' || *p == '-') ++p; - if (specs.type != 'a' && specs.type != 'A') { - while (p < end && *p >= '0' && *p <= '9') ++p; - if (p < end && *p != 'e' && *p != 'E') { - decimal_point_pos = p; - if (!specs.type) { - // Keep only one trailing zero after the decimal point. - ++p; - if (*p == '0') ++p; - while (p != end && *p >= '1' && *p <= '9') ++p; - char* where = p; - while (p != end && *p == '0') ++p; - if (p == end || *p < '0' || *p > '9') { - if (p != end) std::memmove(where, p, to_unsigned(end - p)); - n -= static_cast(p - where); - } - } - } - } - buf.resize(n); - break; // The buffer is large enough - continue with formatting. - } - buf.reserve(n + 1); - } else { - // If result is negative we ask to increase the capacity by at least 1, - // but as std::vector, the buffer grows exponentially. - buf.reserve(buf.capacity() + 1); - } - } - return decimal_point_pos; -} -} // namespace internal - -template FMT_API char* internal::sprintf_format(double, internal::buffer&, - sprintf_specs); -template FMT_API char* internal::sprintf_format(long double, - internal::buffer&, - sprintf_specs); +template FMT_API auto dragonbox::to_decimal(float x) noexcept + -> dragonbox::decimal_fp; +template FMT_API auto dragonbox::to_decimal(double x) noexcept + -> dragonbox::decimal_fp; #ifndef FMT_STATIC_THOUSANDS_SEPARATOR -template FMT_API internal::locale_ref::locale_ref(const std::locale& loc); -template FMT_API std::locale internal::locale_ref::get() const; +template FMT_API locale_ref::locale_ref(const std::locale& loc); +template FMT_API auto locale_ref::get() const -> std::locale; #endif // Explicit instantiations for char. -#if FMT_USE_LOCALE_GROUPING -template FMT_API std::string internal::grouping_impl(locale_ref); -#endif -template FMT_API char internal::thousands_sep_impl(locale_ref); -template FMT_API char internal::decimal_point_impl(locale_ref); +template FMT_API auto thousands_sep_impl(locale_ref) + -> thousands_sep_result; +template FMT_API auto decimal_point_impl(locale_ref) -> char; -template FMT_API void internal::buffer::append(const char*, const char*); +template FMT_API void buffer::append(const char*, const char*); -template FMT_API void internal::arg_map::init( - const basic_format_args& args); +// DEPRECATED! +// There is no correspondent extern template in format.h because of +// incompatibility between clang and gcc (#2377). +template FMT_API void vformat_to(buffer&, string_view, + basic_format_args, + locale_ref); -#if FMT_USE_STRING -template FMT_API std::string internal::vformat( - string_view, basic_format_args); -#endif - -template FMT_API format_context::iterator internal::vformat_to( - internal::buffer&, string_view, basic_format_args); - -template FMT_API int internal::snprintf_float(double, int, - internal::float_specs, - internal::buffer&); -template FMT_API int internal::snprintf_float(long double, int, - internal::float_specs, - internal::buffer&); -template FMT_API int internal::format_float(double, int, internal::float_specs, - internal::buffer&); -template FMT_API int internal::format_float(long double, int, - internal::float_specs, - internal::buffer&); +template FMT_API int format_float(double value, int precision, float_specs specs, buffer& buf); // Explicit instantiations for wchar_t. -#if FMT_USE_LOCALE_GROUPING -template FMT_API std::string internal::grouping_impl(locale_ref); -#endif -template FMT_API wchar_t internal::thousands_sep_impl(locale_ref); -template FMT_API wchar_t internal::decimal_point_impl(locale_ref); +template FMT_API auto thousands_sep_impl(locale_ref) + -> thousands_sep_result; +template FMT_API auto decimal_point_impl(locale_ref) -> wchar_t; -template FMT_API void internal::buffer::append(const wchar_t*, - const wchar_t*); +template FMT_API void buffer::append(const wchar_t*, const wchar_t*); -#if FMT_USE_STRING -template FMT_API std::wstring internal::vformat( - wstring_view, basic_format_args); -#endif +} // namespace detail FMT_END_NAMESPACE diff --git a/Source/ThirdParty/fmt/format.h b/Source/ThirdParty/fmt/format.h index 7d43f9ee4..0550af1b5 100644 --- a/Source/ThirdParty/fmt/format.h +++ b/Source/ThirdParty/fmt/format.h @@ -1,33 +1,33 @@ /* - Formatting library for C++ + Formatting library for C++ - Copyright (c) 2012 - present, Victor Zverovich + Copyright (c) 2012 - present, Victor Zverovich - 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: + 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 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. + 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. - --- Optional exception to the license --- + --- Optional exception to the license --- - As an exception, if, as a result of your compiling your source code, portions - of this Software are embedded into a machine-executable object form of such - source code, you may redistribute such embedded portions in such object form - without including the above copyright and permission notices. + As an exception, if, as a result of your compiling your source code, portions + of this Software are embedded into a machine-executable object form of such + source code, you may redistribute such embedded portions in such object form + without including the above copyright and permission notices. */ #ifndef FMT_FORMAT_H_ @@ -39,12 +39,10 @@ #include "core.h" -#ifdef __INTEL_COMPILER -# define FMT_ICC_VERSION __INTEL_COMPILER -#elif defined(__ICL) -# define FMT_ICC_VERSION __ICL +#if FMT_GCC_VERSION +# define FMT_GCC_VISIBILITY_HIDDEN __attribute__((visibility("hidden"))) #else -# define FMT_ICC_VERSION 0 +# define FMT_GCC_VISIBILITY_HIDDEN #endif #ifdef __NVCC__ @@ -65,47 +63,41 @@ # define FMT_NOINLINE #endif -#if __cplusplus == 201103L || __cplusplus == 201402L -# if defined(__clang__) -# define FMT_FALLTHROUGH [[clang::fallthrough]] -# elif FMT_GCC_VERSION >= 700 && !defined(__PGI) -# define FMT_FALLTHROUGH [[gnu::fallthrough]] -# else -# define FMT_FALLTHROUGH -# endif -#elif FMT_HAS_CPP17_ATTRIBUTE(fallthrough) || \ - (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) -# define FMT_FALLTHROUGH [[fallthrough]] +#if FMT_MSC_VERSION +# define FMT_MSC_DEFAULT = default #else -# define FMT_FALLTHROUGH +# define FMT_MSC_DEFAULT #endif #ifndef FMT_THROW # if FMT_EXCEPTIONS -# if FMT_MSC_VER || FMT_NVCC +# if FMT_MSC_VERSION || defined(__NVCC__) FMT_BEGIN_NAMESPACE -namespace internal { +namespace detail { template inline void do_throw(const Exception& x) { // Silence unreachable code warnings in MSVC and NVCC because these // are nearly impossible to fix in a generic code. volatile bool b = true; if (b) throw x; } -} // namespace internal +} // namespace detail FMT_END_NAMESPACE -# define FMT_THROW(x) internal::do_throw(x) +# define FMT_THROW(x) detail::do_throw(x) # else # define FMT_THROW(x) throw x # endif # else -# define FMT_THROW(x) \ - do { \ - static_cast(sizeof(x)); \ - FMT_ASSERT(false, ""); \ +# define FMT_THROW(x) \ + do { \ + FMT_ASSERT(false, (x).what()); \ } while (false) # endif #endif +#ifndef FMT_THROW_FORMAT_ERROR +#define FMT_THROW_FORMAT_ERROR(x) FMT_THROW(x) +#endif + #if FMT_EXCEPTIONS # define FMT_TRY try # define FMT_CATCH(x) catch (x) @@ -114,326 +106,682 @@ FMT_END_NAMESPACE # define FMT_CATCH(x) if (false) #endif +#ifndef FMT_MAYBE_UNUSED +# if FMT_HAS_CPP17_ATTRIBUTE(maybe_unused) +# define FMT_MAYBE_UNUSED [[maybe_unused]] +# else +# define FMT_MAYBE_UNUSED +# endif +#endif + #ifndef FMT_USE_USER_DEFINED_LITERALS -// For Intel and NVIDIA compilers both they and the system gcc/msc support UDLs. -# if (FMT_HAS_FEATURE(cxx_user_literals) || FMT_GCC_VERSION >= 407 || \ - FMT_MSC_VER >= 1900) && \ - (!(FMT_ICC_VERSION || FMT_CUDA_VERSION) || FMT_ICC_VERSION >= 1500 || \ - FMT_CUDA_VERSION >= 700) +// EDG based compilers (Intel, NVIDIA, Elbrus, etc), GCC and MSVC support UDLs. +# if (FMT_HAS_FEATURE(cxx_user_literals) || FMT_GCC_VERSION >= 407 || \ + FMT_MSC_VERSION >= 1900) && \ + (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= /* UDL feature */ 480) # define FMT_USE_USER_DEFINED_LITERALS 1 # else # define FMT_USE_USER_DEFINED_LITERALS 0 # endif #endif -#ifndef FMT_USE_UDL_TEMPLATE -// EDG front end based compilers (icc, nvcc) and GCC < 6.4 do not propertly -// support UDL templates and GCC >= 9 warns about them. -# if FMT_USE_USER_DEFINED_LITERALS && FMT_ICC_VERSION == 0 && \ - FMT_CUDA_VERSION == 0 && \ - ((FMT_GCC_VERSION >= 604 && FMT_GCC_VERSION <= 900 && \ - __cplusplus >= 201402L) || \ - FMT_CLANG_VERSION >= 304) -# define FMT_USE_UDL_TEMPLATE 1 -# else -# define FMT_USE_UDL_TEMPLATE 0 -# endif -#endif - -#ifndef FMT_USE_FLOAT -# define FMT_USE_FLOAT 1 -#endif - -#ifndef FMT_USE_DOUBLE -# define FMT_USE_DOUBLE 1 -#endif - -#ifndef FMT_USE_LONG_DOUBLE -# define FMT_USE_LONG_DOUBLE 1 +// Defining FMT_REDUCE_INT_INSTANTIATIONS to 1, will reduce the number of +// integer formatter template instantiations to just one by only using the +// largest integer type. This results in a reduction in binary size but will +// cause a decrease in integer formatting performance. +#if !defined(FMT_REDUCE_INT_INSTANTIATIONS) +# define FMT_REDUCE_INT_INSTANTIATIONS 0 #endif // __builtin_clz is broken in clang with Microsoft CodeGen: -// https://github.com/fmtlib/fmt/issues/519 -#if (FMT_GCC_VERSION || FMT_HAS_BUILTIN(__builtin_clz)) && !FMT_MSC_VER -# define FMT_BUILTIN_CLZ(n) __builtin_clz(n) +// https://github.com/fmtlib/fmt/issues/519. +#if !FMT_MSC_VERSION +# if FMT_HAS_BUILTIN(__builtin_clz) || FMT_GCC_VERSION || FMT_ICC_VERSION +# define FMT_BUILTIN_CLZ(n) __builtin_clz(n) +# endif +# if FMT_HAS_BUILTIN(__builtin_clzll) || FMT_GCC_VERSION || FMT_ICC_VERSION +# define FMT_BUILTIN_CLZLL(n) __builtin_clzll(n) +# endif #endif -#if (FMT_GCC_VERSION || FMT_HAS_BUILTIN(__builtin_clzll)) && !FMT_MSC_VER -# define FMT_BUILTIN_CLZLL(n) __builtin_clzll(n) + +// __builtin_ctz is broken in Intel Compiler Classic on Windows: +// https://github.com/fmtlib/fmt/issues/2510. +#ifndef __ICL +# if FMT_HAS_BUILTIN(__builtin_ctz) || FMT_GCC_VERSION || FMT_ICC_VERSION || \ + defined(__NVCOMPILER) +# define FMT_BUILTIN_CTZ(n) __builtin_ctz(n) +# endif +# if FMT_HAS_BUILTIN(__builtin_ctzll) || FMT_GCC_VERSION || \ + FMT_ICC_VERSION || defined(__NVCOMPILER) +# define FMT_BUILTIN_CTZLL(n) __builtin_ctzll(n) +# endif +#endif + +#if FMT_MSC_VERSION +# include // _BitScanReverse[64], _BitScanForward[64], _umul128 #endif // Some compilers masquerade as both MSVC and GCC-likes or otherwise support // __builtin_clz and __builtin_clzll, so only define FMT_BUILTIN_CLZ using the // MSVC intrinsics if the clz and clzll builtins are not available. -#if FMT_MSC_VER && !defined(FMT_BUILTIN_CLZLL) && !defined(_MANAGED) -extern "C" unsigned char _BitScanReverse(unsigned long* Index, unsigned long Mask); -# ifdef _WIN64 -extern "C" unsigned char _BitScanReverse64(unsigned long* Index, unsigned __int64 Mask); -#endif - +#if FMT_MSC_VERSION && !defined(FMT_BUILTIN_CLZLL) && \ + !defined(FMT_BUILTIN_CTZLL) FMT_BEGIN_NAMESPACE -namespace internal { +namespace detail { // Avoid Clang with Microsoft CodeGen's -Wunknown-pragmas warning. -# ifndef __clang__ +# if !defined(__clang__) +# pragma intrinsic(_BitScanForward) # pragma intrinsic(_BitScanReverse) +# if defined(_WIN64) +# pragma intrinsic(_BitScanForward64) +# pragma intrinsic(_BitScanReverse64) +# endif # endif -inline uint32_t clz(uint32_t x) { + +inline auto clz(uint32_t x) -> int { unsigned long r = 0; _BitScanReverse(&r, x); - FMT_ASSERT(x != 0, ""); // Static analysis complains about using uninitialized data // "r", but the only way that can happen is if "x" is 0, // which the callers guarantee to not happen. -# pragma warning(suppress : 6102) - return 31 - r; + FMT_MSC_WARNING(suppress : 6102) + return 31 ^ static_cast(r); } -# define FMT_BUILTIN_CLZ(n) internal::clz(n) +# define FMT_BUILTIN_CLZ(n) detail::clz(n) -# if defined(_WIN64) && !defined(__clang__) -# pragma intrinsic(_BitScanReverse64) -# endif - -inline uint32_t clzll(uint64_t x) { +inline auto clzll(uint64_t x) -> int { unsigned long r = 0; # ifdef _WIN64 _BitScanReverse64(&r, x); # else // Scan the high 32 bits. - if (_BitScanReverse(&r, static_cast(x >> 32))) return 63 - (r + 32); - + if (_BitScanReverse(&r, static_cast(x >> 32))) return 63 ^ (r + 32); // Scan the low 32 bits. _BitScanReverse(&r, static_cast(x)); # endif - FMT_ASSERT(x != 0, ""); - // Static analysis complains about using uninitialized data - // "r", but the only way that can happen is if "x" is 0, - // which the callers guarantee to not happen. -# pragma warning(suppress : 6102) - return 63 - r; + FMT_MSC_WARNING(suppress : 6102) // Suppress a bogus static analysis warning. + return 63 ^ static_cast(r); } -# define FMT_BUILTIN_CLZLL(n) internal::clzll(n) -} // namespace internal +# define FMT_BUILTIN_CLZLL(n) detail::clzll(n) + +inline auto ctz(uint32_t x) -> int { + unsigned long r = 0; + _BitScanForward(&r, x); + FMT_ASSERT(x != 0, ""); + FMT_MSC_WARNING(suppress : 6102) // Suppress a bogus static analysis warning. + return static_cast(r); +} +# define FMT_BUILTIN_CTZ(n) detail::ctz(n) + +inline auto ctzll(uint64_t x) -> int { + unsigned long r = 0; + FMT_ASSERT(x != 0, ""); + FMT_MSC_WARNING(suppress : 6102) // Suppress a bogus static analysis warning. +# ifdef _WIN64 + _BitScanForward64(&r, x); +# else + // Scan the low 32 bits. + if (_BitScanForward(&r, static_cast(x))) return static_cast(r); + // Scan the high 32 bits. + _BitScanForward(&r, static_cast(x >> 32)); + r += 32; +# endif + return static_cast(r); +} +# define FMT_BUILTIN_CTZLL(n) detail::ctzll(n) +} // namespace detail FMT_END_NAMESPACE #endif -// Enable the deprecated numeric alignment. -#ifndef FMT_NUMERIC_ALIGN -# define FMT_NUMERIC_ALIGN 1 -#endif - FMT_BEGIN_NAMESPACE -namespace internal { +namespace detail { -// An equivalent of `*reinterpret_cast(&source)` that doesn't have -// undefined behavior (e.g. due to type aliasing). -// Example: uint64_t d = bit_cast(2.718); -template -inline Dest bit_cast(const Source& source) { - static_assert(sizeof(Dest) == sizeof(Source), "size mismatch"); - Dest dest; - ::memcpy(&dest, &source, sizeof(dest)); - return dest; +FMT_CONSTEXPR inline void abort_fuzzing_if(bool condition) { + ignore_unused(condition); +#ifdef FMT_FUZZ + if (condition) throw std::runtime_error("fuzzing limit reached"); +#endif } -inline bool is_big_endian() { - const auto u = 1u; - struct bytes { - char data[sizeof(u)]; - }; - return bit_cast(u).data[0] == 0; -} - -// A fallback implementation of uintptr_t for systems that lack it. -struct fallback_uintptr { - unsigned char value[sizeof(void*)]; - - fallback_uintptr() = default; - explicit fallback_uintptr(const void* p) { - *this = bit_cast(p); - if (is_big_endian()) { - for (size_t i = 0, j = sizeof(void*) - 1; i < j; ++i, --j) - ::Swap(value[i], value[j]); - } +template struct string_literal { + static constexpr CharT value[sizeof...(C)] = {C...}; + constexpr operator basic_string_view() const { + return {value, sizeof...(C)}; } }; + +#if FMT_CPLUSPLUS < 201703L +template +constexpr CharT string_literal::value[sizeof...(C)]; +#endif + +template class formatbuf : public Streambuf { + private: + using char_type = typename Streambuf::char_type; + using streamsize = decltype(std::declval().sputn(nullptr, 0)); + using int_type = typename Streambuf::int_type; + using traits_type = typename Streambuf::traits_type; + + buffer& buffer_; + + public: + explicit formatbuf(buffer& buf) : buffer_(buf) {} + + protected: + // The put area is always empty. This makes the implementation simpler and has + // the advantage that the streambuf and the buffer are always in sync and + // sputc never writes into uninitialized memory. A disadvantage is that each + // call to sputc always results in a (virtual) call to overflow. There is no + // disadvantage here for sputn since this always results in a call to xsputn. + + auto overflow(int_type ch) -> int_type override { + if (!traits_type::eq_int_type(ch, traits_type::eof())) + buffer_.push_back(static_cast(ch)); + return ch; + } + + auto xsputn(const char_type* s, streamsize count) -> streamsize override { + buffer_.append(s, s + count); + return count; + } +}; + +// Implementation of std::bit_cast for pre-C++20. +template +FMT_CONSTEXPR20 auto bit_cast(const From& from) -> To { + auto to = To(); + ::memcpy(static_cast(&to), &from, sizeof(to)); + return to; +} + +inline auto is_big_endian() -> bool { +#ifdef _WIN32 + return false; +#elif defined(__BIG_ENDIAN__) + return true; +#elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) + return __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__; +#else + struct bytes { + char data[sizeof(int)]; + }; + return bit_cast(1).data[0] == 0; +#endif +} + +class uint128_fallback { + private: + uint64_t lo_, hi_; + + friend uint128_fallback umul128(uint64_t x, uint64_t y) noexcept; + + public: + constexpr uint128_fallback(uint64_t hi, uint64_t lo) : lo_(lo), hi_(hi) {} + constexpr uint128_fallback(uint64_t value = 0) : lo_(value), hi_(0) {} + + constexpr uint64_t high() const noexcept { return hi_; } + constexpr uint64_t low() const noexcept { return lo_; } + + template ::value)> + constexpr explicit operator T() const { + return static_cast(lo_); + } + + friend constexpr auto operator==(const uint128_fallback& lhs, + const uint128_fallback& rhs) -> bool { + return lhs.hi_ == rhs.hi_ && lhs.lo_ == rhs.lo_; + } + friend constexpr auto operator!=(const uint128_fallback& lhs, + const uint128_fallback& rhs) -> bool { + return !(lhs == rhs); + } + friend constexpr auto operator>(const uint128_fallback& lhs, + const uint128_fallback& rhs) -> bool { + return lhs.hi_ != rhs.hi_ ? lhs.hi_ > rhs.hi_ : lhs.lo_ > rhs.lo_; + } + friend constexpr auto operator|(const uint128_fallback& lhs, + const uint128_fallback& rhs) + -> uint128_fallback { + return {lhs.hi_ | rhs.hi_, lhs.lo_ | rhs.lo_}; + } + friend constexpr auto operator&(const uint128_fallback& lhs, + const uint128_fallback& rhs) + -> uint128_fallback { + return {lhs.hi_ & rhs.hi_, lhs.lo_ & rhs.lo_}; + } + friend auto operator+(const uint128_fallback& lhs, + const uint128_fallback& rhs) -> uint128_fallback { + auto result = uint128_fallback(lhs); + result += rhs; + return result; + } + friend auto operator*(const uint128_fallback& lhs, uint32_t rhs) + -> uint128_fallback { + FMT_ASSERT(lhs.hi_ == 0, ""); + uint64_t hi = (lhs.lo_ >> 32) * rhs; + uint64_t lo = (lhs.lo_ & ~uint32_t()) * rhs; + uint64_t new_lo = (hi << 32) + lo; + return {(hi >> 32) + (new_lo < lo ? 1 : 0), new_lo}; + } + friend auto operator-(const uint128_fallback& lhs, uint64_t rhs) + -> uint128_fallback { + return {lhs.hi_ - (lhs.lo_ < rhs ? 1 : 0), lhs.lo_ - rhs}; + } + FMT_CONSTEXPR auto operator>>(int shift) const -> uint128_fallback { + if (shift == 64) return {0, hi_}; + if (shift > 64) return uint128_fallback(0, hi_) >> (shift - 64); + return {hi_ >> shift, (hi_ << (64 - shift)) | (lo_ >> shift)}; + } + FMT_CONSTEXPR auto operator<<(int shift) const -> uint128_fallback { + if (shift == 64) return {lo_, 0}; + if (shift > 64) return uint128_fallback(lo_, 0) << (shift - 64); + return {hi_ << shift | (lo_ >> (64 - shift)), (lo_ << shift)}; + } + FMT_CONSTEXPR auto operator>>=(int shift) -> uint128_fallback& { + return *this = *this >> shift; + } + FMT_CONSTEXPR void operator+=(uint128_fallback n) { + uint64_t new_lo = lo_ + n.lo_; + uint64_t new_hi = hi_ + n.hi_ + (new_lo < lo_ ? 1 : 0); + FMT_ASSERT(new_hi >= hi_, ""); + lo_ = new_lo; + hi_ = new_hi; + } + + FMT_CONSTEXPR20 uint128_fallback& operator+=(uint64_t n) noexcept { + if (is_constant_evaluated()) { + lo_ += n; + hi_ += (lo_ < n ? 1 : 0); + return *this; + } +#if FMT_HAS_BUILTIN(__builtin_addcll) && !defined(__ibmxl__) + unsigned long long carry; + lo_ = __builtin_addcll(lo_, n, 0, &carry); + hi_ += carry; +#elif FMT_HAS_BUILTIN(__builtin_ia32_addcarryx_u64) && !defined(__ibmxl__) + unsigned long long result; + auto carry = __builtin_ia32_addcarryx_u64(0, lo_, n, &result); + lo_ = result; + hi_ += carry; +#elif defined(_MSC_VER) && defined(_M_X64) + auto carry = _addcarry_u64(0, lo_, n, &lo_); + _addcarry_u64(carry, hi_, 0, &hi_); +#else + lo_ += n; + hi_ += (lo_ < n ? 1 : 0); +#endif + return *this; + } +}; + +using uint128_t = conditional_t; + #ifdef UINTPTR_MAX using uintptr_t = ::uintptr_t; -inline uintptr_t to_uintptr(const void* p) { return bit_cast(p); } #else -using uintptr_t = fallback_uintptr; -inline fallback_uintptr to_uintptr(const void* p) { - return fallback_uintptr(p); -} +using uintptr_t = uint128_t; #endif // Returns the largest possible value for type T. Same as // std::numeric_limits::max() but shorter and not affected by the max macro. -template constexpr T max_value() { +template constexpr auto max_value() -> T { return (std::numeric_limits::max)(); } -template constexpr int num_bits() { +template constexpr auto num_bits() -> int { return std::numeric_limits::digits; } -template <> constexpr int num_bits() { - return static_cast(sizeof(void*) * - std::numeric_limits::digits); -} +// std::numeric_limits::digits may return 0 for 128-bit ints. +template <> constexpr auto num_bits() -> int { return 128; } +template <> constexpr auto num_bits() -> int { return 128; } -#if FMT_USE_STRING -// A workaround for std::string not having mutable data() until C++17. -template inline Char* get_data(std::basic_string& s) { - return &s[0]; -} -#endif -template -inline typename Container::value_type* get_data(Container& c) { - return c.data(); -} - -template ::value)> -inline typename Container::value_type* reserve( - fmt::back_insert_iterator& it, std::size_t n) { - Container& c = get_container(it); - std::size_t size = c.size(); - c.resize(size + n); - return get_data(c) + size; -} - -template -inline Iterator& reserve(Iterator& it, std::size_t) { - return it; -} - -// An output iterator that counts the number of objects written to it and -// discards them. -class counting_iterator { - private: - std::size_t count_; - - public: - using difference_type = std::ptrdiff_t; - using pointer = void; - using reference = void; - using _Unchecked_type = counting_iterator; // Mark iterator as checked. - - struct value_type { - template void operator=(const T&) {} - }; - - counting_iterator() : count_(0) {} - - std::size_t count() const { return count_; } - - counting_iterator& operator++() { - ++count_; - return *this; - } - - counting_iterator operator++(int) { - auto it = *this; - ++*this; - return it; - } - - value_type operator*() const { return {}; } -}; - -// A range with the specified output iterator and value type. -template -class output_range { - private: - OutputIt it_; - - public: - using value_type = T; - using iterator = OutputIt; - struct sentinel {}; - - explicit output_range(OutputIt it) : it_(it) {} - OutputIt begin() const { return it_; } - sentinel end() const { return {}; } // Sentinel is not used yet. -}; - -template -inline size_t count_code_points(basic_string_view s) { - return s.size(); -} - -// Counts the number of code points in a UTF-8 string. -inline size_t count_code_points(basic_string_view s) { - const char* data = s.data(); - size_t num_code_points = 0; - for (size_t i = 0, size = s.size(); i != size; ++i) { - if ((data[i] & 0xc0) != 0x80) ++num_code_points; - } - return num_code_points; -} - -template -inline size_t code_point_index(basic_string_view s, size_t n) { - size_t size = s.size(); - return n < size ? n : size; -} - -template -OutputIt copy(InputIt first, InputIt last, OutputIt d_first) { - while (first != last) - *d_first++ = *first++; - return d_first; -} - -template -OutputIt copy_n(InputIt first, Size count, OutputIt result) { - if (count > 0) { - *result++ = *first; - for (Size i = 1; i < count; ++i) - *result++ = *++first; +// A heterogeneous bit_cast used for converting 96-bit long double to uint128_t +// and 128-bit pointers to uint128_fallback. +template sizeof(From))> +inline auto bit_cast(const From& from) -> To { + constexpr auto size = static_cast(sizeof(From) / sizeof(unsigned)); + struct data_t { + unsigned value[static_cast(size)]; + } data = bit_cast(from); + auto result = To(); + if (const_check(is_big_endian())) { + for (int i = 0; i < size; ++i) + result = (result << num_bits()) | data.value[i]; + } else { + for (int i = size - 1; i >= 0; --i) + result = (result << num_bits()) | data.value[i]; } return result; } -template -OutputIt fill_n(OutputIt first, Size count, const T& value) { - for (Size i = 0; i < count; ++i) - *first++ = value; - return first; +FMT_INLINE void assume(bool condition) { + (void)condition; +#if FMT_HAS_BUILTIN(__builtin_assume) && !FMT_ICC_VERSION + __builtin_assume(condition); +#endif } -template -OutputIt copy_str(InputIt begin, InputIt end, OutputIt it) { - return internal::copy(begin, end, it); +// An approximation of iterator_t for pre-C++20 systems. +template +using iterator_t = decltype(std::begin(std::declval())); +template using sentinel_t = decltype(std::end(std::declval())); + +#if FMT_USE_STRING +// A workaround for std::string not having mutable data() until C++17. +template +inline auto get_data(std::basic_string& s) -> Char* { + return &s[0]; +} +#endif +template +inline auto get_data(Container& c) -> typename Container::value_type* { + return c.data(); } -#ifndef FMT_USE_GRISU -# define FMT_USE_GRISU 1 +#if defined(_SECURE_SCL) && _SECURE_SCL +// Make a checked iterator to avoid MSVC warnings. +template using checked_ptr = stdext::checked_array_iterator; +template +constexpr auto make_checked(T* p, size_t size) -> checked_ptr { + return {p, size}; +} +#else +template using checked_ptr = T*; +template constexpr auto make_checked(T* p, size_t) -> T* { + return p; +} #endif -template constexpr bool use_grisu() { - return FMT_USE_GRISU && std::numeric_limits::is_iec559 && - sizeof(T) <= sizeof(double); +// Attempts to reserve space for n extra characters in the output range. +// Returns a pointer to the reserved range or a reference to it. +template ::value)> +#if FMT_CLANG_VERSION >= 307 && !FMT_ICC_VERSION +__attribute__((no_sanitize("undefined"))) +#endif +inline auto +reserve(fmt::back_insert_iterator it, size_t n) + -> checked_ptr { + Container& c = get_container(it); + size_t size = c.size(); + c.resize(size + n); + return make_checked(get_data(c) + size, n); } +template +inline auto reserve(buffer_appender it, size_t n) -> buffer_appender { + buffer& buf = get_container(it); + buf.try_reserve(buf.size() + n); + return it; +} + +template +constexpr auto reserve(Iterator& it, size_t) -> Iterator& { + return it; +} + +template +using reserve_iterator = + remove_reference_t(), 0))>; + +template +constexpr auto to_pointer(OutputIt, size_t) -> T* { + return nullptr; +} +template auto to_pointer(buffer_appender it, size_t n) -> T* { + buffer& buf = get_container(it); + auto size = buf.size(); + if (buf.capacity() < size + n) return nullptr; + buf.try_resize(size + n); + return buf.data() + size; +} + +template ::value)> +inline auto base_iterator(fmt::back_insert_iterator& it, + checked_ptr) + -> fmt::back_insert_iterator { + return it; +} + +template +constexpr auto base_iterator(Iterator, Iterator it) -> Iterator { + return it; +} + +// is spectacularly slow to compile in C++20 so use a simple fill_n +// instead (#1998). +template +FMT_CONSTEXPR auto fill_n(OutputIt out, Size count, const T& value) + -> OutputIt { + for (Size i = 0; i < count; ++i) *out++ = value; + return out; +} +template +FMT_CONSTEXPR20 auto fill_n(T* out, Size count, char value) -> T* { + if (is_constant_evaluated()) { + return fill_n(out, count, value); + } + ::memset(out, value, to_unsigned(count)); + return out + count; +} + +#ifdef __cpp_char8_t +using char8_type = char8_t; +#else +enum char8_type : unsigned char {}; +#endif + +template +FMT_CONSTEXPR FMT_NOINLINE auto copy_str_noinline(InputIt begin, InputIt end, + OutputIt out) -> OutputIt { + return copy_str(begin, end, out); +} + +// A public domain branchless UTF-8 decoder by Christopher Wellons: +// https://github.com/skeeto/branchless-utf8 +/* Decode the next character, c, from s, reporting errors in e. + * + * Since this is a branchless decoder, four bytes will be read from the + * buffer regardless of the actual length of the next character. This + * means the buffer _must_ have at least three bytes of zero padding + * following the end of the data stream. + * + * Errors are reported in e, which will be non-zero if the parsed + * character was somehow invalid: invalid byte sequence, non-canonical + * encoding, or a surrogate half. + * + * The function returns a pointer to the next character. When an error + * occurs, this pointer will be a guess that depends on the particular + * error, but it will always advance at least one byte. + */ +FMT_CONSTEXPR inline auto utf8_decode(const char* s, uint32_t* c, int* e) + -> const char* { + constexpr const int masks[] = {0x00, 0x7f, 0x1f, 0x0f, 0x07}; + constexpr const uint32_t mins[] = {4194304, 0, 128, 2048, 65536}; + constexpr const int shiftc[] = {0, 18, 12, 6, 0}; + constexpr const int shifte[] = {0, 6, 4, 2, 0}; + + int len = code_point_length_impl(*s); + // Compute the pointer to the next character early so that the next + // iteration can start working on the next character. Neither Clang + // nor GCC figure out this reordering on their own. + const char* next = s + len + !len; + + using uchar = unsigned char; + + // Assume a four-byte character and load four bytes. Unused bits are + // shifted out. + *c = uint32_t(uchar(s[0]) & masks[len]) << 18; + *c |= uint32_t(uchar(s[1]) & 0x3f) << 12; + *c |= uint32_t(uchar(s[2]) & 0x3f) << 6; + *c |= uint32_t(uchar(s[3]) & 0x3f) << 0; + *c >>= shiftc[len]; + + // Accumulate the various error conditions. + *e = (*c < mins[len]) << 6; // non-canonical encoding + *e |= ((*c >> 11) == 0x1b) << 7; // surrogate half? + *e |= (*c > 0x10FFFF) << 8; // out of range? + *e |= (uchar(s[1]) & 0xc0) >> 2; + *e |= (uchar(s[2]) & 0xc0) >> 4; + *e |= uchar(s[3]) >> 6; + *e ^= 0x2a; // top two bits of each tail byte correct? + *e >>= shifte[len]; + + return next; +} + +constexpr uint32_t invalid_code_point = ~uint32_t(); + +// Invokes f(cp, sv) for every code point cp in s with sv being the string view +// corresponding to the code point. cp is invalid_code_point on error. +template +FMT_CONSTEXPR void for_each_codepoint(string_view s, F f) { + auto decode = [f](const char* buf_ptr, const char* ptr) { + auto cp = uint32_t(); + auto error = 0; + auto end = utf8_decode(buf_ptr, &cp, &error); + bool result = f(error ? invalid_code_point : cp, + string_view(ptr, error ? 1 : to_unsigned(end - buf_ptr))); + return result ? (error ? buf_ptr + 1 : end) : nullptr; + }; + auto p = s.data(); + const size_t block_size = 4; // utf8_decode always reads blocks of 4 chars. + if (s.size() >= block_size) { + for (auto end = p + s.size() - block_size + 1; p < end;) { + p = decode(p, p); + if (!p) return; + } + } + if (auto num_chars_left = s.data() + s.size() - p) { + char buf[2 * block_size - 1] = {}; + copy_str(p, p + num_chars_left, buf); + const char* buf_ptr = buf; + do { + auto end = decode(buf_ptr, p); + if (!end) return; + p += end - buf_ptr; + buf_ptr = end; + } while (buf_ptr - buf < num_chars_left); + } +} + +template +inline auto compute_width(basic_string_view s) -> size_t { + return s.size(); +} + +// Computes approximate display width of a UTF-8 string. +FMT_CONSTEXPR inline size_t compute_width(string_view s) { + size_t num_code_points = 0; + // It is not a lambda for compatibility with C++14. + struct count_code_points { + size_t* count; + FMT_CONSTEXPR auto operator()(uint32_t cp, string_view) const -> bool { + *count += detail::to_unsigned( + 1 + + (cp >= 0x1100 && + (cp <= 0x115f || // Hangul Jamo init. consonants + cp == 0x2329 || // LEFT-POINTING ANGLE BRACKET + cp == 0x232a || // RIGHT-POINTING ANGLE BRACKET + // CJK ... Yi except IDEOGRAPHIC HALF FILL SPACE: + (cp >= 0x2e80 && cp <= 0xa4cf && cp != 0x303f) || + (cp >= 0xac00 && cp <= 0xd7a3) || // Hangul Syllables + (cp >= 0xf900 && cp <= 0xfaff) || // CJK Compatibility Ideographs + (cp >= 0xfe10 && cp <= 0xfe19) || // Vertical Forms + (cp >= 0xfe30 && cp <= 0xfe6f) || // CJK Compatibility Forms + (cp >= 0xff00 && cp <= 0xff60) || // Fullwidth Forms + (cp >= 0xffe0 && cp <= 0xffe6) || // Fullwidth Forms + (cp >= 0x20000 && cp <= 0x2fffd) || // CJK + (cp >= 0x30000 && cp <= 0x3fffd) || + // Miscellaneous Symbols and Pictographs + Emoticons: + (cp >= 0x1f300 && cp <= 0x1f64f) || + // Supplemental Symbols and Pictographs: + (cp >= 0x1f900 && cp <= 0x1f9ff)))); + return true; + } + }; + for_each_codepoint(s, count_code_points{&num_code_points}); + return num_code_points; +} + +inline auto compute_width(basic_string_view s) -> size_t { + return compute_width( + string_view(reinterpret_cast(s.data()), s.size())); +} + +template +inline auto code_point_index(basic_string_view s, size_t n) -> size_t { + size_t size = s.size(); + return n < size ? n : size; +} + +// Calculates the index of the nth code point in a UTF-8 string. +inline auto code_point_index(string_view s, size_t n) -> size_t { + const char* data = s.data(); + size_t num_code_points = 0; + for (size_t i = 0, size = s.size(); i != size; ++i) { + if ((data[i] & 0xc0) != 0x80 && ++num_code_points > n) return i; + } + return s.size(); +} + +inline auto code_point_index(basic_string_view s, size_t n) + -> size_t { + return code_point_index( + string_view(reinterpret_cast(s.data()), s.size()), n); +} + +#ifndef FMT_USE_FLOAT128 +# ifdef __SIZEOF_FLOAT128__ +# define FMT_USE_FLOAT128 1 +# else +# define FMT_USE_FLOAT128 0 +# endif +#endif +#if FMT_USE_FLOAT128 +using float128 = __float128; +#else +using float128 = void; +#endif +template using is_float128 = std::is_same; + +template +using is_floating_point = + bool_constant::value || is_float128::value>; + +template ::value> +struct is_fast_float : bool_constant::is_iec559 && + sizeof(T) <= sizeof(double)> {}; +template struct is_fast_float : std::false_type {}; + +template +using is_double_double = bool_constant::digits == 106>; + +#ifndef FMT_USE_FULL_CACHE_DRAGONBOX +# define FMT_USE_FULL_CACHE_DRAGONBOX 0 +#endif + template template void buffer::append(const U* begin, const U* end) { - std::size_t new_size = size_ + to_unsigned(end - begin); - reserve(new_size); - ::memcpy(ptr_ + size_, begin, (end - begin) * sizeof(U)); - size_ = new_size; + while (begin != end) { + auto count = to_unsigned(end - begin); + try_reserve(size_ + count); + auto free_cap = capacity_ - size_; + if (free_cap < count) count = free_cap; + ::memcpy(ptr_ + size_, begin, (end - begin) * sizeof(U)); + size_ += count; + begin += count; + } } -} // namespace internal -// A range with an iterator appending to a buffer. +template +struct is_locale : std::false_type {}; template -class buffer_range : public internal::output_range< - fmt::back_insert_iterator>, T> { - public: - using iterator = fmt::back_insert_iterator>; - using internal::output_range::output_range; - buffer_range(internal::buffer& buf) - : internal::output_range(fmt::back_inserter(buf)) {} -}; +struct is_locale> : std::true_type {}; +} // namespace detail + +FMT_MODULE_EXPORT_BEGIN // The number of characters to store in the basic_memory_buffer object itself // to avoid dynamic memory allocation. @@ -444,20 +792,12 @@ enum { inline_buffer_size = 500 }; A dynamically growing memory buffer for trivially copyable/constructible types with the first ``SIZE`` elements stored in the object itself. - You can use one of the following type aliases for common character types: - - +----------------+------------------------------+ - | Type | Definition | - +================+==============================+ - | memory_buffer | basic_memory_buffer | - +----------------+------------------------------+ - | wmemory_buffer | basic_memory_buffer | - +----------------+------------------------------+ + You can use the ``memory_buffer`` type alias for ``char`` instead. **Example**:: - fmt::memory_buffer out; - format_to(out, "The answer is {}.", 42); + auto out = fmt::memory_buffer(); + format_to(std::back_inserter(out), "The answer is {}.", 42); This will append the following output to the ``out`` object: @@ -468,46 +808,52 @@ enum { inline_buffer_size = 500 }; The output can be converted to an ``std::string`` with ``to_string(out)``. \endrst */ -template > -class basic_memory_buffer : private Allocator, public internal::buffer { +class basic_memory_buffer final : public detail::buffer { private: T store_[SIZE]; + // Don't inherit from Allocator avoid generating type_info for it. + Allocator alloc_; + // Deallocate memory allocated by the buffer. - void deallocate() { + FMT_CONSTEXPR20 void deallocate() { T* data = this->data(); - if (data != store_) Allocator::deallocate(data, this->capacity()); + if (data != store_) alloc_.deallocate(data, this->capacity()); } protected: - void grow(std::size_t size) FMT_OVERRIDE; + FMT_CONSTEXPR20 void grow(size_t size) override; public: using value_type = T; using const_reference = const T&; - explicit basic_memory_buffer(const Allocator& alloc = Allocator()) - : Allocator(alloc) { + FMT_CONSTEXPR20 explicit basic_memory_buffer( + const Allocator& alloc = Allocator()) + : alloc_(alloc) { this->set(store_, SIZE); + if (detail::is_constant_evaluated()) detail::fill_n(store_, SIZE, T()); } - ~basic_memory_buffer() FMT_OVERRIDE { deallocate(); } + FMT_CONSTEXPR20 ~basic_memory_buffer() { deallocate(); } private: // Move data from other to this buffer. - void move(basic_memory_buffer& other) { - Allocator &this_alloc = *this, &other_alloc = other; - this_alloc = ::MoveTemp(other_alloc); + FMT_CONSTEXPR20 void move(basic_memory_buffer& other) { + alloc_ = std::move(other.alloc_); T* data = other.data(); - std::size_t size = other.size(), capacity = other.capacity(); + size_t size = other.size(), capacity = other.capacity(); if (data == other.store_) { this->set(store_, capacity); - memcpy(other.store_, store_, size * sizeof(T)); + detail::copy_str(other.store_, other.store_ + size, + detail::make_checked(store_, capacity)); } else { this->set(data, capacity); // Set pointer to the inline array so that delete is not called // when deallocating. other.set(other.store_, 0); + other.clear(); } this->resize(size); } @@ -519,14 +865,16 @@ class basic_memory_buffer : private Allocator, public internal::buffer { of the other object to it. \endrst */ - basic_memory_buffer(basic_memory_buffer&& other) FMT_NOEXCEPT { move(other); } + FMT_CONSTEXPR20 basic_memory_buffer(basic_memory_buffer&& other) noexcept { + move(other); + } /** \rst Moves the content of the other ``basic_memory_buffer`` object to this one. \endrst */ - basic_memory_buffer& operator=(basic_memory_buffer&& other) FMT_NOEXCEPT { + auto operator=(basic_memory_buffer&& other) noexcept -> basic_memory_buffer& { FMT_ASSERT(this != &other, ""); deallocate(); move(other); @@ -534,84 +882,142 @@ class basic_memory_buffer : private Allocator, public internal::buffer { } // Returns a copy of the allocator associated with this buffer. - Allocator get_allocator() const { return *this; } + auto get_allocator() const -> Allocator { return alloc_; } + + /** + Resizes the buffer to contain *count* elements. If T is a POD type new + elements may not be initialized. + */ + FMT_CONSTEXPR20 void resize(size_t count) { this->try_resize(count); } + + /** Increases the buffer capacity to *new_capacity*. */ + void reserve(size_t new_capacity) { this->try_reserve(new_capacity); } + + // Directly append data into the buffer + using detail::buffer::append; + template + void append(const ContiguousRange& range) { + append(range.data(), range.data() + range.size()); + } }; -template -void basic_memory_buffer::grow(std::size_t size) { -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - if (size > 1000) throw std::runtime_error("fuzz mode - won't grow that much"); -#endif - std::size_t old_capacity = this->capacity(); - std::size_t new_capacity = old_capacity + old_capacity / 2; - if (size > new_capacity) new_capacity = size; +template +FMT_CONSTEXPR20 void basic_memory_buffer::grow( + size_t size) { + detail::abort_fuzzing_if(size > 5000); + size_t old_capacity = this->capacity(); + size_t new_capacity = old_capacity + old_capacity / 2; + if (size > new_capacity) + new_capacity = size; T* old_data = this->data(); - T *new_data = internal::allocate(*this, new_capacity); + T* new_data = alloc_.allocate(new_capacity); // The following code doesn't throw, so the raw pointer above doesn't leak. - memcpy(new_data, old_data, this->size() * sizeof(T)); + ::memcpy(new_data, old_data, this->size() * sizeof(T)); this->set(new_data, new_capacity); // deallocate must not throw according to the standard, but even if it does, // the buffer already uses the new storage and will deallocate it in // destructor. - if (old_data != store_) Allocator::deallocate(old_data, old_capacity); + if (old_data != store_) alloc_.deallocate(old_data, old_capacity); } using memory_buffer = basic_memory_buffer; -using wmemory_buffer = basic_memory_buffer; -namespace internal { +template +struct is_contiguous> : std::true_type { +}; + +namespace detail_exported { +#if FMT_USE_NONTYPE_TEMPLATE_ARGS +template struct fixed_string { + constexpr fixed_string(const Char (&str)[N]) { + detail::copy_str(static_cast(str), + str + N, data); + } + Char data[N] = {}; +}; +#endif + +#if FMT_USE_COMPILE_TIME +// Converts a compile-time string to basic_string_view. +template +constexpr auto compile_string_to_view(const Char (&s)[N]) + -> basic_string_view { + // Remove trailing NUL character if needed. Won't be present if this is used + // with a raw character array (i.e. not defined as a string). + return {s, N - (std::char_traits::to_int_type(s[N - 1]) == 0 ? 1 : 0)}; +} +template +constexpr auto compile_string_to_view(detail::std_string_view s) + -> basic_string_view { + return {s.data(), s.size()}; +} +#endif +} // namespace detail_exported + +FMT_BEGIN_DETAIL_NAMESPACE + +template struct is_integral : std::is_integral {}; +template <> struct is_integral : std::true_type {}; +template <> struct is_integral : std::true_type {}; + +template +using is_signed = + std::integral_constant::is_signed || + std::is_same::value>; // Returns true if value is negative, false otherwise. // Same as `value < 0` but doesn't produce warnings if T is an unsigned type. -template ::is_signed)> -FMT_CONSTEXPR bool is_negative(T value) { +template ::value)> +constexpr auto is_negative(T value) -> bool { return value < 0; } -template ::is_signed)> -FMT_CONSTEXPR bool is_negative(T) { +template ::value)> +constexpr auto is_negative(T) -> bool { return false; } -template ::value)> -FMT_CONSTEXPR bool is_supported_floating_point(T) { - return (std::is_same::value && FMT_USE_FLOAT) || - (std::is_same::value && FMT_USE_DOUBLE) || - (std::is_same::value && FMT_USE_LONG_DOUBLE); +template +FMT_CONSTEXPR auto is_supported_floating_point(T) -> bool { + if (std::is_same()) return FMT_USE_FLOAT; + if (std::is_same()) return FMT_USE_DOUBLE; + if (std::is_same()) return FMT_USE_LONG_DOUBLE; + return true; } // Smallest of uint32_t, uint64_t, uint128_t that is large enough to -// represent all values of T. +// represent all values of an integral type T. template -using uint32_or_64_or_128_t = conditional_t< - std::numeric_limits::digits <= 32, uint32_t, - conditional_t::digits <= 64, uint64_t, uint128_t>>; +using uint32_or_64_or_128_t = + conditional_t() <= 32 && !FMT_REDUCE_INT_INSTANTIATIONS, + uint32_t, + conditional_t() <= 64, uint64_t, uint128_t>>; +template +using uint64_or_128_t = conditional_t() <= 64, uint64_t, uint128_t>; -// Static data is placed in this class template for the header-only config. -struct FMT_API basic_data { - static const uint64_t powers_of_10_64[]; - static const uint32_t zero_or_powers_of_10_32[]; - static const uint64_t zero_or_powers_of_10_64[]; - static const uint64_t pow10_significands[]; - static const int16_t pow10_exponents[]; - static const char digits[]; - static const char hex_digits[]; - static const char signs[]; -}; +#define FMT_POWERS_OF_10(factor) \ + factor * 10, (factor)*100, (factor)*1000, (factor)*10000, (factor)*100000, \ + (factor)*1000000, (factor)*10000000, (factor)*100000000, \ + (factor)*1000000000 -typedef basic_data data; - -#ifdef FMT_BUILTIN_CLZLL -// Returns the number of decimal digits in n. Leading zeros are not counted -// except for n == 0 in which case count_digits returns 1. -inline int count_digits(uint64_t n) { - // Based on http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10 - // and the benchmark https://github.com/localvoid/cxx-benchmark-count-digits. - int t = (64 - FMT_BUILTIN_CLZLL(n | 1)) * 1233 >> 12; - return t - (n < data::zero_or_powers_of_10_64[t]) + 1; +// Converts value in the range [0, 100) to a string. +constexpr const char* digits2(size_t value) { + // GCC generates slightly better code when value is pointer-size. + return &"0001020304050607080910111213141516171819" + "2021222324252627282930313233343536373839" + "4041424344454647484950515253545556575859" + "6061626364656667686970717273747576777879" + "8081828384858687888990919293949596979899"[value * 2]; } -#else -// Fallback version of count_digits used when __builtin_clz is not available. -inline int count_digits(uint64_t n) { + +// Sign is a template parameter to workaround a bug in gcc 4.8. +template constexpr Char sign(Sign s) { +#if !FMT_GCC_VERSION || FMT_GCC_VERSION >= 604 + static_assert(std::is_same::value, ""); +#endif + return static_cast("\0-+ "[s]); +} + +template FMT_CONSTEXPR auto count_digits_fallback(T n) -> int { int count = 1; for (;;) { // Integer division is slow so do it for a group of four digits instead @@ -625,282 +1031,320 @@ inline int count_digits(uint64_t n) { count += 4; } } -#endif - #if FMT_USE_INT128 -inline int count_digits(uint128_t n) { - int count = 1; - for (;;) { - // Integer division is slow so do it for a group of four digits instead - // of for every digit. The idea comes from the talk by Alexandrescu - // "Three Optimization Tips for C++". See speed-test for a comparison. - if (n < 10) return count; - if (n < 100) return count + 1; - if (n < 1000) return count + 2; - if (n < 10000) return count + 3; - n /= 10000U; - count += 4; - } +FMT_CONSTEXPR inline auto count_digits(uint128_opt n) -> int { + return count_digits_fallback(n); } #endif +#ifdef FMT_BUILTIN_CLZLL +// It is a separate function rather than a part of count_digits to workaround +// the lack of static constexpr in constexpr functions. +inline auto do_count_digits(uint64_t n) -> int { + // This has comparable performance to the version by Kendall Willets + // (https://github.com/fmtlib/format-benchmark/blob/master/digits10) + // but uses smaller tables. + // Maps bsr(n) to ceil(log10(pow(2, bsr(n) + 1) - 1)). + static constexpr uint8_t bsr2log10[] = { + 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, + 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, + 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, + 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20}; + auto t = bsr2log10[FMT_BUILTIN_CLZLL(n | 1) ^ 63]; + static constexpr const uint64_t zero_or_powers_of_10[] = { + 0, 0, FMT_POWERS_OF_10(1U), FMT_POWERS_OF_10(1000000000ULL), + 10000000000000000000ULL}; + return t - (n < zero_or_powers_of_10[t]); +} +#endif + +// Returns the number of decimal digits in n. Leading zeros are not counted +// except for n == 0 in which case count_digits returns 1. +FMT_CONSTEXPR20 inline auto count_digits(uint64_t n) -> int { +#ifdef FMT_BUILTIN_CLZLL + if (!is_constant_evaluated()) { + return do_count_digits(n); + } +#endif + return count_digits_fallback(n); +} + // Counts the number of digits in n. BITS = log2(radix). -template inline int count_digits(UInt n) { - int num_digits = 0; - do { - ++num_digits; - } while ((n >>= BITS) != 0); - return num_digits; -} - -template <> int count_digits<4>(internal::fallback_uintptr n); - -#if FMT_GCC_VERSION || FMT_CLANG_VERSION -# define FMT_ALWAYS_INLINE inline __attribute__((always_inline)) -#else -# define FMT_ALWAYS_INLINE +template +FMT_CONSTEXPR auto count_digits(UInt n) -> int { +#ifdef FMT_BUILTIN_CLZ + if (!is_constant_evaluated() && num_bits() == 32) + return (FMT_BUILTIN_CLZ(static_cast(n) | 1) ^ 31) / BITS + 1; #endif + // Lambda avoids unreachable code warnings from NVHPC. + return [](UInt m) { + int num_digits = 0; + do { + ++num_digits; + } while ((m >>= BITS) != 0); + return num_digits; + }(n); +} #ifdef FMT_BUILTIN_CLZ +// It is a separate function rather than a part of count_digits to workaround +// the lack of static constexpr in constexpr functions. +FMT_INLINE auto do_count_digits(uint32_t n) -> int { +// An optimization by Kendall Willets from https://bit.ly/3uOIQrB. +// This increments the upper 32 bits (log10(T) - 1) when >= T is added. +# define FMT_INC(T) (((sizeof(# T) - 1ull) << 32) - T) + static constexpr uint64_t table[] = { + FMT_INC(0), FMT_INC(0), FMT_INC(0), // 8 + FMT_INC(10), FMT_INC(10), FMT_INC(10), // 64 + FMT_INC(100), FMT_INC(100), FMT_INC(100), // 512 + FMT_INC(1000), FMT_INC(1000), FMT_INC(1000), // 4096 + FMT_INC(10000), FMT_INC(10000), FMT_INC(10000), // 32k + FMT_INC(100000), FMT_INC(100000), FMT_INC(100000), // 256k + FMT_INC(1000000), FMT_INC(1000000), FMT_INC(1000000), // 2048k + FMT_INC(10000000), FMT_INC(10000000), FMT_INC(10000000), // 16M + FMT_INC(100000000), FMT_INC(100000000), FMT_INC(100000000), // 128M + FMT_INC(1000000000), FMT_INC(1000000000), FMT_INC(1000000000), // 1024M + FMT_INC(1000000000), FMT_INC(1000000000) // 4B + }; + auto inc = table[FMT_BUILTIN_CLZ(n | 1) ^ 31]; + return static_cast((n + inc) >> 32); +} +#endif + // Optional version of count_digits for better performance on 32-bit platforms. -inline int count_digits(uint32_t n) { - int t = (32 - FMT_BUILTIN_CLZ(n | 1)) * 1233 >> 12; - return t - (n < data::zero_or_powers_of_10_32[t]) + 1; -} +FMT_CONSTEXPR20 inline auto count_digits(uint32_t n) -> int { +#ifdef FMT_BUILTIN_CLZ + if (!is_constant_evaluated()) { + return do_count_digits(n); + } #endif + return count_digits_fallback(n); +} +template constexpr auto digits10() noexcept -> int { + return std::numeric_limits::digits10; +} +template <> constexpr auto digits10() noexcept -> int { return 38; } +template <> constexpr auto digits10() noexcept -> int { return 38; } + +template struct thousands_sep_result { #if FMT_USE_LOCALE_GROUPING -template FMT_API std::string grouping_impl(locale_ref loc); -template inline std::string grouping(locale_ref loc) { - return grouping_impl(loc); -} -template <> inline std::string grouping(locale_ref loc) { - return grouping_impl(loc); -} + std::string grouping; #endif + Char thousands_sep; +}; -template FMT_API Char thousands_sep_impl(locale_ref loc); -template inline Char thousands_sep(locale_ref loc) { - return Char(thousands_sep_impl(loc)); +template +FMT_API auto thousands_sep_impl(locale_ref loc) -> thousands_sep_result; +template +inline auto thousands_sep(locale_ref loc) -> thousands_sep_result { + auto result = thousands_sep_impl(loc); +#if FMT_USE_LOCALE_GROUPING + return {result.grouping, Char(result.thousands_sep)}; +#else + return {Char(result.thousands_sep)}; +#endif } -template <> inline wchar_t thousands_sep(locale_ref loc) { +template <> +inline auto thousands_sep(locale_ref loc) -> thousands_sep_result { return thousands_sep_impl(loc); } -template FMT_API Char decimal_point_impl(locale_ref loc); -template inline Char decimal_point(locale_ref loc) { +template +FMT_API auto decimal_point_impl(locale_ref loc) -> Char; +template inline auto decimal_point(locale_ref loc) -> Char { return Char(decimal_point_impl(loc)); } -template <> inline wchar_t decimal_point(locale_ref loc) { +template <> inline auto decimal_point(locale_ref loc) -> wchar_t { return decimal_point_impl(loc); } -// Formats a decimal unsigned integer value writing into buffer. -// add_thousands_sep is called after writing each char to add a thousands -// separator if necessary. -template -inline Char* format_decimal(Char* buffer, UInt value, int num_digits, - F add_thousands_sep) { - FMT_ASSERT(num_digits >= 0, "invalid digit count"); - buffer += num_digits; - Char* end = buffer; +// Compares two characters for equality. +template auto equal2(const Char* lhs, const char* rhs) -> bool { + return lhs[0] == Char(rhs[0]) && lhs[1] == Char(rhs[1]); +} +inline auto equal2(const char* lhs, const char* rhs) -> bool { + return memcmp(lhs, rhs, 2) == 0; +} + +// Copies two characters from src to dst. +template +FMT_CONSTEXPR20 FMT_INLINE void copy2(Char* dst, const char* src) { + if (!is_constant_evaluated() && sizeof(Char) == sizeof(char)) { + memcpy(dst, src, 2); + return; + } + *dst++ = static_cast(*src++); + *dst = static_cast(*src); +} + +template struct format_decimal_result { + Iterator begin; + Iterator end; +}; + +// Formats a decimal unsigned integer value writing into out pointing to a +// buffer of specified size. The caller must ensure that the buffer is large +// enough. +template +FMT_CONSTEXPR20 auto format_decimal(Char* out, UInt value, int size) + -> format_decimal_result { + FMT_ASSERT(size >= count_digits(value), "invalid digit count"); + out += size; + Char* end = out; while (value >= 100) { // Integer division is slow so do it for a group of two digits instead // of for every digit. The idea comes from the talk by Alexandrescu // "Three Optimization Tips for C++". See speed-test for a comparison. - auto index = static_cast((value % 100) * 2); + out -= 2; + copy2(out, digits2(static_cast(value % 100))); value /= 100; - *--buffer = static_cast(data::digits[index + 1]); - add_thousands_sep(buffer); - *--buffer = static_cast(data::digits[index]); - add_thousands_sep(buffer); } if (value < 10) { - *--buffer = static_cast('0' + value); - return end; + *--out = static_cast('0' + value); + return {out, end}; } - auto index = static_cast(value * 2); - *--buffer = static_cast(data::digits[index + 1]); - add_thousands_sep(buffer); - *--buffer = static_cast(data::digits[index]); - return end; + out -= 2; + copy2(out, digits2(static_cast(value))); + return {out, end}; } -template constexpr int digits10() FMT_NOEXCEPT { - return std::numeric_limits::digits10; -} -template <> constexpr int digits10() FMT_NOEXCEPT { return 38; } -template <> constexpr int digits10() FMT_NOEXCEPT { return 38; } - -template -inline Iterator format_decimal(Iterator out, UInt value, int num_digits, - F add_thousands_sep) { - FMT_ASSERT(num_digits >= 0, "invalid digit count"); - // Buffer should be large enough to hold all digits (<= digits10 + 1). - enum { max_size = digits10() + 1 }; - Char buffer[2 * max_size]; - auto end = format_decimal(buffer, value, num_digits, add_thousands_sep); - return internal::copy_str(buffer, end, out); -} - -template -inline It format_decimal(It out, UInt value, int num_digits) { - return format_decimal(out, value, num_digits, [](Char*) {}); +template >::value)> +FMT_CONSTEXPR inline auto format_decimal(Iterator out, UInt value, int size) + -> format_decimal_result { + // Buffer is large enough to hold all digits (digits10 + 1). + Char buffer[digits10() + 1]; + auto end = format_decimal(buffer, value, size).end; + return {out, detail::copy_str_noinline(buffer, end, out)}; } template -inline Char* format_uint(Char* buffer, UInt value, int num_digits, - bool upper = false) { +FMT_CONSTEXPR auto format_uint(Char* buffer, UInt value, int num_digits, + bool upper = false) -> Char* { buffer += num_digits; Char* end = buffer; do { - const char* digits = upper ? "0123456789ABCDEF" : data::hex_digits; - unsigned digit = (value & ((1 << BASE_BITS) - 1)); + const char* digits = upper ? "0123456789ABCDEF" : "0123456789abcdef"; + unsigned digit = static_cast(value & ((1 << BASE_BITS) - 1)); *--buffer = static_cast(BASE_BITS < 4 ? static_cast('0' + digit) : digits[digit]); } while ((value >>= BASE_BITS) != 0); return end; } -template -Char* format_uint(Char* buffer, internal::fallback_uintptr n, int num_digits, - bool = false) { - auto char_digits = std::numeric_limits::digits / 4; - int start = (num_digits + char_digits - 1) / char_digits - 1; - if (int start_digits = num_digits % char_digits) { - unsigned value = n.value[start--]; - buffer = format_uint(buffer, value, start_digits); - } - for (; start >= 0; --start) { - unsigned value = n.value[start]; - buffer += char_digits; - auto p = buffer; - for (int i = 0; i < char_digits; ++i) { - unsigned digit = (value & ((1 << BASE_BITS) - 1)); - *--p = static_cast(data::hex_digits[digit]); - value >>= BASE_BITS; - } - } - return buffer; -} - template -inline It format_uint(It out, UInt value, int num_digits, bool upper = false) { +inline auto format_uint(It out, UInt value, int num_digits, bool upper = false) + -> It { + if (auto ptr = to_pointer(out, to_unsigned(num_digits))) { + format_uint(ptr, value, num_digits, upper); + return out; + } // Buffer should be large enough to hold all digits (digits / BASE_BITS + 1). char buffer[num_bits() / BASE_BITS + 1]; format_uint(buffer, value, num_digits, upper); - return internal::copy_str(buffer, buffer + num_digits, out); + return detail::copy_str_noinline(buffer, buffer + num_digits, out); } // A converter from UTF-8 to UTF-16. class utf8_to_utf16 { private: - wmemory_buffer buffer_; + basic_memory_buffer buffer_; public: FMT_API explicit utf8_to_utf16(string_view s); - operator wstring_view() const { return {&buffer_[0], size()}; } - size_t size() const { return buffer_.size() - 1; } - const wchar_t* c_str() const { return &buffer_[0]; } + operator basic_string_view() const { return {&buffer_[0], size()}; } + auto size() const -> size_t { return buffer_.size() - 1; } + auto c_str() const -> const wchar_t* { return &buffer_[0]; } #if FMT_USE_STRING - std::wstring str() const { return {&buffer_[0], size()}; } + auto str() const -> std::wstring { return {&buffer_[0], size()}; } #endif }; -template struct null {}; +namespace dragonbox { -// Workaround an array initialization issue in gcc 4.8. -template struct fill_t { - private: - enum { max_size = 4 }; - Char data_[max_size]; - unsigned char size_; +// Type-specific information that Dragonbox uses. +template struct float_info; - public: - FMT_CONSTEXPR void operator=(basic_string_view s) { - auto size = s.size(); - if (size > max_size) { - FMT_THROW_FORMAT_ERROR("invalid fill"); - return; - } - for (size_t i = 0; i < size; ++i) data_[i] = s[i]; - size_ = static_cast(size); - } - - size_t size() const { return size_; } - const Char* data() const { return data_; } - - FMT_CONSTEXPR Char& operator[](size_t index) { return data_[index]; } - FMT_CONSTEXPR const Char& operator[](size_t index) const { - return data_[index]; - } - - static FMT_CONSTEXPR fill_t make() { - auto fill = fill_t(); - fill[0] = Char(' '); - fill.size_ = 1; - return fill; - } +template <> struct float_info { + using carrier_uint = uint32_t; + static const int exponent_bits = 8; + static const int kappa = 1; + static const int big_divisor = 100; + static const int small_divisor = 10; + static const int min_k = -31; + static const int max_k = 46; + static const int shorter_interval_tie_lower_threshold = -35; + static const int shorter_interval_tie_upper_threshold = -35; }; -} // namespace internal -// We cannot use enum classes as bit fields because of a gcc bug -// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61414. -namespace align { -enum type { none, left, right, center, numeric }; +template <> struct float_info { + using carrier_uint = uint64_t; + static const int exponent_bits = 11; + static const int kappa = 2; + static const int big_divisor = 1000; + static const int small_divisor = 100; + static const int min_k = -292; + static const int max_k = 326; + static const int shorter_interval_tie_lower_threshold = -77; + static const int shorter_interval_tie_upper_threshold = -77; +}; + +// An 80- or 128-bit floating point number. +template +struct float_info::digits == 64 || + std::numeric_limits::digits == 113 || + is_float128::value>> { + using carrier_uint = detail::uint128_t; + static const int exponent_bits = 15; +}; + +// A double-double floating point number. +template +struct float_info::value>> { + using carrier_uint = detail::uint128_t; +}; + +template struct decimal_fp { + using significand_type = typename float_info::carrier_uint; + significand_type significand; + int exponent; +}; + +template FMT_API auto to_decimal(T x) noexcept -> decimal_fp; +} // namespace dragonbox + +// Returns true iff Float has the implicit bit which is not stored. +template constexpr bool has_implicit_bit() { + // An 80-bit FP number has a 64-bit significand an no implicit bit. + return std::numeric_limits::digits != 64; } -using align_t = align::type; -namespace sign { -enum type { none, minus, plus, space }; +// Returns the number of significand bits stored in Float. The implicit bit is +// not counted since it is not stored. +template constexpr int num_significand_bits() { + // std::numeric_limits may not support __float128. + return is_float128() ? 112 + : (std::numeric_limits::digits - + (has_implicit_bit() ? 1 : 0)); } -using sign_t = sign::type; -// Format specifiers for built-in and string types. -template struct basic_format_specs { - int width; - int precision; - char type; - align_t align : 4; - sign_t sign : 3; - bool alt : 1; // Alternate form ('#'). - internal::fill_t fill; - - constexpr basic_format_specs() - : width(0), - precision(-1), - type(0), - align(align::none), - sign(sign::none), - alt(false), - fill(internal::fill_t::make()) {} -}; - -using format_specs = basic_format_specs; - -namespace internal { - -// A floating-point presentation format. -enum class float_format : unsigned char { - general, // General: exponent notation or fixed point based on magnitude. - exp, // Exponent notation with the default precision of 6, e.g. 1.2e-3. - fixed, // Fixed point with the default precision of 6, e.g. 0.0012. - hex -}; - -struct float_specs { - int precision; - float_format format : 8; - sign_t sign : 8; - bool upper : 1; - bool locale : 1; - bool binary32 : 1; - bool use_grisu : 1; - bool showpoint : 1; -}; +template +constexpr auto exponent_mask() -> + typename dragonbox::float_info::carrier_uint { + using uint = typename dragonbox::float_info::carrier_uint; + return ((uint(1) << dragonbox::float_info::exponent_bits) - 1) + << num_significand_bits(); +} +template constexpr auto exponent_bias() -> int { + // std::numeric_limits may not support __float128. + return is_float128() ? 16383 + : std::numeric_limits::max_exponent - 1; +} // Writes the exponent exp in the form "[+-]d{2,3}" to buffer. -template It write_exponent(int exp, It it) { +template +FMT_CONSTEXPR auto write_exponent(int exp, It it) -> It { FMT_ASSERT(-10000 < exp && exp < 10000, "exponent out of range"); if (exp < 0) { *it++ = static_cast('-'); @@ -909,934 +1353,1569 @@ template It write_exponent(int exp, It it) { *it++ = static_cast('+'); } if (exp >= 100) { - const char* top = data::digits + (exp / 100) * 2; + const char* top = digits2(to_unsigned(exp / 100)); if (exp >= 1000) *it++ = static_cast(top[0]); *it++ = static_cast(top[1]); exp %= 100; } - const char* d = data::digits + exp * 2; + const char* d = digits2(to_unsigned(exp)); *it++ = static_cast(d[0]); *it++ = static_cast(d[1]); return it; } -template class float_writer { - private: - // The number is given as v = digits_ * pow(10, exp_). - const char* digits_; - int num_digits_; - int exp_; - size_t size_; - float_specs specs_; - Char decimal_point_; +// A floating-point number f * pow(2, e) where F is an unsigned type. +template struct basic_fp { + F f; + int e; - template It prettify(It it) const { - // pow(10, full_exp - 1) <= v <= pow(10, full_exp). - int full_exp = num_digits_ + exp_; - if (specs_.format == float_format::exp) { - // Insert a decimal point after the first digit and add an exponent. - *it++ = static_cast(*digits_); - int num_zeros = specs_.precision - num_digits_; - if (num_digits_ > 1 || specs_.showpoint) *it++ = decimal_point_; - it = copy_str(digits_ + 1, digits_ + num_digits_, it); - if (num_zeros > 0 && specs_.showpoint) - it = internal::fill_n(it, num_zeros, static_cast('0')); - *it++ = static_cast(specs_.upper ? 'E' : 'e'); - return write_exponent(full_exp - 1, it); - } - if (num_digits_ <= full_exp) { - // 1234e7 -> 12340000000[.0+] - it = copy_str(digits_, digits_ + num_digits_, it); - it = internal::fill_n(it, full_exp - num_digits_, static_cast('0')); - if (specs_.showpoint || specs_.precision < 0) { - *it++ = decimal_point_; - int num_zeros = specs_.precision - full_exp; - if (num_zeros <= 0) { - if (specs_.format != float_format::fixed) - *it++ = static_cast('0'); - return it; - } -#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - if (num_zeros > 1000) - throw std::runtime_error("fuzz mode - avoiding excessive cpu use"); + static constexpr const int num_significand_bits = + static_cast(sizeof(F) * num_bits()); + + constexpr basic_fp() : f(0), e(0) {} + constexpr basic_fp(uint64_t f_val, int e_val) : f(f_val), e(e_val) {} + + // Constructs fp from an IEEE754 floating-point number. + template FMT_CONSTEXPR basic_fp(Float n) { assign(n); } + + // Assigns n to this and return true iff predecessor is closer than successor. + template ::value)> + FMT_CONSTEXPR auto assign(Float n) -> bool { + static_assert(std::numeric_limits::digits <= 113, "unsupported FP"); + // Assume Float is in the format [sign][exponent][significand]. + using carrier_uint = typename dragonbox::float_info::carrier_uint; + const auto num_float_significand_bits = + detail::num_significand_bits(); + const auto implicit_bit = carrier_uint(1) << num_float_significand_bits; + const auto significand_mask = implicit_bit - 1; + auto u = bit_cast(n); + f = static_cast(u & significand_mask); + auto biased_e = static_cast((u & exponent_mask()) >> + num_float_significand_bits); + // The predecessor is closer if n is a normalized power of 2 (f == 0) + // other than the smallest normalized number (biased_e > 1). + auto is_predecessor_closer = f == 0 && biased_e > 1; + if (biased_e == 0) + biased_e = 1; // Subnormals use biased exponent 1 (min exponent). + else if (has_implicit_bit()) + f += static_cast(implicit_bit); + e = biased_e - exponent_bias() - num_float_significand_bits; + if (!has_implicit_bit()) ++e; + return is_predecessor_closer; + } + + template ::value)> + FMT_CONSTEXPR auto assign(Float n) -> bool { + static_assert(std::numeric_limits::is_iec559, "unsupported FP"); + return assign(static_cast(n)); + } +}; + +using fp = basic_fp; + +// Normalizes the value converted from double and multiplied by (1 << SHIFT). +template +FMT_CONSTEXPR basic_fp normalize(basic_fp value) { + // Handle subnormals. + const auto implicit_bit = F(1) << num_significand_bits(); + const auto shifted_implicit_bit = implicit_bit << SHIFT; + while ((value.f & shifted_implicit_bit) == 0) { + value.f <<= 1; + --value.e; + } + // Subtract 1 to account for hidden bit. + const auto offset = basic_fp::num_significand_bits - + num_significand_bits() - SHIFT - 1; + value.f <<= offset; + value.e -= offset; + return value; +} + +// Computes lhs * rhs / pow(2, 64) rounded to nearest with half-up tie breaking. +FMT_CONSTEXPR inline uint64_t multiply(uint64_t lhs, uint64_t rhs) { +#if FMT_USE_INT128 + auto product = static_cast<__uint128_t>(lhs) * rhs; + auto f = static_cast(product >> 64); + return (static_cast(product) & (1ULL << 63)) != 0 ? f + 1 : f; +#else + // Multiply 32-bit parts of significands. + uint64_t mask = (1ULL << 32) - 1; + uint64_t a = lhs >> 32, b = lhs & mask; + uint64_t c = rhs >> 32, d = rhs & mask; + uint64_t ac = a * c, bc = b * c, ad = a * d, bd = b * d; + // Compute mid 64-bit of result and round. + uint64_t mid = (bd >> 32) + (ad & mask) + (bc & mask) + (1U << 31); + return ac + (ad >> 32) + (bc >> 32) + (mid >> 32); #endif - it = internal::fill_n(it, num_zeros, static_cast('0')); - } - } else if (full_exp > 0) { - // 1234e-2 -> 12.34[0+] - it = copy_str(digits_, digits_ + full_exp, it); - if (!specs_.showpoint) { - // Remove trailing zeros. - int num_digits = num_digits_; - while (num_digits > full_exp && digits_[num_digits - 1] == '0') - --num_digits; - if (num_digits != full_exp) *it++ = decimal_point_; - return copy_str(digits_ + full_exp, digits_ + num_digits, it); - } - *it++ = decimal_point_; - it = copy_str(digits_ + full_exp, digits_ + num_digits_, it); - if (specs_.precision > num_digits_) { - // Add trailing zeros. - int num_zeros = specs_.precision - num_digits_; - it = internal::fill_n(it, num_zeros, static_cast('0')); - } - } else { - // 1234e-6 -> 0.001234 - *it++ = static_cast('0'); - int num_zeros = -full_exp; - int num_digits = num_digits_; - if (num_digits == 0 && specs_.precision >= 0 && - specs_.precision < num_zeros) { - num_zeros = specs_.precision; - } - // Remove trailing zeros. - if (!specs_.showpoint) - while (num_digits > 0 && digits_[num_digits - 1] == '0') --num_digits; - if (num_zeros != 0 || num_digits != 0 || specs_.showpoint) { - *it++ = decimal_point_; - it = internal::fill_n(it, num_zeros, static_cast('0')); - it = copy_str(digits_, digits_ + num_digits, it); - } - } - return it; - } +} - public: - float_writer(const char* digits, int num_digits, int exp, float_specs specs, - Char decimal_point) - : digits_(digits), - num_digits_(num_digits), - exp_(exp), - specs_(specs), - decimal_point_(decimal_point) { - int full_exp = num_digits + exp - 1; - int precision = specs.precision > 0 ? specs.precision : 16; - if (specs_.format == float_format::general && - !(full_exp >= -4 && full_exp < precision)) { - specs_.format = float_format::exp; - } - size_ = prettify(counting_iterator()).count(); - size_ += specs.sign ? 1 : 0; - } +FMT_CONSTEXPR inline fp operator*(fp x, fp y) { + return {multiply(x.f, y.f), x.e + y.e + 64}; +} - size_t size() const { return size_; } - size_t width() const { return size(); } +template struct basic_data { + // Normalized 64-bit significands of pow(10, k), for k = -348, -340, ..., 340. + // These are generated by support/compute-powers.py. + static constexpr uint64_t pow10_significands[87] = { + 0xfa8fd5a0081c0288, 0xbaaee17fa23ebf76, 0x8b16fb203055ac76, + 0xcf42894a5dce35ea, 0x9a6bb0aa55653b2d, 0xe61acf033d1a45df, + 0xab70fe17c79ac6ca, 0xff77b1fcbebcdc4f, 0xbe5691ef416bd60c, + 0x8dd01fad907ffc3c, 0xd3515c2831559a83, 0x9d71ac8fada6c9b5, + 0xea9c227723ee8bcb, 0xaecc49914078536d, 0x823c12795db6ce57, + 0xc21094364dfb5637, 0x9096ea6f3848984f, 0xd77485cb25823ac7, + 0xa086cfcd97bf97f4, 0xef340a98172aace5, 0xb23867fb2a35b28e, + 0x84c8d4dfd2c63f3b, 0xc5dd44271ad3cdba, 0x936b9fcebb25c996, + 0xdbac6c247d62a584, 0xa3ab66580d5fdaf6, 0xf3e2f893dec3f126, + 0xb5b5ada8aaff80b8, 0x87625f056c7c4a8b, 0xc9bcff6034c13053, + 0x964e858c91ba2655, 0xdff9772470297ebd, 0xa6dfbd9fb8e5b88f, + 0xf8a95fcf88747d94, 0xb94470938fa89bcf, 0x8a08f0f8bf0f156b, + 0xcdb02555653131b6, 0x993fe2c6d07b7fac, 0xe45c10c42a2b3b06, + 0xaa242499697392d3, 0xfd87b5f28300ca0e, 0xbce5086492111aeb, + 0x8cbccc096f5088cc, 0xd1b71758e219652c, 0x9c40000000000000, + 0xe8d4a51000000000, 0xad78ebc5ac620000, 0x813f3978f8940984, + 0xc097ce7bc90715b3, 0x8f7e32ce7bea5c70, 0xd5d238a4abe98068, + 0x9f4f2726179a2245, 0xed63a231d4c4fb27, 0xb0de65388cc8ada8, + 0x83c7088e1aab65db, 0xc45d1df942711d9a, 0x924d692ca61be758, + 0xda01ee641a708dea, 0xa26da3999aef774a, 0xf209787bb47d6b85, + 0xb454e4a179dd1877, 0x865b86925b9bc5c2, 0xc83553c5c8965d3d, + 0x952ab45cfa97a0b3, 0xde469fbd99a05fe3, 0xa59bc234db398c25, + 0xf6c69a72a3989f5c, 0xb7dcbf5354e9bece, 0x88fcf317f22241e2, + 0xcc20ce9bd35c78a5, 0x98165af37b2153df, 0xe2a0b5dc971f303a, + 0xa8d9d1535ce3b396, 0xfb9b7cd9a4a7443c, 0xbb764c4ca7a44410, + 0x8bab8eefb6409c1a, 0xd01fef10a657842c, 0x9b10a4e5e9913129, + 0xe7109bfba19c0c9d, 0xac2820d9623bf429, 0x80444b5e7aa7cf85, + 0xbf21e44003acdd2d, 0x8e679c2f5e44ff8f, 0xd433179d9c8cb841, + 0x9e19db92b4e31ba9, 0xeb96bf6ebadf77d9, 0xaf87023b9bf0ee6b, + }; - template void operator()(It&& it) { - if (specs_.sign) *it++ = static_cast(data::signs[specs_.sign]); - it = prettify(it); - } +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wnarrowing" +#endif + // Binary exponents of pow(10, k), for k = -348, -340, ..., 340, corresponding + // to significands above. + static constexpr int16_t pow10_exponents[87] = { + -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, -954, + -927, -901, -874, -847, -821, -794, -768, -741, -715, -688, -661, + -635, -608, -582, -555, -529, -502, -475, -449, -422, -396, -369, + -343, -316, -289, -263, -236, -210, -183, -157, -130, -103, -77, + -50, -24, 3, 30, 56, 83, 109, 136, 162, 189, 216, + 242, 269, 295, 322, 348, 375, 402, 428, 455, 481, 508, + 534, 561, 588, 614, 641, 667, 694, 720, 747, 774, 800, + 827, 853, 880, 907, 933, 960, 986, 1013, 1039, 1066}; +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 +# pragma GCC diagnostic pop +#endif + + static constexpr uint64_t power_of_10_64[20] = { + 1, FMT_POWERS_OF_10(1ULL), FMT_POWERS_OF_10(1000000000ULL), + 10000000000000000000ULL}; }; +#if FMT_CPLUSPLUS < 201703L +template constexpr uint64_t basic_data::pow10_significands[]; +template constexpr int16_t basic_data::pow10_exponents[]; +template constexpr uint64_t basic_data::power_of_10_64[]; +#endif + +// This is a struct rather than an alias to avoid shadowing warnings in gcc. +struct data : basic_data<> {}; + +// Returns a cached power of 10 `c_k = c_k.f * pow(2, c_k.e)` such that its +// (binary) exponent satisfies `min_exponent <= c_k.e <= min_exponent + 28`. +FMT_CONSTEXPR inline fp get_cached_power(int min_exponent, + int& pow10_exponent) { + const int shift = 32; + // log10(2) = 0x0.4d104d427de7fbcc... + const int64_t significand = 0x4d104d427de7fbcc; + int index = static_cast( + ((min_exponent + fp::num_significand_bits - 1) * (significand >> shift) + + ((int64_t(1) << shift) - 1)) // ceil + >> 32 // arithmetic shift + ); + // Decimal exponent of the first (smallest) cached power of 10. + const int first_dec_exp = -348; + // Difference between 2 consecutive decimal exponents in cached powers of 10. + const int dec_exp_step = 8; + index = (index - first_dec_exp - 1) / dec_exp_step + 1; + pow10_exponent = first_dec_exp + index * dec_exp_step; + // Using *(x + index) instead of x[index] avoids an issue with some compilers + // using the EDG frontend (e.g. nvhpc/22.3 in C++17 mode). + return {*(data::pow10_significands + index), + *(data::pow10_exponents + index)}; +} + +#ifndef _MSC_VER +#include +# define FMT_SNPRINTF snprintf +#else +FMT_API auto fmt_snprintf(char* buf, size_t size, const char* fmt, ...) -> int; +# define FMT_SNPRINTF fmt_snprintf +#endif // _MSC_VER + +// Formats a floating-point number with snprintf using the hexfloat format. +template +auto snprintf_float(T value, int precision, float_specs specs, + buffer& buf) -> int { + // Buffer capacity must be non-zero, otherwise MSVC's vsnprintf_s will fail. + FMT_ASSERT(buf.capacity() > buf.size(), "empty buffer"); + FMT_ASSERT(specs.format == float_format::hex, ""); + static_assert(!std::is_same::value, ""); + + // Build the format string. + char format[7]; // The longest format is "%#.*Le". + char* format_ptr = format; + *format_ptr++ = '%'; + if (specs.showpoint) *format_ptr++ = '#'; + if (precision >= 0) { + *format_ptr++ = '.'; + *format_ptr++ = '*'; + } + if (std::is_same()) *format_ptr++ = 'L'; + *format_ptr++ = specs.upper ? 'A' : 'a'; + *format_ptr = '\0'; + + // Format using snprintf. + auto offset = buf.size(); + for (;;) { + auto begin = buf.data() + offset; + auto capacity = buf.capacity() - offset; + abort_fuzzing_if(precision > 100000); + // Suppress the warning about a nonliteral format string. + // Cannot use auto because of a bug in MinGW (#1532). + int (*snprintf_ptr)(char*, size_t, const char*, ...) = FMT_SNPRINTF; + int result = precision >= 0 + ? snprintf_ptr(begin, capacity, format, precision, value) + : snprintf_ptr(begin, capacity, format, value); + if (result < 0) { + // The buffer will grow exponentially. + buf.try_reserve(buf.capacity() + 1); + continue; + } + auto size = to_unsigned(result); + // Size equal to capacity means that the last character was truncated. + if (size < capacity) { + buf.try_resize(size + offset); + return 0; + } + buf.try_reserve(size + offset + 1); // Add 1 for the terminating '\0'. + } +} + template -int format_float(T value, int precision, float_specs specs, buffer& buf); +using convert_float_result = + conditional_t::value || sizeof(T) == sizeof(double), + double, T>; -// Formats a floating-point number with snprintf. template -int snprintf_float(T value, int precision, float_specs specs, - buffer& buf); - -template T promote_float(T value) { return value; } -inline double promote_float(float value) { return static_cast(value); } - -template -FMT_CONSTEXPR void handle_int_type_spec(char spec, Handler&& handler) { - switch (spec) { - case 0: - case 'd': - handler.on_dec(); - break; - case 'x': - case 'X': - handler.on_hex(); - break; - case 'b': - case 'B': - handler.on_bin(); - break; - case 'o': - handler.on_oct(); - break; - case 'n': - case 'L': - handler.on_num(); - break; - default: - handler.on_error(); - } +constexpr auto convert_float(T value) -> convert_float_result { + return static_cast>(value); } -template -FMT_CONSTEXPR float_specs parse_float_type_spec( - const basic_format_specs& specs, ErrorHandler&& eh = {}) { - auto result = float_specs(); - result.showpoint = specs.alt; - switch (specs.type) { - case 0: - result.format = float_format::general; - result.showpoint |= specs.precision > 0; - break; - case 'G': - result.upper = true; - FMT_FALLTHROUGH; - case 'g': - result.format = float_format::general; - break; - case 'E': - result.upper = true; - FMT_FALLTHROUGH; - case 'e': - result.format = float_format::exp; - result.showpoint |= specs.precision != 0; - break; - case 'F': - result.upper = true; - FMT_FALLTHROUGH; - case 'f': - result.format = float_format::fixed; - result.showpoint |= specs.precision != 0; - break; - case 'A': - result.upper = true; - FMT_FALLTHROUGH; - case 'a': - result.format = float_format::hex; - break; - case 'n': - result.locale = true; - break; - default: - eh.on_error("invalid type specifier"); - break; - } - return result; -} - -template -FMT_CONSTEXPR void handle_char_specs(const basic_format_specs* specs, - Handler&& handler) { - if (!specs) return handler.on_char(); - if (specs->type && specs->type != 'c') return handler.on_int(); - if (specs->align == align::numeric || specs->sign != sign::none || specs->alt) - handler.on_error("invalid format specifier for char"); - handler.on_char(); -} - -template -FMT_CONSTEXPR void handle_cstring_type_spec(Char spec, Handler&& handler) { - if (spec == 0 || spec == 's') - handler.on_string(); - else if (spec == 'p') - handler.on_pointer(); - else - handler.on_error("invalid type specifier"); -} - -template -FMT_CONSTEXPR void check_string_type_spec(Char spec, ErrorHandler&& eh) { - if (spec != 0 && spec != 's') eh.on_error("invalid type specifier"); -} - -template -FMT_CONSTEXPR void check_pointer_type_spec(Char spec, ErrorHandler&& eh) { - if (spec != 0 && spec != 'p') eh.on_error("invalid type specifier"); -} - -template class int_type_checker : private ErrorHandler { - public: - FMT_CONSTEXPR explicit int_type_checker(ErrorHandler eh) : ErrorHandler(eh) {} - - FMT_CONSTEXPR void on_dec() {} - FMT_CONSTEXPR void on_hex() {} - FMT_CONSTEXPR void on_bin() {} - FMT_CONSTEXPR void on_oct() {} - FMT_CONSTEXPR void on_num() {} - - FMT_CONSTEXPR void on_error() { - ErrorHandler::on_error("invalid type specifier"); - } -}; - -template -class char_specs_checker : public ErrorHandler { - private: - char type_; - - public: - FMT_CONSTEXPR char_specs_checker(char type, ErrorHandler eh) - : ErrorHandler(eh), type_(type) {} - - FMT_CONSTEXPR void on_int() { - handle_int_type_spec(type_, int_type_checker(*this)); - } - FMT_CONSTEXPR void on_char() {} -}; - -template -class cstring_type_checker : public ErrorHandler { - public: - FMT_CONSTEXPR explicit cstring_type_checker(ErrorHandler eh) - : ErrorHandler(eh) {} - - FMT_CONSTEXPR void on_string() {} - FMT_CONSTEXPR void on_pointer() {} -}; - -template -void arg_map::init(const basic_format_args& args) { - if (map_) return; - map_ = new entry[internal::to_unsigned(args.max_size())]; - if (args.is_packed()) { - for (int i = 0;; ++i) { - internal::type arg_type = args.type(i); - if (arg_type == internal::type::none_type) return; - if (arg_type == internal::type::named_arg_type) - push_back(args.values_[i]); - } - } - for (int i = 0, n = args.max_size(); i < n; ++i) { - auto type = args.args_[i].type_; - if (type == internal::type::named_arg_type) push_back(args.args_[i].value_); - } -} - -template struct nonfinite_writer { - sign_t sign; - const char* str; - static constexpr size_t str_size = 3; - - size_t size() const { return str_size + (sign ? 1 : 0); } - size_t width() const { return size(); } - - template void operator()(It&& it) const { - if (sign) *it++ = static_cast(data::signs[sign]); - it = copy_str(str, str + str_size, it); - } -}; - template -FMT_NOINLINE OutputIt fill(OutputIt it, size_t n, const fill_t& fill) { +FMT_NOINLINE FMT_CONSTEXPR auto fill(OutputIt it, size_t n, + const fill_t& fill) -> OutputIt { auto fill_size = fill.size(); - if (fill_size == 1) return internal::fill_n(it, n, fill[0]); - for (size_t i = 0; i < n; ++i) it = internal::copy_n(fill.data(), fill_size, it); + if (fill_size == 1) return detail::fill_n(it, n, fill[0]); + auto data = fill.data(); + for (size_t i = 0; i < n; ++i) + it = copy_str(data, data + fill_size, it); return it; } -// This template provides operations for formatting and writing data into a -// character range. -template class basic_writer { - public: - using char_type = typename Range::value_type; - using iterator = typename Range::iterator; - using format_specs = basic_format_specs; +// Writes the output of f, padded according to format specifications in specs. +// size: output size in code units. +// width: output display width in (terminal) column positions. +template +FMT_CONSTEXPR auto write_padded(OutputIt out, + const basic_format_specs& specs, + size_t size, size_t width, F&& f) -> OutputIt { + static_assert(align == align::left || align == align::right, ""); + unsigned spec_width = to_unsigned(specs.width); + size_t padding = spec_width > width ? spec_width - width : 0; + // Shifts are encoded as string literals because static constexpr is not + // supported in constexpr functions. + auto* shifts = align == align::left ? "\x1f\x1f\x00\x01" : "\x00\x1f\x00\x01"; + size_t left_padding = padding >> shifts[specs.align]; + size_t right_padding = padding - left_padding; + auto it = reserve(out, size + padding * specs.fill.size()); + if (left_padding != 0) it = fill(it, left_padding, specs.fill); + it = f(it); + if (right_padding != 0) it = fill(it, right_padding, specs.fill); + return base_iterator(out, it); +} - private: - iterator out_; // Output iterator. - locale_ref locale_; +template +constexpr auto write_padded(OutputIt out, const basic_format_specs& specs, + size_t size, F&& f) -> OutputIt { + return write_padded(out, specs, size, size, f); +} - // Attempts to reserve space for n extra characters in the output range. - // Returns a pointer to the reserved range or a reference to out_. - auto reserve(std::size_t n) -> decltype(internal::reserve(out_, n)) { - return internal::reserve(out_, n); - } +template +FMT_CONSTEXPR auto write_bytes(OutputIt out, string_view bytes, + const basic_format_specs& specs) + -> OutputIt { + return write_padded( + out, specs, bytes.size(), [bytes](reserve_iterator it) { + const char* data = bytes.data(); + return copy_str(data, data + bytes.size(), it); + }); +} - template struct padded_int_writer { - size_t size_; - string_view prefix; - char_type fill; - std::size_t padding; - F f; - - size_t size() const { return size_; } - size_t width() const { return size_; } - - template void operator()(It&& it) const { - if (prefix.size() != 0) - it = copy_str(prefix.begin(), prefix.end(), it); - it = internal::fill_n(it, padding, fill); - f(it); - } +template +auto write_ptr(OutputIt out, UIntPtr value, + const basic_format_specs* specs) -> OutputIt { + int num_digits = count_digits<4>(value); + auto size = to_unsigned(num_digits) + size_t(2); + auto write = [=](reserve_iterator it) { + *it++ = static_cast('0'); + *it++ = static_cast('x'); + return format_uint<4, Char>(it, value, num_digits); }; + return specs ? write_padded(out, *specs, size, write) + : base_iterator(out, write(reserve(out, size))); +} - // Writes an integer in the format - // - // where are written by f(it). - template - void write_int(int num_digits, string_view prefix, format_specs specs, F f) { - std::size_t size = prefix.size() + to_unsigned(num_digits); - char_type fill = specs.fill[0]; - std::size_t padding = 0; +// Returns true iff the code point cp is printable. +FMT_API auto is_printable(uint32_t cp) -> bool; + +inline auto needs_escape(uint32_t cp) -> bool { + return cp < 0x20 || cp == 0x7f || cp == '"' || cp == '\\' || + !is_printable(cp); +} + +template struct find_escape_result { + const Char* begin; + const Char* end; + uint32_t cp; +}; + +template +using make_unsigned_char = + typename conditional_t::value, + std::make_unsigned, + type_identity>::type; + +template +auto find_escape(const Char* begin, const Char* end) + -> find_escape_result { + for (; begin != end; ++begin) { + uint32_t cp = static_cast>(*begin); + if (const_check(sizeof(Char) == 1) && cp >= 0x80) continue; + if (needs_escape(cp)) return {begin, begin + 1, cp}; + } + return {begin, nullptr, 0}; +} + +inline auto find_escape(const char* begin, const char* end) + -> find_escape_result { + if (!is_utf8()) return find_escape(begin, end); + auto result = find_escape_result{end, nullptr, 0}; + for_each_codepoint(string_view(begin, to_unsigned(end - begin)), + [&](uint32_t cp, string_view sv) { + if (needs_escape(cp)) { + result = {sv.begin(), sv.end(), cp}; + return false; + } + return true; + }); + return result; +} + +#if FMT_USE_COMPILE_TIME +#define FMT_STRING_IMPL(s, base, explicit) \ + [] { \ + /* Use the hidden visibility as a workaround for a GCC bug (#1973). */ \ + /* Use a macro-like name to avoid shadowing warnings. */ \ + struct FMT_GCC_VISIBILITY_HIDDEN FMT_COMPILE_STRING : base { \ + using char_type FMT_MAYBE_UNUSED = fmt::remove_cvref_t; \ + FMT_MAYBE_UNUSED FMT_CONSTEXPR explicit \ + operator fmt::basic_string_view() const { \ + return fmt::detail_exported::compile_string_to_view(s); \ + } \ + }; \ + return FMT_COMPILE_STRING(); \ + }() + +/** + \rst + Constructs a compile-time format string from a string literal *s*. + + **Example**:: + + // A compile-time error because 'd' is an invalid specifier for strings. + std::string s = fmt::format(FMT_STRING("{:d}"), "foo"); + \endrst + */ +#define FMT_STRING(s) FMT_STRING_IMPL(s, fmt::detail::compile_string, ) +#else +#define FMT_STRING(s) s +#endif + +template +auto write_codepoint(OutputIt out, char prefix, uint32_t cp) -> OutputIt { + *out++ = static_cast('\\'); + *out++ = static_cast(prefix); + Char buf[width]; + fill_n(buf, width, static_cast('0')); + format_uint<4>(buf, cp, width); + return copy_str(buf, buf + width, out); +} + +template +auto write_escaped_cp(OutputIt out, const find_escape_result& escape) + -> OutputIt { + auto c = static_cast(escape.cp); + switch (escape.cp) { + case '\n': + *out++ = static_cast('\\'); + c = static_cast('n'); + break; + case '\r': + *out++ = static_cast('\\'); + c = static_cast('r'); + break; + case '\t': + *out++ = static_cast('\\'); + c = static_cast('t'); + break; + case '"': + FMT_FALLTHROUGH; + case '\'': + FMT_FALLTHROUGH; + case '\\': + *out++ = static_cast('\\'); + break; + default: + if (is_utf8()) { + if (escape.cp < 0x100) { + return write_codepoint<2, Char>(out, 'x', escape.cp); + } + if (escape.cp < 0x10000) { + return write_codepoint<4, Char>(out, 'u', escape.cp); + } + if (escape.cp < 0x110000) { + return write_codepoint<8, Char>(out, 'U', escape.cp); + } + } + for (Char escape_char : basic_string_view( + escape.begin, to_unsigned(escape.end - escape.begin))) { + out = write_codepoint<2, Char>(out, 'x', + static_cast(escape_char) & 0xFF); + } + return out; + } + *out++ = c; + return out; +} + +template +auto write_escaped_string(OutputIt out, basic_string_view str) + -> OutputIt { + *out++ = static_cast('"'); + auto begin = str.begin(), end = str.end(); + do { + auto escape = find_escape(begin, end); + out = copy_str(begin, escape.begin, out); + begin = escape.end; + if (!begin) break; + out = write_escaped_cp(out, escape); + } while (begin != end); + *out++ = static_cast('"'); + return out; +} + +template +auto write_escaped_char(OutputIt out, Char v) -> OutputIt { + *out++ = static_cast('\''); + if ((needs_escape(static_cast(v)) && v != static_cast('"')) || + v == static_cast('\'')) { + out = write_escaped_cp( + out, find_escape_result{&v, &v + 1, static_cast(v)}); + } else { + *out++ = v; + } + *out++ = static_cast('\''); + return out; +} + +template +FMT_CONSTEXPR auto write_char(OutputIt out, Char value, + const basic_format_specs& specs) + -> OutputIt { + bool is_debug = specs.type == presentation_type::debug; + return write_padded(out, specs, 1, [=](reserve_iterator it) { + if (is_debug) return write_escaped_char(it, value); + *it++ = value; + return it; + }); +} +template +FMT_CONSTEXPR auto write(OutputIt out, Char value, + const basic_format_specs& specs, + locale_ref loc = {}) -> OutputIt { + return check_char_specs(specs) + ? write_char(out, value, specs) + : write(out, static_cast(value), specs, loc); +} + +// Data for write_int that doesn't depend on output iterator type. It is used to +// avoid template code bloat. +template struct write_int_data { + size_t size; + size_t padding; + + FMT_CONSTEXPR write_int_data(int num_digits, unsigned prefix, + const basic_format_specs& specs) + : size((prefix >> 24) + to_unsigned(num_digits)), padding(0) { if (specs.align == align::numeric) { - auto unsiged_width = to_unsigned(specs.width); - if (unsiged_width > size) { - padding = unsiged_width - size; - size = unsiged_width; + auto width = to_unsigned(specs.width); + if (width > size) { + padding = width - size; + size = width; } } else if (specs.precision > num_digits) { - size = prefix.size() + to_unsigned(specs.precision); + size = (prefix >> 24) + to_unsigned(specs.precision); padding = to_unsigned(specs.precision - num_digits); - fill = static_cast('0'); } - if (specs.align == align::none) specs.align = align::right; - write_padded(specs, padded_int_writer{size, prefix, fill, padding, f}); } +}; - // Writes a decimal integer. - template void write_decimal(Int value) { - auto abs_value = static_cast>(value); - bool negative = is_negative(value); - // Don't do -abs_value since it trips unsigned-integer-overflow sanitizer. - if (negative) abs_value = ~abs_value + 1; - int num_digits = count_digits(abs_value); - auto&& it = reserve((negative ? 1 : 0) + static_cast(num_digits)); - if (negative) *it++ = static_cast('-'); - it = format_decimal(it, abs_value, num_digits); +// Writes an integer in the format +// +// where are written by write_digits(it). +// prefix contains chars in three lower bytes and the size in the fourth byte. +template +FMT_CONSTEXPR FMT_INLINE auto write_int(OutputIt out, int num_digits, + unsigned prefix, + const basic_format_specs& specs, + W write_digits) -> OutputIt { + // Slightly faster check for specs.width == 0 && specs.precision == -1. + if ((specs.width | (specs.precision + 1)) == 0) { + auto it = reserve(out, to_unsigned(num_digits) + (prefix >> 24)); + if (prefix != 0) { + for (unsigned p = prefix & 0xffffff; p != 0; p >>= 8) + *it++ = static_cast(p & 0xff); + } + return base_iterator(out, write_digits(it)); } + auto data = write_int_data(num_digits, prefix, specs); + return write_padded( + out, specs, data.size, [=](reserve_iterator it) { + for (unsigned p = prefix & 0xffffff; p != 0; p >>= 8) + *it++ = static_cast(p & 0xff); + it = detail::fill_n(it, data.padding, static_cast('0')); + return write_digits(it); + }); +} - // The handle_int_type_spec handler that writes an integer. - template struct int_writer { - using unsigned_type = uint32_or_64_or_128_t; - - basic_writer& writer; - const Specs& specs; - unsigned_type abs_value; - char prefix[4]; - unsigned prefix_size; - - string_view get_prefix() const { return string_view(prefix, prefix_size); } - - int_writer(basic_writer& w, Int value, const Specs& s) - : writer(w), - specs(s), - abs_value(static_cast(value)), - prefix_size(0) { - if (is_negative(value)) { - prefix[0] = '-'; - ++prefix_size; - abs_value = 0 - abs_value; - } else if (specs.sign != sign::none && specs.sign != sign::minus) { - prefix[0] = specs.sign == sign::plus ? '+' : ' '; - ++prefix_size; - } - } - - struct dec_writer { - unsigned_type abs_value; - int num_digits; - - template void operator()(It&& it) const { - it = internal::format_decimal(it, abs_value, num_digits); - } - }; - - void on_dec() { - int num_digits = count_digits(abs_value); - writer.write_int(num_digits, get_prefix(), specs, - dec_writer{abs_value, num_digits}); - } - - struct hex_writer { - int_writer& self; - int num_digits; - - template void operator()(It&& it) const { - it = format_uint<4, char_type>(it, self.abs_value, num_digits, - self.specs.type != 'x'); - } - }; - - void on_hex() { - if (specs.alt) { - prefix[prefix_size++] = '0'; - prefix[prefix_size++] = specs.type; - } - int num_digits = count_digits<4>(abs_value); - writer.write_int(num_digits, get_prefix(), specs, - hex_writer{*this, num_digits}); - } - - template struct bin_writer { - unsigned_type abs_value; - int num_digits; - - template void operator()(It&& it) const { - it = format_uint(it, abs_value, num_digits); - } - }; - - void on_bin() { - if (specs.alt) { - prefix[prefix_size++] = '0'; - prefix[prefix_size++] = static_cast(specs.type); - } - int num_digits = count_digits<1>(abs_value); - writer.write_int(num_digits, get_prefix(), specs, - bin_writer<1>{abs_value, num_digits}); - } - - void on_oct() { - int num_digits = count_digits<3>(abs_value); - if (specs.alt && specs.precision <= num_digits && abs_value != 0) { - // Octal prefix '0' is counted as a digit, so only add it if precision - // is not greater than the number of digits. - prefix[prefix_size++] = '0'; - } - writer.write_int(num_digits, get_prefix(), specs, - bin_writer<3>{abs_value, num_digits}); - } - - enum { sep_size = 1 }; +template class digit_grouping { + private: + thousands_sep_result sep_; + struct next_state { #if FMT_USE_LOCALE_GROUPING - struct num_writer { - unsigned_type abs_value; - int size; - const std::string& groups; - char_type sep; - - template void operator()(It&& it) const { - basic_string_view s(&sep, sep_size); - // Index of a decimal digit with the least significant digit having - // index 0. - int digit_index = 0; - std::string::const_iterator group = groups.cbegin(); - it = format_decimal( - it, abs_value, size, - [this, s, &group, &digit_index](char_type*& buffer) { - if (*group <= 0 || ++digit_index % *group != 0 || - *group == max_value()) - return; - if (group + 1 != groups.cend()) { - digit_index = 0; - ++group; - } - buffer -= s.size(); - ::memcpy(buffer, s.data(), s.size() * sizeof(char_type)); - }); - } - }; + std::string::const_iterator group; #endif - - void on_num() { + int pos; + }; #if FMT_USE_LOCALE_GROUPING - std::string groups = grouping(writer.locale_); - if (groups.empty()) return on_dec(); - auto sep = thousands_sep(writer.locale_); - if (!sep) return on_dec(); - int num_digits = count_digits(abs_value); - int size = num_digits; - std::string::const_iterator group = groups.cbegin(); - while (group != groups.cend() && num_digits > *group && *group > 0 && - *group != max_value()) { - size += sep_size; - num_digits -= *group; - ++group; - } - if (group == groups.cend()) - size += sep_size * ((num_digits - 1) / groups.back()); - writer.write_int(size, get_prefix(), specs, - num_writer{abs_value, size, groups, sep}); + next_state initial_state() const { return {sep_.grouping.begin(), 0}; } #else - return on_dec(); + next_state initial_state() const { return {0}; } #endif - } - FMT_NORETURN void on_error() { - FMT_THROW_FORMAT_ERROR("invalid type specifier"); - } - }; - - template struct str_writer { - const Char* s; - size_t size_; - - size_t size() const { return size_; } - size_t width() const { - return count_code_points(basic_string_view(s, size_)); - } - - template void operator()(It&& it) const { - it = copy_str(s, s + size_, it); - } - }; - - struct bytes_writer { - string_view bytes; - - size_t size() const { return bytes.size(); } - size_t width() const { return bytes.size(); } - - template void operator()(It&& it) const { - const char* data = bytes.data(); - it = copy_str(data, data + size(), it); - } - }; - - template struct pointer_writer { - UIntPtr value; - int num_digits; - - size_t size() const { return to_unsigned(num_digits) + 2; } - size_t width() const { return size(); } - - template void operator()(It&& it) const { - *it++ = static_cast('0'); - *it++ = static_cast('x'); - it = format_uint<4, char_type>(it, value, num_digits); - } - }; + // Returns the next digit group separator position. + int next(next_state& state) const { + if (!sep_.thousands_sep) return max_value(); +#if FMT_USE_LOCALE_GROUPING + if (state.group == sep_.grouping.end()) + return state.pos += sep_.grouping.back(); + if (*state.group <= 0 || *state.group == max_value()) + return max_value(); + state.pos += *state.group++; +#else + state.pos++; +#endif + return state.pos; + } public: - explicit basic_writer(Range out, locale_ref loc = locale_ref()) - : out_(out.begin()), locale_(loc) {} + explicit digit_grouping(locale_ref loc, bool localized = true) { + if (localized) + sep_ = thousands_sep(loc); + else + sep_.thousands_sep = Char(); + } + explicit digit_grouping(thousands_sep_result sep) : sep_(sep) {} - iterator out() const { return out_; } + Char separator() const { return sep_.thousands_sep; } - // Writes a value in the format - // - // where is written by f(it). - template void write_padded(const format_specs& specs, F&& f) { - // User-perceived width (in code points). - unsigned width = to_unsigned(specs.width); - size_t size = f.size(); // The number of code units. - size_t num_code_points = width != 0 ? f.width() : size; - if (width <= num_code_points) return f(reserve(size)); - size_t padding = width - num_code_points; - size_t fill_size = specs.fill.size(); - auto&& it = reserve(size + padding * fill_size); - if (specs.align == align::right) { - it = fill(it, padding, specs.fill); - f(it); - } else if (specs.align == align::center) { - std::size_t left_padding = padding / 2; - it = fill(it, left_padding, specs.fill); - f(it); - it = fill(it, padding - left_padding, specs.fill); - } else { - f(it); - it = fill(it, padding, specs.fill); - } + int count_separators(int num_digits) const { + int count = 0; + auto state = initial_state(); + while (num_digits > next(state)) ++count; + return count; } - void write(int value) { write_decimal(value); } - void write(long value) { write_decimal(value); } - void write(long long value) { write_decimal(value); } - - void write(unsigned value) { write_decimal(value); } - void write(unsigned long value) { write_decimal(value); } - void write(unsigned long long value) { write_decimal(value); } - -#if FMT_USE_INT128 - void write(int128_t value) { write_decimal(value); } - void write(uint128_t value) { write_decimal(value); } -#endif - - template - void write_int(T value, const Spec& spec) { - handle_int_type_spec(spec.type, int_writer(*this, value, spec)); - } - - template ::value)> - void write(T value, format_specs specs = {}) { - if (const_check(!is_supported_floating_point(value))) { - return; + // Applies grouping to digits and write the output to out. + template + Out apply(Out out, basic_string_view digits) const { + auto num_digits = static_cast(digits.size()); + auto separators = basic_memory_buffer(); + separators.push_back(0); + auto state = initial_state(); + while (int i = next(state)) { + if (i >= num_digits) break; + separators.push_back(i); } - float_specs fspecs = parse_float_type_spec(specs); - fspecs.sign = specs.sign; - if (signbit(value)) { // value < 0 is false for NaN so use signbit. - fspecs.sign = sign::minus; - value = -value; - } else if (fspecs.sign == sign::minus) { - fspecs.sign = sign::none; - } - - if (!isfinite(value)) { - auto str = isinf(value) ? (fspecs.upper ? "INF" : "inf") - : (fspecs.upper ? "NAN" : "nan"); - return write_padded(specs, nonfinite_writer{fspecs.sign, str}); - } - - if (specs.align == align::none) { - specs.align = align::right; - } else if (specs.align == align::numeric) { - if (fspecs.sign) { - auto&& it = reserve(1); - *it++ = static_cast(data::signs[fspecs.sign]); - fspecs.sign = sign::none; - if (specs.width != 0) --specs.width; + for (int i = 0, sep_index = static_cast(separators.size() - 1); + i < num_digits; ++i) { + if (num_digits - i == separators[sep_index]) { + *out++ = separator(); + --sep_index; } - specs.align = align::right; + *out++ = static_cast(digits[to_unsigned(i)]); } - - memory_buffer buffer; - if (fspecs.format == float_format::hex) { - if (fspecs.sign) buffer.push_back(data::signs[fspecs.sign]); - snprintf_float(promote_float(value), specs.precision, fspecs, buffer); - write_padded(specs, str_writer{buffer.data(), buffer.size()}); - return; - } - int precision = specs.precision >= 0 || !specs.type ? specs.precision : 6; - if (fspecs.format == float_format::exp) { - if (precision == max_value()) - FMT_THROW_FORMAT_ERROR("number is too big"); - else - ++precision; - } - if (const_check(std::is_same())) fspecs.binary32 = true; - fspecs.use_grisu = use_grisu(); - int exp = format_float(promote_float(value), precision, fspecs, buffer); - fspecs.precision = precision; - char_type point = fspecs.locale ? decimal_point(locale_) - : static_cast('.'); - write_padded(specs, float_writer(buffer.data(), - static_cast(buffer.size()), - exp, fspecs, point)); - } - - void write(char value) { - auto&& it = reserve(1); - *it++ = value; - } - - template ::value)> - void write(Char value) { - auto&& it = reserve(1); - *it++ = value; - } - - void write(string_view value) { - auto&& it = reserve(value.size()); - it = copy_str(value.begin(), value.end(), it); - } - void write(wstring_view value) { - static_assert(std::is_same::value, ""); - auto&& it = reserve(value.size()); - it = internal::copy(value.begin(), value.end(), it); - } - - template - void write(const Char* s, std::size_t size, const format_specs& specs) { - write_padded(specs, str_writer{s, size}); - } - - template - void write(basic_string_view s, const format_specs& specs = {}) { - const Char* data = s.data(); - std::size_t size = s.size(); - if (specs.precision >= 0 && to_unsigned(specs.precision) < size) - size = code_point_index(s, to_unsigned(specs.precision)); - write(data, size, specs); - } - - void write_bytes(string_view bytes, const format_specs& specs) { - write_padded(specs, bytes_writer{bytes}); - } - - template - void write_pointer(UIntPtr value, const format_specs* specs) { - int num_digits = count_digits<4>(value); - auto pw = pointer_writer{value, num_digits}; - if (!specs) return pw(reserve(to_unsigned(num_digits) + 2)); - format_specs specs_copy = *specs; - if (specs_copy.align == align::none) specs_copy.align = align::right; - write_padded(specs_copy, pw); + return out; } }; -using writer = basic_writer>; - -template struct is_integral : std::is_integral {}; -template <> struct is_integral : std::true_type {}; -template <> struct is_integral : std::true_type {}; - -template -class arg_formatter_base { - public: - using char_type = typename Range::value_type; - using iterator = typename Range::iterator; - using format_specs = basic_format_specs; - - private: - using writer_type = basic_writer; - writer_type writer_; - format_specs* specs_; - - struct char_writer { - char_type value; - - size_t size() const { return 1; } - size_t width() const { return 1; } - - template void operator()(It&& it) const { *it++ = value; } - }; - - void write_char(char_type value) { - if (specs_) - writer_.write_padded(*specs_, char_writer{value}); - else - writer_.write(value); - } - - void write_pointer(const void* p) { - writer_.write_pointer(internal::to_uintptr(p), specs_); - } - - protected: - writer_type& writer() { return writer_; } - format_specs* specs() { return specs_; } - iterator out() { return writer_.out(); } - - void write(bool value) { - string_view sv(value ? "true" : "false"); - specs_ ? writer_.write(sv, *specs_) : writer_.write(sv); - } - - void write(const char_type* value) { - if (!value) { - FMT_THROW_FORMAT_ERROR("string pointer is null"); - } else { - auto length = StringUtils::Length(value); - basic_string_view sv(value, length); - specs_ ? writer_.write(sv, *specs_) : writer_.write(sv); - } - } - - public: - arg_formatter_base(Range r, format_specs* s, locale_ref loc) - : writer_(r, loc), specs_(s) {} - - iterator operator()(monostate) { - FMT_ASSERT(false, "invalid argument type"); - return out(); - } - - template ::value)> - iterator operator()(T value) { - if (specs_) - writer_.write_int(value, *specs_); - else - writer_.write(value); - return out(); - } - - iterator operator()(char_type value) { - internal::handle_char_specs( - specs_, char_spec_handler(*this, static_cast(value))); - return out(); - } - - iterator operator()(bool value) { - if (specs_ && specs_->type) return (*this)(value ? 1 : 0); - write(value != 0); - return out(); - } - - template ::value)> - iterator operator()(T value) { - if (const_check(is_supported_floating_point(value))) - writer_.write(value, specs_ ? *specs_ : format_specs()); - else - FMT_ASSERT(false, "unsupported float argument type"); - return out(); - } - - struct char_spec_handler : ErrorHandler { - arg_formatter_base& formatter; - char_type value; - - char_spec_handler(arg_formatter_base& f, char_type val) - : formatter(f), value(val) {} - - void on_int() { - if (formatter.specs_) - formatter.writer_.write_int(value, *formatter.specs_); - else - formatter.writer_.write(value); - } - void on_char() { formatter.write_char(value); } - }; - - struct cstring_spec_handler : internal::error_handler { - arg_formatter_base& formatter; - const char_type* value; - - cstring_spec_handler(arg_formatter_base& f, const char_type* val) - : formatter(f), value(val) {} - - void on_string() { formatter.write(value); } - void on_pointer() { formatter.write_pointer(value); } - }; - - iterator operator()(const char_type* value) { - if (!specs_) return write(value), out(); - internal::handle_cstring_type_spec(specs_->type, - cstring_spec_handler(*this, value)); - return out(); - } - - iterator operator()(basic_string_view value) { - if (specs_) { - internal::check_string_type_spec(specs_->type, internal::error_handler()); - writer_.write(value, *specs_); - } else { - writer_.write(value); - } - return out(); - } - - iterator operator()(const void* value) { - if (specs_) - check_pointer_type_spec(specs_->type, internal::error_handler()); - write_pointer(value); - return out(); - } -}; - -template FMT_CONSTEXPR bool is_name_start(Char c) { - return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || '_' == c; +template +auto write_int_localized(OutputIt out, UInt value, unsigned prefix, + const basic_format_specs& specs, + const digit_grouping& grouping) -> OutputIt { + static_assert(std::is_same, UInt>::value, ""); + int num_digits = count_digits(value); + char digits[40]; + format_decimal(digits, value, num_digits); + unsigned size = to_unsigned((prefix != 0 ? 1 : 0) + num_digits + + grouping.count_separators(num_digits)); + return write_padded( + out, specs, size, size, [&](reserve_iterator it) { + if (prefix != 0) { + char sign = static_cast(prefix); + *it++ = static_cast(sign); + } + return grouping.apply(it, string_view(digits, to_unsigned(num_digits))); + }); } -// Parses the range [begin, end) as an unsigned integer. This function assumes -// that the range is non-empty and the first character is a digit. -template -FMT_CONSTEXPR int parse_nonnegative_int(const Char*& begin, const Char* end, - ErrorHandler&& eh) { - FMT_ASSERT(begin != end && '0' <= *begin && *begin <= '9', ""); - unsigned value = 0; - // Convert to unsigned to prevent a warning. - constexpr unsigned max_int = max_value(); - unsigned big = max_int / 10; +template +auto write_int_localized(OutputIt& out, UInt value, unsigned prefix, + const basic_format_specs& specs, locale_ref loc) + -> bool { + auto grouping = digit_grouping(loc); + out = write_int_localized(out, value, prefix, specs, grouping); + return true; +} + +FMT_CONSTEXPR inline void prefix_append(unsigned& prefix, unsigned value) { + prefix |= prefix != 0 ? value << 8 : value; + prefix += (1u + (value > 0xff ? 1 : 0)) << 24; +} + +template struct write_int_arg { + UInt abs_value; + unsigned prefix; +}; + +template +FMT_CONSTEXPR auto make_write_int_arg(T value, sign_t sign) + -> write_int_arg> { + auto prefix = 0u; + auto abs_value = static_cast>(value); + if (is_negative(value)) { + prefix = 0x01000000 | '-'; + abs_value = 0 - abs_value; + } else { + constexpr const unsigned prefixes[4] = {0, 0, 0x1000000u | '+', + 0x1000000u | ' '}; + prefix = prefixes[sign]; + } + return {abs_value, prefix}; +} + +template +FMT_CONSTEXPR FMT_INLINE auto write_int(OutputIt out, write_int_arg arg, + const basic_format_specs& specs, + locale_ref loc) -> OutputIt { + static_assert(std::is_same>::value, ""); + auto abs_value = arg.abs_value; + auto prefix = arg.prefix; + switch (specs.type) { + case presentation_type::none: + case presentation_type::dec: { + if (specs.localized && + write_int_localized(out, static_cast>(abs_value), + prefix, specs, loc)) { + return out; + } + auto num_digits = count_digits(abs_value); + return write_int( + out, num_digits, prefix, specs, [=](reserve_iterator it) { + return format_decimal(it, abs_value, num_digits).end; + }); + } + case presentation_type::hex_lower: + case presentation_type::hex_upper: { + bool upper = specs.type == presentation_type::hex_upper; + if (specs.alt) + prefix_append(prefix, unsigned(upper ? 'X' : 'x') << 8 | '0'); + int num_digits = count_digits<4>(abs_value); + return write_int( + out, num_digits, prefix, specs, [=](reserve_iterator it) { + return format_uint<4, Char>(it, abs_value, num_digits, upper); + }); + } + case presentation_type::bin_lower: + case presentation_type::bin_upper: { + bool upper = specs.type == presentation_type::bin_upper; + if (specs.alt) + prefix_append(prefix, unsigned(upper ? 'B' : 'b') << 8 | '0'); + int num_digits = count_digits<1>(abs_value); + return write_int(out, num_digits, prefix, specs, + [=](reserve_iterator it) { + return format_uint<1, Char>(it, abs_value, num_digits); + }); + } + case presentation_type::oct: { + int num_digits = count_digits<3>(abs_value); + // Octal prefix '0' is counted as a digit, so only add it if precision + // is not greater than the number of digits. + if (specs.alt && specs.precision <= num_digits && abs_value != 0) + prefix_append(prefix, '0'); + return write_int(out, num_digits, prefix, specs, + [=](reserve_iterator it) { + return format_uint<3, Char>(it, abs_value, num_digits); + }); + } + case presentation_type::chr: + return write_char(out, static_cast(abs_value), specs); + default: + FMT_THROW_FORMAT_ERROR("invalid type specifier"); + } + return out; +} +template +FMT_CONSTEXPR FMT_NOINLINE auto write_int_noinline( + OutputIt out, write_int_arg arg, const basic_format_specs& specs, + locale_ref loc) -> OutputIt { + return write_int(out, arg, specs, loc); +} +template ::value && + !std::is_same::value && + std::is_same>::value)> +FMT_CONSTEXPR FMT_INLINE auto write(OutputIt out, T value, + const basic_format_specs& specs, + locale_ref loc) -> OutputIt { + return write_int_noinline(out, make_write_int_arg(value, specs.sign), specs, + loc); +} +// An inlined version of write used in format string compilation. +template ::value && + !std::is_same::value && + !std::is_same>::value)> +FMT_CONSTEXPR FMT_INLINE auto write(OutputIt out, T value, + const basic_format_specs& specs, + locale_ref loc) -> OutputIt { + return write_int(out, make_write_int_arg(value, specs.sign), specs, loc); +} + +// An output iterator that counts the number of objects written to it and +// discards them. +class counting_iterator { + private: + size_t count_; + + public: +#if FMT_USE_ITERATOR + using iterator_category = std::output_iterator_tag; +#endif + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = void; + FMT_UNCHECKED_ITERATOR(counting_iterator); + + struct value_type { + template FMT_CONSTEXPR void operator=(const T&) {} + }; + + FMT_CONSTEXPR counting_iterator() : count_(0) {} + + FMT_CONSTEXPR size_t count() const { return count_; } + + FMT_CONSTEXPR counting_iterator& operator++() { + ++count_; + return *this; + } + FMT_CONSTEXPR counting_iterator operator++(int) { + auto it = *this; + ++*this; + return it; + } + + FMT_CONSTEXPR friend counting_iterator operator+(counting_iterator it, + difference_type n) { + it.count_ += static_cast(n); + return it; + } + + FMT_CONSTEXPR value_type operator*() const { return {}; } +}; + +template +FMT_CONSTEXPR auto write(OutputIt out, basic_string_view s, + const basic_format_specs& specs) -> OutputIt { + auto data = s.data(); + auto size = s.size(); + if (specs.precision >= 0 && to_unsigned(specs.precision) < size) + size = code_point_index(s, to_unsigned(specs.precision)); + bool is_debug = specs.type == presentation_type::debug; + size_t width = 0; + if (specs.width != 0) { + if (is_debug) + width = write_escaped_string(counting_iterator{}, s).count(); + else + width = compute_width(basic_string_view(data, size)); + } + return write_padded(out, specs, size, width, + [=](reserve_iterator it) { + if (is_debug) return write_escaped_string(it, s); + return copy_str(data, data + size, it); + }); +} +template +FMT_CONSTEXPR auto write(OutputIt out, + basic_string_view> s, + const basic_format_specs& specs, locale_ref) + -> OutputIt { + check_string_type_spec(specs.type); + return write(out, s, specs); +} +template +FMT_CONSTEXPR auto write(OutputIt out, const Char* s, + const basic_format_specs& specs, locale_ref) + -> OutputIt { + return check_cstring_type_spec(specs.type) + ? write(out, basic_string_view(s), specs, {}) + : write_ptr(out, bit_cast(s), &specs); +} + +template ::value && + !std::is_same::value && + !std::is_same::value)> +FMT_CONSTEXPR auto write(OutputIt out, T value) -> OutputIt { + auto abs_value = static_cast>(value); + bool negative = is_negative(value); + // Don't do -abs_value since it trips unsigned-integer-overflow sanitizer. + if (negative) abs_value = ~abs_value + 1; + int num_digits = count_digits(abs_value); + auto size = (negative ? 1 : 0) + static_cast(num_digits); + auto it = reserve(out, size); + if (auto ptr = to_pointer(it, size)) { + if (negative) *ptr++ = static_cast('-'); + format_decimal(ptr, abs_value, num_digits); + return out; + } + if (negative) *it++ = static_cast('-'); + it = format_decimal(it, abs_value, num_digits).end; + return base_iterator(out, it); +} + +template +FMT_CONSTEXPR20 auto write_nonfinite(OutputIt out, bool isnan, + basic_format_specs specs, + const float_specs& fspecs) -> OutputIt { + auto str = + isnan ? (fspecs.upper ? "NAN" : "nan") : (fspecs.upper ? "INF" : "inf"); + constexpr size_t str_size = 3; + auto sign = fspecs.sign; + auto size = str_size + (sign ? 1 : 0); + // Replace '0'-padding with space for non-finite values. + const bool is_zero_fill = + specs.fill.size() == 1 && *specs.fill.data() == static_cast('0'); + if (is_zero_fill) specs.fill[0] = static_cast(' '); + return write_padded(out, specs, size, [=](reserve_iterator it) { + if (sign) *it++ = detail::sign(sign); + return copy_str(str, str + str_size, it); + }); +} + +// A decimal floating-point number significand * pow(10, exp). +struct big_decimal_fp { + const char* significand; + int significand_size; + int exponent; +}; + +constexpr auto get_significand_size(const big_decimal_fp& f) -> int { + return f.significand_size; +} +template +inline auto get_significand_size(const dragonbox::decimal_fp& f) -> int { + return count_digits(f.significand); +} + +template +constexpr auto write_significand(OutputIt out, const char* significand, + int significand_size) -> OutputIt { + return copy_str(significand, significand + significand_size, out); +} +template +inline auto write_significand(OutputIt out, UInt significand, + int significand_size) -> OutputIt { + return format_decimal(out, significand, significand_size).end; +} +template +FMT_CONSTEXPR20 auto write_significand(OutputIt out, T significand, + int significand_size, int exponent, + const Grouping& grouping) -> OutputIt { + if (!grouping.separator()) { + out = write_significand(out, significand, significand_size); + return detail::fill_n(out, exponent, static_cast('0')); + } + auto buffer = memory_buffer(); + write_significand(appender(buffer), significand, significand_size); + detail::fill_n(appender(buffer), exponent, '0'); + return grouping.apply(out, string_view(buffer.data(), buffer.size())); +} + +template ::value)> +inline auto write_significand(Char* out, UInt significand, int significand_size, + int integral_size, Char decimal_point) -> Char* { + if (!decimal_point) + return format_decimal(out, significand, significand_size).end; + out += significand_size + 1; + Char* end = out; + int floating_size = significand_size - integral_size; + for (int i = floating_size / 2; i > 0; --i) { + out -= 2; + copy2(out, digits2(static_cast(significand % 100))); + significand /= 100; + } + if (floating_size % 2 != 0) { + *--out = static_cast('0' + significand % 10); + significand /= 10; + } + *--out = decimal_point; + format_decimal(out - integral_size, significand, integral_size); + return end; +} + +template >::value)> +inline auto write_significand(OutputIt out, UInt significand, + int significand_size, int integral_size, + Char decimal_point) -> OutputIt { + // Buffer is large enough to hold digits (digits10 + 1) and a decimal point. + Char buffer[digits10() + 2]; + auto end = write_significand(buffer, significand, significand_size, + integral_size, decimal_point); + return detail::copy_str_noinline(buffer, end, out); +} + +template +FMT_CONSTEXPR auto write_significand(OutputIt out, const char* significand, + int significand_size, int integral_size, + Char decimal_point) -> OutputIt { + out = detail::copy_str_noinline(significand, + significand + integral_size, out); + if (!decimal_point) return out; + *out++ = decimal_point; + return detail::copy_str_noinline(significand + integral_size, + significand + significand_size, out); +} + +template +FMT_CONSTEXPR20 auto write_significand(OutputIt out, T significand, + int significand_size, int integral_size, + Char decimal_point, + const Grouping& grouping) -> OutputIt { + if (!grouping.separator()) { + return write_significand(out, significand, significand_size, integral_size, + decimal_point); + } + auto buffer = basic_memory_buffer(); + write_significand(buffer_appender(buffer), significand, + significand_size, integral_size, decimal_point); + grouping.apply( + out, basic_string_view(buffer.data(), to_unsigned(integral_size))); + return detail::copy_str_noinline(buffer.data() + integral_size, + buffer.end(), out); +} + +template > +FMT_CONSTEXPR20 auto do_write_float(OutputIt out, const DecimalFP& f, + const basic_format_specs& specs, + float_specs fspecs, locale_ref loc) + -> OutputIt { + auto significand = f.significand; + int significand_size = get_significand_size(f); + const Char zero = static_cast('0'); + auto sign = fspecs.sign; + size_t size = to_unsigned(significand_size) + (sign ? 1 : 0); + using iterator = reserve_iterator; + + Char decimal_point = + fspecs.locale ? detail::decimal_point(loc) : static_cast('.'); + + int output_exp = f.exponent + significand_size - 1; + auto use_exp_format = [=]() { + if (fspecs.format == float_format::exp) return true; + if (fspecs.format != float_format::general) return false; + // Use the fixed notation if the exponent is in [exp_lower, exp_upper), + // e.g. 0.0001 instead of 1e-04. Otherwise use the exponent notation. + const int exp_lower = -4, exp_upper = 16; + return output_exp < exp_lower || + output_exp >= (fspecs.precision > 0 ? fspecs.precision : exp_upper); + }; + if (use_exp_format()) { + int num_zeros = 0; + if (fspecs.showpoint) { + num_zeros = fspecs.precision - significand_size; + if (num_zeros < 0) num_zeros = 0; + size += to_unsigned(num_zeros); + } else if (significand_size == 1) { + decimal_point = Char(); + } + auto abs_output_exp = output_exp >= 0 ? output_exp : -output_exp; + int exp_digits = 2; + if (abs_output_exp >= 100) exp_digits = abs_output_exp >= 1000 ? 4 : 3; + + size += to_unsigned((decimal_point ? 1 : 0) + 2 + exp_digits); + char exp_char = fspecs.upper ? 'E' : 'e'; + auto write = [=](iterator it) { + if (sign) *it++ = detail::sign(sign); + // Insert a decimal point after the first digit and add an exponent. + it = write_significand(it, significand, significand_size, 1, + decimal_point); + if (num_zeros > 0) it = detail::fill_n(it, num_zeros, zero); + *it++ = static_cast(exp_char); + return write_exponent(output_exp, it); + }; + return specs.width > 0 ? write_padded(out, specs, size, write) + : base_iterator(out, write(reserve(out, size))); + } + + int exp = f.exponent + significand_size; + if (f.exponent >= 0) { + // 1234e5 -> 123400000[.0+] + size += to_unsigned(f.exponent); + int num_zeros = fspecs.precision - exp; + abort_fuzzing_if(num_zeros > 5000); + if (fspecs.showpoint) { + ++size; + if (num_zeros <= 0 && fspecs.format != float_format::fixed) num_zeros = 1; + if (num_zeros > 0) size += to_unsigned(num_zeros); + } + auto grouping = Grouping(loc, fspecs.locale); + size += to_unsigned(grouping.count_separators(exp)); + return write_padded(out, specs, size, [&](iterator it) { + if (sign) *it++ = detail::sign(sign); + it = write_significand(it, significand, significand_size, + f.exponent, grouping); + if (!fspecs.showpoint) return it; + *it++ = decimal_point; + return num_zeros > 0 ? detail::fill_n(it, num_zeros, zero) : it; + }); + } else if (exp > 0) { + // 1234e-2 -> 12.34[0+] + int num_zeros = fspecs.showpoint ? fspecs.precision - significand_size : 0; + size += 1 + to_unsigned(num_zeros > 0 ? num_zeros : 0); + auto grouping = Grouping(loc, fspecs.locale); + size += to_unsigned(grouping.count_separators(significand_size)); + return write_padded(out, specs, size, [&](iterator it) { + if (sign) *it++ = detail::sign(sign); + it = write_significand(it, significand, significand_size, exp, + decimal_point, grouping); + return num_zeros > 0 ? detail::fill_n(it, num_zeros, zero) : it; + }); + } + // 1234e-6 -> 0.001234 + int num_zeros = -exp; + if (significand_size == 0 && fspecs.precision >= 0 && + fspecs.precision < num_zeros) { + num_zeros = fspecs.precision; + } + bool pointy = num_zeros != 0 || significand_size != 0 || fspecs.showpoint; + size += 1 + (pointy ? 1 : 0) + to_unsigned(num_zeros); + return write_padded(out, specs, size, [&](iterator it) { + if (sign) *it++ = detail::sign(sign); + *it++ = zero; + if (!pointy) return it; + *it++ = decimal_point; + it = detail::fill_n(it, num_zeros, zero); + return write_significand(it, significand, significand_size); + }); +} + +template class fallback_digit_grouping { + public: + constexpr fallback_digit_grouping(locale_ref, bool) {} + + constexpr Char separator() const { return Char(); } + + constexpr int count_separators(int) const { return 0; } + + template + constexpr Out apply(Out out, basic_string_view) const { + return out; + } +}; + +template +FMT_CONSTEXPR20 auto write_float(OutputIt out, const DecimalFP& f, + const basic_format_specs& specs, + float_specs fspecs, locale_ref loc) + -> OutputIt { + if (is_constant_evaluated()) { + return do_write_float>(out, f, specs, fspecs, + loc); + } else { + return do_write_float(out, f, specs, fspecs, loc); + } +} + +template constexpr bool isnan(T value) { + return !(value >= value); // std::isnan doesn't support __float128. +} + +template +struct has_isfinite : std::false_type {}; + +template +struct has_isfinite> + : std::true_type {}; + +template ::value&& + has_isfinite::value)> +FMT_CONSTEXPR20 bool isfinite(T value) { + constexpr T inf = T(std::numeric_limits::infinity()); + if (is_constant_evaluated()) + return !detail::isnan(value) && value != inf && value != -inf; + return ::isfinite(value); +} +template ::value)> +FMT_CONSTEXPR bool isfinite(T value) { + T inf = T(std::numeric_limits::infinity()); + // std::isfinite doesn't support __float128. + return !detail::isnan(value) && value != inf && value != -inf; +} + +enum class round_direction { unknown, up, down }; + +// Given the divisor (normally a power of 10), the remainder = v % divisor for +// some number v and the error, returns whether v should be rounded up, down, or +// whether the rounding direction can't be determined due to error. +// error should be less than divisor / 2. +FMT_CONSTEXPR inline round_direction get_round_direction(uint64_t divisor, + uint64_t remainder, + uint64_t error) { + FMT_ASSERT(remainder < divisor, ""); // divisor - remainder won't overflow. + FMT_ASSERT(error < divisor, ""); // divisor - error won't overflow. + FMT_ASSERT(error < divisor - error, ""); // error * 2 won't overflow. + // Round down if (remainder + error) * 2 <= divisor. + if (remainder <= divisor - remainder && error * 2 <= divisor - remainder * 2) + return round_direction::down; + // Round up if (remainder - error) * 2 >= divisor. + if (remainder >= error && + remainder - error >= divisor - (remainder - error)) { + return round_direction::up; + } + return round_direction::unknown; +} + +namespace digits { +enum result { + more, // Generate more digits. + done, // Done generating digits. + error // Digit generation cancelled due to an error. +}; +} + +struct gen_digits_handler { + char* buf; + int size; + int precision; + int exp10; + bool fixed; + + FMT_CONSTEXPR digits::result on_digit(char digit, uint64_t divisor, + uint64_t remainder, uint64_t error, + bool integral) { + FMT_ASSERT(remainder < divisor, ""); + buf[size++] = digit; + if (!integral && error >= remainder) return digits::error; + if (size < precision) return digits::more; + if (!integral) { + // Check if error * 2 < divisor with overflow prevention. + // The check is not needed for the integral part because error = 1 + // and divisor > (1 << 32) there. + if (error >= divisor || error >= divisor - error) return digits::error; + } else { + FMT_ASSERT(error == 1 && divisor > 2, ""); + } + auto dir = get_round_direction(divisor, remainder, error); + if (dir != round_direction::up) + return dir == round_direction::down ? digits::done : digits::error; + ++buf[size - 1]; + for (int i = size - 1; i > 0 && buf[i] > '9'; --i) { + buf[i] = '0'; + ++buf[i - 1]; + } + if (buf[0] > '9') { + buf[0] = '1'; + if (fixed) + buf[size++] = '0'; + else + ++exp10; + } + return digits::done; + } +}; + +inline FMT_CONSTEXPR20 void adjust_precision(int& precision, int exp10) { + // Adjust fixed precision by exponent because it is relative to decimal + // point. + if (exp10 > 0 && precision > max_value() - exp10) + FMT_THROW("number is too big"); + precision += exp10; +} + +// Generates output using the Grisu digit-gen algorithm. +// error: the size of the region (lower, upper) outside of which numbers +// definitely do not round to value (Delta in Grisu3). +FMT_INLINE FMT_CONSTEXPR20 auto grisu_gen_digits(fp value, uint64_t error, + int& exp, + gen_digits_handler& handler) + -> digits::result { + const fp one(1ULL << -value.e, value.e); + // The integral part of scaled value (p1 in Grisu) = value / one. It cannot be + // zero because it contains a product of two 64-bit numbers with MSB set (due + // to normalization) - 1, shifted right by at most 60 bits. + auto integral = static_cast(value.f >> -one.e); + FMT_ASSERT(integral != 0, ""); + FMT_ASSERT(integral == value.f >> -one.e, ""); + // The fractional part of scaled value (p2 in Grisu) c = value % one. + uint64_t fractional = value.f & (one.f - 1); + exp = count_digits(integral); // kappa in Grisu. + // Non-fixed formats require at least one digit and no precision adjustment. + if (handler.fixed) { + adjust_precision(handler.precision, exp + handler.exp10); + // Check if precision is satisfied just by leading zeros, e.g. + // format("{:.2f}", 0.001) gives "0.00" without generating any digits. + if (handler.precision <= 0) { + if (handler.precision < 0) return digits::done; + // Divide by 10 to prevent overflow. + uint64_t divisor = data::power_of_10_64[exp - 1] << -one.e; + auto dir = get_round_direction(divisor, value.f / 10, error * 10); + if (dir == round_direction::unknown) return digits::error; + handler.buf[handler.size++] = dir == round_direction::up ? '1' : '0'; + return digits::done; + } + } + // Generate digits for the integral part. This can produce up to 10 digits. do { - // Check for overflow. - if (value > big) { - value = max_int + 1; + uint32_t digit = 0; + auto divmod_integral = [&](uint32_t divisor) { + digit = integral / divisor; + integral %= divisor; + }; + // This optimization by Milo Yip reduces the number of integer divisions by + // one per iteration. + switch (exp) { + case 10: + divmod_integral(1000000000); break; + case 9: + divmod_integral(100000000); + break; + case 8: + divmod_integral(10000000); + break; + case 7: + divmod_integral(1000000); + break; + case 6: + divmod_integral(100000); + break; + case 5: + divmod_integral(10000); + break; + case 4: + divmod_integral(1000); + break; + case 3: + divmod_integral(100); + break; + case 2: + divmod_integral(10); + break; + case 1: + digit = integral; + integral = 0; + break; + default: + FMT_ASSERT(false, "invalid number of digits"); } - value = value * 10 + unsigned(*begin - '0'); - ++begin; - } while (begin != end && '0' <= *begin && *begin <= '9'); - if (value > max_int) eh.on_error("number is too big"); - return static_cast(value); + --exp; + auto remainder = (static_cast(integral) << -one.e) + fractional; + auto result = handler.on_digit(static_cast('0' + digit), + data::power_of_10_64[exp] << -one.e, + remainder, error, true); + if (result != digits::more) return result; + } while (exp > 0); + // Generate digits for the fractional part. + for (;;) { + fractional *= 10; + error *= 10; + char digit = static_cast('0' + (fractional >> -one.e)); + fractional &= one.f - 1; + --exp; + auto result = handler.on_digit(digit, one.f, fractional, error, false); + if (result != digits::more) return result; + } } -template class custom_formatter { - private: - using char_type = typename Context::char_type; +template +int format_float(Float value, int precision, float_specs specs, buffer& buf); - basic_format_parse_context& parse_ctx_; - Context& ctx_; - - public: - explicit custom_formatter(basic_format_parse_context& parse_ctx, - Context& ctx) - : parse_ctx_(parse_ctx), ctx_(ctx) {} - - bool operator()(typename basic_format_arg::handle h) const { - h.format(parse_ctx_, ctx_); - return true; +template ::value)> +FMT_CONSTEXPR20 auto write(OutputIt out, T value, + basic_format_specs specs, locale_ref loc = {}) + -> OutputIt { + if (const_check(!is_supported_floating_point(value))) return out; + float_specs fspecs = parse_float_type_spec(specs); + fspecs.sign = specs.sign; + if (signbit(value)) { // value < 0 is false for NaN so use signbit. + fspecs.sign = sign::minus; + value = -value; + } else if (fspecs.sign == sign::minus) { + fspecs.sign = sign::none; } - template bool operator()(T) const { return false; } + if (!detail::isfinite(value)) + return write_nonfinite(out, detail::isnan(value), specs, fspecs); + + if (specs.align == align::numeric && fspecs.sign) { + auto it = reserve(out, 1); + *it++ = detail::sign(fspecs.sign); + out = base_iterator(out, it); + fspecs.sign = sign::none; + if (specs.width != 0) --specs.width; + } + + memory_buffer buffer; + if (fspecs.format == float_format::hex) { + if (fspecs.sign) buffer.push_back(detail::sign(fspecs.sign)); + snprintf_float(convert_float(value), specs.precision, fspecs, buffer); + return write_bytes(out, {buffer.data(), buffer.size()}, + specs); + } + int precision = specs.precision >= 0 || specs.type == presentation_type::none + ? specs.precision + : 6; + if (fspecs.format == float_format::exp) { + if (precision == max_value()) + FMT_THROW_FORMAT_ERROR("number is too big"); + else + ++precision; + } else if (fspecs.format != float_format::fixed && precision == 0) { + precision = 1; + } + if (const_check(std::is_same())) fspecs.binary32 = true; + int exp = format_float(convert_float(value), precision, fspecs, buffer); + fspecs.precision = precision; + auto f = big_decimal_fp{buffer.data(), static_cast(buffer.size()), exp}; + return write_float(out, f, specs, fspecs, loc); +} + +template ::value)> +FMT_CONSTEXPR20 auto write(OutputIt out, T value) -> OutputIt { + if (is_constant_evaluated()) + return write(out, value, basic_format_specs()); + if (const_check(!is_supported_floating_point(value))) return out; + + auto fspecs = float_specs(); + if (signbit(value)) { + fspecs.sign = sign::minus; + value = -value; + } + + constexpr auto specs = basic_format_specs(); + using floaty = conditional_t::value, double, T>; + using uint = typename dragonbox::float_info::carrier_uint; + uint mask = exponent_mask(); + if ((bit_cast(value) & mask) == mask) + return write_nonfinite(out, ::isnan(value), specs, fspecs); + + auto dec = dragonbox::to_decimal(static_cast(value)); + return write_float(out, dec, specs, fspecs, {}); +} + +template ::value && + !is_fast_float::value)> +inline auto write(OutputIt out, T value) -> OutputIt { + return write(out, value, basic_format_specs()); +} + +template +auto write(OutputIt out, monostate, basic_format_specs = {}, + locale_ref = {}) -> OutputIt { + FMT_ASSERT(false, ""); + return out; +} + +template +FMT_CONSTEXPR auto write(OutputIt out, basic_string_view value) + -> OutputIt { + auto it = reserve(out, value.size()); + it = copy_str_noinline(value.begin(), value.end(), it); + return base_iterator(out, it); +} + +template ::value)> +constexpr auto write(OutputIt out, const T& value) -> OutputIt { + return write(out, to_string_view(value)); +} + +// FMT_ENABLE_IF() condition separated to workaround an MSVC bug. +template < + typename Char, typename OutputIt, typename T, + bool check = + std::is_enum::value && !std::is_same::value && + mapped_type_constant>::value != + type::custom_type, + FMT_ENABLE_IF(check)> +FMT_CONSTEXPR auto write(OutputIt out, T value) -> OutputIt { + return write(out, static_cast>(value)); +} + +template ::value)> +FMT_CONSTEXPR auto write(OutputIt out, T value, + const basic_format_specs& specs = {}, + locale_ref = {}) -> OutputIt { + return specs.type != presentation_type::none && + specs.type != presentation_type::string + ? write(out, value ? 1 : 0, specs, {}) + : write_bytes(out, value ? "true" : "false", specs); +} + +template +FMT_CONSTEXPR auto write(OutputIt out, Char value) -> OutputIt { + auto it = reserve(out, 1); + *it++ = value; + return base_iterator(out, it); +} + +template +FMT_CONSTEXPR_CHAR_TRAITS auto write(OutputIt out, const Char* value) + -> OutputIt { + if (!value) { + FMT_THROW_FORMAT_ERROR("string pointer is null"); + } else { + out = write(out, basic_string_view(value)); + } + return out; +} + +template ::value)> +auto write(OutputIt out, const T* value, + const basic_format_specs& specs = {}, locale_ref = {}) + -> OutputIt { + check_pointer_type_spec(specs.type, error_handler()); + return write_ptr(out, bit_cast(value), &specs); +} + +// A write overload that handles implicit conversions. +template > +FMT_CONSTEXPR auto write(OutputIt out, const T& value) -> enable_if_t< + std::is_class::value && !is_string::value && + !is_floating_point::value && !std::is_same::value && + !std::is_same().map(value))>::value, + OutputIt> { + return write(out, arg_mapper().map(value)); +} + +template > +FMT_CONSTEXPR auto write(OutputIt out, const T& value) + -> enable_if_t::value == type::custom_type, + OutputIt> { + using formatter_type = + conditional_t::value, + typename Context::template formatter_type, + fallback_formatter>; + auto ctx = Context(out, {}, {}); + return formatter_type().format(value, ctx); +} + +// An argument visitor that formats the argument and writes it via the output +// iterator. It's a class and not a generic lambda for compatibility with C++11. +template struct default_arg_formatter { + using iterator = buffer_appender; + using context = buffer_context; + + iterator out; + basic_format_args args; + locale_ref loc; + + template auto operator()(T value) -> iterator { + return write(out, value); + } + auto operator()(typename basic_format_arg::handle h) -> iterator { + basic_format_parse_context parse_ctx({}); + context format_ctx(out, args, loc); + h.format(parse_ctx, format_ctx); + return format_ctx.out(); + } +}; + +template struct arg_formatter { + using iterator = buffer_appender; + using context = buffer_context; + + iterator out; + const basic_format_specs& specs; + locale_ref locale; + + template + FMT_CONSTEXPR FMT_INLINE auto operator()(T value) -> iterator { + return detail::write(out, value, specs, locale); + } + auto operator()(typename basic_format_arg::handle) -> iterator { + // User-defined types are handled separately because they require access + // to the parse context. + return out; + } +}; + +template struct custom_formatter { + basic_format_parse_context& parse_ctx; + buffer_context& ctx; + + void operator()( + typename basic_format_arg>::handle h) const { + h.format(parse_ctx, ctx); + } + template void operator()(T) const {} }; template @@ -1850,13 +2929,13 @@ template class width_checker { explicit FMT_CONSTEXPR width_checker(ErrorHandler& eh) : handler_(eh) {} template ::value)> - FMT_CONSTEXPR unsigned long long operator()(T value) { + FMT_CONSTEXPR auto operator()(T value) -> unsigned long long { if (is_negative(value)) handler_.on_error("negative width"); return static_cast(value); } template ::value)> - FMT_CONSTEXPR unsigned long long operator()(T) { + FMT_CONSTEXPR auto operator()(T) -> unsigned long long { handler_.on_error("width is not integer"); return 0; } @@ -1870,13 +2949,13 @@ template class precision_checker { explicit FMT_CONSTEXPR precision_checker(ErrorHandler& eh) : handler_(eh) {} template ::value)> - FMT_CONSTEXPR unsigned long long operator()(T value) { + FMT_CONSTEXPR auto operator()(T value) -> unsigned long long { if (is_negative(value)) handler_.on_error("negative precision"); return static_cast(value); } template ::value)> - FMT_CONSTEXPR unsigned long long operator()(T) { + FMT_CONSTEXPR auto operator()(T) -> unsigned long long { handler_.on_error("precision is not integer"); return 0; } @@ -1885,145 +2964,50 @@ template class precision_checker { ErrorHandler& handler_; }; -// A format specifier handler that sets fields in basic_format_specs. -template class specs_setter { - public: - explicit FMT_CONSTEXPR specs_setter(basic_format_specs& specs) - : specs_(specs) {} - - FMT_CONSTEXPR specs_setter(const specs_setter& other) - : specs_(other.specs_) {} - - FMT_CONSTEXPR void on_align(align_t align) { specs_.align = align; } - FMT_CONSTEXPR void on_fill(basic_string_view fill) { - specs_.fill = fill; - } - FMT_CONSTEXPR void on_plus() { specs_.sign = sign::plus; } - FMT_CONSTEXPR void on_minus() { specs_.sign = sign::minus; } - FMT_CONSTEXPR void on_space() { specs_.sign = sign::space; } - FMT_CONSTEXPR void on_hash() { specs_.alt = true; } - - FMT_CONSTEXPR void on_zero() { - specs_.align = align::numeric; - specs_.fill[0] = Char('0'); - } - - FMT_CONSTEXPR void on_width(int width) { specs_.width = width; } - FMT_CONSTEXPR void on_precision(int precision) { - specs_.precision = precision; - } - FMT_CONSTEXPR void end_precision() {} - - FMT_CONSTEXPR void on_type(Char type) { - specs_.type = static_cast(type); - } - - protected: - basic_format_specs& specs_; -}; - -template class numeric_specs_checker { - public: - FMT_CONSTEXPR numeric_specs_checker(ErrorHandler& eh, internal::type arg_type) - : error_handler_(eh), arg_type_(arg_type) {} - - FMT_CONSTEXPR void require_numeric_argument() { - if (!is_arithmetic_type(arg_type_)) - error_handler_.on_error("format specifier requires numeric argument"); - } - - FMT_CONSTEXPR void check_sign() { - require_numeric_argument(); - if (is_integral_type(arg_type_) && arg_type_ != type::int_type && - arg_type_ != type::long_long_type && arg_type_ != type::char_type) { - error_handler_.on_error("format specifier requires signed argument"); - } - } - - FMT_CONSTEXPR void check_precision() { - if (is_integral_type(arg_type_) || arg_type_ == type::pointer_type) - error_handler_.on_error("precision not allowed for this argument type"); - } - - private: - ErrorHandler& error_handler_; - internal::type arg_type_; -}; - -// A format specifier handler that checks if specifiers are consistent with the -// argument type. -template class specs_checker : public Handler { - public: - FMT_CONSTEXPR specs_checker(const Handler& handler, internal::type arg_type) - : Handler(handler), checker_(*this, arg_type) {} - - FMT_CONSTEXPR specs_checker(const specs_checker& other) - : Handler(other), checker_(*this, other.arg_type_) {} - - FMT_CONSTEXPR void on_align(align_t align) { - if (align == align::numeric) checker_.require_numeric_argument(); - Handler::on_align(align); - } - - FMT_CONSTEXPR void on_plus() { - checker_.check_sign(); - Handler::on_plus(); - } - - FMT_CONSTEXPR void on_minus() { - checker_.check_sign(); - Handler::on_minus(); - } - - FMT_CONSTEXPR void on_space() { - checker_.check_sign(); - Handler::on_space(); - } - - FMT_CONSTEXPR void on_hash() { - checker_.require_numeric_argument(); - Handler::on_hash(); - } - - FMT_CONSTEXPR void on_zero() { - checker_.require_numeric_argument(); - Handler::on_zero(); - } - - FMT_CONSTEXPR void end_precision() { checker_.check_precision(); } - - private: - numeric_specs_checker checker_; -}; - template